diff --git a/crates/jarvis-app/src/main.rs b/crates/jarvis-app/src/main.rs index fb82dc7..852be15 100644 --- a/crates/jarvis-app/src/main.rs +++ b/crates/jarvis-app/src/main.rs @@ -6,7 +6,7 @@ use std::sync::mpsc; // include core use jarvis_core::{ audio, audio_processing, commands, config, db, listener, recorder, stt, intent, - ipc::{self, IpcAction}, + ipc::{self, IpcAction, IpcEvent}, i18n, voices, models, APP_CONFIG_DIR, APP_LOG_DIR, COMMANDS_LIST, DB, }; @@ -194,6 +194,36 @@ fn main() -> Result<(), String> { IpcAction::Ping => { // handled internally by server } + IpcAction::SwitchLlm { backend } => { + info!("Received SwitchLlm IPC: {}", backend); + if let Some(b) = jarvis_core::llm::parse_backend(&backend) { + match jarvis_core::llm::swap_to(b) { + Ok(name) => info!("LLM swapped via IPC → {}", name), + Err(e) => warn!("LLM swap via IPC failed: {}", e), + } + } else { + warn!("SwitchLlm: unknown backend '{}'", backend); + } + } + IpcAction::ReloadLlm => { + info!("Received ReloadLlm IPC — reading DB and re-initialising"); + if let Err(e) = jarvis_core::llm::init_global() { + warn!("LLM reload failed: {}", e); + } + } + IpcAction::QueryHealth => { + let model = jarvis_core::llm::current().map(|c| c.model().to_string()); + ipc::send(IpcEvent::HealthSnapshot { + tts_backend: jarvis_core::tts::backend().name().to_string(), + llm_backend: jarvis_core::llm::current_backend_name().to_string(), + llm_model: model, + active_profile: jarvis_core::profiles::active_name(), + memory_facts: jarvis_core::long_term_memory::all().len(), + scheduled_tasks: jarvis_core::scheduler::list().len(), + language: jarvis_core::i18n::get_language(), + version: config::APP_VERSION.map(|s| s.to_string()), + }); + } _ => {} } }); diff --git a/crates/jarvis-core/src/ipc/events.rs b/crates/jarvis-core/src/ipc/events.rs index 7f76f72..afe2e57 100644 --- a/crates/jarvis-core/src/ipc/events.rs +++ b/crates/jarvis-core/src/ipc/events.rs @@ -36,6 +36,18 @@ pub enum IpcEvent { // request GUI to reveal/focus window RevealWindow, + + // Snapshot of daemon's runtime state (response to QueryHealth). + HealthSnapshot { + tts_backend: String, + llm_backend: String, + llm_model: Option, + active_profile: String, + memory_facts: usize, + scheduled_tasks: usize, + language: String, + version: Option, + }, } // Actions sent from GUI to jarvis-app @@ -56,4 +68,14 @@ pub enum IpcAction { // Execute text command TextCommand { text: String }, + + // Daemon-side LLM hot-swap (GUI's set_llm_backend should fire this too + // so the running daemon picks the new backend, not just the GUI process). + SwitchLlm { backend: String }, + + // Reload LLM backend from settings DB (after GUI changed it independently). + ReloadLlm, + + // Request a health snapshot — daemon responds via IpcEvent::HealthSnapshot. + QueryHealth, } \ No newline at end of file