From 7c423ba370fc17cf79ccee43b8ba6222b3a4567a Mon Sep 17 00:00:00 2001 From: Andrei Hasna Date: Wed, 12 Aug 2026 12:42:55 +0300 Subject: [PATCH 1/4] fix: preserve worker admission JSON output Agent: cossus --- codex-rs/background-agent/Cargo.toml | 2 +- .../background-agent/src/worker_admission.rs | 14 ++++++++++- .../tests/worker_admission.rs | 24 +++++++++++++++++++ 3 files changed, 38 insertions(+), 2 deletions(-) diff --git a/codex-rs/background-agent/Cargo.toml b/codex-rs/background-agent/Cargo.toml index 661e5aaf2..90ee8f342 100644 --- a/codex-rs/background-agent/Cargo.toml +++ b/codex-rs/background-agent/Cargo.toml @@ -20,9 +20,9 @@ codex-utils-pty = { workspace = true } libc = { workspace = true } serde = { workspace = true, features = ["derive"] } serde_json = { workspace = true } +tempfile = { workspace = true } tokio = { workspace = true, features = ["fs", "io-util", "process", "time"] } [dev-dependencies] pretty_assertions = { workspace = true } -tempfile = { workspace = true } tokio = { workspace = true, features = ["macros", "rt-multi-thread"] } diff --git a/codex-rs/background-agent/src/worker_admission.rs b/codex-rs/background-agent/src/worker_admission.rs index e1b82bbf3..2bd3650ba 100644 --- a/codex-rs/background-agent/src/worker_admission.rs +++ b/codex-rs/background-agent/src/worker_admission.rs @@ -135,10 +135,19 @@ impl WorkerAdmissionCommandRunner for ProcessWorkerAdmissionCommandRunner { &self, command: WorkerAdmissionCommand, ) -> anyhow::Result { + // `todos agent --json` may exceed the CLI's pipe-output cap. Spool + // stdout to a private file so the structured admission response stays + // complete while stderr remains separately captured for diagnostics. + let stdout_capture = tempfile::NamedTempFile::new() + .context("failed to create worker-admission stdout capture")?; + let stdout_file = stdout_capture + .reopen() + .context("failed to open worker-admission stdout capture")?; let output = Command::new(&command.program) .args(&command.args) .envs(command.env) .stdin(Stdio::null()) + .stdout(Stdio::from(stdout_file)) .output() .await .with_context(|| { @@ -147,9 +156,12 @@ impl WorkerAdmissionCommandRunner for ProcessWorkerAdmissionCommandRunner { command.program.display() ) })?; + let stdout = tokio::fs::read(stdout_capture.path()) + .await + .context("failed to read worker-admission stdout capture")?; Ok(WorkerAdmissionCommandOutput { exit_code: output.status.code().unwrap_or(1), - stdout: output.stdout, + stdout, stderr: output.stderr, }) } diff --git a/codex-rs/background-agent/tests/worker_admission.rs b/codex-rs/background-agent/tests/worker_admission.rs index 34ae39c97..f344faf57 100644 --- a/codex-rs/background-agent/tests/worker_admission.rs +++ b/codex-rs/background-agent/tests/worker_admission.rs @@ -1,5 +1,6 @@ use codex_background_agent::process_lifecycle::WorkerProcessCommand; use codex_background_agent::worker_admission::CONVERSATIONS_AGENT_ID_ENV; +use codex_background_agent::worker_admission::ProcessWorkerAdmissionCommandRunner; use codex_background_agent::worker_admission::WorkerAdmission; use codex_background_agent::worker_admission::WorkerAdmissionCommand; use codex_background_agent::worker_admission::WorkerAdmissionCommandOutput; @@ -17,6 +18,7 @@ use std::ffi::OsString; use std::fmt::Debug; use std::fmt::Display; use std::future::Future; +use std::path::PathBuf; use std::sync::Mutex; const WORKER: &str = "worker-one"; @@ -631,3 +633,25 @@ fn worker_process_command_sets_explicit_conversations_identity() { )] ); } + +#[cfg(unix)] +#[tokio::test] +async fn process_runner_preserves_large_stdout_for_worker_admission() { + let output = must_ok( + ProcessWorkerAdmissionCommandRunner + .run(WorkerAdmissionCommand { + program: PathBuf::from("sh"), + args: vec![ + OsString::from("-c"), + OsString::from("head -c 131073 /dev/zero"), + ], + env: Vec::new(), + }) + .await, + "large worker-admission stdout capture", + ); + + assert_eq!(output.exit_code, 0); + assert_eq!(output.stdout, vec![0; 131_073]); + assert_eq!(output.stderr, Vec::new()); +} From 239f46d710ed578023c5f60dc9e0e9e424c3cc0a Mon Sep 17 00:00:00 2001 From: Andrei Hasna Date: Wed, 12 Aug 2026 18:41:21 +0300 Subject: [PATCH 2/4] fix: type worker admission stderr expectation Agent: Hostus --- codex-rs/background-agent/tests/worker_admission.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/codex-rs/background-agent/tests/worker_admission.rs b/codex-rs/background-agent/tests/worker_admission.rs index f344faf57..6ad406310 100644 --- a/codex-rs/background-agent/tests/worker_admission.rs +++ b/codex-rs/background-agent/tests/worker_admission.rs @@ -653,5 +653,5 @@ async fn process_runner_preserves_large_stdout_for_worker_admission() { assert_eq!(output.exit_code, 0); assert_eq!(output.stdout, vec![0; 131_073]); - assert_eq!(output.stderr, Vec::new()); + assert_eq!(output.stderr, Vec::::new()); } From 2850564c6bf8508513baca2c8faf98b3784ca27b Mon Sep 17 00:00:00 2001 From: Andrei Hasna Date: Wed, 12 Aug 2026 21:05:30 +0300 Subject: [PATCH 3/4] fix: cfg-gate unix-only worker admission test imports Agent: Aurelianus --- codex-rs/background-agent/tests/worker_admission.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/codex-rs/background-agent/tests/worker_admission.rs b/codex-rs/background-agent/tests/worker_admission.rs index 6ad406310..8dafc37e5 100644 --- a/codex-rs/background-agent/tests/worker_admission.rs +++ b/codex-rs/background-agent/tests/worker_admission.rs @@ -1,5 +1,6 @@ use codex_background_agent::process_lifecycle::WorkerProcessCommand; use codex_background_agent::worker_admission::CONVERSATIONS_AGENT_ID_ENV; +#[cfg(unix)] use codex_background_agent::worker_admission::ProcessWorkerAdmissionCommandRunner; use codex_background_agent::worker_admission::WorkerAdmission; use codex_background_agent::worker_admission::WorkerAdmissionCommand; @@ -18,6 +19,7 @@ use std::ffi::OsString; use std::fmt::Debug; use std::fmt::Display; use std::future::Future; +#[cfg(unix)] use std::path::PathBuf; use std::sync::Mutex; From 953b10b83a07530024b07e6a42550556aacab4a0 Mon Sep 17 00:00:00 2001 From: Andrei Hasna Date: Wed, 12 Aug 2026 22:33:35 +0300 Subject: [PATCH 4/4] fix: preserve file-backed worker stdout Agent: unresolved-account011 --- codex-rs/background-agent/src/worker_admission.rs | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/codex-rs/background-agent/src/worker_admission.rs b/codex-rs/background-agent/src/worker_admission.rs index 2bd3650ba..c0d94801f 100644 --- a/codex-rs/background-agent/src/worker_admission.rs +++ b/codex-rs/background-agent/src/worker_admission.rs @@ -143,19 +143,25 @@ impl WorkerAdmissionCommandRunner for ProcessWorkerAdmissionCommandRunner { let stdout_file = stdout_capture .reopen() .context("failed to open worker-admission stdout capture")?; - let output = Command::new(&command.program) + let child = Command::new(&command.program) .args(&command.args) .envs(command.env) .stdin(Stdio::null()) .stdout(Stdio::from(stdout_file)) - .output() - .await + .stderr(Stdio::piped()) + .spawn() .with_context(|| { format!( "failed to execute worker-admission dependency {}", command.program.display() ) })?; + let output = child.wait_with_output().await.with_context(|| { + format!( + "failed to wait for worker-admission dependency {}", + command.program.display() + ) + })?; let stdout = tokio::fs::read(stdout_capture.path()) .await .context("failed to read worker-admission stdout capture")?;