From 4a4cf812559d8437febd90ca2d95d3b225b65926 Mon Sep 17 00:00:00 2001 From: zhom <2717306+zhom@users.noreply.github.com> Date: Mon, 4 May 2026 01:57:42 +0400 Subject: [PATCH] refactor: don't block ui on clade check --- src-tauri/src/lib.rs | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index 32d8c33..ffe19a9 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -675,11 +675,17 @@ fn find_claude_cli() -> Option { } #[tauri::command] -fn is_mcp_in_claude_code() -> Result { +async fn is_mcp_in_claude_code() -> Result { let cli = find_claude_cli().ok_or("Claude Code CLI not found")?; - let output = std::process::Command::new(&cli) + // `claude mcp list` health-checks every registered MCP server, so a + // missing or stalled server can hang the call for many seconds. Cap it + // — for this dialog, a slow `claude` is treated the same as "not registered". + let fut = tokio::process::Command::new(&cli) .args(["mcp", "list"]) - .output() + .output(); + let output = tokio::time::timeout(std::time::Duration::from_secs(2), fut) + .await + .map_err(|_| "claude mcp list timed out".to_string())? .map_err(|e| format!("Failed to run claude: {e}"))?; let stdout = String::from_utf8_lossy(&output.stdout); Ok(stdout.contains("donut-browser"))