1use serde::{Deserialize, Serialize};
2use std::collections::HashMap;
3
4use crate::types::*;
5
6#[derive(Debug, Clone, Serialize, Deserialize)]
9pub struct GetInfoResult {
10 #[serde(flatten)]
11 pub info: ServerInfo,
12}
13
14#[derive(Debug, Clone, Serialize, Deserialize)]
17pub struct AuthenticateParams {
18 pub password: String,
19}
20
21#[derive(Debug, Clone, Serialize, Deserialize)]
22pub struct AuthenticateResult {
23 pub authenticated: bool,
24}
25
26#[derive(Debug, Clone, Serialize, Deserialize)]
29#[serde(rename_all = "camelCase")]
30pub struct SessionCreateParams {
31 #[serde(skip_serializing_if = "Option::is_none")]
32 pub shell: Option<String>,
33 #[serde(default, skip_serializing_if = "Vec::is_empty")]
34 pub args: Vec<String>,
35 #[serde(default = "default_cols")]
36 pub cols: u16,
37 #[serde(default = "default_rows")]
38 pub rows: u16,
39 #[serde(default, skip_serializing_if = "HashMap::is_empty")]
40 pub env: HashMap<String, String>,
41 #[serde(skip_serializing_if = "Option::is_none")]
42 pub cwd: Option<String>,
43}
44
45fn default_cols() -> u16 {
46 80
47}
48fn default_rows() -> u16 {
49 24
50}
51
52#[derive(Debug, Clone, Serialize, Deserialize)]
53#[serde(rename_all = "camelCase")]
54pub struct SessionCreateResult {
55 pub session_id: SessionId,
56}
57
58#[derive(Debug, Clone, Serialize, Deserialize)]
59#[serde(rename_all = "camelCase")]
60pub struct SessionDestroyParams {
61 pub session_id: SessionId,
62 #[serde(skip_serializing_if = "Option::is_none")]
63 pub signal: Option<String>,
64}
65
66#[derive(Debug, Clone, Serialize, Deserialize)]
67#[serde(rename_all = "camelCase")]
68pub struct SessionDestroyResult {
69 pub exit_code: Option<i32>,
70}
71
72#[derive(Debug, Clone, Serialize, Deserialize)]
73#[serde(rename_all = "camelCase")]
74pub struct SessionListResult {
75 pub sessions: Vec<SessionInfo>,
76}
77
78#[derive(Debug, Clone, Serialize, Deserialize)]
79#[serde(rename_all = "camelCase")]
80pub struct SessionGetInfoParams {
81 pub session_id: SessionId,
82}
83
84#[derive(Debug, Clone, Serialize, Deserialize)]
87#[serde(rename_all = "camelCase")]
88pub struct InputSendKeysParams {
89 pub session_id: SessionId,
90 pub keys: Vec<KeyInput>,
91}
92
93#[derive(Debug, Clone, Serialize, Deserialize)]
94#[serde(rename_all = "camelCase")]
95pub struct InputSendTextParams {
96 pub session_id: SessionId,
97 pub text: String,
98}
99
100#[derive(Debug, Clone, Serialize, Deserialize)]
101#[serde(rename_all = "camelCase")]
102pub struct InputSendMouseParams {
103 pub session_id: SessionId,
104 pub event: String,
105 pub button: String,
106 pub row: u32,
107 pub col: u32,
108 #[serde(default, skip_serializing_if = "Vec::is_empty")]
109 pub modifiers: Vec<Modifier>,
110}
111
112#[derive(Debug, Clone, Serialize, Deserialize)]
115#[serde(rename_all = "camelCase")]
116pub struct ScreenGetContentsParams {
117 pub session_id: SessionId,
118 #[serde(skip_serializing_if = "Option::is_none")]
119 pub region: Option<ScreenRegion>,
120}
121
122#[derive(Debug, Clone, Serialize, Deserialize)]
123#[serde(rename_all = "camelCase")]
124pub struct ScreenGetContentsResult {
125 pub rows: u32,
126 pub cols: u32,
127 pub cursor: CursorState,
128 pub cells: Vec<Vec<CellData>>,
129 pub alternate_screen: bool,
130}
131
132#[derive(Debug, Clone, Serialize, Deserialize)]
133#[serde(rename_all = "camelCase")]
134pub struct ScreenGetTextParams {
135 pub session_id: SessionId,
136 #[serde(skip_serializing_if = "Option::is_none")]
137 pub region: Option<ScreenRegion>,
138 #[serde(default = "default_true")]
139 pub trim_trailing_whitespace: bool,
140}
141
142fn default_true() -> bool {
143 true
144}
145
146#[derive(Debug, Clone, Serialize, Deserialize)]
147pub struct ScreenGetTextResult {
148 pub text: String,
149}
150
151#[derive(Debug, Clone, Serialize, Deserialize)]
152#[serde(rename_all = "camelCase")]
153pub struct ScreenGetScrollbackParams {
154 pub session_id: SessionId,
155 #[serde(default = "default_scrollback_lines")]
156 pub lines: u32,
157 #[serde(default)]
158 pub offset: u32,
159}
160
161fn default_scrollback_lines() -> u32 {
162 100
163}
164
165#[derive(Debug, Clone, Serialize, Deserialize)]
166#[serde(rename_all = "camelCase")]
167pub struct ScrollbackLine {
168 pub text: String,
169 pub line_number: i32,
170}
171
172#[derive(Debug, Clone, Serialize, Deserialize)]
173#[serde(rename_all = "camelCase")]
174pub struct ScreenGetScrollbackResult {
175 pub lines: Vec<ScrollbackLine>,
176 pub total_scrollback: u32,
177}
178
179#[derive(Debug, Clone, Serialize, Deserialize)]
180#[serde(rename_all = "camelCase")]
181pub struct ScreenScreenshotParams {
182 pub session_id: SessionId,
183 pub format: ScreenshotFormat,
184 #[serde(skip_serializing_if = "Option::is_none")]
185 pub theme: Option<serde_json::Value>,
186 #[serde(skip_serializing_if = "Option::is_none")]
187 pub font: Option<FontConfig>,
188}
189
190#[derive(Debug, Clone, Serialize, Deserialize)]
191pub struct FontConfig {
192 pub family: String,
193 pub size: u32,
194}
195
196#[derive(Debug, Clone, Serialize, Deserialize)]
197#[serde(rename_all = "camelCase")]
198pub struct ScreenScreenshotResult {
199 pub format: ScreenshotFormat,
200 pub data: String,
201 #[serde(skip_serializing_if = "Option::is_none")]
202 pub width: Option<u32>,
203 #[serde(skip_serializing_if = "Option::is_none")]
204 pub height: Option<u32>,
205}
206
207#[derive(Debug, Clone, Serialize, Deserialize)]
208#[serde(rename_all = "camelCase")]
209pub struct ScreenWaitForTextParams {
210 pub session_id: SessionId,
211 pub pattern: String,
212 #[serde(default)]
213 pub is_regex: bool,
214 #[serde(skip_serializing_if = "Option::is_none")]
215 pub region: Option<ScreenRegion>,
216 #[serde(default = "default_timeout")]
217 pub timeout: u64,
218 #[serde(default = "default_interval")]
219 pub interval: u64,
220}
221
222fn default_timeout() -> u64 {
223 30000
224}
225fn default_interval() -> u64 {
226 100
227}
228
229#[derive(Debug, Clone, Serialize, Deserialize)]
230#[serde(rename_all = "camelCase")]
231pub struct TextMatch {
232 pub text: String,
233 pub row: u32,
234 pub col: u32,
235 pub length: u32,
236}
237
238#[derive(Debug, Clone, Serialize, Deserialize)]
239#[serde(rename_all = "camelCase")]
240pub struct ScreenWaitForTextResult {
241 pub found: bool,
242 pub matches: Vec<TextMatch>,
243 pub elapsed: u64,
244}
245
246#[derive(Debug, Clone, Serialize, Deserialize)]
247#[serde(rename_all = "camelCase")]
248pub struct ScreenWaitForCursorParams {
249 pub session_id: SessionId,
250 #[serde(skip_serializing_if = "Option::is_none")]
251 pub row: Option<u32>,
252 #[serde(skip_serializing_if = "Option::is_none")]
253 pub col: Option<u32>,
254 #[serde(default = "default_timeout")]
255 pub timeout: u64,
256}
257
258#[derive(Debug, Clone, Serialize, Deserialize)]
259#[serde(rename_all = "camelCase")]
260pub struct ScreenWaitForCursorResult {
261 pub cursor: CursorState,
262 pub elapsed: u64,
263}
264
265#[derive(Debug, Clone, Serialize, Deserialize)]
268#[serde(rename_all = "camelCase")]
269pub struct TerminalResizeParams {
270 pub session_id: SessionId,
271 pub cols: u16,
272 pub rows: u16,
273}
274
275#[derive(Debug, Clone, Serialize, Deserialize)]
276#[serde(rename_all = "camelCase")]
277pub struct TerminalGetSizeParams {
278 pub session_id: SessionId,
279}
280
281#[derive(Debug, Clone, Serialize, Deserialize)]
282pub struct TerminalGetSizeResult {
283 pub cols: u16,
284 pub rows: u16,
285}
286
287#[derive(Debug, Clone, Serialize, Deserialize)]
288#[serde(rename_all = "camelCase")]
289pub struct TerminalSetColorPaletteParams {
290 pub session_id: SessionId,
291 pub palette: ColorPalette,
292}
293
294#[derive(Debug, Clone, Serialize, Deserialize)]
295#[serde(rename_all = "camelCase")]
296pub struct TerminalGetModesParams {
297 pub session_id: SessionId,
298}
299
300#[derive(Debug, Clone, Serialize, Deserialize)]
303#[serde(rename_all = "camelCase")]
304pub struct EventsSubscribeParams {
305 pub session_id: SessionId,
306 pub events: Vec<String>,
307 #[serde(skip_serializing_if = "Option::is_none")]
308 pub options: Option<EventsSubscribeOptions>,
309}
310
311#[derive(Debug, Clone, Serialize, Deserialize)]
312#[serde(rename_all = "camelCase")]
313pub struct EventsSubscribeOptions {
314 #[serde(default = "default_debounce")]
315 pub screen_debounce_ms: u64,
316}
317
318fn default_debounce() -> u64 {
319 16
320}
321
322#[derive(Debug, Clone, Serialize, Deserialize)]
323#[serde(rename_all = "camelCase")]
324pub struct EventsSubscribeResult {
325 pub subscription_id: String,
326 pub subscribed_events: Vec<String>,
327}
328
329#[derive(Debug, Clone, Serialize, Deserialize)]
330#[serde(rename_all = "camelCase")]
331pub struct EventsUnsubscribeParams {
332 pub subscription_id: String,
333}