Skip to main content

act_types/
http.rs

1//! ACT-HTTP protocol types for request/response serialization.
2//!
3//! All types derive both `Serialize` and `Deserialize` so they can be used
4//! by servers (act-host), clients (act-bridge), and SDKs alike.
5
6use serde::{Deserialize, Serialize};
7use serde_with::skip_serializing_none;
8
9/// ACT-HTTP protocol version.
10pub const PROTOCOL_VERSION: &str = "0.2";
11
12/// HTTP header name for the protocol version.
13pub const HEADER_PROTOCOL_VERSION: &str = "ACT-Protocol-Version";
14
15/// Tool definition returned in `ListToolsResponse`.
16#[skip_serializing_none]
17#[derive(Debug, Clone, Serialize, Deserialize)]
18pub struct ToolDefinition {
19    pub name: String,
20    pub description: String,
21    pub parameters_schema: serde_json::Value,
22    pub metadata: Option<serde_json::Value>,
23}
24
25/// Response from `POST /tools`.
26#[skip_serializing_none]
27#[derive(Debug, Clone, Serialize, Deserialize)]
28pub struct ListToolsResponse {
29    pub tools: Vec<ToolDefinition>,
30    pub metadata: Option<serde_json::Value>,
31}
32
33/// Request body for `POST /metadata-schema`.
34#[skip_serializing_none]
35#[derive(Debug, Clone, Serialize, Deserialize, Default)]
36pub struct MetadataSchemaRequest {
37    #[serde(default)]
38    pub metadata: Option<serde_json::Value>,
39}
40
41/// Request body for `POST /tools` and `QUERY /tools`.
42#[skip_serializing_none]
43#[derive(Debug, Clone, Serialize, Deserialize, Default)]
44pub struct MetadataRequest {
45    #[serde(default)]
46    pub metadata: Option<serde_json::Value>,
47}
48
49/// Request body for `POST /tools/{name}`.
50#[skip_serializing_none]
51#[derive(Debug, Clone, Serialize, Deserialize)]
52pub struct ToolCallRequest {
53    pub arguments: serde_json::Value,
54    #[serde(default)]
55    pub metadata: Option<serde_json::Value>,
56}
57
58/// A content part in a tool response.
59#[skip_serializing_none]
60#[derive(Debug, Clone, Serialize, Deserialize)]
61pub struct ContentPart {
62    pub data: serde_json::Value,
63    #[serde(default)]
64    pub mime_type: Option<String>,
65    #[serde(default)]
66    pub metadata: Option<serde_json::Value>,
67}
68
69/// Response from `POST /tools/{name}`.
70#[skip_serializing_none]
71#[derive(Debug, Clone, Serialize, Deserialize)]
72pub struct ToolCallResponse {
73    pub content: Vec<ContentPart>,
74    #[serde(default)]
75    pub metadata: Option<serde_json::Value>,
76}
77
78/// Error object in error responses.
79#[skip_serializing_none]
80#[derive(Debug, Clone, Serialize, Deserialize)]
81pub struct ToolError {
82    pub kind: String,
83    pub message: String,
84    #[serde(default)]
85    pub metadata: Option<serde_json::Value>,
86}
87
88/// Wrapper for error responses (`{"error": ...}`).
89#[derive(Debug, Clone, Serialize, Deserialize)]
90pub struct ErrorResponse {
91    pub error: ToolError,
92}
93
94/// Resource info returned by `POST /resources`.
95#[skip_serializing_none]
96#[derive(Debug, Clone, Serialize, Deserialize)]
97pub struct ResourceInfo {
98    pub uri: String,
99    #[serde(default)]
100    pub mime_type: Option<String>,
101    pub description: String,
102    #[serde(default)]
103    pub metadata: Option<serde_json::Value>,
104}
105
106/// Response from `POST /resources`.
107#[skip_serializing_none]
108#[derive(Debug, Clone, Serialize, Deserialize)]
109pub struct ListResourcesResponse {
110    pub resources: Vec<ResourceInfo>,
111    #[serde(default)]
112    pub metadata: Option<serde_json::Value>,
113}
114
115/// Map an ACT error kind to an HTTP status code per ACT-HTTP spec.
116pub fn error_kind_to_status(kind: &str) -> u16 {
117    use crate::constants::*;
118    match kind {
119        ERR_NOT_FOUND => 404,
120        ERR_INVALID_ARGS => 422,
121        ERR_TIMEOUT => 504,
122        ERR_CAPABILITY_DENIED => 403,
123        _ => 500,
124    }
125}