@recombine-ai/bosun 0.16.1 → 0.16.2

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 (430) hide show
  1. package/build/client/_app/immutable/assets/0.Rrc0O--C.css +1 -0
  2. package/build/client/_app/immutable/assets/0.Rrc0O--C.css.br +0 -0
  3. package/build/client/_app/immutable/assets/0.Rrc0O--C.css.gz +0 -0
  4. package/build/client/_app/immutable/assets/2.DtxQDOXx.css +1 -0
  5. package/build/client/_app/immutable/assets/2.DtxQDOXx.css.br +0 -0
  6. package/build/client/_app/immutable/assets/2.DtxQDOXx.css.gz +0 -0
  7. package/build/client/_app/immutable/assets/ReadOnlyMonacoDiff.iiWNRlR-.css +1 -0
  8. package/build/client/_app/immutable/assets/ReadOnlyMonacoDiff.iiWNRlR-.css.br +0 -0
  9. package/build/client/_app/immutable/assets/ReadOnlyMonacoDiff.iiWNRlR-.css.gz +0 -0
  10. package/build/client/_app/immutable/chunks/{Cyai3SOj.js → B1HdnQRQ.js} +1 -1
  11. package/build/client/_app/immutable/chunks/B1HdnQRQ.js.br +0 -0
  12. package/build/client/_app/immutable/chunks/B1HdnQRQ.js.gz +0 -0
  13. package/build/client/_app/immutable/chunks/{uLGP0py1.js → B5zf3x62.js} +1 -1
  14. package/build/client/_app/immutable/chunks/B5zf3x62.js.br +0 -0
  15. package/build/client/_app/immutable/chunks/B5zf3x62.js.gz +0 -0
  16. package/build/client/_app/immutable/chunks/{Buo-57fF.js → BHHfrjbV.js} +1 -1
  17. package/build/client/_app/immutable/chunks/BHHfrjbV.js.br +2 -0
  18. package/build/client/_app/immutable/chunks/BHHfrjbV.js.gz +0 -0
  19. package/build/client/_app/immutable/chunks/BbGYcfPY.js +3 -0
  20. package/build/client/_app/immutable/chunks/BbGYcfPY.js.br +0 -0
  21. package/build/client/_app/immutable/chunks/BbGYcfPY.js.gz +0 -0
  22. package/build/client/_app/immutable/chunks/{CX0Ekq8t.js → Bmd5zhWC.js} +1 -1
  23. package/build/client/_app/immutable/chunks/Bmd5zhWC.js.br +0 -0
  24. package/build/client/_app/immutable/chunks/Bmd5zhWC.js.gz +0 -0
  25. package/build/client/_app/immutable/chunks/{Dslf9OwW.js → BnqH7p3U.js} +1 -1
  26. package/build/client/_app/immutable/chunks/BnqH7p3U.js.br +0 -0
  27. package/build/client/_app/immutable/chunks/BnqH7p3U.js.gz +0 -0
  28. package/build/client/_app/immutable/chunks/{CJYOmGlC.js → Bog028VR.js} +1 -1
  29. package/build/client/_app/immutable/chunks/Bog028VR.js.br +0 -0
  30. package/build/client/_app/immutable/chunks/Bog028VR.js.gz +0 -0
  31. package/build/client/_app/immutable/chunks/{iAhzu4tv.js → Bv1mNXs0.js} +1 -1
  32. package/build/client/_app/immutable/chunks/Bv1mNXs0.js.br +0 -0
  33. package/build/client/_app/immutable/chunks/Bv1mNXs0.js.gz +0 -0
  34. package/build/client/_app/immutable/chunks/BvjXTrOz.js +1 -0
  35. package/build/client/_app/immutable/chunks/BvjXTrOz.js.br +0 -0
  36. package/build/client/_app/immutable/chunks/BvjXTrOz.js.gz +0 -0
  37. package/build/client/_app/immutable/chunks/C1R-s4aD.js +1 -0
  38. package/build/client/_app/immutable/chunks/C1R-s4aD.js.br +0 -0
  39. package/build/client/_app/immutable/chunks/C1R-s4aD.js.gz +0 -0
  40. package/build/client/_app/immutable/chunks/CC1OcqhR.js +1 -0
  41. package/build/client/_app/immutable/chunks/CC1OcqhR.js.br +0 -0
  42. package/build/client/_app/immutable/chunks/CC1OcqhR.js.gz +0 -0
  43. package/build/client/_app/immutable/chunks/CEHsomMo.js +1 -0
  44. package/build/client/_app/immutable/chunks/CEHsomMo.js.br +0 -0
  45. package/build/client/_app/immutable/chunks/CEHsomMo.js.gz +0 -0
  46. package/build/client/_app/immutable/chunks/{CVlsAO8k.js → CJcZ2GVC.js} +1 -1
  47. package/build/client/_app/immutable/chunks/CJcZ2GVC.js.br +0 -0
  48. package/build/client/_app/immutable/chunks/CJcZ2GVC.js.gz +0 -0
  49. package/build/client/_app/immutable/chunks/{DJriQKD9.js → CN555stc.js} +1 -1
  50. package/build/client/_app/immutable/chunks/CN555stc.js.br +0 -0
  51. package/build/client/_app/immutable/chunks/CN555stc.js.gz +0 -0
  52. package/build/client/_app/immutable/chunks/CQg2Mme0.js +9 -0
  53. package/build/client/_app/immutable/chunks/CQg2Mme0.js.br +0 -0
  54. package/build/client/_app/immutable/chunks/CQg2Mme0.js.gz +0 -0
  55. package/build/client/_app/immutable/chunks/{Ce9aG7vY.js → Cp_st-64.js} +1 -1
  56. package/build/client/_app/immutable/chunks/Cp_st-64.js.br +0 -0
  57. package/build/client/_app/immutable/chunks/Cp_st-64.js.gz +0 -0
  58. package/build/client/_app/immutable/chunks/{CPXdAKdv.js → D8mA-uZ4.js} +1 -1
  59. package/build/client/_app/immutable/chunks/D8mA-uZ4.js.br +0 -0
  60. package/build/client/_app/immutable/chunks/D8mA-uZ4.js.gz +0 -0
  61. package/build/client/_app/immutable/chunks/{Ca197UDq.js → DCXjBDmY.js} +1 -1
  62. package/build/client/_app/immutable/chunks/{Ca197UDq.js.br → DCXjBDmY.js.br} +0 -0
  63. package/build/client/_app/immutable/chunks/DCXjBDmY.js.gz +0 -0
  64. package/build/client/_app/immutable/chunks/DSLyVE1P.js +1 -0
  65. package/build/client/_app/immutable/chunks/DSLyVE1P.js.br +0 -0
  66. package/build/client/_app/immutable/chunks/DSLyVE1P.js.gz +0 -0
  67. package/build/client/_app/immutable/chunks/{07xNIa59.js → Ddv5LgEc.js} +1 -1
  68. package/build/client/_app/immutable/chunks/Ddv5LgEc.js.br +0 -0
  69. package/build/client/_app/immutable/chunks/Ddv5LgEc.js.gz +0 -0
  70. package/build/client/_app/immutable/chunks/{nYD9wsyN.js → DfcDjAv-.js} +1 -1
  71. package/build/client/_app/immutable/chunks/DfcDjAv-.js.br +0 -0
  72. package/build/client/_app/immutable/chunks/DfcDjAv-.js.gz +0 -0
  73. package/build/client/_app/immutable/chunks/{D-B5X35l.js → Dg0A8wPA.js} +1 -1
  74. package/build/client/_app/immutable/chunks/Dg0A8wPA.js.br +0 -0
  75. package/build/client/_app/immutable/chunks/Dg0A8wPA.js.gz +0 -0
  76. package/build/client/_app/immutable/chunks/{BPNEONy5.js → Dm49pcMm.js} +1 -1
  77. package/build/client/_app/immutable/chunks/Dm49pcMm.js.br +0 -0
  78. package/build/client/_app/immutable/chunks/Dm49pcMm.js.gz +0 -0
  79. package/build/client/_app/immutable/chunks/{BI42X8h_.js → DneQQ7D5.js} +1 -1
  80. package/build/client/_app/immutable/chunks/DneQQ7D5.js.br +0 -0
  81. package/build/client/_app/immutable/chunks/DneQQ7D5.js.gz +0 -0
  82. package/build/client/_app/immutable/chunks/{C39ai1md.js → DoD3q5w5.js} +1 -1
  83. package/build/client/_app/immutable/chunks/DoD3q5w5.js.br +0 -0
  84. package/build/client/_app/immutable/chunks/DoD3q5w5.js.gz +0 -0
  85. package/build/client/_app/immutable/chunks/{BLu86SbA.js → DtXXy94i.js} +1 -1
  86. package/build/client/_app/immutable/chunks/DtXXy94i.js.br +0 -0
  87. package/build/client/_app/immutable/chunks/DtXXy94i.js.gz +0 -0
  88. package/build/client/_app/immutable/chunks/{CAjPRvNs.js → Dy2CFyD6.js} +1 -1
  89. package/build/client/_app/immutable/chunks/Dy2CFyD6.js.br +0 -0
  90. package/build/client/_app/immutable/chunks/Dy2CFyD6.js.gz +0 -0
  91. package/build/client/_app/immutable/chunks/DyBwTDJp.js +2 -0
  92. package/build/client/_app/immutable/chunks/DyBwTDJp.js.br +0 -0
  93. package/build/client/_app/immutable/chunks/DyBwTDJp.js.gz +0 -0
  94. package/build/client/_app/immutable/chunks/{BsDZe4N6.js → ILTCveYH.js} +1 -1
  95. package/build/client/_app/immutable/chunks/ILTCveYH.js.br +0 -0
  96. package/build/client/_app/immutable/chunks/ILTCveYH.js.gz +0 -0
  97. package/build/client/_app/immutable/chunks/{Bj8jfBTi.js → UqjCSZmA.js} +1 -1
  98. package/build/client/_app/immutable/chunks/UqjCSZmA.js.br +0 -0
  99. package/build/client/_app/immutable/chunks/UqjCSZmA.js.gz +0 -0
  100. package/build/client/_app/immutable/chunks/_YcrHZ6P.js +1 -0
  101. package/build/client/_app/immutable/chunks/_YcrHZ6P.js.br +2 -0
  102. package/build/client/_app/immutable/chunks/_YcrHZ6P.js.gz +0 -0
  103. package/build/client/_app/immutable/chunks/i6ygh6h8.js +1 -0
  104. package/build/client/_app/immutable/chunks/i6ygh6h8.js.br +2 -0
  105. package/build/client/_app/immutable/chunks/i6ygh6h8.js.gz +0 -0
  106. package/build/client/_app/immutable/chunks/oRi68ch3.js +1 -0
  107. package/build/client/_app/immutable/chunks/oRi68ch3.js.br +0 -0
  108. package/build/client/_app/immutable/chunks/oRi68ch3.js.gz +0 -0
  109. package/build/client/_app/immutable/chunks/{BJTwdUYr.js → pPpIn6tB.js} +1 -1
  110. package/build/client/_app/immutable/chunks/pPpIn6tB.js.br +0 -0
  111. package/build/client/_app/immutable/chunks/pPpIn6tB.js.gz +0 -0
  112. package/build/client/_app/immutable/chunks/{C7he4XPB.js → r0sHOWrM.js} +1 -1
  113. package/build/client/_app/immutable/chunks/r0sHOWrM.js.br +0 -0
  114. package/build/client/_app/immutable/chunks/r0sHOWrM.js.gz +0 -0
  115. package/build/client/_app/immutable/chunks/{CaHl3dME.js → wcTQUnZO.js} +1 -1
  116. package/build/client/_app/immutable/chunks/wcTQUnZO.js.br +0 -0
  117. package/build/client/_app/immutable/chunks/wcTQUnZO.js.gz +0 -0
  118. package/build/client/_app/immutable/entry/{app.Ghwm_QxJ.js → app.DdO0gkPg.js} +2 -2
  119. package/build/client/_app/immutable/entry/app.DdO0gkPg.js.br +0 -0
  120. package/build/client/_app/immutable/entry/app.DdO0gkPg.js.gz +0 -0
  121. package/build/client/_app/immutable/entry/start.eAjDq0c9.js +1 -0
  122. package/build/client/_app/immutable/entry/start.eAjDq0c9.js.br +2 -0
  123. package/build/client/_app/immutable/entry/start.eAjDq0c9.js.gz +0 -0
  124. package/build/client/_app/immutable/nodes/{0.LR7iEcCa.js → 0.nG3DdvIX.js} +1 -1
  125. package/build/client/_app/immutable/nodes/0.nG3DdvIX.js.br +0 -0
  126. package/build/client/_app/immutable/nodes/0.nG3DdvIX.js.gz +0 -0
  127. package/build/client/_app/immutable/nodes/1.Ceu0XS6v.js +1 -0
  128. package/build/client/_app/immutable/nodes/1.Ceu0XS6v.js.br +0 -0
  129. package/build/client/_app/immutable/nodes/1.Ceu0XS6v.js.gz +0 -0
  130. package/build/client/_app/immutable/nodes/{10.BoxFN5Nv.js → 10.dm2dgy31.js} +6 -6
  131. package/build/client/_app/immutable/nodes/10.dm2dgy31.js.br +0 -0
  132. package/build/client/_app/immutable/nodes/10.dm2dgy31.js.gz +0 -0
  133. package/build/client/_app/immutable/nodes/{15.BFy4oAT6.js → 15.D2I0y3ys.js} +1 -1
  134. package/build/client/_app/immutable/nodes/15.D2I0y3ys.js.br +0 -0
  135. package/build/client/_app/immutable/nodes/15.D2I0y3ys.js.gz +0 -0
  136. package/build/client/_app/immutable/nodes/{17.C6M3Ukek.js → 17.CKxGp0E7.js} +1 -1
  137. package/build/client/_app/immutable/nodes/17.CKxGp0E7.js.br +0 -0
  138. package/build/client/_app/immutable/nodes/17.CKxGp0E7.js.gz +0 -0
  139. package/build/client/_app/immutable/nodes/{18.C7Jynwaf.js → 18.DHJxyQpw.js} +1 -1
  140. package/build/client/_app/immutable/nodes/18.DHJxyQpw.js.br +0 -0
  141. package/build/client/_app/immutable/nodes/18.DHJxyQpw.js.gz +0 -0
  142. package/build/client/_app/immutable/nodes/2.DesR2keg.js +35 -0
  143. package/build/client/_app/immutable/nodes/2.DesR2keg.js.br +0 -0
  144. package/build/client/_app/immutable/nodes/2.DesR2keg.js.gz +0 -0
  145. package/build/client/_app/immutable/nodes/{3.Cldr3PEw.js → 3.BUKrXGR_.js} +1 -1
  146. package/build/client/_app/immutable/nodes/3.BUKrXGR_.js.br +0 -0
  147. package/build/client/_app/immutable/nodes/3.BUKrXGR_.js.gz +0 -0
  148. package/build/client/_app/immutable/nodes/{4.C5HDYxuE.js → 4.C8VxVbVn.js} +1 -1
  149. package/build/client/_app/immutable/nodes/4.C8VxVbVn.js.br +0 -0
  150. package/build/client/_app/immutable/nodes/4.C8VxVbVn.js.gz +0 -0
  151. package/build/client/_app/immutable/nodes/{5.BRZRzqKl.js → 5.BjrnKYaA.js} +1 -1
  152. package/build/client/_app/immutable/nodes/5.BjrnKYaA.js.br +0 -0
  153. package/build/client/_app/immutable/nodes/5.BjrnKYaA.js.gz +0 -0
  154. package/build/client/_app/immutable/nodes/{6.BEjGUOuB.js → 6.C_hEzPrU.js} +1 -1
  155. package/build/client/_app/immutable/nodes/6.C_hEzPrU.js.br +0 -0
  156. package/build/client/_app/immutable/nodes/6.C_hEzPrU.js.gz +0 -0
  157. package/build/client/_app/immutable/nodes/{8.wHpoUA6X.js → 8.BTYaOiDC.js} +1 -1
  158. package/build/client/_app/immutable/nodes/8.BTYaOiDC.js.br +0 -0
  159. package/build/client/_app/immutable/nodes/8.BTYaOiDC.js.gz +0 -0
  160. package/build/client/_app/immutable/nodes/9.DVspuDYY.js +2 -0
  161. package/build/client/_app/immutable/nodes/9.DVspuDYY.js.br +0 -0
  162. package/build/client/_app/immutable/nodes/9.DVspuDYY.js.gz +0 -0
  163. package/build/client/_app/version.json +1 -1
  164. package/build/client/_app/version.json.br +0 -0
  165. package/build/client/_app/version.json.gz +0 -0
  166. package/build/server/chunks/0-D_duQDWy.js +9 -0
  167. package/build/server/chunks/0-D_duQDWy.js.map +1 -0
  168. package/build/server/chunks/1-C0HdTvXW.js +9 -0
  169. package/build/server/chunks/{1-p4jSVKu9.js.map → 1-C0HdTvXW.js.map} +1 -1
  170. package/build/server/chunks/10-DcfhCR4R.js +9 -0
  171. package/build/server/chunks/10-DcfhCR4R.js.map +1 -0
  172. package/build/server/chunks/15-BQcb9C_y.js +9 -0
  173. package/build/server/chunks/{15-BRw8wtLp.js.map → 15-BQcb9C_y.js.map} +1 -1
  174. package/build/server/chunks/17-DuVCTioj.js +9 -0
  175. package/build/server/chunks/17-DuVCTioj.js.map +1 -0
  176. package/build/server/chunks/18-CT0VFW_p.js +9 -0
  177. package/build/server/chunks/18-CT0VFW_p.js.map +1 -0
  178. package/build/server/chunks/2-DgTzKQAP.js +9 -0
  179. package/build/server/chunks/2-DgTzKQAP.js.map +1 -0
  180. package/build/server/chunks/3-eQMSMzXP.js +9 -0
  181. package/build/server/chunks/3-eQMSMzXP.js.map +1 -0
  182. package/build/server/chunks/4-OaAJtDqP.js +9 -0
  183. package/build/server/chunks/4-OaAJtDqP.js.map +1 -0
  184. package/build/server/chunks/5-CBdMutbv.js +9 -0
  185. package/build/server/chunks/{5-D1bI9E9O.js.map → 5-CBdMutbv.js.map} +1 -1
  186. package/build/server/chunks/6-FoEi7ggm.js +9 -0
  187. package/build/server/chunks/{6-BJxJFeJN.js.map → 6-FoEi7ggm.js.map} +1 -1
  188. package/build/server/chunks/8-B44yRkfX.js +9 -0
  189. package/build/server/chunks/8-B44yRkfX.js.map +1 -0
  190. package/build/server/chunks/9-eUjFpHzI.js +9 -0
  191. package/build/server/chunks/9-eUjFpHzI.js.map +1 -0
  192. package/build/server/chunks/{AgentSidebar-C--dGIV5.js → AgentSidebar-BWBnqHnV.js} +4 -4
  193. package/build/server/chunks/{AgentSidebar-C--dGIV5.js.map → AgentSidebar-BWBnqHnV.js.map} +1 -1
  194. package/build/server/chunks/{Button-oIUr2LUP.js → Button-DH7gdU0s.js} +2 -2
  195. package/build/server/chunks/{Button-oIUr2LUP.js.map → Button-DH7gdU0s.js.map} +1 -1
  196. package/build/server/chunks/{ChatStepTrace-CX2Zolmp.js → ChatStepTrace-BivoNYOY.js} +6 -4
  197. package/build/server/chunks/ChatStepTrace-BivoNYOY.js.map +1 -0
  198. package/build/server/chunks/{Dropdown-DfCyYHqi.js → Dropdown-DnARl86Q.js} +2 -2
  199. package/build/server/chunks/{Dropdown-DfCyYHqi.js.map → Dropdown-DnARl86Q.js.map} +1 -1
  200. package/build/server/chunks/{Icon-DadJPtVP.js → Icon-DP1YKCRV.js} +2 -2
  201. package/build/server/chunks/{Icon-DadJPtVP.js.map → Icon-DP1YKCRV.js.map} +1 -1
  202. package/build/server/chunks/{Input-R74u4cO5.js → Input-CUJ9Cg7b.js} +2 -2
  203. package/build/server/chunks/{Input-R74u4cO5.js.map → Input-CUJ9Cg7b.js.map} +1 -1
  204. package/build/server/chunks/{Modal-CAzVFw5x.js → Modal-CGJuNpZ0.js} +21 -9
  205. package/build/server/chunks/{Modal-CAzVFw5x.js.map → Modal-CGJuNpZ0.js.map} +1 -1
  206. package/build/server/chunks/{Panel-D0IY1AzO.js → Panel-zvjxe036.js} +2 -2
  207. package/build/server/chunks/{Panel-D0IY1AzO.js.map → Panel-zvjxe036.js.map} +1 -1
  208. package/build/server/chunks/{Tab-D13L_Up5.js → Tab-CUkyLqbN.js} +4 -4
  209. package/build/server/chunks/{Tab-D13L_Up5.js.map → Tab-CUkyLqbN.js.map} +1 -1
  210. package/build/server/chunks/{_layout.svelte-D4EOIHJJ.js → _layout.svelte-B-0DHjLB.js} +8 -8
  211. package/build/server/chunks/{_layout.svelte-D4EOIHJJ.js.map → _layout.svelte-B-0DHjLB.js.map} +1 -1
  212. package/build/server/chunks/{_layout.svelte-Blfto3jh.js → _layout.svelte-B88WMyk0.js} +681 -31
  213. package/build/server/chunks/_layout.svelte-B88WMyk0.js.map +1 -0
  214. package/build/server/chunks/{_layout.svelte-Dk-9LkfL.js → _layout.svelte-BnrWYuLv.js} +10 -10
  215. package/build/server/chunks/{_layout.svelte-Dk-9LkfL.js.map → _layout.svelte-BnrWYuLv.js.map} +1 -1
  216. package/build/server/chunks/{_layout.svelte-BIMexfnk.js → _layout.svelte-wi6o5Ecu.js} +14 -14
  217. package/build/server/chunks/{_layout.svelte-BIMexfnk.js.map → _layout.svelte-wi6o5Ecu.js.map} +1 -1
  218. package/build/server/chunks/{_page.svelte-DZvcjON6.js → _page.svelte-57pyhszV.js} +10 -10
  219. package/build/server/chunks/{_page.svelte-DZvcjON6.js.map → _page.svelte-57pyhszV.js.map} +1 -1
  220. package/build/server/chunks/{_page.svelte-CY0Be19a.js → _page.svelte-BSVJ2d2G.js} +12 -12
  221. package/build/server/chunks/{_page.svelte-CY0Be19a.js.map → _page.svelte-BSVJ2d2G.js.map} +1 -1
  222. package/build/server/chunks/{_page.svelte-B1erTzoN.js → _page.svelte-BoHt2cpr.js} +5 -5
  223. package/build/server/chunks/{_page.svelte-B1erTzoN.js.map → _page.svelte-BoHt2cpr.js.map} +1 -1
  224. package/build/server/chunks/{_page.svelte-CeO_ScC8.js → _page.svelte-CHgQjBQj.js} +2 -2
  225. package/build/server/chunks/{_page.svelte-CeO_ScC8.js.map → _page.svelte-CHgQjBQj.js.map} +1 -1
  226. package/build/server/chunks/{_page.svelte-CoCBnE2l.js → _page.svelte-CeS_21Ho.js} +11 -11
  227. package/build/server/chunks/{_page.svelte-CoCBnE2l.js.map → _page.svelte-CeS_21Ho.js.map} +1 -1
  228. package/build/server/chunks/{_page.svelte-D5S0QjlI.js → _page.svelte-DHSYVLoj.js} +12 -12
  229. package/build/server/chunks/{_page.svelte-D5S0QjlI.js.map → _page.svelte-DHSYVLoj.js.map} +1 -1
  230. package/build/server/chunks/{_page.svelte-xf-0yXQM.js → _page.svelte-DhFNFMnl.js} +21 -19
  231. package/build/server/chunks/_page.svelte-DhFNFMnl.js.map +1 -0
  232. package/build/server/chunks/{_page.svelte-YoDx7gDL.js → _page.svelte-h_J4lNT9.js} +6 -6
  233. package/build/server/chunks/{_page.svelte-YoDx7gDL.js.map → _page.svelte-h_J4lNT9.js.map} +1 -1
  234. package/build/server/chunks/{agents-context-w03Lz_6n.js → agents-context-CbFsZmi5.js} +2 -2
  235. package/build/server/chunks/{agents-context-w03Lz_6n.js.map → agents-context-CbFsZmi5.js.map} +1 -1
  236. package/build/server/chunks/{client-WFEvX_be.js → client-DO-hqMbT.js} +4 -4
  237. package/build/server/chunks/{client-WFEvX_be.js.map → client-DO-hqMbT.js.map} +1 -1
  238. package/build/server/chunks/{conversation-view-memory-B0PllWRL.js → conversation-view-memory-CtbUZd_L.js} +2 -2
  239. package/build/server/chunks/{conversation-view-memory-B0PllWRL.js.map → conversation-view-memory-CtbUZd_L.js.map} +1 -1
  240. package/build/server/chunks/{edit-workspace-context-biaZqjOf.js → edit-workspace-context-tyHBPujC.js} +2 -2
  241. package/build/server/chunks/{edit-workspace-context-biaZqjOf.js.map → edit-workspace-context-tyHBPujC.js.map} +1 -1
  242. package/build/server/chunks/error.svelte-DmKKN1RU.js +15 -0
  243. package/build/server/chunks/{error.svelte-BjIDhioc.js.map → error.svelte-DmKKN1RU.js.map} +1 -1
  244. package/build/server/chunks/{index-rHCWxLFZ.js → index-LMsd1ih2.js} +2 -2
  245. package/build/server/chunks/{index-rHCWxLFZ.js.map → index-LMsd1ih2.js.map} +1 -1
  246. package/build/server/chunks/{index-server-BMxlf3ZC.js → index-server-BRr5mZEq.js} +2 -2
  247. package/build/server/chunks/{index-server-BMxlf3ZC.js.map → index-server-BRr5mZEq.js.map} +1 -1
  248. package/build/server/chunks/{index2-DdOgqE2_.js → index2-ClgfzZ89.js} +3 -3
  249. package/build/server/chunks/{index2-DdOgqE2_.js.map → index2-ClgfzZ89.js.map} +1 -1
  250. package/build/server/chunks/{index3-DC4GTqD1.js → index3-BdRUAffj.js} +2 -2
  251. package/build/server/chunks/{index3-DC4GTqD1.js.map → index3-BdRUAffj.js.map} +1 -1
  252. package/build/server/chunks/{root-UeqiktJA.js → root-4q2Pr7ck.js} +2 -2
  253. package/build/server/chunks/{root-UeqiktJA.js.map → root-4q2Pr7ck.js.map} +1 -1
  254. package/build/server/chunks/{state.svelte-CLOYXiU6.js → state.svelte-Bd1i-u49.js} +3 -3
  255. package/build/server/chunks/{state.svelte-CLOYXiU6.js.map → state.svelte-Bd1i-u49.js.map} +1 -1
  256. package/build/server/index.js +4 -4
  257. package/build/server/index.js.map +1 -1
  258. package/build/server/manifest.js +14 -14
  259. package/build/server/manifest.js.map +1 -1
  260. package/package.json +1 -1
  261. package/src/backend/lib/apply-v4a-diff.spec.ts +45 -0
  262. package/src/backend/lib/apply-v4a-diff.ts +167 -0
  263. package/src/backend/roleplay/agents.ts +16 -2
  264. package/src/backend/roleplay/old-server.ts +18 -4
  265. package/src/backend/roleplay/prompt-edit-progress.ts +36 -0
  266. package/src/backend/roleplay/prompt-edit-proposals.ts +38 -0
  267. package/src/backend/roleplay/router.ts +63 -15
  268. package/src/backend/roleplay/step-registry.spec.ts +20 -0
  269. package/src/backend/roleplay/step-registry.ts +13 -2
  270. package/src/backend/roleplay/suggest-prompt-edit.ts +163 -0
  271. package/src/backend/roleplay/variants.ts +8 -4
  272. package/src/backend/tests/academy.ts +7 -1
  273. package/src/backend/tests/emulate-agents.spec.ts +106 -0
  274. package/src/backend/tests/emulate-agents.ts +42 -4
  275. package/src/backend/tests/router.ts +10 -2
  276. package/src/lib/components/Modal.svelte +42 -13
  277. package/src/lib/components/Textarea.svelte +41 -0
  278. package/src/lib/edit/edit-workspace-context.ts +12 -0
  279. package/src/lib/ws-message.ts +7 -0
  280. package/build/client/_app/immutable/assets/0.FwR3B_mV.css +0 -1
  281. package/build/client/_app/immutable/assets/0.FwR3B_mV.css.br +0 -0
  282. package/build/client/_app/immutable/assets/0.FwR3B_mV.css.gz +0 -0
  283. package/build/client/_app/immutable/assets/2.DxwYfh1z.css +0 -1
  284. package/build/client/_app/immutable/assets/2.DxwYfh1z.css.br +0 -0
  285. package/build/client/_app/immutable/assets/2.DxwYfh1z.css.gz +0 -0
  286. package/build/client/_app/immutable/assets/Modal.tn0RQdqM.css +0 -0
  287. package/build/client/_app/immutable/assets/Modal.tn0RQdqM.css.br +0 -1
  288. package/build/client/_app/immutable/assets/Modal.tn0RQdqM.css.gz +0 -0
  289. package/build/client/_app/immutable/chunks/07xNIa59.js.br +0 -0
  290. package/build/client/_app/immutable/chunks/07xNIa59.js.gz +0 -0
  291. package/build/client/_app/immutable/chunks/BDl2QuyN.js +0 -1
  292. package/build/client/_app/immutable/chunks/BDl2QuyN.js.br +0 -0
  293. package/build/client/_app/immutable/chunks/BDl2QuyN.js.gz +0 -0
  294. package/build/client/_app/immutable/chunks/BI42X8h_.js.br +0 -0
  295. package/build/client/_app/immutable/chunks/BI42X8h_.js.gz +0 -0
  296. package/build/client/_app/immutable/chunks/BJTwdUYr.js.br +0 -0
  297. package/build/client/_app/immutable/chunks/BJTwdUYr.js.gz +0 -0
  298. package/build/client/_app/immutable/chunks/BLu86SbA.js.br +0 -0
  299. package/build/client/_app/immutable/chunks/BLu86SbA.js.gz +0 -0
  300. package/build/client/_app/immutable/chunks/BNifnXkO.js +0 -1
  301. package/build/client/_app/immutable/chunks/BNifnXkO.js.br +0 -2
  302. package/build/client/_app/immutable/chunks/BNifnXkO.js.gz +0 -0
  303. package/build/client/_app/immutable/chunks/BPNEONy5.js.br +0 -0
  304. package/build/client/_app/immutable/chunks/BPNEONy5.js.gz +0 -0
  305. package/build/client/_app/immutable/chunks/B_K7D6rX.js +0 -2
  306. package/build/client/_app/immutable/chunks/B_K7D6rX.js.br +0 -0
  307. package/build/client/_app/immutable/chunks/B_K7D6rX.js.gz +0 -0
  308. package/build/client/_app/immutable/chunks/BbBuNuSi.js +0 -3
  309. package/build/client/_app/immutable/chunks/BbBuNuSi.js.br +0 -0
  310. package/build/client/_app/immutable/chunks/BbBuNuSi.js.gz +0 -0
  311. package/build/client/_app/immutable/chunks/Bj8jfBTi.js.br +0 -0
  312. package/build/client/_app/immutable/chunks/Bj8jfBTi.js.gz +0 -0
  313. package/build/client/_app/immutable/chunks/BsDZe4N6.js.br +0 -0
  314. package/build/client/_app/immutable/chunks/BsDZe4N6.js.gz +0 -0
  315. package/build/client/_app/immutable/chunks/Buo-57fF.js.br +0 -0
  316. package/build/client/_app/immutable/chunks/Buo-57fF.js.gz +0 -0
  317. package/build/client/_app/immutable/chunks/Bw7xm6iT.js +0 -1
  318. package/build/client/_app/immutable/chunks/Bw7xm6iT.js.br +0 -0
  319. package/build/client/_app/immutable/chunks/Bw7xm6iT.js.gz +0 -0
  320. package/build/client/_app/immutable/chunks/C39ai1md.js.br +0 -0
  321. package/build/client/_app/immutable/chunks/C39ai1md.js.gz +0 -0
  322. package/build/client/_app/immutable/chunks/C7he4XPB.js.br +0 -0
  323. package/build/client/_app/immutable/chunks/C7he4XPB.js.gz +0 -0
  324. package/build/client/_app/immutable/chunks/CAjPRvNs.js.br +0 -0
  325. package/build/client/_app/immutable/chunks/CAjPRvNs.js.gz +0 -0
  326. package/build/client/_app/immutable/chunks/CJYOmGlC.js.br +0 -0
  327. package/build/client/_app/immutable/chunks/CJYOmGlC.js.gz +0 -0
  328. package/build/client/_app/immutable/chunks/CPXdAKdv.js.br +0 -0
  329. package/build/client/_app/immutable/chunks/CPXdAKdv.js.gz +0 -0
  330. package/build/client/_app/immutable/chunks/CVlsAO8k.js.br +0 -0
  331. package/build/client/_app/immutable/chunks/CVlsAO8k.js.gz +0 -0
  332. package/build/client/_app/immutable/chunks/CX0Ekq8t.js.br +0 -0
  333. package/build/client/_app/immutable/chunks/CX0Ekq8t.js.gz +0 -0
  334. package/build/client/_app/immutable/chunks/Ca197UDq.js.gz +0 -0
  335. package/build/client/_app/immutable/chunks/CaHl3dME.js.br +0 -0
  336. package/build/client/_app/immutable/chunks/CaHl3dME.js.gz +0 -0
  337. package/build/client/_app/immutable/chunks/Ce9aG7vY.js.br +0 -0
  338. package/build/client/_app/immutable/chunks/Ce9aG7vY.js.gz +0 -0
  339. package/build/client/_app/immutable/chunks/Cql_e8Of.js +0 -1
  340. package/build/client/_app/immutable/chunks/Cql_e8Of.js.br +0 -2
  341. package/build/client/_app/immutable/chunks/Cql_e8Of.js.gz +0 -0
  342. package/build/client/_app/immutable/chunks/CxLomzuE.js +0 -1
  343. package/build/client/_app/immutable/chunks/CxLomzuE.js.br +0 -0
  344. package/build/client/_app/immutable/chunks/CxLomzuE.js.gz +0 -0
  345. package/build/client/_app/immutable/chunks/Cyai3SOj.js.br +0 -0
  346. package/build/client/_app/immutable/chunks/Cyai3SOj.js.gz +0 -0
  347. package/build/client/_app/immutable/chunks/CyvQWZoe.js +0 -8
  348. package/build/client/_app/immutable/chunks/CyvQWZoe.js.br +0 -0
  349. package/build/client/_app/immutable/chunks/CyvQWZoe.js.gz +0 -0
  350. package/build/client/_app/immutable/chunks/CzXNWL4m.js +0 -1
  351. package/build/client/_app/immutable/chunks/CzXNWL4m.js.br +0 -1
  352. package/build/client/_app/immutable/chunks/CzXNWL4m.js.gz +0 -0
  353. package/build/client/_app/immutable/chunks/D-B5X35l.js.br +0 -0
  354. package/build/client/_app/immutable/chunks/D-B5X35l.js.gz +0 -0
  355. package/build/client/_app/immutable/chunks/DJriQKD9.js.br +0 -0
  356. package/build/client/_app/immutable/chunks/DJriQKD9.js.gz +0 -0
  357. package/build/client/_app/immutable/chunks/DpBxGfau.js +0 -1
  358. package/build/client/_app/immutable/chunks/DpBxGfau.js.br +0 -0
  359. package/build/client/_app/immutable/chunks/DpBxGfau.js.gz +0 -0
  360. package/build/client/_app/immutable/chunks/Dslf9OwW.js.br +0 -0
  361. package/build/client/_app/immutable/chunks/Dslf9OwW.js.gz +0 -0
  362. package/build/client/_app/immutable/chunks/QpaC6J6s.js +0 -1
  363. package/build/client/_app/immutable/chunks/QpaC6J6s.js.br +0 -0
  364. package/build/client/_app/immutable/chunks/QpaC6J6s.js.gz +0 -0
  365. package/build/client/_app/immutable/chunks/iAhzu4tv.js.br +0 -0
  366. package/build/client/_app/immutable/chunks/iAhzu4tv.js.gz +0 -0
  367. package/build/client/_app/immutable/chunks/nYD9wsyN.js.br +0 -0
  368. package/build/client/_app/immutable/chunks/nYD9wsyN.js.gz +0 -0
  369. package/build/client/_app/immutable/chunks/uLGP0py1.js.br +0 -0
  370. package/build/client/_app/immutable/chunks/uLGP0py1.js.gz +0 -0
  371. package/build/client/_app/immutable/entry/app.Ghwm_QxJ.js.br +0 -0
  372. package/build/client/_app/immutable/entry/app.Ghwm_QxJ.js.gz +0 -0
  373. package/build/client/_app/immutable/entry/start.SqT6xQ-7.js +0 -1
  374. package/build/client/_app/immutable/entry/start.SqT6xQ-7.js.br +0 -2
  375. package/build/client/_app/immutable/entry/start.SqT6xQ-7.js.gz +0 -0
  376. package/build/client/_app/immutable/nodes/0.LR7iEcCa.js.br +0 -0
  377. package/build/client/_app/immutable/nodes/0.LR7iEcCa.js.gz +0 -0
  378. package/build/client/_app/immutable/nodes/1.CWSas7JK.js +0 -1
  379. package/build/client/_app/immutable/nodes/1.CWSas7JK.js.br +0 -0
  380. package/build/client/_app/immutable/nodes/1.CWSas7JK.js.gz +0 -0
  381. package/build/client/_app/immutable/nodes/10.BoxFN5Nv.js.br +0 -0
  382. package/build/client/_app/immutable/nodes/10.BoxFN5Nv.js.gz +0 -0
  383. package/build/client/_app/immutable/nodes/15.BFy4oAT6.js.br +0 -0
  384. package/build/client/_app/immutable/nodes/15.BFy4oAT6.js.gz +0 -0
  385. package/build/client/_app/immutable/nodes/17.C6M3Ukek.js.br +0 -0
  386. package/build/client/_app/immutable/nodes/17.C6M3Ukek.js.gz +0 -0
  387. package/build/client/_app/immutable/nodes/18.C7Jynwaf.js.br +0 -0
  388. package/build/client/_app/immutable/nodes/18.C7Jynwaf.js.gz +0 -0
  389. package/build/client/_app/immutable/nodes/2.C9LJ_7n5.js +0 -35
  390. package/build/client/_app/immutable/nodes/2.C9LJ_7n5.js.br +0 -0
  391. package/build/client/_app/immutable/nodes/2.C9LJ_7n5.js.gz +0 -0
  392. package/build/client/_app/immutable/nodes/3.Cldr3PEw.js.br +0 -0
  393. package/build/client/_app/immutable/nodes/3.Cldr3PEw.js.gz +0 -0
  394. package/build/client/_app/immutable/nodes/4.C5HDYxuE.js.br +0 -0
  395. package/build/client/_app/immutable/nodes/4.C5HDYxuE.js.gz +0 -0
  396. package/build/client/_app/immutable/nodes/5.BRZRzqKl.js.br +0 -0
  397. package/build/client/_app/immutable/nodes/5.BRZRzqKl.js.gz +0 -0
  398. package/build/client/_app/immutable/nodes/6.BEjGUOuB.js.br +0 -0
  399. package/build/client/_app/immutable/nodes/6.BEjGUOuB.js.gz +0 -0
  400. package/build/client/_app/immutable/nodes/8.wHpoUA6X.js.br +0 -0
  401. package/build/client/_app/immutable/nodes/8.wHpoUA6X.js.gz +0 -0
  402. package/build/client/_app/immutable/nodes/9.CpmcUS87.js +0 -2
  403. package/build/client/_app/immutable/nodes/9.CpmcUS87.js.br +0 -0
  404. package/build/client/_app/immutable/nodes/9.CpmcUS87.js.gz +0 -0
  405. package/build/server/chunks/0-CesYJG8k.js +0 -9
  406. package/build/server/chunks/0-CesYJG8k.js.map +0 -1
  407. package/build/server/chunks/1-p4jSVKu9.js +0 -9
  408. package/build/server/chunks/10-BVCIK_-n.js +0 -9
  409. package/build/server/chunks/10-BVCIK_-n.js.map +0 -1
  410. package/build/server/chunks/15-BRw8wtLp.js +0 -9
  411. package/build/server/chunks/17-DRS7q3gb.js +0 -9
  412. package/build/server/chunks/17-DRS7q3gb.js.map +0 -1
  413. package/build/server/chunks/18-CPOL7uEZ.js +0 -9
  414. package/build/server/chunks/18-CPOL7uEZ.js.map +0 -1
  415. package/build/server/chunks/2-Cd22UmxM.js +0 -9
  416. package/build/server/chunks/2-Cd22UmxM.js.map +0 -1
  417. package/build/server/chunks/3-mcDvhjv6.js +0 -9
  418. package/build/server/chunks/3-mcDvhjv6.js.map +0 -1
  419. package/build/server/chunks/4-D0D66uQr.js +0 -9
  420. package/build/server/chunks/4-D0D66uQr.js.map +0 -1
  421. package/build/server/chunks/5-D1bI9E9O.js +0 -9
  422. package/build/server/chunks/6-BJxJFeJN.js +0 -9
  423. package/build/server/chunks/8-DBNRpB4j.js +0 -9
  424. package/build/server/chunks/8-DBNRpB4j.js.map +0 -1
  425. package/build/server/chunks/9-Dr21aceD.js +0 -9
  426. package/build/server/chunks/9-Dr21aceD.js.map +0 -1
  427. package/build/server/chunks/ChatStepTrace-CX2Zolmp.js.map +0 -1
  428. package/build/server/chunks/_layout.svelte-Blfto3jh.js.map +0 -1
  429. package/build/server/chunks/_page.svelte-xf-0yXQM.js.map +0 -1
  430. package/build/server/chunks/error.svelte-BjIDhioc.js +0 -15
@@ -1,11 +1,22 @@
1
1
  import type { Logger, StepDef } from '@recombine-ai/engine'
2
2
 
3
- export function createStepRegistry(logger: Logger) {
3
+ export type PromptOverrides = Record<string, string>
4
+
5
+ export function createStepRegistry(logger: Logger, initialOverrides: PromptOverrides = {}) {
4
6
  const steps: StepDef[] = []
7
+ let promptOverrides = { ...initialOverrides }
5
8
  return {
6
9
  addStep(def: StepDef) {
10
+ const originalContent = def.prompt.content.bind(def.prompt)
11
+ def.prompt.content = async () => {
12
+ const override = promptOverrides[def.name]
13
+ return typeof override === 'string' ? override : originalContent()
14
+ }
7
15
  steps.push(def)
8
16
  },
9
- getSteps: () => steps
17
+ getSteps: () => steps,
18
+ setPromptOverrides(next: PromptOverrides) {
19
+ promptOverrides = { ...next }
20
+ }
10
21
  }
11
22
  }
@@ -0,0 +1,163 @@
1
+ import OpenAI from 'openai'
2
+
3
+ import { applyV4ADiff } from '../lib/apply-v4a-diff'
4
+ import type { PromptEditProgressPhase } from './prompt-edit-progress'
5
+
6
+ const MODEL = 'gpt-5.4'
7
+ const VIRTUAL_PROMPT_PATH = 'prompt.md'
8
+ const MAX_PATCH_ROUNDS = 8
9
+
10
+ type ApplyPatchCall = {
11
+ type: 'apply_patch_call'
12
+ call_id: string
13
+ operation: {
14
+ type: 'create_file' | 'update_file' | 'delete_file'
15
+ path: string
16
+ diff?: string
17
+ }
18
+ }
19
+
20
+ export async function suggestPromptEdit(input: {
21
+ request: string
22
+ originalPrompt: string
23
+ onProgress?: (progress: {
24
+ phase: PromptEditProgressPhase
25
+ activity: number
26
+ summary: string
27
+ }) => void
28
+ }): Promise<string> {
29
+ const apiKey = process.env.OPENAI_API_KEY
30
+ if (!apiKey) throw new Error('OPENAI_API_KEY is not set')
31
+
32
+ const client = new OpenAI({ apiKey })
33
+ let virtualPrompt = input.originalPrompt
34
+ let activity = 0
35
+ let modelRound = 0
36
+ let reasoningSummary = ''
37
+ const handleEvent = (event: any) => {
38
+ activity += 1
39
+ if (
40
+ event?.type === 'response.reasoning_summary_text.delta' &&
41
+ typeof event.delta === 'string'
42
+ ) {
43
+ reasoningSummary += event.delta
44
+ }
45
+ input.onProgress?.({
46
+ phase: progressPhase(event, modelRound),
47
+ activity,
48
+ summary: reasoningSummary.trim()
49
+ })
50
+ }
51
+ let response = await createResponse(client, {
52
+ input: buildPrompt(input.request, input.originalPrompt),
53
+ onEvent: handleEvent
54
+ })
55
+
56
+ for (let patchRound = 0; patchRound < MAX_PATCH_ROUNDS; patchRound += 1) {
57
+ const patchCalls = (response.output as unknown as ApplyPatchCall[]).filter(
58
+ (item) => item?.type === 'apply_patch_call'
59
+ )
60
+ if (!patchCalls.length) return virtualPrompt
61
+
62
+ const outputs = patchCalls.map((call) => {
63
+ try {
64
+ virtualPrompt = applyPromptOperation(virtualPrompt, call.operation)
65
+ return {
66
+ type: 'apply_patch_call_output',
67
+ call_id: call.call_id,
68
+ status: 'completed',
69
+ output: `Updated ${VIRTUAL_PROMPT_PATH} in memory`
70
+ }
71
+ } catch (error) {
72
+ return {
73
+ type: 'apply_patch_call_output',
74
+ call_id: call.call_id,
75
+ status: 'failed',
76
+ output: error instanceof Error ? error.message : String(error)
77
+ }
78
+ }
79
+ })
80
+
81
+ reasoningSummary = ''
82
+ input.onProgress?.({ phase: 'reviewing', activity, summary: '' })
83
+ modelRound += 1
84
+ response = await createResponse(client, {
85
+ previousResponseId: response.id,
86
+ input: outputs,
87
+ onEvent: handleEvent
88
+ })
89
+ }
90
+
91
+ throw new Error('The model did not finish editing the prompt')
92
+ }
93
+
94
+ function buildPrompt(request: string, originalPrompt: string): string {
95
+ return `The user is asking you to modify an LLM prompt given below. Try and make minimal changes. You are not allowed to change the shape of variables, their names or their set - this is set outside.
96
+
97
+ This is their request:
98
+ ${request}
99
+
100
+ This is the original prompt:
101
+ ${originalPrompt}
102
+ `
103
+ }
104
+
105
+ async function createResponse(
106
+ client: OpenAI,
107
+ input: { input: unknown; previousResponseId?: string; onEvent: (event: any) => void }
108
+ ): Promise<any> {
109
+ const stream = await (client.responses.create as any)({
110
+ model: MODEL,
111
+ instructions:
112
+ 'The original prompt is the existing virtual file prompt.md. Use the Apply Patch tool to make the requested edit to that file. Do not create, delete, or modify any other file.',
113
+ input: input.input,
114
+ ...(input.previousResponseId ? { previous_response_id: input.previousResponseId } : {}),
115
+ tools: [{ type: 'apply_patch' }],
116
+ reasoning: { effort: 'xhigh', summary: 'auto' },
117
+ text: { verbosity: 'low' },
118
+ stream: true
119
+ })
120
+
121
+ let completedResponse: any = null
122
+ for await (const event of stream as AsyncIterable<any>) {
123
+ input.onEvent(event)
124
+ if (event?.type === 'response.completed') completedResponse = event.response
125
+ if (event?.type === 'response.failed') {
126
+ throw new Error(event.response?.error?.message || 'OpenAI failed to suggest prompt edits')
127
+ }
128
+ if (event?.type === 'response.incomplete') {
129
+ throw new Error('OpenAI returned an incomplete prompt edit')
130
+ }
131
+ if (event?.type === 'error') throw new Error(event.message || 'OpenAI streaming failed')
132
+ }
133
+
134
+ if (!completedResponse) throw new Error('OpenAI stream ended before the prompt edit completed')
135
+ return completedResponse
136
+ }
137
+
138
+ function progressPhase(event: any, round: number): PromptEditProgressPhase {
139
+ const eventType = String(event?.type || '')
140
+ const itemType = String(event?.item?.type || '')
141
+ if (eventType.includes('apply_patch') || itemType === 'apply_patch_call') return 'drafting'
142
+ return round > 0 ? 'reviewing' : 'thinking'
143
+ }
144
+
145
+ function applyPromptOperation(
146
+ currentPrompt: string,
147
+ operation: ApplyPatchCall['operation']
148
+ ): string {
149
+ const normalizedPath = String(operation.path || '')
150
+ .replace(/\\/g, '/')
151
+ .replace(/^\.\//, '')
152
+ .replace(/^\//, '')
153
+ if (normalizedPath !== VIRTUAL_PROMPT_PATH) {
154
+ throw new Error(`Only ${VIRTUAL_PROMPT_PATH} may be edited`)
155
+ }
156
+ if (operation.type !== 'update_file') {
157
+ throw new Error(`${VIRTUAL_PROMPT_PATH} already exists and may only be updated`)
158
+ }
159
+ if (typeof operation.diff !== 'string' || !operation.diff.trim()) {
160
+ throw new Error('Apply Patch returned an empty diff')
161
+ }
162
+ return applyV4ADiff(currentPrompt, operation.diff)
163
+ }
@@ -18,6 +18,7 @@ import type { AgentState } from './agents'
18
18
  import { createLogger } from './logger'
19
19
  import { createScheduler } from './scheduler'
20
20
  import { createStepRegistry } from './step-registry'
21
+ import type { PromptOverrides } from './step-registry'
21
22
 
22
23
  export type GeneratedVariant = {
23
24
  text: string
@@ -30,8 +31,9 @@ export async function generateReplyVariants(props: {
30
31
  states: AgentState[]
31
32
  count: number
32
33
  context: Record<string, any>
34
+ promptOverrides?: PromptOverrides
33
35
  }): Promise<GeneratedVariant[]> {
34
- const { agentId, region, states, count, context } = props
36
+ const { agentId, region, states, count, context, promptOverrides = {} } = props
35
37
  if (!Number.isFinite(count) || count <= 0) return []
36
38
  const targetState = states.at(-1)
37
39
  if (!targetState) throw new Error('No saved roleplay state found for variants')
@@ -61,7 +63,8 @@ export async function generateReplyVariants(props: {
61
63
  context,
62
64
  prevState,
63
65
  statesById,
64
- message
66
+ message,
67
+ promptOverrides
65
68
  })
66
69
  )
67
70
  )
@@ -161,8 +164,9 @@ async function generateSingleReplyVariant(props: {
161
164
  prevState: AgentState | null
162
165
  statesById: Map<string, AgentState>
163
166
  message: Message
167
+ promptOverrides: PromptOverrides
164
168
  }): Promise<GeneratedVariant> {
165
- const { index, factory, region, context, prevState, statesById, message } = props
169
+ const { index, factory, region, context, prevState, statesById, message, promptOverrides } = props
166
170
 
167
171
  const state = createVariantState(prevState?.id ?? null, index)
168
172
  const scheduleSeed = clone(prevState?.schedule ?? {})
@@ -179,7 +183,7 @@ async function generateSingleReplyVariant(props: {
179
183
  logger,
180
184
  onUpdate: () => {}
181
185
  })
182
- const stepRegistry = createStepRegistry(logger)
186
+ const stepRegistry = createStepRegistry(logger, promptOverrides)
183
187
  const stepTracer: StepTracer = {
184
188
  addStepTrace: (trace: StepTrace) => {
185
189
  state.history.push({
@@ -140,13 +140,15 @@ export function cancelPromptTests(suiteKey: string): boolean {
140
140
  export async function runPromptTestsManaged(
141
141
  suite: SuiteSelection,
142
142
  selection: PromptTestsSelection,
143
- requestedConfig: PromptTestsRunConfig
143
+ requestedConfig: PromptTestsRunConfig,
144
+ promptOverrides: Record<string, string> = {}
144
145
  ): Promise<WrittenRunReport> {
145
146
  const run = activeRuns.start(suite.suiteKey)
146
147
  if (!run) throw new Error('Tests already running for this agent')
147
148
  try {
148
149
  return await runPromptTests(suite, selection, requestedConfig, {
149
150
  signal: run.controller.signal,
151
+ promptOverrides,
150
152
  setProgress: (progress) => activeRuns.setProgress(suite.suiteKey, run, progress)
151
153
  })
152
154
  } finally {
@@ -303,6 +305,7 @@ export class RecombineAgentProvider implements ApiProvider {
303
305
  context: Context
304
306
  mocks?: Context
305
307
  step?: string
308
+ promptOverrides?: Record<string, string>
306
309
  }
307
310
  const testId = String(vars.testId ?? '')
308
311
  if (testId) this.onTestStarted?.(testId)
@@ -415,6 +418,7 @@ export class RecombineAgentProvider implements ApiProvider {
415
418
  logger,
416
419
  context: vars.context || {},
417
420
  mocks: vars.mocks,
421
+ promptOverrides: vars.promptOverrides,
418
422
  abortSignal: this.abortSignal,
419
423
  ...(isMainStepName(targetStep)
420
424
  ? {}
@@ -614,6 +618,7 @@ export async function runPromptTests(
614
618
  requestedConfig: PromptTestsRunConfig,
615
619
  opts?: {
616
620
  signal?: AbortSignal
621
+ promptOverrides?: Record<string, string>
617
622
  setProgress?: (progress: MutablePromptTestsProgress) => boolean
618
623
  }
619
624
  ): Promise<WrittenRunReport> {
@@ -686,6 +691,7 @@ export async function runPromptTests(
686
691
  ...(suite.region ? { region: suite.region } : {}),
687
692
  context: test.context,
688
693
  step: test.step,
694
+ promptOverrides: opts?.promptOverrides ?? {},
689
695
  ...(typeof test.mocks !== 'undefined' ? { mocks: test.mocks } : {}),
690
696
  conversation: test.conversation,
691
697
  stringifiedConversation: test.stringifiedConversation,
@@ -0,0 +1,106 @@
1
+ import type { TestAgentFactory, TestAgentFactoryProps } from '@recombine-ai/bosun-lib'
2
+ import { beforeEach, describe, expect, it, vi } from 'vitest'
3
+
4
+ const getAgentFactories = vi.hoisted(() => vi.fn())
5
+
6
+ vi.mock('../lib/get-agent-factories', () => ({ getAgentFactories }))
7
+ vi.mock('../lib/get-import-nonce', () => ({ getImportNonce: () => 1 }))
8
+ vi.mock('../lib/get-root-path', () => ({ getRootPath: async () => '/project/workflows.ts' }))
9
+
10
+ import { loadAgents } from './emulate-agents'
11
+
12
+ function textAgent(start: () => Promise<void>) {
13
+ return {
14
+ start,
15
+ respondToMessage: async () => {},
16
+ reactOnMessage: async () => {},
17
+ isAssigned: async () => true,
18
+ onFatalError: async () => {}
19
+ }
20
+ }
21
+
22
+ async function run(factory: TestAgentFactory, props: Partial<Parameters<typeof loadAgents>[0]>) {
23
+ getAgentFactories.mockResolvedValue({ factories: { agent: factory } })
24
+ await loadAgents({
25
+ agentId: 'agent',
26
+ getMessages: () => [{ sender: 'user', text: 'Hello' }],
27
+ sendMessage: async () => {},
28
+ stepTracer: { addStepTrace: () => {}, flush: async () => {} },
29
+ ...props
30
+ })
31
+ }
32
+
33
+ describe('test agent context lifecycle', () => {
34
+ beforeEach(() => getAgentFactories.mockReset())
35
+
36
+ it('seeds trace context before creating the adapter factory', async () => {
37
+ let factoryContext: Record<string, unknown> | undefined
38
+ let lifecycleContext: Record<string, unknown> | undefined
39
+ const traceContext = {
40
+ meta: { bookingId: 'trace-booking' },
41
+ state: { customerName: 'Trace customer' }
42
+ }
43
+ const factory: TestAgentFactory = async (props) => {
44
+ factoryContext = structuredClone(props.ctx.get())
45
+ props.ctx.set({ meta: { bookingId: 'adapter-default' } })
46
+ return textAgent(async () => {
47
+ lifecycleContext = structuredClone(props.ctx.get())
48
+ })
49
+ }
50
+
51
+ await run(factory, { context: traceContext, region: 'en-gb' })
52
+
53
+ expect(factoryContext).toEqual({
54
+ ...traceContext,
55
+ recombineRegion: 'en-gb'
56
+ })
57
+ expect(lifecycleContext).toEqual(factoryContext)
58
+ })
59
+
60
+ it('restores test agent data after factory initialization and retains adapter mocks', async () => {
61
+ let lifecycleContext: Record<string, unknown> | undefined
62
+ const adapterMocks = { getJob: { status: 200 } }
63
+ const traceContext = {
64
+ state: {
65
+ jobCard: { 'Mobile or Base booking': 'M' },
66
+ currentDate: '2026-08-07'
67
+ }
68
+ }
69
+ const factory: TestAgentFactory = async (props: TestAgentFactoryProps<Record<string, any>>) => {
70
+ props.ctx.set(['state', 'jobCard', 'Mobile or Base booking'], 'adapter-mutated')
71
+ props.ctx.set({
72
+ state: { jobCard: {}, currentDate: '2025-10-26' },
73
+ mocks: adapterMocks
74
+ })
75
+ return textAgent(async () => {
76
+ lifecycleContext = props.ctx.get()
77
+ })
78
+ }
79
+
80
+ await run(factory, { context: traceContext })
81
+
82
+ expect(lifecycleContext).toEqual({ ...traceContext, mocks: adapterMocks })
83
+ })
84
+
85
+ it('keeps explicit test mocks authoritative in split context', async () => {
86
+ let factoryContext: Record<string, unknown> | undefined
87
+ let lifecycleContext: Record<string, unknown> | undefined
88
+ const traceContext = { meta: { bookingId: 'trace-booking' } }
89
+ const testMocks = { getBooking: { id: 'trace-booking' } }
90
+ const factory: TestAgentFactory = async (props) => {
91
+ factoryContext = structuredClone(props.ctx.get())
92
+ props.ctx.set({
93
+ context: { meta: { bookingId: 'adapter-default' } },
94
+ mocks: { getBooking: { id: 'adapter-default' } }
95
+ })
96
+ return textAgent(async () => {
97
+ lifecycleContext = structuredClone(props.ctx.get())
98
+ })
99
+ }
100
+
101
+ await run(factory, { context: traceContext, mocks: testMocks })
102
+
103
+ expect(factoryContext).toEqual({ context: traceContext, mocks: testMocks })
104
+ expect(lifecycleContext).toEqual(factoryContext)
105
+ })
106
+ })
@@ -21,6 +21,7 @@ export async function loadAgents(props: {
21
21
  logger?: Logger
22
22
  context?: Record<string, unknown>
23
23
  mocks?: Record<string, unknown>
24
+ promptOverrides?: Record<string, string>
24
25
  abortSignal?: AbortSignal
25
26
  onBeforeTestResponse?: () => void
26
27
  testStep?: {
@@ -38,6 +39,7 @@ export async function loadAgents(props: {
38
39
  logger: providedLogger,
39
40
  context,
40
41
  mocks,
42
+ promptOverrides = {},
41
43
  abortSignal,
42
44
  onBeforeTestResponse,
43
45
  testStep
@@ -61,7 +63,13 @@ export async function loadAgents(props: {
61
63
 
62
64
  const testSteps = new Map<string, RegisteredTestStep>()
63
65
  const stepRegistry: TestStepRegistry = {
64
- addStep: () => {},
66
+ addStep(step) {
67
+ const originalContent = step.prompt.content.bind(step.prompt)
68
+ step.prompt.content = async () => {
69
+ const override = promptOverrides[step.name]
70
+ return typeof override === 'string' ? override : originalContent()
71
+ }
72
+ },
65
73
  addTestStep(step: RegisteredTestStep) {
66
74
  // Step names are the current test identity. Preserve the first registration until
67
75
  // workflow IDs become part of the persisted target.
@@ -74,14 +82,19 @@ export async function loadAgents(props: {
74
82
  mocks !== null &&
75
83
  typeof mocks === 'object' &&
76
84
  !Array.isArray(mocks)
77
- const providedContext = context && typeof context === 'object' ? context : {}
78
- const runtimeContext = region
85
+ const providedContext = isRecord(context) ? clone(context) : {}
86
+ const testContext = region
79
87
  ? {
80
88
  ...providedContext,
81
89
  recombineRegion: providedContext.recombineRegion ?? region
82
90
  }
83
91
  : providedContext
84
- const ctx = createContext(hasSplitContext ? { context: runtimeContext, mocks } : runtimeContext)
92
+ const testMocks = hasSplitContext ? clone(mocks) : undefined
93
+ // The factory may mutate nested values in place, so seed it with a separate clone from the
94
+ // authoritative test snapshot that will be restored before the agent lifecycle starts.
95
+ const ctx = createContext(
96
+ hasSplitContext ? { context: clone(testContext), mocks: clone(testMocks) } : clone(testContext)
97
+ )
85
98
 
86
99
  // Maintain in-run history so sendMessage appends to it, mirroring backend behavior
87
100
  let history: Message[] = []
@@ -112,6 +125,23 @@ export async function loadAgents(props: {
112
125
  })
113
126
  )
114
127
 
128
+ // Project factories need the test context while they are being created (for example, to
129
+ // resolve regional config), but some factories also install their own default context. Keep
130
+ // only an adapter-provided mocks namespace and make the test case authoritative for agent data.
131
+ const factoryRuntime = isRecord(ctx.get()) ? ctx.get() : {}
132
+ if (hasSplitContext) {
133
+ ctx.swap({ context: clone(testContext), mocks: clone(testMocks) })
134
+ } else if (isRecord(factoryRuntime.mocks)) {
135
+ const restoredContext = clone(testContext)
136
+ ctx.swap(
137
+ isRecord(factoryRuntime.context)
138
+ ? { context: restoredContext, mocks: factoryRuntime.mocks }
139
+ : { ...restoredContext, mocks: factoryRuntime.mocks }
140
+ )
141
+ } else {
142
+ ctx.swap(clone(testContext))
143
+ }
144
+
115
145
  const withAbort = wrapAbort(abortSignal)
116
146
 
117
147
  try {
@@ -170,6 +200,14 @@ function isVoiceAgent(agent: TestAgent): agent is TestVoiceAgent {
170
200
  return 'streamResponse' in agent
171
201
  }
172
202
 
203
+ function isRecord(value: unknown): value is Record<string, unknown> {
204
+ return value !== null && typeof value === 'object' && !Array.isArray(value)
205
+ }
206
+
207
+ function clone<T>(value: T): T {
208
+ return structuredClone(value)
209
+ }
210
+
173
211
  function wrapAbort(abortSignal: AbortSignal | undefined) {
174
212
  return async <T>(p: Promise<T>): Promise<T> => {
175
213
  if (!abortSignal) return p
@@ -261,6 +261,7 @@ export function createTestsRouter(t: TRPCRootObject<TrpcContext, any, any>) {
261
261
  region: z.string().nullish(),
262
262
  step: z.string(),
263
263
  scope: z.enum(['pinned', 'all']).optional(),
264
+ promptOverrides: z.record(z.string(), z.string().max(1_000_000)).optional(),
264
265
  repeats: z.number().int().min(1).max(500),
265
266
  concurrency: z.number().int().min(1).max(75)
266
267
  })
@@ -270,6 +271,7 @@ export function createTestsRouter(t: TRPCRootObject<TrpcContext, any, any>) {
270
271
  agent: z.string(),
271
272
  region: z.string().nullish(),
272
273
  testId: z.string(),
274
+ promptOverrides: z.record(z.string(), z.string().max(1_000_000)).optional(),
273
275
  repeats: z.number().int().min(1).max(500),
274
276
  concurrency: z.number().int().min(1).max(75)
275
277
  })
@@ -280,7 +282,12 @@ export function createTestsRouter(t: TRPCRootObject<TrpcContext, any, any>) {
280
282
  const selection = await resolveSuiteSelection(input.agent, input.region)
281
283
  const runConfig = { repeats: input.repeats, concurrency: input.concurrency }
282
284
  if ('testId' in input) {
283
- return runPromptTestsManaged(selection, { testId: input.testId }, runConfig)
285
+ return runPromptTestsManaged(
286
+ selection,
287
+ { testId: input.testId },
288
+ runConfig,
289
+ input.promptOverrides
290
+ )
284
291
  }
285
292
  return runPromptTestsManaged(
286
293
  selection,
@@ -288,7 +295,8 @@ export function createTestsRouter(t: TRPCRootObject<TrpcContext, any, any>) {
288
295
  scope: input.scope ?? 'pinned',
289
296
  step: input.step
290
297
  },
291
- runConfig
298
+ runConfig,
299
+ input.promptOverrides
292
300
  )
293
301
  }),
294
302
  cancelRun: t.procedure
@@ -6,40 +6,69 @@
6
6
  open?: boolean
7
7
  title?: string
8
8
  class?: string
9
+ overlayClass?: string
9
10
  children?: Snippet
10
11
  footer?: Snippet
12
+ underlay?: Snippet
13
+ underlayOpen?: boolean
11
14
  }
12
15
 
13
16
  let {
14
17
  open = $bindable(false),
15
18
  title = '',
16
19
  class: className = '',
20
+ overlayClass = '',
17
21
  children,
18
- footer
22
+ footer,
23
+ underlay,
24
+ underlayOpen = false
19
25
  }: Props = $props()
20
26
  </script>
21
27
 
22
28
  <Dialog.Root bind:open>
23
29
  <Dialog.Portal>
24
- <Dialog.Overlay class="fixed inset-0 z-50 bg-black/60" />
30
+ <Dialog.Overlay class={'fixed inset-0 z-50 bg-black/60 ' + overlayClass} />
25
31
  <Dialog.Content
26
- class={'fixed left-1/2 top-1/2 z-50 max-h-[90vh] w-[95vw] max-w-6xl -translate-x-1/2 -translate-y-1/2 overflow-hidden rounded-lg border border-rc-gray-600 bg-rc-gray-800 shadow-xl ' +
32
+ class={'fixed left-1/2 top-1/2 z-50 max-h-[90vh] w-[95vw] max-w-6xl -translate-x-1/2 -translate-y-1/2 overflow-visible ' +
27
33
  className}
28
34
  >
29
- <div class="flex items-center justify-between border-b border-rc-gray-600 px-4 py-3">
30
- <Dialog.Title class="text-lg font-semibold text-gray-100">{title}</Dialog.Title>
31
- <Dialog.Close class="text-gray-400 hover:text-gray-200" aria-label="Close">✕</Dialog.Close>
32
- </div>
33
- <div class="rc-scroll max-h-[calc(90vh-7rem)] overflow-auto p-4">
34
- {@render children?.()}
35
- </div>
36
- <div class="flex items-center justify-end gap-3 border-t border-rc-gray-600 px-4 py-3">
37
- {@render footer?.()}
35
+ <div class="overflow-hidden rounded-lg border border-rc-gray-600 bg-rc-gray-800 shadow-xl">
36
+ <div class="flex items-center justify-between border-b border-rc-gray-600 px-4 py-3">
37
+ <Dialog.Title class="text-lg font-semibold text-gray-100">{title}</Dialog.Title>
38
+ <Dialog.Close class="text-gray-400 hover:text-gray-200" aria-label="Close">✕</Dialog.Close
39
+ >
40
+ </div>
41
+ <div class="rc-scroll max-h-[calc(90vh-7rem)] overflow-auto p-4">
42
+ {@render children?.()}
43
+ </div>
44
+ <div class="flex items-center justify-end gap-3 border-t border-rc-gray-600 px-4 py-3">
45
+ {@render footer?.()}
46
+ </div>
38
47
  </div>
48
+ {#if underlayOpen && underlay}
49
+ <div
50
+ class="modal-underlay absolute left-0 right-0 top-full -z-10 overflow-hidden rounded-b-lg border border-t-0 border-rc-gray-600 bg-rc-gray-800 px-4 py-2.5 shadow-xl"
51
+ >
52
+ {@render underlay()}
53
+ </div>
54
+ {/if}
39
55
  </Dialog.Content>
40
56
  </Dialog.Portal>
41
57
  </Dialog.Root>
42
58
 
43
59
  <style>
44
- /* No extra styles - rely on Tailwind classes */
60
+ .modal-underlay {
61
+ animation: modal-underlay-in 180ms ease-out both;
62
+ }
63
+
64
+ @keyframes modal-underlay-in {
65
+ from {
66
+ opacity: 0;
67
+ transform: translateY(-100%);
68
+ }
69
+ to {
70
+ opacity: 1;
71
+ transform: translateY(0);
72
+ }
73
+ }
45
74
  </style>
@@ -0,0 +1,41 @@
1
+ <script lang="ts">
2
+ import type { HTMLTextareaAttributes } from 'svelte/elements'
3
+
4
+ type TextareaVariant = 'chat' | 'config'
5
+
6
+ interface Props extends HTMLTextareaAttributes {
7
+ class?: string
8
+ value?: string
9
+ variant?: TextareaVariant
10
+ el?: HTMLTextAreaElement | null
11
+ }
12
+
13
+ let {
14
+ class: className = '',
15
+ value = $bindable(''),
16
+ variant = 'config',
17
+ el = $bindable(),
18
+ ...rest
19
+ }: Props = $props()
20
+
21
+ let classes = $derived(
22
+ variant === 'chat' ? `textarea-chat ${className}` : `textarea-config ${className}`
23
+ )
24
+ </script>
25
+
26
+ <textarea bind:value bind:this={el} class={classes} {...rest}></textarea>
27
+
28
+ <style lang="postcss">
29
+ .textarea-chat {
30
+ @apply block w-full appearance-none rounded-lg border border-rc-gray-110 bg-rc-gray-930 p-3 shadow-inner-white-soft backdrop-blur-3xl;
31
+ @apply font-semibold text-rc-gray-100 placeholder-rc-gray-300 caret-rc-gray-100;
32
+ @apply transition-colors duration-100 hover:border-gray-500 focus:border-gray-500 disabled:pointer-events-none;
33
+ @apply focus:outline-none focus:ring-0;
34
+ }
35
+
36
+ .textarea-config {
37
+ @apply w-full resize-y rounded-lg border border-rc-gray-110 bg-rc-gray-980 px-3 py-2 font-semibold text-rc-gray-200 placeholder:text-rc-gray-400;
38
+ @apply hover:bg-double-gradient focus:border-gray-500 focus:bg-double-gradient focus:outline-none focus:ring-0 active:bg-double-gradient disabled:pointer-events-none;
39
+ color-scheme: dark;
40
+ }
41
+ </style>
@@ -4,6 +4,15 @@ import type { Message } from '@recombine-ai/engine'
4
4
  import type { AgentSateHeader, AppEvent, StepDef } from '$lib/ws-message'
5
5
  import type { EditState, PopoverKind, QuoteCount } from './edit-vm'
6
6
 
7
+ export interface PendingPromptEdit {
8
+ id: string
9
+ agentId: string
10
+ step: string
11
+ originalPrompt: string
12
+ suggestedPrompt: string
13
+ createdAt: number
14
+ }
15
+
7
16
  export interface EditWorkspaceState {
8
17
  agentId: string
9
18
  region: string | null
@@ -16,6 +25,7 @@ export interface EditWorkspaceState {
16
25
  steps: StepDef[]
17
26
  currentStep: StepDef | null
18
27
  promptDrafts: Record<string, string>
28
+ promptEdits: Record<string, PendingPromptEdit>
19
29
  context: Record<string, any> | null
20
30
  promptContext: Record<string, any> | null
21
31
  agentStates: AgentSateHeader[]
@@ -44,6 +54,8 @@ export interface EditWorkspaceActions {
44
54
  sendChatMessage: (message: Message) => void
45
55
  selectState: (stateId: string | null) => void
46
56
  flushPromptSave: () => Promise<void>
57
+ getPromptOverrides: () => Record<string, string>
58
+ getActivePromptEditId: () => string | null
47
59
  hangup: () => void
48
60
  }
49
61