Commit Graph

7 Commits

  • fix(failover): improve cache cleanup for provider health and circuit breaker
    - Use removeQueries instead of invalidateQueries when stopping proxy to
      completely clear health and circuit breaker caches
    - Clear provider health and circuit breaker caches when removing from
      failover queue
    - Refresh failover queue after drag-sort since queue order depends on
      sort_index
    - Only show health badge when provider is in failover queue
  • refactor(failover): merge failover_queue table into providers
    - Add in_failover_queue field to providers table
    - Remove standalone failover_queue table and related indexes
    - Simplify queue ordering by reusing sort_index field
    - Remove reorder_failover_queue and set_failover_item_enabled commands
    - Update frontend to use simplified FailoverQueueItem type
  • refactor(failover): make auto-failover toggle per-app independent
    - Change setting key from 'auto_failover_enabled' to 'auto_failover_enabled_{app_type}'
    - Update provider_router to check per-app failover setting
    - When failover disabled, use current provider only; when enabled, use queue order
    - Add unit tests for failover enabled/disabled behavior
  • feat(failover): add auto-failover master switch with proxy integration
    - Add persistent auto_failover_enabled setting in database
    - Add get/set_auto_failover_enabled commands
    - Provider router respects master switch state
    - Proxy shutdown automatically disables failover
    - Enabling failover auto-starts proxy server
    - Optimistic updates for failover queue toggle
  • refactor(proxy): remove is_proxy_target in favor of failover_queue
    - Remove `is_proxy_target` field from Provider struct (Rust & TypeScript)
    - Remove related DAO methods: get_proxy_target_provider, set_proxy_target
    - Remove deprecated Tauri commands: get_proxy_targets, set_proxy_target
    - Add `is_available()` method to CircuitBreaker for availability checks
      without consuming HalfOpen probe permits (used in select_providers)
    - Keep `allow_request()` for actual request gating with permit tracking
    - Update stream_check to use failover_queue instead of is_proxy_target
    - Clean up commented-out reset circuit breaker button in ProviderActions
    - Remove unused useProxyTargets and useSetProxyTarget hooks
  • feat(proxy): implement independent failover queue management
    Add a new failover queue system that operates independently from provider
    sortIndex, allowing users to configure failover order per app type.
    
    Backend changes:
    - Add failover_queue table to schema.rs for persistent storage
    - Create dao/failover.rs with CRUD operations for queue management
    - Add Tauri commands for queue operations (get, add, remove, reorder, toggle)
    - Refactor provider_router.rs select_providers() to use failover queue:
      - Current provider always takes first priority
      - Queue providers ordered by queue_order as fallback
      - Only providers with open circuit breakers are included
    
    Frontend changes:
    - Add FailoverQueueItem type to proxy.ts
    - Extend failover.ts API with queue management methods
    - Add React Query hooks for queue data fetching and mutations
    - Create FailoverQueueManager component with drag-and-drop reordering
    - Integrate queue management into SettingsPage under "Auto Failover"
    - Add i18n translations for zh and en locales
  • Feat/auto failover (#367)
    * feat(db): add circuit breaker config table and provider proxy target APIs
    
    Add database support for auto-failover feature:
    
    - Add circuit_breaker_config table for storing failover thresholds
    - Add get/update_circuit_breaker_config methods in proxy DAO
    - Add reset_provider_health method for manual recovery
    - Add set_proxy_target and get_proxy_targets methods in providers DAO
      for managing multi-provider failover configuration
    
    * feat(proxy): implement circuit breaker and provider router for auto-failover
    
    Add core failover logic:
    
    - CircuitBreaker: Tracks provider health with three states:
      - Closed: Normal operation, requests pass through
      - Open: Circuit broken after consecutive failures, skip provider
      - HalfOpen: Testing recovery with limited requests
    - ProviderRouter: Routes requests across multiple providers with:
      - Health tracking and automatic failover
      - Configurable failure/success thresholds
      - Auto-disable proxy target after reaching failure threshold
      - Support for manual circuit breaker reset
    - Export new types in proxy module
    
    * feat(proxy): add failover Tauri commands and integrate with forwarder
    
    Expose failover functionality to frontend:
    
    - Add Tauri commands: get_proxy_targets, set_proxy_target,
      get_provider_health, reset_circuit_breaker,
      get/update_circuit_breaker_config, get_circuit_breaker_stats
    - Register all new commands in lib.rs invoke handler
    - Update forwarder with improved error handling and logging
    - Integrate ProviderRouter with proxy server startup
    - Add provider health tracking in request handlers
    
    * feat(frontend): add failover API layer and TanStack Query hooks
    
    Add frontend data layer for failover management:
    
    - Add failover.ts API: Tauri invoke wrappers for all failover commands
    - Add failover.ts query hooks: TanStack Query mutations and queries
      - useProxyTargets, useProviderHealth queries
      - useSetProxyTarget, useResetCircuitBreaker mutations
      - useCircuitBreakerConfig query and mutation
    - Update queries.ts with provider health query key
    - Update mutations.ts to invalidate health on provider changes
    - Add CircuitBreakerConfig and ProviderHealth types
    
    * feat(ui): add auto-failover configuration UI and provider health display
    
    Add comprehensive UI for failover management:
    
    Components:
    - ProviderHealthBadge: Display provider health status with color coding
    - CircuitBreakerConfigPanel: Configure failure/success thresholds,
      timeout duration, and error rate limits
    - AutoFailoverConfigPanel: Manage proxy targets with drag-and-drop
      priority ordering and individual enable/disable controls
    - ProxyPanel: Integrate failover tabs for unified proxy management
    
    Provider enhancements:
    - ProviderCard: Show health badge and proxy target indicator
    - ProviderActions: Add "Set as Proxy Target" action
    - EditProviderDialog: Add is_proxy_target toggle
    - ProviderList: Support proxy target filtering mode
    
    Other:
    - Update App.tsx routing for settings integration
    - Update useProviderActions hook with proxy target mutation
    - Fix ProviderList tests for updated component API
    
    * fix(usage): stabilize date range to prevent infinite re-renders
    
    * feat(backend): add tool version check command
    
    Add get_tool_versions command to check local and latest versions of
    Claude, Codex, and Gemini CLI tools:
    
    - Detect local installed versions via command line execution
    - Fetch latest versions from npm registry (Claude, Gemini)
      and GitHub releases API (Codex)
    - Return comprehensive version info including error details
      for uninstalled tools
    - Register command in Tauri invoke handler
    
    * style(ui): format accordion component code style
    
    Apply consistent code formatting to accordion component:
    - Convert double quotes to semicolons at line endings
    - Adjust indentation to 2-space standard
    - Align with project code style conventions
    
    * refactor(providers): update provider card styling to use theme tokens
    
    Replace hardcoded color classes with semantic design tokens:
    - Use bg-card, border-border, text-card-foreground instead of glass-card
    - Replace gray/white color literals with muted/foreground tokens
    - Change proxy target indicator color from purple to green
    - Improve hover states with border-border-active
    - Ensure consistent dark mode support via CSS variables
    
    * refactor(proxy): simplify auto-failover config panel structure
    
    Restructure AutoFailoverConfigPanel for better integration:
    - Remove internal Card wrapper and expansion toggle (now handled by parent)
    - Extract enabled state to props for external control
    - Simplify loading state display
    - Clean up redundant CardHeader/CardContent wrappers
    - ProxyPanel: reduce complexity by delegating to parent components
    
    * feat(settings): enhance settings page with accordion layout and tool versions
    
    Major settings page improvements:
    
    AboutSection:
    - Add local tool version detection (Claude, Codex, Gemini)
    - Display installed vs latest version comparison with visual indicators
    - Show update availability badges and environment check cards
    
    SettingsPage:
    - Reorganize advanced settings into collapsible accordion sections
    - Add proxy control panel with inline status toggle
    - Integrate auto-failover configuration with accordion UI
    - Add database and cost calculation config sections
    
    DirectorySettings & WindowSettings:
    - Minor styling adjustments for consistency
    
    settings.ts API:
    - Add getToolVersions() wrapper for new backend command
    
    * refactor(usage): restructure usage dashboard components
    
    Comprehensive usage statistics panel refactoring:
    
    UsageDashboard:
    - Reorganize layout with improved section headers
    - Add better loading states and empty state handling
    
    ModelStatsTable & ProviderStatsTable:
    - Minor styling updates for consistency
    
    ModelTestConfigPanel & PricingConfigPanel:
    - Simplify component structure
    - Remove redundant Card wrappers
    - Improve form field organization
    
    RequestLogTable:
    - Enhance table layout with better column sizing
    - Improve pagination controls
    
    UsageSummaryCards:
    - Update card styling with semantic tokens
    - Better responsive grid layout
    
    UsageTrendChart:
    - Refine chart container styling
    - Improve legend and tooltip display
    
    * chore(deps): add accordion and animation dependencies
    
    Package updates:
    - Add @radix-ui/react-accordion for collapsible sections
    - Add cmdk for command palette support
    - Add framer-motion for enhanced animations
    
    Tailwind config:
    - Add accordion-up/accordion-down animations
    - Update darkMode config to support both selector and class
    - Reorganize color and keyframe definitions for clarity
    
    * style(app): update header and app switcher styling
    
    App.tsx:
    - Replace glass-header with explicit bg-background/80 backdrop-blur
    - Update navigation button container to use bg-muted
    
    AppSwitcher:
    - Replace hardcoded gray colors with semantic muted/foreground tokens
    - Ensure consistent dark mode support via CSS variables
    - Add group class for better hover state transitions