codex-multi-auth 2.1.7 → 2.1.8

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 (48) hide show
  1. package/README.md +3 -2
  2. package/dist/lib/accounts.d.ts +17 -3
  3. package/dist/lib/accounts.d.ts.map +1 -1
  4. package/dist/lib/accounts.js +76 -2
  5. package/dist/lib/accounts.js.map +1 -1
  6. package/dist/lib/codex-manager/commands/best.d.ts +3 -0
  7. package/dist/lib/codex-manager/commands/best.d.ts.map +1 -1
  8. package/dist/lib/codex-manager/commands/best.js +6 -1
  9. package/dist/lib/codex-manager/commands/best.js.map +1 -1
  10. package/dist/lib/codex-manager/commands/status.d.ts.map +1 -1
  11. package/dist/lib/codex-manager/commands/status.js +14 -0
  12. package/dist/lib/codex-manager/commands/status.js.map +1 -1
  13. package/dist/lib/codex-manager/commands/switch.d.ts +5 -1
  14. package/dist/lib/codex-manager/commands/switch.d.ts.map +1 -1
  15. package/dist/lib/codex-manager/commands/switch.js +4 -2
  16. package/dist/lib/codex-manager/commands/switch.js.map +1 -1
  17. package/dist/lib/codex-manager/commands/unpin.d.ts +13 -0
  18. package/dist/lib/codex-manager/commands/unpin.d.ts.map +1 -0
  19. package/dist/lib/codex-manager/commands/unpin.js +35 -0
  20. package/dist/lib/codex-manager/commands/unpin.js.map +1 -0
  21. package/dist/lib/codex-manager/help.d.ts.map +1 -1
  22. package/dist/lib/codex-manager/help.js +3 -2
  23. package/dist/lib/codex-manager/help.js.map +1 -1
  24. package/dist/lib/codex-manager.d.ts.map +1 -1
  25. package/dist/lib/codex-manager.js +31 -2
  26. package/dist/lib/codex-manager.js.map +1 -1
  27. package/dist/lib/routing-mutex.d.ts +1 -1
  28. package/dist/lib/routing-mutex.d.ts.map +1 -1
  29. package/dist/lib/runtime-rotation-proxy.d.ts +49 -1
  30. package/dist/lib/runtime-rotation-proxy.d.ts.map +1 -1
  31. package/dist/lib/runtime-rotation-proxy.js +169 -5
  32. package/dist/lib/runtime-rotation-proxy.js.map +1 -1
  33. package/dist/lib/schemas.d.ts +25 -0
  34. package/dist/lib/schemas.d.ts.map +1 -1
  35. package/dist/lib/schemas.js +14 -0
  36. package/dist/lib/schemas.js.map +1 -1
  37. package/dist/lib/session-affinity.d.ts +7 -0
  38. package/dist/lib/session-affinity.d.ts.map +1 -1
  39. package/dist/lib/session-affinity.js +11 -0
  40. package/dist/lib/session-affinity.js.map +1 -1
  41. package/dist/lib/storage/migrations.d.ts +18 -2
  42. package/dist/lib/storage/migrations.d.ts.map +1 -1
  43. package/dist/lib/storage/migrations.js.map +1 -1
  44. package/dist/lib/storage.d.ts +25 -0
  45. package/dist/lib/storage.d.ts.map +1 -1
  46. package/dist/lib/storage.js +106 -2
  47. package/dist/lib/storage.js.map +1 -1
  48. package/package.json +1 -1
@@ -30,12 +30,14 @@ export async function runSwitchCommand(args, deps) {
30
30
  storage,
31
31
  targetIndex,
32
32
  parsed,
33
- switchReason: "rotation",
33
+ switchReason: "manual",
34
+ setPin: true,
35
+ bumpAffinityGeneration: true,
34
36
  });
35
37
  if (!synced) {
36
38
  (deps.logWarn ?? console.warn)(`Switched account ${parsed} locally, but Codex auth sync did not complete. Multi-auth routing will still use this account.`);
37
39
  }
38
- (deps.logInfo ?? console.log)(`Switched to account ${parsed}: ${formatAccountLabel(account, targetIndex)}${wasDisabled ? " (re-enabled)" : ""}`);
40
+ (deps.logInfo ?? console.log)(`Switched to account ${parsed}: ${formatAccountLabel(account, targetIndex)}${wasDisabled ? " (re-enabled)" : ""} (pinned for runtime routing)`);
39
41
  return 0;
40
42
  }
41
43
  //# sourceMappingURL=switch.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"switch.js","sourceRoot":"","sources":["../../../../lib/codex-manager/commands/switch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAqBvD,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACrC,IAAc,EACd,IAAuB;IAEvB,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;IAC1B,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACzB,IAAI,CAAC,QAAQ,EAAE,CAAC;QACf,CAAC,IAAI,CAAC,QAAQ,IAAI,OAAO,CAAC,KAAK,CAAC,CAC/B,uDAAuD,CACvD,CAAC;QACF,OAAO,CAAC,CAAC;IACV,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IAC7C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5C,CAAC,IAAI,CAAC,QAAQ,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,kBAAkB,QAAQ,EAAE,CAAC,CAAC;QAC/D,OAAO,CAAC,CAAC;IACV,CAAC;IAED,MAAM,WAAW,GAAG,MAAM,GAAG,CAAC,CAAC;IAC/B,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;IAC1C,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/C,CAAC,IAAI,CAAC,QAAQ,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,yBAAyB,CAAC,CAAC;QAC5D,OAAO,CAAC,CAAC;IACV,CAAC;IAED,IAAI,WAAW,GAAG,CAAC,IAAI,WAAW,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;QAC/D,CAAC,IAAI,CAAC,QAAQ,IAAI,OAAO,CAAC,KAAK,CAAC,CAC/B,sCAAsC,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE,CAC/D,CAAC;QACF,OAAO,CAAC,CAAC;IACV,CAAC;IAED,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IAC9C,IAAI,CAAC,OAAO,EAAE,CAAC;QACd,CAAC,IAAI,CAAC,QAAQ,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,WAAW,MAAM,aAAa,CAAC,CAAC;QACjE,OAAO,CAAC,CAAC;IACV,CAAC;IAED,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,IAAI,CAAC,6BAA6B,CAAC;QACxE,OAAO;QACP,WAAW;QACX,MAAM;QACN,YAAY,EAAE,UAAU;KACxB,CAAC,CAAC;IAEH,IAAI,CAAC,MAAM,EAAE,CAAC;QACb,CAAC,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAC7B,oBAAoB,MAAM,iGAAiG,CAC3H,CAAC;IACH,CAAC;IAED,CAAC,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,CAC5B,uBAAuB,MAAM,KAAK,kBAAkB,CAAC,OAAO,EAAE,WAAW,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,EAAE,CACjH,CAAC;IACF,OAAO,CAAC,CAAC;AACV,CAAC"}
1
+ {"version":3,"file":"switch.js","sourceRoot":"","sources":["../../../../lib/codex-manager/commands/switch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAyBvD,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACrC,IAAc,EACd,IAAuB;IAEvB,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;IAC1B,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACzB,IAAI,CAAC,QAAQ,EAAE,CAAC;QACf,CAAC,IAAI,CAAC,QAAQ,IAAI,OAAO,CAAC,KAAK,CAAC,CAC/B,uDAAuD,CACvD,CAAC;QACF,OAAO,CAAC,CAAC;IACV,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IAC7C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5C,CAAC,IAAI,CAAC,QAAQ,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,kBAAkB,QAAQ,EAAE,CAAC,CAAC;QAC/D,OAAO,CAAC,CAAC;IACV,CAAC;IAED,MAAM,WAAW,GAAG,MAAM,GAAG,CAAC,CAAC;IAC/B,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;IAC1C,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/C,CAAC,IAAI,CAAC,QAAQ,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,yBAAyB,CAAC,CAAC;QAC5D,OAAO,CAAC,CAAC;IACV,CAAC;IAED,IAAI,WAAW,GAAG,CAAC,IAAI,WAAW,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;QAC/D,CAAC,IAAI,CAAC,QAAQ,IAAI,OAAO,CAAC,KAAK,CAAC,CAC/B,sCAAsC,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE,CAC/D,CAAC;QACF,OAAO,CAAC,CAAC;IACV,CAAC;IAED,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IAC9C,IAAI,CAAC,OAAO,EAAE,CAAC;QACd,CAAC,IAAI,CAAC,QAAQ,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,WAAW,MAAM,aAAa,CAAC,CAAC;QACjE,OAAO,CAAC,CAAC;IACV,CAAC;IAED,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,IAAI,CAAC,6BAA6B,CAAC;QACxE,OAAO;QACP,WAAW;QACX,MAAM;QACN,YAAY,EAAE,QAAQ;QACtB,MAAM,EAAE,IAAI;QACZ,sBAAsB,EAAE,IAAI;KAC5B,CAAC,CAAC;IAEH,IAAI,CAAC,MAAM,EAAE,CAAC;QACb,CAAC,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAC7B,oBAAoB,MAAM,iGAAiG,CAC3H,CAAC;IACH,CAAC;IAED,CAAC,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,CAC5B,uBAAuB,MAAM,KAAK,kBAAkB,CAAC,OAAO,EAAE,WAAW,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,+BAA+B,CAC9I,CAAC;IACF,OAAO,CAAC,CAAC;AACV,CAAC"}
@@ -0,0 +1,13 @@
1
+ import { type AccountStorageV3 } from "../../storage.js";
2
+ type LoadedStorage = AccountStorageV3 | null;
3
+ export interface UnpinCommandDeps {
4
+ setStoragePath: (path: string | null) => void;
5
+ loadAccounts: () => Promise<LoadedStorage>;
6
+ saveAccounts: (storage: AccountStorageV3) => Promise<void>;
7
+ getStoragePath?: () => string;
8
+ logError?: (message: string) => void;
9
+ logInfo?: (message: string) => void;
10
+ }
11
+ export declare function runUnpinCommand(deps: UnpinCommandDeps): Promise<number>;
12
+ export {};
13
+ //# sourceMappingURL=unpin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unpin.d.ts","sourceRoot":"","sources":["../../../../lib/codex-manager/commands/unpin.ts"],"names":[],"mappings":"AAAA,OAAO,EAEN,KAAK,gBAAgB,EACrB,MAAM,kBAAkB,CAAC;AAG1B,KAAK,aAAa,GAAG,gBAAgB,GAAG,IAAI,CAAC;AAE7C,MAAM,WAAW,gBAAgB;IAChC,cAAc,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IAC9C,YAAY,EAAE,MAAM,OAAO,CAAC,aAAa,CAAC,CAAC;IAC3C,YAAY,EAAE,CAAC,OAAO,EAAE,gBAAgB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3D,cAAc,CAAC,EAAE,MAAM,MAAM,CAAC;IAC9B,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACpC;AAED,wBAAsB,eAAe,CACpC,IAAI,EAAE,gBAAgB,GACpB,OAAO,CAAC,MAAM,CAAC,CAqCjB"}
@@ -0,0 +1,35 @@
1
+ import { readAffinityGenerationFromDisk, } from "../../storage.js";
2
+ import { saveAccountsWithRetry } from "../forecast-report-shared.js";
3
+ export async function runUnpinCommand(deps) {
4
+ deps.setStoragePath(null);
5
+ const logError = deps.logError ?? console.error;
6
+ const logInfo = deps.logInfo ?? console.log;
7
+ const storage = await deps.loadAccounts();
8
+ if (!storage || storage.accounts.length === 0) {
9
+ logError("No accounts configured.");
10
+ return 1;
11
+ }
12
+ if (storage.pinnedAccountIndex === undefined) {
13
+ logInfo("No pin to clear.");
14
+ return 0;
15
+ }
16
+ const previousPin = storage.pinnedAccountIndex;
17
+ delete storage.pinnedAccountIndex;
18
+ // Re-read the on-disk affinityGeneration just before saving so concurrent
19
+ // CLI processes don't lose increments via lost-update on the load+mutate
20
+ // pair. The save itself is serialized by withStorageLock, but the load
21
+ // happens earlier and another process may have bumped the counter in the
22
+ // meantime. Math.max keeps the counter monotonically increasing — extra
23
+ // bumps are harmless (just an additional affinity invalidation), but a
24
+ // missed bump can let the proxy cling to the wrong account.
25
+ const diskGeneration = deps.getStoragePath
26
+ ? readAffinityGenerationFromDisk(deps.getStoragePath())
27
+ : 0;
28
+ const inMemoryGeneration = storage.affinityGeneration ?? 0;
29
+ storage.affinityGeneration =
30
+ Math.max(inMemoryGeneration, diskGeneration) + 1;
31
+ await saveAccountsWithRetry(storage, deps.saveAccounts);
32
+ logInfo(`Cleared manual pin (was account ${previousPin + 1}). Runtime routing will resume hybrid rotation.`);
33
+ return 0;
34
+ }
35
+ //# sourceMappingURL=unpin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unpin.js","sourceRoot":"","sources":["../../../../lib/codex-manager/commands/unpin.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,8BAA8B,GAE9B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAarE,MAAM,CAAC,KAAK,UAAU,eAAe,CACpC,IAAsB;IAEtB,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;IAC1B,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,OAAO,CAAC,KAAK,CAAC;IAChD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC;IAE5C,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;IAC1C,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/C,QAAQ,CAAC,yBAAyB,CAAC,CAAC;QACpC,OAAO,CAAC,CAAC;IACV,CAAC;IAED,IAAI,OAAO,CAAC,kBAAkB,KAAK,SAAS,EAAE,CAAC;QAC9C,OAAO,CAAC,kBAAkB,CAAC,CAAC;QAC5B,OAAO,CAAC,CAAC;IACV,CAAC;IAED,MAAM,WAAW,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAC/C,OAAO,OAAO,CAAC,kBAAkB,CAAC;IAClC,0EAA0E;IAC1E,yEAAyE;IACzE,uEAAuE;IACvE,yEAAyE;IACzE,wEAAwE;IACxE,uEAAuE;IACvE,4DAA4D;IAC5D,MAAM,cAAc,GAAG,IAAI,CAAC,cAAc;QACzC,CAAC,CAAC,8BAA8B,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;QACvD,CAAC,CAAC,CAAC,CAAC;IACL,MAAM,kBAAkB,GAAG,OAAO,CAAC,kBAAkB,IAAI,CAAC,CAAC;IAC3D,OAAO,CAAC,kBAAkB;QACzB,IAAI,CAAC,GAAG,CAAC,kBAAkB,EAAE,cAAc,CAAC,GAAG,CAAC,CAAC;IAClD,MAAM,qBAAqB,CAAC,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;IAExD,OAAO,CACN,mCAAmC,WAAW,GAAG,CAAC,iDAAiD,CACnG,CAAC;IACF,OAAO,CAAC,CAAC;AACV,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"help.d.ts","sourceRoot":"","sources":["../../../lib/codex-manager/help.ts"],"names":[],"mappings":"AAAA,wBAAgB,UAAU,IAAI,IAAI,CA+CjC;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC9B,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAC5B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,gBAAgB,CAAA;CAAE,GACvC;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;AAEnD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,mBAAmB,CAwCtE;AAED,MAAM,WAAW,cAAc;IAC9B,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,MAAM,cAAc,GACvB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,cAAc,CAAA;CAAE,GACrC;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;AAEnD,wBAAgB,cAAc,IAAI,IAAI,CAgBrC;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,cAAc,CAyD5D"}
1
+ {"version":3,"file":"help.d.ts","sourceRoot":"","sources":["../../../lib/codex-manager/help.ts"],"names":[],"mappings":"AAAA,wBAAgB,UAAU,IAAI,IAAI,CAgDjC;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC9B,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAC5B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,gBAAgB,CAAA;CAAE,GACvC;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;AAEnD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,mBAAmB,CAwCtE;AAED,MAAM,WAAW,cAAc;IAC9B,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,MAAM,cAAc,GACvB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,cAAc,CAAA;CAAE,GACrC;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;AAEnD,wBAAgB,cAAc,IAAI,IAAI,CAgBrC;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,cAAc,CAyD5D"}
@@ -9,8 +9,9 @@ export function printUsage() {
9
9
  "",
10
10
  "Daily use:",
11
11
  " codex-multi-auth list",
12
- " codex-multi-auth switch <index>",
13
- " codex-multi-auth best [--live] [--json] [--model <model>]",
12
+ " codex-multi-auth switch <index> (pins the account for runtime routing)",
13
+ " codex-multi-auth unpin (clears the manual pin set by switch)",
14
+ " codex-multi-auth best [--live] [--json] [--model <model>] (clears any manual pin set by switch)",
14
15
  " codex-multi-auth forecast [--live] [--json] [--model <model>]",
15
16
  " codex-multi-auth account tag|untag|weight|pause|unpause|drain|undrain|note ...",
16
17
  "",
@@ -1 +1 @@
1
- {"version":3,"file":"help.js","sourceRoot":"","sources":["../../../lib/codex-manager/help.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"help.js","sourceRoot":"","sources":["../../../lib/codex-manager/help.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"codex-manager.d.ts","sourceRoot":"","sources":["../../lib/codex-manager.ts"],"names":[],"mappings":"AA28CA,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAQ3D;AAuwDD,wBAAsB,4BAA4B,IAAI,OAAO,CAAC,OAAO,CAAC,CAuGrE;AAuCD,wBAAsB,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CA8N7E"}
1
+ {"version":3,"file":"codex-manager.d.ts","sourceRoot":"","sources":["../../lib/codex-manager.ts"],"names":[],"mappings":"AA+8CA,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAQ3D;AA+xDD,wBAAsB,4BAA4B,IAAI,OAAO,CAAC,OAAO,CAAC,CAuGrE;AAuCD,wBAAsB,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAsO7E"}
@@ -32,6 +32,7 @@ import { runRotationCommand } from "./codex-manager/commands/rotation.js";
32
32
  import { runFeaturesCommand, runStatusCommand, } from "./codex-manager/commands/status.js";
33
33
  import { loadPersistedRuntimeObservabilitySnapshot } from "./runtime/runtime-observability.js";
34
34
  import { runSwitchCommand } from "./codex-manager/commands/switch.js";
35
+ import { runUnpinCommand } from "./codex-manager/commands/unpin.js";
35
36
  import { runUsageCommand } from "./codex-manager/commands/usage.js";
36
37
  import { parseAuthLoginArgs, printUsage } from "./codex-manager/help.js";
37
38
  import { applyUiThemeFromDashboardSettings, configureUnifiedSettings, resolveMenuLayoutMode, } from "./codex-manager/settings-hub.js";
@@ -49,7 +50,7 @@ import { loadQuotaCache, saveQuotaCache, } from "./quota-cache.js";
49
50
  import { isDisplayCurrentAccount, readAppRuntimeHelperAccountSignal, resolveAccountCurrentMarkers, resolveRuntimeCurrentAccount, } from "./runtime/runtime-current-account.js";
50
51
  import { fetchCodexQuotaSnapshot, formatQuotaSnapshotLine, } from "./quota-probe.js";
51
52
  import { queuedRefresh } from "./refresh-queue.js";
52
- import { clearAccounts, findMatchingAccountIndex, formatStorageErrorHint, inspectStorageHealth, getLastAccountsSaveTimestamp, getNamedBackups, getStoragePath, loadAccounts, loadFlaggedAccounts, restoreAccountsFromBackup, StorageError, saveAccounts, setStoragePath, withAccountStorageTransaction, } from "./storage.js";
53
+ import { clearAccounts, findMatchingAccountIndex, formatStorageErrorHint, inspectStorageHealth, getLastAccountsSaveTimestamp, getNamedBackups, getStoragePath, loadAccounts, loadFlaggedAccounts, readAffinityGenerationFromDisk, restoreAccountsFromBackup, StorageError, saveAccounts, setStoragePath, withAccountStorageTransaction, } from "./storage.js";
53
54
  import { ANSI } from "./ui/ansi.js";
54
55
  import { confirm } from "./ui/confirm.js";
55
56
  import { UI_COPY } from "./ui/copy.js";
@@ -62,6 +63,7 @@ const ACCOUNT_MANAGER_COMMANDS = new Set([
62
63
  "list",
63
64
  "status",
64
65
  "switch",
66
+ "unpin",
65
67
  "best",
66
68
  "check",
67
69
  "features",
@@ -2344,7 +2346,7 @@ async function runAuthLogin(args) {
2344
2346
  }
2345
2347
  }
2346
2348
  }
2347
- async function persistAndSyncSelectedAccount({ storage, targetIndex, parsed, switchReason, initialSyncIdToken, preserveActiveIndexByFamily = false, }) {
2349
+ async function persistAndSyncSelectedAccount({ storage, targetIndex, parsed, switchReason, initialSyncIdToken, preserveActiveIndexByFamily = false, setPin = false, clearPin = false, bumpAffinityGeneration = false, }) {
2348
2350
  const account = storage.accounts[targetIndex];
2349
2351
  if (!account) {
2350
2352
  throw new Error(`Account ${parsed} not found.`);
@@ -2406,6 +2408,25 @@ async function persistAndSyncSelectedAccount({ storage, targetIndex, parsed, swi
2406
2408
  }
2407
2409
  account.lastUsed = switchNow;
2408
2410
  account.lastSwitchReason = switchReason;
2411
+ if (setPin) {
2412
+ storage.pinnedAccountIndex = targetIndex;
2413
+ }
2414
+ else if (clearPin) {
2415
+ delete storage.pinnedAccountIndex;
2416
+ }
2417
+ if (bumpAffinityGeneration) {
2418
+ // Re-read the on-disk generation right before saving so concurrent CLI
2419
+ // processes don't lose increments via lost-update on the load+mutate
2420
+ // pair. Math.max keeps the counter monotonically increasing — extra
2421
+ // bumps are harmless (just an additional affinity invalidation), but a
2422
+ // missed bump can let the proxy cling to the wrong account. The save
2423
+ // itself is serialized by withStorageLock; this only narrows the
2424
+ // lost-update window. See issue #474.
2425
+ const diskGeneration = readAffinityGenerationFromDisk(getStoragePath());
2426
+ const inMemoryGeneration = storage.affinityGeneration ?? 0;
2427
+ storage.affinityGeneration =
2428
+ Math.max(inMemoryGeneration, diskGeneration) + 1;
2429
+ }
2409
2430
  await saveAccountsWithRetry(storage, saveAccounts);
2410
2431
  const synced = await setCodexCliActiveSelection({
2411
2432
  accountId: account.accountId,
@@ -2616,6 +2637,14 @@ export async function runCodexMultiAuthCli(rawArgs) {
2616
2637
  persistAndSyncSelectedAccount,
2617
2638
  });
2618
2639
  }
2640
+ if (command === "unpin") {
2641
+ return runUnpinCommand({
2642
+ setStoragePath,
2643
+ loadAccounts,
2644
+ saveAccounts,
2645
+ getStoragePath,
2646
+ });
2647
+ }
2619
2648
  if (command === "check") {
2620
2649
  return runCheckCommand({ runHealthCheck });
2621
2650
  }