From e191af4aa14175741b6aaa251cf91787815f8bc3 Mon Sep 17 00:00:00 2001 From: Allen Xu Date: Wed, 8 Jul 2026 10:34:49 +0800 Subject: [PATCH] fix: OpenCode live provider import updates (#4712) * fix: sync existing opencode providers from live config * fix: preserve OpenCode provider display names * docs: update comments and log messages to reflect new update behavior - fix stale comment in lib.rs that said existing providers are skipped - change log message from 'Imported' to 'Synced' since count now includes both new imports and updates --- src-tauri/src/lib.rs | 13 ++++---- src-tauri/src/services/provider/live.rs | 44 +++++++++++++++++-------- src-tauri/src/services/provider/mod.rs | 34 +++++++++++++++++++ 3 files changed, 72 insertions(+), 19 deletions(-) diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index fa73a8d92..9737a52da 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -672,18 +672,19 @@ pub fn run() { // 1.6. 自动同步 OpenCode / OpenClaw 的 live providers 到数据库 // - // additive 模式(OpenCode / OpenClaw)的 import 函数本身按 id 幂等, - // 已有的 provider 会被跳过,所以每次启动都跑是安全的——既保证新装 - // 用户开箱可见 live 中的供应商,也让外部修改的 live 文件能在重启 - // 后同步到数据库(与之前依赖前端"导入当前配置"按钮手动触发不同)。 + // additive 模式(OpenCode / OpenClaw)的 import 函数按 id 幂等—— + // 新 id 执行导入,已有 id 则更新 settings 和 display name,所以每次 + // 启动都跑是安全的:既保证新装用户开箱可见 live 中的供应商,也让外部 + // 修改的 live 文件能在重启后同步到数据库(与之前依赖前端"导入当前配置" + // 按钮手动触发不同)。 // // 底层 read_*_config 在文件不存在时返回默认空配置,因此新装且无 // live 文件的用户走 Ok(0) 路径,不会产生错误日志噪音。 match crate::services::provider::import_opencode_providers_from_live(&app_state) { Ok(count) if count > 0 => { - log::info!("✓ Imported {count} OpenCode provider(s) from live config"); + log::info!("✓ Synced {count} OpenCode provider(s) from live config"); } - Ok(_) => log::debug!("○ No new OpenCode providers to import"), + Ok(_) => log::debug!("○ No OpenCode provider changes from live config"), Err(e) => log::warn!("✗ Failed to import OpenCode providers: {e}"), } match crate::services::provider::import_openclaw_providers_from_live(&app_state) { diff --git a/src-tauri/src/services/provider/live.rs b/src-tauri/src/services/provider/live.rs index b4af9fc01..d289e289c 100644 --- a/src-tauri/src/services/provider/live.rs +++ b/src-tauri/src/services/provider/live.rs @@ -1404,15 +1404,10 @@ pub fn import_opencode_providers_from_live(state: &AppState) -> Result v, @@ -1422,13 +1417,36 @@ pub fn import_opencode_providers_from_live(state: &AppState) -> Result { + let display_name = config.name.clone().unwrap_or_else(|| existing.name.clone()); + if existing.settings_config != settings_config || existing.name != display_name + { + let mut provider = existing; + provider.name = display_name; + provider.settings_config = settings_config; + if let Err(e) = state.db.save_provider("opencode", &provider) { + log::warn!( + "Failed to update OpenCode provider '{id}' from live config: {e}" + ); + } else { + updated += 1; + log::info!("Updated OpenCode provider '{id}' from live config"); + } + } + } + Ok(None) => { + log::warn!("OpenCode provider '{id}' disappeared while importing live config") + } + Err(e) => log::warn!("Failed to look up OpenCode provider '{id}': {e}"), + } + continue; + } + // Create provider - let mut provider = Provider::with_id( - id.clone(), - config.name.clone().unwrap_or_else(|| id.clone()), - settings_config, - None, - ); + let display_name = config.name.clone().unwrap_or_else(|| id.clone()); + let mut provider = Provider::with_id(id.clone(), display_name, settings_config, None); provider.meta = Some(crate::provider::ProviderMeta { live_config_managed: Some(true), ..Default::default() @@ -1444,7 +1462,7 @@ pub fn import_opencode_providers_from_live(state: &AppState) -> Result