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
@@ -1,9 +1,9 @@
1
- import process from 'node:process';globalThis._importMeta_=globalThis._importMeta_||{url:"file:///_entry.js",env:process.env};import http, { Server as Server$1 } from 'node:http';
1
+ import process from 'node:process';globalThis._importMeta_=globalThis._importMeta_||{url:"file:///_entry.js",env:process.env};import { promises, existsSync, mkdirSync, readFileSync, writeFileSync, createReadStream, readdirSync } from 'node:fs';
2
+ import { resolve as resolve$1, dirname as dirname$1, join } from 'node:path';
3
+ import http, { Server as Server$1 } from 'node:http';
2
4
  import https, { Server } from 'node:https';
3
5
  import { EventEmitter } from 'node:events';
4
6
  import { Buffer as Buffer$1 } from 'node:buffer';
5
- import { promises, existsSync, mkdirSync, createReadStream, readdirSync, readFileSync } from 'node:fs';
6
- import { resolve as resolve$1, dirname as dirname$1, join } from 'node:path';
7
7
  import { createHash } from 'node:crypto';
8
8
  import { homedir } from 'node:os';
9
9
  import Database from 'better-sqlite3';
@@ -796,6 +796,84 @@ function isError(input) {
796
796
  return input?.constructor?.__h3_error__ === true;
797
797
  }
798
798
 
799
+ function parse(multipartBodyBuffer, boundary) {
800
+ let lastline = "";
801
+ let state = 0 /* INIT */;
802
+ let buffer = [];
803
+ const allParts = [];
804
+ let currentPartHeaders = [];
805
+ for (let i = 0; i < multipartBodyBuffer.length; i++) {
806
+ const prevByte = i > 0 ? multipartBodyBuffer[i - 1] : null;
807
+ const currByte = multipartBodyBuffer[i];
808
+ const newLineChar = currByte === 10 || currByte === 13;
809
+ if (!newLineChar) {
810
+ lastline += String.fromCodePoint(currByte);
811
+ }
812
+ const newLineDetected = currByte === 10 && prevByte === 13;
813
+ if (0 /* INIT */ === state && newLineDetected) {
814
+ if ("--" + boundary === lastline) {
815
+ state = 1 /* READING_HEADERS */;
816
+ }
817
+ lastline = "";
818
+ } else if (1 /* READING_HEADERS */ === state && newLineDetected) {
819
+ if (lastline.length > 0) {
820
+ const i2 = lastline.indexOf(":");
821
+ if (i2 > 0) {
822
+ const name = lastline.slice(0, i2).toLowerCase();
823
+ const value = lastline.slice(i2 + 1).trim();
824
+ currentPartHeaders.push([name, value]);
825
+ }
826
+ } else {
827
+ state = 2 /* READING_DATA */;
828
+ buffer = [];
829
+ }
830
+ lastline = "";
831
+ } else if (2 /* READING_DATA */ === state) {
832
+ if (lastline.length > boundary.length + 4) {
833
+ lastline = "";
834
+ }
835
+ if ("--" + boundary === lastline) {
836
+ const j = buffer.length - lastline.length;
837
+ const part = buffer.slice(0, j - 1);
838
+ allParts.push(process$1(part, currentPartHeaders));
839
+ buffer = [];
840
+ currentPartHeaders = [];
841
+ lastline = "";
842
+ state = 3 /* READING_PART_SEPARATOR */;
843
+ } else {
844
+ buffer.push(currByte);
845
+ }
846
+ if (newLineDetected) {
847
+ lastline = "";
848
+ }
849
+ } else if (3 /* READING_PART_SEPARATOR */ === state && newLineDetected) {
850
+ state = 1 /* READING_HEADERS */;
851
+ }
852
+ }
853
+ return allParts;
854
+ }
855
+ function process$1(data, headers) {
856
+ const dataObj = {};
857
+ const contentDispositionHeader = headers.find((h) => h[0] === "content-disposition")?.[1] || "";
858
+ for (const i of contentDispositionHeader.split(";")) {
859
+ const s = i.split("=");
860
+ if (s.length !== 2) {
861
+ continue;
862
+ }
863
+ const key = (s[0] || "").trim();
864
+ if (key === "name" || key === "filename") {
865
+ const _value = (s[1] || "").trim().replace(/"/g, "");
866
+ dataObj[key] = Buffer.from(_value, "latin1").toString("utf8");
867
+ }
868
+ }
869
+ const contentType = headers.find((h) => h[0] === "content-type")?.[1] || "";
870
+ if (contentType) {
871
+ dataObj.type = contentType;
872
+ }
873
+ dataObj.data = Buffer.from(data);
874
+ return dataObj;
875
+ }
876
+
799
877
  function getQuery(event) {
800
878
  return getQuery$1(event.path || "");
801
879
  }
@@ -962,6 +1040,21 @@ async function readBody(event, options = {}) {
962
1040
  request[ParsedBodySymbol] = parsed;
963
1041
  return parsed;
964
1042
  }
1043
+ async function readMultipartFormData(event) {
1044
+ const contentType = getRequestHeader(event, "content-type");
1045
+ if (!contentType || !contentType.startsWith("multipart/form-data")) {
1046
+ return;
1047
+ }
1048
+ const boundary = contentType.match(/boundary=([^;]*)(;|$)/i)?.[1];
1049
+ if (!boundary) {
1050
+ return;
1051
+ }
1052
+ const body = await readRawBody(event, false);
1053
+ if (!body) {
1054
+ return;
1055
+ }
1056
+ return parse(body, boundary);
1057
+ }
965
1058
  function getRequestWebStream(event) {
966
1059
  if (!PayloadMethods$1.includes(event.method)) {
967
1060
  return;
@@ -1210,6 +1303,7 @@ const setHeaders = setResponseHeaders;
1210
1303
  function setResponseHeader(event, name, value) {
1211
1304
  event.node.res.setHeader(name, value);
1212
1305
  }
1306
+ const setHeader = setResponseHeader;
1213
1307
  function appendResponseHeader(event, name, value) {
1214
1308
  let current = event.node.res.getHeader(name);
1215
1309
  if (!current) {
@@ -4267,7 +4361,7 @@ function _expandFromEnv(value) {
4267
4361
  const _inlineRuntimeConfig = {
4268
4362
  "app": {
4269
4363
  "baseURL": "/",
4270
- "buildId": "63ad5f37-5b40-456d-8f53-69ff57b4903c",
4364
+ "buildId": "e90c8a2d-9e50-4b58-8019-6b1bf4c8fc6d",
4271
4365
  "buildAssetsDir": "/_nuxt/",
4272
4366
  "cdnURL": ""
4273
4367
  },
@@ -5038,6 +5132,155 @@ function moodFor(usedPct) {
5038
5132
  return "overstuffed";
5039
5133
  }
5040
5134
 
5135
+ const CSV_HEADERS = [
5136
+ "timestamp",
5137
+ "provider",
5138
+ "kind",
5139
+ "session_id",
5140
+ "project",
5141
+ "scope_hash",
5142
+ "model",
5143
+ "cost_usd",
5144
+ "tokens",
5145
+ "input_tokens",
5146
+ "output_tokens",
5147
+ "cache_create",
5148
+ "cache_create_1h",
5149
+ "cache_read"
5150
+ ];
5151
+ function csvCell(value) {
5152
+ if (value === null || value === void 0) return "";
5153
+ const s = String(value);
5154
+ if (/[",\n\r]/.test(s)) return `"${s.replace(/"/g, '""')}"`;
5155
+ return s;
5156
+ }
5157
+ function formatExportCsv(rows) {
5158
+ const lines = [CSV_HEADERS.join(",")];
5159
+ for (const r of rows) {
5160
+ lines.push([
5161
+ csvCell(new Date(r.ts).toISOString()),
5162
+ csvCell(r.provider),
5163
+ csvCell(r.kind),
5164
+ csvCell(r.sessionId),
5165
+ csvCell(r.project),
5166
+ csvCell(r.scopeHash),
5167
+ csvCell(r.model),
5168
+ csvCell(r.costUsd),
5169
+ csvCell(r.tokens),
5170
+ csvCell(r.qtyIn),
5171
+ csvCell(r.qtyOut),
5172
+ csvCell(r.qtyCacheCreate),
5173
+ csvCell(r.qtyCacheCreate1h),
5174
+ csvCell(r.qtyCacheRead)
5175
+ ].join(","));
5176
+ }
5177
+ return `${lines.join("\n")}
5178
+ `;
5179
+ }
5180
+ function formatExportJson(rows) {
5181
+ return `${JSON.stringify(rows.map((r) => ({
5182
+ timestamp: new Date(r.ts).toISOString(),
5183
+ ts: r.ts,
5184
+ provider: r.provider,
5185
+ kind: r.kind,
5186
+ sessionId: r.sessionId,
5187
+ project: r.project,
5188
+ scopeHash: r.scopeHash,
5189
+ model: r.model,
5190
+ costUsd: r.costUsd,
5191
+ tokens: r.tokens,
5192
+ inputTokens: r.qtyIn,
5193
+ outputTokens: r.qtyOut,
5194
+ cacheCreate: r.qtyCacheCreate,
5195
+ cacheCreate1h: r.qtyCacheCreate1h,
5196
+ cacheRead: r.qtyCacheRead
5197
+ })), null, 2)}
5198
+ `;
5199
+ }
5200
+
5201
+ function parsePricesFile(text) {
5202
+ const raw = JSON.parse(text);
5203
+ if (!raw || typeof raw !== "object") throw new Error("prices file must be a JSON object");
5204
+ const obj = raw;
5205
+ const modelsRaw = obj.models && typeof obj.models === "object" && !Array.isArray(obj.models) ? obj.models : obj;
5206
+ const models = {};
5207
+ for (const [key, value] of Object.entries(modelsRaw)) {
5208
+ if (key === "updatedAt" || key === "source" || key === "models") continue;
5209
+ if (!value || typeof value !== "object") continue;
5210
+ const v = value;
5211
+ if (typeof v.input !== "number" || typeof v.output !== "number") {
5212
+ throw new Error(`model ${key}: need numeric input and output (USD per 1M tokens)`);
5213
+ }
5214
+ models[key] = {
5215
+ input: v.input,
5216
+ output: v.output,
5217
+ ...typeof v.cacheWrite5m === "number" ? { cacheWrite5m: v.cacheWrite5m } : {},
5218
+ ...typeof v.cacheWrite1h === "number" ? { cacheWrite1h: v.cacheWrite1h } : {},
5219
+ ...typeof v.cacheRead === "number" ? { cacheRead: v.cacheRead } : {}
5220
+ };
5221
+ }
5222
+ return {
5223
+ updatedAt: typeof obj.updatedAt === "string" ? obj.updatedAt : void 0,
5224
+ source: typeof obj.source === "string" ? obj.source : void 0,
5225
+ models
5226
+ };
5227
+ }
5228
+ function priceTableFromFile(file) {
5229
+ return makePriceTable(file?.models ?? {});
5230
+ }
5231
+
5232
+ const DEFAULT_ALERTS_CONFIG = {
5233
+ limitPct: 80,
5234
+ dailyUsd: null,
5235
+ webhook: null,
5236
+ desktopNotify: false
5237
+ };
5238
+ function parseAlertsConfig(raw) {
5239
+ const base = { ...DEFAULT_ALERTS_CONFIG };
5240
+ if (!raw || typeof raw !== "object") return base;
5241
+ const o = raw;
5242
+ if (o.limitPct === null) base.limitPct = null;
5243
+ else if (typeof o.limitPct === "number" && Number.isFinite(o.limitPct)) {
5244
+ base.limitPct = Math.min(100, Math.max(0, o.limitPct));
5245
+ }
5246
+ if (o.dailyUsd === null) base.dailyUsd = null;
5247
+ else if (typeof o.dailyUsd === "number" && Number.isFinite(o.dailyUsd) && o.dailyUsd >= 0) {
5248
+ base.dailyUsd = o.dailyUsd;
5249
+ }
5250
+ if (o.webhook === null) base.webhook = null;
5251
+ else if (typeof o.webhook === "string" && o.webhook.trim()) base.webhook = o.webhook.trim();
5252
+ if (typeof o.desktopNotify === "boolean") base.desktopNotify = o.desktopNotify;
5253
+ return base;
5254
+ }
5255
+ function evaluateAlerts(config, input) {
5256
+ const hits = [];
5257
+ if (config.limitPct !== null) {
5258
+ for (const lim of input.limits) {
5259
+ if (lim.usedPct >= config.limitPct) {
5260
+ hits.push({
5261
+ id: `limit:${lim.provider}:${lim.window}`,
5262
+ kind: "limit",
5263
+ message: `${lim.provider} ${lim.window} window at ${lim.usedPct.toFixed(1)}% (threshold ${config.limitPct}%)`,
5264
+ value: lim.usedPct,
5265
+ threshold: config.limitPct,
5266
+ provider: lim.provider,
5267
+ window: lim.window
5268
+ });
5269
+ }
5270
+ }
5271
+ }
5272
+ if (config.dailyUsd !== null && input.todayCostUsd >= config.dailyUsd) {
5273
+ hits.push({
5274
+ id: "daily:usd",
5275
+ kind: "daily",
5276
+ message: `Today's spend $${input.todayCostUsd.toFixed(2)} (threshold $${config.dailyUsd.toFixed(2)})`,
5277
+ value: input.todayCostUsd,
5278
+ threshold: config.dailyUsd
5279
+ });
5280
+ }
5281
+ return hits;
5282
+ }
5283
+
5041
5284
  class Repo {
5042
5285
  constructor(sqlite) {
5043
5286
  this.sqlite = sqlite;
@@ -5394,6 +5637,104 @@ class Queries {
5394
5637
  bounds() {
5395
5638
  return this.sqlite.prepare("SELECT MIN(ts) AS first, MAX(ts) AS last, COUNT(*) AS events FROM events").get();
5396
5639
  }
5640
+ /**
5641
+ * Flat event rows for CSV/JSON export. Joins the local scope label when known.
5642
+ * Caps at `limit` so a mistaken "all time" dump cannot OOM the process.
5643
+ */
5644
+ exportEvents(f = {}, limit = 1e5) {
5645
+ const w = buildWhere(f);
5646
+ const params = { ...w.params, limit };
5647
+ return this.sqlite.prepare(`
5648
+ SELECT
5649
+ e.id AS id,
5650
+ e.ts AS ts,
5651
+ e.provider AS provider,
5652
+ e.kind AS kind,
5653
+ e.session_id AS sessionId,
5654
+ e.scope_hash AS scopeHash,
5655
+ s.label AS project,
5656
+ e.unit_label AS model,
5657
+ e.cost_usd AS costUsd,
5658
+ e.qty_total AS tokens,
5659
+ e.qty_json AS qtyJson,
5660
+ e.meta_json AS metaJson
5661
+ FROM events e
5662
+ LEFT JOIN scopes s ON s.scope_hash = e.scope_hash
5663
+ ${w.sql}
5664
+ ORDER BY e.ts ASC
5665
+ LIMIT @limit
5666
+ `).all(params).map((row) => {
5667
+ const r = row;
5668
+ const qty = JSON.parse(r.qtyJson);
5669
+ return {
5670
+ id: r.id,
5671
+ ts: r.ts,
5672
+ provider: r.provider,
5673
+ kind: r.kind,
5674
+ sessionId: r.sessionId,
5675
+ scopeHash: r.scopeHash,
5676
+ project: r.project,
5677
+ model: r.model,
5678
+ costUsd: r.costUsd,
5679
+ tokens: r.tokens,
5680
+ qtyIn: qty.in ?? 0,
5681
+ qtyOut: qty.out ?? 0,
5682
+ qtyCacheCreate: qty.cacheCreate ?? 0,
5683
+ qtyCacheCreate1h: qty.cacheCreate1h ?? 0,
5684
+ qtyCacheRead: qty.cacheRead ?? 0,
5685
+ meta: JSON.parse(r.metaJson)
5686
+ };
5687
+ });
5688
+ }
5689
+ }
5690
+
5691
+ function defaultPricesPath() {
5692
+ return join(defaultDataDir(), "prices.json");
5693
+ }
5694
+ function loadPriceTable(path = defaultPricesPath()) {
5695
+ if (!existsSync(path)) {
5696
+ return { prices: priceTableFromFile(null), file: null, path };
5697
+ }
5698
+ try {
5699
+ const file = parsePricesFile(readFileSync(path, "utf8"));
5700
+ return { prices: priceTableFromFile(file), file, path };
5701
+ } catch {
5702
+ return { prices: priceTableFromFile(null), file: null, path };
5703
+ }
5704
+ }
5705
+
5706
+ function defaultAlertsPath() {
5707
+ return join(defaultDataDir(), "alerts.json");
5708
+ }
5709
+ function loadAlertsConfig(path = defaultAlertsPath()) {
5710
+ if (!existsSync(path)) {
5711
+ return { config: { ...DEFAULT_ALERTS_CONFIG }, path, exists: false };
5712
+ }
5713
+ try {
5714
+ const raw = JSON.parse(readFileSync(path, "utf8"));
5715
+ return { config: parseAlertsConfig(raw), path, exists: true };
5716
+ } catch {
5717
+ return { config: { ...DEFAULT_ALERTS_CONFIG }, path, exists: false };
5718
+ }
5719
+ }
5720
+ function saveAlertsConfig(config, path = defaultAlertsPath()) {
5721
+ mkdirSync(defaultDataDir(), { recursive: true });
5722
+ writeFileSync(path, `${JSON.stringify(config, null, 2)}
5723
+ `, "utf8");
5724
+ }
5725
+ function checkAlerts(q, config, now = Date.now()) {
5726
+ const cfg = config ?? loadAlertsConfig().config;
5727
+ const todayCostUsd = q.totals({ from: bucketStart(now, "day"), kind: "tokens" }).costUsd;
5728
+ const limits = q.limitWindows().map((w) => {
5729
+ const snapshots = q.limitSnapshots(w.provider, w.window, now - 14 * 24 * 36e5);
5730
+ const forecast = forecastLimit(snapshots, now);
5731
+ return forecast ? { provider: forecast.provider, window: forecast.window, usedPct: forecast.usedPct } : null;
5732
+ }).filter((x) => x !== null);
5733
+ return {
5734
+ config: cfg,
5735
+ hits: evaluateAlerts(cfg, { todayCostUsd, limits }),
5736
+ todayCostUsd
5737
+ };
5397
5738
  }
5398
5739
 
5399
5740
  let handle = null;
@@ -6401,12 +6742,143 @@ class CursorAdapter {
6401
6742
  }
6402
6743
  }
6403
6744
 
6404
- function allAdapters() {
6405
- return [new ClaudeCodeAdapter(), new CursorAdapter(), new CodexAdapter()];
6745
+ function parseCsv(text) {
6746
+ const rows = [];
6747
+ let row = [];
6748
+ let field = "";
6749
+ let quoted = false;
6750
+ for (let i = 0; i < text.length; i++) {
6751
+ const c = text[i];
6752
+ if (quoted) {
6753
+ if (c === '"') {
6754
+ if (text[i + 1] === '"') {
6755
+ field += '"';
6756
+ i++;
6757
+ } else quoted = false;
6758
+ } else field += c;
6759
+ continue;
6760
+ }
6761
+ if (c === '"') quoted = true;
6762
+ else if (c === ",") {
6763
+ row.push(field);
6764
+ field = "";
6765
+ } else if (c === "\n" || c === "\r") {
6766
+ if (c === "\r" && text[i + 1] === "\n") i++;
6767
+ row.push(field);
6768
+ field = "";
6769
+ if (row.length > 1 || row[0] !== "") rows.push(row);
6770
+ row = [];
6771
+ } else field += c;
6772
+ }
6773
+ if (field !== "" || row.length > 0) {
6774
+ row.push(field);
6775
+ rows.push(row);
6776
+ }
6777
+ return rows;
6778
+ }
6779
+ const TS_KEYS = ["ts", "timestamp", "date", "time", "created_at", "day"];
6780
+ const COST_KEYS = ["cost", "cost_usd", "costusd", "amount", "usd", "spend"];
6781
+ const MODEL_KEYS = ["model", "sku", "unit", "unit_label", "resource"];
6782
+ const SCOPE_KEYS = ["project", "scope", "workspace", "repo", "folder"];
6783
+ const SESSION_KEYS = ["session", "session_id", "conversation", "request_group"];
6784
+ const QTY_KEYS = {
6785
+ in: ["input_tokens", "input", "prompt_tokens", "in"],
6786
+ out: ["output_tokens", "output", "completion_tokens", "out"],
6787
+ cacheCreate: ["cache_creation_input_tokens", "cache_write", "cache_create"],
6788
+ cacheRead: ["cache_read_input_tokens", "cache_read"],
6789
+ minutes: ["minutes", "duration_minutes"],
6790
+ requests: ["requests", "calls", "count"]
6791
+ };
6792
+ function normalise(header) {
6793
+ return header.trim().toLowerCase().replace(/[\s-]+/g, "_");
6794
+ }
6795
+ function findColumn(headers, candidates) {
6796
+ for (const candidate of candidates) {
6797
+ const i = headers.indexOf(candidate);
6798
+ if (i !== -1) return i;
6799
+ }
6800
+ return -1;
6801
+ }
6802
+ function toNumber(v) {
6803
+ if (!v) return 0;
6804
+ const cleaned = v.replace(/[^0-9.\-eE]/g, "");
6805
+ const n = Number.parseFloat(cleaned);
6806
+ return Number.isFinite(n) ? n : 0;
6807
+ }
6808
+ async function hashRow(cells) {
6809
+ return scopeHash(cells.join("\0"));
6810
+ }
6811
+ async function importCsv(text, opts = {}) {
6812
+ const rows = parseCsv(text);
6813
+ if (rows.length < 2) return [];
6814
+ const provider = opts.provider ?? "csv";
6815
+ const kind = opts.kind ?? "tokens";
6816
+ const prices = opts.prices ?? defaultPrices;
6817
+ const headers = rows[0].map(normalise);
6818
+ const body = rows.slice(1);
6819
+ const col = {
6820
+ ts: opts.columns?.ts ? headers.indexOf(normalise(opts.columns.ts)) : findColumn(headers, TS_KEYS),
6821
+ cost: opts.columns?.cost ? headers.indexOf(normalise(opts.columns.cost)) : findColumn(headers, COST_KEYS),
6822
+ model: opts.columns?.model ? headers.indexOf(normalise(opts.columns.model)) : findColumn(headers, MODEL_KEYS),
6823
+ scope: opts.columns?.scope ? headers.indexOf(normalise(opts.columns.scope)) : findColumn(headers, SCOPE_KEYS),
6824
+ session: opts.columns?.session ? headers.indexOf(normalise(opts.columns.session)) : findColumn(headers, SESSION_KEYS)
6825
+ };
6826
+ if (col.ts === -1) {
6827
+ throw new Error(
6828
+ `CSV has no recognisable timestamp column. Looked for: ${TS_KEYS.join(", ")}. Found: ${headers.join(", ")}. Pass columns.ts to name it explicitly.`
6829
+ );
6830
+ }
6831
+ const qtyCols = [];
6832
+ for (const [key, candidates] of Object.entries(QTY_KEYS)) {
6833
+ const override = opts.columns?.qty?.[key];
6834
+ const i = override ? headers.indexOf(normalise(override)) : findColumn(headers, candidates);
6835
+ if (i !== -1) qtyCols.push([key, i]);
6836
+ }
6837
+ const records = [];
6838
+ const seenScopes = /* @__PURE__ */ new Set();
6839
+ for (const cells of body) {
6840
+ const tsRaw = cells[col.ts];
6841
+ const ts = tsRaw ? Date.parse(tsRaw) : Number.NaN;
6842
+ if (!Number.isFinite(ts)) continue;
6843
+ const qty = {};
6844
+ for (const [key, i] of qtyCols) qty[key] = toNumber(cells[i]);
6845
+ const model = col.model !== -1 ? cells[col.model] ?? null : null;
6846
+ const scopeLabelValue = col.scope !== -1 ? cells[col.scope] : void 0;
6847
+ const hash = scopeLabelValue ? await scopeHash(scopeLabelValue) : "csv-import";
6848
+ if (scopeLabelValue && !seenScopes.has(hash)) {
6849
+ seenScopes.add(hash);
6850
+ records.push({ type: "scope", scopeHash: hash, label: scopeLabelValue, provider });
6851
+ }
6852
+ const explicitCost = col.cost !== -1 ? toNumber(cells[col.cost]) : null;
6853
+ const event = {
6854
+ // hashing the whole row makes re-importing the same export idempotent
6855
+ id: `${provider}:${await hashRow(cells)}`,
6856
+ ts,
6857
+ provider,
6858
+ kind,
6859
+ sessionId: col.session !== -1 ? cells[col.session] ?? null : null,
6860
+ scopeHash: hash,
6861
+ unitLabel: model,
6862
+ qty,
6863
+ costUsd: explicitCost !== null && explicitCost !== 0 ? explicitCost : costOf(model, qty, prices),
6864
+ meta: {}
6865
+ };
6866
+ records.push({ type: "event", event });
6867
+ }
6868
+ return records;
6406
6869
  }
6407
- async function detectAdapters() {
6870
+
6871
+ function allAdapters(opts = {}) {
6872
+ const prices = opts.prices;
6873
+ return [
6874
+ new ClaudeCodeAdapter({ prices }),
6875
+ new CursorAdapter({ prices }),
6876
+ new CodexAdapter({ prices })
6877
+ ];
6878
+ }
6879
+ async function detectAdapters(opts = {}) {
6408
6880
  const found = [];
6409
- for (const adapter of allAdapters()) {
6881
+ for (const adapter of allAdapters(opts)) {
6410
6882
  if (await adapter.detect()) found.push(adapter);
6411
6883
  }
6412
6884
  return found;
@@ -6415,7 +6887,8 @@ async function detectAdapters() {
6415
6887
  const _tolCGru6ORo9RnI_NJIuE_VvAmdkQavU2Y9IpSCD4 = defineNitroPlugin((nitro) => {
6416
6888
  if (process.env.NOMNOMTOKENS_NO_WATCH === "1") return;
6417
6889
  const stops = [];
6418
- void detectAdapters().then((adapters) => {
6890
+ const { prices } = loadPriceTable();
6891
+ void detectAdapters({ prices }).then((adapters) => {
6419
6892
  for (const adapter of adapters) {
6420
6893
  if (!adapter.watch) continue;
6421
6894
  stops.push(
@@ -6437,292 +6910,355 @@ const plugins = [
6437
6910
  ];
6438
6911
 
6439
6912
  const assets = {
6913
+ "/_nuxt/4C_a23zt.js": {
6914
+ "type": "text/javascript; charset=utf-8",
6915
+ "etag": "\"16a2-Gdsy29q0zMrP+lLHFcGnZHiJbz4\"",
6916
+ "mtime": "2026-08-07T20:13:31.614Z",
6917
+ "size": 5794,
6918
+ "path": "../public/_nuxt/4C_a23zt.js"
6919
+ },
6920
+ "/_nuxt/B1jhn8zK.js": {
6921
+ "type": "text/javascript; charset=utf-8",
6922
+ "etag": "\"7e9-qGrGSSmgSzb+xKWSbHHfyGDKO2s\"",
6923
+ "mtime": "2026-08-07T20:13:31.614Z",
6924
+ "size": 2025,
6925
+ "path": "../public/_nuxt/B1jhn8zK.js"
6926
+ },
6440
6927
  "/favicon.svg": {
6441
6928
  "type": "image/svg+xml",
6442
6929
  "etag": "\"263-juunZqrRwMD1/tfqspKdbqgLuek\"",
6443
- "mtime": "2026-08-07T17:04:22.376Z",
6930
+ "mtime": "2026-08-07T20:13:31.619Z",
6444
6931
  "size": 611,
6445
6932
  "path": "../public/favicon.svg"
6446
6933
  },
6447
- "/_nuxt/075nz0Lp.js": {
6934
+ "/_nuxt/BAfR3Wl32.js": {
6448
6935
  "type": "text/javascript; charset=utf-8",
6449
- "etag": "\"7e0-Aogpud1rnqBqzmsXlfr3NYh5gZU\"",
6450
- "mtime": "2026-08-07T17:04:22.372Z",
6451
- "size": 2016,
6452
- "path": "../public/_nuxt/075nz0Lp.js"
6936
+ "etag": "\"d71-2Q0jBWPkETEZr/VFEiejroUFCA0\"",
6937
+ "mtime": "2026-08-07T20:13:31.614Z",
6938
+ "size": 3441,
6939
+ "path": "../public/_nuxt/BAfR3Wl32.js"
6453
6940
  },
6454
- "/_nuxt/B7bAnU98.js": {
6941
+ "/_nuxt/B2aHje2L.js": {
6455
6942
  "type": "text/javascript; charset=utf-8",
6456
- "etag": "\"1bba-6GrVdzzpN7kS8RRN0gPKsAwTmVo\"",
6457
- "mtime": "2026-08-07T17:04:22.372Z",
6458
- "size": 7098,
6459
- "path": "../public/_nuxt/B7bAnU98.js"
6460
- },
6461
- "/_nuxt/B1O-ibEy.js": {
6462
- "type": "text/javascript; charset=utf-8",
6463
- "etag": "\"27a2a-1cN4KVJtW9Xo7AmS2oIznMsTcWs\"",
6464
- "mtime": "2026-08-07T17:04:22.372Z",
6465
- "size": 162346,
6466
- "path": "../public/_nuxt/B1O-ibEy.js"
6943
+ "etag": "\"fa2-UgkB8XZUGrGw7XvxEcxYq9J/vvo\"",
6944
+ "mtime": "2026-08-07T20:13:31.614Z",
6945
+ "size": 4002,
6946
+ "path": "../public/_nuxt/B2aHje2L.js"
6467
6947
  },
6468
- "/_nuxt/BDF8cO8j.js": {
6948
+ "/_nuxt/BMSLzLlT.js": {
6469
6949
  "type": "text/javascript; charset=utf-8",
6470
- "etag": "\"ecd-+4uCuMBs5ci4fAW6DBf5p+SNA9w\"",
6471
- "mtime": "2026-08-07T17:04:22.372Z",
6472
- "size": 3789,
6473
- "path": "../public/_nuxt/BDF8cO8j.js"
6950
+ "etag": "\"1d50-ZBP+gIQegZzzPv/cFYg6FWxeHP8\"",
6951
+ "mtime": "2026-08-07T20:13:31.614Z",
6952
+ "size": 7504,
6953
+ "path": "../public/_nuxt/BMSLzLlT.js"
6474
6954
  },
6475
- "/_nuxt/BDNMzG2s.js": {
6955
+ "/_nuxt/BDNMzG2s2.js": {
6476
6956
  "type": "text/javascript; charset=utf-8",
6477
6957
  "etag": "\"54-MasMfSk/A98C3Gn9uIOxtFxkWNw\"",
6478
- "mtime": "2026-08-07T17:04:22.372Z",
6958
+ "mtime": "2026-08-07T20:13:31.614Z",
6479
6959
  "size": 84,
6480
- "path": "../public/_nuxt/BDNMzG2s.js"
6960
+ "path": "../public/_nuxt/BDNMzG2s2.js"
6481
6961
  },
6482
- "/_nuxt/BGnU88BC.js": {
6962
+ "/_nuxt/BOKlFKrX.js": {
6483
6963
  "type": "text/javascript; charset=utf-8",
6484
- "etag": "\"b66-tRTY+hI78+Et7avpK1xee7+UsYY\"",
6485
- "mtime": "2026-08-07T17:04:22.372Z",
6486
- "size": 2918,
6487
- "path": "../public/_nuxt/BGnU88BC.js"
6964
+ "etag": "\"2f9-mpAJAzDbm3lWDNE2Us/ynG6SplU\"",
6965
+ "mtime": "2026-08-07T20:13:31.614Z",
6966
+ "size": 761,
6967
+ "path": "../public/_nuxt/BOKlFKrX.js"
6488
6968
  },
6489
- "/_nuxt/BPhzhJvP.js": {
6969
+ "/_nuxt/Ba6z8j_4.js": {
6490
6970
  "type": "text/javascript; charset=utf-8",
6491
- "etag": "\"c53-VYQNoz4P3En/ILKpkWyzTIARRsY\"",
6492
- "mtime": "2026-08-07T17:04:22.372Z",
6493
- "size": 3155,
6494
- "path": "../public/_nuxt/BPhzhJvP.js"
6971
+ "etag": "\"580-XaU3KnhVwIuj73p6gumS/zGKKFo\"",
6972
+ "mtime": "2026-08-07T20:13:31.614Z",
6973
+ "size": 1408,
6974
+ "path": "../public/_nuxt/Ba6z8j_4.js"
6495
6975
  },
6496
- "/_nuxt/BgaLDD2o.js": {
6976
+ "/_nuxt/Bag9D5rq.js": {
6497
6977
  "type": "text/javascript; charset=utf-8",
6498
- "etag": "\"6fa6-TOTf3aj9wbyDDupkxmLbchtyVIk\"",
6499
- "mtime": "2026-08-07T17:04:22.372Z",
6500
- "size": 28582,
6501
- "path": "../public/_nuxt/BgaLDD2o.js"
6978
+ "etag": "\"27a2a-Q3/39nbR7m5qjPz9T2wtmzzeOf8\"",
6979
+ "mtime": "2026-08-07T20:13:31.614Z",
6980
+ "size": 162346,
6981
+ "path": "../public/_nuxt/Bag9D5rq.js"
6502
6982
  },
6503
- "/_nuxt/BgvEQa6E.js": {
6983
+ "/_nuxt/Bia8fJFj.js": {
6504
6984
  "type": "text/javascript; charset=utf-8",
6505
- "etag": "\"14816-WEdXE2i38gSmF/ufSmvmDhXquYw\"",
6506
- "mtime": "2026-08-07T17:04:22.372Z",
6507
- "size": 83990,
6508
- "path": "../public/_nuxt/BgvEQa6E.js"
6985
+ "etag": "\"49e-cs/mViJSj2L2nQ5PEJMj29SJ4Zo\"",
6986
+ "mtime": "2026-08-07T20:13:31.614Z",
6987
+ "size": 1182,
6988
+ "path": "../public/_nuxt/Bia8fJFj.js"
6509
6989
  },
6510
- "/_nuxt/BioUjjBz.js": {
6990
+ "/_nuxt/Bprokln-.js": {
6511
6991
  "type": "text/javascript; charset=utf-8",
6512
- "etag": "\"21e-Or1mXnHmWX9rYHjnH61OSRMBkX4\"",
6513
- "mtime": "2026-08-07T17:04:22.372Z",
6514
- "size": 542,
6515
- "path": "../public/_nuxt/BioUjjBz.js"
6992
+ "etag": "\"618-oypP50jwTlr4oE71O9fz+WNyiJ0\"",
6993
+ "mtime": "2026-08-07T20:13:31.614Z",
6994
+ "size": 1560,
6995
+ "path": "../public/_nuxt/Bprokln-.js"
6516
6996
  },
6517
- "/_nuxt/BlvSknce.js": {
6997
+ "/_nuxt/C9MiT_Wm.js": {
6518
6998
  "type": "text/javascript; charset=utf-8",
6519
- "etag": "\"c99-HUu6ruzI2ttAThOnjhNrf2GDJ7g\"",
6520
- "mtime": "2026-08-07T17:04:22.372Z",
6521
- "size": 3225,
6522
- "path": "../public/_nuxt/BlvSknce.js"
6999
+ "etag": "\"b9bc-rXOdAMXkECl1vE2WM4YUQWAU8Zw\"",
7000
+ "mtime": "2026-08-07T20:13:31.615Z",
7001
+ "size": 47548,
7002
+ "path": "../public/_nuxt/C9MiT_Wm.js"
6523
7003
  },
6524
- "/_nuxt/Bn14i44R.js": {
7004
+ "/_nuxt/CIHIOSzn.js": {
6525
7005
  "type": "text/javascript; charset=utf-8",
6526
- "etag": "\"37ee-OzqkfE0fY7/2JzkqS4JUk6Lx5g4\"",
6527
- "mtime": "2026-08-07T17:04:22.373Z",
6528
- "size": 14318,
6529
- "path": "../public/_nuxt/Bn14i44R.js"
7006
+ "etag": "\"1f00-HDIEoZ+eo9wBDoPnRWHyU9wWODM\"",
7007
+ "mtime": "2026-08-07T20:13:31.615Z",
7008
+ "size": 7936,
7009
+ "path": "../public/_nuxt/CIHIOSzn.js"
6530
7010
  },
6531
- "/_nuxt/BnfUOzcc.js": {
7011
+ "/_nuxt/CIKwfDBl.js": {
6532
7012
  "type": "text/javascript; charset=utf-8",
6533
- "etag": "\"133a-slOoUEHxfdd9ZiYCYOQjFR6AJ4I\"",
6534
- "mtime": "2026-08-07T17:04:22.373Z",
6535
- "size": 4922,
6536
- "path": "../public/_nuxt/BnfUOzcc.js"
7013
+ "etag": "\"7f0-wUsYxcgvf7ndY4zX+3rRY+iAN1w\"",
7014
+ "mtime": "2026-08-07T20:13:31.615Z",
7015
+ "size": 2032,
7016
+ "path": "../public/_nuxt/CIKwfDBl.js"
6537
7017
  },
6538
- "/_nuxt/Bv0odo9W.js": {
7018
+ "/_nuxt/COwSpxrx.js": {
6539
7019
  "type": "text/javascript; charset=utf-8",
6540
- "etag": "\"9bb6-S5fHQg1zrgmiKHV0szdq+Pky9kM\"",
6541
- "mtime": "2026-08-07T17:04:22.373Z",
6542
- "size": 39862,
6543
- "path": "../public/_nuxt/Bv0odo9W.js"
7020
+ "etag": "\"187-TcW/UYquWHNJBJSnbqbjRgokGkU\"",
7021
+ "mtime": "2026-08-07T20:13:31.615Z",
7022
+ "size": 391,
7023
+ "path": "../public/_nuxt/COwSpxrx.js"
6544
7024
  },
6545
- "/_nuxt/Bxx0Z5z6.js": {
7025
+ "/_nuxt/CZSbzIi-.js": {
6546
7026
  "type": "text/javascript; charset=utf-8",
6547
- "etag": "\"d70-8oh7xMrStIaNW+hPclbryedg5fc\"",
6548
- "mtime": "2026-08-07T17:04:22.373Z",
6549
- "size": 3440,
6550
- "path": "../public/_nuxt/Bxx0Z5z6.js"
7027
+ "etag": "\"e5b-ivAZQIl89+55PFCmpn4ZVTeqlI8\"",
7028
+ "mtime": "2026-08-07T20:13:31.615Z",
7029
+ "size": 3675,
7030
+ "path": "../public/_nuxt/CZSbzIi-.js"
6551
7031
  },
6552
- "/_nuxt/CiWIPYVi.js": {
7032
+ "/_nuxt/CDzUujek.js": {
6553
7033
  "type": "text/javascript; charset=utf-8",
6554
- "etag": "\"8c8-mq8xgiFJtTcvZTpPwR9ZheEymVo\"",
6555
- "mtime": "2026-08-07T17:04:22.373Z",
6556
- "size": 2248,
6557
- "path": "../public/_nuxt/CiWIPYVi.js"
7034
+ "etag": "\"d71b-/uLxwcfdeJjVK88AGXUIJhPI7mo\"",
7035
+ "mtime": "2026-08-07T20:13:31.615Z",
7036
+ "size": 55067,
7037
+ "path": "../public/_nuxt/CDzUujek.js"
6558
7038
  },
6559
- "/_nuxt/CqSNCP5f.js": {
7039
+ "/_nuxt/CfBMjq8x.js": {
6560
7040
  "type": "text/javascript; charset=utf-8",
6561
- "etag": "\"127f-XLdvFRlxXT5Ki6+exQ4zXSIvmDs\"",
6562
- "mtime": "2026-08-07T17:04:22.373Z",
6563
- "size": 4735,
6564
- "path": "../public/_nuxt/CqSNCP5f.js"
7041
+ "etag": "\"c5b-E7xZQ6J4MEdqhDJpzqfNW8Ck3bI\"",
7042
+ "mtime": "2026-08-07T20:13:31.615Z",
7043
+ "size": 3163,
7044
+ "path": "../public/_nuxt/CfBMjq8x.js"
6565
7045
  },
6566
- "/_nuxt/Ctg1e1JV.js": {
7046
+ "/_nuxt/Ch3y3mGJ.js": {
6567
7047
  "type": "text/javascript; charset=utf-8",
6568
- "etag": "\"18c-GxKCG6WM2MtMEd9fRjXrq+vSo+8\"",
6569
- "mtime": "2026-08-07T17:04:22.373Z",
6570
- "size": 396,
6571
- "path": "../public/_nuxt/Ctg1e1JV.js"
7048
+ "etag": "\"89-m1vODV+ILC80Lvb9yLA9lJez8Yg\"",
7049
+ "mtime": "2026-08-07T20:13:31.615Z",
7050
+ "size": 137,
7051
+ "path": "../public/_nuxt/Ch3y3mGJ.js"
6572
7052
  },
6573
- "/_nuxt/Cu3rIkF2.js": {
7053
+ "/_nuxt/CkRZsevx.js": {
6574
7054
  "type": "text/javascript; charset=utf-8",
6575
- "etag": "\"4210-x/nSP1KoJfXA0QI4EBtnrMwA/hs\"",
6576
- "mtime": "2026-08-07T17:04:22.373Z",
6577
- "size": 16912,
6578
- "path": "../public/_nuxt/Cu3rIkF2.js"
7055
+ "etag": "\"1bba-38HUFiDLkDdlz+/v9Pw+R//K39o\"",
7056
+ "mtime": "2026-08-07T20:13:31.615Z",
7057
+ "size": 7098,
7058
+ "path": "../public/_nuxt/CkRZsevx.js"
6579
7059
  },
6580
- "/_nuxt/Cutk9Ewh.js": {
7060
+ "/_nuxt/C51OzH6V.js": {
6581
7061
  "type": "text/javascript; charset=utf-8",
6582
- "etag": "\"1361-y9zOgeHDkgb9DBsRfKGEyFByQcs\"",
6583
- "mtime": "2026-08-07T17:04:22.373Z",
6584
- "size": 4961,
6585
- "path": "../public/_nuxt/Cutk9Ewh.js"
7062
+ "etag": "\"14e-2XHOwYK6yKvv3u/CtAwyVxzMscg\"",
7063
+ "mtime": "2026-08-07T20:13:31.615Z",
7064
+ "size": 334,
7065
+ "path": "../public/_nuxt/C51OzH6V.js"
6586
7066
  },
6587
- "/_nuxt/DCVp7cZB.js": {
7067
+ "/_nuxt/Cq1Sq3Go.js": {
6588
7068
  "type": "text/javascript; charset=utf-8",
6589
- "etag": "\"b981-cobSfGhHKBBgDerHY4d185s9sOU\"",
6590
- "mtime": "2026-08-07T17:04:22.373Z",
6591
- "size": 47489,
6592
- "path": "../public/_nuxt/DCVp7cZB.js"
7069
+ "etag": "\"8e3-6Jz0mfjFUwf4/vztcAUFCCQS17k\"",
7070
+ "mtime": "2026-08-07T20:13:31.615Z",
7071
+ "size": 2275,
7072
+ "path": "../public/_nuxt/Cq1Sq3Go.js"
6593
7073
  },
6594
- "/_nuxt/DCnkQFS0.js": {
7074
+ "/_nuxt/CsN_oUfs.js": {
6595
7075
  "type": "text/javascript; charset=utf-8",
6596
- "etag": "\"2416-qe8/BYdDc6EhkvJ4cCYz+y+PqTg\"",
6597
- "mtime": "2026-08-07T17:04:22.373Z",
7076
+ "etag": "\"2416-KWow0zCR3ozDXJgGJaubEXJpIww\"",
7077
+ "mtime": "2026-08-07T20:13:31.615Z",
6598
7078
  "size": 9238,
6599
- "path": "../public/_nuxt/DCnkQFS0.js"
7079
+ "path": "../public/_nuxt/CsN_oUfs.js"
6600
7080
  },
6601
- "/_nuxt/DJbGqyvB.js": {
7081
+ "/_nuxt/CvIugsJe2.js": {
6602
7082
  "type": "text/javascript; charset=utf-8",
6603
- "etag": "\"735-TtF0zc2iEeOTDOVEIIZ7xk//Fyg\"",
6604
- "mtime": "2026-08-07T17:04:22.373Z",
6605
- "size": 1845,
6606
- "path": "../public/_nuxt/DJbGqyvB.js"
7083
+ "etag": "\"12d0-Fzh8ftK2kBd6YkC5S0SrKTbkfE8\"",
7084
+ "mtime": "2026-08-07T20:13:31.615Z",
7085
+ "size": 4816,
7086
+ "path": "../public/_nuxt/CvIugsJe2.js"
6607
7087
  },
6608
- "/_nuxt/DMT7tA5C.js": {
7088
+ "/_nuxt/D4C6J8YV.js": {
6609
7089
  "type": "text/javascript; charset=utf-8",
6610
- "etag": "\"16a2-P2WnRPbEBNCOoAoZrTj7yLLs6f0\"",
6611
- "mtime": "2026-08-07T17:04:22.373Z",
6612
- "size": 5794,
6613
- "path": "../public/_nuxt/DMT7tA5C.js"
7090
+ "etag": "\"824-/8gRX19zb6EmVkCWzsl0xT/8K10\"",
7091
+ "mtime": "2026-08-07T20:13:31.615Z",
7092
+ "size": 2084,
7093
+ "path": "../public/_nuxt/D4C6J8YV.js"
6614
7094
  },
6615
- "/_nuxt/M0pG6UQn.js": {
7095
+ "/_nuxt/D49wVVwm2.js": {
6616
7096
  "type": "text/javascript; charset=utf-8",
6617
- "etag": "\"4a3-5mqOvT7pmm/r0//ijTOqoNZoy0c\"",
6618
- "mtime": "2026-08-07T17:04:22.373Z",
6619
- "size": 1187,
6620
- "path": "../public/_nuxt/M0pG6UQn.js"
7097
+ "etag": "\"ece-0kq3eXx5luZospE2DGG/0xV9uBs\"",
7098
+ "mtime": "2026-08-07T20:13:31.615Z",
7099
+ "size": 3790,
7100
+ "path": "../public/_nuxt/D49wVVwm2.js"
6621
7101
  },
6622
- "/_nuxt/RlymLGHS.js": {
7102
+ "/_nuxt/D7Ph0tZD.js": {
6623
7103
  "type": "text/javascript; charset=utf-8",
6624
- "etag": "\"7ed-EkR6Mjsl5NwqAlM8LWCbgd9uOdw\"",
6625
- "mtime": "2026-08-07T17:04:22.373Z",
7104
+ "etag": "\"21e-I+1AEB4oYBPoNJ6rI2apwo7wC0k\"",
7105
+ "mtime": "2026-08-07T20:13:31.615Z",
7106
+ "size": 542,
7107
+ "path": "../public/_nuxt/D7Ph0tZD.js"
7108
+ },
7109
+ "/_nuxt/D9Mxq5ER.js": {
7110
+ "type": "text/javascript; charset=utf-8",
7111
+ "etag": "\"540-8Rbl5uPJu7ZeuYT0kyGqXUZrHEk\"",
7112
+ "mtime": "2026-08-07T20:13:31.615Z",
7113
+ "size": 1344,
7114
+ "path": "../public/_nuxt/D9Mxq5ER.js"
7115
+ },
7116
+ "/_nuxt/D9j6aFUy.js": {
7117
+ "type": "text/javascript; charset=utf-8",
7118
+ "etag": "\"7ed-tzlB7uAWjEwAhWyWR8wPZa9tXxo\"",
7119
+ "mtime": "2026-08-07T20:13:31.616Z",
6626
7120
  "size": 2029,
6627
- "path": "../public/_nuxt/RlymLGHS.js"
7121
+ "path": "../public/_nuxt/D9j6aFUy.js"
6628
7122
  },
6629
- "/_nuxt/TmkSb4nj.js": {
7123
+ "/_nuxt/DMgad8mU.js": {
6630
7124
  "type": "text/javascript; charset=utf-8",
6631
- "etag": "\"7e9-spVw4H8S6iGiEhYRzwOhEMJZNrE\"",
6632
- "mtime": "2026-08-07T17:04:22.373Z",
6633
- "size": 2025,
6634
- "path": "../public/_nuxt/TmkSb4nj.js"
7125
+ "etag": "\"18ef-NHuAdslmwNckjjVzqI1N9Ak++g0\"",
7126
+ "mtime": "2026-08-07T20:13:31.616Z",
7127
+ "size": 6383,
7128
+ "path": "../public/_nuxt/DMgad8mU.js"
6635
7129
  },
6636
- "/_nuxt/_S09PGd-.js": {
7130
+ "/_nuxt/DPnm6zS2.js": {
6637
7131
  "type": "text/javascript; charset=utf-8",
6638
- "etag": "\"484-71c7PoWlMihymnUWw/yj9Yl/+Mw\"",
6639
- "mtime": "2026-08-07T17:04:22.374Z",
6640
- "size": 1156,
6641
- "path": "../public/_nuxt/_S09PGd-.js"
7132
+ "etag": "\"1370-EmKYXWKDi46qLnX3h2uYemInbhY\"",
7133
+ "mtime": "2026-08-07T20:13:31.616Z",
7134
+ "size": 4976,
7135
+ "path": "../public/_nuxt/DPnm6zS2.js"
6642
7136
  },
6643
- "/_nuxt/cHkFs-ms.js": {
7137
+ "/_nuxt/DQEnwY-5.js": {
6644
7138
  "type": "text/javascript; charset=utf-8",
6645
- "etag": "\"471-RLUr12u0tkmwYOXwH7T5Qyh40gQ\"",
6646
- "mtime": "2026-08-07T17:04:22.374Z",
6647
- "size": 1137,
6648
- "path": "../public/_nuxt/cHkFs-ms.js"
7139
+ "etag": "\"8d26-4y5vziLk1+UPgTkMOV2mi5+VVCY\"",
7140
+ "mtime": "2026-08-07T20:13:31.616Z",
7141
+ "size": 36134,
7142
+ "path": "../public/_nuxt/DQEnwY-5.js"
6649
7143
  },
6650
- "/_nuxt/entry.DTNjKx6y.css": {
6651
- "type": "text/css; charset=utf-8",
6652
- "etag": "\"8e10-1Idm9PtgSP6XItECUU+NHpPN4tA\"",
6653
- "mtime": "2026-08-07T17:04:22.374Z",
6654
- "size": 36368,
6655
- "path": "../public/_nuxt/entry.DTNjKx6y.css"
7144
+ "/_nuxt/Dh50_bkx.js": {
7145
+ "type": "text/javascript; charset=utf-8",
7146
+ "etag": "\"4a5-akgzK9EAYBoW3swdJpgoKxckqi4\"",
7147
+ "mtime": "2026-08-07T20:13:31.616Z",
7148
+ "size": 1189,
7149
+ "path": "../public/_nuxt/Dh50_bkx.js"
7150
+ },
7151
+ "/_nuxt/DhJW7zb9.js": {
7152
+ "type": "text/javascript; charset=utf-8",
7153
+ "etag": "\"76a-YTgbHgkOKVrfM+XNfNcTeRAVYMc\"",
7154
+ "mtime": "2026-08-07T20:13:31.616Z",
7155
+ "size": 1898,
7156
+ "path": "../public/_nuxt/DhJW7zb9.js"
7157
+ },
7158
+ "/_nuxt/DnTwjl0_2.js": {
7159
+ "type": "text/javascript; charset=utf-8",
7160
+ "etag": "\"41f8-tJbOq6RAI34v3Tqdj28vXtIw3SI\"",
7161
+ "mtime": "2026-08-07T20:13:31.616Z",
7162
+ "size": 16888,
7163
+ "path": "../public/_nuxt/DnTwjl0_2.js"
7164
+ },
7165
+ "/_nuxt/DsH8sTHf.js": {
7166
+ "type": "text/javascript; charset=utf-8",
7167
+ "etag": "\"6f-p/ll3FTpWtsKgPbN/KytJQO35yM\"",
7168
+ "mtime": "2026-08-07T20:13:31.616Z",
7169
+ "size": 111,
7170
+ "path": "../public/_nuxt/DsH8sTHf.js"
7171
+ },
7172
+ "/_nuxt/Dy30RUCD2.js": {
7173
+ "type": "text/javascript; charset=utf-8",
7174
+ "etag": "\"b9c-EI1a61YBvNEPTWBPRlFdCdoi43E\"",
7175
+ "mtime": "2026-08-07T20:13:31.616Z",
7176
+ "size": 2972,
7177
+ "path": "../public/_nuxt/Dy30RUCD2.js"
7178
+ },
7179
+ "/_nuxt/OU1MVgXQ.js": {
7180
+ "type": "text/javascript; charset=utf-8",
7181
+ "etag": "\"73f3-wvRm1X8oKEkjhkUAvk5FKwdVxrc\"",
7182
+ "mtime": "2026-08-07T20:13:31.616Z",
7183
+ "size": 29683,
7184
+ "path": "../public/_nuxt/OU1MVgXQ.js"
7185
+ },
7186
+ "/_nuxt/W3KL_OjU.js": {
7187
+ "type": "text/javascript; charset=utf-8",
7188
+ "etag": "\"49a-IlEKB1HUCJDHxsQ/6XObVS2oIlk\"",
7189
+ "mtime": "2026-08-07T20:13:31.616Z",
7190
+ "size": 1178,
7191
+ "path": "../public/_nuxt/W3KL_OjU.js"
7192
+ },
7193
+ "/_nuxt/ZjfInHdu.js": {
7194
+ "type": "text/javascript; charset=utf-8",
7195
+ "etag": "\"1546d-/nqDPAOkHqo8ZmcBoKCMMweknpg\"",
7196
+ "mtime": "2026-08-07T20:13:31.616Z",
7197
+ "size": 87149,
7198
+ "path": "../public/_nuxt/ZjfInHdu.js"
7199
+ },
7200
+ "/_nuxt/cbxnBwm6.js": {
7201
+ "type": "text/javascript; charset=utf-8",
7202
+ "etag": "\"55d3-4d7PrifkW021IgPIcN8fTyaa5Cs\"",
7203
+ "mtime": "2026-08-07T20:13:31.616Z",
7204
+ "size": 21971,
7205
+ "path": "../public/_nuxt/cbxnBwm6.js"
6656
7206
  },
6657
7207
  "/_nuxt/error-404.DQm6ppno.css": {
6658
7208
  "type": "text/css; charset=utf-8",
6659
7209
  "etag": "\"97d-FG4/ymMxDV3N4Wib4jaedpcpUas\"",
6660
- "mtime": "2026-08-07T17:04:22.374Z",
7210
+ "mtime": "2026-08-07T20:13:31.616Z",
6661
7211
  "size": 2429,
6662
7212
  "path": "../public/_nuxt/error-404.DQm6ppno.css"
6663
7213
  },
6664
7214
  "/_nuxt/error-500.hK5lsCWo.css": {
6665
7215
  "type": "text/css; charset=utf-8",
6666
7216
  "etag": "\"772-paB/udv1S+kQN9EogSBT92Rxqtk\"",
6667
- "mtime": "2026-08-07T17:04:22.374Z",
7217
+ "mtime": "2026-08-07T20:13:31.616Z",
6668
7218
  "size": 1906,
6669
7219
  "path": "../public/_nuxt/error-500.hK5lsCWo.css"
6670
7220
  },
6671
- "/_nuxt/fjfS4ymU.js": {
6672
- "type": "text/javascript; charset=utf-8",
6673
- "etag": "\"1624-INzoZguLSytmINzH4Fc8HMygPDA\"",
6674
- "mtime": "2026-08-07T17:04:22.374Z",
6675
- "size": 5668,
6676
- "path": "../public/_nuxt/fjfS4ymU.js"
7221
+ "/_nuxt/entry.MbqNBIeH.css": {
7222
+ "type": "text/css; charset=utf-8",
7223
+ "etag": "\"a0d4-jgA2Xq4EwVzzCQmkAQcCfhQbYpE\"",
7224
+ "mtime": "2026-08-07T20:13:31.616Z",
7225
+ "size": 41172,
7226
+ "path": "../public/_nuxt/entry.MbqNBIeH.css"
6677
7227
  },
6678
7228
  "/_nuxt/limits.DDC9tNkw.css": {
6679
7229
  "type": "text/css; charset=utf-8",
6680
7230
  "etag": "\"1c4-oC4V27VSMJdZ8WFkX5ufVEpiO4c\"",
6681
- "mtime": "2026-08-07T17:04:22.374Z",
7231
+ "mtime": "2026-08-07T20:13:31.616Z",
6682
7232
  "size": 452,
6683
7233
  "path": "../public/_nuxt/limits.DDC9tNkw.css"
6684
7234
  },
6685
- "/_nuxt/moFy8lON.js": {
7235
+ "/_nuxt/m3-Vaz25.js": {
6686
7236
  "type": "text/javascript; charset=utf-8",
6687
- "etag": "\"d471-hm4/ntPOHSkIxeCJuO7BriP2WWw\"",
6688
- "mtime": "2026-08-07T17:04:22.374Z",
6689
- "size": 54385,
6690
- "path": "../public/_nuxt/moFy8lON.js"
6691
- },
6692
- "/_nuxt/oT-x2NdZ.js": {
6693
- "type": "text/javascript; charset=utf-8",
6694
- "etag": "\"2f9-clgl3ZTqADgH5udOX6JOOMoYtRc\"",
6695
- "mtime": "2026-08-07T17:04:22.374Z",
6696
- "size": 761,
6697
- "path": "../public/_nuxt/oT-x2NdZ.js"
7237
+ "etag": "\"187-70j459K4ZB4jJ3GKFrPIRoXhZnk\"",
7238
+ "mtime": "2026-08-07T20:13:31.616Z",
7239
+ "size": 391,
7240
+ "path": "../public/_nuxt/m3-Vaz25.js"
6698
7241
  },
6699
7242
  "/_nuxt/timeline.7J8JHjUo.css": {
6700
7243
  "type": "text/css; charset=utf-8",
6701
7244
  "etag": "\"1e7-Fq3WEG7R6cHFxT4blW68gHJifao\"",
6702
- "mtime": "2026-08-07T17:04:22.374Z",
7245
+ "mtime": "2026-08-07T20:13:31.616Z",
6703
7246
  "size": 487,
6704
7247
  "path": "../public/_nuxt/timeline.7J8JHjUo.css"
6705
7248
  },
6706
- "/_nuxt/tqUqm2f-.js": {
6707
- "type": "text/javascript; charset=utf-8",
6708
- "etag": "\"618-18lRDTjo3N4WMU9dLUOhhqnLj+4\"",
6709
- "mtime": "2026-08-07T17:04:22.374Z",
6710
- "size": 1560,
6711
- "path": "../public/_nuxt/tqUqm2f-.js"
6712
- },
6713
7249
  "/_nuxt/builds/latest.json": {
6714
7250
  "type": "application/json",
6715
- "etag": "\"47-YWtgCqHzqD0sgYozkWghqg5bpb0\"",
6716
- "mtime": "2026-08-07T17:04:22.361Z",
7251
+ "etag": "\"47-sC8RqrOY7M0DC9j4t5gjDejZHAU\"",
7252
+ "mtime": "2026-08-07T20:13:31.594Z",
6717
7253
  "size": 71,
6718
7254
  "path": "../public/_nuxt/builds/latest.json"
6719
7255
  },
6720
- "/_nuxt/builds/meta/63ad5f37-5b40-456d-8f53-69ff57b4903c.json": {
7256
+ "/_nuxt/builds/meta/e90c8a2d-9e50-4b58-8019-6b1bf4c8fc6d.json": {
6721
7257
  "type": "application/json",
6722
- "etag": "\"58-XKsk4pdoX5Ays2RzLjkFxY9Czug\"",
6723
- "mtime": "2026-08-07T17:04:22.356Z",
7258
+ "etag": "\"58-B95DJ55bzpv5CbEtXtcsLFDTOtk\"",
7259
+ "mtime": "2026-08-07T20:13:31.589Z",
6724
7260
  "size": 88,
6725
- "path": "../public/_nuxt/builds/meta/63ad5f37-5b40-456d-8f53-69ff57b4903c.json"
7261
+ "path": "../public/_nuxt/builds/meta/e90c8a2d-9e50-4b58-8019-6b1bf4c8fc6d.json"
6726
7262
  }
6727
7263
  };
6728
7264
 
@@ -6935,7 +7471,11 @@ const _UMv9ev = eventHandler((event) => {
6935
7471
 
6936
7472
  const _SxA8c9 = defineEventHandler(() => {});
6937
7473
 
7474
+ const _lazy_PrjIMf = () => import('../routes/api/alerts.get.mjs');
7475
+ const _lazy_JZETJi = () => import('../routes/api/alerts.put.mjs');
6938
7476
  const _lazy_63GEIj = () => import('../routes/api/events/stream.get.mjs');
7477
+ const _lazy_WdtCZI = () => import('../routes/api/export.get.mjs');
7478
+ const _lazy_1N10nf = () => import('../routes/api/import/csv.post.mjs');
6939
7479
  const _lazy_h2UJK_ = () => import('../routes/api/ingest.post.mjs');
6940
7480
  const _lazy_IWmWUQ = () => import('../routes/api/meta.get.mjs');
6941
7481
  const _lazy_Wbkntj = () => import('../routes/api/stats/heatmap.get.mjs');
@@ -6950,7 +7490,11 @@ const _lazy_5OiMq8 = () => import('../routes/renderer.mjs').then(function (n) {
6950
7490
 
6951
7491
  const handlers = [
6952
7492
  { route: '', handler: _UMv9ev, lazy: false, middleware: true, method: undefined },
7493
+ { route: '/api/alerts', handler: _lazy_PrjIMf, lazy: true, middleware: false, method: "get" },
7494
+ { route: '/api/alerts', handler: _lazy_JZETJi, lazy: true, middleware: false, method: "put" },
6953
7495
  { route: '/api/events/stream', handler: _lazy_63GEIj, lazy: true, middleware: false, method: "get" },
7496
+ { route: '/api/export', handler: _lazy_WdtCZI, lazy: true, middleware: false, method: "get" },
7497
+ { route: '/api/import/csv', handler: _lazy_1N10nf, lazy: true, middleware: false, method: "post" },
6954
7498
  { route: '/api/ingest', handler: _lazy_h2UJK_, lazy: true, middleware: false, method: "post" },
6955
7499
  { route: '/api/meta', handler: _lazy_IWmWUQ, lazy: true, middleware: false, method: "get" },
6956
7500
  { route: '/api/stats/heatmap', handler: _lazy_Wbkntj, lazy: true, middleware: false, method: "get" },
@@ -7418,5 +7962,5 @@ trapUnhandledNodeErrors();
7418
7962
  setupGracefulShutdown(listener, nitroApp);
7419
7963
  const nodeServer = {};
7420
7964
 
7421
- export { $fetch as $, joinURL as A, getResponseStatusText as B, getResponseStatus as C, useNitroApp as D, defu as E, parseURL as F, decodePath as G, withQuery as H, hasProtocol as I, isScriptProtocol as J, sanitizeStatusCode as K, parseQuery as L, withTrailingSlash as M, withoutTrailingSlash as N, nodeServer as O, createError$1 as a, buildFrame as b, createEventStream as c, defineEventHandler as d, repo as e, store as f, forecastLimit as g, currentWindowSnapshots as h, costPerKLines as i, cacheHitRate as j, getQuery as k, getRouterParam as l, moodFor as m, notifyIngest as n, bucketStart as o, parseStatusline as p, queries as q, readBody as r, subscribe as s, encodePath as t, useRuntimeConfig as u, joinRelativeURL as v, defineRenderHandler as w, destr as x, getRouteRules as y, relative as z };
7965
+ export { $fetch as $, currentWindowSnapshots as A, moodFor as B, costPerKLines as C, cacheHitRate as D, getRouterParam as E, bucketStart as F, useRuntimeConfig as G, encodePath as H, joinRelativeURL as I, defineRenderHandler as J, destr as K, getRouteRules as L, relative as M, joinURL as N, getResponseStatusText as O, getResponseStatus as P, useNitroApp as Q, defu as R, parseURL as S, decodePath as T, withQuery as U, hasProtocol as V, isScriptProtocol as W, sanitizeStatusCode as X, parseQuery as Y, withTrailingSlash as Z, withoutTrailingSlash as _, defaultAlertsPath as a, nodeServer as a0, createEventStream as b, checkAlerts as c, defineEventHandler as d, buildFrame as e, subscribe as f, getQuery as g, formatExportJson as h, formatExportCsv as i, setHeader as j, getHeader as k, loadAlertsConfig as l, readMultipartFormData as m, createError$1 as n, readRawBody as o, parseAlertsConfig as p, queries as q, readBody as r, saveAlertsConfig as s, loadPriceTable as t, importCsv as u, repo as v, notifyIngest as w, parseStatusline as x, store as y, forecastLimit as z };
7422
7966
  //# sourceMappingURL=nitro.mjs.map