reeval 0.11.0 → 0.13.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 (312) hide show
  1. package/README.md +115 -257
  2. package/assets/package.json +1 -1
  3. package/assets/pnpm-lock.yaml +41 -30
  4. package/bin/mcp-timer.cjs +224 -0
  5. package/dist/{adapter-Bwy3QxAK.js → adapter-IKKo4sZj.js} +4 -4
  6. package/dist/{adapter-Bwy3QxAK.js.map → adapter-IKKo4sZj.js.map} +1 -1
  7. package/dist/{agent-DpE80WPz.js → agent-ClE-g9VL.js} +22 -7
  8. package/dist/{agent-DpE80WPz.js.map → agent-ClE-g9VL.js.map} +1 -1
  9. package/dist/{analysis-Bxub9LMT.js → analysis-B0nOfAzA.js} +3 -3
  10. package/dist/{analysis-Bxub9LMT.js.map → analysis-B0nOfAzA.js.map} +1 -1
  11. package/dist/{assemble-D9GWr-HS.js → assemble-BO93VAk1.js} +22 -20
  12. package/dist/assemble-BO93VAk1.js.map +1 -0
  13. package/dist/assemble-VQxyoDxK.js +1 -0
  14. package/dist/{attempt-CGPV3BZY.js → attempt-jI0OWxlz.js} +2 -2
  15. package/dist/{attempt-CGPV3BZY.js.map → attempt-jI0OWxlz.js.map} +1 -1
  16. package/dist/bridge/index.mjs +2 -1
  17. package/dist/{capture-BQlGHiMC.js → capture-dn2hjSLj.js} +29 -21
  18. package/dist/{capture-BQlGHiMC.js.map → capture-dn2hjSLj.js.map} +1 -1
  19. package/dist/capture-nIJ-7kUE.js +1 -0
  20. package/dist/{cli-ClpPT8kn.js → cli-BCE1xlm4.js} +176 -120
  21. package/dist/cli-BCE1xlm4.js.map +1 -0
  22. package/dist/{cli-spec-qmEnQ25_.js → cli-spec-BXIBUlaK.js} +34 -15
  23. package/dist/cli-spec-BXIBUlaK.js.map +1 -0
  24. package/dist/cli.js +2 -2
  25. package/dist/{command-BlM0y8jN.js → command-Bh3yhN_b.js} +8 -8
  26. package/dist/{command-BlM0y8jN.js.map → command-Bh3yhN_b.js.map} +1 -1
  27. package/dist/command-C6vwmjS7.js +91 -0
  28. package/dist/command-C6vwmjS7.js.map +1 -0
  29. package/dist/{command-DbAe1Rzb.js → command-CANun0m0.js} +16 -19
  30. package/dist/command-CANun0m0.js.map +1 -0
  31. package/dist/command-CBaHukyl.js +335 -0
  32. package/dist/command-CBaHukyl.js.map +1 -0
  33. package/dist/{command-TgbzPizb.js → command-D_kEnYcX.js} +17 -16
  34. package/dist/command-D_kEnYcX.js.map +1 -0
  35. package/dist/commands-7tH3EsVu.js +666 -0
  36. package/dist/commands-7tH3EsVu.js.map +1 -0
  37. package/dist/{commands-CthqwkAn.js → commands-BKGzBMgb.js} +1 -1
  38. package/dist/{config-DrVSEVN0.js → config-D7TFvUpL.js} +40 -55
  39. package/dist/config-D7TFvUpL.js.map +1 -0
  40. package/dist/{context-C1mxXh80.js → context-Dgn48BqT.js} +13 -2
  41. package/dist/context-Dgn48BqT.js.map +1 -0
  42. package/dist/{contrasts-5zsj32gk.js → contrasts-B4nOhn0Z.js} +3 -3
  43. package/dist/{contrasts-5zsj32gk.js.map → contrasts-B4nOhn0Z.js.map} +1 -1
  44. package/dist/db-DJUuFoWQ.js +602 -0
  45. package/dist/db-DJUuFoWQ.js.map +1 -0
  46. package/dist/db-W9EFlXnn.js +2 -0
  47. package/dist/{dist-CuY4ehEk.js → dist-Dp_AJgYN.js} +3 -3
  48. package/dist/{dist-CuY4ehEk.js.map → dist-Dp_AJgYN.js.map} +1 -1
  49. package/dist/{docker-D1HZDS6q.js → docker-CQxucRPe.js} +16 -15
  50. package/dist/docker-CQxucRPe.js.map +1 -0
  51. package/dist/{docker-DNmMPOBb.js → docker-Dac6Zalz.js} +1 -1
  52. package/dist/{docker-DOvjji9I.js → docker-DuHcQidD.js} +3 -3
  53. package/dist/{docker-DOvjji9I.js.map → docker-DuHcQidD.js.map} +1 -1
  54. package/dist/{doctor-D2MbNO8L.js → doctor-De_QlOTM.js} +72 -38
  55. package/dist/doctor-De_QlOTM.js.map +1 -0
  56. package/dist/{egress-2-qzPvGi.js → egress-DEAvq8Fl.js} +453 -31
  57. package/dist/egress-DEAvq8Fl.js.map +1 -0
  58. package/dist/env-BQqj93gu.js +21 -0
  59. package/dist/env-BQqj93gu.js.map +1 -0
  60. package/dist/{environment-Cca6a4wB.js → environment-B4IuURK1.js} +247 -14
  61. package/dist/environment-B4IuURK1.js.map +1 -0
  62. package/dist/{evaluate-DMyaGQEj.d.ts → evaluate-C9-ritA5.d.ts} +2 -2
  63. package/dist/{evaluate-DKIl54Hb.js → evaluate-Djk1YPFL.js} +540 -560
  64. package/dist/evaluate-Djk1YPFL.js.map +1 -0
  65. package/dist/facts-Cfx1H70y.js +898 -0
  66. package/dist/facts-Cfx1H70y.js.map +1 -0
  67. package/dist/files-Bs6H3HiG.js +65 -0
  68. package/dist/files-Bs6H3HiG.js.map +1 -0
  69. package/dist/{files-BpUYBwGu.js → files-CN1QfenC.js} +31 -8
  70. package/dist/files-CN1QfenC.js.map +1 -0
  71. package/dist/files-CtjEXWXm.js +1 -0
  72. package/dist/{files-BXHZFWmx.js → files-D27nUk0K.js} +6 -17
  73. package/dist/files-D27nUk0K.js.map +1 -0
  74. package/dist/files-D3gJa91B.js +1 -0
  75. package/dist/generate-BnrvBAzF.js +1646 -0
  76. package/dist/generate-BnrvBAzF.js.map +1 -0
  77. package/dist/{git-Crl3b87o.js → git-rPfl7AD1.js} +3 -3
  78. package/dist/{git-Crl3b87o.js.map → git-rPfl7AD1.js.map} +1 -1
  79. package/dist/{harness-CEuntrla.js → harness-1OkumOAm.js} +3 -3
  80. package/dist/{harness-CEuntrla.js.map → harness-1OkumOAm.js.map} +1 -1
  81. package/dist/harness.d.ts +1 -1
  82. package/dist/harness.js +1 -1
  83. package/dist/{header-DHQv_ZrF.js → header-BVzbRnNv.js} +10 -3
  84. package/dist/{header-DHQv_ZrF.js.map → header-BVzbRnNv.js.map} +1 -1
  85. package/dist/{images-Bi3aGxb9.js → images-m784ueGK.js} +61 -13
  86. package/dist/images-m784ueGK.js.map +1 -0
  87. package/dist/index.d.ts +3 -3
  88. package/dist/index.js +4 -4
  89. package/dist/init-hiTkiM4L.js +543 -0
  90. package/dist/init-hiTkiM4L.js.map +1 -0
  91. package/dist/init-kMkTgTZc.js +1 -0
  92. package/dist/insights-B2Xmhz9o.js +64 -0
  93. package/dist/insights-B2Xmhz9o.js.map +1 -0
  94. package/dist/{invocations-BYDPe3fV.js → invocations-D_ePcwyL.js} +4 -4
  95. package/dist/{invocations-BYDPe3fV.js.map → invocations-D_ePcwyL.js.map} +1 -1
  96. package/dist/{judge-DW_GDOmB.js → judge-CEDIfRiU.js} +50 -15
  97. package/dist/judge-CEDIfRiU.js.map +1 -0
  98. package/dist/judge.d.ts +7 -6
  99. package/dist/judge.js +8 -7
  100. package/dist/judge.js.map +1 -1
  101. package/dist/{live-jlfszAbb.js → live-DYd2QEyR.js} +2 -2
  102. package/dist/{live-jlfszAbb.js.map → live-DYd2QEyR.js.map} +1 -1
  103. package/dist/model-B8H3gL69.js +1 -0
  104. package/dist/{model-DaVCY3rb.js → model-CTiuzkWw.js} +9 -7
  105. package/dist/model-CTiuzkWw.js.map +1 -0
  106. package/dist/model-DcIbmggK.js +1 -0
  107. package/dist/{model-D0IcOQao.js → model-DpkclE4r.js} +60 -25
  108. package/dist/model-DpkclE4r.js.map +1 -0
  109. package/dist/{model-DaX4bNLZ.js → model-UgHDMhI1.js} +144 -46
  110. package/dist/model-UgHDMhI1.js.map +1 -0
  111. package/dist/{node-B3ydHo6t.js → node-CGZYh4Fj.js} +4 -4
  112. package/dist/{node-B3ydHo6t.js.map → node-CGZYh4Fj.js.map} +1 -1
  113. package/dist/{opencode-providers-J9colP0-.js → opencode-providers-snfeWd6Z.js} +86 -47
  114. package/dist/opencode-providers-snfeWd6Z.js.map +1 -0
  115. package/dist/{options-C0d0AzeR.js → options-CyAyLjgJ.js} +22 -11
  116. package/dist/options-CyAyLjgJ.js.map +1 -0
  117. package/dist/{pairs-CnInRu-G.js → pairs-DP6XOJby.js} +2 -2
  118. package/dist/{pairs-CnInRu-G.js.map → pairs-DP6XOJby.js.map} +1 -1
  119. package/dist/{patch-B1bnfhN-.js → patch-uMq9rCl_.js} +2 -2
  120. package/dist/{patch-B1bnfhN-.js.map → patch-uMq9rCl_.js.map} +1 -1
  121. package/dist/{plan-DgQxp9yy.js → plan-CZYgXnZh.js} +21 -8
  122. package/dist/plan-CZYgXnZh.js.map +1 -0
  123. package/dist/plugins-P-uh54VF.js +654 -0
  124. package/dist/plugins-P-uh54VF.js.map +1 -0
  125. package/dist/{preflight-DlQvbySb.js → preflight-BQlPTHVu.js} +1 -1
  126. package/dist/{preflight-BRzD30L5.js → preflight-D3HvKeAx.js} +14 -10
  127. package/dist/preflight-D3HvKeAx.js.map +1 -0
  128. package/dist/prepare-DCwM2KKD.js +2 -0
  129. package/dist/{prepare-B_y-AFMv.js → prepare-Dx7dOnJB.js} +70 -23
  130. package/dist/prepare-Dx7dOnJB.js.map +1 -0
  131. package/dist/{provenance-DQ0AXn6c.js → provenance-C_-8y-x3.js} +4 -4
  132. package/dist/{provenance-DQ0AXn6c.js.map → provenance-C_-8y-x3.js.map} +1 -1
  133. package/dist/{providers-DoTq1jHW.js → providers-CF5UEaP8.js} +24 -10
  134. package/dist/providers-CF5UEaP8.js.map +1 -0
  135. package/dist/providers-CTBYvMxu.js +1 -0
  136. package/dist/{query-BO-ux7RB.js → query-DXthKmq0.js} +3 -3
  137. package/dist/{query-BO-ux7RB.js.map → query-DXthKmq0.js.map} +1 -1
  138. package/dist/query-D_1ARx5q.js +1 -0
  139. package/dist/{questions-C2dym2ce.js → questions-KENpWnfV.js} +8 -9
  140. package/dist/questions-KENpWnfV.js.map +1 -0
  141. package/dist/{record-BKmMvZ6O.js → record-kk9M1hj-.js} +8 -4
  142. package/dist/record-kk9M1hj-.js.map +1 -0
  143. package/dist/{redact-DJ9JCShu.js → redact-CRGdfV2s.js} +4 -2
  144. package/dist/redact-CRGdfV2s.js.map +1 -0
  145. package/dist/remarks-1521zwfW.js +38 -0
  146. package/dist/remarks-1521zwfW.js.map +1 -0
  147. package/dist/remarks-BhAV1H4V.js +1 -0
  148. package/dist/remarks-Ml6bcSdV.js +278 -0
  149. package/dist/remarks-Ml6bcSdV.js.map +1 -0
  150. package/dist/{remote-CPPW86Q9.js → remote-Dkeghk8k.js} +3 -3
  151. package/dist/{remote-CPPW86Q9.js.map → remote-Dkeghk8k.js.map} +1 -1
  152. package/dist/resolve-CMmhACr6.js +1 -0
  153. package/dist/resolve-DzdWcIL6.js +724 -0
  154. package/dist/resolve-DzdWcIL6.js.map +1 -0
  155. package/dist/{results-BE2f-1XS.js → results-D-naai_Q.js} +33 -8
  156. package/dist/results-D-naai_Q.js.map +1 -0
  157. package/dist/{resume-Ca1c8vix.js → resume-8-nnW8iO.js} +4 -4
  158. package/dist/{resume-Ca1c8vix.js.map → resume-8-nnW8iO.js.map} +1 -1
  159. package/dist/{root-DICDHCtp.js → root-DNuLhaA5.js} +2 -2
  160. package/dist/root-DNuLhaA5.js.map +1 -0
  161. package/dist/rules-CcV3zLDR.js +318 -0
  162. package/dist/rules-CcV3zLDR.js.map +1 -0
  163. package/dist/run-Bel7Vde4.js +88 -0
  164. package/dist/run-Bel7Vde4.js.map +1 -0
  165. package/dist/{sandbox-DLrsvu7U.js → sandbox-YLbk9mO7.js} +2 -2
  166. package/dist/{sandbox-DLrsvu7U.js.map → sandbox-YLbk9mO7.js.map} +1 -1
  167. package/dist/sandbox.d.ts +1 -1
  168. package/dist/sandbox.js +1 -1
  169. package/dist/server-C-ysqkLv.js +1 -0
  170. package/dist/{server-TUY5xA_A.js → server-De8oH3bt.js} +10 -10
  171. package/dist/{server-TUY5xA_A.js.map → server-De8oH3bt.js.map} +1 -1
  172. package/dist/{source-DJGS0a0u.js → source-C686eZpY.js} +2 -2
  173. package/dist/{source-DJGS0a0u.js.map → source-C686eZpY.js.map} +1 -1
  174. package/dist/source-DjgypUHW.js +1 -0
  175. package/dist/src-3mP821Pt.js +2 -0
  176. package/dist/src-B3KCLZVk.js +3 -0
  177. package/dist/src-BAyg6CtQ.js +2 -0
  178. package/dist/{src-CF17Ug08.js → src-BYLM3hEz.js} +22 -6
  179. package/dist/src-BYLM3hEz.js.map +1 -0
  180. package/dist/src-BezgGX4X.js +2 -0
  181. package/dist/{src-DvCg0NBs.js → src-C7W6kg81.js} +40 -10
  182. package/dist/{src-DvCg0NBs.js.map → src-C7W6kg81.js.map} +1 -1
  183. package/dist/{src-ftu5wPSt.js → src-CIpKL45U.js} +782 -169
  184. package/dist/src-CIpKL45U.js.map +1 -0
  185. package/dist/src-ChBhk06Q.js +2 -0
  186. package/dist/{src-BxfCKA3_.js → src-CoqZYspK.js} +1 -1
  187. package/dist/{src-CFp86GtV.js → src-CzQrAcF8.js} +49 -49
  188. package/dist/src-CzQrAcF8.js.map +1 -0
  189. package/dist/src-D9fSTxlc.js +1 -0
  190. package/dist/{src-FGXhkEkH.js → src-DeY52Gyf.js} +182 -23
  191. package/dist/src-DeY52Gyf.js.map +1 -0
  192. package/dist/src-DrJSnoMR.js +2 -0
  193. package/dist/{src-DvK0EIZx.js → src-Xj_BZKbq.js} +112 -13
  194. package/dist/src-Xj_BZKbq.js.map +1 -0
  195. package/dist/{src-u8_ixn_F.js → src-cbCb-MPy.js} +20 -4
  196. package/dist/src-cbCb-MPy.js.map +1 -0
  197. package/dist/src-dhSTRN50.js +2 -0
  198. package/dist/{src-C7_1SqDP.js → src-djNNYIdP.js} +2 -2
  199. package/dist/{src-C7_1SqDP.js.map → src-djNNYIdP.js.map} +1 -1
  200. package/dist/state-BGWGAwdo.js +1 -0
  201. package/dist/{state-DfpHox6b.js → state-C0i_ujQZ.js} +19 -17
  202. package/dist/{state-DfpHox6b.js.map → state-C0i_ujQZ.js.map} +1 -1
  203. package/dist/studio-app/assets/{index-CBkhNAv8.js → index-Bb_cid9k.js} +9 -9
  204. package/dist/studio-app/index.html +1 -1
  205. package/dist/{suite-Cw_7G2RM.js → suite-DmuF_ApO.js} +80 -30
  206. package/dist/suite-DmuF_ApO.js.map +1 -0
  207. package/dist/suite-mn9g4veR.js +2 -0
  208. package/dist/{summary-BUKfU-9l.js → summary-BFMHMTz2.js} +273 -47
  209. package/dist/summary-BFMHMTz2.js.map +1 -0
  210. package/dist/testing.d.ts +2 -2
  211. package/dist/testing.js +2 -2
  212. package/dist/{text-gEcKjAyp.js → text-CrVy5ioL.js} +18 -2
  213. package/dist/text-CrVy5ioL.js.map +1 -0
  214. package/dist/{transcript-BNNANU8A.js → transcript-BTxJpW4R.js} +2 -2
  215. package/dist/{transcript-BNNANU8A.js.map → transcript-BTxJpW4R.js.map} +1 -1
  216. package/dist/{types-BYdlwMwo.d.ts → types-B-9b1MDV.d.ts} +850 -34
  217. package/dist/types-C5vI3g1C.js.map +1 -1
  218. package/dist/usage-BDo2q_yu.js +1 -0
  219. package/dist/{command-Bj39y-Wm.js → validate-DWjkshl1.js} +20 -377
  220. package/dist/validate-DWjkshl1.js.map +1 -0
  221. package/dist/view/index.d.ts +31 -263
  222. package/dist/view/index.js +8 -7
  223. package/dist/views-DE2A1jEX.js +2 -0
  224. package/dist/{views-B8w2J-gD.js → views-Dk8MCQKr.js} +8 -98
  225. package/dist/views-Dk8MCQKr.js.map +1 -0
  226. package/dist/{worker-entry-DNnveLqx.js → worker-entry-CqrzGPF4.js} +2 -2
  227. package/dist/{worker-entry-DNnveLqx.js.map → worker-entry-CqrzGPF4.js.map} +1 -1
  228. package/dist/workspace-B1eGO46M.js +1 -0
  229. package/dist/{workspace-C4RA3srV.js → workspace-CLeOybkr.js} +45 -11
  230. package/dist/workspace-CLeOybkr.js.map +1 -0
  231. package/package.json +5 -1
  232. package/skills/eval-rubric/SKILL.md +130 -0
  233. package/dist/agent-D483ru7D.js +0 -334
  234. package/dist/agent-D483ru7D.js.map +0 -1
  235. package/dist/assemble-D5KGrwnJ.js +0 -1
  236. package/dist/assemble-D9GWr-HS.js.map +0 -1
  237. package/dist/capture-CYGLpWxR.js +0 -1
  238. package/dist/cli-ClpPT8kn.js.map +0 -1
  239. package/dist/cli-spec-qmEnQ25_.js.map +0 -1
  240. package/dist/command-Bj39y-Wm.js.map +0 -1
  241. package/dist/command-C-cVjlny.js +0 -1
  242. package/dist/command-DbAe1Rzb.js.map +0 -1
  243. package/dist/command-TgbzPizb.js.map +0 -1
  244. package/dist/commands-YUwlyTbr.js +0 -228
  245. package/dist/commands-YUwlyTbr.js.map +0 -1
  246. package/dist/config-DrVSEVN0.js.map +0 -1
  247. package/dist/context-C1mxXh80.js.map +0 -1
  248. package/dist/db-CKg5NtiW.js +0 -2
  249. package/dist/db-DfhipHEF.js +0 -1416
  250. package/dist/db-DfhipHEF.js.map +0 -1
  251. package/dist/docker-D1HZDS6q.js.map +0 -1
  252. package/dist/doctor-D2MbNO8L.js.map +0 -1
  253. package/dist/egress-2-qzPvGi.js.map +0 -1
  254. package/dist/environment-Cca6a4wB.js.map +0 -1
  255. package/dist/evaluate-DKIl54Hb.js.map +0 -1
  256. package/dist/files-BXHZFWmx.js.map +0 -1
  257. package/dist/files-BpUYBwGu.js.map +0 -1
  258. package/dist/files-Bw8lWEjg.js +0 -1
  259. package/dist/files-D6J0iSdx.js +0 -1
  260. package/dist/images-Bi3aGxb9.js.map +0 -1
  261. package/dist/init-Cl3f3NBT.js +0 -360
  262. package/dist/init-Cl3f3NBT.js.map +0 -1
  263. package/dist/init-fhOXED8F.js +0 -1
  264. package/dist/judge-DW_GDOmB.js.map +0 -1
  265. package/dist/model-CXhrziBe.js +0 -1
  266. package/dist/model-D0IcOQao.js.map +0 -1
  267. package/dist/model-DaVCY3rb.js.map +0 -1
  268. package/dist/model-DaX4bNLZ.js.map +0 -1
  269. package/dist/model-_bxNrk2h.js +0 -1
  270. package/dist/opencode-providers-J9colP0-.js.map +0 -1
  271. package/dist/options-C0d0AzeR.js.map +0 -1
  272. package/dist/plan-DgQxp9yy.js.map +0 -1
  273. package/dist/preflight-BRzD30L5.js.map +0 -1
  274. package/dist/prepare-B_y-AFMv.js.map +0 -1
  275. package/dist/prepare-DCKTLHN3.js +0 -2
  276. package/dist/providers-B9yTdIqF.js +0 -1
  277. package/dist/providers-DoTq1jHW.js.map +0 -1
  278. package/dist/query-CRQfsw0e.js +0 -1
  279. package/dist/questions-C2dym2ce.js.map +0 -1
  280. package/dist/record-BKmMvZ6O.js.map +0 -1
  281. package/dist/redact-DJ9JCShu.js.map +0 -1
  282. package/dist/results-BE2f-1XS.js.map +0 -1
  283. package/dist/root-DICDHCtp.js.map +0 -1
  284. package/dist/server-Dp8eOeK5.js +0 -1
  285. package/dist/source-DdbLGR1M.js +0 -1
  286. package/dist/src-CF17Ug08.js.map +0 -1
  287. package/dist/src-CFp86GtV.js.map +0 -1
  288. package/dist/src-CLoOMVWI.js +0 -3
  289. package/dist/src-CcrQbpG8.js +0 -2
  290. package/dist/src-DCFtJRp0.js +0 -2
  291. package/dist/src-DSYYPEOj.js +0 -2
  292. package/dist/src-DYO3DdnQ.js +0 -1
  293. package/dist/src-DvK0EIZx.js.map +0 -1
  294. package/dist/src-FGXhkEkH.js.map +0 -1
  295. package/dist/src-WD-zgQYZ.js +0 -2
  296. package/dist/src-_oI9AePb.js +0 -2
  297. package/dist/src-ftu5wPSt.js.map +0 -1
  298. package/dist/src-qsKCqv7a.js +0 -2
  299. package/dist/src-u8_ixn_F.js.map +0 -1
  300. package/dist/state-DpAxYyED.js +0 -1
  301. package/dist/suite-Cw_7G2RM.js.map +0 -1
  302. package/dist/suite-DamAEnNF.js +0 -1
  303. package/dist/summary-BUKfU-9l.js.map +0 -1
  304. package/dist/summary-Baa4rTHS.js +0 -192
  305. package/dist/summary-Baa4rTHS.js.map +0 -1
  306. package/dist/text-gEcKjAyp.js.map +0 -1
  307. package/dist/tools-DLHgetpx.js +0 -249
  308. package/dist/tools-DLHgetpx.js.map +0 -1
  309. package/dist/views-B8w2J-gD.js.map +0 -1
  310. package/dist/views-DblnI3kA.js +0 -2
  311. package/dist/workspace-C4RA3srV.js.map +0 -1
  312. package/dist/workspace-C_X0tdv6.js +0 -1
@@ -1,28 +1,30 @@
1
1
  import { n as isOneOf } from "./object-CLf2-tNq.js";
2
2
  import { n as UsageError } from "./errors-B6BSMs03.js";
3
3
  import { p as parseDuration } from "./shared-CA61BuPJ.js";
4
- import { f as sandboxId, s as harnessId } from "./options-C0d0AzeR.js";
5
- import { A as workspaceLabel, p as environmentSandbox } from "./environment-Cca6a4wB.js";
4
+ import { p as sandboxId, s as harnessId, u as plannedSandboxes } from "./options-CyAyLjgJ.js";
5
+ import { M as workspaceLabel, T as profileSandbox, p as environmentSandbox } from "./environment-B4IuURK1.js";
6
6
  import { a as fromCwd, o as newRunId } from "./ids-Bp6ut7ZD.js";
7
- import { _ as selectProfile, a as configLabel, d as hostCapacity, f as loadConfig, g as resolveConcurrency, h as requireConfig, l as findConfig, m as missingCredentials, o as configPathFor, p as malformedCredentials, u as hasAnalysisModel, v as inCI, y as loadEnvFiles } from "./config-DrVSEVN0.js";
8
- import { o as redactSecrets, s as registerSecret } from "./redact-DJ9JCShu.js";
9
- import { o as PACKAGE_VERSION } from "./root-DICDHCtp.js";
10
- import { I as LABEL, X as imageInfo } from "./src-ftu5wPSt.js";
7
+ import { c as registerSecret, s as redactSecrets } from "./redact-CRGdfV2s.js";
8
+ import { a as configPathFor, c as findConfig, d as loadConfig, f as malformedCredentials, g as selectProfile, h as resolveConcurrency, i as configLabel, l as hasAnalysisModel, m as requireConfig, p as missingCredentials, u as hostCapacity } from "./config-D7TFvUpL.js";
9
+ import { n as loadEnvFiles, t as inCI } from "./env-BQqj93gu.js";
10
+ import { W as LABEL, at as imageInfo } from "./src-CIpKL45U.js";
11
+ import { o as PACKAGE_VERSION } from "./root-DNuLhaA5.js";
12
+ import { C as pluginBuildsLabel } from "./plugins-P-uh54VF.js";
11
13
  import { s as debugTime } from "./debug-D24NOQH1.js";
12
- import { i as sandboxWarningLine, n as clip, r as formatDuration } from "./text-gEcKjAyp.js";
14
+ import { i as formatDuration, n as clip, o as sandboxWarningLine } from "./text-CrVy5ioL.js";
13
15
  import { t as PrepareError } from "./provider-CmAYTQQs.js";
14
- import { T as runOutcome, g as formatUsage } from "./model-DaX4bNLZ.js";
15
- import { s as suiteResult } from "./suite-Cw_7G2RM.js";
16
+ import { T as runOutcome, g as formatUsage } from "./model-UgHDMhI1.js";
17
+ import { c as suiteResult } from "./suite-DmuF_ApO.js";
18
+ import { a as commandHelpText, n as FLAGS, r as GLOBAL, s as helpText, t as COMMANDS } from "./cli-spec-BXIBUlaK.js";
19
+ import { p as render } from "./summary-BFMHMTz2.js";
16
20
  import { n as stripAnsi, t as colors } from "./colors-QV9dFVhN.js";
17
- import { a as render } from "./summary-BUKfU-9l.js";
18
- import { c as writeLiveProgress, i as prepareResume, o as resolveResume, r as loadPrevious, s as writeCurrent, t as completedKeysFor } from "./resume-Ca1c8vix.js";
19
- import { a as commandHelpText, n as FLAGS, r as GLOBAL, s as helpText, t as COMMANDS } from "./cli-spec-qmEnQ25_.js";
20
- import { i as runtimeInfo, n as gitInfo, r as runnerInfo, t as author } from "./provenance-DQ0AXn6c.js";
21
+ import { i as runtimeInfo, n as gitInfo, r as runnerInfo, t as author } from "./provenance-C_-8y-x3.js";
21
22
  import { t as budgetMarker } from "./budget-DBUrH4jX.js";
22
- import { n as prepareAll, o as writePrepared, r as prepareTargets, t as RunStopError } from "./preflight-BRzD30L5.js";
23
- import { n as imageHarness } from "./prepare-B_y-AFMv.js";
24
- import { r as createProviders, t as attemptImage } from "./providers-DoTq1jHW.js";
25
- import { a as redactArgv, r as commandOf, t as logInvocation } from "./invocations-BYDPe3fV.js";
23
+ import { c as writeLiveProgress, i as prepareResume, o as resolveResume, r as loadPrevious, s as writeCurrent, t as completedKeysFor } from "./resume-8-nnW8iO.js";
24
+ import { n as prepareAll, o as writePrepared, r as prepareTargets, t as RunStopError } from "./preflight-D3HvKeAx.js";
25
+ import { n as imageHarness } from "./prepare-Dx7dOnJB.js";
26
+ import { i as createProviders, n as attemptImage } from "./providers-CF5UEaP8.js";
27
+ import { a as redactArgv, r as commandOf, t as logInvocation } from "./invocations-D_ePcwyL.js";
26
28
  import { existsSync, mkdirSync, readdirSync, writeFileSync } from "node:fs";
27
29
  import { dirname, join } from "node:path";
28
30
  import { inspect } from "node:util";
@@ -161,12 +163,15 @@ function usageError(error, command) {
161
163
  }
162
164
  //#endregion
163
165
  //#region src/preflight.ts
164
- /** How the terminal names a sandbox to prepare: its cell id, `+ install`, and a harness other than Cursor. */
165
- function prepareLabel({ sandbox, harness }) {
166
+ /**
167
+ * How the terminal names a sandbox to prepare: its cell id, `+ install`, `+ plugin builds`, and a
168
+ * harness other than Cursor.
169
+ */
170
+ function prepareLabel({ sandbox, harness, plugins }) {
166
171
  if (sandbox.kind !== "docker") return sandboxId(sandbox);
167
172
  const baked = imageHarness(harness);
168
173
  const install = sandbox.install?.length ? " + install" : "";
169
- return `${sandboxId(sandbox)}${install}${baked === "cursor" ? "" : ` · ${baked}`}`;
174
+ return `${sandboxId(sandbox)}${install}${pluginBuildsLabel(plugins)}${baked === "cursor" ? "" : ` · ${baked}`}`;
170
175
  }
171
176
  /** A run that stopped in preflight on an infra failure: exit 3. */
172
177
  var PreflightInfraError = class extends Error {
@@ -384,12 +389,12 @@ function resultLines(c, e, verbose) {
384
389
  `results ${e.summaryPath}`
385
390
  ].filter(Boolean).join(" · "))
386
391
  ];
387
- return [...e.unhandledErrors.flatMap((error) => [c.red(`error: ${error}`), ""]), ...render(suiteResult(record), null, {
392
+ return render(suiteResult(record), e.insights ?? null, {
388
393
  color: c.enabled,
389
394
  verbose,
390
- notes,
395
+ notes: [...(e.insightLines ?? []).map((l) => c.yellow(l)), ...notes],
391
396
  hint: e.hint
392
- })];
397
+ });
393
398
  }
394
399
  //#endregion
395
400
  //#region src/ui/tags.ts
@@ -552,6 +557,8 @@ var PlainRenderer = class {
552
557
  #evals = /* @__PURE__ */ new Set();
553
558
  #tries = /* @__PURE__ */ new Set();
554
559
  #ended = /* @__PURE__ */ new Set();
560
+ /** Insights after the last attempt, once they've started: they take the status line. */
561
+ #insights = null;
555
562
  constructor(options) {
556
563
  this.#o = options;
557
564
  this.#c = options.colors;
@@ -568,11 +575,16 @@ var PlainRenderer = class {
568
575
  this.#o.out.write(this.#status ? `${CLEAR}${line}${this.#status}` : line);
569
576
  this.#lastWrite = this.#now();
570
577
  }
571
- /** `7 evals · 12/28 tries`: what's collected so far and how many tries ended. */
578
+ /** `7 evals · 12/28 tries`: what's collected so far and how many tries ended; then `insights 3/7…`. */
572
579
  #drawStatus() {
573
- if (!this.#live || !this.#tries.size) return;
574
- const evals = `${this.#evals.size} eval${this.#evals.size === 1 ? "" : "s"}`;
575
- const status = this.#c.dim(`${evals} · ${this.#ended.size}/${this.#tries.size} tries`);
580
+ if (!this.#live) return;
581
+ let status;
582
+ if (this.#insights) status = this.#c.dim(`insights ${this.#insights.done}/${this.#insights.total}…`);
583
+ else {
584
+ if (!this.#tries.size) return;
585
+ const evals = `${this.#evals.size} eval${this.#evals.size === 1 ? "" : "s"}`;
586
+ status = this.#c.dim(`${evals} · ${this.#ended.size}/${this.#tries.size} tries`);
587
+ }
576
588
  if (status === this.#status) return;
577
589
  this.#o.out.write(`${CLEAR}${status}`);
578
590
  this.#status = status;
@@ -700,6 +712,14 @@ var PlainRenderer = class {
700
712
  this.#write(`::error title=${title}::${ghEscape(failure.message)}`);
701
713
  }
702
714
  return;
715
+ case "insights-progress":
716
+ this.#insights = {
717
+ done: e.done,
718
+ total: e.total,
719
+ startedAt: this.#insights?.startedAt ?? e.at
720
+ };
721
+ this.#drawStatus();
722
+ return;
703
723
  case "notice": {
704
724
  const paint = {
705
725
  info: c.dim,
@@ -760,12 +780,19 @@ var PlainRenderer = class {
760
780
  this.#write(`::error file=${ghEscape(result.file, true)}${where},title=${title}::${message}`);
761
781
  }
762
782
  }
763
- /** Prints the heartbeat if nothing was written for `heartbeatMs` and evals are running. */
783
+ /** Prints the heartbeat if nothing was written for `heartbeatMs` and evals or insights are running. */
764
784
  tick(now = this.#now()) {
765
785
  const { heartbeatMs } = this.#o.output;
766
- if (this.#live || heartbeatMs <= 0 || this.#running.size === 0) return;
786
+ if (this.#live || heartbeatMs <= 0) return;
767
787
  if (now - this.#lastWrite < heartbeatMs) return;
768
788
  const c = this.#c;
789
+ const insights = this.#insights;
790
+ if (insights) {
791
+ const elapsed = formatDuration(now - insights.startedAt);
792
+ if (insights.done < insights.total) this.#write(c.dim(`… insights ${insights.done}/${insights.total} after ${elapsed}`));
793
+ return;
794
+ }
795
+ if (this.#running.size === 0) return;
769
796
  const running = [...this.#running.values()].map((a) => {
770
797
  const progress = a.last?.type === "eval-progress" ? a.last.progress : void 0;
771
798
  return `${this.#prefix(a)} ${phaseOf(progress)} ${c.dim(formatDuration(now - a.startedAt))}`;
@@ -899,6 +926,11 @@ const invocation = {
899
926
  let interrupted = false;
900
927
  /** The last signal that cancelled the run: 130 after SIGINT, 143 after SIGTERM. */
901
928
  let stopCode = EXIT.interrupted;
929
+ /**
930
+ * Set while insights run, after the attempts and the exit code: Ctrl-C or SIGTERM then stops the
931
+ * insights instead of cancelling the run, which has nothing left to cancel.
932
+ */
933
+ let onInsightsSignal = null;
902
934
  async function run(argv) {
903
935
  const { values, positionals } = parseCli(argv);
904
936
  invocation.flags = values;
@@ -916,7 +948,7 @@ async function run(argv) {
916
948
  return values.help ? EXIT.ok : EXIT.usage;
917
949
  }
918
950
  if (command === "init") {
919
- const { initCommand } = await import("./init-fhOXED8F.js");
951
+ const { initCommand } = await import("./init-kMkTgTZc.js");
920
952
  return initCommand(values, filters, {
921
953
  out: (s) => console.log(s),
922
954
  input: process.stdin,
@@ -925,7 +957,7 @@ async function run(argv) {
925
957
  });
926
958
  }
927
959
  if (command === "doctor") {
928
- const { doctorCommand } = await import("./doctor-D2MbNO8L.js");
960
+ const { doctorCommand } = await import("./doctor-De_QlOTM.js");
929
961
  return doctorCommand(values, {
930
962
  out: (s) => console.log(s),
931
963
  color: !!process.stdout.isTTY && !process.env.NO_COLOR,
@@ -933,7 +965,7 @@ async function run(argv) {
933
965
  });
934
966
  }
935
967
  if (command === "report") {
936
- const { reportCommand } = await import("./command-DbAe1Rzb.js");
968
+ const { reportCommand } = await import("./command-CANun0m0.js");
937
969
  return reportCommand(values, filters, {
938
970
  out: (s) => console.log(s),
939
971
  err: (s) => console.error(dim(s)),
@@ -948,7 +980,7 @@ async function run(argv) {
948
980
  }
949
981
  if (command === "studio") {
950
982
  const config = await loadConfig(configPath, "studio");
951
- const { studioCommand } = await import("./command-BlM0y8jN.js");
983
+ const { studioCommand } = await import("./command-Bh3yhN_b.js");
952
984
  return studioCommand({
953
985
  config,
954
986
  flags: values,
@@ -959,7 +991,7 @@ async function run(argv) {
959
991
  if (command === "mcp") {
960
992
  if (!values.http) console.log = console.info = console.debug = console.error;
961
993
  const config = await loadConfig(configPath, "mcp");
962
- const { mcpCommand } = await import("./command-TgbzPizb.js");
994
+ const { mcpCommand } = await import("./command-D_kEnYcX.js");
963
995
  return mcpCommand({
964
996
  config,
965
997
  flags: values,
@@ -968,7 +1000,7 @@ async function run(argv) {
968
1000
  }
969
1001
  if (command in HISTORY_COMMANDS) {
970
1002
  const config = await loadConfig(configPath, command);
971
- const commands = await import("./commands-CthqwkAn.js");
1003
+ const commands = await import("./commands-BKGzBMgb.js");
972
1004
  const ctx = {
973
1005
  config,
974
1006
  flags: values,
@@ -981,7 +1013,7 @@ async function run(argv) {
981
1013
  case "compare": return commands.compareCommand(ctx, filters);
982
1014
  case "checkout": return commands.checkoutCommand(ctx, filters);
983
1015
  case "query": {
984
- const { queryCommand } = await import("./query-CRQfsw0e.js");
1016
+ const { queryCommand } = await import("./query-D_1ARx5q.js");
985
1017
  return queryCommand({
986
1018
  ...ctx,
987
1019
  err: (s) => console.error(dim(s))
@@ -989,7 +1021,7 @@ async function run(argv) {
989
1021
  }
990
1022
  case "analyze": {
991
1023
  loadEnvFiles(configPath);
992
- const { analyzeCommand } = await import("./command-C-cVjlny.js");
1024
+ const { analyzeCommand } = await import("./command-CBaHukyl.js");
993
1025
  return analyzeCommand({
994
1026
  ...ctx,
995
1027
  err: (s) => console.error(dim(s))
@@ -1028,8 +1060,8 @@ async function cleanCommand(flags, configPath) {
1028
1060
  const where = fromCwd(debugRoot(config.root)) || ".";
1029
1061
  console.log(runs.length ? `Removed debug data for ${runs.length} run${runs.length === 1 ? "" : "s"} (${formatBytes(bytes)}) from ${where}` : `No debug data to remove in ${where}`);
1030
1062
  if (flags.images) {
1031
- const { dockerAvailable, pruneImages } = await import("./src-DYO3DdnQ.js");
1032
- const { requireDocker } = await import("./providers-B9yTdIqF.js");
1063
+ const { dockerAvailable, pruneImages } = await import("./src-D9fSTxlc.js");
1064
+ const { requireDocker } = await import("./providers-CTBYvMxu.js");
1033
1065
  const engines = [];
1034
1066
  for (const engine of ["docker", "podman"]) if (await dockerAvailable(engine)) engines.push(engine);
1035
1067
  if (!engines.length) await requireDocker();
@@ -1050,7 +1082,7 @@ function verbosityOf(flags) {
1050
1082
  * does. Needs a config, as `reeval run` does: there is no default image.
1051
1083
  */
1052
1084
  async function imageBuildCommand(flags, configPath, filters) {
1053
- const { buildImages, imagePlanLines, imageTargets, plannedImageUses } = await import("./images-Bi3aGxb9.js");
1085
+ const { buildImages, imagePlanLines, imageTargets, plannedImageUses } = await import("./images-m784ueGK.js");
1054
1086
  const { runId, stagingDir, config, runs, tags, concurrency, profile } = await startRun(await prepareRun({
1055
1087
  ...flags,
1056
1088
  "dry-run": true
@@ -1110,7 +1142,7 @@ async function runCommand(flags, configPath, filters) {
1110
1142
  if (githubOut) await appendFile(githubOut, `run-id=${ctx.runId}\n`).catch(() => {});
1111
1143
  const stepStart = process.env.GITHUB_STEP_SUMMARY;
1112
1144
  if (stepStart) await appendFile(stepStart, `run ${ctx.runId}\n`).catch(() => {});
1113
- const { engineVersions } = await import("./node-B3ydHo6t.js");
1145
+ const { engineVersions } = await import("./node-CGZYh4Fj.js");
1114
1146
  const renderer = createRenderer({
1115
1147
  out: setup.json ? setup.dryRun ? { write: () => true } : process.stderr : process.stdout,
1116
1148
  output: setup.output,
@@ -1128,27 +1160,13 @@ async function runCommand(flags, configPath, filters) {
1128
1160
  });
1129
1161
  throw error;
1130
1162
  }
1131
- const { engineRun, plan, sandboxVersions, budgetReached, live, notes, questions } = executed;
1163
+ const { engineRun, plan, sandboxVersions, budgetReached, live, questions } = executed;
1132
1164
  invocation.unhandledErrors = engineRun.unhandledErrors;
1133
1165
  const engines = [...new Set(plan?.sandboxes.flatMap((s) => s.kind === "docker" ? [s.engine ?? "docker"] : []))];
1134
1166
  if ((interrupted || engineRun.cancelled) && engines.length) {
1135
- const { removeRunContainers } = await import("./docker-DNmMPOBb.js");
1167
+ const { removeRunContainers } = await import("./docker-Dac6Zalz.js");
1136
1168
  await removeRunContainers(ctx.runId, engines);
1137
1169
  }
1138
- if (notes) {
1139
- const cancelled = interrupted || engineRun.cancelled;
1140
- const written = await notes.finish(cancelled);
1141
- if (!cancelled && written.length) {
1142
- const { notesLine } = await import("./agent-D483ru7D.js");
1143
- const text = notesLine(ctx.config.root, ctx.runId, written);
1144
- renderer.onEvent({
1145
- type: "notice",
1146
- at: Date.now(),
1147
- level: "info",
1148
- text
1149
- });
1150
- }
1151
- }
1152
1170
  if (engineRun.stopped || !plan) {
1153
1171
  live?.remove();
1154
1172
  renderer.close();
@@ -1156,8 +1174,8 @@ async function runCommand(flags, configPath, filters) {
1156
1174
  }
1157
1175
  const stopped = interrupted || engineRun.cancelled;
1158
1176
  const answers = questions && !stopped ? await questions.settle() : void 0;
1159
- const { lockfiles } = await import("./state-DpAxYyED.js");
1160
- const { writeScratchRun } = await import("./results-BE2f-1XS.js");
1177
+ const { lockfiles } = await import("./state-BGWGAwdo.js");
1178
+ const { writeScratchRun } = await import("./results-D-naai_Q.js");
1161
1179
  const run = await writeScratchRun({
1162
1180
  ctx,
1163
1181
  author: ctx.author,
@@ -1181,17 +1199,56 @@ async function runCommand(flags, configPath, filters) {
1181
1199
  ...answers?.size ? { answers } : {}
1182
1200
  }, () => live?.stop());
1183
1201
  const { record } = run;
1184
- if (notes && !stopped) {
1185
- const { summarizeRun } = await import("./agent-D483ru7D.js");
1186
- const { resolveAnalysisModel } = await import("./model-CXhrziBe.js");
1187
- const model = resolveAnalysisModel(ctx.config, "agent");
1188
- const { level, text } = await summarizeRun(ctx.config, record.runId, model);
1189
- renderer.onEvent({
1190
- type: "notice",
1191
- at: Date.now(),
1192
- level,
1193
- text
1194
- });
1202
+ const outcome = runOutcome(record);
1203
+ const code = stopped ? stopCode : outcome === "fail" ? EXIT.failed : outcome === "infra_error" ? EXIT.infra : EXIT.ok;
1204
+ let insights = run.insights;
1205
+ let insightLines = [];
1206
+ const { runInsights, wantsInsights } = await import("./run-Bel7Vde4.js");
1207
+ const wanted = !stopped && wantsInsights(ctx.config, !flags["no-insights"]);
1208
+ if (wanted && interrupted) insightLines = [`insights skipped (${stopCode === EXIT.terminated ? "SIGTERM" : "Ctrl-C"}): reeval analyze ${record.runId} --insights to write them`];
1209
+ else if (wanted) {
1210
+ const { scratchDir } = await import("./files-CtjEXWXm.js");
1211
+ const stop = new AbortController();
1212
+ let stopSignal = "SIGINT";
1213
+ onInsightsSignal = (signal) => {
1214
+ if (stop.signal.aborted) {
1215
+ renderer.close();
1216
+ process.exit(code);
1217
+ }
1218
+ stopSignal = signal;
1219
+ stop.abort(/* @__PURE__ */ new Error(signal === "SIGTERM" ? "SIGTERM" : "Ctrl-C"));
1220
+ };
1221
+ try {
1222
+ const done = await runInsights({
1223
+ config: ctx.config,
1224
+ record,
1225
+ runDir: run.artifactDir ?? join(scratchDir(ctx.config.root), record.runId),
1226
+ remarks: run.insights,
1227
+ verbose: (ctx.verbosity ?? 0) > 0,
1228
+ signal: stop.signal,
1229
+ stopSignal: () => stopSignal,
1230
+ onStart: (text) => {
1231
+ renderer.onEvent({
1232
+ type: "notice",
1233
+ at: Date.now(),
1234
+ level: "info",
1235
+ text
1236
+ });
1237
+ },
1238
+ onProgress: (n, total) => {
1239
+ renderer.onEvent({
1240
+ type: "insights-progress",
1241
+ at: Date.now(),
1242
+ done: n,
1243
+ total
1244
+ });
1245
+ }
1246
+ });
1247
+ insights = done.insights ?? insights;
1248
+ insightLines = done.lines;
1249
+ } finally {
1250
+ onInsightsSignal = null;
1251
+ }
1195
1252
  }
1196
1253
  const { pruneDebug } = await import("./files-BAt0i00X.js");
1197
1254
  await pruneDebug(ctx.config.root, ctx.config.debug.keep).catch(() => {});
@@ -1202,8 +1259,9 @@ async function runCommand(flags, configPath, filters) {
1202
1259
  record,
1203
1260
  summaryPath: fromCwd(summary),
1204
1261
  results: engineRun.evals,
1205
- unhandledErrors: engineRun.unhandledErrors,
1206
- hint: !hasAnalysisModel(ctx.config)
1262
+ hint: !hasAnalysisModel(ctx.config),
1263
+ insights,
1264
+ insightLines
1207
1265
  });
1208
1266
  renderer.close();
1209
1267
  const stepSummary = process.env.GITHUB_STEP_SUMMARY;
@@ -1211,7 +1269,7 @@ async function runCommand(flags, configPath, filters) {
1211
1269
  const { config } = ctx;
1212
1270
  const mode = setup.record;
1213
1271
  if ((flags.record || mode === "always" || mode === "ci" && inCI()) && record.status !== "interrupted") {
1214
- const { record: recordCmd } = await import("./commands-CthqwkAn.js");
1272
+ const { record: recordCmd } = await import("./commands-BKGzBMgb.js");
1215
1273
  const allow = record.status === "budget" ? { "allow-incomplete": true } : {};
1216
1274
  const line = await recordCmd(config, record.runId, {
1217
1275
  ...flags,
@@ -1221,13 +1279,10 @@ async function runCommand(flags, configPath, filters) {
1221
1279
  else console.log(line);
1222
1280
  }
1223
1281
  if (setup.json) {
1224
- const { suiteResult } = await import("./suite-DamAEnNF.js");
1282
+ const { suiteResult } = await import("./suite-mn9g4veR.js");
1225
1283
  process.stdout.write(`${JSON.stringify(suiteResult(record), null, 2)}\n`);
1226
1284
  }
1227
- if (interrupted || engineRun.cancelled) return stopCode;
1228
- if (engineRun.unhandledErrors.length > 0) return EXIT.failed;
1229
- const outcome = runOutcome(record);
1230
- return outcome === "fail" ? EXIT.failed : outcome === "infra_error" ? EXIT.infra : EXIT.ok;
1285
+ return code;
1231
1286
  }
1232
1287
  /** Everything that can fail before the evals are collected: output mode, config, profile, flags. */
1233
1288
  async function prepareRun(flags, configPath) {
@@ -1253,11 +1308,11 @@ async function prepareRun(flags, configPath) {
1253
1308
  runs = Number(flags.runs);
1254
1309
  if (!(Number.isInteger(runs) && runs >= 1)) throw new UsageError(`--runs must be a whole number of at least 1 (got ${flags.runs})`);
1255
1310
  }
1256
- const sandboxes = [environmentSandbox(config.environment, config.sandbox), ...profile?.defaults.environment ? [environmentSandbox(profile.defaults.environment, config.sandbox)] : []];
1311
+ const sandboxes = [environmentSandbox(config.environment, config.sandbox), ...profile ? [profileSandbox(config, profile.defaults)] : []];
1257
1312
  const concurrency = await resolveConcurrency(config, flags.concurrency, async () => {
1258
1313
  const container = sandboxes.find((s) => s.kind === "docker");
1259
1314
  if (!container) return hostCapacity();
1260
- const { dockerCapacity } = await import("./src-DYO3DdnQ.js");
1315
+ const { dockerCapacity } = await import("./src-D9fSTxlc.js");
1261
1316
  return await dockerCapacity(container.engine) ?? hostCapacity();
1262
1317
  });
1263
1318
  return {
@@ -1272,6 +1327,8 @@ async function prepareRun(flags, configPath) {
1272
1327
  dryRun: !!flags["dry-run"],
1273
1328
  json: !!flags.json,
1274
1329
  force: !!flags.force,
1330
+ /** `--no-insights` turns them off for this run. */
1331
+ insights: !flags["no-insights"],
1275
1332
  verbosity: verbosityOf(flags),
1276
1333
  configFile: configLabel(path),
1277
1334
  /** Named in the plan line when the project root isn't the current directory. */
@@ -1284,11 +1341,11 @@ async function prepareRun(flags, configPath) {
1284
1341
  async function startRun({ config, profile, runs, tags, concurrency, verbosity, configFile, resume, dryRun }) {
1285
1342
  const startedAt = /* @__PURE__ */ new Date();
1286
1343
  const git = await gitInfo(config.root, [config.history.dir]);
1287
- const { worktreePatch } = await import("./state-DpAxYyED.js");
1344
+ const { worktreePatch } = await import("./state-BGWGAwdo.js");
1288
1345
  const patch = git?.dirty ? await worktreePatch(config.root, [config.history.dir]) : null;
1289
1346
  const who = await author(config.root);
1290
- const { stagingDir, sweepStaging } = await import("./results-BE2f-1XS.js");
1291
- const { scratchDir } = await import("./files-Bw8lWEjg.js");
1347
+ const { stagingDir, sweepStaging } = await import("./results-D-naai_Q.js");
1348
+ const { scratchDir } = await import("./files-CtjEXWXm.js");
1292
1349
  const scratch = scratchDir(config.root);
1293
1350
  if (resume !== void 0) {
1294
1351
  const target = await resolveResume(config.root, resume || void 0);
@@ -1299,7 +1356,7 @@ async function startRun({ config, profile, runs, tags, concurrency, verbosity, c
1299
1356
  artifacts: target.previousArtifacts
1300
1357
  } : await loadPrevious(stagingDir(config.root, target.runId));
1301
1358
  if (!dryRun) try {
1302
- const { removeRunContainers } = await import("./docker-DNmMPOBb.js");
1359
+ const { removeRunContainers } = await import("./docker-Dac6Zalz.js");
1303
1360
  await removeRunContainers(target.runId, ["docker", "podman"]);
1304
1361
  } catch {}
1305
1362
  return {
@@ -1370,8 +1427,8 @@ async function executeRun(ctx, setup, filters, renderer) {
1370
1427
  configFile,
1371
1428
  completed: []
1372
1429
  }));
1373
- const { runEngine } = await import("./node-B3ydHo6t.js");
1374
- const { buildPlan, checkAttemptBudget, planDocument, planLine, planTable } = await import("./plan-DgQxp9yy.js");
1430
+ const { runEngine } = await import("./node-CGZYh4Fj.js");
1431
+ const { buildPlan, checkAttemptBudget, planDocument, planInsights, planLine, planTable } = await import("./plan-CZYgXnZh.js");
1375
1432
  let plan;
1376
1433
  let sandboxVersions = { images: [] };
1377
1434
  let preflightStop;
@@ -1379,7 +1436,6 @@ async function executeRun(ctx, setup, filters, renderer) {
1379
1436
  let budgetTimer;
1380
1437
  let toRun = [];
1381
1438
  let live;
1382
- let notes;
1383
1439
  let questions;
1384
1440
  const onPlan = async ({ planned, excluded, matched, unmatched }) => {
1385
1441
  if (unmatched.length) throw unmatchedFilter(config, unmatched);
@@ -1398,7 +1454,7 @@ async function executeRun(ctx, setup, filters, renderer) {
1398
1454
  } : p);
1399
1455
  toRun = skipped;
1400
1456
  for (const p of skipped) for (const name of p.attempt.secretVars) registerSecret(process.env[name]);
1401
- const models = skipped.some((p) => !p.attempt.plan.skip && p.attempt.plan.questions?.length) ? await import("./model-CXhrziBe.js") : void 0;
1457
+ const models = skipped.some((p) => !p.attempt.plan.skip && p.attempt.plan.questions?.length) ? await import("./model-B8H3gL69.js") : void 0;
1402
1458
  plan = await buildPlan({
1403
1459
  planned: skipped,
1404
1460
  profile,
@@ -1406,19 +1462,26 @@ async function executeRun(ctx, setup, filters, renderer) {
1406
1462
  concurrency,
1407
1463
  root: config.root,
1408
1464
  historyDir: config.history.dir,
1409
- questionModel: models?.questionModelLabel(config) ?? null
1465
+ questionModel: models?.questionModelLabel(config) ?? null,
1466
+ insights: await planInsights(config, setup.insights)
1410
1467
  });
1411
1468
  plan.runId = runId;
1469
+ if (plan.insights) {
1470
+ const { analysisKeyProblem } = await import("./model-B8H3gL69.js");
1471
+ const problem = analysisKeyProblem(config);
1472
+ if (problem) plan.warnings.push(`insights will be skipped: ${problem}`);
1473
+ }
1412
1474
  if (completed.size) plan.resume = {
1413
1475
  runId,
1414
1476
  completed: completed.size
1415
1477
  };
1416
1478
  run.completed = [...completed];
1417
- const { imageStages, imageTargets } = await import("./images-Bi3aGxb9.js");
1479
+ const { imageStages, imageTargets } = await import("./images-m784ueGK.js");
1418
1480
  const targets = imageTargets(skipped.filter((p) => !p.attempt.plan.skip).map((p) => ({
1419
1481
  id: p.id,
1420
1482
  harness: p.attempt.harness,
1421
- sandbox: p.attempt.sandbox
1483
+ sandbox: p.attempt.sandbox,
1484
+ plugins: p.attempt.pluginBuilds ?? []
1422
1485
  })));
1423
1486
  if (setup.json && setup.dryRun) {
1424
1487
  const images = await Promise.all(targets.map(async (t) => ({
@@ -1435,8 +1498,8 @@ async function executeRun(ctx, setup, filters, renderer) {
1435
1498
  if (setup.dryRun) {
1436
1499
  const todos = excluded.filter((e) => e.mode === "todo").map((e) => e.id);
1437
1500
  lines.push(...planTable(plan, todos));
1438
- const { imageStatusLines } = await import("./images-Bi3aGxb9.js");
1439
- const { dockerAvailable, engineSpec } = await import("./src-DYO3DdnQ.js");
1501
+ const { imageStatusLines } = await import("./images-m784ueGK.js");
1502
+ const { dockerAvailable, engineSpec } = await import("./src-D9fSTxlc.js");
1440
1503
  const engines = [...new Set(targets.map((t) => t.sandbox.engine ?? "docker"))];
1441
1504
  const down = [];
1442
1505
  for (const engine of engines) if (!await dockerAvailable(engine)) down.push(engine);
@@ -1446,6 +1509,10 @@ async function executeRun(ctx, setup, filters, renderer) {
1446
1509
  lines.push(`images not checked: ${names} ${down.length === 1 ? "is" : "are"} not running`);
1447
1510
  }
1448
1511
  }
1512
+ if (setup.dryRun && plan.insights) {
1513
+ const { formatTokens } = await import("./usage-BDo2q_yu.js");
1514
+ lines.push(`insights ${plan.insights.model} · up to ${formatTokens(plan.insights.maxTokens)} tokens`);
1515
+ }
1449
1516
  lines.push(...plan.warnings.map((w) => `warning: ${w}`));
1450
1517
  lines.push(...plan.hints.map((h) => `hint: ${h}`));
1451
1518
  renderer.onEvent({
@@ -1456,8 +1523,6 @@ async function executeRun(ctx, setup, filters, renderer) {
1456
1523
  });
1457
1524
  if (setup.dryRun) return false;
1458
1525
  checkAttemptBudget(plan, setup.force, config.file);
1459
- const analysis = config.analysis.agent ? await import("./model-CXhrziBe.js") : null;
1460
- analysis?.analysisModelName(config, "agent");
1461
1526
  const questionModels = /* @__PURE__ */ new Set();
1462
1527
  const asked = [];
1463
1528
  for (const row of plan.rows) {
@@ -1480,31 +1545,15 @@ async function executeRun(ctx, setup, filters, renderer) {
1480
1545
  profile,
1481
1546
  questionModels: [...questionModels]
1482
1547
  });
1483
- if (missing.length) throw new UsageError(`Missing credentials: ${missing.join(", ")}. Set them in the environment or .env.local.`);
1548
+ if (missing.length) throw new UsageError(`Missing credentials: ${missing.join("; ")}. Set them in the environment or .env.local.`);
1484
1549
  const malformed = malformedCredentials(config, process.env, {
1485
1550
  harnesses: plan.harnessDescriptors,
1486
1551
  profile,
1487
1552
  questionModels: [...questionModels]
1488
1553
  });
1489
1554
  if (malformed.length) throw new UsageError(`Credentials with whitespace or a line break in them: ${malformed.join(", ")}. A key copied from a wrapped terminal line picks these up; set it again as one line.`);
1490
- if (analysis) {
1491
- const { startNotes } = await import("./agent-D483ru7D.js");
1492
- notes = startNotes({
1493
- config,
1494
- model: analysis.resolveAnalysisModel(config, "agent"),
1495
- runId,
1496
- stagingDir,
1497
- planned: skipped,
1498
- warn: (text) => renderer.onEvent({
1499
- type: "notice",
1500
- at: Date.now(),
1501
- level: "warn",
1502
- text
1503
- })
1504
- });
1505
- }
1506
1555
  if (asked.length) {
1507
- const { questionRunner } = await import("./questions-C2dym2ce.js");
1556
+ const { questionRunner } = await import("./questions-KENpWnfV.js");
1508
1557
  questions = questionRunner({
1509
1558
  evals: asked,
1510
1559
  stagingDir,
@@ -1521,7 +1570,7 @@ async function executeRun(ctx, setup, filters, renderer) {
1521
1570
  }
1522
1571
  });
1523
1572
  }
1524
- const { prepareWorkspaces, workspaceKey } = await import("./workspace-C_X0tdv6.js");
1573
+ const { prepareWorkspaces, sameTreeArms, workspaceKey } = await import("./workspace-B1eGO46M.js");
1525
1574
  const live = skipped.filter((p) => !p.attempt.plan.skip);
1526
1575
  const outcomes = await prepareWorkspaces(live.flatMap(({ attempt: a }) => a.workspace ? [{
1527
1576
  workspace: a.workspace,
@@ -1551,6 +1600,7 @@ async function executeRun(ctx, setup, filters, renderer) {
1551
1600
  label: `workspace ${o.label}`,
1552
1601
  sandbox: user.attempt.sandbox,
1553
1602
  harness: user.attempt.harness,
1603
+ plugins: [],
1554
1604
  setBy: o.setBy,
1555
1605
  runWide: false
1556
1606
  };
@@ -1566,10 +1616,17 @@ async function executeRun(ctx, setup, filters, renderer) {
1566
1616
  }
1567
1617
  });
1568
1618
  }
1619
+ for (const text of sameTreeArms(live, outcomes)) renderer.onEvent({
1620
+ type: "notice",
1621
+ at: Date.now(),
1622
+ level: "warn",
1623
+ text
1624
+ });
1569
1625
  try {
1570
1626
  sandboxVersions = await preflight(skipped.filter((p) => !p.attempt.plan.skip).map((p) => ({
1571
1627
  harness: p.attempt.harness,
1572
1628
  sandbox: p.attempt.sandbox,
1629
+ plugins: p.attempt.pluginBuilds ?? [],
1573
1630
  setBy: p.attempt.setBy
1574
1631
  })), {
1575
1632
  root: config.root,
@@ -1623,7 +1680,7 @@ async function executeRun(ctx, setup, filters, renderer) {
1623
1680
  version,
1624
1681
  files,
1625
1682
  harness: (plan?.harnesses ?? config.harness.map(harnessId)).join(", "),
1626
- sandbox: sandboxId(config.sandbox),
1683
+ sandbox: plannedSandboxes(plan?.sandboxes ?? [], profileSandbox(config, profile?.defaults)),
1627
1684
  concurrency,
1628
1685
  runId
1629
1686
  });
@@ -1635,7 +1692,6 @@ async function executeRun(ctx, setup, filters, renderer) {
1635
1692
  }
1636
1693
  if (e.type === "eval-end") {
1637
1694
  live?.end(e.result);
1638
- notes?.onResult(e.result);
1639
1695
  questions?.onEvalEnd(e.result);
1640
1696
  }
1641
1697
  if (interrupted && e.type === "eval-end" && e.result.state === "skipped") return;
@@ -1643,6 +1699,7 @@ async function executeRun(ctx, setup, filters, renderer) {
1643
1699
  },
1644
1700
  onCancellable: (cancel) => {
1645
1701
  const onSignal = (signal) => {
1702
+ if (onInsightsSignal) return onInsightsSignal(signal === "SIGTERM" ? "SIGTERM" : "SIGINT");
1646
1703
  stopCode = signal === "SIGTERM" ? EXIT.terminated : EXIT.interrupted;
1647
1704
  if (interrupted) {
1648
1705
  renderer.close();
@@ -1669,9 +1726,9 @@ async function executeRun(ctx, setup, filters, renderer) {
1669
1726
  throw error;
1670
1727
  } finally {
1671
1728
  clearTimeout(budgetTimer);
1672
- const { removePrepared } = await import("./preflight-DlQvbySb.js");
1729
+ const { removePrepared } = await import("./preflight-BQlPTHVu.js");
1673
1730
  removePrepared(config.root, runId);
1674
- const { removePreparedWorkspaces } = await import("./workspace-C_X0tdv6.js");
1731
+ const { removePreparedWorkspaces } = await import("./workspace-B1eGO46M.js");
1675
1732
  removePreparedWorkspaces(config.root, runId);
1676
1733
  }
1677
1734
  if (preflightStop) throw preflightStop;
@@ -1684,7 +1741,6 @@ async function executeRun(ctx, setup, filters, renderer) {
1684
1741
  sandboxVersions,
1685
1742
  budgetReached: () => reached,
1686
1743
  live,
1687
- notes,
1688
1744
  questions
1689
1745
  };
1690
1746
  }
@@ -1754,4 +1810,4 @@ run(process.argv.slice(2)).finally(() => {
1754
1810
  //#endregion
1755
1811
  export {};
1756
1812
 
1757
- //# sourceMappingURL=cli-ClpPT8kn.js.map
1813
+ //# sourceMappingURL=cli-BCE1xlm4.js.map