oc-codex-multi-auth 6.8.0 → 6.8.1

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 (73) hide show
  1. package/dist/index.d.ts.map +1 -1
  2. package/dist/index.js +13 -2
  3. package/dist/index.js.map +1 -1
  4. package/dist/lib/accounts/persistence.d.ts +10 -0
  5. package/dist/lib/accounts/persistence.d.ts.map +1 -1
  6. package/dist/lib/accounts/persistence.js +69 -2
  7. package/dist/lib/accounts/persistence.js.map +1 -1
  8. package/dist/lib/accounts/state.d.ts +2 -0
  9. package/dist/lib/accounts/state.d.ts.map +1 -1
  10. package/dist/lib/accounts/state.js +10 -0
  11. package/dist/lib/accounts/state.js.map +1 -1
  12. package/dist/lib/auth/login-runner.d.ts +1 -0
  13. package/dist/lib/auth/login-runner.d.ts.map +1 -1
  14. package/dist/lib/auth/login-runner.js +8 -0
  15. package/dist/lib/auth/login-runner.js.map +1 -1
  16. package/dist/lib/codex-reset.d.ts +12 -2
  17. package/dist/lib/codex-reset.d.ts.map +1 -1
  18. package/dist/lib/codex-reset.js +21 -4
  19. package/dist/lib/codex-reset.js.map +1 -1
  20. package/dist/lib/proactive-refresh.d.ts.map +1 -1
  21. package/dist/lib/proactive-refresh.js +6 -4
  22. package/dist/lib/proactive-refresh.js.map +1 -1
  23. package/dist/lib/refresh-queue.d.ts +9 -0
  24. package/dist/lib/refresh-queue.d.ts.map +1 -1
  25. package/dist/lib/refresh-queue.js +29 -0
  26. package/dist/lib/refresh-queue.js.map +1 -1
  27. package/dist/lib/request/fetch-helpers.d.ts.map +1 -1
  28. package/dist/lib/request/fetch-helpers.js +21 -2
  29. package/dist/lib/request/fetch-helpers.js.map +1 -1
  30. package/dist/lib/request/request-transformer.d.ts +10 -0
  31. package/dist/lib/request/request-transformer.d.ts.map +1 -1
  32. package/dist/lib/request/request-transformer.js +20 -0
  33. package/dist/lib/request/request-transformer.js.map +1 -1
  34. package/dist/lib/request/response-handler.d.ts.map +1 -1
  35. package/dist/lib/request/response-handler.js +28 -5
  36. package/dist/lib/request/response-handler.js.map +1 -1
  37. package/dist/lib/schemas.d.ts +3 -0
  38. package/dist/lib/schemas.d.ts.map +1 -1
  39. package/dist/lib/schemas.js +1 -0
  40. package/dist/lib/schemas.js.map +1 -1
  41. package/dist/lib/storage/migrations.d.ts +7 -0
  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 +1 -1
  45. package/dist/lib/storage.d.ts.map +1 -1
  46. package/dist/lib/storage.js +10 -1
  47. package/dist/lib/storage.js.map +1 -1
  48. package/dist/lib/tools/codex-keychain.d.ts.map +1 -1
  49. package/dist/lib/tools/codex-keychain.js +153 -77
  50. package/dist/lib/tools/codex-keychain.js.map +1 -1
  51. package/dist/lib/tools/codex-label.d.ts.map +1 -1
  52. package/dist/lib/tools/codex-label.js +60 -34
  53. package/dist/lib/tools/codex-label.js.map +1 -1
  54. package/dist/lib/tools/codex-refresh.d.ts.map +1 -1
  55. package/dist/lib/tools/codex-refresh.js +80 -5
  56. package/dist/lib/tools/codex-refresh.js.map +1 -1
  57. package/dist/lib/tools/codex-remove.d.ts.map +1 -1
  58. package/dist/lib/tools/codex-remove.js +85 -56
  59. package/dist/lib/tools/codex-remove.js.map +1 -1
  60. package/dist/lib/tools/codex-reset.d.ts.map +1 -1
  61. package/dist/lib/tools/codex-reset.js +34 -5
  62. package/dist/lib/tools/codex-reset.js.map +1 -1
  63. package/dist/lib/tools/codex-switch.d.ts.map +1 -1
  64. package/dist/lib/tools/codex-switch.js +57 -35
  65. package/dist/lib/tools/codex-switch.js.map +1 -1
  66. package/dist/lib/tui-quota-cache.d.ts +8 -0
  67. package/dist/lib/tui-quota-cache.d.ts.map +1 -1
  68. package/dist/lib/tui-quota-cache.js +13 -0
  69. package/dist/lib/tui-quota-cache.js.map +1 -1
  70. package/dist/tui.d.ts.map +1 -1
  71. package/dist/tui.js +17 -5
  72. package/dist/tui.js.map +1 -1
  73. package/package.json +153 -153
@@ -3,7 +3,7 @@
3
3
  * Extracted from `index.ts` per RC-1 Phase 2.
4
4
  */
5
5
  import { tool } from "@opencode-ai/plugin/tool";
6
- import { loadAccounts, saveAccounts } from "../storage.js";
6
+ import { loadAccounts, withAccountStorageTransaction } from "../storage.js";
7
7
  import { AccountManager } from "../accounts.js";
8
8
  import { logWarn } from "../logger.js";
9
9
  import { formatUiHeader, formatUiItem, formatUiKeyValue, } from "../ui/format.js";
@@ -23,8 +23,12 @@ export function createCodexLabelTool(ctx) {
23
23
  async execute({ index, label }) {
24
24
  const ui = resolveUiRuntime();
25
25
  const maskEmail = resolveMaskEmail();
26
- const storage = await loadAccounts();
27
- if (!storage || storage.accounts.length === 0) {
26
+ // Read-only snapshot for the "no accounts" / interactive-picker UX.
27
+ // The actual mutate+save runs inside withAccountStorageTransaction
28
+ // below against a freshly re-read snapshot so a concurrent save
29
+ // between this read and the eventual persist can't be clobbered.
30
+ const initialStorage = await loadAccounts();
31
+ if (!initialStorage || initialStorage.accounts.length === 0) {
28
32
  if (ui.v2Enabled) {
29
33
  return [
30
34
  ...formatUiHeader(ui, "Set account label"),
@@ -37,7 +41,7 @@ export function createCodexLabelTool(ctx) {
37
41
  }
38
42
  let resolvedIndex = index;
39
43
  if (resolvedIndex === undefined) {
40
- const selectedIndex = await promptAccountIndexSelection(ui, storage, "Set account label");
44
+ const selectedIndex = await promptAccountIndexSelection(ui, initialStorage, "Set account label");
41
45
  if (selectedIndex === null) {
42
46
  if (supportsInteractiveMenus()) {
43
47
  if (ui.v2Enabled) {
@@ -62,64 +66,86 @@ export function createCodexLabelTool(ctx) {
62
66
  }
63
67
  resolvedIndex = selectedIndex + 1;
64
68
  }
65
- const targetIndex = Math.floor((resolvedIndex ?? 0) - 1);
66
- if (!Number.isFinite(targetIndex) ||
67
- targetIndex < 0 ||
68
- targetIndex >= storage.accounts.length) {
69
+ const normalizedLabel = (label ?? "").trim().replace(/\s+/g, " ");
70
+ if (normalizedLabel.length > 60) {
69
71
  if (ui.v2Enabled) {
70
72
  return [
71
73
  ...formatUiHeader(ui, "Set account label"),
72
74
  "",
73
- formatUiItem(ui, `Invalid account number: ${resolvedIndex}`, "danger"),
74
- formatUiKeyValue(ui, "Valid range", `1-${storage.accounts.length}`, "muted"),
75
+ formatUiItem(ui, "Label is too long (max 60 characters).", "danger"),
75
76
  ].join("\n");
76
77
  }
77
- return `Invalid account number: ${resolvedIndex}\n\nValid range: 1-${storage.accounts.length}`;
78
+ return "Label is too long (max 60 characters).";
78
79
  }
79
- const normalizedLabel = (label ?? "").trim().replace(/\s+/g, " ");
80
- if (normalizedLabel.length > 60) {
80
+ const outcome = await withAccountStorageTransaction(async (current, persist) => {
81
+ const storage = current;
82
+ const accounts = storage?.accounts ?? [];
83
+ const targetIndex = (resolvedIndex ?? 0) - 1;
84
+ if (!Number.isInteger(targetIndex) ||
85
+ targetIndex < 0 ||
86
+ targetIndex >= accounts.length) {
87
+ return { kind: "invalid", accountCount: accounts.length };
88
+ }
89
+ const account = accounts[targetIndex];
90
+ if (!account || !storage) {
91
+ return { kind: "not-found" };
92
+ }
93
+ const previousLabel = account.accountLabel?.trim() ?? "";
94
+ if (normalizedLabel.length === 0) {
95
+ delete account.accountLabel;
96
+ }
97
+ else {
98
+ account.accountLabel = normalizedLabel;
99
+ }
100
+ try {
101
+ await persist(storage);
102
+ }
103
+ catch (saveError) {
104
+ logWarn("Failed to save account label update", {
105
+ error: String(saveError),
106
+ });
107
+ return { kind: "save-failed" };
108
+ }
109
+ const accountLabel = formatCommandAccountLabel(account, targetIndex, {
110
+ maskEmail,
111
+ });
112
+ return { kind: "ok", accountLabel, previousLabel };
113
+ });
114
+ if (outcome.kind === "invalid") {
81
115
  if (ui.v2Enabled) {
82
116
  return [
83
117
  ...formatUiHeader(ui, "Set account label"),
84
118
  "",
85
- formatUiItem(ui, "Label is too long (max 60 characters).", "danger"),
119
+ formatUiItem(ui, `Invalid account number: ${resolvedIndex}`, "danger"),
120
+ formatUiKeyValue(ui, "Valid range", `1-${outcome.accountCount}`, "muted"),
86
121
  ].join("\n");
87
122
  }
88
- return "Label is too long (max 60 characters).";
123
+ return `Invalid account number: ${resolvedIndex}\n\nValid range: 1-${outcome.accountCount}`;
89
124
  }
90
- const account = storage.accounts[targetIndex];
91
- if (!account) {
125
+ if (outcome.kind === "not-found") {
92
126
  return `Account ${resolvedIndex} not found.`;
93
127
  }
94
- const previousLabel = account.accountLabel?.trim() ?? "";
95
- if (normalizedLabel.length === 0) {
96
- delete account.accountLabel;
97
- }
98
- else {
99
- account.accountLabel = normalizedLabel;
100
- }
101
- try {
102
- await saveAccounts(storage);
103
- }
104
- catch (saveError) {
105
- logWarn("Failed to save account label update", {
106
- error: String(saveError),
107
- });
128
+ if (outcome.kind === "save-failed") {
129
+ // The transaction only mutated its in-memory snapshot; the
130
+ // persist() call that would have made the label change durable
131
+ // threw, so the label was never actually updated. Wording must
132
+ // not imply it was (matches the codex-switch/-remove fix for
133
+ // the same pattern).
108
134
  if (ui.v2Enabled) {
109
135
  return [
110
136
  ...formatUiHeader(ui, "Set account label"),
111
137
  "",
112
- formatUiItem(ui, "Label updated in memory but failed to persist.", "danger"),
138
+ formatUiItem(ui, `Failed to set label for account ${resolvedIndex}: account storage could not be updated.`, "danger"),
113
139
  ].join("\n");
114
140
  }
115
- return "Label updated in memory but failed to persist. Changes may be lost on restart.";
141
+ return `Failed to set label for account ${resolvedIndex}: account storage could not be updated.`;
116
142
  }
117
143
  if (cachedAccountManagerRef.current) {
118
144
  const reloadedManager = await AccountManager.loadFromDisk();
119
145
  cachedAccountManagerRef.current = reloadedManager;
120
146
  accountManagerPromiseRef.current = Promise.resolve(reloadedManager);
121
147
  }
122
- const accountLabel = formatCommandAccountLabel(account, targetIndex, { maskEmail });
148
+ const { accountLabel, previousLabel } = outcome;
123
149
  if (ui.v2Enabled) {
124
150
  const statusText = normalizedLabel.length === 0
125
151
  ? `Cleared label for ${accountLabel}`
@@ -1 +1 @@
1
- {"version":3,"file":"codex-label.js","sourceRoot":"","sources":["../../../lib/tools/codex-label.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"codex-label.js","sourceRoot":"","sources":["../../../lib/tools/codex-label.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,IAAI,EAAuB,MAAM,0BAA0B,CAAC;AACrE,OAAO,EAAE,YAAY,EAAE,6BAA6B,EAAE,MAAM,eAAe,CAAC;AAC5E,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EACN,cAAc,EACd,YAAY,EACZ,gBAAgB,GAChB,MAAM,iBAAiB,CAAC;AAGzB,MAAM,UAAU,oBAAoB,CAAC,GAAgB;IACpD,MAAM,EACL,gBAAgB,EAChB,2BAA2B,EAC3B,wBAAwB,EACxB,yBAAyB,EACzB,gBAAgB,EAChB,eAAe,EACf,uBAAuB,EACvB,wBAAwB,GACxB,GAAG,GAAG,CAAC;IACR,OAAO,IAAI,CAAC;QACX,WAAW,EACV,2GAA2G;QAC5G,IAAI,EAAE;YACL,KAAK,EAAE,IAAI,CAAC,MAAM;iBAChB,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CACR,+DAA+D,CAC/D;YACF,KAAK,EAAE,IAAI,CAAC,MAAM;iBAChB,MAAM,EAAE;iBACR,QAAQ,CACR,4EAA4E,CAC5E;SACF;QACD,KAAK,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,KAAK,EAAqC;YAChE,MAAM,EAAE,GAAG,gBAAgB,EAAE,CAAC;YAC9B,MAAM,SAAS,GAAG,gBAAgB,EAAE,CAAC;YACrC,oEAAoE;YACpE,mEAAmE;YACnE,gEAAgE;YAChE,iEAAiE;YACjE,MAAM,cAAc,GAAG,MAAM,YAAY,EAAE,CAAC;YAC5C,IAAI,CAAC,cAAc,IAAI,cAAc,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC7D,IAAI,EAAE,CAAC,SAAS,EAAE,CAAC;oBAClB,OAAO;wBACN,GAAG,cAAc,CAAC,EAAE,EAAE,mBAAmB,CAAC;wBAC1C,EAAE;wBACF,YAAY,CAAC,EAAE,EAAE,yBAAyB,EAAE,SAAS,CAAC;wBACtD,YAAY,CAAC,EAAE,EAAE,0BAA0B,EAAE,QAAQ,CAAC;qBACtD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACd,CAAC;gBACD,OAAO,wDAAwD,CAAC;YACjE,CAAC;YAED,IAAI,aAAa,GAAG,KAAK,CAAC;YAC1B,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;gBACjC,MAAM,aAAa,GAAG,MAAM,2BAA2B,CACtD,EAAE,EACF,cAAc,EACd,mBAAmB,CACnB,CAAC;gBACF,IAAI,aAAa,KAAK,IAAI,EAAE,CAAC;oBAC5B,IAAI,wBAAwB,EAAE,EAAE,CAAC;wBAChC,IAAI,EAAE,CAAC,SAAS,EAAE,CAAC;4BAClB,OAAO;gCACN,GAAG,cAAc,CAAC,EAAE,EAAE,mBAAmB,CAAC;gCAC1C,EAAE;gCACF,YAAY,CAAC,EAAE,EAAE,sBAAsB,EAAE,SAAS,CAAC;gCACnD,YAAY,CACX,EAAE,EACF,0EAA0E,EAC1E,OAAO,CACP;6BACD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;wBACd,CAAC;wBACD,OAAO,sBAAsB,CAAC;oBAC/B,CAAC;oBACD,IAAI,EAAE,CAAC,SAAS,EAAE,CAAC;wBAClB,OAAO;4BACN,GAAG,cAAc,CAAC,EAAE,EAAE,mBAAmB,CAAC;4BAC1C,EAAE;4BACF,YAAY,CAAC,EAAE,EAAE,yBAAyB,EAAE,SAAS,CAAC;4BACtD,YAAY,CACX,EAAE,EACF,uCAAuC,EACvC,QAAQ,CACR;yBACD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBACd,CAAC;oBACD,OAAO,+DAA+D,CAAC;gBACxE,CAAC;gBACD,aAAa,GAAG,aAAa,GAAG,CAAC,CAAC;YACnC,CAAC;YAED,MAAM,eAAe,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;YAClE,IAAI,eAAe,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;gBACjC,IAAI,EAAE,CAAC,SAAS,EAAE,CAAC;oBAClB,OAAO;wBACN,GAAG,cAAc,CAAC,EAAE,EAAE,mBAAmB,CAAC;wBAC1C,EAAE;wBACF,YAAY,CACX,EAAE,EACF,wCAAwC,EACxC,QAAQ,CACR;qBACD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACd,CAAC;gBACD,OAAO,wCAAwC,CAAC;YACjD,CAAC;YAYD,MAAM,OAAO,GAAG,MAAM,6BAA6B,CAClD,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE;gBAC1B,MAAM,OAAO,GAAG,OAAO,CAAC;gBACxB,MAAM,QAAQ,GAAG,OAAO,EAAE,QAAQ,IAAI,EAAE,CAAC;gBACzC,MAAM,WAAW,GAAG,CAAC,aAAa,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;gBAC7C,IACC,CAAC,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC;oBAC9B,WAAW,GAAG,CAAC;oBACf,WAAW,IAAI,QAAQ,CAAC,MAAM,EAC7B,CAAC;oBACF,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,YAAY,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC;gBAC3D,CAAC;gBAED,MAAM,OAAO,GAAG,QAAQ,CAAC,WAAW,CAAC,CAAC;gBACtC,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC;oBAC1B,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;gBAC9B,CAAC;gBAED,MAAM,aAAa,GAAG,OAAO,CAAC,YAAY,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;gBACzD,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBAClC,OAAO,OAAO,CAAC,YAAY,CAAC;gBAC7B,CAAC;qBAAM,CAAC;oBACP,OAAO,CAAC,YAAY,GAAG,eAAe,CAAC;gBACxC,CAAC;gBAED,IAAI,CAAC;oBACJ,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;gBACxB,CAAC;gBAAC,OAAO,SAAS,EAAE,CAAC;oBACpB,OAAO,CAAC,qCAAqC,EAAE;wBAC9C,KAAK,EAAE,MAAM,CAAC,SAAS,CAAC;qBACxB,CAAC,CAAC;oBACH,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;gBAChC,CAAC;gBAED,MAAM,YAAY,GAAG,yBAAyB,CAAC,OAAO,EAAE,WAAW,EAAE;oBACpE,SAAS;iBACT,CAAC,CAAC;gBACH,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,aAAa,EAAE,CAAC;YACpD,CAAC,CACD,CAAC;YAEF,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;gBAChC,IAAI,EAAE,CAAC,SAAS,EAAE,CAAC;oBAClB,OAAO;wBACN,GAAG,cAAc,CAAC,EAAE,EAAE,mBAAmB,CAAC;wBAC1C,EAAE;wBACF,YAAY,CACX,EAAE,EACF,2BAA2B,aAAa,EAAE,EAC1C,QAAQ,CACR;wBACD,gBAAgB,CACf,EAAE,EACF,aAAa,EACb,KAAK,OAAO,CAAC,YAAY,EAAE,EAC3B,OAAO,CACP;qBACD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACd,CAAC;gBACD,OAAO,2BAA2B,aAAa,sBAAsB,OAAO,CAAC,YAAY,EAAE,CAAC;YAC7F,CAAC;YAED,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;gBAClC,OAAO,WAAW,aAAa,aAAa,CAAC;YAC9C,CAAC;YAED,IAAI,OAAO,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;gBACpC,2DAA2D;gBAC3D,+DAA+D;gBAC/D,+DAA+D;gBAC/D,6DAA6D;gBAC7D,qBAAqB;gBACrB,IAAI,EAAE,CAAC,SAAS,EAAE,CAAC;oBAClB,OAAO;wBACN,GAAG,cAAc,CAAC,EAAE,EAAE,mBAAmB,CAAC;wBAC1C,EAAE;wBACF,YAAY,CACX,EAAE,EACF,mCAAmC,aAAa,yCAAyC,EACzF,QAAQ,CACR;qBACD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACd,CAAC;gBACD,OAAO,mCAAmC,aAAa,yCAAyC,CAAC;YAClG,CAAC;YAED,IAAI,uBAAuB,CAAC,OAAO,EAAE,CAAC;gBACrC,MAAM,eAAe,GAAG,MAAM,cAAc,CAAC,YAAY,EAAE,CAAC;gBAC5D,uBAAuB,CAAC,OAAO,GAAG,eAAe,CAAC;gBAClD,wBAAwB,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;YACrE,CAAC;YAED,MAAM,EAAE,YAAY,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC;YAChD,IAAI,EAAE,CAAC,SAAS,EAAE,CAAC;gBAClB,MAAM,UAAU,GACf,eAAe,CAAC,MAAM,KAAK,CAAC;oBAC3B,CAAC,CAAC,qBAAqB,YAAY,EAAE;oBACrC,CAAC,CAAC,iBAAiB,YAAY,QAAQ,eAAe,GAAG,CAAC;gBAC5D,MAAM,YAAY,GACjB,aAAa,CAAC,MAAM,GAAG,CAAC;oBACvB,CAAC,CAAC,gBAAgB,CAAC,EAAE,EAAE,gBAAgB,EAAE,aAAa,EAAE,OAAO,CAAC;oBAChE,CAAC,CAAC,gBAAgB,CAAC,EAAE,EAAE,gBAAgB,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;gBAC5D,OAAO;oBACN,GAAG,cAAc,CAAC,EAAE,EAAE,mBAAmB,CAAC;oBAC1C,EAAE;oBACF,YAAY,CACX,EAAE,EACF,GAAG,eAAe,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,UAAU,EAAE,EAC5C,SAAS,CACT;oBACD,YAAY;iBACZ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACd,CAAC;YAED,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAClC,OAAO,qBAAqB,YAAY,EAAE,CAAC;YAC5C,CAAC;YACD,OAAO,iBAAiB,YAAY,QAAQ,eAAe,GAAG,CAAC;QAChE,CAAC;KACD,CAAC,CAAC;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"codex-refresh.d.ts","sourceRoot":"","sources":["../../../lib/tools/codex-refresh.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAQ,KAAK,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAKrE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,WAAW,GAAG,cAAc,CAqFvE"}
1
+ {"version":3,"file":"codex-refresh.d.ts","sourceRoot":"","sources":["../../../lib/tools/codex-refresh.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAQ,KAAK,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAKrE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAoE9C,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,WAAW,GAAG,cAAc,CAoIvE"}
@@ -3,10 +3,38 @@
3
3
  * Extracted from `index.ts` per RC-1 Phase 2.
4
4
  */
5
5
  import { tool } from "@opencode-ai/plugin/tool";
6
- import { loadAccounts, saveAccounts } from "../storage.js";
6
+ import { loadAccounts, withAccountStorageTransaction } from "../storage.js";
7
7
  import { AccountManager } from "../accounts.js";
8
8
  import { queuedRefresh } from "../refresh-queue.js";
9
9
  import { formatUiHeader, formatUiItem, paintUiText } from "../ui/format.js";
10
+ /**
11
+ * Finds the index of the account matching `identity` in `accounts`, using
12
+ * the same organizationId -> accountId -> refreshToken priority order the
13
+ * storage layer's dedup/identity helpers use elsewhere (see
14
+ * `lib/storage/identity.ts`). Kept local rather than importing the shared
15
+ * helper because the barrel does not currently re-export it.
16
+ */
17
+ function findAccountIndexByIdentity(accounts, identity) {
18
+ const organizationId = identity.organizationId?.trim();
19
+ if (organizationId) {
20
+ const idx = accounts.findIndex((a) => a.organizationId?.trim() === organizationId);
21
+ if (idx >= 0)
22
+ return idx;
23
+ }
24
+ const accountId = identity.accountId?.trim();
25
+ if (accountId) {
26
+ const idx = accounts.findIndex((a) => a.accountId?.trim() === accountId);
27
+ if (idx >= 0)
28
+ return idx;
29
+ }
30
+ const refreshToken = identity.refreshToken?.trim();
31
+ if (refreshToken) {
32
+ const idx = accounts.findIndex((a) => a.refreshToken?.trim() === refreshToken);
33
+ if (idx >= 0)
34
+ return idx;
35
+ }
36
+ return -1;
37
+ }
10
38
  export function createCodexRefreshTool(ctx) {
11
39
  const { resolveUiRuntime, formatCommandAccountLabel, resolveMaskEmail, getStatusMarker, cachedAccountManagerRef, accountManagerPromiseRef, } = ctx;
12
40
  return tool({
@@ -32,17 +60,36 @@ export function createCodexRefreshTool(ctx) {
32
60
  : [`Refreshing ${storage.accounts.length} account(s):`, ""];
33
61
  let refreshedCount = 0;
34
62
  let failedCount = 0;
63
+ // Collected here, applied to a freshly re-read snapshot in a single
64
+ // transaction after all (network-bound, multi-second) refreshes
65
+ // complete -- see the module doc comment on RefreshOutcome. Holding
66
+ // the storage lock across queuedRefresh calls would block every
67
+ // other tool/rotation for the full duration of this loop, and
68
+ // mutating `storage` in place and saving it at the end (the old
69
+ // behavior) silently clobbered any rate-limit/cooldown/activeIndex
70
+ // state a concurrent rotation persisted while this loop was running.
71
+ const refreshedAccounts = [];
35
72
  for (let i = 0; i < storage.accounts.length; i++) {
36
73
  const account = storage.accounts[i];
37
74
  if (!account)
38
75
  continue;
39
76
  const label = formatCommandAccountLabel(account, i, { maskEmail });
77
+ const identity = {
78
+ organizationId: account.organizationId,
79
+ accountId: account.accountId,
80
+ refreshToken: account.refreshToken,
81
+ };
40
82
  try {
41
83
  const refreshResult = await queuedRefresh(account.refreshToken);
42
84
  if (refreshResult.type === "success") {
43
- account.refreshToken = refreshResult.refresh;
44
- account.accessToken = refreshResult.access;
45
- account.expiresAt = refreshResult.expires;
85
+ const rotated = refreshResult.refresh !== account.refreshToken;
86
+ refreshedAccounts.push({
87
+ identity,
88
+ refreshToken: refreshResult.refresh,
89
+ accessToken: refreshResult.access,
90
+ expiresAt: refreshResult.expires,
91
+ rotatedAt: rotated ? Date.now() : undefined,
92
+ });
46
93
  results.push(` ${getStatusMarker(ui, "ok")} ${label}: Refreshed`);
47
94
  refreshedCount++;
48
95
  }
@@ -57,7 +104,35 @@ export function createCodexRefreshTool(ctx) {
57
104
  failedCount++;
58
105
  }
59
106
  }
60
- await saveAccounts(storage);
107
+ if (refreshedAccounts.length > 0) {
108
+ await withAccountStorageTransaction(async (current, persist) => {
109
+ if (!current)
110
+ return;
111
+ for (const outcome of refreshedAccounts) {
112
+ const idx = findAccountIndexByIdentity(current.accounts, outcome.identity);
113
+ if (idx < 0)
114
+ continue; // Account removed concurrently; nothing to apply.
115
+ const target = current.accounts[idx];
116
+ if (!target)
117
+ continue;
118
+ // The refresh was keyed off `outcome.identity.refreshToken` (the
119
+ // pre-refresh value). If the on-disk refreshToken no longer
120
+ // matches it, another process rotated this account mid-flight
121
+ // while our (network-bound) refresh was in progress -- we
122
+ // cannot know which resulting chain is the live one, so skip
123
+ // rather than clobber whatever that other process wrote.
124
+ if (target.refreshToken !== outcome.identity.refreshToken)
125
+ continue;
126
+ target.refreshToken = outcome.refreshToken;
127
+ target.accessToken = outcome.accessToken;
128
+ target.expiresAt = outcome.expiresAt;
129
+ if (outcome.rotatedAt !== undefined) {
130
+ target.tokenRotatedAt = outcome.rotatedAt;
131
+ }
132
+ }
133
+ await persist(current);
134
+ });
135
+ }
61
136
  if (cachedAccountManagerRef.current) {
62
137
  const reloadedManager = await AccountManager.loadFromDisk();
63
138
  cachedAccountManagerRef.current = reloadedManager;
@@ -1 +1 @@
1
- {"version":3,"file":"codex-refresh.js","sourceRoot":"","sources":["../../../lib/tools/codex-refresh.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"codex-refresh.js","sourceRoot":"","sources":["../../../lib/tools/codex-refresh.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"codex-remove.d.ts","sourceRoot":"","sources":["../../../lib/tools/codex-remove.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAQ,KAAK,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAWrE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,WAAW,GAAG,cAAc,CA+OtE"}
1
+ {"version":3,"file":"codex-remove.d.ts","sourceRoot":"","sources":["../../../lib/tools/codex-remove.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAQ,KAAK,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAWrE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,WAAW,GAAG,cAAc,CA8RtE"}
@@ -3,7 +3,7 @@
3
3
  * Extracted from `index.ts` per RC-1 Phase 2.
4
4
  */
5
5
  import { tool } from "@opencode-ai/plugin/tool";
6
- import { loadAccounts, saveAccounts } from "../storage.js";
6
+ import { loadAccounts, withAccountStorageTransaction } from "../storage.js";
7
7
  import { AccountManager } from "../accounts.js";
8
8
  import { resolveDisplayEmail } from "../account-display.js";
9
9
  import { logWarn } from "../logger.js";
@@ -43,8 +43,12 @@ export function createCodexRemoveTool(ctx) {
43
43
  }
44
44
  return guidance;
45
45
  }
46
- const storage = await loadAccounts();
47
- if (!storage || storage.accounts.length === 0) {
46
+ // Read-only snapshot for the "no accounts" / interactive-picker UX.
47
+ // The actual mutate+save runs inside withAccountStorageTransaction
48
+ // below against a freshly re-read snapshot so a concurrent save
49
+ // between this read and the eventual persist can't be clobbered.
50
+ const initialStorage = await loadAccounts();
51
+ if (!initialStorage || initialStorage.accounts.length === 0) {
48
52
  if (ui.v2Enabled) {
49
53
  return [
50
54
  ...formatUiHeader(ui, "Remove account"),
@@ -56,7 +60,7 @@ export function createCodexRemoveTool(ctx) {
56
60
  }
57
61
  let resolvedIndex = index;
58
62
  if (resolvedIndex === undefined) {
59
- const selectedIndex = await promptAccountIndexSelection(ui, storage, "Remove account");
63
+ const selectedIndex = await promptAccountIndexSelection(ui, initialStorage, "Remove account");
60
64
  if (selectedIndex === null) {
61
65
  if (supportsInteractiveMenus()) {
62
66
  if (ui.v2Enabled) {
@@ -81,81 +85,106 @@ export function createCodexRemoveTool(ctx) {
81
85
  }
82
86
  resolvedIndex = selectedIndex + 1;
83
87
  }
84
- const targetIndex = Math.floor((resolvedIndex ?? 0) - 1);
85
- if (!Number.isFinite(targetIndex) ||
86
- targetIndex < 0 ||
87
- targetIndex >= storage.accounts.length) {
88
+ const outcome = await withAccountStorageTransaction(async (current, persist) => {
89
+ const storage = current;
90
+ const accounts = storage?.accounts ?? [];
91
+ const targetIndex = (resolvedIndex ?? 0) - 1;
92
+ if (!Number.isInteger(targetIndex) ||
93
+ targetIndex < 0 ||
94
+ targetIndex >= accounts.length) {
95
+ return { kind: "invalid", accountCount: accounts.length };
96
+ }
97
+ const account = accounts[targetIndex];
98
+ if (!account || !storage) {
99
+ return { kind: "not-found" };
100
+ }
101
+ const label = formatCommandAccountLabel(account, targetIndex, {
102
+ maskEmail,
103
+ });
104
+ storage.accounts.splice(targetIndex, 1);
105
+ if (storage.accounts.length === 0) {
106
+ storage.activeIndex = 0;
107
+ storage.activeIndexByFamily = {};
108
+ }
109
+ else {
110
+ if (storage.activeIndex >= storage.accounts.length) {
111
+ storage.activeIndex = 0;
112
+ }
113
+ else if (storage.activeIndex > targetIndex) {
114
+ storage.activeIndex -= 1;
115
+ }
116
+ if (storage.activeIndexByFamily) {
117
+ for (const family of MODEL_FAMILIES) {
118
+ const idx = storage.activeIndexByFamily[family];
119
+ if (typeof idx === "number") {
120
+ if (idx >= storage.accounts.length) {
121
+ storage.activeIndexByFamily[family] = 0;
122
+ }
123
+ else if (idx > targetIndex) {
124
+ storage.activeIndexByFamily[family] = idx - 1;
125
+ }
126
+ }
127
+ }
128
+ }
129
+ }
130
+ try {
131
+ await persist(storage);
132
+ }
133
+ catch (saveError) {
134
+ logWarn("Failed to save account removal", {
135
+ error: String(saveError),
136
+ });
137
+ return { kind: "save-failed", label };
138
+ }
139
+ const remaining = storage.accounts.length;
140
+ const matchingEmailRemaining = account.email?.trim()
141
+ ? storage.accounts.filter((entry) => entry.email === account.email)
142
+ .length
143
+ : 0;
144
+ return {
145
+ kind: "ok",
146
+ label,
147
+ remaining,
148
+ matchingEmailRemaining,
149
+ removedEmail: account.email,
150
+ };
151
+ });
152
+ if (outcome.kind === "invalid") {
88
153
  if (ui.v2Enabled) {
89
154
  return [
90
155
  ...formatUiHeader(ui, "Remove account"),
91
156
  "",
92
157
  formatUiItem(ui, `Invalid account number: ${resolvedIndex}`, "danger"),
93
- formatUiKeyValue(ui, "Valid range", `1-${storage.accounts.length}`, "muted"),
158
+ formatUiKeyValue(ui, "Valid range", `1-${outcome.accountCount}`, "muted"),
94
159
  formatUiItem(ui, "Use codex-list to list all accounts.", "accent"),
95
160
  ].join("\n");
96
161
  }
97
- return `Invalid account number: ${resolvedIndex}\n\nValid range: 1-${storage.accounts.length}\n\nUse codex-list to list all accounts.`;
162
+ return `Invalid account number: ${resolvedIndex}\n\nValid range: 1-${outcome.accountCount}\n\nUse codex-list to list all accounts.`;
98
163
  }
99
- const account = storage.accounts[targetIndex];
100
- if (!account) {
164
+ if (outcome.kind === "not-found") {
101
165
  return `Account ${resolvedIndex} not found.`;
102
166
  }
103
- const label = formatCommandAccountLabel(account, targetIndex, { maskEmail });
104
- storage.accounts.splice(targetIndex, 1);
105
- if (storage.accounts.length === 0) {
106
- storage.activeIndex = 0;
107
- storage.activeIndexByFamily = {};
108
- }
109
- else {
110
- if (storage.activeIndex >= storage.accounts.length) {
111
- storage.activeIndex = 0;
112
- }
113
- else if (storage.activeIndex > targetIndex) {
114
- storage.activeIndex -= 1;
115
- }
116
- if (storage.activeIndexByFamily) {
117
- for (const family of MODEL_FAMILIES) {
118
- const idx = storage.activeIndexByFamily[family];
119
- if (typeof idx === "number") {
120
- if (idx >= storage.accounts.length) {
121
- storage.activeIndexByFamily[family] = 0;
122
- }
123
- else if (idx > targetIndex) {
124
- storage.activeIndexByFamily[family] = idx - 1;
125
- }
126
- }
127
- }
128
- }
129
- }
130
- try {
131
- await saveAccounts(storage);
132
- }
133
- catch (saveError) {
134
- logWarn("Failed to save account removal", {
135
- error: String(saveError),
136
- });
167
+ if (outcome.kind === "save-failed") {
168
+ // The transaction only mutated its in-memory snapshot; the
169
+ // persist() call that would have made the removal durable
170
+ // threw, so the account was never actually removed. Wording
171
+ // must not imply it was.
137
172
  if (ui.v2Enabled) {
138
173
  return [
139
174
  ...formatUiHeader(ui, "Remove account"),
140
175
  "",
141
- formatUiItem(ui, `Removed selected entry: ${label}`, "warning"),
142
- formatUiItem(ui, "Only the selected index was changed.", "muted"),
143
- formatUiItem(ui, "Failed to persist. Change may be lost on restart.", "danger"),
176
+ formatUiItem(ui, `Failed to remove ${outcome.label}: account storage could not be updated.`, "danger"),
144
177
  ].join("\n");
145
178
  }
146
- return `Removed selected entry: ${label} from memory, but failed to persist. Only the selected index was changed and this may be lost on restart.`;
179
+ return `Failed to remove ${outcome.label}: account storage could not be updated.`;
147
180
  }
148
181
  if (cachedAccountManagerRef.current) {
149
182
  const reloadedManager = await AccountManager.loadFromDisk();
150
183
  cachedAccountManagerRef.current = reloadedManager;
151
184
  accountManagerPromiseRef.current = Promise.resolve(reloadedManager);
152
185
  }
153
- const remaining = storage.accounts.length;
154
- const matchingEmailRemaining = account.email?.trim()
155
- ? storage.accounts.filter((entry) => entry.email === account.email)
156
- .length
157
- : 0;
158
- const displayEmail = resolveDisplayEmail(account.email, maskEmail);
186
+ const { label, remaining, matchingEmailRemaining, removedEmail } = outcome;
187
+ const displayEmail = resolveDisplayEmail(removedEmail, maskEmail);
159
188
  if (ui.v2Enabled) {
160
189
  const postRemoveHint = matchingEmailRemaining > 0 && displayEmail
161
190
  ? formatUiItem(ui, `Other entries for ${displayEmail} remain: ${matchingEmailRemaining}`, "muted")
@@ -1 +1 @@
1
- {"version":3,"file":"codex-remove.js","sourceRoot":"","sources":["../../../lib/tools/codex-remove.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"codex-remove.js","sourceRoot":"","sources":["../../../lib/tools/codex-remove.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"codex-reset.d.ts","sourceRoot":"","sources":["../../../lib/tools/codex-reset.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAQ,KAAK,cAAc,EAAE,MAAM,0BAA0B,CAAC;AA6BrE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAqE9C,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,WAAW,GAAG,cAAc,CA4RrE"}
1
+ {"version":3,"file":"codex-reset.d.ts","sourceRoot":"","sources":["../../../lib/tools/codex-reset.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAQ,KAAK,cAAc,EAAE,MAAM,0BAA0B,CAAC;AA8BrE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAqE9C,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,WAAW,GAAG,cAAc,CA0TrE"}
@@ -233,11 +233,40 @@ export function createCodexResetTool(ctx) {
233
233
  : ' not redeemed. Re-run with confirm=true to redeem this credit.',
234
234
  ].join("\n");
235
235
  }
236
- const result = await consumeCodexResetCredit({
237
- ...request,
238
- creditId: credit.id,
239
- redeemRequestId: createRedeemRequestId(),
240
- });
236
+ let result;
237
+ try {
238
+ result = await consumeCodexResetCredit({
239
+ ...request,
240
+ creditId: credit.id,
241
+ redeemRequestId: createRedeemRequestId(credit.id),
242
+ });
243
+ }
244
+ catch (error) {
245
+ // The POST may have reached the backend before the failure
246
+ // (timeout, dropped response), so the redemption outcome is
247
+ // genuinely unknown — reporting `redeemed: false` here could
248
+ // send the user to spend a second credit. The idempotency key
249
+ // is derived from the credit id, so retrying the SAME credit
250
+ // is safe; the guidance below is about picking a different one.
251
+ const consumeError = (error instanceof Error ? error.message : String(error)).slice(0, 160);
252
+ if (outputFormat === "json") {
253
+ return renderJsonOutput({
254
+ ...identity,
255
+ action: "consume",
256
+ redeemed: null,
257
+ reason: "consume-failed",
258
+ credit,
259
+ error: consumeError,
260
+ message: `The consume request failed but may have reached the backend. Run codex-reset (status) and check whether ${credit.id} is still available before redeeming another credit.`,
261
+ });
262
+ }
263
+ return [
264
+ `${displayLabel}:`,
265
+ ` Error: ${consumeError}`,
266
+ " redemption outcome unknown: the request may have reached the backend.",
267
+ ` Run codex-reset (status) and check whether ${credit.id} is still available before redeeming another credit.`,
268
+ ].join("\n");
269
+ }
241
270
  // Past this point the credit is spent and cannot be recovered. The
242
271
  // usage refresh below is a courtesy read, so its failure must never
243
272
  // reach the outer catch: reporting `redeemed: false` for a credit the