Commit Graph
199 Commits
Author SHA1 Message Date
funkpopo cc81627a8e fix(usage): sync session usage at the selected auto-refresh interval (#8301) 2026-10-14 17:00:14 +08:00
Jason 2635dfffce docs(release): add v4.0.11 release notes 2026-10-13 23:14:19 +08:00
Jason 90fb37ffb7 docs(release): add v4.0.10 release notes 2026-10-13 00:19:45 +08:00
Jason 4c263a85ec docs(manual): describe My Icons in the add-provider icon section
Section 2.1 still said the icon area lets you pick a preset icon and
customize its color. There has been no color control for a while (the
color comes from the built-in icon's metadata), and icons can now be
uploaded to My Icons. Point 2.1 at the full description in 2.3, and
drop "and color" from the icon row of the 2.3 field table.
2026-10-13 00:19:37 +08:00
Jason 68411d82fb feat(providers): keep uploaded icons in a named "My Icons" library
Uploading an icon used to attach the image to the one provider being
edited, shown as a lone "Custom icon" strip above the built-in grid. It
had no name, could not be searched and had to be uploaded again for
every provider that wanted it.

The icon picker now has two groups, filtered by the same search box:

- My Icons: the first tile uploads an image. After it is resized, a
  dialog asks for a name (the file name by default); "Save and Use"
  stores it in the library and selects it. Library icons show their
  names, can be picked by any provider in any app, and can be renamed or
  deleted from the buttons that appear on hover. Uploading an image that
  is already in the library reuses the existing entry. A current custom
  icon that is not in the library (for example one from an import link)
  shows as "Current icon" and can be saved, named after the provider.
- Built-in Icons, as before.

Clicking an icon now selects it and closes the picker, so the "Done"
button is gone; "Clear icon" next to the search box removes the icon.

The library lives in the settings table under `custom_icons`, which is
already cloud-synced. Providers still store the image itself, not a
library id, so renaming or deleting a library entry never changes a
provider that uses it, and a provider shows its icon on a device whose
library differs. Adding to the library decodes the PNG fully like
saving a provider does, caps the library at 100 icons and names at 64
characters. SQL import and cloud sync drop library entries whose image
is invalid, alongside the existing provider and universal provider
cleanup; unknown fields on the remaining entries are kept.

The naming dialog stops its submit event from propagating: React events
bubble through portals, so without it saving a name would also submit
the provider form the picker is rendered in.

The user manual's icon section (2.3, zh/en/ja) describes the new flow.
2026-10-13 00:07:38 +08:00
Jason 0962337b5d docs(deeplink): add English and Japanese site owner guides
Translate the site owner integration guide into English and Japanese,
quoting UI labels from the app's own locale files and using each
language's Sub2API template fallback message. The three versions link to
each other. Manual 5.3 (en/ja) and the English, German and Japanese
READMEs now point to the guide in their own language.
2026-10-12 23:26:43 +08:00
Jason 3d5f847185 docs(deeplink): note that New API and Sub2API ship an import button
Site owners running New API or Sub2API already have an "Import to CC
Switch" button in the key list. Say so up front, and point out that New
API's link carries no usage script, so users see no balance after import.
2026-10-12 23:26:43 +08:00
Jason 502d681b73 docs: point the deep link generator to ccswitch.io and link the site owner guide
The manual linked the generator at farion1231.github.io, but GitHub Pages
was never enabled for the repository, so the link returned 404. The page
is now hosted on the website at ccswitch.io/deplink.html; the manual
(zh/en/ja), the four READMEs and the site owner guide point there.

The generator inlines its favicon and logo so the same file works both in
the repository and on the website. Manual 5.3 gains a pointer to the site
owner guide, and its usage steps list the Skill repository type.
2026-10-12 23:26:43 +08:00
Jason ea1ab8091f docs(deeplink): show site owners how to wire the import button
The guide explained how to build a link but not how to put it on a page.
Add a section on fetching the link from the backend when the button is
clicked (so the key never sits in the page source), the button markup,
and what to show when CC Switch is not installed. Add a fast path at the
top and fold the sections most sites can skip.

The link generator folds the Base64 tool and the MCP, prompt and Skill
examples, opens them when reached from the sidebar or an anchor, and
gains an FAQ entry pointing to the new section.
2026-10-12 23:26:43 +08:00
Jason fb719d99d3 docs(usage): document the Sub2API template and add it to the link generator
The user manual (zh/en/ja) gains a Sub2API template section, and the link
generator and the site owner guide gain a Sub2API example. All of them use
the same script as the in-app template.
2026-10-12 23:26:43 +08:00
Jason 7577ca9572 docs(deeplink): rework the link generator and document iconUrl
deplink.html becomes a generator for site owners instead of a test page:
a sidebar layout with light and dark themes, tabs for provider, MCP,
prompt and Skill links, per-app `apiFormat` choices, usage script
templates, and examples that follow the v4.0.10 rules (Pi providers,
the activation toggle, `apiFormat`).

iconUrl:
- The generator gets an `iconUrl` field and checks it with the same
  shape rules as the app (https, a domain, default port, no
  credentials), so a link is never generated with an address CC Switch
  would drop. Built-in `icon` names are checked against the same
  whitelist as the parser.
- The parser marks `icon` and `iconUrl` values that would be dropped.
- New example and FAQ entry for a site's own icon.
- The integration guide adds `iconUrl` to the Node.js sample and a
  debugging step pointing at the log line. The zh and ja manuals list
  `iconUrl` and say what `icon` accepts.
2026-10-12 23:26:43 +08:00
Jason 6af00ecb0c docs(deeplink): add a Chinese integration guide for site owners 2026-10-12 23:26:43 +08:00
Jason 16e7ff1c9d feat(deeplink): let links declare the API format, import Pi providers, and leave activation to the user
- Add a single `apiFormat` parameter (anthropic / openai_chat /
  openai_responses / gemini_native) that maps to each app's own field:
  meta.apiFormat for Claude Code, Codex and Grok Build (non-native formats
  need local routing), `npm` for OpenCode, `api` for OpenClaw and Pi,
  `api_mode` for Hermes. Unsupported combinations are rejected while
  parsing; links without it keep the previous defaults byte for byte.
- Support Pi provider links. They write a models.json node and must carry
  a model.
- The confirmation dialog now has a switch for "switch after import"
  (providers), "add to the app config" (additive apps, on by default) and
  "enable after import" (prompts). The link's `enabled` only sets its
  initial state.
- Turning the switch off really only saves the row: a new
  `ProviderService::add_without_switching` skips the first-provider path
  in `add` that would otherwise write the client config. The deep-link
  golden rows now have is_current false accordingly.
- Reject link values that additive apps would expand: Pi keys starting
  with `!` and `$NAME` / `${NAME}`, OpenCode `{env:}` / `{file:}`, and
  `${...}` for OpenClaw and Hermes. These would run a command or send
  local secrets and files to the link's endpoint. Checked when parsing,
  when merging `config`, and when building the provider.
- Update the deep-link manual in zh/en/ja.
2026-10-12 23:26:43 +08:00
Jason db93ac2083 fix(grokbuild): point session_summary at the active provider and keep a link's model profile
Session titles: when `models.session_summary` is unset, Grok Build
(verified on 1.0.50) generates titles with the built-in `grok-4.6`
model but sends the request to the default model table's endpoint, so
third-party upstreams reject it and title generation fails. Switching
never wrote this key, so fixing the row templates alone would not
reach live. The Grok switch patch now makes session_summary follow the
provider when it is unset or names a table CC Switch wrote (the
target, the write record, or a table retired in this switch): it points
at the target table, or is removed when switching to the official
account. A user's own choice (a built-in model or their own table) is
left alone.

Deep links: a Grok Build link carrying a config.toml no longer gets
rebuilt into a fixed template that dropped the profile's display name,
description, API backend and context window. The table named by
`[models] default` is kept through an allowlist of Grok 1.0.50 profile
fields; the endpoint, key and model come from the link parameters.
Links whose table uses auth_provider, env_http_headers or
mtls_cert_dir are rejected, and env_key is still dropped. Only one
model table is imported, since a provider owns one table in live.
Links without a config keep the old template byte for byte.

Fixes #7003
Refs #6457
2026-10-12 23:26:43 +08:00
Jason 11e1326bf5 fix(deeplink): keep a Codex link's provider config instead of rebuilding a fixed template
A Codex provider link could carry a full config.toml, but import only
pulled the key, endpoint and model out of it and rebuilt a fixed
template, silently dropping the provider's auth mode, headers, websocket
support and model catalog URL.

When a link carries a config, keep the parts that belong to the
provider, using the same field lists the live projection writes on
switch:

- from the selected [model_providers.*] table: connection and auth
  fields (wire_api, requires_openai_auth, http_headers, query_params,
  supports_websockets, retries/timeouts, capabilities, ...); the route
  is always renamed to `custom`
- model_catalog_url only on the same origin as the endpoint, since
  Codex sends the provider's credentials when fetching it
- top-level key and provider-exclusive fields (model, reasoning effort,
  web_search, context window, subagent model)

Global settings ([features], [tools], MCP, approval_policy, notify,
local file paths) are not imported. Links whose provider table makes
Codex run a command or read local credentials (auth, aws,
gateway_oauth, env_http_headers) are rejected; env_key is dropped in
favor of the link's own key, and an env_key-only link is rejected.
URL params still take priority, and a table's bearer token is reset to
the final key.

Links without a config keep the old template byte for byte; a new
golden snapshot locks the shape of config-carrying imports. The confirm
dialog notes that only provider settings are imported, and the manual
documents the rules (and that configUrl is rejected).

Refs #7438, #7942, #5510
2026-10-12 23:26:43 +08:00
Jason 450bc039f0 feat(deeplink): enable imported usage scripts by default
A provider link that carries a usage script now enables usage query
unless it says `usageEnabled=false`. Site owners attach the script so
users see their balance; making them switch it on again after import
was an extra step with little safety benefit: the script runs in the
QuickJS sandbox, sends a single request, and deep-link scripts have no
template type, so that request must be same-origin HTTPS with the base
URL.

Links without a script still import usage fields disabled. The
confirmation badge follows the same rule as the backend, and the
script body is still shown in full before the user imports.
2026-10-12 23:26:43 +08:00
Jason 04bd15c9f8 fix(i18n): use 詳細オプション for the advanced options toggle in Japanese
高級オプション reads as "luxury options" in Japanese. Rename the toggle and the docs that quote it (README_JA, the Japanese routing guides and the user manual FAQ).
2026-10-12 00:20:53 +08:00
Jason 8845b1ef79 docs(release): add v4.0.9 release notes 2026-10-11 23:29:48 +08:00
Allen Xu f88068b9e5 fix(proxy): let clients reach local routing through a separate connection address (#7878)
The proxy URL written into client configs (including Claude Desktop's gateway URL) was always derived from the listen address, with 0.0.0.0 written as 127.0.0.1, so clients outside the host's loopback, such as Claude Desktop sessions in WSL2 NAT mode, got an unreachable address.

Add an optional per-device "connection address" in Settings > Routing, stored in ~/.cc-switch/settings.json so cloud sync never carries it to another machine. When set it replaces the host in every proxy URL written to clients; saving rewrites routed clients without restarting the service and is safe to retry.

Fixes #7877
2026-10-11 17:58:46 +08:00
Jason df40d53c36 docs(release): add v4.0.8 release notes 2026-10-10 23:32:26 +08:00
Jason 3784fd9e4d fix(ui): soften dark-mode text colors to reduce glare
The three dark-mode text tiers all sat close to white (15.5 / 11.1 / 8.4
contrast on the app background), so screens full of table data and labels
looked harsh and the hierarchy flattened.

- --text-1 #f4f4f5 -> #e4e4e7, and the shadcn --foreground family follows
  so inherited body text matches
- --text-2 #d0d0d8 -> #ababb3, --text-3 #b5b5bd -> #9a9aa2
- --muted-foreground aligned with --text-2

Contrast is now about 13.4 / 7.5 / 6.1; the secondary and tertiary tiers
stay at or above 4.5:1 on card and selected backgrounds. Light mode is
unchanged.
2026-10-10 23:23:54 +08:00
Jason 1f786dadd0 docs(release): expand the Codex session compression section in v4.0.7 notes
Explain how the switch maps to config.toml, when Codex actually compresses
sessions, how resuming and CC Switch's session list and usage handle
compressed rollouts, and what to watch out for (Codex version, startup
notice, turning it off, other tools that read .jsonl). Move it to the top
of the new features.
2026-10-10 18:44:33 +08:00
Jason 790ed8009d docs(release): add v4.0.7 release notes 2026-10-10 16:53:17 +08:00
Jason 347c60c3f7 docs(aggregation): add Codex troubleshooting for sub-agent tasks and the official quota lock
- Explain why Codex sub-agents on another provider cannot read encrypted tasks
  and how the classic sub-agent tools setting avoids it
- Explain that Codex locks the picker to Luna Reserve once the official 5-hour
  quota runs out, and describe the workaround of temporarily making a
  third-party provider the default (#7945, #7962, #7974)
- Update the Chinese guide and the Chinese, English, and Japanese manuals
2026-10-10 10:49:23 +08:00
Jason c261126630 docs(release): add v4.0.6 release notes 2026-10-09 22:15:03 +08:00
Jason 449c7e78af docs: add aggregation mode guide and update user manuals
- Add the Chinese aggregation guide with the final cover, client screenshots, and request-routing diagram
- Update Chinese, English, and Japanese manuals to distinguish model fetching, models.dev metadata completion, and manual entry
- Clarify official subscription support, default models, and client restart requirements; add README links
- Validate 90 local documentation links, five images, and Git diff formatting
2026-10-09 16:51:08 +08:00
Railgun f025ee053d docs(faq): update window controls setting path for v4 in zh/en/ja manuals (#7983) 2026-10-09 16:44:28 +08:00
Jason 2db86e94da docs(release): add v4.0.5 release notes 2026-10-08 23:00:52 +08:00
Railgun 36c8b87e60 fix(linux): restore Wayland title-bar controls on first show and tray re-show (#7947)
Tao 0.34 wraps the Wayland HeaderBar in an EventBox with above_child=true, so its input window can stack above the minimize/maximize/close buttons after the first map or a hide/show round-trip. Clear above_child on the GTK main thread whenever the main window is shown. This becomes a no-op once Tauri ships tao 0.36+ (tauri-apps/tao#1218).

Also bump the existing input-region nudge by one logical pixel instead of one physical pixel (a no-op on HiDPI), skip it for maximized windows, and run concurrent nudges one at a time so a bumped size is always restored.

Fixes #7405
Fixes #2736
Fixes #7499
2026-10-08 21:52:49 +08:00
Jason efd236a474 docs(manual): update the user manual for v4.0
Bring the zh, en and ja user manuals up to the v4.0.4 interface: the
sidebar layout, the six Settings groups, the Direct / Routing /
Aggregation connection modes, Accounts, and the Apps page. Old
Settings paths (Advanced, Routing, Auth) and takeover wording are gone.

- Add 4.6 Aggregation Mode in all three languages and list it in the
  manual indexes.
- Rewrite 1.3 Interface Overview and 1.5 Settings around the new
  layout; refresh provider, extension, routing, usage and FAQ pages.
- Use the v4.0 release screenshots where they fit and leave
  TODO(v4 screenshot) markers elsewhere.
- Update the version section of each manual index to v4.0.4.
- Remove the 40 v3 screenshots that are no longer referenced.
2026-10-07 20:42:08 +08:00
Jason 01ee685da8 docs(release): lead with usage stats in the v4.0.4 notes 2026-10-07 19:09:33 +08:00
Jason a29a4f3868 docs(release): add v4.0.4 release notes 2026-10-07 18:34:16 +08:00
Jason 8596a233b2 docs(release): add v4.0.3 release notes 2026-10-06 21:20:09 +08:00
Jason f3e3a95560 docs(manual): add the auto mode server-check toggle to the Claude quick toggles table
The toggle shipped without a manual row. Describe what it changes, the
per-session notice it avoids on gateways, the new-provider default and
that official endpoints should leave it unchecked; the per-provider note
now covers three options instead of two.
2026-10-06 21:13:04 +08:00
Jason 997a34fe3a refactor(claude): drop the max effort quick toggle
CLAUDE_CODE_EFFORT_LEVEL=max pins every session to the most expensive
effort and turns /effort into a no-op ("Not applied: ... overrides
effort this session"), while Claude Code deliberately keeps max
session-only (effortLevel in settings.json does not accept it). Users
who want max can still pick it per session with /effort max, or set the
variable by hand.

Remove the checkbox, its i18n keys, tests and the manual rows. Configs
that already carry the variable keep it untouched.
2026-10-06 21:13:04 +08:00
Jason cac218f3e2 refactor(claude): drop the Teammates quick toggle
Claude Code now gives every session a single implicit team: named
subagents, SendMessage and ListAgents are available without
CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS (on 2.1.287 the tool list is
identical with and without it). The variable only gates tmux/iTerm2
split-pane teammates and the structured shutdown/plan-approval
messages, which no longer justifies a slot among the quick toggles.

Remove the checkbox, its i18n keys and the manual rows. Configs that
already carry the variable keep it untouched.
2026-10-06 21:13:04 +08:00
Jason bf2fe0d0be docs(release): add v4.0.2 release notes 2026-10-06 00:07:54 +08:00
Owlbay 92fa72c76f fix(mcp): run the time preset with uvx mcp-server-time (#7863)
The time preset ran npx -y @modelcontextprotocol/server-time, but that
package does not exist on npm (404), so the server exited on start and
clients reported the connection as closed. The official time server is
published to PyPI as mcp-server-time; run it with uvx like the fetch
preset, and update the preset name, the name placeholder and the user
manual tables.
2026-10-05 16:04:25 +08:00
Jason 4804b723d4 docs(release): add v4.0.1 release notes 2026-10-05 12:51:16 +08:00
Jason a189980f35 docs(release): shrink and center v4.0 release note screenshots
Render the screenshots at 720px (560px for the cropped Codex model
picker) and center them, matching the published release body.
2026-10-04 20:12:48 +08:00
Jason 412579f9ad chore(release): v4.0.0 2026-10-04 17:06:16 +08:00
Jason 6d6bbe6747 docs(release): add v4.0 release notes in Chinese, English and Japanese
Add the v4.0 release notes and the screenshots they reference
(main page, Apps page, Aggregation, Codex model picker, session reader
and usage, in Chinese and English) under assets/release-notes/v4.0.0.
2026-10-04 16:25:20 +08:00
Jason 6fd176ba12 fix(usage): deepen the top heatmap level in light mode
The heatmap mixed --chart-1 (#0891b2) at 30/50/75/100%, so the darkest
cell was a mid-tone and the whole map read pale (3.68:1 against the card).
Mixing a darker cyan at every level fixed the top but washed out the low
levels.

Move the ramp into --heat-1..4 tokens defined per theme. Light keeps the
lower levels on chart-1 (32%, 62%, solid) and switches only the top level
to #0e7490, same hue one step darker (5.36:1). Dark keeps its previous
ramp, since brighter already means more there. Charts and quota meters
still use --chart-1.
2026-10-03 23:29:01 +08:00
Jason a43d3b2f9d fix(theme): align the light accent with Tailwind orange-500
The light --action-bg was #f97315, one unit off the #f97316 the old
add-provider button used via bg-orange-500. Use #f97316 so the accent
matches the pre-redesign orange exactly, recompute the light --ring HSL
from it, and update the design-system doc to the same value.
2026-10-03 23:29:01 +08:00
Jason c19c117009 feat(ui): set the aggregation default from the card's more menu
After the "start aggregation with this as default" button went away, the
aggregation preview showed the default-after-switch but had no control to
change it; the default could only be picked in the confirm dialog. Once
in aggregation mode it was an icon-only star next to remove.

Move "set as default" to the top of each card's more menu on the
aggregation tab, in both states, and leave add / remove as the only row
actions:

- In aggregation mode it takes effect at once, also for providers not
  added yet (the backend adds the new default to the list).
- In direct mode it only records the choice through set_proxy_route; the
  card moves to the default section and the confirm dialog preselects it.
- While routing it is listed but disabled with the reason: the default
  and the route target are one pointer, so changing it would switch the
  live route from a preview.

On Codex, when the default is an official account and the target is a
third-party provider, the item says the official subscription's models
won't be part of the aggregation. That was previously a silent side
effect of changing the default.

Mode-specific menu items come from the presentation builder
(CardPresentation.menuItems), like the row buttons.
2026-10-03 23:29:00 +08:00
Jason 29513d9a54 refactor(ui): enter routing and aggregation only from the notice
While previewing the route or aggregation tab, every card carried a
"start routing here" / "start aggregation with this as default" button.
Both were shortcuts for the notice's button plus a provider choice, and
the aggregation one sat next to add / remove, which only edit the list.
On Codex it also had a hidden cost: an official account can only be the
default, never a member, so starting from any third-party card silently
dropped the official subscription out of the aggregation.

Remove both card buttons. The notice is the single entry, and the
confirm dialog now has the provider select for aggregation as well as
routing, preselecting the last route and falling back to the direct
provider. When an official account is eligible and another provider is
picked as the aggregation default, the dialog says its models won't be
part of the aggregation. The "also adds" note follows the picked default
instead of the last route.

Preview rows keep only list edits: none on the route tab, add / remove
on the aggregation tab. An official subscription that can't be routed
has no button left to hang the reason on, so it moves to the chip's
tooltip.
2026-10-03 23:29:00 +08:00
Jason 21cbc3a8b4 refactor(i18n): rename the Stack mode to 聚合 in Chinese
From the client's side the Stack mode does what an aggregator provider
does: one endpoint, models from several providers, each request routed
by the model it names. Calling it 聚合 lets users reuse a concept they
already know instead of learning what 叠加 stacks onto.

Labels and tabs read 聚合, sentences 聚合模式 / 聚合的模型, and verb uses
become 加入聚合. zh-TW follows; en/ja keep "Stack". Code identifiers,
storage keys and logs are unchanged. Unrelated uses of 叠加 (the
Volcengine discount copy, two code comments, a CSS comment) are kept.
2026-10-03 23:29:00 +08:00
千羽and千羽 57b1eff1d4 feat(ui): v8 — theme color, unified controls, motion, virtual lists (#7816)
Unify the visual and interaction rules on top of the v7 redesign.

- Theme color #F97315 for --action-* and --ring; dark mode uses #EA580C
  with white text, toned-down mode colors and translucent soft fills
- Buttons mapped to three sizes (28 / 32 / 36); inputs, selects and
  search fields share fieldClass; self-drawn checkbox and radio
- HoverTip replaces title on about 100 icon buttons; it stays closed
  when a closing menu returns focus to its trigger
- Install tailwindcss-animate so menu, popover, dialog and tooltip
  enter/exit animations take effect; sliding segment thumb and tab
  underline
- Remove the command palette and the header prompt entry; provider card
  primary actions become icon buttons
- Virtualize the session list and the Skills discovery list; optimistic
  toggles for MCP and Skills with a 300ms delayed disabled state
- Toasts drawn unstyled with status-colored icons and de-duplicated
- Windows: hide the system title bar and use in-app window controls;
  macOS: brand row under the traffic lights
- Focus rings only for keyboard users
- Skills discovery and the prompt list show the last result from a
  local cache and refresh in the background
- Drop the trailing ellipsis from 36 dialog-opening labels
- Provider list fills the main area

Co-authored-by: 千羽 <qyinter@users.noreply.github.com>
2026-10-03 23:28:59 +08:00
Jason b999b07bec feat(ui): rebuild the global pages and finish the v7 visual pass
Pages (phase 4):
- Usage: v7 layout (filter row, four metrics with more on demand,
  switchable trend, request log / provider / model / pricing tabs, data
  sources sheet). Latency becomes output speed: output / (duration -
  first token), shown only for requests with at least 100 output tokens;
  provider totals sum output and generation time instead of averaging.
- Sessions: single-column list grouped by project or time, drilling into
  a reader with resume, find, question jump and copy actions.
- MCP and Skills share one app matrix (neutral checks, retry on failed
  writes, column bulk actions with undo); MCP add/edit moves into a
  drawer with form/JSON modes; Skills merges installed and discover and
  always shows a Pi column.
- Prompts: one page for eight apps including Hermes SOUL.md, enable and
  disable as buttons, delete with undo instead of a confirm, copy to
  other apps, import existing files; app pages show the active prompt.
- Add provider is two steps: pick a preset (always-on search including
  Chinese names and domains, categories inferred for display, sorted by
  name with no promoted entries), then fill the form. Edit pages name
  the provider and warn when it is the one in use.
- App page menu links to that app's usage.

Visual pass (phase 6):
- Secondary pages cover only the content area so the sidebar stays.
- Cmd/Ctrl+K jumps to apps, pages and settings sections.
- Legacy button variants, primary color, dialogs, toasts and sheets
  follow v7 tokens; hard-coded palette classes and 10px text across
  the remaining components are replaced with tokens.
2026-10-03 23:28:58 +08:00
M3chD09 793e67d9b3 feat(provider): add Command Code presets and quota support (#7358)
- add Command Code presets for Claude Code and Codex
- map the Claude and Codex provider endpoints and model catalogs
- detect both base URLs and query credits, rolling limits, and subscription periods
- document the preset and usage coverage in English, Chinese, and Japanese
- add preset routing and quota parsing tests
2026-10-03 19:52:23 +08:00