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
@@ -1,209 +1,169 @@
1
- import { a as apiError, p as parseRegionParam, 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';
2
- import { H as HISTORIC_PRESETS, p as presetDurationMs, i as isHistoricPreset } from '../../../../chunks/time-range.js-BLMT8aU3.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 { a as apiError, p as parseRegionParam, r as resolveAwsConfig, c as createLogsClient, d as describeAwsError, b as resolveEffectiveRegion, 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, c as clampPollMs, w as withDetections, L as LEVEL_PARAM_HINT } from '../../../../chunks/level-filter.js-B3o2hyWD.js';
3
6
  import '../../../../chunks/utils.js-BIlHjgGW.js';
4
7
  import { FilterLogEventsCommand } from '@aws-sdk/client-cloudwatch-logs';
5
- import '../../../../chunks/shared-server.js-Dn5XheXH.js';
6
- import '@aws-sdk/client-sts';
8
+ import '../../../../chunks/log-buffer.js-BI_gQOls.js';
7
9
  import 'node:fs';
10
+ import 'node:os';
8
11
  import 'node:path';
12
+ import 'node:timers/promises';
13
+ import 'node:crypto';
14
+ import '../../../../chunks/shared-server.js-Dn5XheXH.js';
15
+ import '@aws-sdk/client-sts';
16
+ import '../../../../chunks/time-range.js-BLMT8aU3.js';
9
17
  import '../../../../chunks/shared.js-CgjUIvRK.js';
10
18
  import '../../../../chunks/uneval.js-DaakSYFQ.js';
11
19
 
12
- //#region src/lib/server/filter.ts
13
- /** Default lookback window when neither `startTime` nor `lookback` is usable. */
14
- var DEFAULT_LOOKBACK_MS = 3e5;
15
- /** CloudWatch Logs rejects `startTime` older than 14 days. */
16
- var MAX_LOOKBACK_MS = 12096e5;
17
- var DEFAULT_POLL_MS$1 = 1e3;
18
- var MIN_POLL_MS = 250;
19
- var MAX_POLL_MS = 15e3;
20
- var DURATION_UNITS = {
21
- ms: 1,
22
- s: 1e3,
23
- m: 6e4,
24
- h: 36e5,
25
- d: 864e5,
26
- w: 6048e5
27
- };
28
- var DURATION_PATTERN = /^(\d+(?:\.\d+)?)\s*(ms|s|m|h|d|w)$/i;
29
- var EPOCH_PATTERN = /^\d+$/;
30
- /**
31
- * Parses a single-unit duration such as `500ms`, `30s`, `15m`, `2h`, `3d` or
32
- * `1w`. Returns `null` for anything invalid, negative or zero.
33
- */
34
- function parseDurationMs(value) {
35
- if (typeof value !== "string") return null;
36
- const match = DURATION_PATTERN.exec(value.trim());
37
- if (match === null) return null;
38
- const amount = Number(match[1]);
39
- const unit = DURATION_UNITS[match[2].toLowerCase()];
40
- if (unit === void 0 || !Number.isFinite(amount)) return null;
41
- const ms = amount * unit;
42
- if (!Number.isFinite(ms) || ms <= 0) return null;
43
- return Math.round(ms);
44
- }
45
- /**
46
- * Parses a start point into epoch milliseconds.
47
- *
48
- * Accepts epoch milliseconds (`1700000000000`), a duration relative to `now`
49
- * (`15m`) and ISO 8601 timestamps. Returns `null` when the value is missing or
50
- * cannot be understood.
51
- */
52
- function parseStartTime(value, now) {
53
- if (typeof value !== "string") return null;
54
- const trimmed = value.trim();
55
- if (trimmed.length === 0) return null;
56
- if (EPOCH_PATTERN.test(trimmed)) return Number(trimmed);
57
- const duration = parseDurationMs(trimmed);
58
- if (duration !== null) return now - duration;
59
- const parsed = Date.parse(trimmed);
60
- return Number.isNaN(parsed) ? null : parsed;
61
- }
62
- /** Resolves the effective start time, clamped to the last 14 days and to `now`. */
63
- function resolveStartTime(input) {
64
- const { now } = input;
65
- let start = parseStartTime(input.startTime, now);
66
- if (start === null) start = now - (parseDurationMs(input.lookback ?? "") ?? DEFAULT_LOOKBACK_MS);
67
- const oldestAllowed = now - MAX_LOOKBACK_MS;
68
- if (start > now) start = now;
69
- if (start < oldestAllowed) start = oldestAllowed;
70
- return Math.round(start);
71
- }
72
- /** Parses a poll interval in milliseconds, defaulting to 1000 and clamped to 250..15000. */
73
- function clampPollMs(value) {
74
- if (typeof value !== "string") return DEFAULT_POLL_MS$1;
75
- const trimmed = value.trim();
76
- if (trimmed.length === 0) return DEFAULT_POLL_MS$1;
77
- const parsed = Number(trimmed);
78
- if (!Number.isFinite(parsed)) return DEFAULT_POLL_MS$1;
79
- return Math.min(Math.max(Math.round(parsed), MIN_POLL_MS), MAX_POLL_MS);
80
- }
81
- /** Default historic window when neither `range` nor `from`/`to` is given. */
82
- var DEFAULT_HISTORIC_PRESET = "15m";
83
- /** Parses the `mode` parameter; `null` for an unrecognised value. */
84
- function parseMode(value) {
85
- if (typeof value !== "string") return null;
86
- const trimmed = value.trim().toLowerCase();
87
- if (trimmed === "live" || trimmed === "historic") return trimmed;
88
- return null;
20
+ //#region src/lib/server/archive-tail.ts
21
+ /** Page size used when the caller does not ask for one. */
22
+ var DEFAULT_ARCHIVE_PAGE_SIZE = 1e3;
23
+ /** Upper bound on one page, so a huge window cannot exhaust memory. */
24
+ var MAX_ARCHIVE_PAGE_SIZE = 5e3;
25
+ /** Events one archive request may return before it stops (matches the tailer). */
26
+ var DEFAULT_ARCHIVE_MAX_EVENTS = 1e4;
27
+ /** Message shown when DuckDB is missing or the file cannot be opened. */
28
+ function archiveUnavailableMessage(archive) {
29
+ const reason = archive.error;
30
+ const base = "The local archive is not available on this machine";
31
+ return reason === null || reason.length === 0 ? base : `${base}: ${reason}`;
89
32
  }
90
33
  /**
91
- * Parses an absolute instant: epoch milliseconds or an ISO 8601 timestamp.
34
+ * Yields archived events for one window, oldest first.
92
35
  *
93
- * Relative durations are deliberately rejected here so an end bound can never
94
- * move with the clock.
36
+ * An unavailable archive produces a single `error` batch instead of throwing, so
37
+ * the browser shows a normal stream error. An aborted signal ends the generator
38
+ * without yielding an `end` batch, which is what the route treats as a
39
+ * client disconnect.
95
40
  */
96
- function parseInstant(value) {
97
- if (typeof value !== "string") return null;
98
- const trimmed = value.trim();
99
- if (trimmed.length === 0) return null;
100
- if (EPOCH_PATTERN.test(trimmed)) return Number(trimmed);
101
- const parsed = Date.parse(trimmed);
102
- return Number.isNaN(parsed) ? null : parsed;
41
+ async function* tailArchivedEvents(options) {
42
+ const { archive, region, logGroups, startTime, endTime, search = null, streamPrefix = null, levels = null, signal } = options;
43
+ if (!archive.available) {
44
+ yield {
45
+ type: "error",
46
+ message: archiveUnavailableMessage(archive),
47
+ code: "archive-unavailable"
48
+ };
49
+ return;
50
+ }
51
+ const requestedPageSize = options.pageSize ?? 1e3;
52
+ const pageSize = Math.min(Math.max(Number.isFinite(requestedPageSize) ? Math.round(requestedPageSize) : DEFAULT_ARCHIVE_PAGE_SIZE, 1), MAX_ARCHIVE_PAGE_SIZE);
53
+ const requestedMax = options.maxEvents ?? 1e4;
54
+ const maxEvents = Number.isFinite(requestedMax) && requestedMax > 0 ? Math.floor(requestedMax) : DEFAULT_ARCHIVE_MAX_EVENTS;
55
+ let cursor = null;
56
+ let emitted = 0;
57
+ for (;;) {
58
+ if (signal?.aborted === true) return;
59
+ const page = await archive.page({
60
+ region,
61
+ logGroups,
62
+ startTime,
63
+ endTime,
64
+ search,
65
+ streamPrefix,
66
+ levels,
67
+ after: cursor,
68
+ limit: pageSize
69
+ });
70
+ if (page.events.length === 0) {
71
+ yield {
72
+ type: "end",
73
+ reason: "window-complete"
74
+ };
75
+ return;
76
+ }
77
+ emitted += page.events.length;
78
+ yield {
79
+ type: "events",
80
+ events: page.events
81
+ };
82
+ cursor = page.last;
83
+ if (cursor === null || page.events.length < pageSize) {
84
+ yield {
85
+ type: "end",
86
+ reason: "window-complete"
87
+ };
88
+ return;
89
+ }
90
+ if (emitted >= maxEvents) {
91
+ yield {
92
+ type: "end",
93
+ reason: "event-limit"
94
+ };
95
+ return;
96
+ }
97
+ }
103
98
  }
104
- /**
105
- * Clamps a window to what CloudWatch Logs can return: 14 days back, ending now.
106
- *
107
- * Returns `null` when the requested window ends before the retention floor, so
108
- * a request for month-old data fails loudly instead of returning a stub window.
109
- */
110
- function clampWindow(start, end, now) {
111
- const oldest = now - MAX_LOOKBACK_MS;
112
- if (end <= oldest) return null;
113
- const clampedStart = Math.min(Math.max(start, oldest), now);
114
- const clampedEnd = Math.min(Math.max(end, clampedStart + 1), now);
115
- return {
116
- start: Math.round(clampedStart),
117
- end: Math.round(clampedEnd),
118
- clamped: clampedStart !== Math.round(start) || clampedEnd !== Math.round(end)
119
- };
99
+ //#endregion
100
+ //#region src/lib/server/multi-tail.ts
101
+ /** Events-payload batch reasons, worst first. */
102
+ var END_PRECEDENCE = [
103
+ "repeated-errors",
104
+ "event-limit",
105
+ "window-complete"
106
+ ];
107
+ /** Picks the most serious end reason from the sources. */
108
+ function mergeEndReason(reasons) {
109
+ for (const candidate of END_PRECEDENCE) if (reasons.includes(candidate)) return candidate;
110
+ return "window-complete";
120
111
  }
121
112
  /**
122
- * Resolves the request window into a start time plus, for historic mode, an end
123
- * time.
113
+ * Yields every batch of every source, then one `end`.
124
114
  *
125
- * Historic windows come from a preset (`range=24h`), from explicit bounds
126
- * (`from`/`to`, epoch ms or ISO 8601) or, when neither is given, from the
127
- * smallest preset. Windows are clamped to the last 14 days and to `now` so the
128
- * request can never ask CloudWatch for data it will not return.
115
+ * A failing source yields its own `error` batch; it never cancels the others, so
116
+ * one unreadable group does not silence the rest of the view.
129
117
  */
130
- function resolveWindow(input) {
131
- const { now } = input;
132
- const requestedMode = input.mode === null || input.mode === void 0 ? "live" : input.mode.trim();
133
- const mode = requestedMode === "" ? "live" : parseMode(requestedMode);
134
- if (mode === null) return {
135
- ok: false,
136
- code: "invalid-mode",
137
- message: "Invalid mode: expected \"live\" or \"historic\""
138
- };
139
- if (mode === "live") return {
140
- ok: true,
141
- mode,
142
- startTime: resolveStartTime({
143
- startTime: input.startTime,
144
- lookback: input.lookback,
145
- now
146
- }),
147
- endTime: null,
148
- preset: null,
149
- clamped: false
150
- };
151
- const from = input.from?.trim() ?? "";
152
- const to = input.to?.trim() ?? "";
153
- if (from.length > 0 || to.length > 0) {
154
- if (from.length === 0 || to.length === 0) return {
155
- ok: false,
156
- code: "invalid-window",
157
- message: "A custom window needs both \"from\" and \"to\""
158
- };
159
- const parsedFrom = parseStartTime(from, now);
160
- const parsedTo = parseInstant(to);
161
- if (parsedFrom === null) return {
162
- ok: false,
163
- code: "invalid-time",
164
- message: `Invalid "from": expected epoch milliseconds, a duration such as 3h, or an ISO 8601 timestamp`
165
- };
166
- if (parsedTo === null) return {
167
- ok: false,
168
- code: "invalid-time",
169
- message: "Invalid \"to\": expected epoch milliseconds or an ISO 8601 timestamp"
170
- };
171
- if (parsedTo <= parsedFrom) return {
172
- ok: false,
173
- code: "invalid-window",
174
- message: "The end of the window must be after its start"
175
- };
176
- const clamped = clampWindow(parsedFrom, parsedTo, now);
177
- if (clamped === null || clamped.end <= clamped.start) return {
178
- ok: false,
179
- code: "invalid-window",
180
- message: "The requested window is outside the 14 days CloudWatch Logs keeps"
181
- };
182
- return {
183
- ok: true,
184
- mode,
185
- startTime: clamped.start,
186
- endTime: clamped.end,
187
- preset: null,
188
- clamped: clamped.clamped
189
- };
118
+ async function* mergeTails(sources) {
119
+ if (sources.length === 0) return;
120
+ if (sources.length === 1) {
121
+ yield* sources[0];
122
+ return;
190
123
  }
191
- const requestedRange = input.range?.trim() ?? "";
192
- const preset = requestedRange === "" ? DEFAULT_HISTORIC_PRESET : isHistoricPreset(requestedRange) ? requestedRange : null;
193
- if (preset === null) return {
194
- ok: false,
195
- code: "invalid-range",
196
- message: `Invalid range: expected one of ${HISTORIC_PRESETS.join(", ")} or an explicit from/to window`
197
- };
198
- const end = Math.round(now);
199
- return {
200
- ok: true,
201
- mode,
202
- startTime: Math.round(now - presetDurationMs(preset)),
203
- endTime: end,
204
- preset,
205
- clamped: false
124
+ const queue = [];
125
+ let waiting = null;
126
+ /** Sources whose end marker has been consumed, so their batches are all out. */
127
+ let completed = 0;
128
+ const endReasons = [];
129
+ const push = (item) => {
130
+ queue.push(item);
131
+ const wake = waiting;
132
+ waiting = null;
133
+ wake?.();
206
134
  };
135
+ for (const source of sources) (async () => {
136
+ let endReason = null;
137
+ try {
138
+ for await (const batch of source) if (batch.type === "end") endReason = batch.reason;
139
+ else push({ batch });
140
+ } catch {} finally {
141
+ if (endReason !== null) endReasons.push(endReason);
142
+ push({ done: true });
143
+ }
144
+ })();
145
+ for (;;) {
146
+ if (queue.length === 0) {
147
+ if (completed >= sources.length) {
148
+ yield {
149
+ type: "end",
150
+ reason: mergeEndReason(endReasons)
151
+ };
152
+ return;
153
+ }
154
+ await new Promise((resolve) => {
155
+ waiting = resolve;
156
+ if (queue.length > 0 || completed >= sources.length) {
157
+ waiting = null;
158
+ resolve();
159
+ }
160
+ });
161
+ continue;
162
+ }
163
+ const item = queue.shift();
164
+ if ("batch" in item) yield item.batch;
165
+ else completed += 1;
166
+ }
207
167
  }
208
168
  //#endregion
209
169
  //#region src/lib/server/sse.ts
@@ -435,6 +395,16 @@ async function* tailLogEvents(options) {
435
395
  var PING_INTERVAL_MS = 15e3;
436
396
  /** Stop the stream after this many consecutive failed polls. */
437
397
  var MAX_CONSECUTIVE_ERRORS = 8;
398
+ /** Bounds for the archive `pageSize` parameter. */
399
+ var ARCHIVE_PAGE_LIMITS = {
400
+ min: 1,
401
+ max: 5e3
402
+ };
403
+ /** Bounds for the archive `max` parameter (events per request). */
404
+ var ARCHIVE_MAX_LIMITS = {
405
+ min: 1,
406
+ max: 1e5
407
+ };
438
408
  var SSE_HEADERS = {
439
409
  "content-type": "text/event-stream; charset=utf-8",
440
410
  "cache-control": "no-cache, no-transform",
@@ -442,44 +412,180 @@ var SSE_HEADERS = {
442
412
  "x-accel-buffering": "no"
443
413
  };
444
414
  /**
415
+ * Tags every event of one tail with its log group.
416
+ *
417
+ * A merged multi-group stream has to say which group each line came from, both
418
+ * for the archive and for the group column in the viewer.
419
+ */
420
+ async function* taggedEvents(source, group) {
421
+ for await (const batch of source) {
422
+ if (batch.type !== "events") {
423
+ yield batch;
424
+ continue;
425
+ }
426
+ const events = [];
427
+ for (const event of batch.events) events.push({
428
+ ...event,
429
+ group
430
+ });
431
+ yield {
432
+ type: "events",
433
+ events
434
+ };
435
+ }
436
+ }
437
+ /**
438
+ * Writes one batch to the archive, under the right group.
439
+ *
440
+ * A merged multi-group stream tags every event with its own group, so a batch
441
+ * that mixes groups is split; a single-group stream falls back to the group the
442
+ * request named.
443
+ */
444
+ async function recordBatch(archive, region, groupNames, events) {
445
+ const fallback = groupNames[0] ?? "";
446
+ const byGroup = /* @__PURE__ */ new Map();
447
+ for (const event of events) {
448
+ const group = event.group ?? fallback;
449
+ const bucket = byGroup.get(group);
450
+ if (bucket === void 0) byGroup.set(group, [event]);
451
+ else bucket.push(event);
452
+ }
453
+ for (const [group, groupEvents] of byGroup) await archive.record(region, group, groupEvents);
454
+ }
455
+ /**
456
+ * Parses a positive integer parameter within `limits`.
457
+ *
458
+ * Returns `null` for a missing value (meaning "use the default") and for an
459
+ * unusable one, so a typo falls back to the default instead of failing the
460
+ * stream; an out-of-range value is clamped rather than rejected.
461
+ */
462
+ function parseBoundedInt(value, limits) {
463
+ if (value === null) return null;
464
+ const trimmed = value.trim();
465
+ if (trimmed.length === 0) return null;
466
+ const parsed = Number(trimmed);
467
+ if (!Number.isFinite(parsed)) return null;
468
+ return Math.min(Math.max(Math.round(parsed), limits.min), limits.max);
469
+ }
470
+ /**
471
+ * Builds the feed for a request.
472
+ *
473
+ * The archive path never creates a CloudWatch client, so browsing history works
474
+ * with no credentials and no network; it does need a region, because archived
475
+ * rows are stored per region. Failures come back as an `apiError` response the
476
+ * route returns unchanged.
477
+ */
478
+ async function resolveFeed(request) {
479
+ const { source, config, env, groupNames, startTime, endTime, signal } = request;
480
+ if (source === "archive") {
481
+ const region = config.region ?? "";
482
+ if (region === "") return apiError(400, "Query parameter \"region\" is required when source=archive", "missing-region-param");
483
+ return {
484
+ region,
485
+ groupNames,
486
+ generator: tailArchivedEvents({
487
+ archive: await getArchive(env),
488
+ region,
489
+ logGroups: groupNames,
490
+ startTime,
491
+ endTime: endTime ?? Date.now(),
492
+ search: request.search,
493
+ levels: request.levels,
494
+ ...request.pageSize === null ? {} : { pageSize: request.pageSize },
495
+ ...request.maxEvents === null ? {} : { maxEvents: request.maxEvents },
496
+ signal
497
+ }),
498
+ release: () => void 0
499
+ };
500
+ }
501
+ let client;
502
+ try {
503
+ client = createLogsClient(config);
504
+ } catch (error) {
505
+ const described = describeAwsError(error);
506
+ return apiError(502, described.message, described.code);
507
+ }
508
+ let region;
509
+ try {
510
+ region = await resolveEffectiveRegion(client, config);
511
+ } catch (error) {
512
+ client.destroy();
513
+ const described = describeAwsError(error);
514
+ return apiError(502, described.message, described.code);
515
+ }
516
+ const tails = groupNames.map((group) => taggedEvents(tailLogEvents({
517
+ client,
518
+ logGroupName: group,
519
+ startTime,
520
+ endTime,
521
+ pollIntervalMs: request.pollIntervalMs,
522
+ filterPattern: request.filterPattern,
523
+ signal,
524
+ maxConsecutiveErrors: MAX_CONSECUTIVE_ERRORS
525
+ }), group));
526
+ return {
527
+ region,
528
+ groupNames,
529
+ generator: mergeTails(tails),
530
+ release: () => client.destroy()
531
+ };
532
+ }
533
+ /**
445
534
  * `GET /api/stream` - server-sent events for one log group.
446
535
  *
447
536
  * Emits `ready` first, then `log` per batch, `ping` after 15 s of silence and
448
- * a final `end`. The region is optional: without it the tailer uses a client
449
- * that resolves the region from the ambient AWS configuration. The tailer is
450
- * cancelled through `request.signal`, and every timer and listener is removed
451
- * so the dev server can exit.
537
+ * a final `end`. `source=cloudwatch` (the default) polls CloudWatch Logs with
538
+ * the ambient credentials; `source=archive` replays the local DuckDB archive and
539
+ * needs neither credentials nor a region parameter resolution.
540
+ *
541
+ * The stream is cancelled through `request.signal`, and every timer and listener
542
+ * is removed so the dev server can exit.
452
543
  */
453
544
  var GET = async ({ url, request }) => {
454
- const logGroupName = url.searchParams.get("group")?.trim() ?? "";
455
- if (logGroupName.length === 0) return apiError(400, "Query parameter \"group\" is required", "missing-group");
545
+ const groupSelection = parseGroupParams(url.searchParams.get("group"), url.searchParams.get("groups"));
546
+ if (!groupSelection.ok) return apiError(400, groupSelection.message, groupSelection.code);
547
+ const groupNames = groupSelection.names;
456
548
  const parsedRegion = parseRegionParam(url.searchParams.get("region"));
457
549
  if (!parsedRegion.ok) return apiError(400, REGION_PARAM_HINT, "invalid-region");
550
+ const source = parseSourceParam(url.searchParams.get("source"));
551
+ if (source === null) return apiError(400, SOURCE_PARAM_HINT, "invalid-source");
458
552
  const env = readEnv();
459
553
  const config = resolveAwsConfig(env, parsedRegion.region);
460
554
  const filterPattern = url.searchParams.get("filterPattern")?.trim();
555
+ const search = url.searchParams.get("search")?.trim() ?? "";
556
+ const levels = parseLevelParam(url.searchParams.get("level"));
557
+ if (levels === void 0) return apiError(400, LEVEL_PARAM_HINT, "invalid-level");
558
+ if (levels !== null && source !== "archive") return apiError(400, "The \"level\" filter applies to source=archive; use filterPattern to filter CloudWatch", "invalid-level");
461
559
  const streamWindow = resolveWindow({
462
- mode: url.searchParams.get("mode"),
560
+ mode: url.searchParams.get("mode") ?? (source === "archive" ? "historic" : null),
463
561
  range: url.searchParams.get("range"),
464
562
  from: url.searchParams.get("from"),
465
563
  to: url.searchParams.get("to"),
466
564
  startTime: url.searchParams.get("startTime"),
467
565
  lookback: url.searchParams.get("lookback"),
468
566
  now: Date.now()
469
- });
567
+ }, source === "archive" ? { maxLookbackMs: null } : {});
470
568
  if (!streamWindow.ok) return apiError(400, streamWindow.message, streamWindow.code);
471
- const pollIntervalMs = clampPollMs(url.searchParams.get("poll"));
472
- let client;
473
- let region;
474
- try {
475
- client = createLogsClient(config);
476
- region = await resolveEffectiveRegion(client, config);
477
- } catch (error) {
478
- const described = describeAwsError(error);
479
- return apiError(502, described.message, described.code);
480
- }
481
- const encoder = new TextEncoder();
569
+ if (source === "archive" && streamWindow.mode === "live") return apiError(400, "The local archive only serves historic windows: use mode=historic, or source=cloudwatch to tail live", "invalid-mode");
482
570
  const bodyAbort = new AbortController();
571
+ const feed = await resolveFeed({
572
+ source,
573
+ config,
574
+ env,
575
+ groupNames,
576
+ startTime: streamWindow.startTime,
577
+ endTime: streamWindow.endTime,
578
+ filterPattern,
579
+ search: search.length === 0 ? null : search,
580
+ levels,
581
+ pageSize: parseBoundedInt(url.searchParams.get("pageSize"), ARCHIVE_PAGE_LIMITS),
582
+ maxEvents: parseBoundedInt(url.searchParams.get("max"), ARCHIVE_MAX_LIMITS),
583
+ pollIntervalMs: clampPollMs(url.searchParams.get("poll")),
584
+ signal: bodyAbort.signal
585
+ });
586
+ if (feed instanceof Response) return feed;
587
+ const archive = source === "cloudwatch" ? await getArchive(env) : null;
588
+ const encoder = new TextEncoder();
483
589
  let streamController;
484
590
  let closed = false;
485
591
  let pingTimer;
@@ -533,27 +639,20 @@ var GET = async ({ url, request }) => {
533
639
  cleanedUp = true;
534
640
  clearPing();
535
641
  request.signal.removeEventListener("abort", onAbort);
536
- client.destroy();
642
+ feed.release();
537
643
  };
538
644
  const pump = async () => {
539
645
  let consecutiveErrors = 0;
540
646
  let reason = "completed";
541
647
  try {
542
- for await (const batch of tailLogEvents({
543
- client,
544
- logGroupName,
545
- startTime: streamWindow.startTime,
546
- endTime: streamWindow.endTime,
547
- pollIntervalMs,
548
- filterPattern,
549
- signal: bodyAbort.signal,
550
- maxConsecutiveErrors: MAX_CONSECUTIVE_ERRORS
551
- })) {
648
+ for await (const batch of feed.generator) {
552
649
  if (closed || bodyAbort.signal.aborted) break;
553
650
  if (batch.type === "events") {
554
- const payload = { events: batch.events };
651
+ const events = withDetections(batch.events);
652
+ const payload = { events };
555
653
  consecutiveErrors = 0;
556
654
  enqueue(sseFrame("log", payload));
655
+ if (archive !== null) await recordBatch(archive, feed.region, feed.groupNames, events);
557
656
  } else if (batch.type === "end") {
558
657
  reason = batch.reason;
559
658
  break;
@@ -584,9 +683,11 @@ var GET = async ({ url, request }) => {
584
683
  start(controller) {
585
684
  streamController = controller;
586
685
  const payload = {
587
- region,
588
- logGroupName,
589
- endpoint: config.endpoint,
686
+ region: feed.region,
687
+ logGroupName: feed.groupNames[0] ?? "",
688
+ groups: [...feed.groupNames],
689
+ endpoint: source === "archive" ? null : config.endpoint,
690
+ source,
590
691
  startTime: streamWindow.startTime,
591
692
  endTime: streamWindow.endTime,
592
693
  mode: streamWindow.mode,
@@ -608,4 +709,4 @@ var GET = async ({ url, request }) => {
608
709
  };
609
710
 
610
711
  export { GET };
611
- //# sourceMappingURL=_server.ts.js-CIYo4C-0.js.map
712
+ //# sourceMappingURL=_server.ts.js-BWRHawY8.js.map