From 4276ff1bea8d29d938e27afe09a484327daac776 Mon Sep 17 00:00:00 2001 From: Charles Cunningham Date: Mon, 2 Mar 2026 23:03:44 -0800 Subject: [PATCH] tui: preserve pending steer metadata on commit --- codex-rs/tui/src/chatwidget.rs | 25 +++++++++++++++++------- codex-rs/tui/src/chatwidget/tests.rs | 29 +++++++++++++++++++++++++--- 2 files changed, 44 insertions(+), 10 deletions(-) diff --git a/codex-rs/tui/src/chatwidget.rs b/codex-rs/tui/src/chatwidget.rs index f789c21474..a519237e40 100644 --- a/codex-rs/tui/src/chatwidget.rs +++ b/codex-rs/tui/src/chatwidget.rs @@ -4660,18 +4660,29 @@ impl ChatWidget { }; let rendered = Self::rendered_user_message_event_from_event(&event); let compare_key = Self::pending_steer_compare_key_from_item(item); - let should_render = if self + if self .pending_steers .front() .is_some_and(|pending| pending.compare_key == compare_key) { - self.pending_steers.pop_front(); + let pending = self + .pending_steers + .pop_front() + .expect("checked front pending steer"); self.refresh_pending_input_preview(); - true - } else { - self.last_rendered_user_message_event.as_ref() != Some(&rendered) - }; - if should_render { + let pending_event = UserMessageEvent { + message: pending.user_message.text, + images: Some(pending.user_message.remote_image_urls), + local_images: pending + .user_message + .local_images + .into_iter() + .map(|image| image.path) + .collect(), + text_elements: pending.user_message.text_elements, + }; + self.on_user_message_event(pending_event); + } else if self.last_rendered_user_message_event.as_ref() != Some(&rendered) { self.on_user_message_event(event); } } diff --git a/codex-rs/tui/src/chatwidget/tests.rs b/codex-rs/tui/src/chatwidget/tests.rs index e4b97c52bb..7f4e05ea58 100644 --- a/codex-rs/tui/src/chatwidget/tests.rs +++ b/codex-rs/tui/src/chatwidget/tests.rs @@ -3927,9 +3927,32 @@ async fn item_completed_pops_pending_steer_with_local_image_and_text_elements() ); assert!(chat.pending_steers.is_empty()); - let inserted = drain_insert_history(&mut rx); - assert_eq!(inserted.len(), 1); - assert!(lines_to_single_string(&inserted[0]).contains("note")); + + let mut user_cell = None; + while let Ok(ev) = rx.try_recv() { + if let AppEvent::InsertHistoryCell(cell) = ev + && let Some(cell) = cell.as_any().downcast_ref::() + { + user_cell = Some(( + cell.message.clone(), + cell.text_elements.clone(), + cell.local_image_paths.clone(), + cell.remote_image_urls.clone(), + )); + break; + } + } + + let (stored_message, stored_elements, stored_images, stored_remote_image_urls) = + user_cell.expect("expected pending steer user history cell"); + assert_eq!(stored_message, "note"); + assert_eq!( + stored_elements, + vec![TextElement::new((0..4).into(), Some("note".to_string()))] + ); + assert_eq!(stored_images.len(), 1); + assert!(stored_images[0].ends_with("pending-steer.png")); + assert!(stored_remote_image_urls.is_empty()); } #[tokio::test]