diff --git a/src-tauri/src/gemini_mcp.rs b/src-tauri/src/gemini_mcp.rs index 62a959c18..72d7a86d5 100644 --- a/src-tauri/src/gemini_mcp.rs +++ b/src-tauri/src/gemini_mcp.rs @@ -134,6 +134,33 @@ pub fn set_mcp_servers_map( obj.remove("homepage"); obj.remove("docs"); + // Timeout 转换:Claude/Codex 使用 startup_timeout_sec/tool_timeout_sec + // Gemini CLI 只支持 timeout(单位 ms) + // 默认值:startup=10s, tool=60s + const DEFAULT_STARTUP_MS: u64 = 10_000; + const DEFAULT_TOOL_MS: u64 = 60_000; + + let extract_timeout = + |obj: &mut Map, key: &str, multiplier: u64| -> Option { + obj.remove(key).and_then(|val| { + val.as_u64() + .map(|n| n * multiplier) + .or_else(|| val.as_f64().map(|f| (f * multiplier as f64) as u64)) + }) + }; + + // 分别收集 startup 和 tool timeout,未设置时使用默认值 + let startup_ms = extract_timeout(&mut obj, "startup_timeout_sec", 1000) + .or_else(|| extract_timeout(&mut obj, "startup_timeout_ms", 1)) + .unwrap_or(DEFAULT_STARTUP_MS); + let tool_ms = extract_timeout(&mut obj, "tool_timeout_sec", 1000) + .or_else(|| extract_timeout(&mut obj, "tool_timeout_ms", 1)) + .unwrap_or(DEFAULT_TOOL_MS); + + // 取最大值作为 Gemini timeout + let final_timeout = startup_ms.max(tool_ms); + obj.insert("timeout".to_string(), Value::Number(final_timeout.into())); + out.insert(id.clone(), Value::Object(obj)); }