diff --git a/crates/agent_ui/src/acp/thread_view/active_thread.rs b/crates/agent_ui/src/acp/thread_view/active_thread.rs index 9e1a175e1aabf30acca162944c20be1ff3b6c155..0abcfa3fcd53cf93798021e6b49a2a475ee44b34 100644 --- a/crates/agent_ui/src/acp/thread_view/active_thread.rs +++ b/crates/agent_ui/src/acp/thread_view/active_thread.rs @@ -1069,41 +1069,20 @@ impl ActiveThreadState { }; Some( - v_flex() - .w_full() - .p_2() - .gap_1() - .border_t_1() - .border_color(cx.theme().colors().border) - .bg(cx.theme().colors().surface_background) - .child( - h_flex() - .justify_between() - .child( - h_flex() - .gap_1() - .child( - Icon::new(IconName::Warning) - .size(IconSize::Small) - .color(Color::Warning), - ) - .child( - Label::new(title) - .size(LabelSize::Small) - .color(Color::Warning), - ), - ) - .child( - IconButton::new("dismiss-command-errors", IconName::Close) - .icon_size(IconSize::Small) - .icon_color(Color::Muted) - .tooltip(Tooltip::text("Dismiss")) - .on_click(cx.listener(|this, _, _, cx| { - this.clear_command_load_errors(cx); - })), - ), + Callout::new() + .icon(IconName::Warning) + .severity(Severity::Warning) + .title(title) + .actions_slot( + IconButton::new("dismiss-command-errors", IconName::Close) + .icon_size(IconSize::Small) + .icon_color(Color::Muted) + .tooltip(Tooltip::text("Dismiss Error")) + .on_click(cx.listener(|this, _, _, cx| { + this.clear_command_load_errors(cx); + })), ) - .children(errors.iter().enumerate().map({ + .description_slot(v_flex().children(errors.iter().enumerate().map({ move |(i, error)| { let path = error.path.clone(); let workspace = workspace.clone(); @@ -1112,20 +1091,19 @@ impl ActiveThreadState { .file_name() .map(|n| n.to_string_lossy().to_string()) .unwrap_or_else(|| error.path.display().to_string()); - - h_flex() - .id(ElementId::Name(format!("command-error-{i}").into())) - .gap_1() - .px_1() - .py_0p5() - .rounded_sm() - .cursor_pointer() - .hover(|style| style.bg(cx.theme().colors().element_hover)) - .tooltip(Tooltip::text(format!( - "Click to open {}\n\n{}", - error.path.display(), - error.message - ))) + let id = ElementId::Name(format!("command-error-{i}").into()); + let label = format!("— {}: {}", file_name, error.message); + + Button::new(id, label) + .label_size(LabelSize::Small) + .truncate(true) + .tooltip({ + let message: SharedString = error.message.clone().into(); + let path: SharedString = error.path.display().to_string().into(); + move |_, cx| { + Tooltip::with_meta(message.clone(), None, path.clone(), cx) + } + }) .on_click({ move |_, window, cx| { if let Some(workspace) = workspace.upgrade() { @@ -1142,13 +1120,8 @@ impl ActiveThreadState { } } }) - .child( - Label::new(format!("• {}: {}", file_name, error.message)) - .size(LabelSize::Small) - .color(Color::Muted), - ) } - })), + }))), ) } @@ -1184,6 +1157,7 @@ impl ActiveThreadState { Some( Callout::new() + .icon(IconName::Warning) .severity(Severity::Warning) .title(state.last_error.clone()) .description(retry_message),