1use std::collections::HashMap;
4use std::path::PathBuf;
5use serde::{Deserialize, Serialize};
6
7#[derive(Debug, Clone, Serialize, Deserialize)]
9#[serde(rename_all = "camelCase")]
10pub enum PermissionMode {
11 #[serde(rename = "default")]
12 Default,
13 #[serde(rename = "acceptEdits")]
14 AcceptEdits,
15 #[serde(rename = "bypassPermissions")]
16 BypassPermissions,
17}
18
19#[derive(Debug, Clone, Serialize, Deserialize)]
21pub struct McpServerConfig {
22 pub transport: Vec<String>,
23 #[serde(skip_serializing_if = "Option::is_none")]
24 pub env: Option<HashMap<String, serde_json::Value>>,
25}
26
27#[derive(Debug, Clone, Serialize, Deserialize)]
29pub struct TextBlock {
30 pub text: String,
31}
32
33#[derive(Debug, Clone, Serialize, Deserialize)]
35pub struct ToolUseBlock {
36 pub id: String,
37 pub name: String,
38 pub input: HashMap<String, serde_json::Value>,
39}
40
41#[derive(Debug, Clone, Serialize, Deserialize)]
43pub struct ToolResultBlock {
44 pub tool_use_id: String,
45 #[serde(skip_serializing_if = "Option::is_none")]
46 pub content: Option<ToolResultContent>,
47 #[serde(skip_serializing_if = "Option::is_none")]
48 pub is_error: Option<bool>,
49}
50
51#[derive(Debug, Clone, Serialize, Deserialize)]
53#[serde(untagged)]
54pub enum ToolResultContent {
55 Text(String),
56 Structured(Vec<HashMap<String, serde_json::Value>>),
57}
58
59#[derive(Debug, Clone, Serialize, Deserialize)]
61#[serde(tag = "type")]
62pub enum ContentBlock {
63 #[serde(rename = "text")]
64 Text(TextBlock),
65 #[serde(rename = "tool_use")]
66 ToolUse(ToolUseBlock),
67 #[serde(rename = "tool_result")]
68 ToolResult(ToolResultBlock),
69}
70
71#[derive(Debug, Clone, Serialize, Deserialize)]
73pub struct UserMessage {
74 pub content: String,
75}
76
77#[derive(Debug, Clone, Serialize, Deserialize)]
79pub struct AssistantMessage {
80 pub content: Vec<ContentBlock>,
81}
82
83#[derive(Debug, Clone, Serialize, Deserialize)]
85pub struct SystemMessage {
86 pub subtype: String,
87 pub data: HashMap<String, serde_json::Value>,
88}
89
90#[derive(Debug, Clone, Serialize, Deserialize)]
92pub struct ResultMessage {
93 pub subtype: String,
94 pub duration_ms: u64,
95 pub duration_api_ms: u64,
96 pub is_error: bool,
97 pub num_turns: u32,
98 pub session_id: String,
99 #[serde(skip_serializing_if = "Option::is_none")]
100 pub total_cost_usd: Option<f64>,
101 #[serde(skip_serializing_if = "Option::is_none")]
102 pub usage: Option<HashMap<String, serde_json::Value>>,
103 #[serde(skip_serializing_if = "Option::is_none")]
104 pub result: Option<String>,
105}
106
107#[derive(Debug, Clone, Serialize, Deserialize)]
109#[serde(tag = "type")]
110pub enum Message {
111 #[serde(rename = "user")]
112 User(UserMessage),
113 #[serde(rename = "assistant")]
114 Assistant(AssistantMessage),
115 #[serde(rename = "system")]
116 System(SystemMessage),
117 #[serde(rename = "result")]
118 Result(ResultMessage),
119}
120
121#[derive(Debug, Clone)]
123pub struct ClaudeCodeOptions {
124 pub allowed_tools: Vec<String>,
125 pub max_thinking_tokens: u32,
126 pub system_prompt: Option<String>,
127 pub append_system_prompt: Option<String>,
128 pub mcp_tools: Vec<String>,
129 pub mcp_servers: HashMap<String, McpServerConfig>,
130 pub permission_mode: Option<PermissionMode>,
131 pub continue_conversation: bool,
132 pub resume: Option<String>,
133 pub max_turns: Option<u32>,
134 pub disallowed_tools: Vec<String>,
135 pub model: Option<String>,
136 pub permission_prompt_tool_name: Option<String>,
137 pub cwd: Option<PathBuf>,
138}
139
140impl Default for ClaudeCodeOptions {
141 fn default() -> Self {
142 Self {
143 allowed_tools: Vec::new(),
144 max_thinking_tokens: 8000,
145 system_prompt: None,
146 append_system_prompt: None,
147 mcp_tools: Vec::new(),
148 mcp_servers: HashMap::new(),
149 permission_mode: None,
150 continue_conversation: false,
151 resume: None,
152 max_turns: None,
153 disallowed_tools: Vec::new(),
154 model: None,
155 permission_prompt_tool_name: None,
156 cwd: None,
157 }
158 }
159}
160
161impl ClaudeCodeOptions {
162 pub fn new() -> Self {
164 Self::default()
165 }
166}