1use std::collections::{BTreeMap, BTreeSet};
2
3use serde::{Deserialize, Serialize};
4use serde_json::Value;
5
6#[derive(Debug, Deserialize)]
7pub(crate) struct ReadFileInput {
8 pub(crate) path: String,
9 pub(crate) offset: Option<usize>,
10 pub(crate) limit: Option<usize>,
11}
12
13#[derive(Debug, Deserialize)]
14pub(crate) struct WriteFileInput {
15 pub(crate) path: String,
16 pub(crate) content: String,
17}
18
19#[derive(Debug, Deserialize)]
20pub(crate) struct EditFileInput {
21 pub(crate) path: String,
22 pub(crate) old_string: String,
23 pub(crate) new_string: String,
24 pub(crate) replace_all: Option<bool>,
25}
26
27#[derive(Debug, Deserialize)]
28pub(crate) struct GlobSearchInputValue {
29 pub(crate) pattern: String,
30 pub(crate) path: Option<String>,
31}
32
33#[derive(Debug, Deserialize)]
34pub(crate) struct WebFetchInput {
35 pub(crate) url: String,
36 pub(crate) prompt: String,
37}
38
39#[derive(Debug, Deserialize)]
40pub(crate) struct WebSearchInput {
41 pub(crate) query: String,
42 pub(crate) allowed_domains: Option<Vec<String>>,
43 pub(crate) blocked_domains: Option<Vec<String>>,
44}
45
46#[derive(Debug, Deserialize)]
47pub(crate) struct TodoWriteInput {
48 pub(crate) todos: Vec<TodoItem>,
49}
50
51#[derive(Debug, Deserialize, Serialize, Clone, PartialEq, Eq)]
52pub(crate) struct TodoItem {
53 pub(crate) content: String,
54 #[serde(rename = "activeForm")]
55 pub(crate) active_form: String,
56 pub(crate) status: TodoStatus,
57}
58
59#[derive(Debug, Deserialize, Serialize, Clone, PartialEq, Eq)]
60#[serde(rename_all = "snake_case")]
61pub(crate) enum TodoStatus {
62 Pending,
63 InProgress,
64 Completed,
65}
66
67#[derive(Debug, Deserialize)]
68pub(crate) struct SkillInput {
69 pub(crate) skill: String,
70 pub(crate) args: Option<String>,
71}
72
73#[derive(Debug, Deserialize)]
74pub(crate) struct AgentInput {
75 pub(crate) description: String,
76 pub(crate) prompt: String,
77 pub(crate) subagent_type: Option<String>,
78 pub(crate) name: Option<String>,
79 pub(crate) model: Option<String>,
80}
81
82#[derive(Debug, Deserialize)]
83pub struct ToolSearchInput {
84 pub query: String,
85 pub max_results: Option<usize>,
86}
87
88#[derive(Debug, Deserialize)]
89pub(crate) struct NotebookEditInput {
90 pub(crate) notebook_path: String,
91 pub(crate) cell_id: Option<String>,
92 pub(crate) new_source: Option<String>,
93 pub(crate) cell_type: Option<NotebookCellType>,
94 pub(crate) edit_mode: Option<NotebookEditMode>,
95}
96
97#[derive(Debug, Deserialize, Serialize, Clone, Copy, PartialEq, Eq)]
98#[serde(rename_all = "lowercase")]
99pub(crate) enum NotebookCellType {
100 Code,
101 Markdown,
102}
103
104#[derive(Debug, Deserialize, Serialize, Clone, Copy, PartialEq, Eq)]
105#[serde(rename_all = "lowercase")]
106pub(crate) enum NotebookEditMode {
107 Replace,
108 Insert,
109 Delete,
110}
111
112#[derive(Debug, Deserialize)]
113pub(crate) struct SleepInput {
114 pub(crate) duration_ms: u64,
115}
116
117#[derive(Debug, Deserialize)]
118pub(crate) struct BriefInput {
119 pub(crate) message: String,
120 pub(crate) attachments: Option<Vec<String>>,
121 pub(crate) status: BriefStatus,
122}
123
124#[derive(Debug, Deserialize)]
125#[serde(rename_all = "lowercase")]
126pub(crate) enum BriefStatus {
127 Normal,
128 Proactive,
129}
130
131#[derive(Debug, Deserialize)]
132pub(crate) struct ConfigInput {
133 pub(crate) setting: String,
134 pub(crate) value: Option<ConfigValue>,
135}
136
137#[derive(Debug, Deserialize)]
138#[serde(untagged)]
139pub(crate) enum ConfigValue {
140 String(String),
141 Bool(bool),
142 Number(f64),
143}
144#[derive(Clone, Copy)]
145pub(crate) enum ConfigScope {
146 Global,
147 Settings,
148}
149
150#[derive(Clone, Copy)]
151pub(crate) struct ConfigSettingSpec {
152 pub(crate) scope: ConfigScope,
153 pub(crate) kind: ConfigKind,
154 pub(crate) path: &'static [&'static str],
155 pub(crate) options: Option<&'static [&'static str]>,
156}
157
158#[derive(Clone, Copy)]
159pub(crate) enum ConfigKind {
160 Boolean,
161 String,
162}
163#[derive(Debug, Deserialize)]
164#[serde(transparent)]
165pub(crate) struct StructuredOutputInput(pub(crate) BTreeMap<String, Value>);
166
167#[derive(Debug, Deserialize)]
168pub(crate) struct ReplInput {
169 pub(crate) code: String,
170 pub(crate) language: String,
171 pub(crate) timeout_ms: Option<u64>,
172}
173
174#[derive(Debug, Deserialize)]
175pub(crate) struct PowerShellInput {
176 pub(crate) command: String,
177 pub(crate) timeout: Option<u64>,
178 pub(crate) description: Option<String>,
179 pub(crate) run_in_background: Option<bool>,
180}
181
182#[derive(Debug, Serialize)]
183pub(crate) struct WebFetchOutput {
184 pub(crate) bytes: usize,
185 pub(crate) code: u16,
186 #[serde(rename = "codeText")]
187 pub(crate) code_text: String,
188 pub(crate) result: String,
189 #[serde(rename = "durationMs")]
190 pub(crate) duration_ms: u128,
191 pub(crate) url: String,
192}
193
194#[derive(Debug, Serialize)]
195pub(crate) struct WebSearchOutput {
196 pub(crate) query: String,
197 pub(crate) results: Vec<WebSearchResultItem>,
198 #[serde(rename = "durationSeconds")]
199 pub(crate) duration_seconds: f64,
200}
201
202#[derive(Debug, Serialize)]
203pub(crate) struct TodoWriteOutput {
204 #[serde(rename = "oldTodos")]
205 pub(crate) old_todos: Vec<TodoItem>,
206 #[serde(rename = "newTodos")]
207 pub(crate) new_todos: Vec<TodoItem>,
208 #[serde(rename = "verificationNudgeNeeded")]
209 pub(crate) verification_nudge_needed: Option<bool>,
210}
211
212#[derive(Debug, Serialize)]
213pub(crate) struct SkillOutput {
214 pub(crate) skill: String,
215 pub(crate) path: String,
216 pub(crate) args: Option<String>,
217 pub(crate) description: Option<String>,
218 pub(crate) prompt: String,
219}
220
221#[derive(Debug, Clone, Serialize, Deserialize)]
222pub(crate) struct AgentOutput {
223 #[serde(rename = "agentId")]
224 pub(crate) agent_id: String,
225 pub(crate) name: String,
226 pub(crate) description: String,
227 #[serde(rename = "subagentType")]
228 pub(crate) subagent_type: Option<String>,
229 pub(crate) model: Option<String>,
230 pub(crate) status: String,
231 #[serde(rename = "outputFile")]
232 pub(crate) output_file: String,
233 #[serde(rename = "manifestFile")]
234 pub(crate) manifest_file: String,
235 #[serde(rename = "createdAt")]
236 pub(crate) created_at: String,
237 #[serde(rename = "startedAt", skip_serializing_if = "Option::is_none")]
238 pub(crate) started_at: Option<String>,
239 #[serde(rename = "completedAt", skip_serializing_if = "Option::is_none")]
240 pub(crate) completed_at: Option<String>,
241 #[serde(skip_serializing_if = "Option::is_none")]
242 pub(crate) error: Option<String>,
243}
244
245#[derive(Debug, Clone)]
246pub(crate) struct AgentJob {
247 pub(crate) manifest: AgentOutput,
248 pub(crate) prompt: String,
249 pub(crate) system_prompt: Vec<String>,
250 pub(crate) allowed_tools: BTreeSet<String>,
251}
252
253#[derive(Debug, Serialize)]
254pub struct ToolSearchOutput {
255 pub matches: Vec<String>,
256 pub query: String,
257 pub normalized_query: String,
258 #[serde(rename = "total_deferred_tools")]
259 pub total_deferred_tools: usize,
260 #[serde(rename = "pending_mcp_servers")]
261 pub pending_mcp_servers: Option<Vec<String>>,
262}
263
264#[derive(Debug, Serialize)]
265pub(crate) struct NotebookEditOutput {
266 pub(crate) new_source: String,
267 pub(crate) cell_id: Option<String>,
268 pub(crate) cell_type: Option<NotebookCellType>,
269 pub(crate) language: String,
270 pub(crate) edit_mode: String,
271 pub(crate) error: Option<String>,
272 pub(crate) notebook_path: String,
273 pub(crate) original_file: String,
274 pub(crate) updated_file: String,
275}
276
277#[derive(Debug, Serialize)]
278pub(crate) struct SleepOutput {
279 pub(crate) duration_ms: u64,
280 pub(crate) message: String,
281}
282
283#[derive(Debug, Serialize)]
284pub(crate) struct BriefOutput {
285 pub(crate) message: String,
286 pub(crate) attachments: Option<Vec<ResolvedAttachment>>,
287 #[serde(rename = "sentAt")]
288 pub(crate) sent_at: String,
289}
290
291#[derive(Debug, Serialize)]
292pub(crate) struct ResolvedAttachment {
293 pub(crate) path: String,
294 pub(crate) size: u64,
295 #[serde(rename = "isImage")]
296 pub(crate) is_image: bool,
297}
298
299#[derive(Debug, Serialize)]
300pub(crate) struct ConfigOutput {
301 pub(crate) success: bool,
302 pub(crate) operation: Option<String>,
303 pub(crate) setting: Option<String>,
304 pub(crate) value: Option<Value>,
305 #[serde(rename = "previousValue")]
306 pub(crate) previous_value: Option<Value>,
307 #[serde(rename = "newValue")]
308 pub(crate) new_value: Option<Value>,
309 pub(crate) error: Option<String>,
310}
311
312#[derive(Debug, Serialize)]
313pub(crate) struct StructuredOutputResult {
314 pub(crate) data: String,
315 pub(crate) structured_output: BTreeMap<String, Value>,
316}
317
318#[derive(Debug, Serialize)]
319pub(crate) struct ReplOutput {
320 pub(crate) language: String,
321 pub(crate) stdout: String,
322 pub(crate) stderr: String,
323 #[serde(rename = "exitCode")]
324 pub(crate) exit_code: i32,
325 #[serde(rename = "durationMs")]
326 pub(crate) duration_ms: u128,
327}
328
329#[derive(Debug, Deserialize)]
330pub(crate) struct MultiEditInput {
331 pub(crate) path: String,
332 pub(crate) edits: Vec<EditOperation>,
333}
334
335#[derive(Debug, Deserialize)]
336pub(crate) struct EditOperation {
337 pub(crate) old_string: String,
338 pub(crate) new_string: String,
339 pub(crate) replace_all: Option<bool>,
340}
341
342#[derive(Debug, Serialize)]
343pub(crate) struct MultiEditOutput {
344 pub(crate) path: String,
345 #[serde(rename = "editsApplied")]
346 pub(crate) edits_applied: usize,
347}
348
349#[derive(Debug, Deserialize)]
350pub(crate) struct AskUserQuestionInput {
351 pub(crate) questions: Vec<UserQuestion>,
352}
353
354#[derive(Debug, Deserialize, Serialize)]
355pub(crate) struct UserQuestion {
356 pub(crate) question: String,
357 pub(crate) header: Option<String>,
358 #[serde(rename = "multiSelect", default)]
359 pub(crate) multi_select: bool,
360 pub(crate) options: Vec<QuestionOption>,
361}
362
363#[derive(Debug, Deserialize, Serialize)]
364pub(crate) struct QuestionOption {
365 pub(crate) label: String,
366 pub(crate) description: Option<String>,
367}
368
369#[derive(Debug, Serialize)]
370pub(crate) struct AskUserQuestionOutput {
371 pub(crate) questions: Vec<UserQuestion>,
372 #[serde(rename = "formattedMessage")]
373 pub(crate) formatted_message: String,
374 #[serde(rename = "pendingUserResponse")]
375 pub(crate) pending_user_response: bool,
376}
377
378#[derive(Debug, Serialize)]
379#[serde(untagged)]
380pub(crate) enum WebSearchResultItem {
381 SearchResult {
382 tool_use_id: String,
383 content: Vec<SearchHit>,
384 },
385 Commentary(String),
386}
387
388#[derive(Debug, Serialize)]
389pub(crate) struct SearchHit {
390 pub(crate) title: String,
391 pub(crate) url: String,
392}