oc-codex-multi-auth 6.10.0 → 6.11.0

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 (42) hide show
  1. package/README.md +28 -10
  2. package/config/README.md +6 -4
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +53 -225
  5. package/dist/index.js.map +1 -1
  6. package/dist/lib/auth/server.d.ts.map +1 -1
  7. package/dist/lib/auth/server.js +7 -3
  8. package/dist/lib/auth/server.js.map +1 -1
  9. package/dist/lib/auto-update-checker.d.ts.map +1 -1
  10. package/dist/lib/auto-update-checker.js +3 -2
  11. package/dist/lib/auto-update-checker.js.map +1 -1
  12. package/dist/lib/codex-usage.d.ts +1 -0
  13. package/dist/lib/codex-usage.d.ts.map +1 -1
  14. package/dist/lib/codex-usage.js +17 -2
  15. package/dist/lib/codex-usage.js.map +1 -1
  16. package/dist/lib/oauth-success.d.ts +1 -0
  17. package/dist/lib/oauth-success.d.ts.map +1 -1
  18. package/dist/lib/oauth-success.html +198 -707
  19. package/dist/lib/oauth-success.js +202 -708
  20. package/dist/lib/oauth-success.js.map +1 -1
  21. package/dist/lib/tools/codex-doctor.d.ts.map +1 -1
  22. package/dist/lib/tools/codex-doctor.js +168 -142
  23. package/dist/lib/tools/codex-doctor.js.map +1 -1
  24. package/dist/lib/tools/codex-health.d.ts.map +1 -1
  25. package/dist/lib/tools/codex-health.js +41 -38
  26. package/dist/lib/tools/codex-health.js.map +1 -1
  27. package/dist/lib/tools/codex-refresh.d.ts.map +1 -1
  28. package/dist/lib/tools/codex-refresh.js +24 -103
  29. package/dist/lib/tools/codex-refresh.js.map +1 -1
  30. package/dist/lib/tools/index.d.ts +1 -0
  31. package/dist/lib/tools/index.d.ts.map +1 -1
  32. package/dist/lib/tools/index.js.map +1 -1
  33. package/dist/lib/tools/refresh-account.d.ts +63 -0
  34. package/dist/lib/tools/refresh-account.d.ts.map +1 -0
  35. package/dist/lib/tools/refresh-account.js +159 -0
  36. package/dist/lib/tools/refresh-account.js.map +1 -0
  37. package/dist/lib/ui/beginner.d.ts +1 -0
  38. package/dist/lib/ui/beginner.d.ts.map +1 -1
  39. package/dist/lib/ui/beginner.js +12 -1
  40. package/dist/lib/ui/beginner.js.map +1 -1
  41. package/package.json +157 -155
  42. package/scripts/install-oc-codex-multi-auth-core.js +195 -46
@@ -1 +1 @@
1
- {"version":3,"file":"oauth-success.js","sourceRoot":"","sources":["../../lib/oauth-success.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,gBAAgB,GAAG,MAAM,CAAC,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwsBzC,CAAC"}
1
+ {"version":3,"file":"oauth-success.js","sourceRoot":"","sources":["../../lib/oauth-success.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,sBAAsB,CAAC,UAAkB;IACxD,OAAO;;;;;;;iBAOS,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAmMnB,CAAC;AACT,CAAC;AAED,4EAA4E;AAC5E,MAAM,CAAC,MAAM,gBAAgB,GAAG,sBAAsB,CAAC,EAAE,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"codex-doctor.d.ts","sourceRoot":"","sources":["../../../lib/tools/codex-doctor.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAQ,KAAK,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAgCrE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,WAAW,GAAG,cAAc,CA4etE"}
1
+ {"version":3,"file":"codex-doctor.d.ts","sourceRoot":"","sources":["../../../lib/tools/codex-doctor.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAQ,KAAK,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAwCrE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAY9C,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,WAAW,GAAG,cAAc,CAiiBtE"}
@@ -3,17 +3,83 @@
3
3
  * Extracted from `index.ts` per RC-1 Phase 2.
4
4
  */
5
5
  import { tool } from "@opencode-ai/plugin/tool";
6
- import { getStoragePath, loadAccounts, saveAccounts, } from "../storage.js";
6
+ import { getStoragePath, loadAccounts, withAccountStorageTransaction, } from "../storage.js";
7
7
  import { AccountManager } from "../accounts.js";
8
- import { queuedRefresh } from "../refresh-queue.js";
9
8
  import { MODEL_FAMILIES } from "../prompts/codex.js";
10
9
  import { clearRefreshedAccountsStaleState, findDisabledAccountsWithFreshCredential, findDisabledTokenSourceDuplicates, } from "../accounts/stale-state.js";
11
10
  import { clearTuiQuotaSnapshot } from "../tui-quota-cache.js";
12
11
  import { buildBeginnerDoctorFindings, formatPromptCacheSnapshot, recommendBeginnerNextAction, summarizeBeginnerAccounts, } from "../ui/beginner.js";
13
12
  import { formatUiHeader, formatUiItem, formatUiKeyValue, formatUiSection, } from "../ui/format.js";
14
13
  import { normalizeToolOutputFormat, renderJsonOutput, } from "../runtime.js";
14
+ import { buildRefreshInputs, findAccountIndexByIdentity, refreshAndPersistAccount, } from "./refresh-account.js";
15
15
  export function createCodexDoctorTool(ctx) {
16
- const { resolveUiRuntime, resolveActiveIndex, toBeginnerAccountSnapshots, getBeginnerRuntimeSnapshot, buildRoutingVisibilitySnapshot, appendRoutingVisibilityText, appendRoutingVisibilityUi, formatDoctorSeverity, formatDoctorSeverityText, runtimeMetrics, cachedAccountManagerRef, accountManagerPromiseRef, } = ctx;
16
+ const { resolveUiRuntime, resolveActiveIndex, toBeginnerAccountSnapshots, getBeginnerRuntimeSnapshot, buildRoutingVisibilitySnapshot, appendRoutingVisibilityText, appendRoutingVisibilityUi, formatDoctorSeverity, formatDoctorSeverityText, runtimeMetrics, cachedAccountManagerRef, reloadCachedAccountManager, } = ctx;
17
+ async function loadDiagnostics(extraFindings = [], verificationFailureIdentities = []) {
18
+ const storage = await loadAccounts();
19
+ const now = Date.now();
20
+ const activeIndex = storage && storage.accounts.length > 0
21
+ ? resolveActiveIndex(storage, "codex")
22
+ : 0;
23
+ const failedIndices = new Set(verificationFailureIdentities
24
+ .map((identity) => findAccountIndexByIdentity(storage?.accounts ?? [], identity))
25
+ .filter((index) => index >= 0));
26
+ const snapshots = storage
27
+ ? toBeginnerAccountSnapshots(storage, activeIndex, now)
28
+ .map((snapshot) => ({
29
+ ...snapshot,
30
+ refreshVerificationFailed: failedIndices.has(snapshot.index),
31
+ }))
32
+ : [];
33
+ const runtime = getBeginnerRuntimeSnapshot();
34
+ const summary = summarizeBeginnerAccounts(snapshots, now);
35
+ const findings = buildBeginnerDoctorFindings({
36
+ accounts: snapshots,
37
+ now,
38
+ runtime,
39
+ });
40
+ const nextAction = recommendBeginnerNextAction({
41
+ accounts: snapshots,
42
+ now,
43
+ runtime,
44
+ });
45
+ // Surface disabled token-source duplicates that shadow an enabled,
46
+ // org-backed account by email (issue #171). These appear when a
47
+ // re-login mints a token-source entry instead of updating the org
48
+ // account; harmless for rotation but they pollute diagnostics. We flag
49
+ // rather than auto-remove because the only link between the two is
50
+ // email, and email-only merges must not blindly collapse multi-org
51
+ // accounts (#64).
52
+ const disabledTokenSourceDuplicates = storage
53
+ ? findDisabledTokenSourceDuplicates(storage.accounts)
54
+ : [];
55
+ if (disabledTokenSourceDuplicates.length > 0) {
56
+ findings.push({
57
+ severity: "warning",
58
+ code: "disabled-token-source-duplicate",
59
+ summary: `${disabledTokenSourceDuplicates.length} disabled duplicate account entry(ies) shadow a real account.`,
60
+ action: `Remove the leftover entry(ies) with \`codex-remove\` (slots: ${disabledTokenSourceDuplicates
61
+ .map((index) => index + 1)
62
+ .join(", ")}).`,
63
+ });
64
+ }
65
+ // A user-disabled account that absorbed a fresh enabled re-login stays
66
+ // disabled (fail-closed) but is otherwise invisible to diagnostics (#171).
67
+ const disabledWithFreshCredential = storage
68
+ ? findDisabledAccountsWithFreshCredential(storage.accounts)
69
+ : [];
70
+ if (disabledWithFreshCredential.length > 0) {
71
+ findings.push({
72
+ severity: "warning",
73
+ code: "disabled-account-fresh-credential",
74
+ summary: `${disabledWithFreshCredential.length} disabled account(s) hold a fresh login credential.`,
75
+ action: `A recent re-login landed on a disabled slot; re-enable it in oc-codex-multi-auth-accounts.json if intended (slots: ${disabledWithFreshCredential
76
+ .map((index) => index + 1)
77
+ .join(", ")}).`,
78
+ });
79
+ }
80
+ findings.push(...extraFindings);
81
+ return { storage, activeIndex, snapshots, runtime, summary, findings, nextAction };
82
+ }
17
83
  return tool({
18
84
  description: "Run beginner-friendly diagnostics with clear fixes.",
19
85
  args: {
@@ -33,128 +99,74 @@ export function createCodexDoctorTool(ctx) {
33
99
  async execute({ deep, fix, format, } = {}) {
34
100
  const ui = resolveUiRuntime();
35
101
  const outputFormat = normalizeToolOutputFormat(format);
36
- const storage = await loadAccounts();
37
- const now = Date.now();
38
- const activeIndex = storage && storage.accounts.length > 0
39
- ? resolveActiveIndex(storage, "codex")
40
- : 0;
41
- const snapshots = storage
42
- ? toBeginnerAccountSnapshots(storage, activeIndex, now)
43
- : [];
44
- const runtime = getBeginnerRuntimeSnapshot();
45
- const summary = summarizeBeginnerAccounts(snapshots, now);
46
- const findings = buildBeginnerDoctorFindings({
47
- accounts: snapshots,
48
- now,
49
- runtime,
50
- });
51
- const nextAction = recommendBeginnerNextAction({
52
- accounts: snapshots,
53
- now,
54
- runtime,
55
- });
56
- // Surface disabled token-source duplicates that shadow an enabled,
57
- // org-backed account by email (issue #171). These appear when a
58
- // re-login mints a token-source entry instead of updating the org
59
- // account; harmless for rotation but they pollute diagnostics. We flag
60
- // rather than auto-remove because the only link between the two is
61
- // email, and email-only merges must not blindly collapse multi-org
62
- // accounts (#64).
63
- const disabledTokenSourceDuplicates = storage
64
- ? findDisabledTokenSourceDuplicates(storage.accounts)
65
- : [];
66
- if (disabledTokenSourceDuplicates.length > 0) {
67
- findings.push({
68
- severity: "warning",
69
- code: "disabled-token-source-duplicate",
70
- summary: `${disabledTokenSourceDuplicates.length} disabled duplicate account entry(ies) shadow a real account.`,
71
- action: `Remove the leftover entry(ies) with \`codex-remove\` (slots: ${disabledTokenSourceDuplicates
72
- .map((index) => index + 1)
73
- .join(", ")}).`,
74
- });
75
- }
76
- // A user-disabled account that absorbed a fresh enabled re-login stays
77
- // disabled (fail-closed) but is otherwise invisible to diagnostics (#171).
78
- const disabledWithFreshCredential = storage
79
- ? findDisabledAccountsWithFreshCredential(storage.accounts)
80
- : [];
81
- if (disabledWithFreshCredential.length > 0) {
82
- findings.push({
83
- severity: "warning",
84
- code: "disabled-account-fresh-credential",
85
- summary: `${disabledWithFreshCredential.length} disabled account(s) hold a fresh login credential.`,
86
- action: `A recent re-login landed on a disabled slot; re-enable it in oc-codex-multi-auth-accounts.json if intended (slots: ${disabledWithFreshCredential
87
- .map((index) => index + 1)
88
- .join(", ")}).`,
89
- });
90
- }
91
- let routingVisibility = null;
92
102
  const appliedFixes = [];
93
103
  const fixErrors = [];
94
- if (fix && storage && storage.accounts.length > 0) {
95
- let changedByRefresh = false;
96
- let refreshedCount = 0;
97
- const refreshedAccounts = [];
104
+ const extraFindings = [];
105
+ let routingVisibility = null;
106
+ let diagnostics = await loadDiagnostics();
107
+ if (fix && diagnostics.storage && diagnostics.storage.accounts.length > 0) {
108
+ const refreshResults = [];
98
109
  const reloginNeeded = [];
99
- for (let accountIndex = 0; accountIndex < storage.accounts.length; accountIndex++) {
100
- const account = storage.accounts[accountIndex];
101
- if (!account)
110
+ const verificationFailureIdentities = [];
111
+ const inputs = buildRefreshInputs(diagnostics.storage.accounts);
112
+ for (const input of inputs) {
113
+ if (!input)
102
114
  continue;
103
- // Skip intentionally-disabled accounts: refreshing them is wrong
104
- // (e.g. the disabled token-source duplicate would get a spurious
105
- // "re-login" directive when its dead token fails, when the correct
106
- // remedy is `codex-remove`), and stale-state must never be cleared
107
- // on an entry the user disabled on purpose.
108
- if (account.enabled === false)
109
- continue;
110
- try {
111
- const refreshResult = await queuedRefresh(account.refreshToken);
112
- if (refreshResult.type === "success") {
113
- account.refreshToken = refreshResult.refresh;
114
- account.accessToken = refreshResult.access;
115
- account.expiresAt = refreshResult.expires;
116
- changedByRefresh = true;
117
- refreshedCount += 1;
118
- refreshedAccounts.push(account);
119
- }
120
- else {
121
- // A failed refresh (vs. a thrown error) means the stored
122
- // credential is genuinely dead — re-login is required. Surface
123
- // it explicitly so an all-dark pool with expired tokens does not
124
- // fail silently (issue #171: "surface this state"). We do NOT
125
- // clear stale state for these accounts: they really are blocked.
126
- const detail = refreshResult.message ?? refreshResult.reason ?? "token refresh failed";
127
- reloginNeeded.push(accountIndex + 1);
128
- fixErrors.push(`Account ${accountIndex + 1}: ${detail} — run \`opencode auth login\` to re-authenticate.`);
129
- }
115
+ const outcome = await refreshAndPersistAccount(input);
116
+ if (outcome.status === "refreshed") {
117
+ refreshResults.push({
118
+ index: outcome.index,
119
+ identity: outcome.result.identity,
120
+ });
130
121
  }
131
- catch (error) {
132
- fixErrors.push(error instanceof Error ? error.message : String(error));
122
+ else if (outcome.status === "skipped") {
123
+ // Skip intentionally-disabled accounts: refreshing them is wrong
124
+ // (e.g. the disabled token-source duplicate would get a spurious
125
+ // "re-login" directive when its dead token fails, when the correct
126
+ // remedy is `codex-remove`), and stale-state must never be cleared
127
+ // on an entry the user disabled on purpose.
133
128
  }
134
- }
135
- // A successful refresh proves the credential is alive, so clear any
136
- // stale cooldown / rate-limit state that would otherwise keep the
137
- // recovered account out of rotation (issue #171). Without this, the
138
- // auto-switch below finds no eligible account and the dead routing
139
- // persists across restarts. The summary is computed here but only
140
- // reported after saveAccounts succeeds, so we never tell the user a
141
- // fix landed while the on-disk state still carries the stale block.
142
- let staleSummary = { cooldownsCleared: 0, rateLimitKeysCleared: 0 };
143
- if (refreshedAccounts.length > 0) {
144
- staleSummary = clearRefreshedAccountsStaleState(refreshedAccounts);
145
- if (staleSummary.cooldownsCleared > 0 || staleSummary.rateLimitKeysCleared > 0) {
146
- changedByRefresh = true;
129
+ else {
130
+ verificationFailureIdentities.push(outcome.identity);
131
+ reloginNeeded.push(outcome.index + 1);
132
+ fixErrors.push(`Account ${outcome.index + 1}: ${outcome.error} — run \`opencode auth login\` to re-authenticate.`);
147
133
  }
148
134
  }
149
- if (changedByRefresh) {
135
+ if (verificationFailureIdentities.length > 0) {
136
+ extraFindings.push({
137
+ severity: "error",
138
+ code: "refresh-verification-failed",
139
+ summary: `${verificationFailureIdentities.length} account(s) failed refresh-token verification.`,
140
+ action: `Re-authenticate the affected account(s) with \`opencode auth login\` (slots: ${reloginNeeded.join(", ")}).`,
141
+ });
142
+ }
143
+ if (refreshResults.length > 0) {
144
+ appliedFixes.push(`Refreshed and persisted ${refreshResults.length} account token(s).`);
145
+ // A successful refresh proves the credential is alive, so clear any
146
+ // stale cooldown / rate-limit state that would otherwise keep the
147
+ // recovered account out of rotation (issue #171). Apply this to a
148
+ // fresh storage snapshot so non-credential state written by other
149
+ // processes is preserved.
150
150
  try {
151
- await saveAccounts(storage);
152
- // Only report applied fixes once the write to disk has actually
153
- // succeeded, otherwise a failed persist would still print
154
- // "Cleared ..." and mislead the user into thinking it landed.
155
- if (refreshedCount > 0) {
156
- appliedFixes.push(`Refreshed ${refreshedCount} account token(s).`);
157
- }
151
+ const staleSummary = await withAccountStorageTransaction(async (current, persist) => {
152
+ if (!current) {
153
+ throw new Error("Account storage is unavailable");
154
+ }
155
+ const refreshedRecords = [];
156
+ for (const refreshed of refreshResults) {
157
+ const idx = findAccountIndexByIdentity(current.accounts, refreshed.identity);
158
+ const record = idx >= 0 ? current.accounts[idx] : undefined;
159
+ if (record && record.enabled !== false) {
160
+ refreshedRecords.push(record);
161
+ }
162
+ }
163
+ const summary = clearRefreshedAccountsStaleState(refreshedRecords);
164
+ if (summary.cooldownsCleared > 0 ||
165
+ summary.rateLimitKeysCleared > 0) {
166
+ await persist(current);
167
+ }
168
+ return summary;
169
+ });
158
170
  if (staleSummary.cooldownsCleared > 0) {
159
171
  appliedFixes.push(`Cleared cooldown on ${staleSummary.cooldownsCleared} recovered account(s).`);
160
172
  }
@@ -163,14 +175,10 @@ export function createCodexDoctorTool(ctx) {
163
175
  }
164
176
  }
165
177
  catch (error) {
166
- fixErrors.push(`Failed to persist refresh updates: ${error instanceof Error ? error.message : String(error)}`);
178
+ fixErrors.push(`Failed to persist stale-state repairs: ${error instanceof Error ? error.message : String(error)}`);
167
179
  }
168
- }
169
- // Stale TUI quota cache can reference an account index/count that no
170
- // longer matches the pool, making diagnostics misleading (#171).
171
- // Only clear it when the repair actually changed account state, so a
172
- // run where every refresh failed does not report a phantom fix.
173
- if (changedByRefresh) {
180
+ // Stale TUI quota cache can reference an account index/count that no
181
+ // longer matches the pool, making diagnostics misleading (#171).
174
182
  try {
175
183
  await clearTuiQuotaSnapshot();
176
184
  appliedFixes.push("Cleared stale TUI quota cache.");
@@ -181,9 +189,6 @@ export function createCodexDoctorTool(ctx) {
181
189
  fixErrors.push(`Failed to clear TUI quota cache: ${error instanceof Error ? error.message : String(error)}`);
182
190
  }
183
191
  }
184
- // Surface a clear next step when one or more accounts could not be
185
- // refreshed: the credential is dead and only re-login fixes it. Without
186
- // this the user sees no eligible account but no cause (issue #171).
187
192
  if (reloginNeeded.length > 0) {
188
193
  // Re-login is a MANUAL action, not an applied fix — keep it in fixErrors
189
194
  // so JSON consumers reading autoFix.appliedFixes are not misled.
@@ -200,18 +205,39 @@ export function createCodexDoctorTool(ctx) {
200
205
  return b.tokensAvailable - a.tokensAvailable;
201
206
  });
202
207
  const best = eligible[0];
203
- if (best) {
204
- const currentActive = resolveActiveIndex(storage, "codex");
205
- if (best.index !== currentActive) {
206
- storage.activeIndex = best.index;
207
- storage.activeIndexByFamily =
208
- storage.activeIndexByFamily ?? {};
208
+ const bestAccount = best
209
+ ? managerForFix.getAccountsSnapshot()[best.index]
210
+ : undefined;
211
+ if (best && bestAccount) {
212
+ const bestIdentity = {
213
+ organizationId: bestAccount.organizationId,
214
+ accountId: bestAccount.accountId,
215
+ refreshToken: bestAccount.refreshToken,
216
+ };
217
+ const switchResult = await withAccountStorageTransaction(async (current, persist) => {
218
+ if (!current)
219
+ return "missing";
220
+ const freshBestIndex = findAccountIndexByIdentity(current.accounts, bestIdentity);
221
+ if (freshBestIndex < 0)
222
+ return "missing";
223
+ const currentActive = resolveActiveIndex(current, "codex");
224
+ if (freshBestIndex === currentActive)
225
+ return "unchanged";
226
+ current.activeIndex = freshBestIndex;
227
+ current.activeIndexByFamily =
228
+ current.activeIndexByFamily ?? {};
209
229
  for (const family of MODEL_FAMILIES) {
210
- storage.activeIndexByFamily[family] = best.index;
230
+ current.activeIndexByFamily[family] = freshBestIndex;
211
231
  }
212
- await saveAccounts(storage);
232
+ await persist(current);
233
+ return "switched";
234
+ });
235
+ if (switchResult === "switched") {
213
236
  appliedFixes.push(`Switched active account to ${best.index + 1} (best eligible).`);
214
237
  }
238
+ else if (switchResult === "missing") {
239
+ fixErrors.push("Selected account changed during auto-switch; no switch was applied.");
240
+ }
215
241
  }
216
242
  else {
217
243
  appliedFixes.push("No eligible account available for auto-switch.");
@@ -220,12 +246,11 @@ export function createCodexDoctorTool(ctx) {
220
246
  catch (error) {
221
247
  fixErrors.push(`Auto-switch evaluation failed: ${error instanceof Error ? error.message : String(error)}`);
222
248
  }
223
- if (cachedAccountManagerRef.current) {
224
- const reloadedManager = await AccountManager.loadFromDisk();
225
- cachedAccountManagerRef.current = reloadedManager;
226
- accountManagerPromiseRef.current =
227
- Promise.resolve(reloadedManager);
228
- }
249
+ await reloadCachedAccountManager();
250
+ // The initial diagnostics snapshot was taken before token verification.
251
+ // Reload after fixes so the reported health never contradicts live
252
+ // refresh results (e.g. "8 healthy" alongside eight invalid tokens).
253
+ diagnostics = await loadDiagnostics(extraFindings, verificationFailureIdentities);
229
254
  }
230
255
  if (deep) {
231
256
  const managerForRouting = cachedAccountManagerRef.current ??
@@ -235,8 +260,8 @@ export function createCodexDoctorTool(ctx) {
235
260
  runtimeMetrics.lastSelectionSnapshot?.model ??
236
261
  null;
237
262
  const routingExplainability = managerForRouting.getSelectionExplainability(routingFamily, routingModel ?? undefined, Date.now());
238
- const routingActiveIndex = storage && storage.accounts.length > 0
239
- ? resolveActiveIndex(storage, routingFamily)
263
+ const routingActiveIndex = diagnostics.storage && diagnostics.storage.accounts.length > 0
264
+ ? resolveActiveIndex(diagnostics.storage, routingFamily)
240
265
  : null;
241
266
  routingVisibility = buildRoutingVisibilitySnapshot({
242
267
  modelFamily: routingFamily,
@@ -248,6 +273,7 @@ export function createCodexDoctorTool(ctx) {
248
273
  selectionExplainability: routingExplainability,
249
274
  });
250
275
  }
276
+ const { runtime, summary, findings, nextAction } = diagnostics;
251
277
  if (outputFormat === "json") {
252
278
  return renderJsonOutput({
253
279
  summary: {
@@ -1 +1 @@
1
- {"version":3,"file":"codex-doctor.js","sourceRoot":"","sources":["../../../lib/tools/codex-doctor.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,IAAI,EAAuB,MAAM,0BAA0B,CAAC;AACrE,OAAO,EACN,cAAc,EACd,YAAY,EACZ,YAAY,GACZ,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EACN,gCAAgC,EAChC,uCAAuC,EACvC,iCAAiC,GACjC,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EACN,2BAA2B,EAC3B,yBAAyB,EACzB,2BAA2B,EAC3B,yBAAyB,GACzB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACN,cAAc,EACd,YAAY,EACZ,gBAAgB,EAChB,eAAe,GACf,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACN,yBAAyB,EACzB,gBAAgB,GAEhB,MAAM,eAAe,CAAC;AAGvB,MAAM,UAAU,qBAAqB,CAAC,GAAgB;IACrD,MAAM,EACL,gBAAgB,EAChB,kBAAkB,EAClB,0BAA0B,EAC1B,0BAA0B,EAC1B,8BAA8B,EAC9B,2BAA2B,EAC3B,yBAAyB,EACzB,oBAAoB,EACpB,wBAAwB,EACxB,cAAc,EACd,uBAAuB,EACvB,wBAAwB,GACxB,GAAG,GAAG,CAAC;IACR,OAAO,IAAI,CAAC;QACX,WAAW,EAAE,qDAAqD;QAClE,IAAI,EAAE;YACL,IAAI,EAAE,IAAI,CAAC,MAAM;iBACf,OAAO,EAAE;iBACT,QAAQ,EAAE;iBACV,QAAQ,CAAC,sDAAsD,CAAC;YAClE,GAAG,EAAE,IAAI,CAAC,MAAM;iBACd,OAAO,EAAE;iBACT,QAAQ,EAAE;iBACV,QAAQ,CACR,wFAAwF,CACxF;YACF,MAAM,EAAE,IAAI,CAAC,MAAM;iBACjB,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,4CAA4C,CAAC;SACxD;QACD,KAAK,CAAC,OAAO,CAAC,EACb,IAAI,EACJ,GAAG,EACH,MAAM,MACiD,EAAE;YACzD,MAAM,EAAE,GAAG,gBAAgB,EAAE,CAAC;YAC9B,MAAM,YAAY,GAAG,yBAAyB,CAAC,MAAM,CAAC,CAAC;YACvD,MAAM,OAAO,GAAG,MAAM,YAAY,EAAE,CAAC;YACrC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACvB,MAAM,WAAW,GAChB,OAAO,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC;gBACrC,CAAC,CAAC,kBAAkB,CAAC,OAAO,EAAE,OAAO,CAAC;gBACtC,CAAC,CAAC,CAAC,CAAC;YACN,MAAM,SAAS,GAAG,OAAO;gBACxB,CAAC,CAAC,0BAA0B,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,CAAC;gBACvD,CAAC,CAAC,EAAE,CAAC;YACN,MAAM,OAAO,GAAG,0BAA0B,EAAE,CAAC;YAC7C,MAAM,OAAO,GAAG,yBAAyB,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;YAC1D,MAAM,QAAQ,GAAG,2BAA2B,CAAC;gBAC5C,QAAQ,EAAE,SAAS;gBACnB,GAAG;gBACH,OAAO;aACP,CAAC,CAAC;YACH,MAAM,UAAU,GAAG,2BAA2B,CAAC;gBAC9C,QAAQ,EAAE,SAAS;gBACnB,GAAG;gBACH,OAAO;aACP,CAAC,CAAC;YAEH,mEAAmE;YACnE,gEAAgE;YAChE,kEAAkE;YAClE,uEAAuE;YACvE,mEAAmE;YACnE,mEAAmE;YACnE,kBAAkB;YAClB,MAAM,6BAA6B,GAAG,OAAO;gBAC5C,CAAC,CAAC,iCAAiC,CAAC,OAAO,CAAC,QAAQ,CAAC;gBACrD,CAAC,CAAC,EAAE,CAAC;YACN,IAAI,6BAA6B,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC9C,QAAQ,CAAC,IAAI,CAAC;oBACb,QAAQ,EAAE,SAAS;oBACnB,IAAI,EAAE,iCAAiC;oBACvC,OAAO,EAAE,GAAG,6BAA6B,CAAC,MAAM,+DAA+D;oBAC/G,MAAM,EAAE,gEAAgE,6BAA6B;yBACnG,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,GAAG,CAAC,CAAC;yBACzB,IAAI,CAAC,IAAI,CAAC,IAAI;iBAChB,CAAC,CAAC;YACJ,CAAC;YACD,uEAAuE;YACvE,2EAA2E;YAC3E,MAAM,2BAA2B,GAAG,OAAO;gBAC1C,CAAC,CAAC,uCAAuC,CAAC,OAAO,CAAC,QAAQ,CAAC;gBAC3D,CAAC,CAAC,EAAE,CAAC;YACN,IAAI,2BAA2B,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC5C,QAAQ,CAAC,IAAI,CAAC;oBACb,QAAQ,EAAE,SAAS;oBACnB,IAAI,EAAE,mCAAmC;oBACzC,OAAO,EAAE,GAAG,2BAA2B,CAAC,MAAM,qDAAqD;oBACnG,MAAM,EAAE,sHAAsH,2BAA2B;yBACvJ,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,GAAG,CAAC,CAAC;yBACzB,IAAI,CAAC,IAAI,CAAC,IAAI;iBAChB,CAAC,CAAC;YACJ,CAAC;YACD,IAAI,iBAAiB,GAAqC,IAAI,CAAC;YAC/D,MAAM,YAAY,GAAa,EAAE,CAAC;YAClC,MAAM,SAAS,GAAa,EAAE,CAAC;YAE/B,IAAI,GAAG,IAAI,OAAO,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACnD,IAAI,gBAAgB,GAAG,KAAK,CAAC;gBAC7B,IAAI,cAAc,GAAG,CAAC,CAAC;gBACvB,MAAM,iBAAiB,GAA4B,EAAE,CAAC;gBACtD,MAAM,aAAa,GAAa,EAAE,CAAC;gBACnC,KAAK,IAAI,YAAY,GAAG,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE,YAAY,EAAE,EAAE,CAAC;oBACnF,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;oBAC/C,IAAI,CAAC,OAAO;wBAAE,SAAS;oBACvB,iEAAiE;oBACjE,iEAAiE;oBACjE,mEAAmE;oBACnE,mEAAmE;oBACnE,4CAA4C;oBAC5C,IAAI,OAAO,CAAC,OAAO,KAAK,KAAK;wBAAE,SAAS;oBACxC,IAAI,CAAC;wBACJ,MAAM,aAAa,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;wBAChE,IAAI,aAAa,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;4BACtC,OAAO,CAAC,YAAY,GAAG,aAAa,CAAC,OAAO,CAAC;4BAC7C,OAAO,CAAC,WAAW,GAAG,aAAa,CAAC,MAAM,CAAC;4BAC3C,OAAO,CAAC,SAAS,GAAG,aAAa,CAAC,OAAO,CAAC;4BAC1C,gBAAgB,GAAG,IAAI,CAAC;4BACxB,cAAc,IAAI,CAAC,CAAC;4BACpB,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;wBACjC,CAAC;6BAAM,CAAC;4BACP,yDAAyD;4BACzD,+DAA+D;4BAC/D,iEAAiE;4BACjE,8DAA8D;4BAC9D,iEAAiE;4BACjE,MAAM,MAAM,GACX,aAAa,CAAC,OAAO,IAAI,aAAa,CAAC,MAAM,IAAI,sBAAsB,CAAC;4BACzE,aAAa,CAAC,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC;4BACrC,SAAS,CAAC,IAAI,CACb,WAAW,YAAY,GAAG,CAAC,KAAK,MAAM,oDAAoD,CAC1F,CAAC;wBACH,CAAC;oBACF,CAAC;oBAAC,OAAO,KAAK,EAAE,CAAC;wBAChB,SAAS,CAAC,IAAI,CACb,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CACtD,CAAC;oBACH,CAAC;gBACF,CAAC;gBAED,oEAAoE;gBACpE,kEAAkE;gBAClE,oEAAoE;gBACpE,mEAAmE;gBACnE,kEAAkE;gBAClE,oEAAoE;gBACpE,oEAAoE;gBACpE,IAAI,YAAY,GAAG,EAAE,gBAAgB,EAAE,CAAC,EAAE,oBAAoB,EAAE,CAAC,EAAE,CAAC;gBACpE,IAAI,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAClC,YAAY,GAAG,gCAAgC,CAAC,iBAAiB,CAAC,CAAC;oBACnE,IAAI,YAAY,CAAC,gBAAgB,GAAG,CAAC,IAAI,YAAY,CAAC,oBAAoB,GAAG,CAAC,EAAE,CAAC;wBAChF,gBAAgB,GAAG,IAAI,CAAC;oBACzB,CAAC;gBACF,CAAC;gBAED,IAAI,gBAAgB,EAAE,CAAC;oBACtB,IAAI,CAAC;wBACJ,MAAM,YAAY,CAAC,OAAO,CAAC,CAAC;wBAC5B,gEAAgE;wBAChE,0DAA0D;wBAC1D,8DAA8D;wBAC9D,IAAI,cAAc,GAAG,CAAC,EAAE,CAAC;4BACxB,YAAY,CAAC,IAAI,CAChB,aAAa,cAAc,oBAAoB,CAC/C,CAAC;wBACH,CAAC;wBACD,IAAI,YAAY,CAAC,gBAAgB,GAAG,CAAC,EAAE,CAAC;4BACvC,YAAY,CAAC,IAAI,CAChB,uBAAuB,YAAY,CAAC,gBAAgB,wBAAwB,CAC5E,CAAC;wBACH,CAAC;wBACD,IAAI,YAAY,CAAC,oBAAoB,GAAG,CAAC,EAAE,CAAC;4BAC3C,YAAY,CAAC,IAAI,CAChB,WAAW,YAAY,CAAC,oBAAoB,8BAA8B,CAC1E,CAAC;wBACH,CAAC;oBACF,CAAC;oBAAC,OAAO,KAAK,EAAE,CAAC;wBAChB,SAAS,CAAC,IAAI,CACb,sCACC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CACtD,EAAE,CACF,CAAC;oBACH,CAAC;gBACF,CAAC;gBAED,qEAAqE;gBACrE,iEAAiE;gBACjE,qEAAqE;gBACrE,gEAAgE;gBAChE,IAAI,gBAAgB,EAAE,CAAC;oBACtB,IAAI,CAAC;wBACJ,MAAM,qBAAqB,EAAE,CAAC;wBAC9B,YAAY,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;oBACrD,CAAC;oBAAC,OAAO,KAAK,EAAE,CAAC;wBAChB,8DAA8D;wBAC9D,mEAAmE;wBACnE,SAAS,CAAC,IAAI,CACb,oCACC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CACtD,EAAE,CACF,CAAC;oBACH,CAAC;gBACF,CAAC;gBAED,mEAAmE;gBACnE,wEAAwE;gBACxE,oEAAoE;gBACpE,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC9B,yEAAyE;oBACzE,iEAAiE;oBACjE,SAAS,CAAC,IAAI,CACb,GAAG,aAAa,CAAC,MAAM,qCAAqC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,iCAAiC,CACrH,CAAC;gBACH,CAAC;gBAED,IAAI,CAAC;oBACJ,MAAM,aAAa,GAAG,MAAM,cAAc,CAAC,YAAY,EAAE,CAAC;oBAC1D,MAAM,cAAc,GAAG,aAAa,CAAC,0BAA0B,CAC9D,OAAO,EACP,SAAS,EACT,IAAI,CAAC,GAAG,EAAE,CACV,CAAC;oBACF,MAAM,QAAQ,GAAG,cAAc;yBAC7B,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC;yBACjC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;wBACd,IAAI,CAAC,CAAC,WAAW,KAAK,CAAC,CAAC,WAAW;4BAClC,OAAO,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,WAAW,CAAC;wBACtC,OAAO,CAAC,CAAC,eAAe,GAAG,CAAC,CAAC,eAAe,CAAC;oBAC9C,CAAC,CAAC,CAAC;oBACJ,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;oBACzB,IAAI,IAAI,EAAE,CAAC;wBACV,MAAM,aAAa,GAAG,kBAAkB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;wBAC3D,IAAI,IAAI,CAAC,KAAK,KAAK,aAAa,EAAE,CAAC;4BAClC,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC;4BACjC,OAAO,CAAC,mBAAmB;gCAC1B,OAAO,CAAC,mBAAmB,IAAI,EAAE,CAAC;4BACnC,KAAK,MAAM,MAAM,IAAI,cAAc,EAAE,CAAC;gCACrC,OAAO,CAAC,mBAAmB,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC;4BAClD,CAAC;4BACD,MAAM,YAAY,CAAC,OAAO,CAAC,CAAC;4BAC5B,YAAY,CAAC,IAAI,CAChB,8BAA8B,IAAI,CAAC,KAAK,GAAG,CAAC,mBAAmB,CAC/D,CAAC;wBACH,CAAC;oBACF,CAAC;yBAAM,CAAC;wBACP,YAAY,CAAC,IAAI,CAChB,gDAAgD,CAChD,CAAC;oBACH,CAAC;gBACF,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBAChB,SAAS,CAAC,IAAI,CACb,kCACC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CACtD,EAAE,CACF,CAAC;gBACH,CAAC;gBAED,IAAI,uBAAuB,CAAC,OAAO,EAAE,CAAC;oBACrC,MAAM,eAAe,GAAG,MAAM,cAAc,CAAC,YAAY,EAAE,CAAC;oBAC5D,uBAAuB,CAAC,OAAO,GAAG,eAAe,CAAC;oBAClD,wBAAwB,CAAC,OAAO;wBAC/B,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;gBACnC,CAAC;YACF,CAAC;YACD,IAAI,IAAI,EAAE,CAAC;gBACV,MAAM,iBAAiB,GACtB,uBAAuB,CAAC,OAAO;oBAC/B,CAAC,MAAM,cAAc,CAAC,YAAY,EAAE,CAAC,CAAC;gBACvC,MAAM,aAAa,GAClB,cAAc,CAAC,qBAAqB,EAAE,MAAM,IAAI,OAAO,CAAC;gBACzD,MAAM,YAAY,GACjB,cAAc,CAAC,qBAAqB,EAAE,cAAc;oBACpD,cAAc,CAAC,qBAAqB,EAAE,KAAK;oBAC3C,IAAI,CAAC;gBACN,MAAM,qBAAqB,GAC1B,iBAAiB,CAAC,0BAA0B,CAC3C,aAAa,EACb,YAAY,IAAI,SAAS,EACzB,IAAI,CAAC,GAAG,EAAE,CACV,CAAC;gBACH,MAAM,kBAAkB,GACvB,OAAO,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC;oBACrC,CAAC,CAAC,kBAAkB,CAAC,OAAO,EAAE,aAAa,CAAC;oBAC5C,CAAC,CAAC,IAAI,CAAC;gBACT,iBAAiB,GAAG,8BAA8B,CAAC;oBAClD,WAAW,EAAE,aAAa;oBAC1B,cAAc,EAAE,YAAY;oBAC5B,QAAQ,EAAE,YAAY;wBACrB,CAAC,CAAC,GAAG,aAAa,IAAI,YAAY,EAAE;wBACpC,CAAC,CAAC,aAAa;oBAChB,oBAAoB,EAAE,kBAAkB;oBACxC,uBAAuB,EAAE,qBAAqB;iBAC9C,CAAC,CAAC;YACJ,CAAC;YACD,IAAI,YAAY,KAAK,MAAM,EAAE,CAAC;gBAC7B,OAAO,gBAAgB,CAAC;oBACvB,OAAO,EAAE;wBACR,aAAa,EAAE,OAAO,CAAC,KAAK;wBAC5B,eAAe,EAAE,OAAO,CAAC,OAAO;wBAChC,eAAe,EAAE,OAAO,CAAC,OAAO;wBAChC,kBAAkB,EACjB,OAAO,CAAC,aAAa,GAAG,CAAC;4BACxB,CAAC,CAAC,IAAI,CAAC,KAAK,CACV,CAAC,OAAO,CAAC,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC,GAAG,GAAG,CACtD;4BACF,CAAC,CAAC,CAAC;qBACL;oBACD,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;wBACpC,QAAQ,EAAE,OAAO,CAAC,QAAQ;wBAC1B,OAAO,EAAE,OAAO,CAAC,OAAO;wBACxB,MAAM,EAAE,OAAO,CAAC,MAAM;qBACtB,CAAC,CAAC;oBACH,qBAAqB,EAAE,UAAU;oBACjC,OAAO,EAAE,GAAG;wBACX,CAAC,CAAC;4BACA,YAAY;4BACZ,MAAM,EAAE,SAAS;yBACjB;wBACF,CAAC,CAAC,IAAI;oBACP,iBAAiB,EAAE,IAAI;wBACtB,CAAC,CAAC;4BACA,WAAW,EAAE,cAAc,EAAE;4BAC7B,eAAe,EAAE;gCAChB,cAAc,EAAE,OAAO,CAAC,cAAc;gCACtC,oBAAoB,EAAE,OAAO,CAAC,oBAAoB;gCAClD,mBAAmB,EAAE,OAAO,CAAC,mBAAmB;gCAChD,YAAY,EAAE,OAAO,CAAC,YAAY;gCAClC,aAAa,EAAE,OAAO,CAAC,aAAa;6BACpC;4BACD,WAAW,EAAE;gCACZ,eAAe,EAAE,OAAO,CAAC,0BAA0B;gCACnD,eAAe,EAAE,OAAO,CAAC,0BAA0B;gCACnD,kBAAkB,EAAE,OAAO,CAAC,kBAAkB;gCAC9C,OAAO,EAAE,yBAAyB,CAAC,OAAO,CAAC;6BAC3C;4BACD,iBAAiB;yBACjB;wBACF,CAAC,CAAC,IAAI;iBACP,CAAC,CAAC;YACJ,CAAC;YAED,IAAI,EAAE,CAAC,SAAS,EAAE,CAAC;gBAClB,MAAM,KAAK,GAAa;oBACvB,GAAG,cAAc,CAAC,EAAE,EAAE,cAAc,CAAC;oBACrC,gBAAgB,CAAC,EAAE,EAAE,UAAU,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;oBACvD,gBAAgB,CACf,EAAE,EACF,SAAS,EACT,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EACvB,OAAO,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAC3C;oBACD,gBAAgB,CACf,EAAE,EACF,SAAS,EACT,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EACvB,OAAO,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CACzC;oBACD,gBAAgB,CACf,EAAE,EACF,cAAc,EACd,OAAO,CAAC,aAAa,GAAG,CAAC;wBACxB,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CACb,CAAC,OAAO,CAAC,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC,GAAG,GAAG,CACtD,GAAG;wBACL,CAAC,CAAC,IAAI,CACP;oBACD,EAAE;oBACF,GAAG,eAAe,CAAC,EAAE,EAAE,UAAU,CAAC;iBAClC,CAAC;gBAEF,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;oBAChC,MAAM,IAAI,GACT,OAAO,CAAC,QAAQ,KAAK,IAAI;wBACxB,CAAC,CAAC,SAAS;wBACX,CAAC,CAAC,OAAO,CAAC,QAAQ,KAAK,SAAS;4BAC/B,CAAC,CAAC,SAAS;4BACX,CAAC,CAAC,QAAQ,CAAC;oBACd,KAAK,CAAC,IAAI,CACT,YAAY,CACX,EAAE,EACF,GAAG,oBAAoB,CAAC,EAAE,EAAE,OAAO,CAAC,QAAQ,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,EAClE,IAAI,CACJ,CACD,CAAC;oBACF,KAAK,CAAC,IAAI,CACT,KAAK,gBAAgB,CAAC,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAC3D,CAAC;gBACH,CAAC;gBAED,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACf,KAAK,CAAC,IAAI,CAAC,GAAG,eAAe,CAAC,EAAE,EAAE,uBAAuB,CAAC,CAAC,CAAC;gBAC5D,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC;gBACnD,IAAI,GAAG,EAAE,CAAC;oBACT,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oBACf,KAAK,CAAC,IAAI,CAAC,GAAG,eAAe,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC,CAAC;oBAC/C,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;wBAC/B,KAAK,CAAC,IAAI,CACT,YAAY,CAAC,EAAE,EAAE,6BAA6B,EAAE,OAAO,CAAC,CACxD,CAAC;oBACH,CAAC;yBAAM,CAAC;wBACP,KAAK,MAAM,KAAK,IAAI,YAAY,EAAE,CAAC;4BAClC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC;wBAChD,CAAC;oBACF,CAAC;oBACD,KAAK,MAAM,KAAK,IAAI,SAAS,EAAE,CAAC;wBAC/B,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC;oBAChD,CAAC;gBACF,CAAC;gBAED,IAAI,IAAI,EAAE,CAAC;oBACV,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oBACf,KAAK,CAAC,IAAI,CAAC,GAAG,eAAe,CAAC,EAAE,EAAE,oBAAoB,CAAC,CAAC,CAAC;oBACzD,KAAK,CAAC,IAAI,CACT,gBAAgB,CAAC,EAAE,EAAE,SAAS,EAAE,cAAc,EAAE,EAAE,OAAO,CAAC,CAC1D,CAAC;oBACF,KAAK,CAAC,IAAI,CACT,gBAAgB,CACf,EAAE,EACF,kBAAkB,EAClB,UAAU,OAAO,CAAC,cAAc,iBAAiB,OAAO,CAAC,oBAAoB,uBAAuB,OAAO,CAAC,mBAAmB,YAAY,OAAO,CAAC,YAAY,aAAa,OAAO,CAAC,aAAa,EAAE,EACnM,OAAO,CACP,CACD,CAAC;oBACF,KAAK,CAAC,IAAI,CACT,gBAAgB,CACf,EAAE,EACF,cAAc,EACd,yBAAyB,CAAC,OAAO,CAAC,EAClC,OAAO,CACP,CACD,CAAC;oBACF,IAAI,iBAAiB,EAAE,CAAC;wBACvB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;wBACf,yBAAyB,CAAC,EAAE,EAAE,KAAK,EAAE,iBAAiB,EAAE;4BACvD,qBAAqB,EAAE,IAAI;yBAC3B,CAAC,CAAC;oBACJ,CAAC;gBACF,CAAC;gBAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACzB,CAAC;YAED,MAAM,KAAK,GAAa;gBACvB,eAAe;gBACf,aAAa,OAAO,CAAC,KAAK,aAAa,OAAO,CAAC,OAAO,aAAa,OAAO,CAAC,OAAO,GAAG;gBACrF,iBAAiB,OAAO,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG;gBACtH,EAAE;gBACF,WAAW;aACX,CAAC;YACF,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;gBAChC,KAAK,CAAC,IAAI,CACT,KAAK,wBAAwB,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,CACpE,CAAC;gBACF,KAAK,CAAC,IAAI,CAAC,cAAc,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;YAC5C,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACf,KAAK,CAAC,IAAI,CAAC,0BAA0B,UAAU,EAAE,CAAC,CAAC;YACnD,IAAI,GAAG,EAAE,CAAC;gBACT,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACf,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;gBACxB,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBAC/B,KAAK,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;gBAC/C,CAAC;qBAAM,CAAC;oBACP,KAAK,MAAM,KAAK,IAAI,YAAY,EAAE,CAAC;wBAClC,KAAK,CAAC,IAAI,CAAC,OAAO,KAAK,EAAE,CAAC,CAAC;oBAC5B,CAAC;gBACF,CAAC;gBACD,KAAK,MAAM,KAAK,IAAI,SAAS,EAAE,CAAC;oBAC/B,KAAK,CAAC,IAAI,CAAC,gBAAgB,KAAK,EAAE,CAAC,CAAC;gBACrC,CAAC;YACF,CAAC;YACD,IAAI,IAAI,EAAE,CAAC;gBACV,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACf,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;gBAClC,KAAK,CAAC,IAAI,CAAC,cAAc,cAAc,EAAE,EAAE,CAAC,CAAC;gBAC7C,KAAK,CAAC,IAAI,CACT,8BAA8B,OAAO,CAAC,cAAc,iBAAiB,OAAO,CAAC,oBAAoB,uBAAuB,OAAO,CAAC,mBAAmB,YAAY,OAAO,CAAC,YAAY,aAAa,OAAO,CAAC,aAAa,EAAE,CACvN,CAAC;gBACF,KAAK,CAAC,IAAI,CAAC,mBAAmB,yBAAyB,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;gBACpE,IAAI,iBAAiB,EAAE,CAAC;oBACvB,2BAA2B,CAAC,KAAK,EAAE,iBAAiB,EAAE;wBACrD,qBAAqB,EAAE,IAAI;qBAC3B,CAAC,CAAC;gBACJ,CAAC;YACF,CAAC;YACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzB,CAAC;KACD,CAAC,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"codex-doctor.js","sourceRoot":"","sources":["../../../lib/tools/codex-doctor.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"codex-health.d.ts","sourceRoot":"","sources":["../../../lib/tools/codex-health.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAQ,KAAK,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAUrE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,WAAW,GAAG,cAAc,CA6KtE"}
1
+ {"version":3,"file":"codex-health.d.ts","sourceRoot":"","sources":["../../../lib/tools/codex-health.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAQ,KAAK,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAarE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,WAAW,GAAG,cAAc,CAkLtE"}
@@ -4,12 +4,12 @@
4
4
  */
5
5
  import { tool } from "@opencode-ai/plugin/tool";
6
6
  import { loadAccounts } from "../storage.js";
7
- import { queuedRefresh } from "../refresh-queue.js";
8
7
  import { findDisabledAccountsWithFreshCredential, findDisabledTokenSourceDuplicates, findStaleRecoverableAccounts, } from "../accounts/stale-state.js";
9
8
  import { formatUiHeader, formatUiItem, paintUiText } from "../ui/format.js";
10
9
  import { normalizeToolOutputFormat, renderJsonOutput } from "../runtime.js";
10
+ import { buildRefreshInputs, refreshAndPersistAccount, } from "./refresh-account.js";
11
11
  export function createCodexHealthTool(ctx) {
12
- const { resolveUiRuntime, formatCommandAccountLabel, resolveMaskEmail, getStatusMarker, buildJsonAccountIdentity, } = ctx;
12
+ const { resolveUiRuntime, formatCommandAccountLabel, resolveMaskEmail, getStatusMarker, buildJsonAccountIdentity, reloadCachedAccountManager, } = ctx;
13
13
  return tool({
14
14
  description: "Check health of all Codex accounts by validating refresh tokens.",
15
15
  args: {
@@ -35,6 +35,7 @@ export function createCodexHealthTool(ctx) {
35
35
  totalAccounts: 0,
36
36
  healthyCount: 0,
37
37
  unhealthyCount: 0,
38
+ skippedCount: 0,
38
39
  accounts: [],
39
40
  });
40
41
  }
@@ -54,42 +55,42 @@ export function createCodexHealthTool(ctx) {
54
55
  const jsonAccounts = [];
55
56
  let healthyCount = 0;
56
57
  let unhealthyCount = 0;
57
- for (let i = 0; i < storage.accounts.length; i++) {
58
+ let skippedCount = 0;
59
+ const inputs = buildRefreshInputs(storage.accounts);
60
+ for (let i = 0; i < inputs.length; i++) {
61
+ const input = inputs[i];
58
62
  const account = storage.accounts[i];
59
- if (!account)
63
+ if (!input || !account)
60
64
  continue;
61
65
  const label = formatCommandAccountLabel(account, i);
62
66
  const displayLabel = formatCommandAccountLabel(account, i, { maskEmail });
63
- try {
64
- const refreshResult = await queuedRefresh(account.refreshToken);
65
- if (refreshResult.type === "success") {
66
- jsonAccounts.push({
67
- ...buildJsonAccountIdentity(i, {
68
- includeSensitive: includeSensitiveOutput,
69
- account,
70
- label,
71
- }),
72
- status: "healthy",
73
- });
74
- results.push(` ${getStatusMarker(ui, "ok")} ${displayLabel}: Healthy`);
75
- healthyCount++;
76
- }
77
- else {
78
- jsonAccounts.push({
79
- ...buildJsonAccountIdentity(i, {
80
- includeSensitive: includeSensitiveOutput,
81
- account,
82
- label,
83
- }),
84
- status: "unhealthy",
85
- error: refreshResult.message ?? refreshResult.reason,
86
- });
87
- results.push(` ${getStatusMarker(ui, "error")} ${displayLabel}: Token refresh failed`);
88
- unhealthyCount++;
89
- }
67
+ const outcome = await refreshAndPersistAccount(input);
68
+ if (outcome.status === "refreshed") {
69
+ jsonAccounts.push({
70
+ ...buildJsonAccountIdentity(i, {
71
+ includeSensitive: includeSensitiveOutput,
72
+ account,
73
+ label,
74
+ }),
75
+ status: "healthy",
76
+ });
77
+ results.push(` ${getStatusMarker(ui, "ok")} ${displayLabel}: Healthy`);
78
+ healthyCount++;
79
+ }
80
+ else if (outcome.status === "skipped") {
81
+ jsonAccounts.push({
82
+ ...buildJsonAccountIdentity(i, {
83
+ includeSensitive: includeSensitiveOutput,
84
+ account,
85
+ label,
86
+ }),
87
+ status: "skipped",
88
+ error: "Account is disabled",
89
+ });
90
+ results.push(` ${getStatusMarker(ui, "warning")} ${displayLabel}: Skipped (disabled)`);
91
+ skippedCount++;
90
92
  }
91
- catch (error) {
92
- const errorMsg = error instanceof Error ? error.message : String(error);
93
+ else {
93
94
  jsonAccounts.push({
94
95
  ...buildJsonAccountIdentity(i, {
95
96
  includeSensitive: includeSensitiveOutput,
@@ -97,17 +98,18 @@ export function createCodexHealthTool(ctx) {
97
98
  label,
98
99
  }),
99
100
  status: "unhealthy",
100
- error: errorMsg.slice(0, 120),
101
+ error: outcome.error,
101
102
  });
102
- results.push(` ${getStatusMarker(ui, "error")} ${displayLabel}: Error - ${errorMsg.slice(0, 120)}`);
103
+ results.push(` ${getStatusMarker(ui, "error")} ${displayLabel}: ${outcome.error}`);
103
104
  unhealthyCount++;
104
105
  }
105
106
  }
107
+ await reloadCachedAccountManager();
106
108
  results.push("");
107
- results.push(`Summary: ${healthyCount} healthy, ${unhealthyCount} unhealthy`);
109
+ results.push(`Summary: ${healthyCount} healthy, ${unhealthyCount} unhealthy, ${skippedCount} skipped`);
108
110
  // Surface recoverable stale state and disabled token-source duplicates
109
- // (issue #171). codex-health is read-only, so it points the user at the
110
- // repair (`codex-doctor --fix` / `codex-remove`) rather than mutating.
111
+ // (issue #171). Token verification is destructive to single-use refresh
112
+ // tokens, but this tool persists rotations before reporting health.
111
113
  const staleRecoverable = findStaleRecoverableAccounts(storage.accounts);
112
114
  const duplicateSlots = findDisabledTokenSourceDuplicates(storage.accounts);
113
115
  const staleSlots = staleRecoverable.map((index) => index + 1);
@@ -127,6 +129,7 @@ export function createCodexHealthTool(ctx) {
127
129
  totalAccounts: storage.accounts.length,
128
130
  healthyCount,
129
131
  unhealthyCount,
132
+ skippedCount,
130
133
  staleRecoverableSlots: staleSlots,
131
134
  disabledDuplicateSlots: dupSlots,
132
135
  disabledWithFreshCredentialSlots: absorbedSlots,