From 51d58c56d53047760a082e694b9c9452f8cc6b6a Mon Sep 17 00:00:00 2001 From: Eric Traut Date: Sat, 11 Apr 2026 09:02:05 -0700 Subject: [PATCH] Handle closed TUI input stream as shutdown (#17430) Addresses #17276 Problem: Closing the terminal while the TUI input stream is pending could leave the app outside the normal shutdown path, which is risky when an approval prompt is active. Solution: Treat a closed TUI input stream as ShutdownFirst so existing thread shutdown behavior cancels pending work and approvals before exit. --- codex-rs/tui/src/app.rs | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/codex-rs/tui/src/app.rs b/codex-rs/tui/src/app.rs index dd0827822..7dea884de 100644 --- a/codex-rs/tui/src/app.rs +++ b/codex-rs/tui/src/app.rs @@ -3940,10 +3940,15 @@ impl App { } AppRunControl::Continue } - Some(event) = tui_events.next() => { - match app.handle_tui_event(tui, &mut app_server, event).await { - Ok(control) => control, - Err(err) => break Err(err), + event = tui_events.next() => { + if let Some(event) = event { + match app.handle_tui_event(tui, &mut app_server, event).await { + Ok(control) => control, + Err(err) => break Err(err), + } + } else { + tracing::warn!("terminal input stream closed; shutting down active thread"); + app.handle_exit_mode(&mut app_server, ExitMode::ShutdownFirst).await } } app_server_event = app_server.next_event(), if listen_for_app_server_events => {