From 4fe09d44341cb8dce171ad84f19ba1f78ac4da91 Mon Sep 17 00:00:00 2001 From: Charles Cunningham Date: Thu, 26 Feb 2026 17:28:15 -0800 Subject: [PATCH] tui: ignore live legacy agent messages while streaming --- codex-rs/tui/src/chatwidget.rs | 16 ++++------------ ...same_final_message_are_rendered_snapshot.snap | 2 +- codex-rs/tui/src/chatwidget/tests.rs | 1 - 3 files changed, 5 insertions(+), 14 deletions(-) diff --git a/codex-rs/tui/src/chatwidget.rs b/codex-rs/tui/src/chatwidget.rs index ae551a1fa0..3115a09afd 100644 --- a/codex-rs/tui/src/chatwidget.rs +++ b/codex-rs/tui/src/chatwidget.rs @@ -624,9 +624,6 @@ pub(crate) struct ChatWidget { // The bottom pane shows these above queued drafts until core records the // corresponding user message and emits the matching raw response item. pending_nudges: VecDeque, - // Number of legacy `EventMsg::AgentMessage` events to ignore because the - // corresponding `item.completed` already finalized the streamed message. - pending_suppressed_legacy_agent_messages: usize, /// Terminal-appropriate keybinding for popping the most-recently queued /// message back into the composer. Determined once at construction time via /// [`queued_message_edit_binding_for_terminal`] and propagated to @@ -1299,10 +1296,6 @@ impl ChatWidget { } fn on_agent_message(&mut self, message: String) { - if self.pending_suppressed_legacy_agent_messages > 0 { - self.pending_suppressed_legacy_agent_messages -= 1; - return; - } // If we have a stream_controller, then the final agent message is redundant and will be a // duplicate of what has already been streamed. if self.stream_controller.is_none() && !message.is_empty() { @@ -2363,7 +2356,6 @@ impl ChatWidget { /// phase for legacy models) clears the flag to preserve historical behavior. fn on_agent_message_item_completed(&mut self, item: AgentMessageItem) { if self.stream_controller.is_some() { - self.pending_suppressed_legacy_agent_messages += item.content.len(); self.flush_answer_stream_with_separator(); self.handle_stream_finished(); } @@ -2933,7 +2925,6 @@ impl ChatWidget { forked_from: None, queued_user_messages: VecDeque::new(), pending_nudges: VecDeque::new(), - pending_suppressed_legacy_agent_messages: 0, queued_message_edit_binding, show_welcome_banner: is_first_run, startup_tooltip_override, @@ -3118,7 +3109,6 @@ impl ChatWidget { plan_item_active: false, queued_user_messages: VecDeque::new(), pending_nudges: VecDeque::new(), - pending_suppressed_legacy_agent_messages: 0, queued_message_edit_binding, show_welcome_banner: is_first_run, startup_tooltip_override, @@ -3284,7 +3274,6 @@ impl ChatWidget { forked_from: None, queued_user_messages: VecDeque::new(), pending_nudges: VecDeque::new(), - pending_suppressed_legacy_agent_messages: 0, queued_message_edit_binding, show_welcome_banner: false, startup_tooltip_override: None, @@ -4438,9 +4427,12 @@ impl ChatWidget { match msg { EventMsg::SessionConfigured(e) => self.on_session_configured(e), EventMsg::ThreadNameUpdated(e) => self.on_thread_name_updated(e), - EventMsg::AgentMessage(AgentMessageEvent { message, .. }) => { + EventMsg::AgentMessage(AgentMessageEvent { message, .. }) + if from_replay || self.stream_controller.is_none() => + { self.on_agent_message(message) } + EventMsg::AgentMessage(AgentMessageEvent { .. }) => {} EventMsg::AgentMessageDelta(AgentMessageDeltaEvent { delta }) => { self.on_agent_message_delta(delta) } diff --git a/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__deltas_then_same_final_message_are_rendered_snapshot.snap b/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__deltas_then_same_final_message_are_rendered_snapshot.snap index 6062087181..e353cbef2c 100644 --- a/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__deltas_then_same_final_message_are_rendered_snapshot.snap +++ b/codex-rs/tui/src/chatwidget/snapshots/codex_tui__chatwidget__tests__deltas_then_same_final_message_are_rendered_snapshot.snap @@ -2,4 +2,4 @@ source: tui/src/chatwidget/tests.rs expression: combined --- -• Here is the result. + diff --git a/codex-rs/tui/src/chatwidget/tests.rs b/codex-rs/tui/src/chatwidget/tests.rs index 1ff4485013..7f71a3a105 100644 --- a/codex-rs/tui/src/chatwidget/tests.rs +++ b/codex-rs/tui/src/chatwidget/tests.rs @@ -1710,7 +1710,6 @@ async fn make_chatwidget_manual( startup_tooltip_override: None, queued_user_messages: VecDeque::new(), pending_nudges: VecDeque::new(), - pending_suppressed_legacy_agent_messages: 0, queued_message_edit_binding: crate::key_hint::alt(KeyCode::Up), suppress_session_configured_redraw: false, pending_notification: None,