aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkangal-bot <kangal@herdr.dev>2026-05-26 01:35:28 +0300
committerGitHub <noreply@github.com>2026-05-26 01:35:28 +0300
commit33e71ed2f50e5ca8950029f89f41e0ec135b87c0 (patch)
tree3ad30b911105d11c88ff1372da66aec61fe9fac5
parent1e0d95f05e77ff084fad1eceb61bafe66fa2e777 (diff)
fix: emit matching agent status subscriptions (#295)
refs #288 Co-authored-by: kangal-bot <kangal-bot@users.noreply.github.com>
-rw-r--r--src/api/subscriptions.rs22
-rw-r--r--tests/api_ping.rs17
2 files changed, 32 insertions, 7 deletions
diff --git a/src/api/subscriptions.rs b/src/api/subscriptions.rs
index c5c43e20..a6d8ff97 100644
--- a/src/api/subscriptions.rs
+++ b/src/api/subscriptions.rs
@@ -49,6 +49,7 @@ pub(super) struct ActiveAgentStatusChangedSubscription {
pane_id: String,
status_filter: Option<crate::api::schema::AgentStatus>,
last_status: Option<crate::api::schema::AgentStatus>,
+ emit_initial_match: bool,
request_prefix: String,
}
@@ -177,12 +178,15 @@ impl ActiveSubscription {
agent_status,
} => {
let probe = pane_get(format!("{request_id}:sub:{index}:probe"), &pane_id, api_tx)?;
+ let emit_initial_match =
+ agent_status.is_some_and(|wanted| wanted == probe.agent_status);
Ok(Self::AgentStatusChanged(
ActiveAgentStatusChangedSubscription {
pane_id,
status_filter: agent_status,
last_status: Some(probe.agent_status),
+ emit_initial_match,
request_prefix: format!("{request_id}:sub:{index}"),
},
))
@@ -265,13 +269,17 @@ impl ActiveAgentStatusChangedSubscription {
.ok()?;
let current_status = pane.agent_status;
let previous_status = self.last_status.replace(current_status);
- if previous_status.is_none() || previous_status == Some(current_status) {
- return None;
- }
- if self
- .status_filter
- .is_some_and(|wanted| wanted != 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)
+ && !self
+ .status_filter
+ .is_some_and(|wanted| wanted != current_status)
+ };
+ if !should_emit {
return None;
}
diff --git a/tests/api_ping.rs b/tests/api_ping.rs
index a124fb4a..a4d07360 100644
--- a/tests/api_ping.rs
+++ b/tests/api_ping.rs
@@ -1760,6 +1760,23 @@ fn pane_info_and_subscriptions_expose_done_agent_status() {
);
assert_eq!(pane["result"]["pane"]["agent_status"], "done");
+ let mut already_done_reader = open_subscription(
+ &socket_path,
+ &format!(
+ r#"{{"id":"sub_status_already_done","method":"events.subscribe","params":{{"subscriptions":[{{"type":"pane.agent_status_changed","pane_id":"{}","agent_status":"done"}}]}}}}"#,
+ background_pane_id,
+ ),
+ );
+ let ack = already_done_reader.read_json_line(Duration::from_secs(2));
+ assert_eq!(ack["id"], "sub_status_already_done");
+ assert_eq!(ack["result"]["type"], "subscription_started");
+
+ let initial_status_event = already_done_reader.read_json_line(Duration::from_secs(2));
+ assert_eq!(initial_status_event["event"], "pane.agent_status_changed");
+ assert_eq!(initial_status_event["data"]["pane_id"], background_pane_id);
+ assert_eq!(initial_status_event["data"]["agent_status"], "done");
+ assert_eq!(initial_status_event["data"]["agent"], "pi");
+
let focused_tab_id = created["result"]["workspace"]["active_tab_id"]
.as_str()
.unwrap()