v6.19.0
https://www.npmjs.com/package/oc-codex-multi-auth/v/6.19.0
npx oc-codex-multi-auth@6.19.0 installAdded
The compact status line says which day a quota resets (#251, contributed by @dhaern).
today 5h 8% resets 02:25
this week 7d 0% resets Tue 02:25
further out 7d 0% resets Sep 15 02:25
A weekly window used to render as a bare time, which reads as "today" for a reset six days away. Day distance is counted in calendar days rather than elapsed milliseconds, so the week containing a daylight-saving change (167 or 169 hours, not 168) is not misread as six days and does not repeat today's weekday.
The per-tier character budgets rise from about 40% to about 54% of each tier's minimum width, 32/40/48 to 42/52/64, so the longer labels fit rather than displacing a quota reading. The narrowest tier is clamped to the terminal width, so the line can never be wider than the terminal it prints into.
The status line tells two masked accounts apart (#252, contributed by @dhaern).
before [*****] · 5h 88% · 7d 83%
after [us***@example.com] · 5h 88% · 7d 83%
A flat mask is identical for every account, so it identified none of them. Masking still refuses to keep anything it cannot prove is safe:
alice@example.com;bob@corp.com -> al***@example.com;bo***@corp.com
alice@example.com/bob@corp.com -> *****
Neil Smith neil@example.com -> ne***@example.com
Team @ Acme Corp -> *****
The hint replaces the whole value with the masked address rather than substituting in place, so a real name or a second address beside it is dropped rather than preserved. Where the longer hint does not fit the terminal, the line falls back to the flat mask before it drops the account entirely.
codex-limits reports the banked rate-limit resets an account can redeem (#254, contributed by @Nowaker).
Plan: pro
Credits: 0
Resets: 2 banked (1 applicable now)
rate_limit_reset_credits already rides in the /wham/usage response the tool fetches, so this costs no additional request and no additional token; codex-reset had to call a second endpoint to say the same thing. Before this, an account with a spent purchase balance and two full resets waiting printed Credits: 0 alone, which reads as "you have nothing" at exactly the moment a reset would have unblocked it.
Fixed
Accounts no longer carry the name of an unrelated API-platform organization (#253, contributed by @Nowaker).
Builds up to 6.17 named a ChatGPT account after an organization read from the id_token_add_organizations claims:
DreamHost API (role:owner) [id:c487c4]
6.18 stopped generating that label and cleared it on login, but a refresh token rotates for months without a login, so an older pool kept showing the wrong organization indefinitely. It is dropped now on the first read or write, with no re-authentication.
Only the generated shape goes. The trailing [id:…] marker has to hold that account's own id suffix, which is what every generator emits, so a name set with codex-label survives even when it ends in [id:mine]. The drop is logged.
The standalone CLI names accounts it can no longer label (#253).
- [0] Account 1 (pers....com, id:87c4) enabled=true refresh=true access=false
With the label gone, status, list, health, doctor and dashboard showed rows reading Account 1 and Account 2 with nothing to tell them apart, which matters because one subscription can hold several workspaces. The id suffix is only ever as long as the masked accountId beside it already discloses, and is omitted entirely when that field is a flat mask.
Short identities are no longer printed in full by diagnostics (#253).
The head/tail mask keeps eight characters, so below thirteen it concealed nothing:
me@x.io -> me@x.io (was printed verbatim)
me@x.io12 -> me@x...io12 (all but the middle character)
Both are replaced outright now, and input is trimmed first so padding cannot clear the cutoff on its own. This applied to doctor output and --json alike.
Internal
Both reset-credit surfaces read the server's counter through one normalizeResetCreditCount, which rejects a negative, fractional or non-numeric count rather than truncating it. Each keeps its own fallback, because the list endpoint sends the credits it can count and the usage endpoint does not. An unreadable applicable_available_count now reports only that field as unknown instead of discarding the banked total beside it. (#254)
codex-limits --json keeps raw counts in resetCredits and moves the rendered summary to resetCreditsSummary, so a consumer never parses English to reach a number sitting next to it. (#254)