Skip to main content

codineer_tools/
types.rs

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}