@tangle-network/agent-eval 0.129.0 → 0.130.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (427) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/README.md +1 -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-DviOvUNr.js +754 -0
  36. package/dist/benchmarks-DviOvUNr.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-CBKZvQ1H.js +3885 -0
  46. package/dist/campaign-CBKZvQ1H.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-CAPUUKaM.d.ts +335 -0
  116. package/dist/index-CAPUUKaM.d.ts.map +1 -0
  117. package/dist/index-DE5fb3EC.d.ts +2244 -0
  118. package/dist/index-DE5fb3EC.d.ts.map +1 -0
  119. package/dist/index-DSC51roc.d.ts +102 -0
  120. package/dist/index-DSC51roc.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-B7wX7XkF.d.ts +1739 -0
  253. package/dist/skillopt-optimization-method-B7wX7XkF.d.ts.map +1 -0
  254. package/dist/skillopt-optimization-method-D4ODwFVV.js +7712 -0
  255. package/dist/skillopt-optimization-method-D4ODwFVV.js.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/package.json +17 -9
  301. package/dist/benchmarks/index.js.map +0 -1
  302. package/dist/campaign/index.js.map +0 -1
  303. package/dist/chunk-2QU3YOPR.js +0 -7374
  304. package/dist/chunk-2QU3YOPR.js.map +0 -1
  305. package/dist/chunk-3OCR4R5I.js +0 -728
  306. package/dist/chunk-3OCR4R5I.js.map +0 -1
  307. package/dist/chunk-3RF76KTD.js +0 -84
  308. package/dist/chunk-3RF76KTD.js.map +0 -1
  309. package/dist/chunk-56TAVBOK.js +0 -698
  310. package/dist/chunk-5DTSBUL2.js +0 -159
  311. package/dist/chunk-5DTSBUL2.js.map +0 -1
  312. package/dist/chunk-7FO3TNPI.js +0 -232
  313. package/dist/chunk-7FO3TNPI.js.map +0 -1
  314. package/dist/chunk-7ZZMD7UK.js +0 -386
  315. package/dist/chunk-7ZZMD7UK.js.map +0 -1
  316. package/dist/chunk-BOD4O7OF.js +0 -40
  317. package/dist/chunk-BOD4O7OF.js.map +0 -1
  318. package/dist/chunk-BSO5JDQH.js +0 -2335
  319. package/dist/chunk-BSO5JDQH.js.map +0 -1
  320. package/dist/chunk-C6LXANRU.js +0 -1550
  321. package/dist/chunk-C6LXANRU.js.map +0 -1
  322. package/dist/chunk-DODXQREJ.js +0 -752
  323. package/dist/chunk-DODXQREJ.js.map +0 -1
  324. package/dist/chunk-DRYIUNWY.js +0 -622
  325. package/dist/chunk-DRYIUNWY.js.map +0 -1
  326. package/dist/chunk-E7QXT7SX.js +0 -183
  327. package/dist/chunk-E7QXT7SX.js.map +0 -1
  328. package/dist/chunk-EG66UGL4.js +0 -341
  329. package/dist/chunk-EG66UGL4.js.map +0 -1
  330. package/dist/chunk-FXTVJPYD.js +0 -576
  331. package/dist/chunk-FXTVJPYD.js.map +0 -1
  332. package/dist/chunk-G7MGMCZD.js +0 -153
  333. package/dist/chunk-G7MGMCZD.js.map +0 -1
  334. package/dist/chunk-GGE4NNQT.js +0 -65
  335. package/dist/chunk-GGE4NNQT.js.map +0 -1
  336. package/dist/chunk-H23X7XKK.js +0 -181
  337. package/dist/chunk-H23X7XKK.js.map +0 -1
  338. package/dist/chunk-HHWE3POT.js +0 -94
  339. package/dist/chunk-HHWE3POT.js.map +0 -1
  340. package/dist/chunk-HPWUNB47.js +0 -289
  341. package/dist/chunk-HPWUNB47.js.map +0 -1
  342. package/dist/chunk-IYCLP2N2.js +0 -766
  343. package/dist/chunk-IYCLP2N2.js.map +0 -1
  344. package/dist/chunk-JHCHEVET.js +0 -274
  345. package/dist/chunk-JHCHEVET.js.map +0 -1
  346. package/dist/chunk-JQSF5DQT.js +0 -701
  347. package/dist/chunk-JQSF5DQT.js.map +0 -1
  348. package/dist/chunk-K4DBDHLK.js +0 -158
  349. package/dist/chunk-K4DBDHLK.js.map +0 -1
  350. package/dist/chunk-K6N6XJJX.js +0 -306
  351. package/dist/chunk-K6N6XJJX.js.map +0 -1
  352. package/dist/chunk-M4YBQKIJ.js +0 -1040
  353. package/dist/chunk-M4YBQKIJ.js.map +0 -1
  354. package/dist/chunk-MA6HLL3S.js +0 -65
  355. package/dist/chunk-MA6HLL3S.js.map +0 -1
  356. package/dist/chunk-MAZ26DC7.js +0 -99
  357. package/dist/chunk-MAZ26DC7.js.map +0 -1
  358. package/dist/chunk-NPCTHQIO.js +0 -91
  359. package/dist/chunk-NPCTHQIO.js.map +0 -1
  360. package/dist/chunk-NY44NC4A.js +0 -1056
  361. package/dist/chunk-NY44NC4A.js.map +0 -1
  362. package/dist/chunk-OIUOT4QD.js +0 -44
  363. package/dist/chunk-OIUOT4QD.js.map +0 -1
  364. package/dist/chunk-ONWEPEDO.js +0 -57
  365. package/dist/chunk-ONWEPEDO.js.map +0 -1
  366. package/dist/chunk-OWN5NPMC.js +0 -152
  367. package/dist/chunk-OWN5NPMC.js.map +0 -1
  368. package/dist/chunk-P6FYH6K4.js +0 -1161
  369. package/dist/chunk-P6FYH6K4.js.map +0 -1
  370. package/dist/chunk-PC4UYEBM.js +0 -166
  371. package/dist/chunk-PC4UYEBM.js.map +0 -1
  372. package/dist/chunk-PC5DOSM7.js +0 -579
  373. package/dist/chunk-PC5DOSM7.js.map +0 -1
  374. package/dist/chunk-PXE2VKMX.js +0 -140
  375. package/dist/chunk-PXE2VKMX.js.map +0 -1
  376. package/dist/chunk-PZ5AY32C.js +0 -10
  377. package/dist/chunk-PZ5AY32C.js.map +0 -1
  378. package/dist/chunk-QB6BDBP2.js +0 -4464
  379. package/dist/chunk-QB6BDBP2.js.map +0 -1
  380. package/dist/chunk-RXHCETDZ.js +0 -536
  381. package/dist/chunk-RXHCETDZ.js.map +0 -1
  382. package/dist/chunk-RZTMDUO7.js +0 -49
  383. package/dist/chunk-RZTMDUO7.js.map +0 -1
  384. package/dist/chunk-SFLLL76A.js +0 -669
  385. package/dist/chunk-SFLLL76A.js.map +0 -1
  386. package/dist/chunk-SZLVEKMJ.js +0 -1446
  387. package/dist/chunk-SZLVEKMJ.js.map +0 -1
  388. package/dist/chunk-T4SQEITX.js +0 -95
  389. package/dist/chunk-T4SQEITX.js.map +0 -1
  390. package/dist/chunk-T6RLYGAD.js +0 -158
  391. package/dist/chunk-T6RLYGAD.js.map +0 -1
  392. package/dist/chunk-TJVT4QFF.js +0 -911
  393. package/dist/chunk-TJVT4QFF.js.map +0 -1
  394. package/dist/chunk-TQ7LNKZ3.js +0 -136
  395. package/dist/chunk-TQ7LNKZ3.js.map +0 -1
  396. package/dist/chunk-U4L7JRPZ.js +0 -1706
  397. package/dist/chunk-U4L7JRPZ.js.map +0 -1
  398. package/dist/chunk-U4PHLT2N.js +0 -419
  399. package/dist/chunk-U4PHLT2N.js.map +0 -1
  400. package/dist/chunk-VCZ5FQYW.js +0 -928
  401. package/dist/chunk-VCZ5FQYW.js.map +0 -1
  402. package/dist/chunk-VI2UW6B6.js +0 -162
  403. package/dist/chunk-VI2UW6B6.js.map +0 -1
  404. package/dist/chunk-VQMK5FMP.js +0 -247
  405. package/dist/chunk-VQMK5FMP.js.map +0 -1
  406. package/dist/chunk-WGXIEX7P.js +0 -116
  407. package/dist/chunk-WGXIEX7P.js.map +0 -1
  408. package/dist/chunk-WVATSFCP.js +0 -1553
  409. package/dist/chunk-WVATSFCP.js.map +0 -1
  410. package/dist/chunk-X4YIBDER.js +0 -1662
  411. package/dist/chunk-X4YIBDER.js.map +0 -1
  412. package/dist/chunk-YQN4ICPP.js +0 -355
  413. package/dist/chunk-YQN4ICPP.js.map +0 -1
  414. package/dist/chunk-ZET2UAYW.js +0 -89
  415. package/dist/chunk-ZET2UAYW.js.map +0 -1
  416. package/dist/chunk-ZHTZ4EYI.js +0 -1212
  417. package/dist/chunk-ZHTZ4EYI.js.map +0 -1
  418. package/dist/control.js.map +0 -1
  419. package/dist/hosted/index.js.map +0 -1
  420. package/dist/matrix/index.js.map +0 -1
  421. package/dist/reporting.js.map +0 -1
  422. package/dist/rollout/index.js.map +0 -1
  423. package/dist/run-campaign-OJJ7CZF4.js +0 -18
  424. package/dist/run-campaign-OJJ7CZF4.js.map +0 -1
  425. package/dist/supervisor-run/index.js.map +0 -1
  426. package/dist/traces.js.map +0 -1
  427. package/dist/wire/index.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/builder-eval/builder-session.ts","../../src/builder-eval/correlation.ts","../../src/builder-eval/project-registry.ts","../../src/builder-eval/three-layer-eval.ts"],"sourcesContent":["/**\n * BuilderSession — ties a builder-of-builders workflow together.\n *\n * Models agent-builder's shape: Project → Chat → Edit → Ship → App →\n * AppAgent. Each layer is a Run (linked via parentRunId). The\n * framework-enforced invariants:\n *\n * - One Project → many Chats; chatId scopes runs within a project.\n * - One Chat = one builder Run with `layer='builder'`.\n * - One Ship = one child Run with `layer='app-build'` + SandboxHarness.\n * - One AppScenario = one grandchild Run with `layer='app-runtime'`.\n *\n * Consumers obtain a BuilderSession, call `startChat`, drive the\n * builder agent (emitting spans), and call `ship` / `runAppScenario`\n * as the workflow progresses. The session reconstructs itself from\n * trace data via `resume(store, projectId)`.\n */\n\nimport type { HarnessConfig, SandboxDriver, SandboxHarnessResult } from '../sandbox-harness'\nimport { SandboxHarness } from '../sandbox-harness'\nimport type { TestGradedRunResult, TestGradedScenario } from '../test-graded-scenario'\nimport { runTestGradedScenario } from '../test-graded-scenario'\nimport { TraceEmitter } from '../trace/emitter'\nimport type { Run } from '../trace/schema'\nimport type { TraceStore } from '../trace/store'\n\nexport interface BuilderSessionInit {\n projectId: string\n chatId?: string\n /** Free-form: user's task description, project name, etc. Stored on the builder Run. */\n tags?: Record<string, string>\n}\n\nexport interface ShipOptions {\n harness: HarnessConfig\n driver?: SandboxDriver\n /** scenarioId of this app-build run. Defaults to `${projectId}/build`. */\n scenarioId?: string\n}\n\nexport interface RunAppScenarioOptions {\n scenario: TestGradedScenario\n /** Harness driver override; defaults to the one the session was created with. */\n driver?: SandboxDriver\n}\n\nexport class BuilderSession {\n private store: TraceStore\n private builderEmitter: TraceEmitter\n readonly projectId: string\n readonly chatId: string\n private builderRunId?: string\n private lastBuildRunId?: string\n private defaultDriver?: SandboxDriver\n\n constructor(store: TraceStore, init: BuilderSessionInit, driver?: SandboxDriver) {\n this.store = store\n this.projectId = init.projectId\n this.chatId = init.chatId ?? cryptoId()\n this.defaultDriver = driver\n this.builderEmitter = new TraceEmitter(store)\n }\n\n /** Start the builder (L0) run for this chat. Returns the runId. */\n async startChat(scenarioId = `${this.projectId}/chat`): Promise<string> {\n await this.builderEmitter.startRun({\n scenarioId,\n projectId: this.projectId,\n chatId: this.chatId,\n layer: 'builder',\n })\n this.builderRunId = this.builderEmitter.runId\n return this.builderRunId\n }\n\n /** The emitter for builder-level spans (edits, LLM calls, tool invocations). */\n get emitter(): TraceEmitter {\n if (!this.builderRunId) throw new Error('BuilderSession.emitter: call startChat() first')\n return this.builderEmitter\n }\n\n /**\n * Ship the project's generated app: run the sandbox harness as a child\n * Run (`layer='app-build'`). Returns the build result + runId.\n */\n async ship(options: ShipOptions): Promise<{ runId: string; result: SandboxHarnessResult }> {\n if (!this.builderRunId) throw new Error('BuilderSession.ship: call startChat() first')\n const buildEmitter = new TraceEmitter(this.store)\n await buildEmitter.startRun({\n scenarioId: options.scenarioId ?? `${this.projectId}/build`,\n projectId: this.projectId,\n chatId: this.chatId,\n parentRunId: this.builderRunId,\n layer: 'app-build',\n })\n const harness = new SandboxHarness(options.driver ?? this.defaultDriver)\n const result = await harness.run(options.harness, buildEmitter)\n await buildEmitter.endRun({\n pass: result.passed,\n score: result.score,\n failureClass: result.passed ? 'success' : 'sandbox_failure',\n })\n this.lastBuildRunId = buildEmitter.runId\n return { runId: buildEmitter.runId, result }\n }\n\n /**\n * Run a domain scenario against the just-built app as a grandchild Run\n * (`layer='app-runtime'`). The `ship` call must precede this so the\n * parent is set correctly; if no build exists yet the session attaches\n * directly to the builder run (useful for prototypes).\n */\n async runAppScenario(options: RunAppScenarioOptions): Promise<TestGradedRunResult> {\n const parentRunId = this.lastBuildRunId ?? this.builderRunId\n if (!parentRunId)\n throw new Error('BuilderSession.runAppScenario: call startChat() + ship() first')\n const { scenario, driver } = options\n const result = await runTestGradedScenario(scenario, this.store, {\n driver: driver ?? this.defaultDriver,\n provenance: { codeSha: undefined, promptSha: undefined, modelFingerprint: undefined },\n })\n // Attach to the parent chain by updating the stored Run in place.\n await this.store.updateRun(result.runId, {\n parentRunId,\n projectId: this.projectId,\n chatId: this.chatId,\n layer: 'app-runtime',\n })\n return result\n }\n\n /** Record an end-of-chat meta score (judge verdict on whether the builder\n * served the user's intent). Accepts a numeric score + optional rationale. */\n async recordMetaScore(score: number, rationale?: string): Promise<void> {\n if (!this.builderRunId)\n throw new Error('BuilderSession.recordMetaScore: call startChat() first')\n await this.builderEmitter.recordJudge({\n judgeId: 'builder-meta',\n targetSpanId: this.builderRunId, // attach to the builder run itself\n dimension: 'user_intent_satisfaction',\n score,\n rationale,\n name: 'builder-meta',\n })\n }\n\n /** Close the builder Run with a final outcome. */\n async endChat(outcome: { pass: boolean; score?: number; notes?: string }): Promise<void> {\n await this.builderEmitter.endRun({\n pass: outcome.pass,\n score: outcome.score,\n notes: outcome.notes,\n })\n }\n\n /**\n * Inline app-runtime run — for cases where the \"scenario\" isn't a\n * SWE-bench-style test suite but a live agent interaction (LLM chat,\n * domain flow). Returns an emitter bound to a fresh Run in the\n * `app-runtime` layer; caller emits spans inside and calls\n * `.endRun()` with the final verdict.\n */\n async startAppRuntime(scenarioId: string): Promise<TraceEmitter> {\n const parentRunId = this.lastBuildRunId ?? this.builderRunId\n if (!parentRunId)\n throw new Error(\n 'BuilderSession.startAppRuntime: call startChat() + (optionally) ship() first',\n )\n const emitter = new TraceEmitter(this.store)\n await emitter.startRun({\n scenarioId,\n projectId: this.projectId,\n chatId: this.chatId,\n parentRunId,\n layer: 'app-runtime',\n })\n return emitter\n }\n\n /**\n * Lightweight \"ship marker\" — record an app-build Run with a caller-\n * provided verdict. Use when there isn't a sandbox harness to run but\n * you still want to mark the build state at publish time.\n */\n async recordShipMarker(args: {\n pass: boolean\n score: number\n scenarioId?: string\n notes?: string\n }): Promise<string> {\n if (!this.builderRunId)\n throw new Error('BuilderSession.recordShipMarker: call startChat() first')\n const emitter = new TraceEmitter(this.store)\n await emitter.startRun({\n scenarioId: args.scenarioId ?? `${this.projectId}/ship`,\n projectId: this.projectId,\n chatId: this.chatId,\n parentRunId: this.builderRunId,\n layer: 'app-build',\n })\n await emitter.endRun({\n pass: args.pass,\n score: args.score,\n failureClass: args.pass ? 'success' : 'sandbox_failure',\n notes: args.notes,\n })\n this.lastBuildRunId = emitter.runId\n return emitter.runId\n }\n\n get lastBuildRunIdValue(): string | undefined {\n return this.lastBuildRunId\n }\n get builderRunIdValue(): string | undefined {\n return this.builderRunId\n }\n}\n\n/**\n * Reconstruct the most recent BuilderSession state for a given project —\n * returns { builderRunId, lastBuildRunId, chatRuns }. For chat-first UIs\n * this is how a resumed session finds its place in the edit history.\n */\nexport async function resumeBuilderSession(\n store: TraceStore,\n projectId: string,\n): Promise<{\n projectId: string\n chatRuns: Run[]\n lastBuilderRun?: Run\n lastBuildRun?: Run\n lastAppRuntimeRuns: Run[]\n}> {\n const runs = await store.listRuns({ projectId })\n const chatRuns = runs\n .filter((r) => r.layer === 'builder')\n .sort((a, b) => b.startedAt - a.startedAt)\n const buildRuns = runs\n .filter((r) => r.layer === 'app-build')\n .sort((a, b) => b.startedAt - a.startedAt)\n const appRuntimeRuns = runs\n .filter((r) => r.layer === 'app-runtime')\n .sort((a, b) => b.startedAt - a.startedAt)\n return {\n projectId,\n chatRuns,\n lastBuilderRun: chatRuns[0],\n lastBuildRun: buildRuns[0],\n lastAppRuntimeRuns: appRuntimeRuns,\n }\n}\n\nfunction cryptoId(): string {\n if (typeof globalThis.crypto?.randomUUID === 'function') return globalThis.crypto.randomUUID()\n return `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 10)}`\n}\n","/**\n * Meta-eval correlation — the highest-leverage signal in the framework.\n *\n * Given a corpus of three-layer project reports, compute how well each\n * pair of layers correlates. The question we care about most:\n *\n * Does `metaScore` (what the builder thinks it did) predict\n * `runtimeScore` (what the user actually gets)?\n *\n * If r < ~0.4, the builder's self-scoring is broken — it's optimizing\n * for something other than real-world success. If r > 0.7, meta_score\n * is a usable proxy and can drive CI gates cheaply.\n *\n * Non-parametric rank correlation (Spearman) is also reported because\n * meta scores are often ordinal-ish.\n */\n\nimport { pearsonR, spearmanR } from '../statistics'\nimport type { ThreeLayerProjectReport } from './three-layer-eval'\n\nexport interface LayerCorrelation {\n n: number\n pearson: number\n spearman: number\n}\n\nexport interface CorrelationReport {\n /** Pairs present in the corpus (layers with ≥ 2 matched data points). */\n metaVsBuild?: LayerCorrelation\n metaVsRuntime?: LayerCorrelation\n buildVsRuntime?: LayerCorrelation\n /** Number of complete projects (all 3 scores present). */\n completeProjects: number\n}\n\nexport function correlateLayers(reports: ThreeLayerProjectReport[]): CorrelationReport {\n const completeProjects = reports.filter((r) => r.complete).length\n return {\n metaVsBuild: pairwise(\n reports,\n (r) => r.metaScore,\n (r) => r.buildScore,\n ),\n metaVsRuntime: pairwise(\n reports,\n (r) => r.metaScore,\n (r) => r.runtimeScore,\n ),\n buildVsRuntime: pairwise(\n reports,\n (r) => r.buildScore,\n (r) => r.runtimeScore,\n ),\n completeProjects,\n }\n}\n\nfunction pairwise(\n reports: ThreeLayerProjectReport[],\n a: (r: ThreeLayerProjectReport) => number | null,\n b: (r: ThreeLayerProjectReport) => number | null,\n): LayerCorrelation | undefined {\n const xs: number[] = []\n const ys: number[] = []\n for (const r of reports) {\n const x = a(r)\n const y = b(r)\n if (x !== null && y !== null && Number.isFinite(x) && Number.isFinite(y)) {\n xs.push(x)\n ys.push(y)\n }\n }\n if (xs.length < 2) return undefined\n return {\n n: xs.length,\n pearson: pearsonR(xs, ys),\n spearman: spearmanR(xs, ys),\n }\n}\n","/**\n * ProjectRegistry — project-level aggregation over the trace corpus.\n *\n * Thin reader over TraceStore that answers the questions a chat-first,\n * resumable UI needs:\n * - listProjects() → project IDs with latest activity\n * - projectTimeline(id) → chats + builds + runtime runs, chronological\n * - projectChats(id) → chat-level summaries (turn count, outcome)\n *\n * All queries are pure reads; no state duplication.\n */\n\nimport type { Run } from '../trace/schema'\nimport type { TraceStore } from '../trace/store'\n\nexport interface ProjectSummary {\n projectId: string\n chatCount: number\n buildCount: number\n appRuntimeCount: number\n lastActivityAt: number\n latestChatId?: string\n latestOutcome?: { pass: boolean; score?: number }\n}\n\nexport interface ChatSummary {\n chatId: string\n projectId: string\n builderRunId: string\n startedAt: number\n endedAt?: number\n status: Run['status']\n outcome?: Run['outcome']\n /** Counts of spans emitted during the chat. */\n llmTurns?: number\n toolCalls?: number\n buildRunId?: string\n appRuntimeRunIds: string[]\n}\n\nexport interface ProjectTimelineEntry {\n run: Run\n layerBucket: 'chat' | 'build' | 'runtime' | 'other'\n}\n\nexport class ProjectRegistry {\n constructor(private store: TraceStore) {}\n\n async listProjects(): Promise<ProjectSummary[]> {\n const runs = await this.store.listRuns()\n const byProject = new Map<string, Run[]>()\n for (const r of runs) {\n if (!r.projectId) continue\n const arr = byProject.get(r.projectId) ?? []\n arr.push(r)\n byProject.set(r.projectId, arr)\n }\n const summaries: ProjectSummary[] = []\n for (const [projectId, projectRuns] of byProject) {\n const sorted = projectRuns.slice().sort((a, b) => b.startedAt - a.startedAt)\n const chats = projectRuns.filter((r) => r.layer === 'builder')\n const builds = projectRuns.filter((r) => r.layer === 'app-build')\n const runtimes = projectRuns.filter((r) => r.layer === 'app-runtime')\n const latest = sorted[0]\n if (!latest) continue\n summaries.push({\n projectId,\n chatCount: chats.length,\n buildCount: builds.length,\n appRuntimeCount: runtimes.length,\n lastActivityAt: latest.startedAt,\n latestChatId: chats[0]?.chatId,\n latestOutcome: latest.outcome\n ? { pass: latest.outcome.pass ?? false, score: latest.outcome.score }\n : undefined,\n })\n }\n return summaries.sort((a, b) => b.lastActivityAt - a.lastActivityAt)\n }\n\n async projectTimeline(projectId: string): Promise<ProjectTimelineEntry[]> {\n const runs = await this.store.listRuns({ projectId })\n const ordered = runs.slice().sort((a, b) => a.startedAt - b.startedAt)\n return ordered.map((run) => ({\n run,\n layerBucket:\n run.layer === 'builder'\n ? 'chat'\n : run.layer === 'app-build'\n ? 'build'\n : run.layer === 'app-runtime'\n ? 'runtime'\n : 'other',\n }))\n }\n\n async projectChats(projectId: string): Promise<ChatSummary[]> {\n const builderRuns = (await this.store.listRuns({ projectId, layer: 'builder' })).sort(\n (a, b) => b.startedAt - a.startedAt,\n )\n const childrenFor = async (runId: string) => this.store.listRuns({ parentRunId: runId })\n const out: ChatSummary[] = []\n for (const run of builderRuns) {\n const spans = await this.store.spans({ runId: run.runId })\n const children = await childrenFor(run.runId)\n const build = children.find((c) => c.layer === 'app-build')\n const runtime: string[] = []\n // Runtime runs can be grandchildren (attached to the build) or siblings\n // when shipped skipped.\n if (build) {\n const grands = await childrenFor(build.runId)\n for (const g of grands) if (g.layer === 'app-runtime') runtime.push(g.runId)\n }\n for (const c of children) if (c.layer === 'app-runtime') runtime.push(c.runId)\n out.push({\n chatId: run.chatId ?? run.runId,\n projectId,\n builderRunId: run.runId,\n startedAt: run.startedAt,\n endedAt: run.endedAt,\n status: run.status,\n outcome: run.outcome,\n llmTurns: spans.filter((s) => s.kind === 'llm').length,\n toolCalls: spans.filter((s) => s.kind === 'tool').length,\n buildRunId: build?.runId,\n appRuntimeRunIds: runtime,\n })\n }\n return out\n }\n}\n","/**\n * Three-layer evaluation — the canonical scoring breakdown for\n * builder-of-builders workflows.\n *\n * meta_score: did the builder understand + satisfy user intent?\n * (judge verdict attached to the builder run)\n * build_score: did the generated scaffold build + pass its own tests?\n * (outcome.score on the app-build child run)\n * runtime_score: did the generated agent pass its domain scenarios?\n * (mean outcome.score over app-runtime grandchild runs)\n *\n * Returns a structured report per project. The cross-layer correlation\n * is the highest-leverage signal the framework computes — if\n * meta_score doesn't predict runtime_score, the builder's self-scoring\n * is broken.\n *\n * Scaffold-only mode: when a project has no `app-runtime` runs (e.g. a\n * scaffold-builder eval that grades compose + build without driving a\n * runtime scenario), `kind` is `'scaffold-only'` and `complete` measures\n * meta + build only. Consumers can tell the two apart without having to\n * interpret null-runtime as either \"not yet computed\" or \"N/A for this\n * project shape\".\n */\n\nimport { judgeSpans } from '../trace/query'\nimport type { Run } from '../trace/schema'\nimport type { TraceStore } from '../trace/store'\n\nexport type ProjectKind = 'full' | 'scaffold-only'\n\nexport interface ThreeLayerProjectReport {\n projectId: string\n /**\n * `'full'` when the project has at least one `app-runtime` run;\n * `'scaffold-only'` when it only has meta + build layers. Lets\n * downstream consumers treat a null runtime score as expected\n * (scaffold-only) vs. missing (full, pipeline broke).\n */\n kind: ProjectKind\n builderRunId?: string\n /** Judge-verdict score on the builder run (0..1 after normalization). */\n metaScore: number | null\n buildRunId?: string\n /** 0..1 from the sandbox harness (testsPassed / testsTotal). */\n buildScore: number | null\n appRuntimeRunIds: string[]\n /** Mean of outcome.score over app-runtime runs, 0..1. Always null in scaffold-only mode. */\n runtimeScore: number | null\n runtimePassRate: number | null\n /**\n * Layer-aware completeness:\n * - `kind='full'`: all three layers scored\n * - `kind='scaffold-only'`: meta + build scored (runtime not applicable)\n */\n complete: boolean\n}\n\nexport async function scoreProject(\n store: TraceStore,\n projectId: string,\n): Promise<ThreeLayerProjectReport> {\n const allRuns = await store.listRuns({ projectId })\n const builder = latestByLayer(allRuns, 'builder')\n const build = latestByLayer(allRuns, 'app-build')\n const runtime = allRuns.filter((r) => r.layer === 'app-runtime')\n\n const metaScore = builder ? await extractMetaScore(store, builder.runId) : null\n const buildScore = build?.outcome?.score ?? null\n const runtimeScores = runtime\n .map((r) => r.outcome?.score)\n .filter((s): s is number => typeof s === 'number')\n const runtimeScore =\n runtimeScores.length > 0\n ? runtimeScores.reduce((a, b) => a + b, 0) / runtimeScores.length\n : null\n const runtimePassed = runtime.filter((r) => r.outcome?.pass === true).length\n const runtimePassRate = runtime.length > 0 ? runtimePassed / runtime.length : null\n\n const kind: ProjectKind = runtime.length === 0 ? 'scaffold-only' : 'full'\n const complete =\n kind === 'scaffold-only'\n ? metaScore !== null && buildScore !== null\n : metaScore !== null && buildScore !== null && runtimeScore !== null\n\n return {\n projectId,\n kind,\n builderRunId: builder?.runId,\n metaScore,\n buildRunId: build?.runId,\n buildScore,\n appRuntimeRunIds: runtime.map((r) => r.runId),\n runtimeScore,\n runtimePassRate,\n complete,\n }\n}\n\n/** Aggregate scoring across every project in a corpus. */\nexport async function scoreAllProjects(store: TraceStore): Promise<ThreeLayerProjectReport[]> {\n const runs = await store.listRuns()\n const projectIds = [...new Set(runs.map((r) => r.projectId).filter((p): p is string => !!p))]\n return Promise.all(projectIds.map((p) => scoreProject(store, p)))\n}\n\nfunction latestByLayer(runs: Run[], layer: Run['layer']): Run | undefined {\n const filtered = runs.filter((r) => r.layer === layer).sort((a, b) => b.startedAt - a.startedAt)\n return filtered[0]\n}\n\nasync function extractMetaScore(store: TraceStore, builderRunId: string): Promise<number | null> {\n const js = await judgeSpans(store, builderRunId)\n const meta = js.find(\n (s) => s.judgeId === 'builder-meta' && s.dimension === 'user_intent_satisfaction',\n )\n if (!meta) return null\n // Normalize score to 0..1. Accept 0-1 natively; 0-10 scale is also common.\n if (meta.score >= 0 && meta.score <= 1) return meta.score\n if (meta.score >= 0 && meta.score <= 10) return meta.score / 10\n return null\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../src/builder-eval/builder-session.ts","../../src/builder-eval/correlation.ts","../../src/builder-eval/project-registry.ts","../../src/builder-eval/three-layer-eval.ts"],"sourcesContent":["/**\n * BuilderSession — ties a builder-of-builders workflow together.\n *\n * Models agent-builder's shape: Project → Chat → Edit → Ship → App →\n * AppAgent. Each layer is a Run (linked via parentRunId). The\n * framework-enforced invariants:\n *\n * - One Project → many Chats; chatId scopes runs within a project.\n * - One Chat = one builder Run with `layer='builder'`.\n * - One Ship = one child Run with `layer='app-build'` + SandboxHarness.\n * - One AppScenario = one grandchild Run with `layer='app-runtime'`.\n *\n * Consumers obtain a BuilderSession, call `startChat`, drive the\n * builder agent (emitting spans), and call `ship` / `runAppScenario`\n * as the workflow progresses. The session reconstructs itself from\n * trace data via `resume(store, projectId)`.\n */\n\nimport type { HarnessConfig, SandboxDriver, SandboxHarnessResult } from '../sandbox-harness'\nimport { SandboxHarness } from '../sandbox-harness'\nimport type { TestGradedRunResult, TestGradedScenario } from '../test-graded-scenario'\nimport { runTestGradedScenario } from '../test-graded-scenario'\nimport { TraceEmitter } from '../trace/emitter'\nimport type { Run } from '../trace/schema'\nimport type { TraceStore } from '../trace/store'\n\nexport interface BuilderSessionInit {\n projectId: string\n chatId?: string\n /** Free-form: user's task description, project name, etc. Stored on the builder Run. */\n tags?: Record<string, string>\n}\n\nexport interface ShipOptions {\n harness: HarnessConfig\n driver?: SandboxDriver\n /** scenarioId of this app-build run. Defaults to `${projectId}/build`. */\n scenarioId?: string\n}\n\nexport interface RunAppScenarioOptions {\n scenario: TestGradedScenario\n /** Harness driver override; defaults to the one the session was created with. */\n driver?: SandboxDriver\n}\n\nexport class BuilderSession {\n private store: TraceStore\n private builderEmitter: TraceEmitter\n readonly projectId: string\n readonly chatId: string\n private builderRunId?: string\n private lastBuildRunId?: string\n private defaultDriver?: SandboxDriver\n\n constructor(store: TraceStore, init: BuilderSessionInit, driver?: SandboxDriver) {\n this.store = store\n this.projectId = init.projectId\n this.chatId = init.chatId ?? cryptoId()\n this.defaultDriver = driver\n this.builderEmitter = new TraceEmitter(store)\n }\n\n /** Start the builder (L0) run for this chat. Returns the runId. */\n async startChat(scenarioId = `${this.projectId}/chat`): Promise<string> {\n await this.builderEmitter.startRun({\n scenarioId,\n projectId: this.projectId,\n chatId: this.chatId,\n layer: 'builder',\n })\n this.builderRunId = this.builderEmitter.runId\n return this.builderRunId\n }\n\n /** The emitter for builder-level spans (edits, LLM calls, tool invocations). */\n get emitter(): TraceEmitter {\n if (!this.builderRunId) throw new Error('BuilderSession.emitter: call startChat() first')\n return this.builderEmitter\n }\n\n /**\n * Ship the project's generated app: run the sandbox harness as a child\n * Run (`layer='app-build'`). Returns the build result + runId.\n */\n async ship(options: ShipOptions): Promise<{ runId: string; result: SandboxHarnessResult }> {\n if (!this.builderRunId) throw new Error('BuilderSession.ship: call startChat() first')\n const buildEmitter = new TraceEmitter(this.store)\n await buildEmitter.startRun({\n scenarioId: options.scenarioId ?? `${this.projectId}/build`,\n projectId: this.projectId,\n chatId: this.chatId,\n parentRunId: this.builderRunId,\n layer: 'app-build',\n })\n const harness = new SandboxHarness(options.driver ?? this.defaultDriver)\n const result = await harness.run(options.harness, buildEmitter)\n await buildEmitter.endRun({\n pass: result.passed,\n score: result.score,\n failureClass: result.passed ? 'success' : 'sandbox_failure',\n })\n this.lastBuildRunId = buildEmitter.runId\n return { runId: buildEmitter.runId, result }\n }\n\n /**\n * Run a domain scenario against the just-built app as a grandchild Run\n * (`layer='app-runtime'`). The `ship` call must precede this so the\n * parent is set correctly; if no build exists yet the session attaches\n * directly to the builder run (useful for prototypes).\n */\n async runAppScenario(options: RunAppScenarioOptions): Promise<TestGradedRunResult> {\n const parentRunId = this.lastBuildRunId ?? this.builderRunId\n if (!parentRunId)\n throw new Error('BuilderSession.runAppScenario: call startChat() + ship() first')\n const { scenario, driver } = options\n const result = await runTestGradedScenario(scenario, this.store, {\n driver: driver ?? this.defaultDriver,\n provenance: { codeSha: undefined, promptSha: undefined, modelFingerprint: undefined },\n })\n // Attach to the parent chain by updating the stored Run in place.\n await this.store.updateRun(result.runId, {\n parentRunId,\n projectId: this.projectId,\n chatId: this.chatId,\n layer: 'app-runtime',\n })\n return result\n }\n\n /** Record an end-of-chat meta score (judge verdict on whether the builder\n * served the user's intent). Accepts a numeric score + optional rationale. */\n async recordMetaScore(score: number, rationale?: string): Promise<void> {\n if (!this.builderRunId)\n throw new Error('BuilderSession.recordMetaScore: call startChat() first')\n await this.builderEmitter.recordJudge({\n judgeId: 'builder-meta',\n targetSpanId: this.builderRunId, // attach to the builder run itself\n dimension: 'user_intent_satisfaction',\n score,\n rationale,\n name: 'builder-meta',\n })\n }\n\n /** Close the builder Run with a final outcome. */\n async endChat(outcome: { pass: boolean; score?: number; notes?: string }): Promise<void> {\n await this.builderEmitter.endRun({\n pass: outcome.pass,\n score: outcome.score,\n notes: outcome.notes,\n })\n }\n\n /**\n * Inline app-runtime run — for cases where the \"scenario\" isn't a\n * SWE-bench-style test suite but a live agent interaction (LLM chat,\n * domain flow). Returns an emitter bound to a fresh Run in the\n * `app-runtime` layer; caller emits spans inside and calls\n * `.endRun()` with the final verdict.\n */\n async startAppRuntime(scenarioId: string): Promise<TraceEmitter> {\n const parentRunId = this.lastBuildRunId ?? this.builderRunId\n if (!parentRunId)\n throw new Error(\n 'BuilderSession.startAppRuntime: call startChat() + (optionally) ship() first',\n )\n const emitter = new TraceEmitter(this.store)\n await emitter.startRun({\n scenarioId,\n projectId: this.projectId,\n chatId: this.chatId,\n parentRunId,\n layer: 'app-runtime',\n })\n return emitter\n }\n\n /**\n * Lightweight \"ship marker\" — record an app-build Run with a caller-\n * provided verdict. Use when there isn't a sandbox harness to run but\n * you still want to mark the build state at publish time.\n */\n async recordShipMarker(args: {\n pass: boolean\n score: number\n scenarioId?: string\n notes?: string\n }): Promise<string> {\n if (!this.builderRunId)\n throw new Error('BuilderSession.recordShipMarker: call startChat() first')\n const emitter = new TraceEmitter(this.store)\n await emitter.startRun({\n scenarioId: args.scenarioId ?? `${this.projectId}/ship`,\n projectId: this.projectId,\n chatId: this.chatId,\n parentRunId: this.builderRunId,\n layer: 'app-build',\n })\n await emitter.endRun({\n pass: args.pass,\n score: args.score,\n failureClass: args.pass ? 'success' : 'sandbox_failure',\n notes: args.notes,\n })\n this.lastBuildRunId = emitter.runId\n return emitter.runId\n }\n\n get lastBuildRunIdValue(): string | undefined {\n return this.lastBuildRunId\n }\n get builderRunIdValue(): string | undefined {\n return this.builderRunId\n }\n}\n\n/**\n * Reconstruct the most recent BuilderSession state for a given project —\n * returns { builderRunId, lastBuildRunId, chatRuns }. For chat-first UIs\n * this is how a resumed session finds its place in the edit history.\n */\nexport async function resumeBuilderSession(\n store: TraceStore,\n projectId: string,\n): Promise<{\n projectId: string\n chatRuns: Run[]\n lastBuilderRun?: Run\n lastBuildRun?: Run\n lastAppRuntimeRuns: Run[]\n}> {\n const runs = await store.listRuns({ projectId })\n const chatRuns = runs\n .filter((r) => r.layer === 'builder')\n .sort((a, b) => b.startedAt - a.startedAt)\n const buildRuns = runs\n .filter((r) => r.layer === 'app-build')\n .sort((a, b) => b.startedAt - a.startedAt)\n const appRuntimeRuns = runs\n .filter((r) => r.layer === 'app-runtime')\n .sort((a, b) => b.startedAt - a.startedAt)\n return {\n projectId,\n chatRuns,\n lastBuilderRun: chatRuns[0],\n lastBuildRun: buildRuns[0],\n lastAppRuntimeRuns: appRuntimeRuns,\n }\n}\n\nfunction cryptoId(): string {\n if (typeof globalThis.crypto?.randomUUID === 'function') return globalThis.crypto.randomUUID()\n return `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 10)}`\n}\n","/**\n * Meta-eval correlation — the highest-leverage signal in the framework.\n *\n * Given a corpus of three-layer project reports, compute how well each\n * pair of layers correlates. The question we care about most:\n *\n * Does `metaScore` (what the builder thinks it did) predict\n * `runtimeScore` (what the user actually gets)?\n *\n * If r < ~0.4, the builder's self-scoring is broken — it's optimizing\n * for something other than real-world success. If r > 0.7, meta_score\n * is a usable proxy and can drive CI gates cheaply.\n *\n * Non-parametric rank correlation (Spearman) is also reported because\n * meta scores are often ordinal-ish.\n */\n\nimport { pearsonR, spearmanR } from '../statistics'\nimport type { ThreeLayerProjectReport } from './three-layer-eval'\n\nexport interface LayerCorrelation {\n n: number\n pearson: number\n spearman: number\n}\n\nexport interface CorrelationReport {\n /** Pairs present in the corpus (layers with ≥ 2 matched data points). */\n metaVsBuild?: LayerCorrelation\n metaVsRuntime?: LayerCorrelation\n buildVsRuntime?: LayerCorrelation\n /** Number of complete projects (all 3 scores present). */\n completeProjects: number\n}\n\nexport function correlateLayers(reports: ThreeLayerProjectReport[]): CorrelationReport {\n const completeProjects = reports.filter((r) => r.complete).length\n return {\n metaVsBuild: pairwise(\n reports,\n (r) => r.metaScore,\n (r) => r.buildScore,\n ),\n metaVsRuntime: pairwise(\n reports,\n (r) => r.metaScore,\n (r) => r.runtimeScore,\n ),\n buildVsRuntime: pairwise(\n reports,\n (r) => r.buildScore,\n (r) => r.runtimeScore,\n ),\n completeProjects,\n }\n}\n\nfunction pairwise(\n reports: ThreeLayerProjectReport[],\n a: (r: ThreeLayerProjectReport) => number | null,\n b: (r: ThreeLayerProjectReport) => number | null,\n): LayerCorrelation | undefined {\n const xs: number[] = []\n const ys: number[] = []\n for (const r of reports) {\n const x = a(r)\n const y = b(r)\n if (x !== null && y !== null && Number.isFinite(x) && Number.isFinite(y)) {\n xs.push(x)\n ys.push(y)\n }\n }\n if (xs.length < 2) return undefined\n return {\n n: xs.length,\n pearson: pearsonR(xs, ys),\n spearman: spearmanR(xs, ys),\n }\n}\n","/**\n * ProjectRegistry — project-level aggregation over the trace corpus.\n *\n * Thin reader over TraceStore that answers the questions a chat-first,\n * resumable UI needs:\n * - listProjects() → project IDs with latest activity\n * - projectTimeline(id) → chats + builds + runtime runs, chronological\n * - projectChats(id) → chat-level summaries (turn count, outcome)\n *\n * All queries are pure reads; no state duplication.\n */\n\nimport type { Run } from '../trace/schema'\nimport type { TraceStore } from '../trace/store'\n\nexport interface ProjectSummary {\n projectId: string\n chatCount: number\n buildCount: number\n appRuntimeCount: number\n lastActivityAt: number\n latestChatId?: string\n latestOutcome?: { pass: boolean; score?: number }\n}\n\nexport interface ChatSummary {\n chatId: string\n projectId: string\n builderRunId: string\n startedAt: number\n endedAt?: number\n status: Run['status']\n outcome?: Run['outcome']\n /** Counts of spans emitted during the chat. */\n llmTurns?: number\n toolCalls?: number\n buildRunId?: string\n appRuntimeRunIds: string[]\n}\n\nexport interface ProjectTimelineEntry {\n run: Run\n layerBucket: 'chat' | 'build' | 'runtime' | 'other'\n}\n\nexport class ProjectRegistry {\n constructor(private store: TraceStore) {}\n\n async listProjects(): Promise<ProjectSummary[]> {\n const runs = await this.store.listRuns()\n const byProject = new Map<string, Run[]>()\n for (const r of runs) {\n if (!r.projectId) continue\n const arr = byProject.get(r.projectId) ?? []\n arr.push(r)\n byProject.set(r.projectId, arr)\n }\n const summaries: ProjectSummary[] = []\n for (const [projectId, projectRuns] of byProject) {\n const sorted = projectRuns.slice().sort((a, b) => b.startedAt - a.startedAt)\n const chats = projectRuns.filter((r) => r.layer === 'builder')\n const builds = projectRuns.filter((r) => r.layer === 'app-build')\n const runtimes = projectRuns.filter((r) => r.layer === 'app-runtime')\n const latest = sorted[0]\n if (!latest) continue\n summaries.push({\n projectId,\n chatCount: chats.length,\n buildCount: builds.length,\n appRuntimeCount: runtimes.length,\n lastActivityAt: latest.startedAt,\n latestChatId: chats[0]?.chatId,\n latestOutcome: latest.outcome\n ? { pass: latest.outcome.pass ?? false, score: latest.outcome.score }\n : undefined,\n })\n }\n return summaries.sort((a, b) => b.lastActivityAt - a.lastActivityAt)\n }\n\n async projectTimeline(projectId: string): Promise<ProjectTimelineEntry[]> {\n const runs = await this.store.listRuns({ projectId })\n const ordered = runs.slice().sort((a, b) => a.startedAt - b.startedAt)\n return ordered.map((run) => ({\n run,\n layerBucket:\n run.layer === 'builder'\n ? 'chat'\n : run.layer === 'app-build'\n ? 'build'\n : run.layer === 'app-runtime'\n ? 'runtime'\n : 'other',\n }))\n }\n\n async projectChats(projectId: string): Promise<ChatSummary[]> {\n const builderRuns = (await this.store.listRuns({ projectId, layer: 'builder' })).sort(\n (a, b) => b.startedAt - a.startedAt,\n )\n const childrenFor = async (runId: string) => this.store.listRuns({ parentRunId: runId })\n const out: ChatSummary[] = []\n for (const run of builderRuns) {\n const spans = await this.store.spans({ runId: run.runId })\n const children = await childrenFor(run.runId)\n const build = children.find((c) => c.layer === 'app-build')\n const runtime: string[] = []\n // Runtime runs can be grandchildren (attached to the build) or siblings\n // when shipped skipped.\n if (build) {\n const grands = await childrenFor(build.runId)\n for (const g of grands) if (g.layer === 'app-runtime') runtime.push(g.runId)\n }\n for (const c of children) if (c.layer === 'app-runtime') runtime.push(c.runId)\n out.push({\n chatId: run.chatId ?? run.runId,\n projectId,\n builderRunId: run.runId,\n startedAt: run.startedAt,\n endedAt: run.endedAt,\n status: run.status,\n outcome: run.outcome,\n llmTurns: spans.filter((s) => s.kind === 'llm').length,\n toolCalls: spans.filter((s) => s.kind === 'tool').length,\n buildRunId: build?.runId,\n appRuntimeRunIds: runtime,\n })\n }\n return out\n }\n}\n","/**\n * Three-layer evaluation — the canonical scoring breakdown for\n * builder-of-builders workflows.\n *\n * meta_score: did the builder understand + satisfy user intent?\n * (judge verdict attached to the builder run)\n * build_score: did the generated scaffold build + pass its own tests?\n * (outcome.score on the app-build child run)\n * runtime_score: did the generated agent pass its domain scenarios?\n * (mean outcome.score over app-runtime grandchild runs)\n *\n * Returns a structured report per project. The cross-layer correlation\n * is the highest-leverage signal the framework computes — if\n * meta_score doesn't predict runtime_score, the builder's self-scoring\n * is broken.\n *\n * Scaffold-only mode: when a project has no `app-runtime` runs (e.g. a\n * scaffold-builder eval that grades compose + build without driving a\n * runtime scenario), `kind` is `'scaffold-only'` and `complete` measures\n * meta + build only. Consumers can tell the two apart without having to\n * interpret null-runtime as either \"not yet computed\" or \"N/A for this\n * project shape\".\n */\n\nimport { judgeSpans } from '../trace/query'\nimport type { Run } from '../trace/schema'\nimport type { TraceStore } from '../trace/store'\n\nexport type ProjectKind = 'full' | 'scaffold-only'\n\nexport interface ThreeLayerProjectReport {\n projectId: string\n /**\n * `'full'` when the project has at least one `app-runtime` run;\n * `'scaffold-only'` when it only has meta + build layers. Lets\n * downstream consumers treat a null runtime score as expected\n * (scaffold-only) vs. missing (full, pipeline broke).\n */\n kind: ProjectKind\n builderRunId?: string\n /** Judge-verdict score on the builder run (0..1 after normalization). */\n metaScore: number | null\n buildRunId?: string\n /** 0..1 from the sandbox harness (testsPassed / testsTotal). */\n buildScore: number | null\n appRuntimeRunIds: string[]\n /** Mean of outcome.score over app-runtime runs, 0..1. Always null in scaffold-only mode. */\n runtimeScore: number | null\n runtimePassRate: number | null\n /**\n * Layer-aware completeness:\n * - `kind='full'`: all three layers scored\n * - `kind='scaffold-only'`: meta + build scored (runtime not applicable)\n */\n complete: boolean\n}\n\nexport async function scoreProject(\n store: TraceStore,\n projectId: string,\n): Promise<ThreeLayerProjectReport> {\n const allRuns = await store.listRuns({ projectId })\n const builder = latestByLayer(allRuns, 'builder')\n const build = latestByLayer(allRuns, 'app-build')\n const runtime = allRuns.filter((r) => r.layer === 'app-runtime')\n\n const metaScore = builder ? await extractMetaScore(store, builder.runId) : null\n const buildScore = build?.outcome?.score ?? null\n const runtimeScores = runtime\n .map((r) => r.outcome?.score)\n .filter((s): s is number => typeof s === 'number')\n const runtimeScore =\n runtimeScores.length > 0\n ? runtimeScores.reduce((a, b) => a + b, 0) / runtimeScores.length\n : null\n const runtimePassed = runtime.filter((r) => r.outcome?.pass === true).length\n const runtimePassRate = runtime.length > 0 ? runtimePassed / runtime.length : null\n\n const kind: ProjectKind = runtime.length === 0 ? 'scaffold-only' : 'full'\n const complete =\n kind === 'scaffold-only'\n ? metaScore !== null && buildScore !== null\n : metaScore !== null && buildScore !== null && runtimeScore !== null\n\n return {\n projectId,\n kind,\n builderRunId: builder?.runId,\n metaScore,\n buildRunId: build?.runId,\n buildScore,\n appRuntimeRunIds: runtime.map((r) => r.runId),\n runtimeScore,\n runtimePassRate,\n complete,\n }\n}\n\n/** Aggregate scoring across every project in a corpus. */\nexport async function scoreAllProjects(store: TraceStore): Promise<ThreeLayerProjectReport[]> {\n const runs = await store.listRuns()\n const projectIds = [...new Set(runs.map((r) => r.projectId).filter((p): p is string => !!p))]\n return Promise.all(projectIds.map((p) => scoreProject(store, p)))\n}\n\nfunction latestByLayer(runs: Run[], layer: Run['layer']): Run | undefined {\n const filtered = runs.filter((r) => r.layer === layer).sort((a, b) => b.startedAt - a.startedAt)\n return filtered[0]\n}\n\nasync function extractMetaScore(store: TraceStore, builderRunId: string): Promise<number | null> {\n const js = await judgeSpans(store, builderRunId)\n const meta = js.find(\n (s) => s.judgeId === 'builder-meta' && s.dimension === 'user_intent_satisfaction',\n )\n if (!meta) return null\n // Normalize score to 0..1. Accept 0-1 natively; 0-10 scale is also common.\n if (meta.score >= 0 && meta.score <= 1) return meta.score\n if (meta.score >= 0 && meta.score <= 10) return meta.score / 10\n return null\n}\n"],"mappings":"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"}
@@ -0,0 +1,94 @@
1
+ //#region src/meta-eval/calibration.ts
2
+ async function calibrationCurve(traceStore, outcomeStore, evalMetric, outcomeMetric, options = {}) {
3
+ const runs = await traceStore.listRuns();
4
+ const outcomes = await outcomeStore.list();
5
+ const byRun = /* @__PURE__ */ new Map();
6
+ for (const o of outcomes) {
7
+ const arr = byRun.get(o.runId) ?? [];
8
+ arr.push(o);
9
+ byRun.set(o.runId, arr);
10
+ }
11
+ const extract = evalMetric.extract ?? defaultExtract(evalMetric.id);
12
+ const pairs = [];
13
+ for (const run of runs) {
14
+ const os = byRun.get(run.runId);
15
+ if (!os?.length) continue;
16
+ const x = await extract(run, traceStore);
17
+ if (x === null || !Number.isFinite(x)) continue;
18
+ const y = [...os].sort((a, b) => b.capturedAt - a.capturedAt)[0].metrics[outcomeMetric];
19
+ if (typeof y !== "number" || !Number.isFinite(y)) continue;
20
+ pairs.push({
21
+ x,
22
+ y
23
+ });
24
+ }
25
+ if (pairs.length < 2) return null;
26
+ return calibrationFromPairs(pairs.map((p) => ({
27
+ evalScore: p.x,
28
+ outcome: p.y
29
+ })), evalMetric.id, outcomeMetric, options);
30
+ }
31
+ function calibrationFromPairs(inputPairs, evalMetric, outcomeMetric, options = {}) {
32
+ const pairs = inputPairs.filter((pair) => Number.isFinite(pair.evalScore) && Number.isFinite(pair.outcome));
33
+ if (pairs.length < 2) return null;
34
+ const numBins = options.bins ?? 10;
35
+ const binning = options.binning ?? "equal-width";
36
+ const xs = pairs.map((p) => p.evalScore);
37
+ const lo = options.range?.lo ?? Math.min(...xs);
38
+ const hi = options.range?.hi ?? Math.max(...xs);
39
+ const bins = [];
40
+ if (binning === "equal-frequency") {
41
+ const sorted = [...pairs].sort((a, b) => a.evalScore - b.evalScore);
42
+ const perBin = Math.max(1, Math.floor(sorted.length / numBins));
43
+ for (let i = 0; i < sorted.length; i += perBin) {
44
+ const chunk = sorted.slice(i, i + perBin);
45
+ if (chunk.length === 0) continue;
46
+ bins.push(toBin(chunk));
47
+ }
48
+ } else {
49
+ const width = (hi - lo) / numBins;
50
+ if (width === 0) return null;
51
+ for (let i = 0; i < numBins; i++) {
52
+ const binLo = lo + i * width;
53
+ const binHi = i === numBins - 1 ? hi + 1e-9 : lo + (i + 1) * width;
54
+ const chunk = pairs.filter((p) => p.evalScore >= binLo && p.evalScore < binHi);
55
+ if (chunk.length === 0) continue;
56
+ bins.push(toBin(chunk, binLo, binHi));
57
+ }
58
+ }
59
+ const total = bins.reduce((a, b) => a + b.n, 0);
60
+ const ece = bins.reduce((a, b) => a + b.n / total * b.gap, 0);
61
+ const maxGap = bins.reduce((a, b) => Math.max(a, b.gap), 0);
62
+ return {
63
+ evalMetric,
64
+ outcomeMetric,
65
+ n: pairs.length,
66
+ bins,
67
+ ece,
68
+ maxGap
69
+ };
70
+ }
71
+ function toBin(chunk, lower, upper) {
72
+ const xs = chunk.map((c) => c.evalScore);
73
+ const ys = chunk.map((c) => c.outcome);
74
+ const evalMean = mean(xs);
75
+ const outcomeMean = mean(ys);
76
+ return {
77
+ lower: lower ?? Math.min(...xs),
78
+ upper: upper ?? Math.max(...xs),
79
+ n: chunk.length,
80
+ evalMean,
81
+ outcomeMean,
82
+ gap: Math.abs(outcomeMean - evalMean)
83
+ };
84
+ }
85
+ function mean(xs) {
86
+ return xs.reduce((a, b) => a + b, 0) / xs.length;
87
+ }
88
+ function defaultExtract(metric) {
89
+ return async (run) => run.outcome?.score ?? (metric === "pass" ? run.outcome?.pass === true ? 1 : 0 : null);
90
+ }
91
+ //#endregion
92
+ export { calibrationFromPairs as n, calibrationCurve as t };
93
+
94
+ //# sourceMappingURL=calibration-CNWWA6K8.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calibration-CNWWA6K8.js","names":[],"sources":["../src/meta-eval/calibration.ts"],"sourcesContent":["/**\n * Calibration curve — binned \"if eval says X, what does reality show?\"\n *\n * Companion to correlationStudy. Raw correlation is a single number;\n * the calibration curve shows *where* the eval is well-calibrated vs\n * overconfident / underconfident. Buckets the eval metric, computes\n * mean outcome per bucket, reports expected-calibration-error (ECE).\n */\n\nimport type { Run } from '../trace/schema'\nimport type { TraceStore } from '../trace/store'\nimport type { EvalMetricSpec } from './correlation-study'\nimport type { DeploymentOutcome, OutcomeStore } from './outcome-store'\n\nexport interface CalibrationBin {\n lower: number\n upper: number\n n: number\n evalMean: number\n outcomeMean: number\n /** |outcomeMean − evalMean|; contributes to ECE weighted by n/total. */\n gap: number\n}\n\nexport interface CalibrationReport {\n evalMetric: string\n outcomeMetric: string\n n: number\n bins: CalibrationBin[]\n /** Expected Calibration Error — Σ (n_i/N) × |outcomeMean_i − evalMean_i|. */\n ece: number\n /** Max bin gap — upper bound on miscalibration. */\n maxGap: number\n}\n\nexport interface CalibrationOptions {\n bins?: number\n /** Equal-width (fixed bin edges) or equal-frequency (quantile bins). */\n binning?: 'equal-width' | 'equal-frequency'\n /** Clip eval values to [lo, hi] before binning. */\n range?: { lo: number; hi: number }\n}\n\nexport interface CalibrationPair {\n evalScore: number\n outcome: number\n}\n\nexport async function calibrationCurve(\n traceStore: TraceStore,\n outcomeStore: OutcomeStore,\n evalMetric: EvalMetricSpec,\n outcomeMetric: string,\n options: CalibrationOptions = {},\n): Promise<CalibrationReport | null> {\n const runs = await traceStore.listRuns()\n const outcomes = await outcomeStore.list()\n const byRun = new Map<string, DeploymentOutcome[]>()\n for (const o of outcomes) {\n const arr = byRun.get(o.runId) ?? []\n arr.push(o)\n byRun.set(o.runId, arr)\n }\n\n const extract = evalMetric.extract ?? defaultExtract(evalMetric.id)\n const pairs: Array<{ x: number; y: number }> = []\n for (const run of runs) {\n const os = byRun.get(run.runId)\n if (!os?.length) continue\n const x = await extract(run, traceStore)\n if (x === null || !Number.isFinite(x)) continue\n const latest = [...os].sort((a, b) => b.capturedAt - a.capturedAt)[0]!\n const y = latest.metrics[outcomeMetric]\n if (typeof y !== 'number' || !Number.isFinite(y)) continue\n pairs.push({ x, y })\n }\n if (pairs.length < 2) return null\n\n return calibrationFromPairs(\n pairs.map((p) => ({ evalScore: p.x, outcome: p.y })),\n evalMetric.id,\n outcomeMetric,\n options,\n )\n}\n\nexport function calibrationFromPairs(\n inputPairs: CalibrationPair[],\n evalMetric: string,\n outcomeMetric: string,\n options: CalibrationOptions = {},\n): CalibrationReport | null {\n const pairs = inputPairs.filter(\n (pair) => Number.isFinite(pair.evalScore) && Number.isFinite(pair.outcome),\n )\n if (pairs.length < 2) return null\n\n const numBins = options.bins ?? 10\n const binning = options.binning ?? 'equal-width'\n const xs = pairs.map((p) => p.evalScore)\n const lo = options.range?.lo ?? Math.min(...xs)\n const hi = options.range?.hi ?? Math.max(...xs)\n\n const bins: CalibrationBin[] = []\n if (binning === 'equal-frequency') {\n const sorted = [...pairs].sort((a, b) => a.evalScore - b.evalScore)\n const perBin = Math.max(1, Math.floor(sorted.length / numBins))\n for (let i = 0; i < sorted.length; i += perBin) {\n const chunk = sorted.slice(i, i + perBin)\n if (chunk.length === 0) continue\n bins.push(toBin(chunk))\n }\n } else {\n const width = (hi - lo) / numBins\n if (width === 0) return null\n for (let i = 0; i < numBins; i++) {\n const binLo = lo + i * width\n const binHi = i === numBins - 1 ? hi + 1e-9 : lo + (i + 1) * width\n const chunk = pairs.filter((p) => p.evalScore >= binLo && p.evalScore < binHi)\n if (chunk.length === 0) continue\n bins.push(toBin(chunk, binLo, binHi))\n }\n }\n\n const total = bins.reduce((a, b) => a + b.n, 0)\n const ece = bins.reduce((a, b) => a + (b.n / total) * b.gap, 0)\n const maxGap = bins.reduce((a, b) => Math.max(a, b.gap), 0)\n\n return { evalMetric, outcomeMetric, n: pairs.length, bins, ece, maxGap }\n}\n\nfunction toBin(chunk: CalibrationPair[], lower?: number, upper?: number): CalibrationBin {\n const xs = chunk.map((c) => c.evalScore)\n const ys = chunk.map((c) => c.outcome)\n const evalMean = mean(xs)\n const outcomeMean = mean(ys)\n return {\n lower: lower ?? Math.min(...xs),\n upper: upper ?? Math.max(...xs),\n n: chunk.length,\n evalMean,\n outcomeMean,\n gap: Math.abs(outcomeMean - evalMean),\n }\n}\n\nfunction mean(xs: number[]): number {\n return xs.reduce((a, b) => a + b, 0) / xs.length\n}\n\nfunction defaultExtract(metric: string): (run: Run, store: TraceStore) => Promise<number | null> {\n return async (run) =>\n run.outcome?.score ?? (metric === 'pass' ? (run.outcome?.pass === true ? 1 : 0) : null)\n}\n"],"mappings":"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"}