watch-tail 0.4.0 → 0.6.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 (381) hide show
  1. package/README.md +158 -0
  2. package/build/client/_app/immutable/assets/0.Dfts6BC4.css +2 -0
  3. package/build/client/_app/immutable/assets/0.Dfts6BC4.css.br +0 -0
  4. package/build/client/_app/immutable/assets/0.Dfts6BC4.css.gz +0 -0
  5. package/build/client/_app/immutable/assets/BrushContext.2tkUc39H.css +1 -0
  6. package/build/client/_app/immutable/assets/BrushContext.2tkUc39H.css.br +0 -0
  7. package/build/client/_app/immutable/assets/BrushContext.2tkUc39H.css.gz +0 -0
  8. package/build/client/_app/immutable/assets/ChartAnnotations.Bw8CGteN.css +1 -0
  9. package/build/client/_app/immutable/assets/ChartAnnotations.Bw8CGteN.css.br +0 -0
  10. package/build/client/_app/immutable/assets/ChartAnnotations.Bw8CGteN.css.gz +0 -0
  11. package/build/client/_app/immutable/assets/Circle.C5MKzgk2.css +1 -0
  12. package/build/client/_app/immutable/assets/Circle.C5MKzgk2.css.br +1 -0
  13. package/build/client/_app/immutable/assets/Circle.C5MKzgk2.css.gz +0 -0
  14. package/build/client/_app/immutable/assets/DefaultTooltip.CGOVIm3D.css +1 -0
  15. package/build/client/_app/immutable/assets/DefaultTooltip.CGOVIm3D.css.br +0 -0
  16. package/build/client/_app/immutable/assets/DefaultTooltip.CGOVIm3D.css.gz +0 -0
  17. package/build/client/_app/immutable/assets/EventScatter.DA5sZ1c0.css +1 -0
  18. package/build/client/_app/immutable/assets/EventScatter.DA5sZ1c0.css.br +0 -0
  19. package/build/client/_app/immutable/assets/EventScatter.DA5sZ1c0.css.gz +0 -0
  20. package/build/client/_app/immutable/assets/Labels.sEaJtb97.css +1 -0
  21. package/build/client/_app/immutable/assets/Labels.sEaJtb97.css.br +0 -0
  22. package/build/client/_app/immutable/assets/Labels.sEaJtb97.css.gz +0 -0
  23. package/build/client/_app/immutable/assets/Legend.DnhxhJ2I.css +1 -0
  24. package/build/client/_app/immutable/assets/Legend.DnhxhJ2I.css.br +0 -0
  25. package/build/client/_app/immutable/assets/Legend.DnhxhJ2I.css.gz +0 -0
  26. package/build/client/_app/immutable/assets/Path.B0wDzTrn.css +1 -0
  27. package/build/client/_app/immutable/assets/Path.B0wDzTrn.css.br +0 -0
  28. package/build/client/_app/immutable/assets/Path.B0wDzTrn.css.gz +0 -0
  29. package/build/client/_app/immutable/assets/TransformContext.1cjyViIk.css +1 -0
  30. package/build/client/_app/immutable/assets/TransformContext.1cjyViIk.css.br +0 -0
  31. package/build/client/_app/immutable/assets/TransformContext.1cjyViIk.css.gz +0 -0
  32. package/build/client/_app/immutable/assets/Voronoi.ce7atosu.css +1 -0
  33. package/build/client/_app/immutable/assets/Voronoi.ce7atosu.css.br +0 -0
  34. package/build/client/_app/immutable/assets/Voronoi.ce7atosu.css.gz +0 -0
  35. package/build/client/_app/immutable/chunks/Amq8zxdJ.js +1 -0
  36. package/build/client/_app/immutable/chunks/Amq8zxdJ.js.br +0 -0
  37. package/build/client/_app/immutable/chunks/Amq8zxdJ.js.gz +0 -0
  38. package/build/client/_app/immutable/chunks/B3p3umIY.js +1 -0
  39. package/build/client/_app/immutable/chunks/B3p3umIY.js.br +0 -0
  40. package/build/client/_app/immutable/chunks/B3p3umIY.js.gz +0 -0
  41. package/build/client/_app/immutable/chunks/B43Eeyih.js +1 -0
  42. package/build/client/_app/immutable/chunks/B43Eeyih.js.br +0 -0
  43. package/build/client/_app/immutable/chunks/B43Eeyih.js.gz +0 -0
  44. package/build/client/_app/immutable/chunks/B5q6rkQ-.js +1 -0
  45. package/build/client/_app/immutable/chunks/B5q6rkQ-.js.br +0 -0
  46. package/build/client/_app/immutable/chunks/B5q6rkQ-.js.gz +0 -0
  47. package/build/client/_app/immutable/chunks/BAynhd7i.js +1 -0
  48. package/build/client/_app/immutable/chunks/BAynhd7i.js.br +0 -0
  49. package/build/client/_app/immutable/chunks/BAynhd7i.js.gz +0 -0
  50. package/build/client/_app/immutable/chunks/BDlvDAqe.js +1 -0
  51. package/build/client/_app/immutable/chunks/BDlvDAqe.js.br +0 -0
  52. package/build/client/_app/immutable/chunks/BDlvDAqe.js.gz +0 -0
  53. package/build/client/_app/immutable/chunks/BGmgUZMc.js +10 -0
  54. package/build/client/_app/immutable/chunks/BGmgUZMc.js.br +0 -0
  55. package/build/client/_app/immutable/chunks/BGmgUZMc.js.gz +0 -0
  56. package/build/client/_app/immutable/chunks/BJpWBbAS.js +1 -0
  57. package/build/client/_app/immutable/chunks/BJpWBbAS.js.br +0 -0
  58. package/build/client/_app/immutable/chunks/BJpWBbAS.js.gz +0 -0
  59. package/build/client/_app/immutable/chunks/BOT2hFMn.js +1 -0
  60. package/build/client/_app/immutable/chunks/BOT2hFMn.js.br +0 -0
  61. package/build/client/_app/immutable/chunks/BOT2hFMn.js.gz +0 -0
  62. package/build/client/_app/immutable/chunks/BR2LaRms.js +1 -0
  63. package/build/client/_app/immutable/chunks/BR2LaRms.js.br +1 -0
  64. package/build/client/_app/immutable/chunks/BR2LaRms.js.gz +0 -0
  65. package/build/client/_app/immutable/chunks/BZFYtRPj.js +1 -0
  66. package/build/client/_app/immutable/chunks/BZFYtRPj.js.br +0 -0
  67. package/build/client/_app/immutable/chunks/BZFYtRPj.js.gz +0 -0
  68. package/build/client/_app/immutable/chunks/BjxZ_neZ.js +5 -0
  69. package/build/client/_app/immutable/chunks/BjxZ_neZ.js.br +0 -0
  70. package/build/client/_app/immutable/chunks/BjxZ_neZ.js.gz +0 -0
  71. package/build/client/_app/immutable/chunks/Bl052uUt.js +1 -0
  72. package/build/client/_app/immutable/chunks/Bl052uUt.js.br +0 -0
  73. package/build/client/_app/immutable/chunks/Bl052uUt.js.gz +0 -0
  74. package/build/client/_app/immutable/chunks/{Bw_9uNRP.js → BsH4MNzX.js} +1 -1
  75. package/build/client/_app/immutable/chunks/BsH4MNzX.js.br +0 -0
  76. package/build/client/_app/immutable/chunks/BsH4MNzX.js.gz +0 -0
  77. package/build/client/_app/immutable/chunks/ByhwhtiG.js +1 -0
  78. package/build/client/_app/immutable/chunks/ByhwhtiG.js.br +0 -0
  79. package/build/client/_app/immutable/chunks/ByhwhtiG.js.gz +0 -0
  80. package/build/client/_app/immutable/chunks/C1lycbEF.js +1 -0
  81. package/build/client/_app/immutable/chunks/C1lycbEF.js.br +0 -0
  82. package/build/client/_app/immutable/chunks/C1lycbEF.js.gz +0 -0
  83. package/build/client/_app/immutable/chunks/C58PZtCD.js +4 -0
  84. package/build/client/_app/immutable/chunks/C58PZtCD.js.br +0 -0
  85. package/build/client/_app/immutable/chunks/C58PZtCD.js.gz +0 -0
  86. package/build/client/_app/immutable/chunks/CCch3uox.js +1 -0
  87. package/build/client/_app/immutable/chunks/CCch3uox.js.br +0 -0
  88. package/build/client/_app/immutable/chunks/CCch3uox.js.gz +0 -0
  89. package/build/client/_app/immutable/chunks/CEU4ihsz.js +1 -0
  90. package/build/client/_app/immutable/chunks/CEU4ihsz.js.br +0 -0
  91. package/build/client/_app/immutable/chunks/CEU4ihsz.js.gz +0 -0
  92. package/build/client/_app/immutable/chunks/CG6rRxUy.js +2 -0
  93. package/build/client/_app/immutable/chunks/CG6rRxUy.js.br +0 -0
  94. package/build/client/_app/immutable/chunks/CG6rRxUy.js.gz +0 -0
  95. package/build/client/_app/immutable/chunks/CM5sQDq_.js +1 -0
  96. package/build/client/_app/immutable/chunks/CM5sQDq_.js.br +0 -0
  97. package/build/client/_app/immutable/chunks/CM5sQDq_.js.gz +0 -0
  98. package/build/client/_app/immutable/chunks/CT_NYh_-.js +1 -0
  99. package/build/client/_app/immutable/chunks/CT_NYh_-.js.br +0 -0
  100. package/build/client/_app/immutable/chunks/CT_NYh_-.js.gz +0 -0
  101. package/build/client/_app/immutable/chunks/CZIk93qi.js +1 -0
  102. package/build/client/_app/immutable/chunks/CZIk93qi.js.br +0 -0
  103. package/build/client/_app/immutable/chunks/CZIk93qi.js.gz +0 -0
  104. package/build/client/_app/immutable/chunks/C_aXFBl3.js +1 -0
  105. package/build/client/_app/immutable/chunks/C_aXFBl3.js.br +0 -0
  106. package/build/client/_app/immutable/chunks/C_aXFBl3.js.gz +0 -0
  107. package/build/client/_app/immutable/chunks/CqWPu3PG.js +1 -0
  108. package/build/client/_app/immutable/chunks/CqWPu3PG.js.br +1 -0
  109. package/build/client/_app/immutable/chunks/CqWPu3PG.js.gz +0 -0
  110. package/build/client/_app/immutable/chunks/CyncJW0D.js +1 -0
  111. package/build/client/_app/immutable/chunks/CyncJW0D.js.br +0 -0
  112. package/build/client/_app/immutable/chunks/CyncJW0D.js.gz +0 -0
  113. package/build/client/_app/immutable/chunks/D4sC5v3c.js +1 -0
  114. package/build/client/_app/immutable/chunks/D4sC5v3c.js.br +0 -0
  115. package/build/client/_app/immutable/chunks/D4sC5v3c.js.gz +0 -0
  116. package/build/client/_app/immutable/chunks/D76YLq-2.js +1 -0
  117. package/build/client/_app/immutable/chunks/D76YLq-2.js.br +0 -0
  118. package/build/client/_app/immutable/chunks/D76YLq-2.js.gz +0 -0
  119. package/build/client/_app/immutable/chunks/D8H_ivbb.js +1 -0
  120. package/build/client/_app/immutable/chunks/D8H_ivbb.js.br +0 -0
  121. package/build/client/_app/immutable/chunks/D8H_ivbb.js.gz +0 -0
  122. package/build/client/_app/immutable/chunks/DU0OQtdJ.js +1 -0
  123. package/build/client/_app/immutable/chunks/DU0OQtdJ.js.br +0 -0
  124. package/build/client/_app/immutable/chunks/DU0OQtdJ.js.gz +0 -0
  125. package/build/client/_app/immutable/chunks/Db0q5_zr.js +1 -0
  126. package/build/client/_app/immutable/chunks/Db0q5_zr.js.br +0 -0
  127. package/build/client/_app/immutable/chunks/Db0q5_zr.js.gz +0 -0
  128. package/build/client/_app/immutable/chunks/Dfvzj6n2.js +1 -0
  129. package/build/client/_app/immutable/chunks/Dfvzj6n2.js.br +0 -0
  130. package/build/client/_app/immutable/chunks/Dfvzj6n2.js.gz +0 -0
  131. package/build/client/_app/immutable/chunks/HclGiUj8.js +1 -0
  132. package/build/client/_app/immutable/chunks/HclGiUj8.js.br +0 -0
  133. package/build/client/_app/immutable/chunks/HclGiUj8.js.gz +0 -0
  134. package/build/client/_app/immutable/chunks/RobXhXPM.js +1 -0
  135. package/build/client/_app/immutable/chunks/RobXhXPM.js.br +1 -0
  136. package/build/client/_app/immutable/chunks/RobXhXPM.js.gz +0 -0
  137. package/build/client/_app/immutable/chunks/Y5urAfNy.js +1 -0
  138. package/build/client/_app/immutable/chunks/Y5urAfNy.js.br +0 -0
  139. package/build/client/_app/immutable/chunks/Y5urAfNy.js.gz +0 -0
  140. package/build/client/_app/immutable/chunks/Yk6ZJZnu.js +1 -0
  141. package/build/client/_app/immutable/chunks/Yk6ZJZnu.js.br +0 -0
  142. package/build/client/_app/immutable/chunks/Yk6ZJZnu.js.gz +0 -0
  143. package/build/client/_app/immutable/chunks/jO4fmY1N.js +1 -0
  144. package/build/client/_app/immutable/chunks/jO4fmY1N.js.br +0 -0
  145. package/build/client/_app/immutable/chunks/jO4fmY1N.js.gz +0 -0
  146. package/build/client/_app/immutable/chunks/pqiPC7Y8.js +3 -0
  147. package/build/client/_app/immutable/chunks/pqiPC7Y8.js.br +0 -0
  148. package/build/client/_app/immutable/chunks/pqiPC7Y8.js.gz +0 -0
  149. package/build/client/_app/immutable/chunks/snfmbqby.js +1 -0
  150. package/build/client/_app/immutable/chunks/snfmbqby.js.br +0 -0
  151. package/build/client/_app/immutable/chunks/snfmbqby.js.gz +0 -0
  152. package/build/client/_app/immutable/chunks/wx-wtMGx.js +15 -0
  153. package/build/client/_app/immutable/chunks/wx-wtMGx.js.br +0 -0
  154. package/build/client/_app/immutable/chunks/wx-wtMGx.js.gz +0 -0
  155. package/build/client/_app/immutable/chunks/yCfI4PCa.js +1 -0
  156. package/build/client/_app/immutable/chunks/yCfI4PCa.js.br +0 -0
  157. package/build/client/_app/immutable/chunks/yCfI4PCa.js.gz +0 -0
  158. package/build/client/_app/immutable/chunks/zHL7lw4G.js +1 -0
  159. package/build/client/_app/immutable/chunks/zHL7lw4G.js.br +0 -0
  160. package/build/client/_app/immutable/chunks/zHL7lw4G.js.gz +0 -0
  161. package/build/client/_app/immutable/entry/app.DFSifnlU.js +2 -0
  162. package/build/client/_app/immutable/entry/app.DFSifnlU.js.br +0 -0
  163. package/build/client/_app/immutable/entry/app.DFSifnlU.js.gz +0 -0
  164. package/build/client/_app/immutable/entry/start.2H5s3Lol.js +1 -0
  165. package/build/client/_app/immutable/entry/start.2H5s3Lol.js.br +1 -0
  166. package/build/client/_app/immutable/entry/start.2H5s3Lol.js.gz +0 -0
  167. package/build/client/_app/immutable/nodes/0.BN3NguWs.js +1 -0
  168. package/build/client/_app/immutable/nodes/0.BN3NguWs.js.br +0 -0
  169. package/build/client/_app/immutable/nodes/0.BN3NguWs.js.gz +0 -0
  170. package/build/client/_app/immutable/nodes/1.Djdw1GzA.js +1 -0
  171. package/build/client/_app/immutable/nodes/1.Djdw1GzA.js.br +0 -0
  172. package/build/client/_app/immutable/nodes/1.Djdw1GzA.js.gz +0 -0
  173. package/build/client/_app/immutable/nodes/2.CjvaJDQJ.js +4 -0
  174. package/build/client/_app/immutable/nodes/2.CjvaJDQJ.js.br +0 -0
  175. package/build/client/_app/immutable/nodes/2.CjvaJDQJ.js.gz +0 -0
  176. package/build/client/_app/version.json +1 -1
  177. package/build/client/_app/version.json.br +0 -0
  178. package/build/client/_app/version.json.gz +0 -0
  179. package/build/handler.js +9 -7
  180. package/build/handler.js.map +1 -1
  181. package/build/index.js +9 -7
  182. package/build/index.js.map +1 -1
  183. package/build/server/chunks/chunks/Arc.canvas.js-D6g58nSp.js +701 -0
  184. package/build/server/chunks/chunks/Arc.canvas.js-D6g58nSp.js.map +1 -0
  185. package/build/server/chunks/chunks/Arc.js-D78Cf_4M.js +31 -0
  186. package/build/server/chunks/chunks/Arc.js-D78Cf_4M.js.map +1 -0
  187. package/build/server/chunks/chunks/Bar.js-Cv73T8_D.js +448 -0
  188. package/build/server/chunks/chunks/Bar.js-Cv73T8_D.js.map +1 -0
  189. package/build/server/chunks/chunks/ChartAnnotations.js-Ci22VB_6.js +983 -0
  190. package/build/server/chunks/chunks/ChartAnnotations.js-Ci22VB_6.js.map +1 -0
  191. package/build/server/chunks/chunks/Circle.html.js-BjwyNRG3.js +355 -0
  192. package/build/server/chunks/chunks/Circle.html.js-BjwyNRG3.js.map +1 -0
  193. package/build/server/chunks/chunks/ClipPath.canvas.js-CFTBDWVU.js +170 -0
  194. package/build/server/chunks/chunks/ClipPath.canvas.js-CFTBDWVU.js.map +1 -0
  195. package/build/server/chunks/chunks/DefaultTooltip.js-0r5rbE-1.js +352 -0
  196. package/build/server/chunks/chunks/DefaultTooltip.js-0r5rbE-1.js.map +1 -0
  197. package/build/server/chunks/chunks/EventScatter.js-D3Jaw_Cw.js +7308 -0
  198. package/build/server/chunks/chunks/EventScatter.js-D3Jaw_Cw.js.map +1 -0
  199. package/build/server/chunks/chunks/Labels.js-DpagpV6d.js +497 -0
  200. package/build/server/chunks/chunks/Labels.js-DpagpV6d.js.map +1 -0
  201. package/build/server/chunks/chunks/Legend.js-BOpwpe5s.js +343 -0
  202. package/build/server/chunks/chunks/Legend.js-BOpwpe5s.js.map +1 -0
  203. package/build/server/chunks/chunks/Line.html.js-BM5tR11G.js +423 -0
  204. package/build/server/chunks/chunks/Line.html.js-BM5tR11G.js.map +1 -0
  205. package/build/server/chunks/chunks/Link.canvas.js-P8ySzEAw.js +756 -0
  206. package/build/server/chunks/chunks/Link.canvas.js-P8ySzEAw.js.map +1 -0
  207. package/build/server/chunks/chunks/Path.canvas.js-DNAtnEBt.js +1259 -0
  208. package/build/server/chunks/chunks/Path.canvas.js-DNAtnEBt.js.map +1 -0
  209. package/build/server/chunks/chunks/Points.html.js-CLbHD6OP.js +228 -0
  210. package/build/server/chunks/chunks/Points.html.js-CLbHD6OP.js.map +1 -0
  211. package/build/server/chunks/chunks/Points.js-e6g0Re6H.js +14 -0
  212. package/build/server/chunks/chunks/Points.js-e6g0Re6H.js.map +1 -0
  213. package/build/server/chunks/chunks/Points2.js-BMGdkzTE.js +25 -0
  214. package/build/server/chunks/chunks/Points2.js-BMGdkzTE.js.map +1 -0
  215. package/build/server/chunks/chunks/Rect.html.js-Q3UvRwNn.js +547 -0
  216. package/build/server/chunks/chunks/Rect.html.js-Q3UvRwNn.js.map +1 -0
  217. package/build/server/chunks/chunks/Spline.js-BuZPz2PJ.js +516 -0
  218. package/build/server/chunks/chunks/Spline.js-BuZPz2PJ.js.map +1 -0
  219. package/build/server/chunks/chunks/Text.html.js-C8xO5Nz6.js +847 -0
  220. package/build/server/chunks/chunks/Text.html.js-C8xO5Nz6.js.map +1 -0
  221. package/build/server/chunks/chunks/TooltipItem.js-T0cKLjLu.js +314 -0
  222. package/build/server/chunks/chunks/TooltipItem.js-T0cKLjLu.js.map +1 -0
  223. package/build/server/chunks/chunks/Voronoi.js-DevTsXQE.js +2052 -0
  224. package/build/server/chunks/chunks/Voronoi.js-DevTsXQE.js.map +1 -0
  225. package/build/server/chunks/chunks/archive.js-C2D-5edp.js +823 -0
  226. package/build/server/chunks/chunks/archive.js-C2D-5edp.js.map +1 -0
  227. package/build/server/chunks/chunks/array.js-CBp0H4t3.js +8 -0
  228. package/build/server/chunks/chunks/array.js-CBp0H4t3.js.map +1 -0
  229. package/build/server/chunks/chunks/attributes.js-BVWo7wbg.js +25 -0
  230. package/build/server/chunks/chunks/attributes.js-BVWo7wbg.js.map +1 -0
  231. package/build/server/chunks/chunks/{env2.js-DXveJt1Y.js → aws.js-DkPqAybc.js} +2 -59
  232. package/build/server/chunks/chunks/aws.js-DkPqAybc.js.map +1 -0
  233. package/build/server/chunks/chunks/band.js-C7izXphE.js +155 -0
  234. package/build/server/chunks/chunks/band.js-C7izXphE.js.map +1 -0
  235. package/build/server/chunks/chunks/centroid.js-BnGN3LH0.js +1356 -0
  236. package/build/server/chunks/chunks/centroid.js-BnGN3LH0.js.map +1 -0
  237. package/build/server/chunks/chunks/common.js-BWQB8Die.js +5760 -0
  238. package/build/server/chunks/chunks/common.js-BWQB8Die.js.map +1 -0
  239. package/build/server/chunks/chunks/env2.js-CcIskxOZ.js +60 -0
  240. package/build/server/chunks/chunks/env2.js-CcIskxOZ.js.map +1 -0
  241. package/build/server/chunks/chunks/{exports.js-CvFPPbaH.js → exports.js-ClPPfcHj.js} +6 -1
  242. package/build/server/chunks/chunks/exports.js-ClPPfcHj.js.map +1 -0
  243. package/build/server/chunks/chunks/group.js-DBFzWAox.js +30 -0
  244. package/build/server/chunks/chunks/group.js-DBFzWAox.js.map +1 -0
  245. package/build/server/chunks/chunks/index-server.js-DNLOKvM0.js +248 -0
  246. package/build/server/chunks/chunks/index-server.js-DNLOKvM0.js.map +1 -0
  247. package/build/server/chunks/chunks/index-server2.js-l0sNRNKZ.js +2 -0
  248. package/build/server/chunks/chunks/index-server2.js-l0sNRNKZ.js.map +1 -0
  249. package/build/server/chunks/chunks/{internal2.js-DZ8ZzzjN.js → internal.js-DZ8ZzzjN.js} +1 -1
  250. package/build/server/chunks/chunks/internal.js-DZ8ZzzjN.js.map +1 -0
  251. package/build/server/chunks/chunks/internal2.js-BPo5dcDi.js +188 -0
  252. package/build/server/chunks/chunks/internal2.js-BPo5dcDi.js.map +1 -0
  253. package/build/server/chunks/chunks/key.svelte.js-CWIvXc6L.js +695 -0
  254. package/build/server/chunks/chunks/key.svelte.js-CWIvXc6L.js.map +1 -0
  255. package/build/server/chunks/chunks/{internal.js-Cc3oBhL-.js → legacy-client.js-DJmDw3Zx.js} +13 -439
  256. package/build/server/chunks/chunks/legacy-client.js-DJmDw3Zx.js.map +1 -0
  257. package/build/server/chunks/chunks/level-filter.js-B3o2hyWD.js +313 -0
  258. package/build/server/chunks/chunks/level-filter.js-B3o2hyWD.js.map +1 -0
  259. package/build/server/chunks/chunks/lineRadial.js-Dm0GMqo3.js +126 -0
  260. package/build/server/chunks/chunks/lineRadial.js-Dm0GMqo3.js.map +1 -0
  261. package/build/server/chunks/chunks/linear.js-CTOKrHn9.js +1046 -0
  262. package/build/server/chunks/chunks/linear.js-CTOKrHn9.js.map +1 -0
  263. package/build/server/chunks/chunks/log-buffer.js-BI_gQOls.js +587 -0
  264. package/build/server/chunks/chunks/log-buffer.js-BI_gQOls.js.map +1 -0
  265. package/build/server/chunks/chunks/math.js-BqujbaBs.js +50 -0
  266. package/build/server/chunks/chunks/math.js-BqujbaBs.js.map +1 -0
  267. package/build/server/chunks/chunks/max.js-CuS0BpRI.js +11 -0
  268. package/build/server/chunks/chunks/max.js-CuS0BpRI.js.map +1 -0
  269. package/build/server/chunks/chunks/min.js-DZWt5tPl.js +11 -0
  270. package/build/server/chunks/chunks/min.js-DZWt5tPl.js.map +1 -0
  271. package/build/server/chunks/chunks/motion.svelte.js-DCHSFMu-.js +677 -0
  272. package/build/server/chunks/chunks/motion.svelte.js-DCHSFMu-.js.map +1 -0
  273. package/build/server/chunks/chunks/occlusion.js-DJ-AdK9u.js +33 -0
  274. package/build/server/chunks/chunks/occlusion.js-DJ-AdK9u.js.map +1 -0
  275. package/build/server/chunks/chunks/path.js-BizMrlzb.js +488 -0
  276. package/build/server/chunks/chunks/path.js-BizMrlzb.js.map +1 -0
  277. package/build/server/chunks/chunks/path2.js-pquT2Kg6.js +27 -0
  278. package/build/server/chunks/chunks/path2.js-pquT2Kg6.js.map +1 -0
  279. package/build/server/chunks/chunks/pointRadial.js-Deeu1LXx.js +7 -0
  280. package/build/server/chunks/chunks/pointRadial.js-Deeu1LXx.js.map +1 -0
  281. package/build/server/chunks/chunks/rect.svelte.js-zeS7FWjB.js +187 -0
  282. package/build/server/chunks/chunks/rect.svelte.js-zeS7FWjB.js.map +1 -0
  283. package/build/server/chunks/chunks/scales.svelte.js-D_1popPi.js +276 -0
  284. package/build/server/chunks/chunks/scales.svelte.js-D_1popPi.js.map +1 -0
  285. package/build/server/chunks/chunks/series-buckets.js-BjigySff.js +290 -0
  286. package/build/server/chunks/chunks/series-buckets.js-BjigySff.js.map +1 -0
  287. package/build/server/chunks/chunks/{server.js-ByNB8uti.js → server.js-CAEBuMIH.js} +167 -2
  288. package/build/server/chunks/chunks/server.js-CAEBuMIH.js.map +1 -0
  289. package/build/server/chunks/chunks/source.js-DZEVvuho.js +21 -0
  290. package/build/server/chunks/chunks/source.js-DZEVvuho.js.map +1 -0
  291. package/build/server/chunks/chunks/{state.js-9DxsWxU-.js → state.js-DgkwfYFo.js} +5 -4
  292. package/build/server/chunks/chunks/state.js-DgkwfYFo.js.map +1 -0
  293. package/build/server/chunks/chunks/types.js-x3GyGPOz.js +11 -0
  294. package/build/server/chunks/chunks/types.js-x3GyGPOz.js.map +1 -0
  295. package/build/server/chunks/entries/endpoints/api/archive/_server.ts.js-83Ch7djd.js +39 -0
  296. package/build/server/chunks/entries/endpoints/api/archive/_server.ts.js-83Ch7djd.js.map +1 -0
  297. package/build/server/chunks/entries/endpoints/api/health/{_server.ts.js-BOjix7GN.js → _server.ts.js-VctnBhIJ.js} +5 -4
  298. package/build/server/chunks/entries/endpoints/api/health/_server.ts.js-VctnBhIJ.js.map +1 -0
  299. package/build/server/chunks/entries/endpoints/api/identity/{_server.ts.js-g13uvmrX.js → _server.ts.js-Dt540Sio.js} +4 -3
  300. package/build/server/chunks/entries/endpoints/api/identity/_server.ts.js-Dt540Sio.js.map +1 -0
  301. package/build/server/chunks/entries/endpoints/api/log-groups/{_server.ts.js-CmHRxdZK.js → _server.ts.js-drLgUdvB.js} +57 -8
  302. package/build/server/chunks/entries/endpoints/api/log-groups/_server.ts.js-drLgUdvB.js.map +1 -0
  303. package/build/server/chunks/entries/endpoints/api/regions/{_server.ts.js-BgUwioxp.js → _server.ts.js-CBqfN6Pg.js} +5 -4
  304. package/build/server/chunks/entries/endpoints/api/regions/_server.ts.js-CBqfN6Pg.js.map +1 -0
  305. package/build/server/chunks/entries/endpoints/api/series/_server.ts.js-DOvBhEDU.js +225 -0
  306. package/build/server/chunks/entries/endpoints/api/series/_server.ts.js-DOvBhEDU.js.map +1 -0
  307. package/build/server/chunks/entries/endpoints/api/stream/{_server.ts.js-CIYo4C-0.js → _server.ts.js-BWRHawY8.js} +324 -223
  308. package/build/server/chunks/entries/endpoints/api/stream/_server.ts.js-BWRHawY8.js.map +1 -0
  309. package/build/server/chunks/entries/fallbacks/{error.svelte.js-CFonuZkV.js → error.svelte.js-CsCL5PMW.js} +7 -5
  310. package/build/server/chunks/entries/fallbacks/{error.svelte.js-CFonuZkV.js.map → error.svelte.js-CsCL5PMW.js.map} +1 -1
  311. package/build/server/chunks/entries/pages/{_layout.svelte.js-Dzluuq12.js → _layout.svelte.js-CBQpEToy.js} +2 -2
  312. package/build/server/chunks/entries/pages/{_layout.svelte.js-Dzluuq12.js.map → _layout.svelte.js-CBQpEToy.js.map} +1 -1
  313. package/build/server/chunks/entries/pages/_page.svelte.js-qqtU0apo.js +1641 -0
  314. package/build/server/chunks/entries/pages/_page.svelte.js-qqtU0apo.js.map +1 -0
  315. package/build/server/chunks/{handler-DS32NMsJ.js → handler-DlfTB05m.js} +3 -3
  316. package/build/server/chunks/{handler-DS32NMsJ.js.map → handler-DlfTB05m.js.map} +1 -1
  317. package/build/server/chunks/{index.js-HHu-yOEK.js → index.js-BMrd9hfO.js} +6 -5
  318. package/build/server/chunks/index.js-BMrd9hfO.js.map +1 -0
  319. package/build/server/chunks/{manifest.js-BUrA7Zyr.js → manifest.js-D1kCuVe5.js} +24 -10
  320. package/build/server/chunks/manifest.js-D1kCuVe5.js.map +1 -0
  321. package/build/server/chunks/nodes/0.js-CNFDDPj5.js +9 -0
  322. package/build/server/chunks/nodes/{0.js-gSRmrAt_.js.map → 0.js-CNFDDPj5.js.map} +1 -1
  323. package/build/server/chunks/nodes/1.js-B5FPLYnf.js +9 -0
  324. package/build/server/chunks/nodes/{1.js-D68K7Ad_.js.map → 1.js-B5FPLYnf.js.map} +1 -1
  325. package/build/server/chunks/nodes/2.js-BEuxzw6b.js +9 -0
  326. package/build/server/chunks/nodes/2.js-BEuxzw6b.js.map +1 -0
  327. package/dist/cli/completions.js +6 -0
  328. package/dist/cli/index.js +131 -88
  329. package/dist/cli/options.js +28 -2
  330. package/dist/cli/preflight.js +30 -0
  331. package/dist/cli/ui.js +18 -3
  332. package/dist/lib/cli/aws.js +12 -4
  333. package/dist/lib/log-buffer.js +443 -0
  334. package/dist/lib/log-format.js +185 -0
  335. package/dist/lib/types.js +0 -4
  336. package/package.json +6 -2
  337. package/build/client/_app/immutable/assets/0.BPmQoXaO.css +0 -2
  338. package/build/client/_app/immutable/assets/0.BPmQoXaO.css.br +0 -0
  339. package/build/client/_app/immutable/assets/0.BPmQoXaO.css.gz +0 -0
  340. package/build/client/_app/immutable/chunks/Bw_9uNRP.js.br +0 -0
  341. package/build/client/_app/immutable/chunks/Bw_9uNRP.js.gz +0 -0
  342. package/build/client/_app/immutable/chunks/De_x7GQi.js +0 -1
  343. package/build/client/_app/immutable/chunks/De_x7GQi.js.br +0 -0
  344. package/build/client/_app/immutable/chunks/De_x7GQi.js.gz +0 -0
  345. package/build/client/_app/immutable/chunks/ZAD2y5xJ.js +0 -3
  346. package/build/client/_app/immutable/chunks/ZAD2y5xJ.js.br +0 -0
  347. package/build/client/_app/immutable/chunks/ZAD2y5xJ.js.gz +0 -0
  348. package/build/client/_app/immutable/entry/app.Be166AxG.js +0 -2
  349. package/build/client/_app/immutable/entry/app.Be166AxG.js.br +0 -0
  350. package/build/client/_app/immutable/entry/app.Be166AxG.js.gz +0 -0
  351. package/build/client/_app/immutable/entry/start.clEDpQL9.js +0 -1
  352. package/build/client/_app/immutable/entry/start.clEDpQL9.js.br +0 -0
  353. package/build/client/_app/immutable/entry/start.clEDpQL9.js.gz +0 -0
  354. package/build/client/_app/immutable/nodes/0.BJ6Zdc8H.js +0 -1
  355. package/build/client/_app/immutable/nodes/0.BJ6Zdc8H.js.br +0 -4
  356. package/build/client/_app/immutable/nodes/0.BJ6Zdc8H.js.gz +0 -0
  357. package/build/client/_app/immutable/nodes/1.xMNWuLLz.js +0 -1
  358. package/build/client/_app/immutable/nodes/1.xMNWuLLz.js.br +0 -0
  359. package/build/client/_app/immutable/nodes/1.xMNWuLLz.js.gz +0 -0
  360. package/build/client/_app/immutable/nodes/2.CaxDXwmh.js +0 -5
  361. package/build/client/_app/immutable/nodes/2.CaxDXwmh.js.br +0 -0
  362. package/build/client/_app/immutable/nodes/2.CaxDXwmh.js.gz +0 -0
  363. package/build/server/chunks/chunks/env2.js-DXveJt1Y.js.map +0 -1
  364. package/build/server/chunks/chunks/exports.js-CvFPPbaH.js.map +0 -1
  365. package/build/server/chunks/chunks/internal.js-Cc3oBhL-.js.map +0 -1
  366. package/build/server/chunks/chunks/internal2.js-DZ8ZzzjN.js.map +0 -1
  367. package/build/server/chunks/chunks/server.js-ByNB8uti.js.map +0 -1
  368. package/build/server/chunks/chunks/state.js-9DxsWxU-.js.map +0 -1
  369. package/build/server/chunks/entries/endpoints/api/health/_server.ts.js-BOjix7GN.js.map +0 -1
  370. package/build/server/chunks/entries/endpoints/api/identity/_server.ts.js-g13uvmrX.js.map +0 -1
  371. package/build/server/chunks/entries/endpoints/api/log-groups/_server.ts.js-CmHRxdZK.js.map +0 -1
  372. package/build/server/chunks/entries/endpoints/api/regions/_server.ts.js-BgUwioxp.js.map +0 -1
  373. package/build/server/chunks/entries/endpoints/api/stream/_server.ts.js-CIYo4C-0.js.map +0 -1
  374. package/build/server/chunks/entries/pages/_page.svelte.js-CpwYbxbM.js +0 -1291
  375. package/build/server/chunks/entries/pages/_page.svelte.js-CpwYbxbM.js.map +0 -1
  376. package/build/server/chunks/index.js-HHu-yOEK.js.map +0 -1
  377. package/build/server/chunks/manifest.js-BUrA7Zyr.js.map +0 -1
  378. package/build/server/chunks/nodes/0.js-gSRmrAt_.js +0 -9
  379. package/build/server/chunks/nodes/1.js-D68K7Ad_.js +0 -9
  380. package/build/server/chunks/nodes/2.js-ChYsaaoC.js +0 -9
  381. package/build/server/chunks/nodes/2.js-ChYsaaoC.js.map +0 -1
@@ -0,0 +1,21 @@
1
+ //#region src/lib/server/source.ts
2
+ /** Message used for every rejected `source` value. */
3
+ var SOURCE_PARAM_HINT = "Invalid source: expected \"cloudwatch\" or \"archive\"";
4
+ /** The default when the parameter is absent. */
5
+ var DEFAULT_SOURCE = "cloudwatch";
6
+ /**
7
+ * Parses the `source` parameter.
8
+ *
9
+ * Returns `null` for an unrecognised value so the caller can answer 400 without
10
+ * guessing, and {@link DEFAULT_SOURCE} when the parameter is missing or blank.
11
+ */
12
+ function parseSourceParam(value) {
13
+ if (value === null || value === void 0) return DEFAULT_SOURCE;
14
+ const trimmed = value.trim().toLowerCase();
15
+ if (trimmed === "") return DEFAULT_SOURCE;
16
+ if (trimmed === "cloudwatch" || trimmed === "archive") return trimmed;
17
+ return null;
18
+ }
19
+
20
+ export { SOURCE_PARAM_HINT as S, parseSourceParam as p };
21
+ //# sourceMappingURL=source.js-DZEVvuho.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source.js-DZEVvuho.js","sources":["../../../../.svelte-kit/output/server/chunks/source.js"],"sourcesContent":["//#region src/lib/server/source.ts\n/** Message used for every rejected `source` value. */\nvar SOURCE_PARAM_HINT = \"Invalid source: expected \\\"cloudwatch\\\" or \\\"archive\\\"\";\n/** The default when the parameter is absent. */\nvar DEFAULT_SOURCE = \"cloudwatch\";\n/**\n* Parses the `source` parameter.\n*\n* Returns `null` for an unrecognised value so the caller can answer 400 without\n* guessing, and {@link DEFAULT_SOURCE} when the parameter is missing or blank.\n*/\nfunction parseSourceParam(value) {\n\tif (value === null || value === void 0) return DEFAULT_SOURCE;\n\tconst trimmed = value.trim().toLowerCase();\n\tif (trimmed === \"\") return DEFAULT_SOURCE;\n\tif (trimmed === \"cloudwatch\" || trimmed === \"archive\") return trimmed;\n\treturn null;\n}\n//#endregion\nexport { parseSourceParam as n, SOURCE_PARAM_HINT as t };\n"],"names":[],"mappings":"AAAA;AACA;AACG,IAAC,iBAAiB,GAAG;AACxB;AACA,IAAI,cAAc,GAAG,YAAY;AACjC;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,gBAAgB,CAAC,KAAK,EAAE;AACjC,CAAC,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,MAAM,EAAE,OAAO,cAAc;AAC9D,CAAC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE;AAC3C,CAAC,IAAI,OAAO,KAAK,EAAE,EAAE,OAAO,cAAc;AAC1C,CAAC,IAAI,OAAO,KAAK,YAAY,IAAI,OAAO,KAAK,SAAS,EAAE,OAAO,OAAO;AACtE,CAAC,OAAO,IAAI;AACZ;;"}
@@ -1,7 +1,8 @@
1
- import { i as index_server_exports } from './internal.js-Cc3oBhL-.js';
1
+ import { i as index_server_exports } from './index-server.js-DNLOKvM0.js';
2
2
  import './shared.js-CgjUIvRK.js';
3
- import './exports.js-CvFPPbaH.js';
4
- import { a3 as getContext, a1 as noop } from './server.js-ByNB8uti.js';
3
+ import './exports.js-ClPPfcHj.js';
4
+ import { g as getContext, n as noop } from './server.js-CAEBuMIH.js';
5
+ import './internal2.js-BPo5dcDi.js';
5
6
  import './utils.js-BIlHjgGW.js';
6
7
 
7
8
  var is_legacy = noop.toString().includes("$$") || /function \w+\(\) \{\}/.test(noop.toString());
@@ -83,4 +84,4 @@ var page = {
83
84
  };
84
85
 
85
86
  export { page as p, replaceState as r };
86
- //# sourceMappingURL=state.js-9DxsWxU-.js.map
87
+ //# sourceMappingURL=state.js-DgkwfYFo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.js-DgkwfYFo.js","sources":["../../../../.svelte-kit/output/server/chunks/state.js"],"sourcesContent":["import { t as index_server_exports } from \"./index-server.js\";\nimport { y as noop } from \"./shared.js\";\nimport \"./internal.js\";\nimport \"./exports.js\";\nimport { Ut as noop$1, b as getContext } from \"./server.js\";\nimport \"./index-server2.js\";\nimport \"./internal2.js\";\nimport \"@sveltejs/kit/internal\";\nimport \"@sveltejs/kit/internal/server\";\nvar PRELOAD_PRIORITIES = {\n\ttap: 1,\n\thover: 2,\n\tviewport: 3,\n\teager: 4,\n\toff: -1,\n\tfalse: -1\n};\n({ ...PRELOAD_PRIORITIES }), PRELOAD_PRIORITIES.hover;\nvar updated_listener = { v: noop };\nvar updated;\nvar is_legacy = noop$1.toString().includes(\"$$\") || /function \\w+\\(\\) \\{\\}/.test(noop$1.toString());\nvar placeholder_url = \"a:\";\nif (is_legacy) {\n\tnew URL(placeholder_url);\n\tupdated = { current: false };\n} else {\n\tnew class Page {\n\t\tdata = {};\n\t\tform = null;\n\t\terror = null;\n\t\tparams = {};\n\t\troute = { id: null };\n\t\tstate = {};\n\t\tstatus = -1;\n\t\turl = new URL(placeholder_url);\n\t}();\n\tnew class Navigating {\n\t\tcurrent = null;\n\t}();\n\tupdated = new class Updated {\n\t\tcurrent = false;\n\t}();\n\tupdated_listener.v = () => updated.current = true;\n}\n//#endregion\n//#region node_modules/.pnpm/@sveltejs+kit@2.70.3_@sveltejs+vite-plugin-svelte@7.3.0_svelte@5.57.0_vite@8.2.2_@types_ab6e39593f61aae0ad0b9a1bac6935c7/node_modules/@sveltejs/kit/src/runtime/client/client.js\n/** @import { RemoteFunctionDataNode, ServerNodesResponse, ServerRedirectNode } from 'types' */\n/** @import { CacheEntry } from './remote-functions/cache.svelte.js' */\n/** @import { Query } from './remote-functions/query/instance.svelte.js' */\n/** @import { LiveQuery } from './remote-functions/query-live/instance.svelte.js' */\nvar { onMount, tick } = index_server_exports;\n/**\n* Programmatically replace the current history entry with the given `page.state`. To use the current URL, you can pass `''` as the first argument. Used for [shallow routing](https://svelte.dev/docs/kit/shallow-routing).\n*\n* @param {string | URL} url\n* @param {App.PageState} state\n* @returns {void}\n*/\nfunction replaceState(url, state) {\n\tthrow new Error(\"Cannot call replaceState(...) on the server\");\n}\n//#endregion\n//#region node_modules/.pnpm/@sveltejs+kit@2.70.3_@sveltejs+vite-plugin-svelte@7.3.0_svelte@5.57.0_vite@8.2.2_@types_ab6e39593f61aae0ad0b9a1bac6935c7/node_modules/@sveltejs/kit/src/runtime/app/state/server.js\nfunction context() {\n\treturn getContext(\"__request__\");\n}\n//#endregion\n//#region node_modules/.pnpm/@sveltejs+kit@2.70.3_@sveltejs+vite-plugin-svelte@7.3.0_svelte@5.57.0_vite@8.2.2_@types_ab6e39593f61aae0ad0b9a1bac6935c7/node_modules/@sveltejs/kit/src/runtime/app/state/index.js\n/**\n* A read-only reactive object with information about the current page, serving several use cases:\n* - retrieving the combined `data` of all pages/layouts anywhere in your component tree (also see [loading data](https://svelte.dev/docs/kit/load))\n* - retrieving the current value of the `form` prop anywhere in your component tree (also see [form actions](https://svelte.dev/docs/kit/form-actions))\n* - retrieving the page state that was set through `goto`, `pushState` or `replaceState` (also see [goto](https://svelte.dev/docs/kit/$app-navigation#goto) and [shallow routing](https://svelte.dev/docs/kit/shallow-routing))\n* - retrieving metadata such as the URL you're on, the current route and its parameters, and whether or not there was an error\n*\n* ```svelte\n* <!--- file: +layout.svelte --->\n* <script>\n* \timport { page } from '$app/state';\n* <\\/script>\n*\n* <p>Currently at {page.url.pathname}</p>\n*\n* {#if page.error}\n* \t<span class=\"red\">Problem detected</span>\n* {:else}\n* \t<span class=\"small\">All systems operational</span>\n* {/if}\n* ```\n*\n* Changes to `page` are available exclusively with runes. (The legacy reactivity syntax will not reflect any changes)\n*\n* ```svelte\n* <!--- file: +page.svelte --->\n* <script>\n* \timport { page } from '$app/state';\n* \tconst id = $derived(page.params.id); // This will correctly update id for usage on this page\n* \t$: badId = page.params.id; // Do not use; will never update after initial load\n* <\\/script>\n* ```\n*\n* On the server, values can only be read during rendering (in other words _not_ in e.g. `load` functions). In the browser, the values can be read at any time.\n*\n* @type {import('@sveltejs/kit').Page}\n*/\nvar page = {\n\tget data() {\n\t\treturn context().page.data;\n\t},\n\tget error() {\n\t\treturn context().page.error;\n\t},\n\tget form() {\n\t\treturn context().page.form;\n\t},\n\tget params() {\n\t\treturn context().page.params;\n\t},\n\tget route() {\n\t\treturn context().page.route;\n\t},\n\tget state() {\n\t\treturn context().page.state;\n\t},\n\tget status() {\n\t\treturn context().page.status;\n\t},\n\tget url() {\n\t\treturn context().page.url;\n\t}\n};\n//#endregion\nexport { replaceState as n, page as t };\n"],"names":["noop$1"],"mappings":";;;;;;;AAoBA,IAAI,SAAS,GAAGA,IAAM,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,uBAAuB,CAAC,IAAI,CAACA,IAAM,CAAC,QAAQ,EAAE,CAAC;AACnG,IAAI,eAAe,GAAG,IAAI;AAC1B,IAAI,SAAS,EAAE;AACf,CAAC,IAAI,GAAG,CAAC,eAAe,CAAC;AAEzB;AAmBA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,oBAAoB;AAC5C;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS,YAAY,CAAC,GAAG,EAAE,KAAK,EAAE;AAClC,CAAC,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC;AAC/D;AACA;AACA;AACA,SAAS,OAAO,GAAG;AACnB,CAAC,OAAO,UAAU,CAAC,aAAa,CAAC;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACG,IAAC,IAAI,GAAG;AACX,CAGC,IAAI,KAAK,GAAG;AACb,EAAE,OAAO,OAAO,EAAE,CAAC,IAAI,CAAC,KAAK;AAC7B,CAAC,CAAC;AACF,CAYC,IAAI,MAAM,GAAG;AACd,EAAE,OAAO,OAAO,EAAE,CAAC,IAAI,CAAC,MAAM;AAC9B,CAAC,CAAC;AACF,CAAC,IAAI,GAAG,GAAG;AACX,EAAE,OAAO,OAAO,EAAE,CAAC,IAAI,CAAC,GAAG;AAC3B,CAAC;AACD;;"}
@@ -0,0 +1,11 @@
1
+ //#region node_modules/.pnpm/layerchart@2.5.0_@sveltejs+kit@2.70.3_@sveltejs+vite-plugin-svelte@7.3.0_svelte@5.57.0__9bc60734f10d29b7556189549fab5703/node_modules/layerchart/dist/utils/types.js
2
+ /**
3
+ * Useful to workaround Svelte 3/4 markup type issues
4
+ * TODO: Remove usage after migrating to Svelte 5
5
+ */
6
+ function asAny(x) {
7
+ return x;
8
+ }
9
+
10
+ export { asAny as a };
11
+ //# sourceMappingURL=types.js-x3GyGPOz.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js-x3GyGPOz.js","sources":["../../../../.svelte-kit/output/server/chunks/types.js"],"sourcesContent":["//#region node_modules/.pnpm/layerchart@2.5.0_@sveltejs+kit@2.70.3_@sveltejs+vite-plugin-svelte@7.3.0_svelte@5.57.0__9bc60734f10d29b7556189549fab5703/node_modules/layerchart/dist/utils/types.js\n/**\n* Useful to workaround Svelte 3/4 markup type issues\n* TODO: Remove usage after migrating to Svelte 5\n*/\nfunction asAny(x) {\n\treturn x;\n}\n//#endregion\nexport { asAny as t };\n"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA,SAAS,KAAK,CAAC,CAAC,EAAE;AAClB,CAAC,OAAO,CAAC;AACT;;"}
@@ -0,0 +1,39 @@
1
+ import { g as getArchive } from '../../../../chunks/archive.js-C2D-5edp.js';
2
+ import { r as readEnv } from '../../../../chunks/env2.js-CcIskxOZ.js';
3
+ import { j as json } from '../../../../chunks/utils.js-BIlHjgGW.js';
4
+ import '../../../../chunks/log-buffer.js-BI_gQOls.js';
5
+ import 'node:fs';
6
+ import 'node:os';
7
+ import 'node:path';
8
+ import 'node:timers/promises';
9
+ import 'node:crypto';
10
+ import '../../../../chunks/shared-server.js-Dn5XheXH.js';
11
+ import '../../../../chunks/shared.js-CgjUIvRK.js';
12
+ import '../../../../chunks/uneval.js-DaakSYFQ.js';
13
+
14
+ //#region src/routes/api/archive/+server.ts
15
+ /**
16
+ * `GET /api/archive` - what the local DuckDB archive holds.
17
+ *
18
+ * Never fails: an archive that is off by configuration, missing its optional
19
+ * driver or unreadable answers 200 with `available: false` and the reason, so
20
+ * the UI can hide the archive view instead of showing an error.
21
+ */
22
+ var GET = async () => {
23
+ const status = await (await getArchive(readEnv())).status();
24
+ const body = {
25
+ path: status.path,
26
+ available: status.available,
27
+ error: status.error,
28
+ bytes: status.bytes,
29
+ rows: status.totals.rows,
30
+ groups: status.totals.groups,
31
+ regions: status.totals.regions,
32
+ oldest: status.totals.oldest,
33
+ newest: status.totals.newest
34
+ };
35
+ return json(body);
36
+ };
37
+
38
+ export { GET };
39
+ //# sourceMappingURL=_server.ts.js-83Ch7djd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_server.ts.js-83Ch7djd.js","sources":["../../../../../../../.svelte-kit/output/server/entries/endpoints/api/archive/_server.ts.js"],"sourcesContent":["import { t as getArchive } from \"../../../../chunks/archive.js\";\nimport { t as readEnv } from \"../../../../chunks/env2.js\";\nimport { json } from \"@sveltejs/kit\";\n//#region src/routes/api/archive/+server.ts\n/**\n* `GET /api/archive` - what the local DuckDB archive holds.\n*\n* Never fails: an archive that is off by configuration, missing its optional\n* driver or unreadable answers 200 with `available: false` and the reason, so\n* the UI can hide the archive view instead of showing an error.\n*/\nvar GET = async () => {\n\tconst status = await (await getArchive(readEnv())).status();\n\tconst body = {\n\t\tpath: status.path,\n\t\tavailable: status.available,\n\t\terror: status.error,\n\t\tbytes: status.bytes,\n\t\trows: status.totals.rows,\n\t\tgroups: status.totals.groups,\n\t\tregions: status.totals.regions,\n\t\toldest: status.totals.oldest,\n\t\tnewest: status.totals.newest\n\t};\n\treturn json(body);\n};\n//#endregion\nexport { GET };\n"],"names":[],"mappings":";;;;;;;;;;;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACG,IAAC,GAAG,GAAG,YAAY;AACtB,CAAC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,UAAU,CAAC,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE;AAC5D,CAAC,MAAM,IAAI,GAAG;AACd,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI;AACnB,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS;AAC7B,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK;AACrB,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK;AACrB,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI;AAC1B,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM;AAC9B,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO;AAChC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM;AAC9B,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC;AACxB,EAAE;AACF,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC;AAClB;;"}
@@ -1,10 +1,11 @@
1
- import { p as parseRegionParam, a as apiError, r as resolveAwsConfig, b as readEnv, c as createLogsClient, d as resolveEffectiveRegion, e as describeAwsError, R as REGION_PARAM_HINT } from '../../../../chunks/env2.js-DXveJt1Y.js';
1
+ import { r as readEnv } from '../../../../chunks/env2.js-CcIskxOZ.js';
2
+ import { p as parseRegionParam, a as apiError, r as resolveAwsConfig, c as createLogsClient, b as resolveEffectiveRegion, d as describeAwsError, R as REGION_PARAM_HINT } from '../../../../chunks/aws.js-DkPqAybc.js';
2
3
  import { j as json } from '../../../../chunks/utils.js-BIlHjgGW.js';
3
4
  import '../../../../chunks/shared-server.js-Dn5XheXH.js';
4
- import '@aws-sdk/client-cloudwatch-logs';
5
- import '@aws-sdk/client-sts';
6
5
  import 'node:fs';
7
6
  import 'node:path';
7
+ import '@aws-sdk/client-cloudwatch-logs';
8
+ import '@aws-sdk/client-sts';
8
9
  import '../../../../chunks/shared.js-CgjUIvRK.js';
9
10
  import '../../../../chunks/uneval.js-DaakSYFQ.js';
10
11
 
@@ -39,4 +40,4 @@ var GET = async ({ url }) => {
39
40
  };
40
41
 
41
42
  export { GET };
42
- //# sourceMappingURL=_server.ts.js-BOjix7GN.js.map
43
+ //# sourceMappingURL=_server.ts.js-VctnBhIJ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_server.ts.js-VctnBhIJ.js","sources":["../../../../../../../.svelte-kit/output/server/entries/endpoints/api/health/_server.ts.js"],"sourcesContent":["import { t as readEnv } from \"../../../../chunks/env2.js\";\nimport { a as describeAwsError, c as resolveEffectiveRegion, l as apiError, n as REGION_PARAM_HINT, o as parseRegionParam, r as createLogsClient, s as resolveAwsConfig } from \"../../../../chunks/aws.js\";\nimport { json } from \"@sveltejs/kit\";\n//#region src/routes/api/health/+server.ts\n/**\n* `GET /api/health?region=` - reports the effective CloudWatch Logs region and endpoint.\n*\n* The region is optional: when it is not supplied anywhere the SDK resolves it\n* from the ambient AWS configuration.\n*/\nvar GET = async ({ url }) => {\n\tconst parsed = parseRegionParam(url.searchParams.get(\"region\"));\n\tif (!parsed.ok) return apiError(400, REGION_PARAM_HINT, \"invalid-region\");\n\tconst config = resolveAwsConfig(readEnv(), parsed.region);\n\tlet client;\n\ttry {\n\t\tclient = createLogsClient(config);\n\t\tconst body = {\n\t\t\tok: true,\n\t\t\tregion: await resolveEffectiveRegion(client, config),\n\t\t\tendpoint: config.endpoint,\n\t\t\tlocal: config.local,\n\t\t\tcredentials: config.credentials\n\t\t};\n\t\treturn json(body);\n\t} catch (error) {\n\t\tconst described = describeAwsError(error);\n\t\treturn apiError(502, described.message, described.code);\n\t} finally {\n\t\tclient?.destroy();\n\t}\n};\n//#endregion\nexport { GET };\n"],"names":[],"mappings":";;;;;;;;;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACG,IAAC,GAAG,GAAG,OAAO,EAAE,GAAG,EAAE,KAAK;AAC7B,CAAC,MAAM,MAAM,GAAG,gBAAgB,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;AAChE,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,OAAO,QAAQ,CAAC,GAAG,EAAE,iBAAiB,EAAE,gBAAgB,CAAC;AAC1E,CAAC,MAAM,MAAM,GAAG,gBAAgB,CAAC,OAAO,EAAE,EAAE,MAAM,CAAC,MAAM,CAAC;AAC1D,CAAC,IAAI,MAAM;AACX,CAAC,IAAI;AACL,EAAE,MAAM,GAAG,gBAAgB,CAAC,MAAM,CAAC;AACnC,EAAE,MAAM,IAAI,GAAG;AACf,GAAG,EAAE,EAAE,IAAI;AACX,GAAG,MAAM,EAAE,MAAM,sBAAsB,CAAC,MAAM,EAAE,MAAM,CAAC;AACvD,GAAG,QAAQ,EAAE,MAAM,CAAC,QAAQ;AAC5B,GAAG,KAAK,EAAE,MAAM,CAAC,KAAK;AACtB,GAAG,WAAW,EAAE,MAAM,CAAC;AACvB,GAAG;AACH,EAAE,OAAO,IAAI,CAAC,IAAI,CAAC;AACnB,CAAC,CAAC,CAAC,OAAO,KAAK,EAAE;AACjB,EAAE,MAAM,SAAS,GAAG,gBAAgB,CAAC,KAAK,CAAC;AAC3C,EAAE,OAAO,QAAQ,CAAC,GAAG,EAAE,SAAS,CAAC,OAAO,EAAE,SAAS,CAAC,IAAI,CAAC;AACzD,CAAC,CAAC,SAAS;AACX,EAAE,MAAM,EAAE,OAAO,EAAE;AACnB,CAAC;AACD;;"}
@@ -1,10 +1,11 @@
1
- import { p as parseRegionParam, a as apiError, b as readEnv, r as resolveAwsConfig, f as createStsClient, d as resolveEffectiveRegion, e as describeAwsError, R as REGION_PARAM_HINT } from '../../../../chunks/env2.js-DXveJt1Y.js';
1
+ import { r as readEnv } from '../../../../chunks/env2.js-CcIskxOZ.js';
2
+ import { p as parseRegionParam, a as apiError, r as resolveAwsConfig, e as createStsClient, b as resolveEffectiveRegion, d as describeAwsError, R as REGION_PARAM_HINT } from '../../../../chunks/aws.js-DkPqAybc.js';
2
3
  import { j as json } from '../../../../chunks/utils.js-BIlHjgGW.js';
3
4
  import { GetCallerIdentityCommand } from '@aws-sdk/client-sts';
4
5
  import '../../../../chunks/shared-server.js-Dn5XheXH.js';
5
- import '@aws-sdk/client-cloudwatch-logs';
6
6
  import 'node:fs';
7
7
  import 'node:path';
8
+ import '@aws-sdk/client-cloudwatch-logs';
8
9
  import '../../../../chunks/shared.js-CgjUIvRK.js';
9
10
  import '../../../../chunks/uneval.js-DaakSYFQ.js';
10
11
 
@@ -69,4 +70,4 @@ var GET = async ({ url, request }) => {
69
70
  };
70
71
 
71
72
  export { GET };
72
- //# sourceMappingURL=_server.ts.js-g13uvmrX.js.map
73
+ //# sourceMappingURL=_server.ts.js-Dt540Sio.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_server.ts.js-Dt540Sio.js","sources":["../../../../../../../.svelte-kit/output/server/entries/endpoints/api/identity/_server.ts.js"],"sourcesContent":["import { t as readEnv } from \"../../../../chunks/env2.js\";\nimport { a as describeAwsError, c as resolveEffectiveRegion, i as createStsClient, l as apiError, n as REGION_PARAM_HINT, o as parseRegionParam, s as resolveAwsConfig } from \"../../../../chunks/aws.js\";\nimport { json } from \"@sveltejs/kit\";\nimport { GetCallerIdentityCommand } from \"@aws-sdk/client-sts\";\n//#region src/lib/server/identity.ts\n/**\n* `sts:GetCallerIdentity` for the resolved configuration.\n*\n* This is the cheapest honest answer to \"do these credentials work, and whose\n* are they?\": one call, no permissions beyond the implicit\n* `sts:GetCallerIdentity`, and it returns the ARN to show the user.\n*/\n/** Reads the caller identity with an existing client. */\nasync function getCallerIdentityWith(client, options = {}) {\n\tconst response = await client.send(new GetCallerIdentityCommand({}), { abortSignal: options.signal });\n\treturn {\n\t\tarn: response.Arn ?? \"\",\n\t\taccount: response.Account ?? \"\",\n\t\tuserId: response.UserId ?? \"\"\n\t};\n}\n//#endregion\n//#region src/routes/api/identity/+server.ts\n/**\n* `GET /api/identity` - whose credentials are these?\n*\n* `sts:GetCallerIdentity` needs no permissions of its own, so a 200 here means\n* the ambient credentials are usable, and the ARN says which account they belong\n* to. The CLI uses it to avoid offering a login for a profile that already\n* works, and to report what it signed in as.\n*\n* The region is optional, like everywhere else: without one the SDK resolves it\n* from the ambient configuration.\n*/\nvar GET = async ({ url, request }) => {\n\tconst parsedRegion = parseRegionParam(url.searchParams.get(\"region\"));\n\tif (!parsedRegion.ok) return apiError(400, REGION_PARAM_HINT, \"invalid-region\");\n\tconst env = readEnv();\n\tconst config = resolveAwsConfig(env, parsedRegion.region);\n\tlet client;\n\tlet region;\n\ttry {\n\t\tclient = createStsClient(config);\n\t\tregion = await resolveEffectiveRegion(client, config);\n\t} catch (error) {\n\t\tconst described = describeAwsError(error);\n\t\treturn apiError(502, described.message, described.code);\n\t}\n\ttry {\n\t\tconst body = {\n\t\t\t...await getCallerIdentityWith(client, { signal: request.signal }),\n\t\t\tregion,\n\t\t\tendpoint: config.endpoint\n\t\t};\n\t\treturn json(body);\n\t} catch (error) {\n\t\tif (request.signal.aborted || error instanceof Error && error.name === \"AbortError\") return apiError(499, \"The client closed the request before STS replied\", \"aborted\");\n\t\tconst described = describeAwsError(error);\n\t\treturn apiError(502, described.message, described.code);\n\t} finally {\n\t\tclient.destroy();\n\t}\n};\n//#endregion\nexport { GET };\n"],"names":[],"mappings":";;;;;;;;;;;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,eAAe,qBAAqB,CAAC,MAAM,EAAE,OAAO,GAAG,EAAE,EAAE;AAC3D,CAAC,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,IAAI,wBAAwB,CAAC,EAAE,CAAC,EAAE,EAAE,WAAW,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;AACtG,CAAC,OAAO;AACR,EAAE,GAAG,EAAE,QAAQ,CAAC,GAAG,IAAI,EAAE;AACzB,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,IAAI,EAAE;AACjC,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,IAAI;AAC7B,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACG,IAAC,GAAG,GAAG,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK;AACtC,CAAC,MAAM,YAAY,GAAG,gBAAgB,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;AACtE,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,OAAO,QAAQ,CAAC,GAAG,EAAE,iBAAiB,EAAE,gBAAgB,CAAC;AAChF,CAAC,MAAM,GAAG,GAAG,OAAO,EAAE;AACtB,CAAC,MAAM,MAAM,GAAG,gBAAgB,CAAC,GAAG,EAAE,YAAY,CAAC,MAAM,CAAC;AAC1D,CAAC,IAAI,MAAM;AACX,CAAC,IAAI,MAAM;AACX,CAAC,IAAI;AACL,EAAE,MAAM,GAAG,eAAe,CAAC,MAAM,CAAC;AAClC,EAAE,MAAM,GAAG,MAAM,sBAAsB,CAAC,MAAM,EAAE,MAAM,CAAC;AACvD,CAAC,CAAC,CAAC,OAAO,KAAK,EAAE;AACjB,EAAE,MAAM,SAAS,GAAG,gBAAgB,CAAC,KAAK,CAAC;AAC3C,EAAE,OAAO,QAAQ,CAAC,GAAG,EAAE,SAAS,CAAC,OAAO,EAAE,SAAS,CAAC,IAAI,CAAC;AACzD,CAAC;AACD,CAAC,IAAI;AACL,EAAE,MAAM,IAAI,GAAG;AACf,GAAG,GAAG,MAAM,qBAAqB,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;AACrE,GAAG,MAAM;AACT,GAAG,QAAQ,EAAE,MAAM,CAAC;AACpB,GAAG;AACH,EAAE,OAAO,IAAI,CAAC,IAAI,CAAC;AACnB,CAAC,CAAC,CAAC,OAAO,KAAK,EAAE;AACjB,EAAE,IAAI,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE,OAAO,QAAQ,CAAC,GAAG,EAAE,kDAAkD,EAAE,SAAS,CAAC;AAC1K,EAAE,MAAM,SAAS,GAAG,gBAAgB,CAAC,KAAK,CAAC;AAC3C,EAAE,OAAO,QAAQ,CAAC,GAAG,EAAE,SAAS,CAAC,OAAO,EAAE,SAAS,CAAC,IAAI,CAAC;AACzD,CAAC,CAAC,SAAS;AACX,EAAE,MAAM,CAAC,OAAO,EAAE;AAClB,CAAC;AACD;;"}
@@ -1,10 +1,17 @@
1
- import { p as parseRegionParam, a as apiError, b as readEnv, r as resolveAwsConfig, c as createLogsClient, d as resolveEffectiveRegion, e as describeAwsError, R as REGION_PARAM_HINT } from '../../../../chunks/env2.js-DXveJt1Y.js';
1
+ import { g as getArchive } from '../../../../chunks/archive.js-C2D-5edp.js';
2
+ import { r as readEnv } from '../../../../chunks/env2.js-CcIskxOZ.js';
3
+ import { p as parseRegionParam, a as apiError, r as resolveAwsConfig, c as createLogsClient, b as resolveEffectiveRegion, d as describeAwsError, R as REGION_PARAM_HINT } from '../../../../chunks/aws.js-DkPqAybc.js';
4
+ import { p as parseSourceParam, S as SOURCE_PARAM_HINT } from '../../../../chunks/source.js-DZEVvuho.js';
2
5
  import { j as json } from '../../../../chunks/utils.js-BIlHjgGW.js';
3
6
  import { DescribeLogGroupsCommand } from '@aws-sdk/client-cloudwatch-logs';
4
- import '../../../../chunks/shared-server.js-Dn5XheXH.js';
5
- import '@aws-sdk/client-sts';
7
+ import '../../../../chunks/log-buffer.js-BI_gQOls.js';
6
8
  import 'node:fs';
9
+ import 'node:os';
7
10
  import 'node:path';
11
+ import 'node:timers/promises';
12
+ import 'node:crypto';
13
+ import '../../../../chunks/shared-server.js-Dn5XheXH.js';
14
+ import '@aws-sdk/client-sts';
8
15
  import '../../../../chunks/shared.js-CgjUIvRK.js';
9
16
  import '../../../../chunks/uneval.js-DaakSYFQ.js';
10
17
 
@@ -67,15 +74,41 @@ async function listLogGroups(client, options = {}) {
67
74
  } while (nextToken !== void 0 && nextToken.length > 0 && collected.length < limit);
68
75
  return collected.toSorted(byName);
69
76
  }
77
+ /** Maps archived group rows onto the summary the group list renders. */
78
+ function archivedGroupSummaries(rows) {
79
+ return rows.map((row) => {
80
+ const summary = {
81
+ name: row.logGroup,
82
+ archivedEvents: row.events
83
+ };
84
+ if (row.oldest !== null) summary.archivedOldest = row.oldest;
85
+ if (row.newest !== null) summary.archivedNewest = row.newest;
86
+ return summary;
87
+ });
88
+ }
89
+ /**
90
+ * Lists the log groups the local archive holds.
91
+ *
92
+ * The archive needs no credentials, so this works when CloudWatch is
93
+ * unreachable. Groups are filtered by prefix and clamped to `limit` in process,
94
+ * because the query already returns at most one row per group.
95
+ */
96
+ function listArchivedGroups(rows, options = {}) {
97
+ const prefix = options.prefix?.trim() ?? "";
98
+ const limit = clampLimit(options.limit);
99
+ return archivedGroupSummaries(rows).filter((summary) => prefix.length === 0 || summary.name.startsWith(prefix)).slice(0, limit).toSorted(byName);
100
+ }
70
101
  //#endregion
71
102
  //#region src/routes/api/log-groups/+server.ts
72
103
  var MAX_LIMIT = 1e3;
73
104
  /**
74
- * `GET /api/log-groups?region=&prefix=&limit=` - lists log groups for a region.
105
+ * `GET /api/log-groups?region=&prefix=&limit=&source=` - lists log groups.
75
106
  *
76
- * The region is optional: without it the SDK resolves the region from the
77
- * ambient AWS configuration. `request.signal` is forwarded to the SDK so a
78
- * disconnected client cancels the pagination loop.
107
+ * `source=cloudwatch` (the default) asks CloudWatch Logs for the region; the
108
+ * region is optional there, because the SDK resolves it from the ambient AWS
109
+ * configuration. `source=archive` lists what the local DuckDB file holds for
110
+ * that region and needs no credentials at all. `request.signal` is forwarded to
111
+ * the SDK so a disconnected client cancels the pagination loop.
79
112
  */
80
113
  var GET = async ({ url, request }) => {
81
114
  const parsedRegion = parseRegionParam(url.searchParams.get("region"));
@@ -92,7 +125,22 @@ var GET = async ({ url, request }) => {
92
125
  if (Number.isInteger(configured) && configured >= 1 && configured <= MAX_LIMIT) limit = configured;
93
126
  }
94
127
  const prefix = url.searchParams.get("prefix")?.trim();
128
+ const source = parseSourceParam(url.searchParams.get("source"));
129
+ if (source === null) return apiError(400, SOURCE_PARAM_HINT, "invalid-source");
95
130
  const config = resolveAwsConfig(env, parsedRegion.region);
131
+ if (source === "archive") {
132
+ const groups = listArchivedGroups(await (await getArchive(env)).groups(config.region), {
133
+ prefix,
134
+ limit
135
+ });
136
+ const body = {
137
+ region: config.region ?? "",
138
+ endpoint: null,
139
+ source,
140
+ groups
141
+ };
142
+ return json(body);
143
+ }
96
144
  let client;
97
145
  try {
98
146
  client = createLogsClient(config);
@@ -105,6 +153,7 @@ var GET = async ({ url, request }) => {
105
153
  const body = {
106
154
  region,
107
155
  endpoint: config.endpoint,
156
+ source,
108
157
  groups
109
158
  };
110
159
  return json(body);
@@ -118,4 +167,4 @@ var GET = async ({ url, request }) => {
118
167
  };
119
168
 
120
169
  export { GET };
121
- //# sourceMappingURL=_server.ts.js-CmHRxdZK.js.map
170
+ //# sourceMappingURL=_server.ts.js-drLgUdvB.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_server.ts.js-drLgUdvB.js","sources":["../../../../../../../.svelte-kit/output/server/entries/endpoints/api/log-groups/_server.ts.js"],"sourcesContent":["import { t as getArchive } from \"../../../../chunks/archive.js\";\nimport { t as readEnv } from \"../../../../chunks/env2.js\";\nimport { a as describeAwsError, c as resolveEffectiveRegion, l as apiError, n as REGION_PARAM_HINT, o as parseRegionParam, r as createLogsClient, s as resolveAwsConfig } from \"../../../../chunks/aws.js\";\nimport { n as parseSourceParam, t as SOURCE_PARAM_HINT } from \"../../../../chunks/source.js\";\nimport { json } from \"@sveltejs/kit\";\nimport { DescribeLogGroupsCommand } from \"@aws-sdk/client-cloudwatch-logs\";\n//#region src/lib/server/log-groups.ts\n/** Page size requested from `DescribeLogGroups` (the API maximum). */\nvar PAGE_SIZE = 50;\nvar DEFAULT_LIMIT = 200;\nvar MIN_LIMIT = 1;\nvar MAX_LIMIT$1 = 1e3;\n/** Clamps the result limit into the supported 1..1000 range. */\nfunction clampLimit(limit) {\n\tif (limit === void 0 || !Number.isFinite(limit)) return DEFAULT_LIMIT;\n\treturn Math.min(Math.max(Math.floor(limit), MIN_LIMIT), MAX_LIMIT$1);\n}\n/** Maps an SDK log group onto the wire type, omitting absent fields. */\nfunction toSummary(group) {\n\tconst summary = { name: group.logGroupName ?? \"\" };\n\tif (group.arn !== void 0) summary.arn = group.arn;\n\tif (group.storedBytes !== void 0) summary.storedBytes = group.storedBytes;\n\tif (group.retentionInDays !== void 0) summary.retentionInDays = group.retentionInDays;\n\tif (group.creationTime !== void 0) summary.creationTime = group.creationTime;\n\treturn summary;\n}\n/** Locale-independent name comparison for a stable sort. */\nfunction byName(a, b) {\n\tif (a.name === b.name) return 0;\n\treturn a.name < b.name ? -1 : 1;\n}\n/**\n* Lists log groups for a region.\n*\n* Pages through `DescribeLogGroups` (50 per page, honouring `nextToken`),\n* filters by prefix on the client too because some emulators ignore\n* `logGroupNamePrefix`, de-duplicates by name, sorts by name and stops at\n* `limit` (default 200, clamped to 1..1000).\n*/\nasync function listLogGroups(client, options = {}) {\n\tconst prefix = options.prefix?.trim() ?? \"\";\n\tconst limit = clampLimit(options.limit);\n\tconst { signal } = options;\n\tconst collected = [];\n\tconst seenNames = /* @__PURE__ */ new Set();\n\tlet nextToken;\n\tdo {\n\t\tif (signal?.aborted) break;\n\t\tconst input = { limit: PAGE_SIZE };\n\t\tif (nextToken !== void 0) input.nextToken = nextToken;\n\t\tif (prefix.length > 0) input.logGroupNamePrefix = prefix;\n\t\tconst response = await client.send(new DescribeLogGroupsCommand(input), { abortSignal: signal });\n\t\tfor (const group of response.logGroups ?? []) {\n\t\t\tconst name = group.logGroupName;\n\t\t\tif (name === void 0 || name.length === 0) continue;\n\t\t\tif (prefix.length > 0 && !name.startsWith(prefix)) continue;\n\t\t\tif (seenNames.has(name)) continue;\n\t\t\tseenNames.add(name);\n\t\t\tcollected.push(toSummary(group));\n\t\t\tif (collected.length >= limit) break;\n\t\t}\n\t\tnextToken = response.nextToken;\n\t} while (nextToken !== void 0 && nextToken.length > 0 && collected.length < limit);\n\treturn collected.toSorted(byName);\n}\n/** Maps archived group rows onto the summary the group list renders. */\nfunction archivedGroupSummaries(rows) {\n\treturn rows.map((row) => {\n\t\tconst summary = {\n\t\t\tname: row.logGroup,\n\t\t\tarchivedEvents: row.events\n\t\t};\n\t\tif (row.oldest !== null) summary.archivedOldest = row.oldest;\n\t\tif (row.newest !== null) summary.archivedNewest = row.newest;\n\t\treturn summary;\n\t});\n}\n/**\n* Lists the log groups the local archive holds.\n*\n* The archive needs no credentials, so this works when CloudWatch is\n* unreachable. Groups are filtered by prefix and clamped to `limit` in process,\n* because the query already returns at most one row per group.\n*/\nfunction listArchivedGroups(rows, options = {}) {\n\tconst prefix = options.prefix?.trim() ?? \"\";\n\tconst limit = clampLimit(options.limit);\n\treturn archivedGroupSummaries(rows).filter((summary) => prefix.length === 0 || summary.name.startsWith(prefix)).slice(0, limit).toSorted(byName);\n}\n//#endregion\n//#region src/routes/api/log-groups/+server.ts\nvar MAX_LIMIT = 1e3;\n/**\n* `GET /api/log-groups?region=&prefix=&limit=&source=` - lists log groups.\n*\n* `source=cloudwatch` (the default) asks CloudWatch Logs for the region; the\n* region is optional there, because the SDK resolves it from the ambient AWS\n* configuration. `source=archive` lists what the local DuckDB file holds for\n* that region and needs no credentials at all. `request.signal` is forwarded to\n* the SDK so a disconnected client cancels the pagination loop.\n*/\nvar GET = async ({ url, request }) => {\n\tconst parsedRegion = parseRegionParam(url.searchParams.get(\"region\"));\n\tif (!parsedRegion.ok) return apiError(400, REGION_PARAM_HINT, \"invalid-region\");\n\tconst env = readEnv();\n\tconst limitRaw = url.searchParams.get(\"limit\")?.trim() ?? \"\";\n\tlet limit;\n\tif (limitRaw.length > 0) {\n\t\tconst parsed = Number(limitRaw);\n\t\tif (!Number.isInteger(parsed) || parsed < 1 || parsed > MAX_LIMIT) return apiError(400, `Invalid limit: expected an integer between 1 and ${MAX_LIMIT}`, \"invalid-limit\");\n\t\tlimit = parsed;\n\t} else {\n\t\tconst configured = Number((env.WATCH_STREAM_LIMIT ?? \"\").trim());\n\t\tif (Number.isInteger(configured) && configured >= 1 && configured <= MAX_LIMIT) limit = configured;\n\t}\n\tconst prefix = url.searchParams.get(\"prefix\")?.trim();\n\tconst source = parseSourceParam(url.searchParams.get(\"source\"));\n\tif (source === null) return apiError(400, SOURCE_PARAM_HINT, \"invalid-source\");\n\tconst config = resolveAwsConfig(env, parsedRegion.region);\n\tif (source === \"archive\") {\n\t\tconst groups = listArchivedGroups(await (await getArchive(env)).groups(config.region), {\n\t\t\tprefix,\n\t\t\tlimit\n\t\t});\n\t\tconst body = {\n\t\t\tregion: config.region ?? \"\",\n\t\t\tendpoint: null,\n\t\t\tsource,\n\t\t\tgroups\n\t\t};\n\t\treturn json(body);\n\t}\n\tlet client;\n\ttry {\n\t\tclient = createLogsClient(config);\n\t\tconst region = await resolveEffectiveRegion(client, config);\n\t\tconst groups = await listLogGroups(client, {\n\t\t\tprefix: prefix !== void 0 && prefix.length > 0 ? prefix : void 0,\n\t\t\tlimit,\n\t\t\tsignal: request.signal\n\t\t});\n\t\tconst body = {\n\t\t\tregion,\n\t\t\tendpoint: config.endpoint,\n\t\t\tsource,\n\t\t\tgroups\n\t\t};\n\t\treturn json(body);\n\t} catch (error) {\n\t\tif (request.signal.aborted || error instanceof Error && error.name === \"AbortError\") return apiError(499, \"The client closed the request before CloudWatch Logs replied\", \"aborted\");\n\t\tconst described = describeAwsError(error);\n\t\treturn apiError(502, described.message, described.code);\n\t} finally {\n\t\tclient?.destroy();\n\t}\n};\n//#endregion\nexport { GET };\n"],"names":[],"mappings":"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"}
@@ -1,11 +1,12 @@
1
- import { p as parseRegionParam, a as apiError, b as readEnv, r as resolveAwsConfig, c as createLogsClient, d as resolveEffectiveRegion, e as describeAwsError, R as REGION_PARAM_HINT } from '../../../../chunks/env2.js-DXveJt1Y.js';
1
+ import { r as readEnv } from '../../../../chunks/env2.js-CcIskxOZ.js';
2
+ import { p as parseRegionParam, a as apiError, r as resolveAwsConfig, c as createLogsClient, b as resolveEffectiveRegion, d as describeAwsError, R as REGION_PARAM_HINT } from '../../../../chunks/aws.js-DkPqAybc.js';
2
3
  import { R as REGION_CODES } from '../../../../chunks/regions.js-IQPMyP5C.js';
3
4
  import { j as json } from '../../../../chunks/utils.js-BIlHjgGW.js';
4
5
  import '../../../../chunks/shared-server.js-Dn5XheXH.js';
5
- import '@aws-sdk/client-cloudwatch-logs';
6
- import '@aws-sdk/client-sts';
7
6
  import 'node:fs';
8
7
  import 'node:path';
8
+ import '@aws-sdk/client-cloudwatch-logs';
9
+ import '@aws-sdk/client-sts';
9
10
  import '../../../../chunks/shared.js-CgjUIvRK.js';
10
11
  import '../../../../chunks/uneval.js-DaakSYFQ.js';
11
12
 
@@ -86,4 +87,4 @@ var GET = async ({ url }) => {
86
87
  };
87
88
 
88
89
  export { GET };
89
- //# sourceMappingURL=_server.ts.js-BgUwioxp.js.map
90
+ //# sourceMappingURL=_server.ts.js-CBqfN6Pg.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_server.ts.js-CBqfN6Pg.js","sources":["../../../../../../../.svelte-kit/output/server/entries/endpoints/api/regions/_server.ts.js"],"sourcesContent":["import { t as readEnv } from \"../../../../chunks/env2.js\";\nimport { a as describeAwsError, c as resolveEffectiveRegion, l as apiError, n as REGION_PARAM_HINT, o as parseRegionParam, r as createLogsClient, s as resolveAwsConfig } from \"../../../../chunks/aws.js\";\nimport { t as REGION_CODES } from \"../../../../chunks/regions.js\";\nimport { json } from \"@sveltejs/kit\";\n//#region src/lib/server/regions.ts\n/**\n* Region list used when `WATCH_STREAM_REGIONS` is unset.\n*\n* Every AWS region that publishes CloudWatch Logs endpoints, including\n* `af-south-1`; see `$lib/regions`.\n*/\nvar FALLBACK_REGIONS = [...REGION_CODES];\n/** Splits a comma-separated region list, trimming and dropping blanks. */\nfunction parseRegionList(value) {\n\tif (typeof value !== \"string\") return [];\n\tconst regions = [];\n\tfor (const part of value.split(\",\")) {\n\t\tconst region = part.trim();\n\t\tif (region.length > 0 && !regions.includes(region)) regions.push(region);\n\t}\n\treturn regions;\n}\n/** Trims a value and treats blank strings as absent. */\nfunction normalize(value) {\n\tif (typeof value !== \"string\") return null;\n\tconst trimmed = value.trim();\n\treturn trimmed.length > 0 ? trimmed : null;\n}\n/**\n* Resolves the region list for the picker plus the default region.\n*\n* `defaultRegion` is the explicit environment region when set, otherwise\n* `effectiveRegion` (usually the region the SDK resolved from the ambient AWS\n* configuration), otherwise `us-east-1`. The list comes from\n* `WATCH_STREAM_REGIONS` when set, otherwise from {@link FALLBACK_REGIONS}, and\n* the default region is always present: it is prepended when missing, keeping\n* the remaining order de-duplicated.\n*/\nfunction resolveRegions(env, effectiveRegion) {\n\tconst { region: envRegion } = resolveAwsConfig(env);\n\tconst defaultRegion = envRegion ?? normalize(effectiveRegion) ?? \"us-east-1\";\n\tconst configured = parseRegionList(env.WATCH_STREAM_REGIONS);\n\tconst regions = configured.length > 0 ? configured : [...FALLBACK_REGIONS];\n\tif (!regions.includes(defaultRegion)) regions.unshift(defaultRegion);\n\treturn {\n\t\tregions,\n\t\tdefaultRegion\n\t};\n}\n//#endregion\n//#region src/routes/api/regions/+server.ts\n/**\n* `GET /api/regions?region=` - region list for the picker plus the effective region.\n*\n* The effective region becomes `defaultRegion`, so a region resolved from the\n* ambient AWS configuration is selected by default.\n*/\nvar GET = async ({ url }) => {\n\tconst parsed = parseRegionParam(url.searchParams.get(\"region\"));\n\tif (!parsed.ok) return apiError(400, REGION_PARAM_HINT, \"invalid-region\");\n\tconst env = readEnv();\n\tconst config = resolveAwsConfig(env, parsed.region);\n\tlet client;\n\ttry {\n\t\tclient = createLogsClient(config);\n\t\tconst { regions, defaultRegion } = resolveRegions(env, await resolveEffectiveRegion(client, config));\n\t\tconst body = {\n\t\t\tregions,\n\t\t\tdefaultRegion,\n\t\t\tendpoint: config.endpoint\n\t\t};\n\t\treturn json(body);\n\t} catch (error) {\n\t\tconst described = describeAwsError(error);\n\t\treturn apiError(502, described.message, described.code);\n\t} finally {\n\t\tclient?.destroy();\n\t}\n};\n//#endregion\nexport { GET };\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,225 @@
1
+ import { g as getArchive } from '../../../../chunks/archive.js-C2D-5edp.js';
2
+ import { r as readEnv } from '../../../../chunks/env2.js-CcIskxOZ.js';
3
+ import { p as parseRegionParam, a as apiError, r as resolveAwsConfig, R as REGION_PARAM_HINT } from '../../../../chunks/aws.js-DkPqAybc.js';
4
+ import { p as parseSourceParam, S as SOURCE_PARAM_HINT } from '../../../../chunks/source.js-DZEVvuho.js';
5
+ import { p as parseGroupParams, a as parseLevelParam, r as resolveWindow, b as parseDurationMs, L as LEVEL_PARAM_HINT } from '../../../../chunks/level-filter.js-B3o2hyWD.js';
6
+ import { j as json } from '../../../../chunks/utils.js-BIlHjgGW.js';
7
+ import '../../../../chunks/log-buffer.js-BI_gQOls.js';
8
+ import 'node:fs';
9
+ import 'node:os';
10
+ import 'node:path';
11
+ import 'node:timers/promises';
12
+ import 'node:crypto';
13
+ import '../../../../chunks/shared-server.js-Dn5XheXH.js';
14
+ import '@aws-sdk/client-cloudwatch-logs';
15
+ import '@aws-sdk/client-sts';
16
+ import '../../../../chunks/time-range.js-BLMT8aU3.js';
17
+ import '../../../../chunks/shared.js-CgjUIvRK.js';
18
+ import '../../../../chunks/uneval.js-DaakSYFQ.js';
19
+
20
+ //#region src/lib/server/series.ts
21
+ /** Message used when a caller asks for a series the app cannot aggregate. */
22
+ var SERIES_SOURCE_HINT = "Series are only aggregated for source=archive; a live CloudWatch view buckets the events it has loaded";
23
+ /** Message used when the `by` parameter names something that is not a grouping. */
24
+ var GROUP_BY_PARAM_HINT = "Invalid by: expected \"event\" or \"request\"";
25
+ /** Bucket widths offered to an automatic window, smallest first. */
26
+ var BUCKET_LADDER = [
27
+ 1e3,
28
+ 5e3,
29
+ 1e4,
30
+ 3e4,
31
+ 6e4,
32
+ 3e5,
33
+ 9e5,
34
+ 18e5,
35
+ 36e5,
36
+ 108e5,
37
+ 216e5,
38
+ 432e5,
39
+ 864e5,
40
+ 6048e5
41
+ ];
42
+ /** Bounds on an explicit bucket width. */
43
+ var MIN_BUCKET_MS = 1e3;
44
+ var MAX_BUCKET_MS = 6048e5;
45
+ /**
46
+ * Picks a bucket width for a window.
47
+ *
48
+ * The smallest ladder step that keeps the number of buckets at or below
49
+ * {@link TARGET_BUCKETS} wins, so a fifteen-minute window is bucketed in seconds
50
+ * and a week in hours, and the axis never renders thousands of ticks.
51
+ */
52
+ function chooseBucketMs(windowMs, target = 90) {
53
+ const span = Number.isFinite(windowMs) && windowMs > 0 ? windowMs : 6e4;
54
+ const wanted = Math.max(1, Math.round(target));
55
+ for (const step of BUCKET_LADDER) if (span / step <= wanted) return step;
56
+ return BUCKET_LADDER.at(-1);
57
+ }
58
+ /**
59
+ * Reads an explicit `bucket` parameter.
60
+ *
61
+ * Accepts a duration (`30s`, `5m`, `2h`) or plain milliseconds, and returns
62
+ * `null` for anything unusable so the caller falls back to an automatic width.
63
+ * The result is clamped to {@link MIN_BUCKET_MS}..{@link MAX_BUCKET_MS}.
64
+ */
65
+ function parseBucketParam(value) {
66
+ if (typeof value !== "string") return null;
67
+ const trimmed = value.trim();
68
+ if (trimmed.length === 0) return null;
69
+ const ms = /^\d+$/.test(trimmed) ? Number(trimmed) : parseDurationMs(trimmed);
70
+ if (ms === null || !Number.isFinite(ms) || ms <= 0) return null;
71
+ return Math.min(Math.max(Math.round(ms), MIN_BUCKET_MS), MAX_BUCKET_MS);
72
+ }
73
+ /**
74
+ * Parses the `by` parameter: what one mark on the chart counts.
75
+ *
76
+ * Returns `null` when the parameter is absent or blank (the default grouping) and
77
+ * `undefined` when it names something this app cannot group by, so the caller can
78
+ * answer 400 instead of silently charting a different question.
79
+ */
80
+ function parseGroupByParam(value) {
81
+ if (value === null || value === void 0) return null;
82
+ const word = value.trim().toLowerCase();
83
+ if (word.length === 0) return null;
84
+ if (word === "event" || word === "request") return word;
85
+ }
86
+ /** Sums rows per level, in a fixed severity order. */
87
+ function summariseLevels(points) {
88
+ const order = [
89
+ "error",
90
+ "warn",
91
+ "info",
92
+ "debug",
93
+ "unknown"
94
+ ];
95
+ const totals = /* @__PURE__ */ new Map();
96
+ for (const point of points) totals.set(point.level, (totals.get(point.level) ?? 0) + point.events);
97
+ return order.filter((level) => totals.has(level)).map((level) => ({
98
+ level,
99
+ events: totals.get(level)
100
+ }));
101
+ }
102
+ /** Sums rows per group, busiest first. */
103
+ function summariseGroups(points) {
104
+ const totals = /* @__PURE__ */ new Map();
105
+ for (const point of points) totals.set(point.group, (totals.get(point.group) ?? 0) + point.events);
106
+ return [...totals.entries()].map(([group, events]) => ({
107
+ group,
108
+ events
109
+ })).toSorted((a, b) => b.events === a.events ? a.group.localeCompare(b.group) : b.events - a.events);
110
+ }
111
+ /**
112
+ * Builds the response body from raw bucket rows.
113
+ *
114
+ * `groupBy` is echoed back, so the chart can label its marks without guessing
115
+ * which question it asked; it is set on every response, the empty one included.
116
+ */
117
+ function buildSeriesResponse(input) {
118
+ const points = input.rows.map((row) => ({
119
+ t: row.t,
120
+ group: row.group,
121
+ level: row.level,
122
+ events: row.events
123
+ }));
124
+ return {
125
+ from: input.from,
126
+ to: input.to,
127
+ bucketMs: input.bucketMs,
128
+ groupBy: input.groupBy,
129
+ levels: summariseLevels(points),
130
+ groups: summariseGroups(points),
131
+ points,
132
+ totals: {
133
+ events: points.reduce((sum, point) => sum + point.events, 0),
134
+ points: points.length
135
+ }
136
+ };
137
+ }
138
+ /**
139
+ * Reads the archived counts for a window.
140
+ *
141
+ * An unavailable archive answers an empty series rather than an error, so the
142
+ * chart can show "nothing archived yet" instead of a failure. `by` picks what a
143
+ * mark counts and defaults to one mark per event.
144
+ */
145
+ async function readSeries(input) {
146
+ const bucketMs = input.bucketMs ?? chooseBucketMs(input.to - input.from);
147
+ const groupBy = input.by ?? "event";
148
+ const empty = buildSeriesResponse({
149
+ from: input.from,
150
+ to: input.to,
151
+ bucketMs,
152
+ groupBy,
153
+ rows: []
154
+ });
155
+ if (!input.archive.available) return empty;
156
+ const rows = await input.archive.seriesQuery({
157
+ region: input.region,
158
+ logGroups: input.logGroups,
159
+ startTime: input.from,
160
+ endTime: input.to,
161
+ bucketMs,
162
+ levels: input.levels ?? null,
163
+ by: groupBy
164
+ });
165
+ return buildSeriesResponse({
166
+ from: input.from,
167
+ to: input.to,
168
+ bucketMs,
169
+ groupBy,
170
+ rows
171
+ });
172
+ }
173
+ //#endregion
174
+ //#region src/routes/api/series/+server.ts
175
+ /**
176
+ * `GET /api/series` - counts per time bucket, per group and level.
177
+ *
178
+ * This is the chart's data. Only the archive can answer it: DuckDB counts a
179
+ * whole window in one statement, while CloudWatch Logs has no aggregate API, so
180
+ * the UI buckets the events it already streamed for a live or CloudWatch view.
181
+ * `by=request` counts requests instead of lines, placing each request at its
182
+ * first line and colouring it by its most critical level.
183
+ *
184
+ * The window is not clamped to CloudWatch's 14 days, because the archive keeps
185
+ * what CloudWatch has already dropped.
186
+ */
187
+ var GET = async ({ url }) => {
188
+ const parsedRegion = parseRegionParam(url.searchParams.get("region"));
189
+ if (!parsedRegion.ok) return apiError(400, REGION_PARAM_HINT, "invalid-region");
190
+ const source = parseSourceParam(url.searchParams.get("source"));
191
+ if (source === null) return apiError(400, SOURCE_PARAM_HINT, "invalid-source");
192
+ if (source !== "archive") return apiError(400, SERIES_SOURCE_HINT, "unsupported-source");
193
+ const groups = parseGroupParams(url.searchParams.get("group"), url.searchParams.get("groups"));
194
+ if (!groups.ok) return apiError(400, groups.message, groups.code);
195
+ const levels = parseLevelParam(url.searchParams.get("level"));
196
+ if (levels === void 0) return apiError(400, LEVEL_PARAM_HINT, "invalid-level");
197
+ const by = parseGroupByParam(url.searchParams.get("by"));
198
+ if (by === void 0) return apiError(400, GROUP_BY_PARAM_HINT, "invalid-group-by");
199
+ const env = readEnv();
200
+ const region = resolveAwsConfig(env, parsedRegion.region).region ?? "";
201
+ if (region === "") return apiError(400, "Query parameter \"region\" is required when source=archive", "missing-region-param");
202
+ const window = resolveWindow({
203
+ mode: "historic",
204
+ range: url.searchParams.get("range"),
205
+ from: url.searchParams.get("from"),
206
+ to: url.searchParams.get("to"),
207
+ now: Date.now()
208
+ }, { maxLookbackMs: null });
209
+ if (!window.ok) return apiError(400, window.message, window.code);
210
+ const endTime = window.endTime ?? Date.now();
211
+ const series = await readSeries({
212
+ archive: await getArchive(env),
213
+ region,
214
+ logGroups: groups.names,
215
+ from: window.startTime,
216
+ to: endTime,
217
+ levels,
218
+ by,
219
+ bucketMs: parseBucketParam(url.searchParams.get("bucket"))
220
+ });
221
+ return json(series);
222
+ };
223
+
224
+ export { GET };
225
+ //# sourceMappingURL=_server.ts.js-DOvBhEDU.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_server.ts.js-DOvBhEDU.js","sources":["../../../../../../../.svelte-kit/output/server/entries/endpoints/api/series/_server.ts.js"],"sourcesContent":["import { t as getArchive } from \"../../../../chunks/archive.js\";\nimport { t as readEnv } from \"../../../../chunks/env2.js\";\nimport { l as apiError, n as REGION_PARAM_HINT, o as parseRegionParam, s as resolveAwsConfig } from \"../../../../chunks/aws.js\";\nimport { n as parseSourceParam, t as SOURCE_PARAM_HINT } from \"../../../../chunks/source.js\";\nimport { i as parseGroupParams, n as parseLevelParam, o as parseDurationMs, s as resolveWindow, t as LEVEL_PARAM_HINT } from \"../../../../chunks/level-filter.js\";\nimport { json } from \"@sveltejs/kit\";\n//#region src/lib/server/series.ts\n/** Message used when a caller asks for a series the app cannot aggregate. */\nvar SERIES_SOURCE_HINT = \"Series are only aggregated for source=archive; a live CloudWatch view buckets the events it has loaded\";\n/** Message used when the `by` parameter names something that is not a grouping. */\nvar GROUP_BY_PARAM_HINT = \"Invalid by: expected \\\"event\\\" or \\\"request\\\"\";\n/** Bucket widths offered to an automatic window, smallest first. */\nvar BUCKET_LADDER = [\n\t1e3,\n\t5e3,\n\t1e4,\n\t3e4,\n\t6e4,\n\t3e5,\n\t9e5,\n\t18e5,\n\t36e5,\n\t108e5,\n\t216e5,\n\t432e5,\n\t864e5,\n\t6048e5\n];\n/** Bounds on an explicit bucket width. */\nvar MIN_BUCKET_MS = 1e3;\nvar MAX_BUCKET_MS = 6048e5;\n/**\n* Picks a bucket width for a window.\n*\n* The smallest ladder step that keeps the number of buckets at or below\n* {@link TARGET_BUCKETS} wins, so a fifteen-minute window is bucketed in seconds\n* and a week in hours, and the axis never renders thousands of ticks.\n*/\nfunction chooseBucketMs(windowMs, target = 90) {\n\tconst span = Number.isFinite(windowMs) && windowMs > 0 ? windowMs : 6e4;\n\tconst wanted = Math.max(1, Math.round(target));\n\tfor (const step of BUCKET_LADDER) if (span / step <= wanted) return step;\n\treturn BUCKET_LADDER.at(-1);\n}\n/**\n* Reads an explicit `bucket` parameter.\n*\n* Accepts a duration (`30s`, `5m`, `2h`) or plain milliseconds, and returns\n* `null` for anything unusable so the caller falls back to an automatic width.\n* The result is clamped to {@link MIN_BUCKET_MS}..{@link MAX_BUCKET_MS}.\n*/\nfunction parseBucketParam(value) {\n\tif (typeof value !== \"string\") return null;\n\tconst trimmed = value.trim();\n\tif (trimmed.length === 0) return null;\n\tconst ms = /^\\d+$/.test(trimmed) ? Number(trimmed) : parseDurationMs(trimmed);\n\tif (ms === null || !Number.isFinite(ms) || ms <= 0) return null;\n\treturn Math.min(Math.max(Math.round(ms), MIN_BUCKET_MS), MAX_BUCKET_MS);\n}\n/**\n* Parses the `by` parameter: what one mark on the chart counts.\n*\n* Returns `null` when the parameter is absent or blank (the default grouping) and\n* `undefined` when it names something this app cannot group by, so the caller can\n* answer 400 instead of silently charting a different question.\n*/\nfunction parseGroupByParam(value) {\n\tif (value === null || value === void 0) return null;\n\tconst word = value.trim().toLowerCase();\n\tif (word.length === 0) return null;\n\tif (word === \"event\" || word === \"request\") return word;\n}\n/** Sums rows per level, in a fixed severity order. */\nfunction summariseLevels(points) {\n\tconst order = [\n\t\t\"error\",\n\t\t\"warn\",\n\t\t\"info\",\n\t\t\"debug\",\n\t\t\"unknown\"\n\t];\n\tconst totals = /* @__PURE__ */ new Map();\n\tfor (const point of points) totals.set(point.level, (totals.get(point.level) ?? 0) + point.events);\n\treturn order.filter((level) => totals.has(level)).map((level) => ({\n\t\tlevel,\n\t\tevents: totals.get(level)\n\t}));\n}\n/** Sums rows per group, busiest first. */\nfunction summariseGroups(points) {\n\tconst totals = /* @__PURE__ */ new Map();\n\tfor (const point of points) totals.set(point.group, (totals.get(point.group) ?? 0) + point.events);\n\treturn [...totals.entries()].map(([group, events]) => ({\n\t\tgroup,\n\t\tevents\n\t})).toSorted((a, b) => b.events === a.events ? a.group.localeCompare(b.group) : b.events - a.events);\n}\n/**\n* Builds the response body from raw bucket rows.\n*\n* `groupBy` is echoed back, so the chart can label its marks without guessing\n* which question it asked; it is set on every response, the empty one included.\n*/\nfunction buildSeriesResponse(input) {\n\tconst points = input.rows.map((row) => ({\n\t\tt: row.t,\n\t\tgroup: row.group,\n\t\tlevel: row.level,\n\t\tevents: row.events\n\t}));\n\treturn {\n\t\tfrom: input.from,\n\t\tto: input.to,\n\t\tbucketMs: input.bucketMs,\n\t\tgroupBy: input.groupBy,\n\t\tlevels: summariseLevels(points),\n\t\tgroups: summariseGroups(points),\n\t\tpoints,\n\t\ttotals: {\n\t\t\tevents: points.reduce((sum, point) => sum + point.events, 0),\n\t\t\tpoints: points.length\n\t\t}\n\t};\n}\n/**\n* Reads the archived counts for a window.\n*\n* An unavailable archive answers an empty series rather than an error, so the\n* chart can show \"nothing archived yet\" instead of a failure. `by` picks what a\n* mark counts and defaults to one mark per event.\n*/\nasync function readSeries(input) {\n\tconst bucketMs = input.bucketMs ?? chooseBucketMs(input.to - input.from);\n\tconst groupBy = input.by ?? \"event\";\n\tconst empty = buildSeriesResponse({\n\t\tfrom: input.from,\n\t\tto: input.to,\n\t\tbucketMs,\n\t\tgroupBy,\n\t\trows: []\n\t});\n\tif (!input.archive.available) return empty;\n\tconst rows = await input.archive.seriesQuery({\n\t\tregion: input.region,\n\t\tlogGroups: input.logGroups,\n\t\tstartTime: input.from,\n\t\tendTime: input.to,\n\t\tbucketMs,\n\t\tlevels: input.levels ?? null,\n\t\tby: groupBy\n\t});\n\treturn buildSeriesResponse({\n\t\tfrom: input.from,\n\t\tto: input.to,\n\t\tbucketMs,\n\t\tgroupBy,\n\t\trows\n\t});\n}\n//#endregion\n//#region src/routes/api/series/+server.ts\n/**\n* `GET /api/series` - counts per time bucket, per group and level.\n*\n* This is the chart's data. Only the archive can answer it: DuckDB counts a\n* whole window in one statement, while CloudWatch Logs has no aggregate API, so\n* the UI buckets the events it already streamed for a live or CloudWatch view.\n* `by=request` counts requests instead of lines, placing each request at its\n* first line and colouring it by its most critical level.\n*\n* The window is not clamped to CloudWatch's 14 days, because the archive keeps\n* what CloudWatch has already dropped.\n*/\nvar GET = async ({ url }) => {\n\tconst parsedRegion = parseRegionParam(url.searchParams.get(\"region\"));\n\tif (!parsedRegion.ok) return apiError(400, REGION_PARAM_HINT, \"invalid-region\");\n\tconst source = parseSourceParam(url.searchParams.get(\"source\"));\n\tif (source === null) return apiError(400, SOURCE_PARAM_HINT, \"invalid-source\");\n\tif (source !== \"archive\") return apiError(400, SERIES_SOURCE_HINT, \"unsupported-source\");\n\tconst groups = parseGroupParams(url.searchParams.get(\"group\"), url.searchParams.get(\"groups\"));\n\tif (!groups.ok) return apiError(400, groups.message, groups.code);\n\tconst levels = parseLevelParam(url.searchParams.get(\"level\"));\n\tif (levels === void 0) return apiError(400, LEVEL_PARAM_HINT, \"invalid-level\");\n\tconst by = parseGroupByParam(url.searchParams.get(\"by\"));\n\tif (by === void 0) return apiError(400, GROUP_BY_PARAM_HINT, \"invalid-group-by\");\n\tconst env = readEnv();\n\tconst region = resolveAwsConfig(env, parsedRegion.region).region ?? \"\";\n\tif (region === \"\") return apiError(400, \"Query parameter \\\"region\\\" is required when source=archive\", \"missing-region-param\");\n\tconst window = resolveWindow({\n\t\tmode: \"historic\",\n\t\trange: url.searchParams.get(\"range\"),\n\t\tfrom: url.searchParams.get(\"from\"),\n\t\tto: url.searchParams.get(\"to\"),\n\t\tnow: Date.now()\n\t}, { maxLookbackMs: null });\n\tif (!window.ok) return apiError(400, window.message, window.code);\n\tconst endTime = window.endTime ?? Date.now();\n\tconst series = await readSeries({\n\t\tarchive: await getArchive(env),\n\t\tregion,\n\t\tlogGroups: groups.names,\n\t\tfrom: window.startTime,\n\t\tto: endTime,\n\t\tlevels,\n\t\tby,\n\t\tbucketMs: parseBucketParam(url.searchParams.get(\"bucket\"))\n\t});\n\treturn json(series);\n};\n//#endregion\nexport { GET };\n"],"names":[],"mappings":"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"}