agent_ui: Fix preview for images and creases in queue entries (#46964)

Danilo Leal created

This PR fixes the fact that we weren't showing any @-mentions (files,
images, etc.) in the queue preview.

Release Notes:

- Agent: FIxed a bug with the message queue in the agent panel where
@-mentions weren't being displayed in the message preview within the
queue entries list.

Change summary

crates/agent_ui/src/acp/thread_view.rs | 35 ++++++++++++++++++++++++---
1 file changed, 31 insertions(+), 4 deletions(-)

Detailed changes

crates/agent_ui/src/acp/thread_view.rs 🔗

@@ -5836,16 +5836,43 @@ impl AcpThreadView {
                         let icon_color = if is_next { Color::Accent } else { Color::Muted };
                         let queue_len = self.message_queue.len();
 
-                        let preview = queued
+                        let preview: String = queued
                             .content
                             .iter()
-                            .find_map(|block| match block {
+                            .filter_map(|block| match block {
                                 acp::ContentBlock::Text(text) => {
-                                    text.text.lines().next().map(str::to_owned)
+                                    let first_line = text.text.lines().next()?;
+                                    if first_line.is_empty() {
+                                        None
+                                    } else {
+                                        Some(first_line.to_owned())
+                                    }
+                                }
+                                acp::ContentBlock::Image(_) => Some("@Image".to_owned()),
+                                acp::ContentBlock::Audio(_) => Some("@Audio".to_owned()),
+                                acp::ContentBlock::ResourceLink(link) => {
+                                    let name = link.uri.rsplit('/').next().unwrap_or(&link.uri);
+                                    Some(format!("@{}", name))
+                                }
+                                acp::ContentBlock::Resource(resource) => {
+                                    let uri = match &resource.resource {
+                                        acp::EmbeddedResourceResource::TextResourceContents(r) => {
+                                            Some(&r.uri)
+                                        }
+                                        acp::EmbeddedResourceResource::BlobResourceContents(r) => {
+                                            Some(&r.uri)
+                                        }
+                                        _ => None,
+                                    };
+                                    uri.map(|uri| {
+                                        let name = uri.rsplit('/').next().unwrap_or(uri);
+                                        format!("@{}", name)
+                                    })
                                 }
                                 _ => None,
                             })
-                            .unwrap_or_default();
+                            .collect::<Vec<_>>()
+                            .join("");
 
                         h_flex()
                             .group("queue_entry")