watch-tail 0.3.1 → 0.5.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 (382) hide show
  1. package/README.md +157 -3
  2. package/build/client/_app/immutable/assets/0.BQQ1YLPc.css +2 -0
  3. package/build/client/_app/immutable/assets/0.BQQ1YLPc.css.br +0 -0
  4. package/build/client/_app/immutable/assets/0.BQQ1YLPc.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/AUlz4-kZ.js +1 -0
  36. package/build/client/_app/immutable/chunks/AUlz4-kZ.js.br +0 -0
  37. package/build/client/_app/immutable/chunks/AUlz4-kZ.js.gz +0 -0
  38. package/build/client/_app/immutable/chunks/B1t8v2wP.js +1 -0
  39. package/build/client/_app/immutable/chunks/B1t8v2wP.js.br +0 -0
  40. package/build/client/_app/immutable/chunks/B1t8v2wP.js.gz +0 -0
  41. package/build/client/_app/immutable/chunks/B6nyufJR.js +1 -0
  42. package/build/client/_app/immutable/chunks/B6nyufJR.js.br +0 -0
  43. package/build/client/_app/immutable/chunks/B6nyufJR.js.gz +0 -0
  44. package/build/client/_app/immutable/chunks/BR2LaRms.js +1 -0
  45. package/build/client/_app/immutable/chunks/BR2LaRms.js.br +1 -0
  46. package/build/client/_app/immutable/chunks/BR2LaRms.js.gz +0 -0
  47. package/build/client/_app/immutable/chunks/BR7qH0F5.js +1 -0
  48. package/build/client/_app/immutable/chunks/BR7qH0F5.js.br +0 -0
  49. package/build/client/_app/immutable/chunks/BR7qH0F5.js.gz +0 -0
  50. package/build/client/_app/immutable/chunks/BkXArOra.js +1 -0
  51. package/build/client/_app/immutable/chunks/BkXArOra.js.br +0 -0
  52. package/build/client/_app/immutable/chunks/BkXArOra.js.gz +0 -0
  53. package/build/client/_app/immutable/chunks/Bl052uUt.js +1 -0
  54. package/build/client/_app/immutable/chunks/Bl052uUt.js.br +0 -0
  55. package/build/client/_app/immutable/chunks/Bl052uUt.js.gz +0 -0
  56. package/build/client/_app/immutable/chunks/Bmk_Voz6.js +1 -0
  57. package/build/client/_app/immutable/chunks/Bmk_Voz6.js.br +0 -0
  58. package/build/client/_app/immutable/chunks/Bmk_Voz6.js.gz +0 -0
  59. package/build/client/_app/immutable/chunks/Bp63j1zN.js +1 -0
  60. package/build/client/_app/immutable/chunks/Bp63j1zN.js.br +0 -0
  61. package/build/client/_app/immutable/chunks/Bp63j1zN.js.gz +0 -0
  62. package/build/client/_app/immutable/chunks/BwntJtbK.js +1 -0
  63. package/build/client/_app/immutable/chunks/BwntJtbK.js.br +0 -0
  64. package/build/client/_app/immutable/chunks/BwntJtbK.js.gz +0 -0
  65. package/build/client/_app/immutable/chunks/C20WvNRq.js +1 -0
  66. package/build/client/_app/immutable/chunks/C20WvNRq.js.br +0 -0
  67. package/build/client/_app/immutable/chunks/C20WvNRq.js.gz +0 -0
  68. package/build/client/_app/immutable/chunks/C58PZtCD.js +4 -0
  69. package/build/client/_app/immutable/chunks/C58PZtCD.js.br +0 -0
  70. package/build/client/_app/immutable/chunks/C58PZtCD.js.gz +0 -0
  71. package/build/client/_app/immutable/chunks/CCch3uox.js +1 -0
  72. package/build/client/_app/immutable/chunks/CCch3uox.js.br +0 -0
  73. package/build/client/_app/immutable/chunks/CCch3uox.js.gz +0 -0
  74. package/build/client/_app/immutable/chunks/CDbeYGlD.js +1 -0
  75. package/build/client/_app/immutable/chunks/CDbeYGlD.js.br +0 -0
  76. package/build/client/_app/immutable/chunks/CDbeYGlD.js.gz +0 -0
  77. package/build/client/_app/immutable/chunks/CJFHBop_.js +1 -0
  78. package/build/client/_app/immutable/chunks/CJFHBop_.js.br +0 -0
  79. package/build/client/_app/immutable/chunks/CJFHBop_.js.gz +0 -0
  80. package/build/client/_app/immutable/chunks/CYw9ugj1.js +1 -0
  81. package/build/client/_app/immutable/chunks/CYw9ugj1.js.br +0 -0
  82. package/build/client/_app/immutable/chunks/CYw9ugj1.js.gz +0 -0
  83. package/build/client/_app/immutable/chunks/CjJd0uRB.js +1 -0
  84. package/build/client/_app/immutable/chunks/CjJd0uRB.js.br +1 -0
  85. package/build/client/_app/immutable/chunks/CjJd0uRB.js.gz +0 -0
  86. package/build/client/_app/immutable/chunks/CoEFQJcr.js +1 -0
  87. package/build/client/_app/immutable/chunks/CoEFQJcr.js.br +0 -0
  88. package/build/client/_app/immutable/chunks/CoEFQJcr.js.gz +0 -0
  89. package/build/client/_app/immutable/chunks/D-JtVVAo.js +1 -0
  90. package/build/client/_app/immutable/chunks/D-JtVVAo.js.br +0 -0
  91. package/build/client/_app/immutable/chunks/D-JtVVAo.js.gz +0 -0
  92. package/build/client/_app/immutable/chunks/DJDlf6lC.js +1 -0
  93. package/build/client/_app/immutable/chunks/DJDlf6lC.js.br +0 -0
  94. package/build/client/_app/immutable/chunks/DJDlf6lC.js.gz +0 -0
  95. package/build/client/_app/immutable/chunks/DJLYkl5w.js +1 -0
  96. package/build/client/_app/immutable/chunks/DJLYkl5w.js.br +0 -0
  97. package/build/client/_app/immutable/chunks/DJLYkl5w.js.gz +0 -0
  98. package/build/client/_app/immutable/chunks/DPKdNiYi.js +1 -0
  99. package/build/client/_app/immutable/chunks/DPKdNiYi.js.br +0 -0
  100. package/build/client/_app/immutable/chunks/DPKdNiYi.js.gz +0 -0
  101. package/build/client/_app/immutable/chunks/DQi7bc16.js +1 -0
  102. package/build/client/_app/immutable/chunks/DQi7bc16.js.br +0 -0
  103. package/build/client/_app/immutable/chunks/DQi7bc16.js.gz +0 -0
  104. package/build/client/_app/immutable/chunks/DVTgeA2y.js +2 -0
  105. package/build/client/_app/immutable/chunks/DVTgeA2y.js.br +0 -0
  106. package/build/client/_app/immutable/chunks/DVTgeA2y.js.gz +0 -0
  107. package/build/client/_app/immutable/chunks/Db0q5_zr.js +1 -0
  108. package/build/client/_app/immutable/chunks/Db0q5_zr.js.br +0 -0
  109. package/build/client/_app/immutable/chunks/Db0q5_zr.js.gz +0 -0
  110. package/build/client/_app/immutable/chunks/Dfvzj6n2.js +1 -0
  111. package/build/client/_app/immutable/chunks/Dfvzj6n2.js.br +0 -0
  112. package/build/client/_app/immutable/chunks/Dfvzj6n2.js.gz +0 -0
  113. package/build/client/_app/immutable/chunks/Di37PX72.js +1 -0
  114. package/build/client/_app/immutable/chunks/Di37PX72.js.br +0 -0
  115. package/build/client/_app/immutable/chunks/Di37PX72.js.gz +0 -0
  116. package/build/client/_app/immutable/chunks/{DyIYFD7i.js → DkyYNO4U.js} +1 -1
  117. package/build/client/_app/immutable/chunks/DkyYNO4U.js.br +0 -0
  118. package/build/client/_app/immutable/chunks/DkyYNO4U.js.gz +0 -0
  119. package/build/client/_app/immutable/chunks/DmRhEzIa.js +1 -0
  120. package/build/client/_app/immutable/chunks/DmRhEzIa.js.br +0 -0
  121. package/build/client/_app/immutable/chunks/DmRhEzIa.js.gz +0 -0
  122. package/build/client/_app/immutable/chunks/Dp8S9ymS.js +1 -0
  123. package/build/client/_app/immutable/chunks/Dp8S9ymS.js.br +0 -0
  124. package/build/client/_app/immutable/chunks/Dp8S9ymS.js.gz +0 -0
  125. package/build/client/_app/immutable/chunks/DslUcEd-.js +1 -0
  126. package/build/client/_app/immutable/chunks/DslUcEd-.js.br +0 -0
  127. package/build/client/_app/immutable/chunks/DslUcEd-.js.gz +0 -0
  128. package/build/client/_app/immutable/chunks/Dt_Zd6U2.js +1 -0
  129. package/build/client/_app/immutable/chunks/Dt_Zd6U2.js.br +0 -0
  130. package/build/client/_app/immutable/chunks/Dt_Zd6U2.js.gz +0 -0
  131. package/build/client/_app/immutable/chunks/DwezeuNE.js +5 -0
  132. package/build/client/_app/immutable/chunks/DwezeuNE.js.br +0 -0
  133. package/build/client/_app/immutable/chunks/DwezeuNE.js.gz +0 -0
  134. package/build/client/_app/immutable/chunks/HclGiUj8.js +1 -0
  135. package/build/client/_app/immutable/chunks/HclGiUj8.js.br +0 -0
  136. package/build/client/_app/immutable/chunks/HclGiUj8.js.gz +0 -0
  137. package/build/client/_app/immutable/chunks/PYzEcuyd.js +10 -0
  138. package/build/client/_app/immutable/chunks/PYzEcuyd.js.br +0 -0
  139. package/build/client/_app/immutable/chunks/PYzEcuyd.js.gz +0 -0
  140. package/build/client/_app/immutable/chunks/RobXhXPM.js +1 -0
  141. package/build/client/_app/immutable/chunks/RobXhXPM.js.br +1 -0
  142. package/build/client/_app/immutable/chunks/RobXhXPM.js.gz +0 -0
  143. package/build/client/_app/immutable/chunks/UySfXNq7.js +1 -0
  144. package/build/client/_app/immutable/chunks/UySfXNq7.js.br +0 -0
  145. package/build/client/_app/immutable/chunks/UySfXNq7.js.gz +0 -0
  146. package/build/client/_app/immutable/chunks/Y5urAfNy.js +1 -0
  147. package/build/client/_app/immutable/chunks/Y5urAfNy.js.br +0 -0
  148. package/build/client/_app/immutable/chunks/Y5urAfNy.js.gz +0 -0
  149. package/build/client/_app/immutable/chunks/_Zq76xnA.js +15 -0
  150. package/build/client/_app/immutable/chunks/_Zq76xnA.js.br +0 -0
  151. package/build/client/_app/immutable/chunks/_Zq76xnA.js.gz +0 -0
  152. package/build/client/_app/immutable/chunks/dbhDrJmm.js +1 -0
  153. package/build/client/_app/immutable/chunks/dbhDrJmm.js.br +0 -0
  154. package/build/client/_app/immutable/chunks/dbhDrJmm.js.gz +0 -0
  155. package/build/client/_app/immutable/chunks/pqiPC7Y8.js +3 -0
  156. package/build/client/_app/immutable/chunks/pqiPC7Y8.js.br +0 -0
  157. package/build/client/_app/immutable/chunks/pqiPC7Y8.js.gz +0 -0
  158. package/build/client/_app/immutable/chunks/yCfI4PCa.js +1 -0
  159. package/build/client/_app/immutable/chunks/yCfI4PCa.js.br +0 -0
  160. package/build/client/_app/immutable/chunks/yCfI4PCa.js.gz +0 -0
  161. package/build/client/_app/immutable/entry/app.vMZB8_Zr.js +2 -0
  162. package/build/client/_app/immutable/entry/app.vMZB8_Zr.js.br +0 -0
  163. package/build/client/_app/immutable/entry/app.vMZB8_Zr.js.gz +0 -0
  164. package/build/client/_app/immutable/entry/start.pM5lNk_5.js +1 -0
  165. package/build/client/_app/immutable/entry/start.pM5lNk_5.js.br +0 -0
  166. package/build/client/_app/immutable/entry/start.pM5lNk_5.js.gz +0 -0
  167. package/build/client/_app/immutable/nodes/0.CZO0sIxX.js +1 -0
  168. package/build/client/_app/immutable/nodes/0.CZO0sIxX.js.br +0 -0
  169. package/build/client/_app/immutable/nodes/0.CZO0sIxX.js.gz +0 -0
  170. package/build/client/_app/immutable/nodes/1.zcN3R_zF.js +1 -0
  171. package/build/client/_app/immutable/nodes/1.zcN3R_zF.js.br +0 -0
  172. package/build/client/_app/immutable/nodes/1.zcN3R_zF.js.gz +0 -0
  173. package/build/client/_app/immutable/nodes/2.DxevVqut.js +2 -0
  174. package/build/client/_app/immutable/nodes/2.DxevVqut.js.br +0 -0
  175. package/build/client/_app/immutable/nodes/2.DxevVqut.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-DqCMPeHG.js +7304 -0
  198. package/build/server/chunks/chunks/EventScatter.js-DqCMPeHG.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-C6rz09rJ.js +584 -0
  226. package/build/server/chunks/chunks/archive.js-C6rz09rJ.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-D7xrfc37.js → aws.js-DkPqAybc.js} +13 -64
  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-DDcktblR.js +188 -0
  252. package/build/server/chunks/chunks/internal2.js-DDcktblR.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-B-DZpK-L.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-H_AdNbCw.js +297 -0
  258. package/build/server/chunks/chunks/level-filter.js-H_AdNbCw.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-CpI7gyom.js +471 -0
  264. package/build/server/chunks/chunks/log-buffer.js-CpI7gyom.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-CX_rWCeH.js +123 -0
  286. package/build/server/chunks/chunks/series-buckets.js-CX_rWCeH.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-V2NYGhy_.js → state.js-Dves8H8h.js} +5 -4
  292. package/build/server/chunks/chunks/state.js-Dves8H8h.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-sNd3lS0y.js +39 -0
  296. package/build/server/chunks/entries/endpoints/api/archive/_server.ts.js-sNd3lS0y.js.map +1 -0
  297. package/build/server/chunks/entries/endpoints/api/health/{_server.ts.js-aiNZfkco.js → _server.ts.js-VctnBhIJ.js} +5 -3
  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-Dt540Sio.js +73 -0
  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-D143-vRl.js → _server.ts.js-BGyWbj78.js} +57 -7
  302. package/build/server/chunks/entries/endpoints/api/log-groups/_server.ts.js-BGyWbj78.js.map +1 -0
  303. package/build/server/chunks/entries/endpoints/api/regions/{_server.ts.js-CDNL7msU.js → _server.ts.js-CBqfN6Pg.js} +5 -3
  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-DjGMqXKo.js +194 -0
  306. package/build/server/chunks/entries/endpoints/api/series/_server.ts.js-DjGMqXKo.js.map +1 -0
  307. package/build/server/chunks/entries/endpoints/api/stream/{_server.ts.js-D_i-xW6_.js → _server.ts.js-C-XDemlx.js} +324 -222
  308. package/build/server/chunks/entries/endpoints/api/stream/_server.ts.js-C-XDemlx.js.map +1 -0
  309. package/build/server/chunks/entries/fallbacks/{error.svelte.js-CAasf3PF.js → error.svelte.js-DdUYlUJV.js} +7 -5
  310. package/build/server/chunks/entries/fallbacks/{error.svelte.js-CAasf3PF.js.map → error.svelte.js-DdUYlUJV.js.map} +1 -1
  311. package/build/server/chunks/entries/pages/_layout.svelte.js-CBQpEToy.js +22 -0
  312. package/build/server/chunks/entries/pages/_layout.svelte.js-CBQpEToy.js.map +1 -0
  313. package/build/server/chunks/entries/pages/{_page.svelte.js-DzAAqWz2.js → _page.svelte.js-B-kVwiNh.js} +563 -349
  314. package/build/server/chunks/entries/pages/_page.svelte.js-B-kVwiNh.js.map +1 -0
  315. package/build/server/chunks/{handler-CuWqZDuC.js → handler-BHf-eLnl.js} +3 -3
  316. package/build/server/chunks/{handler-CuWqZDuC.js.map → handler-BHf-eLnl.js.map} +1 -1
  317. package/build/server/chunks/{index.js-NHTL74z2.js → index.js-D6Auup1Z.js} +6 -5
  318. package/build/server/chunks/index.js-D6Auup1Z.js.map +1 -0
  319. package/build/server/chunks/manifest.js-B3Q7n9I6.js +91 -0
  320. package/build/server/chunks/manifest.js-B3Q7n9I6.js.map +1 -0
  321. package/build/server/chunks/nodes/0.js-BMP_Yttt.js +9 -0
  322. package/build/server/chunks/nodes/{0.js-Bg4_hDjk.js.map → 0.js-BMP_Yttt.js.map} +1 -1
  323. package/build/server/chunks/nodes/1.js-2HQHUOse.js +9 -0
  324. package/build/server/chunks/nodes/{1.js-CDSk3TvW.js.map → 1.js-2HQHUOse.js.map} +1 -1
  325. package/build/server/chunks/nodes/2.js-7RtHpiHN.js +9 -0
  326. package/build/server/chunks/nodes/2.js-7RtHpiHN.js.map +1 -0
  327. package/dist/cli/completions.js +6 -0
  328. package/dist/cli/index.js +149 -30
  329. package/dist/cli/options.js +28 -2
  330. package/dist/cli/preflight.js +72 -0
  331. package/dist/cli/ui.js +7 -3
  332. package/dist/lib/cli/aws.js +12 -4
  333. package/dist/lib/log-buffer.js +314 -0
  334. package/dist/lib/log-format.js +185 -0
  335. package/dist/lib/types.js +0 -4
  336. package/package.json +7 -2
  337. package/build/client/_app/immutable/assets/0.CocWI5K4.css +0 -2
  338. package/build/client/_app/immutable/assets/0.CocWI5K4.css.br +0 -0
  339. package/build/client/_app/immutable/assets/0.CocWI5K4.css.gz +0 -0
  340. package/build/client/_app/immutable/chunks/05WsiB4A.js +0 -1
  341. package/build/client/_app/immutable/chunks/05WsiB4A.js.br +0 -0
  342. package/build/client/_app/immutable/chunks/05WsiB4A.js.gz +0 -0
  343. package/build/client/_app/immutable/chunks/DyIYFD7i.js.br +0 -0
  344. package/build/client/_app/immutable/chunks/DyIYFD7i.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.D0_YFW4X.js +0 -2
  349. package/build/client/_app/immutable/entry/app.D0_YFW4X.js.br +0 -0
  350. package/build/client/_app/immutable/entry/app.D0_YFW4X.js.gz +0 -0
  351. package/build/client/_app/immutable/entry/start.D1rrHrg2.js +0 -1
  352. package/build/client/_app/immutable/entry/start.D1rrHrg2.js.br +0 -0
  353. package/build/client/_app/immutable/entry/start.D1rrHrg2.js.gz +0 -0
  354. package/build/client/_app/immutable/nodes/0.DHBUWbOo.js +0 -1
  355. package/build/client/_app/immutable/nodes/0.DHBUWbOo.js.br +0 -0
  356. package/build/client/_app/immutable/nodes/0.DHBUWbOo.js.gz +0 -0
  357. package/build/client/_app/immutable/nodes/1.D1vhnOgO.js +0 -1
  358. package/build/client/_app/immutable/nodes/1.D1vhnOgO.js.br +0 -0
  359. package/build/client/_app/immutable/nodes/1.D1vhnOgO.js.gz +0 -0
  360. package/build/client/_app/immutable/nodes/2.BPdL6B7F.js +0 -5
  361. package/build/client/_app/immutable/nodes/2.BPdL6B7F.js.br +0 -0
  362. package/build/client/_app/immutable/nodes/2.BPdL6B7F.js.gz +0 -0
  363. package/build/server/chunks/chunks/env2.js-D7xrfc37.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-B-DZpK-L.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-V2NYGhy_.js.map +0 -1
  369. package/build/server/chunks/entries/endpoints/api/health/_server.ts.js-aiNZfkco.js.map +0 -1
  370. package/build/server/chunks/entries/endpoints/api/log-groups/_server.ts.js-D143-vRl.js.map +0 -1
  371. package/build/server/chunks/entries/endpoints/api/regions/_server.ts.js-CDNL7msU.js.map +0 -1
  372. package/build/server/chunks/entries/endpoints/api/stream/_server.ts.js-D_i-xW6_.js.map +0 -1
  373. package/build/server/chunks/entries/pages/_layout.svelte.js-Bx7lXkAi.js +0 -22
  374. package/build/server/chunks/entries/pages/_layout.svelte.js-Bx7lXkAi.js.map +0 -1
  375. package/build/server/chunks/entries/pages/_page.svelte.js-DzAAqWz2.js.map +0 -1
  376. package/build/server/chunks/index.js-NHTL74z2.js.map +0 -1
  377. package/build/server/chunks/manifest.js-8g4gjxwf.js +0 -70
  378. package/build/server/chunks/manifest.js-8g4gjxwf.js.map +0 -1
  379. package/build/server/chunks/nodes/0.js-Bg4_hDjk.js +0 -9
  380. package/build/server/chunks/nodes/1.js-CDSk3TvW.js +0 -9
  381. package/build/server/chunks/nodes/2.js-BVhBcWrN.js +0 -9
  382. package/build/server/chunks/nodes/2.js-BVhBcWrN.js.map +0 -1
@@ -0,0 +1,91 @@
1
+ const manifest = (() => {
2
+ function __memo(fn) {
3
+ let value;
4
+ return () => value ??= (value = fn());
5
+ }
6
+
7
+ return {
8
+ appDir: "_app",
9
+ appPath: "_app",
10
+ assets: new Set(["robots.txt"]),
11
+ mimeTypes: {".txt":"text/plain"},
12
+ _: {
13
+ client: {start:"_app/immutable/entry/start.pM5lNk_5.js",app:"_app/immutable/entry/app.vMZB8_Zr.js",imports:["_app/immutable/entry/start.pM5lNk_5.js","_app/immutable/chunks/Dp8S9ymS.js","_app/immutable/chunks/pqiPC7Y8.js","_app/immutable/entry/app.vMZB8_Zr.js","_app/immutable/chunks/pqiPC7Y8.js","_app/immutable/chunks/HclGiUj8.js","_app/immutable/chunks/xihTtKlq.js"],stylesheets:[],fonts:[],uses_env_dynamic_public:false},
14
+ nodes: [
15
+ __memo(() => import('./nodes/0.js-BMP_Yttt.js')),
16
+ __memo(() => import('./nodes/1.js-2HQHUOse.js')),
17
+ __memo(() => import('./nodes/2.js-7RtHpiHN.js'))
18
+ ],
19
+ remotes: {
20
+
21
+ },
22
+ routes: [
23
+ {
24
+ id: "/",
25
+ pattern: /^\/$/,
26
+ params: [],
27
+ page: { layouts: [0,], errors: [1,], leaf: 2 },
28
+ endpoint: null
29
+ },
30
+ {
31
+ id: "/api/archive",
32
+ pattern: /^\/api\/archive\/?$/,
33
+ params: [],
34
+ page: null,
35
+ endpoint: __memo(() => import('./entries/endpoints/api/archive/_server.ts.js-sNd3lS0y.js'))
36
+ },
37
+ {
38
+ id: "/api/health",
39
+ pattern: /^\/api\/health\/?$/,
40
+ params: [],
41
+ page: null,
42
+ endpoint: __memo(() => import('./entries/endpoints/api/health/_server.ts.js-VctnBhIJ.js'))
43
+ },
44
+ {
45
+ id: "/api/identity",
46
+ pattern: /^\/api\/identity\/?$/,
47
+ params: [],
48
+ page: null,
49
+ endpoint: __memo(() => import('./entries/endpoints/api/identity/_server.ts.js-Dt540Sio.js'))
50
+ },
51
+ {
52
+ id: "/api/log-groups",
53
+ pattern: /^\/api\/log-groups\/?$/,
54
+ params: [],
55
+ page: null,
56
+ endpoint: __memo(() => import('./entries/endpoints/api/log-groups/_server.ts.js-BGyWbj78.js'))
57
+ },
58
+ {
59
+ id: "/api/regions",
60
+ pattern: /^\/api\/regions\/?$/,
61
+ params: [],
62
+ page: null,
63
+ endpoint: __memo(() => import('./entries/endpoints/api/regions/_server.ts.js-CBqfN6Pg.js'))
64
+ },
65
+ {
66
+ id: "/api/series",
67
+ pattern: /^\/api\/series\/?$/,
68
+ params: [],
69
+ page: null,
70
+ endpoint: __memo(() => import('./entries/endpoints/api/series/_server.ts.js-DjGMqXKo.js'))
71
+ },
72
+ {
73
+ id: "/api/stream",
74
+ pattern: /^\/api\/stream\/?$/,
75
+ params: [],
76
+ page: null,
77
+ endpoint: __memo(() => import('./entries/endpoints/api/stream/_server.ts.js-C-XDemlx.js'))
78
+ }
79
+ ],
80
+ prerendered_routes: new Set([]),
81
+ matchers: async () => {
82
+
83
+ return { };
84
+ },
85
+ server_assets: {}
86
+ }
87
+ }
88
+ })();
89
+
90
+ export { manifest as m };
91
+ //# sourceMappingURL=manifest.js-B3Q7n9I6.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.js-B3Q7n9I6.js","sources":["../../../.svelte-kit/output/server/manifest.js"],"sourcesContent":["export const manifest = (() => {\nfunction __memo(fn) {\n\tlet value;\n\treturn () => value ??= (value = fn());\n}\n\nreturn {\n\tappDir: \"_app\",\n\tappPath: \"_app\",\n\tassets: new Set([\"robots.txt\"]),\n\tmimeTypes: {\".txt\":\"text/plain\"},\n\t_: {\n\t\tclient: {start:\"_app/immutable/entry/start.pM5lNk_5.js\",app:\"_app/immutable/entry/app.vMZB8_Zr.js\",imports:[\"_app/immutable/entry/start.pM5lNk_5.js\",\"_app/immutable/chunks/Dp8S9ymS.js\",\"_app/immutable/chunks/pqiPC7Y8.js\",\"_app/immutable/entry/app.vMZB8_Zr.js\",\"_app/immutable/chunks/pqiPC7Y8.js\",\"_app/immutable/chunks/HclGiUj8.js\",\"_app/immutable/chunks/xihTtKlq.js\"],stylesheets:[],fonts:[],uses_env_dynamic_public:false},\n\t\tnodes: [\n\t\t\t__memo(() => import('./nodes/0.js')),\n\t\t\t__memo(() => import('./nodes/1.js')),\n\t\t\t__memo(() => import('./nodes/2.js'))\n\t\t],\n\t\tremotes: {\n\t\t\t\n\t\t},\n\t\troutes: [\n\t\t\t{\n\t\t\t\tid: \"/\",\n\t\t\t\tpattern: /^\\/$/,\n\t\t\t\tparams: [],\n\t\t\t\tpage: { layouts: [0,], errors: [1,], leaf: 2 },\n\t\t\t\tendpoint: null\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"/api/archive\",\n\t\t\t\tpattern: /^\\/api\\/archive\\/?$/,\n\t\t\t\tparams: [],\n\t\t\t\tpage: null,\n\t\t\t\tendpoint: __memo(() => import('./entries/endpoints/api/archive/_server.ts.js'))\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"/api/health\",\n\t\t\t\tpattern: /^\\/api\\/health\\/?$/,\n\t\t\t\tparams: [],\n\t\t\t\tpage: null,\n\t\t\t\tendpoint: __memo(() => import('./entries/endpoints/api/health/_server.ts.js'))\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"/api/identity\",\n\t\t\t\tpattern: /^\\/api\\/identity\\/?$/,\n\t\t\t\tparams: [],\n\t\t\t\tpage: null,\n\t\t\t\tendpoint: __memo(() => import('./entries/endpoints/api/identity/_server.ts.js'))\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"/api/log-groups\",\n\t\t\t\tpattern: /^\\/api\\/log-groups\\/?$/,\n\t\t\t\tparams: [],\n\t\t\t\tpage: null,\n\t\t\t\tendpoint: __memo(() => import('./entries/endpoints/api/log-groups/_server.ts.js'))\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"/api/regions\",\n\t\t\t\tpattern: /^\\/api\\/regions\\/?$/,\n\t\t\t\tparams: [],\n\t\t\t\tpage: null,\n\t\t\t\tendpoint: __memo(() => import('./entries/endpoints/api/regions/_server.ts.js'))\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"/api/series\",\n\t\t\t\tpattern: /^\\/api\\/series\\/?$/,\n\t\t\t\tparams: [],\n\t\t\t\tpage: null,\n\t\t\t\tendpoint: __memo(() => import('./entries/endpoints/api/series/_server.ts.js'))\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"/api/stream\",\n\t\t\t\tpattern: /^\\/api\\/stream\\/?$/,\n\t\t\t\tparams: [],\n\t\t\t\tpage: null,\n\t\t\t\tendpoint: __memo(() => import('./entries/endpoints/api/stream/_server.ts.js'))\n\t\t\t}\n\t\t],\n\t\tprerendered_routes: new Set([]),\n\t\tmatchers: async () => {\n\t\t\t\n\t\t\treturn { };\n\t\t},\n\t\tserver_assets: {}\n\t}\n}\n})();\n"],"names":[],"mappings":"AAAY,MAAC,QAAQ,GAAG,CAAC,MAAM;AAC/B,SAAS,MAAM,CAAC,EAAE,EAAE;AACpB,CAAC,IAAI,KAAK;AACV,CAAC,OAAO,MAAM,KAAK,MAAM,KAAK,GAAG,EAAE,EAAE,CAAC;AACtC;;AAEA,OAAO;AACP,CAAC,MAAM,EAAE,MAAM;AACf,CAAC,OAAO,EAAE,MAAM;AAChB,CAAC,MAAM,EAAE,IAAI,GAAG,CAAC,CAAC,YAAY,CAAC,CAAC;AAChC,CAAC,SAAS,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC;AACjC,CAAC,CAAC,EAAE;AACJ,EAAE,MAAM,EAAE,CAAC,KAAK,CAAC,wCAAwC,CAAC,GAAG,CAAC,sCAAsC,CAAC,OAAO,CAAC,CAAC,wCAAwC,CAAC,mCAAmC,CAAC,mCAAmC,CAAC,sCAAsC,CAAC,mCAAmC,CAAC,mCAAmC,CAAC,mCAAmC,CAAC,CAAC,WAAW,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,uBAAuB,CAAC,KAAK,CAAC;AACza,EAAE,KAAK,EAAE;AACT,GAAG,MAAM,CAAC,MAAM,OAAO,0BAAc,CAAC,CAAC;AACvC,GAAG,MAAM,CAAC,MAAM,OAAO,0BAAc,CAAC,CAAC;AACvC,GAAG,MAAM,CAAC,MAAM,OAAO,0BAAc,CAAC;AACtC,GAAG;AACH,EAAE,OAAO,EAAE;AACX;AACA,GAAG;AACH,EAAE,MAAM,EAAE;AACV,GAAG;AACH,IAAI,EAAE,EAAE,GAAG;AACX,IAAI,OAAO,EAAE,MAAM;AACnB,IAAI,MAAM,EAAE,EAAE;AACd,IAAI,IAAI,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE;AAClD,IAAI,QAAQ,EAAE;AACd,IAAI;AACJ,GAAG;AACH,IAAI,EAAE,EAAE,cAAc;AACtB,IAAI,OAAO,EAAE,qBAAqB;AAClC,IAAI,MAAM,EAAE,EAAE;AACd,IAAI,IAAI,EAAE,IAAI;AACd,IAAI,QAAQ,EAAE,MAAM,CAAC,MAAM,OAAO,2DAA+C,CAAC;AAClF,IAAI;AACJ,GAAG;AACH,IAAI,EAAE,EAAE,aAAa;AACrB,IAAI,OAAO,EAAE,oBAAoB;AACjC,IAAI,MAAM,EAAE,EAAE;AACd,IAAI,IAAI,EAAE,IAAI;AACd,IAAI,QAAQ,EAAE,MAAM,CAAC,MAAM,OAAO,0DAA8C,CAAC;AACjF,IAAI;AACJ,GAAG;AACH,IAAI,EAAE,EAAE,eAAe;AACvB,IAAI,OAAO,EAAE,sBAAsB;AACnC,IAAI,MAAM,EAAE,EAAE;AACd,IAAI,IAAI,EAAE,IAAI;AACd,IAAI,QAAQ,EAAE,MAAM,CAAC,MAAM,OAAO,4DAAgD,CAAC;AACnF,IAAI;AACJ,GAAG;AACH,IAAI,EAAE,EAAE,iBAAiB;AACzB,IAAI,OAAO,EAAE,wBAAwB;AACrC,IAAI,MAAM,EAAE,EAAE;AACd,IAAI,IAAI,EAAE,IAAI;AACd,IAAI,QAAQ,EAAE,MAAM,CAAC,MAAM,OAAO,8DAAkD,CAAC;AACrF,IAAI;AACJ,GAAG;AACH,IAAI,EAAE,EAAE,cAAc;AACtB,IAAI,OAAO,EAAE,qBAAqB;AAClC,IAAI,MAAM,EAAE,EAAE;AACd,IAAI,IAAI,EAAE,IAAI;AACd,IAAI,QAAQ,EAAE,MAAM,CAAC,MAAM,OAAO,2DAA+C,CAAC;AAClF,IAAI;AACJ,GAAG;AACH,IAAI,EAAE,EAAE,aAAa;AACrB,IAAI,OAAO,EAAE,oBAAoB;AACjC,IAAI,MAAM,EAAE,EAAE;AACd,IAAI,IAAI,EAAE,IAAI;AACd,IAAI,QAAQ,EAAE,MAAM,CAAC,MAAM,OAAO,0DAA8C,CAAC;AACjF,IAAI;AACJ,GAAG;AACH,IAAI,EAAE,EAAE,aAAa;AACrB,IAAI,OAAO,EAAE,oBAAoB;AACjC,IAAI,MAAM,EAAE,EAAE;AACd,IAAI,IAAI,EAAE,IAAI;AACd,IAAI,QAAQ,EAAE,MAAM,CAAC,MAAM,OAAO,0DAA8C,CAAC;AACjF;AACA,GAAG;AACH,EAAE,kBAAkB,EAAE,IAAI,GAAG,CAAC,EAAE,CAAC;AACjC,EAAE,QAAQ,EAAE,YAAY;AACxB;AACA,GAAG,OAAO,IAAI;AACd,EAAE,CAAC;AACH,EAAE,aAAa,EAAE;AACjB;AACA;AACA,CAAC;;"}
@@ -0,0 +1,9 @@
1
+ const index = 0;
2
+ let component_cache;
3
+ const component = async () => component_cache ??= (await import('../entries/pages/_layout.svelte.js-CBQpEToy.js')).default;
4
+ const imports = ["_app/immutable/nodes/0.CZO0sIxX.js","_app/immutable/chunks/pqiPC7Y8.js","_app/immutable/chunks/xihTtKlq.js"];
5
+ const stylesheets = ["_app/immutable/assets/0.BQQ1YLPc.css"];
6
+ const fonts = [];
7
+
8
+ export { component, fonts, imports, index, stylesheets };
9
+ //# sourceMappingURL=0.js-BMP_Yttt.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"0.js-Bg4_hDjk.js","sources":["../../../../.svelte-kit/output/server/nodes/0.js"],"sourcesContent":["\n\nexport const index = 0;\nlet component_cache;\nexport const component = async () => component_cache ??= (await import('../entries/pages/_layout.svelte.js')).default;\nexport const imports = [\"_app/immutable/nodes/0.DHBUWbOo.js\",\"_app/immutable/chunks/ZAD2y5xJ.js\",\"_app/immutable/chunks/xihTtKlq.js\"];\nexport const stylesheets = [\"_app/immutable/assets/0.CocWI5K4.css\"];\nexport const fonts = [];\n"],"names":[],"mappings":"AAEY,MAAC,KAAK,GAAG;AACrB,IAAI,eAAe;AACP,MAAC,SAAS,GAAG,YAAY,eAAe,KAAK,CAAC,MAAM,OAAO,gDAAoC,CAAC,EAAE;AAClG,MAAC,OAAO,GAAG,CAAC,oCAAoC,CAAC,mCAAmC,CAAC,mCAAmC;AACxH,MAAC,WAAW,GAAG,CAAC,sCAAsC;AACtD,MAAC,KAAK,GAAG;;"}
1
+ {"version":3,"file":"0.js-BMP_Yttt.js","sources":["../../../../.svelte-kit/output/server/nodes/0.js"],"sourcesContent":["\n\nexport const index = 0;\nlet component_cache;\nexport const component = async () => component_cache ??= (await import('../entries/pages/_layout.svelte.js')).default;\nexport const imports = [\"_app/immutable/nodes/0.CZO0sIxX.js\",\"_app/immutable/chunks/pqiPC7Y8.js\",\"_app/immutable/chunks/xihTtKlq.js\"];\nexport const stylesheets = [\"_app/immutable/assets/0.BQQ1YLPc.css\"];\nexport const fonts = [];\n"],"names":[],"mappings":"AAEY,MAAC,KAAK,GAAG;AACrB,IAAI,eAAe;AACP,MAAC,SAAS,GAAG,YAAY,eAAe,KAAK,CAAC,MAAM,OAAO,gDAAoC,CAAC,EAAE;AAClG,MAAC,OAAO,GAAG,CAAC,oCAAoC,CAAC,mCAAmC,CAAC,mCAAmC;AACxH,MAAC,WAAW,GAAG,CAAC,sCAAsC;AACtD,MAAC,KAAK,GAAG;;"}
@@ -0,0 +1,9 @@
1
+ const index = 1;
2
+ let component_cache;
3
+ const component = async () => component_cache ??= (await import('../entries/fallbacks/error.svelte.js-DdUYlUJV.js')).default;
4
+ const imports = ["_app/immutable/nodes/1.zcN3R_zF.js","_app/immutable/chunks/pqiPC7Y8.js","_app/immutable/chunks/xihTtKlq.js","_app/immutable/chunks/DkyYNO4U.js","_app/immutable/chunks/Dp8S9ymS.js"];
5
+ const stylesheets = [];
6
+ const fonts = [];
7
+
8
+ export { component, fonts, imports, index, stylesheets };
9
+ //# sourceMappingURL=1.js-2HQHUOse.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"1.js-CDSk3TvW.js","sources":["../../../../.svelte-kit/output/server/nodes/1.js"],"sourcesContent":["\n\nexport const index = 1;\nlet component_cache;\nexport const component = async () => component_cache ??= (await import('../entries/fallbacks/error.svelte.js')).default;\nexport const imports = [\"_app/immutable/nodes/1.D1vhnOgO.js\",\"_app/immutable/chunks/ZAD2y5xJ.js\",\"_app/immutable/chunks/xihTtKlq.js\",\"_app/immutable/chunks/DyIYFD7i.js\",\"_app/immutable/chunks/05WsiB4A.js\"];\nexport const stylesheets = [];\nexport const fonts = [];\n"],"names":[],"mappings":"AAEY,MAAC,KAAK,GAAG;AACrB,IAAI,eAAe;AACP,MAAC,SAAS,GAAG,YAAY,eAAe,KAAK,CAAC,MAAM,OAAO,kDAAsC,CAAC,EAAE;AACpG,MAAC,OAAO,GAAG,CAAC,oCAAoC,CAAC,mCAAmC,CAAC,mCAAmC,CAAC,mCAAmC,CAAC,mCAAmC;AAChM,MAAC,WAAW,GAAG;AACf,MAAC,KAAK,GAAG;;"}
1
+ {"version":3,"file":"1.js-2HQHUOse.js","sources":["../../../../.svelte-kit/output/server/nodes/1.js"],"sourcesContent":["\n\nexport const index = 1;\nlet component_cache;\nexport const component = async () => component_cache ??= (await import('../entries/fallbacks/error.svelte.js')).default;\nexport const imports = [\"_app/immutable/nodes/1.zcN3R_zF.js\",\"_app/immutable/chunks/pqiPC7Y8.js\",\"_app/immutable/chunks/xihTtKlq.js\",\"_app/immutable/chunks/DkyYNO4U.js\",\"_app/immutable/chunks/Dp8S9ymS.js\"];\nexport const stylesheets = [];\nexport const fonts = [];\n"],"names":[],"mappings":"AAEY,MAAC,KAAK,GAAG;AACrB,IAAI,eAAe;AACP,MAAC,SAAS,GAAG,YAAY,eAAe,KAAK,CAAC,MAAM,OAAO,kDAAsC,CAAC,EAAE;AACpG,MAAC,OAAO,GAAG,CAAC,oCAAoC,CAAC,mCAAmC,CAAC,mCAAmC,CAAC,mCAAmC,CAAC,mCAAmC;AAChM,MAAC,WAAW,GAAG;AACf,MAAC,KAAK,GAAG;;"}
@@ -0,0 +1,9 @@
1
+ const index = 2;
2
+ let component_cache;
3
+ const component = async () => component_cache ??= (await import('../entries/pages/_page.svelte.js-B-kVwiNh.js')).default;
4
+ const imports = ["_app/immutable/nodes/2.DxevVqut.js","_app/immutable/chunks/pqiPC7Y8.js","_app/immutable/chunks/Dp8S9ymS.js","_app/immutable/chunks/HclGiUj8.js","_app/immutable/chunks/xihTtKlq.js","_app/immutable/chunks/DkyYNO4U.js","_app/immutable/chunks/DwezeuNE.js"];
5
+ const stylesheets = ["_app/immutable/assets/Path.B0wDzTrn.css","_app/immutable/assets/Circle.C5MKzgk2.css","_app/immutable/assets/EventScatter.DA5sZ1c0.css"];
6
+ const fonts = [];
7
+
8
+ export { component, fonts, imports, index, stylesheets };
9
+ //# sourceMappingURL=2.js-7RtHpiHN.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"2.js-7RtHpiHN.js","sources":["../../../../.svelte-kit/output/server/nodes/2.js"],"sourcesContent":["\n\nexport const index = 2;\nlet component_cache;\nexport const component = async () => component_cache ??= (await import('../entries/pages/_page.svelte.js')).default;\nexport const imports = [\"_app/immutable/nodes/2.DxevVqut.js\",\"_app/immutable/chunks/pqiPC7Y8.js\",\"_app/immutable/chunks/Dp8S9ymS.js\",\"_app/immutable/chunks/HclGiUj8.js\",\"_app/immutable/chunks/xihTtKlq.js\",\"_app/immutable/chunks/DkyYNO4U.js\",\"_app/immutable/chunks/DwezeuNE.js\"];\nexport const stylesheets = [\"_app/immutable/assets/Path.B0wDzTrn.css\",\"_app/immutable/assets/Circle.C5MKzgk2.css\",\"_app/immutable/assets/EventScatter.DA5sZ1c0.css\"];\nexport const fonts = [];\n"],"names":[],"mappings":"AAEY,MAAC,KAAK,GAAG;AACrB,IAAI,eAAe;AACP,MAAC,SAAS,GAAG,YAAY,eAAe,KAAK,CAAC,MAAM,OAAO,8CAAkC,CAAC,EAAE;AAChG,MAAC,OAAO,GAAG,CAAC,oCAAoC,CAAC,mCAAmC,CAAC,mCAAmC,CAAC,mCAAmC,CAAC,mCAAmC,CAAC,mCAAmC,CAAC,mCAAmC;AACxQ,MAAC,WAAW,GAAG,CAAC,yCAAyC,CAAC,2CAA2C,CAAC,iDAAiD;AACvJ,MAAC,KAAK,GAAG;;"}
@@ -62,6 +62,12 @@ function registerCompletionSpec(profiles = []) {
62
62
  t.option('print', 'Print the environment and exit');
63
63
  t.option('list', 'List AWS profiles and exit');
64
64
  t.option('verbose', 'Log the server output');
65
+ t.option('db', 'Database file for local history', function (complete) {
66
+ complete('./logs.duckdb', 'archive in the current directory');
67
+ complete('~/watch-tail.duckdb', 'archive in your home directory');
68
+ });
69
+ t.option('archive', 'Keep a local history archive (default)');
70
+ t.option('no-archive', 'Do not keep a local history archive');
65
71
  t.option('help', 'Show help', undefined, 'h');
66
72
  t.option('version', 'Show the version', undefined, 'v');
67
73
  const complete = t.command('complete', 'Print a shell completion script');
package/dist/cli/index.js CHANGED
@@ -15,7 +15,7 @@ import { classifyCredentialFailure, describeStyle, isCredentialFailure, loginAdv
15
15
  import { handleCompletion } from "./completions.js";
16
16
  import { isLoopbackHost, parseCliArgs, usageText } from "./options.js";
17
17
  import { appRootFromHere, healthUrl, openBrowser as openBrowserDefault, startServer, stopServer, uiUrl, waitForHealth, } from "./server.js";
18
- import { isHeadless, probeCredentials as probeCredentialsDefault, runLogin as runLoginDefault, } from "./preflight.js";
18
+ import { describeArchive, isHeadless, probeCredentials as probeCredentialsDefault, readArchive as readArchiveDefault, readIdentity as readIdentityDefault, runLogin as runLoginDefault, shortIdentity, } from "./preflight.js";
19
19
  import { createUi, isInteractive } from "./ui.js";
20
20
  /** Reads the version from the package manifest next to the app root. */
21
21
  export function readVersion(appRoot) {
@@ -74,6 +74,8 @@ function defaultIo() {
74
74
  readLocalEnvValues: () => (appRoot === null ? {} : readLocalEnvValues(appRoot)),
75
75
  probeCredentials: (input) => probeCredentialsDefault(input),
76
76
  runLogin: (command) => runLoginDefault(command),
77
+ readIdentity: (input) => readIdentityDefault(input),
78
+ readArchive: (input) => readArchiveDefault(input),
77
79
  waitForHealth,
78
80
  startServerImpl: startServer,
79
81
  spawnImpl: spawn,
@@ -107,53 +109,71 @@ export function resolveCliRegion(options, io) {
107
109
  *
108
110
  * Emulator runs are skipped: `--floci` supplies throwaway keys on purpose.
109
111
  */
110
- async function ensureCredentials(input) {
111
- const { options, io, ui, url, region } = input;
112
+ /**
113
+ * Asks the running app whether it can read logs, and when it cannot because of
114
+ * credentials, decides which profile the run should be using.
115
+ *
116
+ * With no profile in play it asks, because a machine with several profiles is
117
+ * rarely served by the ambient default. The identity check and the login come
118
+ * after the app has been restarted with that profile: only then do they test
119
+ * the profile the user actually chose.
120
+ */
121
+ async function assessCredentials(input) {
122
+ const { options, io, ui, url, region, startProfile } = input;
112
123
  if (options.endpoint !== null)
113
- return;
124
+ return { status: 'ok' };
114
125
  const probe = await io.probeCredentials({ baseUrl: url, region });
115
126
  if (probe.ok)
116
- return;
127
+ return { status: 'ok' };
117
128
  if (!probe.credentialProblem || !isCredentialFailure(probe.code, probe.message)) {
118
- ui.warn(`could not list log groups: ${probe.message}`);
119
- return;
129
+ return { status: 'other', message: probe.message };
120
130
  }
121
- // The flag wins, then the ambient AWS_PROFILE: both decide which login
122
- // command can actually repair the failure.
123
- const profile = options.profile ?? ambientProfile(io.env) ?? 'default';
124
- const style = readProfileStyle(io.readConfigText(), io.readCredentialsText(), profile);
125
- const failure = classifyCredentialFailure(probe.message, probe.code);
126
- const advice = loginAdvice({
127
- style,
128
- failure,
129
- profile,
130
- remote: isHeadless(io.env),
131
- });
132
131
  ui.warn(`AWS credentials are not usable: ${probe.message}`);
132
+ let profile = startProfile ?? 'default';
133
+ let chosen = null;
134
+ if (startProfile === null) {
135
+ const profiles = io.readProfiles();
136
+ if (profiles.length > 1) {
137
+ const answer = await ui.choose('Which AWS profile should watch-tail use?', profiles.map((name) => ({ value: name, label: name })), profiles.includes('default') ? 'default' : profiles[0]);
138
+ if (answer !== null && answer !== 'default') {
139
+ chosen = answer;
140
+ profile = answer;
141
+ ui.info(`using profile ${answer}`);
142
+ }
143
+ }
144
+ }
145
+ return { status: 'credentials', profile, chosen, message: probe.message, code: probe.code };
146
+ }
147
+ /**
148
+ * Offers the login that repairs a credential failure, runs it if accepted, and
149
+ * reports what happened. The profile is the one the app is currently using.
150
+ */
151
+ async function offerLogin(input) {
152
+ const { io, ui, profile, failureMessage, failureCode } = input;
153
+ const name = profile ?? 'default';
154
+ const style = readProfileStyle(io.readConfigText(), io.readCredentialsText(), name);
155
+ const failure = classifyCredentialFailure(failureMessage, failureCode);
156
+ const advice = loginAdvice({ style, failure, profile, remote: isHeadless(io.env) });
133
157
  if (advice === null) {
134
158
  ui.info(style === 'static'
135
- ? `the ${describeStyle(style)} in profile "${profile}" look wrong - check them with \`aws configure --profile ${profile}\``
136
- : `no login command applies to profile "${profile}" (${describeStyle(style)})`);
137
- return;
159
+ ? `the ${describeStyle(style)} in profile "${name}" look wrong - check them with \`aws configure --profile ${name}\``
160
+ : `no login command applies to profile "${name}" (${describeStyle(style)})`);
161
+ return { login: 'none' };
138
162
  }
139
163
  const label = `aws ${advice.command.join(' ')}`;
140
164
  const accepted = await ui.confirm(`${advice.hint}. Run \`${label}\` now?`);
141
165
  if (!accepted) {
142
166
  ui.info(`run it yourself, then press Refresh in the UI: ${label}`);
143
- return;
167
+ return { login: 'declined' };
144
168
  }
145
169
  ui.info(`running ${label}`);
146
170
  const code = await io.runLogin(advice.command);
147
171
  if (code !== 0) {
148
172
  ui.warn(`${label} exited with code ${code}`);
149
173
  ui.info(`log in another terminal, then press Refresh in the UI: ${label}`);
150
- return;
174
+ return { login: 'failed' };
151
175
  }
152
- const retry = await io.probeCredentials({ baseUrl: url, region });
153
- if (retry.ok)
154
- ui.info('signed in - credentials work now');
155
- else
156
- ui.warn(`still failing after login: ${retry.message}`);
176
+ return { login: 'succeeded' };
157
177
  }
158
178
  /** Runs the CLI and returns its exit code. */
159
179
  export async function run(argv, overrides = {}) {
@@ -210,6 +230,7 @@ export async function run(argv, overrides = {}) {
210
230
  region,
211
231
  endpoint: options.endpoint,
212
232
  clearStaticKeys: options.profile === null && profile !== null,
233
+ archive: { enabled: options.archive, path: options.db },
213
234
  });
214
235
  if (options.print) {
215
236
  for (const line of describeChildEnv(childEnv))
@@ -241,7 +262,7 @@ export async function run(argv, overrides = {}) {
241
262
  ui.warn('a .env.local with local emulator settings was found; it is ignored for this run');
242
263
  }
243
264
  ui.startSpinner('starting the local UI...');
244
- const child = io.startServerImpl({
265
+ let child = io.startServerImpl({
245
266
  appRoot: io.appRoot,
246
267
  env: childEnv,
247
268
  port: options.port,
@@ -255,9 +276,107 @@ export async function run(argv, overrides = {}) {
255
276
  return 1;
256
277
  }
257
278
  ui.stopSpinner(`listening on ${url}`);
279
+ // Report where history is kept before the AWS check: it is the one thing the
280
+ // UI can offer even when credentials are not usable yet.
281
+ if (!options.archive) {
282
+ ui.info('local history off (--no-archive)');
283
+ }
284
+ else {
285
+ const archive = await io.readArchive({ baseUrl: url });
286
+ if (archive.ok) {
287
+ if (archive.status.available)
288
+ ui.info(describeArchive(archive.status));
289
+ else
290
+ ui.warn(describeArchive(archive.status));
291
+ }
292
+ else {
293
+ ui.warn(`could not read the local history status: ${archive.message}`);
294
+ }
295
+ }
258
296
  // Before sending anyone to a UI that cannot load logs, check that AWS will
259
297
  // actually answer, and offer the login that fixes it.
260
- await ensureCredentials({ options, io, ui, url, region });
298
+ const assessment = await assessCredentials({
299
+ options,
300
+ io,
301
+ ui,
302
+ url,
303
+ region,
304
+ startProfile: profile,
305
+ });
306
+ if (assessment.status === 'other') {
307
+ ui.warn(`could not list log groups: ${assessment.message}`);
308
+ }
309
+ if (assessment.status === 'credentials') {
310
+ // A profile that was not in play needs the app restarted with it: that is
311
+ // the only way to find out whether its credentials already work, and the
312
+ // only way the browser can use it.
313
+ const activeProfile = assessment.chosen === null ? null : assessment.chosen;
314
+ let activeRegion = region;
315
+ let failureMessage = assessment.message;
316
+ let failureCode = assessment.code;
317
+ if (assessment.chosen !== null) {
318
+ activeRegion = resolveRunRegion({
319
+ region: options.region,
320
+ profile: assessment.chosen,
321
+ base: io.env,
322
+ configText: io.readConfigText(),
323
+ });
324
+ ui.info(`restarting with profile ${assessment.chosen}`);
325
+ await stopServer(child);
326
+ child = io.startServerImpl({
327
+ appRoot: io.appRoot,
328
+ env: buildChildEnv({
329
+ base: baseEnv,
330
+ profile: assessment.chosen,
331
+ region: activeRegion,
332
+ endpoint: null,
333
+ archive: { enabled: options.archive, path: options.db },
334
+ }),
335
+ port: options.port,
336
+ host: options.host,
337
+ verbose: options.verbose,
338
+ });
339
+ const healthy = await io.waitForHealth(healthUrl(url), { fetchImpl: fetch });
340
+ if (!healthy) {
341
+ ui.failSpinner(`the server did not come back up on ${url}`);
342
+ await stopServer(child);
343
+ return 1;
344
+ }
345
+ // Now the question is about the chosen profile, not the ambient one.
346
+ const identity = await io.readIdentity({ baseUrl: url, region: activeRegion });
347
+ if (identity.ok) {
348
+ ui.info(`profile ${assessment.chosen} already works (${shortIdentity(identity.identity.arn)}) - using it`);
349
+ ui.outro(`${url} (Ctrl+C to stop)`);
350
+ if (options.open)
351
+ io.openBrowser(url);
352
+ const code = await io.waitForStop(child);
353
+ ui.outro('stopped');
354
+ return code;
355
+ }
356
+ failureMessage = identity.message;
357
+ failureCode = identity.code;
358
+ }
359
+ const outcome = await offerLogin({
360
+ options,
361
+ io,
362
+ ui,
363
+ profile: activeProfile ?? assessment.profile,
364
+ failureMessage,
365
+ failureCode,
366
+ });
367
+ if (outcome.login === 'succeeded') {
368
+ const identity = await io.readIdentity({ baseUrl: url, region: activeRegion });
369
+ if (identity.ok) {
370
+ ui.info(`signed in as ${shortIdentity(identity.identity.arn)}${activeProfile === null ? '' : ` (${activeProfile})`}`);
371
+ }
372
+ else {
373
+ ui.warn(`still failing after login: ${identity.message}`);
374
+ }
375
+ }
376
+ else if (activeProfile !== null) {
377
+ ui.info(`the app is using profile ${activeProfile}; log in, then press Refresh in the UI`);
378
+ }
379
+ }
261
380
  if (options.open)
262
381
  io.openBrowser(url);
263
382
  ui.outro(`${url} (Ctrl+C to stop)`);
@@ -32,6 +32,9 @@ const KNOWN_FLAGS = new Set([
32
32
  'version',
33
33
  'v',
34
34
  'verbose',
35
+ 'archive',
36
+ 'no-archive',
37
+ 'db',
35
38
  ]);
36
39
  function asString(value) {
37
40
  if (typeof value === 'string') {
@@ -63,8 +66,19 @@ export function parseCliArgs(argv) {
63
66
  try {
64
67
  parsed = parse(words, {
65
68
  alias: { p: 'profile', r: 'region', h: 'help', v: 'version' },
66
- boolean: ['floci', 'open', 'no-open', 'print', 'list', 'help', 'version', 'verbose'],
67
- string: ['profile', 'region', 'port', 'host', 'endpoint'],
69
+ boolean: [
70
+ 'floci',
71
+ 'open',
72
+ 'no-open',
73
+ 'print',
74
+ 'list',
75
+ 'help',
76
+ 'version',
77
+ 'verbose',
78
+ 'archive',
79
+ 'no-archive',
80
+ ],
81
+ string: ['profile', 'region', 'port', 'host', 'endpoint', 'db'],
68
82
  default: { open: true },
69
83
  });
70
84
  }
@@ -102,6 +116,8 @@ export function parseCliArgs(argv) {
102
116
  help: asFlag(parsed.help),
103
117
  version: asFlag(parsed.version),
104
118
  verbose: asFlag(parsed.verbose),
119
+ archive: !asFlag(parsed['no-archive']) && parsed.archive !== false,
120
+ db: asString(parsed.db),
105
121
  complete: null,
106
122
  },
107
123
  };
@@ -120,6 +136,8 @@ export function defaults() {
120
136
  help: false,
121
137
  version: false,
122
138
  verbose: false,
139
+ archive: true,
140
+ db: null,
123
141
  complete: null,
124
142
  };
125
143
  }
@@ -153,6 +171,8 @@ Options
153
171
  --print Print the environment that would be used, then exit
154
172
  --list List the AWS profiles found on disk, then exit
155
173
  --verbose Log the server's own output
174
+ --db <path> Database file for local history (default: app data dir)
175
+ --no-archive Do not keep a local history archive
156
176
  -h, --help Show this help
157
177
  -v, --version Show the version
158
178
 
@@ -164,6 +184,12 @@ Examples
164
184
  npx watch-tail
165
185
  npx watch-tail --profile my-profile --region eu-west-1
166
186
  npx watch-tail --floci --port 4600 --no-open
187
+ npx watch-tail --db ./logs.duckdb (history in a file you choose)
188
+
189
+ Everything the app streams is also archived to a local DuckDB file, so the UI can
190
+ browse history later without calling AWS. Use --no-archive to switch that off, or
191
+ --db to keep the archive somewhere else. The database needs the optional DuckDB
192
+ driver: when it is missing, the app runs exactly as before, without history.
167
193
 
168
194
  The app streams whatever your ambient AWS credentials can read. Credentials are
169
195
  resolved by the AWS SDK (SSO, shared config, environment, instance role); the CLI
@@ -71,3 +71,75 @@ export function isHeadless(env = process.env) {
71
71
  return true;
72
72
  return false;
73
73
  }
74
+ /**
75
+ * Asks the app to call `sts:GetCallerIdentity`.
76
+ *
77
+ * This is the cheapest way to answer "do these credentials work at all?", and it
78
+ * is what tells the CLI not to offer a login for a profile that is already fine.
79
+ */
80
+ export async function readIdentity(input) {
81
+ const { baseUrl, region, fetchImpl = fetch, timeoutMs = 15_000 } = input;
82
+ const url = new URL('/api/identity', baseUrl);
83
+ if (region !== null && region !== '')
84
+ url.searchParams.set('region', region);
85
+ try {
86
+ const response = await fetchImpl(url, { signal: AbortSignal.timeout(timeoutMs) });
87
+ if (response.ok) {
88
+ return { ok: true, identity: (await response.json()) };
89
+ }
90
+ const body = (await response.json().catch(() => null));
91
+ return { ok: false, code: body?.code, message: body?.error ?? `HTTP ${response.status}` };
92
+ }
93
+ catch (error) {
94
+ return { ok: false, message: error instanceof Error ? error.message : String(error) };
95
+ }
96
+ }
97
+ /**
98
+ * Short label for an ARN, for messages.
99
+ *
100
+ * Role ARNs end with the session name and not the role
101
+ * (`assumed-role/MyRole/session-name`), so the role is the useful label; the
102
+ * session name is stripped.
103
+ */
104
+ export function shortIdentity(arn) {
105
+ if (arn.length === 0)
106
+ return 'unknown';
107
+ const resource = arn.split(':').at(-1) ?? arn;
108
+ const parts = resource.split('/').filter((part) => part.length > 0);
109
+ if (parts.length === 0)
110
+ return arn;
111
+ const [kind, name] = parts;
112
+ if ((kind === 'assumed-role' || kind === 'role' || kind === 'user') && name !== undefined)
113
+ return name;
114
+ return parts.at(-1) ?? arn;
115
+ }
116
+ /**
117
+ * Asks the app what the local DuckDB archive holds.
118
+ *
119
+ * The route always answers 200 (an unavailable archive is reported inside the
120
+ * payload), so a failure here means the app itself could not be reached. The CLI
121
+ * only prints the result: nothing about startup depends on it.
122
+ */
123
+ export async function readArchive(input) {
124
+ const { baseUrl, fetchImpl = fetch, timeoutMs = 5000 } = input;
125
+ try {
126
+ const response = await fetchImpl(new URL('/api/archive', baseUrl), {
127
+ signal: AbortSignal.timeout(timeoutMs),
128
+ });
129
+ if (!response.ok)
130
+ return { ok: false, message: `HTTP ${response.status}` };
131
+ return { ok: true, status: (await response.json()) };
132
+ }
133
+ catch (error) {
134
+ return { ok: false, message: error instanceof Error ? error.message : String(error) };
135
+ }
136
+ }
137
+ /** One line describing the archive for the startup banner. */
138
+ export function describeArchive(status) {
139
+ if (!status.available)
140
+ return `local history unavailable: ${status.error ?? 'unknown reason'}`;
141
+ const count = status.rows === 0
142
+ ? 'no events yet'
143
+ : `${status.rows.toLocaleString('en-US')} event${status.rows === 1 ? '' : 's'}`;
144
+ return `history ${count} at ${status.path}`;
145
+ }
package/dist/cli/ui.js CHANGED
@@ -6,14 +6,18 @@
6
6
  * falls back to plain lines, which also keeps the integration tests readable.
7
7
  */
8
8
  import { autocomplete, cancel, confirm, intro, isCancel, log, outro, spinner, } from '@clack/prompts';
9
- /** Decides whether the process can render animated output and ask questions. */
9
+ /**
10
+ * Decides whether the process can render animated output and ask questions.
11
+ *
12
+ * `NO_COLOR` is deliberately *not* consulted: it asks for no colour, which the
13
+ * prompt library honours on its own, and reading it as "do not prompt" silently
14
+ * disabled the login and profile questions for anyone who sets it.
15
+ */
10
16
  export function isInteractive(env = process.env) {
11
17
  if (env.CI !== undefined && env.CI !== '' && env.CI !== 'false')
12
18
  return false;
13
19
  if (env.WATCH_TAIL_PLAIN === '1')
14
20
  return false;
15
- if (env.NO_COLOR !== undefined && env.NO_COLOR !== '')
16
- return false;
17
21
  return process.stdout.isTTY === true && process.stdin.isTTY === true;
18
22
  }
19
23
  /**
@@ -185,7 +185,7 @@ const EMULATOR_CREDENTIALS = { accessKeyId: 'test', secretAccessKey: 'test' };
185
185
  * `AWS_DEFAULT_REGION`, which is how `--region` (or a region resolved by
186
186
  * {@link resolveRunRegion}) wins over the profile.
187
187
  */
188
- export function buildChildEnv({ base, profile = null, region = null, endpoint = null, clearStaticKeys = false, }) {
188
+ export function buildChildEnv({ base, profile = null, region = null, endpoint = null, clearStaticKeys = false, archive = null, }) {
189
189
  const env = { ...base };
190
190
  const name = normalize(profile);
191
191
  const emulator = normalize(endpoint);
@@ -213,6 +213,12 @@ export function buildChildEnv({ base, profile = null, region = null, endpoint =
213
213
  env.AWS_REGION = code;
214
214
  env.AWS_DEFAULT_REGION = code;
215
215
  }
216
+ if (archive !== null) {
217
+ // A blank value means "unset" to the server, so `--db` and `--no-archive`
218
+ // can each be expressed without removing the variable.
219
+ env.WATCH_STREAM_ARCHIVE = archive.enabled ? '' : 'off';
220
+ env.WATCH_STREAM_ARCHIVE_DB = archive.path ?? '';
221
+ }
216
222
  return env;
217
223
  }
218
224
  /**
@@ -286,10 +292,12 @@ export function isEmulatorEndpoint(endpoint) {
286
292
  * local emulator settings were neutralized for this run.
287
293
  */
288
294
  export function describeChildEnv(env) {
289
- return Object.keys(env)
290
- .filter((key) => key.startsWith('AWS_'))
295
+ return (Object.keys(env)
296
+ // `WATCH_STREAM_*` is part of the effective configuration too: a
297
+ // `--no-archive` or `--db` run is only reproducible if `--print` shows it.
298
+ .filter((key) => key.startsWith('AWS_') || key.startsWith('WATCH_STREAM_'))
291
299
  .toSorted(compareNames)
292
- .map((key) => `${key}=${env[key] ?? ''}`);
300
+ .map((key) => `${key}=${env[key] ?? ''}`));
293
301
  }
294
302
  /** Reads the shared AWS config file, or an empty string when it is missing. */
295
303
  export function readConfigText(env = process.env) {