nomnomtokens 0.1.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 (187) hide show
  1. package/README.md +19 -13
  2. package/dist/index.js +4983 -3960
  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/limits.DDC9tNkw.css +1 -0
  50. package/web/public/_nuxt/m3-Vaz25.js +1 -0
  51. package/web/server/chunks/_/filters.mjs +1 -1
  52. package/web/server/chunks/build/{Badge-C0eTW_zX.mjs → Badge-BmQgPqZ1.mjs} +2 -2
  53. package/web/server/chunks/build/{Badge-C0eTW_zX.mjs.map → Badge-BmQgPqZ1.mjs.map} +1 -1
  54. package/web/server/chunks/build/{Button-7BTto1uR.mjs → Button-DnpDAHT3.mjs} +2 -2
  55. package/web/server/chunks/build/{Button-7BTto1uR.mjs.map → Button-DnpDAHT3.mjs.map} +1 -1
  56. package/web/server/chunks/build/Card-Be4cmWue.mjs +30 -0
  57. package/web/server/chunks/build/Card-Be4cmWue.mjs.map +1 -0
  58. package/web/server/chunks/build/{CardAction-M7nFIGyX.mjs → CardAction-CkY0xYx3.mjs} +2 -2
  59. package/web/server/chunks/build/{CardAction-M7nFIGyX.mjs.map → CardAction-CkY0xYx3.mjs.map} +1 -1
  60. package/web/server/chunks/build/{CardTitle-D9ve_H9E.mjs → CardContent-C_IMqI8K.mjs} +26 -26
  61. package/web/server/chunks/build/CardContent-C_IMqI8K.mjs.map +1 -0
  62. package/web/server/chunks/build/{EmptyState-DWgJMVCI.mjs → EmptyState-FUeBWCT0.mjs} +2 -2
  63. package/web/server/chunks/build/{EmptyState-DWgJMVCI.mjs.map → EmptyState-FUeBWCT0.mjs.map} +1 -1
  64. package/web/server/chunks/build/{FilterBar-vwbfttN7.mjs → FilterBar-BlEsJ5dy.mjs} +5 -5
  65. package/web/server/chunks/build/{FilterBar-vwbfttN7.mjs.map → FilterBar-BlEsJ5dy.mjs.map} +1 -1
  66. package/web/server/chunks/build/{Progress-BckzQSF5.mjs → Progress-BUpfE9Os.mjs} +2 -2
  67. package/web/server/chunks/build/{Progress-BckzQSF5.mjs.map → Progress-BUpfE9Os.mjs.map} +1 -1
  68. package/web/server/chunks/build/Skeleton-BidW2_bw.mjs +28 -0
  69. package/web/server/chunks/build/Skeleton-BidW2_bw.mjs.map +1 -0
  70. package/web/server/chunks/build/{Sparkline-DDDyGBE4.mjs → Sparkline-CaCRq45J.mjs} +6 -5
  71. package/web/server/chunks/build/Sparkline-CaCRq45J.mjs.map +1 -0
  72. package/web/server/chunks/build/{TableCell-BZwItbY_.mjs → TableCell-xM3CadYu.mjs} +2 -2
  73. package/web/server/chunks/build/{TableCell-BZwItbY_.mjs.map → TableCell-xM3CadYu.mjs.map} +1 -1
  74. package/web/server/chunks/build/{Tooltip-BVTXdgMT.mjs → Tooltip-BZX3jLtj.mjs} +16 -4
  75. package/web/server/chunks/build/Tooltip-BZX3jLtj.mjs.map +1 -0
  76. package/web/server/chunks/build/{_id_-HbVNBXK4.mjs → _id_-BvccBwzH.mjs} +14 -11
  77. package/web/server/chunks/build/_id_-BvccBwzH.mjs.map +1 -0
  78. package/web/server/chunks/build/alerts-6wBAzQHU.mjs +159 -0
  79. package/web/server/chunks/build/alerts-6wBAzQHU.mjs.map +1 -0
  80. package/web/server/chunks/build/{fetch-Debw9R9i.mjs → asyncData-CMa0z9Yw.mjs} +8 -129
  81. package/web/server/chunks/build/asyncData-CMa0z9Yw.mjs.map +1 -0
  82. package/web/server/chunks/build/default-BokiYQNv.mjs +847 -0
  83. package/web/server/chunks/build/default-BokiYQNv.mjs.map +1 -0
  84. package/web/server/chunks/build/error-404-DPRNxhXC.mjs +2 -2
  85. package/web/server/chunks/build/error-500-DXGrtqsW.mjs +2 -2
  86. package/web/server/chunks/build/export-BhfwmSMl.mjs +184 -0
  87. package/web/server/chunks/build/export-BhfwmSMl.mjs.map +1 -0
  88. package/web/server/chunks/build/fetch-DJ9NNbFP.mjs +131 -0
  89. package/web/server/chunks/build/fetch-DJ9NNbFP.mjs.map +1 -0
  90. package/web/server/chunks/build/import-CO3NEu0P.mjs +233 -0
  91. package/web/server/chunks/build/import-CO3NEu0P.mjs.map +1 -0
  92. package/web/server/chunks/build/{limits-B44okAo1.mjs → limits-CX9zBSqw.mjs} +37 -29
  93. package/web/server/chunks/build/limits-CX9zBSqw.mjs.map +1 -0
  94. package/web/server/chunks/build/limits-styles.CKdzkgZ8.mjs +8 -0
  95. package/web/server/chunks/build/limits-styles.CKdzkgZ8.mjs.map +1 -0
  96. package/web/server/chunks/build/nuxt-link-mYiLFsJs.mjs +2 -2
  97. package/web/server/chunks/build/{pages-CffxtNMi.mjs → pages-DyXqJyPq.mjs} +140 -15
  98. package/web/server/chunks/build/pages-DyXqJyPq.mjs.map +1 -0
  99. package/web/server/chunks/build/{providers-CUjXlgDS.mjs → providers-Ca7keu2G.mjs} +17 -14
  100. package/web/server/chunks/build/providers-Ca7keu2G.mjs.map +1 -0
  101. package/web/server/chunks/build/scopes-E5z80S19.mjs +1348 -0
  102. package/web/server/chunks/build/scopes-E5z80S19.mjs.map +1 -0
  103. package/web/server/chunks/build/{sessions-BvRUAKPl.mjs → sessions-CESRiCOS.mjs} +14 -11
  104. package/web/server/chunks/build/sessions-CESRiCOS.mjs.map +1 -0
  105. package/web/server/chunks/build/{timeline-BbSoi8xO.mjs → timeline-d27OlbZN.mjs} +16 -13
  106. package/web/server/chunks/build/timeline-d27OlbZN.mjs.map +1 -0
  107. package/web/server/chunks/build/useFormat-NkyUqeik.mjs +71 -0
  108. package/web/server/chunks/build/useFormat-NkyUqeik.mjs.map +1 -0
  109. package/web/server/chunks/build/{useStats-Dor6kLek.mjs → useStats-CmYzpdbE.mjs} +11 -3
  110. package/web/server/chunks/build/useStats-CmYzpdbE.mjs.map +1 -0
  111. package/web/server/chunks/nitro/nitro.mjs +1031 -209
  112. package/web/server/chunks/nitro/nitro.mjs.map +1 -1
  113. package/web/server/chunks/routes/api/alerts.get.mjs +24 -0
  114. package/web/server/chunks/routes/api/alerts.get.mjs.map +1 -0
  115. package/web/server/chunks/routes/api/alerts.put.mjs +27 -0
  116. package/web/server/chunks/routes/api/alerts.put.mjs.map +1 -0
  117. package/web/server/chunks/routes/api/events/stream.get.mjs +3 -3
  118. package/web/server/chunks/routes/api/export.get.mjs +36 -0
  119. package/web/server/chunks/routes/api/export.get.mjs.map +1 -0
  120. package/web/server/chunks/routes/api/import/csv.post.mjs +65 -0
  121. package/web/server/chunks/routes/api/import/csv.post.mjs.map +1 -0
  122. package/web/server/chunks/routes/api/ingest.post.mjs +3 -3
  123. package/web/server/chunks/routes/api/meta.get.mjs +3 -3
  124. package/web/server/chunks/routes/api/stats/heatmap.get.mjs +2 -2
  125. package/web/server/chunks/routes/api/stats/limits.get.mjs +6 -5
  126. package/web/server/chunks/routes/api/stats/limits.get.mjs.map +1 -1
  127. package/web/server/chunks/routes/api/stats/providers.get.mjs +3 -3
  128. package/web/server/chunks/routes/api/stats/scopes.get.mjs +3 -3
  129. package/web/server/chunks/routes/api/stats/series.get.mjs +3 -3
  130. package/web/server/chunks/routes/api/stats/session/_id_.get.mjs +3 -3
  131. package/web/server/chunks/routes/api/stats/sessions.get.mjs +3 -3
  132. package/web/server/chunks/routes/api/stats/summary.get.mjs +3 -3
  133. package/web/server/chunks/routes/renderer.mjs +2 -2
  134. package/web/server/chunks/virtual/entry.mjs +26 -11
  135. package/web/server/chunks/virtual/precomputed.mjs +1 -1
  136. package/web/server/chunks/virtual/precomputed.mjs.map +1 -1
  137. package/web/server/chunks/virtual/styles.mjs +3 -1
  138. package/web/server/chunks/virtual/styles.mjs.map +1 -1
  139. package/web/server/index.mjs +3 -3
  140. package/web/public/_nuxt/BDF8cO8j.js +0 -1
  141. package/web/public/_nuxt/BPhzhJvP.js +0 -1
  142. package/web/public/_nuxt/BgaLDD2o.js +0 -1
  143. package/web/public/_nuxt/BioUjjBz.js +0 -1
  144. package/web/public/_nuxt/BlvSknce.js +0 -1
  145. package/web/public/_nuxt/Bn14i44R.js +0 -1
  146. package/web/public/_nuxt/Bv0odo9W.js +0 -1
  147. package/web/public/_nuxt/Bxx0Z5z6.js +0 -1
  148. package/web/public/_nuxt/C-xeWIVA.js +0 -1
  149. package/web/public/_nuxt/CC85Q8DD.js +0 -1
  150. package/web/public/_nuxt/CNp1wm92.js +0 -47
  151. package/web/public/_nuxt/CYcD169V.js +0 -1
  152. package/web/public/_nuxt/Cay8LZ9u.js +0 -1
  153. package/web/public/_nuxt/CoCv6Hmx.js +0 -1
  154. package/web/public/_nuxt/Ctg1e1JV.js +0 -1
  155. package/web/public/_nuxt/Cy-tzONg.js +0 -2
  156. package/web/public/_nuxt/DCnkQFS0.js +0 -1
  157. package/web/public/_nuxt/DJbGqyvB.js +0 -1
  158. package/web/public/_nuxt/DMT7tA5C.js +0 -1
  159. package/web/public/_nuxt/DvKiMgoh.js +0 -1
  160. package/web/public/_nuxt/Dw4si2jw.js +0 -1
  161. package/web/public/_nuxt/M0pG6UQn.js +0 -1
  162. package/web/public/_nuxt/RlymLGHS.js +0 -1
  163. package/web/public/_nuxt/TmkSb4nj.js +0 -1
  164. package/web/public/_nuxt/TnCE9lfg.js +0 -86
  165. package/web/public/_nuxt/_S09PGd-.js +0 -1
  166. package/web/public/_nuxt/builds/meta/57c20bc9-f17f-4623-94bd-ea8746650367.json +0 -1
  167. package/web/public/_nuxt/cHkFs-ms.js +0 -1
  168. package/web/public/_nuxt/entry.CwLI8Fh7.css +0 -2
  169. package/web/public/_nuxt/oT-x2NdZ.js +0 -1
  170. package/web/server/chunks/build/CardTitle-D9ve_H9E.mjs.map +0 -1
  171. package/web/server/chunks/build/Sparkline-DDDyGBE4.mjs.map +0 -1
  172. package/web/server/chunks/build/Tooltip-BVTXdgMT.mjs.map +0 -1
  173. package/web/server/chunks/build/_id_-HbVNBXK4.mjs.map +0 -1
  174. package/web/server/chunks/build/default-C8deLrP0.mjs +0 -556
  175. package/web/server/chunks/build/default-C8deLrP0.mjs.map +0 -1
  176. package/web/server/chunks/build/fetch-Debw9R9i.mjs.map +0 -1
  177. package/web/server/chunks/build/limits-B44okAo1.mjs.map +0 -1
  178. package/web/server/chunks/build/pages-CffxtNMi.mjs.map +0 -1
  179. package/web/server/chunks/build/providers-CUjXlgDS.mjs.map +0 -1
  180. package/web/server/chunks/build/scopes-CQokoqM9.mjs +0 -788
  181. package/web/server/chunks/build/scopes-CQokoqM9.mjs.map +0 -1
  182. package/web/server/chunks/build/sessions-BvRUAKPl.mjs.map +0 -1
  183. package/web/server/chunks/build/timeline-BbSoi8xO.mjs.map +0 -1
  184. package/web/server/chunks/build/useFormat-D8in50HT.mjs +0 -116
  185. package/web/server/chunks/build/useFormat-D8in50HT.mjs.map +0 -1
  186. package/web/server/chunks/build/useStats-Dor6kLek.mjs.map +0 -1
  187. /package/web/public/_nuxt/{BDNMzG2s.js → BDNMzG2s2.js} +0 -0
package/README.md CHANGED
@@ -10,11 +10,14 @@ 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
14
 
15
- Claude Code today. Cursor when its local IDE database has token fields. The
16
- event contract is deliberately not AI-shaped, so other agents — and eventually
17
- CI minutes and cloud bills plug in as adapters without touching the core.
15
+ ![nomnomtokens Timeline spend stacked by model and activity heatmap](docs/timeline.png)
16
+
17
+ Claude Code, Cursor (when its local IDE database has token fields), and Codex
18
+ CLI/IDE session rollouts. The event contract is deliberately not AI-shaped, so
19
+ other agents — and eventually CI minutes and cloud bills — plug in as adapters
20
+ without touching the core.
18
21
 
19
22
  ## What you get
20
23
 
@@ -30,7 +33,7 @@ CI minutes and cloud bills — plug in as adapters without touching the core.
30
33
  - **Limits** — window-fill history with a burn-rate projection and markers for
31
34
  the moments you actually hit the cap.
32
35
 
33
- 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.
34
37
 
35
38
  ## Install
36
39
 
@@ -64,6 +67,10 @@ The hook doubles as a real status line:
64
67
  | `nnt init [--force]` | wire up the status line hook |
65
68
  | `nnt statusline` | ingest a session payload and print a status line |
66
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`) |
67
74
 
68
75
  ## Privacy
69
76
 
@@ -134,19 +141,18 @@ the core, the contract is wrong and that's a bug worth reporting.
134
141
 
135
142
  ## Roadmap
136
143
 
137
- Shipped: Claude Code adapter, Cursor adapter (local `state.vscdb`), all six
138
- screens, limits with forecasting, live updates. CSV helpers exist in
139
- `packages/adapters` but are not 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.
140
147
 
141
148
  Cursor caveat: the IDE often stores zero token counts in local bubbles. We only
142
149
  emit events when numbers are present (exact `tokenCount`, or
143
150
  `tokensUsed` + delta). We do not estimate from message text. Sessions without
144
- local counts will not appear until Cursor writes them — or until a future
145
- 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.
146
153
 
147
- Next: wire up CSV import, OTLP receiver, Codex adapter, export, alerts. Then
148
- cloud mode — a second sink for the same events, never a rewrite, and never in
149
- 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.
150
156
 
151
157
  ## License
152
158