@recombine-ai/bosun 0.3.11 → 0.4.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 (434) hide show
  1. package/build/client/_app/immutable/assets/0.B5gApcUL.css +1 -0
  2. package/build/client/_app/immutable/assets/0.B5gApcUL.css.br +0 -0
  3. package/build/client/_app/immutable/assets/0.B5gApcUL.css.gz +0 -0
  4. package/build/client/_app/immutable/chunks/8B3OPwlB.js +1 -0
  5. package/build/client/_app/immutable/chunks/8B3OPwlB.js.br +2 -0
  6. package/build/client/_app/immutable/chunks/8B3OPwlB.js.gz +0 -0
  7. package/build/client/_app/immutable/chunks/B3ux6SZZ.js +1 -0
  8. package/build/client/_app/immutable/chunks/B3ux6SZZ.js.br +0 -0
  9. package/build/client/_app/immutable/chunks/B3ux6SZZ.js.gz +0 -0
  10. package/build/client/_app/immutable/chunks/B5-6Ezv3.js +1 -0
  11. package/build/client/_app/immutable/chunks/B5-6Ezv3.js.br +2 -0
  12. package/build/client/_app/immutable/chunks/B5-6Ezv3.js.gz +0 -0
  13. package/build/client/_app/immutable/chunks/BA8mqPb-.js +1 -0
  14. package/build/client/_app/immutable/chunks/BA8mqPb-.js.br +0 -0
  15. package/build/client/_app/immutable/chunks/BA8mqPb-.js.gz +0 -0
  16. package/build/client/_app/immutable/chunks/BCG4zvjp.js +2 -0
  17. package/build/client/_app/immutable/chunks/BCG4zvjp.js.br +0 -0
  18. package/build/client/_app/immutable/chunks/BCG4zvjp.js.gz +0 -0
  19. package/build/client/_app/immutable/chunks/{oeB0PCTX.js → BMYSavKM.js} +1 -1
  20. package/build/client/_app/immutable/chunks/BMYSavKM.js.br +0 -0
  21. package/build/client/_app/immutable/chunks/BMYSavKM.js.gz +0 -0
  22. package/build/client/_app/immutable/chunks/{TO5ESkEd.js → BY8d35y9.js} +1 -1
  23. package/build/client/_app/immutable/chunks/BY8d35y9.js.br +0 -0
  24. package/build/client/_app/immutable/chunks/BY8d35y9.js.gz +0 -0
  25. package/build/client/_app/immutable/chunks/{CFwu9ET3.js → BdZ7JhAm.js} +1 -1
  26. package/build/client/_app/immutable/chunks/BdZ7JhAm.js.br +0 -0
  27. package/build/client/_app/immutable/chunks/BdZ7JhAm.js.gz +0 -0
  28. package/build/client/_app/immutable/chunks/{BWo2H__f.js → BmadykGs.js} +3 -3
  29. package/build/client/_app/immutable/chunks/BmadykGs.js.br +0 -0
  30. package/build/client/_app/immutable/chunks/BmadykGs.js.gz +0 -0
  31. package/build/client/_app/immutable/chunks/Bmb8cHfR.js +1 -0
  32. package/build/client/_app/immutable/chunks/Bmb8cHfR.js.br +0 -0
  33. package/build/client/_app/immutable/chunks/Bmb8cHfR.js.gz +0 -0
  34. package/build/client/_app/immutable/chunks/Bx2X1niE.js +1 -0
  35. package/build/client/_app/immutable/chunks/Bx2X1niE.js.br +2 -0
  36. package/build/client/_app/immutable/chunks/Bx2X1niE.js.gz +0 -0
  37. package/build/client/_app/immutable/chunks/C-xhOnoy.js +1 -0
  38. package/build/client/_app/immutable/chunks/C-xhOnoy.js.br +0 -0
  39. package/build/client/_app/immutable/chunks/C-xhOnoy.js.gz +0 -0
  40. package/build/client/_app/immutable/chunks/C1FmrZbK.js +1 -0
  41. package/build/client/_app/immutable/chunks/C1FmrZbK.js.br +0 -0
  42. package/build/client/_app/immutable/chunks/C1FmrZbK.js.gz +0 -0
  43. package/build/client/_app/immutable/chunks/{Bdb5tyDH.js → C4mbwMvt.js} +1 -1
  44. package/build/client/_app/immutable/chunks/C4mbwMvt.js.br +0 -0
  45. package/build/client/_app/immutable/chunks/C4mbwMvt.js.gz +0 -0
  46. package/build/client/_app/immutable/chunks/C5HWpeo9.js +1 -0
  47. package/build/client/_app/immutable/chunks/C5HWpeo9.js.br +0 -0
  48. package/build/client/_app/immutable/chunks/C5HWpeo9.js.gz +0 -0
  49. package/build/client/_app/immutable/chunks/{CdzpH-Ca.js → CAFoob5N.js} +1 -1
  50. package/build/client/_app/immutable/chunks/CAFoob5N.js.br +0 -0
  51. package/build/client/_app/immutable/chunks/CAFoob5N.js.gz +0 -0
  52. package/build/client/_app/immutable/chunks/{Bk1rEq7o.js → CGinwM47.js} +1 -1
  53. package/build/client/_app/immutable/chunks/CGinwM47.js.br +0 -0
  54. package/build/client/_app/immutable/chunks/CGinwM47.js.gz +0 -0
  55. package/build/client/_app/immutable/chunks/CI-reiW2.js +1 -0
  56. package/build/client/_app/immutable/chunks/CI-reiW2.js.br +0 -0
  57. package/build/client/_app/immutable/chunks/CI-reiW2.js.gz +0 -0
  58. package/build/client/_app/immutable/chunks/C_ZSt1CI.js +2 -0
  59. package/build/client/_app/immutable/chunks/C_ZSt1CI.js.br +0 -0
  60. package/build/client/_app/immutable/chunks/C_ZSt1CI.js.gz +0 -0
  61. package/build/client/_app/immutable/chunks/{CVHvdSBf.js → CfbYRn5k.js} +1 -1
  62. package/build/client/_app/immutable/chunks/CfbYRn5k.js.br +0 -0
  63. package/build/client/_app/immutable/chunks/{CVHvdSBf.js.gz → CfbYRn5k.js.gz} +0 -0
  64. package/build/client/_app/immutable/chunks/{CNMNmz2q.js → CrxwEwqu.js} +1 -1
  65. package/build/client/_app/immutable/chunks/CrxwEwqu.js.br +0 -0
  66. package/build/client/_app/immutable/chunks/CrxwEwqu.js.gz +0 -0
  67. package/build/client/_app/immutable/chunks/CsYbWoTD.js +8 -0
  68. package/build/client/_app/immutable/chunks/CsYbWoTD.js.br +0 -0
  69. package/build/client/_app/immutable/chunks/CsYbWoTD.js.gz +0 -0
  70. package/build/client/_app/immutable/chunks/{CIIE25ox.js → CwmAWymP.js} +1 -1
  71. package/build/client/_app/immutable/chunks/CwmAWymP.js.br +0 -0
  72. package/build/client/_app/immutable/chunks/CwmAWymP.js.gz +0 -0
  73. package/build/client/_app/immutable/chunks/CxPv-oiS.js +1 -0
  74. package/build/client/_app/immutable/chunks/CxPv-oiS.js.br +0 -0
  75. package/build/client/_app/immutable/chunks/CxPv-oiS.js.gz +0 -0
  76. package/build/client/_app/immutable/chunks/{DOatwnEt.js → DDMPVpvs.js} +1 -1
  77. package/build/client/_app/immutable/chunks/DDMPVpvs.js.br +0 -0
  78. package/build/client/_app/immutable/chunks/DDMPVpvs.js.gz +0 -0
  79. package/build/client/_app/immutable/chunks/DGa-EyU2.js +1 -0
  80. package/build/client/_app/immutable/chunks/DGa-EyU2.js.br +0 -0
  81. package/build/client/_app/immutable/chunks/DGa-EyU2.js.gz +0 -0
  82. package/build/client/_app/immutable/chunks/{BfHUxT3G.js → DLQqXQ6R.js} +7 -7
  83. package/build/client/_app/immutable/chunks/DLQqXQ6R.js.br +0 -0
  84. package/build/client/_app/immutable/chunks/DLQqXQ6R.js.gz +0 -0
  85. package/build/client/_app/immutable/chunks/DQA6NP5y.js +2 -0
  86. package/build/client/_app/immutable/chunks/DQA6NP5y.js.br +0 -0
  87. package/build/client/_app/immutable/chunks/DQA6NP5y.js.gz +0 -0
  88. package/build/client/_app/immutable/chunks/{HPBQctDD.js → DRIMs3uA.js} +1 -1
  89. package/build/client/_app/immutable/chunks/DRIMs3uA.js.br +0 -0
  90. package/build/client/_app/immutable/chunks/DRIMs3uA.js.gz +0 -0
  91. package/build/client/_app/immutable/chunks/{ByQey8Oa.js → DUeN9t8P.js} +1 -1
  92. package/build/client/_app/immutable/chunks/DUeN9t8P.js.br +0 -0
  93. package/build/client/_app/immutable/chunks/DUeN9t8P.js.gz +0 -0
  94. package/build/client/_app/immutable/chunks/{KDW88ZZa.js → DWH0347h.js} +1 -1
  95. package/build/client/_app/immutable/chunks/DWH0347h.js.br +0 -0
  96. package/build/client/_app/immutable/chunks/DWH0347h.js.gz +0 -0
  97. package/build/client/_app/immutable/chunks/{BnxfhlSj.js → DZxMt77D.js} +1 -1
  98. package/build/client/_app/immutable/chunks/DZxMt77D.js.br +0 -0
  99. package/build/client/_app/immutable/chunks/DZxMt77D.js.gz +0 -0
  100. package/build/client/_app/immutable/chunks/DaR1ExPh.js +1 -0
  101. package/build/client/_app/immutable/chunks/DaR1ExPh.js.br +0 -0
  102. package/build/client/_app/immutable/chunks/DaR1ExPh.js.gz +0 -0
  103. package/build/client/_app/immutable/chunks/{rtsVMmSs.js → DjDhNM9l.js} +1 -1
  104. package/build/client/_app/immutable/chunks/DjDhNM9l.js.br +0 -0
  105. package/build/client/_app/immutable/chunks/DjDhNM9l.js.gz +0 -0
  106. package/build/client/_app/immutable/chunks/Dl6q6wVH.js +1 -0
  107. package/build/client/_app/immutable/chunks/Dl6q6wVH.js.br +0 -0
  108. package/build/client/_app/immutable/chunks/Dl6q6wVH.js.gz +0 -0
  109. package/build/client/_app/immutable/chunks/JA_7cQFn.js +1 -0
  110. package/build/client/_app/immutable/chunks/JA_7cQFn.js.br +0 -0
  111. package/build/client/_app/immutable/chunks/JA_7cQFn.js.gz +0 -0
  112. package/build/client/_app/immutable/chunks/{BqROrg0C.js → OMeqFb0I.js} +1 -1
  113. package/build/client/_app/immutable/chunks/OMeqFb0I.js.br +0 -0
  114. package/build/client/_app/immutable/chunks/OMeqFb0I.js.gz +0 -0
  115. package/build/client/_app/immutable/chunks/WMLo4l1V.js +4 -0
  116. package/build/client/_app/immutable/chunks/WMLo4l1V.js.br +0 -0
  117. package/build/client/_app/immutable/chunks/WMLo4l1V.js.gz +0 -0
  118. package/build/client/_app/immutable/chunks/{Ct9HfpvA.js → ZGfwyPNq.js} +1 -1
  119. package/build/client/_app/immutable/chunks/ZGfwyPNq.js.br +0 -0
  120. package/build/client/_app/immutable/chunks/ZGfwyPNq.js.gz +0 -0
  121. package/build/client/_app/immutable/chunks/{DSfxalyG.js → bynEV6cE.js} +1 -1
  122. package/build/client/_app/immutable/chunks/bynEV6cE.js.br +0 -0
  123. package/build/client/_app/immutable/chunks/bynEV6cE.js.gz +0 -0
  124. package/build/client/_app/immutable/chunks/i_HX2z3K.js +1 -0
  125. package/build/client/_app/immutable/chunks/i_HX2z3K.js.br +0 -0
  126. package/build/client/_app/immutable/chunks/i_HX2z3K.js.gz +0 -0
  127. package/build/client/_app/immutable/chunks/{yWz0pZR0.js → wDFujNbC.js} +1 -1
  128. package/build/client/_app/immutable/chunks/wDFujNbC.js.br +0 -0
  129. package/build/client/_app/immutable/chunks/wDFujNbC.js.gz +0 -0
  130. package/build/client/_app/immutable/chunks/{CZPhtqrs.js → wtOMB7ao.js} +3 -3
  131. package/build/client/_app/immutable/chunks/wtOMB7ao.js.br +0 -0
  132. package/build/client/_app/immutable/chunks/wtOMB7ao.js.gz +0 -0
  133. package/build/client/_app/immutable/entry/app.DQ_2_Lfy.js +2 -0
  134. package/build/client/_app/immutable/entry/app.DQ_2_Lfy.js.br +0 -0
  135. package/build/client/_app/immutable/entry/app.DQ_2_Lfy.js.gz +0 -0
  136. package/build/client/_app/immutable/entry/start.DvKwzZNe.js +1 -0
  137. package/build/client/_app/immutable/entry/start.DvKwzZNe.js.br +2 -0
  138. package/build/client/_app/immutable/entry/start.DvKwzZNe.js.gz +0 -0
  139. package/build/client/_app/immutable/nodes/{0.BAD72yj-.js → 0.CgivU_tm.js} +1 -1
  140. package/build/client/_app/immutable/nodes/0.CgivU_tm.js.br +0 -0
  141. package/build/client/_app/immutable/nodes/0.CgivU_tm.js.gz +0 -0
  142. package/build/client/_app/immutable/nodes/1.DP8kLfpI.js +1 -0
  143. package/build/client/_app/immutable/nodes/1.DP8kLfpI.js.br +0 -0
  144. package/build/client/_app/immutable/nodes/1.DP8kLfpI.js.gz +0 -0
  145. package/build/client/_app/immutable/nodes/{13.DaAF9e8t.js → 14.zP-B7lEl.js} +1 -1
  146. package/build/client/_app/immutable/nodes/14.zP-B7lEl.js.br +0 -0
  147. package/build/client/_app/immutable/nodes/14.zP-B7lEl.js.gz +0 -0
  148. package/build/client/_app/immutable/nodes/{14.CIH3gHti.js → 15.B2GzYnI3.js} +3 -3
  149. package/build/client/_app/immutable/nodes/15.B2GzYnI3.js.br +0 -0
  150. package/build/client/_app/immutable/nodes/15.B2GzYnI3.js.gz +0 -0
  151. package/build/client/_app/immutable/nodes/2.Bhgshf0y.js +35 -0
  152. package/build/client/_app/immutable/nodes/2.Bhgshf0y.js.br +0 -0
  153. package/build/client/_app/immutable/nodes/2.Bhgshf0y.js.gz +0 -0
  154. package/build/client/_app/immutable/nodes/3.0QEF0Tq5.js +1 -0
  155. package/build/client/_app/immutable/nodes/3.0QEF0Tq5.js.br +0 -0
  156. package/build/client/_app/immutable/nodes/3.0QEF0Tq5.js.gz +0 -0
  157. package/build/client/_app/immutable/nodes/4.DBO0gLSr.js +1 -0
  158. package/build/client/_app/immutable/nodes/4.DBO0gLSr.js.br +0 -0
  159. package/build/client/_app/immutable/nodes/4.DBO0gLSr.js.gz +0 -0
  160. package/build/client/_app/immutable/nodes/{5.DB-2_mc1.js → 5.CZiuS-IZ.js} +1 -1
  161. package/build/client/_app/immutable/nodes/5.CZiuS-IZ.js.br +0 -0
  162. package/build/client/_app/immutable/nodes/5.CZiuS-IZ.js.gz +0 -0
  163. package/build/client/_app/immutable/nodes/6.CkeP1yO3.js +1 -0
  164. package/build/client/_app/immutable/nodes/6.CkeP1yO3.js.br +0 -0
  165. package/build/client/_app/immutable/nodes/6.CkeP1yO3.js.gz +0 -0
  166. package/build/client/_app/immutable/nodes/7.CB2Z5SOz.js +2 -0
  167. package/build/client/_app/immutable/nodes/7.CB2Z5SOz.js.br +0 -0
  168. package/build/client/_app/immutable/nodes/7.CB2Z5SOz.js.gz +0 -0
  169. package/build/client/_app/immutable/nodes/{7.jI3Ps4Fx.js → 8.BAhMFXe7.js} +2 -2
  170. package/build/client/_app/immutable/nodes/8.BAhMFXe7.js.br +0 -0
  171. package/build/client/_app/immutable/nodes/8.BAhMFXe7.js.gz +0 -0
  172. package/build/client/_app/immutable/nodes/9.D7VQfn4o.js +6 -0
  173. package/build/client/_app/immutable/nodes/9.D7VQfn4o.js.br +0 -0
  174. package/build/client/_app/immutable/nodes/9.D7VQfn4o.js.gz +0 -0
  175. package/build/client/_app/version.json +1 -1
  176. package/build/client/_app/version.json.br +0 -0
  177. package/build/client/_app/version.json.gz +0 -0
  178. package/build/server/chunks/0-bATz_nPm.js +9 -0
  179. package/build/server/chunks/0-bATz_nPm.js.map +1 -0
  180. package/build/server/chunks/1-B8t1doqY.js +9 -0
  181. package/build/server/chunks/1-B8t1doqY.js.map +1 -0
  182. package/build/server/chunks/{9-W6XYayeK.js → 10-DZjMDIvS.js} +3 -3
  183. package/build/server/chunks/10-DZjMDIvS.js.map +1 -0
  184. package/build/server/chunks/{10-C7WLHR92.js → 11-D6F4I8KX.js} +3 -3
  185. package/build/server/chunks/{10-C7WLHR92.js.map → 11-D6F4I8KX.js.map} +1 -1
  186. package/build/server/chunks/{11-CPYwUx-7.js → 12-2vbUmx0n.js} +3 -3
  187. package/build/server/chunks/{11-CPYwUx-7.js.map → 12-2vbUmx0n.js.map} +1 -1
  188. package/build/server/chunks/{12-C5OSs5Op.js → 13-11CHqz2G.js} +3 -3
  189. package/build/server/chunks/{12-C5OSs5Op.js.map → 13-11CHqz2G.js.map} +1 -1
  190. package/build/server/chunks/{13-DPcsc1p-.js → 14-C4iOZL2L.js} +3 -3
  191. package/build/server/chunks/14-C4iOZL2L.js.map +1 -0
  192. package/build/server/chunks/15-BrQMoggr.js +9 -0
  193. package/build/server/chunks/15-BrQMoggr.js.map +1 -0
  194. package/build/server/chunks/2-B0R4hYal.js +9 -0
  195. package/build/server/chunks/2-B0R4hYal.js.map +1 -0
  196. package/build/server/chunks/3-DV-OHzXy.js +9 -0
  197. package/build/server/chunks/3-DV-OHzXy.js.map +1 -0
  198. package/build/server/chunks/4-ClIdwABM.js +9 -0
  199. package/build/server/chunks/4-ClIdwABM.js.map +1 -0
  200. package/build/server/chunks/5-BznYQ30T.js +9 -0
  201. package/build/server/chunks/5-BznYQ30T.js.map +1 -0
  202. package/build/server/chunks/{6-uS_X9B0s.js → 6-B6C38HXu.js} +7 -3
  203. package/build/server/chunks/6-B6C38HXu.js.map +1 -0
  204. package/build/server/chunks/7-BgYWIBj-.js +9 -0
  205. package/build/server/chunks/7-BgYWIBj-.js.map +1 -0
  206. package/build/server/chunks/8-NaJ61xSe.js +9 -0
  207. package/build/server/chunks/8-NaJ61xSe.js.map +1 -0
  208. package/build/server/chunks/9-oaBsE2zR.js +9 -0
  209. package/build/server/chunks/9-oaBsE2zR.js.map +1 -0
  210. package/build/server/chunks/{ChatStepTrace-B5HQ8Zv3.js → ChatStepTrace-BIghWRaw.js} +3 -59
  211. package/build/server/chunks/ChatStepTrace-BIghWRaw.js.map +1 -0
  212. package/build/server/chunks/Dropdown-Bz9eHilg.js +61 -0
  213. package/build/server/chunks/Dropdown-Bz9eHilg.js.map +1 -0
  214. package/build/server/chunks/{_layout.svelte-Svi5xbzP.js → _layout.svelte-B6NfHVfy.js} +2 -2
  215. package/build/server/chunks/{_layout.svelte-Svi5xbzP.js.map → _layout.svelte-B6NfHVfy.js.map} +1 -1
  216. package/build/server/chunks/{_layout.svelte-u9Ivvyk-.js → _layout.svelte-BKnunWZl.js} +131 -16
  217. package/build/server/chunks/_layout.svelte-BKnunWZl.js.map +1 -0
  218. package/build/server/chunks/{_layout.svelte-h89mGXIj.js → _layout.svelte-WXSvPGRU.js} +2 -2
  219. package/build/server/chunks/{_layout.svelte-h89mGXIj.js.map → _layout.svelte-WXSvPGRU.js.map} +1 -1
  220. package/build/server/chunks/{_page.svelte-CnjXZO9K.js → _page.svelte-CLBi-ypL.js} +2 -2
  221. package/build/server/chunks/{_page.svelte-CnjXZO9K.js.map → _page.svelte-CLBi-ypL.js.map} +1 -1
  222. package/build/server/chunks/{_page.svelte-Hg-ZSzf1.js → _page.svelte-CLiLwJTq.js} +4 -3
  223. package/build/server/chunks/_page.svelte-CLiLwJTq.js.map +1 -0
  224. package/build/server/chunks/{_page.svelte-CC26hDwf.js → _page.svelte-CdczF37D.js} +3 -2
  225. package/build/server/chunks/_page.svelte-CdczF37D.js.map +1 -0
  226. package/build/server/chunks/_page.svelte-Ck9Utnoc.js +60 -0
  227. package/build/server/chunks/_page.svelte-Ck9Utnoc.js.map +1 -0
  228. package/build/server/chunks/{_page.svelte-Dl3GoTy1.js → _page.svelte-DBrprjQP.js} +5 -4
  229. package/build/server/chunks/_page.svelte-DBrprjQP.js.map +1 -0
  230. package/build/server/chunks/{error.svelte-zyW9aOoU.js → error.svelte-DP2oBSvv.js} +2 -2
  231. package/build/server/chunks/{error.svelte-zyW9aOoU.js.map → error.svelte-DP2oBSvv.js.map} +1 -1
  232. package/build/server/chunks/{index3-DeV2OWZf.js → index3-CpMl6FwG.js} +7 -2
  233. package/build/server/chunks/index3-CpMl6FwG.js.map +1 -0
  234. package/build/server/index.js +1 -1
  235. package/build/server/index.js.map +1 -1
  236. package/build/server/manifest.js +32 -24
  237. package/build/server/manifest.js.map +1 -1
  238. package/package.json +1 -1
  239. package/src/backend/lib/get-agent-factories.ts +13 -2
  240. package/src/backend/lib/get-root-path.ts +30 -5
  241. package/src/backend/lib/import-nonce.ts +10 -0
  242. package/src/backend/region/router.ts +67 -0
  243. package/src/backend/roleplay/agents.ts +52 -10
  244. package/src/backend/roleplay/old-server.ts +4 -1
  245. package/src/backend/roleplay/router.ts +1 -0
  246. package/src/backend/server.ts +3 -1
  247. package/src/backend/tests/academy.ts +37 -24
  248. package/src/backend/tests/emulate-agents.ts +20 -1
  249. package/src/backend/tests/router.ts +220 -38
  250. package/build/client/_app/immutable/assets/0.DsZUjxNX.css +0 -1
  251. package/build/client/_app/immutable/assets/0.DsZUjxNX.css.br +0 -0
  252. package/build/client/_app/immutable/assets/0.DsZUjxNX.css.gz +0 -0
  253. package/build/client/_app/immutable/chunks/B7MYxXp9.js +0 -1
  254. package/build/client/_app/immutable/chunks/B7MYxXp9.js.br +0 -0
  255. package/build/client/_app/immutable/chunks/B7MYxXp9.js.gz +0 -0
  256. package/build/client/_app/immutable/chunks/BTlUd_Lo.js +0 -8
  257. package/build/client/_app/immutable/chunks/BTlUd_Lo.js.br +0 -0
  258. package/build/client/_app/immutable/chunks/BTlUd_Lo.js.gz +0 -0
  259. package/build/client/_app/immutable/chunks/BVDwc-2z.js +0 -1
  260. package/build/client/_app/immutable/chunks/BVDwc-2z.js.br +0 -0
  261. package/build/client/_app/immutable/chunks/BVDwc-2z.js.gz +0 -0
  262. package/build/client/_app/immutable/chunks/BWo2H__f.js.br +0 -0
  263. package/build/client/_app/immutable/chunks/BWo2H__f.js.gz +0 -0
  264. package/build/client/_app/immutable/chunks/BXkrt826.js +0 -1
  265. package/build/client/_app/immutable/chunks/BXkrt826.js.br +0 -0
  266. package/build/client/_app/immutable/chunks/BXkrt826.js.gz +0 -0
  267. package/build/client/_app/immutable/chunks/Bdb5tyDH.js.br +0 -0
  268. package/build/client/_app/immutable/chunks/Bdb5tyDH.js.gz +0 -0
  269. package/build/client/_app/immutable/chunks/BfHUxT3G.js.br +0 -0
  270. package/build/client/_app/immutable/chunks/BfHUxT3G.js.gz +0 -0
  271. package/build/client/_app/immutable/chunks/Bk1rEq7o.js.br +0 -0
  272. package/build/client/_app/immutable/chunks/Bk1rEq7o.js.gz +0 -0
  273. package/build/client/_app/immutable/chunks/BkclRFLx.js +0 -3
  274. package/build/client/_app/immutable/chunks/BkclRFLx.js.br +0 -0
  275. package/build/client/_app/immutable/chunks/BkclRFLx.js.gz +0 -0
  276. package/build/client/_app/immutable/chunks/BnxfhlSj.js.br +0 -0
  277. package/build/client/_app/immutable/chunks/BnxfhlSj.js.gz +0 -0
  278. package/build/client/_app/immutable/chunks/BqROrg0C.js.br +0 -0
  279. package/build/client/_app/immutable/chunks/BqROrg0C.js.gz +0 -0
  280. package/build/client/_app/immutable/chunks/ByQey8Oa.js.br +0 -0
  281. package/build/client/_app/immutable/chunks/ByQey8Oa.js.gz +0 -0
  282. package/build/client/_app/immutable/chunks/CFwu9ET3.js.br +0 -0
  283. package/build/client/_app/immutable/chunks/CFwu9ET3.js.gz +0 -0
  284. package/build/client/_app/immutable/chunks/CIIE25ox.js.br +0 -0
  285. package/build/client/_app/immutable/chunks/CIIE25ox.js.gz +0 -0
  286. package/build/client/_app/immutable/chunks/CNMNmz2q.js.br +0 -0
  287. package/build/client/_app/immutable/chunks/CNMNmz2q.js.gz +0 -0
  288. package/build/client/_app/immutable/chunks/CNvyTQrC.js +0 -1
  289. package/build/client/_app/immutable/chunks/CNvyTQrC.js.br +0 -2
  290. package/build/client/_app/immutable/chunks/CNvyTQrC.js.gz +0 -0
  291. package/build/client/_app/immutable/chunks/CULdW9tk.js +0 -1
  292. package/build/client/_app/immutable/chunks/CULdW9tk.js.br +0 -0
  293. package/build/client/_app/immutable/chunks/CULdW9tk.js.gz +0 -0
  294. package/build/client/_app/immutable/chunks/CVHvdSBf.js.br +0 -0
  295. package/build/client/_app/immutable/chunks/CYiRxJxs.js +0 -1
  296. package/build/client/_app/immutable/chunks/CYiRxJxs.js.br +0 -0
  297. package/build/client/_app/immutable/chunks/CYiRxJxs.js.gz +0 -0
  298. package/build/client/_app/immutable/chunks/CZPhtqrs.js.br +0 -0
  299. package/build/client/_app/immutable/chunks/CZPhtqrs.js.gz +0 -0
  300. package/build/client/_app/immutable/chunks/CdzpH-Ca.js.br +0 -0
  301. package/build/client/_app/immutable/chunks/CdzpH-Ca.js.gz +0 -0
  302. package/build/client/_app/immutable/chunks/Cf8q8_nj.js +0 -1
  303. package/build/client/_app/immutable/chunks/Cf8q8_nj.js.br +0 -0
  304. package/build/client/_app/immutable/chunks/Cf8q8_nj.js.gz +0 -0
  305. package/build/client/_app/immutable/chunks/Cg3F7Z11.js +0 -1
  306. package/build/client/_app/immutable/chunks/Cg3F7Z11.js.br +0 -0
  307. package/build/client/_app/immutable/chunks/Cg3F7Z11.js.gz +0 -0
  308. package/build/client/_app/immutable/chunks/CpSIcnXs.js +0 -1
  309. package/build/client/_app/immutable/chunks/CpSIcnXs.js.br +0 -0
  310. package/build/client/_app/immutable/chunks/CpSIcnXs.js.gz +0 -0
  311. package/build/client/_app/immutable/chunks/Ct9HfpvA.js.br +0 -0
  312. package/build/client/_app/immutable/chunks/Ct9HfpvA.js.gz +0 -0
  313. package/build/client/_app/immutable/chunks/DJPBfZIx.js +0 -1
  314. package/build/client/_app/immutable/chunks/DJPBfZIx.js.br +0 -0
  315. package/build/client/_app/immutable/chunks/DJPBfZIx.js.gz +0 -0
  316. package/build/client/_app/immutable/chunks/DOatwnEt.js.br +0 -0
  317. package/build/client/_app/immutable/chunks/DOatwnEt.js.gz +0 -0
  318. package/build/client/_app/immutable/chunks/DQqJYxgt.js +0 -1
  319. package/build/client/_app/immutable/chunks/DQqJYxgt.js.br +0 -0
  320. package/build/client/_app/immutable/chunks/DQqJYxgt.js.gz +0 -0
  321. package/build/client/_app/immutable/chunks/DSfxalyG.js.br +0 -0
  322. package/build/client/_app/immutable/chunks/DSfxalyG.js.gz +0 -0
  323. package/build/client/_app/immutable/chunks/DujX6kBV.js +0 -2
  324. package/build/client/_app/immutable/chunks/DujX6kBV.js.br +0 -0
  325. package/build/client/_app/immutable/chunks/DujX6kBV.js.gz +0 -0
  326. package/build/client/_app/immutable/chunks/Dvy68CmD.js +0 -4
  327. package/build/client/_app/immutable/chunks/Dvy68CmD.js.br +0 -0
  328. package/build/client/_app/immutable/chunks/Dvy68CmD.js.gz +0 -0
  329. package/build/client/_app/immutable/chunks/HPBQctDD.js.br +0 -0
  330. package/build/client/_app/immutable/chunks/HPBQctDD.js.gz +0 -0
  331. package/build/client/_app/immutable/chunks/Jaf1TUfw.js +0 -1
  332. package/build/client/_app/immutable/chunks/Jaf1TUfw.js.br +0 -2
  333. package/build/client/_app/immutable/chunks/Jaf1TUfw.js.gz +0 -0
  334. package/build/client/_app/immutable/chunks/KDW88ZZa.js.br +0 -0
  335. package/build/client/_app/immutable/chunks/KDW88ZZa.js.gz +0 -0
  336. package/build/client/_app/immutable/chunks/TO5ESkEd.js.br +0 -0
  337. package/build/client/_app/immutable/chunks/TO5ESkEd.js.gz +0 -0
  338. package/build/client/_app/immutable/chunks/axPa8Xqj.js +0 -1
  339. package/build/client/_app/immutable/chunks/axPa8Xqj.js.br +0 -0
  340. package/build/client/_app/immutable/chunks/axPa8Xqj.js.gz +0 -0
  341. package/build/client/_app/immutable/chunks/oeB0PCTX.js.br +0 -0
  342. package/build/client/_app/immutable/chunks/oeB0PCTX.js.gz +0 -0
  343. package/build/client/_app/immutable/chunks/rtsVMmSs.js.br +0 -0
  344. package/build/client/_app/immutable/chunks/rtsVMmSs.js.gz +0 -0
  345. package/build/client/_app/immutable/chunks/yWz0pZR0.js.br +0 -0
  346. package/build/client/_app/immutable/chunks/yWz0pZR0.js.gz +0 -0
  347. package/build/client/_app/immutable/entry/app.CGapw5JN.js +0 -2
  348. package/build/client/_app/immutable/entry/app.CGapw5JN.js.br +0 -0
  349. package/build/client/_app/immutable/entry/app.CGapw5JN.js.gz +0 -0
  350. package/build/client/_app/immutable/entry/start.-cXTjTEG.js +0 -1
  351. package/build/client/_app/immutable/entry/start.-cXTjTEG.js.br +0 -2
  352. package/build/client/_app/immutable/entry/start.-cXTjTEG.js.gz +0 -0
  353. package/build/client/_app/immutable/nodes/0.BAD72yj-.js.br +0 -0
  354. package/build/client/_app/immutable/nodes/0.BAD72yj-.js.gz +0 -0
  355. package/build/client/_app/immutable/nodes/1.Poqrp7zI.js +0 -1
  356. package/build/client/_app/immutable/nodes/1.Poqrp7zI.js.br +0 -0
  357. package/build/client/_app/immutable/nodes/1.Poqrp7zI.js.gz +0 -0
  358. package/build/client/_app/immutable/nodes/13.DaAF9e8t.js.br +0 -0
  359. package/build/client/_app/immutable/nodes/13.DaAF9e8t.js.gz +0 -0
  360. package/build/client/_app/immutable/nodes/14.CIH3gHti.js.br +0 -0
  361. package/build/client/_app/immutable/nodes/14.CIH3gHti.js.gz +0 -0
  362. package/build/client/_app/immutable/nodes/2.BmMuB33m.js +0 -35
  363. package/build/client/_app/immutable/nodes/2.BmMuB33m.js.br +0 -0
  364. package/build/client/_app/immutable/nodes/2.BmMuB33m.js.gz +0 -0
  365. package/build/client/_app/immutable/nodes/3.CQPkSYE9.js +0 -1
  366. package/build/client/_app/immutable/nodes/3.CQPkSYE9.js.br +0 -0
  367. package/build/client/_app/immutable/nodes/3.CQPkSYE9.js.gz +0 -0
  368. package/build/client/_app/immutable/nodes/4.DylMSvDw.js +0 -1
  369. package/build/client/_app/immutable/nodes/4.DylMSvDw.js.br +0 -0
  370. package/build/client/_app/immutable/nodes/4.DylMSvDw.js.gz +0 -0
  371. package/build/client/_app/immutable/nodes/5.DB-2_mc1.js.br +0 -0
  372. package/build/client/_app/immutable/nodes/5.DB-2_mc1.js.gz +0 -0
  373. package/build/client/_app/immutable/nodes/6.CPYhLc46.js +0 -1
  374. package/build/client/_app/immutable/nodes/6.CPYhLc46.js.br +0 -4
  375. package/build/client/_app/immutable/nodes/6.CPYhLc46.js.gz +0 -0
  376. package/build/client/_app/immutable/nodes/7.jI3Ps4Fx.js.br +0 -0
  377. package/build/client/_app/immutable/nodes/7.jI3Ps4Fx.js.gz +0 -0
  378. package/build/client/_app/immutable/nodes/8.DhQWMEsP.js +0 -6
  379. package/build/client/_app/immutable/nodes/8.DhQWMEsP.js.br +0 -0
  380. package/build/client/_app/immutable/nodes/8.DhQWMEsP.js.gz +0 -0
  381. package/build/server/chunks/0-DBqZOMqX.js +0 -9
  382. package/build/server/chunks/0-DBqZOMqX.js.map +0 -1
  383. package/build/server/chunks/1-DtNOOYEc.js +0 -9
  384. package/build/server/chunks/1-DtNOOYEc.js.map +0 -1
  385. package/build/server/chunks/13-DPcsc1p-.js.map +0 -1
  386. package/build/server/chunks/14-BB5_NucR.js +0 -9
  387. package/build/server/chunks/14-BB5_NucR.js.map +0 -1
  388. package/build/server/chunks/2-DKkz3BEe.js +0 -9
  389. package/build/server/chunks/2-DKkz3BEe.js.map +0 -1
  390. package/build/server/chunks/3-CYDXg-UU.js +0 -9
  391. package/build/server/chunks/3-CYDXg-UU.js.map +0 -1
  392. package/build/server/chunks/4-BML64sIA.js +0 -9
  393. package/build/server/chunks/4-BML64sIA.js.map +0 -1
  394. package/build/server/chunks/5-BRYDEr7f.js +0 -9
  395. package/build/server/chunks/5-BRYDEr7f.js.map +0 -1
  396. package/build/server/chunks/6-uS_X9B0s.js.map +0 -1
  397. package/build/server/chunks/7-gY8iwkKY.js +0 -9
  398. package/build/server/chunks/7-gY8iwkKY.js.map +0 -1
  399. package/build/server/chunks/8-CddjGDu2.js +0 -9
  400. package/build/server/chunks/8-CddjGDu2.js.map +0 -1
  401. package/build/server/chunks/9-W6XYayeK.js.map +0 -1
  402. package/build/server/chunks/ChatStepTrace-B5HQ8Zv3.js.map +0 -1
  403. package/build/server/chunks/_layout.svelte-u9Ivvyk-.js.map +0 -1
  404. package/build/server/chunks/_page.svelte-CC26hDwf.js.map +0 -1
  405. package/build/server/chunks/_page.svelte-Dl3GoTy1.js.map +0 -1
  406. package/build/server/chunks/_page.svelte-Hg-ZSzf1.js.map +0 -1
  407. package/build/server/chunks/index3-DeV2OWZf.js.map +0 -1
  408. /package/build/client/_app/immutable/assets/{14.C5apk4jm.css → 15.C5apk4jm.css} +0 -0
  409. /package/build/client/_app/immutable/assets/{14.C5apk4jm.css.br → 15.C5apk4jm.css.br} +0 -0
  410. /package/build/client/_app/immutable/assets/{14.C5apk4jm.css.gz → 15.C5apk4jm.css.gz} +0 -0
  411. /package/build/client/_app/immutable/assets/{7.DlSPCZj0.css → 8.DlSPCZj0.css} +0 -0
  412. /package/build/client/_app/immutable/assets/{7.DlSPCZj0.css.br → 8.DlSPCZj0.css.br} +0 -0
  413. /package/build/client/_app/immutable/assets/{7.DlSPCZj0.css.gz → 8.DlSPCZj0.css.gz} +0 -0
  414. /package/build/client/_app/immutable/assets/{8.BX46PfEJ.css → 9.BX46PfEJ.css} +0 -0
  415. /package/build/client/_app/immutable/assets/{8.BX46PfEJ.css.br → 9.BX46PfEJ.css.br} +0 -0
  416. /package/build/client/_app/immutable/assets/{8.BX46PfEJ.css.gz → 9.BX46PfEJ.css.gz} +0 -0
  417. /package/build/client/_app/immutable/assets/{bosun-theme.tn0RQdqM.css → Modal.tn0RQdqM.css} +0 -0
  418. /package/build/client/_app/immutable/assets/{bosun-theme.tn0RQdqM.css.br → Modal.tn0RQdqM.css.br} +0 -0
  419. /package/build/client/_app/immutable/assets/{bosun-theme.tn0RQdqM.css.gz → Modal.tn0RQdqM.css.gz} +0 -0
  420. /package/build/client/_app/immutable/assets/{ChatStepTrace.NFJFjHv0.css → chat-content.NFJFjHv0.css} +0 -0
  421. /package/build/client/_app/immutable/assets/{ChatStepTrace.NFJFjHv0.css.br → chat-content.NFJFjHv0.css.br} +0 -0
  422. /package/build/client/_app/immutable/assets/{ChatStepTrace.NFJFjHv0.css.gz → chat-content.NFJFjHv0.css.gz} +0 -0
  423. /package/build/client/_app/immutable/nodes/{9.BVI-eEdV.js → 10.BVI-eEdV.js} +0 -0
  424. /package/build/client/_app/immutable/nodes/{9.BVI-eEdV.js.br → 10.BVI-eEdV.js.br} +0 -0
  425. /package/build/client/_app/immutable/nodes/{9.BVI-eEdV.js.gz → 10.BVI-eEdV.js.gz} +0 -0
  426. /package/build/client/_app/immutable/nodes/{10.BHSGZYEC.js → 11.BHSGZYEC.js} +0 -0
  427. /package/build/client/_app/immutable/nodes/{10.BHSGZYEC.js.br → 11.BHSGZYEC.js.br} +0 -0
  428. /package/build/client/_app/immutable/nodes/{10.BHSGZYEC.js.gz → 11.BHSGZYEC.js.gz} +0 -0
  429. /package/build/client/_app/immutable/nodes/{11.CZ_7M4AF.js → 12.CZ_7M4AF.js} +0 -0
  430. /package/build/client/_app/immutable/nodes/{11.CZ_7M4AF.js.br → 12.CZ_7M4AF.js.br} +0 -0
  431. /package/build/client/_app/immutable/nodes/{11.CZ_7M4AF.js.gz → 12.CZ_7M4AF.js.gz} +0 -0
  432. /package/build/client/_app/immutable/nodes/{12.DRr2l3NZ.js → 13.DRr2l3NZ.js} +0 -0
  433. /package/build/client/_app/immutable/nodes/{12.DRr2l3NZ.js.br → 13.DRr2l3NZ.js.br} +0 -0
  434. /package/build/client/_app/immutable/nodes/{12.DRr2l3NZ.js.gz → 13.DRr2l3NZ.js.gz} +0 -0
@@ -85,28 +85,37 @@ type PromptTestsScope = 'all' | 'pinned'
85
85
 
86
86
  type PromptTestsSelection = { scope: PromptTestsScope } | { testId: string }
87
87
 
88
- const activeRunsByAgent = new Map<string, AbortController>()
88
+ const activeRunsBySuiteKey = new Map<string, AbortController>()
89
89
 
90
- export function cancelPromptTests(agent: string): boolean {
91
- const controller = activeRunsByAgent.get(agent)
90
+ export type SuiteSelection = {
91
+ // `suiteKey` is the filesystem/report key (e.g. `voiceSupport.en-gb`).
92
+ // `agentId` is the canonical factory key (workflow export key, e.g. `voiceSupport`).
93
+ // Keeping these separate avoids any parsing/guessing in the test runner.
94
+ suiteKey: string
95
+ agentId: string
96
+ region?: string
97
+ }
98
+
99
+ export function cancelPromptTests(suiteKey: string): boolean {
100
+ const controller = activeRunsBySuiteKey.get(suiteKey)
92
101
  if (!controller) return false
93
102
  controller.abort()
94
103
  return true
95
104
  }
96
105
 
97
106
  export async function runPromptTestsManaged(
98
- agent: string,
107
+ suite: SuiteSelection,
99
108
  selection: PromptTestsSelection = { scope: 'pinned' }
100
109
  ): Promise<WrittenRunReport> {
101
- if (activeRunsByAgent.has(agent)) {
110
+ if (activeRunsBySuiteKey.has(suite.suiteKey)) {
102
111
  throw new Error('Tests already running for this agent')
103
112
  }
104
113
  const controller = new AbortController()
105
- activeRunsByAgent.set(agent, controller)
114
+ activeRunsBySuiteKey.set(suite.suiteKey, controller)
106
115
  try {
107
- return await runPromptTests(agent, selection, { signal: controller.signal })
116
+ return await runPromptTests(suite, selection, { signal: controller.signal })
108
117
  } finally {
109
- activeRunsByAgent.delete(agent)
118
+ activeRunsBySuiteKey.delete(suite.suiteKey)
110
119
  }
111
120
  }
112
121
 
@@ -230,7 +239,8 @@ export class RecombineAgentProvider implements ApiProvider {
230
239
  async callApi(_prompt: string, context?: CallApiContextParams): Promise<ProviderResponse> {
231
240
  const projectRoot = path.dirname(await getRootPath())
232
241
  const vars = (context?.vars || {}) as unknown as {
233
- agent: string
242
+ agentId: string
243
+ region?: string
234
244
  conversation: Conversation
235
245
  context: Context
236
246
  timeoutSeconds?: number
@@ -317,7 +327,8 @@ export class RecombineAgentProvider implements ApiProvider {
317
327
  try {
318
328
  // Run the agent via loadAgents using provided conversation
319
329
  await loadAgents({
320
- agentId: vars.agent,
330
+ agentId: vars.agentId,
331
+ region: vars.region,
321
332
  getMessages: () => conv,
322
333
  sendMessage: async (message: Message | string) => {
323
334
  const m = typeof message === 'string' ? { sender: 'agent', text: message } : message
@@ -513,20 +524,21 @@ function buildTableRows(
513
524
  }
514
525
 
515
526
  export async function runPromptTests(
516
- agent: string,
527
+ suite: SuiteSelection,
517
528
  selection: PromptTestsSelection = { scope: 'pinned' },
518
529
  opts?: { signal?: AbortSignal }
519
530
  ): Promise<WrittenRunReport> {
520
531
  const signal = opts?.signal
521
532
  const scope = 'scope' in selection ? selection.scope : 'pinned'
522
533
  const onlyTestId = 'testId' in selection ? selection.testId : undefined
523
- const suite = await readSuite(agent)
524
- const rows = suite.tests as unknown as CsvRow[]
525
- const cfg = (await tryReadConfig(agent)) || {}
534
+ const suiteKey = suite.suiteKey
535
+ const loadedSuite = await readSuite(suiteKey)
536
+ const rows = loadedSuite.tests as unknown as CsvRow[]
537
+ const cfg = (await tryReadConfig(suiteKey)) || {}
526
538
 
527
539
  const repeats = Number(cfg?.repeats ?? 1)
528
540
  const concurrency = Number(cfg?.concurrency ?? 1)
529
- const baseContext = suite?.meta?.defaultContext || {}
541
+ const baseContext = loadedSuite?.meta?.defaultContext || {}
530
542
 
531
543
  // Add an index field to each row for mapping
532
544
  const typedRows = rows as unknown as CsvRow[]
@@ -565,7 +577,8 @@ export async function runPromptTests(
565
577
  assert: test.assertions,
566
578
  model: 'not used!',
567
579
  vars: {
568
- agent,
580
+ agentId: suite.agentId,
581
+ ...(suite.region ? { region: suite.region } : {}),
569
582
  context: test.context,
570
583
  conversation: test.conversation,
571
584
  timeoutSeconds: (test as any).timeoutSeconds
@@ -583,7 +596,7 @@ export async function runPromptTests(
583
596
  // Use full ISO timestamp and sanitize ':' for filesystem safety
584
597
  const iso = new Date().toISOString()
585
598
  const isoFile = iso.replace(/:/g, '-')
586
- const outPath = path.join(outDir, `${agent}.${isoFile}.report.json`)
599
+ const outPath = path.join(outDir, `${suiteKey}.${isoFile}.report.json`)
587
600
 
588
601
  async function writeReport(report: WrittenRunReport) {
589
602
  const dir = path.dirname(outPath)
@@ -614,7 +627,7 @@ export async function runPromptTests(
614
627
  }
615
628
 
616
629
  const body: WrittenRunReport = {
617
- agent,
630
+ agent: suiteKey,
618
631
  run_timestamp: iso,
619
632
  run_scope: scope,
620
633
  run_config: runConfig,
@@ -672,11 +685,11 @@ export async function runPromptTests(
672
685
  String((originalRow as any).pinned || '').toUpperCase() === 'TRUE' ? 'TRUE' : 'FALSE'
673
686
  const nextRow: WrittenRunReportRow = {
674
687
  ...(originalRow as any),
675
- prompts: `suite://${agent}?testId=${testId}`,
688
+ prompts: `suite://${suiteKey}?testId=${testId}`,
676
689
  success_rate_percent: 0,
677
690
  success_rate: '0/0',
678
691
  results: [],
679
- agent,
692
+ agent: suiteKey,
680
693
  test_id: testId,
681
694
  run_timestamp: iso,
682
695
  run_config: JSON.stringify(runConfig),
@@ -724,12 +737,12 @@ export async function runPromptTests(
724
737
  })
725
738
 
726
739
  if (originalRow && testId) {
727
- const rowToWrite = buildTableRows([ev], [originalRow], agent)[0]
740
+ const rowToWrite = buildTableRows([ev], [originalRow], suiteKey)[0]
728
741
  const pinned: 'TRUE' | 'FALSE' =
729
742
  (rowToWrite.pinned || '').toUpperCase() === 'TRUE' ? 'TRUE' : 'FALSE'
730
743
  byTestId.set(testId, {
731
744
  ...rowToWrite,
732
- agent,
745
+ agent: suiteKey,
733
746
  test_id: testId,
734
747
  run_timestamp: iso,
735
748
  run_config: JSON.stringify(runConfig),
@@ -760,12 +773,12 @@ export async function runPromptTests(
760
773
 
761
774
  // Persist failure row immediately for real-time UI updates.
762
775
  if (originalRow && testId) {
763
- const rowToWrite = buildTableRows([ev], [originalRow], agent)[0]
776
+ const rowToWrite = buildTableRows([ev], [originalRow], suiteKey)[0]
764
777
  const pinned: 'TRUE' | 'FALSE' =
765
778
  (rowToWrite.pinned || '').toUpperCase() === 'TRUE' ? 'TRUE' : 'FALSE'
766
779
  byTestId.set(testId, {
767
780
  ...rowToWrite,
768
- agent,
781
+ agent: suiteKey,
769
782
  test_id: testId,
770
783
  run_timestamp: iso,
771
784
  run_config: JSON.stringify(runConfig),
@@ -7,10 +7,12 @@ import {
7
7
  type TestVoiceAgent
8
8
  } from '@recombine-ai/engine'
9
9
  import { getAgentFactories } from '../lib/get-agent-factories'
10
+ import { getImportNonce } from '../lib/import-nonce'
10
11
  import { getRootPath } from '../lib/get-root-path'
11
12
 
12
13
  export async function loadAgents(props: {
13
14
  agentId: string
15
+ region?: string | null
14
16
  getMessages: () => Message[]
15
17
  sendMessage: (message: Message | string) => Promise<void>
16
18
  stepTracer: StepTracer
@@ -21,6 +23,7 @@ export async function loadAgents(props: {
21
23
  }): Promise<void> {
22
24
  const {
23
25
  agentId,
26
+ region,
24
27
  getMessages,
25
28
  sendMessage,
26
29
  stepTracer: stepTracer,
@@ -29,7 +32,8 @@ export async function loadAgents(props: {
29
32
  timeoutSeconds,
30
33
  abortSignal
31
34
  } = props
32
- const { factories } = await getAgentFactories(await getRootPath())
35
+ const importNonce = getImportNonce()
36
+ const { factories } = await getAgentFactories(await getRootPath(), importNonce)
33
37
  const factory = factories[agentId]
34
38
  if (!factory) throw new Error('Factory not found')
35
39
 
@@ -68,6 +72,13 @@ export async function loadAgents(props: {
68
72
  addStep: () => {}
69
73
  }
70
74
 
75
+ if (region) {
76
+ // The UI-selected region is stored in Bosun's runtime ctx and consumed by the project's workflows.
77
+ // Setting it before calling the factory ensures region-scoped config/strings are used for this run.
78
+ const current = (ctx.get() as Record<string, unknown> | null | undefined) || {}
79
+ ctx.set({ ...current, recombineRegion: region })
80
+ }
81
+
71
82
  const agent = await factory({
72
83
  stepTracer: stepTracer,
73
84
  stepRegistry,
@@ -123,6 +134,10 @@ export async function loadAgents(props: {
123
134
  }
124
135
 
125
136
  try {
137
+ if (hasStart(agent)) {
138
+ // Some project workflows (e.g. voice) persist required per-run state (like region) during `start()`.
139
+ await withAbort(Promise.resolve().then(() => agent.start()))
140
+ }
126
141
  if (isVoiceAgent(agent)) {
127
142
  await withAbort(agent.streamResponse())
128
143
  } else {
@@ -150,3 +165,7 @@ export async function loadAgents(props: {
150
165
  function isVoiceAgent(agent: TestAgent): agent is TestVoiceAgent {
151
166
  return 'streamResponse' in agent
152
167
  }
168
+
169
+ function hasStart(agent: TestAgent): agent is TestAgent & { start: () => Promise<void> | void } {
170
+ return typeof (agent as { start?: unknown }).start === 'function'
171
+ }
@@ -1,5 +1,7 @@
1
1
  import type { TRPCRootObject } from '@trpc/server/unstable-core-do-not-import'
2
2
  import { z } from 'zod'
3
+ import { access, copyFile, mkdir, readFile, writeFile } from 'node:fs/promises'
4
+ import path from 'node:path'
3
5
 
4
6
  import {
5
7
  addTest,
@@ -19,27 +21,170 @@ import { cancelPromptTests, runPromptTestsManaged } from './academy'
19
21
  import { analyzeRunQuotes } from './analyze'
20
22
  import { findPromptIssues } from './prompt-issues'
21
23
  import type { TrpcContext } from '../lib/trpc-context'
24
+ import { getProjectDir, getProjectPackageJson, getRootPath } from '../lib/get-root-path'
25
+
26
+ const DEFAULT_REGION_CONFIG_PATH = 'src/region-config.json'
27
+
28
+ async function fileExists(p: string): Promise<boolean> {
29
+ try {
30
+ await access(p)
31
+ return true
32
+ } catch {
33
+ return false
34
+ }
35
+ }
36
+
37
+ async function suiteOrConfigExists(baseDir: string, suiteKey: string): Promise<boolean> {
38
+ const jsonl = path.resolve(baseDir, `${suiteKey}.tests.jsonl`)
39
+ const legacyJson = path.resolve(baseDir, `${suiteKey}.tests.json`)
40
+ const cfg = path.resolve(baseDir, `${suiteKey}.config.json`)
41
+ return (await fileExists(jsonl)) || (await fileExists(legacyJson)) || (await fileExists(cfg))
42
+ }
43
+
44
+ async function resolveRegionConfigPath(): Promise<string> {
45
+ const projectDir = await getProjectDir()
46
+ const pkg = await getProjectPackageJson()
47
+ const configured = pkg?.bosun?.regionConfigPath
48
+ const rel = typeof configured === 'string' && configured.trim() ? configured.trim() : null
49
+ return path.resolve(projectDir, rel ?? DEFAULT_REGION_CONFIG_PATH)
50
+ }
51
+
52
+ type RegionMeta = {
53
+ defaultRegion: string | null
54
+ availableRegions: string[]
55
+ }
56
+
57
+ async function loadRegionMeta(agent: string): Promise<RegionMeta | null> {
58
+ const configPath = await resolveRegionConfigPath()
59
+ if (!(await fileExists(configPath))) return null
60
+
61
+ const raw = await readFile(configPath, 'utf-8')
62
+ const parsed = JSON.parse(raw) as any
63
+
64
+ const devConfig = parsed?.config?.development?.[agent]
65
+ const agentStrings = parsed?.strings?.[agent]
66
+
67
+ const configRegions = devConfig && typeof devConfig === 'object' ? Object.keys(devConfig) : []
68
+ const stringRegions =
69
+ agentStrings && typeof agentStrings === 'object' ? Object.keys(agentStrings) : []
70
+
71
+ const availableRegions = configRegions.filter((r) => stringRegions.includes(r))
72
+ const defaultRegion = typeof parsed?.defaultRegion === 'string' ? parsed.defaultRegion : null
73
+ return { defaultRegion, availableRegions }
74
+ }
75
+
76
+ async function migrateLegacySuiteToDefaultRegion(baseDir: string, agent: string): Promise<void> {
77
+ const meta = await loadRegionMeta(agent)
78
+ if (!meta || meta.availableRegions.length === 0) return
79
+
80
+ const defaultRegion =
81
+ meta.defaultRegion && meta.availableRegions.includes(meta.defaultRegion)
82
+ ? meta.defaultRegion
83
+ : null
84
+ if (!defaultRegion) return
85
+
86
+ const defaultSuiteKey = `${agent}.${defaultRegion}`
87
+ if (await suiteOrConfigExists(baseDir, defaultSuiteKey)) return
88
+ if (!(await suiteOrConfigExists(baseDir, agent))) return
89
+
90
+ // Non-trivial: one-time migration so the first region-aware run does NOT silently fall back to the
91
+ // legacy suite/config (which would incorrectly show the same tests for every region).
92
+ const legacyJsonl = path.resolve(baseDir, `${agent}.tests.jsonl`)
93
+ const legacyJson = path.resolve(baseDir, `${agent}.tests.json`)
94
+ const legacyCfg = path.resolve(baseDir, `${agent}.config.json`)
95
+
96
+ const targetJsonl = path.resolve(baseDir, `${defaultSuiteKey}.tests.jsonl`)
97
+ const targetCfg = path.resolve(baseDir, `${defaultSuiteKey}.config.json`)
98
+
99
+ await mkdir(baseDir, { recursive: true })
100
+
101
+ if (!(await fileExists(targetJsonl)) && (await fileExists(legacyJsonl))) {
102
+ await copyFile(legacyJsonl, targetJsonl)
103
+ } else if (!(await fileExists(targetJsonl)) && (await fileExists(legacyJson))) {
104
+ // Convert legacy JSON suite to JSONL so the new file matches the expected layout.
105
+ const raw = await readFile(legacyJson, 'utf8')
106
+ const parsed = JSON.parse(raw) as any
107
+ const metaObj = parsed?.meta && typeof parsed.meta === 'object' ? parsed.meta : {}
108
+ const tests = Array.isArray(parsed?.tests) ? parsed.tests : []
109
+ const header = { version: 1, meta: metaObj }
110
+ const lines = [JSON.stringify(header), ...tests.map((t: any) => JSON.stringify(t))]
111
+ await writeFile(targetJsonl, lines.join('\n') + '\n', 'utf8')
112
+ }
113
+
114
+ if (!(await fileExists(targetCfg)) && (await fileExists(legacyCfg))) {
115
+ await copyFile(legacyCfg, targetCfg)
116
+ }
117
+ }
118
+
119
+ type SuiteSelection = {
120
+ suiteKey: string
121
+ agentId: string
122
+ region?: string
123
+ }
124
+
125
+ async function resolveSuiteSelection(
126
+ agentId: string,
127
+ region?: string | null
128
+ ): Promise<SuiteSelection> {
129
+ // Convention:
130
+ // - `agentId` is the canonical factory key (workflow export key).
131
+ // - `suiteKey` is the filesystem/report key:
132
+ // - non-regional projects: `${agentId}`
133
+ // - regional projects: `${agentId}.${region}`
134
+ // We never substitute legacy tests for the wrong region.
135
+ const baseDir = path.dirname(await getRootPath())
136
+
137
+ const meta = await loadRegionMeta(agentId)
138
+ const isRegionScoped = !!meta && meta.availableRegions.length > 0
139
+ if (!isRegionScoped) return { suiteKey: agentId, agentId }
140
+
141
+ await migrateLegacySuiteToDefaultRegion(baseDir, agentId)
142
+
143
+ const resolvedRegion = (region ?? '').trim()
144
+ if (!resolvedRegion) {
145
+ throw new Error(
146
+ `Region is required for tests when regional config is present for agent '${agentId}'.`
147
+ )
148
+ }
149
+
150
+ if (!meta.availableRegions.includes(resolvedRegion)) {
151
+ throw new Error(`Region '${resolvedRegion}' is not configured for agent '${agentId}'.`)
152
+ }
153
+
154
+ return { suiteKey: `${agentId}.${resolvedRegion}`, agentId, region: resolvedRegion }
155
+ }
22
156
 
23
157
  export function createTestsRouter(t: TRPCRootObject<TrpcContext, any, any>) {
24
158
  return t.router({
25
- list: t.procedure.input(z.object({ agent: z.string() })).query(({ input }) => {
26
- return loadTests(input.agent)
27
- }),
28
- config: t.procedure.input(z.object({ agent: z.string() })).query(({ input }) => {
29
- return loadConfig(input.agent)
30
- }),
159
+ list: t.procedure
160
+ .input(z.object({ agent: z.string(), region: z.string().nullish() }))
161
+ .query(async ({ input }) => {
162
+ const { suiteKey } = await resolveSuiteSelection(input.agent, input.region)
163
+ return loadTests(suiteKey)
164
+ }),
165
+ config: t.procedure
166
+ .input(z.object({ agent: z.string(), region: z.string().nullish() }))
167
+ .query(async ({ input }) => {
168
+ const { suiteKey } = await resolveSuiteSelection(input.agent, input.region)
169
+ return loadConfig(suiteKey)
170
+ }),
31
171
  updateConfig: t.procedure
32
- .input(z.object({ agent: z.string(), cfg: RunConfigSchema }))
33
- .mutation(({ input }) => {
34
- return saveConfig(input.agent, input.cfg)
172
+ .input(z.object({ agent: z.string(), region: z.string().nullish(), cfg: RunConfigSchema }))
173
+ .mutation(async ({ input }) => {
174
+ const { suiteKey } = await resolveSuiteSelection(input.agent, input.region)
175
+ return saveConfig(suiteKey, input.cfg)
176
+ }),
177
+ latestResult: t.procedure
178
+ .input(z.object({ agent: z.string(), region: z.string().nullish() }))
179
+ .query(async ({ input }) => {
180
+ const { suiteKey } = await resolveSuiteSelection(input.agent, input.region)
181
+ return loadLatestResultsByTest(suiteKey)
35
182
  }),
36
- latestResult: t.procedure.input(z.object({ agent: z.string() })).query(({ input }) => {
37
- return loadLatestResultsByTest(input.agent)
38
- }),
39
183
  resultEntry: t.procedure
40
184
  .input(
41
185
  z.object({
42
186
  agent: z.string(),
187
+ region: z.string().nullish(),
43
188
  testId: z.string(),
44
189
  // TODO resultKey should be keyof of ResultEntry
45
190
  resultKey: z.string(),
@@ -47,9 +192,10 @@ export function createTestsRouter(t: TRPCRootObject<TrpcContext, any, any>) {
47
192
  timestamp: z.string().optional()
48
193
  })
49
194
  )
50
- .query(({ input }) => {
195
+ .query(async ({ input }) => {
196
+ const { suiteKey } = await resolveSuiteSelection(input.agent, input.region)
51
197
  return getResultEntry(
52
- input.agent,
198
+ suiteKey,
53
199
  input.testId,
54
200
  input.resultKey as any,
55
201
  input.index,
@@ -60,13 +206,20 @@ export function createTestsRouter(t: TRPCRootObject<TrpcContext, any, any>) {
60
206
  .input(
61
207
  z.object({
62
208
  agent: z.string(),
209
+ region: z.string().nullish(),
63
210
  testId: z.string(),
64
211
  index: z.number().int().nonnegative(),
65
212
  timestamp: z.string().optional()
66
213
  })
67
214
  )
68
215
  .mutation(async ({ input }) => {
69
- return analyzeRunQuotes(input)
216
+ const { suiteKey } = await resolveSuiteSelection(input.agent, input.region)
217
+ return analyzeRunQuotes({
218
+ agent: suiteKey,
219
+ testId: input.testId,
220
+ index: input.index,
221
+ timestamp: input.timestamp
222
+ })
70
223
  }),
71
224
  findPromptIssues: t.procedure
72
225
  .input(
@@ -79,40 +232,63 @@ export function createTestsRouter(t: TRPCRootObject<TrpcContext, any, any>) {
79
232
  .mutation(async ({ input }) => {
80
233
  return findPromptIssues(input)
81
234
  }),
82
- suite: t.procedure.input(z.object({ agent: z.string() })).query(({ input }) => {
83
- return readSuite(input.agent)
84
- }),
235
+ suite: t.procedure
236
+ .input(z.object({ agent: z.string(), region: z.string().nullish() }))
237
+ .query(async ({ input }) => {
238
+ const { suiteKey } = await resolveSuiteSelection(input.agent, input.region)
239
+ return readSuite(suiteKey)
240
+ }),
85
241
  addTest: t.procedure
86
242
  .input(
87
- z.object({ agent: z.string(), mergeContexts: z.boolean(), seed: TestRowSchema.partial() })
243
+ z.object({
244
+ agent: z.string(),
245
+ region: z.string().nullish(),
246
+ mergeContexts: z.boolean(),
247
+ seed: TestRowSchema.partial()
248
+ })
88
249
  )
89
- .mutation(({ input }) => {
90
- return addTest(input.agent, input.mergeContexts, input.seed)
250
+ .mutation(async ({ input }) => {
251
+ const { suiteKey } = await resolveSuiteSelection(input.agent, input.region)
252
+ return addTest(suiteKey, input.mergeContexts, input.seed)
91
253
  }),
92
254
  patchTest: t.procedure
93
- .input(z.object({ agent: z.string(), id: z.string(), patch: TestRowSchema.partial() }))
94
- .mutation(({ input }) => {
95
- return patchTest(input.agent, input.id, input.patch)
255
+ .input(
256
+ z.object({
257
+ agent: z.string(),
258
+ region: z.string().nullish(),
259
+ id: z.string(),
260
+ patch: TestRowSchema.partial()
261
+ })
262
+ )
263
+ .mutation(async ({ input }) => {
264
+ const { suiteKey } = await resolveSuiteSelection(input.agent, input.region)
265
+ return patchTest(suiteKey, input.id, input.patch)
96
266
  }),
97
267
  patchTestsBatch: t.procedure
98
268
  .input(
99
269
  z.object({
100
270
  agent: z.string(),
271
+ region: z.string().nullish(),
101
272
  updates: z.array(z.object({ id: z.string(), patch: TestRowSchema.partial() }))
102
273
  })
103
274
  )
104
- .mutation(({ input }) => {
105
- return patchTestsBatch(input.agent, input.updates)
275
+ .mutation(async ({ input }) => {
276
+ const { suiteKey } = await resolveSuiteSelection(input.agent, input.region)
277
+ return patchTestsBatch(suiteKey, input.updates)
106
278
  }),
107
279
  deleteTest: t.procedure
108
- .input(z.object({ agent: z.string(), id: z.string() }))
109
- .mutation(({ input }) => {
110
- return deleteTest(input.agent, input.id)
280
+ .input(z.object({ agent: z.string(), region: z.string().nullish(), id: z.string() }))
281
+ .mutation(async ({ input }) => {
282
+ const { suiteKey } = await resolveSuiteSelection(input.agent, input.region)
283
+ return deleteTest(suiteKey, input.id)
111
284
  }),
112
285
  reorder: t.procedure
113
- .input(z.object({ agent: z.string(), order: z.array(z.string()) }))
114
- .mutation(({ input }) => {
115
- return reorderTests(input.agent, input.order)
286
+ .input(
287
+ z.object({ agent: z.string(), region: z.string().nullish(), order: z.array(z.string()) })
288
+ )
289
+ .mutation(async ({ input }) => {
290
+ const { suiteKey } = await resolveSuiteSelection(input.agent, input.region)
291
+ return reorderTests(suiteKey, input.order)
116
292
  }),
117
293
  runTests: t.procedure
118
294
  .input(
@@ -120,25 +296,31 @@ export function createTestsRouter(t: TRPCRootObject<TrpcContext, any, any>) {
120
296
  z
121
297
  .object({
122
298
  agent: z.string(),
299
+ region: z.string().nullish(),
123
300
  scope: z.enum(['pinned', 'all']).optional()
124
301
  })
125
302
  .strict(),
126
303
  z
127
304
  .object({
128
305
  agent: z.string(),
306
+ region: z.string().nullish(),
129
307
  testId: z.string()
130
308
  })
131
309
  .strict()
132
310
  ])
133
311
  )
134
- .mutation(({ input }) => {
312
+ .mutation(async ({ input }) => {
313
+ const selection = await resolveSuiteSelection(input.agent, input.region)
135
314
  if ('testId' in input) {
136
- return runPromptTestsManaged(input.agent, { testId: input.testId })
315
+ return runPromptTestsManaged(selection, { testId: input.testId })
137
316
  }
138
- return runPromptTestsManaged(input.agent, { scope: input.scope ?? 'pinned' })
317
+ return runPromptTestsManaged(selection, { scope: input.scope ?? 'pinned' })
139
318
  }),
140
- cancelRun: t.procedure.input(z.object({ agent: z.string() })).mutation(({ input }) => {
141
- return cancelPromptTests(input.agent)
142
- })
319
+ cancelRun: t.procedure
320
+ .input(z.object({ agent: z.string(), region: z.string().nullish() }))
321
+ .mutation(async ({ input }) => {
322
+ const { suiteKey } = await resolveSuiteSelection(input.agent, input.region)
323
+ return cancelPromptTests(suiteKey)
324
+ })
143
325
  })
144
326
  }
@@ -1 +0,0 @@
1
- *,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:DarkerGrotesque,ui-sans-serif,system-ui,Segoe UI,Roboto,Helvetica,Arial,sans-serif;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}[type=text],input:where(:not([type])),[type=email],[type=url],[type=password],[type=number],[type=date],[type=datetime-local],[type=month],[type=search],[type=tel],[type=time],[type=week],[multiple],textarea,select{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fff;border-color:#6b7280;border-width:1px;border-radius:0;padding:.5rem .75rem;font-size:1rem;line-height:1.5rem;--tw-shadow: 0 0 #0000}[type=text]:focus,input:where(:not([type])):focus,[type=email]:focus,[type=url]:focus,[type=password]:focus,[type=number]:focus,[type=date]:focus,[type=datetime-local]:focus,[type=month]:focus,[type=search]:focus,[type=tel]:focus,[type=time]:focus,[type=week]:focus,[multiple]:focus,textarea:focus,select:focus{outline:2px solid transparent;outline-offset:2px;--tw-ring-inset: var(--tw-empty, );--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: #2563eb;--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);border-color:#2563eb}input::-moz-placeholder,textarea::-moz-placeholder{color:#6b7280;opacity:1}input::placeholder,textarea::placeholder{color:#6b7280;opacity:1}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-date-and-time-value{min-height:1.5em;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit,::-webkit-datetime-edit-year-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute-field,::-webkit-datetime-edit-second-field,::-webkit-datetime-edit-millisecond-field,::-webkit-datetime-edit-meridiem-field{padding-top:0;padding-bottom:0}select{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3e%3cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='M6 8l4 4 4-4'/%3e%3c/svg%3e");background-position:right .5rem center;background-repeat:no-repeat;background-size:1.5em 1.5em;padding-right:2.5rem;-webkit-print-color-adjust:exact;print-color-adjust:exact}[multiple],[size]:where(select:not([size="1"])){background-image:initial;background-position:initial;background-repeat:unset;background-size:initial;padding-right:.75rem;-webkit-print-color-adjust:unset;print-color-adjust:unset}[type=checkbox],[type=radio]{-webkit-appearance:none;-moz-appearance:none;appearance:none;padding:0;-webkit-print-color-adjust:exact;print-color-adjust:exact;display:inline-block;vertical-align:middle;background-origin:border-box;-webkit-user-select:none;-moz-user-select:none;user-select:none;flex-shrink:0;height:1rem;width:1rem;color:#2563eb;background-color:#fff;border-color:#6b7280;border-width:1px;--tw-shadow: 0 0 #0000}[type=checkbox]{border-radius:0}[type=radio]{border-radius:100%}[type=checkbox]:focus,[type=radio]:focus{outline:2px solid transparent;outline-offset:2px;--tw-ring-inset: var(--tw-empty, );--tw-ring-offset-width: 2px;--tw-ring-offset-color: #fff;--tw-ring-color: #2563eb;--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}[type=checkbox]:checked,[type=radio]:checked{border-color:transparent;background-color:currentColor;background-size:100% 100%;background-position:center;background-repeat:no-repeat}[type=checkbox]:checked{background-image:url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M12.207 4.793a1 1 0 010 1.414l-5 5a1 1 0 01-1.414 0l-2-2a1 1 0 011.414-1.414L6.5 9.086l4.293-4.293a1 1 0 011.414 0z'/%3e%3c/svg%3e")}@media (forced-colors: active){[type=checkbox]:checked{-webkit-appearance:auto;-moz-appearance:auto;appearance:auto}}[type=radio]:checked{background-image:url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3ccircle cx='8' cy='8' r='3'/%3e%3c/svg%3e")}@media (forced-colors: active){[type=radio]:checked{-webkit-appearance:auto;-moz-appearance:auto;appearance:auto}}[type=checkbox]:checked:hover,[type=checkbox]:checked:focus,[type=radio]:checked:hover,[type=radio]:checked:focus{border-color:transparent;background-color:currentColor}[type=checkbox]:indeterminate{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 16 16'%3e%3cpath stroke='white' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M4 8h8'/%3e%3c/svg%3e");border-color:transparent;background-color:currentColor;background-size:100% 100%;background-position:center;background-repeat:no-repeat}@media (forced-colors: active){[type=checkbox]:indeterminate{-webkit-appearance:auto;-moz-appearance:auto;appearance:auto}}[type=checkbox]:indeterminate:hover,[type=checkbox]:indeterminate:focus{border-color:transparent;background-color:currentColor}[type=file]{background:unset;border-color:inherit;border-width:0;border-radius:0;padding:0;font-size:unset;line-height:inherit}[type=file]:focus{outline:1px solid ButtonText;outline:1px auto -webkit-focus-ring-color}.pointer-events-none{pointer-events:none}.visible{visibility:visible}.invisible{visibility:hidden}.collapse{visibility:collapse}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{top:0;right:0;bottom:0;left:0}.inset-2{top:.5rem;right:.5rem;bottom:.5rem;left:.5rem}.inset-x-0{left:0;right:0}.-left-28{left:-7rem}.bottom-0{bottom:0}.bottom-1{bottom:.25rem}.bottom-2{bottom:.5rem}.bottom-full{bottom:100%}.left-0{left:0}.left-1\/2{left:50%}.left-2{left:.5rem}.right-0{right:0}.right-2{right:.5rem}.right-6{right:1.5rem}.top-0{top:0}.top-1{top:.25rem}.top-1\/2{top:50%}.top-2{top:.5rem}.top-full{top:100%}.z-0{z-index:0}.z-10{z-index:10}.z-20{z-index:20}.z-30{z-index:30}.z-50{z-index:50}.z-popover{z-index:1300}.m-0{margin:0}.m-4{margin:1rem}.m-auto{margin:auto}.mx-1{margin-left:.25rem;margin-right:.25rem}.mx-2{margin-left:.5rem;margin-right:.5rem}.mx-4{margin-left:1rem;margin-right:1rem}.mx-auto{margin-left:auto;margin-right:auto}.my-1{margin-top:.25rem;margin-bottom:.25rem}.my-2{margin-top:.5rem;margin-bottom:.5rem}.my-3{margin-top:.75rem;margin-bottom:.75rem}.mb-1{margin-bottom:.25rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.ml-0{margin-left:0}.ml-1{margin-left:.25rem}.ml-2{margin-left:.5rem}.ml-4{margin-left:1rem}.ml-9{margin-left:2.25rem}.ml-auto{margin-left:auto}.mr-2{margin-right:.5rem}.mr-3{margin-right:.75rem}.mt-0{margin-top:0}.mt-1{margin-top:.25rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mt-48{margin-top:12rem}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.table-cell{display:table-cell}.table-row{display:table-row}.grid{display:grid}.contents{display:contents}.hidden{display:none}.size-5{width:1.25rem;height:1.25rem}.size-6{width:1.5rem;height:1.5rem}.size-7{width:1.75rem;height:1.75rem}.h-0\.5{height:.125rem}.h-14{height:3.5rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-7{height:1.75rem}.h-8{height:2rem}.h-\[55vh\]{height:55vh}.h-\[70vh\]{height:70vh}.h-auto{height:auto}.h-full{height:100%}.h-screen{height:100vh}.h-xl{height:90px}.max-h-60{max-height:15rem}.max-h-96{max-height:24rem}.max-h-\[60vh\]{max-height:60vh}.max-h-\[90vh\]{max-height:90vh}.max-h-\[calc\(90vh-7rem\)\]{max-height:calc(90vh - 7rem)}.min-h-0{min-height:0px}.min-h-11{min-height:2.75rem}.min-h-96{min-height:24rem}.\!w-\[80vw\]{width:80vw!important}.\!w-\[85vw\]{width:85vw!important}.w-1\/3{width:33.333333%}.w-16{width:4rem}.w-2\/3{width:66.666667%}.w-36{width:9rem}.w-4{width:1rem}.w-40{width:10rem}.w-44{width:11rem}.w-48{width:12rem}.w-5{width:1.25rem}.w-50vw{width:50vw}.w-56{width:14rem}.w-6{width:1.5rem}.w-7{width:1.75rem}.w-8{width:2rem}.w-80{width:20rem}.w-\[95vw\]{width:95vw}.w-fit{width:-moz-fit-content;width:fit-content}.w-full{width:100%}.w-max{width:-moz-max-content;width:max-content}.w-xl{width:90px}.min-w-0{min-width:0px}.min-w-fit{min-width:-moz-fit-content;min-width:fit-content}.min-w-full{min-width:100%}.min-w-xl{min-width:90px}.\!max-w-3xl{max-width:48rem!important}.\!max-w-4xl{max-width:56rem!important}.\!max-w-5xl{max-width:64rem!important}.max-w-2xl{max-width:42rem}.max-w-6xl{max-width:72rem}.max-w-\[70\%\]{max-width:70%}.max-w-\[83\%\]{max-width:83%}.max-w-\[min\(26rem\,90vw\)\]{max-width:min(26rem,90vw)}.flex-1{flex:1 1 0%}.flex-none{flex:none}.flex-shrink-0,.shrink-0{flex-shrink:0}.grow{flex-grow:1}.-translate-x-1\/2{--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-1\/2{--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-180{--tw-rotate: 180deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.scale-110{--tw-scale-x: 1.1;--tw-scale-y: 1.1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.cursor-text{cursor:text}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.select-text{-webkit-user-select:text;-moz-user-select:text;user-select:text}.resize{resize:both}.appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-\[2\.25rem\,1fr\]{grid-template-columns:2.25rem 1fr}.grid-cols-\[minmax\(140px\,2fr\)_minmax\(0\,10fr\)_minmax\(0\,11fr\)\]{grid-template-columns:minmax(140px,2fr) minmax(0,10fr) minmax(0,11fr)}.grid-rows-3{grid-template-rows:repeat(3,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.flex-nowrap{flex-wrap:nowrap}.place-items-center{place-items:center}.items-start{align-items:flex-start}.items-center{align-items:center}.items-baseline{align-items:baseline}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-0{gap:0px}.gap-1{gap:.25rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-5{gap:1.25rem}.gap-x-2{-moz-column-gap:.5rem;column-gap:.5rem}.gap-x-4{-moz-column-gap:1rem;column-gap:1rem}.gap-y-0{row-gap:0px}.gap-y-1{row-gap:.25rem}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.75rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem * var(--tw-space-y-reverse))}.space-y-5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.25rem * var(--tw-space-y-reverse))}.self-start{align-self:flex-start}.self-end{align-self:flex-end}.self-center{align-self:center}.justify-self-end{justify-self:end}.justify-self-center{justify-self:center}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-scroll{overflow:scroll}.overflow-y-auto{overflow-y:auto}.overflow-x-hidden{overflow-x:hidden}.overflow-y-hidden{overflow-y:hidden}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.whitespace-nowrap{white-space:nowrap}.whitespace-pre{white-space:pre}.whitespace-pre-line{white-space:pre-line}.whitespace-pre-wrap{white-space:pre-wrap}.text-nowrap{text-wrap:nowrap}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.\!rounded-none{border-radius:0!important}.rounded{border-radius:.25rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:8px}.rounded-md{border-radius:5px}.rounded-none{border-radius:0}.rounded-sm{border-radius:3px}.rounded-b{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.rounded-r-none{border-top-right-radius:0;border-bottom-right-radius:0}.rounded-t{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.\!border{border-width:1px!important}.border{border-width:1px}.border-0{border-width:0px}.border-thin{border-width:.4px}.border-b{border-bottom-width:1px}.border-b-thin{border-bottom-width:.4px}.border-r{border-right-width:1px}.border-r-thin{border-right-width:.4px}.border-t{border-top-width:1px}.border-solid{border-style:solid}.border-dashed{border-style:dashed}.border-none{border-style:none}.\!border-rc-gray-500{--tw-border-opacity: 1 !important;border-color:rgb(75 75 75 / var(--tw-border-opacity, 1))!important}.border-emerald-500{--tw-border-opacity: 1;border-color:rgb(16 185 129 / var(--tw-border-opacity, 1))}.border-gray-600{--tw-border-opacity: 1;border-color:rgb(75 85 99 / var(--tw-border-opacity, 1))}.border-rc-gray-050{border-color:#ffffff1a}.border-rc-gray-110{border-color:#dddddd1a}.border-rc-gray-300{--tw-border-opacity: 1;border-color:rgb(118 118 118 / var(--tw-border-opacity, 1))}.border-rc-gray-300\/40{border-color:#76767666}.border-rc-gray-500{--tw-border-opacity: 1;border-color:rgb(75 75 75 / var(--tw-border-opacity, 1))}.border-rc-gray-600{--tw-border-opacity: 1;border-color:rgb(55 55 55 / var(--tw-border-opacity, 1))}.border-rc-gray-650{--tw-border-opacity: 1;border-color:rgb(38 38 38 / var(--tw-border-opacity, 1))}.border-rc-gray-700{--tw-border-opacity: 1;border-color:rgb(34 34 34 / var(--tw-border-opacity, 1))}.border-rc-green-450{border-color:#0457431a}.border-rc-red-600{--tw-border-opacity: 1;border-color:rgb(255 102 102 / var(--tw-border-opacity, 1))}.border-red-500{--tw-border-opacity: 1;border-color:rgb(239 68 68 / var(--tw-border-opacity, 1))}.border-transparent{border-color:transparent}.border-r-gray-700\/50{border-right-color:#37415180}.border-r-rc-gray-600{--tw-border-opacity: 1;border-right-color:rgb(55 55 55 / var(--tw-border-opacity, 1))}.\!bg-rc-gray-700{--tw-bg-opacity: 1 !important;background-color:rgb(34 34 34 / var(--tw-bg-opacity, 1))!important}.bg-black\/20{background-color:#0003}.bg-black\/50{background-color:#00000080}.bg-black\/60{background-color:#0009}.bg-gray-200{--tw-bg-opacity: 1;background-color:rgb(229 231 235 / var(--tw-bg-opacity, 1))}.bg-gray-600{--tw-bg-opacity: 1;background-color:rgb(75 85 99 / var(--tw-bg-opacity, 1))}.bg-rc-gray-600{--tw-bg-opacity: 1;background-color:rgb(55 55 55 / var(--tw-bg-opacity, 1))}.bg-rc-gray-700{--tw-bg-opacity: 1;background-color:rgb(34 34 34 / var(--tw-bg-opacity, 1))}.bg-rc-gray-700\/70{background-color:#222222b3}.bg-rc-gray-800{--tw-bg-opacity: 1;background-color:rgb(29 29 29 / var(--tw-bg-opacity, 1))}.bg-rc-gray-800\/40{background-color:#1d1d1d66}.bg-rc-gray-900{--tw-bg-opacity: 1;background-color:rgb(25 25 25 / var(--tw-bg-opacity, 1))}.bg-rc-gray-900\/40{background-color:#19191966}.bg-rc-gray-930{background-color:#00000003}.bg-rc-gray-980{--tw-bg-opacity: 1;background-color:rgb(24 24 24 / var(--tw-bg-opacity, 1))}.bg-rc-green-200{--tw-bg-opacity: 1;background-color:rgb(0 181 138 / var(--tw-bg-opacity, 1))}.bg-rc-green-350{background-color:#09754f99}.bg-rc-green-700{--tw-bg-opacity: 1;background-color:rgb(0 90 69 / var(--tw-bg-opacity, 1))}.bg-red-50{--tw-bg-opacity: 1;background-color:rgb(254 242 242 / var(--tw-bg-opacity, 1))}.bg-red-950\/30{background-color:#450a0a4d}.bg-red-950\/40{background-color:#450a0a66}.bg-transparent{background-color:transparent}.object-contain{-o-object-fit:contain;object-fit:contain}.\!p-2{padding:.5rem!important}.p-0{padding:0}.p-1{padding:.25rem}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.\!px-3{padding-left:.75rem!important;padding-right:.75rem!important}.px-1{padding-left:.25rem;padding-right:.25rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-8{padding-top:2rem;padding-bottom:2rem}.\!pb-1{padding-bottom:.25rem!important}.\!pr-8{padding-right:2rem!important}.\!pt-\[5px\]{padding-top:5px!important}.pb-1{padding-bottom:.25rem}.pb-16{padding-bottom:4rem}.pb-2{padding-bottom:.5rem}.pb-2\.5{padding-bottom:.625rem}.pb-3{padding-bottom:.75rem}.pb-6{padding-bottom:1.5rem}.pb-xs{padding-bottom:2px}.pl-11{padding-left:2.75rem}.pl-2{padding-left:.5rem}.pl-3{padding-left:.75rem}.pl-4{padding-left:1rem}.pl-5{padding-left:1.25rem}.pr-1{padding-right:.25rem}.pr-2{padding-right:.5rem}.pr-3{padding-right:.75rem}.pr-4{padding-right:1rem}.pr-8{padding-right:2rem}.pr-80{padding-right:20rem}.pt-1{padding-top:.25rem}.pt-2{padding-top:.5rem}.pt-40{padding-top:10rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.text-justify{text-align:justify}.align-text-bottom{vertical-align:text-bottom}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.font-sans{font-family:DarkerGrotesque,ui-sans-serif,system-ui,Segoe UI,Roboto,Helvetica,Arial,sans-serif}.text-4xl{font-size:2.25rem;line-height:1.2}.text-\[12px\]{font-size:12px}.text-\[13px\]{font-size:13px}.text-\[16px\]{font-size:16px}.text-base{font-size:.875rem;line-height:1.2}.text-lg{font-size:1.125rem;line-height:1.2;letter-spacing:.005em}.text-sm{font-size:.8125rem;line-height:1.25;letter-spacing:.005em}.text-xl{font-size:1.25rem;line-height:.9;letter-spacing:.005em}.text-xs{font-size:.75rem;line-height:1.1;letter-spacing:.01em}.\!font-medium{font-weight:500!important}.font-bold{font-weight:700}.font-extrabold{font-weight:800}.font-normal{font-weight:400}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.italic{font-style:italic}.leading-\[1\.2\]{line-height:1.2}.leading-none{line-height:1}.leading-snug{line-height:1.375}.tracking-wide{letter-spacing:.025em}.text-emerald-500{--tw-text-opacity: 1;color:rgb(16 185 129 / var(--tw-text-opacity, 1))}.text-gray-100{--tw-text-opacity: 1;color:rgb(243 244 246 / var(--tw-text-opacity, 1))}.text-gray-200{--tw-text-opacity: 1;color:rgb(229 231 235 / var(--tw-text-opacity, 1))}.text-gray-300{--tw-text-opacity: 1;color:rgb(209 213 219 / var(--tw-text-opacity, 1))}.text-gray-400{--tw-text-opacity: 1;color:rgb(156 163 175 / var(--tw-text-opacity, 1))}.text-gray-500{--tw-text-opacity: 1;color:rgb(107 114 128 / var(--tw-text-opacity, 1))}.text-inherit{color:inherit}.text-rc-blue{--tw-text-opacity: 1;color:rgb(86 156 214 / var(--tw-text-opacity, 1))}.text-rc-gray-100{--tw-text-opacity: 1;color:rgb(221 221 221 / var(--tw-text-opacity, 1))}.text-rc-gray-200{--tw-text-opacity: 1;color:rgb(175 175 175 / var(--tw-text-opacity, 1))}.text-rc-gray-200\/70{color:#afafafb3}.text-rc-gray-300{--tw-text-opacity: 1;color:rgb(118 118 118 / var(--tw-text-opacity, 1))}.text-rc-gray-400{--tw-text-opacity: 1;color:rgb(99 99 99 / var(--tw-text-opacity, 1))}.text-rc-gray-400\/70{color:#636363b3}.text-rc-gray-500{--tw-text-opacity: 1;color:rgb(75 75 75 / var(--tw-text-opacity, 1))}.text-rc-green-200{--tw-text-opacity: 1;color:rgb(0 181 138 / var(--tw-text-opacity, 1))}.text-rc-green-350{color:#09754f99}.text-rc-green-400{--tw-text-opacity: 1;color:rgb(4 87 67 / var(--tw-text-opacity, 1))}.text-rc-red-600{--tw-text-opacity: 1;color:rgb(255 102 102 / var(--tw-text-opacity, 1))}.text-rc-red-800{--tw-text-opacity: 1;color:rgb(255 129 101 / var(--tw-text-opacity, 1))}.text-red-200{--tw-text-opacity: 1;color:rgb(254 202 202 / var(--tw-text-opacity, 1))}.text-red-400{--tw-text-opacity: 1;color:rgb(248 113 113 / var(--tw-text-opacity, 1))}.text-red-800{--tw-text-opacity: 1;color:rgb(153 27 27 / var(--tw-text-opacity, 1))}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.underline{text-decoration-line:underline}.placeholder-rc-gray-300::-moz-placeholder{--tw-placeholder-opacity: 1;color:rgb(118 118 118 / var(--tw-placeholder-opacity, 1))}.placeholder-rc-gray-300::placeholder{--tw-placeholder-opacity: 1;color:rgb(118 118 118 / var(--tw-placeholder-opacity, 1))}.\!accent-rc-gray-600{accent-color:#373737!important}.opacity-0{opacity:0}.opacity-100{opacity:1}.opacity-50{opacity:.5}.opacity-65{opacity:.65}.shadow-2xl{--tw-shadow: 0 25px 50px -12px rgb(0 0 0 / .25);--tw-shadow-colored: 0 25px 50px -12px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-inner-white-soft{--tw-shadow: inset 0 0 10px 0 rgba(255,255,255,.1);--tw-shadow-colored: inset 0 0 10px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-md{--tw-shadow: 0 4px 6px -1px rgb(0 0 0 / .1), 0 2px 4px -2px rgb(0 0 0 / .1);--tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow: 0 0 0 1px rgba(118, 118, 118, .4);--tw-shadow-colored: 0 0 0 1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-xl{--tw-shadow: 0 20px 25px -5px rgb(0 0 0 / .1), 0 8px 10px -6px rgb(0 0 0 / .1);--tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.outline-none{outline:2px solid transparent;outline-offset:2px}.ring-0{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-blur-2xl{--tw-backdrop-blur: blur(40px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.backdrop-blur-3xl{--tw-backdrop-blur: blur(64px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.backdrop-blur-md{--tw-backdrop-blur: blur(12px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.backdrop-blur-sm{--tw-backdrop-blur: blur(4px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.backdrop-blur-xl{--tw-backdrop-blur: blur(24px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-100{transition-duration:.1s}.duration-200{transition-duration:.2s}.duration-300{transition-duration:.3s}.ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}.analysis-quote{border-radius:2px}.analysis-quote-focus{box-shadow:inset 0 0 0 1px #fecacaf2,inset 0 0 0 3px #dc262640;border-radius:2px}.analysis-quote-l1{background:#dc26262e}.analysis-quote-l2{background:#dc26263d}.analysis-quote-l3{background:#dc26264d}.analysis-quote-l4{background:#dc26265c}.analysis-quote-l5{background:#dc26266b}.analysis-quote-l6{background:#dc26267a}.analysis-quote-l7{background:#dc26268a}.analysis-quote-l8{background:#dc262699}.analysis-quote-l9{background:#dc2626a8}.analysis-quote-l10{background:#dc2626b8}.monaco-editor .test-expected-output{color:#00b58a!important}.monaco-editor .test-expected-output-tag{color:#ce9178!important}.placeholder\:text-gray-500::-moz-placeholder{--tw-text-opacity: 1;color:rgb(107 114 128 / var(--tw-text-opacity, 1))}.placeholder\:text-gray-500::placeholder{--tw-text-opacity: 1;color:rgb(107 114 128 / var(--tw-text-opacity, 1))}.last\:border-b-0:last-child{border-bottom-width:0px}.checked\:border-rc-gray-200:checked{--tw-border-opacity: 1;border-color:rgb(175 175 175 / var(--tw-border-opacity, 1))}.checked\:bg-rc-gray-600:checked{--tw-bg-opacity: 1;background-color:rgb(55 55 55 / var(--tw-bg-opacity, 1))}.hover\:border:hover{border-width:1px}.hover\:border-gray-500:hover{--tw-border-opacity: 1;border-color:rgb(107 114 128 / var(--tw-border-opacity, 1))}.hover\:border-rc-gray-200:hover{--tw-border-opacity: 1;border-color:rgb(175 175 175 / var(--tw-border-opacity, 1))}.hover\:border-rc-gray-400:hover{--tw-border-opacity: 1;border-color:rgb(99 99 99 / var(--tw-border-opacity, 1))}.hover\:border-rc-gray-500:hover{--tw-border-opacity: 1;border-color:rgb(75 75 75 / var(--tw-border-opacity, 1))}.hover\:border-rc-green-200:hover{--tw-border-opacity: 1;border-color:rgb(0 181 138 / var(--tw-border-opacity, 1))}.hover\:bg-rc-gray-600:hover{--tw-bg-opacity: 1;background-color:rgb(55 55 55 / var(--tw-bg-opacity, 1))}.hover\:bg-rc-gray-650:hover{--tw-bg-opacity: 1;background-color:rgb(38 38 38 / var(--tw-bg-opacity, 1))}.hover\:bg-rc-gray-700:hover{--tw-bg-opacity: 1;background-color:rgb(34 34 34 / var(--tw-bg-opacity, 1))}.hover\:bg-rc-gray-700\/70:hover{background-color:#222222b3}.hover\:bg-rc-gray-800:hover{--tw-bg-opacity: 1;background-color:rgb(29 29 29 / var(--tw-bg-opacity, 1))}.hover\:bg-rc-gray-800\/40:hover{background-color:#1d1d1d66}.hover\:bg-rc-gray-900:hover{--tw-bg-opacity: 1;background-color:rgb(25 25 25 / var(--tw-bg-opacity, 1))}.hover\:bg-rc-green-250:hover{background-color:#005c3b99}.hover\:bg-double-gradient:hover{background-image:linear-gradient(0deg,#00000003,#00000003),linear-gradient(0deg,#ffffff0d,#ffffff0d)}.hover\:text-gray-100:hover{--tw-text-opacity: 1;color:rgb(243 244 246 / var(--tw-text-opacity, 1))}.hover\:text-gray-200:hover{--tw-text-opacity: 1;color:rgb(229 231 235 / var(--tw-text-opacity, 1))}.hover\:text-rc-gray-100:hover{--tw-text-opacity: 1;color:rgb(221 221 221 / var(--tw-text-opacity, 1))}.hover\:text-rc-gray-200:hover{--tw-text-opacity: 1;color:rgb(175 175 175 / var(--tw-text-opacity, 1))}.hover\:text-rc-green-100:hover{--tw-text-opacity: 1;color:rgb(147 255 109 / var(--tw-text-opacity, 1))}.hover\:text-rc-green-200:hover{--tw-text-opacity: 1;color:rgb(0 181 138 / var(--tw-text-opacity, 1))}.hover\:text-rc-green-250:hover{color:#005c3b99}.hover\:underline:hover{text-decoration-line:underline}.focus\:border-gray-500:focus{--tw-border-opacity: 1;border-color:rgb(107 114 128 / var(--tw-border-opacity, 1))}.focus\:border-rc-gray-300:focus{--tw-border-opacity: 1;border-color:rgb(118 118 118 / var(--tw-border-opacity, 1))}.focus\:border-rc-gray-400:focus{--tw-border-opacity: 1;border-color:rgb(99 99 99 / var(--tw-border-opacity, 1))}.focus\:bg-rc-gray-400:focus{--tw-bg-opacity: 1;background-color:rgb(99 99 99 / var(--tw-bg-opacity, 1))}.focus\:bg-rc-green-200:focus{--tw-bg-opacity: 1;background-color:rgb(0 181 138 / var(--tw-bg-opacity, 1))}.focus\:bg-double-gradient:focus{background-image:linear-gradient(0deg,#00000003,#00000003),linear-gradient(0deg,#ffffff0d,#ffffff0d)}.focus\:text-gray-100:focus{--tw-text-opacity: 1;color:rgb(243 244 246 / var(--tw-text-opacity, 1))}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-0:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-1:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-2:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-rc-gray-300:focus{--tw-ring-opacity: 1;--tw-ring-color: rgb(118 118 118 / var(--tw-ring-opacity, 1))}.focus-visible\:border-rc-gray-400:focus-visible{--tw-border-opacity: 1;border-color:rgb(99 99 99 / var(--tw-border-opacity, 1))}.focus-visible\:shadow-none:focus-visible{--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.focus-visible\:outline-none:focus-visible{outline:2px solid transparent;outline-offset:2px}.focus-visible\:outline:focus-visible{outline-style:solid}.focus-visible\:outline-2:focus-visible{outline-width:2px}.focus-visible\:-outline-offset-2:focus-visible{outline-offset:-2px}.active\:border-rc-gray-200:active{--tw-border-opacity: 1;border-color:rgb(175 175 175 / var(--tw-border-opacity, 1))}.active\:border-rc-gray-400:active{--tw-border-opacity: 1;border-color:rgb(99 99 99 / var(--tw-border-opacity, 1))}.active\:bg-rc-gray-600:active{--tw-bg-opacity: 1;background-color:rgb(55 55 55 / var(--tw-bg-opacity, 1))}.active\:bg-rc-green-250:active{background-color:#005c3b99}.active\:bg-double-gradient:active{background-image:linear-gradient(0deg,#00000003,#00000003),linear-gradient(0deg,#ffffff0d,#ffffff0d)}.active\:text-gray-100:active{--tw-text-opacity: 1;color:rgb(243 244 246 / var(--tw-text-opacity, 1))}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:text-rc-gray-400:disabled{--tw-text-opacity: 1;color:rgb(99 99 99 / var(--tw-text-opacity, 1))}.disabled\:opacity-50:disabled{opacity:.5}.disabled\:hover\:text-rc-gray-400:hover:disabled{--tw-text-opacity: 1;color:rgb(99 99 99 / var(--tw-text-opacity, 1))}.group:hover .group-hover\:text-rc-gray-200{--tw-text-opacity: 1;color:rgb(175 175 175 / var(--tw-text-opacity, 1))}.aria-selected\:text-rc-green-200[aria-selected=true]{--tw-text-opacity: 1;color:rgb(0 181 138 / var(--tw-text-opacity, 1))}.aria-selected\:after\:absolute[aria-selected=true]:after{content:var(--tw-content);position:absolute}.aria-selected\:after\:inset-x-0[aria-selected=true]:after{content:var(--tw-content);left:0;right:0}.aria-selected\:after\:bottom-0[aria-selected=true]:after{content:var(--tw-content);bottom:0}.aria-selected\:after\:h-0\.5[aria-selected=true]:after{content:var(--tw-content);height:.125rem}.aria-selected\:after\:bg-rc-green-200[aria-selected=true]:after{content:var(--tw-content);--tw-bg-opacity: 1;background-color:rgb(0 181 138 / var(--tw-bg-opacity, 1))}.aria-selected\:after\:content-\[\'\'\][aria-selected=true]:after{--tw-content: "";content:var(--tw-content)}@media (min-width: 640px){.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (min-width: 1024px){.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}}body{margin:0;padding:0;font-family:DarkerGrotesque,ui-sans-serif,system-ui,Segoe UI,Roboto,Helvetica,Arial,sans-serif;font-size:.875rem;line-height:1.2;font-weight:400;--tw-text-opacity: 1;color:rgb(118 118 118 / var(--tw-text-opacity, 1))}*{margin:0;padding:0;box-sizing:border-box}