tokentracker-cli 1.4.10 → 1.4.12

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 (124) hide show
  1. package/README.de.md +6 -5
  2. package/README.ja.md +6 -5
  3. package/README.ko.md +6 -5
  4. package/README.md +6 -4
  5. package/README.zh-CN.md +6 -5
  6. package/dashboard/dist/assets/{AchievementBadge-BTqlXUP1.js → AchievementBadge-BwrL59nq.js} +1 -1
  7. package/dashboard/dist/assets/{AchievementsPage-DbKUhaY-.js → AchievementsPage-DG0dvG3d.js} +2 -2
  8. package/dashboard/dist/assets/{AchievementsSection-El1F-OC7.js → AchievementsSection-NrjlZjZK.js} +1 -1
  9. package/dashboard/dist/assets/{BadgeDetailModal--8PySLzP.js → BadgeDetailModal-BjgBAb-0.js} +1 -1
  10. package/dashboard/dist/assets/{BotAnimated-DBcOS4vh.js → BotAnimated-D7gMmkaM.js} +1 -1
  11. package/dashboard/dist/assets/{Card-CeGs8TaY.js → Card-CgvwIS5W.js} +1 -1
  12. package/dashboard/dist/assets/{CloudCheckoutPage-DCg3VVAi.js → CloudCheckoutPage-DKDpT0HI.js} +1 -1
  13. package/dashboard/dist/assets/{CloudPage-CmeFDrmk.js → CloudPage-BOfqPAAH.js} +2 -2
  14. package/dashboard/dist/assets/{CommandPalette-CrSNoZW9.js → CommandPalette-BfRKy_dn.js} +1 -1
  15. package/dashboard/dist/assets/{CommunityStatsModal-ynB4j0Qb.js → CommunityStatsModal-BcVSszit.js} +1 -1
  16. package/dashboard/dist/assets/{ConfirmModal-DDTUf-My.js → ConfirmModal-Be4EVpPT.js} +1 -1
  17. package/dashboard/dist/assets/{Controls-DXsJjEU1.js → Controls-vrG8LLBe.js} +1 -1
  18. package/dashboard/dist/assets/{DashboardPage-fr4sgbLB.js → DashboardPage-DvhF72XX.js} +1 -1
  19. package/dashboard/dist/assets/{DateRangePopover-gTiPISL_.js → DateRangePopover-CZVMdPEq.js} +1 -1
  20. package/dashboard/dist/assets/{DevicePage-DvHVjCCH.js → DevicePage-BeNIjTqa.js} +1 -1
  21. package/dashboard/dist/assets/{DialogClose-CXwouQe4.js → DialogClose-BaNPZ3Bu.js} +1 -1
  22. package/dashboard/dist/assets/DialogDescription-LHQ-SC4e.js +1 -0
  23. package/dashboard/dist/assets/{DialogTitle-Cd_k-Nyw.js → DialogTitle-B3IwNXro.js} +1 -1
  24. package/dashboard/dist/assets/{ElectricLogo-C4vUNTCI.js → ElectricLogo-DC-03HL_.js} +1 -1
  25. package/dashboard/dist/assets/{FadeIn-CGM5RBFy.js → FadeIn-DhUnSf2V.js} +1 -1
  26. package/dashboard/dist/assets/{HeaderGithubStar-el5-DhVb.js → HeaderGithubStar-BiWRLl7V.js} +1 -1
  27. package/dashboard/dist/assets/{HoverTooltip-C7YaWwJx.js → HoverTooltip-DLPiBqDu.js} +1 -1
  28. package/dashboard/dist/assets/{IpCheckPage-EKhbH9hJ.js → IpCheckPage-DKjg0V9L.js} +1 -1
  29. package/dashboard/dist/assets/{LandingPage-DJYOv1AM.js → LandingPage-XQuTnBMQ.js} +2 -2
  30. package/dashboard/dist/assets/{LeaderboardPage-CwzJxA8p.js → LeaderboardPage-xAbo5mzo.js} +2 -2
  31. package/dashboard/dist/assets/{LeaderboardProBadge-DYLp9pJY.js → LeaderboardProBadge-mMiEeaYS.js} +1 -1
  32. package/dashboard/dist/assets/{LeaderboardProfileModal-DqD2h9dD.js → LeaderboardProfileModal-B7q0Kk6B.js} +3 -3
  33. package/dashboard/dist/assets/{LeaderboardProfilePage-CarYvpYe.js → LeaderboardProfilePage-Bru_6wgX.js} +1 -1
  34. package/dashboard/dist/assets/{LimitsPage-4T0BpfYS.js → LimitsPage-DQH6ziz4.js} +1 -1
  35. package/dashboard/dist/assets/{LocalOnlyNotice-CAR-mqy0.js → LocalOnlyNotice-B-lxih4W.js} +1 -1
  36. package/dashboard/dist/assets/{LoginCard-Czq-UgAU.js → LoginCard-ChNsRYE2.js} +1 -1
  37. package/dashboard/dist/assets/{LoginModal-D4uxfzZb.js → LoginModal-CRw3PgMi.js} +1 -1
  38. package/dashboard/dist/assets/{LoginPage-Bg3BG0Wv.js → LoginPage-CVsbYn-h.js} +1 -1
  39. package/dashboard/dist/assets/{PetPage-BgwBxRyx.js → PetPage-BwEnQLLY.js} +2 -2
  40. package/dashboard/dist/assets/{PopoverPopup-k3o_Jp2b.js → PopoverPopup-CDOtxSL8.js} +1 -1
  41. package/dashboard/dist/assets/{ProviderIcon-Bbw6MUSf.js → ProviderIcon-Dsu1p6gG.js} +1 -1
  42. package/dashboard/dist/assets/{ResetPasswordPage-DIKPVu5K.js → ResetPasswordPage-BzpaSORs.js} +1 -1
  43. package/dashboard/dist/assets/{Select-kA0dV5Qw.js → Select-62UH-yLs.js} +1 -1
  44. package/dashboard/dist/assets/{SelectItemText-D4YCIn1x.js → SelectItemText-aTexKmQ0.js} +1 -1
  45. package/dashboard/dist/assets/{SelfHostPage-C3Y9qF3P.js → SelfHostPage-CmhV0dms.js} +1 -1
  46. package/dashboard/dist/assets/{ServiceStatusPage-o1G3SJhV.js → ServiceStatusPage-CLWO33w1.js} +1 -1
  47. package/dashboard/dist/assets/{SessionsPage-CA-efxhU.js → SessionsPage-BNCDKb58.js} +2 -2
  48. package/dashboard/dist/assets/{SettingsPage-Mr84vxQL.js → SettingsPage-DybHncPO.js} +3 -3
  49. package/dashboard/dist/assets/{SkillsPage-BtRhLSpz.js → SkillsPage-BV5R3VhT.js} +1 -1
  50. package/dashboard/dist/assets/{TokenGalaxy-CcFjCCuC.js → TokenGalaxy-mNNAo6Ai.js} +1 -1
  51. package/dashboard/dist/assets/{TooltipPopup-6aTx3jDf.js → TooltipPopup-D00SVpLP.js} +1 -1
  52. package/dashboard/dist/assets/{TrendMonitor-DoywXr8h.js → TrendMonitor-aNIpzAO-.js} +1 -1
  53. package/dashboard/dist/assets/{WidgetsPage-BuGSzvR0.js → WidgetsPage-COjZIMo8.js} +1 -1
  54. package/dashboard/dist/assets/{WrappedPage-Bm6X-SUZ.js → WrappedPage-af-bDIfB.js} +1 -1
  55. package/dashboard/dist/assets/{__vite-browser-external-ClVJNQu3.js → __vite-browser-external-KHpR2q-A.js} +2 -2
  56. package/dashboard/dist/assets/{agent-logos-Sc8Sejgx.js → agent-logos-D9Uq5b6y.js} +1 -1
  57. package/dashboard/dist/assets/{arrow-left-Cm1LG2i_.js → arrow-left-Pt53BsA4.js} +1 -1
  58. package/dashboard/dist/assets/{arrow-right-WP3kIwiy.js → arrow-right-stBCZPot.js} +1 -1
  59. package/dashboard/dist/assets/{arrow-up-right-CjyprVMj.js → arrow-up-right-ltUBOD-o.js} +1 -1
  60. package/dashboard/dist/assets/{calendar-days-Bm88-Gcb.js → calendar-days-BMEtkPFp.js} +1 -1
  61. package/dashboard/dist/assets/{check-CzIxFg0I.js → check-ax5wQf5Q.js} +1 -1
  62. package/dashboard/dist/assets/{chevron-down-bfGK8629.js → chevron-down-gS62rNQt.js} +1 -1
  63. package/dashboard/dist/assets/{cloud-checkout-C9DFQ7yM.js → cloud-checkout-DDtdbz7C.js} +1 -1
  64. package/dashboard/dist/assets/{composite-CdExmgTx.js → composite-DVm8byy8.js} +1 -1
  65. package/dashboard/dist/assets/{copy-CPPdujn2.js → copy-VbASSQO1.js} +1 -1
  66. package/dashboard/dist/assets/{download-Cl6_dKeK.js → download-D1g6OCRI.js} +1 -1
  67. package/dashboard/dist/assets/{external-link-B0r6Wo4e.js → external-link-CGUQrKDL.js} +1 -1
  68. package/dashboard/dist/assets/{flame-wEezvzXx.js → flame-Dlvc-qIH.js} +1 -1
  69. package/dashboard/dist/assets/{format-tokens-vWpBpKpM.js → format-tokens-CB1QfZsj.js} +1 -1
  70. package/dashboard/dist/assets/{gift-BFjblRqU.js → gift-DydflDeL.js} +1 -1
  71. package/dashboard/dist/assets/{icons-DX3dCNJP.js → icons-B_xYF8_-.js} +1 -1
  72. package/dashboard/dist/assets/{index-p8Gt3NFg.js → index-BRNltZbP.js} +1 -1
  73. package/dashboard/dist/assets/{index-DBF1bJlm.js → index-ByXXZlPn.js} +1 -1
  74. package/dashboard/dist/assets/{index-D1Zdrpom.js → index-CuLrp2D2.js} +1 -1
  75. package/dashboard/dist/assets/{index-D-TnqdBv.js → index-cidqWI7C.js} +1 -1
  76. package/dashboard/dist/assets/{info-Cqi971MA.js → info-D6-LIywq.js} +1 -1
  77. package/dashboard/dist/assets/{link-2-79sm__cT.js → link-2-BbuXAF5y.js} +1 -1
  78. package/dashboard/dist/assets/{loader-circle-CDoVfOUb.js → loader-circle-DAeCHAyj.js} +1 -1
  79. package/dashboard/dist/assets/{local-usage-transfer-EcXnuwCj.js → local-usage-transfer-BejRwzi4.js} +1 -1
  80. package/dashboard/dist/assets/{modifiers.esm-v5_BKSmY.js → modifiers.esm-CV2S03sv.js} +1 -1
  81. package/dashboard/dist/assets/{monitor-smartphone-CO67DffO.js → monitor-smartphone-Dj_u5s6h.js} +1 -1
  82. package/dashboard/dist/assets/{play-CbvuGtc3.js → play-DrcSicai.js} +1 -1
  83. package/dashboard/dist/assets/{plus-jc2gXlRM.js → plus-BwYQW7nf.js} +1 -1
  84. package/dashboard/dist/assets/{provider-display-BK3EbRLM.js → provider-display-Bgfy-2rn.js} +2 -2
  85. package/dashboard/dist/assets/{react-DMs4C4qS.js → react-BXby2gfP.js} +1 -1
  86. package/dashboard/dist/assets/{safePolygon-cY9H0GBN.js → safePolygon-B8DY85mD.js} +1 -1
  87. package/dashboard/dist/assets/{search-fqTJoYYA.js → search-SCMosATz.js} +1 -1
  88. package/dashboard/dist/assets/{server-jpBtvTvr.js → server-DoD96f86.js} +1 -1
  89. package/dashboard/dist/assets/{shield-check-DQiBlJbN.js → shield-check-CESJcEp7.js} +1 -1
  90. package/dashboard/dist/assets/{skills-api-CN2r_rmt.js → skills-api-DE71Ylhd.js} +1 -1
  91. package/dashboard/dist/assets/{sortable.esm-DrS52yOK.js → sortable.esm-EgVv2jPt.js} +1 -1
  92. package/dashboard/dist/assets/{store-K2Mk6aMn.js → store-mMQPBMoh.js} +1 -1
  93. package/dashboard/dist/assets/{terminal-Q4SruAlh.js → terminal-DxNM-IG2.js} +1 -1
  94. package/dashboard/dist/assets/{trash-C1Ob-g8E.js → trash-rywOpT2_.js} +1 -1
  95. package/dashboard/dist/assets/{use-community-stats-C-Gxpp9D.js → use-community-stats-BQw06Twe.js} +1 -1
  96. package/dashboard/dist/assets/{use-latest-request-guard-DK-A4bBp.js → use-latest-request-guard-BvouGm-c.js} +1 -1
  97. package/dashboard/dist/assets/{use-limits-display-prefs-ZauQzxE_.js → use-limits-display-prefs-C5_9TDSy.js} +1 -1
  98. package/dashboard/dist/assets/{use-native-settings-BZLEIUK8.js → use-native-settings-BxuddjkP.js} +1 -1
  99. package/dashboard/dist/assets/{use-ordered-list-De_Mcm_H.js → use-ordered-list-Cwqc5XA8.js} +1 -1
  100. package/dashboard/dist/assets/use-reduced-motion-DU3FvZwM.js +1 -0
  101. package/dashboard/dist/assets/{use-transform-XCDD5IrX.js → use-transform-Dl-SvALB.js} +1 -1
  102. package/dashboard/dist/assets/{use-usage-limits-BncGDhoF.js → use-usage-limits-BqmHYYc3.js} +1 -1
  103. package/dashboard/dist/assets/{useCurrency-DXPclxBT.js → useCurrency-B1XK_Z0N.js} +1 -1
  104. package/dashboard/dist/assets/{usePositioner-C-E1npCy.js → usePositioner-BvqDMGZo.js} +1 -1
  105. package/dashboard/dist/assets/{useTokenFormat-B70xhy9u.js → useTokenFormat-pPWJeWRe.js} +1 -1
  106. package/dashboard/dist/assets/{zap-D7gRgGCj.js → zap-DKYjQi1B.js} +1 -1
  107. package/dashboard/dist/index.html +13 -11
  108. package/dashboard/dist/ip-check.html +1 -1
  109. package/dashboard/dist/leaderboard.html +1 -1
  110. package/dashboard/dist/llms.txt +3 -2
  111. package/dashboard/dist/share.html +1 -1
  112. package/package.json +2 -2
  113. package/src/commands/init.js +1 -0
  114. package/src/commands/status.js +10 -0
  115. package/src/commands/sync.js +24 -0
  116. package/src/lib/omp-session.js +480 -0
  117. package/src/lib/pricing/curated-overrides.json +101 -0
  118. package/src/lib/pricing/matcher.js +44 -15
  119. package/src/lib/pricing/seed-snapshot.json +1 -1
  120. package/src/lib/rollout.js +277 -0
  121. package/src/lib/session-analytics.js +54 -8
  122. package/src/lib/trae-cn-config.js +36 -20
  123. package/dashboard/dist/assets/DialogDescription-BzbzETUC.js +0 -1
  124. package/dashboard/dist/assets/use-reduced-motion-DatTtp2N.js +0 -1
@@ -252,6 +252,11 @@ function lookupContainedExactCaseInsensitive(table, model) {
252
252
  // is a separate SKU from Opus 5). Dated and provider suffixes still work.
253
253
  const suffix = lower.slice(start + key.length);
254
254
  if (/^[.\d]/.test(suffix)) continue;
255
+ // Alternate SKU markers (preview/next/exp/…) must not inherit the base
256
+ // exact rate, including when they follow a date snapshot
257
+ // (`qwen3.8-max-2026-09-02-preview`, `qwen3-8-max-0902-preview`).
258
+ // Plain dated (-0902 / -YYYY-MM-DD) and provider-qualified suffixes still match.
259
+ if (/(?:^|-)(?:preview|next|exp|experimental|beta|alpha)(?:-|$)/.test(suffix)) continue;
255
260
  return table[key];
256
261
  }
257
262
  return null;
@@ -280,15 +285,6 @@ function lookupPricing(model, { curated, litellm, source } = {}) {
280
285
  value: { input: 0, output: 0, cache_read: 0, cache_write: 0 },
281
286
  };
282
287
  }
283
- // OpenCode Zen free models carry a `-free` suffix on the paid model id
284
- // (`deepseek-v4.1-flash-free`); the base-name fuzzy match must not bill them.
285
- if (sourceKey === "opencode" && lower.endsWith("-free")) {
286
- return {
287
- hit: true,
288
- source: "curated:opencode-free-suffix",
289
- value: { input: 0, output: 0, cache_read: 0, cache_write: 0 },
290
- };
291
- }
292
288
  // AStudio does not disclose its routed model. Stop before generic aliases
293
289
  // and fuzzy matching can turn an unresolved router into a priced model.
294
290
  if (sourceKey === "acode" && (lower === "auto" || lower.endsWith("-auto"))) {
@@ -302,12 +298,8 @@ function lookupPricing(model, { curated, litellm, source } = {}) {
302
298
  }
303
299
  }
304
300
 
305
- // 1. CURATED exact
306
- // Qwen Flash's provider-qualified and dated IDs share the reference SKU.
307
- // Keep the boundary strict: Flash-Next and Max have independent prices.
308
- if (/(?:^|\/)qwen3[.-]8-flash(?:-\d{4}-\d{2}-\d{2})?$/.test(lower.trim()) && curated.exact?.["qwen3.8-flash"]) {
309
- return { hit: true, source: "curated:exact", value: curated.exact["qwen3.8-flash"] };
310
- }
301
+ // 1. CURATED exact (before family regex aliases so a distinct dated exact
302
+ // entry cannot be overridden by the shared-SKU regex).
311
303
  if (curated.exact && curated.exact[lookupModel]) {
312
304
  return { hit: true, source: "curated:exact", value: curated.exact[lookupModel] };
313
305
  }
@@ -316,6 +308,17 @@ function lookupPricing(model, { curated, litellm, source } = {}) {
316
308
  return { hit: true, source: "curated:exact-dot", value: curatedDotExact };
317
309
  }
318
310
 
311
+ // Qwen Flash's provider-qualified and dated IDs share the reference SKU.
312
+ // Keep the boundary strict: Flash-Next and Max have independent prices.
313
+ if (/(?:^|\/)qwen3[.-]8-flash(?:-\d{4}-\d{2}-\d{2})?$/.test(lower.trim()) && curated.exact?.["qwen3.8-flash"]) {
314
+ return { hit: true, source: "curated:exact", value: curated.exact["qwen3.8-flash"] };
315
+ }
316
+ // Qwen Max (dated -0902 and ISO snapshot -YYYY-MM-DD) share Singapore International SKU.
317
+ // Keep the boundary strict vs Flash / Flash-Next / -preview (issue #744).
318
+ if (/(?:^|\/)qwen3[.-]8-max(?:-0902|-\d{4}-\d{2}-\d{2})?$/.test(lower.trim()) && curated.exact?.["qwen3.8-max"]) {
319
+ return { hit: true, source: "curated:exact", value: curated.exact["qwen3.8-max"] };
320
+ }
321
+
319
322
  // 2. LiteLLM exact
320
323
  if (litellm && litellm[lookupModel]) {
321
324
  return { hit: true, source: "litellm:exact", value: litellm[lookupModel] };
@@ -324,6 +327,32 @@ function lookupPricing(model, { curated, litellm, source } = {}) {
324
327
  if (litellmDotExact) {
325
328
  return { hit: true, source: "litellm:exact-dot", value: litellmDotExact };
326
329
  }
330
+
331
+ // Free gateway SKUs carry a `-free` suffix on the paid model id
332
+ // (`deepseek-v4.1-flash-free`, `minimax-m2.5-free`, Muse `*-contributor-free`).
333
+ // Runs AFTER curated/LiteLLM exact so an explicit paid exact entry still wins,
334
+ // and BEFORE alias/fuzzy/base-name matchers so `foo-free` cannot inherit `foo`
335
+ // list rates. OpenCode Zen established the convention; other sources reuse it
336
+ // when they emit the same suffix (issue #744).
337
+ if (lower.endsWith("-free")) {
338
+ return {
339
+ hit: true,
340
+ source: sourceKey === "opencode" ? "curated:opencode-free-suffix" : "curated:free-suffix",
341
+ value: { input: 0, output: 0, cache_read: 0, cache_write: 0 },
342
+ };
343
+ }
344
+
345
+ // Kimi Code K2.8 Preview aliases must not inherit fuzzy `kimi` → kimi-k2.5 rates (#766).
346
+ // Parser stores bare `k2.8`; raw `kimicoding` / `kimi-k2.8` / `kimicoding/k2.8` may still
347
+ // appear in lookups. `kimi-for-coding` keeps its curated exact entry (resolved above).
348
+ // Stay unpriced until an official per-token public rate exists.
349
+ if (
350
+ /(?:^|\/)(?:kimicoding(?:\/k2\.8)?|kimi-k2\.8|k2\.8)(?:-|\.|$)/.test(lower.trim()) ||
351
+ lower.trim() === "kimicoding"
352
+ ) {
353
+ return { hit: false, source: "miss", value: null };
354
+ }
355
+
327
356
  const curatedDotContainedExact = lookupContainedExactCaseInsensitive(curated.exact, dotForm);
328
357
  if (curatedDotContainedExact) {
329
358
  return { hit: true, source: "curated:exact-dot", value: curatedDotContainedExact };