fix: preserve codex mcp metadata

This commit is contained in:
Jason
2025-10-11 16:35:51 +08:00
parent ea7080a42e
commit 668ab710c6

View File

@@ -306,8 +306,8 @@ pub fn import_from_codex(config: &mut MultiAppConfig) -> Result<usize, String> {
/// 将 config.json 中 Codex 的 enabled==true 项以 TOML 形式写入 ~/.codex/config.toml 的 [mcp.servers] /// 将 config.json 中 Codex 的 enabled==true 项以 TOML 形式写入 ~/.codex/config.toml 的 [mcp.servers]
/// 策略: /// 策略:
/// - 读取现有 config.toml若语法无效则报错不尝试覆盖 /// - 读取现有 config.toml若语法无效则报错不尝试覆盖
/// - 重写根下的 `mcp` 节点(整体替换),其他节点保持不变 /// - 仅更新 `mcp.servers` 或 `mcp_servers` 子表,保留 `mcp` 其它键
/// - 仅写入启用项;无启用项时移除 `mcp` 节点 /// - 仅写入启用项;无启用项时清理对应子表
pub fn sync_enabled_to_codex(config: &MultiAppConfig) -> Result<(), String> { pub fn sync_enabled_to_codex(config: &MultiAppConfig) -> Result<(), String> {
use toml::{value::Value as TomlValue, Table as TomlTable}; use toml::{value::Value as TomlValue, Table as TomlTable};
@@ -324,10 +324,28 @@ pub fn sync_enabled_to_codex(config: &MultiAppConfig) -> Result<(), String> {
}; };
// 3) 写入 servers 表(支持 mcp.servers 与 mcp_servers优先沿用已有风格默认 mcp_servers // 3) 写入 servers 表(支持 mcp.servers 与 mcp_servers优先沿用已有风格默认 mcp_servers
let prefer_mcp_servers = root.contains_key("mcp_servers") || !root.contains_key("mcp"); let prefer_mcp_servers = root
.get("mcp_servers")
.is_some()
|| root.get("mcp").is_none();
if enabled.is_empty() { if enabled.is_empty() {
// 无启用项:移除两种节点 // 无启用项:移除两种节点
root.remove("mcp"); // 清除 mcp.servers但保留其他 mcp 字段
let mut should_drop_mcp = false;
if let Some(mcp_val) = root.get_mut("mcp") {
match mcp_val {
TomlValue::Table(tbl) => {
tbl.remove("servers");
should_drop_mcp = tbl.is_empty();
}
_ => should_drop_mcp = true,
}
}
if should_drop_mcp {
root.remove("mcp");
}
// 清除顶层 mcp_servers
root.remove("mcp_servers"); root.remove("mcp_servers");
} else { } else {
let mut servers_tbl = TomlTable::new(); let mut servers_tbl = TomlTable::new();
@@ -406,13 +424,49 @@ pub fn sync_enabled_to_codex(config: &MultiAppConfig) -> Result<(), String> {
servers_tbl.insert(id.clone(), TomlValue::Table(s)); servers_tbl.insert(id.clone(), TomlValue::Table(s));
} }
let servers_value = TomlValue::Table(servers_tbl.clone());
if prefer_mcp_servers { if prefer_mcp_servers {
root.insert("mcp_servers".into(), TomlValue::Table(servers_tbl)); root.insert("mcp_servers".into(), servers_value);
root.remove("mcp");
// 若存在 mcp则仅移除 servers 字段,保留其他键
let mut should_drop_mcp = false;
if let Some(mcp_val) = root.get_mut("mcp") {
match mcp_val {
TomlValue::Table(tbl) => {
tbl.remove("servers");
should_drop_mcp = tbl.is_empty();
}
_ => should_drop_mcp = true,
}
}
if should_drop_mcp {
root.remove("mcp");
}
} else { } else {
let mut mcp_tbl = TomlTable::new(); let mut inserted = false;
mcp_tbl.insert("servers".into(), TomlValue::Table(servers_tbl));
root.insert("mcp".into(), TomlValue::Table(mcp_tbl)); if let Some(mcp_val) = root.get_mut("mcp") {
match mcp_val {
TomlValue::Table(tbl) => {
tbl.insert("servers".into(), TomlValue::Table(servers_tbl.clone()));
inserted = true;
}
_ => {
let mut mcp_tbl = TomlTable::new();
mcp_tbl.insert("servers".into(), TomlValue::Table(servers_tbl.clone()));
*mcp_val = TomlValue::Table(mcp_tbl);
inserted = true;
}
}
}
if !inserted {
let mut mcp_tbl = TomlTable::new();
mcp_tbl.insert("servers".into(), TomlValue::Table(servers_tbl));
root.insert("mcp".into(), TomlValue::Table(mcp_tbl));
}
root.remove("mcp_servers"); root.remove("mcp_servers");
} }
} }