use serde::{Deserialize, Serialize};
#[derive(Clone, Copy, Debug, Eq, PartialEq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum ToolCallStatus {
Pending,
InProgress,
Completed,
Failed,
}
impl ToolCallStatus {
pub const ALL: [Self; 4] = [
Self::Pending,
Self::InProgress,
Self::Completed,
Self::Failed,
];
pub fn as_str(self) -> &'static str {
match self {
Self::Pending => "pending",
Self::InProgress => "in_progress",
Self::Completed => "completed",
Self::Failed => "failed",
}
}
}
#[derive(Clone, Copy, Debug, Eq, PartialEq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum ToolCallErrorCategory {
SchemaValidation,
ToolError,
McpServerError,
HostBridgeError,
PermissionDenied,
RejectedLoop,
ParseAborted,
Timeout,
Network,
Cancelled,
Unknown,
}
impl ToolCallErrorCategory {
pub const ALL: [Self; 11] = [
Self::SchemaValidation,
Self::ToolError,
Self::McpServerError,
Self::HostBridgeError,
Self::PermissionDenied,
Self::RejectedLoop,
Self::ParseAborted,
Self::Timeout,
Self::Network,
Self::Cancelled,
Self::Unknown,
];
pub fn as_str(self) -> &'static str {
match self {
Self::SchemaValidation => "schema_validation",
Self::ToolError => "tool_error",
Self::McpServerError => "mcp_server_error",
Self::HostBridgeError => "host_bridge_error",
Self::PermissionDenied => "permission_denied",
Self::RejectedLoop => "rejected_loop",
Self::ParseAborted => "parse_aborted",
Self::Timeout => "timeout",
Self::Network => "network",
Self::Cancelled => "cancelled",
Self::Unknown => "unknown",
}
}
pub fn from_internal(category: &crate::value::ErrorCategory) -> Self {
use crate::value::ErrorCategory as Internal;
match category {
Internal::Timeout => Self::Timeout,
Internal::RateLimit
| Internal::Overloaded
| Internal::ServerError
| Internal::TransientNetwork => Self::Network,
Internal::SchemaValidation | Internal::SchemaStreamAborted => Self::SchemaValidation,
Internal::ToolError => Self::ToolError,
Internal::ToolRejected => Self::PermissionDenied,
Internal::Cancelled => Self::Cancelled,
Internal::Auth
| Internal::EgressBlocked
| Internal::NotFound
| Internal::CircuitOpen
| Internal::BudgetExceeded
| Internal::Generic => Self::HostBridgeError,
}
}
}
#[derive(Clone, Debug, Eq, PartialEq, Hash, Serialize, Deserialize)]
#[serde(tag = "kind", rename_all = "snake_case")]
pub enum ToolExecutor {
HarnBuiltin,
HostBridge,
McpServer { server_name: String },
ProviderNative,
}