forces a live quota probe of all Claude / z.ai / Codex accounts
· auto every {{ov.quota_poll_minutes||'?'}}m
⚠ Grant health{{staleGrants.length}} Claude account(s) haven't refreshed in >{{ov.grant_stale_hours}}h — the grant may be dying; re-auth before it forces a prompt:{{staleGrants.map(a=>a.name).join(', ')}}
{{prov}}
{{vendorStatus(prov).text}}{{(ov.providers[prov]||[]).length}} account(s)· pool free{{cw.label}} {{cw.avail}}%
⚠ No usable {{prov}} account — {{stuckClients(prov).length}} client(s) are stranded on a dead/depleted grant with nowhere to fail over
({{stuckClients(prov).join(', ')}}). Re-auth or enable an account, or have that machine run
authpool-agent reauth.
{{a.name}}
⚠ dup of {{(a.duplicate_of||[]).join(', ')}}{{statusText(a)}}
⚠ Codex token expired {{ago(a.token_expires_at)}} — the gauge below is a frozen snapshot from the last Codex turn
({{a.quota_as_of?ago(a.quota_as_of):'unknown'}}); it only refreshes when Codex is used on a connected client.
⛔ blocked — a client's CLI hit a rate/quota-limit message on this account, so the server pulled it
from rotation (reactive report; {{resetIn(a.blocked_until)}}).
A healthy live probe clears it early —
{{a.provider}} has no live gauge to verify a false alarm (a benign "rate limit" phrase in CLI output trips it too) —
login: {{a.identity||((a.provider==='z.ai'||a.provider==='kimi')?'— (unknown — set the account email via caps; API keys carry no identity to learn)':a.provider==='claude'?'— (unknown — learns automatically on the next poll/re-auth, or set it via caps)':'— (unknown — learns automatically from the stored credentials on the next poll, or hit ⟳ refresh)')}}· id {{a.cred_fingerprint}}
⚠ duplicate: {{dupWhy(a)}} as {{(a.duplicate_of||[]).join(', ')}} — both rows are ONE underlying account (identical usage); re-auth one of them into the correct login
used by: , {{c.label||c.key_prefix}}still on {{clientDrift(c,a)}}no clients
📌 forced: , {{c.label||c.key_prefix}}
models: main {{(a.models||{}).ANTHROPIC_MODEL||'—'}} · opus {{modelOf(a,'OPUS')}} · sonnet {{modelOf(a,'SONNET')}} · haiku {{modelOf(a,'HAIKU')}} · forced
usage credits {{a.extra_usage.is_enabled?'(on)':'(off)'}} — used {{a.extra_usage.used_credits}} / {{a.extra_usage.monthly_limit}}
{{gaugeEmpty(a)}}
no accounts — add one below
Global GLM model mapping
(Claude Code; overrides per-account)
opus {{(ov.glm_global&&ov.glm_global.models||{}).ANTHROPIC_DEFAULT_OPUS_MODEL||'—'}} ·
sonnet {{(ov.glm_global&&ov.glm_global.models||{}).ANTHROPIC_DEFAULT_SONNET_MODEL||'—'}} ·
haiku {{(ov.glm_global&&ov.glm_global.models||{}).ANTHROPIC_DEFAULT_HAIKU_MODEL||'—'}} ·
force {{ov.glm_global&&ov.glm_global.force?'yes':'no'}}
Global Kimi model mapping
(Claude Code; overrides per-account)
main {{(ov.kimi_global&&ov.kimi_global.models||{}).ANTHROPIC_MODEL||'—'}} ·
opus {{(ov.kimi_global&&ov.kimi_global.models||{}).ANTHROPIC_DEFAULT_OPUS_MODEL||'—'}} ·
sonnet {{(ov.kimi_global&&ov.kimi_global.models||{}).ANTHROPIC_DEFAULT_SONNET_MODEL||'—'}} ·
haiku {{(ov.kimi_global&&ov.kimi_global.models||{}).ANTHROPIC_DEFAULT_HAIKU_MODEL||'—'}} ·
force {{ov.kimi_global&&ov.kimi_global.force?'yes':'no'}}
Moderato+/Allegretto preset: map everything to k3 (and raise CLAUDE_CODE_AUTO_COMPACT_WINDOW to 1048576 for the 1M context).
Add / replace account credentials
Paste the whole .credentials.json (claude), auth.json (codex), oauth_creds.json (gemini), or the raw API key (z.ai / kimi — sk-kimi-… from kimi.com/code/console, NOT a platform.kimi.ai key):
Clients
label
status
os / host
ver
installed
{{c.label||c.key_prefix}}
{{c.online?'online':'offline'}}
{{c.os||'?'}} / {{c.hostname||'?'}}
{{c.client_version||'?'}}old
{{installedStr(c)}}
Realtime model usage
moving-average depletion forecast · auto-refreshes every {{predEvery}}s
Global hard limita model is abandoned & treated as depleted at this %{{pred.global_hard_limit_pct}}%
No gauge readings yet — add accounts with a usage gauge (Claude / Codex / z.ai) and let them poll.
Model usage
({{msShare?'share of daily ':'daily '}}{{msMetric==='cost'?'est. cost':msMetric}}{{msProv==='all'?'':' · '+msProv}} — the model "market share" over time)
y-axisviewvendor
range
machines
users
no per-model usage recorded in this range / filter yet
Activity heatmap ({{heatMetric}} per day × hour, {{heatTzLabel}} local time — live data)
rangemetrictimezone
machines
accounts
models
{{(h-1)%6===0?(h-1)+'h':''}}
less
more peak {{fmt(heat.max)}} {{heatMetric}}/hour · {{heatDaysN}} days
Subscription utilization (daily peak % per account · red = limit hit)
windowrange
No utilization recorded yet — it accumulates as the server polls each account's gauge (Claude / Codex / z.ai). Build up over a few days.
No historic data yet — it's backfilled from ccusage hourly by each agent (client ≥1.0.24) and on client install/update (needs Node + ccusage on that machine). Today's row keeps growing through the day.
Clients / API keys
Client installer
Give each user this download + a per-computer API key (mint one below).
Then on their machine: extract, pip install ".[client]", and
{{enrollCmd}}