tokentracker-cli 0.84.9 → 0.86.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 (109) hide show
  1. package/README.de.md +5 -4
  2. package/README.ja.md +5 -4
  3. package/README.ko.md +5 -4
  4. package/README.md +8 -7
  5. package/README.zh-CN.md +5 -4
  6. package/dashboard/dist/assets/{AchievementBadge-BgBFpxmU.js → AchievementBadge-BgbH_mX4.js} +1 -1
  7. package/dashboard/dist/assets/{AchievementsPage-DHPD3Fnu.js → AchievementsPage-CQqkh1JS.js} +2 -2
  8. package/dashboard/dist/assets/{AchievementsSection-DouWVD-3.js → AchievementsSection-Dmkxpn0s.js} +1 -1
  9. package/dashboard/dist/assets/{BadgeDetailModal-Df9eQiA3.js → BadgeDetailModal-7OQf37lk.js} +1 -1
  10. package/dashboard/dist/assets/{Card-CQ9wBnz6.js → Card-1PmWZRTK.js} +1 -1
  11. package/dashboard/dist/assets/{ClawdAnimated-XIO-I-5v.js → ClawdAnimated-CMJFagpX.js} +1 -1
  12. package/dashboard/dist/assets/{CommandPalette-Cy1cJ91B.js → CommandPalette-D4OrwF1w.js} +1 -1
  13. package/dashboard/dist/assets/{CommunityStatsModal-CwKG4LQM.js → CommunityStatsModal-BDC9EcwZ.js} +1 -1
  14. package/dashboard/dist/assets/{ConfirmModal-BNcWqick.js → ConfirmModal-22DL5C_9.js} +1 -1
  15. package/dashboard/dist/assets/DashboardPage-CEXWzDtt.js +1 -0
  16. package/dashboard/dist/assets/{DevicePage-pJ2jNkZV.js → DevicePage-8uhHB7kX.js} +1 -1
  17. package/dashboard/dist/assets/{DialogClose-C2SOtkJN.js → DialogClose-BcJx6VK-.js} +1 -1
  18. package/dashboard/dist/assets/DialogDescription-D6zxtOM5.js +1 -0
  19. package/dashboard/dist/assets/{DialogTitle-CGSbB8G7.js → DialogTitle-gRzunAqv.js} +1 -1
  20. package/dashboard/dist/assets/{FadeIn-CZSiw7me.js → FadeIn-4rlPdBVe.js} +1 -1
  21. package/dashboard/dist/assets/{HeaderGithubStar-ZmQhX_kR.js → HeaderGithubStar-CR003aO3.js} +1 -1
  22. package/dashboard/dist/assets/{HoverTooltip-D_YdG369.js → HoverTooltip-Dgz-dM8Q.js} +1 -1
  23. package/dashboard/dist/assets/{IpCheckPage-du886dF0.js → IpCheckPage-B4PJRJP_.js} +1 -1
  24. package/dashboard/dist/assets/{LandingPage-BuAak8lU.js → LandingPage-3JQe-jOZ.js} +2 -2
  25. package/dashboard/dist/assets/{LeaderboardAvatar-nU0ARYnN.js → LeaderboardAvatar-CL9LxiEf.js} +1 -1
  26. package/dashboard/dist/assets/{LeaderboardPage-CngwCvC7.js → LeaderboardPage-DhIzM2Z2.js} +2 -2
  27. package/dashboard/dist/assets/{LeaderboardProfileModal-CXZJ0e-T.js → LeaderboardProfileModal-bbf5uJR5.js} +3 -3
  28. package/dashboard/dist/assets/{LeaderboardProfilePage-CZve6s6b.js → LeaderboardProfilePage-CzuPxscw.js} +1 -1
  29. package/dashboard/dist/assets/{LimitsPage-CWvoJPk8.js → LimitsPage-B59rb2gg.js} +1 -1
  30. package/dashboard/dist/assets/{LocalOnlyNotice-DyUAAyyE.js → LocalOnlyNotice-BkK-6n1R.js} +1 -1
  31. package/dashboard/dist/assets/{LoginCard-eEiRfbdv.js → LoginCard-BFGCzEjE.js} +1 -1
  32. package/dashboard/dist/assets/{LoginModal-C16WdIQm.js → LoginModal-yhkyscFn.js} +1 -1
  33. package/dashboard/dist/assets/{LoginPage-B2WqpE1t.js → LoginPage-DwU5s0F7.js} +1 -1
  34. package/dashboard/dist/assets/{PetPage-DtQWrGmI.js → PetPage-BPscYR6z.js} +1 -1
  35. package/dashboard/dist/assets/{PopoverPopup-CRhqtFLB.js → PopoverPopup-E7PyGTTB.js} +1 -1
  36. package/dashboard/dist/assets/{ProviderIcon-DWNH_wYu.js → ProviderIcon-CvmnzwKU.js} +1 -1
  37. package/dashboard/dist/assets/{ResetPasswordPage-DzCczcWZ.js → ResetPasswordPage-DD6qX616.js} +1 -1
  38. package/dashboard/dist/assets/{SegmentedControl-CV9ccq6R.js → SegmentedControl-DjGBL_l1.js} +1 -1
  39. package/dashboard/dist/assets/{Select-BrogNNk0.js → Select-B2MGmsi2.js} +1 -1
  40. package/dashboard/dist/assets/{SelectItemText-Bpu3swt0.js → SelectItemText-BaTwA_ZF.js} +1 -1
  41. package/dashboard/dist/assets/{ServiceStatusPage-D_FIrMJP.js → ServiceStatusPage-0K0y8A6m.js} +1 -1
  42. package/dashboard/dist/assets/{SessionsPage-C8TvTy1o.js → SessionsPage-CxrtRm3B.js} +2 -2
  43. package/dashboard/dist/assets/{SettingsPage-Bd-tzJAR.js → SettingsPage-CyvSWvDP.js} +1 -1
  44. package/dashboard/dist/assets/{SkillsPage-CKGU9wQ4.js → SkillsPage-BVOU8t3t.js} +1 -1
  45. package/dashboard/dist/assets/{TokenGalaxy-DhHW6L-U.js → TokenGalaxy-w7bwGloC.js} +1 -1
  46. package/dashboard/dist/assets/{ToolbarRootContext-DQo-4pPB.js → ToolbarRootContext-BAzpDZej.js} +1 -1
  47. package/dashboard/dist/assets/{TrendMonitor-Ejl8d45g.js → TrendMonitor-DyT7Q4xp.js} +1 -1
  48. package/dashboard/dist/assets/{WidgetsPage-CY7f4wCD.js → WidgetsPage-eDDtopQT.js} +1 -1
  49. package/dashboard/dist/assets/{WrappedPage-B4-B2v-v.js → WrappedPage-CKkbdWHF.js} +1 -1
  50. package/dashboard/dist/assets/{__vite-browser-external-BNUFXCfp.js → __vite-browser-external-SU8sCTLB.js} +23 -16
  51. package/dashboard/dist/assets/{agent-logos-BRzutmeR.js → agent-logos-bkh9XZJd.js} +1 -1
  52. package/dashboard/dist/assets/{arrow-up-right-BcrbPk8c.js → arrow-up-right-D16zCIw8.js} +1 -1
  53. package/dashboard/dist/assets/{check-BMxeFPfQ.js → check-BFL17JWQ.js} +1 -1
  54. package/dashboard/dist/assets/{chevron-right-DOstgiRf.js → chevron-right-CUJgrtkp.js} +1 -1
  55. package/dashboard/dist/assets/{copy-BsKO524t.js → copy-CRQiCjgs.js} +1 -1
  56. package/dashboard/dist/assets/{download-dadqxej7.js → download-Cd12nDrQ.js} +1 -1
  57. package/dashboard/dist/assets/{external-link-CTu3BMeU.js → external-link-CvAfnsG-.js} +1 -1
  58. package/dashboard/dist/assets/{flame-B_IvWcMn.js → flame-CCi681Yl.js} +1 -1
  59. package/dashboard/dist/assets/{format-tokens-DIT6hLSb.js → format-tokens-BAVt8uTZ.js} +1 -1
  60. package/dashboard/dist/assets/{icons-mWku76bu.js → icons-CbKC96gR.js} +1 -1
  61. package/dashboard/dist/assets/{index-D5-w-aGy.js → index--TDvaL1y.js} +1 -1
  62. package/dashboard/dist/assets/{index-D-gQV-hF.js → index-B5b6PCh5.js} +1 -1
  63. package/dashboard/dist/assets/{index-CboN9E82.js → index-B9LWn-mo.js} +1 -1
  64. package/dashboard/dist/assets/{info-x6l352SW.js → info-BPFpD--M.js} +1 -1
  65. package/dashboard/dist/assets/{limits-providers-Bo12VlLJ.js → limits-providers-Cyedt-WJ.js} +1 -1
  66. package/dashboard/dist/assets/{link-2-eo_xPxH1.js → link-2-BkEPPdfC.js} +1 -1
  67. package/dashboard/dist/assets/{loader-circle-C4n1iGBv.js → loader-circle-CzASiylJ.js} +1 -1
  68. package/dashboard/dist/assets/{maximize-2-pR8xwsI_.js → maximize-2-CkwnHUJn.js} +1 -1
  69. package/dashboard/dist/assets/{provider-display-ErggQWu4.js → provider-display-BXBBedC-.js} +2 -2
  70. package/dashboard/dist/assets/{react-DYKg02Aq.js → react-BXSctDQj.js} +1 -1
  71. package/dashboard/dist/assets/{search-B_jbUwPS.js → search-_qGma9tM.js} +1 -1
  72. package/dashboard/dist/assets/{skills-api-DY5ruGmw.js → skills-api-DdmJjnJ9.js} +1 -1
  73. package/dashboard/dist/assets/{store-Cu8i1y26.js → store-owYCN530.js} +1 -1
  74. package/dashboard/dist/assets/{terminal-D3j6X68s.js → terminal-Clzw-KEF.js} +1 -1
  75. package/dashboard/dist/assets/{trash-2-CFpwgJw5.js → trash-2-C5Giwp_E.js} +1 -1
  76. package/dashboard/dist/assets/{use-community-stats-C0fKq66G.js → use-community-stats-Dk8UjLEr.js} +1 -1
  77. package/dashboard/dist/assets/{use-limits-display-prefs-TOp4UAnI.js → use-limits-display-prefs-CArM595Q.js} +1 -1
  78. package/dashboard/dist/assets/{use-native-settings-BZie_7z1.js → use-native-settings-Cpd69kiF.js} +1 -1
  79. package/dashboard/dist/assets/{use-ordered-list-Bq92YyUp.js → use-ordered-list--CzwhBTx.js} +1 -1
  80. package/dashboard/dist/assets/use-reduced-motion-CcILnpU1.js +1 -0
  81. package/dashboard/dist/assets/{use-session-efficiency-pref-BcpytkES.js → use-session-efficiency-pref-DUXO8cCg.js} +1 -1
  82. package/dashboard/dist/assets/{use-transform-Dmmrne2z.js → use-transform-Cg3kuMj_.js} +1 -1
  83. package/dashboard/dist/assets/{use-usage-limits-Cw0Z9Tew.js → use-usage-limits-DY9_mV28.js} +1 -1
  84. package/dashboard/dist/assets/{useCurrency-DyyonINj.js → useCurrency-BIe86hMn.js} +1 -1
  85. package/dashboard/dist/assets/{useScrollLock-DvWw86lJ.js → useScrollLock-7-hejkNC.js} +1 -1
  86. package/dashboard/dist/assets/{useTokenFormat-CBkvGfJ1.js → useTokenFormat-DEtLbRgQ.js} +1 -1
  87. package/dashboard/dist/assets/{zap-CnYA39Ug.js → zap-DUxY1d-O.js} +1 -1
  88. package/dashboard/dist/index.html +12 -10
  89. package/dashboard/dist/ip-check.html +1 -1
  90. package/dashboard/dist/leaderboard.html +1 -1
  91. package/dashboard/dist/llms.txt +3 -2
  92. package/dashboard/dist/share.html +1 -1
  93. package/package.json +2 -2
  94. package/src/commands/init.js +1 -0
  95. package/src/commands/status.js +129 -9
  96. package/src/commands/sync.js +265 -54
  97. package/src/lib/claude-categorizer.js +36 -9
  98. package/src/lib/diagnostics.js +86 -13
  99. package/src/lib/doctor.js +17 -0
  100. package/src/lib/grok-context-breakdown.js +794 -0
  101. package/src/lib/install-resolver.js +10 -2
  102. package/src/lib/local-api.js +21 -3
  103. package/src/lib/multi-install-parser.js +9 -1
  104. package/src/lib/pricing/seed-snapshot.json +1 -1
  105. package/src/lib/rollout.js +788 -44
  106. package/src/lib/session-analytics.js +332 -9
  107. package/dashboard/dist/assets/DashboardPage-Dns_1yXL.js +0 -1
  108. package/dashboard/dist/assets/DialogDescription-Bhfqqmll.js +0 -1
  109. package/dashboard/dist/assets/use-reduced-motion-ZiVeOkvb.js +0 -1
@@ -45,13 +45,21 @@ function ensureNamespacedCursors(cursors, providerName, activeKeys = ["native",
45
45
  return cursors[providerName];
46
46
  }
47
47
 
48
- function ensureFlatCursor(cursors, providerName, env) {
48
+ // Collapse { native, wsl } namespaces back into a flat cursor when only one
49
+ // install remains. `preferredKey` names the SURVIVING install's namespace —
50
+ // its keys must win the merge, otherwise the vanished install's cursor
51
+ // (lastDbId watermarks, dedup maps) is donated to the survivor and its next
52
+ // parse double-counts everything past the foreign cursor. Callers that don't
53
+ // know the survivor fall back to the mode preference (legacy behavior).
54
+ function ensureFlatCursor(cursors, providerName, env, preferredKey) {
49
55
  const state = cursors[providerName];
50
56
  if (!state || typeof state !== "object") return;
51
57
  if (state.native === undefined && state.wsl === undefined) return;
52
58
 
53
59
  const mode = wsl.getWslMode(env || process.env);
54
- const preferWsl = mode === "wsl-first" || mode === "wsl-only";
60
+ const preferWsl = preferredKey === "wsl" || preferredKey === "native"
61
+ ? preferredKey === "wsl"
62
+ : mode === "wsl-first" || mode === "wsl-only";
55
63
  const merged = preferWsl ? { ...state.native, ...state.wsl } : { ...state.wsl, ...state.native };
56
64
  cursors[providerName] = merged;
57
65
  }
@@ -57,6 +57,7 @@ const {
57
57
  } = require("./claude-categorizer");
58
58
 
59
59
  const { computeCodexContextBreakdown } = require("./codex-context-breakdown");
60
+ const { computeGrokContextBreakdown } = require("./grok-context-breakdown");
60
61
 
61
62
  const {
62
63
  deriveProjectKeyFromRef,
@@ -2308,11 +2309,11 @@ function createLocalApiHandler({ queuePath }) {
2308
2309
  return true;
2309
2310
  }
2310
2311
 
2311
- // --- usage-category-breakdown (Claude + Codex) ---
2312
+ // --- usage-category-breakdown (Claude + Codex + Grok) ---
2312
2313
  // Claude: splits historical Claude usage into seven semantic categories
2313
2314
  // mirroring Claude Code's /context view (approx).
2314
- // Codex: provides a tool-oriented breakdown, attributing per-turn token
2315
- // deltas to observed tool calls (heuristic).
2315
+ // Codex/Grok: tool-oriented breakdown, attributing per-turn token
2316
+ // totals to observed tool calls (heuristic).
2316
2317
  if (p === "/functions/tokentracker-usage-category-breakdown") {
2317
2318
  const from = url.searchParams.get("from") || "";
2318
2319
  const to = url.searchParams.get("to") || "";
@@ -2354,6 +2355,23 @@ function createLocalApiHandler({ queuePath }) {
2354
2355
  return true;
2355
2356
  }
2356
2357
 
2358
+ if (requestedSource === "grok") {
2359
+ try {
2360
+ const timeZoneContext = getTimeZoneContext(url);
2361
+ const result = await computeGrokContextBreakdown({
2362
+ from,
2363
+ to,
2364
+ top: 50,
2365
+ timeZoneContext,
2366
+ });
2367
+ json(res, { from, to, ...result });
2368
+ } catch (e) {
2369
+ console.error("[LocalAPI] usage-category-breakdown(grok):", e?.message || e);
2370
+ json(res, { from, to, ...unsupportedCategoryPayload("grok"), error: "compute_failed" }, 500);
2371
+ }
2372
+ return true;
2373
+ }
2374
+
2357
2375
  json(res, { from, to, ...unsupportedCategoryPayload(requestedSource) });
2358
2376
  return true;
2359
2377
  }
@@ -11,7 +11,15 @@ async function multiInstallParse({ paths, parserFn, providerName, cursors, getPa
11
11
  const env = shared.env || process.env;
12
12
 
13
13
  if (installKeys.length === 1) {
14
- ensureFlatCursor(cursors, providerName, env);
14
+ // Flatten toward the SURVIVING install's namespace, not the mode
15
+ // preference: under wsl-first a vanished WSL install (deleted distro,
16
+ // transient wsl.exe probe failure) must not donate its cursor to the
17
+ // remaining native install. Non-both modes park the pick in the `native`
18
+ // slot regardless of identity, so the slot name is unreliable — WSL
19
+ // installs are always addressed via UNC paths, which identifies the
20
+ // survivor directly.
21
+ const survivorKey = wsl.isUncPath(paths[installKeys[0]]) ? "wsl" : "native";
22
+ ensureFlatCursor(cursors, providerName, env, survivorKey);
15
23
  return await parserFn({
16
24
  ...getParams(paths[installKeys[0]], installKeys[0]),
17
25
  ...shared,