tokentracker-cli 0.86.1 → 0.87.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (101) hide show
  1. package/dashboard/dist/assets/{AchievementBadge-BHWjTRZh.js → AchievementBadge-HMyiDgSW.js} +1 -1
  2. package/dashboard/dist/assets/{AchievementsPage-X6Z6fiAx.js → AchievementsPage-CvSRglOk.js} +2 -2
  3. package/dashboard/dist/assets/{AchievementsSection-DL2CccQ8.js → AchievementsSection-C5EttnRJ.js} +1 -1
  4. package/dashboard/dist/assets/{BadgeDetailModal-DKn88JDX.js → BadgeDetailModal-CMrIWtRh.js} +1 -1
  5. package/dashboard/dist/assets/{Card-B_gKsFZR.js → Card-j0PoKNVi.js} +1 -1
  6. package/dashboard/dist/assets/{ClawdAnimated-vEB5WCNu.js → ClawdAnimated-CpMXIDm6.js} +1 -1
  7. package/dashboard/dist/assets/{CommandPalette-BoxeCsUF.js → CommandPalette-BQVCHqxf.js} +1 -1
  8. package/dashboard/dist/assets/{CommunityStatsModal-BwELjQld.js → CommunityStatsModal-K8Jfw2Sp.js} +1 -1
  9. package/dashboard/dist/assets/{ConfirmModal-j8yHWm2k.js → ConfirmModal-Ci8UM9GC.js} +1 -1
  10. package/dashboard/dist/assets/Controls-CzqxI8mV.js +1 -0
  11. package/dashboard/dist/assets/DashboardPage-CYT2z3MQ.js +1 -0
  12. package/dashboard/dist/assets/{DevicePage-k4Lr11LG.js → DevicePage-iLtjOHbK.js} +1 -1
  13. package/dashboard/dist/assets/{DialogClose-C-ZhX9eY.js → DialogClose-DpqbOjK1.js} +1 -1
  14. package/dashboard/dist/assets/DialogDescription-Cjk1aws-.js +1 -0
  15. package/dashboard/dist/assets/{DialogTitle-XCGSHZDz.js → DialogTitle-CHvX9I6f.js} +1 -1
  16. package/dashboard/dist/assets/{FadeIn-ljP_7vPC.js → FadeIn-PYu_vYZJ.js} +1 -1
  17. package/dashboard/dist/assets/{HeaderGithubStar-D4QupeSb.js → HeaderGithubStar-BgaN38HY.js} +1 -1
  18. package/dashboard/dist/assets/{HoverTooltip-Dkpz8RmH.js → HoverTooltip-DIGWJnwA.js} +1 -1
  19. package/dashboard/dist/assets/{IpCheckPage-WkZK9Tr3.js → IpCheckPage-CAgOfnQK.js} +1 -1
  20. package/dashboard/dist/assets/{LandingPage-Dp3m0uJg.js → LandingPage-DBAozV9A.js} +2 -2
  21. package/dashboard/dist/assets/{LeaderboardAvatar-DleP6bK7.js → LeaderboardAvatar-Bcz1JUbC.js} +1 -1
  22. package/dashboard/dist/assets/{LeaderboardPage-DTwMMaF2.js → LeaderboardPage-BnzlsgL5.js} +2 -2
  23. package/dashboard/dist/assets/{LeaderboardProfileModal-xdDlcRDd.js → LeaderboardProfileModal-D9Ohzup_.js} +3 -3
  24. package/dashboard/dist/assets/{LeaderboardProfilePage-Ckytgq9h.js → LeaderboardProfilePage-Dly5CxZA.js} +1 -1
  25. package/dashboard/dist/assets/{LimitsPage-D_2cV3S4.js → LimitsPage-r3SxrYQZ.js} +1 -1
  26. package/dashboard/dist/assets/{LocalOnlyNotice-DpCb8VIO.js → LocalOnlyNotice-BO4X70A3.js} +1 -1
  27. package/dashboard/dist/assets/{LoginCard-BeAb35_3.js → LoginCard-Clafry4p.js} +1 -1
  28. package/dashboard/dist/assets/{LoginModal-DNdAgKeE.js → LoginModal-C5rEYAEU.js} +1 -1
  29. package/dashboard/dist/assets/{LoginPage-nuWkBuqy.js → LoginPage-CT27nQAo.js} +1 -1
  30. package/dashboard/dist/assets/PetPage-CX7uXP3E.js +1 -0
  31. package/dashboard/dist/assets/{PopoverPopup-BCaeRKf4.js → PopoverPopup-C9z-Tti_.js} +1 -1
  32. package/dashboard/dist/assets/{ProviderIcon-C_Fpc2jL.js → ProviderIcon-C7KoQJF1.js} +1 -1
  33. package/dashboard/dist/assets/{ResetPasswordPage-lLDxtpC9.js → ResetPasswordPage-CxpERa5n.js} +1 -1
  34. package/dashboard/dist/assets/{SegmentedControl-Bnfv5lDS.js → SegmentedControl-CxNTG8xY.js} +1 -1
  35. package/dashboard/dist/assets/{Select-CvY_Y0WS.js → Select-CeqMgH_w.js} +1 -1
  36. package/dashboard/dist/assets/{SelectItemText-DX4QYfBW.js → SelectItemText-C0xexMQo.js} +1 -1
  37. package/dashboard/dist/assets/{ServiceStatusPage-DcUrtacl.js → ServiceStatusPage-Du-c3oKi.js} +1 -1
  38. package/dashboard/dist/assets/{SessionsPage-CJXyaHQA.js → SessionsPage-BoxarCQo.js} +1 -1
  39. package/dashboard/dist/assets/SettingsPage-C21iHQrS.js +1 -0
  40. package/dashboard/dist/assets/{SkillsPage-BGvK3HZ0.js → SkillsPage-CNFg35-t.js} +1 -1
  41. package/dashboard/dist/assets/{TokenGalaxy-D9_H79bK.js → TokenGalaxy-C66WkuEi.js} +1 -1
  42. package/dashboard/dist/assets/{ToolbarRootContext-BsM_3QBs.js → ToolbarRootContext-DEJ2rZnD.js} +1 -1
  43. package/dashboard/dist/assets/{TrendMonitor-D2QSVlSi.js → TrendMonitor-CRo_dn81.js} +1 -1
  44. package/dashboard/dist/assets/WidgetsPage-CUWKRjBX.js +1 -0
  45. package/dashboard/dist/assets/{WrappedPage-DliB3OZk.js → WrappedPage-BbcgPrhv.js} +1 -1
  46. package/dashboard/dist/assets/{__vite-browser-external-CzDhMv0q.js → __vite-browser-external-Bnwhf2Ay.js} +26 -13
  47. package/dashboard/dist/assets/__vite-browser-external-CzQk3FUc.css +1 -0
  48. package/dashboard/dist/assets/{agent-logos-Q7rTqkGv.js → agent-logos-CdqF_ZVu.js} +1 -1
  49. package/dashboard/dist/assets/{arrow-up-right-DwqQgMsR.js → arrow-up-right-Bo-mycRz.js} +1 -1
  50. package/dashboard/dist/assets/{check-Cypjnyke.js → check-D1cxLlaS.js} +1 -1
  51. package/dashboard/dist/assets/{chevron-right-LZRe0crm.js → chevron-right-Cqu6YRtu.js} +1 -1
  52. package/dashboard/dist/assets/{copy-BUe15mXV.js → copy-DdFT4OsA.js} +1 -1
  53. package/dashboard/dist/assets/{download-BhjaQuUD.js → download-BaGijNSk.js} +1 -1
  54. package/dashboard/dist/assets/{external-link-BHU7m_Df.js → external-link-BDXdiGgV.js} +1 -1
  55. package/dashboard/dist/assets/{flame-BPQ7FpRu.js → flame-nWYIAJO7.js} +1 -1
  56. package/dashboard/dist/assets/{format-tokens-C0XEJ96L.js → format-tokens-DKoNQugI.js} +1 -1
  57. package/dashboard/dist/assets/{icons-De5Qo1lp.js → icons-DUVL4ucb.js} +1 -1
  58. package/dashboard/dist/assets/{index-lmWJH5W9.js → index-B8orqoRS.js} +1 -1
  59. package/dashboard/dist/assets/{index-UfiJKvuV.js → index-BfR-FhBV.js} +1 -1
  60. package/dashboard/dist/assets/{index-Cl8hqOBU.js → index-hwecSjsn.js} +1 -1
  61. package/dashboard/dist/assets/{info-CCPDu6hQ.js → info-D8dPbHW_.js} +1 -1
  62. package/dashboard/dist/assets/{limits-providers-B2Qjydn9.js → limits-providers-aVihEk9O.js} +1 -1
  63. package/dashboard/dist/assets/{link-2-Dl1DAfTL.js → link-2-BPrWtheW.js} +1 -1
  64. package/dashboard/dist/assets/{loader-circle-C-mC8s6j.js → loader-circle-R8Mc26Py.js} +1 -1
  65. package/dashboard/dist/assets/{maximize-2-C9YpCcsr.js → maximize-2-CDdVCGkE.js} +1 -1
  66. package/dashboard/dist/assets/{provider-display-DNXQkneb.js → provider-display-DjIxT1Tj.js} +1 -1
  67. package/dashboard/dist/assets/{react-LsYzFOQW.js → react-CPpseYXr.js} +1 -1
  68. package/dashboard/dist/assets/{search-D5SGjOTl.js → search-CwXFsVWP.js} +1 -1
  69. package/dashboard/dist/assets/{skills-api-CGRg1lZw.js → skills-api-BaWEPqAA.js} +1 -1
  70. package/dashboard/dist/assets/{store-BMdm145i.js → store-Dvj7C_TU.js} +1 -1
  71. package/dashboard/dist/assets/{terminal-HhtP7nqJ.js → terminal-HFPAmRVo.js} +1 -1
  72. package/dashboard/dist/assets/{trash-2-CeEoITVO.js → trash-2-BlMMnsHP.js} +1 -1
  73. package/dashboard/dist/assets/{use-community-stats-BTZHzzWd.js → use-community-stats-BnQkgDNp.js} +1 -1
  74. package/dashboard/dist/assets/{use-limits-display-prefs-DPNlMKcg.js → use-limits-display-prefs-CyRX2tSS.js} +1 -1
  75. package/dashboard/dist/assets/{use-ordered-list-CCLtmxXg.js → use-ordered-list-D5J9JQc3.js} +1 -1
  76. package/dashboard/dist/assets/use-reduced-motion-Bb_7eQY5.js +1 -0
  77. package/dashboard/dist/assets/{use-session-efficiency-pref-CrvLKyhz.js → use-session-efficiency-pref-CfCTFOw1.js} +1 -1
  78. package/dashboard/dist/assets/{use-transform-BnJ0PftW.js → use-transform-Cb0xIsIA.js} +1 -1
  79. package/dashboard/dist/assets/{use-usage-limits-BY3ZXlDo.js → use-usage-limits-Bcr5Rvg1.js} +1 -1
  80. package/dashboard/dist/assets/{useCurrency-BiFDQKMu.js → useCurrency-DePNHGhs.js} +1 -1
  81. package/dashboard/dist/assets/{useScrollLock-BXUoxe5p.js → useScrollLock-hvMIIQdN.js} +1 -1
  82. package/dashboard/dist/assets/{useTokenFormat-C6DBFS-R.js → useTokenFormat-D0HGlu5w.js} +1 -1
  83. package/dashboard/dist/assets/{zap-9H5t1Kye.js → zap-BYcuWUXQ.js} +1 -1
  84. package/dashboard/dist/index.html +2 -2
  85. package/dashboard/dist/ip-check.html +2 -2
  86. package/dashboard/dist/leaderboard.html +2 -2
  87. package/dashboard/dist/share.html +2 -2
  88. package/package.json +1 -1
  89. package/src/commands/sync.js +8 -9
  90. package/src/lib/codex-rollout-parser.js +8 -52
  91. package/src/lib/jsonl-lines.js +104 -0
  92. package/src/lib/pricing/seed-snapshot.json +1 -1
  93. package/src/lib/rollout.js +69 -11
  94. package/dashboard/dist/assets/DashboardPage-CkvAOuBF.js +0 -1
  95. package/dashboard/dist/assets/DialogDescription-BRiqm-uZ.js +0 -1
  96. package/dashboard/dist/assets/PetPage-CCLFROsF.js +0 -1
  97. package/dashboard/dist/assets/SettingsPage-BkgPxhGn.js +0 -1
  98. package/dashboard/dist/assets/WidgetsPage-BpWOr7-c.js +0 -1
  99. package/dashboard/dist/assets/__vite-browser-external-hXV_ZYTG.css +0 -1
  100. package/dashboard/dist/assets/use-native-settings-DFF0ouY5.js +0 -1
  101. package/dashboard/dist/assets/use-reduced-motion-DUtjZjIj.js +0 -1
@@ -6,6 +6,7 @@ const readline = require("node:readline");
6
6
 
7
7
  const crypto = require("node:crypto");
8
8
  const { ensureDir, writeJson, chmod600IfPossible } = require("./fs");
9
+ const { physicalJsonlRecords } = require("./jsonl-lines");
9
10
  const { readSqliteJsonRows, readSqliteJsonRowsAsync } = require("./sqlite-reader");
10
11
  const wsl = require("./wsl-probe");
11
12
  const { resolveInstallPaths } = require("./install-resolver");
@@ -180,7 +181,11 @@ async function parseRolloutIncremental({
180
181
  source,
181
182
  publicRepoResolver,
182
183
  diagnostics,
184
+ invalidRecordPolicy = "skip",
183
185
  }) {
186
+ if (invalidRecordPolicy !== "skip" && invalidRecordPolicy !== "throw") {
187
+ throw new TypeError(`unsupported invalidRecordPolicy: ${invalidRecordPolicy}`);
188
+ }
184
189
  await ensureDir(path.dirname(queuePath));
185
190
  let filesProcessed = 0;
186
191
  let eventsAggregated = 0;
@@ -446,6 +451,7 @@ async function parseRolloutIncremental({
446
451
  publicRepoCache,
447
452
  publicRepoResolver,
448
453
  projectContext,
454
+ invalidRecordPolicy,
449
455
  })
450
456
  : await parseRolloutFile({
451
457
  filePath,
@@ -467,6 +473,7 @@ async function parseRolloutIncremental({
467
473
  projectContext,
468
474
  seenCodexEvents: codexEventTracker,
469
475
  sessionId: codexSessionIdFromPath(filePath),
476
+ invalidRecordPolicy,
470
477
  });
471
478
 
472
479
  const nextCursor = {
@@ -1952,6 +1959,7 @@ async function parseRolloutFile({
1952
1959
  projectContext,
1953
1960
  seenCodexEvents,
1954
1961
  sessionId,
1962
+ invalidRecordPolicy,
1955
1963
  }) {
1956
1964
  const st = fileStat || (await fs.stat(filePath));
1957
1965
  const endOffset = st.size;
@@ -1968,8 +1976,10 @@ async function parseRolloutFile({
1968
1976
  };
1969
1977
  }
1970
1978
 
1971
- const stream = fssync.createReadStream(filePath, { encoding: "utf8", start: startOffset });
1972
- const rl = readline.createInterface({ input: stream, crlfDelay: Infinity });
1979
+ const stream = fssync.createReadStream(filePath, {
1980
+ start: startOffset,
1981
+ end: endOffset - 1,
1982
+ });
1973
1983
 
1974
1984
  let model = typeof lastModel === "string" ? lastModel : null;
1975
1985
  const usageDeltaState = createUsageDeltaState({
@@ -1994,8 +2004,19 @@ async function parseRolloutFile({
1994
2004
  let currentProjectRef = projectRef || null;
1995
2005
  let currentProjectKey = projectKey || null;
1996
2006
  let eventsAggregated = 0;
2007
+ let scannedEndOffset = startOffset;
2008
+ let committedEndOffset = startOffset;
2009
+
2010
+ const invalidUtf8 = invalidRecordPolicy === "throw" ? "throw" : "record";
2011
+ for await (const record of physicalJsonlRecords(stream, { invalidUtf8 })) {
2012
+ scannedEndOffset += record.physicalBytes;
2013
+ if (record.terminated) committedEndOffset = scannedEndOffset;
2014
+ if (!record.utf8Valid) {
2015
+ if (!record.terminated) break;
2016
+ continue;
2017
+ }
1997
2018
 
1998
- for await (const line of rl) {
2019
+ const { line } = record;
1999
2020
  if (!line) continue;
2000
2021
  const maybeTokenCount = line.includes('"token_count"');
2001
2022
  const maybeTurnContext =
@@ -2005,14 +2026,28 @@ async function parseRolloutFile({
2005
2026
  line.includes('"cwd"') ||
2006
2027
  line.includes('"current_date"') ||
2007
2028
  line.includes('"forked_from_id"'));
2008
- if (!maybeTokenCount && !maybeTurnContext) continue;
2029
+ if (!maybeTokenCount && !maybeTurnContext) {
2030
+ if (invalidRecordPolicy === "throw" || !record.terminated) {
2031
+ try {
2032
+ JSON.parse(line);
2033
+ committedEndOffset = scannedEndOffset;
2034
+ } catch (error) {
2035
+ if (invalidRecordPolicy === "throw") throw error;
2036
+ break;
2037
+ }
2038
+ }
2039
+ continue;
2040
+ }
2009
2041
 
2010
2042
  let obj;
2011
2043
  try {
2012
2044
  obj = JSON.parse(line);
2013
- } catch (_e) {
2045
+ } catch (error) {
2046
+ if (invalidRecordPolicy === "throw") throw error;
2047
+ if (!record.terminated) break;
2014
2048
  continue;
2015
2049
  }
2050
+ if (!record.terminated) committedEndOffset = scannedEndOffset;
2016
2051
 
2017
2052
  if (
2018
2053
  (obj?.type === "turn_context" || obj?.type === "session_meta") &&
@@ -2156,7 +2191,7 @@ async function parseRolloutFile({
2156
2191
  }
2157
2192
 
2158
2193
  return {
2159
- endOffset,
2194
+ endOffset: committedEndOffset,
2160
2195
  lastTotal: latestTotal,
2161
2196
  tokenUsageBaselines: snapshotUsageBaselines(usageDeltaState),
2162
2197
  lastModel: model,
@@ -2176,6 +2211,7 @@ async function scanRolloutProjectFileContexts({
2176
2211
  publicRepoCache,
2177
2212
  publicRepoResolver,
2178
2213
  projectContext,
2214
+ invalidRecordPolicy,
2179
2215
  }) {
2180
2216
  const st = fileStat || (await fs.stat(filePath));
2181
2217
  const endOffset = st.size;
@@ -2192,11 +2228,21 @@ async function scanRolloutProjectFileContexts({
2192
2228
  };
2193
2229
  }
2194
2230
 
2195
- const stream = fssync.createReadStream(filePath, { encoding: "utf8", start: 0 });
2196
- const rl = readline.createInterface({ input: stream, crlfDelay: Infinity });
2231
+ const stream = fssync.createReadStream(filePath, { start: 0, end: endOffset - 1 });
2197
2232
  let currentCwd = null;
2233
+ let scannedEndOffset = 0;
2234
+ let committedEndOffset = 0;
2235
+
2236
+ const invalidUtf8 = invalidRecordPolicy === "throw" ? "throw" : "record";
2237
+ for await (const record of physicalJsonlRecords(stream, { invalidUtf8 })) {
2238
+ scannedEndOffset += record.physicalBytes;
2239
+ if (record.terminated) committedEndOffset = scannedEndOffset;
2240
+ if (!record.utf8Valid) {
2241
+ if (!record.terminated) break;
2242
+ continue;
2243
+ }
2198
2244
 
2199
- for await (const line of rl) {
2245
+ const { line } = record;
2200
2246
  if (
2201
2247
  !line ||
2202
2248
  !(
@@ -2205,15 +2251,27 @@ async function scanRolloutProjectFileContexts({
2205
2251
  ) ||
2206
2252
  !line.includes('"cwd"')
2207
2253
  ) {
2254
+ if (line && (invalidRecordPolicy === "throw" || !record.terminated)) {
2255
+ try {
2256
+ JSON.parse(line);
2257
+ committedEndOffset = scannedEndOffset;
2258
+ } catch (error) {
2259
+ if (invalidRecordPolicy === "throw") throw error;
2260
+ break;
2261
+ }
2262
+ }
2208
2263
  continue;
2209
2264
  }
2210
2265
 
2211
2266
  let obj;
2212
2267
  try {
2213
2268
  obj = JSON.parse(line);
2214
- } catch (_e) {
2269
+ } catch (error) {
2270
+ if (invalidRecordPolicy === "throw") throw error;
2271
+ if (!record.terminated) break;
2215
2272
  continue;
2216
2273
  }
2274
+ if (!record.terminated) committedEndOffset = scannedEndOffset;
2217
2275
  if (
2218
2276
  (obj?.type !== "turn_context" && obj?.type !== "session_meta") ||
2219
2277
  !obj?.payload ||
@@ -2237,7 +2295,7 @@ async function scanRolloutProjectFileContexts({
2237
2295
  }
2238
2296
 
2239
2297
  return {
2240
- endOffset,
2298
+ endOffset: committedEndOffset,
2241
2299
  lastTotal,
2242
2300
  tokenUsageBaselines,
2243
2301
  lastModel,