@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.
Files changed (431) hide show
  1. package/bin/bosun.js +12 -9
  2. package/build/client/_app/immutable/assets/0.CeYdzR0K.css +1 -0
  3. package/build/client/_app/immutable/assets/0.CeYdzR0K.css.br +0 -0
  4. package/build/client/_app/immutable/assets/0.CeYdzR0K.css.gz +0 -0
  5. package/build/client/_app/immutable/assets/Popper.CLTyHc88.css +1 -0
  6. package/build/client/_app/immutable/assets/Popper.CLTyHc88.css.br +0 -0
  7. package/build/client/_app/immutable/assets/Popper.CLTyHc88.css.gz +0 -0
  8. package/build/client/_app/immutable/assets/chat-content.Cabnnfyv.css +1 -0
  9. package/build/client/_app/immutable/assets/chat-content.Cabnnfyv.css.br +0 -0
  10. package/build/client/_app/immutable/assets/chat-content.Cabnnfyv.css.gz +0 -0
  11. package/build/client/_app/immutable/chunks/3HVf2z3Q.js +1 -0
  12. package/build/client/_app/immutable/chunks/3HVf2z3Q.js.br +0 -0
  13. package/build/client/_app/immutable/chunks/3HVf2z3Q.js.gz +0 -0
  14. package/build/client/_app/immutable/chunks/8mHyIC1B.js +1 -0
  15. package/build/client/_app/immutable/chunks/8mHyIC1B.js.br +0 -0
  16. package/build/client/_app/immutable/chunks/8mHyIC1B.js.gz +0 -0
  17. package/build/client/_app/immutable/chunks/B394X4Dm.js +1 -0
  18. package/build/client/_app/immutable/chunks/B394X4Dm.js.br +0 -0
  19. package/build/client/_app/immutable/chunks/B394X4Dm.js.gz +0 -0
  20. package/build/client/_app/immutable/chunks/{inUV6bWj.js → B5pH84aF.js} +1 -1
  21. package/build/client/_app/immutable/chunks/B5pH84aF.js.br +0 -0
  22. package/build/client/_app/immutable/chunks/B5pH84aF.js.gz +0 -0
  23. package/build/client/_app/immutable/chunks/B7r4ghJg.js +1 -0
  24. package/build/client/_app/immutable/chunks/B7r4ghJg.js.br +2 -0
  25. package/build/client/_app/immutable/chunks/B7r4ghJg.js.gz +0 -0
  26. package/build/client/_app/immutable/chunks/BALCah_8.js +2 -0
  27. package/build/client/_app/immutable/chunks/BALCah_8.js.br +0 -0
  28. package/build/client/_app/immutable/chunks/BALCah_8.js.gz +0 -0
  29. package/build/client/_app/immutable/chunks/BEJ5fU19.js +1 -0
  30. package/build/client/_app/immutable/chunks/BEJ5fU19.js.br +0 -0
  31. package/build/client/_app/immutable/chunks/BEJ5fU19.js.gz +0 -0
  32. package/build/client/_app/immutable/chunks/BFchB-2I.js +1 -0
  33. package/build/client/_app/immutable/chunks/BFchB-2I.js.br +0 -0
  34. package/build/client/_app/immutable/chunks/BFchB-2I.js.gz +0 -0
  35. package/build/client/_app/immutable/chunks/{DhhcRlSv.js → BRMnbBOX.js} +1 -1
  36. package/build/client/_app/immutable/chunks/BRMnbBOX.js.br +0 -0
  37. package/build/client/_app/immutable/chunks/{DhhcRlSv.js.gz → BRMnbBOX.js.gz} +0 -0
  38. package/build/client/_app/immutable/chunks/{BI8g8xqR.js → BfU3a6pG.js} +1 -1
  39. package/build/client/_app/immutable/chunks/BfU3a6pG.js.br +0 -0
  40. package/build/client/_app/immutable/chunks/BfU3a6pG.js.gz +0 -0
  41. package/build/client/_app/immutable/chunks/Bk5z628g.js +1 -0
  42. package/build/client/_app/immutable/chunks/Bk5z628g.js.br +0 -0
  43. package/build/client/_app/immutable/chunks/Bk5z628g.js.gz +0 -0
  44. package/build/client/_app/immutable/chunks/BmJonxL2.js +1 -0
  45. package/build/client/_app/immutable/chunks/BmJonxL2.js.br +0 -0
  46. package/build/client/_app/immutable/chunks/BmJonxL2.js.gz +0 -0
  47. package/build/client/_app/immutable/chunks/{CEH18jSl.js → C1rQHXql.js} +1 -1
  48. package/build/client/_app/immutable/chunks/C1rQHXql.js.br +0 -0
  49. package/build/client/_app/immutable/chunks/C1rQHXql.js.gz +0 -0
  50. package/build/client/_app/immutable/chunks/C3cmQ-ZQ.js +1 -0
  51. package/build/client/_app/immutable/chunks/C3cmQ-ZQ.js.br +0 -0
  52. package/build/client/_app/immutable/chunks/C3cmQ-ZQ.js.gz +0 -0
  53. package/build/client/_app/immutable/chunks/CB3MYTwM.js +2 -0
  54. package/build/client/_app/immutable/chunks/CB3MYTwM.js.br +0 -0
  55. package/build/client/_app/immutable/chunks/CB3MYTwM.js.gz +0 -0
  56. package/build/client/_app/immutable/chunks/{V9U6b0dU.js → CJHvtD7r.js} +4 -4
  57. package/build/client/_app/immutable/chunks/CJHvtD7r.js.br +0 -0
  58. package/build/client/_app/immutable/chunks/CJHvtD7r.js.gz +0 -0
  59. package/build/client/_app/immutable/chunks/CMCi0U-6.js +5 -0
  60. package/build/client/_app/immutable/chunks/CMCi0U-6.js.br +0 -0
  61. package/build/client/_app/immutable/chunks/CMCi0U-6.js.gz +0 -0
  62. package/build/client/_app/immutable/chunks/CMN-Rq6J.js +1 -0
  63. package/build/client/_app/immutable/chunks/CMN-Rq6J.js.br +0 -0
  64. package/build/client/_app/immutable/chunks/CMN-Rq6J.js.gz +0 -0
  65. package/build/client/_app/immutable/chunks/CU1-H3C1.js +1 -0
  66. package/build/client/_app/immutable/chunks/CU1-H3C1.js.br +0 -0
  67. package/build/client/_app/immutable/chunks/CU1-H3C1.js.gz +0 -0
  68. package/build/client/_app/immutable/chunks/CmatTLDp.js +1 -0
  69. package/build/client/_app/immutable/chunks/CmatTLDp.js.br +0 -0
  70. package/build/client/_app/immutable/chunks/CmatTLDp.js.gz +0 -0
  71. package/build/client/_app/immutable/chunks/Cob_zFH5.js +1 -0
  72. package/build/client/_app/immutable/chunks/Cob_zFH5.js.br +0 -0
  73. package/build/client/_app/immutable/chunks/Cob_zFH5.js.gz +0 -0
  74. package/build/client/_app/immutable/chunks/{CKAQS_Ig.js → DAyj7AJo.js} +1 -1
  75. package/build/client/_app/immutable/chunks/DAyj7AJo.js.br +0 -0
  76. package/build/client/_app/immutable/chunks/DAyj7AJo.js.gz +0 -0
  77. package/build/client/_app/immutable/chunks/DCT4VKzQ.js +1 -0
  78. package/build/client/_app/immutable/chunks/DCT4VKzQ.js.br +0 -0
  79. package/build/client/_app/immutable/chunks/DCT4VKzQ.js.gz +0 -0
  80. package/build/client/_app/immutable/chunks/{Deds-Bu4.js → DGK-Y22B.js} +3 -3
  81. package/build/client/_app/immutable/chunks/DGK-Y22B.js.br +0 -0
  82. package/build/client/_app/immutable/chunks/DGK-Y22B.js.gz +0 -0
  83. package/build/client/_app/immutable/chunks/DJH8-Pxb.js +1 -0
  84. package/build/client/_app/immutable/chunks/DJH8-Pxb.js.br +0 -0
  85. package/build/client/_app/immutable/chunks/DJH8-Pxb.js.gz +0 -0
  86. package/build/client/_app/immutable/chunks/DMtzEpj5.js +2 -0
  87. package/build/client/_app/immutable/chunks/DMtzEpj5.js.br +0 -0
  88. package/build/client/_app/immutable/chunks/DMtzEpj5.js.gz +0 -0
  89. package/build/client/_app/immutable/chunks/D_iTaAhh.js +1 -0
  90. package/build/client/_app/immutable/chunks/D_iTaAhh.js.br +0 -0
  91. package/build/client/_app/immutable/chunks/D_iTaAhh.js.gz +0 -0
  92. package/build/client/_app/immutable/chunks/De71gW9B.js +1 -0
  93. package/build/client/_app/immutable/chunks/De71gW9B.js.br +0 -0
  94. package/build/client/_app/immutable/chunks/De71gW9B.js.gz +0 -0
  95. package/build/client/_app/immutable/chunks/{CfrwacJp.js → Dh5nRfGH.js} +1 -1
  96. package/build/client/_app/immutable/chunks/Dh5nRfGH.js.br +0 -0
  97. package/build/client/_app/immutable/chunks/Dh5nRfGH.js.gz +0 -0
  98. package/build/client/_app/immutable/chunks/ddC1NP9R.js +2 -0
  99. package/build/client/_app/immutable/chunks/ddC1NP9R.js.br +0 -0
  100. package/build/client/_app/immutable/chunks/ddC1NP9R.js.gz +0 -0
  101. package/build/client/_app/immutable/chunks/{BgzmmD_x.js → rHISuZrQ.js} +1 -1
  102. package/build/client/_app/immutable/chunks/rHISuZrQ.js.br +0 -0
  103. package/build/client/_app/immutable/chunks/rHISuZrQ.js.gz +0 -0
  104. package/build/client/_app/immutable/entry/app.z0HZlVW2.js +2 -0
  105. package/build/client/_app/immutable/entry/app.z0HZlVW2.js.br +0 -0
  106. package/build/client/_app/immutable/entry/app.z0HZlVW2.js.gz +0 -0
  107. package/build/client/_app/immutable/entry/start.BI2d1Cy8.js +1 -0
  108. package/build/client/_app/immutable/entry/start.BI2d1Cy8.js.br +2 -0
  109. package/build/client/_app/immutable/entry/start.BI2d1Cy8.js.gz +0 -0
  110. package/build/client/_app/immutable/nodes/{0.CVdeFtgc.js → 0.K529fk47.js} +1 -1
  111. package/build/client/_app/immutable/nodes/0.K529fk47.js.br +0 -0
  112. package/build/client/_app/immutable/nodes/0.K529fk47.js.gz +0 -0
  113. package/build/client/_app/immutable/nodes/1.Do0rKYuZ.js +1 -0
  114. package/build/client/_app/immutable/nodes/1.Do0rKYuZ.js.br +0 -0
  115. package/build/client/_app/immutable/nodes/1.Do0rKYuZ.js.gz +0 -0
  116. package/build/client/_app/immutable/nodes/10.IAMYOUml.js +5 -0
  117. package/build/client/_app/immutable/nodes/10.IAMYOUml.js.br +0 -0
  118. package/build/client/_app/immutable/nodes/10.IAMYOUml.js.gz +0 -0
  119. package/build/client/_app/immutable/nodes/{14.PLVwHmf8.js → 15.DJq8KQca.js} +1 -1
  120. package/build/client/_app/immutable/nodes/15.DJq8KQca.js.br +0 -0
  121. package/build/client/_app/immutable/nodes/15.DJq8KQca.js.gz +0 -0
  122. package/build/client/_app/immutable/nodes/16.MpUk9w5x.js +1 -0
  123. package/build/client/_app/immutable/nodes/16.MpUk9w5x.js.br +0 -0
  124. package/build/client/_app/immutable/nodes/16.MpUk9w5x.js.gz +0 -0
  125. package/build/client/_app/immutable/nodes/17.DeKTr1ON.js +3 -0
  126. package/build/client/_app/immutable/nodes/17.DeKTr1ON.js.br +0 -0
  127. package/build/client/_app/immutable/nodes/17.DeKTr1ON.js.gz +0 -0
  128. package/build/client/_app/immutable/nodes/{15.IKNR1t1s.js → 18.CCXr28ln.js} +5 -5
  129. package/build/client/_app/immutable/nodes/18.CCXr28ln.js.br +0 -0
  130. package/build/client/_app/immutable/nodes/18.CCXr28ln.js.gz +0 -0
  131. package/build/client/_app/immutable/nodes/{2.P49VQzwV.js → 2.B6rYWR87.js} +2 -2
  132. package/build/client/_app/immutable/nodes/2.B6rYWR87.js.br +0 -0
  133. package/build/client/_app/immutable/nodes/2.B6rYWR87.js.gz +0 -0
  134. package/build/client/_app/immutable/nodes/3.CFCUpmUO.js +1 -0
  135. package/build/client/_app/immutable/nodes/3.CFCUpmUO.js.br +0 -0
  136. package/build/client/_app/immutable/nodes/3.CFCUpmUO.js.gz +0 -0
  137. package/build/client/_app/immutable/nodes/4.BYbOpI2z.js +1 -0
  138. package/build/client/_app/immutable/nodes/4.BYbOpI2z.js.br +0 -0
  139. package/build/client/_app/immutable/nodes/4.BYbOpI2z.js.gz +0 -0
  140. package/build/client/_app/immutable/nodes/5.DPO0SD9J.js +1 -0
  141. package/build/client/_app/immutable/nodes/5.DPO0SD9J.js.br +0 -0
  142. package/build/client/_app/immutable/nodes/5.DPO0SD9J.js.gz +0 -0
  143. package/build/client/_app/immutable/nodes/{5.C02zTRTT.js → 6.BJVVMbLC.js} +1 -1
  144. package/build/client/_app/immutable/nodes/6.BJVVMbLC.js.br +0 -0
  145. package/build/client/_app/immutable/nodes/6.BJVVMbLC.js.gz +0 -0
  146. package/build/client/_app/immutable/nodes/{7.BYKTckLf.js → 8.BAyrbFTp.js} +1 -1
  147. package/build/client/_app/immutable/nodes/8.BAyrbFTp.js.br +0 -0
  148. package/build/client/_app/immutable/nodes/8.BAyrbFTp.js.gz +0 -0
  149. package/build/client/_app/immutable/nodes/{8.C7tk-Wsh.js → 9.BUcdtwTB.js} +2 -2
  150. package/build/client/_app/immutable/nodes/9.BUcdtwTB.js.br +0 -0
  151. package/build/client/_app/immutable/nodes/9.BUcdtwTB.js.gz +0 -0
  152. package/build/client/_app/version.json +1 -1
  153. package/build/client/_app/version.json.br +0 -0
  154. package/build/client/_app/version.json.gz +0 -0
  155. package/build/server/chunks/0-BAKgi60O.js +9 -0
  156. package/build/server/chunks/{0-DtejLnPd.js.map → 0-BAKgi60O.js.map} +1 -1
  157. package/build/server/chunks/1-jYHJB-tb.js +9 -0
  158. package/build/server/chunks/{1-Dw6tCl-K.js.map → 1-jYHJB-tb.js.map} +1 -1
  159. package/build/server/chunks/10-YF1bugMU.js +9 -0
  160. package/build/server/chunks/10-YF1bugMU.js.map +1 -0
  161. package/build/server/chunks/{10-DZjMDIvS.js → 11-D9ueFvgV.js} +3 -3
  162. package/build/server/chunks/{10-DZjMDIvS.js.map → 11-D9ueFvgV.js.map} +1 -1
  163. package/build/server/chunks/{11-D6F4I8KX.js → 12-s9qxLZI8.js} +3 -3
  164. package/build/server/chunks/{11-D6F4I8KX.js.map → 12-s9qxLZI8.js.map} +1 -1
  165. package/build/server/chunks/{12-2vbUmx0n.js → 13-DSBw3elU.js} +3 -3
  166. package/build/server/chunks/{12-2vbUmx0n.js.map → 13-DSBw3elU.js.map} +1 -1
  167. package/build/server/chunks/{13-C067TjV7.js → 14-Dys1MDrz.js} +3 -3
  168. package/build/server/chunks/{13-C067TjV7.js.map → 14-Dys1MDrz.js.map} +1 -1
  169. package/build/server/chunks/15-D8gRuCBg.js +9 -0
  170. package/build/server/chunks/15-D8gRuCBg.js.map +1 -0
  171. package/build/server/chunks/16-BRBiMoCX.js +20 -0
  172. package/build/server/chunks/16-BRBiMoCX.js.map +1 -0
  173. package/build/server/chunks/17-D9vMxjRh.js +9 -0
  174. package/build/server/chunks/17-D9vMxjRh.js.map +1 -0
  175. package/build/server/chunks/18-BLN7cTaf.js +9 -0
  176. package/build/server/chunks/18-BLN7cTaf.js.map +1 -0
  177. package/build/server/chunks/2-B4P_qP3q.js +9 -0
  178. package/build/server/chunks/2-B4P_qP3q.js.map +1 -0
  179. package/build/server/chunks/3-njAy3GOi.js +9 -0
  180. package/build/server/chunks/3-njAy3GOi.js.map +1 -0
  181. package/build/server/chunks/4-DPlYm_DX.js +9 -0
  182. package/build/server/chunks/4-DPlYm_DX.js.map +1 -0
  183. package/build/server/chunks/5-BcfdXwaX.js +9 -0
  184. package/build/server/chunks/5-BcfdXwaX.js.map +1 -0
  185. package/build/server/chunks/6-DtBEsI4e.js +9 -0
  186. package/build/server/chunks/6-DtBEsI4e.js.map +1 -0
  187. package/build/server/chunks/{6-B6C38HXu.js → 7-BixmjuY5.js} +3 -3
  188. package/build/server/chunks/{6-B6C38HXu.js.map → 7-BixmjuY5.js.map} +1 -1
  189. package/build/server/chunks/8-DVq9JSHT.js +9 -0
  190. package/build/server/chunks/8-DVq9JSHT.js.map +1 -0
  191. package/build/server/chunks/9-BMEiMRkj.js +9 -0
  192. package/build/server/chunks/9-BMEiMRkj.js.map +1 -0
  193. package/build/server/chunks/{AgentSidebar-BHphbGfv.js → AgentSidebar-BYk5FBc0.js} +5 -5
  194. package/build/server/chunks/{AgentSidebar-BHphbGfv.js.map → AgentSidebar-BYk5FBc0.js.map} +1 -1
  195. package/build/server/chunks/{Button-DZYrr6c0.js → Button-CMHzABlu.js} +2 -2
  196. package/build/server/chunks/{Button-DZYrr6c0.js.map → Button-CMHzABlu.js.map} +1 -1
  197. package/build/server/chunks/{ChatStepTrace-Dy9ryvqZ.js → ChatStepTrace-BWp_rIDm.js} +6 -6
  198. package/build/server/chunks/{ChatStepTrace-Dy9ryvqZ.js.map → ChatStepTrace-BWp_rIDm.js.map} +1 -1
  199. package/build/server/chunks/{ContextEditor-ByGoXY5_.js → ContextEditor-DwSmZH0Y.js} +4 -4
  200. package/build/server/chunks/{ContextEditor-ByGoXY5_.js.map → ContextEditor-DwSmZH0Y.js.map} +1 -1
  201. package/build/server/chunks/{Dropdown-Bz9eHilg.js → Dropdown-DroDbZQ6.js} +3 -2
  202. package/build/server/chunks/Dropdown-DroDbZQ6.js.map +1 -0
  203. package/build/server/chunks/{Icon-C98HpfFT.js → Icon-DdOrLZIU.js} +2 -2
  204. package/build/server/chunks/{Icon-C98HpfFT.js.map → Icon-DdOrLZIU.js.map} +1 -1
  205. package/build/server/chunks/{Input-DZT3Mm_-.js → Input-D-7S8dEO.js} +2 -2
  206. package/build/server/chunks/{Input-DZT3Mm_-.js.map → Input-D-7S8dEO.js.map} +1 -1
  207. package/build/server/chunks/{Modal-D4tx0Bdo.js → Modal-CBKUwUGm.js} +5 -5
  208. package/build/server/chunks/{Modal-D4tx0Bdo.js.map → Modal-CBKUwUGm.js.map} +1 -1
  209. package/build/server/chunks/{Tab-ClYAMM-e.js → Tab-DMBlstpi.js} +5 -5
  210. package/build/server/chunks/{Tab-ClYAMM-e.js.map → Tab-DMBlstpi.js.map} +1 -1
  211. package/build/server/chunks/{_layout.svelte-B6NfHVfy.js → _layout.svelte-B3_pVwfN.js} +6 -6
  212. package/build/server/chunks/{_layout.svelte-B6NfHVfy.js.map → _layout.svelte-B3_pVwfN.js.map} +1 -1
  213. package/build/server/chunks/{_layout.svelte-BoUClC-X.js → _layout.svelte-BnR072vW.js} +15 -14
  214. package/build/server/chunks/_layout.svelte-BnR072vW.js.map +1 -0
  215. package/build/server/chunks/_layout.svelte-BnUNGsUV.js +58 -0
  216. package/build/server/chunks/_layout.svelte-BnUNGsUV.js.map +1 -0
  217. package/build/server/chunks/{_layout.svelte-DfPEqRLq.js → _layout.svelte-BxARmfhE.js} +17 -17
  218. package/build/server/chunks/{_layout.svelte-DfPEqRLq.js.map → _layout.svelte-BxARmfhE.js.map} +1 -1
  219. package/build/server/chunks/{_page.svelte-Ck9Utnoc.js → _page.svelte-BB_XBfMx.js} +5 -5
  220. package/build/server/chunks/{_page.svelte-Ck9Utnoc.js.map → _page.svelte-BB_XBfMx.js.map} +1 -1
  221. package/build/server/chunks/{_page.svelte-CbqAsz26.js → _page.svelte-BaDwHJpC.js} +3 -3
  222. package/build/server/chunks/{_page.svelte-CbqAsz26.js.map → _page.svelte-BaDwHJpC.js.map} +1 -1
  223. package/build/server/chunks/{_page.svelte-mAhccGhM.js → _page.svelte-Bqd9YZKg.js} +11 -11
  224. package/build/server/chunks/{_page.svelte-mAhccGhM.js.map → _page.svelte-Bqd9YZKg.js.map} +1 -1
  225. package/build/server/chunks/_page.svelte-BzEHuU3o.js +763 -0
  226. package/build/server/chunks/_page.svelte-BzEHuU3o.js.map +1 -0
  227. package/build/server/chunks/{_page.svelte-rYYB_tCn.js → _page.svelte-CYLWOoKK.js} +9 -9
  228. package/build/server/chunks/{_page.svelte-rYYB_tCn.js.map → _page.svelte-CYLWOoKK.js.map} +1 -1
  229. package/build/server/chunks/{_page.svelte-DR3jiCLg.js → _page.svelte-CoCvoIxm.js} +13 -12
  230. package/build/server/chunks/_page.svelte-CoCvoIxm.js.map +1 -0
  231. package/build/server/chunks/{_page.svelte-Dl2WmUCF.js → _page.svelte-DKRvXTam.js} +7 -7
  232. package/build/server/chunks/{_page.svelte-Dl2WmUCF.js.map → _page.svelte-DKRvXTam.js.map} +1 -1
  233. package/build/server/chunks/{_page.svelte-CBh9OOQz.js → _page.svelte-DYCzxw9U.js} +11 -11
  234. package/build/server/chunks/{_page.svelte-CBh9OOQz.js.map → _page.svelte-DYCzxw9U.js.map} +1 -1
  235. package/build/server/chunks/_server.ts-CUTB_pVv.js +139 -0
  236. package/build/server/chunks/_server.ts-CUTB_pVv.js.map +1 -0
  237. package/build/server/chunks/_server.ts-CbcaMe9z.js +38 -0
  238. package/build/server/chunks/_server.ts-CbcaMe9z.js.map +1 -0
  239. package/build/server/chunks/{agents-context-BrlIlkOW.js → agents-context-DJAK2Ml6.js} +2 -2
  240. package/build/server/chunks/{agents-context-BrlIlkOW.js.map → agents-context-DJAK2Ml6.js.map} +1 -1
  241. package/build/server/chunks/{source-selection-DJzHsjzD.js → client-tqD_VlIn.js} +3 -107
  242. package/build/server/chunks/client-tqD_VlIn.js.map +1 -0
  243. package/build/server/chunks/{context-zH5kvtGY.js → context-B0vutJuA.js} +2 -2
  244. package/build/server/chunks/{context-zH5kvtGY.js.map → context-B0vutJuA.js.map} +1 -1
  245. package/build/server/chunks/{edit-workspace-context-OTOIRCI0.js → edit-workspace-context-BQXwYkgE.js} +3 -3
  246. package/build/server/chunks/{edit-workspace-context-OTOIRCI0.js.map → edit-workspace-context-BQXwYkgE.js.map} +1 -1
  247. package/build/server/chunks/{error.svelte-DP2oBSvv.js → error.svelte-DZg1sSW2.js} +5 -5
  248. package/build/server/chunks/{error.svelte-DP2oBSvv.js.map → error.svelte-DZg1sSW2.js.map} +1 -1
  249. package/build/server/chunks/{events-M0vvlm3M.js → events-Hd1jvlZp.js} +2 -2
  250. package/build/server/chunks/{events-M0vvlm3M.js.map → events-Hd1jvlZp.js.map} +1 -1
  251. package/build/server/chunks/{index-DxaLoiKh.js → index-BSa6KzSq.js} +2 -2
  252. package/build/server/chunks/{index-DxaLoiKh.js.map → index-BSa6KzSq.js.map} +1 -1
  253. package/build/server/chunks/{index-server-CefdgakO.js → index-server-BI-Ep7Rw.js} +3 -3
  254. package/build/server/chunks/{index-server-CefdgakO.js.map → index-server-BI-Ep7Rw.js.map} +1 -1
  255. package/build/server/chunks/{index2-BuOY2QE4.js → index2-BpEbpEAf.js} +3 -3
  256. package/build/server/chunks/{index2-BuOY2QE4.js.map → index2-BpEbpEAf.js.map} +1 -1
  257. package/build/server/chunks/{index3-CpMl6FwG.js → index3-Cp9d5nmD.js} +4 -4
  258. package/build/server/chunks/{index3-CpMl6FwG.js.map → index3-Cp9d5nmD.js.map} +1 -1
  259. package/build/server/chunks/latency-recordings-CqioXMQl.js +117 -0
  260. package/build/server/chunks/latency-recordings-CqioXMQl.js.map +1 -0
  261. package/build/server/chunks/source-selection-hOQHZ-fn.js +109 -0
  262. package/build/server/chunks/source-selection-hOQHZ-fn.js.map +1 -0
  263. package/build/server/chunks/{state.svelte-DtOGaiYC.js → state.svelte-DbqYHGBV.js} +2 -2
  264. package/build/server/chunks/{state.svelte-DtOGaiYC.js.map → state.svelte-DbqYHGBV.js.map} +1 -1
  265. package/build/server/index.js +32 -10
  266. package/build/server/index.js.map +1 -1
  267. package/build/server/manifest.js +60 -29
  268. package/build/server/manifest.js.map +1 -1
  269. package/package.json +1 -1
  270. package/src/backend/lib/project-data-dir.spec.ts +19 -0
  271. package/src/backend/lib/project-data-dir.ts +9 -0
  272. package/src/backend/roleplay/fs-persistence.ts +5 -4
  273. package/src/backend/roleplay/router.ts +2 -1
  274. package/src/backend/traces/latency-recordings.ts +178 -0
  275. package/build/client/_app/immutable/assets/0.DHvyfZ2Z.css +0 -1
  276. package/build/client/_app/immutable/assets/0.DHvyfZ2Z.css.br +0 -0
  277. package/build/client/_app/immutable/assets/0.DHvyfZ2Z.css.gz +0 -0
  278. package/build/client/_app/immutable/assets/chat-content.NFJFjHv0.css +0 -1
  279. package/build/client/_app/immutable/assets/chat-content.NFJFjHv0.css.br +0 -0
  280. package/build/client/_app/immutable/assets/chat-content.NFJFjHv0.css.gz +0 -0
  281. package/build/client/_app/immutable/chunks/B375rjLA.js +0 -1
  282. package/build/client/_app/immutable/chunks/B375rjLA.js.br +0 -0
  283. package/build/client/_app/immutable/chunks/B375rjLA.js.gz +0 -0
  284. package/build/client/_app/immutable/chunks/BI8g8xqR.js.br +0 -0
  285. package/build/client/_app/immutable/chunks/BI8g8xqR.js.gz +0 -0
  286. package/build/client/_app/immutable/chunks/BcH1VEVU.js +0 -1
  287. package/build/client/_app/immutable/chunks/BcH1VEVU.js.br +0 -0
  288. package/build/client/_app/immutable/chunks/BcH1VEVU.js.gz +0 -0
  289. package/build/client/_app/immutable/chunks/BgzmmD_x.js.br +0 -0
  290. package/build/client/_app/immutable/chunks/BgzmmD_x.js.gz +0 -0
  291. package/build/client/_app/immutable/chunks/Bv4OM4kB.js +0 -1
  292. package/build/client/_app/immutable/chunks/Bv4OM4kB.js.br +0 -0
  293. package/build/client/_app/immutable/chunks/Bv4OM4kB.js.gz +0 -0
  294. package/build/client/_app/immutable/chunks/C0bQ35Gc.js +0 -1
  295. package/build/client/_app/immutable/chunks/C0bQ35Gc.js.br +0 -0
  296. package/build/client/_app/immutable/chunks/C0bQ35Gc.js.gz +0 -0
  297. package/build/client/_app/immutable/chunks/CEH18jSl.js.br +0 -0
  298. package/build/client/_app/immutable/chunks/CEH18jSl.js.gz +0 -0
  299. package/build/client/_app/immutable/chunks/CFWooaMM.js +0 -2
  300. package/build/client/_app/immutable/chunks/CFWooaMM.js.br +0 -0
  301. package/build/client/_app/immutable/chunks/CFWooaMM.js.gz +0 -0
  302. package/build/client/_app/immutable/chunks/CKAQS_Ig.js.br +0 -0
  303. package/build/client/_app/immutable/chunks/CKAQS_Ig.js.gz +0 -0
  304. package/build/client/_app/immutable/chunks/CfrwacJp.js.br +0 -0
  305. package/build/client/_app/immutable/chunks/CfrwacJp.js.gz +0 -0
  306. package/build/client/_app/immutable/chunks/D9tAw4x5.js +0 -1
  307. package/build/client/_app/immutable/chunks/D9tAw4x5.js.br +0 -2
  308. package/build/client/_app/immutable/chunks/D9tAw4x5.js.gz +0 -0
  309. package/build/client/_app/immutable/chunks/DBgGiJzg.js +0 -5
  310. package/build/client/_app/immutable/chunks/DBgGiJzg.js.br +0 -0
  311. package/build/client/_app/immutable/chunks/DBgGiJzg.js.gz +0 -0
  312. package/build/client/_app/immutable/chunks/DXFUtTrQ.js +0 -1
  313. package/build/client/_app/immutable/chunks/DXFUtTrQ.js.br +0 -0
  314. package/build/client/_app/immutable/chunks/DXFUtTrQ.js.gz +0 -0
  315. package/build/client/_app/immutable/chunks/Deds-Bu4.js.br +0 -0
  316. package/build/client/_app/immutable/chunks/Deds-Bu4.js.gz +0 -0
  317. package/build/client/_app/immutable/chunks/DhhcRlSv.js.br +0 -0
  318. package/build/client/_app/immutable/chunks/DklI6PZ2.js +0 -1
  319. package/build/client/_app/immutable/chunks/DklI6PZ2.js.br +0 -2
  320. package/build/client/_app/immutable/chunks/DklI6PZ2.js.gz +0 -0
  321. package/build/client/_app/immutable/chunks/DmeFJZBo.js +0 -1
  322. package/build/client/_app/immutable/chunks/DmeFJZBo.js.br +0 -0
  323. package/build/client/_app/immutable/chunks/DmeFJZBo.js.gz +0 -0
  324. package/build/client/_app/immutable/chunks/Dt0j4sZQ.js +0 -2
  325. package/build/client/_app/immutable/chunks/Dt0j4sZQ.js.br +0 -0
  326. package/build/client/_app/immutable/chunks/Dt0j4sZQ.js.gz +0 -0
  327. package/build/client/_app/immutable/chunks/DxquQJx9.js +0 -1
  328. package/build/client/_app/immutable/chunks/DxquQJx9.js.br +0 -0
  329. package/build/client/_app/immutable/chunks/DxquQJx9.js.gz +0 -0
  330. package/build/client/_app/immutable/chunks/JSHVX3nZ.js +0 -2
  331. package/build/client/_app/immutable/chunks/JSHVX3nZ.js.br +0 -0
  332. package/build/client/_app/immutable/chunks/JSHVX3nZ.js.gz +0 -0
  333. package/build/client/_app/immutable/chunks/L6ABQ5uZ.js +0 -1
  334. package/build/client/_app/immutable/chunks/L6ABQ5uZ.js.br +0 -2
  335. package/build/client/_app/immutable/chunks/L6ABQ5uZ.js.gz +0 -0
  336. package/build/client/_app/immutable/chunks/NpmsW6m-.js +0 -1
  337. package/build/client/_app/immutable/chunks/NpmsW6m-.js.br +0 -0
  338. package/build/client/_app/immutable/chunks/NpmsW6m-.js.gz +0 -0
  339. package/build/client/_app/immutable/chunks/UO83B563.js +0 -1
  340. package/build/client/_app/immutable/chunks/UO83B563.js.br +0 -0
  341. package/build/client/_app/immutable/chunks/UO83B563.js.gz +0 -0
  342. package/build/client/_app/immutable/chunks/V9U6b0dU.js.br +0 -0
  343. package/build/client/_app/immutable/chunks/V9U6b0dU.js.gz +0 -0
  344. package/build/client/_app/immutable/chunks/WVoYdfwC.js +0 -2
  345. package/build/client/_app/immutable/chunks/WVoYdfwC.js.br +0 -0
  346. package/build/client/_app/immutable/chunks/WVoYdfwC.js.gz +0 -0
  347. package/build/client/_app/immutable/chunks/inUV6bWj.js.br +0 -0
  348. package/build/client/_app/immutable/chunks/inUV6bWj.js.gz +0 -0
  349. package/build/client/_app/immutable/entry/app.CJ_bsERC.js +0 -2
  350. package/build/client/_app/immutable/entry/app.CJ_bsERC.js.br +0 -0
  351. package/build/client/_app/immutable/entry/app.CJ_bsERC.js.gz +0 -0
  352. package/build/client/_app/immutable/entry/start.9RB9BRtD.js +0 -1
  353. package/build/client/_app/immutable/entry/start.9RB9BRtD.js.br +0 -2
  354. package/build/client/_app/immutable/entry/start.9RB9BRtD.js.gz +0 -0
  355. package/build/client/_app/immutable/nodes/0.CVdeFtgc.js.br +0 -0
  356. package/build/client/_app/immutable/nodes/0.CVdeFtgc.js.gz +0 -0
  357. package/build/client/_app/immutable/nodes/1.BDChnwm3.js +0 -1
  358. package/build/client/_app/immutable/nodes/1.BDChnwm3.js.br +0 -0
  359. package/build/client/_app/immutable/nodes/1.BDChnwm3.js.gz +0 -0
  360. package/build/client/_app/immutable/nodes/14.PLVwHmf8.js.br +0 -0
  361. package/build/client/_app/immutable/nodes/14.PLVwHmf8.js.gz +0 -0
  362. package/build/client/_app/immutable/nodes/15.IKNR1t1s.js.br +0 -0
  363. package/build/client/_app/immutable/nodes/15.IKNR1t1s.js.gz +0 -0
  364. package/build/client/_app/immutable/nodes/2.P49VQzwV.js.br +0 -0
  365. package/build/client/_app/immutable/nodes/2.P49VQzwV.js.gz +0 -0
  366. package/build/client/_app/immutable/nodes/3.BO8fNoBi.js +0 -1
  367. package/build/client/_app/immutable/nodes/3.BO8fNoBi.js.br +0 -0
  368. package/build/client/_app/immutable/nodes/3.BO8fNoBi.js.gz +0 -0
  369. package/build/client/_app/immutable/nodes/4.Ln69Bcug.js +0 -1
  370. package/build/client/_app/immutable/nodes/4.Ln69Bcug.js.br +0 -0
  371. package/build/client/_app/immutable/nodes/4.Ln69Bcug.js.gz +0 -0
  372. package/build/client/_app/immutable/nodes/5.C02zTRTT.js.br +0 -0
  373. package/build/client/_app/immutable/nodes/5.C02zTRTT.js.gz +0 -0
  374. package/build/client/_app/immutable/nodes/7.BYKTckLf.js.br +0 -0
  375. package/build/client/_app/immutable/nodes/7.BYKTckLf.js.gz +0 -0
  376. package/build/client/_app/immutable/nodes/8.C7tk-Wsh.js.br +0 -0
  377. package/build/client/_app/immutable/nodes/8.C7tk-Wsh.js.gz +0 -0
  378. package/build/client/_app/immutable/nodes/9.DBodeuqK.js +0 -5
  379. package/build/client/_app/immutable/nodes/9.DBodeuqK.js.br +0 -0
  380. package/build/client/_app/immutable/nodes/9.DBodeuqK.js.gz +0 -0
  381. package/build/server/chunks/0-DtejLnPd.js +0 -9
  382. package/build/server/chunks/1-Dw6tCl-K.js +0 -9
  383. package/build/server/chunks/14-CG4GBZSP.js +0 -9
  384. package/build/server/chunks/14-CG4GBZSP.js.map +0 -1
  385. package/build/server/chunks/15-BK7DX1sY.js +0 -9
  386. package/build/server/chunks/15-BK7DX1sY.js.map +0 -1
  387. package/build/server/chunks/2-BaJLoZGK.js +0 -9
  388. package/build/server/chunks/2-BaJLoZGK.js.map +0 -1
  389. package/build/server/chunks/3-B6LhZPYk.js +0 -9
  390. package/build/server/chunks/3-B6LhZPYk.js.map +0 -1
  391. package/build/server/chunks/4-C6AwWXAp.js +0 -9
  392. package/build/server/chunks/4-C6AwWXAp.js.map +0 -1
  393. package/build/server/chunks/5-Dev5MSl1.js +0 -9
  394. package/build/server/chunks/5-Dev5MSl1.js.map +0 -1
  395. package/build/server/chunks/7-qXoxThoS.js +0 -9
  396. package/build/server/chunks/7-qXoxThoS.js.map +0 -1
  397. package/build/server/chunks/8-DHFEzstg.js +0 -9
  398. package/build/server/chunks/8-DHFEzstg.js.map +0 -1
  399. package/build/server/chunks/9-CC9KFXZB.js +0 -9
  400. package/build/server/chunks/9-CC9KFXZB.js.map +0 -1
  401. package/build/server/chunks/Dropdown-Bz9eHilg.js.map +0 -1
  402. package/build/server/chunks/_layout.svelte-BoUClC-X.js.map +0 -1
  403. package/build/server/chunks/_page.svelte-DR3jiCLg.js.map +0 -1
  404. package/build/server/chunks/source-selection-DJzHsjzD.js.map +0 -1
  405. /package/build/client/_app/immutable/assets/{9.BX46PfEJ.css → 10.BX46PfEJ.css} +0 -0
  406. /package/build/client/_app/immutable/assets/{9.BX46PfEJ.css.br → 10.BX46PfEJ.css.br} +0 -0
  407. /package/build/client/_app/immutable/assets/{9.BX46PfEJ.css.gz → 10.BX46PfEJ.css.gz} +0 -0
  408. /package/build/client/_app/immutable/assets/{15.C5apk4jm.css → 18.C5apk4jm.css} +0 -0
  409. /package/build/client/_app/immutable/assets/{15.C5apk4jm.css.br → 18.C5apk4jm.css.br} +0 -0
  410. /package/build/client/_app/immutable/assets/{15.C5apk4jm.css.gz → 18.C5apk4jm.css.gz} +0 -0
  411. /package/build/client/_app/immutable/assets/{4.CZVw96CJ.css → 5.CZVw96CJ.css} +0 -0
  412. /package/build/client/_app/immutable/assets/{4.CZVw96CJ.css.br → 5.CZVw96CJ.css.br} +0 -0
  413. /package/build/client/_app/immutable/assets/{4.CZVw96CJ.css.gz → 5.CZVw96CJ.css.gz} +0 -0
  414. /package/build/client/_app/immutable/assets/{8.DlSPCZj0.css → 9.DlSPCZj0.css} +0 -0
  415. /package/build/client/_app/immutable/assets/{8.DlSPCZj0.css.br → 9.DlSPCZj0.css.br} +0 -0
  416. /package/build/client/_app/immutable/assets/{8.DlSPCZj0.css.gz → 9.DlSPCZj0.css.gz} +0 -0
  417. /package/build/client/_app/immutable/nodes/{10.BVI-eEdV.js → 11.BVI-eEdV.js} +0 -0
  418. /package/build/client/_app/immutable/nodes/{10.BVI-eEdV.js.br → 11.BVI-eEdV.js.br} +0 -0
  419. /package/build/client/_app/immutable/nodes/{10.BVI-eEdV.js.gz → 11.BVI-eEdV.js.gz} +0 -0
  420. /package/build/client/_app/immutable/nodes/{11.BHSGZYEC.js → 12.BHSGZYEC.js} +0 -0
  421. /package/build/client/_app/immutable/nodes/{11.BHSGZYEC.js.br → 12.BHSGZYEC.js.br} +0 -0
  422. /package/build/client/_app/immutable/nodes/{11.BHSGZYEC.js.gz → 12.BHSGZYEC.js.gz} +0 -0
  423. /package/build/client/_app/immutable/nodes/{12.CZ_7M4AF.js → 13.CZ_7M4AF.js} +0 -0
  424. /package/build/client/_app/immutable/nodes/{12.CZ_7M4AF.js.br → 13.CZ_7M4AF.js.br} +0 -0
  425. /package/build/client/_app/immutable/nodes/{12.CZ_7M4AF.js.gz → 13.CZ_7M4AF.js.gz} +0 -0
  426. /package/build/client/_app/immutable/nodes/{13.D96_XEm-.js → 14.D96_XEm-.js} +0 -0
  427. /package/build/client/_app/immutable/nodes/{13.D96_XEm-.js.br → 14.D96_XEm-.js.br} +0 -0
  428. /package/build/client/_app/immutable/nodes/{13.D96_XEm-.js.gz → 14.D96_XEm-.js.gz} +0 -0
  429. /package/build/client/_app/immutable/nodes/{6.CkeP1yO3.js → 7.CkeP1yO3.js} +0 -0
  430. /package/build/client/_app/immutable/nodes/{6.CkeP1yO3.js.br → 7.CkeP1yO3.js.br} +0 -0
  431. /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