tokentracker-cli 1.1.11 → 1.1.13
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.md +2 -1
- package/dashboard/dist/assets/{AchievementBadge-DuEuFaXg.js → AchievementBadge-DHCKPAgO.js} +1 -1
- package/dashboard/dist/assets/{AchievementsPage-BTTFtk_Z.js → AchievementsPage-BqlGMD7S.js} +2 -2
- package/dashboard/dist/assets/{AchievementsSection-BZppKteZ.js → AchievementsSection-CTTTR9CN.js} +1 -1
- package/dashboard/dist/assets/{BadgeDetailModal-TzmxXy8k.js → BadgeDetailModal-e0Iz8ct4.js} +1 -1
- package/dashboard/dist/assets/BotAnimated-BLYZyT1O.js +1 -0
- package/dashboard/dist/assets/{Card-HigkIm_b.js → Card-EHkn9ktD.js} +1 -1
- package/dashboard/dist/assets/{CommandPalette-Bx_11gJk.js → CommandPalette-CuSVstX9.js} +1 -1
- package/dashboard/dist/assets/{CommunityStatsModal-BjDPCBol.js → CommunityStatsModal-Cb1vefLE.js} +1 -1
- package/dashboard/dist/assets/{ConfirmModal-DTo93RpG.js → ConfirmModal-pIUQJ7QM.js} +1 -1
- package/dashboard/dist/assets/Controls-CX4Di57j.js +1 -0
- package/dashboard/dist/assets/DashboardPage-D1Ox1y3E.js +1 -0
- package/dashboard/dist/assets/{DevicePage-BVupGt9K.js → DevicePage-Q57gBE8A.js} +1 -1
- package/dashboard/dist/assets/{DialogClose-BlQJpi7n.js → DialogClose-Dn-nxOSp.js} +1 -1
- package/dashboard/dist/assets/DialogDescription-GXslTq2z.js +1 -0
- package/dashboard/dist/assets/{DialogTitle-CDmxp9ap.js → DialogTitle-DuAY9sfZ.js} +1 -1
- package/dashboard/dist/assets/{FadeIn-DPercU5n.js → FadeIn-25jNO9JV.js} +1 -1
- package/dashboard/dist/assets/{HeaderGithubStar-DeVzeBIo.js → HeaderGithubStar-0-ne32-S.js} +1 -1
- package/dashboard/dist/assets/{HoverTooltip-Duo2Icus.js → HoverTooltip-C2Qop8B3.js} +1 -1
- package/dashboard/dist/assets/{IpCheckPage-DgYiaRrT.js → IpCheckPage-Q9lwiFdt.js} +1 -1
- package/dashboard/dist/assets/{LandingPage-CYTR4PbQ.js → LandingPage-iX6E8Flr.js} +2 -2
- package/dashboard/dist/assets/{LeaderboardAvatar-B67pMaIl.js → LeaderboardAvatar-CiQrgneF.js} +1 -1
- package/dashboard/dist/assets/{LeaderboardPage-2wIMkBgq.js → LeaderboardPage-BIhIA28A.js} +2 -2
- package/dashboard/dist/assets/{LeaderboardProfileModal-D3VxkFlx.js → LeaderboardProfileModal-CF-MI8rL.js} +4 -4
- package/dashboard/dist/assets/{LeaderboardProfilePage-BS01jN5M.js → LeaderboardProfilePage-DRbLb-fO.js} +3 -3
- package/dashboard/dist/assets/{LimitsPage-BGRZW-aH.js → LimitsPage-lvYidBkz.js} +2 -2
- package/dashboard/dist/assets/{LocalOnlyNotice-Do9KUdi_.js → LocalOnlyNotice-CAQTnlaI.js} +1 -1
- package/dashboard/dist/assets/{LoginCard-CzAXLXfZ.js → LoginCard-Ci2Rrsfl.js} +1 -1
- package/dashboard/dist/assets/{LoginModal-D1J8zG0C.js → LoginModal-DhyQPl-V.js} +1 -1
- package/dashboard/dist/assets/{LoginPage-DeZJNMLe.js → LoginPage-B6q8P6hE.js} +1 -1
- package/dashboard/dist/assets/PetPage-82Cldgg6.js +1 -0
- package/dashboard/dist/assets/{PopoverPopup-BYzzQJTD.js → PopoverPopup-Btcu7vU0.js} +1 -1
- package/dashboard/dist/assets/{ProviderIcon-BfFkS-OF.js → ProviderIcon-aLwclDsD.js} +1 -1
- package/dashboard/dist/assets/{ResetPasswordPage-BFyYvG24.js → ResetPasswordPage-BlRl_aJr.js} +1 -1
- package/dashboard/dist/assets/{SegmentedControl-D5USR3JT.js → SegmentedControl-2O_XVL8u.js} +1 -1
- package/dashboard/dist/assets/{Select-DmFQdVA1.js → Select-D5uuRQwh.js} +1 -1
- package/dashboard/dist/assets/{SelectItemText-B5MXGLN-.js → SelectItemText-Bq_ZdWU0.js} +1 -1
- package/dashboard/dist/assets/{ServiceStatusPage-Dvm5eUJK.js → ServiceStatusPage-Pd6dgJua.js} +1 -1
- package/dashboard/dist/assets/{SessionsPage-DQKezzUW.js → SessionsPage-DjHudcn6.js} +2 -2
- package/dashboard/dist/assets/SettingsPage-DOLhZiBE.js +2 -0
- package/dashboard/dist/assets/{SkillsPage-DyX_-dcr.js → SkillsPage-D9-ZorB5.js} +1 -1
- package/dashboard/dist/assets/{TokenGalaxy-aK3jhWW0.js → TokenGalaxy-BN71jQQ8.js} +1 -1
- package/dashboard/dist/assets/{ToolbarRootContext-CY_SULMC.js → ToolbarRootContext-B0cqyD1i.js} +1 -1
- package/dashboard/dist/assets/TrendMonitor-DWxtbzyQ.js +19 -0
- package/dashboard/dist/assets/{WidgetsPage-D8tzK-7m.js → WidgetsPage-BwmJ2Z9d.js} +1 -1
- package/dashboard/dist/assets/{WrappedPage-BjZPa_al.js → WrappedPage-Cq8DrzLm.js} +1 -1
- package/dashboard/dist/assets/__vite-browser-external-CPMSmJgP.js +45 -0
- package/dashboard/dist/assets/__vite-browser-external-DrXtuPP9.css +1 -0
- package/dashboard/dist/assets/{agent-logos-QSoXRwwJ.js → agent-logos-X7FQq7rz.js} +1 -1
- package/dashboard/dist/assets/{arrow-up-right-C3WUmTcI.js → arrow-up-right-CPxuidzy.js} +1 -1
- package/dashboard/dist/assets/{check-Gz5mnj6f.js → check-D2K19ObI.js} +1 -1
- package/dashboard/dist/assets/{composite-DJhoahpv.js → composite-BN1UKLj0.js} +1 -1
- package/dashboard/dist/assets/{copy-C5RiL5JQ.js → copy-CSN17qFv.js} +1 -1
- package/dashboard/dist/assets/{download-CccMGCc1.js → download-CpW-TB2h.js} +1 -1
- package/dashboard/dist/assets/{external-link-fdU7Lj6p.js → external-link-ChBchK6G.js} +1 -1
- package/dashboard/dist/assets/{flame-CYEjossP.js → flame-f7119ZMd.js} +1 -1
- package/dashboard/dist/assets/{format-tokens-xXCznLkf.js → format-tokens-COrRnk53.js} +1 -1
- package/dashboard/dist/assets/{icons-CYNYszil.js → icons-Dn9vA9Qu.js} +1 -1
- package/dashboard/dist/assets/{index-CQ5GHXiW.js → index-BCNOKYSO.js} +1 -1
- package/dashboard/dist/assets/{index-Czz7x_MZ.js → index-CA-94DFW.js} +1 -1
- package/dashboard/dist/assets/{index-Cgfb050k.js → index-CElyhNzh.js} +1 -1
- package/dashboard/dist/assets/{info-Zae50fSC.js → info-BHsPBczD.js} +1 -1
- package/dashboard/dist/assets/{link-2-DW_mHLzI.js → link-2-BHfEWv22.js} +1 -1
- package/dashboard/dist/assets/{loader-circle-Bl7dBXh1.js → loader-circle-DTIT1Uk1.js} +1 -1
- package/dashboard/dist/assets/{maximize-2-DTP25Fl_.js → maximize-2-BmtIBzLu.js} +1 -1
- package/dashboard/dist/assets/{modifiers.esm-CYXpOF3i.js → modifiers.esm-CPBla3OK.js} +1 -1
- package/dashboard/dist/assets/{monitor-smartphone--TLNLuLe.js → monitor-smartphone-CbsYB-S2.js} +1 -1
- package/dashboard/dist/assets/{plus-DgeFv3Xc.js → plus-CZiNoMsy.js} +1 -1
- package/dashboard/dist/assets/{provider-display-crAVn3qa.js → provider-display-CXKRt9q1.js} +2 -2
- package/dashboard/dist/assets/{react-QPulAuJP.js → react-CZdcuJ28.js} +1 -1
- package/dashboard/dist/assets/{search-DIUmGfar.js → search-q2ARMGca.js} +1 -1
- package/dashboard/dist/assets/{skills-api-09qiTRNb.js → skills-api-CIyqyk-w.js} +1 -1
- package/dashboard/dist/assets/skins-Mc0sI20C.js +1 -0
- package/dashboard/dist/assets/{sortable.esm-BbsbmOc2.js → sortable.esm-BztIEZTk.js} +1 -1
- package/dashboard/dist/assets/{store-DdyzwTsy.js → store-DvdXwk-7.js} +1 -1
- package/dashboard/dist/assets/{terminal-JpDnkjVA.js → terminal-CFQOW2Ey.js} +1 -1
- package/dashboard/dist/assets/{trash-CRsyysiP.js → trash-D0ptaWPk.js} +1 -1
- package/dashboard/dist/assets/{use-community-stats-D3PwUyvR.js → use-community-stats-DYibzhAl.js} +1 -1
- package/dashboard/dist/assets/{use-latest-request-guard-DTCniVRw.js → use-latest-request-guard-viIhH7H5.js} +1 -1
- package/dashboard/dist/assets/{use-limits-display-prefs-BbYcvoh_.js → use-limits-display-prefs-CbXApWU1.js} +1 -1
- package/dashboard/dist/assets/{use-ordered-list-ypqFhcs4.js → use-ordered-list-BBP8hr8y.js} +1 -1
- package/dashboard/dist/assets/use-pet-settings-CIrPZ9pB.js +2 -0
- package/dashboard/dist/assets/use-reduced-motion-Dpq-cKyM.js +1 -0
- package/dashboard/dist/assets/{use-session-efficiency-pref-C5BZmpkY.js → use-session-efficiency-pref-2Vb3tJrw.js} +1 -1
- package/dashboard/dist/assets/{use-transform-C3bGaC_U.js → use-transform-CECRFELz.js} +1 -1
- package/dashboard/dist/assets/use-usage-limits-DEnbjOVG.js +1 -0
- package/dashboard/dist/assets/{useCurrency-BianRgdW.js → useCurrency-Dh9pUzDO.js} +1 -1
- package/dashboard/dist/assets/useTokenFormat-CoGcVhPP.js +1 -0
- package/dashboard/dist/assets/{zap-BJTChg1t.js → zap-BdeAxq64.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 +3 -2
- package/src/commands/sync.js +57 -29
- package/src/lib/claude-categorizer.js +4 -7
- package/src/lib/claude-user-identity.js +56 -0
- package/src/lib/cursor-store.js +636 -57
- package/src/lib/grok-limits.js +17 -4
- package/src/lib/kimi-profile.js +61 -0
- package/src/lib/multi-install-parser.js +3 -1
- package/src/lib/pricing/seed-snapshot.json +1 -1
- package/src/lib/rollout.js +91 -39
- package/src/lib/usage-limits.js +128 -79
- package/dashboard/dist/assets/BotAnimated-4hWTFjwp.js +0 -1
- package/dashboard/dist/assets/ClawdAnimated-BRoihVSd.js +0 -2
- package/dashboard/dist/assets/Controls-BvWTXyfI.js +0 -1
- package/dashboard/dist/assets/DashboardPage--1_GuEr-.js +0 -1
- package/dashboard/dist/assets/DialogDescription-DE2BF-HX.js +0 -1
- package/dashboard/dist/assets/PetPage-D2oqJ05F.js +0 -1
- package/dashboard/dist/assets/SettingsPage-DbUDye5r.js +0 -2
- package/dashboard/dist/assets/TrendMonitor-BH6Jx8nS.js +0 -19
- package/dashboard/dist/assets/__vite-browser-external-Bg0J-a5P.css +0 -1
- package/dashboard/dist/assets/__vite-browser-external-VmN0WaC3.js +0 -45
- package/dashboard/dist/assets/skins-C8EyB85e.js +0 -1
- package/dashboard/dist/assets/use-reduced-motion-Cdn1VrG0.js +0 -1
- package/dashboard/dist/assets/use-usage-limits-BRLNaZEv.js +0 -1
- package/dashboard/dist/assets/useTokenFormat-DO4vxqhW.js +0 -1
package/src/lib/grok-limits.js
CHANGED
|
@@ -644,15 +644,28 @@ async function fetchGrokBilling(
|
|
|
644
644
|
headers,
|
|
645
645
|
deadlineMs,
|
|
646
646
|
);
|
|
647
|
-
if (creditsResult.ok)
|
|
648
|
-
|
|
647
|
+
if (creditsResult.ok) {
|
|
648
|
+
// Keep the unified pool even when its fields are malformed. The caller
|
|
649
|
+
// must surface its parse error rather than substitute a legacy pool.
|
|
650
|
+
if (creditsResult.body?.config?.currentPeriod) return creditsResult.body;
|
|
651
|
+
try {
|
|
652
|
+
// Only a response without a unified period is eligible for shape
|
|
653
|
+
// fallback; a parseable legacy response can already be used as-is.
|
|
654
|
+
normalizeGrokBillingResponse(creditsResult.body);
|
|
655
|
+
return creditsResult.body;
|
|
656
|
+
} catch (error) {
|
|
657
|
+
creditsFailure = `unrecognized response (${error?.message || "invalid billing data"})`;
|
|
658
|
+
}
|
|
659
|
+
} else {
|
|
660
|
+
creditsFailure = `HTTP ${creditsResult.status}`;
|
|
661
|
+
}
|
|
649
662
|
} catch (error) {
|
|
650
663
|
if (error?.code === "GROK_AUTH_REQUIRED") throw error;
|
|
651
664
|
if (error?.code === "GROK_BILLING_TIMEOUT") throw error;
|
|
652
665
|
}
|
|
653
666
|
|
|
654
|
-
// Non-auth HTTP, network,
|
|
655
|
-
// shape once, while sharing the original request deadline.
|
|
667
|
+
// Non-auth HTTP, network, response-decoding, or shape failure → try the
|
|
668
|
+
// legacy shape once, while sharing the original request deadline.
|
|
656
669
|
let legacyResult;
|
|
657
670
|
try {
|
|
658
671
|
legacyResult = await fetchGrokBillingAttempt(
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
const fs = require("node:fs");
|
|
4
|
+
const os = require("node:os");
|
|
5
|
+
const path = require("node:path");
|
|
6
|
+
const { parse } = require("smol-toml");
|
|
7
|
+
const { expandHome } = require("./scan-roots");
|
|
8
|
+
|
|
9
|
+
const MAINLAND = { oauthHost: "https://auth.kimi.com", baseUrl: "https://api.kimi.com/coding/v1" };
|
|
10
|
+
const GLOBAL = { oauthHost: "https://auth.kimi.ai", baseUrl: "https://api.kimi.ai/coding/v1" };
|
|
11
|
+
|
|
12
|
+
function endpoint(value, fallback) {
|
|
13
|
+
return typeof value === "string" ? value.trim().replace(/\/+$/, "") : fallback;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
// The two supported official endpoint pairs have stable upstream credential
|
|
17
|
+
// slots. The global suffix is SHA-256(JSON.stringify({ oauthHost, baseUrl }))
|
|
18
|
+
// truncated to 16 hex characters, matching managed-kimi-code.ts. Keeping the
|
|
19
|
+
// filenames constant also prevents remote configuration from shaping paths.
|
|
20
|
+
function credentialKey(oauthHost, baseUrl) {
|
|
21
|
+
return oauthHost === GLOBAL.oauthHost && baseUrl === GLOBAL.baseUrl
|
|
22
|
+
? "kimi-code-env-0e4f99c69cc27850" : "kimi-code";
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function resolveKimiProfile({ home, env = process.env } = {}) {
|
|
26
|
+
const base = home || os.homedir();
|
|
27
|
+
const explicit = expandHome(env?.KIMI_HOME, base);
|
|
28
|
+
const explicitCode = expandHome(env?.KIMI_CODE_HOME, base);
|
|
29
|
+
const codeHome = explicit || explicitCode || path.join(base, ".kimi-code");
|
|
30
|
+
const codeConfig = path.join(codeHome, "config.toml");
|
|
31
|
+
let provider = null;
|
|
32
|
+
let error = null;
|
|
33
|
+
if (fs.existsSync(codeConfig)) {
|
|
34
|
+
try {
|
|
35
|
+
provider = parse(fs.readFileSync(codeConfig, "utf8"))?.providers?.["managed:kimi-code"] || null;
|
|
36
|
+
} catch {
|
|
37
|
+
error = "Could not parse Kimi Code config.toml";
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
let hasCodeLogin = false;
|
|
41
|
+
try {
|
|
42
|
+
hasCodeLogin = Boolean(JSON.parse(fs.readFileSync(path.join(codeHome, "credentials", "kimi-code.json"), "utf8"))?.access_token);
|
|
43
|
+
} catch { /* No default-slot login. */ }
|
|
44
|
+
const hasEnvOverride = env?.KIMI_CODE_BASE_URL != null || env?.KIMI_CODE_OAUTH_HOST != null || env?.KIMI_OAUTH_HOST != null;
|
|
45
|
+
const kimiHome = explicit || explicitCode || provider || error || hasCodeLogin || hasEnvOverride
|
|
46
|
+
? codeHome : path.join(base, ".kimi");
|
|
47
|
+
const oauthHost = endpoint(hasEnvOverride ? env?.KIMI_CODE_OAUTH_HOST ?? env?.KIMI_OAUTH_HOST : provider?.oauth?.oauth_host, MAINLAND.oauthHost);
|
|
48
|
+
const baseUrl = endpoint(env?.KIMI_CODE_BASE_URL ?? provider?.base_url, MAINLAND.baseUrl);
|
|
49
|
+
if (![MAINLAND, GLOBAL].some((region) => region.oauthHost === oauthHost && region.baseUrl === baseUrl)) {
|
|
50
|
+
error = "Unsupported Kimi quota endpoints; configure a matching official mainland or global profile";
|
|
51
|
+
}
|
|
52
|
+
if (provider?.oauth?.storage && provider.oauth.storage !== "file") {
|
|
53
|
+
error = "Kimi quota supports file credentials; the configured credential storage is unsupported";
|
|
54
|
+
}
|
|
55
|
+
// Derive the endpoint-scoped slot, just as upstream does when a stored key
|
|
56
|
+
// mismatches the endpoints. Never read an unrelated slot or legacy login.
|
|
57
|
+
const credsPath = path.join(kimiHome, "credentials", `${credentialKey(oauthHost, baseUrl)}.json`);
|
|
58
|
+
return { home: kimiHome, credsPath, oauthHost, baseUrl, error, configured: fs.existsSync(path.join(kimiHome, "config.toml")) };
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
module.exports = { resolveKimiProfile };
|
|
@@ -47,7 +47,9 @@ async function multiInstallParse({ paths, parserFn, providerName, cursors, getPa
|
|
|
47
47
|
eventsAggregated += result.eventsAggregated || 0;
|
|
48
48
|
bucketsQueued += result.bucketsQueued || 0;
|
|
49
49
|
} catch (parseErr) {
|
|
50
|
-
|
|
50
|
+
if (parseErr?.code !== "TOKENTRACKER_CURSOR_STORE_RETRY") {
|
|
51
|
+
cursors[providerName] = ns;
|
|
52
|
+
}
|
|
51
53
|
throw parseErr;
|
|
52
54
|
}
|
|
53
55
|
}
|