tokentracker-cli 0.74.1 → 0.74.2

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 (51) hide show
  1. package/dashboard/dist/assets/{ActivityHeatmap-D5DFI_JT.js → ActivityHeatmap-DGqoFvkZ.js} +1 -1
  2. package/dashboard/dist/assets/{Card-C0dBE40G.js → Card-CKxmfosU.js} +1 -1
  3. package/dashboard/dist/assets/{CommunityStatsModal-EoqdsEND.js → CommunityStatsModal-C6h6BKVI.js} +1 -1
  4. package/dashboard/dist/assets/{ConfirmModal-Dmmph0Fh.js → ConfirmModal-wqW-7Vs_.js} +1 -1
  5. package/dashboard/dist/assets/{DashboardPage-CCj2poZF.js → DashboardPage-10hyXbuM.js} +1 -1
  6. package/dashboard/dist/assets/{DevicePage-DeAi9xZM.js → DevicePage-DosHEknI.js} +1 -1
  7. package/dashboard/dist/assets/{DialogClose-D3RkFfxL.js → DialogClose-CRzzOKwV.js} +1 -1
  8. package/dashboard/dist/assets/DialogDescription-DuiVFMP6.js +1 -0
  9. package/dashboard/dist/assets/{DialogTitle-B_MCherE.js → DialogTitle-CgVdc49w.js} +1 -1
  10. package/dashboard/dist/assets/{FadeIn-DNN2K13r.js → FadeIn-CVkirQtu.js} +1 -1
  11. package/dashboard/dist/assets/{HeaderGithubStar-lFcC5cJF.js → HeaderGithubStar-DHW75YEC.js} +1 -1
  12. package/dashboard/dist/assets/{IpCheckPage-CeLaiU7v.js → IpCheckPage-CMOjeIuH.js} +1 -1
  13. package/dashboard/dist/assets/{LandingPage-DAoPUMvI.js → LandingPage-Cca1heHL.js} +1 -1
  14. package/dashboard/dist/assets/{LeaderboardAvatar-FQi0zZEF.js → LeaderboardAvatar-CVMcytB1.js} +1 -1
  15. package/dashboard/dist/assets/{LeaderboardPage-D5b5VXQC.js → LeaderboardPage-BEfsEAZY.js} +2 -2
  16. package/dashboard/dist/assets/{LeaderboardProfileModal-B4zRhrdW.js → LeaderboardProfileModal-5LuPOMoM.js} +1 -1
  17. package/dashboard/dist/assets/{LeaderboardProfilePage-Bq8rq1En.js → LeaderboardProfilePage-DUQOF16T.js} +1 -1
  18. package/dashboard/dist/assets/{LimitsPage-DWM80BaS.js → LimitsPage-C6cPHrnU.js} +4 -4
  19. package/dashboard/dist/assets/{LocalOnlyNotice-B8m8CUt0.js → LocalOnlyNotice-B2SjP1L6.js} +1 -1
  20. package/dashboard/dist/assets/{LoginPage-BUW1YAd4.js → LoginPage-D0vP9cX4.js} +1 -1
  21. package/dashboard/dist/assets/{PopoverPopup-Bpt95eH1.js → PopoverPopup-AtVz9OM2.js} +1 -1
  22. package/dashboard/dist/assets/{ResetPasswordPage-BbIfq0Oo.js → ResetPasswordPage-6eUhDnAl.js} +1 -1
  23. package/dashboard/dist/assets/{Select-gTXpf9KQ.js → Select-Dt-nyHat.js} +1 -1
  24. package/dashboard/dist/assets/{SelectItemText-DEkgwu_p.js → SelectItemText-CFxs6Ipf.js} +1 -1
  25. package/dashboard/dist/assets/{SettingsPage-DI9CabCH.js → SettingsPage-Ccv_PRTi.js} +1 -1
  26. package/dashboard/dist/assets/{SkillsPage-BfCZDHaD.js → SkillsPage-Ckmq2qWZ.js} +1 -1
  27. package/dashboard/dist/assets/{WidgetsPage-rU0VeGYf.js → WidgetsPage-CuMpK7JS.js} +1 -1
  28. package/dashboard/dist/assets/{WrappedPage-CZa-5-KZ.js → WrappedPage-C3sjJiS5.js} +1 -1
  29. package/dashboard/dist/assets/{agent-logos-EmiprqVo.js → agent-logos-CORiXh7-.js} +1 -1
  30. package/dashboard/dist/assets/{arrow-up-right-k-vRvS_D.js → arrow-up-right-D-CX3rHC.js} +1 -1
  31. package/dashboard/dist/assets/check-frbadzCO.js +1 -0
  32. package/dashboard/dist/assets/{copy-syqMmWHW.js → copy-BbbIDe0D.js} +1 -1
  33. package/dashboard/dist/assets/{download-DZcuOKDP.js → download-CnLKP9Xi.js} +1 -1
  34. package/dashboard/dist/assets/{format-tokens-D7k8OXQS.js → format-tokens-Q8buFewN.js} +1 -1
  35. package/dashboard/dist/assets/{info-CEBgCIZx.js → info-Bg3JHknV.js} +1 -1
  36. package/dashboard/dist/assets/{main-BALrkVr_.js → main-BZBZhXIl.js} +20 -17
  37. package/dashboard/dist/assets/{use-community-stats-DUttYzRH.js → use-community-stats-BBUKlTpE.js} +1 -1
  38. package/dashboard/dist/assets/{use-limits-display-prefs-BhIvYvqB.js → use-limits-display-prefs-Dnl2W8Rt.js} +1 -1
  39. package/dashboard/dist/assets/{use-native-settings-BhOpUBnt.js → use-native-settings-DlQEd871.js} +1 -1
  40. package/dashboard/dist/assets/{use-ordered-list-Cd6yagUF.js → use-ordered-list-4WtaZhJf.js} +1 -1
  41. package/dashboard/dist/assets/{use-quality-per-dollar-pref-DBeuBvln.js → use-quality-per-dollar-pref-CS0EFKxa.js} +1 -1
  42. package/dashboard/dist/assets/{use-usage-limits-DBhYqpBW.js → use-usage-limits-CJ25xM-V.js} +1 -1
  43. package/dashboard/dist/assets/{useCurrency-Cy2Q8nWt.js → useCurrency-CaevR9XR.js} +1 -1
  44. package/dashboard/dist/assets/{useScrollLock-C6Eqqoge.js → useScrollLock-BLGPKPXr.js} +1 -1
  45. package/dashboard/dist/index.html +1 -1
  46. package/dashboard/dist/share.html +1 -1
  47. package/package.json +2 -2
  48. package/src/lib/pricing/seed-snapshot.json +1 -1
  49. package/src/lib/zcode-limits.js +58 -21
  50. package/dashboard/dist/assets/DialogDescription-SXe3669h.js +0 -1
  51. package/dashboard/dist/assets/check-BBoXV3Xq.js +0 -1
@@ -378,11 +378,13 @@ function normalizeZcodeBalanceResponse(body) {
378
378
  if (!balances.length) {
379
379
  return {
380
380
  server_time: zcodeValNumber(data.server_time),
381
+ plan_kind: "start-plan",
381
382
  plan_id: null,
382
383
  plan_label: null,
383
384
  buckets: [],
384
385
  primary_window: null,
385
386
  secondary_window: null,
387
+ tertiary_window: null,
386
388
  };
387
389
  }
388
390
 
@@ -417,11 +419,13 @@ function normalizeZcodeBalanceResponse(body) {
417
419
  const planId = typeof balances[0]?.plan_id === "string" ? balances[0].plan_id : null;
418
420
  return {
419
421
  server_time: serverTime,
422
+ plan_kind: "start-plan",
420
423
  plan_id: planId,
421
424
  plan_label: deriveZcodePlanLabel(planId),
422
425
  buckets: sorted,
423
426
  primary_window: sorted[0]?.window || null,
424
427
  secondary_window: sorted[1]?.window || null,
428
+ tertiary_window: sorted[2]?.window || null,
425
429
  };
426
430
  }
427
431
 
@@ -496,34 +500,52 @@ function quotaTimestampToIso(value) {
496
500
  return new Date(n > 10_000_000_000 ? n : n * 1000).toISOString();
497
501
  }
498
502
 
499
- function normalizeZcodeQuotaLimit(limit) {
503
+ function findZcodeQuotaLimit(limits, type, unit, number = null) {
504
+ if (!Array.isArray(limits)) return null;
505
+ return (
506
+ limits.find((limit) => {
507
+ if (!limit || typeof limit !== "object") return false;
508
+ if (limit.type !== type) return false;
509
+ if (zcodeValNumber(limit.unit) !== unit) return false;
510
+ if (number == null) return true;
511
+ return zcodeValNumber(limit.number) === number;
512
+ }) || null
513
+ );
514
+ }
515
+
516
+ // ZCode 3.3.x coding-plan quota rows expose `percentage` as already-used %
517
+ // (0–100). `unit`/`number` identify the window (5h / weekly / tools), not a
518
+ // token total — deriving used% from usage/number turns an unused TIME_LIMIT
519
+ // (usage=100, number=1, percentage=0) into a false 100% bar.
520
+ function normalizeZcodeQuotaLimit(limit, { showName } = {}) {
500
521
  if (!limit || typeof limit !== "object") return null;
501
- const total = zcodeValNumber(limit.number) ?? zcodeValNumber(limit.unit);
522
+ const total = zcodeValNumber(limit.number);
502
523
  const used = zcodeValNumber(limit.usage) ?? zcodeValNumber(limit.currentValue);
503
524
  const remaining = zcodeValNumber(limit.remaining);
504
525
  const rawPercentage = zcodeValNumber(limit.percentage);
505
526
  let usedPercent = null;
506
- if (total != null && total > 0 && used != null) {
527
+ if (rawPercentage != null) {
528
+ usedPercent = rawPercentage;
529
+ } else if (total != null && total > 0 && used != null) {
507
530
  usedPercent = (used / total) * 100;
508
- } else if (total != null && total > 0 && remaining != null) {
531
+ } else if (total != null && total > 0 && remaining != null && remaining <= total) {
509
532
  usedPercent = ((total - remaining) / total) * 100;
510
- } else if (rawPercentage != null) {
511
- usedPercent = rawPercentage <= 1 ? rawPercentage * 100 : rawPercentage;
512
533
  }
513
534
 
514
535
  const detail = Array.isArray(limit.usageDetails) ? limit.usageDetails.find((item) => item && typeof item === "object") : null;
515
- const showName =
516
- (typeof detail?.displayName === "string" && detail.displayName.trim())
536
+ const resolvedShowName =
537
+ (typeof showName === "string" && showName.trim())
538
+ || (typeof detail?.displayName === "string" && detail.displayName.trim())
517
539
  || (typeof detail?.modelCode === "string" && detail.modelCode.trim())
518
540
  || (typeof limit.type === "string" && limit.type.trim())
519
541
  || "Coding plan";
520
542
 
521
543
  return {
522
- show_name: showName,
544
+ show_name: resolvedShowName,
523
545
  entitlement_id: typeof limit.type === "string" ? limit.type : "",
524
- total_units: total,
525
- used_units: used,
526
- remaining_units: remaining,
546
+ total_units: rawPercentage != null ? null : total,
547
+ used_units: rawPercentage != null ? null : used,
548
+ remaining_units: rawPercentage != null ? null : remaining,
527
549
  window: buildWindow({ usedPercent, resetAt: quotaTimestampToIso(limit.nextResetTime) }),
528
550
  };
529
551
  }
@@ -541,20 +563,35 @@ function normalizeZcodeCodingPlanQuotaResponse(body) {
541
563
  throw new Error("Could not parse ZCode coding plan quota: missing data");
542
564
  }
543
565
  const limits = Array.isArray(data.limits) ? data.limits : [];
544
- const buckets = limits.map(normalizeZcodeQuotaLimit).filter((bucket) => bucket?.window);
545
- const sorted = buckets.slice().sort((a, b) => {
546
- const aTotal = a.total_units || 0;
547
- const bTotal = b.total_units || 0;
548
- return bTotal - aTotal;
549
- });
566
+ // Match ZCode's own sidebar: TOKENS_LIMIT(unit=3,number=5)=5h,
567
+ // TOKENS_LIMIT(unit=6)=weekly, TIME_LIMIT(unit=5,number=1)=tool calls.
568
+ const fiveHourLimit = findZcodeQuotaLimit(limits, "TOKENS_LIMIT", 3, 5);
569
+ const weeklyLimit = findZcodeQuotaLimit(limits, "TOKENS_LIMIT", 6);
570
+ const toolsLimit = findZcodeQuotaLimit(limits, "TIME_LIMIT", 5, 1);
571
+ const hasNamedWindows = Boolean(fiveHourLimit || weeklyLimit || toolsLimit);
572
+
573
+ let buckets;
574
+ if (hasNamedWindows) {
575
+ buckets = [
576
+ fiveHourLimit ? normalizeZcodeQuotaLimit(fiveHourLimit, { showName: "5h" }) : null,
577
+ weeklyLimit ? normalizeZcodeQuotaLimit(weeklyLimit, { showName: "Weekly" }) : null,
578
+ toolsLimit ? normalizeZcodeQuotaLimit(toolsLimit, { showName: "Tools" }) : null,
579
+ ].filter((bucket) => bucket?.window);
580
+ } else {
581
+ buckets = limits.map((limit) => normalizeZcodeQuotaLimit(limit)).filter((bucket) => bucket?.window);
582
+ buckets.sort((a, b) => (b.total_units || 0) - (a.total_units || 0));
583
+ }
584
+
550
585
  const level = typeof data.level === "string" && data.level.trim() ? data.level.trim() : null;
551
586
  return {
552
587
  server_time: null,
588
+ plan_kind: "coding-plan",
553
589
  plan_id: level,
554
590
  plan_label: level ? deriveZcodePlanLabel(level) || level : "Coding",
555
- buckets: sorted,
556
- primary_window: sorted[0]?.window || null,
557
- secondary_window: sorted[1]?.window || null,
591
+ buckets,
592
+ primary_window: buckets[0]?.window || null,
593
+ secondary_window: buckets[1]?.window || null,
594
+ tertiary_window: buckets[2]?.window || null,
558
595
  };
559
596
  }
560
597
 
@@ -1 +0,0 @@
1
- import{r as n,b9 as a}from"./main-BALrkVr_.js";import{u as p}from"./DialogTitle-B_MCherE.js";import{u as c}from"./useScrollLock-C6Eqqoge.js";const x=n.forwardRef(function(e,r){const{render:l,className:u,style:m,id:s,...t}=e,{store:i}=p(),o=c(s);return i.useSyncedValueWithCleanup("descriptionElementId",o),a("p",e,{ref:r,props:[{id:o},t]})});export{x as D};
@@ -1 +0,0 @@
1
- import{c}from"./main-BALrkVr_.js";const e=[["path",{d:"M20 6 9 17l-5-5",key:"1gmf2c"}]],t=c("check",e);export{t as C};