You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Added codex-multi-auth uninstall [--dry-run] [--json] [--clear-accounts] that reverses postinstall: unbinds Codex app rotation, removes OS launchers, strips the plugin entry from Codex.json, clears the node_modules cache, and conservatively deletes shared bun.lock only when no other Codex plugins remain.
Wired a preuninstall npm lifecycle script to the same cleanup path. (Note: see v2.1.7 — this hook does not actually fire on npm@7+.)
Bugfixes
Dry-run uninstall and scripts/preuninstall.js now compute the bun.lock decision from the actual Codex.json plugin list instead of always reporting "uncertain".
--clear-accounts no longer silently no-ops when no handler is wired; the CLI warns and exits non-zero.
Dry-run uninstall preview no longer requires scripts/codex-app-launcher.js on disk; default loader is deferred behind !dryRun.
removePluginFromList pre-filters falsy entries with list.filter(Boolean) to match scripts/install-codex-auth-utils.js.
Core
Bugfixes
hydrateRuntimeEmails no longer collapses accounts sharing accountId === undefined into the same Map entry; refreshed tokens land on the originating row.
restoreTopLevelModelProvider/restoreTopLevelResponseStorage now splice missing keys ahead of the first section header instead of appending and producing invalid TOML.
runFix, runHealthCheck, and forecast saveQuotaCache paths now downgrade transient Windows EBUSY/EPERM to a partial-success warning surfaced via quotaCacheSaveError.
withStorageLock now initializes releaseLock as a typed no-op so a synchronous Promise constructor throw cannot leave the storage mutex held.
Runtime Rotation Proxy
Bugfixes
App-bind no longer rewrites config.toml to a dead router's port; the predicate now requires router.state === "running" and a live PID.
Stream-failover read promise is now hoisted before the soft/hard timeout split so the chunk that ends a stall is no longer dropped.