From cdb967c5ed1ebd6c4b6f9963e29560950b6449a4 Mon Sep 17 00:00:00 2001 From: jif-oai Date: Mon, 16 Mar 2026 16:15:35 +0000 Subject: [PATCH 1/2] fix: tui freeze when sub-agents are present --- .../app-server/src/codex_message_processor.rs | 4 ++++ codex-rs/app-server/src/in_process.rs | 1 + codex-rs/app-server/src/message_processor.rs | 6 +++++ codex-rs/app-server/src/thread_state.rs | 23 +++++++++++++++++++ 4 files changed, 34 insertions(+) diff --git a/codex-rs/app-server/src/codex_message_processor.rs b/codex-rs/app-server/src/codex_message_processor.rs index 716559e94cb..d897350bfe9 100644 --- a/codex-rs/app-server/src/codex_message_processor.rs +++ b/codex-rs/app-server/src/codex_message_processor.rs @@ -1921,6 +1921,10 @@ impl CodexMessageProcessor { } } + pub(crate) async fn clear_all_thread_listeners(&self) { + self.thread_state_manager.clear_all_listeners().await; + } + pub(crate) async fn shutdown_threads(&self) { let report = self .thread_manager diff --git a/codex-rs/app-server/src/in_process.rs b/codex-rs/app-server/src/in_process.rs index 3a9286a5f47..3df671d3dcb 100644 --- a/codex-rs/app-server/src/in_process.rs +++ b/codex-rs/app-server/src/in_process.rs @@ -484,6 +484,7 @@ fn start_uninitialized(args: InProcessStartArgs) -> InProcessClientHandle { } processor.clear_runtime_references(); + processor.clear_all_thread_listeners().await; processor.drain_background_tasks().await; processor.shutdown_threads().await; processor.connection_closed(IN_PROCESS_CONNECTION_ID).await; diff --git a/codex-rs/app-server/src/message_processor.rs b/codex-rs/app-server/src/message_processor.rs index e16e2e693e3..5eda1edeb08 100644 --- a/codex-rs/app-server/src/message_processor.rs +++ b/codex-rs/app-server/src/message_processor.rs @@ -456,6 +456,12 @@ impl MessageProcessor { self.codex_message_processor.drain_background_tasks().await; } + pub(crate) async fn clear_all_thread_listeners(&self) { + self.codex_message_processor + .clear_all_thread_listeners() + .await; + } + pub(crate) async fn shutdown_threads(&self) { self.codex_message_processor.shutdown_threads().await; } diff --git a/codex-rs/app-server/src/thread_state.rs b/codex-rs/app-server/src/thread_state.rs index 5176fe13334..a875a9149d6 100644 --- a/codex-rs/app-server/src/thread_state.rs +++ b/codex-rs/app-server/src/thread_state.rs @@ -196,6 +196,29 @@ impl ThreadStateManager { } } + pub(crate) async fn clear_all_listeners(&self) { + let thread_states = { + let state = self.state.lock().await; + state + .threads + .iter() + .map(|(thread_id, thread_entry)| (*thread_id, thread_entry.state.clone())) + .collect::>() + }; + + for (thread_id, thread_state) in thread_states { + let mut thread_state = thread_state.lock().await; + tracing::debug!( + thread_id = %thread_id, + listener_generation = thread_state.listener_generation, + had_listener = thread_state.cancel_tx.is_some(), + had_active_turn = thread_state.active_turn_snapshot().is_some(), + "clearing thread listener during app-server shutdown" + ); + thread_state.clear_listener(); + } + } + pub(crate) async fn unsubscribe_connection_from_thread( &self, thread_id: ThreadId, From d22e1dcc959b46068e17f82d154eb8861be5d7ce Mon Sep 17 00:00:00 2001 From: jif-oai Date: Mon, 16 Mar 2026 16:29:27 +0000 Subject: [PATCH 2/2] nit --- codex-rs/app-server/src/in_process.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/codex-rs/app-server/src/in_process.rs b/codex-rs/app-server/src/in_process.rs index 3df671d3dcb..286210e6e92 100644 --- a/codex-rs/app-server/src/in_process.rs +++ b/codex-rs/app-server/src/in_process.rs @@ -484,10 +484,10 @@ fn start_uninitialized(args: InProcessStartArgs) -> InProcessClientHandle { } processor.clear_runtime_references(); + processor.connection_closed(IN_PROCESS_CONNECTION_ID).await; processor.clear_all_thread_listeners().await; processor.drain_background_tasks().await; processor.shutdown_threads().await; - processor.connection_closed(IN_PROCESS_CONNECTION_ID).await; }); let mut pending_request_responses = HashMap::>::new();