tokentracker-cli 0.84.9 → 0.86.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.de.md +5 -4
- package/README.ja.md +5 -4
- package/README.ko.md +5 -4
- package/README.md +8 -7
- package/README.zh-CN.md +5 -4
- package/dashboard/dist/assets/{AchievementBadge-BgBFpxmU.js → AchievementBadge-BgbH_mX4.js} +1 -1
- package/dashboard/dist/assets/{AchievementsPage-DHPD3Fnu.js → AchievementsPage-CQqkh1JS.js} +2 -2
- package/dashboard/dist/assets/{AchievementsSection-DouWVD-3.js → AchievementsSection-Dmkxpn0s.js} +1 -1
- package/dashboard/dist/assets/{BadgeDetailModal-Df9eQiA3.js → BadgeDetailModal-7OQf37lk.js} +1 -1
- package/dashboard/dist/assets/{Card-CQ9wBnz6.js → Card-1PmWZRTK.js} +1 -1
- package/dashboard/dist/assets/{ClawdAnimated-XIO-I-5v.js → ClawdAnimated-CMJFagpX.js} +1 -1
- package/dashboard/dist/assets/{CommandPalette-Cy1cJ91B.js → CommandPalette-D4OrwF1w.js} +1 -1
- package/dashboard/dist/assets/{CommunityStatsModal-CwKG4LQM.js → CommunityStatsModal-BDC9EcwZ.js} +1 -1
- package/dashboard/dist/assets/{ConfirmModal-BNcWqick.js → ConfirmModal-22DL5C_9.js} +1 -1
- package/dashboard/dist/assets/DashboardPage-CEXWzDtt.js +1 -0
- package/dashboard/dist/assets/{DevicePage-pJ2jNkZV.js → DevicePage-8uhHB7kX.js} +1 -1
- package/dashboard/dist/assets/{DialogClose-C2SOtkJN.js → DialogClose-BcJx6VK-.js} +1 -1
- package/dashboard/dist/assets/DialogDescription-D6zxtOM5.js +1 -0
- package/dashboard/dist/assets/{DialogTitle-CGSbB8G7.js → DialogTitle-gRzunAqv.js} +1 -1
- package/dashboard/dist/assets/{FadeIn-CZSiw7me.js → FadeIn-4rlPdBVe.js} +1 -1
- package/dashboard/dist/assets/{HeaderGithubStar-ZmQhX_kR.js → HeaderGithubStar-CR003aO3.js} +1 -1
- package/dashboard/dist/assets/{HoverTooltip-D_YdG369.js → HoverTooltip-Dgz-dM8Q.js} +1 -1
- package/dashboard/dist/assets/{IpCheckPage-du886dF0.js → IpCheckPage-B4PJRJP_.js} +1 -1
- package/dashboard/dist/assets/{LandingPage-BuAak8lU.js → LandingPage-3JQe-jOZ.js} +2 -2
- package/dashboard/dist/assets/{LeaderboardAvatar-nU0ARYnN.js → LeaderboardAvatar-CL9LxiEf.js} +1 -1
- package/dashboard/dist/assets/{LeaderboardPage-CngwCvC7.js → LeaderboardPage-DhIzM2Z2.js} +2 -2
- package/dashboard/dist/assets/{LeaderboardProfileModal-CXZJ0e-T.js → LeaderboardProfileModal-bbf5uJR5.js} +3 -3
- package/dashboard/dist/assets/{LeaderboardProfilePage-CZve6s6b.js → LeaderboardProfilePage-CzuPxscw.js} +1 -1
- package/dashboard/dist/assets/{LimitsPage-CWvoJPk8.js → LimitsPage-B59rb2gg.js} +1 -1
- package/dashboard/dist/assets/{LocalOnlyNotice-DyUAAyyE.js → LocalOnlyNotice-BkK-6n1R.js} +1 -1
- package/dashboard/dist/assets/{LoginCard-eEiRfbdv.js → LoginCard-BFGCzEjE.js} +1 -1
- package/dashboard/dist/assets/{LoginModal-C16WdIQm.js → LoginModal-yhkyscFn.js} +1 -1
- package/dashboard/dist/assets/{LoginPage-B2WqpE1t.js → LoginPage-DwU5s0F7.js} +1 -1
- package/dashboard/dist/assets/{PetPage-DtQWrGmI.js → PetPage-BPscYR6z.js} +1 -1
- package/dashboard/dist/assets/{PopoverPopup-CRhqtFLB.js → PopoverPopup-E7PyGTTB.js} +1 -1
- package/dashboard/dist/assets/{ProviderIcon-DWNH_wYu.js → ProviderIcon-CvmnzwKU.js} +1 -1
- package/dashboard/dist/assets/{ResetPasswordPage-DzCczcWZ.js → ResetPasswordPage-DD6qX616.js} +1 -1
- package/dashboard/dist/assets/{SegmentedControl-CV9ccq6R.js → SegmentedControl-DjGBL_l1.js} +1 -1
- package/dashboard/dist/assets/{Select-BrogNNk0.js → Select-B2MGmsi2.js} +1 -1
- package/dashboard/dist/assets/{SelectItemText-Bpu3swt0.js → SelectItemText-BaTwA_ZF.js} +1 -1
- package/dashboard/dist/assets/{ServiceStatusPage-D_FIrMJP.js → ServiceStatusPage-0K0y8A6m.js} +1 -1
- package/dashboard/dist/assets/{SessionsPage-C8TvTy1o.js → SessionsPage-CxrtRm3B.js} +2 -2
- package/dashboard/dist/assets/{SettingsPage-Bd-tzJAR.js → SettingsPage-CyvSWvDP.js} +1 -1
- package/dashboard/dist/assets/{SkillsPage-CKGU9wQ4.js → SkillsPage-BVOU8t3t.js} +1 -1
- package/dashboard/dist/assets/{TokenGalaxy-DhHW6L-U.js → TokenGalaxy-w7bwGloC.js} +1 -1
- package/dashboard/dist/assets/{ToolbarRootContext-DQo-4pPB.js → ToolbarRootContext-BAzpDZej.js} +1 -1
- package/dashboard/dist/assets/{TrendMonitor-Ejl8d45g.js → TrendMonitor-DyT7Q4xp.js} +1 -1
- package/dashboard/dist/assets/{WidgetsPage-CY7f4wCD.js → WidgetsPage-eDDtopQT.js} +1 -1
- package/dashboard/dist/assets/{WrappedPage-B4-B2v-v.js → WrappedPage-CKkbdWHF.js} +1 -1
- package/dashboard/dist/assets/{__vite-browser-external-BNUFXCfp.js → __vite-browser-external-SU8sCTLB.js} +23 -16
- package/dashboard/dist/assets/{agent-logos-BRzutmeR.js → agent-logos-bkh9XZJd.js} +1 -1
- package/dashboard/dist/assets/{arrow-up-right-BcrbPk8c.js → arrow-up-right-D16zCIw8.js} +1 -1
- package/dashboard/dist/assets/{check-BMxeFPfQ.js → check-BFL17JWQ.js} +1 -1
- package/dashboard/dist/assets/{chevron-right-DOstgiRf.js → chevron-right-CUJgrtkp.js} +1 -1
- package/dashboard/dist/assets/{copy-BsKO524t.js → copy-CRQiCjgs.js} +1 -1
- package/dashboard/dist/assets/{download-dadqxej7.js → download-Cd12nDrQ.js} +1 -1
- package/dashboard/dist/assets/{external-link-CTu3BMeU.js → external-link-CvAfnsG-.js} +1 -1
- package/dashboard/dist/assets/{flame-B_IvWcMn.js → flame-CCi681Yl.js} +1 -1
- package/dashboard/dist/assets/{format-tokens-DIT6hLSb.js → format-tokens-BAVt8uTZ.js} +1 -1
- package/dashboard/dist/assets/{icons-mWku76bu.js → icons-CbKC96gR.js} +1 -1
- package/dashboard/dist/assets/{index-D5-w-aGy.js → index--TDvaL1y.js} +1 -1
- package/dashboard/dist/assets/{index-D-gQV-hF.js → index-B5b6PCh5.js} +1 -1
- package/dashboard/dist/assets/{index-CboN9E82.js → index-B9LWn-mo.js} +1 -1
- package/dashboard/dist/assets/{info-x6l352SW.js → info-BPFpD--M.js} +1 -1
- package/dashboard/dist/assets/{limits-providers-Bo12VlLJ.js → limits-providers-Cyedt-WJ.js} +1 -1
- package/dashboard/dist/assets/{link-2-eo_xPxH1.js → link-2-BkEPPdfC.js} +1 -1
- package/dashboard/dist/assets/{loader-circle-C4n1iGBv.js → loader-circle-CzASiylJ.js} +1 -1
- package/dashboard/dist/assets/{maximize-2-pR8xwsI_.js → maximize-2-CkwnHUJn.js} +1 -1
- package/dashboard/dist/assets/{provider-display-ErggQWu4.js → provider-display-BXBBedC-.js} +2 -2
- package/dashboard/dist/assets/{react-DYKg02Aq.js → react-BXSctDQj.js} +1 -1
- package/dashboard/dist/assets/{search-B_jbUwPS.js → search-_qGma9tM.js} +1 -1
- package/dashboard/dist/assets/{skills-api-DY5ruGmw.js → skills-api-DdmJjnJ9.js} +1 -1
- package/dashboard/dist/assets/{store-Cu8i1y26.js → store-owYCN530.js} +1 -1
- package/dashboard/dist/assets/{terminal-D3j6X68s.js → terminal-Clzw-KEF.js} +1 -1
- package/dashboard/dist/assets/{trash-2-CFpwgJw5.js → trash-2-C5Giwp_E.js} +1 -1
- package/dashboard/dist/assets/{use-community-stats-C0fKq66G.js → use-community-stats-Dk8UjLEr.js} +1 -1
- package/dashboard/dist/assets/{use-limits-display-prefs-TOp4UAnI.js → use-limits-display-prefs-CArM595Q.js} +1 -1
- package/dashboard/dist/assets/{use-native-settings-BZie_7z1.js → use-native-settings-Cpd69kiF.js} +1 -1
- package/dashboard/dist/assets/{use-ordered-list-Bq92YyUp.js → use-ordered-list--CzwhBTx.js} +1 -1
- package/dashboard/dist/assets/use-reduced-motion-CcILnpU1.js +1 -0
- package/dashboard/dist/assets/{use-session-efficiency-pref-BcpytkES.js → use-session-efficiency-pref-DUXO8cCg.js} +1 -1
- package/dashboard/dist/assets/{use-transform-Dmmrne2z.js → use-transform-Cg3kuMj_.js} +1 -1
- package/dashboard/dist/assets/{use-usage-limits-Cw0Z9Tew.js → use-usage-limits-DY9_mV28.js} +1 -1
- package/dashboard/dist/assets/{useCurrency-DyyonINj.js → useCurrency-BIe86hMn.js} +1 -1
- package/dashboard/dist/assets/{useScrollLock-DvWw86lJ.js → useScrollLock-7-hejkNC.js} +1 -1
- package/dashboard/dist/assets/{useTokenFormat-CBkvGfJ1.js → useTokenFormat-DEtLbRgQ.js} +1 -1
- package/dashboard/dist/assets/{zap-CnYA39Ug.js → zap-DUxY1d-O.js} +1 -1
- package/dashboard/dist/index.html +12 -10
- package/dashboard/dist/ip-check.html +1 -1
- package/dashboard/dist/leaderboard.html +1 -1
- package/dashboard/dist/llms.txt +3 -2
- package/dashboard/dist/share.html +1 -1
- package/package.json +2 -2
- package/src/commands/init.js +1 -0
- package/src/commands/status.js +129 -9
- package/src/commands/sync.js +265 -54
- package/src/lib/claude-categorizer.js +36 -9
- package/src/lib/diagnostics.js +86 -13
- package/src/lib/doctor.js +17 -0
- package/src/lib/grok-context-breakdown.js +794 -0
- package/src/lib/install-resolver.js +10 -2
- package/src/lib/local-api.js +21 -3
- package/src/lib/multi-install-parser.js +9 -1
- package/src/lib/pricing/seed-snapshot.json +1 -1
- package/src/lib/rollout.js +788 -44
- package/src/lib/session-analytics.js +332 -9
- package/dashboard/dist/assets/DashboardPage-Dns_1yXL.js +0 -1
- package/dashboard/dist/assets/DialogDescription-Bhfqqmll.js +0 -1
- package/dashboard/dist/assets/use-reduced-motion-ZiVeOkvb.js +0 -1
|
@@ -45,13 +45,21 @@ function ensureNamespacedCursors(cursors, providerName, activeKeys = ["native",
|
|
|
45
45
|
return cursors[providerName];
|
|
46
46
|
}
|
|
47
47
|
|
|
48
|
-
|
|
48
|
+
// Collapse { native, wsl } namespaces back into a flat cursor when only one
|
|
49
|
+
// install remains. `preferredKey` names the SURVIVING install's namespace —
|
|
50
|
+
// its keys must win the merge, otherwise the vanished install's cursor
|
|
51
|
+
// (lastDbId watermarks, dedup maps) is donated to the survivor and its next
|
|
52
|
+
// parse double-counts everything past the foreign cursor. Callers that don't
|
|
53
|
+
// know the survivor fall back to the mode preference (legacy behavior).
|
|
54
|
+
function ensureFlatCursor(cursors, providerName, env, preferredKey) {
|
|
49
55
|
const state = cursors[providerName];
|
|
50
56
|
if (!state || typeof state !== "object") return;
|
|
51
57
|
if (state.native === undefined && state.wsl === undefined) return;
|
|
52
58
|
|
|
53
59
|
const mode = wsl.getWslMode(env || process.env);
|
|
54
|
-
const preferWsl =
|
|
60
|
+
const preferWsl = preferredKey === "wsl" || preferredKey === "native"
|
|
61
|
+
? preferredKey === "wsl"
|
|
62
|
+
: mode === "wsl-first" || mode === "wsl-only";
|
|
55
63
|
const merged = preferWsl ? { ...state.native, ...state.wsl } : { ...state.wsl, ...state.native };
|
|
56
64
|
cursors[providerName] = merged;
|
|
57
65
|
}
|
package/src/lib/local-api.js
CHANGED
|
@@ -57,6 +57,7 @@ const {
|
|
|
57
57
|
} = require("./claude-categorizer");
|
|
58
58
|
|
|
59
59
|
const { computeCodexContextBreakdown } = require("./codex-context-breakdown");
|
|
60
|
+
const { computeGrokContextBreakdown } = require("./grok-context-breakdown");
|
|
60
61
|
|
|
61
62
|
const {
|
|
62
63
|
deriveProjectKeyFromRef,
|
|
@@ -2308,11 +2309,11 @@ function createLocalApiHandler({ queuePath }) {
|
|
|
2308
2309
|
return true;
|
|
2309
2310
|
}
|
|
2310
2311
|
|
|
2311
|
-
// --- usage-category-breakdown (Claude + Codex) ---
|
|
2312
|
+
// --- usage-category-breakdown (Claude + Codex + Grok) ---
|
|
2312
2313
|
// Claude: splits historical Claude usage into seven semantic categories
|
|
2313
2314
|
// mirroring Claude Code's /context view (approx).
|
|
2314
|
-
// Codex:
|
|
2315
|
-
//
|
|
2315
|
+
// Codex/Grok: tool-oriented breakdown, attributing per-turn token
|
|
2316
|
+
// totals to observed tool calls (heuristic).
|
|
2316
2317
|
if (p === "/functions/tokentracker-usage-category-breakdown") {
|
|
2317
2318
|
const from = url.searchParams.get("from") || "";
|
|
2318
2319
|
const to = url.searchParams.get("to") || "";
|
|
@@ -2354,6 +2355,23 @@ function createLocalApiHandler({ queuePath }) {
|
|
|
2354
2355
|
return true;
|
|
2355
2356
|
}
|
|
2356
2357
|
|
|
2358
|
+
if (requestedSource === "grok") {
|
|
2359
|
+
try {
|
|
2360
|
+
const timeZoneContext = getTimeZoneContext(url);
|
|
2361
|
+
const result = await computeGrokContextBreakdown({
|
|
2362
|
+
from,
|
|
2363
|
+
to,
|
|
2364
|
+
top: 50,
|
|
2365
|
+
timeZoneContext,
|
|
2366
|
+
});
|
|
2367
|
+
json(res, { from, to, ...result });
|
|
2368
|
+
} catch (e) {
|
|
2369
|
+
console.error("[LocalAPI] usage-category-breakdown(grok):", e?.message || e);
|
|
2370
|
+
json(res, { from, to, ...unsupportedCategoryPayload("grok"), error: "compute_failed" }, 500);
|
|
2371
|
+
}
|
|
2372
|
+
return true;
|
|
2373
|
+
}
|
|
2374
|
+
|
|
2357
2375
|
json(res, { from, to, ...unsupportedCategoryPayload(requestedSource) });
|
|
2358
2376
|
return true;
|
|
2359
2377
|
}
|
|
@@ -11,7 +11,15 @@ async function multiInstallParse({ paths, parserFn, providerName, cursors, getPa
|
|
|
11
11
|
const env = shared.env || process.env;
|
|
12
12
|
|
|
13
13
|
if (installKeys.length === 1) {
|
|
14
|
-
|
|
14
|
+
// Flatten toward the SURVIVING install's namespace, not the mode
|
|
15
|
+
// preference: under wsl-first a vanished WSL install (deleted distro,
|
|
16
|
+
// transient wsl.exe probe failure) must not donate its cursor to the
|
|
17
|
+
// remaining native install. Non-both modes park the pick in the `native`
|
|
18
|
+
// slot regardless of identity, so the slot name is unreliable — WSL
|
|
19
|
+
// installs are always addressed via UNC paths, which identifies the
|
|
20
|
+
// survivor directly.
|
|
21
|
+
const survivorKey = wsl.isUncPath(paths[installKeys[0]]) ? "wsl" : "native";
|
|
22
|
+
ensureFlatCursor(cursors, providerName, env, survivorKey);
|
|
15
23
|
return await parserFn({
|
|
16
24
|
...getParams(paths[installKeys[0]], installKeys[0]),
|
|
17
25
|
...shared,
|