57 Commits

  • chore(release): prepare v3.16.3
    - Bump version to 3.16.3 (package.json, tauri.conf.json, Cargo.toml, Cargo.lock)
    - Add CHANGELOG entry for v3.16.3 (59 commits since v3.16.2)
    - Add trilingual release notes (zh / en / ja) under docs/release-notes/
  • refactor(presets): align CCSub to end of partner block across apps
    Move the CCSub preset to sit right after DouBaoSeed, at the end of the
    partner block and before the first non-partner provider, so its position
    is consistent across all six apps:
    
    - Codex / OpenCode: moved up from the 2nd slot (between Shengsuanyun and
      the next partner) to the block tail
    - OpenClaw / Hermes: moved up from the aggregator section to the block tail
    - Claude / Claude Desktop: already at the block tail
    
    Also add the missing CHANGELOG entry for the CCSub preset, and drop the
    provider preset order test that enforced a now-unneeded ordering invariant.
  • chore(release): prepare v3.16.2
    Add the v3.16.2 CHANGELOG entry covering the 41 commits since v3.16.1,
    bump the version across package.json, tauri.conf.json, Cargo.toml, and
    Cargo.lock, and add trilingual (zh/en/ja) release notes.
  • Harden Codex takeover ownership signaling and serialize switch/takeover
    Gate provider sync and switching on the restore backup / live placeholder
    ("is this live file owned by takeover?") instead of the lagging
    proxy_config.enabled and proxy-running flags. The backup is created
    before enabled=true is committed, so during that activation window the
    old guards were blind and a concurrent sync/switch could rewrite the
    taken-over live file, clearing Codex auth.json for a mis-categorized
    provider.
    
    Acquire a per-app switch lock around both set_takeover_for_app and
    provider switching so the two cannot interleave, splitting the locking
    entry points into outer (lock) / inner (no-lock) pairs to stay
    deadlock-free. Preserve the official OAuth auth in provider-rebuilt
    restore backups by routing the provider token into config.toml. Refine
    takeover idempotency to require the live config to point at the current
    proxy URL, rebuilding from backup when it does not.
    
    Add unit and integration tests covering the official -> DeepSeek ->
    takeover on/off lifecycle and the stopped-proxy switch path.
  • docs: document Codex Chat reasoning auto-detection
    Add a "Reasoning Auto-Detection" subsection to the Codex local-routing
    manual (zh/en/ja) with the provider capability matrix, and record the
    feature plus the streaming-usage and tool-call reasoning backfill fixes
    in the changelog. Drop the removed Kimi For Coding preset from the
    changelog's Codex Chat preset list.
  • docs: document Codex Chat provider support in changelog and manual
    Backfill the empty [Unreleased] CHANGELOG section with the Codex Chat
    Completions feature (Chat-to-Responses bridge, 23 third-party presets,
    model mapping table, Stream Check routing, error-envelope conversion,
    "custom" history bucket) plus the community fixes landed since v3.15.0.
    
    Update the zh/en/ja user manual: split the Codex preset tables by
    upstream protocol (native Responses vs Chat Completions), add a "Codex
    Local Routing and Model Mapping" section covering the Needs Local
    Routing toggle and the model catalog, and note Chat-format probing in
    the Stream Check guide. Manual wording matches the live UI strings.
  • fix(dashscope): enhance usage parsing robustness to prevent VSCode cr… (#2425)
    * fix(dashscope): enhance usage parsing robustness to prevent VSCode crashes
    
    Enhanced build_anthropic_usage_from_responses() to handle null, missing, empty,
    and partial usage fields gracefully. This prevents VSCode Extension crashes with
    "Cannot read properties of null (reading 'output_tokens')" when connecting to
    DashScope (Alibaba Cloud Bailian) models.
    
    Changes:
    - Added defensive null checks and empty object detection
    - Implemented OpenAI field name fallbacks (prompt_tokens/completion_tokens)
    - Added comprehensive logging for malformed usage scenarios
    - Fixed streaming SSE event handlers with null-safe usage access
    - Preserved cache token fields even when input/output tokens are missing
    
    This ensures the proxy never crashes on malformed Responses API usage objects,
    returning valid Anthropic-compatible usage structures (input_tokens/output_tokens)
    in all cases.
    
    * fix(proxy): tighten Responses API usage fix per review
    
    - Drop redundant fallback in streaming.rs Chat Completions path; the
      existing if-let-Some guard already prevents usage:null, so the extra
      layer was dead code and caused a fmt-breaking indentation issue.
    - Demote partial-usage warn to debug. Streaming chunks legitimately
      arrive with partial token counts and the warn-level log was noisy.
    - Rewrite CHANGELOG entry: reference #2422, broaden scope from
      DashScope-only to all api_format=openai_responses users (Codex OAuth
      is the strongest signal; DashScope compatible-mode/v1/responses is
      the original report).
    - cargo fmt to clear 12 formatting differences vs main.
    
    ---------
    
    Co-authored-by: Jason <farion1231@gmail.com>
  • chore(release): bump version to 3.14.1
    - Add v3.14.1 release notes (en/zh/ja) covering tray usage visibility,
      Codex OAuth stability fixes, Skills import/install reliability, and
      removal of the Hermes config health scanner
    - Cut [Unreleased] into [3.14.1] in CHANGELOG with PR references
    - Bump version in package.json, Cargo.toml, Cargo.lock, tauri.conf.json
  • docs(changelog): extend v3.14.0 entries with late additions
    Fold six late commits into the v3.14.0 section (Added / Changed / Fixed)
    and refresh the stats header against the actual v3.13.0..HEAD diff:
    100 commits | 219 files | +20,548 / -3,569.
    
    Late additions covered: Hermes dashboard toolbar launch, LemonData
    preset across all six apps, DDSHub Codex endpoint, Hermes toolbar
    icon + MCP reorder, Hermes health-check schema fix, Usage modal
    support for Hermes/OpenClaw.
  • docs(changelog): add v3.14.0 release notes
    Summarize the 94 commits since v3.13.0 (216 files, +19,923 / -3,554)
    into Keep-a-Changelog entries: Hermes Agent as the 6th managed app,
    Claude Opus 4.7 rollout, Gemini Native API proxy, Copilot GHES,
    session list virtualization, usage date range picker, and the
    "Local Proxy Takeover" -> "Local Routing" rename.
    
    Breaking changes collected in a dedicated section: explicit Hermes
    api_mode, ANTHROPIC_REASONING_MODEL removal, per-provider proxy
    removal, schema bumps (v8->v9 pricing reseed, v9->v10 Hermes columns),
    and XCodeAPI preset removal.
  • chore(release): bump version to v3.13.0 and sync changelog/release notes
    Backfill post-draft changes into CHANGELOG and three-language release
    notes (en/zh/ja): 16 new Added entries, 6 Fixed entries, 1 Docs entry,
    and updated header stats (139 commits, 280 files, +31627/-3042).
  • docs(changelog): cover UTF-8 boundary and system prompt fixes
    Document two additional Fixed entries for the Unreleased section after
    rebasing onto the latest origin/main: the SSE streaming UTF-8 chunk
    boundary fix that prevents U+FFFD replacement characters in multi-byte
    output via the Copilot reverse proxy, and the OpenAI-compatible chat
    transform fix that normalizes fragmented Claude system prompts into a
    single leading system message for strict backends like Nvidia and
    Qwen-style providers.
  • docs(changelog): add Unreleased section for upcoming release
    Catalog all user-visible changes since v3.12.3: lightweight mode,
    provider model auto-fetch, quota and balance visibility, skills
    discovery and batch updates, session workflow upgrades, Codex OAuth
    reverse proxy, OpenCode/OpenClaw stream check coverage, tray submenus,
    Hyper-based proxy stack, provider key lifecycle, OAuth Auth Center UI
    polish, and the accompanying Copilot auth, WebDAV, usage pricing,
    Linux UI, and Skills i18n fixes.
  • fix(linux): repair unresponsive UI on startup and full-screen panels
    Linux users reported the window UI (including native title bar buttons)
    couldn't receive clicks until manually maximizing and restoring the
    window. Root causes: (1) Tauri webview did not acquire focus on startup
    so first clicks were consumed by X11/Wayland click-to-activate
    (Tauri #10746, wry #637); (2) GTK surface input region failed to
    renegotiate on the visible:false + show() path under some
    WebKitGTK/compositor combinations.
    
    - Add linux_fix::nudge_main_window helper that performs set_focus plus
      a ±1px no-op resize after window show, with a 500ms reconciliation
      readback to compensate for dropped resize requests on slow
      compositors.
    - Wire the helper into every window re-show path: normal startup,
      deeplink, single_instance, tray show_main, and lightweight exit.
    - Set WEBKIT_DISABLE_COMPOSITING_MODE=1 at startup to avoid resize
      crashes and Wayland surface negotiation issues.
    - Remove data-tauri-drag-region on Linux from App.tsx header and the
      shared FullScreenPanel (used by all provider/MCP/workspace forms)
      to avoid Tauri #13440 in Wayland sessions. Extract drag-region
      constants to src/lib/platform.ts for reuse.
    
    All Rust changes are gated by #[cfg(target_os = "linux")]; frontend
    changes preserve macOS/Windows behavior via runtime isLinux() checks.
    Known limitation: tiling Wayland compositors ignore set_size, so
    GDK_BACKEND=x11 remains the user-side workaround.
  • chore(release): consolidate v3.12.3 release notes, changelog and test fixes
    Merge previously unreleased v3.12.4 content into v3.12.3:
    - CHANGELOG: combine [Unreleased] into [3.12.3], clear [Unreleased]
    - Release notes (zh/en/ja): add Copilot proxy, macOS signing,
      Reasoning Effort, OpenCode SQLite, Codex 1M toggle, Disable
      Auto-Upgrade toggle, and contributor thanks
    - Fix test mocks for skill backup/restore hooks
    - Fix schema migration test missing providers table
    - Fix TempHome to save/restore CC_SWITCH_TEST_HOME env var
  • feat(ci): add macOS code signing and Apple notarization to release workflow
    - Import Developer ID Application certificate into temporary keychain
    - Inject APPLE_SIGNING_IDENTITY/APPLE_ID/APPLE_PASSWORD/APPLE_TEAM_ID
      into Tauri build step for automatic signing and notarization
    - Staple notarization tickets to both .app and .dmg (hard-fail)
    - Add verification step: codesign --verify + spctl -a + stapler validate
      for both .app and .dmg, gating the release on success
    - Collect .dmg alongside .tar.gz and .zip in release assets
    - Clean up temporary keychain with original default restored
    - Update release notes to recommend .dmg and note Apple notarization
    - Remove all xattr workarounds and "unidentified developer" warnings
      from README, README_ZH, installation guides, and FAQ (EN/ZH/JA)
  • chore(release): update release notes, changelog and macOS minimum version for v3.12.3
    Update CHANGELOG.md with full v3.12.3 entry, create release notes in
    three languages (en/zh/ja), bump macOS minimumSystemVersion from 10.15
    to 12.0 (Monterey) to match actual runtime requirements, and update
    README version badges and links.
  • feat(skills): auto-backup skill files before uninstall
    Create a local backup under ~/.cc-switch/skill-backups/ before removing
    skill directories. The backup includes all skill files and a meta.json
    with original skill metadata. Old backups are pruned to keep at most 20.
    The backup path is returned to the frontend and shown in the success
    toast. Bump version to 3.12.3.
  • docs: reorganize docs directory structure
    - Delete 9 completed planning/roadmap documents
    - Move 23 release notes into docs/release-notes/ with simplified filenames
    - Update all cross-references in READMEs, CHANGELOG, and release notes
    - Remove dangling doc reference in deeplink/mod.rs
  • docs: highlight Common Config Snippet removal as breaking change in release notes
    Expand the partial key-field merging section with Before/After explanation
    and migration guide. Mark it as a breaking change in Highlights and Notes
    sections across all three languages (zh/en/ja) and CHANGELOG.md.
  • chore: bump version to v3.11.0 and add release notes
    - Update version numbers in package.json, Cargo.toml, tauri.conf.json
    - Add CHANGELOG.md entry for v3.11.0
    - Add trilingual release notes (zh/en/ja)
    - Update user manual version info
  • 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
  • chore: bump version to 3.10.3
    - Update version in package.json, Cargo.toml, and tauri.conf.json
    - Add missing changelog entries for OpenCode API key link and AICodeMirror preset
    - Fix Prettier formatting for new hook files
  • docs(changelog): release v3.10.3
    Add changelog entry for v3.10.3 feature release including:
    - API format selector and presets
    - Pricing config enhancement
    - Skills ZIP install
    - Preferred terminal selection
    - Silent startup option
    - OpenCode environment check and directory sync
    - NVIDIA NIM and n1n.ai presets
    - Multiple bug fixes for Codex, proxy URL, tray menu, etc.
  • chore: release v3.10.1
    - Bump version to 3.10.1 across all config files
    - Update CHANGELOG with all fixes since v3.10.0
    - Fix Rust Clippy warning by using derive(Default)
    - Apply code formatting
  • chore: bump version to v3.9.1
    - Update version in package.json, tauri.conf.json, Cargo.toml
    - Update version badges and current version in README files
    - Add v3.9.1 changelog entry with bug fixes and improvements
  • chore(release): prepare v3.9.0 stable release
    - Bump version from 3.9.0-3 to 3.9.0 across all config files
    - Add comprehensive release notes in English, Chinese, and Japanese
    - Update CHANGELOG with v3.9.0 stable and v3.9.0-2 entries
    - Update README badges and release note links to v3.9.0
  • chore: rename version to 3.9.0-1 for MSI compatibility
    MSI installer requires numeric-only pre-release identifiers.
    Changed from 3.9.0-beta.1 to 3.9.0-1.
  • chore: bump version to 3.9.0-beta.1
    - Update version in package.json, Cargo.toml, tauri.conf.json
    - Add CHANGELOG entry for v3.9.0-beta.1 with:
      - Local Proxy Server feature
      - Auto Failover with circuit breaker
      - Skills multi-app support
      - Provider icon colors
      - 25+ bug fixes
    - Add proxy feature guide documentation (Chinese)
  • docs: add v3.8.0 release documentation and Japanese README
    - Add CHANGELOG entry for v3.8.0
    - Update README.md and README_ZH.md with v3.8.0 features
    - Add Japanese README (README_JA.md)
    - Add release notes in English, Chinese, and Japanese
  • chore: bump version to v3.7.1
    Prepare for v3.7.1 maintenance release.
    
    **Version Updates**:
    - package.json: 3.7.0 → 3.7.1
    - src-tauri/Cargo.toml: 3.7.0 → 3.7.1
    - src-tauri/tauri.conf.json: 3.7.0 → 3.7.1
    - README.md: version badge updated
    - README_ZH.md: version badge updated
    
    **CHANGELOG.md**:
    - Added v3.7.1 release notes (2025-11-22)
    - 3 bug fixes (Skills installation, Gemini persistence, dialog overlay)
    - 2 new features (Gemini config directory, ArchLinux support)
    - 3 improvements (error i18n, download timeout, code formatting)
    - 1 reverted feature (auto-launch)
    
    **Code Formatting**:
    - Applied prettier to SkillsPage.tsx and skillErrorParser.ts
    
    **Pre-Release Checks**:
     TypeScript type check passed
     Prettier format check passed
     All version numbers synchronized
  • docs: add v3.7.0 release documentation
    - Update CHANGELOG.md with v3.7.0 entry covering six major features
    - Add English release notes (docs/release-note-v3.7.0-en.md)
    - Add Chinese release notes (docs/release-note-v3.7.0-zh.md)
    
    Major features documented:
    - Gemini CLI integration (third app support)
    - MCP v3.7.0 unified architecture
    - Claude Skills management system (~2,000 lines)
    - Prompts management system (~1,300 lines)
    - Deep link protocol (ccswitch://)
    - Environment variable conflict detection
  • Release v3.6.0: Major architecture refactoring and feature enhancements
    New Features:
    - Provider duplication and manual sorting via drag-and-drop
    - Custom endpoint management for aggregator providers
    - Usage query with auto-refresh interval and test script API
    - Config editor improvements (JSON format button, real-time TOML validation)
    - Auto-sync on directory change for WSL environment support
    - Load live config when editing active provider to protect manual modifications
    - New provider presets: DMXAPI, Azure Codex, AnyRouter, AiHubMix, MiniMax
    - Partner promotion mechanism (Zhipu GLM Z.ai)
    
    Architecture Improvements:
    - Backend: 5-phase refactoring (error handling → command split → services → concurrency)
    - Frontend: 4-stage refactoring (tests → hooks → components → cleanup)
    - Testing: 100% hooks unit test coverage, integration tests for critical flows
    
    Documentation:
    - Complete README rewrite with detailed architecture overview
    - Separate Chinese (README_ZH.md) and English (README.md) versions
    - Comprehensive v3.6.0 changelog with categorized changes
    - New bilingual screenshots and partner banners
    
    Bug Fixes:
    - Fixed configuration sync issues (apiKeyUrl priority, MCP sync, import sync)
    - Fixed usage query interval timing and refresh button animation
    - Fixed UI issues (edit mode alignment, language switch state)
    - Fixed endpoint speed test and provider duplicate insertion position
    - Force exit on config error to prevent silent fallback
    
    Technical Details:
    - Updated to Tauri 2.8.x, TailwindCSS 4.x, TanStack Query v5.90.x
    - Removed legacy v1 migration logic for better startup performance
    - Standardized command parameters (unified to camelCase `app`)
    - Result pattern for graceful error handling
  • docs(changelog): document breaking changes in [Unreleased]
    Add comprehensive documentation for three breaking changes:
    1. Runtime auto-migration from v1 to v2 config format removed
    2. Legacy v1 copy file migration logic removed
    3. Tauri commands now only accept 'app' parameter
    
    Also document improvements and new tests added in recent commits.
  • refactor(types): rename AppType to AppId for semantic clarity
    Rename `AppType` to `AppId` across the entire frontend codebase to better
    reflect its purpose as an application identifier rather than a type category.
    This aligns frontend naming with backend command parameter conventions.
    
    Changes:
    - Rename type `AppType` to `AppId` in src/lib/api/types.ts
    - Remove `AppType` export from src/lib/api/index.ts
    - Update all component props from `appType` to `appId` (43 files)
    - Update all variable names from `appType` to `appId`
    - Synchronize documentation (CHANGELOG, refactoring plans)
    - Update test files and MSW mocks
    
    BREAKING CHANGE: `AppType` type is no longer exported. Use `AppId` instead.
    All component props have been renamed from `appType` to `appId`.
  • refactor(api): unify AppType parsing with FromStr trait
    BREAKING CHANGE: Remove support for legacy app_type/appType parameters.
    All Tauri commands now accept only the 'app' parameter (values: "claude" or "codex").
    Invalid app values will return localized error messages with allowed values.
    
    This commit addresses code duplication and improves error handling:
    
    - Consolidate AppType parsing into FromStr trait implementation
      * Eliminates duplicate parse_app() functions across 3 command modules
      * Provides single source of truth for app type validation
      * Enables idiomatic Rust .parse::<AppType>() syntax
    
    - Enhance error messages with localization
      * Return bilingual error messages (Chinese + English)
      * Include list of allowed values in error responses
      * Use structured AppError::localized for better categorization
    
    - Add input normalization
      * Case-insensitive matching ("CLAUDE" → AppType::Claude)
      * Automatic whitespace trimming (" codex \n" → AppType::Codex)
      * Improves API robustness against user input variations
    
    - Introduce comprehensive unit tests
      * Test valid inputs with case variations
      * Test whitespace handling
      * Verify error message content and localization
      * 100% coverage of from_str logic
    
    - Update documentation
      * Add CHANGELOG entry marking breaking change
      * Update README with accurate architecture description
      * Revise REFACTORING_MASTER_PLAN with migration examples
      * Remove all legacy app_type/appType references
    
    Code Quality Metrics:
    - Lines removed: 27 (duplicate code)
    - Lines added: 52 (including tests and docs)
    - Code duplication: 3 → 0 instances
    - Test coverage: 0% → 100% for AppType parsing
  • chore: standardize release artifact naming with version tags
    - Update GitHub Actions to generate version-tagged filenames
    - macOS: CC-Switch-v{version}-macOS.tar.gz / .zip
    - Windows: CC-Switch-v{version}-Windows.msi / -Portable.zip
    - Linux: CC-Switch-v{version}-Linux.AppImage / .deb
    - Update README installation instructions with new filename format
    - Add naming standardization note to CHANGELOG v3.5.0
  • chore: bump version to v3.5.0 and update roadmap
    Version Changes:
    - Update version to 3.5.0 in package.json, Cargo.toml, and tauri.conf.json
    
    Changelog Updates:
    - Add v3.5.0 release notes with comprehensive feature list
    - Document MCP management system implementation
    - Document configuration import/export functionality
    - Document endpoint speed testing feature
    - List all improvements, bug fixes, and technical enhancements
    
    Roadmap Updates:
    - Mark MCP manager as completed 
    - Mark i18n (internationalization) as completed 
    - Add new planned features: memory management, cloud sync
    - Reorganize feature priorities