nomnomtokens 0.2.0 → 0.4.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 (181) hide show
  1. package/README.md +20 -11
  2. package/dist/index.js +4230 -3457
  3. package/dist/index.js.map +1 -1
  4. package/package.json +1 -1
  5. package/web/nitro.json +1 -1
  6. package/web/public/_nuxt/4C_a23zt.js +1 -0
  7. package/web/public/_nuxt/B1jhn8zK.js +1 -0
  8. package/web/public/_nuxt/B2aHje2L.js +1 -0
  9. package/web/public/_nuxt/BAfR3Wl32.js +1 -0
  10. package/web/public/_nuxt/BMSLzLlT.js +1 -0
  11. package/web/public/_nuxt/BOKlFKrX.js +1 -0
  12. package/web/public/_nuxt/Ba6z8j_4.js +1 -0
  13. package/web/public/_nuxt/{B1O-ibEy.js → Bag9D5rq.js} +2 -2
  14. package/web/public/_nuxt/Bia8fJFj.js +1 -0
  15. package/web/public/_nuxt/{tqUqm2f-.js → Bprokln-.js} +1 -1
  16. package/web/public/_nuxt/C51OzH6V.js +1 -0
  17. package/web/public/_nuxt/C9MiT_Wm.js +96 -0
  18. package/web/public/_nuxt/CDzUujek.js +2 -0
  19. package/web/public/_nuxt/CIHIOSzn.js +1 -0
  20. package/web/public/_nuxt/CIKwfDBl.js +1 -0
  21. package/web/public/_nuxt/COwSpxrx.js +1 -0
  22. package/web/public/_nuxt/CZSbzIi-.js +1 -0
  23. package/web/public/_nuxt/CfBMjq8x.js +1 -0
  24. package/web/public/_nuxt/Ch3y3mGJ.js +1 -0
  25. package/web/public/_nuxt/{B7bAnU98.js → CkRZsevx.js} +1 -1
  26. package/web/public/_nuxt/Cq1Sq3Go.js +1 -0
  27. package/web/public/_nuxt/CsN_oUfs.js +1 -0
  28. package/web/public/_nuxt/CvIugsJe2.js +1 -0
  29. package/web/public/_nuxt/D49wVVwm2.js +1 -0
  30. package/web/public/_nuxt/D4C6J8YV.js +1 -0
  31. package/web/public/_nuxt/D7Ph0tZD.js +1 -0
  32. package/web/public/_nuxt/D9Mxq5ER.js +1 -0
  33. package/web/public/_nuxt/D9j6aFUy.js +1 -0
  34. package/web/public/_nuxt/DMgad8mU.js +1 -0
  35. package/web/public/_nuxt/DPnm6zS2.js +1 -0
  36. package/web/public/_nuxt/DQEnwY-5.js +1 -0
  37. package/web/public/_nuxt/Dh50_bkx.js +1 -0
  38. package/web/public/_nuxt/DhJW7zb9.js +1 -0
  39. package/web/public/_nuxt/DnTwjl0_2.js +47 -0
  40. package/web/public/_nuxt/DsH8sTHf.js +1 -0
  41. package/web/public/_nuxt/Dy30RUCD2.js +1 -0
  42. package/web/public/_nuxt/OU1MVgXQ.js +1 -0
  43. package/web/public/_nuxt/W3KL_OjU.js +1 -0
  44. package/web/public/_nuxt/{BgvEQa6E.js → ZjfInHdu.js} +2 -2
  45. package/web/public/_nuxt/builds/latest.json +1 -1
  46. package/web/public/_nuxt/builds/meta/b80e2306-16ec-4868-89f8-b713594d0c00.json +1 -0
  47. package/web/public/_nuxt/cbxnBwm6.js +1 -0
  48. package/web/public/_nuxt/entry.MbqNBIeH.css +2 -0
  49. package/web/public/_nuxt/m3-Vaz25.js +1 -0
  50. package/web/server/chunks/_/filters.mjs +1 -1
  51. package/web/server/chunks/build/{Badge-C0eTW_zX.mjs → Badge-BmQgPqZ1.mjs} +2 -2
  52. package/web/server/chunks/build/{Badge-C0eTW_zX.mjs.map → Badge-BmQgPqZ1.mjs.map} +1 -1
  53. package/web/server/chunks/build/{Button-7BTto1uR.mjs → Button-DnpDAHT3.mjs} +2 -2
  54. package/web/server/chunks/build/{Button-7BTto1uR.mjs.map → Button-DnpDAHT3.mjs.map} +1 -1
  55. package/web/server/chunks/build/Card-Be4cmWue.mjs +30 -0
  56. package/web/server/chunks/build/Card-Be4cmWue.mjs.map +1 -0
  57. package/web/server/chunks/build/{CardAction-M7nFIGyX.mjs → CardAction-CkY0xYx3.mjs} +2 -2
  58. package/web/server/chunks/build/{CardAction-M7nFIGyX.mjs.map → CardAction-CkY0xYx3.mjs.map} +1 -1
  59. package/web/server/chunks/build/{CardTitle-D9ve_H9E.mjs → CardContent-C_IMqI8K.mjs} +26 -26
  60. package/web/server/chunks/build/CardContent-C_IMqI8K.mjs.map +1 -0
  61. package/web/server/chunks/build/{EmptyState-DWgJMVCI.mjs → EmptyState-FUeBWCT0.mjs} +2 -2
  62. package/web/server/chunks/build/{EmptyState-DWgJMVCI.mjs.map → EmptyState-FUeBWCT0.mjs.map} +1 -1
  63. package/web/server/chunks/build/{FilterBar-vwbfttN7.mjs → FilterBar-BlEsJ5dy.mjs} +5 -5
  64. package/web/server/chunks/build/{FilterBar-vwbfttN7.mjs.map → FilterBar-BlEsJ5dy.mjs.map} +1 -1
  65. package/web/server/chunks/build/{Progress-BckzQSF5.mjs → Progress-BUpfE9Os.mjs} +2 -2
  66. package/web/server/chunks/build/{Progress-BckzQSF5.mjs.map → Progress-BUpfE9Os.mjs.map} +1 -1
  67. package/web/server/chunks/build/Skeleton-BidW2_bw.mjs +28 -0
  68. package/web/server/chunks/build/Skeleton-BidW2_bw.mjs.map +1 -0
  69. package/web/server/chunks/build/{Sparkline-Cxifh2uK.mjs → Sparkline-CaCRq45J.mjs} +6 -5
  70. package/web/server/chunks/build/Sparkline-CaCRq45J.mjs.map +1 -0
  71. package/web/server/chunks/build/{TableCell-BZwItbY_.mjs → TableCell-xM3CadYu.mjs} +2 -2
  72. package/web/server/chunks/build/{TableCell-BZwItbY_.mjs.map → TableCell-xM3CadYu.mjs.map} +1 -1
  73. package/web/server/chunks/build/{Tooltip-BVTXdgMT.mjs → Tooltip-BZX3jLtj.mjs} +16 -4
  74. package/web/server/chunks/build/Tooltip-BZX3jLtj.mjs.map +1 -0
  75. package/web/server/chunks/build/{_id_-BKmH0aHH.mjs → _id_-BvccBwzH.mjs} +14 -11
  76. package/web/server/chunks/build/_id_-BvccBwzH.mjs.map +1 -0
  77. package/web/server/chunks/build/alerts-6wBAzQHU.mjs +159 -0
  78. package/web/server/chunks/build/alerts-6wBAzQHU.mjs.map +1 -0
  79. package/web/server/chunks/build/{fetch-Debw9R9i.mjs → asyncData-CMa0z9Yw.mjs} +8 -129
  80. package/web/server/chunks/build/asyncData-CMa0z9Yw.mjs.map +1 -0
  81. package/web/server/chunks/build/default-BokiYQNv.mjs +847 -0
  82. package/web/server/chunks/build/default-BokiYQNv.mjs.map +1 -0
  83. package/web/server/chunks/build/error-404-DPRNxhXC.mjs +2 -2
  84. package/web/server/chunks/build/error-500-DXGrtqsW.mjs +2 -2
  85. package/web/server/chunks/build/export-BhfwmSMl.mjs +184 -0
  86. package/web/server/chunks/build/export-BhfwmSMl.mjs.map +1 -0
  87. package/web/server/chunks/build/fetch-DJ9NNbFP.mjs +131 -0
  88. package/web/server/chunks/build/fetch-DJ9NNbFP.mjs.map +1 -0
  89. package/web/server/chunks/build/import-CO3NEu0P.mjs +233 -0
  90. package/web/server/chunks/build/import-CO3NEu0P.mjs.map +1 -0
  91. package/web/server/chunks/build/{limits-CnRLojCD.mjs → limits-CX9zBSqw.mjs} +15 -12
  92. package/web/server/chunks/build/limits-CX9zBSqw.mjs.map +1 -0
  93. package/web/server/chunks/build/nuxt-link-mYiLFsJs.mjs +2 -2
  94. package/web/server/chunks/build/{pages-DlIWqsLr.mjs → pages-DyXqJyPq.mjs} +140 -15
  95. package/web/server/chunks/build/pages-DyXqJyPq.mjs.map +1 -0
  96. package/web/server/chunks/build/{providers-DOMeWSDZ.mjs → providers-Ca7keu2G.mjs} +17 -14
  97. package/web/server/chunks/build/providers-Ca7keu2G.mjs.map +1 -0
  98. package/web/server/chunks/build/scopes-E5z80S19.mjs +1348 -0
  99. package/web/server/chunks/build/scopes-E5z80S19.mjs.map +1 -0
  100. package/web/server/chunks/build/{sessions-peyhKv2_.mjs → sessions-CESRiCOS.mjs} +14 -11
  101. package/web/server/chunks/build/sessions-CESRiCOS.mjs.map +1 -0
  102. package/web/server/chunks/build/{timeline-P2RrZyBs.mjs → timeline-d27OlbZN.mjs} +16 -13
  103. package/web/server/chunks/build/timeline-d27OlbZN.mjs.map +1 -0
  104. package/web/server/chunks/build/useFormat-NkyUqeik.mjs +71 -0
  105. package/web/server/chunks/build/useFormat-NkyUqeik.mjs.map +1 -0
  106. package/web/server/chunks/build/{useStats-Dor6kLek.mjs → useStats-CmYzpdbE.mjs} +11 -3
  107. package/web/server/chunks/build/useStats-CmYzpdbE.mjs.map +1 -0
  108. package/web/server/chunks/nitro/nitro.mjs +743 -199
  109. package/web/server/chunks/nitro/nitro.mjs.map +1 -1
  110. package/web/server/chunks/routes/api/alerts.get.mjs +24 -0
  111. package/web/server/chunks/routes/api/alerts.get.mjs.map +1 -0
  112. package/web/server/chunks/routes/api/alerts.put.mjs +27 -0
  113. package/web/server/chunks/routes/api/alerts.put.mjs.map +1 -0
  114. package/web/server/chunks/routes/api/events/stream.get.mjs +3 -3
  115. package/web/server/chunks/routes/api/export.get.mjs +36 -0
  116. package/web/server/chunks/routes/api/export.get.mjs.map +1 -0
  117. package/web/server/chunks/routes/api/import/csv.post.mjs +65 -0
  118. package/web/server/chunks/routes/api/import/csv.post.mjs.map +1 -0
  119. package/web/server/chunks/routes/api/ingest.post.mjs +3 -3
  120. package/web/server/chunks/routes/api/meta.get.mjs +3 -3
  121. package/web/server/chunks/routes/api/stats/heatmap.get.mjs +2 -2
  122. package/web/server/chunks/routes/api/stats/limits.get.mjs +3 -3
  123. package/web/server/chunks/routes/api/stats/providers.get.mjs +3 -3
  124. package/web/server/chunks/routes/api/stats/scopes.get.mjs +3 -3
  125. package/web/server/chunks/routes/api/stats/series.get.mjs +3 -3
  126. package/web/server/chunks/routes/api/stats/session/_id_.get.mjs +3 -3
  127. package/web/server/chunks/routes/api/stats/sessions.get.mjs +3 -3
  128. package/web/server/chunks/routes/api/stats/summary.get.mjs +3 -3
  129. package/web/server/chunks/routes/renderer.mjs +2 -2
  130. package/web/server/chunks/virtual/entry.mjs +26 -11
  131. package/web/server/chunks/virtual/precomputed.mjs +1 -1
  132. package/web/server/chunks/virtual/precomputed.mjs.map +1 -1
  133. package/web/server/index.mjs +3 -3
  134. package/web/public/_nuxt/075nz0Lp.js +0 -1
  135. package/web/public/_nuxt/BDF8cO8j.js +0 -1
  136. package/web/public/_nuxt/BGnU88BC.js +0 -1
  137. package/web/public/_nuxt/BPhzhJvP.js +0 -1
  138. package/web/public/_nuxt/BgaLDD2o.js +0 -1
  139. package/web/public/_nuxt/BioUjjBz.js +0 -1
  140. package/web/public/_nuxt/BlvSknce.js +0 -1
  141. package/web/public/_nuxt/Bn14i44R.js +0 -1
  142. package/web/public/_nuxt/BnfUOzcc.js +0 -1
  143. package/web/public/_nuxt/Bv0odo9W.js +0 -1
  144. package/web/public/_nuxt/Bxx0Z5z6.js +0 -1
  145. package/web/public/_nuxt/CiWIPYVi.js +0 -1
  146. package/web/public/_nuxt/CqSNCP5f.js +0 -1
  147. package/web/public/_nuxt/Ctg1e1JV.js +0 -1
  148. package/web/public/_nuxt/Cu3rIkF2.js +0 -47
  149. package/web/public/_nuxt/Cutk9Ewh.js +0 -1
  150. package/web/public/_nuxt/DCVp7cZB.js +0 -96
  151. package/web/public/_nuxt/DCnkQFS0.js +0 -1
  152. package/web/public/_nuxt/DJbGqyvB.js +0 -1
  153. package/web/public/_nuxt/DMT7tA5C.js +0 -1
  154. package/web/public/_nuxt/M0pG6UQn.js +0 -1
  155. package/web/public/_nuxt/RlymLGHS.js +0 -1
  156. package/web/public/_nuxt/TmkSb4nj.js +0 -1
  157. package/web/public/_nuxt/_S09PGd-.js +0 -1
  158. package/web/public/_nuxt/builds/meta/63ad5f37-5b40-456d-8f53-69ff57b4903c.json +0 -1
  159. package/web/public/_nuxt/cHkFs-ms.js +0 -1
  160. package/web/public/_nuxt/entry.DTNjKx6y.css +0 -2
  161. package/web/public/_nuxt/fjfS4ymU.js +0 -1
  162. package/web/public/_nuxt/moFy8lON.js +0 -2
  163. package/web/public/_nuxt/oT-x2NdZ.js +0 -1
  164. package/web/server/chunks/build/CardTitle-D9ve_H9E.mjs.map +0 -1
  165. package/web/server/chunks/build/Sparkline-Cxifh2uK.mjs.map +0 -1
  166. package/web/server/chunks/build/Tooltip-BVTXdgMT.mjs.map +0 -1
  167. package/web/server/chunks/build/_id_-BKmH0aHH.mjs.map +0 -1
  168. package/web/server/chunks/build/default-C8deLrP0.mjs +0 -556
  169. package/web/server/chunks/build/default-C8deLrP0.mjs.map +0 -1
  170. package/web/server/chunks/build/fetch-Debw9R9i.mjs.map +0 -1
  171. package/web/server/chunks/build/limits-CnRLojCD.mjs.map +0 -1
  172. package/web/server/chunks/build/pages-DlIWqsLr.mjs.map +0 -1
  173. package/web/server/chunks/build/providers-DOMeWSDZ.mjs.map +0 -1
  174. package/web/server/chunks/build/scopes-Bagepvnf.mjs +0 -794
  175. package/web/server/chunks/build/scopes-Bagepvnf.mjs.map +0 -1
  176. package/web/server/chunks/build/sessions-peyhKv2_.mjs.map +0 -1
  177. package/web/server/chunks/build/timeline-P2RrZyBs.mjs.map +0 -1
  178. package/web/server/chunks/build/useFormat-BfI0x0lv.mjs +0 -119
  179. package/web/server/chunks/build/useFormat-BfI0x0lv.mjs.map +0 -1
  180. package/web/server/chunks/build/useStats-Dor6kLek.mjs.map +0 -1
  181. /package/web/public/_nuxt/{BDNMzG2s.js → BDNMzG2s2.js} +0 -0
package/README.md CHANGED
@@ -10,7 +10,9 @@ projects, and when you'll hit your limit.
10
10
  npx nomnomtokens
11
11
  ```
12
12
 
13
- ![nomnomtokens dashboardTimeline with spend chart and activity heatmap](docs/dashboard.png)
13
+ ![nomnomtokens Overvieweaten today, cache hit rate, and limit projections](docs/overview.png)
14
+
15
+ ![nomnomtokens Timeline — spend stacked by model and activity heatmap](docs/timeline.png)
14
16
 
15
17
  Claude Code, Cursor (when its local IDE database has token fields), and Codex
16
18
  CLI/IDE session rollouts. The event contract is deliberately not AI-shaped, so
@@ -31,7 +33,7 @@ without touching the core.
31
33
  - **Limits** — window-fill history with a burn-rate projection and markers for
32
34
  the moments you actually hit the cap.
33
35
 
34
- Filter state lives in the URL, `⌘K` jumps anywhere, dark by default.
36
+ Filter state lives in the URL, `⌘K` jumps anywhere, light or dark theme.
35
37
 
36
38
  ## Install
37
39
 
@@ -52,9 +54,13 @@ live updates.
52
54
  The hook doubles as a real status line:
53
55
 
54
56
  ```
55
- (^u^) $4.20 ctx 37% 5h 73% 7d 41% 138 lines
57
+ (^u^) $4.20 ctx 37% 5h 73% ·1h47m 7d 41% ·4d3h 138 lines
56
58
  ```
57
59
 
60
+ The countdown after each window is the time left until it resets: the
61
+ percentage tells you whether to slow down, the countdown tells you what slowing
62
+ down would cost. It is omitted when Claude Code sends no `resets_at`.
63
+
58
64
  ## Commands
59
65
 
60
66
  | Command | Does |
@@ -65,6 +71,10 @@ The hook doubles as a real status line:
65
71
  | `nnt init [--force]` | wire up the status line hook |
66
72
  | `nnt statusline` | ingest a session payload and print a status line |
67
73
  | `nnt doctor` | why is it empty? checks sources, hook, and store |
74
+ | `nnt import <file.csv>` | import a billing CSV into the local store |
75
+ | `nnt export` | dump filtered events as CSV/JSON |
76
+ | `nnt prices [show\|refresh]` | local model price table (`~/.nomnomtokens/prices.json`) |
77
+ | `nnt alerts [show\|check]` | limit % / daily $ thresholds (`~/.nomnomtokens/alerts.json`) |
68
78
 
69
79
  ## Privacy
70
80
 
@@ -135,19 +145,18 @@ the core, the contract is wrong and that's a bug worth reporting.
135
145
 
136
146
  ## Roadmap
137
147
 
138
- Shipped: Claude Code adapter, Cursor adapter (local `state.vscdb`), Codex
139
- adapter (`~/.codex/sessions/**/rollout-*.jsonl`), all six screens, limits with
140
- forecasting, live updates. CSV helpers exist in `packages/adapters` but are not
141
- wired into `scan` / the UI yet.
148
+ Shipped: Claude Code / Cursor / Codex adapters, CSV import & export, Projects
149
+ grouped by name, local `prices.json` refresh, limit/daily alerts, all dashboard
150
+ screens, limits with forecasting, live updates.
142
151
 
143
152
  Cursor caveat: the IDE often stores zero token counts in local bubbles. We only
144
153
  emit events when numbers are present (exact `tokenCount`, or
145
154
  `tokensUsed` + delta). We do not estimate from message text. Sessions without
146
- local counts will not appear until Cursor writes them — or until a future
147
- optional CSV enrich from the Cursor dashboard.
155
+ local counts will not appear until Cursor writes them — or until you import a
156
+ billing CSV.
148
157
 
149
- Next: wire up CSV import, OTLP receiver, export, alerts. Then cloud mode — a
150
- second sink for the same events, never a rewrite, and never in the critical path.
158
+ Next: OTLP receiver, then cloud mode — a second sink for the same events, never
159
+ a rewrite, and never in the critical path.
151
160
 
152
161
  ## License
153
162