From b008d04de3ebcdd5e289f377ffd844f5ca05ae39 Mon Sep 17 00:00:00 2001 From: pakrym-oai Date: Thu, 9 Jul 2026 11:42:30 -0700 Subject: [PATCH] core: require roots when constructing turn environments --- codex-rs/core/src/agents_md_tests.rs | 1 + codex-rs/core/src/environment_selection.rs | 13 ++++++++++--- codex-rs/core/src/mcp_openai_file.rs | 1 + codex-rs/core/src/mcp_tool_call_tests.rs | 1 + codex-rs/core/src/session/tests.rs | 5 +++++ codex-rs/core/src/session/turn_context.rs | 8 ++------ codex-rs/core/src/tools/handlers/shell_tests.rs | 1 + codex-rs/core/src/tools/handlers/view_image.rs | 1 + .../core/src/tools/runtimes/apply_patch_tests.rs | 1 + codex-rs/core/src/tools/runtimes/shell_tests.rs | 1 + codex-rs/core/src/tools/runtimes/unified_exec.rs | 1 + codex-rs/core/src/tools/spec_plan_tests.rs | 1 + 12 files changed, 26 insertions(+), 9 deletions(-) diff --git a/codex-rs/core/src/agents_md_tests.rs b/codex-rs/core/src/agents_md_tests.rs index d93e4634db..6bdfcf842e 100644 --- a/codex-rs/core/src/agents_md_tests.rs +++ b/codex-rs/core/src/agents_md_tests.rs @@ -303,6 +303,7 @@ fn resolved_local_environments( .expect("local environment"), ), PathUri::from_abs_path(&cwd), + Vec::new(), /*shell*/ None, ) }) diff --git a/codex-rs/core/src/environment_selection.rs b/codex-rs/core/src/environment_selection.rs index bed131a5cf..53857e596e 100644 --- a/codex-rs/core/src/environment_selection.rs +++ b/codex-rs/core/src/environment_selection.rs @@ -177,9 +177,13 @@ impl ThreadEnvironments { } else { Some(local_shell) }; - let mut turn_environment = - TurnEnvironment::new(selection.environment_id, environment, selection.cwd, shell) - .with_workspace_roots(selection.workspace_roots); + let mut turn_environment = TurnEnvironment::new( + selection.environment_id, + environment, + selection.cwd, + selection.workspace_roots, + shell, + ); let task = shell_snapshot .build(turn_environment.clone()) .boxed() @@ -840,6 +844,7 @@ url = "ws://127.0.0.1:8765" selection.environment_id.clone(), Arc::clone(&inherited_environment), selection.cwd.clone(), + Vec::new(), /*shell*/ None, ); let manager = Arc::new(EnvironmentManager::without_environments()); @@ -897,6 +902,7 @@ url = "ws://127.0.0.1:8765" REMOTE_ENVIRONMENT_ID.to_string(), remote_environment.clone(), cwd_uri.clone(), + Vec::new(), /*shell*/ None, )], starting: Vec::new(), @@ -908,6 +914,7 @@ url = "ws://127.0.0.1:8765" REMOTE_ENVIRONMENT_ID.to_string(), remote_environment, cwd_uri, + Vec::new(), /*shell*/ None, ), ], diff --git a/codex-rs/core/src/mcp_openai_file.rs b/codex-rs/core/src/mcp_openai_file.rs index 0df11b2f12..02c1587e04 100644 --- a/codex-rs/core/src/mcp_openai_file.rs +++ b/codex-rs/core/src/mcp_openai_file.rs @@ -229,6 +229,7 @@ mod tests { primary.environment_id.clone(), Arc::clone(&primary.environment), PathUri::from_abs_path(&cwd), + Vec::new(), primary.shell.clone(), ); } diff --git a/codex-rs/core/src/mcp_tool_call_tests.rs b/codex-rs/core/src/mcp_tool_call_tests.rs index 8c76c60334..6d1c68676d 100644 --- a/codex-rs/core/src/mcp_tool_call_tests.rs +++ b/codex-rs/core/src/mcp_tool_call_tests.rs @@ -1169,6 +1169,7 @@ async fn mcp_sandbox_cwd_uses_matching_server_environment_uri() -> anyhow::Resul "remote".to_string(), environment, secondary_cwd.clone(), + Vec::new(), /*shell*/ None, )); diff --git a/codex-rs/core/src/session/tests.rs b/codex-rs/core/src/session/tests.rs index 7cbea472fb..83c55fdf63 100644 --- a/codex-rs/core/src/session/tests.rs +++ b/codex-rs/core/src/session/tests.rs @@ -6065,6 +6065,7 @@ async fn request_permissions_tool_resolves_relative_paths_against_selected_envir "remote".to_string(), current_environment.environment, PathUri::from_abs_path(&environment_cwd), + Vec::new(), current_environment.shell, ); @@ -6697,6 +6698,7 @@ async fn primary_environment_uses_first_turn_environment() { "second".to_string(), Arc::clone(&first_environment.environment), second_cwd_uri.clone(), + Vec::new(), /*shell*/ None, )); @@ -7919,6 +7921,7 @@ async fn record_context_updates_emits_environment_item_for_cwd_changes() { environment.environment_id, environment.environment, PathUri::from_abs_path(&cwd), + Vec::new(), environment.shell, ); @@ -7978,6 +7981,7 @@ async fn record_context_updates_omits_environment_item_when_disabled() { environment.environment_id, environment.environment, PathUri::from_abs_path(&test_path_buf("/new-repo").abs()), + Vec::new(), environment.shell, ); @@ -8706,6 +8710,7 @@ async fn turn_context_item_stores_local_cwd() { "remote".to_string(), environment.environment, cwd, + Vec::new(), environment.shell, ); diff --git a/codex-rs/core/src/session/turn_context.rs b/codex-rs/core/src/session/turn_context.rs index 45ad4ebf5a..bf50a5b206 100644 --- a/codex-rs/core/src/session/turn_context.rs +++ b/codex-rs/core/src/session/turn_context.rs @@ -55,13 +55,14 @@ impl TurnEnvironment { environment_id: String, environment: Arc, cwd: PathUri, + workspace_roots: Vec, shell: Option, ) -> Self { Self { environment_id, environment, cwd, - workspace_roots: Vec::new(), + workspace_roots, shell, shell_snapshot: futures::future::ready(None).boxed().shared(), } @@ -85,11 +86,6 @@ impl TurnEnvironment { &self.workspace_roots } - pub(crate) fn with_workspace_roots(mut self, workspace_roots: Vec) -> Self { - self.workspace_roots = workspace_roots; - self - } - pub(crate) fn selection(&self) -> TurnEnvironmentSelection { TurnEnvironmentSelection { environment_id: self.environment_id.clone(), diff --git a/codex-rs/core/src/tools/handlers/shell_tests.rs b/codex-rs/core/src/tools/handlers/shell_tests.rs index ebfbf9127c..90fd27d878 100644 --- a/codex-rs/core/src/tools/handlers/shell_tests.rs +++ b/codex-rs/core/src/tools/handlers/shell_tests.rs @@ -109,6 +109,7 @@ async fn shell_command_handler_to_exec_params_uses_selected_environment() { .environment, ), PathUri::from_abs_path(&selected_cwd), + Vec::new(), Some(selected_shell), ); let mut expected_env = create_env( diff --git a/codex-rs/core/src/tools/handlers/view_image.rs b/codex-rs/core/src/tools/handlers/view_image.rs index c3ec34ed22..92b7d0023b 100644 --- a/codex-rs/core/src/tools/handlers/view_image.rs +++ b/codex-rs/core/src/tools/handlers/view_image.rs @@ -270,6 +270,7 @@ mod tests { current.environment_id, current.environment, PathUri::from_abs_path(&cwd), + Vec::new(), current.shell, ); } diff --git a/codex-rs/core/src/tools/runtimes/apply_patch_tests.rs b/codex-rs/core/src/tools/runtimes/apply_patch_tests.rs index bcb474e961..6e3aa76c16 100644 --- a/codex-rs/core/src/tools/runtimes/apply_patch_tests.rs +++ b/codex-rs/core/src/tools/runtimes/apply_patch_tests.rs @@ -20,6 +20,7 @@ fn test_turn_environment(environment_id: &str) -> crate::session::turn_context:: environment_id.to_string(), std::sync::Arc::new(codex_exec_server::Environment::default_for_tests()), PathUri::from_abs_path(&std::env::temp_dir().abs()), + Vec::new(), /*shell*/ None, ) } diff --git a/codex-rs/core/src/tools/runtimes/shell_tests.rs b/codex-rs/core/src/tools/runtimes/shell_tests.rs index eaa7adf48c..9f070490ad 100644 --- a/codex-rs/core/src/tools/runtimes/shell_tests.rs +++ b/codex-rs/core/src/tools/runtimes/shell_tests.rs @@ -13,6 +13,7 @@ async fn approval_key_includes_environment_id() { "remote".to_string(), Arc::new(Environment::default_for_tests()), PathUri::from_abs_path(&cwd), + Vec::new(), /*shell*/ None, ), shell_type: None, diff --git a/codex-rs/core/src/tools/runtimes/unified_exec.rs b/codex-rs/core/src/tools/runtimes/unified_exec.rs index 8ebd26aa90..b5af707d67 100644 --- a/codex-rs/core/src/tools/runtimes/unified_exec.rs +++ b/codex-rs/core/src/tools/runtimes/unified_exec.rs @@ -508,6 +508,7 @@ mod tests { LOCAL_ENVIRONMENT_ID.to_string(), Arc::new(Environment::default_for_tests()), cwd, + Vec::new(), /*shell*/ None, ) } diff --git a/codex-rs/core/src/tools/spec_plan_tests.rs b/codex-rs/core/src/tools/spec_plan_tests.rs index bd33336bce..6096fab575 100644 --- a/codex-rs/core/src/tools/spec_plan_tests.rs +++ b/codex-rs/core/src/tools/spec_plan_tests.rs @@ -592,6 +592,7 @@ async fn zsh_fork_unified_exec_keeps_shell_parameter_when_remote_environment_ava .expect("remote test environment"), ), remote_cwd, + Vec::new(), /*shell*/ None, ), );