aboutsummaryrefslogtreecommitdiff
path: root/src/app
diff options
context:
space:
mode:
authorOgulcan Celik <ogulcancelik@gmail.com>2026-05-26 21:52:19 +0300
committerOgulcan Celik <ogulcancelik@gmail.com>2026-05-26 21:53:50 +0300
commit427c2606d8f62558e3949d2f44173175e96bed49 (patch)
tree0d351c30c3132037beb75ea20c378d75e6b34c80 /src/app
parent31e973502af205666cb4a48e3f9e10328f65cd4e (diff)
fix: deliver agent status subscriptions from event hub
Diffstat (limited to 'src/app')
-rw-r--r--src/app/actions.rs24
-rw-r--r--src/app/api.rs19
2 files changed, 27 insertions, 16 deletions
diff --git a/src/app/actions.rs b/src/app/actions.rs
index 9b18eef7..3dd5562f 100644
--- a/src/app/actions.rs
+++ b/src/app/actions.rs
@@ -93,10 +93,12 @@ pub struct PaneStateUpdate {
pub previous_agent_label: Option<String>,
pub previous_known_agent: Option<Agent>,
pub previous_state: AgentState,
+ pub previous_seen: bool,
pub previous_presentation: crate::terminal::EffectivePresentation,
pub agent_label: Option<String>,
pub known_agent: Option<Agent>,
pub state: AgentState,
+ pub seen: bool,
pub presentation: crate::terminal::EffectivePresentation,
}
@@ -702,24 +704,27 @@ impl AppState {
pane_terminals
.into_iter()
.filter_map(|(ws_idx, pane_id, terminal_id)| {
+ let previous_seen = self.workspaces[ws_idx].pane_state(pane_id)?.seen;
let mutation = self
.terminals
.get_mut(&terminal_id)?
.expire_agent_metadata_at(scheduled_deadline, now)?;
let change = mutation.effective_state_change?;
+ let seen = self.apply_pane_state_change(ws_idx, pane_id, &change)?;
let update = PaneStateUpdate {
pane_id,
ws_idx,
previous_agent_label: change.previous_agent_label.clone(),
previous_known_agent: change.previous_known_agent,
previous_state: change.previous_state,
+ previous_seen,
previous_presentation: change.previous_presentation.clone(),
agent_label: change.agent_label.clone(),
known_agent: change.known_agent,
state: change.state,
+ seen,
presentation: change.presentation.clone(),
};
- self.apply_pane_state_change(ws_idx, pane_id, &change);
Some(update)
})
.collect()
@@ -2059,6 +2064,7 @@ impl AppState {
.pane_state(pane_id)?
.attached_terminal_id
.clone();
+ let previous_seen = self.workspaces[ws_idx].pane_state(pane_id)?.seen;
let mutation = {
let terminal = self.terminals.get_mut(&terminal_id)?;
update(terminal)?
@@ -2067,19 +2073,21 @@ impl AppState {
self.mark_session_dirty();
}
let change = mutation.effective_state_change?;
+ let seen = self.apply_pane_state_change(ws_idx, pane_id, &change)?;
let update = PaneStateUpdate {
pane_id,
ws_idx,
previous_agent_label: change.previous_agent_label.clone(),
previous_known_agent: change.previous_known_agent,
previous_state: change.previous_state,
+ previous_seen,
previous_presentation: change.previous_presentation.clone(),
agent_label: change.agent_label.clone(),
known_agent: change.known_agent,
state: change.state,
+ seen,
presentation: change.presentation.clone(),
};
- self.apply_pane_state_change(ws_idx, pane_id, &change);
Some(update)
}
@@ -2088,23 +2096,21 @@ impl AppState {
ws_idx: usize,
pane_id: PaneId,
change: &EffectiveStateChange,
- ) {
+ ) -> Option<bool> {
let is_active_tab = self.pane_is_in_active_tab(ws_idx, pane_id);
let suppress_active_tab_notifications =
active_tab_suppresses_notifications(is_active_tab, self.outer_terminal_focus);
- let Some(pane) = self.workspaces[ws_idx]
+ let pane = self.workspaces[ws_idx]
.tabs
.iter_mut()
- .find_map(|tab| tab.panes.get_mut(&pane_id))
- else {
- return;
- };
+ .find_map(|tab| tab.panes.get_mut(&pane_id))?;
if change.state != AgentState::Idle {
pane.seen = true;
} else if is_background_completion_transition(change.previous_state, change.state) {
pane.seen = suppress_active_tab_notifications;
}
+ let seen = pane.seen;
if self.local_sound_playback && self.sound.allows(change.known_agent) {
if let Some(sound) = notification_sound_for_state_change(
@@ -2145,6 +2151,8 @@ impl AppState {
});
}
}
+
+ Some(seen)
}
fn handle_pane_died(&mut self, pane_id: PaneId) {
diff --git a/src/app/api.rs b/src/app/api.rs
index 6319bdb6..a69dccec 100644
--- a/src/app/api.rs
+++ b/src/app/api.rs
@@ -227,16 +227,18 @@ impl App {
});
}
- if update.previous_state != update.state
+ let previous_agent_status = pane_agent_status(update.previous_state, update.previous_seen);
+ let agent_status = self
+ .state
+ .workspaces
+ .get(update.ws_idx)
+ .and_then(|ws| ws.pane_state(update.pane_id))
+ .map(|pane| pane_agent_status(update.state, pane.seen))
+ .unwrap_or_else(|| pane_agent_status(update.state, update.seen));
+
+ if previous_agent_status != agent_status
|| update.previous_presentation != update.presentation
{
- let agent_status = self
- .state
- .workspaces
- .get(update.ws_idx)
- .and_then(|ws| ws.pane_state(update.pane_id))
- .map(|pane| pane_agent_status(update.state, pane.seen))
- .unwrap_or_else(|| pane_agent_status(update.state, true));
let presentation = update.presentation.clone();
self.emit_event(crate::api::schema::EventEnvelope {
event: crate::api::schema::EventKind::PaneAgentStatusChanged,
@@ -244,6 +246,7 @@ impl App {
pane_id,
workspace_id,
agent_status,
+ agent: update.agent_label.clone(),
title: presentation.title,
display_agent: presentation.display_agent,
custom_status: presentation.custom_status,