Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .codex-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "codex-multi-auth",
"version": "2.3.0-beta.3",
"version": "2.3.0",
"description": "Install and operate codex-multi-auth for the official @openai/codex CLI with multi-account OAuth rotation, switching, health checks, and recovery tools.",
"interface": {
"composerIcon": "./assets/codex-multi-auth-icon.svg"
Expand Down
2 changes: 1 addition & 1 deletion AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ Generated: 2026-04-25
Commit: a87e005
Validated: 2026-06-10 against commit 98d9819 (repo audit; claims re-checked against the tree, content not regenerated)
Branch: main
Package version: 2.3.0-beta.3
Package version: 2.3.0

## OVERVIEW

Expand Down
18 changes: 18 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,24 @@ This repository's current stable release line is `2.x`.
Current stable release notes live in `docs/releases/`.
This top-level changelog preserves the foundational `0.x` milestones and points older iteration history to `docs/releases/legacy-pre-0.1-history.md`.

## [2.3.0] - 2026-06-15

First stable cut of the `2.3.0` line. Promotes the `2.3.0-beta` series to stable and adds three runtime-rotation durability fixes landed after `beta.3`.
See [docs/releases/v2.3.0.md](docs/releases/v2.3.0.md) for full details.

### Fixed

- Stale-runtime recovery deadlock: the rotation proxy returned a permanent `503 "All managed Codex accounts are temporarily unavailable"` even with healthy accounts, because persisted per-account transient state (cooldowns, rate-limit windows) was restored on reload and the recovery guard refused to run against it (#606, #607)
- Cooldown not persisted when an account has no resolvable `accountId` — a restart inside the window dropped the cooldown and re-selected the broken account (#608)
- Rate-limit window not persisted in the short-retry 429 path — same durability gap as the missing-accountId branch, in the runtime fetch loop (#609)

### Notes

- Published under the `latest` dist-tag (`npm i -g codex-multi-auth`).
- Includes everything from the `2.3.0-beta.1` → `2.3.0-beta.3` prereleases.

---

## [2.3.0-beta.3] - 2026-06-11

Stream backpressure fix, deduplication fixpoint, retry-loop consolidation, typed errors, 20 new test suites, dead code pruned.
Expand Down
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -383,8 +383,8 @@ codex-multi-auth doctor --json

## Release Notes

- Current prerelease: [docs/releases/v2.3.0-beta.3.md](docs/releases/v2.3.0-beta.3.md) — install via `npm i -g codex-multi-auth@beta`
- Current stable: [docs/releases/v2.2.2.md](docs/releases/v2.2.2.md) — install via `npm i -g codex-multi-auth`
- Current stable: [docs/releases/v2.3.0.md](docs/releases/v2.3.0.md) — install via `npm i -g codex-multi-auth`
- Previous stable: [docs/releases/v2.2.2.md](docs/releases/v2.2.2.md)
- Previous stable: [docs/releases/v2.2.1.md](docs/releases/v2.2.1.md)
- Previous stable: [docs/releases/v2.2.0.md](docs/releases/v2.2.0.md)
- Previous stable: [docs/releases/v2.1.12.md](docs/releases/v2.1.12.md)
Expand Down
5 changes: 3 additions & 2 deletions docs/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,9 +32,10 @@ Public documentation for the `codex-multi-auth` Codex CLI multi-account OAuth ma

| Document | Focus |
| --- | --- |
| [releases/v2.3.0-beta.3.md](releases/v2.3.0-beta.3.md) | Current prerelease notes (install via `npm i -g codex-multi-auth@beta`) |
| [releases/v2.3.0.md](releases/v2.3.0.md) | Current stable release notes (install via `npm i -g codex-multi-auth`) |
| [releases/v2.3.0-beta.3.md](releases/v2.3.0-beta.3.md) | Prior prerelease notes |
| [releases/v2.3.0-beta.2.md](releases/v2.3.0-beta.2.md) | Prior prerelease notes |
| [releases/v2.2.2.md](releases/v2.2.2.md) | Current stable release notes (install via `npm i -g codex-multi-auth`) |
| [releases/v2.2.2.md](releases/v2.2.2.md) | Prior stable release notes |
| [releases/v2.2.1.md](releases/v2.2.1.md) | Prior stable release notes |
| [releases/v2.2.0.md](releases/v2.2.0.md) | Prior stable release notes |
| [releases/v2.1.12.md](releases/v2.1.12.md) | Prior stable release notes |
Expand Down
28 changes: 28 additions & 0 deletions docs/releases/v2.3.0.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
# v2.3.0

First stable release of the `2.3.0` line. Promotes the `2.3.0-beta.1` → `2.3.0-beta.3` prereleases to stable and adds three runtime-rotation durability fixes landed after `beta.3`.

Install: `npm i -g codex-multi-auth`

## Runtime Rotation

### Bugfixes

- **Stale-runtime recovery deadlock (#606, #607).** The rotation proxy could return a permanent `503 "All managed Codex accounts are temporarily unavailable for this runtime request."` even when accounts were healthy and `doctor` passed. Per-account transient state (`coolingDownUntil`, `cooldownReason`, `rateLimitResetTimes`) is serialized to disk, so the stale-runtime recovery path's `loadFromDisk()` restored the same state that had wedged the pool, while the recovery guard refused to run whenever any account's skip reason was `rate-limited` or `cooling-down*`. The guard now only suppresses recovery on `policy-blocked` (external, unchanged by a reload), and `recoverStaleRuntimeState` clears per-account transient state (`AccountManager.clearAccountTransientState()`) and flushes it to disk before publishing the reloaded manager. The two halves are coupled — each is pinned by a regression test that fails if the other is reverted.

- **Cooldown not persisted in the missing-`accountId` branch (#608).** When `resolveAccountId` returned null, the runtime loop marked the account cooling down but — unlike every sibling cooldown branch (network-error, 429, server-error, 401) — never scheduled a disk write. A restart inside the cooldown window dropped the cooldown and immediately re-selected the still-broken account. Added the missing `saveToDiskDebounced()`.

- **Rate-limit window not persisted in the short-retry 429 path (#609).** The short-retry branch of the runtime fetch loop mutated the disk-serialized `rateLimitResetTimes` via `markRateLimitedWithReason` and then slept/retried without persisting, unlike the full-rotation branch beside it. A crash during the retry sleep lost the reset time. Added the missing `saveToDiskDebounced()`.

## Notes

- These three fixes share one root cause class: transient account state (cooldowns, rate-limit windows) is persisted to disk, so any code path that mutates it must also schedule a write, or a restart silently drops it. All mutation sites were audited; the three above were the gaps.
- The existing `codex-multi-auth rotation reset-rate-limits` command remains available as a manual escape hatch.
- All prior `2.3.0-beta` changes are included — see [v2.3.0-beta.3](v2.3.0-beta.3.md) and [v2.3.0-beta.2](v2.3.0-beta.2.md) for the stream-backpressure fix, dedup fixpoint, retry-loop consolidation, typed errors, decomposition work, and the new test suites.

## Validation

- `npm run lint`, `npm run typecheck` — clean
- `npm test` — full suite green (4920 passed / 3 skipped / 0 failed)
- `npm test -- test/documentation.test.ts` — green
- `npm run build`, `npm run pack:check` — within pack budget
4 changes: 2 additions & 2 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "codex-multi-auth",
"version": "2.3.0-beta.3",
"version": "2.3.0",
"description": "Codex CLI multi-account OAuth manager with account switching, health checks, runtime rotation, diagnostics, and recovery tools for @openai/codex",
"main": "./dist/index.js",
"types": "./dist/index.d.ts",
Expand Down