v2.1.6.md
May 10, 2026 ยท View on GitHub
Install / Uninstall
Improvements
- Added
codex-multi-auth uninstall [--dry-run] [--json] [--clear-accounts]that reverses postinstall: unbinds Codex app rotation, removes OS launchers, strips the plugin entry fromCodex.json, clears thenode_modulescache, and conservatively deletes sharedbun.lockonly when no other Codex plugins remain. - Wired a
preuninstallnpm lifecycle script to the same cleanup path. (Note: see v2.1.7 โ this hook does not actually fire onnpm@7+.)
Bugfixes
- Dry-run
uninstallandscripts/preuninstall.jsnow compute thebun.lockdecision from the actualCodex.jsonplugin list instead of always reporting "uncertain". --clear-accountsno 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.json disk; default loader is deferred behind!dryRun. removePluginFromListpre-filters falsy entries withlist.filter(Boolean)to matchscripts/install-codex-auth-utils.js.
Core
Bugfixes
hydrateRuntimeEmailsno longer collapses accounts sharingaccountId === undefinedinto the sameMapentry; refreshed tokens land on the originating row.restoreTopLevelModelProvider/restoreTopLevelResponseStoragenow splice missing keys ahead of the first section header instead of appending and producing invalid TOML.runFix,runHealthCheck, and forecastsaveQuotaCachepaths now downgrade transient WindowsEBUSY/EPERMto a partial-success warning surfaced viaquotaCacheSaveError.withStorageLocknow initializesreleaseLockas 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.tomlto a dead router's port; the predicate now requiresrouter.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.