use serde::{Deserialize, Serialize}; use super::agents::AgentInfo; use super::common::{ClientWindowTitleReason, NotificationShowReason}; use super::events::EventEnvelope; use super::integrations::{ IntegrationInstallResult, IntegrationTarget, IntegrationUninstallResult, }; use super::panes::{ LayoutDescription, PaneEdgesResult, PaneFocusDirectionResult, PaneInfo, PaneLayoutSnapshot, PaneMoveResult, PaneNeighborResult, PaneProcessInfo, PaneReadResult, PaneResizeResult, PaneSwapResult, PaneTextPoint, PaneTextRange, PaneZoomResult, }; use super::plugins::{ InstalledPluginInfo, PluginActionInfo, PluginCommandLogInfo, PluginInvocationContext, PluginPaneInfo, }; use super::server::ServerCapabilities; use super::session::SessionSnapshot; use super::tabs::TabInfo; use super::workspaces::WorkspaceInfo; use super::worktrees::{WorktreeInfo, WorktreeSourceInfo}; #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, schemars::JsonSchema)] pub struct SuccessResponse { pub id: String, pub result: ResponseResult, } #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)] pub struct ErrorResponse { pub id: String, pub error: ErrorBody, } #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)] pub struct ErrorBody { pub code: String, pub message: String, } #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, schemars::JsonSchema)] #[serde(tag = "type", rename_all = "snake_case")] pub enum ResponseResult { Pong { version: String, protocol: u32, #[serde(default)] capabilities: Option, }, SessionSnapshot { snapshot: Box, }, WorkspaceInfo { workspace: WorkspaceInfo, }, WorkspaceCreated { workspace: WorkspaceInfo, tab: TabInfo, root_pane: PaneInfo, }, WorkspaceList { workspaces: Vec, }, WorktreeList { source: WorktreeSourceInfo, worktrees: Vec, }, WorktreeCreated { workspace: WorkspaceInfo, tab: TabInfo, root_pane: PaneInfo, worktree: WorktreeInfo, }, WorktreeOpened { workspace: WorkspaceInfo, tab: TabInfo, root_pane: PaneInfo, worktree: WorktreeInfo, already_open: bool, }, WorktreeRemoved { workspace_id: String, path: String, forced: bool, }, TabInfo { tab: TabInfo, }, TabCreated { tab: TabInfo, root_pane: PaneInfo, }, TabList { tabs: Vec, }, AgentInfo { agent: AgentInfo, }, AgentStarted { agent: AgentInfo, argv: Vec, }, AgentPrompted { agent: AgentInfo, }, AgentList { agents: Vec, }, AgentView { active: bool, #[serde(default, skip_serializing_if = "Option::is_none")] source: Option, #[serde(default, skip_serializing_if = "Option::is_none")] label: Option, }, PaneInfo { pane: PaneInfo, }, PaneList { panes: Vec, }, PaneCurrent { pane: PaneInfo, }, PaneSwap { swap: PaneSwapResult, }, PaneMove { move_result: PaneMoveResult, }, PaneZoom { zoom: PaneZoomResult, }, PaneLayout { layout: PaneLayoutSnapshot, }, PaneProcessInfo { process_info: PaneProcessInfo, }, LayoutExport { layout: LayoutDescription, }, LayoutApply { layout: LayoutDescription, }, LayoutSplitRatioSet { layout: LayoutDescription, }, PaneNeighbor { neighbor: PaneNeighborResult, }, PaneEdges { edges: PaneEdgesResult, }, PaneFocusDirection { focus: PaneFocusDirectionResult, }, PaneResize { resize: PaneResizeResult, }, PaneRead { read: PaneReadResult, }, PaneSelection { pane_id: String, text: String, }, PaneCopyMotion { pane_id: String, cursor: PaneTextPoint, content_revision: u64, }, PaneCopySearch { pane_id: String, content_revision: u64, matches: Vec, total: u64, #[serde(default, skip_serializing_if = "Option::is_none")] current: Option, #[serde(default, skip_serializing_if = "Option::is_none")] current_global: Option, }, AgentExplain { explain: serde_json::Value, }, SubscriptionStarted {}, WaitMatched { event: EventEnvelope, }, OutputMatched { pane_id: String, revision: u64, matched_line: Option, read: PaneReadResult, }, NotificationShow { shown: bool, reason: NotificationShowReason, }, ClientWindowTitle { changed: bool, reason: ClientWindowTitleReason, }, IntegrationList { integrations: Vec, }, IntegrationInstall { target: IntegrationTarget, details: IntegrationInstallResult, }, IntegrationUninstall { target: IntegrationTarget, details: IntegrationUninstallResult, }, AgentManifestReload { manifests: Vec, }, AgentManifestStatus { #[serde(default, skip_serializing_if = "Option::is_none")] last_check_unix: Option, #[serde(default, skip_serializing_if = "Option::is_none")] last_result: Option, manifests: Vec, }, PluginLinked { plugin: InstalledPluginInfo, }, PluginList { plugins: Vec, }, PluginUnlinked { plugin_id: String, removed: bool, }, PluginEnabled { plugin: InstalledPluginInfo, }, PluginDisabled { plugin: InstalledPluginInfo, }, PluginActionList { actions: Vec, }, PluginActionInvoked { action: PluginActionInfo, context: PluginInvocationContext, log: PluginCommandLogInfo, }, PaneLinkResolved { regions: Vec, }, PaneLinkActivated { #[serde(default, skip_serializing_if = "Option::is_none")] url: Option, handled: bool, }, PluginLogList { logs: Vec, }, PluginPaneOpened { plugin_pane: PluginPaneInfo, }, PluginPaneFocused { plugin_pane: PluginPaneInfo, }, PluginPaneClosed { pane_id: String, }, ConfigReload { status: crate::config::ConfigReloadStatus, diagnostics: Vec, }, /// Acknowledgement for the client-shell surface interest lease. This method is new on the /// endpoint protocol, so its revision-bearing result can establish an activation floor. ClientShellSurfaceSet { active: bool, projection_revision: u64, }, Ok {}, } #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)] 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, #[serde(default, skip_serializing_if = "Option::is_none")] pub cached_remote_version: Option, pub local_override_shadowing_remote: bool, #[serde(default, skip_serializing_if = "Option::is_none")] pub remote_update_result: Option, #[serde(default, skip_serializing_if = "Option::is_none")] pub remote_update_error: Option, #[serde(default, skip_serializing_if = "Option::is_none")] pub remote_last_checked_unix: Option, #[serde(default, skip_serializing_if = "Option::is_none")] pub warning: Option, }