Skip to main content

wrightty_protocol/
events.rs

1use serde::{Deserialize, Serialize};
2
3use crate::types::{CursorShape, Rgb, ScreenRegion, SessionId};
4
5/// Common event envelope sent to clients.
6#[derive(Debug, Clone, Serialize, Deserialize)]
7#[serde(rename_all = "camelCase")]
8pub struct EventEnvelope {
9    pub subscription_id: String,
10    pub event: String,
11    pub session_id: SessionId,
12    pub timestamp: u64,
13    pub data: serde_json::Value,
14}
15
16// --- Tier 1: Core events ---
17
18#[derive(Debug, Clone, Serialize, Deserialize)]
19#[serde(rename_all = "camelCase")]
20pub struct ScreenUpdated {
21    #[serde(skip_serializing_if = "Option::is_none")]
22    pub dirty_region: Option<ScreenRegion>,
23}
24
25#[derive(Debug, Clone, Serialize, Deserialize)]
26#[serde(rename_all = "camelCase")]
27pub struct SessionExited {
28    pub exit_code: Option<i32>,
29    pub signal: Option<String>,
30}
31
32#[derive(Debug, Clone, Serialize, Deserialize)]
33pub struct SessionOutput {
34    pub data: String, // base64
35}
36
37#[derive(Debug, Clone, Serialize, Deserialize)]
38pub struct TerminalBell {}
39
40#[derive(Debug, Clone, Serialize, Deserialize)]
41#[serde(rename_all = "camelCase")]
42pub struct TerminalTitleChanged {
43    pub title: String,
44    #[serde(skip_serializing_if = "Option::is_none")]
45    pub icon_name: Option<String>,
46}
47
48#[derive(Debug, Clone, Serialize, Deserialize)]
49#[serde(rename_all = "camelCase")]
50pub struct TerminalCwdChanged {
51    pub cwd: String,
52    #[serde(skip_serializing_if = "Option::is_none")]
53    pub uri: Option<String>,
54}
55
56#[derive(Debug, Clone, Serialize, Deserialize)]
57#[serde(rename_all = "camelCase")]
58pub struct TerminalAlternateScreen {
59    pub active: bool,
60}
61
62#[derive(Debug, Clone, Serialize, Deserialize)]
63#[serde(rename_all = "camelCase")]
64pub struct TerminalCursorChanged {
65    pub visible: bool,
66    pub shape: CursorShape,
67    pub blinking: bool,
68}
69
70// --- Tier 2: Shell integration ---
71
72#[derive(Debug, Clone, Serialize, Deserialize)]
73pub struct ShellPromptStart {}
74
75#[derive(Debug, Clone, Serialize, Deserialize)]
76pub struct ShellCommandStart {}
77
78#[derive(Debug, Clone, Serialize, Deserialize)]
79#[serde(rename_all = "camelCase")]
80pub struct ShellOutputStart {
81    #[serde(skip_serializing_if = "Option::is_none")]
82    pub command: Option<String>,
83}
84
85#[derive(Debug, Clone, Serialize, Deserialize)]
86#[serde(rename_all = "camelCase")]
87pub struct ShellCommandFinished {
88    pub exit_code: i32,
89}
90
91// --- Tier 2: Notifications ---
92
93#[derive(Debug, Clone, Serialize, Deserialize)]
94#[serde(rename_all = "camelCase")]
95pub struct TerminalNotification {
96    pub title: String,
97    #[serde(skip_serializing_if = "Option::is_none")]
98    pub body: Option<String>,
99    pub urgency: String,
100    pub source: String,
101}
102
103#[derive(Debug, Clone, Serialize, Deserialize)]
104#[serde(rename_all = "camelCase")]
105pub struct TerminalClipboardSet {
106    pub selection: String,
107    pub text: String,
108    pub base64: String,
109}
110
111#[derive(Debug, Clone, Serialize, Deserialize)]
112#[serde(rename_all = "camelCase")]
113pub struct TerminalProgressChanged {
114    pub state: String,
115    #[serde(skip_serializing_if = "Option::is_none")]
116    pub percent: Option<u8>,
117}
118
119#[derive(Debug, Clone, Serialize, Deserialize)]
120#[serde(rename_all = "camelCase")]
121pub struct TerminalModeChanged {
122    pub mode: String,
123    pub enabled: bool,
124}
125
126// --- Tier 3: Extended ---
127
128#[derive(Debug, Clone, Serialize, Deserialize)]
129pub struct TerminalFocusChanged {
130    pub focused: bool,
131}
132
133#[derive(Debug, Clone, Serialize, Deserialize)]
134#[serde(rename_all = "camelCase")]
135pub struct TerminalColorPaletteChanged {
136    pub changes: std::collections::HashMap<String, Rgb>,
137    pub source: String,
138}