use serde::{Deserialize, Serialize};
use super::content::UserInput;
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Default)]
pub struct InitializeParams {
pub protocol_version: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub client: Option<ClientInfo>,
#[serde(skip_serializing_if = "Option::is_none")]
pub external_tools: Option<Vec<ExternalTool>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub capabilities: Option<ClientCapabilities>,
#[serde(skip_serializing_if = "Option::is_none")]
pub hooks: Option<Vec<WireHookSubscription>>,
}
impl InitializeParams {
pub fn new(protocol_version: impl Into<String>) -> Self {
Self {
protocol_version: protocol_version.into(),
client: None,
external_tools: None,
capabilities: None,
hooks: None,
}
}
#[must_use]
pub fn with_client(mut self, client: ClientInfo) -> Self {
self.client = Some(client);
self
}
#[must_use]
pub fn with_external_tools(mut self, tools: Vec<ExternalTool>) -> Self {
self.external_tools = Some(tools);
self
}
#[must_use]
pub const fn with_capabilities(mut self, caps: ClientCapabilities) -> Self {
self.capabilities = Some(caps);
self
}
#[must_use]
pub fn with_hooks(mut self, hooks: Vec<WireHookSubscription>) -> Self {
self.hooks = Some(hooks);
self
}
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct ClientInfo {
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub version: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Default)]
pub struct ClientCapabilities {
#[serde(skip_serializing_if = "Option::is_none")]
pub supports_question: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub supports_plan_mode: Option<bool>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct WireHookSubscription {
pub id: String,
pub event: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub matcher: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub timeout: Option<u32>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct ExternalTool {
pub name: String,
pub description: String,
pub parameters: serde_json::Value,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct InitializeResult {
pub protocol_version: String,
pub server: ServerInfo,
pub slash_commands: Vec<SlashCommandInfo>,
#[serde(skip_serializing_if = "Option::is_none")]
pub external_tools: Option<ExternalToolsResult>,
#[serde(skip_serializing_if = "Option::is_none")]
pub capabilities: Option<ServerCapabilities>,
#[serde(skip_serializing_if = "Option::is_none")]
pub hooks: Option<HooksInfo>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct ServerInfo {
pub name: String,
pub version: String,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct SlashCommandInfo {
pub name: String,
pub description: String,
pub aliases: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct ExternalToolsResult {
pub accepted: Vec<String>,
pub rejected: Vec<RejectedExternalTool>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct RejectedExternalTool {
pub name: String,
pub reason: String,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Default)]
pub struct ServerCapabilities {
#[serde(skip_serializing_if = "Option::is_none")]
pub supports_question: Option<bool>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct HooksInfo {
pub supported_events: Vec<String>,
pub configured: std::collections::HashMap<String, u32>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct PromptParams {
pub user_input: UserInput,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct PromptResult {
pub status: PromptStatus,
#[serde(skip_serializing_if = "Option::is_none")]
pub steps: Option<u64>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Hash)]
#[serde(rename_all = "snake_case")]
#[non_exhaustive]
pub enum PromptStatus {
Finished,
Cancelled,
MaxStepsReached,
Pending,
UnexpectedEof,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Default)]
pub struct ReplayParams {}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct ReplayResult {
pub status: ReplayStatus,
pub events: u64,
pub requests: u64,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Hash)]
#[serde(rename_all = "snake_case")]
#[non_exhaustive]
pub enum ReplayStatus {
Finished,
Cancelled,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct SteerParams {
pub user_input: UserInput,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct SteerResult {
pub status: SteerStatus,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Hash)]
#[serde(rename_all = "snake_case")]
#[non_exhaustive]
pub enum SteerStatus {
Steered,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct SetPlanModeParams {
pub enabled: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct SetPlanModeResult {
pub status: SetPlanModeStatus,
pub plan_mode: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Hash)]
#[serde(rename_all = "snake_case")]
#[non_exhaustive]
pub enum SetPlanModeStatus {
Ok,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Default)]
pub struct CancelParams {}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Default)]
pub struct CancelResult {}