Conversation
chore: sync main to dev after v0.4.25
…model ID" hints Three sources of the same complaint — the console showing an "alias" identical to the name already on screen. OverflowTooltip gated on `scrollWidth > clientWidth`. Both are rounded to integers, so a 188.4px label in a 188px box reports a 1px overflow while rendering in full with no ellipsis, and the tooltip opened repeating the visible text. Add a 1px tolerance, matching what scrollMetrics.ts already does for the same rounding. ModelTag set a native `title` equal to the model id, stacking a browser tooltip on top of the managed one with the same content. Only set it when a caller passes one; truncating call sites already wrap the tag in OverflowTooltip. The request log raised a "real model ID" hint whenever the upstream name differed as a string. An account alias only adds a routing segment — `ollama/…:0731` for upstream `…:0731` — so every row of an aliased provider carried the hint. Compare model identity instead. The backend now avoids recording those names, but logs are kept for months, so the UI normalizes historical rows too. Provider model chips move to OverflowTooltip on the same principle: when the chip fits, its tooltip only repeated the mapping already visible. Model plaza source summaries are deliberately unchanged: that line is catalog information about which id a source serves, not a per-row runtime hint. Extracting the model cell into RequestLogModelCell also brings requestLogsShared.tsx down from 1020 to 989 lines; baseline updated to lock it in. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
fix(ui): stop repeating model names as tooltips and alias-only "real model ID" hints
… block Two things the console was missing. Curl examples rendered as flat, unstyled text. The repo already had a tiny hand-written shell tokenizer on the landing page, written precisely to avoid dragging react-syntax-highlighter's 790KB vendor chunk in for a single block. It moves to @code-proxy/ui as CodeBlock so the landing page, the image page and the new video page all read the same. The new Video Models page mirrors the image one: how-to-call docs with a text-to-video / image-to-video switch, request and response tables, and a test panel. The docs show both halves of the call — submit and poll — because the polling step is the one callers miss, and generation is asynchronous upstream. The test panel is synchronous to watch: the server task absorbs the polling, so the panel waits and then plays the clip. Image-page tests move from getByText on the snippet to assertions on the block's textContent: highlighting splits the text across token spans, which is also why CodeBlock carries a data-code-block hook. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The unit tests run in jsdom, which has no layout and no CSS, so neither the highlighted snippet nor the model catalog wiring was actually exercised. A browser spec caught the latter: the catch-all management mock shadowed the models route (Playwright matches the most recently registered route first), leaving the test panel permanently disabled — the same shape of failure a real deployment would show if the endpoint 404'd. Not tagged @critical, so it stays out of the per-PR smoke. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
feat(video): add the video models page and share the highlighted code block
…nu its icon The page offered a live "generate" button regardless of whether the tenant had an xAI account, so the only feedback was the router's "auth_not_found: no auth available" — true, but not actionable. The models endpoint now reports per-tenant availability, and the page disables the action and names what is missing. Availability absent from the response (older server) does not disable anything. The sidebar entry fell back to the generic circle because the icon map had no "video" key; the seed menu has always asked for one. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
fix(video): grey out generation without a credential, and give the menu its icon
…sage Command Code joins the channels that show plan windows on their cards, but it is the first one that needs nothing from the operator beyond the API key: its credits endpoint authenticates with the same key that serves inference, so the card fills in without a dashboard cookie to paste and without one to expire. The key editor says so instead of showing a cookie field that would do nothing. Adding it also removed the reason it was hard to add. The four usage-reporting channels each carried their own near-identical copy of the same card tree, and the page they lived in was frozen at its size baseline. They now share ProviderUsageTabContent, and the usage/model-access maps moved into provider-usage-config, which took ProvidersPageContent from 1845 to 1651 lines — a channel now costs a call site rather than another 65-line copy. The one baseline that moved is modelAvailability, by two lines: the channel list there is a registry of every provider, so registering a new one is what those lines are. features/ cannot import from pages/, and every way of deriving the set instead of listing it came out longer once formatted. Model definitions come from the relay, which fetches Command Code's public catalog — no credential required — so the channel's model list stays current without a frontend release. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
feat(providers): add the Command Code channel with cookie-free plan usage
The Antigravity card split one upstream quota bucket into four rows by matching model ids against a hand-written list, then labelled those rows with four hard-coded strings from the translation catalogue. The result was three Gemini rows showing an identical percentage and an identical reset time, because upstream they are one bucket — and any model missing from the list was dropped rather than shown as unknown. Read retrieveUserQuotaSummary first, which reports the weekly and 5h buckets per family and names them itself, and fall back to fetchAvailableModels. Classify models for that fallback by the shape of their id, keeping unclassified ones under their own display name. Drop the four hard-coded family names from the locales; a mapping for keys written by the previous grouping stays behind so cached rows still render while they age out. The direct fetch path now resolves the account's own project through loadCodeAssist instead of assuming the shared fallback id, retries once without the project field on a 403, announces a client version the upstream still serves in full, and tries the sandbox host first. The card keeps showing the 5h window only; the weekly buckets reach the detail panel, which already splits its trend by window width. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
fix(antigravity): render the upstream's own quota buckets
Channels that report plan usage — opencode-go, cline, ollama-cloud and commandcode — can hold many credentials, and the one an operator wants is whichever still has headroom. Finding it meant reading every card. Adds a sort control to those tabs: configured order (default), least quota left first, or most quota left first. A credential's position is decided by its tightest window, not its average or its widest. A key with a comfortable monthly allowance but a spent 5-hour window is unusable right now, and sorting it as though it were plentiful would defeat the point of the feature. Credentials with no reading sort last in both directions. Usage is fetched per credential on demand, so "unknown" is common; treating it as either full or empty would push the credentials worth looking at off the first screen. The list is reordered by passing positions, not by reordering the array. The index the card list hands to onEdit, onDelete and renderExtra identifies the credential in the saved config and keys its usage cache, so a genuinely reordered array would edit one credential while showing another's quota. A malformed order degrades to configured order rather than dropping or duplicating cards. The preference is module-scoped and persisted, following the active-tab pattern: the four usage tabs cannot disagree about the order, and it survives a reload. It is deliberately not lifted into ProvidersPageContent, which is already over its size budget and would have grown further. No backend change: plan usage is fetched client-side per credential and cached there, so ordering is a view concern with no server-side input. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
feat(providers): sort credentials by remaining quota
The bundle gate fails on every PR opened against dev right now, and the failing branch is not the cause. `AuthFilesPage` is recorded at 58.90 kB gzip while dev actually builds it at 64.36 kB — 5.46 kB past the 5 kB delta tolerance. Verified by building dev with no local changes at all: the gate reports the same +5.46 kB and the same FAIL, so any branch inherits it. The drift is in the record, not in the budget: at 64.36 kB the chunk is still well under the 80 kB page budget, with roughly 15 kB of headroom. Nothing here relaxes the budget or the tolerance; the recorded number is simply brought up to what dev produces, so the tolerance starts measuring new growth again instead of re-reporting growth that already landed. Chunk governance for this page is still worth doing — it is the largest page chunk — but that is a separate change from unblocking the gate. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
chore(bundle): align the AuthFilesPage baseline with dev
The AI accounts list could only be ordered by name. With many accounts, finding one that still has headroom meant reading every card. Adds a sort control to the toolbar: by name (default), least quota left first, most quota left first. An account's position is decided by the tightest quota its card actually shows. Scoping it to the visible slots matters: antigravity reports both a 5h and a weekly bucket but the card renders only the 5h one, and ranking by a number the operator cannot see reads as a broken sort. Sorting pulls the full status snapshot once. The list loads status only for the accounts on the current page — correct for rendering, useless for ordering, since sorting a page by numbers only that page has just shuffles it. The endpoint already returns every account when no auth_index filter is given, so no backend change was needed. The order is applied before the slice into pages. Accounts with no reading sort last in both directions and keep name order among themselves. Unknown is not empty and not full; floating it to the top of either direction would bury what the operator opened the view to find. A failed snapshot leaves everything unranked, which preserves name order rather than presenting a partial order as authoritative. The preference and the fetch state are module-scoped and the preference is persisted. AuthFilesPage.tsx and AuthFilesFilesTab.tsx are both frozen at their size baselines, so threading this through as props was not available; the list and the toolbar control read the shared value independently. Neither file is touched by this change. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Matches the column-count control it sits beside — same affordance for the same kind of choice, and no second popover implementation on a toolbar that already has one. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
feat(ai-accounts): sort accounts by remaining quota
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Promotes the verified
devbranch tomainfor v0.4.26. Pairs with CliRelay v0.4.26.Key changes
AuthFilesPagewas recorded at 58.90 kB while dev built it at 64.36 kB, failing the gate on every PR regardless of its content. The budget and tolerance are unchanged; only the stale record moved.Compatibility and upgrade notes
plan_type; against an older backend the panel falls back to the previous grouping through its compatibility mapping, so nothing breaks.localStorageper browser; no server-side state.Verification
devPRs passedquality-build-e2e/test-build/vitest(2 shards).AuthFilesPagesits at 64 kB gzip against an 80 kB page budget.🤖 Generated with Claude Code