From 8ac88da0eae0520b00e49bb369a764ca6afa5582 Mon Sep 17 00:00:00 2001 From: Kyle Brown Date: Fri, 10 Jul 2026 00:51:58 +0000 Subject: [PATCH] Use explicit unified exec lifecycle outcomes --- .../core/src/tools/runtimes/unified_exec.rs | 20 +++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/codex-rs/core/src/tools/runtimes/unified_exec.rs b/codex-rs/core/src/tools/runtimes/unified_exec.rs index 1fbaa71206..49e16b7b42 100644 --- a/codex-rs/core/src/tools/runtimes/unified_exec.rs +++ b/codex-rs/core/src/tools/runtimes/unified_exec.rs @@ -9,6 +9,7 @@ use crate::exec::ExecCapturePolicy; use crate::exec::ExecExpiration; use crate::guardian::GuardianNetworkAccessTrigger; use crate::plugin_script_lifecycle::PluginScriptExecution; +use crate::plugin_script_lifecycle::PluginScriptTerminalOutcome; use crate::sandboxing::ExecOptions; use crate::sandboxing::ExecServerEnvConfig; use crate::sandboxing::SandboxPermissions; @@ -114,7 +115,7 @@ pub struct UnifiedExecRuntime<'a> { trait PluginScriptLifecycle: Send + Sync { fn mark_started(&self); fn mark_cancelled(&self); - fn finish(&self, exit_code: Option, failed: bool); + fn finish(&self, outcome: PluginScriptTerminalOutcome); } impl PluginScriptLifecycle for PluginScriptExecution { @@ -126,8 +127,8 @@ impl PluginScriptLifecycle for PluginScriptExecution { self.mark_interrupted(); } - fn finish(&self, exit_code: Option, failed: bool) { - self.finish(exit_code, failed); + fn finish(&self, outcome: PluginScriptTerminalOutcome) { + self.finish(outcome); } } @@ -165,14 +166,21 @@ impl SpawnLifecycle for PluginScriptSpawnLifecycle { fn finish(&self, exit_code: Option, failed: bool) { self.inner.finish(exit_code, failed); - self.plugin_script.finish(exit_code, failed); + let outcome = if failed { + PluginScriptTerminalOutcome::Failed { exit_code } + } else if let Some(exit_code) = exit_code { + PluginScriptTerminalOutcome::Exited { exit_code } + } else { + PluginScriptTerminalOutcome::Failed { exit_code: None } + }; + self.plugin_script.finish(outcome); } } impl Drop for PluginScriptSpawnLifecycle { fn drop(&mut self) { self.plugin_script - .finish(/*exit_code*/ None, /*failed*/ true); + .finish(PluginScriptTerminalOutcome::Failed { exit_code: None }); } } @@ -850,7 +858,7 @@ mod tests { self.events.lock().unwrap().push("plugin_cancelled"); } - fn finish(&self, _exit_code: Option, _failed: bool) { + fn finish(&self, _outcome: PluginScriptTerminalOutcome) { if !self .terminal_emitted .swap(true, std::sync::atomic::Ordering::AcqRel)