From 010b163430735aa5d850c8e3f49313798398597d Mon Sep 17 00:00:00 2001 From: Coconut-Fish <78026974+Coconut-Fish@users.noreply.github.com> Date: Thu, 23 Apr 2026 15:36:03 +0800 Subject: [PATCH] =?UTF-8?q?Fix/=E4=B8=80=E9=94=AE=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E5=A4=B1=E6=95=88=20(#2249)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * style(FailoverQueueManager): 显示供应商备注信息 * style(FailoverQueueItem): 添加供应商备注字段以支持备注信息显示 * style(FailoverQueueManager): 显示供应商备注信息 * style(FailoverQueueItem): 添加供应商备注字段以支持备注信息显示 * style(FailoverQueueManager): 更新供应商备注信息的显示样式 * style(FailoverQueueItem): 添加条件序列化以优化供应商备注字段 * fix: 优化模型状态管理,确保配置更新时正确引用最新设置 * fix(skill): improve error handling for skill source directory resolution Co-authored-by: Copilot * fix(gemini): simplify project directory retrieval in scan_sessions function * fix(useModelState): optimize latestConfigRef assignment in useModelState hook * fix(useModelState): remove unnecessary blank line in useModelState hook --------- Co-authored-by: Copilot --- src-tauri/src/services/skill.rs | 24 +++++++++---------- .../src/session_manager/providers/gemini.rs | 5 +--- .../providers/forms/hooks/useModelState.ts | 13 ++++++---- tests/hooks/useImportSkillsFromApps.test.tsx | 1 + 4 files changed, 23 insertions(+), 20 deletions(-) diff --git a/src-tauri/src/services/skill.rs b/src-tauri/src/services/skill.rs index cfa2aa38a..d395fe58f 100644 --- a/src-tauri/src/services/skill.rs +++ b/src-tauri/src/services/skill.rs @@ -672,15 +672,16 @@ impl SkillService { repo_branch = used_branch; // 复制到 SSOT - let source = Self::resolve_skill_source_dir(&temp_dir, &skill.directory).ok_or_else(|| { - let missing = temp_dir.join(&source_rel).display().to_string(); - let _ = fs::remove_dir_all(&temp_dir); - anyhow!(format_skill_error( - "SKILL_DIR_NOT_FOUND", - &[("path", &missing)], - Some("checkRepoUrl"), - )) - })?; + let source = + Self::resolve_skill_source_dir(&temp_dir, &skill.directory).ok_or_else(|| { + let missing = temp_dir.join(&source_rel).display().to_string(); + let _ = fs::remove_dir_all(&temp_dir); + anyhow!(format_skill_error( + "SKILL_DIR_NOT_FOUND", + &[("path", &missing)], + Some("checkRepoUrl"), + )) + })?; let canonical_temp = temp_dir.canonicalize().unwrap_or_else(|_| temp_dir.clone()); let canonical_source = source.canonicalize().map_err(|_| { @@ -3024,9 +3025,8 @@ mod tests { let nested = temp.path().join("skills").join("nested-skill"); write_skill(&nested, "Nested Skill"); - let resolved = - SkillService::resolve_skill_source_dir(temp.path(), "skills/nested-skill") - .expect("nested skill should resolve from its relative source path"); + let resolved = SkillService::resolve_skill_source_dir(temp.path(), "skills/nested-skill") + .expect("nested skill should resolve from its relative source path"); assert_eq!(resolved, nested); } diff --git a/src-tauri/src/session_manager/providers/gemini.rs b/src-tauri/src/session_manager/providers/gemini.rs index 73ae17868..82cb6fcd8 100644 --- a/src-tauri/src/session_manager/providers/gemini.rs +++ b/src-tauri/src/session_manager/providers/gemini.rs @@ -35,10 +35,7 @@ pub fn scan_sessions() -> Vec { }; let project_root_file = entry.path().join(".project_root"); - let project_dir = match std::fs::read_to_string(project_root_file) { - Ok(name) => Some(name), - Err(_) => None, - }; + let project_dir = std::fs::read_to_string(project_root_file).ok(); for file_entry in chat_files.flatten() { let path = file_entry.path(); diff --git a/src/components/providers/forms/hooks/useModelState.ts b/src/components/providers/forms/hooks/useModelState.ts index d7c333e9d..7d6c7dd98 100644 --- a/src/components/providers/forms/hooks/useModelState.ts +++ b/src/components/providers/forms/hooks/useModelState.ts @@ -61,6 +61,9 @@ export function useModelState({ const isUserEditingRef = useRef(false); const lastConfigRef = useRef(settingsConfig); + const latestConfigRef = useRef(settingsConfig); + + latestConfigRef.current = settingsConfig; // 初始化读取:读新键;若缺失,按兼容优先级回退 // Haiku: DEFAULT_HAIKU || SMALL_FAST || MODEL @@ -130,8 +133,8 @@ export function useModelState({ if (field === "ANTHROPIC_DEFAULT_OPUS_MODEL") setDefaultOpusModel(value); try { - const currentConfig = settingsConfig - ? JSON.parse(settingsConfig) + const currentConfig = latestConfigRef.current + ? JSON.parse(latestConfigRef.current) : { env: {} }; if (!currentConfig.env) currentConfig.env = {}; const env = currentConfig.env as Record; @@ -146,12 +149,14 @@ export function useModelState({ // 删除旧键 delete env["ANTHROPIC_SMALL_FAST_MODEL"]; - onConfigChange(JSON.stringify(currentConfig, null, 2)); + const updatedConfig = JSON.stringify(currentConfig, null, 2); + latestConfigRef.current = updatedConfig; + onConfigChange(updatedConfig); } catch (err) { console.error("Failed to update model config:", err); } }, - [settingsConfig, onConfigChange], + [onConfigChange], ); return { diff --git a/tests/hooks/useImportSkillsFromApps.test.tsx b/tests/hooks/useImportSkillsFromApps.test.tsx index 27eea0875..cd8036d4a 100644 --- a/tests/hooks/useImportSkillsFromApps.test.tsx +++ b/tests/hooks/useImportSkillsFromApps.test.tsx @@ -13,6 +13,7 @@ function makeSkill(overrides: Partial = {}): InstalledSkill { gemini: false, opencode: false, openclaw: false, + hermes: false, }, installedAt: 0, updatedAt: 0,