use serde::{Deserialize, Serialize};
use super::super::storage::SessionMeta;
#[derive(Debug, Deserialize)]
#[serde(tag = "type")]
pub enum WsInbound {
#[serde(rename = "send_message")]
SendMessage { content: String },
#[serde(rename = "tool_confirm")]
ToolConfirm {
action: String,
#[serde(default)]
reason: Option<String>,
},
#[serde(rename = "ask_response")]
AskResponse {
answers: std::collections::HashMap<String, String>,
},
#[serde(rename = "cancel")]
Cancel,
#[serde(rename = "sync")]
Sync,
#[serde(rename = "key_exchange")]
KeyExchange { client_pk: String },
#[serde(rename = "ping")]
Ping,
#[serde(rename = "list_sessions")]
ListSessions,
#[serde(rename = "switch_session")]
SwitchSession { session_id: String },
#[serde(rename = "new_session")]
NewSession,
}
#[derive(Debug, Clone, Serialize)]
#[serde(tag = "type")]
#[allow(dead_code)]
pub enum WsOutbound {
#[serde(rename = "stream_chunk")]
StreamChunk { content: String },
#[serde(rename = "message")]
Message { role: String, content: String },
#[serde(rename = "tool_confirm_request")]
ToolConfirmRequest { tools: Vec<ToolConfirmInfo> },
#[serde(rename = "ask_request")]
AskRequest { questions: Vec<AskQuestionInfo> },
#[serde(rename = "tool_call")]
ToolCall { name: String, arguments: String },
#[serde(rename = "tool_result")]
ToolResult {
name: String,
output: String,
is_error: bool,
},
#[serde(rename = "status")]
Status { state: String },
#[serde(rename = "session_sync")]
SessionSync {
messages: Vec<SyncMessage>,
status: String,
model: String,
},
#[serde(rename = "pong")]
Pong,
#[serde(rename = "server_hello")]
ServerHello { server_pk: String },
#[serde(rename = "key_exchange_ok")]
KeyExchangeOk,
#[serde(rename = "error")]
Error { message: String },
#[serde(rename = "session_list")]
SessionList { sessions: Vec<SessionMeta> },
#[serde(rename = "session_switched")]
SessionSwitched { session_id: String },
}
#[derive(Debug, Clone, Serialize)]
pub struct ToolConfirmInfo {
pub id: String,
pub name: String,
pub arguments: String,
pub confirm_message: String,
}
#[derive(Debug, Clone, Serialize)]
pub struct AskQuestionInfo {
pub question: String,
pub header: String,
pub options: Vec<AskOptionInfo>,
pub multi_select: bool,
}
#[derive(Debug, Clone, Serialize)]
pub struct AskOptionInfo {
pub label: String,
pub description: String,
}
#[derive(Debug, Clone, Serialize)]
pub struct SyncToolCall {
pub id: String,
pub name: String,
pub arguments: String,
}
#[derive(Debug, Clone, Serialize)]
pub struct SyncMessage {
pub role: String,
#[serde(default)]
pub content: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub tool_calls: Option<Vec<SyncToolCall>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tool_call_id: Option<String>,
}