Commit Graph

2 Commits

  • refactor(backend): complete phase 1 - full AppError migration (100%)
    Finalized the backend error handling refactoring by migrating all remaining
    modules to use AppError, eliminating all temporary error conversions.
    
    ## Changes
    
    ### Fully Migrated Modules
    
    - **mcp.rs** (129 lines changed)
      - Migrated 13 functions from Result<T, String> to Result<T, AppError>
      - Added AppError::McpValidation for domain-specific validation errors
      - Functions: validate_server_spec, validate_mcp_entry, upsert_in_config_for,
        delete_in_config_for, set_enabled_and_sync_for, sync_enabled_to_claude,
        import_from_claude, import_from_codex, sync_enabled_to_codex
      - Removed all temporary error conversions
    
    - **usage_script.rs** (143 lines changed)
      - Migrated 4 functions: execute_usage_script, send_http_request,
        validate_result, validate_single_usage
      - Used AppError::Message for JS runtime errors
      - Used AppError::InvalidInput for script validation errors
      - Improved error construction with ok_or_else (lazy evaluation)
    
    - **lib.rs** (47 lines changed)
      - Migrated create_tray_menu() and switch_provider_internal()
      - Simplified PoisonError handling with AppError::from
      - Added error logging in update_tray_menu()
      - Improved error handling in menu update logic
    
    - **migration.rs** (10 lines changed)
      - Migrated migrate_copies_into_config()
      - Used AppError::io() helper for file operations
    
    - **speedtest.rs** (8 lines changed)
      - Migrated build_client() and test_endpoints()
      - Used AppError::Message for HTTP client errors
    
    - **app_store.rs** (14 lines changed)
      - Migrated set_app_config_dir_to_store() and migrate_app_config_dir_from_settings()
      - Used AppError::Message for Tauri Store errors
      - Used AppError::io() for file system operations
    
    ### Fixed Previous Temporary Solutions
    
    - **import_export.rs** (2 lines changed)
      - Removed AppError::Message wrapper for mcp::sync_enabled_to_codex
      - Now directly calls the AppError-returning function (no conversion needed)
    
    - **commands.rs** (6 lines changed)
      - Updated query_provider_usage() and test_api_endpoints()
      - Explicit .to_string() conversion for Tauri command interface
    
    ## New Error Types
    
    - **AppError::McpValidation**: Domain-specific error for MCP configuration validation
      - Separates MCP validation errors from generic Config errors
      - Follows domain-driven design principles
    
    ## Statistics
    
    - Files changed: 8
    - Lines changed: +237/-122 (net +115)
    - Compilation:  Success (7.13s, 0 warnings)
    - Tests:  4/4 passed
    
    ## Benefits
    
    - **100% Migration**: All modules now use AppError consistently
    - **Domain Errors**: Added McpValidation for better error categorization
    - **No Temporary Solutions**: Eliminated all AppError::Message conversions for internal calls
    - **Performance**: Used ok_or_else for lazy error construction
    - **Maintainability**: Removed ~60 instances of .map_err(|e| format!("...", e))
    - **Debugging**: Added error logging in critical paths (tray menu updates)
    
    ## Phase 1 Complete
    
    Total impact across 3 commits:
    - 25 files changed
    - +671/-302 lines (net +369)
    - 100% of codebase migrated from Result<T, String> to Result<T, AppError>
    - 0 compilation warnings
    - All tests passing
    
    Ready for Phase 2: Splitting commands.rs by domain.
    
    Co-authored-by: Claude <noreply@anthropic.com>
  • feat: add provider usage query with JavaScript scripting support (#101)
    * feat: add provider usage query functionality
    
    - Updated `Cargo.toml` to include `regex` and `rquickjs` dependencies for usage script execution.
    - Implemented `query_provider_usage` command in `commands.rs` to handle usage queries.
    - Created `UsageScript` and `UsageData` structs in `provider.rs` for managing usage script configurations and results.
    - Added `execute_usage_script` function in `usage_script.rs` to run user-defined scripts for querying usage.
    - Enhanced `ProviderList` component to include a button for configuring usage scripts and a modal for editing scripts.
    - Introduced `UsageFooter` component to display usage information and status.
    - Added `UsageScriptModal` for editing and testing usage scripts with preset templates.
    - Updated Tauri API to support querying provider usage.
    - Modified types in `types.ts` to include structures for usage scripts and results.
    
    * feat(usage): support multi-plan usage display for providers
    
    - 【Feature】
      - Update `UsageResult` to support an array of `UsageData` for displaying multiple usage plans per provider.
      - Refactor `query_provider_usage` command to parse both single `UsageData` objects (for backward compatibility) and arrays of `UsageData`.
      - Enhance `usage_script` validation to accept either a single usage object or an array of usage objects.
    - 【Frontend】
      - Redesign `UsageFooter` to iterate and display details for all available usage plans, introducing `UsagePlanItem` for individual plan rendering.
      - Improve usage display with color-coded remaining balance and clear plan information.
      - Update `UsageScriptModal` test notification to summarize all returned plans.
      - Remove redundant `isCurrent` prop from `UsageFooter` in `ProviderList`.
    - 【Build】
      - Change frontend development server port from `3000` to `3005` in `tauri.conf.json` and `vite.config.mts`.
    
    * feat(usage): enhance query flexibility and display
    - 【`src/types.ts`, `src-tauri/src/provider.rs`】Make `UsageData` fields optional and introduce `extra` and `invalidMessage` for more flexible reporting.
      - `expiresAt` replaced by generic `extra` field.
      - `isValid`, `remaining`, `unit` are now optional.
      - Added `invalidMessage` to provide specific reasons for invalid status.
    - 【`src-tauri/src/usage_script.rs`】Relax usage script result validation to accommodate optional fields in `UsageData`.
    - 【`src/components/UsageFooter.tsx`】Update UI to display `extra` field and `invalidMessage`, and conditionally render `remaining` and `unit` based on availability.
    - 【`src/components/UsageScriptModal.tsx`】
      - Add a new `NewAPI` preset template demonstrating advanced extractor logic for complex API responses.
      - Update script instructions to reflect optional fields and new variable syntax (`{{apiKey}}`).
      - Remove old "DeepSeek" and "OpenAI" templates.
      - Remove basic syntax check for `return` statement.
    - 【`.vscode/settings.json`】Add `dish-ai-commit.base.language` setting.
    - 【`src-tauri/src/commands.rs`】Adjust usage logging to handle optional `remaining` and `unit` fields.
    
    * chore(config): remove VS Code settings from version control
    
    - delete .vscode/settings.json to remove editor-specific configurations
    - add /.vscode to .gitignore to prevent tracking of local VS Code settings
    - ensure personalized editor preferences are not committed to the repository
    
    * fix(provider): preserve usage script during provider update
    
    - When updating a provider, the `usage_script` configuration within `ProviderMeta` was not explicitly merged.
    - This could lead to the accidental loss of `usage_script` settings if the incoming `provider` object in the update request did not contain this field.
    - Ensure `usage_script` is cloned from the existing provider's meta when merging `ProviderMeta` during an update.
    
    * refactor(provider): enforce base_url for usage scripts and update dev ports
    - 【Backend】
        - `src-tauri/src/commands.rs`: Made `ANTHROPIC_BASE_URL` a required field for Claude providers and `base_url` a required field in `config.toml` for Codex providers when extracting credentials for usage script execution. This improves error handling by explicitly failing if these critical URLs are missing or malformed.
    - 【Frontend】
        - `src/App.tsx`, `src/components/ProviderList.tsx`: Passed `appType` prop to `ProviderList` component to ensure `updateProvider` calls within `handleSaveUsageScript` correctly identify the application type.
    - 【Config】
        - `src-tauri/tauri.conf.json`, `vite.config.mts`: Updated development server ports from `3005` to `3000` to standardize local development environment.
    
    * refactor(usage): improve usage data fetching logic
    
    - Prevent redundant API calls by tracking last fetched parameters in `useEffect`.
    - Avoid concurrent API requests by adding a guard in `fetchUsage`.
    - Clear usage data and last fetch parameters when usage query is disabled.
    - Add `queryProviderUsage` API declaration to `window.api` interface.
    
    * fix(usage-script): ensure usage script updates and improve reactivity
    
    - correctly update `usage_script` from new provider meta during updates
    - replace full page reload with targeted provider data refresh after saving usage script settings
    - trigger usage data fetch or clear when `usageEnabled` status changes in `UsageFooter`
    - reduce logging verbosity for usage script execution in backend commands and script execution
    
    * style(usage-footer): adjust usage plan item layout
    
    - Decrease width of extra field column from 35% to 30%
    - Increase width of usage information column from 40% to 45%
    - Improve visual balance and readability of usage plan items