tokentracker-cli 1.5.6 → 1.5.8

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 (128) hide show
  1. package/README.md +2 -0
  2. package/dashboard/dist/assets/{AchievementBadge-NKpY___e.js → AchievementBadge-Ck1DmXtu.js} +1 -1
  3. package/dashboard/dist/assets/{AchievementsPage-9nXmSX72.js → AchievementsPage-DjvMoc2i.js} +2 -2
  4. package/dashboard/dist/assets/{AchievementsSection-DttQciSY.js → AchievementsSection-DvTHE8Vd.js} +1 -1
  5. package/dashboard/dist/assets/{BadgeDetailModal-bvWEdJbe.js → BadgeDetailModal-COa2Rd6M.js} +1 -1
  6. package/dashboard/dist/assets/{BotAnimated-ChuUfph8.js → BotAnimated-CeR3jSce.js} +1 -1
  7. package/dashboard/dist/assets/{Card-SWtLDXt1.js → Card-bQCEOe_K.js} +1 -1
  8. package/dashboard/dist/assets/{CloudCheckoutPage-c2fNl1Rl.js → CloudCheckoutPage-DDH-3QOd.js} +1 -1
  9. package/dashboard/dist/assets/{CloudPage-CfwDjZMS.js → CloudPage-RygH3R8b.js} +2 -2
  10. package/dashboard/dist/assets/{CommandPalette-tWgPa295.js → CommandPalette-E7YqsdAH.js} +1 -1
  11. package/dashboard/dist/assets/{CommunityStatsModal-D7UaaUdM.js → CommunityStatsModal-B5heTDUE.js} +1 -1
  12. package/dashboard/dist/assets/{ConfirmModal-BrBcKhfW.js → ConfirmModal-D3vd882N.js} +1 -1
  13. package/dashboard/dist/assets/{Controls-CcvBkk7W.js → Controls-CK74JkE8.js} +1 -1
  14. package/dashboard/dist/assets/DashboardPage-DwTrlQZQ.js +1 -0
  15. package/dashboard/dist/assets/{DateRangePopover-BkN_pird.js → DateRangePopover-BxVCPuEX.js} +1 -1
  16. package/dashboard/dist/assets/{DevicePage-BbUL7WwT.js → DevicePage-B6x5fBdU.js} +1 -1
  17. package/dashboard/dist/assets/{DialogClose-BXO8SBFr.js → DialogClose-teXmwU1d.js} +1 -1
  18. package/dashboard/dist/assets/DialogDescription-BSCcGkVT.js +1 -0
  19. package/dashboard/dist/assets/{DialogTitle-Du332auj.js → DialogTitle-B3m-31sy.js} +1 -1
  20. package/dashboard/dist/assets/{ElectricLogo-CXLYfOt7.js → ElectricLogo-0wyvks4K.js} +1 -1
  21. package/dashboard/dist/assets/{FadeIn-HSQBOc8B.js → FadeIn-C60pLKXu.js} +1 -1
  22. package/dashboard/dist/assets/{HeaderGithubStar-D5tyQDGE.js → HeaderGithubStar-CCEUzMqo.js} +1 -1
  23. package/dashboard/dist/assets/{HoverTooltip-BhidhbnD.js → HoverTooltip-D9RtbhSZ.js} +1 -1
  24. package/dashboard/dist/assets/{IpCheckPage-WMEF1oS3.js → IpCheckPage-BCyW0SWY.js} +1 -1
  25. package/dashboard/dist/assets/{LandingPage-BmO-59ZP.js → LandingPage-DCEofDST.js} +2 -2
  26. package/dashboard/dist/assets/{LeaderboardPage-C2WyniEt.js → LeaderboardPage-CsTbalIm.js} +2 -2
  27. package/dashboard/dist/assets/{LeaderboardProBadge-DAZnMRNn.js → LeaderboardProBadge-Crun5RUJ.js} +1 -1
  28. package/dashboard/dist/assets/{LeaderboardProfileModal-D1BxcloV.js → LeaderboardProfileModal-Bim9cms6.js} +3 -3
  29. package/dashboard/dist/assets/{LeaderboardProfilePage-RPJDTwpG.js → LeaderboardProfilePage-D9pBE7f4.js} +1 -1
  30. package/dashboard/dist/assets/{LimitsPage-9ZOhKvn5.js → LimitsPage-CFhzwKzB.js} +6 -6
  31. package/dashboard/dist/assets/{LocalOnlyNotice-CH6w4hRw.js → LocalOnlyNotice-F_qczacX.js} +1 -1
  32. package/dashboard/dist/assets/{LoginCard-D24HsRjs.js → LoginCard-CQm_T5K2.js} +1 -1
  33. package/dashboard/dist/assets/{LoginModal-sLvHyi9U.js → LoginModal-BUf4mPCT.js} +1 -1
  34. package/dashboard/dist/assets/{LoginPage-PIvLEw1Y.js → LoginPage-njdEUQEX.js} +1 -1
  35. package/dashboard/dist/assets/{PetPage-DYcw_4P1.js → PetPage-COczIU1k.js} +2 -2
  36. package/dashboard/dist/assets/{PopoverPopup-D7ZCWq5f.js → PopoverPopup-DxB1k4g7.js} +1 -1
  37. package/dashboard/dist/assets/{ProviderIcon-B0kB52K-.js → ProviderIcon-BQfkoaQE.js} +1 -1
  38. package/dashboard/dist/assets/{ResetPasswordPage-B_NT4Xfl.js → ResetPasswordPage-PGRVaPTN.js} +1 -1
  39. package/dashboard/dist/assets/{Select-BtxjjP2Q.js → Select-CQVnpoBO.js} +1 -1
  40. package/dashboard/dist/assets/{SelectItemText-Co1M6XRC.js → SelectItemText-DmAn7osh.js} +1 -1
  41. package/dashboard/dist/assets/{SelfHostPage-XadfhFnd.js → SelfHostPage-BUURA-Vt.js} +1 -1
  42. package/dashboard/dist/assets/{ServiceStatusPage-ZEJyAxsQ.js → ServiceStatusPage-DuzSen0Q.js} +1 -1
  43. package/dashboard/dist/assets/SessionsPage-DndGq61W.js +3 -0
  44. package/dashboard/dist/assets/{SettingsPage-D4qHgIxn.js → SettingsPage-CHh0yqsZ.js} +3 -3
  45. package/dashboard/dist/assets/{SkillsPage-CkQCk2uF.js → SkillsPage-CCaYXQWN.js} +1 -1
  46. package/dashboard/dist/assets/{TokenGalaxy-Bx1vr4b0.js → TokenGalaxy-CGxUtq9x.js} +1 -1
  47. package/dashboard/dist/assets/{TooltipPopup-DQW8FWJO.js → TooltipPopup-B_B4qQD-.js} +1 -1
  48. package/dashboard/dist/assets/{TrendMonitor-BMNcY3N8.js → TrendMonitor-CdRQTLZL.js} +1 -1
  49. package/dashboard/dist/assets/{WidgetsPage-luRTge7O.js → WidgetsPage-DP_w32wh.js} +1 -1
  50. package/dashboard/dist/assets/{WrappedPage-B1j3WgXx.js → WrappedPage-C_DCqHUH.js} +1 -1
  51. package/dashboard/dist/assets/{__vite-browser-external-CvvpsW-U.js → __vite-browser-external-Lw3ipvYF.js} +3 -3
  52. package/dashboard/dist/assets/{agent-logos-DL4fdks6.js → agent-logos-DlnSKc2A.js} +1 -1
  53. package/dashboard/dist/assets/{arrow-left-DiOsjgdu.js → arrow-left-CjLKt_5C.js} +1 -1
  54. package/dashboard/dist/assets/{arrow-right-DBFXV7GU.js → arrow-right-Bh-Ezs8y.js} +1 -1
  55. package/dashboard/dist/assets/{arrow-up-right-BIvpDQHo.js → arrow-up-right-C87CvEJ5.js} +1 -1
  56. package/dashboard/dist/assets/{calendar-days--psnXUPW.js → calendar-days-B5VHwV9j.js} +1 -1
  57. package/dashboard/dist/assets/{check-DLqbsN00.js → check-D2uclldH.js} +1 -1
  58. package/dashboard/dist/assets/{chevron-down-C0P0oLzP.js → chevron-down-Beacyoub.js} +1 -1
  59. package/dashboard/dist/assets/{cloud-checkout-NSmb7QNy.js → cloud-checkout-3Y7NDSG1.js} +1 -1
  60. package/dashboard/dist/assets/{composite-D7ahPHYQ.js → composite-B28yORTL.js} +1 -1
  61. package/dashboard/dist/assets/{copy-COD7vwd6.js → copy-C8fZJwms.js} +1 -1
  62. package/dashboard/dist/assets/{download-CpSUX4U-.js → download-IIXYYmyo.js} +1 -1
  63. package/dashboard/dist/assets/{external-link-DXUjrooT.js → external-link-BEb0dms0.js} +1 -1
  64. package/dashboard/dist/assets/{flame-Dl3ZT9oo.js → flame-gmfpE-PO.js} +1 -1
  65. package/dashboard/dist/assets/{format-tokens-Ci49THbK.js → format-tokens-CKwy7NXi.js} +1 -1
  66. package/dashboard/dist/assets/{gift-DTHCN1Of.js → gift-twpInP_O.js} +1 -1
  67. package/dashboard/dist/assets/{icons-CB9s1e1k.js → icons-DQfkB5-5.js} +1 -1
  68. package/dashboard/dist/assets/{index-DFdfNKJM.js → index-ChVgw-dM.js} +1 -1
  69. package/dashboard/dist/assets/{index-Dozwi-Se.js → index-ClwErGKW.js} +1 -1
  70. package/dashboard/dist/assets/{index-BGT8ZQyn.js → index-D2-6Msd9.js} +1 -1
  71. package/dashboard/dist/assets/{index-DeX4t_5p.js → index-DzUxfO5e.js} +1 -1
  72. package/dashboard/dist/assets/{info-CqM2wmSI.js → info-BvndJDmD.js} +1 -1
  73. package/dashboard/dist/assets/{link-2-Byo7Rj3t.js → link-2-BhU_5JKG.js} +1 -1
  74. package/dashboard/dist/assets/{loader-circle-CMxd78Na.js → loader-circle-BR_62BDE.js} +1 -1
  75. package/dashboard/dist/assets/{local-usage-transfer-CBjnoeck.js → local-usage-transfer-CfoyR0hM.js} +1 -1
  76. package/dashboard/dist/assets/{modifiers.esm-Oowlk_FC.js → modifiers.esm-CnttlnRD.js} +1 -1
  77. package/dashboard/dist/assets/{monitor-smartphone-B2EgB_9q.js → monitor-smartphone-D4vzGxrq.js} +1 -1
  78. package/dashboard/dist/assets/{play-BSuP-UBL.js → play-BVWEKYTF.js} +1 -1
  79. package/dashboard/dist/assets/{plus-BWemSIuC.js → plus-B9GQ6VvV.js} +1 -1
  80. package/dashboard/dist/assets/{provider-display-BpzWuFDH.js → provider-display-DCFgR7FO.js} +1 -1
  81. package/dashboard/dist/assets/{react-cIJ4zx62.js → react-BKUD3UPr.js} +1 -1
  82. package/dashboard/dist/assets/{safePolygon-C_ZMtbgL.js → safePolygon-DPIi3FGf.js} +1 -1
  83. package/dashboard/dist/assets/{search-BK7eyNds.js → search-BBRJvYNz.js} +1 -1
  84. package/dashboard/dist/assets/{server-BqQHX-rd.js → server-Cg3zBK6a.js} +1 -1
  85. package/dashboard/dist/assets/{shield-check-CO5U6gRw.js → shield-check-BBzYplRb.js} +1 -1
  86. package/dashboard/dist/assets/{skills-api-CMye76ag.js → skills-api-CcAQ6fJX.js} +1 -1
  87. package/dashboard/dist/assets/{sortable.esm-Bvb61Lvj.js → sortable.esm-kNieGfR9.js} +1 -1
  88. package/dashboard/dist/assets/{store-CICV1KXb.js → store-DQpd_ZKv.js} +1 -1
  89. package/dashboard/dist/assets/{terminal-BKMWT1Ux.js → terminal-zj_c8_SG.js} +1 -1
  90. package/dashboard/dist/assets/{trash-D2Oqim4r.js → trash-Sl7eOlF7.js} +1 -1
  91. package/dashboard/dist/assets/{use-community-stats-CEqwmjct.js → use-community-stats-Bg-4yvQQ.js} +1 -1
  92. package/dashboard/dist/assets/{use-latest-request-guard-CTuzzu3F.js → use-latest-request-guard-COF23Bfs.js} +1 -1
  93. package/dashboard/dist/assets/{use-limits-display-prefs-CA2BLWkY.js → use-limits-display-prefs-QOlhCOgQ.js} +1 -1
  94. package/dashboard/dist/assets/{use-native-settings-B54wHSj9.js → use-native-settings-CKDqyirL.js} +1 -1
  95. package/dashboard/dist/assets/{use-ordered-list--PU9ekxY.js → use-ordered-list-mFHPMcF_.js} +1 -1
  96. package/dashboard/dist/assets/use-reduced-motion-B4rpC-Zt.js +1 -0
  97. package/dashboard/dist/assets/{use-transform-BRyR8szg.js → use-transform-CO5wZ0ML.js} +1 -1
  98. package/dashboard/dist/assets/{use-usage-limits-sufKdfDY.js → use-usage-limits-CeKjW8jG.js} +1 -1
  99. package/dashboard/dist/assets/{useCurrency-6oy7kSX8.js → useCurrency-WruYNKxG.js} +1 -1
  100. package/dashboard/dist/assets/{usePositioner-ZtDdVdJg.js → usePositioner-C3NGxtZa.js} +1 -1
  101. package/dashboard/dist/assets/{useTokenFormat-tiOJ-PeE.js → useTokenFormat-ObRZ_T9W.js} +1 -1
  102. package/dashboard/dist/assets/{zap-Dr1dXUjN.js → zap-CyZ3Tf1D.js} +1 -1
  103. package/dashboard/dist/index.html +1 -1
  104. package/dashboard/dist/ip-check.html +1 -1
  105. package/dashboard/dist/leaderboard.html +1 -1
  106. package/dashboard/dist/share.html +1 -1
  107. package/package.json +1 -1
  108. package/src/commands/init.js +9 -0
  109. package/src/commands/status.js +12 -6
  110. package/src/commands/sync.js +22 -4
  111. package/src/lib/claude-backend.js +291 -0
  112. package/src/lib/claude-config.js +1 -1
  113. package/src/lib/cursor-config.js +3 -1
  114. package/src/lib/devin-limits.js +65 -25
  115. package/src/lib/diagnostics.js +3 -0
  116. package/src/lib/doctor.js +13 -0
  117. package/src/lib/local-api.js +2 -0
  118. package/src/lib/local-usage-transfer.js +22 -1
  119. package/src/lib/pricing/index.js +12 -0
  120. package/src/lib/pricing/seed-snapshot.json +1 -1
  121. package/src/lib/rollout.js +70 -15
  122. package/src/lib/session-analytics.js +20 -8
  123. package/src/lib/trae-cn-config.js +32 -2
  124. package/src/lib/usage-limits.js +601 -35
  125. package/dashboard/dist/assets/DashboardPage-DJSgRHGq.js +0 -1
  126. package/dashboard/dist/assets/DialogDescription-B1HyKP0x.js +0 -1
  127. package/dashboard/dist/assets/SessionsPage-Cte1taUu.js +0 -3
  128. package/dashboard/dist/assets/use-reduced-motion-CZ8_YWc2.js +0 -1
@@ -7,6 +7,8 @@ const crypto = require("node:crypto");
7
7
  const { openLock, writeFileAtomic } = require("./fs");
8
8
  const { isAccountLevelSource } = require("./source-metadata");
9
9
 
10
+ const { backendFromUrl, TOKEN_FIELDS: BACKEND_TOKEN_FIELDS } = require("./claude-backend");
11
+
10
12
  const SCHEMA = "tokentracker.local-usage.v1";
11
13
  const MAX_BYTES = 5 * 1024 * 1024;
12
14
  const MAX_STATE_BYTES = 64 * 1024 * 1024;
@@ -15,7 +17,7 @@ const TOKEN_FIELDS = ["input_tokens", "output_tokens", "cached_input_tokens", "c
15
17
  "reasoning_output_tokens", "total_tokens", "billable_total_tokens", "conversation_count",
16
18
  ...["long_context_", "priority_", "priority_long_context_", "ultrafast_", "ultrafast_long_context_"].flatMap((prefix) =>
17
19
  ["input_tokens", "output_tokens", "cached_input_tokens", "cache_creation_input_tokens", "reasoning_output_tokens"].map((field) => prefix + field))];
18
- const ROW_FIELDS = new Set(["source", "model", "hour_start", "total_cost_usd", ...TOKEN_FIELDS]);
20
+ const ROW_FIELDS = new Set(["source", "model", "hour_start", "total_cost_usd", "backend_usage", ...TOKEN_FIELDS]);
19
21
  const validId = (id) => typeof id === "string" && /^[A-Za-z0-9_-]{8,128}$/.test(id);
20
22
  const validTime = (value) => typeof value === "string" && Number.isFinite(Date.parse(value)) && new Date(value).toISOString() === value;
21
23
  const digest = (value) => crypto.createHash("sha256").update(JSON.stringify(value)).digest("hex");
@@ -47,6 +49,25 @@ function cleanRow(row, strict = false) {
47
49
  if (!Number.isFinite(row.total_cost_usd) || row.total_cost_usd < 0) fail("invalid_snapshot");
48
50
  result.total_cost_usd = row.total_cost_usd;
49
51
  }
52
+ if (row.backend_usage !== undefined) {
53
+ if (row.source !== "claude" || !Array.isArray(row.backend_usage)) fail("invalid_snapshot");
54
+ const sums = {};
55
+ result.backend_usage = row.backend_usage.map((part) => {
56
+ if (!part || typeof part !== "object") fail("invalid_snapshot");
57
+ const identity = backendFromUrl(part.backend_origin);
58
+ if (part.backend !== identity.backend || part.backend_origin !== identity.backend_origin ||
59
+ Object.keys(part).some((key) => !["backend", "backend_origin", ...BACKEND_TOKEN_FIELDS].includes(key))) fail("invalid_snapshot");
60
+ const clean = { ...identity };
61
+ for (const field of BACKEND_TOKEN_FIELDS) {
62
+ const value = part[field] ?? 0;
63
+ if (!Number.isSafeInteger(value) || value < 0) fail("invalid_snapshot");
64
+ sums[field] = (sums[field] || 0) + value;
65
+ if (sums[field] > (result[field] || 0)) fail("invalid_snapshot");
66
+ clean[field] = value;
67
+ }
68
+ return clean;
69
+ });
70
+ }
50
71
  return result;
51
72
  }
52
73
 
@@ -1,3 +1,4 @@
1
+ const { hasUnknownBackendCost, TOKEN_FIELDS } = require("../claude-backend");
1
2
  // Public pricing API. Replaces the hard-coded MODEL_PRICING table that used
2
3
  // to live in src/lib/local-api.js. Keeps the same synchronous shape so all
3
4
  // existing callers (computeRowCost, /functions/* handlers, tests) work
@@ -139,6 +140,7 @@ const pricingInfoCache = { revision: -1, entries: new Map() };
139
140
  // Preserve matcher provenance: a known zero rate is free, a missing model is
140
141
  // unpriced. Both return zero dollars, but they mean different things in the UI.
141
142
  function getModelPricingInfo(model, opts = {}) {
143
+ if (hasUnknownBackendCost(opts)) return { status: "unpriced", source: null, ...ZERO_PRICING };
142
144
  const source = typeof opts === "string" ? opts : opts.source;
143
145
  const sourceKey = typeof source === "string" ? source.toLowerCase() : null;
144
146
  if (pricingInfoCache.revision !== state.revision) {
@@ -340,6 +342,16 @@ function speedTierSubsetCost(row, prefix, pricing, ctx) {
340
342
  // computeRowCost in src/lib/local-api.js. Moved here so vite mock + local
341
343
  // server share one source of truth.
342
344
  function computeRowCost(row) {
345
+ if (hasUnknownBackendCost(row)) {
346
+ // Existing totals without provenance retain their historical estimate. Only
347
+ // the newly ingested custom/unknown subset is excluded from model pricing.
348
+ const priced = { ...row, backend_usage: undefined };
349
+ for (const part of row.backend_usage) {
350
+ if (part.backend === "anthropic") continue;
351
+ for (const field of TOKEN_FIELDS) priced[field] = Math.max(0, (priced[field] || 0) - (part[field] || 0));
352
+ }
353
+ return computeRowCost(priced);
354
+ }
343
355
  if (LOCAL_INFERENCE_SOURCES.has(String(row?.source || "").toLowerCase())) return 0;
344
356
  // Pi can route a turn through a subscription-backed Copilot provider. Pi's
345
357
  // usage record reports a zero marginal cost for those turns; do not