From 4ff81e2b22a654c6b7ab1e484dab0f2bffeb25cb Mon Sep 17 00:00:00 2001 From: Katia Bazzi Date: Sat, 13 Jun 2026 14:14:23 -0700 Subject: [PATCH] Simplify Guardian timeout fallback plumbing --- codex-rs/core/src/session/turn_context.rs | 4 ++++ codex-rs/core/src/tools/orchestrator.rs | 7 +------ codex-rs/core/src/tools/orchestrator_tests.rs | 3 +-- codex-rs/core/src/tools/runtimes/shell/unix_escalation.rs | 2 +- 4 files changed, 7 insertions(+), 9 deletions(-) diff --git a/codex-rs/core/src/session/turn_context.rs b/codex-rs/core/src/session/turn_context.rs index 61f285adad..9548fb3918 100644 --- a/codex-rs/core/src/session/turn_context.rs +++ b/codex-rs/core/src/session/turn_context.rs @@ -114,6 +114,10 @@ enum TurnMultiAgentRuntime { } impl TurnContext { + pub(crate) fn guardian_timeout_manual_fallback_enabled(&self) -> bool { + self.manual_approval_fallback_enabled + } + pub(crate) fn permission_profile(&self) -> PermissionProfile { self.permission_profile.clone() } diff --git a/codex-rs/core/src/tools/orchestrator.rs b/codex-rs/core/src/tools/orchestrator.rs index 2e8673eab2..f7e8681107 100644 --- a/codex-rs/core/src/tools/orchestrator.rs +++ b/codex-rs/core/src/tools/orchestrator.rs @@ -57,7 +57,6 @@ struct ApprovalDecision { struct ApprovalRequestOptions { evaluate_permission_request_hooks: bool, - manual_fallback_for_guardian_timeout: bool, } impl ToolOrchestrator { @@ -154,7 +153,6 @@ impl ToolOrchestrator { let otel_ci = &tool_ctx.call_id; let strict_auto_review = tool_ctx.session.strict_auto_review_enabled_for_turn().await; let use_guardian = routes_approval_to_guardian(turn_ctx) || strict_auto_review; - let manual_fallback_for_guardian_timeout = turn_ctx.manual_approval_fallback_enabled; // 1) Approval let mut already_approved = false; @@ -184,7 +182,6 @@ impl ToolOrchestrator { tool_ctx, ApprovalRequestOptions { evaluate_permission_request_hooks: false, - manual_fallback_for_guardian_timeout, }, &otel, ) @@ -226,7 +223,6 @@ impl ToolOrchestrator { tool_ctx, ApprovalRequestOptions { evaluate_permission_request_hooks: !strict_auto_review, - manual_fallback_for_guardian_timeout, }, &otel, ) @@ -415,7 +411,6 @@ impl ToolOrchestrator { tool_ctx, ApprovalRequestOptions { evaluate_permission_request_hooks: !strict_auto_review, - manual_fallback_for_guardian_timeout, }, &otel, ) @@ -584,7 +579,7 @@ impl ToolOrchestrator { otel_source, ); - if !options.manual_fallback_for_guardian_timeout + if !turn.guardian_timeout_manual_fallback_enabled() || !matches!(decision, ReviewDecision::TimedOut) || guardian_review_id.is_none() { diff --git a/codex-rs/core/src/tools/orchestrator_tests.rs b/codex-rs/core/src/tools/orchestrator_tests.rs index 2e612772f2..a1491dddd3 100644 --- a/codex-rs/core/src/tools/orchestrator_tests.rs +++ b/codex-rs/core/src/tools/orchestrator_tests.rs @@ -68,6 +68,7 @@ impl ToolRuntime<(), ()> for TimeoutThenManualRuntime { async fn guardian_timeout_falls_back_to_manual_approval() { let (session, mut turn) = crate::session::tests::make_session_and_context().await; turn.session_source = SessionSource::Cli; + turn.manual_approval_fallback_enabled = true; let session = Arc::new(session); let turn = Arc::new(turn); let tool_ctx = ToolCtx { @@ -94,7 +95,6 @@ async fn guardian_timeout_falls_back_to_manual_approval() { &tool_ctx, super::ApprovalRequestOptions { evaluate_permission_request_hooks: false, - manual_fallback_for_guardian_timeout: true, }, &turn.session_telemetry, ) @@ -153,7 +153,6 @@ async fn guardian_timeout_stays_terminal_when_manual_fallback_is_disabled() { &tool_ctx, super::ApprovalRequestOptions { evaluate_permission_request_hooks: false, - manual_fallback_for_guardian_timeout: false, }, &turn.session_telemetry, ) diff --git a/codex-rs/core/src/tools/runtimes/shell/unix_escalation.rs b/codex-rs/core/src/tools/runtimes/shell/unix_escalation.rs index e1c9c7ff0f..1de365e951 100644 --- a/codex-rs/core/src/tools/runtimes/shell/unix_escalation.rs +++ b/codex-rs/core/src/tools/runtimes/shell/unix_escalation.rs @@ -367,7 +367,7 @@ impl ExecvePromptRequest { decision: ReviewDecision, ) -> PromptDecision { if !matches!(decision, ReviewDecision::TimedOut) - || !self.turn.manual_approval_fallback_enabled + || !self.turn.guardian_timeout_manual_fallback_enabled() { return PromptDecision { decision,