Skip to content

release: v0.4.27 — Antigravity dual-window quota card, shared buckets, legible green bars - #939

Merged
kittors merged 15 commits into
mainfrom
release/v0.4.27
Aug 21, 2026
Merged

release: v0.4.27 — Antigravity dual-window quota card, shared buckets, legible green bars#939
kittors merged 15 commits into
mainfrom
release/v0.4.27

Conversation

@kittors

@kittors kittors commented Aug 21, 2026

Copy link
Copy Markdown
Owner

Promotes the verified dev branch to main for v0.4.27. Pairs with CliRelay v0.4.27.

Key changes

Compatibility and upgrade notes

  • Requires CliRelay v0.4.27 for both quota windows and the shared-bucket grouping. Against an older backend the card still renders; it just cannot show the extra window or the "N models share" copy.
  • No new persisted state. Sort preferences from v0.4.26 are unchanged.

Verification

  • All 6 merged dev PRs passed quality-build-e2e / test-build / vitest (2 shards).
  • Local on the release branch: bun run --filter @code-proxy/admin-panel test -- pages/auth-files/__tests__/quotaCardSlots.antigravity.test.ts pages/auth-files/__tests__/authFilesQuotaSort.test.ts pages/auth-files/__tests__/AuthFilesPage.files-table.test.tsx → 3 files, 99 passed.

kittors and others added 15 commits August 20, 2026 00:14
The card showed only the 5-hour window. A group shares one weekly limit
and one 5-hour limit, so hiding either leaves the account holder guessing
which one is about to run out — the real client shows both, grouped, with
weekly first, and now so does this.

Rows are composed here rather than taken from the backend: the group name
comes from the upstream, the window from WindowSeconds, so "Gemini · 周"
is localised without translating anything the upstream owns. The group
name loses its trailing "models", which carries nothing next to a window
and a percentage. A group with only one window — the fallback model view
is entirely 5h — gets no window suffix, since there is nothing to
disambiguate against.

The upstream describes each group in a full sentence. Printed inline it
would push the numbers off the card, so it moves behind a hint icon next
to the label, together with a short explanation of how the two limits
interact. The description is taken off the item as well as out of the row,
so it cannot reappear in the detail line reserved for the reset countdown.

Sorting needed no change: resolveAuthFileQuotaRank ranks by the tightest
quota the card actually shows, and it reuses resolveQuotaCardSlots, so the
weekly bucket became eligible the moment the card began showing it. Its
test now pins that an account at 3% weekly outranks its own roomier 5h
window, which is the behaviour an operator reading the card expects.

renderQuotaBar moves into quotaBar.tsx as useQuotaBarRenderer, for the
same reason renderQuotaBarNode already lived there: the presentation hook
is over the file-size limit and may only shrink. Both touched files ended
up smaller than their baselines, which are updated to match.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
feat(ai-accounts): show both Antigravity quota windows per group
The card drew five independent bars — Gemini Pro, Gemini Flash, Gemini
Image, Claude, GPT-OSS — for what is, on the live account, a single shared
quota. Asked what the bars meant, there was no way to tell they were the
same limit counted five times.

The backend now groups models by the quota they actually draw on, so a row
corresponds to one real bucket. It has no family name to show, and
inventing one is what this grouping exists to avoid, so the row says how
many models share it: "19 个模型共享". The member list goes behind the hint
icon under a heading, one model per line, rather than as a bare
comma-separated string in the row.

Shared buckets group by their own key rather than by label, since they all
carry the same label key — they render alike but are distinct quotas and
must stay distinct rows.

The named-group path is untouched: an account that can read the upstream
summary still shows the upstream's own group names with both windows.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
feat(ai-accounts): show which models share an Antigravity quota
The card gave each quota two lines — a label row and a separate track
below it — so five quotas filled the card and the numbers sat far from
the names they belonged to. Reading down a column meant hopping between
rows.

Each quota is now one line: the fill is the row's own background rather
than a track underneath, and the label, countdown and percentage share
it. Same information, half the height, and the numbers line up in a
column you can scan.

The countdown moves inline from the detail row it used to occupy, which
is what freed the second line.

Antigravity rows carry the family name straight from the backend again.
That view now measures each family from one representative model, so the
hint says which model the number came from — an aggregate had no honest
answer to that question, since it mixed models on different reset cycles.

The previous "N 个模型共享" labelling is gone. It described the data
correctly and told the reader nothing: a bucket count is an internal
detail, not something to hand to someone checking whether they have
quota left.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
feat(ai-accounts): compact single-line quota rows
A card at rest lit five emerald surfaces at once: the plan badge, the
quota chip's border, its background, its label, and the success rate.
Every account in good standing therefore rendered as one flat green
field, and a colour that is always on cannot signal anything — the
amber and rose tones meant to flag a quota worth acting on had to
compete with it for attention.

Return all five to the neutral slate the surrounding chips already use
and keep only the progress ring green, so a healthy quota still reads
as healthy without claiming the whole card. The amber (20-60%) and rose
(<20%) branches, the warning/urgent/expired subscription tones and the
sub-90% success rates are deliberately untouched: they are now the only
coloured things on the grid, which is the point.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
useAuthFilesFilesPresentation.tsx sits above the 800-line limit and the
gate only lets such files shrink, so the two explanatory lines added
with the neutral subscription tone pushed it from 974 to 976. The
reasoning lives in the previous commit message instead.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
fix(ai-accounts): stop painting the healthy state green
#936 neutralised percentClass, chipClass and chipLabelClass, but the card
view renders quota through renderQuotaBarNode, which uses none of them
except the percent: it consumes fillClass and paints it as the row's own
background rather than a slim track underneath. At 100% that fill covers
the entire line, so every healthy window still rendered as a green band
and the card read exactly as before.

Move fillClass to neutral slate for the >= 60% branch. fillHex keeps its
emerald: it drives the 14px progress ring in QuotaMetricChips, where the
colour occupies a ring instead of a row. Amber and rose fills are left
alone, so a bar that changes colour now means something changed.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
fix(ai-accounts): neutralise the quota bar fill, not just its text
#936 and #937 read the flat green field as too much colour and drained it
to slate. That was the wrong diagnosis: the problem was never that the
bar was green, it was that the green was a 20%-opacity wash under
text-slate-600 labels and text-slate-400 countdowns — nothing on the row
had enough contrast to read, and draining the colour only made a dull
row duller.

Restore the green and spend the contrast where it earns something:

  - The fill drops the opacity wrapper for a solid but light tint
    (emerald-100), so text sits on a known colour instead of a wash.
  - A 2px rule runs down the fill's right edge. That edge is what
    encodes the percentage, and it locates the value far more precisely
    than a block boundary — which matters most at 100%, where the fill
    covers the whole row and had no visible boundary at all.
  - Label, countdown and percent move onto the tone (emerald-900 /
    emerald-700 / emerald-900) rather than hardcoded slate, so every
    element on the row belongs to one colour family.

Keeping the tint light is what stops a grid of cards becoming a wall of
colour: saturation is spent on the 2px edge, not on the full-width
background. Amber and rose follow the same construction, so a bar that
changes colour still reads as a change of state.

The subscription badge and the >=90% success rate return to emerald as
well; both were drained by #936 and neither was the source of the
problem.

Two assertions move from text-rose-700 to text-rose-900: the depleted
state is still rose, one stop darker for legibility.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
fix(ai-accounts): make the quota bar green legible instead of neutral
Promotes the verified Antigravity quota and routing fixes onto the release branch for v0.4.27.
@kittors
kittors merged commit 3d6b7be into main Aug 21, 2026
4 checks passed
@kittors
kittors deleted the release/v0.4.27 branch August 21, 2026 07:25
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant