@recombine-ai/bosun 0.13.0 → 0.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (224) hide show
  1. package/bin/bosun.js +7 -0
  2. package/build/client/_app/immutable/assets/0.b0jhAoSC.css +1 -0
  3. package/build/client/_app/immutable/assets/0.b0jhAoSC.css.br +0 -0
  4. package/build/client/_app/immutable/assets/0.b0jhAoSC.css.gz +0 -0
  5. package/build/client/_app/immutable/chunks/BTX1tKMW.js +1 -0
  6. package/build/client/_app/immutable/chunks/BTX1tKMW.js.br +0 -0
  7. package/build/client/_app/immutable/chunks/BTX1tKMW.js.gz +0 -0
  8. package/build/client/_app/immutable/chunks/BVxLHCs8.js +1 -0
  9. package/build/client/_app/immutable/chunks/BVxLHCs8.js.br +0 -0
  10. package/build/client/_app/immutable/chunks/BVxLHCs8.js.gz +0 -0
  11. package/build/client/_app/immutable/chunks/{De8YgKS3.js → ChVBNPUb.js} +1 -1
  12. package/build/client/_app/immutable/chunks/ChVBNPUb.js.br +0 -0
  13. package/build/client/_app/immutable/chunks/ChVBNPUb.js.gz +0 -0
  14. package/build/client/_app/immutable/chunks/E9rdsnHb.js +1 -0
  15. package/build/client/_app/immutable/chunks/E9rdsnHb.js.br +0 -0
  16. package/build/client/_app/immutable/chunks/E9rdsnHb.js.gz +0 -0
  17. package/build/client/_app/immutable/chunks/Z1_c4us_.js +3 -0
  18. package/build/client/_app/immutable/chunks/Z1_c4us_.js.br +0 -0
  19. package/build/client/_app/immutable/chunks/Z1_c4us_.js.gz +0 -0
  20. package/build/client/_app/immutable/chunks/{Bj8jfBTi.js → lmnC3bvv.js} +1 -1
  21. package/build/client/_app/immutable/chunks/lmnC3bvv.js.br +0 -0
  22. package/build/client/_app/immutable/chunks/lmnC3bvv.js.gz +0 -0
  23. package/build/client/_app/immutable/entry/{app.DK_wVDeR.js → app.BY5DP2K_.js} +2 -2
  24. package/build/client/_app/immutable/entry/app.BY5DP2K_.js.br +0 -0
  25. package/build/client/_app/immutable/entry/app.BY5DP2K_.js.gz +0 -0
  26. package/build/client/_app/immutable/entry/start.BeIIwvvV.js +1 -0
  27. package/build/client/_app/immutable/entry/start.BeIIwvvV.js.br +0 -0
  28. package/build/client/_app/immutable/entry/start.BeIIwvvV.js.gz +0 -0
  29. package/build/client/_app/immutable/nodes/{0.5fEbn14Q.js → 0.Cao0LJwW.js} +1 -1
  30. package/build/client/_app/immutable/nodes/0.Cao0LJwW.js.br +0 -0
  31. package/build/client/_app/immutable/nodes/0.Cao0LJwW.js.gz +0 -0
  32. package/build/client/_app/immutable/nodes/{1.CJrSN8zL.js → 1.Kjgu6yxL.js} +1 -1
  33. package/build/client/_app/immutable/nodes/1.Kjgu6yxL.js.br +0 -0
  34. package/build/client/_app/immutable/nodes/1.Kjgu6yxL.js.gz +0 -0
  35. package/build/client/_app/immutable/nodes/{10.SZwTlOEA.js → 10.yW2mHq85.js} +1 -1
  36. package/build/client/_app/immutable/nodes/10.yW2mHq85.js.br +0 -0
  37. package/build/client/_app/immutable/nodes/10.yW2mHq85.js.gz +0 -0
  38. package/build/client/_app/immutable/nodes/{17.D-KFl7Vk.js → 17.COHkD98p.js} +3 -3
  39. package/build/client/_app/immutable/nodes/17.COHkD98p.js.br +0 -0
  40. package/build/client/_app/immutable/nodes/17.COHkD98p.js.gz +0 -0
  41. package/build/client/_app/immutable/nodes/18.DQVit7Md.js +11 -0
  42. package/build/client/_app/immutable/nodes/18.DQVit7Md.js.br +0 -0
  43. package/build/client/_app/immutable/nodes/18.DQVit7Md.js.gz +0 -0
  44. package/build/client/_app/immutable/nodes/2.DVwYttKv.js +35 -0
  45. package/build/client/_app/immutable/nodes/2.DVwYttKv.js.br +0 -0
  46. package/build/client/_app/immutable/nodes/2.DVwYttKv.js.gz +0 -0
  47. package/build/client/_app/immutable/nodes/{3.B1RGTOJ8.js → 3.BhmyTb3R.js} +1 -1
  48. package/build/client/_app/immutable/nodes/3.BhmyTb3R.js.br +0 -0
  49. package/build/client/_app/immutable/nodes/3.BhmyTb3R.js.gz +0 -0
  50. package/build/client/_app/immutable/nodes/{4.D2jcIUpD.js → 4.CxATX0ci.js} +1 -1
  51. package/build/client/_app/immutable/nodes/4.CxATX0ci.js.br +0 -0
  52. package/build/client/_app/immutable/nodes/4.CxATX0ci.js.gz +0 -0
  53. package/build/client/_app/immutable/nodes/{5.CUyCIyRd.js → 5.Dal1qxB1.js} +1 -1
  54. package/build/client/_app/immutable/nodes/5.Dal1qxB1.js.br +0 -0
  55. package/build/client/_app/immutable/nodes/5.Dal1qxB1.js.gz +0 -0
  56. package/build/client/_app/immutable/nodes/{6.B8HsGA2V.js → 6.iAOxBhJw.js} +1 -1
  57. package/build/client/_app/immutable/nodes/6.iAOxBhJw.js.br +0 -0
  58. package/build/client/_app/immutable/nodes/6.iAOxBhJw.js.gz +0 -0
  59. package/build/client/_app/immutable/nodes/{8.jY56-_OU.js → 8.DFhKu3dp.js} +1 -1
  60. package/build/client/_app/immutable/nodes/8.DFhKu3dp.js.br +0 -0
  61. package/build/client/_app/immutable/nodes/8.DFhKu3dp.js.gz +0 -0
  62. package/build/client/_app/immutable/nodes/9.DRIEv5m9.js +2 -0
  63. package/build/client/_app/immutable/nodes/9.DRIEv5m9.js.br +0 -0
  64. package/build/client/_app/immutable/nodes/9.DRIEv5m9.js.gz +0 -0
  65. package/build/client/_app/version.json +1 -1
  66. package/build/client/_app/version.json.br +0 -0
  67. package/build/client/_app/version.json.gz +0 -0
  68. package/build/server/chunks/{0-4QCErf9j.js → 0-CIzAMtA3.js} +3 -3
  69. package/build/server/chunks/{0-4QCErf9j.js.map → 0-CIzAMtA3.js.map} +1 -1
  70. package/build/server/chunks/{1-Dsjy8Hzc.js → 1-D1heuNbf.js} +2 -2
  71. package/build/server/chunks/{1-Dsjy8Hzc.js.map → 1-D1heuNbf.js.map} +1 -1
  72. package/build/server/chunks/{10-8061c8ui.js → 10-CjLtjXyZ.js} +2 -2
  73. package/build/server/chunks/{10-8061c8ui.js.map → 10-CjLtjXyZ.js.map} +1 -1
  74. package/build/server/chunks/{17-3_5wsIEX.js → 17-DklEmmOx.js} +4 -4
  75. package/build/server/chunks/{17-3_5wsIEX.js.map → 17-DklEmmOx.js.map} +1 -1
  76. package/build/server/chunks/{18-D73Mw140.js → 18-BJS-eRcz.js} +4 -4
  77. package/build/server/chunks/18-BJS-eRcz.js.map +1 -0
  78. package/build/server/chunks/{2-DM0VjzFi.js → 2-DCrAVYXs.js} +4 -4
  79. package/build/server/chunks/2-DCrAVYXs.js.map +1 -0
  80. package/build/server/chunks/{3-B3zlFGkL.js → 3-BpTqa4DU.js} +2 -2
  81. package/build/server/chunks/{3-B3zlFGkL.js.map → 3-BpTqa4DU.js.map} +1 -1
  82. package/build/server/chunks/{4-tESdMZpI.js → 4-B7GjwQzI.js} +2 -2
  83. package/build/server/chunks/{4-tESdMZpI.js.map → 4-B7GjwQzI.js.map} +1 -1
  84. package/build/server/chunks/{5-BJMTlq4U.js → 5-XjS__bcp.js} +2 -2
  85. package/build/server/chunks/{5-BJMTlq4U.js.map → 5-XjS__bcp.js.map} +1 -1
  86. package/build/server/chunks/{6-CDK2Aia6.js → 6-DWkWptmB.js} +2 -2
  87. package/build/server/chunks/{6-CDK2Aia6.js.map → 6-DWkWptmB.js.map} +1 -1
  88. package/build/server/chunks/{8-BJbDytoU.js → 8-_swAx6gL.js} +2 -2
  89. package/build/server/chunks/{8-BJbDytoU.js.map → 8-_swAx6gL.js.map} +1 -1
  90. package/build/server/chunks/{9-BNfIeSqk.js → 9-NEe24O4u.js} +4 -4
  91. package/build/server/chunks/9-NEe24O4u.js.map +1 -0
  92. package/build/server/chunks/{ChatStepTrace-DQL3qlna.js → ChatStepTrace-CX2Zolmp.js} +21 -8
  93. package/build/server/chunks/ChatStepTrace-CX2Zolmp.js.map +1 -0
  94. package/build/server/chunks/{_layout.svelte-DK7yl8vI.js → _layout.svelte-PtdpfgwJ.js} +66 -4
  95. package/build/server/chunks/_layout.svelte-PtdpfgwJ.js.map +1 -0
  96. package/build/server/chunks/{_page.svelte-ZWNBigwS.js → _page.svelte-C3gizoSD.js} +7 -4
  97. package/build/server/chunks/_page.svelte-C3gizoSD.js.map +1 -0
  98. package/build/server/chunks/{_page.svelte-D6bSXGHX.js → _page.svelte-CoCBnE2l.js} +8 -5
  99. package/build/server/chunks/_page.svelte-CoCBnE2l.js.map +1 -0
  100. package/build/server/chunks/{_page.svelte-ej3vdYeF.js → _page.svelte-DZvcjON6.js} +3 -2
  101. package/build/server/chunks/_page.svelte-DZvcjON6.js.map +1 -0
  102. package/build/server/chunks/steps-DzZCg39h.js +8 -0
  103. package/build/server/chunks/steps-DzZCg39h.js.map +1 -0
  104. package/build/server/index.js +1 -1
  105. package/build/server/index.js.map +1 -1
  106. package/build/server/manifest.js +13 -13
  107. package/build/server/manifest.js.map +1 -1
  108. package/package.json +4 -4
  109. package/src/backend/lib/backend-restart.ts +15 -0
  110. package/src/backend/roleplay/router.ts +42 -5
  111. package/src/backend/roleplay/schema-file.spec.ts +38 -0
  112. package/src/backend/roleplay/schema-file.ts +33 -0
  113. package/src/backend/tests/academy.ts +4 -2
  114. package/src/backend/tests/analyze.ts +2 -1
  115. package/src/backend/tests/emulate-agents.ts +13 -21
  116. package/src/backend/tests/pii-sanitized-test-drafts.spec.ts +162 -0
  117. package/src/backend/tests/pii-sanitized-test-drafts.ts +106 -0
  118. package/src/backend/tests/pii-sanitizer.spec.ts +145 -0
  119. package/src/backend/tests/pii-sanitizer.ts +171 -0
  120. package/src/backend/tests/router.ts +37 -0
  121. package/src/lib/agent-catalog.ts +4 -0
  122. package/src/lib/agents-context.ts +8 -0
  123. package/src/lib/api-telescope/client.ts +174 -0
  124. package/src/lib/api-telescope/index.ts +4 -0
  125. package/src/lib/api-telescope/latency-timeline-view-state.spec.ts +25 -0
  126. package/src/lib/api-telescope/latency-timeline-view-state.ts +86 -0
  127. package/src/lib/api-telescope/latency.ts +252 -0
  128. package/src/lib/api-telescope/source-selection.ts +20 -0
  129. package/src/lib/api-telescope/sources.server.ts +94 -0
  130. package/src/lib/api-telescope/types.ts +143 -0
  131. package/src/lib/components/Button.svelte +62 -0
  132. package/src/lib/components/CollapseExpand.svelte +425 -0
  133. package/src/lib/components/CopyTracesDropdown.svelte +118 -0
  134. package/src/lib/components/Dialog.svelte +69 -0
  135. package/src/lib/components/Dropdown.svelte +111 -0
  136. package/src/lib/components/History.svelte +174 -0
  137. package/src/lib/components/Icon.svelte +94 -0
  138. package/src/lib/components/Input.svelte +43 -0
  139. package/src/lib/components/Link.svelte +45 -0
  140. package/src/lib/components/Modal.svelte +45 -0
  141. package/src/lib/components/Panel.svelte +12 -0
  142. package/src/lib/components/PopoverModal.svelte +34 -0
  143. package/src/lib/components/Popper.svelte +109 -0
  144. package/src/lib/components/Tab.svelte +91 -0
  145. package/src/lib/components/Tabs.svelte +140 -0
  146. package/src/lib/components/agent-colors.ts +70 -0
  147. package/src/lib/dom/text-selection.ts +97 -0
  148. package/src/lib/edit/edit-vm.spec.ts +115 -0
  149. package/src/lib/edit/edit-vm.ts +169 -0
  150. package/src/lib/edit/edit-workspace-context.ts +56 -0
  151. package/src/lib/edit/highlight-styles.spec.ts +14 -0
  152. package/src/lib/edit/prompt-highlighter.spec.ts +80 -0
  153. package/src/lib/edit/prompt-highlighter.ts +155 -0
  154. package/src/lib/edit/quote-matching.ts +97 -0
  155. package/src/lib/monaco/bosun-theme.ts +125 -0
  156. package/src/lib/monaco/font.ts +2 -0
  157. package/src/lib/monaco-workers.ts +28 -0
  158. package/src/lib/steps.ts +19 -0
  159. package/src/lib/tests/pii-sanitized-test-draft.ts +50 -0
  160. package/src/lib/trpc-client.ts +16 -0
  161. package/src/lib/ws-client.ts +144 -0
  162. package/src/lib/ws-message.ts +150 -0
  163. package/build/client/_app/immutable/assets/0.B-Br6U4N.css +0 -1
  164. package/build/client/_app/immutable/assets/0.B-Br6U4N.css.br +0 -0
  165. package/build/client/_app/immutable/assets/0.B-Br6U4N.css.gz +0 -0
  166. package/build/client/_app/immutable/chunks/BOuo-4gP.js +0 -1
  167. package/build/client/_app/immutable/chunks/BOuo-4gP.js.br +0 -0
  168. package/build/client/_app/immutable/chunks/BOuo-4gP.js.gz +0 -0
  169. package/build/client/_app/immutable/chunks/Bj8jfBTi.js.br +0 -0
  170. package/build/client/_app/immutable/chunks/Bj8jfBTi.js.gz +0 -0
  171. package/build/client/_app/immutable/chunks/CX0Ekq8t.js +0 -1
  172. package/build/client/_app/immutable/chunks/CX0Ekq8t.js.br +0 -0
  173. package/build/client/_app/immutable/chunks/CX0Ekq8t.js.gz +0 -0
  174. package/build/client/_app/immutable/chunks/Cyj62X2W.js +0 -2
  175. package/build/client/_app/immutable/chunks/Cyj62X2W.js.br +0 -0
  176. package/build/client/_app/immutable/chunks/Cyj62X2W.js.gz +0 -0
  177. package/build/client/_app/immutable/chunks/DSDSeO7L.js +0 -1
  178. package/build/client/_app/immutable/chunks/DSDSeO7L.js.br +0 -0
  179. package/build/client/_app/immutable/chunks/DSDSeO7L.js.gz +0 -0
  180. package/build/client/_app/immutable/chunks/De8YgKS3.js.br +0 -1
  181. package/build/client/_app/immutable/chunks/De8YgKS3.js.gz +0 -0
  182. package/build/client/_app/immutable/entry/app.DK_wVDeR.js.br +0 -0
  183. package/build/client/_app/immutable/entry/app.DK_wVDeR.js.gz +0 -0
  184. package/build/client/_app/immutable/entry/start.xQy-2aGo.js +0 -1
  185. package/build/client/_app/immutable/entry/start.xQy-2aGo.js.br +0 -2
  186. package/build/client/_app/immutable/entry/start.xQy-2aGo.js.gz +0 -0
  187. package/build/client/_app/immutable/nodes/0.5fEbn14Q.js.br +0 -0
  188. package/build/client/_app/immutable/nodes/0.5fEbn14Q.js.gz +0 -0
  189. package/build/client/_app/immutable/nodes/1.CJrSN8zL.js.br +0 -0
  190. package/build/client/_app/immutable/nodes/1.CJrSN8zL.js.gz +0 -0
  191. package/build/client/_app/immutable/nodes/10.SZwTlOEA.js.br +0 -0
  192. package/build/client/_app/immutable/nodes/10.SZwTlOEA.js.gz +0 -0
  193. package/build/client/_app/immutable/nodes/17.D-KFl7Vk.js.br +0 -0
  194. package/build/client/_app/immutable/nodes/17.D-KFl7Vk.js.gz +0 -0
  195. package/build/client/_app/immutable/nodes/18.DqRdJY9A.js +0 -11
  196. package/build/client/_app/immutable/nodes/18.DqRdJY9A.js.br +0 -0
  197. package/build/client/_app/immutable/nodes/18.DqRdJY9A.js.gz +0 -0
  198. package/build/client/_app/immutable/nodes/2.B3Uuk25v.js +0 -35
  199. package/build/client/_app/immutable/nodes/2.B3Uuk25v.js.br +0 -0
  200. package/build/client/_app/immutable/nodes/2.B3Uuk25v.js.gz +0 -0
  201. package/build/client/_app/immutable/nodes/3.B1RGTOJ8.js.br +0 -0
  202. package/build/client/_app/immutable/nodes/3.B1RGTOJ8.js.gz +0 -0
  203. package/build/client/_app/immutable/nodes/4.D2jcIUpD.js.br +0 -0
  204. package/build/client/_app/immutable/nodes/4.D2jcIUpD.js.gz +0 -0
  205. package/build/client/_app/immutable/nodes/5.CUyCIyRd.js.br +0 -0
  206. package/build/client/_app/immutable/nodes/5.CUyCIyRd.js.gz +0 -0
  207. package/build/client/_app/immutable/nodes/6.B8HsGA2V.js.br +0 -0
  208. package/build/client/_app/immutable/nodes/6.B8HsGA2V.js.gz +0 -0
  209. package/build/client/_app/immutable/nodes/8.jY56-_OU.js.br +0 -0
  210. package/build/client/_app/immutable/nodes/8.jY56-_OU.js.gz +0 -0
  211. package/build/client/_app/immutable/nodes/9.v5dX6L9n.js +0 -2
  212. package/build/client/_app/immutable/nodes/9.v5dX6L9n.js.br +0 -0
  213. package/build/client/_app/immutable/nodes/9.v5dX6L9n.js.gz +0 -0
  214. package/build/server/chunks/18-D73Mw140.js.map +0 -1
  215. package/build/server/chunks/2-DM0VjzFi.js.map +0 -1
  216. package/build/server/chunks/9-BNfIeSqk.js.map +0 -1
  217. package/build/server/chunks/ChatStepTrace-DQL3qlna.js.map +0 -1
  218. package/build/server/chunks/_layout.svelte-DK7yl8vI.js.map +0 -1
  219. package/build/server/chunks/_page.svelte-D6bSXGHX.js.map +0 -1
  220. package/build/server/chunks/_page.svelte-ZWNBigwS.js.map +0 -1
  221. package/build/server/chunks/_page.svelte-ej3vdYeF.js.map +0 -1
  222. /package/build/client/_app/immutable/assets/{Popper.CLTyHc88.css → steps.CLTyHc88.css} +0 -0
  223. /package/build/client/_app/immutable/assets/{Popper.CLTyHc88.css.br → steps.CLTyHc88.css.br} +0 -0
  224. /package/build/client/_app/immutable/assets/{Popper.CLTyHc88.css.gz → steps.CLTyHc88.css.gz} +0 -0
@@ -10,27 +10,27 @@ return {
10
10
  assets: new Set(["favicon.png","fonts/DarkerGrotesque-Black.ttf","fonts/DarkerGrotesque-Bold.ttf","fonts/DarkerGrotesque-Light.ttf","fonts/DarkerGrotesque-Medium.ttf","fonts/DarkerGrotesque-Regular.ttf","fonts/DarkerGrotesque-SemiBold.ttf","fonts.css","recombine.svg","telescope-icon.svg","ui/arrow_tests.svg","ui/paperclip.svg","ui/send.svg"]),
11
11
  mimeTypes: {".png":"image/png",".ttf":"font/ttf",".css":"text/css",".svg":"image/svg+xml"},
12
12
  _: {
13
- client: {start:"_app/immutable/entry/start.xQy-2aGo.js",app:"_app/immutable/entry/app.DK_wVDeR.js",imports:["_app/immutable/entry/start.xQy-2aGo.js","_app/immutable/chunks/DSDSeO7L.js","_app/immutable/chunks/CxLomzuE.js","_app/immutable/chunks/uLGP0py1.js","_app/immutable/chunks/OA8UcISh.js","_app/immutable/chunks/C39ai1md.js","_app/immutable/entry/app.DK_wVDeR.js","_app/immutable/chunks/C1FmrZbK.js","_app/immutable/chunks/CxLomzuE.js","_app/immutable/chunks/DJriQKD9.js","_app/immutable/chunks/Ca197UDq.js","_app/immutable/chunks/xC2C8d09.js","_app/immutable/chunks/C39ai1md.js","_app/immutable/chunks/Buo-57fF.js","_app/immutable/chunks/CJYOmGlC.js","_app/immutable/chunks/Cyai3SOj.js","_app/immutable/chunks/BLu86SbA.js","_app/immutable/chunks/CPXdAKdv.js","_app/immutable/chunks/uLGP0py1.js"],stylesheets:[],fonts:[],uses_env_dynamic_public:true},
13
+ client: {start:"_app/immutable/entry/start.BeIIwvvV.js",app:"_app/immutable/entry/app.BY5DP2K_.js",imports:["_app/immutable/entry/start.BeIIwvvV.js","_app/immutable/chunks/BVxLHCs8.js","_app/immutable/chunks/CxLomzuE.js","_app/immutable/chunks/uLGP0py1.js","_app/immutable/chunks/OA8UcISh.js","_app/immutable/chunks/C39ai1md.js","_app/immutable/entry/app.BY5DP2K_.js","_app/immutable/chunks/C1FmrZbK.js","_app/immutable/chunks/CxLomzuE.js","_app/immutable/chunks/DJriQKD9.js","_app/immutable/chunks/Ca197UDq.js","_app/immutable/chunks/xC2C8d09.js","_app/immutable/chunks/C39ai1md.js","_app/immutable/chunks/Buo-57fF.js","_app/immutable/chunks/CJYOmGlC.js","_app/immutable/chunks/Cyai3SOj.js","_app/immutable/chunks/BLu86SbA.js","_app/immutable/chunks/CPXdAKdv.js","_app/immutable/chunks/uLGP0py1.js"],stylesheets:[],fonts:[],uses_env_dynamic_public:true},
14
14
  nodes: [
15
- __memo(() => import('./chunks/0-4QCErf9j.js')),
16
- __memo(() => import('./chunks/1-Dsjy8Hzc.js')),
17
- __memo(() => import('./chunks/2-DM0VjzFi.js')),
18
- __memo(() => import('./chunks/3-B3zlFGkL.js')),
19
- __memo(() => import('./chunks/4-tESdMZpI.js')),
20
- __memo(() => import('./chunks/5-BJMTlq4U.js')),
21
- __memo(() => import('./chunks/6-CDK2Aia6.js')),
15
+ __memo(() => import('./chunks/0-CIzAMtA3.js')),
16
+ __memo(() => import('./chunks/1-D1heuNbf.js')),
17
+ __memo(() => import('./chunks/2-DCrAVYXs.js')),
18
+ __memo(() => import('./chunks/3-BpTqa4DU.js')),
19
+ __memo(() => import('./chunks/4-B7GjwQzI.js')),
20
+ __memo(() => import('./chunks/5-XjS__bcp.js')),
21
+ __memo(() => import('./chunks/6-DWkWptmB.js')),
22
22
  __memo(() => import('./chunks/7-olXOjo4r.js')),
23
- __memo(() => import('./chunks/8-BJbDytoU.js')),
24
- __memo(() => import('./chunks/9-BNfIeSqk.js')),
25
- __memo(() => import('./chunks/10-8061c8ui.js')),
23
+ __memo(() => import('./chunks/8-_swAx6gL.js')),
24
+ __memo(() => import('./chunks/9-NEe24O4u.js')),
25
+ __memo(() => import('./chunks/10-CjLtjXyZ.js')),
26
26
  __memo(() => import('./chunks/11-CB5q84io.js')),
27
27
  __memo(() => import('./chunks/12-CfqC_Y1R.js')),
28
28
  __memo(() => import('./chunks/13-ByddfU7G.js')),
29
29
  __memo(() => import('./chunks/14-Dk7DCwHC.js')),
30
30
  __memo(() => import('./chunks/15-BRw8wtLp.js')),
31
31
  __memo(() => import('./chunks/16-Y9KLA9UF.js')),
32
- __memo(() => import('./chunks/17-3_5wsIEX.js')),
33
- __memo(() => import('./chunks/18-D73Mw140.js'))
32
+ __memo(() => import('./chunks/17-DklEmmOx.js')),
33
+ __memo(() => import('./chunks/18-BJS-eRcz.js'))
34
34
  ],
35
35
  remotes: {
36
36
 
@@ -1 +1 @@
1
- {"version":3,"file":"manifest.js","sources":["../../.svelte-kit/adapter-node/manifest.js"],"sourcesContent":["export const manifest = (() => {\nfunction __memo(fn) {\n\tlet value;\n\treturn () => value ??= (value = fn());\n}\n\nreturn {\n\tappDir: \"_app\",\n\tappPath: \"_app\",\n\tassets: new Set([\"favicon.png\",\"fonts/DarkerGrotesque-Black.ttf\",\"fonts/DarkerGrotesque-Bold.ttf\",\"fonts/DarkerGrotesque-Light.ttf\",\"fonts/DarkerGrotesque-Medium.ttf\",\"fonts/DarkerGrotesque-Regular.ttf\",\"fonts/DarkerGrotesque-SemiBold.ttf\",\"fonts.css\",\"recombine.svg\",\"telescope-icon.svg\",\"ui/arrow_tests.svg\",\"ui/paperclip.svg\",\"ui/send.svg\"]),\n\tmimeTypes: {\".png\":\"image/png\",\".ttf\":\"font/ttf\",\".css\":\"text/css\",\".svg\":\"image/svg+xml\"},\n\t_: {\n\t\tclient: {start:\"_app/immutable/entry/start.xQy-2aGo.js\",app:\"_app/immutable/entry/app.DK_wVDeR.js\",imports:[\"_app/immutable/entry/start.xQy-2aGo.js\",\"_app/immutable/chunks/DSDSeO7L.js\",\"_app/immutable/chunks/CxLomzuE.js\",\"_app/immutable/chunks/uLGP0py1.js\",\"_app/immutable/chunks/OA8UcISh.js\",\"_app/immutable/chunks/C39ai1md.js\",\"_app/immutable/entry/app.DK_wVDeR.js\",\"_app/immutable/chunks/C1FmrZbK.js\",\"_app/immutable/chunks/CxLomzuE.js\",\"_app/immutable/chunks/DJriQKD9.js\",\"_app/immutable/chunks/Ca197UDq.js\",\"_app/immutable/chunks/xC2C8d09.js\",\"_app/immutable/chunks/C39ai1md.js\",\"_app/immutable/chunks/Buo-57fF.js\",\"_app/immutable/chunks/CJYOmGlC.js\",\"_app/immutable/chunks/Cyai3SOj.js\",\"_app/immutable/chunks/BLu86SbA.js\",\"_app/immutable/chunks/CPXdAKdv.js\",\"_app/immutable/chunks/uLGP0py1.js\"],stylesheets:[],fonts:[],uses_env_dynamic_public:true},\n\t\tnodes: [\n\t\t\t__memo(() => import('./nodes/0.js')),\n\t\t\t__memo(() => import('./nodes/1.js')),\n\t\t\t__memo(() => import('./nodes/2.js')),\n\t\t\t__memo(() => import('./nodes/3.js')),\n\t\t\t__memo(() => import('./nodes/4.js')),\n\t\t\t__memo(() => import('./nodes/5.js')),\n\t\t\t__memo(() => import('./nodes/6.js')),\n\t\t\t__memo(() => import('./nodes/7.js')),\n\t\t\t__memo(() => import('./nodes/8.js')),\n\t\t\t__memo(() => import('./nodes/9.js')),\n\t\t\t__memo(() => import('./nodes/10.js')),\n\t\t\t__memo(() => import('./nodes/11.js')),\n\t\t\t__memo(() => import('./nodes/12.js')),\n\t\t\t__memo(() => import('./nodes/13.js')),\n\t\t\t__memo(() => import('./nodes/14.js')),\n\t\t\t__memo(() => import('./nodes/15.js')),\n\t\t\t__memo(() => import('./nodes/16.js')),\n\t\t\t__memo(() => import('./nodes/17.js')),\n\t\t\t__memo(() => import('./nodes/18.js'))\n\t\t],\n\t\tremotes: {\n\t\t\t\n\t\t},\n\t\troutes: [\n\t\t\t{\n\t\t\t\tid: \"/\",\n\t\t\t\tpattern: /^\\/$/,\n\t\t\t\tparams: [],\n\t\t\t\tpage: { layouts: [0,], errors: [1,], leaf: 5 },\n\t\t\t\tendpoint: null\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"/edit\",\n\t\t\t\tpattern: /^\\/edit\\/?$/,\n\t\t\t\tparams: [],\n\t\t\t\tpage: { layouts: [0,], errors: [1,], leaf: 6 },\n\t\t\t\tendpoint: null\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"/edit/[agent]\",\n\t\t\t\tpattern: /^\\/edit\\/([^/]+?)\\/?$/,\n\t\t\t\tparams: [{\"name\":\"agent\",\"optional\":false,\"rest\":false,\"chained\":false}],\n\t\t\t\tpage: { layouts: [0,2,], errors: [1,,], leaf: 7 },\n\t\t\t\tendpoint: null\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"/edit/[agent]/configure\",\n\t\t\t\tpattern: /^\\/edit\\/([^/]+?)\\/configure\\/?$/,\n\t\t\t\tparams: [{\"name\":\"agent\",\"optional\":false,\"rest\":false,\"chained\":false}],\n\t\t\t\tpage: { layouts: [0,2,], errors: [1,,], leaf: 8 },\n\t\t\t\tendpoint: null\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"/edit/[agent]/roleplay\",\n\t\t\t\tpattern: /^\\/edit\\/([^/]+?)\\/roleplay\\/?$/,\n\t\t\t\tparams: [{\"name\":\"agent\",\"optional\":false,\"rest\":false,\"chained\":false}],\n\t\t\t\tpage: { layouts: [0,2,], errors: [1,,], leaf: 9 },\n\t\t\t\tendpoint: null\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"/edit/[agent]/tests\",\n\t\t\t\tpattern: /^\\/edit\\/([^/]+?)\\/tests\\/?$/,\n\t\t\t\tparams: [{\"name\":\"agent\",\"optional\":false,\"rest\":false,\"chained\":false}],\n\t\t\t\tpage: { layouts: [0,2,], errors: [1,,], leaf: 10 },\n\t\t\t\tendpoint: null\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"/roleplay\",\n\t\t\t\tpattern: /^\\/roleplay\\/?$/,\n\t\t\t\tparams: [],\n\t\t\t\tpage: { layouts: [0,], errors: [1,], leaf: 11 },\n\t\t\t\tendpoint: null\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"/tests\",\n\t\t\t\tpattern: /^\\/tests\\/?$/,\n\t\t\t\tparams: [],\n\t\t\t\tpage: { layouts: [0,], errors: [1,], leaf: 12 },\n\t\t\t\tendpoint: null\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"/tests/[agent]\",\n\t\t\t\tpattern: /^\\/tests\\/([^/]+?)\\/?$/,\n\t\t\t\tparams: [{\"name\":\"agent\",\"optional\":false,\"rest\":false,\"chained\":false}],\n\t\t\t\tpage: { layouts: [0,], errors: [1,], leaf: 13 },\n\t\t\t\tendpoint: null\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"/traces\",\n\t\t\t\tpattern: /^\\/traces\\/?$/,\n\t\t\t\tparams: [],\n\t\t\t\tpage: { layouts: [0,], errors: [1,], leaf: 14 },\n\t\t\t\tendpoint: null\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"/traces/api/latency/[conversationId]\",\n\t\t\t\tpattern: /^\\/traces\\/api\\/latency\\/([^/]+?)\\/?$/,\n\t\t\t\tparams: [{\"name\":\"conversationId\",\"optional\":false,\"rest\":false,\"chained\":false}],\n\t\t\t\tpage: null,\n\t\t\t\tendpoint: __memo(() => import('./entries/endpoints/traces/api/latency/_conversationId_/_server.ts.js'))\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"/traces/api/latency/[conversationId]/audio\",\n\t\t\t\tpattern: /^\\/traces\\/api\\/latency\\/([^/]+?)\\/audio\\/?$/,\n\t\t\t\tparams: [{\"name\":\"conversationId\",\"optional\":false,\"rest\":false,\"chained\":false}],\n\t\t\t\tpage: null,\n\t\t\t\tendpoint: __memo(() => import('./entries/endpoints/traces/api/latency/_conversationId_/audio/_server.ts.js'))\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"/traces/api/proxy/[...path]\",\n\t\t\t\tpattern: /^\\/traces\\/api\\/proxy(?:\\/([^]*))?\\/?$/,\n\t\t\t\tparams: [{\"name\":\"path\",\"optional\":false,\"rest\":true,\"chained\":true}],\n\t\t\t\tpage: null,\n\t\t\t\tendpoint: __memo(() => import('./entries/endpoints/traces/api/proxy/_...path_/_server.ts.js'))\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"/traces/api/sources\",\n\t\t\t\tpattern: /^\\/traces\\/api\\/sources\\/?$/,\n\t\t\t\tparams: [],\n\t\t\t\tpage: null,\n\t\t\t\tendpoint: __memo(() => import('./entries/endpoints/traces/api/sources/_server.ts.js'))\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"/traces/conversations\",\n\t\t\t\tpattern: /^\\/traces\\/conversations\\/?$/,\n\t\t\t\tparams: [],\n\t\t\t\tpage: { layouts: [0,3,], errors: [1,,], leaf: 15 },\n\t\t\t\tendpoint: null\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"/traces/conversations/[conversationId]\",\n\t\t\t\tpattern: /^\\/traces\\/conversations\\/([^/]+?)\\/?$/,\n\t\t\t\tparams: [{\"name\":\"conversationId\",\"optional\":false,\"rest\":false,\"chained\":false}],\n\t\t\t\tpage: { layouts: [0,3,4,], errors: [1,,,], leaf: 16 },\n\t\t\t\tendpoint: null\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"/traces/conversations/[conversationId]/latency\",\n\t\t\t\tpattern: /^\\/traces\\/conversations\\/([^/]+?)\\/latency\\/?$/,\n\t\t\t\tparams: [{\"name\":\"conversationId\",\"optional\":false,\"rest\":false,\"chained\":false}],\n\t\t\t\tpage: { layouts: [0,3,4,], errors: [1,,,], leaf: 17 },\n\t\t\t\tendpoint: null\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"/traces/conversations/[conversationId]/traces\",\n\t\t\t\tpattern: /^\\/traces\\/conversations\\/([^/]+?)\\/traces\\/?$/,\n\t\t\t\tparams: [{\"name\":\"conversationId\",\"optional\":false,\"rest\":false,\"chained\":false}],\n\t\t\t\tpage: { layouts: [0,3,4,], errors: [1,,,], leaf: 18 },\n\t\t\t\tendpoint: null\n\t\t\t}\n\t\t],\n\t\tprerendered_routes: new Set([]),\n\t\tmatchers: async () => {\n\t\t\t\n\t\t\treturn { };\n\t\t},\n\t\tserver_assets: {}\n\t}\n}\n})();\n\nexport const prerendered = new Set([]);\n\nexport const base = \"\";"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"manifest.js","sources":["../../.svelte-kit/adapter-node/manifest.js"],"sourcesContent":["export const manifest = (() => {\nfunction __memo(fn) {\n\tlet value;\n\treturn () => value ??= (value = fn());\n}\n\nreturn {\n\tappDir: \"_app\",\n\tappPath: \"_app\",\n\tassets: new Set([\"favicon.png\",\"fonts/DarkerGrotesque-Black.ttf\",\"fonts/DarkerGrotesque-Bold.ttf\",\"fonts/DarkerGrotesque-Light.ttf\",\"fonts/DarkerGrotesque-Medium.ttf\",\"fonts/DarkerGrotesque-Regular.ttf\",\"fonts/DarkerGrotesque-SemiBold.ttf\",\"fonts.css\",\"recombine.svg\",\"telescope-icon.svg\",\"ui/arrow_tests.svg\",\"ui/paperclip.svg\",\"ui/send.svg\"]),\n\tmimeTypes: {\".png\":\"image/png\",\".ttf\":\"font/ttf\",\".css\":\"text/css\",\".svg\":\"image/svg+xml\"},\n\t_: {\n\t\tclient: {start:\"_app/immutable/entry/start.BeIIwvvV.js\",app:\"_app/immutable/entry/app.BY5DP2K_.js\",imports:[\"_app/immutable/entry/start.BeIIwvvV.js\",\"_app/immutable/chunks/BVxLHCs8.js\",\"_app/immutable/chunks/CxLomzuE.js\",\"_app/immutable/chunks/uLGP0py1.js\",\"_app/immutable/chunks/OA8UcISh.js\",\"_app/immutable/chunks/C39ai1md.js\",\"_app/immutable/entry/app.BY5DP2K_.js\",\"_app/immutable/chunks/C1FmrZbK.js\",\"_app/immutable/chunks/CxLomzuE.js\",\"_app/immutable/chunks/DJriQKD9.js\",\"_app/immutable/chunks/Ca197UDq.js\",\"_app/immutable/chunks/xC2C8d09.js\",\"_app/immutable/chunks/C39ai1md.js\",\"_app/immutable/chunks/Buo-57fF.js\",\"_app/immutable/chunks/CJYOmGlC.js\",\"_app/immutable/chunks/Cyai3SOj.js\",\"_app/immutable/chunks/BLu86SbA.js\",\"_app/immutable/chunks/CPXdAKdv.js\",\"_app/immutable/chunks/uLGP0py1.js\"],stylesheets:[],fonts:[],uses_env_dynamic_public:true},\n\t\tnodes: [\n\t\t\t__memo(() => import('./nodes/0.js')),\n\t\t\t__memo(() => import('./nodes/1.js')),\n\t\t\t__memo(() => import('./nodes/2.js')),\n\t\t\t__memo(() => import('./nodes/3.js')),\n\t\t\t__memo(() => import('./nodes/4.js')),\n\t\t\t__memo(() => import('./nodes/5.js')),\n\t\t\t__memo(() => import('./nodes/6.js')),\n\t\t\t__memo(() => import('./nodes/7.js')),\n\t\t\t__memo(() => import('./nodes/8.js')),\n\t\t\t__memo(() => import('./nodes/9.js')),\n\t\t\t__memo(() => import('./nodes/10.js')),\n\t\t\t__memo(() => import('./nodes/11.js')),\n\t\t\t__memo(() => import('./nodes/12.js')),\n\t\t\t__memo(() => import('./nodes/13.js')),\n\t\t\t__memo(() => import('./nodes/14.js')),\n\t\t\t__memo(() => import('./nodes/15.js')),\n\t\t\t__memo(() => import('./nodes/16.js')),\n\t\t\t__memo(() => import('./nodes/17.js')),\n\t\t\t__memo(() => import('./nodes/18.js'))\n\t\t],\n\t\tremotes: {\n\t\t\t\n\t\t},\n\t\troutes: [\n\t\t\t{\n\t\t\t\tid: \"/\",\n\t\t\t\tpattern: /^\\/$/,\n\t\t\t\tparams: [],\n\t\t\t\tpage: { layouts: [0,], errors: [1,], leaf: 5 },\n\t\t\t\tendpoint: null\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"/edit\",\n\t\t\t\tpattern: /^\\/edit\\/?$/,\n\t\t\t\tparams: [],\n\t\t\t\tpage: { layouts: [0,], errors: [1,], leaf: 6 },\n\t\t\t\tendpoint: null\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"/edit/[agent]\",\n\t\t\t\tpattern: /^\\/edit\\/([^/]+?)\\/?$/,\n\t\t\t\tparams: [{\"name\":\"agent\",\"optional\":false,\"rest\":false,\"chained\":false}],\n\t\t\t\tpage: { layouts: [0,2,], errors: [1,,], leaf: 7 },\n\t\t\t\tendpoint: null\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"/edit/[agent]/configure\",\n\t\t\t\tpattern: /^\\/edit\\/([^/]+?)\\/configure\\/?$/,\n\t\t\t\tparams: [{\"name\":\"agent\",\"optional\":false,\"rest\":false,\"chained\":false}],\n\t\t\t\tpage: { layouts: [0,2,], errors: [1,,], leaf: 8 },\n\t\t\t\tendpoint: null\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"/edit/[agent]/roleplay\",\n\t\t\t\tpattern: /^\\/edit\\/([^/]+?)\\/roleplay\\/?$/,\n\t\t\t\tparams: [{\"name\":\"agent\",\"optional\":false,\"rest\":false,\"chained\":false}],\n\t\t\t\tpage: { layouts: [0,2,], errors: [1,,], leaf: 9 },\n\t\t\t\tendpoint: null\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"/edit/[agent]/tests\",\n\t\t\t\tpattern: /^\\/edit\\/([^/]+?)\\/tests\\/?$/,\n\t\t\t\tparams: [{\"name\":\"agent\",\"optional\":false,\"rest\":false,\"chained\":false}],\n\t\t\t\tpage: { layouts: [0,2,], errors: [1,,], leaf: 10 },\n\t\t\t\tendpoint: null\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"/roleplay\",\n\t\t\t\tpattern: /^\\/roleplay\\/?$/,\n\t\t\t\tparams: [],\n\t\t\t\tpage: { layouts: [0,], errors: [1,], leaf: 11 },\n\t\t\t\tendpoint: null\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"/tests\",\n\t\t\t\tpattern: /^\\/tests\\/?$/,\n\t\t\t\tparams: [],\n\t\t\t\tpage: { layouts: [0,], errors: [1,], leaf: 12 },\n\t\t\t\tendpoint: null\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"/tests/[agent]\",\n\t\t\t\tpattern: /^\\/tests\\/([^/]+?)\\/?$/,\n\t\t\t\tparams: [{\"name\":\"agent\",\"optional\":false,\"rest\":false,\"chained\":false}],\n\t\t\t\tpage: { layouts: [0,], errors: [1,], leaf: 13 },\n\t\t\t\tendpoint: null\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"/traces\",\n\t\t\t\tpattern: /^\\/traces\\/?$/,\n\t\t\t\tparams: [],\n\t\t\t\tpage: { layouts: [0,], errors: [1,], leaf: 14 },\n\t\t\t\tendpoint: null\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"/traces/api/latency/[conversationId]\",\n\t\t\t\tpattern: /^\\/traces\\/api\\/latency\\/([^/]+?)\\/?$/,\n\t\t\t\tparams: [{\"name\":\"conversationId\",\"optional\":false,\"rest\":false,\"chained\":false}],\n\t\t\t\tpage: null,\n\t\t\t\tendpoint: __memo(() => import('./entries/endpoints/traces/api/latency/_conversationId_/_server.ts.js'))\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"/traces/api/latency/[conversationId]/audio\",\n\t\t\t\tpattern: /^\\/traces\\/api\\/latency\\/([^/]+?)\\/audio\\/?$/,\n\t\t\t\tparams: [{\"name\":\"conversationId\",\"optional\":false,\"rest\":false,\"chained\":false}],\n\t\t\t\tpage: null,\n\t\t\t\tendpoint: __memo(() => import('./entries/endpoints/traces/api/latency/_conversationId_/audio/_server.ts.js'))\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"/traces/api/proxy/[...path]\",\n\t\t\t\tpattern: /^\\/traces\\/api\\/proxy(?:\\/([^]*))?\\/?$/,\n\t\t\t\tparams: [{\"name\":\"path\",\"optional\":false,\"rest\":true,\"chained\":true}],\n\t\t\t\tpage: null,\n\t\t\t\tendpoint: __memo(() => import('./entries/endpoints/traces/api/proxy/_...path_/_server.ts.js'))\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"/traces/api/sources\",\n\t\t\t\tpattern: /^\\/traces\\/api\\/sources\\/?$/,\n\t\t\t\tparams: [],\n\t\t\t\tpage: null,\n\t\t\t\tendpoint: __memo(() => import('./entries/endpoints/traces/api/sources/_server.ts.js'))\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"/traces/conversations\",\n\t\t\t\tpattern: /^\\/traces\\/conversations\\/?$/,\n\t\t\t\tparams: [],\n\t\t\t\tpage: { layouts: [0,3,], errors: [1,,], leaf: 15 },\n\t\t\t\tendpoint: null\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"/traces/conversations/[conversationId]\",\n\t\t\t\tpattern: /^\\/traces\\/conversations\\/([^/]+?)\\/?$/,\n\t\t\t\tparams: [{\"name\":\"conversationId\",\"optional\":false,\"rest\":false,\"chained\":false}],\n\t\t\t\tpage: { layouts: [0,3,4,], errors: [1,,,], leaf: 16 },\n\t\t\t\tendpoint: null\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"/traces/conversations/[conversationId]/latency\",\n\t\t\t\tpattern: /^\\/traces\\/conversations\\/([^/]+?)\\/latency\\/?$/,\n\t\t\t\tparams: [{\"name\":\"conversationId\",\"optional\":false,\"rest\":false,\"chained\":false}],\n\t\t\t\tpage: { layouts: [0,3,4,], errors: [1,,,], leaf: 17 },\n\t\t\t\tendpoint: null\n\t\t\t},\n\t\t\t{\n\t\t\t\tid: \"/traces/conversations/[conversationId]/traces\",\n\t\t\t\tpattern: /^\\/traces\\/conversations\\/([^/]+?)\\/traces\\/?$/,\n\t\t\t\tparams: [{\"name\":\"conversationId\",\"optional\":false,\"rest\":false,\"chained\":false}],\n\t\t\t\tpage: { layouts: [0,3,4,], errors: [1,,,], leaf: 18 },\n\t\t\t\tendpoint: null\n\t\t\t}\n\t\t],\n\t\tprerendered_routes: new Set([]),\n\t\tmatchers: async () => {\n\t\t\t\n\t\t\treturn { };\n\t\t},\n\t\tserver_assets: {}\n\t}\n}\n})();\n\nexport const prerendered = new Set([]);\n\nexport const base = \"\";"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@recombine-ai/bosun",
3
3
  "author": "recombine.ai",
4
- "version": "0.13.0",
4
+ "version": "0.15.0",
5
5
  "license": "EULA",
6
6
  "bin": {
7
7
  "bosun": "./bin/bosun.js"
@@ -11,7 +11,7 @@
11
11
  "build",
12
12
  "bin",
13
13
  "src/backend",
14
- "src/lib/ws-messages.ts",
14
+ "src/lib",
15
15
  ".svelte-kit/tsconfig.json",
16
16
  "tsconfig.json",
17
17
  "README.md"
@@ -83,9 +83,9 @@
83
83
  "dependencies": {
84
84
  "@iconify/svelte": "^5.0.2",
85
85
  "@popperjs/core": "^2.11.8",
86
- "@recombine-ai/bosun-lib": "0.2.1",
86
+ "@recombine-ai/bosun-lib": "0.2.2",
87
87
  "@recombine-ai/engine": "1.0.0",
88
- "@recombine-ai/telescope": "0.2.0",
88
+ "@recombine-ai/telescope": "0.2.1",
89
89
  "@tailwindcss/forms": "^0.5.9",
90
90
  "@tailwindcss/typography": "^0.5.15",
91
91
  "@trpc/client": "^11.7.1",
@@ -0,0 +1,15 @@
1
+ const MANAGED_BACKEND_RESTART_EXIT_CODE = 75
2
+ const MANAGED_BACKEND_RESTART_DELAY_MS = 500
3
+
4
+ let restartTimer: ReturnType<typeof setTimeout> | null = null
5
+
6
+ export function scheduleManagedBackendRestart(): boolean {
7
+ if (process.env.BOSUN_NPX_RUN !== 'true') return false
8
+ if (restartTimer) return true
9
+
10
+ restartTimer = setTimeout(() => {
11
+ process.exit(MANAGED_BACKEND_RESTART_EXIT_CODE)
12
+ }, MANAGED_BACKEND_RESTART_DELAY_MS)
13
+ restartTimer.unref()
14
+ return true
15
+ }
@@ -3,13 +3,16 @@ import path from 'path'
3
3
  import { z } from 'zod'
4
4
  import { createContext } from '@recombine-ai/engine'
5
5
  import type { TRPCRootObject } from '@trpc/server/unstable-core-do-not-import'
6
+ import { scheduleManagedBackendRestart } from '../lib/backend-restart'
6
7
  import { getAgentCatalog, getAgentFactories } from '../lib/get-agent-factories'
8
+ import { bumpImportNonce } from '../lib/import-nonce'
7
9
  import { getProjectDataDir } from '../lib/project-data-dir'
8
10
  import { getRootPath } from '../lib/get-root-path'
9
11
  import type { TrpcContext } from '../lib/trpc-context'
10
12
  import { analyzeTraceQuotes, generateSuggestedUserResponse } from '../tests/analyze'
11
13
  import type { AgentState } from './agents'
12
14
  import { fsContextPersistence, fsStatePersistence } from './fs-persistence'
15
+ import { validateAndReplaceSchemaFile } from './schema-file'
13
16
  import { generateReplyVariants, replaceSavedState } from './variants'
14
17
 
15
18
  const AgentIdSchema = z.string().trim().min(1).max(512)
@@ -84,6 +87,22 @@ export function createRolePlayRouter(t: TRPCRootObject<TrpcContext, any, any>) {
84
87
  await persistPromptUpdate(input.agentId, input.step, input.prompt)
85
88
  return { ok: true }
86
89
  }),
90
+ saveSchema: t.procedure
91
+ .input(
92
+ z.object({
93
+ agentId: AgentIdSchema,
94
+ step: z.string().trim().min(1).max(512),
95
+ schema: z.string().max(1_000_000)
96
+ })
97
+ )
98
+ .mutation(async ({ input }) => {
99
+ await persistSchemaUpdate(input.agentId, input.step, input.schema)
100
+ bumpImportNonce()
101
+ return {
102
+ ok: true,
103
+ restartScheduled: scheduleManagedBackendRestart()
104
+ }
105
+ }),
87
106
  userMessageHistory: t.procedure
88
107
  .input(
89
108
  z.object({
@@ -252,6 +271,28 @@ const noop = () => void 0
252
271
  const noopAsync = () => Promise.resolve()
253
272
 
254
273
  async function persistPromptUpdate(agentId: string, stepName: string, prompt: string) {
274
+ const { basePath, steps } = await loadAgentSteps(agentId)
275
+ const targetStep = steps.find((step) => step?.name === stepName)
276
+ if (!targetStep || targetStep?.prompt?.type !== 'file') return
277
+
278
+ const promptPath = path.resolve(basePath, targetStep.prompt.path)
279
+ await fs.promises.writeFile(promptPath, prompt, 'utf-8')
280
+ }
281
+
282
+ async function persistSchemaUpdate(agentId: string, stepName: string, schema: string) {
283
+ const { basePath, steps } = await loadAgentSteps(agentId)
284
+ const targetStep = steps.find((step) => step?.name === stepName)
285
+ if (!targetStep || targetStep?.prompt?.type !== 'file' || !targetStep.schema) {
286
+ throw new Error(`Step '${stepName}' does not have an editable file schema`)
287
+ }
288
+
289
+ const promptPath = path.resolve(basePath, targetStep.prompt.path)
290
+ const schemaPath = path.join(path.dirname(promptPath), 'schema.ts')
291
+ await fs.promises.access(schemaPath)
292
+ await validateAndReplaceSchemaFile(schemaPath, schema)
293
+ }
294
+
295
+ async function loadAgentSteps(agentId: string) {
255
296
  const { factory, basePath } = await getAgentFactory(agentId)
256
297
  const ctx = createContext({})
257
298
  const steps: any[] = []
@@ -282,11 +323,7 @@ async function persistPromptUpdate(agentId: string, stepName: string, prompt: st
282
323
  }
283
324
  })
284
325
 
285
- const targetStep = steps.find((step) => step?.name === stepName)
286
- if (!targetStep || targetStep?.prompt?.type !== 'file') return
287
-
288
- const promptPath = path.resolve(basePath, targetStep.prompt.path)
289
- await fs.promises.writeFile(promptPath, prompt, 'utf-8')
326
+ return { basePath, steps }
290
327
  }
291
328
 
292
329
  async function getAgentFactory(agentId: string) {
@@ -0,0 +1,38 @@
1
+ import { mkdtemp, readFile, rm, writeFile } from 'node:fs/promises'
2
+ import os from 'node:os'
3
+ import path from 'node:path'
4
+ import { afterEach, describe, expect, it } from 'vitest'
5
+ import { validateAndReplaceSchemaFile } from './schema-file'
6
+
7
+ const tempDirs: string[] = []
8
+
9
+ afterEach(async () => {
10
+ await Promise.all(tempDirs.splice(0).map((dir) => rm(dir, { recursive: true, force: true })))
11
+ })
12
+
13
+ describe('validateAndReplaceSchemaFile', () => {
14
+ it('replaces a schema only after the edited module loads successfully', async () => {
15
+ const dir = await mkdtemp(path.join(os.tmpdir(), 'bosun-schema-file-'))
16
+ tempDirs.push(dir)
17
+ const schemaPath = path.join(dir, 'schema.ts')
18
+ await writeFile(schemaPath, 'export default { version: 1 }\n', 'utf-8')
19
+
20
+ const nextSchema = 'export default { version: 2 }\n'
21
+ await validateAndReplaceSchemaFile(schemaPath, nextSchema)
22
+
23
+ expect(await readFile(schemaPath, 'utf-8')).toBe(nextSchema)
24
+ })
25
+
26
+ it('preserves the existing schema when the edit cannot be loaded', async () => {
27
+ const dir = await mkdtemp(path.join(os.tmpdir(), 'bosun-schema-file-'))
28
+ tempDirs.push(dir)
29
+ const schemaPath = path.join(dir, 'schema.ts')
30
+ const originalSchema = 'export default { version: 1 }\n'
31
+ await writeFile(schemaPath, originalSchema, 'utf-8')
32
+
33
+ await expect(validateAndReplaceSchemaFile(schemaPath, 'export default {')).rejects.toThrow(
34
+ 'Schema could not be loaded'
35
+ )
36
+ expect(await readFile(schemaPath, 'utf-8')).toBe(originalSchema)
37
+ })
38
+ })
@@ -0,0 +1,33 @@
1
+ import fs from 'node:fs'
2
+ import path from 'node:path'
3
+ import { pathToFileURL } from 'node:url'
4
+
5
+ export async function validateAndReplaceSchemaFile(schemaPath: string, schema: string) {
6
+ const dir = path.dirname(schemaPath)
7
+ const tempPath = path.join(
8
+ dir,
9
+ `.schema.bosun-${process.pid}-${Date.now()}-${Math.random().toString(16).slice(2)}.ts`
10
+ )
11
+
12
+ await fs.promises.writeFile(tempPath, schema, 'utf-8')
13
+ try {
14
+ const validationUrl = pathToFileURL(tempPath)
15
+ validationUrl.searchParams.set('bosunSchemaValidation', String(Date.now()))
16
+ await import(validationUrl.href)
17
+
18
+ try {
19
+ await fs.promises.rename(tempPath, schemaPath)
20
+ } catch {
21
+ // Windows does not replace an existing destination atomically. The temporary module has
22
+ // already loaded successfully, so fall back to a direct write there.
23
+ await fs.promises.writeFile(schemaPath, schema, 'utf-8')
24
+ await fs.promises.unlink(tempPath).catch(() => {})
25
+ }
26
+ } catch (error) {
27
+ await fs.promises.unlink(tempPath).catch(() => {})
28
+ throw new Error(
29
+ `Schema could not be loaded: ${error instanceof Error ? error.message : String(error)}`,
30
+ { cause: error }
31
+ )
32
+ }
33
+ }
@@ -8,6 +8,7 @@ import { tryReadConfig } from './config'
8
8
  import { mkdir, rename, unlink, writeFile } from 'node:fs/promises'
9
9
  import path from 'node:path'
10
10
  import { readSuite, type TestRow as SuiteTestRow } from './suite'
11
+ import { isMainStepName } from '../../lib/steps'
11
12
  // Use types derived from promptfoo exports instead of incorrect default type imports
12
13
 
13
14
  import type {
@@ -436,7 +437,7 @@ export class RecombineAgentProvider implements ApiProvider {
436
437
  const sanitizeTrace = (t: StepTrace): any => {
437
438
  try {
438
439
  const clone: any = { ...t }
439
- const isMain = clone?.name === 'main' || clone?.name === 'mainReply'
440
+ const isMain = isMainStepName(clone?.name)
440
441
  // Truncate large prompt fields on non-main steps
441
442
  const truncate = (s: any, max = 5000) => {
442
443
  if (typeof s !== 'string') return s
@@ -540,7 +541,8 @@ function toResultEntry(r: any): ResultEntry {
540
541
  const targetStep = String(r.metadata?.targetStep || 'main')
541
542
  const sourceTrace =
542
543
  targetStep === 'main'
543
- ? [...rawTraces].reverse().find((trace: any) => trace?.name === 'main')
544
+ ? // A row targeting the primary step matches whichever variant actually ran; see isMainStepName.
545
+ [...rawTraces].reverse().find((trace: any) => isMainStepName(trace?.name))
544
546
  : rawTraces.find((trace: any) => trace?.name === targetStep)
545
547
  const rendered_prompt =
546
548
  sourceTrace && typeof sourceTrace.renderedPrompt !== 'undefined'
@@ -3,6 +3,7 @@ import type { StepTrace } from '@recombine-ai/engine'
3
3
 
4
4
  import { getRunResultEntry } from './data'
5
5
  import { decodeHtmlEntities } from '../lib/decode-html-entities'
6
+ import { isMainStepName } from '../../lib/steps'
6
7
 
7
8
  const DEFAULT_ANALYZE_SYSTEM_MESSAGE =
8
9
  "Stop roleplay. Analyze the last response. Respond with a JSON array of direct quotes from the system prompt that you used to generate it. Keep the quotes short if possible, especially if you're quoting a list."
@@ -408,7 +409,7 @@ function findMainTrace(traces: StepTrace[] | undefined): StepTrace | undefined {
408
409
  for (let i = traces.length - 1; i >= 0; i--) {
409
410
  const t = traces[i]
410
411
  if (!t) continue
411
- if (t.name === 'main' || t.name === 'mainReply') return t
412
+ if (isMainStepName(t.name)) return t
412
413
  }
413
414
  return undefined
414
415
  }
@@ -69,18 +69,23 @@ export async function loadAgents(props: {
69
69
  }
70
70
  }
71
71
 
72
- const ctx = createContext({})
72
+ const hasSplitContext =
73
+ typeof mocks !== 'undefined' &&
74
+ mocks !== null &&
75
+ typeof mocks === 'object' &&
76
+ !Array.isArray(mocks)
77
+ const providedContext = context && typeof context === 'object' ? context : {}
78
+ const runtimeContext = region
79
+ ? {
80
+ ...providedContext,
81
+ recombineRegion: providedContext.recombineRegion ?? region
82
+ }
83
+ : providedContext
84
+ const ctx = createContext(hasSplitContext ? { context: runtimeContext, mocks } : runtimeContext)
73
85
 
74
86
  // Maintain in-run history so sendMessage appends to it, mirroring backend behavior
75
87
  let history: Message[] = []
76
88
 
77
- if (region) {
78
- // The UI-selected region is stored in Bosun's runtime ctx and consumed by the project's workflows.
79
- // Setting it before calling the factory ensures region-scoped config/strings are used for this run.
80
- const current = (ctx.get() as Record<string, unknown> | null | undefined) || {}
81
- ctx.set({ ...current, recombineRegion: region })
82
- }
83
-
84
89
  const agent = await withTestPromptCacheBust(() =>
85
90
  factory({
86
91
  stepTracer: stepTracer,
@@ -107,19 +112,6 @@ export async function loadAgents(props: {
107
112
  })
108
113
  )
109
114
 
110
- const hasSplitContext =
111
- typeof mocks !== 'undefined' &&
112
- mocks !== null &&
113
- typeof mocks === 'object' &&
114
- !Array.isArray(mocks)
115
-
116
- if (hasSplitContext) {
117
- ctx.swap({ context: context || {}, mocks })
118
- } else if (context && typeof context === 'object') {
119
- // Apply provided context before agent lifecycle
120
- ctx.swap(context)
121
- }
122
-
123
115
  const withAbort = wrapAbort(abortSignal)
124
116
 
125
117
  try {
@@ -0,0 +1,162 @@
1
+ import { describe, expect, it, vi } from 'vitest'
2
+
3
+ import type { TraceTestSeed } from '../../lib/tests/pii-sanitized-test-draft'
4
+ import {
5
+ createPIISanitizedTestDraft,
6
+ createTestFromPIISanitizedTestDraft
7
+ } from './pii-sanitized-test-drafts'
8
+ import type { PIISanitizationResult } from './pii-sanitizer'
9
+ import type { TestRow } from './suite'
10
+
11
+ function seed(overrides: Partial<TraceTestSeed> = {}): TraceTestSeed {
12
+ return {
13
+ pinned: 'TRUE',
14
+ step: 'main',
15
+ evaluation_mode: 'assertion',
16
+ context_mode: 'replace',
17
+ assertion_type: 'llm-rubric',
18
+ assertion_value: '',
19
+ conversation: 'User: I am Sarah Khan.',
20
+ expected_output: 'Hello Sarah.',
21
+ similarity_threshold: '60',
22
+ timeout: '0',
23
+ context: { customer: { name: 'Sarah Khan' } },
24
+ ...overrides
25
+ }
26
+ }
27
+
28
+ function sanitized(input: TraceTestSeed, replacement = 'Maya Turner'): PIISanitizationResult {
29
+ return {
30
+ seed: {
31
+ ...input,
32
+ conversation: input.conversation.replace('Sarah Khan', replacement),
33
+ expected_output: input.expected_output.replace('Sarah', replacement.split(' ')[0]),
34
+ context: { customer: { name: replacement } }
35
+ },
36
+ findings: [{ category: 'person', paths: ['$.conversation', '$.context.customer.name'] }],
37
+ model: 'test-model'
38
+ }
39
+ }
40
+
41
+ function testRow(input: TraceTestSeed): TestRow {
42
+ return {
43
+ id: 'created-test',
44
+ scenario: '',
45
+ author: '',
46
+ category: '',
47
+ ...input
48
+ }
49
+ }
50
+
51
+ describe('PII-sanitised test drafts', () => {
52
+ it('persists an unchanged server-created draft exactly once', async () => {
53
+ const sanitize = vi.fn(async (input: TraceTestSeed) => sanitized(input))
54
+ const persist = vi.fn(async (_suiteKey, _mergeContexts, input: TraceTestSeed) => testRow(input))
55
+ const draft = await createPIISanitizedTestDraft(
56
+ { suiteKey: 'agent.en-gb', seed: seed() },
57
+ { sanitize, now: () => 1_000 }
58
+ )
59
+
60
+ const result = await createTestFromPIISanitizedTestDraft(
61
+ {
62
+ suiteKey: 'agent.en-gb',
63
+ draftId: draft.draftId,
64
+ reviewed: {
65
+ conversation: draft.seed.conversation,
66
+ expected_output: draft.seed.expected_output,
67
+ context: draft.seed.context
68
+ }
69
+ },
70
+ { persist, now: () => 2_000 }
71
+ )
72
+
73
+ expect(result.status).toBe('created')
74
+ expect(sanitize).toHaveBeenCalledTimes(1)
75
+ expect(persist).toHaveBeenCalledOnce()
76
+ expect(JSON.stringify(persist.mock.calls[0][2])).not.toContain('Sarah')
77
+ })
78
+
79
+ it('persists reviewed edits immediately without sanitizing them again', async () => {
80
+ const sanitize = vi.fn(async (input: TraceTestSeed) => sanitized(input))
81
+ const persist = vi.fn(async (_suiteKey, _mergeContexts, input: TraceTestSeed) => testRow(input))
82
+ const draft = await createPIISanitizedTestDraft(
83
+ { suiteKey: 'agent', seed: seed() },
84
+ { sanitize, now: () => 1_000 }
85
+ )
86
+
87
+ const result = await createTestFromPIISanitizedTestDraft(
88
+ {
89
+ suiteKey: 'agent',
90
+ draftId: draft.draftId,
91
+ reviewed: {
92
+ conversation: 'User: I am Sarah Khan.',
93
+ expected_output: draft.seed.expected_output,
94
+ context: draft.seed.context
95
+ }
96
+ },
97
+ { persist, now: () => 2_000 }
98
+ )
99
+
100
+ expect(result.status).toBe('created')
101
+ expect(sanitize).toHaveBeenCalledOnce()
102
+ expect(persist).toHaveBeenCalledOnce()
103
+ expect(persist.mock.calls[0][2].conversation).toBe('User: I am Sarah Khan.')
104
+ })
105
+
106
+ it('rejects a draft used for a different suite', async () => {
107
+ const draft = await createPIISanitizedTestDraft(
108
+ { suiteKey: 'agent.en-gb', seed: seed() },
109
+ { sanitize: async (input) => sanitized(input), now: () => 1_000 }
110
+ )
111
+
112
+ await expect(
113
+ createTestFromPIISanitizedTestDraft(
114
+ {
115
+ suiteKey: 'other-agent',
116
+ draftId: draft.draftId,
117
+ reviewed: {
118
+ conversation: draft.seed.conversation,
119
+ expected_output: draft.seed.expected_output,
120
+ context: draft.seed.context
121
+ }
122
+ },
123
+ { now: () => 2_000 }
124
+ )
125
+ ).rejects.toThrow('does not match this suite')
126
+ })
127
+
128
+ it('allows only one create operation to consume a draft', async () => {
129
+ let finishPersist!: (row: TestRow) => void
130
+ const persist = vi.fn(
131
+ async (_suiteKey, _mergeContexts, _input: TraceTestSeed) =>
132
+ new Promise<TestRow>((resolve) => {
133
+ finishPersist = resolve
134
+ })
135
+ )
136
+ const draft = await createPIISanitizedTestDraft(
137
+ { suiteKey: 'agent', seed: seed() },
138
+ { sanitize: async (input) => sanitized(input), now: () => 1_000 }
139
+ )
140
+ const input = {
141
+ suiteKey: 'agent',
142
+ draftId: draft.draftId,
143
+ reviewed: {
144
+ conversation: draft.seed.conversation,
145
+ expected_output: draft.seed.expected_output,
146
+ context: draft.seed.context
147
+ }
148
+ }
149
+
150
+ const first = createTestFromPIISanitizedTestDraft(input, {
151
+ persist,
152
+ now: () => 2_000
153
+ })
154
+ await expect(
155
+ createTestFromPIISanitizedTestDraft(input, { persist, now: () => 2_000 })
156
+ ).rejects.toThrow('already being created')
157
+
158
+ finishPersist(testRow(draft.seed))
159
+ await expect(first).resolves.toMatchObject({ status: 'created' })
160
+ expect(persist).toHaveBeenCalledOnce()
161
+ })
162
+ })