mirror of
https://github.com/herdrdev/herdr.git
synced 2026-09-22 00:01:06 +00:00
395 lines
12 KiB
Rust
395 lines
12 KiB
Rust
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,
|
|
}
|