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.
Files changed (118) hide show
  1. package/README.de.md +10 -8
  2. package/README.ja.md +9 -7
  3. package/README.ko.md +9 -7
  4. package/README.md +12 -10
  5. package/README.zh-CN.md +9 -7
  6. package/dashboard/dist/assets/{AchievementBadge-CKIvD3lG.js → AchievementBadge-DAPsTMsx.js} +1 -1
  7. package/dashboard/dist/assets/{AchievementsPage-CZWCUiS5.js → AchievementsPage-B9oXfXvm.js} +2 -2
  8. package/dashboard/dist/assets/{AchievementsSection-BSk_fR8P.js → AchievementsSection-DI_LTZb3.js} +1 -1
  9. package/dashboard/dist/assets/{BadgeDetailModal-CjHkcmuq.js → BadgeDetailModal--WCrJWVa.js} +1 -1
  10. package/dashboard/dist/assets/Card-BzbSN3EC.js +1 -0
  11. package/dashboard/dist/assets/{ClawdAnimated-Cl6gmF7u.js → ClawdAnimated-Dgxae1At.js} +1 -1
  12. package/dashboard/dist/assets/{CommandPalette-B0rcodcF.js → CommandPalette-BiZBYV5A.js} +1 -1
  13. package/dashboard/dist/assets/{CommunityStatsModal-BtlTJbf4.js → CommunityStatsModal-C6jZx10_.js} +1 -1
  14. package/dashboard/dist/assets/{ConfirmModal-tJCWVZQH.js → ConfirmModal-lD-mHMvO.js} +1 -1
  15. package/dashboard/dist/assets/{DashboardPage-Dtxq8dzI.js → DashboardPage-DCPNoiRG.js} +1 -1
  16. package/dashboard/dist/assets/{DevicePage-9USuEsRu.js → DevicePage-DiF2IOjJ.js} +1 -1
  17. package/dashboard/dist/assets/{DialogClose-DxHdqMcl.js → DialogClose-Crx2EFnI.js} +1 -1
  18. package/dashboard/dist/assets/DialogDescription-CHsHo924.js +1 -0
  19. package/dashboard/dist/assets/{DialogTitle-C1ZeQgf2.js → DialogTitle-amHXttsp.js} +1 -1
  20. package/dashboard/dist/assets/{FadeIn-Cx4jLl9G.js → FadeIn-CIhF_9PP.js} +1 -1
  21. package/dashboard/dist/assets/{HeaderGithubStar-BOyuGkoA.js → HeaderGithubStar-D6Ph2GuY.js} +1 -1
  22. package/dashboard/dist/assets/{HoverTooltip-BDhqMR3L.js → HoverTooltip-BS8eO6tj.js} +1 -1
  23. package/dashboard/dist/assets/{IpCheckPage-DTvA9Wmx.js → IpCheckPage-Cz1Je6WS.js} +1 -1
  24. package/dashboard/dist/assets/LandingPage-DqeXJfwn.js +2 -0
  25. package/dashboard/dist/assets/{LeaderboardAvatar-3ibNg6If.js → LeaderboardAvatar-D09yLoVA.js} +1 -1
  26. package/dashboard/dist/assets/LeaderboardPage-BetpFetS.js +2 -0
  27. package/dashboard/dist/assets/{LeaderboardProfileModal-DeGbJtvi.js → LeaderboardProfileModal-UW3KnANZ.js} +4 -4
  28. package/dashboard/dist/assets/{LeaderboardProfilePage-DEPzO6hW.js → LeaderboardProfilePage-Chd_2AVY.js} +1 -1
  29. package/dashboard/dist/assets/LimitsPage-uhpNteXJ.js +4 -0
  30. package/dashboard/dist/assets/{LocalOnlyNotice-C76LAT_3.js → LocalOnlyNotice-CpFFX8ro.js} +1 -1
  31. package/dashboard/dist/assets/{LoginCard-DEyCJT67.js → LoginCard-DkZpGnVu.js} +1 -1
  32. package/dashboard/dist/assets/{LoginModal-CueMQgAZ.js → LoginModal-CALv6jkD.js} +1 -1
  33. package/dashboard/dist/assets/{LoginPage-CwqBb5Fd.js → LoginPage-BZuXHYAT.js} +1 -1
  34. package/dashboard/dist/assets/PetPage-C1LuDyYr.js +1 -0
  35. package/dashboard/dist/assets/{PopoverPopup-Dt9VY2VQ.js → PopoverPopup-CluVhrMr.js} +1 -1
  36. package/dashboard/dist/assets/{ProviderIcon-CHx4ohfx.js → ProviderIcon-D3YKjVKb.js} +1 -1
  37. package/dashboard/dist/assets/{ResetPasswordPage-DB6R7fjf.js → ResetPasswordPage-CzN50nX5.js} +1 -1
  38. package/dashboard/dist/assets/{SegmentedControl-BINOpXIY.js → SegmentedControl-DFOAcEKU.js} +1 -1
  39. package/dashboard/dist/assets/{Select-DcYXcsKv.js → Select-B3W_ihs_.js} +1 -1
  40. package/dashboard/dist/assets/{SelectItemText-BDv2Kb3x.js → SelectItemText-FXRtXnFV.js} +1 -1
  41. package/dashboard/dist/assets/ServiceStatusPage-BItZqH7q.js +1 -0
  42. package/dashboard/dist/assets/{SessionsPage-cL_w0ytB.js → SessionsPage-DVQU-hTH.js} +2 -2
  43. package/dashboard/dist/assets/SettingsPage-ByvrwOi6.js +1 -0
  44. package/dashboard/dist/assets/SkillsPage-DrGr5Qij.js +1 -0
  45. package/dashboard/dist/assets/{TokenGalaxy-BHq4YSv2.js → TokenGalaxy-ClF_n9od.js} +1 -1
  46. package/dashboard/dist/assets/{ToolbarRootContext-akXaaKb6.js → ToolbarRootContext-B82hGhAf.js} +1 -1
  47. package/dashboard/dist/assets/{TrendMonitor-DPhFXzQc.js → TrendMonitor-DkWm7_1z.js} +1 -1
  48. package/dashboard/dist/assets/{WidgetsPage-Nf0UEz7s.js → WidgetsPage-DCY4pyR2.js} +1 -1
  49. package/dashboard/dist/assets/{WrappedPage-D4zOSsqD.js → WrappedPage-yGQ4DLqj.js} +1 -1
  50. package/dashboard/dist/assets/__vite-browser-external-BdRrPLk6.js +1483 -0
  51. package/dashboard/dist/assets/__vite-browser-external-hXV_ZYTG.css +1 -0
  52. package/dashboard/dist/assets/{agent-logos-Bja3VCAa.js → agent-logos-D5SHGOxB.js} +1 -1
  53. package/dashboard/dist/assets/{arrow-up-right-CzcCNJJ2.js → arrow-up-right-CbMcAcss.js} +1 -1
  54. package/dashboard/dist/assets/{check-DUHSZCYn.js → check-Dyzh7lTz.js} +1 -1
  55. package/dashboard/dist/assets/{chevron-right-jLvhaNUy.js → chevron-right-DT06ZIKC.js} +1 -1
  56. package/dashboard/dist/assets/{copy-ChyH-ynx.js → copy-B3Kt3Wrf.js} +1 -1
  57. package/dashboard/dist/assets/{download-CgwvXrUe.js → download-B3rOytqI.js} +1 -1
  58. package/dashboard/dist/assets/external-link-BamTP0Ks.js +1 -0
  59. package/dashboard/dist/assets/{flame-ysf1F8uB.js → flame-msy2h1ms.js} +1 -1
  60. package/dashboard/dist/assets/{format-tokens-DAa2cubl.js → format-tokens-8b1OUM_8.js} +1 -1
  61. package/dashboard/dist/assets/{icons-DccoWQq9.js → icons-C2NR2_Tf.js} +1 -1
  62. package/dashboard/dist/assets/{index-kkQrDRat.js → index-C8sDJzUY.js} +1 -1
  63. package/dashboard/dist/assets/{index-CxExExXh.js → index-CvTfpiCF.js} +1 -1
  64. package/dashboard/dist/assets/{index-CAycNPQf.js → index-x3vFJQFt.js} +1 -1
  65. package/dashboard/dist/assets/{info-DWQQIq9M.js → info-C9j23aGq.js} +1 -1
  66. package/dashboard/dist/assets/limits-providers-ySB9Ci5l.js +1 -0
  67. package/dashboard/dist/assets/{link-2-CKeVVq4P.js → link-2-rrcyTT6S.js} +1 -1
  68. package/dashboard/dist/assets/{loader-circle-Dw0tu6IN.js → loader-circle-x9x9I8Hv.js} +1 -1
  69. package/dashboard/dist/assets/{maximize-2-BMU0YzEF.js → maximize-2-7TWFb2k7.js} +1 -1
  70. package/dashboard/dist/assets/{provider-display-Cf9I-VLS.js → provider-display-JbSwpvxU.js} +1 -1
  71. package/dashboard/dist/assets/{react-BhbcISKy.js → react-DK5clHtY.js} +1 -1
  72. package/dashboard/dist/assets/{search-BoY8EW1z.js → search-DukXRvEV.js} +1 -1
  73. package/dashboard/dist/assets/{skills-api-KVH21GJw.js → skills-api-BUFJuwiR.js} +1 -1
  74. package/dashboard/dist/assets/{store-BL7rSajG.js → store-BTh7bv09.js} +1 -1
  75. package/dashboard/dist/assets/{terminal-CeMuITdm.js → terminal-CcUqLtn1.js} +1 -1
  76. package/dashboard/dist/assets/{trash-2-jVUCKqrR.js → trash-2-Bq7hnvNq.js} +1 -1
  77. package/dashboard/dist/assets/{use-community-stats-uWK0fE6l.js → use-community-stats-qTpx6ugG.js} +1 -1
  78. package/dashboard/dist/assets/{use-limits-display-prefs-DWsF4ShM.js → use-limits-display-prefs-Di_J4eVv.js} +1 -1
  79. package/dashboard/dist/assets/{use-native-settings-SEbqWDvc.js → use-native-settings-CIqpv9Z3.js} +1 -1
  80. package/dashboard/dist/assets/{use-ordered-list-D4UhrPvw.js → use-ordered-list-OwogSXT7.js} +1 -1
  81. package/dashboard/dist/assets/use-reduced-motion-5QGGPoom.js +1 -0
  82. package/dashboard/dist/assets/{use-session-efficiency-pref-DbysyUTJ.js → use-session-efficiency-pref-CjAvMh7u.js} +1 -1
  83. package/dashboard/dist/assets/{use-transform-DaEssGaZ.js → use-transform-KZLdt-NZ.js} +1 -1
  84. package/dashboard/dist/assets/{use-usage-limits-CmmQ34Ov.js → use-usage-limits-Tbifa037.js} +1 -1
  85. package/dashboard/dist/assets/{useCurrency-DvBEn4rx.js → useCurrency-D2td-bkn.js} +1 -1
  86. package/dashboard/dist/assets/{useScrollLock-QozsdFng.js → useScrollLock-Cvyfyezc.js} +1 -1
  87. package/dashboard/dist/assets/useTokenFormat-DYIUS6IH.js +1 -0
  88. package/dashboard/dist/assets/{zap-Dp_aJ1q6.js → zap-B19mEed5.js} +1 -1
  89. package/dashboard/dist/brand-logos/qoder.svg +5 -0
  90. package/dashboard/dist/index.html +18 -15
  91. package/dashboard/dist/ip-check.html +2 -2
  92. package/dashboard/dist/leaderboard.html +2 -2
  93. package/dashboard/dist/llms.txt +3 -2
  94. package/dashboard/dist/share.html +2 -2
  95. package/package.json +2 -2
  96. package/src/commands/init.js +1 -0
  97. package/src/commands/status.js +17 -0
  98. package/src/commands/sync.js +146 -126
  99. package/src/lib/local-api.js +4 -1
  100. package/src/lib/pet-packages.js +44 -2
  101. package/src/lib/pricing/seed-snapshot.json +1 -1
  102. package/src/lib/provider-status.js +104 -0
  103. package/src/lib/qoder-limits.js +985 -0
  104. package/src/lib/rollout.js +385 -0
  105. package/src/lib/usage-limits.js +32 -2
  106. package/dashboard/dist/assets/Card-D6hdzwvI.js +0 -1
  107. package/dashboard/dist/assets/DialogDescription-DgUSe6A1.js +0 -1
  108. package/dashboard/dist/assets/LandingPage-k1271lWV.js +0 -2
  109. package/dashboard/dist/assets/LeaderboardPage-Byww5UpT.js +0 -2
  110. package/dashboard/dist/assets/LimitsPage-DPtqL0PS.js +0 -4
  111. package/dashboard/dist/assets/PetPage--xQAjW4_.js +0 -1
  112. package/dashboard/dist/assets/SettingsPage-CHGA0bQS.js +0 -1
  113. package/dashboard/dist/assets/SkillsPage-I29SqkXO.js +0 -1
  114. package/dashboard/dist/assets/__vite-browser-external-UqlSqI-1.js +0 -1465
  115. package/dashboard/dist/assets/__vite-browser-external-WKilYZnq.css +0 -1
  116. package/dashboard/dist/assets/limits-providers-B_18X9Rp.js +0 -1
  117. package/dashboard/dist/assets/use-reduced-motion-C3UrOh55.js +0 -1
  118. 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
+ };