reeval 0.11.0 → 0.12.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 (283) hide show
  1. package/README.md +3 -1
  2. package/bin/mcp-timer.cjs +224 -0
  3. package/dist/{adapter-Bwy3QxAK.js → adapter-DigeVFWC.js} +3 -3
  4. package/dist/{adapter-Bwy3QxAK.js.map → adapter-DigeVFWC.js.map} +1 -1
  5. package/dist/{agent-DpE80WPz.js → agent-CatUEo5h.js} +21 -6
  6. package/dist/{agent-DpE80WPz.js.map → agent-CatUEo5h.js.map} +1 -1
  7. package/dist/{assemble-D9GWr-HS.js → assemble-CF063ms6.js} +19 -17
  8. package/dist/assemble-CF063ms6.js.map +1 -0
  9. package/dist/assemble-CJoD_Rzr.js +1 -0
  10. package/dist/bridge/index.mjs +2 -1
  11. package/dist/{capture-BQlGHiMC.js → capture-BiD7lVaM.js} +25 -17
  12. package/dist/{capture-BQlGHiMC.js.map → capture-BiD7lVaM.js.map} +1 -1
  13. package/dist/capture-Dp3q7K7Y.js +1 -0
  14. package/dist/{cli-ClpPT8kn.js → cli-B5zQCR2r.js} +161 -116
  15. package/dist/cli-B5zQCR2r.js.map +1 -0
  16. package/dist/{cli-spec-qmEnQ25_.js → cli-spec-BXIBUlaK.js} +34 -15
  17. package/dist/cli-spec-BXIBUlaK.js.map +1 -0
  18. package/dist/cli.js +2 -2
  19. package/dist/{command-TgbzPizb.js → command-BMHXHqMT.js} +15 -14
  20. package/dist/command-BMHXHqMT.js.map +1 -0
  21. package/dist/command-C94CQNh8.js +91 -0
  22. package/dist/command-C94CQNh8.js.map +1 -0
  23. package/dist/command-CVtgyqlM.js +335 -0
  24. package/dist/command-CVtgyqlM.js.map +1 -0
  25. package/dist/{command-DbAe1Rzb.js → command-CaZgCTIw.js} +14 -17
  26. package/dist/command-CaZgCTIw.js.map +1 -0
  27. package/dist/{command-BlM0y8jN.js → command-DTgBZR0k.js} +6 -6
  28. package/dist/{command-BlM0y8jN.js.map → command-DTgBZR0k.js.map} +1 -1
  29. package/dist/{commands-CthqwkAn.js → commands-BXzIDB3X.js} +1 -1
  30. package/dist/commands-CjpGBUWr.js +666 -0
  31. package/dist/commands-CjpGBUWr.js.map +1 -0
  32. package/dist/{config-DrVSEVN0.js → config-Dv5MG7Rp.js} +27 -48
  33. package/dist/config-Dv5MG7Rp.js.map +1 -0
  34. package/dist/{context-C1mxXh80.js → context-Dgn48BqT.js} +13 -2
  35. package/dist/context-Dgn48BqT.js.map +1 -0
  36. package/dist/{contrasts-5zsj32gk.js → contrasts-CcoMLC_y.js} +3 -3
  37. package/dist/{contrasts-5zsj32gk.js.map → contrasts-CcoMLC_y.js.map} +1 -1
  38. package/dist/db-BeqRiWLl.js +602 -0
  39. package/dist/db-BeqRiWLl.js.map +1 -0
  40. package/dist/db-CJDRVQal.js +2 -0
  41. package/dist/{dist-CuY4ehEk.js → dist-CMjp3qqF.js} +2 -2
  42. package/dist/{dist-CuY4ehEk.js.map → dist-CMjp3qqF.js.map} +1 -1
  43. package/dist/{docker-DOvjji9I.js → docker-BbTlMmYi.js} +2 -2
  44. package/dist/{docker-DOvjji9I.js.map → docker-BbTlMmYi.js.map} +1 -1
  45. package/dist/{docker-D1HZDS6q.js → docker-CCXdbREk.js} +20 -4
  46. package/dist/{docker-D1HZDS6q.js.map → docker-CCXdbREk.js.map} +1 -1
  47. package/dist/{docker-DNmMPOBb.js → docker-DC69dKxB.js} +1 -1
  48. package/dist/{doctor-D2MbNO8L.js → doctor-CqttrZcs.js} +57 -22
  49. package/dist/doctor-CqttrZcs.js.map +1 -0
  50. package/dist/{egress-2-qzPvGi.js → egress-BfK_O9ce.js} +435 -30
  51. package/dist/egress-BfK_O9ce.js.map +1 -0
  52. package/dist/env-BQqj93gu.js +21 -0
  53. package/dist/env-BQqj93gu.js.map +1 -0
  54. package/dist/{environment-Cca6a4wB.js → environment-BBz1Yes9.js} +224 -10
  55. package/dist/environment-BBz1Yes9.js.map +1 -0
  56. package/dist/{evaluate-DKIl54Hb.js → evaluate-CXQ1o-pd.js} +539 -559
  57. package/dist/evaluate-CXQ1o-pd.js.map +1 -0
  58. package/dist/{evaluate-DMyaGQEj.d.ts → evaluate-yjZKUexW.d.ts} +2 -2
  59. package/dist/facts-DtENlf9s.js +898 -0
  60. package/dist/facts-DtENlf9s.js.map +1 -0
  61. package/dist/{files-BpUYBwGu.js → files-B-eUpCZ1.js} +30 -7
  62. package/dist/files-B-eUpCZ1.js.map +1 -0
  63. package/dist/files-BsQbYz2i.js +65 -0
  64. package/dist/files-BsQbYz2i.js.map +1 -0
  65. package/dist/{files-BXHZFWmx.js → files-COHQLEHE.js} +6 -17
  66. package/dist/files-COHQLEHE.js.map +1 -0
  67. package/dist/files-DqCBW7i8.js +1 -0
  68. package/dist/files-Ha-jsQXf.js +1 -0
  69. package/dist/generate-Cs2TMH_k.js +1647 -0
  70. package/dist/generate-Cs2TMH_k.js.map +1 -0
  71. package/dist/{git-Crl3b87o.js → git-DhykwgKF.js} +2 -2
  72. package/dist/{git-Crl3b87o.js.map → git-DhykwgKF.js.map} +1 -1
  73. package/dist/{harness-CEuntrla.js → harness-BAjw1fcr.js} +2 -2
  74. package/dist/{harness-CEuntrla.js.map → harness-BAjw1fcr.js.map} +1 -1
  75. package/dist/harness.d.ts +1 -1
  76. package/dist/harness.js +1 -1
  77. package/dist/{header-DHQv_ZrF.js → header-kSmWatcO.js} +10 -3
  78. package/dist/{header-DHQv_ZrF.js.map → header-kSmWatcO.js.map} +1 -1
  79. package/dist/{images-Bi3aGxb9.js → images-BmJRuTpm.js} +61 -13
  80. package/dist/images-BmJRuTpm.js.map +1 -0
  81. package/dist/index.d.ts +3 -3
  82. package/dist/index.js +4 -4
  83. package/dist/init-Bwc9byQr.js +543 -0
  84. package/dist/init-Bwc9byQr.js.map +1 -0
  85. package/dist/init-D7Y1ny1z.js +1 -0
  86. package/dist/insights-B2Xmhz9o.js +64 -0
  87. package/dist/insights-B2Xmhz9o.js.map +1 -0
  88. package/dist/{invocations-BYDPe3fV.js → invocations-CQTbP092.js} +3 -3
  89. package/dist/{invocations-BYDPe3fV.js.map → invocations-CQTbP092.js.map} +1 -1
  90. package/dist/{judge-DW_GDOmB.js → judge-Dt6KW6_O.js} +5 -3
  91. package/dist/judge-Dt6KW6_O.js.map +1 -0
  92. package/dist/judge.d.ts +7 -6
  93. package/dist/judge.js +8 -7
  94. package/dist/judge.js.map +1 -1
  95. package/dist/{live-jlfszAbb.js → live-DYd2QEyR.js} +2 -2
  96. package/dist/{live-jlfszAbb.js.map → live-DYd2QEyR.js.map} +1 -1
  97. package/dist/{model-D0IcOQao.js → model-B-mel-Gv.js} +43 -18
  98. package/dist/model-B-mel-Gv.js.map +1 -0
  99. package/dist/model-BGKYVpoj.js +1 -0
  100. package/dist/{model-DaVCY3rb.js → model-C7tSwT7f.js} +2 -2
  101. package/dist/{model-DaVCY3rb.js.map → model-C7tSwT7f.js.map} +1 -1
  102. package/dist/{model-DaX4bNLZ.js → model-CWlAqmbU.js} +135 -40
  103. package/dist/model-CWlAqmbU.js.map +1 -0
  104. package/dist/model-DHY-dfoO.js +1 -0
  105. package/dist/{node-B3ydHo6t.js → node-D0mtjRAO.js} +3 -3
  106. package/dist/{node-B3ydHo6t.js.map → node-D0mtjRAO.js.map} +1 -1
  107. package/dist/{options-C0d0AzeR.js → options-CPUW97_7.js} +7 -9
  108. package/dist/options-CPUW97_7.js.map +1 -0
  109. package/dist/{pairs-CnInRu-G.js → pairs-DP6XOJby.js} +2 -2
  110. package/dist/{pairs-CnInRu-G.js.map → pairs-DP6XOJby.js.map} +1 -1
  111. package/dist/{patch-B1bnfhN-.js → patch-D4oluWzH.js} +2 -2
  112. package/dist/{patch-B1bnfhN-.js.map → patch-D4oluWzH.js.map} +1 -1
  113. package/dist/{plan-DgQxp9yy.js → plan-OkwUcJQ9.js} +21 -8
  114. package/dist/plan-OkwUcJQ9.js.map +1 -0
  115. package/dist/plugins-CUWMnSNb.js +654 -0
  116. package/dist/plugins-CUWMnSNb.js.map +1 -0
  117. package/dist/{preflight-DlQvbySb.js → preflight-B6pY89bF.js} +1 -1
  118. package/dist/{preflight-BRzD30L5.js → preflight-Bjm7_ylE.js} +14 -10
  119. package/dist/preflight-Bjm7_ylE.js.map +1 -0
  120. package/dist/{prepare-B_y-AFMv.js → prepare-CQmK3SBn.js} +70 -23
  121. package/dist/prepare-CQmK3SBn.js.map +1 -0
  122. package/dist/prepare-DbdgtZKe.js +2 -0
  123. package/dist/{provenance-DQ0AXn6c.js → provenance-B3Y17oCC.js} +3 -3
  124. package/dist/{provenance-DQ0AXn6c.js.map → provenance-B3Y17oCC.js.map} +1 -1
  125. package/dist/providers-CXN2RFz-.js +1 -0
  126. package/dist/{providers-DoTq1jHW.js → providers-eoniqK6w.js} +24 -10
  127. package/dist/providers-eoniqK6w.js.map +1 -0
  128. package/dist/{query-BO-ux7RB.js → query-CLRZmWBT.js} +3 -3
  129. package/dist/{query-BO-ux7RB.js.map → query-CLRZmWBT.js.map} +1 -1
  130. package/dist/query-CmBDYt0_.js +1 -0
  131. package/dist/{questions-C2dym2ce.js → questions-1XOulevV.js} +6 -6
  132. package/dist/{questions-C2dym2ce.js.map → questions-1XOulevV.js.map} +1 -1
  133. package/dist/{record-BKmMvZ6O.js → record-kk9M1hj-.js} +8 -4
  134. package/dist/record-kk9M1hj-.js.map +1 -0
  135. package/dist/remarks-1521zwfW.js +38 -0
  136. package/dist/remarks-1521zwfW.js.map +1 -0
  137. package/dist/remarks-BhAV1H4V.js +1 -0
  138. package/dist/remarks-DlJCqWRs.js +278 -0
  139. package/dist/remarks-DlJCqWRs.js.map +1 -0
  140. package/dist/{remote-CPPW86Q9.js → remote-cE2VWfkJ.js} +3 -3
  141. package/dist/{remote-CPPW86Q9.js.map → remote-cE2VWfkJ.js.map} +1 -1
  142. package/dist/resolve-C4zeccCH.js +724 -0
  143. package/dist/resolve-C4zeccCH.js.map +1 -0
  144. package/dist/resolve-D30yZYmB.js +1 -0
  145. package/dist/{results-BE2f-1XS.js → results-Drtt0uFl.js} +33 -8
  146. package/dist/results-Drtt0uFl.js.map +1 -0
  147. package/dist/{resume-Ca1c8vix.js → resume-BEFazUfy.js} +4 -4
  148. package/dist/{resume-Ca1c8vix.js.map → resume-BEFazUfy.js.map} +1 -1
  149. package/dist/rules-BFzQqPIm.js +317 -0
  150. package/dist/rules-BFzQqPIm.js.map +1 -0
  151. package/dist/run-BeMy92Us.js +88 -0
  152. package/dist/run-BeMy92Us.js.map +1 -0
  153. package/dist/{sandbox-DLrsvu7U.js → sandbox-CQaJj7n9.js} +2 -2
  154. package/dist/{sandbox-DLrsvu7U.js.map → sandbox-CQaJj7n9.js.map} +1 -1
  155. package/dist/sandbox.d.ts +1 -1
  156. package/dist/sandbox.js +1 -1
  157. package/dist/server-V4-2w0l8.js +1 -0
  158. package/dist/{server-TUY5xA_A.js → server-xK0les4f.js} +8 -8
  159. package/dist/{server-TUY5xA_A.js.map → server-xK0les4f.js.map} +1 -1
  160. package/dist/source-BDow_oW8.js +1 -0
  161. package/dist/{source-DJGS0a0u.js → source-Q1hEKbCs.js} +2 -2
  162. package/dist/{source-DJGS0a0u.js.map → source-Q1hEKbCs.js.map} +1 -1
  163. package/dist/src-B9L9yGKI.js +1 -0
  164. package/dist/{src-CLoOMVWI.js → src-Bcah6ZkT.js} +1 -1
  165. package/dist/{src-DvCg0NBs.js → src-BhmaorOU.js} +28 -6
  166. package/dist/{src-DvCg0NBs.js.map → src-BhmaorOU.js.map} +1 -1
  167. package/dist/{src-CF17Ug08.js → src-C0CeKiLU.js} +19 -4
  168. package/dist/{src-CF17Ug08.js.map → src-C0CeKiLU.js.map} +1 -1
  169. package/dist/src-C0xowZ3C.js +2 -0
  170. package/dist/src-CHIfIKUu.js +2 -0
  171. package/dist/src-DLtyz4w5.js +2 -0
  172. package/dist/src-DPIjmReZ.js +2 -0
  173. package/dist/{src-BxfCKA3_.js → src-DXNh5mTr.js} +1 -1
  174. package/dist/{src-FGXhkEkH.js → src-DiLMkIr9.js} +142 -13
  175. package/dist/src-DiLMkIr9.js.map +1 -0
  176. package/dist/{src-ftu5wPSt.js → src-LekQrr_S.js} +209 -29
  177. package/dist/src-LekQrr_S.js.map +1 -0
  178. package/dist/src-bCnsA6Vp.js +2 -0
  179. package/dist/{src-u8_ixn_F.js → src-cbCb-MPy.js} +20 -4
  180. package/dist/src-cbCb-MPy.js.map +1 -0
  181. package/dist/{src-DvK0EIZx.js → src-qGoFkuJF.js} +55 -6
  182. package/dist/{src-DvK0EIZx.js.map → src-qGoFkuJF.js.map} +1 -1
  183. package/dist/{src-DSYYPEOj.js → src-ynBVosfX.js} +1 -1
  184. package/dist/state-BQR_BCm4.js +1 -0
  185. package/dist/{state-DfpHox6b.js → state-BmZ8QVZ8.js} +12 -12
  186. package/dist/{state-DfpHox6b.js.map → state-BmZ8QVZ8.js.map} +1 -1
  187. package/dist/studio-app/assets/{index-CBkhNAv8.js → index-CnYJijyI.js} +9 -9
  188. package/dist/studio-app/index.html +1 -1
  189. package/dist/suite-BaHPmAGy.js +1 -0
  190. package/dist/{suite-Cw_7G2RM.js → suite-C8sw2pox.js} +80 -28
  191. package/dist/suite-C8sw2pox.js.map +1 -0
  192. package/dist/{summary-BUKfU-9l.js → summary-0oQNGskv.js} +273 -47
  193. package/dist/summary-0oQNGskv.js.map +1 -0
  194. package/dist/testing.d.ts +2 -2
  195. package/dist/testing.js +2 -2
  196. package/dist/{text-gEcKjAyp.js → text-CrVy5ioL.js} +18 -2
  197. package/dist/text-CrVy5ioL.js.map +1 -0
  198. package/dist/{transcript-BNNANU8A.js → transcript-BTxJpW4R.js} +2 -2
  199. package/dist/{transcript-BNNANU8A.js.map → transcript-BTxJpW4R.js.map} +1 -1
  200. package/dist/types-C5vI3g1C.js.map +1 -1
  201. package/dist/{types-BYdlwMwo.d.ts → types-GraZtfHN.d.ts} +848 -34
  202. package/dist/usage-BDo2q_yu.js +1 -0
  203. package/dist/{command-Bj39y-Wm.js → validate-BdoXUuL_.js} +15 -372
  204. package/dist/validate-BdoXUuL_.js.map +1 -0
  205. package/dist/view/index.d.ts +20 -257
  206. package/dist/view/index.js +7 -6
  207. package/dist/{views-B8w2J-gD.js → views-BoUoX4_A.js} +8 -98
  208. package/dist/views-BoUoX4_A.js.map +1 -0
  209. package/dist/views-noVQNCUP.js +2 -0
  210. package/dist/{worker-entry-DNnveLqx.js → worker-entry-D0-GErmU.js} +2 -2
  211. package/dist/{worker-entry-DNnveLqx.js.map → worker-entry-D0-GErmU.js.map} +1 -1
  212. package/dist/{workspace-C_X0tdv6.js → workspace-B90YDU_a.js} +1 -1
  213. package/dist/{workspace-C4RA3srV.js → workspace-tjZFkjxC.js} +4 -4
  214. package/dist/{workspace-C4RA3srV.js.map → workspace-tjZFkjxC.js.map} +1 -1
  215. package/package.json +3 -1
  216. package/skills/eval-rubric/SKILL.md +130 -0
  217. package/dist/agent-D483ru7D.js +0 -334
  218. package/dist/agent-D483ru7D.js.map +0 -1
  219. package/dist/assemble-D5KGrwnJ.js +0 -1
  220. package/dist/assemble-D9GWr-HS.js.map +0 -1
  221. package/dist/capture-CYGLpWxR.js +0 -1
  222. package/dist/cli-ClpPT8kn.js.map +0 -1
  223. package/dist/cli-spec-qmEnQ25_.js.map +0 -1
  224. package/dist/command-Bj39y-Wm.js.map +0 -1
  225. package/dist/command-C-cVjlny.js +0 -1
  226. package/dist/command-DbAe1Rzb.js.map +0 -1
  227. package/dist/command-TgbzPizb.js.map +0 -1
  228. package/dist/commands-YUwlyTbr.js +0 -228
  229. package/dist/commands-YUwlyTbr.js.map +0 -1
  230. package/dist/config-DrVSEVN0.js.map +0 -1
  231. package/dist/context-C1mxXh80.js.map +0 -1
  232. package/dist/db-CKg5NtiW.js +0 -2
  233. package/dist/db-DfhipHEF.js +0 -1416
  234. package/dist/db-DfhipHEF.js.map +0 -1
  235. package/dist/doctor-D2MbNO8L.js.map +0 -1
  236. package/dist/egress-2-qzPvGi.js.map +0 -1
  237. package/dist/environment-Cca6a4wB.js.map +0 -1
  238. package/dist/evaluate-DKIl54Hb.js.map +0 -1
  239. package/dist/files-BXHZFWmx.js.map +0 -1
  240. package/dist/files-BpUYBwGu.js.map +0 -1
  241. package/dist/files-Bw8lWEjg.js +0 -1
  242. package/dist/files-D6J0iSdx.js +0 -1
  243. package/dist/images-Bi3aGxb9.js.map +0 -1
  244. package/dist/init-Cl3f3NBT.js +0 -360
  245. package/dist/init-Cl3f3NBT.js.map +0 -1
  246. package/dist/init-fhOXED8F.js +0 -1
  247. package/dist/judge-DW_GDOmB.js.map +0 -1
  248. package/dist/model-CXhrziBe.js +0 -1
  249. package/dist/model-D0IcOQao.js.map +0 -1
  250. package/dist/model-DaX4bNLZ.js.map +0 -1
  251. package/dist/model-_bxNrk2h.js +0 -1
  252. package/dist/options-C0d0AzeR.js.map +0 -1
  253. package/dist/plan-DgQxp9yy.js.map +0 -1
  254. package/dist/preflight-BRzD30L5.js.map +0 -1
  255. package/dist/prepare-B_y-AFMv.js.map +0 -1
  256. package/dist/prepare-DCKTLHN3.js +0 -2
  257. package/dist/providers-B9yTdIqF.js +0 -1
  258. package/dist/providers-DoTq1jHW.js.map +0 -1
  259. package/dist/query-CRQfsw0e.js +0 -1
  260. package/dist/record-BKmMvZ6O.js.map +0 -1
  261. package/dist/results-BE2f-1XS.js.map +0 -1
  262. package/dist/server-Dp8eOeK5.js +0 -1
  263. package/dist/source-DdbLGR1M.js +0 -1
  264. package/dist/src-CcrQbpG8.js +0 -2
  265. package/dist/src-DCFtJRp0.js +0 -2
  266. package/dist/src-DYO3DdnQ.js +0 -1
  267. package/dist/src-FGXhkEkH.js.map +0 -1
  268. package/dist/src-WD-zgQYZ.js +0 -2
  269. package/dist/src-_oI9AePb.js +0 -2
  270. package/dist/src-ftu5wPSt.js.map +0 -1
  271. package/dist/src-qsKCqv7a.js +0 -2
  272. package/dist/src-u8_ixn_F.js.map +0 -1
  273. package/dist/state-DpAxYyED.js +0 -1
  274. package/dist/suite-Cw_7G2RM.js.map +0 -1
  275. package/dist/suite-DamAEnNF.js +0 -1
  276. package/dist/summary-BUKfU-9l.js.map +0 -1
  277. package/dist/summary-Baa4rTHS.js +0 -192
  278. package/dist/summary-Baa4rTHS.js.map +0 -1
  279. package/dist/text-gEcKjAyp.js.map +0 -1
  280. package/dist/tools-DLHgetpx.js +0 -249
  281. package/dist/tools-DLHgetpx.js.map +0 -1
  282. package/dist/views-B8w2J-gD.js.map +0 -1
  283. package/dist/views-DblnI3kA.js +0 -2
@@ -65,6 +65,8 @@ async function withRetries(call, policy, signal) {
65
65
  //#region src/judge/index.ts
66
66
  /** The judge the docs recommend, pinned so a model update never silently moves scores. */
67
67
  const RECOMMENDED_JUDGE_MODEL = "typesafe-ai/jev-1.14.0";
68
+ /** The language model `reeval init` sets as `analysis.model` and the docs recommend for insights. */
69
+ const RECOMMENDED_ANALYSIS_MODEL = "google/gemini-3.8-flash";
68
70
  const DEFAULT_THRESHOLD = .8;
69
71
  const GATEWAY_KEYS = ["AI_GATEWAY_API_KEY", "VERCEL_OIDC_TOKEN"];
70
72
  /** Providers reeval calls directly, through their own AI SDK package, when their key is set. */
@@ -128,7 +130,7 @@ async function runJudge(question, state, options, signal, retry = JUDGE_RETRY) {
128
130
  const problem = checkModelString(model);
129
131
  if (problem) throw new Error(problem);
130
132
  }
131
- const { scoreWithModel } = await import("./model-DaVCY3rb.js");
133
+ const { scoreWithModel } = await import("./model-C7tSwT7f.js");
132
134
  const scored = await withRetries(() => scoreWithModel(model, question, state, options.providerOptions, signal), retry, signal);
133
135
  ({score, resolvedModel} = scored.value);
134
136
  retries = scored.retries;
@@ -146,6 +148,6 @@ async function runJudge(question, state, options, signal, retry = JUDGE_RETRY) {
146
148
  };
147
149
  }
148
150
  //#endregion
149
- export { isFakeJudge as a, judgeRoute as c, checkModelString as i, runJudge as l, DIRECT_PROVIDERS as n, judgeCredentials as o, RECOMMENDED_JUDGE_MODEL as r, judgeModelName as s, DEFAULT_THRESHOLD as t, isApiError as u };
151
+ export { checkModelString as a, judgeModelName as c, isApiError as d, RECOMMENDED_JUDGE_MODEL as i, judgeRoute as l, DIRECT_PROVIDERS as n, isFakeJudge as o, RECOMMENDED_ANALYSIS_MODEL as r, judgeCredentials as s, DEFAULT_THRESHOLD as t, runJudge as u };
150
152
 
151
- //# sourceMappingURL=judge-DW_GDOmB.js.map
153
+ //# sourceMappingURL=judge-Dt6KW6_O.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"judge-Dt6KW6_O.js","names":["sleep"],"sources":["../src/judge/retry.ts","../src/judge/index.ts"],"mappings":"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"}
package/dist/judge.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { D as ConfigJudgeOptions, G as FakeAnalysisModel, J as FakeNoteInput, Rt as Verdict, Z as FakeVote, ct as JudgeArtifactRef, dt as JudgeModel, ft as JudgeOptions, lt as JudgeCallOptions, n as AnalysisConfig, o as BlindPair, pt as JudgeState, q as FakeJudgeModel, ut as JudgeFailure } from "./types-BYdlwMwo.js";
1
+ import { Bt as Verdict, D as ConfigJudgeOptions, J as FakeJudgeModel, K as FakeInsights, W as FakeAnalysisModel, Z as FakeVote, ct as JudgeArtifactRef, dt as JudgeModel, ft as JudgeOptions, lt as JudgeCallOptions, n as AnalysisConfig, o as BlindPair, pt as JudgeState, q as FakeInsightsInput, ut as JudgeFailure } from "./types-GraZtfHN.js";
2
2
  //#region src/judge/index.d.ts
3
3
  /** The judge the docs recommend, pinned so a model update never silently moves scores. */
4
4
  export declare const RECOMMENDED_JUDGE_MODEL = "typesafe-ai/jev-1.14.0";
@@ -16,11 +16,12 @@ export declare const fakeJudge: ({ score }?: {
16
16
  * An analysis model for tests: `reeval analyze` gets `output` (or `output(digest)`) back as the
17
17
  * model's structured answer, and each compare question's pair gets `vote` (a fixed `'A'`, `'B'` or
18
18
  * `'tie'`, `{ winner, reason? }`, a function of the blinded pair, or `{ error }`), through the same
19
- * parsing and validation as a real one. With `analysis.agent`, each note calls the same tools a real
20
- * model
21
- * would, then answers with `note` (or `note(input)`), or throws `note.error`.
19
+ * parsing and validation as a real one. Insights (in `reeval run` and `reeval analyze --insights`)
20
+ * get `insights` (or `insights(input)`, called per eval for its classification and its sentences,
21
+ * then once for the headline), through the same validator: an uncited sentence is dropped, and one
22
+ * with a banned word is asked for again, then dropped.
22
23
  */
23
- export declare const fakeAnalysis: ({ output, note, vote }: Pick<FakeAnalysisModel, 'output' | 'note' | 'vote'>) => FakeAnalysisModel;
24
+ export declare const fakeAnalysis: ({ output, vote, insights }: Pick<FakeAnalysisModel, 'output' | 'vote' | 'insights'>) => FakeAnalysisModel;
24
25
  //#endregion
25
- export type { AnalysisConfig, BlindPair, ConfigJudgeOptions, FakeAnalysisModel, FakeJudgeModel, FakeNoteInput, FakeVote, JudgeArtifactRef, JudgeCallOptions, JudgeFailure, JudgeModel, JudgeOptions, JudgeState, Verdict };
26
+ export type { AnalysisConfig, BlindPair, ConfigJudgeOptions, FakeAnalysisModel, FakeInsights, FakeInsightsInput, FakeJudgeModel, FakeVote, JudgeArtifactRef, JudgeCallOptions, JudgeFailure, JudgeModel, JudgeOptions, JudgeState, Verdict };
26
27
  //# sourceMappingURL=judge.d.ts.map
package/dist/judge.js CHANGED
@@ -1,4 +1,4 @@
1
- import { r as RECOMMENDED_JUDGE_MODEL, t as DEFAULT_THRESHOLD } from "./judge-DW_GDOmB.js";
1
+ import { i as RECOMMENDED_JUDGE_MODEL, t as DEFAULT_THRESHOLD } from "./judge-Dt6KW6_O.js";
2
2
  //#region src/judge.ts
3
3
  /**
4
4
  * A judge that returns `score` without calling a model, for tests and dry runs. `score` can be a
@@ -12,15 +12,16 @@ const fakeJudge = ({ score = 1 } = {}) => ({
12
12
  * An analysis model for tests: `reeval analyze` gets `output` (or `output(digest)`) back as the
13
13
  * model's structured answer, and each compare question's pair gets `vote` (a fixed `'A'`, `'B'` or
14
14
  * `'tie'`, `{ winner, reason? }`, a function of the blinded pair, or `{ error }`), through the same
15
- * parsing and validation as a real one. With `analysis.agent`, each note calls the same tools a real
16
- * model
17
- * would, then answers with `note` (or `note(input)`), or throws `note.error`.
15
+ * parsing and validation as a real one. Insights (in `reeval run` and `reeval analyze --insights`)
16
+ * get `insights` (or `insights(input)`, called per eval for its classification and its sentences,
17
+ * then once for the headline), through the same validator: an uncited sentence is dropped, and one
18
+ * with a banned word is asked for again, then dropped.
18
19
  */
19
- const fakeAnalysis = ({ output, note, vote }) => ({
20
+ const fakeAnalysis = ({ output, vote, insights }) => ({
20
21
  kind: "fake-analysis",
21
22
  ...output !== void 0 ? { output } : {},
22
- ...note !== void 0 ? { note } : {},
23
- ...vote !== void 0 ? { vote } : {}
23
+ ...vote !== void 0 ? { vote } : {},
24
+ ...insights !== void 0 ? { insights } : {}
24
25
  });
25
26
  //#endregion
26
27
  export { DEFAULT_THRESHOLD, RECOMMENDED_JUDGE_MODEL, fakeAnalysis, fakeJudge };
package/dist/judge.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"judge.js","names":[],"sources":["../src/judge.ts"],"mappings":";;;;;;AAQA,MAAa,aAAa,EACxB,QAAQ,MAGN,CAAC,OAAuB;CAC1B,MAAM;CACN;AACF;;;;;;;;;AAUA,MAAa,gBAAgB,EAC3B,QACA,MACA,YAC6E;CAC7E,MAAM;CACN,GAAI,WAAW,KAAA,IAAY,EAAE,OAAO,IAAI,CAAC;CACzC,GAAI,SAAS,KAAA,IAAY,EAAE,KAAK,IAAI,CAAC;CACrC,GAAI,SAAS,KAAA,IAAY,EAAE,KAAK,IAAI,CAAC;AACvC"}
1
+ {"version":3,"file":"judge.js","names":[],"sources":["../src/judge.ts"],"mappings":";;;;;;AAQA,MAAa,aAAa,EACxB,QAAQ,MAGN,CAAC,OAAuB;CAC1B,MAAM;CACN;AACF;;;;;;;;;;AAWA,MAAa,gBAAgB,EAC3B,QACA,MACA,gBACiF;CACjF,MAAM;CACN,GAAI,WAAW,KAAA,IAAY,EAAE,OAAO,IAAI,CAAC;CACzC,GAAI,SAAS,KAAA,IAAY,EAAE,KAAK,IAAI,CAAC;CACrC,GAAI,aAAa,KAAA,IAAY,EAAE,SAAS,IAAI,CAAC;AAC/C"}
@@ -1,5 +1,5 @@
1
1
  import { n as isOneOf } from "./object-CLf2-tNq.js";
2
- import { n as fillDefaults } from "./record-BKmMvZ6O.js";
2
+ import { n as fillDefaults } from "./record-kk9M1hj-.js";
3
3
  //#region src/view/live.ts
4
4
  /** The progress file's name inside the run's staging directory. */
5
5
  const LIVE_FILE = "live.json";
@@ -84,4 +84,4 @@ function readableLiveProgress(value) {
84
84
  //#endregion
85
85
  export { liveApiPath as a, readableLiveProgress as c, isFinished as i, LIVE_FILE as n, liveCounts as o, LIVE_SCHEMA_VERSION as r, liveTranscriptPath as s, FINISHED as t };
86
86
 
87
- //# sourceMappingURL=live-jlfszAbb.js.map
87
+ //# sourceMappingURL=live-DYd2QEyR.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"live-jlfszAbb.js","names":[],"sources":["../src/view/live.ts"],"mappings":";;;;AAQA,MAAa,YAAY;AACzB,MAAa,sBAAsB;AAsDnC,MAAa,cAAc;AAC3B,MAAa,sBAAsB,OAAe,eAChD,YAAY,MAAM,sBAAsB,mBAAmB,UAAU;AAEvE,MAAa,WAAkC;CAAC;CAAQ;CAAQ;CAAe;AAAS;AACxF,MAAa,cAAc,WAAuB,SAAS,SAAS,MAAM;AAE1E,SAAgB,WAAW,UAA8D;CACvF,MAAM,SAAS,GAAG,aAChB,SAAS,QAAQ,MAAM,SAAS,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;CACtD,OAAO;EACL,MAAM,MAAM,GAAG,QAAQ;EACvB,QAAQ,MAAM,MAAM;EACpB,QAAQ,MAAM,MAAM;EACpB,SAAS,MAAM,aAAa;EAC5B,SAAS,MAAM,SAAS;EACxB,SAAS,MAAM,SAAS;CAC1B;AACF;AAEA,MAAM,WAAkC;CAAC;CAAU;CAAW,GAAG;AAAQ;AACzE,MAAM,SAA+B;CAAC;CAAW;CAAc;AAAW;AAC1E,MAAM,SAAS,MACb,OAAO,MAAM,YAAY,MAAM,QAAQ,CAAC,MAAM,QAAQ,CAAC;AACzD,MAAM,OAAO,MAA4B,OAAO,MAAM;AACtD,MAAM,OAAO,MAA4B,OAAO,MAAM,YAAY,OAAO,SAAS,CAAC;AACnF,MAAM,UAAa,GAAY,OAC7B,MAAM,QAAQ,MAAM,KAAA,KAAa,GAAG,CAAC;AAEvC,SAAS,gBAAgB,GAAgC;CACvD,IAAI,CAAC,MAAM,CAAC,GAAG,OAAO;CACtB,MAAM,EAAE,KAAK,QAAQ,MAAM,MAAM,MAAM,GAAG,QAAQ,WAAW,eAAe;CAC5E,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,MAAM,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,OAAO;CAC3F,IAAI,CAAC,QAAQ,UAAU,MAAM,GAAG,OAAO;CACvC,IAAI,CAAC,OAAO,WAAW,GAAG,KAAK,CAAC,OAAO,YAAY,GAAG,GAAG,OAAO;CAChE,OAAO;EACL;EACA;EACA;EACA;EACA;EACA;EACA;EACA,WAAW,aAAa;EACxB,YAAY,cAAc;CAC5B;AACF;;;;;AAMA,SAAgB,qBAAqB,OAAqC;CACxE,IAAI,CAAC,MAAM,KAAK,KAAK,MAAM,kBAAA,GAAuC,OAAO;CACzE,aAAa,iBAAiB,KAAK;CACnC,MAAM,EAAE,OAAO,WAAW,KAAK,MAAM,aAAa,OAAO,aAAa;CACtE,IAAI,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,SAAS,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,WAAW,KAAK,CAAC,IAAI,GAAG,GAAG,OAAO;CAC3F,IAAI,CAAC,QAAQ,QAAQ,KAAK,KAAK,CAAC,MAAM,QAAQ,QAAQ,GAAG,OAAO;CAChE,MAAM,OAAO,SAAS,IAAI,eAAe;CACzC,IAAI,CAAC,KAAK,OAAO,MAAM,MAAM,IAAI,GAAG,OAAO;CAC3C,OAAO;EACL,eAAA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,SAAS,KAAK;EACd,QAAQ,WAAW,IAAI;EACvB,UAAU;CACZ;AACF"}
1
+ {"version":3,"file":"live-DYd2QEyR.js","names":[],"sources":["../src/view/live.ts"],"mappings":";;;;AAQA,MAAa,YAAY;AACzB,MAAa,sBAAsB;AAsDnC,MAAa,cAAc;AAC3B,MAAa,sBAAsB,OAAe,eAChD,YAAY,MAAM,sBAAsB,mBAAmB,UAAU;AAEvE,MAAa,WAAkC;CAAC;CAAQ;CAAQ;CAAe;AAAS;AACxF,MAAa,cAAc,WAAuB,SAAS,SAAS,MAAM;AAE1E,SAAgB,WAAW,UAA8D;CACvF,MAAM,SAAS,GAAG,aAChB,SAAS,QAAQ,MAAM,SAAS,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;CACtD,OAAO;EACL,MAAM,MAAM,GAAG,QAAQ;EACvB,QAAQ,MAAM,MAAM;EACpB,QAAQ,MAAM,MAAM;EACpB,SAAS,MAAM,aAAa;EAC5B,SAAS,MAAM,SAAS;EACxB,SAAS,MAAM,SAAS;CAC1B;AACF;AAEA,MAAM,WAAkC;CAAC;CAAU;CAAW,GAAG;AAAQ;AACzE,MAAM,SAA+B;CAAC;CAAW;CAAc;AAAW;AAC1E,MAAM,SAAS,MACb,OAAO,MAAM,YAAY,MAAM,QAAQ,CAAC,MAAM,QAAQ,CAAC;AACzD,MAAM,OAAO,MAA4B,OAAO,MAAM;AACtD,MAAM,OAAO,MAA4B,OAAO,MAAM,YAAY,OAAO,SAAS,CAAC;AACnF,MAAM,UAAa,GAAY,OAC7B,MAAM,QAAQ,MAAM,KAAA,KAAa,GAAG,CAAC;AAEvC,SAAS,gBAAgB,GAAgC;CACvD,IAAI,CAAC,MAAM,CAAC,GAAG,OAAO;CACtB,MAAM,EAAE,KAAK,QAAQ,MAAM,MAAM,MAAM,GAAG,QAAQ,WAAW,eAAe;CAC5E,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,MAAM,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,OAAO;CAC3F,IAAI,CAAC,QAAQ,UAAU,MAAM,GAAG,OAAO;CACvC,IAAI,CAAC,OAAO,WAAW,GAAG,KAAK,CAAC,OAAO,YAAY,GAAG,GAAG,OAAO;CAChE,OAAO;EACL;EACA;EACA;EACA;EACA;EACA;EACA;EACA,WAAW,aAAa;EACxB,YAAY,cAAc;CAC5B;AACF;;;;;AAMA,SAAgB,qBAAqB,OAAqC;CACxE,IAAI,CAAC,MAAM,KAAK,KAAK,MAAM,kBAAA,GAAuC,OAAO;CACzE,aAAa,iBAAiB,KAAK;CACnC,MAAM,EAAE,OAAO,WAAW,KAAK,MAAM,aAAa,OAAO,aAAa;CACtE,IAAI,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,SAAS,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,WAAW,KAAK,CAAC,IAAI,GAAG,GAAG,OAAO;CAC3F,IAAI,CAAC,QAAQ,QAAQ,KAAK,KAAK,CAAC,MAAM,QAAQ,QAAQ,GAAG,OAAO;CAChE,MAAM,OAAO,SAAS,IAAI,eAAe;CACzC,IAAI,CAAC,KAAK,OAAO,MAAM,MAAM,IAAI,GAAG,OAAO;CAC3C,OAAO;EACL,eAAA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,SAAS,KAAK;EACd,QAAQ,WAAW,IAAI;EACvB,UAAU;CACZ;AACF"}
@@ -1,6 +1,6 @@
1
1
  import { n as UsageError } from "./errors-B6BSMs03.js";
2
- import { a as isFakeJudge, c as judgeRoute } from "./judge-DW_GDOmB.js";
3
- import { n as analysisModelOf } from "./config-DrVSEVN0.js";
2
+ import { a as checkModelString, l as judgeRoute, o as isFakeJudge, s as judgeCredentials } from "./judge-Dt6KW6_O.js";
3
+ import { n as analysisModelOf } from "./config-Dv5MG7Rp.js";
4
4
  import { z } from "zod";
5
5
  import { Output, generateText } from "ai";
6
6
  //#region src/analysis/schema.ts
@@ -100,10 +100,10 @@ function judgeAside(config, task) {
100
100
  return ` (the judge, ${isFakeJudge(judge) ? "a fake judge" : judge}, is an evaluation model: it scores yes/no questions and can't ${task})`;
101
101
  }
102
102
  /** Which model analyses: `analysis.model`, else the judge's when it's a language model. */
103
- function analysisModelName(config, use = "analyze") {
103
+ function analysisModelName(config) {
104
104
  const model = defaultModel(config);
105
105
  if (model !== void 0) return model;
106
- throw new UsageError(`${use === "agent" ? `analysis.agent in ${config.file}` : "reeval analyze"} needs a language model. Set analysis: { model: 'google/gemini-3.8-flash' } in ${config.file}${judgeAside(config, "write an analysis")}${use === "agent" ? ", or turn agent off" : ", or run reeval analyze --context to hand the digest to your own coding agent"}.`);
106
+ throw new UsageError(`reeval analyze needs a language model. Set analysis: { model: 'google/gemini-3.8-flash' } in ${config.file}${judgeAside(config, "write an analysis")}, or run reeval analyze --context to hand the digest to your own coding agent.`);
107
107
  }
108
108
  /** The plan's name for the model a compare question without its own is answered by; null when none. */
109
109
  function questionModelLabel(config) {
@@ -123,9 +123,19 @@ function questionModel(config, question, where) {
123
123
  if (typeof model === "string" && isEvaluationModel(model)) throw new UsageError(`compare.questions "${question.question}" (${where}) would be answered by analysis.model in ${config.file}, "${model}", an evaluation model: it scores yes/no questions and can't pick between two attempts. Use a language model, e.g. 'google/gemini-3.8-flash', or ${fix}.`);
124
124
  return model;
125
125
  }
126
+ /**
127
+ * The variable `analysis.model` is missing when it's a provider model with no credential set: its
128
+ * provider's own key, else the AI Gateway's. Null when one is set, or for any other model.
129
+ */
130
+ function missingAnalysisKey(config, env = process.env) {
131
+ const model = analysisModelOf(config);
132
+ if (typeof model !== "string" || isEvaluationModel(model) || checkModelString(model)) return null;
133
+ const keys = judgeCredentials(model);
134
+ return keys.some((k) => env[k]) ? null : keys[0] ?? null;
135
+ }
126
136
  /** Checks the model and its credentials before any work; throws a UsageError (exit 2). */
127
- function resolveAnalysisModel(config, use = "analyze") {
128
- const model = analysisModelName(config, use);
137
+ function resolveAnalysisModel(config) {
138
+ const model = analysisModelName(config);
129
139
  if (isFake(model)) return {
130
140
  name: "fake",
131
141
  route: "fake",
@@ -139,37 +149,52 @@ function resolveAnalysisModel(config, use = "analyze") {
139
149
  };
140
150
  } catch (error) {
141
151
  const message = error.message.replace("judge model", "analysis model");
142
- throw new UsageError(use === "agent" ? message : `${message} Or run reeval analyze --context, which needs no key.`);
152
+ throw new UsageError(`${message} Or run reeval analyze --context, which needs no key.`);
143
153
  }
144
154
  }
145
- /** A language model that answers `text`, through the AI SDK's own parsing, or throws `error`. */
146
- function cannedModel(answer) {
155
+ /**
156
+ * A language model that answers `text`, through the AI SDK's own parsing, or throws `error`.
157
+ * With `countTokens`, it reports a token per 4 characters of its prompt and its answer, so a
158
+ * token budget applies to it as it would to a real model; otherwise it reports none.
159
+ */
160
+ function cannedModel(answer, countTokens = false) {
147
161
  return {
148
162
  specificationVersion: "v4",
149
163
  provider: "fake",
150
164
  modelId: "fake-analysis",
151
165
  supportedUrls: {},
152
- doGenerate: async () => {
166
+ doGenerate: async (options) => {
153
167
  if ("error" in answer) throw new Error(answer.error);
168
+ const input = countTokens ? Math.ceil(JSON.stringify(options.prompt).length / 4) : 0;
169
+ let output = countTokens ? Math.ceil(answer.text.length / 4) : 0;
170
+ let text = answer.text;
171
+ const cut = countTokens && options.maxOutputTokens !== void 0 && output > options.maxOutputTokens;
172
+ if (cut) {
173
+ output = options.maxOutputTokens;
174
+ text = text.slice(0, output * 4);
175
+ }
154
176
  return {
155
177
  content: [{
156
178
  type: "text",
157
- text: answer.text
179
+ text
158
180
  }],
159
- finishReason: {
181
+ finishReason: cut ? {
182
+ unified: "length",
183
+ raw: "max_tokens"
184
+ } : {
160
185
  unified: "stop",
161
186
  raw: "stop"
162
187
  },
163
188
  usage: {
164
189
  inputTokens: {
165
- total: 0,
166
- noCache: 0,
190
+ total: input,
191
+ noCache: input,
167
192
  cacheRead: 0,
168
193
  cacheWrite: 0
169
194
  },
170
195
  outputTokens: {
171
- total: 0,
172
- text: 0,
196
+ total: output,
197
+ text: output,
173
198
  reasoning: 0
174
199
  }
175
200
  },
@@ -228,6 +253,6 @@ async function callAnalysisModel(model, digest, prompt, maxOutputTokens) {
228
253
  };
229
254
  }
230
255
  //#endregion
231
- export { providerModel as a, resolveAnalysisModel as c, isFake as i, SYSTEM_PROMPT as l, callAnalysisModel as n, questionModel as o, cannedModel as r, questionModelLabel as s, analysisModelName as t };
256
+ export { missingAnalysisKey as a, questionModelLabel as c, isFake as i, resolveAnalysisModel as l, callAnalysisModel as n, providerModel as o, cannedModel as r, questionModel as s, analysisModelName as t, SYSTEM_PROMPT as u };
232
257
 
233
- //# sourceMappingURL=model-D0IcOQao.js.map
258
+ //# sourceMappingURL=model-B-mel-Gv.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-B-mel-Gv.js","names":[],"sources":["../src/analysis/schema.ts","../src/analysis/model.ts"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export { t as analysisModelName, n as callAnalysisModel, r as cannedModel, i as isFake, a as missingAnalysisKey, o as providerModel, s as questionModel, c as questionModelLabel, l as resolveAnalysisModel } from "./model-B-mel-Gv.js";
@@ -1,4 +1,4 @@
1
- import { c as judgeRoute } from "./judge-DW_GDOmB.js";
1
+ import { l as judgeRoute } from "./judge-Dt6KW6_O.js";
2
2
  import { i as debugTrace } from "./attempt-CGPV3BZY.js";
3
3
  import { experimental_decide } from "ai";
4
4
  import { google } from "@ai-sdk/google";
@@ -41,4 +41,4 @@ async function scoreWithModel(model, question, state, providerOptions, signal) {
41
41
  //#endregion
42
42
  export { scoreWithModel };
43
43
 
44
- //# sourceMappingURL=model-DaVCY3rb.js.map
44
+ //# sourceMappingURL=model-C7tSwT7f.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"model-DaVCY3rb.js","names":["decide"],"sources":["../src/judge/model.ts"],"mappings":";;;;;;AASA,eAAe,aACb,OACwB;CACxB,IAAI,OAAO,UAAU,UAAU,OAAO;CACtC,MAAM,QAAQ,WAAW,KAAK;CAC9B,IAAI,MAAM,SAAS,WAAW,OAAO;CACrC,MAAM,KAAK,MAAM,MAAM,MAAM,SAAS,SAAS,CAAC;CAChD,IAAI,MAAM,aAAa,UAAU,OAAO,OAAO,cAAc,EAAE;CAC/D,MAAM,EAAE,eAAe,MAAM,OAAO;CACpC,OAAO,WAAW,cAAc,EAAE;AACpC;AAEA,eAAsB,eACpB,OACA,UACA,OACA,iBACA,QAC+D;CAC/D,MAAM,SAAS,MAAMA,oBAAO;EAC1B,OAAO,MAAM,aAAa,KAAK;EAC/B;EACA,WAAW,EAAE,QAAQ;GAAE,MAAM;GAAW,cAAc;EAAS,EAAE;EACjE;EACA,aAAa;EAEb,YAAY;CACd,CAAC;CACD,MAAM,EAAE,SAAS,OAAO,UAAU,UAAU,qBAAqB;CACjE,WACE,SACA,qBACA;EAAE;EAAS;EAAO;EAAU;EAAU;CAAiB,GACvD,yBACF;CACA,OAAO;EAAE,OAAO,OAAO,QAAQ,OAAO;EAAa,eAAe,OAAO,UAAU;CAAQ;AAC7F"}
1
+ {"version":3,"file":"model-C7tSwT7f.js","names":["decide"],"sources":["../src/judge/model.ts"],"mappings":";;;;;;AASA,eAAe,aACb,OACwB;CACxB,IAAI,OAAO,UAAU,UAAU,OAAO;CACtC,MAAM,QAAQ,WAAW,KAAK;CAC9B,IAAI,MAAM,SAAS,WAAW,OAAO;CACrC,MAAM,KAAK,MAAM,MAAM,MAAM,SAAS,SAAS,CAAC;CAChD,IAAI,MAAM,aAAa,UAAU,OAAO,OAAO,cAAc,EAAE;CAC/D,MAAM,EAAE,eAAe,MAAM,OAAO;CACpC,OAAO,WAAW,cAAc,EAAE;AACpC;AAEA,eAAsB,eACpB,OACA,UACA,OACA,iBACA,QAC+D;CAC/D,MAAM,SAAS,MAAMA,oBAAO;EAC1B,OAAO,MAAM,aAAa,KAAK;EAC/B;EACA,WAAW,EAAE,QAAQ;GAAE,MAAM;GAAW,cAAc;EAAS,EAAE;EACjE;EACA,aAAa;EAEb,YAAY;CACd,CAAC;CACD,MAAM,EAAE,SAAS,OAAO,UAAU,UAAU,qBAAqB;CACjE,WACE,SACA,qBACA;EAAE;EAAS;EAAO;EAAU;EAAU;CAAiB,GACvD,yBACF;CACA,OAAO;EAAE,OAAO,OAAO,QAAQ,OAAO;EAAa,eAAe,OAAO,UAAU;CAAQ;AAC7F"}
@@ -1,8 +1,8 @@
1
1
  import { c as shardPath, i as manifestPath, s as shardOf } from "./paths-BmR-7tx3.js";
2
- import { n as clip } from "./text-gEcKjAyp.js";
2
+ import { n as clip } from "./text-CrVy5ioL.js";
3
3
  import { a as totalTokens, i as sumUsage, n as formatTokens, r as promptTokens } from "./usage-CleNKkly.js";
4
- import { c as readableTranscriptLine } from "./record-BKmMvZ6O.js";
5
- import { s as sampleReasons } from "./pairs-CnInRu-G.js";
4
+ import { l as readableTranscriptLine } from "./record-kk9M1hj-.js";
5
+ import { s as sampleReasons } from "./pairs-DP6XOJby.js";
6
6
  //#region src/view/compare.ts
7
7
  const STACK_FIELDS = [
8
8
  {
@@ -151,6 +151,29 @@ function outcomeOf(cells) {
151
151
  return outcomes.every((o) => o === "skipped") ? "skipped" : "pass";
152
152
  }
153
153
  /**
154
+ * Whether a failing eval failed only on attempts the run's interrupt cancelled: every failed
155
+ * attempt in a gated cell was cut short, so the agent didn't fail it (`reeval show`'s `cancelled`).
156
+ */
157
+ const cancelledOn = (outcome, cells) => {
158
+ const gated = cells.filter((c) => c.gate !== "none");
159
+ return outcome === "fail" && gated.some((c) => c.fail > 0) && gated.every((c) => c.fail === (c.cancelled ?? 0));
160
+ };
161
+ function cancelledSides(outcomes, cells) {
162
+ const sides = ["base", "head"].filter((s) => cancelledOn(outcomes[s], cells[s] ?? []));
163
+ return sides.length ? { cancelled: sides } : {};
164
+ }
165
+ /** An eval only head has. */
166
+ const addedRow = (h) => ({
167
+ id: h.id,
168
+ base: null,
169
+ head: h.outcome,
170
+ status: "added",
171
+ ...cancelledSides({
172
+ base: null,
173
+ head: h.outcome
174
+ }, { head: h.cells })
175
+ });
176
+ /**
154
177
  * When two runs of an eval differ only in which cells ran (a filtered run, a harness added), its
155
178
  * outcome on the cells both have, and the cells only one has. Null when no cell is shared or a
156
179
  * shared cell changed.
@@ -160,12 +183,17 @@ function sharedScope(b, h) {
160
183
  const shared = h.cells.filter((c) => before.has(c.key));
161
184
  if (!shared.length || shared.some((c) => before.get(c.key)?.fingerprint !== c.fingerprint)) return null;
162
185
  const keys = new Set(h.cells.map((c) => c.key));
186
+ const baseCells = shared.map((c) => before.get(c.key) ?? c);
163
187
  return {
164
- base: outcomeOf(shared.map((c) => before.get(c.key) ?? c)),
188
+ base: outcomeOf(baseCells),
165
189
  head: outcomeOf(shared),
166
190
  cells: {
167
191
  added: h.cells.filter((c) => !before.has(c.key)).map((c) => c.key),
168
192
  removed: b.cells.filter((c) => !keys.has(c.key)).map((c) => c.key)
193
+ },
194
+ over: {
195
+ base: baseCells,
196
+ head: shared
169
197
  }
170
198
  };
171
199
  }
@@ -192,27 +220,34 @@ function compare(base, head) {
192
220
  return [.../* @__PURE__ */ new Set([...head.evals.map((e) => e.id), ...base.evals.map((e) => e.id)])].map((id) => {
193
221
  const b = base.evals.find((e) => e.id === id);
194
222
  const h = head.evals.find((e) => e.id === id);
195
- if (!b) return {
196
- id,
197
- base: null,
198
- head: h?.outcome ?? null,
199
- status: "added"
200
- };
223
+ if (!b) return addedRow(h);
201
224
  if (!h) return {
202
225
  id,
203
226
  base: b.outcome,
204
227
  head: null,
205
- status: "removed"
228
+ status: "removed",
229
+ ...cancelledSides({
230
+ base: b.outcome,
231
+ head: null
232
+ }, { base: b.cells })
206
233
  };
207
234
  const scoped = b.fingerprint === h.fingerprint ? null : sharedScope(b, h);
208
- const row = scoped ? {
209
- id,
210
- ...scoped
235
+ const outcomes = scoped ? {
236
+ base: scoped.base,
237
+ head: scoped.head
211
238
  } : {
212
- id,
213
239
  base: b.outcome,
214
240
  head: h.outcome
215
241
  };
242
+ const row = {
243
+ id,
244
+ ...outcomes,
245
+ ...scoped ? { cells: scoped.cells } : {},
246
+ ...cancelledSides(outcomes, scoped?.over ?? {
247
+ base: b.cells,
248
+ head: h.cells
249
+ })
250
+ };
216
251
  const perCell = compareCells(b, h);
217
252
  if (perCell.length) row.perCell = perCell;
218
253
  if (row.base === "infra_error" || row.head === "infra_error") return {
@@ -224,6 +259,10 @@ function compare(base, head) {
224
259
  status: "drift",
225
260
  changes: whyChanged(b, h)
226
261
  };
262
+ if (row.cancelled) return {
263
+ ...row,
264
+ status: "drift"
265
+ };
227
266
  if (graderChanged && row.base !== row.head) return {
228
267
  ...row,
229
268
  status: "drift"
@@ -281,6 +320,8 @@ function liftInterval(variant, control) {
281
320
  high: points + Math.sqrt((a.high - p1) ** 2 + (p2 - b.low) ** 2)
282
321
  };
283
322
  }
323
+ /** A 95% interval is within noise when it contains 0; touching 0 does not exclude it. */
324
+ const containsZero = (low, high) => low <= 0 && high >= 0;
284
325
  /** Rounded to three places, as the record stores rates and points. */
285
326
  const round3 = (x) => Math.round(x * 1e3) / 1e3;
286
327
  /** Linear-interpolated quantile (`q` from 0 to 1) of unsorted numbers; null for none. */
@@ -304,7 +345,10 @@ const choose = (n, k) => {
304
345
  /**
305
346
  * Two-sided Mann–Whitney (Wilcoxon rank-sum) p-value for `xs` against `ys`: exact, by every split
306
347
  * of the pooled values, with mid-ranks for ties; the normal approximation with a tie correction
307
- * above `EXACT_LIMIT` splits. Null when either side is empty.
348
+ * above `EXACT_LIMIT` splits. `sign` is the sign of `xs`'s rank sum minus its expectation: below 0,
349
+ * `xs` ranks lower. `floor` is the smallest p any split of these pooled values could give, so ties
350
+ * count: `[2, 2, 2, 3]` against `[2, 2, 3, 3]` can never go below 10/70. Null when either side is
351
+ * empty.
308
352
  */
309
353
  function mannWhitney(xs, ys) {
310
354
  const n1 = xs.length;
@@ -323,30 +367,57 @@ function mannWhitney(xs, ys) {
323
367
  }
324
368
  const n = n1 + n2;
325
369
  const expected = n1 * (n + 1) / 2;
326
- const observed = Math.abs(ranks.slice(0, n1).reduce((a, b) => a + b, 0) - expected);
370
+ const deviation = ranks.slice(0, n1).reduce((a, b) => a + b, 0) - expected;
371
+ const sign = Math.sign(deviation);
372
+ const observed = Math.abs(deviation);
327
373
  if (choose(n, n1) > EXACT_LIMIT) {
328
374
  const counts = /* @__PURE__ */ new Map();
329
375
  for (const { v } of pooled) counts.set(v, (counts.get(v) ?? 0) + 1);
330
376
  const ties = [...counts.values()].reduce((a, t) => a + t ** 3 - t, 0);
331
377
  const variance = n1 * n2 / 12 * (n + 1 - ties / (n * (n - 1)));
332
- if (variance <= 0) return 1;
333
- const z = Math.max(0, observed - .5) / Math.sqrt(variance);
334
- return Math.min(1, 2 * (1 - normalCdf(z)));
378
+ if (variance <= 0) return {
379
+ p: 1,
380
+ sign,
381
+ floor: 1
382
+ };
383
+ const pOf = (d) => Math.min(1, 2 * (1 - normalCdf(Math.max(0, d - .5) / Math.sqrt(variance))));
384
+ const sorted = pooled.map(({ i }) => ranks[i]);
385
+ const sum = (rs) => rs.reduce((a, b) => a + b, 0);
386
+ const widest = Math.max(Math.abs(sum(sorted.slice(0, n1)) - expected), Math.abs(sum(sorted.slice(n - n1)) - expected));
387
+ return {
388
+ p: pOf(observed),
389
+ sign,
390
+ floor: pOf(widest)
391
+ };
335
392
  }
336
393
  let extreme = 0;
394
+ let widest = 0;
395
+ let atWidest = 0;
337
396
  let total = 0;
338
397
  const pick = (start, left, sum) => {
339
398
  if (left === 0) {
340
399
  total++;
341
- if (Math.abs(sum - expected) >= observed - 1e-9) extreme++;
400
+ const d = Math.abs(sum - expected);
401
+ if (d >= observed - 1e-9) extreme++;
402
+ if (d > widest + 1e-9) {
403
+ widest = d;
404
+ atWidest = 1;
405
+ } else if (d >= widest - 1e-9) atWidest++;
342
406
  return;
343
407
  }
344
408
  for (let i = start; i <= n - left; i++) pick(i + 1, left - 1, sum + ranks[i]);
345
409
  };
346
410
  pick(0, n1, 0);
347
- return extreme / total;
411
+ return {
412
+ p: extreme / total,
413
+ sign,
414
+ floor: atWidest / total
415
+ };
348
416
  }
349
- /** The smallest two-sided p an exact rank test can reach with these group sizes. */
417
+ /**
418
+ * The smallest two-sided p an exact rank test can reach with these group sizes and no ties: for
419
+ * planning `runs` before there's data. On data, `mannWhitney`'s `floor` counts the ties.
420
+ */
350
421
  const minimumP = (n1, n2) => n1 === 0 || n2 === 0 ? 1 : Math.min(1, 2 / choose(n1 + n2, n1));
351
422
  /**
352
423
  * The difference of two paired pass rates (variant minus control) with Newcombe's score interval
@@ -382,9 +453,14 @@ function mcnemar(variantOnly, controlOnly) {
382
453
  const n = variantOnly + controlOnly;
383
454
  if (n === 0) return 1;
384
455
  const low = Math.min(variantOnly, controlOnly);
385
- let tail = 0;
386
- for (let i = 0; i <= low; i++) tail += choose(n, i) / 2 ** n;
387
- return Math.min(1, 2 * tail);
456
+ let logTerm = -n * Math.LN2;
457
+ let logTail = logTerm;
458
+ for (let i = 0; i < low; i++) {
459
+ logTerm += Math.log((n - i) / (i + 1));
460
+ const top = Math.max(logTail, logTerm);
461
+ logTail = top + Math.log1p(Math.exp(Math.min(logTail, logTerm) - top));
462
+ }
463
+ return Math.min(1, 2 * Math.exp(logTail));
388
464
  }
389
465
  /** Two-sided 95% Student t quantiles for 1 to 30 degrees of freedom. */
390
466
  const T975 = [
@@ -454,7 +530,10 @@ function meanInterval(values) {
454
530
  /**
455
531
  * Two-sided Wilcoxon signed-rank p for paired differences: zeros dropped, mid-ranks for ties,
456
532
  * exact over every sign assignment up to 20 non-zero differences, else the normal approximation.
457
- * Null when every difference is zero.
533
+ * `sign` is the sign of the positive differences' rank sum minus its expectation: below 0, the
534
+ * negative differences outrank the positive ones. Null when every difference is zero. Ties are
535
+ * exact equality, so form each difference of two rates with one division (`(a·d − c·b) / (b·d)`),
536
+ * never as `a/b − c/d`.
458
537
  */
459
538
  function signedRank(differences) {
460
539
  const d = differences.filter((x) => x !== 0);
@@ -473,15 +552,22 @@ function signedRank(differences) {
473
552
  }
474
553
  const total = n * (n + 1) / 2;
475
554
  const plus = d.reduce((s, v, i) => v > 0 ? s + ranks[i] : s, 0);
555
+ const sign = Math.sign(plus - total / 2);
476
556
  const observed = Math.abs(plus - total / 2);
477
557
  if (n > 20) {
478
558
  const counts = /* @__PURE__ */ new Map();
479
559
  for (const { a } of sorted) counts.set(a, (counts.get(a) ?? 0) + 1);
480
560
  const ties = [...counts.values()].reduce((s, t) => s + t ** 3 - t, 0);
481
561
  const variance = n * (n + 1) * (2 * n + 1) / 24 - ties / 48;
482
- if (variance <= 0) return 1;
562
+ if (variance <= 0) return {
563
+ p: 1,
564
+ sign
565
+ };
483
566
  const z = Math.max(0, observed - .5) / Math.sqrt(variance);
484
- return Math.min(1, 2 * (1 - normalCdf(z)));
567
+ return {
568
+ p: Math.min(1, 2 * (1 - normalCdf(z))),
569
+ sign
570
+ };
485
571
  }
486
572
  let extreme = 0;
487
573
  for (let mask = 0; mask < 2 ** n; mask++) {
@@ -489,7 +575,10 @@ function signedRank(differences) {
489
575
  for (let i = 0; i < n; i++) if (mask & 1 << i) sum += ranks[i];
490
576
  if (Math.abs(sum - total / 2) >= observed - 1e-9) extreme++;
491
577
  }
492
- return extreme / 2 ** n;
578
+ return {
579
+ p: extreme / 2 ** n,
580
+ sign
581
+ };
493
582
  }
494
583
  function normalCdf(z) {
495
584
  const t = 1 / (1 + .3275911 * Math.abs(z) / Math.SQRT2);
@@ -527,20 +616,24 @@ function effortOf(samples) {
527
616
  ...tokens.length ? { tokens: spread(tokens) } : {}
528
617
  };
529
618
  }
530
- /** The verdict of an exact rank test of `xs` (variant) against `ys` (control). */
619
+ /**
620
+ * The verdict of an exact rank test of `xs` (variant) against `ys` (control). Its direction is
621
+ * the test's (which side ranks lower), not the medians', which can be equal or disagree.
622
+ */
531
623
  function effortVerdict(xs, ys) {
532
- const p = mannWhitney(xs, ys);
533
- if (minimumP(xs.length, ys.length) >= .05) return {
624
+ const test = mannWhitney(xs, ys);
625
+ const p = test?.p ?? null;
626
+ if (test === null || test.floor >= .05) return {
534
627
  p,
535
628
  verdict: "insufficient"
536
629
  };
537
- if (p === null || p >= .05) return {
630
+ if (test.p >= .05) return {
538
631
  p,
539
632
  verdict: "noise"
540
633
  };
541
634
  return {
542
635
  p,
543
- verdict: (median(xs) ?? 0) < (median(ys) ?? 0) ? "fewer" : "more"
636
+ verdict: test.sign < 0 ? "fewer" : "more"
544
637
  };
545
638
  }
546
639
  const ratio = (a, b) => b === 0 ? null : a / b;
@@ -797,7 +890,7 @@ function liftForKey(variant, control) {
797
890
  pass: variant.pass,
798
891
  counted: variant.counted
799
892
  },
800
- withinNoise: low < 0 && high > 0
893
+ withinNoise: containsZero(low, high)
801
894
  };
802
895
  }
803
896
  /** Per-key pass/counted for one cell's counted attempts, with lift on a variant when both sides qualify. */
@@ -1009,11 +1102,13 @@ function activityLabel(a) {
1009
1102
  return `${plural(a.tools, "tool call")} · ${plural(a.fileEdits, "file edit")}`;
1010
1103
  }
1011
1104
  /**
1012
- * A run's outcome, as `reeval run`'s exit code has it: a failed gated cell (or a budget stop) fails
1013
- * the run, while failures in ungated cells (controls, by default) don't.
1105
+ * A run's outcome, which `reeval run`'s exit code is read from: an error outside any attempt, a
1106
+ * failed gated cell or a budget stop fails the run, while failures in ungated cells (controls, by
1107
+ * default) don't. An interrupted run is `skipped`, whatever ran.
1014
1108
  */
1015
1109
  function runOutcome(run) {
1016
1110
  if (run.status === "interrupted") return "skipped";
1111
+ if (run.errors?.length) return "fail";
1017
1112
  const outcomes = [...run.evals, ...run.families ?? []].map((e) => e.outcome);
1018
1113
  if (outcomes.includes("fail") || run.status === "budget") return "fail";
1019
1114
  if (outcomes.includes("infra_error")) return "infra_error";
@@ -1369,6 +1464,6 @@ const findAttempt = (e, attemptId) => e.attempts.find((a) => a.id === attemptId)
1369
1464
  /** The attempt to open by default: the first failure, else the first attempt. */
1370
1465
  const defaultAttempt = (e) => e.attempts.find((a) => a.outcome === "fail" || a.outcome === "infra_error") ?? e.attempts[0];
1371
1466
  //#endregion
1372
- export { contrastEffort as $, splitPatch as A, judgeRatesLabel as B, parseTranscript as C, whyChanged as Ct, runtimeLabel as D, runRows as E, checkLabels as F, EFFORT_ALPHA as G, summaryJudgeRates as H, collapsedJudgeLabel as I, VERDICT_TEXT as J, EFFORT_MIN_RUNS as K, collapsedJudges as L, LIFT_MIN_COUNTED as M, cellJudgeRates as N, shortSha as O, cellUsage as P, cellSamples as Q, commandLine as R, languageLabel as S, stackChanges as St, runOutcome as T, uniqueJudgeLabels as U, labelledJudgements as V, DIRECTIONAL_MIN as W, cellContrast as X, bothUnderATenth as Y, cellEffort as Z, harnessLabel as _, signedRank as _t, cellRows as a, effortSummary as at, isMatrix as b, compare as bt, evalHistory as c, formatRatio as ct, failedJudgeLabels as d, liftInterval as dt, directional as et, findAttempt as f, mcnemar as ft, formatUsage as g, round3 as gt, formatPercent as h, pairedLiftInterval as ht, buildIndex as i, effortSample as it, transcriptItems as j, splitEvalId as k, evalMarkOutcome as l, formatSeconds as lt, formatDuration as m, median as mt, activityLabel as n, effortLabel as nt, compareView as o, effortVerdict as ot, findEval as p, meanInterval as pt, TOKENS_UNREPORTED as q, answerRows as r, effortOf as rt, defaultAttempt as s, formatCount as st, COMPARE_ORDER as t, effortChangeLabel as tt, evalTree as u, tokenValues as ut, hasUngatedCells as v, wilson as vt, runLead as w, isUngatedMiss as x, sourceChanges as xt, indexFiles as y, cellsChanged as yt, judgeLabel as z };
1467
+ export { contrastEffort as $, splitPatch as A, judgeRatesLabel as B, parseTranscript as C, sourceChanges as Ct, runtimeLabel as D, runRows as E, checkLabels as F, EFFORT_ALPHA as G, summaryJudgeRates as H, collapsedJudgeLabel as I, VERDICT_TEXT as J, EFFORT_MIN_RUNS as K, collapsedJudges as L, LIFT_MIN_COUNTED as M, cellJudgeRates as N, shortSha as O, cellUsage as P, cellSamples as Q, commandLine as R, languageLabel as S, compare as St, runOutcome as T, whyChanged as Tt, uniqueJudgeLabels as U, labelledJudgements as V, DIRECTIONAL_MIN as W, cellContrast as X, bothUnderATenth as Y, cellEffort as Z, harnessLabel as _, round3 as _t, cellRows as a, effortSummary as at, isMatrix as b, addedRow as bt, evalHistory as c, formatRatio as ct, failedJudgeLabels as d, containsZero as dt, directional as et, findAttempt as f, liftInterval as ft, formatUsage as g, pairedLiftInterval as gt, formatPercent as h, median as ht, buildIndex as i, effortSample as it, transcriptItems as j, splitEvalId as k, evalMarkOutcome as l, formatSeconds as lt, formatDuration as m, meanInterval as mt, activityLabel as n, effortLabel as nt, compareView as o, effortVerdict as ot, findEval as p, mcnemar as pt, TOKENS_UNREPORTED as q, answerRows as r, effortOf as rt, defaultAttempt as s, formatCount as st, COMPARE_ORDER as t, effortChangeLabel as tt, evalTree as u, tokenValues as ut, hasUngatedCells as v, signedRank as vt, runLead as w, stackChanges as wt, isUngatedMiss as x, cellsChanged as xt, indexFiles as y, wilson as yt, judgeLabel as z };
1373
1468
 
1374
- //# sourceMappingURL=model-DaX4bNLZ.js.map
1469
+ //# sourceMappingURL=model-CWlAqmbU.js.map