- Removed sponsor-related styles and logic from ProviderTile component.
- Introduced SponsorCard component to handle multiple site entries for sponsors.
- Updated styles for SponsorCard to include unique animations and visual effects.
- Modified the OAuth provider data structure to support multiple sites under a single sponsor.
- Enhanced internationalization support for new sponsor-related strings in multiple languages.
- Added tests to ensure proper rendering and functionality of the new SponsorCard component.
* feat(quota): display read-only Claude extra usage and dollar balances
* fix(quota): keep Claude usage checks frontend-only
* fix(quota): preserve Claude balance recovery and isolate test i18n
The generic plugin quota card posted to /quota/fetch, which v8 backends
no longer serve, so every plugin quota failed with 404. Resolve the
quota plugin from GET /plugins (shared per connection) and call
POST /plugins/:id/quota instead. Declarative quota_probe credentials
have no v8 route yet and now show an explicit unsupported message.
Refs #491
Credentials for providers with a built-in quota card (e.g. Codex) were
routed to the generic plugin quota card whenever a plugin advertised
quota support for the same provider, which then failed with 404 on v8
backends. Built-in cards now take precedence; the plugin card is only
used for providers without one.
Refs #491
- Deleted the SectionQuota component and its associated tests, fields, and constants.
- Moved the quotaAntigravityCredits field to the SectionAdvanced component.
- Updated related constants and translations to reflect the removal of the quota section.
- Adjusted tests to ensure consistency with the new configuration structure.
- Ensured that deprecated quota switches are no longer present in the visual config and YAML parsing logic.
- Replace the full-width card list with a compact tile grid; tiles show live
login status (waiting / added / failed) while the dialog is closed
- Clicking a tile starts the login and opens a step-based dialog: auth link
with highlighted host and inline copy feedback, device code, optional
manual callback with inline validation, and a live status bar
- Keep success visible until the dialog closes; skip duplicate toasts while
the provider's dialog already shows the result
- Move Vertex JSON import into the same tile + dialog pattern with drag-and-drop
- Move the page into src/features/oauth and extract the flow state machine
into useOAuthFlows without changing attempt/cancellation semantics
- Fix xAI callback parsing treating "code: xyz" as an absolute URL
- Add the new keys to all six locales, fill missing zh-TW keys, and drop
keys orphaned by the redesign
In a block row an empty list showed its lone Add button at the far
right, away from the label above it. Add actions in string lists,
payload rules and plugin store auth now sit at the start, where the new
item will appear, matching the ICE server editor.
Each key was a ~150px card with the index pill on its own line and a
solid red delete button. Keys are now single rows (mono index, name,
masked key, actions) under a header that matches the setting rows, with
the add button on the right. Row actions use the secondary text color in
both themes, and delete only shows the danger color on hover or focus.
On mobile the actions wrap below the name.
The item-row and pill overrides in the fields root, and the block
header row class, had no remaining users and are removed.
Toggles were 74px bordered cards while inputs stacked label, field and
hint, and both shared one auto-fit grid, so rows had uneven heights and
up to four nested borders. Every setting is now a row with the title,
hint and error on the left and the control on the right. Only the
control differs: ToggleSetting, TextSetting (sm/md/lg widths, optional
adornment), SelectSetting, and BlockSetting for list editors.
Rows sit in a SettingList, a rounded container with hairline dividers.
A list two columns wide or wider (container query at 880px) pairs its rows; at
520px or less, inputs stack under their labels while switches stay on the right.
A row that would be left alone in its row spans the full width
automatically, so `wide` only marks long URLs and master switches and
must be passed at the call site. The sponsor alignment spacer is gone
because the sponsor link now fills the proxy URL hint slot.
Groups, field order and search anchors are unchanged. New tests cover
row accessibility wiring and render every section to assert that no
list leaves a half-empty row.
Accept an id and aria-describedby so a separate <label htmlFor> can name
the switch and a hint can describe it. The hidden checkbox now draws a
focus-visible ring on the track, disabled switches are dimmed, and the
transitions use the shared motion tokens with a reduced-motion fallback.
A failed status request (a proxy 502, a network drop or a timeout) stops
polling and marks the card failed, but keeps the callback field. If the
user then submits the callback URL, the backend accepts it, since the
login is still pending, and saves the credential. Nothing polls again,
so the card keeps showing the old error.
The backend accepts callbacks only for pending logins, so resume polling
after an accepted callback when it is not already running. Attempts
track whether their poll loop is active.
Signed-off-by: bob <cx742296960@gmail.com>
- Introduced a new test suite for the Vietnamese locale to ensure all English keys are covered with matching interpolation tokens.
- Updated the ApiKeyStrengthMeter and configUiState tests to utilize the LANGUAGE_ORDER constant for locale management.
- Enhanced test descriptions for clarity regarding supported locales.
Backend config_v8.go relocated shared provider behavior out of
oauth.providers.* to upstream.* (v8SharedPaths): Codex cloaking,
model-level cooling, stream bootstrap, orphan delegation and response
steering; Claude model-level cooling, cloak mode, cloaking model list
and header-defaults; and xAI inject-x-search. Read and write the
canonical paths so the panel reflects the values the runtime actually
applies; the backend still accepts and migrates legacy spellings.
OAuth-only fields (Codex live-media-relay and header-defaults,
Antigravity, aistudio, devin) keep their oauth.providers.* paths.
The backend migrated oauth.providers.codex.optimize-multi-agent-v2 to
client.codex.optimize-multi-agent-v2 (v8ClientPaths in config_v8.go).
The visual editor still read the historical path, so toggling
"Optimize multi-agent v2" saved but reverted to off after refresh —
and when client.codex already held false, writes to the stale alias
could never enable the feature.
Point the addition field and its search yamlKeys at the canonical
client.codex path; the backend normalizes any remaining legacy keys on
save.
Fixesrouter-for-me/Cli-Proxy-API-Management-Center#472
Add a complete Vietnamese translation for the Management Center UI:
- src/i18n/locales/vi.json: full translation of all 1540 keys from
en.json, with all interpolation placeholders preserved
- src/i18n/index.ts: register the vi resource bundle
- src/types/common.ts: extend the Language type with 'vi'
- src/utils/constants.ts: add 'vi' to LANGUAGE_ORDER and
LANGUAGE_LABEL_KEYS
- src/utils/language.ts: auto-detect vi-* browser languages
- locales/{en,zh-CN,zh-TW,ru}.json: add the Tiếng Việt label so the
new language appears in every language switcher
Tested by building with vite and deploying the bundle against a live
CLIProxyAPI v7.2.133 server; vi-* browsers resolve to the Vietnamese
UI and all strings render with correct placeholders.
Co-authored-by: nguyenha935 <nguyenha935@users.noreply.github.com>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
- Implemented ClaudeResetGrants component to manage reset grants for Claude usage.
- Integrated reset grant operations with session management and eligibility checks.
- Added API service for reading and claiming reset grants from the Anthropic API.
- Enhanced UI with localized messages for reset grant actions.
- Created tests for grant parsing, claiming, and session handling to ensure reliability.