tokentracker-cli 1.1.11 → 1.1.13

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 (118) hide show
  1. package/README.md +2 -1
  2. package/dashboard/dist/assets/{AchievementBadge-DuEuFaXg.js → AchievementBadge-DHCKPAgO.js} +1 -1
  3. package/dashboard/dist/assets/{AchievementsPage-BTTFtk_Z.js → AchievementsPage-BqlGMD7S.js} +2 -2
  4. package/dashboard/dist/assets/{AchievementsSection-BZppKteZ.js → AchievementsSection-CTTTR9CN.js} +1 -1
  5. package/dashboard/dist/assets/{BadgeDetailModal-TzmxXy8k.js → BadgeDetailModal-e0Iz8ct4.js} +1 -1
  6. package/dashboard/dist/assets/BotAnimated-BLYZyT1O.js +1 -0
  7. package/dashboard/dist/assets/{Card-HigkIm_b.js → Card-EHkn9ktD.js} +1 -1
  8. package/dashboard/dist/assets/{CommandPalette-Bx_11gJk.js → CommandPalette-CuSVstX9.js} +1 -1
  9. package/dashboard/dist/assets/{CommunityStatsModal-BjDPCBol.js → CommunityStatsModal-Cb1vefLE.js} +1 -1
  10. package/dashboard/dist/assets/{ConfirmModal-DTo93RpG.js → ConfirmModal-pIUQJ7QM.js} +1 -1
  11. package/dashboard/dist/assets/Controls-CX4Di57j.js +1 -0
  12. package/dashboard/dist/assets/DashboardPage-D1Ox1y3E.js +1 -0
  13. package/dashboard/dist/assets/{DevicePage-BVupGt9K.js → DevicePage-Q57gBE8A.js} +1 -1
  14. package/dashboard/dist/assets/{DialogClose-BlQJpi7n.js → DialogClose-Dn-nxOSp.js} +1 -1
  15. package/dashboard/dist/assets/DialogDescription-GXslTq2z.js +1 -0
  16. package/dashboard/dist/assets/{DialogTitle-CDmxp9ap.js → DialogTitle-DuAY9sfZ.js} +1 -1
  17. package/dashboard/dist/assets/{FadeIn-DPercU5n.js → FadeIn-25jNO9JV.js} +1 -1
  18. package/dashboard/dist/assets/{HeaderGithubStar-DeVzeBIo.js → HeaderGithubStar-0-ne32-S.js} +1 -1
  19. package/dashboard/dist/assets/{HoverTooltip-Duo2Icus.js → HoverTooltip-C2Qop8B3.js} +1 -1
  20. package/dashboard/dist/assets/{IpCheckPage-DgYiaRrT.js → IpCheckPage-Q9lwiFdt.js} +1 -1
  21. package/dashboard/dist/assets/{LandingPage-CYTR4PbQ.js → LandingPage-iX6E8Flr.js} +2 -2
  22. package/dashboard/dist/assets/{LeaderboardAvatar-B67pMaIl.js → LeaderboardAvatar-CiQrgneF.js} +1 -1
  23. package/dashboard/dist/assets/{LeaderboardPage-2wIMkBgq.js → LeaderboardPage-BIhIA28A.js} +2 -2
  24. package/dashboard/dist/assets/{LeaderboardProfileModal-D3VxkFlx.js → LeaderboardProfileModal-CF-MI8rL.js} +4 -4
  25. package/dashboard/dist/assets/{LeaderboardProfilePage-BS01jN5M.js → LeaderboardProfilePage-DRbLb-fO.js} +3 -3
  26. package/dashboard/dist/assets/{LimitsPage-BGRZW-aH.js → LimitsPage-lvYidBkz.js} +2 -2
  27. package/dashboard/dist/assets/{LocalOnlyNotice-Do9KUdi_.js → LocalOnlyNotice-CAQTnlaI.js} +1 -1
  28. package/dashboard/dist/assets/{LoginCard-CzAXLXfZ.js → LoginCard-Ci2Rrsfl.js} +1 -1
  29. package/dashboard/dist/assets/{LoginModal-D1J8zG0C.js → LoginModal-DhyQPl-V.js} +1 -1
  30. package/dashboard/dist/assets/{LoginPage-DeZJNMLe.js → LoginPage-B6q8P6hE.js} +1 -1
  31. package/dashboard/dist/assets/PetPage-82Cldgg6.js +1 -0
  32. package/dashboard/dist/assets/{PopoverPopup-BYzzQJTD.js → PopoverPopup-Btcu7vU0.js} +1 -1
  33. package/dashboard/dist/assets/{ProviderIcon-BfFkS-OF.js → ProviderIcon-aLwclDsD.js} +1 -1
  34. package/dashboard/dist/assets/{ResetPasswordPage-BFyYvG24.js → ResetPasswordPage-BlRl_aJr.js} +1 -1
  35. package/dashboard/dist/assets/{SegmentedControl-D5USR3JT.js → SegmentedControl-2O_XVL8u.js} +1 -1
  36. package/dashboard/dist/assets/{Select-DmFQdVA1.js → Select-D5uuRQwh.js} +1 -1
  37. package/dashboard/dist/assets/{SelectItemText-B5MXGLN-.js → SelectItemText-Bq_ZdWU0.js} +1 -1
  38. package/dashboard/dist/assets/{ServiceStatusPage-Dvm5eUJK.js → ServiceStatusPage-Pd6dgJua.js} +1 -1
  39. package/dashboard/dist/assets/{SessionsPage-DQKezzUW.js → SessionsPage-DjHudcn6.js} +2 -2
  40. package/dashboard/dist/assets/SettingsPage-DOLhZiBE.js +2 -0
  41. package/dashboard/dist/assets/{SkillsPage-DyX_-dcr.js → SkillsPage-D9-ZorB5.js} +1 -1
  42. package/dashboard/dist/assets/{TokenGalaxy-aK3jhWW0.js → TokenGalaxy-BN71jQQ8.js} +1 -1
  43. package/dashboard/dist/assets/{ToolbarRootContext-CY_SULMC.js → ToolbarRootContext-B0cqyD1i.js} +1 -1
  44. package/dashboard/dist/assets/TrendMonitor-DWxtbzyQ.js +19 -0
  45. package/dashboard/dist/assets/{WidgetsPage-D8tzK-7m.js → WidgetsPage-BwmJ2Z9d.js} +1 -1
  46. package/dashboard/dist/assets/{WrappedPage-BjZPa_al.js → WrappedPage-Cq8DrzLm.js} +1 -1
  47. package/dashboard/dist/assets/__vite-browser-external-CPMSmJgP.js +45 -0
  48. package/dashboard/dist/assets/__vite-browser-external-DrXtuPP9.css +1 -0
  49. package/dashboard/dist/assets/{agent-logos-QSoXRwwJ.js → agent-logos-X7FQq7rz.js} +1 -1
  50. package/dashboard/dist/assets/{arrow-up-right-C3WUmTcI.js → arrow-up-right-CPxuidzy.js} +1 -1
  51. package/dashboard/dist/assets/{check-Gz5mnj6f.js → check-D2K19ObI.js} +1 -1
  52. package/dashboard/dist/assets/{composite-DJhoahpv.js → composite-BN1UKLj0.js} +1 -1
  53. package/dashboard/dist/assets/{copy-C5RiL5JQ.js → copy-CSN17qFv.js} +1 -1
  54. package/dashboard/dist/assets/{download-CccMGCc1.js → download-CpW-TB2h.js} +1 -1
  55. package/dashboard/dist/assets/{external-link-fdU7Lj6p.js → external-link-ChBchK6G.js} +1 -1
  56. package/dashboard/dist/assets/{flame-CYEjossP.js → flame-f7119ZMd.js} +1 -1
  57. package/dashboard/dist/assets/{format-tokens-xXCznLkf.js → format-tokens-COrRnk53.js} +1 -1
  58. package/dashboard/dist/assets/{icons-CYNYszil.js → icons-Dn9vA9Qu.js} +1 -1
  59. package/dashboard/dist/assets/{index-CQ5GHXiW.js → index-BCNOKYSO.js} +1 -1
  60. package/dashboard/dist/assets/{index-Czz7x_MZ.js → index-CA-94DFW.js} +1 -1
  61. package/dashboard/dist/assets/{index-Cgfb050k.js → index-CElyhNzh.js} +1 -1
  62. package/dashboard/dist/assets/{info-Zae50fSC.js → info-BHsPBczD.js} +1 -1
  63. package/dashboard/dist/assets/{link-2-DW_mHLzI.js → link-2-BHfEWv22.js} +1 -1
  64. package/dashboard/dist/assets/{loader-circle-Bl7dBXh1.js → loader-circle-DTIT1Uk1.js} +1 -1
  65. package/dashboard/dist/assets/{maximize-2-DTP25Fl_.js → maximize-2-BmtIBzLu.js} +1 -1
  66. package/dashboard/dist/assets/{modifiers.esm-CYXpOF3i.js → modifiers.esm-CPBla3OK.js} +1 -1
  67. package/dashboard/dist/assets/{monitor-smartphone--TLNLuLe.js → monitor-smartphone-CbsYB-S2.js} +1 -1
  68. package/dashboard/dist/assets/{plus-DgeFv3Xc.js → plus-CZiNoMsy.js} +1 -1
  69. package/dashboard/dist/assets/{provider-display-crAVn3qa.js → provider-display-CXKRt9q1.js} +2 -2
  70. package/dashboard/dist/assets/{react-QPulAuJP.js → react-CZdcuJ28.js} +1 -1
  71. package/dashboard/dist/assets/{search-DIUmGfar.js → search-q2ARMGca.js} +1 -1
  72. package/dashboard/dist/assets/{skills-api-09qiTRNb.js → skills-api-CIyqyk-w.js} +1 -1
  73. package/dashboard/dist/assets/skins-Mc0sI20C.js +1 -0
  74. package/dashboard/dist/assets/{sortable.esm-BbsbmOc2.js → sortable.esm-BztIEZTk.js} +1 -1
  75. package/dashboard/dist/assets/{store-DdyzwTsy.js → store-DvdXwk-7.js} +1 -1
  76. package/dashboard/dist/assets/{terminal-JpDnkjVA.js → terminal-CFQOW2Ey.js} +1 -1
  77. package/dashboard/dist/assets/{trash-CRsyysiP.js → trash-D0ptaWPk.js} +1 -1
  78. package/dashboard/dist/assets/{use-community-stats-D3PwUyvR.js → use-community-stats-DYibzhAl.js} +1 -1
  79. package/dashboard/dist/assets/{use-latest-request-guard-DTCniVRw.js → use-latest-request-guard-viIhH7H5.js} +1 -1
  80. package/dashboard/dist/assets/{use-limits-display-prefs-BbYcvoh_.js → use-limits-display-prefs-CbXApWU1.js} +1 -1
  81. package/dashboard/dist/assets/{use-ordered-list-ypqFhcs4.js → use-ordered-list-BBP8hr8y.js} +1 -1
  82. package/dashboard/dist/assets/use-pet-settings-CIrPZ9pB.js +2 -0
  83. package/dashboard/dist/assets/use-reduced-motion-Dpq-cKyM.js +1 -0
  84. package/dashboard/dist/assets/{use-session-efficiency-pref-C5BZmpkY.js → use-session-efficiency-pref-2Vb3tJrw.js} +1 -1
  85. package/dashboard/dist/assets/{use-transform-C3bGaC_U.js → use-transform-CECRFELz.js} +1 -1
  86. package/dashboard/dist/assets/use-usage-limits-DEnbjOVG.js +1 -0
  87. package/dashboard/dist/assets/{useCurrency-BianRgdW.js → useCurrency-Dh9pUzDO.js} +1 -1
  88. package/dashboard/dist/assets/useTokenFormat-CoGcVhPP.js +1 -0
  89. package/dashboard/dist/assets/{zap-BJTChg1t.js → zap-BdeAxq64.js} +1 -1
  90. package/dashboard/dist/index.html +2 -2
  91. package/dashboard/dist/ip-check.html +2 -2
  92. package/dashboard/dist/leaderboard.html +2 -2
  93. package/dashboard/dist/share.html +2 -2
  94. package/package.json +3 -2
  95. package/src/commands/sync.js +57 -29
  96. package/src/lib/claude-categorizer.js +4 -7
  97. package/src/lib/claude-user-identity.js +56 -0
  98. package/src/lib/cursor-store.js +636 -57
  99. package/src/lib/grok-limits.js +17 -4
  100. package/src/lib/kimi-profile.js +61 -0
  101. package/src/lib/multi-install-parser.js +3 -1
  102. package/src/lib/pricing/seed-snapshot.json +1 -1
  103. package/src/lib/rollout.js +91 -39
  104. package/src/lib/usage-limits.js +128 -79
  105. package/dashboard/dist/assets/BotAnimated-4hWTFjwp.js +0 -1
  106. package/dashboard/dist/assets/ClawdAnimated-BRoihVSd.js +0 -2
  107. package/dashboard/dist/assets/Controls-BvWTXyfI.js +0 -1
  108. package/dashboard/dist/assets/DashboardPage--1_GuEr-.js +0 -1
  109. package/dashboard/dist/assets/DialogDescription-DE2BF-HX.js +0 -1
  110. package/dashboard/dist/assets/PetPage-D2oqJ05F.js +0 -1
  111. package/dashboard/dist/assets/SettingsPage-DbUDye5r.js +0 -2
  112. package/dashboard/dist/assets/TrendMonitor-BH6Jx8nS.js +0 -19
  113. package/dashboard/dist/assets/__vite-browser-external-Bg0J-a5P.css +0 -1
  114. package/dashboard/dist/assets/__vite-browser-external-VmN0WaC3.js +0 -45
  115. package/dashboard/dist/assets/skins-C8EyB85e.js +0 -1
  116. package/dashboard/dist/assets/use-reduced-motion-Cdn1VrG0.js +0 -1
  117. package/dashboard/dist/assets/use-usage-limits-BRLNaZEv.js +0 -1
  118. package/dashboard/dist/assets/useTokenFormat-DO4vxqhW.js +0 -1
@@ -644,15 +644,28 @@ async function fetchGrokBilling(
644
644
  headers,
645
645
  deadlineMs,
646
646
  );
647
- if (creditsResult.ok) return creditsResult.body;
648
- creditsFailure = `HTTP ${creditsResult.status}`;
647
+ if (creditsResult.ok) {
648
+ // Keep the unified pool even when its fields are malformed. The caller
649
+ // must surface its parse error rather than substitute a legacy pool.
650
+ if (creditsResult.body?.config?.currentPeriod) return creditsResult.body;
651
+ try {
652
+ // Only a response without a unified period is eligible for shape
653
+ // fallback; a parseable legacy response can already be used as-is.
654
+ normalizeGrokBillingResponse(creditsResult.body);
655
+ return creditsResult.body;
656
+ } catch (error) {
657
+ creditsFailure = `unrecognized response (${error?.message || "invalid billing data"})`;
658
+ }
659
+ } else {
660
+ creditsFailure = `HTTP ${creditsResult.status}`;
661
+ }
649
662
  } catch (error) {
650
663
  if (error?.code === "GROK_AUTH_REQUIRED") throw error;
651
664
  if (error?.code === "GROK_BILLING_TIMEOUT") throw error;
652
665
  }
653
666
 
654
- // Non-auth HTTP, network, or response-decoding failure → try the legacy
655
- // shape once, while sharing the original request deadline.
667
+ // Non-auth HTTP, network, response-decoding, or shape failure → try the
668
+ // legacy shape once, while sharing the original request deadline.
656
669
  let legacyResult;
657
670
  try {
658
671
  legacyResult = await fetchGrokBillingAttempt(
@@ -0,0 +1,61 @@
1
+ "use strict";
2
+
3
+ const fs = require("node:fs");
4
+ const os = require("node:os");
5
+ const path = require("node:path");
6
+ const { parse } = require("smol-toml");
7
+ const { expandHome } = require("./scan-roots");
8
+
9
+ const MAINLAND = { oauthHost: "https://auth.kimi.com", baseUrl: "https://api.kimi.com/coding/v1" };
10
+ const GLOBAL = { oauthHost: "https://auth.kimi.ai", baseUrl: "https://api.kimi.ai/coding/v1" };
11
+
12
+ function endpoint(value, fallback) {
13
+ return typeof value === "string" ? value.trim().replace(/\/+$/, "") : fallback;
14
+ }
15
+
16
+ // The two supported official endpoint pairs have stable upstream credential
17
+ // slots. The global suffix is SHA-256(JSON.stringify({ oauthHost, baseUrl }))
18
+ // truncated to 16 hex characters, matching managed-kimi-code.ts. Keeping the
19
+ // filenames constant also prevents remote configuration from shaping paths.
20
+ function credentialKey(oauthHost, baseUrl) {
21
+ return oauthHost === GLOBAL.oauthHost && baseUrl === GLOBAL.baseUrl
22
+ ? "kimi-code-env-0e4f99c69cc27850" : "kimi-code";
23
+ }
24
+
25
+ function resolveKimiProfile({ home, env = process.env } = {}) {
26
+ const base = home || os.homedir();
27
+ const explicit = expandHome(env?.KIMI_HOME, base);
28
+ const explicitCode = expandHome(env?.KIMI_CODE_HOME, base);
29
+ const codeHome = explicit || explicitCode || path.join(base, ".kimi-code");
30
+ const codeConfig = path.join(codeHome, "config.toml");
31
+ let provider = null;
32
+ let error = null;
33
+ if (fs.existsSync(codeConfig)) {
34
+ try {
35
+ provider = parse(fs.readFileSync(codeConfig, "utf8"))?.providers?.["managed:kimi-code"] || null;
36
+ } catch {
37
+ error = "Could not parse Kimi Code config.toml";
38
+ }
39
+ }
40
+ let hasCodeLogin = false;
41
+ try {
42
+ hasCodeLogin = Boolean(JSON.parse(fs.readFileSync(path.join(codeHome, "credentials", "kimi-code.json"), "utf8"))?.access_token);
43
+ } catch { /* No default-slot login. */ }
44
+ const hasEnvOverride = env?.KIMI_CODE_BASE_URL != null || env?.KIMI_CODE_OAUTH_HOST != null || env?.KIMI_OAUTH_HOST != null;
45
+ const kimiHome = explicit || explicitCode || provider || error || hasCodeLogin || hasEnvOverride
46
+ ? codeHome : path.join(base, ".kimi");
47
+ const oauthHost = endpoint(hasEnvOverride ? env?.KIMI_CODE_OAUTH_HOST ?? env?.KIMI_OAUTH_HOST : provider?.oauth?.oauth_host, MAINLAND.oauthHost);
48
+ const baseUrl = endpoint(env?.KIMI_CODE_BASE_URL ?? provider?.base_url, MAINLAND.baseUrl);
49
+ if (![MAINLAND, GLOBAL].some((region) => region.oauthHost === oauthHost && region.baseUrl === baseUrl)) {
50
+ error = "Unsupported Kimi quota endpoints; configure a matching official mainland or global profile";
51
+ }
52
+ if (provider?.oauth?.storage && provider.oauth.storage !== "file") {
53
+ error = "Kimi quota supports file credentials; the configured credential storage is unsupported";
54
+ }
55
+ // Derive the endpoint-scoped slot, just as upstream does when a stored key
56
+ // mismatches the endpoints. Never read an unrelated slot or legacy login.
57
+ const credsPath = path.join(kimiHome, "credentials", `${credentialKey(oauthHost, baseUrl)}.json`);
58
+ return { home: kimiHome, credsPath, oauthHost, baseUrl, error, configured: fs.existsSync(path.join(kimiHome, "config.toml")) };
59
+ }
60
+
61
+ module.exports = { resolveKimiProfile };
@@ -47,7 +47,9 @@ async function multiInstallParse({ paths, parserFn, providerName, cursors, getPa
47
47
  eventsAggregated += result.eventsAggregated || 0;
48
48
  bucketsQueued += result.bucketsQueued || 0;
49
49
  } catch (parseErr) {
50
- cursors[providerName] = ns;
50
+ if (parseErr?.code !== "TOKENTRACKER_CURSOR_STORE_RETRY") {
51
+ cursors[providerName] = ns;
52
+ }
51
53
  throw parseErr;
52
54
  }
53
55
  }