@tangle-network/agent-eval 0.129.0 → 0.130.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 (428) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/README.md +2 -0
  3. package/dist/active-curriculum-C4mk67HP.js +214 -0
  4. package/dist/active-curriculum-C4mk67HP.js.map +1 -0
  5. package/dist/adversarial-smnADNFS.d.ts +21 -0
  6. package/dist/adversarial-smnADNFS.d.ts.map +1 -0
  7. package/dist/analyst/index.d.ts +81 -2872
  8. package/dist/analyst/index.d.ts.map +1 -0
  9. package/dist/analyst/index.js +319 -360
  10. package/dist/analyst/index.js.map +1 -1
  11. package/dist/analyst-BkTS3C58.d.ts +89 -0
  12. package/dist/analyst-BkTS3C58.d.ts.map +1 -0
  13. package/dist/analyst-LsnNpSkm.js +152 -0
  14. package/dist/analyst-LsnNpSkm.js.map +1 -0
  15. package/dist/analyze-runs-C1CavBMk.js +1067 -0
  16. package/dist/analyze-runs-C1CavBMk.js.map +1 -0
  17. package/dist/analyze-runs-FsgYCinh.d.ts +72 -0
  18. package/dist/analyze-runs-FsgYCinh.d.ts.map +1 -0
  19. package/dist/attribute-vocabulary-DLJ6303h.d.ts +54 -0
  20. package/dist/attribute-vocabulary-DLJ6303h.d.ts.map +1 -0
  21. package/dist/authenticity/index.d.ts +81 -79
  22. package/dist/authenticity/index.d.ts.map +1 -0
  23. package/dist/authenticity/index.js +209 -193
  24. package/dist/authenticity/index.js.map +1 -1
  25. package/dist/baseline-HsBvw_dk.js +550 -0
  26. package/dist/baseline-HsBvw_dk.js.map +1 -0
  27. package/dist/baseline-hG3K85h4.d.ts +125 -0
  28. package/dist/baseline-hG3K85h4.d.ts.map +1 -0
  29. package/dist/belief-state/index.d.ts +448 -1188
  30. package/dist/belief-state/index.d.ts.map +1 -0
  31. package/dist/belief-state/index.js +1617 -1709
  32. package/dist/belief-state/index.js.map +1 -1
  33. package/dist/benchmarks/index.d.ts +2 -891
  34. package/dist/benchmarks/index.js +2 -60
  35. package/dist/benchmarks-BJgDGkAD.js +754 -0
  36. package/dist/benchmarks-BJgDGkAD.js.map +1 -0
  37. package/dist/builder-eval/index.d.ts +150 -662
  38. package/dist/builder-eval/index.d.ts.map +1 -0
  39. package/dist/builder-eval/index.js +356 -345
  40. package/dist/builder-eval/index.js.map +1 -1
  41. package/dist/calibration-CNWWA6K8.js +94 -0
  42. package/dist/calibration-CNWWA6K8.js.map +1 -0
  43. package/dist/campaign/index.d.ts +5 -6381
  44. package/dist/campaign/index.js +3 -213
  45. package/dist/campaign-aKJt6emI.js +3886 -0
  46. package/dist/campaign-aKJt6emI.js.map +1 -0
  47. package/dist/cli.d.ts +1 -1
  48. package/dist/cli.js +164 -175
  49. package/dist/cli.js.map +1 -1
  50. package/dist/client-C97NMzqi.d.ts +581 -0
  51. package/dist/client-C97NMzqi.d.ts.map +1 -0
  52. package/dist/client-CYzbdJOZ.js +637 -0
  53. package/dist/client-CYzbdJOZ.js.map +1 -0
  54. package/dist/code-agent-session-BjkMTQ7H.js +1390 -0
  55. package/dist/code-agent-session-BjkMTQ7H.js.map +1 -0
  56. package/dist/code-agent-session-DqqgOJaz.d.ts +143 -0
  57. package/dist/code-agent-session-DqqgOJaz.d.ts.map +1 -0
  58. package/dist/concurrency-DIxRZF_J.js +85 -0
  59. package/dist/concurrency-DIxRZF_J.js.map +1 -0
  60. package/dist/contract/index.d.ts +645 -5565
  61. package/dist/contract/index.d.ts.map +1 -0
  62. package/dist/contract/index.js +1730 -1938
  63. package/dist/contract/index.js.map +1 -1
  64. package/dist/control.d.ts +3 -1030
  65. package/dist/control.js +2 -33
  66. package/dist/cost-ledger-DIgQUFZZ.js +801 -0
  67. package/dist/cost-ledger-DIgQUFZZ.js.map +1 -0
  68. package/dist/cost-ledger-Dye6jCgg.d.ts +236 -0
  69. package/dist/cost-ledger-Dye6jCgg.d.ts.map +1 -0
  70. package/dist/dataset-BvtnC8Dc.d.ts +115 -0
  71. package/dist/dataset-BvtnC8Dc.d.ts.map +1 -0
  72. package/dist/default-registry-C-vFCSEc.js +2579 -0
  73. package/dist/default-registry-C-vFCSEc.js.map +1 -0
  74. package/dist/default-registry-CNPo-Vsb.d.ts +540 -0
  75. package/dist/default-registry-CNPo-Vsb.d.ts.map +1 -0
  76. package/dist/emitter-CPBAhxum.js +266 -0
  77. package/dist/emitter-CPBAhxum.js.map +1 -0
  78. package/dist/emitter-DGQGoLyj.d.ts +113 -0
  79. package/dist/emitter-DGQGoLyj.d.ts.map +1 -0
  80. package/dist/errors-8YnH8WlF.js +64 -0
  81. package/dist/errors-8YnH8WlF.js.map +1 -0
  82. package/dist/errors-CEk209JS.d.ts +76 -0
  83. package/dist/errors-CEk209JS.d.ts.map +1 -0
  84. package/dist/eval-campaign-DEm6c8ru.js +349 -0
  85. package/dist/eval-campaign-DEm6c8ru.js.map +1 -0
  86. package/dist/execution-tracks-CpgFPpS5.js +93 -0
  87. package/dist/execution-tracks-CpgFPpS5.js.map +1 -0
  88. package/dist/exporters-q9iL-2Jf.js +148 -0
  89. package/dist/exporters-q9iL-2Jf.js.map +1 -0
  90. package/dist/extract-usage-BrQ8mCLX.js +155 -0
  91. package/dist/extract-usage-BrQ8mCLX.js.map +1 -0
  92. package/dist/failure-cluster-CqcvCcdR.d.ts +59 -0
  93. package/dist/failure-cluster-CqcvCcdR.d.ts.map +1 -0
  94. package/dist/feedback-trajectory-CVaeREXV.d.ts +340 -0
  95. package/dist/feedback-trajectory-CVaeREXV.d.ts.map +1 -0
  96. package/dist/fuzz.d.ts +320 -646
  97. package/dist/fuzz.d.ts.map +1 -0
  98. package/dist/fuzz.js +670 -618
  99. package/dist/fuzz.js.map +1 -1
  100. package/dist/hf-dataset-DBJXXoY1.js +763 -0
  101. package/dist/hf-dataset-DBJXXoY1.js.map +1 -0
  102. package/dist/hosted/index.d.ts +11 -831
  103. package/dist/hosted/index.d.ts.map +1 -0
  104. package/dist/hosted/index.js +2 -37
  105. package/dist/index-2JJSA6-r2.d.ts +926 -0
  106. package/dist/index-2JJSA6-r2.d.ts.map +1 -0
  107. package/dist/index-6N0aYmpW.d.ts +217 -0
  108. package/dist/index-6N0aYmpW.d.ts.map +1 -0
  109. package/dist/index-BAvgST_9.d.ts +131 -0
  110. package/dist/index-BAvgST_9.d.ts.map +1 -0
  111. package/dist/index-BvnJuTGD.d.ts +68 -0
  112. package/dist/index-BvnJuTGD.d.ts.map +1 -0
  113. package/dist/index-C61Wi7yg.d.ts +547 -0
  114. package/dist/index-C61Wi7yg.d.ts.map +1 -0
  115. package/dist/index-CD_WZ_Xr.d.ts +2250 -0
  116. package/dist/index-CD_WZ_Xr.d.ts.map +1 -0
  117. package/dist/index-DSC51roc.d.ts +102 -0
  118. package/dist/index-DSC51roc.d.ts.map +1 -0
  119. package/dist/index-Em67JBjs.d.ts +335 -0
  120. package/dist/index-Em67JBjs.d.ts.map +1 -0
  121. package/dist/index.d.ts +3755 -15555
  122. package/dist/index.d.ts.map +1 -0
  123. package/dist/index.js +11182 -11216
  124. package/dist/index.js.map +1 -1
  125. package/dist/integrity-BzRbCHzi.js +424 -0
  126. package/dist/integrity-BzRbCHzi.js.map +1 -0
  127. package/dist/integrity-rmVhXWA7.d.ts +61 -0
  128. package/dist/integrity-rmVhXWA7.d.ts.map +1 -0
  129. package/dist/judge-calibration-DFtEMlde.d.ts +146 -0
  130. package/dist/judge-calibration-DFtEMlde.d.ts.map +1 -0
  131. package/dist/ledger-core/index.d.ts +2 -0
  132. package/dist/ledger-core/index.js +2 -0
  133. package/dist/ledger-core-DtZz1RG0.js +388 -0
  134. package/dist/ledger-core-DtZz1RG0.js.map +1 -0
  135. package/dist/llm-client--GR4JbZE.js +687 -0
  136. package/dist/llm-client--GR4JbZE.js.map +1 -0
  137. package/dist/llm-client-B_nIBlYo.d.ts +290 -0
  138. package/dist/llm-client-B_nIBlYo.d.ts.map +1 -0
  139. package/dist/matrix/index.d.ts +3 -155
  140. package/dist/matrix/index.js +2 -8
  141. package/dist/matrix-BzQnu2S6.js +270 -0
  142. package/dist/matrix-BzQnu2S6.js.map +1 -0
  143. package/dist/meta-eval/index.d.ts +4 -1027
  144. package/dist/meta-eval/index.js +393 -390
  145. package/dist/meta-eval/index.js.map +1 -1
  146. package/dist/metrics-C9YY1OcL.js +239 -0
  147. package/dist/metrics-C9YY1OcL.js.map +1 -0
  148. package/dist/mint-yN2M2eh0.js +201 -0
  149. package/dist/mint-yN2M2eh0.js.map +1 -0
  150. package/dist/multi-layer-verifier-BHY1gWAc.d.ts +138 -0
  151. package/dist/multi-layer-verifier-BHY1gWAc.d.ts.map +1 -0
  152. package/dist/multishot/index.d.ts +273 -480
  153. package/dist/multishot/index.d.ts.map +1 -0
  154. package/dist/multishot/index.js +595 -548
  155. package/dist/multishot/index.js.map +1 -1
  156. package/dist/off-policy-DvgzvtIx.js +220 -0
  157. package/dist/off-policy-DvgzvtIx.js.map +1 -0
  158. package/dist/off-policy-mskQw8Mb.d.ts +153 -0
  159. package/dist/off-policy-mskQw8Mb.d.ts.map +1 -0
  160. package/dist/openapi.json +1 -1
  161. package/dist/opencode-sqlite-BGrHeDu3.js +318 -0
  162. package/dist/opencode-sqlite-BGrHeDu3.js.map +1 -0
  163. package/dist/outcome-store-BYHIuO0e.d.ts +65 -0
  164. package/dist/outcome-store-BYHIuO0e.d.ts.map +1 -0
  165. package/dist/outcome-store-ChBKlTd_.js +75 -0
  166. package/dist/outcome-store-ChBKlTd_.js.map +1 -0
  167. package/dist/paired-arms-D9D0wXj2.js +260 -0
  168. package/dist/paired-arms-D9D0wXj2.js.map +1 -0
  169. package/dist/pipelines/index.d.ts +95 -532
  170. package/dist/pipelines/index.d.ts.map +1 -0
  171. package/dist/pipelines/index.js +497 -478
  172. package/dist/pipelines/index.js.map +1 -1
  173. package/dist/pre-registration-DakwTRXk.js +96 -0
  174. package/dist/pre-registration-DakwTRXk.js.map +1 -0
  175. package/dist/propose-review-control-LhIWGzHl.js +1458 -0
  176. package/dist/propose-review-control-LhIWGzHl.js.map +1 -0
  177. package/dist/query-CJ_DX8vl.d.ts +28 -0
  178. package/dist/query-CJ_DX8vl.d.ts.map +1 -0
  179. package/dist/query-Di7eEQ79.js +83 -0
  180. package/dist/query-Di7eEQ79.js.map +1 -0
  181. package/dist/raw-provider-sink-BQd7mzyT.js +201 -0
  182. package/dist/raw-provider-sink-BQd7mzyT.js.map +1 -0
  183. package/dist/raw-provider-sink-BU29Sh8h.d.ts +134 -0
  184. package/dist/raw-provider-sink-BU29Sh8h.d.ts.map +1 -0
  185. package/dist/redact-7Aq1ukl-.js +107 -0
  186. package/dist/redact-7Aq1ukl-.js.map +1 -0
  187. package/dist/release-report-Cz9NKH39.js +603 -0
  188. package/dist/release-report-Cz9NKH39.js.map +1 -0
  189. package/dist/release-report-mvB2G4_J.d.ts +244 -0
  190. package/dist/release-report-mvB2G4_J.d.ts.map +1 -0
  191. package/dist/replay-GnyotH0J.js +1741 -0
  192. package/dist/replay-GnyotH0J.js.map +1 -0
  193. package/dist/replay-OoidtG1E.d.ts +749 -0
  194. package/dist/replay-OoidtG1E.d.ts.map +1 -0
  195. package/dist/reporting.d.ts +6 -1312
  196. package/dist/reporting.js +6 -51
  197. package/dist/researcher-CwTdwXG1.d.ts +314 -0
  198. package/dist/researcher-CwTdwXG1.d.ts.map +1 -0
  199. package/dist/reward-hacking-eAnOsynk.d.ts +224 -0
  200. package/dist/reward-hacking-eAnOsynk.d.ts.map +1 -0
  201. package/dist/reward-hacking-qipEpKvY.js +596 -0
  202. package/dist/reward-hacking-qipEpKvY.js.map +1 -0
  203. package/dist/reward-nw2xZGZG.js +137 -0
  204. package/dist/reward-nw2xZGZG.js.map +1 -0
  205. package/dist/rl.d.ts +760 -4010
  206. package/dist/rl.d.ts.map +1 -0
  207. package/dist/rl.js +2325 -1958
  208. package/dist/rl.js.map +1 -1
  209. package/dist/rolldown-runtime-8H4AJuhK.js +14 -0
  210. package/dist/rollout/index.d.ts +3 -2087
  211. package/dist/rollout/index.js +8 -168
  212. package/dist/rollout-BOYjemfR.js +624 -0
  213. package/dist/rollout-BOYjemfR.js.map +1 -0
  214. package/dist/rubric-predictive-validity-B3xmbmS1.js +141 -0
  215. package/dist/rubric-predictive-validity-B3xmbmS1.js.map +1 -0
  216. package/dist/rubric-predictive-validity-Ku_clp_1.d.ts +74 -0
  217. package/dist/rubric-predictive-validity-Ku_clp_1.d.ts.map +1 -0
  218. package/dist/run-evidence-ClRX_8A9.d.ts +225 -0
  219. package/dist/run-evidence-ClRX_8A9.d.ts.map +1 -0
  220. package/dist/run-record-BuoE80Dq.js +467 -0
  221. package/dist/{chunk-56TAVBOK.js.map → run-record-BuoE80Dq.js.map} +1 -1
  222. package/dist/run-record-CnZu_gjl.d.ts +357 -0
  223. package/dist/run-record-CnZu_gjl.d.ts.map +1 -0
  224. package/dist/run-score-iEEAWiBY.js +41 -0
  225. package/dist/run-score-iEEAWiBY.js.map +1 -0
  226. package/dist/runtime-trajectory-1gyaTOoC.js +93 -0
  227. package/dist/runtime-trajectory-1gyaTOoC.js.map +1 -0
  228. package/dist/runtime-trajectory-BvSZcCHD.d.ts +50 -0
  229. package/dist/runtime-trajectory-BvSZcCHD.d.ts.map +1 -0
  230. package/dist/schema-BtVldJ3T.d.ts +206 -0
  231. package/dist/schema-BtVldJ3T.d.ts.map +1 -0
  232. package/dist/schema-C6DW4ZHR.js +821 -0
  233. package/dist/schema-C6DW4ZHR.js.map +1 -0
  234. package/dist/schema-CRhEY1SO.js +69 -0
  235. package/dist/schema-CRhEY1SO.js.map +1 -0
  236. package/dist/schema-Cef2cFmb.d.ts +408 -0
  237. package/dist/schema-Cef2cFmb.d.ts.map +1 -0
  238. package/dist/semantic-concept-judge-B6cWNJ2K.js +725 -0
  239. package/dist/semantic-concept-judge-B6cWNJ2K.js.map +1 -0
  240. package/dist/sequential-Br0mAPHA.js +148 -0
  241. package/dist/sequential-Br0mAPHA.js.map +1 -0
  242. package/dist/sequential-CYwq6Ff_.d.ts +141 -0
  243. package/dist/sequential-CYwq6Ff_.d.ts.map +1 -0
  244. package/dist/series-convergence-CjO2QdRW.js +43 -0
  245. package/dist/series-convergence-CjO2QdRW.js.map +1 -0
  246. package/dist/series-convergence-ofsqPWhs.d.ts +35 -0
  247. package/dist/series-convergence-ofsqPWhs.d.ts.map +1 -0
  248. package/dist/server-m5D9cvnG.js +1040 -0
  249. package/dist/server-m5D9cvnG.js.map +1 -0
  250. package/dist/skill-usage-C_pXm7lP.d.ts +534 -0
  251. package/dist/skill-usage-C_pXm7lP.d.ts.map +1 -0
  252. package/dist/skillopt-optimization-method-CUmHkGbI.js +7718 -0
  253. package/dist/skillopt-optimization-method-CUmHkGbI.js.map +1 -0
  254. package/dist/skillopt-optimization-method-CWKVTnks.d.ts +1740 -0
  255. package/dist/skillopt-optimization-method-CWKVTnks.d.ts.map +1 -0
  256. package/dist/statistics-Cmj6nynr.d.ts +514 -0
  257. package/dist/statistics-Cmj6nynr.d.ts.map +1 -0
  258. package/dist/statistics-CnnxdpOg.js +1437 -0
  259. package/dist/statistics-CnnxdpOg.js.map +1 -0
  260. package/dist/store-CT9YIIve.d.ts +117 -0
  261. package/dist/store-CT9YIIve.d.ts.map +1 -0
  262. package/dist/store-CxJry_cs.d.ts +229 -0
  263. package/dist/store-CxJry_cs.d.ts.map +1 -0
  264. package/dist/storyboard/index.d.ts +84 -203
  265. package/dist/storyboard/index.d.ts.map +1 -0
  266. package/dist/storyboard/index.js +609 -542
  267. package/dist/storyboard/index.js.map +1 -1
  268. package/dist/summary-report-BNs5nmXI.js +862 -0
  269. package/dist/summary-report-BNs5nmXI.js.map +1 -0
  270. package/dist/summary-report-Cj9gdw4i.d.ts +407 -0
  271. package/dist/summary-report-Cj9gdw4i.d.ts.map +1 -0
  272. package/dist/supervisor-run/index.d.ts +2 -959
  273. package/dist/supervisor-run/index.js +2 -65
  274. package/dist/supervisor-run-_lnTLM3z.js +1679 -0
  275. package/dist/supervisor-run-_lnTLM3z.js.map +1 -0
  276. package/dist/task-failure-attributes-CQZlB3et.js +311 -0
  277. package/dist/task-failure-attributes-CQZlB3et.js.map +1 -0
  278. package/dist/test-graded-scenario-BsqWLmPt.js +318 -0
  279. package/dist/test-graded-scenario-BsqWLmPt.js.map +1 -0
  280. package/dist/test-graded-scenario-D1TaI2va.d.ts +141 -0
  281. package/dist/test-graded-scenario-D1TaI2va.d.ts.map +1 -0
  282. package/dist/tools-BmuN627J.js +1085 -0
  283. package/dist/tools-BmuN627J.js.map +1 -0
  284. package/dist/trace-attributes.d.ts +2 -52
  285. package/dist/trace-attributes.js +131 -61
  286. package/dist/trace-attributes.js.map +1 -1
  287. package/dist/traces.d.ts +12 -2365
  288. package/dist/traces.js +12 -252
  289. package/dist/trajectory-D_7rLrvE.js +56 -0
  290. package/dist/trajectory-D_7rLrvE.js.map +1 -0
  291. package/dist/types-DGsxbAEd.d.ts +387 -0
  292. package/dist/types-DGsxbAEd.d.ts.map +1 -0
  293. package/dist/types-k9tZGKUg.d.ts +640 -0
  294. package/dist/types-k9tZGKUg.d.ts.map +1 -0
  295. package/dist/verdict-Dps8_okt.d.ts +37 -0
  296. package/dist/verdict-Dps8_okt.d.ts.map +1 -0
  297. package/dist/wire/index.d.ts +702 -1173
  298. package/dist/wire/index.d.ts.map +1 -0
  299. package/dist/wire/index.js +2 -81
  300. package/docs/campaign-proposers.md +1 -0
  301. package/package.json +17 -9
  302. package/dist/benchmarks/index.js.map +0 -1
  303. package/dist/campaign/index.js.map +0 -1
  304. package/dist/chunk-2QU3YOPR.js +0 -7374
  305. package/dist/chunk-2QU3YOPR.js.map +0 -1
  306. package/dist/chunk-3OCR4R5I.js +0 -728
  307. package/dist/chunk-3OCR4R5I.js.map +0 -1
  308. package/dist/chunk-3RF76KTD.js +0 -84
  309. package/dist/chunk-3RF76KTD.js.map +0 -1
  310. package/dist/chunk-56TAVBOK.js +0 -698
  311. package/dist/chunk-5DTSBUL2.js +0 -159
  312. package/dist/chunk-5DTSBUL2.js.map +0 -1
  313. package/dist/chunk-7FO3TNPI.js +0 -232
  314. package/dist/chunk-7FO3TNPI.js.map +0 -1
  315. package/dist/chunk-7ZZMD7UK.js +0 -386
  316. package/dist/chunk-7ZZMD7UK.js.map +0 -1
  317. package/dist/chunk-BOD4O7OF.js +0 -40
  318. package/dist/chunk-BOD4O7OF.js.map +0 -1
  319. package/dist/chunk-BSO5JDQH.js +0 -2335
  320. package/dist/chunk-BSO5JDQH.js.map +0 -1
  321. package/dist/chunk-C6LXANRU.js +0 -1550
  322. package/dist/chunk-C6LXANRU.js.map +0 -1
  323. package/dist/chunk-DODXQREJ.js +0 -752
  324. package/dist/chunk-DODXQREJ.js.map +0 -1
  325. package/dist/chunk-DRYIUNWY.js +0 -622
  326. package/dist/chunk-DRYIUNWY.js.map +0 -1
  327. package/dist/chunk-E7QXT7SX.js +0 -183
  328. package/dist/chunk-E7QXT7SX.js.map +0 -1
  329. package/dist/chunk-EG66UGL4.js +0 -341
  330. package/dist/chunk-EG66UGL4.js.map +0 -1
  331. package/dist/chunk-FXTVJPYD.js +0 -576
  332. package/dist/chunk-FXTVJPYD.js.map +0 -1
  333. package/dist/chunk-G7MGMCZD.js +0 -153
  334. package/dist/chunk-G7MGMCZD.js.map +0 -1
  335. package/dist/chunk-GGE4NNQT.js +0 -65
  336. package/dist/chunk-GGE4NNQT.js.map +0 -1
  337. package/dist/chunk-H23X7XKK.js +0 -181
  338. package/dist/chunk-H23X7XKK.js.map +0 -1
  339. package/dist/chunk-HHWE3POT.js +0 -94
  340. package/dist/chunk-HHWE3POT.js.map +0 -1
  341. package/dist/chunk-HPWUNB47.js +0 -289
  342. package/dist/chunk-HPWUNB47.js.map +0 -1
  343. package/dist/chunk-IYCLP2N2.js +0 -766
  344. package/dist/chunk-IYCLP2N2.js.map +0 -1
  345. package/dist/chunk-JHCHEVET.js +0 -274
  346. package/dist/chunk-JHCHEVET.js.map +0 -1
  347. package/dist/chunk-JQSF5DQT.js +0 -701
  348. package/dist/chunk-JQSF5DQT.js.map +0 -1
  349. package/dist/chunk-K4DBDHLK.js +0 -158
  350. package/dist/chunk-K4DBDHLK.js.map +0 -1
  351. package/dist/chunk-K6N6XJJX.js +0 -306
  352. package/dist/chunk-K6N6XJJX.js.map +0 -1
  353. package/dist/chunk-M4YBQKIJ.js +0 -1040
  354. package/dist/chunk-M4YBQKIJ.js.map +0 -1
  355. package/dist/chunk-MA6HLL3S.js +0 -65
  356. package/dist/chunk-MA6HLL3S.js.map +0 -1
  357. package/dist/chunk-MAZ26DC7.js +0 -99
  358. package/dist/chunk-MAZ26DC7.js.map +0 -1
  359. package/dist/chunk-NPCTHQIO.js +0 -91
  360. package/dist/chunk-NPCTHQIO.js.map +0 -1
  361. package/dist/chunk-NY44NC4A.js +0 -1056
  362. package/dist/chunk-NY44NC4A.js.map +0 -1
  363. package/dist/chunk-OIUOT4QD.js +0 -44
  364. package/dist/chunk-OIUOT4QD.js.map +0 -1
  365. package/dist/chunk-ONWEPEDO.js +0 -57
  366. package/dist/chunk-ONWEPEDO.js.map +0 -1
  367. package/dist/chunk-OWN5NPMC.js +0 -152
  368. package/dist/chunk-OWN5NPMC.js.map +0 -1
  369. package/dist/chunk-P6FYH6K4.js +0 -1161
  370. package/dist/chunk-P6FYH6K4.js.map +0 -1
  371. package/dist/chunk-PC4UYEBM.js +0 -166
  372. package/dist/chunk-PC4UYEBM.js.map +0 -1
  373. package/dist/chunk-PC5DOSM7.js +0 -579
  374. package/dist/chunk-PC5DOSM7.js.map +0 -1
  375. package/dist/chunk-PXE2VKMX.js +0 -140
  376. package/dist/chunk-PXE2VKMX.js.map +0 -1
  377. package/dist/chunk-PZ5AY32C.js +0 -10
  378. package/dist/chunk-PZ5AY32C.js.map +0 -1
  379. package/dist/chunk-QB6BDBP2.js +0 -4464
  380. package/dist/chunk-QB6BDBP2.js.map +0 -1
  381. package/dist/chunk-RXHCETDZ.js +0 -536
  382. package/dist/chunk-RXHCETDZ.js.map +0 -1
  383. package/dist/chunk-RZTMDUO7.js +0 -49
  384. package/dist/chunk-RZTMDUO7.js.map +0 -1
  385. package/dist/chunk-SFLLL76A.js +0 -669
  386. package/dist/chunk-SFLLL76A.js.map +0 -1
  387. package/dist/chunk-SZLVEKMJ.js +0 -1446
  388. package/dist/chunk-SZLVEKMJ.js.map +0 -1
  389. package/dist/chunk-T4SQEITX.js +0 -95
  390. package/dist/chunk-T4SQEITX.js.map +0 -1
  391. package/dist/chunk-T6RLYGAD.js +0 -158
  392. package/dist/chunk-T6RLYGAD.js.map +0 -1
  393. package/dist/chunk-TJVT4QFF.js +0 -911
  394. package/dist/chunk-TJVT4QFF.js.map +0 -1
  395. package/dist/chunk-TQ7LNKZ3.js +0 -136
  396. package/dist/chunk-TQ7LNKZ3.js.map +0 -1
  397. package/dist/chunk-U4L7JRPZ.js +0 -1706
  398. package/dist/chunk-U4L7JRPZ.js.map +0 -1
  399. package/dist/chunk-U4PHLT2N.js +0 -419
  400. package/dist/chunk-U4PHLT2N.js.map +0 -1
  401. package/dist/chunk-VCZ5FQYW.js +0 -928
  402. package/dist/chunk-VCZ5FQYW.js.map +0 -1
  403. package/dist/chunk-VI2UW6B6.js +0 -162
  404. package/dist/chunk-VI2UW6B6.js.map +0 -1
  405. package/dist/chunk-VQMK5FMP.js +0 -247
  406. package/dist/chunk-VQMK5FMP.js.map +0 -1
  407. package/dist/chunk-WGXIEX7P.js +0 -116
  408. package/dist/chunk-WGXIEX7P.js.map +0 -1
  409. package/dist/chunk-WVATSFCP.js +0 -1553
  410. package/dist/chunk-WVATSFCP.js.map +0 -1
  411. package/dist/chunk-X4YIBDER.js +0 -1662
  412. package/dist/chunk-X4YIBDER.js.map +0 -1
  413. package/dist/chunk-YQN4ICPP.js +0 -355
  414. package/dist/chunk-YQN4ICPP.js.map +0 -1
  415. package/dist/chunk-ZET2UAYW.js +0 -89
  416. package/dist/chunk-ZET2UAYW.js.map +0 -1
  417. package/dist/chunk-ZHTZ4EYI.js +0 -1212
  418. package/dist/chunk-ZHTZ4EYI.js.map +0 -1
  419. package/dist/control.js.map +0 -1
  420. package/dist/hosted/index.js.map +0 -1
  421. package/dist/matrix/index.js.map +0 -1
  422. package/dist/reporting.js.map +0 -1
  423. package/dist/rollout/index.js.map +0 -1
  424. package/dist/run-campaign-OJJ7CZF4.js +0 -18
  425. package/dist/run-campaign-OJJ7CZF4.js.map +0 -1
  426. package/dist/supervisor-run/index.js.map +0 -1
  427. package/dist/traces.js.map +0 -1
  428. package/dist/wire/index.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/benchmarks/index.ts","../src/benchmarks/calibration.ts","../src/benchmarks/routing/index.ts","../src/benchmarks/types.ts","../src/benchmarks/routing/dataset.ts","../src/benchmarks/runner.ts","../src/benchmarks/standard-formats.ts"],"sourcesContent":["/**\n * Reference benchmark wrappers — entry point.\n *\n * Core surface (exported here):\n * - The `BenchmarkAdapter` contract.\n * - `runBenchmarkAdapter` for campaign-backed benchmark execution.\n * - `calibrateBenchmarkMetric` for weak/strong metric checks.\n * - Standard retrieval parsers for BEIR/MTEB/MS MARCO/TREC/MIRACL-style files.\n * - `deterministicSplit` + `BENCHMARK_SPLIT_SEED` for split assignment.\n * - `routing` — synthetic 16-task router benchmark. The only novel\n * benchmark we built; ships in the package.\n *\n * Example wrappers (under `examples/benchmarks/`, NOT in the bundle):\n * - `gsm8k` — exact-match math reasoning (HF mirror, dataset\n * not bundled).\n * - `swebench-lite` — 30-instance SWE-Bench subset via an external\n * grader command.\n *\n * The example wrappers are reference implementations of `BenchmarkAdapter`.\n * Read them, copy them, adapt them. They're intentionally not in the main\n * entry — every team will configure them differently.\n */\n\nexport {\n type BenchmarkMetricCalibrationOptions,\n type BenchmarkMetricCalibrationResult,\n calibrateBenchmarkMetric,\n} from './calibration'\nexport * as routing from './routing/index'\nexport {\n type BenchmarkDistribution,\n type BenchmarkReport,\n type BenchmarkRunOptions,\n type BenchmarkRunResult,\n type BenchmarkSliceSummary,\n renderBenchmarkReportMarkdown,\n runBenchmarkAdapter,\n summarizeBenchmarkCampaign,\n} from './runner'\nexport {\n type BuildStandardRetrievalItemsOptions,\n buildStandardRetrievalItems,\n createRetrievalIdBenchmarkAdapter,\n evaluateStandardRetrieval,\n normalizeRetrievedDocumentIds,\n parseBeirCorpusJsonl,\n parseBeirQueriesJsonl,\n parseJsonlRows,\n parseQrels,\n parseTsvRows,\n type RetrievalIdAdapterOptions,\n retrievalMetricsAtCutoff,\n type StandardRetrievalArtifact,\n type StandardRetrievalDocument,\n type StandardRetrievalEvaluationOptions,\n type StandardRetrievalPayload,\n type StandardRetrievalQrel,\n type StandardRetrievalQuery,\n type StandardRetrievalResult,\n} from './standard-formats'\nexport type {\n BenchmarkAdapter,\n BenchmarkDatasetItem,\n BenchmarkEvaluation,\n BenchmarkFamily,\n BenchmarkResponder,\n BenchmarkScenario,\n BenchmarkSource,\n BenchmarkTaskKind,\n} from './types'\nexport { BENCHMARK_SPLIT_SEED, deterministicSplit } from './types'\n","import type { BenchmarkAdapter, BenchmarkDatasetItem, BenchmarkEvaluation } from './types'\n\nexport interface BenchmarkMetricCalibrationOptions<TPayload = unknown, TArtifact = string> {\n adapter: BenchmarkAdapter<BenchmarkDatasetItem<TPayload>, TPayload, TArtifact>\n item: BenchmarkDatasetItem<TPayload>\n weakArtifact: TArtifact\n strongArtifact: TArtifact\n maxWeakScore?: number\n minStrongScore?: number\n minGap?: number\n}\n\nexport interface BenchmarkMetricCalibrationResult {\n passed: boolean\n weak: BenchmarkEvaluation\n strong: BenchmarkEvaluation\n weakScore: number\n strongScore: number\n gap: number\n reasons: string[]\n}\n\nexport async function calibrateBenchmarkMetric<TPayload = unknown, TArtifact = string>(\n options: BenchmarkMetricCalibrationOptions<TPayload, TArtifact>,\n): Promise<BenchmarkMetricCalibrationResult> {\n const weak = await options.adapter.evaluate(options.item, options.weakArtifact)\n const strong = await options.adapter.evaluate(options.item, options.strongArtifact)\n const weakScore = clamp01(weak.score)\n const strongScore = clamp01(strong.score)\n const maxWeakScore = options.maxWeakScore ?? 0.3\n const minStrongScore = options.minStrongScore ?? 0.7\n const minGap = options.minGap ?? 0.4\n const gap = strongScore - weakScore\n const reasons = [\n weakScore <= maxWeakScore\n ? undefined\n : `weak score ${weakScore.toFixed(3)} exceeds max ${maxWeakScore.toFixed(3)}`,\n strongScore >= minStrongScore\n ? undefined\n : `strong score ${strongScore.toFixed(3)} below min ${minStrongScore.toFixed(3)}`,\n gap >= minGap ? undefined : `gap ${gap.toFixed(3)} below min ${minGap.toFixed(3)}`,\n ].filter((reason): reason is string => Boolean(reason))\n\n return {\n passed: reasons.length === 0,\n weak,\n strong,\n weakScore,\n strongScore,\n gap,\n reasons,\n }\n}\n\nfunction clamp01(value: number): number {\n if (!Number.isFinite(value)) return 0\n if (value < 0) return 0\n if (value > 1) return 1\n return value\n}\n","/**\n * Routing benchmark — synthetic, dependency-free, ships in the\n * package. 16 cross-category items in `dataset.ts`. See\n * `routing/README.md` for the format.\n *\n * `evaluate` does case-insensitive exact match against the canonical\n * route plus declared synonyms. The first valid route token in the\n * response wins; everything else is ignored. Wrong answers also\n * report whether they hit a hard negative — useful when triaging\n * \"always picks the popular route\" failure modes.\n */\n\nimport type { RunSplitTag } from '../../run-record'\nimport type { BenchmarkAdapter, BenchmarkDatasetItem, BenchmarkEvaluation } from '../types'\nimport { deterministicSplit } from '../types'\nimport { ROUTING_DATASET, type RoutingItem } from './dataset'\n\nexport type { RoutingItem }\nexport type RoutingPayload = RoutingItem\nexport type RoutingDatasetItem = BenchmarkDatasetItem<RoutingPayload>\n\nclass RoutingAdapter implements BenchmarkAdapter<RoutingDatasetItem, RoutingPayload> {\n readonly id = 'first-party/routing'\n readonly family = 'first-party'\n readonly taskKind = 'routing'\n readonly description = 'Synthetic fixed-route classification smoke benchmark'\n readonly defaultMetric = 'route_exact_match'\n\n async loadDataset(split: RunSplitTag): Promise<RoutingDatasetItem[]> {\n return ROUTING_DATASET.map((item) => ({ id: item.id, payload: item })).filter(\n (it) => assignSplitImpl(it.id) === split,\n )\n }\n\n async evaluate(item: RoutingDatasetItem, response: string): Promise<BenchmarkEvaluation> {\n const tokens = extractRouteTokens(response)\n const correct = new Set<string>(\n [item.payload.route, ...item.payload.synonyms].map((s) => s.toLowerCase()),\n )\n const hardNeg = new Set<string>(item.payload.hardNegatives.map((s) => s.toLowerCase()))\n const firstMatch = tokens.find((t) => correct.has(t.toLowerCase())) ?? null\n const firstHardNeg = tokens.find((t) => hardNeg.has(t.toLowerCase())) ?? null\n const score = firstMatch ? 1 : 0\n return {\n score,\n raw: {\n firstToken: tokens[0] ?? null,\n matchedRoute: firstMatch,\n hitHardNegative: Boolean(firstHardNeg),\n hardNegativeRoute: firstHardNeg,\n category: item.payload.category,\n },\n }\n }\n\n assignSplit(itemId: string): RunSplitTag {\n return assignSplitImpl(itemId)\n }\n}\n\nfunction assignSplitImpl(itemId: string): RunSplitTag {\n return deterministicSplit(`routing::${itemId}`)\n}\n\n/**\n * Pull route-shaped tokens out of a model response. Routes look like\n * `category.action` (`fs.write`, `chat.reply`). Bare alphanumerics\n * are not routes, but `category.action` patterns are robust to most\n * model wrappers (JSON output, prose explanations, code fences).\n */\nexport function extractRouteTokens(response: string): string[] {\n const matches = response.match(/[a-z][a-z0-9_]*\\.[a-z][a-z0-9_]*/gi)\n return matches ?? []\n}\n\nconst adapter = new RoutingAdapter()\n\nexport const loadDataset = adapter.loadDataset.bind(adapter)\nexport const evaluate = adapter.evaluate.bind(adapter)\nexport const assignSplit = adapter.assignSplit.bind(adapter)\nexport { ROUTING_DATASET, RoutingAdapter }\n","/**\n * Shared types for the reference benchmark wrappers under\n * `src/benchmarks/`. Each wrapper exports the three functions in\n * `BenchmarkAdapter` plus its own typed `DatasetItem` shape.\n */\n\nimport type { DispatchContext, Scenario } from '../campaign/types'\nimport type { RunSplitTag } from '../run-record'\n\nexport type BenchmarkTaskKind =\n | 'retrieval'\n | 'rag-answer'\n | 'hallucination'\n | 'kb-improvement'\n | 'routing'\n | 'custom'\n\nexport type BenchmarkFamily =\n | 'beir'\n | 'mteb-retrieval'\n | 'msmarco'\n | 'trec-dl'\n | 'miracl'\n | 'lotte'\n | 'bright'\n | 'crag'\n | 'hotpotqa'\n | 'kilt'\n | 'ragtruth'\n | 'faithbench'\n | 'first-party'\n | 'custom'\n\nexport interface BenchmarkDatasetItem<TPayload = unknown> {\n /** Stable dataset-local item id (used for split assignment + paper\n * references). Unique within a benchmark. */\n id: string\n /** Free-form payload. Each benchmark defines its own shape. */\n payload: TPayload\n /** Optional precomputed split. When absent, adapters use assignSplit(id). */\n split?: RunSplitTag\n /** Benchmark family this row came from, e.g. `beir` or `crag`. */\n family?: BenchmarkFamily | string\n /** Benchmark-local task kind, e.g. retrieval vs answer quality. */\n taskKind?: BenchmarkTaskKind | string\n /** Slice labels such as language, domain, freshness, multihop, long-tail. */\n tags?: string[]\n /** Dataset provenance, version, URL, or license notes. */\n source?: BenchmarkSource\n metadata?: Record<string, unknown>\n}\n\nexport interface BenchmarkEvaluation {\n /** [0, 1] score for the response on this item. Exact-match\n * benchmarks use 0/1; partial-credit benchmarks may return\n * fractional values. */\n score: number\n /** Optional pass/fail projection. Defaults to `score > 0` when absent. */\n passed?: boolean\n /** Numeric sub-metrics. These become report dimensions. */\n dimensions?: Record<string, number>\n /** Optional bag of raw scoring signals — e.g. parsed numeric\n * answer, regex match, judge sub-scores. */\n raw: Record<string, unknown>\n notes?: string\n}\n\nexport interface BenchmarkSource {\n name?: string\n url?: string\n version?: string\n license?: string\n citation?: string\n}\n\n/** Common signature implemented by every adapter under `src/benchmarks/*`. */\n// `TPayload` is the per-item payload type; `_TItem` is preserved for\n// downstream type-narrowing extensions (a richer `BenchmarkDatasetItem`\n// subclass that adds e.g. provenance metadata) but is intentionally\n// unused here. `noUnusedLocals` requires the leading underscore.\nexport interface BenchmarkAdapter<_TItem = unknown, TPayload = unknown, TArtifact = string> {\n /** Stable benchmark id such as `beir/nfcorpus` or `crag/smoke`. */\n id?: string\n family?: BenchmarkFamily | string\n taskKind?: BenchmarkTaskKind | string\n description?: string\n source?: BenchmarkSource\n defaultMetric?: string\n /** Load the dataset for the given split. May hit the network on\n * first call but should be cache-friendly. Adapters that don't\n * ship the dataset itself MUST throw a clearly-marked error\n * pointing the caller at the loader script. */\n loadDataset(split: RunSplitTag): Promise<BenchmarkDatasetItem<TPayload>[]>\n /** Score a single response. Pure with respect to the inputs. */\n evaluate(item: BenchmarkDatasetItem<TPayload>, artifact: TArtifact): Promise<BenchmarkEvaluation>\n /** Deterministic split assignment via item id hashing. The\n * fraction of items in each split is implementation-defined but\n * MUST be stable across processes and platforms. */\n assignSplit(itemId: string): RunSplitTag\n}\n\nexport interface BenchmarkScenario<TPayload = unknown> extends Scenario {\n kind: 'benchmark'\n benchmarkId: string\n family: BenchmarkFamily | string\n taskKind: BenchmarkTaskKind | string\n splitTag: RunSplitTag\n item: BenchmarkDatasetItem<TPayload>\n}\n\nexport type BenchmarkResponder<TPayload = unknown, TArtifact = string> = (input: {\n scenario: BenchmarkScenario<TPayload>\n item: BenchmarkDatasetItem<TPayload>\n context: DispatchContext\n}) => Promise<TArtifact> | TArtifact\n\n// ── Deterministic split assignment ───────────────────────────────────\n\n/**\n * 32-bit FNV-1a hash. Stable, allocation-free, deterministic across\n * runtimes. We use it to assign items to splits rather than depending\n * on a polyfilled crypto.subtle path.\n */\nfunction fnv1a32(input: string): number {\n let h = 0x811c9dc5\n for (let i = 0; i < input.length; i++) {\n h ^= input.charCodeAt(i) & 0xff\n h = (h + ((h << 1) + (h << 4) + (h << 7) + (h << 8) + (h << 24))) >>> 0\n }\n return h >>> 0\n}\n\n/** Split-assignment seed shared across all benchmarks. Bumping this\n * value reshuffles every split — do NOT do that lightly. */\nexport const BENCHMARK_SPLIT_SEED = 'agent-eval-v1'\n\n/**\n * Assign an item id to one of `'search' | 'dev' | 'holdout'` using a\n * stable 32-bit hash of `${seed}::${id}`. Default proportions:\n *\n * search: 60% (optimization-readable)\n * dev: 20% (held-out for tuning, leak-on-purpose during dev)\n * holdout:20% (paper-grade held-out, gated reads)\n */\nexport function deterministicSplit(\n itemId: string,\n seed: string = BENCHMARK_SPLIT_SEED,\n): RunSplitTag {\n const h = fnv1a32(`${seed}::${itemId}`)\n const pos = h / 0x100000000\n if (pos < 0.6) return 'search'\n if (pos < 0.8) return 'dev'\n return 'holdout'\n}\n","/**\n * Synthetic routing dataset. 16 tasks across 4 categories. Used as a\n * deterministic, dependency-free benchmark for any router that maps a\n * natural-language request to one of a fixed set of route labels.\n *\n * Format (see `routing/README.md` for prose):\n *\n * {\n * id: stable per-task ID (matches across processes).\n * category: one of the four route labels.\n * prompt: the user-facing request the router must classify.\n * route: the ground-truth route the router should pick.\n * synonyms: other strings that count as a correct answer.\n * hardNegatives:close-but-wrong route labels — used to detect the\n * \"always picks the popular route\" failure mode.\n * }\n *\n * The four categories are intentionally cross-domain (file ops,\n * math, search, conversation) so a router that collapses to one\n * category is easy to spot.\n */\n\nexport interface RoutingItem {\n id: string\n category: 'file' | 'math' | 'search' | 'chat'\n prompt: string\n /** Canonical correct route label. */\n route: string\n /** Alternate route labels that also count as correct. */\n synonyms: string[]\n /** Wrong-but-tempting route labels (for analysis, not grading). */\n hardNegatives: string[]\n}\n\nexport const ROUTING_DATASET: RoutingItem[] = [\n {\n id: 'file_001',\n category: 'file',\n prompt: 'Save the meeting notes to /tmp/notes-2025-04.md as markdown.',\n route: 'fs.write',\n synonyms: ['filesystem.write', 'write_file'],\n hardNegatives: ['fs.read', 'chat.reply'],\n },\n {\n id: 'file_002',\n category: 'file',\n prompt: 'Read the contents of /etc/hosts and summarize the entries.',\n route: 'fs.read',\n synonyms: ['filesystem.read', 'read_file'],\n hardNegatives: ['fs.write', 'search.web'],\n },\n {\n id: 'file_003',\n category: 'file',\n prompt: 'List every Python file under src/ recursively.',\n route: 'fs.list',\n synonyms: ['filesystem.list', 'list_files'],\n hardNegatives: ['fs.read', 'search.code'],\n },\n {\n id: 'file_004',\n category: 'file',\n prompt: 'Delete the cached build at .turbo/cache.',\n route: 'fs.delete',\n synonyms: ['filesystem.delete', 'remove_file'],\n hardNegatives: ['fs.write', 'fs.list'],\n },\n {\n id: 'math_001',\n category: 'math',\n prompt: 'What is the integral of 3x^2 + 2x from 0 to 5?',\n route: 'math.integral',\n synonyms: ['calculator.integral', 'math.solve'],\n hardNegatives: ['math.derivative', 'chat.reply'],\n },\n {\n id: 'math_002',\n category: 'math',\n prompt: 'Compute the derivative of sin(x) * cos(x).',\n route: 'math.derivative',\n synonyms: ['calculator.derivative', 'math.solve'],\n hardNegatives: ['math.integral', 'math.algebra'],\n },\n {\n id: 'math_003',\n category: 'math',\n prompt: 'Solve 2x + 7 = 19 for x.',\n route: 'math.algebra',\n synonyms: ['calculator.algebra', 'math.solve'],\n hardNegatives: ['math.derivative', 'math.integral'],\n },\n {\n id: 'math_004',\n category: 'math',\n prompt: 'What is the prime factorization of 360?',\n route: 'math.numbertheory',\n synonyms: ['calculator.factor', 'math.solve'],\n hardNegatives: ['math.algebra', 'search.web'],\n },\n {\n id: 'search_001',\n category: 'search',\n prompt: 'Find recent papers on agent prompt optimization with held-out promotion gates.',\n route: 'search.web',\n synonyms: ['web.search', 'search.papers'],\n hardNegatives: ['search.code', 'chat.reply'],\n },\n {\n id: 'search_002',\n category: 'search',\n prompt: 'Search the codebase for every call site of `runProposeReview`.',\n route: 'search.code',\n synonyms: ['code.search', 'grep'],\n hardNegatives: ['search.web', 'fs.read'],\n },\n {\n id: 'search_003',\n category: 'search',\n prompt: 'What is the latest release of the Tangle network on GitHub?',\n route: 'search.web',\n synonyms: ['web.search', 'github.releases'],\n hardNegatives: ['search.code', 'chat.reply'],\n },\n {\n id: 'search_004',\n category: 'search',\n prompt: 'Find all TODO comments in the agent-eval src tree.',\n route: 'search.code',\n synonyms: ['code.search', 'grep'],\n hardNegatives: ['search.web', 'fs.list'],\n },\n {\n id: 'chat_001',\n category: 'chat',\n prompt: 'Hi there, how are you doing today?',\n route: 'chat.reply',\n synonyms: ['conversation.reply'],\n hardNegatives: ['search.web', 'fs.read'],\n },\n {\n id: 'chat_002',\n category: 'chat',\n prompt: 'Please explain the difference between an LLM and a foundation model.',\n route: 'chat.reply',\n synonyms: ['conversation.reply', 'qa.answer'],\n hardNegatives: ['search.web', 'math.algebra'],\n },\n {\n id: 'chat_003',\n category: 'chat',\n prompt: 'Tell me a short joke about distributed systems.',\n route: 'chat.reply',\n synonyms: ['conversation.reply'],\n hardNegatives: ['search.web', 'fs.read'],\n },\n {\n id: 'chat_004',\n category: 'chat',\n prompt: 'Acknowledge my last message with a thumbs up.',\n route: 'chat.reply',\n synonyms: ['conversation.reply', 'react'],\n hardNegatives: ['fs.write', 'search.web'],\n },\n]\n","import { join } from 'node:path'\nimport {\n type CampaignResult,\n type DispatchFn,\n type JudgeConfig,\n type JudgeScore,\n runCampaign,\n type Scenario,\n} from '../campaign'\nimport { type CampaignStorage, fsCampaignStorage } from '../campaign/storage'\nimport type { RunSplitTag } from '../run-record'\nimport type {\n BenchmarkAdapter,\n BenchmarkDatasetItem,\n BenchmarkEvaluation,\n BenchmarkFamily,\n BenchmarkResponder,\n BenchmarkScenario,\n BenchmarkTaskKind,\n} from './types'\n\nexport interface BenchmarkRunOptions<TPayload = unknown, TArtifact = string> {\n adapter: BenchmarkAdapter<BenchmarkDatasetItem<TPayload>, TPayload, TArtifact>\n respond: BenchmarkResponder<TPayload, TArtifact>\n splits?: readonly RunSplitTag[]\n runDir: string\n repo?: string\n seed?: number\n reps?: number\n resumable?: boolean\n costCeiling?: number\n maxConcurrency?: number\n dispatchTimeoutMs?: number\n expectUsage?: 'assert' | 'warn' | 'off'\n storage?: CampaignStorage\n now?: () => Date\n}\n\nexport interface BenchmarkReport {\n benchmarkId: string\n family: BenchmarkFamily | string\n taskKind: BenchmarkTaskKind | string\n source?: BenchmarkAdapter['source']\n runDir: string\n manifestHash: string\n seed: number\n startedAt: string\n endedAt: string\n durationMs: number\n totalItems: number\n totalCells: number\n cellsFailed: number\n cellsCached: number\n totalCostUsd: number\n splits: Record<string, BenchmarkSliceSummary>\n tags: Record<string, BenchmarkSliceSummary>\n dimensions: Record<string, BenchmarkDistribution>\n score: BenchmarkDistribution\n costUsd: BenchmarkDistribution\n latencyMs: BenchmarkDistribution\n}\n\nexport interface BenchmarkSliceSummary {\n n: number\n meanScore: number\n passRate: number\n score: BenchmarkDistribution\n costUsd: BenchmarkDistribution\n latencyMs: BenchmarkDistribution\n}\n\nexport interface BenchmarkDistribution {\n n: number\n min: number\n mean: number\n median: number\n p90: number\n max: number\n}\n\nexport interface BenchmarkRunResult<TPayload = unknown, TArtifact = string> {\n scenarios: Array<BenchmarkScenario<TPayload>>\n campaign: CampaignResult<TArtifact, BenchmarkScenario<TPayload>>\n report: BenchmarkReport\n reportJsonPath: string\n reportMarkdownPath: string\n}\n\nexport async function runBenchmarkAdapter<TPayload = unknown, TArtifact = string>(\n options: BenchmarkRunOptions<TPayload, TArtifact>,\n): Promise<BenchmarkRunResult<TPayload, TArtifact>> {\n const storage = options.storage ?? fsCampaignStorage()\n const benchmarkId = benchmarkIdFor(options.adapter)\n const scenarios = await loadBenchmarkScenarios(options.adapter, options.splits)\n const judge = benchmarkAdapterJudge(options.adapter)\n const dispatch: DispatchFn<BenchmarkScenario<TPayload>, TArtifact> = async (\n scenario,\n context,\n ) => {\n return options.respond({ scenario, item: scenario.item, context })\n }\n\n const campaign = await runCampaign<BenchmarkScenario<TPayload>, TArtifact>({\n scenarios,\n dispatch,\n dispatchRef: `benchmark:${benchmarkId}`,\n judges: [judge],\n seed: options.seed,\n reps: options.reps,\n resumable: options.resumable,\n costCeiling: options.costCeiling,\n maxConcurrency: options.maxConcurrency,\n dispatchTimeoutMs: options.dispatchTimeoutMs,\n expectUsage: options.expectUsage ?? 'off',\n runDir: options.runDir,\n repo: options.repo,\n storage,\n now: options.now,\n })\n const report = summarizeBenchmarkCampaign({\n adapter: options.adapter,\n scenarios,\n campaign,\n })\n storage.ensureDir(campaign.runDir)\n const reportJsonPath = join(campaign.runDir, 'benchmark-report.json')\n const reportMarkdownPath = join(campaign.runDir, 'benchmark-report.md')\n storage.write(reportJsonPath, `${JSON.stringify(report, null, 2)}\\n`)\n storage.write(reportMarkdownPath, renderBenchmarkReportMarkdown(report))\n return { scenarios, campaign, report, reportJsonPath, reportMarkdownPath }\n}\n\nexport async function loadBenchmarkScenarios<TPayload>(\n adapter: BenchmarkAdapter<BenchmarkDatasetItem<TPayload>, TPayload, unknown>,\n splits: readonly RunSplitTag[] = ['search', 'dev', 'holdout'],\n): Promise<Array<BenchmarkScenario<TPayload>>> {\n const benchmarkId = benchmarkIdFor(adapter)\n const family = adapter.family ?? 'custom'\n const taskKind = adapter.taskKind ?? 'custom'\n const out: Array<BenchmarkScenario<TPayload>> = []\n const seen = new Set<string>()\n for (const split of splits) {\n const items = await adapter.loadDataset(split)\n for (const item of items) {\n const splitTag = item.split ?? adapter.assignSplit(item.id)\n if (splitTag !== split) continue\n const key = `${benchmarkId}:${item.id}`\n if (seen.has(key)) continue\n seen.add(key)\n out.push({\n id: key,\n kind: 'benchmark',\n benchmarkId,\n family: item.family ?? family,\n taskKind: item.taskKind ?? taskKind,\n splitTag,\n tags: [...new Set([splitTag, ...(item.tags ?? [])])],\n item,\n })\n }\n }\n return out\n}\n\nexport function benchmarkAdapterJudge<TPayload, TArtifact>(\n adapter: BenchmarkAdapter<BenchmarkDatasetItem<TPayload>, TPayload, TArtifact>,\n): JudgeConfig<TArtifact, BenchmarkScenario<TPayload>> {\n const benchmarkId = benchmarkIdFor(adapter)\n return {\n name: `${benchmarkId}:score`,\n dimensions: [\n { key: 'score', description: `Primary ${benchmarkId} benchmark score` },\n { key: 'passed', description: 'Binary pass projection for aggregate reporting' },\n ],\n appliesTo: (scenario: Scenario): scenario is BenchmarkScenario<TPayload> => {\n return scenario.kind === 'benchmark' && scenario.id.startsWith(`${benchmarkId}:`)\n },\n async score({ artifact, scenario }) {\n const evaluation = await adapter.evaluate(scenario.item, artifact)\n const dimensions = normalizeEvaluationDimensions(evaluation)\n return {\n dimensions,\n composite: clamp01(evaluation.score),\n notes: evaluation.notes ?? '',\n }\n },\n }\n}\n\nexport function summarizeBenchmarkCampaign<TPayload, TArtifact>(input: {\n adapter: BenchmarkAdapter<BenchmarkDatasetItem<TPayload>, TPayload, TArtifact>\n scenarios: Array<BenchmarkScenario<TPayload>>\n campaign: CampaignResult<TArtifact, BenchmarkScenario<TPayload>>\n}): BenchmarkReport {\n const scenarioById = new Map(input.scenarios.map((scenario) => [scenario.id, scenario]))\n const rows = input.campaign.cells.map((cell) => {\n const scenario = scenarioById.get(cell.scenarioId)\n const judge = firstJudgeScore(cell.judgeScores)\n const score = judge?.composite ?? 0\n return {\n cell,\n scenario,\n score,\n passed: (judge?.dimensions.passed ?? (score > 0 ? 1 : 0)) >= 1,\n dimensions: judge?.dimensions ?? {},\n }\n })\n const successful = rows.filter((row) => !row.cell.error)\n const scoreValues = successful.map((row) => row.score)\n return {\n benchmarkId: benchmarkIdFor(input.adapter),\n family: input.adapter.family ?? 'custom',\n taskKind: input.adapter.taskKind ?? 'custom',\n ...(input.adapter.source ? { source: input.adapter.source } : {}),\n runDir: input.campaign.runDir,\n manifestHash: input.campaign.manifestHash,\n seed: input.campaign.seed,\n startedAt: input.campaign.startedAt,\n endedAt: input.campaign.endedAt,\n durationMs: input.campaign.durationMs,\n totalItems: input.scenarios.length,\n totalCells: input.campaign.cells.length,\n cellsFailed: input.campaign.aggregates.cellsFailed,\n cellsCached: input.campaign.aggregates.cellsCached,\n totalCostUsd: input.campaign.aggregates.cost.totalCostUsd,\n splits: summarizeSlices(successful, (row) => row.scenario?.splitTag ?? 'unknown', [\n 'search',\n 'dev',\n 'holdout',\n ]),\n tags: summarizeSlices(successful, (row) => row.scenario?.tags ?? []),\n dimensions: summarizeDimensions(successful.map((row) => row.dimensions)),\n score: distribution(scoreValues),\n costUsd: distribution(successful.map((row) => row.cell.costUsd)),\n latencyMs: distribution(successful.map((row) => row.cell.durationMs)),\n }\n}\n\nexport function renderBenchmarkReportMarkdown(report: BenchmarkReport): string {\n const splitRows = Object.entries(report.splits)\n .map(([split, summary]) => {\n return `| ${split} | ${summary.n} | ${fmt(summary.meanScore)} | ${fmt(summary.passRate)} | ${fmt(summary.score.p90)} | ${fmt(summary.costUsd.mean)} | ${fmt(summary.latencyMs.p90)} |`\n })\n .join('\\n')\n const dimRows = Object.entries(report.dimensions)\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([key, dist]) => `| ${key} | ${dist.n} | ${fmt(dist.mean)} | ${fmt(dist.p90)} |`)\n .join('\\n')\n return [\n `# Benchmark Report: ${report.benchmarkId}`,\n '',\n `- family: ${report.family}`,\n `- task kind: ${report.taskKind}`,\n `- run dir: ${report.runDir}`,\n `- manifest: ${report.manifestHash}`,\n `- cells: ${report.totalCells} total, ${report.cellsFailed} failed, ${report.cellsCached} cached`,\n `- cost: $${fmt(report.totalCostUsd)}`,\n `- score: mean ${fmt(report.score.mean)}, median ${fmt(report.score.median)}, p90 ${fmt(report.score.p90)}, n=${report.score.n}`,\n '',\n '## Splits',\n '',\n '| split | n | mean score | pass rate | score p90 | mean cost | latency p90 ms |',\n '| --- | ---: | ---: | ---: | ---: | ---: | ---: |',\n splitRows || '| none | 0 | 0 | 0 | 0 | 0 | 0 |',\n '',\n '## Dimensions',\n '',\n '| dimension | n | mean | p90 |',\n '| --- | ---: | ---: | ---: |',\n dimRows || '| none | 0 | 0 | 0 |',\n '',\n ].join('\\n')\n}\n\nfunction benchmarkIdFor(adapter: Pick<BenchmarkAdapter, 'id' | 'family' | 'taskKind'>): string {\n return adapter.id ?? `${adapter.family ?? 'custom'}/${adapter.taskKind ?? 'custom'}`\n}\n\nfunction normalizeEvaluationDimensions(evaluation: BenchmarkEvaluation): Record<string, number> {\n const dimensions: Record<string, number> = { score: clamp01(evaluation.score) }\n for (const [key, value] of Object.entries(evaluation.dimensions ?? {})) {\n if (Number.isFinite(value)) dimensions[key] = value\n }\n dimensions.passed = (evaluation.passed ?? evaluation.score > 0) ? 1 : 0\n return dimensions\n}\n\nfunction summarizeDimensions(\n rows: Array<Record<string, number>>,\n): Record<string, BenchmarkDistribution> {\n const values = new Map<string, number[]>()\n for (const row of rows) {\n for (const [key, value] of Object.entries(row)) {\n if (!Number.isFinite(value)) continue\n const list = values.get(key) ?? []\n list.push(value)\n values.set(key, list)\n }\n }\n return Object.fromEntries([...values.entries()].map(([key, vals]) => [key, distribution(vals)]))\n}\n\nfunction summarizeSlices<T>(\n rows: T[],\n keyOf: (row: T) => string | string[],\n knownKeys: readonly string[] = [],\n): Record<string, BenchmarkSliceSummary> {\n const grouped = new Map<string, T[]>()\n for (const key of knownKeys) grouped.set(key, [])\n for (const row of rows) {\n const keys = keyOf(row)\n for (const key of Array.isArray(keys) ? keys : [keys]) {\n const list = grouped.get(key) ?? []\n list.push(row)\n grouped.set(key, list)\n }\n }\n const out: Record<string, BenchmarkSliceSummary> = {}\n for (const [key, list] of grouped) {\n const withShape = list as Array<{\n score: number\n passed: boolean\n cell: { costUsd: number; durationMs: number }\n }>\n out[key] = {\n n: list.length,\n meanScore: mean(withShape.map((row) => row.score)),\n passRate: mean(withShape.map((row) => (row.passed ? 1 : 0))),\n score: distribution(withShape.map((row) => row.score)),\n costUsd: distribution(withShape.map((row) => row.cell.costUsd)),\n latencyMs: distribution(withShape.map((row) => row.cell.durationMs)),\n }\n }\n return out\n}\n\nfunction firstJudgeScore(\n judgeScores: CampaignResult<unknown>['cells'][number]['judgeScores'],\n): JudgeScore | undefined {\n return Object.values(judgeScores)[0]\n}\n\nfunction distribution(values: readonly number[]): BenchmarkDistribution {\n const finite = [...values].filter(Number.isFinite).sort((a, b) => a - b)\n if (finite.length === 0) return { n: 0, min: 0, mean: 0, median: 0, p90: 0, max: 0 }\n return {\n n: finite.length,\n min: finite[0]!,\n mean: mean(finite),\n median: percentile(finite, 0.5),\n p90: percentile(finite, 0.9),\n max: finite[finite.length - 1]!,\n }\n}\n\nfunction percentile(sortedValues: readonly number[], p: number): number {\n if (sortedValues.length === 0) return 0\n const index = Math.min(\n sortedValues.length - 1,\n Math.max(0, Math.ceil(p * sortedValues.length) - 1),\n )\n return sortedValues[index]!\n}\n\nfunction mean(values: readonly number[]): number {\n const finite = values.filter(Number.isFinite)\n if (finite.length === 0) return 0\n return finite.reduce((sum, value) => sum + value, 0) / finite.length\n}\n\nfunction clamp01(value: number): number {\n if (!Number.isFinite(value)) return 0\n if (value < 0) return 0\n if (value > 1) return 1\n return value\n}\n\nfunction fmt(value: number): string {\n if (!Number.isFinite(value)) return '0'\n return value.toFixed(value === 0 || Math.abs(value) >= 10 ? 0 : 3)\n}\n","import type { RunSplitTag } from '../run-record'\nimport type {\n BenchmarkAdapter,\n BenchmarkDatasetItem,\n BenchmarkFamily,\n BenchmarkSource,\n BenchmarkTaskKind,\n} from './types'\nimport { deterministicSplit } from './types'\n\nexport interface StandardRetrievalDocument {\n id: string\n title?: string\n text: string\n metadata?: Record<string, unknown>\n}\n\nexport interface StandardRetrievalQuery {\n id: string\n text: string\n metadata?: Record<string, unknown>\n}\n\nexport interface StandardRetrievalQrel {\n queryId: string\n documentId: string\n score: number\n}\n\nexport interface StandardRetrievalPayload {\n queryId: string\n query: string\n expectedDocumentIds: string[]\n expectedScores: Record<string, number>\n corpus?: Record<string, StandardRetrievalDocument>\n metadata?: Record<string, unknown>\n}\n\nexport interface BuildStandardRetrievalItemsOptions {\n benchmarkId: string\n family: BenchmarkFamily | string\n queries: readonly StandardRetrievalQuery[]\n qrels: readonly StandardRetrievalQrel[]\n corpus?: readonly StandardRetrievalDocument[]\n includeCorpusInPayload?: boolean\n source?: BenchmarkSource\n tags?: readonly string[]\n splitOf?: (queryId: string) => RunSplitTag\n}\n\nexport interface RetrievalIdAdapterOptions extends BuildStandardRetrievalItemsOptions {\n responseIdPattern?: RegExp\n cutoffs?: readonly number[]\n primaryMetric?: string\n passMetric?: string\n passThreshold?: number\n}\n\nexport interface StandardRetrievalResult {\n id?: string\n documentId?: string\n docId?: string\n score?: number\n}\n\nexport type StandardRetrievalArtifact =\n | string\n | readonly string[]\n | readonly StandardRetrievalResult[]\n | {\n ids?: readonly string[]\n documentIds?: readonly string[]\n results?: readonly StandardRetrievalResult[]\n }\n\nexport interface StandardRetrievalEvaluationOptions {\n responseIdPattern?: RegExp\n cutoffs?: readonly number[]\n primaryMetric?: string\n passMetric?: string\n passThreshold?: number\n}\n\nexport function parseJsonlRows<T = unknown>(text: string): T[] {\n return text\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter(Boolean)\n .map((line, index) => {\n try {\n return JSON.parse(line) as T\n } catch (error) {\n throw new Error(`invalid JSONL row ${index + 1}: ${(error as Error).message}`)\n }\n })\n}\n\nexport function parseTsvRows(text: string): string[][] {\n return text\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter(Boolean)\n .filter((line) => !line.startsWith('#'))\n .map((line) => line.split(/\\t|\\s+/))\n}\n\nexport function parseQrels(text: string): StandardRetrievalQrel[] {\n return parseTsvRows(text).flatMap((parts, index) => {\n if (parts.length < 3) return []\n const [queryId, maybeZeroOrDocId, maybeDocIdOrScore, maybeScore] = parts\n if (!queryId || !maybeZeroOrDocId || !maybeDocIdOrScore) return []\n if (queryId.toLowerCase() === 'query-id' || queryId.toLowerCase() === 'qid') return []\n const documentId = maybeScore === undefined ? maybeZeroOrDocId : maybeDocIdOrScore\n const scoreText = maybeScore === undefined ? maybeDocIdOrScore : maybeScore\n const score = Number(scoreText)\n if (!documentId || !Number.isFinite(score)) {\n throw new Error(`invalid qrels row ${index + 1}: expected query id, doc id, score`)\n }\n return [{ queryId, documentId, score }]\n })\n}\n\nexport function parseBeirCorpusJsonl(text: string): StandardRetrievalDocument[] {\n return parseJsonlRows<Record<string, unknown>>(text).map((row, index) => {\n const id = stringField(row, '_id') ?? stringField(row, 'id')\n const body = stringField(row, 'text') ?? stringField(row, 'contents')\n if (!id || body === undefined) {\n throw new Error(`invalid BEIR corpus row ${index + 1}: expected _id/id and text/contents`)\n }\n return {\n id,\n title: stringField(row, 'title'),\n text: body,\n metadata: stripKnown(row, ['_id', 'id', 'title', 'text', 'contents']),\n }\n })\n}\n\nexport function parseBeirQueriesJsonl(text: string): StandardRetrievalQuery[] {\n return parseJsonlRows<Record<string, unknown>>(text).map((row, index) => {\n const id = stringField(row, '_id') ?? stringField(row, 'id') ?? stringField(row, 'query_id')\n const query = stringField(row, 'text') ?? stringField(row, 'query')\n if (!id || !query) {\n throw new Error(`invalid BEIR query row ${index + 1}: expected _id/id and text/query`)\n }\n return {\n id,\n text: query,\n metadata: stripKnown(row, ['_id', 'id', 'query_id', 'text', 'query']),\n }\n })\n}\n\nexport function buildStandardRetrievalItems(\n options: BuildStandardRetrievalItemsOptions,\n): Array<BenchmarkDatasetItem<StandardRetrievalPayload>> {\n const qrelsByQuery = new Map<string, StandardRetrievalQrel[]>()\n for (const qrel of options.qrels) {\n if (qrel.score <= 0) continue\n const list = qrelsByQuery.get(qrel.queryId) ?? []\n list.push(qrel)\n qrelsByQuery.set(qrel.queryId, list)\n }\n const corpus =\n options.includeCorpusInPayload && options.corpus\n ? Object.fromEntries(options.corpus.map((document) => [document.id, document]))\n : undefined\n return options.queries.flatMap((query) => {\n const qrels = qrelsByQuery.get(query.id) ?? []\n if (qrels.length === 0) return []\n const split =\n options.splitOf?.(query.id) ?? deterministicSplit(`${options.benchmarkId}:${query.id}`)\n return [\n {\n id: query.id,\n split,\n family: options.family,\n taskKind: 'retrieval',\n tags: [...new Set([...(options.tags ?? []), split])],\n ...(options.source ? { source: options.source } : {}),\n ...(query.metadata ? { metadata: query.metadata } : {}),\n payload: {\n queryId: query.id,\n query: query.text,\n expectedDocumentIds: qrels.map((qrel) => qrel.documentId),\n expectedScores: Object.fromEntries(qrels.map((qrel) => [qrel.documentId, qrel.score])),\n ...(corpus ? { corpus } : {}),\n ...(query.metadata ? { metadata: query.metadata } : {}),\n },\n },\n ]\n })\n}\n\nexport function createRetrievalIdBenchmarkAdapter(\n options: RetrievalIdAdapterOptions,\n): BenchmarkAdapter<\n BenchmarkDatasetItem<StandardRetrievalPayload>,\n StandardRetrievalPayload,\n StandardRetrievalArtifact\n> {\n const items = buildStandardRetrievalItems(options)\n return {\n id: options.benchmarkId,\n family: options.family,\n taskKind: 'retrieval' satisfies BenchmarkTaskKind,\n source: options.source,\n defaultMetric: options.primaryMetric ?? 'ndcg@10',\n async loadDataset(split) {\n return items.filter((item) => item.split === split)\n },\n async evaluate(item, artifact) {\n return evaluateStandardRetrieval(item.payload, artifact, options)\n },\n assignSplit(itemId) {\n return options.splitOf?.(itemId) ?? deterministicSplit(`${options.benchmarkId}:${itemId}`)\n },\n }\n}\n\nexport function evaluateStandardRetrieval(\n payload: StandardRetrievalPayload,\n artifact: StandardRetrievalArtifact,\n options: StandardRetrievalEvaluationOptions = {},\n) {\n const rankedDocumentIds = normalizeRetrievedDocumentIds(\n artifact,\n options.responseIdPattern ?? /[A-Za-z0-9_.:/-]+/g,\n )\n const cutoffs = normalizeCutoffs(options.cutoffs ?? [1, 3, 5, 10])\n const dimensions: Record<string, number> = {\n expected_count: payload.expectedDocumentIds.length,\n returned_count: rankedDocumentIds.length,\n }\n for (const cutoff of cutoffs) {\n Object.assign(\n dimensions,\n retrievalMetricsAtCutoff({\n rankedDocumentIds,\n expectedScores: payload.expectedScores,\n cutoff,\n }),\n )\n }\n const primaryMetric = options.primaryMetric ?? 'ndcg@10'\n const passMetric = options.passMetric ?? 'hit@10'\n const score = dimensions[primaryMetric] ?? dimensions[`ndcg@${cutoffs[cutoffs.length - 1]}`] ?? 0\n const passScore =\n dimensions[passMetric] ?? dimensions[`hit@${cutoffs[cutoffs.length - 1]}`] ?? score\n return {\n score,\n passed: passScore >= (options.passThreshold ?? 1),\n dimensions,\n raw: {\n rankedDocumentIds,\n expectedDocumentIds: payload.expectedDocumentIds,\n expectedScores: payload.expectedScores,\n },\n }\n}\n\nexport function normalizeRetrievedDocumentIds(\n artifact: StandardRetrievalArtifact,\n responseIdPattern: RegExp = /[A-Za-z0-9_.:/-]+/g,\n): string[] {\n if (typeof artifact === 'string') {\n return uniqueOrdered((artifact.match(responseIdPattern) ?? []).map((value) => value.trim()))\n }\n if (Array.isArray(artifact)) {\n const entries = artifact as readonly (string | StandardRetrievalResult)[]\n return uniqueOrdered(\n entries.flatMap((entry) => {\n if (typeof entry === 'string') return [entry]\n return [entry.documentId ?? entry.docId ?? entry.id ?? '']\n }),\n )\n }\n const objectArtifact = artifact as Exclude<StandardRetrievalArtifact, string | readonly unknown[]>\n return uniqueOrdered(\n [\n ...(objectArtifact.documentIds ?? []),\n ...(objectArtifact.ids ?? []),\n ...(objectArtifact.results ?? []).map(\n (entry) => entry.documentId ?? entry.docId ?? entry.id ?? '',\n ),\n ].map((value) => value.trim()),\n )\n}\n\nexport function retrievalMetricsAtCutoff(input: {\n rankedDocumentIds: readonly string[]\n expectedScores: Record<string, number>\n cutoff: number\n}): Record<string, number> {\n const top = input.rankedDocumentIds.slice(0, input.cutoff)\n const relevantIds = Object.keys(input.expectedScores).filter(\n (id) => input.expectedScores[id]! > 0,\n )\n const relevant = new Set(relevantIds)\n const hits = top.filter((id) => relevant.has(id)).length\n const firstRelevantRank = top.findIndex((id) => relevant.has(id))\n const prefix = `@${input.cutoff}`\n return {\n [`hit${prefix}`]: hits > 0 ? 1 : 0,\n [`recall${prefix}`]: relevant.size === 0 ? 1 : hits / relevant.size,\n [`precision${prefix}`]: hits / input.cutoff,\n [`mrr${prefix}`]: firstRelevantRank === -1 ? 0 : 1 / (firstRelevantRank + 1),\n [`ndcg${prefix}`]: ndcgAt(input.rankedDocumentIds, input.expectedScores, input.cutoff),\n }\n}\n\nfunction stringField(row: Record<string, unknown>, key: string): string | undefined {\n const value = row[key]\n return typeof value === 'string' ? value : undefined\n}\n\nfunction stripKnown(\n row: Record<string, unknown>,\n keys: readonly string[],\n): Record<string, unknown> {\n const known = new Set(keys)\n return Object.fromEntries(Object.entries(row).filter(([key]) => !known.has(key)))\n}\n\nfunction normalizeCutoffs(cutoffs: readonly number[]): number[] {\n return [\n ...new Set(cutoffs.map((cutoff) => Math.trunc(cutoff)).filter((cutoff) => cutoff > 0)),\n ].sort((a, b) => a - b)\n}\n\nfunction uniqueOrdered(values: readonly string[]): string[] {\n const seen = new Set<string>()\n const out: string[] = []\n for (const value of values) {\n const trimmed = value.trim()\n if (!trimmed || seen.has(trimmed)) continue\n seen.add(trimmed)\n out.push(trimmed)\n }\n return out\n}\n\nfunction ndcgAt(\n rankedDocumentIds: readonly string[],\n expectedScores: Record<string, number>,\n cutoff: number,\n): number {\n const dcg = rankedDocumentIds\n .slice(0, cutoff)\n .reduce(\n (sum, documentId, index) => sum + discountedGain(expectedScores[documentId] ?? 0, index),\n 0,\n )\n const ideal = Object.values(expectedScores)\n .filter((score) => score > 0)\n .sort((a, b) => b - a)\n .slice(0, cutoff)\n .reduce((sum, score, index) => sum + discountedGain(score, index), 0)\n return ideal === 0 ? 1 : dcg / ideal\n}\n\nfunction discountedGain(relevance: number, zeroBasedRank: number): number {\n if (relevance <= 0) return 0\n return (2 ** relevance - 1) / Math.log2(zeroBasedRank + 2)\n}\n"],"mappings":"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","names":["adapter","clamp01"]}
@@ -1,274 +0,0 @@
1
- // src/matrix/aggregation.ts
2
- function flattenRuns(cells) {
3
- const rows = [];
4
- for (const { cell, runs } of cells) {
5
- for (const result of runs) rows.push({ cell, result });
6
- }
7
- return rows;
8
- }
9
- function quantile(sorted, q) {
10
- if (sorted.length === 0) return 0;
11
- if (sorted.length === 1) return sorted[0];
12
- const pos = (sorted.length - 1) * q;
13
- const lo = Math.floor(pos);
14
- const hi = Math.ceil(pos);
15
- if (lo === hi) return sorted[lo];
16
- const frac = pos - lo;
17
- return sorted[lo] * (1 - frac) + sorted[hi] * frac;
18
- }
19
- function summariseRows(rows, axisName, axisValue) {
20
- if (rows.length === 0) {
21
- return {
22
- axisName,
23
- axisValue,
24
- cells: 0,
25
- passRate: 0,
26
- meanScore: 0,
27
- p50Score: 0,
28
- p90Score: 0,
29
- totalCostUsd: 0,
30
- meanDurationMs: 0
31
- };
32
- }
33
- let pass = 0;
34
- let scoreSum = 0;
35
- let costSum = 0;
36
- let durSum = 0;
37
- const scores = [];
38
- for (const { result } of rows) {
39
- const errored = result.error !== void 0;
40
- const score = errored ? 0 : result.verdict.score;
41
- const valid = !errored && result.verdict.valid;
42
- if (valid) pass++;
43
- scoreSum += score;
44
- scores.push(score);
45
- costSum += result.costUsd;
46
- durSum += result.durationMs;
47
- }
48
- scores.sort((a, b) => a - b);
49
- return {
50
- axisName,
51
- axisValue,
52
- cells: rows.length,
53
- passRate: pass / rows.length,
54
- meanScore: scoreSum / rows.length,
55
- p50Score: quantile(scores, 0.5),
56
- p90Score: quantile(scores, 0.9),
57
- totalCostUsd: costSum,
58
- meanDurationMs: durSum / rows.length
59
- };
60
- }
61
- function bucketBy(rows, axisName, labelFor) {
62
- const buckets = /* @__PURE__ */ new Map();
63
- for (const row of rows) {
64
- const slot = row.cell.axes[axisName];
65
- if (!slot) continue;
66
- const id = slot.id;
67
- let arr = buckets.get(id);
68
- if (!arr) {
69
- arr = [];
70
- buckets.set(id, arr);
71
- }
72
- arr.push(row);
73
- }
74
- const out = {};
75
- for (const id of [...buckets.keys()].sort()) {
76
- out[id] = summariseRows(buckets.get(id), axisName, labelFor(id));
77
- }
78
- return out;
79
- }
80
- function buildByAxis(cells, axes, aggregateBy) {
81
- const rows = flattenRuns(cells);
82
- const byName = new Map(axes.map((a) => [a.name, a]));
83
- const byAxis = {};
84
- for (const name of aggregateBy) {
85
- const axis = byName.get(name);
86
- const labelFor = (id) => {
87
- if (!axis?.label) return id;
88
- const found = axis.values.find((v) => v.id === id);
89
- if (!found) return id;
90
- return axis.label(found.value, id);
91
- };
92
- byAxis[name] = bucketBy(rows, name, labelFor);
93
- }
94
- return byAxis;
95
- }
96
-
97
- // src/matrix/runner.ts
98
- function cartesian(axes) {
99
- if (axes.length === 0) return [{ axes: {} }];
100
- for (const a of axes) if (a.values.length === 0) return [];
101
- const out = [];
102
- const idx = new Array(axes.length).fill(0);
103
- while (true) {
104
- const slot = {};
105
- for (let i2 = 0; i2 < axes.length; i2++) {
106
- const axis = axes[i2];
107
- const v = axis.values[idx[i2]];
108
- slot[axis.name] = { id: v.id, value: v.value };
109
- }
110
- out.push({ axes: slot });
111
- let i = 0;
112
- while (i < axes.length) {
113
- const next = idx[i] + 1;
114
- const axis = axes[i];
115
- if (next < axis.values.length) {
116
- idx[i] = next;
117
- break;
118
- }
119
- idx[i] = 0;
120
- i++;
121
- }
122
- if (i === axes.length) break;
123
- }
124
- return out;
125
- }
126
- function makeMatrixId() {
127
- const t = Date.now().toString(36);
128
- let r = "";
129
- for (let i = 0; i < 8; i++) r += Math.floor(Math.random() * 16).toString(16);
130
- return `mtx_${t}_${r}`;
131
- }
132
- function makeErrorResult(err) {
133
- const e = err;
134
- return {
135
- output: void 0,
136
- verdict: { valid: false, score: 0 },
137
- costUsd: 0,
138
- durationMs: 0,
139
- error: {
140
- message: typeof e?.message === "string" ? e.message : String(err),
141
- kind: typeof e?.name === "string" ? e.name : "Error"
142
- }
143
- };
144
- }
145
- async function runAgentMatrix(opts) {
146
- const startedAt = Date.now();
147
- const reps = Math.max(1, opts.reps ?? 1);
148
- const maxConcurrency = Math.max(1, opts.maxConcurrency ?? 4);
149
- const costCeiling = opts.costCeiling ?? Number.POSITIVE_INFINITY;
150
- const aggregateBy = opts.aggregateBy ?? opts.axes.map((a) => a.name);
151
- const base = cartesian(opts.axes);
152
- const filtered = opts.filter ? base.filter((c) => opts.filter(c)) : base;
153
- const filteredOut = base.length - filtered.length;
154
- const planned = [];
155
- for (let i = 0; i < filtered.length; i++) {
156
- for (let r = 0; r < reps; r++) {
157
- planned.push({
158
- axes: filtered[i].axes,
159
- rep: r,
160
- ordinal: i * reps + r
161
- });
162
- }
163
- }
164
- const cellRecords = [];
165
- let cumulativeCost = 0;
166
- let costCeilingReached = false;
167
- let runsExecuted = 0;
168
- let cellsUnscheduled = 0;
169
- const aborted = () => opts.signal?.aborted === true;
170
- let inFlight = 0;
171
- let cursor = 0;
172
- let resolveAll;
173
- const done = new Promise((res) => {
174
- resolveAll = res;
175
- });
176
- const pump = () => {
177
- while (inFlight < maxConcurrency && cursor < planned.length) {
178
- if (aborted() || costCeilingReached) {
179
- const left = planned.length - cursor;
180
- cellsUnscheduled += left;
181
- cursor = planned.length;
182
- break;
183
- }
184
- const cell = planned[cursor++];
185
- inFlight++;
186
- const record = { cell, runs: [] };
187
- cellRecords.push(record);
188
- const promise = (async () => {
189
- try {
190
- return await opts.runCell(cell);
191
- } catch (err) {
192
- return makeErrorResult(err);
193
- }
194
- })();
195
- promise.then((result) => {
196
- record.runs.push(result);
197
- runsExecuted++;
198
- cumulativeCost += result.costUsd;
199
- if (cumulativeCost >= costCeiling && !costCeilingReached) {
200
- costCeilingReached = true;
201
- console.warn("[matrix] cost ceiling reached");
202
- }
203
- try {
204
- opts.onCellComplete?.(cell, result);
205
- } catch {
206
- }
207
- inFlight--;
208
- if (cursor < planned.length) {
209
- pump();
210
- } else if (inFlight === 0) {
211
- resolveAll?.();
212
- }
213
- });
214
- }
215
- if (cursor >= planned.length && inFlight === 0) resolveAll?.();
216
- };
217
- const onAbort = () => {
218
- if (cursor < planned.length) {
219
- cellsUnscheduled += planned.length - cursor;
220
- cursor = planned.length;
221
- }
222
- if (inFlight === 0) resolveAll?.();
223
- };
224
- if (opts.signal) {
225
- if (opts.signal.aborted) {
226
- cellsUnscheduled = planned.length;
227
- cursor = planned.length;
228
- resolveAll?.();
229
- } else {
230
- opts.signal.addEventListener("abort", onAbort, { once: true });
231
- }
232
- }
233
- if (planned.length === 0) {
234
- resolveAll?.();
235
- } else {
236
- pump();
237
- }
238
- await done;
239
- if (opts.signal) opts.signal.removeEventListener("abort", onAbort);
240
- cellRecords.sort((a, b) => a.cell.ordinal - b.cell.ordinal);
241
- let pass = 0;
242
- let scoreSum = 0;
243
- let totalCost = 0;
244
- let runCount = 0;
245
- for (const { runs } of cellRecords) {
246
- for (const r of runs) {
247
- runCount++;
248
- const errored = r.error !== void 0;
249
- if (!errored && r.verdict.valid) pass++;
250
- scoreSum += errored ? 0 : r.verdict.score;
251
- totalCost += r.costUsd;
252
- }
253
- }
254
- const byAxis = buildByAxis(cellRecords, opts.axes, aggregateBy);
255
- return {
256
- cells: cellRecords,
257
- byAxis,
258
- summary: {
259
- totalCells: planned.length,
260
- runsExecuted,
261
- cellsSkipped: cellsUnscheduled + filteredOut * reps,
262
- overallPassRate: runCount === 0 ? 0 : pass / runCount,
263
- overallMeanScore: runCount === 0 ? 0 : scoreSum / runCount,
264
- totalCostUsd: totalCost,
265
- durationMs: Date.now() - startedAt
266
- },
267
- matrixId: makeMatrixId()
268
- };
269
- }
270
-
271
- export {
272
- runAgentMatrix
273
- };
274
- //# sourceMappingURL=chunk-JHCHEVET.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/matrix/aggregation.ts","../src/matrix/runner.ts"],"sourcesContent":["/**\n * Per-axis aggregation of cell runs into `AxisSummary` rows.\n *\n * Pure: consumes the final `cells: [{cell, runs}]` array and returns the\n * `byAxis` table. Error runs contribute 0 to passRate and meanScore. Cost\n * and duration always count — the budget was spent regardless.\n */\n\nimport type { AxisSummary, CellResult, MatrixAxis, MatrixCell, MatrixResult } from './types'\n\ninterface Row<Output> {\n cell: MatrixCell\n result: CellResult<Output>\n}\n\nfunction flattenRuns<Output>(cells: MatrixResult<Output>['cells']): Row<Output>[] {\n const rows: Row<Output>[] = []\n for (const { cell, runs } of cells) {\n for (const result of runs) rows.push({ cell, result })\n }\n return rows\n}\n\nfunction quantile(sorted: number[], q: number): number {\n if (sorted.length === 0) return 0\n if (sorted.length === 1) return sorted[0] as number\n const pos = (sorted.length - 1) * q\n const lo = Math.floor(pos)\n const hi = Math.ceil(pos)\n if (lo === hi) return sorted[lo] as number\n const frac = pos - lo\n return (sorted[lo] as number) * (1 - frac) + (sorted[hi] as number) * frac\n}\n\nexport function summariseRows<Output>(\n rows: Row<Output>[],\n axisName: string,\n axisValue: string,\n): AxisSummary {\n if (rows.length === 0) {\n return {\n axisName,\n axisValue,\n cells: 0,\n passRate: 0,\n meanScore: 0,\n p50Score: 0,\n p90Score: 0,\n totalCostUsd: 0,\n meanDurationMs: 0,\n }\n }\n let pass = 0\n let scoreSum = 0\n let costSum = 0\n let durSum = 0\n const scores: number[] = []\n for (const { result } of rows) {\n const errored = result.error !== undefined\n const score = errored ? 0 : result.verdict.score\n const valid = !errored && result.verdict.valid\n if (valid) pass++\n scoreSum += score\n scores.push(score)\n costSum += result.costUsd\n durSum += result.durationMs\n }\n scores.sort((a, b) => a - b)\n return {\n axisName,\n axisValue,\n cells: rows.length,\n passRate: pass / rows.length,\n meanScore: scoreSum / rows.length,\n p50Score: quantile(scores, 0.5),\n p90Score: quantile(scores, 0.9),\n totalCostUsd: costSum,\n meanDurationMs: durSum / rows.length,\n }\n}\n\nfunction bucketBy<Output>(\n rows: Row<Output>[],\n axisName: string,\n labelFor: (id: string) => string,\n): Record<string, AxisSummary> {\n const buckets = new Map<string, Row<Output>[]>()\n for (const row of rows) {\n const slot = row.cell.axes[axisName]\n if (!slot) continue\n const id = slot.id\n let arr = buckets.get(id)\n if (!arr) {\n arr = []\n buckets.set(id, arr)\n }\n arr.push(row)\n }\n const out: Record<string, AxisSummary> = {}\n // Sorted keys for deterministic JSON serialisation.\n for (const id of [...buckets.keys()].sort()) {\n out[id] = summariseRows(buckets.get(id) as Row<Output>[], axisName, labelFor(id))\n }\n return out\n}\n\nexport function buildByAxis<Output>(\n cells: MatrixResult<Output>['cells'],\n axes: MatrixAxis<unknown>[],\n aggregateBy: string[],\n): Record<string, Record<string, AxisSummary>> {\n const rows = flattenRuns(cells)\n const byName = new Map(axes.map((a) => [a.name, a]))\n const byAxis: Record<string, Record<string, AxisSummary>> = {}\n for (const name of aggregateBy) {\n const axis = byName.get(name)\n const labelFor = (id: string): string => {\n if (!axis?.label) return id\n const found = axis.values.find((v) => v.id === id)\n if (!found) return id\n return axis.label(found.value, id)\n }\n byAxis[name] = bucketBy(rows, name, labelFor)\n }\n return byAxis\n}\n","/**\n * N-axis cartesian runner.\n *\n * Expansion order: cartesian over `axes` in declared order, then `reps` as the\n * inner-most dim → `ordinal = (cartIdx * reps) + rep`. The returned\n * `cells[]` is sorted by `ordinal` so concurrent execution does not reorder\n * the output.\n *\n * Scheduling is a sliding window of in-flight promises capped at\n * `maxConcurrency`. The window stops admitting new cells when the cost\n * ceiling trips or the abort signal fires; in-flight cells finish.\n */\n\nimport { buildByAxis } from './aggregation'\nimport type {\n CellResult,\n MatrixAxis,\n MatrixCell,\n MatrixResult,\n RunAgentMatrixOptions,\n} from './types'\n\ninterface BaseCell {\n axes: Record<string, { id: string; value: unknown }>\n}\n\nfunction cartesian(axes: MatrixAxis<unknown>[]): BaseCell[] {\n // Empty axes (`values=[]`) collapse the whole product to zero cells. An\n // empty `axes` array yields a single empty-axes cell — degenerate but\n // valid (caller is iterating only reps).\n if (axes.length === 0) return [{ axes: {} }]\n for (const a of axes) if (a.values.length === 0) return []\n const out: BaseCell[] = []\n const idx = new Array(axes.length).fill(0)\n while (true) {\n const slot: Record<string, { id: string; value: unknown }> = {}\n for (let i = 0; i < axes.length; i++) {\n const axis = axes[i] as MatrixAxis<unknown>\n const v = axis.values[idx[i] as number] as { id: string; value: unknown }\n slot[axis.name] = { id: v.id, value: v.value }\n }\n out.push({ axes: slot })\n // Increment like an odometer, left-most axis is fastest.\n let i = 0\n while (i < axes.length) {\n const next = (idx[i] as number) + 1\n const axis = axes[i] as MatrixAxis<unknown>\n if (next < axis.values.length) {\n idx[i] = next\n break\n }\n idx[i] = 0\n i++\n }\n if (i === axes.length) break\n }\n return out\n}\n\nfunction makeMatrixId(): string {\n // Stable id-like string: time + 8 random hex chars. Avoids node:crypto\n // import to keep the matrix dep-free.\n const t = Date.now().toString(36)\n let r = ''\n for (let i = 0; i < 8; i++) r += Math.floor(Math.random() * 16).toString(16)\n return `mtx_${t}_${r}`\n}\n\nfunction makeErrorResult<Output>(err: unknown): CellResult<Output> {\n const e = err as { message?: string; name?: string }\n return {\n output: undefined as unknown as Output,\n verdict: { valid: false, score: 0 },\n costUsd: 0,\n durationMs: 0,\n error: {\n message: typeof e?.message === 'string' ? e.message : String(err),\n kind: typeof e?.name === 'string' ? e.name : 'Error',\n },\n }\n}\n\nexport async function runAgentMatrix<Output>(\n opts: RunAgentMatrixOptions<Output>,\n): Promise<MatrixResult<Output>> {\n const startedAt = Date.now()\n const reps = Math.max(1, opts.reps ?? 1)\n const maxConcurrency = Math.max(1, opts.maxConcurrency ?? 4)\n const costCeiling = opts.costCeiling ?? Number.POSITIVE_INFINITY\n const aggregateBy = opts.aggregateBy ?? opts.axes.map((a) => a.name)\n\n const base = cartesian(opts.axes)\n const filtered = opts.filter\n ? base.filter((c) => (opts.filter as (b: BaseCell) => boolean)(c))\n : base\n const filteredOut = base.length - filtered.length\n\n const planned: MatrixCell[] = []\n for (let i = 0; i < filtered.length; i++) {\n for (let r = 0; r < reps; r++) {\n planned.push({\n axes: (filtered[i] as BaseCell).axes,\n rep: r,\n ordinal: i * reps + r,\n })\n }\n }\n\n const cellRecords: Array<{ cell: MatrixCell; runs: CellResult<Output>[] }> = []\n let cumulativeCost = 0\n let costCeilingReached = false\n let runsExecuted = 0\n let cellsUnscheduled = 0\n\n const aborted = (): boolean => opts.signal?.aborted === true\n\n // Per-run abort controller forwards the external signal so cell executors\n // see cancellation. We don't expose it on `MatrixCell` — the signature on\n // `runCell` per the public API is `(cell) => Promise<...>`. Executors that\n // need cancellation use the external signal directly via closure.\n\n let inFlight = 0\n let cursor = 0\n let resolveAll: (() => void) | undefined\n const done = new Promise<void>((res) => {\n resolveAll = res\n })\n\n const pump = (): void => {\n while (inFlight < maxConcurrency && cursor < planned.length) {\n if (aborted() || costCeilingReached) {\n // Drain remaining as unscheduled.\n const left = planned.length - cursor\n cellsUnscheduled += left\n cursor = planned.length\n break\n }\n const cell = planned[cursor++] as MatrixCell\n inFlight++\n // Lazily allocate the record so cells appear in `cells[]` in any\n // arrival order; we sort by ordinal at the end.\n const record = { cell, runs: [] as CellResult<Output>[] }\n cellRecords.push(record)\n const promise: Promise<CellResult<Output>> = (async () => {\n try {\n return await opts.runCell(cell)\n } catch (err) {\n return makeErrorResult<Output>(err)\n }\n })()\n promise.then((result) => {\n record.runs.push(result)\n runsExecuted++\n cumulativeCost += result.costUsd\n if (cumulativeCost >= costCeiling && !costCeilingReached) {\n costCeilingReached = true\n // eslint-disable-next-line no-console\n console.warn('[matrix] cost ceiling reached')\n }\n try {\n opts.onCellComplete?.(cell, result)\n } catch {\n // onCellComplete is observational — swallow throws so a noisy\n // callback can't tank the run.\n }\n inFlight--\n if (cursor < planned.length) {\n pump()\n } else if (inFlight === 0) {\n resolveAll?.()\n }\n })\n }\n if (cursor >= planned.length && inFlight === 0) resolveAll?.()\n }\n\n const onAbort = (): void => {\n // External abort: stop scheduling. In-flight cells finish; their\n // executors observe `opts.signal.aborted` directly via closure.\n if (cursor < planned.length) {\n cellsUnscheduled += planned.length - cursor\n cursor = planned.length\n }\n if (inFlight === 0) resolveAll?.()\n }\n if (opts.signal) {\n if (opts.signal.aborted) {\n cellsUnscheduled = planned.length\n cursor = planned.length\n resolveAll?.()\n } else {\n opts.signal.addEventListener('abort', onAbort, { once: true })\n }\n }\n\n if (planned.length === 0) {\n resolveAll?.()\n } else {\n pump()\n }\n\n await done\n if (opts.signal) opts.signal.removeEventListener('abort', onAbort)\n\n cellRecords.sort((a, b) => a.cell.ordinal - b.cell.ordinal)\n\n let pass = 0\n let scoreSum = 0\n let totalCost = 0\n let runCount = 0\n for (const { runs } of cellRecords) {\n for (const r of runs) {\n runCount++\n const errored = r.error !== undefined\n if (!errored && r.verdict.valid) pass++\n scoreSum += errored ? 0 : r.verdict.score\n totalCost += r.costUsd\n }\n }\n\n const byAxis = buildByAxis(cellRecords, opts.axes, aggregateBy)\n\n return {\n cells: cellRecords,\n byAxis,\n summary: {\n totalCells: planned.length,\n runsExecuted,\n cellsSkipped: cellsUnscheduled + filteredOut * reps,\n overallPassRate: runCount === 0 ? 0 : pass / runCount,\n overallMeanScore: runCount === 0 ? 0 : scoreSum / runCount,\n totalCostUsd: totalCost,\n durationMs: Date.now() - startedAt,\n },\n matrixId: makeMatrixId(),\n }\n}\n"],"mappings":";AAeA,SAAS,YAAoB,OAAqD;AAChF,QAAM,OAAsB,CAAC;AAC7B,aAAW,EAAE,MAAM,KAAK,KAAK,OAAO;AAClC,eAAW,UAAU,KAAM,MAAK,KAAK,EAAE,MAAM,OAAO,CAAC;AAAA,EACvD;AACA,SAAO;AACT;AAEA,SAAS,SAAS,QAAkB,GAAmB;AACrD,MAAI,OAAO,WAAW,EAAG,QAAO;AAChC,MAAI,OAAO,WAAW,EAAG,QAAO,OAAO,CAAC;AACxC,QAAM,OAAO,OAAO,SAAS,KAAK;AAClC,QAAM,KAAK,KAAK,MAAM,GAAG;AACzB,QAAM,KAAK,KAAK,KAAK,GAAG;AACxB,MAAI,OAAO,GAAI,QAAO,OAAO,EAAE;AAC/B,QAAM,OAAO,MAAM;AACnB,SAAQ,OAAO,EAAE,KAAgB,IAAI,QAAS,OAAO,EAAE,IAAe;AACxE;AAEO,SAAS,cACd,MACA,UACA,WACa;AACb,MAAI,KAAK,WAAW,GAAG;AACrB,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,OAAO;AAAA,MACP,UAAU;AAAA,MACV,WAAW;AAAA,MACX,UAAU;AAAA,MACV,UAAU;AAAA,MACV,cAAc;AAAA,MACd,gBAAgB;AAAA,IAClB;AAAA,EACF;AACA,MAAI,OAAO;AACX,MAAI,WAAW;AACf,MAAI,UAAU;AACd,MAAI,SAAS;AACb,QAAM,SAAmB,CAAC;AAC1B,aAAW,EAAE,OAAO,KAAK,MAAM;AAC7B,UAAM,UAAU,OAAO,UAAU;AACjC,UAAM,QAAQ,UAAU,IAAI,OAAO,QAAQ;AAC3C,UAAM,QAAQ,CAAC,WAAW,OAAO,QAAQ;AACzC,QAAI,MAAO;AACX,gBAAY;AACZ,WAAO,KAAK,KAAK;AACjB,eAAW,OAAO;AAClB,cAAU,OAAO;AAAA,EACnB;AACA,SAAO,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC;AAC3B,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,OAAO,KAAK;AAAA,IACZ,UAAU,OAAO,KAAK;AAAA,IACtB,WAAW,WAAW,KAAK;AAAA,IAC3B,UAAU,SAAS,QAAQ,GAAG;AAAA,IAC9B,UAAU,SAAS,QAAQ,GAAG;AAAA,IAC9B,cAAc;AAAA,IACd,gBAAgB,SAAS,KAAK;AAAA,EAChC;AACF;AAEA,SAAS,SACP,MACA,UACA,UAC6B;AAC7B,QAAM,UAAU,oBAAI,IAA2B;AAC/C,aAAW,OAAO,MAAM;AACtB,UAAM,OAAO,IAAI,KAAK,KAAK,QAAQ;AACnC,QAAI,CAAC,KAAM;AACX,UAAM,KAAK,KAAK;AAChB,QAAI,MAAM,QAAQ,IAAI,EAAE;AACxB,QAAI,CAAC,KAAK;AACR,YAAM,CAAC;AACP,cAAQ,IAAI,IAAI,GAAG;AAAA,IACrB;AACA,QAAI,KAAK,GAAG;AAAA,EACd;AACA,QAAM,MAAmC,CAAC;AAE1C,aAAW,MAAM,CAAC,GAAG,QAAQ,KAAK,CAAC,EAAE,KAAK,GAAG;AAC3C,QAAI,EAAE,IAAI,cAAc,QAAQ,IAAI,EAAE,GAAoB,UAAU,SAAS,EAAE,CAAC;AAAA,EAClF;AACA,SAAO;AACT;AAEO,SAAS,YACd,OACA,MACA,aAC6C;AAC7C,QAAM,OAAO,YAAY,KAAK;AAC9B,QAAM,SAAS,IAAI,IAAI,KAAK,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;AACnD,QAAM,SAAsD,CAAC;AAC7D,aAAW,QAAQ,aAAa;AAC9B,UAAM,OAAO,OAAO,IAAI,IAAI;AAC5B,UAAM,WAAW,CAAC,OAAuB;AACvC,UAAI,CAAC,MAAM,MAAO,QAAO;AACzB,YAAM,QAAQ,KAAK,OAAO,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AACjD,UAAI,CAAC,MAAO,QAAO;AACnB,aAAO,KAAK,MAAM,MAAM,OAAO,EAAE;AAAA,IACnC;AACA,WAAO,IAAI,IAAI,SAAS,MAAM,MAAM,QAAQ;AAAA,EAC9C;AACA,SAAO;AACT;;;ACnGA,SAAS,UAAU,MAAyC;AAI1D,MAAI,KAAK,WAAW,EAAG,QAAO,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC;AAC3C,aAAW,KAAK,KAAM,KAAI,EAAE,OAAO,WAAW,EAAG,QAAO,CAAC;AACzD,QAAM,MAAkB,CAAC;AACzB,QAAM,MAAM,IAAI,MAAM,KAAK,MAAM,EAAE,KAAK,CAAC;AACzC,SAAO,MAAM;AACX,UAAM,OAAuD,CAAC;AAC9D,aAASA,KAAI,GAAGA,KAAI,KAAK,QAAQA,MAAK;AACpC,YAAM,OAAO,KAAKA,EAAC;AACnB,YAAM,IAAI,KAAK,OAAO,IAAIA,EAAC,CAAW;AACtC,WAAK,KAAK,IAAI,IAAI,EAAE,IAAI,EAAE,IAAI,OAAO,EAAE,MAAM;AAAA,IAC/C;AACA,QAAI,KAAK,EAAE,MAAM,KAAK,CAAC;AAEvB,QAAI,IAAI;AACR,WAAO,IAAI,KAAK,QAAQ;AACtB,YAAM,OAAQ,IAAI,CAAC,IAAe;AAClC,YAAM,OAAO,KAAK,CAAC;AACnB,UAAI,OAAO,KAAK,OAAO,QAAQ;AAC7B,YAAI,CAAC,IAAI;AACT;AAAA,MACF;AACA,UAAI,CAAC,IAAI;AACT;AAAA,IACF;AACA,QAAI,MAAM,KAAK,OAAQ;AAAA,EACzB;AACA,SAAO;AACT;AAEA,SAAS,eAAuB;AAG9B,QAAM,IAAI,KAAK,IAAI,EAAE,SAAS,EAAE;AAChC,MAAI,IAAI;AACR,WAAS,IAAI,GAAG,IAAI,GAAG,IAAK,MAAK,KAAK,MAAM,KAAK,OAAO,IAAI,EAAE,EAAE,SAAS,EAAE;AAC3E,SAAO,OAAO,CAAC,IAAI,CAAC;AACtB;AAEA,SAAS,gBAAwB,KAAkC;AACjE,QAAM,IAAI;AACV,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,SAAS,EAAE,OAAO,OAAO,OAAO,EAAE;AAAA,IAClC,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,OAAO;AAAA,MACL,SAAS,OAAO,GAAG,YAAY,WAAW,EAAE,UAAU,OAAO,GAAG;AAAA,MAChE,MAAM,OAAO,GAAG,SAAS,WAAW,EAAE,OAAO;AAAA,IAC/C;AAAA,EACF;AACF;AAEA,eAAsB,eACpB,MAC+B;AAC/B,QAAM,YAAY,KAAK,IAAI;AAC3B,QAAM,OAAO,KAAK,IAAI,GAAG,KAAK,QAAQ,CAAC;AACvC,QAAM,iBAAiB,KAAK,IAAI,GAAG,KAAK,kBAAkB,CAAC;AAC3D,QAAM,cAAc,KAAK,eAAe,OAAO;AAC/C,QAAM,cAAc,KAAK,eAAe,KAAK,KAAK,IAAI,CAAC,MAAM,EAAE,IAAI;AAEnE,QAAM,OAAO,UAAU,KAAK,IAAI;AAChC,QAAM,WAAW,KAAK,SAClB,KAAK,OAAO,CAAC,MAAO,KAAK,OAAoC,CAAC,CAAC,IAC/D;AACJ,QAAM,cAAc,KAAK,SAAS,SAAS;AAE3C,QAAM,UAAwB,CAAC;AAC/B,WAAS,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK;AACxC,aAAS,IAAI,GAAG,IAAI,MAAM,KAAK;AAC7B,cAAQ,KAAK;AAAA,QACX,MAAO,SAAS,CAAC,EAAe;AAAA,QAChC,KAAK;AAAA,QACL,SAAS,IAAI,OAAO;AAAA,MACtB,CAAC;AAAA,IACH;AAAA,EACF;AAEA,QAAM,cAAuE,CAAC;AAC9E,MAAI,iBAAiB;AACrB,MAAI,qBAAqB;AACzB,MAAI,eAAe;AACnB,MAAI,mBAAmB;AAEvB,QAAM,UAAU,MAAe,KAAK,QAAQ,YAAY;AAOxD,MAAI,WAAW;AACf,MAAI,SAAS;AACb,MAAI;AACJ,QAAM,OAAO,IAAI,QAAc,CAAC,QAAQ;AACtC,iBAAa;AAAA,EACf,CAAC;AAED,QAAM,OAAO,MAAY;AACvB,WAAO,WAAW,kBAAkB,SAAS,QAAQ,QAAQ;AAC3D,UAAI,QAAQ,KAAK,oBAAoB;AAEnC,cAAM,OAAO,QAAQ,SAAS;AAC9B,4BAAoB;AACpB,iBAAS,QAAQ;AACjB;AAAA,MACF;AACA,YAAM,OAAO,QAAQ,QAAQ;AAC7B;AAGA,YAAM,SAAS,EAAE,MAAM,MAAM,CAAC,EAA0B;AACxD,kBAAY,KAAK,MAAM;AACvB,YAAM,WAAwC,YAAY;AACxD,YAAI;AACF,iBAAO,MAAM,KAAK,QAAQ,IAAI;AAAA,QAChC,SAAS,KAAK;AACZ,iBAAO,gBAAwB,GAAG;AAAA,QACpC;AAAA,MACF,GAAG;AACH,cAAQ,KAAK,CAAC,WAAW;AACvB,eAAO,KAAK,KAAK,MAAM;AACvB;AACA,0BAAkB,OAAO;AACzB,YAAI,kBAAkB,eAAe,CAAC,oBAAoB;AACxD,+BAAqB;AAErB,kBAAQ,KAAK,+BAA+B;AAAA,QAC9C;AACA,YAAI;AACF,eAAK,iBAAiB,MAAM,MAAM;AAAA,QACpC,QAAQ;AAAA,QAGR;AACA;AACA,YAAI,SAAS,QAAQ,QAAQ;AAC3B,eAAK;AAAA,QACP,WAAW,aAAa,GAAG;AACzB,uBAAa;AAAA,QACf;AAAA,MACF,CAAC;AAAA,IACH;AACA,QAAI,UAAU,QAAQ,UAAU,aAAa,EAAG,cAAa;AAAA,EAC/D;AAEA,QAAM,UAAU,MAAY;AAG1B,QAAI,SAAS,QAAQ,QAAQ;AAC3B,0BAAoB,QAAQ,SAAS;AACrC,eAAS,QAAQ;AAAA,IACnB;AACA,QAAI,aAAa,EAAG,cAAa;AAAA,EACnC;AACA,MAAI,KAAK,QAAQ;AACf,QAAI,KAAK,OAAO,SAAS;AACvB,yBAAmB,QAAQ;AAC3B,eAAS,QAAQ;AACjB,mBAAa;AAAA,IACf,OAAO;AACL,WAAK,OAAO,iBAAiB,SAAS,SAAS,EAAE,MAAM,KAAK,CAAC;AAAA,IAC/D;AAAA,EACF;AAEA,MAAI,QAAQ,WAAW,GAAG;AACxB,iBAAa;AAAA,EACf,OAAO;AACL,SAAK;AAAA,EACP;AAEA,QAAM;AACN,MAAI,KAAK,OAAQ,MAAK,OAAO,oBAAoB,SAAS,OAAO;AAEjE,cAAY,KAAK,CAAC,GAAG,MAAM,EAAE,KAAK,UAAU,EAAE,KAAK,OAAO;AAE1D,MAAI,OAAO;AACX,MAAI,WAAW;AACf,MAAI,YAAY;AAChB,MAAI,WAAW;AACf,aAAW,EAAE,KAAK,KAAK,aAAa;AAClC,eAAW,KAAK,MAAM;AACpB;AACA,YAAM,UAAU,EAAE,UAAU;AAC5B,UAAI,CAAC,WAAW,EAAE,QAAQ,MAAO;AACjC,kBAAY,UAAU,IAAI,EAAE,QAAQ;AACpC,mBAAa,EAAE;AAAA,IACjB;AAAA,EACF;AAEA,QAAM,SAAS,YAAY,aAAa,KAAK,MAAM,WAAW;AAE9D,SAAO;AAAA,IACL,OAAO;AAAA,IACP;AAAA,IACA,SAAS;AAAA,MACP,YAAY,QAAQ;AAAA,MACpB;AAAA,MACA,cAAc,mBAAmB,cAAc;AAAA,MAC/C,iBAAiB,aAAa,IAAI,IAAI,OAAO;AAAA,MAC7C,kBAAkB,aAAa,IAAI,IAAI,WAAW;AAAA,MAClD,cAAc;AAAA,MACd,YAAY,KAAK,IAAI,IAAI;AAAA,IAC3B;AAAA,IACA,UAAU,aAAa;AAAA,EACzB;AACF;","names":["i"]}