use serde::{Deserialize, Serialize}; use serde_json::Value; #[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct AiSession { pub session_id: String, pub workspace_id: String, #[serde(skip_serializing_if = "Option::is_none")] pub document_id: Option, pub owner: AiRuntimeOwner, } #[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "kebab-case")] pub enum AiRuntimeOwner { RustWebHermes, CompatReactIsland, } #[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] #[serde(rename_all = "camelCase")] pub struct AiToolCall { pub call_id: String, pub tool_name: String, pub args: Value, } #[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] #[serde(rename_all = "camelCase")] pub struct AiEvent { pub event_id: String, pub session_id: String, pub kind: AiEventKind, #[serde(default)] pub payload: Value, } #[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub enum AiEventKind { SessionCreated, ToolCallPlanned, ToolCallApplied, StructuredWriteCompleted, Error, } #[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct AiStructuredWriteResult { pub ok: bool, pub write_kind: AiStructuredWriteKind, pub command_name: String, #[serde(skip_serializing_if = "Option::is_none")] pub target_id: Option, #[serde(skip_serializing_if = "Option::is_none")] pub revision: Option, } #[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub enum AiStructuredWriteKind { SummaryNode, AiNoteNode, ReferenceEdge, PageBody, }