use serde::{Deserialize, Serialize}; #[derive(Debug, Clone, Serialize, Deserialize)] pub struct SessionSummary { pub session_id: String, pub title: String, pub channel_name: String, pub chat_id: String, pub message_count: i64, pub last_active_at: i64, #[serde(default, skip_serializing_if = "Option::is_none")] pub archived_at: Option, } #[derive(Debug, Clone, Serialize, Deserialize)] pub struct SlashCommandInfo { pub name: String, pub description: String, pub aliases: Vec, } #[derive(Debug, Clone, Serialize, Deserialize)] #[serde(tag = "type")] pub enum WsInbound { #[serde(rename = "user_input")] UserInput { content: String, #[serde(default, skip_serializing_if = "Option::is_none")] channel: Option, #[serde(default, skip_serializing_if = "Option::is_none")] chat_id: Option, #[serde(default, skip_serializing_if = "Option::is_none")] sender_id: Option, }, #[serde(rename = "clear_history")] ClearHistory { #[serde(default, skip_serializing_if = "Option::is_none")] chat_id: Option, #[serde(default, skip_serializing_if = "Option::is_none")] session_id: Option, }, #[serde(rename = "create_session")] CreateSession { #[serde(default, skip_serializing_if = "Option::is_none")] title: Option, }, #[serde(rename = "list_sessions")] ListSessions { #[serde(default)] include_archived: bool, }, #[serde(rename = "load_session")] LoadSession { session_id: String }, #[serde(rename = "rename_session")] RenameSession { #[serde(default, skip_serializing_if = "Option::is_none")] session_id: Option, title: String, }, #[serde(rename = "archive_session")] ArchiveSession { #[serde(default, skip_serializing_if = "Option::is_none")] session_id: Option, }, #[serde(rename = "delete_session")] DeleteSession { #[serde(default, skip_serializing_if = "Option::is_none")] session_id: Option, }, #[serde(rename = "get_slash_commands")] GetSlashCommands, #[serde(rename = "ping")] Ping, } #[derive(Debug, Clone, Serialize, Deserialize)] #[serde(tag = "type")] pub enum WsOutbound { #[serde(rename = "assistant_response")] AssistantResponse { id: String, content: String, role: String, }, #[serde(rename = "error")] Error { code: String, message: String }, #[serde(rename = "session_established")] SessionEstablished { session_id: String }, #[serde(rename = "session_created")] SessionCreated { session_id: String, title: String }, #[serde(rename = "session_list")] SessionList { sessions: Vec, #[serde(default, skip_serializing_if = "Option::is_none")] current_session_id: Option, }, #[serde(rename = "session_loaded")] SessionLoaded { session_id: String, title: String, message_count: i64, }, #[serde(rename = "session_renamed")] SessionRenamed { session_id: String, title: String }, #[serde(rename = "session_archived")] SessionArchived { session_id: String }, #[serde(rename = "session_deleted")] SessionDeleted { session_id: String }, #[serde(rename = "history_cleared")] HistoryCleared { session_id: String }, #[serde(rename = "slash_commands_list")] SlashCommandsList { commands: Vec }, #[serde(rename = "pong")] Pong, #[serde(rename = "command_executed")] CommandExecuted { message: String }, #[serde(rename = "system_notification")] SystemNotification { content: String }, } pub fn parse_inbound(raw: &str) -> Result { serde_json::from_str(raw) } pub fn serialize_inbound(msg: &WsInbound) -> Result { serde_json::to_string(msg) } pub fn serialize_outbound(msg: &WsOutbound) -> Result { serde_json::to_string(msg) }