use std::collections::HashMap; use serde::{Deserialize, Serialize}; use super::agents::AgentSessionInfo; use super::common::{AgentStatus, PaneAgentState, ReadFormat, ReadSource, SplitDirection}; #[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, #[serde(default, skip_serializing_if = "HashMap::is_empty")] pub env: HashMap, } #[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, Serialize, Deserialize)] pub struct PaneMoveParams { pub pane_id: String, pub destination: PaneMoveDestination, #[serde(default)] pub focus: bool, } #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] #[serde(tag = "type", rename_all = "snake_case")] pub enum PaneMoveDestination { Tab { tab_id: String, #[serde(default, skip_serializing_if = "Option::is_none")] target_pane_id: Option, split: SplitDirection, #[serde(default, skip_serializing_if = "Option::is_none")] ratio: Option, }, NewTab { #[serde(default, skip_serializing_if = "Option::is_none")] workspace_id: Option, #[serde(default, skip_serializing_if = "Option::is_none")] label: Option, }, NewWorkspace { #[serde(default, skip_serializing_if = "Option::is_none")] label: Option, #[serde(default, skip_serializing_if = "Option::is_none")] tab_label: 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, Default)] pub struct PaneProcessInfoParams { #[serde(default, skip_serializing_if = "Option::is_none")] pub pane_id: Option, } #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Default)] pub struct LayoutExportParams { #[serde(default, skip_serializing_if = "Option::is_none")] pub tab_id: Option, #[serde(default, skip_serializing_if = "Option::is_none")] pub pane_id: Option, } #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] pub struct LayoutApplyParams { #[serde(default, skip_serializing_if = "Option::is_none")] pub workspace_id: Option, #[serde(default, skip_serializing_if = "Option::is_none")] pub tab_id: Option, #[serde(default, skip_serializing_if = "Option::is_none")] pub tab_label: Option, #[serde(default)] pub focus: bool, pub root: LayoutNode, } #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] pub struct LayoutSetSplitRatioParams { #[serde(default, skip_serializing_if = "Option::is_none")] pub tab_id: Option, #[serde(default, skip_serializing_if = "Option::is_none")] pub pane_id: Option, pub path: Vec, pub ratio: f32, } #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] pub struct LayoutDescription { pub workspace_id: String, pub tab_id: String, pub zoomed: bool, pub focused_pane_id: String, pub root: LayoutNode, } #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] #[serde(tag = "type", rename_all = "snake_case")] pub enum LayoutNode { Pane { #[serde(flatten)] pane: LayoutPane, }, Split { direction: SplitDirection, ratio: f32, first: Box, second: Box, }, } #[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)] pub struct LayoutPane { #[serde(default, skip_serializing_if = "Option::is_none")] pub pane_id: Option, #[serde(default, skip_serializing_if = "Option::is_none")] pub label: Option, #[serde(default, skip_serializing_if = "Option::is_none")] pub cwd: Option, #[serde(default, skip_serializing_if = "Option::is_none")] pub command: Option>, #[serde(default, skip_serializing_if = "HashMap::is_empty")] pub env: HashMap, } #[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, Default)] pub struct PaneCurrentParams { #[serde(default, skip_serializing_if = "Option::is_none")] pub caller_pane_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, #[serde(default, skip_serializing_if = "Option::is_none")] pub session_start_source: 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, Eq, Serialize, Deserialize)] pub struct PaneProcessInfo { pub pane_id: String, #[serde(default, skip_serializing_if = "Option::is_none")] pub shell_pid: Option, #[serde(default, skip_serializing_if = "Option::is_none")] pub foreground_process_group_id: Option, #[serde(default, skip_serializing_if = "Option::is_none")] pub tty: Option, #[serde(default, skip_serializing_if = "Vec::is_empty")] pub foreground_processes: Vec, } #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] pub struct PaneProcessInfoProcess { pub pid: u32, pub name: String, #[serde(default, skip_serializing_if = "Option::is_none")] pub argv0: Option, #[serde(default, skip_serializing_if = "Option::is_none")] pub argv: Option>, #[serde(default, skip_serializing_if = "Option::is_none")] pub cmdline: Option, #[serde(default, skip_serializing_if = "Option::is_none")] pub cwd: Option, } #[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 PaneMoveResult { pub changed: bool, #[serde(default, skip_serializing_if = "Option::is_none")] pub reason: Option, pub previous_pane_id: String, pub previous_workspace_id: String, pub previous_tab_id: String, pub pane: Box, #[serde(default, skip_serializing_if = "Option::is_none")] pub source_layout: Option>, pub target_layout: Box, #[serde(default, skip_serializing_if = "Option::is_none")] pub created_workspace: Option, #[serde(default, skip_serializing_if = "Option::is_none")] pub created_tab: Option, #[serde(default, skip_serializing_if = "Option::is_none")] pub closed_workspace_id: Option, #[serde(default, skip_serializing_if = "Option::is_none")] pub closed_tab_id: Option, pub focused_pane_id: String, } #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] #[serde(rename_all = "snake_case")] pub enum PaneMoveReason { SameTab, ZoomedTab, } #[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, }