use serde::{Deserialize, Serialize};
use serde_json::Value;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum ToolPhase {
Streaming,
WaitingConfirmation,
Executing,
Completed,
Cancelled,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "phase", rename_all = "snake_case")]
pub enum ToolState {
#[serde(rename_all = "camelCase")]
Streaming {
#[serde(default, skip_serializing_if = "Option::is_none")]
partial_input: Option<Value>,
},
#[serde(rename_all = "camelCase")]
WaitingConfirmation {
input: Value,
description: String,
approval_id: String,
},
#[serde(rename_all = "camelCase")]
Executing {
#[serde(default, skip_serializing_if = "Option::is_none")]
progress: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
elapsed_ms: Option<u64>,
},
#[serde(rename_all = "camelCase")]
Completed {
success: bool,
#[serde(default, skip_serializing_if = "Option::is_none")]
output: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
elapsed_ms: Option<u64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
confirmed_by: Option<ConfirmedBy>,
},
#[serde(rename_all = "camelCase")]
Cancelled {
reason: CancelReason,
#[serde(default, skip_serializing_if = "Option::is_none")]
message: Option<String>,
},
}
impl ToolState {
#[must_use]
pub fn phase(&self) -> ToolPhase {
match self {
Self::Streaming { .. } => ToolPhase::Streaming,
Self::WaitingConfirmation { .. } => ToolPhase::WaitingConfirmation,
Self::Executing { .. } => ToolPhase::Executing,
Self::Completed { .. } => ToolPhase::Completed,
Self::Cancelled { .. } => ToolPhase::Cancelled,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum ConfirmedBy {
User,
Auto,
Setting,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum CancelReason {
Denied,
Interrupted,
Timeout,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ToolInfo {
pub tool_id: String,
pub name: String,
pub state: ToolState,
}