Commit Graph

13 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(endpoints): implement deferred submission and fix clear-all bug
    Implement Solution A (complete deferred submission) for custom endpoint
    management, replacing the dual-mode system with unified local staging.
    
    Changes:
    - Remove immediate backend saves from EndpointSpeedTest
      * handleAddEndpoint: local state update only
      * handleRemoveEndpoint: local state update only
      * handleSelect: remove lastUsed timestamp update
    - Add explicit clear detection in ProviderForm
      * Distinguish "user cleared endpoints" from "user didn't modify"
      * Pass empty object {} as clear signal vs null for no-change
    - Fix mergeProviderMeta to handle three distinct cases:
      * null/undefined: don't modify endpoints (no meta sent)
      * empty object {}: explicitly clear endpoints (send empty meta)
      * with data: add/update endpoints (overwrite)
    
    Fixed Critical Bug:
    When users deleted all custom endpoints, changes were not saved because:
    - draftCustomEndpoints=[] resulted in customEndpointsToSave=null
    - mergeProviderMeta(meta, null) returned undefined
    - Backend interpreted missing meta as "don't modify", preserving old values
    
    Solution:
    Detect when user had endpoints and cleared them (hadEndpoints && length===0),
    then pass empty object to mergeProviderMeta as explicit clear signal.
    
    Architecture Improvements:
    - Transaction atomicity: all fields submitted together on form save
    - UX consistency: add/edit modes behave identically
    - Cancel button: true rollback with no immediate saves
    - Code simplification: removed ~40 lines of immediate save error handling
    
    Testing:
    - TypeScript type check: passed
    - Rust backend tests: 10/10 passed
    - Build: successful
  • 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: improve endpoint management type safety and error handling
    - Unify EndpointCandidate type definition in types.ts
    - Remove all 'as any' type assertions in useSpeedTestEndpoints
    - Add cleanup function to prevent race conditions in async operations
    - Fix stale error messages persisting after successful deletion
    - Improve error handling for endpoint deletion (distinguish not-found vs network errors)
    - Extract timeout magic numbers to ENDPOINT_TIMEOUT_SECS constant
    - Clarify URL validation to explicitly allow only http/https
    - Fix ambiguous payload.meta assignment logic in ProviderForm
    - Add i18n for new error messages (removeFailed, updateLastUsedFailed)
  • refactor: implement unified border design system
    - Define custom border utilities in @layer utilities for consistent theming
    - Add border-default (1px gray), border-active (2px primary), border-hover (40% primary), and border-dragging (60% primary) classes
    - Update all UI components (Input, Select, TextArea, Button, Dialog, Dropdown) to use unified border classes
    - Replace hardcoded border colors (gray-200/300/600/700) with theme-responsive border-border-default
    - Update provider cards, MCP components, settings, and forms with new border system
    - Remove dark mode border overrides to simplify CSS and improve maintainability
    - Ensure all borders automatically adapt to light/dark themes via CSS variables
  • refactor: standardize dialog components to use consistent DialogFooter styling
    Remove custom styling from DialogFooter components across the application
    to ensure consistent appearance and behavior. All dialogs now follow the
    unified layout pattern defined in the base Dialog component.
    
    Changes:
    - Remove custom className overrides from DialogFooter in:
      - EndpointSpeedTest.tsx
      - CodexQuickWizardModal.tsx
      - CodexCommonConfigModal.tsx
      - ClaudeConfigEditor.tsx
    - Fix McpWizardModal content area padding (remove -mx-6 negative margin)
    - Fix McpPanel to use DialogFooter component instead of custom div
    
    All dialogs now consistently use:
    - DialogHeader: px-6 pt-6 pb-4 with border and background (built-in)
    - Content area: flex-1 overflow-y-auto px-6 py-4
    - DialogFooter: px-6 pb-6 pt-4 with border and background (built-in)
    
    This ensures proper spacing, alignment, and visual consistency across
    all modal dialogs in the application.
  • fix: unify dialog layout and fix content padding issues
    - Fix negative margin overflow in all dialog content areas
    - Standardize dialog structure with flex-col layout
    - Add consistent py-4 spacing to all content areas
    - Ensure proper spacing between header, content, and footer
    
    Affected components:
    - AddProviderDialog, EditProviderDialog
    - McpFormModal, McpPanel
    - UsageScriptModal
    - SettingsDialog
    
    All dialogs now follow unified layout pattern:
    - DialogContent: flex flex-col max-h-[90vh]
    - Content area: flex-1 overflow-y-auto px-6 py-4
    - No negative margins that cause content overflow
  • refactor: unify modal overlay system with shadcn/ui Dialog
    Fix inconsistent modal overlays by migrating all custom implementations
    to the unified shadcn/ui Dialog component with proper z-index layering.
    
    Changes:
    - Update Dialog component to support three z-index levels:
      - base (z-40): First-level dialogs
      - nested (z-50): Nested dialogs
      - alert (z-[60]): Alert/confirmation dialogs (using Tailwind arbitrary value)
    - Refactor all custom modal implementations to use Dialog:
      - EndpointSpeedTest: API endpoint speed testing panel
      - ClaudeConfigEditor: Claude common config editor
      - CodexQuickWizardModal: Codex quick setup wizard
      - CodexCommonConfigModal: Codex common config editor
      - SettingsDialog: Restart confirmation prompt
    - Remove custom backdrop implementations and manual z-index
    - Leverage Radix UI Portal for automatic DOM order management
    - Ensure consistent overlay behavior and keyboard interactions
    
    This eliminates the "background residue" issue where overlays from
    different layers would conflict, providing a unified and professional
    user experience across all modal interactions.
  • refactor: unify EndpointSpeedTest with shadcn/ui components
    Replace native HTML elements with shadcn/ui components:
    - <button> → <Button> with variants (default, outline, ghost)
    - <input type="url"> → <Input> component
    
    Benefits:
    - Consistent styling across the application
    - Better accessibility and theming support
    - Reduced custom CSS classes
    - Type-safe component props
  • refactor: cleanup and minor improvements
    - Remove unused useDarkMode hook (now using shadcn theme-provider)
    - Clean up MCP components (remove redundant code)
    - Add restart API to settings
    - Minor type improvements
  • refactor: unify directory structure and extract shared components
    - Migrate all form components from ProviderForm/ to providers/forms/
    - Create shared components to eliminate code duplication:
      * ApiKeySection: unified API key input with "Get API Key" link
      * EndpointField: unified endpoint URL input with manage button
    - Refactor ClaudeFormFields (-31% lines) and CodexFormFields (-33% lines)
    - Update all import paths to use new locations
    - Reduce code duplication from ~12% to ~7%
    
    This change improves maintainability and makes the codebase more DRY.