watch-tail 0.8.0 → 0.10.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 (399) hide show
  1. package/README.md +107 -9
  2. package/build/client/_app/immutable/assets/0.B5hI3s8c.css +2 -0
  3. package/build/client/_app/immutable/assets/0.B5hI3s8c.css.br +0 -0
  4. package/build/client/_app/immutable/assets/0.B5hI3s8c.css.gz +0 -0
  5. package/build/client/_app/immutable/assets/2.Cn4w1JYv.css +1 -0
  6. package/build/client/_app/immutable/assets/2.Cn4w1JYv.css.br +0 -0
  7. package/build/client/_app/immutable/assets/2.Cn4w1JYv.css.gz +0 -0
  8. package/build/client/_app/immutable/assets/{EventScatter.CCk6ByS3.css → EventScatter.0BkgJO-l.css} +1 -1
  9. package/build/client/_app/immutable/assets/EventScatter.0BkgJO-l.css.br +0 -0
  10. package/build/client/_app/immutable/assets/EventScatter.0BkgJO-l.css.gz +0 -0
  11. package/build/client/_app/immutable/chunks/B2En4t_E.js +3 -0
  12. package/build/client/_app/immutable/chunks/B2En4t_E.js.br +0 -0
  13. package/build/client/_app/immutable/chunks/B2En4t_E.js.gz +0 -0
  14. package/build/client/_app/immutable/chunks/BJ7fEbY9.js +1 -0
  15. package/build/client/_app/immutable/chunks/BJ7fEbY9.js.br +0 -0
  16. package/build/client/_app/immutable/chunks/BJ7fEbY9.js.gz +0 -0
  17. package/build/client/_app/immutable/chunks/{BF1MBUT7.js → BX0v2q9h.js} +1 -1
  18. package/build/client/_app/immutable/chunks/BX0v2q9h.js.br +0 -0
  19. package/build/client/_app/immutable/chunks/BX0v2q9h.js.gz +0 -0
  20. package/build/client/_app/immutable/chunks/{9z7cmAWt.js → B_AZHMkI.js} +1 -1
  21. package/build/client/_app/immutable/chunks/B_AZHMkI.js.br +0 -0
  22. package/build/client/_app/immutable/chunks/B_AZHMkI.js.gz +0 -0
  23. package/build/client/_app/immutable/chunks/{BKpbhYu9.js → Bb9UOIo-.js} +1 -1
  24. package/build/client/_app/immutable/chunks/Bb9UOIo-.js.br +0 -0
  25. package/build/client/_app/immutable/chunks/Bb9UOIo-.js.gz +0 -0
  26. package/build/client/_app/immutable/chunks/{BzFqst10.js → BdV_pkVs.js} +1 -1
  27. package/build/client/_app/immutable/chunks/BdV_pkVs.js.br +0 -0
  28. package/build/client/_app/immutable/chunks/BdV_pkVs.js.gz +0 -0
  29. package/build/client/_app/immutable/chunks/{CBzF0p8K.js → BsrUsB47.js} +1 -1
  30. package/build/client/_app/immutable/chunks/BsrUsB47.js.br +0 -0
  31. package/build/client/_app/immutable/chunks/BsrUsB47.js.gz +0 -0
  32. package/build/client/_app/immutable/chunks/{Cr-NovV3.js → CBZpkDc1.js} +1 -1
  33. package/build/client/_app/immutable/chunks/CBZpkDc1.js.br +0 -0
  34. package/build/client/_app/immutable/chunks/CBZpkDc1.js.gz +0 -0
  35. package/build/client/_app/immutable/chunks/{X7CLxGgV.js → CHnbfiIG.js} +1 -1
  36. package/build/client/_app/immutable/chunks/CHnbfiIG.js.br +0 -0
  37. package/build/client/_app/immutable/chunks/CHnbfiIG.js.gz +0 -0
  38. package/build/client/_app/immutable/chunks/{BVlqiKgb.js → CNomy7CF.js} +1 -1
  39. package/build/client/_app/immutable/chunks/CNomy7CF.js.br +0 -0
  40. package/build/client/_app/immutable/chunks/CNomy7CF.js.gz +0 -0
  41. package/build/client/_app/immutable/chunks/CPbNf3ya.js +1 -0
  42. package/build/client/_app/immutable/chunks/CPbNf3ya.js.br +0 -0
  43. package/build/client/_app/immutable/chunks/CPbNf3ya.js.gz +0 -0
  44. package/build/client/_app/immutable/chunks/CZ2PC-zH.js +1 -0
  45. package/build/client/_app/immutable/chunks/CZ2PC-zH.js.br +0 -0
  46. package/build/client/_app/immutable/chunks/CZ2PC-zH.js.gz +0 -0
  47. package/build/client/_app/immutable/chunks/CljxK204.js +1 -0
  48. package/build/client/_app/immutable/chunks/CljxK204.js.br +1 -0
  49. package/build/client/_app/immutable/chunks/CljxK204.js.gz +0 -0
  50. package/build/client/_app/immutable/chunks/CzU0cUz4.js +1 -0
  51. package/build/client/_app/immutable/chunks/CzU0cUz4.js.br +0 -0
  52. package/build/client/_app/immutable/chunks/CzU0cUz4.js.gz +0 -0
  53. package/build/client/_app/immutable/chunks/{cK-f5ch_.js → D6vIi1r5.js} +1 -1
  54. package/build/client/_app/immutable/chunks/D6vIi1r5.js.br +3 -0
  55. package/build/client/_app/immutable/chunks/D6vIi1r5.js.gz +0 -0
  56. package/build/client/_app/immutable/chunks/DAxERhtN.js +1 -0
  57. package/build/client/_app/immutable/chunks/DAxERhtN.js.br +0 -0
  58. package/build/client/_app/immutable/chunks/DAxERhtN.js.gz +0 -0
  59. package/build/client/_app/immutable/chunks/DIzgJaYS.js +1 -0
  60. package/build/client/_app/immutable/chunks/DIzgJaYS.js.br +0 -0
  61. package/build/client/_app/immutable/chunks/DIzgJaYS.js.gz +0 -0
  62. package/build/client/_app/immutable/chunks/DSHrbzz3.js +1 -0
  63. package/build/client/_app/immutable/chunks/DSHrbzz3.js.br +0 -0
  64. package/build/client/_app/immutable/chunks/DSHrbzz3.js.gz +0 -0
  65. package/build/client/_app/immutable/chunks/{DBcd9YbV.js → DSvLImpl.js} +1 -1
  66. package/build/client/_app/immutable/chunks/DSvLImpl.js.br +0 -0
  67. package/build/client/_app/immutable/chunks/DSvLImpl.js.gz +0 -0
  68. package/build/client/_app/immutable/chunks/{vB0ff9Sn.js → DWBod19x.js} +1 -1
  69. package/build/client/_app/immutable/chunks/DWBod19x.js.br +0 -0
  70. package/build/client/_app/immutable/chunks/DWBod19x.js.gz +0 -0
  71. package/build/client/_app/immutable/chunks/{BWGaSL1l.js → Dicxo5h-.js} +1 -1
  72. package/build/client/_app/immutable/chunks/Dicxo5h-.js.br +0 -0
  73. package/build/client/_app/immutable/chunks/Dicxo5h-.js.gz +0 -0
  74. package/build/client/_app/immutable/chunks/DjjHmSG3.js +1 -0
  75. package/build/client/_app/immutable/chunks/DjjHmSG3.js.br +0 -0
  76. package/build/client/_app/immutable/chunks/DjjHmSG3.js.gz +0 -0
  77. package/build/client/_app/immutable/chunks/DlDLXtam.js +1 -0
  78. package/build/client/_app/immutable/chunks/DlDLXtam.js.br +0 -0
  79. package/build/client/_app/immutable/chunks/DlDLXtam.js.gz +0 -0
  80. package/build/client/_app/immutable/chunks/EZJqWoh3.js +1 -0
  81. package/build/client/_app/immutable/chunks/EZJqWoh3.js.br +0 -0
  82. package/build/client/_app/immutable/chunks/EZJqWoh3.js.gz +0 -0
  83. package/build/client/_app/immutable/chunks/Fg8W5tkO.js +15 -0
  84. package/build/client/_app/immutable/chunks/Fg8W5tkO.js.br +0 -0
  85. package/build/client/_app/immutable/chunks/Fg8W5tkO.js.gz +0 -0
  86. package/build/client/_app/immutable/chunks/LGzrUxfF.js +1 -0
  87. package/build/client/_app/immutable/chunks/LGzrUxfF.js.br +0 -0
  88. package/build/client/_app/immutable/chunks/LGzrUxfF.js.gz +0 -0
  89. package/build/client/_app/immutable/chunks/McME9wI6.js +10 -0
  90. package/build/client/_app/immutable/chunks/McME9wI6.js.br +0 -0
  91. package/build/client/_app/immutable/chunks/McME9wI6.js.gz +0 -0
  92. package/build/client/_app/immutable/chunks/N78Fm5Ux.js +1 -0
  93. package/build/client/_app/immutable/chunks/N78Fm5Ux.js.br +0 -0
  94. package/build/client/_app/immutable/chunks/N78Fm5Ux.js.gz +0 -0
  95. package/build/client/_app/immutable/chunks/{B_Z4tBMl.js → XrAcf7YH.js} +1 -1
  96. package/build/client/_app/immutable/chunks/XrAcf7YH.js.br +0 -0
  97. package/build/client/_app/immutable/chunks/XrAcf7YH.js.gz +0 -0
  98. package/build/client/_app/immutable/chunks/{CM9QBz5w.js → _PJhUOmT.js} +1 -1
  99. package/build/client/_app/immutable/chunks/_PJhUOmT.js.br +0 -0
  100. package/build/client/_app/immutable/chunks/_PJhUOmT.js.gz +0 -0
  101. package/build/client/_app/immutable/chunks/gXyWwJbW.js +1 -0
  102. package/build/client/_app/immutable/chunks/gXyWwJbW.js.br +0 -0
  103. package/build/client/_app/immutable/chunks/gXyWwJbW.js.gz +0 -0
  104. package/build/client/_app/immutable/chunks/{B5kJ4QGS.js → vMHl7jRw.js} +1 -1
  105. package/build/client/_app/immutable/chunks/vMHl7jRw.js.br +0 -0
  106. package/build/client/_app/immutable/chunks/vMHl7jRw.js.gz +0 -0
  107. package/build/client/_app/immutable/chunks/xJTjOoUQ.js +2 -0
  108. package/build/client/_app/immutable/chunks/xJTjOoUQ.js.br +0 -0
  109. package/build/client/_app/immutable/chunks/xJTjOoUQ.js.gz +0 -0
  110. package/build/client/_app/immutable/entry/app.ycJtqzGh.js +2 -0
  111. package/build/client/_app/immutable/entry/app.ycJtqzGh.js.br +0 -0
  112. package/build/client/_app/immutable/entry/app.ycJtqzGh.js.gz +0 -0
  113. package/build/client/_app/immutable/entry/start.DOq0-PiA.js +1 -0
  114. package/build/client/_app/immutable/entry/start.DOq0-PiA.js.br +0 -0
  115. package/build/client/_app/immutable/entry/start.DOq0-PiA.js.gz +0 -0
  116. package/build/client/_app/immutable/nodes/0.D63E8Q6i.js +1 -0
  117. package/build/client/_app/immutable/nodes/0.D63E8Q6i.js.br +0 -0
  118. package/build/client/_app/immutable/nodes/0.D63E8Q6i.js.gz +0 -0
  119. package/build/client/_app/immutable/nodes/1.B63I-h1v.js +1 -0
  120. package/build/client/_app/immutable/nodes/1.B63I-h1v.js.br +0 -0
  121. package/build/client/_app/immutable/nodes/1.B63I-h1v.js.gz +0 -0
  122. package/build/client/_app/immutable/nodes/2.DXy8PMWZ.js +5 -0
  123. package/build/client/_app/immutable/nodes/2.DXy8PMWZ.js.br +0 -0
  124. package/build/client/_app/immutable/nodes/2.DXy8PMWZ.js.gz +0 -0
  125. package/build/client/_app/version.json +1 -1
  126. package/build/client/_app/version.json.br +0 -0
  127. package/build/client/_app/version.json.gz +0 -0
  128. package/build/handler.js +7 -7
  129. package/build/index.js +7 -7
  130. package/build/server/chunks/chunks/{Arc.canvas.js-D6g58nSp.js → Arc.canvas.js-DqfSjlnB.js} +8 -8
  131. package/build/server/chunks/chunks/Arc.canvas.js-DqfSjlnB.js.map +1 -0
  132. package/build/server/chunks/chunks/{Arc.js-D78Cf_4M.js → Arc.js-DNywwEq7.js} +10 -10
  133. package/build/server/chunks/chunks/Arc.js-DNywwEq7.js.map +1 -0
  134. package/build/server/chunks/chunks/{Bar.js-Cv73T8_D.js → Bar.js-BHJrwOa1.js} +14 -14
  135. package/build/server/chunks/chunks/Bar.js-BHJrwOa1.js.map +1 -0
  136. package/build/server/chunks/chunks/{ChartAnnotations.js-Ci22VB_6.js → ChartAnnotations.js-DXt38zkt.js} +18 -18
  137. package/build/server/chunks/chunks/ChartAnnotations.js-DXt38zkt.js.map +1 -0
  138. package/build/server/chunks/chunks/{Circle.html.js-BjwyNRG3.js → Circle.html.js-KngSXZUe.js} +5 -5
  139. package/build/server/chunks/chunks/Circle.html.js-KngSXZUe.js.map +1 -0
  140. package/build/server/chunks/chunks/{ClipPath.canvas.js-CFTBDWVU.js → ClipPath.canvas.js-BsGsfzQK.js} +4 -4
  141. package/build/server/chunks/chunks/ClipPath.canvas.js-BsGsfzQK.js.map +1 -0
  142. package/build/server/chunks/chunks/{DefaultTooltip.js-0r5rbE-1.js → DefaultTooltip.js-CbyljZUi.js} +8 -8
  143. package/build/server/chunks/chunks/DefaultTooltip.js-CbyljZUi.js.map +1 -0
  144. package/build/server/chunks/chunks/{EventScatter.js-CG0RcOU6.js → EventScatter.js-DHlLEn_7.js} +39 -38
  145. package/build/server/chunks/chunks/EventScatter.js-DHlLEn_7.js.map +1 -0
  146. package/build/server/chunks/chunks/{Labels.js-DpagpV6d.js → Labels.js-DhpbhJmV.js} +18 -18
  147. package/build/server/chunks/chunks/Labels.js-DhpbhJmV.js.map +1 -0
  148. package/build/server/chunks/chunks/{Legend.js-BOpwpe5s.js → Legend.js-D25j2DRt.js} +6 -6
  149. package/build/server/chunks/chunks/Legend.js-D25j2DRt.js.map +1 -0
  150. package/build/server/chunks/chunks/{Line.html.js-BM5tR11G.js → Line.html.js-CKb2T7JC.js} +6 -6
  151. package/build/server/chunks/chunks/Line.html.js-CKb2T7JC.js.map +1 -0
  152. package/build/server/chunks/chunks/{Link.canvas.js-P8ySzEAw.js → Link.canvas.js-c0r05107.js} +9 -9
  153. package/build/server/chunks/chunks/Link.canvas.js-c0r05107.js.map +1 -0
  154. package/build/server/chunks/chunks/{Path.canvas.js-DNAtnEBt.js → Path.canvas.js-opfoYzQB.js} +5 -5
  155. package/build/server/chunks/chunks/Path.canvas.js-opfoYzQB.js.map +1 -0
  156. package/build/server/chunks/chunks/{Points.html.js-CLbHD6OP.js → Points.html.js-CJ75UtkE.js} +7 -7
  157. package/build/server/chunks/chunks/Points.html.js-CJ75UtkE.js.map +1 -0
  158. package/build/server/chunks/chunks/Points.js-Bx_vB0po.js +14 -0
  159. package/build/server/chunks/chunks/Points.js-Bx_vB0po.js.map +1 -0
  160. package/build/server/chunks/chunks/{Points2.js-BMGdkzTE.js → Points2.js-Br2MMKbn.js} +4 -4
  161. package/build/server/chunks/chunks/Points2.js-Br2MMKbn.js.map +1 -0
  162. package/build/server/chunks/chunks/{Rect.html.js-Q3UvRwNn.js → Rect.html.js-D_-JSZ22.js} +6 -6
  163. package/build/server/chunks/chunks/Rect.html.js-D_-JSZ22.js.map +1 -0
  164. package/build/server/chunks/chunks/{Spline.js-BuZPz2PJ.js → Spline.js-DpD4175j.js} +12 -12
  165. package/build/server/chunks/chunks/Spline.js-DpD4175j.js.map +1 -0
  166. package/build/server/chunks/chunks/{Text.html.js-C8xO5Nz6.js → Text.html.js-Clxo39Ky.js} +6 -6
  167. package/build/server/chunks/chunks/Text.html.js-Clxo39Ky.js.map +1 -0
  168. package/build/server/chunks/chunks/{TooltipItem.js-T0cKLjLu.js → TooltipItem.js-CgYSF3I3.js} +6 -6
  169. package/build/server/chunks/chunks/{TooltipItem.js-T0cKLjLu.js.map → TooltipItem.js-CgYSF3I3.js.map} +1 -1
  170. package/build/server/chunks/chunks/{Voronoi.js-DevTsXQE.js → Voronoi.js-CX8bqc1A.js} +7 -7
  171. package/build/server/chunks/chunks/Voronoi.js-CX8bqc1A.js.map +1 -0
  172. package/build/server/chunks/chunks/{archive.js-D2jtMmDo.js → archive.js-BRlkdj2X.js} +331 -30
  173. package/build/server/chunks/chunks/archive.js-BRlkdj2X.js.map +1 -0
  174. package/build/server/chunks/chunks/{attributes.js-BVWo7wbg.js → attributes.js-ECgqVV_7.js} +2 -2
  175. package/build/server/chunks/chunks/{attributes.js-BVWo7wbg.js.map → attributes.js-ECgqVV_7.js.map} +1 -1
  176. package/build/server/chunks/chunks/{band.js-C7izXphE.js → band.js-BcI84M0Z.js} +3 -3
  177. package/build/server/chunks/chunks/{band.js-C7izXphE.js.map → band.js-BcI84M0Z.js.map} +1 -1
  178. package/build/server/chunks/chunks/{common.js-BWQB8Die.js → common.js-DeZxUyRN.js} +2 -2
  179. package/build/server/chunks/chunks/{common.js-BWQB8Die.js.map → common.js-DeZxUyRN.js.map} +1 -1
  180. package/build/server/chunks/chunks/events.js-oxLu7lhH.js +95 -0
  181. package/build/server/chunks/chunks/events.js-oxLu7lhH.js.map +1 -0
  182. package/build/server/chunks/chunks/{group.js-DBFzWAox.js → group.js-C8H9Tpr6.js} +2 -2
  183. package/build/server/chunks/chunks/{group.js-DBFzWAox.js.map → group.js-C8H9Tpr6.js.map} +1 -1
  184. package/build/server/chunks/chunks/{server.js-CAEBuMIH.js → index-server.js-Dsi44azJ.js} +245 -4
  185. package/build/server/chunks/chunks/index-server.js-Dsi44azJ.js.map +1 -0
  186. package/build/server/chunks/chunks/{internal2.js-BMcEVxqN.js → internal2.js-Dm0TlpeP.js} +5 -5
  187. package/build/server/chunks/chunks/internal2.js-Dm0TlpeP.js.map +1 -0
  188. package/build/server/chunks/chunks/{key.svelte.js-CWIvXc6L.js → key.svelte.js-C9G4pBhE.js} +4 -4
  189. package/build/server/chunks/chunks/key.svelte.js-C9G4pBhE.js.map +1 -0
  190. package/build/server/chunks/chunks/{legacy-client.js-DJmDw3Zx.js → legacy-client.js-C8Upo6IB.js} +3 -3
  191. package/build/server/chunks/chunks/legacy-client.js-C8Upo6IB.js.map +1 -0
  192. package/build/server/chunks/chunks/{level-filter.js-D9MNrew3.js → level-filter.js-H0nc-2BG.js} +2 -2
  193. package/build/server/chunks/chunks/{level-filter.js-D9MNrew3.js.map → level-filter.js-H0nc-2BG.js.map} +1 -1
  194. package/build/server/chunks/chunks/{lineRadial.js-Dm0GMqo3.js → lineRadial.js-B0m9ujVX.js} +2 -2
  195. package/build/server/chunks/chunks/{lineRadial.js-Dm0GMqo3.js.map → lineRadial.js-B0m9ujVX.js.map} +1 -1
  196. package/build/server/chunks/chunks/{linear.js-CTOKrHn9.js → linear.js-CJ07spu6.js} +2 -2
  197. package/build/server/chunks/chunks/{linear.js-CTOKrHn9.js.map → linear.js-CJ07spu6.js.map} +1 -1
  198. package/build/server/chunks/chunks/{motion.svelte.js-DCHSFMu-.js → motion.svelte.js-DB7vkWmD.js} +3 -3
  199. package/build/server/chunks/chunks/motion.svelte.js-DB7vkWmD.js.map +1 -0
  200. package/build/server/chunks/chunks/{occlusion.js-DJ-AdK9u.js → occlusion.js-DtcqoJjc.js} +2 -2
  201. package/build/server/chunks/chunks/{occlusion.js-DJ-AdK9u.js.map → occlusion.js-DtcqoJjc.js.map} +1 -1
  202. package/build/server/chunks/chunks/{path2.js-pquT2Kg6.js → path2.js-B3tNByoS.js} +2 -2
  203. package/build/server/chunks/chunks/{path2.js-pquT2Kg6.js.map → path2.js-B3tNByoS.js.map} +1 -1
  204. package/build/server/chunks/chunks/{rect.svelte.js-zeS7FWjB.js → rect.svelte.js-C6R1SgCx.js} +4 -4
  205. package/build/server/chunks/chunks/rect.svelte.js-C6R1SgCx.js.map +1 -0
  206. package/build/server/chunks/chunks/{scales.svelte.js-D_1popPi.js → scales.svelte.js-C4lRvUAb.js} +4 -4
  207. package/build/server/chunks/chunks/scales.svelte.js-C4lRvUAb.js.map +1 -0
  208. package/build/server/chunks/chunks/{series-buckets.js-DFGWkob5.js → series-buckets.js-C-vMEJT2.js} +6 -6
  209. package/build/server/chunks/chunks/series-buckets.js-C-vMEJT2.js.map +1 -0
  210. package/build/server/chunks/chunks/{state.js-vZj9lo1I.js → state.js-qsHzjuJU.js} +3 -4
  211. package/build/server/chunks/chunks/state.js-qsHzjuJU.js.map +1 -0
  212. package/build/server/chunks/chunks/text-size.svelte.js-CqGaHRr3.js +310 -0
  213. package/build/server/chunks/chunks/text-size.svelte.js-CqGaHRr3.js.map +1 -0
  214. package/build/server/chunks/chunks/{time-range.js-BLMT8aU3.js → time-range.js-__87ZPq6.js} +10 -5
  215. package/build/server/chunks/chunks/time-range.js-__87ZPq6.js.map +1 -0
  216. package/build/server/chunks/entries/endpoints/api/archive/{_server.ts.js-C4hWyXuu.js → _server.ts.js-C6WY-ljy.js} +2 -2
  217. package/build/server/chunks/entries/endpoints/api/archive/{_server.ts.js-C4hWyXuu.js.map → _server.ts.js-C6WY-ljy.js.map} +1 -1
  218. package/build/server/chunks/entries/endpoints/api/log-groups/{_server.ts.js-D4y43Vwe.js → _server.ts.js-DTcVSbpV.js} +2 -2
  219. package/build/server/chunks/entries/endpoints/api/log-groups/{_server.ts.js-D4y43Vwe.js.map → _server.ts.js-DTcVSbpV.js.map} +1 -1
  220. package/build/server/chunks/entries/endpoints/api/series/{_server.ts.js-DibT3Hjc.js → _server.ts.js-CzJ_bXh8.js} +4 -4
  221. package/build/server/chunks/entries/endpoints/api/series/{_server.ts.js-DibT3Hjc.js.map → _server.ts.js-CzJ_bXh8.js.map} +1 -1
  222. package/build/server/chunks/entries/endpoints/api/stream/{_server.ts.js-BxXw5K0R.js → _server.ts.js-U2naV16N.js} +211 -48
  223. package/build/server/chunks/entries/endpoints/api/stream/_server.ts.js-U2naV16N.js.map +1 -0
  224. package/build/server/chunks/entries/fallbacks/{error.svelte.js-bokc4skC.js → error.svelte.js-ClTGKP0-.js} +6 -6
  225. package/build/server/chunks/entries/fallbacks/error.svelte.js-ClTGKP0-.js.map +1 -0
  226. package/build/server/chunks/entries/pages/_layout.svelte.js-DNuWb03K.js +622 -0
  227. package/build/server/chunks/entries/pages/_layout.svelte.js-DNuWb03K.js.map +1 -0
  228. package/build/server/chunks/entries/pages/{_page.svelte.js-DRoSEPVH.js → _page.svelte.js-CVlL2UsO.js} +341 -175
  229. package/build/server/chunks/entries/pages/_page.svelte.js-CVlL2UsO.js.map +1 -0
  230. package/build/server/chunks/{handler-BkYErjbr.js → handler-CrpvMheE.js} +3 -3
  231. package/build/server/chunks/{handler-BkYErjbr.js.map → handler-CrpvMheE.js.map} +1 -1
  232. package/build/server/chunks/{index.js-5mkIDcpy.js → index.js-9Dk7Q13E.js} +3 -4
  233. package/build/server/chunks/index.js-9Dk7Q13E.js.map +1 -0
  234. package/build/server/chunks/{manifest.js-BGoS-vRx.js → manifest.js-DIaODzKX.js} +9 -9
  235. package/build/server/chunks/{manifest.js-BGoS-vRx.js.map → manifest.js-DIaODzKX.js.map} +1 -1
  236. package/build/server/chunks/nodes/0.js-CQ960AOW.js +9 -0
  237. package/build/server/chunks/nodes/0.js-CQ960AOW.js.map +1 -0
  238. package/build/server/chunks/nodes/1.js-CtTei4sV.js +9 -0
  239. package/build/server/chunks/nodes/{1.js-BQibx33b.js.map → 1.js-CtTei4sV.js.map} +1 -1
  240. package/build/server/chunks/nodes/2.js-BbKDb_M6.js +9 -0
  241. package/build/server/chunks/nodes/2.js-BbKDb_M6.js.map +1 -0
  242. package/dist/cli/completions.js +24 -0
  243. package/dist/cli/index.js +144 -3
  244. package/dist/cli/mcp/agents.js +344 -0
  245. package/dist/cli/mcp/backend.js +235 -0
  246. package/dist/cli/mcp/run.js +245 -0
  247. package/dist/cli/mcp/stdio.js +103 -0
  248. package/dist/cli/mcp/tools.js +245 -0
  249. package/dist/cli/options.js +138 -25
  250. package/dist/cli/server.js +28 -0
  251. package/dist/cli/ui.js +20 -1
  252. package/dist/lib/time-range.js +14 -3
  253. package/package.json +8 -2
  254. package/build/client/_app/immutable/assets/0.zDk3x0WE.css +0 -2
  255. package/build/client/_app/immutable/assets/0.zDk3x0WE.css.br +0 -0
  256. package/build/client/_app/immutable/assets/0.zDk3x0WE.css.gz +0 -0
  257. package/build/client/_app/immutable/assets/EventScatter.CCk6ByS3.css.br +0 -0
  258. package/build/client/_app/immutable/assets/EventScatter.CCk6ByS3.css.gz +0 -0
  259. package/build/client/_app/immutable/chunks/9z7cmAWt.js.br +0 -0
  260. package/build/client/_app/immutable/chunks/9z7cmAWt.js.gz +0 -0
  261. package/build/client/_app/immutable/chunks/B26Z2DQX.js +0 -1
  262. package/build/client/_app/immutable/chunks/B26Z2DQX.js.br +0 -0
  263. package/build/client/_app/immutable/chunks/B26Z2DQX.js.gz +0 -0
  264. package/build/client/_app/immutable/chunks/B5kJ4QGS.js.br +0 -0
  265. package/build/client/_app/immutable/chunks/B5kJ4QGS.js.gz +0 -0
  266. package/build/client/_app/immutable/chunks/BF1MBUT7.js.br +0 -0
  267. package/build/client/_app/immutable/chunks/BF1MBUT7.js.gz +0 -0
  268. package/build/client/_app/immutable/chunks/BJEa1AAY.js +0 -10
  269. package/build/client/_app/immutable/chunks/BJEa1AAY.js.br +0 -0
  270. package/build/client/_app/immutable/chunks/BJEa1AAY.js.gz +0 -0
  271. package/build/client/_app/immutable/chunks/BKpbhYu9.js.br +0 -0
  272. package/build/client/_app/immutable/chunks/BKpbhYu9.js.gz +0 -0
  273. package/build/client/_app/immutable/chunks/BVlqiKgb.js.br +0 -0
  274. package/build/client/_app/immutable/chunks/BVlqiKgb.js.gz +0 -0
  275. package/build/client/_app/immutable/chunks/BWGaSL1l.js.br +0 -0
  276. package/build/client/_app/immutable/chunks/BWGaSL1l.js.gz +0 -0
  277. package/build/client/_app/immutable/chunks/B_Z4tBMl.js.br +0 -0
  278. package/build/client/_app/immutable/chunks/B_Z4tBMl.js.gz +0 -0
  279. package/build/client/_app/immutable/chunks/Bo46v6NJ.js +0 -1
  280. package/build/client/_app/immutable/chunks/Bo46v6NJ.js.br +0 -0
  281. package/build/client/_app/immutable/chunks/Bo46v6NJ.js.gz +0 -0
  282. package/build/client/_app/immutable/chunks/BpDPh_kG.js +0 -1
  283. package/build/client/_app/immutable/chunks/BpDPh_kG.js.br +0 -0
  284. package/build/client/_app/immutable/chunks/BpDPh_kG.js.gz +0 -0
  285. package/build/client/_app/immutable/chunks/BzFqst10.js.br +0 -0
  286. package/build/client/_app/immutable/chunks/BzFqst10.js.gz +0 -0
  287. package/build/client/_app/immutable/chunks/C3JYac4u.js +0 -1
  288. package/build/client/_app/immutable/chunks/C3JYac4u.js.br +0 -0
  289. package/build/client/_app/immutable/chunks/C3JYac4u.js.gz +0 -0
  290. package/build/client/_app/immutable/chunks/CBzF0p8K.js.br +0 -0
  291. package/build/client/_app/immutable/chunks/CBzF0p8K.js.gz +0 -0
  292. package/build/client/_app/immutable/chunks/CM9QBz5w.js.br +0 -0
  293. package/build/client/_app/immutable/chunks/CM9QBz5w.js.gz +0 -0
  294. package/build/client/_app/immutable/chunks/CZqQKfBo.js +0 -15
  295. package/build/client/_app/immutable/chunks/CZqQKfBo.js.br +0 -0
  296. package/build/client/_app/immutable/chunks/CZqQKfBo.js.gz +0 -0
  297. package/build/client/_app/immutable/chunks/Cr-NovV3.js.br +0 -0
  298. package/build/client/_app/immutable/chunks/Cr-NovV3.js.gz +0 -0
  299. package/build/client/_app/immutable/chunks/Cz6pnyFa.js +0 -1
  300. package/build/client/_app/immutable/chunks/Cz6pnyFa.js.br +0 -0
  301. package/build/client/_app/immutable/chunks/Cz6pnyFa.js.gz +0 -0
  302. package/build/client/_app/immutable/chunks/D2fsDTN5.js +0 -1
  303. package/build/client/_app/immutable/chunks/D2fsDTN5.js.br +0 -0
  304. package/build/client/_app/immutable/chunks/D2fsDTN5.js.gz +0 -0
  305. package/build/client/_app/immutable/chunks/DBcd9YbV.js.br +0 -0
  306. package/build/client/_app/immutable/chunks/DBcd9YbV.js.gz +0 -0
  307. package/build/client/_app/immutable/chunks/DC_milOQ.js +0 -1
  308. package/build/client/_app/immutable/chunks/DC_milOQ.js.br +0 -0
  309. package/build/client/_app/immutable/chunks/DC_milOQ.js.gz +0 -0
  310. package/build/client/_app/immutable/chunks/DNiEIfDZ.js +0 -1
  311. package/build/client/_app/immutable/chunks/DNiEIfDZ.js.br +0 -0
  312. package/build/client/_app/immutable/chunks/DNiEIfDZ.js.gz +0 -0
  313. package/build/client/_app/immutable/chunks/DWdskt_Y.js +0 -2
  314. package/build/client/_app/immutable/chunks/DWdskt_Y.js.br +0 -0
  315. package/build/client/_app/immutable/chunks/DWdskt_Y.js.gz +0 -0
  316. package/build/client/_app/immutable/chunks/DsMQ6HVM.js +0 -1
  317. package/build/client/_app/immutable/chunks/DsMQ6HVM.js.br +0 -0
  318. package/build/client/_app/immutable/chunks/DsMQ6HVM.js.gz +0 -0
  319. package/build/client/_app/immutable/chunks/Dxeyu30B.js +0 -1
  320. package/build/client/_app/immutable/chunks/Dxeyu30B.js.br +0 -1
  321. package/build/client/_app/immutable/chunks/Dxeyu30B.js.gz +0 -0
  322. package/build/client/_app/immutable/chunks/H4Anb6kP.js +0 -1
  323. package/build/client/_app/immutable/chunks/H4Anb6kP.js.br +0 -0
  324. package/build/client/_app/immutable/chunks/H4Anb6kP.js.gz +0 -0
  325. package/build/client/_app/immutable/chunks/MDK8mPOo.js +0 -1
  326. package/build/client/_app/immutable/chunks/MDK8mPOo.js.br +0 -0
  327. package/build/client/_app/immutable/chunks/MDK8mPOo.js.gz +0 -0
  328. package/build/client/_app/immutable/chunks/X7CLxGgV.js.br +0 -0
  329. package/build/client/_app/immutable/chunks/X7CLxGgV.js.gz +0 -0
  330. package/build/client/_app/immutable/chunks/cK-f5ch_.js.br +0 -2
  331. package/build/client/_app/immutable/chunks/cK-f5ch_.js.gz +0 -0
  332. package/build/client/_app/immutable/chunks/mhYP0ygJ.js +0 -1
  333. package/build/client/_app/immutable/chunks/mhYP0ygJ.js.br +0 -0
  334. package/build/client/_app/immutable/chunks/mhYP0ygJ.js.gz +0 -0
  335. package/build/client/_app/immutable/chunks/pqiPC7Y8.js +0 -3
  336. package/build/client/_app/immutable/chunks/pqiPC7Y8.js.br +0 -0
  337. package/build/client/_app/immutable/chunks/pqiPC7Y8.js.gz +0 -0
  338. package/build/client/_app/immutable/chunks/vB0ff9Sn.js.br +0 -0
  339. package/build/client/_app/immutable/chunks/vB0ff9Sn.js.gz +0 -0
  340. package/build/client/_app/immutable/entry/app.CinEZGkq.js +0 -2
  341. package/build/client/_app/immutable/entry/app.CinEZGkq.js.br +0 -0
  342. package/build/client/_app/immutable/entry/app.CinEZGkq.js.gz +0 -0
  343. package/build/client/_app/immutable/entry/start.B7e0-3Hk.js +0 -1
  344. package/build/client/_app/immutable/entry/start.B7e0-3Hk.js.br +0 -1
  345. package/build/client/_app/immutable/entry/start.B7e0-3Hk.js.gz +0 -0
  346. package/build/client/_app/immutable/nodes/0.CFO0Fthy.js +0 -1
  347. package/build/client/_app/immutable/nodes/0.CFO0Fthy.js.br +0 -0
  348. package/build/client/_app/immutable/nodes/0.CFO0Fthy.js.gz +0 -0
  349. package/build/client/_app/immutable/nodes/1.kGO9dV9J.js +0 -1
  350. package/build/client/_app/immutable/nodes/1.kGO9dV9J.js.br +0 -0
  351. package/build/client/_app/immutable/nodes/1.kGO9dV9J.js.gz +0 -0
  352. package/build/client/_app/immutable/nodes/2.eGSziRQX.js +0 -5
  353. package/build/client/_app/immutable/nodes/2.eGSziRQX.js.br +0 -0
  354. package/build/client/_app/immutable/nodes/2.eGSziRQX.js.gz +0 -0
  355. package/build/server/chunks/chunks/Arc.canvas.js-D6g58nSp.js.map +0 -1
  356. package/build/server/chunks/chunks/Arc.js-D78Cf_4M.js.map +0 -1
  357. package/build/server/chunks/chunks/Bar.js-Cv73T8_D.js.map +0 -1
  358. package/build/server/chunks/chunks/ChartAnnotations.js-Ci22VB_6.js.map +0 -1
  359. package/build/server/chunks/chunks/Circle.html.js-BjwyNRG3.js.map +0 -1
  360. package/build/server/chunks/chunks/ClipPath.canvas.js-CFTBDWVU.js.map +0 -1
  361. package/build/server/chunks/chunks/DefaultTooltip.js-0r5rbE-1.js.map +0 -1
  362. package/build/server/chunks/chunks/EventScatter.js-CG0RcOU6.js.map +0 -1
  363. package/build/server/chunks/chunks/Labels.js-DpagpV6d.js.map +0 -1
  364. package/build/server/chunks/chunks/Legend.js-BOpwpe5s.js.map +0 -1
  365. package/build/server/chunks/chunks/Line.html.js-BM5tR11G.js.map +0 -1
  366. package/build/server/chunks/chunks/Link.canvas.js-P8ySzEAw.js.map +0 -1
  367. package/build/server/chunks/chunks/Path.canvas.js-DNAtnEBt.js.map +0 -1
  368. package/build/server/chunks/chunks/Points.html.js-CLbHD6OP.js.map +0 -1
  369. package/build/server/chunks/chunks/Points.js-e6g0Re6H.js +0 -14
  370. package/build/server/chunks/chunks/Points.js-e6g0Re6H.js.map +0 -1
  371. package/build/server/chunks/chunks/Points2.js-BMGdkzTE.js.map +0 -1
  372. package/build/server/chunks/chunks/Rect.html.js-Q3UvRwNn.js.map +0 -1
  373. package/build/server/chunks/chunks/Spline.js-BuZPz2PJ.js.map +0 -1
  374. package/build/server/chunks/chunks/Text.html.js-C8xO5Nz6.js.map +0 -1
  375. package/build/server/chunks/chunks/Voronoi.js-DevTsXQE.js.map +0 -1
  376. package/build/server/chunks/chunks/archive.js-D2jtMmDo.js.map +0 -1
  377. package/build/server/chunks/chunks/index-server.js-DNLOKvM0.js +0 -248
  378. package/build/server/chunks/chunks/index-server.js-DNLOKvM0.js.map +0 -1
  379. package/build/server/chunks/chunks/internal2.js-BMcEVxqN.js.map +0 -1
  380. package/build/server/chunks/chunks/key.svelte.js-CWIvXc6L.js.map +0 -1
  381. package/build/server/chunks/chunks/legacy-client.js-DJmDw3Zx.js.map +0 -1
  382. package/build/server/chunks/chunks/motion.svelte.js-DCHSFMu-.js.map +0 -1
  383. package/build/server/chunks/chunks/rect.svelte.js-zeS7FWjB.js.map +0 -1
  384. package/build/server/chunks/chunks/scales.svelte.js-D_1popPi.js.map +0 -1
  385. package/build/server/chunks/chunks/series-buckets.js-DFGWkob5.js.map +0 -1
  386. package/build/server/chunks/chunks/server.js-CAEBuMIH.js.map +0 -1
  387. package/build/server/chunks/chunks/state.js-vZj9lo1I.js.map +0 -1
  388. package/build/server/chunks/chunks/time-range.js-BLMT8aU3.js.map +0 -1
  389. package/build/server/chunks/entries/endpoints/api/stream/_server.ts.js-BxXw5K0R.js.map +0 -1
  390. package/build/server/chunks/entries/fallbacks/error.svelte.js-bokc4skC.js.map +0 -1
  391. package/build/server/chunks/entries/pages/_layout.svelte.js-8U7ZeKYO.js +0 -22
  392. package/build/server/chunks/entries/pages/_layout.svelte.js-8U7ZeKYO.js.map +0 -1
  393. package/build/server/chunks/entries/pages/_page.svelte.js-DRoSEPVH.js.map +0 -1
  394. package/build/server/chunks/index.js-5mkIDcpy.js.map +0 -1
  395. package/build/server/chunks/nodes/0.js-BIj6k30n.js +0 -9
  396. package/build/server/chunks/nodes/0.js-BIj6k30n.js.map +0 -1
  397. package/build/server/chunks/nodes/1.js-BQibx33b.js +0 -9
  398. package/build/server/chunks/nodes/2.js-CczDSPv9.js +0 -9
  399. package/build/server/chunks/nodes/2.js-CczDSPv9.js.map +0 -1
@@ -0,0 +1,245 @@
1
+ /**
2
+ * Orchestration for the two MCP entry points.
3
+ *
4
+ * `runMcpServer` owns the lifetime of a private watch-tail server: it starts one
5
+ * on a free port (or attaches to a URL), serves MCP over stdio, and stops the
6
+ * server when stdin closes or a signal arrives. `runMcpInit` detects installed
7
+ * agents, asks which ones to configure, and writes the merge plan from
8
+ * `agents.ts`. Both take their side effects as arguments, so they can be driven
9
+ * in a test without a process, a terminal or a filesystem.
10
+ */
11
+ import { dirname } from 'node:path';
12
+ import { healthUrl, uiUrl } from "../server.js";
13
+ import { createWatchTailServer } from "./tools.js";
14
+ import { AGENTS, AgentConfigError, agentConfigPath, agentConfigSnippet, detectAgents, findAgent, mcpServerCommand, planAgentConfig, } from "./agents.js";
15
+ /** Subscribes to the signals that should stop the server. */
16
+ function defaultSignals(handler) {
17
+ const events = ['SIGINT', 'SIGTERM', 'SIGHUP'];
18
+ for (const event of events)
19
+ process.on(event, handler);
20
+ return () => {
21
+ for (const event of events)
22
+ process.off(event, handler);
23
+ };
24
+ }
25
+ /** Renders a thrown value as a message. */
26
+ function describe(error) {
27
+ return error instanceof Error ? error.message : String(error);
28
+ }
29
+ /** Placeholder for the stop resolver until a promise installs the real one. */
30
+ const noop = () => undefined;
31
+ /**
32
+ * Serves MCP over stdio until the agent closes the connection.
33
+ *
34
+ * Nothing but protocol responses is written to `output`: the headless server is
35
+ * started with its own stdout hidden, and every diagnostic goes to `stderr`.
36
+ */
37
+ export async function runMcpServer(input, deps) {
38
+ let child = null;
39
+ let url = input.url;
40
+ if (url === null) {
41
+ if (input.appRoot === null) {
42
+ input.stderr('Could not find the built app (build/index.js). Run `pnpm build` first.');
43
+ return 1;
44
+ }
45
+ let port;
46
+ try {
47
+ port = input.port ?? (await deps.findFreePort());
48
+ }
49
+ catch (error) {
50
+ input.stderr(`could not find a free port for the headless server: ${describe(error)}`);
51
+ return 1;
52
+ }
53
+ url = uiUrl(input.host, port);
54
+ child = deps.startServer({
55
+ appRoot: input.appRoot,
56
+ env: input.childEnv,
57
+ port,
58
+ host: input.host,
59
+ verbose: false,
60
+ });
61
+ const ready = await deps.waitForHealth(healthUrl(url), { fetchImpl: deps.fetchImpl });
62
+ if (!ready) {
63
+ input.stderr(`the headless watch-tail server did not answer on ${url}`);
64
+ await deps.stopServer(child);
65
+ return 1;
66
+ }
67
+ }
68
+ else {
69
+ const ready = await deps.waitForHealth(healthUrl(url), {
70
+ fetchImpl: deps.fetchImpl,
71
+ timeoutMs: 3000,
72
+ });
73
+ if (!ready) {
74
+ input.stderr(`no watch-tail server answered at ${url}`);
75
+ return 1;
76
+ }
77
+ }
78
+ const backend = deps.createBackend({ baseUrl: url, fetchImpl: deps.fetchImpl });
79
+ const server = createWatchTailServer({
80
+ backend,
81
+ version: input.version,
82
+ region: input.region,
83
+ });
84
+ let releaseStop = noop;
85
+ const stopped = new Promise((resolve) => {
86
+ releaseStop = resolve;
87
+ });
88
+ const onSignal = () => {
89
+ input.input.destroy?.();
90
+ releaseStop();
91
+ };
92
+ const unsubscribe = (deps.subscribeSignals ?? defaultSignals)(onSignal);
93
+ try {
94
+ await Promise.race([
95
+ deps.serve({
96
+ input: input.input,
97
+ output: input.output,
98
+ server,
99
+ onError: (error) => input.stderr(`watch-tail mcp: ${describe(error)}`),
100
+ }),
101
+ stopped,
102
+ ]);
103
+ }
104
+ finally {
105
+ unsubscribe();
106
+ if (child !== null)
107
+ await deps.stopServer(child);
108
+ }
109
+ return 0;
110
+ }
111
+ /** Resolves the agents named by `--agent`, reporting unknown ids. */
112
+ function namedTargets(ids, ctx, scope, warn) {
113
+ const targets = [];
114
+ for (const id of ids) {
115
+ const agent = findAgent(id);
116
+ if (agent === null) {
117
+ warn(`unknown agent "${id}" (known: ${AGENTS.map((entry) => entry.id).join(', ')})`);
118
+ return null;
119
+ }
120
+ const path = agentConfigPath(agent, ctx, scope);
121
+ if (path === null) {
122
+ warn(`${agent.name} has no ${scope} configuration`);
123
+ continue;
124
+ }
125
+ targets.push({ agent, path });
126
+ }
127
+ return targets;
128
+ }
129
+ /** Resolves every detected agent, at the requested scope. */
130
+ function detectedTargets(ctx, scope, deps) {
131
+ const targets = [];
132
+ for (const detected of detectAgents(ctx, deps)) {
133
+ if (!detected.installed)
134
+ continue;
135
+ const path = agentConfigPath(detected.agent, ctx, scope);
136
+ if (path === null)
137
+ continue;
138
+ targets.push({ agent: detected.agent, path });
139
+ }
140
+ return targets;
141
+ }
142
+ /** Reads a config file, treating a missing one as empty. */
143
+ function readExisting(path, deps) {
144
+ try {
145
+ return deps.readFile(path);
146
+ }
147
+ catch {
148
+ return '';
149
+ }
150
+ }
151
+ /** Writes the merge plan for one agent, returning whether anything changed. */
152
+ function applyTarget(target, command, deps) {
153
+ const existing = readExisting(target.path, deps);
154
+ let plan;
155
+ try {
156
+ plan = planAgentConfig({ agent: target.agent, existing, command });
157
+ }
158
+ catch (error) {
159
+ if (error instanceof AgentConfigError) {
160
+ deps.warn(`could not update ${target.agent.name}: ${error.message}`);
161
+ return 'failed';
162
+ }
163
+ throw error;
164
+ }
165
+ if (!plan.changed) {
166
+ deps.log(`${target.agent.name} already has watch-tail configured (${target.path})`);
167
+ return 'unchanged';
168
+ }
169
+ try {
170
+ deps.ensureDir(dirname(target.path));
171
+ deps.writeFile(target.path, plan.contents);
172
+ }
173
+ catch (error) {
174
+ deps.warn(`could not write ${target.path}: ${describe(error)}`);
175
+ return 'failed';
176
+ }
177
+ deps.log(`configured ${target.agent.name} (${target.path})`);
178
+ return 'written';
179
+ }
180
+ /**
181
+ * `watch-tail mcp init`: detect installed agents, ask which to configure, and
182
+ * write the `watch-tail` MCP server into their configuration.
183
+ *
184
+ * Exit codes: 0 when every selected agent is configured (or already was), 1 when
185
+ * nothing was detected or a write failed, 2 for an unknown `--agent` id.
186
+ */
187
+ export async function runMcpInit(input, deps) {
188
+ const command = mcpServerCommand({
189
+ version: input.version,
190
+ command: input.options.command,
191
+ args: input.options.args,
192
+ });
193
+ const { ctx } = deps;
194
+ let targets;
195
+ if (input.options.agents.length > 0) {
196
+ const resolved = namedTargets(input.options.agents, ctx, input.options.scope, deps.warn);
197
+ if (resolved === null)
198
+ return 2;
199
+ targets = resolved;
200
+ }
201
+ else {
202
+ targets = detectedTargets(ctx, input.options.scope, deps);
203
+ if (targets.length === 0) {
204
+ deps.log('No supported AI agents were found on this machine.');
205
+ deps.log(`Known agents: ${AGENTS.map((agent) => agent.id).join(', ')}.`);
206
+ deps.log('Pass --agent <id> to configure one anyway, or --print to see the config.');
207
+ return 1;
208
+ }
209
+ deps.log(`Found ${targets.length} agent${targets.length === 1 ? '' : 's'}:`);
210
+ for (const target of targets)
211
+ deps.log(` - ${target.agent.name} (${target.path})`);
212
+ }
213
+ if (input.options.print) {
214
+ for (const target of targets) {
215
+ deps.log(`\n# ${target.agent.name} - ${target.path}`);
216
+ deps.log(agentConfigSnippet(target.agent, command).trimEnd());
217
+ }
218
+ return 0;
219
+ }
220
+ let chosen;
221
+ if (input.options.yes) {
222
+ chosen = targets;
223
+ }
224
+ else {
225
+ const ids = await deps.chooseAgents('Which agents should watch-tail be configured in?', targets.map((target) => ({ value: target.agent.id, label: target.agent.name })), targets.map((target) => target.agent.id));
226
+ const selected = new Set(ids);
227
+ chosen = targets.filter((target) => selected.has(target.agent.id));
228
+ if (chosen.length === 0) {
229
+ deps.warn('nothing selected: no agent was configured (pass --yes to skip the question)');
230
+ return 1;
231
+ }
232
+ }
233
+ let failures = 0;
234
+ for (const target of chosen) {
235
+ if (applyTarget(target, command, deps) === 'failed')
236
+ failures += 1;
237
+ }
238
+ if (failures > 0) {
239
+ deps.warn(`${failures} agent${failures === 1 ? '' : 's'} could not be configured`);
240
+ return 1;
241
+ }
242
+ const executable = [command.command, ...command.args].join(' ');
243
+ deps.log(`\nRestart the configured agent so it picks up watch-tail (${executable}).`);
244
+ return 0;
245
+ }
@@ -0,0 +1,103 @@
1
+ /**
2
+ * The stdio transport loop for the MCP server.
3
+ *
4
+ * tmcp owns the protocol (initialization, capabilities, argument validation,
5
+ * tool dispatch); this loop only frames messages: newline-delimited JSON-RPC in,
6
+ * one JSON response line out. It is written here rather than using
7
+ * `@tmcp/transport-stdio` because that transport calls `process.exit()` itself,
8
+ * which would tear the process down before the private watch-tail server it
9
+ * proxies could be stopped gracefully.
10
+ *
11
+ * stdout carries the protocol and nothing else; diagnostics go to stderr, which
12
+ * the caller owns.
13
+ */
14
+ /** A JSON-RPC parse error, sent for a line that is not JSON. */
15
+ const PARSE_ERROR_RESPONSE = JSON.stringify({
16
+ jsonrpc: '2.0',
17
+ id: null,
18
+ error: { code: -32_700, message: 'Parse error' },
19
+ });
20
+ /**
21
+ * The fields the protocol defines for an `InitializeResult`.
22
+ *
23
+ * tmcp builds the initialize result by spreading the server options it was
24
+ * constructed with, so its own `adapter` (a class instance) is carried along and
25
+ * serialised as `{}`. It is an internal detail, not part of the protocol, so a
26
+ * response to `initialize` is narrowed to the fields a client may expect.
27
+ */
28
+ const INITIALIZE_RESULT_KEYS = [
29
+ 'protocolVersion',
30
+ 'capabilities',
31
+ 'serverInfo',
32
+ 'instructions',
33
+ '_meta',
34
+ ];
35
+ /** True for a JSON object (not an array or null). */
36
+ function isRecord(value) {
37
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
38
+ }
39
+ /**
40
+ * Narrows an `initialize` response to its protocol fields.
41
+ *
42
+ * Any other response is returned untouched; this exists only because tmcp leaks
43
+ * its own options into that one result.
44
+ */
45
+ export function sanitizeInitializeResponse(response) {
46
+ if (!isRecord(response) || !isRecord(response.result))
47
+ return response;
48
+ const result = {};
49
+ for (const key of INITIALIZE_RESULT_KEYS) {
50
+ if (key in response.result)
51
+ result[key] = response.result[key];
52
+ }
53
+ return { ...response, result };
54
+ }
55
+ /** Writes one line, waiting for the stream to drain when it is backed up. */
56
+ async function write(output, text) {
57
+ const accepted = output.write(text);
58
+ if (accepted === false && typeof output.once === 'function') {
59
+ await new Promise((resolveDrain) => output.once?.('drain', resolveDrain));
60
+ }
61
+ }
62
+ /** Decodes and answers one line. */
63
+ async function handleLine(line, options) {
64
+ let message;
65
+ try {
66
+ message = JSON.parse(line);
67
+ }
68
+ catch {
69
+ await write(options.output, `${PARSE_ERROR_RESPONSE}\n`);
70
+ return;
71
+ }
72
+ const response = await options.server.receive(message, { sessionInfo: {} });
73
+ if (response === undefined || response === null)
74
+ return;
75
+ const isInitialize = isRecord(message) && message.method === 'initialize';
76
+ await write(options.output, `${JSON.stringify(isInitialize ? sanitizeInitializeResponse(response) : response)}\n`);
77
+ }
78
+ /**
79
+ * Serves MCP messages until the input closes.
80
+ *
81
+ * Messages are handled in order, so replies come back in the order the client
82
+ * sent the calls.
83
+ */
84
+ export async function serveMcp(options) {
85
+ const decoder = new TextDecoder();
86
+ let buffer = '';
87
+ for await (const chunk of options.input) {
88
+ buffer += typeof chunk === 'string' ? chunk : decoder.decode(chunk, { stream: true });
89
+ let newline = buffer.indexOf('\n');
90
+ while (newline >= 0) {
91
+ const line = buffer.slice(0, newline).trim();
92
+ buffer = buffer.slice(newline + 1);
93
+ if (line.length > 0) {
94
+ await handleLine(line, options).catch((error) => options.onError?.(error));
95
+ }
96
+ newline = buffer.indexOf('\n');
97
+ }
98
+ }
99
+ buffer += decoder.decode();
100
+ const rest = buffer.trim();
101
+ if (rest.length > 0)
102
+ await handleLine(rest, options).catch((error) => options.onError?.(error));
103
+ }
@@ -0,0 +1,245 @@
1
+ /**
2
+ * The MCP tool catalogue, built on `tmcp`.
3
+ *
4
+ * tmcp owns the protocol: it negotiates the client's protocol revision (including
5
+ * the latest `2026-07-28`), advertises capabilities, validates arguments against
6
+ * the valibot schemas below and frames the responses. This module only says what
7
+ * watch-tail can do and how a tool call maps onto the backend.
8
+ *
9
+ * The schemas are the contract an agent sees, so every field carries a
10
+ * description; validation failures are reported by tmcp as tool errors rather
11
+ * than reaching the handlers.
12
+ */
13
+ import { McpServer } from 'tmcp';
14
+ import { defineTool } from 'tmcp/tool';
15
+ import { tool } from 'tmcp/utils';
16
+ import { ValibotJsonSchemaAdapter } from '@tmcp/adapter-valibot';
17
+ import * as v from 'valibot';
18
+ /** Guidance sent to the agent when it connects. */
19
+ const MCP_INSTRUCTIONS = `watch-tail serves CloudWatch Logs and its local DuckDB archive.
20
+ Every search is a bounded, historic window, like the UI's Historic mode. source="cloudwatch" is the
21
+ default and is archive-first: it reads the archive for the ranges it holds and only calls AWS for
22
+ the gaps, so it is fast and complete. Use source="archive" to stay entirely on this machine (no AWS
23
+ calls, and no 14-day limit - the archive keeps history CloudWatch has already dropped). Start with
24
+ archive_status to see what is stored and which regions it covers, then list_log_groups to find a
25
+ group, then search_logs or count_logs. CloudWatch has no level field, so use filterPattern with
26
+ source="cloudwatch". Timestamps are epoch milliseconds in JSON, and every event also carries an ISO
27
+ 8601 time.`;
28
+ /** Shared property descriptions. */
29
+ const REGION = 'AWS region. Defaults to the region the server resolved (profile or AWS_REGION).';
30
+ const GROUPS = 'One or more log group names. Call list_log_groups first; a comma-separated string is accepted too.';
31
+ const SOURCE = 'Where to read: "cloudwatch" (AWS, the default; reads the archive first for historic windows) or "archive" (local DuckDB only, no AWS calls).';
32
+ /** Source used when a tool call does not name one. */
33
+ const DEFAULT_SOURCE = 'cloudwatch';
34
+ const FROM = 'Window start: a duration ("30m", "2h"), epoch milliseconds, or an ISO 8601 timestamp.';
35
+ const TO = 'Window end, in the same forms as from. Defaults to now.';
36
+ const RANGE = 'Preset window when from/to are absent: 15m, 1h, 3h, 12h, 24h or 5d.';
37
+ const LEVELS = 'Archive only: comma-separated levels to keep: error, warn, info, debug.';
38
+ /** A field that is optional and documented. */
39
+ function described(schema, description) {
40
+ return v.optional(v.pipe(schema, v.description(description)));
41
+ }
42
+ const regionField = described(v.string(), REGION);
43
+ const sourceField = v.optional(v.pipe(v.picklist(['archive', 'cloudwatch']), v.description(SOURCE)));
44
+ const windowFields = {
45
+ from: described(v.string(), FROM),
46
+ to: described(v.string(), TO),
47
+ range: described(v.string(), RANGE),
48
+ };
49
+ /** Normalises a comma-separated string or an array into a de-duplicated list. */
50
+ function toList(value) {
51
+ if (value === undefined)
52
+ return [];
53
+ const items = Array.isArray(value) ? value : value.split(',');
54
+ const list = [];
55
+ for (const item of items) {
56
+ const trimmed = item.trim();
57
+ if (trimmed.length > 0)
58
+ list.push(trimmed);
59
+ }
60
+ return [...new Set(list)];
61
+ }
62
+ /** Formats one event for the agent. */
63
+ export function formatEvent(event) {
64
+ return {
65
+ timestamp: event.timestamp,
66
+ time: new Date(event.timestamp).toISOString(),
67
+ group: event.group ?? null,
68
+ stream: event.streamName ?? null,
69
+ level: event.level ?? null,
70
+ requestId: event.requestId ?? null,
71
+ message: event.message,
72
+ };
73
+ }
74
+ /** Renders a value as pretty JSON for the MCP text content. */
75
+ function json(value) {
76
+ return JSON.stringify(value, null, 2);
77
+ }
78
+ /** A short, readable message for a backend failure. */
79
+ /**
80
+ * Turns a thrown value into the text of a tool error.
81
+ *
82
+ * A failed CloudWatch search is the common case on a machine without working
83
+ * AWS credentials, so it says how to get an answer from the local archive
84
+ * instead.
85
+ */
86
+ function failureText(error, source) {
87
+ const message = error instanceof Error ? error.message : String(error);
88
+ const code = error.code;
89
+ const base = typeof code === 'string' && code.length > 0
90
+ ? `watch-tail error: ${message} (code: ${code})`
91
+ : `watch-tail error: ${message}`;
92
+ return source === 'cloudwatch'
93
+ ? `${base}. If these events are already stored locally, retry with source="archive".`
94
+ : base;
95
+ }
96
+ /**
97
+ * Builds the tmcp server with the watch-tail tools registered.
98
+ *
99
+ * The valibot adapter turns each schema into the JSON Schema the client validates
100
+ * against, and validates the arguments before the handler runs.
101
+ */
102
+ export function createWatchTailServer(input) {
103
+ const { backend } = input;
104
+ const defaultRegion = input.region ?? null;
105
+ const server = new McpServer({
106
+ name: 'watch-tail',
107
+ version: input.version,
108
+ description: 'Search CloudWatch Logs and the local watch-tail archive.',
109
+ }, {
110
+ adapter: new ValibotJsonSchemaAdapter(),
111
+ capabilities: { tools: {} },
112
+ instructions: MCP_INSTRUCTIONS,
113
+ });
114
+ server.tools([
115
+ defineTool({
116
+ name: 'archive_status',
117
+ description: 'Report what the local watch-tail archive holds: database path, availability, event count, distinct log groups and regions, and the oldest and newest event. Use it to decide whether a search can run offline.',
118
+ schema: v.object({ region: regionField }),
119
+ }, async ({ region }) => {
120
+ try {
121
+ const status = await backend.archiveStatus({ region: region ?? defaultRegion });
122
+ return tool.text(json(status));
123
+ }
124
+ catch (error) {
125
+ return tool.error(failureText(error));
126
+ }
127
+ }),
128
+ defineTool({
129
+ name: 'list_log_groups',
130
+ description: 'List log group names visible to watch-tail, either from the local archive or from CloudWatch Logs. Archive listings also carry how many events are stored for each group.',
131
+ schema: v.object({
132
+ region: regionField,
133
+ prefix: described(v.string(), 'Only groups whose name starts with this.'),
134
+ limit: described(v.pipe(v.number(), v.integer(), v.minValue(1), v.maxValue(1000)), 'Maximum groups to return (1-1000).'),
135
+ source: sourceField,
136
+ }),
137
+ }, async ({ region, prefix, limit, source }) => {
138
+ try {
139
+ const result = await backend.listLogGroups({
140
+ region: region ?? defaultRegion,
141
+ prefix: prefix ?? null,
142
+ limit: limit ?? null,
143
+ source: source ?? DEFAULT_SOURCE,
144
+ });
145
+ return tool.text(json({
146
+ region: result.region,
147
+ source: result.source,
148
+ endpoint: result.endpoint,
149
+ count: result.groups.length,
150
+ groups: result.groups,
151
+ }));
152
+ }
153
+ catch (error) {
154
+ return tool.error(failureText(error));
155
+ }
156
+ }),
157
+ defineTool({
158
+ name: 'search_logs',
159
+ description: 'Search log events over a time window and return them, oldest first. Defaults to source="cloudwatch", which reads the local archive first and only calls AWS for ranges it does not already hold; source="archive" stays entirely local. Archive searches also accept a case-insensitive substring (search) and level filters; CloudWatch searches accept a filterPattern. The result says whether it was truncated at the event limit.',
160
+ schema: v.object({
161
+ groups: v.pipe(v.union([v.string(), v.array(v.string())]), v.description(GROUPS)),
162
+ region: regionField,
163
+ source: sourceField,
164
+ search: described(v.string(), 'Archive only: case-insensitive substring of the message.'),
165
+ level: described(v.union([v.string(), v.array(v.string())]), LEVELS),
166
+ ...windowFields,
167
+ filterPattern: described(v.string(), 'CloudWatch only: a CloudWatch Logs filter pattern.'),
168
+ limit: described(v.pipe(v.number(), v.integer(), v.minValue(1), v.maxValue(100_000)), 'Maximum events to return (1-100000).'),
169
+ }),
170
+ }, async ({ groups, region, source, search, level, from, to, range, filterPattern, limit }) => {
171
+ const resolvedSource = source ?? DEFAULT_SOURCE;
172
+ try {
173
+ const result = await backend.search({
174
+ region: region ?? defaultRegion,
175
+ groups: toList(groups),
176
+ source: resolvedSource,
177
+ search: search ?? null,
178
+ levels: resolvedSource === 'archive' ? toList(level) : null,
179
+ from: from ?? null,
180
+ to: to ?? null,
181
+ range: range ?? null,
182
+ filterPattern: resolvedSource === 'cloudwatch' ? (filterPattern ?? null) : null,
183
+ max: limit ?? 500,
184
+ });
185
+ const text = json({
186
+ region: result.region,
187
+ source: result.source,
188
+ groups: result.groups,
189
+ count: result.events.length,
190
+ truncated: result.truncated,
191
+ reason: result.reason,
192
+ error: result.error,
193
+ events: result.events.map(formatEvent),
194
+ });
195
+ return result.error === null ? tool.text(text) : tool.error(text);
196
+ }
197
+ catch (error) {
198
+ return tool.error(failureText(error, resolvedSource));
199
+ }
200
+ }),
201
+ defineTool({
202
+ name: 'count_logs',
203
+ description: 'Count archived events per time bucket, per log group and level, without returning the events. Use it to find a spike (or to size a window) before a search. Archive only.',
204
+ schema: v.object({
205
+ groups: v.pipe(v.union([v.string(), v.array(v.string())]), v.description(GROUPS)),
206
+ region: regionField,
207
+ ...windowFields,
208
+ level: described(v.union([v.string(), v.array(v.string())]), LEVELS),
209
+ bucket: described(v.string(), 'Bucket width as a duration or milliseconds. Chosen automatically when omitted.'),
210
+ by: v.optional(v.pipe(v.picklist(['event', 'request']), v.description('Count lines (event) or requests (request).'))),
211
+ }),
212
+ }, async ({ groups, region, from, to, range, level, bucket, by }) => {
213
+ try {
214
+ const points = await backend.count({
215
+ region: region ?? defaultRegion,
216
+ groups: toList(groups),
217
+ from: from ?? null,
218
+ to: to ?? null,
219
+ range: range ?? null,
220
+ levels: toList(level),
221
+ bucket: bucket ?? null,
222
+ by: by ?? null,
223
+ });
224
+ return tool.text(json({ count: points.length, points }));
225
+ }
226
+ catch (error) {
227
+ return tool.error(failureText(error));
228
+ }
229
+ }),
230
+ defineTool({
231
+ name: 'get_identity',
232
+ description: 'Call STS GetCallerIdentity and report the account and ARN the ambient credentials belong to. Useful before a CloudWatch search, or to confirm which account an archive belongs to.',
233
+ schema: v.object({ region: regionField }),
234
+ }, async ({ region }) => {
235
+ try {
236
+ const identity = await backend.identity({ region: region ?? defaultRegion });
237
+ return tool.text(json(identity));
238
+ }
239
+ catch (error) {
240
+ return tool.error(failureText(error));
241
+ }
242
+ }),
243
+ ]);
244
+ return server;
245
+ }