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, Default, Serialize, Deserialize)]
59#[serde(rename_all = "camelCase")]
60pub struct ClaudeOptions {
61 pub allowed_tools: Option<String>,
62 pub disallowed_tools: Option<String>,
63 pub tools: Option<String>,
64 pub append_system_prompt: Option<String>,
65 pub max_turns: Option<u32>,
66 pub max_budget_usd: Option<f64>,
67 pub max_thinking_tokens: Option<u32>,
68 pub continue_session: Option<bool>,
69 pub include_partial_messages: Option<bool>,
70 pub effort: Option<String>,
71 pub agents: Option<serde_json::Value>,
72}
73
74#[derive(Debug, Clone, Default, Serialize, Deserialize)]
75#[serde(rename_all = "camelCase")]
76pub struct CodexOptions {
77 pub approval_policy: Option<String>,
78 pub sandbox_mode: Option<String>,
79 pub additional_directories: Option<Vec<String>>,
80 pub images: Option<Vec<String>>,
81 pub output_schema: Option<String>,
82}
83
84#[derive(Debug, Clone, Default, Serialize, Deserialize)]
85#[serde(rename_all = "camelCase")]
86pub struct GeminiOptions {
87 pub approval_mode: Option<String>,
88 pub sandbox: Option<bool>,
89 pub extra_args: Option<Vec<String>>,
90}
91
92#[derive(Debug, Clone, Default, Serialize, Deserialize)]
93pub struct ProviderOptions {
94 pub claude: Option<ClaudeOptions>,
95 pub codex: Option<CodexOptions>,
96 pub gemini: Option<GeminiOptions>,
97}
98
99#[derive(Debug, Clone, Default, Serialize, Deserialize)]
101#[serde(rename_all = "camelCase")]
102pub struct RunOptions {
103 pub cli: Option<CliName>,
105
106 pub task: String,
108
109 pub system_prompt: Option<String>,
111
112 pub system_prompt_file: Option<String>,
114
115 pub mcp_servers: Option<HashMap<String, McpServer>>,
117
118 pub cwd: Option<String>,
120
121 pub model: Option<String>,
123
124 pub idle_timeout_ms: Option<u64>,
126
127 pub total_timeout_ms: Option<u64>,
129
130 pub max_consecutive_tool_failures: Option<u32>,
132
133 pub env: Option<HashMap<String, String>>,
135
136 pub executable_path: Option<String>,
138
139 pub resume_session_id: Option<String>,
141
142 pub max_output_bytes: Option<usize>,
147
148 #[serde(default)]
156 pub skip_permissions: bool,
157
158 pub providers: Option<ProviderOptions>,
160}
161
162#[derive(Debug, Clone, Default, Serialize, Deserialize)]
164#[serde(rename_all = "camelCase")]
165#[non_exhaustive]
166pub struct RunResult {
167 pub success: bool,
168 pub text: Option<String>,
169 pub exit_code: Option<i32>,
170 pub stats: Option<RunStats>,
171 pub session_id: Option<String>,
172 pub stderr: Option<String>,
173 pub cost_usd: Option<f64>,
174}
175
176#[derive(Debug, Clone, Default, Serialize, Deserialize)]
177#[serde(rename_all = "camelCase")]
178#[non_exhaustive]
179pub struct RunStats {
180 pub input_tokens: Option<u64>,
181 pub output_tokens: Option<u64>,
182 pub total_tokens: Option<u64>,
183 pub cached_tokens: Option<u64>,
184 pub duration_ms: Option<u64>,
185 pub tool_calls: Option<u32>,
186}