tokentracker-cli 0.91.3 → 0.93.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.
Files changed (112) hide show
  1. package/README.de.md +7 -4
  2. package/README.ja.md +6 -3
  3. package/README.ko.md +6 -3
  4. package/README.md +8 -5
  5. package/README.zh-CN.md +6 -3
  6. package/dashboard/dist/assets/{AchievementBadge-LHOuekQ3.js → AchievementBadge-BJRW8Tr1.js} +1 -1
  7. package/dashboard/dist/assets/{AchievementsPage-DNzeYWBl.js → AchievementsPage-ChEJSRiQ.js} +2 -2
  8. package/dashboard/dist/assets/{AchievementsSection-Ch5dImt8.js → AchievementsSection-CUaUhyL6.js} +1 -1
  9. package/dashboard/dist/assets/{BadgeDetailModal-CuikWkUy.js → BadgeDetailModal-CN7MTGyp.js} +1 -1
  10. package/dashboard/dist/assets/BotAnimated-Dr4FOdii.js +1 -0
  11. package/dashboard/dist/assets/{Card-Chwjmxjz.js → Card-DMxCaW9y.js} +1 -1
  12. package/dashboard/dist/assets/ClawdAnimated-DpscEjzV.js +2 -0
  13. package/dashboard/dist/assets/{CommandPalette-BMwuSEWM.js → CommandPalette-CQGglOYQ.js} +1 -1
  14. package/dashboard/dist/assets/{CommunityStatsModal-eEDF-xn8.js → CommunityStatsModal-Venaet7m.js} +1 -1
  15. package/dashboard/dist/assets/{ConfirmModal-Be7f6XdL.js → ConfirmModal-BHoo6GZs.js} +1 -1
  16. package/dashboard/dist/assets/{Controls-CtBFPCBY.js → Controls-CaNOFGCk.js} +1 -1
  17. package/dashboard/dist/assets/{DashboardPage-M0p-SU-f.js → DashboardPage-Dw0RrlPj.js} +1 -1
  18. package/dashboard/dist/assets/{DevicePage-CAfcUond.js → DevicePage-21SUMJc6.js} +1 -1
  19. package/dashboard/dist/assets/{DialogClose-kd1wIljN.js → DialogClose-DnSGAKIz.js} +1 -1
  20. package/dashboard/dist/assets/DialogDescription-DyaMB47K.js +1 -0
  21. package/dashboard/dist/assets/{DialogTitle-DhB-tbnZ.js → DialogTitle-CiPqqI8_.js} +1 -1
  22. package/dashboard/dist/assets/{FadeIn-B8eRWBdy.js → FadeIn-Dfc9sjiG.js} +1 -1
  23. package/dashboard/dist/assets/{HeaderGithubStar-DmWep8uP.js → HeaderGithubStar-DXxjTnOW.js} +1 -1
  24. package/dashboard/dist/assets/{HoverTooltip-DDyTZli0.js → HoverTooltip-DjR_uW9N.js} +1 -1
  25. package/dashboard/dist/assets/{IpCheckPage-CN8hYm4o.js → IpCheckPage-CUoutDvP.js} +1 -1
  26. package/dashboard/dist/assets/{LandingPage-B3cHASqK.js → LandingPage-CFlAug6D.js} +2 -2
  27. package/dashboard/dist/assets/{LeaderboardAvatar-CEcLXrJL.js → LeaderboardAvatar-CYoNgJ16.js} +1 -1
  28. package/dashboard/dist/assets/{LeaderboardPage-H6HW9hon.js → LeaderboardPage-S9BvOGn-.js} +2 -2
  29. package/dashboard/dist/assets/{LeaderboardProfileModal-B_5PyjRA.js → LeaderboardProfileModal-D5Fd1T4y.js} +4 -4
  30. package/dashboard/dist/assets/{LeaderboardProfilePage-DR9KWLWv.js → LeaderboardProfilePage-DQ9OnTBZ.js} +1 -1
  31. package/dashboard/dist/assets/LimitsPage-CkW9RNDs.js +5 -0
  32. package/dashboard/dist/assets/{LocalOnlyNotice-DuTdva_n.js → LocalOnlyNotice-BC236cdv.js} +1 -1
  33. package/dashboard/dist/assets/{LoginCard-DOL3osrj.js → LoginCard-CKePPmoP.js} +1 -1
  34. package/dashboard/dist/assets/{LoginModal-DBmaQL2L.js → LoginModal-Z6HTE1rD.js} +1 -1
  35. package/dashboard/dist/assets/{LoginPage-Dk08VrkC.js → LoginPage-oCM0aV5_.js} +1 -1
  36. package/dashboard/dist/assets/PetPage-2vhNPBD2.js +1 -0
  37. package/dashboard/dist/assets/{PopoverPopup-C1fJZ4qt.js → PopoverPopup-BWZpTgX_.js} +1 -1
  38. package/dashboard/dist/assets/{ProviderIcon-FfLD-f73.js → ProviderIcon-DzpcY7dM.js} +1 -1
  39. package/dashboard/dist/assets/{ResetPasswordPage-Bg7eVc6L.js → ResetPasswordPage-CDXZRCcV.js} +1 -1
  40. package/dashboard/dist/assets/{SegmentedControl-CFNHcUz7.js → SegmentedControl-DTUalF_Q.js} +1 -1
  41. package/dashboard/dist/assets/{Select-B0Q0eDcJ.js → Select-Bh-c5WZM.js} +1 -1
  42. package/dashboard/dist/assets/{SelectItemText-BVbLYxSQ.js → SelectItemText-D7ecykkn.js} +1 -1
  43. package/dashboard/dist/assets/{ServiceStatusPage-DCZH2kz5.js → ServiceStatusPage-B-3Nj7Yw.js} +1 -1
  44. package/dashboard/dist/assets/{SessionsPage-DO5Et7ss.js → SessionsPage-C4XeRHCn.js} +1 -1
  45. package/dashboard/dist/assets/{SettingsPage-afgxGfzT.js → SettingsPage-B-2tu3Gx.js} +2 -2
  46. package/dashboard/dist/assets/{SkillsPage-DDKiHCF7.js → SkillsPage-CIjJkI3G.js} +1 -1
  47. package/dashboard/dist/assets/{TokenGalaxy-DV1Xoe5z.js → TokenGalaxy-CmhqWAxg.js} +1 -1
  48. package/dashboard/dist/assets/{ToolbarRootContext-DNckd9Qz.js → ToolbarRootContext-beEFe6Jn.js} +1 -1
  49. package/dashboard/dist/assets/{TrendMonitor-CliMJxCC.js → TrendMonitor-DUenZHaf.js} +1 -1
  50. package/dashboard/dist/assets/{WidgetsPage-BrwG6YMM.js → WidgetsPage-C5f1GlXu.js} +1 -1
  51. package/dashboard/dist/assets/{WrappedPage-Ft9YJd0D.js → WrappedPage-CbV2-x-X.js} +1 -1
  52. package/dashboard/dist/assets/{__vite-browser-external-C6_BtvDo.js → __vite-browser-external-BE7h4Ou0.js} +19 -10
  53. package/dashboard/dist/assets/__vite-browser-external-CiR9-j4L.css +1 -0
  54. package/dashboard/dist/assets/{agent-logos-yYNu1ZUy.js → agent-logos-ChlriZKC.js} +1 -1
  55. package/dashboard/dist/assets/{arrow-up-right-B_K57Vbg.js → arrow-up-right-CXeIA60k.js} +1 -1
  56. package/dashboard/dist/assets/{check-xH63o2xJ.js → check-B_20gPQX.js} +1 -1
  57. package/dashboard/dist/assets/{chevron-right-D3F2rAfr.js → chevron-right-CQCceB2r.js} +1 -1
  58. package/dashboard/dist/assets/{copy-WPfJGGI0.js → copy-Ba1Oh3iI.js} +1 -1
  59. package/dashboard/dist/assets/{download-BgtWtEXI.js → download-B5EQJQ9n.js} +1 -1
  60. package/dashboard/dist/assets/{external-link-DSHGoZRM.js → external-link-D9GSJ4tn.js} +1 -1
  61. package/dashboard/dist/assets/{flame-CNGl6Qac.js → flame-PKC57o-h.js} +1 -1
  62. package/dashboard/dist/assets/{format-tokens-jVm2UX7Y.js → format-tokens-E_eZCw2b.js} +1 -1
  63. package/dashboard/dist/assets/{icons-B1JZg-Id.js → icons-DXrj24F-.js} +1 -1
  64. package/dashboard/dist/assets/{index-CUFHknAy.js → index-CPbjzYzk.js} +1 -1
  65. package/dashboard/dist/assets/{index-BjD81Qce.js → index-ldDiPXbH.js} +1 -1
  66. package/dashboard/dist/assets/{index-BTZibjLi.js → index-pSCG6bXN.js} +1 -1
  67. package/dashboard/dist/assets/{info-CLM460KM.js → info-Dhj9LcZm.js} +1 -1
  68. package/dashboard/dist/assets/{limits-providers-CFO4O1qh.js → limits-providers-BWOIsV_O.js} +1 -1
  69. package/dashboard/dist/assets/{link-2-BHOsUnAI.js → link-2-Bbzo_bnV.js} +1 -1
  70. package/dashboard/dist/assets/{loader-circle-CgcIQi92.js → loader-circle-CfkDmJbH.js} +1 -1
  71. package/dashboard/dist/assets/{maximize-2-DvqfuJEA.js → maximize-2-BQkNBiZ-.js} +1 -1
  72. package/dashboard/dist/assets/{modifiers.esm-CNiwIkPh.js → modifiers.esm-BhhAKBAH.js} +1 -1
  73. package/dashboard/dist/assets/{monitor-smartphone-BLutpxrG.js → monitor-smartphone-BO4o9Fi6.js} +1 -1
  74. package/dashboard/dist/assets/{provider-display-BxIgWUEa.js → provider-display-DnMOck0l.js} +2 -2
  75. package/dashboard/dist/assets/{react-CM-ozVnh.js → react-DoVntgJI.js} +1 -1
  76. package/dashboard/dist/assets/{search-4T07INKt.js → search-CQOHSZGo.js} +1 -1
  77. package/dashboard/dist/assets/{skills-api-EXMD3LD1.js → skills-api-DldHXWSv.js} +1 -1
  78. package/dashboard/dist/assets/skins-C8EyB85e.js +1 -0
  79. package/dashboard/dist/assets/{sortable.esm-jC6mPJiL.js → sortable.esm-l0p6v-ts.js} +1 -1
  80. package/dashboard/dist/assets/{store-CvSEdgf2.js → store-D9UN_t1a.js} +1 -1
  81. package/dashboard/dist/assets/{terminal-D9fyE2pP.js → terminal-Cvwjd-k9.js} +1 -1
  82. package/dashboard/dist/assets/{trash-2-QLUsAY3l.js → trash-2-b2Z7B317.js} +1 -1
  83. package/dashboard/dist/assets/{use-community-stats-Chrt3kpU.js → use-community-stats-DDhp2Qat.js} +1 -1
  84. package/dashboard/dist/assets/{use-limits-display-prefs-BJJd750e.js → use-limits-display-prefs-Cqtye4Ji.js} +1 -1
  85. package/dashboard/dist/assets/{use-ordered-list-BBJp5lFv.js → use-ordered-list-CLogKuZq.js} +1 -1
  86. package/dashboard/dist/assets/use-reduced-motion-CkoMrH9Y.js +1 -0
  87. package/dashboard/dist/assets/{use-session-efficiency-pref-BXbvx2Ht.js → use-session-efficiency-pref-mSDx6-SO.js} +1 -1
  88. package/dashboard/dist/assets/{use-transform-BVp_MUsU.js → use-transform-Bt5K4W-2.js} +1 -1
  89. package/dashboard/dist/assets/{use-usage-limits-Dk3EkeIs.js → use-usage-limits-Cm2Bjsp0.js} +1 -1
  90. package/dashboard/dist/assets/{useCurrency-Bi88Sd__.js → useCurrency-DyJG5xmN.js} +1 -1
  91. package/dashboard/dist/assets/{useScrollLock-if34g2H-.js → useScrollLock-BEpIOp1F.js} +1 -1
  92. package/dashboard/dist/assets/{useTokenFormat-C2cz-5qJ.js → useTokenFormat-Cbj7RbpO.js} +1 -1
  93. package/dashboard/dist/assets/{zap-D1yHmcQR.js → zap-CUYx_JsZ.js} +1 -1
  94. package/dashboard/dist/brand-logos/dots.png +0 -0
  95. package/dashboard/dist/brand-logos/pi.svg +8 -15
  96. package/dashboard/dist/index.html +31 -28
  97. package/dashboard/dist/ip-check.html +2 -2
  98. package/dashboard/dist/leaderboard.html +2 -2
  99. package/dashboard/dist/llms.txt +3 -2
  100. package/dashboard/dist/share.html +2 -2
  101. package/package.json +5 -3
  102. package/src/commands/init.js +1 -0
  103. package/src/lib/opencode-go-limits.js +33 -15
  104. package/src/lib/pet-packages.js +45 -1
  105. package/src/lib/pricing/index.js +17 -0
  106. package/src/lib/pricing/seed-snapshot.json +1 -1
  107. package/dashboard/dist/assets/ClawdAnimated-BdB7aycS.js +0 -1
  108. package/dashboard/dist/assets/DialogDescription-CjJLpfCL.js +0 -1
  109. package/dashboard/dist/assets/LimitsPage-Da0hRxO_.js +0 -5
  110. package/dashboard/dist/assets/PetPage-BbCIdpzx.js +0 -1
  111. package/dashboard/dist/assets/__vite-browser-external-CRYifSM4.css +0 -1
  112. package/dashboard/dist/assets/use-reduced-motion-BvXZCGFC.js +0 -1
@@ -123,7 +123,7 @@
123
123
  "price": "0",
124
124
  "priceCurrency": "USD"
125
125
  },
126
- "description": "Local-first AI coding usage tracker for 33 tools, with a desktop pet, four widgets, achievements, native macOS and Windows apps, accurate cross-provider deduplication, and no prompt collection."
126
+ "description": "Local-first AI coding usage tracker for 34 tools, with a desktop pet, four widgets, achievements, native macOS and Windows apps, accurate cross-provider deduplication, and no prompt collection."
127
127
  },
128
128
  {
129
129
  "@type": "WebSite",
@@ -181,22 +181,23 @@
181
181
  { "@type": "ListItem", "position": 15, "name": "Grok Build" },
182
182
  { "@type": "ListItem", "position": 16, "name": "oh-my-pi" },
183
183
  { "@type": "ListItem", "position": 17, "name": "pi" },
184
- { "@type": "ListItem", "position": 18, "name": "Prime Agent" },
185
- { "@type": "ListItem", "position": 19, "name": "Craft Agents" },
186
- { "@type": "ListItem", "position": 20, "name": "Reasonix" },
187
- { "@type": "ListItem", "position": 21, "name": "Kilo CLI" },
188
- { "@type": "ListItem", "position": 22, "name": "Kilo Code" },
189
- { "@type": "ListItem", "position": 23, "name": "Roo Code" },
190
- { "@type": "ListItem", "position": 24, "name": "Zed Agent" },
191
- { "@type": "ListItem", "position": 25, "name": "Goose" },
192
- { "@type": "ListItem", "position": 26, "name": "Droid" },
193
- { "@type": "ListItem", "position": 27, "name": "Mimo Code" },
194
- { "@type": "ListItem", "position": 28, "name": "ZCode" },
195
- { "@type": "ListItem", "position": 29, "name": "Qoder" },
196
- { "@type": "ListItem", "position": 30, "name": "AnythingLLM Desktop" },
197
- { "@type": "ListItem", "position": 31, "name": "Claude Science" },
198
- { "@type": "ListItem", "position": 32, "name": "DeepSeek Harness" }
199
- { "@type": "ListItem", "position": 33, "name": "TRAE Work CN" }
184
+ { "@type": "ListItem", "position": 18, "name": "Dots" },
185
+ { "@type": "ListItem", "position": 19, "name": "Prime Agent" },
186
+ { "@type": "ListItem", "position": 20, "name": "Craft Agents" },
187
+ { "@type": "ListItem", "position": 21, "name": "Reasonix" },
188
+ { "@type": "ListItem", "position": 22, "name": "Kilo CLI" },
189
+ { "@type": "ListItem", "position": 23, "name": "Kilo Code" },
190
+ { "@type": "ListItem", "position": 24, "name": "Roo Code" },
191
+ { "@type": "ListItem", "position": 25, "name": "Zed Agent" },
192
+ { "@type": "ListItem", "position": 26, "name": "Goose" },
193
+ { "@type": "ListItem", "position": 27, "name": "Droid" },
194
+ { "@type": "ListItem", "position": 28, "name": "Mimo Code" },
195
+ { "@type": "ListItem", "position": 29, "name": "ZCode" },
196
+ { "@type": "ListItem", "position": 30, "name": "Qoder" },
197
+ { "@type": "ListItem", "position": 31, "name": "AnythingLLM Desktop" },
198
+ { "@type": "ListItem", "position": 32, "name": "Claude Science" },
199
+ { "@type": "ListItem", "position": 33, "name": "DeepSeek Harness" },
200
+ { "@type": "ListItem", "position": 34, "name": "TRAE Work CN" }
200
201
  ]
201
202
  },
202
203
  {
@@ -211,10 +212,11 @@
211
212
  }
212
213
  },
213
214
  {
214
- "@type": "Quest "name": "Which AI coding CLIs does Token Tracker support?",
215
+ "@type": "Question",
216
+ "name": "Which AI coding CLIs does Token Tracker support?",
215
217
  "acceptedAnswer": {
216
218
  "@type": "Answer",
217
- "text": "Token Tracker supports 33 AI coding tools, including Claude Code, Codex CLI, Cursor, Gemini CLI, Antigravity, Kiro, OpenCode, OpenClaw, Every Code, Hermes Agent, GitHub Copilot, Kimi Code, CodeBuddy, WorkBuddy, Grok Build, oh-my-pi, pi, Prime Agent, Craft Agents, Reasonix, Kilo CLI, Kilo Code, Roo Code, Zed Agent, Goose, Droid, Mimo Code, ZCode, Qoder, AnythingLLM Desktop, Claude Science, DeepSeek Harness, and TRAE Work CN."
219
+ "text": "Token Tracker supports 34 AI coding tools, including Claude Code, Codex CLI, Cursor, Gemini CLI, Antigravity, Kiro, OpenCode, OpenClaw, Every Code, Hermes Agent, GitHub Copilot, Kimi Code, CodeBuddy, WorkBuddy, Grok Build, oh-my-pi, pi, Dots, Prime Agent, Craft Agents, Reasonix, Kilo CLI, Kilo Code, Roo Code, Zed Agent, Goose, Droid, Mimo Code, ZCode, Qoder, AnythingLLM Desktop, Claude Science, DeepSeek Harness, and TRAE Work CN."
218
220
  }
219
221
  },
220
222
  {
@@ -246,7 +248,7 @@
246
248
  "name": "How do I monitor AI token usage and cost across tools?",
247
249
  "acceptedAnswer": {
248
250
  "@type": "Answer",
249
- "text": "Install Token Tracker with npx tokentracker-cli. It is an AI token usage and cost tracker that monitors token consumption and spend across all 33 supported tools in one dashboard, with per-model pricing across 2,200+ models so you can see cost by model, project, and time window without manual tracking."
251
+ "text": "Install Token Tracker with npx tokentracker-cli. It is an AI token usage and cost tracker that monitors token consumption and spend across all 34 supported tools in one dashboard, with per-model pricing across 2,200+ models so you can see cost by model, project, and time window without manual tracking."
250
252
  }
251
253
  },
252
254
  {
@@ -262,15 +264,15 @@
262
264
  ]
263
265
  }
264
266
  </script>
265
- <script type="module" crossorigin src="/assets/__vite-browser-external-C6_BtvDo.js"></script>
266
- <link rel="stylesheet" crossorigin href="/assets/__vite-browser-external-CRYifSM4.css">
267
+ <script type="module" crossorigin src="/assets/__vite-browser-external-BE7h4Ou0.js"></script>
268
+ <link rel="stylesheet" crossorigin href="/assets/__vite-browser-external-CiR9-j4L.css">
267
269
  </head>
268
270
  <body>
269
271
  <main class="aeo-seed-content" aria-label="Token Tracker AI-readable summary">
270
272
  <h1>Token Tracker: monitor AI token usage and cost with a local dashboard and desktop companion</h1>
271
273
  <p>
272
274
  Token Tracker is a free, open-source, local-first dashboard that automatically tracks and monitors token usage
273
- and cost across 33 AI coding tools — including Claude Code, OpenAI Codex, Cursor, Gemini CLI, DeepSeek Harness, and TRAE Work CN. A desktop pet
275
+ and cost across 34 AI coding tools — including Claude Code, OpenAI Codex, Cursor, Gemini CLI, DeepSeek Harness, and TRAE Work CN. A desktop pet
274
276
  reacts to real token activity, four desktop widgets
275
277
  keep usage visible, and achievements turn coding history into progress. Native macOS and Windows apps
276
278
  sit on top of accurate cross-provider deduplication. Token counts only — never prompts or conversations.
@@ -295,7 +297,7 @@
295
297
  <li><strong>Desktop pet</strong> — a pixel companion that reacts to real token burn, streaks, and rest.</li>
296
298
  <li><strong>Four desktop widgets</strong> — usage, activity heatmap, top models, and limits at a glance.</li>
297
299
  <li><strong>Achievements</strong> — unlock milestones from local and optional account-wide activity.</li>
298
- <li><strong>Unified usage dashboard</strong> — input, output, cached, and cache-creation tokens across 33 AI coding tools.</li>
300
+ <li><strong>Unified usage dashboard</strong> — input, output, cached, and cache-creation tokens across 34 AI coding tools.</li>
299
301
  <li><strong>Cost analysis</strong> — per-model pricing across 2,200+ models with an offline snapshot.</li>
300
302
  <li><strong>Usage limits view</strong> — live quota and subscription status for 13 providers, with last-good caching for local providers such as Antigravity and Qoder.</li>
301
303
  <li><strong>Service Status page</strong> — live operational and incident status from eight official provider status pages.</li>
@@ -306,11 +308,11 @@
306
308
  </ul>
307
309
  <p><em>Privacy by design</em>: token counts only, never prompts or conversation content. Local-first; cloud sync is optional and powers only the public leaderboard.</p>
308
310
 
309
- <h2>Supported AI coding tools (33)</h2>
311
+ <h2>Supported AI coding tools (34)</h2>
310
312
  <p>
311
313
  Use Token Tracker as a Claude Code token tracker, Codex token tracker, Cursor token tracker,
312
314
  Gemini token tracker, OpenCode token tracker, GitHub Copilot token tracker, or DeepSeek Harness token tracker — one dashboard
313
- covers all 33 tools below.
315
+ covers all 34 tools below.
314
316
  </p>
315
317
  <ul>
316
318
  <li><strong>Claude Code</strong> — Anthropic's official coding agent CLI; integrated via SessionEnd hook.</li>
@@ -330,6 +332,7 @@
330
332
  <li><strong>Grok Build</strong> — hook and passive cumulative usage reader.</li>
331
333
  <li><strong>oh-my-pi</strong> — passive JSONL session reader.</li>
332
334
  <li><strong>pi</strong> — passive JSONL session reader.</li>
335
+ <li><strong>Dots</strong> — routed through pi's provider split; no separate hook.</li>
333
336
  <li><strong>Prime Agent</strong> — metadata-only passive usage reader.</li>
334
337
  <li><strong>Craft Agents</strong> — passive session reader.</li>
335
338
  <li><strong>Reasonix</strong> — passive telemetry reader.</li>
@@ -376,7 +379,7 @@
376
379
  <p>Run <code>npx tokentracker-cli</code>. The CLI auto-detects your AI coding tools, installs hooks, and opens the dashboard.</p>
377
380
 
378
381
  <h3>Which AI coding tools does Token Tracker support?</h3>
379
- <p>Token Tracker supports 33 tools: Claude Code, Codex CLI, Cursor, Gemini CLI, Antigravity, Kiro, OpenCode, OpenClaw, Every Code, Hermes Agent, GitHub Copilot, Kimi Code, CodeBuddy, WorkBuddy, Grok Build, oh-my-pi, pi, Prime Agent, Craft Agents, Reasonix, Kilo CLI, Kilo Code, Roo Code, Zed Agent, Goose, Droid, Mimo Code, ZCode, Qoder, AnythingLLM Desktop, Claude Science, DeepSeek Harness, and TRAE Work CN.</p>
382
+ <p>Token Tracker supports 34 tools: Claude Code, Codex CLI, Cursor, Gemini CLI, Antigravity, Kiro, OpenCode, OpenClaw, Every Code, Hermes Agent, GitHub Copilot, Kimi Code, CodeBuddy, WorkBuddy, Grok Build, oh-my-pi, pi, Dots, Prime Agent, Craft Agents, Reasonix, Kilo CLI, Kilo Code, Roo Code, Zed Agent, Goose, Droid, Mimo Code, ZCode, Qoder, AnythingLLM Desktop, Claude Science, DeepSeek Harness, and TRAE Work CN.</p>
380
383
 
381
384
  <h3>Is Token Tracker free and open source?</h3>
382
385
  <p>Yes. Source on GitHub at <a href="https://github.com/xiufengsun/TokenTracker">github.com/xiufengsun/TokenTracker</a>; npm package <code>tokentracker-cli</code>.</p>
@@ -388,7 +391,7 @@
388
391
  <p>Input, output, cached, and cache-creation tokens per model, project, and time window. It also surfaces usage limits for 13 providers, including Claude, Codex, Cursor, Gemini, Antigravity, Qoder, and Qoder CN.</p>
389
392
 
390
393
  <h3>How do I monitor AI token usage and cost across tools?</h3>
391
- <p>Token Tracker is an AI token usage and cost tracker: install it with <code>npx tokentracker-cli</code>, and it monitors token consumption and spend across all 33 tools in one dashboard, with per-model pricing across 2,200+ models so you can see cost by model, project, and time window without manual tracking.</p>
394
+ <p>Token Tracker is an AI token usage and cost tracker: install it with <code>npx tokentracker-cli</code>, and it monitors token consumption and spend across all 34 tools in one dashboard, with per-model pricing across 2,200+ models so you can see cost by model, project, and time window without manual tracking.</p>
392
395
 
393
396
  <h3>Does Token Tracker work offline?</h3>
394
397
  <p>Yes. Token Tracker is local-first. All parsing, aggregation, and dashboard rendering happen on your machine. Cloud sync is optional and powers only the public leaderboard.</p>
@@ -165,8 +165,8 @@
165
165
  ]
166
166
  }
167
167
  </script>
168
- <script type="module" crossorigin src="/assets/__vite-browser-external-C6_BtvDo.js"></script>
169
- <link rel="stylesheet" crossorigin href="/assets/__vite-browser-external-CRYifSM4.css">
168
+ <script type="module" crossorigin src="/assets/__vite-browser-external-BE7h4Ou0.js"></script>
169
+ <link rel="stylesheet" crossorigin href="/assets/__vite-browser-external-CiR9-j4L.css">
170
170
  </head>
171
171
  <body>
172
172
  <main class="aeo-seed-content" aria-label="Claude IP Check AI-readable summary">
@@ -136,8 +136,8 @@
136
136
  ]
137
137
  }
138
138
  </script>
139
- <script type="module" crossorigin src="/assets/__vite-browser-external-C6_BtvDo.js"></script>
140
- <link rel="stylesheet" crossorigin href="/assets/__vite-browser-external-CRYifSM4.css">
139
+ <script type="module" crossorigin src="/assets/__vite-browser-external-BE7h4Ou0.js"></script>
140
+ <link rel="stylesheet" crossorigin href="/assets/__vite-browser-external-CiR9-j4L.css">
141
141
  </head>
142
142
  <body>
143
143
  <main class="aeo-seed-content" aria-label="AI Coding Token Usage Leaderboard AI-readable summary">
@@ -1,7 +1,7 @@
1
1
  # Token Tracker LLMs Index
2
2
 
3
3
  Token Tracker is a free, open-source, local-first AI coding usage and cost
4
- tracker for 32 tools. Its distinctive desktop experience includes a pixel pet
4
+ tracker for 34 tools. Its distinctive desktop experience includes a pixel pet
5
5
  powered by real token activity, four desktop widgets, and achievements. The
6
6
  same data powers a cross-platform CLI, a native macOS menu bar app, a native
7
7
  Windows system tray app, and a dashboard. It records token counts and
@@ -23,7 +23,7 @@ timestamps, never prompts, responses, or source code.
23
23
  - [npm package](https://www.npmjs.com/package/tokentracker-cli)
24
24
  - [Latest release](https://github.com/xiufengsun/TokenTracker/releases/latest)
25
25
 
26
- ## Supported AI coding tools (33)
26
+ ## Supported AI coding tools (34)
27
27
  - Claude Code
28
28
  - Codex CLI
29
29
  - Cursor
@@ -41,6 +41,7 @@ timestamps, never prompts, responses, or source code.
41
41
  - Grok Build
42
42
  - oh-my-pi
43
43
  - pi
44
+ - Dots
44
45
  - Prime Agent
45
46
  - Craft Agents
46
47
  - Reasonix
@@ -75,8 +75,8 @@
75
75
  "description": "Shareable Token Tracker dashboard snapshot."
76
76
  }
77
77
  </script>
78
- <script type="module" crossorigin src="/assets/__vite-browser-external-C6_BtvDo.js"></script>
79
- <link rel="stylesheet" crossorigin href="/assets/__vite-browser-external-CRYifSM4.css">
78
+ <script type="module" crossorigin src="/assets/__vite-browser-external-BE7h4Ou0.js"></script>
79
+ <link rel="stylesheet" crossorigin href="/assets/__vite-browser-external-CiR9-j4L.css">
80
80
  </head>
81
81
  <body>
82
82
  <main class="aeo-seed-content" aria-label="Token Tracker share page summary">
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "tokentracker-cli",
3
- "version": "0.91.3",
4
- "description": "Local-first AI coding token usage and cost tracker for 33 tools, with a dashboard, desktop pet, widgets, achievements, and native macOS/Windows apps.",
3
+ "version": "0.93.0",
4
+ "description": "Local-first AI coding token usage and cost tracker for 34 tools, with a dashboard, desktop pet, widgets, achievements, and native macOS/Windows apps.",
5
5
  "main": "src/cli.js",
6
6
  "bin": {
7
7
  "tokentracker-cli": "bin/tracker.js",
@@ -21,7 +21,7 @@
21
21
  "access": "public"
22
22
  },
23
23
  "scripts": {
24
- "ci:local": "npm test && npm run validate:copy && npm run validate:locale && npm run validate:ui-hardcode && npm run validate:guardrails && npm run validate:versions && node --test test/architecture-guardrails.test.js && npm --prefix dashboard run build",
24
+ "ci:local": "npm test && npm run validate:copy && npm run validate:locale && npm run validate:ui-hardcode && npm run validate:guardrails && npm run validate:versions && npm run validate:bot-frames && node --test test/architecture-guardrails.test.js && npm --prefix dashboard run build",
25
25
  "copy:pull": "node scripts/copy-sync.cjs pull",
26
26
  "copy:push": "node scripts/copy-sync.cjs push",
27
27
  "dashboard:build": "npm --prefix dashboard run build",
@@ -38,6 +38,8 @@
38
38
  "pricing:build-seed": "node scripts/build-pricing-seed.cjs",
39
39
  "prepublishOnly": "node scripts/build-pricing-seed.cjs",
40
40
  "test": "node --test test/*.test.js",
41
+ "gen:bot-frames": "node scripts/gen-bot-frames.cjs",
42
+ "validate:bot-frames": "node scripts/gen-bot-frames.cjs --check",
41
43
  "validate:copy": "node scripts/validate-copy-registry.cjs",
42
44
  "validate:locale": "node scripts/validate-locale-coverage.cjs",
43
45
  "validate:guardrails": "node scripts/validate-architecture-guardrails.cjs",
@@ -122,6 +122,7 @@ const SUPPORTED_PROVIDERS = [
122
122
  "Grok Build",
123
123
  "oh-my-pi",
124
124
  "pi",
125
+ "Dots",
125
126
  "Prime Agent",
126
127
  "Craft Agents",
127
128
  "Reasonix",
@@ -543,21 +543,39 @@ async function fetchOpencodeGoApiLimits({ apiKey, fetchImpl, nowMs, timeoutMs })
543
543
  };
544
544
  }
545
545
 
546
- const rolling = buildWindow({
547
- usagePercent: payload?.rollingUsage?.usagePercent,
548
- resetInSec: payload?.rollingUsage?.resetInSec,
549
- nowMs,
550
- });
551
- const weekly = buildWindow({
552
- usagePercent: payload?.weeklyUsage?.usagePercent,
553
- resetInSec: payload?.weeklyUsage?.resetInSec,
554
- nowMs,
555
- });
556
- const monthly = buildWindow({
557
- usagePercent: payload?.monthlyUsage?.usagePercent,
558
- resetInSec: payload?.monthlyUsage?.resetInSec,
559
- nowMs,
560
- });
546
+ // Upstream has shipped two shapes:
547
+ // - Early spec (anomalyco/opencode#16513): { rollingUsage: { usagePercent, resetInSec } ... }
548
+ // - Live API (2026-08): { usage: { rolling: { percent, resetsAt }, weekly: {}, monthly: {} } }
549
+ const resolveApiWindow = (legacy, modern) => {
550
+ if (modern && typeof modern === "object") {
551
+ const pct = modern.percent ?? modern.usagePercent ?? modern.usage_percent;
552
+ const resetsAt = modern.resetsAt ?? modern.resets_at ?? modern.resetAt ?? modern.reset_at;
553
+ if (pct != null || resetsAt != null) {
554
+ const resetInSec = (() => {
555
+ if (typeof modern.resetInSec === "number" || typeof modern.resetInSec === "string") return Number(modern.resetInSec);
556
+ if (typeof modern.reset_in_sec === "number" || typeof modern.reset_in_sec === "string") return Number(modern.reset_in_sec);
557
+ if (typeof resetsAt === "string" && resetsAt) {
558
+ const ts = Date.parse(resetsAt);
559
+ if (Number.isFinite(ts)) return Math.max(0, Math.floor((ts - nowMs) / 1000));
560
+ }
561
+ return undefined;
562
+ })();
563
+ const modernWindow = buildWindow({ usagePercent: pct, resetInSec, nowMs });
564
+ // Only prefer the modern window when it actually parsed; an incomplete
565
+ // modern object (e.g. percent without reset info) must fall through to
566
+ // a valid legacy window instead of losing it.
567
+ if (modernWindow) return modernWindow;
568
+ }
569
+ }
570
+ if (legacy && typeof legacy === "object") {
571
+ return buildWindow({ usagePercent: legacy.usagePercent ?? legacy.percent, resetInSec: legacy.resetInSec ?? legacy.reset_in_sec, nowMs });
572
+ }
573
+ return null;
574
+ };
575
+
576
+ const rolling = resolveApiWindow(payload?.rollingUsage, payload?.usage?.rolling ?? payload?.rolling);
577
+ const weekly = resolveApiWindow(payload?.weeklyUsage, payload?.usage?.weekly ?? payload?.weekly);
578
+ const monthly = resolveApiWindow(payload?.monthlyUsage, payload?.usage?.monthly ?? payload?.monthly);
561
579
 
562
580
  if (!rolling && !weekly && !monthly) {
563
581
  return {
@@ -9,7 +9,11 @@ const PET_SPRITESHEET = "spritesheet.webp";
9
9
  const MAX_PACKAGE_BYTES = 12 * 1024 * 1024;
10
10
  const MAX_MANIFEST_BYTES = 16 * 1024;
11
11
  const MAX_SPRITESHEET_BYTES = 10 * 1024 * 1024;
12
- const BUILTIN_IDS = new Set(["clawd", "sprout", "byte", "ember"]);
12
+ // `bot` joins clawd as a built-in with no sprite atlas: it is drawn from the
13
+ // vector engine in dashboard/src/lib/bot/, so it costs no disk space and is
14
+ // therefore not in REMOVABLE_BUILTIN_IDS — that list exists to reclaim the
15
+ // space an atlas takes.
16
+ const BUILTIN_IDS = new Set(["clawd", "bot", "sprout", "byte", "ember"]);
13
17
  const REMOVABLE_BUILTIN_IDS = new Set(["sprout", "byte", "ember"]);
14
18
  const HIDDEN_BUILTINS_FILE = ".hidden-builtins.json";
15
19
  // codex-pets.net added `kind` to pet.json long after launch, and its enum may keep
@@ -297,9 +301,48 @@ function loadPetDirectory(directory, expectedId = null) {
297
301
  return value;
298
302
  }
299
303
 
304
+ /**
305
+ * Move third-party packages out of directories whose id we have since reserved.
306
+ *
307
+ * `bot` became a built-in in 0.93.0. A user who had imported a package with that id
308
+ * would otherwise lose it silently: BUILTIN_IDS skips it in every listing, and
309
+ * removeInstalledPet routes it to hideBuiltinPet, which rejects a non-removable
310
+ * built-in — so the directory became invisible AND undeletable, up to 10 MB of it.
311
+ *
312
+ * Renaming keeps the package usable instead of just deleting it. Idempotent by
313
+ * construction: after the rename the reserved path no longer exists. If the manifest
314
+ * rewrite fails mid-way the package is unusable but freely removable, which still
315
+ * beats the state above.
316
+ */
317
+ function reclaimReservedPetDirectories(root) {
318
+ for (const reserved of BUILTIN_IDS) {
319
+ const source = path.join(root, reserved);
320
+ if (!fs.existsSync(path.join(source, PET_MANIFEST))) continue;
321
+ let target = `${reserved}-imported`;
322
+ for (let suffix = 2; fs.existsSync(path.join(root, target)); suffix += 1) {
323
+ target = `${reserved}-imported-${suffix}`;
324
+ }
325
+ try {
326
+ fs.renameSync(source, path.join(root, target));
327
+ } catch {
328
+ continue;
329
+ }
330
+ // The manifest id must match the directory name or the package fails to load.
331
+ const manifestPath = path.join(root, target, PET_MANIFEST);
332
+ try {
333
+ const manifest = JSON.parse(fs.readFileSync(manifestPath, "utf8"));
334
+ manifest.id = target;
335
+ fs.writeFileSync(manifestPath, `${JSON.stringify(manifest, null, 2)}\n`);
336
+ } catch {
337
+ // Left unusable but removable; nothing else to do here.
338
+ }
339
+ }
340
+ }
341
+
300
342
  function listInstalledPets() {
301
343
  migrateLegacyCodexPets();
302
344
  const root = resolvePetsDir();
345
+ reclaimReservedPetDirectories(root);
303
346
  let names = [];
304
347
  try { names = fs.readdirSync(root); } catch (error) {
305
348
  if (error?.code === "ENOENT") return [];
@@ -670,6 +713,7 @@ module.exports = {
670
713
  readCodexImportableAsset,
671
714
  readHiddenBuiltinIds,
672
715
  readWebpDimensions,
716
+ reclaimReservedPetDirectories,
673
717
  removeInstalledPet,
674
718
  resolveCodexPetsDir,
675
719
  resolvePetAsset,
@@ -126,11 +126,28 @@ function isDeepSeekTimePricedModel(model) {
126
126
  return DEEPSEEK_TIME_PRICED_MODELS.some((name) => lower.includes(name));
127
127
  }
128
128
 
129
+ // From 00:00 Beijing time on 2026-08-23 — this instant — DeepSeek bills whole
130
+ // Beijing weekends off-peak, peak hours included.
131
+ // https://api-docs.deepseek.com/quick_start/pricing/
132
+ const DEEPSEEK_WEEKEND_OFF_PEAK_FROM_MS = Date.UTC(2026, 7, 22, 16, 0, 0);
133
+
134
+ // The weekend is bounded in Beijing time, so it runs 16:00Z Friday to 16:00Z
135
+ // Sunday. Shifting the instant by +08:00 before reading the weekday is what puts
136
+ // both of those edges in the right place; getUTCDay() on the raw instant marks a
137
+ // different 48 hours. China has had no daylight saving since 1991, so the fixed
138
+ // offset is exact.
139
+ function isBeijingWeekendOffPeak(timestamp) {
140
+ if (timestamp < DEEPSEEK_WEEKEND_OFF_PEAK_FROM_MS) return false;
141
+ const beijingDay = new Date(timestamp + 8 * 60 * 60 * 1000).getUTCDay();
142
+ return beijingDay === 0 || beijingDay === 6;
143
+ }
144
+
129
145
  function isDeepSeekOffPeak(row) {
130
146
  if (row?.pricing_tier === "off_peak") return true;
131
147
  if (row?.pricing_tier === "peak") return false;
132
148
  const timestamp = Date.parse(String(row?.hour_start || ""));
133
149
  if (!Number.isFinite(timestamp)) return false;
150
+ if (isBeijingWeekendOffPeak(timestamp)) return true;
134
151
  const hour = new Date(timestamp).getUTCHours();
135
152
  return !((hour >= 1 && hour < 4) || (hour >= 6 && hour < 10));
136
153
  }