diff --git a/Cargo.lock b/Cargo.lock index 65b1ea6ba..c8cd5d9c6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -14734,6 +14734,7 @@ dependencies = [ "tauri-plugin", "tauri-plugin-store", "tauri-plugin-store2", + "tauri-plugin-windows", "tauri-specta", "thiserror 2.0.12", "tokio", diff --git a/apps/desktop/src-tauri/Entitlements.plist b/apps/desktop/src-tauri/Entitlements.plist index 57721db59..65a1f75bd 100644 --- a/apps/desktop/src-tauri/Entitlements.plist +++ b/apps/desktop/src-tauri/Entitlements.plist @@ -8,7 +8,5 @@ com.apple.security.personal-information.addressbook - com.apple.developer.usernotifications.time-sensitive - diff --git a/apps/desktop/src-tauri/src/ext.rs b/apps/desktop/src-tauri/src/ext.rs index f62449a14..0b17161ea 100644 --- a/apps/desktop/src-tauri/src/ext.rs +++ b/apps/desktop/src-tauri/src/ext.rs @@ -9,7 +9,6 @@ use tauri_plugin_store2::{ScopedStore, StorePluginExt}; pub trait AppExt { fn sentry_dsn(&self) -> String; fn desktop_store(&self) -> Result, String>; - fn setup_local_ai(&self) -> impl Future>; fn setup_db_for_local(&self) -> impl Future>; fn setup_db_for_cloud(&self) -> impl Future>; } @@ -34,38 +33,6 @@ impl> AppExt for T { self.scoped_store("desktop").map_err(|e| e.to_string()) } - #[tracing::instrument(skip_all)] - - async fn setup_local_ai(&self) -> Result<(), String> { - { - use tauri_plugin_local_stt::LocalSttPluginExt; - - let current_model = self - .get_current_model() - .unwrap_or(SupportedSttModel::Whisper(WhisperModel::QuantizedSmall)); - - if let Ok(true) = self.is_model_downloaded(¤t_model).await { - if let Err(e) = self.start_server(Some(current_model)).await { - tracing::error!("start_local_stt_server: {}", e); - } - } - } - - { - use tauri_plugin_local_llm::{LocalLlmPluginExt, SupportedModel}; - - let current_model = self.get_current_model().unwrap_or(SupportedModel::HyprLLM); - - if let Ok(true) = self.is_model_downloaded(¤t_model).await { - if let Err(e) = self.start_server().await { - tracing::error!("start_local_llm_server: {}", e); - } - } - } - - Ok(()) - } - #[tracing::instrument(skip_all)] async fn setup_db_for_local(&self) -> Result<(), String> { let (db, db_just_created) = { diff --git a/apps/desktop/src-tauri/src/lib.rs b/apps/desktop/src-tauri/src/lib.rs index 23291156a..5f83602b7 100644 --- a/apps/desktop/src-tauri/src/lib.rs +++ b/apps/desktop/src-tauri/src/lib.rs @@ -236,10 +236,6 @@ pub async fn main() { } } } - - tokio::spawn(async move { - app_clone.setup_local_ai().await.unwrap(); - }); }); Ok(()) diff --git a/apps/desktop/src/components/settings/components/ai/stt-view-local.tsx b/apps/desktop/src/components/settings/components/ai/stt-view-local.tsx index 035d9d257..737b5bc73 100644 --- a/apps/desktop/src/components/settings/components/ai/stt-view-local.tsx +++ b/apps/desktop/src/components/settings/components/ai/stt-view-local.tsx @@ -250,7 +250,7 @@ function ProModelsSection({ {proModels.data?.map((model) => ( (app: &tauri::AppHandle, event: &tauri::RunEvent) { + match event { + tauri::RunEvent::WindowEvent { label, event, .. } => { + let hypr_window = match label.parse::() { + Ok(window) => window, + Err(e) => { + tracing::warn!("parse_error: {:?}", e); + return; + } + }; + + if hypr_window != HyprWindow::Main { + return; + } + + match event { + tauri::WindowEvent::Focused(true) => { + tokio::task::block_in_place(|| { + tokio::runtime::Handle::current().block_on(async { + let _ = app.start_server().await; + }); + }); + } + _ => {} + } + } + _ => {} + } +} diff --git a/plugins/local-llm/src/lib.rs b/plugins/local-llm/src/lib.rs index 4430766db..ba7642565 100644 --- a/plugins/local-llm/src/lib.rs +++ b/plugins/local-llm/src/lib.rs @@ -6,6 +6,7 @@ use tokio::sync::Mutex; mod commands; mod error; +mod events; mod ext; mod manager; mod model; @@ -13,6 +14,7 @@ mod server; mod store; pub use error::*; +use events::*; pub use ext::*; pub use manager::*; pub use model::*; @@ -83,6 +85,7 @@ pub fn init() -> tauri::plugin::TauriPlugin { Ok(()) }) + .on_event(on_event) .build() } diff --git a/plugins/local-stt/src/events.rs b/plugins/local-stt/src/events.rs index 08fd3fe25..6732137c2 100644 --- a/plugins/local-stt/src/events.rs +++ b/plugins/local-stt/src/events.rs @@ -1,54 +1,35 @@ -use tauri::Manager; - -use crate::{LocalSttPluginExt, SharedState}; +use crate::LocalSttPluginExt; use tauri_plugin_windows::HyprWindow; pub fn on_event(app: &tauri::AppHandle, event: &tauri::RunEvent) { - let state = app.state::(); - match event { - tauri::RunEvent::WindowEvent { label, event, .. } => match event { - tauri::WindowEvent::CloseRequested { .. } | tauri::WindowEvent::Destroyed => { - let hypr_window = match label.parse::() { - Ok(window) => window, - Err(e) => { - tracing::warn!("window_parse_error: {:?}", e); - return; - } - }; - - if hypr_window != HyprWindow::Main { + tauri::RunEvent::WindowEvent { label, event, .. } => { + let hypr_window = match label.parse::() { + Ok(window) => window, + Err(e) => { + tracing::warn!("parse_error: {:?}", e); return; } + }; - tracing::info!("events: stopping servers"); - - tokio::task::block_in_place(|| { - tokio::runtime::Handle::current().block_on(async { - let mut guard = state.lock().await; - - if let Some(_) = guard.internal_server.take() { - guard.internal_server = None; - } - if let Some(_) = guard.external_server.take() { - guard.external_server = None; - } - for (_, (task, token)) in guard.download_task.drain() { - token.cancel(); - task.abort(); - } - }); - }); + if hypr_window != HyprWindow::Main { + return; } - tauri::WindowEvent::Focused(true) => { - tokio::task::block_in_place(|| { - tokio::runtime::Handle::current().block_on(async { - let _ = app.start_server(None).await; + + match event { + tauri::WindowEvent::Focused(true) => { + tokio::task::block_in_place(|| { + tokio::runtime::Handle::current().block_on(async { + match app.start_server(None).await { + Ok(_) => tracing::info!("server_started"), + Err(e) => tracing::error!("server_start_failed: {:?}", e), + } + }); }); - }); + } + _ => {} } - _ => {} - }, + } _ => {} } } diff --git a/plugins/local-stt/src/ext.rs b/plugins/local-stt/src/ext.rs index 43d3fe466..c979be4bb 100644 --- a/plugins/local-stt/src/ext.rs +++ b/plugins/local-stt/src/ext.rs @@ -252,7 +252,7 @@ impl> LocalSttPluginExt for T { self.shell() .sidecar("stt")? .current_dir(dirs::home_dir().unwrap()) - .args(["serve", "-v"]) + .args(["serve", "-v", "-d"]) }; let server = external::run_server(cmd, am_key).await?; diff --git a/plugins/local-stt/src/lib.rs b/plugins/local-stt/src/lib.rs index dc749ed3e..e7bcea41d 100644 --- a/plugins/local-stt/src/lib.rs +++ b/plugins/local-stt/src/lib.rs @@ -10,7 +10,6 @@ mod model; mod server; mod store; mod types; -mod utils; pub use error::*; use events::*; @@ -18,7 +17,6 @@ pub use ext::*; pub use model::*; pub use store::*; pub use types::*; -use utils::*; pub type SharedState = std::sync::Arc>; diff --git a/plugins/local-stt/src/server/external.rs b/plugins/local-stt/src/server/external.rs index ce0b77d40..dcac3ecd3 100644 --- a/plugins/local-stt/src/server/external.rs +++ b/plugins/local-stt/src/server/external.rs @@ -7,12 +7,12 @@ pub struct ServerHandle { client: hypr_am::Client, } -impl Drop for ServerHandle { - fn drop(&mut self) { - tracing::info!("stopping"); - let _ = self.shutdown.send(()); - } -} +// impl Drop for ServerHandle { +// fn drop(&mut self) { +// tracing::info!("stopping"); +// let _ = self.shutdown.send(()); +// } +// } impl ServerHandle { pub async fn health(&self) -> ServerHealth { @@ -58,8 +58,12 @@ pub async fn run_server( ) -> Result { let port = 50060; let _ = port_killer::kill(port); + tokio::time::sleep(std::time::Duration::from_millis(500)).await; + tracing::info!("spwaning_started"); let (mut rx, child) = cmd.args(["--port", &port.to_string()]).spawn()?; + tracing::info!("spwaning_ended"); + let base_url = format!("http://localhost:{}", port); let (shutdown_tx, mut shutdown_rx) = tokio::sync::watch::channel(()); let client = hypr_am::Client::new(&base_url); @@ -118,7 +122,8 @@ pub async fn run_server( } }); - tokio::time::sleep(std::time::Duration::from_millis(500)).await; + tokio::time::sleep(std::time::Duration::from_millis(200)).await; + tracing::info!("returning_handle"); Ok(ServerHandle { api_key: Some(am_key), diff --git a/plugins/local-stt/src/server/internal.rs b/plugins/local-stt/src/server/internal.rs index b4cdc0dbd..d85823a89 100644 --- a/plugins/local-stt/src/server/internal.rs +++ b/plugins/local-stt/src/server/internal.rs @@ -55,7 +55,7 @@ pub struct ServerHandle { impl Drop for ServerHandle { fn drop(&mut self) { - tracing::info!("stopping"); + tracing::info!("stopping: {}", self.base_url); let _ = self.shutdown.send(()); } }