Commit Graph

5 Commits

  • feat(deeplink): 深链支持用量查询配置 (#400)
    ## 新增功能
    - 深链导入支持用量查询配置参数:
      - `usageEnabled`: 是否启用用量查询
      - `usageScript`: Base64 编码的用量查询脚本
      - `usageApiKey`: 用量查询专用 API Key
      - `usageBaseUrl`: 用量查询专用 Base URL
      - `usageAccessToken`: 访问令牌(NewAPI 模板)
      - `usageUserId`: 用户 ID(NewAPI 模板)
      - `usageAutoInterval`: 自动查询间隔(分钟)
    
    ## 修改文件
    - **mod.rs**: DeepLinkImportRequest 结构体添加用量查询字段
    - **parser.rs**: 解析 URL 中的用量查询参数
    - **provider.rs**: 构建 ProviderMeta 包含 UsageScript 配置
    - **deeplink.ts**: 添加 TypeScript 类型定义
    - **DeepLinkImportDialog.tsx**: 确认对话框显示用量查询配置
    
    ## Bug 修复
    - **formatters.ts**: 修复 formatJSON() 格式化时删除 "env" 键的问题
    
    ## 深链格式示例
    ```
    ccswitch://v1/import?resource=provider&app=claude&name=xxx&usageEnabled=true&usageScript={base64}&usageAutoInterval=30
    ```
    
    🤖 Generated with [Claude Code](https://claude.com/claude-code)
    
    Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
  • feat: add model configuration support and fix Gemini deeplink bug (#251)
    * feat(providers): add notes field for provider management
    
    - Add notes field to Provider model (backend and frontend)
    - Display notes with higher priority than URL in provider card
    - Style notes as non-clickable text to differentiate from URLs
    - Add notes input field in provider form
    - Add i18n support (zh/en) for notes field
    
    * chore: format code and clean up unused props
    
    - Run cargo fmt on Rust backend code
    - Format TypeScript imports and code style
    - Remove unused appId prop from ProviderPresetSelector
    - Clean up unused variables in tests
    - Integrate notes field handling in provider dialogs
    
    * feat(deeplink): implement ccswitch:// protocol for provider import
    
    Add deep link support to enable one-click provider configuration import via ccswitch:// URLs.
    
    Backend:
    - Implement URL parsing and validation (src-tauri/src/deeplink.rs)
    - Add Tauri commands for parse and import (src-tauri/src/commands/deeplink.rs)
    - Register ccswitch:// protocol in macOS Info.plist
    - Add comprehensive unit tests (src-tauri/tests/deeplink_import.rs)
    
    Frontend:
    - Create confirmation dialog with security review UI (src/components/DeepLinkImportDialog.tsx)
    - Add API wrapper (src/lib/api/deeplink.ts)
    - Integrate event listeners in App.tsx
    
    Configuration:
    - Update Tauri config for deep link handling
    - Add i18n support for Chinese and English
    - Include test page for deep link validation (deeplink-test.html)
    
    Files: 15 changed, 1312 insertions(+)
    
    * chore(deeplink): integrate deep link handling into app lifecycle
    
    Wire up deep link infrastructure with app initialization and event handling.
    
    Backend Integration:
    - Register deep link module and commands in mod.rs
    - Add URL handling in app setup (src-tauri/src/lib.rs:handle_deeplink_url)
    - Handle deep links from single instance callback (Windows/Linux CLI)
    - Handle deep links from macOS system events
    - Add tauri-plugin-deep-link dependency (Cargo.toml)
    
    Frontend Integration:
    - Listen for deeplink-import/deeplink-error events in App.tsx
    - Update DeepLinkImportDialog component imports
    
    Configuration:
    - Enable deep link plugin in tauri.conf.json
    - Update Cargo.lock for new dependencies
    
    Localization:
    - Add Chinese translations for deep link UI (zh.json)
    - Add English translations for deep link UI (en.json)
    
    Files: 9 changed, 359 insertions(+), 18 deletions(-)
    
    * refactor(deeplink): enhance Codex provider template generation
    
    Align deep link import with UI preset generation logic by:
    - Adding complete config.toml template matching frontend defaults
    - Generating safe provider name from sanitized input
    - Including model_provider, reasoning_effort, and wire_api settings
    - Removing minimal template that only contained base_url
    - Cleaning up deprecated test file deeplink-test.html
    
    * style: fix clippy uninlined_format_args warnings
    
    Apply clippy --fix to use inline format arguments in:
    - src/mcp.rs (8 fixes)
    - src/services/env_manager.rs (10 fixes)
    
    * style: apply code formatting and cleanup
    
    - Format TypeScript files with Prettier (App.tsx, EnvWarningBanner.tsx, formatters.ts)
    - Organize Rust imports and module order alphabetically
    - Add newline at end of JSON files (en.json, zh.json)
    - Update Cargo.lock for dependency changes
    
    * feat: add model name configuration support for Codex and fix Gemini model handling
    
    - Add visual model name input field for Codex providers
      - Add model name extraction and update utilities in providerConfigUtils
      - Implement model name state management in useCodexConfigState hook
      - Add conditional model field rendering in CodexFormFields (non-official only)
      - Integrate model name sync with TOML config in ProviderForm
    
    - Fix Gemini deeplink model injection bug
      - Correct environment variable name from GOOGLE_GEMINI_MODEL to GEMINI_MODEL
      - Add test cases for Gemini model injection (with/without model)
      - All tests passing (9/9)
    
    - Fix Gemini model field binding in edit mode
      - Add geminiModel state to useGeminiConfigState hook
      - Extract model value during initialization and reset
      - Sync model field with geminiEnv state to prevent data loss on submit
      - Fix missing model value display when editing Gemini providers
    
    Changes:
      - 6 files changed, 245 insertions(+), 13 deletions(-)
  • fix(mcp): improve format/submit UX and fix validation errors
    Fixes two critical issues with the MCP JSON input:
    1. Format button failed with wrapped format like "server": {...}
    2. Submit button failed despite input validation passing
    
    Changes:
    - Updated formatJSON to use smart parser (supports wrapped format)
    - Simplified submit validation logic (removed redundant validateJsonConfig call)
    - Improved UX: input preserves original format, cleanup happens on format/submit
      * Prevents confusing "instant disappearance" when pasting wrapped JSON
      * Auto-fills ID/Name fields while keeping input unchanged
      * Format button now strips wrapper key and formats cleanly
      * Submit button correctly extracts config regardless of format
    
    Code quality:
    - Reduced code by 5 lines (20 changes, 11 insertions, 16 deletions)
    - Consistent use of parseSmartMcpJson across all JSON operations
    - No type errors introduced
  • feat(mcp): add smart JSON parser for flexible input formats
    Support multiple MCP configuration input formats:
    - Pure config object: { "command": "npx", ... }
    - Key-value pair fragment: "server-name": { "command": "npx", ... }
    - Wrapped object: { "server-name": { "command": "npx", ... } }
    
    The parser automatically:
    - Detects and wraps JSON fragments into complete objects
    - Extracts server name from single-key objects
    - Auto-fills ID and Name fields when applicable
    - Formats the config for display
    
    This improves UX by allowing users to paste configs directly from
    .claude.json or .codex/config.toml without manual editing.
  • feat(editor): add JSON format button to editors
    Add one-click format functionality for JSON editors with toast notifications:
    
    - Add format button to JsonEditor (CodeMirror)
    - Add format button to CodexAuthSection (auth.json)
    - Add format button to CommonConfigEditor (settings + modal)
    - Add formatJSON utility function
    - Add i18n keys: format, formatSuccess, formatError
    
    Note: TOML formatting was intentionally NOT added to avoid losing comments
    during parse/stringify operations. TOML validation remains available via
    the existing useCodexTomlValidation hook.