watch-tail 0.9.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 (357) hide show
  1. package/README.md +103 -8
  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/chunks/B2En4t_E.js +3 -0
  9. package/build/client/_app/immutable/chunks/B2En4t_E.js.br +0 -0
  10. package/build/client/_app/immutable/chunks/B2En4t_E.js.gz +0 -0
  11. package/build/client/_app/immutable/chunks/BJ7fEbY9.js +1 -0
  12. package/build/client/_app/immutable/chunks/BJ7fEbY9.js.br +0 -0
  13. package/build/client/_app/immutable/chunks/BJ7fEbY9.js.gz +0 -0
  14. package/build/client/_app/immutable/chunks/{D7vimbmk.js → BX0v2q9h.js} +1 -1
  15. package/build/client/_app/immutable/chunks/BX0v2q9h.js.br +0 -0
  16. package/build/client/_app/immutable/chunks/BX0v2q9h.js.gz +0 -0
  17. package/build/client/_app/immutable/chunks/{DwOZdLDj.js → B_AZHMkI.js} +1 -1
  18. package/build/client/_app/immutable/chunks/B_AZHMkI.js.br +0 -0
  19. package/build/client/_app/immutable/chunks/B_AZHMkI.js.gz +0 -0
  20. package/build/client/_app/immutable/chunks/{dqF8mxBW.js → Bb9UOIo-.js} +1 -1
  21. package/build/client/_app/immutable/chunks/Bb9UOIo-.js.br +0 -0
  22. package/build/client/_app/immutable/chunks/Bb9UOIo-.js.gz +0 -0
  23. package/build/client/_app/immutable/chunks/{0b2v80OK.js → BdV_pkVs.js} +1 -1
  24. package/build/client/_app/immutable/chunks/BdV_pkVs.js.br +0 -0
  25. package/build/client/_app/immutable/chunks/BdV_pkVs.js.gz +0 -0
  26. package/build/client/_app/immutable/chunks/{C_U_Jvk5.js → BsrUsB47.js} +1 -1
  27. package/build/client/_app/immutable/chunks/BsrUsB47.js.br +0 -0
  28. package/build/client/_app/immutable/chunks/BsrUsB47.js.gz +0 -0
  29. package/build/client/_app/immutable/chunks/{DvxMaQv_.js → CHnbfiIG.js} +1 -1
  30. package/build/client/_app/immutable/chunks/CHnbfiIG.js.br +0 -0
  31. package/build/client/_app/immutable/chunks/CHnbfiIG.js.gz +0 -0
  32. package/build/client/_app/immutable/chunks/{DS3cLPAu.js → CNomy7CF.js} +1 -1
  33. package/build/client/_app/immutable/chunks/CNomy7CF.js.br +0 -0
  34. package/build/client/_app/immutable/chunks/CNomy7CF.js.gz +0 -0
  35. package/build/client/_app/immutable/chunks/CPbNf3ya.js +1 -0
  36. package/build/client/_app/immutable/chunks/CPbNf3ya.js.br +0 -0
  37. package/build/client/_app/immutable/chunks/CPbNf3ya.js.gz +0 -0
  38. package/build/client/_app/immutable/chunks/CZ2PC-zH.js +1 -0
  39. package/build/client/_app/immutable/chunks/CZ2PC-zH.js.br +0 -0
  40. package/build/client/_app/immutable/chunks/CZ2PC-zH.js.gz +0 -0
  41. package/build/client/_app/immutable/chunks/CljxK204.js +1 -0
  42. package/build/client/_app/immutable/chunks/CljxK204.js.br +1 -0
  43. package/build/client/_app/immutable/chunks/CljxK204.js.gz +0 -0
  44. package/build/client/_app/immutable/chunks/CzU0cUz4.js +1 -0
  45. package/build/client/_app/immutable/chunks/CzU0cUz4.js.br +0 -0
  46. package/build/client/_app/immutable/chunks/CzU0cUz4.js.gz +0 -0
  47. package/build/client/_app/immutable/chunks/{B5RiPG8Z.js → D6vIi1r5.js} +1 -1
  48. package/build/client/_app/immutable/chunks/D6vIi1r5.js.br +3 -0
  49. package/build/client/_app/immutable/chunks/D6vIi1r5.js.gz +0 -0
  50. package/build/client/_app/immutable/chunks/DAxERhtN.js +1 -0
  51. package/build/client/_app/immutable/chunks/DAxERhtN.js.br +0 -0
  52. package/build/client/_app/immutable/chunks/DAxERhtN.js.gz +0 -0
  53. package/build/client/_app/immutable/chunks/DIzgJaYS.js +1 -0
  54. package/build/client/_app/immutable/chunks/DIzgJaYS.js.br +0 -0
  55. package/build/client/_app/immutable/chunks/DIzgJaYS.js.gz +0 -0
  56. package/build/client/_app/immutable/chunks/DSHrbzz3.js +1 -0
  57. package/build/client/_app/immutable/chunks/DSHrbzz3.js.br +0 -0
  58. package/build/client/_app/immutable/chunks/DSHrbzz3.js.gz +0 -0
  59. package/build/client/_app/immutable/chunks/{Dkh4Dwm8.js → DSvLImpl.js} +1 -1
  60. package/build/client/_app/immutable/chunks/DSvLImpl.js.br +0 -0
  61. package/build/client/_app/immutable/chunks/DSvLImpl.js.gz +0 -0
  62. package/build/client/_app/immutable/chunks/{b77-bq1n.js → DWBod19x.js} +1 -1
  63. package/build/client/_app/immutable/chunks/DWBod19x.js.br +0 -0
  64. package/build/client/_app/immutable/chunks/DWBod19x.js.gz +0 -0
  65. package/build/client/_app/immutable/chunks/{IlwbfbOu.js → Dicxo5h-.js} +1 -1
  66. package/build/client/_app/immutable/chunks/Dicxo5h-.js.br +0 -0
  67. package/build/client/_app/immutable/chunks/Dicxo5h-.js.gz +0 -0
  68. package/build/client/_app/immutable/chunks/DjjHmSG3.js +1 -0
  69. package/build/client/_app/immutable/chunks/DjjHmSG3.js.br +0 -0
  70. package/build/client/_app/immutable/chunks/DjjHmSG3.js.gz +0 -0
  71. package/build/client/_app/immutable/chunks/DlDLXtam.js +1 -0
  72. package/build/client/_app/immutable/chunks/DlDLXtam.js.br +0 -0
  73. package/build/client/_app/immutable/chunks/DlDLXtam.js.gz +0 -0
  74. package/build/client/_app/immutable/chunks/EZJqWoh3.js +1 -0
  75. package/build/client/_app/immutable/chunks/EZJqWoh3.js.br +0 -0
  76. package/build/client/_app/immutable/chunks/EZJqWoh3.js.gz +0 -0
  77. package/build/client/_app/immutable/chunks/Fg8W5tkO.js +15 -0
  78. package/build/client/_app/immutable/chunks/Fg8W5tkO.js.br +0 -0
  79. package/build/client/_app/immutable/chunks/Fg8W5tkO.js.gz +0 -0
  80. package/build/client/_app/immutable/chunks/LGzrUxfF.js +1 -0
  81. package/build/client/_app/immutable/chunks/LGzrUxfF.js.br +0 -0
  82. package/build/client/_app/immutable/chunks/LGzrUxfF.js.gz +0 -0
  83. package/build/client/_app/immutable/chunks/McME9wI6.js +10 -0
  84. package/build/client/_app/immutable/chunks/McME9wI6.js.br +0 -0
  85. package/build/client/_app/immutable/chunks/McME9wI6.js.gz +0 -0
  86. package/build/client/_app/immutable/chunks/N78Fm5Ux.js +1 -0
  87. package/build/client/_app/immutable/chunks/N78Fm5Ux.js.br +0 -0
  88. package/build/client/_app/immutable/chunks/N78Fm5Ux.js.gz +0 -0
  89. package/build/client/_app/immutable/chunks/{DQqLOGLe.js → XrAcf7YH.js} +1 -1
  90. package/build/client/_app/immutable/chunks/XrAcf7YH.js.br +0 -0
  91. package/build/client/_app/immutable/chunks/XrAcf7YH.js.gz +0 -0
  92. package/build/client/_app/immutable/chunks/{aI_O2VuQ.js → _PJhUOmT.js} +1 -1
  93. package/build/client/_app/immutable/chunks/_PJhUOmT.js.br +0 -0
  94. package/build/client/_app/immutable/chunks/_PJhUOmT.js.gz +0 -0
  95. package/build/client/_app/immutable/chunks/gXyWwJbW.js +1 -0
  96. package/build/client/_app/immutable/chunks/gXyWwJbW.js.br +0 -0
  97. package/build/client/_app/immutable/chunks/gXyWwJbW.js.gz +0 -0
  98. package/build/client/_app/immutable/chunks/{DGYKsRyW.js → vMHl7jRw.js} +1 -1
  99. package/build/client/_app/immutable/chunks/vMHl7jRw.js.br +0 -0
  100. package/build/client/_app/immutable/chunks/vMHl7jRw.js.gz +0 -0
  101. package/build/client/_app/immutable/chunks/xJTjOoUQ.js +2 -0
  102. package/build/client/_app/immutable/chunks/xJTjOoUQ.js.br +0 -0
  103. package/build/client/_app/immutable/chunks/xJTjOoUQ.js.gz +0 -0
  104. package/build/client/_app/immutable/entry/app.ycJtqzGh.js +2 -0
  105. package/build/client/_app/immutable/entry/app.ycJtqzGh.js.br +0 -0
  106. package/build/client/_app/immutable/entry/app.ycJtqzGh.js.gz +0 -0
  107. package/build/client/_app/immutable/entry/start.DOq0-PiA.js +1 -0
  108. package/build/client/_app/immutable/entry/start.DOq0-PiA.js.br +0 -0
  109. package/build/client/_app/immutable/entry/start.DOq0-PiA.js.gz +0 -0
  110. package/build/client/_app/immutable/nodes/0.D63E8Q6i.js +1 -0
  111. package/build/client/_app/immutable/nodes/0.D63E8Q6i.js.br +0 -0
  112. package/build/client/_app/immutable/nodes/0.D63E8Q6i.js.gz +0 -0
  113. package/build/client/_app/immutable/nodes/1.B63I-h1v.js +1 -0
  114. package/build/client/_app/immutable/nodes/1.B63I-h1v.js.br +0 -0
  115. package/build/client/_app/immutable/nodes/1.B63I-h1v.js.gz +0 -0
  116. package/build/client/_app/immutable/nodes/2.DXy8PMWZ.js +5 -0
  117. package/build/client/_app/immutable/nodes/2.DXy8PMWZ.js.br +0 -0
  118. package/build/client/_app/immutable/nodes/2.DXy8PMWZ.js.gz +0 -0
  119. package/build/client/_app/version.json +1 -1
  120. package/build/client/_app/version.json.br +0 -0
  121. package/build/client/_app/version.json.gz +0 -0
  122. package/build/handler.js +7 -7
  123. package/build/index.js +7 -7
  124. package/build/server/chunks/chunks/{Arc.canvas.js-CN0KDoHG.js → Arc.canvas.js-DqfSjlnB.js} +8 -8
  125. package/build/server/chunks/chunks/{Arc.canvas.js-CN0KDoHG.js.map → Arc.canvas.js-DqfSjlnB.js.map} +1 -1
  126. package/build/server/chunks/chunks/{Arc.js-C8EC9NoE.js → Arc.js-DNywwEq7.js} +10 -10
  127. package/build/server/chunks/chunks/{Arc.js-C8EC9NoE.js.map → Arc.js-DNywwEq7.js.map} +1 -1
  128. package/build/server/chunks/chunks/{Bar.js-DtAb3LZZ.js → Bar.js-BHJrwOa1.js} +14 -14
  129. package/build/server/chunks/chunks/{Bar.js-DtAb3LZZ.js.map → Bar.js-BHJrwOa1.js.map} +1 -1
  130. package/build/server/chunks/chunks/{ChartAnnotations.js-twzDSVzY.js → ChartAnnotations.js-DXt38zkt.js} +18 -18
  131. package/build/server/chunks/chunks/{ChartAnnotations.js-twzDSVzY.js.map → ChartAnnotations.js-DXt38zkt.js.map} +1 -1
  132. package/build/server/chunks/chunks/{Circle.html.js-BJywADGK.js → Circle.html.js-KngSXZUe.js} +5 -5
  133. package/build/server/chunks/chunks/{Circle.html.js-BJywADGK.js.map → Circle.html.js-KngSXZUe.js.map} +1 -1
  134. package/build/server/chunks/chunks/{ClipPath.canvas.js-9Fc0bTEM.js → ClipPath.canvas.js-BsGsfzQK.js} +4 -4
  135. package/build/server/chunks/chunks/{ClipPath.canvas.js-9Fc0bTEM.js.map → ClipPath.canvas.js-BsGsfzQK.js.map} +1 -1
  136. package/build/server/chunks/chunks/{DefaultTooltip.js-C2NWK2AD.js → DefaultTooltip.js-CbyljZUi.js} +8 -8
  137. package/build/server/chunks/chunks/{DefaultTooltip.js-C2NWK2AD.js.map → DefaultTooltip.js-CbyljZUi.js.map} +1 -1
  138. package/build/server/chunks/chunks/{EventScatter.js-CO2GonW-.js → EventScatter.js-DHlLEn_7.js} +36 -35
  139. package/build/server/chunks/chunks/{EventScatter.js-CO2GonW-.js.map → EventScatter.js-DHlLEn_7.js.map} +1 -1
  140. package/build/server/chunks/chunks/{Labels.js-DB9qoyZ3.js → Labels.js-DhpbhJmV.js} +18 -18
  141. package/build/server/chunks/chunks/{Labels.js-DB9qoyZ3.js.map → Labels.js-DhpbhJmV.js.map} +1 -1
  142. package/build/server/chunks/chunks/{Legend.js-B_ArjxQ7.js → Legend.js-D25j2DRt.js} +6 -6
  143. package/build/server/chunks/chunks/{Legend.js-B_ArjxQ7.js.map → Legend.js-D25j2DRt.js.map} +1 -1
  144. package/build/server/chunks/chunks/{Line.html.js-B1REcOFe.js → Line.html.js-CKb2T7JC.js} +6 -6
  145. package/build/server/chunks/chunks/{Line.html.js-B1REcOFe.js.map → Line.html.js-CKb2T7JC.js.map} +1 -1
  146. package/build/server/chunks/chunks/{Link.canvas.js-nWimAHfH.js → Link.canvas.js-c0r05107.js} +9 -9
  147. package/build/server/chunks/chunks/{Link.canvas.js-nWimAHfH.js.map → Link.canvas.js-c0r05107.js.map} +1 -1
  148. package/build/server/chunks/chunks/{Path.canvas.js-5A9wB8zQ.js → Path.canvas.js-opfoYzQB.js} +5 -5
  149. package/build/server/chunks/chunks/{Path.canvas.js-5A9wB8zQ.js.map → Path.canvas.js-opfoYzQB.js.map} +1 -1
  150. package/build/server/chunks/chunks/{Points.html.js-B2o3k-ZZ.js → Points.html.js-CJ75UtkE.js} +7 -7
  151. package/build/server/chunks/chunks/{Points.html.js-B2o3k-ZZ.js.map → Points.html.js-CJ75UtkE.js.map} +1 -1
  152. package/build/server/chunks/chunks/Points.js-Bx_vB0po.js +14 -0
  153. package/build/server/chunks/chunks/Points.js-Bx_vB0po.js.map +1 -0
  154. package/build/server/chunks/chunks/{Points2.js-BVbWugLT.js → Points2.js-Br2MMKbn.js} +4 -4
  155. package/build/server/chunks/chunks/{Points2.js-BVbWugLT.js.map → Points2.js-Br2MMKbn.js.map} +1 -1
  156. package/build/server/chunks/chunks/{Rect.html.js-DnQ6ObhQ.js → Rect.html.js-D_-JSZ22.js} +6 -6
  157. package/build/server/chunks/chunks/{Rect.html.js-DnQ6ObhQ.js.map → Rect.html.js-D_-JSZ22.js.map} +1 -1
  158. package/build/server/chunks/chunks/{Spline.js-YnAxvrKY.js → Spline.js-DpD4175j.js} +12 -12
  159. package/build/server/chunks/chunks/{Spline.js-YnAxvrKY.js.map → Spline.js-DpD4175j.js.map} +1 -1
  160. package/build/server/chunks/chunks/{Text.html.js-LbmYJb11.js → Text.html.js-Clxo39Ky.js} +6 -6
  161. package/build/server/chunks/chunks/{Text.html.js-LbmYJb11.js.map → Text.html.js-Clxo39Ky.js.map} +1 -1
  162. package/build/server/chunks/chunks/{TooltipItem.js-Ce-blieA.js → TooltipItem.js-CgYSF3I3.js} +6 -6
  163. package/build/server/chunks/chunks/{TooltipItem.js-Ce-blieA.js.map → TooltipItem.js-CgYSF3I3.js.map} +1 -1
  164. package/build/server/chunks/chunks/{Voronoi.js-CalFJAXH.js → Voronoi.js-CX8bqc1A.js} +7 -7
  165. package/build/server/chunks/chunks/{Voronoi.js-CalFJAXH.js.map → Voronoi.js-CX8bqc1A.js.map} +1 -1
  166. package/build/server/chunks/chunks/{archive.js-D2jtMmDo.js → archive.js-BRlkdj2X.js} +331 -30
  167. package/build/server/chunks/chunks/archive.js-BRlkdj2X.js.map +1 -0
  168. package/build/server/chunks/chunks/{attributes.js-CbKEpZKa.js → attributes.js-ECgqVV_7.js} +2 -2
  169. package/build/server/chunks/chunks/{attributes.js-CbKEpZKa.js.map → attributes.js-ECgqVV_7.js.map} +1 -1
  170. package/build/server/chunks/chunks/{band.js-CjzHWr4k.js → band.js-BcI84M0Z.js} +3 -3
  171. package/build/server/chunks/chunks/{band.js-CjzHWr4k.js.map → band.js-BcI84M0Z.js.map} +1 -1
  172. package/build/server/chunks/chunks/{common.js-BvQnfkFo.js → common.js-DeZxUyRN.js} +2 -2
  173. package/build/server/chunks/chunks/{common.js-BvQnfkFo.js.map → common.js-DeZxUyRN.js.map} +1 -1
  174. package/build/server/chunks/chunks/{events.js-zIVaXIP1.js → events.js-oxLu7lhH.js} +2 -2
  175. package/build/server/chunks/chunks/{events.js-zIVaXIP1.js.map → events.js-oxLu7lhH.js.map} +1 -1
  176. package/build/server/chunks/chunks/{group.js-D0SfevId.js → group.js-C8H9Tpr6.js} +2 -2
  177. package/build/server/chunks/chunks/{group.js-D0SfevId.js.map → group.js-C8H9Tpr6.js.map} +1 -1
  178. package/build/server/chunks/chunks/{index-server.js-CtH9Hqwf.js → index-server.js-Dsi44azJ.js} +91 -2
  179. package/build/server/chunks/chunks/index-server.js-Dsi44azJ.js.map +1 -0
  180. package/build/server/chunks/chunks/{internal2.js-CfVVfAb5.js → internal2.js-Dm0TlpeP.js} +5 -5
  181. package/build/server/chunks/chunks/{internal2.js-CfVVfAb5.js.map → internal2.js-Dm0TlpeP.js.map} +1 -1
  182. package/build/server/chunks/chunks/{key.svelte.js-Cq0L6YlN.js → key.svelte.js-C9G4pBhE.js} +4 -4
  183. package/build/server/chunks/chunks/{key.svelte.js-Cq0L6YlN.js.map → key.svelte.js-C9G4pBhE.js.map} +1 -1
  184. package/build/server/chunks/chunks/{legacy-client.js-DAqKExQD.js → legacy-client.js-C8Upo6IB.js} +3 -3
  185. package/build/server/chunks/chunks/legacy-client.js-C8Upo6IB.js.map +1 -0
  186. package/build/server/chunks/chunks/{level-filter.js-D9MNrew3.js → level-filter.js-H0nc-2BG.js} +2 -2
  187. package/build/server/chunks/chunks/{level-filter.js-D9MNrew3.js.map → level-filter.js-H0nc-2BG.js.map} +1 -1
  188. package/build/server/chunks/chunks/{lineRadial.js-B7ZNP_Jp.js → lineRadial.js-B0m9ujVX.js} +2 -2
  189. package/build/server/chunks/chunks/{lineRadial.js-B7ZNP_Jp.js.map → lineRadial.js-B0m9ujVX.js.map} +1 -1
  190. package/build/server/chunks/chunks/{linear.js-CHlwr1I4.js → linear.js-CJ07spu6.js} +2 -2
  191. package/build/server/chunks/chunks/{linear.js-CHlwr1I4.js.map → linear.js-CJ07spu6.js.map} +1 -1
  192. package/build/server/chunks/chunks/{motion.svelte.js-Crk8ri1u.js → motion.svelte.js-DB7vkWmD.js} +3 -3
  193. package/build/server/chunks/chunks/{motion.svelte.js-Crk8ri1u.js.map → motion.svelte.js-DB7vkWmD.js.map} +1 -1
  194. package/build/server/chunks/chunks/{occlusion.js-ot9_OqWn.js → occlusion.js-DtcqoJjc.js} +2 -2
  195. package/build/server/chunks/chunks/{occlusion.js-ot9_OqWn.js.map → occlusion.js-DtcqoJjc.js.map} +1 -1
  196. package/build/server/chunks/chunks/{path2.js-DLVU8nc9.js → path2.js-B3tNByoS.js} +2 -2
  197. package/build/server/chunks/chunks/{path2.js-DLVU8nc9.js.map → path2.js-B3tNByoS.js.map} +1 -1
  198. package/build/server/chunks/chunks/{rect.svelte.js-_0PgI5fe.js → rect.svelte.js-C6R1SgCx.js} +4 -4
  199. package/build/server/chunks/chunks/{rect.svelte.js-_0PgI5fe.js.map → rect.svelte.js-C6R1SgCx.js.map} +1 -1
  200. package/build/server/chunks/chunks/{scales.svelte.js-DeNkKcI-.js → scales.svelte.js-C4lRvUAb.js} +4 -4
  201. package/build/server/chunks/chunks/{scales.svelte.js-DeNkKcI-.js.map → scales.svelte.js-C4lRvUAb.js.map} +1 -1
  202. package/build/server/chunks/chunks/{state.js-i-NVNGIq.js → state.js-qsHzjuJU.js} +3 -3
  203. package/build/server/chunks/chunks/{state.js-i-NVNGIq.js.map → state.js-qsHzjuJU.js.map} +1 -1
  204. package/build/server/chunks/chunks/text-size.svelte.js-CqGaHRr3.js +310 -0
  205. package/build/server/chunks/chunks/text-size.svelte.js-CqGaHRr3.js.map +1 -0
  206. package/build/server/chunks/chunks/{time-range.js-BLMT8aU3.js → time-range.js-__87ZPq6.js} +10 -5
  207. package/build/server/chunks/chunks/time-range.js-__87ZPq6.js.map +1 -0
  208. package/build/server/chunks/entries/endpoints/api/archive/{_server.ts.js-C4hWyXuu.js → _server.ts.js-C6WY-ljy.js} +2 -2
  209. package/build/server/chunks/entries/endpoints/api/archive/{_server.ts.js-C4hWyXuu.js.map → _server.ts.js-C6WY-ljy.js.map} +1 -1
  210. package/build/server/chunks/entries/endpoints/api/log-groups/{_server.ts.js-D4y43Vwe.js → _server.ts.js-DTcVSbpV.js} +2 -2
  211. package/build/server/chunks/entries/endpoints/api/log-groups/{_server.ts.js-D4y43Vwe.js.map → _server.ts.js-DTcVSbpV.js.map} +1 -1
  212. package/build/server/chunks/entries/endpoints/api/series/{_server.ts.js-DibT3Hjc.js → _server.ts.js-CzJ_bXh8.js} +4 -4
  213. package/build/server/chunks/entries/endpoints/api/series/{_server.ts.js-DibT3Hjc.js.map → _server.ts.js-CzJ_bXh8.js.map} +1 -1
  214. package/build/server/chunks/entries/endpoints/api/stream/{_server.ts.js-BxXw5K0R.js → _server.ts.js-U2naV16N.js} +211 -48
  215. package/build/server/chunks/entries/endpoints/api/stream/_server.ts.js-U2naV16N.js.map +1 -0
  216. package/build/server/chunks/entries/fallbacks/{error.svelte.js-ylsqA41Y.js → error.svelte.js-ClTGKP0-.js} +6 -6
  217. package/build/server/chunks/entries/fallbacks/{error.svelte.js-ylsqA41Y.js.map → error.svelte.js-ClTGKP0-.js.map} +1 -1
  218. package/build/server/chunks/entries/pages/_layout.svelte.js-DNuWb03K.js +622 -0
  219. package/build/server/chunks/entries/pages/_layout.svelte.js-DNuWb03K.js.map +1 -0
  220. package/build/server/chunks/entries/pages/{_page.svelte.js-C9-7d7mD.js → _page.svelte.js-CVlL2UsO.js} +329 -188
  221. package/build/server/chunks/entries/pages/_page.svelte.js-CVlL2UsO.js.map +1 -0
  222. package/build/server/chunks/{handler-Bqo8aDgP.js → handler-CrpvMheE.js} +3 -3
  223. package/build/server/chunks/{handler-Bqo8aDgP.js.map → handler-CrpvMheE.js.map} +1 -1
  224. package/build/server/chunks/{index.js-fPvMujCL.js → index.js-9Dk7Q13E.js} +3 -3
  225. package/build/server/chunks/{index.js-fPvMujCL.js.map → index.js-9Dk7Q13E.js.map} +1 -1
  226. package/build/server/chunks/{manifest.js-Bkj-8GaD.js → manifest.js-DIaODzKX.js} +9 -9
  227. package/build/server/chunks/{manifest.js-Bkj-8GaD.js.map → manifest.js-DIaODzKX.js.map} +1 -1
  228. package/build/server/chunks/nodes/0.js-CQ960AOW.js +9 -0
  229. package/build/server/chunks/nodes/0.js-CQ960AOW.js.map +1 -0
  230. package/build/server/chunks/nodes/1.js-CtTei4sV.js +9 -0
  231. package/build/server/chunks/nodes/{1.js-DZXnUx67.js.map → 1.js-CtTei4sV.js.map} +1 -1
  232. package/build/server/chunks/nodes/2.js-BbKDb_M6.js +9 -0
  233. package/build/server/chunks/nodes/2.js-BbKDb_M6.js.map +1 -0
  234. package/dist/cli/completions.js +24 -0
  235. package/dist/cli/index.js +144 -3
  236. package/dist/cli/mcp/agents.js +344 -0
  237. package/dist/cli/mcp/backend.js +235 -0
  238. package/dist/cli/mcp/run.js +245 -0
  239. package/dist/cli/mcp/stdio.js +103 -0
  240. package/dist/cli/mcp/tools.js +245 -0
  241. package/dist/cli/options.js +138 -25
  242. package/dist/cli/server.js +28 -0
  243. package/dist/cli/ui.js +20 -1
  244. package/dist/lib/time-range.js +14 -3
  245. package/package.json +8 -2
  246. package/build/client/_app/immutable/assets/0.ChTKqSf6.css +0 -2
  247. package/build/client/_app/immutable/assets/0.ChTKqSf6.css.br +0 -0
  248. package/build/client/_app/immutable/assets/0.ChTKqSf6.css.gz +0 -0
  249. package/build/client/_app/immutable/chunks/0b2v80OK.js.br +0 -0
  250. package/build/client/_app/immutable/chunks/0b2v80OK.js.gz +0 -0
  251. package/build/client/_app/immutable/chunks/5EFAIHuJ.js +0 -1
  252. package/build/client/_app/immutable/chunks/5EFAIHuJ.js.br +0 -0
  253. package/build/client/_app/immutable/chunks/5EFAIHuJ.js.gz +0 -0
  254. package/build/client/_app/immutable/chunks/B15XBe8D.js +0 -1
  255. package/build/client/_app/immutable/chunks/B15XBe8D.js.br +0 -0
  256. package/build/client/_app/immutable/chunks/B15XBe8D.js.gz +0 -0
  257. package/build/client/_app/immutable/chunks/B5RiPG8Z.js.br +0 -2
  258. package/build/client/_app/immutable/chunks/B5RiPG8Z.js.gz +0 -0
  259. package/build/client/_app/immutable/chunks/B_KVdCQT.js +0 -10
  260. package/build/client/_app/immutable/chunks/B_KVdCQT.js.br +0 -0
  261. package/build/client/_app/immutable/chunks/B_KVdCQT.js.gz +0 -0
  262. package/build/client/_app/immutable/chunks/BuCpRsEL.js +0 -1
  263. package/build/client/_app/immutable/chunks/BuCpRsEL.js.br +0 -0
  264. package/build/client/_app/immutable/chunks/BuCpRsEL.js.gz +0 -0
  265. package/build/client/_app/immutable/chunks/BvZtsVvW.js +0 -1
  266. package/build/client/_app/immutable/chunks/BvZtsVvW.js.br +0 -0
  267. package/build/client/_app/immutable/chunks/BvZtsVvW.js.gz +0 -0
  268. package/build/client/_app/immutable/chunks/C3Y15ONf.js +0 -2
  269. package/build/client/_app/immutable/chunks/C3Y15ONf.js.br +0 -0
  270. package/build/client/_app/immutable/chunks/C3Y15ONf.js.gz +0 -0
  271. package/build/client/_app/immutable/chunks/C9GPQYs7.js +0 -1
  272. package/build/client/_app/immutable/chunks/C9GPQYs7.js.br +0 -0
  273. package/build/client/_app/immutable/chunks/C9GPQYs7.js.gz +0 -0
  274. package/build/client/_app/immutable/chunks/C_U_Jvk5.js.br +0 -0
  275. package/build/client/_app/immutable/chunks/C_U_Jvk5.js.gz +0 -0
  276. package/build/client/_app/immutable/chunks/Cd7JqZj9.js +0 -1
  277. package/build/client/_app/immutable/chunks/Cd7JqZj9.js.br +0 -0
  278. package/build/client/_app/immutable/chunks/Cd7JqZj9.js.gz +0 -0
  279. package/build/client/_app/immutable/chunks/D2PbcyDU.js +0 -1
  280. package/build/client/_app/immutable/chunks/D2PbcyDU.js.br +0 -0
  281. package/build/client/_app/immutable/chunks/D2PbcyDU.js.gz +0 -0
  282. package/build/client/_app/immutable/chunks/D7vimbmk.js.br +0 -0
  283. package/build/client/_app/immutable/chunks/D7vimbmk.js.gz +0 -0
  284. package/build/client/_app/immutable/chunks/DAqXSYzi.js +0 -1
  285. package/build/client/_app/immutable/chunks/DAqXSYzi.js.br +0 -0
  286. package/build/client/_app/immutable/chunks/DAqXSYzi.js.gz +0 -0
  287. package/build/client/_app/immutable/chunks/DGYKsRyW.js.br +0 -0
  288. package/build/client/_app/immutable/chunks/DGYKsRyW.js.gz +0 -0
  289. package/build/client/_app/immutable/chunks/DPaulGql.js +0 -1
  290. package/build/client/_app/immutable/chunks/DPaulGql.js.br +0 -1
  291. package/build/client/_app/immutable/chunks/DPaulGql.js.gz +0 -0
  292. package/build/client/_app/immutable/chunks/DQqLOGLe.js.br +0 -0
  293. package/build/client/_app/immutable/chunks/DQqLOGLe.js.gz +0 -0
  294. package/build/client/_app/immutable/chunks/DS3cLPAu.js.br +0 -0
  295. package/build/client/_app/immutable/chunks/DS3cLPAu.js.gz +0 -0
  296. package/build/client/_app/immutable/chunks/Dkh4Dwm8.js.br +0 -0
  297. package/build/client/_app/immutable/chunks/Dkh4Dwm8.js.gz +0 -0
  298. package/build/client/_app/immutable/chunks/DnqfXHAL.js +0 -15
  299. package/build/client/_app/immutable/chunks/DnqfXHAL.js.br +0 -0
  300. package/build/client/_app/immutable/chunks/DnqfXHAL.js.gz +0 -0
  301. package/build/client/_app/immutable/chunks/DsYron7_.js +0 -1
  302. package/build/client/_app/immutable/chunks/DsYron7_.js.br +0 -0
  303. package/build/client/_app/immutable/chunks/DsYron7_.js.gz +0 -0
  304. package/build/client/_app/immutable/chunks/DuM1cPdZ.js +0 -1
  305. package/build/client/_app/immutable/chunks/DuM1cPdZ.js.br +0 -0
  306. package/build/client/_app/immutable/chunks/DuM1cPdZ.js.gz +0 -0
  307. package/build/client/_app/immutable/chunks/DvxMaQv_.js.br +0 -0
  308. package/build/client/_app/immutable/chunks/DvxMaQv_.js.gz +0 -0
  309. package/build/client/_app/immutable/chunks/DwOZdLDj.js.br +0 -0
  310. package/build/client/_app/immutable/chunks/DwOZdLDj.js.gz +0 -0
  311. package/build/client/_app/immutable/chunks/IlwbfbOu.js.br +0 -0
  312. package/build/client/_app/immutable/chunks/IlwbfbOu.js.gz +0 -0
  313. package/build/client/_app/immutable/chunks/aI_O2VuQ.js.br +0 -0
  314. package/build/client/_app/immutable/chunks/aI_O2VuQ.js.gz +0 -0
  315. package/build/client/_app/immutable/chunks/b77-bq1n.js.br +0 -0
  316. package/build/client/_app/immutable/chunks/b77-bq1n.js.gz +0 -0
  317. package/build/client/_app/immutable/chunks/dqF8mxBW.js.br +0 -0
  318. package/build/client/_app/immutable/chunks/dqF8mxBW.js.gz +0 -0
  319. package/build/client/_app/immutable/chunks/gkAHSOnS.js +0 -1
  320. package/build/client/_app/immutable/chunks/gkAHSOnS.js.br +0 -0
  321. package/build/client/_app/immutable/chunks/gkAHSOnS.js.gz +0 -0
  322. package/build/client/_app/immutable/chunks/pqiPC7Y8.js +0 -3
  323. package/build/client/_app/immutable/chunks/pqiPC7Y8.js.br +0 -0
  324. package/build/client/_app/immutable/chunks/pqiPC7Y8.js.gz +0 -0
  325. package/build/client/_app/immutable/chunks/ti8ecMFX.js +0 -1
  326. package/build/client/_app/immutable/chunks/ti8ecMFX.js.br +0 -0
  327. package/build/client/_app/immutable/chunks/ti8ecMFX.js.gz +0 -0
  328. package/build/client/_app/immutable/entry/app.CTR4aUFT.js +0 -2
  329. package/build/client/_app/immutable/entry/app.CTR4aUFT.js.br +0 -0
  330. package/build/client/_app/immutable/entry/app.CTR4aUFT.js.gz +0 -0
  331. package/build/client/_app/immutable/entry/start.CC6Ln8E2.js +0 -1
  332. package/build/client/_app/immutable/entry/start.CC6Ln8E2.js.br +0 -0
  333. package/build/client/_app/immutable/entry/start.CC6Ln8E2.js.gz +0 -0
  334. package/build/client/_app/immutable/nodes/0.CvUxmLsM.js +0 -1
  335. package/build/client/_app/immutable/nodes/0.CvUxmLsM.js.br +0 -0
  336. package/build/client/_app/immutable/nodes/0.CvUxmLsM.js.gz +0 -0
  337. package/build/client/_app/immutable/nodes/1.CbSHqfEx.js +0 -1
  338. package/build/client/_app/immutable/nodes/1.CbSHqfEx.js.br +0 -0
  339. package/build/client/_app/immutable/nodes/1.CbSHqfEx.js.gz +0 -0
  340. package/build/client/_app/immutable/nodes/2.DcD5v8dU.js +0 -5
  341. package/build/client/_app/immutable/nodes/2.DcD5v8dU.js.br +0 -0
  342. package/build/client/_app/immutable/nodes/2.DcD5v8dU.js.gz +0 -0
  343. package/build/server/chunks/chunks/Points.js-D7ozN9W5.js +0 -14
  344. package/build/server/chunks/chunks/Points.js-D7ozN9W5.js.map +0 -1
  345. package/build/server/chunks/chunks/archive.js-D2jtMmDo.js.map +0 -1
  346. package/build/server/chunks/chunks/index-server.js-CtH9Hqwf.js.map +0 -1
  347. package/build/server/chunks/chunks/legacy-client.js-DAqKExQD.js.map +0 -1
  348. package/build/server/chunks/chunks/time-range.js-BLMT8aU3.js.map +0 -1
  349. package/build/server/chunks/entries/endpoints/api/stream/_server.ts.js-BxXw5K0R.js.map +0 -1
  350. package/build/server/chunks/entries/pages/_layout.svelte.js-D7sAdBVX.js +0 -113
  351. package/build/server/chunks/entries/pages/_layout.svelte.js-D7sAdBVX.js.map +0 -1
  352. package/build/server/chunks/entries/pages/_page.svelte.js-C9-7d7mD.js.map +0 -1
  353. package/build/server/chunks/nodes/0.js-7J6kXnEo.js +0 -9
  354. package/build/server/chunks/nodes/0.js-7J6kXnEo.js.map +0 -1
  355. package/build/server/chunks/nodes/1.js-DZXnUx67.js +0 -9
  356. package/build/server/chunks/nodes/2.js-85y9-1SS.js +0 -9
  357. package/build/server/chunks/nodes/2.js-85y9-1SS.js.map +0 -1
@@ -1,17 +1,68 @@
1
- import { a8 as escape_html, a7 as attr, ac as attr_style, a1 as derived, ad as attr_class, a6 as ensure_array_like, ae as stringify, af as bind_props, ag as clsx } from '../../chunks/index-server.js-CtH9Hqwf.js';
1
+ import { ae as escape_html, ac as attr, ad as attr_class, af as attr_style, a6 as ensure_array_like, ag as stringify, a1 as derived, ah as spread_props, al as bind_props, am as clsx } from '../../chunks/index-server.js-Dsi44azJ.js';
2
2
  import { f as LogStore, g as filterByLevel, h as filterEvents, c as effectiveLevel, t as tokenizeJson, b as detectLevel, j as formatLogMessage, k as eventKey, l as levelColorClass } from '../../chunks/log-buffer.js-A9FA-Qv8.js';
3
3
  import { R as REGION_CODES } from '../../chunks/regions.js-COf7DgnH.js';
4
- import { P as PRESET_LABELS, a as presetLabel, H as HISTORIC_PRESETS, t as toDateTimeLocal, d as describeWindow } from '../../chunks/time-range.js-BLMT8aU3.js';
5
- import { p as page, r as replaceState } from '../../chunks/state.js-i-NVNGIq.js';
4
+ import { P as PRESET_LABELS, a as presetLabel, H as HISTORIC_PRESETS, t as toDateTimeLocal, d as describeWindow } from '../../chunks/time-range.js-__87ZPq6.js';
5
+ import { I as Icon, t as textSize, p as puppy } from '../../chunks/text-size.svelte.js-CqGaHRr3.js';
6
+ import { p as page, r as replaceState } from '../../chunks/state.js-qsHzjuJU.js';
6
7
  import { S as SERIES_LEVEL_COLOR, g as groupByLevel, r as requestRows, a as requestIdOf, c as collectRequests, L as LEVEL_LABELS, i as isMeaningfulBrush, b as requestDurations, d as bucketEvents } from '../../chunks/series-buckets.js-C-vMEJT2.js';
7
8
  import '../../chunks/uneval.js-DaakSYFQ.js';
8
9
  import '../../chunks/shared.js-CgjUIvRK.js';
9
10
  import '../../chunks/exports.js-ClPPfcHj.js';
10
- import '../../chunks/internal2.js-CfVVfAb5.js';
11
- import '../../chunks/legacy-client.js-DAqKExQD.js';
12
- import '../../chunks/events.js-zIVaXIP1.js';
11
+ import '../../chunks/internal2.js-Dm0TlpeP.js';
12
+ import '../../chunks/legacy-client.js-C8Upo6IB.js';
13
+ import '../../chunks/events.js-oxLu7lhH.js';
13
14
  import '../../chunks/utils.js-BIlHjgGW.js';
14
15
 
16
+ //#region node_modules/.pnpm/@lucide+svelte@1.47.0_svelte@5.57.0/node_modules/@lucide/svelte/dist/icons/arrow-right.svelte
17
+ function Arrow_right($$renderer, $$props) {
18
+ let { $$slots, $$events, ...props } = $$props;
19
+ Icon($$renderer, spread_props([props, { icon: {
20
+ "name": "arrow-right",
21
+ "size": 24,
22
+ "node": [["path", { "d": "M5 12h14" }], ["path", { "d": "m12 5 7 7-7 7" }]]
23
+ } }]));
24
+ }
25
+ //#endregion
26
+ //#region node_modules/.pnpm/@lucide+svelte@1.47.0_svelte@5.57.0/node_modules/@lucide/svelte/dist/icons/chevron-down.svelte
27
+ function Chevron_down($$renderer, $$props) {
28
+ let { $$slots, $$events, ...props } = $$props;
29
+ Icon($$renderer, spread_props([props, { icon: {
30
+ "name": "chevron-down",
31
+ "size": 24,
32
+ "node": [["path", { "d": "m6 9 6 6 6-6" }]]
33
+ } }]));
34
+ }
35
+ //#endregion
36
+ //#region node_modules/.pnpm/@lucide+svelte@1.47.0_svelte@5.57.0/node_modules/@lucide/svelte/dist/icons/chevron-left.svelte
37
+ function Chevron_left($$renderer, $$props) {
38
+ let { $$slots, $$events, ...props } = $$props;
39
+ Icon($$renderer, spread_props([props, { icon: {
40
+ "name": "chevron-left",
41
+ "size": 24,
42
+ "node": [["path", { "d": "m15 18-6-6 6-6" }]]
43
+ } }]));
44
+ }
45
+ //#endregion
46
+ //#region node_modules/.pnpm/@lucide+svelte@1.47.0_svelte@5.57.0/node_modules/@lucide/svelte/dist/icons/chevron-right.svelte
47
+ function Chevron_right($$renderer, $$props) {
48
+ let { $$slots, $$events, ...props } = $$props;
49
+ Icon($$renderer, spread_props([props, { icon: {
50
+ "name": "chevron-right",
51
+ "size": 24,
52
+ "node": [["path", { "d": "m9 18 6-6-6-6" }]]
53
+ } }]));
54
+ }
55
+ //#endregion
56
+ //#region node_modules/.pnpm/@lucide+svelte@1.47.0_svelte@5.57.0/node_modules/@lucide/svelte/dist/icons/chevron-up.svelte
57
+ function Chevron_up($$renderer, $$props) {
58
+ let { $$slots, $$events, ...props } = $$props;
59
+ Icon($$renderer, spread_props([props, { icon: {
60
+ "name": "chevron-up",
61
+ "size": 24,
62
+ "node": [["path", { "d": "m18 15-6-6-6 6" }]]
63
+ } }]));
64
+ }
65
+ //#endregion
15
66
  //#region src/lib/format.ts
16
67
  /**
17
68
  * Formatting helpers for the watch-tail UI. Every function here is pure so it can be unit
@@ -159,12 +210,14 @@ function EndpointBadge($$renderer, $$props) {
159
210
  /** `localStorage` keys, prefixed so they are easy to spot in a browser. */
160
211
  var STORAGE_KEYS = {
161
212
  sidebarWidth: "watch-tail:sidebar-width",
213
+ sidebarOpen: "watch-tail:sidebar-open",
162
214
  prefixWidth: "watch-tail:prefix-width",
163
215
  timestampWidth: "watch-tail:timestamp-width",
164
216
  groupWidth: "watch-tail:group-width",
165
217
  wrap: "watch-tail:wrap",
166
218
  jsonView: "watch-tail:json-view",
167
219
  chartOpen: "watch-tail:chart-open",
220
+ logOpen: "watch-tail:log-open",
168
221
  groupRequests: "watch-tail:group-requests"
169
222
  };
170
223
  /** Default width of the group-list pane, in rem (matches the original layout). */
@@ -204,7 +257,7 @@ function EventScatterPanel($$renderer, $$props) {
204
257
  * The real loader: a dynamic import, which is what keeps layerchart out of the
205
258
  * initial bundle. It only runs in the browser, and only once the panel is open.
206
259
  */
207
- const loadChartModule = () => import('../../chunks/EventScatter.js-CO2GonW-.js');
260
+ const loadChartModule = () => import('../../chunks/EventScatter.js-DHlLEn_7.js');
208
261
  /** Bucketed counts for the window. */
209
262
  /** Inclusive start of the window, epoch ms. */
210
263
  /** Inclusive end of the window, epoch ms. */
@@ -214,9 +267,10 @@ function EventScatterPanel($$renderer, $$props) {
214
267
  /** True while the counts are being fetched. */
215
268
  /** Called with the brushed range when the drag ends, or `null` on clear. */
216
269
  /** Chart height in px. */
270
+ /** True to grow into the space its parent gives instead of a fixed height. */
217
271
  /** Start open, which is also what the first visit uses. */
218
272
  /** Chart module loader; defaults to the dynamic import. */
219
- let { metric = "duration", onMetricChange, onSelect, points = [], from = 0, to = 0, bucketMs = 0, groups = [], loading = false, byRequest = true, onBrush, height = 200, open = true, loadChart = loadChartModule } = $$props;
273
+ let { metric = "duration", onMetricChange, onSelect, points = [], from = 0, to = 0, bucketMs = 0, groups = [], loading = false, byRequest = true, onBrush, height = 200, fill = false, open = true, loadChart = loadChartModule } = $$props;
220
274
  let expanded = derived(() => open);
221
275
  /** Totals and labels per level, in severity order. */
222
276
  let levelGroups = derived(() => groupByLevel(points));
@@ -224,54 +278,51 @@ function EventScatterPanel($$renderer, $$props) {
224
278
  let totalEvents = derived(() => levelGroups().reduce((sum, entry) => sum + entry.events, 0));
225
279
  /** Buckets drawn. */
226
280
  let bucketCount = derived(() => new Set(points.map((point) => point.t)).size);
227
- /** True when there is something to draw. */
228
- let hasPoints = derived(() => points.length > 0);
229
281
  /** What one mark stands for, which is what the totals count. */
230
282
  let unit = derived(() => metric === "duration" || byRequest ? "requests" : "events");
231
283
  /** Clears the brush, for the host's Reset zoom control. */
232
284
  function reset() {
233
285
  onBrush?.(null);
234
286
  }
235
- $$renderer.push(`<section class="flex min-w-0 shrink-0 flex-col gap-1 rounded-lg border border-neutral-800 bg-neutral-950/60 p-2" data-testid="event-scatter"${attr("aria-label", metric === "duration" ? "Request duration over time" : "Events over time")}><div class="flex flex-wrap items-center gap-x-3 gap-y-1 px-1 text-[0.6875rem]"><button type="button"${attr("aria-expanded", expanded())}${attr("title", expanded() ? "Hide the chart" : "Show the chart")} data-testid="scatter-toggle" class="flex items-center gap-1 rounded-md border border-neutral-800 bg-neutral-900 px-2 py-0.5 font-semibold uppercase tracking-wider text-neutral-400 transition-colors hover:border-neutral-700 hover:text-neutral-200"><span aria-hidden="true">${escape_html(expanded() ? "▾" : "▸")}</span> ${escape_html(metric === "duration" ? "Request duration" : "Events over time")}</button> <div role="group" aria-label="Chart metric" class="flex rounded-md border border-neutral-800 p-0.5"><!--[-->`);
236
- const each_array = ensure_array_like(["count", "duration"]);
237
- for (let $$index = 0, $$length = each_array.length; $$index < $$length; $$index++) {
238
- let choice = each_array[$$index];
239
- $$renderer.push(`<button type="button"${attr("data-testid", `chart-metric-${choice}`)}${attr("aria-pressed", metric === choice)}${attr_class(`rounded px-2 py-0.5 transition-colors ${metric === choice ? "bg-sky-950 text-sky-300" : "text-neutral-400 hover:text-neutral-200"}`)}>${escape_html(choice === "count" ? "Count" : "Duration (ms)")}</button>`);
287
+ $$renderer.push(`<section${attr_class(`flex min-w-0 flex-col border-b border-neutral-800 bg-neutral-950/60 ${fill && expanded() ? "min-h-0 flex-1" : "shrink-0"}`)} data-testid="event-scatter"${attr("aria-label", metric === "duration" ? "Request duration over time" : "Events over time")}><div class="flex min-h-9 flex-none flex-wrap items-center gap-x-3 gap-y-1 border-b border-neutral-800 bg-neutral-900/40 px-3 py-1.5 text-[0.6875rem]"><button type="button"${attr("aria-expanded", expanded())}${attr("title", expanded() ? "Hide the chart" : "Show the chart")} data-testid="scatter-toggle" class="flex items-center gap-1 text-sm font-semibold text-neutral-200 transition-colors hover:text-sky-300">`);
288
+ if (expanded()) {
289
+ $$renderer.push("<!--[0-->");
290
+ Chevron_down($$renderer, { size: "1em" });
291
+ } else {
292
+ $$renderer.push("<!--[-1-->");
293
+ Chevron_right($$renderer, { size: "1em" });
240
294
  }
241
- $$renderer.push(`<!--]--></div> <span class="text-neutral-400" data-testid="scatter-summary">${escape_html(formatCount(totalEvents()))}
242
- ${escape_html(unit())}`);
243
- if (metric === "count") $$renderer.push(`<!--[0--> in ${escape_html(formatCount(bucketCount()))} buckets`);
244
- else $$renderer.push("<!--[-1-->");
245
- $$renderer.push(`<!--]--></span> `);
295
+ $$renderer.push(`<!--]--> Chart - ${escape_html(metric === "duration" ? "Request duration" : "Events over time")}</button> `);
246
296
  if (groups.length > 1) $$renderer.push(`<!--[0--><span class="text-neutral-500" data-testid="scatter-groups">across ${escape_html(groups.length)} groups</span>`);
247
297
  else $$renderer.push("<!--[-1-->");
248
298
  $$renderer.push(`<!--]--> <!--[-->`);
249
- const each_array_1 = ensure_array_like(levelGroups());
250
- for (let $$index_1 = 0, $$length = each_array_1.length; $$index_1 < $$length; $$index_1++) {
251
- let entry = each_array_1[$$index_1];
299
+ const each_array = ensure_array_like(levelGroups());
300
+ for (let $$index = 0, $$length = each_array.length; $$index < $$length; $$index++) {
301
+ let entry = each_array[$$index];
252
302
  $$renderer.push(`<span class="flex items-center gap-1 text-neutral-400"${attr("data-testid", `scatter-legend-${stringify(entry.level)}`)}><span class="inline-block h-2 w-2 rounded-full"${attr_style(`background-color: ${stringify(SERIES_LEVEL_COLOR[entry.level])}`)}></span> ${escape_html(entry.label)} <span class="text-neutral-500">${escape_html(formatCount(entry.events))}</span></span>`);
253
303
  }
254
304
  $$renderer.push(`<!--]--> `);
255
305
  if (loading && expanded()) $$renderer.push(`<!--[0--><span class="text-amber-300" data-testid="scatter-loading">loading…</span>`);
256
306
  else $$renderer.push("<!--[-1-->");
257
- $$renderer.push(`<!--]--> `);
307
+ $$renderer.push(`<!--]--> <span class="ml-auto text-neutral-400" data-testid="scatter-summary">${escape_html(formatCount(totalEvents()))}
308
+ ${escape_html(unit())}`);
309
+ if (metric === "count") $$renderer.push(`<!--[0--> in ${escape_html(formatCount(bucketCount()))} buckets`);
310
+ else $$renderer.push("<!--[-1-->");
311
+ $$renderer.push(`<!--]--></span></div> `);
258
312
  if (expanded()) {
259
- $$renderer.push("<!--[0-->");
313
+ $$renderer.push(`<!--[0--><div${attr_class(`flex flex-col gap-1 p-2 ${fill ? "min-h-0 flex-1" : ""}`)}><div class="flex flex-wrap items-center gap-x-3 gap-y-1 text-[0.6875rem]"><div role="group" aria-label="Chart metric" class="flex rounded-md border border-neutral-800 p-0.5"><!--[-->`);
314
+ const each_array_1 = ensure_array_like(["count", "duration"]);
315
+ for (let $$index_1 = 0, $$length = each_array_1.length; $$index_1 < $$length; $$index_1++) {
316
+ let choice = each_array_1[$$index_1];
317
+ $$renderer.push(`<button type="button"${attr("data-testid", `chart-metric-${choice}`)}${attr("aria-pressed", metric === choice)}${attr_class(`rounded px-2 py-0.5 transition-colors ${metric === choice ? "bg-sky-950 text-sky-300" : "text-neutral-400 hover:text-neutral-200"}`)}>${escape_html(choice === "count" ? "Count" : "Duration (ms)")}</button>`);
318
+ }
319
+ $$renderer.push(`<!--]--></div> `);
260
320
  $$renderer.push(`<!--[-1--><span class="ml-auto text-neutral-500" data-testid="scatter-hint">select a point to show logs · drag to zoom · click background to clear</span>`);
261
- $$renderer.push(`<!--]-->`);
262
- } else $$renderer.push("<!--[-1-->");
263
- $$renderer.push(`<!--]--></div> `);
264
- if (expanded()) {
265
- $$renderer.push("<!--[0-->");
321
+ $$renderer.push(`<!--]--></div> <div${attr_class(`relative overflow-hidden ${fill ? "min-h-0 flex-1" : ""}`)}${attr_style(fill ? void 0 : `height: ${height}px`)} data-testid="chart-body">`);
322
+ $$renderer.push(`<!--[-1--><div${attr_class(`w-full animate-pulse rounded bg-neutral-900/60 ${fill ? "h-full" : ""}`)}${attr_style(fill ? void 0 : `height: ${height}px`)}></div>`);
323
+ $$renderer.push(`<!--]--></div> `);
266
324
  if (metric === "duration") $$renderer.push(`<!--[0--><p class="px-1 text-[0.6875rem] text-neutral-500" data-testid="duration-note">Observed duration (ms) · last event + its duration − first event · partial requests may
267
- appear shorter</p>`);
268
- else $$renderer.push("<!--[-1-->");
269
- $$renderer.push(`<!--]--> <div class="overflow-hidden"${attr_style(`height: ${stringify(height)}px`)} data-testid="chart-body">`);
270
- if (hasPoints()) {
271
- $$renderer.push("<!--[1-->");
272
- $$renderer.push(`<!--[-1--><div class="w-full animate-pulse rounded bg-neutral-900/60"${attr_style(`height: ${stringify(height)}px`)}></div>`);
273
- $$renderer.push(`<!--]-->`);
274
- } else if (!loading) $$renderer.push(`<!--[2--><p class="px-1 py-6 text-xs text-neutral-500" data-testid="scatter-empty">${escape_html(metric === "duration" ? "No requests with a request ID in this window yet." : "No events in this window yet.")}</p>`);
325
+ appear shorter</p>`);
275
326
  else $$renderer.push("<!--[-1-->");
276
327
  $$renderer.push(`<!--]--></div>`);
277
328
  } else $$renderer.push("<!--[-1-->");
@@ -310,8 +361,12 @@ function RangeControls($$renderer, $$props) {
310
361
  /** True when the source cannot follow live events, such as the local archive. */
311
362
  /** Called when the user switches mode or applies a range. */
312
363
  let { mode = "live", range = "15m", from = null, to = null, disabled = false, loading = false, liveDisabled = false} = $$props;
313
- /** Label shown on the custom chip. */
314
- let customLabel = derived(() => mode === "historic" && range === "" && from !== null && to !== null ? `${toDateTimeLocal(from).replace("T", " ")} → ${toDateTimeLocal(to).replace("T", " ")}` : "Custom…");
364
+ /** True when the custom chip stands for an explicit window with both bounds. */
365
+ let customActive = derived(() => mode === "historic" && range === "" && from !== null && to !== null);
366
+ /** Start bound on the custom chip, formatted for display. */
367
+ let customFromLabel = derived(() => from === null ? "" : toDateTimeLocal(from).replace("T", " "));
368
+ /** End bound on the custom chip, formatted for display. */
369
+ let customToLabel = derived(() => to === null ? "" : toDateTimeLocal(to).replace("T", " "));
315
370
  $$renderer.push(`<div class="flex flex-wrap items-center gap-2" data-testid="range-controls"><div class="flex items-center gap-1 rounded-lg border border-neutral-800 bg-neutral-900 p-0.5" role="group" aria-label="Tail mode"><button type="button"${attr("aria-pressed", mode === "live")}${attr("disabled", liveDisabled, true)}${attr("title", liveDisabled ? "There is nothing to tail: the local archive holds historic windows" : void 0)} data-testid="mode-live"${attr_class(`rounded-md border px-2 py-1 text-xs font-medium transition-colors disabled:cursor-not-allowed disabled:opacity-50 ${mode === "live" ? "border-sky-700 bg-sky-950/60 text-sky-300" : "border-transparent text-neutral-400 hover:text-neutral-200"} disabled:opacity-40`)}>Live</button> <button type="button"${attr("aria-pressed", mode === "historic")} data-testid="mode-historic"${attr_class(`rounded-md border px-2 py-1 text-xs font-medium transition-colors disabled:cursor-not-allowed disabled:opacity-50 ${mode === "historic" ? "border-amber-700 bg-amber-950/50 text-amber-300" : "border-transparent text-neutral-400 hover:text-neutral-200"}`)}>Historic</button></div> `);
316
371
  if (mode === "historic") {
317
372
  $$renderer.push(`<!--[0--><div class="flex flex-wrap items-center gap-1" role="group" aria-label="Historic range"><!--[-->`);
@@ -320,7 +375,13 @@ function RangeControls($$renderer, $$props) {
320
375
  let preset = each_array[$$index];
321
376
  $$renderer.push(`<button type="button"${attr("aria-pressed", range === preset)}${attr("data-testid", `preset-${stringify(preset)}`)}${attr("disabled", disabled, true)}${attr_class(`rounded-md border px-2 py-1 text-xs font-medium transition-colors disabled:cursor-not-allowed disabled:opacity-50 ${range === preset ? "border-amber-700 bg-amber-950/50 text-amber-200" : "border-neutral-800 bg-neutral-900 text-neutral-300 hover:border-neutral-700"} disabled:opacity-40`)}>${escape_html(PRESET_LABELS[preset])}</button>`);
322
377
  }
323
- $$renderer.push(`<!--]--> <button type="button"${attr("aria-pressed", range === "")} data-testid="preset-custom"${attr("disabled", disabled, true)}${attr_class(`rounded-md border px-2 py-1 text-xs font-medium transition-colors disabled:cursor-not-allowed disabled:opacity-50 ${range === "" ? "border-amber-700 bg-amber-950/50 text-amber-200" : "border-neutral-800 bg-neutral-900 text-neutral-300 hover:border-neutral-700"}`)}>${escape_html(customLabel())}</button></div>`);
378
+ $$renderer.push(`<!--]--> <button type="button"${attr("aria-pressed", range === "")} data-testid="preset-custom"${attr("disabled", disabled, true)}${attr_class(`rounded-md border px-2 py-1 text-xs font-medium transition-colors disabled:cursor-not-allowed disabled:opacity-50 ${range === "" ? "border-amber-700 bg-amber-950/50 text-amber-200" : "border-neutral-800 bg-neutral-900 text-neutral-300 hover:border-neutral-700"}`)}>`);
379
+ if (customActive()) {
380
+ $$renderer.push(`<!--[0--><span class="inline-flex items-center gap-1"><span>${escape_html(customFromLabel())}</span> `);
381
+ Arrow_right($$renderer, { size: "1em" });
382
+ $$renderer.push(`<!----> <span>${escape_html(customToLabel())}</span></span>`);
383
+ } else $$renderer.push(`<!--[-1-->Custom…`);
384
+ $$renderer.push(`<!--]--></button></div>`);
324
385
  } else $$renderer.push("<!--[-1-->");
325
386
  $$renderer.push(`<!--]--> `);
326
387
  if (loading) $$renderer.push(`<!--[0--><span class="text-xs text-amber-300" data-testid="range-loading">loading window…</span>`);
@@ -526,7 +587,7 @@ function LogGroupList($$renderer, $$props) {
526
587
  function rowTone(name) {
527
588
  return isSelected(name) ? "border-sky-800 bg-sky-950/50 text-sky-200" : "border-transparent bg-neutral-900/60 text-neutral-300 hover:border-neutral-800 hover:text-neutral-100";
528
589
  }
529
- $$renderer.push(`<section class="flex min-h-0 flex-1 flex-col gap-3"><div class="flex items-center justify-between gap-2"><div class="flex items-baseline gap-2"><h2 class="text-sm font-semibold text-neutral-200">${escape_html(archived() ? "Archived groups" : "Log groups")}</h2> <span class="text-xs text-neutral-500" data-testid="group-count">${escape_html(formatCount(filtered().length))} of ${escape_html(formatCount(groups.length))}</span> `);
590
+ $$renderer.push(`<section class="flex min-h-0 flex-1 flex-col gap-3"><div class="flex items-center justify-between gap-2"><div class="flex items-baseline gap-2"><span class="text-xs text-neutral-500" data-testid="group-count">${escape_html(formatCount(filtered().length))} of ${escape_html(formatCount(groups.length))}</span> `);
530
591
  if (activeSelection().length > 1) $$renderer.push(`<!--[0--><span class="text-xs font-medium text-sky-400" data-testid="selected-count">${escape_html(formatCount(activeSelection().length))} selected</span>`);
531
592
  else $$renderer.push("<!--[-1-->");
532
593
  $$renderer.push(`<!--]--> `);
@@ -545,17 +606,17 @@ function LogGroupList($$renderer, $$props) {
545
606
  } else if (groups.length === 0) $$renderer.push(`<!--[2--><p data-testid="group-empty" class="rounded-md border border-neutral-800 bg-neutral-900/60 px-3 py-2 text-xs leading-5 text-neutral-400">${escape_html(archived() ? noArchivedGroupsMessage(region) : noGroupsMessage(region))}</p>`);
546
607
  else if (visible().length === 0) $$renderer.push(`<!--[3--><p data-testid="group-no-match" class="px-1 py-2 text-xs text-neutral-500">No log groups match “${escape_html(query())}”.</p>`);
547
608
  else {
548
- $$renderer.push(`<!--[-1--><ul class="flex min-h-0 flex-1 flex-col gap-1 overflow-y-auto pr-1"><!--[-->`);
609
+ $$renderer.push(`<!--[-1--><ul class="@container flex min-h-0 flex-1 flex-col gap-1 overflow-y-auto pr-1"><!--[-->`);
549
610
  const each_array_1 = ensure_array_like(visible());
550
611
  for (let $$index_1 = 0, $$length = each_array_1.length; $$index_1 < $$length; $$index_1++) {
551
612
  let group = each_array_1[$$index_1];
552
- $$renderer.push(`<li class="flex items-center gap-1.5"><input type="checkbox"${attr("data-testid", `group-check-${stringify(group.name)}`)}${attr("aria-label", `Include ${group.name} in the selection`)}${attr("checked", isSelected(group.name), true)} class="size-3.5 shrink-0 cursor-pointer accent-sky-500"/> <button type="button" data-testid="group-row"${attr("data-group-name", group.name)}${attr("aria-label", group.name)}${attr("title", group.name)}${attr("aria-current", isSelected(group.name) ? "true" : void 0)}${attr_class(`flex min-w-0 flex-1 items-center justify-between gap-2 rounded-md border px-2.5 py-1.5 text-left text-xs transition-colors ${stringify(rowTone(group.name))}`)}><span class="min-w-0 flex-1 overflow-hidden whitespace-nowrap font-mono" aria-hidden="true">${escape_html(group.name)}</span> `);
613
+ $$renderer.push(`<li class="flex items-center gap-1.5"><input type="checkbox"${attr("data-testid", `group-check-${stringify(group.name)}`)}${attr("aria-label", `Include ${group.name} in the selection`)}${attr("checked", isSelected(group.name), true)} class="size-3.5 shrink-0 cursor-pointer accent-sky-500"/> <button type="button" data-testid="group-row"${attr("data-group-name", group.name)}${attr("aria-label", group.name)}${attr("title", group.name)}${attr("aria-current", isSelected(group.name) ? "true" : void 0)}${attr_class(`flex min-w-0 flex-1 items-center justify-between gap-2 rounded-md border px-2.5 py-1.5 text-left text-xs transition-colors ${stringify(rowTone(group.name))}`)}><span class="min-w-16 flex-1 overflow-hidden whitespace-nowrap font-mono" aria-hidden="true">${escape_html(group.name)}</span> `);
553
614
  if (archived()) {
554
615
  $$renderer.push(`<!--[0--><span class="flex shrink-0 items-center gap-1.5">`);
555
616
  if (archivedCount(group) !== null) $$renderer.push(`<!--[0--><span data-testid="group-archived-count"${attr("title", archivedSpan(group) ?? "Events held in the local DuckDB archive")} class="rounded-full border border-teal-900 bg-teal-950/50 px-1.5 py-0.5 text-[0.625rem] font-medium text-teal-300">${escape_html(archivedCount(group))}</span>`);
556
617
  else $$renderer.push("<!--[-1-->");
557
618
  $$renderer.push(`<!--]--> `);
558
- if (archivedSpan(group) !== null) $$renderer.push(`<!--[0--><span class="hidden text-[0.6875rem] text-neutral-500 xl:inline" data-testid="group-archived-span">${escape_html(archivedSpan(group))}</span>`);
619
+ if (archivedSpan(group) !== null) $$renderer.push(`<!--[0--><span class="hidden text-[0.6875rem] text-neutral-500 @2xl:inline" data-testid="group-archived-span">${escape_html(archivedSpan(group))}</span>`);
559
620
  else $$renderer.push("<!--[-1-->");
560
621
  $$renderer.push(`<!--]--></span>`);
561
622
  } else if (group.storedBytes !== void 0) $$renderer.push(`<!--[1--><span class="shrink-0 text-[0.6875rem] text-neutral-500">${escape_html(formatBytes(group.storedBytes))}</span>`);
@@ -657,11 +718,13 @@ function LogViewer($$renderer, $$props) {
657
718
  * default, and owned by the page so the chart counts the same requests.
658
719
  */
659
720
  /** Called when the grouping toggle is pressed. */
660
- let { selection = null, onSelectionClear, lines = [], status = "idle", error = null, region = "", group = null, filter = "", paused = false, autoScroll = true, pendingCount = 0, droppedCount = 0, receivedCount = 0, mode = "live", ready = null, endReason = null, archivePath = null, groups = [], level = void 0, onLevelChange, groupRequests = true, onGroupToggle, onFilterChange, onPauseToggle, onClear, onAutoScrollToggle } = $$props;
721
+ /** True while the lines are shown; collapsed, the viewer keeps only its header. */
722
+ /** Called when the header's collapse toggle is pressed. */
723
+ let { selection = null, onSelectionClear, lines = [], status = "idle", error = null, region = "", group = null, filter = "", paused = false, autoScroll = true, pendingCount = 0, droppedCount = 0, receivedCount = 0, mode = "live", ready = null, endReason = null, archivePath = null, groups = [], level = void 0, onLevelChange, groupRequests = true, onGroupToggle, open = true, onToggle, onFilterChange, onPauseToggle, onClear, onAutoScrollToggle } = $$props;
661
724
  let timestampPx = remToPx(7.5);
662
725
  let groupPx = 144;
663
- const ROW_PADDING_PX = remToPx(.75);
664
- const ROW_GAP_PX = remToPx(.5);
726
+ let rowPaddingPx = derived(() => remToPx(.75, textSize.rootFontPx));
727
+ let rowGapPx = derived(() => remToPx(.5, textSize.rootFontPx));
665
728
  const PREFIX_MIN_PX = remToPx(PREFIX_WIDTH.minRem);
666
729
  const PREFIX_MAX_PX = remToPx(PREFIX_WIDTH.maxRem);
667
730
  const PREFIX_DEFAULT_PX = remToPx(PREFIX_WIDTH.defaultRem);
@@ -859,7 +922,7 @@ function LogViewer($$renderer, $$props) {
859
922
  /** Message cell: wrapped text or a single long line that scrolls sideways. */
860
923
  let messageClass = derived(() => "whitespace-pre");
861
924
  /** Left edge of the prefix resize handle, in pixels from the scrolled content edge. */
862
- let handleLeft = derived(() => ROW_PADDING_PX + timestampPx + ROW_GAP_PX + (groups.length > 1 ? groupPx + ROW_GAP_PX : 0) + prefixPx);
925
+ let handleLeft = derived(() => rowPaddingPx() + timestampPx + rowGapPx() + (groups.length > 1 ? groupPx + rowGapPx() : 0) + prefixPx);
863
926
  /** Prefix column width as a CSS length. */
864
927
  let prefixStyle = derived(() => `width: ${prefixPx}px`);
865
928
  /** Rows the user has opened, keyed by row key. */
@@ -884,7 +947,15 @@ function LogViewer($$renderer, $$props) {
884
947
  function savePrefixWidth() {
885
948
  writePref(STORAGE_KEYS.prefixWidth, String(Math.round(prefixPx)));
886
949
  }
887
- $$renderer.push(`<section class="flex min-h-0 min-w-0 flex-1 flex-col overflow-hidden rounded-lg border border-neutral-800 bg-neutral-950"><div class="flex flex-wrap items-center gap-x-3 gap-y-2 border-b border-neutral-800 bg-neutral-900/40 px-3 py-2">`);
950
+ $$renderer.push(`<section${attr_class(`flex min-h-0 min-w-0 flex-col overflow-hidden bg-neutral-950 ${open ? "flex-1" : "flex-none"}`)}><div class="flex min-h-9 flex-none flex-wrap items-center gap-x-3 gap-y-2 border-b border-neutral-800 bg-neutral-900/40 px-3 py-1"><button type="button"${attr("aria-expanded", open)}${attr("title", open ? "Hide the log lines" : "Show the log lines")} data-testid="log-toggle" class="flex items-center gap-1 text-sm font-semibold text-neutral-200 transition-colors hover:text-sky-300">`);
951
+ if (open) {
952
+ $$renderer.push("<!--[0-->");
953
+ Chevron_down($$renderer, { size: "1em" });
954
+ } else {
955
+ $$renderer.push("<!--[-1-->");
956
+ Chevron_right($$renderer, { size: "1em" });
957
+ }
958
+ $$renderer.push(`<!--]--> Log lines</button> <div class="ml-auto flex flex-wrap items-center gap-x-3 gap-y-1">`);
888
959
  StatusBadge($$renderer, { status: displayStatus() });
889
960
  $$renderer.push(`<!----> `);
890
961
  if (archived()) $$renderer.push(`<!--[0--><span data-testid="archive-badge"${attr("title", archiveTitle())} class="rounded-full border border-teal-900 bg-teal-950/60 px-2 py-0.5 text-[0.6875rem] font-medium text-teal-300">local archive</span>`);
@@ -898,144 +969,187 @@ function LogViewer($$renderer, $$props) {
898
969
  $$renderer.push(`<!--]--> `);
899
970
  if (droppedCount > 0) $$renderer.push(`<!--[0--><span class="text-xs text-amber-300/80" data-testid="dropped-count">${escape_html(formatCount(droppedCount))} dropped</span>`);
900
971
  else $$renderer.push("<!--[-1-->");
901
- $$renderer.push(`<!--]--> <span${attr_class(`rounded-full border px-2 py-0.5 text-[0.6875rem] font-medium ${windowSummary().mode === "historic" ? "border-amber-900 bg-amber-950/40 text-amber-300" : "border-neutral-800 bg-neutral-900 text-neutral-400"}`)}${attr("title", windowSummary().title)} data-testid="window-chip">${escape_html(windowSummary().label)}</span> `);
972
+ $$renderer.push(`<!--]--> <span${attr_class(`inline-flex items-center gap-1 rounded-full border px-2 py-0.5 text-[0.6875rem] font-medium ${windowSummary().mode === "historic" ? "border-amber-900 bg-amber-950/40 text-amber-300" : "border-neutral-800 bg-neutral-900 text-neutral-400"}`)}${attr("title", windowSummary().title)} data-testid="window-chip">`);
973
+ if (windowSummary().mode === "live") $$renderer.push(`<!--[0--><span>live</span>`);
974
+ else {
975
+ $$renderer.push("<!--[-1-->");
976
+ if (windowSummary().preset !== null) $$renderer.push(`<!--[0--><span>${escape_html(windowSummary().preset)} ·</span>`);
977
+ else $$renderer.push("<!--[-1-->");
978
+ $$renderer.push(`<!--]--> <span>${escape_html(windowSummary().from)}</span> `);
979
+ Arrow_right($$renderer, { size: "1em" });
980
+ $$renderer.push(`<!----> <span>${escape_html(windowSummary().to)}</span>`);
981
+ }
982
+ $$renderer.push(`<!--]--></span> `);
902
983
  if (windowSummary().clamped) $$renderer.push(`<!--[0--><span class="text-[0.6875rem] text-amber-400/80" data-testid="window-clamped">14-day limit</span>`);
903
984
  else $$renderer.push("<!--[-1-->");
904
985
  $$renderer.push(`<!--]--> `);
905
986
  if (windowComplete()) $$renderer.push(`<!--[0--><span class="text-[0.6875rem] text-emerald-400/80" data-testid="window-complete">window complete</span>`);
906
987
  else $$renderer.push("<!--[-1-->");
907
- $$renderer.push(`<!--]--> <div class="ml-auto flex flex-wrap items-center gap-2"><div class="flex items-center gap-1" role="group" aria-label="Filter by level"><button type="button"${attr("aria-pressed", levelFilter() === null)} title="Show every level, including lines with no level" data-testid="level-all"${attr_class(`rounded-md border px-2 py-1 text-xs font-medium transition-colors hover:border-neutral-700 ${levelFilter() === null ? "border-sky-700 bg-sky-950/60 text-sky-200" : "border-neutral-800 bg-neutral-900 text-neutral-400 hover:border-neutral-700"}`)}>All</button> <!--[-->`);
908
- const each_array = ensure_array_like(LEVEL_CHIPS);
909
- for (let $$index = 0, $$length = each_array.length; $$index < $$length; $$index++) {
910
- let chip = each_array[$$index];
911
- $$renderer.push(`<button type="button"${attr("aria-pressed", levelFilter() === chip.level)}${attr("title", `Show only ${stringify(chip.label)} lines (${stringify(levelCounts()[chip.level] ?? 0)} loaded)`)}${attr("data-testid", `level-${stringify(chip.level)}`)}${attr_class(`rounded-md border px-2 py-1 text-xs font-medium transition-colors hover:border-neutral-700 ${stringify(levelFilter() === chip.level ? chip.activeClass : "border-neutral-800 bg-neutral-900 text-neutral-400 hover:border-neutral-700")}`)}>${escape_html(chip.label)} `);
912
- if ((levelCounts()[chip.level] ?? 0) > 0) $$renderer.push(`<!--[0--><span class="ml-1 opacity-70">${escape_html(formatCount(levelCounts()[chip.level] ?? 0))}</span>`);
913
- else $$renderer.push("<!--[-1-->");
914
- $$renderer.push(`<!--]--></button>`);
915
- }
916
- $$renderer.push(`<!--]--></div> <input type="search" aria-label="Filter log lines" placeholder="Filter lines"${attr("value", filter)} class="w-40 rounded-md border border-neutral-800 bg-neutral-900 px-2 py-1 text-xs text-neutral-100 outline-none transition-colors placeholder:text-neutral-600 hover:border-neutral-700 focus:border-sky-600"/> <button type="button"${attr("aria-pressed", wrapLines)} title="Wrap long lines instead of scrolling sideways" data-testid="wrap-toggle"${attr_class(`rounded-md border border-neutral-800 bg-neutral-900 px-2 py-1 text-xs font-medium transition-colors hover:border-neutral-700 ${wrapTone()}`)}>Wrap</button> <button type="button"${attr("aria-pressed", jsonView)} title="Pretty-print JSON log entries (off: click a line to open its JSON)" data-testid="json-toggle"${attr_class(`rounded-md border border-neutral-800 bg-neutral-900 px-2 py-1 text-xs font-medium transition-colors hover:border-neutral-700 ${jsonTone()}`)}>JSON</button> <button type="button"${attr("aria-pressed", groupRequests)} title="Group the lines of one request into a single row, coloured by its most critical line (off: one row per line)" data-testid="group-toggle"${attr_class(`rounded-md border border-neutral-800 bg-neutral-900 px-2 py-1 text-xs font-medium transition-colors hover:border-neutral-700 ${groupTone()}`)}>By request</button> <button type="button"${attr("aria-pressed", paused)} class="rounded-md border border-neutral-800 bg-neutral-900 px-2 py-1 text-xs font-medium text-neutral-300 transition-colors hover:border-neutral-700 hover:text-neutral-100">${escape_html(paused ? "Resume" : "Pause")}</button> <button type="button" class="rounded-md border border-neutral-800 bg-neutral-900 px-2 py-1 text-xs font-medium text-neutral-300 transition-colors hover:border-neutral-700 hover:text-neutral-100">Clear</button> <button type="button"${attr("aria-pressed", autoScroll)}${attr_class(`rounded-md border border-neutral-800 bg-neutral-900 px-2 py-1 text-xs font-medium transition-colors hover:border-neutral-700 ${autoScrollTone()}`)}>Auto-scroll</button></div></div> `);
917
- if (errorText() !== null) $$renderer.push(`<!--[0--><p role="alert" data-testid="stream-error" class="border-b border-red-900 bg-red-950/50 px-3 py-2 text-xs leading-5 text-red-300">${escape_html(errorText())}</p>`);
918
- else $$renderer.push("<!--[-1-->");
919
- $$renderer.push(`<!--]--> `);
920
- if (selection !== null) {
921
- $$renderer.push(`<!--[0--><div class="flex items-center gap-2 px-3 py-1 text-xs text-sky-300" role="status" data-testid="chart-selection-status">`);
922
- if (selectedEvents().size === 0) $$renderer.push(`<!--[0-->Selected logs are not in the loaded buffer. Zoom into this time range to load them.`);
923
- else $$renderer.push(`<!--[-1-->${escape_html(visibleSelectedCount())} of ${escape_html(selectedEvents().size)} selected log lines visible${escape_html(visibleSelectedCount() < selectedEvents().size ? " — clear the text or level filter to see all" : "")}.`);
924
- $$renderer.push(`<!--]--> <button type="button" class="ml-auto underline">Clear selection</button></div>`);
925
- } else $$renderer.push("<!--[-1-->");
926
- $$renderer.push(`<!--]--> <div class="min-h-0 min-w-0 flex-1 overflow-auto bg-neutral-950" data-testid="log-scroller">`);
927
- if (group === null || group === "") $$renderer.push(`<!--[0--><p class="px-3 py-6 text-sm text-neutral-500" data-testid="viewer-idle">Select a log group to start tailing.</p>`);
928
- else if (displayRows().length === 0) $$renderer.push(`<!--[1--><p class="px-3 py-6 text-sm text-neutral-500" data-testid="viewer-empty">${escape_html(emptyText())}</p>`);
929
- else {
930
- $$renderer.push("<!--[-1-->");
931
- function logLine($$renderer, row, child) {
932
- const expandable = row.expandable !== null;
933
- const open = expandable && isExpanded(row.key);
934
- $$renderer.push(`<li${attr_class(`flex flex-wrap items-baseline gap-2 px-3 py-0.5 hover:bg-neutral-900/60 ${listClass()} ${expandable ? "cursor-pointer" : ""}`, void 0, {
935
- "bg-sky-950": row.selected,
936
- "ring-1": row.selected,
937
- "ring-inset": row.selected,
938
- "ring-sky-700": row.selected
939
- })} data-testid="log-line"${attr("data-chart-selected", row.selected ? "true" : void 0)}${attr("data-request-child", child ? "true" : void 0)}${attr("data-level", row.level ?? "unknown")}${attr("data-expandable", expandable ? "true" : void 0)}${attr("data-expanded", open ? "true" : void 0)}${attr("role", expandable ? "button" : void 0)}${attr("tabindex", expandable ? 0 : void 0)}${attr("aria-expanded", expandable ? open : void 0)}${attr("title", expandable ? open ? "Hide the JSON in this line" : "Show this line as JSON" : void 0)}><span class="shrink-0 truncate text-neutral-500"${attr_style(`width: ${stringify(timestampPx)}px`)}${attr("title", row.timestamp)}>${escape_html(row.time)}</span> `);
940
- if (groups.length > 1) $$renderer.push(`<!--[0--><span class="shrink-0 truncate text-teal-400/80"${attr_style(`width: ${stringify(groupPx)}px`)}${attr("title", row.group ?? "")} data-testid="log-group">${escape_html(row.group ?? "")}</span>`);
941
- else $$renderer.push("<!--[-1-->");
942
- $$renderer.push(`<!--]--> <span class="shrink-0 truncate text-sky-400/80"${attr_style(prefixStyle())}${attr("title", row.streamName ?? "")} data-testid="log-stream">${escape_html(row.streamName ?? "")}</span> `);
943
- if (expandable) $$renderer.push(`<!--[0--><span class="shrink-0 text-neutral-600" aria-hidden="true">${escape_html(open ? "▾" : "▸")}</span>`);
988
+ $$renderer.push(`<!--]--></div></div> `);
989
+ if (open) {
990
+ $$renderer.push(`<!--[0--><div class="flex flex-none flex-wrap items-center gap-2 border-b border-neutral-800 bg-neutral-900/40 px-3 py-1.5"><div class="flex items-center gap-1" role="group" aria-label="Filter by level"><button type="button"${attr("aria-pressed", levelFilter() === null)} title="Show every level, including lines with no level" data-testid="level-all"${attr_class(`rounded-md border px-2 py-1 text-xs font-medium transition-colors hover:border-neutral-700 ${levelFilter() === null ? "border-sky-700 bg-sky-950/60 text-sky-200" : "border-neutral-800 bg-neutral-900 text-neutral-400 hover:border-neutral-700"}`)}>All</button> <!--[-->`);
991
+ const each_array = ensure_array_like(LEVEL_CHIPS);
992
+ for (let $$index = 0, $$length = each_array.length; $$index < $$length; $$index++) {
993
+ let chip = each_array[$$index];
994
+ $$renderer.push(`<button type="button"${attr("aria-pressed", levelFilter() === chip.level)}${attr("title", `Show only ${stringify(chip.label)} lines (${stringify(levelCounts()[chip.level] ?? 0)} loaded)`)}${attr("data-testid", `level-${stringify(chip.level)}`)}${attr_class(`rounded-md border px-2 py-1 text-xs font-medium transition-colors hover:border-neutral-700 ${stringify(levelFilter() === chip.level ? chip.activeClass : "border-neutral-800 bg-neutral-900 text-neutral-400 hover:border-neutral-700")}`)}>${escape_html(chip.label)} `);
995
+ if ((levelCounts()[chip.level] ?? 0) > 0) $$renderer.push(`<!--[0--><span class="ml-1 opacity-70">${escape_html(formatCount(levelCounts()[chip.level] ?? 0))}</span>`);
944
996
  else $$renderer.push("<!--[-1-->");
945
- $$renderer.push(`<!--]--> <span${attr_class(`${messageClass()} ${stringify(row.levelClass)}`)} data-testid="log-message">`);
946
- if (row.tokens !== null) {
947
- $$renderer.push(`<!--[0--><!--[-->`);
948
- const each_array_1 = ensure_array_like(row.tokens);
949
- for (let tokenIndex = 0, $$length = each_array_1.length; tokenIndex < $$length; tokenIndex++) {
950
- let token = each_array_1[tokenIndex];
951
- $$renderer.push(`<span${attr_class(clsx(tokenClass(token.type)))}>${escape_html(token.text)}</span>`);
952
- }
953
- $$renderer.push(`<!--]-->`);
954
- } else $$renderer.push(`<!--[-1-->${escape_html(row.message)}`);
955
- $$renderer.push(`<!--]--></span> `);
956
- if (open && row.expandable !== null) {
957
- $$renderer.push(`<!--[0--><span class="w-full whitespace-pre text-xs text-neutral-300" data-testid="log-json-expanded"><!--[-->`);
958
- const each_array_2 = ensure_array_like(tokenizeJson(row.expandable));
959
- for (let tokenIndex = 0, $$length = each_array_2.length; tokenIndex < $$length; tokenIndex++) {
960
- let token = each_array_2[tokenIndex];
961
- $$renderer.push(`<span${attr_class(clsx(tokenClass(token.type)))}>${escape_html(token.text)}</span>`);
962
- }
963
- $$renderer.push(`<!--]--></span>`);
964
- } else $$renderer.push("<!--[-1-->");
965
- $$renderer.push(`<!--]--></li>`);
997
+ $$renderer.push(`<!--]--></button>`);
966
998
  }
967
- $$renderer.push(`<div${attr_class(`relative min-h-full ${listClass()}`)} data-testid="log-canvas"${attr_style("", { "min-width": void 0 })}><ol class="font-mono text-xs leading-5" data-testid="log-lines"><!--[-->`);
968
- const each_array_3 = ensure_array_like(displayRows());
969
- for (let $$index_4 = 0, $$length = each_array_3.length; $$index_4 < $$length; $$index_4++) {
970
- let row = each_array_3[$$index_4];
971
- if (row.kind === "request") {
972
- $$renderer.push("<!--[0-->");
973
- const open = isExpanded(row.key);
974
- $$renderer.push(`<li${attr_class(clsx(listClass()), void 0, { "bg-sky-950": row.children.some((child) => child.selected) })} data-testid="log-request-group"${attr("data-chart-selected", row.children.some((child) => child.selected) ? "true" : void 0)}${attr("data-request-id", row.id)}${attr("data-level", row.level)}${attr("data-expanded", open ? "true" : void 0)}${attr("data-lines", row.count)}><button type="button" class="flex w-full flex-wrap items-baseline gap-2 px-3 py-0.5 text-left hover:bg-neutral-900/60"${attr("aria-expanded", open)}${attr("title", open ? "Hide the lines of this request" : "Show every line of this request")} data-testid="request-group-summary"><span class="shrink-0 truncate text-neutral-500"${attr_style(`width: ${stringify(timestampPx)}px`)}${attr("title", row.timestamp)}>${escape_html(row.time)}</span> `);
999
+ $$renderer.push(`<!--]--></div> <input type="search" aria-label="Filter log lines" placeholder="Filter lines"${attr("value", filter)} class="w-40 rounded-md border border-neutral-800 bg-neutral-900 px-2 py-1 text-xs text-neutral-100 outline-none transition-colors placeholder:text-neutral-600 hover:border-neutral-700 focus:border-sky-600"/> <button type="button"${attr("aria-pressed", wrapLines)} title="Wrap long lines instead of scrolling sideways" data-testid="wrap-toggle"${attr_class(`rounded-md border border-neutral-800 bg-neutral-900 px-2 py-1 text-xs font-medium transition-colors hover:border-neutral-700 ${wrapTone()}`)}>Wrap</button> <button type="button"${attr("aria-pressed", jsonView)} title="Pretty-print JSON log entries (off: click a line to open its JSON)" data-testid="json-toggle"${attr_class(`rounded-md border border-neutral-800 bg-neutral-900 px-2 py-1 text-xs font-medium transition-colors hover:border-neutral-700 ${jsonTone()}`)}>JSON</button> <button type="button"${attr("aria-pressed", groupRequests)} title="Group the lines of one request into a single row, coloured by its most critical line (off: one row per line)" data-testid="group-toggle"${attr_class(`rounded-md border border-neutral-800 bg-neutral-900 px-2 py-1 text-xs font-medium transition-colors hover:border-neutral-700 ${groupTone()}`)}>By request</button> <button type="button"${attr("aria-pressed", paused)} class="rounded-md border border-neutral-800 bg-neutral-900 px-2 py-1 text-xs font-medium text-neutral-300 transition-colors hover:border-neutral-700 hover:text-neutral-100">${escape_html(paused ? "Resume" : "Pause")}</button> <button type="button" class="rounded-md border border-neutral-800 bg-neutral-900 px-2 py-1 text-xs font-medium text-neutral-300 transition-colors hover:border-neutral-700 hover:text-neutral-100">Clear</button> <button type="button"${attr("aria-pressed", autoScroll)}${attr_class(`rounded-md border border-neutral-800 bg-neutral-900 px-2 py-1 text-xs font-medium transition-colors hover:border-neutral-700 ${autoScrollTone()}`)}>Auto-scroll</button></div> `);
1000
+ if (errorText() !== null) $$renderer.push(`<!--[0--><p role="alert" data-testid="stream-error" class="border-b border-red-900 bg-red-950/50 px-3 py-2 text-xs leading-5 text-red-300">${escape_html(errorText())}</p>`);
1001
+ else $$renderer.push("<!--[-1-->");
1002
+ $$renderer.push(`<!--]--> `);
1003
+ if (selection !== null) {
1004
+ $$renderer.push(`<!--[0--><div class="flex items-center gap-2 px-3 py-1 text-xs text-sky-300" role="status" data-testid="chart-selection-status">`);
1005
+ if (selectedEvents().size === 0) $$renderer.push(`<!--[0-->Selected logs are not in the loaded buffer. Zoom into this time range to load them.`);
1006
+ else $$renderer.push(`<!--[-1-->${escape_html(visibleSelectedCount())} of ${escape_html(selectedEvents().size)} selected log lines visible${escape_html(visibleSelectedCount() < selectedEvents().size ? " — clear the text or level filter to see all" : "")}.`);
1007
+ $$renderer.push(`<!--]--> <button type="button" class="ml-auto underline">Clear selection</button></div>`);
1008
+ } else $$renderer.push("<!--[-1-->");
1009
+ $$renderer.push(`<!--]--> <div class="min-h-0 min-w-0 flex-1 overflow-auto bg-neutral-950" data-testid="log-scroller">`);
1010
+ if (group === null || group === "") $$renderer.push(`<!--[0--><p class="px-3 py-6 text-sm text-neutral-500" data-testid="viewer-idle">Select a log group to start tailing.</p>`);
1011
+ else if (displayRows().length === 0) $$renderer.push(`<!--[1--><p class="px-3 py-6 text-sm text-neutral-500" data-testid="viewer-empty">${escape_html(emptyText())}</p>`);
1012
+ else {
1013
+ $$renderer.push("<!--[-1-->");
1014
+ function logLine($$renderer, row, child) {
1015
+ const expandable = row.expandable !== null;
1016
+ const open = expandable && isExpanded(row.key);
1017
+ $$renderer.push(`<li${attr_class(`flex flex-wrap items-baseline gap-2 px-3 py-0.5 hover:bg-neutral-900/60 ${listClass()} ${expandable ? "cursor-pointer" : ""}`, void 0, {
1018
+ "bg-sky-950": row.selected,
1019
+ "ring-1": row.selected,
1020
+ "ring-inset": row.selected,
1021
+ "ring-sky-700": row.selected
1022
+ })} data-testid="log-line"${attr("data-chart-selected", row.selected ? "true" : void 0)}${attr("data-request-child", child ? "true" : void 0)}${attr("data-level", row.level ?? "unknown")}${attr("data-expandable", expandable ? "true" : void 0)}${attr("data-expanded", open ? "true" : void 0)}${attr("role", expandable ? "button" : void 0)}${attr("tabindex", expandable ? 0 : void 0)}${attr("aria-expanded", expandable ? open : void 0)}${attr("title", expandable ? open ? "Hide the JSON in this line" : "Show this line as JSON" : void 0)}><span class="shrink-0 truncate text-neutral-500"${attr_style(`width: ${stringify(timestampPx)}px`)}${attr("title", row.timestamp)}>${escape_html(row.time)}</span> `);
975
1023
  if (groups.length > 1) $$renderer.push(`<!--[0--><span class="shrink-0 truncate text-teal-400/80"${attr_style(`width: ${stringify(groupPx)}px`)}${attr("title", row.group ?? "")} data-testid="log-group">${escape_html(row.group ?? "")}</span>`);
976
1024
  else $$renderer.push("<!--[-1-->");
977
- $$renderer.push(`<!--]--> <span class="shrink-0 truncate text-sky-400/80"${attr_style(prefixStyle())}${attr("title", row.streamName ?? "")} data-testid="log-stream">${escape_html(row.streamName ?? "")}</span> <span class="shrink-0 text-neutral-600" aria-hidden="true">${escape_html(open ? "▾" : "▸")}</span> <span class="shrink-0 rounded border border-neutral-700 bg-neutral-900 px-1.5 font-mono text-[0.6875rem] text-sky-200" data-testid="request-group-id" title="Request id shared by these lines">${escape_html(row.id)}</span> <span class="shrink-0 text-neutral-400" data-testid="request-group-count">${escape_html(formatCount(row.count))} lines</span> <span class="shrink-0 text-neutral-500" data-testid="request-group-span">${escape_html(row.span)}</span> <span${attr_class(`shrink-0 font-medium ${stringify(row.levelClass)}`)} data-testid="request-group-level">${escape_html(row.levelLabel)}</span> `);
978
- if (!open) $$renderer.push(`<!--[0--><span class="min-w-0 truncate text-neutral-500" data-testid="request-group-preview">${escape_html(row.preview)}</span>`);
979
- else $$renderer.push("<!--[-1-->");
980
- $$renderer.push(`<!--]--></button> `);
981
- if (open) {
982
- $$renderer.push(`<!--[0--><ul class="contents"><!--[-->`);
983
- const each_array_4 = ensure_array_like(row.children);
984
- for (let $$index_3 = 0, $$length = each_array_4.length; $$index_3 < $$length; $$index_3++) {
985
- let child = each_array_4[$$index_3];
986
- logLine($$renderer, child, true);
1025
+ $$renderer.push(`<!--]--> <span class="shrink-0 truncate text-sky-400/80"${attr_style(prefixStyle())}${attr("title", row.streamName ?? "")} data-testid="log-stream">${escape_html(row.streamName ?? "")}</span> `);
1026
+ if (expandable) {
1027
+ $$renderer.push("<!--[0-->");
1028
+ if (open) {
1029
+ $$renderer.push("<!--[0-->");
1030
+ Chevron_down($$renderer, {
1031
+ class: "shrink-0 text-neutral-600",
1032
+ size: "1em"
1033
+ });
1034
+ } else {
1035
+ $$renderer.push("<!--[-1-->");
1036
+ Chevron_right($$renderer, {
1037
+ class: "shrink-0 text-neutral-600",
1038
+ size: "1em"
1039
+ });
1040
+ }
1041
+ $$renderer.push(`<!--]-->`);
1042
+ } else $$renderer.push("<!--[-1-->");
1043
+ $$renderer.push(`<!--]--> <span${attr_class(`${messageClass()} ${stringify(row.levelClass)}`)} data-testid="log-message">`);
1044
+ if (row.tokens !== null) {
1045
+ $$renderer.push(`<!--[0--><!--[-->`);
1046
+ const each_array_1 = ensure_array_like(row.tokens);
1047
+ for (let tokenIndex = 0, $$length = each_array_1.length; tokenIndex < $$length; tokenIndex++) {
1048
+ let token = each_array_1[tokenIndex];
1049
+ $$renderer.push(`<span${attr_class(clsx(tokenClass(token.type)))}>${escape_html(token.text)}</span>`);
1050
+ }
1051
+ $$renderer.push(`<!--]-->`);
1052
+ } else $$renderer.push(`<!--[-1-->${escape_html(row.message)}`);
1053
+ $$renderer.push(`<!--]--></span> `);
1054
+ if (open && row.expandable !== null) {
1055
+ $$renderer.push(`<!--[0--><span class="w-full whitespace-pre text-xs text-neutral-300" data-testid="log-json-expanded"><!--[-->`);
1056
+ const each_array_2 = ensure_array_like(tokenizeJson(row.expandable));
1057
+ for (let tokenIndex = 0, $$length = each_array_2.length; tokenIndex < $$length; tokenIndex++) {
1058
+ let token = each_array_2[tokenIndex];
1059
+ $$renderer.push(`<span${attr_class(clsx(tokenClass(token.type)))}>${escape_html(token.text)}</span>`);
987
1060
  }
988
- $$renderer.push(`<!--]--></ul>`);
1061
+ $$renderer.push(`<!--]--></span>`);
989
1062
  } else $$renderer.push("<!--[-1-->");
990
1063
  $$renderer.push(`<!--]--></li>`);
991
- } else {
992
- $$renderer.push("<!--[-1-->");
993
- logLine($$renderer, row, false);
994
1064
  }
995
- $$renderer.push(`<!--]-->`);
996
- }
997
- $$renderer.push(`<!--]--></ol> `);
998
- ColumnResizer($$renderer, {
999
- label: "Resize timestamp column",
1000
- width: timestampPx,
1001
- min: 64,
1002
- max: 320,
1003
- testId: "timestamp-resizer",
1004
- onChange: (next) => timestampPx = next,
1005
- onCommit: (next) => writePref(STORAGE_KEYS.timestampWidth, String(next)),
1006
- class: "absolute inset-y-0 w-2 border-r border-neutral-800/40",
1007
- style: `left: ${stringify(ROW_PADDING_PX + timestampPx - 4)}px`
1008
- });
1009
- $$renderer.push(`<!----> `);
1010
- if (groups.length > 1) {
1011
- $$renderer.push("<!--[0-->");
1065
+ $$renderer.push(`<div${attr_class(`relative min-h-full ${listClass()}`)} data-testid="log-canvas"${attr_style("", { "min-width": void 0 })}><ol class="font-mono text-xs leading-5" data-testid="log-lines"><!--[-->`);
1066
+ const each_array_3 = ensure_array_like(displayRows());
1067
+ for (let $$index_4 = 0, $$length = each_array_3.length; $$index_4 < $$length; $$index_4++) {
1068
+ let row = each_array_3[$$index_4];
1069
+ if (row.kind === "request") {
1070
+ $$renderer.push("<!--[0-->");
1071
+ const open = isExpanded(row.key);
1072
+ $$renderer.push(`<li${attr_class(clsx(listClass()), void 0, { "bg-sky-950": row.children.some((child) => child.selected) })} data-testid="log-request-group"${attr("data-chart-selected", row.children.some((child) => child.selected) ? "true" : void 0)}${attr("data-request-id", row.id)}${attr("data-level", row.level)}${attr("data-expanded", open ? "true" : void 0)}${attr("data-lines", row.count)}><button type="button" class="flex w-full flex-wrap items-baseline gap-2 px-3 py-0.5 text-left hover:bg-neutral-900/60"${attr("aria-expanded", open)}${attr("title", open ? "Hide the lines of this request" : "Show every line of this request")} data-testid="request-group-summary"><span class="shrink-0 truncate text-neutral-500"${attr_style(`width: ${stringify(timestampPx)}px`)}${attr("title", row.timestamp)}>${escape_html(row.time)}</span> `);
1073
+ if (groups.length > 1) $$renderer.push(`<!--[0--><span class="shrink-0 truncate text-teal-400/80"${attr_style(`width: ${stringify(groupPx)}px`)}${attr("title", row.group ?? "")} data-testid="log-group">${escape_html(row.group ?? "")}</span>`);
1074
+ else $$renderer.push("<!--[-1-->");
1075
+ $$renderer.push(`<!--]--> <span class="shrink-0 truncate text-sky-400/80"${attr_style(prefixStyle())}${attr("title", row.streamName ?? "")} data-testid="log-stream">${escape_html(row.streamName ?? "")}</span> `);
1076
+ if (open) {
1077
+ $$renderer.push("<!--[0-->");
1078
+ Chevron_down($$renderer, {
1079
+ class: "shrink-0 text-neutral-600",
1080
+ size: "1em"
1081
+ });
1082
+ } else {
1083
+ $$renderer.push("<!--[-1-->");
1084
+ Chevron_right($$renderer, {
1085
+ class: "shrink-0 text-neutral-600",
1086
+ size: "1em"
1087
+ });
1088
+ }
1089
+ $$renderer.push(`<!--]--> <span class="shrink-0 rounded border border-neutral-700 bg-neutral-900 px-1.5 font-mono text-[0.6875rem] text-sky-200" data-testid="request-group-id" title="Request id shared by these lines">${escape_html(row.id)}</span> <span class="shrink-0 text-neutral-400" data-testid="request-group-count">${escape_html(formatCount(row.count))} lines</span> <span class="shrink-0 text-neutral-500" data-testid="request-group-span">${escape_html(row.span)}</span> <span${attr_class(`shrink-0 font-medium ${stringify(row.levelClass)}`)} data-testid="request-group-level">${escape_html(row.levelLabel)}</span> `);
1090
+ if (!open) $$renderer.push(`<!--[0--><span class="min-w-0 truncate text-neutral-500" data-testid="request-group-preview">${escape_html(row.preview)}</span>`);
1091
+ else $$renderer.push("<!--[-1-->");
1092
+ $$renderer.push(`<!--]--></button> `);
1093
+ if (open) {
1094
+ $$renderer.push(`<!--[0--><ul class="contents"><!--[-->`);
1095
+ const each_array_4 = ensure_array_like(row.children);
1096
+ for (let $$index_3 = 0, $$length = each_array_4.length; $$index_3 < $$length; $$index_3++) {
1097
+ let child = each_array_4[$$index_3];
1098
+ logLine($$renderer, child, true);
1099
+ }
1100
+ $$renderer.push(`<!--]--></ul>`);
1101
+ } else $$renderer.push("<!--[-1-->");
1102
+ $$renderer.push(`<!--]--></li>`);
1103
+ } else {
1104
+ $$renderer.push("<!--[-1-->");
1105
+ logLine($$renderer, row, false);
1106
+ }
1107
+ $$renderer.push(`<!--]-->`);
1108
+ }
1109
+ $$renderer.push(`<!--]--></ol> `);
1012
1110
  ColumnResizer($$renderer, {
1013
- label: "Resize log group column",
1014
- width: groupPx,
1111
+ label: "Resize timestamp column",
1112
+ width: timestampPx,
1015
1113
  min: 64,
1016
- max: 640,
1017
- testId: "group-resizer",
1018
- onChange: (next) => groupPx = next,
1019
- onCommit: (next) => writePref(STORAGE_KEYS.groupWidth, String(next)),
1114
+ max: 320,
1115
+ testId: "timestamp-resizer",
1116
+ onChange: (next) => timestampPx = next,
1117
+ onCommit: (next) => writePref(STORAGE_KEYS.timestampWidth, String(next)),
1020
1118
  class: "absolute inset-y-0 w-2 border-r border-neutral-800/40",
1021
- style: `left: ${stringify(ROW_PADDING_PX + timestampPx + ROW_GAP_PX + groupPx - 4)}px`
1119
+ style: `left: ${stringify(rowPaddingPx() + timestampPx - 4)}px`
1022
1120
  });
1023
- } else $$renderer.push("<!--[-1-->");
1024
- $$renderer.push(`<!--]--> `);
1025
- ColumnResizer($$renderer, {
1026
- label: "Resize stream column",
1027
- width: prefixPx,
1028
- min: PREFIX_MIN_PX,
1029
- max: PREFIX_MAX_PX,
1030
- testId: "prefix-resizer",
1031
- onChange: (next) => prefixPx = next,
1032
- onCommit: () => savePrefixWidth(),
1033
- class: "absolute inset-y-0 w-2 border-r border-neutral-800/40",
1034
- style: `left: ${stringify(handleLeft() - 4)}px`
1035
- });
1036
- $$renderer.push(`<!----></div>`);
1037
- }
1038
- $$renderer.push(`<!--]--></div></section>`);
1121
+ $$renderer.push(`<!----> `);
1122
+ if (groups.length > 1) {
1123
+ $$renderer.push("<!--[0-->");
1124
+ ColumnResizer($$renderer, {
1125
+ label: "Resize log group column",
1126
+ width: groupPx,
1127
+ min: 64,
1128
+ max: 640,
1129
+ testId: "group-resizer",
1130
+ onChange: (next) => groupPx = next,
1131
+ onCommit: (next) => writePref(STORAGE_KEYS.groupWidth, String(next)),
1132
+ class: "absolute inset-y-0 w-2 border-r border-neutral-800/40",
1133
+ style: `left: ${stringify(rowPaddingPx() + timestampPx + rowGapPx() + groupPx - 4)}px`
1134
+ });
1135
+ } else $$renderer.push("<!--[-1-->");
1136
+ $$renderer.push(`<!--]--> `);
1137
+ ColumnResizer($$renderer, {
1138
+ label: "Resize stream column",
1139
+ width: prefixPx,
1140
+ min: PREFIX_MIN_PX,
1141
+ max: PREFIX_MAX_PX,
1142
+ testId: "prefix-resizer",
1143
+ onChange: (next) => prefixPx = next,
1144
+ onCommit: () => savePrefixWidth(),
1145
+ class: "absolute inset-y-0 w-2 border-r border-neutral-800/40",
1146
+ style: `left: ${stringify(handleLeft() - 4)}px`
1147
+ });
1148
+ $$renderer.push(`<!----></div>`);
1149
+ }
1150
+ $$renderer.push(`<!--]--></div>`);
1151
+ } else $$renderer.push("<!--[-1-->");
1152
+ $$renderer.push(`<!--]--></section>`);
1039
1153
  });
1040
1154
  }
1041
1155
  //#endregion
@@ -1377,6 +1491,10 @@ function _page($$renderer, $$props) {
1377
1491
  * A stored preference wins, so a reader who wants every line keeps every line.
1378
1492
  */
1379
1493
  let groupRequests = true;
1494
+ /** True while the group-list sidebar is open; collapsing gives the logs the full width. */
1495
+ let sidebarOpen = true;
1496
+ /** True while the log lines are shown; collapsing keeps only the viewer's header. */
1497
+ let logOpen = true;
1380
1498
  /** Bucketed counts behind the chart. */
1381
1499
  let chartSelection = null;
1382
1500
  let seriesBucketMs = 6e4;
@@ -1396,7 +1514,7 @@ function _page($$renderer, $$props) {
1396
1514
  /** Largest sidebar width allowed: 44vw, but never below the minimum. */
1397
1515
  let sidebarMaxPx = derived(() => remToPx(SIDEBAR_WIDTH.defaultRem));
1398
1516
  let sidebarMinPx = remToPx(SIDEBAR_WIDTH.minRem);
1399
- let sidebarStyle = derived(() => `width: min(${sidebarPx}px, ${SIDEBAR_WIDTH.maxVw}vw)`);
1517
+ let sidebarStyle = derived(() => `--sidebar-width: min(${sidebarPx}px, ${SIDEBAR_WIDTH.maxVw}vw)`);
1400
1518
  /** Persists the sidebar width; failures are ignored (private mode, quota). */
1401
1519
  function saveSidebarWidth() {
1402
1520
  try {
@@ -1434,6 +1552,7 @@ function _page($$renderer, $$props) {
1434
1552
  if (target !== region || requestedSource !== source) return;
1435
1553
  if (response.endpoint !== null) endpoint = response.endpoint;
1436
1554
  groups = response.groups;
1555
+ puppy.wag();
1437
1556
  } catch (error) {
1438
1557
  if (target !== region || requestedSource !== source) return;
1439
1558
  groups = [];
@@ -1509,6 +1628,14 @@ function _page($$renderer, $$props) {
1509
1628
  localStorage?.setItem(STORAGE_KEYS.groupRequests, groupRequests ? "true" : "false");
1510
1629
  } catch {}
1511
1630
  }
1631
+ /** Collapses or expands the log lines, and remembers the choice. */
1632
+ function toggleLog() {
1633
+ logOpen = !logOpen;
1634
+ puppy.wag();
1635
+ try {
1636
+ localStorage?.setItem(STORAGE_KEYS.logOpen, logOpen ? "true" : "false");
1637
+ } catch {}
1638
+ }
1512
1639
  /** Switches region: stops the stream, clears the list and reloads the groups. */
1513
1640
  function changeRegion(next) {
1514
1641
  if (next === "" || next === region) return;
@@ -1555,6 +1682,7 @@ function _page($$renderer, $$props) {
1555
1682
  * Keeps the chart in step with the view: a new window, selection, source, level
1556
1683
  * or a new batch of lines all re-load the counts.
1557
1684
  */
1685
+ /** Every batch of log lines that arrives gives the puppy (when shown) a wag. */
1558
1686
  /**
1559
1687
  * Reacts to `archive-unavailable` from the stream (the file was locked or removed after boot) by
1560
1688
  * re-checking the archive, so the toggle hides itself instead of offering a source that fails.
@@ -1638,6 +1766,7 @@ function _page($$renderer, $$props) {
1638
1766
  if (request === seriesRequest) {
1639
1767
  seriesPoints = series.points;
1640
1768
  seriesBucketMs = series.bucketMs;
1769
+ puppy.wag();
1641
1770
  }
1642
1771
  } catch {
1643
1772
  if (request === seriesRequest) seriesPoints = [];
@@ -1645,7 +1774,16 @@ function _page($$renderer, $$props) {
1645
1774
  if (request === seriesRequest) seriesLoading = false;
1646
1775
  }
1647
1776
  }
1648
- $$renderer.push(`<div class="flex flex-wrap items-center gap-x-3 gap-y-2"><span class="text-[0.6875rem] font-semibold uppercase tracking-wider text-neutral-500">Watching</span> <span class="max-w-[22rem] truncate rounded-md border border-neutral-800 bg-neutral-900 px-2 py-1 font-mono text-xs text-neutral-200">${escape_html(selectedGroup() ?? "no group selected")}</span> <span class="text-xs text-neutral-500">in</span> <span class="font-mono text-xs text-neutral-300">${escape_html(region === "" ? "resolving region…" : region)}</span> `);
1777
+ $$renderer.push(`<div class="flex flex-wrap items-center gap-x-3 gap-y-2">`);
1778
+ RangeControls($$renderer, {
1779
+ mode,
1780
+ range,
1781
+ from: windowFrom,
1782
+ to: windowTo,
1783
+ loading: rangeLoading,
1784
+ disabled: selectedGroup() === null,
1785
+ liveDisabled: source === "archive"});
1786
+ $$renderer.push(`<!----> <div class="ml-auto flex flex-wrap items-center gap-x-3 gap-y-2"><span class="text-[0.6875rem] font-semibold uppercase tracking-wider text-neutral-500">Watching</span> <span class="max-w-[22rem] truncate rounded-md border border-neutral-800 bg-neutral-900 px-2 py-1 font-mono text-xs text-neutral-200">${escape_html(selectedGroup() ?? "no group selected")}</span> <span class="text-xs text-neutral-500">in</span> <span class="font-mono text-xs text-neutral-300">${escape_html(region === "" ? "resolving region…" : region)}</span> `);
1649
1787
  if (source === "archive") {
1650
1788
  $$renderer.push("<!--[0-->");
1651
1789
  EndpointBadge($$renderer, {
@@ -1662,18 +1800,15 @@ function _page($$renderer, $$props) {
1662
1800
  }
1663
1801
  $$renderer.push(`<!--]--> `);
1664
1802
  $$renderer.push("<!--[-1-->");
1665
- $$renderer.push(`<!--]--></div> `);
1803
+ $$renderer.push(`<!--]--></div></div> `);
1666
1804
  $$renderer.push("<!--[-1-->");
1667
- $$renderer.push(`<!--]--> `);
1668
- RangeControls($$renderer, {
1669
- mode,
1670
- range,
1671
- from: windowFrom,
1672
- to: windowTo,
1673
- loading: rangeLoading,
1674
- disabled: selectedGroup() === null,
1675
- liveDisabled: source === "archive"});
1676
- $$renderer.push(`<!----> <div class="flex min-h-0 min-w-0 flex-1 flex-col gap-3 lg:flex-row"><div class="flex min-h-0 w-full flex-col gap-3 rounded-lg border border-neutral-800 bg-neutral-950/60 p-3 lg:shrink-0"${attr_style(sidebarStyle())} data-testid="sidebar">`);
1805
+ $$renderer.push(`<!--]--> <div class="flex min-h-0 min-w-0 flex-1 flex-col border border-neutral-800 lg:flex-row"><div id="log-group-sidebar"${attr_class(`relative flex min-h-0 w-full flex-col border-b border-neutral-800 bg-neutral-950/60 lg:shrink-0 lg:border-b-0 lg:border-r `, "svelte-1uha8ag")}${attr_style(sidebarStyle())} data-testid="sidebar"><div class="flex min-h-9 flex-none items-center gap-x-3 border-b border-neutral-800 bg-neutral-900/40 px-3 py-1.5"><button type="button"${attr("aria-expanded", sidebarOpen)} aria-controls="log-group-sidebar"${attr("title", "Hide the group list")} data-testid="sidebar-collapse" class="flex items-center gap-1 text-sm font-semibold text-neutral-200 transition-colors hover:text-sky-300"><span class="hidden lg:inline-flex">`);
1806
+ Chevron_left($$renderer, { size: "1em" });
1807
+ $$renderer.push(`<!----></span> <span class="lg:hidden">`);
1808
+ $$renderer.push("<!--[0-->");
1809
+ Chevron_up($$renderer, { size: "1em" });
1810
+ $$renderer.push(`<!--]--></span> ${escape_html(source === "archive" ? "Archived groups" : "Log groups")}</button></div> `);
1811
+ $$renderer.push(`<!--[0--><div class="flex min-h-0 flex-1 flex-col gap-3 p-3" data-testid="sidebar-body">`);
1677
1812
  SourceControls($$renderer, {
1678
1813
  source,
1679
1814
  archiveAvailable: archiveAvailable(),
@@ -1701,9 +1836,12 @@ function _page($$renderer, $$props) {
1701
1836
  testId: "sidebar-resizer",
1702
1837
  onChange: (next) => sidebarPx = next,
1703
1838
  onCommit: () => saveSidebarWidth(),
1704
- class: "hidden lg:block lg:w-2"
1839
+ class: "absolute inset-y-0 -right-1 z-10 hidden w-2 lg:block"
1705
1840
  });
1706
- $$renderer.push(`<!----> <div class="flex min-h-0 min-w-0 flex-1 flex-col">`);
1841
+ $$renderer.push(`<!---->`);
1842
+ $$renderer.push(`<!--]--></div> `);
1843
+ $$renderer.push("<!--[-1-->");
1844
+ $$renderer.push(`<!--]--> <div class="flex min-h-0 min-w-0 flex-1 flex-col">`);
1707
1845
  EventScatterPanel($$renderer, {
1708
1846
  points: seriesPoints,
1709
1847
  from: chartWindow().from,
@@ -1711,6 +1849,7 @@ function _page($$renderer, $$props) {
1711
1849
  bucketMs: seriesBucketMs,
1712
1850
  groups: selectedGroups,
1713
1851
  byRequest: groupRequests,
1852
+ fill: !logOpen,
1714
1853
  metric: chartMetric,
1715
1854
  onMetricChange: (metric) => {
1716
1855
  chartSelection = null;
@@ -1729,7 +1868,7 @@ function _page($$renderer, $$props) {
1729
1868
  onBrush: applyBrush
1730
1869
  });
1731
1870
  $$renderer.push(`<!----> `);
1732
- if (windowFrom !== null && windowTo !== null && mode === "historic") $$renderer.push(`<!--[0--><div class="flex flex-wrap items-center gap-2 text-[0.6875rem] text-neutral-500"><span data-testid="brush-window">zoomed to ${escape_html(new Date(windowFrom).toLocaleTimeString())} – ${escape_html(new Date(windowTo).toLocaleTimeString())}</span> <button type="button" data-testid="brush-clear" class="rounded-md border border-neutral-800 bg-neutral-900 px-2 py-0.5 font-medium text-neutral-300 transition-colors hover:border-neutral-700 hover:text-neutral-100">Reset zoom</button></div>`);
1871
+ if (windowFrom !== null && windowTo !== null && mode === "historic") $$renderer.push(`<!--[0--><div class="flex flex-wrap items-center gap-2 border-b border-neutral-800 bg-neutral-950/60 px-3 py-1.5 text-[0.6875rem] text-neutral-500"><span data-testid="brush-window">zoomed to ${escape_html(new Date(windowFrom).toLocaleTimeString())} – ${escape_html(new Date(windowTo).toLocaleTimeString())}</span> <button type="button" data-testid="brush-clear" class="rounded-md border border-neutral-800 bg-neutral-900 px-2 py-0.5 font-medium text-neutral-300 transition-colors hover:border-neutral-700 hover:text-neutral-100">Reset zoom</button></div>`);
1733
1872
  else $$renderer.push("<!--[-1-->");
1734
1873
  $$renderer.push(`<!--]--> `);
1735
1874
  LogViewer($$renderer, {
@@ -1749,6 +1888,8 @@ function _page($$renderer, $$props) {
1749
1888
  onLevelChange: (next) => levelFilter = next,
1750
1889
  groupRequests,
1751
1890
  onGroupToggle: toggleGroupRequests,
1891
+ open: logOpen,
1892
+ onToggle: toggleLog,
1752
1893
  filter,
1753
1894
  paused: stream.paused,
1754
1895
  autoScroll,
@@ -1771,4 +1912,4 @@ function _page($$renderer, $$props) {
1771
1912
  }
1772
1913
 
1773
1914
  export { _page as default };
1774
- //# sourceMappingURL=_page.svelte.js-C9-7d7mD.js.map
1915
+ //# sourceMappingURL=_page.svelte.js-CVlL2UsO.js.map