Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions src-tauri/src/core/cmd.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ use serde::{Deserialize, Serialize};
use std::{fs, io, path::PathBuf};
use tauri::{AppHandle, Manager, Runtime, State};

use crate::core::utils::extensions::inference_llamacpp_extension::cleanup::cleanup_processes;
use crate::core::{mcp::clean_up_mcp_servers, utils::extensions::inference_llamacpp_extension::cleanup::cleanup_processes};

use super::{server, setup, state::AppState};

Expand Down Expand Up @@ -125,6 +125,7 @@ pub fn factory_reset(app_handle: tauri::AppHandle, state: State<'_, AppState>) {
log::info!("Factory reset, removing data folder: {:?}", data_folder);

tauri::async_runtime::block_on(async {
clean_up_mcp_servers(state.clone()).await;
cleanup_processes(state).await;

if data_folder.exists() {
Expand All @@ -138,7 +139,7 @@ pub fn factory_reset(app_handle: tauri::AppHandle, state: State<'_, AppState>) {
let _ = fs::create_dir_all(&data_folder).map_err(|e| e.to_string());

// Reset the configuration
let mut default_config = AppConfiguration::default();
let mut default_config: AppConfiguration = AppConfiguration::default();
default_config.data_folder = default_data_folder_path(app_handle.clone());
let _ = update_app_configuration(app_handle.clone(), default_config);

Expand Down
20 changes: 20 additions & 0 deletions src-tauri/src/core/mcp.rs
Original file line number Diff line number Diff line change
Expand Up @@ -751,6 +751,26 @@ pub async fn reset_mcp_restart_count(state: State<'_, AppState>, server_name: St
Ok(())
}

pub async fn clean_up_mcp_servers(
state: State<'_, AppState>,
) {
log::info!("Cleaning up MCP servers");

// Stop all running MCP servers
let _ = stop_mcp_servers(state.mcp_servers.clone()).await;

// Clear active servers and restart counts
{
let mut active_servers = state.mcp_active_servers.lock().await;
active_servers.clear();
}
{
let mut restart_counts = state.mcp_restart_counts.lock().await;
restart_counts.clear();
}
log::info!("MCP servers cleaned up successfully");
}

pub async fn stop_mcp_servers(
servers_state: Arc<Mutex<HashMap<String, RunningService<RoleClient, ()>>>>,
) -> Result<(), String> {
Expand Down
24 changes: 0 additions & 24 deletions src-tauri/src/core/setup.rs
Original file line number Diff line number Diff line change
Expand Up @@ -199,30 +199,6 @@ pub fn setup_mcp(app: &App) {
let state = app.state::<AppState>();
let servers = state.mcp_servers.clone();
let app_handle: tauri::AppHandle = app.handle().clone();
// Setup kill-mcp-servers event listener (similar to kill-sidecar)
let app_handle_for_kill = app_handle.clone();
app_handle.listen("kill-mcp-servers", move |_event| {
let app_handle = app_handle_for_kill.clone();
tauri::async_runtime::spawn(async move {
log::info!("Received kill-mcp-servers event - cleaning up MCP servers");
let app_state = app_handle.state::<AppState>();
// Stop all running MCP servers
if let Err(e) = super::mcp::stop_mcp_servers(app_state.mcp_servers.clone()).await {
log::error!("Failed to stop MCP servers: {}", e);
return;
}
// Clear active servers and restart counts
{
let mut active_servers = app_state.mcp_active_servers.lock().await;
active_servers.clear();
}
{
let mut restart_counts = app_state.mcp_restart_counts.lock().await;
restart_counts.clear();
}
log::info!("MCP servers cleaned up successfully");
});
});
tauri::async_runtime::spawn(async move {
if let Err(e) = run_mcp_commands(&app_handle, servers).await {
log::error!("Failed to run mcp commands: {}", e);
Expand Down
5 changes: 4 additions & 1 deletion src-tauri/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ use std::{collections::HashMap, sync::Arc};
use tauri::{Emitter, Manager, RunEvent};
use tokio::sync::Mutex;

use crate::core::mcp::clean_up_mcp_servers;

#[cfg_attr(mobile, tauri::mobile_entry_point)]
pub fn run() {
let mut builder = tauri::Builder::default();
Expand Down Expand Up @@ -143,10 +145,10 @@ pub fn run() {
.on_window_event(|window, event| match event {
tauri::WindowEvent::CloseRequested { .. } => {
if window.label() == "main" {
window.emit("kill-mcp-servers", ()).unwrap();
let state = window.app_handle().state::<AppState>();

tauri::async_runtime::block_on(async {
clean_up_mcp_servers(state.clone()).await;
cleanup_processes(state).await;
});
}
Expand All @@ -173,6 +175,7 @@ pub fn run() {
}

// Quick cleanup with shorter timeout
clean_up_mcp_servers(state.clone()).await;
cleanup_processes(state).await;
});
});
Expand Down
Loading