From b7619db085eb4054a071b51159eda65d6b60f3fe Mon Sep 17 00:00:00 2001 From: Ogulcan Celik Date: Sat, 6 Jun 2026 00:41:19 +0300 Subject: feat: expose pane zoom api --- src/api/schema/panes.rs | 394 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 394 insertions(+) create mode 100644 src/api/schema/panes.rs (limited to 'src/api/schema/panes.rs') 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, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub target_pane_id: Option, + pub direction: SplitDirection, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub ratio: Option, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub cwd: Option, + #[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, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub direction: Option, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub source_pane_id: Option, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub target_pane_id: Option, +} + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Default)] +pub struct PaneZoomParams { + #[serde(default, skip_serializing_if = "Option::is_none")] + pub pane_id: Option, + #[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, +} + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +pub struct PaneNeighborParams { + #[serde(default, skip_serializing_if = "Option::is_none")] + pub pane_id: Option, + 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, +} + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +pub struct PaneFocusDirectionParams { + #[serde(default, skip_serializing_if = "Option::is_none")] + pub pane_id: Option, + pub direction: PaneDirection, +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct PaneResizeParams { + #[serde(default, skip_serializing_if = "Option::is_none")] + pub pane_id: Option, + pub direction: PaneDirection, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub amount: Option, +} + +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Default)] +pub struct PaneListParams { + #[serde(default, skip_serializing_if = "Option::is_none")] + pub workspace_id: Option, +} + +#[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, +} + +#[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, +} + +#[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, +} + +#[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, + #[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, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub custom_status: Option, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub seq: Option, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub agent_session_id: Option, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub agent_session_path: Option, +} + +#[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, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub agent_session_id: Option, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub agent_session_path: Option, +} + +#[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, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub applies_to_source: Option, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub title: Option, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub display_agent: Option, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub custom_status: Option, + #[serde(default, skip_serializing_if = "HashMap::is_empty")] + pub state_labels: HashMap, + #[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, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub ttl_ms: Option, +} + +#[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, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub seq: Option, +} + +#[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, +} + +#[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, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub foreground_cwd: Option, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub label: Option, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub agent: Option, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub title: Option, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub display_agent: Option, + pub agent_status: AgentStatus, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub custom_status: Option, + #[serde(default, skip_serializing_if = "HashMap::is_empty")] + pub state_labels: HashMap, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub agent_session: Option, + 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, + pub source_pane_id: String, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub target_pane_id: Option, + 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, + 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, + pub splits: Vec, +} + +#[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, + 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, + pub source_pane_id: String, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub focused_pane_id: Option, + 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, + 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, +} -- cgit v1.2.3