tokentracker-cli 0.92.0 → 0.93.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.
- package/README.de.md +3 -1
- package/README.ja.md +3 -1
- package/README.ko.md +3 -1
- package/README.md +3 -1
- package/README.zh-CN.md +3 -1
- package/dashboard/dist/assets/{AchievementBadge-o8hl3my2.js → AchievementBadge-D10CA0Yt.js} +1 -1
- package/dashboard/dist/assets/{AchievementsPage-CjDEyZfD.js → AchievementsPage-Koc-RixX.js} +2 -2
- package/dashboard/dist/assets/{AchievementsSection-Cwv1Zmyf.js → AchievementsSection-BhPN_8G6.js} +1 -1
- package/dashboard/dist/assets/{BadgeDetailModal-BDxTgOvT.js → BadgeDetailModal-CFgdS3Ew.js} +1 -1
- package/dashboard/dist/assets/BotAnimated-CW81QSQu.js +1 -0
- package/dashboard/dist/assets/{Card-Cp5v7Y19.js → Card-DzYuh963.js} +1 -1
- package/dashboard/dist/assets/ClawdAnimated-CxR9qig7.js +2 -0
- package/dashboard/dist/assets/{CommandPalette-CIf9oAqq.js → CommandPalette-DbvccFuj.js} +1 -1
- package/dashboard/dist/assets/{CommunityStatsModal-UwiOPFu0.js → CommunityStatsModal-zROYUuhI.js} +1 -1
- package/dashboard/dist/assets/{ConfirmModal-xkYsrh0v.js → ConfirmModal-nOBxWc3T.js} +1 -1
- package/dashboard/dist/assets/{Controls-C2Z2X0ZQ.js → Controls-NQMc-XyF.js} +1 -1
- package/dashboard/dist/assets/{DashboardPage-Do_NMUFK.js → DashboardPage-Cr7YjFQE.js} +1 -1
- package/dashboard/dist/assets/{DevicePage-DL5OjugJ.js → DevicePage-hg5EX6lW.js} +1 -1
- package/dashboard/dist/assets/{DialogClose-D0w08oR2.js → DialogClose-B7AyVJn4.js} +1 -1
- package/dashboard/dist/assets/DialogDescription-2f8ReZgl.js +1 -0
- package/dashboard/dist/assets/{DialogTitle-IKAPm5Pk.js → DialogTitle-IGUG8ZLp.js} +1 -1
- package/dashboard/dist/assets/{FadeIn-Dve77aEj.js → FadeIn-DT4BeINx.js} +1 -1
- package/dashboard/dist/assets/{HeaderGithubStar-BVYbLWDi.js → HeaderGithubStar-DrG9OXEl.js} +1 -1
- package/dashboard/dist/assets/{HoverTooltip-BrF9-z7f.js → HoverTooltip-DkHxleW2.js} +1 -1
- package/dashboard/dist/assets/{IpCheckPage-BZ1VyVsm.js → IpCheckPage-Btl87yWo.js} +1 -1
- package/dashboard/dist/assets/{LandingPage-jkjtQl58.js → LandingPage-BM2GFoSc.js} +2 -2
- package/dashboard/dist/assets/{LeaderboardAvatar-D9kUudjQ.js → LeaderboardAvatar-AqGMcFFx.js} +1 -1
- package/dashboard/dist/assets/{LeaderboardPage-DXg7Qv8T.js → LeaderboardPage-B9UnLIPA.js} +2 -2
- package/dashboard/dist/assets/{LeaderboardProfileModal-jTlaOi-j.js → LeaderboardProfileModal-D0PZMJOW.js} +4 -4
- package/dashboard/dist/assets/{LeaderboardProfilePage-DsKQ_Of8.js → LeaderboardProfilePage-D9bu_0cf.js} +1 -1
- package/dashboard/dist/assets/LimitsPage-LLP2azzT.js +5 -0
- package/dashboard/dist/assets/{LocalOnlyNotice-CkLs3CF_.js → LocalOnlyNotice-D3wCg6qv.js} +1 -1
- package/dashboard/dist/assets/{LoginCard-SmOXM_PX.js → LoginCard-D4lzOeYM.js} +1 -1
- package/dashboard/dist/assets/{LoginModal-CvtEBkrO.js → LoginModal-_ycwz7uZ.js} +1 -1
- package/dashboard/dist/assets/{LoginPage-Zm-dRt_Y.js → LoginPage-gSnn_di7.js} +1 -1
- package/dashboard/dist/assets/PetPage-Duo8f2YU.js +1 -0
- package/dashboard/dist/assets/{PopoverPopup-CnteSROW.js → PopoverPopup-BDL1MCfN.js} +1 -1
- package/dashboard/dist/assets/{ProviderIcon-DcQmGbfz.js → ProviderIcon-B_aNMi3s.js} +1 -1
- package/dashboard/dist/assets/{ResetPasswordPage-zMb_m3Cx.js → ResetPasswordPage-DPF1GjA6.js} +1 -1
- package/dashboard/dist/assets/{SegmentedControl-D3KkbQ7T.js → SegmentedControl-BSSEziQX.js} +1 -1
- package/dashboard/dist/assets/{Select-0RiFEISo.js → Select-DI8Duz98.js} +1 -1
- package/dashboard/dist/assets/{SelectItemText-BRV3DFEB.js → SelectItemText-DxwgRTwt.js} +1 -1
- package/dashboard/dist/assets/{ServiceStatusPage-CWF_vKOC.js → ServiceStatusPage-8mc6tf7h.js} +1 -1
- package/dashboard/dist/assets/{SessionsPage-DIqoT7MU.js → SessionsPage-BCIo-bEx.js} +1 -1
- package/dashboard/dist/assets/{SettingsPage-DQZIqiE5.js → SettingsPage-BXpBCDMC.js} +2 -2
- package/dashboard/dist/assets/{SkillsPage-BIIOUHnq.js → SkillsPage-CaXfpR8T.js} +1 -1
- package/dashboard/dist/assets/{TokenGalaxy-Bulaqjbm.js → TokenGalaxy-CO7rFK4W.js} +1 -1
- package/dashboard/dist/assets/{ToolbarRootContext-Dg-zL8fE.js → ToolbarRootContext-Dql3cfna.js} +1 -1
- package/dashboard/dist/assets/{TrendMonitor-DfafDX6b.js → TrendMonitor-C09fR8ct.js} +1 -1
- package/dashboard/dist/assets/{WidgetsPage-F_2yLE7n.js → WidgetsPage-CC00HOab.js} +1 -1
- package/dashboard/dist/assets/{WrappedPage-BFxYKGQs.js → WrappedPage-CepwPa8x.js} +1 -1
- package/dashboard/dist/assets/{__vite-browser-external-CZMdPW0g.js → __vite-browser-external-B-XC2p3L.js} +19 -10
- package/dashboard/dist/assets/__vite-browser-external-CiR9-j4L.css +1 -0
- package/dashboard/dist/assets/{agent-logos-DjyCpabA.js → agent-logos-BDjHZ9FJ.js} +1 -1
- package/dashboard/dist/assets/{arrow-up-right-CIAd6sXA.js → arrow-up-right-C3b1UqgX.js} +1 -1
- package/dashboard/dist/assets/{check-Bt3Yu07t.js → check-m09S3gbL.js} +1 -1
- package/dashboard/dist/assets/{chevron-right-BiXULxma.js → chevron-right-CpDzo_UN.js} +1 -1
- package/dashboard/dist/assets/{copy-D3k1Xbfl.js → copy-Da10tbbX.js} +1 -1
- package/dashboard/dist/assets/{download-co2WHJvo.js → download-qOQt6utK.js} +1 -1
- package/dashboard/dist/assets/{external-link-D5az2QwL.js → external-link-8c_9vEXT.js} +1 -1
- package/dashboard/dist/assets/{flame-CSCUyn3Z.js → flame-DwuGtbCi.js} +1 -1
- package/dashboard/dist/assets/{format-tokens-BebRLYzr.js → format-tokens-5SefoHr1.js} +1 -1
- package/dashboard/dist/assets/{icons-C_y5qr6T.js → icons-JyXD7jwQ.js} +1 -1
- package/dashboard/dist/assets/{index-DP3XlgDm.js → index-BAH8DvZw.js} +1 -1
- package/dashboard/dist/assets/{index-R488h3mD.js → index-CN7zY-iZ.js} +1 -1
- package/dashboard/dist/assets/{index-CXOOOeSl.js → index-QKdHEBW3.js} +1 -1
- package/dashboard/dist/assets/{info-CD_G_DZp.js → info-BeIuHjVl.js} +1 -1
- package/dashboard/dist/assets/{limits-providers-BlAlATd7.js → limits-providers-C2LxotEb.js} +1 -1
- package/dashboard/dist/assets/{link-2-DIn-EC5g.js → link-2-NF0onc-H.js} +1 -1
- package/dashboard/dist/assets/{loader-circle-B5Az_VQe.js → loader-circle-CP259tjS.js} +1 -1
- package/dashboard/dist/assets/{maximize-2-ptnkCbEN.js → maximize-2-DngHuDpS.js} +1 -1
- package/dashboard/dist/assets/{modifiers.esm-DEN3VPKe.js → modifiers.esm-Bp3mFth-.js} +1 -1
- package/dashboard/dist/assets/{monitor-smartphone-Dqr_CnOQ.js → monitor-smartphone-DW17JpTX.js} +1 -1
- package/dashboard/dist/assets/{provider-display-BOAoggwg.js → provider-display-DiZUmcnX.js} +1 -1
- package/dashboard/dist/assets/{react-B3eL33ha.js → react-C681nojo.js} +1 -1
- package/dashboard/dist/assets/{search-CNNSHW9P.js → search-pNfEa7Lu.js} +1 -1
- package/dashboard/dist/assets/{skills-api-BShLlV2m.js → skills-api-0vmNGWLW.js} +1 -1
- package/dashboard/dist/assets/skins-C8EyB85e.js +1 -0
- package/dashboard/dist/assets/{sortable.esm-C6kDS9DZ.js → sortable.esm-BmpxivFO.js} +1 -1
- package/dashboard/dist/assets/{store-B4atnDzu.js → store-B0QLXu7j.js} +1 -1
- package/dashboard/dist/assets/{terminal-CXMttuiJ.js → terminal-D7ntwa3W.js} +1 -1
- package/dashboard/dist/assets/{trash-2-aXKBjf5M.js → trash-2-BneBo2xu.js} +1 -1
- package/dashboard/dist/assets/{use-community-stats-rGR2J-Vi.js → use-community-stats-B4FMrIyX.js} +1 -1
- package/dashboard/dist/assets/{use-limits-display-prefs-CazeqdNI.js → use-limits-display-prefs-B3o8C_zQ.js} +1 -1
- package/dashboard/dist/assets/{use-ordered-list-Bx-enbl8.js → use-ordered-list-CA_j8ox3.js} +1 -1
- package/dashboard/dist/assets/use-reduced-motion-DITgKHoW.js +1 -0
- package/dashboard/dist/assets/{use-session-efficiency-pref-B7RHUtup.js → use-session-efficiency-pref-DwO-VjQ3.js} +1 -1
- package/dashboard/dist/assets/{use-transform-CWVOY76a.js → use-transform-DQhhQUmO.js} +1 -1
- package/dashboard/dist/assets/{use-usage-limits-C9XRiYNi.js → use-usage-limits-BFtGha1X.js} +1 -1
- package/dashboard/dist/assets/{useCurrency-D7ICju5j.js → useCurrency-BpARhxK3.js} +1 -1
- package/dashboard/dist/assets/{useScrollLock-DXWPQF_D.js → useScrollLock-CPs_4XCs.js} +1 -1
- package/dashboard/dist/assets/{useTokenFormat-wDhHrsAL.js → useTokenFormat-BT2luita.js} +1 -1
- package/dashboard/dist/assets/{zap-BZDqgZR1.js → zap-DbgbtlBE.js} +1 -1
- package/dashboard/dist/index.html +2 -2
- package/dashboard/dist/ip-check.html +2 -2
- package/dashboard/dist/leaderboard.html +2 -2
- package/dashboard/dist/share.html +2 -2
- package/package.json +4 -2
- package/src/commands/status.js +5 -1
- package/src/lib/opencode-go-limits.js +33 -15
- package/src/lib/pet-packages.js +45 -1
- package/src/lib/pricing/index.js +17 -0
- package/src/lib/pricing/seed-snapshot.json +1 -1
- package/dashboard/dist/assets/ClawdAnimated-6Ibb4qCZ.js +0 -1
- package/dashboard/dist/assets/DialogDescription-rhGVm7N2.js +0 -1
- package/dashboard/dist/assets/LimitsPage-CMqZAQCa.js +0 -5
- package/dashboard/dist/assets/PetPage-Bcj7hzNz.js +0 -1
- package/dashboard/dist/assets/__vite-browser-external-CRYifSM4.css +0 -1
- package/dashboard/dist/assets/use-reduced-motion-2NcjtyzY.js +0 -1
package/src/lib/pet-packages.js
CHANGED
|
@@ -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
|
-
|
|
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,
|
package/src/lib/pricing/index.js
CHANGED
|
@@ -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
|
}
|