tokentracker-cli 1.3.13 → 1.3.14

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 (114) hide show
  1. package/dashboard/dist/assets/{AchievementBadge-DkNsd5tj.js → AchievementBadge-DJK8AWBF.js} +1 -1
  2. package/dashboard/dist/assets/{AchievementsPage-Dr72Hcog.js → AchievementsPage-Cle78oKH.js} +2 -2
  3. package/dashboard/dist/assets/{AchievementsSection-CkOdGlnD.js → AchievementsSection-BPqXDoPP.js} +1 -1
  4. package/dashboard/dist/assets/{BadgeDetailModal-DADLfBsK.js → BadgeDetailModal-HsH_Pwsu.js} +1 -1
  5. package/dashboard/dist/assets/{BotAnimated-k6u1GRzw.js → BotAnimated-BWy2-z4Q.js} +1 -1
  6. package/dashboard/dist/assets/{Card-Dk6s3h-P.js → Card-DPGBuBDb.js} +1 -1
  7. package/dashboard/dist/assets/{CloudCheckoutPage-DL0pvok0.js → CloudCheckoutPage-ohIQnIhe.js} +1 -1
  8. package/dashboard/dist/assets/{CloudPage-BizN1MZL.js → CloudPage-OYiiZ4c4.js} +2 -2
  9. package/dashboard/dist/assets/{CommandPalette-B2crDNlV.js → CommandPalette-BmDZmpMi.js} +1 -1
  10. package/dashboard/dist/assets/{CommunityStatsModal-C6Rc5NME.js → CommunityStatsModal-L86uJgyp.js} +1 -1
  11. package/dashboard/dist/assets/{ConfirmModal-BrxBQn4n.js → ConfirmModal-COQfPXos.js} +1 -1
  12. package/dashboard/dist/assets/{Controls-C2mEPI72.js → Controls-BkKlT6Dz.js} +1 -1
  13. package/dashboard/dist/assets/{DashboardPage-BomPd7nt.js → DashboardPage-3dlQBOjz.js} +1 -1
  14. package/dashboard/dist/assets/{DateRangePopover-Gz-N_D7O.js → DateRangePopover-D0UeP8ig.js} +1 -1
  15. package/dashboard/dist/assets/{DevicePage-wmnNx9bd.js → DevicePage-K3CdWKaf.js} +1 -1
  16. package/dashboard/dist/assets/{DialogClose-D1dzj_on.js → DialogClose-DKQ2ZVA0.js} +1 -1
  17. package/dashboard/dist/assets/DialogDescription-MbuaPFlj.js +1 -0
  18. package/dashboard/dist/assets/{DialogTitle-BBxNf3O8.js → DialogTitle-ufFnN-8D.js} +1 -1
  19. package/dashboard/dist/assets/{ElectricLogo-DCopeDc8.js → ElectricLogo-Bb79UnTo.js} +1 -1
  20. package/dashboard/dist/assets/{FadeIn-DSndojVd.js → FadeIn-DlAKIU4I.js} +1 -1
  21. package/dashboard/dist/assets/{HeaderGithubStar-BBAGbevf.js → HeaderGithubStar-CzwSyhEY.js} +1 -1
  22. package/dashboard/dist/assets/{HoverTooltip-COD3xE9E.js → HoverTooltip-BEpwekkd.js} +1 -1
  23. package/dashboard/dist/assets/{IpCheckPage-BtMWefop.js → IpCheckPage-C7kpZ9JX.js} +1 -1
  24. package/dashboard/dist/assets/{LandingPage-DN2IVBw7.js → LandingPage-CfYk0Jzy.js} +2 -2
  25. package/dashboard/dist/assets/{LeaderboardPage-DkJowsRI.js → LeaderboardPage-XgjAHwpy.js} +2 -2
  26. package/dashboard/dist/assets/{LeaderboardProBadge-CRRphJNs.js → LeaderboardProBadge-wSlqVjBb.js} +1 -1
  27. package/dashboard/dist/assets/{LeaderboardProfileModal-WmZAsZx5.js → LeaderboardProfileModal-DaQrNYnu.js} +3 -3
  28. package/dashboard/dist/assets/{LeaderboardProfilePage-DWHu-eOp.js → LeaderboardProfilePage-3SWjG8FQ.js} +1 -1
  29. package/dashboard/dist/assets/{LimitsPage-BRFAWm-1.js → LimitsPage-DvM57ri3.js} +1 -1
  30. package/dashboard/dist/assets/{LocalOnlyNotice-BjJ8N4Zc.js → LocalOnlyNotice-CY6eDJEk.js} +1 -1
  31. package/dashboard/dist/assets/{LoginCard-CYmjHoYK.js → LoginCard-4bdpPQeD.js} +1 -1
  32. package/dashboard/dist/assets/{LoginModal-DX1D9F8b.js → LoginModal-Bmw7-b3f.js} +1 -1
  33. package/dashboard/dist/assets/{LoginPage-D7Ok7HiZ.js → LoginPage-CEI4nnlT.js} +1 -1
  34. package/dashboard/dist/assets/{PetPage-BYISPev2.js → PetPage-7Udtc9GY.js} +2 -2
  35. package/dashboard/dist/assets/{PopoverPopup-BlzqlKqF.js → PopoverPopup-r2BvRKLO.js} +1 -1
  36. package/dashboard/dist/assets/{ProviderIcon-BuLwtYjj.js → ProviderIcon-Cy_pKLdw.js} +1 -1
  37. package/dashboard/dist/assets/{ResetPasswordPage-BJRKclq9.js → ResetPasswordPage-QKUaLtO3.js} +1 -1
  38. package/dashboard/dist/assets/{Select-0YyBw95W.js → Select-BsUrn8Ui.js} +1 -1
  39. package/dashboard/dist/assets/{SelectItemText-CZKyxUjE.js → SelectItemText-Nis0uGZT.js} +1 -1
  40. package/dashboard/dist/assets/{SelfHostPage-C_Afofs-.js → SelfHostPage-DF8EzBEV.js} +1 -1
  41. package/dashboard/dist/assets/{ServiceStatusPage-0KpLdpon.js → ServiceStatusPage-BYmKzI_v.js} +1 -1
  42. package/dashboard/dist/assets/{SessionsPage-YtSyWMd0.js → SessionsPage-BsCVe75l.js} +1 -1
  43. package/dashboard/dist/assets/{SettingsPage-Bm641_AH.js → SettingsPage-CIZ6WmNR.js} +3 -3
  44. package/dashboard/dist/assets/{SkillsPage-DNg-I2g_.js → SkillsPage-cwHyK0Hp.js} +1 -1
  45. package/dashboard/dist/assets/{TokenGalaxy-BMN7WiRH.js → TokenGalaxy-2S-ud67v.js} +1 -1
  46. package/dashboard/dist/assets/{TooltipPopup-BF56BHfc.js → TooltipPopup-GG7xjDOP.js} +1 -1
  47. package/dashboard/dist/assets/{TrendMonitor-D0ea5xMA.js → TrendMonitor-CrbXrVMe.js} +1 -1
  48. package/dashboard/dist/assets/{WidgetsPage-CIAoHmJG.js → WidgetsPage-HrhnI3C-.js} +1 -1
  49. package/dashboard/dist/assets/{WrappedPage-CC_57Zr2.js → WrappedPage-sm7UVFon.js} +1 -1
  50. package/dashboard/dist/assets/{__vite-browser-external-CPskAZuH.js → __vite-browser-external-C7JgMYNl.js} +2 -2
  51. package/dashboard/dist/assets/{agent-logos-CcJUaB75.js → agent-logos-DGrrmPth.js} +1 -1
  52. package/dashboard/dist/assets/{arrow-left-CUiT31ZF.js → arrow-left-DOzsdmqR.js} +1 -1
  53. package/dashboard/dist/assets/{arrow-right-Tds6Mert.js → arrow-right-CHb0kJou.js} +1 -1
  54. package/dashboard/dist/assets/{arrow-up-right-CGSxdyzM.js → arrow-up-right-CH8vEEN1.js} +1 -1
  55. package/dashboard/dist/assets/{calendar-days-Cc8AtMa3.js → calendar-days-_D5qnyH_.js} +1 -1
  56. package/dashboard/dist/assets/{check-CzJylQ9j.js → check-DZLesnNy.js} +1 -1
  57. package/dashboard/dist/assets/{chevron-down-DyG9JVDO.js → chevron-down-QL4xkUtL.js} +1 -1
  58. package/dashboard/dist/assets/{cloud-checkout-DP5zddOq.js → cloud-checkout-DiCcWJVl.js} +1 -1
  59. package/dashboard/dist/assets/{composite-I_1t6PMI.js → composite-DObGcQmb.js} +1 -1
  60. package/dashboard/dist/assets/{download-B_LvkErh.js → download-BKp8pusR.js} +1 -1
  61. package/dashboard/dist/assets/{external-link-DDA3ObBn.js → external-link-B3p_TVGc.js} +1 -1
  62. package/dashboard/dist/assets/{flame-BqpVWH_1.js → flame-Df9OTUym.js} +1 -1
  63. package/dashboard/dist/assets/{format-tokens-D6QEOnGq.js → format-tokens-DXrEDEYs.js} +1 -1
  64. package/dashboard/dist/assets/{gift-BxbKo3W6.js → gift-DtWubiuR.js} +1 -1
  65. package/dashboard/dist/assets/{host-mode-o3qQY7tz.js → host-mode-C069A_hB.js} +1 -1
  66. package/dashboard/dist/assets/{icons-oGPZPj2n.js → icons-lB1kfROy.js} +1 -1
  67. package/dashboard/dist/assets/{index-BxtvQ1J7.js → index-D356L-jw.js} +1 -1
  68. package/dashboard/dist/assets/{index-DX--5z1g.js → index-DsXIWrJx.js} +1 -1
  69. package/dashboard/dist/assets/{index-Byukv2Nu.js → index-M5BiC0jx.js} +1 -1
  70. package/dashboard/dist/assets/{info-BoTz1AGZ.js → info-CSG8OkG4.js} +1 -1
  71. package/dashboard/dist/assets/{link-2-C09a122s.js → link-2-BkBGu7FX.js} +1 -1
  72. package/dashboard/dist/assets/{loader-circle--9U0axVe.js → loader-circle-BERDkbsP.js} +1 -1
  73. package/dashboard/dist/assets/{modifiers.esm-Cra0I6RP.js → modifiers.esm-Ce5IvVw2.js} +1 -1
  74. package/dashboard/dist/assets/{monitor-smartphone-C1ENjmOu.js → monitor-smartphone-zKuoJldz.js} +1 -1
  75. package/dashboard/dist/assets/{play-NqPqbW59.js → play-C0x-pxft.js} +1 -1
  76. package/dashboard/dist/assets/{plus-DZP82JeP.js → plus-DJvks-CX.js} +1 -1
  77. package/dashboard/dist/assets/{provider-display-BLo4k0bi.js → provider-display-C0e4tAFu.js} +1 -1
  78. package/dashboard/dist/assets/{react-CTLavVze.js → react-Bg0_YfGs.js} +1 -1
  79. package/dashboard/dist/assets/{safePolygon-Yw5w5Nw8.js → safePolygon-CptquMWZ.js} +1 -1
  80. package/dashboard/dist/assets/{search-DgV6mpMO.js → search-CLESf2Tg.js} +1 -1
  81. package/dashboard/dist/assets/{server-BybwAQjW.js → server-Cdwhp-2m.js} +1 -1
  82. package/dashboard/dist/assets/{shield-check-BiTYwWdT.js → shield-check-8U4XqmW3.js} +1 -1
  83. package/dashboard/dist/assets/{skills-api-Dx_Z8_SO.js → skills-api-ioDaxLLo.js} +1 -1
  84. package/dashboard/dist/assets/{sortable.esm-CmJnBLcr.js → sortable.esm-CEohF5EK.js} +1 -1
  85. package/dashboard/dist/assets/{store-DzNIKGzf.js → store-CyOeiGFE.js} +1 -1
  86. package/dashboard/dist/assets/{terminal-DPly-UPW.js → terminal-BjgwEAH-.js} +1 -1
  87. package/dashboard/dist/assets/{trash-DsL2ZAN5.js → trash-Skj6z7D1.js} +1 -1
  88. package/dashboard/dist/assets/{use-community-stats-CSTkXFed.js → use-community-stats-Cworqjzy.js} +1 -1
  89. package/dashboard/dist/assets/{use-latest-request-guard-CbAXXNlU.js → use-latest-request-guard-DMVWXXHE.js} +1 -1
  90. package/dashboard/dist/assets/{use-limits-display-prefs-mDl6Yv_-.js → use-limits-display-prefs-DKJZcYfE.js} +1 -1
  91. package/dashboard/dist/assets/{use-native-settings-Bu2C3b20.js → use-native-settings-CQF4BLQl.js} +1 -1
  92. package/dashboard/dist/assets/{use-ordered-list-DkGSfMTv.js → use-ordered-list-B9yoUGUU.js} +1 -1
  93. package/dashboard/dist/assets/use-reduced-motion-DPUViCfp.js +1 -0
  94. package/dashboard/dist/assets/{use-session-efficiency-pref-B2GDf83h.js → use-session-efficiency-pref-K00bK2sQ.js} +1 -1
  95. package/dashboard/dist/assets/{use-transform-BVVduBPJ.js → use-transform-Cfw11yOU.js} +1 -1
  96. package/dashboard/dist/assets/{use-usage-limits-fuzpbbVh.js → use-usage-limits-BE2dJXFd.js} +1 -1
  97. package/dashboard/dist/assets/{useCurrency-CdDQzroJ.js → useCurrency-BW7y9Tdv.js} +1 -1
  98. package/dashboard/dist/assets/{usePositioner-b6XXJtxE.js → usePositioner-DhtQcPOC.js} +1 -1
  99. package/dashboard/dist/assets/{useTokenFormat-90RoMQgI.js → useTokenFormat-BnvzUc-t.js} +1 -1
  100. package/dashboard/dist/assets/{zap-xEHzTW-T.js → zap-BQ3BR9On.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/commands/status.js +5 -1
  107. package/src/commands/sync.js +28 -1
  108. package/src/lib/jsonl-lines.js +34 -4
  109. package/src/lib/pricing/seed-snapshot.json +1 -1
  110. package/src/lib/rollout.js +148 -52
  111. package/src/lib/session-analytics.js +11 -10
  112. package/src/lib/upload-queue.js +1 -1
  113. package/dashboard/dist/assets/DialogDescription-ChbOGLc_.js +0 -1
  114. package/dashboard/dist/assets/use-reduced-motion-6nBw3cR5.js +0 -1
@@ -145,6 +145,8 @@ const {
145
145
  toUtcHalfHourStart,
146
146
  totalsKey,
147
147
  claudeMessageDedupKey,
148
+ hasZcodeCursorState,
149
+ resolveZcodeInstallPaths,
148
150
  } = require("../lib/rollout");
149
151
  const { computeClaudeGroundTruthBuckets } = require("../lib/claude-categorizer");
150
152
  const { createProgress, renderBar, formatNumber, formatBytes } = require("../lib/progress");
@@ -1733,8 +1735,23 @@ async function cmdSync(argv, context = {}) {
1733
1735
  const wslZcodeDir = process.platform === "win32" && wsl.shouldProbeWsl(process.env)
1734
1736
  ? wsl.discoverWslHome(".zcode")
1735
1737
  : null;
1736
- const zcodePaths = resolveInstallPaths({ nativeValue: zcodeNativeValue, wslValue: wslZcodeDir ? path.join(wslZcodeDir, "cli", "db", "db.sqlite") : null });
1738
+ const zcodeWslValue = wslZcodeDir ? path.join(wslZcodeDir, "cli", "db", "db.sqlite") : null;
1739
+ const zcodePaths = resolveZcodeInstallPaths(
1740
+ { nativeValue: zcodeNativeValue, wslValue: zcodeWslValue }, process.env,
1741
+ { cursors },
1742
+ );
1737
1743
  if (zcodePaths.native || zcodePaths.wsl) {
1744
+ const mode = wsl.getWslMode(process.env);
1745
+ if (process.platform === "win32" && ["native-first", "wsl-first"].includes(mode) &&
1746
+ !cursors.zcodeInstallSelection && hasZcodeCursorState(cursors)) {
1747
+ // Preserve legacy ownership before a repair can clear old buckets,
1748
+ // even when the selected database currently has no rows to parse.
1749
+ cursors.zcodeInstallSelection = {
1750
+ mode, zcodeHome: process.env.ZCODE_HOME?.trim() || null,
1751
+ dbPath: zcodePaths.native || zcodePaths.wsl,
1752
+ };
1753
+ cursorStore.requiresCommit = true;
1754
+ }
1738
1755
  if (progress?.enabled) progress.start(`Parsing ZCode ${renderBar(0)} | buckets 0`);
1739
1756
  try {
1740
1757
  const nativeUsageAvailable = [zcodePaths.native, zcodePaths.wsl]
@@ -1761,6 +1778,16 @@ async function cmdSync(argv, context = {}) {
1761
1778
  cursors, getParams: (p) => ({ dbPath: p, readFn: readZcodeDbMessages, source: "zcode", cursorKey: "zcode" }),
1762
1779
  queuePath, projectQueuePath, onProgress: makeProviderProgress("ZCode"),
1763
1780
  });
1781
+ if (zcodeResult.recordsProcessed > 0) {
1782
+ if (process.platform === "win32" && ["native-first", "wsl-first"].includes(mode)) {
1783
+ cursors.zcodeInstallSelection = {
1784
+ mode, zcodeHome: process.env.ZCODE_HOME?.trim() || null,
1785
+ dbPath: zcodePaths.native || zcodePaths.wsl,
1786
+ };
1787
+ } else {
1788
+ delete cursors.zcodeInstallSelection;
1789
+ }
1790
+ }
1764
1791
  } catch (err) { warnProviderParseFailure("ZCode", err, opts); }
1765
1792
  }
1766
1793
  }
@@ -5,6 +5,9 @@
5
5
  * only LF as a record separator so valid U+2028/U+2029 characters inside JSON
6
6
  * strings remain part of the record. Reading raw bytes keeps byte budgets exact
7
7
  * and lets malformed UTF-8 fail closed.
8
+ * Records longer than maxRecordBytes content bytes (excluding LF) are reported
9
+ * as { line: null, utf8Valid: null, oversized: true } without being buffered
10
+ * beyond the limit or decoded.
8
11
  */
9
12
  class PhysicalJsonlLimitError extends Error {
10
13
  constructor(maxPhysicalBytes) {
@@ -26,6 +29,7 @@ function decodePhysicalLine(buffer, { stripCr = false } = {}) {
26
29
  async function* physicalJsonlRecords(input, {
27
30
  invalidUtf8 = "throw",
28
31
  maxPhysicalBytes = Infinity,
32
+ maxRecordBytes = Infinity,
29
33
  } = {}) {
30
34
  if (invalidUtf8 !== "throw" && invalidUtf8 !== "record") {
31
35
  throw new TypeError(`unsupported invalidUtf8 policy: ${invalidUtf8}`);
@@ -33,8 +37,12 @@ async function* physicalJsonlRecords(input, {
33
37
  const byteLimit = Number.isFinite(maxPhysicalBytes)
34
38
  ? Math.max(0, Number(maxPhysicalBytes))
35
39
  : Infinity;
40
+ const recordLimit = Number.isFinite(maxRecordBytes)
41
+ ? Math.max(0, Number(maxRecordBytes))
42
+ : Infinity;
36
43
  const fragments = [];
37
44
  let fragmentsBytes = 0;
45
+ let oversized = false;
38
46
  let physicalBytesRead = 0;
39
47
 
40
48
  for await (const value of input) {
@@ -53,6 +61,17 @@ async function* physicalJsonlRecords(input, {
53
61
  if (physicalBytesRead + physicalBytes > byteLimit) {
54
62
  throw new PhysicalJsonlLimitError(byteLimit);
55
63
  }
64
+ const contentBytes = fragmentsBytes + fragment.length;
65
+ if (oversized || contentBytes > recordLimit) {
66
+ fragments.length = 0;
67
+ fragmentsBytes = 0;
68
+ oversized = false;
69
+ physicalBytesRead += physicalBytes;
70
+ start = newline + 1;
71
+ newline = chunk.indexOf(0x0a, start);
72
+ yield { line: null, utf8Valid: null, oversized: true, physicalBytes, terminated: true };
73
+ continue;
74
+ }
56
75
  const lineBuffer = fragments.length === 0
57
76
  ? fragment
58
77
  : Buffer.concat([...fragments, fragment], fragmentsBytes + fragment.length);
@@ -66,10 +85,10 @@ async function* physicalJsonlRecords(input, {
66
85
  line = decodePhysicalLine(lineBuffer, { stripCr: true });
67
86
  } catch (error) {
68
87
  if (invalidUtf8 === "throw") throw error;
69
- yield { line: null, utf8Valid: false, physicalBytes, terminated: true };
88
+ yield { line: null, utf8Valid: false, oversized: false, physicalBytes, terminated: true };
70
89
  continue;
71
90
  }
72
- yield { line, utf8Valid: true, physicalBytes, terminated: true };
91
+ yield { line, utf8Valid: true, oversized: false, physicalBytes, terminated: true };
73
92
  }
74
93
 
75
94
  if (start < chunk.length) {
@@ -77,12 +96,23 @@ async function* physicalJsonlRecords(input, {
77
96
  if (physicalBytesRead + fragmentsBytes + fragment.length > byteLimit) {
78
97
  throw new PhysicalJsonlLimitError(byteLimit);
79
98
  }
80
- fragments.push(Buffer.from(fragment));
99
+ if (!oversized) {
100
+ if (fragmentsBytes + fragment.length > recordLimit) {
101
+ fragments.length = 0;
102
+ oversized = true;
103
+ } else {
104
+ fragments.push(Buffer.from(fragment));
105
+ }
106
+ }
81
107
  fragmentsBytes += fragment.length;
82
108
  }
83
109
  }
84
110
 
85
111
  if (fragmentsBytes > 0) {
112
+ if (oversized) {
113
+ yield { line: null, utf8Valid: null, oversized: true, physicalBytes: fragmentsBytes, terminated: false };
114
+ return;
115
+ }
86
116
  const lineBuffer = fragments.length === 1
87
117
  ? fragments[0]
88
118
  : Buffer.concat(fragments, fragmentsBytes);
@@ -94,7 +124,7 @@ async function* physicalJsonlRecords(input, {
94
124
  if (invalidUtf8 === "throw") throw error;
95
125
  utf8Valid = false;
96
126
  }
97
- yield { line, utf8Valid, physicalBytes: fragmentsBytes, terminated: false };
127
+ yield { line, utf8Valid, oversized: false, physicalBytes: fragmentsBytes, terminated: false };
98
128
  }
99
129
  }
100
130