From 2bb2cd25c63b642711b0058979b48ce849962619 Mon Sep 17 00:00:00 2001 From: pakrym-oai Date: Thu, 9 Jul 2026 11:50:56 -0700 Subject: [PATCH] core: require tool runtimes to provide workspace roots --- codex-rs/core/src/session/tests.rs | 4 ++++ codex-rs/core/src/tools/orchestrator.rs | 10 +--------- codex-rs/core/src/tools/runtimes/apply_patch.rs | 4 ++-- codex-rs/core/src/tools/runtimes/shell.rs | 4 ++-- codex-rs/core/src/tools/runtimes/unified_exec.rs | 4 ++-- codex-rs/core/src/tools/sandboxing.rs | 4 +--- 6 files changed, 12 insertions(+), 18 deletions(-) diff --git a/codex-rs/core/src/session/tests.rs b/codex-rs/core/src/session/tests.rs index 83c55fdf63..9791813dde 100644 --- a/codex-rs/core/src/session/tests.rs +++ b/codex-rs/core/src/session/tests.rs @@ -1076,6 +1076,10 @@ async fn danger_full_access_tool_attempts_do_not_enforce_managed_network() -> an } impl crate::tools::sandboxing::ToolRuntime<(), ()> for ProbeToolRuntime { + fn workspace_roots<'a>(&self, _req: &'a ()) -> &'a [PathUri] { + &[] + } + async fn run( &mut self, _req: &(), diff --git a/codex-rs/core/src/tools/orchestrator.rs b/codex-rs/core/src/tools/orchestrator.rs index 06b6095d48..100634fd5d 100644 --- a/codex-rs/core/src/tools/orchestrator.rs +++ b/codex-rs/core/src/tools/orchestrator.rs @@ -265,15 +265,7 @@ impl ToolOrchestrator { .sandbox_cwd(req) .cloned() .unwrap_or_else(|| PathUri::from_abs_path(&turn_ctx.cwd)); - let workspace_roots = tool - .workspace_roots(req) - .or_else(|| { - turn_ctx - .environments - .primary() - .map(|environment| environment.workspace_roots()) - }) - .unwrap_or_default(); + let workspace_roots = tool.workspace_roots(req); let permissions = workspace_roots .iter() .map(PathUri::to_abs_path) diff --git a/codex-rs/core/src/tools/runtimes/apply_patch.rs b/codex-rs/core/src/tools/runtimes/apply_patch.rs index f5023bd6e0..6b6a8b86a7 100644 --- a/codex-rs/core/src/tools/runtimes/apply_patch.rs +++ b/codex-rs/core/src/tools/runtimes/apply_patch.rs @@ -219,8 +219,8 @@ impl Approvable for ApplyPatchRuntime { } impl ToolRuntime for ApplyPatchRuntime { - fn workspace_roots<'a>(&self, req: &'a ApplyPatchRequest) -> Option<&'a [PathUri]> { - Some(req.turn_environment.workspace_roots()) + fn workspace_roots<'a>(&self, req: &'a ApplyPatchRequest) -> &'a [PathUri] { + req.turn_environment.workspace_roots() } fn sandbox_cwd<'a>(&self, req: &'a ApplyPatchRequest) -> Option<&'a PathUri> { diff --git a/codex-rs/core/src/tools/runtimes/shell.rs b/codex-rs/core/src/tools/runtimes/shell.rs index a7b085bf8e..f943e8597b 100644 --- a/codex-rs/core/src/tools/runtimes/shell.rs +++ b/codex-rs/core/src/tools/runtimes/shell.rs @@ -209,8 +209,8 @@ impl Approvable for ShellRuntime { } impl ToolRuntime for ShellRuntime { - fn workspace_roots<'a>(&self, req: &'a ShellRequest) -> Option<&'a [PathUri]> { - Some(req.turn_environment.workspace_roots()) + fn workspace_roots<'a>(&self, req: &'a ShellRequest) -> &'a [PathUri] { + req.turn_environment.workspace_roots() } fn network_approval_spec( diff --git a/codex-rs/core/src/tools/runtimes/unified_exec.rs b/codex-rs/core/src/tools/runtimes/unified_exec.rs index ee5c0deddc..8a97cde20f 100644 --- a/codex-rs/core/src/tools/runtimes/unified_exec.rs +++ b/codex-rs/core/src/tools/runtimes/unified_exec.rs @@ -255,8 +255,8 @@ impl Approvable for UnifiedExecRuntime<'_> { } impl<'a> ToolRuntime for UnifiedExecRuntime<'a> { - fn workspace_roots<'b>(&self, req: &'b UnifiedExecRequest) -> Option<&'b [PathUri]> { - Some(req.turn_environment.workspace_roots()) + fn workspace_roots<'b>(&self, req: &'b UnifiedExecRequest) -> &'b [PathUri] { + req.turn_environment.workspace_roots() } fn sandbox_cwd<'b>(&self, req: &'b UnifiedExecRequest) -> Option<&'b PathUri> { diff --git a/codex-rs/core/src/tools/sandboxing.rs b/codex-rs/core/src/tools/sandboxing.rs index 91a33d0029..7b6f6e30d8 100644 --- a/codex-rs/core/src/tools/sandboxing.rs +++ b/codex-rs/core/src/tools/sandboxing.rs @@ -394,9 +394,7 @@ pub(crate) enum ToolError { } pub(crate) trait ToolRuntime: Approvable + Sandboxable { - fn workspace_roots<'a>(&self, _req: &'a Req) -> Option<&'a [PathUri]> { - None - } + fn workspace_roots<'a>(&self, req: &'a Req) -> &'a [PathUri]; fn network_approval_spec(&self, _req: &Req, _ctx: &ToolCtx) -> Option { None