From f6417ec0c06c4d65c4af3152c149afbde7c3e571 Mon Sep 17 00:00:00 2001 From: Adam Perry Date: Mon, 22 Jun 2026 20:36:48 +0000 Subject: [PATCH] codex: normalize legacy URI cwd on rollout replay (#29472) --- .../app-server-protocol/src/protocol/item_builders.rs | 10 ++++++++-- .../src/protocol/item_builders_tests.rs | 8 ++++++-- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/codex-rs/app-server-protocol/src/protocol/item_builders.rs b/codex-rs/app-server-protocol/src/protocol/item_builders.rs index 53c0beb9bd..b4dfe19095 100644 --- a/codex-rs/app-server-protocol/src/protocol/item_builders.rs +++ b/codex-rs/app-server-protocol/src/protocol/item_builders.rs @@ -94,7 +94,7 @@ pub fn build_command_execution_begin_item(payload: &ExecCommandBeginEvent) -> Th ThreadItem::CommandExecution { id: payload.call_id.clone(), command: shlex_join(&payload.command), - cwd: payload.cwd.clone(), + cwd: normalized_app_server_cwd(&payload.cwd), process_id: payload.process_id.clone(), source: payload.source.into(), status: CommandExecutionStatus::InProgress, @@ -117,7 +117,7 @@ pub fn build_command_execution_end_item(payload: &ExecCommandEndEvent) -> Thread ThreadItem::CommandExecution { id: payload.call_id.clone(), command: shlex_join(&payload.command), - cwd: payload.cwd.clone(), + cwd: normalized_app_server_cwd(&payload.cwd), process_id: payload.process_id.clone(), source: payload.source.into(), status: (&payload.status).into(), @@ -128,6 +128,12 @@ pub fn build_command_execution_end_item(payload: &ExecCommandEndEvent) -> Thread } } +fn normalized_app_server_cwd(cwd: &LegacyAppPathString) -> LegacyAppPathString { + cwd.to_inferred_path_uri() + .map(LegacyAppPathString::from) + .unwrap_or_else(|| cwd.clone()) +} + fn command_actions_for_legacy_cwd( parsed_cmd: &[ParsedCommand], cwd: &LegacyAppPathString, diff --git a/codex-rs/app-server-protocol/src/protocol/item_builders_tests.rs b/codex-rs/app-server-protocol/src/protocol/item_builders_tests.rs index a622affc0d..3faaef066f 100644 --- a/codex-rs/app-server-protocol/src/protocol/item_builders_tests.rs +++ b/codex-rs/app-server-protocol/src/protocol/item_builders_tests.rs @@ -47,8 +47,8 @@ fn raw_file_uri_cwd_is_converted_for_command_actions() { let raw_uri = "file:///C:/src"; #[cfg(not(windows))] let raw_uri = "file:///usr/local/src"; - let expected_path = PathUri::parse(raw_uri) - .expect("raw file URI should parse") + let cwd_uri = PathUri::parse(raw_uri).expect("raw file URI should parse"); + let expected_path = cwd_uri .to_abs_path() .expect("raw file URI should be native") .join("file.txt"); @@ -60,6 +60,10 @@ fn raw_file_uri_cwd_is_converted_for_command_actions() { path: PathBuf::from("file.txt"), }]; + assert_eq!( + normalized_app_server_cwd(&cwd), + LegacyAppPathString::from(cwd_uri), + ); assert_eq!( command_actions_for_legacy_cwd(&parsed_cmd, &cwd), vec![CommandAction::Read {