bump claude code to v2.1 (#2005)

* bump claude code to v2.1

* fix unkown json
This commit is contained in:
Solomon
2026-01-13 16:52:44 +00:00
committed by GitHub
parent d27006be58
commit 5502a4cad6
4 changed files with 42 additions and 14 deletions

View File

@@ -20,7 +20,7 @@ use workspace_utils::{
use self::{
client::{AUTO_APPROVE_CALLBACK_ID, ClaudeAgentClient},
protocol::ProtocolPeer,
types::PermissionMode,
types::{ControlRequestType, ControlResponseType, PermissionMode},
};
use crate::{
approvals::ExecutorApprovalService,
@@ -43,7 +43,7 @@ fn base_command(claude_code_router: bool) -> &'static str {
if claude_code_router {
"npx -y @musistudio/claude-code-router@1.0.66 code"
} else {
"npx -y @anthropic-ai/claude-code@2.0.76"
"npx -y @anthropic-ai/claude-code@2.1.2"
}
}
@@ -466,6 +466,9 @@ impl ClaudeLogProcessor {
ClaudeJson::Result { session_id, .. } => session_id.clone(),
ClaudeJson::StreamEvent { .. } => None, // session might not have been initialized yet
ClaudeJson::ApprovalResponse { .. } => None,
ClaudeJson::ControlRequest { .. } => None,
ClaudeJson::ControlResponse { .. } => None,
ClaudeJson::ControlCancelRequest { .. } => None,
ClaudeJson::Unknown { .. } => None,
}
}
@@ -1190,6 +1193,9 @@ impl ClaudeLogProcessor {
let idx = entry_index_provider.next();
patches.push(ConversationPatch::add_normalized_entry(idx, entry));
}
ClaudeJson::ControlRequest { .. }
| ClaudeJson::ControlResponse { .. }
| ClaudeJson::ControlCancelRequest { .. } => {}
}
patches
}
@@ -1446,9 +1452,8 @@ impl StreamingContentState {
// Data structures for parsing Claude's JSON output format
#[derive(Deserialize, Serialize, Debug, Clone)]
#[serde(tag = "type")]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum ClaudeJson {
#[serde(rename = "system")]
System {
subtype: Option<String>,
session_id: Option<String>,
@@ -1458,30 +1463,25 @@ pub enum ClaudeJson {
#[serde(default, rename = "apiKeySource")]
api_key_source: Option<String>,
},
#[serde(rename = "assistant")]
Assistant {
message: ClaudeMessage,
session_id: Option<String>,
},
#[serde(rename = "user")]
User {
message: ClaudeMessage,
session_id: Option<String>,
},
#[serde(rename = "tool_use")]
ToolUse {
tool_name: String,
#[serde(flatten)]
tool_data: ClaudeToolData,
session_id: Option<String>,
},
#[serde(rename = "tool_result")]
ToolResult {
result: serde_json::Value,
is_error: Option<bool>,
session_id: Option<String>,
},
#[serde(rename = "stream_event")]
StreamEvent {
event: ClaudeStreamEvent,
#[serde(default)]
@@ -1491,7 +1491,6 @@ pub enum ClaudeJson {
#[serde(default)]
uuid: Option<String>,
},
#[serde(rename = "result")]
Result {
#[serde(default)]
subtype: Option<String>,
@@ -1508,12 +1507,21 @@ pub enum ClaudeJson {
#[serde(default, alias = "sessionId")]
session_id: Option<String>,
},
#[serde(rename = "approval_response")]
ApprovalResponse {
call_id: String,
tool_name: String,
approval_status: ApprovalStatus,
},
ControlRequest {
request_id: String,
request: ControlRequestType,
},
ControlResponse {
response: ControlResponseType,
},
ControlCancelRequest {
request_id: String,
},
// Catch-all for unknown message types
#[serde(untagged)]
Unknown {

View File

@@ -74,7 +74,10 @@ impl ClaudeAgentClient {
updated_permissions: Some(vec![PermissionUpdate {
update_type: PermissionUpdateType::SetMode,
mode: Some(PermissionMode::BypassPermissions),
destination: PermissionUpdateDestination::Session,
destination: Some(PermissionUpdateDestination::Session),
rules: None,
behavior: None,
directories: None,
}]),
})
} else {

View File

@@ -111,6 +111,7 @@ impl ProtocolPeer {
tool_name,
input,
permission_suggestions,
blocked_paths: _,
tool_use_id,
} => {
match client

View File

@@ -16,6 +16,9 @@ pub enum CLIMessage {
ControlResponse {
response: ControlResponseType,
},
ControlCancelRequest {
request_id: String,
},
Result(serde_json::Value),
#[serde(untagged)]
Other(serde_json::Value),
@@ -68,6 +71,8 @@ pub enum ControlRequestType {
#[serde(skip_serializing_if = "Option::is_none")]
permission_suggestions: Option<Vec<PermissionUpdate>>,
#[serde(skip_serializing_if = "Option::is_none")]
blocked_paths: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
tool_use_id: Option<String>,
},
HookCallback {
@@ -103,6 +108,8 @@ pub enum PermissionUpdateType {
AddRules,
RemoveRules,
ClearRules,
#[serde(other)]
Unknown,
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
@@ -112,17 +119,26 @@ pub enum PermissionUpdateDestination {
UserSettings,
ProjectSettings,
LocalSettings,
#[serde(other)]
Unknown,
}
/// Permission update operation
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
#[serde(rename_all = "snake_case")]
pub struct PermissionUpdate {
#[serde(rename = "type")]
pub update_type: PermissionUpdateType,
#[serde(skip_serializing_if = "Option::is_none")]
pub mode: Option<PermissionMode>,
pub destination: PermissionUpdateDestination,
#[serde(skip_serializing_if = "Option::is_none")]
pub destination: Option<PermissionUpdateDestination>,
#[serde(skip_serializing_if = "Option::is_none")]
pub rules: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub behavior: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub directories: Option<Vec<String>>,
}
/// Control response from SDK to CLI