1use serde::{Deserialize, Serialize};
2
3use super::{AssistantMessageErrorKind, RateLimitInfo, TaskNotificationStatus, TaskUsage};
4
5#[derive(Debug, Clone, Serialize, Deserialize)]
6#[serde(tag = "type", rename_all = "snake_case")]
7pub enum ContentBlock {
8 Text {
9 text: String,
10 },
11 Thinking {
12 thinking: String,
13 signature: String,
14 },
15 ToolUse {
16 id: String,
17 name: String,
18 input: serde_json::Map<String, serde_json::Value>,
19 },
20 ToolResult {
21 tool_use_id: String,
22 #[serde(skip_serializing_if = "Option::is_none")]
23 content: Option<serde_json::Value>,
24 #[serde(skip_serializing_if = "Option::is_none")]
25 is_error: Option<bool>,
26 },
27 ServerToolUse {
28 id: String,
29 name: String,
30 input: serde_json::Map<String, serde_json::Value>,
31 },
32 #[serde(rename = "advisor_tool_result")]
33 ServerToolResult {
34 tool_use_id: String,
35 content: serde_json::Value,
36 },
37}
38
39#[derive(Debug, Clone, Serialize, Deserialize)]
40#[serde(rename_all = "camelCase")]
41pub struct UserContent {
42 #[serde(skip_serializing_if = "Option::is_none")]
43 pub role: Option<String>,
44 pub content: serde_json::Value,
45}
46
47#[derive(Debug, Clone, Serialize, Deserialize)]
48#[serde(tag = "type", rename_all = "snake_case")]
49pub enum Message {
50 #[serde(rename = "user")]
51 UserMsg {
52 #[serde(rename = "message")]
53 content: UserContent,
54 #[serde(skip_serializing_if = "Option::is_none")]
55 uuid: Option<String>,
56 #[serde(skip_serializing_if = "Option::is_none")]
57 parent_tool_use_id: Option<String>,
58 #[serde(skip_serializing_if = "Option::is_none")]
59 tool_use_result: Option<serde_json::Map<String, serde_json::Value>>,
60 },
61 #[serde(rename = "assistant")]
62 AssistantMsg {
63 #[serde(rename = "message")]
64 content: AssistantContent,
65 #[serde(skip_serializing_if = "Option::is_none")]
66 parent_tool_use_id: Option<String>,
67 #[serde(skip_serializing_if = "Option::is_none")]
68 error: Option<AssistantMessageErrorKind>,
69 #[serde(skip_serializing_if = "Option::is_none")]
70 usage: Option<serde_json::Map<String, serde_json::Value>>,
71 #[serde(skip_serializing_if = "Option::is_none")]
72 message_id: Option<String>,
73 #[serde(skip_serializing_if = "Option::is_none")]
74 stop_reason: Option<String>,
75 #[serde(skip_serializing_if = "Option::is_none")]
76 session_id: Option<String>,
77 #[serde(skip_serializing_if = "Option::is_none")]
78 uuid: Option<String>,
79 },
80 #[serde(rename = "system")]
81 SystemMsg {
82 subtype: String,
83 #[serde(flatten)]
84 data: serde_json::Map<String, serde_json::Value>,
85 },
86 #[serde(skip_serializing, skip_deserializing)]
87 TaskStartedMsg(TaskStartedMessage),
88 #[serde(skip_serializing, skip_deserializing)]
89 TaskProgressMsg(TaskProgressMessage),
90 #[serde(skip_serializing, skip_deserializing)]
91 TaskNotificationMsg(TaskNotificationMessage),
92 #[serde(skip_serializing, skip_deserializing)]
93 HookEventMsg(HookEventMessage),
94 #[serde(skip_serializing, skip_deserializing)]
95 MirrorErrorMsg(MirrorErrorMessage),
96 #[serde(rename = "result")]
97 ResultMsg {
98 subtype: String,
99 duration_ms: i32,
100 duration_api_ms: i32,
101 is_error: bool,
102 num_turns: i32,
103 session_id: String,
104 #[serde(skip_serializing_if = "Option::is_none")]
105 stop_reason: Option<String>,
106 #[serde(skip_serializing_if = "Option::is_none")]
107 total_cost_usd: Option<f64>,
108 #[serde(skip_serializing_if = "Option::is_none")]
109 usage: Option<serde_json::Map<String, serde_json::Value>>,
110 #[serde(skip_serializing_if = "Option::is_none")]
111 result: Option<String>,
112 #[serde(skip_serializing_if = "Option::is_none")]
113 structured_output: Option<serde_json::Value>,
114 #[serde(skip_serializing_if = "Option::is_none")]
115 deferred_tool_use: Option<DeferredToolUse>,
116 #[serde(skip_serializing_if = "Option::is_none")]
117 errors: Option<Vec<String>>,
118 #[serde(skip_serializing_if = "Option::is_none")]
119 api_error_status: Option<i32>,
120 #[serde(skip_serializing_if = "Option::is_none")]
121 #[serde(rename = "modelUsage")]
122 model_usage: Option<serde_json::Map<String, serde_json::Value>>,
123 #[serde(skip_serializing_if = "Option::is_none")]
124 permission_denials: Option<Vec<serde_json::Value>>,
125 #[serde(skip_serializing_if = "Option::is_none")]
126 uuid: Option<String>,
127 },
128 #[serde(rename = "stream_event")]
129 StreamEventMsg {
130 uuid: String,
131 session_id: String,
132 #[serde(skip_serializing_if = "Option::is_none")]
133 event: Option<serde_json::Map<String, serde_json::Value>>,
134 #[serde(skip_serializing_if = "Option::is_none")]
135 parent_tool_use_id: Option<String>,
136 },
137 #[serde(rename = "rate_limit_event")]
138 RateLimitEventMsg {
139 rate_limit_info: RateLimitInfo,
140 uuid: String,
141 session_id: String,
142 },
143}
144
145#[derive(Debug, Clone, Serialize, Deserialize)]
146#[serde(rename_all = "camelCase")]
147pub struct AssistantContent {
148 #[serde(skip_serializing_if = "Option::is_none")]
149 pub id: Option<String>,
150 pub content: Vec<ContentBlock>,
151 pub model: String,
152 #[serde(skip_serializing_if = "Option::is_none")]
153 pub usage: Option<serde_json::Map<String, serde_json::Value>>,
154 #[serde(skip_serializing_if = "Option::is_none")]
155 #[serde(rename = "stop_reason")]
156 pub stop_reason: Option<String>,
157}
158
159#[derive(Debug, Clone, Serialize, Deserialize)]
160#[serde(rename_all = "camelCase")]
161pub struct DeferredToolUse {
162 pub id: String,
163 pub name: String,
164 pub input: serde_json::Map<String, serde_json::Value>,
165}
166
167#[derive(Debug, Clone, Serialize, Deserialize)]
168#[serde(rename_all = "camelCase")]
169pub struct TaskStartedMessage {
170 #[serde(alias = "task_id")]
171 pub task_id: String,
172 pub description: String,
173 pub uuid: String,
174 #[serde(alias = "session_id")]
175 pub session_id: String,
176 #[serde(skip_serializing_if = "Option::is_none")]
177 #[serde(alias = "tool_use_id")]
178 pub tool_use_id: Option<String>,
179 #[serde(skip_serializing_if = "Option::is_none")]
180 #[serde(alias = "task_type")]
181 pub task_type: Option<String>,
182}
183
184#[derive(Debug, Clone, Serialize, Deserialize)]
185#[serde(rename_all = "camelCase")]
186pub struct TaskProgressMessage {
187 #[serde(alias = "task_id")]
188 pub task_id: String,
189 pub description: String,
190 pub usage: TaskUsage,
191 pub uuid: String,
192 #[serde(alias = "session_id")]
193 pub session_id: String,
194 #[serde(skip_serializing_if = "Option::is_none")]
195 #[serde(alias = "tool_use_id")]
196 pub tool_use_id: Option<String>,
197 #[serde(skip_serializing_if = "Option::is_none")]
198 #[serde(alias = "last_tool_name")]
199 pub last_tool_name: Option<String>,
200}
201
202#[derive(Debug, Clone, Serialize, Deserialize)]
203#[serde(rename_all = "camelCase")]
204pub struct TaskNotificationMessage {
205 #[serde(alias = "task_id")]
206 pub task_id: String,
207 pub status: TaskNotificationStatus,
208 #[serde(alias = "output_file")]
209 pub output_file: String,
210 pub summary: String,
211 pub uuid: String,
212 #[serde(alias = "session_id")]
213 pub session_id: String,
214 #[serde(skip_serializing_if = "Option::is_none")]
215 #[serde(alias = "tool_use_id")]
216 pub tool_use_id: Option<String>,
217 #[serde(skip_serializing_if = "Option::is_none")]
218 pub usage: Option<TaskUsage>,
219}
220
221#[derive(Debug, Clone, Serialize, Deserialize)]
222#[serde(rename_all = "camelCase")]
223pub struct HookEventMessage {
224 pub subtype: String,
225 #[serde(skip_serializing_if = "Option::is_none")]
226 pub hook_event_name: Option<String>,
227 #[serde(skip_serializing_if = "Option::is_none")]
228 pub session_id: Option<String>,
229 #[serde(skip_serializing_if = "Option::is_none")]
230 pub uuid: Option<String>,
231 pub data: serde_json::Map<String, serde_json::Value>,
232}
233
234#[derive(Debug, Clone, Serialize, Deserialize)]
235#[serde(rename_all = "camelCase")]
236pub struct MirrorErrorMessage {
237 #[serde(skip_serializing_if = "Option::is_none")]
238 pub key: Option<serde_json::Map<String, serde_json::Value>>,
239 pub error: String,
240 pub data: serde_json::Map<String, serde_json::Value>,
241}