aboutsummaryrefslogtreecommitdiff
path: root/src/api/subscriptions.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/api/subscriptions.rs')
-rw-r--r--src/api/subscriptions.rs32
1 files changed, 31 insertions, 1 deletions
diff --git a/src/api/subscriptions.rs b/src/api/subscriptions.rs
index a6d8ff97..aaa7e5ac 100644
--- a/src/api/subscriptions.rs
+++ b/src/api/subscriptions.rs
@@ -50,9 +50,29 @@ pub(super) struct ActiveAgentStatusChangedSubscription {
status_filter: Option<crate::api::schema::AgentStatus>,
last_status: Option<crate::api::schema::AgentStatus>,
emit_initial_match: bool,
+ last_presentation: Option<PanePresentationSnapshot>,
request_prefix: String,
}
+#[derive(Debug, Clone, PartialEq, Eq)]
+struct PanePresentationSnapshot {
+ title: Option<String>,
+ display_agent: Option<String>,
+ custom_status: Option<String>,
+ state_labels: std::collections::HashMap<String, String>,
+}
+
+impl PanePresentationSnapshot {
+ fn from(pane: &crate::api::schema::PaneInfo) -> Self {
+ Self {
+ title: pane.title.clone(),
+ display_agent: pane.display_agent.clone(),
+ custom_status: pane.custom_status.clone(),
+ state_labels: pane.state_labels.clone(),
+ }
+ }
+}
+
pub(super) struct ActiveEventSubscription {
event_kind: crate::api::schema::EventKind,
last_sequence: u64,
@@ -187,6 +207,7 @@ impl ActiveSubscription {
status_filter: agent_status,
last_status: Some(probe.agent_status),
emit_initial_match,
+ last_presentation: Some(PanePresentationSnapshot::from(&probe)),
request_prefix: format!("{request_id}:sub:{index}"),
},
))
@@ -268,13 +289,19 @@ impl ActiveAgentStatusChangedSubscription {
)
.ok()?;
let current_status = pane.agent_status;
+ let current_presentation = PanePresentationSnapshot::from(&pane);
let previous_status = self.last_status.replace(current_status);
+ let previous_presentation = self.last_presentation.replace(current_presentation.clone());
+ let presentation_changed = previous_presentation
+ .as_ref()
+ .is_some_and(|previous| previous != &current_presentation);
+ let status_changed = previous_status.is_some_and(|previous| previous != current_status);
let should_emit = if self.emit_initial_match {
self.emit_initial_match = false;
self.status_filter
.is_some_and(|wanted| wanted == current_status)
} else {
- previous_status.is_some_and(|previous| previous != current_status)
+ (status_changed || presentation_changed)
&& !self
.status_filter
.is_some_and(|wanted| wanted != current_status)
@@ -290,7 +317,10 @@ impl ActiveAgentStatusChangedSubscription {
workspace_id: pane.workspace_id,
agent_status: current_status,
agent: pane.agent,
+ title: pane.title,
+ display_agent: pane.display_agent,
custom_status: pane.custom_status,
+ state_labels: pane.state_labels,
}),
})
}