use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
pub fn default_cols() -> u16 {
120
}
pub fn default_rows() -> u16 {
40
}
#[derive(Debug, Clone, Deserialize, JsonSchema)]
pub struct ShellSessionCreateArgs {
pub target_id: String,
pub name: Option<String>,
pub shell: Option<String>,
#[serde(default = "default_cols")]
pub cols: u16,
#[serde(default = "default_rows")]
pub rows: u16,
pub client_id: Option<String>,
#[serde(default)]
pub env: HashMap<String, String>,
}
#[derive(Debug, Clone, Deserialize, JsonSchema)]
pub struct ShellSessionWriteArgs {
pub session_id: String,
pub input: String,
#[serde(default)]
pub newline: bool,
}
#[derive(Debug, Clone, Copy, Deserialize, Serialize, JsonSchema, Default, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum OutputFormat {
#[default]
Raw,
Screen,
Both,
Stripped,
}
#[derive(Debug, Clone, Deserialize, JsonSchema)]
pub struct ShellSessionReadArgs {
pub session_id: String,
#[serde(default)]
pub format: OutputFormat,
#[serde(default = "default_true")]
pub consume: bool,
#[serde(default)]
pub wait_ms: u64,
#[serde(default)]
pub min_bytes: usize,
#[serde(default)]
pub wait_for_pattern: Option<String>,
#[serde(default)]
pub wait_for_stable_ms: Option<u64>,
}
fn default_true() -> bool {
true
}
#[derive(Debug, Clone, Deserialize, JsonSchema)]
pub struct ShellSessionListArgs {
pub target_id: Option<String>,
pub client_id: Option<String>,
#[serde(default = "default_true")]
pub include_disconnected: bool,
}
#[derive(Debug, Clone, Deserialize, JsonSchema)]
pub struct ShellSessionReconnectArgs {
pub session_id: String,
}
#[derive(Debug, Clone, Deserialize, JsonSchema)]
pub struct ShellSessionResizeArgs {
pub session_id: String,
pub cols: u16,
pub rows: u16,
}
#[derive(Debug, Clone, Deserialize, JsonSchema)]
pub struct ShellSessionCloseArgs {
pub session_id: String,
#[serde(default)]
pub force: bool,
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum SessionState {
Active,
Disconnected,
Closed,
}
#[derive(Debug, Clone, Serialize, JsonSchema)]
pub struct ScreenState {
pub lines: Vec<String>,
pub cursor: (u16, u16),
pub size: (u16, u16),
pub alternate_screen: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub title: Option<String>,
}
#[derive(Debug, Clone, Serialize, JsonSchema)]
pub struct ShellSessionCreateResult {
pub session_id: String,
pub info: ShellSessionInfo,
pub screen: ScreenState,
}
#[derive(Debug, Clone, Serialize, JsonSchema)]
pub struct ShellSessionWriteResult {
pub session_id: String,
pub bytes_sent: usize,
}
#[derive(Debug, Clone, Serialize, JsonSchema)]
pub struct ShellSessionReadResult {
pub session_id: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub raw: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub screen: Option<ScreenState>,
pub buffer_size: usize,
pub truncated: bool,
pub state: SessionState,
#[serde(skip_serializing_if = "Option::is_none")]
pub pattern_matched: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub stabilized: Option<bool>,
}
#[derive(Debug, Clone, Serialize, JsonSchema)]
pub struct ShellSessionInfo {
pub id: String,
pub target_id: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub client_id: Option<String>,
pub state: SessionState,
pub created_at: String,
pub last_activity: String,
pub size: (u16, u16),
}
#[derive(Debug, Clone, Serialize, JsonSchema)]
pub struct ShellSessionListResult {
pub sessions: Vec<ShellSessionInfo>,
}
#[derive(Debug, Clone, Serialize, JsonSchema)]
pub struct ShellSessionReconnectResult {
pub session_id: String,
pub info: ShellSessionInfo,
pub screen: ScreenState,
}
#[derive(Debug, Clone, Serialize, JsonSchema)]
pub struct ShellSessionResizeResult {
pub session_id: String,
pub size: (u16, u16),
}
#[derive(Debug, Clone, Serialize, JsonSchema)]
pub struct ShellSessionCloseResult {
pub session_id: String,
pub closed: bool,
}