Commit Graph

6 Commits

  • feat(gemini): add Gemini provider integration (#202)
    * feat(gemini): add Gemini provider integration
    
    - Add gemini_config.rs module for .env file parsing
    - Extend AppType enum to support Gemini
    - Implement GeminiConfigEditor and GeminiFormFields components
    - Add GeminiIcon with standardized 1024x1024 viewBox
    - Add Gemini provider presets configuration
    - Update i18n translations for Gemini support
    - Extend ProviderService and McpService for Gemini
    
    * fix(gemini): resolve TypeScript errors, add i18n support, and fix MCP logic
    
    **Critical Fixes:**
    - Fix TS2741 errors in tests/msw/state.ts by adding missing Gemini type definitions
    - Fix ProviderCard.extractApiUrl to support GOOGLE_GEMINI_BASE_URL display
    - Add missing apps.gemini i18n keys (zh/en) for proper app name display
    - Fix MCP service Gemini cross-app duplication logic to prevent self-copy
    
    **Technical Details:**
    - tests/msw/state.ts: Add gemini default providers, current ID, and MCP config
    - ProviderCard.tsx: Check both ANTHROPIC_BASE_URL and GOOGLE_GEMINI_BASE_URL
    - services/mcp.rs: Skip Gemini in sync_other_side logic with unreachable!() guards
    - Run pnpm format to auto-fix code style issues
    
    **Verification:**
    -  pnpm typecheck passes
    -  pnpm format completed
    
    * feat(gemini): enhance authentication and config parsing
    
    - Add strict and lenient .env parsing modes
    - Implement PackyCode partner authentication detection
    - Support Google OAuth official authentication
    - Auto-configure security.auth.selectedType for PackyCode
    - Add comprehensive test coverage for all auth types
    - Update i18n for OAuth hints and Gemini config
    
    ---------
    
    Co-authored-by: Jason <farion1231@gmail.com>
  • refactor(backend): phase 4 - add test hooks and extend service layer
    - Extract internal functions in commands/mcp.rs and commands/provider.rs
      to enable unit testing without Tauri context
    - Add test hooks: set_mcp_enabled_test_hook, import_mcp_from_claude_test_hook,
      import_mcp_from_codex_test_hook, import_default_config_test_hook
    - Migrate error types from String to AppError for precise error matching in tests
    - Extend ProviderService with delete() method to unify Codex/Claude cleanup logic
    - Add comprehensive test coverage:
      - tests/mcp_commands.rs: command-level tests for MCP operations
      - tests/provider_service.rs: service-level tests for switch/delete operations
    - Run cargo fmt to fix formatting issues (EOF newlines)
    - Update BACKEND_REFACTOR_PLAN.md to mark phase 3 complete
  • refactor(backend): complete phase 1 - unified error handling (100%)
    Completed the remaining migrations for Phase 1 of backend refactoring plan,
    achieving 100% coverage of unified error handling with AppError.
    
    ## Changes
    
    ### Fully Migrated Modules (Result<T, String> → Result<T, AppError>)
    
    - **claude_plugin.rs** (35 lines changed)
      - Migrated 7 public functions: claude_config_path, ensure_claude_dir_exists,
        read_claude_config, write_claude_config, clear_claude_config,
        claude_config_status, is_claude_config_applied
      - Used AppError::io(), AppError::JsonSerialize, AppError::Config
      - Simplified error handling with helper functions
    
    - **settings.rs** (14 lines changed)
      - Migrated AppSettings::save() and update_settings()
      - Used AppError::io() for file operations
      - Used AppError::JsonSerialize for JSON serialization
    
    - **import_export.rs** (67 lines changed)
      - Migrated 8 functions: create_backup, cleanup_old_backups,
        sync_current_providers_to_live, sync_current_provider_for_app,
        sync_codex_live, sync_claude_live, export_config_to_file,
        import_config_from_file, sync_current_providers_live
      - Used AppError::io(), AppError::json(), AppError::Config
      - Added proper error context with file paths and provider IDs
      - Used AppError::Message for temporary bridge with String-based APIs
    
    ### Adapted Interface Calls
    
    - **commands.rs** (30 lines changed)
      - Updated 15 Tauri command handlers to use .map_err(|e| e.to_string())
      - Changed from implicit Into::into to explicit e.to_string()
      - Maintained Result<T, String> interface for Tauri (frontend compatibility)
      - Affected commands: Claude MCP (5), Claude plugin (5), settings (1)
    
    - **mcp.rs** (2 lines changed)
      - Updated claude_mcp::set_mcp_servers_map call
      - Changed from .map_err(Into::into) to .map_err(|e| e.to_string())
    
    ## Statistics
    
    - Files changed: 5
    - Lines changed: +82/-66 (net +16)
    - Compilation:  Success (8.42s, 0 warnings)
    - Tests:  4/4 passed
    
    ## Benefits
    
    - **Type Safety**: All infrastructure modules now use strongly-typed AppError
    - **Error Context**: File paths and operation types preserved in error chain
    - **Code Quality**: Removed ~30 instances of .map_err(|e| format!("...", e))
    - **Maintainability**: Consistent error handling pattern across codebase
    - **Debugging**: Error source chain preserved with #[source] attribute
    
    ## Phase 1 Status:  100% Complete
    
    All modules migrated:
    -  config.rs (Phase 1.1)
    -  claude_mcp.rs (Phase 1.1)
    -  codex_config.rs (Phase 1.1)
    -  app_config.rs (Phase 1.1)
    -  store.rs (Phase 1.1)
    -  claude_plugin.rs (Phase 1.2)
    -  settings.rs (Phase 1.2)
    -  import_export.rs (Phase 1.2)
    -  commands.rs (interface adaptation complete)
    -  mcp.rs (interface adaptation complete)
    
    Ready for Phase 2: Splitting commands.rs by domain.
    
    Co-authored-by: Claude <noreply@anthropic.com>
  • feat(mcp): add automatic key normalization for server entries
    - Add normalize_server_keys() to ensure MCP server map keys match internal id fields
    - Auto-normalize on all read/write operations (get, upsert, delete, import, sync)
    - Handle edge cases: empty/whitespace ids, key renaming, conflict resolution
    - Auto-save config when normalization detects changes
    - Apply cargo fmt for code formatting consistency
    
    This enhancement improves data integrity by automatically fixing inconsistencies
    between server entry keys and their id fields, especially after manual config edits.
  • feat(settings): add 'Apply to Claude Code extension' toggle
    - Apply immediately on save (write or remove primaryApiKey)
    - Honor setting on provider switch (enabled: write for non-official, remove for official; disabled: no auto writes)
    - Remove per-provider Claude plugin buttons from ProviderList
    - Upsert primaryApiKey=any preserving other fields; respect override dir
    - Add zh/en i18n for the new setting