tokentracker-cli 0.84.6 → 0.84.7
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 +10 -8
- package/README.ja.md +9 -7
- package/README.ko.md +9 -7
- package/README.md +12 -10
- package/README.zh-CN.md +9 -7
- package/dashboard/dist/assets/{AchievementBadge-CKIvD3lG.js → AchievementBadge-DAPsTMsx.js} +1 -1
- package/dashboard/dist/assets/{AchievementsPage-CZWCUiS5.js → AchievementsPage-B9oXfXvm.js} +2 -2
- package/dashboard/dist/assets/{AchievementsSection-BSk_fR8P.js → AchievementsSection-DI_LTZb3.js} +1 -1
- package/dashboard/dist/assets/{BadgeDetailModal-CjHkcmuq.js → BadgeDetailModal--WCrJWVa.js} +1 -1
- package/dashboard/dist/assets/Card-BzbSN3EC.js +1 -0
- package/dashboard/dist/assets/{ClawdAnimated-Cl6gmF7u.js → ClawdAnimated-Dgxae1At.js} +1 -1
- package/dashboard/dist/assets/{CommandPalette-B0rcodcF.js → CommandPalette-BiZBYV5A.js} +1 -1
- package/dashboard/dist/assets/{CommunityStatsModal-BtlTJbf4.js → CommunityStatsModal-C6jZx10_.js} +1 -1
- package/dashboard/dist/assets/{ConfirmModal-tJCWVZQH.js → ConfirmModal-lD-mHMvO.js} +1 -1
- package/dashboard/dist/assets/{DashboardPage-Dtxq8dzI.js → DashboardPage-DCPNoiRG.js} +1 -1
- package/dashboard/dist/assets/{DevicePage-9USuEsRu.js → DevicePage-DiF2IOjJ.js} +1 -1
- package/dashboard/dist/assets/{DialogClose-DxHdqMcl.js → DialogClose-Crx2EFnI.js} +1 -1
- package/dashboard/dist/assets/DialogDescription-CHsHo924.js +1 -0
- package/dashboard/dist/assets/{DialogTitle-C1ZeQgf2.js → DialogTitle-amHXttsp.js} +1 -1
- package/dashboard/dist/assets/{FadeIn-Cx4jLl9G.js → FadeIn-CIhF_9PP.js} +1 -1
- package/dashboard/dist/assets/{HeaderGithubStar-BOyuGkoA.js → HeaderGithubStar-D6Ph2GuY.js} +1 -1
- package/dashboard/dist/assets/{HoverTooltip-BDhqMR3L.js → HoverTooltip-BS8eO6tj.js} +1 -1
- package/dashboard/dist/assets/{IpCheckPage-DTvA9Wmx.js → IpCheckPage-Cz1Je6WS.js} +1 -1
- package/dashboard/dist/assets/LandingPage-DqeXJfwn.js +2 -0
- package/dashboard/dist/assets/{LeaderboardAvatar-3ibNg6If.js → LeaderboardAvatar-D09yLoVA.js} +1 -1
- package/dashboard/dist/assets/LeaderboardPage-BetpFetS.js +2 -0
- package/dashboard/dist/assets/{LeaderboardProfileModal-DeGbJtvi.js → LeaderboardProfileModal-UW3KnANZ.js} +4 -4
- package/dashboard/dist/assets/{LeaderboardProfilePage-DEPzO6hW.js → LeaderboardProfilePage-Chd_2AVY.js} +1 -1
- package/dashboard/dist/assets/LimitsPage-uhpNteXJ.js +4 -0
- package/dashboard/dist/assets/{LocalOnlyNotice-C76LAT_3.js → LocalOnlyNotice-CpFFX8ro.js} +1 -1
- package/dashboard/dist/assets/{LoginCard-DEyCJT67.js → LoginCard-DkZpGnVu.js} +1 -1
- package/dashboard/dist/assets/{LoginModal-CueMQgAZ.js → LoginModal-CALv6jkD.js} +1 -1
- package/dashboard/dist/assets/{LoginPage-CwqBb5Fd.js → LoginPage-BZuXHYAT.js} +1 -1
- package/dashboard/dist/assets/PetPage-C1LuDyYr.js +1 -0
- package/dashboard/dist/assets/{PopoverPopup-Dt9VY2VQ.js → PopoverPopup-CluVhrMr.js} +1 -1
- package/dashboard/dist/assets/{ProviderIcon-CHx4ohfx.js → ProviderIcon-D3YKjVKb.js} +1 -1
- package/dashboard/dist/assets/{ResetPasswordPage-DB6R7fjf.js → ResetPasswordPage-CzN50nX5.js} +1 -1
- package/dashboard/dist/assets/{SegmentedControl-BINOpXIY.js → SegmentedControl-DFOAcEKU.js} +1 -1
- package/dashboard/dist/assets/{Select-DcYXcsKv.js → Select-B3W_ihs_.js} +1 -1
- package/dashboard/dist/assets/{SelectItemText-BDv2Kb3x.js → SelectItemText-FXRtXnFV.js} +1 -1
- package/dashboard/dist/assets/ServiceStatusPage-BItZqH7q.js +1 -0
- package/dashboard/dist/assets/{SessionsPage-cL_w0ytB.js → SessionsPage-DVQU-hTH.js} +2 -2
- package/dashboard/dist/assets/SettingsPage-ByvrwOi6.js +1 -0
- package/dashboard/dist/assets/SkillsPage-DrGr5Qij.js +1 -0
- package/dashboard/dist/assets/{TokenGalaxy-BHq4YSv2.js → TokenGalaxy-ClF_n9od.js} +1 -1
- package/dashboard/dist/assets/{ToolbarRootContext-akXaaKb6.js → ToolbarRootContext-B82hGhAf.js} +1 -1
- package/dashboard/dist/assets/{TrendMonitor-DPhFXzQc.js → TrendMonitor-DkWm7_1z.js} +1 -1
- package/dashboard/dist/assets/{WidgetsPage-Nf0UEz7s.js → WidgetsPage-DCY4pyR2.js} +1 -1
- package/dashboard/dist/assets/{WrappedPage-D4zOSsqD.js → WrappedPage-yGQ4DLqj.js} +1 -1
- package/dashboard/dist/assets/__vite-browser-external-BdRrPLk6.js +1483 -0
- package/dashboard/dist/assets/__vite-browser-external-hXV_ZYTG.css +1 -0
- package/dashboard/dist/assets/{agent-logos-Bja3VCAa.js → agent-logos-D5SHGOxB.js} +1 -1
- package/dashboard/dist/assets/{arrow-up-right-CzcCNJJ2.js → arrow-up-right-CbMcAcss.js} +1 -1
- package/dashboard/dist/assets/{check-DUHSZCYn.js → check-Dyzh7lTz.js} +1 -1
- package/dashboard/dist/assets/{chevron-right-jLvhaNUy.js → chevron-right-DT06ZIKC.js} +1 -1
- package/dashboard/dist/assets/{copy-ChyH-ynx.js → copy-B3Kt3Wrf.js} +1 -1
- package/dashboard/dist/assets/{download-CgwvXrUe.js → download-B3rOytqI.js} +1 -1
- package/dashboard/dist/assets/external-link-BamTP0Ks.js +1 -0
- package/dashboard/dist/assets/{flame-ysf1F8uB.js → flame-msy2h1ms.js} +1 -1
- package/dashboard/dist/assets/{format-tokens-DAa2cubl.js → format-tokens-8b1OUM_8.js} +1 -1
- package/dashboard/dist/assets/{icons-DccoWQq9.js → icons-C2NR2_Tf.js} +1 -1
- package/dashboard/dist/assets/{index-kkQrDRat.js → index-C8sDJzUY.js} +1 -1
- package/dashboard/dist/assets/{index-CxExExXh.js → index-CvTfpiCF.js} +1 -1
- package/dashboard/dist/assets/{index-CAycNPQf.js → index-x3vFJQFt.js} +1 -1
- package/dashboard/dist/assets/{info-DWQQIq9M.js → info-C9j23aGq.js} +1 -1
- package/dashboard/dist/assets/limits-providers-ySB9Ci5l.js +1 -0
- package/dashboard/dist/assets/{link-2-CKeVVq4P.js → link-2-rrcyTT6S.js} +1 -1
- package/dashboard/dist/assets/{loader-circle-Dw0tu6IN.js → loader-circle-x9x9I8Hv.js} +1 -1
- package/dashboard/dist/assets/{maximize-2-BMU0YzEF.js → maximize-2-7TWFb2k7.js} +1 -1
- package/dashboard/dist/assets/{provider-display-Cf9I-VLS.js → provider-display-JbSwpvxU.js} +1 -1
- package/dashboard/dist/assets/{react-BhbcISKy.js → react-DK5clHtY.js} +1 -1
- package/dashboard/dist/assets/{search-BoY8EW1z.js → search-DukXRvEV.js} +1 -1
- package/dashboard/dist/assets/{skills-api-KVH21GJw.js → skills-api-BUFJuwiR.js} +1 -1
- package/dashboard/dist/assets/{store-BL7rSajG.js → store-BTh7bv09.js} +1 -1
- package/dashboard/dist/assets/{terminal-CeMuITdm.js → terminal-CcUqLtn1.js} +1 -1
- package/dashboard/dist/assets/{trash-2-jVUCKqrR.js → trash-2-Bq7hnvNq.js} +1 -1
- package/dashboard/dist/assets/{use-community-stats-uWK0fE6l.js → use-community-stats-qTpx6ugG.js} +1 -1
- package/dashboard/dist/assets/{use-limits-display-prefs-DWsF4ShM.js → use-limits-display-prefs-Di_J4eVv.js} +1 -1
- package/dashboard/dist/assets/{use-native-settings-SEbqWDvc.js → use-native-settings-CIqpv9Z3.js} +1 -1
- package/dashboard/dist/assets/{use-ordered-list-D4UhrPvw.js → use-ordered-list-OwogSXT7.js} +1 -1
- package/dashboard/dist/assets/use-reduced-motion-5QGGPoom.js +1 -0
- package/dashboard/dist/assets/{use-session-efficiency-pref-DbysyUTJ.js → use-session-efficiency-pref-CjAvMh7u.js} +1 -1
- package/dashboard/dist/assets/{use-transform-DaEssGaZ.js → use-transform-KZLdt-NZ.js} +1 -1
- package/dashboard/dist/assets/{use-usage-limits-CmmQ34Ov.js → use-usage-limits-Tbifa037.js} +1 -1
- package/dashboard/dist/assets/{useCurrency-DvBEn4rx.js → useCurrency-D2td-bkn.js} +1 -1
- package/dashboard/dist/assets/{useScrollLock-QozsdFng.js → useScrollLock-Cvyfyezc.js} +1 -1
- package/dashboard/dist/assets/useTokenFormat-DYIUS6IH.js +1 -0
- package/dashboard/dist/assets/{zap-Dp_aJ1q6.js → zap-B19mEed5.js} +1 -1
- package/dashboard/dist/brand-logos/qoder.svg +5 -0
- package/dashboard/dist/index.html +18 -15
- package/dashboard/dist/ip-check.html +2 -2
- package/dashboard/dist/leaderboard.html +2 -2
- package/dashboard/dist/llms.txt +3 -2
- package/dashboard/dist/share.html +2 -2
- package/package.json +2 -2
- package/src/commands/init.js +1 -0
- package/src/commands/status.js +17 -0
- package/src/commands/sync.js +146 -126
- package/src/lib/local-api.js +4 -1
- package/src/lib/pet-packages.js +44 -2
- package/src/lib/pricing/seed-snapshot.json +1 -1
- package/src/lib/provider-status.js +104 -0
- package/src/lib/qoder-limits.js +985 -0
- package/src/lib/rollout.js +385 -0
- package/src/lib/usage-limits.js +32 -2
- package/dashboard/dist/assets/Card-D6hdzwvI.js +0 -1
- package/dashboard/dist/assets/DialogDescription-DgUSe6A1.js +0 -1
- package/dashboard/dist/assets/LandingPage-k1271lWV.js +0 -2
- package/dashboard/dist/assets/LeaderboardPage-Byww5UpT.js +0 -2
- package/dashboard/dist/assets/LimitsPage-DPtqL0PS.js +0 -4
- package/dashboard/dist/assets/PetPage--xQAjW4_.js +0 -1
- package/dashboard/dist/assets/SettingsPage-CHGA0bQS.js +0 -1
- package/dashboard/dist/assets/SkillsPage-I29SqkXO.js +0 -1
- package/dashboard/dist/assets/__vite-browser-external-UqlSqI-1.js +0 -1465
- package/dashboard/dist/assets/__vite-browser-external-WKilYZnq.css +0 -1
- package/dashboard/dist/assets/limits-providers-B_18X9Rp.js +0 -1
- package/dashboard/dist/assets/use-reduced-motion-C3UrOh55.js +0 -1
- package/dashboard/dist/assets/useTokenFormat-BTLrL7Mi.js +0 -1
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
// Provider service-status probes (Statuspage.io-style), CodexBar-inspired.
|
|
2
|
+
//
|
|
3
|
+
// Answers "is the provider itself down?" so the limits panel can explain
|
|
4
|
+
// upstream failures instead of leaving users guessing (issue: users read a
|
|
5
|
+
// red/stale Claude limits row as a TokenTracker bug during Anthropic
|
|
6
|
+
// incidents). Fail-soft by design: a probe failure never breaks the limits
|
|
7
|
+
// response — callers get the last good reading or null, never a throw.
|
|
8
|
+
//
|
|
9
|
+
// Statuspage.io contract (`/api/v2/status.json`):
|
|
10
|
+
// { "page": { "updated_at": ISO }, "status": { "indicator": "none|minor|major|critical", "description": "..." } }
|
|
11
|
+
|
|
12
|
+
const STATUS_PROBE_TIMEOUT_MS = 6_000;
|
|
13
|
+
// Status pages change on incident timescales; 5 minutes keeps the limits
|
|
14
|
+
// poll (2-min TTL upstream) from hammering statuspage.io every cycle.
|
|
15
|
+
const STATUS_CACHE_TTL_MS = 5 * 60 * 1000;
|
|
16
|
+
// Serve a stale last-good reading for up to 30 minutes when probes fail, so a
|
|
17
|
+
// transient network blip doesn't flap the incident row on and off.
|
|
18
|
+
const STATUS_LAST_GOOD_MAX_AGE_MS = 30 * 60 * 1000;
|
|
19
|
+
|
|
20
|
+
const STATUS_PAGE_SPECS = {
|
|
21
|
+
claude: {
|
|
22
|
+
// status.anthropic.com 302-redirects here; use the canonical host directly.
|
|
23
|
+
apiUrl: "https://status.claude.com/api/v2/status.json",
|
|
24
|
+
pageUrl: "https://status.claude.com",
|
|
25
|
+
},
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
const VALID_INDICATORS = new Set(["none", "minor", "major", "critical"]);
|
|
29
|
+
|
|
30
|
+
// providerId -> { data, fetchedAtMs } (data may be null after a failed probe
|
|
31
|
+
// with no last-good to fall back on).
|
|
32
|
+
let statusCache = new Map();
|
|
33
|
+
|
|
34
|
+
function normalizeStatusPayload(payload, spec, nowMs) {
|
|
35
|
+
const indicator = payload?.status?.indicator;
|
|
36
|
+
if (typeof indicator !== "string" || !VALID_INDICATORS.has(indicator)) return null;
|
|
37
|
+
const description = typeof payload?.status?.description === "string"
|
|
38
|
+
? payload.status.description.trim()
|
|
39
|
+
: "";
|
|
40
|
+
const updatedAt = typeof payload?.page?.updated_at === "string" && payload.page.updated_at
|
|
41
|
+
? payload.page.updated_at
|
|
42
|
+
: new Date(nowMs).toISOString();
|
|
43
|
+
return {
|
|
44
|
+
indicator,
|
|
45
|
+
description: description || null,
|
|
46
|
+
updated_at: updatedAt,
|
|
47
|
+
url: spec.pageUrl,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Fetch a provider's public service status. Never throws; returns
|
|
53
|
+
* `{ indicator, description, updated_at, url }` or null when the provider has
|
|
54
|
+
* no status page, the probe fails with no usable last-good reading, or the
|
|
55
|
+
* payload is malformed.
|
|
56
|
+
*/
|
|
57
|
+
async function fetchProviderServiceStatus(providerId, { fetchImpl = fetch, nowMs = Date.now() } = {}) {
|
|
58
|
+
const spec = STATUS_PAGE_SPECS[providerId];
|
|
59
|
+
if (!spec) return null;
|
|
60
|
+
|
|
61
|
+
const cached = statusCache.get(providerId);
|
|
62
|
+
if (cached && nowMs - cached.fetchedAtMs < STATUS_CACHE_TTL_MS) {
|
|
63
|
+
return cached.data;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
let data = null;
|
|
67
|
+
try {
|
|
68
|
+
const controller = new AbortController();
|
|
69
|
+
const timer = setTimeout(() => controller.abort(), STATUS_PROBE_TIMEOUT_MS);
|
|
70
|
+
try {
|
|
71
|
+
const res = await fetchImpl(spec.apiUrl, {
|
|
72
|
+
method: "GET",
|
|
73
|
+
headers: { Accept: "application/json" },
|
|
74
|
+
signal: controller.signal,
|
|
75
|
+
});
|
|
76
|
+
if (res.ok) {
|
|
77
|
+
data = normalizeStatusPayload(await res.json(), spec, nowMs);
|
|
78
|
+
}
|
|
79
|
+
} finally {
|
|
80
|
+
clearTimeout(timer);
|
|
81
|
+
}
|
|
82
|
+
} catch (_error) {
|
|
83
|
+
// fall through to last-good handling below
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
if (!data && cached?.data && nowMs - cached.fetchedAtMs < STATUS_LAST_GOOD_MAX_AGE_MS) {
|
|
87
|
+
// Probe failed: keep serving the previous reading (without refreshing its
|
|
88
|
+
// clock, so a dead status page eventually ages out to null).
|
|
89
|
+
return cached.data;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
statusCache.set(providerId, { data, fetchedAtMs: nowMs });
|
|
93
|
+
return data;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
function resetProviderStatusCache() {
|
|
97
|
+
statusCache = new Map();
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
module.exports = {
|
|
101
|
+
fetchProviderServiceStatus,
|
|
102
|
+
resetProviderStatusCache,
|
|
103
|
+
STATUS_PAGE_SPECS,
|
|
104
|
+
};
|