tokentracker-cli 0.40.0 → 0.41.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 (115) hide show
  1. package/README.ja.md +1 -1
  2. package/README.ko.md +1 -1
  3. package/README.zh-CN.md +1 -1
  4. package/dashboard/dist/assets/{ActivityHeatmap-D0gkN1RW.js → ActivityHeatmap-DAyvtRkn.js} +1 -1
  5. package/dashboard/dist/assets/{Card-DgaNailB.js → Card-DByZ3SxT.js} +1 -1
  6. package/dashboard/dist/assets/DashboardPage-DJLLG7DG.js +19 -0
  7. package/dashboard/dist/assets/{DevicePage-WxD3UOS4.js → DevicePage-BkGbFsCV.js} +1 -1
  8. package/dashboard/dist/assets/DialogTitle-BhNOpzk4.js +1 -0
  9. package/dashboard/dist/assets/{FadeIn-CIowr92k.js → FadeIn-CQ0uWwqS.js} +1 -1
  10. package/dashboard/dist/assets/{HeaderGithubStar-BG7mHinn.js → HeaderGithubStar-OlcZIZs-.js} +1 -1
  11. package/dashboard/dist/assets/{IpCheckPage-BEf8N-sD.js → IpCheckPage-VaBccp0v.js} +1 -1
  12. package/dashboard/dist/assets/LandingPage-BbOOtp0W.js +4411 -0
  13. package/dashboard/dist/assets/{LeaderboardAvatar-tq8LphKG.js → LeaderboardAvatar-B26XN7XT.js} +1 -1
  14. package/dashboard/dist/assets/{LeaderboardPage-DeeyHMbP.js → LeaderboardPage-D43tLe4r.js} +3 -3
  15. package/dashboard/dist/assets/{LeaderboardProfileModal-Dj5nnKZq.js → LeaderboardProfileModal-Cc3TV4wl.js} +3 -3
  16. package/dashboard/dist/assets/LeaderboardProfilePage-DAVuscsT.js +1 -0
  17. package/dashboard/dist/assets/LimitsPage-HXB3ON_M.js +2 -0
  18. package/dashboard/dist/assets/{LocalOnlyNotice-DDvq44QO.js → LocalOnlyNotice-BtgOf0xW.js} +1 -1
  19. package/dashboard/dist/assets/{LoginPage-BaOQo7cY.js → LoginPage-CHNz2uuj.js} +1 -1
  20. package/dashboard/dist/assets/PopoverPopup-i1aCasNO.js +1 -0
  21. package/dashboard/dist/assets/Select-Dn4TdKJu.js +1 -0
  22. package/dashboard/dist/assets/SelectItemText-D2YtMFj0.js +1 -0
  23. package/dashboard/dist/assets/SettingsPage-D-44xtnb.js +1 -0
  24. package/dashboard/dist/assets/SkillsPage-Bt8e5ROp.js +1 -0
  25. package/dashboard/dist/assets/WidgetsPage-CGnhXDpP.js +1 -0
  26. package/dashboard/dist/assets/{WrappedPage-DHiRPuq6.js → WrappedPage-FEgpbrfx.js} +1 -1
  27. package/dashboard/dist/assets/{agent-logos-CKVvzLb1.js → agent-logos-2LgC_fmg.js} +1 -1
  28. package/dashboard/dist/assets/{arrow-up-right-CEarB9tV.js → arrow-up-right-Al34G4US.js} +1 -1
  29. package/dashboard/dist/assets/{download-Bh0gjfze.js → download-BorAs8Ai.js} +1 -1
  30. package/dashboard/dist/assets/geist-mono-cyrillic-400-normal-CeA7eGSt.woff +0 -0
  31. package/dashboard/dist/assets/geist-mono-cyrillic-400-normal-DoshcOXv.woff2 +0 -0
  32. package/dashboard/dist/assets/geist-mono-cyrillic-500-normal-BgLpzsdg.woff +0 -0
  33. package/dashboard/dist/assets/geist-mono-cyrillic-500-normal-BkE2O7RC.woff2 +0 -0
  34. package/dashboard/dist/assets/geist-mono-cyrillic-700-normal-4t7P5rT3.woff2 +0 -0
  35. package/dashboard/dist/assets/geist-mono-cyrillic-700-normal-DpJKySxv.woff +0 -0
  36. package/dashboard/dist/assets/geist-mono-cyrillic-900-normal-CVPizhN4.woff2 +0 -0
  37. package/dashboard/dist/assets/geist-mono-cyrillic-900-normal-DDpyx8f0.woff +0 -0
  38. package/dashboard/dist/assets/geist-mono-latin-400-normal-BXAprPdR.woff +0 -0
  39. package/dashboard/dist/assets/geist-mono-latin-400-normal-DKaoCDn5.woff2 +0 -0
  40. package/dashboard/dist/assets/geist-mono-latin-500-normal-C3sF8Y1B.woff2 +0 -0
  41. package/dashboard/dist/assets/geist-mono-latin-500-normal-YfPbDI_o.woff +0 -0
  42. package/dashboard/dist/assets/geist-mono-latin-700-normal-CzSaXH83.woff +0 -0
  43. package/dashboard/dist/assets/geist-mono-latin-700-normal-DMoeyBRY.woff2 +0 -0
  44. package/dashboard/dist/assets/geist-mono-latin-900-normal-DAGlevET.woff +0 -0
  45. package/dashboard/dist/assets/geist-mono-latin-900-normal-DVg4HgZN.woff2 +0 -0
  46. package/dashboard/dist/assets/geist-mono-latin-ext-400-normal-C1xxG8eb.woff2 +0 -0
  47. package/dashboard/dist/assets/geist-mono-latin-ext-400-normal-a1APXIwD.woff +0 -0
  48. package/dashboard/dist/assets/geist-mono-latin-ext-500-normal-CDyCFkgU.woff2 +0 -0
  49. package/dashboard/dist/assets/geist-mono-latin-ext-500-normal-CzSM7th5.woff +0 -0
  50. package/dashboard/dist/assets/geist-mono-latin-ext-700-normal-BG1muzu_.woff2 +0 -0
  51. package/dashboard/dist/assets/geist-mono-latin-ext-700-normal-BmQm3zK6.woff +0 -0
  52. package/dashboard/dist/assets/geist-mono-latin-ext-900-normal-DvYIGD1f.woff2 +0 -0
  53. package/dashboard/dist/assets/geist-mono-latin-ext-900-normal-LB8u5xx5.woff +0 -0
  54. package/dashboard/dist/assets/geist-mono-symbols2-400-normal-B5fXMCGq.woff +0 -0
  55. package/dashboard/dist/assets/geist-mono-symbols2-500-normal-BYvOiszX.woff +0 -0
  56. package/dashboard/dist/assets/geist-mono-symbols2-700-normal-nLp0AmIG.woff +0 -0
  57. package/dashboard/dist/assets/geist-mono-symbols2-900-normal-DPuoOkkO.woff +0 -0
  58. package/dashboard/dist/assets/geist-mono-vietnamese-400-normal-CyOwoevh.woff +0 -0
  59. package/dashboard/dist/assets/geist-mono-vietnamese-500-normal-Do_laDd2.woff +0 -0
  60. package/dashboard/dist/assets/geist-mono-vietnamese-700-normal-DKtT8o3X.woff +0 -0
  61. package/dashboard/dist/assets/geist-mono-vietnamese-900-normal-BAZIExb_.woff +0 -0
  62. package/dashboard/dist/assets/{info-BVM2oiQP.js → info-BjMpOQ6L.js} +1 -1
  63. package/dashboard/dist/assets/main-BZIH6355.js +995 -0
  64. package/dashboard/dist/assets/main-DTwPGswA.css +1 -0
  65. package/dashboard/dist/assets/use-limits-display-prefs-CMcyG3Sf.js +1 -0
  66. package/dashboard/dist/assets/{use-native-settings-BoIA6w2j.js → use-native-settings-Dda0lUdD.js} +1 -1
  67. package/dashboard/dist/assets/{use-usage-limits-Co8ywhqF.js → use-usage-limits-DpD2WuDG.js} +1 -1
  68. package/dashboard/dist/assets/{useCurrency-CuLnDPms.js → useCurrency-Bar8ZQys.js} +1 -1
  69. package/dashboard/dist/assets/useScrollLock-g4Jj83C_.js +1 -0
  70. package/dashboard/dist/index.html +2 -2
  71. package/dashboard/dist/share.html +2 -2
  72. package/package.json +3 -3
  73. package/src/lib/grok-limits.js +184 -0
  74. package/src/lib/pricing/seed-snapshot.json +1 -1
  75. package/src/lib/rollout.js +32 -16
  76. package/src/lib/usage-limits.js +6 -1
  77. package/dashboard/dist/assets/DashboardPage-CV_vq3RD.js +0 -19
  78. package/dashboard/dist/assets/DialogTitle-HpCbbWQz.js +0 -1
  79. package/dashboard/dist/assets/LandingPage-DWhpEISl.js +0 -4356
  80. package/dashboard/dist/assets/LeaderboardProfilePage-BMJyZxKC.js +0 -1
  81. package/dashboard/dist/assets/LimitsPage-DV6egWEj.js +0 -2
  82. package/dashboard/dist/assets/PopoverPopup-BhquCaxW.js +0 -1
  83. package/dashboard/dist/assets/Select-BBsxYIty.js +0 -1
  84. package/dashboard/dist/assets/SelectItemText-DV94Rvfw.js +0 -1
  85. package/dashboard/dist/assets/SettingsPage-D6kfA65g.js +0 -1
  86. package/dashboard/dist/assets/SkillsPage-BxzsmE10.js +0 -1
  87. package/dashboard/dist/assets/WidgetsPage-CtYs9AGI.js +0 -1
  88. package/dashboard/dist/assets/geist-mono-cyrillic-400-normal-BPBWmzPh.woff +0 -0
  89. package/dashboard/dist/assets/geist-mono-cyrillic-400-normal-Ce5q_31Z.woff2 +0 -0
  90. package/dashboard/dist/assets/geist-mono-cyrillic-500-normal-CJBLNVQT.woff2 +0 -0
  91. package/dashboard/dist/assets/geist-mono-cyrillic-500-normal-mNhfPmgl.woff +0 -0
  92. package/dashboard/dist/assets/geist-mono-cyrillic-700-normal-DH5Q319x.woff +0 -0
  93. package/dashboard/dist/assets/geist-mono-cyrillic-700-normal-VCNRadI3.woff2 +0 -0
  94. package/dashboard/dist/assets/geist-mono-cyrillic-900-normal-BKC3PZkM.woff +0 -0
  95. package/dashboard/dist/assets/geist-mono-cyrillic-900-normal-DdrQ8KBw.woff2 +0 -0
  96. package/dashboard/dist/assets/geist-mono-latin-400-normal-CoULgQGM.woff +0 -0
  97. package/dashboard/dist/assets/geist-mono-latin-400-normal-LC9RFr9I.woff2 +0 -0
  98. package/dashboard/dist/assets/geist-mono-latin-500-normal-D3o2eNa9.woff2 +0 -0
  99. package/dashboard/dist/assets/geist-mono-latin-500-normal-DOxI7kZ4.woff +0 -0
  100. package/dashboard/dist/assets/geist-mono-latin-700-normal-D6izGJRP.woff2 +0 -0
  101. package/dashboard/dist/assets/geist-mono-latin-700-normal-QGw08Lff.woff +0 -0
  102. package/dashboard/dist/assets/geist-mono-latin-900-normal-CmoKXrdK.woff +0 -0
  103. package/dashboard/dist/assets/geist-mono-latin-900-normal-Cu5MFKsu.woff2 +0 -0
  104. package/dashboard/dist/assets/geist-mono-latin-ext-400-normal-Cgks_Qgx.woff2 +0 -0
  105. package/dashboard/dist/assets/geist-mono-latin-ext-400-normal-CxNRRMGd.woff +0 -0
  106. package/dashboard/dist/assets/geist-mono-latin-ext-500-normal-CQcGuCNt.woff2 +0 -0
  107. package/dashboard/dist/assets/geist-mono-latin-ext-500-normal-diTenJ8L.woff +0 -0
  108. package/dashboard/dist/assets/geist-mono-latin-ext-700-normal-BX9f1BHp.woff +0 -0
  109. package/dashboard/dist/assets/geist-mono-latin-ext-700-normal-YOllDaLV.woff2 +0 -0
  110. package/dashboard/dist/assets/geist-mono-latin-ext-900-normal-Br6WNUGb.woff +0 -0
  111. package/dashboard/dist/assets/geist-mono-latin-ext-900-normal-CrmBTzU2.woff2 +0 -0
  112. package/dashboard/dist/assets/main-BMyBoVLI.css +0 -1
  113. package/dashboard/dist/assets/main-CPiNtuB_.js +0 -971
  114. package/dashboard/dist/assets/use-limits-display-prefs-kAa9p8ua.js +0 -1
  115. package/dashboard/dist/assets/useOpenInteractionType-CAJUA73r.js +0 -12
@@ -4420,26 +4420,42 @@ async function parseKimiCodeIncremental({ wireFiles, cursors, queuePath, onProgr
4420
4420
 
4421
4421
  recordsProcessed++;
4422
4422
 
4423
- // Anthropic-style usage: input_tokens already excludes cache. OpenAI-compat
4424
- // models instead fold cached reads into input_tokens and expose them via
4425
- // input_tokens_details.cached_tokens mirror kimi-code's own extractUsage
4426
- // so we never double-count cache as fresh input.
4427
- const cacheCreation = toNonNegativeInt(usage.cache_creation_input_tokens);
4423
+ // kimi-code's wire usage comes in two shapes across versions:
4424
+ // - camelCase (proto 0.6.0+, current): { inputOther, inputCacheRead,
4425
+ // inputCacheCreation, output } where inputOther is already fresh
4426
+ // (non-cached) input this is `response.usage` straight from the LLM
4427
+ // adapter (verified in @moonshot-ai/kimi-code 0.6.0/0.7.0/0.9.0).
4428
+ // - Anthropic-style (older): { input_tokens, output_tokens,
4429
+ // cache_read_input_tokens, cache_creation_input_tokens }. OpenAI-compat
4430
+ // models fold cached reads into input_tokens and expose them via
4431
+ // input_tokens_details.cached_tokens — subtract so we never double-count.
4432
+ // step.end and usage.record carry the SAME per-step usage object, so we
4433
+ // read only step.end here (reading both would double-count ~2x).
4434
+ let cacheCreation;
4428
4435
  let cacheRead;
4429
4436
  let input;
4430
- if (usage.cache_read_input_tokens != null) {
4431
- cacheRead = toNonNegativeInt(usage.cache_read_input_tokens);
4432
- input = toNonNegativeInt(usage.input_tokens);
4437
+ let output;
4438
+ if (usage.inputOther != null) {
4439
+ input = toNonNegativeInt(usage.inputOther);
4440
+ cacheRead = toNonNegativeInt(usage.inputCacheRead);
4441
+ cacheCreation = toNonNegativeInt(usage.inputCacheCreation);
4442
+ output = toNonNegativeInt(usage.output);
4433
4443
  } else {
4434
- const details =
4435
- usage.input_tokens_details && typeof usage.input_tokens_details === "object"
4436
- ? usage.input_tokens_details
4437
- : null;
4438
- const cached = toNonNegativeInt(details ? details.cached_tokens : 0);
4439
- cacheRead = cached;
4440
- input = Math.max(0, toNonNegativeInt(usage.input_tokens) - cached);
4444
+ cacheCreation = toNonNegativeInt(usage.cache_creation_input_tokens);
4445
+ if (usage.cache_read_input_tokens != null) {
4446
+ cacheRead = toNonNegativeInt(usage.cache_read_input_tokens);
4447
+ input = toNonNegativeInt(usage.input_tokens);
4448
+ } else {
4449
+ const details =
4450
+ usage.input_tokens_details && typeof usage.input_tokens_details === "object"
4451
+ ? usage.input_tokens_details
4452
+ : null;
4453
+ const cached = toNonNegativeInt(details ? details.cached_tokens : 0);
4454
+ cacheRead = cached;
4455
+ input = Math.max(0, toNonNegativeInt(usage.input_tokens) - cached);
4456
+ }
4457
+ output = toNonNegativeInt(usage.output_tokens);
4441
4458
  }
4442
- const output = toNonNegativeInt(usage.output_tokens);
4443
4459
  if (input === 0 && output === 0 && cacheRead === 0 && cacheCreation === 0) {
4444
4460
  seenIds.add(id);
4445
4461
  continue;
@@ -21,6 +21,7 @@ const {
21
21
  extractCursorSessionToken,
22
22
  fetchCursorUsageSummary,
23
23
  } = require("./cursor-config");
24
+ const { fetchGrokLimits } = require("./grok-limits");
24
25
 
25
26
  // 2-minute in-memory cache
26
27
  let cache = { data: null, fetchedAt: 0 };
@@ -1698,7 +1699,7 @@ async function getUsageLimits({
1698
1699
  const codexPlanType = codexAuthRefreshed?.planType || null;
1699
1700
 
1700
1701
  const providerFetch = withFetchTimeout(fetchImpl, providerTimeoutMs);
1701
- const [claudeResult, codexResult, cursor, kimi, gemini, kiro, antigravity, copilot] = await Promise.all([
1702
+ const [claudeResult, codexResult, cursor, kimi, gemini, kiro, antigravity, copilot, grok] = await Promise.all([
1702
1703
  claudeToken
1703
1704
  ? withProviderTimeout(fetchClaudeUsageLimits(claudeToken, { fetchImpl: providerFetch, maxAttempts: 1 }), "Claude", providerTimeoutMs).then(
1704
1705
  (value) => ({ status: "fulfilled", value }),
@@ -1725,6 +1726,8 @@ async function getUsageLimits({
1725
1726
  fetchAntigravityLimits({ home, commandRunner, requestFn, nowMs }),
1726
1727
  withProviderTimeout(fetchCopilotLimits({ home, env, fetchImpl: providerFetch }), "GitHub Copilot", providerTimeoutMs)
1727
1728
  .catch((reason) => ({ configured: true, error: reason?.message || "Unknown error" })),
1729
+ withProviderTimeout(fetchGrokLimits({ home, env, fetchImpl: providerFetch }), "Grok Build", providerTimeoutMs)
1730
+ .catch((reason) => ({ configured: true, error: reason?.message || "Unknown error" })),
1728
1731
  ]);
1729
1732
 
1730
1733
  let claude;
@@ -1776,6 +1779,7 @@ async function getUsageLimits({
1776
1779
  kiro: withPlanLabel(kiro, kiro.plan_name, "Kiro"),
1777
1780
  antigravity: withPlanLabel(antigravity, antigravity.account_plan, "Antigravity"),
1778
1781
  copilot: withPlanLabel(copilot, copilot.plan_name, "Copilot"),
1782
+ grok: withPlanLabel(grok, null, "Grok"),
1779
1783
  };
1780
1784
 
1781
1785
  cache = { data, fetchedAt: nowMs };
@@ -1803,4 +1807,5 @@ module.exports = {
1803
1807
  fetchCopilotLimits,
1804
1808
  readCopilotOauthToken,
1805
1809
  describeCopilotOtelStatus,
1810
+ fetchGrokLimits,
1806
1811
  };