tokentracker-cli 0.93.4 → 0.93.5

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 (101) hide show
  1. package/dashboard/dist/assets/{AchievementBadge-BcNvxrVM.js → AchievementBadge-td60VwNO.js} +1 -1
  2. package/dashboard/dist/assets/{AchievementsPage-DhipQygJ.js → AchievementsPage-C3yKXgId.js} +2 -2
  3. package/dashboard/dist/assets/{AchievementsSection-BJyb_mIr.js → AchievementsSection-XM39rQkD.js} +1 -1
  4. package/dashboard/dist/assets/{BadgeDetailModal-CoZv7o6t.js → BadgeDetailModal-2TgBBPmw.js} +1 -1
  5. package/dashboard/dist/assets/{BotAnimated-eVBNtvcG.js → BotAnimated-CG6_x0d2.js} +1 -1
  6. package/dashboard/dist/assets/{Card-BEfG2im9.js → Card-BUnCudVB.js} +1 -1
  7. package/dashboard/dist/assets/{ClawdAnimated-C-30t4dC.js → ClawdAnimated-CNRu6v7I.js} +2 -2
  8. package/dashboard/dist/assets/{CommandPalette-DF-TGB1C.js → CommandPalette-D5vVqYkW.js} +1 -1
  9. package/dashboard/dist/assets/{CommunityStatsModal-D-0eI3Pz.js → CommunityStatsModal-D0V4iTI6.js} +1 -1
  10. package/dashboard/dist/assets/{ConfirmModal-BQ7Aor1C.js → ConfirmModal-CzxTtnXo.js} +1 -1
  11. package/dashboard/dist/assets/{Controls-COThRtMS.js → Controls-nR5gzX__.js} +1 -1
  12. package/dashboard/dist/assets/{DashboardPage-Ci_Gb5I1.js → DashboardPage-CpHXkuZn.js} +1 -1
  13. package/dashboard/dist/assets/{DevicePage-BmlmimUg.js → DevicePage-Emw9iVMd.js} +1 -1
  14. package/dashboard/dist/assets/{DialogClose-BdALEZzc.js → DialogClose-Bh-pvxsM.js} +1 -1
  15. package/dashboard/dist/assets/DialogDescription-DJ-RHxIt.js +1 -0
  16. package/dashboard/dist/assets/{DialogTitle-F6W1aTiE.js → DialogTitle-BG3ngtew.js} +1 -1
  17. package/dashboard/dist/assets/{FadeIn-S2d3D28d.js → FadeIn-DOEfAW5p.js} +1 -1
  18. package/dashboard/dist/assets/{HeaderGithubStar-DBBwOwc_.js → HeaderGithubStar-DslGxMu4.js} +1 -1
  19. package/dashboard/dist/assets/{HoverTooltip-rLWQC9Va.js → HoverTooltip-O2OKCBc3.js} +1 -1
  20. package/dashboard/dist/assets/{IpCheckPage-BpPoAIry.js → IpCheckPage-Dv6LbNU_.js} +1 -1
  21. package/dashboard/dist/assets/{LandingPage-BUm_ZMew.js → LandingPage-BBfteqDF.js} +2 -2
  22. package/dashboard/dist/assets/{LeaderboardAvatar-DQxbOYZb.js → LeaderboardAvatar-Ct6QagwN.js} +1 -1
  23. package/dashboard/dist/assets/{LeaderboardPage-DzLrFQm8.js → LeaderboardPage-CSbIdSm7.js} +2 -2
  24. package/dashboard/dist/assets/{LeaderboardProfileModal-Cq4B8Les.js → LeaderboardProfileModal-BuUWkmBN.js} +3 -3
  25. package/dashboard/dist/assets/{LeaderboardProfilePage-C-Xj65xf.js → LeaderboardProfilePage-fVnV0Lo-.js} +1 -1
  26. package/dashboard/dist/assets/{LimitsPage-Bjcmr0bd.js → LimitsPage-BHkkA3xN.js} +1 -1
  27. package/dashboard/dist/assets/{LocalOnlyNotice-9mWINkVj.js → LocalOnlyNotice-BLlrqreb.js} +1 -1
  28. package/dashboard/dist/assets/{LoginCard-BlKleF8M.js → LoginCard-CKV1uACo.js} +1 -1
  29. package/dashboard/dist/assets/{LoginModal-BUYa13hj.js → LoginModal-RCpQtFuG.js} +1 -1
  30. package/dashboard/dist/assets/{LoginPage-DbQhApOd.js → LoginPage-vMV2kpef.js} +1 -1
  31. package/dashboard/dist/assets/{PetPage-DuAf3OOf.js → PetPage-CTgwpnsA.js} +1 -1
  32. package/dashboard/dist/assets/{PopoverPopup-CG76MkbK.js → PopoverPopup-Bddr9R6x.js} +1 -1
  33. package/dashboard/dist/assets/{ProviderIcon-N7OTtgte.js → ProviderIcon-BeXu2voQ.js} +1 -1
  34. package/dashboard/dist/assets/{ResetPasswordPage-D48--1wC.js → ResetPasswordPage-CilGTQWZ.js} +1 -1
  35. package/dashboard/dist/assets/{SegmentedControl-zRvbFqyY.js → SegmentedControl-r5MP3Uyx.js} +1 -1
  36. package/dashboard/dist/assets/{Select-Bi3B21Fb.js → Select-BBUIbPTj.js} +1 -1
  37. package/dashboard/dist/assets/{SelectItemText-Bg8I618N.js → SelectItemText-CbuN7Sui.js} +1 -1
  38. package/dashboard/dist/assets/{ServiceStatusPage-CeeYx4XY.js → ServiceStatusPage-WgmQviZa.js} +1 -1
  39. package/dashboard/dist/assets/{SessionsPage-CZF3qLEm.js → SessionsPage-BDkdXQhW.js} +1 -1
  40. package/dashboard/dist/assets/{SettingsPage-D2wa8i5u.js → SettingsPage-CsF8cG7I.js} +2 -2
  41. package/dashboard/dist/assets/{SkillsPage-OxW2w6up.js → SkillsPage-CVGra4ar.js} +1 -1
  42. package/dashboard/dist/assets/{TokenGalaxy-DmtP_r86.js → TokenGalaxy-B0kFIG0N.js} +1 -1
  43. package/dashboard/dist/assets/{ToolbarRootContext-DC6BLLoO.js → ToolbarRootContext-BlWkiH2k.js} +1 -1
  44. package/dashboard/dist/assets/{TrendMonitor-OvvLCD3K.js → TrendMonitor-C18_ADhU.js} +1 -1
  45. package/dashboard/dist/assets/{WidgetsPage-DhOC8rae.js → WidgetsPage-Ck7L4vBj.js} +1 -1
  46. package/dashboard/dist/assets/{WrappedPage-C0boSobK.js → WrappedPage-Bm5HMj3a.js} +1 -1
  47. package/dashboard/dist/assets/{__vite-browser-external-D_dICEUB.js → __vite-browser-external-BCyVFzdP.js} +15 -15
  48. package/dashboard/dist/assets/{agent-logos-Dzyq5cDh.js → agent-logos-PZX7lWJo.js} +1 -1
  49. package/dashboard/dist/assets/{arrow-up-right-DrLfm7Vy.js → arrow-up-right-DPSDEZPh.js} +1 -1
  50. package/dashboard/dist/assets/{check-DAsdH-MF.js → check-GGrgivnu.js} +1 -1
  51. package/dashboard/dist/assets/{chevron-right-CdSgby9-.js → chevron-right-CmSOUizu.js} +1 -1
  52. package/dashboard/dist/assets/{copy-TuVoW7qK.js → copy-ChMyV-hy.js} +1 -1
  53. package/dashboard/dist/assets/{download-BZ61xuhi.js → download-DGUkE9Jc.js} +1 -1
  54. package/dashboard/dist/assets/{external-link-DJrRSKF9.js → external-link-B_W-UDpi.js} +1 -1
  55. package/dashboard/dist/assets/{flame-9JS9yMju.js → flame-C9ccP-R8.js} +1 -1
  56. package/dashboard/dist/assets/{format-tokens-Blp6lI_n.js → format-tokens-CkXJmbVP.js} +1 -1
  57. package/dashboard/dist/assets/{icons-CbF0cL6i.js → icons-D37cRKGk.js} +1 -1
  58. package/dashboard/dist/assets/{index-FnWiMfqV.js → index-C-_fimm3.js} +1 -1
  59. package/dashboard/dist/assets/{index-I81NzV7H.js → index-C9OzYqU0.js} +1 -1
  60. package/dashboard/dist/assets/{index-Bu3I2hmd.js → index-Dt6WIU71.js} +1 -1
  61. package/dashboard/dist/assets/{info-B_iryt84.js → info-C3-0C2W0.js} +1 -1
  62. package/dashboard/dist/assets/{limits-providers-Cli4pkKC.js → limits-providers-DB1Zr3WN.js} +1 -1
  63. package/dashboard/dist/assets/{link-2-pB3-7Waa.js → link-2-DqNEbzji.js} +1 -1
  64. package/dashboard/dist/assets/{loader-circle-DivA-LsF.js → loader-circle-BYoKm-f5.js} +1 -1
  65. package/dashboard/dist/assets/{maximize-2-WNMF5NUU.js → maximize-2-lVQDTDqs.js} +1 -1
  66. package/dashboard/dist/assets/{modifiers.esm-BaJJxzf2.js → modifiers.esm-Bww85WOd.js} +1 -1
  67. package/dashboard/dist/assets/module-D2D5r9gC.js +3 -0
  68. package/dashboard/dist/assets/{monitor-smartphone-pAR3IHow.js → monitor-smartphone--KubNwvP.js} +1 -1
  69. package/dashboard/dist/assets/{provider-display-CyYhYVar.js → provider-display-COV_Ft4A.js} +1 -1
  70. package/dashboard/dist/assets/{react-BldsIPA1.js → react-lNnu0y7U.js} +1 -1
  71. package/dashboard/dist/assets/{search-xIfdCEo0.js → search-CpHNMxpD.js} +1 -1
  72. package/dashboard/dist/assets/{skills-api-DZNsCHPo.js → skills-api-Cf2qRQ1h.js} +1 -1
  73. package/dashboard/dist/assets/{sortable.esm-DMaj448G.js → sortable.esm-DWdlF_7j.js} +1 -1
  74. package/dashboard/dist/assets/{store-VTEegajU.js → store-DJQqZJtg.js} +1 -1
  75. package/dashboard/dist/assets/{terminal-Bj8SotRv.js → terminal-Cban5byW.js} +1 -1
  76. package/dashboard/dist/assets/{trash-2-CWgY_FBc.js → trash-2-nelaUHSh.js} +1 -1
  77. package/dashboard/dist/assets/{use-community-stats-BOVvh_Gv.js → use-community-stats-CBupXLW7.js} +1 -1
  78. package/dashboard/dist/assets/{use-limits-display-prefs-MtLsQ5kN.js → use-limits-display-prefs-B4y_kzcd.js} +1 -1
  79. package/dashboard/dist/assets/{use-ordered-list-DjCZVinv.js → use-ordered-list-DEV58tGc.js} +1 -1
  80. package/dashboard/dist/assets/use-reduced-motion-CRf4pBTt.js +1 -0
  81. package/dashboard/dist/assets/{use-session-efficiency-pref-DASihY0W.js → use-session-efficiency-pref-wSk1wV6R.js} +1 -1
  82. package/dashboard/dist/assets/{use-transform-tHlm2id8.js → use-transform-NKavwYrX.js} +1 -1
  83. package/dashboard/dist/assets/{use-usage-limits-BBEHNJKl.js → use-usage-limits-Blr1HBCj.js} +1 -1
  84. package/dashboard/dist/assets/{useCurrency-DgTCDMXb.js → useCurrency-B2704dMx.js} +1 -1
  85. package/dashboard/dist/assets/{useScrollLock-C3TFkbz0.js → useScrollLock-BuPQ8T9m.js} +1 -1
  86. package/dashboard/dist/assets/{useTokenFormat-BtqPANfZ.js → useTokenFormat-DPxAFuMj.js} +1 -1
  87. package/dashboard/dist/assets/{zap-CJNTZ87b.js → zap-BgtTdM4q.js} +1 -1
  88. package/dashboard/dist/index.html +1 -1
  89. package/dashboard/dist/ip-check.html +1 -1
  90. package/dashboard/dist/leaderboard.html +1 -1
  91. package/dashboard/dist/share.html +1 -1
  92. package/package.json +1 -1
  93. package/src/commands/serve.js +115 -4
  94. package/src/commands/sync.js +146 -3
  95. package/src/lib/opencode-go-limits.js +11 -3
  96. package/src/lib/pricing/seed-snapshot.json +1 -1
  97. package/src/lib/rollout.js +189 -5
  98. package/src/lib/usage-limits.js +119 -1
  99. package/dashboard/dist/assets/DialogDescription-DAKoQCEv.js +0 -1
  100. package/dashboard/dist/assets/module-CV1mYFsv.js +0 -3
  101. package/dashboard/dist/assets/use-reduced-motion-DjWNXuSi.js +0 -1
@@ -28,6 +28,7 @@ const {
28
28
  readOpencodeDbMessages,
29
29
  readMimoDbMessages,
30
30
  readZcodeDbMessages,
31
+ hasZcodeNativeUsageSchema,
31
32
  resolveQoderDbPaths,
32
33
  resolveQoderCnDbPaths,
33
34
  readQoderDbMessages,
@@ -257,6 +258,7 @@ const CODEX_COLD_SCAN_AUDIT_MAX_SYNCS = 288;
257
258
  // state so the next sync (providerID-filtered reader) rebuilds it correctly.
258
259
  const MIMO_PROVIDER_REPAIR_KEY = "mimoClaudeMislabelRepair_2026_06";
259
260
  const DSH_LEGACY_SOURCE_MIGRATION_KEY = "deepseekHarnessSourceMigration_2026_08";
261
+ const ZCODE_NATIVE_USAGE_REPAIR_KEY = "zcodeNativeUsageRepair_2026_08";
260
262
  const AUTO_SYNC_SOURCE_ALIASES = new Map([
261
263
  ["code", "every-code"],
262
264
  ["deepseek", "dsh"],
@@ -468,6 +470,9 @@ async function cmdSync(argv, context = {}) {
468
470
  const traeCnNowMs = context && typeof context === "object"
469
471
  ? context.traeCnNowMs
470
472
  : undefined;
473
+ const cursorSyncDeps = context && typeof context.cursorSyncDeps === "object"
474
+ ? context.cursorSyncDeps
475
+ : {};
471
476
  const syncDiagnostics = diagnostics && typeof diagnostics === "object" ? diagnostics : null;
472
477
  const home = os.homedir();
473
478
  const { trackerDir } = await resolveTrackerPaths({ home });
@@ -1403,6 +1408,18 @@ async function cmdSync(argv, context = {}) {
1403
1408
  if (zcodePaths.native || zcodePaths.wsl) {
1404
1409
  if (progress?.enabled) progress.start(`Parsing ZCode ${renderBar(0)} | buckets 0`);
1405
1410
  try {
1411
+ const nativeUsageAvailable = [zcodePaths.native, zcodePaths.wsl]
1412
+ .filter(Boolean)
1413
+ .some((dbPath) => hasZcodeNativeUsageSchema(dbPath));
1414
+ if (nativeUsageAvailable) {
1415
+ await repairZcodeNativeUsageMigration({
1416
+ cursors,
1417
+ queuePath,
1418
+ queueStatePath,
1419
+ projectQueuePath,
1420
+ projectQueueStatePath,
1421
+ });
1422
+ }
1406
1423
  zcodeResult = await multiInstallParse({
1407
1424
  paths: zcodePaths, parserFn: parseOpencodeDbForInstall, providerName: "zcode",
1408
1425
  cursors, getParams: (p) => ({ dbPath: p, readFn: readZcodeDbMessages, source: "zcode", cursorKey: "zcode" }),
@@ -1640,14 +1657,17 @@ async function cmdSync(argv, context = {}) {
1640
1657
  }
1641
1658
 
1642
1659
  let cursorResult = { recordsProcessed: 0, eventsAggregated: 0, bucketsQueued: 0 };
1643
- if (!isBackgroundLightweightSync && sourceAllowed("cursor") && isCursorInstalled({ home })) {
1644
- const cursorAuth = extractCursorSessionToken({ home });
1660
+ const cursorInstalled = cursorSyncDeps.isInstalled || isCursorInstalled;
1661
+ const cursorAuthExtractor = cursorSyncDeps.extractAuth || extractCursorSessionToken;
1662
+ const cursorUsageFetcher = cursorSyncDeps.fetchUsageCsv || fetchCursorUsageCsv;
1663
+ if (sourceAllowed("cursor") && cursorInstalled({ home })) {
1664
+ const cursorAuth = cursorAuthExtractor({ home });
1645
1665
  if (cursorAuth) {
1646
1666
  try {
1647
1667
  if (progress?.enabled) {
1648
1668
  progress.start(`Fetching Cursor usage...`);
1649
1669
  }
1650
- const csvText = await fetchCursorUsageCsv({ cookie: cursorAuth.cookie });
1670
+ const csvText = await cursorUsageFetcher({ cookie: cursorAuth.cookie });
1651
1671
  const records = parseCursorCsv(csvText);
1652
1672
  if (records.length > 0) {
1653
1673
  if (progress?.enabled) {
@@ -3105,6 +3125,7 @@ module.exports = {
3105
3125
  repairCodexInterleavedUsageInflation,
3106
3126
  repairDroidDuplicateSessionInflation,
3107
3127
  repairMimoClaudeMislabel,
3128
+ repairZcodeNativeUsageMigration,
3108
3129
  reincludeClaudeMemObserverFiles,
3109
3130
  repairGrokQueueFromSessionSnapshots,
3110
3131
  applyCloudConversationsBackfill,
@@ -4083,6 +4104,128 @@ async function repairMimoClaudeMislabel({
4083
4104
  return true;
4084
4105
  }
4085
4106
 
4107
+ async function resetUploadOffsetForZcodeNativeRepair(queueStatePath) {
4108
+ if (typeof queueStatePath !== "string" || !queueStatePath) return false;
4109
+ let state = {};
4110
+ try {
4111
+ state = JSON.parse(await fs.readFile(queueStatePath, "utf8"));
4112
+ } catch (_error) {
4113
+ state = {};
4114
+ }
4115
+ state.offset = 0;
4116
+ state.updatedAt = new Date().toISOString();
4117
+ state.note = "reset_after_zcode_native_usage_repair_2026_08";
4118
+ await ensureDir(path.dirname(queueStatePath));
4119
+ await fs.writeFile(queueStatePath, JSON.stringify(state, null, 2) + "\n", "utf8");
4120
+ return true;
4121
+ }
4122
+
4123
+ async function dropZcodeQueueRows(filePath, { retainRetractions = false } = {}) {
4124
+ let raw;
4125
+ try {
4126
+ raw = await fs.readFile(filePath, "utf8");
4127
+ } catch (error) {
4128
+ if (error?.code === "ENOENT") return { removed: 0, retractions: 0 };
4129
+ throw error;
4130
+ }
4131
+ const kept = [];
4132
+ const retractions = new Map();
4133
+ let removed = 0;
4134
+ for (const line of raw.split("\n")) {
4135
+ if (!line.trim()) continue;
4136
+ let row;
4137
+ try {
4138
+ row = JSON.parse(line);
4139
+ } catch (_error) {
4140
+ kept.push(line);
4141
+ continue;
4142
+ }
4143
+ if (row?.source === "zcode") {
4144
+ removed += 1;
4145
+ const model = typeof row.model === "string" && row.model.trim()
4146
+ ? row.model.trim()
4147
+ : "unknown";
4148
+ const hourStart = typeof row.hour_start === "string" ? row.hour_start : "";
4149
+ if (retainRetractions && hourStart) {
4150
+ retractions.set(`${model}|${hourStart}`, {
4151
+ source: "zcode",
4152
+ model,
4153
+ hour_start: hourStart,
4154
+ input_tokens: 0,
4155
+ cached_input_tokens: 0,
4156
+ cache_creation_input_tokens: 0,
4157
+ output_tokens: 0,
4158
+ reasoning_output_tokens: 0,
4159
+ total_tokens: 0,
4160
+ conversation_count: 0,
4161
+ });
4162
+ }
4163
+ continue;
4164
+ }
4165
+ kept.push(line);
4166
+ }
4167
+ if (removed === 0) return { removed: 0, retractions: 0 };
4168
+ await backupExistingFile(filePath);
4169
+ const tmp = `${filePath}.zcoderepair.${process.pid}.${Date.now()}`;
4170
+ const rewritten = [
4171
+ ...kept,
4172
+ ...[...retractions.values()].map((row) => JSON.stringify(row)),
4173
+ ];
4174
+ await fs.writeFile(tmp, rewritten.length ? rewritten.join("\n") + "\n" : "", "utf8");
4175
+ await fs.rename(tmp, filePath);
4176
+ return { removed, retractions: retractions.size };
4177
+ }
4178
+
4179
+ async function repairZcodeNativeUsageMigration({
4180
+ cursors,
4181
+ queuePath,
4182
+ queueStatePath,
4183
+ projectQueuePath,
4184
+ projectQueueStatePath,
4185
+ } = {}) {
4186
+ if (!cursors || typeof cursors !== "object") return false;
4187
+ const migrations = (cursors.migrations ||= {});
4188
+ if (migrations[ZCODE_NATIVE_USAGE_REPAIR_KEY]) return false;
4189
+
4190
+ const mainRepair = await dropZcodeQueueRows(queuePath, { retainRetractions: true });
4191
+ const projectRepair = projectQueuePath
4192
+ ? await dropZcodeQueueRows(projectQueuePath)
4193
+ : { removed: 0, retractions: 0 };
4194
+
4195
+ const hourly = cursors.hourly && typeof cursors.hourly === "object" ? cursors.hourly : null;
4196
+ if (hourly?.buckets) {
4197
+ for (const key of Object.keys(hourly.buckets)) {
4198
+ if (key.startsWith("zcode|")) delete hourly.buckets[key];
4199
+ }
4200
+ }
4201
+ if (hourly?.groupQueued) {
4202
+ for (const key of Object.keys(hourly.groupQueued)) {
4203
+ if (key.startsWith("zcode|")) delete hourly.groupQueued[key];
4204
+ }
4205
+ }
4206
+ const projectHourly = cursors.projectHourly && typeof cursors.projectHourly === "object"
4207
+ ? cursors.projectHourly
4208
+ : null;
4209
+ if (projectHourly?.buckets) {
4210
+ for (const key of Object.keys(projectHourly.buckets)) {
4211
+ if (key.includes("|zcode|")) delete projectHourly.buckets[key];
4212
+ }
4213
+ }
4214
+ delete cursors.zcode;
4215
+
4216
+ if (mainRepair.removed > 0) await resetUploadOffsetForZcodeNativeRepair(queueStatePath);
4217
+ if (projectRepair.removed > 0) {
4218
+ await resetUploadOffsetForZcodeNativeRepair(projectQueueStatePath);
4219
+ }
4220
+ migrations[ZCODE_NATIVE_USAGE_REPAIR_KEY] = {
4221
+ appliedAt: new Date().toISOString(),
4222
+ removedMain: mainRepair.removed,
4223
+ removedProject: projectRepair.removed,
4224
+ retractions: mainRepair.retractions,
4225
+ };
4226
+ return true;
4227
+ }
4228
+
4086
4229
  async function repairGrokQueueFromSessionSnapshots({ cursors, queuePath, queueStatePath } = {}) {
4087
4230
  if (!cursors || typeof cursors !== "object") return false;
4088
4231
  const grokState = (cursors.grok ||= {});
@@ -266,6 +266,9 @@ async function resolveWorkspaceId(authCookie, fetchImpl, timeoutMs) {
266
266
  headers: postHeaders,
267
267
  body: "[]"
268
268
  });
269
+ if (response.status === 401 || response.status === 403) {
270
+ throw new Error("Unauthorized or forbidden (401/403)");
271
+ }
269
272
  text = await response.text();
270
273
  ids = parseWorkspaceIds(text);
271
274
  } catch (postErr) {
@@ -649,7 +652,13 @@ async function scrapeOpencodeGoWeb({ cfg, fetchImpl, nowMs, timeoutMs }) {
649
652
  try {
650
653
  workspaceId = await resolveWorkspaceId(cfg.authCookie, fetchImpl, timeoutMs);
651
654
  } catch (err) {
652
- return { configured: true, error: `Failed to resolve Workspace ID: ${sanitizeMessage(err?.message || err)}` };
655
+ const msg = sanitizeMessage(err?.message || err);
656
+ const isAuth = /401|403|Unauthorized or forbidden/i.test(msg);
657
+ return {
658
+ configured: true,
659
+ error: `Failed to resolve Workspace ID: ${msg}`,
660
+ ...(isAuth ? { auth_error: true } : {}),
661
+ };
653
662
  }
654
663
  if (!workspaceId) {
655
664
  return { configured: true, error: "Could not auto-resolve OpenCode Workspace ID from cookie. Please set OPENCODE_GO_WORKSPACE_ID manually." };
@@ -743,8 +752,7 @@ async function fetchOpencodeGoLimits({
743
752
  return { ...api, source: "api" };
744
753
  }
745
754
  if (api?.auth_error) {
746
- const { auth_error, ...result } = api;
747
- return result;
755
+ return { ...api, source: "api" };
748
756
  }
749
757
  if (!cfg) return api || { configured: true, error: "OpenCode Go unavailable" };
750
758
  }