watch-tail 0.9.0 → 0.10.1
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.
- package/README.md +111 -10
- package/build/client/_app/immutable/assets/0.B5hI3s8c.css +2 -0
- package/build/client/_app/immutable/assets/2.Cn4w1JYv.css +1 -0
- package/build/client/_app/immutable/chunks/0bp2Fczu.js +1 -0
- package/build/client/_app/immutable/chunks/B2En4t_E.js +3 -0
- package/build/client/_app/immutable/chunks/{DS3cLPAu.js → B7X5bVGV.js} +1 -1
- package/build/client/_app/immutable/chunks/BDcWO4cr.js +1 -0
- package/build/client/_app/immutable/chunks/{Dkh4Dwm8.js → BDdUgtQ9.js} +1 -1
- package/build/client/_app/immutable/chunks/{0b2v80OK.js → BP77Fyht.js} +1 -1
- package/build/client/_app/immutable/chunks/{dqF8mxBW.js → B_Mg_9D4.js} +1 -1
- package/build/client/_app/immutable/chunks/BvE-N_5_.js +1 -0
- package/build/client/_app/immutable/chunks/C0Fq51PS.js +1 -0
- package/build/client/_app/immutable/chunks/CBu7zaX6.js +15 -0
- package/build/client/_app/immutable/chunks/CDs2jokv.js +1 -0
- package/build/client/_app/immutable/chunks/{B5RiPG8Z.js → CL6wPCzw.js} +1 -1
- package/build/client/_app/immutable/chunks/CMPe3AwH.js +1 -0
- package/build/client/_app/immutable/chunks/{b77-bq1n.js → CRxuTO84.js} +1 -1
- package/build/client/_app/immutable/chunks/CXlCR4o6.js +10 -0
- package/build/client/_app/immutable/chunks/{DQqLOGLe.js → CZZUqHxO.js} +1 -1
- package/build/client/_app/immutable/chunks/{aI_O2VuQ.js → CaFHnwyo.js} +1 -1
- package/build/client/_app/immutable/chunks/CbtqT1c8.js +1 -0
- package/build/client/_app/immutable/chunks/{DGYKsRyW.js → CfRqDrzx.js} +1 -1
- package/build/client/_app/immutable/chunks/CwzJ9AB4.js +1 -0
- package/build/client/_app/immutable/chunks/{DwOZdLDj.js → Cy2yzzl5.js} +1 -1
- package/build/client/_app/immutable/chunks/D067lFSc.js +2 -0
- package/build/client/_app/immutable/chunks/{C_U_Jvk5.js → D27MZEE2.js} +1 -1
- package/build/client/_app/immutable/chunks/{IlwbfbOu.js → D9KJP6hv.js} +1 -1
- package/build/client/_app/immutable/chunks/DO938hpm.js +1 -0
- package/build/client/_app/immutable/chunks/DrLgrJ3k.js +1 -0
- package/build/client/_app/immutable/chunks/DrupwIIS.js +1 -0
- package/build/client/_app/immutable/chunks/LGzrUxfF.js +1 -0
- package/build/client/_app/immutable/chunks/{D7vimbmk.js → PUpq0Ki5.js} +1 -1
- package/build/client/_app/immutable/chunks/{DvxMaQv_.js → kSuEE8Bt.js} +1 -1
- package/build/client/_app/immutable/chunks/y79YFfGW.js +1 -0
- package/build/client/_app/immutable/chunks/zP_HZRCk.js +1 -0
- package/build/client/_app/immutable/entry/app.BEq8gOel.js +2 -0
- package/build/client/_app/immutable/entry/start.DmBlaUbV.js +1 -0
- package/build/client/_app/immutable/nodes/0.D63E8Q6i.js +1 -0
- package/build/client/_app/immutable/nodes/1.DXfG5P6X.js +1 -0
- package/build/client/_app/immutable/nodes/2.45XrHxUU.js +5 -0
- package/build/client/_app/version.json +1 -1
- package/build/env.js +0 -1
- package/build/handler.js +6 -9
- package/build/index.js +6 -9
- package/build/server/chunks/chunks/{archive.js-D2jtMmDo.js → archive.js-D7cGVWaq.js} +331 -31
- package/build/server/chunks/chunks/env.js-l0sNRNKZ.js +0 -1
- package/build/server/chunks/chunks/env2.js-C5BgBJDY.js +0 -1
- package/build/server/chunks/chunks/{exports.js-ClPPfcHj.js → exports.js-CvFPPbaH.js} +0 -6
- package/build/server/chunks/chunks/identity.js-NmGXxBz3.js +0 -1
- package/build/server/chunks/chunks/{index-server.js-CtH9Hqwf.js → index-server.js-DOq0LmqS.js} +87 -112
- package/build/server/chunks/chunks/internal.js-DZ8ZzzjN.js +0 -1
- package/build/server/chunks/chunks/{legacy-client.js-DAqKExQD.js → internal2.js-B2FekELn.js} +279 -7
- package/build/server/chunks/chunks/{level-filter.js-D9MNrew3.js → level-filter.js-kKdNjmbR.js} +2 -3
- package/build/server/chunks/chunks/{log-buffer.js-A9FA-Qv8.js → log-buffer.js-BjT3sJlh.js} +1 -2
- package/build/server/chunks/chunks/regions.js-COf7DgnH.js +0 -1
- package/build/server/chunks/chunks/shared-server.js-Dn5XheXH.js +0 -1
- package/build/server/chunks/chunks/shared.js-CgjUIvRK.js +0 -1
- package/build/server/chunks/chunks/source.js-DZEVvuho.js +0 -1
- package/build/server/chunks/chunks/{state.js-i-NVNGIq.js → state.js-CdO6iuBd.js} +3 -4
- package/build/server/chunks/chunks/text-size.svelte.js-D09gVgvI.js +309 -0
- package/build/server/chunks/chunks/{time-range.js-BLMT8aU3.js → time-range.js-__87ZPq6.js} +9 -5
- package/build/server/chunks/chunks/uneval.js-DaakSYFQ.js +0 -1
- package/build/server/chunks/chunks/utils.js-BIlHjgGW.js +0 -1
- package/build/server/chunks/entries/endpoints/api/archive/{_server.ts.js-C4hWyXuu.js → _server.ts.js-D-97I3hr.js} +2 -3
- package/build/server/chunks/entries/endpoints/api/health/_server.ts.js-C5tfrpmC.js +0 -1
- package/build/server/chunks/entries/endpoints/api/identity/_server.ts.js-PWRPScuN.js +0 -1
- package/build/server/chunks/entries/endpoints/api/log-groups/{_server.ts.js-D4y43Vwe.js → _server.ts.js-BBBsBX5h.js} +2 -3
- package/build/server/chunks/entries/endpoints/api/regions/_server.ts.js-9_g0ojki.js +0 -1
- package/build/server/chunks/entries/endpoints/api/series/{_server.ts.js-DibT3Hjc.js → _server.ts.js-bsGqvQ1O.js} +4 -5
- package/build/server/chunks/entries/endpoints/api/stream/{_server.ts.js-BxXw5K0R.js → _server.ts.js-B6obpUbh.js} +211 -49
- package/build/server/chunks/entries/fallbacks/{error.svelte.js-ylsqA41Y.js → error.svelte.js-BupH3lxJ.js} +4 -7
- package/build/server/chunks/entries/pages/_layout.svelte.js-C3CVxu2T.js +621 -0
- package/build/server/chunks/entries/pages/{_page.svelte.js-C9-7d7mD.js → _page.svelte.js-DS9p1LVo.js} +643 -191
- package/build/server/chunks/{handler-Bqo8aDgP.js → handler-DrjCpeeA.js} +4 -5
- package/build/server/chunks/{index.js-fPvMujCL.js → index.js-BLTOesya.js} +3 -4
- package/build/server/chunks/{manifest.js-Bkj-8GaD.js → manifest.js-C1_IS4sj.js} +8 -9
- package/build/server/chunks/nodes/0.js-BHXaR9OX.js +8 -0
- package/build/server/chunks/nodes/1.js-C-coUSdu.js +8 -0
- package/build/server/chunks/nodes/2.js-Dor6Xgc7.js +8 -0
- package/build/shims.js +0 -1
- package/dist/cli/completions.js +24 -0
- package/dist/cli/index.js +144 -3
- package/dist/cli/mcp/agents.js +344 -0
- package/dist/cli/mcp/backend.js +235 -0
- package/dist/cli/mcp/run.js +245 -0
- package/dist/cli/mcp/stdio.js +103 -0
- package/dist/cli/mcp/tools.js +245 -0
- package/dist/cli/options.js +138 -25
- package/dist/cli/server.js +28 -0
- package/dist/cli/ui.js +20 -1
- package/dist/lib/time-range.js +14 -3
- package/package.json +21 -6
- package/build/client/_app/immutable/assets/0.ChTKqSf6.css +0 -2
- package/build/client/_app/immutable/assets/0.ChTKqSf6.css.br +0 -0
- package/build/client/_app/immutable/assets/0.ChTKqSf6.css.gz +0 -0
- package/build/client/_app/immutable/assets/BrushContext.2tkUc39H.css.br +0 -0
- package/build/client/_app/immutable/assets/BrushContext.2tkUc39H.css.gz +0 -0
- package/build/client/_app/immutable/assets/ChartAnnotations.Bw8CGteN.css.br +0 -0
- package/build/client/_app/immutable/assets/ChartAnnotations.Bw8CGteN.css.gz +0 -0
- package/build/client/_app/immutable/assets/Circle.C5MKzgk2.css.br +0 -1
- package/build/client/_app/immutable/assets/Circle.C5MKzgk2.css.gz +0 -0
- package/build/client/_app/immutable/assets/DefaultTooltip.CGOVIm3D.css.br +0 -0
- package/build/client/_app/immutable/assets/DefaultTooltip.CGOVIm3D.css.gz +0 -0
- package/build/client/_app/immutable/assets/EventScatter.0BkgJO-l.css.br +0 -0
- package/build/client/_app/immutable/assets/EventScatter.0BkgJO-l.css.gz +0 -0
- package/build/client/_app/immutable/assets/Labels.sEaJtb97.css.br +0 -0
- package/build/client/_app/immutable/assets/Labels.sEaJtb97.css.gz +0 -0
- package/build/client/_app/immutable/assets/Legend.DnhxhJ2I.css.br +0 -0
- package/build/client/_app/immutable/assets/Legend.DnhxhJ2I.css.gz +0 -0
- package/build/client/_app/immutable/assets/Path.B0wDzTrn.css.br +0 -0
- package/build/client/_app/immutable/assets/Path.B0wDzTrn.css.gz +0 -0
- package/build/client/_app/immutable/assets/TransformContext.1cjyViIk.css.br +0 -0
- package/build/client/_app/immutable/assets/TransformContext.1cjyViIk.css.gz +0 -0
- package/build/client/_app/immutable/assets/Voronoi.ce7atosu.css.br +0 -0
- package/build/client/_app/immutable/assets/Voronoi.ce7atosu.css.gz +0 -0
- package/build/client/_app/immutable/chunks/0b2v80OK.js.br +0 -0
- package/build/client/_app/immutable/chunks/0b2v80OK.js.gz +0 -0
- package/build/client/_app/immutable/chunks/5EFAIHuJ.js +0 -1
- package/build/client/_app/immutable/chunks/5EFAIHuJ.js.br +0 -0
- package/build/client/_app/immutable/chunks/5EFAIHuJ.js.gz +0 -0
- package/build/client/_app/immutable/chunks/B15XBe8D.js +0 -1
- package/build/client/_app/immutable/chunks/B15XBe8D.js.br +0 -0
- package/build/client/_app/immutable/chunks/B15XBe8D.js.gz +0 -0
- package/build/client/_app/immutable/chunks/B5RiPG8Z.js.br +0 -2
- package/build/client/_app/immutable/chunks/B5RiPG8Z.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BR2LaRms.js.br +0 -1
- package/build/client/_app/immutable/chunks/BR2LaRms.js.gz +0 -0
- package/build/client/_app/immutable/chunks/B_KVdCQT.js +0 -10
- package/build/client/_app/immutable/chunks/B_KVdCQT.js.br +0 -0
- package/build/client/_app/immutable/chunks/B_KVdCQT.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Bjy-W4x2.js.br +0 -0
- package/build/client/_app/immutable/chunks/Bjy-W4x2.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Bl052uUt.js.br +0 -0
- package/build/client/_app/immutable/chunks/Bl052uUt.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BuCpRsEL.js +0 -1
- package/build/client/_app/immutable/chunks/BuCpRsEL.js.br +0 -0
- package/build/client/_app/immutable/chunks/BuCpRsEL.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BvZtsVvW.js +0 -1
- package/build/client/_app/immutable/chunks/BvZtsVvW.js.br +0 -0
- package/build/client/_app/immutable/chunks/BvZtsVvW.js.gz +0 -0
- package/build/client/_app/immutable/chunks/C3Y15ONf.js +0 -2
- package/build/client/_app/immutable/chunks/C3Y15ONf.js.br +0 -0
- package/build/client/_app/immutable/chunks/C3Y15ONf.js.gz +0 -0
- package/build/client/_app/immutable/chunks/C58PZtCD.js.br +0 -0
- package/build/client/_app/immutable/chunks/C58PZtCD.js.gz +0 -0
- package/build/client/_app/immutable/chunks/C9GPQYs7.js +0 -1
- package/build/client/_app/immutable/chunks/C9GPQYs7.js.br +0 -0
- package/build/client/_app/immutable/chunks/C9GPQYs7.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CBZpkDc1.js.br +0 -0
- package/build/client/_app/immutable/chunks/CBZpkDc1.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CCch3uox.js.br +0 -0
- package/build/client/_app/immutable/chunks/CCch3uox.js.gz +0 -0
- package/build/client/_app/immutable/chunks/C_U_Jvk5.js.br +0 -0
- package/build/client/_app/immutable/chunks/C_U_Jvk5.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Cd7JqZj9.js +0 -1
- package/build/client/_app/immutable/chunks/Cd7JqZj9.js.br +0 -0
- package/build/client/_app/immutable/chunks/Cd7JqZj9.js.gz +0 -0
- package/build/client/_app/immutable/chunks/D2PbcyDU.js +0 -1
- package/build/client/_app/immutable/chunks/D2PbcyDU.js.br +0 -0
- package/build/client/_app/immutable/chunks/D2PbcyDU.js.gz +0 -0
- package/build/client/_app/immutable/chunks/D7vimbmk.js.br +0 -0
- package/build/client/_app/immutable/chunks/D7vimbmk.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DAqXSYzi.js +0 -1
- package/build/client/_app/immutable/chunks/DAqXSYzi.js.br +0 -0
- package/build/client/_app/immutable/chunks/DAqXSYzi.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DGYKsRyW.js.br +0 -0
- package/build/client/_app/immutable/chunks/DGYKsRyW.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DPaulGql.js +0 -1
- package/build/client/_app/immutable/chunks/DPaulGql.js.br +0 -1
- package/build/client/_app/immutable/chunks/DPaulGql.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DQqLOGLe.js.br +0 -0
- package/build/client/_app/immutable/chunks/DQqLOGLe.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DS3cLPAu.js.br +0 -0
- package/build/client/_app/immutable/chunks/DS3cLPAu.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Db0q5_zr.js.br +0 -0
- package/build/client/_app/immutable/chunks/Db0q5_zr.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Dfvzj6n2.js.br +0 -0
- package/build/client/_app/immutable/chunks/Dfvzj6n2.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Dkh4Dwm8.js.br +0 -0
- package/build/client/_app/immutable/chunks/Dkh4Dwm8.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DnqfXHAL.js +0 -15
- package/build/client/_app/immutable/chunks/DnqfXHAL.js.br +0 -0
- package/build/client/_app/immutable/chunks/DnqfXHAL.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DsYron7_.js +0 -1
- package/build/client/_app/immutable/chunks/DsYron7_.js.br +0 -0
- package/build/client/_app/immutable/chunks/DsYron7_.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DuM1cPdZ.js +0 -1
- package/build/client/_app/immutable/chunks/DuM1cPdZ.js.br +0 -0
- package/build/client/_app/immutable/chunks/DuM1cPdZ.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DvxMaQv_.js.br +0 -0
- package/build/client/_app/immutable/chunks/DvxMaQv_.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DwOZdLDj.js.br +0 -0
- package/build/client/_app/immutable/chunks/DwOZdLDj.js.gz +0 -0
- package/build/client/_app/immutable/chunks/HclGiUj8.js.br +0 -0
- package/build/client/_app/immutable/chunks/HclGiUj8.js.gz +0 -0
- package/build/client/_app/immutable/chunks/IlwbfbOu.js.br +0 -0
- package/build/client/_app/immutable/chunks/IlwbfbOu.js.gz +0 -0
- package/build/client/_app/immutable/chunks/RobXhXPM.js.br +0 -1
- package/build/client/_app/immutable/chunks/RobXhXPM.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Y5urAfNy.js.br +0 -0
- package/build/client/_app/immutable/chunks/Y5urAfNy.js.gz +0 -0
- package/build/client/_app/immutable/chunks/aI_O2VuQ.js.br +0 -0
- package/build/client/_app/immutable/chunks/aI_O2VuQ.js.gz +0 -0
- package/build/client/_app/immutable/chunks/b77-bq1n.js.br +0 -0
- package/build/client/_app/immutable/chunks/b77-bq1n.js.gz +0 -0
- package/build/client/_app/immutable/chunks/dqF8mxBW.js.br +0 -0
- package/build/client/_app/immutable/chunks/dqF8mxBW.js.gz +0 -0
- package/build/client/_app/immutable/chunks/gkAHSOnS.js +0 -1
- package/build/client/_app/immutable/chunks/gkAHSOnS.js.br +0 -0
- package/build/client/_app/immutable/chunks/gkAHSOnS.js.gz +0 -0
- package/build/client/_app/immutable/chunks/pqiPC7Y8.js +0 -3
- package/build/client/_app/immutable/chunks/pqiPC7Y8.js.br +0 -0
- package/build/client/_app/immutable/chunks/pqiPC7Y8.js.gz +0 -0
- package/build/client/_app/immutable/chunks/ti8ecMFX.js +0 -1
- package/build/client/_app/immutable/chunks/ti8ecMFX.js.br +0 -0
- package/build/client/_app/immutable/chunks/ti8ecMFX.js.gz +0 -0
- package/build/client/_app/immutable/chunks/xihTtKlq.js.br +0 -1
- package/build/client/_app/immutable/chunks/xihTtKlq.js.gz +0 -0
- package/build/client/_app/immutable/chunks/yCfI4PCa.js.br +0 -0
- package/build/client/_app/immutable/chunks/yCfI4PCa.js.gz +0 -0
- package/build/client/_app/immutable/entry/app.CTR4aUFT.js +0 -2
- package/build/client/_app/immutable/entry/app.CTR4aUFT.js.br +0 -0
- package/build/client/_app/immutable/entry/app.CTR4aUFT.js.gz +0 -0
- package/build/client/_app/immutable/entry/start.CC6Ln8E2.js +0 -1
- package/build/client/_app/immutable/entry/start.CC6Ln8E2.js.br +0 -0
- package/build/client/_app/immutable/entry/start.CC6Ln8E2.js.gz +0 -0
- package/build/client/_app/immutable/nodes/0.CvUxmLsM.js +0 -1
- package/build/client/_app/immutable/nodes/0.CvUxmLsM.js.br +0 -0
- package/build/client/_app/immutable/nodes/0.CvUxmLsM.js.gz +0 -0
- package/build/client/_app/immutable/nodes/1.CbSHqfEx.js +0 -1
- package/build/client/_app/immutable/nodes/1.CbSHqfEx.js.br +0 -0
- package/build/client/_app/immutable/nodes/1.CbSHqfEx.js.gz +0 -0
- package/build/client/_app/immutable/nodes/2.DcD5v8dU.js +0 -5
- package/build/client/_app/immutable/nodes/2.DcD5v8dU.js.br +0 -0
- package/build/client/_app/immutable/nodes/2.DcD5v8dU.js.gz +0 -0
- package/build/client/_app/version.json.br +0 -0
- package/build/client/_app/version.json.gz +0 -0
- package/build/client/robots.txt.br +0 -0
- package/build/client/robots.txt.gz +0 -0
- package/build/env.js.map +0 -1
- package/build/handler.js.map +0 -1
- package/build/index.js.map +0 -1
- package/build/server/chunks/chunks/Arc.canvas.js-CN0KDoHG.js +0 -701
- package/build/server/chunks/chunks/Arc.canvas.js-CN0KDoHG.js.map +0 -1
- package/build/server/chunks/chunks/Arc.js-C8EC9NoE.js +0 -31
- package/build/server/chunks/chunks/Arc.js-C8EC9NoE.js.map +0 -1
- package/build/server/chunks/chunks/Bar.js-DtAb3LZZ.js +0 -448
- package/build/server/chunks/chunks/Bar.js-DtAb3LZZ.js.map +0 -1
- package/build/server/chunks/chunks/ChartAnnotations.js-twzDSVzY.js +0 -983
- package/build/server/chunks/chunks/ChartAnnotations.js-twzDSVzY.js.map +0 -1
- package/build/server/chunks/chunks/Circle.html.js-BJywADGK.js +0 -355
- package/build/server/chunks/chunks/Circle.html.js-BJywADGK.js.map +0 -1
- package/build/server/chunks/chunks/ClipPath.canvas.js-9Fc0bTEM.js +0 -170
- package/build/server/chunks/chunks/ClipPath.canvas.js-9Fc0bTEM.js.map +0 -1
- package/build/server/chunks/chunks/DefaultTooltip.js-C2NWK2AD.js +0 -352
- package/build/server/chunks/chunks/DefaultTooltip.js-C2NWK2AD.js.map +0 -1
- package/build/server/chunks/chunks/EventScatter.js-CO2GonW-.js +0 -7370
- package/build/server/chunks/chunks/EventScatter.js-CO2GonW-.js.map +0 -1
- package/build/server/chunks/chunks/Labels.js-DB9qoyZ3.js +0 -497
- package/build/server/chunks/chunks/Labels.js-DB9qoyZ3.js.map +0 -1
- package/build/server/chunks/chunks/Legend.js-B_ArjxQ7.js +0 -343
- package/build/server/chunks/chunks/Legend.js-B_ArjxQ7.js.map +0 -1
- package/build/server/chunks/chunks/Line.html.js-B1REcOFe.js +0 -423
- package/build/server/chunks/chunks/Line.html.js-B1REcOFe.js.map +0 -1
- package/build/server/chunks/chunks/Link.canvas.js-nWimAHfH.js +0 -756
- package/build/server/chunks/chunks/Link.canvas.js-nWimAHfH.js.map +0 -1
- package/build/server/chunks/chunks/Path.canvas.js-5A9wB8zQ.js +0 -1259
- package/build/server/chunks/chunks/Path.canvas.js-5A9wB8zQ.js.map +0 -1
- package/build/server/chunks/chunks/Points.html.js-B2o3k-ZZ.js +0 -228
- package/build/server/chunks/chunks/Points.html.js-B2o3k-ZZ.js.map +0 -1
- package/build/server/chunks/chunks/Points.js-D7ozN9W5.js +0 -14
- package/build/server/chunks/chunks/Points.js-D7ozN9W5.js.map +0 -1
- package/build/server/chunks/chunks/Points2.js-BVbWugLT.js +0 -25
- package/build/server/chunks/chunks/Points2.js-BVbWugLT.js.map +0 -1
- package/build/server/chunks/chunks/Rect.html.js-DnQ6ObhQ.js +0 -547
- package/build/server/chunks/chunks/Rect.html.js-DnQ6ObhQ.js.map +0 -1
- package/build/server/chunks/chunks/Spline.js-YnAxvrKY.js +0 -516
- package/build/server/chunks/chunks/Spline.js-YnAxvrKY.js.map +0 -1
- package/build/server/chunks/chunks/Text.html.js-LbmYJb11.js +0 -847
- package/build/server/chunks/chunks/Text.html.js-LbmYJb11.js.map +0 -1
- package/build/server/chunks/chunks/TooltipItem.js-Ce-blieA.js +0 -314
- package/build/server/chunks/chunks/TooltipItem.js-Ce-blieA.js.map +0 -1
- package/build/server/chunks/chunks/Voronoi.js-CalFJAXH.js +0 -2052
- package/build/server/chunks/chunks/Voronoi.js-CalFJAXH.js.map +0 -1
- package/build/server/chunks/chunks/archive.js-D2jtMmDo.js.map +0 -1
- package/build/server/chunks/chunks/array.js-CBp0H4t3.js +0 -8
- package/build/server/chunks/chunks/array.js-CBp0H4t3.js.map +0 -1
- package/build/server/chunks/chunks/attributes.js-CbKEpZKa.js +0 -25
- package/build/server/chunks/chunks/attributes.js-CbKEpZKa.js.map +0 -1
- package/build/server/chunks/chunks/band.js-CjzHWr4k.js +0 -155
- package/build/server/chunks/chunks/band.js-CjzHWr4k.js.map +0 -1
- package/build/server/chunks/chunks/centroid.js-BnGN3LH0.js +0 -1356
- package/build/server/chunks/chunks/centroid.js-BnGN3LH0.js.map +0 -1
- package/build/server/chunks/chunks/common.js-BvQnfkFo.js +0 -5760
- package/build/server/chunks/chunks/common.js-BvQnfkFo.js.map +0 -1
- package/build/server/chunks/chunks/env.js-l0sNRNKZ.js.map +0 -1
- package/build/server/chunks/chunks/env2.js-C5BgBJDY.js.map +0 -1
- package/build/server/chunks/chunks/events.js-zIVaXIP1.js +0 -95
- package/build/server/chunks/chunks/events.js-zIVaXIP1.js.map +0 -1
- package/build/server/chunks/chunks/exports.js-ClPPfcHj.js.map +0 -1
- package/build/server/chunks/chunks/group.js-D0SfevId.js +0 -30
- package/build/server/chunks/chunks/group.js-D0SfevId.js.map +0 -1
- package/build/server/chunks/chunks/identity.js-NmGXxBz3.js.map +0 -1
- package/build/server/chunks/chunks/index-server.js-CtH9Hqwf.js.map +0 -1
- package/build/server/chunks/chunks/index-server2.js-l0sNRNKZ.js +0 -2
- package/build/server/chunks/chunks/index-server2.js-l0sNRNKZ.js.map +0 -1
- package/build/server/chunks/chunks/internal.js-DZ8ZzzjN.js.map +0 -1
- package/build/server/chunks/chunks/internal2.js-CfVVfAb5.js +0 -188
- package/build/server/chunks/chunks/internal2.js-CfVVfAb5.js.map +0 -1
- package/build/server/chunks/chunks/key.svelte.js-Cq0L6YlN.js +0 -695
- package/build/server/chunks/chunks/key.svelte.js-Cq0L6YlN.js.map +0 -1
- package/build/server/chunks/chunks/legacy-client.js-DAqKExQD.js.map +0 -1
- package/build/server/chunks/chunks/level-filter.js-D9MNrew3.js.map +0 -1
- package/build/server/chunks/chunks/lineRadial.js-B7ZNP_Jp.js +0 -126
- package/build/server/chunks/chunks/lineRadial.js-B7ZNP_Jp.js.map +0 -1
- package/build/server/chunks/chunks/linear.js-CHlwr1I4.js +0 -1046
- package/build/server/chunks/chunks/linear.js-CHlwr1I4.js.map +0 -1
- package/build/server/chunks/chunks/log-buffer.js-A9FA-Qv8.js.map +0 -1
- package/build/server/chunks/chunks/math.js-BqujbaBs.js +0 -50
- package/build/server/chunks/chunks/math.js-BqujbaBs.js.map +0 -1
- package/build/server/chunks/chunks/max.js-CuS0BpRI.js +0 -11
- package/build/server/chunks/chunks/max.js-CuS0BpRI.js.map +0 -1
- package/build/server/chunks/chunks/min.js-DZWt5tPl.js +0 -11
- package/build/server/chunks/chunks/min.js-DZWt5tPl.js.map +0 -1
- package/build/server/chunks/chunks/motion.svelte.js-Crk8ri1u.js +0 -677
- package/build/server/chunks/chunks/motion.svelte.js-Crk8ri1u.js.map +0 -1
- package/build/server/chunks/chunks/occlusion.js-ot9_OqWn.js +0 -33
- package/build/server/chunks/chunks/occlusion.js-ot9_OqWn.js.map +0 -1
- package/build/server/chunks/chunks/path.js-BizMrlzb.js +0 -488
- package/build/server/chunks/chunks/path.js-BizMrlzb.js.map +0 -1
- package/build/server/chunks/chunks/path2.js-DLVU8nc9.js +0 -27
- package/build/server/chunks/chunks/path2.js-DLVU8nc9.js.map +0 -1
- package/build/server/chunks/chunks/pointRadial.js-Deeu1LXx.js +0 -7
- package/build/server/chunks/chunks/pointRadial.js-Deeu1LXx.js.map +0 -1
- package/build/server/chunks/chunks/rect.svelte.js-_0PgI5fe.js +0 -187
- package/build/server/chunks/chunks/rect.svelte.js-_0PgI5fe.js.map +0 -1
- package/build/server/chunks/chunks/regions.js-COf7DgnH.js.map +0 -1
- package/build/server/chunks/chunks/scales.svelte.js-DeNkKcI-.js +0 -276
- package/build/server/chunks/chunks/scales.svelte.js-DeNkKcI-.js.map +0 -1
- package/build/server/chunks/chunks/series-buckets.js-C-vMEJT2.js +0 -316
- package/build/server/chunks/chunks/series-buckets.js-C-vMEJT2.js.map +0 -1
- package/build/server/chunks/chunks/shared-server.js-Dn5XheXH.js.map +0 -1
- package/build/server/chunks/chunks/shared.js-CgjUIvRK.js.map +0 -1
- package/build/server/chunks/chunks/source.js-DZEVvuho.js.map +0 -1
- package/build/server/chunks/chunks/state.js-i-NVNGIq.js.map +0 -1
- package/build/server/chunks/chunks/time-range.js-BLMT8aU3.js.map +0 -1
- package/build/server/chunks/chunks/types.js-x3GyGPOz.js +0 -11
- package/build/server/chunks/chunks/types.js-x3GyGPOz.js.map +0 -1
- package/build/server/chunks/chunks/uneval.js-DaakSYFQ.js.map +0 -1
- package/build/server/chunks/chunks/utils.js-BIlHjgGW.js.map +0 -1
- package/build/server/chunks/entries/endpoints/api/archive/_server.ts.js-C4hWyXuu.js.map +0 -1
- package/build/server/chunks/entries/endpoints/api/health/_server.ts.js-C5tfrpmC.js.map +0 -1
- package/build/server/chunks/entries/endpoints/api/identity/_server.ts.js-PWRPScuN.js.map +0 -1
- package/build/server/chunks/entries/endpoints/api/log-groups/_server.ts.js-D4y43Vwe.js.map +0 -1
- package/build/server/chunks/entries/endpoints/api/regions/_server.ts.js-9_g0ojki.js.map +0 -1
- package/build/server/chunks/entries/endpoints/api/series/_server.ts.js-DibT3Hjc.js.map +0 -1
- package/build/server/chunks/entries/endpoints/api/stream/_server.ts.js-BxXw5K0R.js.map +0 -1
- package/build/server/chunks/entries/fallbacks/error.svelte.js-ylsqA41Y.js.map +0 -1
- package/build/server/chunks/entries/pages/_layout.svelte.js-D7sAdBVX.js +0 -113
- package/build/server/chunks/entries/pages/_layout.svelte.js-D7sAdBVX.js.map +0 -1
- package/build/server/chunks/entries/pages/_page.svelte.js-C9-7d7mD.js.map +0 -1
- package/build/server/chunks/handler-Bqo8aDgP.js.map +0 -1
- package/build/server/chunks/index.js-fPvMujCL.js.map +0 -1
- package/build/server/chunks/manifest.js-Bkj-8GaD.js.map +0 -1
- package/build/server/chunks/nodes/0.js-7J6kXnEo.js +0 -9
- package/build/server/chunks/nodes/0.js-7J6kXnEo.js.map +0 -1
- package/build/server/chunks/nodes/1.js-DZXnUx67.js +0 -9
- package/build/server/chunks/nodes/1.js-DZXnUx67.js.map +0 -1
- package/build/server/chunks/nodes/2.js-85y9-1SS.js +0 -9
- package/build/server/chunks/nodes/2.js-85y9-1SS.js.map +0 -1
- package/build/shims.js.map +0 -1
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { r as resolveAwsConfig, c as createStsClient, p as parseRegionParam } from './env2.js-C5BgBJDY.js';
|
|
2
2
|
import { g as getCallerIdentityWith } from './identity.js-NmGXxBz3.js';
|
|
3
|
-
import { d as detectRequestId, a as detectLevelWithSource, e as eventDurationMs, i as isLogLevel, L as LEVEL_RANK } from './log-buffer.js-
|
|
3
|
+
import { d as detectRequestId, a as detectLevelWithSource, e as eventDurationMs, i as isLogLevel, L as LEVEL_RANK } from './log-buffer.js-BjT3sJlh.js';
|
|
4
4
|
import { mkdirSync, statSync, readFileSync, writeFileSync, renameSync } from 'node:fs';
|
|
5
5
|
import { homedir } from 'node:os';
|
|
6
6
|
import { resolve, join, dirname } from 'node:path';
|
|
7
7
|
import { randomUUID, createHash } from 'node:crypto';
|
|
8
|
-
import { setTimeout } from 'node:timers/promises';
|
|
8
|
+
import { setTimeout as setTimeout$1 } from 'node:timers/promises';
|
|
9
9
|
|
|
10
10
|
//#region src/lib/server/archive-location.ts
|
|
11
11
|
/** Account/region archive routing. Cached identities are for offline reads only. */
|
|
@@ -130,6 +130,13 @@ var ARCHIVE_SCHEMA = [
|
|
|
130
130
|
`ALTER TABLE log_events ADD COLUMN IF NOT EXISTS level_source VARCHAR`,
|
|
131
131
|
`ALTER TABLE log_events ADD COLUMN IF NOT EXISTS request_id VARCHAR`,
|
|
132
132
|
`CREATE TABLE IF NOT EXISTS archive_meta (key VARCHAR PRIMARY KEY, value VARCHAR)`,
|
|
133
|
+
`CREATE TABLE IF NOT EXISTS archive_coverage (
|
|
134
|
+
region VARCHAR NOT NULL,
|
|
135
|
+
log_group VARCHAR NOT NULL,
|
|
136
|
+
start_ms BIGINT NOT NULL,
|
|
137
|
+
end_ms BIGINT NOT NULL
|
|
138
|
+
)`,
|
|
139
|
+
`CREATE INDEX IF NOT EXISTS archive_coverage_key ON archive_coverage (region, log_group, start_ms)`,
|
|
133
140
|
`CREATE UNIQUE INDEX IF NOT EXISTS log_events_unique ON log_events (region, log_group, event_key)`,
|
|
134
141
|
`CREATE INDEX IF NOT EXISTS log_events_time ON log_events (region, log_group, timestamp_ms)`
|
|
135
142
|
];
|
|
@@ -345,6 +352,160 @@ function rowsToGroups(rows) {
|
|
|
345
352
|
}
|
|
346
353
|
return groups;
|
|
347
354
|
}
|
|
355
|
+
/** Drops intervals that are not a usable, ordered range. */
|
|
356
|
+
function isUsableInterval(interval) {
|
|
357
|
+
return Number.isFinite(interval.start) && Number.isFinite(interval.end) && interval.end >= interval.start;
|
|
358
|
+
}
|
|
359
|
+
/**
|
|
360
|
+
* Merges overlapping or adjacent intervals into the fewest ranges.
|
|
361
|
+
*
|
|
362
|
+
* Adjacency counts (`next.start === current.end + 1`) so two scans that met
|
|
363
|
+
* exactly leave one range rather than two, which keeps the table small. The
|
|
364
|
+
* input is not mutated.
|
|
365
|
+
*/
|
|
366
|
+
function mergeCoverage(intervals) {
|
|
367
|
+
const sorted = intervals.filter(isUsableInterval).map((interval) => ({
|
|
368
|
+
start: interval.start,
|
|
369
|
+
end: interval.end
|
|
370
|
+
})).toSorted((a, b) => a.start - b.start || a.end - b.end);
|
|
371
|
+
const merged = [];
|
|
372
|
+
for (const interval of sorted) {
|
|
373
|
+
const last = merged.at(-1);
|
|
374
|
+
if (last !== void 0 && interval.start <= last.end + 1) {
|
|
375
|
+
if (interval.end > last.end) last.end = interval.end;
|
|
376
|
+
} else merged.push(interval);
|
|
377
|
+
}
|
|
378
|
+
return merged;
|
|
379
|
+
}
|
|
380
|
+
/** The parts of `[start, end]` that `intervals` do cover, clipped to the range. */
|
|
381
|
+
function intersectCoverage(start, end, intervals) {
|
|
382
|
+
const covered = [];
|
|
383
|
+
for (const interval of mergeCoverage(intervals)) {
|
|
384
|
+
const clippedStart = Math.max(start, interval.start);
|
|
385
|
+
const clippedEnd = Math.min(end, interval.end);
|
|
386
|
+
if (clippedStart <= clippedEnd) covered.push({
|
|
387
|
+
start: clippedStart,
|
|
388
|
+
end: clippedEnd
|
|
389
|
+
});
|
|
390
|
+
}
|
|
391
|
+
return covered;
|
|
392
|
+
}
|
|
393
|
+
/** The parts of `[start, end]` that `intervals` do not cover, in order. */
|
|
394
|
+
function subtractCoverage(start, end, intervals) {
|
|
395
|
+
const uncovered = [];
|
|
396
|
+
let cursor = start;
|
|
397
|
+
for (const interval of mergeCoverage(intervals)) {
|
|
398
|
+
if (interval.end < cursor) continue;
|
|
399
|
+
if (interval.start > end) break;
|
|
400
|
+
if (interval.start > cursor) uncovered.push({
|
|
401
|
+
start: cursor,
|
|
402
|
+
end: interval.start - 1
|
|
403
|
+
});
|
|
404
|
+
cursor = Math.max(cursor, interval.end + 1);
|
|
405
|
+
if (cursor > end) return uncovered;
|
|
406
|
+
}
|
|
407
|
+
if (cursor <= end) uncovered.push({
|
|
408
|
+
start: cursor,
|
|
409
|
+
end
|
|
410
|
+
});
|
|
411
|
+
return uncovered;
|
|
412
|
+
}
|
|
413
|
+
/**
|
|
414
|
+
* How long CloudWatch is given to finish ingesting a moment before a read of it
|
|
415
|
+
* counts as complete.
|
|
416
|
+
*
|
|
417
|
+
* Events can be ingested well after their timestamp (agents batch and retry), so
|
|
418
|
+
* a range read at time `t` is only trusted up to `t - COVERAGE_SETTLE_MS`. The
|
|
419
|
+
* rest of the range is left uncovered and is fetched from CloudWatch again next
|
|
420
|
+
* time, which is what keeps a late event from being hidden behind the archive.
|
|
421
|
+
*/
|
|
422
|
+
var COVERAGE_SETTLE_MS = 3e5;
|
|
423
|
+
/**
|
|
424
|
+
* The part of a read range that had settled when it was read, or `null`.
|
|
425
|
+
*
|
|
426
|
+
* `readAt` is when the CloudWatch query started: anything newer than
|
|
427
|
+
* `readAt - settleMs` may still have been arriving.
|
|
428
|
+
*/
|
|
429
|
+
function settleCoverage(interval, readAt, settleMs = COVERAGE_SETTLE_MS) {
|
|
430
|
+
const settled = {
|
|
431
|
+
start: interval.start,
|
|
432
|
+
end: Math.min(interval.end, readAt - settleMs)
|
|
433
|
+
};
|
|
434
|
+
return isUsableInterval(settled) ? settled : null;
|
|
435
|
+
}
|
|
436
|
+
/** Reads the coverage intervals of several groups that overlap a window. */
|
|
437
|
+
function buildCoverageQuery(region, logGroups, start, end) {
|
|
438
|
+
const groups = logGroups.length > 0 ? logGroups : [""];
|
|
439
|
+
return {
|
|
440
|
+
sql: `SELECT log_group, start_ms, end_ms FROM archive_coverage WHERE region = ? AND log_group IN (${groups.map(() => "?").join(", ")}) AND end_ms >= ? AND start_ms <= ? ORDER BY log_group, start_ms`,
|
|
441
|
+
params: [
|
|
442
|
+
region,
|
|
443
|
+
...groups,
|
|
444
|
+
BigInt(Math.round(start)),
|
|
445
|
+
BigInt(Math.round(end))
|
|
446
|
+
]
|
|
447
|
+
};
|
|
448
|
+
}
|
|
449
|
+
/** Maps rows of `start_ms`/`end_ms` onto coverage intervals. */
|
|
450
|
+
function rowsToCoverage(rows) {
|
|
451
|
+
const intervals = [];
|
|
452
|
+
for (const row of rows) {
|
|
453
|
+
const start = toNumber(pick(row, "start_ms"));
|
|
454
|
+
const end = toNumber(pick(row, "end_ms"));
|
|
455
|
+
if (start !== null && end !== null) intervals.push({
|
|
456
|
+
start,
|
|
457
|
+
end
|
|
458
|
+
});
|
|
459
|
+
}
|
|
460
|
+
return intervals;
|
|
461
|
+
}
|
|
462
|
+
/** Maps {@link buildCoverageQuery} rows onto merged intervals per log group. */
|
|
463
|
+
function rowsToCoverageByGroup(rows) {
|
|
464
|
+
const byGroup = /* @__PURE__ */ new Map();
|
|
465
|
+
for (const row of rows) {
|
|
466
|
+
const group = pick(row, "log_group");
|
|
467
|
+
const start = toNumber(pick(row, "start_ms"));
|
|
468
|
+
const end = toNumber(pick(row, "end_ms"));
|
|
469
|
+
if (typeof group !== "string" || start === null || end === null) continue;
|
|
470
|
+
const list = byGroup.get(group);
|
|
471
|
+
if (list === void 0) byGroup.set(group, [{
|
|
472
|
+
start,
|
|
473
|
+
end
|
|
474
|
+
}]);
|
|
475
|
+
else list.push({
|
|
476
|
+
start,
|
|
477
|
+
end
|
|
478
|
+
});
|
|
479
|
+
}
|
|
480
|
+
for (const [group, intervals] of byGroup) byGroup.set(group, mergeCoverage(intervals));
|
|
481
|
+
return byGroup;
|
|
482
|
+
}
|
|
483
|
+
/** Every coverage interval of one group, for a merge-on-write. */
|
|
484
|
+
function buildCoverageGroupQuery(region, logGroup) {
|
|
485
|
+
return {
|
|
486
|
+
sql: "SELECT start_ms, end_ms FROM archive_coverage WHERE region = ? AND log_group = ? ORDER BY start_ms",
|
|
487
|
+
params: [region, logGroup]
|
|
488
|
+
};
|
|
489
|
+
}
|
|
490
|
+
/** Removes every coverage interval of one group, before the merged set is written. */
|
|
491
|
+
function buildCoverageDeleteQuery(region, logGroup) {
|
|
492
|
+
return {
|
|
493
|
+
sql: "DELETE FROM archive_coverage WHERE region = ? AND log_group = ?",
|
|
494
|
+
params: [region, logGroup]
|
|
495
|
+
};
|
|
496
|
+
}
|
|
497
|
+
/** Builds a multi-row insert of coverage intervals. */
|
|
498
|
+
function buildCoverageInsert(rowCount) {
|
|
499
|
+
if (!Number.isInteger(rowCount) || rowCount < 1) throw new RangeError(`rowCount must be a positive integer, received ${String(rowCount)}`);
|
|
500
|
+
const row = "(?, ?, ?, ?)";
|
|
501
|
+
return `INSERT INTO archive_coverage (region, log_group, start_ms, end_ms) VALUES ${Array.from({ length: rowCount }, () => row).join(", ")}`;
|
|
502
|
+
}
|
|
503
|
+
/** Flattens merged intervals into the parameters {@link buildCoverageInsert} expects. */
|
|
504
|
+
function toCoverageParams(region, logGroup, intervals) {
|
|
505
|
+
const params = [];
|
|
506
|
+
for (const interval of intervals) params.push(region, logGroup, BigInt(Math.round(interval.start)), BigInt(Math.round(interval.end)));
|
|
507
|
+
return params;
|
|
508
|
+
}
|
|
348
509
|
/**
|
|
349
510
|
* Row budget of one request-id backfill pass.
|
|
350
511
|
*
|
|
@@ -672,6 +833,17 @@ function resolveArchiveConfig(env, platform = process.platform, home = homedir()
|
|
|
672
833
|
};
|
|
673
834
|
}
|
|
674
835
|
/**
|
|
836
|
+
* Idle milliseconds after which the archive file is released, from
|
|
837
|
+
* `WATCH_TAIL_ARCHIVE_IDLE_MS`; `0` (the default) keeps it open.
|
|
838
|
+
*
|
|
839
|
+
* `watch-tail mcp` sets it for its private server, so an agent session does not
|
|
840
|
+
* hold DuckDB's single-process lock for as long as the agent runs.
|
|
841
|
+
*/
|
|
842
|
+
function archiveIdleReleaseMs(env) {
|
|
843
|
+
const parsed = Number(env.WATCH_TAIL_ARCHIVE_IDLE_MS?.trim() ?? "");
|
|
844
|
+
return Number.isFinite(parsed) && parsed > 0 ? Math.round(parsed) : 0;
|
|
845
|
+
}
|
|
846
|
+
/**
|
|
675
847
|
* A short, non-throwing description of an unknown failure.
|
|
676
848
|
*
|
|
677
849
|
* A conflicting lock is the one failure a user can act on, and DuckDB's own
|
|
@@ -700,9 +872,18 @@ var LogArchive = class LogArchive {
|
|
|
700
872
|
/** Database file this archive uses. */
|
|
701
873
|
path;
|
|
702
874
|
#connection = null;
|
|
875
|
+
#instance = null;
|
|
876
|
+
#driver = null;
|
|
703
877
|
#available = false;
|
|
704
878
|
#error = null;
|
|
705
879
|
#queue = Promise.resolve();
|
|
880
|
+
/** Idle time before the file is released, or 0 to keep it open. */
|
|
881
|
+
#idleReleaseMs = 0;
|
|
882
|
+
#idleTimer;
|
|
883
|
+
/** Statements queued or running, so the file is only released when none are. */
|
|
884
|
+
#pending = 0;
|
|
885
|
+
/** True while the file is closed by the idle release, to be reopened on demand. */
|
|
886
|
+
#released = false;
|
|
706
887
|
constructor(path) {
|
|
707
888
|
this.path = path;
|
|
708
889
|
}
|
|
@@ -718,20 +899,14 @@ var LogArchive = class LogArchive {
|
|
|
718
899
|
const archive = new LogArchive(options.path);
|
|
719
900
|
const load = options.load ?? loadDuckDbDriver;
|
|
720
901
|
const ensureDir = options.ensureDir ?? ((dir) => mkdirSync(dir, { recursive: true }));
|
|
902
|
+
const idle = options.idleReleaseMs ?? 0;
|
|
903
|
+
archive.#idleReleaseMs = Number.isFinite(idle) && idle > 0 ? Math.round(idle) : 0;
|
|
721
904
|
try {
|
|
722
905
|
ensureDir(dirname(options.path));
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
archive.#connection = connection;
|
|
728
|
-
archive.#available = true;
|
|
729
|
-
await archive.#backfillRequestIds();
|
|
730
|
-
break;
|
|
731
|
-
} catch (error) {
|
|
732
|
-
if (attempt >= 3 || !isLockError(error)) throw error;
|
|
733
|
-
await setTimeout(150);
|
|
734
|
-
}
|
|
906
|
+
archive.#driver = await load();
|
|
907
|
+
await archive.#connect();
|
|
908
|
+
archive.#available = true;
|
|
909
|
+
await archive.#backfillRequestIds();
|
|
735
910
|
} catch (error) {
|
|
736
911
|
archive.#available = false;
|
|
737
912
|
archive.#error = describeOpenError(error, options.path);
|
|
@@ -758,6 +933,51 @@ var LogArchive = class LogArchive {
|
|
|
758
933
|
get error() {
|
|
759
934
|
return this.#error;
|
|
760
935
|
}
|
|
936
|
+
/**
|
|
937
|
+
* Opens the file and brings it up to the current schema.
|
|
938
|
+
*
|
|
939
|
+
* Used by the first open and by a reopen after an idle release. A lock held by
|
|
940
|
+
* a process that is just exiting is retried briefly; any other failure throws.
|
|
941
|
+
*/
|
|
942
|
+
async #connect() {
|
|
943
|
+
const driver = this.#driver;
|
|
944
|
+
if (driver === null) throw new Error("the DuckDB driver is not loaded");
|
|
945
|
+
for (let attempt = 1;; attempt += 1) try {
|
|
946
|
+
const instance = await driver.DuckDBInstance.create(this.path);
|
|
947
|
+
const connection = await instance.connect();
|
|
948
|
+
for (const statement of ARCHIVE_SCHEMA) await connection.run(statement);
|
|
949
|
+
this.#instance = instance;
|
|
950
|
+
this.#connection = connection;
|
|
951
|
+
this.#released = false;
|
|
952
|
+
return;
|
|
953
|
+
} catch (error) {
|
|
954
|
+
if (attempt >= 3 || !isLockError(error)) throw error;
|
|
955
|
+
await setTimeout$1(150);
|
|
956
|
+
}
|
|
957
|
+
}
|
|
958
|
+
/** Closes the connection and the database, which releases the file lock. */
|
|
959
|
+
#disconnect() {
|
|
960
|
+
const connection = this.#connection;
|
|
961
|
+
const instance = this.#instance;
|
|
962
|
+
this.#connection = null;
|
|
963
|
+
this.#instance = null;
|
|
964
|
+
connection?.closeSync?.();
|
|
965
|
+
instance?.closeSync?.();
|
|
966
|
+
}
|
|
967
|
+
/** Arms the idle release once nothing is queued. */
|
|
968
|
+
#scheduleRelease() {
|
|
969
|
+
if (this.#idleReleaseMs === 0 || this.#pending > 0 || this.#connection === null) return;
|
|
970
|
+
clearTimeout(this.#idleTimer);
|
|
971
|
+
this.#idleTimer = setTimeout(() => {
|
|
972
|
+
this.#idleTimer = void 0;
|
|
973
|
+
this.#enqueue(async () => {
|
|
974
|
+
if (this.#pending > 0 || this.#connection === null) return;
|
|
975
|
+
this.#disconnect();
|
|
976
|
+
this.#released = true;
|
|
977
|
+
});
|
|
978
|
+
}, this.#idleReleaseMs);
|
|
979
|
+
this.#idleTimer.unref?.();
|
|
980
|
+
}
|
|
761
981
|
/** Runs one task after every task queued before it. */
|
|
762
982
|
#enqueue(task) {
|
|
763
983
|
const next = this.#queue.then(task, task);
|
|
@@ -766,13 +986,20 @@ var LogArchive = class LogArchive {
|
|
|
766
986
|
}
|
|
767
987
|
/** Runs a statement, returning the failure instead of throwing. */
|
|
768
988
|
async #guard(fallback, task) {
|
|
769
|
-
if (this.#connection === null) return fallback;
|
|
989
|
+
if (this.#connection === null && !this.#released) return fallback;
|
|
990
|
+
this.#pending += 1;
|
|
991
|
+
clearTimeout(this.#idleTimer);
|
|
992
|
+
this.#idleTimer = void 0;
|
|
770
993
|
return this.#enqueue(async () => {
|
|
771
994
|
try {
|
|
995
|
+
if (this.#connection === null && this.#released) await this.#connect();
|
|
772
996
|
return await task();
|
|
773
997
|
} catch (error) {
|
|
774
|
-
this.#error = error
|
|
998
|
+
this.#error = describeOpenError(error, this.path);
|
|
775
999
|
return fallback;
|
|
1000
|
+
} finally {
|
|
1001
|
+
this.#pending -= 1;
|
|
1002
|
+
this.#scheduleRelease();
|
|
776
1003
|
}
|
|
777
1004
|
});
|
|
778
1005
|
}
|
|
@@ -810,11 +1037,12 @@ var LogArchive = class LogArchive {
|
|
|
810
1037
|
});
|
|
811
1038
|
}
|
|
812
1039
|
/**
|
|
813
|
-
* Writes one batch of streamed events.
|
|
1040
|
+
* Writes one batch of streamed events, answering how many rows were written.
|
|
814
1041
|
*
|
|
815
1042
|
* Batches are split into chunks of {@link ARCHIVE_INSERT_CHUNK} rows, and
|
|
816
1043
|
* `INSERT OR IGNORE` plus the unique index make a repeated scan idempotent.
|
|
817
|
-
* Failures never propagate: a full disk must not interrupt a log stream.
|
|
1044
|
+
* Failures never propagate: a full disk must not interrupt a log stream. A
|
|
1045
|
+
* failed write answers `0`, so a caller can tell it from a stored batch.
|
|
818
1046
|
*/
|
|
819
1047
|
async record(region, logGroup, events) {
|
|
820
1048
|
if (events.length === 0) return 0;
|
|
@@ -830,18 +1058,28 @@ var LogArchive = class LogArchive {
|
|
|
830
1058
|
return written;
|
|
831
1059
|
});
|
|
832
1060
|
}
|
|
833
|
-
/**
|
|
1061
|
+
/**
|
|
1062
|
+
* Reads one page of archived events.
|
|
1063
|
+
*
|
|
1064
|
+
* A read that fails answers an empty page with `error` set, so a replay can
|
|
1065
|
+
* report the failure instead of mistaking it for the end of the window.
|
|
1066
|
+
*/
|
|
834
1067
|
async page(request) {
|
|
835
|
-
const
|
|
836
|
-
events: [],
|
|
837
|
-
last: null
|
|
838
|
-
};
|
|
839
|
-
return this.#guard(empty, async () => {
|
|
1068
|
+
const page = await this.#guard(null, async () => {
|
|
840
1069
|
const connection = this.#connection;
|
|
841
|
-
if (connection === null) return
|
|
1070
|
+
if (connection === null) return {
|
|
1071
|
+
events: [],
|
|
1072
|
+
last: null
|
|
1073
|
+
};
|
|
842
1074
|
const { sql, params } = buildPageQuery(request);
|
|
843
1075
|
return rowsToPage((await connection.runAndReadAll(sql, params)).getRowObjects());
|
|
844
1076
|
});
|
|
1077
|
+
if (page !== null) return page;
|
|
1078
|
+
return {
|
|
1079
|
+
events: [],
|
|
1080
|
+
last: null,
|
|
1081
|
+
...this.#available ? { error: this.#error ?? "the archive could not be read" } : {}
|
|
1082
|
+
};
|
|
845
1083
|
}
|
|
846
1084
|
/**
|
|
847
1085
|
* Bucketed counts for the chart, per group and level.
|
|
@@ -874,6 +1112,61 @@ var LogArchive = class LogArchive {
|
|
|
874
1112
|
return rowsToGroups((await connection.runAndReadAll(sql, params)).getRowObjects());
|
|
875
1113
|
});
|
|
876
1114
|
}
|
|
1115
|
+
/**
|
|
1116
|
+
* The ranges this archive is known to hold, per log group, within a window.
|
|
1117
|
+
*
|
|
1118
|
+
* Coverage is what makes a historic view able to read from the archive
|
|
1119
|
+
* instead of CloudWatch: it says which ranges watch-tail has already queried
|
|
1120
|
+
* and archived, so the request only has to ask AWS for the rest. An
|
|
1121
|
+
* unavailable archive answers an empty map, which sends the caller back to
|
|
1122
|
+
* CloudWatch for everything.
|
|
1123
|
+
*/
|
|
1124
|
+
async coverage(region, logGroups, start, end) {
|
|
1125
|
+
return this.#guard(/* @__PURE__ */ new Map(), async () => {
|
|
1126
|
+
const connection = this.#connection;
|
|
1127
|
+
if (connection === null) return /* @__PURE__ */ new Map();
|
|
1128
|
+
const { sql, params } = buildCoverageQuery(region, logGroups, start, end);
|
|
1129
|
+
return rowsToCoverageByGroup((await connection.runAndReadAll(sql, params)).getRowObjects());
|
|
1130
|
+
});
|
|
1131
|
+
}
|
|
1132
|
+
/**
|
|
1133
|
+
* Records the ranges a scan actually queried, merging them into what is known.
|
|
1134
|
+
*
|
|
1135
|
+
* One statement per group rewrites that group's intervals: the existing rows
|
|
1136
|
+
* are merged with the new ranges in JavaScript (which is where the adjacency
|
|
1137
|
+
* and overlap rules live) and written back as a small set. The archive is
|
|
1138
|
+
* single-writer, so this is serialised with the streams that are writing log
|
|
1139
|
+
* rows, and a failure is reported on `error` without interrupting a view.
|
|
1140
|
+
*/
|
|
1141
|
+
async recordCoverage(region, entries) {
|
|
1142
|
+
if (entries.length === 0) return;
|
|
1143
|
+
await this.#guard(void 0, async () => {
|
|
1144
|
+
const connection = this.#connection;
|
|
1145
|
+
if (connection === null) return;
|
|
1146
|
+
const byGroup = /* @__PURE__ */ new Map();
|
|
1147
|
+
for (const entry of entries) {
|
|
1148
|
+
const list = byGroup.get(entry.logGroup);
|
|
1149
|
+
if (list === void 0) byGroup.set(entry.logGroup, [{
|
|
1150
|
+
start: entry.start,
|
|
1151
|
+
end: entry.end
|
|
1152
|
+
}]);
|
|
1153
|
+
else list.push({
|
|
1154
|
+
start: entry.start,
|
|
1155
|
+
end: entry.end
|
|
1156
|
+
});
|
|
1157
|
+
}
|
|
1158
|
+
for (const [logGroup, intervals] of byGroup) {
|
|
1159
|
+
const query = buildCoverageGroupQuery(region, logGroup);
|
|
1160
|
+
const merged = mergeCoverage([...mergeCoverage(rowsToCoverage((await connection.runAndReadAll(query.sql, query.params)).getRowObjects())), ...intervals]);
|
|
1161
|
+
const removal = buildCoverageDeleteQuery(region, logGroup);
|
|
1162
|
+
await connection.run(removal.sql, removal.params);
|
|
1163
|
+
for (let start = 0; start < merged.length; start += 500) {
|
|
1164
|
+
const chunk = merged.slice(start, start + 500);
|
|
1165
|
+
await connection.run(buildCoverageInsert(chunk.length), toCoverageParams(region, logGroup, chunk));
|
|
1166
|
+
}
|
|
1167
|
+
}
|
|
1168
|
+
});
|
|
1169
|
+
}
|
|
877
1170
|
/** Status for `GET /api/archive`, including the file size on disk. */
|
|
878
1171
|
async status() {
|
|
879
1172
|
const totals = await this.totals();
|
|
@@ -891,14 +1184,20 @@ var LogArchive = class LogArchive {
|
|
|
891
1184
|
totals
|
|
892
1185
|
};
|
|
893
1186
|
}
|
|
894
|
-
/** Closes the connection. Safe to call twice. */
|
|
1187
|
+
/** Closes the connection and the database file. Safe to call twice. */
|
|
895
1188
|
async close() {
|
|
1189
|
+
clearTimeout(this.#idleTimer);
|
|
1190
|
+
this.#idleTimer = void 0;
|
|
896
1191
|
const connection = this.#connection;
|
|
1192
|
+
const instance = this.#instance;
|
|
897
1193
|
this.#connection = null;
|
|
1194
|
+
this.#instance = null;
|
|
898
1195
|
this.#available = false;
|
|
899
|
-
|
|
1196
|
+
this.#released = false;
|
|
1197
|
+
if (connection?.closeSync === void 0 && instance?.closeSync === void 0) return;
|
|
900
1198
|
await this.#enqueue(async () => {
|
|
901
|
-
connection
|
|
1199
|
+
connection?.closeSync?.();
|
|
1200
|
+
instance?.closeSync?.();
|
|
902
1201
|
});
|
|
903
1202
|
}
|
|
904
1203
|
};
|
|
@@ -918,14 +1217,15 @@ async function getArchive(env, selection = {}, load) {
|
|
|
918
1217
|
path = resolve(path);
|
|
919
1218
|
let archive = sharedArchives.get(path);
|
|
920
1219
|
if (!archive) {
|
|
1220
|
+
const idleReleaseMs = archiveIdleReleaseMs(env);
|
|
921
1221
|
archive = LogArchive.open({
|
|
922
1222
|
path,
|
|
923
|
-
...{}
|
|
1223
|
+
...{} ,
|
|
1224
|
+
...idleReleaseMs === 0 ? {} : { idleReleaseMs }
|
|
924
1225
|
});
|
|
925
1226
|
sharedArchives.set(path, archive);
|
|
926
1227
|
}
|
|
927
1228
|
return archive;
|
|
928
1229
|
}
|
|
929
1230
|
|
|
930
|
-
export { getArchive as g };
|
|
931
|
-
//# sourceMappingURL=archive.js-D2jtMmDo.js.map
|
|
1231
|
+
export { settleCoverage as a, getArchive as g, intersectCoverage as i, mergeCoverage as m, subtractCoverage as s };
|
|
@@ -319,4 +319,3 @@ function readEnv() {
|
|
|
319
319
|
}
|
|
320
320
|
|
|
321
321
|
export { REGION_PARAM_HINT as R, apiError as a, readEnv as b, createStsClient as c, createLogsClient as d, resolveEffectiveRegion as e, describeAwsError as f, parseRegionParam as p, resolveAwsConfig as r };
|
|
322
|
-
//# sourceMappingURL=env2.js-C5BgBJDY.js.map
|
|
@@ -1,8 +1,3 @@
|
|
|
1
|
-
//#region node_modules/.pnpm/@sveltejs+kit@2.70.3_@sveltejs+vite-plugin-svelte@7.3.0_svelte@5.57.0_vite@8.2.2_@types_ab6e39593f61aae0ad0b9a1bac6935c7/node_modules/@sveltejs/kit/src/utils/url.js
|
|
2
|
-
/**
|
|
3
|
-
* Matches a URI scheme. See https://www.rfc-editor.org/rfc/rfc3986#section-3.1
|
|
4
|
-
* @type {RegExp}
|
|
5
|
-
*/
|
|
6
1
|
var internal = new URL("sveltekit-internal://");
|
|
7
2
|
/**
|
|
8
3
|
* @param {string} base
|
|
@@ -265,4 +260,3 @@ var validate_layout_server_exports = validator(valid_layout_server_exports);
|
|
|
265
260
|
var validate_page_server_exports = validator(valid_page_server_exports);
|
|
266
261
|
|
|
267
262
|
export { disable_search as a, validate_layout_exports as b, validate_page_server_exports as c, decode_pathname as d, validate_page_exports as e, find_route as f, hash as h, make_trackable as m, normalize_path as n, resolve as r, validate_layout_server_exports as v };
|
|
268
|
-
//# sourceMappingURL=exports.js-ClPPfcHj.js.map
|