Compare commits

...

2 Commits

Author SHA1 Message Date
Anton Panasenko
8a7ec74019 [codex] check if write cycle is active for stream on agent message 2025-09-09 12:18:34 -07:00
Anton Panasenko
d5d5eab64c [codex] test to catch double message 2025-09-09 11:37:53 -07:00
2 changed files with 50 additions and 0 deletions

View File

@@ -184,6 +184,9 @@ impl ChatWidget {
}
fn on_agent_message(&mut self, message: String) {
if !self.stream.is_write_cycle_active() {
return;
}
let sink = AppEventHistorySink(self.app_event_tx.clone());
let finished = self.stream.apply_final_answer(&message, &sink);
self.handle_if_stream_finished(finished);

View File

@@ -1547,6 +1547,53 @@ fn multiple_agent_messages_in_single_turn_emit_multiple_headers() {
assert!(first_idx < second_idx, "messages out of order: {combined}");
}
#[test]
fn final_message_not_duplicated_when_task_complete_precedes_final_message() {
let (mut chat, mut rx, _op_rx) = make_chatwidget_manual();
chat.handle_codex_event(Event {
id: "s1".into(),
msg: EventMsg::AgentMessageDelta(AgentMessageDeltaEvent {
delta: "Hello".into(),
}),
});
chat.handle_codex_event(Event {
id: "s1".into(),
msg: EventMsg::AgentMessageDelta(AgentMessageDeltaEvent {
delta: " world".into(),
}),
});
chat.handle_codex_event(Event {
id: "s1".into(),
msg: EventMsg::TaskComplete(TaskCompleteEvent {
last_agent_message: Some("Hello world".into()),
}),
});
let mut cells = drain_insert_history(&mut rx);
chat.handle_codex_event(Event {
id: "s1".into(),
msg: EventMsg::AgentMessage(AgentMessageEvent {
message: "Hello world".into(),
}),
});
cells.extend(drain_insert_history(&mut rx));
let matching_cells = cells
.iter()
.filter(|lines| lines_to_single_string(lines).contains("Hello world"))
.count();
assert_eq!(
matching_cells, 1,
"expected the final agent message to be rendered once when TaskComplete arrives before AgentMessage, got transcript: {:?}",
cells
);
}
#[test]
fn final_reasoning_then_message_without_deltas_are_rendered() {
let (mut chat, mut rx, _op_rx) = make_chatwidget_manual();