use serde::{Deserialize, Serialize};
use serde_with::skip_serializing_none;
pub const PROTOCOL_VERSION: &str = "0.2";
pub const HEADER_PROTOCOL_VERSION: &str = "ACT-Protocol-Version";
#[skip_serializing_none]
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ToolDefinition {
pub name: String,
pub description: String,
pub parameters_schema: serde_json::Value,
pub metadata: Option<serde_json::Value>,
}
#[skip_serializing_none]
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ListToolsResponse {
pub tools: Vec<ToolDefinition>,
pub metadata: Option<serde_json::Value>,
}
#[skip_serializing_none]
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct MetadataRequest {
#[serde(default)]
pub metadata: Option<serde_json::Value>,
}
#[skip_serializing_none]
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ToolCallRequest {
pub arguments: serde_json::Value,
#[serde(default)]
pub metadata: Option<serde_json::Value>,
}
#[skip_serializing_none]
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ContentPart {
pub data: serde_json::Value,
#[serde(default)]
pub mime_type: Option<String>,
#[serde(default)]
pub metadata: Option<serde_json::Value>,
}
#[skip_serializing_none]
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ToolCallResponse {
pub content: Vec<ContentPart>,
#[serde(default)]
pub metadata: Option<serde_json::Value>,
}
#[skip_serializing_none]
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ToolError {
pub kind: String,
pub message: String,
#[serde(default)]
pub metadata: Option<serde_json::Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ErrorResponse {
pub error: ToolError,
}
#[skip_serializing_none]
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ResourceInfo {
pub uri: String,
#[serde(default)]
pub mime_type: Option<String>,
pub description: String,
#[serde(default)]
pub metadata: Option<serde_json::Value>,
}
#[skip_serializing_none]
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ListResourcesResponse {
pub resources: Vec<ResourceInfo>,
#[serde(default)]
pub metadata: Option<serde_json::Value>,
}
#[skip_serializing_none]
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct OpenSessionRequest {
pub arguments: serde_json::Value,
#[serde(default)]
pub metadata: Option<serde_json::Value>,
}
#[skip_serializing_none]
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct OpenSessionResponse {
pub id: String,
#[serde(default)]
pub metadata: serde_json::Map<String, serde_json::Value>,
}
pub fn error_kind_to_status(kind: &str) -> u16 {
use crate::constants::*;
match kind {
ERR_NOT_FOUND => 404,
ERR_SESSION_NOT_FOUND => 404,
ERR_INVALID_ARGS => 422,
ERR_TIMEOUT => 504,
ERR_CAPABILITY_DENIED => 403,
_ => 500,
}
}