diff options
| author | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-06-29 22:27:19 +0300 |
|---|---|---|
| committer | Ogulcan Celik <ogulcancelik@gmail.com> | 2026-06-29 22:27:19 +0300 |
| commit | 25aeaa46f6c807be686b710c5c3aa656969f07e5 (patch) | |
| tree | 8b9b4d4abce5951c2d87ee22c38eacb544eff81a /src | |
| parent | 9150ed6268874d1f2a314b1ddbf531b66df1e105 (diff) | |
feat: generate socket protocol schema
Diffstat (limited to 'src')
| -rw-r--r-- | src/agent_resume.rs | 2 | ||||
| -rw-r--r-- | src/api/schema.rs | 4 | ||||
| -rw-r--r-- | src/api/schema/agents.rs | 12 | ||||
| -rw-r--r-- | src/api/schema/common.rs | 34 | ||||
| -rw-r--r-- | src/api/schema/events.rs | 28 | ||||
| -rw-r--r-- | src/api/schema/integrations.rs | 10 | ||||
| -rw-r--r-- | src/api/schema/panes.rs | 104 | ||||
| -rw-r--r-- | src/api/schema/plugins.rs | 56 | ||||
| -rw-r--r-- | src/api/schema/response.rs | 10 | ||||
| -rw-r--r-- | src/api/schema/server.rs | 6 | ||||
| -rw-r--r-- | src/api/schema/session.rs | 2 | ||||
| -rw-r--r-- | src/api/schema/tabs.rs | 10 | ||||
| -rw-r--r-- | src/api/schema/tests.rs | 98 | ||||
| -rw-r--r-- | src/api/schema/workspaces.rs | 10 | ||||
| -rw-r--r-- | src/api/schema/worktrees.rs | 12 | ||||
| -rw-r--r-- | src/config/model.rs | 6 |
16 files changed, 257 insertions, 147 deletions
diff --git a/src/agent_resume.rs b/src/agent_resume.rs index f23ff5e0..a157f06a 100644 --- a/src/agent_resume.rs +++ b/src/agent_resume.rs @@ -11,7 +11,7 @@ pub struct AgentSessionRef { pub value: String, } -#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)] #[serde(rename_all = "snake_case")] pub enum AgentSessionRefKind { Id, diff --git a/src/api/schema.rs b/src/api/schema.rs index a404d56c..1a51dfbc 100644 --- a/src/api/schema.rs +++ b/src/api/schema.rs @@ -30,14 +30,14 @@ fn is_false(value: &bool) -> bool { !*value } -#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, schemars::JsonSchema)] pub struct Request { pub id: String, #[serde(flatten)] pub method: Method, } -#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, schemars::JsonSchema)] #[serde(tag = "method", content = "params")] // Request enums are short-lived wire values; keeping variants direct preserves // the simple serde shape and avoids boxing churn across every caller. diff --git a/src/api/schema/agents.rs b/src/api/schema/agents.rs index 644211d4..e5f319e0 100644 --- a/src/api/schema/agents.rs +++ b/src/api/schema/agents.rs @@ -4,7 +4,7 @@ use serde::{Deserialize, Serialize}; use super::common::{AgentStatus, ReadFormat, ReadSource, SplitDirection}; -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)] pub struct AgentReadParams { pub target: String, pub source: ReadSource, @@ -16,20 +16,20 @@ pub struct AgentReadParams { pub strip_ansi: bool, } -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)] pub struct AgentSendParams { pub target: String, pub text: String, } -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)] pub struct AgentRenameParams { pub target: String, #[serde(default, skip_serializing_if = "Option::is_none")] pub name: Option<String>, } -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)] pub struct AgentStartParams { pub name: String, #[serde(default, skip_serializing_if = "Option::is_none")] @@ -47,7 +47,7 @@ pub struct AgentStartParams { pub env: HashMap<String, String>, } -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)] pub struct AgentInfo { pub terminal_id: String, #[serde(default, skip_serializing_if = "Option::is_none")] @@ -78,7 +78,7 @@ pub struct AgentInfo { pub revision: u64, } -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)] pub struct AgentSessionInfo { pub source: String, pub agent: String, diff --git a/src/api/schema/common.rs b/src/api/schema/common.rs index cb423683..3d8376ed 100644 --- a/src/api/schema/common.rs +++ b/src/api/schema/common.rs @@ -1,41 +1,41 @@ use serde::{Deserialize, Serialize}; -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Default)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema, Default)] pub struct EmptyParams {} -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)] pub struct WorkspaceTarget { pub workspace_id: String, } -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)] pub struct PaneTarget { pub pane_id: String, } -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)] pub struct TabTarget { pub tab_id: String, } -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)] pub struct AgentTarget { pub target: String, } -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)] pub struct ClientWindowTitleSetParams { pub title: String, } -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)] #[serde(rename_all = "snake_case")] pub enum SplitDirection { Right, Down, } -#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)] #[serde(rename_all = "snake_case")] pub enum ReadSource { Visible, @@ -44,7 +44,9 @@ pub enum ReadSource { Detection, } -#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default)] +#[derive( + Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema, Default, +)] #[serde(rename_all = "snake_case")] pub enum ReadFormat { #[default] @@ -52,7 +54,7 @@ pub enum ReadFormat { Ansi, } -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)] pub struct NotificationShowParams { pub title: String, #[serde(default, skip_serializing_if = "Option::is_none")] @@ -63,7 +65,9 @@ pub struct NotificationShowParams { pub sound: NotificationShowSound, } -#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default)] +#[derive( + Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema, Default, +)] #[serde(rename_all = "snake_case")] pub enum NotificationShowSound { #[default] @@ -86,7 +90,7 @@ impl NotificationShowSound { } } -#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)] #[serde(rename_all = "snake_case")] pub enum NotificationShowReason { Shown, @@ -96,7 +100,7 @@ pub enum NotificationShowReason { Busy, } -#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)] #[serde(rename_all = "snake_case")] pub enum ClientWindowTitleReason { Set, @@ -104,7 +108,7 @@ pub enum ClientWindowTitleReason { NoForegroundClient, } -#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)] #[serde(rename_all = "snake_case")] pub enum PaneAgentState { Idle, @@ -113,7 +117,7 @@ pub enum PaneAgentState { Unknown, } -#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)] #[serde(rename_all = "snake_case")] pub enum AgentStatus { Idle, diff --git a/src/api/schema/events.rs b/src/api/schema/events.rs index 014288b1..2fbce4d0 100644 --- a/src/api/schema/events.rs +++ b/src/api/schema/events.rs @@ -8,12 +8,12 @@ use super::tabs::TabInfo; use super::workspaces::WorkspaceInfo; use super::worktrees::WorktreeInfo; -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)] pub struct EventsSubscribeParams { pub subscriptions: Vec<Subscription>, } -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)] #[serde(tag = "type")] pub enum Subscription { #[serde(rename = "workspace.created")] @@ -74,14 +74,14 @@ pub enum Subscription { }, } -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)] pub struct EventsWaitParams { pub match_event: EventMatch, #[serde(default, skip_serializing_if = "Option::is_none")] pub timeout_ms: Option<u64>, } -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)] pub struct PaneWaitForOutputParams { pub pane_id: String, pub source: ReadSource, @@ -94,14 +94,14 @@ pub struct PaneWaitForOutputParams { pub strip_ansi: bool, } -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)] #[serde(tag = "type", rename_all = "snake_case")] pub enum OutputMatch { Substring { value: String }, Regex { value: String }, } -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)] #[serde(tag = "event", rename_all = "snake_case")] pub enum EventMatch { WorkspaceCreated { @@ -179,7 +179,7 @@ pub enum EventMatch { }, } -#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)] #[serde(rename_all = "snake_case")] pub enum EventKind { WorkspaceCreated, @@ -332,13 +332,13 @@ mod known_event_name_tests { } } -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)] pub struct EventEnvelope { pub event: EventKind, pub data: EventData, } -#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)] pub enum SubscriptionEventKind { #[serde(rename = "pane.output_matched")] PaneOutputMatched, @@ -346,27 +346,27 @@ pub enum SubscriptionEventKind { PaneAgentStatusChanged, } -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)] pub struct SubscriptionEventEnvelope { pub event: SubscriptionEventKind, pub data: SubscriptionEventData, } -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)] #[serde(untagged)] pub enum SubscriptionEventData { PaneOutputMatched(PaneOutputMatchedEvent), PaneAgentStatusChanged(PaneAgentStatusChangedEvent), } -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)] pub struct PaneOutputMatchedEvent { pub pane_id: String, pub matched_line: String, pub read: PaneReadResult, } -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)] pub struct PaneAgentStatusChangedEvent { pub pane_id: String, pub workspace_id: String, @@ -383,7 +383,7 @@ pub struct PaneAgentStatusChangedEvent { pub state_labels: HashMap<String, String>, } -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)] #[serde(tag = "type", rename_all = "snake_case")] pub enum EventData { WorkspaceCreated { diff --git a/src/api/schema/integrations.rs b/src/api/schema/integrations.rs index bd4988f1..a6d808fc 100644 --- a/src/api/schema/integrations.rs +++ b/src/api/schema/integrations.rs @@ -1,16 +1,16 @@ use serde::{Deserialize, Serialize}; -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)] pub struct IntegrationInstallParams { pub target: IntegrationTarget, } -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)] pub struct IntegrationUninstallParams { pub target: IntegrationTarget, } -#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)] #[serde(rename_all = "snake_case")] pub enum IntegrationTarget { Pi, @@ -28,12 +28,12 @@ pub enum IntegrationTarget { Cursor, } -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)] pub struct IntegrationInstallResult { pub messages: Vec<String>, } -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)] pub struct IntegrationUninstallResult { pub messages: Vec<String>, } diff --git a/src/api/schema/panes.rs b/src/api/schema/panes.rs index 55241131..ef45a7ca 100644 --- a/src/api/schema/panes.rs +++ b/src/api/schema/panes.rs @@ -5,7 +5,7 @@ use serde::{Deserialize, Serialize}; use super::agents::AgentSessionInfo; use super::common::{AgentStatus, PaneAgentState, ReadFormat, ReadSource, SplitDirection}; -#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, schemars::JsonSchema)] pub struct PaneSplitParams { #[serde(default, skip_serializing_if = "Option::is_none")] pub workspace_id: Option<String>, @@ -22,7 +22,7 @@ pub struct PaneSplitParams { pub env: HashMap<String, String>, } -#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)] #[serde(rename_all = "snake_case")] pub enum PaneDirection { Left, @@ -31,7 +31,7 @@ pub enum PaneDirection { Down, } -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Default)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema, Default)] pub struct PaneSwapParams { #[serde(default, skip_serializing_if = "Option::is_none")] pub pane_id: Option<String>, @@ -43,7 +43,7 @@ pub struct PaneSwapParams { pub target_pane_id: Option<String>, } -#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, schemars::JsonSchema)] pub struct PaneMoveParams { pub pane_id: String, pub destination: PaneMoveDestination, @@ -51,7 +51,7 @@ pub struct PaneMoveParams { pub focus: bool, } -#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, schemars::JsonSchema)] #[serde(tag = "type", rename_all = "snake_case")] pub enum PaneMoveDestination { Tab { @@ -76,7 +76,7 @@ pub enum PaneMoveDestination { }, } -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Default)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema, Default)] pub struct PaneZoomParams { #[serde(default, skip_serializing_if = "Option::is_none")] pub pane_id: Option<String>, @@ -84,7 +84,9 @@ pub struct PaneZoomParams { pub mode: PaneZoomMode, } -#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default)] +#[derive( + Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema, Default, +)] #[serde(rename_all = "snake_case")] pub enum PaneZoomMode { #[default] @@ -93,19 +95,19 @@ pub enum PaneZoomMode { Off, } -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Default)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema, Default)] pub struct PaneLayoutParams { #[serde(default, skip_serializing_if = "Option::is_none")] pub pane_id: Option<String>, } -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Default)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema, Default)] pub struct PaneProcessInfoParams { #[serde(default, skip_serializing_if = "Option::is_none")] pub pane_id: Option<String>, } -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Default)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema, Default)] pub struct LayoutExportParams { #[serde(default, skip_serializing_if = "Option::is_none")] pub tab_id: Option<String>, @@ -113,7 +115,7 @@ pub struct LayoutExportParams { pub pane_id: Option<String>, } -#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, schemars::JsonSchema)] pub struct LayoutApplyParams { #[serde(default, skip_serializing_if = "Option::is_none")] pub workspace_id: Option<String>, @@ -126,7 +128,7 @@ pub struct LayoutApplyParams { pub root: LayoutNode, } -#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, schemars::JsonSchema)] pub struct LayoutSetSplitRatioParams { #[serde(default, skip_serializing_if = "Option::is_none")] pub tab_id: Option<String>, @@ -136,7 +138,7 @@ pub struct LayoutSetSplitRatioParams { pub ratio: f32, } -#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, schemars::JsonSchema)] pub struct LayoutDescription { pub workspace_id: String, pub tab_id: String, @@ -145,7 +147,7 @@ pub struct LayoutDescription { pub root: LayoutNode, } -#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, schemars::JsonSchema)] #[serde(tag = "type", rename_all = "snake_case")] pub enum LayoutNode { Pane { @@ -160,7 +162,7 @@ pub enum LayoutNode { }, } -#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)] +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, schemars::JsonSchema, Default)] pub struct LayoutPane { #[serde(default, skip_serializing_if = "Option::is_none")] pub pane_id: Option<String>, @@ -174,27 +176,27 @@ pub struct LayoutPane { pub env: HashMap<String, String>, } -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)] pub struct PaneNeighborParams { #[serde(default, skip_serializing_if = "Option::is_none")] pub pane_id: Option<String>, pub direction: PaneDirection, } -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Default)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema, Default)] pub struct PaneEdgesParams { #[serde(default, skip_serializing_if = "Option::is_none")] pub pane_id: Option<String>, } -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)] pub struct PaneFocusDirectionParams { #[serde(default, skip_serializing_if = "Option::is_none")] pub pane_id: Option<String>, pub direction: PaneDirection, } -#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, schemars::JsonSchema)] pub struct PaneResizeParams { #[serde(default, skip_serializing_if = "Option::is_none")] pub pane_id: Option<String>, @@ -203,38 +205,38 @@ pub struct PaneResizeParams { pub amount: Option<f32>, } -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Default)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema, Default)] pub struct PaneListParams { #[serde(default, skip_serializing_if = "Option::is_none")] pub workspace_id: Option<String>, } -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Default)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema, Default)] pub struct PaneCurrentParams { #[serde(default, skip_serializing_if = "Option::is_none")] pub caller_pane_id: Option<String>, } -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)] pub struct PaneRenameParams { pub pane_id: String, #[serde(default, skip_serializing_if = "Option::is_none")] pub label: Option<String>, } -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)] pub struct PaneSendTextParams { pub pane_id: String, pub text: String, } -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)] pub struct PaneSendKeysParams { pub pane_id: String, pub keys: Vec<String>, } -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)] pub struct PaneSendInputParams { pub pane_id: String, #[serde(default, skip_serializing_if = "String::is_empty")] @@ -243,7 +245,7 @@ pub struct PaneSendInputParams { pub keys: Vec<String>, } -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)] pub struct PaneReadParams { pub pane_id: String, pub source: ReadSource, @@ -255,7 +257,7 @@ pub struct PaneReadParams { pub strip_ansi: bool, } -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)] pub struct PaneReportAgentParams { pub pane_id: String, pub source: String, @@ -273,7 +275,7 @@ pub struct PaneReportAgentParams { pub agent_session_path: Option<String>, } -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)] pub struct PaneReportAgentSessionParams { pub pane_id: String, pub source: String, @@ -288,7 +290,7 @@ pub struct PaneReportAgentSessionParams { pub session_start_source: Option<String>, } -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)] pub struct PaneReportMetadataParams { pub pane_id: String, pub source: String, @@ -318,7 +320,7 @@ pub struct PaneReportMetadataParams { pub ttl_ms: Option<u64>, } -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)] pub struct PaneClearAgentAuthorityParams { pub pane_id: String, #[serde(default, skip_serializing_if = "Option::is_none")] @@ -327,7 +329,7 @@ pub struct PaneClearAgentAuthorityParams { pub seq: Option<u64>, } -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)] pub struct PaneReleaseAgentParams { pub pane_id: String, pub source: String, @@ -336,7 +338,7 @@ pub struct PaneReleaseAgentParams { pub seq: Option<u64>, } -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)] pub struct PaneInfo { pub pane_id: String, pub terminal_id: String, @@ -365,7 +367,7 @@ pub struct PaneInfo { pub revision: u64, } -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)] pub struct PaneProcessInfo { pub pane_id: String, #[serde(default, skip_serializing_if = "Option::is_none")] @@ -378,7 +380,7 @@ pub struct PaneProcessInfo { pub foreground_processes: Vec<PaneProcessInfoProcess>, } -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)] pub struct PaneProcessInfoProcess { pub pid: u32, pub name: String, @@ -392,7 +394,7 @@ pub struct PaneProcessInfoProcess { pub cwd: Option<String>, } -#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, schemars::JsonSchema)] pub struct PaneSwapResult { pub changed: bool, #[serde(default, skip_serializing_if = "Option::is_none")] @@ -404,7 +406,7 @@ pub struct PaneSwapResult { pub layout: PaneLayoutSnapshot, } -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)] #[serde(rename_all = "snake_case")] pub enum PaneSwapReason { NoNeighbor, @@ -413,7 +415,7 @@ pub enum PaneSwapReason { CrossTab, } -#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, schemars::JsonSchema)] pub struct PaneMoveResult { pub changed: bool, #[serde(default, skip_serializing_if = "Option::is_none")] @@ -436,14 +438,14 @@ pub struct PaneMoveResult { pub focused_pane_id: String, } -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)] #[serde(rename_all = "snake_case")] pub enum PaneMoveReason { SameTab, ZoomedTab, } -#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, schemars::JsonSchema)] pub struct PaneZoomResult { pub changed: bool, pub zoom_changed: bool, @@ -456,7 +458,7 @@ pub struct PaneZoomResult { pub layout: PaneLayoutSnapshot, } -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)] #[serde(rename_all = "snake_case")] pub enum PaneZoomReason { SinglePane, @@ -464,7 +466,7 @@ pub enum PaneZoomReason { AlreadyUnzoomed, } -#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, schemars::JsonSchema)] pub struct PaneLayoutSnapshot { pub workspace_id: String, pub tab_id: String, @@ -475,7 +477,7 @@ pub struct PaneLayoutSnapshot { pub splits: Vec<PaneLayoutSplit>, } -#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)] pub struct PaneLayoutRect { pub x: u16, pub y: u16, @@ -483,14 +485,14 @@ pub struct PaneLayoutRect { pub height: u16, } -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)] pub struct PaneLayoutPane { pub pane_id: String, pub focused: bool, pub rect: PaneLayoutRect, } -#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, schemars::JsonSchema)] pub struct PaneLayoutSplit { pub id: String, pub direction: SplitDirection, @@ -498,7 +500,7 @@ pub struct PaneLayoutSplit { pub rect: PaneLayoutRect, } -#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, schemars::JsonSchema)] pub struct PaneNeighborResult { pub pane_id: String, pub direction: PaneDirection, @@ -507,7 +509,7 @@ pub struct PaneNeighborResult { pub layout: PaneLayoutSnapshot, } -#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, schemars::JsonSchema)] pub struct PaneEdgesResult { pub pane_id: String, pub left: bool, @@ -517,7 +519,7 @@ pub struct PaneEdgesResult { pub layout: PaneLayoutSnapshot, } -#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, schemars::JsonSchema)] pub struct PaneFocusDirectionResult { pub changed: bool, #[serde(default, skip_serializing_if = "Option::is_none")] @@ -528,13 +530,13 @@ pub struct PaneFocusDirectionResult { pub layout: PaneLayoutSnapshot, } -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)] #[serde(rename_all = "snake_case")] pub enum PaneFocusDirectionReason { NoNeighbor, } -#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, schemars::JsonSchema)] pub struct PaneResizeResult { pub changed: bool, #[serde(default, skip_serializing_if = "Option::is_none")] @@ -544,13 +546,13 @@ pub struct PaneResizeResult { pub layout: PaneLayoutSnapshot, } -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)] #[serde(rename_all = "snake_case")] pub enum PaneResizeReason { Unchanged, } -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)] pub struct PaneReadResult { pub pane_id: String, pub workspace_id: String, diff --git a/src/api/schema/plugins.rs b/src/api/schema/plugins.rs index c809be58..10e7d670 100644 --- a/src/api/schema/plugins.rs +++ b/src/api/schema/plugins.rs @@ -7,7 +7,7 @@ use super::common::SplitDirection; use super::panes::PaneInfo; use super::workspaces::WorkspaceWorktreeInfo; -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)] pub struct PluginLinkParams { pub path: String, #[serde(default = "super::common::default_true")] @@ -16,23 +16,23 @@ pub struct PluginLinkParams { pub source: Option<PluginSourceInfo>, } -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Default)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema, Default)] pub struct PluginListParams { #[serde(default, skip_serializing_if = "Option::is_none")] pub plugin_id: Option<String>, } -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)] pub struct PluginUnlinkParams { pub plugin_id: String, } -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)] pub struct PluginSetEnabledParams { pub plugin_id: String, } -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)] pub struct InstalledPluginInfo { pub plugin_id: String, pub name: String, @@ -64,7 +64,7 @@ pub struct InstalledPluginInfo { pub warnings: Vec<String>, } -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)] pub struct PluginSourceInfo { #[serde(default)] pub kind: PluginSourceKind, @@ -99,7 +99,9 @@ impl Default for PluginSourceInfo { } } -#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default)] +#[derive( + Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema, Default, +)] #[serde(rename_all = "snake_case")] pub enum PluginSourceKind { #[default] @@ -221,14 +223,14 @@ mod tests { } } -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)] pub struct PluginManifestBuild { #[serde(default, skip_serializing_if = "Option::is_none")] pub platforms: Option<Vec<PluginPlatform>>, pub command: Vec<String>, } -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)] pub struct PluginManifestAction { pub id: String, pub title: String, @@ -241,7 +243,7 @@ pub struct PluginManifestAction { pub command: Vec<String>, } -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)] pub struct PluginManifestEventHook { pub on: String, #[serde(default, skip_serializing_if = "Option::is_none")] @@ -249,7 +251,7 @@ pub struct PluginManifestEventHook { pub command: Vec<String>, } -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)] pub struct PluginManifestPane { pub id: String, pub title: String, @@ -262,7 +264,7 @@ pub struct PluginManifestPane { pub command: Vec<String>, } -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)] pub struct PluginManifestLinkHandler { pub id: String, pub title: String, @@ -272,13 +274,13 @@ pub struct PluginManifestLinkHandler { pub platforms: Option<Vec<PluginPlatform>>, } -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Default)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema, Default)] pub struct PluginActionListParams { #[serde(default, skip_serializing_if = "Option::is_none")] pub plugin_id: Option<String>, } -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Default)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema, Default)] pub struct PluginLogListParams { #[serde(default, skip_serializing_if = "Option::is_none")] pub plugin_id: Option<String>, @@ -286,7 +288,7 @@ pub struct PluginLogListParams { pub limit: Option<usize>, } -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)] pub struct PluginActionInvokeParams { pub action_id: String, #[serde(default, skip_serializing_if = "Option::is_none")] @@ -295,7 +297,7 @@ pub struct PluginActionInvokeParams { pub context: Option<PluginInvocationContext>, } -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)] pub struct PluginCommandLogInfo { pub log_id: String, pub plugin_id: String, @@ -318,7 +320,7 @@ pub struct PluginCommandLogInfo { pub error: Option<String>, } -#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)] #[serde(rename_all = "snake_case")] pub enum PluginCommandStatus { Running, @@ -326,7 +328,7 @@ pub enum PluginCommandStatus { Failed, } -#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)] +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, schemars::JsonSchema)] #[serde(rename_all = "snake_case")] pub enum PluginPlatform { Linux, @@ -334,7 +336,7 @@ pub enum PluginPlatform { Windows, } -#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)] #[serde(rename_all = "snake_case")] pub enum PluginActionContext { Global, @@ -344,7 +346,7 @@ pub enum PluginActionContext { Selection, } -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)] pub struct PluginInvocationContext { #[serde(default, skip_serializing_if = "Option::is_none")] pub workspace_id: Option<String>, @@ -378,7 +380,7 @@ pub struct PluginInvocationContext { pub link_handler_id: Option<String>, } -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)] pub struct PluginActionInfo { pub plugin_id: String, pub action_id: String, @@ -398,7 +400,7 @@ impl PluginActionInfo { } } -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)] pub struct PluginPaneOpenParams { pub plugin_id: String, pub entrypoint: String, @@ -418,7 +420,9 @@ pub struct PluginPaneOpenParams { pub env: HashMap<String, String>, } -#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default)] +#[derive( + Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema, Default, +)] #[serde(rename_all = "snake_case")] pub enum PluginPanePlacement { #[default] @@ -428,17 +432,17 @@ pub enum PluginPanePlacement { Zoomed, } -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)] pub struct PluginPaneFocusParams { pub pane_id: String, } -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)] pub struct PluginPaneCloseParams { pub pane_id: String, } -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)] pub struct PluginPaneInfo { pub plugin_id: String, pub entrypoint: String, diff --git a/src/api/schema/response.rs b/src/api/schema/response.rs index 8ad41ec4..18a2635d 100644 --- a/src/api/schema/response.rs +++ b/src/api/schema/response.rs @@ -21,25 +21,25 @@ use super::tabs::TabInfo; use super::workspaces::WorkspaceInfo; use super::worktrees::{WorktreeInfo, WorktreeSourceInfo}; -#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, schemars::JsonSchema)] pub struct SuccessResponse { pub id: String, pub result: ResponseResult, } -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[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)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)] pub struct ErrorBody { pub code: String, pub message: String, } -#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, schemars::JsonSchema)] #[serde(tag = "type", rename_all = "snake_case")] pub enum ResponseResult { Pong { @@ -234,7 +234,7 @@ pub enum ResponseResult { Ok {}, } -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)] pub struct AgentManifestInfo { pub agent: String, pub source: String, diff --git a/src/api/schema/server.rs b/src/api/schema/server.rs index 59ce8686..8bace6e0 100644 --- a/src/api/schema/server.rs +++ b/src/api/schema/server.rs @@ -1,9 +1,9 @@ use serde::{Deserialize, Serialize}; -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Default)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema, Default)] pub struct PingParams {} -#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)] pub struct ServerLiveHandoffParams { #[serde(default, skip_serializing_if = "Option::is_none")] pub import_exe: Option<String>, @@ -13,7 +13,7 @@ pub struct ServerLiveHandoffParams { pub expected_version: Option<String>, } -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)] pub struct ServerCapabilities { pub live_handoff: bool, } diff --git a/src/api/schema/session.rs b/src/api/schema/session.rs index b51f6969..63fd8e09 100644 --- a/src/api/schema/session.rs +++ b/src/api/schema/session.rs @@ -5,7 +5,7 @@ use super::panes::{PaneInfo, PaneLayoutSnapshot}; use super::tabs::TabInfo; use super::workspaces::WorkspaceInfo; -#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, schemars::JsonSchema)] pub struct SessionSnapshot { pub version: String, pub protocol: u32, diff --git a/src/api/schema/tabs.rs b/src/api/schema/tabs.rs index 41af5c6b..236cebee 100644 --- a/src/api/schema/tabs.rs +++ b/src/api/schema/tabs.rs @@ -4,7 +4,7 @@ use serde::{Deserialize, Serialize}; use super::common::AgentStatus; -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)] pub struct TabCreateParams { #[serde(default, skip_serializing_if = "Option::is_none")] pub workspace_id: Option<String>, @@ -18,25 +18,25 @@ pub struct TabCreateParams { pub env: HashMap<String, String>, } -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Default)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema, Default)] pub struct TabListParams { #[serde(default, skip_serializing_if = "Option::is_none")] pub workspace_id: Option<String>, } -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)] pub struct TabRenameParams { pub tab_id: String, pub label: String, } -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)] pub struct TabMoveParams { pub tab_id: String, pub insert_index: usize, } -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)] pub struct TabInfo { pub tab_id: String, pub workspace_id: String, diff --git a/src/api/schema/tests.rs b/src/api/schema/tests.rs index 5d61e972..01ec9baa 100644 --- a/src/api/schema/tests.rs +++ b/src/api/schema/tests.rs @@ -2,6 +2,49 @@ use std::collections::HashMap; use super::*; +fn protocol_schema_entry<T: schemars::JsonSchema>(name: &str) -> serde_json::Value { + let mut schema = serde_json::to_value(schemars::schema_for!(T)).unwrap(); + rewrite_schema_refs(&mut schema, name); + schema +} + +fn rewrite_schema_refs(value: &mut serde_json::Value, schema_name: &str) { + match value { + serde_json::Value::Object(object) => { + if let Some(serde_json::Value::String(reference)) = object.get_mut("$ref") { + if let Some(path) = reference.strip_prefix("#/") { + *reference = format!("#/schemas/{schema_name}/{path}"); + } + } + for child in object.values_mut() { + rewrite_schema_refs(child, schema_name); + } + } + serde_json::Value::Array(items) => { + for item in items { + rewrite_schema_refs(item, schema_name); + } + } + _ => {} + } +} + +fn protocol_schema_document() -> serde_json::Value { + serde_json::json!({ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "title": "Herdr API", + "schema_version": 1, + "protocol": crate::protocol::PROTOCOL_VERSION, + "schemas": { + "request": protocol_schema_entry::<Request>("request"), + "success_response": protocol_schema_entry::<SuccessResponse>("success_response"), + "error_response": protocol_schema_entry::<ErrorResponse>("error_response"), + "event": protocol_schema_entry::<EventEnvelope>("event"), + "subscription_event": protocol_schema_entry::<SubscriptionEventEnvelope>("subscription_event"), + }, + }) +} + #[test] fn request_uses_dot_method_names() { let request = Request { @@ -19,6 +62,61 @@ fn request_uses_dot_method_names() { } #[test] +fn bundled_protocol_schema_refs_resolve_inside_bundle() { + fn assert_no_standalone_refs(value: &serde_json::Value) { + match value { + serde_json::Value::Object(object) => { + if let Some(serde_json::Value::String(reference)) = object.get("$ref") { + assert!( + !reference.starts_with("#/$defs/"), + "schema bundle contains standalone ref {reference}" + ); + } + for child in object.values() { + assert_no_standalone_refs(child); + } + } + serde_json::Value::Array(items) => { + for item in items { + assert_no_standalone_refs(item); + } + } + _ => {} + } + } + + assert_no_standalone_refs(&protocol_schema_document()); +} + +#[test] +fn generated_protocol_schema_artifact_is_current() { + let actual = format!( + "{}\n", + serde_json::to_string_pretty(&protocol_schema_document()).unwrap() + ); + let path = std::path::Path::new(env!("CARGO_MANIFEST_DIR")) + .join("docs/next/api/herdr-api.schema.json"); + + if std::env::var_os("HERDR_UPDATE_API_SCHEMA").is_some() { + std::fs::create_dir_all(path.parent().unwrap()).unwrap(); + std::fs::write(&path, &actual).unwrap(); + return; + } + + let expected = std::fs::read_to_string(&path).unwrap_or_else(|err| { + panic!( + "failed to read {}; run `HERDR_UPDATE_API_SCHEMA=1 just test-one generated_protocol_schema_artifact_is_current`: {err}", + path.display() + ) + }); + assert_eq!( + expected, + actual, + "generated API schema artifact is stale; run `HERDR_UPDATE_API_SCHEMA=1 just test-one generated_protocol_schema_artifact_is_current`" + ); +} + +#[test] fn request_round_trips_for_server_stop() { let request = Request { id: "req_stop".into(), diff --git a/src/api/schema/workspaces.rs b/src/api/schema/workspaces.rs index be5ef0b4..6934539c 100644 --- a/src/api/schema/workspaces.rs +++ b/src/api/schema/workspaces.rs @@ -4,7 +4,7 @@ use serde::{Deserialize, Serialize}; use super::common::AgentStatus; -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)] pub struct WorkspaceCreateParams { #[serde(default, skip_serializing_if = "Option::is_none")] pub cwd: Option<String>, @@ -16,19 +16,19 @@ pub struct WorkspaceCreateParams { pub env: HashMap<String, String>, } -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)] pub struct WorkspaceRenameParams { pub workspace_id: String, pub label: String, } -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)] pub struct WorkspaceMoveParams { pub workspace_id: String, pub insert_index: usize, } -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)] pub struct WorkspaceInfo { pub workspace_id: String, pub number: usize, @@ -42,7 +42,7 @@ pub struct WorkspaceInfo { pub worktree: Option<WorkspaceWorktreeInfo>, } -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)] pub struct WorkspaceWorktreeInfo { pub repo_key: String, pub repo_name: String, diff --git a/src/api/schema/worktrees.rs b/src/api/schema/worktrees.rs index f480edb1..dc35128e 100644 --- a/src/api/schema/worktrees.rs +++ b/src/api/schema/worktrees.rs @@ -1,6 +1,6 @@ use serde::{Deserialize, Serialize}; -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Default)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema, Default)] pub struct WorktreeListParams { #[serde(default, skip_serializing_if = "Option::is_none")] pub workspace_id: Option<String>, @@ -8,7 +8,7 @@ pub struct WorktreeListParams { pub cwd: Option<String>, } -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Default)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema, Default)] pub struct WorktreeCreateParams { #[serde(default, skip_serializing_if = "Option::is_none")] pub workspace_id: Option<String>, @@ -26,7 +26,7 @@ pub struct WorktreeCreateParams { pub focus: bool, } -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Default)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema, Default)] pub struct WorktreeOpenParams { #[serde(default, skip_serializing_if = "Option::is_none")] pub workspace_id: Option<String>, @@ -42,14 +42,14 @@ pub struct WorktreeOpenParams { pub focus: bool, } -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)] pub struct WorktreeRemoveParams { pub workspace_id: String, #[serde(default)] pub force: bool, } -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)] pub struct WorktreeSourceInfo { pub repo_key: String, pub repo_name: String, @@ -59,7 +59,7 @@ pub struct WorktreeSourceInfo { pub source_workspace_id: Option<String>, } -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, schemars::JsonSchema)] pub struct WorktreeInfo { pub path: String, #[serde(default, skip_serializing_if = "Option::is_none")] diff --git a/src/config/model.rs b/src/config/model.rs index 51af278f..92192c26 100644 --- a/src/config/model.rs +++ b/src/config/model.rs @@ -64,7 +64,9 @@ pub enum ToastDelivery { System, } -#[derive(Debug, Clone, Copy, PartialEq, Eq, Deserialize, Serialize, Default)] +#[derive( + Debug, Clone, Copy, PartialEq, Eq, Deserialize, Serialize, schemars::JsonSchema, Default, +)] #[serde(rename_all = "kebab-case")] pub enum ToastHerdrPosition { TopLeft, @@ -238,7 +240,7 @@ impl Default for SessionConfig { } } -#[derive(Debug, Clone, Copy, PartialEq, Eq, Deserialize, Serialize)] +#[derive(Debug, Clone, Copy, PartialEq, Eq, Deserialize, Serialize, schemars::JsonSchema)] #[serde(rename_all = "snake_case")] pub enum ConfigReloadStatus { Applied, |
