From c153e7104ef43acced4722ef103e2aef9f3e4c19 Mon Sep 17 00:00:00 2001 From: funnytime <162818986+funnytime75@users.noreply.github.com> Date: Wed, 4 Feb 2026 10:37:14 +0800 Subject: [PATCH 1/9] fix: titlebar does not follow theme in dark mode (#903) --- src-tauri/src/commands/misc.rs | 15 ++++++++++ src-tauri/src/lib.rs | 2 ++ src/components/theme-provider.tsx | 49 +++++++++++++++++++++++++++++++ 3 files changed, 66 insertions(+) diff --git a/src-tauri/src/commands/misc.rs b/src-tauri/src/commands/misc.rs index f848fe6bf..630e2ecda 100644 --- a/src-tauri/src/commands/misc.rs +++ b/src-tauri/src/commands/misc.rs @@ -954,3 +954,18 @@ fn run_windows_start_command(args: &[&str], terminal_name: &str) -> Result<(), S Ok(()) } + +/// 设置窗口主题(Windows/macOS 标题栏颜色) +/// theme: "dark" | "light" | "system" +#[tauri::command] +pub async fn set_window_theme(window: tauri::Window, theme: String) -> Result<(), String> { + use tauri::Theme; + + let tauri_theme = match theme.as_str() { + "dark" => Some(Theme::Dark), + "light" => Some(Theme::Light), + _ => None, // system default + }; + + window.set_theme(tauri_theme).map_err(|e| e.to_string()) +} diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index de307b856..f244e0506 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -956,6 +956,8 @@ pub fn run() { commands::test_proxy_url, commands::get_upstream_proxy_status, commands::scan_local_proxies, + // Window theme control + commands::set_window_theme, ]); let app = builder diff --git a/src/components/theme-provider.tsx b/src/components/theme-provider.tsx index b1a45072d..0a1fec2ae 100644 --- a/src/components/theme-provider.tsx +++ b/src/components/theme-provider.tsx @@ -5,6 +5,7 @@ import React, { useMemo, useState, } from "react"; +import { invoke } from "@tauri-apps/api/core"; type Theme = "light" | "dark" | "system"; @@ -94,6 +95,54 @@ export function ThemeProvider({ return () => mediaQuery.removeEventListener("change", handleChange); }, [theme]); + // Sync native window theme (Windows/macOS title bar) + useEffect(() => { + if (typeof window === "undefined") { + return; + } + + let isCancelled = false; + + const updateNativeTheme = async (nativeTheme: string) => { + if (isCancelled) return; + try { + await invoke("set_window_theme", { theme: nativeTheme }); + } catch (e) { + // Ignore errors (e.g., when not running in Tauri) + console.debug("Failed to set native window theme:", e); + } + }; + + // Determine current effective theme + if (theme === "system") { + const isDark = + window.matchMedia && + window.matchMedia("(prefers-color-scheme: dark)").matches; + updateNativeTheme(isDark ? "dark" : "light"); + } else { + updateNativeTheme(theme); + } + + // Listen to system theme changes for native window when in "system" mode + const mediaQuery = window.matchMedia("(prefers-color-scheme: dark)"); + const handleChange = () => { + if (theme === "system" && !isCancelled) { + updateNativeTheme(mediaQuery.matches ? "dark" : "light"); + } + }; + + if (theme === "system") { + mediaQuery.addEventListener("change", handleChange); + } + + return () => { + isCancelled = true; + if (theme === "system") { + mediaQuery.removeEventListener("change", handleChange); + } + }; + }, [theme]); + const value = useMemo( () => ({ theme, From 7bd29d721ebc33f8de855b1898793146f704df1f Mon Sep 17 00:00:00 2001 From: funnytime <162818986+funnytime75@users.noreply.github.com> Date: Wed, 4 Feb 2026 10:37:54 +0800 Subject: [PATCH 2/9] fix: prevent window flicker on silent startup (#901) Closes #892 --- src-tauri/tauri.conf.json | 1 + src-tauri/tauri.windows.conf.json | 1 + 2 files changed, 2 insertions(+) diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index 504c10fba..e076577cd 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -19,6 +19,7 @@ "height": 650, "minWidth": 900, "minHeight": 600, + "visible": false, "resizable": true, "fullscreen": false, "center": true diff --git a/src-tauri/tauri.windows.conf.json b/src-tauri/tauri.windows.conf.json index a58255315..d3733a4ee 100644 --- a/src-tauri/tauri.windows.conf.json +++ b/src-tauri/tauri.windows.conf.json @@ -6,6 +6,7 @@ "label": "main", "title": "CC Switch", "titleBarStyle": "Visible", + "visible": false, "minWidth": 900, "minHeight": 600 } From 60007ee4e8ced6a9e910accc8a324770ac6f7cab Mon Sep 17 00:00:00 2001 From: Jason Date: Mon, 2 Feb 2026 00:19:43 +0800 Subject: [PATCH 3/9] fix(windows): restore default home dir resolution to prevent data loss v3.10.3 introduced HOME env priority on Windows for test isolation, which caused database path to change when HOME differs from USERPROFILE (common in Git/MSYS environments), making providers appear to disappear. Changes: - Use CC_SWITCH_TEST_HOME for test isolation instead of HOME - Add legacy fallback to detect v3.10.3 database location on Windows - Add logging for legacy path detection to aid debugging --- CHANGELOG.md | 4 ++++ src-tauri/src/config.rs | 47 ++++++++++++++++++++++++++++++++++---- src-tauri/tests/support.rs | 3 +++ 3 files changed, 49 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 614ce4ee0..3e9a09874 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Fixed + +- **Windows Home Dir Regression**: Prevent providers/settings “disappearing” after upgrading from v3.10.2 → v3.10.3 when `HOME` differs from the real user profile directory; restore default path resolution and auto-detect the v3.10.3 legacy database location. + --- ## [3.10.3] - 2026-01-30 diff --git a/src-tauri/src/config.rs b/src-tauri/src/config.rs index aea9c4c8f..11a3c0758 100644 --- a/src-tauri/src/config.rs +++ b/src-tauri/src/config.rs @@ -7,16 +7,25 @@ use crate::error::AppError; /// 获取用户主目录,带回退和日志 /// -/// On Windows, respects the `HOME` environment variable (if set) to support -/// test isolation. Falls back to `dirs::home_dir()` otherwise. +/// ## Windows 注意事项 +/// +/// - `dirs::home_dir()` 在 Windows 上使用 `SHGetKnownFolderPath(FOLDERID_Profile)`, +/// 返回的是真实用户目录(类似 `C:\\Users\\Alice`),与 v3.10.2 行为一致。 +/// - 不要直接使用 `HOME` 环境变量:它可能由 Git/Cygwin/MSYS 等第三方工具注入, +/// 且不一定等于用户目录,可能导致 `.cc-switch/cc-switch.db` 路径变化,从而“看起来像数据丢失”。 +/// +/// ## 测试隔离 +/// +/// 为了让 Windows CI/本地测试能稳定隔离真实用户数据,可通过 `CC_SWITCH_TEST_HOME` +/// 显式覆盖 home dir(仅用于测试/调试场景)。 pub fn get_home_dir() -> PathBuf { - #[cfg(windows)] - if let Ok(home) = std::env::var("HOME") { + if let Ok(home) = std::env::var("CC_SWITCH_TEST_HOME") { let trimmed = home.trim(); if !trimmed.is_empty() { return PathBuf::from(trimmed); } } + dirs::home_dir().unwrap_or_else(|| { log::warn!("无法获取用户主目录,回退到当前目录"); PathBuf::from(".") @@ -81,7 +90,35 @@ pub fn get_app_config_dir() -> PathBuf { if let Some(custom) = crate::app_store::get_app_config_dir_override() { return custom; } - get_home_dir().join(".cc-switch") + + let default_dir = get_home_dir().join(".cc-switch"); + + // 兼容 v3.10.3:当用户环境存在 `HOME` 且与真实用户目录不同, + // v3.10.3 可能在 `HOME/.cc-switch/` 下创建/使用了数据库。 + // 这里仅在“默认位置没有数据库”时回退到旧位置,避免再次出现“供应商消失”问题, + // 同时也避免新安装因为 `HOME` 被设置而写入非预期路径。 + #[cfg(windows)] + { + let default_db = default_dir.join("cc-switch.db"); + if !default_db.exists() { + if let Ok(home_env) = std::env::var("HOME") { + let trimmed = home_env.trim(); + if !trimmed.is_empty() { + let legacy_dir = PathBuf::from(trimmed).join(".cc-switch"); + if legacy_dir.join("cc-switch.db").exists() { + log::info!( + "Detected v3.10.3 legacy database at {}, using it instead of {}", + legacy_dir.display(), + default_dir.display() + ); + return legacy_dir; + } + } + } + } + } + + default_dir } /// 获取应用配置文件路径 diff --git a/src-tauri/tests/support.rs b/src-tauri/tests/support.rs index 78f18759f..3a45f0e0e 100644 --- a/src-tauri/tests/support.rs +++ b/src-tauri/tests/support.rs @@ -14,6 +14,9 @@ pub fn ensure_test_home() -> &'static Path { let _ = std::fs::remove_dir_all(&base); } std::fs::create_dir_all(&base).expect("create test home"); + // Windows 上 `dirs::home_dir()` 不受 HOME/USERPROFILE 影响(走 Known Folder API), + // 用 CC_SWITCH_TEST_HOME 显式覆盖,以确保测试不会污染真实用户目录。 + std::env::set_var("CC_SWITCH_TEST_HOME", &base); std::env::set_var("HOME", &base); #[cfg(windows)] std::env::set_var("USERPROFILE", &base); From 68a0c304d85316398abf3fc9ff5cd8eac41f493f Mon Sep 17 00:00:00 2001 From: Jason Date: Mon, 2 Feb 2026 08:49:23 +0800 Subject: [PATCH 4/9] feat(ui): hide provider test button Provider request formats are complex and varied, making it difficult to create a unified test mechanism. Users may incorrectly assume request format issues indicate provider unavailability. Code is commented out (not deleted) for easy restoration if needed. --- src/components/providers/ProviderList.tsx | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/components/providers/ProviderList.tsx b/src/components/providers/ProviderList.tsx index b9d499719..dd1d281d8 100644 --- a/src/components/providers/ProviderList.tsx +++ b/src/components/providers/ProviderList.tsx @@ -20,7 +20,7 @@ import type { Provider } from "@/types"; import type { AppId } from "@/lib/api"; import { providersApi } from "@/lib/api/providers"; import { useDragSort } from "@/hooks/useDragSort"; -import { useStreamCheck } from "@/hooks/useStreamCheck"; +// import { useStreamCheck } from "@/hooks/useStreamCheck"; // 测试功能已隐藏 import { ProviderCard } from "@/components/providers/ProviderCard"; import { ProviderEmptyState } from "@/components/providers/ProviderEmptyState"; import { @@ -93,8 +93,8 @@ export function ProviderList({ [appId, opencodeLiveIds], ); - // 流式健康检查 - const { checkProvider, isChecking } = useStreamCheck(appId); + // 流式健康检查 - 功能已隐藏 + // const { checkProvider, isChecking } = useStreamCheck(appId); // 故障转移相关 const { data: isAutoFailoverEnabled } = useAutoFailoverEnabled(appId); @@ -139,9 +139,10 @@ export function ProviderList({ [appId, addToQueue, removeFromQueue], ); - const handleTest = (provider: Provider) => { - checkProvider(provider.id, provider.name); - }; + // handleTest 功能已隐藏 - 供应商请求格式复杂难以统一测试 + // const handleTest = (provider: Provider) => { + // checkProvider(provider.id, provider.name); + // }; const [searchTerm, setSearchTerm] = useState(""); const [isSearchOpen, setIsSearchOpen] = useState(false); @@ -229,8 +230,9 @@ export function ProviderList({ onConfigureUsage={onConfigureUsage} onOpenWebsite={onOpenWebsite} onOpenTerminal={onOpenTerminal} - onTest={appId !== "opencode" ? handleTest : undefined} - isTesting={isChecking(provider.id)} + // onTest 功能已隐藏 - 供应商请求格式复杂难以统一测试 + // onTest={appId !== "opencode" ? handleTest : undefined} + isTesting={false} // isChecking(provider.id) - 测试功能已隐藏 isProxyRunning={isProxyRunning} isProxyTakeover={isProxyTakeover} // 故障转移相关:联动状态 From d98183f3dac965463830d3638aeae92c62b01948 Mon Sep 17 00:00:00 2001 From: Jason Date: Mon, 2 Feb 2026 12:15:05 +0800 Subject: [PATCH 5/9] fix(i18n): replace hardcoded Chinese strings in Session Manager - Add i18n keys for relative time (justNow, minutesAgo, hoursAgo, daysAgo) - Add i18n keys for role labels (roleUser, roleSystem, roleTool) - Add i18n keys for UI elements (tocTitle, searchSessions, clickToCopyPath) - Update formatRelativeTime and getRoleLabel to accept t function - Add useTranslation hook to SessionToc component --- src/components/sessions/SessionItem.tsx | 2 +- .../sessions/SessionManagerPage.tsx | 4 ++-- .../sessions/SessionMessageItem.tsx | 2 +- src/components/sessions/SessionToc.tsx | 9 ++++--- src/components/sessions/utils.ts | 24 ++++++++++++------- src/i18n/locales/en.json | 12 +++++++++- src/i18n/locales/ja.json | 12 +++++++++- src/i18n/locales/zh.json | 12 +++++++++- 8 files changed, 58 insertions(+), 19 deletions(-) diff --git a/src/components/sessions/SessionItem.tsx b/src/components/sessions/SessionItem.tsx index 628474e3c..14bf601de 100644 --- a/src/components/sessions/SessionItem.tsx +++ b/src/components/sessions/SessionItem.tsx @@ -70,7 +70,7 @@ export function SessionItem({
- {lastActive ? formatRelativeTime(lastActive) : t("common.unknown")} + {lastActive ? formatRelativeTime(lastActive, t) : t("common.unknown")}
diff --git a/src/components/sessions/SessionManagerPage.tsx b/src/components/sessions/SessionManagerPage.tsx index c25291c36..b1201b35f 100644 --- a/src/components/sessions/SessionManagerPage.tsx +++ b/src/components/sessions/SessionManagerPage.tsx @@ -288,7 +288,7 @@ export function SessionManagerPage() { - 搜索会话 + {t("sessionManager.searchSessions")} - setTerminalTarget(value as TerminalTarget) - } - > - - - - - - -
- - Terminal -
-
- -
- - iTerm2 (Untested) -
-
- -
- - Ghostty -
-
- -
- - Kitty -
-
- -
- - WezTerm (Untested) -
-
- -
- - Alacritty (Untested) -
-
-
- - - - - - - - {selectedSession.resumeCommand - ? t("sessionManager.resumeTooltip", { - defaultValue: "在终端中恢复此会话", - }) - : t("sessionManager.noResumeCommand", { - defaultValue: "此会话无法恢复", - })} - - - + + + + + + {selectedSession.resumeCommand + ? t("sessionManager.resumeTooltip", { + defaultValue: "在终端中恢复此会话", + }) + : t("sessionManager.noResumeCommand", { + defaultValue: "此会话无法恢复", + })} + + )} diff --git a/src/components/settings/TerminalSettings.tsx b/src/components/settings/TerminalSettings.tsx index e1e77d7c5..c1d62a158 100644 --- a/src/components/settings/TerminalSettings.tsx +++ b/src/components/settings/TerminalSettings.tsx @@ -15,6 +15,7 @@ const MACOS_TERMINALS = [ { value: "alacritty", labelKey: "settings.terminal.options.macos.alacritty" }, { value: "kitty", labelKey: "settings.terminal.options.macos.kitty" }, { value: "ghostty", labelKey: "settings.terminal.options.macos.ghostty" }, + { value: "wezterm", labelKey: "settings.terminal.options.macos.wezterm" }, ] as const; const WINDOWS_TERMINALS = [ diff --git a/src/i18n/locales/en.json b/src/i18n/locales/en.json index 1053a7cac..4380ea56e 100644 --- a/src/i18n/locales/en.json +++ b/src/i18n/locales/en.json @@ -300,7 +300,8 @@ "iterm2": "iTerm2", "alacritty": "Alacritty", "kitty": "Kitty", - "ghostty": "Ghostty" + "ghostty": "Ghostty", + "wezterm": "WezTerm" }, "windows": { "cmd": "Command Prompt", diff --git a/src/i18n/locales/ja.json b/src/i18n/locales/ja.json index 2a47b5013..b16bb8fd0 100644 --- a/src/i18n/locales/ja.json +++ b/src/i18n/locales/ja.json @@ -300,7 +300,8 @@ "iterm2": "iTerm2", "alacritty": "Alacritty", "kitty": "Kitty", - "ghostty": "Ghostty" + "ghostty": "Ghostty", + "wezterm": "WezTerm" }, "windows": { "cmd": "コマンドプロンプト", diff --git a/src/i18n/locales/zh.json b/src/i18n/locales/zh.json index e3a504efe..a1a2b3a14 100644 --- a/src/i18n/locales/zh.json +++ b/src/i18n/locales/zh.json @@ -300,7 +300,8 @@ "iterm2": "iTerm2", "alacritty": "Alacritty", "kitty": "Kitty", - "ghostty": "Ghostty" + "ghostty": "Ghostty", + "wezterm": "WezTerm" }, "windows": { "cmd": "命令提示符", diff --git a/src/lib/api/sessions.ts b/src/lib/api/sessions.ts index 358d9abc1..3b393c44d 100644 --- a/src/lib/api/sessions.ts +++ b/src/lib/api/sessions.ts @@ -14,14 +14,12 @@ export const sessionsApi = { }, async launchTerminal(options: { - target: string; command: string; cwd?: string | null; customConfig?: string | null; }): Promise { - const { target, command, cwd, customConfig } = options; + const { command, cwd, customConfig } = options; return await invoke("launch_session_terminal", { - target, command, cwd, customConfig, From 92785a8078ecf0a080567d9d60d239e6cbcda85a Mon Sep 17 00:00:00 2001 From: Jason Date: Wed, 4 Feb 2026 21:49:00 +0800 Subject: [PATCH 7/9] docs: add AICoding.sh sponsor to README files Add AICoding.sh as a new sponsor with translations for all three language versions (EN, ZH, JA). --- README.md | 5 +++++ README_JA.md | 5 +++++ README_ZH.md | 5 +++++ assets/partners/logos/aicoding.jpg | Bin 0 -> 69306 bytes 4 files changed, 15 insertions(+) create mode 100644 assets/partners/logos/aicoding.jpg diff --git a/README.md b/README.md index 7b5f03102..737480ac1 100644 --- a/README.md +++ b/README.md @@ -48,6 +48,11 @@ Claude Code / Codex / Gemini official channels at 38% / 2% / 9% of original pric Thanks to DMXAPI for sponsoring this project! DMXAPI provides global large model API services to 200+ enterprise users. One API key for all global models. Features include: instant invoicing, unlimited concurrency, starting from $0.15, 24/7 technical support. GPT/Claude/Gemini all at 32% off, domestic models 20-50% off, Claude Code exclusive models at 66% off! Register here + +AICoding +Thanks to AICoding.sh for sponsoring this project! AICoding.sh — Global AI Model API Relay Service at Unbeatable Prices! Claude Code at 19% of original price, GPT at just 1%! Trusted by hundreds of enterprises for cost-effective AI services. Supports Claude Code, GPT, Gemini and major domestic models, with enterprise-grade high concurrency, fast invoicing, and 24/7 dedicated technical support. CC Switch users who register via this link get 10% off their first top-up! + + ## Screenshots diff --git a/README_JA.md b/README_JA.md index 2926e4e78..303712258 100644 --- a/README_JA.md +++ b/README_JA.md @@ -48,6 +48,11 @@ Claude Code / Codex / Gemini 公式チャンネルが最安で元価格の 38% / DMXAPI のご支援に感謝します!DMXAPI は 200 社以上の企業ユーザーにグローバル大規模モデル API サービスを提供しています。1 つの API キーで全世界のモデルにアクセス可能。即時請求書発行、同時接続数無制限、最低 $0.15 から、24 時間年中無休のテクニカルサポート。GPT/Claude/Gemini が全て 32% オフ、国内モデルは 20〜50% オフ、Claude Code 専用モデルは 66% オフ実施中!登録はこちら + +AICoding +AICoding.sh のご支援に感謝します!AICoding.sh —— グローバル AI モデル API 超お得な中継サービス!Claude Code 81% オフ、GPT 99% オフ!数百社の企業に高コストパフォーマンスの AI サービスを提供。Claude Code、GPT、Gemini および国内主要モデルに対応、エンタープライズ級の高同時接続、迅速な請求書発行、24 時間年中無休の専属テクニカルサポート。こちらのリンクから登録した CC Switch ユーザーは、初回チャージ 10% オフ! + + ## スクリーンショット diff --git a/README_ZH.md b/README_ZH.md index e9715cd1d..e33a32f39 100644 --- a/README_ZH.md +++ b/README_ZH.md @@ -49,6 +49,11 @@ Claude Code / Codex / Gemini 官方渠道低至 3.8 / 0.2 / 0.9 折,充值更 为200多家企业用户提供全球大模型API服务。· 充值即开票 ·当天开票 ·并发不限制 ·1元起充 · 7x24 在线技术辅导,GPT/Claude/Gemini全部6.8折,国内模型5~8折,Claude Code 专属模型3.4折进行中!点击这里注册 + +AICoding +感谢 AICoding.sh 赞助了本项目!AICoding.sh —— 全球大模型 API 超值中转服务!Claude Code 1.9 折,GPT 0.1 折,已为数百家企业提供高性价比 AI 服务。支持 Claude Code、GPT、Gemini 及国内主流模型,企业级高并发、极速开票、7×24 专属技术支持,通过此链接 注册的 CC Switch 用户,首充可享受九折优惠! + + ## 界面预览 diff --git a/assets/partners/logos/aicoding.jpg b/assets/partners/logos/aicoding.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6f5704eadd5fe6c8e965dc98c59da4ee4e0b3b54 GIT binary patch literal 69306 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̒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 Z9`QA639@UX#JxzTveHVJY{~m>{|AMP>h1sl literal 0 HcmV?d00001 From 95bc0e38df43bda454b670b639fa3dcd3db9b8f9 Mon Sep 17 00:00:00 2001 From: Dex Miller Date: Fri, 6 Feb 2026 16:02:57 +0800 Subject: [PATCH 8/9] style: format code and apply clippy lint fixes (#941) --- src-tauri/src/commands/misc.rs | 2 +- src-tauri/src/commands/mod.rs | 4 +- src-tauri/src/lib.rs | 2 +- .../src/session_manager/providers/claude.rs | 14 ++---- .../src/session_manager/providers/codex.rs | 23 +++------- .../src/session_manager/providers/utils.rs | 6 +-- src-tauri/src/session_manager/terminal/mod.rs | 14 +++--- src/App.tsx | 44 ++++++++++--------- src/components/common/AppCountBar.tsx | 5 ++- src/components/common/AppToggleGroup.tsx | 14 +++--- src/components/common/ListItemRow.tsx | 5 ++- src/components/mcp/UnifiedMcpPanel.tsx | 9 +++- src/components/sessions/SessionItem.tsx | 4 +- .../sessions/SessionManagerPage.tsx | 28 ++++++------ .../sessions/SessionMessageItem.tsx | 2 +- src/components/sessions/SessionToc.tsx | 4 +- src/components/sessions/utils.ts | 9 ++-- src/components/skills/UnifiedSkillsPanel.tsx | 19 ++++---- src/components/ui/scroll-area.tsx | 2 +- src/components/ui/tooltip.tsx | 2 +- src/config/appConfig.tsx | 33 ++++++++++---- src/hooks/useSessionSearch.ts | 4 +- src/lib/api/sessions.ts | 2 +- src/lib/api/skills.ts | 11 +---- 24 files changed, 135 insertions(+), 127 deletions(-) diff --git a/src-tauri/src/commands/misc.rs b/src-tauri/src/commands/misc.rs index 9a75b0e1c..8e6da2bb4 100644 --- a/src-tauri/src/commands/misc.rs +++ b/src-tauri/src/commands/misc.rs @@ -755,7 +755,7 @@ fn launch_macos_open_app( let output = cmd .output() - .map_err(|e| format!("启动 {} 失败: {e}", app_name))?; + .map_err(|e| format!("启动 {app_name} 失败: {e}"))?; if !output.status.success() { let stderr = String::from_utf8_lossy(&output.stderr); diff --git a/src-tauri/src/commands/mod.rs b/src-tauri/src/commands/mod.rs index df5e47d25..ff81fde2e 100644 --- a/src-tauri/src/commands/mod.rs +++ b/src-tauri/src/commands/mod.rs @@ -12,8 +12,8 @@ mod plugin; mod prompt; mod provider; mod proxy; -mod settings; mod session_manager; +mod settings; pub mod skill; mod stream_check; mod usage; @@ -30,8 +30,8 @@ pub use plugin::*; pub use prompt::*; pub use provider::*; pub use proxy::*; -pub use settings::*; pub use session_manager::*; +pub use settings::*; pub use skill::*; pub use stream_check::*; pub use usage::*; diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index f244e0506..5dd10a152 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -20,8 +20,8 @@ mod prompt_files; mod provider; mod provider_defaults; mod proxy; -mod session_manager; mod services; +mod session_manager; mod settings; mod store; mod tray; diff --git a/src-tauri/src/session_manager/providers/claude.rs b/src-tauri/src/session_manager/providers/claude.rs index 48101d3e0..b953c015d 100644 --- a/src-tauri/src/session_manager/providers/claude.rs +++ b/src-tauri/src/session_manager/providers/claude.rs @@ -55,17 +55,12 @@ pub fn load_messages(path: &Path) -> Result, String> { .and_then(Value::as_str) .unwrap_or("unknown") .to_string(); - let content = message - .get("content") - .map(extract_text) - .unwrap_or_default(); + let content = message.get("content").map(extract_text).unwrap_or_default(); if content.trim().is_empty() { continue; } - let ts = value - .get("timestamp") - .and_then(parse_timestamp_to_ms); + let ts = value.get("timestamp").and_then(parse_timestamp_to_ms); messages.push(SessionMessage { role, content, ts }); } @@ -127,10 +122,7 @@ fn parse_session(path: &Path) -> Option { None => continue, }; - let text = message - .get("content") - .map(extract_text) - .unwrap_or_default(); + let text = message.get("content").map(extract_text).unwrap_or_default(); if text.trim().is_empty() { continue; } diff --git a/src-tauri/src/session_manager/providers/codex.rs b/src-tauri/src/session_manager/providers/codex.rs index 4cff72915..6c2b62b58 100644 --- a/src-tauri/src/session_manager/providers/codex.rs +++ b/src-tauri/src/session_manager/providers/codex.rs @@ -2,8 +2,8 @@ use std::fs::File; use std::io::{BufRead, BufReader}; use std::path::{Path, PathBuf}; -use serde_json::Value; use regex::Regex; +use serde_json::Value; use crate::codex_config::get_codex_config_dir; use crate::session_manager::{SessionMessage, SessionMeta}; @@ -60,17 +60,12 @@ pub fn load_messages(path: &Path) -> Result, String> { .and_then(Value::as_str) .unwrap_or("unknown") .to_string(); - let content = payload - .get("content") - .map(extract_text) - .unwrap_or_default(); + let content = payload.get("content").map(extract_text).unwrap_or_default(); if content.trim().is_empty() { continue; } - let ts = value - .get("timestamp") - .and_then(parse_timestamp_to_ms); + let ts = value.get("timestamp").and_then(parse_timestamp_to_ms); messages.push(SessionMessage { role, content, ts }); } @@ -139,10 +134,7 @@ fn parse_session(path: &Path) -> Option { continue; } - let text = payload - .get("content") - .map(extract_text) - .unwrap_or_default(); + let text = payload.get("content").map(extract_text).unwrap_or_default(); if text.trim().is_empty() { continue; } @@ -174,10 +166,9 @@ fn parse_session(path: &Path) -> Option { fn infer_session_id_from_filename(path: &Path) -> Option { let file_name = path.file_name()?.to_string_lossy(); - let re = Regex::new( - r"[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}", - ) - .ok()?; + let re = + Regex::new(r"[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}") + .ok()?; re.find(&file_name).map(|mat| mat.as_str().to_string()) } diff --git a/src-tauri/src/session_manager/providers/utils.rs b/src-tauri/src/session_manager/providers/utils.rs index 5e8c43877..76408ea35 100644 --- a/src-tauri/src/session_manager/providers/utils.rs +++ b/src-tauri/src/session_manager/providers/utils.rs @@ -13,7 +13,7 @@ pub fn extract_text(content: &Value) -> String { Value::String(text) => text.to_string(), Value::Array(items) => items .iter() - .filter_map(|item| extract_text_from_item(item)) + .filter_map(extract_text_from_item) .filter(|text| !text.trim().is_empty()) .collect::>() .join("\n"), @@ -68,10 +68,10 @@ pub fn path_basename(value: &str) -> Option { if trimmed.is_empty() { return None; } - let normalized = trimmed.trim_end_matches(|c| c == '/' || c == '\\'); + let normalized = trimmed.trim_end_matches(['/', '\\']); let last = normalized .split(['/', '\\']) - .last() + .next_back() .filter(|segment| !segment.is_empty())?; Some(last.to_string()) } diff --git a/src-tauri/src/session_manager/terminal/mod.rs b/src-tauri/src/session_manager/terminal/mod.rs index 799fa6552..f4d93adda 100644 --- a/src-tauri/src/session_manager/terminal/mod.rs +++ b/src-tauri/src/session_manager/terminal/mod.rs @@ -32,9 +32,8 @@ fn launch_macos_terminal(command: &str, cwd: Option<&str>) -> Result<(), String> let script = format!( r#"tell application "Terminal" activate - do script "{}" -end tell"#, - escaped + do script "{escaped}" +end tell"# ); let status = Command::new("osascript") @@ -59,10 +58,9 @@ fn launch_iterm(command: &str, cwd: Option<&str>) -> Result<(), String> { activate create window with default profile tell current session of current window - write text "{}" + write text "{escaped}" end tell -end tell"#, - escaped +end tell"# ); let status = Command::new("osascript") @@ -88,7 +86,7 @@ fn launch_ghostty(command: &str, cwd: Option<&str>) -> Result<(), String> { // Note: The user's error output didn't show the working dir arg failure, so we assume flag is okay or we stick to compatible ones. // Documentation says --working-directory is supported in CLI. let work_dir_arg = if let Some(dir) = cwd { - format!("--working-directory={}", dir) + format!("--working-directory={dir}") } else { "".to_string() }; @@ -251,7 +249,7 @@ fn build_shell_command(command: &str, cwd: Option<&str>) -> String { fn shell_escape(value: &str) -> String { let escaped = value.replace('\\', "\\\\").replace('"', "\\\""); - format!("\"{}\"", escaped) + format!("\"{escaped}\"") } fn escape_osascript(value: &str) -> String { diff --git a/src/App.tsx b/src/App.tsx index a11487d2f..de9c6881c 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -175,7 +175,7 @@ function App() { // 当前应用代理实际使用的供应商 ID(从 active_targets 中获取) const activeProviderId = useMemo(() => { const target = proxyStatus?.active_targets?.find( - (t) => t.app_type === activeApp + (t) => t.app_type === activeApp, ); return target?.provider_id; }, [proxyStatus?.active_targets, activeApp]); @@ -208,7 +208,7 @@ function App() { if (event.appType === activeApp) { await refetch(); } - } + }, ); } catch (error) { console.error("[App] Failed to subscribe provider switch event", error); @@ -242,7 +242,7 @@ function App() { } catch (error) { console.error( "[App] Failed to subscribe universal-provider-synced event", - error + error, ); } }; @@ -270,7 +270,7 @@ function App() { } catch (error) { console.error( "[App] Failed to check environment conflicts on startup:", - error + error, ); } }; @@ -286,7 +286,7 @@ function App() { if (migrated) { toast.success( t("migration.success", { defaultValue: "配置迁移成功" }), - { closeButton: true } + { closeButton: true }, ); } } catch (error) { @@ -302,7 +302,7 @@ function App() { const checkSkillsMigration = async () => { try { const result = await invoke<{ count: number; error?: string } | null>( - "get_skills_migration_result" + "get_skills_migration_result", ); if (result?.error) { toast.error(t("migration.skillsFailed"), { @@ -336,10 +336,10 @@ function App() { // 合并新检测到的冲突 setEnvConflicts((prev) => { const existingKeys = new Set( - prev.map((c) => `${c.varName}:${c.sourcePath}`) + prev.map((c) => `${c.varName}:${c.sourcePath}`), ); const newConflicts = conflicts.filter( - (c) => !existingKeys.has(`${c.varName}:${c.sourcePath}`) + (c) => !existingKeys.has(`${c.varName}:${c.sourcePath}`), ); return [...prev, ...newConflicts]; }); @@ -351,7 +351,7 @@ function App() { } catch (error) { console.error( "[App] Failed to check environment conflicts on app switch:", - error + error, ); } }; @@ -433,7 +433,7 @@ function App() { t("notifications.removeFromConfigSuccess", { defaultValue: "已从配置移除", }), - { closeButton: true } + { closeButton: true }, ); } else { // Delete from database @@ -445,7 +445,7 @@ function App() { // Generate a unique provider key for OpenCode duplication const generateUniqueOpencodeKey = ( originalKey: string, - existingKeys: string[] + existingKeys: string[], ): string => { const baseKey = `${originalKey}-copy`; @@ -487,7 +487,7 @@ function App() { const existingKeys = Object.keys(providers); duplicatedProvider.providerKey = generateUniqueOpencodeKey( provider.id, - existingKeys + existingKeys, ); } @@ -498,7 +498,7 @@ function App() { (p) => p.sortIndex !== undefined && p.sortIndex >= newSortIndex! && - p.id !== provider.id + p.id !== provider.id, ) .map((p) => ({ id: p.id, @@ -514,7 +514,7 @@ function App() { toast.error( t("provider.sortUpdateFailed", { defaultValue: "排序更新失败", - }) + }), ); return; // 如果排序更新失败,不继续添加 } @@ -532,7 +532,7 @@ function App() { toast.success( t("provider.terminalOpened", { defaultValue: "终端已打开", - }) + }), ); } catch (error) { console.error("[App] Failed to open terminal", error); @@ -540,7 +540,7 @@ function App() { toast.error( t("provider.terminalOpenFailed", { defaultValue: "打开终端失败", - }) + (errorMessage ? `: ${errorMessage}` : "") + }) + (errorMessage ? `: ${errorMessage}` : ""), ); } }; @@ -721,7 +721,7 @@ function App() { } catch (error) { console.error( "[App] Failed to re-check conflicts after deletion:", - error + error, ); } }} @@ -755,7 +755,9 @@ function App() { size="icon" onClick={() => setCurrentView( - currentView === "skillsDiscovery" ? "skills" : "providers" + currentView === "skillsDiscovery" + ? "skills" + : "providers", ) } className="mr-2 rounded-lg" @@ -788,7 +790,7 @@ function App() { "text-xl font-semibold transition-colors", isProxyRunning && isCurrentAppTakeoverActive ? "text-emerald-500 hover:text-emerald-600 dark:text-emerald-400 dark:hover:text-emerald-300" - : "text-blue-500 hover:text-blue-600 dark:text-blue-400 dark:hover:text-blue-300" + : "text-blue-500 hover:text-blue-600 dark:text-blue-400 dark:hover:text-blue-300", )} > CC Switch @@ -934,7 +936,7 @@ function App() { "transition-all duration-300 ease-in-out overflow-hidden", isCurrentAppTakeoverActive ? "opacity-100 max-w-[100px] scale-100" - : "opacity-0 max-w-0 scale-75 pointer-events-none" + : "opacity-0 max-w-0 scale-75 pointer-events-none", )} > @@ -962,7 +964,7 @@ function App() { "transition-all duration-200 ease-in-out overflow-hidden", hasSkillsSupport ? "opacity-100 w-8 scale-100 px-2" - : "opacity-0 w-0 scale-75 pointer-events-none px-0 -ml-1" + : "opacity-0 w-0 scale-75 pointer-events-none px-0 -ml-1", )} title={t("skills.manage")} > diff --git a/src/components/common/AppCountBar.tsx b/src/components/common/AppCountBar.tsx index 3045e68ed..295d8e24c 100644 --- a/src/components/common/AppCountBar.tsx +++ b/src/components/common/AppCountBar.tsx @@ -8,7 +8,10 @@ interface AppCountBarProps { counts: Record; } -export const AppCountBar: React.FC = ({ totalLabel, counts }) => { +export const AppCountBar: React.FC = ({ + totalLabel, + counts, +}) => { return (
diff --git a/src/components/common/AppToggleGroup.tsx b/src/components/common/AppToggleGroup.tsx index 27d77bd7c..0f18f7fc9 100644 --- a/src/components/common/AppToggleGroup.tsx +++ b/src/components/common/AppToggleGroup.tsx @@ -12,7 +12,10 @@ interface AppToggleGroupProps { onToggle: (app: AppId, enabled: boolean) => void; } -export const AppToggleGroup: React.FC = ({ apps, onToggle }) => { +export const AppToggleGroup: React.FC = ({ + apps, + onToggle, +}) => { return (
{APP_IDS.map((app) => { @@ -25,16 +28,17 @@ export const AppToggleGroup: React.FC = ({ apps, onToggle } type="button" onClick={() => onToggle(app, !enabled)} className={`w-7 h-7 rounded-lg flex items-center justify-center transition-all ${ - enabled - ? activeClass - : "opacity-35 hover:opacity-70" + enabled ? activeClass : "opacity-35 hover:opacity-70" }`} > {icon} -

{label}{enabled ? " ✓" : ""}

+

+ {label} + {enabled ? " ✓" : ""} +

); diff --git a/src/components/common/ListItemRow.tsx b/src/components/common/ListItemRow.tsx index 8d0c54fd4..90ec303bd 100644 --- a/src/components/common/ListItemRow.tsx +++ b/src/components/common/ListItemRow.tsx @@ -5,7 +5,10 @@ interface ListItemRowProps { children: React.ReactNode; } -export const ListItemRow: React.FC = ({ isLast, children }) => { +export const ListItemRow: React.FC = ({ + isLast, + children, +}) => { return (
= ({
- {name} + + {name} + {docsUrl && (
{description && ( -

+

{description}

)} diff --git a/src/components/sessions/SessionItem.tsx b/src/components/sessions/SessionItem.tsx index 14bf601de..15de67e65 100644 --- a/src/components/sessions/SessionItem.tsx +++ b/src/components/sessions/SessionItem.tsx @@ -40,7 +40,7 @@ export function SessionItem({ "w-full text-left rounded-lg px-3 py-2.5 transition-all group", isSelected ? "bg-primary/10 border border-primary/30" - : "hover:bg-muted/60 border border-transparent" + : "hover:bg-muted/60 border border-transparent", )} >
@@ -62,7 +62,7 @@ export function SessionItem({
diff --git a/src/components/sessions/SessionManagerPage.tsx b/src/components/sessions/SessionManagerPage.tsx index b446b2e15..ad0825e55 100644 --- a/src/components/sessions/SessionManagerPage.tsx +++ b/src/components/sessions/SessionManagerPage.tsx @@ -56,7 +56,7 @@ export function SessionManagerPage() { const messagesEndRef = useRef(null); const messageRefs = useRef>(new Map()); const [activeMessageIndex, setActiveMessageIndex] = useState( - null + null, ); const [tocDialogOpen, setTocDialogOpen] = useState(false); const [isSearchOpen, setIsSearchOpen] = useState(false); @@ -83,7 +83,7 @@ export function SessionManagerPage() { } const exists = selectedKey ? filteredSessions.some( - (session) => getSessionKey(session) === selectedKey + (session) => getSessionKey(session) === selectedKey, ) : false; if (!exists) { @@ -95,7 +95,7 @@ export function SessionManagerPage() { if (!selectedKey) return null; return ( filteredSessions.find( - (session) => getSessionKey(session) === selectedKey + (session) => getSessionKey(session) === selectedKey, ) || null ); }, [filteredSessions, selectedKey]); @@ -103,7 +103,7 @@ export function SessionManagerPage() { const { data: messages = [], isLoading: isLoadingMessages } = useSessionMessagesQuery( selectedSession?.providerId, - selectedSession?.sourcePath + selectedSession?.sourcePath, ); // 提取用户消息用于目录 @@ -147,7 +147,7 @@ export function SessionManagerPage() { } catch (error) { toast.error( extractErrorMessage(error) || - t("common.error", { defaultValue: "Copy failed" }) + t("common.error", { defaultValue: "Copy failed" }), ); } }; @@ -158,7 +158,7 @@ export function SessionManagerPage() { if (!isMac()) { await handleCopy( selectedSession.resumeCommand, - t("sessionManager.resumeCommandCopied") + t("sessionManager.resumeCommandCopied"), ); return; } @@ -240,14 +240,16 @@ export function SessionManagerPage() { setIsSearchOpen(true); setTimeout( () => searchInputRef.current?.focus(), - 0 + 0, ); }} > - {t("sessionManager.searchSessions")} + + {t("sessionManager.searchSessions")} +