Commit Graph

1215 Commits

  • docs: reorganize docs directory structure
    - Delete 9 completed planning/roadmap documents
    - Move 23 release notes into docs/release-notes/ with simplified filenames
    - Update all cross-references in READMEs, CHANGELOG, and release notes
    - Remove dangling doc reference in deeplink/mod.rs
  • docs: restructure user manual for i18n and add EN/JA translations
    Reorganize docs/user-manual/ from flat structure to language subdirectories
    (zh/, en/, ja/) with shared assets/. Move existing Chinese docs into zh/,
    fix image paths, add multilingual navigation README, and translate all 23
    markdown files (~4500 lines each) to English and Japanese.
  • docs: add OpenClaw coverage and complete settings docs for user manual
    - Add OpenClaw as the 5th supported app across all doc chapters (1-3, 5)
    - Add OpenClaw provider presets table to 2.1-add.md (30 presets)
    - Add OpenClaw config section to 5.1-config-files.md (JSON5 format)
    - Complete 1.5-settings.md with missing sections: app visibility,
      skill sync method, terminal settings, proxy tab, WebDAV cloud sync,
      backup/restore, and log configuration
    - Fix deeplink parser.rs to accept 'opencode' and 'openclaw' app types
    - Update 5.3-deeplink.md with new app type parameters
    - Remove incorrect OpenCode references from proxy docs (4.1-4.4)
  • feat: auto-extract common config snippets from live files on first run
    During app startup, iterate all app types and extract non-provider-specific
    config fields from live configuration files into the database. This runs
    only when no snippet exists yet for a given app type, enabling incremental
    extraction as new apps are configured.
  • docs: sync README features across EN/ZH/JA
    Add format conversion, per-provider proxy granularity, and
    symlink/file-copy support to EN and JA to match ZH updates.
  • fix: pass app interpolation param to proxy takeover toast messages
    The i18next t() calls for proxy.takeover.enabled/disabled were missing
    the `app` interpolation parameter, causing {{app}} placeholders in
    translation strings to render literally instead of showing the app name.
  • fix: restore flex-1 on toolbarRef to fix compact mode exit
    After moving ProxyToggle/FailoverToggle outside toolbarRef, the flex-1
    class was accidentally left only on the outer wrapper. Without flex-1,
    toolbarRef.clientWidth reflects content width instead of available space,
    causing useAutoCompact's exit condition to never trigger.
  • fix: let "follow system" theme auto-update by delegating to Tauri's native theme tracking
    Pass "system" to set_window_theme instead of explicitly detecting dark/light,
    so Tauri uses window.set_theme(None) and the WebView's prefers-color-scheme
    media query stays in sync with the real OS theme.
  • refactor: move proxy toggle into panel and surface app takeover options
    Move the proxy on/off switch from the accordion header into the panel
    content area, placing it right above the app takeover section. This
    ensures users see the takeover options immediately after enabling the
    proxy, preventing the common pitfall of running the proxy without
    actually taking over any app.
    
    - Simplify accordion trigger to standard style with Badge only
    - Add AnimatePresence animation for takeover section reveal
    - Remove duplicate takeover switches from running info card
    - Update stoppedDescription i18n to reference "above toggle"
    - Add proxy.takeover.hint key in zh/en/ja
  • revert: restore full config overwrite + Common Config Snippet (revert 992dda5c)
    Revert the partial key-field merging refactoring introduced in 992dda5c,
    along with two dependent commits (24fa8a18, 87604b18) that referenced
    the now-removed ClaudeQuickToggles component.
    
    The whitelist-based partial merge approach had critical issues:
    - Non-whitelisted custom fields were lost during provider switching
    - Backfill permanently stripped non-key fields from the database
    - Whitelist required constant maintenance to track upstream changes
    
    This restores the proven "full config overwrite + Common Config Snippet"
    architecture where each provider stores its complete configuration and
    shared settings are managed via a separate snippet mechanism.
    
    Reverted commits:
    - 24fa8a18: context-aware JSON editor hint + hide quick toggles
    - 87604b18: hide ClaudeQuickToggles when creating
    - 992dda5c: partial key-field merging refactoring
    
    Restored:
    - Full config snapshot write (write_live_snapshot) for Claude/Codex/Gemini
    - Full config backfill (settings_config = live_config)
    - Common Config Snippet UI and backend commands
    - 6 frontend components/hooks for common config editing
    - configApi barrel export and DB snippet methods
    
    Removed:
    - ClaudeQuickToggles component
    - write_live_partial / backfill_key_fields / patch_claude_live
    - All KEY_FIELDS constants
  • fix: add import button for OpenCode/OpenClaw empty state and remove auto-import on startup
    Previously OpenCode and OpenClaw auto-imported providers from live config
    on app startup, which could confuse users. Now they follow the same
    pattern as Claude/Codex/Gemini: manual import via the empty state button.
  • docs: highlight Common Config Snippet removal as breaking change in release notes
    Expand the partial key-field merging section with Before/After explanation
    and migration guide. Mark it as a breaking change in Highlights and Notes
    sections across all three languages (zh/en/ja) and CHANGELOG.md.
  • chore: bump version to v3.11.0 and add release notes
    - Update version numbers in package.json, Cargo.toml, tauri.conf.json
    - Add CHANGELOG.md entry for v3.11.0
    - Add trilingual release notes (zh/en/ja)
    - Update user manual version info
  • fix: treat missing db file as error in manual backup to prevent false success toast
    backup_database_file() returning Ok(None) was silently resolved as null
    on the frontend, bypassing try/catch and showing a success toast without
    actually creating a backup file. Now None is converted to an explicit
    Err so the frontend correctly displays an error toast.
  • feat: show silent startup option only when launch on startup is enabled
    Add conditional rendering with animated transition for the silent startup
    toggle, so it only appears when the launch on startup option is checked.
  • fix: restore API Key input visibility when creating new Claude providers
    The hasApiKeyField() gate added for Bedrock AKSK/API Key distinction
    was incorrectly hiding the API Key input for all new providers with
    empty env config. Scope the gate to cloud_provider category only.
  • fix: merge duplicate openclaw i18n keys to restore provider form translations
    JSON does not support duplicate keys — the second `openclaw` object was
    silently overwriting the first, causing all provider form field translations
    (providerKey, apiProtocol, baseUrl, models, etc.) to be lost at runtime.
  • fix: remove last-provider deletion restriction for OMO/OMO Slim plugins
    OMO and OMO Slim are OpenCode plugins, not standalone apps — users
    should be able to fully remove them. Remove the count-based guard that
    prevented deleting the last active provider, and clean up the now-unused
    provider-count API surface across the full stack.
  • refactor: remove OMO common config two-layer merge system
    Each OMO provider now stores its complete configuration directly in
    settings_config.otherFields instead of relying on a shared OmoGlobalConfig
    merged at write time. This simplifies the data flow from a 4-tuple
    (agents, categories, otherFields, useCommonConfig) to a 3-tuple and
    eliminates an entire DB table, two Tauri commands, and ~1700 lines of
    merge/sync code across frontend and backend.
    
    Backend:
    - Delete database/dao/omo.rs (OmoGlobalConfig struct + get/save methods)
    - Remove get/set_config_snippet from settings DAO
    - Remove get/set_common_config_snippet Tauri commands
    - Replace merge_config() with build_config() in services/omo.rs
    - Simplify OmoVariant (remove config_key, known_keys)
    - Simplify import_from_local and build_local_file_data
    - Rewrite all OMO service tests
    
    Frontend:
    - Delete OmoCommonConfigEditor.tsx and OmoGlobalConfigFields.tsx
    - Delete src/lib/api/config.ts
    - Remove OmoGlobalConfig type and merge preview functions
    - Remove useGlobalConfig/useSaveGlobalConfig query hooks
    - Simplify useOmoDraftState (remove all common config state)
    - Replace OmoCommonConfigEditor with read-only JsonEditor preview
    - Clean i18n keys (zh/en/ja)
  • fix: enforce OMO ↔ OMO Slim cross-category mutual exclusion
    When activating an OMO provider, deactivate all OMO Slim providers
    in the same transaction and delete the Slim config file, and vice
    versa. This prevents both plugin variants from being active
    simultaneously.
  • fix: invalidate OMO Slim query cache after provider mutations
    OMO Slim queries (["omo-slim", ...]) were not invalidated alongside
    OMO queries, causing stale UI state when switching/adding/deleting
    OMO Slim providers.
  • fix: sync OMO agent/category recommended models with upstream sources
    Regular agents & categories: align with oh-my-opencode model-requirements.ts
    fallback chains (oracle→gpt-5.2, librarian→gemini-3-flash, etc.)
    
    Slim agents: derive from Regular's design philosophy — match each agent
    to its functional counterpart's first-choice model instead of using
    the outdated Slim defaults. Also fix provider/model format to pure
    model IDs for suffix matching compatibility.
  • chore: pre-release cleanup — remove debug logs, fix clippy warning, add missing ja translations, and format code
    - Remove 2 console.log statements from DeepLinkImportDialog
    - Fix clippy unnecessary_map_or: use is_some_and in live.rs
    - Add 17 missing Japanese i18n keys (skills, proxy, circuitBreaker, universalProvider)
    - Run prettier and cargo fmt to fix pre-existing formatting drift
  • perf: optimize session panel loading with parallel scan and head-tail JSONL reading
    - Parallelize 5 provider scans using std::thread::scope
    - Add read_head_tail_lines() to read only first 10 + last 30 lines from JSONL files, skipping potentially large middle sections
    - Cache Codex UUID regex with LazyLock to avoid repeated compilation
    - Skip expensive I/O in OpenCode when session title is already available
  • fix: show context-aware JSON editor hint and hide quick toggles for non-active providers
    The hint text and ClaudeQuickToggles were misleading when editing
    non-current providers or creating new ones, since the editor only
    contains a config snippet rather than the full live settings.json.
  • fix: hide ClaudeQuickToggles when creating a new provider
    The quick toggles (hide AI attribution, extended thinking, teammates
    mode) patch the live config of the currently active provider, which
    is incorrect during provider creation. Only show them in edit mode.
  • chore: update Claude model references from 4.5 to 4.6 in provider presets
    Update Sonnet and Opus model IDs/names to 4.6 across Claude, OpenClaw,
    and OpenCode provider preset configurations. OPENCODE_PRESET_MODEL_VARIANTS
    (SDK model catalog) is intentionally left unchanged.
  • feat: add SSAI Code partner provider presets, i18n, icon, and fix models
    Add SSAI Code as a partner provider across all five apps with endpoint,
    API key URL, and partner promotion config. Rename brand from SSSAiCode
    to SSAI Code. Rename sssaicoding.svg to sssaicode.svg and register icon.
    Add trilingual promotion text for $10 bonus credit. Add missing models
    arrays in OpenClaw presets for CrazyRouter and SSAI Code.
  • feat: add CrazyRouter partner provider presets, i18n, and register icons
    Add CrazyRouter as a partner provider across all five apps with endpoint,
    API key URL, and partner promotion config. Add trilingual promotion text
    for the 30% bonus credit offer. Register aicoding and crazyrouter icons
    in the icon index. Fix indentation in openclawProviderPresets.
  • feat: add AICoding partner provider presets and i18n promotion text
    Add AICoding as a partner provider across all five apps (Claude, Codex,
    Gemini, OpenClaw, OpenCode) with endpoint, API key URL, and partner
    promotion configuration. Add trilingual (zh/en/ja) promotion text for
    the first top-up discount.
  • fix(opencode): add missing omo-slim category checks across add/form/mutation paths
    Several code paths only checked for "omo" category but missed "omo-slim",
    causing OMO Slim providers to be treated as regular OpenCode providers
    (triggering invalid write_live_snapshot, requiring manual provider key,
    and showing wrong form fields).
  • feat: Add AWS Bedrock Provider Support (AKSK & API Key) (#1047)
    * Add AWS Bedrock provider integration design document
    
    Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
    
    * Add AWS Bedrock provider implementation plan
    
    Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
    
    * Update implementation plan: add OpenCode Bedrock support
    
    Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
    
    * feat: add cloud_provider category to ProviderCategory type
    
    Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
    
    * feat: add AWS Bedrock (AKSK) Claude Code provider preset with tests
    
    Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
    
    * feat: add AWS Bedrock (API Key) Claude Code provider preset with tests
    
    Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
    
    * feat: add AWS Bedrock OpenCode provider preset with @ai-sdk/amazon-bedrock
    
    Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
    
    * docs: add AWS Bedrock provider feature summary for PR
    
    Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
    
    * chore: remove internal planning documents
    
    Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
    
    * docs: add AWS Bedrock support to README (EN/ZH/JA)
    
    Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
    
    * Add AWS Bedrock UI merge design document
    
    Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
    
    * Add AWS Bedrock UI merge implementation plan
    
    Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
    
    * feat: skip optional template values in validation
    
    Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
    
    * feat: support isSecret template fields and hide base URL for Bedrock
    
    Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
    
    * feat: add Bedrock validation, cleanup, and isBedrock prop in ProviderForm
    
    Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
    
    * feat: extend TemplateValueConfig and merge Bedrock presets
    
    Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
    
    * fix: mask Bedrock API Key as secret and support GovCloud regions
    
    - Add isSecret: true to BEDROCK_API_KEY template value
    - Update region regex to support multi-segment regions (us-gov-west-1)
    
    Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
    
    * style: replace AWS icon with updated logo
    
    Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
    
    * style: replace AWS icon with updated logo
    
    Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
    
    * style: replace AWS icon with new PNG image
    
    Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
    
    * fix: address code review findings
    
    - Fix AWS icon: use SVG with embedded <image> instead of raw <img> tag
    - Hide duplicate ApiKeySection for Bedrock (auth via template fields only)
    - Guard settingsConfig cleanup against unresolved template placeholders
    
    Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
    
    * chore: remove planning documents
    
    Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
    
    * refactor: address PR review - split Bedrock into two presets, restore SVG icon
    
    Based on maintainer review feedback on PR #1047:
    
    1. Split merged "AWS Bedrock" back into two separate presets:
       - "AWS Bedrock (AKSK)": uses AWS_ACCESS_KEY_ID + AWS_SECRET_ACCESS_KEY
       - "AWS Bedrock (API Key)": uses top-level apiKey field via standard UI input
    
    2. Restore aws.svg to pure vector SVG (was PNG-in-SVG)
    
    3. Remove all Bedrock-specific logic from shared components:
       - Remove isBedrock prop from ClaudeFormFields
       - Remove Bedrock validation/cleanup blocks from ProviderForm
       - Remove optional/isSecret from TemplateValueConfig
       - Remove optional skip from useTemplateValues
    
    4. Add cloud_provider category handling:
       - Skip API Key/Base URL required validation
       - Hide Speed Test and Base URL for cloud_provider
       - Hide API format selector for cloud_provider (always Anthropic)
       - Show API Key input only when config has apiKey field
    
    5. Fix providerConfigUtils to support top-level apiKey:
       - getApiKeyFromConfig: check config.apiKey before env fields
       - setApiKeyInConfig: write to config.apiKey when present
       - hasApiKeyField: detect top-level apiKey property
    
    6. Add OpenClaw Bedrock preset (bedrock-converse-stream protocol)
    
    7. Update model IDs:
       - Sonnet: global.anthropic.claude-sonnet-4-6
       - Opus: global.anthropic.claude-opus-4-6-v1
       - Haiku: global.anthropic.claude-haiku-4-5-20251001-v1:0
    
    Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
    
    * fix(test): align Bedrock API Key test assertions with preset implementation
    
    The API Key preset was refactored to use standard UI input (apiKey: "")
    instead of template variables, but the tests were not updated accordingly.
    
    ---------
    
    Co-authored-by: root <root@ip-10-0-11-189.ap-northeast-1.compute.internal>
    Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
    Co-authored-by: Jason <farion1231@gmail.com>
  • feat(workspace): make directory paths clickable and rename "Today's Note" to "Add Memory"
    Add open_workspace_directory Tauri command to open workspace/memory dirs
    in the system file manager. Rename dailyMemory.createToday across all locales.
  • feat(workspace): add full-text search for daily memory files
    Add backend search command that performs case-insensitive matching
    across all daily memory files, supporting both date and content queries.
    Frontend includes animated search bar (⌘F), debounced input, snippet
    display with match count badge, and search state preservation across
    edits.
  • feat(preset): update domestic model providers to latest versions
    - MiniMax: M2.1 → M2.5
    - Zhipu GLM: glm-4.7 → glm-5
    - BaiLing: Ling-1T → Ling-2.5-1T
    - DouBaoSeed: doubao-seed-code-preview-latest → doubao-seed-2-0-code-preview-latest
    - Qwen (Bailian): qwen3-max → qwen3.5-plus
  • refactor(provider): switch from full config overwrite to partial key-field merging (#1098)
    * refactor(provider): switch from full config overwrite to partial key-field merging
    
    Replace the provider switching mechanism for Claude/Codex/Gemini from
    full settings_config overwrite to partial key-field replacement, preserving
    user's non-provider settings (plugins, MCP, permissions, etc.) across switches.
    
    - Add write_live_partial() with per-app implementations for Claude (JSON env
      merge), Codex (auth replace + TOML partial merge), and Gemini (env merge)
    - Add backfill_key_fields() to extract only provider-specific fields when
      saving live config back to provider entries
    - Update switch_normal, sync_current_to_live, add, update to use partial merge
    - Remove common config snippet feature for Claude/Codex/Gemini (no longer
      needed with partial merging); preserve OMO common config
    - Delete 6 frontend files (3 components + 3 hooks), clean up 11 modified files
    - Remove backend extract_common_config_* methods, 3 Tauri commands,
      CommonConfigSnippets struct, and related migration code
    - Update integration tests to validate key-field-only backfill behavior
    
    * refactor(cleanup): remove dead code and redundant MCP sync after partial-merge refactor
    
    - Remove ConfigService legacy full-overwrite sync methods (~150 lines)
    - Remove redundant McpService::sync_all_enabled from switch_normal
    - Switch proxy fallback recovery from write_live_snapshot to write_live_partial
    - Remove dead ProviderService::write_gemini_live wrapper
    - Update tests to reflect partial-merge behavior (MCP preserved, not re-synced)
    
    * feat(claude): add Quick Toggles for common Claude Code preferences
    
    Add checkbox toggles for hideAttribution, alwaysThinking, and
    enableTeammates that write directly to the live settings file via
    RFC 7396 JSON Merge Patch. Mirror changes to the form editor using
    form.watch for reactive updates.
    
    * fix(provider): add missing key fields to partial-merge constants
    
    Add provider-specific fields verified against official docs to prevent
    key residue or loss during provider switching:
    
    - Claude: CLAUDE_CODE_SUBAGENT_MODEL (env), model (top-level)
    - Codex: review_model, plan_mode_reasoning_effort
    - Gemini: GOOGLE_API_KEY (official alternative to GEMINI_API_KEY)
    
    * fix(provider): expand partial-merge key fields for Bedrock, Vertex, Foundry and behavior settings
    
    Add missing env/top-level fields to CLAUDE_KEY_ENV_FIELDS and
    CLAUDE_KEY_TOP_LEVEL so that provider switching correctly replaces
    (and clears) credentials and flags for AWS Bedrock, Google Vertex AI,
    Microsoft Foundry, and provider behavior overrides like max output
    tokens and prompt caching.
    
    * feat(provider): add auth field selector for Claude providers (AUTH_TOKEN / API_KEY)
    
    Allow users to choose between ANTHROPIC_AUTH_TOKEN and ANTHROPIC_API_KEY
    when creating or editing custom Claude providers, persisted in meta.apiKeyField.
    
    * refactor(preset): remove AiHubMix hardcoded API_KEY in favor of generic auth selector
    
    AiHubMix was the only preset that hardcoded ANTHROPIC_API_KEY before the
    generic auth field selector was introduced. Now that users can freely
    choose between AUTH_TOKEN and API_KEY via the UI, remove the special-case
    and default AiHubMix to the standard ANTHROPIC_AUTH_TOKEN.
  • feat(backup): add hourly periodic backup timer during runtime
    Previously periodic backup only checked on startup. Now spawns a
    tokio interval task that checks every hour while the app is running.
  • feat(backup): add independent backup panel, configurable policy, and rename support
    Extract backup & restore into a standalone AccordionItem in Advanced settings.
    Add configurable auto-backup interval (disabled/6h/12h/24h/48h/7d) and retention
    count (3-50) via settings. Add per-backup rename with inline editing UI.