diff options
| author | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-05-26 21:52:19 +0300 |
|---|---|---|
| committer | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-05-26 21:53:50 +0300 |
| commit | 427c2606d8f62558e3949d2f44173175e96bed49 (patch) | |
| tree | 0d351c30c3132037beb75ea20c378d75e6b34c80 /src/app | |
| parent | 31e973502af205666cb4a48e3f9e10328f65cd4e (diff) | |
fix: deliver agent status subscriptions from event hub
Diffstat (limited to 'src/app')
| -rw-r--r-- | src/app/actions.rs | 24 | ||||
| -rw-r--r-- | src/app/api.rs | 19 |
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, |
