oc-codex-multi-auth 6.8.0 → 6.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 (77) 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 +41 -3
  29. package/dist/lib/request/fetch-helpers.js.map +1 -1
  30. package/dist/lib/request/helpers/user-agent.d.ts +9 -0
  31. package/dist/lib/request/helpers/user-agent.d.ts.map +1 -0
  32. package/dist/lib/request/helpers/user-agent.js +40 -0
  33. package/dist/lib/request/helpers/user-agent.js.map +1 -0
  34. package/dist/lib/request/request-transformer.d.ts +10 -0
  35. package/dist/lib/request/request-transformer.d.ts.map +1 -1
  36. package/dist/lib/request/request-transformer.js +20 -0
  37. package/dist/lib/request/request-transformer.js.map +1 -1
  38. package/dist/lib/request/response-handler.d.ts.map +1 -1
  39. package/dist/lib/request/response-handler.js +28 -5
  40. package/dist/lib/request/response-handler.js.map +1 -1
  41. package/dist/lib/schemas.d.ts +3 -0
  42. package/dist/lib/schemas.d.ts.map +1 -1
  43. package/dist/lib/schemas.js +1 -0
  44. package/dist/lib/schemas.js.map +1 -1
  45. package/dist/lib/storage/migrations.d.ts +7 -0
  46. package/dist/lib/storage/migrations.d.ts.map +1 -1
  47. package/dist/lib/storage/migrations.js.map +1 -1
  48. package/dist/lib/storage.d.ts +1 -1
  49. package/dist/lib/storage.d.ts.map +1 -1
  50. package/dist/lib/storage.js +10 -1
  51. package/dist/lib/storage.js.map +1 -1
  52. package/dist/lib/tools/codex-keychain.d.ts.map +1 -1
  53. package/dist/lib/tools/codex-keychain.js +153 -77
  54. package/dist/lib/tools/codex-keychain.js.map +1 -1
  55. package/dist/lib/tools/codex-label.d.ts.map +1 -1
  56. package/dist/lib/tools/codex-label.js +60 -34
  57. package/dist/lib/tools/codex-label.js.map +1 -1
  58. package/dist/lib/tools/codex-refresh.d.ts.map +1 -1
  59. package/dist/lib/tools/codex-refresh.js +80 -5
  60. package/dist/lib/tools/codex-refresh.js.map +1 -1
  61. package/dist/lib/tools/codex-remove.d.ts.map +1 -1
  62. package/dist/lib/tools/codex-remove.js +85 -56
  63. package/dist/lib/tools/codex-remove.js.map +1 -1
  64. package/dist/lib/tools/codex-reset.d.ts.map +1 -1
  65. package/dist/lib/tools/codex-reset.js +34 -5
  66. package/dist/lib/tools/codex-reset.js.map +1 -1
  67. package/dist/lib/tools/codex-switch.d.ts.map +1 -1
  68. package/dist/lib/tools/codex-switch.js +57 -35
  69. package/dist/lib/tools/codex-switch.js.map +1 -1
  70. package/dist/lib/tui-quota-cache.d.ts +8 -0
  71. package/dist/lib/tui-quota-cache.d.ts.map +1 -1
  72. package/dist/lib/tui-quota-cache.js +13 -0
  73. package/dist/lib/tui-quota-cache.js.map +1 -1
  74. package/dist/tui.d.ts.map +1 -1
  75. package/dist/tui.js +17 -5
  76. package/dist/tui.js.map +1 -1
  77. package/package.json +153 -153
@@ -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
@@ -1 +1 @@
1
- {"version":3,"file":"codex-reset.js","sourceRoot":"","sources":["../../../lib/tools/codex-reset.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"codex-reset.js","sourceRoot":"","sources":["../../../lib/tools/codex-reset.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,IAAI,EAAuB,MAAM,0BAA0B,CAAC;AAErE,OAAO,EACN,uBAAuB,EACvB,qBAAqB,EACrB,sBAAsB,EACtB,6BAA6B,EAC7B,sBAAsB,EACtB,sBAAsB,EACtB,sBAAsB,GAGtB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACN,2BAA2B,EAC3B,eAAe,EACf,uBAAuB,EACvB,qBAAqB,EACrB,cAAc,EACd,sBAAsB,EACtB,0BAA0B,GAE1B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EACN,cAAc,EACd,YAAY,EACZ,gBAAgB,GAChB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,yBAAyB,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAa5E,SAAS,oBAAoB,CAAC,MAAe;IAC5C,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,QAAQ;QAAE,OAAO,QAAQ,CAAC;IACjE,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC3C,MAAM,IAAI,KAAK,CACd,mBAAmB,MAAM,oCAAoC,CAC7D,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,SAAS,wBAAwB,CAChC,YAAoB,EACpB,WAAmB,EACnB,OAAgB;IAEhB,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO,WAAW,CAAC;IAC9C,IACC,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC;QAC1B,OAAO,GAAG,CAAC;QACX,OAAO,GAAG,YAAY,EACrB,CAAC;QACF,MAAM,IAAI,KAAK,CACd,mBAAmB,OAAO,gBAAgB,YAAY,GAAG,CACzD,CAAC;IACH,CAAC;IACD,OAAO,OAAO,GAAG,CAAC,CAAC;AACpB,CAAC;AAED,SAAS,eAAe,CAAC,KAAwB;IAChD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;QACvD,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC;YAAE,SAAS;QACtC,KAAK,CAAC,IAAI,CACT,KAAK,qBAAqB,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,uBAAuB,CAAC,MAAM,CAAC,EAAE,CACtF,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACd,CAAC;AAED,SAAS,gBAAgB,CAAC,OAAiC;IAC1D,MAAM,KAAK,GAAG;QACb,mBAAmB,OAAO,CAAC,cAAc,YAAY;KACrD,CAAC;IACF,KAAK,MAAM,MAAM,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACtC,KAAK,CAAC,IAAI,CAAC,KAAK,sBAAsB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAClD,IAAI,MAAM,CAAC,KAAK;YAAE,KAAK,CAAC,IAAI,CAAC,UAAU,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC;IACzD,CAAC;IACD,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClC,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IAChC,CAAC;IACD,OAAO,KAAK,CAAC;AACd,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,GAAgB;IACpD,MAAM,EACL,gBAAgB,EAChB,kBAAkB,EAClB,yBAAyB,EACzB,gBAAgB,EAChB,wBAAwB,EACxB,6BAA6B,GAC7B,GAAG,GAAG,CAAC;IAER,OAAO,IAAI,CAAC;QACX,WAAW,EACV,qJAAqJ;QACtJ,IAAI,EAAE;YACL,MAAM,EAAE,IAAI,CAAC,MAAM;iBACjB,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CACR,0FAA0F,CAC1F;YACF,QAAQ,EAAE,IAAI,CAAC,MAAM;iBACnB,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CACR,yEAAyE,CACzE;YACF,OAAO,EAAE,IAAI,CAAC,MAAM;iBAClB,OAAO,EAAE;iBACT,QAAQ,EAAE;iBACV,QAAQ,CACR,sGAAsG,CACtG;YACF,MAAM,EAAE,IAAI,CAAC,MAAM;iBACjB,OAAO,EAAE;iBACT,QAAQ,EAAE;iBACV,QAAQ,CAAC,qDAAqD,CAAC;YACjE,OAAO,EAAE,IAAI,CAAC,MAAM;iBAClB,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CACR,yEAAyE,CACzE;YACF,MAAM,EAAE,IAAI,CAAC,MAAM;iBACjB,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,4CAA4C,CAAC;YACxD,gBAAgB,EAAE,IAAI,CAAC,MAAM;iBAC3B,OAAO,EAAE;iBACT,QAAQ,EAAE;iBACV,QAAQ,CACR,wFAAwF,CACxF;SACF;QACD,KAAK,CAAC,OAAO,CAAC,EACb,MAAM,EACN,QAAQ,EACR,OAAO,EACP,MAAM,EACN,OAAO,EACP,MAAM,EACN,gBAAgB,MACG,EAAE;YACrB,MAAM,EAAE,GAAG,gBAAgB,EAAE,CAAC;YAC9B,MAAM,SAAS,GAAG,gBAAgB,EAAE,CAAC;YACrC,MAAM,YAAY,GAAG,yBAAyB,CAAC,MAAM,CAAC,CAAC;YACvD,MAAM,WAAW,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAC;YACjD,MAAM,sBAAsB,GAAG,gBAAgB,KAAK,IAAI,CAAC;YAEzD,MAAM,OAAO,GAAG,MAAM,YAAY,EAAE,CAAC;YACrC,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC/C,IAAI,YAAY,KAAK,MAAM,EAAE,CAAC;oBAC7B,OAAO,gBAAgB,CAAC;wBACvB,OAAO,EAAE,wDAAwD;wBACjE,MAAM,EAAE,WAAW;wBACnB,OAAO,EAAE,EAAE;wBACX,cAAc,EAAE,CAAC;qBACjB,CAAC,CAAC;gBACJ,CAAC;gBACD,IAAI,EAAE,CAAC,SAAS,EAAE,CAAC;oBAClB,OAAO;wBACN,GAAG,cAAc,CAAC,EAAE,EAAE,aAAa,CAAC;wBACpC,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,MAAM,WAAW,GAAG,kBAAkB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YACzD,MAAM,KAAK,GAAG,wBAAwB,CACrC,OAAO,CAAC,QAAQ,CAAC,MAAM,EACvB,WAAW,EACX,OAAO,CACP,CAAC;YACF,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YACvC,IAAI,CAAC,MAAM,EAAE,CAAC;gBACb,MAAM,IAAI,KAAK,CAAC,0BAA0B,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC;YACzD,CAAC;YACD,MAAM,KAAK,GAAG,yBAAyB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YACvD,MAAM,YAAY,GAAG,yBAAyB,CAAC,MAAM,EAAE,KAAK,EAAE;gBAC7D,SAAS;aACT,CAAC,CAAC;YACH,MAAM,QAAQ,GAAG,wBAAwB,CAAC,KAAK,EAAE;gBAChD,gBAAgB,EAAE,sBAAsB;gBACxC,OAAO,EAAE,MAAM;gBACf,KAAK;aACL,CAAC,CAAC;YAEH,IAAI,CAAC;gBACJ,MAAM,WAAW,GAAG,MAAM,2BAA2B,CAAC;oBACrD,OAAO;oBACP,OAAO,EAAE,MAAM;iBACf,CAAC,CAAC;gBACH,IAAI,WAAW,CAAC,SAAS;oBAAE,6BAA6B,EAAE,CAAC;gBAE3D,MAAM,SAAS,GAAG,0BAA0B,CAAC;oBAC5C,OAAO,EAAE,MAAM;oBACf,WAAW,EAAE,WAAW,CAAC,WAAW;iBACpC,CAAC,CAAC;gBACH,IAAI,CAAC,SAAS;oBAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;gBAEtD,MAAM,OAAO,GAAG;oBACf,SAAS;oBACT,WAAW,EAAE,WAAW,CAAC,WAAW;oBACpC,cAAc,EAAE,MAAM,CAAC,cAAc;iBACrC,CAAC;gBACF,IAAI,WAAW,KAAK,QAAQ,EAAE,CAAC;oBAC9B,iEAAiE;oBACjE,uDAAuD;oBACvD,MAAM,CAAC,cAAc,EAAE,YAAY,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;wBACxD,sBAAsB,CAAC,OAAO,CAAC;wBAC/B,eAAe,CAAC,OAAO,CAAC;qBACxB,CAAC,CAAC;oBACH,MAAM,OAAO,GAAG,sBAAsB,CAAC,cAAc,CAAC,CAAC;oBACvD,MAAM,KAAK,GAAG,sBAAsB,CAAC,YAAY,CAAC,CAAC;oBAEnD,IAAI,YAAY,KAAK,MAAM,EAAE,CAAC;wBAC7B,OAAO,gBAAgB,CAAC;4BACvB,GAAG,QAAQ;4BACX,MAAM,EAAE,QAAQ;4BAChB,cAAc,EAAE,OAAO,CAAC,cAAc;4BACtC,OAAO,EAAE,OAAO,CAAC,OAAO;4BACxB,QAAQ,EAAE,KAAK,CAAC,QAAQ;4BACxB,MAAM,EAAE,KAAK,CAAC,MAAM;yBACpB,CAAC,CAAC;oBACJ,CAAC;oBACD,MAAM,KAAK,GAAG,EAAE,CAAC,SAAS;wBACzB,CAAC,CAAC,CAAC,GAAG,cAAc,CAAC,EAAE,EAAE,aAAa,CAAC,EAAE,EAAE,CAAC;wBAC5C,CAAC,CAAC,EAAE,CAAC;oBACN,KAAK,CAAC,IAAI,CAAC,GAAG,YAAY,GAAG,CAAC,CAAC;oBAC/B,KAAK,CAAC,IAAI,CAAC,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC;oBACzC,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,gBAAgB,CAAC,CAAC;oBACjC,KAAK,CAAC,IAAI,CAAC,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC;oBACtC,IAAI,OAAO,CAAC,cAAc,GAAG,CAAC,EAAE,CAAC;wBAChC,KAAK,CAAC,IAAI,CACT,EAAE,EACF,wDAAwD,CACxD,CAAC;oBACH,CAAC;oBACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACzB,CAAC;gBAED,MAAM,OAAO,GAAG,sBAAsB,CACrC,MAAM,sBAAsB,CAAC,OAAO,CAAC,CACrC,CAAC;gBACF,MAAM,SAAS,GAAG,sBAAsB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;gBAC5D,IAAI,SAAS,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;oBACnC,MAAM,OAAO,GACZ,SAAS,CAAC,IAAI,KAAK,WAAW;wBAC7B,CAAC,CAAC,+BAA+B,SAAS,CAAC,QAAQ,GAAG;wBACtD,CAAC,CAAC,iCAAiC,CAAC;oBACtC,IAAI,YAAY,KAAK,MAAM,EAAE,CAAC;wBAC7B,OAAO,gBAAgB,CAAC;4BACvB,GAAG,QAAQ;4BACX,MAAM,EAAE,SAAS;4BACjB,QAAQ,EAAE,KAAK;4BACf,MAAM,EAAE,SAAS,CAAC,IAAI;4BACtB,OAAO;4BACP,cAAc,EAAE,OAAO,CAAC,cAAc;4BACtC,OAAO,EAAE,OAAO,CAAC,OAAO;yBACxB,CAAC,CAAC;oBACJ,CAAC;oBACD,OAAO,CAAC,GAAG,YAAY,GAAG,EAAE,KAAK,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACxD,CAAC;gBAED,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC;gBAChC,8DAA8D;gBAC9D,kEAAkE;gBAClE,gDAAgD;gBAChD,MAAM,WAAW,GAAG,MAAM,KAAK,IAAI,IAAI,OAAO,KAAK,IAAI,CAAC;gBACxD,IAAI,WAAW,EAAE,CAAC;oBACjB,MAAM,MAAM,GAAG,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC;oBAC3D,IAAI,YAAY,KAAK,MAAM,EAAE,CAAC;wBAC7B,OAAO,gBAAgB,CAAC;4BACvB,GAAG,QAAQ;4BACX,MAAM,EAAE,SAAS;4BACjB,QAAQ,EAAE,KAAK;4BACf,MAAM;4BACN,MAAM;4BACN,OAAO,EACN,MAAM,KAAK,SAAS;gCACnB,CAAC,CAAC,+BAA+B;gCACjC,CAAC,CAAC,wDAAwD;yBAC5D,CAAC,CAAC;oBACJ,CAAC;oBACD,OAAO;wBACN,GAAG,YAAY,GAAG;wBAClB,oBAAoB;wBACpB,OAAO,sBAAsB,CAAC,MAAM,CAAC,EAAE;wBACvC,MAAM,KAAK,SAAS;4BACnB,CAAC,CAAC,iCAAiC;4BACnC,CAAC,CAAC,iEAAiE;qBACpE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACd,CAAC;gBAED,IAAI,MAAgC,CAAC;gBACrC,IAAI,CAAC;oBACJ,MAAM,GAAG,MAAM,uBAAuB,CAAC;wBACtC,GAAG,OAAO;wBACV,QAAQ,EAAE,MAAM,CAAC,EAAE;wBACnB,eAAe,EAAE,qBAAqB,CAAC,MAAM,CAAC,EAAE,CAAC;qBACjD,CAAC,CAAC;gBACJ,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBAChB,2DAA2D;oBAC3D,4DAA4D;oBAC5D,6DAA6D;oBAC7D,8DAA8D;oBAC9D,6DAA6D;oBAC7D,gEAAgE;oBAChE,MAAM,YAAY,GAAG,CACpB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CACtD,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;oBAChB,IAAI,YAAY,KAAK,MAAM,EAAE,CAAC;wBAC7B,OAAO,gBAAgB,CAAC;4BACvB,GAAG,QAAQ;4BACX,MAAM,EAAE,SAAS;4BACjB,QAAQ,EAAE,IAAI;4BACd,MAAM,EAAE,gBAAgB;4BACxB,MAAM;4BACN,KAAK,EAAE,YAAY;4BACnB,OAAO,EAAE,2GAA2G,MAAM,CAAC,EAAE,sDAAsD;yBACnL,CAAC,CAAC;oBACJ,CAAC;oBACD,OAAO;wBACN,GAAG,YAAY,GAAG;wBAClB,YAAY,YAAY,EAAE;wBAC1B,yEAAyE;wBACzE,gDAAgD,MAAM,CAAC,EAAE,sDAAsD;qBAC/G,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACd,CAAC;gBAED,mEAAmE;gBACnE,oEAAoE;gBACpE,sEAAsE;gBACtE,qEAAqE;gBACrE,IAAI,UAAyC,CAAC;gBAC9C,IAAI,UAA8B,CAAC;gBACnC,IAAI,CAAC;oBACJ,UAAU,GAAG,sBAAsB,CAAC,MAAM,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC;gBACrE,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBAChB,UAAU,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBACrE,CAAC;gBAED,IAAI,YAAY,KAAK,MAAM,EAAE,CAAC;oBAC7B,OAAO,gBAAgB,CAAC;wBACvB,GAAG,QAAQ;wBACX,MAAM,EAAE,SAAS;wBACjB,QAAQ,EAAE,IAAI;wBACd,MAAM;wBACN,MAAM,EAAE;4BACP,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,IAAI;4BACzB,YAAY,EAAE,MAAM,CAAC,aAAa,IAAI,IAAI;4BAC1C,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,IAAI,IAAI;yBAC9C;wBACD,QAAQ,EAAE,UAAU,EAAE,QAAQ,IAAI,IAAI;wBACtC,MAAM,EAAE,UAAU,EAAE,MAAM,IAAI,IAAI;wBAClC,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI;qBACxD,CAAC,CAAC;gBACJ,CAAC;gBACD,OAAO;oBACN,GAAG,YAAY,GAAG;oBAClB,cAAc,MAAM,CAAC,EAAE,EAAE;oBACzB,KAAK,6BAA6B,CAAC,MAAM,CAAC,EAAE;oBAC5C,EAAE;oBACF,GAAG,CAAC,UAAU;wBACb,CAAC,CAAC,CAAC,YAAY,EAAE,GAAG,eAAe,CAAC,UAAU,CAAC,CAAC;wBAChD,CAAC,CAAC;4BACA,2BAA2B,UAAU,EAAE,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG;4BACvD,4DAA4D;yBAC5D,CAAC;iBACJ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACd,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAChB,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBACvE,IAAI,YAAY,KAAK,MAAM,EAAE,CAAC;oBAC7B,OAAO,gBAAgB,CAAC;wBACvB,GAAG,QAAQ;wBACX,MAAM,EAAE,WAAW;wBACnB,QAAQ,EAAE,KAAK;wBACf,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;qBAC5B,CAAC,CAAC;gBACJ,CAAC;gBACD,IAAI,EAAE,CAAC,SAAS,EAAE,CAAC;oBAClB,OAAO;wBACN,YAAY,CAAC,EAAE,EAAE,YAAY,CAAC;wBAC9B,KAAK,gBAAgB,CAAC,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,QAAQ,CAAC,EAAE;qBACrE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACd,CAAC;gBACD,OAAO,CAAC,GAAG,YAAY,GAAG,EAAE,YAAY,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,IAAI,CACpE,IAAI,CACJ,CAAC;YACH,CAAC;QACF,CAAC;KACD,CAAC,CAAC;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"codex-switch.d.ts","sourceRoot":"","sources":["../../../lib/tools/codex-switch.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,CAkKtE"}
1
+ {"version":3,"file":"codex-switch.d.ts","sourceRoot":"","sources":["../../../lib/tools/codex-switch.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,CAmMtE"}
@@ -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 { MODEL_FAMILIES } from "../prompts/codex.js";
@@ -22,8 +22,14 @@ export function createCodexSwitchTool(ctx) {
22
22
  async execute({ index } = {}) {
23
23
  const ui = resolveUiRuntime();
24
24
  const maskEmail = resolveMaskEmail();
25
- const storage = await loadAccounts();
26
- if (!storage || storage.accounts.length === 0) {
25
+ // This read is only used to render the "no accounts" / interactive
26
+ // picker UX. It is intentionally NOT the snapshot that gets mutated
27
+ // and saved below -- the mutate+save happens inside
28
+ // withAccountStorageTransaction against a freshly re-read snapshot so
29
+ // a concurrent save (e.g. a rotation persisting rate-limit state)
30
+ // between this read and the eventual save can't be clobbered.
31
+ const initialStorage = await loadAccounts();
32
+ if (!initialStorage || initialStorage.accounts.length === 0) {
27
33
  if (ui.v2Enabled) {
28
34
  return [
29
35
  ...formatUiHeader(ui, "Switch account"),
@@ -36,7 +42,7 @@ export function createCodexSwitchTool(ctx) {
36
42
  }
37
43
  let resolvedIndex = index;
38
44
  if (resolvedIndex === undefined) {
39
- const selectedIndex = await promptAccountIndexSelection(ui, storage, "Switch account");
45
+ const selectedIndex = await promptAccountIndexSelection(ui, initialStorage, "Switch account");
40
46
  if (selectedIndex === null) {
41
47
  if (supportsInteractiveMenus()) {
42
48
  if (ui.v2Enabled) {
@@ -61,48 +67,65 @@ export function createCodexSwitchTool(ctx) {
61
67
  }
62
68
  resolvedIndex = selectedIndex + 1;
63
69
  }
64
- const targetIndex = Math.floor((resolvedIndex ?? 0) - 1);
65
- if (!Number.isFinite(targetIndex) ||
66
- targetIndex < 0 ||
67
- targetIndex >= storage.accounts.length) {
70
+ const outcome = await withAccountStorageTransaction(async (current, persist) => {
71
+ const accounts = current?.accounts ?? [];
72
+ const targetIndex = (resolvedIndex ?? 0) - 1;
73
+ if (!current ||
74
+ !Number.isInteger(targetIndex) ||
75
+ targetIndex < 0 ||
76
+ targetIndex >= accounts.length) {
77
+ return { kind: "invalid", accountCount: accounts.length };
78
+ }
79
+ const now = Date.now();
80
+ const account = accounts[targetIndex];
81
+ if (account) {
82
+ account.lastUsed = now;
83
+ account.lastSwitchReason = "rotation";
84
+ }
85
+ const storage = current;
86
+ storage.activeIndex = targetIndex;
87
+ storage.activeIndexByFamily = storage.activeIndexByFamily ?? {};
88
+ for (const family of MODEL_FAMILIES) {
89
+ storage.activeIndexByFamily[family] = targetIndex;
90
+ }
91
+ const label = formatCommandAccountLabel(account, targetIndex, {
92
+ maskEmail,
93
+ });
94
+ try {
95
+ await persist(storage);
96
+ }
97
+ catch (saveError) {
98
+ logWarn("Failed to save account switch", {
99
+ error: String(saveError),
100
+ });
101
+ return { kind: "save-failed", label };
102
+ }
103
+ return { kind: "ok", label };
104
+ });
105
+ if (outcome.kind === "invalid") {
68
106
  if (ui.v2Enabled) {
69
107
  return [
70
108
  ...formatUiHeader(ui, "Switch account"),
71
109
  "",
72
110
  formatUiItem(ui, `Invalid account number: ${resolvedIndex}`, "danger"),
73
- formatUiKeyValue(ui, "Valid range", `1-${storage.accounts.length}`, "muted"),
111
+ formatUiKeyValue(ui, "Valid range", `1-${outcome.accountCount}`, "muted"),
74
112
  ].join("\n");
75
113
  }
76
- return `Invalid account number: ${resolvedIndex}\n\nValid range: 1-${storage.accounts.length}`;
114
+ return `Invalid account number: ${resolvedIndex}\n\nValid range: 1-${outcome.accountCount}`;
77
115
  }
78
- const now = Date.now();
79
- const account = storage.accounts[targetIndex];
80
- if (account) {
81
- account.lastUsed = now;
82
- account.lastSwitchReason = "rotation";
83
- }
84
- storage.activeIndex = targetIndex;
85
- storage.activeIndexByFamily = storage.activeIndexByFamily ?? {};
86
- for (const family of MODEL_FAMILIES) {
87
- storage.activeIndexByFamily[family] = targetIndex;
88
- }
89
- try {
90
- await saveAccounts(storage);
91
- }
92
- catch (saveError) {
93
- logWarn("Failed to save account switch", {
94
- error: String(saveError),
95
- });
96
- const label = formatCommandAccountLabel(account, targetIndex, { maskEmail });
116
+ if (outcome.kind === "save-failed") {
117
+ // The transaction only mutated its in-memory snapshot; the
118
+ // persist() call that would have made it durable threw, so
119
+ // nothing on disk actually changed. Wording must not imply the
120
+ // switch happened -- it didn't.
97
121
  if (ui.v2Enabled) {
98
122
  return [
99
123
  ...formatUiHeader(ui, "Switch account"),
100
124
  "",
101
- formatUiItem(ui, `Switched to ${label}`, "warning"),
102
- formatUiItem(ui, "Failed to persist change. It may be lost on restart.", "danger"),
125
+ formatUiItem(ui, `Failed to switch to ${outcome.label}: account storage could not be updated.`, "danger"),
103
126
  ].join("\n");
104
127
  }
105
- return `Switched to ${label} but failed to persist. Changes may be lost on restart.`;
128
+ return `Failed to switch to ${outcome.label}: account storage could not be updated.`;
106
129
  }
107
130
  try {
108
131
  await clearTuiQuotaSnapshot();
@@ -117,15 +140,14 @@ export function createCodexSwitchTool(ctx) {
117
140
  cachedAccountManagerRef.current = reloadedManager;
118
141
  accountManagerPromiseRef.current = Promise.resolve(reloadedManager);
119
142
  }
120
- const label = formatCommandAccountLabel(account, targetIndex, { maskEmail });
121
143
  if (ui.v2Enabled) {
122
144
  return [
123
145
  ...formatUiHeader(ui, "Switch account"),
124
146
  "",
125
- formatUiItem(ui, `${getStatusMarker(ui, "ok")} Switched to ${label}`, "success"),
147
+ formatUiItem(ui, `${getStatusMarker(ui, "ok")} Switched to ${outcome.label}`, "success"),
126
148
  ].join("\n");
127
149
  }
128
- return `Switched to account: ${label}`;
150
+ return `Switched to account: ${outcome.label}`;
129
151
  },
130
152
  });
131
153
  }