1use serde::{Deserialize, Serialize};
2use std::collections::HashMap;
3
4#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
6#[serde(rename_all = "lowercase")]
7#[non_exhaustive]
8pub enum CliName {
9 Claude,
10 Codex,
11 Gemini,
12}
13
14impl std::fmt::Display for CliName {
15 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
16 match self {
17 Self::Claude => write!(f, "claude"),
18 Self::Codex => write!(f, "codex"),
19 Self::Gemini => write!(f, "gemini"),
20 }
21 }
22}
23
24#[derive(Debug, Clone, Default, Serialize, Deserialize)]
26#[serde(rename_all = "camelCase")]
27pub struct McpServer {
28 pub command: Option<String>,
30 pub args: Option<Vec<String>>,
31 pub env: Option<HashMap<String, String>>,
32 pub cwd: Option<String>,
33
34 pub url: Option<String>,
36 #[serde(rename = "type")]
37 pub transport_type: Option<McpTransport>,
38 pub headers: Option<HashMap<String, String>>,
39
40 pub include_tools: Option<Vec<String>>,
42 pub exclude_tools: Option<Vec<String>>,
43
44 pub timeout: Option<u64>,
46}
47
48#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
49#[serde(rename_all = "lowercase")]
50pub enum McpTransport {
51 Stdio,
52 Sse,
53 Http,
54}
55
56#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
63#[serde(rename_all = "lowercase")]
64pub enum SettingSource {
65 User,
66 Project,
67 Local,
68}
69
70impl SettingSource {
71 pub fn as_str(&self) -> &'static str {
72 match self {
73 Self::User => "user",
74 Self::Project => "project",
75 Self::Local => "local",
76 }
77 }
78}
79
80#[derive(Debug, Clone, Default, Serialize, Deserialize)]
83#[serde(rename_all = "camelCase")]
84pub struct ClaudeOptions {
85 pub allowed_tools: Option<String>,
86 pub disallowed_tools: Option<String>,
87 pub tools: Option<String>,
88 pub append_system_prompt: Option<String>,
89 pub max_turns: Option<u32>,
90 pub max_budget_usd: Option<f64>,
91 pub max_thinking_tokens: Option<u32>,
92 pub continue_session: Option<bool>,
93 pub include_partial_messages: Option<bool>,
94 pub effort: Option<String>,
95 pub agents: Option<serde_json::Value>,
96 pub setting_sources: Option<Vec<SettingSource>>,
100 pub extra_args: Option<Vec<String>>,
107}
108
109#[derive(Debug, Clone, Default, Serialize, Deserialize)]
110#[serde(rename_all = "camelCase")]
111pub struct CodexOptions {
112 pub approval_policy: Option<String>,
113 pub sandbox_mode: Option<String>,
114 pub additional_directories: Option<Vec<String>>,
115 pub images: Option<Vec<String>>,
116 pub output_schema: Option<String>,
117 pub extra_args: Option<Vec<String>>,
123}
124
125#[derive(Debug, Clone, Default, Serialize, Deserialize)]
126#[serde(rename_all = "camelCase")]
127pub struct GeminiOptions {
128 pub approval_mode: Option<String>,
129 pub sandbox: Option<bool>,
130 pub extra_args: Option<Vec<String>>,
131}
132
133#[derive(Debug, Clone, Default, Serialize, Deserialize)]
134pub struct ProviderOptions {
135 pub claude: Option<ClaudeOptions>,
136 pub codex: Option<CodexOptions>,
137 pub gemini: Option<GeminiOptions>,
138}
139
140#[derive(Debug, Clone, Default, Serialize, Deserialize)]
142#[serde(rename_all = "camelCase")]
143pub struct RunOptions {
144 pub cli: Option<CliName>,
146
147 pub task: String,
149
150 pub system_prompt: Option<String>,
152
153 pub system_prompt_file: Option<String>,
155
156 pub mcp_servers: Option<HashMap<String, McpServer>>,
158
159 pub cwd: Option<String>,
161
162 pub model: Option<String>,
164
165 pub idle_timeout_ms: Option<u64>,
167
168 pub total_timeout_ms: Option<u64>,
170
171 pub max_consecutive_tool_failures: Option<u32>,
173
174 pub env: Option<HashMap<String, String>>,
176
177 pub executable_path: Option<String>,
179
180 pub resume_session_id: Option<String>,
182
183 pub max_output_bytes: Option<usize>,
188
189 #[serde(default)]
197 pub skip_permissions: bool,
198
199 pub providers: Option<ProviderOptions>,
201}
202
203#[derive(Debug, Clone, Default, Serialize, Deserialize)]
205#[serde(rename_all = "camelCase")]
206#[non_exhaustive]
207pub struct RunResult {
208 pub success: bool,
209 pub text: Option<String>,
210 pub exit_code: Option<i32>,
218 pub signal: Option<i32>,
224 pub stats: Option<RunStats>,
225 pub session_id: Option<String>,
226 pub stderr: Option<String>,
227 pub cost_usd: Option<f64>,
228}
229
230#[derive(Debug, Clone, Default, Serialize, Deserialize)]
231#[serde(rename_all = "camelCase")]
232#[non_exhaustive]
233pub struct RunStats {
234 pub input_tokens: Option<u64>,
235 pub output_tokens: Option<u64>,
236 pub total_tokens: Option<u64>,
237 pub cached_tokens: Option<u64>,
238 pub duration_ms: Option<u64>,
239 pub tool_calls: Option<u32>,
240}