Commit Graph

47 Commits

  • chore(presets): drop isPartner flag from MiniMax presets across all apps
    Remove the gold star badge and the partner promotion banner for MiniMax by
    deleting the isPartner flag from all 12 MiniMax presets (cn + en) across
    claude, claude-desktop, codex, opencode, openclaw, and hermes.
    
    Both the preset-selector star (gated on isPartner) and the API-key promotion
    banner (gated on isPartner && partnerPromotionKey) disappear as a result.
    The partnerPromotionKey and the minimax_cn/minimax_en i18n copy are kept
    dormant so the partnership can be re-enabled with a single line if needed.
    MiniMax stays as a regular cn_official provider, keeping its icon and theme.
  • feat: add Kimi K2.7 Code model and upgrade official Kimi presets
    Add kimi-k2.7-code pricing seed (in $0.95 / out $4.00 / cache-read $0.19
    per 1M tokens, 256K context) and point all six official Moonshot Kimi
    presets (Claude Code, Codex, Claude Desktop, Hermes, OpenCode, OpenClaw)
    at the new model. Rename the version-tagged OpenCode/OpenClaw presets to
    "Kimi K2.7 Code" and correct the OpenClaw context window to 262144.
    
    The seed is applied via the idempotent INSERT OR IGNORE path that runs on
    every startup, so existing users pick up the new pricing without a schema
    migration. Kimi For Coding and Nvidia presets are intentionally untouched.
  • chore(presets): remove LemonData provider and demote SudoCode to regular provider
    - LemonData: delete the provider preset from all apps (claude, claude-desktop,
      codex, gemini, hermes, opencode, openclaw), remove partner promotion copy
      (zh/en/ja/zh-TW), icon index/metadata entries, sponsor ads in all READMEs,
      and the logo/icon PNG assets.
    - SudoCode: drop the isPartner flag and partnerPromotionKey across all app
      presets and remove the now-orphaned partner promotion copy; it stays as a
      regular third_party provider, keeping its icon.
  • feat(presets): add Unity2.ai partner provider across seven apps
    Add Unity2.ai, a high-performance AI API relay partner, as a preset for
    Claude, Codex, Gemini, OpenCode, OpenClaw, Claude Desktop, and Hermes.
    Each preset carries the referral signup link as apiKeyUrl.
    
    - Register the unity2 icon via iconUrls (PNG URL import) + metadata
    - Add partnerPromotion copy in zh/en/ja/zh-TW; backfill the missing
      zh-TW ccsub entry
    - List Unity2.ai in the sponsor section of all README locales
    - Codex uses the bare base URL (gateway exposes /responses at root);
      OpenCode/OpenClaw/Hermes use the /v1 chat-completions endpoint with
      gpt-5.5 as the only preset model
    - Trim CCSub OpenCode/OpenClaw/Hermes model lists to gpt-5.5 to match
    - Normalize unity2/ccsub banners to the standard 2.41 aspect ratio
  • fix(presets): add Kimi affiliate links (#3809)
    Problem: Kimi and Moonshot preset links were user-clickable without the cc-switch affiliate query.\n\nDecision: Update only UI-facing preset website/API-key links and leave API request endpoints untouched.\n\nChange: Add aff=cc-switch to Kimi/Moonshot websiteUrl values and Codex/OpenCode API-key links.
    
    Co-authored-by: xumingyuan <xumingyuan@msh.team>
  • refactor(presets): align CCSub to end of partner block across apps
    Move the CCSub preset to sit right after DouBaoSeed, at the end of the
    partner block and before the first non-partner provider, so its position
    is consistent across all six apps:
    
    - Codex / OpenCode: moved up from the 2nd slot (between Shengsuanyun and
      the next partner) to the block tail
    - OpenClaw / Hermes: moved up from the aggregator section to the block tail
    - Claude / Claude Desktop: already at the block tail
    
    Also add the missing CHANGELOG entry for the CCSub preset, and drop the
    provider preset order test that enforced a now-unneeded ordering invariant.
  • feat(presets): add CCSub provider across six apps
    Add CCSub, a multi-model aggregator partner, as a preset for Claude, Codex, OpenCode, OpenClaw, Claude Desktop, and Hermes. Each preset carries the referral signup link as apiKeyUrl.
    
    - Register the ccsub icon via iconUrls (1.1MB SVG URL import) + metadata
    - Add partnerPromotion copy in zh/en/ja
    - List CCSub in the sponsor section of all README locales
    - Use gpt-5.5 and gemini-3.1-pro as the OpenAI/Gemini model ids
  • chore(presets): update SSSAiCode domain and endpoint nodes
    Switch website/apiKey URLs to sssaicodeapi.com and replace base URL
    nodes with node-hk.sssaicodeapi.com (default), node-hk.sssaiapi.com,
    and node-cf.sssaicodeapi.com across all 7 app presets.
  • feat: add CherryIN preset provider for Claude Code and Codex (#3643)
    * feat: add CherryIN preset provider for Claude Code and Codex
    
    CherryIN (open.cherryin.net) is an API aggregator gateway. Add it as a quick-config preset for both Claude Code (Anthropic format) and Codex (OpenAI-compatible), placed next to AiHubMix, with the official brand icon. Endpoints and model IDs verified against CherryIN's live pricing API.
    
    * feat: add CherryIN preset to Gemini, Claude Desktop, OpenCode, OpenClaw, Hermes
    
    Extend CherryIN coverage to all remaining apps, each placed next to AiHubMix. Anthropic-native (open.cherryin.net) for Claude Desktop/OpenClaw/Hermes, @ai-sdk/anthropic (/v1) for OpenCode, Gemini-compatible endpoint for Gemini CLI. Model IDs verified against CherryIN's live pricing API.
  • [codex] fix Zhipu coding plan presets (#3524)
    * fix(presets): update Zhipu coding plan endpoints
    
    * fix(model-fetch): probe /models on versioned /vN base URLs
    
    The model-list probe assumed any base URL not ending in /v1 needs /v1/models appended. For providers whose base URL already ends in a version segment like /v4 (Zhipu/Z.AI GLM Coding Plan at .../api/coding/paas/v4), this produced .../v4/v1/models which 404s, so the "Fetch models" button always failed.
    
    Detect a trailing /v{N} version segment and probe {base}/models first, keeping /v1/models as a fallback candidate for non-/v1 versions. Fixes Codex/OpenCode/OpenClaw/Hermes GLM presets and any other vN-style endpoint, with no behavior change for /v1 or non-versioned URLs.
    
    ---------
    
    Co-authored-by: Jason <farion1231@gmail.com>
  • Add referral param to ShengSuanYun website links
    The websiteUrl for ShengSuanYun presets pointed at the bare domain while
    only apiKeyUrl carried the from=CH_4HHXMRYF referral code. Append the same
    referral param to websiteUrl across all provider presets so the in-app
    'open website' jump is also attributed to the channel.
  • Update default models and pricing across presets
    Bump default model names project-wide: gpt-5.4 -> gpt-5.5,
    gemini-3.x -> gemini-3.5-flash, glm-5 -> glm-5.1, and
    grok-code-fast-1 -> grok-build-0.1 across all provider presets
    (claude, codex, gemini, hermes, openclaw, opencode, universal),
    Gemini config, and stream check defaults.
    
    Pricing:
    - Seed gemini-3.5-flash, gemini-3.1-flash-lite, step-3.5-flash-2603,
      doubao-seed-2.0-code, mimo-v2.5(/pro), qwen3-coder-480b, grok-build-0.1.
    - Correct deepseek-v4-flash/pro, glm-5/5.1, grok pricing.
    - Add repair_current_model_pricing: idempotent pass that fixes only
      rows still equal to the outdated built-in values, preserving any
      user-customized prices (seed uses INSERT OR IGNORE and cannot update
      existing rows).
    
    Fixes from review:
    - opencode: drop duplicate gemini-3.5-flash variant (unreachable via
      .find), keep the entry with the full minimal/low/medium/high set.
    - Align stale display names/costs to gemini-3.5-flash (hermes, openclaw,
      opencode); openclaw cost -> {1.5, 9, 0.15} to match seed.
    - i18n (zh/en/ja/zh-TW): refresh OMO category tooltips for new model
      names; fix writing tooltip to Kimi K2.5 to match its recommended.
    
    Update tests accordingly and add a regression test asserting unique
    model ids in the Google opencode preset variants.
  • Upgrade default Claude Opus model to 4.8
    Bump the default Opus route/model from claude-opus-4-7 to claude-opus-4-8
    across provider presets (claude, claudeDesktop, hermes, openclaw, opencode,
    universal), i18n locales (zh/en/ja/zh-TW), pricing seed data, and the
    user-manual docs.
    
    - Add claude-opus-4-8 pricing row ($5/$25/$0.50/$6.25); keep the 4-7 row
      for historical usage stats (seeded via INSERT OR IGNORE).
    - Claude Desktop proxy: accept bidirectional opus 4-7 <-> 4-8 route alias
      during rollout so previously saved routes keep resolving.
    - thinking_optimizer: route opus-4-8 through adaptive thinking and normalize
      dotted model ids (also fixes dotted 4-6/4-7 falling back to legacy).
    - usage_stats: normalize Bedrock/Vertex/aggregator opus-4-8 ids to base
      pricing.
    
    Also merge role:"system" messages into the Gemini systemInstruction in the
    Anthropic->Gemini transform.
  • chore(sponsors): drop AICoding partner from README, presets and i18n
    Remove AICoding (aicoding.sh) sponsor entry from the three README files
    and the provider preset across all seven app_types (claude, codex,
    gemini, hermes, opencode, openclaw, claudeDesktop). Also drop the
    matching partner_promotion.aicoding string in zh/en/ja locales.
    
    The icon (src/icons/extracted/index.ts) and the legacy provider id in
    codex_history_migration.rs are kept intentionally: the former for
    possible later re-use, the latter so existing users' Codex history
    still gets bucketed into "custom" on upgrade.
  • chore: remove LionCC sponsor and presets
    - Remove LionCC sponsor entry from all README files (en/zh/ja)
    - Remove LionCCAPI presets from all provider configs
    - Remove lionccapi i18n keys from all locales
    - Keep lioncc.png icon file as requested
  • feat: add Xiaomi MiMo Token Plan presets (#2803)
    * feat: add Xiaomi MiMo token plan presets
    
    * fix: update Xiaomi MiMo provider presets
    
    * fix: align MiMo V2.5 model specs with official documentation
    
    - Update maxTokens from 32000 to 131072 (128K) for mimo-v2.5-pro and mimo-v2.5
    - Update contextWindow from 262144 to 1048576 (1M) for mimo-v2.5
    - Aligns with official specs from Xiaomi MiMo documentation
    - Ensures consistency between OpenClaw and OpenCode presets
    
    ---------
    
    Co-authored-by: Jason <farion1231@gmail.com>
  • refactor(presets): render presets in array order and prioritize partners
    Remove the category-based grouping logic from ProviderPresetSelector,
    letting the array position in each preset config file be the single
    source of truth for display order. Move partner presets (PatewayAI,
    火山Agentplan, BytePlus, DouBaoSeed) right after Shengsuanyun across
    all 6 config files so they appear earlier in the UI.
  • feat(presets): add BytePlus provider preset as partner
    Add BytePlus (international Volcengine) to Claude, Claude Desktop,
    Hermes, OpenCode, and OpenClaw with byteplus icon, 256K context window,
    and trilingual promotion text.
  • feat(presets): add 火山Agentplan provider preset as partner
    Add Volcengine Ark Agentplan to Claude, Claude Desktop, Hermes,
    OpenCode, and OpenClaw with huoshan icon and trilingual promotion.
  • chore(presets): update DouBaoSeed endpoint, links, and add as partner
    Switch Anthropic-format base URL from /api/coding to /api/compatible,
    update website/apiKey URLs to Volcengine console with tracking params,
    and promote DouBaoSeed to partner with trilingual promotion text.
  • feat(presets): add RunAPI provider presets
    Add RunAPI as a new partner provider with support for:
    - Claude Code preset (Anthropic native protocol)
    - Codex preset (gpt-5.5 model)
    - Claude Desktop preset (direct mode with passthrough routes)
    - OpenCode preset (@ai-sdk/anthropic)
    - OpenClaw preset (anthropic-messages protocol)
    - Hermes preset (anthropic_messages mode)
    - Icon configuration (runapi.jpg)
    - i18n support (zh/en/ja) with ¥14 free credit promotion
    
    RunAPI is a high-performance AI model API gateway supporting 150+
    mainstream models (OpenAI, Claude, Gemini, DeepSeek, Grok) with
    prices as low as 10% of official rates.
  • feat(presets): add ClaudeCN provider presets
    Add ClaudeCN as a new partner provider with support for:
    - Claude Code preset (Anthropic native protocol)
    - Codex preset (gpt-5.5 model)
    - Claude Desktop preset (direct mode with passthrough routes)
    - OpenCode preset (@ai-sdk/anthropic)
    - OpenClaw preset (anthropic-messages protocol)
    - Hermes preset (anthropic_messages mode)
    - Icon configuration (claudecn.png)
    - i18n support (zh/en/ja) with enterprise service promotion
    
    ClaudeCN is an enterprise-grade AI gateway operated by a registered
    company, supporting enterprise procurement processes with corporate
    payments, contracts, and compliance guarantees.
  • chore(presets): migrate OpenClaudeCode to MicuAPI domain
    Replace all openclaudecode.cn URLs with micuapi.ai across all
    provider presets (Claude, Codex, Hermes, OpenClaw, OpenCode,
    Claude Desktop). This includes website URLs, API key URLs, and
    base URLs.
  • chore(presets): update CrazyRouter API endpoints to cn subdomain
    Update all CrazyRouter baseURL configurations from crazyrouter.com
    to cn.crazyrouter.com across all supported applications (Claude,
    Codex, Gemini, Hermes, OpenClaw, OpenCode, Claude Desktop).
    
    Website and registration URLs remain unchanged.
  • chore(partners): remove DDSHub partner integration
    Remove DDSHub from all provider presets (Claude, Claude Desktop, Codex, Hermes),
    i18n files (zh/en/ja), README docs, and icon system. Physical assets retained for
    potential future restoration.
  • chore(kimi): update Kimi For Coding website URL to /code/docs/
    Sync the preset's websiteUrl from the legacy /coding/docs/ path to
    the current /code/docs/ path across all four app presets (claude,
    hermes, openclaw, opencode).
  • feat(compshare): add Coding Plan preset across claude/codex/hermes/openclaw
    Introduce a dedicated "Compshare Coding Plan" variant pointing to
    https://cp.compshare.cn (with /v1 for OpenAI-compatible apps). Reuses
    the existing ucloud icon and promotion copy, while adding a new
    providerForm.presets.ucloudCoding key in zh/en/ja.
  • feat(deepseek): switch presets to V4 (flash/pro) and add pricing
    DeepSeek released V4 flash/pro; legacy IDs deepseek-chat / deepseek-reasoner
    now alias to deepseek-v4-flash and will be deprecated.
    
    - Update claude/hermes/opencode/openclaw presets to v4-pro / v4-flash,
      context 128K -> 1M; Claude Anthropic-compat endpoint routes OPUS/SONNET
      to v4-pro and HAIKU to v4-flash, plus an explicit modelsUrl override.
    - Seed deepseek-v4-flash ($0.14/$0.28 per 1M) and deepseek-v4-pro
      ($1.68/$3.36 per 1M) into model_pricing; older v3.x / chat / reasoner
      rows kept for historical usage stats (INSERT OR IGNORE).
    - Refresh user-manual (zh/en/ja) pricing table and note that legacy model
      IDs are billed at v4-flash rates.
  • feat(presets): upgrade Kimi K2.5 to K2.6 in direct Moonshot configs
    Bump model id and display name from K2.5 to K2.6 in Hermes, OpenClaw,
    OpenCode, and Claude (direct api.moonshot.cn) presets. Pricing,
    context window, and base URL are unchanged.
    
    Add kimi-k2.6 row to model_pricing seed; no migration needed since
    seed_model_pricing uses INSERT OR IGNORE and runs on every startup
    via ensure_model_pricing_seeded. Old kimi-k2.5 row is kept to
    preserve historical usage stats.
    
    Nvidia aggregator forwards (moonshotai/kimi-k2.5) intentionally keep
    the K2.5 SKU until Nvidia's catalog confirms K2.6.
  • feat(presets): add LemonData provider across all six apps
    Register LemonData (third-party partner) preset for Claude, Codex,
    Gemini, OpenCode, OpenClaw, and Hermes, plus icon assets and i18n
    partner promotion copy (zh/en/ja). Claude preset uses
    ANTHROPIC_API_KEY auth; OpenAI-compatible apps target gpt-5.4.
  • feat(hermes): align provider schema with Hermes Agent 0.10.0
    Hermes 0.10.0 tightened custom_providers validation (commit 2cdae233):
    invalid base_urls are rejected, unknown fields produce warnings, and
    new fields (rate_limit_delay, bedrock_converse, key_env) landed.
    
    - Add bedrock_converse to the api_mode selector (and i18n labels)
    - Expose rate_limit_delay in a provider-level advanced panel
    - Validate base_url client-side (URL shape, template-token friendly)
    - Drop per-model max_tokens — not in _VALID_CUSTOM_PROVIDER_FIELDS
    - Round-trip test asserts set_provider preserves rate_limit_delay /
      key_env / any unknown forward-compat field
  • refactor(hermes): drop "Auto" api_mode and require explicit protocol
    Hermes' built-in api_mode detection only matches a handful of official
    endpoints (api.openai.com, api.anthropic.com, api.x.ai, AWS Bedrock);
    third-party / proxy endpoints silently fall back to chat_completions,
    which causes opaque 401/404s on Anthropic-protocol or Codex-Responses
    providers. The "Auto" option was misleading for the common third-party
    case.
    
    - Drop the "Auto" option from the API Mode dropdown; remove the
      HermesApiModeChoice sentinel type so writes always emit api_mode.
    - Default new providers and legacy entries lacking api_mode to
      chat_completions (only persisted on user save).
    - Deeplink imports now write api_mode: chat_completions explicitly
      instead of relying on URL heuristics; test renamed accordingly.
    - Rename the "Codex Responses (Copilot / OpenCode)" label to
      "OpenAI Responses" to match OpenAI's /v1/responses naming.
  • refactor(hermes): share provider-source marker constants and write guard
    After /simplify review of the P1-3 second wave, two small cleanups:
    
    - Lift the `_cc_source` / `providers_dict` magic strings out of
      ProviderCard into a shared helper (`isHermesReadOnlyProvider`) and
      named constants in hermesProviderPresets.ts. Front-end and back-end
      now document the same marker contract in two mirrored places
      instead of drifting strings.
    
    - Replace the duplicate `is_dict_only_provider` + `format!` branches
      at the top of `set_provider` / `remove_provider` with a single
      `ensure_provider_writable(config, name, verb)` guard. Future error
      copy tweaks only have to happen once.
    
    No behaviour change; all 52 hermes_config tests stay green.
  • fix(hermes): prevent YAML pollution and drop of OAuth mcp auth
    DeepLink Hermes import was emitting camelCase (baseUrl / apiKey /
    apiMode) that the Hermes runtime does not recognise, poisoning
    `custom_providers:` entries on activation. The MCP sync path was
    also stripping `auth: oauth` on round-trip, silently downgrading
    OAuth-type servers to unauthenticated calls.
    
    The Hermes deeplink branch now emits snake_case via a dedicated
    builder; `sanitize_hermes_provider_keys` runs on both `set_provider`
    and `get_providers` so legacy DB records heal on next access.
    `HERMES_EXTRA_FIELDS` preserves `auth`. The `api_mode` dropdown gains
    `codex_responses` (Copilot / OpenCode), and the schema-migrated
    warning copy no longer hard-codes "v12" (upstream `_config_version`
    is now 19).
  • fix(presets): refresh stale context windows for DeepSeek and Claude 1M
    - DeepSeek V3.2 / R1 (Hermes, OpenClaw): 64K → 128K context
    - DeepSeek R1 max output: 8K → 64K (includes CoT tokens)
    - Claude Opus 4.7 / Sonnet 4.6 via OpenRouter: 200K → 1M context
  • fix(presets): refresh stale model IDs and backfill Hermes model lists
    - Bump NewAPI universal preset to Claude 4.7 / Sonnet 4.6 / Haiku 4.5 and
      Gemini 3.1; fix opusModel mistakenly pointing to Sonnet
    - Bump Gemini Native (Claude preset) to gemini-3.1-pro / gemini-3-flash
    - Bump TheRouter Gemini preset to gemini-3.1-pro
    - Backfill models[] + suggestedDefaults for 15 Hermes anthropic_messages
      presets:
        * Bailian For Coding: qwen3-coder-plus / qwen3-max
        * Kimi For Coding: kimi-for-coding
        * 13 third-party Claude proxies: claude-opus-4-7 / sonnet-4-6 /
          haiku-4-5-20251001
    - Add Claude Haiku 4.5 entry to Hermes OpenRouter model list
  • feat(hermes): switch eligible presets to chat_completions + GPT-5.4
    Migrate 18 Hermes provider presets from anthropic_messages to
    chat_completions to sidestep known upstream Hermes bugs (model-name
    dot-mangling in normalize_model_name, api_mode drop after v11->v12
    migration, and auxiliary_client OpenAI hardcode).
    
    Native providers now target each vendor's official OpenAI-compatible
    endpoint with correct model IDs: Kimi (kimi-k2.5-preview on /v1),
    Bailian (compatible-mode/v1 with Qwen3 defaults), Xiaomi MiMo, Longcat
    (/openai/v1), Zhipu GLM (/api/paas/v4), ModelScope, MiniMax, SiliconFlow,
    and Novita (/v3/openai).
    
    Aggregators (Shengsuanyun, AiHubMix, DMXAPI, Compshare, TheRouter)
    default to GPT-5.4 on chat_completions, mirroring the Codex preset
    lineup. TheRouter omits gpt-5.4-pro since that variant is Responses-only
    and Hermes implements only chat_completions. OpenRouter's existing
    openai/gpt-5 entry is bumped to openai/gpt-5.4.
    
    Claude-only proxies are left on anthropic_messages; their Codex
    counterparts use wire_api=responses, so there is no evidence their
    chat_completions endpoints serve OpenAI models.
  • chore(hermes): prune unused official presets and fix Nous endpoint
    Remove the Anthropic, OpenAI, and Google AI presets from the Hermes
    preset list. They were placeholder samples introduced when the Hermes
    module first landed and do not match the actual user paths in
    CC Switch (Claude / Codex go through OAuth, Gemini Native is its own
    adapter), and the upstream endpoints are not reachable for most of
    the target users anyway.
    
    Fix the Nous Research preset: its base_url was a fabricated domain
    (inference.nous.hermes.dev) that has never resolved. Point it at the
    real Nous Portal endpoint (inference-api.nousresearch.com/v1) and
    add apiKeyUrl so users can jump straight to portal.nousresearch.com
    to provision a key.
    
    Drop the now-orphan providerForm.presets.{anthropic,openai,googleai}
    i18n keys from zh / en / ja since no preset references them anymore.
  • feat(presets): sync Claude provider presets to Hermes
    Import 38 Claude presets into Hermes by mapping env-style
    ANTHROPIC_BASE_URL/AUTH_TOKEN to flat base_url/api_key, deriving
    api_mode from apiFormat (anthropic_messages or chat_completions),
    deduping ANTHROPIC_*_MODEL into models[], and pointing
    suggestedDefaults at ANTHROPIC_MODEL. Skip OAuth-only presets
    (Codex, Copilot), Bedrock SigV4, Gemini Native, and the three
    already shipped on the Hermes side (OpenRouter, Anthropic,
    DeepSeek). Place Shengsuanyun at the head of the Hermes array so
    the partner shows first in the preset panel.
    
    In the Claude preset list, restore Shengsuanyun back ahead of
    Gemini Native. The Gemini Native preset (#1918) was inserted
    between Claude Official and Shengsuanyun, which made the
    third_party category register first in the reduce-based grouping
    and pushed the aggregator block (and Shengsuanyun) behind it.
    
    Backfill the missing providerForm.presets translations across zh,
    en, and ja (openrouter, anthropic, openai, googleai, deepseek,
    together; plus shengsuanyun for en and ja) so existing Hermes
    preset names no longer render literal i18n keys.
  • feat(hermes): add API mode dropdown and per-provider model editor in form
    The Hermes provider form previously only exposed Base URL and API Key,
    forcing users to drop into the Model panel to hand-edit model IDs after
    adding a provider. Following OpenClaw's shape, the form now carries:
    
    - An API Mode selector (auto-detect / chat_completions / anthropic_messages).
      "auto" is a UI-only sentinel — selecting it deletes api_mode from the
      config so the YAML doesn't leak a redundant field.
    - A model list editor where the first row is badged as the default and
      each row has a collapsible Advanced panel for context_length and
      max_tokens. Adding/removing rows uses a UUID-keyed ref so typing in
      one input doesn't drop focus when another row is added.
    - A Fetch Models button that pulls /v1/models from the configured
      endpoint and exposes the catalog in a per-row dropdown, identical to
      OpenClaw's flow. The vendor grouping is memoized so keystrokes don't
      trigger a reduce+sort per model row — Radix DropdownMenuContent does
      not lazy-mount, so the inner JSX evaluates on every render regardless
      of whether the menu is open.
    
    Three-locale i18n keys are added together (zh/en/ja).
  • feat(hermes): bind per-provider models to top-level model: on switch
    Hermes custom_providers entries now carry an ordered models array
    (id / context_length / max_tokens) plus suggestedDefaults. The backend
    serializes the array to the YAML dict shape Hermes expects on write and
    inverts it on read, preserving insertion order via the preserve_order
    feature on serde_json.
    
    When a user switches providers, switch_normal calls apply_switch_defaults
    so the top-level model.default / model.provider follow the selected
    provider's first model. Previously switching a Hermes provider only
    shuffled custom_providers[] and left Hermes pointing at whatever
    model.provider was set before.
    
    Seven existing Hermes presets now ship with a curated models list so
    switching lands on a working default without a detour through the
    Model panel.
  • feat: add Hermes UI components, presets, and config panels (Phase 8)
    - Add 7 provider presets (OpenRouter, Anthropic, OpenAI, Google, DeepSeek, Together, Nous)
    - Create HermesFormFields + useHermesFormState for provider form integration
    - Create Model/Agent/Env config panels with save/load functionality
    - Create HermesHealthBanner for config warnings
    - Add hermes icon (violet winged H) to icon system
    - Integrate into App.tsx: 3 new view types (hermesModel/hermesAgent/hermesEnv),
      sidebar buttons (Brain/Bot/KeyRound), health banner, session support
    - Integrate into ProviderForm: presets, form state, key validation, rendering
    - Integrate into AddProviderDialog: universal tab exclusion, providerKey, base_url extraction
    - Add i18n keys for all Hermes UI (zh/en/ja)