From 392756e37330b3b55aff76a2d22fc403300a41a9 Mon Sep 17 00:00:00 2001 From: Xyfer <39858937+cxyfer@users.noreply.github.com> Date: Sun, 11 Jan 2026 10:42:44 +0800 Subject: [PATCH] fix(gemini): convert timeout params to Gemini CLI format (#580) Claude Code/Codex uses startup_timeout_sec and tool_timeout_sec, but Gemini CLI only supports a single timeout param in milliseconds. - Collect startup and tool timeout separately with defaults - startup_timeout_sec default: 10s - tool_timeout_sec default: 60s - Take max of both values as final timeout - Support both sec and ms variants - Remove original fields and insert Gemini-compatible timeout --- src-tauri/src/gemini_mcp.rs | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) 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)); }