diff options
Diffstat (limited to 'src/api')
| -rw-r--r-- | src/api/mod.rs | 43 | ||||
| -rw-r--r-- | src/api/schema.rs | 58 |
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!( ¶ms.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, } ); } |
