reeval 0.9.0 → 0.11.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 (336) hide show
  1. package/README.md +99 -64
  2. package/THIRD_PARTY_NOTICES.md +288 -112
  3. package/assets/package.json +1 -1
  4. package/assets/pnpm-lock.yaml +30 -30
  5. package/dist/adapter-Bwy3QxAK.js +279 -0
  6. package/dist/adapter-Bwy3QxAK.js.map +1 -0
  7. package/dist/{agent-6FefIhX7.js → agent-D483ru7D.js} +6 -6
  8. package/dist/{agent-6FefIhX7.js.map → agent-D483ru7D.js.map} +1 -1
  9. package/dist/{agent-WSmTaesf.js → agent-DpE80WPz.js} +46 -15
  10. package/dist/agent-DpE80WPz.js.map +1 -0
  11. package/dist/{analysis-DlGBDjTj.js → analysis-Bxub9LMT.js} +4 -4
  12. package/dist/{analysis-DlGBDjTj.js.map → analysis-Bxub9LMT.js.map} +1 -1
  13. package/dist/assemble-D5KGrwnJ.js +1 -0
  14. package/dist/{assemble-BCZzTyR7.js → assemble-D9GWr-HS.js} +69 -41
  15. package/dist/assemble-D9GWr-HS.js.map +1 -0
  16. package/dist/{client-Bbo9SPlK.js → assert-EUIoRdIt.js} +10 -113
  17. package/dist/assert-EUIoRdIt.js.map +1 -0
  18. package/dist/bridge/index.mjs +260 -60
  19. package/dist/{capture-Bp74Z6Fr.js → capture-BQlGHiMC.js} +146 -32
  20. package/dist/capture-BQlGHiMC.js.map +1 -0
  21. package/dist/capture-CYGLpWxR.js +1 -0
  22. package/dist/{cli-CVrMh_qz.js → cli-ClpPT8kn.js} +229 -537
  23. package/dist/cli-ClpPT8kn.js.map +1 -0
  24. package/dist/{cli-spec-CKEYa8V2.js → cli-spec-qmEnQ25_.js} +50 -22
  25. package/dist/cli-spec-qmEnQ25_.js.map +1 -0
  26. package/dist/cli.js +4 -2
  27. package/dist/cli.js.map +1 -1
  28. package/dist/client-fcwgwOAD.js +106 -0
  29. package/dist/client-fcwgwOAD.js.map +1 -0
  30. package/dist/{command-DUT5l13I.js → command-Bj39y-Wm.js} +329 -87
  31. package/dist/command-Bj39y-Wm.js.map +1 -0
  32. package/dist/{command-BFP0hKEb.js → command-BlM0y8jN.js} +14 -14
  33. package/dist/{command-BFP0hKEb.js.map → command-BlM0y8jN.js.map} +1 -1
  34. package/dist/command-C-cVjlny.js +1 -0
  35. package/dist/{command-CzIFp1JQ.js → command-DbAe1Rzb.js} +19 -19
  36. package/dist/command-DbAe1Rzb.js.map +1 -0
  37. package/dist/{command-C5xFPKHM.js → command-TgbzPizb.js} +378 -74
  38. package/dist/command-TgbzPizb.js.map +1 -0
  39. package/dist/commands-CthqwkAn.js +1 -0
  40. package/dist/{commands-CLmPBrTS.js → commands-YUwlyTbr.js} +14 -11
  41. package/dist/commands-YUwlyTbr.js.map +1 -0
  42. package/dist/config-DrVSEVN0.js +774 -0
  43. package/dist/config-DrVSEVN0.js.map +1 -0
  44. package/dist/{context-DbSMEVKs.js → context-C1mxXh80.js} +11 -3
  45. package/dist/context-C1mxXh80.js.map +1 -0
  46. package/dist/contrasts-5zsj32gk.js +101 -0
  47. package/dist/contrasts-5zsj32gk.js.map +1 -0
  48. package/dist/db-CKg5NtiW.js +2 -0
  49. package/dist/{db-CfQFwJtq.js → db-DfhipHEF.js} +467 -38
  50. package/dist/db-DfhipHEF.js.map +1 -0
  51. package/dist/debug-D7bEv_UV.js +1 -0
  52. package/dist/{dist-CTzThfu_.js → dist-CuY4ehEk.js} +95 -15
  53. package/dist/dist-CuY4ehEk.js.map +1 -0
  54. package/dist/{docker-CRQGQbIt.js → docker-D1HZDS6q.js} +22 -21
  55. package/dist/docker-D1HZDS6q.js.map +1 -0
  56. package/dist/docker-DNmMPOBb.js +1 -0
  57. package/dist/{docker-DV2GNgle.js → docker-DOvjji9I.js} +3 -3
  58. package/dist/docker-DOvjji9I.js.map +1 -0
  59. package/dist/{doctor-DlKycx5H.js → doctor-D2MbNO8L.js} +262 -84
  60. package/dist/doctor-D2MbNO8L.js.map +1 -0
  61. package/dist/{egress-BhzNh7Yi.js → egress-2-qzPvGi.js} +146 -15
  62. package/dist/egress-2-qzPvGi.js.map +1 -0
  63. package/dist/environment-Cca6a4wB.js +1132 -0
  64. package/dist/environment-Cca6a4wB.js.map +1 -0
  65. package/dist/{errors-yDAEwmZo.js → errors-B6BSMs03.js} +2 -2
  66. package/dist/errors-B6BSMs03.js.map +1 -0
  67. package/dist/{errors-C9w_ud7g.js → errors-r025B0Zb.js} +4 -4
  68. package/dist/errors-r025B0Zb.js.map +1 -0
  69. package/dist/evaluate-DKIl54Hb.js +2348 -0
  70. package/dist/evaluate-DKIl54Hb.js.map +1 -0
  71. package/dist/evaluate-DMyaGQEj.d.ts +92 -0
  72. package/dist/files-BAt0i00X.js +1 -0
  73. package/dist/{files-DJUFg-4e.js → files-BXHZFWmx.js} +5 -5
  74. package/dist/{files-DJUFg-4e.js.map → files-BXHZFWmx.js.map} +1 -1
  75. package/dist/files-Bk1mC3AN.js +43 -0
  76. package/dist/files-Bk1mC3AN.js.map +1 -0
  77. package/dist/{files-CSzVADHn.js → files-BpUYBwGu.js} +11 -10
  78. package/dist/{files-CSzVADHn.js.map → files-BpUYBwGu.js.map} +1 -1
  79. package/dist/files-Bw8lWEjg.js +1 -0
  80. package/dist/files-D6J0iSdx.js +1 -0
  81. package/dist/{git-DfG-YJ1u.js → git-Crl3b87o.js} +2 -2
  82. package/dist/{git-DfG-YJ1u.js.map → git-Crl3b87o.js.map} +1 -1
  83. package/dist/harness-CEuntrla.js +323 -0
  84. package/dist/harness-CEuntrla.js.map +1 -0
  85. package/dist/harness.d.ts +16 -30
  86. package/dist/harness.js +1 -2
  87. package/dist/{header-CALhmafp.js → header-DHQv_ZrF.js} +2 -2
  88. package/dist/{header-CALhmafp.js.map → header-DHQv_ZrF.js.map} +1 -1
  89. package/dist/{images-BMgdpMAX.js → images-Bi3aGxb9.js} +114 -45
  90. package/dist/images-Bi3aGxb9.js.map +1 -0
  91. package/dist/index.d.ts +9 -37
  92. package/dist/index.js +6 -2138
  93. package/dist/{init-BIdLF0F9.js → init-Cl3f3NBT.js} +26 -8
  94. package/dist/init-Cl3f3NBT.js.map +1 -0
  95. package/dist/init-fhOXED8F.js +1 -0
  96. package/dist/{invocations-CLaL8AuW.js → invocations-BYDPe3fV.js} +4 -4
  97. package/dist/{invocations-CLaL8AuW.js.map → invocations-BYDPe3fV.js.map} +1 -1
  98. package/dist/{judge-CeYPN8P_.js → judge-DW_GDOmB.js} +11 -19
  99. package/dist/{judge-CeYPN8P_.js.map → judge-DW_GDOmB.js.map} +1 -1
  100. package/dist/judge.d.ts +2 -2
  101. package/dist/judge.js +1 -1
  102. package/dist/{live-S0qODb6o.js → live-jlfszAbb.js} +9 -20
  103. package/dist/live-jlfszAbb.js.map +1 -0
  104. package/dist/matchers-Ddmc2z7H.js +118 -0
  105. package/dist/matchers-Ddmc2z7H.js.map +1 -0
  106. package/dist/model-CXhrziBe.js +1 -0
  107. package/dist/{model-B1BZoZ9b.js → model-D0IcOQao.js} +22 -20
  108. package/dist/model-D0IcOQao.js.map +1 -0
  109. package/dist/{model-DEQo3FkZ.js → model-DaVCY3rb.js} +2 -2
  110. package/dist/{model-DEQo3FkZ.js.map → model-DaVCY3rb.js.map} +1 -1
  111. package/dist/{model-BOnlAPzs.js → model-DaX4bNLZ.js} +123 -22
  112. package/dist/model-DaX4bNLZ.js.map +1 -0
  113. package/dist/model-_bxNrk2h.js +1 -0
  114. package/dist/{node-Co7EXge0.js → node-B3ydHo6t.js} +10 -47
  115. package/dist/node-B3ydHo6t.js.map +1 -0
  116. package/dist/object-CLf2-tNq.js +9 -0
  117. package/dist/object-CLf2-tNq.js.map +1 -0
  118. package/dist/{opencode-providers-ByD85Q0l.js → opencode-providers-J9colP0-.js} +96 -21
  119. package/dist/opencode-providers-J9colP0-.js.map +1 -0
  120. package/dist/options-C0d0AzeR.js +1118 -0
  121. package/dist/options-C0d0AzeR.js.map +1 -0
  122. package/dist/{pairs-DDsjgm5F.js → pairs-CnInRu-G.js} +76 -2
  123. package/dist/{pairs-DDsjgm5F.js.map → pairs-CnInRu-G.js.map} +1 -1
  124. package/dist/{patch-bDV8YFW0.js → patch-B1bnfhN-.js} +6 -6
  125. package/dist/{patch-bDV8YFW0.js.map → patch-B1bnfhN-.js.map} +1 -1
  126. package/dist/{plan-DUydFc_1.js → plan-DgQxp9yy.js} +34 -13
  127. package/dist/plan-DgQxp9yy.js.map +1 -0
  128. package/dist/{preflight-BkoSxf4C.js → preflight-BRzD30L5.js} +8 -7
  129. package/dist/preflight-BRzD30L5.js.map +1 -0
  130. package/dist/preflight-DlQvbySb.js +1 -0
  131. package/dist/{prepare-CUAWHebF.js → prepare-B_y-AFMv.js} +38 -30
  132. package/dist/prepare-B_y-AFMv.js.map +1 -0
  133. package/dist/prepare-DCKTLHN3.js +2 -0
  134. package/dist/{provenance-D7HK3vzt.js → provenance-DQ0AXn6c.js} +5 -5
  135. package/dist/{provenance-D7HK3vzt.js.map → provenance-DQ0AXn6c.js.map} +1 -1
  136. package/dist/provider-DehR4CMN.js +1 -0
  137. package/dist/providers-B9yTdIqF.js +1 -0
  138. package/dist/providers-DoTq1jHW.js +165 -0
  139. package/dist/providers-DoTq1jHW.js.map +1 -0
  140. package/dist/query-BO-ux7RB.js +139 -0
  141. package/dist/query-BO-ux7RB.js.map +1 -0
  142. package/dist/query-CRQfsw0e.js +1 -0
  143. package/dist/questions-C2dym2ce.js +524 -0
  144. package/dist/questions-C2dym2ce.js.map +1 -0
  145. package/dist/{record-BRP9vZrj.js → record-BKmMvZ6O.js} +9 -1
  146. package/dist/{record-BRP9vZrj.js.map → record-BKmMvZ6O.js.map} +1 -1
  147. package/dist/remote-CPPW86Q9.js +378 -0
  148. package/dist/remote-CPPW86Q9.js.map +1 -0
  149. package/dist/{results-Di7m8dQ3.js → results-BE2f-1XS.js} +6 -5
  150. package/dist/results-BE2f-1XS.js.map +1 -0
  151. package/dist/{resume-SUz1GskV.js → resume-Ca1c8vix.js} +10 -10
  152. package/dist/{resume-SUz1GskV.js.map → resume-Ca1c8vix.js.map} +1 -1
  153. package/dist/{root-CvdRlRZX.js → root-DICDHCtp.js} +4 -4
  154. package/dist/{root-CvdRlRZX.js.map → root-DICDHCtp.js.map} +1 -1
  155. package/dist/{runtime-DdsfnRz_.js → runtime-PX_oXiCS.js} +23 -71
  156. package/dist/runtime-PX_oXiCS.js.map +1 -0
  157. package/dist/sandbox-DLrsvu7U.js +70 -0
  158. package/dist/sandbox-DLrsvu7U.js.map +1 -0
  159. package/dist/sandbox.d.ts +19 -6
  160. package/dist/sandbox.js +1 -2
  161. package/dist/server-Dp8eOeK5.js +1 -0
  162. package/dist/{server-BNnXtmS8.js → server-TUY5xA_A.js} +11 -11
  163. package/dist/server-TUY5xA_A.js.map +1 -0
  164. package/dist/shared-CA61BuPJ.js +188 -0
  165. package/dist/shared-CA61BuPJ.js.map +1 -0
  166. package/dist/{source-Dof0NQBm.js → source-DJGS0a0u.js} +2 -2
  167. package/dist/{source-Dof0NQBm.js.map → source-DJGS0a0u.js.map} +1 -1
  168. package/dist/source-DdbLGR1M.js +1 -0
  169. package/dist/src-BxfCKA3_.js +2 -0
  170. package/dist/{src-C1E9HDWO.js → src-C7_1SqDP.js} +3 -3
  171. package/dist/{src-C1E9HDWO.js.map → src-C7_1SqDP.js.map} +1 -1
  172. package/dist/{src-DDNXsD9H.js → src-CF17Ug08.js} +5 -4
  173. package/dist/src-CF17Ug08.js.map +1 -0
  174. package/dist/{src-C_4Umgh2.js → src-CFp86GtV.js} +52 -51
  175. package/dist/src-CFp86GtV.js.map +1 -0
  176. package/dist/src-CLoOMVWI.js +3 -0
  177. package/dist/src-CcrQbpG8.js +2 -0
  178. package/dist/src-DCFtJRp0.js +2 -0
  179. package/dist/src-DIL0jST0.js +368 -0
  180. package/dist/src-DIL0jST0.js.map +1 -0
  181. package/dist/src-DSYYPEOj.js +2 -0
  182. package/dist/src-DYO3DdnQ.js +1 -0
  183. package/dist/src-DvCg0NBs.js +324 -0
  184. package/dist/src-DvCg0NBs.js.map +1 -0
  185. package/dist/{src-COgE7991.js → src-DvK0EIZx.js} +5 -5
  186. package/dist/{src-COgE7991.js.map → src-DvK0EIZx.js.map} +1 -1
  187. package/dist/{src-DVy58-zZ.js → src-FGXhkEkH.js} +5 -5
  188. package/dist/{src-DVy58-zZ.js.map → src-FGXhkEkH.js.map} +1 -1
  189. package/dist/src-WD-zgQYZ.js +2 -0
  190. package/dist/src-_oI9AePb.js +2 -0
  191. package/dist/{src-8rRXy4u9.js → src-ftu5wPSt.js} +1652 -182
  192. package/dist/src-ftu5wPSt.js.map +1 -0
  193. package/dist/src-qsKCqv7a.js +2 -0
  194. package/dist/{src-D95O-Smv.js → src-u8_ixn_F.js} +15 -11
  195. package/dist/src-u8_ixn_F.js.map +1 -0
  196. package/dist/state-CeR6oz0k.js +66 -0
  197. package/dist/state-CeR6oz0k.js.map +1 -0
  198. package/dist/{state-CiXyLqg0.js → state-DfpHox6b.js} +36 -24
  199. package/dist/state-DfpHox6b.js.map +1 -0
  200. package/dist/state-DpAxYyED.js +1 -0
  201. package/dist/studio-app/assets/index-CBkhNAv8.js +58 -0
  202. package/dist/studio-app/assets/index-CwQN3f_h.css +2 -0
  203. package/dist/studio-app/index.html +2 -2
  204. package/dist/suite-Cw_7G2RM.js +429 -0
  205. package/dist/suite-Cw_7G2RM.js.map +1 -0
  206. package/dist/suite-DamAEnNF.js +1 -0
  207. package/dist/summary-BUKfU-9l.js +611 -0
  208. package/dist/summary-BUKfU-9l.js.map +1 -0
  209. package/dist/{summary-2OAWF2N7.js → summary-Baa4rTHS.js} +7 -7
  210. package/dist/{summary-2OAWF2N7.js.map → summary-Baa4rTHS.js.map} +1 -1
  211. package/dist/testing.d.ts +3 -2
  212. package/dist/testing.js +3 -2
  213. package/dist/{tool-target-BU1JnSE9.js → tool-target-D2mcYlSQ.js} +14 -7
  214. package/dist/tool-target-D2mcYlSQ.js.map +1 -0
  215. package/dist/{tools-B10Uj7OI.js → tools-DLHgetpx.js} +6 -6
  216. package/dist/tools-DLHgetpx.js.map +1 -0
  217. package/dist/transcript-BNNANU8A.js +64 -0
  218. package/dist/transcript-BNNANU8A.js.map +1 -0
  219. package/dist/{types-D8RLfkFP.d.ts → types-BYdlwMwo.d.ts} +398 -46
  220. package/dist/{usage-DDF_6tkV.js → usage-CleNKkly.js} +4 -2
  221. package/dist/{usage-DDF_6tkV.js.map → usage-CleNKkly.js.map} +1 -1
  222. package/dist/view/index.d.ts +290 -8
  223. package/dist/view/index.js +7 -7
  224. package/dist/{views-Dqa5ojfZ.js → views-B8w2J-gD.js} +19 -24
  225. package/dist/views-B8w2J-gD.js.map +1 -0
  226. package/dist/views-DblnI3kA.js +2 -0
  227. package/dist/{worker-entry-BAikHl9F.js → worker-entry-DNnveLqx.js} +16 -229
  228. package/dist/worker-entry-DNnveLqx.js.map +1 -0
  229. package/dist/{workspace-C-TrNIUc.js → workspace-C4RA3srV.js} +7 -7
  230. package/dist/{workspace-C-TrNIUc.js.map → workspace-C4RA3srV.js.map} +1 -1
  231. package/dist/workspace-C_X0tdv6.js +1 -0
  232. package/package.json +12 -12
  233. package/dist/agent-WSmTaesf.js.map +0 -1
  234. package/dist/assemble-BCZzTyR7.js.map +0 -1
  235. package/dist/assemble-C5qq5yT2.js +0 -2
  236. package/dist/capture-Bp74Z6Fr.js.map +0 -1
  237. package/dist/capture-DS-cPyuE.js +0 -2
  238. package/dist/cli-CVrMh_qz.js.map +0 -1
  239. package/dist/cli-spec-CKEYa8V2.js.map +0 -1
  240. package/dist/client-Bbo9SPlK.js.map +0 -1
  241. package/dist/command-BrmXUC-W.js +0 -2
  242. package/dist/command-C5xFPKHM.js.map +0 -1
  243. package/dist/command-CzIFp1JQ.js.map +0 -1
  244. package/dist/command-DUT5l13I.js.map +0 -1
  245. package/dist/commands-CLmPBrTS.js.map +0 -1
  246. package/dist/commands-fI3G2Wnh.js +0 -2
  247. package/dist/config-CGvBeewH.js +0 -457
  248. package/dist/config-CGvBeewH.js.map +0 -1
  249. package/dist/context-DbSMEVKs.js.map +0 -1
  250. package/dist/db-CSSFtGcN.js +0 -3
  251. package/dist/db-CfQFwJtq.js.map +0 -1
  252. package/dist/debug-SEmW4w8f.js +0 -2
  253. package/dist/dist-CTzThfu_.js.map +0 -1
  254. package/dist/docker-CRQGQbIt.js.map +0 -1
  255. package/dist/docker-DV2GNgle.js.map +0 -1
  256. package/dist/docker-Df_YOxxB.js +0 -2
  257. package/dist/doctor-DlKycx5H.js.map +0 -1
  258. package/dist/duration-JsJrIWXq.js +0 -26
  259. package/dist/duration-JsJrIWXq.js.map +0 -1
  260. package/dist/egress-BhzNh7Yi.js.map +0 -1
  261. package/dist/env-BQqj93gu.js +0 -21
  262. package/dist/env-BQqj93gu.js.map +0 -1
  263. package/dist/environment-1jE-HhO-.js +0 -657
  264. package/dist/environment-1jE-HhO-.js.map +0 -1
  265. package/dist/errors-C9w_ud7g.js.map +0 -1
  266. package/dist/errors-yDAEwmZo.js.map +0 -1
  267. package/dist/fake-instructions-CUI33I_F.js +0 -32
  268. package/dist/fake-instructions-CUI33I_F.js.map +0 -1
  269. package/dist/family-D2b7WD10.js +0 -67
  270. package/dist/family-D2b7WD10.js.map +0 -1
  271. package/dist/files-AiEKuEZe.js +0 -2
  272. package/dist/files-BM78_nnF.js +0 -2
  273. package/dist/files-BMCvfB4X.js +0 -2
  274. package/dist/harness-CeCp2GSW.js +0 -171
  275. package/dist/harness-CeCp2GSW.js.map +0 -1
  276. package/dist/images-BMgdpMAX.js.map +0 -1
  277. package/dist/index.js.map +0 -1
  278. package/dist/init-B6vegaP_.js +0 -2
  279. package/dist/init-BIdLF0F9.js.map +0 -1
  280. package/dist/jiti-BcJHCtrb.js +0 -46
  281. package/dist/jiti-BcJHCtrb.js.map +0 -1
  282. package/dist/live-S0qODb6o.js.map +0 -1
  283. package/dist/model-B1BZoZ9b.js.map +0 -1
  284. package/dist/model-BOnlAPzs.js.map +0 -1
  285. package/dist/model-DWeg5J7z.js +0 -2
  286. package/dist/model-FXko2kl7.js +0 -2
  287. package/dist/node-Co7EXge0.js.map +0 -1
  288. package/dist/opencode-providers-ByD85Q0l.js.map +0 -1
  289. package/dist/options-CKqyPGxX.js +0 -739
  290. package/dist/options-CKqyPGxX.js.map +0 -1
  291. package/dist/plan-DUydFc_1.js.map +0 -1
  292. package/dist/preflight-BkoSxf4C.js.map +0 -1
  293. package/dist/preflight-D5LW7Oqi.js +0 -2
  294. package/dist/prepare-CUAWHebF.js.map +0 -1
  295. package/dist/prepare-oji2oO8W.js +0 -3
  296. package/dist/process-CSVO_jsc.js +0 -119
  297. package/dist/process-CSVO_jsc.js.map +0 -1
  298. package/dist/provider-BDbNOQhQ.js +0 -2
  299. package/dist/providers-B1DzMvmH.js +0 -107
  300. package/dist/providers-B1DzMvmH.js.map +0 -1
  301. package/dist/providers-CpEfNU1F.js +0 -2
  302. package/dist/query-BjBMLa-C.js +0 -91
  303. package/dist/query-BjBMLa-C.js.map +0 -1
  304. package/dist/query-oPO_XrTy.js +0 -2
  305. package/dist/questions-B8by4Bbt.js +0 -234
  306. package/dist/questions-B8by4Bbt.js.map +0 -1
  307. package/dist/results-Di7m8dQ3.js.map +0 -1
  308. package/dist/runtime-DdsfnRz_.js.map +0 -1
  309. package/dist/sandbox-D5v-of6d.js +0 -139
  310. package/dist/sandbox-D5v-of6d.js.map +0 -1
  311. package/dist/server-BNnXtmS8.js.map +0 -1
  312. package/dist/server-BNwoKzlm.js +0 -2
  313. package/dist/source-Bk_0ZaEY.js +0 -2
  314. package/dist/src-8rRXy4u9.js.map +0 -1
  315. package/dist/src-BGWuWp6I.js +0 -3
  316. package/dist/src-BRt0O02i.js +0 -3
  317. package/dist/src-Bx2x1ekD.js +0 -3
  318. package/dist/src-C_4Umgh2.js.map +0 -1
  319. package/dist/src-D95O-Smv.js.map +0 -1
  320. package/dist/src-DDNXsD9H.js.map +0 -1
  321. package/dist/src-DLa-ESW0.js +0 -4
  322. package/dist/src-cN0aB-WR.js +0 -3
  323. package/dist/src-cdIVjC5b.js +0 -2
  324. package/dist/src-sIsDHWYq.js +0 -3
  325. package/dist/state-Bo5zg4da.js +0 -2
  326. package/dist/state-CiXyLqg0.js.map +0 -1
  327. package/dist/studio-app/assets/index-B9MCTfuu.css +0 -2
  328. package/dist/studio-app/assets/index-CROH2NB3.js +0 -58
  329. package/dist/summary-BTksrIxn.js +0 -254
  330. package/dist/summary-BTksrIxn.js.map +0 -1
  331. package/dist/tool-target-BU1JnSE9.js.map +0 -1
  332. package/dist/tools-B10Uj7OI.js.map +0 -1
  333. package/dist/views-Cs2Oqayd.js +0 -3
  334. package/dist/views-Dqa5ojfZ.js.map +0 -1
  335. package/dist/worker-entry-BAikHl9F.js.map +0 -1
  336. package/dist/workspace-Do_SiWBs.js +0 -2
@@ -1,13 +1,224 @@
1
- import { n as toolTarget } from "./tool-target-BU1JnSE9.js";
2
- import { n as UsageError } from "./errors-yDAEwmZo.js";
3
- import { d as ownRequire, t as BUILD_ID } from "./root-CvdRlRZX.js";
1
+ import { n as toolTarget, t as SKILL_LOAD_TOOLS } from "./tool-target-D2mcYlSQ.js";
2
+ import { n as UsageError } from "./errors-B6BSMs03.js";
4
3
  import { t as RUN_ID } from "./paths-BmR-7tx3.js";
5
4
  import { c as relativeFile, l as sha256 } from "./ids-Bp6ut7ZD.js";
6
- import { n as isRuntimeState } from "./context-DbSMEVKs.js";
7
- import { G as contrastEffort, J as effortOf, lt as wilson, nt as liftInterval, st as round3 } from "./model-BOnlAPzs.js";
8
- import { m as warnUnreadable, p as scratchDir, s as readRecord, u as recordNames } from "./files-CSzVADHn.js";
5
+ import { d as ownRequire, t as BUILD_ID } from "./root-DICDHCtp.js";
6
+ import { n as isRuntimeState } from "./context-C1mxXh80.js";
7
+ import { $ as contrastEffort, dt as liftInterval, gt as round3, mt as median, rt as effortOf, vt as wilson } from "./model-DaX4bNLZ.js";
8
+ import { r as pairTallies } from "./pairs-CnInRu-G.js";
9
+ import { m as warnUnreadable, p as scratchDir, s as readRecord, u as recordNames } from "./files-BpUYBwGu.js";
10
+ import { n as contrastPairs, t as checkVerdict } from "./contrasts-5zsj32gk.js";
9
11
  import { dirname, join } from "node:path";
10
12
  import { mkdir, readFile, stat } from "node:fs/promises";
13
+ //#region src/history/rows.ts
14
+ /** A statement's rows as `Row`, the columns its SQL selects: SQLite checks none of them. */
15
+ const rowsOf = (statement, ...params) => statement.all(...params);
16
+ //#endregion
17
+ //#region src/history/tool-class.ts
18
+ const TOOL_CLASSES = [
19
+ "context",
20
+ "dependency",
21
+ "web",
22
+ "verify",
23
+ "workspace"
24
+ ];
25
+ const SHELL_TOOL = /shell|bash|terminal|command|exec/i;
26
+ const WEB_TOOL = /web|fetch|browse|url/i;
27
+ const DEPENDENCY = /(^|\/)(node_modules|site-packages|dist-packages|vendor|\.venv|\.cargo\/registry|go\/pkg\/mod)(\/|$)/;
28
+ const VERIFY = /\b(?:(?:npm|pnpm|yarn|bun)\s+(?:run\s+)?(?:test|build|lint|typecheck|check)|npx\s+(?:tsc|vitest|jest|eslint|biome)|tsc|vitest|jest|pytest|eslint|cargo\s+(?:test|build|check)|go\s+(?:test|build|vet))\b/;
29
+ /** Words of a shell command, quotes removed; `;`, `|` and `&&` split words. */
30
+ function shellWords(command) {
31
+ const words = [];
32
+ let word = "";
33
+ let quote = null;
34
+ let started = false;
35
+ const flush = () => {
36
+ if (started) words.push(word);
37
+ word = "";
38
+ started = false;
39
+ };
40
+ for (const ch of command) {
41
+ if (quote) {
42
+ if (ch === quote) quote = null;
43
+ else word += ch;
44
+ continue;
45
+ }
46
+ if (ch === "\"" || ch === "'") {
47
+ quote = ch;
48
+ started = true;
49
+ } else if (/\s/.test(ch)) flush();
50
+ else if (ch === ";" || ch === "|" || ch === "&") {
51
+ flush();
52
+ words.push(ch);
53
+ } else {
54
+ word += ch;
55
+ started = true;
56
+ }
57
+ }
58
+ flush();
59
+ return words;
60
+ }
61
+ /** A command's words, with a `bash -c '…'` (or `-lc`) script split into its own words. */
62
+ function commandWords(command) {
63
+ const words = shellWords(command);
64
+ return words.flatMap((w, i) => i > 0 && /^-[a-z]*c$/.test(words[i - 1]) && /\s/.test(w) ? commandWords(w) : [w]);
65
+ }
66
+ const EXCLUDING_FLAG = /^--(?:exclude|exclude-dir|ignore|ignore-dir)(?:=|$)/;
67
+ /** The words of a command that name something it reads, without the ones it excludes. */
68
+ function readWords(words) {
69
+ const out = [];
70
+ let test = false;
71
+ for (let i = 0; i < words.length; i++) {
72
+ const w = words[i];
73
+ const prev = words[i - 1];
74
+ if (w === "[" || w === "[[" || w === "test") test = true;
75
+ else if (w === "]" || w === "]]" || w === ";" || w === "|" || w === "&") test = false;
76
+ if (test && /^-[defsrwx]$/.test(w)) {
77
+ i++;
78
+ continue;
79
+ }
80
+ if (EXCLUDING_FLAG.test(w)) {
81
+ if (!w.includes("=")) i++;
82
+ continue;
83
+ }
84
+ if ((w === "-path" || w === "-name" || w === "-ipath" || w === "-wholename") && i + 1 < words.length) {
85
+ const pruned = words[i + 2] === "-prune";
86
+ if (prev === "-not" || prev === "!" || pruned) {
87
+ i++;
88
+ continue;
89
+ }
90
+ }
91
+ if ((w === "-g" || w === "--glob" || w === "--iglob") && words[i + 1]?.startsWith("!")) {
92
+ i++;
93
+ continue;
94
+ }
95
+ if (/^--i?glob=!/.test(w)) continue;
96
+ if (w === "-v" && i > 0) {
97
+ i++;
98
+ continue;
99
+ }
100
+ out.push(w);
101
+ }
102
+ return out;
103
+ }
104
+ /** `/home/<user>/x` and `/root/x` as `~/x`; `./x` as `x`. */
105
+ const normalise = (p) => p.replace(/^\/home\/[^/]+\//, "~/").replace(/^\/root\//, "~/").replace(/^\$HOME\//, "~/").replace(/^\.\//, "");
106
+ const GLOB = /[*?[{]/;
107
+ /** `*`, `**` and `?` as wildcards; every other character, `[` included, literally. */
108
+ function wildcards(glob) {
109
+ let re = "";
110
+ for (let i = 0; i < glob.length; i++) {
111
+ const ch = glob[i];
112
+ if (ch === "*") {
113
+ if (glob[i + 1] === "*") {
114
+ re += ".*";
115
+ i++;
116
+ } else re += "[^/]*";
117
+ } else if (ch === "?") re += "[^/]";
118
+ else re += ch.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
119
+ }
120
+ return re;
121
+ }
122
+ /** A glob as a regex, with `{a,b}` alternatives. Words come from transcripts, so it never throws. */
123
+ function globRegex(glob) {
124
+ let re = "";
125
+ let from = 0;
126
+ for (let i = 0; i < glob.length; i++) {
127
+ if (glob[i] !== "{") continue;
128
+ const end = glob.indexOf("}", i);
129
+ if (end < 0) break;
130
+ re += wildcards(glob.slice(from, i));
131
+ re += `(?:${glob.slice(i + 1, end).split(",").map(wildcards).join("|")})`;
132
+ from = end + 1;
133
+ i = end;
134
+ }
135
+ return new RegExp(`^${re}${wildcards(glob.slice(from))}$`);
136
+ }
137
+ /** The declared files one word names: the file itself, one of a glob's matches, or a directory's. */
138
+ function filesOf(word, files) {
139
+ const w = normalise(word).replace(/\/+$/, "");
140
+ if (!w) return {
141
+ files: [],
142
+ dir: false
143
+ };
144
+ const forms = (f) => f.startsWith("~/") ? [f, f.slice(2)] : [f];
145
+ const matches = (f, test) => forms(f).some((form) => test(form) || !w.startsWith("~/") && test(`~/${form}`));
146
+ if (GLOB.test(w)) {
147
+ const re = globRegex(w);
148
+ const fromWorkspace = /^[*?[{]/.test(w);
149
+ return {
150
+ files: files.filter((f) => fromWorkspace ? !f.startsWith("~/") && re.test(f) : matches(f, (form) => re.test(form))),
151
+ dir: false
152
+ };
153
+ }
154
+ const exact = files.filter((f) => matches(f, (form) => form === w || form.endsWith(`/${w}`)));
155
+ if (exact.length) return {
156
+ files: exact,
157
+ dir: false
158
+ };
159
+ return {
160
+ files: [],
161
+ dir: files.filter((f) => matches(f, (form) => form.startsWith(`${w}/`))).length > 0
162
+ };
163
+ }
164
+ /** A tool call's class, and the declared files it read (for `skill_files`). */
165
+ function classifyCall(tool, target, ctx) {
166
+ if (SKILL_LOAD_TOOLS.has(tool)) {
167
+ if (!ctx.skills.includes(target)) return {
168
+ class: "workspace",
169
+ files: []
170
+ };
171
+ return {
172
+ class: "context",
173
+ files: ctx.files.filter((f) => f.endsWith(`skills/${target}/SKILL.md`))
174
+ };
175
+ }
176
+ if (ctx.mcp.some((s) => tool.startsWith(`mcp__${s}__`) || tool.startsWith(`${s}__`))) return {
177
+ class: "context",
178
+ files: []
179
+ };
180
+ const shell = SHELL_TOOL.test(tool);
181
+ const words = shell ? readWords(commandWords(target)) : [target];
182
+ const files = /* @__PURE__ */ new Set();
183
+ let context = false;
184
+ for (const w of words) {
185
+ const hit = filesOf(w, ctx.files);
186
+ for (const f of hit.files) files.add(f);
187
+ if (hit.files.length || hit.dir) context = true;
188
+ if (ctx.skills.some((s) => normalise(w).includes(`skills/${s}/`) || normalise(w).endsWith(`skills/${s}`))) context = true;
189
+ }
190
+ if (context) return {
191
+ class: "context",
192
+ files: [...files]
193
+ };
194
+ if (words.some((w) => DEPENDENCY.test(normalise(w))) || shell && words.includes("--help")) return {
195
+ class: "dependency",
196
+ files: []
197
+ };
198
+ if (!shell && WEB_TOOL.test(tool)) return {
199
+ class: "web",
200
+ files: []
201
+ };
202
+ if (shell && words.some((w) => w === "curl" || w === "wget") && /https?:\/\//.test(target)) return {
203
+ class: "web",
204
+ files: []
205
+ };
206
+ if (shell) {
207
+ const command = target.trim();
208
+ if (ctx.verify.some((v) => v.trim().length >= 4 && command.includes(v.trim()))) return {
209
+ class: "verify",
210
+ files: []
211
+ };
212
+ if (VERIFY.test(command)) return {
213
+ class: "verify",
214
+ files: []
215
+ };
216
+ }
217
+ return {
218
+ class: "workspace",
219
+ files: []
220
+ };
221
+ }
11
222
  /** A failing verdict this close to its threshold points at the judge, not the agent. */
12
223
  const JUDGE_MARGIN = .1;
13
224
  const DERIVED_TABLES = `
@@ -20,7 +231,19 @@ CREATE TABLE effort_m (
20
231
  control_tokens_median REAL,
21
232
  tools_ratio REAL, agent_s_ratio REAL, agent_s_delta REAL, tokens_ratio REAL,
22
233
  tools_p REAL, agent_s_p REAL, tokens_p REAL,
23
- separated INTEGER, verdict TEXT, time_verdict TEXT, tokens_verdict TEXT, tokens_note TEXT
234
+ separated INTEGER, time_separated INTEGER, tokens_separated INTEGER,
235
+ verdict TEXT, time_verdict TEXT, tokens_verdict TEXT, tokens_note TEXT,
236
+ context_calls_median REAL, dependency_calls_median REAL, web_calls_median REAL,
237
+ verify_calls_median REAL, workspace_calls_median REAL
238
+ );
239
+ CREATE TABLE contrasts_m (
240
+ run_id TEXT, eval_key TEXT, harness TEXT, sandbox TEXT, a_key TEXT, b_key TEXT,
241
+ a_environment TEXT, b_environment TEXT, a_pass INTEGER, a_counted INTEGER, b_pass INTEGER,
242
+ b_counted INTEGER, points REAL, lo REAL, hi REAL, pass_verdict TEXT,
243
+ a_tools_median REAL, b_tools_median REAL, tools_ratio REAL, tools_p REAL, separated INTEGER,
244
+ verdict TEXT, agent_s_ratio REAL, time_separated INTEGER, time_verdict TEXT,
245
+ tokens_ratio REAL, tokens_separated INTEGER, tokens_verdict TEXT,
246
+ checks INTEGER, discriminating TEXT
24
247
  );
25
248
  CREATE TABLE factor_effects_m (
26
249
  factor TEXT, level TEXT, baseline TEXT, context TEXT, tier TEXT, run_id TEXT, eval_key TEXT,
@@ -62,6 +285,7 @@ const FAMILY_COLUMNS = [
62
285
  ];
63
286
  const DERIVED = [
64
287
  "effort_m",
288
+ "contrasts_m",
65
289
  "factor_effects_m",
66
290
  "flaky_m",
67
291
  "drift_m"
@@ -177,18 +401,19 @@ const merge = (sides) => ({
177
401
  });
178
402
  function insertAll(db, table, rows) {
179
403
  if (rows.length === 0) return;
180
- const cols = db.prepare(`PRAGMA table_info("${table}")`).all().map((c) => c.name);
404
+ const cols = rowsOf(db.prepare(`PRAGMA table_info("${table}")`)).map((c) => c.name);
181
405
  const statement = db.prepare(`INSERT INTO ${table} (${cols.join(", ")}) VALUES (${cols.map(() => "?").join(", ")})`);
182
406
  for (const row of rows) statement.run(...cols.map((c) => row[c] ?? null));
183
407
  }
184
408
  /** Recomputes every derived table from the projected rows; run inside the sync's transaction. */
185
409
  function deriveFacts(db) {
186
410
  for (const table of DERIVED) db.exec(`DELETE FROM ${table}`);
187
- const cells = db.prepare("SELECT c.*, r.started_at FROM cells c JOIN runs r USING (run_id) ORDER BY c.run_id, c.rowid").all();
188
- const attempts = db.prepare(`SELECT run_id, eval_key, cell_key, key, outcome, error_kind, tools, agent_ms, file_edits,
411
+ const cells = rowsOf(db.prepare("SELECT c.*, r.started_at FROM cells c JOIN runs r USING (run_id) ORDER BY c.run_id, c.rowid"));
412
+ const attempts = rowsOf(db.prepare(`SELECT run_id, eval_key, cell_key, key, outcome, error_kind, tools, agent_ms, file_edits,
189
413
  input_tokens, output_tokens, cache_read_tokens, cache_write_tokens, reasoning_tokens
190
- FROM attempts ORDER BY run_id, rowid`).all();
191
- const nearThreshold = new Set(db.prepare(`SELECT DISTINCT run_id, attempt_key FROM judgements WHERE verdict = 'fail' AND ABS(score - threshold) <= ${JUDGE_MARGIN}`).all().map((r) => `${r.run_id}\0${r.attempt_key}`));
414
+ FROM attempts ORDER BY run_id, rowid`));
415
+ const nearThreshold = new Set(rowsOf(db.prepare(`SELECT DISTINCT run_id, attempt_key FROM judgements WHERE verdict = 'fail' AND ABS(score - threshold) <= ${JUDGE_MARGIN}`)).map((r) => `${r.run_id}\0${r.attempt_key}`));
416
+ const diffs = new Map(rowsOf(db.prepare(`SELECT run_id, attempt_key, sha256 FROM artifacts WHERE kind = 'diff' AND bytes > 0`)).flatMap((r) => r.sha256 ? [[`${r.run_id}\0${r.attempt_key}`, r.sha256]] : []));
192
417
  const samples = /* @__PURE__ */ new Map();
193
418
  const byCell = /* @__PURE__ */ new Map();
194
419
  for (const a of attempts) {
@@ -209,6 +434,20 @@ function deriveFacts(db) {
209
434
  samples: samples.get(cellId(c.run_id, c.eval_key, c.key)) ?? []
210
435
  });
211
436
  const find = (run, evalKey, key) => cells.find((c) => c.run_id === run && c.eval_key === evalKey && c.key === key);
437
+ const classCounts = /* @__PURE__ */ new Map();
438
+ for (const r of rowsOf(db.prepare("SELECT run_id, attempt_key, class, COUNT(*) AS n FROM tool_calls GROUP BY run_id, attempt_key, class"))) {
439
+ const id = `${r.run_id}\0${r.attempt_key}`;
440
+ const m = classCounts.get(id) ?? /* @__PURE__ */ new Map();
441
+ m.set(r.class, r.n);
442
+ classCounts.set(id, m);
443
+ }
444
+ const classMedians = (c) => {
445
+ const known = (byCell.get(cellId(c.run_id, c.eval_key, c.key)) ?? []).filter((a) => a.outcome === "pass" || a.outcome === "fail").flatMap((a) => {
446
+ const m = classCounts.get(`${a.run_id}\0${a.key}`);
447
+ return m ? [m] : [];
448
+ });
449
+ return Object.fromEntries(TOOL_CLASSES.map((k) => [`${k}_calls_median`, known.length ? median(known.map((m) => m.get(k) ?? 0)) ?? null : null]));
450
+ };
212
451
  insertAll(db, "effort_m", cells.map((c) => {
213
452
  const own = effortOf(side(c).samples);
214
453
  const control = c.lift_vs ? find(c.run_id, c.eval_key, c.lift_vs) : void 0;
@@ -245,12 +484,83 @@ function deriveFacts(db) {
245
484
  agent_s_p: r4(vs?.agentMsP ?? null),
246
485
  tokens_p: r4(vs?.tokensP ?? null),
247
486
  separated: vs ? vs.separated ? 1 : 0 : null,
487
+ time_separated: vs ? vs.timeSeparated ? 1 : 0 : null,
488
+ tokens_separated: vs?.tokensSeparated == null ? null : vs.tokensSeparated ? 1 : 0,
248
489
  verdict: vs?.verdict ?? null,
249
490
  time_verdict: vs?.timeVerdict ?? null,
250
491
  tokens_verdict: vs?.tokensVerdict ?? null,
251
- tokens_note: vs?.tokensNote ?? null
492
+ tokens_note: vs?.tokensNote ?? null,
493
+ ...classMedians(c)
252
494
  };
253
495
  }));
496
+ const checkRows = rowsOf(db.prepare("SELECT run_id, eval_key, cell_key, label, pass, fail, error, not_run FROM cell_checks"));
497
+ const checksOf = /* @__PURE__ */ new Map();
498
+ for (const k of checkRows) {
499
+ const id = cellId(k.run_id, k.eval_key, k.cell_key);
500
+ const m = checksOf.get(id) ?? /* @__PURE__ */ new Map();
501
+ m.set(k.label, {
502
+ pass: k.pass,
503
+ fail: k.fail,
504
+ error: k.error,
505
+ notRun: k.not_run
506
+ });
507
+ checksOf.set(id, m);
508
+ }
509
+ const evalCells = /* @__PURE__ */ new Map();
510
+ for (const c of cells) {
511
+ const id = `${c.run_id}\0${c.eval_key}`;
512
+ evalCells.set(id, [...evalCells.get(id) ?? [], c]);
513
+ }
514
+ const contrastRows = [];
515
+ for (const group of evalCells.values()) for (const [a, b] of contrastPairs(group)) {
516
+ const x = side(a);
517
+ const y = side(b);
518
+ const e = contrastEffort(x.samples, y.samples);
519
+ const ka = checksOf.get(cellId(a.run_id, a.eval_key, a.key)) ?? /* @__PURE__ */ new Map();
520
+ const kb = checksOf.get(cellId(b.run_id, b.eval_key, b.key)) ?? /* @__PURE__ */ new Map();
521
+ const verdicts = [...ka].flatMap(([label, t]) => {
522
+ const other = kb.get(label);
523
+ const verdict = other && checkVerdict(t, other);
524
+ return verdict ? [{
525
+ label,
526
+ verdict
527
+ }] : [];
528
+ });
529
+ const pass = passCols(x, y);
530
+ contrastRows.push({
531
+ run_id: a.run_id,
532
+ eval_key: a.eval_key,
533
+ harness: a.harness,
534
+ sandbox: a.sandbox,
535
+ a_key: a.key,
536
+ b_key: b.key,
537
+ a_environment: a.environment,
538
+ b_environment: b.environment,
539
+ a_pass: x.pass,
540
+ a_counted: x.counted,
541
+ b_pass: y.pass,
542
+ b_counted: y.counted,
543
+ points: pass.points ?? null,
544
+ lo: pass.lo ?? null,
545
+ hi: pass.hi ?? null,
546
+ pass_verdict: pass.pass_verdict ?? null,
547
+ a_tools_median: e?.variant.tools.median ?? null,
548
+ b_tools_median: e?.control.tools.median ?? null,
549
+ tools_ratio: r4(e?.toolsRatio ?? null),
550
+ tools_p: r4(e?.toolsP ?? null),
551
+ separated: e ? e.separated ? 1 : 0 : null,
552
+ verdict: e?.verdict ?? null,
553
+ agent_s_ratio: r4(e?.agentMsRatio ?? null),
554
+ time_separated: e ? e.timeSeparated ? 1 : 0 : null,
555
+ time_verdict: e?.timeVerdict ?? null,
556
+ tokens_ratio: r4(e?.tokensRatio ?? null),
557
+ tokens_separated: e?.tokensSeparated == null ? null : e.tokensSeparated ? 1 : 0,
558
+ tokens_verdict: e?.tokensVerdict ?? null,
559
+ checks: verdicts.length,
560
+ discriminating: verdicts.filter((v) => v.verdict === "discriminates").map((v) => v.label).join(" · ") || null
561
+ });
562
+ }
563
+ insertAll(db, "contrasts_m", contrastRows);
254
564
  const pairs = [];
255
565
  const groups = /* @__PURE__ */ new Map();
256
566
  for (const c of cells) {
@@ -380,7 +690,7 @@ function deriveFacts(db) {
380
690
  note: "pass@1: summed counts; effort: an effect in at least 2/3 of strata"
381
691
  });
382
692
  }
383
- const familyLifts = db.prepare(`SELECT ${FAMILY_COLUMNS.join(", ")} FROM family_lift_m`).all();
693
+ const familyLifts = rowsOf(db.prepare(`SELECT ${FAMILY_COLUMNS.join(", ")} FROM family_lift_m`));
384
694
  for (const f of familyLifts) factorRows.push({
385
695
  factor: "environment",
386
696
  level: f.variant,
@@ -414,7 +724,7 @@ function deriveFacts(db) {
414
724
  const contextOf = db.prepare("SELECT path, sha256 FROM attempt_context WHERE run_id = ? AND attempt_key = ?");
415
725
  const cellContext = (c) => {
416
726
  const files = /* @__PURE__ */ new Map();
417
- for (const a of byCell.get(cellId(c.run_id, c.eval_key, c.key)) ?? []) for (const f of contextOf.all(c.run_id, a.key)) files.set(f.path, f.sha256);
727
+ for (const a of byCell.get(cellId(c.run_id, c.eval_key, c.key)) ?? []) for (const f of rowsOf(contextOf, c.run_id, a.key)) files.set(f.path, f.sha256);
418
728
  return files;
419
729
  };
420
730
  for (const list of series.values()) {
@@ -497,7 +807,12 @@ function deriveFacts(db) {
497
807
  const infra = list.reduce((n, c) => n + c.infra_error, 0);
498
808
  const failing = list.flatMap((c) => (byCell.get(cellId(c.run_id, c.eval_key, c.key)) ?? []).filter((a) => a.outcome === "fail"));
499
809
  const w = wilson(pass, pass + fail);
500
- const cause = infra > 0 || failing.some((a) => a.error_kind === "infra") ? "infra" : failing.some((a) => nearThreshold.has(`${a.run_id}\0${a.key}`)) ? "judge" : "agent";
810
+ const passedDiffs = new Set(list.flatMap((c) => (byCell.get(cellId(c.run_id, c.eval_key, c.key)) ?? []).flatMap((a) => {
811
+ const sha = a.outcome === "pass" && diffs.get(`${a.run_id}\0${a.key}`);
812
+ return sha ? [sha] : [];
813
+ })));
814
+ const sameWork = failing.length > 0 && failing.every((a) => a.error_kind === "assertion" && passedDiffs.has(diffs.get(`${a.run_id}\0${a.key}`) ?? ""));
815
+ const cause = infra > 0 || failing.some((a) => a.error_kind === "infra") ? "infra" : failing.some((a) => nearThreshold.has(`${a.run_id}\0${a.key}`)) ? "judge" : sameWork ? "check" : "agent";
501
816
  const starts = list.map((c) => c.started_at).sort();
502
817
  flakyRows.push({
503
818
  eval_key: first.eval_key,
@@ -524,7 +839,7 @@ function deriveFacts(db) {
524
839
  //#endregion
525
840
  //#region src/history/db.ts
526
841
  /** Bump when the tables or views change: a database from another version is rebuilt. */
527
- const DB_VERSION = 9;
842
+ const DB_VERSION = 11;
528
843
  /** This build of reeval, like the header cache: another reeval re-derives every row. */
529
844
  const BUILD = BUILD_ID;
530
845
  const historyDbPath = (root) => join(root, ".reeval", "history.db");
@@ -556,7 +871,7 @@ CREATE TABLE files (run_id TEXT PRIMARY KEY, path TEXT NOT NULL, size INTEGER NO
556
871
  CREATE TABLE runs (
557
872
  run_id TEXT PRIMARY KEY, recorded INTEGER NOT NULL, status TEXT, started_at TEXT, ended_at TEXT,
558
873
  duration_ms INTEGER, author TEXT, git_sha TEXT, branch TEXT, dirty INTEGER, runner TEXT,
559
- ci_provider TEXT, ci_url TEXT, pr_number INTEGER, pr_base TEXT, es TEXT, judge_model TEXT,
874
+ ci_provider TEXT, ci_url TEXT, pr_number INTEGER, pr_base TEXT, reeval TEXT, judge_model TEXT,
560
875
  judge_version TEXT, profile TEXT, evals INTEGER, attempts INTEGER, pass INTEGER, fail INTEGER,
561
876
  not_gated INTEGER, infra_error INTEGER, skipped INTEGER
562
877
  );
@@ -566,17 +881,32 @@ CREATE TABLE evals (
566
881
  case_index INTEGER,
567
882
  PRIMARY KEY (run_id, key)
568
883
  );
569
- -- Each pooled evaluate.each per run: its cases, and each cell's pass rate over them.
884
+ -- Each pooled evaluate.each per run: its cases, and each cell's pass@1 over them (the mean of the
885
+ -- cases' pass@1).
570
886
  CREATE TABLE families (
571
887
  run_id TEXT NOT NULL, family_id TEXT NOT NULL, file TEXT, groups TEXT, name TEXT,
572
888
  cases INTEGER, ran INTEGER, cell_key TEXT NOT NULL, cell_cases INTEGER, pass INTEGER,
573
- counted INTEGER, pass_rate REAL, lo REAL, hi REAL, method TEXT, outcome TEXT,
889
+ counted INTEGER, pass_at_1 REAL, lo REAL, hi REAL, method TEXT, outcome TEXT,
574
890
  PRIMARY KEY (run_id, family_id, cell_key)
575
891
  );
892
+ -- Every compare-question vote: a pair of sides (arms within a harness, harnesses across an arm)
893
+ -- on one run, shown in one order (swapped = 1: b first), and the side picked or 'tie'.
894
+ CREATE TABLE votes (
895
+ run_id TEXT NOT NULL, eval_key TEXT NOT NULL, question TEXT NOT NULL, cut TEXT, held TEXT,
896
+ pair_run INTEGER, a TEXT, b TEXT, winner TEXT, swapped INTEGER, reason TEXT
897
+ );
898
+ -- Each pair of sides' head-to-head per question: a pair decides when both orders agree (or one
899
+ -- ties); a split is a pair whose orders picked opposite sides, split_first those that picked
900
+ -- the side shown first both times.
901
+ CREATE TABLE question_pairs_m (
902
+ run_id TEXT NOT NULL, eval_key TEXT NOT NULL, question TEXT NOT NULL, cut TEXT, held TEXT,
903
+ a TEXT, b TEXT, pairs INTEGER, a_wins INTEGER, b_wins INTEGER, ties INTEGER, splits INTEGER,
904
+ splits_first INTEGER
905
+ );
576
906
  CREATE TABLE family_lift_m (
577
907
  run_id TEXT NOT NULL, family_id TEXT NOT NULL, name TEXT, harness TEXT, variant TEXT,
578
908
  cell_key TEXT, control TEXT,
579
- pairs INTEGER, variant_rate REAL, control_rate REAL, discordant_vc INTEGER,
909
+ pairs INTEGER, variant_pass_at_1 REAL, control_pass_at_1 REAL, discordant_vc INTEGER,
580
910
  discordant_cv INTEGER, points REAL, lo REAL, hi REAL, method TEXT, p REAL,
581
911
  within_noise INTEGER, verdict TEXT, min_lift REAL, outcome TEXT, tools_ratio REAL,
582
912
  tools_p REAL, effort_verdict TEXT, agent_s_ratio REAL, agent_s_p REAL, time_verdict TEXT,
@@ -619,14 +949,21 @@ CREATE TABLE artifacts (
619
949
  run_id TEXT NOT NULL, attempt_key TEXT NOT NULL, kind TEXT NOT NULL, path TEXT NOT NULL,
620
950
  sha256 TEXT, bytes INTEGER
621
951
  );
622
- -- What the agent could see, by content hash; runtime = 1 for an agent CLI's own session state.
952
+ -- What the agent could see, by content hash; runtime = 1 for an agent CLI's own session state,
953
+ -- declared = 1 for a file the environment declared (its skills' files, rules and config).
623
954
  CREATE TABLE attempt_context (
624
- run_id TEXT NOT NULL, attempt_key TEXT NOT NULL, path TEXT NOT NULL, sha256 TEXT, runtime INTEGER
955
+ run_id TEXT NOT NULL, attempt_key TEXT NOT NULL, path TEXT NOT NULL, sha256 TEXT, runtime INTEGER,
956
+ declared INTEGER
625
957
  );
626
- -- Every tool call in each attempt's transcript: its line in transcript.jsonl (from 1) and target.
958
+ -- Every tool call in each attempt's transcript: its line in transcript.jsonl (from 1), target and
959
+ -- class (context, dependency, web, verify or workspace: a heuristic, see tool-class.ts).
627
960
  CREATE TABLE tool_calls (
628
961
  run_id TEXT NOT NULL, attempt_key TEXT NOT NULL, line INTEGER NOT NULL, turn INTEGER,
629
- tool TEXT, target TEXT, ok INTEGER, duration_ms INTEGER
962
+ tool TEXT, target TEXT, ok INTEGER, duration_ms INTEGER, class TEXT
963
+ );
964
+ -- Each placed file a tool call named (directly or through a glob), by the call's line.
965
+ CREATE TABLE context_reads (
966
+ run_id TEXT NOT NULL, attempt_key TEXT NOT NULL, line INTEGER NOT NULL, path TEXT NOT NULL
630
967
  );
631
968
  -- Every expect / expect.soft matcher call each attempt made, in call order (seq from 1).
632
969
  CREATE TABLE assertions (
@@ -645,10 +982,11 @@ CREATE INDEX assertions_by_attempt ON assertions (run_id, attempt_key);
645
982
  CREATE INDEX cells_by_eval ON cells (eval_key, key);
646
983
  CREATE INDEX tool_calls_by_attempt ON tool_calls (run_id, attempt_key);
647
984
  CREATE INDEX context_by_attempt ON attempt_context (run_id, attempt_key);
985
+ CREATE INDEX context_reads_by_attempt ON context_reads (run_id, attempt_key);
648
986
  CREATE INDEX attempts_by_cell ON attempts (run_id, eval_key, cell_key);
649
987
  CREATE INDEX env_skills_by_digest ON env_skills (run_id, digest);
650
988
  `;
651
- /** The canned questions of docs/history-observability-review.md §2, as views to filter. */
989
+ /** Canned questions about the history, as views to filter. */
652
990
  const VIEWS = `
653
991
  -- Variant against control, per harness, per run.
654
992
  CREATE VIEW lift AS
@@ -677,6 +1015,15 @@ CREATE VIEW drift AS SELECT * FROM drift_m;
677
1015
  -- Tool calls, agent time and tokens per cell, and a variant's against its control in the same run.
678
1016
  CREATE VIEW effort AS SELECT * FROM effort_m;
679
1017
 
1018
+ -- Each pair of arms (cells a and b) on one harness and sandbox, when an eval has two variants or
1019
+ -- more: pass@1 lift of a over b, effort with its verdicts and separation, and the checks that
1020
+ -- tell them apart. A variant against its control is here too; gating stays variant vs control.
1021
+ CREATE VIEW contrasts AS SELECT * FROM contrasts_m;
1022
+
1023
+ -- Each compare question's pairs of sides, head to head: wins when both orders agree, and splits
1024
+ -- when the order decided. The pooled win rate counts a split as a win for each side.
1025
+ CREATE VIEW question_pairs AS SELECT * FROM question_pairs_m;
1026
+
680
1027
  -- What a factor (environment, harness, model) did, by evidence tier: controlled (one run),
681
1028
  -- pooled (comparable runs, and across evals), observed (over time), not_measured (one level).
682
1029
  CREATE VIEW factor_effects AS SELECT * FROM factor_effects_m;
@@ -697,6 +1044,34 @@ CREATE VIEW skill_reads AS
697
1044
  JOIN cells c ON c.run_id = a.run_id AND c.eval_key = a.eval_key AND c.key = a.cell_key
698
1045
  JOIN env_skills s ON s.run_id = c.run_id AND s.digest = c.environment_digest;
699
1046
 
1047
+ -- Tool calls per attempt by class: context (a placed skill, rules file or other placed file, a
1048
+ -- skill load, an MCP tool of the environment), dependency (node_modules, site-packages, vendor,
1049
+ -- --help), web, verify (a command the eval's checks run, or test/build/lint/tsc) and workspace.
1050
+ -- A heuristic: shell commands are split into words and exclusions are not counted.
1051
+ CREATE VIEW context_use AS
1052
+ SELECT a.run_id, a.eval_key, a.cell_key, c.environment, a.key AS attempt_key, a.id AS attempt_id,
1053
+ t.class, COUNT(*) AS calls, MIN(t.line) AS first_line,
1054
+ (SELECT x.target FROM tool_calls x WHERE x.run_id = a.run_id AND x.attempt_key = a.key
1055
+ AND x.class = t.class ORDER BY x.line LIMIT 1) AS example
1056
+ FROM tool_calls t
1057
+ JOIN attempts a ON a.run_id = t.run_id AND a.key = t.attempt_key
1058
+ JOIN cells c ON c.run_id = a.run_id AND c.eval_key = a.eval_key AND c.key = a.cell_key
1059
+ GROUP BY a.run_id, a.key, t.class;
1060
+
1061
+ -- Each file the environment declared (its skills' files, rules), per attempt: how many tool calls
1062
+ -- named it, directly or through a glob, and the first one's transcript line (null: never read).
1063
+ CREATE VIEW skill_files AS
1064
+ SELECT a.run_id, a.eval_key, a.cell_key, c.environment, a.key AS attempt_key,
1065
+ a.id AS attempt_id, x.path,
1066
+ (SELECT COUNT(*) FROM context_reads r WHERE r.run_id = a.run_id AND r.attempt_key = a.key
1067
+ AND r.path = x.path) AS reads,
1068
+ (SELECT MIN(r.line) FROM context_reads r WHERE r.run_id = a.run_id AND r.attempt_key = a.key
1069
+ AND r.path = x.path) AS first_line
1070
+ FROM attempt_context x
1071
+ JOIN attempts a ON a.run_id = x.run_id AND a.key = x.attempt_key
1072
+ JOIN cells c ON c.run_id = a.run_id AND c.eval_key = a.eval_key AND c.key = a.cell_key
1073
+ WHERE x.declared = 1;
1074
+
700
1075
  -- Failed attempts and infra errors (an OOM kill among them) with the cell's harness, model, each
701
1076
  -- of its environment's skills and the label of the first check that failed.
702
1077
  CREATE VIEW failing_attempts AS
@@ -719,6 +1094,15 @@ CREATE VIEW check_discrimination AS
719
1094
  JOIN cells c ON c.run_id = k.run_id AND c.eval_key = k.eval_key AND c.key = k.cell_key
720
1095
  WHERE c.role = 'variant' AND k.verdict IS NOT NULL;
721
1096
 
1097
+ -- Each check (expect label) per cell per run, on every cell (control and variant alike), over the
1098
+ -- cell's counted attempts. rate = pass / (pass + fail): an error (the matcher couldn't answer) and
1099
+ -- a not-run (a hard expect before it failed) are left out; null when neither passed nor failed.
1100
+ CREATE VIEW check_rates AS
1101
+ SELECT k.run_id, k.eval_key, k.cell_key, c.harness, c.environment, c.role, k.label, k.pass,
1102
+ k.fail, k.error, k.not_run, CAST(k.pass AS REAL) / NULLIF(k.pass + k.fail, 0) AS rate
1103
+ FROM cell_checks k
1104
+ JOIN cells c ON c.run_id = k.run_id AND c.eval_key = k.eval_key AND c.key = k.cell_key;
1105
+
722
1106
  -- One eval per run: outcome and pass@1, with the branch and pull request.
723
1107
  CREATE VIEW eval_trend AS
724
1108
  SELECT e.eval_key, r.run_id, r.started_at, r.branch, r.pr_number, r.recorded, e.outcome,
@@ -744,16 +1128,29 @@ const VIEW_NAMES = [
744
1128
  "lift",
745
1129
  "family_lift",
746
1130
  "effort",
1131
+ "contrasts",
1132
+ "question_pairs",
747
1133
  "factor_effects",
748
1134
  "skill_reads",
1135
+ "context_use",
1136
+ "skill_files",
749
1137
  "flaky_cells",
750
1138
  "drift",
751
1139
  "failing_attempts",
752
1140
  "eval_trend",
753
1141
  "verdict_flips",
754
- "check_discrimination"
1142
+ "check_discrimination",
1143
+ "check_rates"
755
1144
  ];
756
1145
  const json = (value) => JSON.stringify(value);
1146
+ /** The agent CLI's home config, which its harness writes (MCP servers, settings), not the eval. */
1147
+ const HARNESS_CONFIG = /^~\/.*(^|\/)(config\.(toml|ya?ml|json)|settings(\.local)?\.json|mcp\.json)$/;
1148
+ /**
1149
+ * A placed file the environment declared: under one of its skills, or a rules file outside any
1150
+ * skills directory. Not an agent CLI's own state or home config, its bundled skills or the
1151
+ * adapter's skill index.
1152
+ */
1153
+ const declaredContext = (path, skills) => !isRuntimeState(path) && !path.endsWith("/.ai-sdk-harness-skills.json") && !HARNESS_CONFIG.test(path) && (skills.some((s) => path.includes(`skills/${s}/`)) || !/(^|\/)skills(-[^/]+)?\//.test(path));
757
1154
  /** `attempts.last_text` is the agent's final message, capped: most "why" questions start there. */
758
1155
  const LAST_TEXT_LIMIT = 2048;
759
1156
  /** The tool calls in a transcript.jsonl, numbered by line from 1; lines that aren't JSON are skipped. */
@@ -779,6 +1176,17 @@ function toolCalls(transcript) {
779
1176
  });
780
1177
  return calls;
781
1178
  }
1179
+ /** `classifyCall`, but a call its heuristic can't read counts as workspace: one transcript line can't stop the sync. */
1180
+ function classifyOrWorkspace(tool, target, ctx) {
1181
+ try {
1182
+ return classifyCall(tool, target, ctx);
1183
+ } catch {
1184
+ return {
1185
+ class: "workspace",
1186
+ files: []
1187
+ };
1188
+ }
1189
+ }
782
1190
  /**
783
1191
  * What a cell's results can be pooled on across runs: its fingerprint parts, with the context
784
1192
  * part replaced by the context files that aren't an agent CLI's own runtime state.
@@ -798,24 +1206,42 @@ function comparableFingerprint(cell, attempts) {
798
1206
  function insertRun(db, record, recorded, transcripts) {
799
1207
  const run = (sql, ...values) => db.prepare(sql).run(...values);
800
1208
  const { runner, summary, git } = record;
801
- run(`INSERT INTO runs VALUES (${Array(26).fill("?").join(", ")})`, record.runId, recorded ? 1 : 0, record.status, record.startedAt, record.endedAt, record.durationMs, record.author, git?.sha ?? null, git?.branch ?? null, git ? git.dirty ? 1 : 0 : null, runner.kind, runner.kind === "ci" ? runner.provider : null, runner.kind === "ci" ? runner.runUrl : null, runner.kind === "ci" ? runner.pr?.number ?? null : null, runner.kind === "ci" ? runner.pr?.baseRef ?? null : null, record.stack.es, record.stack.judge.model, record.stack.judge.version, record.profile?.name ?? null, summary.evals, summary.attempts, summary.pass, summary.fail, summary.notGated, summary.infraError, summary.skipped);
1209
+ run(`INSERT INTO runs VALUES (${Array(26).fill("?").join(", ")})`, record.runId, recorded ? 1 : 0, record.status, record.startedAt, record.endedAt, record.durationMs, record.author, git?.sha ?? null, git?.branch ?? null, git ? git.dirty ? 1 : 0 : null, runner.kind, runner.kind === "ci" ? runner.provider : null, runner.kind === "ci" ? runner.runUrl : null, runner.kind === "ci" ? runner.pr?.number ?? null : null, runner.kind === "ci" ? runner.pr?.baseRef ?? null : null, record.stack.reeval, record.stack.judge.model, record.stack.judge.version, record.profile?.name ?? null, summary.evals, summary.attempts, summary.pass, summary.fail, summary.notGated, summary.infraError, summary.skipped);
802
1210
  for (const env of record.environments) {
803
1211
  run("INSERT OR IGNORE INTO environments VALUES (?, ?, ?, ?, ?)", record.runId, env.name, env.digest, env.parent, json(env.overrides));
804
1212
  for (const s of env.skills) run("INSERT INTO env_skills VALUES (?, ?, ?, ?, ?, ?, ?)", record.runId, env.digest, s.name, s.source, s.commit, s.sha256, s.placement);
805
1213
  }
1214
+ const envOf = new Map(record.environments.map((env) => [env.digest, env]));
806
1215
  for (const e of record.evals) {
1216
+ const cellEnv = new Map(e.cells.map((c) => [c.key, c.environmentDigest ?? ""]));
807
1217
  run(`INSERT INTO evals VALUES (${Array(14).fill("?").join(", ")})`, record.runId, e.key, e.id, e.slug, e.file, json(e.group), e.name, json(e.tags), e.fingerprint, e.outcome, e.passRate, json(e.sources), e.family?.id ?? null, e.family?.case ?? null);
808
1218
  for (const c of e.cells) {
809
1219
  const p = c.fingerprintParts;
810
1220
  run(`INSERT INTO cells VALUES (${Array(36).fill("?").join(", ")})`, record.runId, e.key, c.key, c.role, c.variant ?? null, c.harness, c.harnessKind, c.model, c.effort ?? null, c.environment, c.environmentDigest, c.sandbox, typeof c.gate === "string" ? c.gate : "passRate", typeof c.gate === "string" ? null : c.gate.passRate, c.fingerprint, p.sources, p.harness, p.environment, p.image, p.agentCli, p.judge, p.context, c.runs, c.pass, c.fail, c.infraError, c.skipped, c.passRate, c.outcome, c.lift?.vs ?? null, c.lift?.points ?? null, c.lift?.interval.lo ?? null, c.lift?.interval.hi ?? null, c.lift ? c.lift.withinNoise ? 1 : 0 : null, c.lift?.minLift ?? null, comparableFingerprint(c, e.attempts));
811
1221
  for (const k of c.checks ?? []) run(`INSERT INTO cell_checks VALUES (${Array(13).fill("?").join(", ")})`, record.runId, e.key, c.key, k.label, k.pass, k.fail, k.error, k.notRun, k.control?.pass ?? null, k.control?.fail ?? null, k.control?.error ?? null, k.control?.notRun ?? null, k.verdict ?? null);
812
1222
  }
1223
+ for (const answer of e.answers ?? []) {
1224
+ for (const v of answer.votes) run(`INSERT INTO votes VALUES (${Array(11).fill("?").join(", ")})`, record.runId, e.key, answer.question, v.cut, v.harness ?? v.arm ?? null, v.run, v.a, v.b, v.winner, v.swapped ? 1 : 0, v.reason ?? null);
1225
+ for (const t of pairTallies(answer.votes)) run(`INSERT INTO question_pairs_m VALUES (${Array(13).fill("?").join(", ")})`, record.runId, e.key, answer.question, t.cut, t.held, t.a, t.b, t.pairs, t.aWins, t.bWins, t.ties, t.splits, t.splitsFirst);
1226
+ }
813
1227
  for (const a of e.attempts) {
814
1228
  run(`INSERT INTO attempts VALUES (${Array(30).fill("?").join(", ")})`, record.runId, e.key, a.cell, a.key, a.id, a.n, a.seq, a.startedAt, a.outcome, a.error?.kind ?? null, a.error?.message ?? null, a.durationMs, a.imageId, a.turns.length, a.activity.tools, a.activity.fileEdits, a.timings.setupMs, a.timings.agentMs, a.timings.checksMs, a.timings.judgeMs, a.turns.at(-1)?.text.slice(0, 2048) ?? null, a.usage?.input ?? null, a.usage?.output ?? null, a.usage?.cacheRead ?? null, a.usage?.cacheWrite ?? null, a.usage?.reasoning ?? null, a.turns.findLast((t) => t.model)?.model ?? null, a.error?.resource?.cause === "oom" ? a.error.resource.kills : 0, a.effort ?? null, a.servedEffort ?? null);
815
- for (const c of a.context) run("INSERT INTO attempt_context VALUES (?, ?, ?, ?, ?)", record.runId, a.key, c.path, c.sha256, isRuntimeState(c.path) ? 1 : 0);
1229
+ const env = envOf.get(cellEnv.get(a.cell) ?? "");
1230
+ const skills = env?.skills.map((x) => x.name) ?? [];
1231
+ for (const c of a.context) run("INSERT INTO attempt_context VALUES (?, ?, ?, ?, ?, ?)", record.runId, a.key, c.path, c.sha256, isRuntimeState(c.path) ? 1 : 0, declaredContext(c.path, skills) ? 1 : 0);
816
1232
  for (const [i, x] of (a.assertions ?? []).entries()) run(`INSERT INTO assertions VALUES (${Array(12).fill("?").join(", ")})`, record.runId, a.key, e.key, a.cell, i + 1, x.label, x.labelled ? 1 : 0, x.matcher, x.status, x.soft ? 1 : 0, x.message ?? null, x.durationMs ?? null);
817
1233
  const transcript = transcripts.get(a.key);
818
- for (const t of transcript ? toolCalls(transcript) : []) run("INSERT INTO tool_calls VALUES (?, ?, ?, ?, ?, ?, ?, ?)", record.runId, a.key, t.line, t.turn, t.tool, t.target, t.ok ? 1 : 0, t.durationMs);
1234
+ const ctx = {
1235
+ skills,
1236
+ files: a.context.map((c) => c.path).filter((p) => declaredContext(p, skills)),
1237
+ mcp: env?.mcp ?? [],
1238
+ verify: a.checks.map((c) => c.command)
1239
+ };
1240
+ for (const t of transcript ? toolCalls(transcript) : []) {
1241
+ const call = classifyOrWorkspace(t.tool, t.target, ctx);
1242
+ run("INSERT INTO tool_calls VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)", record.runId, a.key, t.line, t.turn, t.tool, t.target, t.ok ? 1 : 0, t.durationMs, call.class);
1243
+ for (const path of call.files) run("INSERT INTO context_reads VALUES (?, ?, ?, ?)", record.runId, a.key, t.line, path);
1244
+ }
819
1245
  for (const j of a.judgements) run("INSERT OR IGNORE INTO judgements VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", record.runId, a.key, j.key, j.question, j.verdict, j.score, j.threshold, j.model, j.resolvedModel ?? null, a.files.judgeInput?.path ?? null);
820
1246
  for (const [kind, ref] of Object.entries(a.files)) {
821
1247
  if (ref == null || Array.isArray(ref) || typeof ref.path !== "string") continue;
@@ -841,6 +1267,8 @@ const DATA_TABLES = [
841
1267
  "evals",
842
1268
  "families",
843
1269
  "family_lift_m",
1270
+ "votes",
1271
+ "question_pairs_m",
844
1272
  "cells",
845
1273
  "attempts",
846
1274
  "judgements",
@@ -849,6 +1277,7 @@ const DATA_TABLES = [
849
1277
  "artifacts",
850
1278
  "attempt_context",
851
1279
  "tool_calls",
1280
+ "context_reads",
852
1281
  "assertions",
853
1282
  "cell_checks"
854
1283
  ];
@@ -857,7 +1286,7 @@ function removeRun(db, runId) {
857
1286
  db.prepare("DELETE FROM files WHERE run_id = ?").run(runId);
858
1287
  }
859
1288
  function freshSchema(db) {
860
- const objects = db.prepare("SELECT type, name FROM sqlite_schema WHERE type IN ('table', 'view')").all();
1289
+ const objects = rowsOf(db.prepare("SELECT type, name FROM sqlite_schema WHERE type IN ('table', 'view')"));
861
1290
  for (const o of objects) {
862
1291
  if (o.name.startsWith("sqlite_")) continue;
863
1292
  db.exec(`DROP ${o.type === "view" ? "VIEW" : "TABLE"} IF EXISTS "${o.name}"`);
@@ -868,7 +1297,7 @@ function freshSchema(db) {
868
1297
  }
869
1298
  function current(db) {
870
1299
  try {
871
- const rows = db.prepare("SELECT key, value FROM meta").all();
1300
+ const rows = rowsOf(db.prepare("SELECT key, value FROM meta"));
872
1301
  const meta = Object.fromEntries(rows.map((r) => [r.key, r.value]));
873
1302
  return meta.version === String(DB_VERSION) && meta.build === String(BUILD);
874
1303
  } catch {
@@ -902,7 +1331,7 @@ async function sync(db, root, historyDir) {
902
1331
  recorded
903
1332
  });
904
1333
  }
905
- const known = new Map(db.prepare("SELECT run_id, path, size, mtime_ms FROM files").all().map((r) => [r.run_id, r]));
1334
+ const known = new Map(rowsOf(db.prepare("SELECT run_id, path, size, mtime_ms FROM files")).map((r) => [r.run_id, r]));
906
1335
  let added = 0;
907
1336
  let removed = 0;
908
1337
  db.exec("BEGIN");
@@ -962,7 +1391,7 @@ async function openHistoryDb(root, historyDir, options = {}) {
962
1391
  query(sql, params = []) {
963
1392
  try {
964
1393
  const statement = db.prepare(sql);
965
- const rows = statement.all(...params);
1394
+ const rows = Array.isArray(params) ? statement.all(...params) : statement.all(params);
966
1395
  return {
967
1396
  columns: typeof statement.columns === "function" ? statement.columns().map((c) => c.name) : Object.keys(rows[0] ?? {}),
968
1397
  rows
@@ -973,15 +1402,15 @@ async function openHistoryDb(root, historyDir, options = {}) {
973
1402
  }
974
1403
  },
975
1404
  schema() {
976
- return db.prepare(`SELECT name, type FROM sqlite_schema WHERE type IN ('table', 'view') AND name NOT IN ('meta', 'files', 'family_lift_m', ${DERIVED.map((d) => `'${d}'`).join(", ")}) AND name NOT LIKE 'sqlite_%' ORDER BY type, name`).all().map((o) => ({
1405
+ return rowsOf(db.prepare(`SELECT name, type FROM sqlite_schema WHERE type IN ('table', 'view') AND name NOT IN ('meta', 'files', 'family_lift_m', ${DERIVED.map((d) => `'${d}'`).join(", ")}) AND name NOT LIKE 'sqlite_%' ORDER BY type, name`)).map((o) => ({
977
1406
  ...o,
978
- columns: db.prepare(`PRAGMA table_info("${o.name}")`).all().map((c) => c.name)
1407
+ columns: rowsOf(db.prepare(`PRAGMA table_info("${o.name}")`)).map((c) => c.name)
979
1408
  }));
980
1409
  },
981
1410
  close: () => db.close()
982
1411
  };
983
1412
  }
984
1413
  //#endregion
985
- export { historyDbPath as a, toolCalls as c, comparableFingerprint as i, SQLITE_NODE as n, nodeAtLeast as o, VIEW_NAMES as r, openHistoryDb as s, LAST_TEXT_LIMIT as t };
1414
+ export { historyDbPath as a, toolCalls as c, comparableFingerprint as i, TOOL_CLASSES as l, SQLITE_NODE as n, nodeAtLeast as o, VIEW_NAMES as r, openHistoryDb as s, LAST_TEXT_LIMIT as t };
986
1415
 
987
- //# sourceMappingURL=db-CfQFwJtq.js.map
1416
+ //# sourceMappingURL=db-DfhipHEF.js.map