From 88dbeb533531ca7b929537ee8ad8696a75f6bd74 Mon Sep 17 00:00:00 2001 From: Jason Date: Sat, 17 Jan 2026 15:24:09 +0800 Subject: [PATCH] fix(opencode): remove current provider concept for additive mode OpenCode uses additive mode where all providers coexist in config file, so there's no "current" provider concept. This commit: - Skip setting is_current in switch_normal for OpenCode - Return empty string from ProviderService::current for OpenCode - Disable active provider highlight in ProviderCard for OpenCode --- src-tauri/src/services/provider/mod.rs | 17 +++++++++++++---- src/components/providers/ProviderCard.tsx | 10 +++++++--- 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/src-tauri/src/services/provider/mod.rs b/src-tauri/src/services/provider/mod.rs index c9bc0a439..9e6ecedf3 100644 --- a/src-tauri/src/services/provider/mod.rs +++ b/src-tauri/src/services/provider/mod.rs @@ -140,7 +140,13 @@ impl ProviderService { /// 使用有效的当前供应商 ID(验证过存在性)。 /// 优先从本地 settings 读取,验证后 fallback 到数据库的 is_current 字段。 /// 这确保了云同步场景下多设备可以独立选择供应商,且返回的 ID 一定有效。 + /// + /// 对于 OpenCode(累加模式),不存在"当前供应商"概念,直接返回空字符串。 pub fn current(state: &AppState, app_type: AppType) -> Result { + // OpenCode uses additive mode - no "current" provider concept + if matches!(app_type, AppType::OpenCode) { + return Ok(String::new()); + } crate::settings::get_effective_current_provider(&state.db, &app_type) .map(|opt| opt.unwrap_or_default()) } @@ -366,11 +372,14 @@ impl ProviderService { } } - // Update local settings (device-level, takes priority) - crate::settings::set_current_provider(&app_type, Some(id))?; + // OpenCode uses additive mode - skip setting is_current (no such concept) + if !matches!(app_type, AppType::OpenCode) { + // Update local settings (device-level, takes priority) + crate::settings::set_current_provider(&app_type, Some(id))?; - // Update database is_current (as default for new devices) - state.db.set_current_provider(app_type.as_str(), id)?; + // Update database is_current (as default for new devices) + state.db.set_current_provider(app_type.as_str(), id)?; + } // Sync to live (write_gemini_live handles security flag internally for Gemini) write_live_snapshot(&app_type, provider)?; diff --git a/src/components/providers/ProviderCard.tsx b/src/components/providers/ProviderCard.tsx index c661172a3..409bdec5c 100644 --- a/src/components/providers/ProviderCard.tsx +++ b/src/components/providers/ProviderCard.tsx @@ -184,12 +184,16 @@ export function ProviderCard({ }; // 判断是否是"当前使用中"的供应商 + // - OpenCode(累加模式):不存在"当前"概念,始终返回 false // - 故障转移模式:代理实际使用的供应商(activeProviderId) // - 代理接管模式(非故障转移):isCurrent // - 普通模式:isCurrent - const isActiveProvider = isAutoFailoverEnabled - ? activeProviderId === provider.id - : isCurrent; + const isActiveProvider = + appId === "opencode" + ? false + : isAutoFailoverEnabled + ? activeProviderId === provider.id + : isCurrent; // 判断是否使用绿色(代理接管模式)还是蓝色(普通模式) const shouldUseGreen = isProxyTakeover && isActiveProvider;