diff options
Diffstat (limited to 'src/api')
| -rw-r--r-- | src/api/mod.rs | 1 | ||||
| -rw-r--r-- | src/api/schema.rs | 87 | ||||
| -rw-r--r-- | src/api/server.rs | 3 |
3 files changed, 91 insertions, 0 deletions
diff --git a/src/api/mod.rs b/src/api/mod.rs index c168313b..a9a8e25b 100644 --- a/src/api/mod.rs +++ b/src/api/mod.rs @@ -22,6 +22,7 @@ pub(crate) fn request_changes_ui(request: &Request) -> bool { matches!( &request.method, Method::ServerReloadConfig(_) + | Method::ServerReloadAgentManifests(_) | Method::NotificationShow(_) | Method::WorkspaceCreate(_) | Method::WorkspaceFocus(_) diff --git a/src/api/schema.rs b/src/api/schema.rs index 33040248..0eb2d8e2 100644 --- a/src/api/schema.rs +++ b/src/api/schema.rs @@ -6,6 +6,10 @@ pub mod panes; pub use panes::*; +fn is_false(value: &bool) -> bool { + !*value +} + #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] pub struct Request { pub id: String, @@ -24,6 +28,10 @@ pub enum Method { ServerLiveHandoff(ServerLiveHandoffParams), #[serde(rename = "server.reload_config")] ServerReloadConfig(EmptyParams), + #[serde(rename = "server.agent_manifests")] + ServerAgentManifests(EmptyParams), + #[serde(rename = "server.reload_agent_manifests")] + ServerReloadAgentManifests(EmptyParams), #[serde(rename = "notification.show")] NotificationShow(NotificationShowParams), #[serde(rename = "workspace.create")] @@ -64,6 +72,8 @@ pub enum Method { AgentGet(AgentTarget), #[serde(rename = "agent.read")] AgentRead(AgentReadParams), + #[serde(rename = "agent.explain")] + AgentExplain(AgentTarget), #[serde(rename = "agent.send")] AgentSend(AgentSendParams), #[serde(rename = "agent.rename")] @@ -342,6 +352,7 @@ pub enum ReadSource { Visible, Recent, RecentUnwrapped, + Detection, } #[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default)] @@ -665,6 +676,9 @@ pub enum ResponseResult { PaneRead { read: PaneReadResult, }, + AgentExplain { + explain: serde_json::Value, + }, SubscriptionStarted {}, WaitMatched { event: EventEnvelope, @@ -687,6 +701,16 @@ pub enum ResponseResult { target: IntegrationTarget, details: IntegrationUninstallResult, }, + AgentManifestReload { + manifests: Vec<AgentManifestInfo>, + }, + AgentManifestStatus { + #[serde(default, skip_serializing_if = "Option::is_none")] + last_check_unix: Option<u64>, + #[serde(default, skip_serializing_if = "Option::is_none")] + last_result: Option<String>, + manifests: Vec<AgentManifestInfo>, + }, ConfigReload { status: crate::config::ConfigReloadStatus, diagnostics: Vec<String>, @@ -695,6 +719,26 @@ pub enum ResponseResult { } #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +pub struct AgentManifestInfo { + pub agent: String, + pub source: String, + pub source_kind: String, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub active_version: Option<String>, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub cached_remote_version: Option<String>, + pub local_override_shadowing_remote: bool, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub remote_update_result: Option<String>, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub remote_update_error: Option<String>, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub remote_last_checked_unix: Option<u64>, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub warning: Option<String>, +} + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] pub struct WorkspaceInfo { pub workspace_id: String, pub number: usize, @@ -764,6 +808,8 @@ pub struct AgentInfo { #[serde(default, skip_serializing_if = "Option::is_none")] pub display_agent: Option<String>, pub agent_status: AgentStatus, + #[serde(default, skip_serializing_if = "is_false")] + pub screen_detection_skipped: bool, #[serde(default, skip_serializing_if = "Option::is_none")] pub custom_status: Option<String>, #[serde(default, skip_serializing_if = "HashMap::is_empty")] @@ -1116,6 +1162,47 @@ mod tests { } #[test] + fn request_round_trips_for_server_reload_agent_manifests() { + let request = Request { + id: "req_reload_agent_manifests".into(), + method: Method::ServerReloadAgentManifests(EmptyParams::default()), + }; + + let json = serde_json::to_value(&request).unwrap(); + assert_eq!(json["method"], "server.reload_agent_manifests"); + let restored: Request = serde_json::from_value(json).unwrap(); + assert_eq!(restored, request); + } + + #[test] + fn request_round_trips_for_server_agent_manifests() { + let request = Request { + id: "req_agent_manifests".into(), + method: Method::ServerAgentManifests(EmptyParams::default()), + }; + + let json = serde_json::to_value(&request).unwrap(); + assert_eq!(json["method"], "server.agent_manifests"); + let restored: Request = serde_json::from_value(json).unwrap(); + assert_eq!(restored, request); + } + + #[test] + fn request_round_trips_for_agent_explain() { + let request = Request { + id: "req_agent_explain".into(), + method: Method::AgentExplain(AgentTarget { + target: "agent-1".into(), + }), + }; + + let json = serde_json::to_value(&request).unwrap(); + assert_eq!(json["method"], "agent.explain"); + let restored: Request = serde_json::from_value(json).unwrap(); + assert_eq!(restored, request); + } + + #[test] fn notification_show_request_parses() { let json = r#"{"id":"req_1","method":"notification.show","params":{"title":"build failed","body":"api workspace","position":"top-left","sound":"request"}}"#; let request: Request = serde_json::from_str(json).unwrap(); diff --git a/src/api/server.rs b/src/api/server.rs index 94e8c725..0d49d21d 100644 --- a/src/api/server.rs +++ b/src/api/server.rs @@ -276,6 +276,8 @@ fn api_method_name(method: &Method) -> &'static str { Method::ServerStop(_) => "server.stop", Method::ServerLiveHandoff(_) => "server.live_handoff", Method::ServerReloadConfig(_) => "server.reload_config", + Method::ServerAgentManifests(_) => "server.agent_manifests", + Method::ServerReloadAgentManifests(_) => "server.reload_agent_manifests", Method::NotificationShow(_) => "notification.show", Method::WorkspaceCreate(_) => "workspace.create", Method::WorkspaceList(_) => "workspace.list", @@ -296,6 +298,7 @@ fn api_method_name(method: &Method) -> &'static str { Method::AgentList(_) => "agent.list", Method::AgentGet(_) => "agent.get", Method::AgentRead(_) => "agent.read", + Method::AgentExplain(_) => "agent.explain", Method::AgentSend(_) => "agent.send", Method::AgentRename(_) => "agent.rename", Method::AgentFocus(_) => "agent.focus", |
