From e8c57d2ef8f028c3c9aaa5aba3340a1421ffc167 Mon Sep 17 00:00:00 2001 From: jif-oai Date: Mon, 24 Nov 2025 20:52:14 +0000 Subject: [PATCH 1/2] fix: don't store early exit sessions --- .../core/src/unified_exec/session_manager.rs | 26 +++++++++---------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/codex-rs/core/src/unified_exec/session_manager.rs b/codex-rs/core/src/unified_exec/session_manager.rs index a5cc174776..ed489e18cd 100644 --- a/codex-rs/core/src/unified_exec/session_manager.rs +++ b/codex-rs/core/src/unified_exec/session_manager.rs @@ -101,20 +101,18 @@ impl UnifiedExecSessionManager { let text = String::from_utf8_lossy(&collected).to_string(); let output = formatted_truncate_text(&text, TruncationPolicy::Tokens(max_tokens)); - let chunk_id = generate_chunk_id(); let has_exited = session.has_exited(); - let stored_id = self - .store_session(session, context, &request.command, cwd.clone(), start) - .await; - let exit_code = self - .sessions - .lock() - .await - .get(&stored_id) - .map(|entry| entry.session.exit_code()); - // Only include a session_id in the response if the process is still alive. - let session_id = if has_exited { None } else { Some(stored_id) }; - + let exit_code = session.exit_code(); + let chunk_id = generate_chunk_id(); + let session_id = if has_exited { + None + } else { + // Only store session if not exited. + let stored_id = self + .store_session(session, context, &request.command, cwd.clone(), start) + .await; + Some(stored_id) + }; let original_token_count = approx_token_count(&text); let response = UnifiedExecResponse { @@ -123,7 +121,7 @@ impl UnifiedExecSessionManager { wall_time, output, session_id, - exit_code: exit_code.flatten(), + exit_code, original_token_count: Some(original_token_count), session_command: Some(request.command.clone()), }; From 120d79a5a9f0bb53506968327468446821e9114b Mon Sep 17 00:00:00 2001 From: jif-oai Date: Mon, 24 Nov 2025 21:01:01 +0000 Subject: [PATCH 2/2] Fix a few tests --- codex-rs/core/tests/suite/unified_exec.rs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/codex-rs/core/tests/suite/unified_exec.rs b/codex-rs/core/tests/suite/unified_exec.rs index 216d1eea52..404801658c 100644 --- a/codex-rs/core/tests/suite/unified_exec.rs +++ b/codex-rs/core/tests/suite/unified_exec.rs @@ -585,7 +585,7 @@ async fn unified_exec_emits_begin_for_write_stdin() -> Result<()> { let open_call_id = "uexec-open-for-begin"; let open_args = json!({ - "cmd": "/bin/sh -c echo ready".to_string(), + "cmd": "bash -i".to_string(), "yield_time_ms": 200, }); @@ -651,7 +651,7 @@ async fn unified_exec_emits_begin_for_write_stdin() -> Result<()> { vec![ "/bin/bash".to_string(), "-lc".to_string(), - "/bin/sh -c echo ready".to_string() + "bash -i".to_string() ] ); assert_eq!( @@ -687,7 +687,7 @@ async fn unified_exec_emits_begin_event_for_write_stdin_requests() -> Result<()> let open_call_id = "uexec-open-session"; let open_args = json!({ - "cmd": "/bin/sh -c echo ready".to_string(), + "cmd": "bash -i".to_string(), "yield_time_ms": 250, }); @@ -767,7 +767,7 @@ async fn unified_exec_emits_begin_event_for_write_stdin_requests() -> Result<()> vec![ "/bin/bash".to_string(), "-lc".to_string(), - "/bin/sh -c echo ready".to_string() + "bash -i".to_string() ] ); assert!( @@ -785,7 +785,7 @@ async fn unified_exec_emits_begin_event_for_write_stdin_requests() -> Result<()> vec![ "/bin/bash".to_string(), "-lc".to_string(), - "/bin/sh -c echo ready".to_string() + "bash -i".to_string() ] ); assert!(