From ecf0ad58fd2989a66fb6ff4bb8e61595ba0c416f Mon Sep 17 00:00:00 2001 From: lzt404 <2596933790@qq.com> Date: Sun, 27 Sep 2026 18:06:36 +0800 Subject: [PATCH] fix(agents): disable Claude Code server-side auto mode checks for CPA gateways --- src-tauri/src/agents/configuration.rs | 7 +++++ src-tauri/src/agents/discovery.rs | 6 +++- src-tauri/src/main.rs | 1 + src-tauri/src/tests/agent_configuration.rs | 32 ++++++++++++++++++++-- src-tauri/src/tests/agent_state.rs | 3 +- 5 files changed, 45 insertions(+), 4 deletions(-) diff --git a/src-tauri/src/agents/configuration.rs b/src-tauri/src/agents/configuration.rs index 6b4dcb8..bfd5313 100644 --- a/src-tauri/src/agents/configuration.rs +++ b/src-tauri/src/agents/configuration.rs @@ -590,6 +590,7 @@ pub(crate) fn build_claude_agent_config( env.remove("ANTHROPIC_API_KEY"); env.remove("CLAUDE_CODE_EFFORT_LEVEL"); env.remove(CLAUDE_CODE_MAX_CONTEXT_TOKENS_ENV); + env.remove(CLAUDE_CODE_AUTO_MODE_SERVER_ENV); env.remove(CLAUDE_AUTOCOMPACT_PCT_OVERRIDE_ENV); env.remove(DISABLE_AUTO_COMPACT_ENV); for (key, value) in [ @@ -625,6 +626,10 @@ pub(crate) fn build_claude_agent_config( CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY_ENV.to_string(), serde_json::Value::String("1".to_string()), ); + env.insert( + CLAUDE_CODE_AUTO_MODE_SERVER_ENV.to_string(), + serde_json::Value::String("0".to_string()), + ); env.insert( CLAUDE_AUTOCOMPACT_PCT_OVERRIDE_ENV.to_string(), serde_json::Value::String(mappings.auto_compact_pct.to_string()), @@ -1159,6 +1164,7 @@ pub(crate) fn prepare_claude_code_managed_removal( "ANTHROPIC_DEFAULT_FABLE_MODEL", CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY_ENV, CLAUDE_CODE_MAX_CONTEXT_TOKENS_ENV, + CLAUDE_CODE_AUTO_MODE_SERVER_ENV, CLAUDE_AUTOCOMPACT_PCT_OVERRIDE_ENV, DISABLE_AUTO_COMPACT_ENV, "CLAUDE_CODE_SUBAGENT_MODEL", @@ -1800,6 +1806,7 @@ pub(crate) fn build_restored_claude_code_config( "ANTHROPIC_DEFAULT_FABLE_MODEL", CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY_ENV, CLAUDE_CODE_MAX_CONTEXT_TOKENS_ENV, + CLAUDE_CODE_AUTO_MODE_SERVER_ENV, CLAUDE_AUTOCOMPACT_PCT_OVERRIDE_ENV, DISABLE_AUTO_COMPACT_ENV, "CLAUDE_CODE_SUBAGENT_MODEL", diff --git a/src-tauri/src/agents/discovery.rs b/src-tauri/src/agents/discovery.rs index 298014e..41ed055 100644 --- a/src-tauri/src/agents/discovery.rs +++ b/src-tauri/src/agents/discovery.rs @@ -2790,7 +2790,11 @@ pub(crate) fn inspect_claude_agent_config( && env .and_then(|env| env.get(CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY_ENV)) .and_then(serde_json::Value::as_str) - == Some("1"); + == Some("1") + && env + .and_then(|env| env.get(CLAUDE_CODE_AUTO_MODE_SERVER_ENV)) + .and_then(serde_json::Value::as_str) + == Some("0"); let model = env .and_then(|env| env.get("ANTHROPIC_MODEL")) .and_then(serde_json::Value::as_str) diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs index 32f0dcb..8701410 100644 --- a/src-tauri/src/main.rs +++ b/src-tauri/src/main.rs @@ -181,6 +181,7 @@ const CLAUDE_DESKTOP_EXTENDED_CONTEXT_WINDOW: u64 = 1_000_000; const CLAUDE_CODE_MAX_CONTEXT_TOKENS_ENV: &str = "CLAUDE_CODE_MAX_CONTEXT_TOKENS"; const CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY_ENV: &str = "CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY"; +const CLAUDE_CODE_AUTO_MODE_SERVER_ENV: &str = "CLAUDE_CODE_AUTO_MODE_SERVER"; const CLAUDE_AUTOCOMPACT_PCT_OVERRIDE_ENV: &str = "CLAUDE_AUTOCOMPACT_PCT_OVERRIDE"; const DISABLE_AUTO_COMPACT_ENV: &str = "DISABLE_AUTO_COMPACT"; const DEFAULT_CLAUDE_AUTO_COMPACT_PCT: u8 = 90; diff --git a/src-tauri/src/tests/agent_configuration.rs b/src-tauri/src/tests/agent_configuration.rs index f0f67f1..1ef98e6 100644 --- a/src-tauri/src/tests/agent_configuration.rs +++ b/src-tauri/src/tests/agent_configuration.rs @@ -5,7 +5,7 @@ use super::*; fn claude_agent_config_preserves_existing_fields() { let rendered = build_claude_agent_config( Some( - r#"{"theme":"dark","env":{"KEEP":"yes","ANTHROPIC_API_KEY":"legacy-key","CLAUDE_CODE_EFFORT_LEVEL":"max"}}"#, + r#"{"theme":"dark","env":{"KEEP":"yes","ANTHROPIC_API_KEY":"legacy-key","CLAUDE_CODE_EFFORT_LEVEL":"max","CLAUDE_CODE_AUTO_MODE_SERVER":"1"}}"#, ), "http://127.0.0.1:8317", DEFAULT_API_KEY, @@ -26,6 +26,7 @@ fn claude_agent_config_preserves_existing_fields() { value["env"][CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY_ENV], "1" ); + assert_eq!(value["env"][CLAUDE_CODE_AUTO_MODE_SERVER_ENV], "0"); assert_eq!(value["env"][CLAUDE_CODE_MAX_CONTEXT_TOKENS_ENV], "200000"); assert_eq!(value["env"][CLAUDE_AUTOCOMPACT_PCT_OVERRIDE_ENV], "90"); assert!(value["env"].get(DISABLE_AUTO_COMPACT_ENV).is_none()); @@ -49,6 +50,7 @@ fn claude_code_inspection_normalizes_legacy_1m_suffix() { "ANTHROPIC_BASE_URL": "http://127.0.0.1:8317", "ANTHROPIC_AUTH_TOKEN": "test-key", "CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY": "1", + "CLAUDE_CODE_AUTO_MODE_SERVER": "0", "ANTHROPIC_MODEL": "deepseek-v4-pro[1m]", "ANTHROPIC_DEFAULT_OPUS_MODEL": "deepseek-v4-pro[1m]", "ANTHROPIC_DEFAULT_SONNET_MODEL": "deepseek-v4-pro[1m]", @@ -87,7 +89,33 @@ fn claude_code_requires_gateway_model_discovery_to_be_enabled() { "ANTHROPIC_BASE_URL": "http://127.0.0.1:8317", "ANTHROPIC_AUTH_TOKEN": "test-key", "ANTHROPIC_MODEL": "gpt-test", - "CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY": "0" + "CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY": "0", + "CLAUDE_CODE_AUTO_MODE_SERVER": "0" + } + }"#, + ) + .unwrap(); + + let (configured, model) = inspect_claude_agent_config(&path, 8317, "test-key").unwrap(); + + assert!(!configured); + assert_eq!(model.as_deref(), Some("gpt-test")); + fs::remove_dir_all(directory).unwrap(); +} + +#[test] +fn claude_code_requires_server_classifier_to_be_disabled_for_gateway() { + let directory = agent_test_home("claude-code-auto-mode-server"); + let path = directory.join("settings.json"); + fs::write( + &path, + r#"{ + "env": { + "ANTHROPIC_BASE_URL": "http://127.0.0.1:8317", + "ANTHROPIC_AUTH_TOKEN": "test-key", + "ANTHROPIC_MODEL": "gpt-test", + "CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY": "1", + "CLAUDE_CODE_AUTO_MODE_SERVER": "1" } }"#, ) diff --git a/src-tauri/src/tests/agent_state.rs b/src-tauri/src/tests/agent_state.rs index c2e2087..225f864 100644 --- a/src-tauri/src/tests/agent_state.rs +++ b/src-tauri/src/tests/agent_state.rs @@ -201,7 +201,7 @@ fn kimi_and_grok_status_does_not_depend_on_legacy_state() { #[test] fn session_merge_preserves_runtime_fields_for_other_agent_formats() { - let claude_original = r#"{"env":{"KEEP_ENV":"original","CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY":"0"},"keep":"claude"}"#; + let claude_original = r#"{"env":{"KEEP_ENV":"original","CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY":"0","CLAUDE_CODE_AUTO_MODE_SERVER":"1"},"keep":"claude"}"#; let claude_managed = build_claude_agent_config( Some(claude_original), "http://127.0.0.1:8317", @@ -230,6 +230,7 @@ fn session_merge_preserves_runtime_fields_for_other_agent_formats() { claude["env"][CLAUDE_CODE_ENABLE_GATEWAY_MODEL_DISCOVERY_ENV], "0" ); + assert_eq!(claude["env"][CLAUDE_CODE_AUTO_MODE_SERVER_ENV], "1"); assert!(claude["env"].get("ANTHROPIC_BASE_URL").is_none()); assert!(claude.get("model").is_none());