use serde::{Deserialize, Serialize};
use std::collections::HashMap;
#[derive(Debug, Clone, Serialize, Deserialize, Eq, PartialEq)]
#[serde(rename_all = "lowercase")]
pub enum ThemePreference {
Light,
Dark,
System,
}
#[derive(Debug, Clone, Serialize, Deserialize, Eq, PartialEq)]
#[serde(rename_all = "lowercase")]
pub enum DisplayMode {
Inline,
Fullscreen,
Pip, Carousel,
}
#[derive(Debug, Clone, Serialize, Deserialize, Eq, PartialEq)]
#[serde(rename_all = "lowercase")]
pub enum PlatformType {
Desktop,
Mobile,
Web,
Embedded,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Viewport {
pub width: u32,
pub height: u32,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct DeviceCapabilities {
#[serde(skip_serializing_if = "Option::is_none")]
pub touch: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub hover: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub keyboard: Option<bool>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ToolContext {
pub name: String,
#[serde(rename = "inputSchema")]
pub input_schema: serde_json::Value,
#[serde(rename = "outputSchema", skip_serializing_if = "Option::is_none")]
pub output_schema: Option<serde_json::Value>,
#[serde(rename = "requestId", skip_serializing_if = "Option::is_none")]
pub request_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub arguments: Option<HashMap<String, serde_json::Value>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct UiInitializeParams {
#[serde(rename = "protocolVersion")]
pub protocol_version: String,
pub capabilities: UiCapabilities,
#[serde(rename = "uiInfo")]
pub ui_info: UiInfo,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct UiCapabilities {
#[serde(skip_serializing_if = "Option::is_none")]
pub tools: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub resources: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub notifications: Option<bool>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct UiInfo {
pub name: String,
pub version: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct UiInitializeResult {
#[serde(rename = "protocolVersion")]
pub protocol_version: String,
pub capabilities: UiHostCapabilities,
#[serde(rename = "hostInfo")]
pub host_info: UiHostInfo,
#[serde(skip_serializing_if = "Option::is_none")]
pub tool: Option<ToolContext>,
#[serde(skip_serializing_if = "Option::is_none")]
pub theme: Option<ThemePreference>,
#[serde(rename = "displayMode", skip_serializing_if = "Option::is_none")]
pub display_mode: Option<DisplayMode>,
#[serde(skip_serializing_if = "Option::is_none")]
pub viewport: Option<Viewport>,
#[serde(skip_serializing_if = "Option::is_none")]
pub locale: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub timezone: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub platform: Option<PlatformType>,
#[serde(skip_serializing_if = "Option::is_none")]
pub device: Option<DeviceCapabilities>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct UiHostCapabilities {
#[serde(skip_serializing_if = "Option::is_none")]
pub tools: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub resources: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub notifications: Option<bool>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct UiHostInfo {
pub name: String,
pub version: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "method")]
pub enum SandboxProxyMessage {
#[serde(rename = "ui/sandbox-ready")]
SandboxReady {
#[serde(rename = "resourceUri")]
resource_uri: String,
},
#[serde(rename = "ui/sandbox-resource-ready")]
SandboxResourceReady {
#[serde(rename = "resourceUri")]
resource_uri: String,
html: String,
},
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct UiNotificationMessage {
#[serde(skip_serializing_if = "Option::is_none")]
pub level: Option<String>,
pub message: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub data: Option<serde_json::Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct UiInitializedNotification {
pub ready: bool,
}