Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 34 additions & 0 deletions codex-rs/tui/src/chatwidget/tests/app_server.rs
Original file line number Diff line number Diff line change
Expand Up @@ -636,6 +636,40 @@ async fn live_app_server_failed_turn_does_not_duplicate_error_history() {
assert!(!chat.bottom_pane.is_task_running());
}

#[tokio::test]
async fn live_app_server_failed_turn_consolidates_streamed_answer() {
let (mut chat, mut rx, _op_rx) = make_chatwidget_manual(/*model_override*/ None).await;

handle_turn_started(&mut chat, "turn-1");
while rx.try_recv().is_ok() {}

handle_agent_message_delta(&mut chat, "```diff\n+ streamed patch\n```\n");
chat.run_commit_tick();
while rx.try_recv().is_ok() {}

handle_error(
&mut chat,
"stream disconnected before completion",
/*codex_error_info*/ None,
);

let mut saw_consolidate = false;
while let Ok(event) = rx.try_recv() {
if let AppEvent::ConsolidateAgentMessage { source, .. } = event {
saw_consolidate = true;
assert!(
source.contains("streamed patch"),
"expected partial stream source to be consolidated, got {source:?}"
);
}
}

assert!(
saw_consolidate,
"failed turn should consolidate streamed cells before clearing the stream controller"
);
}

#[tokio::test]
async fn live_app_server_stream_recovery_restores_previous_status_header() {
let (mut chat, mut rx, _op_rx) = make_chatwidget_manual(/*model_override*/ None).await;
Expand Down
1 change: 1 addition & 0 deletions codex-rs/tui/src/chatwidget/turn_runtime.rs
Original file line number Diff line number Diff line change
Expand Up @@ -339,6 +339,7 @@ impl ChatWidget {

pub(super) fn on_error(&mut self, message: String) {
self.input_queue.submit_pending_steers_after_interrupt = false;
self.flush_answer_stream_with_separator();
self.finalize_turn();
self.add_to_history(history_cell::new_error_event(message));
self.set_ambient_pet_notification(
Expand Down
Loading