diff options
Diffstat (limited to 'src/api')
| -rw-r--r-- | src/api/mod.rs | 1 | ||||
| -rw-r--r-- | src/api/schema.rs | 360 | ||||
| -rw-r--r-- | src/api/schema/panes.rs | 394 | ||||
| -rw-r--r-- | src/api/server.rs | 1 |
4 files changed, 405 insertions, 351 deletions
diff --git a/src/api/mod.rs b/src/api/mod.rs index f0cf42c7..7d2d5bc1 100644 --- a/src/api/mod.rs +++ b/src/api/mod.rs @@ -38,6 +38,7 @@ pub(crate) fn request_changes_ui(request: &Request) -> bool { | Method::AgentStart(_) | Method::PaneSplit(_) | Method::PaneSwap(_) + | Method::PaneZoom(_) | Method::PaneFocusDirection(_) | Method::PaneResize(_) | Method::PaneRename(_) diff --git a/src/api/schema.rs b/src/api/schema.rs index ba2fd1e5..c0715758 100644 --- a/src/api/schema.rs +++ b/src/api/schema.rs @@ -2,6 +2,10 @@ use std::collections::HashMap; use serde::{Deserialize, Serialize}; +pub mod panes; + +pub use panes::*; + #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] pub struct Request { pub id: String, @@ -70,6 +74,8 @@ pub enum Method { PaneSplit(PaneSplitParams), #[serde(rename = "pane.swap")] PaneSwap(PaneSwapParams), + #[serde(rename = "pane.zoom")] + PaneZoom(PaneZoomParams), #[serde(rename = "pane.layout")] PaneLayout(PaneLayoutParams), #[serde(rename = "pane.neighbor")] @@ -274,118 +280,6 @@ pub struct AgentStartParams { pub argv: Vec<String>, } -#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] -pub struct PaneSplitParams { - #[serde(default, skip_serializing_if = "Option::is_none")] - pub workspace_id: Option<String>, - #[serde(default, skip_serializing_if = "Option::is_none")] - pub target_pane_id: Option<String>, - pub direction: SplitDirection, - #[serde(default, skip_serializing_if = "Option::is_none")] - pub ratio: Option<f32>, - #[serde(default, skip_serializing_if = "Option::is_none")] - pub cwd: Option<String>, - #[serde(default)] - pub focus: bool, -} - -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] -#[serde(rename_all = "snake_case")] -pub enum SplitDirection { - Right, - Down, -} - -#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] -#[serde(rename_all = "snake_case")] -pub enum PaneDirection { - Left, - Right, - Up, - Down, -} - -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Default)] -pub struct PaneSwapParams { - #[serde(default, skip_serializing_if = "Option::is_none")] - pub pane_id: Option<String>, - #[serde(default, skip_serializing_if = "Option::is_none")] - pub direction: Option<PaneDirection>, - #[serde(default, skip_serializing_if = "Option::is_none")] - pub source_pane_id: Option<String>, - #[serde(default, skip_serializing_if = "Option::is_none")] - pub target_pane_id: Option<String>, -} - -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Default)] -pub struct PaneLayoutParams { - #[serde(default, skip_serializing_if = "Option::is_none")] - pub pane_id: Option<String>, -} - -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] -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)] -pub struct PaneEdgesParams { - #[serde(default, skip_serializing_if = "Option::is_none")] - pub pane_id: Option<String>, -} - -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] -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)] -pub struct PaneResizeParams { - #[serde(default, skip_serializing_if = "Option::is_none")] - pub pane_id: Option<String>, - pub direction: PaneDirection, - #[serde(default, skip_serializing_if = "Option::is_none")] - pub amount: Option<f32>, -} - -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Default)] -pub struct PaneListParams { - #[serde(default, skip_serializing_if = "Option::is_none")] - pub workspace_id: Option<String>, -} - -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] -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)] -pub struct PaneSendTextParams { - pub pane_id: String, - pub text: String, -} - -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] -pub struct PaneSendKeysParams { - pub pane_id: String, - pub keys: Vec<String>, -} - -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] -pub struct PaneSendInputParams { - pub pane_id: String, - #[serde(default, skip_serializing_if = "String::is_empty")] - pub text: String, - #[serde(default, skip_serializing_if = "Vec::is_empty")] - pub keys: Vec<String>, -} - #[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)] pub struct ServerLiveHandoffParams { #[serde(default, skip_serializing_if = "Option::is_none")] @@ -396,97 +290,6 @@ pub struct ServerLiveHandoffParams { pub expected_version: Option<String>, } -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] -pub struct PaneReadParams { - pub pane_id: String, - pub source: ReadSource, - #[serde(default, skip_serializing_if = "Option::is_none")] - pub lines: Option<u32>, - #[serde(default)] - pub format: ReadFormat, - #[serde(default = "default_true")] - pub strip_ansi: bool, -} - -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] -pub struct PaneReportAgentParams { - pub pane_id: String, - pub source: String, - pub agent: String, - pub state: PaneAgentState, - #[serde(default, skip_serializing_if = "Option::is_none")] - pub message: Option<String>, - #[serde(default, skip_serializing_if = "Option::is_none")] - pub custom_status: Option<String>, - #[serde(default, skip_serializing_if = "Option::is_none")] - pub seq: Option<u64>, - #[serde(default, skip_serializing_if = "Option::is_none")] - pub agent_session_id: Option<String>, - #[serde(default, skip_serializing_if = "Option::is_none")] - pub agent_session_path: Option<String>, -} - -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] -pub struct PaneReportAgentSessionParams { - pub pane_id: String, - pub source: String, - pub agent: String, - #[serde(default, skip_serializing_if = "Option::is_none")] - pub seq: Option<u64>, - #[serde(default, skip_serializing_if = "Option::is_none")] - pub agent_session_id: Option<String>, - #[serde(default, skip_serializing_if = "Option::is_none")] - pub agent_session_path: Option<String>, -} - -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] -pub struct PaneReportMetadataParams { - pub pane_id: String, - pub source: String, - #[serde(default, skip_serializing_if = "Option::is_none")] - pub agent: Option<String>, - #[serde(default, skip_serializing_if = "Option::is_none")] - pub applies_to_source: Option<String>, - #[serde(default, skip_serializing_if = "Option::is_none")] - pub title: Option<String>, - #[serde(default, skip_serializing_if = "Option::is_none")] - pub display_agent: Option<String>, - #[serde(default, skip_serializing_if = "Option::is_none")] - pub custom_status: Option<String>, - #[serde(default, skip_serializing_if = "HashMap::is_empty")] - pub state_labels: HashMap<String, String>, - #[serde(default)] - pub clear_title: bool, - #[serde(default)] - pub clear_display_agent: bool, - #[serde(default)] - pub clear_custom_status: bool, - #[serde(default)] - pub clear_state_labels: bool, - #[serde(default, skip_serializing_if = "Option::is_none")] - pub seq: Option<u64>, - #[serde(default, skip_serializing_if = "Option::is_none")] - pub ttl_ms: Option<u64>, -} - -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] -pub struct PaneClearAgentAuthorityParams { - pub pane_id: String, - #[serde(default, skip_serializing_if = "Option::is_none")] - pub source: Option<String>, - #[serde(default, skip_serializing_if = "Option::is_none")] - pub seq: Option<u64>, -} - -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] -pub struct PaneReleaseAgentParams { - pub pane_id: String, - pub source: String, - pub agent: String, - #[serde(default, skip_serializing_if = "Option::is_none")] - pub seq: Option<u64>, -} - #[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] #[serde(rename_all = "snake_case")] pub enum ReadSource { @@ -793,6 +596,9 @@ pub enum ResponseResult { PaneSwap { swap: PaneSwapResult, }, + PaneZoom { + zoom: PaneZoomResult, + }, PaneLayout { layout: PaneLayoutSnapshot, }, @@ -924,142 +730,6 @@ pub struct AgentInfo { } #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] -pub struct PaneInfo { - pub pane_id: String, - pub terminal_id: String, - pub workspace_id: String, - pub tab_id: String, - pub focused: bool, - #[serde(default, skip_serializing_if = "Option::is_none")] - pub cwd: Option<String>, - #[serde(default, skip_serializing_if = "Option::is_none")] - pub foreground_cwd: Option<String>, - #[serde(default, skip_serializing_if = "Option::is_none")] - pub label: Option<String>, - #[serde(default, skip_serializing_if = "Option::is_none")] - pub agent: Option<String>, - #[serde(default, skip_serializing_if = "Option::is_none")] - pub title: Option<String>, - #[serde(default, skip_serializing_if = "Option::is_none")] - pub display_agent: Option<String>, - pub agent_status: AgentStatus, - #[serde(default, skip_serializing_if = "Option::is_none")] - pub custom_status: Option<String>, - #[serde(default, skip_serializing_if = "HashMap::is_empty")] - pub state_labels: HashMap<String, String>, - #[serde(default, skip_serializing_if = "Option::is_none")] - pub agent_session: Option<AgentSessionInfo>, - pub revision: u64, -} - -#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] -pub struct PaneSwapResult { - pub changed: bool, - #[serde(default, skip_serializing_if = "Option::is_none")] - pub reason: Option<PaneSwapReason>, - pub source_pane_id: String, - #[serde(default, skip_serializing_if = "Option::is_none")] - pub target_pane_id: Option<String>, - pub focused_pane_id: String, - pub layout: PaneLayoutSnapshot, -} - -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] -#[serde(rename_all = "snake_case")] -pub enum PaneSwapReason { - NoNeighbor, - SamePane, - NotFound, - CrossTab, -} - -#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] -pub struct PaneLayoutSnapshot { - pub workspace_id: String, - pub tab_id: String, - pub zoomed: bool, - pub area: PaneLayoutRect, - pub focused_pane_id: String, - pub panes: Vec<PaneLayoutPane>, - pub splits: Vec<PaneLayoutSplit>, -} - -#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] -pub struct PaneLayoutRect { - pub x: u16, - pub y: u16, - pub width: u16, - pub height: u16, -} - -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] -pub struct PaneLayoutPane { - pub pane_id: String, - pub focused: bool, - pub rect: PaneLayoutRect, -} - -#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] -pub struct PaneLayoutSplit { - pub id: String, - pub direction: SplitDirection, - pub ratio: f32, - pub rect: PaneLayoutRect, -} - -#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] -pub struct PaneNeighborResult { - pub pane_id: String, - pub direction: PaneDirection, - #[serde(default, skip_serializing_if = "Option::is_none")] - pub neighbor_pane_id: Option<String>, - pub layout: PaneLayoutSnapshot, -} - -#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] -pub struct PaneEdgesResult { - pub pane_id: String, - pub left: bool, - pub right: bool, - pub up: bool, - pub down: bool, - pub layout: PaneLayoutSnapshot, -} - -#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] -pub struct PaneFocusDirectionResult { - pub changed: bool, - #[serde(default, skip_serializing_if = "Option::is_none")] - pub reason: Option<PaneFocusDirectionReason>, - pub source_pane_id: String, - #[serde(default, skip_serializing_if = "Option::is_none")] - pub focused_pane_id: Option<String>, - pub layout: PaneLayoutSnapshot, -} - -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] -#[serde(rename_all = "snake_case")] -pub enum PaneFocusDirectionReason { - NoNeighbor, -} - -#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] -pub struct PaneResizeResult { - pub changed: bool, - #[serde(default, skip_serializing_if = "Option::is_none")] - pub reason: Option<PaneResizeReason>, - pub pane_id: String, - pub focused_pane_id: String, - pub layout: PaneLayoutSnapshot, -} - -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] -#[serde(rename_all = "snake_case")] -pub enum PaneResizeReason { - Unchanged, -} - -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] pub struct AgentSessionInfo { pub source: String, pub agent: String, @@ -1068,18 +738,6 @@ pub struct AgentSessionInfo { } #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] -pub struct PaneReadResult { - pub pane_id: String, - pub workspace_id: String, - pub tab_id: String, - pub source: ReadSource, - pub format: ReadFormat, - pub text: String, - pub revision: u64, - pub truncated: bool, -} - -#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] pub struct IntegrationInstallResult { pub messages: Vec<String>, } diff --git a/src/api/schema/panes.rs b/src/api/schema/panes.rs new file mode 100644 index 00000000..6a1827a2 --- /dev/null +++ b/src/api/schema/panes.rs @@ -0,0 +1,394 @@ +use std::collections::HashMap; + +use serde::{Deserialize, Serialize}; + +use super::{AgentSessionInfo, AgentStatus, PaneAgentState, ReadFormat, ReadSource}; + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct PaneSplitParams { + #[serde(default, skip_serializing_if = "Option::is_none")] + pub workspace_id: Option<String>, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub target_pane_id: Option<String>, + pub direction: SplitDirection, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub ratio: Option<f32>, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub cwd: Option<String>, + #[serde(default)] + pub focus: bool, +} + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "snake_case")] +pub enum SplitDirection { + Right, + Down, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "snake_case")] +pub enum PaneDirection { + Left, + Right, + Up, + Down, +} + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Default)] +pub struct PaneSwapParams { + #[serde(default, skip_serializing_if = "Option::is_none")] + pub pane_id: Option<String>, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub direction: Option<PaneDirection>, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub source_pane_id: Option<String>, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub target_pane_id: Option<String>, +} + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Default)] +pub struct PaneZoomParams { + #[serde(default, skip_serializing_if = "Option::is_none")] + pub pane_id: Option<String>, + #[serde(default)] + pub mode: PaneZoomMode, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default)] +#[serde(rename_all = "snake_case")] +pub enum PaneZoomMode { + #[default] + Toggle, + On, + Off, +} + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Default)] +pub struct PaneLayoutParams { + #[serde(default, skip_serializing_if = "Option::is_none")] + pub pane_id: Option<String>, +} + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +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)] +pub struct PaneEdgesParams { + #[serde(default, skip_serializing_if = "Option::is_none")] + pub pane_id: Option<String>, +} + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +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)] +pub struct PaneResizeParams { + #[serde(default, skip_serializing_if = "Option::is_none")] + pub pane_id: Option<String>, + pub direction: PaneDirection, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub amount: Option<f32>, +} + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Default)] +pub struct PaneListParams { + #[serde(default, skip_serializing_if = "Option::is_none")] + pub workspace_id: Option<String>, +} + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +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)] +pub struct PaneSendTextParams { + pub pane_id: String, + pub text: String, +} + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +pub struct PaneSendKeysParams { + pub pane_id: String, + pub keys: Vec<String>, +} + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +pub struct PaneSendInputParams { + pub pane_id: String, + #[serde(default, skip_serializing_if = "String::is_empty")] + pub text: String, + #[serde(default, skip_serializing_if = "Vec::is_empty")] + pub keys: Vec<String>, +} + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +pub struct PaneReadParams { + pub pane_id: String, + pub source: ReadSource, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub lines: Option<u32>, + #[serde(default)] + pub format: ReadFormat, + #[serde(default = "super::default_true")] + pub strip_ansi: bool, +} + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +pub struct PaneReportAgentParams { + pub pane_id: String, + pub source: String, + pub agent: String, + pub state: PaneAgentState, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub message: Option<String>, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub custom_status: Option<String>, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub seq: Option<u64>, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub agent_session_id: Option<String>, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub agent_session_path: Option<String>, +} + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +pub struct PaneReportAgentSessionParams { + pub pane_id: String, + pub source: String, + pub agent: String, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub seq: Option<u64>, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub agent_session_id: Option<String>, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub agent_session_path: Option<String>, +} + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +pub struct PaneReportMetadataParams { + pub pane_id: String, + pub source: String, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub agent: Option<String>, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub applies_to_source: Option<String>, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub title: Option<String>, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub display_agent: Option<String>, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub custom_status: Option<String>, + #[serde(default, skip_serializing_if = "HashMap::is_empty")] + pub state_labels: HashMap<String, String>, + #[serde(default)] + pub clear_title: bool, + #[serde(default)] + pub clear_display_agent: bool, + #[serde(default)] + pub clear_custom_status: bool, + #[serde(default)] + pub clear_state_labels: bool, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub seq: Option<u64>, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub ttl_ms: Option<u64>, +} + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +pub struct PaneClearAgentAuthorityParams { + pub pane_id: String, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub source: Option<String>, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub seq: Option<u64>, +} + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +pub struct PaneReleaseAgentParams { + pub pane_id: String, + pub source: String, + pub agent: String, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub seq: Option<u64>, +} + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +pub struct PaneInfo { + pub pane_id: String, + pub terminal_id: String, + pub workspace_id: String, + pub tab_id: String, + pub focused: bool, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub cwd: Option<String>, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub foreground_cwd: Option<String>, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub label: Option<String>, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub agent: Option<String>, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub title: Option<String>, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub display_agent: Option<String>, + pub agent_status: AgentStatus, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub custom_status: Option<String>, + #[serde(default, skip_serializing_if = "HashMap::is_empty")] + pub state_labels: HashMap<String, String>, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub agent_session: Option<AgentSessionInfo>, + pub revision: u64, +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct PaneSwapResult { + pub changed: bool, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub reason: Option<PaneSwapReason>, + pub source_pane_id: String, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub target_pane_id: Option<String>, + pub focused_pane_id: String, + pub layout: PaneLayoutSnapshot, +} + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "snake_case")] +pub enum PaneSwapReason { + NoNeighbor, + SamePane, + NotFound, + CrossTab, +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct PaneZoomResult { + pub changed: bool, + pub zoom_changed: bool, + pub focus_changed: bool, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub reason: Option<PaneZoomReason>, + pub pane_id: String, + pub focused_pane_id: String, + pub zoomed: bool, + pub layout: PaneLayoutSnapshot, +} + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "snake_case")] +pub enum PaneZoomReason { + SinglePane, + AlreadyZoomed, + AlreadyUnzoomed, +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct PaneLayoutSnapshot { + pub workspace_id: String, + pub tab_id: String, + pub zoomed: bool, + pub area: PaneLayoutRect, + pub focused_pane_id: String, + pub panes: Vec<PaneLayoutPane>, + pub splits: Vec<PaneLayoutSplit>, +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] +pub struct PaneLayoutRect { + pub x: u16, + pub y: u16, + pub width: u16, + pub height: u16, +} + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +pub struct PaneLayoutPane { + pub pane_id: String, + pub focused: bool, + pub rect: PaneLayoutRect, +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct PaneLayoutSplit { + pub id: String, + pub direction: SplitDirection, + pub ratio: f32, + pub rect: PaneLayoutRect, +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct PaneNeighborResult { + pub pane_id: String, + pub direction: PaneDirection, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub neighbor_pane_id: Option<String>, + pub layout: PaneLayoutSnapshot, +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct PaneEdgesResult { + pub pane_id: String, + pub left: bool, + pub right: bool, + pub up: bool, + pub down: bool, + pub layout: PaneLayoutSnapshot, +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct PaneFocusDirectionResult { + pub changed: bool, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub reason: Option<PaneFocusDirectionReason>, + pub source_pane_id: String, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub focused_pane_id: Option<String>, + pub layout: PaneLayoutSnapshot, +} + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "snake_case")] +pub enum PaneFocusDirectionReason { + NoNeighbor, +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct PaneResizeResult { + pub changed: bool, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub reason: Option<PaneResizeReason>, + pub pane_id: String, + pub focused_pane_id: String, + pub layout: PaneLayoutSnapshot, +} + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "snake_case")] +pub enum PaneResizeReason { + Unchanged, +} + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +pub struct PaneReadResult { + pub pane_id: String, + pub workspace_id: String, + pub tab_id: String, + pub source: ReadSource, + pub format: ReadFormat, + pub text: String, + pub revision: u64, + pub truncated: bool, +} diff --git a/src/api/server.rs b/src/api/server.rs index 44bb3097..7e4dc3b1 100644 --- a/src/api/server.rs +++ b/src/api/server.rs @@ -296,6 +296,7 @@ fn api_method_name(method: &Method) -> &'static str { Method::AgentStart(_) => "agent.start", Method::PaneSplit(_) => "pane.split", Method::PaneSwap(_) => "pane.swap", + Method::PaneZoom(_) => "pane.zoom", Method::PaneLayout(_) => "pane.layout", Method::PaneNeighbor(_) => "pane.neighbor", Method::PaneEdges(_) => "pane.edges", |
