nomnomtokens 0.2.0 → 0.3.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 +15 -10
  2. package/dist/index.js +4208 -3455
  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/e90c8a2d-9e50-4b58-8019-6b1bf4c8fc6d.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 +739 -195
  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
 
@@ -65,6 +67,10 @@ The hook doubles as a real status line:
65
67
  | `nnt init [--force]` | wire up the status line hook |
66
68
  | `nnt statusline` | ingest a session payload and print a status line |
67
69
  | `nnt doctor` | why is it empty? checks sources, hook, and store |
70
+ | `nnt import <file.csv>` | import a billing CSV into the local store |
71
+ | `nnt export` | dump filtered events as CSV/JSON |
72
+ | `nnt prices [show\|refresh]` | local model price table (`~/.nomnomtokens/prices.json`) |
73
+ | `nnt alerts [show\|check]` | limit % / daily $ thresholds (`~/.nomnomtokens/alerts.json`) |
68
74
 
69
75
  ## Privacy
70
76
 
@@ -135,19 +141,18 @@ the core, the contract is wrong and that's a bug worth reporting.
135
141
 
136
142
  ## Roadmap
137
143
 
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.
144
+ Shipped: Claude Code / Cursor / Codex adapters, CSV import & export, Projects
145
+ grouped by name, local `prices.json` refresh, limit/daily alerts, all dashboard
146
+ screens, limits with forecasting, live updates.
142
147
 
143
148
  Cursor caveat: the IDE often stores zero token counts in local bubbles. We only
144
149
  emit events when numbers are present (exact `tokenCount`, or
145
150
  `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.
151
+ local counts will not appear until Cursor writes them — or until you import a
152
+ billing CSV.
148
153
 
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.
154
+ Next: OTLP receiver, then cloud mode — a second sink for the same events, never
155
+ a rewrite, and never in the critical path.
151
156
 
152
157
  ## License
153
158