@recombine-ai/bosun 0.3.7 → 0.3.9
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/build/client/_app/immutable/assets/0.XjKA4GPF.css +1 -0
- package/build/client/_app/immutable/assets/0.XjKA4GPF.css.br +0 -0
- package/build/client/_app/immutable/assets/0.XjKA4GPF.css.gz +0 -0
- package/build/client/_app/immutable/assets/2.DOE0DQ6H.css +1 -0
- package/build/client/_app/immutable/assets/2.DOE0DQ6H.css.br +0 -0
- package/build/client/_app/immutable/assets/2.DOE0DQ6H.css.gz +0 -0
- package/build/client/_app/immutable/assets/7.DlSPCZj0.css +1 -0
- package/build/client/_app/immutable/assets/7.DlSPCZj0.css.br +0 -0
- package/build/client/_app/immutable/assets/7.DlSPCZj0.css.gz +0 -0
- package/build/client/_app/immutable/assets/8.DoLA3Mkm.css +1 -0
- package/build/client/_app/immutable/assets/8.DoLA3Mkm.css.br +0 -0
- package/build/client/_app/immutable/assets/8.DoLA3Mkm.css.gz +0 -0
- package/build/client/_app/immutable/assets/{Tab.BxaGw9IG.css → Tab.jOjMVh6j.css} +1 -1
- package/build/client/_app/immutable/assets/Tab.jOjMVh6j.css.br +0 -0
- package/build/client/_app/immutable/assets/Tab.jOjMVh6j.css.gz +0 -0
- package/build/client/_app/immutable/chunks/7wcu2ga1.js +1 -0
- package/build/client/_app/immutable/chunks/7wcu2ga1.js.br +0 -0
- package/build/client/_app/immutable/chunks/7wcu2ga1.js.gz +0 -0
- package/build/client/_app/immutable/chunks/B3K88SyC.js +1 -0
- package/build/client/_app/immutable/chunks/B3K88SyC.js.br +0 -0
- package/build/client/_app/immutable/chunks/B3K88SyC.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{D5fGPlBk.js → BGEE3mf3.js} +1 -1
- package/build/client/_app/immutable/chunks/BGEE3mf3.js.br +0 -0
- package/build/client/_app/immutable/chunks/BGEE3mf3.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{BOQMymse.js → BH7VBnJ7.js} +1 -1
- package/build/client/_app/immutable/chunks/BH7VBnJ7.js.br +0 -0
- package/build/client/_app/immutable/chunks/BH7VBnJ7.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BHkx8tAH.js +1 -0
- package/build/client/_app/immutable/chunks/BHkx8tAH.js.br +0 -0
- package/build/client/_app/immutable/chunks/BHkx8tAH.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BMwJcaLS.js +1 -0
- package/build/client/_app/immutable/chunks/BMwJcaLS.js.br +2 -0
- package/build/client/_app/immutable/chunks/BMwJcaLS.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{CfKHaDCm.js → BOrnwyTp.js} +1 -1
- package/build/client/_app/immutable/chunks/BOrnwyTp.js.br +0 -0
- package/build/client/_app/immutable/chunks/BOrnwyTp.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BbaH2eDw.js +1 -0
- package/build/client/_app/immutable/chunks/BbaH2eDw.js.br +0 -0
- package/build/client/_app/immutable/chunks/BbaH2eDw.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{C769zFCl.js → Bub2VLj9.js} +1 -1
- package/build/client/_app/immutable/chunks/Bub2VLj9.js.br +0 -0
- package/build/client/_app/immutable/chunks/Bub2VLj9.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{yOR3vtRx.js → ByppsbS-.js} +1 -1
- package/build/client/_app/immutable/chunks/ByppsbS-.js.br +0 -0
- package/build/client/_app/immutable/chunks/ByppsbS-.js.gz +0 -0
- package/build/client/_app/immutable/chunks/C0mQlu7J.js +1 -0
- package/build/client/_app/immutable/chunks/C0mQlu7J.js.br +1 -0
- package/build/client/_app/immutable/chunks/C0mQlu7J.js.gz +0 -0
- package/build/client/_app/immutable/chunks/C0pV4x1v.js +1 -0
- package/build/client/_app/immutable/chunks/C0pV4x1v.js.br +2 -0
- package/build/client/_app/immutable/chunks/C0pV4x1v.js.gz +0 -0
- package/build/client/_app/immutable/chunks/C0sQKHpE.js +1 -0
- package/build/client/_app/immutable/chunks/C0sQKHpE.js.br +0 -0
- package/build/client/_app/immutable/chunks/C0sQKHpE.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{CRlLKhPr.js → CFcfsVkY.js} +1 -1
- package/build/client/_app/immutable/chunks/CFcfsVkY.js.br +0 -0
- package/build/client/_app/immutable/chunks/CFcfsVkY.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{BHL1bMOV.js → CYkx2jgw.js} +1 -1
- package/build/client/_app/immutable/chunks/CYkx2jgw.js.br +0 -0
- package/build/client/_app/immutable/chunks/CYkx2jgw.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CZ6iREyA.js +8 -0
- package/build/client/_app/immutable/chunks/CZ6iREyA.js.br +0 -0
- package/build/client/_app/immutable/chunks/CZ6iREyA.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CbCJfhin.js +1 -0
- package/build/client/_app/immutable/chunks/CbCJfhin.js.br +0 -0
- package/build/client/_app/immutable/chunks/CbCJfhin.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{DaRvw8c-.js → CdTjAjKm.js} +7 -7
- package/build/client/_app/immutable/chunks/CdTjAjKm.js.br +0 -0
- package/build/client/_app/immutable/chunks/CdTjAjKm.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{4PztAao_.js → CmPVG-ki.js} +1 -1
- package/build/client/_app/immutable/chunks/CmPVG-ki.js.br +0 -0
- package/build/client/_app/immutable/chunks/CmPVG-ki.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{DJ_lsF0V.js → Cnr0cZA4.js} +1 -1
- package/build/client/_app/immutable/chunks/Cnr0cZA4.js.br +0 -0
- package/build/client/_app/immutable/chunks/Cnr0cZA4.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CojkI8AD.js +33 -0
- package/build/client/_app/immutable/chunks/CojkI8AD.js.br +0 -0
- package/build/client/_app/immutable/chunks/CojkI8AD.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Cp_hX0eh.js +1 -0
- package/build/client/_app/immutable/chunks/Cp_hX0eh.js.br +0 -0
- package/build/client/_app/immutable/chunks/Cp_hX0eh.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Cv6CwVfk.js +3 -0
- package/build/client/_app/immutable/chunks/Cv6CwVfk.js.br +0 -0
- package/build/client/_app/immutable/chunks/Cv6CwVfk.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{DAfsp-82.js → D8qEOlWC.js} +1 -1
- package/build/client/_app/immutable/chunks/D8qEOlWC.js.br +0 -0
- package/build/client/_app/immutable/chunks/D8qEOlWC.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{Bf1oCG9-.js → DOMF1VtZ.js} +1 -1
- package/build/client/_app/immutable/chunks/DOMF1VtZ.js.br +0 -0
- package/build/client/_app/immutable/chunks/DOMF1VtZ.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{Bd7SZbXQ.js → DRaGXt8e.js} +1 -1
- package/build/client/_app/immutable/chunks/DRaGXt8e.js.br +0 -0
- package/build/client/_app/immutable/chunks/DRaGXt8e.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{Bw2f0Pmg.js → DU-D8S0B.js} +1 -1
- package/build/client/_app/immutable/chunks/DU-D8S0B.js.br +0 -0
- package/build/client/_app/immutable/chunks/DU-D8S0B.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{Culo9hD6.js → DadWvtYR.js} +1 -1
- package/build/client/_app/immutable/chunks/DadWvtYR.js.br +0 -0
- package/build/client/_app/immutable/chunks/DadWvtYR.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{Cx_xzGPa.js → DbYdNz4J.js} +1 -1
- package/build/client/_app/immutable/chunks/DbYdNz4J.js.br +0 -0
- package/build/client/_app/immutable/chunks/DbYdNz4J.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DiFAgw_s.js +1 -0
- package/build/client/_app/immutable/chunks/DiFAgw_s.js.br +0 -0
- package/build/client/_app/immutable/chunks/DiFAgw_s.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DrMdBz9b.js +1 -0
- package/build/client/_app/immutable/chunks/DrMdBz9b.js.br +0 -0
- package/build/client/_app/immutable/chunks/DrMdBz9b.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{qXu78w_4.js → DsvX5v5e.js} +1 -1
- package/build/client/_app/immutable/chunks/DsvX5v5e.js.br +0 -0
- package/build/client/_app/immutable/chunks/DsvX5v5e.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Y0ymTIHd.js +1 -0
- package/build/client/_app/immutable/chunks/Y0ymTIHd.js.br +0 -0
- package/build/client/_app/immutable/chunks/Y0ymTIHd.js.gz +0 -0
- package/build/client/_app/immutable/chunks/_HWrJCgx.js +1 -0
- package/build/client/_app/immutable/chunks/_HWrJCgx.js.br +0 -0
- package/build/client/_app/immutable/chunks/_HWrJCgx.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{CRTtd6by.js → qPgPowuc.js} +1 -1
- package/build/client/_app/immutable/chunks/qPgPowuc.js.br +0 -0
- package/build/client/_app/immutable/chunks/qPgPowuc.js.gz +0 -0
- package/build/client/_app/immutable/chunks/ri5tqg4N.js +1 -0
- package/build/client/_app/immutable/chunks/ri5tqg4N.js.br +0 -0
- package/build/client/_app/immutable/chunks/ri5tqg4N.js.gz +0 -0
- package/build/client/_app/immutable/chunks/{Codln_pl.js → sdLD1XcR.js} +1 -1
- package/build/client/_app/immutable/chunks/sdLD1XcR.js.br +0 -0
- package/build/client/_app/immutable/chunks/sdLD1XcR.js.gz +0 -0
- package/build/client/_app/immutable/chunks/t1v2-usS.js +4 -0
- package/build/client/_app/immutable/chunks/t1v2-usS.js.br +0 -0
- package/build/client/_app/immutable/chunks/t1v2-usS.js.gz +0 -0
- package/build/client/_app/immutable/chunks/tLFXBP7P.js +2 -0
- package/build/client/_app/immutable/chunks/tLFXBP7P.js.br +0 -0
- package/build/client/_app/immutable/chunks/tLFXBP7P.js.gz +0 -0
- package/build/client/_app/immutable/entry/app.jP0Pyfdy.js +2 -0
- package/build/client/_app/immutable/entry/app.jP0Pyfdy.js.br +0 -0
- package/build/client/_app/immutable/entry/app.jP0Pyfdy.js.gz +0 -0
- package/build/client/_app/immutable/entry/start.KD1JZMOT.js +1 -0
- package/build/client/_app/immutable/entry/start.KD1JZMOT.js.br +2 -0
- package/build/client/_app/immutable/entry/start.KD1JZMOT.js.gz +0 -0
- package/build/client/_app/immutable/nodes/0.ByrdmeSo.js +3 -0
- package/build/client/_app/immutable/nodes/0.ByrdmeSo.js.br +0 -0
- package/build/client/_app/immutable/nodes/0.ByrdmeSo.js.gz +0 -0
- package/build/client/_app/immutable/nodes/1.VLeq38lN.js +1 -0
- package/build/client/_app/immutable/nodes/1.VLeq38lN.js.br +0 -0
- package/build/client/_app/immutable/nodes/1.VLeq38lN.js.gz +0 -0
- package/build/client/_app/immutable/nodes/10.BHSGZYEC.js +1 -0
- package/build/client/_app/immutable/nodes/10.BHSGZYEC.js.br +0 -0
- package/build/client/_app/immutable/nodes/10.BHSGZYEC.js.gz +0 -0
- package/build/client/_app/immutable/nodes/11.CZ_7M4AF.js +1 -0
- package/build/client/_app/immutable/nodes/11.CZ_7M4AF.js.br +0 -0
- package/build/client/_app/immutable/nodes/11.CZ_7M4AF.js.gz +0 -0
- package/build/client/_app/immutable/nodes/12.DRr2l3NZ.js +1 -0
- package/build/client/_app/immutable/nodes/12.DRr2l3NZ.js.br +2 -0
- package/build/client/_app/immutable/nodes/12.DRr2l3NZ.js.gz +0 -0
- package/build/client/_app/immutable/nodes/13.DetV1tDO.js +1 -0
- package/build/client/_app/immutable/nodes/13.DetV1tDO.js.br +0 -0
- package/build/client/_app/immutable/nodes/13.DetV1tDO.js.gz +0 -0
- package/build/client/_app/immutable/nodes/14.I-eiMWQu.js +11 -0
- package/build/client/_app/immutable/nodes/14.I-eiMWQu.js.br +0 -0
- package/build/client/_app/immutable/nodes/14.I-eiMWQu.js.gz +0 -0
- package/build/client/_app/immutable/nodes/2.DX9U9zLg.js +35 -0
- package/build/client/_app/immutable/nodes/2.DX9U9zLg.js.br +0 -0
- package/build/client/_app/immutable/nodes/2.DX9U9zLg.js.gz +0 -0
- package/build/client/_app/immutable/nodes/3.Bh8il5iy.js +1 -0
- package/build/client/_app/immutable/nodes/3.Bh8il5iy.js.br +0 -0
- package/build/client/_app/immutable/nodes/3.Bh8il5iy.js.gz +0 -0
- package/build/client/_app/immutable/nodes/{3.C-B1sGi_.js → 4.CtzHYc6x.js} +1 -1
- package/build/client/_app/immutable/nodes/4.CtzHYc6x.js.br +0 -0
- package/build/client/_app/immutable/nodes/4.CtzHYc6x.js.gz +0 -0
- package/build/client/_app/immutable/nodes/5.B4dlomkV.js +1 -0
- package/build/client/_app/immutable/nodes/5.B4dlomkV.js.br +0 -0
- package/build/client/_app/immutable/nodes/5.B4dlomkV.js.gz +0 -0
- package/build/client/_app/immutable/nodes/6.CPYhLc46.js +1 -0
- package/build/client/_app/immutable/nodes/6.CPYhLc46.js.br +4 -0
- package/build/client/_app/immutable/nodes/6.CPYhLc46.js.gz +0 -0
- package/build/client/_app/immutable/nodes/7.CBPrYfFp.js +2 -0
- package/build/client/_app/immutable/nodes/7.CBPrYfFp.js.br +0 -0
- package/build/client/_app/immutable/nodes/7.CBPrYfFp.js.gz +0 -0
- package/build/client/_app/immutable/nodes/8.4NTWYv4c.js +6 -0
- package/build/client/_app/immutable/nodes/8.4NTWYv4c.js.br +0 -0
- package/build/client/_app/immutable/nodes/8.4NTWYv4c.js.gz +0 -0
- package/build/client/_app/immutable/nodes/9.BVI-eEdV.js +1 -0
- package/build/client/_app/immutable/nodes/9.BVI-eEdV.js.br +0 -0
- package/build/client/_app/immutable/nodes/9.BVI-eEdV.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-CjpeDbMt.js +9 -0
- package/build/server/chunks/{0-CqdHgLFy.js.map → 0-CjpeDbMt.js.map} +1 -1
- package/build/server/chunks/1-M0YzuUQM.js +9 -0
- package/build/server/chunks/{1-CptSbbsC.js.map → 1-M0YzuUQM.js.map} +1 -1
- package/build/server/chunks/{7-soEaW5k5.js → 10-C7WLHR92.js} +5 -5
- package/build/server/chunks/10-C7WLHR92.js.map +1 -0
- package/build/server/chunks/11-CPYwUx-7.js +21 -0
- package/build/server/chunks/11-CPYwUx-7.js.map +1 -0
- package/build/server/chunks/12-C5OSs5Op.js +20 -0
- package/build/server/chunks/12-C5OSs5Op.js.map +1 -0
- package/build/server/chunks/13-BQ9R_Ex-.js +9 -0
- package/build/server/chunks/13-BQ9R_Ex-.js.map +1 -0
- package/build/server/chunks/14-BFsI6u_W.js +9 -0
- package/build/server/chunks/14-BFsI6u_W.js.map +1 -0
- package/build/server/chunks/2-Cjh0UTU6.js +9 -0
- package/build/server/chunks/2-Cjh0UTU6.js.map +1 -0
- package/build/server/chunks/3-VrGFs76T.js +9 -0
- package/build/server/chunks/3-VrGFs76T.js.map +1 -0
- package/build/server/chunks/4-CSgrzh2F.js +9 -0
- package/build/server/chunks/4-CSgrzh2F.js.map +1 -0
- package/build/server/chunks/5-zKehYil3.js +9 -0
- package/build/server/chunks/5-zKehYil3.js.map +1 -0
- package/build/server/chunks/6-uS_X9B0s.js +21 -0
- package/build/server/chunks/6-uS_X9B0s.js.map +1 -0
- package/build/server/chunks/7-DewREBAN.js +9 -0
- package/build/server/chunks/7-DewREBAN.js.map +1 -0
- package/build/server/chunks/8-Dk3ms3jm.js +9 -0
- package/build/server/chunks/8-Dk3ms3jm.js.map +1 -0
- package/build/server/chunks/9-W6XYayeK.js +25 -0
- package/build/server/chunks/9-W6XYayeK.js.map +1 -0
- package/build/server/chunks/{AgentSidebar-BIVt78i3.js → AgentSidebar-BB_yQ9s0.js} +4 -4
- package/build/server/chunks/AgentSidebar-BB_yQ9s0.js.map +1 -0
- package/build/server/chunks/{Button-ZjVPI4zo.js → Button-Cd4Yzpdy.js} +4 -4
- package/build/server/chunks/Button-Cd4Yzpdy.js.map +1 -0
- package/build/server/chunks/{CopyTracesDropdown-B8MjGOwT.js → ChatStepTrace-cq26gF4B.js} +162 -145
- package/build/server/chunks/ChatStepTrace-cq26gF4B.js.map +1 -0
- package/build/server/chunks/ContextEditor-CfjBPLpI.js +67 -0
- package/build/server/chunks/ContextEditor-CfjBPLpI.js.map +1 -0
- package/build/server/chunks/{Icon-Csjrnozq.js → Icon-BgknHaZs.js} +2 -2
- package/build/server/chunks/{Icon-Csjrnozq.js.map → Icon-BgknHaZs.js.map} +1 -1
- package/build/server/chunks/{Input-BCU2QEQ2.js → Input-BJW36iKz.js} +2 -2
- package/build/server/chunks/{Input-BCU2QEQ2.js.map → Input-BJW36iKz.js.map} +1 -1
- package/build/server/chunks/{Modal-bmttP-F1.js → Modal-D4tx0Bdo.js} +3 -3
- package/build/server/chunks/Modal-D4tx0Bdo.js.map +1 -0
- package/build/server/chunks/{Tab-Jw_OwV7Q.js → Tab-DheAG-QC.js} +3 -3
- package/build/server/chunks/Tab-DheAG-QC.js.map +1 -0
- package/build/server/chunks/{_layout.svelte-GwcIlDHC.js → _layout.svelte-BL8XnK1E.js} +23 -28
- package/build/server/chunks/_layout.svelte-BL8XnK1E.js.map +1 -0
- package/build/server/chunks/_layout.svelte-DHgaGTP_.js +844 -0
- package/build/server/chunks/_layout.svelte-DHgaGTP_.js.map +1 -0
- package/build/server/chunks/{_layout.svelte-CrT993Da.js → _layout.svelte-Svi5xbzP.js} +1 -14
- package/build/server/chunks/_layout.svelte-Svi5xbzP.js.map +1 -0
- package/build/server/chunks/{_page.svelte-CVO2CdmB.js → _page.svelte-39hvC6-Q.js} +4 -4
- package/build/server/chunks/{_page.svelte-CVO2CdmB.js.map → _page.svelte-39hvC6-Q.js.map} +1 -1
- package/build/server/chunks/{_page.svelte-D8d07zd0.js → _page.svelte-BpnUXzfh.js} +25 -10
- package/build/server/chunks/_page.svelte-BpnUXzfh.js.map +1 -0
- package/build/server/chunks/{_page.svelte--l_LvFv_.js → _page.svelte-C1YaC_Qg.js} +498 -496
- package/build/server/chunks/_page.svelte-C1YaC_Qg.js.map +1 -0
- package/build/server/chunks/{_page.svelte-BAi74pJ3.js → _page.svelte-CbqAsz26.js} +3 -3
- package/build/server/chunks/_page.svelte-CbqAsz26.js.map +1 -0
- package/build/server/chunks/{_page.svelte-BOzS_rqK.js → _page.svelte-CmsDxzfh.js} +19 -27
- package/build/server/chunks/_page.svelte-CmsDxzfh.js.map +1 -0
- package/build/server/chunks/{_page.svelte-d8hJxmZl.js → _page.svelte-DCP-PSh0.js} +243 -379
- package/build/server/chunks/_page.svelte-DCP-PSh0.js.map +1 -0
- package/build/server/chunks/edit-workspace-context-OTOIRCI0.js +13 -0
- package/build/server/chunks/edit-workspace-context-OTOIRCI0.js.map +1 -0
- package/build/server/chunks/hooks-BJphIAi-.js +8 -0
- package/build/server/chunks/hooks-BJphIAi-.js.map +1 -0
- package/build/server/chunks/{Tab.svelte_svelte_type_style_lang-ByZ0KVzO.js → index-server-CefdgakO.js} +2 -2
- package/build/server/chunks/index-server-CefdgakO.js.map +1 -0
- package/build/server/chunks/{index2-C572SQM_.js → index2-BuOY2QE4.js} +2 -2
- package/build/server/chunks/{index2-C572SQM_.js.map → index2-BuOY2QE4.js.map} +1 -1
- package/build/server/chunks/log-content.svelte-B3ZvaoLs.js +20 -0
- package/build/server/chunks/log-content.svelte-B3ZvaoLs.js.map +1 -0
- package/build/server/index.js +3 -2
- package/build/server/index.js.map +1 -1
- package/build/server/manifest.js +51 -18
- package/build/server/manifest.js.map +1 -1
- package/package.json +3 -1
- package/src/backend/lib/decode-html-entities.spec.ts +29 -0
- package/src/backend/lib/decode-html-entities.ts +25 -0
- package/src/backend/roleplay/router.ts +31 -0
- package/src/backend/tests/academy.ts +353 -115
- package/src/backend/tests/analyze.ts +357 -0
- package/src/backend/tests/data.ts +48 -12
- package/src/backend/tests/emulate-agents.ts +39 -4
- package/src/backend/tests/prompt-issues.ts +204 -0
- package/src/backend/tests/router.ts +51 -4
- package/build/client/_app/immutable/assets/0.BPqDeVAI.css +0 -1
- package/build/client/_app/immutable/assets/0.BPqDeVAI.css.br +0 -0
- package/build/client/_app/immutable/assets/0.BPqDeVAI.css.gz +0 -0
- package/build/client/_app/immutable/assets/4.BIrSikaZ.css +0 -1
- package/build/client/_app/immutable/assets/4.BIrSikaZ.css.br +0 -0
- package/build/client/_app/immutable/assets/4.BIrSikaZ.css.gz +0 -0
- package/build/client/_app/immutable/assets/6.C4C8vBUW.css +0 -1
- package/build/client/_app/immutable/assets/6.C4C8vBUW.css.br +0 -0
- package/build/client/_app/immutable/assets/6.C4C8vBUW.css.gz +0 -0
- package/build/client/_app/immutable/assets/Tab.BxaGw9IG.css.br +0 -0
- package/build/client/_app/immutable/assets/Tab.BxaGw9IG.css.gz +0 -0
- package/build/client/_app/immutable/chunks/4PztAao_.js.br +0 -0
- package/build/client/_app/immutable/chunks/4PztAao_.js.gz +0 -0
- package/build/client/_app/immutable/chunks/B2gGEZTS.js +0 -1
- package/build/client/_app/immutable/chunks/B2gGEZTS.js.br +0 -2
- package/build/client/_app/immutable/chunks/B2gGEZTS.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BHL1bMOV.js.br +0 -0
- package/build/client/_app/immutable/chunks/BHL1bMOV.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BOQMymse.js.br +0 -0
- package/build/client/_app/immutable/chunks/BOQMymse.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Bd7SZbXQ.js.br +0 -0
- package/build/client/_app/immutable/chunks/Bd7SZbXQ.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Bf1oCG9-.js.br +0 -0
- package/build/client/_app/immutable/chunks/Bf1oCG9-.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BgaIh2D4.js +0 -1
- package/build/client/_app/immutable/chunks/BgaIh2D4.js.br +0 -0
- package/build/client/_app/immutable/chunks/BgaIh2D4.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BrDK8TTs.js +0 -2
- package/build/client/_app/immutable/chunks/BrDK8TTs.js.br +0 -0
- package/build/client/_app/immutable/chunks/BrDK8TTs.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BsKQRAyX.js +0 -1
- package/build/client/_app/immutable/chunks/BsKQRAyX.js.br +0 -0
- package/build/client/_app/immutable/chunks/BsKQRAyX.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Bw2f0Pmg.js.br +0 -0
- package/build/client/_app/immutable/chunks/Bw2f0Pmg.js.gz +0 -0
- package/build/client/_app/immutable/chunks/BzAx_Qn3.js +0 -1
- package/build/client/_app/immutable/chunks/BzAx_Qn3.js.br +0 -0
- package/build/client/_app/immutable/chunks/BzAx_Qn3.js.gz +0 -0
- package/build/client/_app/immutable/chunks/C-dTPkQy.js +0 -1
- package/build/client/_app/immutable/chunks/C-dTPkQy.js.br +0 -0
- package/build/client/_app/immutable/chunks/C-dTPkQy.js.gz +0 -0
- package/build/client/_app/immutable/chunks/C769zFCl.js.br +0 -0
- package/build/client/_app/immutable/chunks/C769zFCl.js.gz +0 -0
- package/build/client/_app/immutable/chunks/C7FjDhij.js +0 -4
- package/build/client/_app/immutable/chunks/C7FjDhij.js.br +0 -0
- package/build/client/_app/immutable/chunks/C7FjDhij.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CInh9KnU.js +0 -1
- package/build/client/_app/immutable/chunks/CInh9KnU.js.br +0 -2
- package/build/client/_app/immutable/chunks/CInh9KnU.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CRTtd6by.js.br +0 -0
- package/build/client/_app/immutable/chunks/CRTtd6by.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CRlLKhPr.js.br +0 -0
- package/build/client/_app/immutable/chunks/CRlLKhPr.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CUfDVPpW.js +0 -1
- package/build/client/_app/immutable/chunks/CUfDVPpW.js.br +0 -0
- package/build/client/_app/immutable/chunks/CUfDVPpW.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CfKHaDCm.js.br +0 -0
- package/build/client/_app/immutable/chunks/CfKHaDCm.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Codln_pl.js.br +0 -0
- package/build/client/_app/immutable/chunks/Codln_pl.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Culo9hD6.js.br +0 -0
- package/build/client/_app/immutable/chunks/Culo9hD6.js.gz +0 -0
- package/build/client/_app/immutable/chunks/CxDLEL1d.js +0 -8
- package/build/client/_app/immutable/chunks/CxDLEL1d.js.br +0 -0
- package/build/client/_app/immutable/chunks/CxDLEL1d.js.gz +0 -0
- package/build/client/_app/immutable/chunks/Cx_xzGPa.js.br +0 -0
- package/build/client/_app/immutable/chunks/Cx_xzGPa.js.gz +0 -0
- package/build/client/_app/immutable/chunks/D-51TRqM.js +0 -33
- package/build/client/_app/immutable/chunks/D-51TRqM.js.br +0 -0
- package/build/client/_app/immutable/chunks/D-51TRqM.js.gz +0 -0
- package/build/client/_app/immutable/chunks/D5fGPlBk.js.br +0 -0
- package/build/client/_app/immutable/chunks/D5fGPlBk.js.gz +0 -0
- package/build/client/_app/immutable/chunks/D9h7-Y-f.js +0 -1
- package/build/client/_app/immutable/chunks/D9h7-Y-f.js.br +0 -0
- package/build/client/_app/immutable/chunks/D9h7-Y-f.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DAfsp-82.js.br +0 -0
- package/build/client/_app/immutable/chunks/DAfsp-82.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DJ_lsF0V.js.br +0 -0
- package/build/client/_app/immutable/chunks/DJ_lsF0V.js.gz +0 -0
- package/build/client/_app/immutable/chunks/DaRvw8c-.js.br +0 -0
- package/build/client/_app/immutable/chunks/DaRvw8c-.js.gz +0 -0
- package/build/client/_app/immutable/chunks/FawE95CY.js +0 -1
- package/build/client/_app/immutable/chunks/FawE95CY.js.br +0 -0
- package/build/client/_app/immutable/chunks/FawE95CY.js.gz +0 -0
- package/build/client/_app/immutable/chunks/HBgR5qMR.js +0 -3
- package/build/client/_app/immutable/chunks/HBgR5qMR.js.br +0 -0
- package/build/client/_app/immutable/chunks/HBgR5qMR.js.gz +0 -0
- package/build/client/_app/immutable/chunks/I-mny6CH.js +0 -1
- package/build/client/_app/immutable/chunks/I-mny6CH.js.br +0 -0
- package/build/client/_app/immutable/chunks/I-mny6CH.js.gz +0 -0
- package/build/client/_app/immutable/chunks/aeuWzujc.js +0 -1
- package/build/client/_app/immutable/chunks/aeuWzujc.js.br +0 -2
- package/build/client/_app/immutable/chunks/aeuWzujc.js.gz +0 -0
- package/build/client/_app/immutable/chunks/qXu78w_4.js.br +0 -0
- package/build/client/_app/immutable/chunks/qXu78w_4.js.gz +0 -0
- package/build/client/_app/immutable/chunks/yOR3vtRx.js.br +0 -0
- package/build/client/_app/immutable/chunks/yOR3vtRx.js.gz +0 -0
- package/build/client/_app/immutable/entry/app.Dd7V5oBZ.js +0 -2
- package/build/client/_app/immutable/entry/app.Dd7V5oBZ.js.br +0 -0
- package/build/client/_app/immutable/entry/app.Dd7V5oBZ.js.gz +0 -0
- package/build/client/_app/immutable/entry/start.I6276KWl.js +0 -1
- package/build/client/_app/immutable/entry/start.I6276KWl.js.br +0 -2
- package/build/client/_app/immutable/entry/start.I6276KWl.js.gz +0 -0
- package/build/client/_app/immutable/nodes/0.DgVTcUxG.js +0 -3
- package/build/client/_app/immutable/nodes/0.DgVTcUxG.js.br +0 -0
- package/build/client/_app/immutable/nodes/0.DgVTcUxG.js.gz +0 -0
- package/build/client/_app/immutable/nodes/1._3H1cdWd.js +0 -1
- package/build/client/_app/immutable/nodes/1._3H1cdWd.js.br +0 -0
- package/build/client/_app/immutable/nodes/1._3H1cdWd.js.gz +0 -0
- package/build/client/_app/immutable/nodes/2.BO0WBJz3.js +0 -1
- package/build/client/_app/immutable/nodes/2.BO0WBJz3.js.br +0 -0
- package/build/client/_app/immutable/nodes/2.BO0WBJz3.js.gz +0 -0
- package/build/client/_app/immutable/nodes/3.C-B1sGi_.js.br +0 -0
- package/build/client/_app/immutable/nodes/3.C-B1sGi_.js.gz +0 -0
- package/build/client/_app/immutable/nodes/4.SsrvuMXV.js +0 -35
- package/build/client/_app/immutable/nodes/4.SsrvuMXV.js.br +0 -0
- package/build/client/_app/immutable/nodes/4.SsrvuMXV.js.gz +0 -0
- package/build/client/_app/immutable/nodes/5.DM_0dw43.js +0 -1
- package/build/client/_app/immutable/nodes/5.DM_0dw43.js.br +0 -0
- package/build/client/_app/immutable/nodes/5.DM_0dw43.js.gz +0 -0
- package/build/client/_app/immutable/nodes/6.BLcf1-sM.js +0 -5
- package/build/client/_app/immutable/nodes/6.BLcf1-sM.js.br +0 -0
- package/build/client/_app/immutable/nodes/6.BLcf1-sM.js.gz +0 -0
- package/build/client/_app/immutable/nodes/7.BLozkJCY.js +0 -1
- package/build/client/_app/immutable/nodes/7.BLozkJCY.js.br +0 -0
- package/build/client/_app/immutable/nodes/7.BLozkJCY.js.gz +0 -0
- package/build/client/_app/immutable/nodes/8.BeHRzquW.js +0 -1
- package/build/client/_app/immutable/nodes/8.BeHRzquW.js.br +0 -0
- package/build/client/_app/immutable/nodes/8.BeHRzquW.js.gz +0 -0
- package/build/client/_app/immutable/nodes/9.B1qNbiqD.js +0 -11
- package/build/client/_app/immutable/nodes/9.B1qNbiqD.js.br +0 -0
- package/build/client/_app/immutable/nodes/9.B1qNbiqD.js.gz +0 -0
- package/build/server/chunks/0-CqdHgLFy.js +0 -9
- package/build/server/chunks/1-CptSbbsC.js +0 -9
- package/build/server/chunks/2-CVrU1q5e.js +0 -9
- package/build/server/chunks/2-CVrU1q5e.js.map +0 -1
- package/build/server/chunks/3-Bi3FZgxy.js +0 -9
- package/build/server/chunks/3-Bi3FZgxy.js.map +0 -1
- package/build/server/chunks/4-Cg81z1QT.js +0 -9
- package/build/server/chunks/4-Cg81z1QT.js.map +0 -1
- package/build/server/chunks/5-BDZ8fU2l.js +0 -9
- package/build/server/chunks/5-BDZ8fU2l.js.map +0 -1
- package/build/server/chunks/6-_jdLZ_Lr.js +0 -33
- package/build/server/chunks/6-_jdLZ_Lr.js.map +0 -1
- package/build/server/chunks/7-soEaW5k5.js.map +0 -1
- package/build/server/chunks/8-Yp_dUmRS.js +0 -9
- package/build/server/chunks/8-Yp_dUmRS.js.map +0 -1
- package/build/server/chunks/9-Cb4lmLGK.js +0 -9
- package/build/server/chunks/9-Cb4lmLGK.js.map +0 -1
- package/build/server/chunks/AgentSidebar-BIVt78i3.js.map +0 -1
- package/build/server/chunks/Button-ZjVPI4zo.js.map +0 -1
- package/build/server/chunks/ContextEditor-Dgs8Ax9B.js +0 -45
- package/build/server/chunks/ContextEditor-Dgs8Ax9B.js.map +0 -1
- package/build/server/chunks/CopyTracesDropdown-B8MjGOwT.js.map +0 -1
- package/build/server/chunks/Modal-bmttP-F1.js.map +0 -1
- package/build/server/chunks/Tab-Jw_OwV7Q.js.map +0 -1
- package/build/server/chunks/Tab.svelte_svelte_type_style_lang-ByZ0KVzO.js.map +0 -1
- package/build/server/chunks/_layout.svelte-CrT993Da.js.map +0 -1
- package/build/server/chunks/_layout.svelte-GwcIlDHC.js.map +0 -1
- package/build/server/chunks/_page.svelte--l_LvFv_.js.map +0 -1
- package/build/server/chunks/_page.svelte-BAi74pJ3.js.map +0 -1
- package/build/server/chunks/_page.svelte-BOzS_rqK.js.map +0 -1
- package/build/server/chunks/_page.svelte-D8d07zd0.js.map +0 -1
- package/build/server/chunks/_page.svelte-d8hJxmZl.js.map +0 -1
- /package/build/client/_app/immutable/assets/{9.C5apk4jm.css → 14.C5apk4jm.css} +0 -0
- /package/build/client/_app/immutable/assets/{9.C5apk4jm.css.br → 14.C5apk4jm.css.br} +0 -0
- /package/build/client/_app/immutable/assets/{9.C5apk4jm.css.gz → 14.C5apk4jm.css.gz} +0 -0
- /package/build/client/_app/immutable/assets/{2.Dzh7_Q8n.css → 3.Dzh7_Q8n.css} +0 -0
- /package/build/client/_app/immutable/assets/{2.Dzh7_Q8n.css.br → 3.Dzh7_Q8n.css.br} +0 -0
- /package/build/client/_app/immutable/assets/{2.Dzh7_Q8n.css.gz → 3.Dzh7_Q8n.css.gz} +0 -0
- /package/build/client/_app/immutable/assets/{3.CZVw96CJ.css → 4.CZVw96CJ.css} +0 -0
- /package/build/client/_app/immutable/assets/{3.CZVw96CJ.css.br → 4.CZVw96CJ.css.br} +0 -0
- /package/build/client/_app/immutable/assets/{3.CZVw96CJ.css.gz → 4.CZVw96CJ.css.gz} +0 -0
- /package/build/client/_app/immutable/assets/{CopyTracesDropdown.NFJFjHv0.css → ChatStepTrace.NFJFjHv0.css} +0 -0
- /package/build/client/_app/immutable/assets/{CopyTracesDropdown.NFJFjHv0.css.br → ChatStepTrace.NFJFjHv0.css.br} +0 -0
- /package/build/client/_app/immutable/assets/{CopyTracesDropdown.NFJFjHv0.css.gz → ChatStepTrace.NFJFjHv0.css.gz} +0 -0
- /package/build/client/_app/immutable/assets/{Modal.tn0RQdqM.css → bosun-theme.tn0RQdqM.css} +0 -0
- /package/build/client/_app/immutable/assets/{Modal.tn0RQdqM.css.br → bosun-theme.tn0RQdqM.css.br} +0 -0
- /package/build/client/_app/immutable/assets/{Modal.tn0RQdqM.css.gz → bosun-theme.tn0RQdqM.css.gz} +0 -0
|
@@ -0,0 +1,357 @@
|
|
|
1
|
+
import OpenAI from 'openai'
|
|
2
|
+
import type { StepTrace } from '@recombine-ai/engine'
|
|
3
|
+
|
|
4
|
+
import { getRunResultEntry } from './data'
|
|
5
|
+
import { decodeHtmlEntities } from '../lib/decode-html-entities'
|
|
6
|
+
|
|
7
|
+
const DEFAULT_ANALYZE_SYSTEM_MESSAGE =
|
|
8
|
+
'Stop roleplay. Analyze the last response. Respond with a JSON array of direct quotes from the system prompt that you used to generate it'
|
|
9
|
+
|
|
10
|
+
export interface QuoteCount {
|
|
11
|
+
quote: string
|
|
12
|
+
count: number
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export interface AnalyzeRunResult {
|
|
16
|
+
quotes: QuoteCount[]
|
|
17
|
+
renderedPrompt: string
|
|
18
|
+
stringifiedConversation: string
|
|
19
|
+
raw: Record<string, unknown>
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export async function analyzeTraceQuotes(input: {
|
|
23
|
+
model: string | undefined
|
|
24
|
+
renderedPrompt: string
|
|
25
|
+
stringifiedConversation: string
|
|
26
|
+
response: string
|
|
27
|
+
stepTrace?: StepTrace
|
|
28
|
+
rawInput?: Record<string, unknown>
|
|
29
|
+
}): Promise<AnalyzeRunResult> {
|
|
30
|
+
const apiKey = process.env.OPENAI_API_KEY
|
|
31
|
+
if (!apiKey) {
|
|
32
|
+
throw new Error('OPENAI_API_KEY is not set')
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
const analyzeSystemMessage = envTextOrDefault(
|
|
36
|
+
'BOSUN_ANALYZE_SYSTEM_MESSAGE',
|
|
37
|
+
DEFAULT_ANALYZE_SYSTEM_MESSAGE,
|
|
38
|
+
)
|
|
39
|
+
|
|
40
|
+
const renderedPrompt = decodeHtmlEntities(String(input.renderedPrompt ?? ''))
|
|
41
|
+
if (!renderedPrompt) {
|
|
42
|
+
throw new Error('Missing rendered prompt')
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
const conversation = decodeHtmlEntities(String(input.stringifiedConversation ?? ''))
|
|
46
|
+
if (!conversation) {
|
|
47
|
+
throw new Error('Missing conversation')
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
const resolvedModel = resolveModel(input.model)
|
|
51
|
+
if (!resolvedModel) {
|
|
52
|
+
throw new Error('Missing model')
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
const agentLabel = inferAgentLabel(conversation)
|
|
56
|
+
const decodedResponse = decodeHtmlEntities(String(input.response ?? ''))
|
|
57
|
+
const conversationWithResponse = appendResponseToConversation(conversation, decodedResponse, agentLabel)
|
|
58
|
+
|
|
59
|
+
const client = new OpenAI({ apiKey })
|
|
60
|
+
const calls = Array.from({ length: 10 }, () =>
|
|
61
|
+
analyzeOnce(client, resolvedModel, renderedPrompt, conversationWithResponse, analyzeSystemMessage),
|
|
62
|
+
)
|
|
63
|
+
|
|
64
|
+
const settled = await Promise.allSettled(calls)
|
|
65
|
+
const attemptDetails: Array<Record<string, unknown>> = []
|
|
66
|
+
const counts = new Map<string, number>()
|
|
67
|
+
let succeeded = 0
|
|
68
|
+
let failed = 0
|
|
69
|
+
for (let i = 0; i < settled.length; i++) {
|
|
70
|
+
const res = settled[i]
|
|
71
|
+
if (res.status === 'fulfilled') {
|
|
72
|
+
succeeded += 1
|
|
73
|
+
const uniqueQuotesThisAttempt = [
|
|
74
|
+
...new Set(res.value.map((q) => normalizeQuote(String(q))).filter((q) => q.length > 0))
|
|
75
|
+
]
|
|
76
|
+
attemptDetails.push({ attempt: i + 1, status: 'ok', quotes: uniqueQuotesThisAttempt })
|
|
77
|
+
for (const quote of uniqueQuotesThisAttempt) {
|
|
78
|
+
counts.set(quote, (counts.get(quote) || 0) + 1)
|
|
79
|
+
}
|
|
80
|
+
continue
|
|
81
|
+
}
|
|
82
|
+
failed += 1
|
|
83
|
+
attemptDetails.push({ attempt: i + 1, status: 'error', error: toErrorString(res.reason) })
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
if (succeeded === 0) {
|
|
87
|
+
throw new Error('All analysis calls failed')
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
const quotes = [...counts.entries()]
|
|
91
|
+
.map(([quote, count]) => ({ quote, count }))
|
|
92
|
+
.sort((a, b) => b.count - a.count || a.quote.localeCompare(b.quote))
|
|
93
|
+
|
|
94
|
+
const sanitizedStepTrace = input.stepTrace ? sanitizeAnalyzedStepTrace(input.stepTrace) : null
|
|
95
|
+
|
|
96
|
+
return {
|
|
97
|
+
quotes,
|
|
98
|
+
renderedPrompt,
|
|
99
|
+
stringifiedConversation: conversation,
|
|
100
|
+
raw: {
|
|
101
|
+
input: input.rawInput ?? null,
|
|
102
|
+
calls: {
|
|
103
|
+
requested: 10,
|
|
104
|
+
succeeded,
|
|
105
|
+
failed
|
|
106
|
+
},
|
|
107
|
+
stepTrace: sanitizedStepTrace,
|
|
108
|
+
analysis: {
|
|
109
|
+
parallelCalls: 10,
|
|
110
|
+
systemMessage: analyzeSystemMessage,
|
|
111
|
+
userMessage: {
|
|
112
|
+
conversationChars: conversation.length,
|
|
113
|
+
appendedAgentLabel: agentLabel,
|
|
114
|
+
appendedResponseChars: String(input.response ?? '').length,
|
|
115
|
+
finalConversationChars: conversationWithResponse.length
|
|
116
|
+
},
|
|
117
|
+
systemPrompt: {
|
|
118
|
+
renderedPromptChars: renderedPrompt.length
|
|
119
|
+
}
|
|
120
|
+
},
|
|
121
|
+
attempts: attemptDetails
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
export async function analyzeRunQuotes(input: {
|
|
127
|
+
agent: string
|
|
128
|
+
testId: string
|
|
129
|
+
index: number
|
|
130
|
+
timestamp?: string
|
|
131
|
+
}): Promise<AnalyzeRunResult> {
|
|
132
|
+
const run = await getRunResultEntry(input.agent, input.testId, input.index, input.timestamp)
|
|
133
|
+
|
|
134
|
+
const decodedRenderedPrompt = decodeHtmlEntities(String(run.rendered_prompt ?? ''))
|
|
135
|
+
if (!decodedRenderedPrompt || decodedRenderedPrompt.startsWith('NO RENDERED PROMPT')) {
|
|
136
|
+
throw new Error('Missing main step rendered prompt for this run')
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
const decodedConversation = decodeHtmlEntities(String(run.stringified_conversation ?? ''))
|
|
140
|
+
if (!decodedConversation || decodedConversation.startsWith('NO STRINGIFIED CONVERSATION')) {
|
|
141
|
+
throw new Error('Missing main step conversation for this run')
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
const mainTrace = findMainTrace(run.traces)
|
|
145
|
+
if (!mainTrace) {
|
|
146
|
+
throw new Error('Main step trace not found for this run')
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
const resolvedModel = resolveModel(mainTrace.model)
|
|
150
|
+
if (!resolvedModel) {
|
|
151
|
+
throw new Error('Missing main step model for this run')
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
return analyzeTraceQuotes({
|
|
155
|
+
model: resolvedModel,
|
|
156
|
+
renderedPrompt: decodedRenderedPrompt,
|
|
157
|
+
stringifiedConversation: decodedConversation,
|
|
158
|
+
response: String(run.result || ''),
|
|
159
|
+
stepTrace: mainTrace,
|
|
160
|
+
rawInput: {
|
|
161
|
+
agent: input.agent,
|
|
162
|
+
testId: input.testId,
|
|
163
|
+
index: input.index,
|
|
164
|
+
timestamp: input.timestamp ?? null
|
|
165
|
+
}
|
|
166
|
+
})
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
async function analyzeOnce(
|
|
170
|
+
client: OpenAI,
|
|
171
|
+
model: string,
|
|
172
|
+
renderedPrompt: string,
|
|
173
|
+
conversationWithResponse: string,
|
|
174
|
+
analyzeSystemMessage: string,
|
|
175
|
+
): Promise<string[]> {
|
|
176
|
+
const completion = await client.chat.completions.create({
|
|
177
|
+
model,
|
|
178
|
+
messages: [
|
|
179
|
+
{ role: 'system', content: renderedPrompt },
|
|
180
|
+
{ role: 'user', content: conversationWithResponse },
|
|
181
|
+
{ role: 'system', content: analyzeSystemMessage },
|
|
182
|
+
],
|
|
183
|
+
})
|
|
184
|
+
const content = completion.choices?.[0]?.message?.content
|
|
185
|
+
if (!content) throw new Error('No analysis response from the LLM')
|
|
186
|
+
return parseJsonArrayOfStrings(content)
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
function normalizeQuote(raw: string): string {
|
|
190
|
+
let q = decodeHtmlEntities(raw).trim()
|
|
191
|
+
q = trimWrappingQuotes(q)
|
|
192
|
+
return q.trim()
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
function sanitizeAnalyzedStepTrace(trace: StepTrace): Record<string, unknown> {
|
|
196
|
+
let clone: any
|
|
197
|
+
try {
|
|
198
|
+
clone = JSON.parse(JSON.stringify(trace))
|
|
199
|
+
} catch {
|
|
200
|
+
clone = { ...(trace as any) }
|
|
201
|
+
}
|
|
202
|
+
if (clone && typeof clone === 'object') {
|
|
203
|
+
if ('renderedPrompt' in clone) delete clone.renderedPrompt
|
|
204
|
+
if ('receivedPrompt' in clone) delete clone.receivedPrompt
|
|
205
|
+
}
|
|
206
|
+
return clone as Record<string, unknown>
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
function toErrorString(err: unknown): string {
|
|
210
|
+
if (err instanceof Error) return `${err.name}: ${err.message}`
|
|
211
|
+
try {
|
|
212
|
+
return JSON.stringify(err)
|
|
213
|
+
} catch {
|
|
214
|
+
return String(err)
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
function trimWrappingQuotes(text: string): string {
|
|
219
|
+
const quotePairs: Array<[string, string]> = [
|
|
220
|
+
['"', '"'],
|
|
221
|
+
["'", "'"],
|
|
222
|
+
['“', '”'],
|
|
223
|
+
['‘', '’'],
|
|
224
|
+
['«', '»'],
|
|
225
|
+
['„', '“']
|
|
226
|
+
]
|
|
227
|
+
|
|
228
|
+
let out = text
|
|
229
|
+
for (let i = 0; i < 5; i++) {
|
|
230
|
+
const trimmed = out.trim()
|
|
231
|
+
let changed = false
|
|
232
|
+
for (const [open, close] of quotePairs) {
|
|
233
|
+
if (trimmed.startsWith(open) && trimmed.endsWith(close)) {
|
|
234
|
+
const next = trimmed.slice(open.length, trimmed.length - close.length)
|
|
235
|
+
if (next === trimmed) continue
|
|
236
|
+
out = next
|
|
237
|
+
changed = true
|
|
238
|
+
break
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
if (!changed) {
|
|
242
|
+
out = trimmed
|
|
243
|
+
break
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
return out
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
function findMainTrace(traces: StepTrace[] | undefined): StepTrace | undefined {
|
|
250
|
+
if (!Array.isArray(traces) || traces.length === 0) return undefined
|
|
251
|
+
for (let i = traces.length - 1; i >= 0; i--) {
|
|
252
|
+
const t = traces[i]
|
|
253
|
+
if (!t) continue
|
|
254
|
+
if (t.name === 'main' || t.name === 'mainReply') return t
|
|
255
|
+
}
|
|
256
|
+
return undefined
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
function resolveModel(model: string | undefined): string | null {
|
|
260
|
+
if (!model) return null
|
|
261
|
+
if (model === 'default') return 'gpt-4o-2024-08-06'
|
|
262
|
+
|
|
263
|
+
// Some traces stringify adapter options instead of a bare model name.
|
|
264
|
+
const trimmed = model.trim()
|
|
265
|
+
if (trimmed.startsWith('{') && trimmed.endsWith('}')) {
|
|
266
|
+
try {
|
|
267
|
+
const parsed = JSON.parse(trimmed) as unknown
|
|
268
|
+
if (parsed && typeof parsed === 'object' && 'model' in parsed) {
|
|
269
|
+
const m = (parsed as any).model
|
|
270
|
+
if (typeof m === 'string' && m.trim().length > 0) return m.trim()
|
|
271
|
+
}
|
|
272
|
+
} catch {
|
|
273
|
+
// ignore
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
return trimmed.length > 0 ? trimmed : null
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
function appendResponseToConversation(conversation: string, response: string, agentLabel: string): string {
|
|
281
|
+
const base = conversation.trimEnd()
|
|
282
|
+
const prefix = base.length > 0 ? base + '\n' : ''
|
|
283
|
+
return `${prefix}${agentLabel}: ${response}`
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
function inferAgentLabel(conversation: string): string {
|
|
287
|
+
const lines = conversation.split(/\r?\n/)
|
|
288
|
+
const counts = new Map<string, number>()
|
|
289
|
+
const seen: string[] = []
|
|
290
|
+
|
|
291
|
+
for (const line of lines) {
|
|
292
|
+
const m = line.match(/^([^:\n]{1,50}):\s/)
|
|
293
|
+
if (!m) continue
|
|
294
|
+
const label = m[1]
|
|
295
|
+
seen.push(label)
|
|
296
|
+
counts.set(label, (counts.get(label) || 0) + 1)
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
const userLabel = counts.has('User') ? 'User' : seen[0]
|
|
300
|
+
const sorted = [...counts.entries()].sort((a, b) => b[1] - a[1])
|
|
301
|
+
for (const [label] of sorted) {
|
|
302
|
+
if (!label) continue
|
|
303
|
+
if (label === userLabel) continue
|
|
304
|
+
if (label.toLowerCase() === 'system') continue
|
|
305
|
+
if (label.toLowerCase().startsWith('proposed')) continue
|
|
306
|
+
return label
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
return 'Agent'
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
function parseJsonArrayOfStrings(raw: string): string[] {
|
|
313
|
+
const text = stripCodeFences(raw).trim()
|
|
314
|
+
|
|
315
|
+
const parsed = tryParseJson(text) ?? tryParseJson(extractJsonArray(text))
|
|
316
|
+
if (!parsed) {
|
|
317
|
+
throw new Error('Failed to parse analysis response as JSON array')
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
if (Array.isArray(parsed)) {
|
|
321
|
+
return parsed.map((v) => String(v))
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
if (parsed && typeof parsed === 'object') {
|
|
325
|
+
const quotes = (parsed as any).quotes
|
|
326
|
+
if (Array.isArray(quotes)) return quotes.map((v: unknown) => String(v))
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
throw new Error('Analysis response was not a JSON array')
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
function stripCodeFences(text: string): string {
|
|
333
|
+
const trimmed = text.trim()
|
|
334
|
+
const m = trimmed.match(/^```(?:json)?\s*([\s\S]*?)\s*```$/i)
|
|
335
|
+
return m ? m[1] : trimmed
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
function tryParseJson(text: string): unknown | null {
|
|
339
|
+
try {
|
|
340
|
+
return JSON.parse(text)
|
|
341
|
+
} catch {
|
|
342
|
+
return null
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
function extractJsonArray(text: string): string {
|
|
347
|
+
const start = text.indexOf('[')
|
|
348
|
+
const end = text.lastIndexOf(']')
|
|
349
|
+
if (start === -1 || end === -1 || end < start) return text
|
|
350
|
+
return text.slice(start, end + 1)
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
function envTextOrDefault(key: string, defaultValue: string): string {
|
|
354
|
+
const raw = (process.env[key] ?? '').trim()
|
|
355
|
+
if (!raw) return defaultValue
|
|
356
|
+
return raw.replace(/\\n/g, '\n')
|
|
357
|
+
}
|
|
@@ -39,6 +39,12 @@ export interface RunResult {
|
|
|
39
39
|
logs: string[]
|
|
40
40
|
}
|
|
41
41
|
|
|
42
|
+
export interface PreviousTestResultSummary {
|
|
43
|
+
success_count: number
|
|
44
|
+
total_runs: number
|
|
45
|
+
report_timestamp: string // ISO
|
|
46
|
+
}
|
|
47
|
+
|
|
42
48
|
export interface TestResult {
|
|
43
49
|
test_id: string
|
|
44
50
|
success_rate_percent?: number
|
|
@@ -46,6 +52,7 @@ export interface TestResult {
|
|
|
46
52
|
results: RunResult[]
|
|
47
53
|
report_timestamp: string // ISO
|
|
48
54
|
is_old: boolean
|
|
55
|
+
previous?: PreviousTestResultSummary
|
|
49
56
|
}
|
|
50
57
|
export interface TestTable {
|
|
51
58
|
rows: TestRow[]
|
|
@@ -89,6 +96,7 @@ export async function loadTests(agent: string): Promise<TestTable> {
|
|
|
89
96
|
'id',
|
|
90
97
|
'pinned',
|
|
91
98
|
'scenario',
|
|
99
|
+
'step',
|
|
92
100
|
'author',
|
|
93
101
|
'category',
|
|
94
102
|
'assertion_type',
|
|
@@ -273,7 +281,8 @@ export async function loadLatestResultsByTest(agent: string): Promise<Record<str
|
|
|
273
281
|
.replace(/-/g, ':')
|
|
274
282
|
|
|
275
283
|
const results: Record<string, TestResult> = {}
|
|
276
|
-
for (
|
|
284
|
+
for (let i = files.length - 1; i >= 0; i--) {
|
|
285
|
+
const name = files[i]
|
|
277
286
|
const full = path.join(outDir, name)
|
|
278
287
|
const raw = await readFile(full, 'utf8')
|
|
279
288
|
const parsed = JSON.parse(raw) as any
|
|
@@ -288,18 +297,28 @@ export async function loadLatestResultsByTest(agent: string): Promise<Record<str
|
|
|
288
297
|
}
|
|
289
298
|
const par = String((r as any).pinned_at_run ?? 'TRUE').toUpperCase()
|
|
290
299
|
if (par === 'FALSE') continue
|
|
291
|
-
|
|
292
|
-
const
|
|
293
|
-
const
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
+
|
|
301
|
+
const runResults: RunResult[] = Array.isArray((r as any).results) ? ((r as any).results as RunResult[]) : []
|
|
302
|
+
const summary: PreviousTestResultSummary = {
|
|
303
|
+
success_count: runResults.reduce((acc, rr) => acc + (rr?.success ? 1 : 0), 0),
|
|
304
|
+
total_runs: runResults.length,
|
|
305
|
+
report_timestamp: ts
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
const current = results[test_id]
|
|
309
|
+
if (!current) {
|
|
310
|
+
results[test_id] = {
|
|
311
|
+
test_id,
|
|
312
|
+
success_rate_percent: (r as any).success_rate_percent,
|
|
313
|
+
success_rate: (r as any).success_rate,
|
|
314
|
+
results: runResults,
|
|
315
|
+
report_timestamp: ts,
|
|
316
|
+
is_old: ts < latestTs
|
|
317
|
+
}
|
|
318
|
+
continue
|
|
300
319
|
}
|
|
301
|
-
if (!
|
|
302
|
-
|
|
320
|
+
if (!current.previous && ts < current.report_timestamp) {
|
|
321
|
+
current.previous = summary
|
|
303
322
|
}
|
|
304
323
|
}
|
|
305
324
|
}
|
|
@@ -338,6 +357,23 @@ async function getRun(agent: string, ts?: string) {
|
|
|
338
357
|
|
|
339
358
|
type ResultKey = keyof Omit<ResultEntry, 'success'>
|
|
340
359
|
|
|
360
|
+
export async function getRunResultEntry(
|
|
361
|
+
agent: string,
|
|
362
|
+
testId: string,
|
|
363
|
+
index = 0,
|
|
364
|
+
ts?: string
|
|
365
|
+
): Promise<ResultEntry> {
|
|
366
|
+
const result = await getRun(agent, ts)
|
|
367
|
+
|
|
368
|
+
const row = result.rows.find((r) => r.test_id === testId)
|
|
369
|
+
if (!row) throw new Error('Row not found in report')
|
|
370
|
+
|
|
371
|
+
const run = row.results[index]
|
|
372
|
+
if (!run) throw new Error(`Run not found for test ${testId}, index: ${index}`)
|
|
373
|
+
|
|
374
|
+
return run
|
|
375
|
+
}
|
|
376
|
+
|
|
341
377
|
export async function getResultEntry(
|
|
342
378
|
agent: string,
|
|
343
379
|
testId: string,
|
|
@@ -17,6 +17,7 @@ export async function loadAgents(props: {
|
|
|
17
17
|
logger?: Logger
|
|
18
18
|
context?: Record<string, any>
|
|
19
19
|
timeoutSeconds: number
|
|
20
|
+
abortSignal?: AbortSignal
|
|
20
21
|
}): Promise<void> {
|
|
21
22
|
const {
|
|
22
23
|
agentId,
|
|
@@ -25,7 +26,8 @@ export async function loadAgents(props: {
|
|
|
25
26
|
stepTracer: stepTracer,
|
|
26
27
|
logger: providedLogger,
|
|
27
28
|
context,
|
|
28
|
-
timeoutSeconds
|
|
29
|
+
timeoutSeconds,
|
|
30
|
+
abortSignal
|
|
29
31
|
} = props
|
|
30
32
|
const { factories } = await getAgentFactories(await getRootPath())
|
|
31
33
|
const factory = factories[agentId]
|
|
@@ -87,13 +89,46 @@ export async function loadAgents(props: {
|
|
|
87
89
|
console.error('UNHANDLED', r)
|
|
88
90
|
})
|
|
89
91
|
|
|
92
|
+
const withAbort = async <T>(p: Promise<T>): Promise<T> => {
|
|
93
|
+
if (!abortSignal) return p
|
|
94
|
+
if (abortSignal.aborted) throw new Error('Operation cancelled')
|
|
95
|
+
return await new Promise<T>((resolve, reject) => {
|
|
96
|
+
const onAbort = () => {
|
|
97
|
+
cleanup()
|
|
98
|
+
reject(new Error('Operation cancelled'))
|
|
99
|
+
}
|
|
100
|
+
const cleanup = () => {
|
|
101
|
+
try {
|
|
102
|
+
abortSignal.removeEventListener('abort', onAbort)
|
|
103
|
+
} catch {
|
|
104
|
+
/* noop */
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
try {
|
|
108
|
+
abortSignal.addEventListener('abort', onAbort, { once: true })
|
|
109
|
+
} catch {
|
|
110
|
+
/* noop */
|
|
111
|
+
}
|
|
112
|
+
p.then(
|
|
113
|
+
(v) => {
|
|
114
|
+
cleanup()
|
|
115
|
+
resolve(v)
|
|
116
|
+
},
|
|
117
|
+
(e) => {
|
|
118
|
+
cleanup()
|
|
119
|
+
reject(e)
|
|
120
|
+
}
|
|
121
|
+
)
|
|
122
|
+
})
|
|
123
|
+
}
|
|
124
|
+
|
|
90
125
|
try {
|
|
91
126
|
if (isVoiceAgent(agent)) {
|
|
92
|
-
await agent.streamResponse()
|
|
127
|
+
await withAbort(agent.streamResponse())
|
|
93
128
|
} else {
|
|
94
|
-
await agent.respondToMessage()
|
|
129
|
+
await withAbort(agent.respondToMessage())
|
|
95
130
|
}
|
|
96
|
-
await new Promise((resolve) => setTimeout(resolve, timeoutSeconds * 1000))
|
|
131
|
+
await withAbort(new Promise((resolve) => setTimeout(resolve, timeoutSeconds * 1000)))
|
|
97
132
|
} catch (err) {
|
|
98
133
|
const msg = err instanceof Error ? `${err.name}: ${err.message}` : String(err)
|
|
99
134
|
const stack = err instanceof Error ? err.stack : undefined
|