codex-multi-auth 2.8.0 → 2.8.2

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 (74) hide show
  1. package/.codex-plugin/plugin.json +1 -1
  2. package/README.md +2 -1
  3. package/dist/lib/accounts.d.ts +15 -0
  4. package/dist/lib/accounts.d.ts.map +1 -1
  5. package/dist/lib/accounts.js +126 -21
  6. package/dist/lib/codex-manager/account-pool-write.d.ts.map +1 -1
  7. package/dist/lib/codex-manager/account-pool-write.js +4 -0
  8. package/dist/lib/codex-manager/backend-settings-schema.js +1 -1
  9. package/dist/lib/codex-manager/commands/status.d.ts.map +1 -1
  10. package/dist/lib/codex-manager/commands/status.js +5 -1
  11. package/dist/lib/codex-manager/commands/uninstall.d.ts +1 -0
  12. package/dist/lib/codex-manager/commands/uninstall.d.ts.map +1 -1
  13. package/dist/lib/codex-manager/commands/uninstall.js +12 -1
  14. package/dist/lib/codex-manager/commands/why-selected.d.ts +1 -1
  15. package/dist/lib/codex-manager/commands/why-selected.d.ts.map +1 -1
  16. package/dist/lib/codex-manager/commands/why-selected.js +1 -1
  17. package/dist/lib/codex-manager/health-check.d.ts.map +1 -1
  18. package/dist/lib/codex-manager/health-check.js +19 -3
  19. package/dist/lib/codex-manager/login-oauth.d.ts.map +1 -1
  20. package/dist/lib/codex-manager/login-oauth.js +13 -7
  21. package/dist/lib/codex-manager.d.ts +4 -0
  22. package/dist/lib/codex-manager.d.ts.map +1 -1
  23. package/dist/lib/codex-manager.js +50 -16
  24. package/dist/lib/config.d.ts +3 -1
  25. package/dist/lib/config.d.ts.map +1 -1
  26. package/dist/lib/config.js +3 -1
  27. package/dist/lib/forecast.d.ts.map +1 -1
  28. package/dist/lib/forecast.js +7 -1
  29. package/dist/lib/index.d.ts +1 -0
  30. package/dist/lib/index.d.ts.map +1 -1
  31. package/dist/lib/index.js +1 -0
  32. package/dist/lib/parallel-probe.d.ts.map +1 -1
  33. package/dist/lib/parallel-probe.js +3 -1
  34. package/dist/lib/policy/runtime-policy.d.ts +1 -0
  35. package/dist/lib/policy/runtime-policy.d.ts.map +1 -1
  36. package/dist/lib/policy/runtime-policy.js +7 -0
  37. package/dist/lib/preemptive-quota-scheduler.d.ts.map +1 -1
  38. package/dist/lib/preemptive-quota-scheduler.js +35 -15
  39. package/dist/lib/rotation.d.ts +4 -0
  40. package/dist/lib/rotation.d.ts.map +1 -1
  41. package/dist/lib/rotation.js +13 -6
  42. package/dist/lib/runtime/app-bind.d.ts +40 -0
  43. package/dist/lib/runtime/app-bind.d.ts.map +1 -1
  44. package/dist/lib/runtime/app-bind.js +550 -20
  45. package/dist/lib/runtime/rotation-account-selection.d.ts.map +1 -1
  46. package/dist/lib/runtime/rotation-account-selection.js +2 -0
  47. package/dist/lib/runtime/rotation-proxy-state.d.ts +2 -0
  48. package/dist/lib/runtime/rotation-proxy-state.d.ts.map +1 -1
  49. package/dist/lib/runtime/rotation-token-refresh.d.ts.map +1 -1
  50. package/dist/lib/runtime/rotation-token-refresh.js +3 -0
  51. package/dist/lib/runtime-constants.d.ts +2 -0
  52. package/dist/lib/runtime-constants.d.ts.map +1 -1
  53. package/dist/lib/runtime-constants.js +2 -0
  54. package/dist/lib/runtime-rotation-proxy.d.ts +8 -0
  55. package/dist/lib/runtime-rotation-proxy.d.ts.map +1 -1
  56. package/dist/lib/runtime-rotation-proxy.js +59 -5
  57. package/dist/lib/schemas.d.ts +15 -0
  58. package/dist/lib/schemas.d.ts.map +1 -1
  59. package/dist/lib/schemas.js +3 -0
  60. package/dist/lib/storage/flagged-storage.d.ts.map +1 -1
  61. package/dist/lib/storage/flagged-storage.js +15 -0
  62. package/dist/lib/storage/path-state.d.ts +1 -0
  63. package/dist/lib/storage/path-state.d.ts.map +1 -1
  64. package/dist/lib/storage/path-state.js +30 -3
  65. package/dist/lib/storage/public-types.d.ts +6 -0
  66. package/dist/lib/storage/public-types.d.ts.map +1 -1
  67. package/dist/lib/storage.d.ts.map +1 -1
  68. package/dist/lib/storage.js +17 -4
  69. package/package.json +7 -5
  70. package/scripts/codex-app-router.js +47 -3
  71. package/scripts/codex.js +234 -30
  72. package/scripts/install-codex-auth-utils.js +9 -2
  73. package/scripts/postinstall.js +2 -0
  74. package/scripts/preuninstall.js +11 -0
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "codex-multi-auth",
3
- "version": "2.8.0",
3
+ "version": "2.8.2",
4
4
  "description": "Install and operate codex-multi-auth for the official @openai/codex CLI with multi-account OAuth rotation, switching, health checks, and recovery tools.",
5
5
  "interface": {
6
6
  "composerIcon": "./assets/codex-multi-auth-icon.svg"
package/README.md CHANGED
@@ -258,6 +258,7 @@ For remote or headless shells, prefer `codex-multi-auth login --device-auth`.
258
258
  | Budget guards | `~/.codex/multi-auth/budget-guards.json` |
259
259
  | Local client tokens | `~/.codex/multi-auth/local-client-tokens.json` |
260
260
  | Runtime app helper status | `~/.codex/multi-auth/runtime-rotation-app-helper.json` |
261
+ | Runtime app helper owner metadata | `~/.codex/multi-auth/runtime-rotation-app-helper-owner.<pid>.json` |
261
262
  | Persistent app bind state/logs | `~/.codex/multi-auth/app-bind/` |
262
263
  | Logs | `~/.codex/multi-auth/logs/codex-plugin/` |
263
264
  | Per-project accounts | `~/.codex/multi-auth/projects/<project-key>/openai-codex-accounts.json` |
@@ -391,7 +392,7 @@ codex-multi-auth doctor --json
391
392
 
392
393
  ## Release Notes
393
394
 
394
- - Current stable: [docs/releases/v2.8.0.md](docs/releases/v2.8.0.md) — install via `npm i -g codex-multi-auth`
395
+ - Current stable: [docs/releases/v2.8.2.md](docs/releases/v2.8.2.md) — install via `npm i -g codex-multi-auth`
395
396
  - Previous stable: [docs/releases/v2.7.1.md](docs/releases/v2.7.1.md)
396
397
  - Previous stable: [docs/releases/v2.7.0.md](docs/releases/v2.7.0.md)
397
398
  - Previous stable: [docs/releases/v2.6.0.md](docs/releases/v2.6.0.md)
@@ -14,8 +14,11 @@ type AccountIdentityCandidate = Pick<ManagedAccount, "accountId" | "email" | "re
14
14
  index?: number;
15
15
  };
16
16
  export type { Workspace } from "./storage/public-types.js";
17
+ /** Stable operator-facing marker for an explicitly invalidated OAuth token. */
18
+ export declare const AUTH_INVALIDATION_MARKER = "token-invalid \u2014 re-login needed";
17
19
  export interface ManagedAccount {
18
20
  index: number;
21
+ recordId?: string;
19
22
  _runtimeTrackerKey?: string | number;
20
23
  circuitKeyId?: string;
21
24
  accountId?: string;
@@ -33,6 +36,8 @@ export interface ManagedAccount {
33
36
  rateLimitResetTimes: RateLimitStateV3;
34
37
  coolingDownUntil?: number;
35
38
  cooldownReason?: CooldownReason;
39
+ authInvalidatedAt?: number;
40
+ authInvalidationErrorCode?: string;
36
41
  consecutiveAuthFailures?: number;
37
42
  workspaces?: Workspace[];
38
43
  currentWorkspaceIndex?: number;
@@ -79,6 +84,13 @@ export declare class AccountManager {
79
84
  getAccountByIndex(index: number): ManagedAccount | null;
80
85
  isAccountAvailableForFamily(index: number, family: ModelFamily, model?: string | null): boolean;
81
86
  getAccountRuntimeSkipReason(index: number, family: ModelFamily, model?: string | null): string | null;
87
+ /**
88
+ * Evaluate a managed-account snapshot with the same runtime gates used by
89
+ * production selection. This is public for read-only diagnostics that build
90
+ * their own trace rows from storage and therefore cannot safely resolve an
91
+ * account by its compacted array position.
92
+ */
93
+ getManagedAccountRuntimeSkipReason(account: ManagedAccount, family: ModelFamily, model?: string | null): string | null;
82
94
  static resetVolatileRuntimeState(): void;
83
95
  /**
84
96
  * Wipe per-account transient state — active cooldowns and all rate-limit
@@ -183,6 +195,9 @@ export declare class AccountManager {
183
195
  private isCircuitAvailable;
184
196
  incrementAuthFailures(account: ManagedAccount): number;
185
197
  clearAuthFailures(account: ManagedAccount): void;
198
+ markAuthInvalidated(account: ManagedAccount, errorCode?: string, invalidatedAt?: number): void;
199
+ clearAuthInvalidation(account: ManagedAccount): void;
200
+ isAccountAuthInvalidated(account: ManagedAccount): boolean;
186
201
  getAccountByIdentity(candidate: AccountIdentityCandidate, auth?: OAuthAuthDetails): ManagedAccount | null;
187
202
  shouldShowAccountToast(accountIndex: number, debounceMs?: number): boolean;
188
203
  markToastShown(accountIndex: number): void;
@@ -1 +1 @@
1
- {"version":3,"file":"accounts.d.ts","sourceRoot":"","sources":["../../lib/accounts.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"accounts.d.ts","sourceRoot":"","sources":["../../lib/accounts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAI1C,OAAO,EAKN,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,KAAK,gBAAgB,EAGrB,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACpE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAkB,KAAK,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAClF,OAAO,EAMN,KAAK,sBAAsB,EAC3B,MAAM,eAAe,CAAC;AACvB,OAAO,EAEN,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,MAAM,oBAAoB,CAAC;AAqB5B,OAAO,EACN,gBAAgB,EAChB,mBAAmB,EACnB,sBAAsB,EACtB,0BAA0B,EAC1B,6BAA6B,EAC7B,8BAA8B,EAC9B,uBAAuB,EACvB,aAAa,EACb,KAAK,kBAAkB,GACvB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACN,oBAAoB,EACpB,WAAW,EACX,mBAAmB,EACnB,sBAAsB,EACtB,kBAAkB,EAClB,wBAAwB,EACxB,sBAAsB,EACtB,cAAc,EACd,KAAK,QAAQ,EACb,KAAK,YAAY,EACjB,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,KAAK,iBAAiB,GACtB,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EACN,2BAA2B,EAC3B,qBAAqB,EACrB,KAAK,uBAAuB,GAC5B,MAAM,sBAAsB,CAAC;AAQ9B,OAAO,EAON,KAAK,eAAe,EACpB,MAAM,2BAA2B,CAAC;AA2CnC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,cAAc,GAAG,MAAM,GAAG,MAAM,CAQ7E;AAQD,KAAK,wBAAwB,GAAG,IAAI,CACnC,cAAc,EACd,WAAW,GAAG,OAAO,GAAG,cAAc,CACtC,GAAG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AA2GF,YAAY,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAE3D,+EAA+E;AAC/E,eAAO,MAAM,wBAAwB,yCAAoC,CAAC;AAE1E,MAAM,WAAW,cAAc;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kBAAkB,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACrC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,CAAC,EACd,YAAY,GACZ,SAAS,GACT,UAAU,GACV,MAAM,GACN,SAAS,GACT,QAAQ,CAAC;IACZ,mBAAmB,CAAC,EAAE,eAAe,CAAC;IACtC,mBAAmB,EAAE,gBAAgB,CAAC;IACtC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,yBAAyB,CAAC,EAAE,MAAM,CAAC;IACnC,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,UAAU,CAAC,EAAE,SAAS,EAAE,CAAC;IACzB,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,qBAAa,cAAc;IAC1B,OAAO,CAAC,QAAQ,CAAwB;IACxC,OAAO,CAAC,cAAc,CAAmD;IACzE,OAAO,CAAC,2BAA2B,CACd;IACrB,OAAO,CAAC,qBAAqB,CAAM;IACnC,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,iBAAiB,CAA8C;IACvE,OAAO,CAAC,WAAW,CAA8B;IACjD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAmB;IACpD;;;;;;OAMG;IACH,OAAO,CAAC,kBAAkB,CAAqB;IAC/C;;;;OAIG;IACH,OAAO,CAAC,kBAAkB,CAAS;IACnC;;;;;;OAMG;IACH,OAAO,CAAC,gBAAgB,CAA8B;WAEzC,YAAY,CACxB,YAAY,CAAC,EAAE,gBAAgB,GAC7B,OAAO,CAAC,cAAc,CAAC;IAmB1B,eAAe,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO;YAMhC,mBAAmB;gBAqEhC,YAAY,CAAC,EAAE,gBAAgB,EAC/B,MAAM,CAAC,EAAE,gBAAgB,GAAG,IAAI;IAyMjC,eAAe,IAAI,MAAM;IAIzB,cAAc,IAAI,MAAM;IAIxB,uBAAuB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM;IAqBpD,mBAAmB,IAAI,cAAc,EAAE;IAavC,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI;IAOvD,2BAA2B,CAC1B,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,WAAW,EACnB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,GACnB,OAAO;IAcV,2BAA2B,CAC1B,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,WAAW,EACnB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,GACnB,MAAM,GAAG,IAAI;IAMhB;;;;;OAKG;IACH,kCAAkC,CACjC,OAAO,EAAE,cAAc,EACvB,MAAM,EAAE,WAAW,EACnB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,GACnB,MAAM,GAAG,IAAI;IAehB,MAAM,CAAC,yBAAyB,IAAI,IAAI;IAKxC;;;;;;;;;;;;;;;;OAgBG;IACH,0BAA0B,IAAI,IAAI;IAYlC,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI;IAkB9C,mCAAmC,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAcvE,iBAAiB,IAAI,cAAc,GAAG,IAAI;IAI1C,0BAA0B,CAAC,MAAM,EAAE,WAAW,GAAG,cAAc,GAAG,IAAI;IAYtE,gBAAgB,IAAI,cAAc,GAAG,IAAI;IAIzC,yBAAyB,CACxB,MAAM,EAAE,WAAW,EACnB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,GACnB,cAAc,GAAG,IAAI;IAgCxB,gBAAgB,CACf,MAAM,EAAE,WAAW,EACnB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,GACnB,cAAc,GAAG,IAAI;IA+BxB;;;;;;;;;;;;;;;;;;;;;;;;OAwBG;IACH,mCAAmC,CAClC,MAAM,EAAE,WAAW,EACnB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,EACrB,cAAc,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,GAClC,cAAc,GAAG,IAAI;IAmDxB,+BAA+B,CAC9B,MAAM,EAAE,WAAW,EACnB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,EACrB,OAAO,CAAC,EAAE,sBAAsB,GAC9B,cAAc,GAAG,IAAI;IA+CxB,aAAa,CACZ,OAAO,EAAE,cAAc,EACvB,MAAM,EAAE,WAAW,EACnB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,GACnB,IAAI;IA2BP,eAAe,CACd,OAAO,EAAE,cAAc,EACvB,MAAM,EAAE,WAAW,EACnB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,GACnB,IAAI;IASP,aAAa,CACZ,OAAO,EAAE,cAAc,EACvB,MAAM,EAAE,WAAW,EACnB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,GACnB,IAAI;IAOP,YAAY,CACX,OAAO,EAAE,cAAc,EACvB,MAAM,EAAE,WAAW,EACnB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,GACnB,OAAO;IAiBV;;;;OAIG;IACH,WAAW,CACV,OAAO,EAAE,cAAc,EACvB,MAAM,EAAE,WAAW,EACnB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,GACnB,OAAO;IAMV,YAAY,CACX,OAAO,EAAE,cAAc,EACvB,MAAM,EAAE,YAAY,GAAG,SAAS,GAAG,UAAU,GAAG,QAAQ,EACxD,MAAM,EAAE,WAAW,GACjB,IAAI;IAeP;;;;;OAKG;IACH,mBAAmB,CAAC,IAAI,EAAE,gBAAgB,GAAG,IAAI;IAIjD,2EAA2E;IAC3E,mBAAmB,IAAI,gBAAgB;IAIvC;;;;;;;OAOG;IACG,kBAAkB,CACvB,OAAO,EAAE,cAAc,EACvB,MAAM,EAAE,YAAY,GAAG,SAAS,GAAG,UAAU,GAAG,QAAQ,EACxD,MAAM,EAAE,WAAW,EACnB,OAAO,CAAC,EAAE;QAAE,eAAe,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GACpD,OAAO,CAAC,eAAe,CAAC;IA4B3B;;;OAGG;IACG,4BAA4B,CACjC,OAAO,EAAE,cAAc,EACvB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,cAAc,GACpB,OAAO,CAAC,IAAI,CAAC;IAQhB;;;;OAIG;IACG,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAMzE,eAAe,CACd,OAAO,EAAE,cAAc,EACvB,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,WAAW,EACnB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,GACnB,IAAI;IAUP,yBAAyB,CACxB,OAAO,EAAE,cAAc,EACvB,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,eAAe,EACvB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,GACnB,IAAI;IA2BP,sBAAsB,CACrB,OAAO,EAAE,cAAc,EACvB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,cAAc,GACpB,IAAI;IAMP,oBAAoB,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO;IAStD,oBAAoB,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI;IAKnD,OAAO,CAAC,kBAAkB;IAI1B,qBAAqB,CAAC,OAAO,EAAE,cAAc,GAAG,MAAM;IAMtD,iBAAiB,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI;IAIhD,mBAAmB,CAClB,OAAO,EAAE,cAAc,EACvB,SAAS,SAAsB,EAC/B,aAAa,SAAU,GACrB,IAAI;IAKP,qBAAqB,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI;IAKpD,wBAAwB,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO;IAQ1D,oBAAoB,CACnB,SAAS,EAAE,wBAAwB,EACnC,IAAI,CAAC,EAAE,gBAAgB,GACrB,cAAc,GAAG,IAAI;IAQxB,sBAAsB,CAAC,YAAY,EAAE,MAAM,EAAE,UAAU,SAAQ,GAAG,OAAO;IAWzE,cAAc,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI;IAK1C,cAAc,CAAC,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,gBAAgB,GAAG,IAAI;IAiBrE;;;;;;;;;;;;OAYG;IACH,OAAO,CAAC,uBAAuB;IAuD/B,OAAO,CAAC,oBAAoB;IAyFtB,mBAAmB,CACxB,MAAM,EAAE,IAAI,CACX,cAAc,EACd,OAAO,GAAG,WAAW,GAAG,OAAO,GAAG,cAAc,CAChD,EACD,IAAI,EAAE,gBAAgB,GACpB,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAmIjC,aAAa,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI;IAS5C,cAAc,IAAI,MAAM;IAIxB,uBAAuB,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM;IAsD3E;;;;OAIG;IACH,OAAO,CAAC,eAAe;IAcvB,aAAa,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO;IAmJ/C,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAQ5C,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,cAAc,GAAG,IAAI;IA6CnE,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAajC,mBAAmB,CAAC,OAAO,SAAM,GAAG,IAAI;IAyBlC,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC;IAYvC,OAAO,CAAC,eAAe;IAiBvB,mBAAmB,CAAC,OAAO,EAAE,cAAc,GAAG,SAAS,GAAG,IAAI;IAQ9D,uBAAuB,CACtB,OAAO,EAAE,cAAc,EACvB,mBAAmB,CAAC,EAAE,MAAM,GAC1B,OAAO;IAqBV,qBAAqB,CAAC,OAAO,EAAE,cAAc,GAAG,SAAS,GAAG,IAAI;IAoBhE;;;OAGG;IACH,oBAAoB,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO;IAOtD,iBAAiB,CAAC,OAAO,EAAE,cAAc,GAAG,MAAM;IAIlD,wBAAwB,CAAC,OAAO,EAAE,cAAc,GAAG,MAAM;CAIzD;AAmBD,wBAAgB,kBAAkB,CACjC,OAAO,EACJ;IACA,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,SAAS,EAAE,CAAC;IACzB,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAC9B,GACD,SAAS,EACZ,KAAK,EAAE,MAAM,GACX,MAAM,CA4BR;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CACnC,OAAO,EACJ;IAAE,UAAU,CAAC,EAAE,SAAS,EAAE,CAAC;IAAC,qBAAqB,CAAC,EAAE,MAAM,CAAA;CAAE,GAC5D,SAAS,EACZ,MAAM,SAAQ,GACZ,MAAM,EAAE,CAgBV;AAED,wBAAgB,cAAc,CAC7B,OAAO,EAAE;IAAE,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,CAAA;CAAE,EAC/D,GAAG,SAAU,GACX,MAAM,GAAG,IAAI,CAMf"}
@@ -1,3 +1,4 @@
1
+ import { createHash } from "node:crypto";
1
2
  import { saveAccountsWithRetry } from "./storage/save-retry.js";
2
3
  import { createLogger } from "./logger.js";
3
4
  import { getStoragePath, loadAccounts, readPinAndGenFromDisk, saveAccounts, findMatchingAccountIndex, withAccountStorageTransaction, } from "./storage.js";
@@ -27,6 +28,19 @@ function getAccountCircuitKey(account) {
27
28
  }
28
29
  return account.circuitKeyId;
29
30
  }
31
+ function deriveAccountRecordId(account) {
32
+ const seed = [
33
+ account.addedAt,
34
+ account.accountId?.trim() ?? "",
35
+ account.email?.trim().toLowerCase() ?? "",
36
+ account.refreshToken.trim(),
37
+ ].join("\u0000");
38
+ return `record:${createHash("sha256").update(seed).digest("hex")}`;
39
+ }
40
+ function resolveAccountRecordId(account) {
41
+ const stored = account.recordId?.trim();
42
+ return stored || deriveAccountRecordId(account);
43
+ }
30
44
  export function getRuntimeTrackerKey(account) {
31
45
  if (account._runtimeTrackerKey !== undefined) {
32
46
  return account._runtimeTrackerKey;
@@ -110,6 +124,8 @@ function isRetryableAuthPersistenceError(error) {
110
124
  }
111
125
  return false;
112
126
  }
127
+ /** Stable operator-facing marker for an explicitly invalidated OAuth token. */
128
+ export const AUTH_INVALIDATION_MARKER = "token-invalid — re-login needed";
113
129
  export class AccountManager {
114
130
  accounts = [];
115
131
  cursorByFamily = initFamilyState(0);
@@ -283,6 +299,7 @@ export class AccountManager {
283
299
  : account.refreshToken;
284
300
  return {
285
301
  index,
302
+ recordId: resolveAccountRecordId({ ...account, refreshToken }),
286
303
  accountId: matchesFallback
287
304
  ? (fallbackAccountId ?? account.accountId)
288
305
  : account.accountId,
@@ -305,6 +322,8 @@ export class AccountManager {
305
322
  rateLimitResetTimes: account.rateLimitResetTimes ?? {},
306
323
  coolingDownUntil: account.coolingDownUntil,
307
324
  cooldownReason: account.cooldownReason,
325
+ authInvalidatedAt: account.authInvalidatedAt,
326
+ authInvalidationErrorCode: account.authInvalidationErrorCode,
308
327
  workspaces: account.workspaces,
309
328
  currentWorkspaceIndex: account.currentWorkspaceIndex,
310
329
  };
@@ -315,6 +334,12 @@ export class AccountManager {
315
334
  const now = nowMs();
316
335
  this.accounts.push({
317
336
  index: this.accounts.length,
337
+ recordId: deriveAccountRecordId({
338
+ accountId: fallbackAccountId,
339
+ email: fallbackAccountEmail,
340
+ refreshToken: authFallback.refresh,
341
+ addedAt: now,
342
+ }),
318
343
  accountId: fallbackAccountId,
319
344
  accountIdSource: fallbackAccountId ? "token" : undefined,
320
345
  email: fallbackAccountEmail,
@@ -344,6 +369,12 @@ export class AccountManager {
344
369
  this.accounts = [
345
370
  {
346
371
  index: 0,
372
+ recordId: deriveAccountRecordId({
373
+ accountId: fallbackAccountId,
374
+ email: fallbackAccountEmail,
375
+ refreshToken: authFallback.refresh,
376
+ addedAt: now,
377
+ }),
347
378
  accountId: fallbackAccountId,
348
379
  accountIdSource: fallbackAccountId ? "token" : undefined,
349
380
  email: fallbackAccountEmail,
@@ -422,6 +453,7 @@ export class AccountManager {
422
453
  return false;
423
454
  clearExpiredRateLimits(account);
424
455
  return (!isRateLimitedForFamily(account, family, model) &&
456
+ !this.isAccountAuthInvalidated(account) &&
425
457
  !this.isAccountCoolingDown(account) &&
426
458
  this.isCircuitAvailable(account));
427
459
  }
@@ -429,10 +461,21 @@ export class AccountManager {
429
461
  const account = this.getAccountByIndex(index);
430
462
  if (!account)
431
463
  return "missing";
464
+ return this.getManagedAccountRuntimeSkipReason(account, family, model);
465
+ }
466
+ /**
467
+ * Evaluate a managed-account snapshot with the same runtime gates used by
468
+ * production selection. This is public for read-only diagnostics that build
469
+ * their own trace rows from storage and therefore cannot safely resolve an
470
+ * account by its compacted array position.
471
+ */
472
+ getManagedAccountRuntimeSkipReason(account, family, model) {
432
473
  if (account.enabled === false)
433
474
  return "disabled";
434
475
  if (!this.hasEnabledWorkspaces(account))
435
476
  return "workspace-disabled";
477
+ if (this.isAccountAuthInvalidated(account))
478
+ return AUTH_INVALIDATION_MARKER;
436
479
  clearExpiredRateLimits(account);
437
480
  if (isRateLimitedForFamily(account, family, model))
438
481
  return "rate-limited";
@@ -546,6 +589,7 @@ export class AccountManager {
546
589
  continue;
547
590
  clearExpiredRateLimits(account);
548
591
  if (isRateLimitedForFamily(account, family, model) ||
592
+ this.isAccountAuthInvalidated(account) ||
549
593
  this.isAccountCoolingDown(account) ||
550
594
  !this.isCircuitAvailable(account)) {
551
595
  continue;
@@ -573,6 +617,7 @@ export class AccountManager {
573
617
  continue;
574
618
  clearExpiredRateLimits(account);
575
619
  if (isRateLimitedForFamily(account, family, model) ||
620
+ this.isAccountAuthInvalidated(account) ||
576
621
  this.isAccountCoolingDown(account) ||
577
622
  !this.isCircuitAvailable(account)) {
578
623
  continue;
@@ -623,6 +668,7 @@ export class AccountManager {
623
668
  return false;
624
669
  clearExpiredRateLimits(account);
625
670
  return (!isRateLimitedForFamily(account, family, model) &&
671
+ !this.isAccountAuthInvalidated(account) &&
626
672
  !this.isAccountCoolingDown(account) &&
627
673
  this.isCircuitAvailable(account));
628
674
  };
@@ -671,6 +717,7 @@ export class AccountManager {
671
717
  return null;
672
718
  clearExpiredRateLimits(account);
673
719
  const isAvailable = !isRateLimitedForFamily(account, family, model) &&
720
+ !this.isAccountAuthInvalidated(account) &&
674
721
  !this.isAccountCoolingDown(account) &&
675
722
  this.isCircuitAvailable(account);
676
723
  return {
@@ -887,6 +934,19 @@ export class AccountManager {
887
934
  clearAuthFailures(account) {
888
935
  account.consecutiveAuthFailures = 0;
889
936
  }
937
+ markAuthInvalidated(account, errorCode = "token_invalidated", invalidatedAt = nowMs()) {
938
+ account.authInvalidatedAt = invalidatedAt;
939
+ account.authInvalidationErrorCode = errorCode;
940
+ }
941
+ clearAuthInvalidation(account) {
942
+ delete account.authInvalidatedAt;
943
+ delete account.authInvalidationErrorCode;
944
+ }
945
+ isAccountAuthInvalidated(account) {
946
+ return (typeof account.authInvalidatedAt === "number" &&
947
+ Number.isFinite(account.authInvalidatedAt) &&
948
+ account.authInvalidatedAt > 0);
949
+ }
890
950
  getAccountByIdentity(candidate, auth) {
891
951
  const index = findAccountIndexByIdentity(this.accounts, candidate, auth);
892
952
  if (index === undefined) {
@@ -910,6 +970,7 @@ export class AccountManager {
910
970
  account.refreshToken = auth.refresh;
911
971
  account.access = auth.access;
912
972
  account.expires = auth.expires;
973
+ this.clearAuthInvalidation(account);
913
974
  const tokenAccountId = extractAccountId(auth.access)?.trim() || undefined;
914
975
  if (tokenAccountId &&
915
976
  shouldUpdateAccountIdFromToken(account.accountIdSource, account.accountId)) {
@@ -966,6 +1027,22 @@ export class AccountManager {
966
1027
  account.accessToken = disk.accessToken;
967
1028
  account.expiresAt = disk.expiresAt;
968
1029
  }
1030
+ const diskInvalidatedAt = disk.authInvalidatedAt;
1031
+ const diskHasValidInvalidation = typeof diskInvalidatedAt === "number" &&
1032
+ Number.isFinite(diskInvalidatedAt) &&
1033
+ diskInvalidatedAt > 0;
1034
+ const accountHasValidInvalidation = typeof account.authInvalidatedAt === "number" &&
1035
+ Number.isFinite(account.authInvalidatedAt) &&
1036
+ account.authInvalidatedAt > 0;
1037
+ if (diskHasValidInvalidation && !accountHasValidInvalidation) {
1038
+ // Ordinary saves must not erase an invalidation written by another
1039
+ // AccountManager. Successful refresh persistence explicitly deletes
1040
+ // this marker in commitRefreshedAuth; this reconciliation path does not.
1041
+ account.authInvalidatedAt = diskInvalidatedAt;
1042
+ if (disk.authInvalidationErrorCode) {
1043
+ account.authInvalidationErrorCode = disk.authInvalidationErrorCode;
1044
+ }
1045
+ }
969
1046
  }
970
1047
  return snapshot;
971
1048
  }
@@ -1010,26 +1087,36 @@ export class AccountManager {
1010
1087
  }
1011
1088
  const snapshot = {
1012
1089
  version: 3,
1013
- accounts: this.accounts.map((account) => ({
1014
- accountId: account.accountId,
1015
- accountIdSource: account.accountIdSource,
1016
- accountLabel: account.accountLabel,
1017
- email: account.email,
1018
- refreshToken: account.refreshToken,
1019
- accessToken: account.access,
1020
- expiresAt: account.expires,
1021
- enabled: account.enabled === false ? false : undefined,
1022
- addedAt: account.addedAt,
1023
- lastUsed: account.lastUsed,
1024
- lastSwitchReason: account.lastSwitchReason,
1025
- rateLimitResetTimes: Object.keys(account.rateLimitResetTimes).length > 0
1026
- ? account.rateLimitResetTimes
1027
- : undefined,
1028
- coolingDownUntil: account.coolingDownUntil,
1029
- cooldownReason: account.cooldownReason,
1030
- workspaces: account.workspaces,
1031
- currentWorkspaceIndex: account.currentWorkspaceIndex,
1032
- })),
1090
+ accounts: this.accounts.map((account) => {
1091
+ const hasValidAuthInvalidation = this.isAccountAuthInvalidated(account);
1092
+ return {
1093
+ recordId: account.recordId,
1094
+ accountId: account.accountId,
1095
+ accountIdSource: account.accountIdSource,
1096
+ accountLabel: account.accountLabel,
1097
+ email: account.email,
1098
+ refreshToken: account.refreshToken,
1099
+ accessToken: account.access,
1100
+ expiresAt: account.expires,
1101
+ enabled: account.enabled === false ? false : undefined,
1102
+ addedAt: account.addedAt,
1103
+ lastUsed: account.lastUsed,
1104
+ lastSwitchReason: account.lastSwitchReason,
1105
+ rateLimitResetTimes: Object.keys(account.rateLimitResetTimes).length > 0
1106
+ ? account.rateLimitResetTimes
1107
+ : undefined,
1108
+ coolingDownUntil: account.coolingDownUntil,
1109
+ cooldownReason: account.cooldownReason,
1110
+ authInvalidatedAt: hasValidAuthInvalidation
1111
+ ? account.authInvalidatedAt
1112
+ : undefined,
1113
+ authInvalidationErrorCode: hasValidAuthInvalidation
1114
+ ? account.authInvalidationErrorCode
1115
+ : undefined,
1116
+ workspaces: account.workspaces,
1117
+ currentWorkspaceIndex: account.currentWorkspaceIndex,
1118
+ };
1119
+ }),
1033
1120
  activeIndex,
1034
1121
  activeIndexByFamily,
1035
1122
  };
@@ -1072,6 +1159,8 @@ export class AccountManager {
1072
1159
  storedAccount.email = nextEmail;
1073
1160
  }
1074
1161
  storedAccount.enabled = undefined;
1162
+ delete storedAccount.authInvalidatedAt;
1163
+ delete storedAccount.authInvalidationErrorCode;
1075
1164
  delete storedAccount.coolingDownUntil;
1076
1165
  delete storedAccount.cooldownReason;
1077
1166
  const liveAccount = this.getAccountByIdentity(source, auth);
@@ -1087,6 +1176,8 @@ export class AccountManager {
1087
1176
  coolingDownUntil: liveAccount.coolingDownUntil,
1088
1177
  cooldownReason: liveAccount.cooldownReason,
1089
1178
  consecutiveAuthFailures: liveAccount.consecutiveAuthFailures,
1179
+ authInvalidatedAt: liveAccount.authInvalidatedAt,
1180
+ authInvalidationErrorCode: liveAccount.authInvalidationErrorCode,
1090
1181
  };
1091
1182
  this.updateFromAuth(liveAccount, auth);
1092
1183
  liveAccount.enabled = true;
@@ -1106,6 +1197,20 @@ export class AccountManager {
1106
1197
  liveAccount.enabled = previousLiveAccountState.enabled;
1107
1198
  liveAccount.consecutiveAuthFailures =
1108
1199
  previousLiveAccountState.consecutiveAuthFailures;
1200
+ if (previousLiveAccountState.authInvalidatedAt === undefined) {
1201
+ delete liveAccount.authInvalidatedAt;
1202
+ }
1203
+ else {
1204
+ liveAccount.authInvalidatedAt =
1205
+ previousLiveAccountState.authInvalidatedAt;
1206
+ }
1207
+ if (previousLiveAccountState.authInvalidationErrorCode === undefined) {
1208
+ delete liveAccount.authInvalidationErrorCode;
1209
+ }
1210
+ else {
1211
+ liveAccount.authInvalidationErrorCode =
1212
+ previousLiveAccountState.authInvalidationErrorCode;
1213
+ }
1109
1214
  if (previousLiveAccountState.coolingDownUntil === undefined) {
1110
1215
  delete liveAccount.coolingDownUntil;
1111
1216
  }
@@ -1151,7 +1256,7 @@ export class AccountManager {
1151
1256
  }
1152
1257
  getMinWaitTimeForFamily(family, model) {
1153
1258
  const now = nowMs();
1154
- const enabledAccounts = this.accounts.filter((account) => account.enabled !== false);
1259
+ const enabledAccounts = this.accounts.filter((account) => account.enabled !== false && !this.isAccountAuthInvalidated(account));
1155
1260
  const available = enabledAccounts.filter((account) => {
1156
1261
  clearExpiredRateLimits(account);
1157
1262
  return (!isRateLimitedForFamily(account, family, model) &&
@@ -1 +1 @@
1
- {"version":3,"file":"account-pool-write.d.ts","sourceRoot":"","sources":["../../../lib/codex-manager/account-pool-write.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAEpE;;;;;;;;;;;;;GAaG;AACH,MAAM,MAAM,uBAAuB,GAAG,UAAU,GAAG,SAAS,GAAG,SAAS,CAAC;AAEzE;;;;;GAKG;AACH,MAAM,WAAW,oBAAoB;IACpC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,iBAAiB,CAAC,iBAAiB,CAAC,CAAC;IACvD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,SAAS,EAAE,CAAC;IACzB,GAAG,EAAE,MAAM,CAAC;CACZ;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CACxC,UAAU,EAAE,SAAS,EAAE,EACvB,SAAS,EAAE,MAAM,GAAG,SAAS,GAC3B,MAAM,CAWR;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACrC,QAAQ,EAAE,IAAI,CAAC,iBAAiB,EAAE,YAAY,CAAC,EAC/C,QAAQ,EAAE,SAAS,EAAE,GAAG,SAAS,GAC/B,SAAS,EAAE,GAAG,SAAS,CAYzB;AAED;;;;GAIG;AACH,wBAAgB,4BAA4B,CAC3C,QAAQ,EAAE,IAAI,CAAC,iBAAiB,EAAE,YAAY,GAAG,uBAAuB,CAAC,EACzE,gBAAgB,EAAE,SAAS,EAAE,GAAG,SAAS,GACvC,MAAM,GAAG,SAAS,CAwBpB;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CACnC,KAAK,EAAE,oBAAoB,GACzB;IAAE,OAAO,EAAE,iBAAiB,CAAC;IAAC,OAAO,EAAE,UAAU,CAAA;CAAE,CAsBrD;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAClC,QAAQ,EAAE,iBAAiB,EAC3B,KAAK,EAAE,oBAAoB,GACzB;IAAE,OAAO,EAAE,iBAAiB,CAAC;IAAC,OAAO,EAAE,SAAS,GAAG,SAAS,CAAA;CAAE,CA6ChE;AAED;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE;IAC/C,QAAQ,EAAE,iBAAiB,EAAE,CAAC;IAC9B,MAAM,EAAE,oBAAoB,EAAE,CAAC;IAC/B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,wBAAwB,EAAE,CACzB,QAAQ,EAAE,iBAAiB,EAAE,EAC7B,QAAQ,EAAE;QACT,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,YAAY,CAAC,EAAE,MAAM,CAAC;KACtB,EACD,OAAO,EAAE;QAAE,wCAAwC,EAAE,OAAO,CAAA;KAAE,KAC1D,MAAM,GAAG,SAAS,CAAC;CACxB,GAAG;IACH,QAAQ,EAAE,iBAAiB,EAAE,CAAC;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,uBAAuB,GAAG,IAAI,CAAC;CACxC,CA6CA"}
1
+ {"version":3,"file":"account-pool-write.d.ts","sourceRoot":"","sources":["../../../lib/codex-manager/account-pool-write.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAEpE;;;;;;;;;;;;;GAaG;AACH,MAAM,MAAM,uBAAuB,GAAG,UAAU,GAAG,SAAS,GAAG,SAAS,CAAC;AAEzE;;;;;GAKG;AACH,MAAM,WAAW,oBAAoB;IACpC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,iBAAiB,CAAC,iBAAiB,CAAC,CAAC;IACvD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,SAAS,EAAE,CAAC;IACzB,GAAG,EAAE,MAAM,CAAC;CACZ;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CACxC,UAAU,EAAE,SAAS,EAAE,EACvB,SAAS,EAAE,MAAM,GAAG,SAAS,GAC3B,MAAM,CAWR;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACrC,QAAQ,EAAE,IAAI,CAAC,iBAAiB,EAAE,YAAY,CAAC,EAC/C,QAAQ,EAAE,SAAS,EAAE,GAAG,SAAS,GAC/B,SAAS,EAAE,GAAG,SAAS,CAYzB;AAED;;;;GAIG;AACH,wBAAgB,4BAA4B,CAC3C,QAAQ,EAAE,IAAI,CAAC,iBAAiB,EAAE,YAAY,GAAG,uBAAuB,CAAC,EACzE,gBAAgB,EAAE,SAAS,EAAE,GAAG,SAAS,GACvC,MAAM,GAAG,SAAS,CAwBpB;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CACnC,KAAK,EAAE,oBAAoB,GACzB;IAAE,OAAO,EAAE,iBAAiB,CAAC;IAAC,OAAO,EAAE,UAAU,CAAA;CAAE,CAwBrD;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAClC,QAAQ,EAAE,iBAAiB,EAC3B,KAAK,EAAE,oBAAoB,GACzB;IAAE,OAAO,EAAE,iBAAiB,CAAC;IAAC,OAAO,EAAE,SAAS,GAAG,SAAS,CAAA;CAAE,CA+ChE;AAED;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE;IAC/C,QAAQ,EAAE,iBAAiB,EAAE,CAAC;IAC9B,MAAM,EAAE,oBAAoB,EAAE,CAAC;IAC/B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,wBAAwB,EAAE,CACzB,QAAQ,EAAE,iBAAiB,EAAE,EAC7B,QAAQ,EAAE;QACT,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,YAAY,CAAC,EAAE,MAAM,CAAC;KACtB,EACD,OAAO,EAAE;QAAE,wCAAwC,EAAE,OAAO,CAAA;KAAE,KAC1D,MAAM,GAAG,SAAS,CAAC;CACxB,GAAG;IACH,QAAQ,EAAE,iBAAiB,EAAE,CAAC;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,uBAAuB,GAAG,IAAI,CAAC;CACxC,CA6CA"}
@@ -74,6 +74,8 @@ export function buildInsertedAccount(write) {
74
74
  accessToken: write.accessToken,
75
75
  expiresAt: write.expiresAt,
76
76
  enabled: true,
77
+ authInvalidatedAt: undefined,
78
+ authInvalidationErrorCode: undefined,
77
79
  addedAt: write.now,
78
80
  lastUsed: write.now,
79
81
  workspaces: write.workspaces,
@@ -114,6 +116,8 @@ export function buildUpdatedAccount(existing, write) {
114
116
  accessToken: write.accessToken,
115
117
  expiresAt: write.expiresAt,
116
118
  enabled: true,
119
+ authInvalidatedAt: undefined,
120
+ authInvalidationErrorCode: undefined,
117
121
  lastUsed: write.now,
118
122
  workspaces: mergedWorkspaces,
119
123
  currentWorkspaceIndex: nextCurrentWorkspaceIndex,
@@ -195,7 +195,7 @@ export const BACKEND_NUMBER_OPTIONS = [
195
195
  {
196
196
  key: "preemptiveQuotaMaxDeferralMs",
197
197
  label: "Max Preemptive Deferral",
198
- description: "Maximum time allowed for quota-based delay.",
198
+ description: "Fallback time for quota delay when reset data is unavailable or stale.",
199
199
  min: 1_000,
200
200
  max: 24 * 60 * 60_000,
201
201
  step: 60_000,
@@ -1 +1 @@
1
- {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../../lib/codex-manager/commands/status.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAK1D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,EAGN,KAAK,oBAAoB,EACzB,MAAM,0CAA0C,CAAC;AAElD,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,wCAAwC,CAAC;AAC3F,OAAO,KAAK,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAE/E,KAAK,aAAa,GAAG,gBAAgB,GAAG,IAAI,CAAC;AAG7C,MAAM,WAAW,iBAAiB;IACjC,cAAc,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IAC9C,cAAc,EAAE,MAAM,MAAM,GAAG,IAAI,CAAC;IACpC,YAAY,EAAE,MAAM,OAAO,CAAC,aAAa,CAAC,CAAC;IAC3C,kBAAkB,EAAE,CACnB,OAAO,EAAE,gBAAgB,EACzB,MAAM,CAAC,EAAE,WAAW,KAChB,MAAM,CAAC;IACZ,oBAAoB,EAAE,CACrB,OAAO,EAAE,gBAAgB,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,EAC7C,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,WAAW,KACf,MAAM,GAAG,IAAI,CAAC;IACnB,gCAAgC,CAAC,EAAE,MAAM,OAAO,CAAC,4BAA4B,GAAG,IAAI,CAAC,CAAC;IACtF,iBAAiB,CAAC,EAAE,MAAM,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC,CAAC;IAC9D,mBAAmB,CAAC,EAAE,MAAM,oBAAoB,GAAG,IAAI,CAAC;IACxD,cAAc,CAAC,EAAE,MAAM,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IACtD,oBAAoB,CAAC,EAAE,MAAM,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAC3D,MAAM,CAAC,EAAE,MAAM,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,8FAA8F;IAC9F,IAAI,CAAC,EAAE,OAAO,CAAC;CACf;AAqED,wBAAsB,gBAAgB,CACrC,IAAI,EAAE,iBAAiB,GACrB,OAAO,CAAC,MAAM,CAAC,CAwOjB;AAED,MAAM,WAAW,mBAAmB;IACnC,mBAAmB,EAAE,aAAa,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACjE,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACpC;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,mBAAmB,GAAG,MAAM,CAQpE"}
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../../lib/codex-manager/commands/status.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAK1D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,EAGN,KAAK,oBAAoB,EACzB,MAAM,0CAA0C,CAAC;AAElD,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,wCAAwC,CAAC;AAC3F,OAAO,KAAK,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAE/E,KAAK,aAAa,GAAG,gBAAgB,GAAG,IAAI,CAAC;AAG7C,MAAM,WAAW,iBAAiB;IACjC,cAAc,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IAC9C,cAAc,EAAE,MAAM,MAAM,GAAG,IAAI,CAAC;IACpC,YAAY,EAAE,MAAM,OAAO,CAAC,aAAa,CAAC,CAAC;IAC3C,kBAAkB,EAAE,CACnB,OAAO,EAAE,gBAAgB,EACzB,MAAM,CAAC,EAAE,WAAW,KAChB,MAAM,CAAC;IACZ,oBAAoB,EAAE,CACrB,OAAO,EAAE,gBAAgB,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,EAC7C,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,WAAW,KACf,MAAM,GAAG,IAAI,CAAC;IACnB,gCAAgC,CAAC,EAAE,MAAM,OAAO,CAAC,4BAA4B,GAAG,IAAI,CAAC,CAAC;IACtF,iBAAiB,CAAC,EAAE,MAAM,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC,CAAC;IAC9D,mBAAmB,CAAC,EAAE,MAAM,oBAAoB,GAAG,IAAI,CAAC;IACxD,cAAc,CAAC,EAAE,MAAM,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IACtD,oBAAoB,CAAC,EAAE,MAAM,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAC3D,MAAM,CAAC,EAAE,MAAM,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,8FAA8F;IAC9F,IAAI,CAAC,EAAE,OAAO,CAAC;CACf;AA2ED,wBAAsB,gBAAgB,CACrC,IAAI,EAAE,iBAAiB,GACrB,OAAO,CAAC,MAAM,CAAC,CAwOjB;AAED,MAAM,WAAW,mBAAmB;IACnC,mBAAmB,EAAE,aAAa,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACjE,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACpC;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,mBAAmB,GAAG,MAAM,CAQpE"}
@@ -1,4 +1,4 @@
1
- import { formatAccountLabel, formatCooldown, formatWaitTime, formatWorkspaceLines, } from "../../accounts.js";
1
+ import { AUTH_INVALIDATION_MARKER, formatAccountLabel, formatCooldown, formatWaitTime, formatWorkspaceLines, } from "../../accounts.js";
2
2
  import { evaluateForecastAccounts, recommendForecastAccount, } from "../../forecast.js";
3
3
  import { findQuotaCacheEntryForAccount, isQuotaCacheEntryExhausted, } from "../../quota-readiness.js";
4
4
  import { resolveAccountCurrentMarkers, resolveRuntimeCurrentAccount, } from "../../runtime/runtime-current-account.js";
@@ -28,6 +28,10 @@ function buildAccountMarkers(account, index, activeIndex, runtimeCurrent, now, q
28
28
  markers.push(...resolveAccountCurrentMarkers(index, activeIndex, runtimeCurrent));
29
29
  if (account.enabled === false)
30
30
  markers.push("disabled");
31
+ if (typeof account.authInvalidatedAt === "number" &&
32
+ Number.isFinite(account.authInvalidatedAt)) {
33
+ markers.push(AUTH_INVALIDATION_MARKER);
34
+ }
31
35
  if (formatRateLimitEntry(account, now, "codex"))
32
36
  markers.push("rate-limited");
33
37
  const quotaEntry = findQuotaCacheEntryForAccount(quotaCache, account, allAccounts);
@@ -1,6 +1,7 @@
1
1
  export declare function resolveUninstallPaths(platform?: NodeJS.Platform, env?: NodeJS.ProcessEnv, home?: string): {
2
2
  configPath: string;
3
3
  cacheNodeModules: string;
4
+ cacheLegacyNodeModules: string;
4
5
  cacheBunLock: string;
5
6
  };
6
7
  export declare function removePluginFromList(list: unknown[]): unknown[];
@@ -1 +1 @@
1
- {"version":3,"file":"uninstall.d.ts","sourceRoot":"","sources":["../../../../lib/codex-manager/commands/uninstall.ts"],"names":[],"mappings":"AASA,wBAAgB,qBAAqB,CACpC,QAAQ,GAAE,MAAM,CAAC,QAA2B,EAC5C,GAAG,GAAE,MAAM,CAAC,UAAwB,EACpC,IAAI,GAAE,MAAkB;;;;EAkBxB;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,EAAE,CAQ/D;AAED,KAAK,mBAAmB,GAAG;IAC1B,MAAM,EAAE,OAAO,CAAC;IAChB,IAAI,EAAE,OAAO,CAAC;IACd,aAAa,EAAE,OAAO,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAC5B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,mBAAmB,CAAA;CAAE,GAC1C;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAC7B;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAyBnD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,mBAAmB,CA2BtE;AAED,MAAM,MAAM,oBAAoB,GAAG;IAClC,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,aAAa,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACpC,MAAM,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE;QAC1B,MAAM,EAAE,IAAI,CAAC;QACb,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;KAC3B,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACpB,KAAK,CAAC,EAAE,UAAU,CAAC,OAAO,qBAAqB,CAAC,CAAC;CACjD,CAAC;AAmBF,wBAAsB,mBAAmB,CACxC,IAAI,EAAE,MAAM,EAAE,EACd,IAAI,GAAE,oBAAyB,GAC7B,OAAO,CAAC,MAAM,CAAC,CA0MjB"}
1
+ {"version":3,"file":"uninstall.d.ts","sourceRoot":"","sources":["../../../../lib/codex-manager/commands/uninstall.ts"],"names":[],"mappings":"AAWA,wBAAgB,qBAAqB,CACpC,QAAQ,GAAE,MAAM,CAAC,QAA2B,EAC5C,GAAG,GAAE,MAAM,CAAC,UAAwB,EACpC,IAAI,GAAE,MAAkB;;;;;EAwBxB;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,EAAE,CAU/D;AAED,KAAK,mBAAmB,GAAG;IAC1B,MAAM,EAAE,OAAO,CAAC;IAChB,IAAI,EAAE,OAAO,CAAC;IACd,aAAa,EAAE,OAAO,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAC5B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,mBAAmB,CAAA;CAAE,GAC1C;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAC7B;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AA0BnD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,mBAAmB,CA2BtE;AAED,MAAM,MAAM,oBAAoB,GAAG;IAClC,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,aAAa,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACpC,MAAM,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE;QAC1B,MAAM,EAAE,IAAI,CAAC;QACb,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;KAC3B,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACpB,KAAK,CAAC,EAAE,UAAU,CAAC,OAAO,qBAAqB,CAAC,CAAC;CACjD,CAAC;AAmBF,wBAAsB,mBAAmB,CACxC,IAAI,EAAE,MAAM,EAAE,EACd,IAAI,GAAE,oBAAyB,GAC7B,OAAO,CAAC,MAAM,CAAC,CAqNjB"}
@@ -5,6 +5,8 @@ import process from "node:process";
5
5
  import { withFileOperationRetry } from "../../fs-retry.js";
6
6
  import { unbindCodexAppRuntimeRotation } from "../../runtime/app-bind.js";
7
7
  const PLUGIN_NAME = "codex-multi-auth";
8
+ const LEGACY_PLUGIN_NAME = "@ndycode/codex-multi-auth";
9
+ const PLUGIN_NAMES = [PLUGIN_NAME, LEGACY_PLUGIN_NAME];
8
10
  export function resolveUninstallPaths(platform = process.platform, env = process.env, home = homedir()) {
9
11
  const isWindows = platform === "win32";
10
12
  const appData = (env["APPDATA"] ?? "").trim();
@@ -20,6 +22,7 @@ export function resolveUninstallPaths(platform = process.platform, env = process
20
22
  return {
21
23
  configPath: join(configDir, "Codex.json"),
22
24
  cacheNodeModules: join(cacheDir, "node_modules", PLUGIN_NAME),
25
+ cacheLegacyNodeModules: join(cacheDir, "node_modules", "@ndycode", "codex-multi-auth"),
23
26
  cacheBunLock: join(cacheDir, "bun.lock"),
24
27
  };
25
28
  }
@@ -30,7 +33,7 @@ export function removePluginFromList(list) {
30
33
  return list.filter(Boolean).filter((entry) => {
31
34
  if (typeof entry !== "string")
32
35
  return true;
33
- return entry !== PLUGIN_NAME && !entry.startsWith(`${PLUGIN_NAME}@`);
36
+ return !PLUGIN_NAMES.some((pluginName) => entry === pluginName || entry.startsWith(`${pluginName}@`));
34
37
  });
35
38
  }
36
39
  function printUninstallUsage() {
@@ -51,6 +54,7 @@ function printUninstallUsage() {
51
54
  "so cleanup must be initiated manually):",
52
55
  " 1. codex-multi-auth uninstall # remove residual artifacts",
53
56
  " 2. npm uninstall -g codex-multi-auth # remove the package itself",
57
+ " (@ndycode/codex-multi-auth is the legacy scoped package name.)",
54
58
  ].join("\n"));
55
59
  }
56
60
  export function parseUninstallArgs(args) {
@@ -199,6 +203,9 @@ export async function runUninstallCommand(args, deps = {}) {
199
203
  try {
200
204
  if (dryRun) {
201
205
  log(`[dry-run] Would remove ${paths.cacheNodeModules}`);
206
+ if (paths.cacheLegacyNodeModules) {
207
+ log(`[dry-run] Would remove ${paths.cacheLegacyNodeModules}`);
208
+ }
202
209
  if (bunLockSafeToRemove) {
203
210
  log(`[dry-run] Would remove ${paths.cacheBunLock}`);
204
211
  }
@@ -208,6 +215,9 @@ export async function runUninstallCommand(args, deps = {}) {
208
215
  }
209
216
  else {
210
217
  await withFileOperationRetry(() => rm(paths.cacheNodeModules, { recursive: true, force: true }));
218
+ if (paths.cacheLegacyNodeModules) {
219
+ await withFileOperationRetry(() => rm(paths.cacheLegacyNodeModules, { recursive: true, force: true }));
220
+ }
211
221
  if (bunLockSafeToRemove) {
212
222
  await withFileOperationRetry(() => rm(paths.cacheBunLock, { force: true }));
213
223
  }
@@ -252,6 +262,7 @@ export async function runUninstallCommand(args, deps = {}) {
252
262
  if (warnings.length > 0) {
253
263
  log(`warnings: ${warnings.length} step(s) skipped (see above)`);
254
264
  }
265
+ log("To remove the installed package itself, run `npm uninstall -g codex-multi-auth`; `@ndycode/codex-multi-auth` is the legacy package name and does not remove the current package.");
255
266
  }
256
267
  return partialFailure ? 1 : 0;
257
268
  }
@@ -23,7 +23,7 @@ export interface WhySelectedCommandDeps {
23
23
  setStoragePath: (path: string | null) => void;
24
24
  loadAccounts: () => Promise<AccountStorageV3 | null>;
25
25
  resolveActiveIndex: (storage: AccountStorageV3, family?: "codex") => number;
26
- selectAccountTraced: (storage: AccountStorageV3) => HybridSelectionTraceResult;
26
+ selectAccountTraced: (storage: AccountStorageV3) => HybridSelectionTraceResult | Promise<HybridSelectionTraceResult>;
27
27
  loadRuntimeObservabilitySnapshot?: () => Promise<WhySelectedRuntimeSnapshot | null>;
28
28
  sanitizeEmail?: (email: string | undefined) => string | undefined;
29
29
  logInfo?: (message: string) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"why-selected.d.ts","sourceRoot":"","sources":["../../../../lib/codex-manager/commands/why-selected.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,KAAK,EAEX,0BAA0B,EAC1B,MAAM,mBAAmB,CAAC;AAE3B,MAAM,WAAW,qBAAqB;IACrC,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,EAAE,KAAK,GAAG,MAAM,CAAC;CACrB;AAED,KAAK,gBAAgB,CAAC,CAAC,IACpB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,CAAC,CAAA;CAAE,GACxB;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAElC,UAAU,0BAA0B;IACnC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,sBAAsB;IACtC,oBAAoB,EAAE,CACrB,IAAI,EAAE,MAAM,EAAE,KACV,gBAAgB,CAAC,qBAAqB,CAAC,CAAC;IAC7C,qBAAqB,EAAE,MAAM,IAAI,CAAC;IAClC,cAAc,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IAC9C,YAAY,EAAE,MAAM,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAAC;IACrD,kBAAkB,EAAE,CAAC,OAAO,EAAE,gBAAgB,EAAE,MAAM,CAAC,EAAE,OAAO,KAAK,MAAM,CAAC;IAC5E,mBAAmB,EAAE,CACpB,OAAO,EAAE,gBAAgB,KACrB,0BAA0B,CAAC;IAChC,gCAAgC,CAAC,EAAE,MAAM,OAAO,CAAC,0BAA0B,GAAG,IAAI,CAAC,CAAC;IACpF,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,KAAK,MAAM,GAAG,SAAS,CAAC;IAClE,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACrC;AA4DD,wBAAsB,qBAAqB,CAC1C,IAAI,EAAE,MAAM,EAAE,EACd,IAAI,EAAE,sBAAsB,GAC1B,OAAO,CAAC,MAAM,CAAC,CAsJjB;AAED,wBAAgB,oBAAoB,CACnC,IAAI,EAAE,MAAM,EAAE,GACZ,gBAAgB,CAAC,qBAAqB,CAAC,CAiCzC;AAED,wBAAgB,qBAAqB,IAAI,IAAI,CAc5C"}
1
+ {"version":3,"file":"why-selected.d.ts","sourceRoot":"","sources":["../../../../lib/codex-manager/commands/why-selected.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,KAAK,EAEX,0BAA0B,EAC1B,MAAM,mBAAmB,CAAC;AAE3B,MAAM,WAAW,qBAAqB;IACrC,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,EAAE,KAAK,GAAG,MAAM,CAAC;CACrB;AAED,KAAK,gBAAgB,CAAC,CAAC,IACpB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,CAAC,CAAA;CAAE,GACxB;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAElC,UAAU,0BAA0B;IACnC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,sBAAsB;IACtC,oBAAoB,EAAE,CACrB,IAAI,EAAE,MAAM,EAAE,KACV,gBAAgB,CAAC,qBAAqB,CAAC,CAAC;IAC7C,qBAAqB,EAAE,MAAM,IAAI,CAAC;IAClC,cAAc,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IAC9C,YAAY,EAAE,MAAM,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAAC;IACrD,kBAAkB,EAAE,CAAC,OAAO,EAAE,gBAAgB,EAAE,MAAM,CAAC,EAAE,OAAO,KAAK,MAAM,CAAC;IAC5E,mBAAmB,EAAE,CACpB,OAAO,EAAE,gBAAgB,KACrB,0BAA0B,GAAG,OAAO,CAAC,0BAA0B,CAAC,CAAC;IACtE,gCAAgC,CAAC,EAAE,MAAM,OAAO,CAAC,0BAA0B,GAAG,IAAI,CAAC,CAAC;IACpF,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,KAAK,MAAM,GAAG,SAAS,CAAC;IAClE,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACrC;AA4DD,wBAAsB,qBAAqB,CAC1C,IAAI,EAAE,MAAM,EAAE,EACd,IAAI,EAAE,sBAAsB,GAC1B,OAAO,CAAC,MAAM,CAAC,CAsJjB;AAED,wBAAgB,oBAAoB,CACnC,IAAI,EAAE,MAAM,EAAE,GACZ,gBAAgB,CAAC,qBAAqB,CAAC,CAiCzC;AAED,wBAAgB,qBAAqB,IAAI,IAAI,CAc5C"}
@@ -58,7 +58,7 @@ export async function runWhySelectedCommand(args, deps) {
58
58
  }
59
59
  return 1;
60
60
  }
61
- const trace = deps.selectAccountTraced(storage);
61
+ const trace = await deps.selectAccountTraced(storage);
62
62
  const candidates = trace.candidates.map((candidate) => buildCandidateRecord(storage, candidate, sanitizeEmail));
63
63
  let selectedRecord = null;
64
64
  if (trace.selected) {
@@ -1 +1 @@
1
- {"version":3,"file":"health-check.d.ts","sourceRoot":"","sources":["../../../lib/codex-manager/health-check.ts"],"names":[],"mappings":"AAOA,OAAO,EACN,KAAK,wBAAwB,EAE7B,MAAM,0BAA0B,CAAC;AAiClC;;;;GAIG;AACH,MAAM,WAAW,kBAAkB;IAClC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,wBAAwB,CAAC;CACnC;AAED,wBAAsB,cAAc,CACnC,OAAO,GAAE,kBAAuB,GAC9B,OAAO,CAAC,IAAI,CAAC,CA6Tf"}
1
+ {"version":3,"file":"health-check.d.ts","sourceRoot":"","sources":["../../../lib/codex-manager/health-check.ts"],"names":[],"mappings":"AAQA,OAAO,EACN,KAAK,wBAAwB,EAE7B,MAAM,0BAA0B,CAAC;AA2ClC;;;;GAIG;AACH,MAAM,WAAW,kBAAkB;IAClC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,wBAAwB,CAAC;CACnC;AAED,wBAAsB,cAAc,CACnC,OAAO,GAAE,kBAAuB,GAC9B,OAAO,CAAC,IAAI,CAAC,CA4Uf"}