From 32ff8b94d717f14117b6dd97e7bbf182a9598aea Mon Sep 17 00:00:00 2001 From: jif-oai Date: Thu, 2 Apr 2026 12:04:58 +0200 Subject: [PATCH] fix --- codex-rs/core/src/codex.rs | 3 +++ codex-rs/core/src/codex_tests.rs | 19 +++++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/codex-rs/core/src/codex.rs b/codex-rs/core/src/codex.rs index 92daa81681..57a0f71fe2 100644 --- a/codex-rs/core/src/codex.rs +++ b/codex-rs/core/src/codex.rs @@ -4035,6 +4035,9 @@ impl Session { let mut active = self.active_turn.lock().await; match active.as_mut() { Some(at) => { + if at.tasks.is_empty() { + return Err(input); + } let mut ts = at.turn_state.lock().await; for item in input { ts.push_pending_input(item); diff --git a/codex-rs/core/src/codex_tests.rs b/codex-rs/core/src/codex_tests.rs index 5f8ba2c96d..031ce86147 100644 --- a/codex-rs/core/src/codex_tests.rs +++ b/codex-rs/core/src/codex_tests.rs @@ -4783,6 +4783,25 @@ async fn queued_response_items_for_next_turn_move_into_next_active_turn() { assert_eq!(sess.get_pending_input().await, vec![queued_item]); } +#[tokio::test] +async fn inject_response_items_rejects_pending_turn_start_reservation() { + let (sess, _tc, _rx) = make_session_and_context_with_rx().await; + *sess.active_turn.lock().await = Some(ActiveTurn::default()); + let pending_item = ResponseInputItem::Message { + role: "user".to_string(), + content: vec![ContentItem::InputText { + text: "queued during turn-complete".to_string(), + }], + }; + + let err = sess + .inject_response_items(vec![pending_item.clone()]) + .await + .expect_err("empty active turn reservation should reject injected items"); + + assert_eq!(err, vec![pending_item]); +} + #[tokio::test] async fn on_task_finished_records_queue_only_mailbox_mail_without_restart() { let (sess, tc, _rx) = make_session_and_context_with_rx().await;