@tangle-network/agent-eval 0.216.0 → 0.217.1

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 (553) hide show
  1. package/CHANGELOG.md +141 -57
  2. package/README.md +2 -2
  3. package/dist/adapters/http.d.ts +3 -3
  4. package/dist/{agent-profile-CIA2Atnt.d.ts → agent-profile-DTt8uGP9.d.ts} +5 -18
  5. package/dist/agent-profile-DTt8uGP9.d.ts.map +1 -0
  6. package/dist/{agent-profile-cell-BYc0bxsL.js → agent-profile-cell-B1V1gUZs.js} +4 -53
  7. package/dist/agent-profile-cell-B1V1gUZs.js.map +1 -0
  8. package/dist/{agent-profile-cell-BNp-Js9F.d.ts → agent-profile-cell-BcpFbNd5.d.ts} +2 -22
  9. package/dist/agent-profile-cell-BcpFbNd5.d.ts.map +1 -0
  10. package/dist/{agreement-irr-DsTURxdr.js → agreement-irr-BhAqjluA.js} +5 -5
  11. package/dist/agreement-irr-BhAqjluA.js.map +1 -0
  12. package/dist/analyst/index.d.ts +37 -170
  13. package/dist/analyst/index.d.ts.map +1 -1
  14. package/dist/analyst/index.js +17 -192
  15. package/dist/analyst/index.js.map +1 -1
  16. package/dist/{analyze-runs-3xpby3p2.js → analyze-runs-DqPJaJ4X.js} +763 -555
  17. package/dist/analyze-runs-DqPJaJ4X.js.map +1 -0
  18. package/dist/{analyze-runs-CSDAh8A7.d.ts → analyze-runs-DyeNcenW.d.ts} +18 -16
  19. package/dist/analyze-runs-DyeNcenW.d.ts.map +1 -0
  20. package/dist/authenticity/index.d.ts +0 -23
  21. package/dist/authenticity/index.d.ts.map +1 -1
  22. package/dist/authenticity/index.js +1 -34
  23. package/dist/authenticity/index.js.map +1 -1
  24. package/dist/{benchmark-command-CByl9dxG.js → benchmark-command-xQK8nOI6.js} +591 -109
  25. package/dist/benchmark-command-xQK8nOI6.js.map +1 -0
  26. package/dist/benchmarks/index.d.ts +5 -6
  27. package/dist/benchmarks/index.d.ts.map +1 -1
  28. package/dist/benchmarks/index.js +4 -4
  29. package/dist/benchmarks/index.js.map +1 -1
  30. package/dist/builder-eval/index.d.ts +3 -3
  31. package/dist/builder-eval/index.js +2 -2
  32. package/dist/builder-eval/index.js.map +1 -1
  33. package/dist/campaign/index.d.ts +8 -8
  34. package/dist/campaign/index.js +15 -15
  35. package/dist/{campaign-BQ-Jujuj.js → campaign-CJGkxAQ6.js} +256 -765
  36. package/dist/campaign-CJGkxAQ6.js.map +1 -0
  37. package/dist/{campaign-evidence-OcUciD-N.js → campaign-evidence-CQYw8_0H.js} +10 -18
  38. package/dist/{campaign-evidence-OcUciD-N.js.map → campaign-evidence-CQYw8_0H.js.map} +1 -1
  39. package/dist/{canonical-BsZVgBhW.js → canonical-Dq2hOQ8L.js} +2 -2
  40. package/dist/{canonical-BsZVgBhW.js.map → canonical-Dq2hOQ8L.js.map} +1 -1
  41. package/dist/cell-spend-DEWR3nj-.js +90 -0
  42. package/dist/cell-spend-DEWR3nj-.js.map +1 -0
  43. package/dist/{chat-client-DthPOYGd.js → chat-client-ldqxYYTN.js} +2 -2
  44. package/dist/{chat-client-DthPOYGd.js.map → chat-client-ldqxYYTN.js.map} +1 -1
  45. package/dist/{chat-json-call-BrKsyspg.js → chat-json-call-DavzexSp.js} +3 -2
  46. package/dist/chat-json-call-DavzexSp.js.map +1 -0
  47. package/dist/{claim-BXcZw-jo.js → claim-BPVuyHuy.js} +4 -4
  48. package/dist/claim-BPVuyHuy.js.map +1 -0
  49. package/dist/cli.js +113 -12
  50. package/dist/cli.js.map +1 -1
  51. package/dist/{client-BzL9niqi.d.ts → client-hwo3cJjR.d.ts} +3 -16
  52. package/dist/client-hwo3cJjR.d.ts.map +1 -0
  53. package/dist/{cluster-bootstrap-B3JywQQn.js → cluster-bootstrap-DEwwhl0C.js} +3 -3
  54. package/dist/{cluster-bootstrap-B3JywQQn.js.map → cluster-bootstrap-DEwwhl0C.js.map} +1 -1
  55. package/dist/{produced-state-ZCtDBxAE.js → completion-verifier-B_jw6C9p.js} +9 -64
  56. package/dist/completion-verifier-B_jw6C9p.js.map +1 -0
  57. package/dist/contract/index.d.ts +13 -13
  58. package/dist/contract/index.js +1041 -1473
  59. package/dist/contract/index.js.map +1 -1
  60. package/dist/{cost-ledger-D2FnJPBF.js → cost-ledger-D0352Z4d.js} +832 -817
  61. package/dist/cost-ledger-D0352Z4d.js.map +1 -0
  62. package/dist/{cost-ledger-CO7UyEcQ.d.ts → cost-ledger-Jk62OBfF.d.ts} +12 -47
  63. package/dist/cost-ledger-Jk62OBfF.d.ts.map +1 -0
  64. package/dist/dataset-DQqhOCPt.d.ts.map +1 -1
  65. package/dist/{default-registry-Cn1LQ2Ve.js → default-registry-ClYjq3QE.js} +8 -11
  66. package/dist/default-registry-ClYjq3QE.js.map +1 -0
  67. package/dist/{default-registry-BrWh62zf.d.ts → default-registry-DXgLmoDI.d.ts} +7 -50
  68. package/dist/default-registry-DXgLmoDI.d.ts.map +1 -0
  69. package/dist/{define-agent-eval-Ch3MWX6k.js → define-agent-eval-BDxNlP3D.js} +10 -10
  70. package/dist/define-agent-eval-BDxNlP3D.js.map +1 -0
  71. package/dist/{define-agent-eval-CEWkX5wZ.d.ts → define-agent-eval-BIkH_gAR.d.ts} +9 -9
  72. package/dist/define-agent-eval-BIkH_gAR.d.ts.map +1 -0
  73. package/dist/{descriptive-CnU8Yq29.js → descriptive-CVNy48rR.js} +2 -2
  74. package/dist/{descriptive-CnU8Yq29.js.map → descriptive-CVNy48rR.js.map} +1 -1
  75. package/dist/diagnosis/index.d.ts +4 -14
  76. package/dist/diagnosis/index.d.ts.map +1 -1
  77. package/dist/diagnosis/index.js +67 -28
  78. package/dist/diagnosis/index.js.map +1 -1
  79. package/dist/{dspy-rlm-engine-D-KX_e64.js → dspy-rlm-engine-DhdCr1Dc.js} +5 -10
  80. package/dist/dspy-rlm-engine-DhdCr1Dc.js.map +1 -0
  81. package/dist/{emitter-HcCmFQl_.d.ts → emitter-DABYYTcH.d.ts} +5 -5
  82. package/dist/emitter-DABYYTcH.d.ts.map +1 -0
  83. package/dist/emitter-DbMXUIVP.js.map +1 -1
  84. package/dist/{engine-C_zNWfM8.d.ts → engine-BvZ0R-36.d.ts} +18 -22
  85. package/dist/engine-BvZ0R-36.d.ts.map +1 -0
  86. package/dist/{equal-terms-Blx9Zk5I.js → equal-terms-DbPGcVtI.js} +2 -2
  87. package/dist/equal-terms-DbPGcVtI.js.map +1 -0
  88. package/dist/{errors-Dngq5h35.js → errors-BcOs5MKW.js} +6 -8
  89. package/dist/{errors-Dngq5h35.js.map → errors-BcOs5MKW.js.map} +1 -1
  90. package/dist/{eval-campaign-4byTtqrf.js → eval-campaign-BLEfBGbA.js} +6 -6
  91. package/dist/{eval-campaign-4byTtqrf.js.map → eval-campaign-BLEfBGbA.js.map} +1 -1
  92. package/dist/{evaluation-Cn2dRZIz.d.ts → evaluation-jTjC_QQD.d.ts} +8 -8
  93. package/dist/evaluation-jTjC_QQD.d.ts.map +1 -0
  94. package/dist/evaluation.d.ts +2 -2
  95. package/dist/evaluation.js +1 -1
  96. package/dist/evaluation.js.map +1 -1
  97. package/dist/{exact-types-CD0lf5Qd.d.ts → exact-types-CflbJ9f3.d.ts} +2 -2
  98. package/dist/{exact-types-CD0lf5Qd.d.ts.map → exact-types-CflbJ9f3.d.ts.map} +1 -1
  99. package/dist/{exec-ChJ6d5if.js → exec-CpbtOXVt.js} +2 -24
  100. package/dist/{exec-ChJ6d5if.js.map → exec-CpbtOXVt.js.map} +1 -1
  101. package/dist/execution-tracks-CpgFPpS5.js.map +1 -1
  102. package/dist/experiment/index.d.ts +331 -33
  103. package/dist/experiment/index.d.ts.map +1 -1
  104. package/dist/experiment/index.js +303 -101
  105. package/dist/experiment/index.js.map +1 -1
  106. package/dist/{exporters-X4xwla8A.js → exporters-Cl6IeNAu.js} +3 -3
  107. package/dist/exporters-Cl6IeNAu.js.map +1 -0
  108. package/dist/{exporters-ChTnR90l.d.ts → exporters-Dk3oEbK_.d.ts} +2 -4
  109. package/dist/{exporters-ChTnR90l.d.ts.map → exporters-Dk3oEbK_.d.ts.map} +1 -1
  110. package/dist/{external-optimizer-process-nnsY5D_4.js → external-optimizer-process-KVFGvYX1.js} +4 -3
  111. package/dist/external-optimizer-process-KVFGvYX1.js.map +1 -0
  112. package/dist/{external-optimizer-subprocess-DcerlZSG.js → external-optimizer-subprocess-XIHBOSKt.js} +551 -553
  113. package/dist/external-optimizer-subprocess-XIHBOSKt.js.map +1 -0
  114. package/dist/{extract-usage-BrnzRJ6H.js → extract-usage-BZLU01kR.js} +2 -23
  115. package/dist/{extract-usage-BrnzRJ6H.js.map → extract-usage-BZLU01kR.js.map} +1 -1
  116. package/dist/{failure-cluster-CbgEDcFJ.d.ts → failure-cluster-DN0t63Z0.d.ts} +4 -43
  117. package/dist/failure-cluster-DN0t63Z0.d.ts.map +1 -0
  118. package/dist/{failure-taxonomy-CjabTATj.js → failure-taxonomy-Bx5oWqaW.js} +2 -19
  119. package/dist/{failure-taxonomy-CjabTATj.js.map → failure-taxonomy-Bx5oWqaW.js.map} +1 -1
  120. package/dist/{feedback-trajectory-DkaDj0dj.d.ts → feedback-trajectory-BWmhRBGu.d.ts} +8 -13
  121. package/dist/feedback-trajectory-BWmhRBGu.d.ts.map +1 -0
  122. package/dist/{semantic-concept-judge-zQBG9hHU.js → findings-store-BMVQtEsm.js} +13 -255
  123. package/dist/findings-store-BMVQtEsm.js.map +1 -0
  124. package/dist/fuzz.d.ts +20 -63
  125. package/dist/fuzz.d.ts.map +1 -1
  126. package/dist/fuzz.js +62 -108
  127. package/dist/fuzz.js.map +1 -1
  128. package/dist/{hf-dataset-BR2yhuNn.js → hf-dataset-D9f7-oX7.js} +4 -24
  129. package/dist/hf-dataset-D9f7-oX7.js.map +1 -0
  130. package/dist/hosted/index.d.ts +2 -2
  131. package/dist/hosted/index.js +2 -2
  132. package/dist/{index-DHKEAv3s.d.ts → index-9jJ2fKSX.d.ts} +2 -64
  133. package/dist/index-9jJ2fKSX.d.ts.map +1 -0
  134. package/dist/{index-oQ4aHziK.d.ts → index-BLGqZ81N.d.ts} +11 -16
  135. package/dist/{index-oQ4aHziK.d.ts.map → index-BLGqZ81N.d.ts.map} +1 -1
  136. package/dist/{index-DlH0Y9gI.d.ts → index-BiT6RtNH.d.ts} +31 -43
  137. package/dist/index-BiT6RtNH.d.ts.map +1 -0
  138. package/dist/{index-Ch9VxCpK.d.ts → index-CX-GAUpw.d.ts} +4 -8
  139. package/dist/index-CX-GAUpw.d.ts.map +1 -0
  140. package/dist/{index-CPJJr98o.d.ts → index-CiRwLv2R.d.ts} +5 -68
  141. package/dist/index-CiRwLv2R.d.ts.map +1 -0
  142. package/dist/{index-NvGBiO8H.d.ts → index-ZuWx52WG.d.ts} +266 -495
  143. package/dist/index-ZuWx52WG.d.ts.map +1 -0
  144. package/dist/index.d.ts +2256 -2165
  145. package/dist/index.d.ts.map +1 -1
  146. package/dist/index.js +514 -1192
  147. package/dist/index.js.map +1 -1
  148. package/dist/{integrity-BV1ZDf42.js → integrity-DOd9Q86O.js} +7 -12
  149. package/dist/integrity-DOd9Q86O.js.map +1 -0
  150. package/dist/{integrity-BvnVARVl.js → integrity-W4CADcFc.js} +3 -7
  151. package/dist/{integrity-BvnVARVl.js.map → integrity-W4CADcFc.js.map} +1 -1
  152. package/dist/{integrity-CCAxGVK6.d.ts → integrity-_qgZLA5p.d.ts} +4 -6
  153. package/dist/{integrity-CCAxGVK6.d.ts.map → integrity-_qgZLA5p.d.ts.map} +1 -1
  154. package/dist/{internal-CRHwS9iz.js → internal-BTK91Bqt.js} +3 -3
  155. package/dist/{internal-CRHwS9iz.js.map → internal-BTK91Bqt.js.map} +1 -1
  156. package/dist/interval-Dq9gt7jx.js +219 -0
  157. package/dist/interval-Dq9gt7jx.js.map +1 -0
  158. package/dist/interval-ohuOJurX.d.ts +47 -0
  159. package/dist/interval-ohuOJurX.d.ts.map +1 -0
  160. package/dist/{journal-DvKCvjty.js → journal-CR4QikYp.js} +110 -110
  161. package/dist/journal-CR4QikYp.js.map +1 -0
  162. package/dist/json-BhdsJaOQ.js +111 -0
  163. package/dist/json-BhdsJaOQ.js.map +1 -0
  164. package/dist/{judge-calibration-N44V04Se.js → judge-calibration-BkXMIWA4.js} +3 -3
  165. package/dist/{judge-calibration-N44V04Se.js.map → judge-calibration-BkXMIWA4.js.map} +1 -1
  166. package/dist/{judge-gate-B1qYnkpi.js → judge-gate-Co5tuh57.js} +4 -27
  167. package/dist/judge-gate-Co5tuh57.js.map +1 -0
  168. package/dist/{judge-gate-DNcUrRFA.d.ts → judge-gate-DsL0yFcb.d.ts} +9 -10
  169. package/dist/judge-gate-DsL0yFcb.d.ts.map +1 -0
  170. package/dist/{kind-factory-CbZ-6tvu.js → kind-factory-Gy4fXixd.js} +88 -17
  171. package/dist/kind-factory-Gy4fXixd.js.map +1 -0
  172. package/dist/ledger-core/index.d.ts +2 -2
  173. package/dist/ledger-core/index.js +4 -4
  174. package/dist/{ledger-core-B2hahzrt.js → ledger-core-DrJhbms9.js} +5 -84
  175. package/dist/ledger-core-DrJhbms9.js.map +1 -0
  176. package/dist/{llm-client-DQveoxSM.js → llm-client-BshCREn6.js} +90 -219
  177. package/dist/llm-client-BshCREn6.js.map +1 -0
  178. package/dist/{llm-judge-PXV7Xljl.js → llm-judge-C8jMTNNG.js} +501 -931
  179. package/dist/llm-judge-C8jMTNNG.js.map +1 -0
  180. package/dist/matrix/index.d.ts +4 -4
  181. package/dist/matrix/index.js +3 -2
  182. package/dist/{matrix-_BV9-Lk5.js → matrix-B8l-Nsxd.js} +7 -96
  183. package/dist/matrix-B8l-Nsxd.js.map +1 -0
  184. package/dist/{matrix-CHMiebFx.d.ts → matrix-DHe-dwVJ.d.ts} +10 -19
  185. package/dist/matrix-DHe-dwVJ.d.ts.map +1 -0
  186. package/dist/{paired-tests-jbwPdSz5.js → mean-BbA_JCzW.js} +45 -5
  187. package/dist/mean-BbA_JCzW.js.map +1 -0
  188. package/dist/meta-eval/index.d.ts +6 -6
  189. package/dist/meta-eval/index.js +10 -10
  190. package/dist/meta-eval/index.js.map +1 -1
  191. package/dist/metrics-BKaPBtIG.js.map +1 -1
  192. package/dist/mint-BRZXuwRi.d.ts +81 -0
  193. package/dist/mint-BRZXuwRi.d.ts.map +1 -0
  194. package/dist/{mint-Csor1BLJ.js → mint-zszyYlpA.js} +4 -4
  195. package/dist/{mint-Csor1BLJ.js.map → mint-zszyYlpA.js.map} +1 -1
  196. package/dist/{multi-layer-verifier-BUaQ4C17.d.ts → multi-layer-verifier-DEgMUk6v.d.ts} +2 -2
  197. package/dist/{multi-layer-verifier-BUaQ4C17.d.ts.map → multi-layer-verifier-DEgMUk6v.d.ts.map} +1 -1
  198. package/dist/{multiplicity-D9cjmStq.js → multiplicity-Sg0U7h8j.js} +2 -2
  199. package/dist/{multiplicity-D9cjmStq.js.map → multiplicity-Sg0U7h8j.js.map} +1 -1
  200. package/dist/multishot/golden/index.d.ts +1 -23
  201. package/dist/multishot/golden/index.d.ts.map +1 -1
  202. package/dist/multishot/golden/index.js +5 -8
  203. package/dist/multishot/golden/index.js.map +1 -1
  204. package/dist/multishot/index.d.ts +3 -12
  205. package/dist/multishot/index.d.ts.map +1 -1
  206. package/dist/multishot/index.js +4 -3
  207. package/dist/multishot/index.js.map +1 -1
  208. package/dist/nonnegative-number-DvdMxg_f.js +9 -0
  209. package/dist/nonnegative-number-DvdMxg_f.js.map +1 -0
  210. package/dist/openapi.json +114 -10
  211. package/dist/{otel-spans-C8YIJWy1.js → otel-spans-CdN909k1.js} +3 -3
  212. package/dist/{otel-spans-C8YIJWy1.js.map → otel-spans-CdN909k1.js.map} +1 -1
  213. package/dist/{paired-arms-DzKn0TfY.js → paired-arms-Ct4LTKc1.js} +32 -9
  214. package/dist/paired-arms-Ct4LTKc1.js.map +1 -0
  215. package/dist/{paired-binary-Q36bhn2R.js → paired-binary-B_nejA44.js} +3 -36
  216. package/dist/paired-binary-B_nejA44.js.map +1 -0
  217. package/dist/{paired-promotion-decision-DPKz8ZnF.d.ts → paired-promotion-decision-CQMJ5xGN.d.ts} +2 -34
  218. package/dist/paired-promotion-decision-CQMJ5xGN.d.ts.map +1 -0
  219. package/dist/{paired-promotion-decision-BN6IQTiu.js → paired-promotion-decision-D0SHb-ZL.js} +3 -3
  220. package/dist/{paired-promotion-decision-BN6IQTiu.js.map → paired-promotion-decision-D0SHb-ZL.js.map} +1 -1
  221. package/dist/{search-kernel-BztlERLv.js → pareto-BzsxidFD.js} +883 -861
  222. package/dist/pareto-BzsxidFD.js.map +1 -0
  223. package/dist/pipelines/index.d.ts +16 -19
  224. package/dist/pipelines/index.d.ts.map +1 -1
  225. package/dist/pipelines/index.js +4 -68
  226. package/dist/pipelines/index.js.map +1 -1
  227. package/dist/{power-and-mde-fK5Qocwo.js → power-and-mde-N5nU4_Ly.js} +3 -3
  228. package/dist/{power-and-mde-fK5Qocwo.js.map → power-and-mde-N5nU4_Ly.js.map} +1 -1
  229. package/dist/predicate-FdKmElA_.js +38 -0
  230. package/dist/predicate-FdKmElA_.js.map +1 -0
  231. package/dist/{prime-protocol-DcAK9pC8.js → prime-protocol-BFgGrEMP.js} +3 -3
  232. package/dist/prime-protocol-BFgGrEMP.js.map +1 -0
  233. package/dist/{prime-protocol-CEE4BR9N.d.ts → prime-protocol-BWG2DQIk.d.ts} +4 -22
  234. package/dist/prime-protocol-BWG2DQIk.d.ts.map +1 -0
  235. package/dist/profile-cell.d.ts +2 -2
  236. package/dist/profile-cell.js +2 -2
  237. package/dist/{release-confidence-BK2QCB5M.d.ts → promotion-gate-DaY95yU6.d.ts} +105 -106
  238. package/dist/promotion-gate-DaY95yU6.d.ts.map +1 -0
  239. package/dist/{promotion-policy-CWW35UWq.js → promotion-policy-6A8osGr_.js} +4 -4
  240. package/dist/{promotion-policy-CWW35UWq.js.map → promotion-policy-6A8osGr_.js.map} +1 -1
  241. package/dist/{proposal-findings-BZiMTzAF.js → proposal-findings-BbWidvUk.js} +3 -3
  242. package/dist/proposal-findings-BbWidvUk.js.map +1 -0
  243. package/dist/{query-B1D1qp2Z.js → query-B_RZ36an.js} +5 -5
  244. package/dist/query-B_RZ36an.js.map +1 -0
  245. package/dist/{query-DK1nWcmp.d.ts → query-Cmv_U8vf.d.ts} +4 -24
  246. package/dist/{query-DK1nWcmp.d.ts.map → query-Cmv_U8vf.d.ts.map} +1 -1
  247. package/dist/{random-Dn5fPWkt.js → random-DDDcC7YU.js} +2 -2
  248. package/dist/{random-Dn5fPWkt.js.map → random-DDDcC7YU.js.map} +1 -1
  249. package/dist/{raw-provider-sink-rB2DYxr6.js → raw-provider-sink-75w4FWBj.js} +2 -2
  250. package/dist/{raw-provider-sink-rB2DYxr6.js.map → raw-provider-sink-75w4FWBj.js.map} +1 -1
  251. package/dist/{redact-Cveoq6fJ.d.ts → redact-DXdlFb_U.d.ts} +4 -21
  252. package/dist/redact-DXdlFb_U.d.ts.map +1 -0
  253. package/dist/{redact-Dk1ZdJEm.js → redact-mtkTiJVk.js} +92 -98
  254. package/dist/redact-mtkTiJVk.js.map +1 -0
  255. package/dist/{registry-JYfPxcVz.d.ts → registry-ssNoHzwD.d.ts} +5 -5
  256. package/dist/{registry-JYfPxcVz.d.ts.map → registry-ssNoHzwD.d.ts.map} +1 -1
  257. package/dist/{release-confidence-Dbe9AS_X.js → release-confidence-CYIFH-fp.js} +6 -11
  258. package/dist/release-confidence-CYIFH-fp.js.map +1 -0
  259. package/dist/{report-command-y8H6RSX8.js → render-C-w2EZ6p.js} +331 -554
  260. package/dist/render-C-w2EZ6p.js.map +1 -0
  261. package/dist/reporting-html-Kvlc8oMt.js +100 -0
  262. package/dist/reporting-html-Kvlc8oMt.js.map +1 -0
  263. package/dist/reporting.d.ts +6 -6
  264. package/dist/reporting.js +8 -8
  265. package/dist/{researcher-f6mZhh58.d.ts → researcher-0ABVIdGa.d.ts} +9 -9
  266. package/dist/{researcher-f6mZhh58.d.ts.map → researcher-0ABVIdGa.d.ts.map} +1 -1
  267. package/dist/reward-DrZ71vnf.d.ts +55 -0
  268. package/dist/reward-DrZ71vnf.d.ts.map +1 -0
  269. package/dist/{reward-hacking-BFcQgkux.js → reward-hacking-ByuETaIb.js} +3 -3
  270. package/dist/{reward-hacking-BFcQgkux.js.map → reward-hacking-ByuETaIb.js.map} +1 -1
  271. package/dist/{reward-hacking-DHA7c1l8.d.ts → reward-hacking-E52wq86n.d.ts} +5 -18
  272. package/dist/reward-hacking-E52wq86n.d.ts.map +1 -0
  273. package/dist/reward-nw2xZGZG.js.map +1 -1
  274. package/dist/rl.d.ts +117 -295
  275. package/dist/rl.d.ts.map +1 -1
  276. package/dist/rl.js +27 -747
  277. package/dist/rl.js.map +1 -1
  278. package/dist/rollout/index.d.ts +5 -4
  279. package/dist/rollout/index.js +7 -8
  280. package/dist/{rollout-D9bKKBnZ.js → rollout-D6C50mfA.js} +88 -13
  281. package/dist/rollout-D6C50mfA.js.map +1 -0
  282. package/dist/round-decimal-COrKglMh.js +10 -0
  283. package/dist/round-decimal-COrKglMh.js.map +1 -0
  284. package/dist/{rubric-predictive-validity-BsgkBfT0.js → rubric-predictive-validity-D3_oI72N.js} +3 -3
  285. package/dist/{rubric-predictive-validity-BsgkBfT0.js.map → rubric-predictive-validity-D3_oI72N.js.map} +1 -1
  286. package/dist/{rubric-predictive-validity-2SgHxoa5.d.ts → rubric-predictive-validity-DiwT8PbL.d.ts} +2 -2
  287. package/dist/{rubric-predictive-validity-2SgHxoa5.d.ts.map → rubric-predictive-validity-DiwT8PbL.d.ts.map} +1 -1
  288. package/dist/{run-record-D1Hw-Jml.d.ts → run-record-CaxbLq6Y.d.ts} +5 -11
  289. package/dist/run-record-CaxbLq6Y.d.ts.map +1 -0
  290. package/dist/{run-record-ES07wfz9.js → run-record-CysKLB93.js} +3 -5
  291. package/dist/run-record-CysKLB93.js.map +1 -0
  292. package/dist/{run-record-DlTZ_lqe.js → run-record-DhEJgoPz.js} +4 -4
  293. package/dist/{run-record-DlTZ_lqe.js.map → run-record-DhEJgoPz.js.map} +1 -1
  294. package/dist/sandbox-harness-BlSOu4LX.d.ts.map +1 -1
  295. package/dist/{schema-CSf6qWgZ.js → schema-Bt2vLFm3.js} +2 -14
  296. package/dist/schema-Bt2vLFm3.js.map +1 -0
  297. package/dist/schema-C-ziyJD7.d.ts.map +1 -1
  298. package/dist/{schema-2g7trUwH.d.ts → schema-D6EVKzTB.d.ts} +4 -5
  299. package/dist/schema-D6EVKzTB.d.ts.map +1 -0
  300. package/dist/{schema-BuiujZ-g.js → schema-DxcKTzbi.js} +2 -2
  301. package/dist/schema-DxcKTzbi.js.map +1 -0
  302. package/dist/search/index.d.ts +39 -53
  303. package/dist/search/index.d.ts.map +1 -1
  304. package/dist/search/index.js +4 -4
  305. package/dist/{search-kernel-CpcKH5Ih.d.ts → search-kernel-DxqjBxA-.d.ts} +18 -31
  306. package/dist/search-kernel-DxqjBxA-.d.ts.map +1 -0
  307. package/dist/{search-ledger-d7V8o9Lk.js → search-ledger-TUvB5gWH.js} +189 -199
  308. package/dist/search-ledger-TUvB5gWH.js.map +1 -0
  309. package/dist/{search-ledger-file-BqOo-bVo.js → search-ledger-file-UKCO2r8a.js} +4 -4
  310. package/dist/search-ledger-file-UKCO2r8a.js.map +1 -0
  311. package/dist/search-ledger-types-p2xKfiDJ.d.ts.map +1 -1
  312. package/dist/{search-shipper-er4pK5_Y.js → search-shipper-Cw2z3-td.js} +4 -4
  313. package/dist/search-shipper-Cw2z3-td.js.map +1 -0
  314. package/dist/{search-summary-CBvz3u_S.js → search-summary-DQIvJsSB.js} +5 -5
  315. package/dist/{search-summary-CBvz3u_S.js.map → search-summary-DQIvJsSB.js.map} +1 -1
  316. package/dist/{sequential-CzK5DarL.js → sequential-BVv1sjsw.js} +2 -32
  317. package/dist/{sequential-CzK5DarL.js.map → sequential-BVv1sjsw.js.map} +1 -1
  318. package/dist/{sequential-D-1PPCmM.js → sequential-CimQrbjv.js} +5 -5
  319. package/dist/sequential-CimQrbjv.js.map +1 -0
  320. package/dist/{sequential-BhsrMupG.d.ts → sequential-KwGspfeR.d.ts} +2 -9
  321. package/dist/{sequential-BhsrMupG.d.ts.map → sequential-KwGspfeR.d.ts.map} +1 -1
  322. package/dist/{sequential-eprocess-D1jKoihe.js → sequential-eprocess-DodI6RoF.js} +2 -2
  323. package/dist/{sequential-eprocess-D1jKoihe.js.map → sequential-eprocess-DodI6RoF.js.map} +1 -1
  324. package/dist/{server-DbcC7xMl.js → server-DoVbqqtJ.js} +101 -101
  325. package/dist/server-DoVbqqtJ.js.map +1 -0
  326. package/dist/{single-run-lock-fVu3MZWH.js → single-run-lock-U58yf8N6.js} +2 -2
  327. package/dist/{single-run-lock-fVu3MZWH.js.map → single-run-lock-U58yf8N6.js.map} +1 -1
  328. package/dist/{skillopt-optimization-method-CCtzralq.js → skillopt-optimization-method-kyL94-ri.js} +428 -91
  329. package/dist/skillopt-optimization-method-kyL94-ri.js.map +1 -0
  330. package/dist/{spans-D9_ehFuk.d.ts → spans-CVngGij3.d.ts} +2 -2
  331. package/dist/{spans-D9_ehFuk.d.ts.map → spans-CVngGij3.d.ts.map} +1 -1
  332. package/dist/{statistical-heldout-1Gbmex7v.js → statistical-heldout-Bksv92Th.js} +3 -3
  333. package/dist/statistical-heldout-Bksv92Th.js.map +1 -0
  334. package/dist/{statistical-heldout-BeR4bOdg.d.ts → statistical-heldout-C9AbgREN.d.ts} +8 -67
  335. package/dist/statistical-heldout-C9AbgREN.d.ts.map +1 -0
  336. package/dist/{steps-Bg5-KVx1.d.ts → steps-DlepJPwD.d.ts} +2 -56
  337. package/dist/steps-DlepJPwD.d.ts.map +1 -0
  338. package/dist/{store-C4avFjIi.d.ts → store-B3nWRy3B.d.ts} +2 -2
  339. package/dist/{store-C4avFjIi.d.ts.map → store-B3nWRy3B.d.ts.map} +1 -1
  340. package/dist/{store-otlp-DtB4Slsr.js → store-otlp-BteDAbHK.js} +135 -132
  341. package/dist/store-otlp-BteDAbHK.js.map +1 -0
  342. package/dist/{store-tool-spans-fZIigrpP.js → store-tool-spans-D5l_OfTJ.js} +9 -9
  343. package/dist/store-tool-spans-D5l_OfTJ.js.map +1 -0
  344. package/dist/{store-tool-spans-DR1SrCLK.d.ts → store-tool-spans-DZS0HWVf.d.ts} +157 -165
  345. package/dist/store-tool-spans-DZS0HWVf.d.ts.map +1 -0
  346. package/dist/storyboard/index.d.ts +4 -11
  347. package/dist/storyboard/index.d.ts.map +1 -1
  348. package/dist/storyboard/index.js +21 -19
  349. package/dist/storyboard/index.js.map +1 -1
  350. package/dist/{summary-report-DtdRucM0.js → summary-report-BsXJoYX5.js} +588 -598
  351. package/dist/summary-report-BsXJoYX5.js.map +1 -0
  352. package/dist/{summary-report-C-CtItCN.d.ts → summary-report-DM7tlml1.d.ts} +16 -20
  353. package/dist/summary-report-DM7tlml1.d.ts.map +1 -0
  354. package/dist/supervisor-run/index.d.ts +189 -153
  355. package/dist/supervisor-run/index.d.ts.map +1 -1
  356. package/dist/supervisor-run/index.js +58 -450
  357. package/dist/supervisor-run/index.js.map +1 -1
  358. package/dist/{systemone-CpTLAlqb.d.ts → systemone-Bp_Ac0p1.d.ts} +6 -6
  359. package/dist/{systemone-CpTLAlqb.d.ts.map → systemone-Bp_Ac0p1.d.ts.map} +1 -1
  360. package/dist/systemone-protocol.js +1 -1
  361. package/dist/{systemone-review-B_yo1xsd.d.ts → systemone-review-CwE6JGIp.d.ts} +2 -2
  362. package/dist/{systemone-review-B_yo1xsd.d.ts.map → systemone-review-CwE6JGIp.d.ts.map} +1 -1
  363. package/dist/{systemone-review-BZWfrtq1.js → systemone-review-DzdOJ8I6.js} +3 -3
  364. package/dist/{systemone-review-BZWfrtq1.js.map → systemone-review-DzdOJ8I6.js.map} +1 -1
  365. package/dist/systemone.d.ts +5 -5
  366. package/dist/systemone.js +5 -5
  367. package/dist/systemone.js.map +1 -1
  368. package/dist/{task-failure-attributes-DngaLdE4.js → task-failure-attributes-BMsblaDh.js} +3 -3
  369. package/dist/task-failure-attributes-BMsblaDh.js.map +1 -0
  370. package/dist/{terminal-record-BHocwFw1.js → terminal-record-78g6E4vh.js} +17 -13
  371. package/dist/terminal-record-78g6E4vh.js.map +1 -0
  372. package/dist/{tool-groups-mcxOXVlb.d.ts → tool-groups-DyNz2JZ_.d.ts} +3 -3
  373. package/dist/tool-groups-DyNz2JZ_.d.ts.map +1 -0
  374. package/dist/{tool-waste-Wi4g6Ekb.d.ts → tool-waste-CkjzWmeY.d.ts} +53 -56
  375. package/dist/tool-waste-CkjzWmeY.d.ts.map +1 -0
  376. package/dist/{tool-waste-D52PqU9Q.js → tool-waste-DLsjS_p-.js} +5 -5
  377. package/dist/{tool-waste-D52PqU9Q.js.map → tool-waste-DLsjS_p-.js.map} +1 -1
  378. package/dist/{trace-questions-DG7nqLQ7.d.ts → trace-questions-xxwgsuMi.d.ts} +5 -10
  379. package/dist/{trace-questions-DG7nqLQ7.d.ts.map → trace-questions-xxwgsuMi.d.ts.map} +1 -1
  380. package/dist/trace-repair/index.d.ts +15 -212
  381. package/dist/trace-repair/index.d.ts.map +1 -1
  382. package/dist/trace-repair/index.js +865 -987
  383. package/dist/trace-repair/index.js.map +1 -1
  384. package/dist/traces.d.ts +76 -86
  385. package/dist/traces.d.ts.map +1 -1
  386. package/dist/traces.js +13 -13
  387. package/dist/traces.js.map +1 -1
  388. package/dist/trajectory-replay/index.d.ts +3 -117
  389. package/dist/trajectory-replay/index.d.ts.map +1 -1
  390. package/dist/trajectory-replay/index.js +98 -56
  391. package/dist/trajectory-replay/index.js.map +1 -1
  392. package/dist/{tree-rXLW3M_4.js → tree-BGRglkKd.js} +2355 -2414
  393. package/dist/tree-BGRglkKd.js.map +1 -0
  394. package/dist/{types-B3jzCp0p.js → types-BXgASBCL.js} +2 -2
  395. package/dist/{types-B3jzCp0p.js.map → types-BXgASBCL.js.map} +1 -1
  396. package/dist/{types-oKRhQAde.d.ts → types-CW8ewATZ.d.ts} +5 -114
  397. package/dist/types-CW8ewATZ.d.ts.map +1 -0
  398. package/dist/{types-BqkVmHfv.d.ts → types-CmXY0PQf.d.ts} +2 -4
  399. package/dist/types-CmXY0PQf.d.ts.map +1 -0
  400. package/dist/{types-DBZ7keha.d.ts → types-D-mgRzlh.d.ts} +9 -72
  401. package/dist/types-D-mgRzlh.d.ts.map +1 -0
  402. package/dist/{types-B4C5nFw6.d.ts → types-D8GhJoHk.d.ts} +79 -75
  403. package/dist/types-D8GhJoHk.d.ts.map +1 -0
  404. package/dist/{types-IXD2HJzu.js → types-DqFMNTgK.js} +2 -4
  405. package/dist/types-DqFMNTgK.js.map +1 -0
  406. package/dist/{types-CfZMIzB_.d.ts → types-DtMbFw6U.d.ts} +3 -3
  407. package/dist/{types-CfZMIzB_.d.ts.map → types-DtMbFw6U.d.ts.map} +1 -1
  408. package/dist/{verdict-DhPoXApk.js → verdict-BGQmxQ8A.js} +3 -3
  409. package/dist/verdict-BGQmxQ8A.js.map +1 -0
  410. package/dist/{verdict-E4eRNf7-.d.ts → verdict-C24NELtN.d.ts} +2 -15
  411. package/dist/{verdict-E4eRNf7-.d.ts.map → verdict-C24NELtN.d.ts.map} +1 -1
  412. package/dist/{verdict-cache-BQEsVy9n.js → verdict-cache-CL_7tePD.js} +2 -2
  413. package/dist/verdict-cache-CL_7tePD.js.map +1 -0
  414. package/dist/wire/index.d.ts +32 -411
  415. package/dist/wire/index.d.ts.map +1 -1
  416. package/dist/wire/index.js +2 -2
  417. package/docs/changes/jev-evidence-review.md +1 -1
  418. package/docs/changes/jev-product-adoption.md +1 -1
  419. package/docs/changes/jev-recorded-evidence.md +1 -1
  420. package/docs/design/mlbenchmarks-book-review.md +1 -1
  421. package/docs/design/mlbenchmarks-review/probes.mts +23 -31
  422. package/docs/design/statistics-decisions.md +17 -17
  423. package/docs/design.md +1 -1
  424. package/docs/evaluation-integrity.md +1 -1
  425. package/docs/experiment.md +1 -1
  426. package/docs/proofs/campaign-attempt-retention-20261001/README.md +2 -2
  427. package/docs/public-api.md +138 -529
  428. package/docs/rollout.md +1 -1
  429. package/docs/trace-repair-admission.md +1 -1
  430. package/docs/wire-protocol.md +1 -1
  431. package/package.json +1 -1
  432. package/dist/active-curriculum-B_Lc9kfO.js +0 -61
  433. package/dist/active-curriculum-B_Lc9kfO.js.map +0 -1
  434. package/dist/agent-profile-CIA2Atnt.d.ts.map +0 -1
  435. package/dist/agent-profile-cell-BNp-Js9F.d.ts.map +0 -1
  436. package/dist/agent-profile-cell-BYc0bxsL.js.map +0 -1
  437. package/dist/agreement-irr-DsTURxdr.js.map +0 -1
  438. package/dist/analyze-runs-3xpby3p2.js.map +0 -1
  439. package/dist/analyze-runs-CSDAh8A7.d.ts.map +0 -1
  440. package/dist/ast-DJ6Bc7ab.js +0 -558
  441. package/dist/ast-DJ6Bc7ab.js.map +0 -1
  442. package/dist/ast-hI-vjW6J.d.ts +0 -457
  443. package/dist/ast-hI-vjW6J.d.ts.map +0 -1
  444. package/dist/baseline-Dm8966du.js +0 -259
  445. package/dist/baseline-Dm8966du.js.map +0 -1
  446. package/dist/benchmark-BywPeAUo.js +0 -562
  447. package/dist/benchmark-BywPeAUo.js.map +0 -1
  448. package/dist/benchmark-command-CByl9dxG.js.map +0 -1
  449. package/dist/campaign-BQ-Jujuj.js.map +0 -1
  450. package/dist/chat-json-call-BrKsyspg.js.map +0 -1
  451. package/dist/claim-BXcZw-jo.js.map +0 -1
  452. package/dist/claude-jsonl-dZir12m6.js +0 -86
  453. package/dist/claude-jsonl-dZir12m6.js.map +0 -1
  454. package/dist/client-BzL9niqi.d.ts.map +0 -1
  455. package/dist/cost-ledger-CO7UyEcQ.d.ts.map +0 -1
  456. package/dist/cost-ledger-D2FnJPBF.js.map +0 -1
  457. package/dist/counterfactual-CPaWN99-.d.ts +0 -60
  458. package/dist/counterfactual-CPaWN99-.d.ts.map +0 -1
  459. package/dist/counterfactual-DtMWvn7D.js +0 -98
  460. package/dist/counterfactual-DtMWvn7D.js.map +0 -1
  461. package/dist/default-registry-BrWh62zf.d.ts.map +0 -1
  462. package/dist/default-registry-Cn1LQ2Ve.js.map +0 -1
  463. package/dist/define-agent-eval-CEWkX5wZ.d.ts.map +0 -1
  464. package/dist/define-agent-eval-Ch3MWX6k.js.map +0 -1
  465. package/dist/dspy-rlm-engine-D-KX_e64.js.map +0 -1
  466. package/dist/effect-sizes-DiH8MGOH.js +0 -82
  467. package/dist/effect-sizes-DiH8MGOH.js.map +0 -1
  468. package/dist/emitter-HcCmFQl_.d.ts.map +0 -1
  469. package/dist/engine-C_zNWfM8.d.ts.map +0 -1
  470. package/dist/equal-terms-Blx9Zk5I.js.map +0 -1
  471. package/dist/evaluation-Cn2dRZIz.d.ts.map +0 -1
  472. package/dist/exporters-X4xwla8A.js.map +0 -1
  473. package/dist/external-optimizer-process-nnsY5D_4.js.map +0 -1
  474. package/dist/external-optimizer-subprocess-DcerlZSG.js.map +0 -1
  475. package/dist/failure-cluster-CbgEDcFJ.d.ts.map +0 -1
  476. package/dist/feedback-trajectory-DkaDj0dj.d.ts.map +0 -1
  477. package/dist/hf-dataset-BR2yhuNn.js.map +0 -1
  478. package/dist/index-CPJJr98o.d.ts.map +0 -1
  479. package/dist/index-Ch9VxCpK.d.ts.map +0 -1
  480. package/dist/index-DHKEAv3s.d.ts.map +0 -1
  481. package/dist/index-DlH0Y9gI.d.ts.map +0 -1
  482. package/dist/index-NvGBiO8H.d.ts.map +0 -1
  483. package/dist/integrity-BV1ZDf42.js.map +0 -1
  484. package/dist/journal-DvKCvjty.js.map +0 -1
  485. package/dist/judge-gate-B1qYnkpi.js.map +0 -1
  486. package/dist/judge-gate-DNcUrRFA.d.ts.map +0 -1
  487. package/dist/kind-factory-CbZ-6tvu.js.map +0 -1
  488. package/dist/ledger-core-B2hahzrt.js.map +0 -1
  489. package/dist/llm-client-DQveoxSM.js.map +0 -1
  490. package/dist/llm-judge-PXV7Xljl.js.map +0 -1
  491. package/dist/matrix-CHMiebFx.d.ts.map +0 -1
  492. package/dist/matrix-_BV9-Lk5.js.map +0 -1
  493. package/dist/mint-DCGoBYhB.d.ts +0 -155
  494. package/dist/mint-DCGoBYhB.d.ts.map +0 -1
  495. package/dist/normal-DsJZtrJc.js +0 -25
  496. package/dist/normal-DsJZtrJc.js.map +0 -1
  497. package/dist/paired-arms-DzKn0TfY.js.map +0 -1
  498. package/dist/paired-binary-Q36bhn2R.js.map +0 -1
  499. package/dist/paired-promotion-decision-DPKz8ZnF.d.ts.map +0 -1
  500. package/dist/paired-tests-jbwPdSz5.js.map +0 -1
  501. package/dist/prime-protocol-CEE4BR9N.d.ts.map +0 -1
  502. package/dist/prime-protocol-DcAK9pC8.js.map +0 -1
  503. package/dist/produced-state-ZCtDBxAE.js.map +0 -1
  504. package/dist/proposal-findings-BZiMTzAF.js.map +0 -1
  505. package/dist/query-B1D1qp2Z.js.map +0 -1
  506. package/dist/redact-Cveoq6fJ.d.ts.map +0 -1
  507. package/dist/redact-Dk1ZdJEm.js.map +0 -1
  508. package/dist/release-confidence-BK2QCB5M.d.ts.map +0 -1
  509. package/dist/release-confidence-Dbe9AS_X.js.map +0 -1
  510. package/dist/report-command-y8H6RSX8.js.map +0 -1
  511. package/dist/reward-hacking-DHA7c1l8.d.ts.map +0 -1
  512. package/dist/rollout-D9bKKBnZ.js.map +0 -1
  513. package/dist/run-record-D1Hw-Jml.d.ts.map +0 -1
  514. package/dist/run-record-ES07wfz9.js.map +0 -1
  515. package/dist/schema-2g7trUwH.d.ts.map +0 -1
  516. package/dist/schema-BuiujZ-g.js.map +0 -1
  517. package/dist/schema-CSf6qWgZ.js.map +0 -1
  518. package/dist/search-kernel-BztlERLv.js.map +0 -1
  519. package/dist/search-kernel-CpcKH5Ih.d.ts.map +0 -1
  520. package/dist/search-ledger-d7V8o9Lk.js.map +0 -1
  521. package/dist/search-ledger-file-BqOo-bVo.js.map +0 -1
  522. package/dist/search-shipper-er4pK5_Y.js.map +0 -1
  523. package/dist/semantic-concept-judge-zQBG9hHU.js.map +0 -1
  524. package/dist/sequential-D-1PPCmM.js.map +0 -1
  525. package/dist/server-DbcC7xMl.js.map +0 -1
  526. package/dist/skillopt-optimization-method-CCtzralq.js.map +0 -1
  527. package/dist/statistical-heldout-1Gbmex7v.js.map +0 -1
  528. package/dist/statistical-heldout-BeR4bOdg.d.ts.map +0 -1
  529. package/dist/steps-Bg5-KVx1.d.ts.map +0 -1
  530. package/dist/store-otlp-DtB4Slsr.js.map +0 -1
  531. package/dist/store-tool-spans-DR1SrCLK.d.ts.map +0 -1
  532. package/dist/store-tool-spans-fZIigrpP.js.map +0 -1
  533. package/dist/student-t-BQeKJx2N.js +0 -39
  534. package/dist/student-t-BQeKJx2N.js.map +0 -1
  535. package/dist/summary-report-C-CtItCN.d.ts.map +0 -1
  536. package/dist/summary-report-DtdRucM0.js.map +0 -1
  537. package/dist/task-failure-attributes-DngaLdE4.js.map +0 -1
  538. package/dist/terminal-record-BHocwFw1.js.map +0 -1
  539. package/dist/tool-groups-mcxOXVlb.d.ts.map +0 -1
  540. package/dist/tool-waste-Wi4g6Ekb.d.ts.map +0 -1
  541. package/dist/trajectory-Y1fmdlw7.d.ts +0 -24
  542. package/dist/trajectory-Y1fmdlw7.d.ts.map +0 -1
  543. package/dist/tree-rXLW3M_4.js.map +0 -1
  544. package/dist/types-B4C5nFw6.d.ts.map +0 -1
  545. package/dist/types-BqkVmHfv.d.ts.map +0 -1
  546. package/dist/types-DBZ7keha.d.ts.map +0 -1
  547. package/dist/types-IXD2HJzu.js.map +0 -1
  548. package/dist/types-oKRhQAde.d.ts.map +0 -1
  549. package/dist/usage-receipt-Cx3xNeyB.js +0 -76
  550. package/dist/usage-receipt-Cx3xNeyB.js.map +0 -1
  551. package/dist/verdict-DhPoXApk.js.map +0 -1
  552. package/dist/verdict-cache-BQEsVy9n.js.map +0 -1
  553. package/docs/design/self-improvement-evidence-audit.md +0 -263
@@ -1,8 +1,12 @@
1
- import { t as canonicalJson } from "./verdict-cache-BQEsVy9n.js";
2
- import { c as costForTokenPricing, i as CostLedger } from "./cost-ledger-D2FnJPBF.js";
3
- import { n as appendSearchLedgerLine, r as tryWithSearchLedgerFileLock } from "./search-ledger-file-BqOo-bVo.js";
4
- import { n as ANALYST_SEVERITIES, r as FINDING_SCOPE_FIELDS } from "./types-IXD2HJzu.js";
5
- import { f as ModelSubstitutionError, g as assertServedModelPolicy, h as assertServedModel } from "./llm-client-DQveoxSM.js";
1
+ import { c as errorMessage } from "./errors-BcOs5MKW.js";
2
+ import { t as canonicalJson } from "./verdict-cache-CL_7tePD.js";
3
+ import { c as costForTokenPricing, t as CostLedger } from "./cost-ledger-D0352Z4d.js";
4
+ import { t as deepFreezeCanonicalJson } from "./deep-freeze-CurcOQg3.js";
5
+ import { n as appendSearchLedgerLine, r as tryWithSearchLedgerFileLock } from "./search-ledger-file-UKCO2r8a.js";
6
+ import { n as FINDING_SCOPE_FIELDS, t as ANALYST_SEVERITIES } from "./types-DqFMNTgK.js";
7
+ import { n as isRecord } from "./json-BhdsJaOQ.js";
8
+ import { c as ModelSubstitutionError, d as assertServedModelPolicy, u as assertServedModel } from "./llm-client-BshCREn6.js";
9
+ import { t as isNonnegativeFiniteNumber } from "./nonnegative-number-DvdMxg_f.js";
6
10
  import { createRequire } from "node:module";
7
11
  import { randomBytes } from "node:crypto";
8
12
  import { z } from "zod";
@@ -482,10 +486,68 @@ function isCredentialKey(key) {
482
486
  "token"
483
487
  ].includes(segment));
484
488
  }
485
- function isRecord(value) {
486
- return typeof value === "object" && value !== null && !Array.isArray(value);
489
+ function freezeJsonSnapshot(value, label) {
490
+ assertJsonValue(value, label);
491
+ return deepFreezeCanonicalJson(JSON.parse(canonicalJson(value)));
492
+ }
493
+ //#endregion
494
+ //#region src/campaign/external-optimizer-http.ts
495
+ function listenLocal(server) {
496
+ return new Promise((resolvePromise, reject) => {
497
+ server.once("error", reject);
498
+ server.listen(0, "127.0.0.1", () => {
499
+ server.off("error", reject);
500
+ const address = server.address();
501
+ if (!address || typeof address === "string") {
502
+ reject(/* @__PURE__ */ new Error("external optimizer callback did not bind a TCP port"));
503
+ return;
504
+ }
505
+ resolvePromise(address.port);
506
+ });
507
+ });
508
+ }
509
+ function closeServer(server) {
510
+ return new Promise((resolvePromise, reject) => {
511
+ server.close((error) => error ? reject(error) : resolvePromise());
512
+ });
513
+ }
514
+ function sendJson(response, status, body) {
515
+ response.writeHead(status, { "content-type": "application/json; charset=utf-8" });
516
+ response.end(JSON.stringify(body));
517
+ }
518
+ /**
519
+ * Send a JSON body only while the response can still take one.
520
+ *
521
+ * A handler that lost its client — the request was aborted, or the response
522
+ * already ended — must not write again; Node throws `ERR_STREAM_WRITE_AFTER_END`
523
+ * and the throw escapes into the server's error path rather than the caller's.
524
+ */
525
+ function sendJsonIfOpen(response, status, body) {
526
+ if (response.destroyed || response.writableEnded) return;
527
+ sendJson(response, status, body);
528
+ }
529
+ /**
530
+ * Wait until every in-flight handler has settled.
531
+ *
532
+ * Re-reads the set on each pass: a handler that is still running can register
533
+ * another, so awaiting one snapshot would return while work is outstanding and
534
+ * the caller would close the server under it.
535
+ */
536
+ async function waitForActiveHandlers(activeHandlers) {
537
+ while (activeHandlers.size > 0) await Promise.allSettled([...activeHandlers]);
487
538
  }
488
539
  //#endregion
540
+ //#region src/campaign/external-optimizer-model-contract.ts
541
+ var RequestBodyTooLargeError = class extends Error {};
542
+ var ProviderResponseTooLargeError = class extends Error {
543
+ constructor() {
544
+ super("optimizer model response exceeds maxResponseBytes");
545
+ }
546
+ };
547
+ var MissingModelExecutionError = class extends Error {};
548
+ var ModelExecutionPersistenceError = class extends Error {};
549
+ var OwnerModelContractError = class extends Error {};
550
+ //#endregion
489
551
  //#region src/campaign/external-optimizer-anthropic.ts
490
552
  /**
491
553
  * Translate between the Anthropic Messages API and the canonical owner-call
@@ -953,349 +1015,126 @@ function refuse(message) {
953
1015
  return new AnthropicRequestRefusal(400, "invalid_request_error", message);
954
1016
  }
955
1017
  //#endregion
956
- //#region src/campaign/external-optimizer-http.ts
957
- function listenLocal(server) {
958
- return new Promise((resolvePromise, reject) => {
959
- server.once("error", reject);
960
- server.listen(0, "127.0.0.1", () => {
961
- server.off("error", reject);
962
- const address = server.address();
963
- if (!address || typeof address === "string") {
964
- reject(/* @__PURE__ */ new Error("external optimizer callback did not bind a TCP port"));
965
- return;
966
- }
967
- resolvePromise(address.port);
968
- });
969
- });
970
- }
971
- function closeServer(server) {
972
- return new Promise((resolvePromise, reject) => {
973
- server.close((error) => error ? reject(error) : resolvePromise());
974
- });
1018
+ //#region src/campaign/external-optimizer-model-response.ts
1019
+ function encodeAnthropicResponseBody(args) {
1020
+ const message = encodeAnthropicMessage(args.response, args.callId);
1021
+ const body = new TextEncoder().encode(args.stream ? renderAnthropicSseStream(message) : JSON.stringify(message));
1022
+ if (body.byteLength > args.maxBytes) throw new ProviderResponseTooLargeError();
1023
+ return {
1024
+ contentType: args.stream ? "text/event-stream; charset=utf-8" : "application/json",
1025
+ body
1026
+ };
975
1027
  }
976
- function sendJson(response, status, body) {
977
- response.writeHead(status, { "content-type": "application/json; charset=utf-8" });
978
- response.end(JSON.stringify(body));
1028
+ function encodeCanonicalModelResponse(args) {
1029
+ const usage = encodeProtocolUsage(args.path, args.response, args.receipt);
1030
+ const finishReason = args.response.finishReason === void 0 ? "stop" : args.response.finishReason;
1031
+ const body = args.path === "/v1/chat/completions" ? {
1032
+ id: `chatcmpl-${args.callId}`,
1033
+ object: "chat.completion",
1034
+ created: 0,
1035
+ model: args.response.model,
1036
+ choices: [{
1037
+ index: 0,
1038
+ message: {
1039
+ role: "assistant",
1040
+ content: args.response.content
1041
+ },
1042
+ finish_reason: finishReason
1043
+ }],
1044
+ ...usage ? { usage } : {}
1045
+ } : {
1046
+ id: `resp-${args.callId}`,
1047
+ object: "response",
1048
+ created_at: 0,
1049
+ model: args.response.model,
1050
+ status: finishReason === "length" ? "incomplete" : "completed",
1051
+ error: null,
1052
+ incomplete_details: finishReason === "length" ? { reason: "max_output_tokens" } : null,
1053
+ output: [{
1054
+ id: `msg-${args.callId}`,
1055
+ type: "message",
1056
+ status: finishReason === "length" ? "incomplete" : "completed",
1057
+ role: "assistant",
1058
+ content: [{
1059
+ type: "output_text",
1060
+ text: args.response.content,
1061
+ annotations: []
1062
+ }]
1063
+ }],
1064
+ output_text: args.response.content,
1065
+ ...usage ? { usage } : {}
1066
+ };
1067
+ const encoded = new TextEncoder().encode(JSON.stringify(body));
1068
+ if (encoded.byteLength > args.maxBytes) throw new ProviderResponseTooLargeError();
1069
+ return encoded;
979
1070
  }
980
- /**
981
- * Send a JSON body only while the response can still take one.
982
- *
983
- * A handler that lost its client — the request was aborted, or the response
984
- * already ended — must not write again; Node throws `ERR_STREAM_WRITE_AFTER_END`
985
- * and the throw escapes into the server's error path rather than the caller's.
986
- */
987
- function sendJsonIfOpen(response, status, body) {
988
- if (response.destroyed || response.writableEnded) return;
989
- sendJson(response, status, body);
1071
+ function endpointFormat(path) {
1072
+ if (path === "/v1/messages") return "anthropic-messages";
1073
+ return path === "/v1/responses" ? "responses" : "chat-completions";
990
1074
  }
991
- /**
992
- * Wait until every in-flight handler has settled.
993
- *
994
- * Re-reads the set on each pass: a handler that is still running can register
995
- * another, so awaiting one snapshot would return while work is outstanding and
996
- * the caller would close the server under it.
997
- */
998
- async function waitForActiveHandlers(activeHandlers) {
999
- while (activeHandlers.size > 0) await Promise.allSettled([...activeHandlers]);
1075
+ function encodeProtocolUsage(path, response, receipt) {
1076
+ if (response.usage.captured === false) return void 0;
1077
+ const inputDetails = {
1078
+ ...receipt.cachedTokens === void 0 ? {} : { cached_tokens: receipt.cachedTokens },
1079
+ ...receipt.cacheWriteTokens === void 0 ? {} : path === "/v1/chat/completions" ? { cache_creation_tokens: receipt.cacheWriteTokens } : { cache_write_tokens: receipt.cacheWriteTokens }
1080
+ };
1081
+ const outputDetails = { ...receipt.reasoningTokens === void 0 ? {} : { reasoning_tokens: receipt.reasoningTokens } };
1082
+ return path === "/v1/chat/completions" ? {
1083
+ prompt_tokens: response.usage.promptTokens,
1084
+ completion_tokens: response.usage.completionTokens,
1085
+ total_tokens: response.usage.totalTokens,
1086
+ ...Object.keys(inputDetails).length > 0 ? { prompt_tokens_details: inputDetails } : {},
1087
+ ...Object.keys(outputDetails).length > 0 ? { completion_tokens_details: outputDetails } : {},
1088
+ ...receipt.actualCostUsd === void 0 ? {} : { cost: receipt.actualCostUsd }
1089
+ } : {
1090
+ input_tokens: response.usage.promptTokens,
1091
+ output_tokens: response.usage.completionTokens,
1092
+ total_tokens: response.usage.totalTokens,
1093
+ ...Object.keys(inputDetails).length > 0 ? { input_tokens_details: inputDetails } : {},
1094
+ ...Object.keys(outputDetails).length > 0 ? { output_tokens_details: outputDetails } : {},
1095
+ ...receipt.actualCostUsd === void 0 ? {} : { cost: receipt.actualCostUsd }
1096
+ };
1000
1097
  }
1001
1098
  //#endregion
1002
- //#region src/campaign/external-optimizer-model-proxy.ts
1003
- const MODEL_PROXY_PATHS = /* @__PURE__ */ new Set(["/v1/chat/completions", "/v1/responses"]);
1004
- /**
1005
- * Put an OpenAI-compatible optimizer behind the shared cost ledger.
1006
- *
1007
- * The child process receives only a loopback URL and an ephemeral token. The
1008
- * package that owns execution receives a validated immutable request through
1009
- * `call`; Eval receives no provider credential. Every request reserves its
1010
- * conservative byte-count input bound plus the declared output cap before the
1011
- * owner is invoked exactly once.
1012
- */
1013
- async function startExternalOptimizerModelProxy(args) {
1014
- assertModelProxyConfig(args);
1015
- args.signal?.throwIfAborted();
1016
- const token = randomLocalToken();
1017
- let requestCount = 0;
1018
- let successfulCompletionCount = 0;
1019
- const wireCounts = {
1020
- openai: {
1021
- requestAttempts: 0,
1022
- successfulCompletions: 0
1023
- },
1024
- anthropic: {
1025
- requestAttempts: 0,
1026
- successfulCompletions: 0
1027
- }
1028
- };
1029
- let modelCallInvocations = 0;
1030
- let executionRecordCount = 0;
1031
- let executionSequence = 0;
1032
- const failures = [];
1033
- let totalRequestCount = args.initialUsage?.requests ?? 0;
1034
- let committedForBudget = args.initialUsage?.costUsd ?? 0;
1035
- let reservedForBudget = 0;
1036
- let accepting = true;
1037
- let closePromise;
1038
- const activeControllers = /* @__PURE__ */ new Set();
1039
- const activeHandlers = /* @__PURE__ */ new Set();
1040
- const server = createServer((request, response) => {
1041
- if (!accepting) {
1042
- sendJsonIfOpen(response, 503, { error: "external optimizer model proxy is closing" });
1043
- return;
1044
- }
1045
- const controller = new AbortController();
1046
- const abortRequest = () => {
1047
- request.destroy();
1048
- response.destroy();
1049
- };
1050
- activeControllers.add(controller);
1051
- controller.signal.addEventListener("abort", abortRequest, { once: true });
1052
- let handler;
1053
- handler = handleModelProxyRequest({
1054
- request,
1055
- response,
1056
- controller,
1057
- token,
1058
- args,
1059
- nextReservation: (maximumCostUsd, wire) => {
1060
- if (totalRequestCount >= args.budget.maxRequests) return {
1061
- accepted: false,
1062
- reason: "optimizer model request limit reached"
1063
- };
1064
- if (args.budget.maxCostUsd !== void 0 && maximumCostUsd !== void 0 && committedForBudget + reservedForBudget + maximumCostUsd > args.budget.maxCostUsd + Number.EPSILON) return {
1065
- accepted: false,
1066
- reason: "optimizer model cost limit reached"
1067
- };
1068
- requestCount += 1;
1069
- wireCounts[wire].requestAttempts += 1;
1070
- totalRequestCount += 1;
1071
- reservedForBudget += maximumCostUsd ?? 0;
1072
- return { accepted: true };
1073
- },
1074
- settleReservation: (maximumCostUsd, chargedCostUsd) => {
1075
- reservedForBudget = Math.max(0, reservedForBudget - (maximumCostUsd ?? 0));
1076
- committedForBudget += chargedCostUsd ?? 0;
1077
- },
1078
- recordSuccessfulCompletion: (wire) => {
1079
- successfulCompletionCount += 1;
1080
- wireCounts[wire].successfulCompletions += 1;
1081
- },
1082
- recordExecutionReceipt: (observation) => {
1083
- try {
1084
- args.recordExecution({
1085
- ...observation,
1086
- sequence: executionSequence + 1
1087
- });
1088
- } catch (error) {
1089
- throw new ModelExecutionPersistenceError(`optimizer model execution evidence was not persisted: ${toErrorMessage(error)}`);
1090
- }
1091
- executionSequence += 1;
1092
- executionRecordCount += 1;
1093
- },
1094
- recordModelCallInvocation: () => {
1095
- modelCallInvocations += 1;
1096
- },
1097
- recordFailure: (error) => {
1098
- failures.push(error);
1099
- }
1100
- }).finally(() => {
1101
- controller.signal.removeEventListener("abort", abortRequest);
1102
- activeControllers.delete(controller);
1103
- activeHandlers.delete(handler);
1104
- });
1105
- activeHandlers.add(handler);
1106
- handler.catch(() => void 0);
1107
- });
1108
- const port = await listenLocal(server);
1109
- const close = () => {
1110
- closePromise ??= closeModelProxy();
1111
- return closePromise;
1112
- };
1113
- const onAbort = () => {
1114
- for (const controller of activeControllers) controller.abort(args.signal?.reason);
1115
- close().catch(() => void 0);
1116
- };
1117
- args.signal?.addEventListener("abort", onAbort, { once: true });
1118
- if (args.signal?.aborted) onAbort();
1119
- const assertExecutionComplete = () => {
1120
- if (executionRecordCount !== modelCallInvocations) throw new Error(`external optimizer model callback returned ${executionRecordCount} execution records for ${modelCallInvocations} invoked calls`);
1121
- };
1122
- return {
1123
- baseUrl: `http://127.0.0.1:${port}/v1`,
1124
- apiKey: token,
1125
- requestAttempts: () => requestCount,
1126
- successfulCompletions: () => successfulCompletionCount,
1127
- wireUsage: () => ({
1128
- openai: { ...wireCounts.openai },
1129
- anthropic: { ...wireCounts.anthropic }
1130
- }),
1131
- assertExecutionComplete,
1132
- failures: () => [...failures],
1133
- close
1134
- };
1135
- async function closeModelProxy() {
1136
- args.signal?.removeEventListener("abort", onAbort);
1137
- accepting = false;
1138
- const closingServer = closeServer(server);
1139
- server.closeIdleConnections?.();
1140
- const [serverResult] = await Promise.allSettled([closingServer, waitForActiveHandlers(activeHandlers)]);
1141
- if (activeControllers.size !== 0 || activeHandlers.size !== 0) throw new Error("external optimizer model proxy closed with active request work");
1142
- let executionError;
1143
- try {
1144
- assertExecutionComplete();
1145
- } catch (error) {
1146
- executionError = error;
1147
- }
1148
- if (serverResult?.status === "rejected" && executionError !== void 0) throw new AggregateError([serverResult.reason, executionError], "external optimizer model proxy close and execution evidence both failed");
1149
- if (serverResult?.status === "rejected") throw serverResult.reason;
1150
- if (executionError !== void 0) throw executionError;
1151
- }
1152
- }
1153
- async function handleModelProxyRequest(args) {
1154
- const { controller, request, response } = args;
1155
- let wire = "openai";
1156
- const respondError = (status, message, errorType) => {
1157
- if (wire === "anthropic") {
1158
- const mapped = status === 429 ? 402 : status;
1159
- sendJsonIfOpen(response, mapped, anthropicErrorEnvelope(errorType ?? anthropicErrorTypeForStatus(mapped), message));
1160
- return;
1161
- }
1162
- sendJsonIfOpen(response, status, { error: message });
1163
- };
1164
- try {
1165
- const path = request.url ? new URL(request.url, "http://127.0.0.1").pathname : "";
1166
- const anthropicPath = path === "/v1/messages" && args.args.anthropicEndpoint === true;
1167
- if (request.method !== "POST" || !(MODEL_PROXY_PATHS.has(path) || anthropicPath)) {
1168
- sendJsonIfOpen(response, 404, { error: "not found" });
1169
- return;
1170
- }
1171
- if (anthropicPath) wire = "anthropic";
1172
- const modelPath = path;
1173
- if (!(request.headers.authorization === `Bearer ${args.token}` || wire === "anthropic" && request.headers["x-api-key"] === args.token)) {
1174
- respondError(401, "unauthorized");
1175
- return;
1176
- }
1177
- const body = await readBody(request, args.args.budget.maxRequestBytes);
1178
- const parsed = parseModelProxyRequest(body, modelPath, args.args.model, args.args.budget);
1179
- const maximumUsage = conservativeMaximumUsage(body.byteLength, parsed.maxOutputTokens + (args.args.budget.maxReasoningTokensPerRequest ?? 0), args.args.budget.pricing);
1180
- const maximumCostUsd = args.args.budget.pricing ? costForTokenPricing(args.args.budget.pricing, maximumUsage) : void 0;
1181
- const reservation = args.nextReservation(maximumCostUsd, wire);
1182
- if (!reservation.accepted) {
1183
- respondError(429, reservation.reason);
1184
- return;
1185
- }
1186
- const timeout = setTimeout(() => controller.abort(), args.args.budget.requestTimeoutMs ?? 3e5);
1187
- let chargedForBudget = maximumCostUsd;
1188
- try {
1189
- const requestTags = wire === "anthropic" ? {
1190
- ...args.args.tags ?? {},
1191
- wire: "anthropic",
1192
- ...parsed.strippedFields === void 0 ? {} : { strippedFields: parsed.strippedFields.join(",") }
1193
- } : args.args.tags;
1194
- const paid = await args.args.costLedger.runPaidCall({
1195
- ...args.args.callId ? { callId: args.args.callId } : {},
1196
- channel: args.args.channel ?? "optimizer",
1197
- phase: args.args.phase,
1198
- actor: args.args.actor,
1199
- ...requestTags ? { tags: requestTags } : {},
1200
- model: args.args.model,
1201
- ...args.args.budget.pricing ? { maximumCharge: {
1202
- customTokenPricing: args.args.budget.pricing,
1203
- ...maximumUsage
1204
- } } : {},
1205
- signal: controller.signal,
1206
- execute: async (paidCallSignal, paidCallId) => forwardModelProxyRequest({
1207
- call: args.args.call,
1208
- callId: paidCallId,
1209
- callRef: args.args.callRef,
1210
- recordExecutionReceipt: args.recordExecutionReceipt,
1211
- recordModelCallInvocation: args.recordModelCallInvocation,
1212
- path: modelPath,
1213
- request: parsed.request,
1214
- ...parsed.stream === void 0 ? {} : { anthropicStream: parsed.stream },
1215
- model: args.args.model,
1216
- allowWithinFamily: args.args.servedModelPolicy === "allow-within-family",
1217
- maxOutputTokens: parsed.maxOutputTokens,
1218
- ...args.args.budget.maxReasoningTokensPerRequest === void 0 ? {} : { maxReasoningTokens: args.args.budget.maxReasoningTokensPerRequest },
1219
- maxResponseBytes: args.args.budget.maxResponseBytes,
1220
- signal: paidCallSignal
1221
- }),
1222
- receipt: (result) => result.receipt,
1223
- receiptFromError: () => ({
1224
- model: args.args.model,
1225
- inputTokens: 0,
1226
- outputTokens: 0,
1227
- costUnknown: true,
1228
- usageUnknown: true
1229
- })
1230
- });
1231
- if (!paid.succeeded) {
1232
- args.recordFailure(paid.error);
1233
- chargedForBudget = paid.receipt ? paid.receipt.usageUnknown || paid.receipt.costUnknown ? maximumCostUsd : paid.receipt.costUsd : void 0;
1234
- respondError(isAbortError(paid.error) ? 504 : paid.error instanceof AnthropicRequestRefusal ? paid.error.status : paid.error instanceof ProviderResponseTooLargeError || paid.error instanceof MissingModelExecutionError || paid.error instanceof ModelExecutionPersistenceError || paid.error instanceof OwnerModelContractError || paid.error instanceof ModelSubstitutionError ? 502 : 429, paid.error.message, paid.error instanceof AnthropicRequestRefusal ? paid.error.errorType : void 0);
1235
- return;
1236
- }
1237
- if (paid.value.modelCallFailed) {
1238
- respondError(502, paid.value.modelCallFailed);
1239
- return;
1240
- }
1241
- chargedForBudget = paid.value.usageComplete ? paid.receipt.costUsd : maximumCostUsd;
1242
- if (paid.value.usageRejected) {
1243
- respondError(502, paid.value.usageRejected);
1244
- return;
1245
- }
1246
- if (paid.value.status >= 200 && paid.value.status < 300) args.recordSuccessfulCompletion(wire);
1247
- if (response.destroyed || response.writableEnded) return;
1248
- response.writeHead(paid.value.status, {
1249
- "content-type": paid.value.contentType,
1250
- "content-length": String(paid.value.body.byteLength)
1251
- });
1252
- response.end(paid.value.body);
1253
- } finally {
1254
- clearTimeout(timeout);
1255
- args.settleReservation(maximumCostUsd, chargedForBudget);
1256
- }
1257
- } catch (error) {
1258
- respondError(error instanceof AnthropicRequestRefusal ? error.status : error instanceof RequestBodyTooLargeError ? 413 : error instanceof Error && isAbortError(error) ? 503 : 400, toErrorMessage(error), error instanceof AnthropicRequestRefusal ? error.errorType : void 0);
1259
- }
1260
- }
1261
- async function forwardModelProxyRequest(args) {
1262
- args.recordModelCallInvocation();
1263
- let called;
1264
- try {
1265
- called = await args.call({
1266
- callId: args.callId,
1267
- request: freezeJsonSnapshot(args.request, "optimizer model canonical request"),
1268
- endpointFormat: endpointFormat(args.path),
1269
- signal: args.signal
1270
- });
1271
- } catch (error) {
1272
- throw new MissingModelExecutionError(`optimizer model callback rejected without execution evidence: ${toErrorMessage(error)}`);
1273
- }
1274
- if (!called || typeof called !== "object" || typeof called.succeeded !== "boolean") throw new MissingModelExecutionError("optimizer model callback returned no typed success/failure outcome");
1275
- let execution;
1276
- try {
1277
- execution = freezeJsonSnapshot(called.execution, "optimizer model callback execution evidence");
1278
- } catch (error) {
1279
- throw new MissingModelExecutionError(`optimizer model callback returned invalid execution evidence: ${toErrorMessage(error)}`);
1280
- }
1281
- if (called.succeeded) {
1282
- let authoritativeReceipt;
1283
- let canonicalResponse;
1284
- try {
1285
- authoritativeReceipt = snapshotModelReceipt(called.receipt, args.model, args.allowWithinFamily);
1286
- canonicalResponse = snapshotChatResponse(called.response, args.model, args.allowWithinFamily);
1287
- assertResponseUsageMatchesReceipt(canonicalResponse, authoritativeReceipt);
1288
- } catch (error) {
1289
- args.recordExecutionReceipt({
1290
- callId: args.callId,
1291
- callRef: args.callRef,
1292
- path: args.path,
1293
- model: args.model,
1294
- succeeded: false,
1295
- error: toErrorMessage(error),
1296
- execution
1297
- });
1298
- throw error;
1099
+ //#region src/campaign/external-optimizer-model-execution.ts
1100
+ async function forwardModelProxyRequest(args) {
1101
+ args.recordModelCallInvocation();
1102
+ let called;
1103
+ try {
1104
+ called = await args.call({
1105
+ callId: args.callId,
1106
+ request: freezeJsonSnapshot(args.request, "optimizer model canonical request"),
1107
+ endpointFormat: endpointFormat(args.path),
1108
+ signal: args.signal
1109
+ });
1110
+ } catch (error) {
1111
+ throw new MissingModelExecutionError(`optimizer model callback rejected without execution evidence: ${errorMessage(error)}`);
1112
+ }
1113
+ if (!called || typeof called !== "object" || typeof called.succeeded !== "boolean") throw new MissingModelExecutionError("optimizer model callback returned no typed success/failure outcome");
1114
+ let execution;
1115
+ try {
1116
+ execution = freezeJsonSnapshot(called.execution, "optimizer model callback execution evidence");
1117
+ } catch (error) {
1118
+ throw new MissingModelExecutionError(`optimizer model callback returned invalid execution evidence: ${errorMessage(error)}`);
1119
+ }
1120
+ if (called.succeeded) {
1121
+ let authoritativeReceipt;
1122
+ let canonicalResponse;
1123
+ try {
1124
+ authoritativeReceipt = snapshotModelReceipt(called.receipt, args.model, args.allowWithinFamily);
1125
+ canonicalResponse = snapshotChatResponse(called.response, args.model, args.allowWithinFamily);
1126
+ assertResponseUsageMatchesReceipt(canonicalResponse, authoritativeReceipt);
1127
+ } catch (error) {
1128
+ args.recordExecutionReceipt({
1129
+ callId: args.callId,
1130
+ callRef: args.callRef,
1131
+ path: args.path,
1132
+ model: args.model,
1133
+ succeeded: false,
1134
+ error: errorMessage(error),
1135
+ execution
1136
+ });
1137
+ throw error;
1299
1138
  }
1300
1139
  args.recordExecutionReceipt({
1301
1140
  callId: args.callId,
@@ -1361,7 +1200,7 @@ function snapshotModelReceipt(value, expectedModel, allowWithinFamily) {
1361
1200
  assertJsonValue(value, "optimizer model callback receipt");
1362
1201
  snapshot = JSON.parse(canonicalJson(value));
1363
1202
  } catch (error) {
1364
- throw new OwnerModelContractError(`optimizer model callback returned an invalid receipt: ${toErrorMessage(error)}`);
1203
+ throw new OwnerModelContractError(`optimizer model callback returned an invalid receipt: ${errorMessage(error)}`);
1365
1204
  }
1366
1205
  assertServedModel(expectedModel, snapshot.model, {
1367
1206
  context: "optimizer model callback receipt",
@@ -1369,17 +1208,6 @@ function snapshotModelReceipt(value, expectedModel, allowWithinFamily) {
1369
1208
  });
1370
1209
  return snapshot;
1371
1210
  }
1372
- function freezeJsonSnapshot(value, label) {
1373
- assertJsonValue(value, label);
1374
- return deepFreezeJson(JSON.parse(canonicalJson(value)));
1375
- }
1376
- function deepFreezeJson(value) {
1377
- if (value !== null && typeof value === "object") {
1378
- for (const child of Object.values(value)) deepFreezeJson(child);
1379
- Object.freeze(value);
1380
- }
1381
- return value;
1382
- }
1383
1211
  function assertResponseUsageMatchesReceipt(response, receipt) {
1384
1212
  if (response.model !== receipt.model) throw new OwnerModelContractError("optimizer model response and execution receipt disagree about the served model");
1385
1213
  if (response.usage.captured === false || receipt.usageUnknown === true) {
@@ -1394,11 +1222,81 @@ function assertResponseUsageMatchesReceipt(response, receipt) {
1394
1222
  const receiptCostUsd = receipt.actualCostUsd ?? receipt.estimatedCostUsd ?? (receipt.customTokenPricing && receipt.usageUnknown !== true ? costForTokenPricing(receipt.customTokenPricing, receipt) : null);
1395
1223
  if (response.costUsd !== receiptCostUsd) throw new OwnerModelContractError("optimizer model response billed cost disagrees with the execution receipt");
1396
1224
  }
1397
- function parseModelProxyRequest(body, path, expectedModel, budget) {
1398
- if (path === "/v1/messages") {
1399
- const translated = translateAnthropicMessagesRequest(body, expectedModel, budget.maxOutputTokensPerRequest);
1400
- return {
1401
- maxOutputTokens: translated.maxOutputTokens,
1225
+ function snapshotChatResponse(value, expectedModel, allowWithinFamily) {
1226
+ if (!isRecord(value)) throw new OwnerModelContractError("optimizer model callback response must be an object");
1227
+ if (typeof value.content !== "string") throw new OwnerModelContractError("optimizer model callback response content must be a string");
1228
+ assertServedModel(expectedModel, typeof value.model === "string" ? value.model : null, {
1229
+ context: "optimizer model callback response",
1230
+ allowWithinFamily
1231
+ });
1232
+ if (!isNonnegativeFiniteNumber(value.durationMs)) throw new OwnerModelContractError("optimizer model callback response durationMs must be finite and non-negative");
1233
+ if (value.costUsd !== null && !isNonnegativeFiniteNumber(value.costUsd)) throw new OwnerModelContractError("optimizer model callback response costUsd must be null or finite and non-negative");
1234
+ if (value.finishReason !== void 0 && value.finishReason !== null && typeof value.finishReason !== "string") throw new OwnerModelContractError("optimizer model callback response finishReason must be a string or null");
1235
+ const toolCalls = snapshotResponseToolCalls(value.toolCalls);
1236
+ if (value.contentEmpty !== void 0 && (typeof value.contentEmpty !== "boolean" || value.contentEmpty !== (value.content.trim().length === 0))) throw new OwnerModelContractError("optimizer model callback response contentEmpty must match content");
1237
+ if (!isRecord(value.raw)) throw new OwnerModelContractError("optimizer model callback response raw must be an object");
1238
+ if (!isRecord(value.usage)) throw new OwnerModelContractError("optimizer model callback response usage must be an object");
1239
+ const usage = value.usage;
1240
+ for (const field of [
1241
+ "promptTokens",
1242
+ "completionTokens",
1243
+ "totalTokens"
1244
+ ]) if (!isNonnegativeSafeInteger(usage[field])) throw new OwnerModelContractError(`optimizer model callback response usage.${field} must be a non-negative safe integer`);
1245
+ const promptTokens = usage.promptTokens;
1246
+ const completionTokens = usage.completionTokens;
1247
+ const totalTokens = usage.totalTokens;
1248
+ if (totalTokens !== promptTokens + completionTokens) throw new OwnerModelContractError("optimizer model callback response totalTokens must equal promptTokens plus completionTokens");
1249
+ if (usage.captured !== void 0 && typeof usage.captured !== "boolean") throw new OwnerModelContractError("optimizer model callback response usage.captured must be a boolean");
1250
+ if (usage.cachedPromptTokens !== void 0 && (!isNonnegativeSafeInteger(usage.cachedPromptTokens) || usage.cachedPromptTokens > promptTokens)) throw new OwnerModelContractError("optimizer model callback response cachedPromptTokens must be a subset of promptTokens");
1251
+ if (usage.reasoningTokens !== void 0 && (!isNonnegativeSafeInteger(usage.reasoningTokens) || usage.reasoningTokens > completionTokens)) throw new OwnerModelContractError("optimizer model callback response reasoningTokens must be a subset of completionTokens");
1252
+ let raw;
1253
+ try {
1254
+ raw = freezeJsonSnapshot(value.raw, "optimizer model callback canonical response.raw");
1255
+ } catch (error) {
1256
+ throw new OwnerModelContractError(`optimizer model callback returned invalid raw response evidence: ${errorMessage(error)}`);
1257
+ }
1258
+ return deepFreezeCanonicalJson({
1259
+ content: value.content,
1260
+ ...toolCalls === void 0 ? {} : { toolCalls },
1261
+ usage: {
1262
+ promptTokens,
1263
+ completionTokens,
1264
+ totalTokens,
1265
+ ...usage.captured === void 0 ? {} : { captured: usage.captured },
1266
+ ...usage.reasoningTokens === void 0 ? {} : { reasoningTokens: usage.reasoningTokens },
1267
+ ...usage.cachedPromptTokens === void 0 ? {} : { cachedPromptTokens: usage.cachedPromptTokens }
1268
+ },
1269
+ costUsd: value.costUsd,
1270
+ model: value.model,
1271
+ durationMs: value.durationMs,
1272
+ ...value.finishReason === void 0 ? {} : { finishReason: value.finishReason },
1273
+ ...value.contentEmpty === void 0 ? {} : { contentEmpty: value.contentEmpty },
1274
+ raw
1275
+ });
1276
+ }
1277
+ /** Snapshot the owner's canonical tool calls onto the allowlisted response. */
1278
+ function snapshotResponseToolCalls(value) {
1279
+ if (value === void 0) return void 0;
1280
+ if (!Array.isArray(value) || value.length === 0) throw new OwnerModelContractError("optimizer model callback response toolCalls must be a non-empty array when present");
1281
+ return value.map((entry) => {
1282
+ if (!isRecord(entry) || typeof entry.id !== "string" || !entry.id || typeof entry.name !== "string" || !entry.name || typeof entry.argumentsJson !== "string") throw new OwnerModelContractError("optimizer model callback response toolCalls entries require string id, name, and argumentsJson");
1283
+ return {
1284
+ id: entry.id,
1285
+ name: entry.name,
1286
+ argumentsJson: entry.argumentsJson
1287
+ };
1288
+ });
1289
+ }
1290
+ function isNonnegativeSafeInteger(value) {
1291
+ return Number.isSafeInteger(value) && value >= 0;
1292
+ }
1293
+ //#endregion
1294
+ //#region src/campaign/external-optimizer-model-request.ts
1295
+ function parseModelProxyRequest(body, path, expectedModel, budget) {
1296
+ if (path === "/v1/messages") {
1297
+ const translated = translateAnthropicMessagesRequest(body, expectedModel, budget.maxOutputTokensPerRequest);
1298
+ return {
1299
+ maxOutputTokens: translated.maxOutputTokens,
1402
1300
  stream: translated.stream,
1403
1301
  ...translated.strippedFields.length > 0 ? { strippedFields: translated.strippedFields } : {},
1404
1302
  request: freezeJsonSnapshot(translated.request, "optimizer model canonical request")
@@ -1653,169 +1551,309 @@ function assertAllowedKeys(value, allowed, label = "optimizer model request") {
1653
1551
  const unknown = Object.keys(value).filter((key) => !allowedSet.has(key));
1654
1552
  if (unknown.length > 0) throw new Error(`${label} contains unsupported fields: ${unknown.join(", ")}`);
1655
1553
  }
1656
- function snapshotChatResponse(value, expectedModel, allowWithinFamily) {
1657
- if (!isRecord(value)) throw new OwnerModelContractError("optimizer model callback response must be an object");
1658
- if (typeof value.content !== "string") throw new OwnerModelContractError("optimizer model callback response content must be a string");
1659
- assertServedModel(expectedModel, typeof value.model === "string" ? value.model : null, {
1660
- context: "optimizer model callback response",
1661
- allowWithinFamily
1662
- });
1663
- if (!isNonnegativeFiniteNumber(value.durationMs)) throw new OwnerModelContractError("optimizer model callback response durationMs must be finite and non-negative");
1664
- if (value.costUsd !== null && !isNonnegativeFiniteNumber(value.costUsd)) throw new OwnerModelContractError("optimizer model callback response costUsd must be null or finite and non-negative");
1665
- if (value.finishReason !== void 0 && value.finishReason !== null && typeof value.finishReason !== "string") throw new OwnerModelContractError("optimizer model callback response finishReason must be a string or null");
1666
- const toolCalls = snapshotResponseToolCalls(value.toolCalls);
1667
- if (value.contentEmpty !== void 0 && (typeof value.contentEmpty !== "boolean" || value.contentEmpty !== (value.content.trim().length === 0))) throw new OwnerModelContractError("optimizer model callback response contentEmpty must match content");
1668
- if (!isRecord(value.raw)) throw new OwnerModelContractError("optimizer model callback response raw must be an object");
1669
- if (!isRecord(value.usage)) throw new OwnerModelContractError("optimizer model callback response usage must be an object");
1670
- const usage = value.usage;
1671
- for (const field of [
1672
- "promptTokens",
1673
- "completionTokens",
1674
- "totalTokens"
1675
- ]) if (!isNonnegativeSafeInteger(usage[field])) throw new OwnerModelContractError(`optimizer model callback response usage.${field} must be a non-negative safe integer`);
1676
- const promptTokens = usage.promptTokens;
1677
- const completionTokens = usage.completionTokens;
1678
- const totalTokens = usage.totalTokens;
1679
- if (totalTokens !== promptTokens + completionTokens) throw new OwnerModelContractError("optimizer model callback response totalTokens must equal promptTokens plus completionTokens");
1680
- if (usage.captured !== void 0 && typeof usage.captured !== "boolean") throw new OwnerModelContractError("optimizer model callback response usage.captured must be a boolean");
1681
- if (usage.cachedPromptTokens !== void 0 && (!isNonnegativeSafeInteger(usage.cachedPromptTokens) || usage.cachedPromptTokens > promptTokens)) throw new OwnerModelContractError("optimizer model callback response cachedPromptTokens must be a subset of promptTokens");
1682
- if (usage.reasoningTokens !== void 0 && (!isNonnegativeSafeInteger(usage.reasoningTokens) || usage.reasoningTokens > completionTokens)) throw new OwnerModelContractError("optimizer model callback response reasoningTokens must be a subset of completionTokens");
1683
- let raw;
1554
+ //#endregion
1555
+ //#region src/campaign/external-optimizer-model-handler.ts
1556
+ const MODEL_PROXY_PATHS = /* @__PURE__ */ new Set(["/v1/chat/completions", "/v1/responses"]);
1557
+ async function handleModelProxyRequest(args) {
1558
+ const { controller, request, response } = args;
1559
+ let wire = "openai";
1560
+ const respondError = (status, message, errorType) => {
1561
+ if (wire === "anthropic") {
1562
+ const mapped = status === 429 ? 402 : status;
1563
+ sendJsonIfOpen(response, mapped, anthropicErrorEnvelope(errorType ?? anthropicErrorTypeForStatus(mapped), message));
1564
+ return;
1565
+ }
1566
+ sendJsonIfOpen(response, status, { error: message });
1567
+ };
1684
1568
  try {
1685
- raw = freezeJsonSnapshot(value.raw, "optimizer model callback canonical response.raw");
1569
+ const path = request.url ? new URL(request.url, "http://127.0.0.1").pathname : "";
1570
+ const anthropicPath = path === "/v1/messages" && args.args.anthropicEndpoint === true;
1571
+ if (request.method !== "POST" || !(MODEL_PROXY_PATHS.has(path) || anthropicPath)) {
1572
+ sendJsonIfOpen(response, 404, { error: "not found" });
1573
+ return;
1574
+ }
1575
+ if (anthropicPath) wire = "anthropic";
1576
+ const modelPath = path;
1577
+ if (!(request.headers.authorization === `Bearer ${args.token}` || wire === "anthropic" && request.headers["x-api-key"] === args.token)) {
1578
+ respondError(401, "unauthorized");
1579
+ return;
1580
+ }
1581
+ const body = await readBody(request, args.args.budget.maxRequestBytes);
1582
+ const parsed = parseModelProxyRequest(body, modelPath, args.args.model, args.args.budget);
1583
+ const maximumUsage = conservativeMaximumUsage(body.byteLength, parsed.maxOutputTokens + (args.args.budget.maxReasoningTokensPerRequest ?? 0), args.args.budget.pricing);
1584
+ const maximumCostUsd = args.args.budget.pricing ? costForTokenPricing(args.args.budget.pricing, maximumUsage) : void 0;
1585
+ const reservation = args.nextReservation(maximumCostUsd, wire);
1586
+ if (!reservation.accepted) {
1587
+ respondError(429, reservation.reason);
1588
+ return;
1589
+ }
1590
+ const timeout = setTimeout(() => controller.abort(), args.args.budget.requestTimeoutMs ?? 3e5);
1591
+ let chargedForBudget = maximumCostUsd;
1592
+ try {
1593
+ const requestTags = wire === "anthropic" ? {
1594
+ ...args.args.tags ?? {},
1595
+ wire: "anthropic",
1596
+ ...parsed.strippedFields === void 0 ? {} : { strippedFields: parsed.strippedFields.join(",") }
1597
+ } : args.args.tags;
1598
+ const paid = await args.args.costLedger.runPaidCall({
1599
+ ...args.args.callId ? { callId: args.args.callId } : {},
1600
+ channel: args.args.channel ?? "optimizer",
1601
+ phase: args.args.phase,
1602
+ actor: args.args.actor,
1603
+ ...requestTags ? { tags: requestTags } : {},
1604
+ model: args.args.model,
1605
+ ...args.args.budget.pricing ? { maximumCharge: {
1606
+ customTokenPricing: args.args.budget.pricing,
1607
+ ...maximumUsage
1608
+ } } : {},
1609
+ signal: controller.signal,
1610
+ execute: async (paidCallSignal, paidCallId) => forwardModelProxyRequest({
1611
+ call: args.args.call,
1612
+ callId: paidCallId,
1613
+ callRef: args.args.callRef,
1614
+ recordExecutionReceipt: args.recordExecutionReceipt,
1615
+ recordModelCallInvocation: args.recordModelCallInvocation,
1616
+ path: modelPath,
1617
+ request: parsed.request,
1618
+ ...parsed.stream === void 0 ? {} : { anthropicStream: parsed.stream },
1619
+ model: args.args.model,
1620
+ allowWithinFamily: args.args.servedModelPolicy === "allow-within-family",
1621
+ maxOutputTokens: parsed.maxOutputTokens,
1622
+ ...args.args.budget.maxReasoningTokensPerRequest === void 0 ? {} : { maxReasoningTokens: args.args.budget.maxReasoningTokensPerRequest },
1623
+ maxResponseBytes: args.args.budget.maxResponseBytes,
1624
+ signal: paidCallSignal
1625
+ }),
1626
+ receipt: (result) => result.receipt,
1627
+ receiptFromError: () => ({
1628
+ model: args.args.model,
1629
+ inputTokens: 0,
1630
+ outputTokens: 0,
1631
+ costUnknown: true,
1632
+ usageUnknown: true
1633
+ })
1634
+ });
1635
+ if (!paid.succeeded) {
1636
+ args.recordFailure(paid.error);
1637
+ chargedForBudget = paid.receipt ? paid.receipt.usageUnknown || paid.receipt.costUnknown ? maximumCostUsd : paid.receipt.costUsd : void 0;
1638
+ respondError(isAbortError(paid.error) ? 504 : paid.error instanceof AnthropicRequestRefusal ? paid.error.status : paid.error instanceof ProviderResponseTooLargeError || paid.error instanceof MissingModelExecutionError || paid.error instanceof ModelExecutionPersistenceError || paid.error instanceof OwnerModelContractError || paid.error instanceof ModelSubstitutionError ? 502 : 429, paid.error.message, paid.error instanceof AnthropicRequestRefusal ? paid.error.errorType : void 0);
1639
+ return;
1640
+ }
1641
+ if (paid.value.modelCallFailed) {
1642
+ respondError(502, paid.value.modelCallFailed);
1643
+ return;
1644
+ }
1645
+ chargedForBudget = paid.value.usageComplete ? paid.receipt.costUsd : maximumCostUsd;
1646
+ if (paid.value.usageRejected) {
1647
+ respondError(502, paid.value.usageRejected);
1648
+ return;
1649
+ }
1650
+ if (paid.value.status >= 200 && paid.value.status < 300) args.recordSuccessfulCompletion(wire);
1651
+ if (response.destroyed || response.writableEnded) return;
1652
+ response.writeHead(paid.value.status, {
1653
+ "content-type": paid.value.contentType,
1654
+ "content-length": String(paid.value.body.byteLength)
1655
+ });
1656
+ response.end(paid.value.body);
1657
+ } finally {
1658
+ clearTimeout(timeout);
1659
+ args.settleReservation(maximumCostUsd, chargedForBudget);
1660
+ }
1686
1661
  } catch (error) {
1687
- throw new OwnerModelContractError(`optimizer model callback returned invalid raw response evidence: ${toErrorMessage(error)}`);
1662
+ respondError(error instanceof AnthropicRequestRefusal ? error.status : error instanceof RequestBodyTooLargeError ? 413 : error instanceof Error && isAbortError(error) ? 503 : 400, errorMessage(error), error instanceof AnthropicRequestRefusal ? error.errorType : void 0);
1688
1663
  }
1689
- return deepFreezeJson({
1690
- content: value.content,
1691
- ...toolCalls === void 0 ? {} : { toolCalls },
1692
- usage: {
1693
- promptTokens,
1694
- completionTokens,
1695
- totalTokens,
1696
- ...usage.captured === void 0 ? {} : { captured: usage.captured },
1697
- ...usage.reasoningTokens === void 0 ? {} : { reasoningTokens: usage.reasoningTokens },
1698
- ...usage.cachedPromptTokens === void 0 ? {} : { cachedPromptTokens: usage.cachedPromptTokens }
1699
- },
1700
- costUsd: value.costUsd,
1701
- model: value.model,
1702
- durationMs: value.durationMs,
1703
- ...value.finishReason === void 0 ? {} : { finishReason: value.finishReason },
1704
- ...value.contentEmpty === void 0 ? {} : { contentEmpty: value.contentEmpty },
1705
- raw
1706
- });
1707
- }
1708
- /** Snapshot the owner's canonical tool calls onto the allowlisted response. */
1709
- function snapshotResponseToolCalls(value) {
1710
- if (value === void 0) return void 0;
1711
- if (!Array.isArray(value) || value.length === 0) throw new OwnerModelContractError("optimizer model callback response toolCalls must be a non-empty array when present");
1712
- return value.map((entry) => {
1713
- if (!isRecord(entry) || typeof entry.id !== "string" || !entry.id || typeof entry.name !== "string" || !entry.name || typeof entry.argumentsJson !== "string") throw new OwnerModelContractError("optimizer model callback response toolCalls entries require string id, name, and argumentsJson");
1714
- return {
1715
- id: entry.id,
1716
- name: entry.name,
1717
- argumentsJson: entry.argumentsJson
1718
- };
1719
- });
1720
1664
  }
1721
- function encodeAnthropicResponseBody(args) {
1722
- const message = encodeAnthropicMessage(args.response, args.callId);
1723
- const body = new TextEncoder().encode(args.stream ? renderAnthropicSseStream(message) : JSON.stringify(message));
1724
- if (body.byteLength > args.maxBytes) throw new ProviderResponseTooLargeError();
1665
+ function conservativeMaximumUsage(inputTokenUpperBound, outputTokenUpperBound, pricing) {
1666
+ if (pricing === void 0) return {
1667
+ inputTokens: inputTokenUpperBound,
1668
+ outputTokens: outputTokenUpperBound
1669
+ };
1670
+ const inputRates = [pricing.inputUsdPerMillion, pricing.cachedInputUsdPerMillion ?? pricing.inputUsdPerMillion];
1671
+ const mostExpensiveInputClass = inputRates.indexOf(Math.max(...inputRates));
1725
1672
  return {
1726
- contentType: args.stream ? "text/event-stream; charset=utf-8" : "application/json",
1727
- body
1673
+ inputTokens: mostExpensiveInputClass === 0 ? inputTokenUpperBound : 0,
1674
+ ...mostExpensiveInputClass === 1 ? { cachedTokens: inputTokenUpperBound } : {},
1675
+ cacheWriteTokens: inputTokenUpperBound,
1676
+ outputTokens: outputTokenUpperBound
1728
1677
  };
1729
1678
  }
1730
- function encodeCanonicalModelResponse(args) {
1731
- const usage = encodeProtocolUsage(args.path, args.response, args.receipt);
1732
- const finishReason = args.response.finishReason === void 0 ? "stop" : args.response.finishReason;
1733
- const body = args.path === "/v1/chat/completions" ? {
1734
- id: `chatcmpl-${args.callId}`,
1735
- object: "chat.completion",
1736
- created: 0,
1737
- model: args.response.model,
1738
- choices: [{
1739
- index: 0,
1740
- message: {
1741
- role: "assistant",
1742
- content: args.response.content
1743
- },
1744
- finish_reason: finishReason
1745
- }],
1746
- ...usage ? { usage } : {}
1747
- } : {
1748
- id: `resp-${args.callId}`,
1749
- object: "response",
1750
- created_at: 0,
1751
- model: args.response.model,
1752
- status: finishReason === "length" ? "incomplete" : "completed",
1753
- error: null,
1754
- incomplete_details: finishReason === "length" ? { reason: "max_output_tokens" } : null,
1755
- output: [{
1756
- id: `msg-${args.callId}`,
1757
- type: "message",
1758
- status: finishReason === "length" ? "incomplete" : "completed",
1759
- role: "assistant",
1760
- content: [{
1761
- type: "output_text",
1762
- text: args.response.content,
1763
- annotations: []
1764
- }]
1765
- }],
1766
- output_text: args.response.content,
1767
- ...usage ? { usage } : {}
1768
- };
1769
- const encoded = new TextEncoder().encode(JSON.stringify(body));
1770
- if (encoded.byteLength > args.maxBytes) throw new ProviderResponseTooLargeError();
1771
- return encoded;
1679
+ function readBody(request, maximumBytes) {
1680
+ return new Promise((resolvePromise, reject) => {
1681
+ let size = 0;
1682
+ let tooLarge = false;
1683
+ const chunks = [];
1684
+ request.on("data", (chunk) => {
1685
+ if (tooLarge) return;
1686
+ size += chunk.byteLength;
1687
+ if (size > maximumBytes) {
1688
+ tooLarge = true;
1689
+ chunks.length = 0;
1690
+ return;
1691
+ }
1692
+ chunks.push(chunk);
1693
+ });
1694
+ request.on("error", reject);
1695
+ request.on("end", () => {
1696
+ if (tooLarge) {
1697
+ reject(new RequestBodyTooLargeError("optimizer model request body too large"));
1698
+ return;
1699
+ }
1700
+ resolvePromise(new Uint8Array(Buffer.concat(chunks)));
1701
+ });
1702
+ });
1772
1703
  }
1773
- function endpointFormat(path) {
1774
- if (path === "/v1/messages") return "anthropic-messages";
1775
- return path === "/v1/responses" ? "responses" : "chat-completions";
1704
+ function isAbortError(error) {
1705
+ return error.name === "AbortError" || error.message.toLowerCase().includes("abort");
1776
1706
  }
1777
- function encodeProtocolUsage(path, response, receipt) {
1778
- if (response.usage.captured === false) return void 0;
1779
- const inputDetails = {
1780
- ...receipt.cachedTokens === void 0 ? {} : { cached_tokens: receipt.cachedTokens },
1781
- ...receipt.cacheWriteTokens === void 0 ? {} : path === "/v1/chat/completions" ? { cache_creation_tokens: receipt.cacheWriteTokens } : { cache_write_tokens: receipt.cacheWriteTokens }
1707
+ //#endregion
1708
+ //#region src/campaign/external-optimizer-model-proxy.ts
1709
+ /**
1710
+ * Put an OpenAI-compatible optimizer behind the shared cost ledger.
1711
+ *
1712
+ * The child process receives only a loopback URL and an ephemeral token. The
1713
+ * package that owns execution receives a validated immutable request through
1714
+ * `call`; Eval receives no provider credential. Every request reserves its
1715
+ * conservative byte-count input bound plus the declared output cap before the
1716
+ * owner is invoked exactly once.
1717
+ */
1718
+ async function startExternalOptimizerModelProxy(args) {
1719
+ assertModelProxyConfig(args);
1720
+ args.signal?.throwIfAborted();
1721
+ const token = randomLocalToken();
1722
+ let requestCount = 0;
1723
+ let successfulCompletionCount = 0;
1724
+ const wireCounts = {
1725
+ openai: {
1726
+ requestAttempts: 0,
1727
+ successfulCompletions: 0
1728
+ },
1729
+ anthropic: {
1730
+ requestAttempts: 0,
1731
+ successfulCompletions: 0
1732
+ }
1782
1733
  };
1783
- const outputDetails = { ...receipt.reasoningTokens === void 0 ? {} : { reasoning_tokens: receipt.reasoningTokens } };
1784
- return path === "/v1/chat/completions" ? {
1785
- prompt_tokens: response.usage.promptTokens,
1786
- completion_tokens: response.usage.completionTokens,
1787
- total_tokens: response.usage.totalTokens,
1788
- ...Object.keys(inputDetails).length > 0 ? { prompt_tokens_details: inputDetails } : {},
1789
- ...Object.keys(outputDetails).length > 0 ? { completion_tokens_details: outputDetails } : {},
1790
- ...receipt.actualCostUsd === void 0 ? {} : { cost: receipt.actualCostUsd }
1791
- } : {
1792
- input_tokens: response.usage.promptTokens,
1793
- output_tokens: response.usage.completionTokens,
1794
- total_tokens: response.usage.totalTokens,
1795
- ...Object.keys(inputDetails).length > 0 ? { input_tokens_details: inputDetails } : {},
1796
- ...Object.keys(outputDetails).length > 0 ? { output_tokens_details: outputDetails } : {},
1797
- ...receipt.actualCostUsd === void 0 ? {} : { cost: receipt.actualCostUsd }
1734
+ let modelCallInvocations = 0;
1735
+ let executionRecordCount = 0;
1736
+ let executionSequence = 0;
1737
+ const failures = [];
1738
+ let totalRequestCount = args.initialUsage?.requests ?? 0;
1739
+ let committedForBudget = args.initialUsage?.costUsd ?? 0;
1740
+ let reservedForBudget = 0;
1741
+ let accepting = true;
1742
+ let closePromise;
1743
+ const activeControllers = /* @__PURE__ */ new Set();
1744
+ const activeHandlers = /* @__PURE__ */ new Set();
1745
+ const server = createServer((request, response) => {
1746
+ if (!accepting) {
1747
+ sendJsonIfOpen(response, 503, { error: "external optimizer model proxy is closing" });
1748
+ return;
1749
+ }
1750
+ const controller = new AbortController();
1751
+ const abortRequest = () => {
1752
+ request.destroy();
1753
+ response.destroy();
1754
+ };
1755
+ activeControllers.add(controller);
1756
+ controller.signal.addEventListener("abort", abortRequest, { once: true });
1757
+ let handler;
1758
+ handler = handleModelProxyRequest({
1759
+ request,
1760
+ response,
1761
+ controller,
1762
+ token,
1763
+ args,
1764
+ nextReservation: (maximumCostUsd, wire) => {
1765
+ if (totalRequestCount >= args.budget.maxRequests) return {
1766
+ accepted: false,
1767
+ reason: "optimizer model request limit reached"
1768
+ };
1769
+ if (args.budget.maxCostUsd !== void 0 && maximumCostUsd !== void 0 && committedForBudget + reservedForBudget + maximumCostUsd > args.budget.maxCostUsd + Number.EPSILON) return {
1770
+ accepted: false,
1771
+ reason: "optimizer model cost limit reached"
1772
+ };
1773
+ requestCount += 1;
1774
+ wireCounts[wire].requestAttempts += 1;
1775
+ totalRequestCount += 1;
1776
+ reservedForBudget += maximumCostUsd ?? 0;
1777
+ return { accepted: true };
1778
+ },
1779
+ settleReservation: (maximumCostUsd, chargedCostUsd) => {
1780
+ reservedForBudget = Math.max(0, reservedForBudget - (maximumCostUsd ?? 0));
1781
+ committedForBudget += chargedCostUsd ?? 0;
1782
+ },
1783
+ recordSuccessfulCompletion: (wire) => {
1784
+ successfulCompletionCount += 1;
1785
+ wireCounts[wire].successfulCompletions += 1;
1786
+ },
1787
+ recordExecutionReceipt: (observation) => {
1788
+ try {
1789
+ args.recordExecution({
1790
+ ...observation,
1791
+ sequence: executionSequence + 1
1792
+ });
1793
+ } catch (error) {
1794
+ throw new ModelExecutionPersistenceError(`optimizer model execution evidence was not persisted: ${errorMessage(error)}`);
1795
+ }
1796
+ executionSequence += 1;
1797
+ executionRecordCount += 1;
1798
+ },
1799
+ recordModelCallInvocation: () => {
1800
+ modelCallInvocations += 1;
1801
+ },
1802
+ recordFailure: (error) => {
1803
+ failures.push(error);
1804
+ }
1805
+ }).finally(() => {
1806
+ controller.signal.removeEventListener("abort", abortRequest);
1807
+ activeControllers.delete(controller);
1808
+ activeHandlers.delete(handler);
1809
+ });
1810
+ activeHandlers.add(handler);
1811
+ handler.catch(() => void 0);
1812
+ });
1813
+ const port = await listenLocal(server);
1814
+ const close = () => {
1815
+ closePromise ??= closeModelProxy();
1816
+ return closePromise;
1798
1817
  };
1799
- }
1800
- function isNonnegativeFiniteNumber(value) {
1801
- return typeof value === "number" && Number.isFinite(value) && value >= 0;
1802
- }
1803
- function isNonnegativeSafeInteger(value) {
1804
- return Number.isSafeInteger(value) && value >= 0;
1805
- }
1806
- function conservativeMaximumUsage(inputTokenUpperBound, outputTokenUpperBound, pricing) {
1807
- if (pricing === void 0) return {
1808
- inputTokens: inputTokenUpperBound,
1809
- outputTokens: outputTokenUpperBound
1818
+ const onAbort = () => {
1819
+ for (const controller of activeControllers) controller.abort(args.signal?.reason);
1820
+ close().catch(() => void 0);
1821
+ };
1822
+ args.signal?.addEventListener("abort", onAbort, { once: true });
1823
+ if (args.signal?.aborted) onAbort();
1824
+ const assertExecutionComplete = () => {
1825
+ if (executionRecordCount !== modelCallInvocations) throw new Error(`external optimizer model callback returned ${executionRecordCount} execution records for ${modelCallInvocations} invoked calls`);
1810
1826
  };
1811
- const inputRates = [pricing.inputUsdPerMillion, pricing.cachedInputUsdPerMillion ?? pricing.inputUsdPerMillion];
1812
- const mostExpensiveInputClass = inputRates.indexOf(Math.max(...inputRates));
1813
1827
  return {
1814
- inputTokens: mostExpensiveInputClass === 0 ? inputTokenUpperBound : 0,
1815
- ...mostExpensiveInputClass === 1 ? { cachedTokens: inputTokenUpperBound } : {},
1816
- cacheWriteTokens: inputTokenUpperBound,
1817
- outputTokens: outputTokenUpperBound
1828
+ baseUrl: `http://127.0.0.1:${port}/v1`,
1829
+ apiKey: token,
1830
+ requestAttempts: () => requestCount,
1831
+ successfulCompletions: () => successfulCompletionCount,
1832
+ wireUsage: () => ({
1833
+ openai: { ...wireCounts.openai },
1834
+ anthropic: { ...wireCounts.anthropic }
1835
+ }),
1836
+ assertExecutionComplete,
1837
+ failures: () => [...failures],
1838
+ close
1818
1839
  };
1840
+ async function closeModelProxy() {
1841
+ args.signal?.removeEventListener("abort", onAbort);
1842
+ accepting = false;
1843
+ const closingServer = closeServer(server);
1844
+ server.closeIdleConnections?.();
1845
+ const [serverResult] = await Promise.allSettled([closingServer, waitForActiveHandlers(activeHandlers)]);
1846
+ if (activeControllers.size !== 0 || activeHandlers.size !== 0) throw new Error("external optimizer model proxy closed with active request work");
1847
+ let executionError;
1848
+ try {
1849
+ assertExecutionComplete();
1850
+ } catch (error) {
1851
+ executionError = error;
1852
+ }
1853
+ if (serverResult?.status === "rejected" && executionError !== void 0) throw new AggregateError([serverResult.reason, executionError], "external optimizer model proxy close and execution evidence both failed");
1854
+ if (serverResult?.status === "rejected") throw serverResult.reason;
1855
+ if (executionError !== void 0) throw executionError;
1856
+ }
1819
1857
  }
1820
1858
  function assertModelProxyConfig(args) {
1821
1859
  assertServedModelPolicy(args.servedModelPolicy, "external optimizer model proxy: servedModelPolicy");
@@ -1840,49 +1878,9 @@ function assertModelProxyConfig(args) {
1840
1878
  if (args.initialUsage.requests > args.budget.maxRequests || args.budget.maxCostUsd !== void 0 && args.initialUsage.costUsd !== void 0 && args.initialUsage.costUsd > args.budget.maxCostUsd + Number.EPSILON) throw new Error("external optimizer model proxy: initialUsage exceeds the configured budget");
1841
1879
  }
1842
1880
  }
1843
- var RequestBodyTooLargeError = class extends Error {};
1844
- var ProviderResponseTooLargeError = class extends Error {
1845
- constructor() {
1846
- super("optimizer model response exceeds maxResponseBytes");
1847
- }
1848
- };
1849
- var MissingModelExecutionError = class extends Error {};
1850
- var ModelExecutionPersistenceError = class extends Error {};
1851
- var OwnerModelContractError = class extends Error {};
1852
- function readBody(request, maximumBytes) {
1853
- return new Promise((resolvePromise, reject) => {
1854
- let size = 0;
1855
- let tooLarge = false;
1856
- const chunks = [];
1857
- request.on("data", (chunk) => {
1858
- if (tooLarge) return;
1859
- size += chunk.byteLength;
1860
- if (size > maximumBytes) {
1861
- tooLarge = true;
1862
- chunks.length = 0;
1863
- return;
1864
- }
1865
- chunks.push(chunk);
1866
- });
1867
- request.on("error", reject);
1868
- request.on("end", () => {
1869
- if (tooLarge) {
1870
- reject(new RequestBodyTooLargeError("optimizer model request body too large"));
1871
- return;
1872
- }
1873
- resolvePromise(new Uint8Array(Buffer.concat(chunks)));
1874
- });
1875
- });
1876
- }
1877
1881
  function randomLocalToken() {
1878
1882
  return randomBytes(32).toString("hex");
1879
1883
  }
1880
- function isAbortError(error) {
1881
- return error.name === "AbortError" || error.message.toLowerCase().includes("abort");
1882
- }
1883
- function toErrorMessage(error) {
1884
- return error instanceof Error ? error.message : String(error);
1885
- }
1886
1884
  //#endregion
1887
1885
  //#region src/campaign/external-optimizer-resources.ts
1888
1886
  async function runWithCleanup(args) {
@@ -2160,6 +2158,6 @@ function summarizeProcessOutput(capture, max = 4e3) {
2160
2158
  return `${compact.slice(0, headChars)}...[${compact.length - max} chars omitted]...${compact.slice(-tailChars)}`;
2161
2159
  }
2162
2160
  //#endregion
2163
- export { parseAnalystFinding as A, ProposalFindingSchema as C, lineageRoots as D, independentUnitCount as E, inMemoryCampaignStorage as F, spanningWindow as M, createRunCostLedger as N, mergeEvidenceUnits as O, fsCampaignStorage as P, FINDING_LAYERS as S, findingLayerRank as T, removeCredentialEnvironment as _, closeServer as a, safePathComponent as b, waitForActiveHandlers as c, assertExternalOptimizerModelBudget as d, assertJsonValue as f, isRecord as g, isExternalTextCandidate as h, startExternalOptimizerModelProxy as i, readFindingScope as j, mostSevere as k, DEFAULT_EXTERNAL_OPTIMIZER_CALLBACK_LIMITS as l, isCandidateText as m, closeExternalOptimizerResources as n, listenLocal as o, assertNoCredentialValues as p, runWithCleanup as r, sendJsonIfOpen as s, runExternalOptimizerProcess as t, DEFAULT_EXTERNAL_OPTIMIZER_PROCESS_LIMITS as u, resolveExternalOptimizerCallbackLimits as v, UNKNOWN_LINEAGE as w, AnalystFindingSchema as x, resolveExternalOptimizerProcessLimits as y };
2161
+ export { spanningWindow as A, UNKNOWN_LINEAGE as C, mostSevere as D, mergeEvidenceUnits as E, fsCampaignStorage as M, inMemoryCampaignStorage as N, parseAnalystFinding as O, ProposalFindingSchema as S, lineageRoots as T, resolveExternalOptimizerCallbackLimits as _, closeServer as a, AnalystFindingSchema as b, waitForActiveHandlers as c, assertExternalOptimizerModelBudget as d, assertJsonValue as f, removeCredentialEnvironment as g, isExternalTextCandidate as h, startExternalOptimizerModelProxy as i, createRunCostLedger as j, readFindingScope as k, DEFAULT_EXTERNAL_OPTIMIZER_CALLBACK_LIMITS as l, isCandidateText as m, closeExternalOptimizerResources as n, listenLocal as o, assertNoCredentialValues as p, runWithCleanup as r, sendJsonIfOpen as s, runExternalOptimizerProcess as t, DEFAULT_EXTERNAL_OPTIMIZER_PROCESS_LIMITS as u, resolveExternalOptimizerProcessLimits as v, independentUnitCount as w, FINDING_LAYERS as x, safePathComponent as y };
2164
2162
 
2165
- //# sourceMappingURL=external-optimizer-subprocess-DcerlZSG.js.map
2163
+ //# sourceMappingURL=external-optimizer-subprocess-XIHBOSKt.js.map