From 3a548152a91240027356bc512db1c66f70797e2b Mon Sep 17 00:00:00 2001 From: lif <1835304752@qq.com> Date: Sat, 27 Dec 2025 18:05:58 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20MCP=E5=90=8C=E6=AD=A5=E6=97=B6=E4=BC=98?= =?UTF-8?q?=E9=9B=85=E5=A4=84=E7=90=86=E6=97=A0=E6=95=88=E7=9A=84Codex=20c?= =?UTF-8?q?onfig.toml=20(#461)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix(mcp): 移除同步Codex Provider时的旧MCP同步调用 sync_enabled_to_codex使用旧的config.mcp.codex结构, 在v3.7.0统一结构中该字段为空,导致MCP配置被错误清除。 MCP同步应通过McpService进行。 Fixes #403 * fix(mcp): 优雅处理Codex配置文件解析失败的情况 当~/.codex/config.toml存在但内容无效时,MCP同步操作会失败, 导致后续provider切换等操作也失败。 修改sync_single_server_to_codex和remove_server_from_codex函数, 在配置文件解析失败时进行容错处理而不是返回错误。 Fixes #393 --- src-tauri/src/mcp/codex.rs | 22 ++++++++++++++++------ src-tauri/src/services/config.rs | 4 +++- 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/src-tauri/src/mcp/codex.rs b/src-tauri/src/mcp/codex.rs index d86b5679c..e7ceacfec 100644 --- a/src-tauri/src/mcp/codex.rs +++ b/src-tauri/src/mcp/codex.rs @@ -359,9 +359,14 @@ pub fn sync_single_server_to_codex( let mut doc = if config_path.exists() { let content = std::fs::read_to_string(&config_path).map_err(|e| AppError::io(&config_path, e))?; - content - .parse::() - .map_err(|e| AppError::McpValidation(format!("解析 Codex config.toml 失败: {e}")))? + // 尝试解析现有配置,如果失败则创建新文档(容错处理) + match content.parse::() { + Ok(doc) => doc, + Err(e) => { + log::warn!("解析 Codex config.toml 失败: {e},将创建新配置"); + toml_edit::DocumentMut::new() + } + } } else { toml_edit::DocumentMut::new() }; @@ -409,9 +414,14 @@ pub fn remove_server_from_codex(id: &str) -> Result<(), AppError> { let content = std::fs::read_to_string(&config_path).map_err(|e| AppError::io(&config_path, e))?; - let mut doc = content - .parse::() - .map_err(|e| AppError::McpValidation(format!("解析 Codex config.toml 失败: {e}")))?; + // 尝试解析现有配置,如果失败则直接返回(无法删除不存在的内容) + let mut doc = match content.parse::() { + Ok(doc) => doc, + Err(e) => { + log::warn!("解析 Codex config.toml 失败: {e},跳过删除操作"); + return Ok(()); + } + }; // 从正确的位置删除:[mcp_servers] if let Some(mcp_servers) = doc.get_mut("mcp_servers").and_then(|s| s.as_table_mut()) { diff --git a/src-tauri/src/services/config.rs b/src-tauri/src/services/config.rs index 3835fb7ad..8a46a2b2a 100644 --- a/src-tauri/src/services/config.rs +++ b/src-tauri/src/services/config.rs @@ -146,7 +146,9 @@ impl ConfigService { let cfg_text = settings.get("config").and_then(Value::as_str); crate::codex_config::write_codex_live_atomic(auth, cfg_text)?; - crate::mcp::sync_enabled_to_codex(config)?; + // 注意:MCP 同步在 v3.7.0 中已通过 McpService 进行,不再在此调用 + // sync_enabled_to_codex 使用旧的 config.mcp.codex 结构,在新架构中为空 + // MCP 的启用/禁用应通过 McpService::toggle_app 进行 let cfg_text_after = crate::codex_config::read_and_validate_codex_config_text()?; if let Some(manager) = config.get_manager_mut(&AppType::Codex) {