@recombine-ai/bosun 0.7.0 → 0.8.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.
- package/bin/bosun.js +12 -9
- package/build/client/_app/immutable/assets/0.CeYdzR0K.css +1 -0
- package/build/client/_app/immutable/assets/0.CeYdzR0K.css.br +0 -0
- package/build/client/_app/immutable/assets/0.CeYdzR0K.css.gz +0 -0
- package/build/client/_app/immutable/assets/Popper.CLTyHc88.css +1 -0
- package/build/client/_app/immutable/assets/Popper.CLTyHc88.css.br +0 -0
- package/build/client/_app/immutable/assets/Popper.CLTyHc88.css.gz +0 -0
- package/build/client/_app/immutable/assets/chat-content.Cabnnfyv.css +1 -0
- package/build/client/_app/immutable/assets/chat-content.Cabnnfyv.css.br +0 -0
- package/build/client/_app/immutable/assets/chat-content.Cabnnfyv.css.gz +0 -0
- package/build/client/_app/immutable/chunks/3HVf2z3Q.js +1 -0
- package/build/client/_app/immutable/chunks/3HVf2z3Q.js.br +0 -0
- package/build/client/_app/immutable/chunks/3HVf2z3Q.js.gz +0 -0
- package/build/client/_app/immutable/chunks/8mHyIC1B.js +1 -0
- package/build/client/_app/immutable/chunks/8mHyIC1B.js.br +0 -0
- package/build/client/_app/immutable/chunks/8mHyIC1B.js.gz +0 -0
- package/build/client/_app/immutable/chunks/B394X4Dm.js +1 -0
- package/build/client/_app/immutable/chunks/B394X4Dm.js.br +0 -0
- package/build/client/_app/immutable/chunks/B394X4Dm.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{inUV6bWj.js → B5pH84aF.js} +1 -1
- package/build/client/_app/immutable/chunks/B5pH84aF.js.br +0 -0
- package/build/client/_app/immutable/chunks/B5pH84aF.js.gz +0 -0
- package/build/client/_app/immutable/chunks/B7r4ghJg.js +1 -0
- package/build/client/_app/immutable/chunks/B7r4ghJg.js.br +2 -0
- package/build/client/_app/immutable/chunks/B7r4ghJg.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BALCah_8.js +2 -0
- package/build/client/_app/immutable/chunks/BALCah_8.js.br +0 -0
- package/build/client/_app/immutable/chunks/BALCah_8.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BEJ5fU19.js +1 -0
- package/build/client/_app/immutable/chunks/BEJ5fU19.js.br +0 -0
- package/build/client/_app/immutable/chunks/BEJ5fU19.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BFchB-2I.js +1 -0
- package/build/client/_app/immutable/chunks/BFchB-2I.js.br +0 -0
- package/build/client/_app/immutable/chunks/BFchB-2I.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{DhhcRlSv.js → BRMnbBOX.js} +1 -1
- package/build/client/_app/immutable/chunks/BRMnbBOX.js.br +0 -0
- package/build/client/_app/immutable/chunks/{DhhcRlSv.js.gz → BRMnbBOX.js.gz} +0 -0
- package/build/client/_app/immutable/chunks/{BI8g8xqR.js → BfU3a6pG.js} +1 -1
- package/build/client/_app/immutable/chunks/BfU3a6pG.js.br +0 -0
- package/build/client/_app/immutable/chunks/BfU3a6pG.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Bk5z628g.js +1 -0
- package/build/client/_app/immutable/chunks/Bk5z628g.js.br +0 -0
- package/build/client/_app/immutable/chunks/Bk5z628g.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BmJonxL2.js +1 -0
- package/build/client/_app/immutable/chunks/BmJonxL2.js.br +0 -0
- package/build/client/_app/immutable/chunks/BmJonxL2.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{CEH18jSl.js → C1rQHXql.js} +1 -1
- package/build/client/_app/immutable/chunks/C1rQHXql.js.br +0 -0
- package/build/client/_app/immutable/chunks/C1rQHXql.js.gz +0 -0
- package/build/client/_app/immutable/chunks/C3cmQ-ZQ.js +1 -0
- package/build/client/_app/immutable/chunks/C3cmQ-ZQ.js.br +0 -0
- package/build/client/_app/immutable/chunks/C3cmQ-ZQ.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CB3MYTwM.js +2 -0
- package/build/client/_app/immutable/chunks/CB3MYTwM.js.br +0 -0
- package/build/client/_app/immutable/chunks/CB3MYTwM.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{V9U6b0dU.js → CJHvtD7r.js} +4 -4
- package/build/client/_app/immutable/chunks/CJHvtD7r.js.br +0 -0
- package/build/client/_app/immutable/chunks/CJHvtD7r.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CMCi0U-6.js +5 -0
- package/build/client/_app/immutable/chunks/CMCi0U-6.js.br +0 -0
- package/build/client/_app/immutable/chunks/CMCi0U-6.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CMN-Rq6J.js +1 -0
- package/build/client/_app/immutable/chunks/CMN-Rq6J.js.br +0 -0
- package/build/client/_app/immutable/chunks/CMN-Rq6J.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CU1-H3C1.js +1 -0
- package/build/client/_app/immutable/chunks/CU1-H3C1.js.br +0 -0
- package/build/client/_app/immutable/chunks/CU1-H3C1.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CmatTLDp.js +1 -0
- package/build/client/_app/immutable/chunks/CmatTLDp.js.br +0 -0
- package/build/client/_app/immutable/chunks/CmatTLDp.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Cob_zFH5.js +1 -0
- package/build/client/_app/immutable/chunks/Cob_zFH5.js.br +0 -0
- package/build/client/_app/immutable/chunks/Cob_zFH5.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{CKAQS_Ig.js → DAyj7AJo.js} +1 -1
- package/build/client/_app/immutable/chunks/DAyj7AJo.js.br +0 -0
- package/build/client/_app/immutable/chunks/DAyj7AJo.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DCT4VKzQ.js +1 -0
- package/build/client/_app/immutable/chunks/DCT4VKzQ.js.br +0 -0
- package/build/client/_app/immutable/chunks/DCT4VKzQ.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{Deds-Bu4.js → DGK-Y22B.js} +3 -3
- package/build/client/_app/immutable/chunks/DGK-Y22B.js.br +0 -0
- package/build/client/_app/immutable/chunks/DGK-Y22B.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DJH8-Pxb.js +1 -0
- package/build/client/_app/immutable/chunks/DJH8-Pxb.js.br +0 -0
- package/build/client/_app/immutable/chunks/DJH8-Pxb.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DMtzEpj5.js +2 -0
- package/build/client/_app/immutable/chunks/DMtzEpj5.js.br +0 -0
- package/build/client/_app/immutable/chunks/DMtzEpj5.js.gz +0 -0
- package/build/client/_app/immutable/chunks/D_iTaAhh.js +1 -0
- package/build/client/_app/immutable/chunks/D_iTaAhh.js.br +0 -0
- package/build/client/_app/immutable/chunks/D_iTaAhh.js.gz +0 -0
- package/build/client/_app/immutable/chunks/De71gW9B.js +1 -0
- package/build/client/_app/immutable/chunks/De71gW9B.js.br +0 -0
- package/build/client/_app/immutable/chunks/De71gW9B.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{CfrwacJp.js → Dh5nRfGH.js} +1 -1
- package/build/client/_app/immutable/chunks/Dh5nRfGH.js.br +0 -0
- package/build/client/_app/immutable/chunks/Dh5nRfGH.js.gz +0 -0
- package/build/client/_app/immutable/chunks/ddC1NP9R.js +2 -0
- package/build/client/_app/immutable/chunks/ddC1NP9R.js.br +0 -0
- package/build/client/_app/immutable/chunks/ddC1NP9R.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{BgzmmD_x.js → rHISuZrQ.js} +1 -1
- package/build/client/_app/immutable/chunks/rHISuZrQ.js.br +0 -0
- package/build/client/_app/immutable/chunks/rHISuZrQ.js.gz +0 -0
- package/build/client/_app/immutable/entry/app.z0HZlVW2.js +2 -0
- package/build/client/_app/immutable/entry/app.z0HZlVW2.js.br +0 -0
- package/build/client/_app/immutable/entry/app.z0HZlVW2.js.gz +0 -0
- package/build/client/_app/immutable/entry/start.BI2d1Cy8.js +1 -0
- package/build/client/_app/immutable/entry/start.BI2d1Cy8.js.br +2 -0
- package/build/client/_app/immutable/entry/start.BI2d1Cy8.js.gz +0 -0
- package/build/client/_app/immutable/nodes/{0.CVdeFtgc.js → 0.K529fk47.js} +1 -1
- package/build/client/_app/immutable/nodes/0.K529fk47.js.br +0 -0
- package/build/client/_app/immutable/nodes/0.K529fk47.js.gz +0 -0
- package/build/client/_app/immutable/nodes/1.Do0rKYuZ.js +1 -0
- package/build/client/_app/immutable/nodes/1.Do0rKYuZ.js.br +0 -0
- package/build/client/_app/immutable/nodes/1.Do0rKYuZ.js.gz +0 -0
- package/build/client/_app/immutable/nodes/10.IAMYOUml.js +5 -0
- package/build/client/_app/immutable/nodes/10.IAMYOUml.js.br +0 -0
- package/build/client/_app/immutable/nodes/10.IAMYOUml.js.gz +0 -0
- package/build/client/_app/immutable/nodes/{14.PLVwHmf8.js → 15.DJq8KQca.js} +1 -1
- package/build/client/_app/immutable/nodes/15.DJq8KQca.js.br +0 -0
- package/build/client/_app/immutable/nodes/15.DJq8KQca.js.gz +0 -0
- package/build/client/_app/immutable/nodes/16.MpUk9w5x.js +1 -0
- package/build/client/_app/immutable/nodes/16.MpUk9w5x.js.br +0 -0
- package/build/client/_app/immutable/nodes/16.MpUk9w5x.js.gz +0 -0
- package/build/client/_app/immutable/nodes/17.DeKTr1ON.js +3 -0
- package/build/client/_app/immutable/nodes/17.DeKTr1ON.js.br +0 -0
- package/build/client/_app/immutable/nodes/17.DeKTr1ON.js.gz +0 -0
- package/build/client/_app/immutable/nodes/{15.IKNR1t1s.js → 18.CCXr28ln.js} +5 -5
- package/build/client/_app/immutable/nodes/18.CCXr28ln.js.br +0 -0
- package/build/client/_app/immutable/nodes/18.CCXr28ln.js.gz +0 -0
- package/build/client/_app/immutable/nodes/{2.P49VQzwV.js → 2.B6rYWR87.js} +2 -2
- package/build/client/_app/immutable/nodes/2.B6rYWR87.js.br +0 -0
- package/build/client/_app/immutable/nodes/2.B6rYWR87.js.gz +0 -0
- package/build/client/_app/immutable/nodes/3.CFCUpmUO.js +1 -0
- package/build/client/_app/immutable/nodes/3.CFCUpmUO.js.br +0 -0
- package/build/client/_app/immutable/nodes/3.CFCUpmUO.js.gz +0 -0
- package/build/client/_app/immutable/nodes/4.BYbOpI2z.js +1 -0
- package/build/client/_app/immutable/nodes/4.BYbOpI2z.js.br +0 -0
- package/build/client/_app/immutable/nodes/4.BYbOpI2z.js.gz +0 -0
- package/build/client/_app/immutable/nodes/5.DPO0SD9J.js +1 -0
- package/build/client/_app/immutable/nodes/5.DPO0SD9J.js.br +0 -0
- package/build/client/_app/immutable/nodes/5.DPO0SD9J.js.gz +0 -0
- package/build/client/_app/immutable/nodes/{5.C02zTRTT.js → 6.BJVVMbLC.js} +1 -1
- package/build/client/_app/immutable/nodes/6.BJVVMbLC.js.br +0 -0
- package/build/client/_app/immutable/nodes/6.BJVVMbLC.js.gz +0 -0
- package/build/client/_app/immutable/nodes/{7.BYKTckLf.js → 8.BAyrbFTp.js} +1 -1
- package/build/client/_app/immutable/nodes/8.BAyrbFTp.js.br +0 -0
- package/build/client/_app/immutable/nodes/8.BAyrbFTp.js.gz +0 -0
- package/build/client/_app/immutable/nodes/{8.C7tk-Wsh.js → 9.BUcdtwTB.js} +2 -2
- package/build/client/_app/immutable/nodes/9.BUcdtwTB.js.br +0 -0
- package/build/client/_app/immutable/nodes/9.BUcdtwTB.js.gz +0 -0
- package/build/client/_app/version.json +1 -1
- package/build/client/_app/version.json.br +0 -0
- package/build/client/_app/version.json.gz +0 -0
- package/build/server/chunks/0-BAKgi60O.js +9 -0
- package/build/server/chunks/{0-DtejLnPd.js.map → 0-BAKgi60O.js.map} +1 -1
- package/build/server/chunks/1-jYHJB-tb.js +9 -0
- package/build/server/chunks/{1-Dw6tCl-K.js.map → 1-jYHJB-tb.js.map} +1 -1
- package/build/server/chunks/10-YF1bugMU.js +9 -0
- package/build/server/chunks/10-YF1bugMU.js.map +1 -0
- package/build/server/chunks/{10-DZjMDIvS.js → 11-D9ueFvgV.js} +3 -3
- package/build/server/chunks/{10-DZjMDIvS.js.map → 11-D9ueFvgV.js.map} +1 -1
- package/build/server/chunks/{11-D6F4I8KX.js → 12-s9qxLZI8.js} +3 -3
- package/build/server/chunks/{11-D6F4I8KX.js.map → 12-s9qxLZI8.js.map} +1 -1
- package/build/server/chunks/{12-2vbUmx0n.js → 13-DSBw3elU.js} +3 -3
- package/build/server/chunks/{12-2vbUmx0n.js.map → 13-DSBw3elU.js.map} +1 -1
- package/build/server/chunks/{13-C067TjV7.js → 14-Dys1MDrz.js} +3 -3
- package/build/server/chunks/{13-C067TjV7.js.map → 14-Dys1MDrz.js.map} +1 -1
- package/build/server/chunks/15-D8gRuCBg.js +9 -0
- package/build/server/chunks/15-D8gRuCBg.js.map +1 -0
- package/build/server/chunks/16-BRBiMoCX.js +20 -0
- package/build/server/chunks/16-BRBiMoCX.js.map +1 -0
- package/build/server/chunks/17-D9vMxjRh.js +9 -0
- package/build/server/chunks/17-D9vMxjRh.js.map +1 -0
- package/build/server/chunks/18-BLN7cTaf.js +9 -0
- package/build/server/chunks/18-BLN7cTaf.js.map +1 -0
- package/build/server/chunks/2-B4P_qP3q.js +9 -0
- package/build/server/chunks/2-B4P_qP3q.js.map +1 -0
- package/build/server/chunks/3-njAy3GOi.js +9 -0
- package/build/server/chunks/3-njAy3GOi.js.map +1 -0
- package/build/server/chunks/4-DPlYm_DX.js +9 -0
- package/build/server/chunks/4-DPlYm_DX.js.map +1 -0
- package/build/server/chunks/5-BcfdXwaX.js +9 -0
- package/build/server/chunks/5-BcfdXwaX.js.map +1 -0
- package/build/server/chunks/6-DtBEsI4e.js +9 -0
- package/build/server/chunks/6-DtBEsI4e.js.map +1 -0
- package/build/server/chunks/{6-B6C38HXu.js → 7-BixmjuY5.js} +3 -3
- package/build/server/chunks/{6-B6C38HXu.js.map → 7-BixmjuY5.js.map} +1 -1
- package/build/server/chunks/8-DVq9JSHT.js +9 -0
- package/build/server/chunks/8-DVq9JSHT.js.map +1 -0
- package/build/server/chunks/9-BMEiMRkj.js +9 -0
- package/build/server/chunks/9-BMEiMRkj.js.map +1 -0
- package/build/server/chunks/{AgentSidebar-BHphbGfv.js → AgentSidebar-BYk5FBc0.js} +5 -5
- package/build/server/chunks/{AgentSidebar-BHphbGfv.js.map → AgentSidebar-BYk5FBc0.js.map} +1 -1
- package/build/server/chunks/{Button-DZYrr6c0.js → Button-CMHzABlu.js} +2 -2
- package/build/server/chunks/{Button-DZYrr6c0.js.map → Button-CMHzABlu.js.map} +1 -1
- package/build/server/chunks/{ChatStepTrace-Dy9ryvqZ.js → ChatStepTrace-BWp_rIDm.js} +6 -6
- package/build/server/chunks/{ChatStepTrace-Dy9ryvqZ.js.map → ChatStepTrace-BWp_rIDm.js.map} +1 -1
- package/build/server/chunks/{ContextEditor-ByGoXY5_.js → ContextEditor-DwSmZH0Y.js} +4 -4
- package/build/server/chunks/{ContextEditor-ByGoXY5_.js.map → ContextEditor-DwSmZH0Y.js.map} +1 -1
- package/build/server/chunks/{Dropdown-Bz9eHilg.js → Dropdown-DroDbZQ6.js} +3 -2
- package/build/server/chunks/Dropdown-DroDbZQ6.js.map +1 -0
- package/build/server/chunks/{Icon-C98HpfFT.js → Icon-DdOrLZIU.js} +2 -2
- package/build/server/chunks/{Icon-C98HpfFT.js.map → Icon-DdOrLZIU.js.map} +1 -1
- package/build/server/chunks/{Input-DZT3Mm_-.js → Input-D-7S8dEO.js} +2 -2
- package/build/server/chunks/{Input-DZT3Mm_-.js.map → Input-D-7S8dEO.js.map} +1 -1
- package/build/server/chunks/{Modal-D4tx0Bdo.js → Modal-CBKUwUGm.js} +5 -5
- package/build/server/chunks/{Modal-D4tx0Bdo.js.map → Modal-CBKUwUGm.js.map} +1 -1
- package/build/server/chunks/{Tab-ClYAMM-e.js → Tab-DMBlstpi.js} +5 -5
- package/build/server/chunks/{Tab-ClYAMM-e.js.map → Tab-DMBlstpi.js.map} +1 -1
- package/build/server/chunks/{_layout.svelte-B6NfHVfy.js → _layout.svelte-B3_pVwfN.js} +6 -6
- package/build/server/chunks/{_layout.svelte-B6NfHVfy.js.map → _layout.svelte-B3_pVwfN.js.map} +1 -1
- package/build/server/chunks/{_layout.svelte-BoUClC-X.js → _layout.svelte-BnR072vW.js} +15 -14
- package/build/server/chunks/_layout.svelte-BnR072vW.js.map +1 -0
- package/build/server/chunks/_layout.svelte-BnUNGsUV.js +58 -0
- package/build/server/chunks/_layout.svelte-BnUNGsUV.js.map +1 -0
- package/build/server/chunks/{_layout.svelte-DfPEqRLq.js → _layout.svelte-BxARmfhE.js} +17 -17
- package/build/server/chunks/{_layout.svelte-DfPEqRLq.js.map → _layout.svelte-BxARmfhE.js.map} +1 -1
- package/build/server/chunks/{_page.svelte-Ck9Utnoc.js → _page.svelte-BB_XBfMx.js} +5 -5
- package/build/server/chunks/{_page.svelte-Ck9Utnoc.js.map → _page.svelte-BB_XBfMx.js.map} +1 -1
- package/build/server/chunks/{_page.svelte-CbqAsz26.js → _page.svelte-BaDwHJpC.js} +3 -3
- package/build/server/chunks/{_page.svelte-CbqAsz26.js.map → _page.svelte-BaDwHJpC.js.map} +1 -1
- package/build/server/chunks/{_page.svelte-mAhccGhM.js → _page.svelte-Bqd9YZKg.js} +11 -11
- package/build/server/chunks/{_page.svelte-mAhccGhM.js.map → _page.svelte-Bqd9YZKg.js.map} +1 -1
- package/build/server/chunks/_page.svelte-BzEHuU3o.js +763 -0
- package/build/server/chunks/_page.svelte-BzEHuU3o.js.map +1 -0
- package/build/server/chunks/{_page.svelte-rYYB_tCn.js → _page.svelte-CYLWOoKK.js} +9 -9
- package/build/server/chunks/{_page.svelte-rYYB_tCn.js.map → _page.svelte-CYLWOoKK.js.map} +1 -1
- package/build/server/chunks/{_page.svelte-DR3jiCLg.js → _page.svelte-CoCvoIxm.js} +13 -12
- package/build/server/chunks/_page.svelte-CoCvoIxm.js.map +1 -0
- package/build/server/chunks/{_page.svelte-Dl2WmUCF.js → _page.svelte-DKRvXTam.js} +7 -7
- package/build/server/chunks/{_page.svelte-Dl2WmUCF.js.map → _page.svelte-DKRvXTam.js.map} +1 -1
- package/build/server/chunks/{_page.svelte-CBh9OOQz.js → _page.svelte-DYCzxw9U.js} +11 -11
- package/build/server/chunks/{_page.svelte-CBh9OOQz.js.map → _page.svelte-DYCzxw9U.js.map} +1 -1
- package/build/server/chunks/_server.ts-CUTB_pVv.js +139 -0
- package/build/server/chunks/_server.ts-CUTB_pVv.js.map +1 -0
- package/build/server/chunks/_server.ts-CbcaMe9z.js +38 -0
- package/build/server/chunks/_server.ts-CbcaMe9z.js.map +1 -0
- package/build/server/chunks/{agents-context-BrlIlkOW.js → agents-context-DJAK2Ml6.js} +2 -2
- package/build/server/chunks/{agents-context-BrlIlkOW.js.map → agents-context-DJAK2Ml6.js.map} +1 -1
- package/build/server/chunks/{source-selection-DJzHsjzD.js → client-tqD_VlIn.js} +3 -107
- package/build/server/chunks/client-tqD_VlIn.js.map +1 -0
- package/build/server/chunks/{context-zH5kvtGY.js → context-B0vutJuA.js} +2 -2
- package/build/server/chunks/{context-zH5kvtGY.js.map → context-B0vutJuA.js.map} +1 -1
- package/build/server/chunks/{edit-workspace-context-OTOIRCI0.js → edit-workspace-context-BQXwYkgE.js} +3 -3
- package/build/server/chunks/{edit-workspace-context-OTOIRCI0.js.map → edit-workspace-context-BQXwYkgE.js.map} +1 -1
- package/build/server/chunks/{error.svelte-DP2oBSvv.js → error.svelte-DZg1sSW2.js} +5 -5
- package/build/server/chunks/{error.svelte-DP2oBSvv.js.map → error.svelte-DZg1sSW2.js.map} +1 -1
- package/build/server/chunks/{events-M0vvlm3M.js → events-Hd1jvlZp.js} +2 -2
- package/build/server/chunks/{events-M0vvlm3M.js.map → events-Hd1jvlZp.js.map} +1 -1
- package/build/server/chunks/{index-DxaLoiKh.js → index-BSa6KzSq.js} +2 -2
- package/build/server/chunks/{index-DxaLoiKh.js.map → index-BSa6KzSq.js.map} +1 -1
- package/build/server/chunks/{index-server-CefdgakO.js → index-server-BI-Ep7Rw.js} +3 -3
- package/build/server/chunks/{index-server-CefdgakO.js.map → index-server-BI-Ep7Rw.js.map} +1 -1
- package/build/server/chunks/{index2-BuOY2QE4.js → index2-BpEbpEAf.js} +3 -3
- package/build/server/chunks/{index2-BuOY2QE4.js.map → index2-BpEbpEAf.js.map} +1 -1
- package/build/server/chunks/{index3-CpMl6FwG.js → index3-Cp9d5nmD.js} +4 -4
- package/build/server/chunks/{index3-CpMl6FwG.js.map → index3-Cp9d5nmD.js.map} +1 -1
- package/build/server/chunks/latency-recordings-CqioXMQl.js +117 -0
- package/build/server/chunks/latency-recordings-CqioXMQl.js.map +1 -0
- package/build/server/chunks/source-selection-hOQHZ-fn.js +109 -0
- package/build/server/chunks/source-selection-hOQHZ-fn.js.map +1 -0
- package/build/server/chunks/{state.svelte-DtOGaiYC.js → state.svelte-DbqYHGBV.js} +2 -2
- package/build/server/chunks/{state.svelte-DtOGaiYC.js.map → state.svelte-DbqYHGBV.js.map} +1 -1
- package/build/server/index.js +32 -10
- package/build/server/index.js.map +1 -1
- package/build/server/manifest.js +60 -29
- package/build/server/manifest.js.map +1 -1
- package/package.json +1 -1
- package/src/backend/lib/project-data-dir.spec.ts +19 -0
- package/src/backend/lib/project-data-dir.ts +9 -0
- package/src/backend/roleplay/fs-persistence.ts +5 -4
- package/src/backend/roleplay/router.ts +2 -1
- package/src/backend/traces/latency-recordings.ts +178 -0
- package/build/client/_app/immutable/assets/0.DHvyfZ2Z.css +0 -1
- package/build/client/_app/immutable/assets/0.DHvyfZ2Z.css.br +0 -0
- package/build/client/_app/immutable/assets/0.DHvyfZ2Z.css.gz +0 -0
- package/build/client/_app/immutable/assets/chat-content.NFJFjHv0.css +0 -1
- package/build/client/_app/immutable/assets/chat-content.NFJFjHv0.css.br +0 -0
- package/build/client/_app/immutable/assets/chat-content.NFJFjHv0.css.gz +0 -0
- package/build/client/_app/immutable/chunks/B375rjLA.js +0 -1
- package/build/client/_app/immutable/chunks/B375rjLA.js.br +0 -0
- package/build/client/_app/immutable/chunks/B375rjLA.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BI8g8xqR.js.br +0 -0
- package/build/client/_app/immutable/chunks/BI8g8xqR.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BcH1VEVU.js +0 -1
- package/build/client/_app/immutable/chunks/BcH1VEVU.js.br +0 -0
- package/build/client/_app/immutable/chunks/BcH1VEVU.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BgzmmD_x.js.br +0 -0
- package/build/client/_app/immutable/chunks/BgzmmD_x.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Bv4OM4kB.js +0 -1
- package/build/client/_app/immutable/chunks/Bv4OM4kB.js.br +0 -0
- package/build/client/_app/immutable/chunks/Bv4OM4kB.js.gz +0 -0
- package/build/client/_app/immutable/chunks/C0bQ35Gc.js +0 -1
- package/build/client/_app/immutable/chunks/C0bQ35Gc.js.br +0 -0
- package/build/client/_app/immutable/chunks/C0bQ35Gc.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CEH18jSl.js.br +0 -0
- package/build/client/_app/immutable/chunks/CEH18jSl.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CFWooaMM.js +0 -2
- package/build/client/_app/immutable/chunks/CFWooaMM.js.br +0 -0
- package/build/client/_app/immutable/chunks/CFWooaMM.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CKAQS_Ig.js.br +0 -0
- package/build/client/_app/immutable/chunks/CKAQS_Ig.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CfrwacJp.js.br +0 -0
- package/build/client/_app/immutable/chunks/CfrwacJp.js.gz +0 -0
- package/build/client/_app/immutable/chunks/D9tAw4x5.js +0 -1
- package/build/client/_app/immutable/chunks/D9tAw4x5.js.br +0 -2
- package/build/client/_app/immutable/chunks/D9tAw4x5.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DBgGiJzg.js +0 -5
- package/build/client/_app/immutable/chunks/DBgGiJzg.js.br +0 -0
- package/build/client/_app/immutable/chunks/DBgGiJzg.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DXFUtTrQ.js +0 -1
- package/build/client/_app/immutable/chunks/DXFUtTrQ.js.br +0 -0
- package/build/client/_app/immutable/chunks/DXFUtTrQ.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Deds-Bu4.js.br +0 -0
- package/build/client/_app/immutable/chunks/Deds-Bu4.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DhhcRlSv.js.br +0 -0
- package/build/client/_app/immutable/chunks/DklI6PZ2.js +0 -1
- package/build/client/_app/immutable/chunks/DklI6PZ2.js.br +0 -2
- package/build/client/_app/immutable/chunks/DklI6PZ2.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DmeFJZBo.js +0 -1
- package/build/client/_app/immutable/chunks/DmeFJZBo.js.br +0 -0
- package/build/client/_app/immutable/chunks/DmeFJZBo.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Dt0j4sZQ.js +0 -2
- package/build/client/_app/immutable/chunks/Dt0j4sZQ.js.br +0 -0
- package/build/client/_app/immutable/chunks/Dt0j4sZQ.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DxquQJx9.js +0 -1
- package/build/client/_app/immutable/chunks/DxquQJx9.js.br +0 -0
- package/build/client/_app/immutable/chunks/DxquQJx9.js.gz +0 -0
- package/build/client/_app/immutable/chunks/JSHVX3nZ.js +0 -2
- package/build/client/_app/immutable/chunks/JSHVX3nZ.js.br +0 -0
- package/build/client/_app/immutable/chunks/JSHVX3nZ.js.gz +0 -0
- package/build/client/_app/immutable/chunks/L6ABQ5uZ.js +0 -1
- package/build/client/_app/immutable/chunks/L6ABQ5uZ.js.br +0 -2
- package/build/client/_app/immutable/chunks/L6ABQ5uZ.js.gz +0 -0
- package/build/client/_app/immutable/chunks/NpmsW6m-.js +0 -1
- package/build/client/_app/immutable/chunks/NpmsW6m-.js.br +0 -0
- package/build/client/_app/immutable/chunks/NpmsW6m-.js.gz +0 -0
- package/build/client/_app/immutable/chunks/UO83B563.js +0 -1
- package/build/client/_app/immutable/chunks/UO83B563.js.br +0 -0
- package/build/client/_app/immutable/chunks/UO83B563.js.gz +0 -0
- package/build/client/_app/immutable/chunks/V9U6b0dU.js.br +0 -0
- package/build/client/_app/immutable/chunks/V9U6b0dU.js.gz +0 -0
- package/build/client/_app/immutable/chunks/WVoYdfwC.js +0 -2
- package/build/client/_app/immutable/chunks/WVoYdfwC.js.br +0 -0
- package/build/client/_app/immutable/chunks/WVoYdfwC.js.gz +0 -0
- package/build/client/_app/immutable/chunks/inUV6bWj.js.br +0 -0
- package/build/client/_app/immutable/chunks/inUV6bWj.js.gz +0 -0
- package/build/client/_app/immutable/entry/app.CJ_bsERC.js +0 -2
- package/build/client/_app/immutable/entry/app.CJ_bsERC.js.br +0 -0
- package/build/client/_app/immutable/entry/app.CJ_bsERC.js.gz +0 -0
- package/build/client/_app/immutable/entry/start.9RB9BRtD.js +0 -1
- package/build/client/_app/immutable/entry/start.9RB9BRtD.js.br +0 -2
- package/build/client/_app/immutable/entry/start.9RB9BRtD.js.gz +0 -0
- package/build/client/_app/immutable/nodes/0.CVdeFtgc.js.br +0 -0
- package/build/client/_app/immutable/nodes/0.CVdeFtgc.js.gz +0 -0
- package/build/client/_app/immutable/nodes/1.BDChnwm3.js +0 -1
- package/build/client/_app/immutable/nodes/1.BDChnwm3.js.br +0 -0
- package/build/client/_app/immutable/nodes/1.BDChnwm3.js.gz +0 -0
- package/build/client/_app/immutable/nodes/14.PLVwHmf8.js.br +0 -0
- package/build/client/_app/immutable/nodes/14.PLVwHmf8.js.gz +0 -0
- package/build/client/_app/immutable/nodes/15.IKNR1t1s.js.br +0 -0
- package/build/client/_app/immutable/nodes/15.IKNR1t1s.js.gz +0 -0
- package/build/client/_app/immutable/nodes/2.P49VQzwV.js.br +0 -0
- package/build/client/_app/immutable/nodes/2.P49VQzwV.js.gz +0 -0
- package/build/client/_app/immutable/nodes/3.BO8fNoBi.js +0 -1
- package/build/client/_app/immutable/nodes/3.BO8fNoBi.js.br +0 -0
- package/build/client/_app/immutable/nodes/3.BO8fNoBi.js.gz +0 -0
- package/build/client/_app/immutable/nodes/4.Ln69Bcug.js +0 -1
- package/build/client/_app/immutable/nodes/4.Ln69Bcug.js.br +0 -0
- package/build/client/_app/immutable/nodes/4.Ln69Bcug.js.gz +0 -0
- package/build/client/_app/immutable/nodes/5.C02zTRTT.js.br +0 -0
- package/build/client/_app/immutable/nodes/5.C02zTRTT.js.gz +0 -0
- package/build/client/_app/immutable/nodes/7.BYKTckLf.js.br +0 -0
- package/build/client/_app/immutable/nodes/7.BYKTckLf.js.gz +0 -0
- package/build/client/_app/immutable/nodes/8.C7tk-Wsh.js.br +0 -0
- package/build/client/_app/immutable/nodes/8.C7tk-Wsh.js.gz +0 -0
- package/build/client/_app/immutable/nodes/9.DBodeuqK.js +0 -5
- package/build/client/_app/immutable/nodes/9.DBodeuqK.js.br +0 -0
- package/build/client/_app/immutable/nodes/9.DBodeuqK.js.gz +0 -0
- package/build/server/chunks/0-DtejLnPd.js +0 -9
- package/build/server/chunks/1-Dw6tCl-K.js +0 -9
- package/build/server/chunks/14-CG4GBZSP.js +0 -9
- package/build/server/chunks/14-CG4GBZSP.js.map +0 -1
- package/build/server/chunks/15-BK7DX1sY.js +0 -9
- package/build/server/chunks/15-BK7DX1sY.js.map +0 -1
- package/build/server/chunks/2-BaJLoZGK.js +0 -9
- package/build/server/chunks/2-BaJLoZGK.js.map +0 -1
- package/build/server/chunks/3-B6LhZPYk.js +0 -9
- package/build/server/chunks/3-B6LhZPYk.js.map +0 -1
- package/build/server/chunks/4-C6AwWXAp.js +0 -9
- package/build/server/chunks/4-C6AwWXAp.js.map +0 -1
- package/build/server/chunks/5-Dev5MSl1.js +0 -9
- package/build/server/chunks/5-Dev5MSl1.js.map +0 -1
- package/build/server/chunks/7-qXoxThoS.js +0 -9
- package/build/server/chunks/7-qXoxThoS.js.map +0 -1
- package/build/server/chunks/8-DHFEzstg.js +0 -9
- package/build/server/chunks/8-DHFEzstg.js.map +0 -1
- package/build/server/chunks/9-CC9KFXZB.js +0 -9
- package/build/server/chunks/9-CC9KFXZB.js.map +0 -1
- package/build/server/chunks/Dropdown-Bz9eHilg.js.map +0 -1
- package/build/server/chunks/_layout.svelte-BoUClC-X.js.map +0 -1
- package/build/server/chunks/_page.svelte-DR3jiCLg.js.map +0 -1
- package/build/server/chunks/source-selection-DJzHsjzD.js.map +0 -1
- /package/build/client/_app/immutable/assets/{9.BX46PfEJ.css → 10.BX46PfEJ.css} +0 -0
- /package/build/client/_app/immutable/assets/{9.BX46PfEJ.css.br → 10.BX46PfEJ.css.br} +0 -0
- /package/build/client/_app/immutable/assets/{9.BX46PfEJ.css.gz → 10.BX46PfEJ.css.gz} +0 -0
- /package/build/client/_app/immutable/assets/{15.C5apk4jm.css → 18.C5apk4jm.css} +0 -0
- /package/build/client/_app/immutable/assets/{15.C5apk4jm.css.br → 18.C5apk4jm.css.br} +0 -0
- /package/build/client/_app/immutable/assets/{15.C5apk4jm.css.gz → 18.C5apk4jm.css.gz} +0 -0
- /package/build/client/_app/immutable/assets/{4.CZVw96CJ.css → 5.CZVw96CJ.css} +0 -0
- /package/build/client/_app/immutable/assets/{4.CZVw96CJ.css.br → 5.CZVw96CJ.css.br} +0 -0
- /package/build/client/_app/immutable/assets/{4.CZVw96CJ.css.gz → 5.CZVw96CJ.css.gz} +0 -0
- /package/build/client/_app/immutable/assets/{8.DlSPCZj0.css → 9.DlSPCZj0.css} +0 -0
- /package/build/client/_app/immutable/assets/{8.DlSPCZj0.css.br → 9.DlSPCZj0.css.br} +0 -0
- /package/build/client/_app/immutable/assets/{8.DlSPCZj0.css.gz → 9.DlSPCZj0.css.gz} +0 -0
- /package/build/client/_app/immutable/nodes/{10.BVI-eEdV.js → 11.BVI-eEdV.js} +0 -0
- /package/build/client/_app/immutable/nodes/{10.BVI-eEdV.js.br → 11.BVI-eEdV.js.br} +0 -0
- /package/build/client/_app/immutable/nodes/{10.BVI-eEdV.js.gz → 11.BVI-eEdV.js.gz} +0 -0
- /package/build/client/_app/immutable/nodes/{11.BHSGZYEC.js → 12.BHSGZYEC.js} +0 -0
- /package/build/client/_app/immutable/nodes/{11.BHSGZYEC.js.br → 12.BHSGZYEC.js.br} +0 -0
- /package/build/client/_app/immutable/nodes/{11.BHSGZYEC.js.gz → 12.BHSGZYEC.js.gz} +0 -0
- /package/build/client/_app/immutable/nodes/{12.CZ_7M4AF.js → 13.CZ_7M4AF.js} +0 -0
- /package/build/client/_app/immutable/nodes/{12.CZ_7M4AF.js.br → 13.CZ_7M4AF.js.br} +0 -0
- /package/build/client/_app/immutable/nodes/{12.CZ_7M4AF.js.gz → 13.CZ_7M4AF.js.gz} +0 -0
- /package/build/client/_app/immutable/nodes/{13.D96_XEm-.js → 14.D96_XEm-.js} +0 -0
- /package/build/client/_app/immutable/nodes/{13.D96_XEm-.js.br → 14.D96_XEm-.js.br} +0 -0
- /package/build/client/_app/immutable/nodes/{13.D96_XEm-.js.gz → 14.D96_XEm-.js.gz} +0 -0
- /package/build/client/_app/immutable/nodes/{6.CkeP1yO3.js → 7.CkeP1yO3.js} +0 -0
- /package/build/client/_app/immutable/nodes/{6.CkeP1yO3.js.br → 7.CkeP1yO3.js.br} +0 -0
- /package/build/client/_app/immutable/nodes/{6.CkeP1yO3.js.gz → 7.CkeP1yO3.js.gz} +0 -0
|
@@ -0,0 +1,763 @@
|
|
|
1
|
+
import { e as ensure_array_like, c as attr_style } from './index2-BpEbpEAf.js';
|
|
2
|
+
import { o as onDestroy } from './index-server-BI-Ep7Rw.js';
|
|
3
|
+
import { p as page } from './index3-Cp9d5nmD.js';
|
|
4
|
+
import { B as Button } from './Button-CMHzABlu.js';
|
|
5
|
+
import { g as getPersistedTelescopeSourceId } from './source-selection-hOQHZ-fn.js';
|
|
6
|
+
import { X as escape_html } from './context-B0vutJuA.js';
|
|
7
|
+
import './state.svelte-DbqYHGBV.js';
|
|
8
|
+
import './utils-KcIDVAAe.js';
|
|
9
|
+
import './index-BSa6KzSq.js';
|
|
10
|
+
import 'zod';
|
|
11
|
+
|
|
12
|
+
function _page($$renderer, $$props) {
|
|
13
|
+
$$renderer.component(($$renderer2) => {
|
|
14
|
+
const TIMELINE_RULER_HEIGHT_PX = 32;
|
|
15
|
+
const TIMELINE_ROW_HEIGHT_PX = 40;
|
|
16
|
+
const WAVEFORM_ROW_HEIGHT_PX = 160;
|
|
17
|
+
const TIMELINE_SCALE_HEIGHT_PX = 32;
|
|
18
|
+
const BOSUN_COLORS = {
|
|
19
|
+
blue: "#569cd6",
|
|
20
|
+
green: "#93FF6D",
|
|
21
|
+
greenDark: "#00B58A",
|
|
22
|
+
orange: "#ce9178",
|
|
23
|
+
purple: "#81147D",
|
|
24
|
+
red: "#FF6666",
|
|
25
|
+
gray: "#767676"
|
|
26
|
+
};
|
|
27
|
+
const RAW_VAD_SPAN_NAMES = /* @__PURE__ */ new Set(["vad.start_of_speech", "vad.end_of_speech"]);
|
|
28
|
+
const RAW_STT_SPAN_NAMES = /* @__PURE__ */ new Set([
|
|
29
|
+
"stt.start_of_speech",
|
|
30
|
+
"stt.interim_transcript",
|
|
31
|
+
"stt.preflight_transcript",
|
|
32
|
+
"stt.final_transcript"
|
|
33
|
+
]);
|
|
34
|
+
const HIDDEN_LATENCY_SPAN_NAMES = /* @__PURE__ */ new Set([
|
|
35
|
+
"vad.user_speech",
|
|
36
|
+
"vad.endpointing",
|
|
37
|
+
"vad.trailing_silence",
|
|
38
|
+
"stt.endpointing",
|
|
39
|
+
"stt.transcription",
|
|
40
|
+
"stt.turn_commit",
|
|
41
|
+
"stt.until_turn_committed",
|
|
42
|
+
"stt.transcript_to_speech_created",
|
|
43
|
+
"stt.transcript_to_llm_request",
|
|
44
|
+
"stt.transcript_trigger_selected",
|
|
45
|
+
"stt.speech_end_to_trigger_transcript",
|
|
46
|
+
"stt.speech_end_to_final_transcript",
|
|
47
|
+
"stt.trigger_transcript_to_reply_trigger",
|
|
48
|
+
"stt.final_transcript_to_commit"
|
|
49
|
+
]);
|
|
50
|
+
const ROW_DEFS = [
|
|
51
|
+
{ label: "VAD", names: [...RAW_VAD_SPAN_NAMES] },
|
|
52
|
+
{ label: "STT", names: [...RAW_STT_SPAN_NAMES] },
|
|
53
|
+
{ label: "Trigger", component: "trigger" },
|
|
54
|
+
{ label: "LLM", names: ["llm.request.ttft", "llm.streaming"] },
|
|
55
|
+
{
|
|
56
|
+
label: "LLM→TTS",
|
|
57
|
+
names: ["llm_to_tts.buffering", "llm_to_tts.streaming"]
|
|
58
|
+
},
|
|
59
|
+
{ label: "TTS generation", names: ["tts.generation"] },
|
|
60
|
+
{
|
|
61
|
+
label: "TTS→Audio",
|
|
62
|
+
names: ["tts_to_audio.buffering", "tts_to_audio.streaming"]
|
|
63
|
+
},
|
|
64
|
+
{ label: "LLM→Audio start", names: ["llm_to_audio.latency"] },
|
|
65
|
+
{ label: "Other" }
|
|
66
|
+
];
|
|
67
|
+
const COLOR_BY_KEY = {
|
|
68
|
+
"vad.user_speech": tintHex(BOSUN_COLORS.purple, 0.35),
|
|
69
|
+
"vad.endpointing": tintHex(BOSUN_COLORS.purple, -0.15),
|
|
70
|
+
"llm.request": tintHex(BOSUN_COLORS.blue, -0.25),
|
|
71
|
+
"llm.streaming": BOSUN_COLORS.blue,
|
|
72
|
+
"llm_to_tts.buffering": tintHex(BOSUN_COLORS.orange, -0.25),
|
|
73
|
+
"llm_to_tts.streaming": BOSUN_COLORS.orange,
|
|
74
|
+
"tts.generation": tintHex(BOSUN_COLORS.orange, 0.25),
|
|
75
|
+
"tts_to_audio.buffering": tintHex(BOSUN_COLORS.purple, -0.25),
|
|
76
|
+
"tts_to_audio.streaming": tintHex(BOSUN_COLORS.purple, 0.25),
|
|
77
|
+
"llm_to_audio.ok": BOSUN_COLORS.green,
|
|
78
|
+
"llm_to_audio.high": BOSUN_COLORS.red,
|
|
79
|
+
trigger: BOSUN_COLORS.greenDark,
|
|
80
|
+
stt: tintHex(BOSUN_COLORS.purple, 0.2),
|
|
81
|
+
other: BOSUN_COLORS.gray
|
|
82
|
+
};
|
|
83
|
+
let sourceId = getPersistedTelescopeSourceId() ?? "";
|
|
84
|
+
let traces = [];
|
|
85
|
+
let recording = {
|
|
86
|
+
alignmentOffsetMs: 0
|
|
87
|
+
};
|
|
88
|
+
let uploadInFlight = false;
|
|
89
|
+
let playbackPositionMs = 0;
|
|
90
|
+
let playbackPlaying = false;
|
|
91
|
+
let viewportStartMs = null;
|
|
92
|
+
let viewportEndMs = null;
|
|
93
|
+
let fileInputEl = null;
|
|
94
|
+
let playbackAudioContext = null;
|
|
95
|
+
let playbackSourceNode = null;
|
|
96
|
+
let playbackStartedAtMs = null;
|
|
97
|
+
let playbackStartedAtContextTime = null;
|
|
98
|
+
const conversationId = (() => page.params.conversationId)();
|
|
99
|
+
function buildRecordingApiUrlFor(cid, nextSourceId) {
|
|
100
|
+
const params = new URLSearchParams();
|
|
101
|
+
if (nextSourceId) params.set("source", nextSourceId);
|
|
102
|
+
const search = params.toString();
|
|
103
|
+
return `/traces/api/latency/${encodeURIComponent(cid)}${search ? `?${search}` : ""}`;
|
|
104
|
+
}
|
|
105
|
+
(() => {
|
|
106
|
+
if (!conversationId) return "";
|
|
107
|
+
return buildRecordingApiUrlFor(conversationId, sourceId);
|
|
108
|
+
})();
|
|
109
|
+
const timelineOriginMs = (() => {
|
|
110
|
+
let min = Number.POSITIVE_INFINITY;
|
|
111
|
+
for (const trace of traces) {
|
|
112
|
+
if (typeof trace.createdAt !== "number" || !Number.isFinite(trace.createdAt)) continue;
|
|
113
|
+
min = Math.min(min, trace.createdAt);
|
|
114
|
+
}
|
|
115
|
+
return Number.isFinite(min) ? min : 0;
|
|
116
|
+
})();
|
|
117
|
+
const callSegments = (() => buildCallLatencySegments(traces))();
|
|
118
|
+
const latencyTraceCount = (() => traces.filter((trace) => {
|
|
119
|
+
const metrics = trace?.metrics;
|
|
120
|
+
return !!metrics && typeof metrics === "object";
|
|
121
|
+
}).length)();
|
|
122
|
+
const timelineRows = (() => {
|
|
123
|
+
const grouped = /* @__PURE__ */ new Map();
|
|
124
|
+
for (const segment of callSegments) {
|
|
125
|
+
const items = grouped.get(segment.row);
|
|
126
|
+
if (items) items.push(segment);
|
|
127
|
+
else grouped.set(segment.row, [segment]);
|
|
128
|
+
}
|
|
129
|
+
return [...ROW_DEFS].reverse().map((row) => ({ label: row.label, segments: grouped.get(row.label) ?? [] })).filter((row) => row.segments.length > 0);
|
|
130
|
+
})();
|
|
131
|
+
const guideLines = (() => buildGuideLines())();
|
|
132
|
+
const timelinePlotHeightPx = (() => TIMELINE_RULER_HEIGHT_PX + timelineRows.length * TIMELINE_ROW_HEIGHT_PX + WAVEFORM_ROW_HEIGHT_PX + TIMELINE_SCALE_HEIGHT_PX)();
|
|
133
|
+
const playbackAbsoluteMs = (() => {
|
|
134
|
+
return null;
|
|
135
|
+
})();
|
|
136
|
+
const playbackCursor = (() => {
|
|
137
|
+
const absoluteMs = playbackAbsoluteMs;
|
|
138
|
+
if (absoluteMs == null || viewportStartMs == null || viewportEndMs == null) return null;
|
|
139
|
+
const durationMs = viewportEndMs - viewportStartMs;
|
|
140
|
+
if (!Number.isFinite(durationMs) || durationMs <= 0) return null;
|
|
141
|
+
if (absoluteMs < viewportStartMs || absoluteMs > viewportEndMs) return null;
|
|
142
|
+
return {
|
|
143
|
+
leftPercent: clamp((absoluteMs - viewportStartMs) / durationMs * 100, 0, 100),
|
|
144
|
+
heightPx: timelinePlotHeightPx
|
|
145
|
+
};
|
|
146
|
+
})();
|
|
147
|
+
const contentExtent = (() => {
|
|
148
|
+
let min = Number.POSITIVE_INFINITY;
|
|
149
|
+
let max = Number.NEGATIVE_INFINITY;
|
|
150
|
+
for (const segment of callSegments) {
|
|
151
|
+
min = Math.min(min, segment.start);
|
|
152
|
+
max = Math.max(max, segment.end);
|
|
153
|
+
}
|
|
154
|
+
if (!Number.isFinite(min) || !Number.isFinite(max) || max <= min) return null;
|
|
155
|
+
return { min, max };
|
|
156
|
+
})();
|
|
157
|
+
const viewportDurationMs = (() => {
|
|
158
|
+
if (viewportStartMs == null || viewportEndMs == null) return null;
|
|
159
|
+
const duration = viewportEndMs - viewportStartMs;
|
|
160
|
+
return duration > 0 ? duration : null;
|
|
161
|
+
})();
|
|
162
|
+
const visibleTicks = (() => {
|
|
163
|
+
if (viewportStartMs == null || viewportEndMs == null) return [];
|
|
164
|
+
return buildTicks(viewportStartMs, viewportEndMs, timelineOriginMs);
|
|
165
|
+
})();
|
|
166
|
+
const visibleTickStepMs = (() => {
|
|
167
|
+
if (viewportStartMs == null || viewportEndMs == null) return null;
|
|
168
|
+
const durationMs = viewportEndMs - viewportStartMs;
|
|
169
|
+
if (!Number.isFinite(durationMs) || durationMs <= 0) return null;
|
|
170
|
+
return chooseTickStep(durationMs);
|
|
171
|
+
})();
|
|
172
|
+
onDestroy(() => {
|
|
173
|
+
stopPlayback(false);
|
|
174
|
+
void closePlaybackAudioContext();
|
|
175
|
+
});
|
|
176
|
+
function normalizeNonEmptyString(value) {
|
|
177
|
+
if (typeof value !== "string") return null;
|
|
178
|
+
const trimmed = value.trim();
|
|
179
|
+
return trimmed ? trimmed : null;
|
|
180
|
+
}
|
|
181
|
+
function ms(value) {
|
|
182
|
+
return typeof value === "number" && Number.isFinite(value) ? value : null;
|
|
183
|
+
}
|
|
184
|
+
function clampByte(value) {
|
|
185
|
+
return Math.max(0, Math.min(255, Math.round(value)));
|
|
186
|
+
}
|
|
187
|
+
function clamp(value, min, max) {
|
|
188
|
+
return Math.min(max, Math.max(min, value));
|
|
189
|
+
}
|
|
190
|
+
function tintHex(hex, amount) {
|
|
191
|
+
const raw = (hex ?? "").trim().replace(/^#/, "");
|
|
192
|
+
const expanded = raw.length === 3 ? raw.split("").map((part) => `${part}${part}`).join("") : raw;
|
|
193
|
+
if (expanded.length !== 6 || !/^[0-9a-fA-F]+$/.test(expanded)) return hex;
|
|
194
|
+
const r = parseInt(expanded.slice(0, 2), 16);
|
|
195
|
+
const g = parseInt(expanded.slice(2, 4), 16);
|
|
196
|
+
const b = parseInt(expanded.slice(4, 6), 16);
|
|
197
|
+
const t = Math.abs(Math.max(-1, Math.min(1, amount)));
|
|
198
|
+
const target = amount >= 0 ? 255 : 0;
|
|
199
|
+
return `#${clampByte(r + (target - r) * t).toString(16).padStart(2, "0")}${clampByte(g + (target - g) * t).toString(16).padStart(2, "0")}${clampByte(b + (target - b) * t).toString(16).padStart(2, "0")}`;
|
|
200
|
+
}
|
|
201
|
+
function fmtSignedMs(value) {
|
|
202
|
+
if (!Number.isFinite(value)) return "0 ms";
|
|
203
|
+
const rounded = Math.round(value);
|
|
204
|
+
if (rounded === 0) return "0 ms";
|
|
205
|
+
return `${rounded > 0 ? "+" : ""}${rounded} ms`;
|
|
206
|
+
}
|
|
207
|
+
function formatRelativeTime(offsetMs) {
|
|
208
|
+
if (!Number.isFinite(offsetMs)) return "—";
|
|
209
|
+
const sign = offsetMs < 0 ? "-" : "";
|
|
210
|
+
const abs = Math.abs(offsetMs);
|
|
211
|
+
if (abs < 1e4) return `${sign}${(abs / 1e3).toFixed(1)}s`;
|
|
212
|
+
if (abs < 6e4) return `${sign}${(abs / 1e3).toFixed(2)}s`;
|
|
213
|
+
const totalSeconds = abs / 1e3;
|
|
214
|
+
const minutes = Math.floor(totalSeconds / 60);
|
|
215
|
+
const seconds = totalSeconds - minutes * 60;
|
|
216
|
+
return `${sign}${minutes}:${seconds.toFixed(1).padStart(4, "0")}`;
|
|
217
|
+
}
|
|
218
|
+
function formatScaleStep(valueMs) {
|
|
219
|
+
if (valueMs == null || !Number.isFinite(valueMs) || valueMs <= 0) return "—";
|
|
220
|
+
if (valueMs < 1e3) return `${Math.round(valueMs)} ms`;
|
|
221
|
+
if (valueMs < 1e4) return `${Math.round(valueMs)} ms (${(valueMs / 1e3).toFixed(1)} s)`;
|
|
222
|
+
return `${Math.round(valueMs)} ms (${(valueMs / 1e3).toFixed(2)} s)`;
|
|
223
|
+
}
|
|
224
|
+
function spanAttribute(span, key) {
|
|
225
|
+
const attributes = span?.attributes;
|
|
226
|
+
if (!attributes || typeof attributes !== "object") return null;
|
|
227
|
+
return attributes[`bosun.${key}`] ?? attributes[`anyvan.${key}`] ?? null;
|
|
228
|
+
}
|
|
229
|
+
function spanStringAttribute(span, key) {
|
|
230
|
+
return normalizeNonEmptyString(spanAttribute(span, key));
|
|
231
|
+
}
|
|
232
|
+
function spanComponent(span) {
|
|
233
|
+
return spanStringAttribute(span, "component");
|
|
234
|
+
}
|
|
235
|
+
function shouldIgnoreLatencySpan(span) {
|
|
236
|
+
const name = normalizeNonEmptyString(span?.name);
|
|
237
|
+
if (!name) return false;
|
|
238
|
+
if (HIDDEN_LATENCY_SPAN_NAMES.has(name)) return true;
|
|
239
|
+
if (name.startsWith("vad.") && !RAW_VAD_SPAN_NAMES.has(name)) return true;
|
|
240
|
+
if (name.startsWith("stt.") && !RAW_STT_SPAN_NAMES.has(name)) return true;
|
|
241
|
+
return false;
|
|
242
|
+
}
|
|
243
|
+
function spanLabel(span) {
|
|
244
|
+
const label = spanStringAttribute(span, "label");
|
|
245
|
+
if (label) return label;
|
|
246
|
+
if (typeof span?.name === "string" && span.name) return span.name;
|
|
247
|
+
return "span";
|
|
248
|
+
}
|
|
249
|
+
function describeTrace(trace) {
|
|
250
|
+
const time = typeof trace.createdAt === "number" && Number.isFinite(trace.createdAt) ? new Date(trace.createdAt).toLocaleTimeString() : "unknown time";
|
|
251
|
+
if (trace.traceType === "CONVERSATIONAL") {
|
|
252
|
+
return `Conversational • ${trace.eventName} • ${time}`;
|
|
253
|
+
}
|
|
254
|
+
if (trace.traceType === "STEP") {
|
|
255
|
+
return `Step • ${trace.name ?? "unknown"} • ${time}`;
|
|
256
|
+
}
|
|
257
|
+
return `API • ${trace.operationName} • ${time}`;
|
|
258
|
+
}
|
|
259
|
+
function spanColorKey(span) {
|
|
260
|
+
const name = typeof span?.name === "string" ? span.name : "";
|
|
261
|
+
if (name === "vad.endpointing") return "vad.endpointing";
|
|
262
|
+
if (name.startsWith("vad.")) return "vad.user_speech";
|
|
263
|
+
if (name === "llm.request.ttft") return "llm.request";
|
|
264
|
+
if (name === "llm.streaming") return "llm.streaming";
|
|
265
|
+
if (name === "llm_to_tts.buffering") return "llm_to_tts.buffering";
|
|
266
|
+
if (name === "llm_to_tts.streaming") return "llm_to_tts.streaming";
|
|
267
|
+
if (name === "tts.generation") return "tts.generation";
|
|
268
|
+
if (name === "tts_to_audio.buffering") return "tts_to_audio.buffering";
|
|
269
|
+
if (name === "tts_to_audio.streaming") return "tts_to_audio.streaming";
|
|
270
|
+
if (name.startsWith("stt.")) return "stt";
|
|
271
|
+
if (name.startsWith("trigger.")) return "trigger";
|
|
272
|
+
const component = spanComponent(span);
|
|
273
|
+
if (component === "vad") return "vad.user_speech";
|
|
274
|
+
if (component === "stt") return "stt";
|
|
275
|
+
if (component === "trigger") return "trigger";
|
|
276
|
+
return "other";
|
|
277
|
+
}
|
|
278
|
+
function makePointSpan(name, atMs, attributes) {
|
|
279
|
+
return {
|
|
280
|
+
name,
|
|
281
|
+
startTimeUnixMs: atMs,
|
|
282
|
+
endTimeUnixMs: atMs,
|
|
283
|
+
durationMs: 0,
|
|
284
|
+
attributes
|
|
285
|
+
};
|
|
286
|
+
}
|
|
287
|
+
function buildLatencyDebugSpans(metrics) {
|
|
288
|
+
const debug = metrics?.debug ?? {};
|
|
289
|
+
const ttsAudioStartAtMs = ms(metrics?.timing?.ttsAudioStartAtMs);
|
|
290
|
+
const isPreResponseEvent = (atMs) => ttsAudioStartAtMs == null || atMs <= ttsAudioStartAtMs;
|
|
291
|
+
const built = [];
|
|
292
|
+
let hasRawVad = false;
|
|
293
|
+
let hasRawStt = false;
|
|
294
|
+
const vadEvents = Array.isArray(debug?.vadEvents?.events) ? debug.vadEvents.events : [];
|
|
295
|
+
vadEvents.forEach((event, index) => {
|
|
296
|
+
const atMs = ms(event?.atMs);
|
|
297
|
+
const type = normalizeNonEmptyString(event?.type);
|
|
298
|
+
if (atMs == null || !isPreResponseEvent(atMs) || type !== "start_of_speech" && type !== "end_of_speech") {
|
|
299
|
+
return;
|
|
300
|
+
}
|
|
301
|
+
hasRawVad = true;
|
|
302
|
+
built.push(makePointSpan(`vad.${type}`, atMs, {
|
|
303
|
+
"anyvan.component": "vad",
|
|
304
|
+
"anyvan.label": type === "start_of_speech" ? "VAD activated" : "VAD deactivated",
|
|
305
|
+
"anyvan.description": type === "start_of_speech" ? "Raw VAD START_OF_SPEECH event" : "Raw VAD END_OF_SPEECH event",
|
|
306
|
+
"anyvan.eventIndex": index,
|
|
307
|
+
"anyvan.samplesIndex": typeof event?.samplesIndex === "number" ? event.samplesIndex : void 0,
|
|
308
|
+
"anyvan.speechDurationMs": typeof event?.speechDurationMs === "number" ? event.speechDurationMs : void 0,
|
|
309
|
+
"anyvan.silenceDurationMs": typeof event?.silenceDurationMs === "number" ? event.silenceDurationMs : void 0
|
|
310
|
+
}));
|
|
311
|
+
});
|
|
312
|
+
const sttEvents = Array.isArray(debug?.sttEvents?.events) ? debug.sttEvents.events : [];
|
|
313
|
+
sttEvents.forEach((event, index) => {
|
|
314
|
+
const atMs = ms(event?.atMs);
|
|
315
|
+
const type = normalizeNonEmptyString(event?.type);
|
|
316
|
+
if (atMs == null || !isPreResponseEvent(atMs) || type !== "start_of_speech" && type !== "interim_transcript" && type !== "preflight_transcript" && type !== "final_transcript") {
|
|
317
|
+
return;
|
|
318
|
+
}
|
|
319
|
+
hasRawStt = true;
|
|
320
|
+
const label = type === "start_of_speech" ? "STT start of speech" : type === "interim_transcript" ? "STT interim transcript" : type === "preflight_transcript" ? "STT preflight transcript" : "STT final transcript";
|
|
321
|
+
built.push(makePointSpan(`stt.${type}`, atMs, {
|
|
322
|
+
"anyvan.component": "stt",
|
|
323
|
+
"anyvan.label": label,
|
|
324
|
+
"anyvan.description": `Raw STT ${type.toUpperCase()} event`,
|
|
325
|
+
"anyvan.eventIndex": index,
|
|
326
|
+
"anyvan.requestId": typeof event?.requestId === "string" ? event.requestId : void 0,
|
|
327
|
+
"anyvan.text": normalizeNonEmptyString(event?.text),
|
|
328
|
+
"anyvan.language": typeof event?.language === "string" || event?.language === null ? event.language : void 0,
|
|
329
|
+
"anyvan.speakerId": typeof event?.speakerId === "string" || event?.speakerId === null ? event.speakerId : void 0
|
|
330
|
+
}));
|
|
331
|
+
});
|
|
332
|
+
return { spans: built, hasRawVad, hasRawStt };
|
|
333
|
+
}
|
|
334
|
+
function buildSegmentsForMetrics(trace, metrics, prefix) {
|
|
335
|
+
const debugSpans = buildLatencyDebugSpans(metrics);
|
|
336
|
+
const spans = Array.isArray(metrics?.spans) ? metrics.spans.filter((span) => {
|
|
337
|
+
const name = normalizeNonEmptyString(span?.name);
|
|
338
|
+
if (name?.startsWith("vad.") && debugSpans.hasRawVad) return false;
|
|
339
|
+
if (name?.startsWith("stt.") && debugSpans.hasRawStt) return false;
|
|
340
|
+
return !shouldIgnoreLatencySpan(span);
|
|
341
|
+
}) : [];
|
|
342
|
+
const summary = metrics?.summary ?? {};
|
|
343
|
+
const timing = metrics?.timing ?? {};
|
|
344
|
+
const indexed = [...spans, ...debugSpans.spans].map((span, index) => ({ span, index }));
|
|
345
|
+
const used = /* @__PURE__ */ new Set();
|
|
346
|
+
const groupedRows = ROW_DEFS.filter((row) => row.label !== "LLM→Audio start" && row.label !== "Other").map((row) => {
|
|
347
|
+
const matches = indexed.filter(({ span, index }) => {
|
|
348
|
+
if (used.has(index)) return false;
|
|
349
|
+
const name = typeof span?.name === "string" ? span.name : "";
|
|
350
|
+
const component = spanComponent(span);
|
|
351
|
+
const nameMatch = Array.isArray(row.names) && name !== "" && row.names.includes(name);
|
|
352
|
+
const componentMatch = typeof row.component === "string" && component === row.component;
|
|
353
|
+
return nameMatch || componentMatch;
|
|
354
|
+
}).sort((a, b) => (ms(a.span.startTimeUnixMs) ?? 0) - (ms(b.span.startTimeUnixMs) ?? 0));
|
|
355
|
+
for (const match of matches) used.add(match.index);
|
|
356
|
+
return { label: row.label, spans: matches.map((match) => match.span) };
|
|
357
|
+
}).filter((row) => row.spans.length > 0);
|
|
358
|
+
const other = indexed.filter(({ index }) => !used.has(index)).map((entry) => entry.span).sort((a, b) => (ms(a.startTimeUnixMs) ?? 0) - (ms(b.startTimeUnixMs) ?? 0));
|
|
359
|
+
if (other.length) groupedRows.push({ label: "Other", spans: other });
|
|
360
|
+
const built = [];
|
|
361
|
+
for (const row of groupedRows) {
|
|
362
|
+
row.spans.forEach((span, index) => {
|
|
363
|
+
const start = ms(span.startTimeUnixMs);
|
|
364
|
+
const end = ms(span.endTimeUnixMs);
|
|
365
|
+
if (start == null || end == null || end < start) return;
|
|
366
|
+
built.push({
|
|
367
|
+
id: `${prefix}:${row.label}:${span.name ?? "span"}:${start}:${end}:${index}`,
|
|
368
|
+
row: row.label,
|
|
369
|
+
start,
|
|
370
|
+
end,
|
|
371
|
+
durationMs: Math.max(0, end - start),
|
|
372
|
+
colorKey: spanColorKey(span),
|
|
373
|
+
label: spanLabel(span),
|
|
374
|
+
description: spanStringAttribute(span, "description"),
|
|
375
|
+
explain: spanStringAttribute(span, "explain"),
|
|
376
|
+
text: spanStringAttribute(span, "text"),
|
|
377
|
+
traceLabel: describeTrace(trace)
|
|
378
|
+
});
|
|
379
|
+
});
|
|
380
|
+
}
|
|
381
|
+
const llmRequestStartAtMs = ms(timing?.llmRequestStartAtMs);
|
|
382
|
+
const ttsAudioStartAtMs = ms(timing?.ttsAudioStartAtMs);
|
|
383
|
+
if (llmRequestStartAtMs != null && ttsAudioStartAtMs != null && ttsAudioStartAtMs >= llmRequestStartAtMs) {
|
|
384
|
+
const durationMs = ttsAudioStartAtMs - llmRequestStartAtMs;
|
|
385
|
+
built.push({
|
|
386
|
+
id: `${prefix}:llm_to_audio:${llmRequestStartAtMs}:${ttsAudioStartAtMs}`,
|
|
387
|
+
row: "LLM→Audio start",
|
|
388
|
+
start: llmRequestStartAtMs,
|
|
389
|
+
end: ttsAudioStartAtMs,
|
|
390
|
+
durationMs,
|
|
391
|
+
colorKey: durationMs > 800 || Boolean(summary?.problematic) ? "llm_to_audio.high" : "llm_to_audio.ok",
|
|
392
|
+
label: "LLM→Audio start",
|
|
393
|
+
description: "LLM request start → agent speaking (first audio frame)",
|
|
394
|
+
explain: durationMs > 800 || Boolean(summary?.problematic) ? "High latency (>800ms) or problematic timing" : "OK",
|
|
395
|
+
text: null,
|
|
396
|
+
traceLabel: describeTrace(trace)
|
|
397
|
+
});
|
|
398
|
+
}
|
|
399
|
+
return built;
|
|
400
|
+
}
|
|
401
|
+
function buildCallLatencySegments(input) {
|
|
402
|
+
const built = [];
|
|
403
|
+
input.forEach((trace, index) => {
|
|
404
|
+
const metrics = trace?.metrics;
|
|
405
|
+
if (!metrics || typeof metrics !== "object") return;
|
|
406
|
+
const key = normalizeNonEmptyString(trace?.traceId) ?? `${trace.traceType}:${trace.createdAt}:${index}`;
|
|
407
|
+
built.push(...buildSegmentsForMetrics(trace, metrics, key));
|
|
408
|
+
});
|
|
409
|
+
return built.sort((a, b) => a.start - b.start || a.end - b.end || a.row.localeCompare(b.row));
|
|
410
|
+
}
|
|
411
|
+
function segmentStyle(segment) {
|
|
412
|
+
if (viewportStartMs == null || viewportEndMs == null) return null;
|
|
413
|
+
const duration = viewportEndMs - viewportStartMs;
|
|
414
|
+
if (!Number.isFinite(duration) || duration <= 0) return null;
|
|
415
|
+
const fill = COLOR_BY_KEY[segment.colorKey] ?? BOSUN_COLORS.gray;
|
|
416
|
+
const border = tintHex(fill, -0.25);
|
|
417
|
+
if (segment.end === segment.start) {
|
|
418
|
+
if (segment.start < viewportStartMs || segment.start > viewportEndMs) return null;
|
|
419
|
+
const pointPercent = clamp((segment.start - viewportStartMs) / duration * 100, 0, 100);
|
|
420
|
+
return `left:calc(${pointPercent}% - 2px);width:4px;background:${fill};border-color:${border};`;
|
|
421
|
+
}
|
|
422
|
+
const visibleStart = Math.max(segment.start, viewportStartMs);
|
|
423
|
+
const visibleEnd = Math.min(segment.end, viewportEndMs);
|
|
424
|
+
if (visibleEnd < visibleStart) return null;
|
|
425
|
+
const leftPercent = (visibleStart - viewportStartMs) / duration * 100;
|
|
426
|
+
const widthPercent = (visibleEnd - visibleStart) / duration * 100;
|
|
427
|
+
return `left:${leftPercent}%;width:max(${widthPercent}%,2px);background:${fill};border-color:${border};`;
|
|
428
|
+
}
|
|
429
|
+
function guideLineStyle(guide) {
|
|
430
|
+
return `left:${guide.leftPercent}%;top:${guide.topPx}px;height:${guide.heightPx}px;border-color:${guide.color};opacity:${guide.opacity};`;
|
|
431
|
+
}
|
|
432
|
+
function buildGuideLines(rows) {
|
|
433
|
+
return [];
|
|
434
|
+
}
|
|
435
|
+
function chooseTickStep(durationMs) {
|
|
436
|
+
const approx = durationMs / 7;
|
|
437
|
+
const magnitude = 10 ** Math.floor(Math.log10(Math.max(1, approx)));
|
|
438
|
+
const normalized = approx / magnitude;
|
|
439
|
+
if (normalized <= 1) return 1 * magnitude;
|
|
440
|
+
if (normalized <= 2) return 2 * magnitude;
|
|
441
|
+
if (normalized <= 5) return 5 * magnitude;
|
|
442
|
+
return 10 * magnitude;
|
|
443
|
+
}
|
|
444
|
+
function buildTicks(startMs, endMs, originMs) {
|
|
445
|
+
const durationMs = endMs - startMs;
|
|
446
|
+
if (!Number.isFinite(durationMs) || durationMs <= 0) return [];
|
|
447
|
+
const stepMs = chooseTickStep(durationMs);
|
|
448
|
+
const firstTick = Math.ceil((startMs - originMs) / stepMs) * stepMs + originMs;
|
|
449
|
+
const ticks = [];
|
|
450
|
+
for (let tick = firstTick; tick <= endMs; tick += stepMs) {
|
|
451
|
+
const leftPercent = (tick - startMs) / durationMs * 100;
|
|
452
|
+
ticks.push({
|
|
453
|
+
time: tick,
|
|
454
|
+
leftPercent,
|
|
455
|
+
label: formatRelativeTime(tick - originMs)
|
|
456
|
+
});
|
|
457
|
+
}
|
|
458
|
+
return ticks;
|
|
459
|
+
}
|
|
460
|
+
async function closePlaybackAudioContext() {
|
|
461
|
+
const context = playbackAudioContext;
|
|
462
|
+
playbackAudioContext = null;
|
|
463
|
+
if (!context) return;
|
|
464
|
+
await context.close().catch(() => {
|
|
465
|
+
});
|
|
466
|
+
}
|
|
467
|
+
function getPlaybackPositionMs() {
|
|
468
|
+
const durationMs = getRecordingDurationMs();
|
|
469
|
+
if (playbackPlaying && playbackAudioContext && playbackStartedAtMs != null && playbackStartedAtContextTime != null) {
|
|
470
|
+
const elapsedMs = (playbackAudioContext.currentTime - playbackStartedAtContextTime) * 1e3;
|
|
471
|
+
const currentMs = playbackStartedAtMs + Math.max(0, elapsedMs);
|
|
472
|
+
return durationMs > 0 ? clamp(currentMs, 0, durationMs) : Math.max(0, currentMs);
|
|
473
|
+
}
|
|
474
|
+
return durationMs > 0 ? clamp(playbackPositionMs, 0, durationMs) : Math.max(0, playbackPositionMs);
|
|
475
|
+
}
|
|
476
|
+
function stopPlayback(preservePosition = true) {
|
|
477
|
+
if (preservePosition) {
|
|
478
|
+
playbackPositionMs = getPlaybackPositionMs();
|
|
479
|
+
}
|
|
480
|
+
const source = playbackSourceNode;
|
|
481
|
+
playbackSourceNode = null;
|
|
482
|
+
playbackStartedAtMs = null;
|
|
483
|
+
playbackStartedAtContextTime = null;
|
|
484
|
+
playbackPlaying = false;
|
|
485
|
+
if (!source) return;
|
|
486
|
+
source.onended = null;
|
|
487
|
+
try {
|
|
488
|
+
source.stop();
|
|
489
|
+
} catch {
|
|
490
|
+
}
|
|
491
|
+
source.disconnect();
|
|
492
|
+
}
|
|
493
|
+
function getRecordingDurationMs() {
|
|
494
|
+
return 0;
|
|
495
|
+
}
|
|
496
|
+
async function togglePlayback() {
|
|
497
|
+
return;
|
|
498
|
+
}
|
|
499
|
+
function fitViewport(markDirty = true) {
|
|
500
|
+
const extent = contentExtent;
|
|
501
|
+
if (!extent) return;
|
|
502
|
+
const paddingMs = Math.max(500, (extent.max - extent.min) * 0.05);
|
|
503
|
+
viewportStartMs = extent.min - paddingMs;
|
|
504
|
+
viewportEndMs = extent.max + paddingMs;
|
|
505
|
+
}
|
|
506
|
+
function clampViewport(startMs, endMs) {
|
|
507
|
+
const extent = contentExtent;
|
|
508
|
+
if (!extent) return { startMs, endMs };
|
|
509
|
+
const durationMs = endMs - startMs;
|
|
510
|
+
if (durationMs <= 0) return { startMs, endMs };
|
|
511
|
+
const marginMs = Math.max(1e3, durationMs * 0.25);
|
|
512
|
+
const minAllowed = extent.min - marginMs;
|
|
513
|
+
const maxAllowed = extent.max + marginMs;
|
|
514
|
+
if (durationMs >= maxAllowed - minAllowed) {
|
|
515
|
+
return { startMs: minAllowed, endMs: maxAllowed };
|
|
516
|
+
}
|
|
517
|
+
if (startMs < minAllowed) {
|
|
518
|
+
endMs += minAllowed - startMs;
|
|
519
|
+
startMs = minAllowed;
|
|
520
|
+
}
|
|
521
|
+
if (endMs > maxAllowed) {
|
|
522
|
+
startMs -= endMs - maxAllowed;
|
|
523
|
+
endMs = maxAllowed;
|
|
524
|
+
}
|
|
525
|
+
return { startMs, endMs };
|
|
526
|
+
}
|
|
527
|
+
function setViewport(startMs, endMs) {
|
|
528
|
+
if (!Number.isFinite(startMs) || !Number.isFinite(endMs) || endMs <= startMs) return;
|
|
529
|
+
const next = clampViewport(startMs, endMs);
|
|
530
|
+
viewportStartMs = next.startMs;
|
|
531
|
+
viewportEndMs = next.endMs;
|
|
532
|
+
}
|
|
533
|
+
function zoomViewport(factor, focusRatio = 0.5) {
|
|
534
|
+
if (viewportStartMs == null || viewportEndMs == null) return;
|
|
535
|
+
const currentDuration = viewportEndMs - viewportStartMs;
|
|
536
|
+
if (!Number.isFinite(currentDuration) || currentDuration <= 0) return;
|
|
537
|
+
const extent = contentExtent;
|
|
538
|
+
const contentDuration = extent ? extent.max - extent.min : currentDuration;
|
|
539
|
+
const minDuration = Math.min(100, currentDuration);
|
|
540
|
+
const maxDuration = Math.max(contentDuration + Math.max(2e3, contentDuration * 0.1), 5e3);
|
|
541
|
+
const nextDuration = clamp(currentDuration * factor, minDuration, maxDuration);
|
|
542
|
+
const nextFocusRatio = clamp(focusRatio, 0, 1);
|
|
543
|
+
const focusMs = viewportStartMs + currentDuration * nextFocusRatio;
|
|
544
|
+
const nextStartMs = focusMs - nextDuration * nextFocusRatio;
|
|
545
|
+
setViewport(nextStartMs, nextStartMs + nextDuration);
|
|
546
|
+
}
|
|
547
|
+
async function resetAlignment() {
|
|
548
|
+
return;
|
|
549
|
+
}
|
|
550
|
+
$$renderer2.push(`<div class="flex h-full min-h-0 flex-col bg-rc-gray-700"><div class="flex-none border-b border-rc-gray-300/40 p-4"><div class="flex flex-wrap items-start justify-between gap-3"><div><h2 class="text-lg font-semibold text-rc-gray-100">Latency `);
|
|
551
|
+
if (conversationId) {
|
|
552
|
+
$$renderer2.push("<!--[-->");
|
|
553
|
+
$$renderer2.push(`<span class="text-rc-gray-100">for conversation Id:</span> <span class="text-rc-green-200">${escape_html(conversationId)}</span>`);
|
|
554
|
+
} else {
|
|
555
|
+
$$renderer2.push("<!--[!-->");
|
|
556
|
+
}
|
|
557
|
+
$$renderer2.push(`<!--]--></h2> <div class="mt-2 flex flex-wrap gap-x-5 gap-y-1 text-xs text-rc-gray-300"><div><span class="text-rc-gray-400">Latency traces:</span> <span class="font-mono text-rc-gray-100">${escape_html(callSegments.length)}</span></div> <div><span class="text-rc-gray-400">Traces with metrics:</span> <span class="font-mono text-rc-gray-100">${escape_html(latencyTraceCount)}</span></div> <div><span class="text-rc-gray-400">Recording offset:</span> <span class="font-mono text-rc-gray-100">${escape_html(fmtSignedMs(recording.alignmentOffsetMs))}</span></div> `);
|
|
558
|
+
{
|
|
559
|
+
$$renderer2.push("<!--[!-->");
|
|
560
|
+
}
|
|
561
|
+
$$renderer2.push(`<!--]--> `);
|
|
562
|
+
if (viewportStartMs != null && viewportEndMs != null) {
|
|
563
|
+
$$renderer2.push("<!--[-->");
|
|
564
|
+
$$renderer2.push(`<div><span class="text-rc-gray-400">Viewport:</span> <span class="font-mono text-rc-gray-100">${escape_html(formatRelativeTime(viewportStartMs - timelineOriginMs))} → ${escape_html(formatRelativeTime(viewportEndMs - timelineOriginMs))}</span></div>`);
|
|
565
|
+
} else {
|
|
566
|
+
$$renderer2.push("<!--[!-->");
|
|
567
|
+
}
|
|
568
|
+
$$renderer2.push(`<!--]--></div></div> <div class="flex flex-wrap items-center gap-2"><input type="file" accept=".wav,audio/wav,audio/x-wav" class="hidden"/> `);
|
|
569
|
+
Button($$renderer2, {
|
|
570
|
+
variant: "secondary",
|
|
571
|
+
size: "small",
|
|
572
|
+
disabled: uploadInFlight,
|
|
573
|
+
onclick: () => fileInputEl?.click(),
|
|
574
|
+
children: ($$renderer3) => {
|
|
575
|
+
$$renderer3.push(`<!---->${escape_html("Upload WAV")}`);
|
|
576
|
+
},
|
|
577
|
+
$$slots: { default: true }
|
|
578
|
+
});
|
|
579
|
+
$$renderer2.push(`<!----> `);
|
|
580
|
+
Button($$renderer2, {
|
|
581
|
+
variant: "secondary",
|
|
582
|
+
size: "small",
|
|
583
|
+
disabled: true,
|
|
584
|
+
onclick: () => void togglePlayback(),
|
|
585
|
+
children: ($$renderer3) => {
|
|
586
|
+
$$renderer3.push(`<!---->${escape_html(playbackPlaying ? "Pause" : "Play")}`);
|
|
587
|
+
},
|
|
588
|
+
$$slots: { default: true }
|
|
589
|
+
});
|
|
590
|
+
$$renderer2.push(`<!----> `);
|
|
591
|
+
Button($$renderer2, {
|
|
592
|
+
variant: "secondary",
|
|
593
|
+
size: "small",
|
|
594
|
+
disabled: viewportDurationMs == null,
|
|
595
|
+
onclick: () => zoomViewport(0.8),
|
|
596
|
+
children: ($$renderer3) => {
|
|
597
|
+
$$renderer3.push(`<!---->Zoom in`);
|
|
598
|
+
},
|
|
599
|
+
$$slots: { default: true }
|
|
600
|
+
});
|
|
601
|
+
$$renderer2.push(`<!----> `);
|
|
602
|
+
Button($$renderer2, {
|
|
603
|
+
variant: "secondary",
|
|
604
|
+
size: "small",
|
|
605
|
+
disabled: viewportDurationMs == null,
|
|
606
|
+
onclick: () => zoomViewport(1.25),
|
|
607
|
+
children: ($$renderer3) => {
|
|
608
|
+
$$renderer3.push(`<!---->Zoom out`);
|
|
609
|
+
},
|
|
610
|
+
$$slots: { default: true }
|
|
611
|
+
});
|
|
612
|
+
$$renderer2.push(`<!----> `);
|
|
613
|
+
Button($$renderer2, {
|
|
614
|
+
variant: "secondary",
|
|
615
|
+
size: "small",
|
|
616
|
+
disabled: !contentExtent,
|
|
617
|
+
onclick: () => fitViewport(true),
|
|
618
|
+
children: ($$renderer3) => {
|
|
619
|
+
$$renderer3.push(`<!---->Fit call`);
|
|
620
|
+
},
|
|
621
|
+
$$slots: { default: true }
|
|
622
|
+
});
|
|
623
|
+
$$renderer2.push(`<!----> `);
|
|
624
|
+
Button($$renderer2, {
|
|
625
|
+
variant: "secondary",
|
|
626
|
+
size: "small",
|
|
627
|
+
disabled: true,
|
|
628
|
+
onclick: resetAlignment,
|
|
629
|
+
children: ($$renderer3) => {
|
|
630
|
+
$$renderer3.push(`<!---->Reset alignment`);
|
|
631
|
+
},
|
|
632
|
+
$$slots: { default: true }
|
|
633
|
+
});
|
|
634
|
+
$$renderer2.push(`<!----></div></div> `);
|
|
635
|
+
{
|
|
636
|
+
$$renderer2.push("<!--[!-->");
|
|
637
|
+
}
|
|
638
|
+
$$renderer2.push(`<!--]--> `);
|
|
639
|
+
{
|
|
640
|
+
$$renderer2.push("<!--[!-->");
|
|
641
|
+
}
|
|
642
|
+
$$renderer2.push(`<!--]--> `);
|
|
643
|
+
{
|
|
644
|
+
$$renderer2.push("<!--[!-->");
|
|
645
|
+
}
|
|
646
|
+
$$renderer2.push(`<!--]--> `);
|
|
647
|
+
{
|
|
648
|
+
$$renderer2.push("<!--[!-->");
|
|
649
|
+
}
|
|
650
|
+
$$renderer2.push(`<!--]--> `);
|
|
651
|
+
{
|
|
652
|
+
$$renderer2.push("<!--[!-->");
|
|
653
|
+
}
|
|
654
|
+
$$renderer2.push(`<!--]--></div> <div class="rc-scroll min-h-0 flex-1 overflow-auto p-4"><div class="flex flex-col gap-4"><div class="rounded-md border border-rc-gray-650 bg-rc-gray-900/60 p-3"><div class="flex flex-wrap items-start justify-between gap-3"><div><div class="text-sm font-semibold text-rc-gray-100">Recording</div> `);
|
|
655
|
+
{
|
|
656
|
+
$$renderer2.push("<!--[!-->");
|
|
657
|
+
$$renderer2.push(`<div class="mt-1 text-sm text-rc-gray-300">Upload a WAV recording to overlay the call waveform and persist it under this
|
|
658
|
+
project's \`data/\` folder.</div>`);
|
|
659
|
+
}
|
|
660
|
+
$$renderer2.push(`<!--]--></div> <div class="text-xs text-rc-gray-300"><div>Drag the latency chart to pan the viewport.</div> <div>Scroll anywhere in the timeline to zoom traces and waveform together.</div> <div>Click the waveform to move the playhead.</div> <div>Press Space to play or pause.</div> <div>Drag the waveform itself to align the audio against the traces.</div> `);
|
|
661
|
+
{
|
|
662
|
+
$$renderer2.push("<!--[!-->");
|
|
663
|
+
}
|
|
664
|
+
$$renderer2.push(`<!--]--></div></div></div> <div class="rounded-md border border-rc-gray-650 bg-rc-gray-900/60 p-3"><div class="mb-3 flex items-center justify-between gap-3"><div class="text-sm font-semibold text-rc-gray-100">Call timeline</div> <div class="text-xs text-rc-gray-400">Shared x-axis for traces and waveform</div></div> `);
|
|
665
|
+
{
|
|
666
|
+
$$renderer2.push("<!--[!-->");
|
|
667
|
+
if (!callSegments.length) {
|
|
668
|
+
$$renderer2.push("<!--[-->");
|
|
669
|
+
$$renderer2.push(`<div class="text-sm text-rc-gray-300">No latency metrics were found on this call.</div>`);
|
|
670
|
+
} else {
|
|
671
|
+
$$renderer2.push("<!--[!-->");
|
|
672
|
+
if (viewportStartMs == null || viewportEndMs == null) {
|
|
673
|
+
$$renderer2.push("<!--[-->");
|
|
674
|
+
$$renderer2.push(`<div class="text-sm text-rc-gray-300">Preparing timeline…</div>`);
|
|
675
|
+
} else {
|
|
676
|
+
$$renderer2.push("<!--[!-->");
|
|
677
|
+
$$renderer2.push(`<div class="grid grid-cols-[140px_minmax(0,1fr)] gap-x-3"><div class="flex flex-col"><div class="h-8"></div> <!--[-->`);
|
|
678
|
+
const each_array = ensure_array_like(timelineRows);
|
|
679
|
+
for (let $$index = 0, $$length = each_array.length; $$index < $$length; $$index++) {
|
|
680
|
+
let row = each_array[$$index];
|
|
681
|
+
$$renderer2.push(`<div class="flex h-10 items-center text-xs text-rc-gray-300">${escape_html(row.label)}</div>`);
|
|
682
|
+
}
|
|
683
|
+
$$renderer2.push(`<!--]--> <div class="flex h-40 items-center text-xs text-rc-gray-300">Waveform</div> <div class="flex h-8 items-center text-xs text-rc-gray-300">Scale</div></div> <div class="relative"><div class="pointer-events-none absolute inset-0 z-10 overflow-hidden"><!--[-->`);
|
|
684
|
+
const each_array_1 = ensure_array_like(guideLines);
|
|
685
|
+
for (let $$index_1 = 0, $$length = each_array_1.length; $$index_1 < $$length; $$index_1++) {
|
|
686
|
+
let guide = each_array_1[$$index_1];
|
|
687
|
+
$$renderer2.push(`<div class="absolute -translate-x-1/2 border-l border-dashed"${attr_style(guideLineStyle(guide))}></div>`);
|
|
688
|
+
}
|
|
689
|
+
$$renderer2.push(`<!--]--> `);
|
|
690
|
+
if (playbackCursor) {
|
|
691
|
+
$$renderer2.push("<!--[-->");
|
|
692
|
+
$$renderer2.push(`<div class="absolute top-0 -translate-x-1/2 border-l-2 border-rc-green-200/90"${attr_style(`left:${playbackCursor.leftPercent}%;height:${playbackCursor.heightPx}px;`)}></div> <div class="absolute top-1 h-2 w-2 -translate-x-1/2 rounded-full bg-rc-green-200"${attr_style(`left:${playbackCursor.leftPercent}%;`)}></div>`);
|
|
693
|
+
} else {
|
|
694
|
+
$$renderer2.push("<!--[!-->");
|
|
695
|
+
}
|
|
696
|
+
$$renderer2.push(`<!--]--></div> <div class="relative z-0 h-8 overflow-hidden rounded-t border border-b-0 border-rc-gray-700/60 bg-rc-gray-800/30"><!--[-->`);
|
|
697
|
+
const each_array_2 = ensure_array_like(visibleTicks);
|
|
698
|
+
for (let $$index_2 = 0, $$length = each_array_2.length; $$index_2 < $$length; $$index_2++) {
|
|
699
|
+
let tick = each_array_2[$$index_2];
|
|
700
|
+
$$renderer2.push(`<div class="absolute inset-y-0 w-px bg-rc-gray-700/70"${attr_style(`left:${tick.leftPercent}%;`)}></div> <div class="absolute bottom-1 -translate-x-1/2 whitespace-nowrap text-[11px] text-rc-gray-400"${attr_style(`left:${tick.leftPercent}%;`)}>${escape_html(tick.label)}</div>`);
|
|
701
|
+
}
|
|
702
|
+
$$renderer2.push(`<!--]--></div> <!--[-->`);
|
|
703
|
+
const each_array_3 = ensure_array_like(timelineRows);
|
|
704
|
+
for (let $$index_5 = 0, $$length = each_array_3.length; $$index_5 < $$length; $$index_5++) {
|
|
705
|
+
let row = each_array_3[$$index_5];
|
|
706
|
+
$$renderer2.push(`<div class="relative z-0 h-10 overflow-hidden border-x border-t border-rc-gray-700/60 bg-rc-gray-800/20"><!--[-->`);
|
|
707
|
+
const each_array_4 = ensure_array_like(visibleTicks);
|
|
708
|
+
for (let $$index_3 = 0, $$length2 = each_array_4.length; $$index_3 < $$length2; $$index_3++) {
|
|
709
|
+
let tick = each_array_4[$$index_3];
|
|
710
|
+
$$renderer2.push(`<div class="absolute inset-y-0 w-px bg-rc-gray-700/60"${attr_style(`left:${tick.leftPercent}%;`)}></div>`);
|
|
711
|
+
}
|
|
712
|
+
$$renderer2.push(`<!--]--> <!--[-->`);
|
|
713
|
+
const each_array_5 = ensure_array_like(row.segments);
|
|
714
|
+
for (let $$index_4 = 0, $$length2 = each_array_5.length; $$index_4 < $$length2; $$index_4++) {
|
|
715
|
+
let segment = each_array_5[$$index_4];
|
|
716
|
+
const style = segmentStyle(segment);
|
|
717
|
+
if (style) {
|
|
718
|
+
$$renderer2.push("<!--[-->");
|
|
719
|
+
$$renderer2.push(`<div class="absolute top-1/2 h-5 -translate-y-1/2 rounded border shadow-[0_0_0_1px_rgba(0,0,0,0.12)]"${attr_style(style)}></div>`);
|
|
720
|
+
} else {
|
|
721
|
+
$$renderer2.push("<!--[!-->");
|
|
722
|
+
}
|
|
723
|
+
$$renderer2.push(`<!--]-->`);
|
|
724
|
+
}
|
|
725
|
+
$$renderer2.push(`<!--]--></div>`);
|
|
726
|
+
}
|
|
727
|
+
$$renderer2.push(`<!--]--> <div class="relative z-0 h-40 overflow-hidden border-x border-t border-rc-gray-700/60 bg-rc-gray-800/30">`);
|
|
728
|
+
{
|
|
729
|
+
$$renderer2.push("<!--[-->");
|
|
730
|
+
$$renderer2.push(`<div class="absolute inset-0 flex items-center justify-center px-4 text-sm text-rc-gray-300">Upload a WAV file to render the call waveform here.</div>`);
|
|
731
|
+
}
|
|
732
|
+
$$renderer2.push(`<!--]--> <!--[-->`);
|
|
733
|
+
const each_array_6 = ensure_array_like(visibleTicks);
|
|
734
|
+
for (let $$index_6 = 0, $$length = each_array_6.length; $$index_6 < $$length; $$index_6++) {
|
|
735
|
+
let tick = each_array_6[$$index_6];
|
|
736
|
+
$$renderer2.push(`<div class="absolute inset-y-0 w-px bg-rc-gray-700/60"${attr_style(`left:${tick.leftPercent}%;`)}></div>`);
|
|
737
|
+
}
|
|
738
|
+
$$renderer2.push(`<!--]--> `);
|
|
739
|
+
{
|
|
740
|
+
$$renderer2.push("<!--[!-->");
|
|
741
|
+
}
|
|
742
|
+
$$renderer2.push(`<!--]--></div> <div class="relative z-0 h-8 overflow-hidden rounded-b border-x border-b border-t border-rc-gray-700/60 bg-rc-gray-800/25"><div class="absolute left-3 top-1/2 -translate-y-1/2 rounded bg-rc-gray-900/80 px-2 py-0.5 text-[11px] text-rc-gray-300">Grid: ${escape_html(formatScaleStep(visibleTickStepMs))}</div> <!--[-->`);
|
|
743
|
+
const each_array_7 = ensure_array_like(visibleTicks);
|
|
744
|
+
for (let $$index_7 = 0, $$length = each_array_7.length; $$index_7 < $$length; $$index_7++) {
|
|
745
|
+
let tick = each_array_7[$$index_7];
|
|
746
|
+
$$renderer2.push(`<div class="absolute inset-y-0 w-px bg-rc-gray-700/60"${attr_style(`left:${tick.leftPercent}%;`)}></div> <div class="absolute bottom-1 -translate-x-1/2 whitespace-nowrap text-[11px] text-rc-gray-400"${attr_style(`left:${tick.leftPercent}%;`)}>${escape_html(tick.label)}</div>`);
|
|
747
|
+
}
|
|
748
|
+
$$renderer2.push(`<!--]--></div></div></div>`);
|
|
749
|
+
}
|
|
750
|
+
$$renderer2.push(`<!--]-->`);
|
|
751
|
+
}
|
|
752
|
+
$$renderer2.push(`<!--]-->`);
|
|
753
|
+
}
|
|
754
|
+
$$renderer2.push(`<!--]--></div></div></div></div> `);
|
|
755
|
+
{
|
|
756
|
+
$$renderer2.push("<!--[!-->");
|
|
757
|
+
}
|
|
758
|
+
$$renderer2.push(`<!--]-->`);
|
|
759
|
+
});
|
|
760
|
+
}
|
|
761
|
+
|
|
762
|
+
export { _page as default };
|
|
763
|
+
//# sourceMappingURL=_page.svelte-BzEHuU3o.js.map
|