codex-multi-auth 2.1.5 → 2.1.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. package/README.md +45 -21
  2. package/config/README.md +2 -3
  3. package/dist/index.js +22 -22
  4. package/dist/index.js.map +1 -1
  5. package/dist/lib/auth/device-auth.d.ts.map +1 -1
  6. package/dist/lib/auth/device-auth.js +18 -1
  7. package/dist/lib/auth/device-auth.js.map +1 -1
  8. package/dist/lib/codex-manager/commands/account.js +6 -6
  9. package/dist/lib/codex-manager/commands/account.js.map +1 -1
  10. package/dist/lib/codex-manager/commands/best.js +1 -1
  11. package/dist/lib/codex-manager/commands/best.js.map +1 -1
  12. package/dist/lib/codex-manager/commands/bridge.js +5 -5
  13. package/dist/lib/codex-manager/commands/bridge.js.map +1 -1
  14. package/dist/lib/codex-manager/commands/budget.js +3 -3
  15. package/dist/lib/codex-manager/commands/budget.js.map +1 -1
  16. package/dist/lib/codex-manager/commands/forecast.d.ts.map +1 -1
  17. package/dist/lib/codex-manager/commands/forecast.js +18 -4
  18. package/dist/lib/codex-manager/commands/forecast.js.map +1 -1
  19. package/dist/lib/codex-manager/commands/integrations.js +1 -1
  20. package/dist/lib/codex-manager/commands/integrations.js.map +1 -1
  21. package/dist/lib/codex-manager/commands/models.js +1 -1
  22. package/dist/lib/codex-manager/commands/models.js.map +1 -1
  23. package/dist/lib/codex-manager/commands/monitor.js +1 -1
  24. package/dist/lib/codex-manager/commands/monitor.js.map +1 -1
  25. package/dist/lib/codex-manager/commands/report.js +1 -1
  26. package/dist/lib/codex-manager/commands/report.js.map +1 -1
  27. package/dist/lib/codex-manager/commands/rotation.d.ts.map +1 -1
  28. package/dist/lib/codex-manager/commands/rotation.js +23 -14
  29. package/dist/lib/codex-manager/commands/rotation.js.map +1 -1
  30. package/dist/lib/codex-manager/commands/switch.js +1 -1
  31. package/dist/lib/codex-manager/commands/switch.js.map +1 -1
  32. package/dist/lib/codex-manager/commands/uninstall.d.ts +36 -0
  33. package/dist/lib/codex-manager/commands/uninstall.d.ts.map +1 -0
  34. package/dist/lib/codex-manager/commands/uninstall.js +284 -0
  35. package/dist/lib/codex-manager/commands/uninstall.js.map +1 -0
  36. package/dist/lib/codex-manager/commands/usage.js +2 -2
  37. package/dist/lib/codex-manager/commands/usage.js.map +1 -1
  38. package/dist/lib/codex-manager/commands/verify.js +4 -4
  39. package/dist/lib/codex-manager/commands/verify.js.map +1 -1
  40. package/dist/lib/codex-manager/commands/why-selected.js +3 -3
  41. package/dist/lib/codex-manager/commands/why-selected.js.map +1 -1
  42. package/dist/lib/codex-manager/forecast-report-commands.js +3 -3
  43. package/dist/lib/codex-manager/forecast-report-commands.js.map +1 -1
  44. package/dist/lib/codex-manager/help.d.ts.map +1 -1
  45. package/dist/lib/codex-manager/help.js +27 -26
  46. package/dist/lib/codex-manager/help.js.map +1 -1
  47. package/dist/lib/codex-manager/repair-commands.d.ts.map +1 -1
  48. package/dist/lib/codex-manager/repair-commands.js +23 -11
  49. package/dist/lib/codex-manager/repair-commands.js.map +1 -1
  50. package/dist/lib/codex-manager.d.ts.map +1 -1
  51. package/dist/lib/codex-manager.js +47 -6
  52. package/dist/lib/codex-manager.js.map +1 -1
  53. package/dist/lib/forecast.js +1 -1
  54. package/dist/lib/forecast.js.map +1 -1
  55. package/dist/lib/request/fetch-helpers.d.ts +1 -1
  56. package/dist/lib/request/fetch-helpers.js +8 -8
  57. package/dist/lib/request/fetch-helpers.js.map +1 -1
  58. package/dist/lib/request/stream-failover.d.ts.map +1 -1
  59. package/dist/lib/request/stream-failover.js +12 -1
  60. package/dist/lib/request/stream-failover.js.map +1 -1
  61. package/dist/lib/rotation.d.ts +1 -1
  62. package/dist/lib/rotation.js +1 -1
  63. package/dist/lib/runtime/app-bind.d.ts.map +1 -1
  64. package/dist/lib/runtime/app-bind.js +28 -3
  65. package/dist/lib/runtime/app-bind.js.map +1 -1
  66. package/dist/lib/runtime/config-toml.d.ts.map +1 -1
  67. package/dist/lib/runtime/config-toml.js +29 -3
  68. package/dist/lib/runtime/config-toml.js.map +1 -1
  69. package/dist/lib/runtime/hydrate-emails.d.ts.map +1 -1
  70. package/dist/lib/runtime/hydrate-emails.js +6 -1
  71. package/dist/lib/runtime/hydrate-emails.js.map +1 -1
  72. package/dist/lib/runtime/runtime-current-account.d.ts.map +1 -1
  73. package/dist/lib/runtime/runtime-current-account.js +10 -1
  74. package/dist/lib/runtime/runtime-current-account.js.map +1 -1
  75. package/dist/lib/runtime/storage-scope.js +2 -2
  76. package/dist/lib/runtime/storage-scope.js.map +1 -1
  77. package/dist/lib/runtime-rotation-proxy.js +1 -1
  78. package/dist/lib/runtime-rotation-proxy.js.map +1 -1
  79. package/dist/lib/storage/transactions.d.ts +2 -1
  80. package/dist/lib/storage/transactions.d.ts.map +1 -1
  81. package/dist/lib/storage/transactions.js +9 -3
  82. package/dist/lib/storage/transactions.js.map +1 -1
  83. package/package.json +26 -17
  84. package/scripts/install-codex-auth-utils.js +48 -0
  85. package/scripts/preuninstall.js +254 -0
package/README.md CHANGED
@@ -1,11 +1,15 @@
1
- # codex-multi-auth
1
+ # codex-multi-auth: multi-account OAuth for the official Codex CLI
2
2
 
3
3
  [![npm version](https://img.shields.io/npm/v/codex-multi-auth.svg)](https://www.npmjs.com/package/codex-multi-auth)
4
4
  [![npm downloads](https://img.shields.io/npm/dw/codex-multi-auth.svg)](https://www.npmjs.com/package/codex-multi-auth)
5
+ [![CI](https://github.com/ndycode/codex-multi-auth/actions/workflows/ci.yml/badge.svg)](https://github.com/ndycode/codex-multi-auth/actions/workflows/ci.yml)
6
+ [![MIT license](https://img.shields.io/npm/l/codex-multi-auth.svg)](LICENSE)
5
7
 
6
- Codex CLI-first multi-account OAuth manager for the official Codex CLI. The package installs conflict-free alongside official `codex` installs; use `codex-multi-auth ...` for account management or `codex-multi-auth-codex ...` when you explicitly want the forwarding wrapper.
8
+ `codex-multi-auth` is a multi-account OAuth manager for the official `@openai/codex` CLI. It gives Codex CLI users explicit ChatGPT account login, account switching, health checks, local diagnostics, project-scoped storage, and default-on runtime Responses rotation without taking over the official `codex` binary. Use `codex-multi-auth ...` for account management, or `codex-multi-auth-codex ...` only when you intentionally want the optional forwarding wrapper.
7
9
 
8
- <img width="1270" height="729" alt="2026-02-28 12_54_58-prompt txt ‎- Notepads" src="https://github.com/user-attachments/assets/0cecb77e-a6d3-432a-ba48-3577db0c7093" />
10
+ Use it when you need a local Codex CLI multi-account workflow with visible account state, safer recovery commands, and a loopback-only runtime rotation proxy for request-bearing forwarded Codex sessions.
11
+
12
+ <img width="1270" height="729" alt="codex-multi-auth terminal dashboard for Codex CLI multi-account OAuth account status" src="https://github.com/user-attachments/assets/0cecb77e-a6d3-432a-ba48-3577db0c7093" />
9
13
 
10
14
 
11
15
 
@@ -15,23 +19,41 @@ Codex CLI-first multi-account OAuth manager for the official Codex CLI. The pack
15
19
 
16
20
  ## What You Get
17
21
 
18
- - Conflict-free `codex-multi-auth ...` workflow for account login, switching, checks, and diagnostics
19
- - Official Codex CLI forwarding for all non-auth commands
20
- - Multi-account OAuth pool with health-aware selection and automatic failover
21
- - Project-scoped account storage under `~/.codex/multi-auth/projects/<project-key>/...`
22
- - Interactive dashboard for account actions and settings
23
- - Experimental settings tab for staged sync, backup, and refresh-guard controls
24
- - Forecast, report, fix, and doctor commands for operational safety
25
- - Local usage ledger, budgets, account policy controls, routing profiles, and monitor views for local governance
22
+ - Codex CLI multi-account OAuth management with a dedicated `codex-multi-auth ...` command family
23
+ - Explicit ChatGPT account login, saved-account listing, account switching, health checks, and diagnostics
24
+ - Optional `codex-multi-auth-codex ...` forwarding wrapper for official Codex CLI commands when you choose wrapper-launched sessions
25
+ - Health-aware account selection, quota forecasting, automatic failover, and flagged-account recovery
26
+ - Project-scoped account storage under `~/.codex/multi-auth/projects/<project-key>/...` for repo-specific workflows
27
+ - Interactive terminal dashboard for account actions, settings, search, and hotkeys
28
+ - Forecast, report, fix, doctor, verify, monitor, and rotation commands for operational confidence
29
+ - Local usage ledger, budget guards, account policy controls, routing profiles, and model/account capability views
26
30
  - Runtime counters, budget/cooldown state, and multi-auth probe visibility in `codex-multi-auth status` / `codex-multi-auth report`
27
- - Default-on runtime Responses proxy for live account rotation inside forwarded Codex CLI/app sessions
31
+ - Default-on loopback Responses proxy for live account rotation inside forwarded Codex CLI/app sessions
28
32
  - Optional loopback-only local bridge for `/health`, `/v1/models`, and `/v1/responses`, protected by hashed local client tokens
29
- - Reversible packaged Codex app bind and user-level launcher routing helpers
30
- - Flagged account verification and restore flow
31
- - Session affinity and live account sync controls
32
- - Proactive refresh and preemptive quota deferral controls
33
- - Codex-oriented request/prompt compatibility with strict runtime handling
34
- - Stable docs set for install, config, troubleshooting, and upgrade paths
33
+ - Reversible packaged Codex app bind and user-level launcher routing helpers that do not patch official app binaries
34
+ - Session affinity, live account sync, proactive refresh, and preemptive quota deferral controls
35
+ - Codex-oriented request/prompt compatibility with strict runtime handling and documented error contracts
36
+ - Stable docs for install, configuration, troubleshooting, upgrade, public API, storage paths, and release notes
37
+
38
+ ---
39
+
40
+ ## Why Developers Use It
41
+
42
+ `codex-multi-auth` makes local Codex account state visible and recoverable. Instead of one opaque auth file, you get a named account pool, deterministic account switching, health-aware selection, JSON diagnostics for automation, and safe repair commands for stale or damaged local state. The architecture is designed for personal development workflows: credentials stay local, runtime rotation is loopback-only, and official Codex install paths keep owning the `codex` command.
43
+
44
+ ---
45
+
46
+ ## Current Architecture At A Glance
47
+
48
+ `codex-multi-auth` now ships three distinct global binaries:
49
+
50
+ | Binary | Purpose |
51
+ | --- | --- |
52
+ | `codex-multi-auth` | Primary account manager; accepts bare auth subcommands such as `login`, `status`, `switch`, `forecast`, and `rotation status` |
53
+ | `codex-multi-auth-codex` | Optional wrapper that handles `auth ...` locally and forwards every other command to the official Codex CLI |
54
+ | `codex-multi-auth-app-launcher` | Optional desktop launcher helper for supported user-level shortcuts and wrapper apps |
55
+
56
+ The package does not publish a global `codex` binary. Keep `codex` owned by the official OpenAI install path and use `codex-multi-auth-codex ...` only when you intentionally want this package's forwarding wrapper.
35
57
 
36
58
  ---
37
59
 
@@ -312,7 +334,7 @@ codex-multi-auth login
312
334
  <details>
313
335
  <summary><b>Common symptoms</b></summary>
314
336
 
315
- - `codex auth` unrecognized: run `where codex` or `which codex`, then follow `docs/troubleshooting.md` for routing fallback commands
337
+ - `codex-multi-auth` unrecognized: run `where codex-multi-auth` or `which codex-multi-auth`, then follow `docs/troubleshooting.md` for install checks
316
338
  - Switch succeeds but wrong account appears active: run `codex-multi-auth switch <index>`, then restart session
317
339
  - Requests fail fast with a pool cooldown message: wait for the cooldown window or inspect `codex-multi-auth status`
318
340
  - Requests fail fast after repeated upstream 5xx errors: inspect `codex-multi-auth report --json` for runtime traffic and cooldown details
@@ -360,8 +382,10 @@ codex-multi-auth doctor --json
360
382
 
361
383
  ## Release Notes
362
384
 
363
- - Current stable: [docs/releases/v2.1.4.md](docs/releases/v2.1.4.md)
364
- - Previous stable: [docs/releases/v2.1.3.md](docs/releases/v2.1.3.md)
385
+ - Current stable: [docs/releases/v2.1.6.md](docs/releases/v2.1.6.md)
386
+ - Previous stable: [docs/releases/v2.1.5.md](docs/releases/v2.1.5.md)
387
+ - Earlier stable: [docs/releases/v2.1.4.md](docs/releases/v2.1.4.md)
388
+ - Earlier stable: [docs/releases/v2.1.3.md](docs/releases/v2.1.3.md)
365
389
  - Earlier stable: [docs/releases/v2.1.2.md](docs/releases/v2.1.2.md)
366
390
  - Earlier stable: [docs/releases/v2.1.1.md](docs/releases/v2.1.1.md)
367
391
  - Earlier stable: [docs/releases/v2.1.0.md](docs/releases/v2.1.0.md)
package/config/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Config Templates
2
2
 
3
- These files are optional model/provider templates for host/plugin configurations that still load `codex-multi-auth` directly. The normal wrapper workflow uses `codex auth ...` and does not require these templates.
3
+ These files are optional model/provider templates for host/plugin configurations that still load `codex-multi-auth` directly. The normal account-manager workflow uses `codex-multi-auth ...` and does not require these templates.
4
4
 
5
5
  ## Primary (Codex-named)
6
6
 
@@ -13,7 +13,7 @@ These files are optional model/provider templates for host/plugin configurations
13
13
  ## Notes
14
14
 
15
15
  - These templates are optional for the OAuth account manager flow and the runtime rotation proxy.
16
- - Core auth commands use `codex auth login`.
16
+ - Core account-manager commands use `codex-multi-auth login`.
17
17
 
18
18
  ## Defaults Included
19
19
 
@@ -27,4 +27,3 @@ These files are optional model/provider templates for host/plugin configurations
27
27
  - [`../docs/configuration.md`](../docs/configuration.md)
28
28
  - [`../docs/getting-started.md`](../docs/getting-started.md)
29
29
  - [`../docs/reference/settings.md`](../docs/reference/settings.md)
30
-
package/dist/index.js CHANGED
@@ -438,7 +438,7 @@ export const OpenAIOAuthPlugin = async ({ client }) => {
438
438
  await accountManager.saveToDisk();
439
439
  }
440
440
  if (accountManager.getAccountCount() === 0) {
441
- logDebug(`[${PLUGIN_NAME}] No OAuth accounts available (run codex login)`);
441
+ logDebug(`[${PLUGIN_NAME}] No OAuth accounts available (run codex-multi-auth login)`);
442
442
  return {};
443
443
  }
444
444
  // Extract user configuration (global + per-model options)
@@ -679,7 +679,7 @@ export const OpenAIOAuthPlugin = async ({ client }) => {
679
679
  };
680
680
  return new Response(JSON.stringify({
681
681
  error: {
682
- message: `The account pool is cooling down after recent rate-limit exhaustion. Try again in ${formatWaitTime(poolCooldownRemainingMs)} or inspect \`codex auth status\`.`,
682
+ message: `The account pool is cooling down after recent rate-limit exhaustion. Try again in ${formatWaitTime(poolCooldownRemainingMs)} or inspect \`codex-multi-auth status\`.`,
683
683
  },
684
684
  }), {
685
685
  status: 429,
@@ -701,7 +701,7 @@ export const OpenAIOAuthPlugin = async ({ client }) => {
701
701
  };
702
702
  return new Response(JSON.stringify({
703
703
  error: {
704
- message: `Multiple accounts recently failed with upstream server errors. Try again in ${formatWaitTime(serverBurstCooldownRemainingMs)} or inspect \`codex auth report --json\`.`,
704
+ message: `Multiple accounts recently failed with upstream server errors. Try again in ${formatWaitTime(serverBurstCooldownRemainingMs)} or inspect \`codex-multi-auth report --json\`.`,
705
705
  },
706
706
  }), {
707
707
  status: 503,
@@ -862,7 +862,7 @@ export const OpenAIOAuthPlugin = async ({ client }) => {
862
862
  accountManager.removeAccount(account);
863
863
  sessionAffinityStore?.reindexAfterRemoval(removedIndex);
864
864
  accountManager.saveToDiskDebounced();
865
- await showRuntimeToast(client, `Removed ${accountLabel} after ${failures} consecutive auth failures. Run 'codex login' to re-add.`, "error", { duration: toastDurationMs * 2 });
865
+ await showRuntimeToast(client, `Removed ${accountLabel} after ${failures} consecutive auth failures. Run 'codex-multi-auth login' to re-add.`, "error", { duration: toastDurationMs * 2 });
866
866
  continue;
867
867
  }
868
868
  if (typeof authFailurePolicy.cooldownMs === "number" &&
@@ -1634,7 +1634,7 @@ export const OpenAIOAuthPlugin = async ({ client }) => {
1634
1634
  syncRuntimeObservability(requestTraceId);
1635
1635
  return new Response(JSON.stringify({
1636
1636
  error: {
1637
- message: `Upstream server failures were observed across multiple accounts. Pausing retries for ${formatWaitTime(serverBurstCooldownUntil - Date.now())}. Check \`codex auth report --json\` for runtime metrics.`,
1637
+ message: `Upstream server failures were observed across multiple accounts. Pausing retries for ${formatWaitTime(serverBurstCooldownUntil - Date.now())}. Check \`codex-multi-auth report --json\` for runtime metrics.`,
1638
1638
  },
1639
1639
  }), {
1640
1640
  status: 503,
@@ -1728,10 +1728,10 @@ export const OpenAIOAuthPlugin = async ({ client }) => {
1728
1728
  ? formatWaitTime(effectiveWaitMs)
1729
1729
  : "a bit";
1730
1730
  const message = count === 0
1731
- ? "No Codex accounts configured. Run `codex login`."
1731
+ ? "No Codex accounts configured. Run `codex-multi-auth login`."
1732
1732
  : effectiveWaitMs > 0
1733
- ? `All ${count} account(s) are rate-limited. A short pool cooldown is now active for ${waitLabel}. Try again later or inspect \`codex auth status\`.`
1734
- : `All ${count} account(s) failed (server errors or auth issues). Check account health with \`codex auth report --json\`.`;
1733
+ ? `All ${count} account(s) are rate-limited. A short pool cooldown is now active for ${waitLabel}. Try again later or inspect \`codex-multi-auth status\`.`
1734
+ : `All ${count} account(s) failed (server errors or auth issues). Check account health with \`codex-multi-auth report --json\`.`;
1735
1735
  runtimeMetrics.failedRequests++;
1736
1736
  runtimeMetrics.lastError = message;
1737
1737
  syncRuntimeObservability(requestTraceId);
@@ -2210,7 +2210,7 @@ export const OpenAIOAuthPlugin = async ({ client }) => {
2210
2210
  ...formatUiHeader(ui, "Codex accounts"),
2211
2211
  "",
2212
2212
  formatUiItem(ui, "No accounts configured.", "warning"),
2213
- formatUiItem(ui, "Run: codex login", "accent"),
2213
+ formatUiItem(ui, "Run: codex-multi-auth login", "accent"),
2214
2214
  formatUiKeyValue(ui, "Storage", storePath, "muted"),
2215
2215
  ].join("\n");
2216
2216
  }
@@ -2218,7 +2218,7 @@ export const OpenAIOAuthPlugin = async ({ client }) => {
2218
2218
  "No Codex accounts configured.",
2219
2219
  "",
2220
2220
  "Add accounts:",
2221
- " codex login",
2221
+ " codex-multi-auth login",
2222
2222
  "",
2223
2223
  `Storage: ${storePath}`,
2224
2224
  ].join("\n");
@@ -2267,7 +2267,7 @@ export const OpenAIOAuthPlugin = async ({ client }) => {
2267
2267
  });
2268
2268
  lines.push("");
2269
2269
  lines.push(...formatUiSection(ui, "Commands"));
2270
- lines.push(formatUiItem(ui, "Add account: codex login", "accent"));
2270
+ lines.push(formatUiItem(ui, "Add account: codex-multi-auth login", "accent"));
2271
2271
  lines.push(formatUiItem(ui, "Switch account: codex-switch <index>"));
2272
2272
  lines.push(formatUiItem(ui, "Detailed status: codex-status"));
2273
2273
  lines.push(formatUiItem(ui, "Health check: codex-health"));
@@ -2305,7 +2305,7 @@ export const OpenAIOAuthPlugin = async ({ client }) => {
2305
2305
  lines.push(`Storage: ${storePath}`);
2306
2306
  lines.push("");
2307
2307
  lines.push("Commands:");
2308
- lines.push(" - Add account: codex login");
2308
+ lines.push(" - Add account: codex-multi-auth login");
2309
2309
  lines.push(" - Switch account: codex-switch");
2310
2310
  lines.push(" - Status details: codex-status");
2311
2311
  lines.push(" - Health check: codex-health");
@@ -2328,10 +2328,10 @@ export const OpenAIOAuthPlugin = async ({ client }) => {
2328
2328
  ...formatUiHeader(ui, "Switch account"),
2329
2329
  "",
2330
2330
  formatUiItem(ui, "No accounts configured.", "warning"),
2331
- formatUiItem(ui, "Run: codex login", "accent"),
2331
+ formatUiItem(ui, "Run: codex-multi-auth login", "accent"),
2332
2332
  ].join("\n");
2333
2333
  }
2334
- return "No Codex accounts configured. Run: codex login";
2334
+ return "No Codex accounts configured. Run: codex-multi-auth login";
2335
2335
  }
2336
2336
  const targetIndex = Math.floor((index ?? 0) - 1);
2337
2337
  if (!Number.isFinite(targetIndex) ||
@@ -2401,10 +2401,10 @@ export const OpenAIOAuthPlugin = async ({ client }) => {
2401
2401
  ...formatUiHeader(ui, "Account status"),
2402
2402
  "",
2403
2403
  formatUiItem(ui, "No accounts configured.", "warning"),
2404
- formatUiItem(ui, "Run: codex login", "accent"),
2404
+ formatUiItem(ui, "Run: codex-multi-auth login", "accent"),
2405
2405
  ].join("\n");
2406
2406
  }
2407
- return "No Codex accounts configured. Run: codex login";
2407
+ return "No Codex accounts configured. Run: codex-multi-auth login";
2408
2408
  }
2409
2409
  const now = Date.now();
2410
2410
  const activeIndex = resolveActiveIndex(storage, "codex");
@@ -2632,10 +2632,10 @@ export const OpenAIOAuthPlugin = async ({ client }) => {
2632
2632
  ...formatUiHeader(ui, "Health check"),
2633
2633
  "",
2634
2634
  formatUiItem(ui, "No accounts configured.", "warning"),
2635
- formatUiItem(ui, "Run: codex login", "accent"),
2635
+ formatUiItem(ui, "Run: codex-multi-auth login", "accent"),
2636
2636
  ].join("\n");
2637
2637
  }
2638
- return "No Codex accounts configured. Run: codex login";
2638
+ return "No Codex accounts configured. Run: codex-multi-auth login";
2639
2639
  }
2640
2640
  const results = ui.v2Enabled
2641
2641
  ? []
@@ -2772,7 +2772,7 @@ export const OpenAIOAuthPlugin = async ({ client }) => {
2772
2772
  formatUiItem(ui, `${getStatusMarker(ui, "ok")} Removed: ${label}`, "success"),
2773
2773
  remaining > 0
2774
2774
  ? formatUiKeyValue(ui, "Remaining accounts", String(remaining))
2775
- : formatUiItem(ui, "No accounts remaining. Run: codex login", "warning"),
2775
+ : formatUiItem(ui, "No accounts remaining. Run: codex-multi-auth login", "warning"),
2776
2776
  ].join("\n");
2777
2777
  }
2778
2778
  return [
@@ -2780,7 +2780,7 @@ export const OpenAIOAuthPlugin = async ({ client }) => {
2780
2780
  "",
2781
2781
  remaining > 0
2782
2782
  ? `Remaining accounts: ${remaining}`
2783
- : "No accounts remaining. Run: codex login",
2783
+ : "No accounts remaining. Run: codex-multi-auth login",
2784
2784
  ].join("\n");
2785
2785
  },
2786
2786
  }),
@@ -2796,10 +2796,10 @@ export const OpenAIOAuthPlugin = async ({ client }) => {
2796
2796
  ...formatUiHeader(ui, "Refresh accounts"),
2797
2797
  "",
2798
2798
  formatUiItem(ui, "No accounts configured.", "warning"),
2799
- formatUiItem(ui, "Run: codex login", "accent"),
2799
+ formatUiItem(ui, "Run: codex-multi-auth login", "accent"),
2800
2800
  ].join("\n");
2801
2801
  }
2802
- return "No Codex accounts configured. Run: codex login";
2802
+ return "No Codex accounts configured. Run: codex-multi-auth login";
2803
2803
  }
2804
2804
  const results = ui.v2Enabled
2805
2805
  ? []