tokentracker-cli 0.92.0 → 0.93.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 (108) hide show
  1. package/README.de.md +2 -0
  2. package/README.ja.md +2 -0
  3. package/README.ko.md +2 -0
  4. package/README.md +2 -0
  5. package/README.zh-CN.md +2 -0
  6. package/dashboard/dist/assets/{AchievementBadge-o8hl3my2.js → AchievementBadge-BJRW8Tr1.js} +1 -1
  7. package/dashboard/dist/assets/{AchievementsPage-CjDEyZfD.js → AchievementsPage-ChEJSRiQ.js} +2 -2
  8. package/dashboard/dist/assets/{AchievementsSection-Cwv1Zmyf.js → AchievementsSection-CUaUhyL6.js} +1 -1
  9. package/dashboard/dist/assets/{BadgeDetailModal-BDxTgOvT.js → BadgeDetailModal-CN7MTGyp.js} +1 -1
  10. package/dashboard/dist/assets/BotAnimated-Dr4FOdii.js +1 -0
  11. package/dashboard/dist/assets/{Card-Cp5v7Y19.js → Card-DMxCaW9y.js} +1 -1
  12. package/dashboard/dist/assets/ClawdAnimated-DpscEjzV.js +2 -0
  13. package/dashboard/dist/assets/{CommandPalette-CIf9oAqq.js → CommandPalette-CQGglOYQ.js} +1 -1
  14. package/dashboard/dist/assets/{CommunityStatsModal-UwiOPFu0.js → CommunityStatsModal-Venaet7m.js} +1 -1
  15. package/dashboard/dist/assets/{ConfirmModal-xkYsrh0v.js → ConfirmModal-BHoo6GZs.js} +1 -1
  16. package/dashboard/dist/assets/{Controls-C2Z2X0ZQ.js → Controls-CaNOFGCk.js} +1 -1
  17. package/dashboard/dist/assets/{DashboardPage-Do_NMUFK.js → DashboardPage-Dw0RrlPj.js} +1 -1
  18. package/dashboard/dist/assets/{DevicePage-DL5OjugJ.js → DevicePage-21SUMJc6.js} +1 -1
  19. package/dashboard/dist/assets/{DialogClose-D0w08oR2.js → DialogClose-DnSGAKIz.js} +1 -1
  20. package/dashboard/dist/assets/DialogDescription-DyaMB47K.js +1 -0
  21. package/dashboard/dist/assets/{DialogTitle-IKAPm5Pk.js → DialogTitle-CiPqqI8_.js} +1 -1
  22. package/dashboard/dist/assets/{FadeIn-Dve77aEj.js → FadeIn-Dfc9sjiG.js} +1 -1
  23. package/dashboard/dist/assets/{HeaderGithubStar-BVYbLWDi.js → HeaderGithubStar-DXxjTnOW.js} +1 -1
  24. package/dashboard/dist/assets/{HoverTooltip-BrF9-z7f.js → HoverTooltip-DjR_uW9N.js} +1 -1
  25. package/dashboard/dist/assets/{IpCheckPage-BZ1VyVsm.js → IpCheckPage-CUoutDvP.js} +1 -1
  26. package/dashboard/dist/assets/{LandingPage-jkjtQl58.js → LandingPage-CFlAug6D.js} +2 -2
  27. package/dashboard/dist/assets/{LeaderboardAvatar-D9kUudjQ.js → LeaderboardAvatar-CYoNgJ16.js} +1 -1
  28. package/dashboard/dist/assets/{LeaderboardPage-DXg7Qv8T.js → LeaderboardPage-S9BvOGn-.js} +2 -2
  29. package/dashboard/dist/assets/{LeaderboardProfileModal-jTlaOi-j.js → LeaderboardProfileModal-D5Fd1T4y.js} +4 -4
  30. package/dashboard/dist/assets/{LeaderboardProfilePage-DsKQ_Of8.js → LeaderboardProfilePage-DQ9OnTBZ.js} +1 -1
  31. package/dashboard/dist/assets/LimitsPage-CkW9RNDs.js +5 -0
  32. package/dashboard/dist/assets/{LocalOnlyNotice-CkLs3CF_.js → LocalOnlyNotice-BC236cdv.js} +1 -1
  33. package/dashboard/dist/assets/{LoginCard-SmOXM_PX.js → LoginCard-CKePPmoP.js} +1 -1
  34. package/dashboard/dist/assets/{LoginModal-CvtEBkrO.js → LoginModal-Z6HTE1rD.js} +1 -1
  35. package/dashboard/dist/assets/{LoginPage-Zm-dRt_Y.js → LoginPage-oCM0aV5_.js} +1 -1
  36. package/dashboard/dist/assets/PetPage-2vhNPBD2.js +1 -0
  37. package/dashboard/dist/assets/{PopoverPopup-CnteSROW.js → PopoverPopup-BWZpTgX_.js} +1 -1
  38. package/dashboard/dist/assets/{ProviderIcon-DcQmGbfz.js → ProviderIcon-DzpcY7dM.js} +1 -1
  39. package/dashboard/dist/assets/{ResetPasswordPage-zMb_m3Cx.js → ResetPasswordPage-CDXZRCcV.js} +1 -1
  40. package/dashboard/dist/assets/{SegmentedControl-D3KkbQ7T.js → SegmentedControl-DTUalF_Q.js} +1 -1
  41. package/dashboard/dist/assets/{Select-0RiFEISo.js → Select-Bh-c5WZM.js} +1 -1
  42. package/dashboard/dist/assets/{SelectItemText-BRV3DFEB.js → SelectItemText-D7ecykkn.js} +1 -1
  43. package/dashboard/dist/assets/{ServiceStatusPage-CWF_vKOC.js → ServiceStatusPage-B-3Nj7Yw.js} +1 -1
  44. package/dashboard/dist/assets/{SessionsPage-DIqoT7MU.js → SessionsPage-C4XeRHCn.js} +1 -1
  45. package/dashboard/dist/assets/{SettingsPage-DQZIqiE5.js → SettingsPage-B-2tu3Gx.js} +2 -2
  46. package/dashboard/dist/assets/{SkillsPage-BIIOUHnq.js → SkillsPage-CIjJkI3G.js} +1 -1
  47. package/dashboard/dist/assets/{TokenGalaxy-Bulaqjbm.js → TokenGalaxy-CmhqWAxg.js} +1 -1
  48. package/dashboard/dist/assets/{ToolbarRootContext-Dg-zL8fE.js → ToolbarRootContext-beEFe6Jn.js} +1 -1
  49. package/dashboard/dist/assets/{TrendMonitor-DfafDX6b.js → TrendMonitor-DUenZHaf.js} +1 -1
  50. package/dashboard/dist/assets/{WidgetsPage-F_2yLE7n.js → WidgetsPage-C5f1GlXu.js} +1 -1
  51. package/dashboard/dist/assets/{WrappedPage-BFxYKGQs.js → WrappedPage-CbV2-x-X.js} +1 -1
  52. package/dashboard/dist/assets/{__vite-browser-external-CZMdPW0g.js → __vite-browser-external-BE7h4Ou0.js} +19 -10
  53. package/dashboard/dist/assets/__vite-browser-external-CiR9-j4L.css +1 -0
  54. package/dashboard/dist/assets/{agent-logos-DjyCpabA.js → agent-logos-ChlriZKC.js} +1 -1
  55. package/dashboard/dist/assets/{arrow-up-right-CIAd6sXA.js → arrow-up-right-CXeIA60k.js} +1 -1
  56. package/dashboard/dist/assets/{check-Bt3Yu07t.js → check-B_20gPQX.js} +1 -1
  57. package/dashboard/dist/assets/{chevron-right-BiXULxma.js → chevron-right-CQCceB2r.js} +1 -1
  58. package/dashboard/dist/assets/{copy-D3k1Xbfl.js → copy-Ba1Oh3iI.js} +1 -1
  59. package/dashboard/dist/assets/{download-co2WHJvo.js → download-B5EQJQ9n.js} +1 -1
  60. package/dashboard/dist/assets/{external-link-D5az2QwL.js → external-link-D9GSJ4tn.js} +1 -1
  61. package/dashboard/dist/assets/{flame-CSCUyn3Z.js → flame-PKC57o-h.js} +1 -1
  62. package/dashboard/dist/assets/{format-tokens-BebRLYzr.js → format-tokens-E_eZCw2b.js} +1 -1
  63. package/dashboard/dist/assets/{icons-C_y5qr6T.js → icons-DXrj24F-.js} +1 -1
  64. package/dashboard/dist/assets/{index-CXOOOeSl.js → index-CPbjzYzk.js} +1 -1
  65. package/dashboard/dist/assets/{index-R488h3mD.js → index-ldDiPXbH.js} +1 -1
  66. package/dashboard/dist/assets/{index-DP3XlgDm.js → index-pSCG6bXN.js} +1 -1
  67. package/dashboard/dist/assets/{info-CD_G_DZp.js → info-Dhj9LcZm.js} +1 -1
  68. package/dashboard/dist/assets/{limits-providers-BlAlATd7.js → limits-providers-BWOIsV_O.js} +1 -1
  69. package/dashboard/dist/assets/{link-2-DIn-EC5g.js → link-2-Bbzo_bnV.js} +1 -1
  70. package/dashboard/dist/assets/{loader-circle-B5Az_VQe.js → loader-circle-CfkDmJbH.js} +1 -1
  71. package/dashboard/dist/assets/{maximize-2-ptnkCbEN.js → maximize-2-BQkNBiZ-.js} +1 -1
  72. package/dashboard/dist/assets/{modifiers.esm-DEN3VPKe.js → modifiers.esm-BhhAKBAH.js} +1 -1
  73. package/dashboard/dist/assets/{monitor-smartphone-Dqr_CnOQ.js → monitor-smartphone-BO4o9Fi6.js} +1 -1
  74. package/dashboard/dist/assets/{provider-display-BOAoggwg.js → provider-display-DnMOck0l.js} +1 -1
  75. package/dashboard/dist/assets/{react-B3eL33ha.js → react-DoVntgJI.js} +1 -1
  76. package/dashboard/dist/assets/{search-CNNSHW9P.js → search-CQOHSZGo.js} +1 -1
  77. package/dashboard/dist/assets/{skills-api-BShLlV2m.js → skills-api-DldHXWSv.js} +1 -1
  78. package/dashboard/dist/assets/skins-C8EyB85e.js +1 -0
  79. package/dashboard/dist/assets/{sortable.esm-C6kDS9DZ.js → sortable.esm-l0p6v-ts.js} +1 -1
  80. package/dashboard/dist/assets/{store-B4atnDzu.js → store-D9UN_t1a.js} +1 -1
  81. package/dashboard/dist/assets/{terminal-CXMttuiJ.js → terminal-Cvwjd-k9.js} +1 -1
  82. package/dashboard/dist/assets/{trash-2-aXKBjf5M.js → trash-2-b2Z7B317.js} +1 -1
  83. package/dashboard/dist/assets/{use-community-stats-rGR2J-Vi.js → use-community-stats-DDhp2Qat.js} +1 -1
  84. package/dashboard/dist/assets/{use-limits-display-prefs-CazeqdNI.js → use-limits-display-prefs-Cqtye4Ji.js} +1 -1
  85. package/dashboard/dist/assets/{use-ordered-list-Bx-enbl8.js → use-ordered-list-CLogKuZq.js} +1 -1
  86. package/dashboard/dist/assets/use-reduced-motion-CkoMrH9Y.js +1 -0
  87. package/dashboard/dist/assets/{use-session-efficiency-pref-B7RHUtup.js → use-session-efficiency-pref-mSDx6-SO.js} +1 -1
  88. package/dashboard/dist/assets/{use-transform-CWVOY76a.js → use-transform-Bt5K4W-2.js} +1 -1
  89. package/dashboard/dist/assets/{use-usage-limits-C9XRiYNi.js → use-usage-limits-Cm2Bjsp0.js} +1 -1
  90. package/dashboard/dist/assets/{useCurrency-D7ICju5j.js → useCurrency-DyJG5xmN.js} +1 -1
  91. package/dashboard/dist/assets/{useScrollLock-DXWPQF_D.js → useScrollLock-BEpIOp1F.js} +1 -1
  92. package/dashboard/dist/assets/{useTokenFormat-wDhHrsAL.js → useTokenFormat-Cbj7RbpO.js} +1 -1
  93. package/dashboard/dist/assets/{zap-BZDqgZR1.js → zap-CUYx_JsZ.js} +1 -1
  94. package/dashboard/dist/index.html +2 -2
  95. package/dashboard/dist/ip-check.html +2 -2
  96. package/dashboard/dist/leaderboard.html +2 -2
  97. package/dashboard/dist/share.html +2 -2
  98. package/package.json +4 -2
  99. package/src/lib/opencode-go-limits.js +33 -15
  100. package/src/lib/pet-packages.js +45 -1
  101. package/src/lib/pricing/index.js +17 -0
  102. package/src/lib/pricing/seed-snapshot.json +1 -1
  103. package/dashboard/dist/assets/ClawdAnimated-6Ibb4qCZ.js +0 -1
  104. package/dashboard/dist/assets/DialogDescription-rhGVm7N2.js +0 -1
  105. package/dashboard/dist/assets/LimitsPage-CMqZAQCa.js +0 -5
  106. package/dashboard/dist/assets/PetPage-Bcj7hzNz.js +0 -1
  107. package/dashboard/dist/assets/__vite-browser-external-CRYifSM4.css +0 -1
  108. package/dashboard/dist/assets/use-reduced-motion-2NcjtyzY.js +0 -1
@@ -9,7 +9,11 @@ const PET_SPRITESHEET = "spritesheet.webp";
9
9
  const MAX_PACKAGE_BYTES = 12 * 1024 * 1024;
10
10
  const MAX_MANIFEST_BYTES = 16 * 1024;
11
11
  const MAX_SPRITESHEET_BYTES = 10 * 1024 * 1024;
12
- const BUILTIN_IDS = new Set(["clawd", "sprout", "byte", "ember"]);
12
+ // `bot` joins clawd as a built-in with no sprite atlas: it is drawn from the
13
+ // vector engine in dashboard/src/lib/bot/, so it costs no disk space and is
14
+ // therefore not in REMOVABLE_BUILTIN_IDS — that list exists to reclaim the
15
+ // space an atlas takes.
16
+ const BUILTIN_IDS = new Set(["clawd", "bot", "sprout", "byte", "ember"]);
13
17
  const REMOVABLE_BUILTIN_IDS = new Set(["sprout", "byte", "ember"]);
14
18
  const HIDDEN_BUILTINS_FILE = ".hidden-builtins.json";
15
19
  // codex-pets.net added `kind` to pet.json long after launch, and its enum may keep
@@ -297,9 +301,48 @@ function loadPetDirectory(directory, expectedId = null) {
297
301
  return value;
298
302
  }
299
303
 
304
+ /**
305
+ * Move third-party packages out of directories whose id we have since reserved.
306
+ *
307
+ * `bot` became a built-in in 0.93.0. A user who had imported a package with that id
308
+ * would otherwise lose it silently: BUILTIN_IDS skips it in every listing, and
309
+ * removeInstalledPet routes it to hideBuiltinPet, which rejects a non-removable
310
+ * built-in — so the directory became invisible AND undeletable, up to 10 MB of it.
311
+ *
312
+ * Renaming keeps the package usable instead of just deleting it. Idempotent by
313
+ * construction: after the rename the reserved path no longer exists. If the manifest
314
+ * rewrite fails mid-way the package is unusable but freely removable, which still
315
+ * beats the state above.
316
+ */
317
+ function reclaimReservedPetDirectories(root) {
318
+ for (const reserved of BUILTIN_IDS) {
319
+ const source = path.join(root, reserved);
320
+ if (!fs.existsSync(path.join(source, PET_MANIFEST))) continue;
321
+ let target = `${reserved}-imported`;
322
+ for (let suffix = 2; fs.existsSync(path.join(root, target)); suffix += 1) {
323
+ target = `${reserved}-imported-${suffix}`;
324
+ }
325
+ try {
326
+ fs.renameSync(source, path.join(root, target));
327
+ } catch {
328
+ continue;
329
+ }
330
+ // The manifest id must match the directory name or the package fails to load.
331
+ const manifestPath = path.join(root, target, PET_MANIFEST);
332
+ try {
333
+ const manifest = JSON.parse(fs.readFileSync(manifestPath, "utf8"));
334
+ manifest.id = target;
335
+ fs.writeFileSync(manifestPath, `${JSON.stringify(manifest, null, 2)}\n`);
336
+ } catch {
337
+ // Left unusable but removable; nothing else to do here.
338
+ }
339
+ }
340
+ }
341
+
300
342
  function listInstalledPets() {
301
343
  migrateLegacyCodexPets();
302
344
  const root = resolvePetsDir();
345
+ reclaimReservedPetDirectories(root);
303
346
  let names = [];
304
347
  try { names = fs.readdirSync(root); } catch (error) {
305
348
  if (error?.code === "ENOENT") return [];
@@ -670,6 +713,7 @@ module.exports = {
670
713
  readCodexImportableAsset,
671
714
  readHiddenBuiltinIds,
672
715
  readWebpDimensions,
716
+ reclaimReservedPetDirectories,
673
717
  removeInstalledPet,
674
718
  resolveCodexPetsDir,
675
719
  resolvePetAsset,
@@ -126,11 +126,28 @@ function isDeepSeekTimePricedModel(model) {
126
126
  return DEEPSEEK_TIME_PRICED_MODELS.some((name) => lower.includes(name));
127
127
  }
128
128
 
129
+ // From 00:00 Beijing time on 2026-08-23 — this instant — DeepSeek bills whole
130
+ // Beijing weekends off-peak, peak hours included.
131
+ // https://api-docs.deepseek.com/quick_start/pricing/
132
+ const DEEPSEEK_WEEKEND_OFF_PEAK_FROM_MS = Date.UTC(2026, 7, 22, 16, 0, 0);
133
+
134
+ // The weekend is bounded in Beijing time, so it runs 16:00Z Friday to 16:00Z
135
+ // Sunday. Shifting the instant by +08:00 before reading the weekday is what puts
136
+ // both of those edges in the right place; getUTCDay() on the raw instant marks a
137
+ // different 48 hours. China has had no daylight saving since 1991, so the fixed
138
+ // offset is exact.
139
+ function isBeijingWeekendOffPeak(timestamp) {
140
+ if (timestamp < DEEPSEEK_WEEKEND_OFF_PEAK_FROM_MS) return false;
141
+ const beijingDay = new Date(timestamp + 8 * 60 * 60 * 1000).getUTCDay();
142
+ return beijingDay === 0 || beijingDay === 6;
143
+ }
144
+
129
145
  function isDeepSeekOffPeak(row) {
130
146
  if (row?.pricing_tier === "off_peak") return true;
131
147
  if (row?.pricing_tier === "peak") return false;
132
148
  const timestamp = Date.parse(String(row?.hour_start || ""));
133
149
  if (!Number.isFinite(timestamp)) return false;
150
+ if (isBeijingWeekendOffPeak(timestamp)) return true;
134
151
  const hour = new Date(timestamp).getUTCHours();
135
152
  return !((hour >= 1 && hour < 4) || (hour >= 6 && hour < 10));
136
153
  }