mirror of
https://github.com/farion1231/cc-switch.git
synced 2026-07-24 12:44:18 +08:00
fix: MCP同步时优雅处理无效的Codex config.toml (#461)
* 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
This commit is contained in:
@@ -359,9 +359,14 @@ pub fn sync_single_server_to_codex(
|
|||||||
let mut doc = if config_path.exists() {
|
let mut doc = if config_path.exists() {
|
||||||
let content =
|
let content =
|
||||||
std::fs::read_to_string(&config_path).map_err(|e| AppError::io(&config_path, e))?;
|
std::fs::read_to_string(&config_path).map_err(|e| AppError::io(&config_path, e))?;
|
||||||
content
|
// 尝试解析现有配置,如果失败则创建新文档(容错处理)
|
||||||
.parse::<toml_edit::DocumentMut>()
|
match content.parse::<toml_edit::DocumentMut>() {
|
||||||
.map_err(|e| AppError::McpValidation(format!("解析 Codex config.toml 失败: {e}")))?
|
Ok(doc) => doc,
|
||||||
|
Err(e) => {
|
||||||
|
log::warn!("解析 Codex config.toml 失败: {e},将创建新配置");
|
||||||
|
toml_edit::DocumentMut::new()
|
||||||
|
}
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
toml_edit::DocumentMut::new()
|
toml_edit::DocumentMut::new()
|
||||||
};
|
};
|
||||||
@@ -409,9 +414,14 @@ pub fn remove_server_from_codex(id: &str) -> Result<(), AppError> {
|
|||||||
let content =
|
let content =
|
||||||
std::fs::read_to_string(&config_path).map_err(|e| AppError::io(&config_path, e))?;
|
std::fs::read_to_string(&config_path).map_err(|e| AppError::io(&config_path, e))?;
|
||||||
|
|
||||||
let mut doc = content
|
// 尝试解析现有配置,如果失败则直接返回(无法删除不存在的内容)
|
||||||
.parse::<toml_edit::DocumentMut>()
|
let mut doc = match content.parse::<toml_edit::DocumentMut>() {
|
||||||
.map_err(|e| AppError::McpValidation(format!("解析 Codex config.toml 失败: {e}")))?;
|
Ok(doc) => doc,
|
||||||
|
Err(e) => {
|
||||||
|
log::warn!("解析 Codex config.toml 失败: {e},跳过删除操作");
|
||||||
|
return Ok(());
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
// 从正确的位置删除:[mcp_servers]
|
// 从正确的位置删除:[mcp_servers]
|
||||||
if let Some(mcp_servers) = doc.get_mut("mcp_servers").and_then(|s| s.as_table_mut()) {
|
if let Some(mcp_servers) = doc.get_mut("mcp_servers").and_then(|s| s.as_table_mut()) {
|
||||||
|
|||||||
@@ -146,7 +146,9 @@ impl ConfigService {
|
|||||||
let cfg_text = settings.get("config").and_then(Value::as_str);
|
let cfg_text = settings.get("config").and_then(Value::as_str);
|
||||||
|
|
||||||
crate::codex_config::write_codex_live_atomic(auth, cfg_text)?;
|
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()?;
|
let cfg_text_after = crate::codex_config::read_and_validate_codex_config_text()?;
|
||||||
if let Some(manager) = config.get_manager_mut(&AppType::Codex) {
|
if let Some(manager) = config.get_manager_mut(&AppType::Codex) {
|
||||||
|
|||||||
Reference in New Issue
Block a user