@tangle-network/agent-eval 1.0.22 → 1.0.24

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 (233) hide show
  1. package/CHANGELOG.md +78 -0
  2. package/dist/adapters/http.d.ts +2 -2
  3. package/dist/{agent-profile-DU5InUT9.d.ts → agent-profile-DC_v4p1f.d.ts} +3 -3
  4. package/dist/{agent-profile-DU5InUT9.d.ts.map → agent-profile-DC_v4p1f.d.ts.map} +1 -1
  5. package/dist/analyst/index.d.ts +14 -14
  6. package/dist/analyst/index.js +9 -9
  7. package/dist/{analyze-runs-jLTRKuoK.js → analyze-runs-BCSHzqna.js} +2 -2
  8. package/dist/{analyze-runs-jLTRKuoK.js.map → analyze-runs-BCSHzqna.js.map} +1 -1
  9. package/dist/{analyze-runs-DYYe18Gw.d.ts → analyze-runs-DGr7mpC3.d.ts} +5 -5
  10. package/dist/{analyze-runs-DYYe18Gw.d.ts.map → analyze-runs-DGr7mpC3.d.ts.map} +1 -1
  11. package/dist/app-grade/index.d.ts +4 -4
  12. package/dist/app-grade/index.js +3 -3
  13. package/dist/{benchmark-command-DkUpd9Q6.js → benchmark-command-DRAHkn4D.js} +8 -9
  14. package/dist/{benchmark-command-DkUpd9Q6.js.map → benchmark-command-DRAHkn4D.js.map} +1 -1
  15. package/dist/benchmarks/index.d.ts +5 -5
  16. package/dist/benchmarks/index.js +3 -3
  17. package/dist/campaign/index.d.ts +7 -7
  18. package/dist/campaign/index.js +8 -8
  19. package/dist/{campaign-C2mmydmx.js → campaign-C9QC27C2.js} +12 -12
  20. package/dist/{campaign-C2mmydmx.js.map → campaign-C9QC27C2.js.map} +1 -1
  21. package/dist/{campaign-evidence-NtH29ctt.js → campaign-evidence-CVNKiK0q.js} +2 -2
  22. package/dist/{campaign-evidence-NtH29ctt.js.map → campaign-evidence-CVNKiK0q.js.map} +1 -1
  23. package/dist/{chat-client-Zz97O3NB.js → chat-client-9XLgWrQ7.js} +5 -3
  24. package/dist/chat-client-9XLgWrQ7.js.map +1 -0
  25. package/dist/{chat-json-call-Dgi7-RH-.js → chat-json-call-CaNO3k0A.js} +2 -2
  26. package/dist/{chat-json-call-Dgi7-RH-.js.map → chat-json-call-CaNO3k0A.js.map} +1 -1
  27. package/dist/cli.js +8 -8
  28. package/dist/{cluster-Cd0MRbr9.d.ts → cluster-CkzP4h3T.d.ts} +4 -2
  29. package/dist/{cluster-Cd0MRbr9.d.ts.map → cluster-CkzP4h3T.d.ts.map} +1 -1
  30. package/dist/{completion-verifier-DFyYFezn.js → completion-verifier-BYLOcQt7.js} +5 -4
  31. package/dist/completion-verifier-BYLOcQt7.js.map +1 -0
  32. package/dist/{completion-verifier-BEpsr3N4.d.ts → completion-verifier-CJVDPv2T.d.ts} +3 -2
  33. package/dist/{completion-verifier-BEpsr3N4.d.ts.map → completion-verifier-CJVDPv2T.d.ts.map} +1 -1
  34. package/dist/contract/index.d.ts +11 -11
  35. package/dist/contract/index.js +11 -13
  36. package/dist/contract/index.js.map +1 -1
  37. package/dist/{cost-ledger-DfhStGcZ.js → cost-ledger-1CwUnVOd.js} +145 -3
  38. package/dist/cost-ledger-1CwUnVOd.js.map +1 -0
  39. package/dist/{decision-point-Di2LATNH.js → decision-point-CQOczIIH.js} +2 -2
  40. package/dist/{decision-point-Di2LATNH.js.map → decision-point-CQOczIIH.js.map} +1 -1
  41. package/dist/{default-registry-aPvwtzEM.d.ts → default-registry-C_Akmpui.d.ts} +7 -7
  42. package/dist/{default-registry-aPvwtzEM.d.ts.map → default-registry-C_Akmpui.d.ts.map} +1 -1
  43. package/dist/{default-registry-CdFbxPnr.js → default-registry-D-xd7KxV.js} +5 -5
  44. package/dist/{default-registry-CdFbxPnr.js.map → default-registry-D-xd7KxV.js.map} +1 -1
  45. package/dist/{define-agent-eval-BROmIwn1.js → define-agent-eval-BLVewqJm.js} +8 -8
  46. package/dist/{define-agent-eval-BROmIwn1.js.map → define-agent-eval-BLVewqJm.js.map} +1 -1
  47. package/dist/{define-agent-eval-DGWBgCid.d.ts → define-agent-eval-nNPC7cD5.d.ts} +7 -7
  48. package/dist/{define-agent-eval-DGWBgCid.d.ts.map → define-agent-eval-nNPC7cD5.d.ts.map} +1 -1
  49. package/dist/diagnosis/index.d.ts +2 -2
  50. package/dist/diagnosis/index.js +1 -1
  51. package/dist/{dspy-rlm-engine-cWyn8G1a.js → dspy-rlm-engine-BS_jxE0P.js} +4 -4
  52. package/dist/{dspy-rlm-engine-cWyn8G1a.js.map → dspy-rlm-engine-BS_jxE0P.js.map} +1 -1
  53. package/dist/{engine-BF8naBn7.d.ts → engine-B0gr15-l.d.ts} +2 -2
  54. package/dist/{engine-BF8naBn7.d.ts.map → engine-B0gr15-l.d.ts.map} +1 -1
  55. package/dist/{eval-campaign-Dq8DEKmy.js → eval-campaign-DpkToY_w.js} +2 -2
  56. package/dist/eval-campaign-DpkToY_w.js.map +1 -0
  57. package/dist/{evaluation-bU_bhlv-.js → evaluation-C_GJvEEG.js} +2 -2
  58. package/dist/{evaluation-bU_bhlv-.js.map → evaluation-C_GJvEEG.js.map} +1 -1
  59. package/dist/{evaluation-CFKj_IlJ.d.ts → evaluation-mk3u_ZJC.d.ts} +4 -4
  60. package/dist/{evaluation-CFKj_IlJ.d.ts.map → evaluation-mk3u_ZJC.d.ts.map} +1 -1
  61. package/dist/evaluation.d.ts +1 -1
  62. package/dist/evaluation.js +1 -1
  63. package/dist/{exact-types-VAFjtOQN.d.ts → exact-types-Blq7YvsK.d.ts} +2 -2
  64. package/dist/{exact-types-VAFjtOQN.d.ts.map → exact-types-Blq7YvsK.d.ts.map} +1 -1
  65. package/dist/experiment/index.d.ts +3 -3
  66. package/dist/experiment/index.js +2 -2
  67. package/dist/{external-optimizer-process-2ImGH_LR.js → external-optimizer-process-m9xln7zN.js} +2 -2
  68. package/dist/{external-optimizer-process-2ImGH_LR.js.map → external-optimizer-process-m9xln7zN.js.map} +1 -1
  69. package/dist/{external-optimizer-subprocess-_C_2yriN.js → external-optimizer-subprocess-GO6s84Ov.js} +3 -3
  70. package/dist/{external-optimizer-subprocess-_C_2yriN.js.map → external-optimizer-subprocess-GO6s84Ov.js.map} +1 -1
  71. package/dist/{feedback-trajectory-DTj8eVTR.d.ts → feedback-trajectory-D3oISeGl.d.ts} +3 -3
  72. package/dist/{feedback-trajectory-DTj8eVTR.d.ts.map → feedback-trajectory-D3oISeGl.d.ts.map} +1 -1
  73. package/dist/{findings-store-BSuaV3dN.js → findings-store-CTy71Lnr.js} +5 -5
  74. package/dist/{findings-store-BSuaV3dN.js.map → findings-store-CTy71Lnr.js.map} +1 -1
  75. package/dist/fuzz.js +1 -1
  76. package/dist/hosted/index.js +1 -1
  77. package/dist/{index-DNXFzSpc.d.ts → index-BN6htPVi.d.ts} +2 -2
  78. package/dist/{index-DNXFzSpc.d.ts.map → index-BN6htPVi.d.ts.map} +1 -1
  79. package/dist/{index-BlTbxHlY.d.ts → index-BdFlQP54.d.ts} +4 -4
  80. package/dist/{index-BlTbxHlY.d.ts.map → index-BdFlQP54.d.ts.map} +1 -1
  81. package/dist/{index-QLDWZTxI.d.ts → index-CxuK3sxA.d.ts} +9 -9
  82. package/dist/{index-QLDWZTxI.d.ts.map → index-CxuK3sxA.d.ts.map} +1 -1
  83. package/dist/{index-YS58LHlx.d.ts → index-Dodw93oW.d.ts} +25 -181
  84. package/dist/index-Dodw93oW.d.ts.map +1 -0
  85. package/dist/{index-DX87wzX3.d.ts → index-IE8O0HNr.d.ts} +9 -9
  86. package/dist/{index-DX87wzX3.d.ts.map → index-IE8O0HNr.d.ts.map} +1 -1
  87. package/dist/{index-B62BaRzH.d.ts → index-KAYaJtMA.d.ts} +4 -4
  88. package/dist/{index-B62BaRzH.d.ts.map → index-KAYaJtMA.d.ts.map} +1 -1
  89. package/dist/{index-Bp3w4fWc.d.ts → index-cp5gkylN.d.ts} +12 -12
  90. package/dist/{index-Bp3w4fWc.d.ts.map → index-cp5gkylN.d.ts.map} +1 -1
  91. package/dist/index.d.ts +30 -30
  92. package/dist/index.js +72 -30
  93. package/dist/index.js.map +1 -1
  94. package/dist/{integrity-CrmnGB2T.d.ts → integrity-zeWMeTQt.d.ts} +2 -2
  95. package/dist/{integrity-CrmnGB2T.d.ts.map → integrity-zeWMeTQt.d.ts.map} +1 -1
  96. package/dist/{judge-gate-CrN0PaAL.js → judge-gate-DsoI5tx7.js} +2 -2
  97. package/dist/{judge-gate-CrN0PaAL.js.map → judge-gate-DsoI5tx7.js.map} +1 -1
  98. package/dist/{kind-factory-CV0FNCMM.js → kind-factory-CJXaE1oF.js} +2 -2
  99. package/dist/{kind-factory-CV0FNCMM.js.map → kind-factory-CJXaE1oF.js.map} +1 -1
  100. package/dist/{llm-client-DMMSg-Ro.js → llm-client-Bj-TooRS.js} +11 -11
  101. package/dist/{llm-client-DMMSg-Ro.js.map → llm-client-Bj-TooRS.js.map} +1 -1
  102. package/dist/{llm-judge-C813vmpc.js → llm-judge-DzAT7Wka.js} +11 -11
  103. package/dist/{llm-judge-C813vmpc.js.map → llm-judge-DzAT7Wka.js.map} +1 -1
  104. package/dist/{matrix-C-GxIgeJ.d.ts → matrix-Diw3yJCG.d.ts} +3 -4
  105. package/dist/matrix-Diw3yJCG.d.ts.map +1 -0
  106. package/dist/meta-eval/index.d.ts +3 -3
  107. package/dist/meta-eval/index.js +2 -2
  108. package/dist/{mint-yF51iBgY.js → mint-Ck92efNo.js} +2 -2
  109. package/dist/{mint-yF51iBgY.js.map → mint-Ck92efNo.js.map} +1 -1
  110. package/dist/multishot/golden/index.d.ts +1 -1
  111. package/dist/multishot/index.d.ts +3 -2
  112. package/dist/multishot/index.d.ts.map +1 -1
  113. package/dist/multishot/index.js +3 -3
  114. package/dist/multishot/index.js.map +1 -1
  115. package/dist/openapi.json +1 -1
  116. package/dist/{paired-promotion-decision-DJU3fZxH.d.ts → paired-promotion-decision-COeOgNHG.d.ts} +2 -2
  117. package/dist/{paired-promotion-decision-DJU3fZxH.d.ts.map → paired-promotion-decision-COeOgNHG.d.ts.map} +1 -1
  118. package/dist/paired-promotion-power-D03cUj9E.js +289 -0
  119. package/dist/paired-promotion-power-D03cUj9E.js.map +1 -0
  120. package/dist/{pareto-fJZg8pXm.js → pareto-UzjB3ZBk.js} +5 -288
  121. package/dist/pareto-UzjB3ZBk.js.map +1 -0
  122. package/dist/{prime-protocol-D1NkJRuD.d.ts → prime-protocol-bRbh6dqd.d.ts} +2 -2
  123. package/dist/{prime-protocol-D1NkJRuD.d.ts.map → prime-protocol-bRbh6dqd.d.ts.map} +1 -1
  124. package/dist/{promotion-gate-Da0xV4sa.d.ts → promotion-gate-XglbDCNo.d.ts} +3 -3
  125. package/dist/{promotion-gate-Da0xV4sa.d.ts.map → promotion-gate-XglbDCNo.d.ts.map} +1 -1
  126. package/dist/{proposal-findings-DWs94yT8.js → proposal-findings-CS6LoGGp.js} +2 -2
  127. package/dist/{proposal-findings-DWs94yT8.js.map → proposal-findings-CS6LoGGp.js.map} +1 -1
  128. package/dist/{registry-BAcEbzKm.d.ts → registry-Pfeqsr5k.d.ts} +4 -4
  129. package/dist/{registry-BAcEbzKm.d.ts.map → registry-Pfeqsr5k.d.ts.map} +1 -1
  130. package/dist/{release-confidence-DGtuPDxJ.js → release-confidence-B4Xxdpmn.js} +2 -2
  131. package/dist/{release-confidence-DGtuPDxJ.js.map → release-confidence-B4Xxdpmn.js.map} +1 -1
  132. package/dist/reporting.d.ts +5 -5
  133. package/dist/reporting.js +2 -2
  134. package/dist/{researcher-CSlc84Bp.d.ts → researcher-DlyjP5uq.d.ts} +6 -6
  135. package/dist/{researcher-CSlc84Bp.d.ts.map → researcher-DlyjP5uq.d.ts.map} +1 -1
  136. package/dist/{reward-ST4PXNXF.d.ts → reward-ap_R9mCH.d.ts} +2 -2
  137. package/dist/{reward-ST4PXNXF.d.ts.map → reward-ap_R9mCH.d.ts.map} +1 -1
  138. package/dist/{reward-hacking-C9hPVT0Q.d.ts → reward-hacking-CIdVwVe4.d.ts} +2 -2
  139. package/dist/{reward-hacking-C9hPVT0Q.d.ts.map → reward-hacking-CIdVwVe4.d.ts.map} +1 -1
  140. package/dist/rl.d.ts +11 -11
  141. package/dist/rl.js +5 -5
  142. package/dist/rl.js.map +1 -1
  143. package/dist/rollout/index.d.ts +3 -3
  144. package/dist/rollout/index.js +2 -2
  145. package/dist/{rollout-DKa54qer.js → rollout-Dh5q6CPA.js} +3 -3
  146. package/dist/{rollout-DKa54qer.js.map → rollout-Dh5q6CPA.js.map} +1 -1
  147. package/dist/{rubric-predictive-validity-B3RzbwOx.d.ts → rubric-predictive-validity-Bbi88Aut.d.ts} +2 -2
  148. package/dist/{rubric-predictive-validity-B3RzbwOx.d.ts.map → rubric-predictive-validity-Bbi88Aut.d.ts.map} +1 -1
  149. package/dist/{run-record-CFbnkE1K.js → run-record-DTTx9Ktr.js} +2 -2
  150. package/dist/{run-record-CFbnkE1K.js.map → run-record-DTTx9Ktr.js.map} +1 -1
  151. package/dist/{run-record-CpLS4Uid.js → run-record-DmX_ESC5.js} +7 -5
  152. package/dist/run-record-DmX_ESC5.js.map +1 -0
  153. package/dist/{run-record-D2BFMPGl.d.ts → run-record-pBlhZizT.d.ts} +8 -8
  154. package/dist/{run-record-D2BFMPGl.d.ts.map → run-record-pBlhZizT.d.ts.map} +1 -1
  155. package/dist/search/index.d.ts +2 -2
  156. package/dist/search/index.d.ts.map +1 -1
  157. package/dist/search/index.js +2 -2
  158. package/dist/{search-kernel-CQGLbmgn.d.ts → search-kernel-6P1dRpJ4.d.ts} +4 -4
  159. package/dist/{search-kernel-CQGLbmgn.d.ts.map → search-kernel-6P1dRpJ4.d.ts.map} +1 -1
  160. package/dist/{search-ledger-Dk-yk5Li.js → search-ledger-9liYyZf5.js} +2 -2
  161. package/dist/{search-ledger-Dk-yk5Li.js.map → search-ledger-9liYyZf5.js.map} +1 -1
  162. package/dist/{search-shipper-Dm-_Dtvy.js → search-shipper-B6tMNx1I.js} +2 -2
  163. package/dist/{search-shipper-Dm-_Dtvy.js.map → search-shipper-B6tMNx1I.js.map} +1 -1
  164. package/dist/{search-summary-sPWiYtSl.js → search-summary-CISbbxyr.js} +2 -2
  165. package/dist/{search-summary-sPWiYtSl.js.map → search-summary-CISbbxyr.js.map} +1 -1
  166. package/dist/{sequential-CAksw6EU.js → sequential-Ko7T-zvu.js} +65 -28
  167. package/dist/sequential-Ko7T-zvu.js.map +1 -0
  168. package/dist/sequential-OeSwJ2uG.d.ts +246 -0
  169. package/dist/sequential-OeSwJ2uG.d.ts.map +1 -0
  170. package/dist/{server-DFVwfoZq.js → server-BorE0Y3O.js} +16 -5
  171. package/dist/server-BorE0Y3O.js.map +1 -0
  172. package/dist/{skillopt-optimization-method-QO1nU8Kz.js → skillopt-optimization-method-BtX7xXDd.js} +7 -7
  173. package/dist/{skillopt-optimization-method-QO1nU8Kz.js.map → skillopt-optimization-method-BtX7xXDd.js.map} +1 -1
  174. package/dist/{statistical-heldout-CvOwNqt9.d.ts → statistical-heldout-vjrs8iyO.d.ts} +6 -6
  175. package/dist/{statistical-heldout-CvOwNqt9.d.ts.map → statistical-heldout-vjrs8iyO.d.ts.map} +1 -1
  176. package/dist/statistics.d.ts +2 -2
  177. package/dist/{store-otlp-C-jyj3WX.js → store-otlp-CmgKDr0O.js} +2 -2
  178. package/dist/{store-otlp-C-jyj3WX.js.map → store-otlp-CmgKDr0O.js.map} +1 -1
  179. package/dist/{store-tool-spans-B3z_Qb5u.d.ts → store-tool-spans-BemsQEhd.d.ts} +6 -6
  180. package/dist/{store-tool-spans-B3z_Qb5u.d.ts.map → store-tool-spans-BemsQEhd.d.ts.map} +1 -1
  181. package/dist/{store-tool-spans-DalWlKY8.js → store-tool-spans-CW24axM0.js} +3 -3
  182. package/dist/{store-tool-spans-DalWlKY8.js.map → store-tool-spans-CW24axM0.js.map} +1 -1
  183. package/dist/{summary-report-DyZquTaH.d.ts → summary-report-vdhE20Zf.d.ts} +4 -4
  184. package/dist/{summary-report-DyZquTaH.d.ts.map → summary-report-vdhE20Zf.d.ts.map} +1 -1
  185. package/dist/supervisor-run/index.d.ts +1 -1
  186. package/dist/{systemone-DVk-Crtu.d.ts → systemone-DFUN9DL1.d.ts} +7 -7
  187. package/dist/{systemone-DVk-Crtu.d.ts.map → systemone-DFUN9DL1.d.ts.map} +1 -1
  188. package/dist/{systemone-review-CToBl1oa.d.ts → systemone-review-4CKmHvr5.d.ts} +2 -2
  189. package/dist/{systemone-review-CToBl1oa.d.ts.map → systemone-review-4CKmHvr5.d.ts.map} +1 -1
  190. package/dist/systemone.d.ts +3 -3
  191. package/dist/systemone.js +2 -2
  192. package/dist/{tool-groups-R5RO9OHn.d.ts → tool-groups-Dpl3picW.d.ts} +3 -3
  193. package/dist/tool-groups-Dpl3picW.d.ts.map +1 -0
  194. package/dist/{trace-questions-BY6taxnl.d.ts → trace-questions-oT2fZWJ8.d.ts} +3 -3
  195. package/dist/{trace-questions-BY6taxnl.d.ts.map → trace-questions-oT2fZWJ8.d.ts.map} +1 -1
  196. package/dist/trace-repair/index.d.ts +2 -2
  197. package/dist/traces.d.ts +6 -6
  198. package/dist/traces.js +5 -11
  199. package/dist/traces.js.map +1 -1
  200. package/dist/{tree-C-N2kP-8.js → tree-D2cNtu9m.js} +10 -10
  201. package/dist/tree-D2cNtu9m.js.map +1 -0
  202. package/dist/{types-kBMNdo1X.d.ts → types-6GuPL-Vt.d.ts} +3 -3
  203. package/dist/{types-kBMNdo1X.d.ts.map → types-6GuPL-Vt.d.ts.map} +1 -1
  204. package/dist/{types-ip2D3-Ib.d.ts → types-C9yEqDjQ.d.ts} +6 -6
  205. package/dist/{types-ip2D3-Ib.d.ts.map → types-C9yEqDjQ.d.ts.map} +1 -1
  206. package/dist/{types-BsdcSWnf.d.ts → types-CP3rkpir.d.ts} +3 -3
  207. package/dist/{types-BsdcSWnf.d.ts.map → types-CP3rkpir.d.ts.map} +1 -1
  208. package/dist/{types-DUVhW5V1.d.ts → types-CwHU7U9J.d.ts} +2 -2
  209. package/dist/{types-DUVhW5V1.d.ts.map → types-CwHU7U9J.d.ts.map} +1 -1
  210. package/dist/wire/index.d.ts +4 -4
  211. package/dist/wire/index.d.ts.map +1 -1
  212. package/dist/wire/index.js +1 -1
  213. package/docs/adopt-stack.md +9 -0
  214. package/docs/eval-fixtures.md +2 -2
  215. package/docs/search-ledger.md +1 -0
  216. package/docs/wire-protocol.md +1 -1
  217. package/package.json +1 -1
  218. package/dist/chat-client-Zz97O3NB.js.map +0 -1
  219. package/dist/completion-verifier-DFyYFezn.js.map +0 -1
  220. package/dist/cost-ledger-DfhStGcZ.js.map +0 -1
  221. package/dist/eval-campaign-Dq8DEKmy.js.map +0 -1
  222. package/dist/index-YS58LHlx.d.ts.map +0 -1
  223. package/dist/matrix-C-GxIgeJ.d.ts.map +0 -1
  224. package/dist/metrics-zALlR17s.js +0 -146
  225. package/dist/metrics-zALlR17s.js.map +0 -1
  226. package/dist/pareto-fJZg8pXm.js.map +0 -1
  227. package/dist/run-record-CpLS4Uid.js.map +0 -1
  228. package/dist/sequential-B9p6uoV8.d.ts +0 -168
  229. package/dist/sequential-B9p6uoV8.d.ts.map +0 -1
  230. package/dist/sequential-CAksw6EU.js.map +0 -1
  231. package/dist/server-DFVwfoZq.js.map +0 -1
  232. package/dist/tool-groups-R5RO9OHn.d.ts.map +0 -1
  233. package/dist/tree-C-N2kP-8.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"skillopt-optimization-method-QO1nU8Kz.js","names":["cloneExternalTextCandidate","MAX_TIMER_DELAY_MS","MAX_TIMER_DELAY_MS","MAX_TIMER_DELAY_MS","assertPositiveSafeInteger"],"sources":["../src/campaign/external-optimizer-observations.ts","../src/campaign/external-text-evaluation.ts","../src/campaign/external-optimizer-run-budget.ts","../src/campaign/external-text-optimization-contract.ts","../src/campaign/external-text-optimization.ts","../src/campaign/gates/compose.ts","../src/campaign/gates/heldout-gate.ts","../src/campaign/external-optimizer-run-config.ts","../src/campaign/optimizer-model.ts","../src/campaign/gepa-optimization-config.ts","../src/campaign/external-optimizer-accounting.ts","../src/campaign/external-optimizer-source.ts","../src/campaign/external-optimizer-runtime.ts","../src/campaign/gepa-optimization-result.ts","../src/campaign/gepa-search-import.ts","../src/campaign/gepa-optimization-run.ts","../src/campaign/gepa-optimization-method.ts","../src/campaign/presets/comparison-controls.ts","../src/campaign/presets/compare-optimization-methods.ts","../src/campaign/skillopt-optimization-config.ts","../src/campaign/skillopt-optimization-result.ts","../src/campaign/skillopt-optimization-method.ts"],"sourcesContent":["import { createHash } from 'node:crypto'\nimport { isDeepStrictEqual } from 'node:util'\nimport { deepFreezeCanonicalJson } from '../ledger-core/deep-freeze'\nimport { canonicalJson, contentHash } from '../verdict-cache'\nimport {\n assertJsonValue,\n type ExternalOptimizerEvaluationObservation,\n type ExternalOptimizerModelExecutionObservation,\n type ExternalTextCandidate,\n isExternalTextCandidate,\n} from './external-optimizer-contracts'\nimport { type CampaignStorage, fsCampaignStorage } from './storage'\n\nexport interface ExternalOptimizerObservationSummary {\n scope: 'callback-submitted-candidates'\n path: string\n sha256: `sha256:${string}`\n submittedCandidates: number\n evaluations: number\n refusals: number\n}\n\nexport interface ExternalOptimizerExecutionSummary {\n scope: 'runtime-model-calls'\n path: string\n sha256: `sha256:${string}`\n calls: number\n succeeded: number\n failed: number\n}\n\nexport interface ExternalOptimizerSubmittedCandidate {\n /** Exact text or named-component surface submitted to the evaluation callback. */\n readonly candidate: ExternalTextCandidate\n /** Eval's canonical content identity for `candidate`. */\n readonly candidateHash: string\n readonly candidateDigest: `sha256:${string}`\n readonly proposalSequence: number\n /** Exact observation artifact that proves this candidate was submitted. */\n readonly provenance: {\n readonly path: string\n readonly sha256: `sha256:${string}`\n }\n}\n\nexport interface ExternalOptimizerObservationArtifact {\n readonly summary: ExternalOptimizerObservationSummary\n readonly observations: readonly ExternalOptimizerEvaluationObservation[]\n /** Every distinct callback-submitted candidate in proposal order. */\n readonly candidates: readonly ExternalOptimizerSubmittedCandidate[]\n}\n\n/**\n * Read and verify the exact callback observation artifact addressed by method provenance.\n *\n * The reader checks the raw SHA-256, canonical JSONL bytes, sequence, candidate\n * identities, and summary counts before it returns any candidate.\n * This proves that the bytes match the supplied summary. The caller remains\n * responsible for obtaining that summary from trusted provenance.\n */\nexport function readExternalOptimizerObservationArtifact(input: {\n summary: ExternalOptimizerObservationSummary\n storage?: CampaignStorage\n}): ExternalOptimizerObservationArtifact {\n const { summary } = input\n assertObservationSummary(summary)\n const storage = input.storage ?? fsCampaignStorage()\n const contents = storage.read(summary.path)\n if (contents === undefined) {\n const state = storage.exists(summary.path) ? 'unreadable' : 'missing'\n throw new Error(`external optimizer observation artifact is ${state} at '${summary.path}'`)\n }\n const sha256 = `sha256:${createHash('sha256').update(contents).digest('hex')}` as const\n if (sha256 !== summary.sha256) {\n throw new Error(\n `external optimizer observation artifact digest mismatch at '${summary.path}': expected ${summary.sha256}, got ${sha256}`,\n )\n }\n if (contents.length > 0 && !contents.endsWith('\\n')) {\n throw new Error(\n `external optimizer observation artifact must end with a newline at '${summary.path}'`,\n )\n }\n\n const observations = contents.length === 0 ? [] : parseObservationLines(contents, summary.path)\n const candidates: ExternalOptimizerSubmittedCandidate[] = []\n const proposed = new Map<string, ExternalOptimizerSubmittedCandidate>()\n const evaluationNumbers = new Set<number>()\n let evaluations = 0\n let failedEvaluations = 0\n let refusals = 0\n\n for (const [index, observation] of observations.entries()) {\n if (observation.sequence !== index + 1) {\n throw new Error(\n `external optimizer observation artifact expected sequence ${index + 1}, got ${observation.sequence}`,\n )\n }\n if (observation.kind === 'proposal') {\n assertCandidateIdentity(\n observation.candidate,\n observation.candidateHash,\n observation.sequence,\n )\n if (proposed.has(observation.candidateHash)) {\n throw new Error(\n `external optimizer observation artifact repeats candidate ${observation.candidateHash}`,\n )\n }\n const candidate: ExternalOptimizerSubmittedCandidate = {\n candidate: structuredClone(observation.candidate),\n candidateHash: observation.candidateHash,\n candidateDigest: `sha256:${observation.candidateHash}`,\n proposalSequence: observation.sequence,\n provenance: { path: summary.path, sha256: summary.sha256 },\n }\n proposed.set(observation.candidateHash, candidate)\n candidates.push(candidate)\n continue\n }\n\n if (observation.kind === 'evaluation') {\n evaluations += 1\n if (evaluationNumbers.has(observation.evaluationNumber)) {\n throw new Error(\n `external optimizer observation artifact repeats evaluation number ${observation.evaluationNumber}`,\n )\n }\n evaluationNumbers.add(observation.evaluationNumber)\n assertObservedCandidate(observation, proposed)\n assertJsonValue(observation.response, 'external optimizer evaluation response')\n continue\n }\n\n refusals += 1\n if (\n observation.reason !== 'invalid-request' &&\n observation.reason !== 'evaluation-limit' &&\n observation.reason !== 'evaluation-failed'\n ) {\n throw new Error(\n `external optimizer observation artifact has invalid refusal reason at sequence ${observation.sequence}`,\n )\n }\n if (observation.reason === 'evaluation-failed') failedEvaluations += 1\n const candidateFields = [observation.candidate, observation.candidateHash]\n if (\n observation.reason !== 'invalid-request' &&\n candidateFields.some((value) => value === undefined)\n ) {\n throw new Error(\n `external optimizer observation artifact omits a refused candidate at sequence ${observation.sequence}`,\n )\n }\n if (candidateFields.some((value) => value !== undefined)) {\n if (candidateFields.some((value) => value === undefined)) {\n throw new Error(\n `external optimizer observation artifact has incomplete candidate identity at sequence ${observation.sequence}`,\n )\n }\n assertObservedCandidate(\n observation as ExternalOptimizerEvaluationObservation & {\n candidate: NonNullable<typeof observation.candidate>\n candidateHash: string\n },\n proposed,\n )\n }\n }\n\n const acceptedEvaluations = evaluations + failedEvaluations\n for (const evaluationNumber of evaluationNumbers) {\n if (evaluationNumber > acceptedEvaluations) {\n throw new Error(\n `external optimizer observation artifact has out-of-range evaluation number ${evaluationNumber}`,\n )\n }\n }\n\n if (\n candidates.length !== summary.submittedCandidates ||\n evaluations !== summary.evaluations ||\n refusals !== summary.refusals\n ) {\n throw new Error(\n `external optimizer observation artifact counts disagree at '${summary.path}': ` +\n `expected ${summary.submittedCandidates}/${summary.evaluations}/${summary.refusals}, ` +\n `got ${candidates.length}/${evaluations}/${refusals}`,\n )\n }\n\n return deepFreezeCanonicalJson({\n summary: structuredClone(summary),\n observations,\n candidates,\n })\n}\n\n/** Append-only observation log for one external-optimizer attempt. */\nexport function openExternalOptimizerObservationLog(input: {\n storage: CampaignStorage\n path: string\n}): {\n observe: (observation: ExternalOptimizerEvaluationObservation) => void\n summary: () => ExternalOptimizerObservationSummary\n} {\n const existing = input.storage.read(input.path)\n if (existing !== undefined || input.storage.exists(input.path)) {\n throw new Error(`external optimizer observation log already exists at '${input.path}'`)\n }\n input.storage.write(input.path, '')\n let revision = 0\n const counts = { submittedCandidates: 0, evaluations: 0, refusals: 0 }\n\n return {\n observe(observation) {\n const expectedSequence = counts.submittedCandidates + counts.evaluations + counts.refusals + 1\n if (observation.sequence !== expectedSequence) {\n throw new Error(\n `external optimizer observation log expected sequence ${expectedSequence}, got ${observation.sequence}`,\n )\n }\n const line = `${canonicalJson(observation)}\\n`\n const next = input.storage.append(input.path, line, revision)\n if (next === undefined) {\n throw new Error(\n `external optimizer observation log changed concurrently at '${input.path}'`,\n )\n }\n revision = next\n if (observation.kind === 'proposal') counts.submittedCandidates += 1\n else if (observation.kind === 'evaluation') counts.evaluations += 1\n else counts.refusals += 1\n },\n summary() {\n const contents = input.storage.read(input.path) ?? ''\n const bytes = new TextEncoder().encode(contents)\n if (bytes.byteLength !== revision) {\n throw new Error(`external optimizer observation log revision changed at '${input.path}'`)\n }\n return {\n scope: 'callback-submitted-candidates',\n path: input.path,\n sha256: `sha256:${createHash('sha256').update(bytes).digest('hex')}`,\n ...counts,\n }\n },\n }\n}\n\nfunction assertObservationSummary(summary: ExternalOptimizerObservationSummary): void {\n if (summary.scope !== 'callback-submitted-candidates') {\n throw new Error('external optimizer observation summary has an invalid scope')\n }\n if (typeof summary.path !== 'string' || summary.path.trim().length === 0) {\n throw new Error('external optimizer observation summary has an invalid path')\n }\n if (!/^sha256:[a-f0-9]{64}$/u.test(summary.sha256)) {\n throw new Error('external optimizer observation summary has an invalid SHA-256')\n }\n for (const [field, value] of [\n ['submittedCandidates', summary.submittedCandidates],\n ['evaluations', summary.evaluations],\n ['refusals', summary.refusals],\n ] as const) {\n if (!Number.isSafeInteger(value) || value < 0) {\n throw new Error(\n `external optimizer observation summary ${field} must be a non-negative integer`,\n )\n }\n }\n}\n\nfunction parseObservationLines(\n contents: string,\n path: string,\n): ExternalOptimizerEvaluationObservation[] {\n return contents\n .slice(0, -1)\n .split('\\n')\n .map((line, index) => {\n let observation: unknown\n try {\n observation = JSON.parse(line)\n } catch (cause) {\n throw new Error(\n `external optimizer observation artifact has invalid JSON at '${path}' line ${index + 1}`,\n { cause },\n )\n }\n assertObservationShape(observation, index + 1)\n if (canonicalJson(observation) !== line) {\n throw new Error(\n `external optimizer observation artifact is not canonical at '${path}' line ${index + 1}`,\n )\n }\n return observation\n })\n}\n\nfunction assertObservationShape(\n value: unknown,\n line: number,\n): asserts value is ExternalOptimizerEvaluationObservation {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\n throw new Error(`external optimizer observation artifact line ${line} must be an object`)\n }\n const observation = value as Record<string, unknown>\n if (!Number.isSafeInteger(observation.sequence) || Number(observation.sequence) <= 0) {\n throw new Error(`external optimizer observation artifact line ${line} has an invalid sequence`)\n }\n if (observation.kind === 'proposal') {\n assertExactKeys(observation, ['candidate', 'candidateHash', 'kind', 'sequence'], line)\n assertCandidateFields(observation, line)\n return\n }\n if (observation.kind === 'evaluation') {\n assertExactKeys(\n observation,\n [\n 'candidate',\n 'candidateHash',\n 'evaluationNumber',\n 'exampleId',\n 'kind',\n 'response',\n 'sequence',\n ],\n line,\n )\n assertCandidateFields(observation, line)\n if (typeof observation.exampleId !== 'string') {\n throw new Error(\n `external optimizer observation artifact line ${line} has an invalid exampleId`,\n )\n }\n if (\n !Number.isSafeInteger(observation.evaluationNumber) ||\n Number(observation.evaluationNumber) <= 0\n ) {\n throw new Error(\n `external optimizer observation artifact line ${line} has an invalid evaluationNumber`,\n )\n }\n assertJsonValue(observation.response, `external optimizer observation artifact line ${line}`)\n return\n }\n if (observation.kind === 'refusal') {\n const allowed = ['candidate', 'candidateHash', 'exampleId', 'kind', 'reason', 'sequence']\n assertAllowedKeys(observation, allowed, line)\n if (typeof observation.reason !== 'string') {\n throw new Error(`external optimizer observation artifact line ${line} has an invalid reason`)\n }\n if (observation.candidate !== undefined || observation.candidateHash !== undefined) {\n assertCandidateFields(observation, line)\n }\n if (observation.exampleId !== undefined && typeof observation.exampleId !== 'string') {\n throw new Error(\n `external optimizer observation artifact line ${line} has an invalid exampleId`,\n )\n }\n return\n }\n throw new Error(`external optimizer observation artifact line ${line} has an invalid kind`)\n}\n\nfunction assertCandidateFields(observation: Record<string, unknown>, line: number): void {\n if (!isExternalTextCandidate(observation.candidate)) {\n throw new Error(`external optimizer observation artifact line ${line} has an invalid candidate`)\n }\n if (\n typeof observation.candidateHash !== 'string' ||\n !/^[a-f0-9]{64}$/u.test(observation.candidateHash)\n ) {\n throw new Error(\n `external optimizer observation artifact line ${line} has an invalid candidateHash`,\n )\n }\n}\n\nfunction assertExactKeys(value: Record<string, unknown>, expected: string[], line: number): void {\n assertAllowedKeys(value, expected, line)\n for (const key of expected) {\n if (!(key in value)) {\n throw new Error(`external optimizer observation artifact line ${line} is missing ${key}`)\n }\n }\n}\n\nfunction assertAllowedKeys(value: Record<string, unknown>, allowed: string[], line: number): void {\n const extras = Object.keys(value).filter((key) => !allowed.includes(key))\n if (extras.length > 0) {\n throw new Error(\n `external optimizer observation artifact line ${line} has unexpected field ${extras[0]}`,\n )\n }\n}\n\nfunction assertCandidateIdentity(\n candidate: unknown,\n candidateHash: string,\n sequence: number,\n): void {\n const expected = contentHash({ kind: 'external-text-candidate', candidate })\n if (candidateHash !== expected) {\n throw new Error(\n `external optimizer observation artifact candidate hash mismatch at sequence ${sequence}`,\n )\n }\n}\n\nfunction assertObservedCandidate(\n observation:\n | Extract<ExternalOptimizerEvaluationObservation, { kind: 'evaluation' }>\n | {\n candidate: NonNullable<\n Extract<ExternalOptimizerEvaluationObservation, { kind: 'refusal' }>['candidate']\n >\n candidateHash: string\n sequence: number\n },\n proposed: Map<string, ExternalOptimizerSubmittedCandidate>,\n): void {\n assertCandidateIdentity(observation.candidate, observation.candidateHash, observation.sequence)\n const candidate = proposed.get(observation.candidateHash)\n if (!candidate) {\n throw new Error(\n `external optimizer observation artifact references an unproposed candidate at sequence ${observation.sequence}`,\n )\n }\n if (!isDeepStrictEqual(observation.candidate, candidate.candidate)) {\n throw new Error(\n `external optimizer observation artifact changes candidate bytes at sequence ${observation.sequence}`,\n )\n }\n}\n\n/** Append-only opaque Runtime execution records for one optimizer attempt. */\nexport function openExternalOptimizerExecutionLog(input: {\n storage: CampaignStorage\n path: string\n}): {\n observe: (observation: ExternalOptimizerModelExecutionObservation) => void\n summary: () => ExternalOptimizerExecutionSummary\n} {\n const existing = input.storage.read(input.path)\n if (existing !== undefined || input.storage.exists(input.path)) {\n throw new Error(`external optimizer execution log already exists at '${input.path}'`)\n }\n input.storage.write(input.path, '')\n let revision = 0\n const counts = { calls: 0, succeeded: 0, failed: 0 }\n\n return {\n observe(observation) {\n if (observation.sequence !== counts.calls + 1) {\n throw new Error(\n `external optimizer execution log expected sequence ${counts.calls + 1}, got ${observation.sequence}`,\n )\n }\n const line = `${canonicalJson(observation)}\\n`\n const next = input.storage.append(input.path, line, revision)\n if (next === undefined) {\n throw new Error(`external optimizer execution log changed concurrently at '${input.path}'`)\n }\n revision = next\n counts.calls += 1\n if (observation.succeeded) counts.succeeded += 1\n else counts.failed += 1\n },\n summary() {\n const contents = input.storage.read(input.path) ?? ''\n const bytes = new TextEncoder().encode(contents)\n if (bytes.byteLength !== revision) {\n throw new Error(`external optimizer execution log revision changed at '${input.path}'`)\n }\n if (counts.calls !== counts.succeeded + counts.failed) {\n throw new Error(`external optimizer execution log counts disagree at '${input.path}'`)\n }\n return {\n scope: 'runtime-model-calls',\n path: input.path,\n sha256: `sha256:${createHash('sha256').update(bytes).digest('hex')}`,\n ...counts,\n }\n },\n }\n}\n","import type { CostLedgerHandle } from '../cost-ledger'\nimport {\n assertJsonValue,\n type ExternalTextCandidate,\n type ExternalTextEvaluationRequest,\n isCandidateText,\n safePathComponent,\n} from './external-optimizer-process'\nimport type { OptimizationMethodInput } from './optimization-method'\nimport { runCampaign } from './run-campaign'\nimport { campaignBreakdown } from './score-utils'\nimport { surfaceContentHash } from './surface-identity'\nimport type { MutableSurface, Scenario } from './types'\n\nexport interface ExternalOptimizationExample {\n id: string\n data: unknown\n}\n\nexport interface ExternalTextEvaluationResponse {\n score: number\n info: {\n scenarioId: string\n dimensions: Record<string, number>\n /** Higher-is-better objectives consumed by GEPA hybrid/Pareto selection. */\n scores?: Record<string, number>\n notes?: string\n artifact?: unknown\n /** The optimizer score is a finite protocol value; Eval remains the\n * authority for whether the underlying cell actually produced a score. */\n status?: 'scored' | 'failed'\n error?: {\n stage: 'dispatch' | 'judge' | 'unknown'\n message: string\n }\n }\n}\n\nexport function createExternalTextEvaluator<TScenario extends Scenario, TArtifact>(args: {\n input: OptimizationMethodInput<TScenario, TArtifact>\n label: string\n runDir: string\n /** Identity of the exact execution and scoring behavior used by this evaluator. */\n compatibleRunId: string\n costPhase: string\n costTags?: Readonly<Record<string, string>>\n costLedger: CostLedgerHandle\n scenarioById: ReadonlyMap<string, TScenario>\n maxCandidateChars: number\n maxEvidenceChars: number\n describeArtifact?: (artifact: TArtifact, scenario: TScenario) => unknown\n}): (\n request: ExternalTextEvaluationRequest,\n signal?: AbortSignal,\n) => Promise<ExternalTextEvaluationResponse> {\n const cached = new Map<string, Promise<ExternalTextEvaluationResponse>>()\n return async ({ candidate, exampleId }, signal) => {\n if (!args.scenarioById.has(exampleId)) {\n throw new Error(`${args.label} requested unknown train or selection case '${exampleId}'`)\n }\n const detachedCandidate = cloneExternalTextCandidate(candidate)\n const surface =\n typeof detachedCandidate === 'string'\n ? detachedCandidate\n : ({ kind: 'components', components: detachedCandidate } as const)\n const candidateLength =\n typeof detachedCandidate === 'string'\n ? detachedCandidate.length\n : JSON.stringify(detachedCandidate).length\n if (\n (typeof detachedCandidate === 'string' &&\n !isCandidateText(detachedCandidate, args.maxCandidateChars)) ||\n candidateLength > args.maxCandidateChars\n ) {\n throw new Error(`${args.label} submitted an invalid candidate`)\n }\n const scenario = args.scenarioById.get(exampleId)!\n const cacheKey = `${args.compatibleRunId}:${surfaceContentHash(surface)}:${exampleId}`\n const existing = cached.get(cacheKey)\n if (existing) return existing\n\n const result = scoreOneScenario({\n input: args.input,\n label: args.label,\n candidate: surface,\n scenario,\n runDir: args.runDir,\n compatibleRunId: args.compatibleRunId,\n costPhase: args.costPhase,\n costTags: args.costTags,\n costLedger: args.costLedger,\n maxEvidenceChars: args.maxEvidenceChars,\n describeArtifact: args.describeArtifact,\n signal,\n })\n cached.set(cacheKey, result)\n void result.then(\n (response) => {\n // Failed cells are durable diagnostics, not reusable scores. Leave\n // the successful path cached, but let a later GEPA request retry the\n // failed or missing cell on resume.\n if (response.info.status === 'failed' && cached.get(cacheKey) === result) {\n cached.delete(cacheKey)\n }\n },\n () => {\n if (cached.get(cacheKey) === result) cached.delete(cacheKey)\n },\n )\n return result\n }\n}\n\nexport function mapExternalScenarios<TScenario extends Scenario>(\n train: readonly TScenario[],\n selection: readonly TScenario[],\n label: string,\n): Map<string, TScenario> {\n const out = new Map<string, TScenario>()\n for (const scenario of [...train, ...selection]) {\n if (out.has(scenario.id)) {\n throw new Error(\n `${label} requires unique train and selection ids; duplicate '${scenario.id}'`,\n )\n }\n out.set(scenario.id, scenario)\n }\n return out\n}\n\nexport function describeExternalScenario<TScenario extends Scenario>(\n scenario: TScenario,\n label: string,\n maxChars: number,\n describe?: (scenario: TScenario) => unknown,\n): ExternalOptimizationExample {\n const data = structuredClone(describe ? describe(scenario) : { id: scenario.id })\n assertJsonValue(data, `${label} scenario '${scenario.id}'`)\n const serializedChars = JSON.stringify(data).length\n if (serializedChars > maxChars) {\n throw new Error(\n `${label} scenario '${scenario.id}' exceeds maxEvidenceChars (${serializedChars} > ${maxChars})`,\n )\n }\n return deepFreeze({ id: scenario.id, data })\n}\n\nexport function encodeExternalTextCandidate(surface: MutableSurface): ExternalTextCandidate {\n if (typeof surface === 'string') return surface\n if (surface.kind === 'components') return { ...surface.components }\n throw new Error('external text optimizers cannot encode a code surface')\n}\n\nexport function decodeExternalTextCandidate(candidate: ExternalTextCandidate): MutableSurface {\n return typeof candidate === 'string'\n ? candidate\n : { kind: 'components', components: { ...candidate } }\n}\n\nasync function scoreOneScenario<TScenario extends Scenario, TArtifact>(args: {\n input: OptimizationMethodInput<TScenario, TArtifact>\n label: string\n candidate:\n | string\n | { readonly kind: 'components'; readonly components: Readonly<Record<string, string>> }\n scenario: TScenario\n runDir: string\n compatibleRunId: string\n costPhase: string\n costTags?: Readonly<Record<string, string>>\n costLedger: CostLedgerHandle\n maxEvidenceChars: number\n describeArtifact?: (artifact: TArtifact, scenario: TScenario) => unknown\n signal?: AbortSignal\n}): Promise<ExternalTextEvaluationResponse> {\n const campaign = await runCampaign<TScenario, TArtifact>({\n ...args.input.runOptions,\n scenarios: [structuredClone(args.scenario)],\n dispatch: (scenario, context) =>\n args.input.dispatchWithSurface(args.candidate, scenario, context),\n dispatchRef: `external-text:${args.compatibleRunId}:${surfaceContentHash(args.candidate)}`,\n judges: [...args.input.judges],\n runDir: `${args.runDir}/evaluations/${safePathComponent(args.compatibleRunId)}/${safePathComponent(surfaceContentHash(args.candidate))}/${safePathComponent(args.scenario.id)}`,\n seed: args.input.seed,\n costLedger: args.costLedger,\n costPhase: args.costPhase,\n ...(args.costTags ? { costTags: args.costTags } : {}),\n maxConcurrency: 1,\n ...(args.signal ? { signal: args.signal } : {}),\n })\n const failedCell = campaign.cells.find((cell) => cell.error !== undefined)\n if (failedCell) {\n const stage = failedCell.errorStage ?? 'unknown'\n const message = failedCell.error?.slice(0, 2_000) ?? 'cell failed without an error message'\n const response: ExternalTextEvaluationResponse = {\n // GEPA requires a finite score for every callback response. This zero is\n // an optimizer penalty only; the campaign cell remains unscored below.\n score: 0,\n info: {\n scenarioId: failedCell.scenarioId,\n dimensions: {},\n status: 'failed',\n notes: `Evaluation failed at ${stage}; optimizer penalty score 0 is not a measured zero. ${message}`,\n error: { stage, message },\n },\n }\n if (JSON.stringify(response).length > args.maxEvidenceChars) {\n throw new Error(\n `${args.label} failed evaluation evidence for '${args.scenario.id}' exceeds maxEvidenceChars`,\n )\n }\n return response\n }\n const breakdown = campaignBreakdown(campaign)\n const row = breakdown.scenarios[0]\n if (!row) throw new Error(`${args.label} evaluation produced no score for '${args.scenario.id}'`)\n const artifact =\n args.describeArtifact && campaign.cells[0]\n ? args.describeArtifact(campaign.cells[0].artifact, args.scenario)\n : undefined\n if (artifact !== undefined) {\n assertJsonValue(artifact, `${args.label} described artifact for '${args.scenario.id}'`)\n }\n const response: ExternalTextEvaluationResponse = {\n score: row.composite,\n info: {\n scenarioId: row.scenarioId,\n dimensions: breakdown.dimensions,\n scores: { ...breakdown.dimensions },\n status: 'scored',\n ...(row.notes ? { notes: row.notes } : {}),\n ...(artifact !== undefined ? { artifact } : {}),\n },\n }\n if (JSON.stringify(response).length > args.maxEvidenceChars) {\n throw new Error(\n `${args.label} evaluation evidence for '${args.scenario.id}' exceeds maxEvidenceChars`,\n )\n }\n return response\n}\n\nfunction cloneExternalTextCandidate(candidate: ExternalTextCandidate): ExternalTextCandidate {\n return typeof candidate === 'string' ? candidate : { ...candidate }\n}\n\nfunction deepFreeze<T>(value: T): T {\n if (value && typeof value === 'object') {\n for (const child of Object.values(value as Record<string, unknown>)) deepFreeze(child)\n Object.freeze(value)\n }\n return value\n}\n","import { contentHash } from '../verdict-cache'\nimport type { CampaignStorage } from './storage'\n\ninterface EvaluationBudgetState {\n maxEvaluations: number\n accepted: number\n}\n\nexport interface ExternalOptimizerRunBudget {\n runKey: string\n attemptId: string\n runTags: Readonly<Record<string, string>>\n attemptTags: Readonly<Record<string, string>>\n acceptedEvaluations(): number\n acceptEvaluation(): number | undefined\n}\n\nexport function externalOptimizerRunKey(input: {\n material: unknown\n attemptId: string\n resumeEnabled: boolean\n}): string {\n if (!input.attemptId.trim() || input.attemptId.trim() !== input.attemptId) {\n throw new Error('external optimizer attemptId must be trimmed and non-empty')\n }\n if (typeof input.resumeEnabled !== 'boolean') {\n throw new Error('external optimizer resumeEnabled must be a boolean')\n }\n const compatible = externalOptimizerCompatibleRunKey(input.material)\n return input.resumeEnabled ? compatible : `${compatible}-${input.attemptId}`\n}\n\nexport function externalOptimizerCompatibleRunKey(material: unknown): string {\n return contentHash(material)\n}\n\nexport function openExternalOptimizerRunBudget(input: {\n storage: CampaignStorage\n runDir: string\n runKey: string\n attemptId: string\n maxEvaluations: number\n}): ExternalOptimizerRunBudget {\n if (!input.runKey.trim() || input.runKey.trim() !== input.runKey) {\n throw new Error('external optimizer runKey must be trimmed and non-empty')\n }\n if (!input.attemptId.trim() || input.attemptId.trim() !== input.attemptId) {\n throw new Error('external optimizer attemptId must be trimmed and non-empty')\n }\n if (!Number.isSafeInteger(input.maxEvaluations) || input.maxEvaluations <= 0) {\n throw new Error('external optimizer maxEvaluations must be a positive safe integer')\n }\n const budgetDir = `${input.runDir}/budgets`\n const statePath = `${budgetDir}/${input.runKey}.jsonl`\n input.storage.ensureDir(budgetDir)\n const runTags = Object.freeze({ optimizerRun: input.runKey })\n const attemptTags = Object.freeze({\n optimizerRun: input.runKey,\n optimizerAttempt: input.attemptId,\n })\n\n return {\n runKey: input.runKey,\n attemptId: input.attemptId,\n runTags,\n attemptTags,\n acceptedEvaluations: () =>\n readState(input.storage.read(statePath), input.maxEvaluations, statePath).accepted,\n acceptEvaluation() {\n for (let attempt = 0; attempt < 16; attempt += 1) {\n const current = input.storage.read(statePath) ?? ''\n const state = readState(current, input.maxEvaluations, statePath)\n if (state.accepted >= input.maxEvaluations) return undefined\n if (!input.storage.append) {\n throw new Error('external optimizer evaluation budgets require appendable storage')\n }\n const next = state.accepted + 1\n const event = `${JSON.stringify({\n maxEvaluations: input.maxEvaluations,\n accepted: next,\n } satisfies EvaluationBudgetState)}\\n`\n const expectedBytes = new TextEncoder().encode(current).byteLength\n const appended = input.storage.append(statePath, event, expectedBytes)\n if (appended !== undefined) return next\n }\n throw new Error(\n `external optimizer evaluation counter for '${input.runKey}' was updated concurrently`,\n )\n },\n }\n}\n\nfunction readState(\n text: string | undefined,\n maxEvaluations: number,\n statePath: string,\n): EvaluationBudgetState {\n if (text === undefined || text === '') return { maxEvaluations, accepted: 0 }\n let accepted = 0\n for (const line of text.split('\\n')) {\n if (!line) continue\n let value: unknown\n try {\n value = JSON.parse(line)\n } catch (cause) {\n throw new Error(`external optimizer evaluation state is invalid at '${statePath}'`, {\n cause,\n })\n }\n if (\n !value ||\n typeof value !== 'object' ||\n Array.isArray(value) ||\n Object.keys(value).sort().join(',') !== 'accepted,maxEvaluations' ||\n (value as Partial<EvaluationBudgetState>).maxEvaluations !== maxEvaluations ||\n (value as Partial<EvaluationBudgetState>).accepted !== accepted + 1\n ) {\n throw new Error(`external optimizer evaluation state does not match at '${statePath}'`)\n }\n accepted += 1\n }\n if (accepted > maxEvaluations) {\n throw new Error(`external optimizer evaluation state exceeds its limit at '${statePath}'`)\n }\n return { maxEvaluations, accepted }\n}\n","import {\n type ExternalOptimizerResumeMode,\n type ExternalTextCandidate,\n isExternalTextCandidate,\n} from './external-optimizer-process'\nimport type {\n ExternalOptimizationExample,\n ExternalTextEvaluationResponse,\n} from './external-text-evaluation'\nimport type { OptimizationPackageSource } from './optimization-method'\nimport type { CampaignCostMeter, Scenario } from './types'\n\nexport interface ExternalTextOptimizerContext {\n readonly runId: string\n readonly name: string\n readonly objective: string\n readonly evaluationId: string\n readonly background?: string\n readonly seedCandidate: ExternalTextCandidate\n readonly trainSet: readonly ExternalOptimizationExample[]\n readonly selectionSet: readonly ExternalOptimizationExample[]\n readonly maxEvaluations: number\n readonly seed: number\n /** Stable directory for optimizer checkpoints from compatible attempts. */\n readonly stateDir: string\n readonly restoreRequested: boolean\n readonly artifactDir: string\n readonly signal: AbortSignal\n /** Record every optimizer-owned paid call through this attributed account. */\n readonly cost: CampaignCostMeter\n readonly evaluate: (\n request: import('./external-optimizer-process').ExternalTextEvaluationRequest,\n ) => Promise<ExternalTextEvaluationResponse>\n}\n\nexport interface ExternalTextOptimizerResult {\n bestCandidate: ExternalTextCandidate\n resumed: boolean\n costAccounting:\n | { kind: 'metered' }\n | { kind: 'no-paid-work' }\n | { kind: 'external'; reason: string }\n}\n\nexport interface ExternalOptimizerRunManifest {\n readonly status: 'partial' | 'completed'\n readonly attemptId: string\n readonly revision: number\n}\n\nexport interface ExternalOptimizerRunManifestEvent {\n readonly runId: string\n readonly attemptId: string\n readonly status: 'partial' | 'completed'\n}\n\n/**\n * Configuration for adapting another text optimizer.\n *\n * `run` owns search. Agent Eval owns split isolation, bounded candidate\n * evaluation, exact cost collection, provenance, and final comparison.\n */\nexport interface ExternalTextOptimizationMethodConfig<\n TScenario extends Scenario,\n TArtifact = unknown,\n> {\n name: string\n source: Omit<OptimizationPackageSource, 'evidence'>\n objective: string\n evaluationId: string\n background?: string\n maxEvaluations: number\n /** Hard limit for calls made through `context.cost`. Use 0 for no paid work. */\n maxOptimizerCostUsd: number\n /** Abort `context.signal` after this duration. Default: 30 minutes. */\n timeoutMs?: number\n /** Default: `never`. Compatible runs reuse one state directory. */\n resume?: ExternalOptimizerResumeMode\n maxCandidateChars?: number\n maxEvidenceChars?: number\n describeScenario?: (scenario: TScenario) => unknown\n describeArtifact?: (artifact: TArtifact, scenario: TScenario) => unknown\n run: (context: ExternalTextOptimizerContext) => Promise<ExternalTextOptimizerResult>\n}\n\nconst MAX_TIMER_DELAY_MS = 2_147_483_647\n\nexport function assertExternalTextOptimizationConfig<TScenario extends Scenario, TArtifact>(\n config: ExternalTextOptimizationMethodConfig<TScenario, TArtifact>,\n): void {\n for (const [field, value] of [\n ['name', config.name],\n ['objective', config.objective],\n ['evaluationId', config.evaluationId],\n ] as const) {\n if (typeof value !== 'string' || !value.trim() || value.trim() !== value) {\n throw new Error(`externalTextOptimizationMethod: ${field} must be trimmed and non-empty`)\n }\n }\n if (config.timeoutMs !== undefined && config.timeoutMs > MAX_TIMER_DELAY_MS) {\n throw new Error(\n `externalTextOptimizationMethod: timeoutMs must not exceed ${MAX_TIMER_DELAY_MS}`,\n )\n }\n if (\n config.background !== undefined &&\n (typeof config.background !== 'string' ||\n !config.background.trim() ||\n config.background.trim() !== config.background)\n ) {\n throw new Error('externalTextOptimizationMethod: background must be trimmed and non-empty')\n }\n if (typeof config.run !== 'function') {\n throw new Error('externalTextOptimizationMethod: run must be a function')\n }\n if (\n config.resume !== undefined &&\n config.resume !== 'never' &&\n config.resume !== 'if-compatible' &&\n config.resume !== 'required'\n ) {\n throw new Error(\n \"externalTextOptimizationMethod: resume must be 'never', 'if-compatible', or 'required'\",\n )\n }\n for (const [field, value] of [\n ['maxEvaluations', config.maxEvaluations],\n ['timeoutMs', config.timeoutMs],\n ['maxCandidateChars', config.maxCandidateChars],\n ['maxEvidenceChars', config.maxEvidenceChars],\n ] as const) {\n if (value !== undefined && (!Number.isSafeInteger(value) || value <= 0)) {\n throw new Error(`externalTextOptimizationMethod: ${field} must be a positive safe integer`)\n }\n }\n if (!Number.isFinite(config.maxOptimizerCostUsd) || config.maxOptimizerCostUsd < 0) {\n throw new Error(\n 'externalTextOptimizationMethod: maxOptimizerCostUsd must be finite and non-negative',\n )\n }\n if (\n config.source?.kind !== 'package' ||\n typeof config.source.package !== 'string' ||\n !config.source.package.trim() ||\n config.source.package.trim() !== config.source.package ||\n typeof config.source.version !== 'string' ||\n !config.source.version.trim() ||\n config.source.version.trim() !== config.source.version\n ) {\n throw new Error('externalTextOptimizationMethod: source must identify a package and version')\n }\n for (const [field, value] of [\n ['sourceUrl', config.source.sourceUrl],\n ['revision', config.source.revision],\n ] as const) {\n if (\n value !== undefined &&\n (typeof value !== 'string' || !value.trim() || value.trim() !== value)\n ) {\n throw new Error(`externalTextOptimizationMethod: source.${field} must be trimmed`)\n }\n }\n}\n\nexport function snapshotExternalTextOptimizationConfig<TScenario extends Scenario, TArtifact>(\n config: ExternalTextOptimizationMethodConfig<TScenario, TArtifact>,\n): ExternalTextOptimizationMethodConfig<TScenario, TArtifact> {\n return {\n ...config,\n source: { ...config.source },\n }\n}\n\nexport function assertExternalTextOptimizerResult(\n result: unknown,\n name: string,\n maxCandidateChars: number,\n expectsComponents: boolean,\n): asserts result is ExternalTextOptimizerResult {\n if (!result || typeof result !== 'object') {\n throw new Error(`${name}: optimizer returned no result`)\n }\n const value = result as Partial<ExternalTextOptimizerResult>\n if (!isExternalTextCandidate(value.bestCandidate)) {\n throw new Error(`${name}: optimizer returned an invalid bestCandidate`)\n }\n const candidateChars =\n typeof value.bestCandidate === 'string'\n ? value.bestCandidate.length\n : JSON.stringify(value.bestCandidate).length\n if (candidateChars > maxCandidateChars) {\n throw new Error(`${name}: optimizer bestCandidate exceeds maxCandidateChars`)\n }\n if (expectsComponents !== (typeof value.bestCandidate !== 'string')) {\n throw new Error(`${name}: optimizer changed the surface kind`)\n }\n if (typeof value.resumed !== 'boolean') {\n throw new Error(`${name}: optimizer returned an invalid resumed flag`)\n }\n assertExternalCostAccounting(value.costAccounting, undefined, name)\n}\n\nexport function readExternalOptimizerRunManifest(\n text: string | undefined,\n exists: boolean,\n path: string,\n expectedRunId: string,\n): ExternalOptimizerRunManifest | undefined {\n if (text === undefined) {\n if (exists) throw new Error(`${path} exists but cannot be read`)\n return undefined\n }\n if (!text?.endsWith('\\n')) {\n throw new Error(`${path} is invalid`)\n }\n\n let current: Omit<ExternalOptimizerRunManifest, 'revision'> | undefined\n const attempts = new Set<string>()\n for (const line of text.split('\\n')) {\n if (!line) continue\n let value: unknown\n try {\n value = JSON.parse(line)\n } catch (cause) {\n throw new Error(`${path} is invalid`, { cause })\n }\n assertExternalOptimizerRunManifestEvent(value, path, expectedRunId)\n if (value.status === 'partial') {\n if (attempts.has(value.attemptId)) {\n throw new Error(`${path} repeats attempt '${value.attemptId}'`)\n }\n attempts.add(value.attemptId)\n current = { status: value.status, attemptId: value.attemptId }\n continue\n }\n if (current?.status !== 'partial' || current.attemptId !== value.attemptId) {\n throw new Error(`${path} completes an attempt that is not active`)\n }\n current = { status: value.status, attemptId: value.attemptId }\n }\n if (!current) throw new Error(`${path} is invalid`)\n return {\n ...current,\n revision: new TextEncoder().encode(text).byteLength,\n }\n}\n\nfunction assertExternalOptimizerRunManifestEvent(\n value: unknown,\n path: string,\n expectedRunId: string,\n): asserts value is ExternalOptimizerRunManifestEvent {\n if (\n !value ||\n typeof value !== 'object' ||\n Array.isArray(value) ||\n Object.keys(value).sort().join(',') !== 'attemptId,runId,status'\n ) {\n throw new Error(`${path} is invalid`)\n }\n const event = value as Partial<ExternalOptimizerRunManifestEvent>\n if (\n event.runId !== expectedRunId ||\n typeof event.attemptId !== 'string' ||\n !event.attemptId.trim() ||\n event.attemptId.trim() !== event.attemptId ||\n (event.status !== 'partial' && event.status !== 'completed')\n ) {\n throw new Error(`${path} does not match the compatible run`)\n }\n}\n\nexport function assertExternalCostAccounting(\n value: unknown,\n calls: number | undefined,\n name: string,\n): void {\n if (!value || typeof value !== 'object') {\n throw new Error(`${name}: optimizer returned no costAccounting`)\n }\n const accounting = value as Partial<ExternalTextOptimizerResult['costAccounting']>\n if (accounting.kind === 'metered') {\n if (calls === 0) throw new Error(`${name}: metered optimizer recorded no paid calls`)\n return\n }\n if (accounting.kind === 'no-paid-work') {\n if (calls !== undefined && calls > 0) {\n throw new Error(`${name}: no-paid-work optimizer recorded paid calls`)\n }\n return\n }\n if (\n accounting.kind !== 'external' ||\n typeof accounting.reason !== 'string' ||\n !accounting.reason.trim() ||\n accounting.reason.trim() !== accounting.reason\n ) {\n throw new Error(`${name}: optimizer returned invalid costAccounting`)\n }\n}\n","import { randomBytes } from 'node:crypto'\nimport { mkdir } from 'node:fs/promises'\nimport type {\n CostChannel,\n CostReceipt,\n CostReceiptInput,\n MaximumCharge,\n PaidCallResult,\n RunPaidCallInput,\n} from '../cost-ledger'\nimport {\n type ExternalTextCandidate,\n type ExternalTextEvaluationRequest,\n safePathComponent,\n} from './external-optimizer-process'\nimport {\n externalOptimizerRunKey,\n openExternalOptimizerRunBudget,\n} from './external-optimizer-run-budget'\nimport {\n createExternalTextEvaluator,\n decodeExternalTextCandidate,\n describeExternalScenario,\n type ExternalOptimizationExample,\n type ExternalTextEvaluationResponse,\n encodeExternalTextCandidate,\n mapExternalScenarios,\n} from './external-text-evaluation'\nimport {\n assertExternalCostAccounting,\n assertExternalTextOptimizationConfig,\n assertExternalTextOptimizerResult,\n type ExternalOptimizerRunManifest,\n type ExternalOptimizerRunManifestEvent,\n type ExternalTextOptimizationMethodConfig,\n type ExternalTextOptimizerContext,\n type ExternalTextOptimizerResult,\n readExternalOptimizerRunManifest,\n snapshotExternalTextOptimizationConfig,\n} from './external-text-optimization-contract'\nimport {\n combineComparisonCosts,\n costFromLedgerSummary,\n optimizationTokenUsageFromSummary,\n} from './optimization-cost'\nimport type {\n OptimizationMethod,\n OptimizationMethodInput,\n OptimizationMethodResult,\n} from './optimization-method'\nimport { acquireSingleRunLock } from './single-run-lock'\nimport { type CampaignStorage, createRunCostLedger, fsCampaignStorage } from './storage'\nimport type { CampaignCostMeter, Scenario } from './types'\n\nexport type {\n ExternalOptimizationExample,\n ExternalTextEvaluationResponse,\n ExternalTextOptimizationMethodConfig,\n ExternalTextOptimizerContext,\n ExternalTextOptimizerResult,\n}\nexport {\n createExternalTextEvaluator,\n decodeExternalTextCandidate,\n describeExternalScenario,\n encodeExternalTextCandidate,\n mapExternalScenarios,\n}\n\nconst DEFAULT_MAX_CANDIDATE_CHARS = 200_000\nconst DEFAULT_MAX_EVIDENCE_CHARS = 100_000\nconst DEFAULT_TIMEOUT_MS = 30 * 60 * 1000\nconst MAX_TIMER_DELAY_MS = 2_147_483_647\n\n/**\n * Adapt a third-party text optimizer without reimplementing its search.\n *\n * The callback never receives final test cases. Calls to `evaluate` are\n * counted before execution and stop at `maxEvaluations`.\n */\nexport function externalTextOptimizationMethod<TScenario extends Scenario, TArtifact>(\n config: ExternalTextOptimizationMethodConfig<TScenario, TArtifact>,\n): OptimizationMethod<TScenario, TArtifact> {\n assertExternalTextOptimizationConfig(config)\n const snapshot = snapshotExternalTextOptimizationConfig(config)\n\n return {\n name: snapshot.name,\n optimize: (input) => optimizeExternalText(snapshot, input),\n }\n}\n\n/** What one optimizer run derives from its configuration and input before the optimizer starts. */\ninterface ExternalRun<TScenario extends Scenario, TArtifact> {\n readonly snapshot: ExternalTextOptimizationMethodConfig<TScenario, TArtifact>\n readonly input: OptimizationMethodInput<TScenario, TArtifact>\n readonly seedCandidate: ExternalTextCandidate\n readonly expectsComponents: boolean\n readonly maxCandidateChars: number\n readonly maxEvidenceChars: number\n readonly attemptId: string\n readonly storage: CampaignStorage\n readonly resume: NonNullable<ExternalTextOptimizationMethodConfig<TScenario, TArtifact>['resume']>\n readonly trainSet: readonly ExternalOptimizationExample[]\n readonly selectionSet: readonly ExternalOptimizationExample[]\n readonly methodDir: string\n readonly runId: string\n readonly stateDir: string\n readonly artifactDir: string\n readonly manifestPath: string\n readonly lock: ReturnType<typeof acquireSingleRunLock> | undefined\n /** False once a still-running optimizer or paid call has taken over releasing the lock. */\n releaseLock: boolean\n}\n\n/** The stores one optimizer run charges and counts against. */\ninterface ExternalRunAccounts {\n readonly runBudget: ReturnType<typeof openExternalOptimizerRunBudget>\n readonly optimizerLedger: ReturnType<typeof createRunCostLedger>\n}\n\n/** The live optimizer: its abort control, in-flight evaluations and run promise. */\ninterface OptimizerSession {\n readonly controller: AbortController\n readonly activeEvaluations: Set<Promise<ExternalTextEvaluationResponse>>\n readonly runPromise: Promise<ExternalTextOptimizerResult>\n readonly timeout: ReturnType<typeof setTimeout>\n readonly started: number\n readonly state: { acceptingEvaluations: boolean; runSettled: boolean }\n}\n\nconst EVALUATION_COST_PHASE = 'external.evaluation'\nconst OPTIMIZER_COST_PHASE = 'external.optimizer'\n\nasync function optimizeExternalText<TScenario extends Scenario, TArtifact>(\n snapshot: ExternalTextOptimizationMethodConfig<TScenario, TArtifact>,\n input: OptimizationMethodInput<TScenario, TArtifact>,\n): Promise<OptimizationMethodResult> {\n const run = await prepareExternalRun(snapshot, input)\n try {\n const { manifest, restoreRequested } = restoreRunManifest(run)\n const accounts = openRunAccounts(run)\n const session = startOptimizerSession(run, accounts, restoreRequested)\n const result = await awaitOptimizerResult(run, accounts, session, restoreRequested)\n return finishRun(run, accounts, session, manifest, result)\n } finally {\n if (run.releaseLock) run.lock?.release()\n }\n}\n\nfunction describeExternalScenarios<TScenario extends Scenario, TArtifact>(\n scenarios: readonly TScenario[],\n snapshot: ExternalTextOptimizationMethodConfig<TScenario, TArtifact>,\n maxEvidenceChars: number,\n): readonly ExternalOptimizationExample[] {\n return Object.freeze(\n scenarios.map((scenario) =>\n describeExternalScenario(\n scenario,\n snapshot.name,\n maxEvidenceChars,\n snapshot.describeScenario,\n ),\n ),\n )\n}\n\n/** Run identity, scenario descriptions and directories, then the resume lock. */\nasync function prepareExternalRun<TScenario extends Scenario, TArtifact>(\n snapshot: ExternalTextOptimizationMethodConfig<TScenario, TArtifact>,\n input: OptimizationMethodInput<TScenario, TArtifact>,\n): Promise<ExternalRun<TScenario, TArtifact>> {\n const seedCandidate = encodeExternalTextCandidate(input.baselineSurface)\n const maxCandidateChars = snapshot.maxCandidateChars ?? DEFAULT_MAX_CANDIDATE_CHARS\n const maxEvidenceChars = snapshot.maxEvidenceChars ?? DEFAULT_MAX_EVIDENCE_CHARS\n const attemptId = randomBytes(16).toString('hex')\n const storage = input.runOptions.storage ?? fsCampaignStorage()\n const resume = snapshot.resume ?? 'never'\n const trainSet = describeExternalScenarios(input.trainScenarios, snapshot, maxEvidenceChars)\n const selectionSet = describeExternalScenarios(\n input.selectionScenarios,\n snapshot,\n maxEvidenceChars,\n )\n const methodDir = `${input.runDir}/external/${safePathComponent(snapshot.name)}`\n const runMaterial = {\n optimizer: {\n kind: snapshot.source.kind,\n package: snapshot.source.package,\n version: snapshot.source.version,\n ...(snapshot.source.sourceUrl ? { sourceUrl: snapshot.source.sourceUrl } : {}),\n ...(snapshot.source.revision ? { revision: snapshot.source.revision } : {}),\n },\n method: snapshot.name,\n evaluationId: snapshot.evaluationId,\n dispatchRef: input.runOptions.dispatchRef ?? null,\n objective: snapshot.objective,\n background: snapshot.background ?? '',\n seed: input.seed,\n seedCandidate,\n trainSet,\n selectionSet,\n maxEvaluations: snapshot.maxEvaluations,\n maxOptimizerCostUsd: snapshot.maxOptimizerCostUsd,\n maxCandidateChars,\n maxEvidenceChars,\n }\n const runId = externalOptimizerRunKey({\n material: runMaterial,\n attemptId,\n resumeEnabled: resume !== 'never',\n })\n const stateDir = `${methodDir}/state/${runId}`\n const artifactDir = `${methodDir}/attempts/${attemptId}`\n storage.ensureDir(stateDir)\n storage.ensureDir(artifactDir)\n if (resume !== 'never') await mkdir(stateDir, { recursive: true })\n const lock =\n resume === 'never'\n ? undefined\n : acquireSingleRunLock({\n lockPath: `${stateDir}.lock`,\n releaseOnExit: true,\n })\n return {\n snapshot,\n input,\n seedCandidate,\n expectsComponents: typeof seedCandidate !== 'string',\n maxCandidateChars,\n maxEvidenceChars,\n attemptId,\n storage,\n resume,\n trainSet,\n selectionSet,\n methodDir,\n runId,\n stateDir,\n artifactDir,\n manifestPath: `${stateDir}/run-manifest.jsonl`,\n lock,\n releaseLock: true,\n }\n}\n\n/** Reads prior state when resuming, and records this attempt as partial. */\nfunction restoreRunManifest<TScenario extends Scenario, TArtifact>(\n run: ExternalRun<TScenario, TArtifact>,\n): { manifest: ExternalOptimizerRunManifest | undefined; restoreRequested: boolean } {\n const { snapshot, storage, manifestPath, runId, attemptId, resume } = run\n let manifest =\n resume === 'never'\n ? undefined\n : readExternalOptimizerRunManifest(\n storage.read(manifestPath),\n storage.exists(manifestPath),\n manifestPath,\n runId,\n )\n const restoreRequested = manifest !== undefined\n if (resume === 'required' && !restoreRequested) {\n throw new Error(`${snapshot.name}: no compatible run state is available to resume`)\n }\n if (resume === 'never' && restoreRequested) {\n throw new Error(`${snapshot.name}: fresh optimizer run unexpectedly found prior state`)\n }\n if (resume !== 'never') {\n manifest = appendExternalOptimizerRunManifestEvent({\n storage,\n path: manifestPath,\n revision: manifest?.revision ?? 0,\n event: { runId, attemptId, status: 'partial' },\n })\n }\n return { manifest, restoreRequested }\n}\n\nfunction openRunAccounts<TScenario extends Scenario, TArtifact>(\n run: ExternalRun<TScenario, TArtifact>,\n): ExternalRunAccounts {\n const { snapshot, storage, methodDir, runId, attemptId, stateDir } = run\n return {\n runBudget: openExternalOptimizerRunBudget({\n storage,\n runDir: methodDir,\n runKey: runId,\n attemptId,\n maxEvaluations: snapshot.maxEvaluations,\n }),\n optimizerLedger: createRunCostLedger({\n storage,\n runDir: `${stateDir}/cost`,\n costCeilingUsd: snapshot.maxOptimizerCostUsd,\n }),\n }\n}\n\n/** Optimizer paid calls, charged to the optimizer's own limit and mirrored into the method's account. */\nfunction createOptimizerCostMeter<TScenario extends Scenario, TArtifact>(\n run: ExternalRun<TScenario, TArtifact>,\n accounts: ExternalRunAccounts,\n controller: AbortController,\n): CampaignCostMeter {\n const { snapshot, input } = run\n const { runBudget, optimizerLedger } = accounts\n const meter: CampaignCostMeter = {\n async runPaidCall<T>(\n request: Omit<RunPaidCallInput<T>, 'channel' | 'phase' | 'tags'> & {\n channel?: CostChannel\n },\n ): Promise<PaidCallResult<T>> {\n const call = {\n methodResult: undefined as PaidCallResult<T> | undefined,\n providerStarted: false,\n }\n const subLimitResult = await optimizerLedger.runPaidCall<T>({\n ...request,\n channel: request.channel ?? 'optimizer',\n phase: OPTIMIZER_COST_PHASE,\n tags: runBudget.attemptTags,\n signal: request.signal\n ? AbortSignal.any([controller.signal, request.signal])\n : controller.signal,\n execute: async (signal, callId) => {\n call.methodResult = await input.costLedger.runPaidCall<T>({\n ...request,\n callId,\n channel: request.channel ?? 'optimizer',\n phase: OPTIMIZER_COST_PHASE,\n tags: runBudget.attemptTags,\n signal,\n execute: (methodSignal, methodCallId) => {\n call.providerStarted = true\n return request.execute(methodSignal, methodCallId)\n },\n })\n if (!call.methodResult.succeeded) {\n throw new Error(`${snapshot.name}: method cost account rejected optimizer call`, {\n cause: call.methodResult.error,\n })\n }\n return call.methodResult.value\n },\n receipt: () => {\n if (!call.methodResult?.succeeded) {\n throw new Error(`${snapshot.name}: optimizer call completed without a receipt`)\n }\n return mirroredCostReceipt(call.methodResult.receipt)\n },\n receiptFromError: () => {\n if (call.methodResult?.receipt) {\n return mirroredCostReceipt(call.methodResult.receipt)\n }\n if (!call.providerStarted) {\n return noChargeReceipt(modelBeforeExecution(request))\n }\n return undefined\n },\n })\n if (call.methodResult === undefined) return subLimitResult\n if (!call.methodResult.succeeded) return call.methodResult\n return subLimitResult.succeeded ? call.methodResult : subLimitResult\n },\n }\n return Object.freeze(meter)\n}\n\n/** Starts the optimizer with its evaluator, cost meter, timeout and frozen context. */\nfunction startOptimizerSession<TScenario extends Scenario, TArtifact>(\n run: ExternalRun<TScenario, TArtifact>,\n accounts: ExternalRunAccounts,\n restoreRequested: boolean,\n): OptimizerSession {\n const { snapshot, input, runId, stateDir, artifactDir } = run\n const { runBudget } = accounts\n const scenarioById = mapExternalScenarios(\n input.trainScenarios,\n input.selectionScenarios,\n `${snapshot.name} optimizer`,\n )\n const score = createExternalTextEvaluator({\n input,\n label: `${snapshot.name} optimizer`,\n runDir: artifactDir,\n compatibleRunId: runId,\n costPhase: EVALUATION_COST_PHASE,\n costTags: runBudget.attemptTags,\n costLedger: input.costLedger,\n scenarioById,\n maxCandidateChars: run.maxCandidateChars,\n maxEvidenceChars: run.maxEvidenceChars,\n describeArtifact: snapshot.describeArtifact,\n })\n const controller = new AbortController()\n const activeEvaluations = new Set<Promise<ExternalTextEvaluationResponse>>()\n const state = { acceptingEvaluations: true, runSettled: false }\n const optimizerCostMeter = createOptimizerCostMeter(run, accounts, controller)\n const evaluate = (\n request: ExternalTextEvaluationRequest,\n signal = controller.signal,\n ): Promise<ExternalTextEvaluationResponse> => {\n if (!state.acceptingEvaluations) {\n throw new Error(`${snapshot.name}: evaluate cannot be called after run() completes`)\n }\n if (runBudget.acceptEvaluation() === undefined) {\n throw new Error(`${snapshot.name}: maxEvaluations limit reached`)\n }\n const combinedSignal =\n signal === controller.signal\n ? controller.signal\n : AbortSignal.any([controller.signal, signal])\n const pending = score(cloneExternalEvaluationRequest(request), combinedSignal)\n activeEvaluations.add(pending)\n const remove = () => activeEvaluations.delete(pending)\n void pending.then(remove, remove)\n return pending\n }\n\n const started = Date.now()\n const timeoutMs = snapshot.timeoutMs ?? DEFAULT_TIMEOUT_MS\n const timeout = setTimeout(\n () => controller.abort(new Error(`${snapshot.name}: optimizer exceeded ${timeoutMs}ms`)),\n timeoutMs,\n )\n const runPromise = Promise.resolve().then(() =>\n snapshot.run(\n Object.freeze({\n runId,\n name: snapshot.name,\n objective: snapshot.objective,\n evaluationId: snapshot.evaluationId,\n ...(snapshot.background ? { background: snapshot.background } : {}),\n seedCandidate: cloneExternalTextCandidate(run.seedCandidate),\n trainSet: run.trainSet,\n selectionSet: run.selectionSet,\n maxEvaluations: snapshot.maxEvaluations,\n seed: input.seed,\n stateDir,\n restoreRequested,\n artifactDir,\n signal: controller.signal,\n cost: optimizerCostMeter,\n evaluate,\n }),\n ),\n )\n const markSettled = () => {\n state.runSettled = true\n }\n void runPromise.then(markSettled, markSettled)\n return { controller, activeEvaluations, runPromise, timeout, started, state }\n}\n\n/** Waits for the optimizer, then refuses a run that left evaluations or paid calls outstanding. */\nasync function awaitOptimizerResult<TScenario extends Scenario, TArtifact>(\n run: ExternalRun<TScenario, TArtifact>,\n accounts: ExternalRunAccounts,\n session: OptimizerSession,\n restoreRequested: boolean,\n): Promise<ExternalTextOptimizerResult> {\n const { snapshot, lock } = run\n const { optimizerLedger } = accounts\n let result: ExternalTextOptimizerResult | undefined\n let runError: unknown\n let outstandingAtCompletion = 0\n let paidCallsAtCompletion = 0\n try {\n result = await raceWithAbort(session.runPromise, session.controller.signal)\n outstandingAtCompletion = session.activeEvaluations.size\n paidCallsAtCompletion = optimizerLedger.summary().pendingCalls\n } catch (error) {\n runError = error\n } finally {\n session.state.acceptingEvaluations = false\n clearTimeout(session.timeout)\n }\n await Promise.allSettled([...session.activeEvaluations])\n const paidCallsSettled = await optimizerLedger.waitForIdle({ timeoutMs: 5_000 })\n const handOffLock = () => {\n if (!lock) return\n run.releaseLock = false\n void Promise.allSettled([\n session.runPromise,\n optimizerLedger.waitForIdle({ timeoutMs: MAX_TIMER_DELAY_MS }),\n ]).then(() => lock.release())\n }\n if (runError !== undefined) {\n if (!session.state.runSettled || !paidCallsSettled) handOffLock()\n throw runError\n }\n if (!paidCallsSettled) {\n handOffLock()\n throw new Error(`${snapshot.name}: optimizer paid calls did not settle`)\n }\n if (paidCallsAtCompletion > 0) {\n throw new Error(\n `${snapshot.name}: run() completed with ${paidCallsAtCompletion} outstanding paid call(s); await every context.cost.runPaidCall()`,\n )\n }\n if (outstandingAtCompletion > 0) {\n throw new Error(\n `${snapshot.name}: run() completed with ${outstandingAtCompletion} outstanding evaluation(s); await every evaluate() call`,\n )\n }\n assertExternalTextOptimizerResult(\n result,\n snapshot.name,\n run.maxCandidateChars,\n run.expectsComponents,\n )\n if (result.resumed !== restoreRequested) {\n throw new Error(\n `${snapshot.name}: optimizer reported resumed=${String(result.resumed)} but restoreRequested=${String(restoreRequested)}`,\n )\n }\n return result\n}\n\n/** Measures evaluation and optimizer spend, records completion, and builds the method result. */\nfunction finishRun<TScenario extends Scenario, TArtifact>(\n run: ExternalRun<TScenario, TArtifact>,\n accounts: ExternalRunAccounts,\n session: OptimizerSession,\n manifest: ExternalOptimizerRunManifest | undefined,\n result: ExternalTextOptimizerResult,\n): OptimizationMethodResult {\n const { snapshot, input, storage, runId, attemptId } = run\n const { runBudget } = accounts\n const evaluationCost = costFromLedgerSummary(\n input.costLedger.summary({\n phase: EVALUATION_COST_PHASE,\n tags: runBudget.runTags,\n }),\n )\n const optimizerFilter = {\n phase: OPTIMIZER_COST_PHASE,\n tags: runBudget.runTags,\n }\n const optimizerReceipts = input.costLedger.list(optimizerFilter)\n const optimizerSummary = input.costLedger.summary(optimizerFilter)\n const optimizerCost = costFromLedgerSummary(optimizerSummary)\n assertExternalCostAccounting(result.costAccounting, optimizerSummary.totalCalls, snapshot.name)\n const externalCostReason =\n result.costAccounting.kind === 'external' ? result.costAccounting.reason : undefined\n const tokenUsage = optimizationTokenUsageFromSummary(optimizerSummary, optimizerReceipts)\n if (run.resume !== 'never') {\n appendExternalOptimizerRunManifestEvent({\n storage,\n path: run.manifestPath,\n revision: manifest!.revision,\n event: { runId, attemptId, status: 'completed' },\n })\n }\n const measuredCost = combineComparisonCosts([\n { label: 'evaluation', cost: evaluationCost },\n { label: 'optimizer', cost: optimizerCost },\n ])\n return {\n winnerSurface: decodeExternalTextCandidate(result.bestCandidate),\n cost: {\n ...measuredCost,\n ...(externalCostReason ? { costProvenance: { kind: 'uncaptured', usd: null } as const } : {}),\n accountingComplete: measuredCost.accountingComplete && externalCostReason === undefined,\n incompleteReasons: [\n ...measuredCost.incompleteReasons,\n ...(externalCostReason\n ? [`optimizer: external spend is not observed: ${externalCostReason}`]\n : []),\n ],\n },\n durationMs: Date.now() - session.started,\n provenance: {\n source: { ...snapshot.source, evidence: 'declared' },\n runId,\n resumed: result.resumed,\n evaluationCount: runBudget.acceptedEvaluations(),\n artifactDir: run.artifactDir,\n ...(tokenUsage ? { tokenUsage } : {}),\n },\n }\n}\n\nfunction appendExternalOptimizerRunManifestEvent(input: {\n storage: CampaignStorage\n path: string\n revision: number\n event: ExternalOptimizerRunManifestEvent\n}): ExternalOptimizerRunManifest {\n if (!input.storage.append) {\n throw new Error('external optimizer resume requires appendable storage')\n }\n const line = `${JSON.stringify(input.event)}\\n`\n const revision = input.storage.append(input.path, line, input.revision)\n if (revision === undefined) {\n throw new Error(`external optimizer run manifest was updated concurrently at '${input.path}'`)\n }\n return {\n status: input.event.status,\n attemptId: input.event.attemptId,\n revision,\n }\n}\n\nfunction mirroredCostReceipt(receipt: CostReceipt): CostReceiptInput {\n const usage = {\n model: receipt.model,\n inputTokens: receipt.inputTokens,\n outputTokens: receipt.outputTokens,\n ...(receipt.reasoningTokens === undefined ? {} : { reasoningTokens: receipt.reasoningTokens }),\n ...(receipt.cachedTokens === undefined ? {} : { cachedTokens: receipt.cachedTokens }),\n ...(receipt.cacheWriteTokens === undefined\n ? {}\n : { cacheWriteTokens: receipt.cacheWriteTokens }),\n ...(receipt.usageUnknown === undefined ? {} : { usageUnknown: receipt.usageUnknown }),\n }\n return receipt.costUnknown\n ? { ...usage, costUnknown: true }\n : { ...usage, actualCostUsd: receipt.costUsd }\n}\n\nfunction noChargeReceipt(model: string): CostReceiptInput {\n return {\n model,\n inputTokens: 0,\n outputTokens: 0,\n actualCostUsd: 0,\n }\n}\n\nfunction modelBeforeExecution(request: { model?: string; maximumCharge?: MaximumCharge }): string {\n if (request.model) return request.model\n if (request.maximumCharge && 'model' in request.maximumCharge) {\n return request.maximumCharge.model\n }\n return 'unstarted-optimizer-call'\n}\n\nfunction cloneExternalTextCandidate(candidate: ExternalTextCandidate): ExternalTextCandidate {\n return typeof candidate === 'string' ? candidate : { ...candidate }\n}\n\nfunction cloneExternalEvaluationRequest(\n request: ExternalTextEvaluationRequest,\n): ExternalTextEvaluationRequest {\n return {\n candidate: cloneExternalTextCandidate(request.candidate),\n exampleId: request.exampleId,\n }\n}\n\nasync function raceWithAbort<T>(promise: Promise<T>, signal: AbortSignal): Promise<T> {\n if (signal.aborted) throw signal.reason\n return await new Promise<T>((resolve, reject) => {\n const onAbort = () => reject(signal.reason)\n signal.addEventListener('abort', onAbort, { once: true })\n void promise.then(\n (value) => {\n signal.removeEventListener('abort', onAbort)\n resolve(value)\n },\n (error) => {\n signal.removeEventListener('abort', onAbort)\n reject(error)\n },\n )\n })\n}\n","/**\n * Compose multiple `Gate` implementations — every gate must pass for the\n * composite to ship. Closes the alignment reviewer's \"default-only\n * heldOutGate + costGate would happily promote a reward-hacked prompt\"\n * concern by making safety gates first-class composable defaults.\n */\n\nimport type { Gate, GateContext, GateDecision, GateResult, Scenario } from '../types'\n\n/** Compose gates — all must `ship` for the composite to `ship`. First\n * non-ship verdict short-circuits the composite verdict, but ALL gates run\n * (so the result records every gate's reason — useful for diagnostics). */\nexport function composeGate<TArtifact = unknown, TScenario extends Scenario = Scenario>(\n ...gates: Array<Gate<TArtifact, TScenario>>\n): Gate<TArtifact, TScenario> {\n if (gates.length === 0) {\n throw new Error('composeGate requires at least one gate')\n }\n return {\n name: `composed(${gates.map((g) => g.name).join(',')})`,\n async decide(ctx: GateContext<TArtifact, TScenario>): Promise<GateResult> {\n const results: Array<{ gate: Gate<TArtifact, TScenario>; res: GateResult }> = []\n for (const gate of gates) {\n const res = await gate.decide(ctx)\n results.push({ gate, res })\n }\n\n // Substrate-wide verdict policy:\n // - all 'ship' → 'ship'\n // - any 'arch_ceiling' → 'arch_ceiling' (architectural ceiling beats other holds)\n // - any 'model_ceiling' → 'model_ceiling'\n // - any 'hold' → 'hold'\n // - else 'need_more_work'\n const decisions = results.map((r) => r.res.decision)\n const overall: GateDecision = decisions.every((d) => d === 'ship')\n ? 'ship'\n : decisions.includes('arch_ceiling')\n ? 'arch_ceiling'\n : decisions.includes('model_ceiling')\n ? 'model_ceiling'\n : decisions.includes('hold')\n ? 'hold'\n : 'need_more_work'\n\n const contributing = results.flatMap((r) =>\n r.res.contributingGates.length > 0\n ? r.res.contributingGates\n : [\n {\n name: r.gate.name,\n status:\n r.res.decision === 'ship'\n ? ('pass' as const)\n : r.res.decision === 'need_more_work'\n ? ('not_evaluated' as const)\n : ('fail' as const),\n detail: r.res,\n },\n ],\n )\n\n const reasons = results.flatMap((r) =>\n r.res.reasons.map((reason) => `[${r.gate.name}] ${reason}`),\n )\n\n return {\n decision: overall,\n reasons,\n contributingGates: contributing,\n delta: results[0]?.res.delta,\n }\n },\n }\n}\n","/**\n * @module\n * Composable held-out promotion gate.\n *\n * Pair by full `scenario:rep` cellId, then ship only when the lower bound of\n * the interval the outcome's SHAPE admits strictly clears the threshold, with\n * at least `minProductiveRuns` paired observations. The rule is\n * `decidePairedPromotion` (`src/paired-promotion-decision.ts`) — the same one\n * `HeldOutGate` decides on, not a second copy: a pass/fail holdout decides on\n * Tango's score interval, McNemar's exact test vetoes at a non-negative\n * threshold, and a zero-width interval is refused rather than promoted.\n *\n * Use when you want held-out significance as ONE of N composed gates instead\n * of the full `defaultProductionGate` stack (which adds critical-dimension\n * regression + reward-hacking guards on top).\n */\n\nimport type { Gate, GateContext, GateResult, Scenario } from '../types'\nimport { heldoutSignificance, pairHoldout, TIE_WARN_FRACTION } from './statistical-heldout'\n\nexport interface HeldOutGateOptions<TScenario extends Scenario = Scenario> {\n scenarios: TScenario[]\n /** Effect-size threshold the CI lower bound must clear, in the judge's native\n * scale. Default 0.5. Equality holds; CI.low must be greater than this value. */\n deltaThreshold?: number\n /** Bootstrap CI confidence. Default 0.95. */\n confidence?: number\n /** Minimum paired holdout observations to claim significance. The exact\n * small-sample test may require more observations at the selected\n * confidence. Default 3. */\n minProductiveRuns?: number\n /** Bootstrap resamples. Default 2000. */\n resamples?: number\n /** Fixed bootstrap seed for deterministic verdicts. Default 1337. */\n bootstrapSeed?: number\n}\n\n/**\n * Composable held-out gate: ships only when the lower bound of the DECIDING\n * paired interval on the candidate-minus-baseline composite delta clears\n * `deltaThreshold` — Tango's score interval on a pass/fail holdout, the mean\n * bootstrap otherwise. See {@link decidePairedPromotion}.\n */\nexport function heldOutGate<TArtifact, TScenario extends Scenario>(\n options: HeldOutGateOptions<TScenario>,\n): Gate<TArtifact, TScenario> {\n const deltaThreshold = options.deltaThreshold ?? 0.5\n const confidence = options.confidence ?? 0.95\n const minProductiveRuns = options.minProductiveRuns ?? 3\n const resamples = options.resamples ?? 2000\n const seed = options.bootstrapSeed ?? 1337\n return {\n name: 'heldOutGate',\n async decide(ctx: GateContext<TArtifact, TScenario>): Promise<GateResult> {\n if (!ctx.baselineJudgeScores) {\n throw new Error(\n 'heldOutGate: ctx.baselineJudgeScores is required — comparing candidate scores against themselves would hide a missing baseline',\n )\n }\n const scenarioIds = new Set(options.scenarios.map((s) => s.id))\n const sig = heldoutSignificance(\n pairHoldout(ctx.judgeScores, ctx.baselineJudgeScores, scenarioIds, (s) => s.composite),\n {\n deltaThreshold,\n confidence,\n minProductiveRuns,\n resamples,\n seed,\n },\n )\n // Report the interval that DECIDED, not the diagnostic bootstrap: on a\n // pass/fail holdout the verdict comes from Tango's score interval, and\n // printing the bootstrap's bounds next to that verdict would put a\n // number in the reason string that did not produce it.\n const dec = sig.decision\n const delta = dec.delta\n const passed = sig.significant\n const status = sig.fewRuns ? 'not_evaluated' : passed ? 'pass' : 'fail'\n const tieNote =\n sig.tieFraction >= TIE_WARN_FRACTION ? `, ${(sig.tieFraction * 100).toFixed(0)}% tied` : ''\n const ci = `${(dec.confidence * 100).toFixed(0)}% CI [${dec.low.toFixed(3)}, ${dec.high.toFixed(3)}]`\n const held = `held-out ${dec.label} Δ ${delta.toFixed(3)}`\n const holdReason = sig.fewRuns\n ? `held-out: only ${sig.n} paired runs; ${sig.minimumRequired} required — too few to claim significance`\n : dec.indeterminate\n ? `held-out: ${dec.indeterminateCause}, so the paired CI is ${ci} and carries no direction — it cannot clear ${deltaThreshold} on evidence (n=${sig.n}${tieNote})`\n : dec.exactTestVetoes\n ? `${held}, McNemar exact p=${dec.mcnemar?.pValue.toExponential(2)} does not reject at α=${(1 - dec.confidence).toFixed(4)} (${ci}, n=${sig.n}${tieNote})`\n : `${held}, CI.low ${dec.low.toFixed(3)} ≤ ${deltaThreshold} (${ci}, n=${sig.n}${tieNote})`\n return {\n decision: passed ? 'ship' : 'hold',\n reasons: passed\n ? [\n `${held}, CI.low ${dec.low.toFixed(3)} > ${deltaThreshold} (${ci}, n=${sig.n}${tieNote})`,\n ]\n : [holdReason],\n contributingGates: [\n {\n name: 'heldOutGate',\n status,\n detail: {\n deltaMean: sig.bootstrap.mean,\n decidingDelta: delta,\n decisionStatistic: sig.decisionStatistic,\n decisionMethod: sig.decisionMethod,\n binaryScale: dec.binaryScale,\n mcnemar: dec.mcnemar,\n indeterminate: dec.indeterminate,\n deltaMedianDiagnostic: sig.medianBootstrap.median,\n tieFraction: sig.tieFraction,\n ciLow: dec.low,\n ciHigh: dec.high,\n bootstrapCiLow: sig.bootstrap.low,\n bootstrapCiHigh: sig.bootstrap.high,\n confidence: dec.confidence,\n n: sig.n,\n deltaThreshold,\n fewRuns: sig.fewRuns,\n seed,\n },\n },\n ],\n delta,\n }\n },\n }\n}\n","import {\n type ExternalOptimizerRunnerCommand,\n removeCredentialEnvironment,\n resolveExternalOptimizerProcessLimits,\n} from './external-optimizer-process'\n\nexport function externalOptimizerRunnerIdentity(\n runner: ExternalOptimizerRunnerCommand | undefined,\n module: string,\n): {\n command: string\n args: readonly string[]\n environment: Readonly<Record<string, string>>\n limits: ReturnType<typeof resolveExternalOptimizerProcessLimits>\n} {\n return {\n command: runner?.command ?? 'python',\n args: [...(runner?.args ?? ['-m', module])],\n environment: removeCredentialEnvironment(runner?.env ?? {}),\n limits: resolveExternalOptimizerProcessLimits(runner?.limits),\n }\n}\n\nexport function snapshotExternalOptimizerRunner(\n runner: ExternalOptimizerRunnerCommand | undefined,\n): ExternalOptimizerRunnerCommand | undefined {\n if (!runner) return undefined\n return {\n ...runner,\n ...(runner.args ? { args: [...runner.args] } : {}),\n ...(runner.env ? { env: { ...runner.env } } : {}),\n ...(runner.limits ? { limits: { ...runner.limits } } : {}),\n }\n}\n\nexport function snapshotJson<T>(value: T, label: string): T {\n const serialized = JSON.stringify(value)\n if (serialized === undefined) throw new Error(`${label} must be JSON-serializable`)\n return JSON.parse(serialized) as T\n}\n","import { assertServedModelPolicy, type ServedModelPolicy } from '../integrity/served-model'\nimport {\n assertExternalOptimizerModelBudget,\n type ExternalOptimizerModelBudget,\n type ExternalOptimizerModelCall,\n} from './external-optimizer-process'\n\nexport type OptimizerModelBudget = ExternalOptimizerModelBudget\n\n/** One metered model path supplied by the package that owns execution. */\nexport interface OpenAICompatibleOptimizerModel {\n model: string\n budget: OptimizerModelBudget\n /** Caller-owned execution path, such as Runtime's exact AgentProfile adapter. */\n call: ExternalOptimizerModelCall\n /** Stable public identity included in resumable-run compatibility. */\n callRef: string\n /**\n * Served-model acceptance for every proxied call. Default `'exact'`, which\n * rejects any substitution with a 502 to the child.\n * `'allow-within-family'` accepts a different model of the same provider\n * family; it keeps family-level claims valid and forfeits per-model claims.\n */\n servedModelPolicy?: ServedModelPolicy\n /**\n * Also expose this metered model over the Anthropic Messages API\n * (`POST /v1/messages`) on the loopback proxy. Required for GEPA agent\n * engines that drive a `claude` CLI subprocess. Agent engines are chatty:\n * size `budget.maxRequests` for tens of calls per engine run. Default: false.\n */\n anthropicEndpoint?: boolean\n}\n\nexport function assertOptimizerModel(value: OpenAICompatibleOptimizerModel, label: string): void {\n if (!value || typeof value !== 'object') {\n throw new Error(`${label} is required`)\n }\n for (const [field, item] of [\n ['model', value.model],\n ['callRef', value.callRef],\n ] as const) {\n if (typeof item !== 'string' || !item.trim() || item.trim() !== item) {\n throw new Error(`${label}.${field} must be trimmed and non-empty`)\n }\n }\n if (typeof value.call !== 'function') throw new Error(`${label}.call must be a function`)\n assertServedModelPolicy(value.servedModelPolicy, `${label}.servedModelPolicy`)\n if (value.anthropicEndpoint !== undefined && typeof value.anthropicEndpoint !== 'boolean') {\n throw new Error(`${label}.anthropicEndpoint must be a boolean`)\n }\n assertExternalOptimizerModelBudget(value.budget, `${label}.budget`)\n}\n\nexport function snapshotOptimizerModel(\n value: OpenAICompatibleOptimizerModel,\n): OpenAICompatibleOptimizerModel {\n return {\n model: value.model,\n budget: structuredClone(value.budget),\n call: value.call,\n callRef: value.callRef,\n ...(value.servedModelPolicy ? { servedModelPolicy: value.servedModelPolicy } : {}),\n ...(value.anthropicEndpoint === undefined\n ? {}\n : { anthropicEndpoint: value.anthropicEndpoint }),\n }\n}\n","import { isRecord } from '../llm-client/json'\nimport {\n assertJsonValue,\n assertNoCredentialValues,\n resolveExternalOptimizerCallbackLimits,\n} from './external-optimizer-process'\nimport { snapshotExternalOptimizerRunner } from './external-optimizer-run-config'\nimport type {\n GepaAdaptiveEngineRun,\n GepaEngineOptions,\n GepaEngineRun,\n GepaOptimizationMethodConfig,\n GepaOptimizationRecipe,\n} from './gepa-optimization-method'\nimport {\n assertOptimizerModel,\n type OpenAICompatibleOptimizerModel,\n snapshotOptimizerModel,\n} from './optimizer-model'\nimport type { Scenario } from './types'\n\nexport const GEPA_DEFAULT_MAX_CANDIDATE_CHARS = 200_000\nexport const GEPA_DEFAULT_MAX_EVIDENCE_CHARS = 100_000\nexport const GEPA_DEFAULT_TIMEOUT_MS = 30 * 60 * 1000\n\n/**\n * GEPA engines that drive a `claude` CLI subprocess. With\n * `optimizer.anthropicEndpoint: true` their model traffic is metered through\n * the loopback proxy's Anthropic route instead of being refused.\n */\nconst GEPA_AGENT_CLI_ENGINES: ReadonlySet<string> = new Set(['autoresearch', 'meta_harness'])\n\nexport function gepaRecipeHasAgentCliEngine(recipe: GepaOptimizationRecipe): boolean {\n return recipeEngineOptions(recipe).some((run) => GEPA_AGENT_CLI_ENGINES.has(run.engine))\n}\n\nconst MAX_TIMER_DELAY_MS = 2_147_483_647\n\nexport function snapshotGepaOptimizationConfig<TScenario extends Scenario, TArtifact>(\n config: GepaOptimizationMethodConfig<TScenario, TArtifact>,\n): GepaOptimizationMethodConfig<TScenario, TArtifact> {\n const runner = snapshotExternalOptimizerRunner(config.runner)\n return {\n ...config,\n recipe: structuredClone(config.recipe),\n ...(config.engineModules ? { engineModules: [...config.engineModules] } : {}),\n ...(config.optimizer ? { optimizer: snapshotOptimizerModel(config.optimizer) } : {}),\n ...(config.evaluationCallbackLimits\n ? { evaluationCallbackLimits: { ...config.evaluationCallbackLimits } }\n : {}),\n ...(runner ? { runner } : {}),\n }\n}\n\nexport function assertGepaOptimizationConfig<TScenario extends Scenario, TArtifact>(\n config: GepaOptimizationMethodConfig<TScenario, TArtifact>,\n): void {\n if (\n typeof config.objective !== 'string' ||\n !config.objective.trim() ||\n config.objective.trim() !== config.objective\n ) {\n throw new Error('gepaOptimizationMethod: objective must be trimmed and non-empty')\n }\n if (\n typeof config.evaluationId !== 'string' ||\n !config.evaluationId.trim() ||\n config.evaluationId.trim() !== config.evaluationId\n ) {\n throw new Error('gepaOptimizationMethod: evaluationId must be trimmed and non-empty')\n }\n if (\n config.name !== undefined &&\n (typeof config.name !== 'string' || !config.name.trim() || config.name.trim() !== config.name)\n ) {\n throw new Error('gepaOptimizationMethod: name must be trimmed and non-empty')\n }\n if (\n config.background !== undefined &&\n (typeof config.background !== 'string' ||\n !config.background.trim() ||\n config.background.trim() !== config.background)\n ) {\n throw new Error('gepaOptimizationMethod: background must be trimmed and non-empty')\n }\n if (\n config.resume !== undefined &&\n config.resume !== 'never' &&\n config.resume !== 'if-compatible' &&\n config.resume !== 'required'\n ) {\n throw new Error(\n \"gepaOptimizationMethod: resume must be 'never', 'if-compatible', or 'required'\",\n )\n }\n if (config.trustResumeState !== undefined && typeof config.trustResumeState !== 'boolean') {\n throw new Error('gepaOptimizationMethod: trustResumeState must be a boolean')\n }\n assertRecipe(config.recipe)\n if (\n config.resume !== undefined &&\n config.resume !== 'never' &&\n gepaRecipeSupportsResume(config.recipe) &&\n config.trustResumeState !== true\n ) {\n throw new Error(\n 'gepaOptimizationMethod: resumable GEPA pickle state requires trustResumeState: true',\n )\n }\n if (\n config.maxCandidateChars !== undefined &&\n (!Number.isSafeInteger(config.maxCandidateChars) || config.maxCandidateChars <= 0)\n ) {\n throw new Error('gepaOptimizationMethod: maxCandidateChars must be a positive safe integer')\n }\n if (\n config.maxEvidenceChars !== undefined &&\n (!Number.isSafeInteger(config.maxEvidenceChars) || config.maxEvidenceChars <= 0)\n ) {\n throw new Error('gepaOptimizationMethod: maxEvidenceChars must be a positive safe integer')\n }\n if (\n config.timeoutMs !== undefined &&\n (!Number.isSafeInteger(config.timeoutMs) ||\n config.timeoutMs <= 0 ||\n config.timeoutMs > MAX_TIMER_DELAY_MS)\n ) {\n throw new Error(`gepaOptimizationMethod: timeoutMs must be between 1 and ${MAX_TIMER_DELAY_MS}`)\n }\n const evidenceLimit = config.maxEvidenceChars ?? GEPA_DEFAULT_MAX_EVIDENCE_CHARS\n if (\n JSON.stringify(config.objective).length > evidenceLimit ||\n JSON.stringify(config.background ?? '').length > evidenceLimit\n ) {\n throw new Error(\n 'gepaOptimizationMethod: objective and background must each fit maxEvidenceChars',\n )\n }\n assertEngineModules(config.engineModules)\n resolveExternalOptimizerCallbackLimits(\n config.evaluationCallbackLimits,\n 'gepaOptimizationMethod: evaluationCallbackLimits',\n )\n if (config.optimizer !== undefined) {\n assertOptimizerModel(config.optimizer, 'gepaOptimizationMethod: optimizer')\n if (config.engineModules?.length) {\n throw new Error(\n 'gepaOptimizationMethod: optimizer cannot be combined with engineModules because proxied reflection requires the built-in GEPA engine',\n )\n }\n assertProxiedGepaRecipe(config.recipe, config.optimizer)\n }\n}\n\nexport function gepaRecipeSupportsResume(recipe: GepaOptimizationRecipe): boolean {\n return recipe.kind === 'engine' && recipe.run.engine === 'gepa'\n}\n\nexport function gepaRecipeEvaluationLimit(\n recipe: GepaOptimizationRecipe,\n selectionScenarioCount: number,\n): number {\n if (recipe.kind === 'adaptive-sequential') return recipe.maxEvaluations\n const runs =\n recipe.kind === 'engine'\n ? [recipe.run]\n : recipe.kind === 'sequential' || recipe.kind === 'best-of' || recipe.kind === 'vote'\n ? [...recipe.runs]\n : [...recipe.explore, recipe.continueWith]\n let total = 0\n for (const run of runs) {\n total = addEvaluationLimit(total, run.maxEvaluations)\n }\n if (recipe.kind === 'vote' && selectionScenarioCount > 0) {\n total = addEvaluationLimit(total, recipe.runs.length * selectionScenarioCount)\n }\n return total\n}\n\nexport function assertGepaComponentRecipe(recipe: GepaOptimizationRecipe, name: string): void {\n const unsupported = recipeEngineOptions(recipe).find((run) => run.engine !== 'gepa')\n if (unsupported) {\n throw new Error(\n `${name}: component surfaces require GEPA's 'gepa' engine; '${unsupported.engine}' accepts one text candidate`,\n )\n }\n}\n\nexport function defaultGepaMethodName(recipe: GepaOptimizationRecipe): string {\n if (recipe.kind === 'engine') return `gepa:${recipe.run.engine}`\n if (recipe.kind === 'omni') {\n return `gepa:omni:${recipe.continueWith.engine}`\n }\n return `gepa:${recipe.kind}`\n}\n\nfunction assertEngineModules(engineModules: readonly string[] | undefined): void {\n if (engineModules === undefined) return\n if (!Array.isArray(engineModules)) {\n throw new Error('gepaOptimizationMethod: engineModules must be an array')\n }\n const seen = new Set<string>()\n for (const module of engineModules) {\n if (\n typeof module !== 'string' ||\n !module ||\n !/^[A-Za-z][A-Za-z0-9_]*(?:\\.[A-Za-z][A-Za-z0-9_]*)*$/.test(module)\n ) {\n throw new Error(\n 'gepaOptimizationMethod: engineModules must contain public dotted Python module names',\n )\n }\n if (seen.has(module)) {\n throw new Error('gepaOptimizationMethod: engineModules must not contain duplicates')\n }\n seen.add(module)\n }\n}\n\nfunction assertRecipe(recipe: GepaOptimizationRecipe): void {\n if (!recipe || typeof recipe !== 'object') {\n throw new Error('gepaOptimizationMethod: recipe is required')\n }\n if (recipe.kind === 'engine') {\n assertEngineRun(recipe.run, 'recipe.run')\n return\n }\n if (recipe.kind === 'sequential') {\n assertEngineRuns(recipe.runs, 'recipe.runs', 1)\n return\n }\n if (recipe.kind === 'adaptive-sequential') {\n assertAdaptiveEngineRuns(recipe.runs, 'recipe.runs')\n assertPositiveSafeInteger(recipe.maxEvaluations, 'recipe.maxEvaluations')\n assertPositiveSafeInteger(recipe.plateauEvaluations, 'recipe.plateauEvaluations')\n if (recipe.patience !== undefined) {\n assertPositiveSafeInteger(recipe.patience, 'recipe.patience')\n }\n if (\n recipe.minEvaluationsPerStage !== undefined &&\n (!Number.isSafeInteger(recipe.minEvaluationsPerStage) || recipe.minEvaluationsPerStage < 0)\n ) {\n throw new Error(\n 'gepaOptimizationMethod: recipe.minEvaluationsPerStage must be a non-negative safe integer',\n )\n }\n if (\n recipe.improvementEpsilon !== undefined &&\n (!Number.isFinite(recipe.improvementEpsilon) || recipe.improvementEpsilon < 0)\n ) {\n throw new Error(\n 'gepaOptimizationMethod: recipe.improvementEpsilon must be a non-negative finite number',\n )\n }\n if (recipe.cycle !== undefined && typeof recipe.cycle !== 'boolean') {\n throw new Error('gepaOptimizationMethod: recipe.cycle must be a boolean')\n }\n if (recipe.maxSwitches !== undefined) {\n assertPositiveSafeInteger(recipe.maxSwitches, 'recipe.maxSwitches')\n }\n if (recipe.maxConcurrency !== undefined) {\n assertPositiveSafeInteger(recipe.maxConcurrency, 'recipe.maxConcurrency')\n }\n return\n }\n if (recipe.kind === 'best-of' || recipe.kind === 'vote') {\n assertEngineRuns(recipe.runs, 'recipe.runs', 2)\n assertParallelControls(recipe)\n return\n }\n if (recipe.kind === 'omni') {\n assertEngineRuns(recipe.explore, 'recipe.explore', 2)\n assertEngineRun(recipe.continueWith, 'recipe.continueWith')\n assertParallelControls(recipe)\n return\n }\n throw new Error('gepaOptimizationMethod: unsupported recipe')\n}\n\nfunction assertEngineRuns(runs: readonly GepaEngineRun[], label: string, minimum: number): void {\n if (!Array.isArray(runs) || runs.length < minimum) {\n throw new Error(\n `gepaOptimizationMethod: ${label} must contain at least ${minimum} bounded engine run${minimum === 1 ? '' : 's'}`,\n )\n }\n for (const [index, run] of runs.entries()) {\n assertEngineRun(run, `${label}[${index}]`)\n }\n}\n\nfunction assertAdaptiveEngineRuns(runs: readonly GepaAdaptiveEngineRun[], label: string): void {\n if (!Array.isArray(runs) || runs.length < 2) {\n throw new Error(\n `gepaOptimizationMethod: ${label} must contain at least two bounded engine runs`,\n )\n }\n for (const [index, run] of runs.entries()) {\n assertEngineOptions(run, `${label}[${index}]`)\n }\n}\n\nfunction assertEngineRun(run: GepaEngineRun, label: string): void {\n assertEngineOptions(run, label)\n assertPositiveSafeInteger(run.maxEvaluations, `${label}.maxEvaluations`)\n}\n\nfunction assertEngineOptions(run: GepaEngineOptions, label: string): void {\n if (!run || typeof run !== 'object') {\n throw new Error(`gepaOptimizationMethod: ${label} is required`)\n }\n if (typeof run.engine !== 'string' || !run.engine.trim() || run.engine.trim() !== run.engine) {\n throw new Error(`gepaOptimizationMethod: ${label}.engine must be a trimmed non-empty string`)\n }\n if (\n run.maxProposerCostUsd !== undefined &&\n (!Number.isFinite(run.maxProposerCostUsd) || run.maxProposerCostUsd <= 0)\n ) {\n throw new Error(\n `gepaOptimizationMethod: ${label}.maxProposerCostUsd must be a positive finite number when supplied`,\n )\n }\n if (run.maxConcurrency !== undefined) {\n assertPositiveSafeInteger(run.maxConcurrency, `${label}.maxConcurrency`)\n }\n if (run.stopAtScore !== undefined && !Number.isFinite(run.stopAtScore)) {\n throw new Error(`gepaOptimizationMethod: ${label}.stopAtScore must be a finite number`)\n }\n if (run.sandbox !== undefined && typeof run.sandbox !== 'boolean') {\n throw new Error(`gepaOptimizationMethod: ${label}.sandbox must be a boolean`)\n }\n assertJsonValue(run.engineConfig ?? {}, `gepaOptimizationMethod: ${label}.engineConfig`)\n assertNoCredentialValues(run.engineConfig ?? {}, `gepaOptimizationMethod: ${label}.engineConfig`)\n if (run.engine === 'gepa') {\n const nestedEngine = isRecord(run.engineConfig?.engine) ? run.engineConfig.engine : undefined\n if (nestedEngine && Object.hasOwn(nestedEngine, 'seed')) {\n throw new Error(\n `gepaOptimizationMethod: ${label}.engineConfig.engine.seed conflicts with the comparison seed; the bridge forwards the run seed`,\n )\n }\n }\n}\n\nfunction assertProxiedGepaRecipe(\n recipe: GepaOptimizationRecipe,\n optimizer: OpenAICompatibleOptimizerModel,\n): void {\n for (const [index, run] of recipeEngineOptions(recipe).entries()) {\n if (GEPA_AGENT_CLI_ENGINES.has(run.engine)) {\n assertProxiedAgentCliEngine(run, index, optimizer)\n continue\n }\n if (run.engine !== 'gepa') {\n throw new Error(\n `gepaOptimizationMethod: optimizer requires GEPA's 'gepa' engine; recipe engine ${index} is '${run.engine}'`,\n )\n }\n const reflection = isRecord(run.engineConfig?.reflection)\n ? run.engineConfig.reflection\n : undefined\n if (reflection && Object.hasOwn(reflection, 'reflection_lm')) {\n throw new Error(\n 'gepaOptimizationMethod: optimizer replaces engineConfig.reflection.reflection_lm; remove the duplicate setting',\n )\n }\n const reflectionOptions = isRecord(reflection?.reflection_lm_kwargs)\n ? reflection.reflection_lm_kwargs\n : undefined\n if (\n reflectionOptions &&\n [\n 'api_base',\n 'api_key',\n 'api_url',\n 'base_url',\n 'endpoint',\n 'messages',\n 'model',\n 'stream',\n ].some((key) => Object.hasOwn(reflectionOptions, key))\n ) {\n throw new Error(\n 'gepaOptimizationMethod: proxied reflection transport settings belong in optimizer',\n )\n }\n }\n}\n\nfunction assertProxiedAgentCliEngine(\n run: GepaEngineOptions,\n index: number,\n optimizer: OpenAICompatibleOptimizerModel,\n): void {\n if (optimizer.anthropicEndpoint !== true) {\n throw new Error(\n `gepaOptimizationMethod: agent engine '${run.engine}' (recipe engine ${index}) requires optimizer.anthropicEndpoint: true so the claude CLI meters through the loopback proxy`,\n )\n }\n // Both agent engines pass `--model engineConfig.model` to the CLI and the\n // flag beats the injected ANTHROPIC_MODEL, so a mismatch would 400 on every\n // CLI call at run time. Require the exact proxied model at config time.\n if (run.engineConfig?.model !== optimizer.model) {\n throw new Error(\n `gepaOptimizationMethod: recipe engine ${index} ('${run.engine}') must set engineConfig.model to the optimizer model '${optimizer.model}'`,\n )\n }\n // Anthropic extended thinking has no canonical execution-owner mapping. The\n // injected environment disables adaptive thinking; a fixed thinking budget\n // would force the CLI to request it and fail every call.\n if (run.engineConfig && Object.hasOwn(run.engineConfig, 'max_thinking_tokens')) {\n throw new Error(\n `gepaOptimizationMethod: recipe engine ${index} ('${run.engine}') cannot set engineConfig.max_thinking_tokens through the Anthropic endpoint`,\n )\n }\n}\n\nfunction assertParallelControls(recipe: { maxWorkers?: number }): void {\n if (recipe.maxWorkers !== undefined) {\n assertPositiveSafeInteger(recipe.maxWorkers, 'recipe.maxWorkers')\n }\n}\n\nfunction assertPositiveSafeInteger(value: number, label: string): void {\n if (!Number.isSafeInteger(value) || value <= 0) {\n throw new Error(`gepaOptimizationMethod: ${label} must be a positive safe integer`)\n }\n}\n\nfunction recipeEngineOptions(recipe: GepaOptimizationRecipe): readonly GepaEngineOptions[] {\n if (recipe.kind === 'engine') return [recipe.run]\n if (recipe.kind === 'omni') return [...recipe.explore, recipe.continueWith]\n return recipe.runs\n}\n\nfunction addEvaluationLimit(total: number, increment: number): number {\n const next = total + increment\n if (!Number.isSafeInteger(next)) {\n throw new Error('gepaOptimizationMethod: recipe evaluation limit exceeds safe integer range')\n }\n return next\n}\n","import type { CostLedgerSummary } from '../cost-ledger'\nimport type { OpenAICompatibleOptimizerModel } from './optimizer-model'\n\nexport interface ExternalOptimizerTokenUsage {\n inputTokens: number\n outputTokens: number\n totalTokens: number\n calls: number\n /** Provider requests, including failed attempts before a successful call. */\n requestAttempts?: number\n}\n\nconst TOKEN_USAGE_FIELDS = ['inputTokens', 'outputTokens', 'totalTokens', 'calls'] as const\n\nexport function assertPriorExternalOptimizerUsage(\n summary: CostLedgerSummary,\n budget: OpenAICompatibleOptimizerModel['budget'],\n name: string,\n): void {\n if (!summary.usageComplete || (budget.maxCostUsd !== undefined && !summary.accountingComplete)) {\n throw new Error(`${name}: cannot resume optimizer-model work with incomplete bounded usage`)\n }\n if (\n summary.totalCalls > budget.maxRequests ||\n (budget.maxCostUsd !== undefined && summary.totalCostUsd > budget.maxCostUsd + Number.EPSILON)\n ) {\n throw new Error(`${name}: prior optimizer-model usage exceeds the configured budget`)\n }\n}\n\nexport function assertExternalOptimizerTokenUsage(\n usage: ExternalOptimizerTokenUsage | undefined,\n name: string,\n optimizer: string,\n): void {\n if (usage === undefined) return\n for (const field of TOKEN_USAGE_FIELDS) {\n if (!Number.isSafeInteger(usage[field]) || usage[field] < 0) {\n throw new Error(`${name}: ${optimizer} bridge returned invalid tokenUsage.${field}`)\n }\n }\n if (usage.totalTokens !== usage.inputTokens + usage.outputTokens) {\n throw new Error(`${name}: ${optimizer} bridge returned inconsistent tokenUsage.totalTokens`)\n }\n if (\n usage.requestAttempts !== undefined &&\n (!Number.isSafeInteger(usage.requestAttempts) || usage.requestAttempts < usage.calls)\n ) {\n throw new Error(`${name}: ${optimizer} bridge returned invalid tokenUsage.requestAttempts`)\n }\n}\n\nexport function assertExternalOptimizerCompletionCount(\n upstream: ExternalOptimizerTokenUsage | undefined,\n requestAttempts: number,\n successfulCompletions: number,\n name: string,\n optimizer: string,\n): void {\n if (!upstream) {\n throw new Error(`${name}: ${optimizer} did not report optimizer token usage`)\n }\n if (\n !Number.isSafeInteger(requestAttempts) ||\n !Number.isSafeInteger(successfulCompletions) ||\n requestAttempts < 0 ||\n successfulCompletions < 0 ||\n successfulCompletions > requestAttempts\n ) {\n throw new Error(`${name}: optimizer model proxy returned invalid request counts`)\n }\n if (upstream.calls !== successfulCompletions) {\n throw new Error(\n `${name}: ${optimizer} reported ${upstream.calls} successful model calls but the proxy completed ${successfulCompletions} across ${requestAttempts} attempts`,\n )\n }\n if (upstream.requestAttempts !== undefined && upstream.requestAttempts !== requestAttempts) {\n throw new Error(\n `${name}: ${optimizer} reported ${upstream.requestAttempts} model attempts but the proxy received ${requestAttempts}`,\n )\n }\n}\n","import { isRecord } from '../llm-client/json'\nimport type { OptimizationPackageSource } from './optimization-method'\n\nexport interface ExternalOptimizerPackageSource<TPackage extends string> {\n package: TPackage\n version: string\n sourceUrl?: string\n revision?: string\n sourceSha256?: string\n}\n\nexport function assertExternalOptimizerPackageSource<TPackage extends string>(\n value: unknown,\n expectedPackage: TPackage,\n name: string,\n optimizer: string,\n): asserts value is ExternalOptimizerPackageSource<TPackage> {\n assertExternalOptimizerPackageIdentity(value, expectedPackage, name, optimizer)\n assertExternalOptimizerSourceDetails(value, name, optimizer)\n}\n\nexport function assertExternalOptimizerPackageIdentity<TPackage extends string>(\n value: unknown,\n expectedPackage: TPackage,\n name: string,\n optimizer: string,\n): asserts value is ExternalOptimizerPackageSource<TPackage> {\n if (\n !isRecord(value) ||\n value.package !== expectedPackage ||\n typeof value.version !== 'string' ||\n value.version.length === 0 ||\n value.version !== value.version.trim()\n ) {\n throw new Error(`${name}: ${optimizer} bridge returned invalid upstream package provenance`)\n }\n}\n\nexport function assertExternalOptimizerSourceDetails(\n value: ExternalOptimizerPackageSource<string>,\n name: string,\n optimizer: string,\n): void {\n if (\n value.sourceUrl !== undefined &&\n (typeof value.sourceUrl !== 'string' ||\n value.sourceUrl.length === 0 ||\n value.sourceUrl !== value.sourceUrl.trim())\n ) {\n throw new Error(`${name}: ${optimizer} bridge returned an invalid upstream sourceUrl`)\n }\n if (\n value.revision !== undefined &&\n (typeof value.revision !== 'string' ||\n value.revision.length === 0 ||\n value.revision !== value.revision.trim())\n ) {\n throw new Error(`${name}: ${optimizer} bridge returned an invalid upstream revision`)\n }\n if (\n value.sourceSha256 !== undefined &&\n (typeof value.sourceSha256 !== 'string' || !/^[0-9a-f]{64}$/.test(value.sourceSha256))\n ) {\n throw new Error(`${name}: ${optimizer} bridge returned an invalid upstream sourceSha256`)\n }\n}\n\nexport function observedExternalOptimizerPackageSource(\n value: ExternalOptimizerPackageSource<string>,\n): OptimizationPackageSource {\n return {\n kind: 'package',\n evidence: 'observed',\n package: value.package,\n version: value.version,\n ...(value.sourceUrl ? { sourceUrl: value.sourceUrl } : {}),\n ...(value.revision ? { revision: value.revision } : {}),\n ...(value.sourceSha256 ? { sourceSha256: value.sourceSha256 } : {}),\n }\n}\n","import { isDeepStrictEqual } from 'node:util'\nimport { isRecord } from '../llm-client/json'\nimport type {\n ExternalOptimizerResumeMode,\n ExternalOptimizerRunnerCommand,\n} from './external-optimizer-contracts'\nimport {\n assertExternalOptimizerPackageSource,\n type ExternalOptimizerPackageSource,\n observedExternalOptimizerPackageSource,\n} from './external-optimizer-source'\nimport { runExternalOptimizerProcess } from './external-optimizer-subprocess'\nimport type {\n OptimizationModuleSource,\n OptimizationPackageSource,\n OptimizationPythonRuntime,\n} from './optimization-method'\n\nexport interface ExternalOptimizerRuntimeIdentity<TPackage extends string> {\n python: OptimizationPythonRuntime\n bridge: ExternalOptimizerPackageSource<'agent-eval-rpc'>\n optimizer: ExternalOptimizerPackageSource<TPackage>\n engineModules: OptimizationModuleSource[]\n}\n\nexport interface ObservedExternalOptimizerRuntime {\n source: OptimizationPackageSource\n bridge: OptimizationPackageSource\n modules: OptimizationModuleSource[]\n python: OptimizationPythonRuntime\n}\n\nexport async function inspectExternalOptimizerRuntime<TPackage extends string>(args: {\n label: string\n package: TPackage\n module: string\n engineModules?: readonly string[]\n runner?: ExternalOptimizerRunnerCommand\n timeoutMs: number\n signal?: AbortSignal\n}): Promise<ExternalOptimizerRuntimeIdentity<TPackage>> {\n const result = await runExternalOptimizerProcess<{ runtime: unknown }>({\n label: `${args.label} source inspection`,\n tempPrefix: `agent-eval-${args.package}-inspect-`,\n module: args.module,\n input: {\n operation: 'inspect',\n engineModules: [...(args.engineModules ?? [])],\n },\n ...(args.runner ? { runner: args.runner } : {}),\n timeoutMs: args.timeoutMs,\n ...(args.signal ? { signal: args.signal } : {}),\n })\n assertExternalOptimizerRuntimeIdentity(result.runtime, args.package, args.label)\n return result.runtime\n}\n\nexport function observedExternalOptimizerRuntime(\n runtime: ExternalOptimizerRuntimeIdentity<string>,\n): ObservedExternalOptimizerRuntime {\n return {\n source: observedExternalOptimizerPackageSource(runtime.optimizer),\n bridge: observedExternalOptimizerPackageSource(runtime.bridge),\n modules: runtime.engineModules.map((module) => ({ ...module })),\n python: { ...runtime.python },\n }\n}\n\nexport function assertExternalOptimizerRunBinding<TPackage extends string>(args: {\n label: string\n runtime: ExternalOptimizerRuntimeIdentity<TPackage>\n returnedSource: ExternalOptimizerPackageSource<TPackage>\n compatibleRunId: string\n runId: string\n returnedRunId: string\n resume: ExternalOptimizerResumeMode\n resumed: boolean\n}): void {\n if (!isDeepStrictEqual(args.returnedSource, args.runtime.optimizer)) {\n throw new Error(`${args.label}: optimizer package changed after source inspection`)\n }\n if (args.returnedRunId !== args.runId) {\n throw new Error(`${args.label}: bridge returned a different run ID`)\n }\n if (args.resume === 'never' && args.resumed) {\n throw new Error(`${args.label}: fresh run reported restored state`)\n }\n if (args.resume === 'required' && !args.resumed) {\n throw new Error(`${args.label}: required resume did not restore state`)\n }\n if (!args.runId.startsWith(args.compatibleRunId)) {\n throw new Error(`${args.label}: run ID is not bound to its compatible identity`)\n }\n}\n\nfunction assertExternalOptimizerRuntimeIdentity<TPackage extends string>(\n value: unknown,\n expectedPackage: TPackage,\n label: string,\n): asserts value is ExternalOptimizerRuntimeIdentity<TPackage> {\n if (!isRecord(value)) {\n throw new Error(`${label}: source inspection returned no runtime identity`)\n }\n assertExternalOptimizerPackageSource(value.bridge, 'agent-eval-rpc', label, 'bridge')\n assertExternalOptimizerPackageSource(value.optimizer, expectedPackage, label, expectedPackage)\n if (!value.bridge.sourceSha256 || !value.optimizer.sourceSha256) {\n throw new Error(`${label}: source inspection omitted package source hashes`)\n }\n if (\n !isRecord(value.python) ||\n typeof value.python.implementation !== 'string' ||\n value.python.implementation.length === 0 ||\n value.python.implementation !== value.python.implementation.trim() ||\n typeof value.python.version !== 'string' ||\n value.python.version.length === 0 ||\n value.python.version !== value.python.version.trim()\n ) {\n throw new Error(`${label}: source inspection returned an invalid Python runtime`)\n }\n if (\n !Array.isArray(value.engineModules) ||\n value.engineModules.some(\n (module) =>\n !isRecord(module) ||\n typeof module.module !== 'string' ||\n module.module.length === 0 ||\n module.module !== module.module.trim() ||\n typeof module.sourceSha256 !== 'string' ||\n !/^[0-9a-f]{64}$/.test(module.sourceSha256),\n )\n ) {\n throw new Error(`${label}: source inspection returned invalid engine modules`)\n }\n}\n","import type { ExternalOptimizerTokenUsage } from './external-optimizer-accounting'\nimport { assertExternalOptimizerTokenUsage } from './external-optimizer-accounting'\nimport { type ExternalTextCandidate, isExternalTextCandidate } from './external-optimizer-process'\nimport {\n assertExternalOptimizerPackageSource,\n type ExternalOptimizerPackageSource,\n} from './external-optimizer-source'\nimport {\n assertGepaCandidatePopulationSummary,\n type GepaCandidatePopulationSummary,\n} from './gepa-candidate-population'\nimport type { GepaOptimizationRecipe } from './gepa-optimization-method'\n\nexport interface GepaBridgeOutput {\n bestCandidate: ExternalTextCandidate\n bestScore: number\n /** Evaluations the local callback metered — the trusted count. */\n totalEvaluations: number\n /**\n * Evaluation total GEPA reported from its own counters\n * (`total_evals`, falling back to `total_metric_calls`). A difference from\n * `totalEvaluations` means upstream skipped, cached, or double-counted work.\n */\n upstreamReportedEvaluations?: number\n recipeKind: GepaOptimizationRecipe['kind']\n proposerCostUsd?: number\n proposerCostAccounting?: 'metered' | 'reported' | 'unavailable'\n tokenUsage?: ExternalOptimizerTokenUsage\n upstream: ExternalOptimizerPackageSource<'gepa'>\n runId: string\n resumed: boolean\n /**\n * Whether the run seed reached every engine configuration in the recipe.\n * False when the recipe includes an agent engine, which accepts no seed.\n */\n seedApplied: boolean\n candidatePopulation?: GepaCandidatePopulationSummary\n}\n\nexport function assertGepaBridgeOutput(\n result: GepaBridgeOutput,\n name: string,\n maxCandidateChars: number,\n recipeKind: GepaOptimizationRecipe['kind'],\n maxEvaluations: number,\n maxPopulationCandidates: number,\n scenarioIds: readonly string[],\n expectsComponents: boolean,\n requiresCandidatePopulation: boolean,\n): asserts result is GepaBridgeOutput {\n if (result.recipeKind !== recipeKind) {\n throw new Error(`${name}: GEPA bridge reported recipe '${String(result.recipeKind)}'`)\n }\n if (\n !isGepaCandidate(result.bestCandidate, maxCandidateChars) ||\n expectsComponents !== (typeof result.bestCandidate !== 'string')\n ) {\n throw new Error(`${name}: GEPA bridge returned an invalid candidate`)\n }\n if (!Number.isFinite(result.bestScore)) {\n throw new Error(`${name}: GEPA bridge returned an invalid bestScore`)\n }\n if (\n !Number.isSafeInteger(result.totalEvaluations) ||\n result.totalEvaluations < 0 ||\n result.totalEvaluations > maxEvaluations\n ) {\n throw new Error(`${name}: GEPA bridge returned an invalid totalEvaluations`)\n }\n if (\n result.upstreamReportedEvaluations !== undefined &&\n (!Number.isSafeInteger(result.upstreamReportedEvaluations) ||\n result.upstreamReportedEvaluations < 0)\n ) {\n throw new Error(`${name}: GEPA bridge returned an invalid upstreamReportedEvaluations`)\n }\n if (\n result.proposerCostUsd !== undefined &&\n (!Number.isFinite(result.proposerCostUsd) || result.proposerCostUsd < 0)\n ) {\n throw new Error(`${name}: GEPA bridge returned an invalid proposerCostUsd`)\n }\n if (\n result.proposerCostAccounting !== 'metered' &&\n result.proposerCostAccounting !== 'reported' &&\n result.proposerCostAccounting !== 'unavailable'\n ) {\n throw new Error(`${name}: GEPA bridge returned invalid proposerCostAccounting`)\n }\n if (\n (result.proposerCostAccounting !== 'unavailable') !==\n (result.proposerCostUsd !== undefined)\n ) {\n throw new Error(`${name}: GEPA bridge returned inconsistent proposer cost accounting`)\n }\n assertExternalOptimizerTokenUsage(result.tokenUsage, name, 'GEPA')\n if (result.proposerCostAccounting === 'metered' && result.tokenUsage === undefined) {\n throw new Error(`${name}: metered GEPA bridge omitted tokenUsage`)\n }\n assertExternalOptimizerPackageSource(result.upstream, 'gepa', name, 'GEPA')\n if (\n typeof result.runId !== 'string' ||\n result.runId.length === 0 ||\n result.runId !== result.runId.trim()\n ) {\n throw new Error(`${name}: GEPA bridge returned an invalid runId`)\n }\n if (typeof result.resumed !== 'boolean') {\n throw new Error(`${name}: GEPA bridge returned an invalid resumed flag`)\n }\n if (typeof result.seedApplied !== 'boolean') {\n throw new Error(\n `${name}: GEPA bridge returned an invalid seedApplied flag; upgrade agent-eval-rpc to a release that forwards the run seed`,\n )\n }\n if (result.candidatePopulation !== undefined) {\n assertGepaCandidatePopulationSummary(result.candidatePopulation)\n if (result.candidatePopulation.runId !== result.runId) {\n throw new Error(`${name}: GEPA candidate population has a different run ID`)\n }\n if (\n result.candidatePopulation.maxCandidates !== maxPopulationCandidates ||\n result.candidatePopulation.maxCandidateChars !== maxCandidateChars ||\n result.candidatePopulation.surfaceKind !== (expectsComponents ? 'components' : 'text') ||\n result.candidatePopulation.scenarioIds.length !== scenarioIds.length ||\n result.candidatePopulation.scenarioIds.some(\n (scenarioId, index) => scenarioId !== scenarioIds[index],\n )\n ) {\n throw new Error(`${name}: GEPA candidate population differs from its configured bounds`)\n }\n } else if (requiresCandidatePopulation) {\n throw new Error(`${name}: GEPA bridge omitted the official candidate population`)\n }\n}\n\nfunction isGepaCandidate(value: unknown, maxChars: number): value is ExternalTextCandidate {\n if (!isExternalTextCandidate(value)) return false\n const size = typeof value === 'string' ? value.length : JSON.stringify(value).length\n return size <= maxChars\n}\n","/**\n * Import an external optimizer's own record into a search ledger.\n *\n * GEPA and SkillOpt search inside their own processes. The evaluation\n * callback's observation log holds every candidate either one evaluated, and\n * GEPA's candidate population also names each candidate's parents by index.\n * The importer turns both into ledger events: one node per distinct candidate,\n * one `correlated` edge per population entry (joined by content digest from\n * GEPA's own parent record), and one cell per evaluation. Nothing is inferred\n * from timing or order: a candidate with no parent record (every SkillOpt\n * candidate, and a candidate GEPA kept out of its population) has an `unknown`\n * edge and no parents.\n */\n\nimport { hashCanonical } from '../ledger-core/canonical'\nimport type { ExternalTextCandidate } from './external-optimizer-contracts'\nimport type { ExternalOptimizerObservationArtifact } from './external-optimizer-observations'\nimport type {\n GepaCandidatePopulationArtifact,\n GepaCandidatePopulationCandidate,\n} from './gepa-candidate-population'\nimport type { SearchHistoryReceipt } from './search-history-receipt'\nimport { openSearchLedger } from './search-ledger'\nimport {\n developmentClaim,\n type RegisterSearchNodeInput,\n SearchRecorder,\n type SearchRunIdentity,\n surfaceDiff,\n surfaceNode,\n} from './search-ledger-recording'\nimport type {\n SearchArtifactRef,\n SearchAttemptAccounting,\n SearchExecutionIdentity,\n SearchProposer,\n SearchSplit,\n SearchTask,\n SearchTaskOutcome,\n SearchUnknown,\n} from './search-ledger-types'\nimport type { CampaignStorage } from './storage'\nimport type { MutableSurface, Scenario } from './types'\n\n/** The external optimizers whose searches this module records. */\nexport type ExternalSearchOptimizer = 'GEPA' | 'SkillOpt'\n\nfunction noRationale(optimizer: ExternalSearchOptimizer): SearchUnknown {\n return {\n unknown: `${optimizer} records no rationale per candidate; its reflection attaches to the proposer operation`,\n }\n}\n\nconst NO_GEPA_RATIONALE = noRationale('GEPA')\n\nexport interface GepaPopulationImport {\n /** Population index to node id. */\n nodeIds: ReadonlyMap<number, string>\n /** Distinct nodes the population maps to. */\n nodes: number\n edges: number\n /** Population entries whose content equals an earlier entry's: one node, a second edge. */\n collapsedDuplicates: number\n /** Proposals whose content equals their own parent, which no edge can express. */\n unchangedProposals: number\n}\n\n/**\n * Register GEPA's population as nodes and its parent indices as `correlated`\n * edges. A parentless entry (GEPA's seed) gets a seed edge unless its node is\n * already in the tree, for example the root the caller seeded.\n */\nexport async function importGepaPopulation(input: {\n recorder: SearchRecorder\n population: GepaCandidatePopulationArtifact\n proposer: SearchProposer\n /** How a candidate becomes a node. Default: its text or component surface. */\n node?: (candidate: GepaCandidatePopulationCandidate) => RegisterSearchNodeInput\n /** How a parent-to-child diff is stored. Default: the surface diff. */\n diff?: (\n parent: GepaCandidatePopulationCandidate,\n child: GepaCandidatePopulationCandidate,\n ) => SearchArtifactRef | SearchUnknown\n}): Promise<GepaPopulationImport> {\n const { recorder, population } = input\n const node =\n input.node ?? ((candidate) => surfaceNode(recorder, externalSurface(candidate.candidate)))\n const diff =\n input.diff ??\n ((parent, child) =>\n surfaceDiff(recorder, externalSurface(parent.candidate), externalSurface(child.candidate)))\n const nodeIds = new Map<number, string>()\n const byIndex = new Map(population.candidates.map((candidate) => [candidate.index, candidate]))\n const seenNodes = new Set<string>()\n let edges = 0\n let collapsedDuplicates = 0\n let unchangedProposals = 0\n for (const candidate of population.candidates) {\n const { nodeId } = await recorder.registerNode(node(candidate))\n if (seenNodes.has(nodeId)) collapsedDuplicates += 1\n seenNodes.add(nodeId)\n nodeIds.set(candidate.index, nodeId)\n\n const parentIndices = [\n ...new Set(candidate.parentIndices.filter((index): index is number => index !== null)),\n ]\n const parents: Array<{ nodeId: string; candidate: GepaCandidatePopulationCandidate }> = []\n for (const index of parentIndices) {\n const parentNodeId = nodeIds.get(index)\n const parent = byIndex.get(index)\n if (parentNodeId === undefined || parent === undefined) {\n throw new Error(\n `GEPA candidate ${candidate.index} names parent ${index}, which precedes no population entry`,\n )\n }\n if (parentNodeId === nodeId) continue\n if (!parents.some((known) => known.nodeId === parentNodeId)) {\n parents.push({ nodeId: parentNodeId, candidate: parent })\n }\n }\n if (parentIndices.length > 0 && parents.length === 0) {\n unchangedProposals += 1\n continue\n }\n if (parents.length === 0) {\n const state = await recorder.state()\n if ((state.node(nodeId)?.edgeIds.length ?? 0) > 0) continue\n await recorder.recordEdge({\n childNodeId: nodeId,\n parents: [],\n operator: 'seed',\n attribution: 'correlated',\n proposer: null,\n proposalKey: `gepa:${population.runId}:${candidate.index}`,\n rationale: NO_GEPA_RATIONALE,\n diffs: [],\n label: `GEPA seed candidate ${candidate.index}`,\n })\n edges += 1\n continue\n }\n await recorder.recordEdge({\n childNodeId: nodeId,\n parents: parents.map((parent) => parent.nodeId),\n operator: parents.length > 1 ? 'merge' : 'improve',\n attribution: 'correlated',\n proposer: input.proposer,\n proposalKey: `gepa:${population.runId}:${candidate.index}`,\n rationale: NO_GEPA_RATIONALE,\n diffs: parents.map((parent) => diff(parent.candidate, candidate)),\n label: `GEPA candidate ${candidate.index}`,\n })\n edges += 1\n }\n return { nodeIds, nodes: seenNodes.size, edges, collapsedDuplicates, unchangedProposals }\n}\n\nexport interface GepaEvaluationImport {\n cells: number\n /** Nodes of candidates GEPA evaluated but kept out of its population. */\n unrecordedParentNodeIds: string[]\n}\n\n/**\n * Record every evaluation in the callback's observation log as an `external`\n * cell attempt. A candidate that is not yet a node (GEPA evaluated it on a\n * minibatch and discarded it, or SkillOpt, which reports no parents, proposed\n * it) is registered with an `unknown` edge.\n */\nexport async function importExternalEvaluations(input: {\n recorder: SearchRecorder\n observations: ExternalOptimizerObservationArtifact\n proposer: SearchProposer\n identity: SearchExecutionIdentity\n /** The split each evaluated example belongs to. */\n splitOf: (exampleId: string) => SearchSplit\n /** The optimizer that proposed the candidates. Default GEPA. */\n optimizer?: ExternalSearchOptimizer\n}): Promise<GepaEvaluationImport> {\n const { recorder } = input\n const optimizer = input.optimizer ?? 'GEPA'\n const reps = new Map<string, number>()\n const unrecorded: string[] = []\n let cells = 0\n for (const observation of input.observations.observations) {\n // A failed evaluation is logged as a refusal, but it ran and consumed an\n // evaluation, so it is an unscored cell. Other refusals never ran.\n const ran =\n observation.kind === 'evaluation' ||\n (observation.kind === 'refusal' && observation.reason === 'evaluation-failed')\n if (!ran || observation.candidate === undefined || observation.exampleId === undefined) continue\n const candidateHash = observation.candidateHash!\n const surface = externalSurface(observation.candidate)\n const registered = await recorder.registerNode(surfaceNode(recorder, surface))\n const state = await recorder.state()\n if ((state.node(registered.nodeId)?.edgeIds.length ?? 0) === 0) {\n await recorder.recordEdge({\n childNodeId: registered.nodeId,\n parents: [],\n operator: 'improve',\n attribution: 'unknown',\n proposer: input.proposer,\n proposalKey: `${optimizer.toLowerCase()}-evaluated:${candidateHash}`,\n rationale: noRationale(optimizer),\n diffs: [],\n label:\n optimizer === 'GEPA'\n ? 'GEPA proposal outside its population'\n : `${optimizer} proposal without a parent record`,\n })\n unrecorded.push(registered.nodeId)\n }\n const split = input.splitOf(observation.exampleId)\n const repKey = `${registered.nodeId}\\u0000${observation.exampleId}`\n const rep = reps.get(repKey) ?? 0\n reps.set(repKey, rep + 1)\n const cellId = await recorder.allocateCell({\n nodeId: registered.nodeId,\n taskId: observation.exampleId,\n split,\n rep,\n stage: 'external',\n })\n await recorder.settleCell({\n cellId,\n attempt: 1,\n outcome:\n observation.kind === 'evaluation'\n ? evaluationOutcome(observation.response)\n : {\n status: 'errored',\n metrics: {},\n error: {\n code: 'evaluation-failed',\n message: 'the evaluation callback failed before a score',\n retryable: false,\n },\n },\n accounting: {\n tokens: { status: 'unknown', reason: 'the evaluation callback meters tokens per run' },\n cost: {\n status: 'unknown',\n knownLowerBoundUsd: 0,\n reason: 'the evaluation callback meters cost per run, not per evaluation',\n },\n },\n identity: input.identity,\n })\n cells += 1\n }\n return { cells, unrecordedParentNodeIds: unrecorded }\n}\n\n/** GEPA's callback response. A `failed` evaluation carries a penalty score for\n * the optimizer that is not a measurement, so the cell is unscored. */\nfunction evaluationOutcome(response: unknown): SearchTaskOutcome {\n const record = (response ?? {}) as {\n score?: unknown\n info?: { status?: unknown; notes?: unknown }\n }\n if (\n record.info?.status === 'scored' &&\n typeof record.score === 'number' &&\n Number.isFinite(record.score)\n ) {\n return { status: 'passed', score: record.score, metrics: { score: record.score } }\n }\n return {\n status: 'errored',\n metrics: {},\n error: {\n code: 'evaluation-failed',\n message:\n typeof record.info?.notes === 'string' && record.info.notes.trim().length > 0\n ? record.info.notes.trim()\n : 'the evaluation produced no score',\n retryable: false,\n },\n }\n}\n\n/** An optimizer candidate as the mutable surface it represents. */\nexport function externalSurface(candidate: ExternalTextCandidate): MutableSurface {\n return typeof candidate === 'string' ? candidate : { kind: 'components', components: candidate }\n}\n\n/** What `recordGepaSearch` and `recordSkillOptSearch` share. */\ninterface ExternalSearchRecordInput {\n name: string\n path: string\n searchId: string\n identity: SearchRunIdentity\n storage: CampaignStorage\n seed: number\n baselineSurface: MutableSurface\n trainScenarios: readonly Scenario[]\n selectionScenarios: readonly Scenario[]\n evaluationLimit: number\n observations: ExternalOptimizerObservationArtifact\n generationAccounting: SearchAttemptAccounting\n}\n\n/**\n * Write GEPA's finished search into its ledger: the baseline as the seeded\n * root, the population as nodes with `correlated` edges, every callback\n * evaluation as an `external` cell, GEPA's proposer spend as one operation,\n * GEPA's choice as the selected node, and the close. GEPA's own selection is a\n * budget decision, so the ledger carries no claim; the final comparison runs\n * outside this search.\n *\n * A composed recipe reports no population: pass `population: null` and GEPA's\n * returned best as `selected`, and every evaluated candidate enters with an\n * `unknown` edge, as SkillOpt's do.\n */\nexport async function recordGepaSearch(\n input: ExternalSearchRecordInput &\n (\n | { population: GepaCandidatePopulationArtifact }\n | { population: null; selected: MutableSurface }\n ),\n): Promise<SearchHistoryReceipt> {\n if (input.population === null) return recordExternalSearch({ ...input, optimizer: 'GEPA' })\n const { population } = input\n const best = population.candidates.find((candidate) => candidate.index === population.bestIndex)\n if (!best) {\n throw new Error(`GEPA candidate population has no bestIndex entry ${population.bestIndex}`)\n }\n return recordExternalSearch({\n ...input,\n population,\n optimizer: 'GEPA',\n selected: externalSurface(best.candidate),\n })\n}\n\n/**\n * Write SkillOpt's finished search into its ledger: the baseline as the seeded\n * root, every candidate SkillOpt evaluated as a node with an `unknown` edge\n * (SkillOpt reports no parents), every callback evaluation as an `external`\n * cell, SkillOpt's optimizer spend as one operation, SkillOpt's choice as the\n * selected node, and the close. Like GEPA's, the ledger carries no claim.\n */\nexport async function recordSkillOptSearch(\n input: ExternalSearchRecordInput & { selected: MutableSurface },\n): Promise<SearchHistoryReceipt> {\n return recordExternalSearch({ ...input, optimizer: 'SkillOpt', population: null })\n}\n\nasync function recordExternalSearch(\n input: ExternalSearchRecordInput & {\n optimizer: ExternalSearchOptimizer\n population: GepaCandidatePopulationArtifact | null\n /** The surface the optimizer chose. */\n selected: MutableSurface\n },\n): Promise<SearchHistoryReceipt> {\n const { identity, population, optimizer } = input\n const policyName = optimizer.toLowerCase()\n const tasks = (scenarios: readonly Scenario[]): SearchTask[] =>\n scenarios.map((scenario) => ({\n taskId: scenario.id,\n unitId: scenario.id,\n source: { uri: `scenario://${scenario.id}`, revision: hashCanonical(scenario) },\n }))\n const train = tasks(input.trainScenarios)\n const selection = tasks(input.selectionScenarios)\n const taskSet = hashCanonical({ train, selection })\n const recorder = await SearchRecorder.open(\n {\n ledger: openSearchLedger({ path: input.path, searchId: input.searchId }),\n storage: input.storage,\n },\n {\n subject: identity.subject ?? input.name,\n process: { name: input.name, executionRef: identity.search },\n artifactKind: 'prompt',\n objective: {\n metric: 'score',\n direction: 'maximize',\n judge: identity.judge ?? {\n unknown:\n 'the evaluation callback judges through caller functions without a pinned source',\n },\n claim: identity.claim ?? developmentClaim(taskSet),\n },\n splits: { train, selection, test: [], heldOutUnits: true },\n policy: { expansion: policyName, allocation: policyName, seed: input.seed },\n budget: {\n maxUsd: null,\n maxCells: input.evaluationLimit,\n maxNodes: null,\n deadline: null,\n maxConcurrency: null,\n reservedClaimUsd: 0,\n },\n containment: null,\n derivedFrom: null,\n identity: {\n model: identity.model,\n agent: identity.agent,\n benchmark: { uri: `optimizer://${input.name}`, revision: taskSet },\n },\n },\n )\n const root = await recorder.registerNode(surfaceNode(recorder, input.baselineSurface))\n await recorder.recordEdge({\n childNodeId: root.nodeId,\n parents: [],\n operator: 'seed',\n attribution: 'explicit',\n proposer: null,\n proposalKey: 'baseline',\n rationale: { unknown: 'the baseline is the caller-supplied starting surface' },\n diffs: [],\n label: 'baseline',\n })\n const operationId = `${policyName}-proposals`\n await recorder.startOperation({ operationId, operationKind: 'candidate-generation' })\n const proposer = {\n kind: 'optimizer' as const,\n name: input.name,\n operationId,\n source: identity.proposer.source,\n }\n if (population) await importGepaPopulation({ recorder, population, proposer })\n const trainIds = new Set(train.map((task) => task.taskId))\n const evaluations = await importExternalEvaluations({\n recorder,\n observations: input.observations,\n proposer,\n identity: {\n model: identity.model,\n agent: identity.agent,\n benchmark: { uri: `optimizer://${input.name}`, revision: taskSet },\n },\n splitOf: (exampleId) => (trainIds.has(exampleId) ? 'train' : 'selection'),\n optimizer,\n })\n // The optimizer's choice is a node unless no evaluation ever reached it.\n const chosen = await recorder.registerNode(surfaceNode(recorder, input.selected))\n if (((await recorder.state()).node(chosen.nodeId)?.edgeIds.length ?? 0) === 0) {\n await recorder.recordEdge({\n childNodeId: chosen.nodeId,\n parents: [],\n operator: 'improve',\n attribution: 'unknown',\n proposer,\n proposalKey: `${policyName}-selected`,\n rationale: noRationale(optimizer),\n diffs: [],\n label: `${optimizer} choice without an evaluation`,\n })\n }\n await recorder.recordOperation({\n operationId,\n operationKind: 'candidate-generation',\n execution: identity.proposer,\n outcome: { status: 'completed' },\n accounting: input.generationAccounting,\n })\n // Read everything the decisions need before the first decision moves the ledger.\n const state = await recorder.state()\n const nodes = state.nodes()\n const best = chosen.nodeId\n const bestScored = state.cells({ nodeId: best }).some((cell) => cell.score !== null)\n // GEPA chooses by its aggregate selection score; SkillOpt by its own validation.\n const rule = population ? 'gepa-best-aggregate' : `${policyName}-choice`\n const basis = population ? 'its aggregate selection score' : 'its own validation'\n for (const node of nodes) {\n if (node.nodeId === best && bestScored) {\n await recorder.decideNode({\n nodeId: node.nodeId,\n decision: { status: 'selected' },\n rule,\n reason: `${optimizer} chose this candidate by ${basis}`,\n })\n } else if (population && evaluations.unrecordedParentNodeIds.includes(node.nodeId)) {\n await recorder.decideNode({\n nodeId: node.nodeId,\n decision: { status: 'pruned' },\n rule: 'gepa-population',\n reason: 'GEPA evaluated the candidate and kept it out of its population',\n })\n } else {\n await recorder.decideNode({\n nodeId: node.nodeId,\n decision: node.nodeId === best ? { status: 'invalid' } : { status: 'rejected' },\n rule,\n reason:\n node.nodeId === best\n ? `${optimizer} chose this candidate, but no evaluation of it was scored`\n : `${optimizer} chose another candidate`,\n })\n }\n }\n await recorder.close({ reason: 'budget', claim: null })\n return recorder.receipt({ producerId: input.name, runId: input.searchId })\n}\n","import { randomBytes } from 'node:crypto'\nimport { mkdir } from 'node:fs/promises'\nimport { contentHash } from '../verdict-cache'\nimport {\n assertExternalOptimizerCompletionCount,\n assertPriorExternalOptimizerUsage,\n} from './external-optimizer-accounting'\nimport {\n openExternalOptimizerExecutionLog,\n openExternalOptimizerObservationLog,\n readExternalOptimizerObservationArtifact,\n} from './external-optimizer-observations'\nimport {\n closeExternalOptimizerResources,\n type ExternalOptimizerModelProxy,\n removeCredentialEnvironment,\n resolveExternalOptimizerCallbackLimits,\n runExternalOptimizerProcess,\n runWithCleanup,\n startExternalOptimizerCallback,\n startExternalOptimizerModelProxy,\n} from './external-optimizer-process'\nimport {\n externalOptimizerCompatibleRunKey,\n externalOptimizerRunKey,\n openExternalOptimizerRunBudget,\n} from './external-optimizer-run-budget'\nimport { externalOptimizerRunnerIdentity, snapshotJson } from './external-optimizer-run-config'\nimport {\n assertExternalOptimizerRunBinding,\n inspectExternalOptimizerRuntime,\n observedExternalOptimizerRuntime,\n} from './external-optimizer-runtime'\nimport {\n createExternalTextEvaluator,\n decodeExternalTextCandidate,\n describeExternalScenario,\n type ExternalOptimizationExample,\n encodeExternalTextCandidate,\n mapExternalScenarios,\n} from './external-text-optimization'\nimport { readGepaCandidatePopulationArtifact } from './gepa-candidate-population'\nimport {\n assertGepaComponentRecipe,\n GEPA_DEFAULT_MAX_CANDIDATE_CHARS,\n GEPA_DEFAULT_MAX_EVIDENCE_CHARS,\n GEPA_DEFAULT_TIMEOUT_MS,\n gepaRecipeEvaluationLimit,\n gepaRecipeHasAgentCliEngine,\n gepaRecipeSupportsResume,\n} from './gepa-optimization-config'\nimport type { GepaOptimizationMethodConfig, GepaRunnerCommand } from './gepa-optimization-method'\nimport { assertGepaBridgeOutput, type GepaBridgeOutput } from './gepa-optimization-result'\nimport { recordGepaSearch } from './gepa-search-import'\nimport {\n combineComparisonCosts,\n costFromLedgerSummary,\n optimizationTokenUsageFromSummary,\n} from './optimization-cost'\nimport type { OptimizationMethodInput, OptimizationMethodResult } from './optimization-method'\nimport type { OpenAICompatibleOptimizerModel } from './optimizer-model'\nimport type { SearchHistoryReceipt } from './search-history-receipt'\nimport type { SearchAttemptAccounting } from './search-ledger'\nimport { fsCampaignStorage } from './storage'\nimport type { Scenario } from './types'\n\nfunction anthropicShimEnvironment(\n proxy: Pick<ExternalOptimizerModelProxy, 'baseUrl' | 'apiKey'>,\n optimizer: OpenAICompatibleOptimizerModel,\n): Record<string, string> {\n return {\n // The Anthropic SDK appends /v1/messages itself; inject the origin.\n ANTHROPIC_BASE_URL: new URL(proxy.baseUrl).origin,\n ANTHROPIC_AUTH_TOKEN: proxy.apiKey,\n ANTHROPIC_MODEL: optimizer.model,\n // Background haiku-class calls must carry the one admitted model id.\n ANTHROPIC_SMALL_FAST_MODEL: optimizer.model,\n CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC: '1',\n // The proxy refuses thinking requests; adaptive thinking stays off.\n CLAUDE_CODE_DISABLE_ADAPTIVE_THINKING: '1',\n // Align the CLI's requested max_tokens with the per-request cap. The\n // engines only setdefault this variable, so the injected value wins.\n CLAUDE_CODE_MAX_OUTPUT_TOKENS: String(\n Math.min(optimizer.budget.maxOutputTokensPerRequest, 64_000),\n ),\n // The synthesized SSE sends its first byte after the owner call\n // completes; keep the CLI deadline above the proxy's request deadline.\n API_TIMEOUT_MS: String((optimizer.budget.requestTimeoutMs ?? 300_000) + 60_000),\n }\n}\n\n/** Spend the optimizer booked to its own candidate generation. Unknown stays\n * unknown: the bridge reports proposer cost only when the engine measured it. */\nfunction optimizerAccounting(\n tokenUsage: { inputTokens?: number; outputTokens?: number } | undefined,\n proposerCostUsd: number | undefined,\n): SearchAttemptAccounting {\n return {\n tokens:\n tokenUsage?.inputTokens === undefined || tokenUsage.outputTokens === undefined\n ? { status: 'unknown', reason: 'the optimizer bridge reported no token usage' }\n : {\n status: 'known',\n inputTokens: tokenUsage.inputTokens,\n outputTokens: tokenUsage.outputTokens,\n cachedTokens: 0,\n },\n cost:\n proposerCostUsd === undefined\n ? {\n status: 'unknown',\n knownLowerBoundUsd: 0,\n reason: 'the optimizer bridge reported no proposer cost',\n }\n : { status: 'known', usd: proposerCostUsd, source: 'provider' },\n }\n}\n\n/** What the GEPA run key is hashed over; fields added later join only when enabled so earlier run keys keep their identity. */\nfunction gepaRunMaterial<TScenario extends Scenario, TArtifact>(\n config: GepaOptimizationMethodConfig<TScenario, TArtifact>,\n input: OptimizationMethodInput<TScenario, TArtifact>,\n parts: {\n name: string\n runtimeIdentity: Awaited<ReturnType<typeof inspectExternalOptimizerRuntime>>\n bridgeRunner: GepaOptimizationMethodConfig<TScenario, TArtifact>['runner']\n seedCandidate: ReturnType<typeof encodeExternalTextCandidate>\n trainSet: readonly ExternalOptimizationExample[]\n selectionSet: readonly ExternalOptimizationExample[]\n maxCandidateChars: number\n maxPopulationCandidates: number\n maxEvidenceChars: number\n },\n) {\n const {\n name,\n runtimeIdentity,\n bridgeRunner,\n seedCandidate,\n trainSet,\n selectionSet,\n maxCandidateChars,\n maxPopulationCandidates,\n maxEvidenceChars,\n } = parts\n return {\n optimizer: 'gepa',\n runtime: runtimeIdentity,\n method: name,\n evaluationId: config.evaluationId,\n dispatchRef: input.runOptions.dispatchRef ?? null,\n seed: input.seed,\n recipe: snapshotJson(config.recipe, 'GEPA run settings'),\n engineModules: config.engineModules ?? [],\n objective: config.objective,\n background: config.background ?? '',\n seedCandidate,\n trainSet,\n selectionSet,\n maxCandidateChars,\n maxPopulationCandidates,\n maxEvidenceChars,\n evaluationCallbackLimits: resolveExternalOptimizerCallbackLimits(\n config.evaluationCallbackLimits,\n ),\n optimizerModel: config.optimizer\n ? {\n model: config.optimizer.model,\n callRef: config.optimizer.callRef,\n budget: config.optimizer.budget,\n // Included only when enabled so pre-existing run keys keep\n // their identity.\n ...(config.optimizer.anthropicEndpoint === true ? { anthropicEndpoint: true } : {}),\n }\n : null,\n runner: externalOptimizerRunnerIdentity(bridgeRunner, 'agent_eval_rpc.gepa_bridge'),\n trustResumeState: config.trustResumeState === true,\n }\n}\n\n/** Starts the callback server the GEPA bridge calls back into: evaluations are counted against the run budget and observed into the log. */\nasync function startGepaCallback<TScenario extends Scenario, TArtifact>(\n config: GepaOptimizationMethodConfig<TScenario, TArtifact>,\n input: OptimizationMethodInput<TScenario, TArtifact>,\n parts: {\n runDir: string\n runId: string\n runBudget: ReturnType<typeof openExternalOptimizerRunBudget>\n observationLog: ReturnType<typeof openExternalOptimizerObservationLog>\n evaluationLimit: number\n maxCandidateChars: number\n maxEvidenceChars: number\n },\n) {\n const {\n runDir,\n runId,\n runBudget,\n observationLog,\n evaluationLimit,\n maxCandidateChars,\n maxEvidenceChars,\n } = parts\n const signal = input.runOptions.signal\n const scenarioById = mapExternalScenarios(\n input.trainScenarios,\n input.selectionScenarios,\n 'GEPA bridge',\n )\n const evaluate = createExternalTextEvaluator({\n input,\n label: 'GEPA bridge',\n runDir,\n compatibleRunId: runId,\n costPhase: 'gepa.external-evaluation',\n costTags: runBudget.attemptTags,\n costLedger: input.costLedger,\n scenarioById,\n maxCandidateChars,\n maxEvidenceChars,\n describeArtifact: config.describeArtifact,\n })\n let attemptEvaluationCount = 0\n return startExternalOptimizerCallback({\n token: randomBytes(32).toString('hex'),\n maxEvaluations: evaluationLimit,\n acceptEvaluation: () => {\n const accepted = runBudget.acceptEvaluation()\n if (accepted === undefined) return undefined\n attemptEvaluationCount += 1\n return attemptEvaluationCount\n },\n evaluate,\n observe: observationLog.observe,\n ...(config.evaluationCallbackLimits ? { limits: config.evaluationCallbackLimits } : {}),\n ...(signal ? { signal } : {}),\n })\n}\n\n/** The settled inputs of one GEPA run: its identity, budgets, evaluation callback and logs. */\nexport async function prepareGepaRun<TScenario extends Scenario, TArtifact>(\n config: GepaOptimizationMethodConfig<TScenario, TArtifact>,\n input: OptimizationMethodInput<TScenario, TArtifact>,\n name: string,\n) {\n const signal = input.runOptions.signal\n signal?.throwIfAborted()\n if (typeof input.baselineSurface !== 'string' && input.baselineSurface.kind !== 'components') {\n throw new Error(`${name}: GEPA bridge supports text and component surfaces`)\n }\n const expectsComponents = typeof input.baselineSurface !== 'string'\n if (expectsComponents) {\n assertGepaComponentRecipe(config.recipe, name)\n }\n\n const started = Date.now()\n const maxCandidateChars = config.maxCandidateChars ?? GEPA_DEFAULT_MAX_CANDIDATE_CHARS\n const maxEvidenceChars = config.maxEvidenceChars ?? GEPA_DEFAULT_MAX_EVIDENCE_CHARS\n const timeoutMs = config.timeoutMs ?? GEPA_DEFAULT_TIMEOUT_MS\n const storage = input.runOptions.storage ?? fsCampaignStorage()\n const runDir = `${input.runDir}/gepa`\n storage.ensureDir(runDir)\n const costLedger = input.costLedger\n const attemptId = randomBytes(16).toString('hex')\n const resume = config.resume ?? 'never'\n const bridgeRunner =\n config.optimizer && config.runner\n ? {\n ...config.runner,\n env: removeCredentialEnvironment(config.runner.env ?? {}),\n }\n : config.runner\n const runtimeIdentity = await inspectExternalOptimizerRuntime({\n label: name,\n package: 'gepa',\n module: 'agent_eval_rpc.gepa_bridge',\n engineModules: config.engineModules,\n ...(bridgeRunner ? { runner: bridgeRunner } : {}),\n timeoutMs,\n ...(signal ? { signal } : {}),\n })\n const seedCandidate = encodeExternalTextCandidate(input.baselineSurface)\n const trainSet = input.trainScenarios.map((scenario) =>\n describeExternalScenario(scenario, 'GEPA', maxEvidenceChars, config.describeScenario),\n )\n const selectionSet = input.selectionScenarios.map((scenario) =>\n describeExternalScenario(scenario, 'GEPA', maxEvidenceChars, config.describeScenario),\n )\n const evaluationLimit = gepaRecipeEvaluationLimit(config.recipe, input.selectionScenarios.length)\n const maxPopulationCandidates = Math.min(Number.MAX_SAFE_INTEGER, evaluationLimit + 1)\n const populationScenarioIds = (selectionSet.length > 0 ? selectionSet : trainSet).map(\n (scenario) => scenario.id,\n )\n const runMaterial = gepaRunMaterial(config, input, {\n name,\n runtimeIdentity,\n bridgeRunner,\n seedCandidate,\n trainSet,\n selectionSet,\n maxCandidateChars,\n maxPopulationCandidates,\n maxEvidenceChars,\n })\n const compatibleRunId = externalOptimizerCompatibleRunKey(runMaterial)\n const runId = externalOptimizerRunKey({\n material: runMaterial,\n attemptId,\n resumeEnabled: resume !== 'never' && gepaRecipeSupportsResume(config.recipe),\n })\n const runBudget = openExternalOptimizerRunBudget({\n storage,\n runDir,\n runKey: runId,\n attemptId,\n maxEvaluations: evaluationLimit,\n })\n const observationLog = openExternalOptimizerObservationLog({\n storage,\n path: `${runDir}/observations-${attemptId}.jsonl`,\n })\n const executionLog = config.optimizer\n ? openExternalOptimizerExecutionLog({\n storage,\n path: `${runDir}/model-executions-${attemptId}.jsonl`,\n })\n : undefined\n const callback = await startGepaCallback(config, input, {\n runDir,\n runId,\n runBudget,\n observationLog,\n evaluationLimit,\n maxCandidateChars,\n maxEvidenceChars,\n })\n\n return {\n signal,\n expectsComponents,\n started,\n maxCandidateChars,\n maxEvidenceChars,\n timeoutMs,\n storage,\n runDir,\n costLedger,\n attemptId,\n resume,\n bridgeRunner,\n runtimeIdentity,\n seedCandidate,\n trainSet,\n selectionSet,\n evaluationLimit,\n maxPopulationCandidates,\n populationScenarioIds,\n compatibleRunId,\n runId,\n runBudget,\n observationLog,\n executionLog,\n callback,\n name,\n config,\n input,\n }\n}\n\nexport type GepaRun<TScenario extends Scenario, TArtifact> = Awaited<\n ReturnType<typeof prepareGepaRun<TScenario, TArtifact>>\n>\n\n/** Start the optimizer model proxy when one is configured, run the GEPA bridge, and release the resources either way. */\nexport async function runBridge<TScenario extends Scenario, TArtifact>(\n ctx: GepaRun<TScenario, TArtifact>,\n) {\n const {\n signal,\n maxCandidateChars,\n maxEvidenceChars,\n timeoutMs,\n runDir,\n costLedger,\n attemptId,\n resume,\n bridgeRunner,\n runtimeIdentity,\n seedCandidate,\n trainSet,\n selectionSet,\n maxPopulationCandidates,\n compatibleRunId,\n runId,\n runBudget,\n executionLog,\n callback,\n name,\n config,\n input,\n } = ctx\n const runnerEnv = bridgeRunner?.env ?? {}\n let modelProxy: ExternalOptimizerModelProxy | undefined\n // Injected at spawn time only, after the run keys are computed, so the\n // per-run port and ephemeral token never enter run identity.\n const bridgeRunnerForSpawn = (): GepaRunnerCommand | undefined => {\n if (!modelProxy) return bridgeRunner\n const anthropicChildEnv =\n config.optimizer?.anthropicEndpoint === true && gepaRecipeHasAgentCliEngine(config.recipe)\n ? anthropicShimEnvironment(modelProxy, config.optimizer)\n : undefined\n if (!bridgeRunner && !anthropicChildEnv) return bridgeRunner\n return {\n ...(bridgeRunner ?? {}),\n env: {\n ...removeCredentialEnvironment(runnerEnv),\n ...(anthropicChildEnv ?? {}),\n },\n }\n }\n const closeResources = () =>\n closeExternalOptimizerResources({\n label: name,\n callback,\n ...(modelProxy ? { modelProxy } : {}),\n })\n const { result, outputDir } = await runWithCleanup({\n label: `${name} optimizer resources`,\n run: async () => {\n if (config.optimizer) {\n const priorOptimizerUsage = costLedger.summary({\n phase: 'gepa.optimizer-model',\n tags: runBudget.runTags,\n })\n assertPriorExternalOptimizerUsage(priorOptimizerUsage, config.optimizer.budget, name)\n modelProxy = await startExternalOptimizerModelProxy({\n call: config.optimizer.call,\n callRef: config.optimizer.callRef,\n recordExecution: executionLog!.observe,\n model: config.optimizer.model,\n budget: config.optimizer.budget,\n ...(config.optimizer.servedModelPolicy\n ? { servedModelPolicy: config.optimizer.servedModelPolicy }\n : {}),\n ...(config.optimizer.anthropicEndpoint === true ? { anthropicEndpoint: true } : {}),\n costLedger,\n phase: 'gepa.optimizer-model',\n actor: name,\n tags: { ...runBudget.attemptTags },\n initialUsage: {\n requests: priorOptimizerUsage.totalCalls,\n ...(priorOptimizerUsage.costProvenance.kind === 'uncaptured'\n ? {}\n : { costUsd: priorOptimizerUsage.totalCostUsd }),\n },\n ...(signal ? { signal } : {}),\n })\n }\n const outputDir = `${runDir}/external`\n await mkdir(outputDir, { recursive: true })\n const result = await runExternalOptimizerProcess<GepaBridgeOutput>({\n label: 'GEPA bridge',\n tempPrefix: 'agent-eval-gepa-',\n module: 'agent_eval_rpc.gepa_bridge',\n input: {\n attemptId,\n compatibleRunId,\n runId,\n runtimeIdentity,\n resume,\n trustedResumeState: config.trustResumeState === true,\n evaluationId: config.evaluationId,\n seed: input.seed,\n callbackUrl: callback.url,\n callbackToken: callback.token,\n timeoutMs,\n engineModules: config.engineModules ?? [],\n recipe: config.recipe,\n objective: config.objective,\n ...(config.background ? { background: config.background } : {}),\n seedCandidate,\n trainSet,\n selectionSet,\n maxCandidateChars,\n maxPopulationCandidates,\n maxEvidenceChars,\n outputDir,\n ...(modelProxy && config.optimizer\n ? {\n modelProxy: {\n baseUrl: modelProxy.baseUrl,\n apiKey: modelProxy.apiKey,\n model: config.optimizer.model,\n budget: config.optimizer.budget,\n ...(config.optimizer.anthropicEndpoint === true\n ? { anthropicEndpoint: true }\n : {}),\n },\n }\n : {}),\n },\n runner: bridgeRunnerForSpawn(),\n timeoutMs,\n ...(signal ? { signal } : {}),\n })\n return { result, outputDir }\n },\n cleanup: closeResources,\n })\n return { result, outputDir, modelProxy }\n}\n\n/** Check the bridge output against the run it was started for, and return the candidate population it reports. */\nexport function verifyBridgeResult<TScenario extends Scenario, TArtifact>(\n ctx: GepaRun<TScenario, TArtifact>,\n result: GepaBridgeOutput,\n): ReturnType<typeof readGepaCandidatePopulationArtifact> | null {\n const {\n signal,\n expectsComponents,\n maxCandidateChars,\n storage,\n resume,\n runtimeIdentity,\n evaluationLimit,\n maxPopulationCandidates,\n populationScenarioIds,\n compatibleRunId,\n runId,\n callback,\n name,\n config,\n } = ctx\n signal?.throwIfAborted()\n assertGepaBridgeOutput(\n result,\n name,\n maxCandidateChars,\n config.recipe.kind,\n evaluationLimit,\n maxPopulationCandidates,\n populationScenarioIds,\n expectsComponents,\n config.recipe.kind === 'engine' && config.recipe.run.engine === 'gepa',\n )\n assertExternalOptimizerRunBinding({\n label: name,\n runtime: runtimeIdentity,\n returnedSource: result.upstream,\n compatibleRunId,\n runId,\n returnedRunId: result.runId,\n resume,\n resumed: result.resumed,\n })\n if (callback.evaluations() !== result.totalEvaluations) {\n throw new Error(\n `${name}: GEPA reported ${result.totalEvaluations} evaluations but the callback received ${callback.evaluations()}`,\n )\n }\n const population = result.candidatePopulation\n ? readGepaCandidatePopulationArtifact({ summary: result.candidatePopulation, storage })\n : null\n if (population) {\n const selected = population.candidates[population.bestIndex]\n const selectedHash = contentHash({\n kind: 'external-text-candidate',\n candidate: result.bestCandidate,\n })\n if (selected?.candidateHash !== selectedHash) {\n throw new Error(`${name}: GEPA candidate population identifies a different winner`)\n }\n }\n return population\n}\n\n/** Every recipe records its search in the search ledger when one is configured. */\nexport async function recordGepaSearchHistory<TScenario extends Scenario, TArtifact>(\n ctx: GepaRun<TScenario, TArtifact>,\n result: GepaBridgeOutput,\n population: ReturnType<typeof readGepaCandidatePopulationArtifact> | null,\n): Promise<SearchHistoryReceipt | undefined> {\n const { storage, runDir, evaluationLimit, runId, observationLog, name, config, input } = ctx\n // Every recipe records its search. A composed recipe reports no\n // population, so its candidates enter with `unknown` edges, as SkillOpt's.\n const searchHistory: SearchHistoryReceipt | undefined = config.searchLedger\n ? await recordGepaSearch({\n name,\n path: config.searchLedger.path ?? `${runDir}/search-ledger.jsonl`,\n searchId: runId,\n identity: config.searchLedger.identity,\n storage,\n seed: input.seed,\n baselineSurface: input.baselineSurface,\n trainScenarios: input.trainScenarios,\n selectionScenarios: input.selectionScenarios,\n evaluationLimit,\n ...(population\n ? { population }\n : { population: null, selected: decodeExternalTextCandidate(result.bestCandidate) }),\n observations: readExternalOptimizerObservationArtifact({\n summary: observationLog.summary(),\n storage,\n }),\n generationAccounting: optimizerAccounting(result.tokenUsage, result.proposerCostUsd),\n })\n : undefined\n return searchHistory\n}\n\n/** Evaluation and optimizer-model cost, with the proxy's completeness checks. */\nexport function gepaCosts<TScenario extends Scenario, TArtifact>(\n ctx: GepaRun<TScenario, TArtifact>,\n result: GepaBridgeOutput,\n modelProxy: ExternalOptimizerModelProxy | undefined,\n) {\n const { costLedger, runtimeIdentity, runBudget, name, config } = ctx\n const evaluationCost = costFromLedgerSummary(\n costLedger.summary({\n phase: 'gepa.external-evaluation',\n tags: runBudget.runTags,\n }),\n )\n const optimizerSummary = costLedger.summary({\n phase: 'gepa.optimizer-model',\n tags: runBudget.runTags,\n })\n const optimizerReceipts = costLedger.list({\n phase: 'gepa.optimizer-model',\n tags: runBudget.runTags,\n })\n const optimizerCost = costFromLedgerSummary(optimizerSummary)\n const reportedProposerCost = result.proposerCostUsd ?? 0\n if (modelProxy) {\n modelProxy.assertExecutionComplete()\n // The bridge's httpx hooks observe exactly the reflection (OpenAI-wire)\n // traffic. Anthropic-wire calls come from the claude CLI, which cannot\n // self-report counts; their receipts are cross-checked below.\n const wires = modelProxy.wireUsage()\n assertExternalOptimizerCompletionCount(\n result.tokenUsage,\n wires.openai.requestAttempts,\n wires.openai.successfulCompletions,\n name,\n 'GEPA',\n )\n if (config.optimizer?.anthropicEndpoint === true) {\n const anthropicReceipts = costLedger.list({\n phase: 'gepa.optimizer-model',\n tags: { ...runBudget.attemptTags, wire: 'anthropic' },\n })\n if (anthropicReceipts.length !== wires.anthropic.requestAttempts) {\n throw new Error(\n `${name}: the Anthropic endpoint admitted ${wires.anthropic.requestAttempts} model calls but the ledger holds ${anthropicReceipts.length} receipts`,\n )\n }\n }\n }\n const tokenUsage = modelProxy\n ? optimizationTokenUsageFromSummary(optimizerSummary, optimizerReceipts)\n : undefined\n const runtime = observedExternalOptimizerRuntime(runtimeIdentity)\n const meteredCost = modelProxy\n ? combineComparisonCosts([\n { label: 'evaluation', cost: evaluationCost },\n { label: 'optimizer model', cost: optimizerCost },\n ])\n : undefined\n const externalTotalCostUsd = evaluationCost.totalCostUsd + reportedProposerCost\n return { evaluationCost, tokenUsage, runtime, meteredCost, externalTotalCostUsd }\n}\n\n/** The method result: the winning surface, its cost and the provenance of the run. */\nexport function buildGepaOutcome<TScenario extends Scenario, TArtifact>(\n ctx: GepaRun<TScenario, TArtifact>,\n result: GepaBridgeOutput,\n outputDir: string,\n modelProxy: ExternalOptimizerModelProxy | undefined,\n searchHistory: SearchHistoryReceipt | undefined,\n costs: ReturnType<typeof gepaCosts<TScenario, TArtifact>>,\n): OptimizationMethodResult {\n const { started, compatibleRunId, runId, runBudget, observationLog, executionLog, config } = ctx\n const { evaluationCost, tokenUsage, runtime, meteredCost, externalTotalCostUsd } = costs\n return {\n winnerSurface: decodeExternalTextCandidate(result.bestCandidate),\n ...(searchHistory ? { searchHistory } : {}),\n cost: modelProxy\n ? meteredCost!\n : {\n totalCostUsd: externalTotalCostUsd,\n costProvenance:\n result.proposerCostAccounting === 'reported' &&\n evaluationCost.costProvenance.kind !== 'uncaptured'\n ? { kind: 'estimated', usd: externalTotalCostUsd }\n : { kind: 'uncaptured', usd: null },\n accountingComplete: false,\n incompleteReasons: [\n ...evaluationCost.incompleteReasons,\n result.proposerCostAccounting === 'reported'\n ? 'GEPA proposer cost is externally reported and has no agent-eval receipt'\n : 'GEPA proposer cost is unavailable',\n ...(result.resumed\n ? ['GEPA proposer cost before this resumed attempt is unavailable']\n : []),\n ],\n },\n durationMs: Date.now() - started,\n provenance: {\n ...runtime,\n ...(config.optimizer\n ? {\n optimizerModel: config.optimizer.model,\n optimizerCallRef: config.optimizer.callRef,\n }\n : {}),\n ...(modelProxy && config.optimizer?.anthropicEndpoint === true\n ? { anthropicEndpoint: modelProxy.wireUsage().anthropic }\n : {}),\n compatibleRunId,\n runId,\n resumed: result.resumed,\n seedApplied: result.seedApplied,\n evaluationCount: runBudget.acceptedEvaluations(),\n ...(result.upstreamReportedEvaluations !== undefined\n ? { upstreamReportedEvaluations: result.upstreamReportedEvaluations }\n : {}),\n artifactDir: outputDir,\n ...(tokenUsage ? { tokenUsage } : {}),\n observations: observationLog.summary(),\n ...(result.candidatePopulation\n ? { gepaCandidatePopulation: result.candidatePopulation }\n : {}),\n ...(executionLog ? { modelExecutions: executionLog.summary() } : {}),\n },\n }\n}\n","import type {\n ExternalOptimizerCallbackLimits,\n ExternalOptimizerResumeMode,\n ExternalOptimizerRunnerCommand,\n} from './external-optimizer-process'\nimport {\n assertGepaOptimizationConfig,\n defaultGepaMethodName,\n snapshotGepaOptimizationConfig,\n} from './gepa-optimization-config'\nimport {\n buildGepaOutcome,\n gepaCosts,\n prepareGepaRun,\n recordGepaSearchHistory,\n runBridge,\n verifyBridgeResult,\n} from './gepa-optimization-run'\nimport type { OptimizationMethod } from './optimization-method'\nimport type { OpenAICompatibleOptimizerModel } from './optimizer-model'\nimport type { SearchRunIdentity } from './search-ledger-recording'\nimport type { Scenario } from './types'\n\n/** Shared settings for one bounded GEPA engine invocation. */\nexport interface GepaEngineOptions {\n /** GEPA engine name. GEPA validates names available in its Python runtime. */\n engine: string\n /** Optional billed-USD stop. Omit when the execution owner reports USD as unknown. */\n maxProposerCostUsd?: number\n /** Maximum concurrent evaluations inside this engine. Default: 1. */\n maxConcurrency?: number\n /** Stop the engine after it reaches this score. */\n stopAtScore?: number\n /** Isolate agent-based engines. Default: true. */\n sandbox?: boolean\n /**\n * JSON-safe configuration for the registered GEPA engine.\n * Python callables and class instances cannot cross the process boundary.\n */\n engineConfig?: Record<string, unknown>\n}\n\n/** One independently budgeted GEPA engine invocation. */\nexport interface GepaEngineRun extends GepaEngineOptions {\n /** Maximum callback evaluations this engine may consume. */\n maxEvaluations: number\n}\n\n/** An engine in an adaptive run. All engines share the recipe evaluation limit. */\nexport type GepaAdaptiveEngineRun = GepaEngineOptions\n\n/**\n * A direct mapping to a GEPA optimization recipe.\n *\n * GEPA owns every search and composition operation represented here. Tangle\n * supplies the candidate, data, execution callback, judges, and budgets.\n */\nexport type GepaOptimizationRecipe =\n | {\n kind: 'engine'\n run: GepaEngineRun\n }\n | {\n kind: 'sequential'\n runs: readonly GepaEngineRun[]\n }\n | {\n kind: 'adaptive-sequential'\n runs: readonly GepaAdaptiveEngineRun[]\n /** One evaluation budget shared by every adaptive stage. */\n maxEvaluations: number\n /** Switch engines after this many evaluations without improvement. */\n plateauEvaluations: number\n patience?: number\n minEvaluationsPerStage?: number\n improvementEpsilon?: number\n cycle?: boolean\n maxSwitches?: number\n maxConcurrency?: number\n }\n | {\n kind: 'best-of'\n runs: readonly GepaEngineRun[]\n maxWorkers?: number\n }\n | {\n kind: 'vote'\n runs: readonly GepaEngineRun[]\n maxWorkers?: number\n }\n | {\n kind: 'omni'\n explore: readonly GepaEngineRun[]\n continueWith: GepaEngineRun\n maxWorkers?: number\n }\n\n/** The command that runs the Python GEPA bridge. */\nexport type GepaRunnerCommand = ExternalOptimizerRunnerCommand\n\nexport interface GepaOptimizationMethodConfig<TScenario extends Scenario, TArtifact = unknown> {\n /** Unique comparison-method name. Default identifies the GEPA recipe. */\n name?: string\n /** A direct GEPA recipe. */\n recipe: GepaOptimizationRecipe\n /** Plain-language goal shown to the external optimizer. */\n objective: string\n /** Stable identity for the dispatch, judges, model settings, and scoring logic. */\n evaluationId: string\n /** Optional bounded context about the surface and task. */\n background?: string\n /**\n * Public dotted Python modules imported before GEPA resolves engine names.\n * Each module should call GEPA's official `register_engine()` API at import.\n */\n engineModules?: readonly string[]\n /** Reject external candidates longer than this. Default: 200,000 characters. */\n maxCandidateChars?: number\n /** Reject serialized score evidence longer than this. Default: 100,000 characters. */\n maxEvidenceChars?: number\n /** Candidate-evaluation callback byte limits. Omitted fields use finite defaults. */\n evaluationCallbackLimits?: Partial<ExternalOptimizerCallbackLimits>\n /** End the bridge process after this many milliseconds. Default: 30 minutes. */\n timeoutMs?: number\n /**\n * OpenAI-compatible model used by standard GEPA reflection.\n * Calls pass through Agent Eval's local model proxy. Every recipe engine must\n * be `gepa` when this is set.\n */\n optimizer?: OpenAICompatibleOptimizerModel\n /**\n * Decide what the external optimizer may read for a train or selection case.\n * The returned value must be JSON-serializable. The final comparison cases\n * are not accepted by this API and cannot be serialized here.\n */\n describeScenario?: (scenario: TScenario) => unknown\n /** Optional bounded artifact evidence returned to GEPA after each evaluation. */\n describeArtifact?: (artifact: TArtifact, scenario: TScenario) => unknown\n /** Default: `never`. Compatible runs resume only when explicitly enabled. */\n resume?: ExternalOptimizerResumeMode\n /**\n * Required for resumable direct GEPA runs because upstream state uses Python\n * pickle. Enable only for state created locally in a directory you control.\n */\n trustResumeState?: boolean\n runner?: GepaRunnerCommand\n /**\n * Record GEPA's search into a search ledger and return the bounded receipt\n * on the method result, so a comparison under `searchHistoryPolicy:\n * 'require-complete'` accepts this method. The population becomes nodes and\n * `correlated` edges, and every callback evaluation becomes a cell.\n *\n * `identity` declares the immutable revisions and the model the ledger\n * requires and the bridge does not report. `path` defaults to\n * `<runDir>/search-ledger.jsonl`.\n */\n searchLedger?: { identity: SearchRunIdentity; path?: string }\n}\n\n/**\n * Turn an optional GEPA installation into an `OptimizationMethod`.\n *\n * GEPA receives only serialized train and selection cases. The caller's final\n * test partition stays inside `compareOptimizationMethods`, which invokes this\n * method without a test-set field. The local callback routes every candidate\n * evaluation through the same dispatch and judges used by other methods.\n */\n/**\n * Environment for a bridge child that spawns `claude` CLI subprocesses.\n *\n * Both agent CLI engines start the CLI with the bridge's own environment, so\n * these variables travel bridge → engine → CLI. They merge AFTER\n * `removeCredentialEnvironment`: the ephemeral loopback token is the only\n * credential the child may see, and a caller-supplied ANTHROPIC_AUTH_TOKEN is\n * stripped like any other credential.\n */\n\nexport function gepaOptimizationMethod<TScenario extends Scenario, TArtifact>(\n config: GepaOptimizationMethodConfig<TScenario, TArtifact>,\n): OptimizationMethod<TScenario, TArtifact> {\n assertGepaOptimizationConfig(config)\n config = snapshotGepaOptimizationConfig(config)\n const name = config.name ?? defaultGepaMethodName(config.recipe)\n\n return {\n name,\n async optimize(input) {\n const ctx = await prepareGepaRun(config, input, name)\n const { result, outputDir, modelProxy } = await runBridge(ctx)\n const population = verifyBridgeResult(ctx, result)\n const searchHistory = await recordGepaSearchHistory(ctx, result, population)\n const costs = gepaCosts(ctx, result, modelProxy)\n return buildGepaOutcome(ctx, result, outputDir, modelProxy, searchHistory, costs)\n },\n }\n}\n","/** Admission checks for the shared controls of a method comparison. */\n\nimport { surfaceContentHash } from '../surface-identity'\nimport type { Scenario } from '../types'\nimport type { CompareOptimizationMethodsOptions } from './compare-optimization-methods'\n\n/** The caller-supplied judges, dispatch function and references, and the baseline surface. */\nfunction assertCallerInputs<TScenario extends Scenario, TArtifact>(\n opts: CompareOptimizationMethodsOptions<TScenario, TArtifact>,\n): void {\n if (\n opts.optimizationRunOptions &&\n 'costCeiling' in (opts.optimizationRunOptions as unknown as Record<string, unknown>)\n ) {\n throw new Error(\n 'compareOptimizationMethods: optimizationRunOptions.costCeiling is not supported; costCeiling covers optimization and final scoring',\n )\n }\n if (!opts.judges || opts.judges.length === 0) {\n throw new Error('compareOptimizationMethods: at least one judge is required')\n }\n if (typeof opts.dispatchWithSurface !== 'function') {\n throw new Error('compareOptimizationMethods: dispatchWithSurface must be a function')\n }\n if (\n opts.dispatchRef !== undefined &&\n (typeof opts.dispatchRef !== 'string' ||\n opts.dispatchRef.trim().length === 0 ||\n opts.dispatchRef.trim() !== opts.dispatchRef)\n ) {\n throw new Error(\n 'compareOptimizationMethods: dispatchRef must be trimmed and non-empty when provided',\n )\n }\n const optimizationDispatchRef = opts.optimizationRunOptions?.dispatchRef\n if (\n optimizationDispatchRef !== undefined &&\n (typeof optimizationDispatchRef !== 'string' ||\n optimizationDispatchRef.trim().length === 0 ||\n optimizationDispatchRef.trim() !== optimizationDispatchRef)\n ) {\n throw new Error(\n 'compareOptimizationMethods: optimizationRunOptions.dispatchRef must be trimmed and non-empty when provided',\n )\n }\n if (\n opts.dispatchRef !== undefined &&\n optimizationDispatchRef !== undefined &&\n opts.dispatchRef !== optimizationDispatchRef\n ) {\n throw new Error(\n 'compareOptimizationMethods: dispatchRef must match optimizationRunOptions.dispatchRef when both are provided',\n )\n }\n try {\n surfaceContentHash(opts.baselineSurface)\n } catch (cause) {\n throw new Error('compareOptimizationMethods: baselineSurface is invalid', { cause })\n }\n}\n\n/** Every judge has a unique trimmed name, a score function and uniquely keyed dimensions. */\nfunction assertJudges<TScenario extends Scenario, TArtifact>(\n opts: CompareOptimizationMethodsOptions<TScenario, TArtifact>,\n): void {\n const judgeNames = new Set<string>()\n for (const judge of opts.judges) {\n if (\n !judge ||\n typeof judge !== 'object' ||\n typeof judge.name !== 'string' ||\n judge.name.trim().length === 0 ||\n judge.name.trim() !== judge.name ||\n typeof judge.score !== 'function' ||\n !Array.isArray(judge.dimensions) ||\n judge.dimensions.length === 0\n ) {\n throw new Error(\n 'compareOptimizationMethods: every judge needs a trimmed name, at least one dimension, and score(input)',\n )\n }\n if (judgeNames.has(judge.name)) {\n throw new Error(`compareOptimizationMethods: duplicate judge name '${judge.name}'`)\n }\n judgeNames.add(judge.name)\n const dimensionKeys = new Set<string>()\n for (const dimension of judge.dimensions) {\n if (\n !dimension ||\n typeof dimension.key !== 'string' ||\n dimension.key.trim().length === 0 ||\n dimension.key.trim() !== dimension.key ||\n typeof dimension.description !== 'string' ||\n dimension.description.trim().length === 0\n ) {\n throw new Error(\n `compareOptimizationMethods: judge '${judge.name}' has an invalid dimension`,\n )\n }\n if (dimensionKeys.has(dimension.key)) {\n throw new Error(\n `compareOptimizationMethods: judge '${judge.name}' has duplicate dimension '${dimension.key}'`,\n )\n }\n dimensionKeys.add(dimension.key)\n }\n }\n}\n\n/** The run directory and the seed, resamples and confidence that fix the paired intervals. */\nfunction assertStatistics<TScenario extends Scenario, TArtifact>(\n opts: CompareOptimizationMethodsOptions<TScenario, TArtifact>,\n seed: number,\n resamples: number,\n confidence: number,\n): void {\n if (typeof opts.runDir !== 'string' || opts.runDir.trim().length === 0) {\n throw new Error('compareOptimizationMethods: runDir must be a non-empty string')\n }\n if (!Number.isSafeInteger(seed)) {\n throw new Error(`compareOptimizationMethods: seed must be a safe integer, got ${String(seed)}`)\n }\n if (!Number.isSafeInteger(resamples) || resamples <= 0 || resamples > 1_000_000) {\n throw new Error(\n `compareOptimizationMethods: resamples must be a positive safe integer no greater than 1000000, got ${String(resamples)}`,\n )\n }\n assertConfidence(confidence)\n const minimumResamples = minimumBootstrapResamples(\n confidence,\n (opts.methods.length * (opts.methods.length + 1)) / 2,\n )\n if (resamples < minimumResamples) {\n throw new Error(\n `compareOptimizationMethods: resamples must be at least ${minimumResamples} for simultaneous confidence ${confidence} across ${opts.methods.length} methods, got ${resamples}`,\n )\n }\n}\n\n/** Concurrency, timeout and cost limits. */\nfunction assertLimits<TScenario extends Scenario, TArtifact>(\n opts: CompareOptimizationMethodsOptions<TScenario, TArtifact>,\n): void {\n if (\n opts.optimizationConcurrency !== undefined &&\n (!Number.isSafeInteger(opts.optimizationConcurrency) || opts.optimizationConcurrency <= 0)\n ) {\n throw new Error(\n 'compareOptimizationMethods: optimizationConcurrency must be a positive safe integer',\n )\n }\n if (\n opts.maxConcurrency !== undefined &&\n (!Number.isSafeInteger(opts.maxConcurrency) || opts.maxConcurrency <= 0)\n ) {\n throw new Error('compareOptimizationMethods: maxConcurrency must be a positive safe integer')\n }\n if (\n opts.dispatchTimeoutMs !== undefined &&\n (!Number.isSafeInteger(opts.dispatchTimeoutMs) ||\n opts.dispatchTimeoutMs < 0 ||\n opts.dispatchTimeoutMs > 2_147_483_647)\n ) {\n throw new Error(\n 'compareOptimizationMethods: dispatchTimeoutMs must be a non-negative safe integer no greater than 2147483647',\n )\n }\n if (\n opts.costCeiling !== undefined &&\n (!Number.isFinite(opts.costCeiling) || opts.costCeiling < 0)\n ) {\n throw new Error(\n 'compareOptimizationMethods: costCeiling must be a finite number greater than or equal to 0',\n )\n }\n if (\n opts.costCeiling !== undefined &&\n opts.costLedger !== undefined &&\n opts.costLedger.costCeilingUsd !== opts.costCeiling\n ) {\n throw new Error(\n 'compareOptimizationMethods: costCeiling must match the shared CostLedger ceiling',\n )\n }\n}\n\nexport function assertComparisonControls<TScenario extends Scenario, TArtifact>(\n opts: CompareOptimizationMethodsOptions<TScenario, TArtifact>,\n seed: number,\n resamples: number,\n confidence: number,\n): void {\n assertCallerInputs(opts)\n assertJudges(opts)\n assertStatistics(opts, seed, resamples, confidence)\n assertLimits(opts)\n}\n\nexport function assertConfidence(confidence: number): void {\n if (!Number.isFinite(confidence) || confidence <= 0 || confidence >= 1) {\n throw new Error(\n `compareOptimizationMethods: confidence must be a finite number in (0,1), got ${String(confidence)}`,\n )\n }\n}\n\nexport function minimumBootstrapResamples(confidence: number, comparisonCount: number): number {\n const exact = (2 * comparisonCount) / (1 - confidence)\n return Math.ceil(exact - Number.EPSILON * Math.max(1, exact) * 32)\n}\n","/**\n * Compare optimization methods on shared train, selection, and test data.\n * Optimizers receive only train and selection data. After every optimizer\n * finishes, their selected surfaces are measured on the same untouched test\n * data and compared with paired confidence intervals.\n */\n\n/** Optimization method inputs, provenance, results, and comparison contracts. */\n\n/** Equal-budget optimization followed by final measurements and paired method comparisons. */\n\n/** Comparison admission, disjoint partitions, and isolated method/final measurement inputs. */\n\nimport { combineAbortSignals } from '../../abort-signal'\nimport { mapConcurrent } from '../../concurrency'\nimport type { CostLedgerHandle } from '../../cost-ledger'\nimport {\n type CampaignEvidenceContext,\n createCampaignEvidenceReceipt,\n} from '../../experiment/campaign-evidence'\nimport {\n defineEvaluationClaim,\n type EvaluationClaim,\n type EvaluationUnitSummary,\n summarizeEvaluationUnits,\n} from '../../experiment/claim'\nimport type { EvidenceReceipt } from '../../experiment/evidence-receipt'\nimport {\n decidePairedPromotion,\n type PairedPromotionDecision,\n} from '../../paired-promotion-decision'\nimport { meanOrZero } from '../../statistics/mean'\nimport { contentHash } from '../../verdict-cache'\nimport { assertCampaignDesign, assertCompleteCampaign } from '../coverage'\nimport {\n assertIndependentEvaluationSplit,\n captureFinalEvidencePolicy,\n evaluationUnitMap,\n exposeFinalEvidence,\n type FinalEvidencePolicy,\n type FinalEvidenceUse,\n reserveFinalEvidence,\n} from '../final-evidence'\nimport { captureJudge } from '../judge-snapshot'\nimport {\n type ComparisonCost,\n combineComparisonCosts,\n costFromLedgerSummary,\n} from '../optimization-cost'\nimport {\n executeOptimizationMethod,\n type OptimizationMethod,\n type OptimizationMethodComposition,\n type OptimizationMethodInput,\n type OptimizationMethodProvenance,\n type OptimizationMethodRunOptions,\n} from '../optimization-method'\nimport { type RunCampaignOptions, runCampaign } from '../run-campaign'\nimport { resolveRunDir } from '../run-dir'\nimport { campaignBreakdown } from '../score-utils'\nimport {\n assertSearchHistoryAdmissionOptions,\n type SearchHistoryAdmissionOptions,\n type SearchHistoryCoverage,\n} from '../search-history-receipt'\nimport { createRunCostLedger, fsCampaignStorage } from '../storage'\nimport { surfaceContentHash } from '../surface-identity'\nimport type {\n CampaignResult,\n DispatchContext,\n JudgeConfig,\n MutableSurface,\n Scenario,\n} from '../types'\nimport {\n assertComparisonControls,\n assertConfidence,\n minimumBootstrapResamples,\n} from './comparison-controls'\n\nexport interface OptimizationMethodScore {\n evidence?: { baseline: EvidenceReceipt; winner: EvidenceReceipt }\n name: string\n /** Mean final-test composite of the baseline (identical across methods). */\n baselineComposite: number\n /** Mean final-test composite of this method's selected surface. */\n winnerComposite: number\n /** Mean final-test lift across independent units (winner minus baseline). */\n lift: number\n /** Deciding interval, adjusted for every registered contrast. */\n liftCi: { low: number; high: number }\n decision: PairedPromotionDecision\n /** Search spend reconciled with recorded method calls. Excludes final test scoring. */\n optimizationCost: ComparisonCost\n /** Optimization duration reported by the method. Excludes final test scoring. */\n durationMs?: number\n /** Exact external implementation and run identity, when reported by the method. */\n provenance?: OptimizationMethodProvenance\n /** Paired final-test values used to compute lift and its interval. */\n scenarioScores: Array<{\n scenarioId: string\n baselineComposite: number\n winnerComposite: number\n lift: number\n }>\n /** Scenario means averaged within each registered source unit before inference. */\n unitScores: Array<{\n unitId: string\n scenarios: number\n baselineComposite: number\n winnerComposite: number\n lift: number\n }>\n winnerSurface: MutableSurface\n composition?: OptimizationMethodComposition\n /** 1-based, by descending lift. */\n rank: number\n}\n\nexport interface OptimizationMethodPairwise {\n /** Higher-ranked method. */\n a: string\n b: string\n /** Mean final-test delta across independent units (a − b). */\n deltaMean: number\n low: number\n high: number\n /** Favored only when the full paired decision clears the registered effect; null is inconclusive. */\n favored: string | null\n decision: PairedPromotionDecision\n}\n\nexport interface OptimizationMethodComparison {\n claim?: EvaluationClaim\n finalEvidence?: FinalEvidenceUse\n /** Sorted by descending lift; `rank` set accordingly. */\n scores: OptimizationMethodScore[]\n best: OptimizationMethodScore\n /** Best observed method versus each alternative, with simultaneous paired decisions. */\n pairwise: OptimizationMethodPairwise[]\n testScenarioIds: string[]\n units: EvaluationUnitSummary\n observationUnit: 'scenario' | 'registered'\n /** Complete scenario-replicate pairs per contrast, before unit aggregation. */\n pairedCellN: number\n /** Sum of method reports reconciled against each method's recorded calls. */\n optimizationCost: ComparisonCost\n /** Baseline and distinct winner scoring on the final test partition. */\n testCost: ComparisonCost\n /** Optimization plus final test scoring. */\n totalCost: ComparisonCost\n /** Caller-requested simultaneous coverage across all reported contrasts. */\n confidence: number\n /** Bonferroni-adjusted confidence used for each bootstrap interval. */\n intervalConfidence: number\n /** Method-vs-baseline plus all possible method-vs-method contrasts. */\n comparisonCount: number\n /** Deterministic bootstrap and campaign seed. */\n seed: number\n /** Bootstrap draws used for each interval. */\n resamples: number\n /** Agent runs averaged within each test scenario before resampling scenarios. */\n reps: number\n /** Coverage of every method's canonical search history. */\n searchHistory: SearchHistoryCoverage\n}\n\nexport interface CompareOptimizationMethodsOptions<TScenario extends Scenario, TArtifact>\n extends Omit<RunCampaignOptions<TScenario, TArtifact>, 'dispatch' | 'judges' | 'scenarios'>,\n SearchHistoryAdmissionOptions {\n /** Explicit caller authority and environment for receipts over actual final measurements. */\n evidence?: CampaignEvidenceContext\n claim?: EvaluationClaim\n finalEvidence?: FinalEvidencePolicy\n methods: OptimizationMethod<TScenario, TArtifact>[]\n baselineSurface: MutableSurface\n /** Evidence used by every optimizer to author or fit candidates. */\n trainScenarios: TScenario[]\n /** Candidate acceptance, early-stopping, and optimizer-selection data. */\n selectionScenarios: TScenario[]\n /** Untouched final comparison data. Never passed to an optimization method. */\n testScenarios: TScenario[]\n /** Scores a surface on a scenario. The methods and final test share this function. */\n dispatchWithSurface: (\n surface: MutableSurface,\n scenario: TScenario,\n ctx: DispatchContext,\n ) => Promise<TArtifact>\n judges: JudgeConfig<TArtifact, TScenario>[]\n /** Bootstrap resamples for the lift intervals. Default is at least 2000 and\n * rises when the requested simultaneous confidence needs finer tails. */\n resamples?: number\n /** Shared defaults for each method's train and selection campaigns. */\n optimizationRunOptions?: OptimizationMethodRunOptions<TScenario, TArtifact>\n /** Number of optimization methods to run concurrently. Default 1. */\n optimizationConcurrency?: number\n /** Simultaneous confidence across method-vs-baseline and method-vs-method contrasts.\n * Each bootstrap interval is Bonferroni-adjusted. Default 0.95. */\n confidence?: number\n /** Shared spend limit across every method's optimizer and evaluation calls plus final scoring. */\n costCeiling?: number\n}\n\n/**\n * Compare complete optimization methods on disjoint train, selection, and final test data.\n */\nexport async function compareOptimizationMethods<TScenario extends Scenario, TArtifact>(\n rawOpts: CompareOptimizationMethodsOptions<TScenario, TArtifact>,\n): Promise<OptimizationMethodComparison> {\n const s0 = normalizeComparisonOptions({ rawOpts })\n const s1 = await finalTestScoring(s0)\n const s2 = await optimizeAllMethods(s1)\n const s3 = await reserveTestMeasurement(s2)\n const s4 = await measureWinners(s3)\n const s5 = scoreMethods(s4)\n const s6 = pairwiseAgainstBest(s5)\n return comparisonResult(s6)\n}\n\n/** The captured options, the derived statistics settings, the run directory and the cost ledger. */\nfunction normalizeComparisonOptions<TScenario extends Scenario, TArtifact>(prev: {\n rawOpts: CompareOptimizationMethodsOptions<TScenario, TArtifact>\n}) {\n const { rawOpts } = prev\n const opts = {\n ...rawOpts,\n methods: rawOpts.methods.map((method) => ({ ...method })),\n trainScenarios: structuredClone(rawOpts.trainScenarios),\n selectionScenarios: structuredClone(rawOpts.selectionScenarios),\n testScenarios: structuredClone(rawOpts.testScenarios),\n judges: rawOpts.judges.map(captureJudge),\n claim: rawOpts.claim && defineEvaluationClaim(rawOpts.claim),\n finalEvidence: rawOpts.finalEvidence && captureFinalEvidencePolicy(rawOpts.finalEvidence),\n }\n assertOptimizationMethods(opts.methods)\n assertComparisonPartitions(opts)\n const searchHistoryPolicy = opts.searchHistoryPolicy ?? 'allow-missing'\n assertSearchHistoryAdmissionOptions(opts)\n const seed = opts.seed ?? 42\n const confidence = opts.confidence ?? 0.95\n assertConfidence(confidence)\n const optimizationConcurrency = opts.optimizationConcurrency ?? 1\n const comparisonCount = (opts.methods.length * (opts.methods.length + 1)) / 2\n const intervalConfidence = 1 - (1 - confidence) / comparisonCount\n const minimumResamples = minimumBootstrapResamples(confidence, comparisonCount)\n const resamples = opts.resamples ?? Math.max(2000, minimumResamples)\n assertComparisonControls(opts, seed, resamples, confidence)\n const evidence = opts.evidence === undefined ? undefined : structuredClone(opts.evidence)\n const evidenceBySurface = new Map<string, EvidenceReceipt>()\n const storage = opts.storage ?? fsCampaignStorage()\n const resolvedRunDir = resolveRunDir(opts.runDir, opts.repo)\n const baselineSurface = structuredClone(opts.baselineSurface)\n const costLedger =\n opts.costLedger ??\n createRunCostLedger({\n storage,\n runDir: `${resolvedRunDir}/cost`,\n costCeilingUsd: opts.costCeiling,\n })\n\n return {\n ...prev,\n opts,\n searchHistoryPolicy,\n seed,\n confidence,\n optimizationConcurrency,\n comparisonCount,\n intervalConfidence,\n minimumResamples,\n resamples,\n evidence,\n evidenceBySurface,\n storage,\n resolvedRunDir,\n baselineSurface,\n costLedger,\n }\n}\n\n/** Scoring a surface on the final test set, and aligning the scores to the designed scenarios. */\nasync function finalTestScoring<TScenario extends Scenario, TArtifact>(\n prev: Awaited<ReturnType<typeof normalizeComparisonOptions<TScenario, TArtifact>>>,\n) {\n const {\n opts,\n seed,\n intervalConfidence,\n resamples,\n evidence,\n evidenceBySurface,\n storage,\n resolvedRunDir,\n costLedger,\n } = prev\n const scoreOnTest = async (\n surface: MutableSurface,\n tag: string,\n costPhase: string,\n ): Promise<Record<string, number>> => {\n const measuredSurface = structuredClone(surface)\n const campaign: CampaignResult<TArtifact, TScenario> = await runCampaign<TScenario, TArtifact>({\n ...opts,\n storage,\n costLedger,\n costPhase,\n scenarios: opts.testScenarios.map((scenario) => structuredClone(scenario)),\n dispatch: (scenario, ctx) =>\n opts.dispatchWithSurface(structuredClone(measuredSurface), scenario, ctx),\n dispatchRef: `compareOptimizationMethods:${callerDispatchRef(opts)}:${surfaceContentHash(measuredSurface)}`,\n runDir: `${resolvedRunDir}/${tag}`,\n })\n assertCompleteCampaign(\n campaign,\n opts.testScenarios,\n opts.reps ?? 1,\n true,\n `compareOptimizationMethods: ${tag} final comparison`,\n )\n if (evidence)\n evidenceBySurface.set(\n surfaceContentHash(measuredSurface),\n createCampaignEvidenceReceipt({ campaign, surface: measuredSurface, context: evidence }),\n )\n const byScenario: Record<string, number> = {}\n for (const { scenarioId, composite } of campaignBreakdown(campaign).scenarios) {\n byScenario[scenarioId] = composite\n }\n return byScenario\n }\n\n // Every surface must have a score for every designed test scenario. Filling a\n // missing score with zero would change the comparison instead of reporting a failed run.\n const scenarioIds = opts.testScenarios.map((s) => s.id).sort()\n const unitByScenario = opts.claim\n ? evaluationUnitMap(opts.claim, opts.testScenarios)\n : new Map(scenarioIds.map((id) => [id, id]))\n const units: EvaluationUnitSummary = opts.claim\n ? summarizeEvaluationUnits(opts.claim, opts.testScenarios)\n : {\n observations: scenarioIds.length,\n independentUnits: scenarioIds.length,\n units: scenarioIds.map((id) => ({ id, observations: 1 })),\n }\n const aggregateUnits = (arr: number[]): number[] => {\n const values = new Map<string, number[]>()\n scenarioIds.forEach((id, index) => {\n const unitId = unitByScenario.get(id)!\n const bucket = values.get(unitId) ?? []\n bucket.push(arr[index]!)\n values.set(unitId, bucket)\n })\n return units.units.map((unit) => meanOrZero(values.get(unit.id)!))\n }\n const decisionOptions = {\n seed,\n resamples,\n confidence: intervalConfidence,\n threshold: opts.claim?.minimumEffect ?? 0,\n }\n const align = (byScenario: Record<string, number>, label: string): number[] => {\n const missing = scenarioIds.filter((id) => !(id in byScenario))\n if (missing.length > 0) {\n throw new Error(\n `compareOptimizationMethods: ${label} produced no test score for scenario(s) [${missing.join(\n ', ',\n )}]. A cell failed or its judges returned nothing. Fix the dispatch or judge; the comparison will not replace missing scores with zero.`,\n )\n }\n return scenarioIds.map((id) => byScenario[id]!)\n }\n\n return {\n ...prev,\n scoreOnTest,\n scenarioIds,\n unitByScenario,\n units,\n aggregateUnits,\n decisionOptions,\n align,\n }\n}\n\n/** Reserve final evidence, then finish every method before the first final-test call. */\nasync function optimizeAllMethods<TScenario extends Scenario, TArtifact>(\n prev: Awaited<ReturnType<typeof finalTestScoring<TScenario, TArtifact>>>,\n) {\n const {\n opts,\n seed,\n optimizationConcurrency,\n storage,\n resolvedRunDir,\n baselineSurface,\n costLedger,\n } = prev\n // Finish every method before the first final-test call. Each method gets\n // independent scenario values so one method cannot mutate another's input.\n if (opts.claim?.generalization === 'new-units') {\n assertIndependentEvaluationSplit(opts.claim, opts.testScenarios, [\n ...opts.trainScenarios,\n ...opts.selectionScenarios,\n ])\n }\n if (opts.finalEvidence) {\n await reserveFinalEvidence(opts.finalEvidence, opts.claim, opts.testScenarios, [\n ...opts.trainScenarios,\n ...opts.selectionScenarios,\n ])\n }\n const optimizationOwner = new AbortController()\n const optimized = await mapConcurrent(opts.methods, optimizationConcurrency, async (method) => {\n try {\n const {\n selected: out,\n cost,\n history: searchHistoryCoverage,\n } = await executeOptimizationMethod({\n method,\n input: createOptimizationMethodInput(\n opts,\n method.name,\n resolvedRunDir,\n seed,\n baselineSurface,\n costLedger,\n optimizationOwner.signal,\n ),\n storage,\n searchHistoryPolicy: opts.searchHistoryPolicy,\n searchHistoryVerification: opts.searchHistoryVerification,\n })\n const winnerSurface = out.winnerSurface\n return {\n name: method.name,\n winnerSurface,\n cost,\n ...(out.durationMs === undefined ? {} : { durationMs: out.durationMs }),\n ...(out.composition === undefined ? {} : { composition: out.composition }),\n ...(out.provenance === undefined ? {} : { provenance: out.provenance }),\n searchHistoryCoverage,\n }\n } catch (error) {\n if (!optimizationOwner.signal.aborted) optimizationOwner.abort(error)\n throw error\n }\n })\n assertReportedCostWithinCeiling(\n combineComparisonCosts(\n optimized.map((result) => ({\n label: `method '${result.name}'`,\n cost: result.cost,\n })),\n ).totalCostUsd,\n opts.costCeiling,\n 'optimization',\n )\n return { ...prev, optimizationOwner, optimized }\n}\n\n/** The identity of the final test and the exposure of its evidence. */\nasync function reserveTestMeasurement<TScenario extends Scenario, TArtifact>(\n prev: Awaited<ReturnType<typeof optimizeAllMethods<TScenario, TArtifact>>>,\n) {\n const { opts, seed, baselineSurface, optimized } = prev\n const testCostIdentity = contentHash({\n baseline: surfaceContentHash(baselineSurface),\n winners: optimized.map((winner) => ({\n name: winner.name,\n surface: surfaceContentHash(winner.winnerSurface),\n })),\n testScenarios: opts.testScenarios,\n judges: opts.judges.map((judge) => ({\n name: judge.name,\n dimensions: judge.dimensions,\n version:\n judge.judgeVersion ??\n contentHash({\n score: judge.score.toString(),\n appliesTo: judge.appliesTo?.toString() ?? null,\n }),\n })),\n dispatch: callerDispatchRef(opts),\n seed,\n reps: opts.reps ?? 1,\n })\n const testCostPhase = `compareOptimizationMethods.test:${testCostIdentity}`\n const finalEvidence = opts.finalEvidence\n ? await exposeFinalEvidence(opts.finalEvidence, opts.claim, opts.testScenarios, [\n baselineSurface,\n ...optimized.map((method) => method.winnerSurface),\n ])\n : undefined\n return { ...prev, testCostIdentity, testCostPhase, finalEvidence }\n}\n\n/** One final-test measurement per distinct surface. */\nasync function measureWinners<TScenario extends Scenario, TArtifact>(\n prev: Awaited<ReturnType<typeof reserveTestMeasurement<TScenario, TArtifact>>>,\n) {\n const { baselineSurface, scoreOnTest, align, optimized, testCostPhase } = prev\n // Reuse one final-test measurement for identical surfaces. This avoids duplicate\n // spend and prevents model variance from inventing a difference between equal inputs.\n const baselineArr = align(\n await scoreOnTest(baselineSurface, 'test/baseline', testCostPhase),\n 'baseline',\n )\n const testScoresBySurface = new Map([[surfaceContentHash(baselineSurface), baselineArr]])\n const winners: Array<(typeof optimized)[number] & { arr: number[] }> = []\n for (const winner of optimized) {\n const surfaceKey = surfaceContentHash(winner.winnerSurface)\n let arr = testScoresBySurface.get(surfaceKey)\n if (!arr) {\n const byScenario = await scoreOnTest(\n winner.winnerSurface,\n `test/methods/${slug(winner.name)}`,\n testCostPhase,\n )\n arr = align(byScenario, `method \"${winner.name}\"`)\n testScoresBySurface.set(surfaceKey, arr)\n }\n winners.push({\n ...winner,\n arr,\n })\n }\n\n return { ...prev, baselineArr, testScoresBySurface, winners }\n}\n\n/** Per-method scores, ranked by lift with cost breaking complete ties. */\nfunction scoreMethods<TScenario extends Scenario, TArtifact>(\n prev: Awaited<ReturnType<typeof measureWinners<TScenario, TArtifact>>>,\n) {\n const {\n evidence,\n evidenceBySurface,\n baselineSurface,\n scenarioIds,\n units,\n aggregateUnits,\n decisionOptions,\n baselineArr,\n winners,\n } = prev\n const scores: OptimizationMethodScore[] = winners.map((w) => {\n const baselineUnits = aggregateUnits(baselineArr)\n const winnerUnits = aggregateUnits(w.arr)\n const decision = decidePairedPromotion(baselineUnits, winnerUnits, decisionOptions)\n const score: OptimizationMethodScore = {\n name: w.name,\n baselineComposite: meanOrZero(baselineUnits),\n winnerComposite: meanOrZero(winnerUnits),\n lift: decision.delta,\n liftCi: { low: decision.low, high: decision.high },\n decision,\n optimizationCost: w.cost,\n scenarioScores: scenarioIds.map((scenarioId, index) => ({\n scenarioId,\n baselineComposite: baselineArr[index]!,\n winnerComposite: w.arr[index]!,\n lift: w.arr[index]! - baselineArr[index]!,\n })),\n unitScores: units.units.map((unit, index) => ({\n unitId: unit.id,\n scenarios: unit.observations,\n baselineComposite: baselineUnits[index]!,\n winnerComposite: winnerUnits[index]!,\n lift: winnerUnits[index]! - baselineUnits[index]!,\n })),\n winnerSurface: structuredClone(w.winnerSurface),\n rank: 0,\n }\n if (evidence) {\n const baseline = evidenceBySurface.get(surfaceContentHash(baselineSurface))\n const winner = evidenceBySurface.get(surfaceContentHash(w.winnerSurface))\n if (!baseline || !winner) throw new Error('final measurement evidence is missing')\n score.evidence = { baseline, winner }\n }\n if (w.composition !== undefined) score.composition = structuredClone(w.composition)\n if (w.durationMs !== undefined) score.durationMs = w.durationMs\n if (w.provenance !== undefined) score.provenance = structuredClone(w.provenance)\n return score\n })\n scores.sort((a, b) => b.lift - a.lift)\n // Cost orders an equal-lift group only when every method in that group has\n // complete accounting. Otherwise declaration order remains deterministic.\n for (let start = 0; start < scores.length; ) {\n let end = start + 1\n while (end < scores.length && scores[end]!.lift === scores[start]!.lift) end += 1\n const tied = scores.slice(start, end)\n if (tied.every((score) => score.optimizationCost.accountingComplete)) {\n tied.sort((a, b) => a.optimizationCost.totalCostUsd - b.optimizationCost.totalCostUsd)\n scores.splice(start, tied.length, ...tied)\n }\n start = end\n }\n scores.forEach((s, i) => {\n s.rank = i + 1\n })\n const best = scores[0]!\n\n return { ...prev, scores, best }\n}\n\n/** The best method against every other, in both directions. */\nfunction pairwiseAgainstBest<TScenario extends Scenario, TArtifact>(\n prev: Awaited<ReturnType<typeof scoreMethods<TScenario, TArtifact>>>,\n) {\n const { aggregateUnits, decisionOptions, winners, scores, best } = prev\n const byName = new Map(winners.map((w) => [w.name, w]))\n const bestArr = aggregateUnits(byName.get(best.name)!.arr)\n const pairwise: OptimizationMethodPairwise[] = scores.slice(1).map((other) => {\n const otherArr = aggregateUnits(byName.get(other.name)!.arr)\n // before = other, after = best ⇒ delta = best − other on the test set.\n const decision = decidePairedPromotion(otherArr, bestArr, decisionOptions)\n const reverse = decidePairedPromotion(bestArr, otherArr, decisionOptions)\n const favored = decision.promote ? best.name : reverse.promote ? other.name : null\n return {\n a: best.name,\n b: other.name,\n deltaMean: decision.delta,\n low: decision.low,\n high: decision.high,\n favored,\n decision,\n }\n })\n\n return { ...prev, byName, bestArr, pairwise }\n}\n\n/** Total cost against the ceiling, then the comparison record. */\nfunction comparisonResult<TScenario extends Scenario, TArtifact>(\n prev: Awaited<ReturnType<typeof pairwiseAgainstBest<TScenario, TArtifact>>>,\n): OptimizationMethodComparison {\n const {\n opts,\n searchHistoryPolicy,\n seed,\n confidence,\n comparisonCount,\n intervalConfidence,\n resamples,\n costLedger,\n scenarioIds,\n units,\n optimized,\n testCostPhase,\n finalEvidence,\n scores,\n best,\n pairwise,\n } = prev\n const optimizationCost = combineComparisonCosts(\n scores.map((score) => ({ label: `method '${score.name}'`, cost: score.optimizationCost })),\n )\n const testCost = costFromLedgerSummary(costLedger.summary({ phase: testCostPhase }))\n const totalCost = combineComparisonCosts([\n { label: 'optimization', cost: optimizationCost },\n { label: 'final test', cost: testCost },\n ])\n assertReportedCostWithinCeiling(totalCost.totalCostUsd, opts.costCeiling, 'total')\n return {\n scores,\n best,\n pairwise,\n testScenarioIds: scenarioIds,\n units,\n observationUnit: opts.claim ? 'registered' : 'scenario',\n pairedCellN: scenarioIds.length * (opts.reps ?? 1),\n ...(opts.claim ? { claim: opts.claim } : {}),\n ...(finalEvidence ? { finalEvidence } : {}),\n optimizationCost,\n testCost,\n totalCost,\n confidence,\n intervalConfidence,\n comparisonCount,\n seed,\n resamples,\n reps: opts.reps ?? 1,\n searchHistory: Object.freeze({\n policy: searchHistoryPolicy,\n allComplete: optimized.every((result) => result.searchHistoryCoverage.status === 'complete'),\n producers: Object.freeze(optimized.map((result) => result.searchHistoryCoverage)),\n }),\n }\n}\n\nfunction assertReportedCostWithinCeiling(\n totalCostUsd: number,\n costCeiling: number | undefined,\n phase: 'optimization' | 'total',\n): void {\n const tolerance =\n Number.EPSILON * Math.max(1, Math.abs(totalCostUsd), Math.abs(costCeiling ?? 0)) * 8\n if (costCeiling !== undefined && totalCostUsd > costCeiling + tolerance) {\n throw new Error(\n `compareOptimizationMethods: reported ${phase} cost ${totalCostUsd} exceeds costCeiling ${costCeiling}`,\n )\n }\n}\n\nfunction assertOptimizationMethods<TScenario extends Scenario, TArtifact>(\n methods: readonly OptimizationMethod<TScenario, TArtifact>[],\n): void {\n if (!Array.isArray(methods) || methods.length === 0) {\n throw new Error('compareOptimizationMethods: no methods to compare')\n }\n const names = new Set<string>()\n const pathOwners = new Map<string, string>()\n for (const method of methods) {\n if (!method || typeof method !== 'object' || typeof method.optimize !== 'function') {\n throw new Error('compareOptimizationMethods: every method must provide optimize(input)')\n }\n if (!method.name || method.name.trim() !== method.name) {\n throw new Error('compareOptimizationMethods: method names must be trimmed and non-empty')\n }\n if (names.has(method.name)) {\n throw new Error(`compareOptimizationMethods: duplicate method name '${method.name}'`)\n }\n names.add(method.name)\n const pathKey = slug(method.name)\n const prior = pathOwners.get(pathKey)\n if (prior) {\n throw new Error(\n `compareOptimizationMethods: method names '${prior}' and '${method.name}' map to the same run path '${pathKey}'`,\n )\n }\n pathOwners.set(pathKey, method.name)\n }\n}\n\nfunction assertComparisonPartitions<TScenario extends Scenario, TArtifact>(\n opts: CompareOptimizationMethodsOptions<TScenario, TArtifact>,\n): void {\n const partitions: Array<{\n name: 'trainScenarios' | 'selectionScenarios' | 'testScenarios'\n scenarios: TScenario[] | undefined\n }> = [\n { name: 'trainScenarios', scenarios: opts.trainScenarios },\n { name: 'selectionScenarios', scenarios: opts.selectionScenarios },\n { name: 'testScenarios', scenarios: opts.testScenarios },\n ]\n\n const owner = new Map<string, string>()\n for (const partition of partitions) {\n if (!Array.isArray(partition.scenarios) || partition.scenarios.length === 0) {\n throw new Error(`compareOptimizationMethods: ${partition.name} is empty`)\n }\n if (partition.name === 'testScenarios' && partition.scenarios.length < 2) {\n throw new Error(\n 'compareOptimizationMethods: testScenarios requires at least 2 scenarios to estimate uncertainty',\n )\n }\n const local = new Set<string>()\n const duplicates = new Set<string>()\n const overlaps = new Map<string, string>()\n for (const scenario of partition.scenarios) {\n if (local.has(scenario.id)) duplicates.add(scenario.id)\n local.add(scenario.id)\n const prior = owner.get(scenario.id)\n if (prior !== undefined && prior !== partition.name) overlaps.set(scenario.id, prior)\n }\n if (duplicates.size > 0) {\n throw new Error(\n `compareOptimizationMethods: ${partition.name} contains duplicate scenario id(s) [${[\n ...duplicates,\n ].join(', ')}]`,\n )\n }\n if (overlaps.size > 0) {\n const detail = [...overlaps]\n .map(([id, prior]) => `${id} (${prior} ∩ ${partition.name})`)\n .join(', ')\n throw new Error(\n `compareOptimizationMethods: trainScenarios, selectionScenarios, and testScenarios must be pairwise disjoint; overlap: [${detail}]`,\n )\n }\n assertCampaignDesign(partition.scenarios, opts.reps ?? 1)\n for (const id of local) owner.set(id, partition.name)\n }\n}\n\nfunction slug(name: string): string {\n return (\n name\n .replace(/[^a-z0-9]+/gi, '-')\n .replace(/^-|-$/g, '')\n .toLowerCase() || 'method'\n )\n}\n\nfunction createOptimizationMethodInput<TScenario extends Scenario, TArtifact>(\n opts: CompareOptimizationMethodsOptions<TScenario, TArtifact>,\n methodName: string,\n resolvedRunDir: string,\n seed: number,\n baselineSurface: MutableSurface,\n costLedger: CostLedgerHandle,\n optimizationSignal: AbortSignal,\n): OptimizationMethodInput<TScenario, TArtifact> {\n const methodRunDir = `${resolvedRunDir}/optimization/${slug(methodName)}`\n const signal = combineAbortSignals(\n opts.signal,\n opts.optimizationRunOptions?.signal,\n optimizationSignal,\n )\n return Object.freeze({\n baselineSurface: structuredClone(baselineSurface),\n trainScenarios: opts.trainScenarios,\n selectionScenarios: opts.selectionScenarios,\n dispatchWithSurface: opts.dispatchWithSurface,\n judges: opts.judges,\n runDir: methodRunDir,\n seed,\n runOptions: Object.freeze({\n ...(opts.optimizationRunOptions ?? {}),\n ...(opts.optimizationRunOptions?.dispatchRef === undefined && opts.dispatchRef !== undefined\n ? { dispatchRef: opts.dispatchRef }\n : {}),\n ...(signal ? { signal } : {}),\n }),\n costLedger,\n })\n}\n\nfunction callerDispatchRef<TScenario extends Scenario, TArtifact>(\n opts: CompareOptimizationMethodsOptions<TScenario, TArtifact>,\n): string {\n return (opts.dispatchRef ?? opts.dispatchWithSurface.name) || 'anonymous'\n}\n","import {\n assertJsonValue,\n assertNoCredentialValues,\n resolveExternalOptimizerCallbackLimits,\n} from './external-optimizer-process'\nimport { snapshotExternalOptimizerRunner } from './external-optimizer-run-config'\nimport { assertOptimizerModel, snapshotOptimizerModel } from './optimizer-model'\nimport type { SkillOptOptimizationMethodConfig } from './skillopt-optimization-method'\nimport type { Scenario } from './types'\n\nexport const SKILLOPT_DEFAULT_MAX_CANDIDATE_CHARS = 200_000\nexport const SKILLOPT_DEFAULT_MAX_EVIDENCE_CHARS = 100_000\nexport const SKILLOPT_DEFAULT_TIMEOUT_MS = 60 * 60 * 1000\n\nconst MAX_TIMER_DELAY_MS = 2_147_483_647\n\nexport function snapshotSkillOptOptimizationConfig<TScenario extends Scenario, TArtifact>(\n config: SkillOptOptimizationMethodConfig<TScenario, TArtifact>,\n): SkillOptOptimizationMethodConfig<TScenario, TArtifact> {\n const runner = snapshotExternalOptimizerRunner(config.runner)\n return {\n ...config,\n trainer: structuredClone(config.trainer),\n optimizer: snapshotOptimizerModel(config.optimizer),\n ...(config.evaluationCallbackLimits\n ? { evaluationCallbackLimits: { ...config.evaluationCallbackLimits } }\n : {}),\n ...(runner ? { runner } : {}),\n }\n}\n\nexport function assertSkillOptOptimizationConfig<TScenario extends Scenario, TArtifact>(\n config: SkillOptOptimizationMethodConfig<TScenario, TArtifact>,\n): void {\n if (!config.trainer || typeof config.trainer !== 'object') {\n throw new Error('skillOptOptimizationMethod: trainer is required')\n }\n if (\n config.name !== undefined &&\n (typeof config.name !== 'string' || !config.name.trim() || config.name.trim() !== config.name)\n ) {\n throw new Error('skillOptOptimizationMethod: name must be trimmed and non-empty')\n }\n if (\n config.background !== undefined &&\n (typeof config.background !== 'string' ||\n !config.background.trim() ||\n config.background.trim() !== config.background)\n ) {\n throw new Error('skillOptOptimizationMethod: background must be trimmed and non-empty')\n }\n for (const [label, value] of [\n ['objective', config.objective],\n ['evaluationId', config.evaluationId],\n ] as const) {\n if (typeof value !== 'string' || !value.trim() || value.trim() !== value) {\n throw new Error(`skillOptOptimizationMethod: ${label} must be trimmed and non-empty`)\n }\n }\n assertPositiveSafeInteger(config.trainer.epochs, 'trainer.epochs')\n assertPositiveSafeInteger(config.trainer.batchSize, 'trainer.batchSize')\n assertPositiveSafeInteger(config.maxEvaluations, 'maxEvaluations')\n for (const [label, value] of [\n ['trainer.accumulation', config.trainer.accumulation],\n ['trainer.editBudget', config.trainer.editBudget],\n ['trainer.minEditBudget', config.trainer.minEditBudget],\n ['trainer.analystWorkers', config.trainer.analystWorkers],\n ['trainer.minibatchSize', config.trainer.minibatchSize],\n ['trainer.mergeBatchSize', config.trainer.mergeBatchSize],\n ['trainer.maxAnalystRounds', config.trainer.maxAnalystRounds],\n ['trainer.evaluationWorkers', config.trainer.evaluationWorkers],\n ['maxCandidateChars', config.maxCandidateChars],\n ['maxEvidenceChars', config.maxEvidenceChars],\n ['timeoutMs', config.timeoutMs],\n ] as const) {\n if (value !== undefined) assertPositiveSafeInteger(value, label)\n }\n if (config.timeoutMs !== undefined && config.timeoutMs > MAX_TIMER_DELAY_MS) {\n throw new Error(`skillOptOptimizationMethod: timeoutMs must not exceed ${MAX_TIMER_DELAY_MS}`)\n }\n if (\n config.trainer.minEditBudget !== undefined &&\n config.trainer.editBudget !== undefined &&\n config.trainer.minEditBudget > config.trainer.editBudget\n ) {\n throw new Error(\n 'skillOptOptimizationMethod: trainer.minEditBudget must not exceed trainer.editBudget',\n )\n }\n assertOptionalEnum(\n config.trainer.learningRateSchedule,\n ['constant', 'linear', 'cosine', 'autonomous'],\n 'trainer.learningRateSchedule',\n )\n assertOptionalEnum(\n config.trainer.learningRateControl,\n ['fixed', 'autonomous', 'none'],\n 'trainer.learningRateControl',\n )\n assertOptionalEnum(\n config.trainer.updateMode,\n ['patch', 'rewrite_from_suggestions', 'full_rewrite_minibatch'],\n 'trainer.updateMode',\n )\n for (const [label, value] of [\n ['trainer.failureOnly', config.trainer.failureOnly],\n ['trainer.useSlowUpdate', config.trainer.useSlowUpdate],\n ['trainer.useMetaSkill', config.trainer.useMetaSkill],\n ] as const) {\n if (value !== undefined && typeof value !== 'boolean') {\n throw new Error(`skillOptOptimizationMethod: ${label} must be a boolean`)\n }\n }\n if (\n config.hardScoreThreshold !== undefined &&\n (!Number.isFinite(config.hardScoreThreshold) ||\n config.hardScoreThreshold < 0 ||\n config.hardScoreThreshold > 1)\n ) {\n throw new Error('skillOptOptimizationMethod: hardScoreThreshold must be in [0, 1]')\n }\n if (\n config.resume !== undefined &&\n config.resume !== 'never' &&\n config.resume !== 'if-compatible' &&\n config.resume !== 'required'\n ) {\n throw new Error(\n \"skillOptOptimizationMethod: resume must be 'never', 'if-compatible', or 'required'\",\n )\n }\n assertJsonValue(config.trainer.overrides ?? {}, 'skillOptOptimizationMethod: trainer.overrides')\n assertNoCredentialValues(\n config.trainer.overrides ?? {},\n 'skillOptOptimizationMethod: trainer.overrides',\n 'optimizer',\n )\n assertOptimizerModel(config.optimizer, 'skillOptOptimizationMethod: optimizer')\n resolveExternalOptimizerCallbackLimits(\n config.evaluationCallbackLimits,\n 'skillOptOptimizationMethod: evaluationCallbackLimits',\n )\n const evidenceLimit = config.maxEvidenceChars ?? SKILLOPT_DEFAULT_MAX_EVIDENCE_CHARS\n if (\n JSON.stringify(config.objective).length > evidenceLimit ||\n JSON.stringify(config.background ?? '').length > evidenceLimit\n ) {\n throw new Error(\n 'skillOptOptimizationMethod: objective and background must each fit maxEvidenceChars',\n )\n }\n}\n\nfunction assertPositiveSafeInteger(value: number, label: string): void {\n if (!Number.isSafeInteger(value) || value <= 0) {\n throw new Error(`skillOptOptimizationMethod: ${label} must be a positive safe integer`)\n }\n}\n\nfunction assertOptionalEnum<T extends string>(\n value: T | undefined,\n allowed: readonly T[],\n label: string,\n): void {\n if (value !== undefined && !allowed.includes(value)) {\n throw new Error(`skillOptOptimizationMethod: ${label} must be one of ${allowed.join(', ')}`)\n }\n}\n","import type { ExternalOptimizerTokenUsage } from './external-optimizer-accounting'\nimport { assertExternalOptimizerTokenUsage } from './external-optimizer-accounting'\nimport { isCandidateText } from './external-optimizer-process'\nimport {\n assertExternalOptimizerPackageIdentity,\n assertExternalOptimizerSourceDetails,\n type ExternalOptimizerPackageSource,\n} from './external-optimizer-source'\n\nexport interface SkillOptBridgeOutput {\n bestCandidate: string\n bestScore: number\n totalEvaluations: number\n totalSteps: number\n tokenUsage?: ExternalOptimizerTokenUsage\n upstream: ExternalOptimizerPackageSource<'skillopt'>\n runId: string\n resumed: boolean\n}\n\nexport function assertSkillOptBridgeOutput(\n result: SkillOptBridgeOutput,\n name: string,\n maxCandidateChars: number,\n maxEvaluations: number,\n): asserts result is SkillOptBridgeOutput {\n if (!isCandidateText(result.bestCandidate, maxCandidateChars)) {\n throw new Error(`${name}: SkillOpt bridge returned an invalid candidate`)\n }\n if (!Number.isFinite(result.bestScore) || result.bestScore < 0 || result.bestScore > 1) {\n throw new Error(`${name}: SkillOpt bridge returned an invalid bestScore`)\n }\n if (\n !Number.isSafeInteger(result.totalEvaluations) ||\n result.totalEvaluations < 0 ||\n result.totalEvaluations > maxEvaluations\n ) {\n throw new Error(`${name}: SkillOpt bridge returned invalid totalEvaluations`)\n }\n if (!Number.isSafeInteger(result.totalSteps) || result.totalSteps < 0) {\n throw new Error(`${name}: SkillOpt bridge returned invalid totalSteps`)\n }\n assertExternalOptimizerPackageIdentity(result.upstream, 'skillopt', name, 'SkillOpt')\n if (\n typeof result.runId !== 'string' ||\n result.runId.length === 0 ||\n result.runId !== result.runId.trim()\n ) {\n throw new Error(`${name}: SkillOpt bridge returned an invalid runId`)\n }\n if (typeof result.resumed !== 'boolean') {\n throw new Error(`${name}: SkillOpt bridge returned an invalid resumed flag`)\n }\n assertExternalOptimizerSourceDetails(result.upstream, name, 'SkillOpt')\n assertExternalOptimizerTokenUsage(result.tokenUsage, name, 'SkillOpt')\n}\n","import { randomBytes } from 'node:crypto'\nimport { mkdir } from 'node:fs/promises'\nimport {\n assertExternalOptimizerCompletionCount,\n assertPriorExternalOptimizerUsage,\n} from './external-optimizer-accounting'\nimport {\n openExternalOptimizerExecutionLog,\n openExternalOptimizerObservationLog,\n readExternalOptimizerObservationArtifact,\n} from './external-optimizer-observations'\nimport {\n closeExternalOptimizerResources,\n type ExternalOptimizerCallbackLimits,\n type ExternalOptimizerModelProxy,\n type ExternalOptimizerResumeMode,\n type ExternalOptimizerRunnerCommand,\n removeCredentialEnvironment,\n resolveExternalOptimizerCallbackLimits,\n runExternalOptimizerProcess,\n runWithCleanup,\n startExternalOptimizerCallback,\n startExternalOptimizerModelProxy,\n} from './external-optimizer-process'\nimport {\n type ExternalOptimizerRunBudget,\n externalOptimizerCompatibleRunKey,\n externalOptimizerRunKey,\n openExternalOptimizerRunBudget,\n} from './external-optimizer-run-budget'\nimport { externalOptimizerRunnerIdentity, snapshotJson } from './external-optimizer-run-config'\nimport {\n assertExternalOptimizerRunBinding,\n inspectExternalOptimizerRuntime,\n observedExternalOptimizerRuntime,\n} from './external-optimizer-runtime'\nimport {\n createExternalTextEvaluator,\n describeExternalScenario,\n mapExternalScenarios,\n} from './external-text-optimization'\nimport { recordSkillOptSearch } from './gepa-search-import'\nimport {\n combineComparisonCosts,\n costFromLedgerSummary,\n optimizationTokenUsageFromSummary,\n} from './optimization-cost'\nimport type {\n OptimizationMethod,\n OptimizationMethodInput,\n OptimizationMethodResult,\n} from './optimization-method'\nimport type { OpenAICompatibleOptimizerModel } from './optimizer-model'\nimport type { SearchRunIdentity } from './search-ledger-recording'\nimport {\n assertSkillOptOptimizationConfig,\n SKILLOPT_DEFAULT_MAX_CANDIDATE_CHARS,\n SKILLOPT_DEFAULT_MAX_EVIDENCE_CHARS,\n SKILLOPT_DEFAULT_TIMEOUT_MS,\n snapshotSkillOptOptimizationConfig,\n} from './skillopt-optimization-config'\nimport {\n assertSkillOptBridgeOutput,\n type SkillOptBridgeOutput,\n} from './skillopt-optimization-result'\nimport { type CampaignStorage, fsCampaignStorage } from './storage'\nimport type { Scenario } from './types'\n\nexport interface SkillOptTrainerConfig {\n epochs: number\n batchSize: number\n accumulation?: number\n editBudget?: number\n minEditBudget?: number\n analystWorkers?: number\n minibatchSize?: number\n mergeBatchSize?: number\n maxAnalystRounds?: number\n evaluationWorkers?: number\n learningRateSchedule?: 'constant' | 'linear' | 'cosine' | 'autonomous'\n learningRateControl?: 'fixed' | 'autonomous' | 'none'\n updateMode?: 'patch' | 'rewrite_from_suggestions' | 'full_rewrite_minibatch'\n failureOnly?: boolean\n useSlowUpdate?: boolean\n useMetaSkill?: boolean\n /**\n * Additional flat SkillOpt trainer settings. Tangle overwrites data,\n * output, split, seed, validation, and activation settings.\n */\n overrides?: Record<string, unknown>\n}\n\nexport type SkillOptRunnerCommand = ExternalOptimizerRunnerCommand\n\nexport interface SkillOptOptimizationMethodConfig<TScenario extends Scenario, TArtifact = unknown> {\n name?: string\n /** Goal included with every described train and selection case. */\n objective: string\n background?: string\n /** Stable identity for the dispatch, judges, model settings, and scoring logic. */\n evaluationId: string\n trainer: SkillOptTrainerConfig\n /**\n * OpenAI-compatible model connection and hard limits for SkillOpt's own\n * optimizer calls.\n */\n optimizer: OpenAICompatibleOptimizerModel\n /** Hard cap on candidate-case callback requests. */\n maxEvaluations: number\n /** Scores at or above this value count as hard successes. Default: 1. */\n hardScoreThreshold?: number\n maxCandidateChars?: number\n /** Maximum serialized scenario plus evaluation evidence. Default: 100,000. */\n maxEvidenceChars?: number\n /** Candidate-evaluation callback byte limits. Omitted fields use finite defaults. */\n evaluationCallbackLimits?: Partial<ExternalOptimizerCallbackLimits>\n timeoutMs?: number\n describeScenario?: (scenario: TScenario) => unknown\n describeArtifact?: (artifact: TArtifact, scenario: TScenario) => unknown\n resume?: ExternalOptimizerResumeMode\n runner?: SkillOptRunnerCommand\n /**\n * Record SkillOpt's search into a search ledger and return the bounded\n * receipt on the method result, so a comparison under `searchHistoryPolicy:\n * 'require-complete'` accepts this method. Every candidate the callback\n * evaluated becomes a node with an `unknown` edge (SkillOpt reports no\n * parents), and every evaluation becomes a cell.\n *\n * `identity` declares the immutable revisions and the model the ledger\n * requires and the bridge does not report. `path` defaults to\n * `<runDir>/search-ledger.jsonl`.\n */\n searchLedger?: { identity: SearchRunIdentity; path?: string }\n}\n\ntype SkillOptInput<TScenario extends Scenario, TArtifact> = OptimizationMethodInput<\n TScenario,\n TArtifact\n>\ntype SkillOptConfig<TScenario extends Scenario, TArtifact> = SkillOptOptimizationMethodConfig<\n TScenario,\n TArtifact\n>\n\n/** Everything the SkillOpt steps share once the run is prepared and its callback is listening. */\ninterface SkillOptRunContext<TScenario extends Scenario, TArtifact> {\n config: SkillOptConfig<TScenario, TArtifact>\n input: SkillOptInput<TScenario, TArtifact>\n name: string\n signal: AbortSignal | undefined\n started: number\n maxCandidateChars: number\n maxEvidenceChars: number\n storage: CampaignStorage\n runDir: string\n attemptId: string\n resume: ExternalOptimizerResumeMode\n bridgeRunner: SkillOptRunnerCommand | undefined\n runtimeIdentity: Awaited<ReturnType<typeof inspectExternalOptimizerRuntime>>\n trainSet: ReturnType<typeof describeExternalScenario>[]\n selectionSet: ReturnType<typeof describeExternalScenario>[]\n compatibleRunId: string\n runId: string\n runBudget: ExternalOptimizerRunBudget\n observationLog: ReturnType<typeof openExternalOptimizerObservationLog>\n executionLog: ReturnType<typeof openExternalOptimizerExecutionLog>\n callback: Awaited<ReturnType<typeof startExternalOptimizerCallback>>\n}\n\n/** Run Microsoft's SkillOpt trainer as a complete optimization method. */\nexport function skillOptOptimizationMethod<TScenario extends Scenario, TArtifact>(\n config: SkillOptOptimizationMethodConfig<TScenario, TArtifact>,\n): OptimizationMethod<TScenario, TArtifact> {\n assertSkillOptOptimizationConfig(config)\n config = snapshotSkillOptOptimizationConfig(config)\n const snapshot = config\n const name = snapshot.name ?? 'skillopt'\n return {\n name,\n optimize: (input) => optimizeWithSkillOpt(snapshot, name, input),\n }\n}\n\nasync function optimizeWithSkillOpt<TScenario extends Scenario, TArtifact>(\n config: SkillOptConfig<TScenario, TArtifact>,\n name: string,\n input: SkillOptInput<TScenario, TArtifact>,\n): Promise<OptimizationMethodResult> {\n const signal = input.runOptions.signal\n signal?.throwIfAborted()\n if (typeof input.baselineSurface !== 'string') {\n throw new Error(`${name}: SkillOpt requires a string baselineSurface`)\n }\n const context = await prepareSkillOptRun(config, name, input)\n const { result, outputDir, modelProxy } = await runSkillOptBridge(context)\n signal?.throwIfAborted()\n return finishSkillOptRun(context, result, outputDir, modelProxy)\n}\n\n/** Resolve identities, open the run's budget and logs, and start the evaluation callback. */\nasync function prepareSkillOptRun<TScenario extends Scenario, TArtifact>(\n config: SkillOptConfig<TScenario, TArtifact>,\n name: string,\n input: SkillOptInput<TScenario, TArtifact>,\n): Promise<SkillOptRunContext<TScenario, TArtifact>> {\n const signal = input.runOptions.signal\n const started = Date.now()\n const maxCandidateChars = config.maxCandidateChars ?? SKILLOPT_DEFAULT_MAX_CANDIDATE_CHARS\n const maxEvidenceChars = config.maxEvidenceChars ?? SKILLOPT_DEFAULT_MAX_EVIDENCE_CHARS\n const storage = input.runOptions.storage ?? fsCampaignStorage()\n const runDir = `${input.runDir}/skillopt`\n storage.ensureDir(runDir)\n const costLedger = input.costLedger\n const attemptId = randomBytes(16).toString('hex')\n const resume = config.resume ?? 'never'\n const bridgeRunner = config.runner\n ? {\n ...config.runner,\n env: removeCredentialEnvironment(config.runner.env ?? {}),\n }\n : undefined\n const runtimeIdentity = await inspectExternalOptimizerRuntime({\n label: name,\n package: 'skillopt',\n module: 'agent_eval_rpc.skillopt_bridge',\n ...(bridgeRunner ? { runner: bridgeRunner } : {}),\n timeoutMs: config.timeoutMs ?? SKILLOPT_DEFAULT_TIMEOUT_MS,\n ...(signal ? { signal } : {}),\n })\n const trainSet = input.trainScenarios.map((scenario) =>\n describeExternalScenario(scenario, 'SkillOpt', maxEvidenceChars, config.describeScenario),\n )\n const selectionSet = input.selectionScenarios.map((scenario) =>\n describeExternalScenario(scenario, 'SkillOpt', maxEvidenceChars, config.describeScenario),\n )\n const runMaterial = {\n optimizer: 'skillopt',\n runtime: runtimeIdentity,\n method: name,\n evaluationId: config.evaluationId,\n dispatchRef: input.runOptions.dispatchRef ?? null,\n seed: input.seed,\n trainer: snapshotJson(config.trainer, 'SkillOpt run settings'),\n objective: config.objective,\n background: config.background ?? '',\n optimizerModel: {\n model: config.optimizer.model,\n callRef: config.optimizer.callRef,\n budget: config.optimizer.budget,\n },\n seedCandidate: input.baselineSurface,\n trainSet,\n selectionSet,\n maxEvaluations: config.maxEvaluations,\n hardScoreThreshold: config.hardScoreThreshold ?? 1,\n maxCandidateChars,\n maxEvidenceChars,\n evaluationCallbackLimits: resolveExternalOptimizerCallbackLimits(\n config.evaluationCallbackLimits,\n ),\n runner: externalOptimizerRunnerIdentity(bridgeRunner, 'agent_eval_rpc.skillopt_bridge'),\n }\n const compatibleRunId = externalOptimizerCompatibleRunKey(runMaterial)\n const runId = externalOptimizerRunKey({\n material: runMaterial,\n attemptId,\n resumeEnabled: resume !== 'never',\n })\n const runBudget = openExternalOptimizerRunBudget({\n storage,\n runDir,\n runKey: runId,\n attemptId,\n maxEvaluations: config.maxEvaluations,\n })\n const observationLog = openExternalOptimizerObservationLog({\n storage,\n path: `${runDir}/observations-${attemptId}.jsonl`,\n })\n const executionLog = openExternalOptimizerExecutionLog({\n storage,\n path: `${runDir}/model-executions-${attemptId}.jsonl`,\n })\n const scenarioById = mapExternalScenarios(\n input.trainScenarios,\n input.selectionScenarios,\n 'SkillOpt bridge',\n )\n const evaluate = createExternalTextEvaluator({\n input,\n label: 'SkillOpt bridge',\n runDir,\n compatibleRunId: runId,\n costPhase: 'skillopt.external-evaluation',\n costTags: runBudget.attemptTags,\n costLedger,\n scenarioById,\n maxCandidateChars,\n maxEvidenceChars,\n describeArtifact: config.describeArtifact,\n })\n let attemptEvaluationCount = 0\n const callback = await startExternalOptimizerCallback({\n token: randomBytes(32).toString('hex'),\n maxEvaluations: config.maxEvaluations,\n acceptEvaluation: () => {\n const accepted = runBudget.acceptEvaluation()\n if (accepted === undefined) return undefined\n attemptEvaluationCount += 1\n return attemptEvaluationCount\n },\n evaluate,\n observe: observationLog.observe,\n ...(config.evaluationCallbackLimits ? { limits: config.evaluationCallbackLimits } : {}),\n ...(signal ? { signal } : {}),\n })\n return {\n config,\n input,\n name,\n signal,\n started,\n maxCandidateChars,\n maxEvidenceChars,\n storage,\n runDir,\n attemptId,\n resume,\n bridgeRunner,\n runtimeIdentity,\n trainSet,\n selectionSet,\n compatibleRunId,\n runId,\n runBudget,\n observationLog,\n executionLog,\n callback,\n }\n}\n\n/** Start the metered model proxy and run the Python bridge, always closing the callback and proxy. */\nasync function runSkillOptBridge<TScenario extends Scenario, TArtifact>(\n context: SkillOptRunContext<TScenario, TArtifact>,\n): Promise<{\n result: SkillOptBridgeOutput\n outputDir: string\n modelProxy: ExternalOptimizerModelProxy\n}> {\n const { config, input, name, signal, runDir, runBudget, callback } = context\n const costLedger = input.costLedger\n const runnerEnv = context.bridgeRunner?.env ?? {}\n let activeModelProxy: ExternalOptimizerModelProxy | undefined\n const closeResources = () =>\n closeExternalOptimizerResources({\n label: name,\n callback,\n ...(activeModelProxy ? { modelProxy: activeModelProxy } : {}),\n })\n return runWithCleanup({\n label: `${name} optimizer resources`,\n run: async () => {\n const priorOptimizerUsage = costLedger.summary({\n phase: 'skillopt.optimizer-model',\n tags: runBudget.runTags,\n })\n assertPriorExternalOptimizerUsage(priorOptimizerUsage, config.optimizer.budget, name)\n const modelProxy = await startExternalOptimizerModelProxy({\n call: config.optimizer.call,\n callRef: config.optimizer.callRef,\n recordExecution: context.executionLog.observe,\n model: config.optimizer.model,\n budget: config.optimizer.budget,\n ...(config.optimizer.servedModelPolicy\n ? { servedModelPolicy: config.optimizer.servedModelPolicy }\n : {}),\n costLedger,\n phase: 'skillopt.optimizer-model',\n actor: name,\n tags: { ...runBudget.attemptTags },\n initialUsage: {\n requests: priorOptimizerUsage.totalCalls,\n ...(priorOptimizerUsage.costProvenance.kind === 'uncaptured'\n ? {}\n : { costUsd: priorOptimizerUsage.totalCostUsd }),\n },\n ...(signal ? { signal } : {}),\n })\n activeModelProxy = modelProxy\n const outputDir = `${runDir}/external`\n await mkdir(outputDir, { recursive: true })\n const result = await runExternalOptimizerProcess<SkillOptBridgeOutput>({\n label: 'SkillOpt bridge',\n tempPrefix: 'agent-eval-skillopt-',\n module: 'agent_eval_rpc.skillopt_bridge',\n input: {\n attemptId: context.attemptId,\n compatibleRunId: context.compatibleRunId,\n runId: context.runId,\n runtimeIdentity: context.runtimeIdentity,\n resume: context.resume,\n evaluationId: config.evaluationId,\n seed: input.seed,\n callbackUrl: callback.url,\n callbackToken: callback.token,\n objective: config.objective,\n ...(config.background ? { background: config.background } : {}),\n trainer: config.trainer,\n optimizerModel: config.optimizer.model,\n modelBudget: config.optimizer.budget,\n seedCandidate: input.baselineSurface,\n trainSet: context.trainSet,\n selectionSet: context.selectionSet,\n maxEvaluations: config.maxEvaluations,\n hardScoreThreshold: config.hardScoreThreshold ?? 1,\n maxCandidateChars: context.maxCandidateChars,\n maxEvidenceChars: context.maxEvidenceChars,\n outputDir,\n },\n runner: {\n ...context.bridgeRunner,\n env: {\n ...removeCredentialEnvironment(runnerEnv),\n ...skillOptModelEnvironment(config, modelProxy),\n },\n },\n timeoutMs: config.timeoutMs ?? SKILLOPT_DEFAULT_TIMEOUT_MS,\n ...(signal ? { signal } : {}),\n })\n return { result, outputDir, modelProxy }\n },\n cleanup: closeResources,\n })\n}\n\n/** Point every OpenAI-compatible client the bridge uses at the metered model proxy. */\nfunction skillOptModelEnvironment<TScenario extends Scenario, TArtifact>(\n config: SkillOptConfig<TScenario, TArtifact>,\n modelProxy: ExternalOptimizerModelProxy,\n): Record<string, string> {\n const maxTokens = String(config.optimizer.budget.maxOutputTokensPerRequest)\n return {\n OPENAI_COMPATIBLE_BASE_URL: modelProxy.baseUrl,\n OPENAI_COMPATIBLE_API_KEY: modelProxy.apiKey,\n OPTIMIZER_OPENAI_COMPATIBLE_BASE_URL: modelProxy.baseUrl,\n OPTIMIZER_OPENAI_COMPATIBLE_API_KEY: modelProxy.apiKey,\n TARGET_OPENAI_COMPATIBLE_BASE_URL: modelProxy.baseUrl,\n TARGET_OPENAI_COMPATIBLE_API_KEY: modelProxy.apiKey,\n OPENAI_COMPATIBLE_MODEL: config.optimizer.model,\n OPENAI_COMPATIBLE_MAX_TOKENS: maxTokens,\n OPTIMIZER_OPENAI_COMPATIBLE_MODEL: config.optimizer.model,\n OPTIMIZER_OPENAI_COMPATIBLE_MAX_TOKENS: maxTokens,\n TARGET_OPENAI_COMPATIBLE_MODEL: config.optimizer.model,\n TARGET_OPENAI_COMPATIBLE_MAX_TOKENS: maxTokens,\n }\n}\n\n/** Validate the bridge output against the run, total its spend, and build the method result. */\nasync function finishSkillOptRun<TScenario extends Scenario, TArtifact>(\n context: SkillOptRunContext<TScenario, TArtifact>,\n result: SkillOptBridgeOutput,\n outputDir: string,\n modelProxy: ExternalOptimizerModelProxy,\n): Promise<OptimizationMethodResult> {\n const { config, input, name, runBudget, callback, observationLog, executionLog } = context\n const { runtimeIdentity, compatibleRunId, runId } = context\n const costLedger = input.costLedger\n assertSkillOptBridgeOutput(result, name, context.maxCandidateChars, config.maxEvaluations)\n assertExternalOptimizerRunBinding({\n label: name,\n runtime: runtimeIdentity,\n returnedSource: result.upstream,\n compatibleRunId,\n runId,\n returnedRunId: result.runId,\n resume: context.resume,\n resumed: result.resumed,\n })\n if (callback.evaluations() !== result.totalEvaluations) {\n throw new Error(\n `${name}: SkillOpt reported ${result.totalEvaluations} evaluations but the callback received ${callback.evaluations()}`,\n )\n }\n\n const evaluationCost = costFromLedgerSummary(\n costLedger.summary({\n phase: 'skillopt.external-evaluation',\n tags: runBudget.runTags,\n }),\n )\n const optimizerUsage = costLedger.summary({\n phase: 'skillopt.optimizer-model',\n tags: runBudget.runTags,\n })\n const optimizerReceipts = costLedger.list({\n phase: 'skillopt.optimizer-model',\n tags: runBudget.runTags,\n })\n const optimizerCost = costFromLedgerSummary(optimizerUsage)\n modelProxy.assertExecutionComplete()\n assertExternalOptimizerCompletionCount(\n result.tokenUsage,\n modelProxy.requestAttempts(),\n modelProxy.successfulCompletions(),\n name,\n 'SkillOpt',\n )\n const tokenUsage = optimizationTokenUsageFromSummary(optimizerUsage, optimizerReceipts)\n const runtime = observedExternalOptimizerRuntime(runtimeIdentity)\n const combinedCost = combineComparisonCosts([\n { label: 'evaluation', cost: evaluationCost },\n { label: 'optimizer model', cost: optimizerCost },\n ])\n const searchHistory = config.searchLedger\n ? await recordSkillOptSearch({\n name,\n path: config.searchLedger.path ?? `${context.runDir}/search-ledger.jsonl`,\n searchId: runId,\n identity: config.searchLedger.identity,\n storage: context.storage,\n seed: input.seed,\n baselineSurface: input.baselineSurface as string,\n trainScenarios: input.trainScenarios,\n selectionScenarios: input.selectionScenarios,\n evaluationLimit: config.maxEvaluations,\n observations: readExternalOptimizerObservationArtifact({\n summary: observationLog.summary(),\n storage: context.storage,\n }),\n selected: result.bestCandidate,\n // The model proxy metered every optimizer call, so its receipts are the spend.\n generationAccounting: {\n tokens: optimizerUsage.usageComplete\n ? {\n status: 'known',\n inputTokens: optimizerUsage.inputTokens,\n outputTokens: optimizerUsage.outputTokens,\n cachedTokens: optimizerUsage.cachedTokens,\n }\n : { status: 'unknown', reason: 'an optimizer call reported no token usage' },\n cost: optimizerCost.accountingComplete\n ? { status: 'known', usd: optimizerCost.totalCostUsd, source: 'provider' }\n : {\n status: 'unknown',\n knownLowerBoundUsd: optimizerCost.totalCostUsd,\n reason: optimizerCost.incompleteReasons.join('; ') || 'optimizer spend incomplete',\n },\n },\n })\n : undefined\n return {\n winnerSurface: result.bestCandidate,\n ...(searchHistory ? { searchHistory } : {}),\n cost: combinedCost,\n durationMs: Date.now() - context.started,\n provenance: {\n ...runtime,\n optimizerModel: config.optimizer.model,\n optimizerCallRef: config.optimizer.callRef,\n compatibleRunId,\n runId,\n resumed: result.resumed,\n evaluationCount: runBudget.acceptedEvaluations(),\n artifactDir: outputDir,\n ...(tokenUsage ? { tokenUsage } : {}),\n observations: observationLog.summary(),\n modelExecutions: executionLog.summary(),\n },\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4DA,SAAgB,yCAAyC,OAGhB;CACvC,MAAM,EAAE,YAAY;CACpB,yBAAyB,OAAO;CAChC,MAAM,UAAU,MAAM,WAAW,kBAAkB;CACnD,MAAM,WAAW,QAAQ,KAAK,QAAQ,IAAI;CAC1C,IAAI,aAAa,KAAA,GAAW;EAC1B,MAAM,QAAQ,QAAQ,OAAO,QAAQ,IAAI,IAAI,eAAe;EAC5D,MAAM,IAAI,MAAM,8CAA8C,MAAM,OAAO,QAAQ,KAAK,EAAE;CAC5F;CACA,MAAM,SAAS,UAAU,WAAW,QAAQ,CAAC,CAAC,OAAO,QAAQ,CAAC,CAAC,OAAO,KAAK;CAC3E,IAAI,WAAW,QAAQ,QACrB,MAAM,IAAI,MACR,+DAA+D,QAAQ,KAAK,cAAc,QAAQ,OAAO,QAAQ,QACnH;CAEF,IAAI,SAAS,SAAS,KAAK,CAAC,SAAS,SAAS,IAAI,GAChD,MAAM,IAAI,MACR,uEAAuE,QAAQ,KAAK,EACtF;CAGF,MAAM,eAAe,SAAS,WAAW,IAAI,CAAC,IAAI,sBAAsB,UAAU,QAAQ,IAAI;CAC9F,MAAM,aAAoD,CAAC;CAC3D,MAAM,2BAAW,IAAI,IAAiD;CACtE,MAAM,oCAAoB,IAAI,IAAY;CAC1C,IAAI,cAAc;CAClB,IAAI,oBAAoB;CACxB,IAAI,WAAW;CAEf,KAAK,MAAM,CAAC,OAAO,gBAAgB,aAAa,QAAQ,GAAG;EACzD,IAAI,YAAY,aAAa,QAAQ,GACnC,MAAM,IAAI,MACR,6DAA6D,QAAQ,EAAE,QAAQ,YAAY,UAC7F;EAEF,IAAI,YAAY,SAAS,YAAY;GACnC,wBACE,YAAY,WACZ,YAAY,eACZ,YAAY,QACd;GACA,IAAI,SAAS,IAAI,YAAY,aAAa,GACxC,MAAM,IAAI,MACR,6DAA6D,YAAY,eAC3E;GAEF,MAAM,YAAiD;IACrD,WAAW,gBAAgB,YAAY,SAAS;IAChD,eAAe,YAAY;IAC3B,iBAAiB,UAAU,YAAY;IACvC,kBAAkB,YAAY;IAC9B,YAAY;KAAE,MAAM,QAAQ;KAAM,QAAQ,QAAQ;IAAO;GAC3D;GACA,SAAS,IAAI,YAAY,eAAe,SAAS;GACjD,WAAW,KAAK,SAAS;GACzB;EACF;EAEA,IAAI,YAAY,SAAS,cAAc;GACrC,eAAe;GACf,IAAI,kBAAkB,IAAI,YAAY,gBAAgB,GACpD,MAAM,IAAI,MACR,qEAAqE,YAAY,kBACnF;GAEF,kBAAkB,IAAI,YAAY,gBAAgB;GAClD,wBAAwB,aAAa,QAAQ;GAC7C,gBAAgB,YAAY,UAAU,wCAAwC;GAC9E;EACF;EAEA,YAAY;EACZ,IACE,YAAY,WAAW,qBACvB,YAAY,WAAW,sBACvB,YAAY,WAAW,qBAEvB,MAAM,IAAI,MACR,kFAAkF,YAAY,UAChG;EAEF,IAAI,YAAY,WAAW,qBAAqB,qBAAqB;EACrE,MAAM,kBAAkB,CAAC,YAAY,WAAW,YAAY,aAAa;EACzE,IACE,YAAY,WAAW,qBACvB,gBAAgB,MAAM,UAAU,UAAU,KAAA,CAAS,GAEnD,MAAM,IAAI,MACR,iFAAiF,YAAY,UAC/F;EAEF,IAAI,gBAAgB,MAAM,UAAU,UAAU,KAAA,CAAS,GAAG;GACxD,IAAI,gBAAgB,MAAM,UAAU,UAAU,KAAA,CAAS,GACrD,MAAM,IAAI,MACR,yFAAyF,YAAY,UACvG;GAEF,wBACE,aAIA,QACF;EACF;CACF;CAEA,MAAM,sBAAsB,cAAc;CAC1C,KAAK,MAAM,oBAAoB,mBAC7B,IAAI,mBAAmB,qBACrB,MAAM,IAAI,MACR,8EAA8E,kBAChF;CAIJ,IACE,WAAW,WAAW,QAAQ,uBAC9B,gBAAgB,QAAQ,eACxB,aAAa,QAAQ,UAErB,MAAM,IAAI,MACR,+DAA+D,QAAQ,KAAK,cAC9D,QAAQ,oBAAoB,GAAG,QAAQ,YAAY,GAAG,QAAQ,SAAS,QAC5E,WAAW,OAAO,GAAG,YAAY,GAAG,UAC/C;CAGF,OAAO,wBAAwB;EAC7B,SAAS,gBAAgB,OAAO;EAChC;EACA;CACF,CAAC;AACH;;AAGA,SAAgB,oCAAoC,OAMlD;CAEA,IADiB,MAAM,QAAQ,KAAK,MAAM,IAC/B,MAAM,KAAA,KAAa,MAAM,QAAQ,OAAO,MAAM,IAAI,GAC3D,MAAM,IAAI,MAAM,yDAAyD,MAAM,KAAK,EAAE;CAExF,MAAM,QAAQ,MAAM,MAAM,MAAM,EAAE;CAClC,IAAI,WAAW;CACf,MAAM,SAAS;EAAE,qBAAqB;EAAG,aAAa;EAAG,UAAU;CAAE;CAErE,OAAO;EACL,QAAQ,aAAa;GACnB,MAAM,mBAAmB,OAAO,sBAAsB,OAAO,cAAc,OAAO,WAAW;GAC7F,IAAI,YAAY,aAAa,kBAC3B,MAAM,IAAI,MACR,wDAAwD,iBAAiB,QAAQ,YAAY,UAC/F;GAEF,MAAM,OAAO,GAAG,cAAc,WAAW,EAAE;GAC3C,MAAM,OAAO,MAAM,QAAQ,OAAO,MAAM,MAAM,MAAM,QAAQ;GAC5D,IAAI,SAAS,KAAA,GACX,MAAM,IAAI,MACR,+DAA+D,MAAM,KAAK,EAC5E;GAEF,WAAW;GACX,IAAI,YAAY,SAAS,YAAY,OAAO,uBAAuB;QAC9D,IAAI,YAAY,SAAS,cAAc,OAAO,eAAe;QAC7D,OAAO,YAAY;EAC1B;EACA,UAAU;GACR,MAAM,WAAW,MAAM,QAAQ,KAAK,MAAM,IAAI,KAAK;GACnD,MAAM,QAAQ,IAAI,YAAY,CAAC,CAAC,OAAO,QAAQ;GAC/C,IAAI,MAAM,eAAe,UACvB,MAAM,IAAI,MAAM,2DAA2D,MAAM,KAAK,EAAE;GAE1F,OAAO;IACL,OAAO;IACP,MAAM,MAAM;IACZ,QAAQ,UAAU,WAAW,QAAQ,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,OAAO,KAAK;IACjE,GAAG;GACL;EACF;CACF;AACF;AAEA,SAAS,yBAAyB,SAAoD;CACpF,IAAI,QAAQ,UAAU,iCACpB,MAAM,IAAI,MAAM,6DAA6D;CAE/E,IAAI,OAAO,QAAQ,SAAS,YAAY,QAAQ,KAAK,KAAK,CAAC,CAAC,WAAW,GACrE,MAAM,IAAI,MAAM,4DAA4D;CAE9E,IAAI,CAAC,yBAAyB,KAAK,QAAQ,MAAM,GAC/C,MAAM,IAAI,MAAM,+DAA+D;CAEjF,KAAK,MAAM,CAAC,OAAO,UAAU;EAC3B,CAAC,uBAAuB,QAAQ,mBAAmB;EACnD,CAAC,eAAe,QAAQ,WAAW;EACnC,CAAC,YAAY,QAAQ,QAAQ;CAC/B,GACE,IAAI,CAAC,OAAO,cAAc,KAAK,KAAK,QAAQ,GAC1C,MAAM,IAAI,MACR,0CAA0C,MAAM,gCAClD;AAGN;AAEA,SAAS,sBACP,UACA,MAC0C;CAC1C,OAAO,SACJ,MAAM,GAAG,EAAE,CAAC,CACZ,MAAM,IAAI,CAAC,CACX,KAAK,MAAM,UAAU;EACpB,IAAI;EACJ,IAAI;GACF,cAAc,KAAK,MAAM,IAAI;EAC/B,SAAS,OAAO;GACd,MAAM,IAAI,MACR,gEAAgE,KAAK,SAAS,QAAQ,KACtF,EAAE,MAAM,CACV;EACF;EACA,uBAAuB,aAAa,QAAQ,CAAC;EAC7C,IAAI,cAAc,WAAW,MAAM,MACjC,MAAM,IAAI,MACR,gEAAgE,KAAK,SAAS,QAAQ,GACxF;EAEF,OAAO;CACT,CAAC;AACL;AAEA,SAAS,uBACP,OACA,MACyD;CACzD,IAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,MAAM,QAAQ,KAAK,GACpE,MAAM,IAAI,MAAM,gDAAgD,KAAK,mBAAmB;CAE1F,MAAM,cAAc;CACpB,IAAI,CAAC,OAAO,cAAc,YAAY,QAAQ,KAAK,OAAO,YAAY,QAAQ,KAAK,GACjF,MAAM,IAAI,MAAM,gDAAgD,KAAK,yBAAyB;CAEhG,IAAI,YAAY,SAAS,YAAY;EACnC,gBAAgB,aAAa;GAAC;GAAa;GAAiB;GAAQ;EAAU,GAAG,IAAI;EACrF,sBAAsB,aAAa,IAAI;EACvC;CACF;CACA,IAAI,YAAY,SAAS,cAAc;EACrC,gBACE,aACA;GACE;GACA;GACA;GACA;GACA;GACA;GACA;EACF,GACA,IACF;EACA,sBAAsB,aAAa,IAAI;EACvC,IAAI,OAAO,YAAY,cAAc,UACnC,MAAM,IAAI,MACR,gDAAgD,KAAK,0BACvD;EAEF,IACE,CAAC,OAAO,cAAc,YAAY,gBAAgB,KAClD,OAAO,YAAY,gBAAgB,KAAK,GAExC,MAAM,IAAI,MACR,gDAAgD,KAAK,iCACvD;EAEF,gBAAgB,YAAY,UAAU,gDAAgD,MAAM;EAC5F;CACF;CACA,IAAI,YAAY,SAAS,WAAW;EAElC,kBAAkB,aAAa;GADd;GAAa;GAAiB;GAAa;GAAQ;GAAU;EACzC,GAAG,IAAI;EAC5C,IAAI,OAAO,YAAY,WAAW,UAChC,MAAM,IAAI,MAAM,gDAAgD,KAAK,uBAAuB;EAE9F,IAAI,YAAY,cAAc,KAAA,KAAa,YAAY,kBAAkB,KAAA,GACvE,sBAAsB,aAAa,IAAI;EAEzC,IAAI,YAAY,cAAc,KAAA,KAAa,OAAO,YAAY,cAAc,UAC1E,MAAM,IAAI,MACR,gDAAgD,KAAK,0BACvD;EAEF;CACF;CACA,MAAM,IAAI,MAAM,gDAAgD,KAAK,qBAAqB;AAC5F;AAEA,SAAS,sBAAsB,aAAsC,MAAoB;CACvF,IAAI,CAAC,wBAAwB,YAAY,SAAS,GAChD,MAAM,IAAI,MAAM,gDAAgD,KAAK,0BAA0B;CAEjG,IACE,OAAO,YAAY,kBAAkB,YACrC,CAAC,kBAAkB,KAAK,YAAY,aAAa,GAEjD,MAAM,IAAI,MACR,gDAAgD,KAAK,8BACvD;AAEJ;AAEA,SAAS,gBAAgB,OAAgC,UAAoB,MAAoB;CAC/F,kBAAkB,OAAO,UAAU,IAAI;CACvC,KAAK,MAAM,OAAO,UAChB,IAAI,EAAE,OAAO,QACX,MAAM,IAAI,MAAM,gDAAgD,KAAK,cAAc,KAAK;AAG9F;AAEA,SAAS,kBAAkB,OAAgC,SAAmB,MAAoB;CAChG,MAAM,SAAS,OAAO,KAAK,KAAK,CAAC,CAAC,QAAQ,QAAQ,CAAC,QAAQ,SAAS,GAAG,CAAC;CACxE,IAAI,OAAO,SAAS,GAClB,MAAM,IAAI,MACR,gDAAgD,KAAK,wBAAwB,OAAO,IACtF;AAEJ;AAEA,SAAS,wBACP,WACA,eACA,UACM;CAEN,IAAI,kBADa,YAAY;EAAE,MAAM;EAA2B;CAAU,CAC7C,GAC3B,MAAM,IAAI,MACR,+EAA+E,UACjF;AAEJ;AAEA,SAAS,wBACP,aASA,UACM;CACN,wBAAwB,YAAY,WAAW,YAAY,eAAe,YAAY,QAAQ;CAC9F,MAAM,YAAY,SAAS,IAAI,YAAY,aAAa;CACxD,IAAI,CAAC,WACH,MAAM,IAAI,MACR,0FAA0F,YAAY,UACxG;CAEF,IAAI,CAAC,kBAAkB,YAAY,WAAW,UAAU,SAAS,GAC/D,MAAM,IAAI,MACR,+EAA+E,YAAY,UAC7F;AAEJ;;AAGA,SAAgB,kCAAkC,OAMhD;CAEA,IADiB,MAAM,QAAQ,KAAK,MAAM,IAC/B,MAAM,KAAA,KAAa,MAAM,QAAQ,OAAO,MAAM,IAAI,GAC3D,MAAM,IAAI,MAAM,uDAAuD,MAAM,KAAK,EAAE;CAEtF,MAAM,QAAQ,MAAM,MAAM,MAAM,EAAE;CAClC,IAAI,WAAW;CACf,MAAM,SAAS;EAAE,OAAO;EAAG,WAAW;EAAG,QAAQ;CAAE;CAEnD,OAAO;EACL,QAAQ,aAAa;GACnB,IAAI,YAAY,aAAa,OAAO,QAAQ,GAC1C,MAAM,IAAI,MACR,sDAAsD,OAAO,QAAQ,EAAE,QAAQ,YAAY,UAC7F;GAEF,MAAM,OAAO,GAAG,cAAc,WAAW,EAAE;GAC3C,MAAM,OAAO,MAAM,QAAQ,OAAO,MAAM,MAAM,MAAM,QAAQ;GAC5D,IAAI,SAAS,KAAA,GACX,MAAM,IAAI,MAAM,6DAA6D,MAAM,KAAK,EAAE;GAE5F,WAAW;GACX,OAAO,SAAS;GAChB,IAAI,YAAY,WAAW,OAAO,aAAa;QAC1C,OAAO,UAAU;EACxB;EACA,UAAU;GACR,MAAM,WAAW,MAAM,QAAQ,KAAK,MAAM,IAAI,KAAK;GACnD,MAAM,QAAQ,IAAI,YAAY,CAAC,CAAC,OAAO,QAAQ;GAC/C,IAAI,MAAM,eAAe,UACvB,MAAM,IAAI,MAAM,yDAAyD,MAAM,KAAK,EAAE;GAExF,IAAI,OAAO,UAAU,OAAO,YAAY,OAAO,QAC7C,MAAM,IAAI,MAAM,wDAAwD,MAAM,KAAK,EAAE;GAEvF,OAAO;IACL,OAAO;IACP,MAAM,MAAM;IACZ,QAAQ,UAAU,WAAW,QAAQ,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,OAAO,KAAK;IACjE,GAAG;GACL;EACF;CACF;AACF;;ACjcA,SAAgB,4BAAmE,MAgBtC;CAC3C,MAAM,yBAAS,IAAI,IAAqD;CACxE,OAAO,OAAO,EAAE,WAAW,aAAa,WAAW;EACjD,IAAI,CAAC,KAAK,aAAa,IAAI,SAAS,GAClC,MAAM,IAAI,MAAM,GAAG,KAAK,MAAM,8CAA8C,UAAU,EAAE;EAE1F,MAAM,oBAAoBA,6BAA2B,SAAS;EAC9D,MAAM,UACJ,OAAO,sBAAsB,WACzB,oBACC;GAAE,MAAM;GAAc,YAAY;EAAkB;EAC3D,MAAM,kBACJ,OAAO,sBAAsB,WACzB,kBAAkB,SAClB,KAAK,UAAU,iBAAiB,CAAC,CAAC;EACxC,IACG,OAAO,sBAAsB,YAC5B,CAAC,gBAAgB,mBAAmB,KAAK,iBAAiB,KAC5D,kBAAkB,KAAK,mBAEvB,MAAM,IAAI,MAAM,GAAG,KAAK,MAAM,gCAAgC;EAEhE,MAAM,WAAW,KAAK,aAAa,IAAI,SAAS;EAChD,MAAM,WAAW,GAAG,KAAK,gBAAgB,GAAG,mBAAmB,OAAO,EAAE,GAAG;EAC3E,MAAM,WAAW,OAAO,IAAI,QAAQ;EACpC,IAAI,UAAU,OAAO;EAErB,MAAM,SAAS,iBAAiB;GAC9B,OAAO,KAAK;GACZ,OAAO,KAAK;GACZ,WAAW;GACX;GACA,QAAQ,KAAK;GACb,iBAAiB,KAAK;GACtB,WAAW,KAAK;GAChB,UAAU,KAAK;GACf,YAAY,KAAK;GACjB,kBAAkB,KAAK;GACvB,kBAAkB,KAAK;GACvB;EACF,CAAC;EACD,OAAO,IAAI,UAAU,MAAM;EAC3B,OAAY,MACT,aAAa;GAIZ,IAAI,SAAS,KAAK,WAAW,YAAY,OAAO,IAAI,QAAQ,MAAM,QAChE,OAAO,OAAO,QAAQ;EAE1B,SACM;GACJ,IAAI,OAAO,IAAI,QAAQ,MAAM,QAAQ,OAAO,OAAO,QAAQ;EAC7D,CACF;EACA,OAAO;CACT;AACF;AAEA,SAAgB,qBACd,OACA,WACA,OACwB;CACxB,MAAM,sBAAM,IAAI,IAAuB;CACvC,KAAK,MAAM,YAAY,CAAC,GAAG,OAAO,GAAG,SAAS,GAAG;EAC/C,IAAI,IAAI,IAAI,SAAS,EAAE,GACrB,MAAM,IAAI,MACR,GAAG,MAAM,uDAAuD,SAAS,GAAG,EAC9E;EAEF,IAAI,IAAI,SAAS,IAAI,QAAQ;CAC/B;CACA,OAAO;AACT;AAEA,SAAgB,yBACd,UACA,OACA,UACA,UAC6B;CAC7B,MAAM,OAAO,gBAAgB,WAAW,SAAS,QAAQ,IAAI,EAAE,IAAI,SAAS,GAAG,CAAC;CAChF,gBAAgB,MAAM,GAAG,MAAM,aAAa,SAAS,GAAG,EAAE;CAC1D,MAAM,kBAAkB,KAAK,UAAU,IAAI,CAAC,CAAC;CAC7C,IAAI,kBAAkB,UACpB,MAAM,IAAI,MACR,GAAG,MAAM,aAAa,SAAS,GAAG,8BAA8B,gBAAgB,KAAK,SAAS,EAChG;CAEF,OAAO,WAAW;EAAE,IAAI,SAAS;EAAI;CAAK,CAAC;AAC7C;AAEA,SAAgB,4BAA4B,SAAgD;CAC1F,IAAI,OAAO,YAAY,UAAU,OAAO;CACxC,IAAI,QAAQ,SAAS,cAAc,OAAO,EAAE,GAAG,QAAQ,WAAW;CAClE,MAAM,IAAI,MAAM,uDAAuD;AACzE;AAEA,SAAgB,4BAA4B,WAAkD;CAC5F,OAAO,OAAO,cAAc,WACxB,YACA;EAAE,MAAM;EAAc,YAAY,EAAE,GAAG,UAAU;CAAE;AACzD;AAEA,eAAe,iBAAwD,MAe3B;CAC1C,MAAM,WAAW,MAAM,YAAkC;EACvD,GAAG,KAAK,MAAM;EACd,WAAW,CAAC,gBAAgB,KAAK,QAAQ,CAAC;EAC1C,WAAW,UAAU,YACnB,KAAK,MAAM,oBAAoB,KAAK,WAAW,UAAU,OAAO;EAClE,aAAa,iBAAiB,KAAK,gBAAgB,GAAG,mBAAmB,KAAK,SAAS;EACvF,QAAQ,CAAC,GAAG,KAAK,MAAM,MAAM;EAC7B,QAAQ,GAAG,KAAK,OAAO,eAAe,kBAAkB,KAAK,eAAe,EAAE,GAAG,kBAAkB,mBAAmB,KAAK,SAAS,CAAC,EAAE,GAAG,kBAAkB,KAAK,SAAS,EAAE;EAC5K,MAAM,KAAK,MAAM;EACjB,YAAY,KAAK;EACjB,WAAW,KAAK;EAChB,GAAI,KAAK,WAAW,EAAE,UAAU,KAAK,SAAS,IAAI,CAAC;EACnD,gBAAgB;EAChB,GAAI,KAAK,SAAS,EAAE,QAAQ,KAAK,OAAO,IAAI,CAAC;CAC/C,CAAC;CACD,MAAM,aAAa,SAAS,MAAM,MAAM,SAAS,KAAK,UAAU,KAAA,CAAS;CACzE,IAAI,YAAY;EACd,MAAM,QAAQ,WAAW,cAAc;EACvC,MAAM,UAAU,WAAW,OAAO,MAAM,GAAG,GAAK,KAAK;EACrD,MAAM,WAA2C;GAG/C,OAAO;GACP,MAAM;IACJ,YAAY,WAAW;IACvB,YAAY,CAAC;IACb,QAAQ;IACR,OAAO,wBAAwB,MAAM,sDAAsD;IAC3F,OAAO;KAAE;KAAO;IAAQ;GAC1B;EACF;EACA,IAAI,KAAK,UAAU,QAAQ,CAAC,CAAC,SAAS,KAAK,kBACzC,MAAM,IAAI,MACR,GAAG,KAAK,MAAM,mCAAmC,KAAK,SAAS,GAAG,2BACpE;EAEF,OAAO;CACT;CACA,MAAM,YAAY,kBAAkB,QAAQ;CAC5C,MAAM,MAAM,UAAU,UAAU;CAChC,IAAI,CAAC,KAAK,MAAM,IAAI,MAAM,GAAG,KAAK,MAAM,qCAAqC,KAAK,SAAS,GAAG,EAAE;CAChG,MAAM,WACJ,KAAK,oBAAoB,SAAS,MAAM,KACpC,KAAK,iBAAiB,SAAS,MAAM,EAAE,CAAC,UAAU,KAAK,QAAQ,IAC/D,KAAA;CACN,IAAI,aAAa,KAAA,GACf,gBAAgB,UAAU,GAAG,KAAK,MAAM,2BAA2B,KAAK,SAAS,GAAG,EAAE;CAExF,MAAM,WAA2C;EAC/C,OAAO,IAAI;EACX,MAAM;GACJ,YAAY,IAAI;GAChB,YAAY,UAAU;GACtB,QAAQ,EAAE,GAAG,UAAU,WAAW;GAClC,QAAQ;GACR,GAAI,IAAI,QAAQ,EAAE,OAAO,IAAI,MAAM,IAAI,CAAC;GACxC,GAAI,aAAa,KAAA,IAAY,EAAE,SAAS,IAAI,CAAC;EAC/C;CACF;CACA,IAAI,KAAK,UAAU,QAAQ,CAAC,CAAC,SAAS,KAAK,kBACzC,MAAM,IAAI,MACR,GAAG,KAAK,MAAM,4BAA4B,KAAK,SAAS,GAAG,2BAC7D;CAEF,OAAO;AACT;AAEA,SAASA,6BAA2B,WAAyD;CAC3F,OAAO,OAAO,cAAc,WAAW,YAAY,EAAE,GAAG,UAAU;AACpE;AAEA,SAAS,WAAc,OAAa;CAClC,IAAI,SAAS,OAAO,UAAU,UAAU;EACtC,KAAK,MAAM,SAAS,OAAO,OAAO,KAAgC,GAAG,WAAW,KAAK;EACrF,OAAO,OAAO,KAAK;CACrB;CACA,OAAO;AACT;;AC3OA,SAAgB,wBAAwB,OAI7B;CACT,IAAI,CAAC,MAAM,UAAU,KAAK,KAAK,MAAM,UAAU,KAAK,MAAM,MAAM,WAC9D,MAAM,IAAI,MAAM,4DAA4D;CAE9E,IAAI,OAAO,MAAM,kBAAkB,WACjC,MAAM,IAAI,MAAM,oDAAoD;CAEtE,MAAM,aAAa,kCAAkC,MAAM,QAAQ;CACnE,OAAO,MAAM,gBAAgB,aAAa,GAAG,WAAW,GAAG,MAAM;AACnE;AAEA,SAAgB,kCAAkC,UAA2B;CAC3E,OAAO,YAAY,QAAQ;AAC7B;AAEA,SAAgB,+BAA+B,OAMhB;CAC7B,IAAI,CAAC,MAAM,OAAO,KAAK,KAAK,MAAM,OAAO,KAAK,MAAM,MAAM,QACxD,MAAM,IAAI,MAAM,yDAAyD;CAE3E,IAAI,CAAC,MAAM,UAAU,KAAK,KAAK,MAAM,UAAU,KAAK,MAAM,MAAM,WAC9D,MAAM,IAAI,MAAM,4DAA4D;CAE9E,IAAI,CAAC,OAAO,cAAc,MAAM,cAAc,KAAK,MAAM,kBAAkB,GACzE,MAAM,IAAI,MAAM,mEAAmE;CAErF,MAAM,YAAY,GAAG,MAAM,OAAO;CAClC,MAAM,YAAY,GAAG,UAAU,GAAG,MAAM,OAAO;CAC/C,MAAM,QAAQ,UAAU,SAAS;CACjC,MAAM,UAAU,OAAO,OAAO,EAAE,cAAc,MAAM,OAAO,CAAC;CAC5D,MAAM,cAAc,OAAO,OAAO;EAChC,cAAc,MAAM;EACpB,kBAAkB,MAAM;CAC1B,CAAC;CAED,OAAO;EACL,QAAQ,MAAM;EACd,WAAW,MAAM;EACjB;EACA;EACA,2BACE,UAAU,MAAM,QAAQ,KAAK,SAAS,GAAG,MAAM,gBAAgB,SAAS,CAAC,CAAC;EAC5E,mBAAmB;GACjB,KAAK,IAAI,UAAU,GAAG,UAAU,IAAI,WAAW,GAAG;IAChD,MAAM,UAAU,MAAM,QAAQ,KAAK,SAAS,KAAK;IACjD,MAAM,QAAQ,UAAU,SAAS,MAAM,gBAAgB,SAAS;IAChE,IAAI,MAAM,YAAY,MAAM,gBAAgB,OAAO,KAAA;IACnD,IAAI,CAAC,MAAM,QAAQ,QACjB,MAAM,IAAI,MAAM,kEAAkE;IAEpF,MAAM,OAAO,MAAM,WAAW;IAC9B,MAAM,QAAQ,GAAG,KAAK,UAAU;KAC9B,gBAAgB,MAAM;KACtB,UAAU;IACZ,CAAiC,EAAE;IACnC,MAAM,gBAAgB,IAAI,YAAY,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC;IAExD,IADiB,MAAM,QAAQ,OAAO,WAAW,OAAO,aAC7C,MAAM,KAAA,GAAW,OAAO;GACrC;GACA,MAAM,IAAI,MACR,8CAA8C,MAAM,OAAO,2BAC7D;EACF;CACF;AACF;AAEA,SAAS,UACP,MACA,gBACA,WACuB;CACvB,IAAI,SAAS,KAAA,KAAa,SAAS,IAAI,OAAO;EAAE;EAAgB,UAAU;CAAE;CAC5E,IAAI,WAAW;CACf,KAAK,MAAM,QAAQ,KAAK,MAAM,IAAI,GAAG;EACnC,IAAI,CAAC,MAAM;EACX,IAAI;EACJ,IAAI;GACF,QAAQ,KAAK,MAAM,IAAI;EACzB,SAAS,OAAO;GACd,MAAM,IAAI,MAAM,sDAAsD,UAAU,IAAI,EAClF,MACF,CAAC;EACH;EACA,IACE,CAAC,SACD,OAAO,UAAU,YACjB,MAAM,QAAQ,KAAK,KACnB,OAAO,KAAK,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,MAAM,6BACvC,MAAyC,mBAAmB,kBAC5D,MAAyC,aAAa,WAAW,GAElE,MAAM,IAAI,MAAM,0DAA0D,UAAU,EAAE;EAExF,YAAY;CACd;CACA,IAAI,WAAW,gBACb,MAAM,IAAI,MAAM,6DAA6D,UAAU,EAAE;CAE3F,OAAO;EAAE;EAAgB;CAAS;AACpC;;ACxCA,MAAMC,uBAAqB;AAE3B,SAAgB,qCACd,QACM;CACN,KAAK,MAAM,CAAC,OAAO,UAAU;EAC3B,CAAC,QAAQ,OAAO,IAAI;EACpB,CAAC,aAAa,OAAO,SAAS;EAC9B,CAAC,gBAAgB,OAAO,YAAY;CACtC,GACE,IAAI,OAAO,UAAU,YAAY,CAAC,MAAM,KAAK,KAAK,MAAM,KAAK,MAAM,OACjE,MAAM,IAAI,MAAM,mCAAmC,MAAM,+BAA+B;CAG5F,IAAI,OAAO,cAAc,KAAA,KAAa,OAAO,YAAYA,sBACvD,MAAM,IAAI,MACR,6DAA6DA,sBAC/D;CAEF,IACE,OAAO,eAAe,KAAA,MACrB,OAAO,OAAO,eAAe,YAC5B,CAAC,OAAO,WAAW,KAAK,KACxB,OAAO,WAAW,KAAK,MAAM,OAAO,aAEtC,MAAM,IAAI,MAAM,0EAA0E;CAE5F,IAAI,OAAO,OAAO,QAAQ,YACxB,MAAM,IAAI,MAAM,wDAAwD;CAE1E,IACE,OAAO,WAAW,KAAA,KAClB,OAAO,WAAW,WAClB,OAAO,WAAW,mBAClB,OAAO,WAAW,YAElB,MAAM,IAAI,MACR,wFACF;CAEF,KAAK,MAAM,CAAC,OAAO,UAAU;EAC3B,CAAC,kBAAkB,OAAO,cAAc;EACxC,CAAC,aAAa,OAAO,SAAS;EAC9B,CAAC,qBAAqB,OAAO,iBAAiB;EAC9C,CAAC,oBAAoB,OAAO,gBAAgB;CAC9C,GACE,IAAI,UAAU,KAAA,MAAc,CAAC,OAAO,cAAc,KAAK,KAAK,SAAS,IACnE,MAAM,IAAI,MAAM,mCAAmC,MAAM,iCAAiC;CAG9F,IAAI,CAAC,OAAO,SAAS,OAAO,mBAAmB,KAAK,OAAO,sBAAsB,GAC/E,MAAM,IAAI,MACR,qFACF;CAEF,IACE,OAAO,QAAQ,SAAS,aACxB,OAAO,OAAO,OAAO,YAAY,YACjC,CAAC,OAAO,OAAO,QAAQ,KAAK,KAC5B,OAAO,OAAO,QAAQ,KAAK,MAAM,OAAO,OAAO,WAC/C,OAAO,OAAO,OAAO,YAAY,YACjC,CAAC,OAAO,OAAO,QAAQ,KAAK,KAC5B,OAAO,OAAO,QAAQ,KAAK,MAAM,OAAO,OAAO,SAE/C,MAAM,IAAI,MAAM,4EAA4E;CAE9F,KAAK,MAAM,CAAC,OAAO,UAAU,CAC3B,CAAC,aAAa,OAAO,OAAO,SAAS,GACrC,CAAC,YAAY,OAAO,OAAO,QAAQ,CACrC,GACE,IACE,UAAU,KAAA,MACT,OAAO,UAAU,YAAY,CAAC,MAAM,KAAK,KAAK,MAAM,KAAK,MAAM,QAEhE,MAAM,IAAI,MAAM,0CAA0C,MAAM,iBAAiB;AAGvF;AAEA,SAAgB,uCACd,QAC4D;CAC5D,OAAO;EACL,GAAG;EACH,QAAQ,EAAE,GAAG,OAAO,OAAO;CAC7B;AACF;AAEA,SAAgB,kCACd,QACA,MACA,mBACA,mBAC+C;CAC/C,IAAI,CAAC,UAAU,OAAO,WAAW,UAC/B,MAAM,IAAI,MAAM,GAAG,KAAK,+BAA+B;CAEzD,MAAM,QAAQ;CACd,IAAI,CAAC,wBAAwB,MAAM,aAAa,GAC9C,MAAM,IAAI,MAAM,GAAG,KAAK,8CAA8C;CAMxE,KAHE,OAAO,MAAM,kBAAkB,WAC3B,MAAM,cAAc,SACpB,KAAK,UAAU,MAAM,aAAa,CAAC,CAAC,UACrB,mBACnB,MAAM,IAAI,MAAM,GAAG,KAAK,oDAAoD;CAE9E,IAAI,uBAAuB,OAAO,MAAM,kBAAkB,WACxD,MAAM,IAAI,MAAM,GAAG,KAAK,qCAAqC;CAE/D,IAAI,OAAO,MAAM,YAAY,WAC3B,MAAM,IAAI,MAAM,GAAG,KAAK,6CAA6C;CAEvE,6BAA6B,MAAM,gBAAgB,KAAA,GAAW,IAAI;AACpE;AAEA,SAAgB,iCACd,MACA,QACA,MACA,eAC0C;CAC1C,IAAI,SAAS,KAAA,GAAW;EACtB,IAAI,QAAQ,MAAM,IAAI,MAAM,GAAG,KAAK,2BAA2B;EAC/D;CACF;CACA,IAAI,CAAC,MAAM,SAAS,IAAI,GACtB,MAAM,IAAI,MAAM,GAAG,KAAK,YAAY;CAGtC,IAAI;CACJ,MAAM,2BAAW,IAAI,IAAY;CACjC,KAAK,MAAM,QAAQ,KAAK,MAAM,IAAI,GAAG;EACnC,IAAI,CAAC,MAAM;EACX,IAAI;EACJ,IAAI;GACF,QAAQ,KAAK,MAAM,IAAI;EACzB,SAAS,OAAO;GACd,MAAM,IAAI,MAAM,GAAG,KAAK,cAAc,EAAE,MAAM,CAAC;EACjD;EACA,wCAAwC,OAAO,MAAM,aAAa;EAClE,IAAI,MAAM,WAAW,WAAW;GAC9B,IAAI,SAAS,IAAI,MAAM,SAAS,GAC9B,MAAM,IAAI,MAAM,GAAG,KAAK,oBAAoB,MAAM,UAAU,EAAE;GAEhE,SAAS,IAAI,MAAM,SAAS;GAC5B,UAAU;IAAE,QAAQ,MAAM;IAAQ,WAAW,MAAM;GAAU;GAC7D;EACF;EACA,IAAI,SAAS,WAAW,aAAa,QAAQ,cAAc,MAAM,WAC/D,MAAM,IAAI,MAAM,GAAG,KAAK,yCAAyC;EAEnE,UAAU;GAAE,QAAQ,MAAM;GAAQ,WAAW,MAAM;EAAU;CAC/D;CACA,IAAI,CAAC,SAAS,MAAM,IAAI,MAAM,GAAG,KAAK,YAAY;CAClD,OAAO;EACL,GAAG;EACH,UAAU,IAAI,YAAY,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC;CAC3C;AACF;AAEA,SAAS,wCACP,OACA,MACA,eACoD;CACpD,IACE,CAAC,SACD,OAAO,UAAU,YACjB,MAAM,QAAQ,KAAK,KACnB,OAAO,KAAK,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,MAAM,0BAExC,MAAM,IAAI,MAAM,GAAG,KAAK,YAAY;CAEtC,MAAM,QAAQ;CACd,IACE,MAAM,UAAU,iBAChB,OAAO,MAAM,cAAc,YAC3B,CAAC,MAAM,UAAU,KAAK,KACtB,MAAM,UAAU,KAAK,MAAM,MAAM,aAChC,MAAM,WAAW,aAAa,MAAM,WAAW,aAEhD,MAAM,IAAI,MAAM,GAAG,KAAK,mCAAmC;AAE/D;AAEA,SAAgB,6BACd,OACA,OACA,MACM;CACN,IAAI,CAAC,SAAS,OAAO,UAAU,UAC7B,MAAM,IAAI,MAAM,GAAG,KAAK,uCAAuC;CAEjE,MAAM,aAAa;CACnB,IAAI,WAAW,SAAS,WAAW;EACjC,IAAI,UAAU,GAAG,MAAM,IAAI,MAAM,GAAG,KAAK,2CAA2C;EACpF;CACF;CACA,IAAI,WAAW,SAAS,gBAAgB;EACtC,IAAI,UAAU,KAAA,KAAa,QAAQ,GACjC,MAAM,IAAI,MAAM,GAAG,KAAK,6CAA6C;EAEvE;CACF;CACA,IACE,WAAW,SAAS,cACpB,OAAO,WAAW,WAAW,YAC7B,CAAC,WAAW,OAAO,KAAK,KACxB,WAAW,OAAO,KAAK,MAAM,WAAW,QAExC,MAAM,IAAI,MAAM,GAAG,KAAK,4CAA4C;AAExE;;ACtOA,MAAM,8BAA8B;AACpC,MAAM,6BAA6B;AACnC,MAAM,qBAAqB;AAC3B,MAAMC,uBAAqB;;;;;;;AAQ3B,SAAgB,+BACd,QAC0C;CAC1C,qCAAqC,MAAM;CAC3C,MAAM,WAAW,uCAAuC,MAAM;CAE9D,OAAO;EACL,MAAM,SAAS;EACf,WAAW,UAAU,qBAAqB,UAAU,KAAK;CAC3D;AACF;AAyCA,MAAM,wBAAwB;AAC9B,MAAM,uBAAuB;AAE7B,eAAe,qBACb,UACA,OACmC;CACnC,MAAM,MAAM,MAAM,mBAAmB,UAAU,KAAK;CACpD,IAAI;EACF,MAAM,EAAE,UAAU,qBAAqB,mBAAmB,GAAG;EAC7D,MAAM,WAAW,gBAAgB,GAAG;EACpC,MAAM,UAAU,sBAAsB,KAAK,UAAU,gBAAgB;EAErE,OAAO,UAAU,KAAK,UAAU,SAAS,UAAU,MAD9B,qBAAqB,KAAK,UAAU,SAAS,gBAAgB,CACzB;CAC3D,UAAU;EACR,IAAI,IAAI,aAAa,IAAI,MAAM,QAAQ;CACzC;AACF;AAEA,SAAS,0BACP,WACA,UACA,kBACwC;CACxC,OAAO,OAAO,OACZ,UAAU,KAAK,aACb,yBACE,UACA,SAAS,MACT,kBACA,SAAS,gBACX,CACF,CACF;AACF;;AAGA,eAAe,mBACb,UACA,OAC4C;CAC5C,MAAM,gBAAgB,4BAA4B,MAAM,eAAe;CACvE,MAAM,oBAAoB,SAAS,qBAAqB;CACxD,MAAM,mBAAmB,SAAS,oBAAoB;CACtD,MAAM,YAAY,YAAY,EAAE,CAAC,CAAC,SAAS,KAAK;CAChD,MAAM,UAAU,MAAM,WAAW,WAAW,kBAAkB;CAC9D,MAAM,SAAS,SAAS,UAAU;CAClC,MAAM,WAAW,0BAA0B,MAAM,gBAAgB,UAAU,gBAAgB;CAC3F,MAAM,eAAe,0BACnB,MAAM,oBACN,UACA,gBACF;CACA,MAAM,YAAY,GAAG,MAAM,OAAO,YAAY,kBAAkB,SAAS,IAAI;CAuB7E,MAAM,QAAQ,wBAAwB;EACpC,UAAU;GAtBV,WAAW;IACT,MAAM,SAAS,OAAO;IACtB,SAAS,SAAS,OAAO;IACzB,SAAS,SAAS,OAAO;IACzB,GAAI,SAAS,OAAO,YAAY,EAAE,WAAW,SAAS,OAAO,UAAU,IAAI,CAAC;IAC5E,GAAI,SAAS,OAAO,WAAW,EAAE,UAAU,SAAS,OAAO,SAAS,IAAI,CAAC;GAC3E;GACA,QAAQ,SAAS;GACjB,cAAc,SAAS;GACvB,aAAa,MAAM,WAAW,eAAe;GAC7C,WAAW,SAAS;GACpB,YAAY,SAAS,cAAc;GACnC,MAAM,MAAM;GACZ;GACA;GACA;GACA,gBAAgB,SAAS;GACzB,qBAAqB,SAAS;GAC9B;GACA;EAGU;EACV;EACA,eAAe,WAAW;CAC5B,CAAC;CACD,MAAM,WAAW,GAAG,UAAU,SAAS;CACvC,MAAM,cAAc,GAAG,UAAU,YAAY;CAC7C,QAAQ,UAAU,QAAQ;CAC1B,QAAQ,UAAU,WAAW;CAC7B,IAAI,WAAW,SAAS,MAAM,MAAM,UAAU,EAAE,WAAW,KAAK,CAAC;CACjE,MAAM,OACJ,WAAW,UACP,KAAA,IACA,qBAAqB;EACnB,UAAU,GAAG,SAAS;EACtB,eAAe;CACjB,CAAC;CACP,OAAO;EACL;EACA;EACA;EACA,mBAAmB,OAAO,kBAAkB;EAC5C;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,cAAc,GAAG,SAAS;EAC1B;EACA,aAAa;CACf;AACF;;AAGA,SAAS,mBACP,KACmF;CACnF,MAAM,EAAE,UAAU,SAAS,cAAc,OAAO,WAAW,WAAW;CACtE,IAAI,WACF,WAAW,UACP,KAAA,IACA,iCACE,QAAQ,KAAK,YAAY,GACzB,QAAQ,OAAO,YAAY,GAC3B,cACA,KACF;CACN,MAAM,mBAAmB,aAAa,KAAA;CACtC,IAAI,WAAW,cAAc,CAAC,kBAC5B,MAAM,IAAI,MAAM,GAAG,SAAS,KAAK,iDAAiD;CAEpF,IAAI,WAAW,WAAW,kBACxB,MAAM,IAAI,MAAM,GAAG,SAAS,KAAK,qDAAqD;CAExF,IAAI,WAAW,SACb,WAAW,wCAAwC;EACjD;EACA,MAAM;EACN,UAAU,UAAU,YAAY;EAChC,OAAO;GAAE;GAAO;GAAW,QAAQ;EAAU;CAC/C,CAAC;CAEH,OAAO;EAAE;EAAU;CAAiB;AACtC;AAEA,SAAS,gBACP,KACqB;CACrB,MAAM,EAAE,UAAU,SAAS,WAAW,OAAO,WAAW,aAAa;CACrE,OAAO;EACL,WAAW,+BAA+B;GACxC;GACA,QAAQ;GACR,QAAQ;GACR;GACA,gBAAgB,SAAS;EAC3B,CAAC;EACD,iBAAiB,oBAAoB;GACnC;GACA,QAAQ,GAAG,SAAS;GACpB,gBAAgB,SAAS;EAC3B,CAAC;CACH;AACF;;AAGA,SAAS,yBACP,KACA,UACA,YACmB;CACnB,MAAM,EAAE,UAAU,UAAU;CAC5B,MAAM,EAAE,WAAW,oBAAoB;CA4DvC,OAAO,OAAO,OAAO,EA1DnB,MAAM,YACJ,SAG4B;EAC5B,MAAM,OAAO;GACX,cAAc,KAAA;GACd,iBAAiB;EACnB;EACA,MAAM,iBAAiB,MAAM,gBAAgB,YAAe;GAC1D,GAAG;GACH,SAAS,QAAQ,WAAW;GAC5B,OAAO;GACP,MAAM,UAAU;GAChB,QAAQ,QAAQ,SACZ,YAAY,IAAI,CAAC,WAAW,QAAQ,QAAQ,MAAM,CAAC,IACnD,WAAW;GACf,SAAS,OAAO,QAAQ,WAAW;IACjC,KAAK,eAAe,MAAM,MAAM,WAAW,YAAe;KACxD,GAAG;KACH;KACA,SAAS,QAAQ,WAAW;KAC5B,OAAO;KACP,MAAM,UAAU;KAChB;KACA,UAAU,cAAc,iBAAiB;MACvC,KAAK,kBAAkB;MACvB,OAAO,QAAQ,QAAQ,cAAc,YAAY;KACnD;IACF,CAAC;IACD,IAAI,CAAC,KAAK,aAAa,WACrB,MAAM,IAAI,MAAM,GAAG,SAAS,KAAK,gDAAgD,EAC/E,OAAO,KAAK,aAAa,MAC3B,CAAC;IAEH,OAAO,KAAK,aAAa;GAC3B;GACA,eAAe;IACb,IAAI,CAAC,KAAK,cAAc,WACtB,MAAM,IAAI,MAAM,GAAG,SAAS,KAAK,6CAA6C;IAEhF,OAAO,oBAAoB,KAAK,aAAa,OAAO;GACtD;GACA,wBAAwB;IACtB,IAAI,KAAK,cAAc,SACrB,OAAO,oBAAoB,KAAK,aAAa,OAAO;IAEtD,IAAI,CAAC,KAAK,iBACR,OAAO,gBAAgB,qBAAqB,OAAO,CAAC;GAGxD;EACF,CAAC;EACD,IAAI,KAAK,iBAAiB,KAAA,GAAW,OAAO;EAC5C,IAAI,CAAC,KAAK,aAAa,WAAW,OAAO,KAAK;EAC9C,OAAO,eAAe,YAAY,KAAK,eAAe;CACxD,EAEuB,CAAC;AAC5B;;AAGA,SAAS,sBACP,KACA,UACA,kBACkB;CAClB,MAAM,EAAE,UAAU,OAAO,OAAO,UAAU,gBAAgB;CAC1D,MAAM,EAAE,cAAc;CACtB,MAAM,eAAe,qBACnB,MAAM,gBACN,MAAM,oBACN,GAAG,SAAS,KAAK,WACnB;CACA,MAAM,QAAQ,4BAA4B;EACxC;EACA,OAAO,GAAG,SAAS,KAAK;EACxB,QAAQ;EACR,iBAAiB;EACjB,WAAW;EACX,UAAU,UAAU;EACpB,YAAY,MAAM;EAClB;EACA,mBAAmB,IAAI;EACvB,kBAAkB,IAAI;EACtB,kBAAkB,SAAS;CAC7B,CAAC;CACD,MAAM,aAAa,IAAI,gBAAgB;CACvC,MAAM,oCAAoB,IAAI,IAA6C;CAC3E,MAAM,QAAQ;EAAE,sBAAsB;EAAM,YAAY;CAAM;CAC9D,MAAM,qBAAqB,yBAAyB,KAAK,UAAU,UAAU;CAC7E,MAAM,YACJ,SACA,SAAS,WAAW,WACwB;EAC5C,IAAI,CAAC,MAAM,sBACT,MAAM,IAAI,MAAM,GAAG,SAAS,KAAK,kDAAkD;EAErF,IAAI,UAAU,iBAAiB,MAAM,KAAA,GACnC,MAAM,IAAI,MAAM,GAAG,SAAS,KAAK,+BAA+B;EAElE,MAAM,iBACJ,WAAW,WAAW,SAClB,WAAW,SACX,YAAY,IAAI,CAAC,WAAW,QAAQ,MAAM,CAAC;EACjD,MAAM,UAAU,MAAM,+BAA+B,OAAO,GAAG,cAAc;EAC7E,kBAAkB,IAAI,OAAO;EAC7B,MAAM,eAAe,kBAAkB,OAAO,OAAO;EACrD,QAAa,KAAK,QAAQ,MAAM;EAChC,OAAO;CACT;CAEA,MAAM,UAAU,KAAK,IAAI;CACzB,MAAM,YAAY,SAAS,aAAa;CACxC,MAAM,UAAU,iBACR,WAAW,sBAAM,IAAI,MAAM,GAAG,SAAS,KAAK,uBAAuB,UAAU,GAAG,CAAC,GACvF,SACF;CACA,MAAM,aAAa,QAAQ,QAAQ,CAAC,CAAC,WACnC,SAAS,IACP,OAAO,OAAO;EACZ;EACA,MAAM,SAAS;EACf,WAAW,SAAS;EACpB,cAAc,SAAS;EACvB,GAAI,SAAS,aAAa,EAAE,YAAY,SAAS,WAAW,IAAI,CAAC;EACjE,eAAe,2BAA2B,IAAI,aAAa;EAC3D,UAAU,IAAI;EACd,cAAc,IAAI;EAClB,gBAAgB,SAAS;EACzB,MAAM,MAAM;EACZ;EACA;EACA;EACA,QAAQ,WAAW;EACnB,MAAM;EACN;CACF,CAAC,CACH,CACF;CACA,MAAM,oBAAoB;EACxB,MAAM,aAAa;CACrB;CACA,WAAgB,KAAK,aAAa,WAAW;CAC7C,OAAO;EAAE;EAAY;EAAmB;EAAY;EAAS;EAAS;CAAM;AAC9E;;AAGA,eAAe,qBACb,KACA,UACA,SACA,kBACsC;CACtC,MAAM,EAAE,UAAU,SAAS;CAC3B,MAAM,EAAE,oBAAoB;CAC5B,IAAI;CACJ,IAAI;CACJ,IAAI,0BAA0B;CAC9B,IAAI,wBAAwB;CAC5B,IAAI;EACF,SAAS,MAAM,cAAc,QAAQ,YAAY,QAAQ,WAAW,MAAM;EAC1E,0BAA0B,QAAQ,kBAAkB;EACpD,wBAAwB,gBAAgB,QAAQ,CAAC,CAAC;CACpD,SAAS,OAAO;EACd,WAAW;CACb,UAAU;EACR,QAAQ,MAAM,uBAAuB;EACrC,aAAa,QAAQ,OAAO;CAC9B;CACA,MAAM,QAAQ,WAAW,CAAC,GAAG,QAAQ,iBAAiB,CAAC;CACvD,MAAM,mBAAmB,MAAM,gBAAgB,YAAY,EAAE,WAAW,IAAM,CAAC;CAC/E,MAAM,oBAAoB;EACxB,IAAI,CAAC,MAAM;EACX,IAAI,cAAc;EAClB,QAAa,WAAW,CACtB,QAAQ,YACR,gBAAgB,YAAY,EAAE,WAAWA,qBAAmB,CAAC,CAC/D,CAAC,CAAC,CAAC,WAAW,KAAK,QAAQ,CAAC;CAC9B;CACA,IAAI,aAAa,KAAA,GAAW;EAC1B,IAAI,CAAC,QAAQ,MAAM,cAAc,CAAC,kBAAkB,YAAY;EAChE,MAAM;CACR;CACA,IAAI,CAAC,kBAAkB;EACrB,YAAY;EACZ,MAAM,IAAI,MAAM,GAAG,SAAS,KAAK,sCAAsC;CACzE;CACA,IAAI,wBAAwB,GAC1B,MAAM,IAAI,MACR,GAAG,SAAS,KAAK,yBAAyB,sBAAsB,kEAClE;CAEF,IAAI,0BAA0B,GAC5B,MAAM,IAAI,MACR,GAAG,SAAS,KAAK,yBAAyB,wBAAwB,wDACpE;CAEF,kCACE,QACA,SAAS,MACT,IAAI,mBACJ,IAAI,iBACN;CACA,IAAI,OAAO,YAAY,kBACrB,MAAM,IAAI,MACR,GAAG,SAAS,KAAK,+BAA+B,OAAO,OAAO,OAAO,EAAE,wBAAwB,OAAO,gBAAgB,GACxH;CAEF,OAAO;AACT;;AAGA,SAAS,UACP,KACA,UACA,SACA,UACA,QAC0B;CAC1B,MAAM,EAAE,UAAU,OAAO,SAAS,OAAO,cAAc;CACvD,MAAM,EAAE,cAAc;CACtB,MAAM,iBAAiB,sBACrB,MAAM,WAAW,QAAQ;EACvB,OAAO;EACP,MAAM,UAAU;CAClB,CAAC,CACH;CACA,MAAM,kBAAkB;EACtB,OAAO;EACP,MAAM,UAAU;CAClB;CACA,MAAM,oBAAoB,MAAM,WAAW,KAAK,eAAe;CAC/D,MAAM,mBAAmB,MAAM,WAAW,QAAQ,eAAe;CACjE,MAAM,gBAAgB,sBAAsB,gBAAgB;CAC5D,6BAA6B,OAAO,gBAAgB,iBAAiB,YAAY,SAAS,IAAI;CAC9F,MAAM,qBACJ,OAAO,eAAe,SAAS,aAAa,OAAO,eAAe,SAAS,KAAA;CAC7E,MAAM,aAAa,kCAAkC,kBAAkB,iBAAiB;CACxF,IAAI,IAAI,WAAW,SACjB,wCAAwC;EACtC;EACA,MAAM,IAAI;EACV,UAAU,SAAU;EACpB,OAAO;GAAE;GAAO;GAAW,QAAQ;EAAY;CACjD,CAAC;CAEH,MAAM,eAAe,uBAAuB,CAC1C;EAAE,OAAO;EAAc,MAAM;CAAe,GAC5C;EAAE,OAAO;EAAa,MAAM;CAAc,CAC5C,CAAC;CACD,OAAO;EACL,eAAe,4BAA4B,OAAO,aAAa;EAC/D,MAAM;GACJ,GAAG;GACH,GAAI,qBAAqB,EAAE,gBAAgB;IAAE,MAAM;IAAc,KAAK;GAAK,EAAW,IAAI,CAAC;GAC3F,oBAAoB,aAAa,sBAAsB,uBAAuB,KAAA;GAC9E,mBAAmB,CACjB,GAAG,aAAa,mBAChB,GAAI,qBACA,CAAC,8CAA8C,oBAAoB,IACnE,CAAC,CACP;EACF;EACA,YAAY,KAAK,IAAI,IAAI,QAAQ;EACjC,YAAY;GACV,QAAQ;IAAE,GAAG,SAAS;IAAQ,UAAU;GAAW;GACnD;GACA,SAAS,OAAO;GAChB,iBAAiB,UAAU,oBAAoB;GAC/C,aAAa,IAAI;GACjB,GAAI,aAAa,EAAE,WAAW,IAAI,CAAC;EACrC;CACF;AACF;AAEA,SAAS,wCAAwC,OAKhB;CAC/B,IAAI,CAAC,MAAM,QAAQ,QACjB,MAAM,IAAI,MAAM,uDAAuD;CAEzE,MAAM,OAAO,GAAG,KAAK,UAAU,MAAM,KAAK,EAAE;CAC5C,MAAM,WAAW,MAAM,QAAQ,OAAO,MAAM,MAAM,MAAM,MAAM,QAAQ;CACtE,IAAI,aAAa,KAAA,GACf,MAAM,IAAI,MAAM,gEAAgE,MAAM,KAAK,EAAE;CAE/F,OAAO;EACL,QAAQ,MAAM,MAAM;EACpB,WAAW,MAAM,MAAM;EACvB;CACF;AACF;AAEA,SAAS,oBAAoB,SAAwC;CACnE,MAAM,QAAQ;EACZ,OAAO,QAAQ;EACf,aAAa,QAAQ;EACrB,cAAc,QAAQ;EACtB,GAAI,QAAQ,oBAAoB,KAAA,IAAY,CAAC,IAAI,EAAE,iBAAiB,QAAQ,gBAAgB;EAC5F,GAAI,QAAQ,iBAAiB,KAAA,IAAY,CAAC,IAAI,EAAE,cAAc,QAAQ,aAAa;EACnF,GAAI,QAAQ,qBAAqB,KAAA,IAC7B,CAAC,IACD,EAAE,kBAAkB,QAAQ,iBAAiB;EACjD,GAAI,QAAQ,iBAAiB,KAAA,IAAY,CAAC,IAAI,EAAE,cAAc,QAAQ,aAAa;CACrF;CACA,OAAO,QAAQ,cACX;EAAE,GAAG;EAAO,aAAa;CAAK,IAC9B;EAAE,GAAG;EAAO,eAAe,QAAQ;CAAQ;AACjD;AAEA,SAAS,gBAAgB,OAAiC;CACxD,OAAO;EACL;EACA,aAAa;EACb,cAAc;EACd,eAAe;CACjB;AACF;AAEA,SAAS,qBAAqB,SAAoE;CAChG,IAAI,QAAQ,OAAO,OAAO,QAAQ;CAClC,IAAI,QAAQ,iBAAiB,WAAW,QAAQ,eAC9C,OAAO,QAAQ,cAAc;CAE/B,OAAO;AACT;AAEA,SAAS,2BAA2B,WAAyD;CAC3F,OAAO,OAAO,cAAc,WAAW,YAAY,EAAE,GAAG,UAAU;AACpE;AAEA,SAAS,+BACP,SAC+B;CAC/B,OAAO;EACL,WAAW,2BAA2B,QAAQ,SAAS;EACvD,WAAW,QAAQ;CACrB;AACF;AAEA,eAAe,cAAiB,SAAqB,QAAiC;CACpF,IAAI,OAAO,SAAS,MAAM,OAAO;CACjC,OAAO,MAAM,IAAI,SAAY,SAAS,WAAW;EAC/C,MAAM,gBAAgB,OAAO,OAAO,MAAM;EAC1C,OAAO,iBAAiB,SAAS,SAAS,EAAE,MAAM,KAAK,CAAC;EACxD,QAAa,MACV,UAAU;GACT,OAAO,oBAAoB,SAAS,OAAO;GAC3C,QAAQ,KAAK;EACf,IACC,UAAU;GACT,OAAO,oBAAoB,SAAS,OAAO;GAC3C,OAAO,KAAK;EACd,CACF;CACF,CAAC;AACH;;;;;AC/oBA,SAAgB,YACd,GAAG,OACyB;CAC5B,IAAI,MAAM,WAAW,GACnB,MAAM,IAAI,MAAM,wCAAwC;CAE1D,OAAO;EACL,MAAM,YAAY,MAAM,KAAK,MAAM,EAAE,IAAI,CAAC,CAAC,KAAK,GAAG,EAAE;EACrD,MAAM,OAAO,KAA6D;GACxE,MAAM,UAAwE,CAAC;GAC/E,KAAK,MAAM,QAAQ,OAAO;IACxB,MAAM,MAAM,MAAM,KAAK,OAAO,GAAG;IACjC,QAAQ,KAAK;KAAE;KAAM;IAAI,CAAC;GAC5B;GAQA,MAAM,YAAY,QAAQ,KAAK,MAAM,EAAE,IAAI,QAAQ;GACnD,MAAM,UAAwB,UAAU,OAAO,MAAM,MAAM,MAAM,IAC7D,SACA,UAAU,SAAS,cAAc,IAC/B,iBACA,UAAU,SAAS,eAAe,IAChC,kBACA,UAAU,SAAS,MAAM,IACvB,SACA;GAEV,MAAM,eAAe,QAAQ,SAAS,MACpC,EAAE,IAAI,kBAAkB,SAAS,IAC7B,EAAE,IAAI,oBACN,CACE;IACE,MAAM,EAAE,KAAK;IACb,QACE,EAAE,IAAI,aAAa,SACd,SACD,EAAE,IAAI,aAAa,mBAChB,kBACA;IACT,QAAQ,EAAE;GACZ,CACF,CACN;GAMA,OAAO;IACL,UAAU;IACV,SANc,QAAQ,SAAS,MAC/B,EAAE,IAAI,QAAQ,KAAK,WAAW,IAAI,EAAE,KAAK,KAAK,IAAI,QAAQ,CAKpD;IACN,mBAAmB;IACnB,OAAO,QAAQ,EAAE,EAAE,IAAI;GACzB;EACF;CACF;AACF;;;;;;;;AC9BA,SAAgB,YACd,SAC4B;CAC5B,MAAM,iBAAiB,QAAQ,kBAAkB;CACjD,MAAM,aAAa,QAAQ,cAAc;CACzC,MAAM,oBAAoB,QAAQ,qBAAqB;CACvD,MAAM,YAAY,QAAQ,aAAa;CACvC,MAAM,OAAO,QAAQ,iBAAiB;CACtC,OAAO;EACL,MAAM;EACN,MAAM,OAAO,KAA6D;GACxE,IAAI,CAAC,IAAI,qBACP,MAAM,IAAI,MACR,gIACF;GAEF,MAAM,cAAc,IAAI,IAAI,QAAQ,UAAU,KAAK,MAAM,EAAE,EAAE,CAAC;GAC9D,MAAM,MAAM,oBACV,YAAY,IAAI,aAAa,IAAI,qBAAqB,cAAc,MAAM,EAAE,SAAS,GACrF;IACE;IACA;IACA;IACA;IACA;GACF,CACF;GAKA,MAAM,MAAM,IAAI;GAChB,MAAM,QAAQ,IAAI;GAClB,MAAM,SAAS,IAAI;GACnB,MAAM,SAAS,IAAI,UAAU,kBAAkB,SAAS,SAAS;GACjE,MAAM,UACJ,IAAI,eAAA,KAAmC,MAAM,IAAI,cAAc,IAAA,CAAK,QAAQ,CAAC,EAAE,UAAU;GAC3F,MAAM,KAAK,IAAI,IAAI,aAAa,IAAA,CAAK,QAAQ,CAAC,EAAE,QAAQ,IAAI,IAAI,QAAQ,CAAC,EAAE,IAAI,IAAI,KAAK,QAAQ,CAAC,EAAE;GACnG,MAAM,OAAO,YAAY,IAAI,MAAM,KAAK,MAAM,QAAQ,CAAC;GACvD,MAAM,aAAa,IAAI,UACnB,kBAAkB,IAAI,EAAE,gBAAgB,IAAI,gBAAgB,6CAC5D,IAAI,gBACF,aAAa,IAAI,mBAAmB,wBAAwB,GAAG,8CAA8C,eAAe,kBAAkB,IAAI,IAAI,QAAQ,KAC9J,IAAI,kBACF,GAAG,KAAK,oBAAoB,IAAI,SAAS,OAAO,cAAc,CAAC,EAAE,yBAAyB,IAAI,IAAI,WAAA,CAAY,QAAQ,CAAC,EAAE,IAAI,GAAG,MAAM,IAAI,IAAI,QAAQ,KACtJ,GAAG,KAAK,WAAW,IAAI,IAAI,QAAQ,CAAC,EAAE,KAAK,eAAe,IAAI,GAAG,MAAM,IAAI,IAAI,QAAQ;GAC/F,OAAO;IACL,UAAU,SAAS,SAAS;IAC5B,SAAS,SACL,CACE,GAAG,KAAK,WAAW,IAAI,IAAI,QAAQ,CAAC,EAAE,KAAK,eAAe,IAAI,GAAG,MAAM,IAAI,IAAI,QAAQ,EACzF,IACA,CAAC,UAAU;IACf,mBAAmB,CACjB;KACE,MAAM;KACN;KACA,QAAQ;MACN,WAAW,IAAI,UAAU;MACzB,eAAe;MACf,mBAAmB,IAAI;MACvB,gBAAgB,IAAI;MACpB,aAAa,IAAI;MACjB,SAAS,IAAI;MACb,eAAe,IAAI;MACnB,uBAAuB,IAAI,gBAAgB;MAC3C,aAAa,IAAI;MACjB,OAAO,IAAI;MACX,QAAQ,IAAI;MACZ,gBAAgB,IAAI,UAAU;MAC9B,iBAAiB,IAAI,UAAU;MAC/B,YAAY,IAAI;MAChB,GAAG,IAAI;MACP;MACA,SAAS,IAAI;MACb;KACF;IACF,CACF;IACA;GACF;EACF;CACF;AACF;;ACxHA,SAAgB,gCACd,QACA,QAMA;CACA,OAAO;EACL,SAAS,QAAQ,WAAW;EAC5B,MAAM,CAAC,GAAI,QAAQ,QAAQ,CAAC,MAAM,MAAM,CAAE;EAC1C,aAAa,4BAA4B,QAAQ,OAAO,CAAC,CAAC;EAC1D,QAAQ,sCAAsC,QAAQ,MAAM;CAC9D;AACF;AAEA,SAAgB,gCACd,QAC4C;CAC5C,IAAI,CAAC,QAAQ,OAAO,KAAA;CACpB,OAAO;EACL,GAAG;EACH,GAAI,OAAO,OAAO,EAAE,MAAM,CAAC,GAAG,OAAO,IAAI,EAAE,IAAI,CAAC;EAChD,GAAI,OAAO,MAAM,EAAE,KAAK,EAAE,GAAG,OAAO,IAAI,EAAE,IAAI,CAAC;EAC/C,GAAI,OAAO,SAAS,EAAE,QAAQ,EAAE,GAAG,OAAO,OAAO,EAAE,IAAI,CAAC;CAC1D;AACF;AAEA,SAAgB,aAAgB,OAAU,OAAkB;CAC1D,MAAM,aAAa,KAAK,UAAU,KAAK;CACvC,IAAI,eAAe,KAAA,GAAW,MAAM,IAAI,MAAM,GAAG,MAAM,2BAA2B;CAClF,OAAO,KAAK,MAAM,UAAU;AAC9B;;ACNA,SAAgB,qBAAqB,OAAuC,OAAqB;CAC/F,IAAI,CAAC,SAAS,OAAO,UAAU,UAC7B,MAAM,IAAI,MAAM,GAAG,MAAM,aAAa;CAExC,KAAK,MAAM,CAAC,OAAO,SAAS,CAC1B,CAAC,SAAS,MAAM,KAAK,GACrB,CAAC,WAAW,MAAM,OAAO,CAC3B,GACE,IAAI,OAAO,SAAS,YAAY,CAAC,KAAK,KAAK,KAAK,KAAK,KAAK,MAAM,MAC9D,MAAM,IAAI,MAAM,GAAG,MAAM,GAAG,MAAM,+BAA+B;CAGrE,IAAI,OAAO,MAAM,SAAS,YAAY,MAAM,IAAI,MAAM,GAAG,MAAM,yBAAyB;CACxF,wBAAwB,MAAM,mBAAmB,GAAG,MAAM,mBAAmB;CAC7E,IAAI,MAAM,sBAAsB,KAAA,KAAa,OAAO,MAAM,sBAAsB,WAC9E,MAAM,IAAI,MAAM,GAAG,MAAM,qCAAqC;CAEhE,mCAAmC,MAAM,QAAQ,GAAG,MAAM,QAAQ;AACpE;AAEA,SAAgB,uBACd,OACgC;CAChC,OAAO;EACL,OAAO,MAAM;EACb,QAAQ,gBAAgB,MAAM,MAAM;EACpC,MAAM,MAAM;EACZ,SAAS,MAAM;EACf,GAAI,MAAM,oBAAoB,EAAE,mBAAmB,MAAM,kBAAkB,IAAI,CAAC;EAChF,GAAI,MAAM,sBAAsB,KAAA,IAC5B,CAAC,IACD,EAAE,mBAAmB,MAAM,kBAAkB;CACnD;AACF;;;;;;ACpCA,MAAM,yCAA8C,IAAI,IAAI,CAAC,gBAAgB,cAAc,CAAC;AAE5F,SAAgB,4BAA4B,QAAyC;CACnF,OAAO,oBAAoB,MAAM,CAAC,CAAC,MAAM,QAAQ,uBAAuB,IAAI,IAAI,MAAM,CAAC;AACzF;AAEA,MAAMC,uBAAqB;AAE3B,SAAgB,+BACd,QACoD;CACpD,MAAM,SAAS,gCAAgC,OAAO,MAAM;CAC5D,OAAO;EACL,GAAG;EACH,QAAQ,gBAAgB,OAAO,MAAM;EACrC,GAAI,OAAO,gBAAgB,EAAE,eAAe,CAAC,GAAG,OAAO,aAAa,EAAE,IAAI,CAAC;EAC3E,GAAI,OAAO,YAAY,EAAE,WAAW,uBAAuB,OAAO,SAAS,EAAE,IAAI,CAAC;EAClF,GAAI,OAAO,2BACP,EAAE,0BAA0B,EAAE,GAAG,OAAO,yBAAyB,EAAE,IACnE,CAAC;EACL,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC;CAC7B;AACF;AAEA,SAAgB,6BACd,QACM;CACN,IACE,OAAO,OAAO,cAAc,YAC5B,CAAC,OAAO,UAAU,KAAK,KACvB,OAAO,UAAU,KAAK,MAAM,OAAO,WAEnC,MAAM,IAAI,MAAM,iEAAiE;CAEnF,IACE,OAAO,OAAO,iBAAiB,YAC/B,CAAC,OAAO,aAAa,KAAK,KAC1B,OAAO,aAAa,KAAK,MAAM,OAAO,cAEtC,MAAM,IAAI,MAAM,oEAAoE;CAEtF,IACE,OAAO,SAAS,KAAA,MACf,OAAO,OAAO,SAAS,YAAY,CAAC,OAAO,KAAK,KAAK,KAAK,OAAO,KAAK,KAAK,MAAM,OAAO,OAEzF,MAAM,IAAI,MAAM,4DAA4D;CAE9E,IACE,OAAO,eAAe,KAAA,MACrB,OAAO,OAAO,eAAe,YAC5B,CAAC,OAAO,WAAW,KAAK,KACxB,OAAO,WAAW,KAAK,MAAM,OAAO,aAEtC,MAAM,IAAI,MAAM,kEAAkE;CAEpF,IACE,OAAO,WAAW,KAAA,KAClB,OAAO,WAAW,WAClB,OAAO,WAAW,mBAClB,OAAO,WAAW,YAElB,MAAM,IAAI,MACR,gFACF;CAEF,IAAI,OAAO,qBAAqB,KAAA,KAAa,OAAO,OAAO,qBAAqB,WAC9E,MAAM,IAAI,MAAM,4DAA4D;CAE9E,aAAa,OAAO,MAAM;CAC1B,IACE,OAAO,WAAW,KAAA,KAClB,OAAO,WAAW,WAClB,yBAAyB,OAAO,MAAM,KACtC,OAAO,qBAAqB,MAE5B,MAAM,IAAI,MACR,qFACF;CAEF,IACE,OAAO,sBAAsB,KAAA,MAC5B,CAAC,OAAO,cAAc,OAAO,iBAAiB,KAAK,OAAO,qBAAqB,IAEhF,MAAM,IAAI,MAAM,2EAA2E;CAE7F,IACE,OAAO,qBAAqB,KAAA,MAC3B,CAAC,OAAO,cAAc,OAAO,gBAAgB,KAAK,OAAO,oBAAoB,IAE9E,MAAM,IAAI,MAAM,0EAA0E;CAE5F,IACE,OAAO,cAAc,KAAA,MACpB,CAAC,OAAO,cAAc,OAAO,SAAS,KACrC,OAAO,aAAa,KACpB,OAAO,YAAYA,uBAErB,MAAM,IAAI,MAAM,2DAA2DA,sBAAoB;CAEjG,MAAM,gBAAgB,OAAO,oBAAA;CAC7B,IACE,KAAK,UAAU,OAAO,SAAS,CAAC,CAAC,SAAS,iBAC1C,KAAK,UAAU,OAAO,cAAc,EAAE,CAAC,CAAC,SAAS,eAEjD,MAAM,IAAI,MACR,iFACF;CAEF,oBAAoB,OAAO,aAAa;CACxC,uCACE,OAAO,0BACP,kDACF;CACA,IAAI,OAAO,cAAc,KAAA,GAAW;EAClC,qBAAqB,OAAO,WAAW,mCAAmC;EAC1E,IAAI,OAAO,eAAe,QACxB,MAAM,IAAI,MACR,sIACF;EAEF,wBAAwB,OAAO,QAAQ,OAAO,SAAS;CACzD;AACF;AAEA,SAAgB,yBAAyB,QAAyC;CAChF,OAAO,OAAO,SAAS,YAAY,OAAO,IAAI,WAAW;AAC3D;AAEA,SAAgB,0BACd,QACA,wBACQ;CACR,IAAI,OAAO,SAAS,uBAAuB,OAAO,OAAO;CACzD,MAAM,OACJ,OAAO,SAAS,WACZ,CAAC,OAAO,GAAG,IACX,OAAO,SAAS,gBAAgB,OAAO,SAAS,aAAa,OAAO,SAAS,SAC3E,CAAC,GAAG,OAAO,IAAI,IACf,CAAC,GAAG,OAAO,SAAS,OAAO,YAAY;CAC/C,IAAI,QAAQ;CACZ,KAAK,MAAM,OAAO,MAChB,QAAQ,mBAAmB,OAAO,IAAI,cAAc;CAEtD,IAAI,OAAO,SAAS,UAAU,yBAAyB,GACrD,QAAQ,mBAAmB,OAAO,OAAO,KAAK,SAAS,sBAAsB;CAE/E,OAAO;AACT;AAEA,SAAgB,0BAA0B,QAAgC,MAAoB;CAC5F,MAAM,cAAc,oBAAoB,MAAM,CAAC,CAAC,MAAM,QAAQ,IAAI,WAAW,MAAM;CACnF,IAAI,aACF,MAAM,IAAI,MACR,GAAG,KAAK,sDAAsD,YAAY,OAAO,6BACnF;AAEJ;AAEA,SAAgB,sBAAsB,QAAwC;CAC5E,IAAI,OAAO,SAAS,UAAU,OAAO,QAAQ,OAAO,IAAI;CACxD,IAAI,OAAO,SAAS,QAClB,OAAO,aAAa,OAAO,aAAa;CAE1C,OAAO,QAAQ,OAAO;AACxB;AAEA,SAAS,oBAAoB,eAAoD;CAC/E,IAAI,kBAAkB,KAAA,GAAW;CACjC,IAAI,CAAC,MAAM,QAAQ,aAAa,GAC9B,MAAM,IAAI,MAAM,wDAAwD;CAE1E,MAAM,uBAAO,IAAI,IAAY;CAC7B,KAAK,MAAM,UAAU,eAAe;EAClC,IACE,OAAO,WAAW,YAClB,CAAC,UACD,CAAC,sDAAsD,KAAK,MAAM,GAElE,MAAM,IAAI,MACR,sFACF;EAEF,IAAI,KAAK,IAAI,MAAM,GACjB,MAAM,IAAI,MAAM,mEAAmE;EAErF,KAAK,IAAI,MAAM;CACjB;AACF;AAEA,SAAS,aAAa,QAAsC;CAC1D,IAAI,CAAC,UAAU,OAAO,WAAW,UAC/B,MAAM,IAAI,MAAM,4CAA4C;CAE9D,IAAI,OAAO,SAAS,UAAU;EAC5B,gBAAgB,OAAO,KAAK,YAAY;EACxC;CACF;CACA,IAAI,OAAO,SAAS,cAAc;EAChC,iBAAiB,OAAO,MAAM,eAAe,CAAC;EAC9C;CACF;CACA,IAAI,OAAO,SAAS,uBAAuB;EACzC,yBAAyB,OAAO,MAAM,aAAa;EACnD,4BAA0B,OAAO,gBAAgB,uBAAuB;EACxE,4BAA0B,OAAO,oBAAoB,2BAA2B;EAChF,IAAI,OAAO,aAAa,KAAA,GACtB,4BAA0B,OAAO,UAAU,iBAAiB;EAE9D,IACE,OAAO,2BAA2B,KAAA,MACjC,CAAC,OAAO,cAAc,OAAO,sBAAsB,KAAK,OAAO,yBAAyB,IAEzF,MAAM,IAAI,MACR,2FACF;EAEF,IACE,OAAO,uBAAuB,KAAA,MAC7B,CAAC,OAAO,SAAS,OAAO,kBAAkB,KAAK,OAAO,qBAAqB,IAE5E,MAAM,IAAI,MACR,wFACF;EAEF,IAAI,OAAO,UAAU,KAAA,KAAa,OAAO,OAAO,UAAU,WACxD,MAAM,IAAI,MAAM,wDAAwD;EAE1E,IAAI,OAAO,gBAAgB,KAAA,GACzB,4BAA0B,OAAO,aAAa,oBAAoB;EAEpE,IAAI,OAAO,mBAAmB,KAAA,GAC5B,4BAA0B,OAAO,gBAAgB,uBAAuB;EAE1E;CACF;CACA,IAAI,OAAO,SAAS,aAAa,OAAO,SAAS,QAAQ;EACvD,iBAAiB,OAAO,MAAM,eAAe,CAAC;EAC9C,uBAAuB,MAAM;EAC7B;CACF;CACA,IAAI,OAAO,SAAS,QAAQ;EAC1B,iBAAiB,OAAO,SAAS,kBAAkB,CAAC;EACpD,gBAAgB,OAAO,cAAc,qBAAqB;EAC1D,uBAAuB,MAAM;EAC7B;CACF;CACA,MAAM,IAAI,MAAM,4CAA4C;AAC9D;AAEA,SAAS,iBAAiB,MAAgC,OAAe,SAAuB;CAC9F,IAAI,CAAC,MAAM,QAAQ,IAAI,KAAK,KAAK,SAAS,SACxC,MAAM,IAAI,MACR,2BAA2B,MAAM,yBAAyB,QAAQ,qBAAqB,YAAY,IAAI,KAAK,KAC9G;CAEF,KAAK,MAAM,CAAC,OAAO,QAAQ,KAAK,QAAQ,GACtC,gBAAgB,KAAK,GAAG,MAAM,GAAG,MAAM,EAAE;AAE7C;AAEA,SAAS,yBAAyB,MAAwC,OAAqB;CAC7F,IAAI,CAAC,MAAM,QAAQ,IAAI,KAAK,KAAK,SAAS,GACxC,MAAM,IAAI,MACR,2BAA2B,MAAM,+CACnC;CAEF,KAAK,MAAM,CAAC,OAAO,QAAQ,KAAK,QAAQ,GACtC,oBAAoB,KAAK,GAAG,MAAM,GAAG,MAAM,EAAE;AAEjD;AAEA,SAAS,gBAAgB,KAAoB,OAAqB;CAChE,oBAAoB,KAAK,KAAK;CAC9B,4BAA0B,IAAI,gBAAgB,GAAG,MAAM,gBAAgB;AACzE;AAEA,SAAS,oBAAoB,KAAwB,OAAqB;CACxE,IAAI,CAAC,OAAO,OAAO,QAAQ,UACzB,MAAM,IAAI,MAAM,2BAA2B,MAAM,aAAa;CAEhE,IAAI,OAAO,IAAI,WAAW,YAAY,CAAC,IAAI,OAAO,KAAK,KAAK,IAAI,OAAO,KAAK,MAAM,IAAI,QACpF,MAAM,IAAI,MAAM,2BAA2B,MAAM,2CAA2C;CAE9F,IACE,IAAI,uBAAuB,KAAA,MAC1B,CAAC,OAAO,SAAS,IAAI,kBAAkB,KAAK,IAAI,sBAAsB,IAEvE,MAAM,IAAI,MACR,2BAA2B,MAAM,mEACnC;CAEF,IAAI,IAAI,mBAAmB,KAAA,GACzB,4BAA0B,IAAI,gBAAgB,GAAG,MAAM,gBAAgB;CAEzE,IAAI,IAAI,gBAAgB,KAAA,KAAa,CAAC,OAAO,SAAS,IAAI,WAAW,GACnE,MAAM,IAAI,MAAM,2BAA2B,MAAM,qCAAqC;CAExF,IAAI,IAAI,YAAY,KAAA,KAAa,OAAO,IAAI,YAAY,WACtD,MAAM,IAAI,MAAM,2BAA2B,MAAM,2BAA2B;CAE9E,gBAAgB,IAAI,gBAAgB,CAAC,GAAG,2BAA2B,MAAM,cAAc;CACvF,yBAAyB,IAAI,gBAAgB,CAAC,GAAG,2BAA2B,MAAM,cAAc;CAChG,IAAI,IAAI,WAAW,QAAQ;EACzB,MAAM,eAAe,SAAS,IAAI,cAAc,MAAM,IAAI,IAAI,aAAa,SAAS,KAAA;EACpF,IAAI,gBAAgB,OAAO,OAAO,cAAc,MAAM,GACpD,MAAM,IAAI,MACR,2BAA2B,MAAM,+FACnC;CAEJ;AACF;AAEA,SAAS,wBACP,QACA,WACM;CACN,KAAK,MAAM,CAAC,OAAO,QAAQ,oBAAoB,MAAM,CAAC,CAAC,QAAQ,GAAG;EAChE,IAAI,uBAAuB,IAAI,IAAI,MAAM,GAAG;GAC1C,4BAA4B,KAAK,OAAO,SAAS;GACjD;EACF;EACA,IAAI,IAAI,WAAW,QACjB,MAAM,IAAI,MACR,kFAAkF,MAAM,OAAO,IAAI,OAAO,EAC5G;EAEF,MAAM,aAAa,SAAS,IAAI,cAAc,UAAU,IACpD,IAAI,aAAa,aACjB,KAAA;EACJ,IAAI,cAAc,OAAO,OAAO,YAAY,eAAe,GACzD,MAAM,IAAI,MACR,gHACF;EAEF,MAAM,oBAAoB,SAAS,YAAY,oBAAoB,IAC/D,WAAW,uBACX,KAAA;EACJ,IACE,qBACA;GACE;GACA;GACA;GACA;GACA;GACA;GACA;GACA;EACF,CAAC,CAAC,MAAM,QAAQ,OAAO,OAAO,mBAAmB,GAAG,CAAC,GAErD,MAAM,IAAI,MACR,mFACF;CAEJ;AACF;AAEA,SAAS,4BACP,KACA,OACA,WACM;CACN,IAAI,UAAU,sBAAsB,MAClC,MAAM,IAAI,MACR,yCAAyC,IAAI,OAAO,mBAAmB,MAAM,iGAC/E;CAKF,IAAI,IAAI,cAAc,UAAU,UAAU,OACxC,MAAM,IAAI,MACR,yCAAyC,MAAM,KAAK,IAAI,OAAO,yDAAyD,UAAU,MAAM,EAC1I;CAKF,IAAI,IAAI,gBAAgB,OAAO,OAAO,IAAI,cAAc,qBAAqB,GAC3E,MAAM,IAAI,MACR,yCAAyC,MAAM,KAAK,IAAI,OAAO,8EACjE;AAEJ;AAEA,SAAS,uBAAuB,QAAuC;CACrE,IAAI,OAAO,eAAe,KAAA,GACxB,4BAA0B,OAAO,YAAY,mBAAmB;AAEpE;AAEA,SAASC,4BAA0B,OAAe,OAAqB;CACrE,IAAI,CAAC,OAAO,cAAc,KAAK,KAAK,SAAS,GAC3C,MAAM,IAAI,MAAM,2BAA2B,MAAM,iCAAiC;AAEtF;AAEA,SAAS,oBAAoB,QAA8D;CACzF,IAAI,OAAO,SAAS,UAAU,OAAO,CAAC,OAAO,GAAG;CAChD,IAAI,OAAO,SAAS,QAAQ,OAAO,CAAC,GAAG,OAAO,SAAS,OAAO,YAAY;CAC1E,OAAO,OAAO;AAChB;AAEA,SAAS,mBAAmB,OAAe,WAA2B;CACpE,MAAM,OAAO,QAAQ;CACrB,IAAI,CAAC,OAAO,cAAc,IAAI,GAC5B,MAAM,IAAI,MAAM,4EAA4E;CAE9F,OAAO;AACT;;AC3aA,MAAM,qBAAqB;CAAC;CAAe;CAAgB;CAAe;AAAO;AAEjF,SAAgB,kCACd,SACA,QACA,MACM;CACN,IAAI,CAAC,QAAQ,iBAAkB,OAAO,eAAe,KAAA,KAAa,CAAC,QAAQ,oBACzE,MAAM,IAAI,MAAM,GAAG,KAAK,mEAAmE;CAE7F,IACE,QAAQ,aAAa,OAAO,eAC3B,OAAO,eAAe,KAAA,KAAa,QAAQ,eAAe,OAAO,aAAa,OAAO,SAEtF,MAAM,IAAI,MAAM,GAAG,KAAK,4DAA4D;AAExF;AAEA,SAAgB,kCACd,OACA,MACA,WACM;CACN,IAAI,UAAU,KAAA,GAAW;CACzB,KAAK,MAAM,SAAS,oBAClB,IAAI,CAAC,OAAO,cAAc,MAAM,MAAM,KAAK,MAAM,SAAS,GACxD,MAAM,IAAI,MAAM,GAAG,KAAK,IAAI,UAAU,sCAAsC,OAAO;CAGvF,IAAI,MAAM,gBAAgB,MAAM,cAAc,MAAM,cAClD,MAAM,IAAI,MAAM,GAAG,KAAK,IAAI,UAAU,qDAAqD;CAE7F,IACE,MAAM,oBAAoB,KAAA,MACzB,CAAC,OAAO,cAAc,MAAM,eAAe,KAAK,MAAM,kBAAkB,MAAM,QAE/E,MAAM,IAAI,MAAM,GAAG,KAAK,IAAI,UAAU,oDAAoD;AAE9F;AAEA,SAAgB,uCACd,UACA,iBACA,uBACA,MACA,WACM;CACN,IAAI,CAAC,UACH,MAAM,IAAI,MAAM,GAAG,KAAK,IAAI,UAAU,sCAAsC;CAE9E,IACE,CAAC,OAAO,cAAc,eAAe,KACrC,CAAC,OAAO,cAAc,qBAAqB,KAC3C,kBAAkB,KAClB,wBAAwB,KACxB,wBAAwB,iBAExB,MAAM,IAAI,MAAM,GAAG,KAAK,wDAAwD;CAElF,IAAI,SAAS,UAAU,uBACrB,MAAM,IAAI,MACR,GAAG,KAAK,IAAI,UAAU,YAAY,SAAS,MAAM,kDAAkD,sBAAsB,UAAU,gBAAgB,UACrJ;CAEF,IAAI,SAAS,oBAAoB,KAAA,KAAa,SAAS,oBAAoB,iBACzE,MAAM,IAAI,MACR,GAAG,KAAK,IAAI,UAAU,YAAY,SAAS,gBAAgB,yCAAyC,iBACtG;AAEJ;;ACtEA,SAAgB,qCACd,OACA,iBACA,MACA,WAC2D;CAC3D,uCAAuC,OAAO,iBAAiB,MAAM,SAAS;CAC9E,qCAAqC,OAAO,MAAM,SAAS;AAC7D;AAEA,SAAgB,uCACd,OACA,iBACA,MACA,WAC2D;CAC3D,IACE,CAAC,SAAS,KAAK,KACf,MAAM,YAAY,mBAClB,OAAO,MAAM,YAAY,YACzB,MAAM,QAAQ,WAAW,KACzB,MAAM,YAAY,MAAM,QAAQ,KAAK,GAErC,MAAM,IAAI,MAAM,GAAG,KAAK,IAAI,UAAU,qDAAqD;AAE/F;AAEA,SAAgB,qCACd,OACA,MACA,WACM;CACN,IACE,MAAM,cAAc,KAAA,MACnB,OAAO,MAAM,cAAc,YAC1B,MAAM,UAAU,WAAW,KAC3B,MAAM,cAAc,MAAM,UAAU,KAAK,IAE3C,MAAM,IAAI,MAAM,GAAG,KAAK,IAAI,UAAU,+CAA+C;CAEvF,IACE,MAAM,aAAa,KAAA,MAClB,OAAO,MAAM,aAAa,YACzB,MAAM,SAAS,WAAW,KAC1B,MAAM,aAAa,MAAM,SAAS,KAAK,IAEzC,MAAM,IAAI,MAAM,GAAG,KAAK,IAAI,UAAU,8CAA8C;CAEtF,IACE,MAAM,iBAAiB,KAAA,MACtB,OAAO,MAAM,iBAAiB,YAAY,CAAC,iBAAiB,KAAK,MAAM,YAAY,IAEpF,MAAM,IAAI,MAAM,GAAG,KAAK,IAAI,UAAU,kDAAkD;AAE5F;AAEA,SAAgB,uCACd,OAC2B;CAC3B,OAAO;EACL,MAAM;EACN,UAAU;EACV,SAAS,MAAM;EACf,SAAS,MAAM;EACf,GAAI,MAAM,YAAY,EAAE,WAAW,MAAM,UAAU,IAAI,CAAC;EACxD,GAAI,MAAM,WAAW,EAAE,UAAU,MAAM,SAAS,IAAI,CAAC;EACrD,GAAI,MAAM,eAAe,EAAE,cAAc,MAAM,aAAa,IAAI,CAAC;CACnE;AACF;;AC/CA,eAAsB,gCAAyD,MAQvB;CACtD,MAAM,SAAS,MAAM,4BAAkD;EACrE,OAAO,GAAG,KAAK,MAAM;EACrB,YAAY,cAAc,KAAK,QAAQ;EACvC,QAAQ,KAAK;EACb,OAAO;GACL,WAAW;GACX,eAAe,CAAC,GAAI,KAAK,iBAAiB,CAAC,CAAE;EAC/C;EACA,GAAI,KAAK,SAAS,EAAE,QAAQ,KAAK,OAAO,IAAI,CAAC;EAC7C,WAAW,KAAK;EAChB,GAAI,KAAK,SAAS,EAAE,QAAQ,KAAK,OAAO,IAAI,CAAC;CAC/C,CAAC;CACD,uCAAuC,OAAO,SAAS,KAAK,SAAS,KAAK,KAAK;CAC/E,OAAO,OAAO;AAChB;AAEA,SAAgB,iCACd,SACkC;CAClC,OAAO;EACL,QAAQ,uCAAuC,QAAQ,SAAS;EAChE,QAAQ,uCAAuC,QAAQ,MAAM;EAC7D,SAAS,QAAQ,cAAc,KAAK,YAAY,EAAE,GAAG,OAAO,EAAE;EAC9D,QAAQ,EAAE,GAAG,QAAQ,OAAO;CAC9B;AACF;AAEA,SAAgB,kCAA2D,MASlE;CACP,IAAI,CAAC,kBAAkB,KAAK,gBAAgB,KAAK,QAAQ,SAAS,GAChE,MAAM,IAAI,MAAM,GAAG,KAAK,MAAM,oDAAoD;CAEpF,IAAI,KAAK,kBAAkB,KAAK,OAC9B,MAAM,IAAI,MAAM,GAAG,KAAK,MAAM,qCAAqC;CAErE,IAAI,KAAK,WAAW,WAAW,KAAK,SAClC,MAAM,IAAI,MAAM,GAAG,KAAK,MAAM,oCAAoC;CAEpE,IAAI,KAAK,WAAW,cAAc,CAAC,KAAK,SACtC,MAAM,IAAI,MAAM,GAAG,KAAK,MAAM,wCAAwC;CAExE,IAAI,CAAC,KAAK,MAAM,WAAW,KAAK,eAAe,GAC7C,MAAM,IAAI,MAAM,GAAG,KAAK,MAAM,iDAAiD;AAEnF;AAEA,SAAS,uCACP,OACA,iBACA,OAC6D;CAC7D,IAAI,CAAC,SAAS,KAAK,GACjB,MAAM,IAAI,MAAM,GAAG,MAAM,iDAAiD;CAE5E,qCAAqC,MAAM,QAAQ,kBAAkB,OAAO,QAAQ;CACpF,qCAAqC,MAAM,WAAW,iBAAiB,OAAO,eAAe;CAC7F,IAAI,CAAC,MAAM,OAAO,gBAAgB,CAAC,MAAM,UAAU,cACjD,MAAM,IAAI,MAAM,GAAG,MAAM,kDAAkD;CAE7E,IACE,CAAC,SAAS,MAAM,MAAM,KACtB,OAAO,MAAM,OAAO,mBAAmB,YACvC,MAAM,OAAO,eAAe,WAAW,KACvC,MAAM,OAAO,mBAAmB,MAAM,OAAO,eAAe,KAAK,KACjE,OAAO,MAAM,OAAO,YAAY,YAChC,MAAM,OAAO,QAAQ,WAAW,KAChC,MAAM,OAAO,YAAY,MAAM,OAAO,QAAQ,KAAK,GAEnD,MAAM,IAAI,MAAM,GAAG,MAAM,uDAAuD;CAElF,IACE,CAAC,MAAM,QAAQ,MAAM,aAAa,KAClC,MAAM,cAAc,MACjB,WACC,CAAC,SAAS,MAAM,KAChB,OAAO,OAAO,WAAW,YACzB,OAAO,OAAO,WAAW,KACzB,OAAO,WAAW,OAAO,OAAO,KAAK,KACrC,OAAO,OAAO,iBAAiB,YAC/B,CAAC,iBAAiB,KAAK,OAAO,YAAY,CAC9C,GAEA,MAAM,IAAI,MAAM,GAAG,MAAM,oDAAoD;AAEjF;;AC9FA,SAAgB,uBACd,QACA,MACA,mBACA,YACA,gBACA,yBACA,aACA,mBACA,6BACoC;CACpC,IAAI,OAAO,eAAe,YACxB,MAAM,IAAI,MAAM,GAAG,KAAK,iCAAiC,OAAO,OAAO,UAAU,EAAE,EAAE;CAEvF,IACE,CAAC,gBAAgB,OAAO,eAAe,iBAAiB,KACxD,uBAAuB,OAAO,OAAO,kBAAkB,WAEvD,MAAM,IAAI,MAAM,GAAG,KAAK,4CAA4C;CAEtE,IAAI,CAAC,OAAO,SAAS,OAAO,SAAS,GACnC,MAAM,IAAI,MAAM,GAAG,KAAK,4CAA4C;CAEtE,IACE,CAAC,OAAO,cAAc,OAAO,gBAAgB,KAC7C,OAAO,mBAAmB,KAC1B,OAAO,mBAAmB,gBAE1B,MAAM,IAAI,MAAM,GAAG,KAAK,mDAAmD;CAE7E,IACE,OAAO,gCAAgC,KAAA,MACtC,CAAC,OAAO,cAAc,OAAO,2BAA2B,KACvD,OAAO,8BAA8B,IAEvC,MAAM,IAAI,MAAM,GAAG,KAAK,8DAA8D;CAExF,IACE,OAAO,oBAAoB,KAAA,MAC1B,CAAC,OAAO,SAAS,OAAO,eAAe,KAAK,OAAO,kBAAkB,IAEtE,MAAM,IAAI,MAAM,GAAG,KAAK,kDAAkD;CAE5E,IACE,OAAO,2BAA2B,aAClC,OAAO,2BAA2B,cAClC,OAAO,2BAA2B,eAElC,MAAM,IAAI,MAAM,GAAG,KAAK,sDAAsD;CAEhF,IACG,OAAO,2BAA2B,mBAClC,OAAO,oBAAoB,KAAA,IAE5B,MAAM,IAAI,MAAM,GAAG,KAAK,6DAA6D;CAEvF,kCAAkC,OAAO,YAAY,MAAM,MAAM;CACjE,IAAI,OAAO,2BAA2B,aAAa,OAAO,eAAe,KAAA,GACvE,MAAM,IAAI,MAAM,GAAG,KAAK,yCAAyC;CAEnE,qCAAqC,OAAO,UAAU,QAAQ,MAAM,MAAM;CAC1E,IACE,OAAO,OAAO,UAAU,YACxB,OAAO,MAAM,WAAW,KACxB,OAAO,UAAU,OAAO,MAAM,KAAK,GAEnC,MAAM,IAAI,MAAM,GAAG,KAAK,wCAAwC;CAElE,IAAI,OAAO,OAAO,YAAY,WAC5B,MAAM,IAAI,MAAM,GAAG,KAAK,+CAA+C;CAEzE,IAAI,OAAO,OAAO,gBAAgB,WAChC,MAAM,IAAI,MACR,GAAG,KAAK,mHACV;CAEF,IAAI,OAAO,wBAAwB,KAAA,GAAW;EAC5C,qCAAqC,OAAO,mBAAmB;EAC/D,IAAI,OAAO,oBAAoB,UAAU,OAAO,OAC9C,MAAM,IAAI,MAAM,GAAG,KAAK,mDAAmD;EAE7E,IACE,OAAO,oBAAoB,kBAAkB,2BAC7C,OAAO,oBAAoB,sBAAsB,qBACjD,OAAO,oBAAoB,iBAAiB,oBAAoB,eAAe,WAC/E,OAAO,oBAAoB,YAAY,WAAW,YAAY,UAC9D,OAAO,oBAAoB,YAAY,MACpC,YAAY,UAAU,eAAe,YAAY,MACpD,GAEA,MAAM,IAAI,MAAM,GAAG,KAAK,+DAA+D;CAE3F,OAAO,IAAI,6BACT,MAAM,IAAI,MAAM,GAAG,KAAK,wDAAwD;AAEpF;AAEA,SAAS,gBAAgB,OAAgB,UAAkD;CACzF,IAAI,CAAC,wBAAwB,KAAK,GAAG,OAAO;CAE5C,QADa,OAAO,UAAU,WAAW,MAAM,SAAS,KAAK,UAAU,KAAK,CAAC,CAAC,WAC/D;AACjB;;;;;;;;;;;;;;;AC7FA,SAAS,YAAY,WAAmD;CACtE,OAAO,EACL,SAAS,GAAG,UAAU,wFACxB;AACF;AAEA,MAAM,oBAAoB,YAAY,MAAM;;;;;;AAmB5C,eAAsB,qBAAqB,OAWT;CAChC,MAAM,EAAE,UAAU,eAAe;CACjC,MAAM,OACJ,MAAM,UAAU,cAAc,YAAY,UAAU,gBAAgB,UAAU,SAAS,CAAC;CAC1F,MAAM,OACJ,MAAM,UACJ,QAAQ,UACR,YAAY,UAAU,gBAAgB,OAAO,SAAS,GAAG,gBAAgB,MAAM,SAAS,CAAC;CAC7F,MAAM,0BAAU,IAAI,IAAoB;CACxC,MAAM,UAAU,IAAI,IAAI,WAAW,WAAW,KAAK,cAAc,CAAC,UAAU,OAAO,SAAS,CAAC,CAAC;CAC9F,MAAM,4BAAY,IAAI,IAAY;CAClC,IAAI,QAAQ;CACZ,IAAI,sBAAsB;CAC1B,IAAI,qBAAqB;CACzB,KAAK,MAAM,aAAa,WAAW,YAAY;EAC7C,MAAM,EAAE,WAAW,MAAM,SAAS,aAAa,KAAK,SAAS,CAAC;EAC9D,IAAI,UAAU,IAAI,MAAM,GAAG,uBAAuB;EAClD,UAAU,IAAI,MAAM;EACpB,QAAQ,IAAI,UAAU,OAAO,MAAM;EAEnC,MAAM,gBAAgB,CACpB,GAAG,IAAI,IAAI,UAAU,cAAc,QAAQ,UAA2B,UAAU,IAAI,CAAC,CACvF;EACA,MAAM,UAAkF,CAAC;EACzF,KAAK,MAAM,SAAS,eAAe;GACjC,MAAM,eAAe,QAAQ,IAAI,KAAK;GACtC,MAAM,SAAS,QAAQ,IAAI,KAAK;GAChC,IAAI,iBAAiB,KAAA,KAAa,WAAW,KAAA,GAC3C,MAAM,IAAI,MACR,kBAAkB,UAAU,MAAM,gBAAgB,MAAM,qCAC1D;GAEF,IAAI,iBAAiB,QAAQ;GAC7B,IAAI,CAAC,QAAQ,MAAM,UAAU,MAAM,WAAW,YAAY,GACxD,QAAQ,KAAK;IAAE,QAAQ;IAAc,WAAW;GAAO,CAAC;EAE5D;EACA,IAAI,cAAc,SAAS,KAAK,QAAQ,WAAW,GAAG;GACpD,sBAAsB;GACtB;EACF;EACA,IAAI,QAAQ,WAAW,GAAG;GAExB,MAAK,MADe,SAAS,MAAM,EAAA,CACxB,KAAK,MAAM,CAAC,EAAE,QAAQ,UAAU,KAAK,GAAG;GACnD,MAAM,SAAS,WAAW;IACxB,aAAa;IACb,SAAS,CAAC;IACV,UAAU;IACV,aAAa;IACb,UAAU;IACV,aAAa,QAAQ,WAAW,MAAM,GAAG,UAAU;IACnD,WAAW;IACX,OAAO,CAAC;IACR,OAAO,uBAAuB,UAAU;GAC1C,CAAC;GACD,SAAS;GACT;EACF;EACA,MAAM,SAAS,WAAW;GACxB,aAAa;GACb,SAAS,QAAQ,KAAK,WAAW,OAAO,MAAM;GAC9C,UAAU,QAAQ,SAAS,IAAI,UAAU;GACzC,aAAa;GACb,UAAU,MAAM;GAChB,aAAa,QAAQ,WAAW,MAAM,GAAG,UAAU;GACnD,WAAW;GACX,OAAO,QAAQ,KAAK,WAAW,KAAK,OAAO,WAAW,SAAS,CAAC;GAChE,OAAO,kBAAkB,UAAU;EACrC,CAAC;EACD,SAAS;CACX;CACA,OAAO;EAAE;EAAS,OAAO,UAAU;EAAM;EAAO;EAAqB;CAAmB;AAC1F;;;;;;;AAcA,eAAsB,0BAA0B,OASd;CAChC,MAAM,EAAE,aAAa;CACrB,MAAM,YAAY,MAAM,aAAa;CACrC,MAAM,uBAAO,IAAI,IAAoB;CACrC,MAAM,aAAuB,CAAC;CAC9B,IAAI,QAAQ;CACZ,KAAK,MAAM,eAAe,MAAM,aAAa,cAAc;EAMzD,IAAI,EAFF,YAAY,SAAS,gBACpB,YAAY,SAAS,aAAa,YAAY,WAAW,wBAChD,YAAY,cAAc,KAAA,KAAa,YAAY,cAAc,KAAA,GAAW;EACxF,MAAM,gBAAgB,YAAY;EAClC,MAAM,UAAU,gBAAgB,YAAY,SAAS;EACrD,MAAM,aAAa,MAAM,SAAS,aAAa,YAAY,UAAU,OAAO,CAAC;EAE7E,MAAK,MADe,SAAS,MAAM,EAAA,CACxB,KAAK,WAAW,MAAM,CAAC,EAAE,QAAQ,UAAU,OAAO,GAAG;GAC9D,MAAM,SAAS,WAAW;IACxB,aAAa,WAAW;IACxB,SAAS,CAAC;IACV,UAAU;IACV,aAAa;IACb,UAAU,MAAM;IAChB,aAAa,GAAG,UAAU,YAAY,EAAE,aAAa;IACrD,WAAW,YAAY,SAAS;IAChC,OAAO,CAAC;IACR,OACE,cAAc,SACV,yCACA,GAAG,UAAU;GACrB,CAAC;GACD,WAAW,KAAK,WAAW,MAAM;EACnC;EACA,MAAM,QAAQ,MAAM,QAAQ,YAAY,SAAS;EACjD,MAAM,SAAS,GAAG,WAAW,OAAO,QAAQ,YAAY;EACxD,MAAM,MAAM,KAAK,IAAI,MAAM,KAAK;EAChC,KAAK,IAAI,QAAQ,MAAM,CAAC;EACxB,MAAM,SAAS,MAAM,SAAS,aAAa;GACzC,QAAQ,WAAW;GACnB,QAAQ,YAAY;GACpB;GACA;GACA,OAAO;EACT,CAAC;EACD,MAAM,SAAS,WAAW;GACxB;GACA,SAAS;GACT,SACE,YAAY,SAAS,eACjB,kBAAkB,YAAY,QAAQ,IACtC;IACE,QAAQ;IACR,SAAS,CAAC;IACV,OAAO;KACL,MAAM;KACN,SAAS;KACT,WAAW;IACb;GACF;GACN,YAAY;IACV,QAAQ;KAAE,QAAQ;KAAW,QAAQ;IAAgD;IACrF,MAAM;KACJ,QAAQ;KACR,oBAAoB;KACpB,QAAQ;IACV;GACF;GACA,UAAU,MAAM;EAClB,CAAC;EACD,SAAS;CACX;CACA,OAAO;EAAE;EAAO,yBAAyB;CAAW;AACtD;;;AAIA,SAAS,kBAAkB,UAAsC;CAC/D,MAAM,SAAU,YAAY,CAAC;CAI7B,IACE,OAAO,MAAM,WAAW,YACxB,OAAO,OAAO,UAAU,YACxB,OAAO,SAAS,OAAO,KAAK,GAE5B,OAAO;EAAE,QAAQ;EAAU,OAAO,OAAO;EAAO,SAAS,EAAE,OAAO,OAAO,MAAM;CAAE;CAEnF,OAAO;EACL,QAAQ;EACR,SAAS,CAAC;EACV,OAAO;GACL,MAAM;GACN,SACE,OAAO,OAAO,MAAM,UAAU,YAAY,OAAO,KAAK,MAAM,KAAK,CAAC,CAAC,SAAS,IACxE,OAAO,KAAK,MAAM,KAAK,IACvB;GACN,WAAW;EACb;CACF;AACF;;AAGA,SAAgB,gBAAgB,WAAkD;CAChF,OAAO,OAAO,cAAc,WAAW,YAAY;EAAE,MAAM;EAAc,YAAY;CAAU;AACjG;;;;;;;;;;;;;AA8BA,eAAsB,iBACpB,OAK+B;CAC/B,IAAI,MAAM,eAAe,MAAM,OAAO,qBAAqB;EAAE,GAAG;EAAO,WAAW;CAAO,CAAC;CAC1F,MAAM,EAAE,eAAe;CACvB,MAAM,OAAO,WAAW,WAAW,MAAM,cAAc,UAAU,UAAU,WAAW,SAAS;CAC/F,IAAI,CAAC,MACH,MAAM,IAAI,MAAM,oDAAoD,WAAW,WAAW;CAE5F,OAAO,qBAAqB;EAC1B,GAAG;EACH;EACA,WAAW;EACX,UAAU,gBAAgB,KAAK,SAAS;CAC1C,CAAC;AACH;;;;;;;;AASA,eAAsB,qBACpB,OAC+B;CAC/B,OAAO,qBAAqB;EAAE,GAAG;EAAO,WAAW;EAAY,YAAY;CAAK,CAAC;AACnF;AAEA,eAAe,qBACb,OAM+B;CAC/B,MAAM,EAAE,UAAU,YAAY,cAAc;CAC5C,MAAM,aAAa,UAAU,YAAY;CACzC,MAAM,SAAS,cACb,UAAU,KAAK,cAAc;EAC3B,QAAQ,SAAS;EACjB,QAAQ,SAAS;EACjB,QAAQ;GAAE,KAAK,cAAc,SAAS;GAAM,UAAU,cAAc,QAAQ;EAAE;CAChF,EAAE;CACJ,MAAM,QAAQ,MAAM,MAAM,cAAc;CACxC,MAAM,YAAY,MAAM,MAAM,kBAAkB;CAChD,MAAM,UAAU,cAAc;EAAE;EAAO;CAAU,CAAC;CAClD,MAAM,WAAW,MAAM,eAAe,KACpC;EACE,QAAQ,iBAAiB;GAAE,MAAM,MAAM;GAAM,UAAU,MAAM;EAAS,CAAC;EACvE,SAAS,MAAM;CACjB,GACA;EACE,SAAS,SAAS,WAAW,MAAM;EACnC,SAAS;GAAE,MAAM,MAAM;GAAM,cAAc,SAAS;EAAO;EAC3D,cAAc;EACd,WAAW;GACT,QAAQ;GACR,WAAW;GACX,OAAO,SAAS,SAAS,EACvB,SACE,kFACJ;GACA,OAAO,SAAS,SAAS,iBAAiB,OAAO;EACnD;EACA,QAAQ;GAAE;GAAO;GAAW,MAAM,CAAC;GAAG,cAAc;EAAK;EACzD,QAAQ;GAAE,WAAW;GAAY,YAAY;GAAY,MAAM,MAAM;EAAK;EAC1E,QAAQ;GACN,QAAQ;GACR,UAAU,MAAM;GAChB,UAAU;GACV,UAAU;GACV,gBAAgB;GAChB,kBAAkB;EACpB;EACA,aAAa;EACb,aAAa;EACb,UAAU;GACR,OAAO,SAAS;GAChB,OAAO,SAAS;GAChB,WAAW;IAAE,KAAK,eAAe,MAAM;IAAQ,UAAU;GAAQ;EACnE;CACF,CACF;CACA,MAAM,OAAO,MAAM,SAAS,aAAa,YAAY,UAAU,MAAM,eAAe,CAAC;CACrF,MAAM,SAAS,WAAW;EACxB,aAAa,KAAK;EAClB,SAAS,CAAC;EACV,UAAU;EACV,aAAa;EACb,UAAU;EACV,aAAa;EACb,WAAW,EAAE,SAAS,uDAAuD;EAC7E,OAAO,CAAC;EACR,OAAO;CACT,CAAC;CACD,MAAM,cAAc,GAAG,WAAW;CAClC,MAAM,SAAS,eAAe;EAAE;EAAa,eAAe;CAAuB,CAAC;CACpF,MAAM,WAAW;EACf,MAAM;EACN,MAAM,MAAM;EACZ;EACA,QAAQ,SAAS,SAAS;CAC5B;CACA,IAAI,YAAY,MAAM,qBAAqB;EAAE;EAAU;EAAY;CAAS,CAAC;CAC7E,MAAM,WAAW,IAAI,IAAI,MAAM,KAAK,SAAS,KAAK,MAAM,CAAC;CACzD,MAAM,cAAc,MAAM,0BAA0B;EAClD;EACA,cAAc,MAAM;EACpB;EACA,UAAU;GACR,OAAO,SAAS;GAChB,OAAO,SAAS;GAChB,WAAW;IAAE,KAAK,eAAe,MAAM;IAAQ,UAAU;GAAQ;EACnE;EACA,UAAU,cAAe,SAAS,IAAI,SAAS,IAAI,UAAU;EAC7D;CACF,CAAC;CAED,MAAM,SAAS,MAAM,SAAS,aAAa,YAAY,UAAU,MAAM,QAAQ,CAAC;CAChF,MAAM,MAAM,SAAS,MAAM,EAAA,CAAG,KAAK,OAAO,MAAM,CAAC,EAAE,QAAQ,UAAU,OAAO,GAC1E,MAAM,SAAS,WAAW;EACxB,aAAa,OAAO;EACpB,SAAS,CAAC;EACV,UAAU;EACV,aAAa;EACb;EACA,aAAa,GAAG,WAAW;EAC3B,WAAW,YAAY,SAAS;EAChC,OAAO,CAAC;EACR,OAAO,GAAG,UAAU;CACtB,CAAC;CAEH,MAAM,SAAS,gBAAgB;EAC7B;EACA,eAAe;EACf,WAAW,SAAS;EACpB,SAAS,EAAE,QAAQ,YAAY;EAC/B,YAAY,MAAM;CACpB,CAAC;CAED,MAAM,QAAQ,MAAM,SAAS,MAAM;CACnC,MAAM,QAAQ,MAAM,MAAM;CAC1B,MAAM,OAAO,OAAO;CACpB,MAAM,aAAa,MAAM,MAAM,EAAE,QAAQ,KAAK,CAAC,CAAC,CAAC,MAAM,SAAS,KAAK,UAAU,IAAI;CAEnF,MAAM,OAAO,aAAa,wBAAwB,GAAG,WAAW;CAChE,MAAM,QAAQ,aAAa,kCAAkC;CAC7D,KAAK,MAAM,QAAQ,OACjB,IAAI,KAAK,WAAW,QAAQ,YAC1B,MAAM,SAAS,WAAW;EACxB,QAAQ,KAAK;EACb,UAAU,EAAE,QAAQ,WAAW;EAC/B;EACA,QAAQ,GAAG,UAAU,2BAA2B;CAClD,CAAC;MACI,IAAI,cAAc,YAAY,wBAAwB,SAAS,KAAK,MAAM,GAC/E,MAAM,SAAS,WAAW;EACxB,QAAQ,KAAK;EACb,UAAU,EAAE,QAAQ,SAAS;EAC7B,MAAM;EACN,QAAQ;CACV,CAAC;MAED,MAAM,SAAS,WAAW;EACxB,QAAQ,KAAK;EACb,UAAU,KAAK,WAAW,OAAO,EAAE,QAAQ,UAAU,IAAI,EAAE,QAAQ,WAAW;EAC9E;EACA,QACE,KAAK,WAAW,OACZ,GAAG,UAAU,6DACb,GAAG,UAAU;CACrB,CAAC;CAGL,MAAM,SAAS,MAAM;EAAE,QAAQ;EAAU,OAAO;CAAK,CAAC;CACtD,OAAO,SAAS,QAAQ;EAAE,YAAY,MAAM;EAAM,OAAO,MAAM;CAAS,CAAC;AAC3E;;AC/aA,SAAS,yBACP,OACA,WACwB;CACxB,OAAO;EAEL,oBAAoB,IAAI,IAAI,MAAM,OAAO,CAAC,CAAC;EAC3C,sBAAsB,MAAM;EAC5B,iBAAiB,UAAU;EAE3B,4BAA4B,UAAU;EACtC,0CAA0C;EAE1C,uCAAuC;EAGvC,+BAA+B,OAC7B,KAAK,IAAI,UAAU,OAAO,2BAA2B,IAAM,CAC7D;EAGA,gBAAgB,QAAQ,UAAU,OAAO,oBAAoB,OAAW,GAAM;CAChF;AACF;;;AAIA,SAAS,oBACP,YACA,iBACyB;CACzB,OAAO;EACL,QACE,YAAY,gBAAgB,KAAA,KAAa,WAAW,iBAAiB,KAAA,IACjE;GAAE,QAAQ;GAAW,QAAQ;EAA+C,IAC5E;GACE,QAAQ;GACR,aAAa,WAAW;GACxB,cAAc,WAAW;GACzB,cAAc;EAChB;EACN,MACE,oBAAoB,KAAA,IAChB;GACE,QAAQ;GACR,oBAAoB;GACpB,QAAQ;EACV,IACA;GAAE,QAAQ;GAAS,KAAK;GAAiB,QAAQ;EAAW;CACpE;AACF;;AAGA,SAAS,gBACP,QACA,OACA,OAWA;CACA,MAAM,EACJ,MACA,iBACA,cACA,eACA,UACA,cACA,mBACA,yBACA,qBACE;CACJ,OAAO;EACL,WAAW;EACX,SAAS;EACT,QAAQ;EACR,cAAc,OAAO;EACrB,aAAa,MAAM,WAAW,eAAe;EAC7C,MAAM,MAAM;EACZ,QAAQ,aAAa,OAAO,QAAQ,mBAAmB;EACvD,eAAe,OAAO,iBAAiB,CAAC;EACxC,WAAW,OAAO;EAClB,YAAY,OAAO,cAAc;EACjC;EACA;EACA;EACA;EACA;EACA;EACA,0BAA0B,uCACxB,OAAO,wBACT;EACA,gBAAgB,OAAO,YACnB;GACE,OAAO,OAAO,UAAU;GACxB,SAAS,OAAO,UAAU;GAC1B,QAAQ,OAAO,UAAU;GAGzB,GAAI,OAAO,UAAU,sBAAsB,OAAO,EAAE,mBAAmB,KAAK,IAAI,CAAC;EACnF,IACA;EACJ,QAAQ,gCAAgC,cAAc,4BAA4B;EAClF,kBAAkB,OAAO,qBAAqB;CAChD;AACF;;AAGA,eAAe,kBACb,QACA,OACA,OASA;CACA,MAAM,EACJ,QACA,OACA,WACA,gBACA,iBACA,mBACA,qBACE;CACJ,MAAM,SAAS,MAAM,WAAW;CAChC,MAAM,eAAe,qBACnB,MAAM,gBACN,MAAM,oBACN,aACF;CACA,MAAM,WAAW,4BAA4B;EAC3C;EACA,OAAO;EACP;EACA,iBAAiB;EACjB,WAAW;EACX,UAAU,UAAU;EACpB,YAAY,MAAM;EAClB;EACA;EACA;EACA,kBAAkB,OAAO;CAC3B,CAAC;CACD,IAAI,yBAAyB;CAC7B,OAAO,+BAA+B;EACpC,OAAO,YAAY,EAAE,CAAC,CAAC,SAAS,KAAK;EACrC,gBAAgB;EAChB,wBAAwB;GAEtB,IADiB,UAAU,iBAChB,MAAM,KAAA,GAAW,OAAO,KAAA;GACnC,0BAA0B;GAC1B,OAAO;EACT;EACA;EACA,SAAS,eAAe;EACxB,GAAI,OAAO,2BAA2B,EAAE,QAAQ,OAAO,yBAAyB,IAAI,CAAC;EACrF,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC;CAC7B,CAAC;AACH;;AAGA,eAAsB,eACpB,QACA,OACA,MACA;CACA,MAAM,SAAS,MAAM,WAAW;CAChC,QAAQ,eAAe;CACvB,IAAI,OAAO,MAAM,oBAAoB,YAAY,MAAM,gBAAgB,SAAS,cAC9E,MAAM,IAAI,MAAM,GAAG,KAAK,mDAAmD;CAE7E,MAAM,oBAAoB,OAAO,MAAM,oBAAoB;CAC3D,IAAI,mBACF,0BAA0B,OAAO,QAAQ,IAAI;CAG/C,MAAM,UAAU,KAAK,IAAI;CACzB,MAAM,oBAAoB,OAAO,qBAAA;CACjC,MAAM,mBAAmB,OAAO,oBAAA;CAChC,MAAM,YAAY,OAAO,aAAA;CACzB,MAAM,UAAU,MAAM,WAAW,WAAW,kBAAkB;CAC9D,MAAM,SAAS,GAAG,MAAM,OAAO;CAC/B,QAAQ,UAAU,MAAM;CACxB,MAAM,aAAa,MAAM;CACzB,MAAM,YAAY,YAAY,EAAE,CAAC,CAAC,SAAS,KAAK;CAChD,MAAM,SAAS,OAAO,UAAU;CAChC,MAAM,eACJ,OAAO,aAAa,OAAO,SACvB;EACE,GAAG,OAAO;EACV,KAAK,4BAA4B,OAAO,OAAO,OAAO,CAAC,CAAC;CAC1D,IACA,OAAO;CACb,MAAM,kBAAkB,MAAM,gCAAgC;EAC5D,OAAO;EACP,SAAS;EACT,QAAQ;EACR,eAAe,OAAO;EACtB,GAAI,eAAe,EAAE,QAAQ,aAAa,IAAI,CAAC;EAC/C;EACA,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC;CAC7B,CAAC;CACD,MAAM,gBAAgB,4BAA4B,MAAM,eAAe;CACvE,MAAM,WAAW,MAAM,eAAe,KAAK,aACzC,yBAAyB,UAAU,QAAQ,kBAAkB,OAAO,gBAAgB,CACtF;CACA,MAAM,eAAe,MAAM,mBAAmB,KAAK,aACjD,yBAAyB,UAAU,QAAQ,kBAAkB,OAAO,gBAAgB,CACtF;CACA,MAAM,kBAAkB,0BAA0B,OAAO,QAAQ,MAAM,mBAAmB,MAAM;CAChG,MAAM,0BAA0B,KAAK,IAAI,OAAO,kBAAkB,kBAAkB,CAAC;CACrF,MAAM,yBAAyB,aAAa,SAAS,IAAI,eAAe,SAAA,CAAU,KAC/E,aAAa,SAAS,EACzB;CACA,MAAM,cAAc,gBAAgB,QAAQ,OAAO;EACjD;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF,CAAC;CACD,MAAM,kBAAkB,kCAAkC,WAAW;CACrE,MAAM,QAAQ,wBAAwB;EACpC,UAAU;EACV;EACA,eAAe,WAAW,WAAW,yBAAyB,OAAO,MAAM;CAC7E,CAAC;CACD,MAAM,YAAY,+BAA+B;EAC/C;EACA;EACA,QAAQ;EACR;EACA,gBAAgB;CAClB,CAAC;CACD,MAAM,iBAAiB,oCAAoC;EACzD;EACA,MAAM,GAAG,OAAO,gBAAgB,UAAU;CAC5C,CAAC;CAiBD,OAAO;EACL;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,cAxCmB,OAAO,YACxB,kCAAkC;GAChC;GACA,MAAM,GAAG,OAAO,oBAAoB,UAAU;EAChD,CAAC,IACD,KAAA;EAoCF,UAAA,MAnCqB,kBAAkB,QAAQ,OAAO;GACtD;GACA;GACA;GACA;GACA;GACA;GACA;EACF,CAAC;EA4BC;EACA;EACA;CACF;AACF;;AAOA,eAAsB,UACpB,KACA;CACA,MAAM,EACJ,QACA,mBACA,kBACA,WACA,QACA,YACA,WACA,QACA,cACA,iBACA,eACA,UACA,cACA,yBACA,iBACA,OACA,WACA,cACA,UACA,MACA,QACA,UACE;CACJ,MAAM,YAAY,cAAc,OAAO,CAAC;CACxC,IAAI;CAGJ,MAAM,6BAA4D;EAChE,IAAI,CAAC,YAAY,OAAO;EACxB,MAAM,oBACJ,OAAO,WAAW,sBAAsB,QAAQ,4BAA4B,OAAO,MAAM,IACrF,yBAAyB,YAAY,OAAO,SAAS,IACrD,KAAA;EACN,IAAI,CAAC,gBAAgB,CAAC,mBAAmB,OAAO;EAChD,OAAO;GACL,GAAI,gBAAgB,CAAC;GACrB,KAAK;IACH,GAAG,4BAA4B,SAAS;IACxC,GAAI,qBAAqB,CAAC;GAC5B;EACF;CACF;CACA,MAAM,uBACJ,gCAAgC;EAC9B,OAAO;EACP;EACA,GAAI,aAAa,EAAE,WAAW,IAAI,CAAC;CACrC,CAAC;CACH,MAAM,EAAE,QAAQ,cAAc,MAAM,eAAe;EACjD,OAAO,GAAG,KAAK;EACf,KAAK,YAAY;GACf,IAAI,OAAO,WAAW;IACpB,MAAM,sBAAsB,WAAW,QAAQ;KAC7C,OAAO;KACP,MAAM,UAAU;IAClB,CAAC;IACD,kCAAkC,qBAAqB,OAAO,UAAU,QAAQ,IAAI;IACpF,aAAa,MAAM,iCAAiC;KAClD,MAAM,OAAO,UAAU;KACvB,SAAS,OAAO,UAAU;KAC1B,iBAAiB,aAAc;KAC/B,OAAO,OAAO,UAAU;KACxB,QAAQ,OAAO,UAAU;KACzB,GAAI,OAAO,UAAU,oBACjB,EAAE,mBAAmB,OAAO,UAAU,kBAAkB,IACxD,CAAC;KACL,GAAI,OAAO,UAAU,sBAAsB,OAAO,EAAE,mBAAmB,KAAK,IAAI,CAAC;KACjF;KACA,OAAO;KACP,OAAO;KACP,MAAM,EAAE,GAAG,UAAU,YAAY;KACjC,cAAc;MACZ,UAAU,oBAAoB;MAC9B,GAAI,oBAAoB,eAAe,SAAS,eAC5C,CAAC,IACD,EAAE,SAAS,oBAAoB,aAAa;KAClD;KACA,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC;IAC7B,CAAC;GACH;GACA,MAAM,YAAY,GAAG,OAAO;GAC5B,MAAM,MAAM,WAAW,EAAE,WAAW,KAAK,CAAC;GA8C1C,OAAO;IAAE,QAAA,MA7CY,4BAA8C;KACjE,OAAO;KACP,YAAY;KACZ,QAAQ;KACR,OAAO;MACL;MACA;MACA;MACA;MACA;MACA,oBAAoB,OAAO,qBAAqB;MAChD,cAAc,OAAO;MACrB,MAAM,MAAM;MACZ,aAAa,SAAS;MACtB,eAAe,SAAS;MACxB;MACA,eAAe,OAAO,iBAAiB,CAAC;MACxC,QAAQ,OAAO;MACf,WAAW,OAAO;MAClB,GAAI,OAAO,aAAa,EAAE,YAAY,OAAO,WAAW,IAAI,CAAC;MAC7D;MACA;MACA;MACA;MACA;MACA;MACA;MACA,GAAI,cAAc,OAAO,YACrB,EACE,YAAY;OACV,SAAS,WAAW;OACpB,QAAQ,WAAW;OACnB,OAAO,OAAO,UAAU;OACxB,QAAQ,OAAO,UAAU;OACzB,GAAI,OAAO,UAAU,sBAAsB,OACvC,EAAE,mBAAmB,KAAK,IAC1B,CAAC;MACP,EACF,IACA,CAAC;KACP;KACA,QAAQ,qBAAqB;KAC7B;KACA,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC;IAC7B,CAAC;IACgB;GAAU;EAC7B;EACA,SAAS;CACX,CAAC;CACD,OAAO;EAAE;EAAQ;EAAW;CAAW;AACzC;;AAGA,SAAgB,mBACd,KACA,QAC+D;CAC/D,MAAM,EACJ,QACA,mBACA,mBACA,SACA,QACA,iBACA,iBACA,yBACA,uBACA,iBACA,OACA,UACA,MACA,WACE;CACJ,QAAQ,eAAe;CACvB,uBACE,QACA,MACA,mBACA,OAAO,OAAO,MACd,iBACA,yBACA,uBACA,mBACA,OAAO,OAAO,SAAS,YAAY,OAAO,OAAO,IAAI,WAAW,MAClE;CACA,kCAAkC;EAChC,OAAO;EACP,SAAS;EACT,gBAAgB,OAAO;EACvB;EACA;EACA,eAAe,OAAO;EACtB;EACA,SAAS,OAAO;CAClB,CAAC;CACD,IAAI,SAAS,YAAY,MAAM,OAAO,kBACpC,MAAM,IAAI,MACR,GAAG,KAAK,kBAAkB,OAAO,iBAAiB,yCAAyC,SAAS,YAAY,GAClH;CAEF,MAAM,aAAa,OAAO,sBACtB,oCAAoC;EAAE,SAAS,OAAO;EAAqB;CAAQ,CAAC,IACpF;CACJ,IAAI,YAAY;EACd,MAAM,WAAW,WAAW,WAAW,WAAW;EAClD,MAAM,eAAe,YAAY;GAC/B,MAAM;GACN,WAAW,OAAO;EACpB,CAAC;EACD,IAAI,UAAU,kBAAkB,cAC9B,MAAM,IAAI,MAAM,GAAG,KAAK,0DAA0D;CAEtF;CACA,OAAO;AACT;;AAGA,eAAsB,wBACpB,KACA,QACA,YAC2C;CAC3C,MAAM,EAAE,SAAS,QAAQ,iBAAiB,OAAO,gBAAgB,MAAM,QAAQ,UAAU;CAyBzF,OAtBwD,OAAO,eAC3D,MAAM,iBAAiB;EACrB;EACA,MAAM,OAAO,aAAa,QAAQ,GAAG,OAAO;EAC5C,UAAU;EACV,UAAU,OAAO,aAAa;EAC9B;EACA,MAAM,MAAM;EACZ,iBAAiB,MAAM;EACvB,gBAAgB,MAAM;EACtB,oBAAoB,MAAM;EAC1B;EACA,GAAI,aACA,EAAE,WAAW,IACb;GAAE,YAAY;GAAM,UAAU,4BAA4B,OAAO,aAAa;EAAE;EACpF,cAAc,yCAAyC;GACrD,SAAS,eAAe,QAAQ;GAChC;EACF,CAAC;EACD,sBAAsB,oBAAoB,OAAO,YAAY,OAAO,eAAe;CACrF,CAAC,IACD,KAAA;AAEN;;AAGA,SAAgB,UACd,KACA,QACA,YACA;CACA,MAAM,EAAE,YAAY,iBAAiB,WAAW,MAAM,WAAW;CACjE,MAAM,iBAAiB,sBACrB,WAAW,QAAQ;EACjB,OAAO;EACP,MAAM,UAAU;CAClB,CAAC,CACH;CACA,MAAM,mBAAmB,WAAW,QAAQ;EAC1C,OAAO;EACP,MAAM,UAAU;CAClB,CAAC;CACD,MAAM,oBAAoB,WAAW,KAAK;EACxC,OAAO;EACP,MAAM,UAAU;CAClB,CAAC;CACD,MAAM,gBAAgB,sBAAsB,gBAAgB;CAC5D,MAAM,uBAAuB,OAAO,mBAAmB;CACvD,IAAI,YAAY;EACd,WAAW,wBAAwB;EAInC,MAAM,QAAQ,WAAW,UAAU;EACnC,uCACE,OAAO,YACP,MAAM,OAAO,iBACb,MAAM,OAAO,uBACb,MACA,MACF;EACA,IAAI,OAAO,WAAW,sBAAsB,MAAM;GAChD,MAAM,oBAAoB,WAAW,KAAK;IACxC,OAAO;IACP,MAAM;KAAE,GAAG,UAAU;KAAa,MAAM;IAAY;GACtD,CAAC;GACD,IAAI,kBAAkB,WAAW,MAAM,UAAU,iBAC/C,MAAM,IAAI,MACR,GAAG,KAAK,oCAAoC,MAAM,UAAU,gBAAgB,oCAAoC,kBAAkB,OAAO,UAC3I;EAEJ;CACF;CAYA,OAAO;EAAE;EAAgB,YAXN,aACf,kCAAkC,kBAAkB,iBAAiB,IACrE,KAAA;EASiC,SARrB,iCAAiC,eAQN;EAAG,aAP1B,aAChB,uBAAuB,CACrB;GAAE,OAAO;GAAc,MAAM;EAAe,GAC5C;GAAE,OAAO;GAAmB,MAAM;EAAc,CAClD,CAAC,IACD,KAAA;EAEuD,sBAD9B,eAAe,eAAe;CACqB;AAClF;;AAGA,SAAgB,iBACd,KACA,QACA,WACA,YACA,eACA,OAC0B;CAC1B,MAAM,EAAE,SAAS,iBAAiB,OAAO,WAAW,gBAAgB,cAAc,WAAW;CAC7F,MAAM,EAAE,gBAAgB,YAAY,SAAS,aAAa,yBAAyB;CACnF,OAAO;EACL,eAAe,4BAA4B,OAAO,aAAa;EAC/D,GAAI,gBAAgB,EAAE,cAAc,IAAI,CAAC;EACzC,MAAM,aACF,cACA;GACE,cAAc;GACd,gBACE,OAAO,2BAA2B,cAClC,eAAe,eAAe,SAAS,eACnC;IAAE,MAAM;IAAa,KAAK;GAAqB,IAC/C;IAAE,MAAM;IAAc,KAAK;GAAK;GACtC,oBAAoB;GACpB,mBAAmB;IACjB,GAAG,eAAe;IAClB,OAAO,2BAA2B,aAC9B,4EACA;IACJ,GAAI,OAAO,UACP,CAAC,+DAA+D,IAChE,CAAC;GACP;EACF;EACJ,YAAY,KAAK,IAAI,IAAI;EACzB,YAAY;GACV,GAAG;GACH,GAAI,OAAO,YACP;IACE,gBAAgB,OAAO,UAAU;IACjC,kBAAkB,OAAO,UAAU;GACrC,IACA,CAAC;GACL,GAAI,cAAc,OAAO,WAAW,sBAAsB,OACtD,EAAE,mBAAmB,WAAW,UAAU,CAAC,CAAC,UAAU,IACtD,CAAC;GACL;GACA;GACA,SAAS,OAAO;GAChB,aAAa,OAAO;GACpB,iBAAiB,UAAU,oBAAoB;GAC/C,GAAI,OAAO,gCAAgC,KAAA,IACvC,EAAE,6BAA6B,OAAO,4BAA4B,IAClE,CAAC;GACL,aAAa;GACb,GAAI,aAAa,EAAE,WAAW,IAAI,CAAC;GACnC,cAAc,eAAe,QAAQ;GACrC,GAAI,OAAO,sBACP,EAAE,yBAAyB,OAAO,oBAAoB,IACtD,CAAC;GACL,GAAI,eAAe,EAAE,iBAAiB,aAAa,QAAQ,EAAE,IAAI,CAAC;EACpE;CACF;AACF;;;;;;;;;;;;;;;;;;;AC9iBA,SAAgB,uBACd,QAC0C;CAC1C,6BAA6B,MAAM;CACnC,SAAS,+BAA+B,MAAM;CAC9C,MAAM,OAAO,OAAO,QAAQ,sBAAsB,OAAO,MAAM;CAE/D,OAAO;EACL;EACA,MAAM,SAAS,OAAO;GACpB,MAAM,MAAM,MAAM,eAAe,QAAQ,OAAO,IAAI;GACpD,MAAM,EAAE,QAAQ,WAAW,eAAe,MAAM,UAAU,GAAG;GAI7D,OAAO,iBAAiB,KAAK,QAAQ,WAAW,YAAY,MAFhC,wBAAwB,KAAK,QADtC,mBAAmB,KAAK,MACsB,CAAU,GAC7D,UAAU,KAAK,QAAQ,UACsC,CAAK;EAClF;CACF;AACF;;;;AC5LA,SAAS,mBACP,MACM;CACN,IACE,KAAK,0BACL,iBAAkB,KAAK,wBAEvB,MAAM,IAAI,MACR,oIACF;CAEF,IAAI,CAAC,KAAK,UAAU,KAAK,OAAO,WAAW,GACzC,MAAM,IAAI,MAAM,4DAA4D;CAE9E,IAAI,OAAO,KAAK,wBAAwB,YACtC,MAAM,IAAI,MAAM,oEAAoE;CAEtF,IACE,KAAK,gBAAgB,KAAA,MACpB,OAAO,KAAK,gBAAgB,YAC3B,KAAK,YAAY,KAAK,CAAC,CAAC,WAAW,KACnC,KAAK,YAAY,KAAK,MAAM,KAAK,cAEnC,MAAM,IAAI,MACR,qFACF;CAEF,MAAM,0BAA0B,KAAK,wBAAwB;CAC7D,IACE,4BAA4B,KAAA,MAC3B,OAAO,4BAA4B,YAClC,wBAAwB,KAAK,CAAC,CAAC,WAAW,KAC1C,wBAAwB,KAAK,MAAM,0BAErC,MAAM,IAAI,MACR,4GACF;CAEF,IACE,KAAK,gBAAgB,KAAA,KACrB,4BAA4B,KAAA,KAC5B,KAAK,gBAAgB,yBAErB,MAAM,IAAI,MACR,8GACF;CAEF,IAAI;EACF,mBAAmB,KAAK,eAAe;CACzC,SAAS,OAAO;EACd,MAAM,IAAI,MAAM,0DAA0D,EAAE,MAAM,CAAC;CACrF;AACF;;AAGA,SAAS,aACP,MACM;CACN,MAAM,6BAAa,IAAI,IAAY;CACnC,KAAK,MAAM,SAAS,KAAK,QAAQ;EAC/B,IACE,CAAC,SACD,OAAO,UAAU,YACjB,OAAO,MAAM,SAAS,YACtB,MAAM,KAAK,KAAK,CAAC,CAAC,WAAW,KAC7B,MAAM,KAAK,KAAK,MAAM,MAAM,QAC5B,OAAO,MAAM,UAAU,cACvB,CAAC,MAAM,QAAQ,MAAM,UAAU,KAC/B,MAAM,WAAW,WAAW,GAE5B,MAAM,IAAI,MACR,wGACF;EAEF,IAAI,WAAW,IAAI,MAAM,IAAI,GAC3B,MAAM,IAAI,MAAM,qDAAqD,MAAM,KAAK,EAAE;EAEpF,WAAW,IAAI,MAAM,IAAI;EACzB,MAAM,gCAAgB,IAAI,IAAY;EACtC,KAAK,MAAM,aAAa,MAAM,YAAY;GACxC,IACE,CAAC,aACD,OAAO,UAAU,QAAQ,YACzB,UAAU,IAAI,KAAK,CAAC,CAAC,WAAW,KAChC,UAAU,IAAI,KAAK,MAAM,UAAU,OACnC,OAAO,UAAU,gBAAgB,YACjC,UAAU,YAAY,KAAK,CAAC,CAAC,WAAW,GAExC,MAAM,IAAI,MACR,sCAAsC,MAAM,KAAK,2BACnD;GAEF,IAAI,cAAc,IAAI,UAAU,GAAG,GACjC,MAAM,IAAI,MACR,sCAAsC,MAAM,KAAK,6BAA6B,UAAU,IAAI,EAC9F;GAEF,cAAc,IAAI,UAAU,GAAG;EACjC;CACF;AACF;;AAGA,SAAS,iBACP,MACA,MACA,WACA,YACM;CACN,IAAI,OAAO,KAAK,WAAW,YAAY,KAAK,OAAO,KAAK,CAAC,CAAC,WAAW,GACnE,MAAM,IAAI,MAAM,+DAA+D;CAEjF,IAAI,CAAC,OAAO,cAAc,IAAI,GAC5B,MAAM,IAAI,MAAM,gEAAgE,OAAO,IAAI,GAAG;CAEhG,IAAI,CAAC,OAAO,cAAc,SAAS,KAAK,aAAa,KAAK,YAAY,KACpE,MAAM,IAAI,MACR,sGAAsG,OAAO,SAAS,GACxH;CAEF,iBAAiB,UAAU;CAC3B,MAAM,mBAAmB,0BACvB,YACC,KAAK,QAAQ,UAAU,KAAK,QAAQ,SAAS,KAAM,CACtD;CACA,IAAI,YAAY,kBACd,MAAM,IAAI,MACR,0DAA0D,iBAAiB,+BAA+B,WAAW,UAAU,KAAK,QAAQ,OAAO,gBAAgB,WACrK;AAEJ;;AAGA,SAAS,aACP,MACM;CACN,IACE,KAAK,4BAA4B,KAAA,MAChC,CAAC,OAAO,cAAc,KAAK,uBAAuB,KAAK,KAAK,2BAA2B,IAExF,MAAM,IAAI,MACR,qFACF;CAEF,IACE,KAAK,mBAAmB,KAAA,MACvB,CAAC,OAAO,cAAc,KAAK,cAAc,KAAK,KAAK,kBAAkB,IAEtE,MAAM,IAAI,MAAM,4EAA4E;CAE9F,IACE,KAAK,sBAAsB,KAAA,MAC1B,CAAC,OAAO,cAAc,KAAK,iBAAiB,KAC3C,KAAK,oBAAoB,KACzB,KAAK,oBAAoB,aAE3B,MAAM,IAAI,MACR,8GACF;CAEF,IACE,KAAK,gBAAgB,KAAA,MACpB,CAAC,OAAO,SAAS,KAAK,WAAW,KAAK,KAAK,cAAc,IAE1D,MAAM,IAAI,MACR,4FACF;CAEF,IACE,KAAK,gBAAgB,KAAA,KACrB,KAAK,eAAe,KAAA,KACpB,KAAK,WAAW,mBAAmB,KAAK,aAExC,MAAM,IAAI,MACR,kFACF;AAEJ;AAEA,SAAgB,yBACd,MACA,MACA,WACA,YACM;CACN,mBAAmB,IAAI;CACvB,aAAa,IAAI;CACjB,iBAAiB,MAAM,MAAM,WAAW,UAAU;CAClD,aAAa,IAAI;AACnB;AAEA,SAAgB,iBAAiB,YAA0B;CACzD,IAAI,CAAC,OAAO,SAAS,UAAU,KAAK,cAAc,KAAK,cAAc,GACnE,MAAM,IAAI,MACR,gFAAgF,OAAO,UAAU,GACnG;AAEJ;AAEA,SAAgB,0BAA0B,YAAoB,iBAAiC;CAC7F,MAAM,QAAS,IAAI,mBAAoB,IAAI;CAC3C,OAAO,KAAK,KAAK,QAAQ,OAAO,UAAU,KAAK,IAAI,GAAG,KAAK,IAAI,EAAE;AACnE;;;;;;;;;;;;;;ACHA,eAAsB,2BACpB,SACuC;CAQvC,OAAO,iBADI,oBADA,aAAa,MADP,eAAe,MADf,uBAAuB,MADvB,mBAAmB,MADnB,iBADN,2BAA2B,EAAE,QAAQ,CACb,CAAC,CACE,CACI,CACR,CAEF,CACP,CAAC;AAC5B;;AAGA,SAAS,2BAAkE,MAExE;CACD,MAAM,EAAE,YAAY;CACpB,MAAM,OAAO;EACX,GAAG;EACH,SAAS,QAAQ,QAAQ,KAAK,YAAY,EAAE,GAAG,OAAO,EAAE;EACxD,gBAAgB,gBAAgB,QAAQ,cAAc;EACtD,oBAAoB,gBAAgB,QAAQ,kBAAkB;EAC9D,eAAe,gBAAgB,QAAQ,aAAa;EACpD,QAAQ,QAAQ,OAAO,IAAI,YAAY;EACvC,OAAO,QAAQ,SAAS,sBAAsB,QAAQ,KAAK;EAC3D,eAAe,QAAQ,iBAAiB,2BAA2B,QAAQ,aAAa;CAC1F;CACA,0BAA0B,KAAK,OAAO;CACtC,2BAA2B,IAAI;CAC/B,MAAM,sBAAsB,KAAK,uBAAuB;CACxD,oCAAoC,IAAI;CACxC,MAAM,OAAO,KAAK,QAAQ;CAC1B,MAAM,aAAa,KAAK,cAAc;CACtC,iBAAiB,UAAU;CAC3B,MAAM,0BAA0B,KAAK,2BAA2B;CAChE,MAAM,kBAAmB,KAAK,QAAQ,UAAU,KAAK,QAAQ,SAAS,KAAM;CAC5E,MAAM,qBAAqB,KAAK,IAAI,cAAc;CAClD,MAAM,mBAAmB,0BAA0B,YAAY,eAAe;CAC9E,MAAM,YAAY,KAAK,aAAa,KAAK,IAAI,KAAM,gBAAgB;CACnE,yBAAyB,MAAM,MAAM,WAAW,UAAU;CAC1D,MAAM,WAAW,KAAK,aAAa,KAAA,IAAY,KAAA,IAAY,gBAAgB,KAAK,QAAQ;CACxF,MAAM,oCAAoB,IAAI,IAA6B;CAC3D,MAAM,UAAU,KAAK,WAAW,kBAAkB;CAClD,MAAM,iBAAiB,cAAc,KAAK,QAAQ,KAAK,IAAI;CAC3D,MAAM,kBAAkB,gBAAgB,KAAK,eAAe;CAC5D,MAAM,aACJ,KAAK,cACL,oBAAoB;EAClB;EACA,QAAQ,GAAG,eAAe;EAC1B,gBAAgB,KAAK;CACvB,CAAC;CAEH,OAAO;EACL,GAAG;EACH;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF;AACF;;AAGA,eAAe,iBACb,MACA;CACA,MAAM,EACJ,MACA,MACA,oBACA,WACA,UACA,mBACA,SACA,gBACA,eACE;CACJ,MAAM,cAAc,OAClB,SACA,KACA,cACoC;EACpC,MAAM,kBAAkB,gBAAgB,OAAO;EAC/C,MAAM,WAAiD,MAAM,YAAkC;GAC7F,GAAG;GACH;GACA;GACA;GACA,WAAW,KAAK,cAAc,KAAK,aAAa,gBAAgB,QAAQ,CAAC;GACzE,WAAW,UAAU,QACnB,KAAK,oBAAoB,gBAAgB,eAAe,GAAG,UAAU,GAAG;GAC1E,aAAa,8BAA8B,kBAAkB,IAAI,EAAE,GAAG,mBAAmB,eAAe;GACxG,QAAQ,GAAG,eAAe,GAAG;EAC/B,CAAC;EACD,uBACE,UACA,KAAK,eACL,KAAK,QAAQ,GACb,MACA,+BAA+B,IAAI,kBACrC;EACA,IAAI,UACF,kBAAkB,IAChB,mBAAmB,eAAe,GAClC,8BAA8B;GAAE;GAAU,SAAS;GAAiB,SAAS;EAAS,CAAC,CACzF;EACF,MAAM,aAAqC,CAAC;EAC5C,KAAK,MAAM,EAAE,YAAY,eAAe,kBAAkB,QAAQ,CAAC,CAAC,WAClE,WAAW,cAAc;EAE3B,OAAO;CACT;CAIA,MAAM,cAAc,KAAK,cAAc,KAAK,MAAM,EAAE,EAAE,CAAC,CAAC,KAAK;CAC7D,MAAM,iBAAiB,KAAK,QACxB,kBAAkB,KAAK,OAAO,KAAK,aAAa,IAChD,IAAI,IAAI,YAAY,KAAK,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;CAC7C,MAAM,QAA+B,KAAK,QACtC,yBAAyB,KAAK,OAAO,KAAK,aAAa,IACvD;EACE,cAAc,YAAY;EAC1B,kBAAkB,YAAY;EAC9B,OAAO,YAAY,KAAK,QAAQ;GAAE;GAAI,cAAc;EAAE,EAAE;CAC1D;CACJ,MAAM,kBAAkB,QAA4B;EAClD,MAAM,yBAAS,IAAI,IAAsB;EACzC,YAAY,SAAS,IAAI,UAAU;GACjC,MAAM,SAAS,eAAe,IAAI,EAAE;GACpC,MAAM,SAAS,OAAO,IAAI,MAAM,KAAK,CAAC;GACtC,OAAO,KAAK,IAAI,MAAO;GACvB,OAAO,IAAI,QAAQ,MAAM;EAC3B,CAAC;EACD,OAAO,MAAM,MAAM,KAAK,SAAS,WAAW,OAAO,IAAI,KAAK,EAAE,CAAE,CAAC;CACnE;CACA,MAAM,kBAAkB;EACtB;EACA;EACA,YAAY;EACZ,WAAW,KAAK,OAAO,iBAAiB;CAC1C;CACA,MAAM,SAAS,YAAoC,UAA4B;EAC7E,MAAM,UAAU,YAAY,QAAQ,OAAO,EAAE,MAAM,WAAW;EAC9D,IAAI,QAAQ,SAAS,GACnB,MAAM,IAAI,MACR,+BAA+B,MAAM,2CAA2C,QAAQ,KACtF,IACF,EAAE,sIACJ;EAEF,OAAO,YAAY,KAAK,OAAO,WAAW,GAAI;CAChD;CAEA,OAAO;EACL,GAAG;EACH;EACA;EACA;EACA;EACA;EACA;EACA;CACF;AACF;;AAGA,eAAe,mBACb,MACA;CACA,MAAM,EACJ,MACA,MACA,yBACA,SACA,gBACA,iBACA,eACE;CAGJ,IAAI,KAAK,OAAO,mBAAmB,aACjC,iCAAiC,KAAK,OAAO,KAAK,eAAe,CAC/D,GAAG,KAAK,gBACR,GAAG,KAAK,kBACV,CAAC;CAEH,IAAI,KAAK,eACP,MAAM,qBAAqB,KAAK,eAAe,KAAK,OAAO,KAAK,eAAe,CAC7E,GAAG,KAAK,gBACR,GAAG,KAAK,kBACV,CAAC;CAEH,MAAM,oBAAoB,IAAI,gBAAgB;CAC9C,MAAM,YAAY,MAAM,cAAc,KAAK,SAAS,yBAAyB,OAAO,WAAW;EAC7F,IAAI;GACF,MAAM,EACJ,UAAU,KACV,MACA,SAAS,0BACP,MAAM,0BAA0B;IAClC;IACA,OAAO,8BACL,MACA,OAAO,MACP,gBACA,MACA,iBACA,YACA,kBAAkB,MACpB;IACA;IACA,qBAAqB,KAAK;IAC1B,2BAA2B,KAAK;GAClC,CAAC;GACD,MAAM,gBAAgB,IAAI;GAC1B,OAAO;IACL,MAAM,OAAO;IACb;IACA;IACA,GAAI,IAAI,eAAe,KAAA,IAAY,CAAC,IAAI,EAAE,YAAY,IAAI,WAAW;IACrE,GAAI,IAAI,gBAAgB,KAAA,IAAY,CAAC,IAAI,EAAE,aAAa,IAAI,YAAY;IACxE,GAAI,IAAI,eAAe,KAAA,IAAY,CAAC,IAAI,EAAE,YAAY,IAAI,WAAW;IACrE;GACF;EACF,SAAS,OAAO;GACd,IAAI,CAAC,kBAAkB,OAAO,SAAS,kBAAkB,MAAM,KAAK;GACpE,MAAM;EACR;CACF,CAAC;CACD,gCACE,uBACE,UAAU,KAAK,YAAY;EACzB,OAAO,WAAW,OAAO,KAAK;EAC9B,MAAM,OAAO;CACf,EAAE,CACJ,CAAC,CAAC,cACF,KAAK,aACL,cACF;CACA,OAAO;EAAE,GAAG;EAAM;EAAmB;CAAU;AACjD;;AAGA,eAAe,uBACb,MACA;CACA,MAAM,EAAE,MAAM,MAAM,iBAAiB,cAAc;CACnD,MAAM,mBAAmB,YAAY;EACnC,UAAU,mBAAmB,eAAe;EAC5C,SAAS,UAAU,KAAK,YAAY;GAClC,MAAM,OAAO;GACb,SAAS,mBAAmB,OAAO,aAAa;EAClD,EAAE;EACF,eAAe,KAAK;EACpB,QAAQ,KAAK,OAAO,KAAK,WAAW;GAClC,MAAM,MAAM;GACZ,YAAY,MAAM;GAClB,SACE,MAAM,gBACN,YAAY;IACV,OAAO,MAAM,MAAM,SAAS;IAC5B,WAAW,MAAM,WAAW,SAAS,KAAK;GAC5C,CAAC;EACL,EAAE;EACF,UAAU,kBAAkB,IAAI;EAChC;EACA,MAAM,KAAK,QAAQ;CACrB,CAAC;CACD,MAAM,gBAAgB,mCAAmC;CACzD,MAAM,gBAAgB,KAAK,gBACvB,MAAM,oBAAoB,KAAK,eAAe,KAAK,OAAO,KAAK,eAAe,CAC5E,iBACA,GAAG,UAAU,KAAK,WAAW,OAAO,aAAa,CACnD,CAAC,IACD,KAAA;CACJ,OAAO;EAAE,GAAG;EAAM;EAAkB;EAAe;CAAc;AACnE;;AAGA,eAAe,eACb,MACA;CACA,MAAM,EAAE,iBAAiB,aAAa,OAAO,WAAW,kBAAkB;CAG1E,MAAM,cAAc,MAClB,MAAM,YAAY,iBAAiB,iBAAiB,aAAa,GACjE,UACF;CACA,MAAM,sCAAsB,IAAI,IAAI,CAAC,CAAC,mBAAmB,eAAe,GAAG,WAAW,CAAC,CAAC;CACxF,MAAM,UAAiE,CAAC;CACxE,KAAK,MAAM,UAAU,WAAW;EAC9B,MAAM,aAAa,mBAAmB,OAAO,aAAa;EAC1D,IAAI,MAAM,oBAAoB,IAAI,UAAU;EAC5C,IAAI,CAAC,KAAK;GAMR,MAAM,MAAM,MALa,YACvB,OAAO,eACP,gBAAgB,KAAK,OAAO,IAAI,KAChC,aACF,GACwB,WAAW,OAAO,KAAK,EAAE;GACjD,oBAAoB,IAAI,YAAY,GAAG;EACzC;EACA,QAAQ,KAAK;GACX,GAAG;GACH;EACF,CAAC;CACH;CAEA,OAAO;EAAE,GAAG;EAAM;EAAa;EAAqB;CAAQ;AAC9D;;AAGA,SAAS,aACP,MACA;CACA,MAAM,EACJ,UACA,mBACA,iBACA,aACA,OACA,gBACA,iBACA,aACA,YACE;CACJ,MAAM,SAAoC,QAAQ,KAAK,MAAM;EAC3D,MAAM,gBAAgB,eAAe,WAAW;EAChD,MAAM,cAAc,eAAe,EAAE,GAAG;EACxC,MAAM,WAAW,sBAAsB,eAAe,aAAa,eAAe;EAClF,MAAM,QAAiC;GACrC,MAAM,EAAE;GACR,mBAAmB,WAAW,aAAa;GAC3C,iBAAiB,WAAW,WAAW;GACvC,MAAM,SAAS;GACf,QAAQ;IAAE,KAAK,SAAS;IAAK,MAAM,SAAS;GAAK;GACjD;GACA,kBAAkB,EAAE;GACpB,gBAAgB,YAAY,KAAK,YAAY,WAAW;IACtD;IACA,mBAAmB,YAAY;IAC/B,iBAAiB,EAAE,IAAI;IACvB,MAAM,EAAE,IAAI,SAAU,YAAY;GACpC,EAAE;GACF,YAAY,MAAM,MAAM,KAAK,MAAM,WAAW;IAC5C,QAAQ,KAAK;IACb,WAAW,KAAK;IAChB,mBAAmB,cAAc;IACjC,iBAAiB,YAAY;IAC7B,MAAM,YAAY,SAAU,cAAc;GAC5C,EAAE;GACF,eAAe,gBAAgB,EAAE,aAAa;GAC9C,MAAM;EACR;EACA,IAAI,UAAU;GACZ,MAAM,WAAW,kBAAkB,IAAI,mBAAmB,eAAe,CAAC;GAC1E,MAAM,SAAS,kBAAkB,IAAI,mBAAmB,EAAE,aAAa,CAAC;GACxE,IAAI,CAAC,YAAY,CAAC,QAAQ,MAAM,IAAI,MAAM,uCAAuC;GACjF,MAAM,WAAW;IAAE;IAAU;GAAO;EACtC;EACA,IAAI,EAAE,gBAAgB,KAAA,GAAW,MAAM,cAAc,gBAAgB,EAAE,WAAW;EAClF,IAAI,EAAE,eAAe,KAAA,GAAW,MAAM,aAAa,EAAE;EACrD,IAAI,EAAE,eAAe,KAAA,GAAW,MAAM,aAAa,gBAAgB,EAAE,UAAU;EAC/E,OAAO;CACT,CAAC;CACD,OAAO,MAAM,GAAG,MAAM,EAAE,OAAO,EAAE,IAAI;CAGrC,KAAK,IAAI,QAAQ,GAAG,QAAQ,OAAO,SAAU;EAC3C,IAAI,MAAM,QAAQ;EAClB,OAAO,MAAM,OAAO,UAAU,OAAO,IAAI,CAAE,SAAS,OAAO,MAAM,CAAE,MAAM,OAAO;EAChF,MAAM,OAAO,OAAO,MAAM,OAAO,GAAG;EACpC,IAAI,KAAK,OAAO,UAAU,MAAM,iBAAiB,kBAAkB,GAAG;GACpE,KAAK,MAAM,GAAG,MAAM,EAAE,iBAAiB,eAAe,EAAE,iBAAiB,YAAY;GACrF,OAAO,OAAO,OAAO,KAAK,QAAQ,GAAG,IAAI;EAC3C;EACA,QAAQ;CACV;CACA,OAAO,SAAS,GAAG,MAAM;EACvB,EAAE,OAAO,IAAI;CACf,CAAC;CACD,MAAM,OAAO,OAAO;CAEpB,OAAO;EAAE,GAAG;EAAM;EAAQ;CAAK;AACjC;;AAGA,SAAS,oBACP,MACA;CACA,MAAM,EAAE,gBAAgB,iBAAiB,SAAS,QAAQ,SAAS;CACnE,MAAM,SAAS,IAAI,IAAI,QAAQ,KAAK,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;CACtD,MAAM,UAAU,eAAe,OAAO,IAAI,KAAK,IAAI,CAAC,CAAE,GAAG;CACzD,MAAM,WAAyC,OAAO,MAAM,CAAC,CAAC,CAAC,KAAK,UAAU;EAC5E,MAAM,WAAW,eAAe,OAAO,IAAI,MAAM,IAAI,CAAC,CAAE,GAAG;EAE3D,MAAM,WAAW,sBAAsB,UAAU,SAAS,eAAe;EACzE,MAAM,UAAU,sBAAsB,SAAS,UAAU,eAAe;EACxE,MAAM,UAAU,SAAS,UAAU,KAAK,OAAO,QAAQ,UAAU,MAAM,OAAO;EAC9E,OAAO;GACL,GAAG,KAAK;GACR,GAAG,MAAM;GACT,WAAW,SAAS;GACpB,KAAK,SAAS;GACd,MAAM,SAAS;GACf;GACA;EACF;CACF,CAAC;CAED,OAAO;EAAE,GAAG;EAAM;EAAQ;EAAS;CAAS;AAC9C;;AAGA,SAAS,iBACP,MAC8B;CAC9B,MAAM,EACJ,MACA,qBACA,MACA,YACA,iBACA,oBACA,WACA,YACA,aACA,OACA,WACA,eACA,eACA,QACA,MACA,aACE;CACJ,MAAM,mBAAmB,uBACvB,OAAO,KAAK,WAAW;EAAE,OAAO,WAAW,MAAM,KAAK;EAAI,MAAM,MAAM;CAAiB,EAAE,CAC3F;CACA,MAAM,WAAW,sBAAsB,WAAW,QAAQ,EAAE,OAAO,cAAc,CAAC,CAAC;CACnF,MAAM,YAAY,uBAAuB,CACvC;EAAE,OAAO;EAAgB,MAAM;CAAiB,GAChD;EAAE,OAAO;EAAc,MAAM;CAAS,CACxC,CAAC;CACD,gCAAgC,UAAU,cAAc,KAAK,aAAa,OAAO;CACjF,OAAO;EACL;EACA;EACA;EACA,iBAAiB;EACjB;EACA,iBAAiB,KAAK,QAAQ,eAAe;EAC7C,aAAa,YAAY,UAAU,KAAK,QAAQ;EAChD,GAAI,KAAK,QAAQ,EAAE,OAAO,KAAK,MAAM,IAAI,CAAC;EAC1C,GAAI,gBAAgB,EAAE,cAAc,IAAI,CAAC;EACzC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,MAAM,KAAK,QAAQ;EACnB,eAAe,OAAO,OAAO;GAC3B,QAAQ;GACR,aAAa,UAAU,OAAO,WAAW,OAAO,sBAAsB,WAAW,UAAU;GAC3F,WAAW,OAAO,OAAO,UAAU,KAAK,WAAW,OAAO,qBAAqB,CAAC;EAClF,CAAC;CACH;AACF;AAEA,SAAS,gCACP,cACA,aACA,OACM;CACN,MAAM,YACJ,OAAO,UAAU,KAAK,IAAI,GAAG,KAAK,IAAI,YAAY,GAAG,KAAK,IAAI,eAAe,CAAC,CAAC,IAAI;CACrF,IAAI,gBAAgB,KAAA,KAAa,eAAe,cAAc,WAC5D,MAAM,IAAI,MACR,wCAAwC,MAAM,QAAQ,aAAa,uBAAuB,aAC5F;AAEJ;AAEA,SAAS,0BACP,SACM;CACN,IAAI,CAAC,MAAM,QAAQ,OAAO,KAAK,QAAQ,WAAW,GAChD,MAAM,IAAI,MAAM,mDAAmD;CAErE,MAAM,wBAAQ,IAAI,IAAY;CAC9B,MAAM,6BAAa,IAAI,IAAoB;CAC3C,KAAK,MAAM,UAAU,SAAS;EAC5B,IAAI,CAAC,UAAU,OAAO,WAAW,YAAY,OAAO,OAAO,aAAa,YACtE,MAAM,IAAI,MAAM,uEAAuE;EAEzF,IAAI,CAAC,OAAO,QAAQ,OAAO,KAAK,KAAK,MAAM,OAAO,MAChD,MAAM,IAAI,MAAM,wEAAwE;EAE1F,IAAI,MAAM,IAAI,OAAO,IAAI,GACvB,MAAM,IAAI,MAAM,sDAAsD,OAAO,KAAK,EAAE;EAEtF,MAAM,IAAI,OAAO,IAAI;EACrB,MAAM,UAAU,KAAK,OAAO,IAAI;EAChC,MAAM,QAAQ,WAAW,IAAI,OAAO;EACpC,IAAI,OACF,MAAM,IAAI,MACR,6CAA6C,MAAM,SAAS,OAAO,KAAK,8BAA8B,QAAQ,EAChH;EAEF,WAAW,IAAI,SAAS,OAAO,IAAI;CACrC;AACF;AAEA,SAAS,2BACP,MACM;CACN,MAAM,aAGD;EACH;GAAE,MAAM;GAAkB,WAAW,KAAK;EAAe;EACzD;GAAE,MAAM;GAAsB,WAAW,KAAK;EAAmB;EACjE;GAAE,MAAM;GAAiB,WAAW,KAAK;EAAc;CACzD;CAEA,MAAM,wBAAQ,IAAI,IAAoB;CACtC,KAAK,MAAM,aAAa,YAAY;EAClC,IAAI,CAAC,MAAM,QAAQ,UAAU,SAAS,KAAK,UAAU,UAAU,WAAW,GACxE,MAAM,IAAI,MAAM,+BAA+B,UAAU,KAAK,UAAU;EAE1E,IAAI,UAAU,SAAS,mBAAmB,UAAU,UAAU,SAAS,GACrE,MAAM,IAAI,MACR,iGACF;EAEF,MAAM,wBAAQ,IAAI,IAAY;EAC9B,MAAM,6BAAa,IAAI,IAAY;EACnC,MAAM,2BAAW,IAAI,IAAoB;EACzC,KAAK,MAAM,YAAY,UAAU,WAAW;GAC1C,IAAI,MAAM,IAAI,SAAS,EAAE,GAAG,WAAW,IAAI,SAAS,EAAE;GACtD,MAAM,IAAI,SAAS,EAAE;GACrB,MAAM,QAAQ,MAAM,IAAI,SAAS,EAAE;GACnC,IAAI,UAAU,KAAA,KAAa,UAAU,UAAU,MAAM,SAAS,IAAI,SAAS,IAAI,KAAK;EACtF;EACA,IAAI,WAAW,OAAO,GACpB,MAAM,IAAI,MACR,+BAA+B,UAAU,KAAK,sCAAsC,CAClF,GAAG,UACL,CAAC,CAAC,KAAK,IAAI,EAAE,EACf;EAEF,IAAI,SAAS,OAAO,GAAG;GACrB,MAAM,SAAS,CAAC,GAAG,QAAQ,CAAC,CACzB,KAAK,CAAC,IAAI,WAAW,GAAG,GAAG,IAAI,MAAM,KAAK,UAAU,KAAK,EAAE,CAAC,CAC5D,KAAK,IAAI;GACZ,MAAM,IAAI,MACR,0HAA0H,OAAO,EACnI;EACF;EACA,qBAAqB,UAAU,WAAW,KAAK,QAAQ,CAAC;EACxD,KAAK,MAAM,MAAM,OAAO,MAAM,IAAI,IAAI,UAAU,IAAI;CACtD;AACF;AAEA,SAAS,KAAK,MAAsB;CAClC,OACE,KACG,QAAQ,gBAAgB,GAAG,CAAC,CAC5B,QAAQ,UAAU,EAAE,CAAC,CACrB,YAAY,KAAK;AAExB;AAEA,SAAS,8BACP,MACA,YACA,gBACA,MACA,iBACA,YACA,oBAC+C;CAC/C,MAAM,eAAe,GAAG,eAAe,gBAAgB,KAAK,UAAU;CACtE,MAAM,SAAS,oBACb,KAAK,QACL,KAAK,wBAAwB,QAC7B,kBACF;CACA,OAAO,OAAO,OAAO;EACnB,iBAAiB,gBAAgB,eAAe;EAChD,gBAAgB,KAAK;EACrB,oBAAoB,KAAK;EACzB,qBAAqB,KAAK;EAC1B,QAAQ,KAAK;EACb,QAAQ;EACR;EACA,YAAY,OAAO,OAAO;GACxB,GAAI,KAAK,0BAA0B,CAAC;GACpC,GAAI,KAAK,wBAAwB,gBAAgB,KAAA,KAAa,KAAK,gBAAgB,KAAA,IAC/E,EAAE,aAAa,KAAK,YAAY,IAChC,CAAC;GACL,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC;EAC7B,CAAC;EACD;CACF,CAAC;AACH;AAEA,SAAS,kBACP,MACQ;CACR,QAAQ,KAAK,eAAe,KAAK,oBAAoB,SAAS;AAChE;ACnzBA,MAAM,qBAAqB;AAE3B,SAAgB,mCACd,QACwD;CACxD,MAAM,SAAS,gCAAgC,OAAO,MAAM;CAC5D,OAAO;EACL,GAAG;EACH,SAAS,gBAAgB,OAAO,OAAO;EACvC,WAAW,uBAAuB,OAAO,SAAS;EAClD,GAAI,OAAO,2BACP,EAAE,0BAA0B,EAAE,GAAG,OAAO,yBAAyB,EAAE,IACnE,CAAC;EACL,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC;CAC7B;AACF;AAEA,SAAgB,iCACd,QACM;CACN,IAAI,CAAC,OAAO,WAAW,OAAO,OAAO,YAAY,UAC/C,MAAM,IAAI,MAAM,iDAAiD;CAEnE,IACE,OAAO,SAAS,KAAA,MACf,OAAO,OAAO,SAAS,YAAY,CAAC,OAAO,KAAK,KAAK,KAAK,OAAO,KAAK,KAAK,MAAM,OAAO,OAEzF,MAAM,IAAI,MAAM,gEAAgE;CAElF,IACE,OAAO,eAAe,KAAA,MACrB,OAAO,OAAO,eAAe,YAC5B,CAAC,OAAO,WAAW,KAAK,KACxB,OAAO,WAAW,KAAK,MAAM,OAAO,aAEtC,MAAM,IAAI,MAAM,sEAAsE;CAExF,KAAK,MAAM,CAAC,OAAO,UAAU,CAC3B,CAAC,aAAa,OAAO,SAAS,GAC9B,CAAC,gBAAgB,OAAO,YAAY,CACtC,GACE,IAAI,OAAO,UAAU,YAAY,CAAC,MAAM,KAAK,KAAK,MAAM,KAAK,MAAM,OACjE,MAAM,IAAI,MAAM,+BAA+B,MAAM,+BAA+B;CAGxF,0BAA0B,OAAO,QAAQ,QAAQ,gBAAgB;CACjE,0BAA0B,OAAO,QAAQ,WAAW,mBAAmB;CACvE,0BAA0B,OAAO,gBAAgB,gBAAgB;CACjE,KAAK,MAAM,CAAC,OAAO,UAAU;EAC3B,CAAC,wBAAwB,OAAO,QAAQ,YAAY;EACpD,CAAC,sBAAsB,OAAO,QAAQ,UAAU;EAChD,CAAC,yBAAyB,OAAO,QAAQ,aAAa;EACtD,CAAC,0BAA0B,OAAO,QAAQ,cAAc;EACxD,CAAC,yBAAyB,OAAO,QAAQ,aAAa;EACtD,CAAC,0BAA0B,OAAO,QAAQ,cAAc;EACxD,CAAC,4BAA4B,OAAO,QAAQ,gBAAgB;EAC5D,CAAC,6BAA6B,OAAO,QAAQ,iBAAiB;EAC9D,CAAC,qBAAqB,OAAO,iBAAiB;EAC9C,CAAC,oBAAoB,OAAO,gBAAgB;EAC5C,CAAC,aAAa,OAAO,SAAS;CAChC,GACE,IAAI,UAAU,KAAA,GAAW,0BAA0B,OAAO,KAAK;CAEjE,IAAI,OAAO,cAAc,KAAA,KAAa,OAAO,YAAY,oBACvD,MAAM,IAAI,MAAM,yDAAyD,oBAAoB;CAE/F,IACE,OAAO,QAAQ,kBAAkB,KAAA,KACjC,OAAO,QAAQ,eAAe,KAAA,KAC9B,OAAO,QAAQ,gBAAgB,OAAO,QAAQ,YAE9C,MAAM,IAAI,MACR,sFACF;CAEF,mBACE,OAAO,QAAQ,sBACf;EAAC;EAAY;EAAU;EAAU;CAAY,GAC7C,8BACF;CACA,mBACE,OAAO,QAAQ,qBACf;EAAC;EAAS;EAAc;CAAM,GAC9B,6BACF;CACA,mBACE,OAAO,QAAQ,YACf;EAAC;EAAS;EAA4B;CAAwB,GAC9D,oBACF;CACA,KAAK,MAAM,CAAC,OAAO,UAAU;EAC3B,CAAC,uBAAuB,OAAO,QAAQ,WAAW;EAClD,CAAC,yBAAyB,OAAO,QAAQ,aAAa;EACtD,CAAC,wBAAwB,OAAO,QAAQ,YAAY;CACtD,GACE,IAAI,UAAU,KAAA,KAAa,OAAO,UAAU,WAC1C,MAAM,IAAI,MAAM,+BAA+B,MAAM,mBAAmB;CAG5E,IACE,OAAO,uBAAuB,KAAA,MAC7B,CAAC,OAAO,SAAS,OAAO,kBAAkB,KACzC,OAAO,qBAAqB,KAC5B,OAAO,qBAAqB,IAE9B,MAAM,IAAI,MAAM,kEAAkE;CAEpF,IACE,OAAO,WAAW,KAAA,KAClB,OAAO,WAAW,WAClB,OAAO,WAAW,mBAClB,OAAO,WAAW,YAElB,MAAM,IAAI,MACR,oFACF;CAEF,gBAAgB,OAAO,QAAQ,aAAa,CAAC,GAAG,+CAA+C;CAC/F,yBACE,OAAO,QAAQ,aAAa,CAAC,GAC7B,iDACA,WACF;CACA,qBAAqB,OAAO,WAAW,uCAAuC;CAC9E,uCACE,OAAO,0BACP,sDACF;CACA,MAAM,gBAAgB,OAAO,oBAAA;CAC7B,IACE,KAAK,UAAU,OAAO,SAAS,CAAC,CAAC,SAAS,iBAC1C,KAAK,UAAU,OAAO,cAAc,EAAE,CAAC,CAAC,SAAS,eAEjD,MAAM,IAAI,MACR,qFACF;AAEJ;AAEA,SAAS,0BAA0B,OAAe,OAAqB;CACrE,IAAI,CAAC,OAAO,cAAc,KAAK,KAAK,SAAS,GAC3C,MAAM,IAAI,MAAM,+BAA+B,MAAM,iCAAiC;AAE1F;AAEA,SAAS,mBACP,OACA,SACA,OACM;CACN,IAAI,UAAU,KAAA,KAAa,CAAC,QAAQ,SAAS,KAAK,GAChD,MAAM,IAAI,MAAM,+BAA+B,MAAM,kBAAkB,QAAQ,KAAK,IAAI,GAAG;AAE/F;;ACnJA,SAAgB,2BACd,QACA,MACA,mBACA,gBACwC;CACxC,IAAI,CAAC,gBAAgB,OAAO,eAAe,iBAAiB,GAC1D,MAAM,IAAI,MAAM,GAAG,KAAK,gDAAgD;CAE1E,IAAI,CAAC,OAAO,SAAS,OAAO,SAAS,KAAK,OAAO,YAAY,KAAK,OAAO,YAAY,GACnF,MAAM,IAAI,MAAM,GAAG,KAAK,gDAAgD;CAE1E,IACE,CAAC,OAAO,cAAc,OAAO,gBAAgB,KAC7C,OAAO,mBAAmB,KAC1B,OAAO,mBAAmB,gBAE1B,MAAM,IAAI,MAAM,GAAG,KAAK,oDAAoD;CAE9E,IAAI,CAAC,OAAO,cAAc,OAAO,UAAU,KAAK,OAAO,aAAa,GAClE,MAAM,IAAI,MAAM,GAAG,KAAK,8CAA8C;CAExE,uCAAuC,OAAO,UAAU,YAAY,MAAM,UAAU;CACpF,IACE,OAAO,OAAO,UAAU,YACxB,OAAO,MAAM,WAAW,KACxB,OAAO,UAAU,OAAO,MAAM,KAAK,GAEnC,MAAM,IAAI,MAAM,GAAG,KAAK,4CAA4C;CAEtE,IAAI,OAAO,OAAO,YAAY,WAC5B,MAAM,IAAI,MAAM,GAAG,KAAK,mDAAmD;CAE7E,qCAAqC,OAAO,UAAU,MAAM,UAAU;CACtE,kCAAkC,OAAO,YAAY,MAAM,UAAU;AACvE;;;ACmHA,SAAgB,2BACd,QAC0C;CAC1C,iCAAiC,MAAM;CACvC,SAAS,mCAAmC,MAAM;CAClD,MAAM,WAAW;CACjB,MAAM,OAAO,SAAS,QAAQ;CAC9B,OAAO;EACL;EACA,WAAW,UAAU,qBAAqB,UAAU,MAAM,KAAK;CACjE;AACF;AAEA,eAAe,qBACb,QACA,MACA,OACmC;CACnC,MAAM,SAAS,MAAM,WAAW;CAChC,QAAQ,eAAe;CACvB,IAAI,OAAO,MAAM,oBAAoB,UACnC,MAAM,IAAI,MAAM,GAAG,KAAK,6CAA6C;CAEvE,MAAM,UAAU,MAAM,mBAAmB,QAAQ,MAAM,KAAK;CAC5D,MAAM,EAAE,QAAQ,WAAW,eAAe,MAAM,kBAAkB,OAAO;CACzE,QAAQ,eAAe;CACvB,OAAO,kBAAkB,SAAS,QAAQ,WAAW,UAAU;AACjE;;AAGA,eAAe,mBACb,QACA,MACA,OACmD;CACnD,MAAM,SAAS,MAAM,WAAW;CAChC,MAAM,UAAU,KAAK,IAAI;CACzB,MAAM,oBAAoB,OAAO,qBAAA;CACjC,MAAM,mBAAmB,OAAO,oBAAA;CAChC,MAAM,UAAU,MAAM,WAAW,WAAW,kBAAkB;CAC9D,MAAM,SAAS,GAAG,MAAM,OAAO;CAC/B,QAAQ,UAAU,MAAM;CACxB,MAAM,aAAa,MAAM;CACzB,MAAM,YAAY,YAAY,EAAE,CAAC,CAAC,SAAS,KAAK;CAChD,MAAM,SAAS,OAAO,UAAU;CAChC,MAAM,eAAe,OAAO,SACxB;EACE,GAAG,OAAO;EACV,KAAK,4BAA4B,OAAO,OAAO,OAAO,CAAC,CAAC;CAC1D,IACA,KAAA;CACJ,MAAM,kBAAkB,MAAM,gCAAgC;EAC5D,OAAO;EACP,SAAS;EACT,QAAQ;EACR,GAAI,eAAe,EAAE,QAAQ,aAAa,IAAI,CAAC;EAC/C,WAAW,OAAO,aAAA;EAClB,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC;CAC7B,CAAC;CACD,MAAM,WAAW,MAAM,eAAe,KAAK,aACzC,yBAAyB,UAAU,YAAY,kBAAkB,OAAO,gBAAgB,CAC1F;CACA,MAAM,eAAe,MAAM,mBAAmB,KAAK,aACjD,yBAAyB,UAAU,YAAY,kBAAkB,OAAO,gBAAgB,CAC1F;CACA,MAAM,cAAc;EAClB,WAAW;EACX,SAAS;EACT,QAAQ;EACR,cAAc,OAAO;EACrB,aAAa,MAAM,WAAW,eAAe;EAC7C,MAAM,MAAM;EACZ,SAAS,aAAa,OAAO,SAAS,uBAAuB;EAC7D,WAAW,OAAO;EAClB,YAAY,OAAO,cAAc;EACjC,gBAAgB;GACd,OAAO,OAAO,UAAU;GACxB,SAAS,OAAO,UAAU;GAC1B,QAAQ,OAAO,UAAU;EAC3B;EACA,eAAe,MAAM;EACrB;EACA;EACA,gBAAgB,OAAO;EACvB,oBAAoB,OAAO,sBAAsB;EACjD;EACA;EACA,0BAA0B,uCACxB,OAAO,wBACT;EACA,QAAQ,gCAAgC,cAAc,gCAAgC;CACxF;CACA,MAAM,kBAAkB,kCAAkC,WAAW;CACrE,MAAM,QAAQ,wBAAwB;EACpC,UAAU;EACV;EACA,eAAe,WAAW;CAC5B,CAAC;CACD,MAAM,YAAY,+BAA+B;EAC/C;EACA;EACA,QAAQ;EACR;EACA,gBAAgB,OAAO;CACzB,CAAC;CACD,MAAM,iBAAiB,oCAAoC;EACzD;EACA,MAAM,GAAG,OAAO,gBAAgB,UAAU;CAC5C,CAAC;CACD,MAAM,eAAe,kCAAkC;EACrD;EACA,MAAM,GAAG,OAAO,oBAAoB,UAAU;CAChD,CAAC;CACD,MAAM,eAAe,qBACnB,MAAM,gBACN,MAAM,oBACN,iBACF;CACA,MAAM,WAAW,4BAA4B;EAC3C;EACA,OAAO;EACP;EACA,iBAAiB;EACjB,WAAW;EACX,UAAU,UAAU;EACpB;EACA;EACA;EACA;EACA,kBAAkB,OAAO;CAC3B,CAAC;CACD,IAAI,yBAAyB;CAe7B,OAAO;EACL;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,UAAA,MAnCqB,+BAA+B;GACpD,OAAO,YAAY,EAAE,CAAC,CAAC,SAAS,KAAK;GACrC,gBAAgB,OAAO;GACvB,wBAAwB;IAEtB,IADiB,UAAU,iBAChB,MAAM,KAAA,GAAW,OAAO,KAAA;IACnC,0BAA0B;IAC1B,OAAO;GACT;GACA;GACA,SAAS,eAAe;GACxB,GAAI,OAAO,2BAA2B,EAAE,QAAQ,OAAO,yBAAyB,IAAI,CAAC;GACrF,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC;EAC7B,CAAC;CAuBD;AACF;;AAGA,eAAe,kBACb,SAKC;CACD,MAAM,EAAE,QAAQ,OAAO,MAAM,QAAQ,QAAQ,WAAW,aAAa;CACrE,MAAM,aAAa,MAAM;CACzB,MAAM,YAAY,QAAQ,cAAc,OAAO,CAAC;CAChD,IAAI;CACJ,MAAM,uBACJ,gCAAgC;EAC9B,OAAO;EACP;EACA,GAAI,mBAAmB,EAAE,YAAY,iBAAiB,IAAI,CAAC;CAC7D,CAAC;CACH,OAAO,eAAe;EACpB,OAAO,GAAG,KAAK;EACf,KAAK,YAAY;GACf,MAAM,sBAAsB,WAAW,QAAQ;IAC7C,OAAO;IACP,MAAM,UAAU;GAClB,CAAC;GACD,kCAAkC,qBAAqB,OAAO,UAAU,QAAQ,IAAI;GACpF,MAAM,aAAa,MAAM,iCAAiC;IACxD,MAAM,OAAO,UAAU;IACvB,SAAS,OAAO,UAAU;IAC1B,iBAAiB,QAAQ,aAAa;IACtC,OAAO,OAAO,UAAU;IACxB,QAAQ,OAAO,UAAU;IACzB,GAAI,OAAO,UAAU,oBACjB,EAAE,mBAAmB,OAAO,UAAU,kBAAkB,IACxD,CAAC;IACL;IACA,OAAO;IACP,OAAO;IACP,MAAM,EAAE,GAAG,UAAU,YAAY;IACjC,cAAc;KACZ,UAAU,oBAAoB;KAC9B,GAAI,oBAAoB,eAAe,SAAS,eAC5C,CAAC,IACD,EAAE,SAAS,oBAAoB,aAAa;IAClD;IACA,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC;GAC7B,CAAC;GACD,mBAAmB;GACnB,MAAM,YAAY,GAAG,OAAO;GAC5B,MAAM,MAAM,WAAW,EAAE,WAAW,KAAK,CAAC;GAuC1C,OAAO;IAAE,QAAA,MAtCY,4BAAkD;KACrE,OAAO;KACP,YAAY;KACZ,QAAQ;KACR,OAAO;MACL,WAAW,QAAQ;MACnB,iBAAiB,QAAQ;MACzB,OAAO,QAAQ;MACf,iBAAiB,QAAQ;MACzB,QAAQ,QAAQ;MAChB,cAAc,OAAO;MACrB,MAAM,MAAM;MACZ,aAAa,SAAS;MACtB,eAAe,SAAS;MACxB,WAAW,OAAO;MAClB,GAAI,OAAO,aAAa,EAAE,YAAY,OAAO,WAAW,IAAI,CAAC;MAC7D,SAAS,OAAO;MAChB,gBAAgB,OAAO,UAAU;MACjC,aAAa,OAAO,UAAU;MAC9B,eAAe,MAAM;MACrB,UAAU,QAAQ;MAClB,cAAc,QAAQ;MACtB,gBAAgB,OAAO;MACvB,oBAAoB,OAAO,sBAAsB;MACjD,mBAAmB,QAAQ;MAC3B,kBAAkB,QAAQ;MAC1B;KACF;KACA,QAAQ;MACN,GAAG,QAAQ;MACX,KAAK;OACH,GAAG,4BAA4B,SAAS;OACxC,GAAG,yBAAyB,QAAQ,UAAU;MAChD;KACF;KACA,WAAW,OAAO,aAAA;KAClB,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC;IAC7B,CAAC;IACgB;IAAW;GAAW;EACzC;EACA,SAAS;CACX,CAAC;AACH;;AAGA,SAAS,yBACP,QACA,YACwB;CACxB,MAAM,YAAY,OAAO,OAAO,UAAU,OAAO,yBAAyB;CAC1E,OAAO;EACL,4BAA4B,WAAW;EACvC,2BAA2B,WAAW;EACtC,sCAAsC,WAAW;EACjD,qCAAqC,WAAW;EAChD,mCAAmC,WAAW;EAC9C,kCAAkC,WAAW;EAC7C,yBAAyB,OAAO,UAAU;EAC1C,8BAA8B;EAC9B,mCAAmC,OAAO,UAAU;EACpD,wCAAwC;EACxC,gCAAgC,OAAO,UAAU;EACjD,qCAAqC;CACvC;AACF;;AAGA,eAAe,kBACb,SACA,QACA,WACA,YACmC;CACnC,MAAM,EAAE,QAAQ,OAAO,MAAM,WAAW,UAAU,gBAAgB,iBAAiB;CACnF,MAAM,EAAE,iBAAiB,iBAAiB,UAAU;CACpD,MAAM,aAAa,MAAM;CACzB,2BAA2B,QAAQ,MAAM,QAAQ,mBAAmB,OAAO,cAAc;CACzF,kCAAkC;EAChC,OAAO;EACP,SAAS;EACT,gBAAgB,OAAO;EACvB;EACA;EACA,eAAe,OAAO;EACtB,QAAQ,QAAQ;EAChB,SAAS,OAAO;CAClB,CAAC;CACD,IAAI,SAAS,YAAY,MAAM,OAAO,kBACpC,MAAM,IAAI,MACR,GAAG,KAAK,sBAAsB,OAAO,iBAAiB,yCAAyC,SAAS,YAAY,GACtH;CAGF,MAAM,iBAAiB,sBACrB,WAAW,QAAQ;EACjB,OAAO;EACP,MAAM,UAAU;CAClB,CAAC,CACH;CACA,MAAM,iBAAiB,WAAW,QAAQ;EACxC,OAAO;EACP,MAAM,UAAU;CAClB,CAAC;CACD,MAAM,oBAAoB,WAAW,KAAK;EACxC,OAAO;EACP,MAAM,UAAU;CAClB,CAAC;CACD,MAAM,gBAAgB,sBAAsB,cAAc;CAC1D,WAAW,wBAAwB;CACnC,uCACE,OAAO,YACP,WAAW,gBAAgB,GAC3B,WAAW,sBAAsB,GACjC,MACA,UACF;CACA,MAAM,aAAa,kCAAkC,gBAAgB,iBAAiB;CACtF,MAAM,UAAU,iCAAiC,eAAe;CAChE,MAAM,eAAe,uBAAuB,CAC1C;EAAE,OAAO;EAAc,MAAM;CAAe,GAC5C;EAAE,OAAO;EAAmB,MAAM;CAAc,CAClD,CAAC;CACD,MAAM,gBAAgB,OAAO,eACzB,MAAM,qBAAqB;EACzB;EACA,MAAM,OAAO,aAAa,QAAQ,GAAG,QAAQ,OAAO;EACpD,UAAU;EACV,UAAU,OAAO,aAAa;EAC9B,SAAS,QAAQ;EACjB,MAAM,MAAM;EACZ,iBAAiB,MAAM;EACvB,gBAAgB,MAAM;EACtB,oBAAoB,MAAM;EAC1B,iBAAiB,OAAO;EACxB,cAAc,yCAAyC;GACrD,SAAS,eAAe,QAAQ;GAChC,SAAS,QAAQ;EACnB,CAAC;EACD,UAAU,OAAO;EAEjB,sBAAsB;GACpB,QAAQ,eAAe,gBACnB;IACE,QAAQ;IACR,aAAa,eAAe;IAC5B,cAAc,eAAe;IAC7B,cAAc,eAAe;GAC/B,IACA;IAAE,QAAQ;IAAW,QAAQ;GAA4C;GAC7E,MAAM,cAAc,qBAChB;IAAE,QAAQ;IAAS,KAAK,cAAc;IAAc,QAAQ;GAAW,IACvE;IACE,QAAQ;IACR,oBAAoB,cAAc;IAClC,QAAQ,cAAc,kBAAkB,KAAK,IAAI,KAAK;GACxD;EACN;CACF,CAAC,IACD,KAAA;CACJ,OAAO;EACL,eAAe,OAAO;EACtB,GAAI,gBAAgB,EAAE,cAAc,IAAI,CAAC;EACzC,MAAM;EACN,YAAY,KAAK,IAAI,IAAI,QAAQ;EACjC,YAAY;GACV,GAAG;GACH,gBAAgB,OAAO,UAAU;GACjC,kBAAkB,OAAO,UAAU;GACnC;GACA;GACA,SAAS,OAAO;GAChB,iBAAiB,UAAU,oBAAoB;GAC/C,aAAa;GACb,GAAI,aAAa,EAAE,WAAW,IAAI,CAAC;GACnC,cAAc,eAAe,QAAQ;GACrC,iBAAiB,aAAa,QAAQ;EACxC;CACF;AACF"}
1
+ {"version":3,"file":"skillopt-optimization-method-BtX7xXDd.js","names":["cloneExternalTextCandidate","MAX_TIMER_DELAY_MS","MAX_TIMER_DELAY_MS","MAX_TIMER_DELAY_MS","assertPositiveSafeInteger"],"sources":["../src/campaign/external-optimizer-observations.ts","../src/campaign/external-text-evaluation.ts","../src/campaign/external-optimizer-run-budget.ts","../src/campaign/external-text-optimization-contract.ts","../src/campaign/external-text-optimization.ts","../src/campaign/gates/compose.ts","../src/campaign/gates/heldout-gate.ts","../src/campaign/external-optimizer-run-config.ts","../src/campaign/optimizer-model.ts","../src/campaign/gepa-optimization-config.ts","../src/campaign/external-optimizer-accounting.ts","../src/campaign/external-optimizer-source.ts","../src/campaign/external-optimizer-runtime.ts","../src/campaign/gepa-optimization-result.ts","../src/campaign/gepa-search-import.ts","../src/campaign/gepa-optimization-run.ts","../src/campaign/gepa-optimization-method.ts","../src/campaign/presets/comparison-controls.ts","../src/campaign/presets/compare-optimization-methods.ts","../src/campaign/skillopt-optimization-config.ts","../src/campaign/skillopt-optimization-result.ts","../src/campaign/skillopt-optimization-method.ts"],"sourcesContent":["import { createHash } from 'node:crypto'\nimport { isDeepStrictEqual } from 'node:util'\nimport { deepFreezeCanonicalJson } from '../ledger-core/deep-freeze'\nimport { canonicalJson, contentHash } from '../verdict-cache'\nimport {\n assertJsonValue,\n type ExternalOptimizerEvaluationObservation,\n type ExternalOptimizerModelExecutionObservation,\n type ExternalTextCandidate,\n isExternalTextCandidate,\n} from './external-optimizer-contracts'\nimport { type CampaignStorage, fsCampaignStorage } from './storage'\n\nexport interface ExternalOptimizerObservationSummary {\n scope: 'callback-submitted-candidates'\n path: string\n sha256: `sha256:${string}`\n submittedCandidates: number\n evaluations: number\n refusals: number\n}\n\nexport interface ExternalOptimizerExecutionSummary {\n scope: 'runtime-model-calls'\n path: string\n sha256: `sha256:${string}`\n calls: number\n succeeded: number\n failed: number\n}\n\nexport interface ExternalOptimizerSubmittedCandidate {\n /** Exact text or named-component surface submitted to the evaluation callback. */\n readonly candidate: ExternalTextCandidate\n /** Eval's canonical content identity for `candidate`. */\n readonly candidateHash: string\n readonly candidateDigest: `sha256:${string}`\n readonly proposalSequence: number\n /** Exact observation artifact that proves this candidate was submitted. */\n readonly provenance: {\n readonly path: string\n readonly sha256: `sha256:${string}`\n }\n}\n\nexport interface ExternalOptimizerObservationArtifact {\n readonly summary: ExternalOptimizerObservationSummary\n readonly observations: readonly ExternalOptimizerEvaluationObservation[]\n /** Every distinct callback-submitted candidate in proposal order. */\n readonly candidates: readonly ExternalOptimizerSubmittedCandidate[]\n}\n\n/**\n * Read and verify the exact callback observation artifact addressed by method provenance.\n *\n * The reader checks the raw SHA-256, canonical JSONL bytes, sequence, candidate\n * identities, and summary counts before it returns any candidate.\n * This proves that the bytes match the supplied summary. The caller remains\n * responsible for obtaining that summary from trusted provenance.\n */\nexport function readExternalOptimizerObservationArtifact(input: {\n summary: ExternalOptimizerObservationSummary\n storage?: CampaignStorage\n}): ExternalOptimizerObservationArtifact {\n const { summary } = input\n assertObservationSummary(summary)\n const storage = input.storage ?? fsCampaignStorage()\n const contents = storage.read(summary.path)\n if (contents === undefined) {\n const state = storage.exists(summary.path) ? 'unreadable' : 'missing'\n throw new Error(`external optimizer observation artifact is ${state} at '${summary.path}'`)\n }\n const sha256 = `sha256:${createHash('sha256').update(contents).digest('hex')}` as const\n if (sha256 !== summary.sha256) {\n throw new Error(\n `external optimizer observation artifact digest mismatch at '${summary.path}': expected ${summary.sha256}, got ${sha256}`,\n )\n }\n if (contents.length > 0 && !contents.endsWith('\\n')) {\n throw new Error(\n `external optimizer observation artifact must end with a newline at '${summary.path}'`,\n )\n }\n\n const observations = contents.length === 0 ? [] : parseObservationLines(contents, summary.path)\n const candidates: ExternalOptimizerSubmittedCandidate[] = []\n const proposed = new Map<string, ExternalOptimizerSubmittedCandidate>()\n const evaluationNumbers = new Set<number>()\n let evaluations = 0\n let failedEvaluations = 0\n let refusals = 0\n\n for (const [index, observation] of observations.entries()) {\n if (observation.sequence !== index + 1) {\n throw new Error(\n `external optimizer observation artifact expected sequence ${index + 1}, got ${observation.sequence}`,\n )\n }\n if (observation.kind === 'proposal') {\n assertCandidateIdentity(\n observation.candidate,\n observation.candidateHash,\n observation.sequence,\n )\n if (proposed.has(observation.candidateHash)) {\n throw new Error(\n `external optimizer observation artifact repeats candidate ${observation.candidateHash}`,\n )\n }\n const candidate: ExternalOptimizerSubmittedCandidate = {\n candidate: structuredClone(observation.candidate),\n candidateHash: observation.candidateHash,\n candidateDigest: `sha256:${observation.candidateHash}`,\n proposalSequence: observation.sequence,\n provenance: { path: summary.path, sha256: summary.sha256 },\n }\n proposed.set(observation.candidateHash, candidate)\n candidates.push(candidate)\n continue\n }\n\n if (observation.kind === 'evaluation') {\n evaluations += 1\n if (evaluationNumbers.has(observation.evaluationNumber)) {\n throw new Error(\n `external optimizer observation artifact repeats evaluation number ${observation.evaluationNumber}`,\n )\n }\n evaluationNumbers.add(observation.evaluationNumber)\n assertObservedCandidate(observation, proposed)\n assertJsonValue(observation.response, 'external optimizer evaluation response')\n continue\n }\n\n refusals += 1\n if (\n observation.reason !== 'invalid-request' &&\n observation.reason !== 'evaluation-limit' &&\n observation.reason !== 'evaluation-failed'\n ) {\n throw new Error(\n `external optimizer observation artifact has invalid refusal reason at sequence ${observation.sequence}`,\n )\n }\n if (observation.reason === 'evaluation-failed') failedEvaluations += 1\n const candidateFields = [observation.candidate, observation.candidateHash]\n if (\n observation.reason !== 'invalid-request' &&\n candidateFields.some((value) => value === undefined)\n ) {\n throw new Error(\n `external optimizer observation artifact omits a refused candidate at sequence ${observation.sequence}`,\n )\n }\n if (candidateFields.some((value) => value !== undefined)) {\n if (candidateFields.some((value) => value === undefined)) {\n throw new Error(\n `external optimizer observation artifact has incomplete candidate identity at sequence ${observation.sequence}`,\n )\n }\n assertObservedCandidate(\n observation as ExternalOptimizerEvaluationObservation & {\n candidate: NonNullable<typeof observation.candidate>\n candidateHash: string\n },\n proposed,\n )\n }\n }\n\n const acceptedEvaluations = evaluations + failedEvaluations\n for (const evaluationNumber of evaluationNumbers) {\n if (evaluationNumber > acceptedEvaluations) {\n throw new Error(\n `external optimizer observation artifact has out-of-range evaluation number ${evaluationNumber}`,\n )\n }\n }\n\n if (\n candidates.length !== summary.submittedCandidates ||\n evaluations !== summary.evaluations ||\n refusals !== summary.refusals\n ) {\n throw new Error(\n `external optimizer observation artifact counts disagree at '${summary.path}': ` +\n `expected ${summary.submittedCandidates}/${summary.evaluations}/${summary.refusals}, ` +\n `got ${candidates.length}/${evaluations}/${refusals}`,\n )\n }\n\n return deepFreezeCanonicalJson({\n summary: structuredClone(summary),\n observations,\n candidates,\n })\n}\n\n/** Append-only observation log for one external-optimizer attempt. */\nexport function openExternalOptimizerObservationLog(input: {\n storage: CampaignStorage\n path: string\n}): {\n observe: (observation: ExternalOptimizerEvaluationObservation) => void\n summary: () => ExternalOptimizerObservationSummary\n} {\n const existing = input.storage.read(input.path)\n if (existing !== undefined || input.storage.exists(input.path)) {\n throw new Error(`external optimizer observation log already exists at '${input.path}'`)\n }\n input.storage.write(input.path, '')\n let revision = 0\n const counts = { submittedCandidates: 0, evaluations: 0, refusals: 0 }\n\n return {\n observe(observation) {\n const expectedSequence = counts.submittedCandidates + counts.evaluations + counts.refusals + 1\n if (observation.sequence !== expectedSequence) {\n throw new Error(\n `external optimizer observation log expected sequence ${expectedSequence}, got ${observation.sequence}`,\n )\n }\n const line = `${canonicalJson(observation)}\\n`\n const next = input.storage.append(input.path, line, revision)\n if (next === undefined) {\n throw new Error(\n `external optimizer observation log changed concurrently at '${input.path}'`,\n )\n }\n revision = next\n if (observation.kind === 'proposal') counts.submittedCandidates += 1\n else if (observation.kind === 'evaluation') counts.evaluations += 1\n else counts.refusals += 1\n },\n summary() {\n const contents = input.storage.read(input.path) ?? ''\n const bytes = new TextEncoder().encode(contents)\n if (bytes.byteLength !== revision) {\n throw new Error(`external optimizer observation log revision changed at '${input.path}'`)\n }\n return {\n scope: 'callback-submitted-candidates',\n path: input.path,\n sha256: `sha256:${createHash('sha256').update(bytes).digest('hex')}`,\n ...counts,\n }\n },\n }\n}\n\nfunction assertObservationSummary(summary: ExternalOptimizerObservationSummary): void {\n if (summary.scope !== 'callback-submitted-candidates') {\n throw new Error('external optimizer observation summary has an invalid scope')\n }\n if (typeof summary.path !== 'string' || summary.path.trim().length === 0) {\n throw new Error('external optimizer observation summary has an invalid path')\n }\n if (!/^sha256:[a-f0-9]{64}$/u.test(summary.sha256)) {\n throw new Error('external optimizer observation summary has an invalid SHA-256')\n }\n for (const [field, value] of [\n ['submittedCandidates', summary.submittedCandidates],\n ['evaluations', summary.evaluations],\n ['refusals', summary.refusals],\n ] as const) {\n if (!Number.isSafeInteger(value) || value < 0) {\n throw new Error(\n `external optimizer observation summary ${field} must be a non-negative integer`,\n )\n }\n }\n}\n\nfunction parseObservationLines(\n contents: string,\n path: string,\n): ExternalOptimizerEvaluationObservation[] {\n return contents\n .slice(0, -1)\n .split('\\n')\n .map((line, index) => {\n let observation: unknown\n try {\n observation = JSON.parse(line)\n } catch (cause) {\n throw new Error(\n `external optimizer observation artifact has invalid JSON at '${path}' line ${index + 1}`,\n { cause },\n )\n }\n assertObservationShape(observation, index + 1)\n if (canonicalJson(observation) !== line) {\n throw new Error(\n `external optimizer observation artifact is not canonical at '${path}' line ${index + 1}`,\n )\n }\n return observation\n })\n}\n\nfunction assertObservationShape(\n value: unknown,\n line: number,\n): asserts value is ExternalOptimizerEvaluationObservation {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\n throw new Error(`external optimizer observation artifact line ${line} must be an object`)\n }\n const observation = value as Record<string, unknown>\n if (!Number.isSafeInteger(observation.sequence) || Number(observation.sequence) <= 0) {\n throw new Error(`external optimizer observation artifact line ${line} has an invalid sequence`)\n }\n if (observation.kind === 'proposal') {\n assertExactKeys(observation, ['candidate', 'candidateHash', 'kind', 'sequence'], line)\n assertCandidateFields(observation, line)\n return\n }\n if (observation.kind === 'evaluation') {\n assertExactKeys(\n observation,\n [\n 'candidate',\n 'candidateHash',\n 'evaluationNumber',\n 'exampleId',\n 'kind',\n 'response',\n 'sequence',\n ],\n line,\n )\n assertCandidateFields(observation, line)\n if (typeof observation.exampleId !== 'string') {\n throw new Error(\n `external optimizer observation artifact line ${line} has an invalid exampleId`,\n )\n }\n if (\n !Number.isSafeInteger(observation.evaluationNumber) ||\n Number(observation.evaluationNumber) <= 0\n ) {\n throw new Error(\n `external optimizer observation artifact line ${line} has an invalid evaluationNumber`,\n )\n }\n assertJsonValue(observation.response, `external optimizer observation artifact line ${line}`)\n return\n }\n if (observation.kind === 'refusal') {\n const allowed = ['candidate', 'candidateHash', 'exampleId', 'kind', 'reason', 'sequence']\n assertAllowedKeys(observation, allowed, line)\n if (typeof observation.reason !== 'string') {\n throw new Error(`external optimizer observation artifact line ${line} has an invalid reason`)\n }\n if (observation.candidate !== undefined || observation.candidateHash !== undefined) {\n assertCandidateFields(observation, line)\n }\n if (observation.exampleId !== undefined && typeof observation.exampleId !== 'string') {\n throw new Error(\n `external optimizer observation artifact line ${line} has an invalid exampleId`,\n )\n }\n return\n }\n throw new Error(`external optimizer observation artifact line ${line} has an invalid kind`)\n}\n\nfunction assertCandidateFields(observation: Record<string, unknown>, line: number): void {\n if (!isExternalTextCandidate(observation.candidate)) {\n throw new Error(`external optimizer observation artifact line ${line} has an invalid candidate`)\n }\n if (\n typeof observation.candidateHash !== 'string' ||\n !/^[a-f0-9]{64}$/u.test(observation.candidateHash)\n ) {\n throw new Error(\n `external optimizer observation artifact line ${line} has an invalid candidateHash`,\n )\n }\n}\n\nfunction assertExactKeys(value: Record<string, unknown>, expected: string[], line: number): void {\n assertAllowedKeys(value, expected, line)\n for (const key of expected) {\n if (!(key in value)) {\n throw new Error(`external optimizer observation artifact line ${line} is missing ${key}`)\n }\n }\n}\n\nfunction assertAllowedKeys(value: Record<string, unknown>, allowed: string[], line: number): void {\n const extras = Object.keys(value).filter((key) => !allowed.includes(key))\n if (extras.length > 0) {\n throw new Error(\n `external optimizer observation artifact line ${line} has unexpected field ${extras[0]}`,\n )\n }\n}\n\nfunction assertCandidateIdentity(\n candidate: unknown,\n candidateHash: string,\n sequence: number,\n): void {\n const expected = contentHash({ kind: 'external-text-candidate', candidate })\n if (candidateHash !== expected) {\n throw new Error(\n `external optimizer observation artifact candidate hash mismatch at sequence ${sequence}`,\n )\n }\n}\n\nfunction assertObservedCandidate(\n observation:\n | Extract<ExternalOptimizerEvaluationObservation, { kind: 'evaluation' }>\n | {\n candidate: NonNullable<\n Extract<ExternalOptimizerEvaluationObservation, { kind: 'refusal' }>['candidate']\n >\n candidateHash: string\n sequence: number\n },\n proposed: Map<string, ExternalOptimizerSubmittedCandidate>,\n): void {\n assertCandidateIdentity(observation.candidate, observation.candidateHash, observation.sequence)\n const candidate = proposed.get(observation.candidateHash)\n if (!candidate) {\n throw new Error(\n `external optimizer observation artifact references an unproposed candidate at sequence ${observation.sequence}`,\n )\n }\n if (!isDeepStrictEqual(observation.candidate, candidate.candidate)) {\n throw new Error(\n `external optimizer observation artifact changes candidate bytes at sequence ${observation.sequence}`,\n )\n }\n}\n\n/** Append-only opaque Runtime execution records for one optimizer attempt. */\nexport function openExternalOptimizerExecutionLog(input: {\n storage: CampaignStorage\n path: string\n}): {\n observe: (observation: ExternalOptimizerModelExecutionObservation) => void\n summary: () => ExternalOptimizerExecutionSummary\n} {\n const existing = input.storage.read(input.path)\n if (existing !== undefined || input.storage.exists(input.path)) {\n throw new Error(`external optimizer execution log already exists at '${input.path}'`)\n }\n input.storage.write(input.path, '')\n let revision = 0\n const counts = { calls: 0, succeeded: 0, failed: 0 }\n\n return {\n observe(observation) {\n if (observation.sequence !== counts.calls + 1) {\n throw new Error(\n `external optimizer execution log expected sequence ${counts.calls + 1}, got ${observation.sequence}`,\n )\n }\n const line = `${canonicalJson(observation)}\\n`\n const next = input.storage.append(input.path, line, revision)\n if (next === undefined) {\n throw new Error(`external optimizer execution log changed concurrently at '${input.path}'`)\n }\n revision = next\n counts.calls += 1\n if (observation.succeeded) counts.succeeded += 1\n else counts.failed += 1\n },\n summary() {\n const contents = input.storage.read(input.path) ?? ''\n const bytes = new TextEncoder().encode(contents)\n if (bytes.byteLength !== revision) {\n throw new Error(`external optimizer execution log revision changed at '${input.path}'`)\n }\n if (counts.calls !== counts.succeeded + counts.failed) {\n throw new Error(`external optimizer execution log counts disagree at '${input.path}'`)\n }\n return {\n scope: 'runtime-model-calls',\n path: input.path,\n sha256: `sha256:${createHash('sha256').update(bytes).digest('hex')}`,\n ...counts,\n }\n },\n }\n}\n","import type { CostLedgerHandle } from '../cost-ledger'\nimport {\n assertJsonValue,\n type ExternalTextCandidate,\n type ExternalTextEvaluationRequest,\n isCandidateText,\n safePathComponent,\n} from './external-optimizer-process'\nimport type { OptimizationMethodInput } from './optimization-method'\nimport { runCampaign } from './run-campaign'\nimport { campaignBreakdown } from './score-utils'\nimport { surfaceContentHash } from './surface-identity'\nimport type { MutableSurface, Scenario } from './types'\n\nexport interface ExternalOptimizationExample {\n id: string\n data: unknown\n}\n\nexport interface ExternalTextEvaluationResponse {\n score: number\n info: {\n scenarioId: string\n dimensions: Record<string, number>\n /** Higher-is-better objectives consumed by GEPA hybrid/Pareto selection. */\n scores?: Record<string, number>\n notes?: string\n artifact?: unknown\n /** The optimizer score is a finite protocol value; Eval remains the\n * authority for whether the underlying cell actually produced a score. */\n status?: 'scored' | 'failed'\n error?: {\n stage: 'dispatch' | 'judge' | 'unknown'\n message: string\n }\n }\n}\n\nexport function createExternalTextEvaluator<TScenario extends Scenario, TArtifact>(args: {\n input: OptimizationMethodInput<TScenario, TArtifact>\n label: string\n runDir: string\n /** Identity of the exact execution and scoring behavior used by this evaluator. */\n compatibleRunId: string\n costPhase: string\n costTags?: Readonly<Record<string, string>>\n costLedger: CostLedgerHandle\n scenarioById: ReadonlyMap<string, TScenario>\n maxCandidateChars: number\n maxEvidenceChars: number\n describeArtifact?: (artifact: TArtifact, scenario: TScenario) => unknown\n}): (\n request: ExternalTextEvaluationRequest,\n signal?: AbortSignal,\n) => Promise<ExternalTextEvaluationResponse> {\n const cached = new Map<string, Promise<ExternalTextEvaluationResponse>>()\n return async ({ candidate, exampleId }, signal) => {\n if (!args.scenarioById.has(exampleId)) {\n throw new Error(`${args.label} requested unknown train or selection case '${exampleId}'`)\n }\n const detachedCandidate = cloneExternalTextCandidate(candidate)\n const surface =\n typeof detachedCandidate === 'string'\n ? detachedCandidate\n : ({ kind: 'components', components: detachedCandidate } as const)\n const candidateLength =\n typeof detachedCandidate === 'string'\n ? detachedCandidate.length\n : JSON.stringify(detachedCandidate).length\n if (\n (typeof detachedCandidate === 'string' &&\n !isCandidateText(detachedCandidate, args.maxCandidateChars)) ||\n candidateLength > args.maxCandidateChars\n ) {\n throw new Error(`${args.label} submitted an invalid candidate`)\n }\n const scenario = args.scenarioById.get(exampleId)!\n const cacheKey = `${args.compatibleRunId}:${surfaceContentHash(surface)}:${exampleId}`\n const existing = cached.get(cacheKey)\n if (existing) return existing\n\n const result = scoreOneScenario({\n input: args.input,\n label: args.label,\n candidate: surface,\n scenario,\n runDir: args.runDir,\n compatibleRunId: args.compatibleRunId,\n costPhase: args.costPhase,\n costTags: args.costTags,\n costLedger: args.costLedger,\n maxEvidenceChars: args.maxEvidenceChars,\n describeArtifact: args.describeArtifact,\n signal,\n })\n cached.set(cacheKey, result)\n void result.then(\n (response) => {\n // Failed cells are durable diagnostics, not reusable scores. Leave\n // the successful path cached, but let a later GEPA request retry the\n // failed or missing cell on resume.\n if (response.info.status === 'failed' && cached.get(cacheKey) === result) {\n cached.delete(cacheKey)\n }\n },\n () => {\n if (cached.get(cacheKey) === result) cached.delete(cacheKey)\n },\n )\n return result\n }\n}\n\nexport function mapExternalScenarios<TScenario extends Scenario>(\n train: readonly TScenario[],\n selection: readonly TScenario[],\n label: string,\n): Map<string, TScenario> {\n const out = new Map<string, TScenario>()\n for (const scenario of [...train, ...selection]) {\n if (out.has(scenario.id)) {\n throw new Error(\n `${label} requires unique train and selection ids; duplicate '${scenario.id}'`,\n )\n }\n out.set(scenario.id, scenario)\n }\n return out\n}\n\nexport function describeExternalScenario<TScenario extends Scenario>(\n scenario: TScenario,\n label: string,\n maxChars: number,\n describe?: (scenario: TScenario) => unknown,\n): ExternalOptimizationExample {\n const data = structuredClone(describe ? describe(scenario) : { id: scenario.id })\n assertJsonValue(data, `${label} scenario '${scenario.id}'`)\n const serializedChars = JSON.stringify(data).length\n if (serializedChars > maxChars) {\n throw new Error(\n `${label} scenario '${scenario.id}' exceeds maxEvidenceChars (${serializedChars} > ${maxChars})`,\n )\n }\n return deepFreeze({ id: scenario.id, data })\n}\n\nexport function encodeExternalTextCandidate(surface: MutableSurface): ExternalTextCandidate {\n if (typeof surface === 'string') return surface\n if (surface.kind === 'components') return { ...surface.components }\n throw new Error('external text optimizers cannot encode a code surface')\n}\n\nexport function decodeExternalTextCandidate(candidate: ExternalTextCandidate): MutableSurface {\n return typeof candidate === 'string'\n ? candidate\n : { kind: 'components', components: { ...candidate } }\n}\n\nasync function scoreOneScenario<TScenario extends Scenario, TArtifact>(args: {\n input: OptimizationMethodInput<TScenario, TArtifact>\n label: string\n candidate:\n | string\n | { readonly kind: 'components'; readonly components: Readonly<Record<string, string>> }\n scenario: TScenario\n runDir: string\n compatibleRunId: string\n costPhase: string\n costTags?: Readonly<Record<string, string>>\n costLedger: CostLedgerHandle\n maxEvidenceChars: number\n describeArtifact?: (artifact: TArtifact, scenario: TScenario) => unknown\n signal?: AbortSignal\n}): Promise<ExternalTextEvaluationResponse> {\n const campaign = await runCampaign<TScenario, TArtifact>({\n ...args.input.runOptions,\n scenarios: [structuredClone(args.scenario)],\n dispatch: (scenario, context) =>\n args.input.dispatchWithSurface(args.candidate, scenario, context),\n dispatchRef: `external-text:${args.compatibleRunId}:${surfaceContentHash(args.candidate)}`,\n judges: [...args.input.judges],\n runDir: `${args.runDir}/evaluations/${safePathComponent(args.compatibleRunId)}/${safePathComponent(surfaceContentHash(args.candidate))}/${safePathComponent(args.scenario.id)}`,\n seed: args.input.seed,\n costLedger: args.costLedger,\n costPhase: args.costPhase,\n ...(args.costTags ? { costTags: args.costTags } : {}),\n maxConcurrency: 1,\n ...(args.signal ? { signal: args.signal } : {}),\n })\n const failedCell = campaign.cells.find((cell) => cell.error !== undefined)\n if (failedCell) {\n const stage = failedCell.errorStage ?? 'unknown'\n const message = failedCell.error?.slice(0, 2_000) ?? 'cell failed without an error message'\n const response: ExternalTextEvaluationResponse = {\n // GEPA requires a finite score for every callback response. This zero is\n // an optimizer penalty only; the campaign cell remains unscored below.\n score: 0,\n info: {\n scenarioId: failedCell.scenarioId,\n dimensions: {},\n status: 'failed',\n notes: `Evaluation failed at ${stage}; optimizer penalty score 0 is not a measured zero. ${message}`,\n error: { stage, message },\n },\n }\n if (JSON.stringify(response).length > args.maxEvidenceChars) {\n throw new Error(\n `${args.label} failed evaluation evidence for '${args.scenario.id}' exceeds maxEvidenceChars`,\n )\n }\n return response\n }\n const breakdown = campaignBreakdown(campaign)\n const row = breakdown.scenarios[0]\n if (!row) throw new Error(`${args.label} evaluation produced no score for '${args.scenario.id}'`)\n const artifact =\n args.describeArtifact && campaign.cells[0]\n ? args.describeArtifact(campaign.cells[0].artifact, args.scenario)\n : undefined\n if (artifact !== undefined) {\n assertJsonValue(artifact, `${args.label} described artifact for '${args.scenario.id}'`)\n }\n const response: ExternalTextEvaluationResponse = {\n score: row.composite,\n info: {\n scenarioId: row.scenarioId,\n dimensions: breakdown.dimensions,\n scores: { ...breakdown.dimensions },\n status: 'scored',\n ...(row.notes ? { notes: row.notes } : {}),\n ...(artifact !== undefined ? { artifact } : {}),\n },\n }\n if (JSON.stringify(response).length > args.maxEvidenceChars) {\n throw new Error(\n `${args.label} evaluation evidence for '${args.scenario.id}' exceeds maxEvidenceChars`,\n )\n }\n return response\n}\n\nfunction cloneExternalTextCandidate(candidate: ExternalTextCandidate): ExternalTextCandidate {\n return typeof candidate === 'string' ? candidate : { ...candidate }\n}\n\nfunction deepFreeze<T>(value: T): T {\n if (value && typeof value === 'object') {\n for (const child of Object.values(value as Record<string, unknown>)) deepFreeze(child)\n Object.freeze(value)\n }\n return value\n}\n","import { contentHash } from '../verdict-cache'\nimport type { CampaignStorage } from './storage'\n\ninterface EvaluationBudgetState {\n maxEvaluations: number\n accepted: number\n}\n\nexport interface ExternalOptimizerRunBudget {\n runKey: string\n attemptId: string\n runTags: Readonly<Record<string, string>>\n attemptTags: Readonly<Record<string, string>>\n acceptedEvaluations(): number\n acceptEvaluation(): number | undefined\n}\n\nexport function externalOptimizerRunKey(input: {\n material: unknown\n attemptId: string\n resumeEnabled: boolean\n}): string {\n if (!input.attemptId.trim() || input.attemptId.trim() !== input.attemptId) {\n throw new Error('external optimizer attemptId must be trimmed and non-empty')\n }\n if (typeof input.resumeEnabled !== 'boolean') {\n throw new Error('external optimizer resumeEnabled must be a boolean')\n }\n const compatible = externalOptimizerCompatibleRunKey(input.material)\n return input.resumeEnabled ? compatible : `${compatible}-${input.attemptId}`\n}\n\nexport function externalOptimizerCompatibleRunKey(material: unknown): string {\n return contentHash(material)\n}\n\nexport function openExternalOptimizerRunBudget(input: {\n storage: CampaignStorage\n runDir: string\n runKey: string\n attemptId: string\n maxEvaluations: number\n}): ExternalOptimizerRunBudget {\n if (!input.runKey.trim() || input.runKey.trim() !== input.runKey) {\n throw new Error('external optimizer runKey must be trimmed and non-empty')\n }\n if (!input.attemptId.trim() || input.attemptId.trim() !== input.attemptId) {\n throw new Error('external optimizer attemptId must be trimmed and non-empty')\n }\n if (!Number.isSafeInteger(input.maxEvaluations) || input.maxEvaluations <= 0) {\n throw new Error('external optimizer maxEvaluations must be a positive safe integer')\n }\n const budgetDir = `${input.runDir}/budgets`\n const statePath = `${budgetDir}/${input.runKey}.jsonl`\n input.storage.ensureDir(budgetDir)\n const runTags = Object.freeze({ optimizerRun: input.runKey })\n const attemptTags = Object.freeze({\n optimizerRun: input.runKey,\n optimizerAttempt: input.attemptId,\n })\n\n return {\n runKey: input.runKey,\n attemptId: input.attemptId,\n runTags,\n attemptTags,\n acceptedEvaluations: () =>\n readState(input.storage.read(statePath), input.maxEvaluations, statePath).accepted,\n acceptEvaluation() {\n for (let attempt = 0; attempt < 16; attempt += 1) {\n const current = input.storage.read(statePath) ?? ''\n const state = readState(current, input.maxEvaluations, statePath)\n if (state.accepted >= input.maxEvaluations) return undefined\n if (!input.storage.append) {\n throw new Error('external optimizer evaluation budgets require appendable storage')\n }\n const next = state.accepted + 1\n const event = `${JSON.stringify({\n maxEvaluations: input.maxEvaluations,\n accepted: next,\n } satisfies EvaluationBudgetState)}\\n`\n const expectedBytes = new TextEncoder().encode(current).byteLength\n const appended = input.storage.append(statePath, event, expectedBytes)\n if (appended !== undefined) return next\n }\n throw new Error(\n `external optimizer evaluation counter for '${input.runKey}' was updated concurrently`,\n )\n },\n }\n}\n\nfunction readState(\n text: string | undefined,\n maxEvaluations: number,\n statePath: string,\n): EvaluationBudgetState {\n if (text === undefined || text === '') return { maxEvaluations, accepted: 0 }\n let accepted = 0\n for (const line of text.split('\\n')) {\n if (!line) continue\n let value: unknown\n try {\n value = JSON.parse(line)\n } catch (cause) {\n throw new Error(`external optimizer evaluation state is invalid at '${statePath}'`, {\n cause,\n })\n }\n if (\n !value ||\n typeof value !== 'object' ||\n Array.isArray(value) ||\n Object.keys(value).sort().join(',') !== 'accepted,maxEvaluations' ||\n (value as Partial<EvaluationBudgetState>).maxEvaluations !== maxEvaluations ||\n (value as Partial<EvaluationBudgetState>).accepted !== accepted + 1\n ) {\n throw new Error(`external optimizer evaluation state does not match at '${statePath}'`)\n }\n accepted += 1\n }\n if (accepted > maxEvaluations) {\n throw new Error(`external optimizer evaluation state exceeds its limit at '${statePath}'`)\n }\n return { maxEvaluations, accepted }\n}\n","import {\n type ExternalOptimizerResumeMode,\n type ExternalTextCandidate,\n isExternalTextCandidate,\n} from './external-optimizer-process'\nimport type {\n ExternalOptimizationExample,\n ExternalTextEvaluationResponse,\n} from './external-text-evaluation'\nimport type { OptimizationPackageSource } from './optimization-method'\nimport type { CampaignCostMeter, Scenario } from './types'\n\nexport interface ExternalTextOptimizerContext {\n readonly runId: string\n readonly name: string\n readonly objective: string\n readonly evaluationId: string\n readonly background?: string\n readonly seedCandidate: ExternalTextCandidate\n readonly trainSet: readonly ExternalOptimizationExample[]\n readonly selectionSet: readonly ExternalOptimizationExample[]\n readonly maxEvaluations: number\n readonly seed: number\n /** Stable directory for optimizer checkpoints from compatible attempts. */\n readonly stateDir: string\n readonly restoreRequested: boolean\n readonly artifactDir: string\n readonly signal: AbortSignal\n /** Record every optimizer-owned paid call through this attributed account. */\n readonly cost: CampaignCostMeter\n readonly evaluate: (\n request: import('./external-optimizer-process').ExternalTextEvaluationRequest,\n ) => Promise<ExternalTextEvaluationResponse>\n}\n\nexport interface ExternalTextOptimizerResult {\n bestCandidate: ExternalTextCandidate\n resumed: boolean\n costAccounting:\n | { kind: 'metered' }\n | { kind: 'no-paid-work' }\n | { kind: 'external'; reason: string }\n}\n\nexport interface ExternalOptimizerRunManifest {\n readonly status: 'partial' | 'completed'\n readonly attemptId: string\n readonly revision: number\n}\n\nexport interface ExternalOptimizerRunManifestEvent {\n readonly runId: string\n readonly attemptId: string\n readonly status: 'partial' | 'completed'\n}\n\n/**\n * Configuration for adapting another text optimizer.\n *\n * `run` owns search. Agent Eval owns split isolation, bounded candidate\n * evaluation, exact cost collection, provenance, and final comparison.\n */\nexport interface ExternalTextOptimizationMethodConfig<\n TScenario extends Scenario,\n TArtifact = unknown,\n> {\n name: string\n source: Omit<OptimizationPackageSource, 'evidence'>\n objective: string\n evaluationId: string\n background?: string\n maxEvaluations: number\n /** Hard limit for calls made through `context.cost`. Use 0 for no paid work. */\n maxOptimizerCostUsd: number\n /** Abort `context.signal` after this duration. Default: 30 minutes. */\n timeoutMs?: number\n /** Default: `never`. Compatible runs reuse one state directory. */\n resume?: ExternalOptimizerResumeMode\n maxCandidateChars?: number\n maxEvidenceChars?: number\n describeScenario?: (scenario: TScenario) => unknown\n describeArtifact?: (artifact: TArtifact, scenario: TScenario) => unknown\n run: (context: ExternalTextOptimizerContext) => Promise<ExternalTextOptimizerResult>\n}\n\nconst MAX_TIMER_DELAY_MS = 2_147_483_647\n\nexport function assertExternalTextOptimizationConfig<TScenario extends Scenario, TArtifact>(\n config: ExternalTextOptimizationMethodConfig<TScenario, TArtifact>,\n): void {\n for (const [field, value] of [\n ['name', config.name],\n ['objective', config.objective],\n ['evaluationId', config.evaluationId],\n ] as const) {\n if (typeof value !== 'string' || !value.trim() || value.trim() !== value) {\n throw new Error(`externalTextOptimizationMethod: ${field} must be trimmed and non-empty`)\n }\n }\n if (config.timeoutMs !== undefined && config.timeoutMs > MAX_TIMER_DELAY_MS) {\n throw new Error(\n `externalTextOptimizationMethod: timeoutMs must not exceed ${MAX_TIMER_DELAY_MS}`,\n )\n }\n if (\n config.background !== undefined &&\n (typeof config.background !== 'string' ||\n !config.background.trim() ||\n config.background.trim() !== config.background)\n ) {\n throw new Error('externalTextOptimizationMethod: background must be trimmed and non-empty')\n }\n if (typeof config.run !== 'function') {\n throw new Error('externalTextOptimizationMethod: run must be a function')\n }\n if (\n config.resume !== undefined &&\n config.resume !== 'never' &&\n config.resume !== 'if-compatible' &&\n config.resume !== 'required'\n ) {\n throw new Error(\n \"externalTextOptimizationMethod: resume must be 'never', 'if-compatible', or 'required'\",\n )\n }\n for (const [field, value] of [\n ['maxEvaluations', config.maxEvaluations],\n ['timeoutMs', config.timeoutMs],\n ['maxCandidateChars', config.maxCandidateChars],\n ['maxEvidenceChars', config.maxEvidenceChars],\n ] as const) {\n if (value !== undefined && (!Number.isSafeInteger(value) || value <= 0)) {\n throw new Error(`externalTextOptimizationMethod: ${field} must be a positive safe integer`)\n }\n }\n if (!Number.isFinite(config.maxOptimizerCostUsd) || config.maxOptimizerCostUsd < 0) {\n throw new Error(\n 'externalTextOptimizationMethod: maxOptimizerCostUsd must be finite and non-negative',\n )\n }\n if (\n config.source?.kind !== 'package' ||\n typeof config.source.package !== 'string' ||\n !config.source.package.trim() ||\n config.source.package.trim() !== config.source.package ||\n typeof config.source.version !== 'string' ||\n !config.source.version.trim() ||\n config.source.version.trim() !== config.source.version\n ) {\n throw new Error('externalTextOptimizationMethod: source must identify a package and version')\n }\n for (const [field, value] of [\n ['sourceUrl', config.source.sourceUrl],\n ['revision', config.source.revision],\n ] as const) {\n if (\n value !== undefined &&\n (typeof value !== 'string' || !value.trim() || value.trim() !== value)\n ) {\n throw new Error(`externalTextOptimizationMethod: source.${field} must be trimmed`)\n }\n }\n}\n\nexport function snapshotExternalTextOptimizationConfig<TScenario extends Scenario, TArtifact>(\n config: ExternalTextOptimizationMethodConfig<TScenario, TArtifact>,\n): ExternalTextOptimizationMethodConfig<TScenario, TArtifact> {\n return {\n ...config,\n source: { ...config.source },\n }\n}\n\nexport function assertExternalTextOptimizerResult(\n result: unknown,\n name: string,\n maxCandidateChars: number,\n expectsComponents: boolean,\n): asserts result is ExternalTextOptimizerResult {\n if (!result || typeof result !== 'object') {\n throw new Error(`${name}: optimizer returned no result`)\n }\n const value = result as Partial<ExternalTextOptimizerResult>\n if (!isExternalTextCandidate(value.bestCandidate)) {\n throw new Error(`${name}: optimizer returned an invalid bestCandidate`)\n }\n const candidateChars =\n typeof value.bestCandidate === 'string'\n ? value.bestCandidate.length\n : JSON.stringify(value.bestCandidate).length\n if (candidateChars > maxCandidateChars) {\n throw new Error(`${name}: optimizer bestCandidate exceeds maxCandidateChars`)\n }\n if (expectsComponents !== (typeof value.bestCandidate !== 'string')) {\n throw new Error(`${name}: optimizer changed the surface kind`)\n }\n if (typeof value.resumed !== 'boolean') {\n throw new Error(`${name}: optimizer returned an invalid resumed flag`)\n }\n assertExternalCostAccounting(value.costAccounting, undefined, name)\n}\n\nexport function readExternalOptimizerRunManifest(\n text: string | undefined,\n exists: boolean,\n path: string,\n expectedRunId: string,\n): ExternalOptimizerRunManifest | undefined {\n if (text === undefined) {\n if (exists) throw new Error(`${path} exists but cannot be read`)\n return undefined\n }\n if (!text?.endsWith('\\n')) {\n throw new Error(`${path} is invalid`)\n }\n\n let current: Omit<ExternalOptimizerRunManifest, 'revision'> | undefined\n const attempts = new Set<string>()\n for (const line of text.split('\\n')) {\n if (!line) continue\n let value: unknown\n try {\n value = JSON.parse(line)\n } catch (cause) {\n throw new Error(`${path} is invalid`, { cause })\n }\n assertExternalOptimizerRunManifestEvent(value, path, expectedRunId)\n if (value.status === 'partial') {\n if (attempts.has(value.attemptId)) {\n throw new Error(`${path} repeats attempt '${value.attemptId}'`)\n }\n attempts.add(value.attemptId)\n current = { status: value.status, attemptId: value.attemptId }\n continue\n }\n if (current?.status !== 'partial' || current.attemptId !== value.attemptId) {\n throw new Error(`${path} completes an attempt that is not active`)\n }\n current = { status: value.status, attemptId: value.attemptId }\n }\n if (!current) throw new Error(`${path} is invalid`)\n return {\n ...current,\n revision: new TextEncoder().encode(text).byteLength,\n }\n}\n\nfunction assertExternalOptimizerRunManifestEvent(\n value: unknown,\n path: string,\n expectedRunId: string,\n): asserts value is ExternalOptimizerRunManifestEvent {\n if (\n !value ||\n typeof value !== 'object' ||\n Array.isArray(value) ||\n Object.keys(value).sort().join(',') !== 'attemptId,runId,status'\n ) {\n throw new Error(`${path} is invalid`)\n }\n const event = value as Partial<ExternalOptimizerRunManifestEvent>\n if (\n event.runId !== expectedRunId ||\n typeof event.attemptId !== 'string' ||\n !event.attemptId.trim() ||\n event.attemptId.trim() !== event.attemptId ||\n (event.status !== 'partial' && event.status !== 'completed')\n ) {\n throw new Error(`${path} does not match the compatible run`)\n }\n}\n\nexport function assertExternalCostAccounting(\n value: unknown,\n calls: number | undefined,\n name: string,\n): void {\n if (!value || typeof value !== 'object') {\n throw new Error(`${name}: optimizer returned no costAccounting`)\n }\n const accounting = value as Partial<ExternalTextOptimizerResult['costAccounting']>\n if (accounting.kind === 'metered') {\n if (calls === 0) throw new Error(`${name}: metered optimizer recorded no paid calls`)\n return\n }\n if (accounting.kind === 'no-paid-work') {\n if (calls !== undefined && calls > 0) {\n throw new Error(`${name}: no-paid-work optimizer recorded paid calls`)\n }\n return\n }\n if (\n accounting.kind !== 'external' ||\n typeof accounting.reason !== 'string' ||\n !accounting.reason.trim() ||\n accounting.reason.trim() !== accounting.reason\n ) {\n throw new Error(`${name}: optimizer returned invalid costAccounting`)\n }\n}\n","import { randomBytes } from 'node:crypto'\nimport { mkdir } from 'node:fs/promises'\nimport type {\n CostChannel,\n CostReceipt,\n CostReceiptInput,\n MaximumCharge,\n PaidCallResult,\n RunPaidCallInput,\n} from '../cost-ledger'\nimport {\n type ExternalTextCandidate,\n type ExternalTextEvaluationRequest,\n safePathComponent,\n} from './external-optimizer-process'\nimport {\n externalOptimizerRunKey,\n openExternalOptimizerRunBudget,\n} from './external-optimizer-run-budget'\nimport {\n createExternalTextEvaluator,\n decodeExternalTextCandidate,\n describeExternalScenario,\n type ExternalOptimizationExample,\n type ExternalTextEvaluationResponse,\n encodeExternalTextCandidate,\n mapExternalScenarios,\n} from './external-text-evaluation'\nimport {\n assertExternalCostAccounting,\n assertExternalTextOptimizationConfig,\n assertExternalTextOptimizerResult,\n type ExternalOptimizerRunManifest,\n type ExternalOptimizerRunManifestEvent,\n type ExternalTextOptimizationMethodConfig,\n type ExternalTextOptimizerContext,\n type ExternalTextOptimizerResult,\n readExternalOptimizerRunManifest,\n snapshotExternalTextOptimizationConfig,\n} from './external-text-optimization-contract'\nimport {\n combineComparisonCosts,\n costFromLedgerSummary,\n optimizationTokenUsageFromSummary,\n} from './optimization-cost'\nimport type {\n OptimizationMethod,\n OptimizationMethodInput,\n OptimizationMethodResult,\n} from './optimization-method'\nimport { acquireSingleRunLock } from './single-run-lock'\nimport { type CampaignStorage, createRunCostLedger, fsCampaignStorage } from './storage'\nimport type { CampaignCostMeter, Scenario } from './types'\n\nexport type {\n ExternalOptimizationExample,\n ExternalTextEvaluationResponse,\n ExternalTextOptimizationMethodConfig,\n ExternalTextOptimizerContext,\n ExternalTextOptimizerResult,\n}\nexport {\n createExternalTextEvaluator,\n decodeExternalTextCandidate,\n describeExternalScenario,\n encodeExternalTextCandidate,\n mapExternalScenarios,\n}\n\nconst DEFAULT_MAX_CANDIDATE_CHARS = 200_000\nconst DEFAULT_MAX_EVIDENCE_CHARS = 100_000\nconst DEFAULT_TIMEOUT_MS = 30 * 60 * 1000\nconst MAX_TIMER_DELAY_MS = 2_147_483_647\n\n/**\n * Adapt a third-party text optimizer without reimplementing its search.\n *\n * The callback never receives final test cases. Calls to `evaluate` are\n * counted before execution and stop at `maxEvaluations`.\n */\nexport function externalTextOptimizationMethod<TScenario extends Scenario, TArtifact>(\n config: ExternalTextOptimizationMethodConfig<TScenario, TArtifact>,\n): OptimizationMethod<TScenario, TArtifact> {\n assertExternalTextOptimizationConfig(config)\n const snapshot = snapshotExternalTextOptimizationConfig(config)\n\n return {\n name: snapshot.name,\n optimize: (input) => optimizeExternalText(snapshot, input),\n }\n}\n\n/** What one optimizer run derives from its configuration and input before the optimizer starts. */\ninterface ExternalRun<TScenario extends Scenario, TArtifact> {\n readonly snapshot: ExternalTextOptimizationMethodConfig<TScenario, TArtifact>\n readonly input: OptimizationMethodInput<TScenario, TArtifact>\n readonly seedCandidate: ExternalTextCandidate\n readonly expectsComponents: boolean\n readonly maxCandidateChars: number\n readonly maxEvidenceChars: number\n readonly attemptId: string\n readonly storage: CampaignStorage\n readonly resume: NonNullable<ExternalTextOptimizationMethodConfig<TScenario, TArtifact>['resume']>\n readonly trainSet: readonly ExternalOptimizationExample[]\n readonly selectionSet: readonly ExternalOptimizationExample[]\n readonly methodDir: string\n readonly runId: string\n readonly stateDir: string\n readonly artifactDir: string\n readonly manifestPath: string\n readonly lock: ReturnType<typeof acquireSingleRunLock> | undefined\n /** False once a still-running optimizer or paid call has taken over releasing the lock. */\n releaseLock: boolean\n}\n\n/** The stores one optimizer run charges and counts against. */\ninterface ExternalRunAccounts {\n readonly runBudget: ReturnType<typeof openExternalOptimizerRunBudget>\n readonly optimizerLedger: ReturnType<typeof createRunCostLedger>\n}\n\n/** The live optimizer: its abort control, in-flight evaluations and run promise. */\ninterface OptimizerSession {\n readonly controller: AbortController\n readonly activeEvaluations: Set<Promise<ExternalTextEvaluationResponse>>\n readonly runPromise: Promise<ExternalTextOptimizerResult>\n readonly timeout: ReturnType<typeof setTimeout>\n readonly started: number\n readonly state: { acceptingEvaluations: boolean; runSettled: boolean }\n}\n\nconst EVALUATION_COST_PHASE = 'external.evaluation'\nconst OPTIMIZER_COST_PHASE = 'external.optimizer'\n\nasync function optimizeExternalText<TScenario extends Scenario, TArtifact>(\n snapshot: ExternalTextOptimizationMethodConfig<TScenario, TArtifact>,\n input: OptimizationMethodInput<TScenario, TArtifact>,\n): Promise<OptimizationMethodResult> {\n const run = await prepareExternalRun(snapshot, input)\n try {\n const { manifest, restoreRequested } = restoreRunManifest(run)\n const accounts = openRunAccounts(run)\n const session = startOptimizerSession(run, accounts, restoreRequested)\n const result = await awaitOptimizerResult(run, accounts, session, restoreRequested)\n return finishRun(run, accounts, session, manifest, result)\n } finally {\n if (run.releaseLock) run.lock?.release()\n }\n}\n\nfunction describeExternalScenarios<TScenario extends Scenario, TArtifact>(\n scenarios: readonly TScenario[],\n snapshot: ExternalTextOptimizationMethodConfig<TScenario, TArtifact>,\n maxEvidenceChars: number,\n): readonly ExternalOptimizationExample[] {\n return Object.freeze(\n scenarios.map((scenario) =>\n describeExternalScenario(\n scenario,\n snapshot.name,\n maxEvidenceChars,\n snapshot.describeScenario,\n ),\n ),\n )\n}\n\n/** Run identity, scenario descriptions and directories, then the resume lock. */\nasync function prepareExternalRun<TScenario extends Scenario, TArtifact>(\n snapshot: ExternalTextOptimizationMethodConfig<TScenario, TArtifact>,\n input: OptimizationMethodInput<TScenario, TArtifact>,\n): Promise<ExternalRun<TScenario, TArtifact>> {\n const seedCandidate = encodeExternalTextCandidate(input.baselineSurface)\n const maxCandidateChars = snapshot.maxCandidateChars ?? DEFAULT_MAX_CANDIDATE_CHARS\n const maxEvidenceChars = snapshot.maxEvidenceChars ?? DEFAULT_MAX_EVIDENCE_CHARS\n const attemptId = randomBytes(16).toString('hex')\n const storage = input.runOptions.storage ?? fsCampaignStorage()\n const resume = snapshot.resume ?? 'never'\n const trainSet = describeExternalScenarios(input.trainScenarios, snapshot, maxEvidenceChars)\n const selectionSet = describeExternalScenarios(\n input.selectionScenarios,\n snapshot,\n maxEvidenceChars,\n )\n const methodDir = `${input.runDir}/external/${safePathComponent(snapshot.name)}`\n const runMaterial = {\n optimizer: {\n kind: snapshot.source.kind,\n package: snapshot.source.package,\n version: snapshot.source.version,\n ...(snapshot.source.sourceUrl ? { sourceUrl: snapshot.source.sourceUrl } : {}),\n ...(snapshot.source.revision ? { revision: snapshot.source.revision } : {}),\n },\n method: snapshot.name,\n evaluationId: snapshot.evaluationId,\n dispatchRef: input.runOptions.dispatchRef ?? null,\n objective: snapshot.objective,\n background: snapshot.background ?? '',\n seed: input.seed,\n seedCandidate,\n trainSet,\n selectionSet,\n maxEvaluations: snapshot.maxEvaluations,\n maxOptimizerCostUsd: snapshot.maxOptimizerCostUsd,\n maxCandidateChars,\n maxEvidenceChars,\n }\n const runId = externalOptimizerRunKey({\n material: runMaterial,\n attemptId,\n resumeEnabled: resume !== 'never',\n })\n const stateDir = `${methodDir}/state/${runId}`\n const artifactDir = `${methodDir}/attempts/${attemptId}`\n storage.ensureDir(stateDir)\n storage.ensureDir(artifactDir)\n if (resume !== 'never') await mkdir(stateDir, { recursive: true })\n const lock =\n resume === 'never'\n ? undefined\n : acquireSingleRunLock({\n lockPath: `${stateDir}.lock`,\n releaseOnExit: true,\n })\n return {\n snapshot,\n input,\n seedCandidate,\n expectsComponents: typeof seedCandidate !== 'string',\n maxCandidateChars,\n maxEvidenceChars,\n attemptId,\n storage,\n resume,\n trainSet,\n selectionSet,\n methodDir,\n runId,\n stateDir,\n artifactDir,\n manifestPath: `${stateDir}/run-manifest.jsonl`,\n lock,\n releaseLock: true,\n }\n}\n\n/** Reads prior state when resuming, and records this attempt as partial. */\nfunction restoreRunManifest<TScenario extends Scenario, TArtifact>(\n run: ExternalRun<TScenario, TArtifact>,\n): { manifest: ExternalOptimizerRunManifest | undefined; restoreRequested: boolean } {\n const { snapshot, storage, manifestPath, runId, attemptId, resume } = run\n let manifest =\n resume === 'never'\n ? undefined\n : readExternalOptimizerRunManifest(\n storage.read(manifestPath),\n storage.exists(manifestPath),\n manifestPath,\n runId,\n )\n const restoreRequested = manifest !== undefined\n if (resume === 'required' && !restoreRequested) {\n throw new Error(`${snapshot.name}: no compatible run state is available to resume`)\n }\n if (resume === 'never' && restoreRequested) {\n throw new Error(`${snapshot.name}: fresh optimizer run unexpectedly found prior state`)\n }\n if (resume !== 'never') {\n manifest = appendExternalOptimizerRunManifestEvent({\n storage,\n path: manifestPath,\n revision: manifest?.revision ?? 0,\n event: { runId, attemptId, status: 'partial' },\n })\n }\n return { manifest, restoreRequested }\n}\n\nfunction openRunAccounts<TScenario extends Scenario, TArtifact>(\n run: ExternalRun<TScenario, TArtifact>,\n): ExternalRunAccounts {\n const { snapshot, storage, methodDir, runId, attemptId, stateDir } = run\n return {\n runBudget: openExternalOptimizerRunBudget({\n storage,\n runDir: methodDir,\n runKey: runId,\n attemptId,\n maxEvaluations: snapshot.maxEvaluations,\n }),\n optimizerLedger: createRunCostLedger({\n storage,\n runDir: `${stateDir}/cost`,\n costCeilingUsd: snapshot.maxOptimizerCostUsd,\n }),\n }\n}\n\n/** Optimizer paid calls, charged to the optimizer's own limit and mirrored into the method's account. */\nfunction createOptimizerCostMeter<TScenario extends Scenario, TArtifact>(\n run: ExternalRun<TScenario, TArtifact>,\n accounts: ExternalRunAccounts,\n controller: AbortController,\n): CampaignCostMeter {\n const { snapshot, input } = run\n const { runBudget, optimizerLedger } = accounts\n const meter: CampaignCostMeter = {\n async runPaidCall<T>(\n request: Omit<RunPaidCallInput<T>, 'channel' | 'phase' | 'tags'> & {\n channel?: CostChannel\n },\n ): Promise<PaidCallResult<T>> {\n const call = {\n methodResult: undefined as PaidCallResult<T> | undefined,\n providerStarted: false,\n }\n const subLimitResult = await optimizerLedger.runPaidCall<T>({\n ...request,\n channel: request.channel ?? 'optimizer',\n phase: OPTIMIZER_COST_PHASE,\n tags: runBudget.attemptTags,\n signal: request.signal\n ? AbortSignal.any([controller.signal, request.signal])\n : controller.signal,\n execute: async (signal, callId) => {\n call.methodResult = await input.costLedger.runPaidCall<T>({\n ...request,\n callId,\n channel: request.channel ?? 'optimizer',\n phase: OPTIMIZER_COST_PHASE,\n tags: runBudget.attemptTags,\n signal,\n execute: (methodSignal, methodCallId) => {\n call.providerStarted = true\n return request.execute(methodSignal, methodCallId)\n },\n })\n if (!call.methodResult.succeeded) {\n throw new Error(`${snapshot.name}: method cost account rejected optimizer call`, {\n cause: call.methodResult.error,\n })\n }\n return call.methodResult.value\n },\n receipt: () => {\n if (!call.methodResult?.succeeded) {\n throw new Error(`${snapshot.name}: optimizer call completed without a receipt`)\n }\n return mirroredCostReceipt(call.methodResult.receipt)\n },\n receiptFromError: () => {\n if (call.methodResult?.receipt) {\n return mirroredCostReceipt(call.methodResult.receipt)\n }\n if (!call.providerStarted) {\n return noChargeReceipt(modelBeforeExecution(request))\n }\n return undefined\n },\n })\n if (call.methodResult === undefined) return subLimitResult\n if (!call.methodResult.succeeded) return call.methodResult\n return subLimitResult.succeeded ? call.methodResult : subLimitResult\n },\n }\n return Object.freeze(meter)\n}\n\n/** Starts the optimizer with its evaluator, cost meter, timeout and frozen context. */\nfunction startOptimizerSession<TScenario extends Scenario, TArtifact>(\n run: ExternalRun<TScenario, TArtifact>,\n accounts: ExternalRunAccounts,\n restoreRequested: boolean,\n): OptimizerSession {\n const { snapshot, input, runId, stateDir, artifactDir } = run\n const { runBudget } = accounts\n const scenarioById = mapExternalScenarios(\n input.trainScenarios,\n input.selectionScenarios,\n `${snapshot.name} optimizer`,\n )\n const score = createExternalTextEvaluator({\n input,\n label: `${snapshot.name} optimizer`,\n runDir: artifactDir,\n compatibleRunId: runId,\n costPhase: EVALUATION_COST_PHASE,\n costTags: runBudget.attemptTags,\n costLedger: input.costLedger,\n scenarioById,\n maxCandidateChars: run.maxCandidateChars,\n maxEvidenceChars: run.maxEvidenceChars,\n describeArtifact: snapshot.describeArtifact,\n })\n const controller = new AbortController()\n const activeEvaluations = new Set<Promise<ExternalTextEvaluationResponse>>()\n const state = { acceptingEvaluations: true, runSettled: false }\n const optimizerCostMeter = createOptimizerCostMeter(run, accounts, controller)\n const evaluate = (\n request: ExternalTextEvaluationRequest,\n signal = controller.signal,\n ): Promise<ExternalTextEvaluationResponse> => {\n if (!state.acceptingEvaluations) {\n throw new Error(`${snapshot.name}: evaluate cannot be called after run() completes`)\n }\n if (runBudget.acceptEvaluation() === undefined) {\n throw new Error(`${snapshot.name}: maxEvaluations limit reached`)\n }\n const combinedSignal =\n signal === controller.signal\n ? controller.signal\n : AbortSignal.any([controller.signal, signal])\n const pending = score(cloneExternalEvaluationRequest(request), combinedSignal)\n activeEvaluations.add(pending)\n const remove = () => activeEvaluations.delete(pending)\n void pending.then(remove, remove)\n return pending\n }\n\n const started = Date.now()\n const timeoutMs = snapshot.timeoutMs ?? DEFAULT_TIMEOUT_MS\n const timeout = setTimeout(\n () => controller.abort(new Error(`${snapshot.name}: optimizer exceeded ${timeoutMs}ms`)),\n timeoutMs,\n )\n const runPromise = Promise.resolve().then(() =>\n snapshot.run(\n Object.freeze({\n runId,\n name: snapshot.name,\n objective: snapshot.objective,\n evaluationId: snapshot.evaluationId,\n ...(snapshot.background ? { background: snapshot.background } : {}),\n seedCandidate: cloneExternalTextCandidate(run.seedCandidate),\n trainSet: run.trainSet,\n selectionSet: run.selectionSet,\n maxEvaluations: snapshot.maxEvaluations,\n seed: input.seed,\n stateDir,\n restoreRequested,\n artifactDir,\n signal: controller.signal,\n cost: optimizerCostMeter,\n evaluate,\n }),\n ),\n )\n const markSettled = () => {\n state.runSettled = true\n }\n void runPromise.then(markSettled, markSettled)\n return { controller, activeEvaluations, runPromise, timeout, started, state }\n}\n\n/** Waits for the optimizer, then refuses a run that left evaluations or paid calls outstanding. */\nasync function awaitOptimizerResult<TScenario extends Scenario, TArtifact>(\n run: ExternalRun<TScenario, TArtifact>,\n accounts: ExternalRunAccounts,\n session: OptimizerSession,\n restoreRequested: boolean,\n): Promise<ExternalTextOptimizerResult> {\n const { snapshot, lock } = run\n const { optimizerLedger } = accounts\n let result: ExternalTextOptimizerResult | undefined\n let runError: unknown\n let outstandingAtCompletion = 0\n let paidCallsAtCompletion = 0\n try {\n result = await raceWithAbort(session.runPromise, session.controller.signal)\n outstandingAtCompletion = session.activeEvaluations.size\n paidCallsAtCompletion = optimizerLedger.summary().pendingCalls\n } catch (error) {\n runError = error\n } finally {\n session.state.acceptingEvaluations = false\n clearTimeout(session.timeout)\n }\n await Promise.allSettled([...session.activeEvaluations])\n const paidCallsSettled = await optimizerLedger.waitForIdle({ timeoutMs: 5_000 })\n const handOffLock = () => {\n if (!lock) return\n run.releaseLock = false\n void Promise.allSettled([\n session.runPromise,\n optimizerLedger.waitForIdle({ timeoutMs: MAX_TIMER_DELAY_MS }),\n ]).then(() => lock.release())\n }\n if (runError !== undefined) {\n if (!session.state.runSettled || !paidCallsSettled) handOffLock()\n throw runError\n }\n if (!paidCallsSettled) {\n handOffLock()\n throw new Error(`${snapshot.name}: optimizer paid calls did not settle`)\n }\n if (paidCallsAtCompletion > 0) {\n throw new Error(\n `${snapshot.name}: run() completed with ${paidCallsAtCompletion} outstanding paid call(s); await every context.cost.runPaidCall()`,\n )\n }\n if (outstandingAtCompletion > 0) {\n throw new Error(\n `${snapshot.name}: run() completed with ${outstandingAtCompletion} outstanding evaluation(s); await every evaluate() call`,\n )\n }\n assertExternalTextOptimizerResult(\n result,\n snapshot.name,\n run.maxCandidateChars,\n run.expectsComponents,\n )\n if (result.resumed !== restoreRequested) {\n throw new Error(\n `${snapshot.name}: optimizer reported resumed=${String(result.resumed)} but restoreRequested=${String(restoreRequested)}`,\n )\n }\n return result\n}\n\n/** Measures evaluation and optimizer spend, records completion, and builds the method result. */\nfunction finishRun<TScenario extends Scenario, TArtifact>(\n run: ExternalRun<TScenario, TArtifact>,\n accounts: ExternalRunAccounts,\n session: OptimizerSession,\n manifest: ExternalOptimizerRunManifest | undefined,\n result: ExternalTextOptimizerResult,\n): OptimizationMethodResult {\n const { snapshot, input, storage, runId, attemptId } = run\n const { runBudget } = accounts\n const evaluationCost = costFromLedgerSummary(\n input.costLedger.summary({\n phase: EVALUATION_COST_PHASE,\n tags: runBudget.runTags,\n }),\n )\n const optimizerFilter = {\n phase: OPTIMIZER_COST_PHASE,\n tags: runBudget.runTags,\n }\n const optimizerReceipts = input.costLedger.list(optimizerFilter)\n const optimizerSummary = input.costLedger.summary(optimizerFilter)\n const optimizerCost = costFromLedgerSummary(optimizerSummary)\n assertExternalCostAccounting(result.costAccounting, optimizerSummary.totalCalls, snapshot.name)\n const externalCostReason =\n result.costAccounting.kind === 'external' ? result.costAccounting.reason : undefined\n const tokenUsage = optimizationTokenUsageFromSummary(optimizerSummary, optimizerReceipts)\n if (run.resume !== 'never') {\n appendExternalOptimizerRunManifestEvent({\n storage,\n path: run.manifestPath,\n revision: manifest!.revision,\n event: { runId, attemptId, status: 'completed' },\n })\n }\n const measuredCost = combineComparisonCosts([\n { label: 'evaluation', cost: evaluationCost },\n { label: 'optimizer', cost: optimizerCost },\n ])\n return {\n winnerSurface: decodeExternalTextCandidate(result.bestCandidate),\n cost: {\n ...measuredCost,\n ...(externalCostReason ? { costProvenance: { kind: 'uncaptured', usd: null } as const } : {}),\n accountingComplete: measuredCost.accountingComplete && externalCostReason === undefined,\n incompleteReasons: [\n ...measuredCost.incompleteReasons,\n ...(externalCostReason\n ? [`optimizer: external spend is not observed: ${externalCostReason}`]\n : []),\n ],\n },\n durationMs: Date.now() - session.started,\n provenance: {\n source: { ...snapshot.source, evidence: 'declared' },\n runId,\n resumed: result.resumed,\n evaluationCount: runBudget.acceptedEvaluations(),\n artifactDir: run.artifactDir,\n ...(tokenUsage ? { tokenUsage } : {}),\n },\n }\n}\n\nfunction appendExternalOptimizerRunManifestEvent(input: {\n storage: CampaignStorage\n path: string\n revision: number\n event: ExternalOptimizerRunManifestEvent\n}): ExternalOptimizerRunManifest {\n if (!input.storage.append) {\n throw new Error('external optimizer resume requires appendable storage')\n }\n const line = `${JSON.stringify(input.event)}\\n`\n const revision = input.storage.append(input.path, line, input.revision)\n if (revision === undefined) {\n throw new Error(`external optimizer run manifest was updated concurrently at '${input.path}'`)\n }\n return {\n status: input.event.status,\n attemptId: input.event.attemptId,\n revision,\n }\n}\n\nfunction mirroredCostReceipt(receipt: CostReceipt): CostReceiptInput {\n const usage = {\n model: receipt.model,\n inputTokens: receipt.inputTokens,\n outputTokens: receipt.outputTokens,\n ...(receipt.reasoningTokens === undefined ? {} : { reasoningTokens: receipt.reasoningTokens }),\n ...(receipt.cachedTokens === undefined ? {} : { cachedTokens: receipt.cachedTokens }),\n ...(receipt.cacheWriteTokens === undefined\n ? {}\n : { cacheWriteTokens: receipt.cacheWriteTokens }),\n ...(receipt.usageUnknown === undefined ? {} : { usageUnknown: receipt.usageUnknown }),\n }\n return receipt.costUnknown\n ? { ...usage, costUnknown: true }\n : { ...usage, actualCostUsd: receipt.costUsd }\n}\n\nfunction noChargeReceipt(model: string): CostReceiptInput {\n return {\n model,\n inputTokens: 0,\n outputTokens: 0,\n actualCostUsd: 0,\n }\n}\n\nfunction modelBeforeExecution(request: { model?: string; maximumCharge?: MaximumCharge }): string {\n if (request.model) return request.model\n if (request.maximumCharge && 'model' in request.maximumCharge) {\n return request.maximumCharge.model\n }\n return 'unstarted-optimizer-call'\n}\n\nfunction cloneExternalTextCandidate(candidate: ExternalTextCandidate): ExternalTextCandidate {\n return typeof candidate === 'string' ? candidate : { ...candidate }\n}\n\nfunction cloneExternalEvaluationRequest(\n request: ExternalTextEvaluationRequest,\n): ExternalTextEvaluationRequest {\n return {\n candidate: cloneExternalTextCandidate(request.candidate),\n exampleId: request.exampleId,\n }\n}\n\nasync function raceWithAbort<T>(promise: Promise<T>, signal: AbortSignal): Promise<T> {\n if (signal.aborted) throw signal.reason\n return await new Promise<T>((resolve, reject) => {\n const onAbort = () => reject(signal.reason)\n signal.addEventListener('abort', onAbort, { once: true })\n void promise.then(\n (value) => {\n signal.removeEventListener('abort', onAbort)\n resolve(value)\n },\n (error) => {\n signal.removeEventListener('abort', onAbort)\n reject(error)\n },\n )\n })\n}\n","/**\n * Compose multiple `Gate` implementations — every gate must pass for the\n * composite to ship. Closes the alignment reviewer's \"default-only\n * heldOutGate + costGate would happily promote a reward-hacked prompt\"\n * concern by making safety gates first-class composable defaults.\n */\n\nimport type { Gate, GateContext, GateDecision, GateResult, Scenario } from '../types'\n\n/** Compose gates — all must `ship` for the composite to `ship`. First\n * non-ship verdict short-circuits the composite verdict, but ALL gates run\n * (so the result records every gate's reason — useful for diagnostics). */\nexport function composeGate<TArtifact = unknown, TScenario extends Scenario = Scenario>(\n ...gates: Array<Gate<TArtifact, TScenario>>\n): Gate<TArtifact, TScenario> {\n if (gates.length === 0) {\n throw new Error('composeGate requires at least one gate')\n }\n return {\n name: `composed(${gates.map((g) => g.name).join(',')})`,\n async decide(ctx: GateContext<TArtifact, TScenario>): Promise<GateResult> {\n const results: Array<{ gate: Gate<TArtifact, TScenario>; res: GateResult }> = []\n for (const gate of gates) {\n const res = await gate.decide(ctx)\n results.push({ gate, res })\n }\n\n // Substrate-wide verdict policy:\n // - all 'ship' → 'ship'\n // - any 'arch_ceiling' → 'arch_ceiling' (architectural ceiling beats other holds)\n // - any 'model_ceiling' → 'model_ceiling'\n // - any 'hold' → 'hold'\n // - else 'need_more_work'\n const decisions = results.map((r) => r.res.decision)\n const overall: GateDecision = decisions.every((d) => d === 'ship')\n ? 'ship'\n : decisions.includes('arch_ceiling')\n ? 'arch_ceiling'\n : decisions.includes('model_ceiling')\n ? 'model_ceiling'\n : decisions.includes('hold')\n ? 'hold'\n : 'need_more_work'\n\n const contributing = results.flatMap((r) =>\n r.res.contributingGates.length > 0\n ? r.res.contributingGates\n : [\n {\n name: r.gate.name,\n status:\n r.res.decision === 'ship'\n ? ('pass' as const)\n : r.res.decision === 'need_more_work'\n ? ('not_evaluated' as const)\n : ('fail' as const),\n detail: r.res,\n },\n ],\n )\n\n const reasons = results.flatMap((r) =>\n r.res.reasons.map((reason) => `[${r.gate.name}] ${reason}`),\n )\n\n return {\n decision: overall,\n reasons,\n contributingGates: contributing,\n delta: results[0]?.res.delta,\n }\n },\n }\n}\n","/**\n * @module\n * Composable held-out promotion gate.\n *\n * Pair by full `scenario:rep` cellId, then ship only when the lower bound of\n * the interval the outcome's SHAPE admits strictly clears the threshold, with\n * at least `minProductiveRuns` paired observations. The rule is\n * `decidePairedPromotion` (`src/paired-promotion-decision.ts`) — the same one\n * `HeldOutGate` decides on, not a second copy: a pass/fail holdout decides on\n * Tango's score interval, McNemar's exact test vetoes at a non-negative\n * threshold, and a zero-width interval is refused rather than promoted.\n *\n * Use when you want held-out significance as ONE of N composed gates instead\n * of the full `defaultProductionGate` stack (which adds critical-dimension\n * regression + reward-hacking guards on top).\n */\n\nimport type { Gate, GateContext, GateResult, Scenario } from '../types'\nimport { heldoutSignificance, pairHoldout, TIE_WARN_FRACTION } from './statistical-heldout'\n\nexport interface HeldOutGateOptions<TScenario extends Scenario = Scenario> {\n scenarios: TScenario[]\n /** Effect-size threshold the CI lower bound must clear, in the judge's native\n * scale. Default 0.5. Equality holds; CI.low must be greater than this value. */\n deltaThreshold?: number\n /** Bootstrap CI confidence. Default 0.95. */\n confidence?: number\n /** Minimum paired holdout observations to claim significance. The exact\n * small-sample test may require more observations at the selected\n * confidence. Default 3. */\n minProductiveRuns?: number\n /** Bootstrap resamples. Default 2000. */\n resamples?: number\n /** Fixed bootstrap seed for deterministic verdicts. Default 1337. */\n bootstrapSeed?: number\n}\n\n/**\n * Composable held-out gate: ships only when the lower bound of the DECIDING\n * paired interval on the candidate-minus-baseline composite delta clears\n * `deltaThreshold` — Tango's score interval on a pass/fail holdout, the mean\n * bootstrap otherwise. See {@link decidePairedPromotion}.\n */\nexport function heldOutGate<TArtifact, TScenario extends Scenario>(\n options: HeldOutGateOptions<TScenario>,\n): Gate<TArtifact, TScenario> {\n const deltaThreshold = options.deltaThreshold ?? 0.5\n const confidence = options.confidence ?? 0.95\n const minProductiveRuns = options.minProductiveRuns ?? 3\n const resamples = options.resamples ?? 2000\n const seed = options.bootstrapSeed ?? 1337\n return {\n name: 'heldOutGate',\n async decide(ctx: GateContext<TArtifact, TScenario>): Promise<GateResult> {\n if (!ctx.baselineJudgeScores) {\n throw new Error(\n 'heldOutGate: ctx.baselineJudgeScores is required — comparing candidate scores against themselves would hide a missing baseline',\n )\n }\n const scenarioIds = new Set(options.scenarios.map((s) => s.id))\n const sig = heldoutSignificance(\n pairHoldout(ctx.judgeScores, ctx.baselineJudgeScores, scenarioIds, (s) => s.composite),\n {\n deltaThreshold,\n confidence,\n minProductiveRuns,\n resamples,\n seed,\n },\n )\n // Report the interval that DECIDED, not the diagnostic bootstrap: on a\n // pass/fail holdout the verdict comes from Tango's score interval, and\n // printing the bootstrap's bounds next to that verdict would put a\n // number in the reason string that did not produce it.\n const dec = sig.decision\n const delta = dec.delta\n const passed = sig.significant\n const status = sig.fewRuns ? 'not_evaluated' : passed ? 'pass' : 'fail'\n const tieNote =\n sig.tieFraction >= TIE_WARN_FRACTION ? `, ${(sig.tieFraction * 100).toFixed(0)}% tied` : ''\n const ci = `${(dec.confidence * 100).toFixed(0)}% CI [${dec.low.toFixed(3)}, ${dec.high.toFixed(3)}]`\n const held = `held-out ${dec.label} Δ ${delta.toFixed(3)}`\n const holdReason = sig.fewRuns\n ? `held-out: only ${sig.n} paired runs; ${sig.minimumRequired} required — too few to claim significance`\n : dec.indeterminate\n ? `held-out: ${dec.indeterminateCause}, so the paired CI is ${ci} and carries no direction — it cannot clear ${deltaThreshold} on evidence (n=${sig.n}${tieNote})`\n : dec.exactTestVetoes\n ? `${held}, McNemar exact p=${dec.mcnemar?.pValue.toExponential(2)} does not reject at α=${(1 - dec.confidence).toFixed(4)} (${ci}, n=${sig.n}${tieNote})`\n : `${held}, CI.low ${dec.low.toFixed(3)} ≤ ${deltaThreshold} (${ci}, n=${sig.n}${tieNote})`\n return {\n decision: passed ? 'ship' : 'hold',\n reasons: passed\n ? [\n `${held}, CI.low ${dec.low.toFixed(3)} > ${deltaThreshold} (${ci}, n=${sig.n}${tieNote})`,\n ]\n : [holdReason],\n contributingGates: [\n {\n name: 'heldOutGate',\n status,\n detail: {\n deltaMean: sig.bootstrap.mean,\n decidingDelta: delta,\n decisionStatistic: sig.decisionStatistic,\n decisionMethod: sig.decisionMethod,\n binaryScale: dec.binaryScale,\n mcnemar: dec.mcnemar,\n indeterminate: dec.indeterminate,\n deltaMedianDiagnostic: sig.medianBootstrap.median,\n tieFraction: sig.tieFraction,\n ciLow: dec.low,\n ciHigh: dec.high,\n bootstrapCiLow: sig.bootstrap.low,\n bootstrapCiHigh: sig.bootstrap.high,\n confidence: dec.confidence,\n n: sig.n,\n deltaThreshold,\n fewRuns: sig.fewRuns,\n seed,\n },\n },\n ],\n delta,\n }\n },\n }\n}\n","import {\n type ExternalOptimizerRunnerCommand,\n removeCredentialEnvironment,\n resolveExternalOptimizerProcessLimits,\n} from './external-optimizer-process'\n\nexport function externalOptimizerRunnerIdentity(\n runner: ExternalOptimizerRunnerCommand | undefined,\n module: string,\n): {\n command: string\n args: readonly string[]\n environment: Readonly<Record<string, string>>\n limits: ReturnType<typeof resolveExternalOptimizerProcessLimits>\n} {\n return {\n command: runner?.command ?? 'python',\n args: [...(runner?.args ?? ['-m', module])],\n environment: removeCredentialEnvironment(runner?.env ?? {}),\n limits: resolveExternalOptimizerProcessLimits(runner?.limits),\n }\n}\n\nexport function snapshotExternalOptimizerRunner(\n runner: ExternalOptimizerRunnerCommand | undefined,\n): ExternalOptimizerRunnerCommand | undefined {\n if (!runner) return undefined\n return {\n ...runner,\n ...(runner.args ? { args: [...runner.args] } : {}),\n ...(runner.env ? { env: { ...runner.env } } : {}),\n ...(runner.limits ? { limits: { ...runner.limits } } : {}),\n }\n}\n\nexport function snapshotJson<T>(value: T, label: string): T {\n const serialized = JSON.stringify(value)\n if (serialized === undefined) throw new Error(`${label} must be JSON-serializable`)\n return JSON.parse(serialized) as T\n}\n","import { assertServedModelPolicy, type ServedModelPolicy } from '../integrity/served-model'\nimport {\n assertExternalOptimizerModelBudget,\n type ExternalOptimizerModelBudget,\n type ExternalOptimizerModelCall,\n} from './external-optimizer-process'\n\nexport type OptimizerModelBudget = ExternalOptimizerModelBudget\n\n/** One metered model path supplied by the package that owns execution. */\nexport interface OpenAICompatibleOptimizerModel {\n model: string\n budget: OptimizerModelBudget\n /** Caller-owned execution path, such as Runtime's exact AgentProfile adapter. */\n call: ExternalOptimizerModelCall\n /** Stable public identity included in resumable-run compatibility. */\n callRef: string\n /**\n * Served-model acceptance for every proxied call. Default `'exact'`, which\n * rejects any substitution with a 502 to the child.\n * `'allow-within-family'` accepts a different model of the same provider\n * family; it keeps family-level claims valid and forfeits per-model claims.\n */\n servedModelPolicy?: ServedModelPolicy\n /**\n * Also expose this metered model over the Anthropic Messages API\n * (`POST /v1/messages`) on the loopback proxy. Required for GEPA agent\n * engines that drive a `claude` CLI subprocess. Agent engines are chatty:\n * size `budget.maxRequests` for tens of calls per engine run. Default: false.\n */\n anthropicEndpoint?: boolean\n}\n\nexport function assertOptimizerModel(value: OpenAICompatibleOptimizerModel, label: string): void {\n if (!value || typeof value !== 'object') {\n throw new Error(`${label} is required`)\n }\n for (const [field, item] of [\n ['model', value.model],\n ['callRef', value.callRef],\n ] as const) {\n if (typeof item !== 'string' || !item.trim() || item.trim() !== item) {\n throw new Error(`${label}.${field} must be trimmed and non-empty`)\n }\n }\n if (typeof value.call !== 'function') throw new Error(`${label}.call must be a function`)\n assertServedModelPolicy(value.servedModelPolicy, `${label}.servedModelPolicy`)\n if (value.anthropicEndpoint !== undefined && typeof value.anthropicEndpoint !== 'boolean') {\n throw new Error(`${label}.anthropicEndpoint must be a boolean`)\n }\n assertExternalOptimizerModelBudget(value.budget, `${label}.budget`)\n}\n\nexport function snapshotOptimizerModel(\n value: OpenAICompatibleOptimizerModel,\n): OpenAICompatibleOptimizerModel {\n return {\n model: value.model,\n budget: structuredClone(value.budget),\n call: value.call,\n callRef: value.callRef,\n ...(value.servedModelPolicy ? { servedModelPolicy: value.servedModelPolicy } : {}),\n ...(value.anthropicEndpoint === undefined\n ? {}\n : { anthropicEndpoint: value.anthropicEndpoint }),\n }\n}\n","import { isRecord } from '../llm-client/json'\nimport {\n assertJsonValue,\n assertNoCredentialValues,\n resolveExternalOptimizerCallbackLimits,\n} from './external-optimizer-process'\nimport { snapshotExternalOptimizerRunner } from './external-optimizer-run-config'\nimport type {\n GepaAdaptiveEngineRun,\n GepaEngineOptions,\n GepaEngineRun,\n GepaOptimizationMethodConfig,\n GepaOptimizationRecipe,\n} from './gepa-optimization-method'\nimport {\n assertOptimizerModel,\n type OpenAICompatibleOptimizerModel,\n snapshotOptimizerModel,\n} from './optimizer-model'\nimport type { Scenario } from './types'\n\nexport const GEPA_DEFAULT_MAX_CANDIDATE_CHARS = 200_000\nexport const GEPA_DEFAULT_MAX_EVIDENCE_CHARS = 100_000\nexport const GEPA_DEFAULT_TIMEOUT_MS = 30 * 60 * 1000\n\n/**\n * GEPA engines that drive a `claude` CLI subprocess. With\n * `optimizer.anthropicEndpoint: true` their model traffic is metered through\n * the loopback proxy's Anthropic route instead of being refused.\n */\nconst GEPA_AGENT_CLI_ENGINES: ReadonlySet<string> = new Set(['autoresearch', 'meta_harness'])\n\nexport function gepaRecipeHasAgentCliEngine(recipe: GepaOptimizationRecipe): boolean {\n return recipeEngineOptions(recipe).some((run) => GEPA_AGENT_CLI_ENGINES.has(run.engine))\n}\n\nconst MAX_TIMER_DELAY_MS = 2_147_483_647\n\nexport function snapshotGepaOptimizationConfig<TScenario extends Scenario, TArtifact>(\n config: GepaOptimizationMethodConfig<TScenario, TArtifact>,\n): GepaOptimizationMethodConfig<TScenario, TArtifact> {\n const runner = snapshotExternalOptimizerRunner(config.runner)\n return {\n ...config,\n recipe: structuredClone(config.recipe),\n ...(config.engineModules ? { engineModules: [...config.engineModules] } : {}),\n ...(config.optimizer ? { optimizer: snapshotOptimizerModel(config.optimizer) } : {}),\n ...(config.evaluationCallbackLimits\n ? { evaluationCallbackLimits: { ...config.evaluationCallbackLimits } }\n : {}),\n ...(runner ? { runner } : {}),\n }\n}\n\nexport function assertGepaOptimizationConfig<TScenario extends Scenario, TArtifact>(\n config: GepaOptimizationMethodConfig<TScenario, TArtifact>,\n): void {\n if (\n typeof config.objective !== 'string' ||\n !config.objective.trim() ||\n config.objective.trim() !== config.objective\n ) {\n throw new Error('gepaOptimizationMethod: objective must be trimmed and non-empty')\n }\n if (\n typeof config.evaluationId !== 'string' ||\n !config.evaluationId.trim() ||\n config.evaluationId.trim() !== config.evaluationId\n ) {\n throw new Error('gepaOptimizationMethod: evaluationId must be trimmed and non-empty')\n }\n if (\n config.name !== undefined &&\n (typeof config.name !== 'string' || !config.name.trim() || config.name.trim() !== config.name)\n ) {\n throw new Error('gepaOptimizationMethod: name must be trimmed and non-empty')\n }\n if (\n config.background !== undefined &&\n (typeof config.background !== 'string' ||\n !config.background.trim() ||\n config.background.trim() !== config.background)\n ) {\n throw new Error('gepaOptimizationMethod: background must be trimmed and non-empty')\n }\n if (\n config.resume !== undefined &&\n config.resume !== 'never' &&\n config.resume !== 'if-compatible' &&\n config.resume !== 'required'\n ) {\n throw new Error(\n \"gepaOptimizationMethod: resume must be 'never', 'if-compatible', or 'required'\",\n )\n }\n if (config.trustResumeState !== undefined && typeof config.trustResumeState !== 'boolean') {\n throw new Error('gepaOptimizationMethod: trustResumeState must be a boolean')\n }\n assertRecipe(config.recipe)\n if (\n config.resume !== undefined &&\n config.resume !== 'never' &&\n gepaRecipeSupportsResume(config.recipe) &&\n config.trustResumeState !== true\n ) {\n throw new Error(\n 'gepaOptimizationMethod: resumable GEPA pickle state requires trustResumeState: true',\n )\n }\n if (\n config.maxCandidateChars !== undefined &&\n (!Number.isSafeInteger(config.maxCandidateChars) || config.maxCandidateChars <= 0)\n ) {\n throw new Error('gepaOptimizationMethod: maxCandidateChars must be a positive safe integer')\n }\n if (\n config.maxEvidenceChars !== undefined &&\n (!Number.isSafeInteger(config.maxEvidenceChars) || config.maxEvidenceChars <= 0)\n ) {\n throw new Error('gepaOptimizationMethod: maxEvidenceChars must be a positive safe integer')\n }\n if (\n config.timeoutMs !== undefined &&\n (!Number.isSafeInteger(config.timeoutMs) ||\n config.timeoutMs <= 0 ||\n config.timeoutMs > MAX_TIMER_DELAY_MS)\n ) {\n throw new Error(`gepaOptimizationMethod: timeoutMs must be between 1 and ${MAX_TIMER_DELAY_MS}`)\n }\n const evidenceLimit = config.maxEvidenceChars ?? GEPA_DEFAULT_MAX_EVIDENCE_CHARS\n if (\n JSON.stringify(config.objective).length > evidenceLimit ||\n JSON.stringify(config.background ?? '').length > evidenceLimit\n ) {\n throw new Error(\n 'gepaOptimizationMethod: objective and background must each fit maxEvidenceChars',\n )\n }\n assertEngineModules(config.engineModules)\n resolveExternalOptimizerCallbackLimits(\n config.evaluationCallbackLimits,\n 'gepaOptimizationMethod: evaluationCallbackLimits',\n )\n if (config.optimizer !== undefined) {\n assertOptimizerModel(config.optimizer, 'gepaOptimizationMethod: optimizer')\n if (config.engineModules?.length) {\n throw new Error(\n 'gepaOptimizationMethod: optimizer cannot be combined with engineModules because proxied reflection requires the built-in GEPA engine',\n )\n }\n assertProxiedGepaRecipe(config.recipe, config.optimizer)\n }\n}\n\nexport function gepaRecipeSupportsResume(recipe: GepaOptimizationRecipe): boolean {\n return recipe.kind === 'engine' && recipe.run.engine === 'gepa'\n}\n\nexport function gepaRecipeEvaluationLimit(\n recipe: GepaOptimizationRecipe,\n selectionScenarioCount: number,\n): number {\n if (recipe.kind === 'adaptive-sequential') return recipe.maxEvaluations\n const runs =\n recipe.kind === 'engine'\n ? [recipe.run]\n : recipe.kind === 'sequential' || recipe.kind === 'best-of' || recipe.kind === 'vote'\n ? [...recipe.runs]\n : [...recipe.explore, recipe.continueWith]\n let total = 0\n for (const run of runs) {\n total = addEvaluationLimit(total, run.maxEvaluations)\n }\n if (recipe.kind === 'vote' && selectionScenarioCount > 0) {\n total = addEvaluationLimit(total, recipe.runs.length * selectionScenarioCount)\n }\n return total\n}\n\nexport function assertGepaComponentRecipe(recipe: GepaOptimizationRecipe, name: string): void {\n const unsupported = recipeEngineOptions(recipe).find((run) => run.engine !== 'gepa')\n if (unsupported) {\n throw new Error(\n `${name}: component surfaces require GEPA's 'gepa' engine; '${unsupported.engine}' accepts one text candidate`,\n )\n }\n}\n\nexport function defaultGepaMethodName(recipe: GepaOptimizationRecipe): string {\n if (recipe.kind === 'engine') return `gepa:${recipe.run.engine}`\n if (recipe.kind === 'omni') {\n return `gepa:omni:${recipe.continueWith.engine}`\n }\n return `gepa:${recipe.kind}`\n}\n\nfunction assertEngineModules(engineModules: readonly string[] | undefined): void {\n if (engineModules === undefined) return\n if (!Array.isArray(engineModules)) {\n throw new Error('gepaOptimizationMethod: engineModules must be an array')\n }\n const seen = new Set<string>()\n for (const module of engineModules) {\n if (\n typeof module !== 'string' ||\n !module ||\n !/^[A-Za-z][A-Za-z0-9_]*(?:\\.[A-Za-z][A-Za-z0-9_]*)*$/.test(module)\n ) {\n throw new Error(\n 'gepaOptimizationMethod: engineModules must contain public dotted Python module names',\n )\n }\n if (seen.has(module)) {\n throw new Error('gepaOptimizationMethod: engineModules must not contain duplicates')\n }\n seen.add(module)\n }\n}\n\nfunction assertRecipe(recipe: GepaOptimizationRecipe): void {\n if (!recipe || typeof recipe !== 'object') {\n throw new Error('gepaOptimizationMethod: recipe is required')\n }\n if (recipe.kind === 'engine') {\n assertEngineRun(recipe.run, 'recipe.run')\n return\n }\n if (recipe.kind === 'sequential') {\n assertEngineRuns(recipe.runs, 'recipe.runs', 1)\n return\n }\n if (recipe.kind === 'adaptive-sequential') {\n assertAdaptiveEngineRuns(recipe.runs, 'recipe.runs')\n assertPositiveSafeInteger(recipe.maxEvaluations, 'recipe.maxEvaluations')\n assertPositiveSafeInteger(recipe.plateauEvaluations, 'recipe.plateauEvaluations')\n if (recipe.patience !== undefined) {\n assertPositiveSafeInteger(recipe.patience, 'recipe.patience')\n }\n if (\n recipe.minEvaluationsPerStage !== undefined &&\n (!Number.isSafeInteger(recipe.minEvaluationsPerStage) || recipe.minEvaluationsPerStage < 0)\n ) {\n throw new Error(\n 'gepaOptimizationMethod: recipe.minEvaluationsPerStage must be a non-negative safe integer',\n )\n }\n if (\n recipe.improvementEpsilon !== undefined &&\n (!Number.isFinite(recipe.improvementEpsilon) || recipe.improvementEpsilon < 0)\n ) {\n throw new Error(\n 'gepaOptimizationMethod: recipe.improvementEpsilon must be a non-negative finite number',\n )\n }\n if (recipe.cycle !== undefined && typeof recipe.cycle !== 'boolean') {\n throw new Error('gepaOptimizationMethod: recipe.cycle must be a boolean')\n }\n if (recipe.maxSwitches !== undefined) {\n assertPositiveSafeInteger(recipe.maxSwitches, 'recipe.maxSwitches')\n }\n if (recipe.maxConcurrency !== undefined) {\n assertPositiveSafeInteger(recipe.maxConcurrency, 'recipe.maxConcurrency')\n }\n return\n }\n if (recipe.kind === 'best-of' || recipe.kind === 'vote') {\n assertEngineRuns(recipe.runs, 'recipe.runs', 2)\n assertParallelControls(recipe)\n return\n }\n if (recipe.kind === 'omni') {\n assertEngineRuns(recipe.explore, 'recipe.explore', 2)\n assertEngineRun(recipe.continueWith, 'recipe.continueWith')\n assertParallelControls(recipe)\n return\n }\n throw new Error('gepaOptimizationMethod: unsupported recipe')\n}\n\nfunction assertEngineRuns(runs: readonly GepaEngineRun[], label: string, minimum: number): void {\n if (!Array.isArray(runs) || runs.length < minimum) {\n throw new Error(\n `gepaOptimizationMethod: ${label} must contain at least ${minimum} bounded engine run${minimum === 1 ? '' : 's'}`,\n )\n }\n for (const [index, run] of runs.entries()) {\n assertEngineRun(run, `${label}[${index}]`)\n }\n}\n\nfunction assertAdaptiveEngineRuns(runs: readonly GepaAdaptiveEngineRun[], label: string): void {\n if (!Array.isArray(runs) || runs.length < 2) {\n throw new Error(\n `gepaOptimizationMethod: ${label} must contain at least two bounded engine runs`,\n )\n }\n for (const [index, run] of runs.entries()) {\n assertEngineOptions(run, `${label}[${index}]`)\n }\n}\n\nfunction assertEngineRun(run: GepaEngineRun, label: string): void {\n assertEngineOptions(run, label)\n assertPositiveSafeInteger(run.maxEvaluations, `${label}.maxEvaluations`)\n}\n\nfunction assertEngineOptions(run: GepaEngineOptions, label: string): void {\n if (!run || typeof run !== 'object') {\n throw new Error(`gepaOptimizationMethod: ${label} is required`)\n }\n if (typeof run.engine !== 'string' || !run.engine.trim() || run.engine.trim() !== run.engine) {\n throw new Error(`gepaOptimizationMethod: ${label}.engine must be a trimmed non-empty string`)\n }\n if (\n run.maxProposerCostUsd !== undefined &&\n (!Number.isFinite(run.maxProposerCostUsd) || run.maxProposerCostUsd <= 0)\n ) {\n throw new Error(\n `gepaOptimizationMethod: ${label}.maxProposerCostUsd must be a positive finite number when supplied`,\n )\n }\n if (run.maxConcurrency !== undefined) {\n assertPositiveSafeInteger(run.maxConcurrency, `${label}.maxConcurrency`)\n }\n if (run.stopAtScore !== undefined && !Number.isFinite(run.stopAtScore)) {\n throw new Error(`gepaOptimizationMethod: ${label}.stopAtScore must be a finite number`)\n }\n if (run.sandbox !== undefined && typeof run.sandbox !== 'boolean') {\n throw new Error(`gepaOptimizationMethod: ${label}.sandbox must be a boolean`)\n }\n assertJsonValue(run.engineConfig ?? {}, `gepaOptimizationMethod: ${label}.engineConfig`)\n assertNoCredentialValues(run.engineConfig ?? {}, `gepaOptimizationMethod: ${label}.engineConfig`)\n if (run.engine === 'gepa') {\n const nestedEngine = isRecord(run.engineConfig?.engine) ? run.engineConfig.engine : undefined\n if (nestedEngine && Object.hasOwn(nestedEngine, 'seed')) {\n throw new Error(\n `gepaOptimizationMethod: ${label}.engineConfig.engine.seed conflicts with the comparison seed; the bridge forwards the run seed`,\n )\n }\n }\n}\n\nfunction assertProxiedGepaRecipe(\n recipe: GepaOptimizationRecipe,\n optimizer: OpenAICompatibleOptimizerModel,\n): void {\n for (const [index, run] of recipeEngineOptions(recipe).entries()) {\n if (GEPA_AGENT_CLI_ENGINES.has(run.engine)) {\n assertProxiedAgentCliEngine(run, index, optimizer)\n continue\n }\n if (run.engine !== 'gepa') {\n throw new Error(\n `gepaOptimizationMethod: optimizer requires GEPA's 'gepa' engine; recipe engine ${index} is '${run.engine}'`,\n )\n }\n const reflection = isRecord(run.engineConfig?.reflection)\n ? run.engineConfig.reflection\n : undefined\n if (reflection && Object.hasOwn(reflection, 'reflection_lm')) {\n throw new Error(\n 'gepaOptimizationMethod: optimizer replaces engineConfig.reflection.reflection_lm; remove the duplicate setting',\n )\n }\n const reflectionOptions = isRecord(reflection?.reflection_lm_kwargs)\n ? reflection.reflection_lm_kwargs\n : undefined\n if (\n reflectionOptions &&\n [\n 'api_base',\n 'api_key',\n 'api_url',\n 'base_url',\n 'endpoint',\n 'messages',\n 'model',\n 'stream',\n ].some((key) => Object.hasOwn(reflectionOptions, key))\n ) {\n throw new Error(\n 'gepaOptimizationMethod: proxied reflection transport settings belong in optimizer',\n )\n }\n }\n}\n\nfunction assertProxiedAgentCliEngine(\n run: GepaEngineOptions,\n index: number,\n optimizer: OpenAICompatibleOptimizerModel,\n): void {\n if (optimizer.anthropicEndpoint !== true) {\n throw new Error(\n `gepaOptimizationMethod: agent engine '${run.engine}' (recipe engine ${index}) requires optimizer.anthropicEndpoint: true so the claude CLI meters through the loopback proxy`,\n )\n }\n // Both agent engines pass `--model engineConfig.model` to the CLI and the\n // flag beats the injected ANTHROPIC_MODEL, so a mismatch would 400 on every\n // CLI call at run time. Require the exact proxied model at config time.\n if (run.engineConfig?.model !== optimizer.model) {\n throw new Error(\n `gepaOptimizationMethod: recipe engine ${index} ('${run.engine}') must set engineConfig.model to the optimizer model '${optimizer.model}'`,\n )\n }\n // Anthropic extended thinking has no canonical execution-owner mapping. The\n // injected environment disables adaptive thinking; a fixed thinking budget\n // would force the CLI to request it and fail every call.\n if (run.engineConfig && Object.hasOwn(run.engineConfig, 'max_thinking_tokens')) {\n throw new Error(\n `gepaOptimizationMethod: recipe engine ${index} ('${run.engine}') cannot set engineConfig.max_thinking_tokens through the Anthropic endpoint`,\n )\n }\n}\n\nfunction assertParallelControls(recipe: { maxWorkers?: number }): void {\n if (recipe.maxWorkers !== undefined) {\n assertPositiveSafeInteger(recipe.maxWorkers, 'recipe.maxWorkers')\n }\n}\n\nfunction assertPositiveSafeInteger(value: number, label: string): void {\n if (!Number.isSafeInteger(value) || value <= 0) {\n throw new Error(`gepaOptimizationMethod: ${label} must be a positive safe integer`)\n }\n}\n\nfunction recipeEngineOptions(recipe: GepaOptimizationRecipe): readonly GepaEngineOptions[] {\n if (recipe.kind === 'engine') return [recipe.run]\n if (recipe.kind === 'omni') return [...recipe.explore, recipe.continueWith]\n return recipe.runs\n}\n\nfunction addEvaluationLimit(total: number, increment: number): number {\n const next = total + increment\n if (!Number.isSafeInteger(next)) {\n throw new Error('gepaOptimizationMethod: recipe evaluation limit exceeds safe integer range')\n }\n return next\n}\n","import type { CostLedgerSummary } from '../cost-ledger'\nimport type { OpenAICompatibleOptimizerModel } from './optimizer-model'\n\nexport interface ExternalOptimizerTokenUsage {\n inputTokens: number\n outputTokens: number\n totalTokens: number\n calls: number\n /** Provider requests, including failed attempts before a successful call. */\n requestAttempts?: number\n}\n\nconst TOKEN_USAGE_FIELDS = ['inputTokens', 'outputTokens', 'totalTokens', 'calls'] as const\n\nexport function assertPriorExternalOptimizerUsage(\n summary: CostLedgerSummary,\n budget: OpenAICompatibleOptimizerModel['budget'],\n name: string,\n): void {\n if (!summary.usageComplete || (budget.maxCostUsd !== undefined && !summary.accountingComplete)) {\n throw new Error(`${name}: cannot resume optimizer-model work with incomplete bounded usage`)\n }\n if (\n summary.totalCalls > budget.maxRequests ||\n (budget.maxCostUsd !== undefined && summary.totalCostUsd > budget.maxCostUsd + Number.EPSILON)\n ) {\n throw new Error(`${name}: prior optimizer-model usage exceeds the configured budget`)\n }\n}\n\nexport function assertExternalOptimizerTokenUsage(\n usage: ExternalOptimizerTokenUsage | undefined,\n name: string,\n optimizer: string,\n): void {\n if (usage === undefined) return\n for (const field of TOKEN_USAGE_FIELDS) {\n if (!Number.isSafeInteger(usage[field]) || usage[field] < 0) {\n throw new Error(`${name}: ${optimizer} bridge returned invalid tokenUsage.${field}`)\n }\n }\n if (usage.totalTokens !== usage.inputTokens + usage.outputTokens) {\n throw new Error(`${name}: ${optimizer} bridge returned inconsistent tokenUsage.totalTokens`)\n }\n if (\n usage.requestAttempts !== undefined &&\n (!Number.isSafeInteger(usage.requestAttempts) || usage.requestAttempts < usage.calls)\n ) {\n throw new Error(`${name}: ${optimizer} bridge returned invalid tokenUsage.requestAttempts`)\n }\n}\n\nexport function assertExternalOptimizerCompletionCount(\n upstream: ExternalOptimizerTokenUsage | undefined,\n requestAttempts: number,\n successfulCompletions: number,\n name: string,\n optimizer: string,\n): void {\n if (!upstream) {\n throw new Error(`${name}: ${optimizer} did not report optimizer token usage`)\n }\n if (\n !Number.isSafeInteger(requestAttempts) ||\n !Number.isSafeInteger(successfulCompletions) ||\n requestAttempts < 0 ||\n successfulCompletions < 0 ||\n successfulCompletions > requestAttempts\n ) {\n throw new Error(`${name}: optimizer model proxy returned invalid request counts`)\n }\n if (upstream.calls !== successfulCompletions) {\n throw new Error(\n `${name}: ${optimizer} reported ${upstream.calls} successful model calls but the proxy completed ${successfulCompletions} across ${requestAttempts} attempts`,\n )\n }\n if (upstream.requestAttempts !== undefined && upstream.requestAttempts !== requestAttempts) {\n throw new Error(\n `${name}: ${optimizer} reported ${upstream.requestAttempts} model attempts but the proxy received ${requestAttempts}`,\n )\n }\n}\n","import { isRecord } from '../llm-client/json'\nimport type { OptimizationPackageSource } from './optimization-method'\n\nexport interface ExternalOptimizerPackageSource<TPackage extends string> {\n package: TPackage\n version: string\n sourceUrl?: string\n revision?: string\n sourceSha256?: string\n}\n\nexport function assertExternalOptimizerPackageSource<TPackage extends string>(\n value: unknown,\n expectedPackage: TPackage,\n name: string,\n optimizer: string,\n): asserts value is ExternalOptimizerPackageSource<TPackage> {\n assertExternalOptimizerPackageIdentity(value, expectedPackage, name, optimizer)\n assertExternalOptimizerSourceDetails(value, name, optimizer)\n}\n\nexport function assertExternalOptimizerPackageIdentity<TPackage extends string>(\n value: unknown,\n expectedPackage: TPackage,\n name: string,\n optimizer: string,\n): asserts value is ExternalOptimizerPackageSource<TPackage> {\n if (\n !isRecord(value) ||\n value.package !== expectedPackage ||\n typeof value.version !== 'string' ||\n value.version.length === 0 ||\n value.version !== value.version.trim()\n ) {\n throw new Error(`${name}: ${optimizer} bridge returned invalid upstream package provenance`)\n }\n}\n\nexport function assertExternalOptimizerSourceDetails(\n value: ExternalOptimizerPackageSource<string>,\n name: string,\n optimizer: string,\n): void {\n if (\n value.sourceUrl !== undefined &&\n (typeof value.sourceUrl !== 'string' ||\n value.sourceUrl.length === 0 ||\n value.sourceUrl !== value.sourceUrl.trim())\n ) {\n throw new Error(`${name}: ${optimizer} bridge returned an invalid upstream sourceUrl`)\n }\n if (\n value.revision !== undefined &&\n (typeof value.revision !== 'string' ||\n value.revision.length === 0 ||\n value.revision !== value.revision.trim())\n ) {\n throw new Error(`${name}: ${optimizer} bridge returned an invalid upstream revision`)\n }\n if (\n value.sourceSha256 !== undefined &&\n (typeof value.sourceSha256 !== 'string' || !/^[0-9a-f]{64}$/.test(value.sourceSha256))\n ) {\n throw new Error(`${name}: ${optimizer} bridge returned an invalid upstream sourceSha256`)\n }\n}\n\nexport function observedExternalOptimizerPackageSource(\n value: ExternalOptimizerPackageSource<string>,\n): OptimizationPackageSource {\n return {\n kind: 'package',\n evidence: 'observed',\n package: value.package,\n version: value.version,\n ...(value.sourceUrl ? { sourceUrl: value.sourceUrl } : {}),\n ...(value.revision ? { revision: value.revision } : {}),\n ...(value.sourceSha256 ? { sourceSha256: value.sourceSha256 } : {}),\n }\n}\n","import { isDeepStrictEqual } from 'node:util'\nimport { isRecord } from '../llm-client/json'\nimport type {\n ExternalOptimizerResumeMode,\n ExternalOptimizerRunnerCommand,\n} from './external-optimizer-contracts'\nimport {\n assertExternalOptimizerPackageSource,\n type ExternalOptimizerPackageSource,\n observedExternalOptimizerPackageSource,\n} from './external-optimizer-source'\nimport { runExternalOptimizerProcess } from './external-optimizer-subprocess'\nimport type {\n OptimizationModuleSource,\n OptimizationPackageSource,\n OptimizationPythonRuntime,\n} from './optimization-method'\n\nexport interface ExternalOptimizerRuntimeIdentity<TPackage extends string> {\n python: OptimizationPythonRuntime\n bridge: ExternalOptimizerPackageSource<'agent-eval-rpc'>\n optimizer: ExternalOptimizerPackageSource<TPackage>\n engineModules: OptimizationModuleSource[]\n}\n\nexport interface ObservedExternalOptimizerRuntime {\n source: OptimizationPackageSource\n bridge: OptimizationPackageSource\n modules: OptimizationModuleSource[]\n python: OptimizationPythonRuntime\n}\n\nexport async function inspectExternalOptimizerRuntime<TPackage extends string>(args: {\n label: string\n package: TPackage\n module: string\n engineModules?: readonly string[]\n runner?: ExternalOptimizerRunnerCommand\n timeoutMs: number\n signal?: AbortSignal\n}): Promise<ExternalOptimizerRuntimeIdentity<TPackage>> {\n const result = await runExternalOptimizerProcess<{ runtime: unknown }>({\n label: `${args.label} source inspection`,\n tempPrefix: `agent-eval-${args.package}-inspect-`,\n module: args.module,\n input: {\n operation: 'inspect',\n engineModules: [...(args.engineModules ?? [])],\n },\n ...(args.runner ? { runner: args.runner } : {}),\n timeoutMs: args.timeoutMs,\n ...(args.signal ? { signal: args.signal } : {}),\n })\n assertExternalOptimizerRuntimeIdentity(result.runtime, args.package, args.label)\n return result.runtime\n}\n\nexport function observedExternalOptimizerRuntime(\n runtime: ExternalOptimizerRuntimeIdentity<string>,\n): ObservedExternalOptimizerRuntime {\n return {\n source: observedExternalOptimizerPackageSource(runtime.optimizer),\n bridge: observedExternalOptimizerPackageSource(runtime.bridge),\n modules: runtime.engineModules.map((module) => ({ ...module })),\n python: { ...runtime.python },\n }\n}\n\nexport function assertExternalOptimizerRunBinding<TPackage extends string>(args: {\n label: string\n runtime: ExternalOptimizerRuntimeIdentity<TPackage>\n returnedSource: ExternalOptimizerPackageSource<TPackage>\n compatibleRunId: string\n runId: string\n returnedRunId: string\n resume: ExternalOptimizerResumeMode\n resumed: boolean\n}): void {\n if (!isDeepStrictEqual(args.returnedSource, args.runtime.optimizer)) {\n throw new Error(`${args.label}: optimizer package changed after source inspection`)\n }\n if (args.returnedRunId !== args.runId) {\n throw new Error(`${args.label}: bridge returned a different run ID`)\n }\n if (args.resume === 'never' && args.resumed) {\n throw new Error(`${args.label}: fresh run reported restored state`)\n }\n if (args.resume === 'required' && !args.resumed) {\n throw new Error(`${args.label}: required resume did not restore state`)\n }\n if (!args.runId.startsWith(args.compatibleRunId)) {\n throw new Error(`${args.label}: run ID is not bound to its compatible identity`)\n }\n}\n\nfunction assertExternalOptimizerRuntimeIdentity<TPackage extends string>(\n value: unknown,\n expectedPackage: TPackage,\n label: string,\n): asserts value is ExternalOptimizerRuntimeIdentity<TPackage> {\n if (!isRecord(value)) {\n throw new Error(`${label}: source inspection returned no runtime identity`)\n }\n assertExternalOptimizerPackageSource(value.bridge, 'agent-eval-rpc', label, 'bridge')\n assertExternalOptimizerPackageSource(value.optimizer, expectedPackage, label, expectedPackage)\n if (!value.bridge.sourceSha256 || !value.optimizer.sourceSha256) {\n throw new Error(`${label}: source inspection omitted package source hashes`)\n }\n if (\n !isRecord(value.python) ||\n typeof value.python.implementation !== 'string' ||\n value.python.implementation.length === 0 ||\n value.python.implementation !== value.python.implementation.trim() ||\n typeof value.python.version !== 'string' ||\n value.python.version.length === 0 ||\n value.python.version !== value.python.version.trim()\n ) {\n throw new Error(`${label}: source inspection returned an invalid Python runtime`)\n }\n if (\n !Array.isArray(value.engineModules) ||\n value.engineModules.some(\n (module) =>\n !isRecord(module) ||\n typeof module.module !== 'string' ||\n module.module.length === 0 ||\n module.module !== module.module.trim() ||\n typeof module.sourceSha256 !== 'string' ||\n !/^[0-9a-f]{64}$/.test(module.sourceSha256),\n )\n ) {\n throw new Error(`${label}: source inspection returned invalid engine modules`)\n }\n}\n","import type { ExternalOptimizerTokenUsage } from './external-optimizer-accounting'\nimport { assertExternalOptimizerTokenUsage } from './external-optimizer-accounting'\nimport { type ExternalTextCandidate, isExternalTextCandidate } from './external-optimizer-process'\nimport {\n assertExternalOptimizerPackageSource,\n type ExternalOptimizerPackageSource,\n} from './external-optimizer-source'\nimport {\n assertGepaCandidatePopulationSummary,\n type GepaCandidatePopulationSummary,\n} from './gepa-candidate-population'\nimport type { GepaOptimizationRecipe } from './gepa-optimization-method'\n\nexport interface GepaBridgeOutput {\n bestCandidate: ExternalTextCandidate\n bestScore: number\n /** Evaluations the local callback metered — the trusted count. */\n totalEvaluations: number\n /**\n * Evaluation total GEPA reported from its own counters\n * (`total_evals`, falling back to `total_metric_calls`). A difference from\n * `totalEvaluations` means upstream skipped, cached, or double-counted work.\n */\n upstreamReportedEvaluations?: number\n recipeKind: GepaOptimizationRecipe['kind']\n proposerCostUsd?: number\n proposerCostAccounting?: 'metered' | 'reported' | 'unavailable'\n tokenUsage?: ExternalOptimizerTokenUsage\n upstream: ExternalOptimizerPackageSource<'gepa'>\n runId: string\n resumed: boolean\n /**\n * Whether the run seed reached every engine configuration in the recipe.\n * False when the recipe includes an agent engine, which accepts no seed.\n */\n seedApplied: boolean\n candidatePopulation?: GepaCandidatePopulationSummary\n}\n\nexport function assertGepaBridgeOutput(\n result: GepaBridgeOutput,\n name: string,\n maxCandidateChars: number,\n recipeKind: GepaOptimizationRecipe['kind'],\n maxEvaluations: number,\n maxPopulationCandidates: number,\n scenarioIds: readonly string[],\n expectsComponents: boolean,\n requiresCandidatePopulation: boolean,\n): asserts result is GepaBridgeOutput {\n if (result.recipeKind !== recipeKind) {\n throw new Error(`${name}: GEPA bridge reported recipe '${String(result.recipeKind)}'`)\n }\n if (\n !isGepaCandidate(result.bestCandidate, maxCandidateChars) ||\n expectsComponents !== (typeof result.bestCandidate !== 'string')\n ) {\n throw new Error(`${name}: GEPA bridge returned an invalid candidate`)\n }\n if (!Number.isFinite(result.bestScore)) {\n throw new Error(`${name}: GEPA bridge returned an invalid bestScore`)\n }\n if (\n !Number.isSafeInteger(result.totalEvaluations) ||\n result.totalEvaluations < 0 ||\n result.totalEvaluations > maxEvaluations\n ) {\n throw new Error(`${name}: GEPA bridge returned an invalid totalEvaluations`)\n }\n if (\n result.upstreamReportedEvaluations !== undefined &&\n (!Number.isSafeInteger(result.upstreamReportedEvaluations) ||\n result.upstreamReportedEvaluations < 0)\n ) {\n throw new Error(`${name}: GEPA bridge returned an invalid upstreamReportedEvaluations`)\n }\n if (\n result.proposerCostUsd !== undefined &&\n (!Number.isFinite(result.proposerCostUsd) || result.proposerCostUsd < 0)\n ) {\n throw new Error(`${name}: GEPA bridge returned an invalid proposerCostUsd`)\n }\n if (\n result.proposerCostAccounting !== 'metered' &&\n result.proposerCostAccounting !== 'reported' &&\n result.proposerCostAccounting !== 'unavailable'\n ) {\n throw new Error(`${name}: GEPA bridge returned invalid proposerCostAccounting`)\n }\n if (\n (result.proposerCostAccounting !== 'unavailable') !==\n (result.proposerCostUsd !== undefined)\n ) {\n throw new Error(`${name}: GEPA bridge returned inconsistent proposer cost accounting`)\n }\n assertExternalOptimizerTokenUsage(result.tokenUsage, name, 'GEPA')\n if (result.proposerCostAccounting === 'metered' && result.tokenUsage === undefined) {\n throw new Error(`${name}: metered GEPA bridge omitted tokenUsage`)\n }\n assertExternalOptimizerPackageSource(result.upstream, 'gepa', name, 'GEPA')\n if (\n typeof result.runId !== 'string' ||\n result.runId.length === 0 ||\n result.runId !== result.runId.trim()\n ) {\n throw new Error(`${name}: GEPA bridge returned an invalid runId`)\n }\n if (typeof result.resumed !== 'boolean') {\n throw new Error(`${name}: GEPA bridge returned an invalid resumed flag`)\n }\n if (typeof result.seedApplied !== 'boolean') {\n throw new Error(\n `${name}: GEPA bridge returned an invalid seedApplied flag; upgrade agent-eval-rpc to a release that forwards the run seed`,\n )\n }\n if (result.candidatePopulation !== undefined) {\n assertGepaCandidatePopulationSummary(result.candidatePopulation)\n if (result.candidatePopulation.runId !== result.runId) {\n throw new Error(`${name}: GEPA candidate population has a different run ID`)\n }\n if (\n result.candidatePopulation.maxCandidates !== maxPopulationCandidates ||\n result.candidatePopulation.maxCandidateChars !== maxCandidateChars ||\n result.candidatePopulation.surfaceKind !== (expectsComponents ? 'components' : 'text') ||\n result.candidatePopulation.scenarioIds.length !== scenarioIds.length ||\n result.candidatePopulation.scenarioIds.some(\n (scenarioId, index) => scenarioId !== scenarioIds[index],\n )\n ) {\n throw new Error(`${name}: GEPA candidate population differs from its configured bounds`)\n }\n } else if (requiresCandidatePopulation) {\n throw new Error(`${name}: GEPA bridge omitted the official candidate population`)\n }\n}\n\nfunction isGepaCandidate(value: unknown, maxChars: number): value is ExternalTextCandidate {\n if (!isExternalTextCandidate(value)) return false\n const size = typeof value === 'string' ? value.length : JSON.stringify(value).length\n return size <= maxChars\n}\n","/**\n * Import an external optimizer's own record into a search ledger.\n *\n * GEPA and SkillOpt search inside their own processes. The evaluation\n * callback's observation log holds every candidate either one evaluated, and\n * GEPA's candidate population also names each candidate's parents by index.\n * The importer turns both into ledger events: one node per distinct candidate,\n * one `correlated` edge per population entry (joined by content digest from\n * GEPA's own parent record), and one cell per evaluation. Nothing is inferred\n * from timing or order: a candidate with no parent record (every SkillOpt\n * candidate, and a candidate GEPA kept out of its population) has an `unknown`\n * edge and no parents.\n */\n\nimport { hashCanonical } from '../ledger-core/canonical'\nimport type { ExternalTextCandidate } from './external-optimizer-contracts'\nimport type { ExternalOptimizerObservationArtifact } from './external-optimizer-observations'\nimport type {\n GepaCandidatePopulationArtifact,\n GepaCandidatePopulationCandidate,\n} from './gepa-candidate-population'\nimport type { SearchHistoryReceipt } from './search-history-receipt'\nimport { openSearchLedger } from './search-ledger'\nimport {\n developmentClaim,\n type RegisterSearchNodeInput,\n SearchRecorder,\n type SearchRunIdentity,\n surfaceDiff,\n surfaceNode,\n} from './search-ledger-recording'\nimport type {\n SearchArtifactRef,\n SearchAttemptAccounting,\n SearchExecutionIdentity,\n SearchProposer,\n SearchSplit,\n SearchTask,\n SearchTaskOutcome,\n SearchUnknown,\n} from './search-ledger-types'\nimport type { CampaignStorage } from './storage'\nimport type { MutableSurface, Scenario } from './types'\n\n/** The external optimizers whose searches this module records. */\nexport type ExternalSearchOptimizer = 'GEPA' | 'SkillOpt'\n\nfunction noRationale(optimizer: ExternalSearchOptimizer): SearchUnknown {\n return {\n unknown: `${optimizer} records no rationale per candidate; its reflection attaches to the proposer operation`,\n }\n}\n\nconst NO_GEPA_RATIONALE = noRationale('GEPA')\n\nexport interface GepaPopulationImport {\n /** Population index to node id. */\n nodeIds: ReadonlyMap<number, string>\n /** Distinct nodes the population maps to. */\n nodes: number\n edges: number\n /** Population entries whose content equals an earlier entry's: one node, a second edge. */\n collapsedDuplicates: number\n /** Proposals whose content equals their own parent, which no edge can express. */\n unchangedProposals: number\n}\n\n/**\n * Register GEPA's population as nodes and its parent indices as `correlated`\n * edges. A parentless entry (GEPA's seed) gets a seed edge unless its node is\n * already in the tree, for example the root the caller seeded.\n */\nexport async function importGepaPopulation(input: {\n recorder: SearchRecorder\n population: GepaCandidatePopulationArtifact\n proposer: SearchProposer\n /** How a candidate becomes a node. Default: its text or component surface. */\n node?: (candidate: GepaCandidatePopulationCandidate) => RegisterSearchNodeInput\n /** How a parent-to-child diff is stored. Default: the surface diff. */\n diff?: (\n parent: GepaCandidatePopulationCandidate,\n child: GepaCandidatePopulationCandidate,\n ) => SearchArtifactRef | SearchUnknown\n}): Promise<GepaPopulationImport> {\n const { recorder, population } = input\n const node =\n input.node ?? ((candidate) => surfaceNode(recorder, externalSurface(candidate.candidate)))\n const diff =\n input.diff ??\n ((parent, child) =>\n surfaceDiff(recorder, externalSurface(parent.candidate), externalSurface(child.candidate)))\n const nodeIds = new Map<number, string>()\n const byIndex = new Map(population.candidates.map((candidate) => [candidate.index, candidate]))\n const seenNodes = new Set<string>()\n let edges = 0\n let collapsedDuplicates = 0\n let unchangedProposals = 0\n for (const candidate of population.candidates) {\n const { nodeId } = await recorder.registerNode(node(candidate))\n if (seenNodes.has(nodeId)) collapsedDuplicates += 1\n seenNodes.add(nodeId)\n nodeIds.set(candidate.index, nodeId)\n\n const parentIndices = [\n ...new Set(candidate.parentIndices.filter((index): index is number => index !== null)),\n ]\n const parents: Array<{ nodeId: string; candidate: GepaCandidatePopulationCandidate }> = []\n for (const index of parentIndices) {\n const parentNodeId = nodeIds.get(index)\n const parent = byIndex.get(index)\n if (parentNodeId === undefined || parent === undefined) {\n throw new Error(\n `GEPA candidate ${candidate.index} names parent ${index}, which precedes no population entry`,\n )\n }\n if (parentNodeId === nodeId) continue\n if (!parents.some((known) => known.nodeId === parentNodeId)) {\n parents.push({ nodeId: parentNodeId, candidate: parent })\n }\n }\n if (parentIndices.length > 0 && parents.length === 0) {\n unchangedProposals += 1\n continue\n }\n if (parents.length === 0) {\n const state = await recorder.state()\n if ((state.node(nodeId)?.edgeIds.length ?? 0) > 0) continue\n await recorder.recordEdge({\n childNodeId: nodeId,\n parents: [],\n operator: 'seed',\n attribution: 'correlated',\n proposer: null,\n proposalKey: `gepa:${population.runId}:${candidate.index}`,\n rationale: NO_GEPA_RATIONALE,\n diffs: [],\n label: `GEPA seed candidate ${candidate.index}`,\n })\n edges += 1\n continue\n }\n await recorder.recordEdge({\n childNodeId: nodeId,\n parents: parents.map((parent) => parent.nodeId),\n operator: parents.length > 1 ? 'merge' : 'improve',\n attribution: 'correlated',\n proposer: input.proposer,\n proposalKey: `gepa:${population.runId}:${candidate.index}`,\n rationale: NO_GEPA_RATIONALE,\n diffs: parents.map((parent) => diff(parent.candidate, candidate)),\n label: `GEPA candidate ${candidate.index}`,\n })\n edges += 1\n }\n return { nodeIds, nodes: seenNodes.size, edges, collapsedDuplicates, unchangedProposals }\n}\n\nexport interface GepaEvaluationImport {\n cells: number\n /** Nodes of candidates GEPA evaluated but kept out of its population. */\n unrecordedParentNodeIds: string[]\n}\n\n/**\n * Record every evaluation in the callback's observation log as an `external`\n * cell attempt. A candidate that is not yet a node (GEPA evaluated it on a\n * minibatch and discarded it, or SkillOpt, which reports no parents, proposed\n * it) is registered with an `unknown` edge.\n */\nexport async function importExternalEvaluations(input: {\n recorder: SearchRecorder\n observations: ExternalOptimizerObservationArtifact\n proposer: SearchProposer\n identity: SearchExecutionIdentity\n /** The split each evaluated example belongs to. */\n splitOf: (exampleId: string) => SearchSplit\n /** The optimizer that proposed the candidates. Default GEPA. */\n optimizer?: ExternalSearchOptimizer\n}): Promise<GepaEvaluationImport> {\n const { recorder } = input\n const optimizer = input.optimizer ?? 'GEPA'\n const reps = new Map<string, number>()\n const unrecorded: string[] = []\n let cells = 0\n for (const observation of input.observations.observations) {\n // A failed evaluation is logged as a refusal, but it ran and consumed an\n // evaluation, so it is an unscored cell. Other refusals never ran.\n const ran =\n observation.kind === 'evaluation' ||\n (observation.kind === 'refusal' && observation.reason === 'evaluation-failed')\n if (!ran || observation.candidate === undefined || observation.exampleId === undefined) continue\n const candidateHash = observation.candidateHash!\n const surface = externalSurface(observation.candidate)\n const registered = await recorder.registerNode(surfaceNode(recorder, surface))\n const state = await recorder.state()\n if ((state.node(registered.nodeId)?.edgeIds.length ?? 0) === 0) {\n await recorder.recordEdge({\n childNodeId: registered.nodeId,\n parents: [],\n operator: 'improve',\n attribution: 'unknown',\n proposer: input.proposer,\n proposalKey: `${optimizer.toLowerCase()}-evaluated:${candidateHash}`,\n rationale: noRationale(optimizer),\n diffs: [],\n label:\n optimizer === 'GEPA'\n ? 'GEPA proposal outside its population'\n : `${optimizer} proposal without a parent record`,\n })\n unrecorded.push(registered.nodeId)\n }\n const split = input.splitOf(observation.exampleId)\n const repKey = `${registered.nodeId}\\u0000${observation.exampleId}`\n const rep = reps.get(repKey) ?? 0\n reps.set(repKey, rep + 1)\n const cellId = await recorder.allocateCell({\n nodeId: registered.nodeId,\n taskId: observation.exampleId,\n split,\n rep,\n stage: 'external',\n })\n await recorder.settleCell({\n cellId,\n attempt: 1,\n outcome:\n observation.kind === 'evaluation'\n ? evaluationOutcome(observation.response)\n : {\n status: 'errored',\n metrics: {},\n error: {\n code: 'evaluation-failed',\n message: 'the evaluation callback failed before a score',\n retryable: false,\n },\n },\n accounting: {\n tokens: { status: 'unknown', reason: 'the evaluation callback meters tokens per run' },\n cost: {\n status: 'unknown',\n knownLowerBoundUsd: 0,\n reason: 'the evaluation callback meters cost per run, not per evaluation',\n },\n },\n identity: input.identity,\n })\n cells += 1\n }\n return { cells, unrecordedParentNodeIds: unrecorded }\n}\n\n/** GEPA's callback response. A `failed` evaluation carries a penalty score for\n * the optimizer that is not a measurement, so the cell is unscored. */\nfunction evaluationOutcome(response: unknown): SearchTaskOutcome {\n const record = (response ?? {}) as {\n score?: unknown\n info?: { status?: unknown; notes?: unknown }\n }\n if (\n record.info?.status === 'scored' &&\n typeof record.score === 'number' &&\n Number.isFinite(record.score)\n ) {\n return { status: 'passed', score: record.score, metrics: { score: record.score } }\n }\n return {\n status: 'errored',\n metrics: {},\n error: {\n code: 'evaluation-failed',\n message:\n typeof record.info?.notes === 'string' && record.info.notes.trim().length > 0\n ? record.info.notes.trim()\n : 'the evaluation produced no score',\n retryable: false,\n },\n }\n}\n\n/** An optimizer candidate as the mutable surface it represents. */\nexport function externalSurface(candidate: ExternalTextCandidate): MutableSurface {\n return typeof candidate === 'string' ? candidate : { kind: 'components', components: candidate }\n}\n\n/** What `recordGepaSearch` and `recordSkillOptSearch` share. */\ninterface ExternalSearchRecordInput {\n name: string\n path: string\n searchId: string\n identity: SearchRunIdentity\n storage: CampaignStorage\n seed: number\n baselineSurface: MutableSurface\n trainScenarios: readonly Scenario[]\n selectionScenarios: readonly Scenario[]\n evaluationLimit: number\n observations: ExternalOptimizerObservationArtifact\n generationAccounting: SearchAttemptAccounting\n}\n\n/**\n * Write GEPA's finished search into its ledger: the baseline as the seeded\n * root, the population as nodes with `correlated` edges, every callback\n * evaluation as an `external` cell, GEPA's proposer spend as one operation,\n * GEPA's choice as the selected node, and the close. GEPA's own selection is a\n * budget decision, so the ledger carries no claim; the final comparison runs\n * outside this search.\n *\n * A composed recipe reports no population: pass `population: null` and GEPA's\n * returned best as `selected`, and every evaluated candidate enters with an\n * `unknown` edge, as SkillOpt's do.\n */\nexport async function recordGepaSearch(\n input: ExternalSearchRecordInput &\n (\n | { population: GepaCandidatePopulationArtifact }\n | { population: null; selected: MutableSurface }\n ),\n): Promise<SearchHistoryReceipt> {\n if (input.population === null) return recordExternalSearch({ ...input, optimizer: 'GEPA' })\n const { population } = input\n const best = population.candidates.find((candidate) => candidate.index === population.bestIndex)\n if (!best) {\n throw new Error(`GEPA candidate population has no bestIndex entry ${population.bestIndex}`)\n }\n return recordExternalSearch({\n ...input,\n population,\n optimizer: 'GEPA',\n selected: externalSurface(best.candidate),\n })\n}\n\n/**\n * Write SkillOpt's finished search into its ledger: the baseline as the seeded\n * root, every candidate SkillOpt evaluated as a node with an `unknown` edge\n * (SkillOpt reports no parents), every callback evaluation as an `external`\n * cell, SkillOpt's optimizer spend as one operation, SkillOpt's choice as the\n * selected node, and the close. Like GEPA's, the ledger carries no claim.\n */\nexport async function recordSkillOptSearch(\n input: ExternalSearchRecordInput & { selected: MutableSurface },\n): Promise<SearchHistoryReceipt> {\n return recordExternalSearch({ ...input, optimizer: 'SkillOpt', population: null })\n}\n\nasync function recordExternalSearch(\n input: ExternalSearchRecordInput & {\n optimizer: ExternalSearchOptimizer\n population: GepaCandidatePopulationArtifact | null\n /** The surface the optimizer chose. */\n selected: MutableSurface\n },\n): Promise<SearchHistoryReceipt> {\n const { identity, population, optimizer } = input\n const policyName = optimizer.toLowerCase()\n const tasks = (scenarios: readonly Scenario[]): SearchTask[] =>\n scenarios.map((scenario) => ({\n taskId: scenario.id,\n unitId: scenario.id,\n source: { uri: `scenario://${scenario.id}`, revision: hashCanonical(scenario) },\n }))\n const train = tasks(input.trainScenarios)\n const selection = tasks(input.selectionScenarios)\n const taskSet = hashCanonical({ train, selection })\n const recorder = await SearchRecorder.open(\n {\n ledger: openSearchLedger({ path: input.path, searchId: input.searchId }),\n storage: input.storage,\n },\n {\n subject: identity.subject ?? input.name,\n process: { name: input.name, executionRef: identity.search },\n artifactKind: 'prompt',\n objective: {\n metric: 'score',\n direction: 'maximize',\n judge: identity.judge ?? {\n unknown:\n 'the evaluation callback judges through caller functions without a pinned source',\n },\n claim: identity.claim ?? developmentClaim(taskSet),\n },\n splits: { train, selection, test: [], heldOutUnits: true },\n policy: { expansion: policyName, allocation: policyName, seed: input.seed },\n budget: {\n maxUsd: null,\n maxCells: input.evaluationLimit,\n maxNodes: null,\n deadline: null,\n maxConcurrency: null,\n reservedClaimUsd: 0,\n },\n containment: null,\n derivedFrom: null,\n identity: {\n model: identity.model,\n agent: identity.agent,\n benchmark: { uri: `optimizer://${input.name}`, revision: taskSet },\n },\n },\n )\n const root = await recorder.registerNode(surfaceNode(recorder, input.baselineSurface))\n await recorder.recordEdge({\n childNodeId: root.nodeId,\n parents: [],\n operator: 'seed',\n attribution: 'explicit',\n proposer: null,\n proposalKey: 'baseline',\n rationale: { unknown: 'the baseline is the caller-supplied starting surface' },\n diffs: [],\n label: 'baseline',\n })\n const operationId = `${policyName}-proposals`\n await recorder.startOperation({ operationId, operationKind: 'candidate-generation' })\n const proposer = {\n kind: 'optimizer' as const,\n name: input.name,\n operationId,\n source: identity.proposer.source,\n }\n if (population) await importGepaPopulation({ recorder, population, proposer })\n const trainIds = new Set(train.map((task) => task.taskId))\n const evaluations = await importExternalEvaluations({\n recorder,\n observations: input.observations,\n proposer,\n identity: {\n model: identity.model,\n agent: identity.agent,\n benchmark: { uri: `optimizer://${input.name}`, revision: taskSet },\n },\n splitOf: (exampleId) => (trainIds.has(exampleId) ? 'train' : 'selection'),\n optimizer,\n })\n // The optimizer's choice is a node unless no evaluation ever reached it.\n const chosen = await recorder.registerNode(surfaceNode(recorder, input.selected))\n if (((await recorder.state()).node(chosen.nodeId)?.edgeIds.length ?? 0) === 0) {\n await recorder.recordEdge({\n childNodeId: chosen.nodeId,\n parents: [],\n operator: 'improve',\n attribution: 'unknown',\n proposer,\n proposalKey: `${policyName}-selected`,\n rationale: noRationale(optimizer),\n diffs: [],\n label: `${optimizer} choice without an evaluation`,\n })\n }\n await recorder.recordOperation({\n operationId,\n operationKind: 'candidate-generation',\n execution: identity.proposer,\n outcome: { status: 'completed' },\n accounting: input.generationAccounting,\n })\n // Read everything the decisions need before the first decision moves the ledger.\n const state = await recorder.state()\n const nodes = state.nodes()\n const best = chosen.nodeId\n const bestScored = state.cells({ nodeId: best }).some((cell) => cell.score !== null)\n // GEPA chooses by its aggregate selection score; SkillOpt by its own validation.\n const rule = population ? 'gepa-best-aggregate' : `${policyName}-choice`\n const basis = population ? 'its aggregate selection score' : 'its own validation'\n for (const node of nodes) {\n if (node.nodeId === best && bestScored) {\n await recorder.decideNode({\n nodeId: node.nodeId,\n decision: { status: 'selected' },\n rule,\n reason: `${optimizer} chose this candidate by ${basis}`,\n })\n } else if (population && evaluations.unrecordedParentNodeIds.includes(node.nodeId)) {\n await recorder.decideNode({\n nodeId: node.nodeId,\n decision: { status: 'pruned' },\n rule: 'gepa-population',\n reason: 'GEPA evaluated the candidate and kept it out of its population',\n })\n } else {\n await recorder.decideNode({\n nodeId: node.nodeId,\n decision: node.nodeId === best ? { status: 'invalid' } : { status: 'rejected' },\n rule,\n reason:\n node.nodeId === best\n ? `${optimizer} chose this candidate, but no evaluation of it was scored`\n : `${optimizer} chose another candidate`,\n })\n }\n }\n await recorder.close({ reason: 'budget', claim: null })\n return recorder.receipt({ producerId: input.name, runId: input.searchId })\n}\n","import { randomBytes } from 'node:crypto'\nimport { mkdir } from 'node:fs/promises'\nimport { contentHash } from '../verdict-cache'\nimport {\n assertExternalOptimizerCompletionCount,\n assertPriorExternalOptimizerUsage,\n} from './external-optimizer-accounting'\nimport {\n openExternalOptimizerExecutionLog,\n openExternalOptimizerObservationLog,\n readExternalOptimizerObservationArtifact,\n} from './external-optimizer-observations'\nimport {\n closeExternalOptimizerResources,\n type ExternalOptimizerModelProxy,\n removeCredentialEnvironment,\n resolveExternalOptimizerCallbackLimits,\n runExternalOptimizerProcess,\n runWithCleanup,\n startExternalOptimizerCallback,\n startExternalOptimizerModelProxy,\n} from './external-optimizer-process'\nimport {\n externalOptimizerCompatibleRunKey,\n externalOptimizerRunKey,\n openExternalOptimizerRunBudget,\n} from './external-optimizer-run-budget'\nimport { externalOptimizerRunnerIdentity, snapshotJson } from './external-optimizer-run-config'\nimport {\n assertExternalOptimizerRunBinding,\n inspectExternalOptimizerRuntime,\n observedExternalOptimizerRuntime,\n} from './external-optimizer-runtime'\nimport {\n createExternalTextEvaluator,\n decodeExternalTextCandidate,\n describeExternalScenario,\n type ExternalOptimizationExample,\n encodeExternalTextCandidate,\n mapExternalScenarios,\n} from './external-text-optimization'\nimport { readGepaCandidatePopulationArtifact } from './gepa-candidate-population'\nimport {\n assertGepaComponentRecipe,\n GEPA_DEFAULT_MAX_CANDIDATE_CHARS,\n GEPA_DEFAULT_MAX_EVIDENCE_CHARS,\n GEPA_DEFAULT_TIMEOUT_MS,\n gepaRecipeEvaluationLimit,\n gepaRecipeHasAgentCliEngine,\n gepaRecipeSupportsResume,\n} from './gepa-optimization-config'\nimport type { GepaOptimizationMethodConfig, GepaRunnerCommand } from './gepa-optimization-method'\nimport { assertGepaBridgeOutput, type GepaBridgeOutput } from './gepa-optimization-result'\nimport { recordGepaSearch } from './gepa-search-import'\nimport {\n combineComparisonCosts,\n costFromLedgerSummary,\n optimizationTokenUsageFromSummary,\n} from './optimization-cost'\nimport type { OptimizationMethodInput, OptimizationMethodResult } from './optimization-method'\nimport type { OpenAICompatibleOptimizerModel } from './optimizer-model'\nimport type { SearchHistoryReceipt } from './search-history-receipt'\nimport type { SearchAttemptAccounting } from './search-ledger'\nimport { fsCampaignStorage } from './storage'\nimport type { Scenario } from './types'\n\nfunction anthropicShimEnvironment(\n proxy: Pick<ExternalOptimizerModelProxy, 'baseUrl' | 'apiKey'>,\n optimizer: OpenAICompatibleOptimizerModel,\n): Record<string, string> {\n return {\n // The Anthropic SDK appends /v1/messages itself; inject the origin.\n ANTHROPIC_BASE_URL: new URL(proxy.baseUrl).origin,\n ANTHROPIC_AUTH_TOKEN: proxy.apiKey,\n ANTHROPIC_MODEL: optimizer.model,\n // Background haiku-class calls must carry the one admitted model id.\n ANTHROPIC_SMALL_FAST_MODEL: optimizer.model,\n CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC: '1',\n // The proxy refuses thinking requests; adaptive thinking stays off.\n CLAUDE_CODE_DISABLE_ADAPTIVE_THINKING: '1',\n // Align the CLI's requested max_tokens with the per-request cap. The\n // engines only setdefault this variable, so the injected value wins.\n CLAUDE_CODE_MAX_OUTPUT_TOKENS: String(\n Math.min(optimizer.budget.maxOutputTokensPerRequest, 64_000),\n ),\n // The synthesized SSE sends its first byte after the owner call\n // completes; keep the CLI deadline above the proxy's request deadline.\n API_TIMEOUT_MS: String((optimizer.budget.requestTimeoutMs ?? 300_000) + 60_000),\n }\n}\n\n/** Spend the optimizer booked to its own candidate generation. Unknown stays\n * unknown: the bridge reports proposer cost only when the engine measured it. */\nfunction optimizerAccounting(\n tokenUsage: { inputTokens?: number; outputTokens?: number } | undefined,\n proposerCostUsd: number | undefined,\n): SearchAttemptAccounting {\n return {\n tokens:\n tokenUsage?.inputTokens === undefined || tokenUsage.outputTokens === undefined\n ? { status: 'unknown', reason: 'the optimizer bridge reported no token usage' }\n : {\n status: 'known',\n inputTokens: tokenUsage.inputTokens,\n outputTokens: tokenUsage.outputTokens,\n cachedTokens: 0,\n },\n cost:\n proposerCostUsd === undefined\n ? {\n status: 'unknown',\n knownLowerBoundUsd: 0,\n reason: 'the optimizer bridge reported no proposer cost',\n }\n : { status: 'known', usd: proposerCostUsd, source: 'provider' },\n }\n}\n\n/** What the GEPA run key is hashed over; fields added later join only when enabled so earlier run keys keep their identity. */\nfunction gepaRunMaterial<TScenario extends Scenario, TArtifact>(\n config: GepaOptimizationMethodConfig<TScenario, TArtifact>,\n input: OptimizationMethodInput<TScenario, TArtifact>,\n parts: {\n name: string\n runtimeIdentity: Awaited<ReturnType<typeof inspectExternalOptimizerRuntime>>\n bridgeRunner: GepaOptimizationMethodConfig<TScenario, TArtifact>['runner']\n seedCandidate: ReturnType<typeof encodeExternalTextCandidate>\n trainSet: readonly ExternalOptimizationExample[]\n selectionSet: readonly ExternalOptimizationExample[]\n maxCandidateChars: number\n maxPopulationCandidates: number\n maxEvidenceChars: number\n },\n) {\n const {\n name,\n runtimeIdentity,\n bridgeRunner,\n seedCandidate,\n trainSet,\n selectionSet,\n maxCandidateChars,\n maxPopulationCandidates,\n maxEvidenceChars,\n } = parts\n return {\n optimizer: 'gepa',\n runtime: runtimeIdentity,\n method: name,\n evaluationId: config.evaluationId,\n dispatchRef: input.runOptions.dispatchRef ?? null,\n seed: input.seed,\n recipe: snapshotJson(config.recipe, 'GEPA run settings'),\n engineModules: config.engineModules ?? [],\n objective: config.objective,\n background: config.background ?? '',\n seedCandidate,\n trainSet,\n selectionSet,\n maxCandidateChars,\n maxPopulationCandidates,\n maxEvidenceChars,\n evaluationCallbackLimits: resolveExternalOptimizerCallbackLimits(\n config.evaluationCallbackLimits,\n ),\n optimizerModel: config.optimizer\n ? {\n model: config.optimizer.model,\n callRef: config.optimizer.callRef,\n budget: config.optimizer.budget,\n // Included only when enabled so pre-existing run keys keep\n // their identity.\n ...(config.optimizer.anthropicEndpoint === true ? { anthropicEndpoint: true } : {}),\n }\n : null,\n runner: externalOptimizerRunnerIdentity(bridgeRunner, 'agent_eval_rpc.gepa_bridge'),\n trustResumeState: config.trustResumeState === true,\n }\n}\n\n/** Starts the callback server the GEPA bridge calls back into: evaluations are counted against the run budget and observed into the log. */\nasync function startGepaCallback<TScenario extends Scenario, TArtifact>(\n config: GepaOptimizationMethodConfig<TScenario, TArtifact>,\n input: OptimizationMethodInput<TScenario, TArtifact>,\n parts: {\n runDir: string\n runId: string\n runBudget: ReturnType<typeof openExternalOptimizerRunBudget>\n observationLog: ReturnType<typeof openExternalOptimizerObservationLog>\n evaluationLimit: number\n maxCandidateChars: number\n maxEvidenceChars: number\n },\n) {\n const {\n runDir,\n runId,\n runBudget,\n observationLog,\n evaluationLimit,\n maxCandidateChars,\n maxEvidenceChars,\n } = parts\n const signal = input.runOptions.signal\n const scenarioById = mapExternalScenarios(\n input.trainScenarios,\n input.selectionScenarios,\n 'GEPA bridge',\n )\n const evaluate = createExternalTextEvaluator({\n input,\n label: 'GEPA bridge',\n runDir,\n compatibleRunId: runId,\n costPhase: 'gepa.external-evaluation',\n costTags: runBudget.attemptTags,\n costLedger: input.costLedger,\n scenarioById,\n maxCandidateChars,\n maxEvidenceChars,\n describeArtifact: config.describeArtifact,\n })\n let attemptEvaluationCount = 0\n return startExternalOptimizerCallback({\n token: randomBytes(32).toString('hex'),\n maxEvaluations: evaluationLimit,\n acceptEvaluation: () => {\n const accepted = runBudget.acceptEvaluation()\n if (accepted === undefined) return undefined\n attemptEvaluationCount += 1\n return attemptEvaluationCount\n },\n evaluate,\n observe: observationLog.observe,\n ...(config.evaluationCallbackLimits ? { limits: config.evaluationCallbackLimits } : {}),\n ...(signal ? { signal } : {}),\n })\n}\n\n/** The settled inputs of one GEPA run: its identity, budgets, evaluation callback and logs. */\nexport async function prepareGepaRun<TScenario extends Scenario, TArtifact>(\n config: GepaOptimizationMethodConfig<TScenario, TArtifact>,\n input: OptimizationMethodInput<TScenario, TArtifact>,\n name: string,\n) {\n const signal = input.runOptions.signal\n signal?.throwIfAborted()\n if (typeof input.baselineSurface !== 'string' && input.baselineSurface.kind !== 'components') {\n throw new Error(`${name}: GEPA bridge supports text and component surfaces`)\n }\n const expectsComponents = typeof input.baselineSurface !== 'string'\n if (expectsComponents) {\n assertGepaComponentRecipe(config.recipe, name)\n }\n\n const started = Date.now()\n const maxCandidateChars = config.maxCandidateChars ?? GEPA_DEFAULT_MAX_CANDIDATE_CHARS\n const maxEvidenceChars = config.maxEvidenceChars ?? GEPA_DEFAULT_MAX_EVIDENCE_CHARS\n const timeoutMs = config.timeoutMs ?? GEPA_DEFAULT_TIMEOUT_MS\n const storage = input.runOptions.storage ?? fsCampaignStorage()\n const runDir = `${input.runDir}/gepa`\n storage.ensureDir(runDir)\n const costLedger = input.costLedger\n const attemptId = randomBytes(16).toString('hex')\n const resume = config.resume ?? 'never'\n const bridgeRunner =\n config.optimizer && config.runner\n ? {\n ...config.runner,\n env: removeCredentialEnvironment(config.runner.env ?? {}),\n }\n : config.runner\n const runtimeIdentity = await inspectExternalOptimizerRuntime({\n label: name,\n package: 'gepa',\n module: 'agent_eval_rpc.gepa_bridge',\n engineModules: config.engineModules,\n ...(bridgeRunner ? { runner: bridgeRunner } : {}),\n timeoutMs,\n ...(signal ? { signal } : {}),\n })\n const seedCandidate = encodeExternalTextCandidate(input.baselineSurface)\n const trainSet = input.trainScenarios.map((scenario) =>\n describeExternalScenario(scenario, 'GEPA', maxEvidenceChars, config.describeScenario),\n )\n const selectionSet = input.selectionScenarios.map((scenario) =>\n describeExternalScenario(scenario, 'GEPA', maxEvidenceChars, config.describeScenario),\n )\n const evaluationLimit = gepaRecipeEvaluationLimit(config.recipe, input.selectionScenarios.length)\n const maxPopulationCandidates = Math.min(Number.MAX_SAFE_INTEGER, evaluationLimit + 1)\n const populationScenarioIds = (selectionSet.length > 0 ? selectionSet : trainSet).map(\n (scenario) => scenario.id,\n )\n const runMaterial = gepaRunMaterial(config, input, {\n name,\n runtimeIdentity,\n bridgeRunner,\n seedCandidate,\n trainSet,\n selectionSet,\n maxCandidateChars,\n maxPopulationCandidates,\n maxEvidenceChars,\n })\n const compatibleRunId = externalOptimizerCompatibleRunKey(runMaterial)\n const runId = externalOptimizerRunKey({\n material: runMaterial,\n attemptId,\n resumeEnabled: resume !== 'never' && gepaRecipeSupportsResume(config.recipe),\n })\n const runBudget = openExternalOptimizerRunBudget({\n storage,\n runDir,\n runKey: runId,\n attemptId,\n maxEvaluations: evaluationLimit,\n })\n const observationLog = openExternalOptimizerObservationLog({\n storage,\n path: `${runDir}/observations-${attemptId}.jsonl`,\n })\n const executionLog = config.optimizer\n ? openExternalOptimizerExecutionLog({\n storage,\n path: `${runDir}/model-executions-${attemptId}.jsonl`,\n })\n : undefined\n const callback = await startGepaCallback(config, input, {\n runDir,\n runId,\n runBudget,\n observationLog,\n evaluationLimit,\n maxCandidateChars,\n maxEvidenceChars,\n })\n\n return {\n signal,\n expectsComponents,\n started,\n maxCandidateChars,\n maxEvidenceChars,\n timeoutMs,\n storage,\n runDir,\n costLedger,\n attemptId,\n resume,\n bridgeRunner,\n runtimeIdentity,\n seedCandidate,\n trainSet,\n selectionSet,\n evaluationLimit,\n maxPopulationCandidates,\n populationScenarioIds,\n compatibleRunId,\n runId,\n runBudget,\n observationLog,\n executionLog,\n callback,\n name,\n config,\n input,\n }\n}\n\nexport type GepaRun<TScenario extends Scenario, TArtifact> = Awaited<\n ReturnType<typeof prepareGepaRun<TScenario, TArtifact>>\n>\n\n/** Start the optimizer model proxy when one is configured, run the GEPA bridge, and release the resources either way. */\nexport async function runBridge<TScenario extends Scenario, TArtifact>(\n ctx: GepaRun<TScenario, TArtifact>,\n) {\n const {\n signal,\n maxCandidateChars,\n maxEvidenceChars,\n timeoutMs,\n runDir,\n costLedger,\n attemptId,\n resume,\n bridgeRunner,\n runtimeIdentity,\n seedCandidate,\n trainSet,\n selectionSet,\n maxPopulationCandidates,\n compatibleRunId,\n runId,\n runBudget,\n executionLog,\n callback,\n name,\n config,\n input,\n } = ctx\n const runnerEnv = bridgeRunner?.env ?? {}\n let modelProxy: ExternalOptimizerModelProxy | undefined\n // Injected at spawn time only, after the run keys are computed, so the\n // per-run port and ephemeral token never enter run identity.\n const bridgeRunnerForSpawn = (): GepaRunnerCommand | undefined => {\n if (!modelProxy) return bridgeRunner\n const anthropicChildEnv =\n config.optimizer?.anthropicEndpoint === true && gepaRecipeHasAgentCliEngine(config.recipe)\n ? anthropicShimEnvironment(modelProxy, config.optimizer)\n : undefined\n if (!bridgeRunner && !anthropicChildEnv) return bridgeRunner\n return {\n ...(bridgeRunner ?? {}),\n env: {\n ...removeCredentialEnvironment(runnerEnv),\n ...(anthropicChildEnv ?? {}),\n },\n }\n }\n const closeResources = () =>\n closeExternalOptimizerResources({\n label: name,\n callback,\n ...(modelProxy ? { modelProxy } : {}),\n })\n const { result, outputDir } = await runWithCleanup({\n label: `${name} optimizer resources`,\n run: async () => {\n if (config.optimizer) {\n const priorOptimizerUsage = costLedger.summary({\n phase: 'gepa.optimizer-model',\n tags: runBudget.runTags,\n })\n assertPriorExternalOptimizerUsage(priorOptimizerUsage, config.optimizer.budget, name)\n modelProxy = await startExternalOptimizerModelProxy({\n call: config.optimizer.call,\n callRef: config.optimizer.callRef,\n recordExecution: executionLog!.observe,\n model: config.optimizer.model,\n budget: config.optimizer.budget,\n ...(config.optimizer.servedModelPolicy\n ? { servedModelPolicy: config.optimizer.servedModelPolicy }\n : {}),\n ...(config.optimizer.anthropicEndpoint === true ? { anthropicEndpoint: true } : {}),\n costLedger,\n phase: 'gepa.optimizer-model',\n actor: name,\n tags: { ...runBudget.attemptTags },\n initialUsage: {\n requests: priorOptimizerUsage.totalCalls,\n ...(priorOptimizerUsage.costProvenance.kind === 'uncaptured'\n ? {}\n : { costUsd: priorOptimizerUsage.totalCostUsd }),\n },\n ...(signal ? { signal } : {}),\n })\n }\n const outputDir = `${runDir}/external`\n await mkdir(outputDir, { recursive: true })\n const result = await runExternalOptimizerProcess<GepaBridgeOutput>({\n label: 'GEPA bridge',\n tempPrefix: 'agent-eval-gepa-',\n module: 'agent_eval_rpc.gepa_bridge',\n input: {\n attemptId,\n compatibleRunId,\n runId,\n runtimeIdentity,\n resume,\n trustedResumeState: config.trustResumeState === true,\n evaluationId: config.evaluationId,\n seed: input.seed,\n callbackUrl: callback.url,\n callbackToken: callback.token,\n timeoutMs,\n engineModules: config.engineModules ?? [],\n recipe: config.recipe,\n objective: config.objective,\n ...(config.background ? { background: config.background } : {}),\n seedCandidate,\n trainSet,\n selectionSet,\n maxCandidateChars,\n maxPopulationCandidates,\n maxEvidenceChars,\n outputDir,\n ...(modelProxy && config.optimizer\n ? {\n modelProxy: {\n baseUrl: modelProxy.baseUrl,\n apiKey: modelProxy.apiKey,\n model: config.optimizer.model,\n budget: config.optimizer.budget,\n ...(config.optimizer.anthropicEndpoint === true\n ? { anthropicEndpoint: true }\n : {}),\n },\n }\n : {}),\n },\n runner: bridgeRunnerForSpawn(),\n timeoutMs,\n ...(signal ? { signal } : {}),\n })\n return { result, outputDir }\n },\n cleanup: closeResources,\n })\n return { result, outputDir, modelProxy }\n}\n\n/** Check the bridge output against the run it was started for, and return the candidate population it reports. */\nexport function verifyBridgeResult<TScenario extends Scenario, TArtifact>(\n ctx: GepaRun<TScenario, TArtifact>,\n result: GepaBridgeOutput,\n): ReturnType<typeof readGepaCandidatePopulationArtifact> | null {\n const {\n signal,\n expectsComponents,\n maxCandidateChars,\n storage,\n resume,\n runtimeIdentity,\n evaluationLimit,\n maxPopulationCandidates,\n populationScenarioIds,\n compatibleRunId,\n runId,\n callback,\n name,\n config,\n } = ctx\n signal?.throwIfAborted()\n assertGepaBridgeOutput(\n result,\n name,\n maxCandidateChars,\n config.recipe.kind,\n evaluationLimit,\n maxPopulationCandidates,\n populationScenarioIds,\n expectsComponents,\n config.recipe.kind === 'engine' && config.recipe.run.engine === 'gepa',\n )\n assertExternalOptimizerRunBinding({\n label: name,\n runtime: runtimeIdentity,\n returnedSource: result.upstream,\n compatibleRunId,\n runId,\n returnedRunId: result.runId,\n resume,\n resumed: result.resumed,\n })\n if (callback.evaluations() !== result.totalEvaluations) {\n throw new Error(\n `${name}: GEPA reported ${result.totalEvaluations} evaluations but the callback received ${callback.evaluations()}`,\n )\n }\n const population = result.candidatePopulation\n ? readGepaCandidatePopulationArtifact({ summary: result.candidatePopulation, storage })\n : null\n if (population) {\n const selected = population.candidates[population.bestIndex]\n const selectedHash = contentHash({\n kind: 'external-text-candidate',\n candidate: result.bestCandidate,\n })\n if (selected?.candidateHash !== selectedHash) {\n throw new Error(`${name}: GEPA candidate population identifies a different winner`)\n }\n }\n return population\n}\n\n/** Every recipe records its search in the search ledger when one is configured. */\nexport async function recordGepaSearchHistory<TScenario extends Scenario, TArtifact>(\n ctx: GepaRun<TScenario, TArtifact>,\n result: GepaBridgeOutput,\n population: ReturnType<typeof readGepaCandidatePopulationArtifact> | null,\n): Promise<SearchHistoryReceipt | undefined> {\n const { storage, runDir, evaluationLimit, runId, observationLog, name, config, input } = ctx\n // Every recipe records its search. A composed recipe reports no\n // population, so its candidates enter with `unknown` edges, as SkillOpt's.\n const searchHistory: SearchHistoryReceipt | undefined = config.searchLedger\n ? await recordGepaSearch({\n name,\n path: config.searchLedger.path ?? `${runDir}/search-ledger.jsonl`,\n searchId: runId,\n identity: config.searchLedger.identity,\n storage,\n seed: input.seed,\n baselineSurface: input.baselineSurface,\n trainScenarios: input.trainScenarios,\n selectionScenarios: input.selectionScenarios,\n evaluationLimit,\n ...(population\n ? { population }\n : { population: null, selected: decodeExternalTextCandidate(result.bestCandidate) }),\n observations: readExternalOptimizerObservationArtifact({\n summary: observationLog.summary(),\n storage,\n }),\n generationAccounting: optimizerAccounting(result.tokenUsage, result.proposerCostUsd),\n })\n : undefined\n return searchHistory\n}\n\n/** Evaluation and optimizer-model cost, with the proxy's completeness checks. */\nexport function gepaCosts<TScenario extends Scenario, TArtifact>(\n ctx: GepaRun<TScenario, TArtifact>,\n result: GepaBridgeOutput,\n modelProxy: ExternalOptimizerModelProxy | undefined,\n) {\n const { costLedger, runtimeIdentity, runBudget, name, config } = ctx\n const evaluationCost = costFromLedgerSummary(\n costLedger.summary({\n phase: 'gepa.external-evaluation',\n tags: runBudget.runTags,\n }),\n )\n const optimizerSummary = costLedger.summary({\n phase: 'gepa.optimizer-model',\n tags: runBudget.runTags,\n })\n const optimizerReceipts = costLedger.list({\n phase: 'gepa.optimizer-model',\n tags: runBudget.runTags,\n })\n const optimizerCost = costFromLedgerSummary(optimizerSummary)\n const reportedProposerCost = result.proposerCostUsd ?? 0\n if (modelProxy) {\n modelProxy.assertExecutionComplete()\n // The bridge's httpx hooks observe exactly the reflection (OpenAI-wire)\n // traffic. Anthropic-wire calls come from the claude CLI, which cannot\n // self-report counts; their receipts are cross-checked below.\n const wires = modelProxy.wireUsage()\n assertExternalOptimizerCompletionCount(\n result.tokenUsage,\n wires.openai.requestAttempts,\n wires.openai.successfulCompletions,\n name,\n 'GEPA',\n )\n if (config.optimizer?.anthropicEndpoint === true) {\n const anthropicReceipts = costLedger.list({\n phase: 'gepa.optimizer-model',\n tags: { ...runBudget.attemptTags, wire: 'anthropic' },\n })\n if (anthropicReceipts.length !== wires.anthropic.requestAttempts) {\n throw new Error(\n `${name}: the Anthropic endpoint admitted ${wires.anthropic.requestAttempts} model calls but the ledger holds ${anthropicReceipts.length} receipts`,\n )\n }\n }\n }\n const tokenUsage = modelProxy\n ? optimizationTokenUsageFromSummary(optimizerSummary, optimizerReceipts)\n : undefined\n const runtime = observedExternalOptimizerRuntime(runtimeIdentity)\n const meteredCost = modelProxy\n ? combineComparisonCosts([\n { label: 'evaluation', cost: evaluationCost },\n { label: 'optimizer model', cost: optimizerCost },\n ])\n : undefined\n const externalTotalCostUsd = evaluationCost.totalCostUsd + reportedProposerCost\n return { evaluationCost, tokenUsage, runtime, meteredCost, externalTotalCostUsd }\n}\n\n/** The method result: the winning surface, its cost and the provenance of the run. */\nexport function buildGepaOutcome<TScenario extends Scenario, TArtifact>(\n ctx: GepaRun<TScenario, TArtifact>,\n result: GepaBridgeOutput,\n outputDir: string,\n modelProxy: ExternalOptimizerModelProxy | undefined,\n searchHistory: SearchHistoryReceipt | undefined,\n costs: ReturnType<typeof gepaCosts<TScenario, TArtifact>>,\n): OptimizationMethodResult {\n const { started, compatibleRunId, runId, runBudget, observationLog, executionLog, config } = ctx\n const { evaluationCost, tokenUsage, runtime, meteredCost, externalTotalCostUsd } = costs\n return {\n winnerSurface: decodeExternalTextCandidate(result.bestCandidate),\n ...(searchHistory ? { searchHistory } : {}),\n cost: modelProxy\n ? meteredCost!\n : {\n totalCostUsd: externalTotalCostUsd,\n costProvenance:\n result.proposerCostAccounting === 'reported' &&\n evaluationCost.costProvenance.kind !== 'uncaptured'\n ? { kind: 'estimated', usd: externalTotalCostUsd }\n : { kind: 'uncaptured', usd: null },\n accountingComplete: false,\n incompleteReasons: [\n ...evaluationCost.incompleteReasons,\n result.proposerCostAccounting === 'reported'\n ? 'GEPA proposer cost is externally reported and has no agent-eval receipt'\n : 'GEPA proposer cost is unavailable',\n ...(result.resumed\n ? ['GEPA proposer cost before this resumed attempt is unavailable']\n : []),\n ],\n },\n durationMs: Date.now() - started,\n provenance: {\n ...runtime,\n ...(config.optimizer\n ? {\n optimizerModel: config.optimizer.model,\n optimizerCallRef: config.optimizer.callRef,\n }\n : {}),\n ...(modelProxy && config.optimizer?.anthropicEndpoint === true\n ? { anthropicEndpoint: modelProxy.wireUsage().anthropic }\n : {}),\n compatibleRunId,\n runId,\n resumed: result.resumed,\n seedApplied: result.seedApplied,\n evaluationCount: runBudget.acceptedEvaluations(),\n ...(result.upstreamReportedEvaluations !== undefined\n ? { upstreamReportedEvaluations: result.upstreamReportedEvaluations }\n : {}),\n artifactDir: outputDir,\n ...(tokenUsage ? { tokenUsage } : {}),\n observations: observationLog.summary(),\n ...(result.candidatePopulation\n ? { gepaCandidatePopulation: result.candidatePopulation }\n : {}),\n ...(executionLog ? { modelExecutions: executionLog.summary() } : {}),\n },\n }\n}\n","import type {\n ExternalOptimizerCallbackLimits,\n ExternalOptimizerResumeMode,\n ExternalOptimizerRunnerCommand,\n} from './external-optimizer-process'\nimport {\n assertGepaOptimizationConfig,\n defaultGepaMethodName,\n snapshotGepaOptimizationConfig,\n} from './gepa-optimization-config'\nimport {\n buildGepaOutcome,\n gepaCosts,\n prepareGepaRun,\n recordGepaSearchHistory,\n runBridge,\n verifyBridgeResult,\n} from './gepa-optimization-run'\nimport type { OptimizationMethod } from './optimization-method'\nimport type { OpenAICompatibleOptimizerModel } from './optimizer-model'\nimport type { SearchRunIdentity } from './search-ledger-recording'\nimport type { Scenario } from './types'\n\n/** Shared settings for one bounded GEPA engine invocation. */\nexport interface GepaEngineOptions {\n /** GEPA engine name. GEPA validates names available in its Python runtime. */\n engine: string\n /** Optional billed-USD stop. Omit when the execution owner reports USD as unknown. */\n maxProposerCostUsd?: number\n /** Maximum concurrent evaluations inside this engine. Default: 1. */\n maxConcurrency?: number\n /** Stop the engine after it reaches this score. */\n stopAtScore?: number\n /** Isolate agent-based engines. Default: true. */\n sandbox?: boolean\n /**\n * JSON-safe configuration for the registered GEPA engine.\n * Python callables and class instances cannot cross the process boundary.\n */\n engineConfig?: Record<string, unknown>\n}\n\n/** One independently budgeted GEPA engine invocation. */\nexport interface GepaEngineRun extends GepaEngineOptions {\n /** Maximum callback evaluations this engine may consume. */\n maxEvaluations: number\n}\n\n/** An engine in an adaptive run. All engines share the recipe evaluation limit. */\nexport type GepaAdaptiveEngineRun = GepaEngineOptions\n\n/**\n * A direct mapping to a GEPA optimization recipe.\n *\n * GEPA owns every search and composition operation represented here. Tangle\n * supplies the candidate, data, execution callback, judges, and budgets.\n */\nexport type GepaOptimizationRecipe =\n | {\n kind: 'engine'\n run: GepaEngineRun\n }\n | {\n kind: 'sequential'\n runs: readonly GepaEngineRun[]\n }\n | {\n kind: 'adaptive-sequential'\n runs: readonly GepaAdaptiveEngineRun[]\n /** One evaluation budget shared by every adaptive stage. */\n maxEvaluations: number\n /** Switch engines after this many evaluations without improvement. */\n plateauEvaluations: number\n patience?: number\n minEvaluationsPerStage?: number\n improvementEpsilon?: number\n cycle?: boolean\n maxSwitches?: number\n maxConcurrency?: number\n }\n | {\n kind: 'best-of'\n runs: readonly GepaEngineRun[]\n maxWorkers?: number\n }\n | {\n kind: 'vote'\n runs: readonly GepaEngineRun[]\n maxWorkers?: number\n }\n | {\n kind: 'omni'\n explore: readonly GepaEngineRun[]\n continueWith: GepaEngineRun\n maxWorkers?: number\n }\n\n/** The command that runs the Python GEPA bridge. */\nexport type GepaRunnerCommand = ExternalOptimizerRunnerCommand\n\nexport interface GepaOptimizationMethodConfig<TScenario extends Scenario, TArtifact = unknown> {\n /** Unique comparison-method name. Default identifies the GEPA recipe. */\n name?: string\n /** A direct GEPA recipe. */\n recipe: GepaOptimizationRecipe\n /** Plain-language goal shown to the external optimizer. */\n objective: string\n /** Stable identity for the dispatch, judges, model settings, and scoring logic. */\n evaluationId: string\n /** Optional bounded context about the surface and task. */\n background?: string\n /**\n * Public dotted Python modules imported before GEPA resolves engine names.\n * Each module should call GEPA's official `register_engine()` API at import.\n */\n engineModules?: readonly string[]\n /** Reject external candidates longer than this. Default: 200,000 characters. */\n maxCandidateChars?: number\n /** Reject serialized score evidence longer than this. Default: 100,000 characters. */\n maxEvidenceChars?: number\n /** Candidate-evaluation callback byte limits. Omitted fields use finite defaults. */\n evaluationCallbackLimits?: Partial<ExternalOptimizerCallbackLimits>\n /** End the bridge process after this many milliseconds. Default: 30 minutes. */\n timeoutMs?: number\n /**\n * OpenAI-compatible model used by standard GEPA reflection.\n * Calls pass through Agent Eval's local model proxy. Every recipe engine must\n * be `gepa` when this is set.\n */\n optimizer?: OpenAICompatibleOptimizerModel\n /**\n * Decide what the external optimizer may read for a train or selection case.\n * The returned value must be JSON-serializable. The final comparison cases\n * are not accepted by this API and cannot be serialized here.\n */\n describeScenario?: (scenario: TScenario) => unknown\n /** Optional bounded artifact evidence returned to GEPA after each evaluation. */\n describeArtifact?: (artifact: TArtifact, scenario: TScenario) => unknown\n /** Default: `never`. Compatible runs resume only when explicitly enabled. */\n resume?: ExternalOptimizerResumeMode\n /**\n * Required for resumable direct GEPA runs because upstream state uses Python\n * pickle. Enable only for state created locally in a directory you control.\n */\n trustResumeState?: boolean\n runner?: GepaRunnerCommand\n /**\n * Record GEPA's search into a search ledger and return the bounded receipt\n * on the method result, so a comparison under `searchHistoryPolicy:\n * 'require-complete'` accepts this method. The population becomes nodes and\n * `correlated` edges, and every callback evaluation becomes a cell.\n *\n * `identity` declares the immutable revisions and the model the ledger\n * requires and the bridge does not report. `path` defaults to\n * `<runDir>/search-ledger.jsonl`.\n */\n searchLedger?: { identity: SearchRunIdentity; path?: string }\n}\n\n/**\n * Turn an optional GEPA installation into an `OptimizationMethod`.\n *\n * GEPA receives only serialized train and selection cases. The caller's final\n * test partition stays inside `compareOptimizationMethods`, which invokes this\n * method without a test-set field. The local callback routes every candidate\n * evaluation through the same dispatch and judges used by other methods.\n */\n/**\n * Environment for a bridge child that spawns `claude` CLI subprocesses.\n *\n * Both agent CLI engines start the CLI with the bridge's own environment, so\n * these variables travel bridge → engine → CLI. They merge AFTER\n * `removeCredentialEnvironment`: the ephemeral loopback token is the only\n * credential the child may see, and a caller-supplied ANTHROPIC_AUTH_TOKEN is\n * stripped like any other credential.\n */\n\nexport function gepaOptimizationMethod<TScenario extends Scenario, TArtifact>(\n config: GepaOptimizationMethodConfig<TScenario, TArtifact>,\n): OptimizationMethod<TScenario, TArtifact> {\n assertGepaOptimizationConfig(config)\n config = snapshotGepaOptimizationConfig(config)\n const name = config.name ?? defaultGepaMethodName(config.recipe)\n\n return {\n name,\n async optimize(input) {\n const ctx = await prepareGepaRun(config, input, name)\n const { result, outputDir, modelProxy } = await runBridge(ctx)\n const population = verifyBridgeResult(ctx, result)\n const searchHistory = await recordGepaSearchHistory(ctx, result, population)\n const costs = gepaCosts(ctx, result, modelProxy)\n return buildGepaOutcome(ctx, result, outputDir, modelProxy, searchHistory, costs)\n },\n }\n}\n","/** Admission checks for the shared controls of a method comparison. */\n\nimport { surfaceContentHash } from '../surface-identity'\nimport type { Scenario } from '../types'\nimport type { CompareOptimizationMethodsOptions } from './compare-optimization-methods'\n\n/** The caller-supplied judges, dispatch function and references, and the baseline surface. */\nfunction assertCallerInputs<TScenario extends Scenario, TArtifact>(\n opts: CompareOptimizationMethodsOptions<TScenario, TArtifact>,\n): void {\n if (\n opts.optimizationRunOptions &&\n 'costCeiling' in (opts.optimizationRunOptions as unknown as Record<string, unknown>)\n ) {\n throw new Error(\n 'compareOptimizationMethods: optimizationRunOptions.costCeiling is not supported; costCeiling covers optimization and final scoring',\n )\n }\n if (!opts.judges || opts.judges.length === 0) {\n throw new Error('compareOptimizationMethods: at least one judge is required')\n }\n if (typeof opts.dispatchWithSurface !== 'function') {\n throw new Error('compareOptimizationMethods: dispatchWithSurface must be a function')\n }\n if (\n opts.dispatchRef !== undefined &&\n (typeof opts.dispatchRef !== 'string' ||\n opts.dispatchRef.trim().length === 0 ||\n opts.dispatchRef.trim() !== opts.dispatchRef)\n ) {\n throw new Error(\n 'compareOptimizationMethods: dispatchRef must be trimmed and non-empty when provided',\n )\n }\n const optimizationDispatchRef = opts.optimizationRunOptions?.dispatchRef\n if (\n optimizationDispatchRef !== undefined &&\n (typeof optimizationDispatchRef !== 'string' ||\n optimizationDispatchRef.trim().length === 0 ||\n optimizationDispatchRef.trim() !== optimizationDispatchRef)\n ) {\n throw new Error(\n 'compareOptimizationMethods: optimizationRunOptions.dispatchRef must be trimmed and non-empty when provided',\n )\n }\n if (\n opts.dispatchRef !== undefined &&\n optimizationDispatchRef !== undefined &&\n opts.dispatchRef !== optimizationDispatchRef\n ) {\n throw new Error(\n 'compareOptimizationMethods: dispatchRef must match optimizationRunOptions.dispatchRef when both are provided',\n )\n }\n try {\n surfaceContentHash(opts.baselineSurface)\n } catch (cause) {\n throw new Error('compareOptimizationMethods: baselineSurface is invalid', { cause })\n }\n}\n\n/** Every judge has a unique trimmed name, a score function and uniquely keyed dimensions. */\nfunction assertJudges<TScenario extends Scenario, TArtifact>(\n opts: CompareOptimizationMethodsOptions<TScenario, TArtifact>,\n): void {\n const judgeNames = new Set<string>()\n for (const judge of opts.judges) {\n if (\n !judge ||\n typeof judge !== 'object' ||\n typeof judge.name !== 'string' ||\n judge.name.trim().length === 0 ||\n judge.name.trim() !== judge.name ||\n typeof judge.score !== 'function' ||\n !Array.isArray(judge.dimensions) ||\n judge.dimensions.length === 0\n ) {\n throw new Error(\n 'compareOptimizationMethods: every judge needs a trimmed name, at least one dimension, and score(input)',\n )\n }\n if (judgeNames.has(judge.name)) {\n throw new Error(`compareOptimizationMethods: duplicate judge name '${judge.name}'`)\n }\n judgeNames.add(judge.name)\n const dimensionKeys = new Set<string>()\n for (const dimension of judge.dimensions) {\n if (\n !dimension ||\n typeof dimension.key !== 'string' ||\n dimension.key.trim().length === 0 ||\n dimension.key.trim() !== dimension.key ||\n typeof dimension.description !== 'string' ||\n dimension.description.trim().length === 0\n ) {\n throw new Error(\n `compareOptimizationMethods: judge '${judge.name}' has an invalid dimension`,\n )\n }\n if (dimensionKeys.has(dimension.key)) {\n throw new Error(\n `compareOptimizationMethods: judge '${judge.name}' has duplicate dimension '${dimension.key}'`,\n )\n }\n dimensionKeys.add(dimension.key)\n }\n }\n}\n\n/** The run directory and the seed, resamples and confidence that fix the paired intervals. */\nfunction assertStatistics<TScenario extends Scenario, TArtifact>(\n opts: CompareOptimizationMethodsOptions<TScenario, TArtifact>,\n seed: number,\n resamples: number,\n confidence: number,\n): void {\n if (typeof opts.runDir !== 'string' || opts.runDir.trim().length === 0) {\n throw new Error('compareOptimizationMethods: runDir must be a non-empty string')\n }\n if (!Number.isSafeInteger(seed)) {\n throw new Error(`compareOptimizationMethods: seed must be a safe integer, got ${String(seed)}`)\n }\n if (!Number.isSafeInteger(resamples) || resamples <= 0 || resamples > 1_000_000) {\n throw new Error(\n `compareOptimizationMethods: resamples must be a positive safe integer no greater than 1000000, got ${String(resamples)}`,\n )\n }\n assertConfidence(confidence)\n const minimumResamples = minimumBootstrapResamples(\n confidence,\n (opts.methods.length * (opts.methods.length + 1)) / 2,\n )\n if (resamples < minimumResamples) {\n throw new Error(\n `compareOptimizationMethods: resamples must be at least ${minimumResamples} for simultaneous confidence ${confidence} across ${opts.methods.length} methods, got ${resamples}`,\n )\n }\n}\n\n/** Concurrency, timeout and cost limits. */\nfunction assertLimits<TScenario extends Scenario, TArtifact>(\n opts: CompareOptimizationMethodsOptions<TScenario, TArtifact>,\n): void {\n if (\n opts.optimizationConcurrency !== undefined &&\n (!Number.isSafeInteger(opts.optimizationConcurrency) || opts.optimizationConcurrency <= 0)\n ) {\n throw new Error(\n 'compareOptimizationMethods: optimizationConcurrency must be a positive safe integer',\n )\n }\n if (\n opts.maxConcurrency !== undefined &&\n (!Number.isSafeInteger(opts.maxConcurrency) || opts.maxConcurrency <= 0)\n ) {\n throw new Error('compareOptimizationMethods: maxConcurrency must be a positive safe integer')\n }\n if (\n opts.dispatchTimeoutMs !== undefined &&\n (!Number.isSafeInteger(opts.dispatchTimeoutMs) ||\n opts.dispatchTimeoutMs < 0 ||\n opts.dispatchTimeoutMs > 2_147_483_647)\n ) {\n throw new Error(\n 'compareOptimizationMethods: dispatchTimeoutMs must be a non-negative safe integer no greater than 2147483647',\n )\n }\n if (\n opts.costCeiling !== undefined &&\n (!Number.isFinite(opts.costCeiling) || opts.costCeiling < 0)\n ) {\n throw new Error(\n 'compareOptimizationMethods: costCeiling must be a finite number greater than or equal to 0',\n )\n }\n if (\n opts.costCeiling !== undefined &&\n opts.costLedger !== undefined &&\n opts.costLedger.costCeilingUsd !== opts.costCeiling\n ) {\n throw new Error(\n 'compareOptimizationMethods: costCeiling must match the shared CostLedger ceiling',\n )\n }\n}\n\nexport function assertComparisonControls<TScenario extends Scenario, TArtifact>(\n opts: CompareOptimizationMethodsOptions<TScenario, TArtifact>,\n seed: number,\n resamples: number,\n confidence: number,\n): void {\n assertCallerInputs(opts)\n assertJudges(opts)\n assertStatistics(opts, seed, resamples, confidence)\n assertLimits(opts)\n}\n\nexport function assertConfidence(confidence: number): void {\n if (!Number.isFinite(confidence) || confidence <= 0 || confidence >= 1) {\n throw new Error(\n `compareOptimizationMethods: confidence must be a finite number in (0,1), got ${String(confidence)}`,\n )\n }\n}\n\nexport function minimumBootstrapResamples(confidence: number, comparisonCount: number): number {\n const exact = (2 * comparisonCount) / (1 - confidence)\n return Math.ceil(exact - Number.EPSILON * Math.max(1, exact) * 32)\n}\n","/**\n * Compare optimization methods on shared train, selection, and test data.\n * Optimizers receive only train and selection data. After every optimizer\n * finishes, their selected surfaces are measured on the same untouched test\n * data and compared with paired confidence intervals.\n */\n\n/** Optimization method inputs, provenance, results, and comparison contracts. */\n\n/** Equal-budget optimization followed by final measurements and paired method comparisons. */\n\n/** Comparison admission, disjoint partitions, and isolated method/final measurement inputs. */\n\nimport { combineAbortSignals } from '../../abort-signal'\nimport { mapConcurrent } from '../../concurrency'\nimport type { CostLedgerHandle } from '../../cost-ledger'\nimport {\n type CampaignEvidenceContext,\n createCampaignEvidenceReceipt,\n} from '../../experiment/campaign-evidence'\nimport {\n defineEvaluationClaim,\n type EvaluationClaim,\n type EvaluationUnitSummary,\n summarizeEvaluationUnits,\n} from '../../experiment/claim'\nimport type { EvidenceReceipt } from '../../experiment/evidence-receipt'\nimport {\n decidePairedPromotion,\n type PairedPromotionDecision,\n} from '../../paired-promotion-decision'\nimport { meanOrZero } from '../../statistics/mean'\nimport { contentHash } from '../../verdict-cache'\nimport { assertCampaignDesign, assertCompleteCampaign } from '../coverage'\nimport {\n assertIndependentEvaluationSplit,\n captureFinalEvidencePolicy,\n evaluationUnitMap,\n exposeFinalEvidence,\n type FinalEvidencePolicy,\n type FinalEvidenceUse,\n reserveFinalEvidence,\n} from '../final-evidence'\nimport { captureJudge } from '../judge-snapshot'\nimport {\n type ComparisonCost,\n combineComparisonCosts,\n costFromLedgerSummary,\n} from '../optimization-cost'\nimport {\n executeOptimizationMethod,\n type OptimizationMethod,\n type OptimizationMethodComposition,\n type OptimizationMethodInput,\n type OptimizationMethodProvenance,\n type OptimizationMethodRunOptions,\n} from '../optimization-method'\nimport { type RunCampaignOptions, runCampaign } from '../run-campaign'\nimport { resolveRunDir } from '../run-dir'\nimport { campaignBreakdown } from '../score-utils'\nimport {\n assertSearchHistoryAdmissionOptions,\n type SearchHistoryAdmissionOptions,\n type SearchHistoryCoverage,\n} from '../search-history-receipt'\nimport { createRunCostLedger, fsCampaignStorage } from '../storage'\nimport { surfaceContentHash } from '../surface-identity'\nimport type {\n CampaignResult,\n DispatchContext,\n JudgeConfig,\n MutableSurface,\n Scenario,\n} from '../types'\nimport {\n assertComparisonControls,\n assertConfidence,\n minimumBootstrapResamples,\n} from './comparison-controls'\n\nexport interface OptimizationMethodScore {\n evidence?: { baseline: EvidenceReceipt; winner: EvidenceReceipt }\n name: string\n /** Mean final-test composite of the baseline (identical across methods). */\n baselineComposite: number\n /** Mean final-test composite of this method's selected surface. */\n winnerComposite: number\n /** Mean final-test lift across independent units (winner minus baseline). */\n lift: number\n /** Deciding interval, adjusted for every registered contrast. */\n liftCi: { low: number; high: number }\n decision: PairedPromotionDecision\n /** Search spend reconciled with recorded method calls. Excludes final test scoring. */\n optimizationCost: ComparisonCost\n /** Optimization duration reported by the method. Excludes final test scoring. */\n durationMs?: number\n /** Exact external implementation and run identity, when reported by the method. */\n provenance?: OptimizationMethodProvenance\n /** Paired final-test values used to compute lift and its interval. */\n scenarioScores: Array<{\n scenarioId: string\n baselineComposite: number\n winnerComposite: number\n lift: number\n }>\n /** Scenario means averaged within each registered source unit before inference. */\n unitScores: Array<{\n unitId: string\n scenarios: number\n baselineComposite: number\n winnerComposite: number\n lift: number\n }>\n winnerSurface: MutableSurface\n composition?: OptimizationMethodComposition\n /** 1-based, by descending lift. */\n rank: number\n}\n\nexport interface OptimizationMethodPairwise {\n /** Higher-ranked method. */\n a: string\n b: string\n /** Mean final-test delta across independent units (a − b). */\n deltaMean: number\n low: number\n high: number\n /** Favored only when the full paired decision clears the registered effect; null is inconclusive. */\n favored: string | null\n decision: PairedPromotionDecision\n}\n\nexport interface OptimizationMethodComparison {\n claim?: EvaluationClaim\n finalEvidence?: FinalEvidenceUse\n /** Sorted by descending lift; `rank` set accordingly. */\n scores: OptimizationMethodScore[]\n best: OptimizationMethodScore\n /** Best observed method versus each alternative, with simultaneous paired decisions. */\n pairwise: OptimizationMethodPairwise[]\n testScenarioIds: string[]\n units: EvaluationUnitSummary\n observationUnit: 'scenario' | 'registered'\n /** Complete scenario-replicate pairs per contrast, before unit aggregation. */\n pairedCellN: number\n /** Sum of method reports reconciled against each method's recorded calls. */\n optimizationCost: ComparisonCost\n /** Baseline and distinct winner scoring on the final test partition. */\n testCost: ComparisonCost\n /** Optimization plus final test scoring. */\n totalCost: ComparisonCost\n /** Caller-requested simultaneous coverage across all reported contrasts. */\n confidence: number\n /** Bonferroni-adjusted confidence used for each bootstrap interval. */\n intervalConfidence: number\n /** Method-vs-baseline plus all possible method-vs-method contrasts. */\n comparisonCount: number\n /** Deterministic bootstrap and campaign seed. */\n seed: number\n /** Bootstrap draws used for each interval. */\n resamples: number\n /** Agent runs averaged within each test scenario before resampling scenarios. */\n reps: number\n /** Coverage of every method's canonical search history. */\n searchHistory: SearchHistoryCoverage\n}\n\nexport interface CompareOptimizationMethodsOptions<TScenario extends Scenario, TArtifact>\n extends Omit<RunCampaignOptions<TScenario, TArtifact>, 'dispatch' | 'judges' | 'scenarios'>,\n SearchHistoryAdmissionOptions {\n /** Explicit caller authority and environment for receipts over actual final measurements. */\n evidence?: CampaignEvidenceContext\n claim?: EvaluationClaim\n finalEvidence?: FinalEvidencePolicy\n methods: OptimizationMethod<TScenario, TArtifact>[]\n baselineSurface: MutableSurface\n /** Evidence used by every optimizer to author or fit candidates. */\n trainScenarios: TScenario[]\n /** Candidate acceptance, early-stopping, and optimizer-selection data. */\n selectionScenarios: TScenario[]\n /** Untouched final comparison data. Never passed to an optimization method. */\n testScenarios: TScenario[]\n /** Scores a surface on a scenario. The methods and final test share this function. */\n dispatchWithSurface: (\n surface: MutableSurface,\n scenario: TScenario,\n ctx: DispatchContext,\n ) => Promise<TArtifact>\n judges: JudgeConfig<TArtifact, TScenario>[]\n /** Bootstrap resamples for the lift intervals. Default is at least 2000 and\n * rises when the requested simultaneous confidence needs finer tails. */\n resamples?: number\n /** Shared defaults for each method's train and selection campaigns. */\n optimizationRunOptions?: OptimizationMethodRunOptions<TScenario, TArtifact>\n /** Number of optimization methods to run concurrently. Default 1. */\n optimizationConcurrency?: number\n /** Simultaneous confidence across method-vs-baseline and method-vs-method contrasts.\n * Each bootstrap interval is Bonferroni-adjusted. Default 0.95. */\n confidence?: number\n /** Shared spend limit across every method's optimizer and evaluation calls plus final scoring. */\n costCeiling?: number\n}\n\n/**\n * Compare complete optimization methods on disjoint train, selection, and final test data.\n */\nexport async function compareOptimizationMethods<TScenario extends Scenario, TArtifact>(\n rawOpts: CompareOptimizationMethodsOptions<TScenario, TArtifact>,\n): Promise<OptimizationMethodComparison> {\n const s0 = normalizeComparisonOptions({ rawOpts })\n const s1 = await finalTestScoring(s0)\n const s2 = await optimizeAllMethods(s1)\n const s3 = await reserveTestMeasurement(s2)\n const s4 = await measureWinners(s3)\n const s5 = scoreMethods(s4)\n const s6 = pairwiseAgainstBest(s5)\n return comparisonResult(s6)\n}\n\n/** The captured options, the derived statistics settings, the run directory and the cost ledger. */\nfunction normalizeComparisonOptions<TScenario extends Scenario, TArtifact>(prev: {\n rawOpts: CompareOptimizationMethodsOptions<TScenario, TArtifact>\n}) {\n const { rawOpts } = prev\n const opts = {\n ...rawOpts,\n methods: rawOpts.methods.map((method) => ({ ...method })),\n trainScenarios: structuredClone(rawOpts.trainScenarios),\n selectionScenarios: structuredClone(rawOpts.selectionScenarios),\n testScenarios: structuredClone(rawOpts.testScenarios),\n judges: rawOpts.judges.map(captureJudge),\n claim: rawOpts.claim && defineEvaluationClaim(rawOpts.claim),\n finalEvidence: rawOpts.finalEvidence && captureFinalEvidencePolicy(rawOpts.finalEvidence),\n }\n assertOptimizationMethods(opts.methods)\n assertComparisonPartitions(opts)\n const searchHistoryPolicy = opts.searchHistoryPolicy ?? 'allow-missing'\n assertSearchHistoryAdmissionOptions(opts)\n const seed = opts.seed ?? 42\n const confidence = opts.confidence ?? 0.95\n assertConfidence(confidence)\n const optimizationConcurrency = opts.optimizationConcurrency ?? 1\n const comparisonCount = (opts.methods.length * (opts.methods.length + 1)) / 2\n const intervalConfidence = 1 - (1 - confidence) / comparisonCount\n const minimumResamples = minimumBootstrapResamples(confidence, comparisonCount)\n const resamples = opts.resamples ?? Math.max(2000, minimumResamples)\n assertComparisonControls(opts, seed, resamples, confidence)\n const evidence = opts.evidence === undefined ? undefined : structuredClone(opts.evidence)\n const evidenceBySurface = new Map<string, EvidenceReceipt>()\n const storage = opts.storage ?? fsCampaignStorage()\n const resolvedRunDir = resolveRunDir(opts.runDir, opts.repo)\n const baselineSurface = structuredClone(opts.baselineSurface)\n const costLedger =\n opts.costLedger ??\n createRunCostLedger({\n storage,\n runDir: `${resolvedRunDir}/cost`,\n costCeilingUsd: opts.costCeiling,\n })\n\n return {\n ...prev,\n opts,\n searchHistoryPolicy,\n seed,\n confidence,\n optimizationConcurrency,\n comparisonCount,\n intervalConfidence,\n minimumResamples,\n resamples,\n evidence,\n evidenceBySurface,\n storage,\n resolvedRunDir,\n baselineSurface,\n costLedger,\n }\n}\n\n/** Scoring a surface on the final test set, and aligning the scores to the designed scenarios. */\nasync function finalTestScoring<TScenario extends Scenario, TArtifact>(\n prev: Awaited<ReturnType<typeof normalizeComparisonOptions<TScenario, TArtifact>>>,\n) {\n const {\n opts,\n seed,\n intervalConfidence,\n resamples,\n evidence,\n evidenceBySurface,\n storage,\n resolvedRunDir,\n costLedger,\n } = prev\n const scoreOnTest = async (\n surface: MutableSurface,\n tag: string,\n costPhase: string,\n ): Promise<Record<string, number>> => {\n const measuredSurface = structuredClone(surface)\n const campaign: CampaignResult<TArtifact, TScenario> = await runCampaign<TScenario, TArtifact>({\n ...opts,\n storage,\n costLedger,\n costPhase,\n scenarios: opts.testScenarios.map((scenario) => structuredClone(scenario)),\n dispatch: (scenario, ctx) =>\n opts.dispatchWithSurface(structuredClone(measuredSurface), scenario, ctx),\n dispatchRef: `compareOptimizationMethods:${callerDispatchRef(opts)}:${surfaceContentHash(measuredSurface)}`,\n runDir: `${resolvedRunDir}/${tag}`,\n })\n assertCompleteCampaign(\n campaign,\n opts.testScenarios,\n opts.reps ?? 1,\n true,\n `compareOptimizationMethods: ${tag} final comparison`,\n )\n if (evidence)\n evidenceBySurface.set(\n surfaceContentHash(measuredSurface),\n createCampaignEvidenceReceipt({ campaign, surface: measuredSurface, context: evidence }),\n )\n const byScenario: Record<string, number> = {}\n for (const { scenarioId, composite } of campaignBreakdown(campaign).scenarios) {\n byScenario[scenarioId] = composite\n }\n return byScenario\n }\n\n // Every surface must have a score for every designed test scenario. Filling a\n // missing score with zero would change the comparison instead of reporting a failed run.\n const scenarioIds = opts.testScenarios.map((s) => s.id).sort()\n const unitByScenario = opts.claim\n ? evaluationUnitMap(opts.claim, opts.testScenarios)\n : new Map(scenarioIds.map((id) => [id, id]))\n const units: EvaluationUnitSummary = opts.claim\n ? summarizeEvaluationUnits(opts.claim, opts.testScenarios)\n : {\n observations: scenarioIds.length,\n independentUnits: scenarioIds.length,\n units: scenarioIds.map((id) => ({ id, observations: 1 })),\n }\n const aggregateUnits = (arr: number[]): number[] => {\n const values = new Map<string, number[]>()\n scenarioIds.forEach((id, index) => {\n const unitId = unitByScenario.get(id)!\n const bucket = values.get(unitId) ?? []\n bucket.push(arr[index]!)\n values.set(unitId, bucket)\n })\n return units.units.map((unit) => meanOrZero(values.get(unit.id)!))\n }\n const decisionOptions = {\n seed,\n resamples,\n confidence: intervalConfidence,\n threshold: opts.claim?.minimumEffect ?? 0,\n }\n const align = (byScenario: Record<string, number>, label: string): number[] => {\n const missing = scenarioIds.filter((id) => !(id in byScenario))\n if (missing.length > 0) {\n throw new Error(\n `compareOptimizationMethods: ${label} produced no test score for scenario(s) [${missing.join(\n ', ',\n )}]. A cell failed or its judges returned nothing. Fix the dispatch or judge; the comparison will not replace missing scores with zero.`,\n )\n }\n return scenarioIds.map((id) => byScenario[id]!)\n }\n\n return {\n ...prev,\n scoreOnTest,\n scenarioIds,\n unitByScenario,\n units,\n aggregateUnits,\n decisionOptions,\n align,\n }\n}\n\n/** Reserve final evidence, then finish every method before the first final-test call. */\nasync function optimizeAllMethods<TScenario extends Scenario, TArtifact>(\n prev: Awaited<ReturnType<typeof finalTestScoring<TScenario, TArtifact>>>,\n) {\n const {\n opts,\n seed,\n optimizationConcurrency,\n storage,\n resolvedRunDir,\n baselineSurface,\n costLedger,\n } = prev\n // Finish every method before the first final-test call. Each method gets\n // independent scenario values so one method cannot mutate another's input.\n if (opts.claim?.generalization === 'new-units') {\n assertIndependentEvaluationSplit(opts.claim, opts.testScenarios, [\n ...opts.trainScenarios,\n ...opts.selectionScenarios,\n ])\n }\n if (opts.finalEvidence) {\n await reserveFinalEvidence(opts.finalEvidence, opts.claim, opts.testScenarios, [\n ...opts.trainScenarios,\n ...opts.selectionScenarios,\n ])\n }\n const optimizationOwner = new AbortController()\n const optimized = await mapConcurrent(opts.methods, optimizationConcurrency, async (method) => {\n try {\n const {\n selected: out,\n cost,\n history: searchHistoryCoverage,\n } = await executeOptimizationMethod({\n method,\n input: createOptimizationMethodInput(\n opts,\n method.name,\n resolvedRunDir,\n seed,\n baselineSurface,\n costLedger,\n optimizationOwner.signal,\n ),\n storage,\n searchHistoryPolicy: opts.searchHistoryPolicy,\n searchHistoryVerification: opts.searchHistoryVerification,\n })\n const winnerSurface = out.winnerSurface\n return {\n name: method.name,\n winnerSurface,\n cost,\n ...(out.durationMs === undefined ? {} : { durationMs: out.durationMs }),\n ...(out.composition === undefined ? {} : { composition: out.composition }),\n ...(out.provenance === undefined ? {} : { provenance: out.provenance }),\n searchHistoryCoverage,\n }\n } catch (error) {\n if (!optimizationOwner.signal.aborted) optimizationOwner.abort(error)\n throw error\n }\n })\n assertReportedCostWithinCeiling(\n combineComparisonCosts(\n optimized.map((result) => ({\n label: `method '${result.name}'`,\n cost: result.cost,\n })),\n ).totalCostUsd,\n opts.costCeiling,\n 'optimization',\n )\n return { ...prev, optimizationOwner, optimized }\n}\n\n/** The identity of the final test and the exposure of its evidence. */\nasync function reserveTestMeasurement<TScenario extends Scenario, TArtifact>(\n prev: Awaited<ReturnType<typeof optimizeAllMethods<TScenario, TArtifact>>>,\n) {\n const { opts, seed, baselineSurface, optimized } = prev\n const testCostIdentity = contentHash({\n baseline: surfaceContentHash(baselineSurface),\n winners: optimized.map((winner) => ({\n name: winner.name,\n surface: surfaceContentHash(winner.winnerSurface),\n })),\n testScenarios: opts.testScenarios,\n judges: opts.judges.map((judge) => ({\n name: judge.name,\n dimensions: judge.dimensions,\n version:\n judge.judgeVersion ??\n contentHash({\n score: judge.score.toString(),\n appliesTo: judge.appliesTo?.toString() ?? null,\n }),\n })),\n dispatch: callerDispatchRef(opts),\n seed,\n reps: opts.reps ?? 1,\n })\n const testCostPhase = `compareOptimizationMethods.test:${testCostIdentity}`\n const finalEvidence = opts.finalEvidence\n ? await exposeFinalEvidence(opts.finalEvidence, opts.claim, opts.testScenarios, [\n baselineSurface,\n ...optimized.map((method) => method.winnerSurface),\n ])\n : undefined\n return { ...prev, testCostIdentity, testCostPhase, finalEvidence }\n}\n\n/** One final-test measurement per distinct surface. */\nasync function measureWinners<TScenario extends Scenario, TArtifact>(\n prev: Awaited<ReturnType<typeof reserveTestMeasurement<TScenario, TArtifact>>>,\n) {\n const { baselineSurface, scoreOnTest, align, optimized, testCostPhase } = prev\n // Reuse one final-test measurement for identical surfaces. This avoids duplicate\n // spend and prevents model variance from inventing a difference between equal inputs.\n const baselineArr = align(\n await scoreOnTest(baselineSurface, 'test/baseline', testCostPhase),\n 'baseline',\n )\n const testScoresBySurface = new Map([[surfaceContentHash(baselineSurface), baselineArr]])\n const winners: Array<(typeof optimized)[number] & { arr: number[] }> = []\n for (const winner of optimized) {\n const surfaceKey = surfaceContentHash(winner.winnerSurface)\n let arr = testScoresBySurface.get(surfaceKey)\n if (!arr) {\n const byScenario = await scoreOnTest(\n winner.winnerSurface,\n `test/methods/${slug(winner.name)}`,\n testCostPhase,\n )\n arr = align(byScenario, `method \"${winner.name}\"`)\n testScoresBySurface.set(surfaceKey, arr)\n }\n winners.push({\n ...winner,\n arr,\n })\n }\n\n return { ...prev, baselineArr, testScoresBySurface, winners }\n}\n\n/** Per-method scores, ranked by lift with cost breaking complete ties. */\nfunction scoreMethods<TScenario extends Scenario, TArtifact>(\n prev: Awaited<ReturnType<typeof measureWinners<TScenario, TArtifact>>>,\n) {\n const {\n evidence,\n evidenceBySurface,\n baselineSurface,\n scenarioIds,\n units,\n aggregateUnits,\n decisionOptions,\n baselineArr,\n winners,\n } = prev\n const scores: OptimizationMethodScore[] = winners.map((w) => {\n const baselineUnits = aggregateUnits(baselineArr)\n const winnerUnits = aggregateUnits(w.arr)\n const decision = decidePairedPromotion(baselineUnits, winnerUnits, decisionOptions)\n const score: OptimizationMethodScore = {\n name: w.name,\n baselineComposite: meanOrZero(baselineUnits),\n winnerComposite: meanOrZero(winnerUnits),\n lift: decision.delta,\n liftCi: { low: decision.low, high: decision.high },\n decision,\n optimizationCost: w.cost,\n scenarioScores: scenarioIds.map((scenarioId, index) => ({\n scenarioId,\n baselineComposite: baselineArr[index]!,\n winnerComposite: w.arr[index]!,\n lift: w.arr[index]! - baselineArr[index]!,\n })),\n unitScores: units.units.map((unit, index) => ({\n unitId: unit.id,\n scenarios: unit.observations,\n baselineComposite: baselineUnits[index]!,\n winnerComposite: winnerUnits[index]!,\n lift: winnerUnits[index]! - baselineUnits[index]!,\n })),\n winnerSurface: structuredClone(w.winnerSurface),\n rank: 0,\n }\n if (evidence) {\n const baseline = evidenceBySurface.get(surfaceContentHash(baselineSurface))\n const winner = evidenceBySurface.get(surfaceContentHash(w.winnerSurface))\n if (!baseline || !winner) throw new Error('final measurement evidence is missing')\n score.evidence = { baseline, winner }\n }\n if (w.composition !== undefined) score.composition = structuredClone(w.composition)\n if (w.durationMs !== undefined) score.durationMs = w.durationMs\n if (w.provenance !== undefined) score.provenance = structuredClone(w.provenance)\n return score\n })\n scores.sort((a, b) => b.lift - a.lift)\n // Cost orders an equal-lift group only when every method in that group has\n // complete accounting. Otherwise declaration order remains deterministic.\n for (let start = 0; start < scores.length; ) {\n let end = start + 1\n while (end < scores.length && scores[end]!.lift === scores[start]!.lift) end += 1\n const tied = scores.slice(start, end)\n if (tied.every((score) => score.optimizationCost.accountingComplete)) {\n tied.sort((a, b) => a.optimizationCost.totalCostUsd - b.optimizationCost.totalCostUsd)\n scores.splice(start, tied.length, ...tied)\n }\n start = end\n }\n scores.forEach((s, i) => {\n s.rank = i + 1\n })\n const best = scores[0]!\n\n return { ...prev, scores, best }\n}\n\n/** The best method against every other, in both directions. */\nfunction pairwiseAgainstBest<TScenario extends Scenario, TArtifact>(\n prev: Awaited<ReturnType<typeof scoreMethods<TScenario, TArtifact>>>,\n) {\n const { aggregateUnits, decisionOptions, winners, scores, best } = prev\n const byName = new Map(winners.map((w) => [w.name, w]))\n const bestArr = aggregateUnits(byName.get(best.name)!.arr)\n const pairwise: OptimizationMethodPairwise[] = scores.slice(1).map((other) => {\n const otherArr = aggregateUnits(byName.get(other.name)!.arr)\n // before = other, after = best ⇒ delta = best − other on the test set.\n const decision = decidePairedPromotion(otherArr, bestArr, decisionOptions)\n const reverse = decidePairedPromotion(bestArr, otherArr, decisionOptions)\n const favored = decision.promote ? best.name : reverse.promote ? other.name : null\n return {\n a: best.name,\n b: other.name,\n deltaMean: decision.delta,\n low: decision.low,\n high: decision.high,\n favored,\n decision,\n }\n })\n\n return { ...prev, byName, bestArr, pairwise }\n}\n\n/** Total cost against the ceiling, then the comparison record. */\nfunction comparisonResult<TScenario extends Scenario, TArtifact>(\n prev: Awaited<ReturnType<typeof pairwiseAgainstBest<TScenario, TArtifact>>>,\n): OptimizationMethodComparison {\n const {\n opts,\n searchHistoryPolicy,\n seed,\n confidence,\n comparisonCount,\n intervalConfidence,\n resamples,\n costLedger,\n scenarioIds,\n units,\n optimized,\n testCostPhase,\n finalEvidence,\n scores,\n best,\n pairwise,\n } = prev\n const optimizationCost = combineComparisonCosts(\n scores.map((score) => ({ label: `method '${score.name}'`, cost: score.optimizationCost })),\n )\n const testCost = costFromLedgerSummary(costLedger.summary({ phase: testCostPhase }))\n const totalCost = combineComparisonCosts([\n { label: 'optimization', cost: optimizationCost },\n { label: 'final test', cost: testCost },\n ])\n assertReportedCostWithinCeiling(totalCost.totalCostUsd, opts.costCeiling, 'total')\n return {\n scores,\n best,\n pairwise,\n testScenarioIds: scenarioIds,\n units,\n observationUnit: opts.claim ? 'registered' : 'scenario',\n pairedCellN: scenarioIds.length * (opts.reps ?? 1),\n ...(opts.claim ? { claim: opts.claim } : {}),\n ...(finalEvidence ? { finalEvidence } : {}),\n optimizationCost,\n testCost,\n totalCost,\n confidence,\n intervalConfidence,\n comparisonCount,\n seed,\n resamples,\n reps: opts.reps ?? 1,\n searchHistory: Object.freeze({\n policy: searchHistoryPolicy,\n allComplete: optimized.every((result) => result.searchHistoryCoverage.status === 'complete'),\n producers: Object.freeze(optimized.map((result) => result.searchHistoryCoverage)),\n }),\n }\n}\n\nfunction assertReportedCostWithinCeiling(\n totalCostUsd: number,\n costCeiling: number | undefined,\n phase: 'optimization' | 'total',\n): void {\n const tolerance =\n Number.EPSILON * Math.max(1, Math.abs(totalCostUsd), Math.abs(costCeiling ?? 0)) * 8\n if (costCeiling !== undefined && totalCostUsd > costCeiling + tolerance) {\n throw new Error(\n `compareOptimizationMethods: reported ${phase} cost ${totalCostUsd} exceeds costCeiling ${costCeiling}`,\n )\n }\n}\n\nfunction assertOptimizationMethods<TScenario extends Scenario, TArtifact>(\n methods: readonly OptimizationMethod<TScenario, TArtifact>[],\n): void {\n if (!Array.isArray(methods) || methods.length === 0) {\n throw new Error('compareOptimizationMethods: no methods to compare')\n }\n const names = new Set<string>()\n const pathOwners = new Map<string, string>()\n for (const method of methods) {\n if (!method || typeof method !== 'object' || typeof method.optimize !== 'function') {\n throw new Error('compareOptimizationMethods: every method must provide optimize(input)')\n }\n if (!method.name || method.name.trim() !== method.name) {\n throw new Error('compareOptimizationMethods: method names must be trimmed and non-empty')\n }\n if (names.has(method.name)) {\n throw new Error(`compareOptimizationMethods: duplicate method name '${method.name}'`)\n }\n names.add(method.name)\n const pathKey = slug(method.name)\n const prior = pathOwners.get(pathKey)\n if (prior) {\n throw new Error(\n `compareOptimizationMethods: method names '${prior}' and '${method.name}' map to the same run path '${pathKey}'`,\n )\n }\n pathOwners.set(pathKey, method.name)\n }\n}\n\nfunction assertComparisonPartitions<TScenario extends Scenario, TArtifact>(\n opts: CompareOptimizationMethodsOptions<TScenario, TArtifact>,\n): void {\n const partitions: Array<{\n name: 'trainScenarios' | 'selectionScenarios' | 'testScenarios'\n scenarios: TScenario[] | undefined\n }> = [\n { name: 'trainScenarios', scenarios: opts.trainScenarios },\n { name: 'selectionScenarios', scenarios: opts.selectionScenarios },\n { name: 'testScenarios', scenarios: opts.testScenarios },\n ]\n\n const owner = new Map<string, string>()\n for (const partition of partitions) {\n if (!Array.isArray(partition.scenarios) || partition.scenarios.length === 0) {\n throw new Error(`compareOptimizationMethods: ${partition.name} is empty`)\n }\n if (partition.name === 'testScenarios' && partition.scenarios.length < 2) {\n throw new Error(\n 'compareOptimizationMethods: testScenarios requires at least 2 scenarios to estimate uncertainty',\n )\n }\n const local = new Set<string>()\n const duplicates = new Set<string>()\n const overlaps = new Map<string, string>()\n for (const scenario of partition.scenarios) {\n if (local.has(scenario.id)) duplicates.add(scenario.id)\n local.add(scenario.id)\n const prior = owner.get(scenario.id)\n if (prior !== undefined && prior !== partition.name) overlaps.set(scenario.id, prior)\n }\n if (duplicates.size > 0) {\n throw new Error(\n `compareOptimizationMethods: ${partition.name} contains duplicate scenario id(s) [${[\n ...duplicates,\n ].join(', ')}]`,\n )\n }\n if (overlaps.size > 0) {\n const detail = [...overlaps]\n .map(([id, prior]) => `${id} (${prior} ∩ ${partition.name})`)\n .join(', ')\n throw new Error(\n `compareOptimizationMethods: trainScenarios, selectionScenarios, and testScenarios must be pairwise disjoint; overlap: [${detail}]`,\n )\n }\n assertCampaignDesign(partition.scenarios, opts.reps ?? 1)\n for (const id of local) owner.set(id, partition.name)\n }\n}\n\nfunction slug(name: string): string {\n return (\n name\n .replace(/[^a-z0-9]+/gi, '-')\n .replace(/^-|-$/g, '')\n .toLowerCase() || 'method'\n )\n}\n\nfunction createOptimizationMethodInput<TScenario extends Scenario, TArtifact>(\n opts: CompareOptimizationMethodsOptions<TScenario, TArtifact>,\n methodName: string,\n resolvedRunDir: string,\n seed: number,\n baselineSurface: MutableSurface,\n costLedger: CostLedgerHandle,\n optimizationSignal: AbortSignal,\n): OptimizationMethodInput<TScenario, TArtifact> {\n const methodRunDir = `${resolvedRunDir}/optimization/${slug(methodName)}`\n const signal = combineAbortSignals(\n opts.signal,\n opts.optimizationRunOptions?.signal,\n optimizationSignal,\n )\n return Object.freeze({\n baselineSurface: structuredClone(baselineSurface),\n trainScenarios: opts.trainScenarios,\n selectionScenarios: opts.selectionScenarios,\n dispatchWithSurface: opts.dispatchWithSurface,\n judges: opts.judges,\n runDir: methodRunDir,\n seed,\n runOptions: Object.freeze({\n ...(opts.optimizationRunOptions ?? {}),\n ...(opts.optimizationRunOptions?.dispatchRef === undefined && opts.dispatchRef !== undefined\n ? { dispatchRef: opts.dispatchRef }\n : {}),\n ...(signal ? { signal } : {}),\n }),\n costLedger,\n })\n}\n\nfunction callerDispatchRef<TScenario extends Scenario, TArtifact>(\n opts: CompareOptimizationMethodsOptions<TScenario, TArtifact>,\n): string {\n return (opts.dispatchRef ?? opts.dispatchWithSurface.name) || 'anonymous'\n}\n","import {\n assertJsonValue,\n assertNoCredentialValues,\n resolveExternalOptimizerCallbackLimits,\n} from './external-optimizer-process'\nimport { snapshotExternalOptimizerRunner } from './external-optimizer-run-config'\nimport { assertOptimizerModel, snapshotOptimizerModel } from './optimizer-model'\nimport type { SkillOptOptimizationMethodConfig } from './skillopt-optimization-method'\nimport type { Scenario } from './types'\n\nexport const SKILLOPT_DEFAULT_MAX_CANDIDATE_CHARS = 200_000\nexport const SKILLOPT_DEFAULT_MAX_EVIDENCE_CHARS = 100_000\nexport const SKILLOPT_DEFAULT_TIMEOUT_MS = 60 * 60 * 1000\n\nconst MAX_TIMER_DELAY_MS = 2_147_483_647\n\nexport function snapshotSkillOptOptimizationConfig<TScenario extends Scenario, TArtifact>(\n config: SkillOptOptimizationMethodConfig<TScenario, TArtifact>,\n): SkillOptOptimizationMethodConfig<TScenario, TArtifact> {\n const runner = snapshotExternalOptimizerRunner(config.runner)\n return {\n ...config,\n trainer: structuredClone(config.trainer),\n optimizer: snapshotOptimizerModel(config.optimizer),\n ...(config.evaluationCallbackLimits\n ? { evaluationCallbackLimits: { ...config.evaluationCallbackLimits } }\n : {}),\n ...(runner ? { runner } : {}),\n }\n}\n\nexport function assertSkillOptOptimizationConfig<TScenario extends Scenario, TArtifact>(\n config: SkillOptOptimizationMethodConfig<TScenario, TArtifact>,\n): void {\n if (!config.trainer || typeof config.trainer !== 'object') {\n throw new Error('skillOptOptimizationMethod: trainer is required')\n }\n if (\n config.name !== undefined &&\n (typeof config.name !== 'string' || !config.name.trim() || config.name.trim() !== config.name)\n ) {\n throw new Error('skillOptOptimizationMethod: name must be trimmed and non-empty')\n }\n if (\n config.background !== undefined &&\n (typeof config.background !== 'string' ||\n !config.background.trim() ||\n config.background.trim() !== config.background)\n ) {\n throw new Error('skillOptOptimizationMethod: background must be trimmed and non-empty')\n }\n for (const [label, value] of [\n ['objective', config.objective],\n ['evaluationId', config.evaluationId],\n ] as const) {\n if (typeof value !== 'string' || !value.trim() || value.trim() !== value) {\n throw new Error(`skillOptOptimizationMethod: ${label} must be trimmed and non-empty`)\n }\n }\n assertPositiveSafeInteger(config.trainer.epochs, 'trainer.epochs')\n assertPositiveSafeInteger(config.trainer.batchSize, 'trainer.batchSize')\n assertPositiveSafeInteger(config.maxEvaluations, 'maxEvaluations')\n for (const [label, value] of [\n ['trainer.accumulation', config.trainer.accumulation],\n ['trainer.editBudget', config.trainer.editBudget],\n ['trainer.minEditBudget', config.trainer.minEditBudget],\n ['trainer.analystWorkers', config.trainer.analystWorkers],\n ['trainer.minibatchSize', config.trainer.minibatchSize],\n ['trainer.mergeBatchSize', config.trainer.mergeBatchSize],\n ['trainer.maxAnalystRounds', config.trainer.maxAnalystRounds],\n ['trainer.evaluationWorkers', config.trainer.evaluationWorkers],\n ['maxCandidateChars', config.maxCandidateChars],\n ['maxEvidenceChars', config.maxEvidenceChars],\n ['timeoutMs', config.timeoutMs],\n ] as const) {\n if (value !== undefined) assertPositiveSafeInteger(value, label)\n }\n if (config.timeoutMs !== undefined && config.timeoutMs > MAX_TIMER_DELAY_MS) {\n throw new Error(`skillOptOptimizationMethod: timeoutMs must not exceed ${MAX_TIMER_DELAY_MS}`)\n }\n if (\n config.trainer.minEditBudget !== undefined &&\n config.trainer.editBudget !== undefined &&\n config.trainer.minEditBudget > config.trainer.editBudget\n ) {\n throw new Error(\n 'skillOptOptimizationMethod: trainer.minEditBudget must not exceed trainer.editBudget',\n )\n }\n assertOptionalEnum(\n config.trainer.learningRateSchedule,\n ['constant', 'linear', 'cosine', 'autonomous'],\n 'trainer.learningRateSchedule',\n )\n assertOptionalEnum(\n config.trainer.learningRateControl,\n ['fixed', 'autonomous', 'none'],\n 'trainer.learningRateControl',\n )\n assertOptionalEnum(\n config.trainer.updateMode,\n ['patch', 'rewrite_from_suggestions', 'full_rewrite_minibatch'],\n 'trainer.updateMode',\n )\n for (const [label, value] of [\n ['trainer.failureOnly', config.trainer.failureOnly],\n ['trainer.useSlowUpdate', config.trainer.useSlowUpdate],\n ['trainer.useMetaSkill', config.trainer.useMetaSkill],\n ] as const) {\n if (value !== undefined && typeof value !== 'boolean') {\n throw new Error(`skillOptOptimizationMethod: ${label} must be a boolean`)\n }\n }\n if (\n config.hardScoreThreshold !== undefined &&\n (!Number.isFinite(config.hardScoreThreshold) ||\n config.hardScoreThreshold < 0 ||\n config.hardScoreThreshold > 1)\n ) {\n throw new Error('skillOptOptimizationMethod: hardScoreThreshold must be in [0, 1]')\n }\n if (\n config.resume !== undefined &&\n config.resume !== 'never' &&\n config.resume !== 'if-compatible' &&\n config.resume !== 'required'\n ) {\n throw new Error(\n \"skillOptOptimizationMethod: resume must be 'never', 'if-compatible', or 'required'\",\n )\n }\n assertJsonValue(config.trainer.overrides ?? {}, 'skillOptOptimizationMethod: trainer.overrides')\n assertNoCredentialValues(\n config.trainer.overrides ?? {},\n 'skillOptOptimizationMethod: trainer.overrides',\n 'optimizer',\n )\n assertOptimizerModel(config.optimizer, 'skillOptOptimizationMethod: optimizer')\n resolveExternalOptimizerCallbackLimits(\n config.evaluationCallbackLimits,\n 'skillOptOptimizationMethod: evaluationCallbackLimits',\n )\n const evidenceLimit = config.maxEvidenceChars ?? SKILLOPT_DEFAULT_MAX_EVIDENCE_CHARS\n if (\n JSON.stringify(config.objective).length > evidenceLimit ||\n JSON.stringify(config.background ?? '').length > evidenceLimit\n ) {\n throw new Error(\n 'skillOptOptimizationMethod: objective and background must each fit maxEvidenceChars',\n )\n }\n}\n\nfunction assertPositiveSafeInteger(value: number, label: string): void {\n if (!Number.isSafeInteger(value) || value <= 0) {\n throw new Error(`skillOptOptimizationMethod: ${label} must be a positive safe integer`)\n }\n}\n\nfunction assertOptionalEnum<T extends string>(\n value: T | undefined,\n allowed: readonly T[],\n label: string,\n): void {\n if (value !== undefined && !allowed.includes(value)) {\n throw new Error(`skillOptOptimizationMethod: ${label} must be one of ${allowed.join(', ')}`)\n }\n}\n","import type { ExternalOptimizerTokenUsage } from './external-optimizer-accounting'\nimport { assertExternalOptimizerTokenUsage } from './external-optimizer-accounting'\nimport { isCandidateText } from './external-optimizer-process'\nimport {\n assertExternalOptimizerPackageIdentity,\n assertExternalOptimizerSourceDetails,\n type ExternalOptimizerPackageSource,\n} from './external-optimizer-source'\n\nexport interface SkillOptBridgeOutput {\n bestCandidate: string\n bestScore: number\n totalEvaluations: number\n totalSteps: number\n tokenUsage?: ExternalOptimizerTokenUsage\n upstream: ExternalOptimizerPackageSource<'skillopt'>\n runId: string\n resumed: boolean\n}\n\nexport function assertSkillOptBridgeOutput(\n result: SkillOptBridgeOutput,\n name: string,\n maxCandidateChars: number,\n maxEvaluations: number,\n): asserts result is SkillOptBridgeOutput {\n if (!isCandidateText(result.bestCandidate, maxCandidateChars)) {\n throw new Error(`${name}: SkillOpt bridge returned an invalid candidate`)\n }\n if (!Number.isFinite(result.bestScore) || result.bestScore < 0 || result.bestScore > 1) {\n throw new Error(`${name}: SkillOpt bridge returned an invalid bestScore`)\n }\n if (\n !Number.isSafeInteger(result.totalEvaluations) ||\n result.totalEvaluations < 0 ||\n result.totalEvaluations > maxEvaluations\n ) {\n throw new Error(`${name}: SkillOpt bridge returned invalid totalEvaluations`)\n }\n if (!Number.isSafeInteger(result.totalSteps) || result.totalSteps < 0) {\n throw new Error(`${name}: SkillOpt bridge returned invalid totalSteps`)\n }\n assertExternalOptimizerPackageIdentity(result.upstream, 'skillopt', name, 'SkillOpt')\n if (\n typeof result.runId !== 'string' ||\n result.runId.length === 0 ||\n result.runId !== result.runId.trim()\n ) {\n throw new Error(`${name}: SkillOpt bridge returned an invalid runId`)\n }\n if (typeof result.resumed !== 'boolean') {\n throw new Error(`${name}: SkillOpt bridge returned an invalid resumed flag`)\n }\n assertExternalOptimizerSourceDetails(result.upstream, name, 'SkillOpt')\n assertExternalOptimizerTokenUsage(result.tokenUsage, name, 'SkillOpt')\n}\n","import { randomBytes } from 'node:crypto'\nimport { mkdir } from 'node:fs/promises'\nimport {\n assertExternalOptimizerCompletionCount,\n assertPriorExternalOptimizerUsage,\n} from './external-optimizer-accounting'\nimport {\n openExternalOptimizerExecutionLog,\n openExternalOptimizerObservationLog,\n readExternalOptimizerObservationArtifact,\n} from './external-optimizer-observations'\nimport {\n closeExternalOptimizerResources,\n type ExternalOptimizerCallbackLimits,\n type ExternalOptimizerModelProxy,\n type ExternalOptimizerResumeMode,\n type ExternalOptimizerRunnerCommand,\n removeCredentialEnvironment,\n resolveExternalOptimizerCallbackLimits,\n runExternalOptimizerProcess,\n runWithCleanup,\n startExternalOptimizerCallback,\n startExternalOptimizerModelProxy,\n} from './external-optimizer-process'\nimport {\n type ExternalOptimizerRunBudget,\n externalOptimizerCompatibleRunKey,\n externalOptimizerRunKey,\n openExternalOptimizerRunBudget,\n} from './external-optimizer-run-budget'\nimport { externalOptimizerRunnerIdentity, snapshotJson } from './external-optimizer-run-config'\nimport {\n assertExternalOptimizerRunBinding,\n inspectExternalOptimizerRuntime,\n observedExternalOptimizerRuntime,\n} from './external-optimizer-runtime'\nimport {\n createExternalTextEvaluator,\n describeExternalScenario,\n mapExternalScenarios,\n} from './external-text-optimization'\nimport { recordSkillOptSearch } from './gepa-search-import'\nimport {\n combineComparisonCosts,\n costFromLedgerSummary,\n optimizationTokenUsageFromSummary,\n} from './optimization-cost'\nimport type {\n OptimizationMethod,\n OptimizationMethodInput,\n OptimizationMethodResult,\n} from './optimization-method'\nimport type { OpenAICompatibleOptimizerModel } from './optimizer-model'\nimport type { SearchRunIdentity } from './search-ledger-recording'\nimport {\n assertSkillOptOptimizationConfig,\n SKILLOPT_DEFAULT_MAX_CANDIDATE_CHARS,\n SKILLOPT_DEFAULT_MAX_EVIDENCE_CHARS,\n SKILLOPT_DEFAULT_TIMEOUT_MS,\n snapshotSkillOptOptimizationConfig,\n} from './skillopt-optimization-config'\nimport {\n assertSkillOptBridgeOutput,\n type SkillOptBridgeOutput,\n} from './skillopt-optimization-result'\nimport { type CampaignStorage, fsCampaignStorage } from './storage'\nimport type { Scenario } from './types'\n\nexport interface SkillOptTrainerConfig {\n epochs: number\n batchSize: number\n accumulation?: number\n editBudget?: number\n minEditBudget?: number\n analystWorkers?: number\n minibatchSize?: number\n mergeBatchSize?: number\n maxAnalystRounds?: number\n evaluationWorkers?: number\n learningRateSchedule?: 'constant' | 'linear' | 'cosine' | 'autonomous'\n learningRateControl?: 'fixed' | 'autonomous' | 'none'\n updateMode?: 'patch' | 'rewrite_from_suggestions' | 'full_rewrite_minibatch'\n failureOnly?: boolean\n useSlowUpdate?: boolean\n useMetaSkill?: boolean\n /**\n * Additional flat SkillOpt trainer settings. Tangle overwrites data,\n * output, split, seed, validation, and activation settings.\n */\n overrides?: Record<string, unknown>\n}\n\nexport type SkillOptRunnerCommand = ExternalOptimizerRunnerCommand\n\nexport interface SkillOptOptimizationMethodConfig<TScenario extends Scenario, TArtifact = unknown> {\n name?: string\n /** Goal included with every described train and selection case. */\n objective: string\n background?: string\n /** Stable identity for the dispatch, judges, model settings, and scoring logic. */\n evaluationId: string\n trainer: SkillOptTrainerConfig\n /**\n * OpenAI-compatible model connection and hard limits for SkillOpt's own\n * optimizer calls.\n */\n optimizer: OpenAICompatibleOptimizerModel\n /** Hard cap on candidate-case callback requests. */\n maxEvaluations: number\n /** Scores at or above this value count as hard successes. Default: 1. */\n hardScoreThreshold?: number\n maxCandidateChars?: number\n /** Maximum serialized scenario plus evaluation evidence. Default: 100,000. */\n maxEvidenceChars?: number\n /** Candidate-evaluation callback byte limits. Omitted fields use finite defaults. */\n evaluationCallbackLimits?: Partial<ExternalOptimizerCallbackLimits>\n timeoutMs?: number\n describeScenario?: (scenario: TScenario) => unknown\n describeArtifact?: (artifact: TArtifact, scenario: TScenario) => unknown\n resume?: ExternalOptimizerResumeMode\n runner?: SkillOptRunnerCommand\n /**\n * Record SkillOpt's search into a search ledger and return the bounded\n * receipt on the method result, so a comparison under `searchHistoryPolicy:\n * 'require-complete'` accepts this method. Every candidate the callback\n * evaluated becomes a node with an `unknown` edge (SkillOpt reports no\n * parents), and every evaluation becomes a cell.\n *\n * `identity` declares the immutable revisions and the model the ledger\n * requires and the bridge does not report. `path` defaults to\n * `<runDir>/search-ledger.jsonl`.\n */\n searchLedger?: { identity: SearchRunIdentity; path?: string }\n}\n\ntype SkillOptInput<TScenario extends Scenario, TArtifact> = OptimizationMethodInput<\n TScenario,\n TArtifact\n>\ntype SkillOptConfig<TScenario extends Scenario, TArtifact> = SkillOptOptimizationMethodConfig<\n TScenario,\n TArtifact\n>\n\n/** Everything the SkillOpt steps share once the run is prepared and its callback is listening. */\ninterface SkillOptRunContext<TScenario extends Scenario, TArtifact> {\n config: SkillOptConfig<TScenario, TArtifact>\n input: SkillOptInput<TScenario, TArtifact>\n name: string\n signal: AbortSignal | undefined\n started: number\n maxCandidateChars: number\n maxEvidenceChars: number\n storage: CampaignStorage\n runDir: string\n attemptId: string\n resume: ExternalOptimizerResumeMode\n bridgeRunner: SkillOptRunnerCommand | undefined\n runtimeIdentity: Awaited<ReturnType<typeof inspectExternalOptimizerRuntime>>\n trainSet: ReturnType<typeof describeExternalScenario>[]\n selectionSet: ReturnType<typeof describeExternalScenario>[]\n compatibleRunId: string\n runId: string\n runBudget: ExternalOptimizerRunBudget\n observationLog: ReturnType<typeof openExternalOptimizerObservationLog>\n executionLog: ReturnType<typeof openExternalOptimizerExecutionLog>\n callback: Awaited<ReturnType<typeof startExternalOptimizerCallback>>\n}\n\n/** Run Microsoft's SkillOpt trainer as a complete optimization method. */\nexport function skillOptOptimizationMethod<TScenario extends Scenario, TArtifact>(\n config: SkillOptOptimizationMethodConfig<TScenario, TArtifact>,\n): OptimizationMethod<TScenario, TArtifact> {\n assertSkillOptOptimizationConfig(config)\n config = snapshotSkillOptOptimizationConfig(config)\n const snapshot = config\n const name = snapshot.name ?? 'skillopt'\n return {\n name,\n optimize: (input) => optimizeWithSkillOpt(snapshot, name, input),\n }\n}\n\nasync function optimizeWithSkillOpt<TScenario extends Scenario, TArtifact>(\n config: SkillOptConfig<TScenario, TArtifact>,\n name: string,\n input: SkillOptInput<TScenario, TArtifact>,\n): Promise<OptimizationMethodResult> {\n const signal = input.runOptions.signal\n signal?.throwIfAborted()\n if (typeof input.baselineSurface !== 'string') {\n throw new Error(`${name}: SkillOpt requires a string baselineSurface`)\n }\n const context = await prepareSkillOptRun(config, name, input)\n const { result, outputDir, modelProxy } = await runSkillOptBridge(context)\n signal?.throwIfAborted()\n return finishSkillOptRun(context, result, outputDir, modelProxy)\n}\n\n/** Resolve identities, open the run's budget and logs, and start the evaluation callback. */\nasync function prepareSkillOptRun<TScenario extends Scenario, TArtifact>(\n config: SkillOptConfig<TScenario, TArtifact>,\n name: string,\n input: SkillOptInput<TScenario, TArtifact>,\n): Promise<SkillOptRunContext<TScenario, TArtifact>> {\n const signal = input.runOptions.signal\n const started = Date.now()\n const maxCandidateChars = config.maxCandidateChars ?? SKILLOPT_DEFAULT_MAX_CANDIDATE_CHARS\n const maxEvidenceChars = config.maxEvidenceChars ?? SKILLOPT_DEFAULT_MAX_EVIDENCE_CHARS\n const storage = input.runOptions.storage ?? fsCampaignStorage()\n const runDir = `${input.runDir}/skillopt`\n storage.ensureDir(runDir)\n const costLedger = input.costLedger\n const attemptId = randomBytes(16).toString('hex')\n const resume = config.resume ?? 'never'\n const bridgeRunner = config.runner\n ? {\n ...config.runner,\n env: removeCredentialEnvironment(config.runner.env ?? {}),\n }\n : undefined\n const runtimeIdentity = await inspectExternalOptimizerRuntime({\n label: name,\n package: 'skillopt',\n module: 'agent_eval_rpc.skillopt_bridge',\n ...(bridgeRunner ? { runner: bridgeRunner } : {}),\n timeoutMs: config.timeoutMs ?? SKILLOPT_DEFAULT_TIMEOUT_MS,\n ...(signal ? { signal } : {}),\n })\n const trainSet = input.trainScenarios.map((scenario) =>\n describeExternalScenario(scenario, 'SkillOpt', maxEvidenceChars, config.describeScenario),\n )\n const selectionSet = input.selectionScenarios.map((scenario) =>\n describeExternalScenario(scenario, 'SkillOpt', maxEvidenceChars, config.describeScenario),\n )\n const runMaterial = {\n optimizer: 'skillopt',\n runtime: runtimeIdentity,\n method: name,\n evaluationId: config.evaluationId,\n dispatchRef: input.runOptions.dispatchRef ?? null,\n seed: input.seed,\n trainer: snapshotJson(config.trainer, 'SkillOpt run settings'),\n objective: config.objective,\n background: config.background ?? '',\n optimizerModel: {\n model: config.optimizer.model,\n callRef: config.optimizer.callRef,\n budget: config.optimizer.budget,\n },\n seedCandidate: input.baselineSurface,\n trainSet,\n selectionSet,\n maxEvaluations: config.maxEvaluations,\n hardScoreThreshold: config.hardScoreThreshold ?? 1,\n maxCandidateChars,\n maxEvidenceChars,\n evaluationCallbackLimits: resolveExternalOptimizerCallbackLimits(\n config.evaluationCallbackLimits,\n ),\n runner: externalOptimizerRunnerIdentity(bridgeRunner, 'agent_eval_rpc.skillopt_bridge'),\n }\n const compatibleRunId = externalOptimizerCompatibleRunKey(runMaterial)\n const runId = externalOptimizerRunKey({\n material: runMaterial,\n attemptId,\n resumeEnabled: resume !== 'never',\n })\n const runBudget = openExternalOptimizerRunBudget({\n storage,\n runDir,\n runKey: runId,\n attemptId,\n maxEvaluations: config.maxEvaluations,\n })\n const observationLog = openExternalOptimizerObservationLog({\n storage,\n path: `${runDir}/observations-${attemptId}.jsonl`,\n })\n const executionLog = openExternalOptimizerExecutionLog({\n storage,\n path: `${runDir}/model-executions-${attemptId}.jsonl`,\n })\n const scenarioById = mapExternalScenarios(\n input.trainScenarios,\n input.selectionScenarios,\n 'SkillOpt bridge',\n )\n const evaluate = createExternalTextEvaluator({\n input,\n label: 'SkillOpt bridge',\n runDir,\n compatibleRunId: runId,\n costPhase: 'skillopt.external-evaluation',\n costTags: runBudget.attemptTags,\n costLedger,\n scenarioById,\n maxCandidateChars,\n maxEvidenceChars,\n describeArtifact: config.describeArtifact,\n })\n let attemptEvaluationCount = 0\n const callback = await startExternalOptimizerCallback({\n token: randomBytes(32).toString('hex'),\n maxEvaluations: config.maxEvaluations,\n acceptEvaluation: () => {\n const accepted = runBudget.acceptEvaluation()\n if (accepted === undefined) return undefined\n attemptEvaluationCount += 1\n return attemptEvaluationCount\n },\n evaluate,\n observe: observationLog.observe,\n ...(config.evaluationCallbackLimits ? { limits: config.evaluationCallbackLimits } : {}),\n ...(signal ? { signal } : {}),\n })\n return {\n config,\n input,\n name,\n signal,\n started,\n maxCandidateChars,\n maxEvidenceChars,\n storage,\n runDir,\n attemptId,\n resume,\n bridgeRunner,\n runtimeIdentity,\n trainSet,\n selectionSet,\n compatibleRunId,\n runId,\n runBudget,\n observationLog,\n executionLog,\n callback,\n }\n}\n\n/** Start the metered model proxy and run the Python bridge, always closing the callback and proxy. */\nasync function runSkillOptBridge<TScenario extends Scenario, TArtifact>(\n context: SkillOptRunContext<TScenario, TArtifact>,\n): Promise<{\n result: SkillOptBridgeOutput\n outputDir: string\n modelProxy: ExternalOptimizerModelProxy\n}> {\n const { config, input, name, signal, runDir, runBudget, callback } = context\n const costLedger = input.costLedger\n const runnerEnv = context.bridgeRunner?.env ?? {}\n let activeModelProxy: ExternalOptimizerModelProxy | undefined\n const closeResources = () =>\n closeExternalOptimizerResources({\n label: name,\n callback,\n ...(activeModelProxy ? { modelProxy: activeModelProxy } : {}),\n })\n return runWithCleanup({\n label: `${name} optimizer resources`,\n run: async () => {\n const priorOptimizerUsage = costLedger.summary({\n phase: 'skillopt.optimizer-model',\n tags: runBudget.runTags,\n })\n assertPriorExternalOptimizerUsage(priorOptimizerUsage, config.optimizer.budget, name)\n const modelProxy = await startExternalOptimizerModelProxy({\n call: config.optimizer.call,\n callRef: config.optimizer.callRef,\n recordExecution: context.executionLog.observe,\n model: config.optimizer.model,\n budget: config.optimizer.budget,\n ...(config.optimizer.servedModelPolicy\n ? { servedModelPolicy: config.optimizer.servedModelPolicy }\n : {}),\n costLedger,\n phase: 'skillopt.optimizer-model',\n actor: name,\n tags: { ...runBudget.attemptTags },\n initialUsage: {\n requests: priorOptimizerUsage.totalCalls,\n ...(priorOptimizerUsage.costProvenance.kind === 'uncaptured'\n ? {}\n : { costUsd: priorOptimizerUsage.totalCostUsd }),\n },\n ...(signal ? { signal } : {}),\n })\n activeModelProxy = modelProxy\n const outputDir = `${runDir}/external`\n await mkdir(outputDir, { recursive: true })\n const result = await runExternalOptimizerProcess<SkillOptBridgeOutput>({\n label: 'SkillOpt bridge',\n tempPrefix: 'agent-eval-skillopt-',\n module: 'agent_eval_rpc.skillopt_bridge',\n input: {\n attemptId: context.attemptId,\n compatibleRunId: context.compatibleRunId,\n runId: context.runId,\n runtimeIdentity: context.runtimeIdentity,\n resume: context.resume,\n evaluationId: config.evaluationId,\n seed: input.seed,\n callbackUrl: callback.url,\n callbackToken: callback.token,\n objective: config.objective,\n ...(config.background ? { background: config.background } : {}),\n trainer: config.trainer,\n optimizerModel: config.optimizer.model,\n modelBudget: config.optimizer.budget,\n seedCandidate: input.baselineSurface,\n trainSet: context.trainSet,\n selectionSet: context.selectionSet,\n maxEvaluations: config.maxEvaluations,\n hardScoreThreshold: config.hardScoreThreshold ?? 1,\n maxCandidateChars: context.maxCandidateChars,\n maxEvidenceChars: context.maxEvidenceChars,\n outputDir,\n },\n runner: {\n ...context.bridgeRunner,\n env: {\n ...removeCredentialEnvironment(runnerEnv),\n ...skillOptModelEnvironment(config, modelProxy),\n },\n },\n timeoutMs: config.timeoutMs ?? SKILLOPT_DEFAULT_TIMEOUT_MS,\n ...(signal ? { signal } : {}),\n })\n return { result, outputDir, modelProxy }\n },\n cleanup: closeResources,\n })\n}\n\n/** Point every OpenAI-compatible client the bridge uses at the metered model proxy. */\nfunction skillOptModelEnvironment<TScenario extends Scenario, TArtifact>(\n config: SkillOptConfig<TScenario, TArtifact>,\n modelProxy: ExternalOptimizerModelProxy,\n): Record<string, string> {\n const maxTokens = String(config.optimizer.budget.maxOutputTokensPerRequest)\n return {\n OPENAI_COMPATIBLE_BASE_URL: modelProxy.baseUrl,\n OPENAI_COMPATIBLE_API_KEY: modelProxy.apiKey,\n OPTIMIZER_OPENAI_COMPATIBLE_BASE_URL: modelProxy.baseUrl,\n OPTIMIZER_OPENAI_COMPATIBLE_API_KEY: modelProxy.apiKey,\n TARGET_OPENAI_COMPATIBLE_BASE_URL: modelProxy.baseUrl,\n TARGET_OPENAI_COMPATIBLE_API_KEY: modelProxy.apiKey,\n OPENAI_COMPATIBLE_MODEL: config.optimizer.model,\n OPENAI_COMPATIBLE_MAX_TOKENS: maxTokens,\n OPTIMIZER_OPENAI_COMPATIBLE_MODEL: config.optimizer.model,\n OPTIMIZER_OPENAI_COMPATIBLE_MAX_TOKENS: maxTokens,\n TARGET_OPENAI_COMPATIBLE_MODEL: config.optimizer.model,\n TARGET_OPENAI_COMPATIBLE_MAX_TOKENS: maxTokens,\n }\n}\n\n/** Validate the bridge output against the run, total its spend, and build the method result. */\nasync function finishSkillOptRun<TScenario extends Scenario, TArtifact>(\n context: SkillOptRunContext<TScenario, TArtifact>,\n result: SkillOptBridgeOutput,\n outputDir: string,\n modelProxy: ExternalOptimizerModelProxy,\n): Promise<OptimizationMethodResult> {\n const { config, input, name, runBudget, callback, observationLog, executionLog } = context\n const { runtimeIdentity, compatibleRunId, runId } = context\n const costLedger = input.costLedger\n assertSkillOptBridgeOutput(result, name, context.maxCandidateChars, config.maxEvaluations)\n assertExternalOptimizerRunBinding({\n label: name,\n runtime: runtimeIdentity,\n returnedSource: result.upstream,\n compatibleRunId,\n runId,\n returnedRunId: result.runId,\n resume: context.resume,\n resumed: result.resumed,\n })\n if (callback.evaluations() !== result.totalEvaluations) {\n throw new Error(\n `${name}: SkillOpt reported ${result.totalEvaluations} evaluations but the callback received ${callback.evaluations()}`,\n )\n }\n\n const evaluationCost = costFromLedgerSummary(\n costLedger.summary({\n phase: 'skillopt.external-evaluation',\n tags: runBudget.runTags,\n }),\n )\n const optimizerUsage = costLedger.summary({\n phase: 'skillopt.optimizer-model',\n tags: runBudget.runTags,\n })\n const optimizerReceipts = costLedger.list({\n phase: 'skillopt.optimizer-model',\n tags: runBudget.runTags,\n })\n const optimizerCost = costFromLedgerSummary(optimizerUsage)\n modelProxy.assertExecutionComplete()\n assertExternalOptimizerCompletionCount(\n result.tokenUsage,\n modelProxy.requestAttempts(),\n modelProxy.successfulCompletions(),\n name,\n 'SkillOpt',\n )\n const tokenUsage = optimizationTokenUsageFromSummary(optimizerUsage, optimizerReceipts)\n const runtime = observedExternalOptimizerRuntime(runtimeIdentity)\n const combinedCost = combineComparisonCosts([\n { label: 'evaluation', cost: evaluationCost },\n { label: 'optimizer model', cost: optimizerCost },\n ])\n const searchHistory = config.searchLedger\n ? await recordSkillOptSearch({\n name,\n path: config.searchLedger.path ?? `${context.runDir}/search-ledger.jsonl`,\n searchId: runId,\n identity: config.searchLedger.identity,\n storage: context.storage,\n seed: input.seed,\n baselineSurface: input.baselineSurface as string,\n trainScenarios: input.trainScenarios,\n selectionScenarios: input.selectionScenarios,\n evaluationLimit: config.maxEvaluations,\n observations: readExternalOptimizerObservationArtifact({\n summary: observationLog.summary(),\n storage: context.storage,\n }),\n selected: result.bestCandidate,\n // The model proxy metered every optimizer call, so its receipts are the spend.\n generationAccounting: {\n tokens: optimizerUsage.usageComplete\n ? {\n status: 'known',\n inputTokens: optimizerUsage.inputTokens,\n outputTokens: optimizerUsage.outputTokens,\n cachedTokens: optimizerUsage.cachedTokens,\n }\n : { status: 'unknown', reason: 'an optimizer call reported no token usage' },\n cost: optimizerCost.accountingComplete\n ? { status: 'known', usd: optimizerCost.totalCostUsd, source: 'provider' }\n : {\n status: 'unknown',\n knownLowerBoundUsd: optimizerCost.totalCostUsd,\n reason: optimizerCost.incompleteReasons.join('; ') || 'optimizer spend incomplete',\n },\n },\n })\n : undefined\n return {\n winnerSurface: result.bestCandidate,\n ...(searchHistory ? { searchHistory } : {}),\n cost: combinedCost,\n durationMs: Date.now() - context.started,\n provenance: {\n ...runtime,\n optimizerModel: config.optimizer.model,\n optimizerCallRef: config.optimizer.callRef,\n compatibleRunId,\n runId,\n resumed: result.resumed,\n evaluationCount: runBudget.acceptedEvaluations(),\n artifactDir: outputDir,\n ...(tokenUsage ? { tokenUsage } : {}),\n observations: observationLog.summary(),\n modelExecutions: executionLog.summary(),\n },\n }\n}\n"],"mappings":"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"}