tokentracker-cli 1.3.5 → 1.3.6

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 (112) hide show
  1. package/dashboard/dist/assets/{AchievementBadge-Dazs3pEa.js → AchievementBadge-CHDt55IP.js} +1 -1
  2. package/dashboard/dist/assets/{AchievementsPage-LWnxZvmw.js → AchievementsPage-DpbRHmb8.js} +2 -2
  3. package/dashboard/dist/assets/{AchievementsSection-BLqczmU9.js → AchievementsSection-Ck5CiX4P.js} +1 -1
  4. package/dashboard/dist/assets/{BadgeDetailModal-B_n4aj2S.js → BadgeDetailModal-BVPqlh0X.js} +1 -1
  5. package/dashboard/dist/assets/{BotAnimated-KDWI_YcZ.js → BotAnimated-CVsv6kxT.js} +1 -1
  6. package/dashboard/dist/assets/{Card-BYoxd4OC.js → Card-C9FjyAwh.js} +1 -1
  7. package/dashboard/dist/assets/{CloudCheckoutPage-BR2_B03P.js → CloudCheckoutPage-ChkjId9l.js} +1 -1
  8. package/dashboard/dist/assets/{CloudPage-DL5RkJKK.js → CloudPage-D1nrt3MG.js} +1 -1
  9. package/dashboard/dist/assets/{CloudUsageExport-C_DqZKo1.js → CloudUsageExport-jXdoiD0e.js} +1 -1
  10. package/dashboard/dist/assets/{CommandPalette-DkCaIQI4.js → CommandPalette-DFnEeZzc.js} +1 -1
  11. package/dashboard/dist/assets/{CommunityStatsModal-pX9OePi4.js → CommunityStatsModal-CZDS8gPA.js} +1 -1
  12. package/dashboard/dist/assets/{ConfirmModal-tkgZwz4u.js → ConfirmModal-DRhgBoGE.js} +1 -1
  13. package/dashboard/dist/assets/{Controls-MTUhGWy8.js → Controls-BmT6-x_L.js} +1 -1
  14. package/dashboard/dist/assets/{DashboardPage-SOx-A7lH.js → DashboardPage-DfwwXZBo.js} +1 -1
  15. package/dashboard/dist/assets/{DateRangePopover-B-BMOm3O.js → DateRangePopover-DuqNLatr.js} +1 -1
  16. package/dashboard/dist/assets/{DevicePage-DSK9lm7v.js → DevicePage-BtI0bWyg.js} +1 -1
  17. package/dashboard/dist/assets/{DialogClose-uVUNu4rg.js → DialogClose-DjnC3P4V.js} +1 -1
  18. package/dashboard/dist/assets/DialogDescription-yy_QHg7O.js +1 -0
  19. package/dashboard/dist/assets/{DialogTitle-B-VifiA3.js → DialogTitle-B9NNSz5p.js} +1 -1
  20. package/dashboard/dist/assets/{FadeIn-B6lrj4uo.js → FadeIn-fsVQmJGa.js} +1 -1
  21. package/dashboard/dist/assets/{HeaderGithubStar-Cx5zOhXa.js → HeaderGithubStar-Cg-f1iZc.js} +1 -1
  22. package/dashboard/dist/assets/{HoverTooltip-DY1ENf69.js → HoverTooltip-DRIRlzXH.js} +1 -1
  23. package/dashboard/dist/assets/{IpCheckPage-D6TEq64d.js → IpCheckPage-DaAubaJQ.js} +1 -1
  24. package/dashboard/dist/assets/{LandingPage-OdZUfq--.js → LandingPage-DjBGIjHk.js} +2 -2
  25. package/dashboard/dist/assets/{LeaderboardPage-DCK5xcAt.js → LeaderboardPage-BkCXqhz7.js} +2 -2
  26. package/dashboard/dist/assets/{LeaderboardProBadge-CBXJ1u_m.js → LeaderboardProBadge-Ds-wiWcN.js} +1 -1
  27. package/dashboard/dist/assets/{LeaderboardProfileModal-Ccdzb7QK.js → LeaderboardProfileModal-X_rfSQT5.js} +3 -3
  28. package/dashboard/dist/assets/{LeaderboardProfilePage-CFXlZ0fL.js → LeaderboardProfilePage-rpl1Ozwj.js} +1 -1
  29. package/dashboard/dist/assets/{LimitsPage-5krjm-g9.js → LimitsPage-BUvDBmgD.js} +1 -1
  30. package/dashboard/dist/assets/{LocalOnlyNotice-Rk1B8PaZ.js → LocalOnlyNotice-LBH1DBrs.js} +1 -1
  31. package/dashboard/dist/assets/{LoginCard-DTTIm8vk.js → LoginCard-B0vRJEcg.js} +1 -1
  32. package/dashboard/dist/assets/{LoginModal-BNcDdjfr.js → LoginModal-DdzgP43f.js} +1 -1
  33. package/dashboard/dist/assets/{LoginPage-CQgXP7Ee.js → LoginPage-B4VCQxzn.js} +1 -1
  34. package/dashboard/dist/assets/{PetPage-Cw_kAPRs.js → PetPage-Cmf6aXc9.js} +1 -1
  35. package/dashboard/dist/assets/{PopoverPopup-NYiGE8A2.js → PopoverPopup-BzfELnIC.js} +1 -1
  36. package/dashboard/dist/assets/{ProviderIcon-Bp7iFJ_m.js → ProviderIcon-ClHXNkQ0.js} +1 -1
  37. package/dashboard/dist/assets/{ResetPasswordPage-Cf9kAWDW.js → ResetPasswordPage-BeUpNt_6.js} +1 -1
  38. package/dashboard/dist/assets/{Select-kIcvQFAo.js → Select-BHEXdYHu.js} +1 -1
  39. package/dashboard/dist/assets/{SelectItemText-BpIsAg3b.js → SelectItemText-aaQK_QIt.js} +1 -1
  40. package/dashboard/dist/assets/{SelfHostPage-Ch2vvSwI.js → SelfHostPage-ClNhKnlP.js} +1 -1
  41. package/dashboard/dist/assets/{ServiceStatusPage-hoYBvGbu.js → ServiceStatusPage-Byd_s6FS.js} +1 -1
  42. package/dashboard/dist/assets/{SessionsPage-BzRB6q-Z.js → SessionsPage-u3_b4PO7.js} +2 -2
  43. package/dashboard/dist/assets/{SettingsPage-DRl2uX-i.js → SettingsPage-DweCAbsy.js} +2 -2
  44. package/dashboard/dist/assets/{SkillsPage-CkqThTZL.js → SkillsPage-Bb-PVfux.js} +1 -1
  45. package/dashboard/dist/assets/{TokenGalaxy-eLG-UIZY.js → TokenGalaxy-CubA3PXu.js} +1 -1
  46. package/dashboard/dist/assets/{TooltipPopup-bnMJyilQ.js → TooltipPopup-DMliWhoK.js} +1 -1
  47. package/dashboard/dist/assets/{TrendMonitor-X7-aGzIv.js → TrendMonitor-as8idaOy.js} +1 -1
  48. package/dashboard/dist/assets/{WidgetsPage-CGznIzrW.js → WidgetsPage-DDPR4v0R.js} +1 -1
  49. package/dashboard/dist/assets/{WrappedPage-p31-uUoF.js → WrappedPage-zZzgYz6s.js} +1 -1
  50. package/dashboard/dist/assets/{__vite-browser-external-2g_4s3ot.js → __vite-browser-external-DWN9Fb-H.js} +2 -2
  51. package/dashboard/dist/assets/{agent-logos-2TVT3fIE.js → agent-logos-CoNhCm9-.js} +1 -1
  52. package/dashboard/dist/assets/{arrow-left-DL0hAp_7.js → arrow-left-C5hDp7fc.js} +1 -1
  53. package/dashboard/dist/assets/{arrow-right-DFCpnV_9.js → arrow-right-DEvMmSiA.js} +1 -1
  54. package/dashboard/dist/assets/{arrow-up-right-DLvfE0Wu.js → arrow-up-right-DxY0neJ4.js} +1 -1
  55. package/dashboard/dist/assets/{calendar-days-B0aDoKSG.js → calendar-days-bzh7-lab.js} +1 -1
  56. package/dashboard/dist/assets/{check-C_cfrxiz.js → check-CSZvcC3X.js} +1 -1
  57. package/dashboard/dist/assets/{chevron-down-Ck8ml43e.js → chevron-down-CsiGcG0G.js} +1 -1
  58. package/dashboard/dist/assets/{cloud-checkout-PYnwNfdH.js → cloud-checkout-z_eDVwm6.js} +1 -1
  59. package/dashboard/dist/assets/{composite-INW-ELWX.js → composite-Cq0CmNAv.js} +1 -1
  60. package/dashboard/dist/assets/{download-B7uokeIo.js → download-DqLpubIF.js} +1 -1
  61. package/dashboard/dist/assets/{external-link-CI3crg4K.js → external-link-B8E8tbB3.js} +1 -1
  62. package/dashboard/dist/assets/{flame-DCzvFKV1.js → flame-CrJDlnro.js} +1 -1
  63. package/dashboard/dist/assets/{format-tokens-CSTEYK2m.js → format-tokens-DPIGGOlt.js} +1 -1
  64. package/dashboard/dist/assets/{gift-dEHDFMc6.js → gift-CCp4Hh50.js} +1 -1
  65. package/dashboard/dist/assets/{host-mode-r2SW9Mdv.js → host-mode-xzpMLcwP.js} +1 -1
  66. package/dashboard/dist/assets/{icons-q-3zvEkh.js → icons-CbB9Y-eV.js} +1 -1
  67. package/dashboard/dist/assets/{index-CyHYj9XI.js → index-BiK5-tQp.js} +1 -1
  68. package/dashboard/dist/assets/{index-BV7qwUw4.js → index-DX7nYrHb.js} +1 -1
  69. package/dashboard/dist/assets/{index-BbrsgHf4.js → index-zuC7FU-t.js} +1 -1
  70. package/dashboard/dist/assets/{info-BBdY9hV4.js → info-B3NKYwWG.js} +1 -1
  71. package/dashboard/dist/assets/{link-2-CLPePfXs.js → link-2-BRc8d8M9.js} +1 -1
  72. package/dashboard/dist/assets/{loader-circle-ETrjzfmn.js → loader-circle-Cm5Nsgp-.js} +1 -1
  73. package/dashboard/dist/assets/{modifiers.esm-DHqnp2ol.js → modifiers.esm-CYLYBECB.js} +1 -1
  74. package/dashboard/dist/assets/{monitor-smartphone-D1kdzrdb.js → monitor-smartphone--IZ4D84F.js} +1 -1
  75. package/dashboard/dist/assets/{play-Cxp-ronD.js → play-CUrMOLtq.js} +1 -1
  76. package/dashboard/dist/assets/{plus-4n94VzDK.js → plus-0hrCDl4r.js} +1 -1
  77. package/dashboard/dist/assets/{provider-display-CRlbeO7t.js → provider-display-CNK0FN3Q.js} +1 -1
  78. package/dashboard/dist/assets/{react-DlHjGQFN.js → react-CCNSVHEA.js} +1 -1
  79. package/dashboard/dist/assets/{safePolygon-CVZ27a2_.js → safePolygon-DsolkMUX.js} +1 -1
  80. package/dashboard/dist/assets/{search-BDPr56_h.js → search-DYmYb9xY.js} +1 -1
  81. package/dashboard/dist/assets/{server-Bm7fHvVa.js → server-CYcqzdSW.js} +1 -1
  82. package/dashboard/dist/assets/{shield-check-DtT8ACzI.js → shield-check-5zABLIr6.js} +1 -1
  83. package/dashboard/dist/assets/{skills-api-Dc1-2qu6.js → skills-api-CD-ojBGj.js} +1 -1
  84. package/dashboard/dist/assets/{sortable.esm-B-qN-Xk2.js → sortable.esm-BCn2Ms6R.js} +1 -1
  85. package/dashboard/dist/assets/{store-gHeBU8dQ.js → store-B22kwLs0.js} +1 -1
  86. package/dashboard/dist/assets/{terminal-D4VZbvhg.js → terminal-CTv-oTU2.js} +1 -1
  87. package/dashboard/dist/assets/{trash-BZtLAFQy.js → trash-C5MAh3GO.js} +1 -1
  88. package/dashboard/dist/assets/{use-community-stats-BdqndrbB.js → use-community-stats-BrgrxUD2.js} +1 -1
  89. package/dashboard/dist/assets/{use-latest-request-guard-DhGg1cDS.js → use-latest-request-guard-B1_rbvgH.js} +1 -1
  90. package/dashboard/dist/assets/{use-limits-display-prefs-D3HOcRFv.js → use-limits-display-prefs-BOk5f-HM.js} +1 -1
  91. package/dashboard/dist/assets/{use-native-settings-BniKwA_n.js → use-native-settings-B2gc_m9W.js} +1 -1
  92. package/dashboard/dist/assets/{use-ordered-list-b09H7EHq.js → use-ordered-list-N3sGpJ0u.js} +1 -1
  93. package/dashboard/dist/assets/{use-pet-settings-CPZdlq_e.js → use-pet-settings-sWFXgR3m.js} +2 -2
  94. package/dashboard/dist/assets/use-reduced-motion-C3MBYVqm.js +1 -0
  95. package/dashboard/dist/assets/{use-transform-CIdxjmI8.js → use-transform-BsaLmw46.js} +1 -1
  96. package/dashboard/dist/assets/{use-usage-limits-eJlU65yY.js → use-usage-limits-wL7v-S0r.js} +1 -1
  97. package/dashboard/dist/assets/{useCurrency-CM22CmAq.js → useCurrency-CbCnjf-N.js} +1 -1
  98. package/dashboard/dist/assets/{usePositioner-B3l2ulTw.js → usePositioner-MepYlL0A.js} +1 -1
  99. package/dashboard/dist/assets/{useTokenFormat-D7nzgxKw.js → useTokenFormat-Bq-rwuKa.js} +1 -1
  100. package/dashboard/dist/assets/{zap-Daxct1WV.js → zap-1ah5e11g.js} +1 -1
  101. package/dashboard/dist/index.html +1 -1
  102. package/dashboard/dist/ip-check.html +1 -1
  103. package/dashboard/dist/leaderboard.html +1 -1
  104. package/dashboard/dist/share.html +1 -1
  105. package/package.json +1 -1
  106. package/src/cli.js +1 -1
  107. package/src/lib/pricing/seed-snapshot.json +1 -1
  108. package/src/lib/rollout.js +49 -16
  109. package/src/lib/session-analytics.js +546 -52
  110. package/src/lib/session-performance.js +24 -1
  111. package/dashboard/dist/assets/DialogDescription-DBqGGWNj.js +0 -1
  112. package/dashboard/dist/assets/use-reduced-motion-D1gcKJUo.js +0 -1
@@ -5127,16 +5127,21 @@ function buildV2Sql(sessionTable, watermark = null) {
5127
5127
  // sessionTable (which session table exists, session_v2 preferred over session
5128
5128
  // via DESC). Returns null when the probe itself fails — callers treat that as
5129
5129
  // v1-only, matching the pre-existing silent-degradation contract.
5130
- function detectOpencodeMessageLayout(dbPath, sqliteOptions = {}) {
5130
+ function detectOpencodeMessageLayout(dbPath, sqliteOptions = {}, { propagateReadFailure = false } = {}) {
5131
5131
  let rows;
5132
5132
  try {
5133
5133
  rows = readSqliteJsonRows(
5134
5134
  dbPath,
5135
5135
  `SELECT (SELECT 1 FROM session_message LIMIT 1) AS hasRows,
5136
5136
  (SELECT name FROM sqlite_master WHERE name IN ('session','session_v2') ORDER BY name DESC LIMIT 1) AS sessionTable`,
5137
- { label: "OpenCode", timeout: 10_000, maxBuffer: 1024 * 1024, ...sqliteOptions },
5137
+ { label: "OpenCode", timeout: 10_000, maxBuffer: 1024 * 1024, ...sqliteOptions, throwOnReadFailure: true },
5138
5138
  );
5139
- } catch (_e) {
5139
+ } catch (error) {
5140
+ // A missing session_message table is the normal v1-only miss; with
5141
+ // propagateReadFailure a real read failure must reach the caller — the
5142
+ // session scanner would otherwise skip the v2 generation silently and
5143
+ // cache a zero-token inventory over a readable-in-principle database.
5144
+ if (propagateReadFailure && !isMissingSqliteTableError(error)) throw error;
5140
5145
  return null;
5141
5146
  }
5142
5147
  if (!Array.isArray(rows) || rows.length === 0) return null;
@@ -5156,7 +5161,17 @@ function opencodeMessageProvider(data) {
5156
5161
  return data?.providerID || data?.model?.providerID || "";
5157
5162
  }
5158
5163
 
5159
- function readOpencodeDbMessagesIncremental(dbPath, previousCursor = null, sqliteOptions = {}) {
5164
+ // readSqliteJsonRows wraps its two backend errors into the thrown Error, so a
5165
+ // "table genuinely absent" miss and a "database unreadable" failure look the
5166
+ // same to a caller that only catches. Both backends spell a missing table
5167
+ // "no such table" — use that to keep the normal miss on the tolerant path
5168
+ // while real read failures can propagate.
5169
+ function isMissingSqliteTableError(error) {
5170
+ const messages = [error?.message, error?.cliError?.message, error?.nodeSqliteError?.message];
5171
+ return messages.some((m) => typeof m === "string" && m.includes("no such table"));
5172
+ }
5173
+
5174
+ function readOpencodeDbMessagesIncremental(dbPath, previousCursor = null, sqliteOptions = {}, { propagateReadFailure = false } = {}) {
5160
5175
  if (!dbPath || !fssync.existsSync(dbPath)) return { messages: [], cursor: null };
5161
5176
 
5162
5177
  const identity = opencodeDbIdentity(dbPath);
@@ -5223,7 +5238,11 @@ function readOpencodeDbMessagesIncremental(dbPath, previousCursor = null, sqlite
5223
5238
  throwOnReadFailure: true,
5224
5239
  });
5225
5240
  return Array.isArray(rows) ? rows : [];
5226
- } catch (_e) {
5241
+ } catch (error) {
5242
+ // A missing table is the normal "other generation's layout" miss; an
5243
+ // unreadable database is not — with propagateReadFailure the session
5244
+ // scan aborts instead of caching a zero-token inventory over it.
5245
+ if (propagateReadFailure && !isMissingSqliteTableError(error)) throw error;
5227
5246
  return null; // query-level failure (e.g. wrong generation's table)
5228
5247
  }
5229
5248
  };
@@ -5301,7 +5320,7 @@ function readOpencodeDbMessagesIncremental(dbPath, previousCursor = null, sqlite
5301
5320
  // baseline every database carries or degrades to), v2 runs only when the
5302
5321
  // probe confirms session_message has rows — this avoids firing a JOIN
5303
5322
  // against a non-existent session table on type-A databases.
5304
- const probe = detectOpencodeMessageLayout(effectiveDbPath, sqliteOptions);
5323
+ const probe = detectOpencodeMessageLayout(effectiveDbPath, sqliteOptions, { propagateReadFailure });
5305
5324
  const out = [];
5306
5325
  const nextCursor = {
5307
5326
  version: OPENCODE_DB_CURSOR_VERSION,
@@ -5341,8 +5360,8 @@ function readOpencodeDbMessagesIncremental(dbPath, previousCursor = null, sqlite
5341
5360
  }
5342
5361
  }
5343
5362
 
5344
- function readOpencodeDbMessages(dbPath, sqliteOptions = {}) {
5345
- return readOpencodeDbMessagesIncremental(dbPath, null, sqliteOptions).messages;
5363
+ function readOpencodeDbMessages(dbPath, sqliteOptions = {}, { propagateReadFailure = false } = {}) {
5364
+ return readOpencodeDbMessagesIncremental(dbPath, null, sqliteOptions, { propagateReadFailure }).messages;
5346
5365
  }
5347
5366
 
5348
5367
  // mimocode mirrors the user's Claude Code + claude-mem history into its own
@@ -5458,7 +5477,7 @@ const ZCODE_NATIVE_USAGE_COLUMNS = new Set([
5458
5477
  "cache_read_input_tokens",
5459
5478
  ]);
5460
5479
 
5461
- function detectZcodeNativeUsageLayout(dbPath, sqliteOptions = {}) {
5480
+ function detectZcodeNativeUsageLayout(dbPath, sqliteOptions = {}, { propagateReadFailure = false } = {}) {
5462
5481
  if (!dbPath || !fssync.existsSync(dbPath)) return null;
5463
5482
  let rows;
5464
5483
  try {
@@ -5475,7 +5494,11 @@ function detectZcodeNativeUsageLayout(dbPath, sqliteOptions = {}) {
5475
5494
  throwOnReadFailure: true,
5476
5495
  },
5477
5496
  );
5478
- } catch (_error) {
5497
+ } catch (error) {
5498
+ // propagateReadFailure: an unreadable db is a failure, not "no native
5499
+ // layout" — the session scanner must skip the file, not fall back to an
5500
+ // empty legacy read and cache zero tokens.
5501
+ if (propagateReadFailure) throw error;
5479
5502
  return null;
5480
5503
  }
5481
5504
  const modelUsageColumns = new Set(
@@ -5545,7 +5568,13 @@ function buildZcodeNativeUsageSql({ hasSessionDirectory }) {
5545
5568
  ORDER BY mu.started_at ASC, mu.id ASC`;
5546
5569
  }
5547
5570
 
5548
- function readZcodeNativeUsageMessages(dbPath, sqliteOptions = {}) {
5571
+ // `propagateReadFailure` (off by default): when the native usage layout is
5572
+ // present but its row query fails, throw instead of returning null. The usage
5573
+ // queue treats that fallthrough as "no native table, use legacy" — correct for
5574
+ // its own resilience — but the session scanner must not cache a zero-token
5575
+ // inventory over a failed read (the browser then hides the sessions entirely
5576
+ // instead of reporting the db as skipped).
5577
+ function readZcodeNativeUsageMessages(dbPath, sqliteOptions = {}, { propagateReadFailure = false } = {}) {
5549
5578
  let snapshot = null;
5550
5579
  let effectiveDbPath = dbPath;
5551
5580
  if (isUncPath(dbPath)) {
@@ -5560,7 +5589,7 @@ function readZcodeNativeUsageMessages(dbPath, sqliteOptions = {}) {
5560
5589
 
5561
5590
  let rows;
5562
5591
  try {
5563
- const layout = detectZcodeNativeUsageLayout(effectiveDbPath, sqliteOptions);
5592
+ const layout = detectZcodeNativeUsageLayout(effectiveDbPath, sqliteOptions, { propagateReadFailure });
5564
5593
  if (!layout) return null;
5565
5594
  rows = readSqliteJsonRows(effectiveDbPath, buildZcodeNativeUsageSql(layout), {
5566
5595
  label: "ZCode",
@@ -5569,7 +5598,8 @@ function readZcodeNativeUsageMessages(dbPath, sqliteOptions = {}) {
5569
5598
  ...sqliteOptions,
5570
5599
  throwOnReadFailure: true,
5571
5600
  });
5572
- } catch (_error) {
5601
+ } catch (error) {
5602
+ if (propagateReadFailure) throw error;
5573
5603
  return null;
5574
5604
  } finally {
5575
5605
  if (snapshot) snapshot.cleanup();
@@ -5621,10 +5651,10 @@ function readZcodeNativeUsageMessages(dbPath, sqliteOptions = {}) {
5621
5651
  // table is authoritative from its first completed row onward, but it is not a
5622
5652
  // historical backfill. Keep legacy rows before that boundary so merely adding
5623
5653
  // the new table cannot make older usage disappear from TokenTracker.
5624
- function readZcodeDbMessages(dbPath, sqliteOptions = {}) {
5654
+ function readZcodeDbMessages(dbPath, sqliteOptions = {}, { propagateReadFailure = false } = {}) {
5625
5655
  if (!dbPath || !fssync.existsSync(dbPath)) return [];
5626
- const nativeMessages = readZcodeNativeUsageMessages(dbPath, sqliteOptions);
5627
- const legacyMessages = readOpencodeDbMessages(dbPath, sqliteOptions)
5656
+ const nativeMessages = readZcodeNativeUsageMessages(dbPath, sqliteOptions, { propagateReadFailure });
5657
+ const legacyMessages = readOpencodeDbMessages(dbPath, sqliteOptions, { propagateReadFailure })
5628
5658
  .filter((message) => isZcodeNativeMessage(message.data))
5629
5659
  .map(normalizeZcodeLegacyMessage);
5630
5660
  if (nativeMessages === null) return legacyMessages;
@@ -24559,6 +24589,8 @@ module.exports = {
24559
24589
  readOpencodeDbMessagesIncremental,
24560
24590
  readMimoDbMessages,
24561
24591
  readZcodeDbMessages,
24592
+ coerceEpochMs,
24593
+ normalizeOpencodeModelFields,
24562
24594
  hasZcodeNativeUsageSchema,
24563
24595
  resolveQoderDbPath,
24564
24596
  resolveQoderDbPaths,
@@ -24593,6 +24625,7 @@ module.exports = {
24593
24625
  parseGeminiIncremental,
24594
24626
  parseOpencodeIncremental,
24595
24627
  parseOpencodeDbIncremental,
24628
+ deriveOpencodeMessageFingerprint,
24596
24629
  parseQoderDbIncremental,
24597
24630
  openclawCursorKey,
24598
24631
  parseOpenclawIncremental,