@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
|
@@ -6,7 +6,7 @@ import { loadAgents } from './emulate-agents'
|
|
|
6
6
|
import { type Assertion as PFAssertion } from 'promptfoo'
|
|
7
7
|
// Backend: per-project JSON test suites (no CSV)
|
|
8
8
|
import { tryReadConfig } from './config'
|
|
9
|
-
import { mkdir, writeFile } from 'node:fs/promises'
|
|
9
|
+
import { mkdir, rename, unlink, writeFile } from 'node:fs/promises'
|
|
10
10
|
import path from 'node:path'
|
|
11
11
|
import { readSuite } from './suite'
|
|
12
12
|
// Use types derived from promptfoo exports instead of incorrect default type imports
|
|
@@ -58,6 +58,58 @@ export interface TableRow extends CsvRow {
|
|
|
58
58
|
results: ResultEntry[]
|
|
59
59
|
}
|
|
60
60
|
|
|
61
|
+
export interface WrittenRunReportConfig {
|
|
62
|
+
repeats: number
|
|
63
|
+
concurrency: number
|
|
64
|
+
defaultContext: Record<string, any>
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
export interface WrittenRunReportRow extends TableRow {
|
|
68
|
+
agent: string
|
|
69
|
+
test_id: string
|
|
70
|
+
run_timestamp: string
|
|
71
|
+
run_config: string
|
|
72
|
+
pinned_at_run: 'TRUE' | 'FALSE'
|
|
73
|
+
run_scope: 'all' | 'pinned'
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
export interface WrittenRunReport {
|
|
77
|
+
agent: string
|
|
78
|
+
run_timestamp: string
|
|
79
|
+
run_scope: 'all' | 'pinned'
|
|
80
|
+
run_config: WrittenRunReportConfig
|
|
81
|
+
rows: WrittenRunReportRow[]
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
type PromptTestsScope = 'all' | 'pinned'
|
|
85
|
+
|
|
86
|
+
type PromptTestsSelection = { scope: PromptTestsScope } | { testId: string }
|
|
87
|
+
|
|
88
|
+
const activeRunsByAgent = new Map<string, AbortController>()
|
|
89
|
+
|
|
90
|
+
export function cancelPromptTests(agent: string): boolean {
|
|
91
|
+
const controller = activeRunsByAgent.get(agent)
|
|
92
|
+
if (!controller) return false
|
|
93
|
+
controller.abort()
|
|
94
|
+
return true
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
export async function runPromptTestsManaged(
|
|
98
|
+
agent: string,
|
|
99
|
+
selection: PromptTestsSelection = { scope: 'pinned' }
|
|
100
|
+
): Promise<WrittenRunReport> {
|
|
101
|
+
if (activeRunsByAgent.has(agent)) {
|
|
102
|
+
throw new Error('Tests already running for this agent')
|
|
103
|
+
}
|
|
104
|
+
const controller = new AbortController()
|
|
105
|
+
activeRunsByAgent.set(agent, controller)
|
|
106
|
+
try {
|
|
107
|
+
return await runPromptTests(agent, selection, { signal: controller.signal })
|
|
108
|
+
} finally {
|
|
109
|
+
activeRunsByAgent.delete(agent)
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
61
113
|
// Deep merge helper using 'deepmerge' with array replacement semantics
|
|
62
114
|
const mergeContexts = (baseCtx: Record<string, any>, testCtx: Record<string, any>) =>
|
|
63
115
|
deepmerge(baseCtx || {}, testCtx || {}, { arrayMerge: (_d, s, _o) => s })
|
|
@@ -111,10 +163,13 @@ function parseConversationFromSheet(conversation: string | undefined | null): Co
|
|
|
111
163
|
function toTestInputs(
|
|
112
164
|
rows: (CsvRow & { index: number })[],
|
|
113
165
|
defaultContext?: Record<string, any>,
|
|
114
|
-
|
|
166
|
+
selection: PromptTestsSelection = { scope: 'pinned' }
|
|
115
167
|
) {
|
|
116
168
|
return rows
|
|
117
|
-
.filter((r) =>
|
|
169
|
+
.filter((r) => {
|
|
170
|
+
if ('testId' in selection) return String(r.id ?? '') === String(selection.testId)
|
|
171
|
+
return selection.scope === 'all' ? true : r.pinned === 'TRUE'
|
|
172
|
+
})
|
|
118
173
|
.map((row) => ({
|
|
119
174
|
id: row.id,
|
|
120
175
|
scenario: row.scenario,
|
|
@@ -157,12 +212,17 @@ function toTestInputs(
|
|
|
157
212
|
export class RecombineAgentProvider implements ApiProvider {
|
|
158
213
|
protected providerId: string
|
|
159
214
|
public config: Record<string, unknown>
|
|
215
|
+
private abortSignal?: AbortSignal
|
|
160
216
|
|
|
161
217
|
constructor(options: ProviderOptions) {
|
|
162
218
|
this.providerId = options.id || 'recombine-agent'
|
|
163
219
|
this.config = options.config || {}
|
|
164
220
|
}
|
|
165
221
|
|
|
222
|
+
setAbortSignal(signal: AbortSignal | undefined) {
|
|
223
|
+
this.abortSignal = signal
|
|
224
|
+
}
|
|
225
|
+
|
|
166
226
|
id() {
|
|
167
227
|
return this.providerId
|
|
168
228
|
}
|
|
@@ -269,7 +329,8 @@ export class RecombineAgentProvider implements ApiProvider {
|
|
|
269
329
|
stepTracer,
|
|
270
330
|
logger,
|
|
271
331
|
context: vars.context || {},
|
|
272
|
-
timeoutSeconds: Number(vars.timeoutSeconds)
|
|
332
|
+
timeoutSeconds: Number(vars.timeoutSeconds),
|
|
333
|
+
abortSignal: this.abortSignal
|
|
273
334
|
})
|
|
274
335
|
|
|
275
336
|
const logsDir = path.join(projectRoot, 'data', 'logs')
|
|
@@ -361,6 +422,62 @@ export class RecombineAgentProvider implements ApiProvider {
|
|
|
361
422
|
type PFEval = Awaited<ReturnType<typeof promptfoo.evaluate>>
|
|
362
423
|
type PFEvalResult = PFEval['results'][number]
|
|
363
424
|
|
|
425
|
+
const toStringSafe = (v: unknown): string => {
|
|
426
|
+
if (typeof v === 'string') return v
|
|
427
|
+
try {
|
|
428
|
+
return JSON.stringify(v)
|
|
429
|
+
} catch {
|
|
430
|
+
return String(v)
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
function toResultEntry(r: any): ResultEntry {
|
|
435
|
+
const rawTraces = Array.isArray(r.metadata?.rawStepTraces)
|
|
436
|
+
? r.metadata?.rawStepTraces
|
|
437
|
+
: Array.isArray(r.metadata?.stepTraces)
|
|
438
|
+
? r.metadata?.stepTraces
|
|
439
|
+
: []
|
|
440
|
+
// Pick the last trace whose name === 'main'
|
|
441
|
+
const lastMain = (() => {
|
|
442
|
+
for (let i = rawTraces.length - 1; i >= 0; i--) {
|
|
443
|
+
const t = rawTraces[i]
|
|
444
|
+
if (t && t.name === 'main') return t
|
|
445
|
+
}
|
|
446
|
+
return undefined
|
|
447
|
+
})()
|
|
448
|
+
const rendered_prompt =
|
|
449
|
+
lastMain && typeof lastMain.renderedPrompt !== 'undefined'
|
|
450
|
+
? toStringSafe(lastMain.renderedPrompt)
|
|
451
|
+
: 'NO RENDERED PROMPT'
|
|
452
|
+
const received_prompt =
|
|
453
|
+
lastMain && typeof lastMain.receivedPrompt !== 'undefined'
|
|
454
|
+
? toStringSafe(lastMain.receivedPrompt)
|
|
455
|
+
: 'NO RECEIVED PROMPT'
|
|
456
|
+
const stringified_conversation =
|
|
457
|
+
lastMain && typeof lastMain.stringifiedConversation !== 'undefined'
|
|
458
|
+
? toStringSafe(lastMain.stringifiedConversation)
|
|
459
|
+
: 'NO STRINGIFIED CONVERSATION'
|
|
460
|
+
const received_context =
|
|
461
|
+
lastMain && typeof lastMain.receivedContext !== 'undefined'
|
|
462
|
+
? toStringSafe(lastMain.receivedContext)
|
|
463
|
+
: 'NO RECEIVED CONTEXT'
|
|
464
|
+
|
|
465
|
+
const logs = Array.isArray(r.metadata?.logs) ? (r.metadata?.logs as string[]) : []
|
|
466
|
+
const traces = Array.isArray(r.metadata?.stepTraces) ? r.metadata?.stepTraces : []
|
|
467
|
+
return {
|
|
468
|
+
success: !!r.success,
|
|
469
|
+
result: String(r.response?.output ?? ''),
|
|
470
|
+
evaluation: String(r.gradingResult?.reason ?? ''),
|
|
471
|
+
rendered_prompt,
|
|
472
|
+
received_prompt,
|
|
473
|
+
stringified_conversation,
|
|
474
|
+
received_context,
|
|
475
|
+
traces,
|
|
476
|
+
errors: String(r.error ?? ''),
|
|
477
|
+
logs
|
|
478
|
+
}
|
|
479
|
+
}
|
|
480
|
+
|
|
364
481
|
function buildTableRows(
|
|
365
482
|
evals: Array<Awaited<ReturnType<typeof promptfoo.evaluate>>>,
|
|
366
483
|
csvRows: CsvRow[],
|
|
@@ -375,15 +492,6 @@ function buildTableRows(
|
|
|
375
492
|
}
|
|
376
493
|
}
|
|
377
494
|
|
|
378
|
-
const toStringSafe = (v: unknown): string => {
|
|
379
|
-
if (typeof v === 'string') return v
|
|
380
|
-
try {
|
|
381
|
-
return JSON.stringify(v)
|
|
382
|
-
} catch {
|
|
383
|
-
return String(v)
|
|
384
|
-
}
|
|
385
|
-
}
|
|
386
|
-
|
|
387
495
|
return csvRows.map((row) => {
|
|
388
496
|
const rowId = row.id
|
|
389
497
|
const evalResults = bucket.get(String(rowId)) ?? []
|
|
@@ -392,52 +500,7 @@ function buildTableRows(
|
|
|
392
500
|
const pct = totalRuns ? Math.round((passCount / totalRuns) * 100) : 0
|
|
393
501
|
const rateStr = `${passCount}/${totalRuns}`
|
|
394
502
|
|
|
395
|
-
const results: ResultEntry[] = evalResults.map((r) =>
|
|
396
|
-
const rawTraces = Array.isArray(r.metadata?.rawStepTraces)
|
|
397
|
-
? r.metadata?.rawStepTraces
|
|
398
|
-
: Array.isArray(r.metadata?.stepTraces)
|
|
399
|
-
? r.metadata?.stepTraces
|
|
400
|
-
: []
|
|
401
|
-
// Pick the last trace whose name === 'main'
|
|
402
|
-
const lastMain = (() => {
|
|
403
|
-
for (let i = rawTraces.length - 1; i >= 0; i--) {
|
|
404
|
-
const t = rawTraces[i]
|
|
405
|
-
if (t && t.name === 'main') return t
|
|
406
|
-
}
|
|
407
|
-
return undefined
|
|
408
|
-
})()
|
|
409
|
-
const rendered_prompt =
|
|
410
|
-
lastMain && typeof lastMain.renderedPrompt !== 'undefined'
|
|
411
|
-
? toStringSafe(lastMain.renderedPrompt)
|
|
412
|
-
: 'NO RENDERED PROMPT'
|
|
413
|
-
const received_prompt =
|
|
414
|
-
lastMain && typeof lastMain.receivedPrompt !== 'undefined'
|
|
415
|
-
? toStringSafe(lastMain.receivedPrompt)
|
|
416
|
-
: 'NO RECEIVED PROMPT'
|
|
417
|
-
const stringified_conversation =
|
|
418
|
-
lastMain && typeof lastMain.stringifiedConversation !== 'undefined'
|
|
419
|
-
? toStringSafe(lastMain.stringifiedConversation)
|
|
420
|
-
: 'NO STRINGIFIED CONVERSATION'
|
|
421
|
-
const received_context =
|
|
422
|
-
lastMain && typeof lastMain.receivedContext !== 'undefined'
|
|
423
|
-
? toStringSafe(lastMain.receivedContext)
|
|
424
|
-
: 'NO RECEIVED CONTEXT'
|
|
425
|
-
|
|
426
|
-
const logs = Array.isArray(r.metadata?.logs) ? (r.metadata?.logs as string[]) : []
|
|
427
|
-
const traces = Array.isArray(r.metadata?.stepTraces) ? r.metadata?.stepTraces : []
|
|
428
|
-
return {
|
|
429
|
-
success: !!r.success,
|
|
430
|
-
result: String(r.response?.output ?? ''),
|
|
431
|
-
evaluation: String(r.gradingResult?.reason ?? ''),
|
|
432
|
-
rendered_prompt,
|
|
433
|
-
received_prompt,
|
|
434
|
-
stringified_conversation,
|
|
435
|
-
received_context,
|
|
436
|
-
traces,
|
|
437
|
-
errors: String(r.error ?? ''),
|
|
438
|
-
logs
|
|
439
|
-
}
|
|
440
|
-
})
|
|
503
|
+
const results: ResultEntry[] = evalResults.map((r) => toResultEntry(r))
|
|
441
504
|
|
|
442
505
|
return {
|
|
443
506
|
...row,
|
|
@@ -449,7 +512,14 @@ function buildTableRows(
|
|
|
449
512
|
})
|
|
450
513
|
}
|
|
451
514
|
|
|
452
|
-
export async function runPromptTests(
|
|
515
|
+
export async function runPromptTests(
|
|
516
|
+
agent: string,
|
|
517
|
+
selection: PromptTestsSelection = { scope: 'pinned' },
|
|
518
|
+
opts?: { signal?: AbortSignal }
|
|
519
|
+
): Promise<WrittenRunReport> {
|
|
520
|
+
const signal = opts?.signal
|
|
521
|
+
const scope = 'scope' in selection ? selection.scope : 'pinned'
|
|
522
|
+
const onlyTestId = 'testId' in selection ? selection.testId : undefined
|
|
453
523
|
const suite = await readSuite(agent)
|
|
454
524
|
const rows = suite.tests as unknown as CsvRow[]
|
|
455
525
|
const cfg = (await tryReadConfig(agent)) || {}
|
|
@@ -462,17 +532,30 @@ export async function runPromptTests(agent: string, scope: 'all' | 'pinned' = 'p
|
|
|
462
532
|
const typedRows = rows as unknown as CsvRow[]
|
|
463
533
|
const indexedRows = typedRows.map((row, index) => ({ ...row, index }))
|
|
464
534
|
|
|
465
|
-
|
|
535
|
+
if (onlyTestId && !indexedRows.some((row) => String(row.id ?? '') === String(onlyTestId))) {
|
|
536
|
+
throw new Error(`Test not found: ${onlyTestId}`)
|
|
537
|
+
}
|
|
538
|
+
|
|
539
|
+
const tests = toTestInputs(indexedRows, baseContext, selection)
|
|
466
540
|
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
541
|
+
// Provider function with stable label
|
|
542
|
+
const providerInstance = new RecombineAgentProvider({
|
|
543
|
+
id: 'recombine-agent'
|
|
544
|
+
})
|
|
545
|
+
providerInstance.setAbortSignal(signal)
|
|
546
|
+
const providerFn = Object.assign(
|
|
547
|
+
(_promptStr: string, ctx?: CallApiContextParams) => {
|
|
548
|
+
if (signal?.aborted) {
|
|
549
|
+
throw new Error('Operation cancelled')
|
|
550
|
+
}
|
|
551
|
+
return providerInstance.callApi(_promptStr, ctx)
|
|
552
|
+
},
|
|
473
553
|
{ label: 'recombine-agent' }
|
|
474
554
|
)
|
|
475
555
|
|
|
556
|
+
const hookKey = `__bosun_promptfoo_hook_${process.pid}_${Date.now()}_${Math.random().toString(16).slice(2)}`
|
|
557
|
+
const extensionCode = `globalThis[${JSON.stringify(hookKey)}]?.(output, context)`
|
|
558
|
+
|
|
476
559
|
const testSuites = tests.map((test) => ({
|
|
477
560
|
prompts: ['agent-run'], // placeholder; provider ignores
|
|
478
561
|
scenario: test.scenario,
|
|
@@ -487,68 +570,223 @@ export async function runPromptTests(agent: string, scope: 'all' | 'pinned' = 'p
|
|
|
487
570
|
conversation: test.conversation,
|
|
488
571
|
timeoutSeconds: (test as any).timeoutSeconds
|
|
489
572
|
}
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
providers: [providerFn]
|
|
573
|
+
}
|
|
574
|
+
],
|
|
575
|
+
providers: [providerFn],
|
|
576
|
+
extensions: [extensionCode]
|
|
493
577
|
}))
|
|
494
578
|
|
|
495
|
-
const results: Array<Awaited<ReturnType<typeof promptfoo.evaluate>>> = []
|
|
496
|
-
for (const suite of testSuites) {
|
|
497
|
-
try {
|
|
498
|
-
console.log(`Running: ${suite.scenario}`)
|
|
499
|
-
const ev = await promptfoo.evaluate(suite, {
|
|
500
|
-
repeat: repeats,
|
|
501
|
-
cache: false,
|
|
502
|
-
maxConcurrency: concurrency
|
|
503
|
-
})
|
|
504
|
-
results.push(ev)
|
|
505
|
-
} catch (err) {
|
|
506
|
-
const msg = err instanceof Error ? `${err.name}: ${err.message}` : String(err)
|
|
507
|
-
results.push({
|
|
508
|
-
results: [
|
|
509
|
-
{
|
|
510
|
-
success: false,
|
|
511
|
-
response: { output: '' },
|
|
512
|
-
error: msg,
|
|
513
|
-
metadata: { testId: (suite.tests?.[0] as any)?.metadata?.testId }
|
|
514
|
-
} as any
|
|
515
|
-
]
|
|
516
|
-
} as any)
|
|
517
|
-
}
|
|
518
|
-
}
|
|
519
|
-
|
|
520
|
-
// Build rows with per-run results, including last-step trace derived fields.
|
|
521
|
-
const rowsToWrite = buildTableRows(results, typedRows, agent)
|
|
522
|
-
|
|
523
579
|
const projectRoot = path.dirname(await getRootPath())
|
|
524
580
|
const outDir = path.join(projectRoot, 'data', 'test_runs')
|
|
525
581
|
await mkdir(outDir, { recursive: true })
|
|
582
|
+
|
|
526
583
|
// Use full ISO timestamp and sanitize ':' for filesystem safety
|
|
527
584
|
const iso = new Date().toISOString()
|
|
528
585
|
const isoFile = iso.replace(/:/g, '-')
|
|
529
586
|
const outPath = path.join(outDir, `${agent}.${isoFile}.report.json`)
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
const
|
|
533
|
-
const
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
587
|
+
|
|
588
|
+
async function writeReport(report: WrittenRunReport) {
|
|
589
|
+
const dir = path.dirname(outPath)
|
|
590
|
+
const base = path.basename(outPath)
|
|
591
|
+
const tmpPath = path.join(
|
|
592
|
+
dir,
|
|
593
|
+
`.${base}.${process.pid}.${Date.now()}.${Math.random().toString(16).slice(2)}.tmp`
|
|
594
|
+
)
|
|
595
|
+
const json = JSON.stringify(report, null, 2)
|
|
596
|
+
await writeFile(tmpPath, json, 'utf8')
|
|
597
|
+
try {
|
|
598
|
+
await rename(tmpPath, outPath)
|
|
599
|
+
} catch (e: any) {
|
|
600
|
+
// Windows doesn't allow atomic rename over an existing file.
|
|
601
|
+
try {
|
|
602
|
+
await unlink(outPath)
|
|
603
|
+
} catch {
|
|
604
|
+
// ignore
|
|
605
|
+
}
|
|
606
|
+
await rename(tmpPath, outPath)
|
|
542
607
|
}
|
|
543
|
-
}
|
|
544
|
-
|
|
608
|
+
}
|
|
609
|
+
|
|
610
|
+
const runConfig: WrittenRunReportConfig = {
|
|
611
|
+
repeats,
|
|
612
|
+
concurrency,
|
|
613
|
+
defaultContext: baseContext
|
|
614
|
+
}
|
|
615
|
+
|
|
616
|
+
const body: WrittenRunReport = {
|
|
545
617
|
agent,
|
|
546
618
|
run_timestamp: iso,
|
|
547
619
|
run_scope: scope,
|
|
548
|
-
run_config:
|
|
549
|
-
rows:
|
|
620
|
+
run_config: runConfig,
|
|
621
|
+
rows: []
|
|
622
|
+
}
|
|
623
|
+
|
|
624
|
+
// Write an empty report immediately so clients can start polling this run.
|
|
625
|
+
await writeReport(body)
|
|
626
|
+
|
|
627
|
+
const byTestId = new Map<string, WrittenRunReportRow>()
|
|
628
|
+
|
|
629
|
+
const originalRowById = new Map<string, CsvRow>()
|
|
630
|
+
for (const r of typedRows) {
|
|
631
|
+
const id = String((r as any)?.id ?? '').trim()
|
|
632
|
+
if (id) originalRowById.set(id, r)
|
|
633
|
+
}
|
|
634
|
+
|
|
635
|
+
const countsByTestId = new Map<string, { pass: number; total: number }>()
|
|
636
|
+
|
|
637
|
+
let writeTimer: ReturnType<typeof setTimeout> | null = null
|
|
638
|
+
let writePending = false
|
|
639
|
+
let writeChain: Promise<void> = Promise.resolve()
|
|
640
|
+
const enqueueWrite = () => {
|
|
641
|
+
writeChain = writeChain
|
|
642
|
+
.catch(() => {})
|
|
643
|
+
.then(() => writeReport(body))
|
|
644
|
+
return writeChain
|
|
550
645
|
}
|
|
551
|
-
|
|
646
|
+
const requestWrite = () => {
|
|
647
|
+
writePending = true
|
|
648
|
+
if (writeTimer) return
|
|
649
|
+
writeTimer = setTimeout(() => {
|
|
650
|
+
writeTimer = null
|
|
651
|
+
if (!writePending) return
|
|
652
|
+
writePending = false
|
|
653
|
+
void enqueueWrite()
|
|
654
|
+
}, 200)
|
|
655
|
+
}
|
|
656
|
+
|
|
657
|
+
;(globalThis as any)[hookKey] = (hookName: string, ctx: any) => {
|
|
658
|
+
try {
|
|
659
|
+
if (hookName !== 'afterEach') return
|
|
660
|
+
if (signal?.aborted) {
|
|
661
|
+
throw new Error('Operation cancelled')
|
|
662
|
+
}
|
|
663
|
+
const testId = String(ctx?.test?.metadata?.testId ?? '')
|
|
664
|
+
if (!testId) return
|
|
665
|
+
const r = ctx?.result
|
|
666
|
+
if (!r) return
|
|
667
|
+
|
|
668
|
+
const originalRow = originalRowById.get(testId)
|
|
669
|
+
if (!originalRow) return
|
|
670
|
+
|
|
671
|
+
let reportRow = byTestId.get(testId)
|
|
672
|
+
if (!reportRow) {
|
|
673
|
+
const pinned: 'TRUE' | 'FALSE' =
|
|
674
|
+
String((originalRow as any).pinned || '').toUpperCase() === 'TRUE' ? 'TRUE' : 'FALSE'
|
|
675
|
+
const nextRow: WrittenRunReportRow = {
|
|
676
|
+
...(originalRow as any),
|
|
677
|
+
prompts: `suite://${agent}?testId=${testId}`,
|
|
678
|
+
success_rate_percent: 0,
|
|
679
|
+
success_rate: '0/0',
|
|
680
|
+
results: [],
|
|
681
|
+
agent,
|
|
682
|
+
test_id: testId,
|
|
683
|
+
run_timestamp: iso,
|
|
684
|
+
run_config: JSON.stringify(runConfig),
|
|
685
|
+
pinned_at_run: scope === 'all' || !!onlyTestId ? 'TRUE' : pinned,
|
|
686
|
+
run_scope: scope
|
|
687
|
+
}
|
|
688
|
+
reportRow = nextRow
|
|
689
|
+
byTestId.set(testId, nextRow)
|
|
690
|
+
body.rows = Array.from(byTestId.values())
|
|
691
|
+
}
|
|
692
|
+
if (!reportRow) return
|
|
693
|
+
|
|
694
|
+
const entry = toResultEntry(r)
|
|
695
|
+
reportRow.results.push(entry)
|
|
696
|
+
|
|
697
|
+
const counts = countsByTestId.get(testId) ?? { pass: 0, total: 0 }
|
|
698
|
+
counts.total += 1
|
|
699
|
+
if (entry.success) counts.pass += 1
|
|
700
|
+
countsByTestId.set(testId, counts)
|
|
701
|
+
|
|
702
|
+
reportRow.success_rate = `${counts.pass}/${counts.total}`
|
|
703
|
+
reportRow.success_rate_percent = counts.total ? Math.round((counts.pass / counts.total) * 100) : 0
|
|
704
|
+
|
|
705
|
+
requestWrite()
|
|
706
|
+
} catch (err) {
|
|
707
|
+
if (signal?.aborted) throw err
|
|
708
|
+
// ignore
|
|
709
|
+
}
|
|
710
|
+
}
|
|
711
|
+
|
|
712
|
+
try {
|
|
713
|
+
for (const suite of testSuites) {
|
|
714
|
+
if (signal?.aborted) break
|
|
715
|
+
const testId = String((suite.tests?.[0] as any)?.metadata?.testId ?? '')
|
|
716
|
+
const originalRow = testId ? typedRows.find((r) => String(r.id) === testId) : undefined
|
|
717
|
+
try {
|
|
718
|
+
console.log(`Running: ${suite.scenario}`)
|
|
719
|
+
const ev = await promptfoo.evaluate(suite, {
|
|
720
|
+
repeat: repeats,
|
|
721
|
+
cache: false,
|
|
722
|
+
maxConcurrency: concurrency,
|
|
723
|
+
abortSignal: signal
|
|
724
|
+
})
|
|
725
|
+
|
|
726
|
+
if (originalRow && testId) {
|
|
727
|
+
const rowToWrite = buildTableRows([ev], [originalRow], agent)[0]
|
|
728
|
+
const pinned: 'TRUE' | 'FALSE' =
|
|
729
|
+
(rowToWrite.pinned || '').toUpperCase() === 'TRUE' ? 'TRUE' : 'FALSE'
|
|
730
|
+
byTestId.set(testId, {
|
|
731
|
+
...rowToWrite,
|
|
732
|
+
agent,
|
|
733
|
+
test_id: testId,
|
|
734
|
+
run_timestamp: iso,
|
|
735
|
+
run_config: JSON.stringify(runConfig),
|
|
736
|
+
pinned_at_run: scope === 'all' || !!onlyTestId ? 'TRUE' : pinned,
|
|
737
|
+
run_scope: scope
|
|
738
|
+
})
|
|
739
|
+
body.rows = Array.from(byTestId.values())
|
|
740
|
+
await enqueueWrite()
|
|
741
|
+
}
|
|
742
|
+
} catch (err) {
|
|
743
|
+
const cancelled =
|
|
744
|
+
!!signal?.aborted ||
|
|
745
|
+
(err instanceof Error && /operation cancelled/i.test(err.message || ''))
|
|
746
|
+
if (cancelled) {
|
|
747
|
+
break
|
|
748
|
+
}
|
|
749
|
+
const msg = err instanceof Error ? `${err.name}: ${err.message}` : String(err)
|
|
750
|
+
const ev = {
|
|
751
|
+
results: [
|
|
752
|
+
{
|
|
753
|
+
success: false,
|
|
754
|
+
response: { output: '' },
|
|
755
|
+
error: msg,
|
|
756
|
+
metadata: { testId: (suite.tests?.[0] as any)?.metadata?.testId }
|
|
757
|
+
} as any
|
|
758
|
+
]
|
|
759
|
+
} as any
|
|
760
|
+
|
|
761
|
+
// Persist failure row immediately for real-time UI updates.
|
|
762
|
+
if (originalRow && testId) {
|
|
763
|
+
const rowToWrite = buildTableRows([ev], [originalRow], agent)[0]
|
|
764
|
+
const pinned: 'TRUE' | 'FALSE' =
|
|
765
|
+
(rowToWrite.pinned || '').toUpperCase() === 'TRUE' ? 'TRUE' : 'FALSE'
|
|
766
|
+
byTestId.set(testId, {
|
|
767
|
+
...rowToWrite,
|
|
768
|
+
agent,
|
|
769
|
+
test_id: testId,
|
|
770
|
+
run_timestamp: iso,
|
|
771
|
+
run_config: JSON.stringify(runConfig),
|
|
772
|
+
pinned_at_run: scope === 'all' || !!onlyTestId ? 'TRUE' : pinned,
|
|
773
|
+
run_scope: scope
|
|
774
|
+
})
|
|
775
|
+
body.rows = Array.from(byTestId.values())
|
|
776
|
+
await enqueueWrite()
|
|
777
|
+
}
|
|
778
|
+
}
|
|
779
|
+
}
|
|
780
|
+
} finally {
|
|
781
|
+
if (writeTimer) clearTimeout(writeTimer)
|
|
782
|
+
writeTimer = null
|
|
783
|
+
delete (globalThis as any)[hookKey]
|
|
784
|
+
await writeChain
|
|
785
|
+
}
|
|
786
|
+
|
|
787
|
+
// Ensure the final report is written even if no tests ran (or an update was skipped).
|
|
788
|
+
body.rows = Array.from(byTestId.values())
|
|
789
|
+
await enqueueWrite()
|
|
552
790
|
|
|
553
791
|
return body
|
|
554
792
|
}
|