1use serde::{Deserialize, Serialize};
2use serde_json::Value;
3
4#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
6#[serde(rename_all = "snake_case")]
7pub enum CommandExecutionStatus {
8 InProgress,
10 Completed,
12 Failed,
14}
15
16#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
18pub struct CommandExecutionItem {
19 pub id: String,
21 pub command: String,
23 pub aggregated_output: String,
25 #[serde(skip_serializing_if = "Option::is_none")]
27 pub exit_code: Option<i32>,
28 pub status: CommandExecutionStatus,
30}
31
32#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
34#[serde(rename_all = "snake_case")]
35pub enum PatchChangeKind {
36 Add,
38 Delete,
40 Update,
42}
43
44#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
46pub struct FileUpdateChange {
47 pub path: String,
49 pub kind: PatchChangeKind,
51}
52
53#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
55#[serde(rename_all = "snake_case")]
56pub enum PatchApplyStatus {
57 Completed,
59 Failed,
61}
62
63#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
65pub struct FileChangeItem {
66 pub id: String,
68 pub changes: Vec<FileUpdateChange>,
70 pub status: PatchApplyStatus,
72}
73
74#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
76#[serde(rename_all = "snake_case")]
77pub enum McpToolCallStatus {
78 InProgress,
80 Completed,
82 Failed,
84}
85
86#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
88pub struct McpToolCallResult {
89 pub content: Vec<Value>,
91 pub structured_content: Value,
93}
94
95#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
97pub struct McpToolCallError {
98 pub message: String,
100}
101
102#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
104pub struct McpToolCallItem {
105 pub id: String,
107 pub server: String,
109 pub tool: String,
111 pub arguments: Value,
113 #[serde(skip_serializing_if = "Option::is_none")]
115 pub result: Option<McpToolCallResult>,
116 #[serde(skip_serializing_if = "Option::is_none")]
118 pub error: Option<McpToolCallError>,
119 pub status: McpToolCallStatus,
121}
122
123#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
125pub struct AgentMessageItem {
126 pub id: String,
128 pub text: String,
130}
131
132#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
134pub struct ReasoningItem {
135 pub id: String,
137 pub text: String,
139}
140
141#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
143pub struct WebSearchItem {
144 pub id: String,
146 pub query: String,
148}
149
150#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
152pub struct ErrorItem {
153 pub id: String,
155 pub message: String,
157}
158
159#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
161pub struct TodoItem {
162 pub text: String,
164 pub completed: bool,
166}
167
168#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
170pub struct TodoListItem {
171 pub id: String,
173 pub items: Vec<TodoItem>,
175}
176
177#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
179#[serde(tag = "type", rename_all = "snake_case")]
180pub enum ThreadItem {
181 AgentMessage(AgentMessageItem),
183 Reasoning(ReasoningItem),
185 CommandExecution(CommandExecutionItem),
187 FileChange(FileChangeItem),
189 McpToolCall(McpToolCallItem),
191 WebSearch(WebSearchItem),
193 TodoList(TodoListItem),
195 Error(ErrorItem),
197}