tokentracker-cli 0.88.7 → 0.88.8

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 (109) hide show
  1. package/README.de.md +4 -4
  2. package/README.ja.md +3 -3
  3. package/README.ko.md +3 -3
  4. package/README.md +6 -5
  5. package/README.zh-CN.md +5 -4
  6. package/dashboard/dist/assets/{AchievementBadge-m7oaBLpH.js → AchievementBadge-CzfK_8kl.js} +1 -1
  7. package/dashboard/dist/assets/{AchievementsPage-BHHh4VjM.js → AchievementsPage-PVft5lyI.js} +2 -2
  8. package/dashboard/dist/assets/{AchievementsSection-CGLNe_1p.js → AchievementsSection-DyzHGzys.js} +1 -1
  9. package/dashboard/dist/assets/{BadgeDetailModal-v1DGF6EM.js → BadgeDetailModal-CFsRpXG1.js} +1 -1
  10. package/dashboard/dist/assets/{Card-C16SqIR8.js → Card-Bi9dmQTP.js} +1 -1
  11. package/dashboard/dist/assets/{ClawdAnimated-Bj3ptLJv.js → ClawdAnimated-BxcZjV9b.js} +1 -1
  12. package/dashboard/dist/assets/{CommandPalette-BaegDLAM.js → CommandPalette-DHVK5yTu.js} +1 -1
  13. package/dashboard/dist/assets/{CommunityStatsModal-CThxVFG0.js → CommunityStatsModal-BmMh7Avp.js} +1 -1
  14. package/dashboard/dist/assets/{ConfirmModal-C0sP3Ktk.js → ConfirmModal-BjTQXMg4.js} +1 -1
  15. package/dashboard/dist/assets/{Controls-C8usK6RW.js → Controls-CZUbEggT.js} +1 -1
  16. package/dashboard/dist/assets/DashboardPage-C3x4Hew6.js +1 -0
  17. package/dashboard/dist/assets/{DevicePage-Cu4qqRcB.js → DevicePage-1qf6aiEH.js} +1 -1
  18. package/dashboard/dist/assets/{DialogClose-DVo3jJb6.js → DialogClose-CRrlkVf0.js} +1 -1
  19. package/dashboard/dist/assets/DialogDescription-tD0gEESM.js +1 -0
  20. package/dashboard/dist/assets/{DialogTitle-C1UOMgTZ.js → DialogTitle-DhGyZ0Ue.js} +1 -1
  21. package/dashboard/dist/assets/{FadeIn-CuQlQrvO.js → FadeIn-M8ECNbPG.js} +1 -1
  22. package/dashboard/dist/assets/{HeaderGithubStar-BTt2612H.js → HeaderGithubStar-BKtQc1Si.js} +1 -1
  23. package/dashboard/dist/assets/{HoverTooltip-CHdLolcf.js → HoverTooltip-Bo1zVtke.js} +1 -1
  24. package/dashboard/dist/assets/{IpCheckPage-BFz8hr_3.js → IpCheckPage-B78HcgA1.js} +1 -1
  25. package/dashboard/dist/assets/{LandingPage-CTyNSAYl.js → LandingPage-DSlanH3Y.js} +2 -2
  26. package/dashboard/dist/assets/{LeaderboardAvatar-CBdOXZWk.js → LeaderboardAvatar-Cs4IYwTC.js} +1 -1
  27. package/dashboard/dist/assets/{LeaderboardPage-DStx51Bj.js → LeaderboardPage-DXlo-PNE.js} +2 -2
  28. package/dashboard/dist/assets/{LeaderboardProfileModal-CtxgJR07.js → LeaderboardProfileModal-CVM6FjLt.js} +3 -3
  29. package/dashboard/dist/assets/{LeaderboardProfilePage-DrpsHTdZ.js → LeaderboardProfilePage-BO-MTMcH.js} +1 -1
  30. package/dashboard/dist/assets/{LimitsPage-m_itA-7d.js → LimitsPage-BohIYn9J.js} +1 -1
  31. package/dashboard/dist/assets/{LocalOnlyNotice-A62wFwYT.js → LocalOnlyNotice-BQ7eYwB8.js} +1 -1
  32. package/dashboard/dist/assets/{LoginCard-DFJugNa-.js → LoginCard-DhOJyCcc.js} +1 -1
  33. package/dashboard/dist/assets/{LoginModal-DF4BOwS6.js → LoginModal-Dfo2DSA9.js} +1 -1
  34. package/dashboard/dist/assets/{LoginPage-BxFhfitr.js → LoginPage-CN-cXdsD.js} +1 -1
  35. package/dashboard/dist/assets/{PetPage-l4fkRsf1.js → PetPage-CQY2YUNm.js} +1 -1
  36. package/dashboard/dist/assets/{PopoverPopup-y-OAHy4v.js → PopoverPopup-D0bYgqkq.js} +1 -1
  37. package/dashboard/dist/assets/{ProviderIcon-DwoPHz27.js → ProviderIcon-BfiriW8d.js} +1 -1
  38. package/dashboard/dist/assets/{ResetPasswordPage-CCDj94rl.js → ResetPasswordPage-CQyX1BF6.js} +1 -1
  39. package/dashboard/dist/assets/{SegmentedControl-lEKPzZlV.js → SegmentedControl-DWhf_XGR.js} +1 -1
  40. package/dashboard/dist/assets/{Select-DoyUBoxn.js → Select-Dy6krqIZ.js} +1 -1
  41. package/dashboard/dist/assets/{SelectItemText-K8Vzn1Dd.js → SelectItemText-D1296h92.js} +1 -1
  42. package/dashboard/dist/assets/{ServiceStatusPage-Cqyo7OtW.js → ServiceStatusPage-BgC3i1y-.js} +1 -1
  43. package/dashboard/dist/assets/{SessionsPage-BELC-8aJ.js → SessionsPage-Dyq0Q8tm.js} +1 -1
  44. package/dashboard/dist/assets/{SettingsPage-C6Og4tMS.js → SettingsPage-QCZksfny.js} +1 -1
  45. package/dashboard/dist/assets/{SkillsPage-BKKgpXc_.js → SkillsPage-BUWMr2_o.js} +1 -1
  46. package/dashboard/dist/assets/{TokenGalaxy-DoSCQSpY.js → TokenGalaxy-BHauFZfa.js} +1 -1
  47. package/dashboard/dist/assets/{ToolbarRootContext-GoQP9LXi.js → ToolbarRootContext-1sViYfay.js} +1 -1
  48. package/dashboard/dist/assets/{TrendMonitor-BHE1KkJ7.js → TrendMonitor-DM26Zn7d.js} +1 -1
  49. package/dashboard/dist/assets/{WidgetsPage-CHBzNb19.js → WidgetsPage-DhjPczRN.js} +1 -1
  50. package/dashboard/dist/assets/{WrappedPage-CW_kqVoY.js → WrappedPage-BsEFzfrx.js} +1 -1
  51. package/dashboard/dist/assets/{__vite-browser-external-BgeLzJ0q.js → __vite-browser-external-BW4ueyBB.js} +6 -3
  52. package/dashboard/dist/assets/agent-logos-IRTgTlkV.js +1 -0
  53. package/dashboard/dist/assets/{arrow-up-right-5GGSSEKW.js → arrow-up-right-BapNuXPQ.js} +1 -1
  54. package/dashboard/dist/assets/{check-g6Fq4TSB.js → check-lpIv67Hh.js} +1 -1
  55. package/dashboard/dist/assets/{chevron-right-DjPuavEP.js → chevron-right-jYAPg2OX.js} +1 -1
  56. package/dashboard/dist/assets/{copy-BAMl60zT.js → copy-CEdsXYF2.js} +1 -1
  57. package/dashboard/dist/assets/{download-BQPhL4h5.js → download-CGJA0mZj.js} +1 -1
  58. package/dashboard/dist/assets/{external-link-CU3XKMbZ.js → external-link-DTmmieCB.js} +1 -1
  59. package/dashboard/dist/assets/{flame-B85YY_rB.js → flame-C-orSEmd.js} +1 -1
  60. package/dashboard/dist/assets/{format-tokens-DDxlnhNV.js → format-tokens-BQuK3UBV.js} +1 -1
  61. package/dashboard/dist/assets/{icons-D1e1TWTe.js → icons-DuVOMXCd.js} +1 -1
  62. package/dashboard/dist/assets/{index-CWMkVmon.js → index-5hluBV6Y.js} +1 -1
  63. package/dashboard/dist/assets/{index-BZ2hkHKk.js → index-CKG-dDk-.js} +1 -1
  64. package/dashboard/dist/assets/{index-sQl-P7u5.js → index-DvLGX2GN.js} +1 -1
  65. package/dashboard/dist/assets/{info-DlSYpCFm.js → info-EKHZ3tlo.js} +1 -1
  66. package/dashboard/dist/assets/{limits-providers-DS5EIbJK.js → limits-providers-DgnwvabV.js} +1 -1
  67. package/dashboard/dist/assets/{link-2-DbEVoNk-.js → link-2-A2f7492I.js} +1 -1
  68. package/dashboard/dist/assets/{loader-circle-CqmzGIX-.js → loader-circle-DiBM_0cy.js} +1 -1
  69. package/dashboard/dist/assets/{maximize-2-Ce8X8kHQ.js → maximize-2-CmJrrSbJ.js} +1 -1
  70. package/dashboard/dist/assets/{modifiers.esm-BQNRpVcA.js → modifiers.esm-v5P5znue.js} +1 -1
  71. package/dashboard/dist/assets/{monitor-smartphone-8drugZmh.js → monitor-smartphone-jmB0EaLx.js} +1 -1
  72. package/dashboard/dist/assets/{provider-display-BayTojFu.js → provider-display-BJXN_8Ft.js} +2 -2
  73. package/dashboard/dist/assets/{react-BfgySeLu.js → react-DRhZt4b6.js} +1 -1
  74. package/dashboard/dist/assets/{search-BkGUxlXI.js → search-D9j_51N0.js} +1 -1
  75. package/dashboard/dist/assets/{skills-api-D80JxFc1.js → skills-api-Dywy4E7M.js} +1 -1
  76. package/dashboard/dist/assets/{sortable.esm-SjRQ4Ehw.js → sortable.esm-BYYlH2M3.js} +1 -1
  77. package/dashboard/dist/assets/{store-B3WkWBgn.js → store-Dt6GNo2E.js} +1 -1
  78. package/dashboard/dist/assets/{terminal-CIvEvMau.js → terminal-BfWjr1gW.js} +1 -1
  79. package/dashboard/dist/assets/{trash-2-BZclE0mU.js → trash-2-Ceal5Y6z.js} +1 -1
  80. package/dashboard/dist/assets/{use-community-stats-ChaFzJoW.js → use-community-stats-2G4i1ZwJ.js} +1 -1
  81. package/dashboard/dist/assets/{use-limits-display-prefs-2LALdqvT.js → use-limits-display-prefs--qpfQM72.js} +1 -1
  82. package/dashboard/dist/assets/{use-ordered-list-10Nmxw1I.js → use-ordered-list-BRg8W35v.js} +1 -1
  83. package/dashboard/dist/assets/use-reduced-motion-BDYfqZDy.js +1 -0
  84. package/dashboard/dist/assets/{use-session-efficiency-pref-CqPK4jX1.js → use-session-efficiency-pref-DHwJtj_8.js} +1 -1
  85. package/dashboard/dist/assets/{use-transform-s6og1tg9.js → use-transform-DaIhV0Zy.js} +1 -1
  86. package/dashboard/dist/assets/{use-usage-limits-jyRJ_kl9.js → use-usage-limits-COggDJdz.js} +1 -1
  87. package/dashboard/dist/assets/{useCurrency-hZfdhfqK.js → useCurrency-0g-kQuZf.js} +1 -1
  88. package/dashboard/dist/assets/{useScrollLock-DFF4vpw2.js → useScrollLock-CMMjcyJf.js} +1 -1
  89. package/dashboard/dist/assets/{useTokenFormat-DaVdoRvh.js → useTokenFormat-BuVZXkVC.js} +1 -1
  90. package/dashboard/dist/assets/{zap-B1XMdyCV.js → zap-BhYCdFZP.js} +1 -1
  91. package/dashboard/dist/brand-logos/reasonix.png +0 -0
  92. package/dashboard/dist/index.html +9 -9
  93. package/dashboard/dist/ip-check.html +1 -1
  94. package/dashboard/dist/leaderboard.html +1 -1
  95. package/dashboard/dist/llms.txt +3 -2
  96. package/dashboard/dist/share.html +1 -1
  97. package/package.json +2 -2
  98. package/src/commands/init.js +10 -0
  99. package/src/commands/status.js +27 -5
  100. package/src/commands/sync.js +177 -5
  101. package/src/lib/install-resolver.js +35 -0
  102. package/src/lib/pricing/seed-snapshot.json +1 -1
  103. package/src/lib/rollout.js +768 -0
  104. package/src/lib/subscriptions.js +1 -0
  105. package/src/lib/usage-limits.js +17 -2
  106. package/dashboard/dist/assets/DashboardPage-DbzbT_cY.js +0 -1
  107. package/dashboard/dist/assets/DialogDescription-zf3KGPP3.js +0 -1
  108. package/dashboard/dist/assets/agent-logos-BWeWRlms.js +0 -1
  109. package/dashboard/dist/assets/use-reduced-motion-J12KnTgP.js +0 -1
@@ -446,6 +446,7 @@ async function readCodexAuthBundle({ home, env } = {}) {
446
446
 
447
447
  module.exports = {
448
448
  collectLocalSubscriptions,
449
+ detectClaudeCodeCredentialsPresence,
449
450
  detectClaudeCodeSubscriptionDetails,
450
451
  readClaudeCodeAccessToken,
451
452
  readCodexAccessToken,
@@ -9,6 +9,7 @@ const { performance } = require("node:perf_hooks");
9
9
  const { promisify } = require("node:util");
10
10
 
11
11
  const {
12
+ detectClaudeCodeCredentialsPresence,
12
13
  detectClaudeCodeSubscriptionDetails,
13
14
  readClaudeCodeAccessToken,
14
15
  readCodexAccessToken,
@@ -188,6 +189,10 @@ function extractClaudeScopedWeekly(body) {
188
189
  return out.length > 0 ? out : null;
189
190
  }
190
191
 
192
+ // Shared by the 401 path below and by the blank-credential path in getUsageLimits:
193
+ // both mean "the CLI login no longer works", and both are fixed the same way.
194
+ const CLAUDE_AUTH_EXPIRED_MESSAGE = "Claude token expired — run `claude` once to refresh.";
195
+
191
196
  async function fetchClaudeUsageLimits(accessToken, { fetchImpl = fetch, maxAttempts = 3 } = {}) {
192
197
  const url = "https://api.anthropic.com/api/oauth/usage";
193
198
  const headers = {
@@ -198,7 +203,7 @@ async function fetchClaudeUsageLimits(accessToken, { fetchImpl = fetch, maxAttem
198
203
  for (let attempt = 0; attempt < maxAttempts; attempt++) {
199
204
  const res = await fetchImpl(url, { method: "GET", headers });
200
205
  if (res.status === 401) {
201
- const err = new Error("Claude token expired — run `claude` once to refresh.");
206
+ const err = new Error(CLAUDE_AUTH_EXPIRED_MESSAGE);
202
207
  err.code = "AUTH_EXPIRED";
203
208
  throw err;
204
209
  }
@@ -3243,7 +3248,17 @@ async function fetchUsageLimitsUncached({
3243
3248
 
3244
3249
  let claude;
3245
3250
  if (!claudeToken) {
3246
- claude = { configured: false };
3251
+ // Claude Code blanks `accessToken`/`refreshToken` in place when its login expires
3252
+ // (macOS Keychain item and .credentials.json alike) instead of removing the entry,
3253
+ // so "no token" is ambiguous: never signed in, or signed in and expired. An entry
3254
+ // that still exists means the latter — reporting `configured: false` there hides the
3255
+ // whole Claude section while the usage bars (parsed from local logs, no auth needed)
3256
+ // keep updating, which reads as "TokenTracker doesn't support my plan" rather than
3257
+ // "your CLI login expired". Existence-only probe: no secret is read here.
3258
+ const credentialsPresent = detectClaudeCodeCredentialsPresence({ platform, securityRunner, home });
3259
+ claude = credentialsPresent
3260
+ ? { configured: true, error: CLAUDE_AUTH_EXPIRED_MESSAGE, auth_action_required: "reauth" }
3261
+ : { configured: false };
3247
3262
  } else if (freshClaudeCache) {
3248
3263
  claude = freshClaudeCache;
3249
3264
  } else if (claudeResult && claudeResult.status === "fulfilled") {