aboutsummaryrefslogtreecommitdiff
path: root/src/api
diff options
context:
space:
mode:
authorOgulcan Celik <ogulcancelik@gmail.com>2026-04-09 03:31:37 +0300
committerOgulcan Celik <ogulcancelik@gmail.com>2026-04-09 03:31:37 +0300
commita3ecb4e3b4151e840ad237e073d8282e1181c34a (patch)
tree12c6924cc65c2b9c5da45df2e3a2fde188f07681 /src/api
parent05a6d89e33e722376688c679ab0d7322014814a1 (diff)
feat(api): expose done as agent status
Diffstat (limited to 'src/api')
-rw-r--r--src/api/mod.rs43
-rw-r--r--src/api/schema.rs58
2 files changed, 57 insertions, 44 deletions
diff --git a/src/api/mod.rs b/src/api/mod.rs
index 28a80602..1b81e09c 100644
--- a/src/api/mod.rs
+++ b/src/api/mod.rs
@@ -15,7 +15,7 @@ use regex::Regex;
use tokio::sync::mpsc;
use crate::api::schema::{
- ErrorBody, ErrorResponse, Method, PaneAgentStateChangedEvent, PaneOutputMatchedEvent, Request,
+ ErrorBody, ErrorResponse, Method, PaneAgentStatusChangedEvent, PaneOutputMatchedEvent, Request,
ResponseResult, Subscription, SubscriptionEventData, SubscriptionEventEnvelope,
SubscriptionEventKind, SuccessResponse,
};
@@ -553,10 +553,10 @@ struct ActiveOutputMatchedSubscription {
request_prefix: String,
}
-struct ActiveAgentStateChangedSubscription {
+struct ActiveAgentStatusChangedSubscription {
pane_id: String,
- state_filter: Option<crate::api::schema::PaneAgentState>,
- last_state: Option<crate::api::schema::PaneAgentState>,
+ status_filter: Option<crate::api::schema::AgentStatus>,
+ last_status: Option<crate::api::schema::AgentStatus>,
request_prefix: String,
}
@@ -568,7 +568,7 @@ struct ActiveEventSubscription {
enum ActiveSubscription {
Event(ActiveEventSubscription),
OutputMatched(ActiveOutputMatchedSubscription),
- AgentStateChanged(ActiveAgentStateChangedSubscription),
+ AgentStatusChanged(ActiveAgentStatusChangedSubscription),
}
impl ActiveSubscription {
@@ -674,18 +674,21 @@ impl ActiveSubscription {
request_prefix: format!("{request_id}:sub:{index}"),
}))
}
- Subscription::PaneAgentStateChanged { pane_id, state } => {
+ Subscription::PaneAgentStatusChanged {
+ pane_id,
+ agent_status,
+ } => {
let probe =
match pane_get(format!("{request_id}:sub:{index}:probe"), &pane_id, api_tx) {
Ok(probe) => probe,
Err(error) => return Err(error),
};
- Ok(Self::AgentStateChanged(
- ActiveAgentStateChangedSubscription {
+ Ok(Self::AgentStatusChanged(
+ ActiveAgentStatusChangedSubscription {
pane_id,
- state_filter: state,
- last_state: Some(probe.agent_state),
+ status_filter: agent_status,
+ last_status: Some(probe.agent_status),
request_prefix: format!("{request_id}:sub:{index}"),
},
))
@@ -703,7 +706,7 @@ impl ActiveSubscription {
Self::OutputMatched(subscription) => {
serde_json::to_value(subscription.poll(api_tx)?).ok()
}
- Self::AgentStateChanged(subscription) => {
+ Self::AgentStatusChanged(subscription) => {
serde_json::to_value(subscription.poll(api_tx)?).ok()
}
}
@@ -758,7 +761,7 @@ impl ActiveOutputMatchedSubscription {
}
}
-impl ActiveAgentStateChangedSubscription {
+impl ActiveAgentStatusChangedSubscription {
fn poll(&mut self, api_tx: &ApiRequestSender) -> Option<SubscriptionEventEnvelope> {
let pane = pane_get(
format!("{}:pane", self.request_prefix),
@@ -766,24 +769,24 @@ impl ActiveAgentStateChangedSubscription {
api_tx,
)
.ok()?;
- let current_state = pane.agent_state;
- let previous_state = self.last_state.replace(current_state);
- if previous_state.is_none() || previous_state == Some(current_state) {
+ 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
- .state_filter
- .is_some_and(|wanted| wanted != current_state)
+ .status_filter
+ .is_some_and(|wanted| wanted != current_status)
{
return None;
}
Some(SubscriptionEventEnvelope {
- event: SubscriptionEventKind::PaneAgentStateChanged,
- data: SubscriptionEventData::PaneAgentStateChanged(PaneAgentStateChangedEvent {
+ event: SubscriptionEventKind::PaneAgentStatusChanged,
+ data: SubscriptionEventData::PaneAgentStatusChanged(PaneAgentStatusChangedEvent {
pane_id: pane.pane_id,
workspace_id: pane.workspace_id,
- state: current_state,
+ agent_status: current_status,
agent: pane.agent,
}),
})
diff --git a/src/api/schema.rs b/src/api/schema.rs
index 063663fa..568a276b 100644
--- a/src/api/schema.rs
+++ b/src/api/schema.rs
@@ -253,11 +253,11 @@ pub enum Subscription {
#[serde(default = "default_true")]
strip_ansi: bool,
},
- #[serde(rename = "pane.agent_state_changed")]
- PaneAgentStateChanged {
+ #[serde(rename = "pane.agent_status_changed")]
+ PaneAgentStatusChanged {
pane_id: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
- state: Option<PaneAgentState>,
+ agent_status: Option<AgentStatus>,
},
}
@@ -348,9 +348,9 @@ pub enum EventMatch {
#[serde(default, skip_serializing_if = "Option::is_none")]
agent: Option<String>,
},
- PaneAgentStateChanged {
+ PaneAgentStatusChanged {
pane_id: String,
- state: PaneAgentState,
+ agent_status: AgentStatus,
},
}
@@ -371,7 +371,7 @@ pub enum EventKind {
PaneOutputChanged,
PaneExited,
PaneAgentDetected,
- PaneAgentStateChanged,
+ PaneAgentStatusChanged,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
@@ -441,7 +441,7 @@ pub struct WorkspaceInfo {
pub pane_count: usize,
pub tab_count: usize,
pub active_tab_id: String,
- pub agent_state: PaneAgentState,
+ pub agent_status: AgentStatus,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
@@ -452,7 +452,7 @@ pub struct TabInfo {
pub label: String,
pub focused: bool,
pub pane_count: usize,
- pub agent_state: PaneAgentState,
+ pub agent_status: AgentStatus,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
@@ -465,7 +465,7 @@ pub struct PaneInfo {
pub cwd: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub agent: Option<String>,
- pub agent_state: PaneAgentState,
+ pub agent_status: AgentStatus,
pub revision: u64,
}
@@ -490,8 +490,8 @@ pub struct EventEnvelope {
pub enum SubscriptionEventKind {
#[serde(rename = "pane.output_matched")]
PaneOutputMatched,
- #[serde(rename = "pane.agent_state_changed")]
- PaneAgentStateChanged,
+ #[serde(rename = "pane.agent_status_changed")]
+ PaneAgentStatusChanged,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
@@ -504,7 +504,7 @@ pub struct SubscriptionEventEnvelope {
#[serde(untagged)]
pub enum SubscriptionEventData {
PaneOutputMatched(PaneOutputMatchedEvent),
- PaneAgentStateChanged(PaneAgentStateChangedEvent),
+ PaneAgentStatusChanged(PaneAgentStatusChangedEvent),
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
@@ -515,10 +515,10 @@ pub struct PaneOutputMatchedEvent {
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
-pub struct PaneAgentStateChangedEvent {
+pub struct PaneAgentStatusChangedEvent {
pub pane_id: String,
pub workspace_id: String,
- pub state: PaneAgentState,
+ pub agent_status: AgentStatus,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub agent: Option<String>,
}
@@ -581,10 +581,10 @@ pub enum EventData {
#[serde(default, skip_serializing_if = "Option::is_none")]
agent: Option<String>,
},
- PaneAgentStateChanged {
+ PaneAgentStatusChanged {
pane_id: String,
workspace_id: String,
- state: PaneAgentState,
+ agent_status: AgentStatus,
},
}
@@ -597,6 +597,16 @@ pub enum PaneAgentState {
Unknown,
}
+#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
+#[serde(rename_all = "snake_case")]
+pub enum AgentStatus {
+ Idle,
+ Working,
+ Blocked,
+ Done,
+ Unknown,
+}
+
fn default_true() -> bool {
true
}
@@ -777,9 +787,9 @@ mod tests {
"match": { "type": "substring", "value": "auth: received" }
},
{
- "type": "pane.agent_state_changed",
+ "type": "pane.agent_status_changed",
"pane_id": "p_1_1",
- "state": "blocked"
+ "agent_status": "done"
}
]
}
@@ -803,9 +813,9 @@ mod tests {
));
assert!(matches!(
&params.subscriptions[1],
- Subscription::PaneAgentStateChanged {
+ Subscription::PaneAgentStatusChanged {
pane_id,
- state: Some(PaneAgentState::Blocked),
+ agent_status: Some(AgentStatus::Done),
} if pane_id == "p_1_1"
));
}
@@ -872,9 +882,9 @@ mod tests {
"method": "events.wait",
"params": {
"match_event": {
- "event": "pane_agent_state_changed",
+ "event": "pane_agent_status_changed",
"pane_id": "p_1",
- "state": "blocked"
+ "agent_status": "done"
},
"timeout_ms": 30000
}
@@ -887,9 +897,9 @@ mod tests {
};
assert_eq!(
params.match_event,
- EventMatch::PaneAgentStateChanged {
+ EventMatch::PaneAgentStatusChanged {
pane_id: "p_1".into(),
- state: PaneAgentState::Blocked,
+ agent_status: AgentStatus::Done,
}
);
}