diff --git a/codex-rs/core/src/codex_delegate.rs b/codex-rs/core/src/codex_delegate.rs index c0fa0bf7..4cb4d4a0 100644 --- a/codex-rs/core/src/codex_delegate.rs +++ b/codex-rs/core/src/codex_delegate.rs @@ -158,6 +158,11 @@ async fn forward_events( ) { while let Ok(event) = codex.next_event().await { match event { + // ignore all legacy delta events + Event { + id: _, + msg: EventMsg::AgentMessageDelta(_) | EventMsg::AgentReasoningDelta(_), + } => continue, Event { id: _, msg: EventMsg::SessionConfigured(_), diff --git a/codex-rs/core/src/tasks/review.rs b/codex-rs/core/src/tasks/review.rs index e56b9bf7..57258f4c 100644 --- a/codex-rs/core/src/tasks/review.rs +++ b/codex-rs/core/src/tasks/review.rs @@ -10,8 +10,6 @@ use codex_protocol::protocol::Event; use codex_protocol::protocol::EventMsg; use codex_protocol::protocol::ExitedReviewModeEvent; use codex_protocol::protocol::ItemCompletedEvent; -use codex_protocol::protocol::ReasoningContentDeltaEvent; -use codex_protocol::protocol::ReasoningRawContentDeltaEvent; use codex_protocol::protocol::ReviewOutputEvent; use tokio_util::sync::CancellationToken; @@ -124,9 +122,7 @@ async fn process_review_events( .. }) | EventMsg::AgentMessageDelta(AgentMessageDeltaEvent { .. }) - | EventMsg::AgentMessageContentDelta(AgentMessageContentDeltaEvent { .. }) - | EventMsg::ReasoningContentDelta(ReasoningContentDeltaEvent { .. }) - | EventMsg::ReasoningRawContentDelta(ReasoningRawContentDeltaEvent { .. }) => {} + | EventMsg::AgentMessageContentDelta(AgentMessageContentDeltaEvent { .. }) => {} EventMsg::TaskComplete(task_complete) => { // Parse review output from the last agent message (if present). let out = task_complete diff --git a/codex-rs/core/tests/suite/codex_delegate.rs b/codex-rs/core/tests/suite/codex_delegate.rs index 82a7bd9a..c6ece7fe 100644 --- a/codex-rs/core/tests/suite/codex_delegate.rs +++ b/codex-rs/core/tests/suite/codex_delegate.rs @@ -8,6 +8,8 @@ use core_test_support::responses::ev_apply_patch_function_call; use core_test_support::responses::ev_assistant_message; use core_test_support::responses::ev_completed; use core_test_support::responses::ev_function_call; +use core_test_support::responses::ev_reasoning_item_added; +use core_test_support::responses::ev_reasoning_summary_text_delta; use core_test_support::responses::ev_response_created; use core_test_support::responses::mount_sse_sequence; use core_test_support::responses::sse; @@ -15,6 +17,7 @@ use core_test_support::responses::start_mock_server; use core_test_support::skip_if_no_network; use core_test_support::test_codex::test_codex; use core_test_support::wait_for_event; +use pretty_assertions::assert_eq; /// Delegate should surface ExecApprovalRequest from sub-agent and proceed /// after parent submits an approval decision. @@ -171,3 +174,52 @@ async fn codex_delegate_forwards_patch_approval_and_proceeds_on_decision() { .await; wait_for_event(&test.codex, |ev| matches!(ev, EventMsg::TaskComplete(_))).await; } + +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] +async fn codex_delegate_ignores_legacy_deltas() { + skip_if_no_network!(); + + // Single response with reasoning summary deltas. + let sse_stream = sse(vec![ + ev_response_created("resp-1"), + ev_reasoning_item_added("reason-1", &["initial"]), + ev_reasoning_summary_text_delta("think-1"), + ev_completed("resp-1"), + ]); + + let server = start_mock_server().await; + mount_sse_sequence(&server, vec![sse_stream]).await; + + let mut builder = test_codex(); + let test = builder.build(&server).await.expect("build test codex"); + + // Kick off review (delegated). + test.codex + .submit(Op::Review { + review_request: ReviewRequest { + prompt: "Please review".to_string(), + user_facing_hint: "review".to_string(), + }, + }) + .await + .expect("submit review"); + + let mut reasoning_delta_count = 0; + let mut legacy_reasoning_delta_count = 0; + + loop { + let ev = wait_for_event(&test.codex, |_| true).await; + match ev { + EventMsg::ReasoningContentDelta(_) => reasoning_delta_count += 1, + EventMsg::AgentReasoningDelta(_) => legacy_reasoning_delta_count += 1, + EventMsg::TaskComplete(_) => break, + _ => {} + } + } + + assert_eq!(reasoning_delta_count, 1, "expected one new reasoning delta"); + assert_eq!( + legacy_reasoning_delta_count, 1, + "expected one legacy reasoning delta" + ); +}