Suppress agent popup notification when status is already visible (#49044)

If you have Zed open and the sidebar open, don't show a notification
when a thread finishes.

Closes AI-18

(No release notes because multi-agent is still feature-flagged.)

Release Notes:

- N/A
This commit is contained in:
Richard Feldman authored and GitHub committed 2026-02-12 17:18:34 -05:00
1 parent 8f9d25ec12
commit abc65e8086
1 file changed
+29 -19
+29 -19
View File
@@ -2151,30 +2151,40 @@ impl AcpServerView {
self.show_notification(caption, icon, window, cx);
}
fn agent_is_visible(&self, window: &Window, cx: &App) -> bool {
if window.is_window_active() {
let workspace_is_foreground = window
.root::<MultiWorkspace>()
.flatten()
.and_then(|mw| {
let mw = mw.read(cx);
self.workspace.upgrade().map(|ws| mw.workspace() == &ws)
})
.unwrap_or(true);
fn agent_panel_visible(&self, multi_workspace: &Entity<MultiWorkspace>, cx: &App) -> bool {
let Some(workspace) = self.workspace.upgrade() else {
return false;
};
if workspace_is_foreground {
if let Some(workspace) = self.workspace.upgrade() {
return AgentPanel::is_visible(&workspace, cx);
}
}
multi_workspace.read(cx).workspace() == &workspace && AgentPanel::is_visible(&workspace, cx)
}
fn agent_status_visible(&self, window: &Window, cx: &App) -> bool {
if !window.is_window_active() {
return false;
}
false
if let Some(multi_workspace) = window.root::<MultiWorkspace>().flatten() {
multi_workspace.read(cx).is_sidebar_open()
|| self.agent_panel_visible(&multi_workspace, cx)
} else {
self.workspace
.upgrade()
.is_some_and(|workspace| AgentPanel::is_visible(&workspace, cx))
}
}
fn play_notification_sound(&self, window: &Window, cx: &mut App) {
let settings = AgentSettings::get_global(cx);
if settings.play_sound_when_agent_done && !self.agent_is_visible(window, cx) {
let visible = window.is_window_active()
&& if let Some(mw) = window.root::<MultiWorkspace>().flatten() {
self.agent_panel_visible(&mw, cx)
} else {
self.workspace
.upgrade()
.is_some_and(|workspace| AgentPanel::is_visible(&workspace, cx))
};
if settings.play_sound_when_agent_done && !visible {
Audio::play_sound(Sound::AgentDone, cx);
}
}
@@ -2192,7 +2202,7 @@ impl AcpServerView {
let settings = AgentSettings::get_global(cx);
let should_notify = !self.agent_is_visible(window, cx);
let should_notify = !self.agent_status_visible(window, cx);
if !should_notify {
return;
@@ -2296,7 +2306,7 @@ impl AcpServerView {
let pop_up_weak = pop_up.downgrade();
cx.observe_window_activation(window, move |this, window, cx| {
if this.agent_is_visible(window, cx)
if this.agent_status_visible(window, cx)
&& let Some(pop_up) = pop_up_weak.upgrade()
{
pop_up.update(cx, |notification, cx| {