From 6a1e215b615801f7eee24c97c1285030f8ccf01e Mon Sep 17 00:00:00 2001 From: Eric Traut Date: Mon, 16 Mar 2026 23:32:10 -0600 Subject: [PATCH 1/2] Skip duplicate legacy app-server events in TUI adapter --- .../src/app/app_server_adapter.rs | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/codex-rs/tui_app_server/src/app/app_server_adapter.rs b/codex-rs/tui_app_server/src/app/app_server_adapter.rs index 889c4720247..bc06620716c 100644 --- a/codex-rs/tui_app_server/src/app/app_server_adapter.rs +++ b/codex-rs/tui_app_server/src/app/app_server_adapter.rs @@ -116,6 +116,9 @@ impl App { AppServerEvent::LegacyNotification(notification) => { if let Some((thread_id, event)) = legacy_thread_event(notification.params) { self.pending_app_server_requests.note_legacy_event(&event); + if legacy_event_is_shadowed_by_server_notification(&event.msg) { + return; + } if self.primary_thread_id.is_none() || matches!(event.msg, EventMsg::SessionConfigured(_)) && self.primary_thread_id == Some(thread_id) @@ -198,6 +201,26 @@ fn legacy_thread_event(params: Option) -> Option<(ThreadId, Event)> { Some((thread_id, event)) } +fn legacy_event_is_shadowed_by_server_notification(msg: &EventMsg) -> bool { + matches!( + msg, + EventMsg::TokenCount(_) + | EventMsg::Error(_) + | EventMsg::ThreadNameUpdated(_) + | EventMsg::TurnStarted(_) + | EventMsg::TurnComplete(_) + | EventMsg::ItemStarted(_) + | EventMsg::ItemCompleted(_) + | EventMsg::AgentMessageDelta(_) + | EventMsg::PlanDelta(_) + | EventMsg::AgentReasoningDelta(_) + | EventMsg::AgentReasoningRawContentDelta(_) + | EventMsg::RealtimeConversationStarted(_) + | EventMsg::RealtimeConversationRealtime(_) + | EventMsg::RealtimeConversationClosed(_) + ) +} + fn server_notification_thread_events( notification: ServerNotification, ) -> Option<(ThreadId, Vec)> { From 1711265ba93b7675ecf1d4792ea01dd81b9c0acd Mon Sep 17 00:00:00 2001 From: Eric Traut Date: Tue, 17 Mar 2026 00:09:04 -0600 Subject: [PATCH 2/2] codex: address PR review feedback (#14892) --- .../tui_app_server/src/app/app_server_adapter.rs | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/codex-rs/tui_app_server/src/app/app_server_adapter.rs b/codex-rs/tui_app_server/src/app/app_server_adapter.rs index bc06620716c..d21542b8bf0 100644 --- a/codex-rs/tui_app_server/src/app/app_server_adapter.rs +++ b/codex-rs/tui_app_server/src/app/app_server_adapter.rs @@ -89,6 +89,17 @@ impl App { ); } notification => { + if !app_server_client.is_remote() + && matches!( + notification, + ServerNotification::TurnCompleted(_) + | ServerNotification::ThreadRealtimeItemAdded(_) + | ServerNotification::ThreadRealtimeOutputAudioDelta(_) + | ServerNotification::ThreadRealtimeError(_) + ) + { + return; + } if let Some((thread_id, events)) = server_notification_thread_events(notification) { @@ -208,7 +219,6 @@ fn legacy_event_is_shadowed_by_server_notification(msg: &EventMsg) -> bool { | EventMsg::Error(_) | EventMsg::ThreadNameUpdated(_) | EventMsg::TurnStarted(_) - | EventMsg::TurnComplete(_) | EventMsg::ItemStarted(_) | EventMsg::ItemCompleted(_) | EventMsg::AgentMessageDelta(_) @@ -216,7 +226,6 @@ fn legacy_event_is_shadowed_by_server_notification(msg: &EventMsg) -> bool { | EventMsg::AgentReasoningDelta(_) | EventMsg::AgentReasoningRawContentDelta(_) | EventMsg::RealtimeConversationStarted(_) - | EventMsg::RealtimeConversationRealtime(_) | EventMsg::RealtimeConversationClosed(_) ) }