pulseengine_mcp_protocol/
ui.rs1use serde::{Deserialize, Serialize};
7use std::collections::HashMap;
8
9#[derive(Debug, Clone, Serialize, Deserialize, Eq, PartialEq)]
11#[serde(rename_all = "lowercase")]
12pub enum ThemePreference {
13 Light,
14 Dark,
15 System,
16}
17
18#[derive(Debug, Clone, Serialize, Deserialize, Eq, PartialEq)]
20#[serde(rename_all = "lowercase")]
21pub enum DisplayMode {
22 Inline,
23 Fullscreen,
24 Pip, Carousel,
26}
27
28#[derive(Debug, Clone, Serialize, Deserialize, Eq, PartialEq)]
30#[serde(rename_all = "lowercase")]
31pub enum PlatformType {
32 Desktop,
33 Mobile,
34 Web,
35 Embedded,
36}
37
38#[derive(Debug, Clone, Serialize, Deserialize)]
40pub struct Viewport {
41 pub width: u32,
42 pub height: u32,
43}
44
45#[derive(Debug, Clone, Serialize, Deserialize, Default)]
47pub struct DeviceCapabilities {
48 #[serde(skip_serializing_if = "Option::is_none")]
50 pub touch: Option<bool>,
51
52 #[serde(skip_serializing_if = "Option::is_none")]
54 pub hover: Option<bool>,
55
56 #[serde(skip_serializing_if = "Option::is_none")]
58 pub keyboard: Option<bool>,
59}
60
61#[derive(Debug, Clone, Serialize, Deserialize)]
63pub struct ToolContext {
64 pub name: String,
66
67 #[serde(rename = "inputSchema")]
69 pub input_schema: serde_json::Value,
70
71 #[serde(rename = "outputSchema", skip_serializing_if = "Option::is_none")]
73 pub output_schema: Option<serde_json::Value>,
74
75 #[serde(rename = "requestId", skip_serializing_if = "Option::is_none")]
77 pub request_id: Option<String>,
78
79 #[serde(skip_serializing_if = "Option::is_none")]
81 pub arguments: Option<HashMap<String, serde_json::Value>>,
82}
83
84#[derive(Debug, Clone, Serialize, Deserialize)]
86pub struct UiInitializeParams {
87 #[serde(rename = "protocolVersion")]
89 pub protocol_version: String,
90
91 pub capabilities: UiCapabilities,
93
94 #[serde(rename = "uiInfo")]
96 pub ui_info: UiInfo,
97}
98
99#[derive(Debug, Clone, Serialize, Deserialize, Default)]
101pub struct UiCapabilities {
102 #[serde(skip_serializing_if = "Option::is_none")]
104 pub tools: Option<bool>,
105
106 #[serde(skip_serializing_if = "Option::is_none")]
108 pub resources: Option<bool>,
109
110 #[serde(skip_serializing_if = "Option::is_none")]
112 pub notifications: Option<bool>,
113}
114
115#[derive(Debug, Clone, Serialize, Deserialize)]
117pub struct UiInfo {
118 pub name: String,
120
121 pub version: String,
123}
124
125#[derive(Debug, Clone, Serialize, Deserialize)]
127pub struct UiInitializeResult {
128 #[serde(rename = "protocolVersion")]
130 pub protocol_version: String,
131
132 pub capabilities: UiHostCapabilities,
134
135 #[serde(rename = "hostInfo")]
137 pub host_info: UiHostInfo,
138
139 #[serde(skip_serializing_if = "Option::is_none")]
141 pub tool: Option<ToolContext>,
142
143 #[serde(skip_serializing_if = "Option::is_none")]
145 pub theme: Option<ThemePreference>,
146
147 #[serde(rename = "displayMode", skip_serializing_if = "Option::is_none")]
149 pub display_mode: Option<DisplayMode>,
150
151 #[serde(skip_serializing_if = "Option::is_none")]
153 pub viewport: Option<Viewport>,
154
155 #[serde(skip_serializing_if = "Option::is_none")]
157 pub locale: Option<String>,
158
159 #[serde(skip_serializing_if = "Option::is_none")]
161 pub timezone: Option<String>,
162
163 #[serde(skip_serializing_if = "Option::is_none")]
165 pub platform: Option<PlatformType>,
166
167 #[serde(skip_serializing_if = "Option::is_none")]
169 pub device: Option<DeviceCapabilities>,
170}
171
172#[derive(Debug, Clone, Serialize, Deserialize, Default)]
174pub struct UiHostCapabilities {
175 #[serde(skip_serializing_if = "Option::is_none")]
177 pub tools: Option<bool>,
178
179 #[serde(skip_serializing_if = "Option::is_none")]
181 pub resources: Option<bool>,
182
183 #[serde(skip_serializing_if = "Option::is_none")]
185 pub notifications: Option<bool>,
186}
187
188#[derive(Debug, Clone, Serialize, Deserialize)]
190pub struct UiHostInfo {
191 pub name: String,
193
194 pub version: String,
196}
197
198#[derive(Debug, Clone, Serialize, Deserialize)]
200#[serde(tag = "method")]
201pub enum SandboxProxyMessage {
202 #[serde(rename = "ui/sandbox-ready")]
204 SandboxReady {
205 #[serde(rename = "resourceUri")]
206 resource_uri: String,
207 },
208
209 #[serde(rename = "ui/sandbox-resource-ready")]
211 SandboxResourceReady {
212 #[serde(rename = "resourceUri")]
213 resource_uri: String,
214 html: String,
215 },
216}
217
218#[derive(Debug, Clone, Serialize, Deserialize)]
220pub struct UiNotificationMessage {
221 #[serde(skip_serializing_if = "Option::is_none")]
223 pub level: Option<String>,
224
225 pub message: String,
227
228 #[serde(skip_serializing_if = "Option::is_none")]
230 pub data: Option<serde_json::Value>,
231}
232
233#[derive(Debug, Clone, Serialize, Deserialize)]
235pub struct UiInitializedNotification {
236 pub ready: bool,
238}