Skip to content

Commit db31f69

Browse files
authored
chore: config editor (#5878)
The goal is to have a single place where we actually write files In a follow-up PR, will move everything config related in a dedicated module and move the helpers in a dedicated file
1 parent 2b20cd6 commit db31f69

File tree

8 files changed

+926
-1006
lines changed

8 files changed

+926
-1006
lines changed

codex-rs/app-server/src/codex_message_processor.rs

Lines changed: 7 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -74,9 +74,7 @@ use codex_core::config::Config;
7474
use codex_core::config::ConfigOverrides;
7575
use codex_core::config::ConfigToml;
7676
use codex_core::config::load_config_as_toml;
77-
use codex_core::config_edit::CONFIG_KEY_EFFORT;
78-
use codex_core::config_edit::CONFIG_KEY_MODEL;
79-
use codex_core::config_edit::persist_overrides_and_clear_if_none;
77+
use codex_core::config_edit::ConfigEditsBuilder;
8078
use codex_core::default_client::get_codex_user_agent;
8179
use codex_core::exec::ExecParams;
8280
use codex_core::exec_env::create_env;
@@ -689,19 +687,12 @@ impl CodexMessageProcessor {
689687
model,
690688
reasoning_effort,
691689
} = params;
692-
let effort_str = reasoning_effort.map(|effort| effort.to_string());
693690

694-
let overrides: [(&[&str], Option<&str>); 2] = [
695-
(&[CONFIG_KEY_MODEL], model.as_deref()),
696-
(&[CONFIG_KEY_EFFORT], effort_str.as_deref()),
697-
];
698-
699-
match persist_overrides_and_clear_if_none(
700-
&self.config.codex_home,
701-
self.config.active_profile.as_deref(),
702-
&overrides,
703-
)
704-
.await
691+
match ConfigEditsBuilder::new(&self.config.codex_home)
692+
.with_profile(self.config.active_profile.as_deref())
693+
.set_model(model.as_deref(), reasoning_effort)
694+
.apply()
695+
.await
705696
{
706697
Ok(()) => {
707698
let response = SetDefaultModelResponse {};
@@ -710,7 +701,7 @@ impl CodexMessageProcessor {
710701
Err(err) => {
711702
let error = JSONRPCErrorError {
712703
code: INTERNAL_ERROR_CODE,
713-
message: format!("failed to persist overrides: {err}"),
704+
message: format!("failed to persist model selection: {err}"),
714705
data: None,
715706
};
716707
self.outgoing.send_error(request_id, error).await;

codex-rs/cli/src/mcp_cmd.rs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ use codex_core::config::Config;
1111
use codex_core::config::ConfigOverrides;
1212
use codex_core::config::find_codex_home;
1313
use codex_core::config::load_global_mcp_servers;
14-
use codex_core::config::write_global_mcp_servers;
14+
use codex_core::config_edit::ConfigEditsBuilder;
1515
use codex_core::config_types::McpServerConfig;
1616
use codex_core::config_types::McpServerTransportConfig;
1717
use codex_core::features::Feature;
@@ -263,7 +263,10 @@ async fn run_add(config_overrides: &CliConfigOverrides, add_args: AddArgs) -> Re
263263

264264
servers.insert(name.clone(), new_entry);
265265

266-
write_global_mcp_servers(&codex_home, &servers)
266+
ConfigEditsBuilder::new(&codex_home)
267+
.replace_mcp_servers(&servers)
268+
.apply()
269+
.await
267270
.with_context(|| format!("failed to write MCP servers to {}", codex_home.display()))?;
268271

269272
println!("Added global MCP server '{name}'.");
@@ -321,7 +324,10 @@ async fn run_remove(config_overrides: &CliConfigOverrides, remove_args: RemoveAr
321324
let removed = servers.remove(&name).is_some();
322325

323326
if removed {
324-
write_global_mcp_servers(&codex_home, &servers)
327+
ConfigEditsBuilder::new(&codex_home)
328+
.replace_mcp_servers(&servers)
329+
.apply()
330+
.await
325331
.with_context(|| format!("failed to write MCP servers to {}", codex_home.display()))?;
326332
}
327333

codex-rs/cli/tests/mcp_list.rs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use std::path::Path;
22

33
use anyhow::Result;
44
use codex_core::config::load_global_mcp_servers;
5-
use codex_core::config::write_global_mcp_servers;
5+
use codex_core::config_edit::ConfigEditsBuilder;
66
use codex_core::config_types::McpServerTransportConfig;
77
use predicates::prelude::PredicateBooleanExt;
88
use predicates::str::contains;
@@ -59,7 +59,9 @@ async fn list_and_get_render_expected_output() -> Result<()> {
5959
}
6060
other => panic!("unexpected transport: {other:?}"),
6161
}
62-
write_global_mcp_servers(codex_home.path(), &servers)?;
62+
ConfigEditsBuilder::new(codex_home.path())
63+
.replace_mcp_servers(&servers)
64+
.apply_blocking()?;
6365

6466
let mut list_cmd = codex_command(codex_home.path())?;
6567
let list_output = list_cmd.args(["mcp", "list"]).output()?;
@@ -149,7 +151,9 @@ async fn get_disabled_server_shows_single_line() -> Result<()> {
149151
.get_mut("docs")
150152
.expect("docs server should exist after add");
151153
docs.enabled = false;
152-
write_global_mcp_servers(codex_home.path(), &servers)?;
154+
ConfigEditsBuilder::new(codex_home.path())
155+
.replace_mcp_servers(&servers)
156+
.apply_blocking()?;
153157

154158
let mut get_cmd = codex_command(codex_home.path())?;
155159
let get_output = get_cmd.args(["mcp", "get", "docs"]).output()?;

0 commit comments

Comments
 (0)