tokentracker-cli 0.40.0 → 0.42.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.
- package/README.ja.md +2 -1
- package/README.ko.md +2 -1
- package/README.md +1 -0
- package/README.zh-CN.md +2 -1
- package/dashboard/dist/assets/{ActivityHeatmap-D0gkN1RW.js → ActivityHeatmap-CImSj13A.js} +1 -1
- package/dashboard/dist/assets/{Card-DgaNailB.js → Card-DpjFlMHF.js} +1 -1
- package/dashboard/dist/assets/DashboardPage-CZkSRYE8.js +19 -0
- package/dashboard/dist/assets/{DevicePage-WxD3UOS4.js → DevicePage-BIBlmBPl.js} +1 -1
- package/dashboard/dist/assets/DialogTitle-BMKzpys0.js +1 -0
- package/dashboard/dist/assets/{FadeIn-CIowr92k.js → FadeIn-B5-cy4YN.js} +1 -1
- package/dashboard/dist/assets/{HeaderGithubStar-BG7mHinn.js → HeaderGithubStar-BM-sbvJG.js} +1 -1
- package/dashboard/dist/assets/{IpCheckPage-BEf8N-sD.js → IpCheckPage-C7-NXbFK.js} +4 -4
- package/dashboard/dist/assets/LandingPage-ouOFlABY.js +4411 -0
- package/dashboard/dist/assets/{LeaderboardAvatar-tq8LphKG.js → LeaderboardAvatar-DMXPtCkx.js} +1 -1
- package/dashboard/dist/assets/{LeaderboardPage-DeeyHMbP.js → LeaderboardPage-CC4CFYAe.js} +3 -3
- package/dashboard/dist/assets/{LeaderboardProfileModal-Dj5nnKZq.js → LeaderboardProfileModal-D-ncIr24.js} +2 -2
- package/dashboard/dist/assets/LeaderboardProfilePage-DtDMfVuQ.js +421 -0
- package/dashboard/dist/assets/LimitsPage-qaD7Reti.js +2 -0
- package/dashboard/dist/assets/{LocalOnlyNotice-DDvq44QO.js → LocalOnlyNotice-BCy18fW4.js} +1 -1
- package/dashboard/dist/assets/{LoginPage-BaOQo7cY.js → LoginPage-BLPY2ZI-.js} +1 -1
- package/dashboard/dist/assets/PopoverPopup-CpIlpO0j.js +1 -0
- package/dashboard/dist/assets/Select-BOxMknxo.js +1 -0
- package/dashboard/dist/assets/SelectItemText-B0SL3Wb5.js +1 -0
- package/dashboard/dist/assets/SettingsPage-De7GbtPf.js +1 -0
- package/dashboard/dist/assets/SkillsPage-jpoYzUBQ.js +1 -0
- package/dashboard/dist/assets/WidgetsPage-BaEYiZZH.js +1 -0
- package/dashboard/dist/assets/{WrappedPage-DHiRPuq6.js → WrappedPage-BYhKuiTb.js} +1 -1
- package/dashboard/dist/assets/agent-logos-DSQgCNll.js +1 -0
- package/dashboard/dist/assets/{arrow-up-right-CEarB9tV.js → arrow-up-right-Brwh94cN.js} +1 -1
- package/dashboard/dist/assets/{download-Bh0gjfze.js → download-kFiot71R.js} +1 -1
- package/dashboard/dist/assets/geist-mono-cyrillic-400-normal-CeA7eGSt.woff +0 -0
- package/dashboard/dist/assets/geist-mono-cyrillic-400-normal-DoshcOXv.woff2 +0 -0
- package/dashboard/dist/assets/geist-mono-cyrillic-500-normal-BgLpzsdg.woff +0 -0
- package/dashboard/dist/assets/geist-mono-cyrillic-500-normal-BkE2O7RC.woff2 +0 -0
- package/dashboard/dist/assets/geist-mono-cyrillic-700-normal-4t7P5rT3.woff2 +0 -0
- package/dashboard/dist/assets/geist-mono-cyrillic-700-normal-DpJKySxv.woff +0 -0
- package/dashboard/dist/assets/geist-mono-cyrillic-900-normal-CVPizhN4.woff2 +0 -0
- package/dashboard/dist/assets/geist-mono-cyrillic-900-normal-DDpyx8f0.woff +0 -0
- package/dashboard/dist/assets/geist-mono-latin-400-normal-BXAprPdR.woff +0 -0
- package/dashboard/dist/assets/geist-mono-latin-400-normal-DKaoCDn5.woff2 +0 -0
- package/dashboard/dist/assets/geist-mono-latin-500-normal-C3sF8Y1B.woff2 +0 -0
- package/dashboard/dist/assets/geist-mono-latin-500-normal-YfPbDI_o.woff +0 -0
- package/dashboard/dist/assets/geist-mono-latin-700-normal-CzSaXH83.woff +0 -0
- package/dashboard/dist/assets/geist-mono-latin-700-normal-DMoeyBRY.woff2 +0 -0
- package/dashboard/dist/assets/geist-mono-latin-900-normal-DAGlevET.woff +0 -0
- package/dashboard/dist/assets/geist-mono-latin-900-normal-DVg4HgZN.woff2 +0 -0
- package/dashboard/dist/assets/geist-mono-latin-ext-400-normal-C1xxG8eb.woff2 +0 -0
- package/dashboard/dist/assets/geist-mono-latin-ext-400-normal-a1APXIwD.woff +0 -0
- package/dashboard/dist/assets/geist-mono-latin-ext-500-normal-CDyCFkgU.woff2 +0 -0
- package/dashboard/dist/assets/geist-mono-latin-ext-500-normal-CzSM7th5.woff +0 -0
- package/dashboard/dist/assets/geist-mono-latin-ext-700-normal-BG1muzu_.woff2 +0 -0
- package/dashboard/dist/assets/geist-mono-latin-ext-700-normal-BmQm3zK6.woff +0 -0
- package/dashboard/dist/assets/geist-mono-latin-ext-900-normal-DvYIGD1f.woff2 +0 -0
- package/dashboard/dist/assets/geist-mono-latin-ext-900-normal-LB8u5xx5.woff +0 -0
- package/dashboard/dist/assets/geist-mono-symbols2-400-normal-B5fXMCGq.woff +0 -0
- package/dashboard/dist/assets/geist-mono-symbols2-500-normal-BYvOiszX.woff +0 -0
- package/dashboard/dist/assets/geist-mono-symbols2-700-normal-nLp0AmIG.woff +0 -0
- package/dashboard/dist/assets/geist-mono-symbols2-900-normal-DPuoOkkO.woff +0 -0
- package/dashboard/dist/assets/geist-mono-vietnamese-400-normal-CyOwoevh.woff +0 -0
- package/dashboard/dist/assets/geist-mono-vietnamese-500-normal-Do_laDd2.woff +0 -0
- package/dashboard/dist/assets/geist-mono-vietnamese-700-normal-DKtT8o3X.woff +0 -0
- package/dashboard/dist/assets/geist-mono-vietnamese-900-normal-BAZIExb_.woff +0 -0
- package/dashboard/dist/assets/{info-BVM2oiQP.js → info-CGx4zWQF.js} +1 -1
- package/dashboard/dist/assets/main-9Ze1SUIZ.js +995 -0
- package/dashboard/dist/assets/main-DMJJVAOH.css +1 -0
- package/dashboard/dist/assets/use-limits-display-prefs-Ehri95OP.js +1 -0
- package/dashboard/dist/assets/{use-native-settings-BoIA6w2j.js → use-native-settings-BWqG5RDr.js} +1 -1
- package/dashboard/dist/assets/{use-usage-limits-Co8ywhqF.js → use-usage-limits-2ZxmPfoP.js} +1 -1
- package/dashboard/dist/assets/{useCurrency-CuLnDPms.js → useCurrency-DQmyhw3i.js} +1 -1
- package/dashboard/dist/assets/useScrollLock-BcLeWqWK.js +1 -0
- package/dashboard/dist/index.html +2 -2
- package/dashboard/dist/share.html +2 -2
- package/package.json +3 -3
- package/src/lib/grok-limits.js +184 -0
- package/src/lib/local-api.js +63 -0
- package/src/lib/pricing/seed-snapshot.json +1 -1
- package/src/lib/rollout.js +47 -29
- package/src/lib/usage-limits.js +6 -1
- package/dashboard/dist/assets/DashboardPage-CV_vq3RD.js +0 -19
- package/dashboard/dist/assets/DialogTitle-HpCbbWQz.js +0 -1
- package/dashboard/dist/assets/LandingPage-DWhpEISl.js +0 -4356
- package/dashboard/dist/assets/LeaderboardProfilePage-BMJyZxKC.js +0 -1
- package/dashboard/dist/assets/LimitsPage-DV6egWEj.js +0 -2
- package/dashboard/dist/assets/PopoverPopup-BhquCaxW.js +0 -1
- package/dashboard/dist/assets/Select-BBsxYIty.js +0 -1
- package/dashboard/dist/assets/SelectItemText-DV94Rvfw.js +0 -1
- package/dashboard/dist/assets/SettingsPage-D6kfA65g.js +0 -1
- package/dashboard/dist/assets/SkillsPage-BxzsmE10.js +0 -1
- package/dashboard/dist/assets/WidgetsPage-CtYs9AGI.js +0 -1
- package/dashboard/dist/assets/agent-logos-CKVvzLb1.js +0 -1
- package/dashboard/dist/assets/geist-mono-cyrillic-400-normal-BPBWmzPh.woff +0 -0
- package/dashboard/dist/assets/geist-mono-cyrillic-400-normal-Ce5q_31Z.woff2 +0 -0
- package/dashboard/dist/assets/geist-mono-cyrillic-500-normal-CJBLNVQT.woff2 +0 -0
- package/dashboard/dist/assets/geist-mono-cyrillic-500-normal-mNhfPmgl.woff +0 -0
- package/dashboard/dist/assets/geist-mono-cyrillic-700-normal-DH5Q319x.woff +0 -0
- package/dashboard/dist/assets/geist-mono-cyrillic-700-normal-VCNRadI3.woff2 +0 -0
- package/dashboard/dist/assets/geist-mono-cyrillic-900-normal-BKC3PZkM.woff +0 -0
- package/dashboard/dist/assets/geist-mono-cyrillic-900-normal-DdrQ8KBw.woff2 +0 -0
- package/dashboard/dist/assets/geist-mono-latin-400-normal-CoULgQGM.woff +0 -0
- package/dashboard/dist/assets/geist-mono-latin-400-normal-LC9RFr9I.woff2 +0 -0
- package/dashboard/dist/assets/geist-mono-latin-500-normal-D3o2eNa9.woff2 +0 -0
- package/dashboard/dist/assets/geist-mono-latin-500-normal-DOxI7kZ4.woff +0 -0
- package/dashboard/dist/assets/geist-mono-latin-700-normal-D6izGJRP.woff2 +0 -0
- package/dashboard/dist/assets/geist-mono-latin-700-normal-QGw08Lff.woff +0 -0
- package/dashboard/dist/assets/geist-mono-latin-900-normal-CmoKXrdK.woff +0 -0
- package/dashboard/dist/assets/geist-mono-latin-900-normal-Cu5MFKsu.woff2 +0 -0
- package/dashboard/dist/assets/geist-mono-latin-ext-400-normal-Cgks_Qgx.woff2 +0 -0
- package/dashboard/dist/assets/geist-mono-latin-ext-400-normal-CxNRRMGd.woff +0 -0
- package/dashboard/dist/assets/geist-mono-latin-ext-500-normal-CQcGuCNt.woff2 +0 -0
- package/dashboard/dist/assets/geist-mono-latin-ext-500-normal-diTenJ8L.woff +0 -0
- package/dashboard/dist/assets/geist-mono-latin-ext-700-normal-BX9f1BHp.woff +0 -0
- package/dashboard/dist/assets/geist-mono-latin-ext-700-normal-YOllDaLV.woff2 +0 -0
- package/dashboard/dist/assets/geist-mono-latin-ext-900-normal-Br6WNUGb.woff +0 -0
- package/dashboard/dist/assets/geist-mono-latin-ext-900-normal-CrmBTzU2.woff2 +0 -0
- package/dashboard/dist/assets/main-BMyBoVLI.css +0 -1
- package/dashboard/dist/assets/main-CPiNtuB_.js +0 -971
- package/dashboard/dist/assets/use-limits-display-prefs-kAa9p8ua.js +0 -1
- package/dashboard/dist/assets/useOpenInteractionType-CAJUA73r.js +0 -12
package/src/lib/rollout.js
CHANGED
|
@@ -679,21 +679,23 @@ async function parseOpenclawSessionFile({
|
|
|
679
679
|
|
|
680
680
|
const model = normalizeModelInput(msg.model) || DEFAULT_MODEL;
|
|
681
681
|
|
|
682
|
-
//
|
|
683
|
-
//
|
|
684
|
-
//
|
|
685
|
-
//
|
|
686
|
-
|
|
687
|
-
const
|
|
688
|
-
const
|
|
689
|
-
const
|
|
682
|
+
// OpenClaw wraps Codex, so it follows the same OpenAI convention where
|
|
683
|
+
// `input` INCLUDES cached reads. Normalize by subtracting cached from
|
|
684
|
+
// input so `input_tokens` is pure non-cached (matches CLAUDE.md spec
|
|
685
|
+
// and prevents downstream double-counting at the cache_read rate on top
|
|
686
|
+
// of the full input rate — ~6–7x cost inflation on cache-heavy sessions).
|
|
687
|
+
const openclawRawInput = Number(usage.input || 0);
|
|
688
|
+
const openclawCached = Number(usage.cacheRead || 0);
|
|
689
|
+
const openclawCacheWrite = Number(usage.cacheWrite || 0);
|
|
690
|
+
const openclawOutput = Number(usage.output || 0);
|
|
691
|
+
const openclawInput = Math.max(0, openclawRawInput - openclawCached);
|
|
690
692
|
const delta = {
|
|
691
|
-
input_tokens:
|
|
692
|
-
cached_input_tokens:
|
|
693
|
-
cache_creation_input_tokens:
|
|
694
|
-
output_tokens:
|
|
693
|
+
input_tokens: openclawInput,
|
|
694
|
+
cached_input_tokens: openclawCached,
|
|
695
|
+
cache_creation_input_tokens: openclawCacheWrite,
|
|
696
|
+
output_tokens: openclawOutput,
|
|
695
697
|
reasoning_output_tokens: 0,
|
|
696
|
-
total_tokens:
|
|
698
|
+
total_tokens: openclawInput + openclawCached + openclawCacheWrite + openclawOutput,
|
|
697
699
|
conversation_count: 1,
|
|
698
700
|
};
|
|
699
701
|
|
|
@@ -4420,26 +4422,42 @@ async function parseKimiCodeIncremental({ wireFiles, cursors, queuePath, onProgr
|
|
|
4420
4422
|
|
|
4421
4423
|
recordsProcessed++;
|
|
4422
4424
|
|
|
4423
|
-
//
|
|
4424
|
-
//
|
|
4425
|
-
//
|
|
4426
|
-
//
|
|
4427
|
-
|
|
4425
|
+
// kimi-code's wire usage comes in two shapes across versions:
|
|
4426
|
+
// - camelCase (proto 0.6.0+, current): { inputOther, inputCacheRead,
|
|
4427
|
+
// inputCacheCreation, output } where inputOther is already fresh
|
|
4428
|
+
// (non-cached) input — this is `response.usage` straight from the LLM
|
|
4429
|
+
// adapter (verified in @moonshot-ai/kimi-code 0.6.0/0.7.0/0.9.0).
|
|
4430
|
+
// - Anthropic-style (older): { input_tokens, output_tokens,
|
|
4431
|
+
// cache_read_input_tokens, cache_creation_input_tokens }. OpenAI-compat
|
|
4432
|
+
// models fold cached reads into input_tokens and expose them via
|
|
4433
|
+
// input_tokens_details.cached_tokens — subtract so we never double-count.
|
|
4434
|
+
// step.end and usage.record carry the SAME per-step usage object, so we
|
|
4435
|
+
// read only step.end here (reading both would double-count ~2x).
|
|
4436
|
+
let cacheCreation;
|
|
4428
4437
|
let cacheRead;
|
|
4429
4438
|
let input;
|
|
4430
|
-
|
|
4431
|
-
|
|
4432
|
-
input = toNonNegativeInt(usage.
|
|
4439
|
+
let output;
|
|
4440
|
+
if (usage.inputOther != null) {
|
|
4441
|
+
input = toNonNegativeInt(usage.inputOther);
|
|
4442
|
+
cacheRead = toNonNegativeInt(usage.inputCacheRead);
|
|
4443
|
+
cacheCreation = toNonNegativeInt(usage.inputCacheCreation);
|
|
4444
|
+
output = toNonNegativeInt(usage.output);
|
|
4433
4445
|
} else {
|
|
4434
|
-
|
|
4435
|
-
|
|
4436
|
-
|
|
4437
|
-
|
|
4438
|
-
|
|
4439
|
-
|
|
4440
|
-
|
|
4446
|
+
cacheCreation = toNonNegativeInt(usage.cache_creation_input_tokens);
|
|
4447
|
+
if (usage.cache_read_input_tokens != null) {
|
|
4448
|
+
cacheRead = toNonNegativeInt(usage.cache_read_input_tokens);
|
|
4449
|
+
input = toNonNegativeInt(usage.input_tokens);
|
|
4450
|
+
} else {
|
|
4451
|
+
const details =
|
|
4452
|
+
usage.input_tokens_details && typeof usage.input_tokens_details === "object"
|
|
4453
|
+
? usage.input_tokens_details
|
|
4454
|
+
: null;
|
|
4455
|
+
const cached = toNonNegativeInt(details ? details.cached_tokens : 0);
|
|
4456
|
+
cacheRead = cached;
|
|
4457
|
+
input = Math.max(0, toNonNegativeInt(usage.input_tokens) - cached);
|
|
4458
|
+
}
|
|
4459
|
+
output = toNonNegativeInt(usage.output_tokens);
|
|
4441
4460
|
}
|
|
4442
|
-
const output = toNonNegativeInt(usage.output_tokens);
|
|
4443
4461
|
if (input === 0 && output === 0 && cacheRead === 0 && cacheCreation === 0) {
|
|
4444
4462
|
seenIds.add(id);
|
|
4445
4463
|
continue;
|
package/src/lib/usage-limits.js
CHANGED
|
@@ -21,6 +21,7 @@ const {
|
|
|
21
21
|
extractCursorSessionToken,
|
|
22
22
|
fetchCursorUsageSummary,
|
|
23
23
|
} = require("./cursor-config");
|
|
24
|
+
const { fetchGrokLimits } = require("./grok-limits");
|
|
24
25
|
|
|
25
26
|
// 2-minute in-memory cache
|
|
26
27
|
let cache = { data: null, fetchedAt: 0 };
|
|
@@ -1698,7 +1699,7 @@ async function getUsageLimits({
|
|
|
1698
1699
|
const codexPlanType = codexAuthRefreshed?.planType || null;
|
|
1699
1700
|
|
|
1700
1701
|
const providerFetch = withFetchTimeout(fetchImpl, providerTimeoutMs);
|
|
1701
|
-
const [claudeResult, codexResult, cursor, kimi, gemini, kiro, antigravity, copilot] = await Promise.all([
|
|
1702
|
+
const [claudeResult, codexResult, cursor, kimi, gemini, kiro, antigravity, copilot, grok] = await Promise.all([
|
|
1702
1703
|
claudeToken
|
|
1703
1704
|
? withProviderTimeout(fetchClaudeUsageLimits(claudeToken, { fetchImpl: providerFetch, maxAttempts: 1 }), "Claude", providerTimeoutMs).then(
|
|
1704
1705
|
(value) => ({ status: "fulfilled", value }),
|
|
@@ -1725,6 +1726,8 @@ async function getUsageLimits({
|
|
|
1725
1726
|
fetchAntigravityLimits({ home, commandRunner, requestFn, nowMs }),
|
|
1726
1727
|
withProviderTimeout(fetchCopilotLimits({ home, env, fetchImpl: providerFetch }), "GitHub Copilot", providerTimeoutMs)
|
|
1727
1728
|
.catch((reason) => ({ configured: true, error: reason?.message || "Unknown error" })),
|
|
1729
|
+
withProviderTimeout(fetchGrokLimits({ home, env, fetchImpl: providerFetch }), "Grok Build", providerTimeoutMs)
|
|
1730
|
+
.catch((reason) => ({ configured: true, error: reason?.message || "Unknown error" })),
|
|
1728
1731
|
]);
|
|
1729
1732
|
|
|
1730
1733
|
let claude;
|
|
@@ -1776,6 +1779,7 @@ async function getUsageLimits({
|
|
|
1776
1779
|
kiro: withPlanLabel(kiro, kiro.plan_name, "Kiro"),
|
|
1777
1780
|
antigravity: withPlanLabel(antigravity, antigravity.account_plan, "Antigravity"),
|
|
1778
1781
|
copilot: withPlanLabel(copilot, copilot.plan_name, "Copilot"),
|
|
1782
|
+
grok: withPlanLabel(grok, null, "Grok"),
|
|
1779
1783
|
};
|
|
1780
1784
|
|
|
1781
1785
|
cache = { data, fetchedAt: nowMs };
|
|
@@ -1803,4 +1807,5 @@ module.exports = {
|
|
|
1803
1807
|
fetchCopilotLimits,
|
|
1804
1808
|
readCopilotOauthToken,
|
|
1805
1809
|
describeCopilotOtelStatus,
|
|
1810
|
+
fetchGrokLimits,
|
|
1806
1811
|
};
|