aboutsummaryrefslogtreecommitdiff
path: root/src/api
diff options
context:
space:
mode:
Diffstat (limited to 'src/api')
-rw-r--r--src/api/mod.rs1
-rw-r--r--src/api/schema.rs360
-rw-r--r--src/api/schema/panes.rs394
-rw-r--r--src/api/server.rs1
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",