Repository navigation
v2.25.0
https://www.npmjs.com/package/codex-multi-auth/v/2.25.0
npm i -g codex-multi-auth@2.25.0Codex voice and web search now work with runtime rotation on, the packaged-app router can chain a second local proxy, macOS app binds are managed through launchd, and GPT-6.1 Terra is a first-class model. API-key routes gain US endpoints and a PSP pool. Saved re-logins take effect in a running router, and refresh coordination fails closed. (#748, #749, #750, #751, #752, #753, #754, #756)
Added
- Native voice through runtime rotation:
/voiceno longer fails withruntime_rotation_proxy_not_found. The proxy creates the call with a managed ChatGPT account and relays the call's sideband control WebSocket with that same account. Audio stays peer-to-peer over WebRTC. The wrapper and both app-bind modes pointexperimental_realtime_ws_base_urlat the local proxy, so the local proxy token is never sent to the OpenAI realtime API. A value you set yourself is left alone, and the bind-written line is marked and removed on unbind. Voice rate limits and errors are passed through without replaying a call or cooling down the account. A call stays joinable for ten minutes after it is created or after its sideband last connected or disconnected. (#750) - Codex web search through runtime rotation:
POST /alpha/search(web.run) is forwarded to/codex/alpha/searchwith a managed account. Search 4xx, 5xx, 429, and transport failures go back to Codex without replaying on another account and without rate-limiting the account for Responses. (#752) - App bind upstream proxy:
codex-multi-auth rotation bind-app --upstream http://127.0.0.1:<port>[/path]chains one more local proxy behind the packaged-app router, for example Codex → codex-multi-auth → Headroom → OpenAI. Only numeric loopback HTTP URLs with an explicit port are accepted. The setting survives rebinds andreset-runtime,--no-upstreamremoves it, androtation statusshows it. (#753) - GPT-6.1 Terra (
gpt-6.1-terra):low…ultraefforts with alowdefault, picker entries in both config templates, and pricing of $1 / $5 per 1M tokens (cached input $0.05, Fast 2x, 2x input and 1.5x output above 272K input). Before this, agpt-6.1-terrarequest silently rangpt-6.1-sol. WithfallbackOnUnsupportedCodexModelenabled, an account without Terra retriesgpt-5.6-terra. (#756) - Ultrafast pricing: responses billed at the
ultrafasttier (gpt-6.1-sol) are priced at the published 6x Standard rate instead of being recorded without a cost. Ultrafast above 272K input stays unpriced. (#756) - API regions:
codex-multi-auth login --apican pin a credential to the Global or US endpoint (us.api.openai.com). Failover stays within one region, and capability evidence is kept per region. (#749) - PSP API pool and model metadata:
login --apioffers Regular API, ZDR, and PSP (Private Safety Processing) pools, selected explicitly asapi/,zdr/, orpsp/<model>. Operators can declare Daybreak Red access and reasoning efforts for a model that discovery omits. (#749)
Changed
- Saved re-logins without a restart: provider routers adopt a saved re-login without another restart, and credential reloads wait for in-flight refresh commits, so a rotated token is never overwritten by an older disk snapshot. Restart an existing router once after upgrading. (#751)
- Refresh coordination fails closed: refresh-lease acquisition errors and wait timeouts block the refresh instead of sending an uncoordinated one, and expired locks are never stolen. Affected requests return
refresh_coordination_unavailablewithout invalidating the account. A lock left behind by a failed write is removed. (#751) - macOS app router managed by launchd:
bind-app,unbind-app, andreset-runtimeload and unload the LaunchAgent withlaunchctlinstead of only rewriting its plist, so launchd never respawns a router with an outdated identity token. If the router cannot be stopped, these commands,rotation enable, androtation disableprint a warning and a cleanup hint instead of reporting a clean restart. (#748) - API WebSocket bridge: quiet upstream responses keep the local bridge alive with a separate upstream-silence deadline, aging API sockets are retired between creates, and genuine upstream failures surface as
upstream_websocket_disconnected. (#749)
Fixed
- Native interrupts:
response.interruptis forwarded to the upstream socket that owns the response and is always answered. Interrupted responses (response.incompletewith reasoninterrupted, andresponse.output_item.interrupted) keep theprevious_response_idchain intact. (#749, #754) - Disabled accounts during refresh: an account disabled while its token refresh was in flight now restarts account selection instead of being used with its old token. (#751)
- API storage outages: explicit
api/,zdr/, andpsp/routes stay available while the OAuth store is temporarily locked (EBUSY,EPERM,EACCES). (#749, #751)
Internal
- A flaky automatic-API-check test is now deterministic. (#757)