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,11 +1,13 @@
1
1
  import { n as UsageError } from "./errors-B6BSMs03.js";
2
- import { w as plannedSecrets } from "./environment-Cca6a4wB.js";
3
- import { a as providerServedModel, i as providerModelResponses, n as providerEndpoints, r as providerHosts, s as resolveOpenCodeProvider } from "./opencode-providers-J9colP0-.js";
2
+ import { w as plannedSecrets } from "./environment-B4IuURK1.js";
3
+ import { F as HARNESS_HOSTS, I as PACKAGE_HOSTS, P as DOCKER_EGRESS, dt as shellQuote, ut as run } from "./src-CIpKL45U.js";
4
+ import { D as pluginServerName, a as PLUGIN_PARTS, n as PLUGIN_DIR, r as PLUGIN_MANIFEST, t as PART_PATHS, y as localPluginServers } from "./plugins-P-uh54VF.js";
5
+ import { a as providerServedModel, i as providerModelResponses, n as providerEndpoints, r as providerHosts, s as resolveOpenCodeProvider } from "./opencode-providers-snfeWd6Z.js";
4
6
  import { t as InfraError } from "./types-C5vI3g1C.js";
5
- import { D as HARNESS_HOSTS, E as DOCKER_EGRESS, O as PACKAGE_HOSTS, nt as shellQuote, tt as run } from "./src-ftu5wPSt.js";
6
7
  import { existsSync } from "node:fs";
7
8
  import { tmpdir } from "node:os";
8
9
  import { dirname, join, win32 } from "node:path";
10
+ import { isIP } from "node:net";
9
11
  import { randomUUID } from "node:crypto";
10
12
  import { spawn } from "node:child_process";
11
13
  import { mkdir, mkdtemp, readFile, rm, writeFile } from "node:fs/promises";
@@ -164,8 +166,20 @@ function opencodeMcpServers(servers) {
164
166
  }];
165
167
  }));
166
168
  }
169
+ /**
170
+ * The key Goose keeps an extension by (its `name_to_key`): whitespace dropped, anything but ASCII
171
+ * letters, digits, `_` and `-` made `_`, lower-cased. Of two extensions with one key it keeps one.
172
+ */
173
+ const gooseKey = (name) => name.replace(/\s/g, "").replace(/[^A-Za-z0-9_-]/g, "_").toLowerCase();
167
174
  /** Goose's extension shape (its `config.yaml`); it has no SSE transport. */
168
175
  function gooseMcpServers(servers) {
176
+ const byKey = /* @__PURE__ */ new Map();
177
+ for (const name of Object.keys(servers)) {
178
+ const key = gooseKey(name);
179
+ const other = byKey.get(key);
180
+ if (other !== void 0) throw new InfraError(`Goose keys the ${other} and ${name} MCP servers both as ${key}, and keeps only one: rename one`);
181
+ byKey.set(key, name);
182
+ }
169
183
  return Object.fromEntries(Object.entries(servers).map(([name, s]) => {
170
184
  if (s.transport === "sse") throw new InfraError(`Goose has no SSE MCP transport, so it can't use the ${name} server (mcp.sse): use mcp.http or mcp.stdio`);
171
185
  return s.transport === "stdio" ? [name, {
@@ -183,11 +197,18 @@ function gooseMcpServers(servers) {
183
197
  /**
184
198
  * pi's `mcp.json` shape, which the adapter escapes and sets `"exposure": "direct"` on. pi
185
199
  * skips a server whose name isn't letters, digits, `_` and `-`, so the plan refuses it instead.
200
+ * A plugin's server, `<plugin>:<server>`, is named `<plugin>_<server>`, so its tools are
201
+ * `mcp__<plugin>_<server>__<tool>`.
186
202
  */
187
203
  function piMcpServers(servers) {
188
- return Object.fromEntries(Object.entries(servers).map(([name, s]) => {
189
- if (!/^[A-Za-z0-9_-]+$/.test(name)) throw new InfraError(`pi takes MCP server names of letters, digits, "_" and "-" only, so it can't use the ${name} server: rename it`);
190
- if (s.transport === "sse") throw new InfraError(`pi has no SSE MCP transport, so it can't use the ${name} server (mcp.sse): use mcp.http or mcp.stdio`);
204
+ const named = /* @__PURE__ */ new Map();
205
+ return Object.fromEntries(Object.entries(servers).map(([key, s]) => {
206
+ const name = /^[a-z0-9-]+:[^:]+$/.test(key) ? key.replace(":", "_") : key;
207
+ if (!/^[A-Za-z0-9_-]+$/.test(name)) throw new InfraError(`pi takes MCP server names of letters, digits, "_" and "-" only, so it can't use the ${key} server: rename it`);
208
+ const other = named.get(name);
209
+ if (other) throw new InfraError(`pi names the ${key} MCP server ${name}, as it does the ${other} server, and keeps only one: rename one`);
210
+ named.set(name, key);
211
+ if (s.transport === "sse") throw new InfraError(`pi has no SSE MCP transport, so it can't use the ${key} server (mcp.sse): use mcp.http or mcp.stdio`);
191
212
  return s.transport === "stdio" ? [name, {
192
213
  command: s.command,
193
214
  args: s.args,
@@ -270,58 +291,236 @@ function cursorMcpServers(servers) {
270
291
  headers: s.headers
271
292
  }]));
272
293
  }
294
+ /** Claude Code's hook events as Cursor names them, as the Cursor SDK converts Claude Code's own. */
295
+ const CURSOR_HOOK_EVENTS = {
296
+ SessionStart: "sessionStart",
297
+ SessionEnd: "sessionEnd",
298
+ UserPromptSubmit: "beforeSubmitPrompt",
299
+ PreToolUse: "preToolUse",
300
+ PostToolUse: "postToolUse",
301
+ SubagentStop: "subagentStop",
302
+ PreCompact: "preCompact",
303
+ Stop: "stop"
304
+ };
305
+ /** Claude Code's tool names as Cursor's hooks match them; null for one Cursor has no tool for. */
306
+ const CURSOR_HOOK_TOOLS = {
307
+ Bash: "Shell",
308
+ Read: "Read",
309
+ Write: "Write",
310
+ Edit: "Write",
311
+ Glob: null,
312
+ Grep: "Grep",
313
+ WebFetch: "WebFetch",
314
+ WebSearch: "WebSearch",
315
+ Task: "Task"
316
+ };
317
+ /**
318
+ * A Claude Code hook group's tool matcher as Cursor's, on the tool events only: each name mapped,
319
+ * `mcp__<server>__<tool>` as `MCP:<tool>`; null when it names only tools Cursor lacks.
320
+ */
321
+ function cursorHookMatcher(event, matcher) {
322
+ if (event !== "PreToolUse" && event !== "PostToolUse") return void 0;
323
+ if (!matcher || matcher === "*") return void 0;
324
+ const out = [];
325
+ for (const raw of matcher.split("|")) {
326
+ const name = raw.trim();
327
+ const parts = name.split("__");
328
+ const tool = name.startsWith("mcp__") && parts.length >= 3 ? `MCP:${parts.slice(2).join("__")}` : CURSOR_HOOK_TOOLS[name] === void 0 ? name : CURSOR_HOOK_TOOLS[name];
329
+ if (tool && !out.includes(tool)) out.push(tool);
330
+ }
331
+ return out.length ? out.join("|") : null;
332
+ }
333
+ /** Where Cursor reads what reeval unpacks from a plugin, in the workspace (settingSources `project`). */
334
+ const CURSOR_PLUGIN_UNPACK = {
335
+ rules: ".cursor/rules",
336
+ agents: ".cursor/agents",
337
+ commands: ".cursor/commands",
338
+ hooks: {
339
+ file: ".cursor/hooks.json",
340
+ events: CURSOR_HOOK_EVENTS,
341
+ matcher: cursorHookMatcher
342
+ }
343
+ };
344
+ /**
345
+ * A plugin subagent's or command's frontmatter as OpenCode 2 takes it: the description, and a
346
+ * subagent's `mode`. OpenCode skips a file whose frontmatter its schema refuses, without saying,
347
+ * and Claude Code's `tools: Read, Grep`, `model: sonnet` and `allowed-tools` are such keys.
348
+ */
349
+ function opencodeFrontmatter(part, front) {
350
+ const d = front.description;
351
+ const description = typeof d === "string" || typeof d === "number" || typeof d === "boolean" ? String(d) : void 0;
352
+ return {
353
+ ...description ? { description } : {},
354
+ ...part === "agents" ? { mode: "subagent" } : {}
355
+ };
356
+ }
357
+ /** Where OpenCode reads plugin subagents and commands, in the workspace's config directory. */
358
+ const OPENCODE_PLUGIN_UNPACK = {
359
+ agents: ".opencode/agents",
360
+ commands: ".opencode/commands",
361
+ frontmatter: opencodeFrontmatter
362
+ };
363
+ /**
364
+ * Where pi reads plugin commands, as prompt templates (`/<name>`), in the workspace, which its
365
+ * `--approve` trusts. Its frontmatter takes `description` and `argument-hint`, and ignores the
366
+ * rest of Claude Code's.
367
+ */
368
+ const PI_PLUGIN_UNPACK = { commands: ".pi/prompts" };
369
+ /**
370
+ * What Claude Code's plugin format bundles, which Grok Build reads too: every part but rules,
371
+ * which neither loads from a plugin.
372
+ */
373
+ const CLAUDE_FORMAT_PARTS = PLUGIN_PARTS.filter((p) => p !== "rules");
374
+ /** The marketplace Claude Code's settings name for the session's plugins. */
375
+ const CLAUDE_PLUGIN_MARKETPLACE = "reeval";
376
+ /**
377
+ * Claude Code's settings for the session's plugins: a `directory` marketplace at the directory
378
+ * they were copied to, listing each, and each enabled as `<plugin>@reeval`. Claude Code installs
379
+ * and loads them as it starts, since the bridge leaves every settings source on.
380
+ */
381
+ function claudePluginFiles(plugins) {
382
+ const [first] = plugins;
383
+ if (!first) return [];
384
+ const json = (value) => `${JSON.stringify(value, null, 2)}\n`;
385
+ const marketplace = {
386
+ name: CLAUDE_PLUGIN_MARKETPLACE,
387
+ owner: { name: "reeval" },
388
+ plugins: plugins.map((p) => ({
389
+ name: p.name,
390
+ source: `./${p.name}`
391
+ }))
392
+ };
393
+ const settings = {
394
+ extraKnownMarketplaces: { [CLAUDE_PLUGIN_MARKETPLACE]: { source: {
395
+ source: "directory",
396
+ path: first.dir.slice(0, first.dir.lastIndexOf("/"))
397
+ } } },
398
+ enabledPlugins: Object.fromEntries(plugins.map((p) => [`${p.name}@${CLAUDE_PLUGIN_MARKETPLACE}`, true]))
399
+ };
400
+ return [{
401
+ path: `${PLUGIN_DIR}/.claude-plugin/marketplace.json`,
402
+ content: json(marketplace)
403
+ }, {
404
+ path: "~/.claude/settings.json",
405
+ content: json(settings),
406
+ merge: true
407
+ }];
408
+ }
409
+ const isObject = (v) => typeof v === "object" && v !== null && !Array.isArray(v);
410
+ /**
411
+ * Writes the layout's plugin files into the sandbox and returns their paths. A `merge` file's keys
412
+ * go into the JSON object already at its path (an object-valued key merged one level down), so
413
+ * settings an environment's `files` wrote there stay.
414
+ */
415
+ async function writePluginFiles(sandbox, layout, plugins) {
416
+ const written = [];
417
+ for (const f of layout.pluginFiles?.(plugins) ?? []) {
418
+ const existing = f.merge ? await sandbox.readFile(f.path) : null;
419
+ let content = f.content;
420
+ if (existing?.trim()) {
421
+ let base;
422
+ try {
423
+ base = JSON.parse(existing);
424
+ } catch {}
425
+ if (!isObject(base)) throw new InfraError(`${f.path} isn't a JSON object, so reeval can't enable the session's plugins in it: write it as one in files, or leave it out`);
426
+ const ours = JSON.parse(f.content);
427
+ const merged = { ...base };
428
+ for (const [k, v] of Object.entries(ours)) {
429
+ const was = base[k];
430
+ merged[k] = isObject(v) && isObject(was) ? {
431
+ ...was,
432
+ ...v
433
+ } : v;
434
+ }
435
+ content = `${JSON.stringify(merged, null, 2)}\n`;
436
+ }
437
+ await sandbox.writeFile(f.path, content);
438
+ written.push(f.path);
439
+ }
440
+ return written;
441
+ }
442
+ /**
443
+ * The MCP servers the agent is given: all of them, less the plugins' own where it takes plugin
444
+ * items namespaced, since it loads those from the plugin and would otherwise start each twice.
445
+ */
446
+ function agentMcp(layout, mcp, plugins) {
447
+ if (layout.pluginPlacement !== "namespaced") return mcp;
448
+ const own = new Set(plugins.flatMap((p) => p.servers));
449
+ return Object.fromEntries(Object.entries(mcp).filter(([name]) => !own.has(name)));
450
+ }
273
451
  /** Where each agent with an image reads rules and skills. */
274
452
  const LAYOUTS = {
275
453
  cursor: {
276
454
  rulesFile: "AGENTS.md",
277
455
  workspaceSkillDir: ".cursor/skills",
278
- harnessSkillDir: ".agents/skills"
456
+ harnessSkillDir: ".agents/skills",
457
+ pluginPlacement: "flat",
458
+ pluginUnpack: CURSOR_PLUGIN_UNPACK,
459
+ pluginHookEvents: Object.keys(CURSOR_HOOK_EVENTS)
279
460
  },
280
461
  "claude-code": {
281
462
  rulesFile: "CLAUDE.md",
282
463
  workspaceSkillDir: ".claude/skills",
283
- harnessSkillDir: ".claude/skills"
464
+ harnessSkillDir: ".claude/skills",
465
+ pluginPlacement: "namespaced",
466
+ pluginFiles: claudePluginFiles
284
467
  },
285
468
  antigravity: {
286
469
  rulesFile: "AGENTS.md",
287
470
  workspaceSkillDir: ".agents/skills",
288
- harnessSkillDir: ".gemini/config/skills"
471
+ harnessSkillDir: ".gemini/config/skills",
472
+ pluginPlacement: "namespaced",
473
+ pluginHookEvents: [
474
+ "SessionStart",
475
+ "PreToolUse",
476
+ "PostToolUse",
477
+ "Stop"
478
+ ]
289
479
  },
290
480
  opencode: {
291
481
  rulesFile: "AGENTS.md",
292
482
  workspaceSkillDir: ".opencode/skills",
293
- harnessSkillDir: ".config/opencode/skills"
483
+ harnessSkillDir: ".config/opencode/skills",
484
+ pluginPlacement: "flat",
485
+ pluginUnpack: OPENCODE_PLUGIN_UNPACK
294
486
  },
295
487
  goose: {
296
488
  rulesFile: "AGENTS.md",
297
489
  workspaceSkillDir: ".goose/skills",
298
- harnessSkillDir: ".ai-sdk-harness/.harness-bootstrap/goose/implementation/home/.config/goose/skills"
490
+ harnessSkillDir: ".ai-sdk-harness/.harness-bootstrap/goose/implementation/home/.config/goose/skills",
491
+ pluginPlacement: "flat"
299
492
  },
300
493
  pi: {
301
494
  rulesFile: "AGENTS.md",
302
495
  workspaceSkillDir: ".pi/skills",
303
- harnessSkillDir: ".pi/agent/skills"
496
+ harnessSkillDir: ".pi/agent/skills",
497
+ pluginPlacement: "flat",
498
+ pluginUnpack: PI_PLUGIN_UNPACK
304
499
  },
305
500
  codex: {
306
501
  rulesFile: "AGENTS.md",
307
502
  workspaceSkillDir: ".agents/skills",
308
- harnessSkillDir: ".agents/skills"
503
+ harnessSkillDir: ".agents/skills",
504
+ pluginPlacement: "namespaced"
309
505
  },
310
506
  fx: {
311
507
  rulesFile: "AGENTS.md",
312
508
  workspaceSkillDir: ".fx/skills",
313
- harnessSkillDir: ".ai-sdk-harness/.harness-bootstrap/fx/implementation/home/.fx/skills"
509
+ harnessSkillDir: ".ai-sdk-harness/.harness-bootstrap/fx/implementation/home/.fx/skills",
510
+ pluginPlacement: "flat"
314
511
  },
315
512
  "grok-build": {
316
513
  rulesFile: "AGENTS.md",
317
514
  workspaceSkillDir: ".grok/skills",
318
- harnessSkillDir: ".ai-sdk-harness/.harness-bootstrap/grok-build/implementation/home/.grok/skills"
515
+ harnessSkillDir: ".ai-sdk-harness/.harness-bootstrap/grok-build/implementation/home/.grok/skills",
516
+ pluginPlacement: "namespaced"
319
517
  }
320
518
  };
321
519
  /** Every real agent reeval can drive, by harness kind. */
322
520
  const AGENTS = {
323
521
  cursor: {
324
522
  ...LAYOUTS.cursor,
523
+ pluginParts: PLUGIN_PARTS,
325
524
  name: "Cursor",
326
525
  factory: "cursor",
327
526
  credential: "CURSOR_API_KEY",
@@ -333,7 +532,7 @@ const AGENTS = {
333
532
  },
334
533
  unreported: cursorUnreported,
335
534
  mcpServers: cursorMcpServers,
336
- adapter: async ({ auth, mcpServers, descriptor }) => (await import("./src-WD-zgQYZ.js")).createCursorSdk({
535
+ adapter: async ({ auth, mcpServers, descriptor }) => (await import("./src-DrJSnoMR.js")).createCursorSdk({
337
536
  auth,
338
537
  ...mcpServers ? { mcpServers } : {},
339
538
  ...descriptor.kind === "cursor" && descriptor.params ? { modelParams: descriptor.params } : {},
@@ -343,6 +542,7 @@ const AGENTS = {
343
542
  },
344
543
  "claude-code": {
345
544
  ...LAYOUTS["claude-code"],
545
+ pluginParts: CLAUDE_FORMAT_PARTS,
346
546
  name: "Claude Code",
347
547
  factory: "claudeCode",
348
548
  credential: "ANTHROPIC_API_KEY",
@@ -369,7 +569,7 @@ const AGENTS = {
369
569
  }
370
570
  ],
371
571
  mcpServers: claudeMcpServers,
372
- adapter: async ({ auth, mcpServers, descriptor }) => (await import("./dist-CuY4ehEk.js")).createClaudeCode({
572
+ adapter: async ({ auth, mcpServers, descriptor }) => (await import("./dist-Dp_AJgYN.js")).createClaudeCode({
373
573
  auth,
374
574
  ...mcpServers ? { mcpServers } : {},
375
575
  ...descriptor.kind === "claude-code" && descriptor.effort ? { effort: descriptor.effort } : {},
@@ -381,6 +581,13 @@ const AGENTS = {
381
581
  },
382
582
  antigravity: {
383
583
  ...LAYOUTS.antigravity,
584
+ pluginParts: PLUGIN_PARTS,
585
+ pluginManifestsFirst: [
586
+ "plugin.json",
587
+ ".antigravity-plugin/plugin.json",
588
+ ".gemini-plugin/plugin.json",
589
+ "gemini-extension.json"
590
+ ],
384
591
  name: "Antigravity",
385
592
  factory: "antigravity",
386
593
  credential: "GEMINI_API_KEY",
@@ -391,15 +598,25 @@ const AGENTS = {
391
598
  },
392
599
  servedModel: geminiServedModel,
393
600
  mcpServers: antigravityMcpServers,
394
- adapter: async ({ auth, mcpServers, descriptor }) => (await import("./src-_oI9AePb.js")).createAntigravity({
601
+ adapter: async ({ auth, mcpServers, descriptor, plugins }) => (await import("./src-BAyg6CtQ.js")).createAntigravity({
395
602
  auth,
396
603
  ...mcpServers ? { mcpServers } : {},
604
+ ...plugins.length ? { plugins: plugins.map(({ name, dir }) => ({
605
+ name,
606
+ dir
607
+ })) } : {},
397
608
  ...descriptor.kind === "antigravity" && descriptor.effort ? { effort: descriptor.effort } : {},
398
609
  requireCredentialBrokering: true
399
610
  })
400
611
  },
401
612
  opencode: {
402
613
  ...LAYOUTS.opencode,
614
+ pluginParts: [
615
+ "skills",
616
+ "agents",
617
+ "commands",
618
+ "mcp"
619
+ ],
403
620
  name: "OpenCode",
404
621
  factory: "opencode",
405
622
  credential: "GOOGLE_GENERATIVE_AI_API_KEY",
@@ -407,7 +624,7 @@ const AGENTS = {
407
624
  servedModel: geminiServedModel,
408
625
  forModel: opencodeForModel,
409
626
  mcpServers: opencodeMcpServers,
410
- adapter: async ({ auth, mcpServers, descriptor }) => (await import("./src-CLoOMVWI.js")).createOpenCode({
627
+ adapter: async ({ auth, mcpServers, descriptor }) => (await import("./src-B3KCLZVk.js")).createOpenCode({
411
628
  auth,
412
629
  model: descriptor.model,
413
630
  vars: opencodeVars(descriptor.model),
@@ -418,13 +635,18 @@ const AGENTS = {
418
635
  },
419
636
  goose: {
420
637
  ...LAYOUTS.goose,
638
+ pluginParts: ["skills", "mcp"],
421
639
  name: "Goose",
422
640
  factory: "goose",
423
641
  credential: "GOOGLE_GENERATIVE_AI_API_KEY",
424
642
  endpoints: GOOSE_ENDPOINTS,
643
+ expectedBlocked: {
644
+ hosts: ["models.dev"],
645
+ why: "Goose's model catalogue refresh, which no setting turns off"
646
+ },
425
647
  servedModel: geminiServedModel,
426
648
  mcpServers: gooseMcpServers,
427
- adapter: async ({ auth, mcpServers, descriptor }) => (await import("./src-qsKCqv7a.js")).createGoose({
649
+ adapter: async ({ auth, mcpServers, descriptor }) => (await import("./src-dhSTRN50.js")).createGoose({
428
650
  auth: { GOOGLE_API_KEY: auth.GOOGLE_GENERATIVE_AI_API_KEY ?? "" },
429
651
  model: descriptor.model,
430
652
  ...descriptor.kind === "goose" && descriptor.effort ? { effort: descriptor.effort } : {},
@@ -434,13 +656,18 @@ const AGENTS = {
434
656
  },
435
657
  pi: {
436
658
  ...LAYOUTS.pi,
659
+ pluginParts: [
660
+ "skills",
661
+ "commands",
662
+ "mcp"
663
+ ],
437
664
  name: "pi",
438
665
  factory: "pi",
439
666
  credential: "GOOGLE_GENERATIVE_AI_API_KEY",
440
667
  endpoints: GEMINI_ENDPOINTS,
441
668
  servedModel: geminiServedModel,
442
669
  mcpServers: piMcpServers,
443
- adapter: async ({ auth, mcpServers, descriptor }) => (await import("./src-DSYYPEOj.js")).createPi({
670
+ adapter: async ({ auth, mcpServers, descriptor }) => (await import("./src-BezgGX4X.js")).createPi({
444
671
  auth: { GEMINI_API_KEY: auth.GOOGLE_GENERATIVE_AI_API_KEY ?? "" },
445
672
  ...descriptor.kind === "pi" && descriptor.effort ? { effort: descriptor.effort } : {},
446
673
  ...mcpServers ? { mcpServers } : {},
@@ -449,28 +676,47 @@ const AGENTS = {
449
676
  },
450
677
  codex: {
451
678
  ...LAYOUTS.codex,
679
+ pluginParts: ["skills", "mcp"],
680
+ pluginApps: "they need a ChatGPT login",
681
+ pluginManifestsFirst: ["plugin.json", ".codex-plugin/plugin.json"],
682
+ pluginRootManifestNeedsSchema: true,
683
+ pluginServersByName: true,
452
684
  name: "Codex",
453
685
  factory: "codex",
454
686
  credential: "OPENAI_API_KEY",
455
687
  endpoints: OPENAI_ENDPOINTS,
456
688
  modelResponses: OPENAI_ENDPOINTS,
689
+ expectedBlocked: {
690
+ hosts: [
691
+ "github.com",
692
+ "api.github.com",
693
+ "chatgpt.com"
694
+ ],
695
+ why: "Codex's plugin sync, which it runs on every turn once plugins are on",
696
+ withPlugins: true
697
+ },
457
698
  servedModel: openaiServedModel,
458
699
  mcpServers: codexMcpServers,
459
- adapter: async ({ auth, mcpServers, descriptor }) => (await import("./src-DCFtJRp0.js")).createCodex({
700
+ adapter: async ({ auth, mcpServers, descriptor, plugins }) => (await import("./src-ChBhk06Q.js")).createCodex({
460
701
  auth,
461
702
  ...descriptor.kind === "codex" && descriptor.effort ? { effort: descriptor.effort } : {},
462
703
  ...mcpServers ? { mcpServers } : {},
704
+ ...plugins.length ? { plugins: plugins.map(({ name, dir }) => ({
705
+ name,
706
+ dir
707
+ })) } : {},
463
708
  requireCredentialBrokering: true
464
709
  })
465
710
  },
466
711
  fx: {
467
712
  ...LAYOUTS.fx,
713
+ pluginParts: ["skills", "mcp"],
468
714
  name: "fx",
469
715
  factory: "fx",
470
716
  ...fxForModel("provider/model"),
471
717
  forModel: fxForModel,
472
718
  mcpServers: acpMcpServers,
473
- adapter: async ({ auth, mcpServers, descriptor }) => (await import("./src-BxfCKA3_.js")).createFx({
719
+ adapter: async ({ auth, mcpServers, descriptor }) => (await import("./src-CoqZYspK.js")).createFx({
474
720
  auth,
475
721
  model: descriptor.model,
476
722
  ...mcpServers ? { mcpServers } : {},
@@ -479,6 +725,8 @@ const AGENTS = {
479
725
  },
480
726
  "grok-build": {
481
727
  ...LAYOUTS["grok-build"],
728
+ pluginParts: CLAUDE_FORMAT_PARTS,
729
+ pluginServersByName: true,
482
730
  name: "Grok Build",
483
731
  factory: "grokBuild",
484
732
  credential: "XAI_API_KEY",
@@ -486,9 +734,13 @@ const AGENTS = {
486
734
  modelResponses: XAI_MODEL_RESPONSES,
487
735
  servedModel: xaiServedModel,
488
736
  mcpServers: acpMcpServers,
489
- adapter: async ({ auth, mcpServers, descriptor }) => (await import("./src-CcrQbpG8.js")).createGrokBuild({
737
+ adapter: async ({ auth, mcpServers, descriptor, plugins }) => (await import("./src-3mP821Pt.js")).createGrokBuild({
490
738
  auth,
491
739
  model: descriptor.model,
740
+ ...plugins.length ? {
741
+ pluginDirs: plugins.map((p) => p.dir),
742
+ pluginMcpServers: plugins.flatMap((p) => p.servers.map((s) => s.slice(p.name.length + 1)))
743
+ } : {},
492
744
  ...descriptor.kind === "grok-build" && descriptor.effort ? { effort: descriptor.effort } : {},
493
745
  ...mcpServers ? { mcpServers } : {},
494
746
  requireCredentialBrokering: true
@@ -527,6 +779,139 @@ function refusedMcp(harness, layers) {
527
779
  throw error;
528
780
  }
529
781
  }
782
+ /** The first host variable a plugin MCP server reads (`${VAR}`), as `VAR`; undefined for none. */
783
+ function hostVariable(s) {
784
+ const values = Object.entries(s.transport === "stdio" ? s.env : s.headers);
785
+ for (const [key, v] of values) {
786
+ if (typeof v === "string") continue;
787
+ if (v.kind === "secret") return v.from ?? key;
788
+ return /\$\{([A-Za-z_][A-Za-z0-9_]*)\}/.exec(v.template)?.[1] ?? key;
789
+ }
790
+ }
791
+ const quoted = (parts) => parts.map((p) => `'${p}'`).join(", ");
792
+ /**
793
+ * Why a harness's agent can't take the plugins, in the agent's own words: a part it doesn't
794
+ * load, apps it can't take (`pluginApps`), a hook event or type it doesn't run, a plugin MCP
795
+ * server it refuses (named `<plugin>:<server>`) or whose `<plugin>:<server>` key `mcp` already has,
796
+ * or, where it takes plugin items flat, a skill or MCP server whose name another already has, or a
797
+ * subagent, command or rule another unpacks to the same file. `own` names the
798
+ * environment's own skills and MCP servers, and `unread` the plugins not fetched yet (git and
799
+ * npm ones, at plan time) by their call. Undefined when it can take them.
800
+ */
801
+ function refusedPlugins(harness, plugins, own, unread = []) {
802
+ if (plugins.length === 0 && unread.length === 0) return void 0;
803
+ const agent = isAgentKind(harness.kind) ? AGENTS[harness.kind] : void 0;
804
+ const mimics = harness.kind === "fake" && harness.layout ? AGENTS[harness.layout] : void 0;
805
+ const loads = (agent ?? mimics)?.pluginParts ?? PLUGIN_PARTS;
806
+ const name = agent?.name ?? (mimics ? `The fake agent with ${mimics.name}'s layout` : "The fake agent");
807
+ if (loads.length === 0) return `${name} can't load plugins yet: leave ${plugins[0] ? `the ${plugins[0].name} plugin` : unread[0]} out of this cell`;
808
+ for (const p of plugins) {
809
+ const refused = p.kept.filter((part) => !loads.includes(part));
810
+ if (refused.length === 0) continue;
811
+ const can = p.kept.filter((part) => loads.includes(part));
812
+ const what = refused.map((part) => `${part} (${PART_PATHS[part]})`).join(" and ");
813
+ const fix = can.length ? `use only: [${quoted(can)}], or leave` : "leave";
814
+ return `${name} can't load the ${p.name} plugin's ${what}: ${fix} the plugin out of this cell`;
815
+ }
816
+ const reads = agent ?? mimics;
817
+ const first = reads?.pluginManifestsFirst ?? [];
818
+ for (const p of plugins) {
819
+ const other = p.manifests.find((m) => first.includes(m) && (m !== "plugin.json" || !reads?.pluginRootManifestNeedsSchema || p.rootSchema));
820
+ if (other) return `${name} reads the ${p.name} plugin's ${other} in place of its ${PLUGIN_MANIFEST}, so reeval can't hold it to the parts it places: remove ${other} from the plugin, or leave the plugin out of this cell`;
821
+ }
822
+ const apps = (agent ?? mimics)?.pluginApps;
823
+ const withApps = apps ? plugins.find((p) => p.apps) : void 0;
824
+ if (withApps) return `${name} can't load the ${withApps.name} plugin's apps: ${apps}`;
825
+ const layout = layoutOf(harness);
826
+ const runs = layout.pluginHookEvents;
827
+ for (const p of runs ? plugins : []) {
828
+ const event = p.hooks.events.find((e) => !runs?.includes(e));
829
+ const type = p.hooks.otherTypes[0];
830
+ if (!event && !type) continue;
831
+ const rest = p.kept.filter((part) => part !== "hooks");
832
+ const fix = rest.length ? `use only: [${quoted(rest)}], or leave` : "leave";
833
+ return event ? `${name} can't run the ${p.name} plugin's ${event} hooks (hooks/hooks.json): it runs ${runs?.join(", ")} hooks; ${fix} the plugin out of this cell` : `${name} can't run the ${p.name} plugin's ${type} hooks (hooks/hooks.json): it runs only command hooks; ${fix} the plugin out of this cell`;
834
+ }
835
+ const servers = Object.fromEntries(plugins.flatMap((p) => Object.entries(p.mcp).map(([server, s]) => [pluginServerName(p.name, server), s.transport === "stdio" ? {
836
+ ...s,
837
+ env: {}
838
+ } : {
839
+ ...s,
840
+ headers: {}
841
+ }])));
842
+ if (agent && Object.keys(servers).length) {
843
+ const alongside = agent.pluginPlacement === "flat" ? Object.fromEntries(own.mcp.map((n) => [n, {
844
+ transport: "stdio",
845
+ command: "true",
846
+ args: [],
847
+ env: {}
848
+ }])) : {};
849
+ try {
850
+ agent.mcpServers({
851
+ ...alongside,
852
+ ...servers
853
+ });
854
+ } catch (error) {
855
+ if (error instanceof InfraError) return error.message;
856
+ throw error;
857
+ }
858
+ }
859
+ for (const p of plugins) for (const server of Object.keys(p.mcp)) {
860
+ const key = pluginServerName(p.name, server);
861
+ if (own.mcp.includes(key)) return `the ${p.name} plugin's MCP server "${server}" would join mcp as ${key}, which mcp already names: rename mcp["${key}"]`;
862
+ }
863
+ if (layout.pluginPlacement === "namespaced") {
864
+ for (const p of plugins) {
865
+ if (!p.kept.includes("mcp")) continue;
866
+ for (const [server, s] of Object.entries(p.mcp)) {
867
+ const secret = hostVariable(s);
868
+ if (!secret) continue;
869
+ const rest = p.kept.filter((part) => part !== "mcp");
870
+ return `${name} loads the ${p.name} plugin's MCP server "${server}" itself, so reeval can't give it ${secret} from the host: use only: [${quoted(rest)}] and declare the server in mcp, where reeval fills it in`;
871
+ }
872
+ }
873
+ if (!(agent ?? mimics)?.pluginServersByName) return void 0;
874
+ const byName = new Map(own.mcp.map((n) => [n, `mcp.${n}`]));
875
+ for (const p of plugins) for (const server of Object.keys(p.mcp)) {
876
+ const other = byName.get(server);
877
+ if (other) return `${name} names the ${p.name} plugin's MCP server "${server}" by its own name, as it does ${other}, and keeps only one: rename one, or leave mcp out of the plugin with only`;
878
+ byName.set(server, `the ${p.name} plugin's MCP server "${server}"`);
879
+ }
880
+ return;
881
+ }
882
+ const serverOwner = new Map(own.mcp.map((n) => [n, `mcp.${n}`]));
883
+ for (const p of plugins) for (const server of Object.keys(p.mcp)) {
884
+ const other = serverOwner.get(server);
885
+ if (other) return `the ${p.name} plugin's MCP server "${server}" clashes with ${other}`;
886
+ serverOwner.set(server, `the ${p.name} plugin's MCP server "${server}"`);
887
+ }
888
+ const skillOwner = new Map(own.skills.map((s) => [s.name, `${s.call}'s "${s.name}"`]));
889
+ for (const p of plugins) for (const { name: skill } of p.skills) {
890
+ const other = skillOwner.get(skill);
891
+ if (other) return `the ${p.name} plugin's skill "${skill}" and ${other} would both be placed at ~/${layout.harnessSkillDir}/${skill}: rename one, or narrow it with only or exclude`;
892
+ skillOwner.set(skill, `the ${p.name} plugin's skill "${skill}"`);
893
+ }
894
+ for (const part of ["agents", "commands"]) {
895
+ const dir = layout.pluginUnpack?.[part];
896
+ if (!dir) continue;
897
+ const owner = /* @__PURE__ */ new Map();
898
+ for (const p of plugins) for (const item of p[part]) {
899
+ const other = owner.get(item);
900
+ const what = part === "agents" ? "subagent" : "command";
901
+ if (other) return `the ${p.name} plugin's ${what} "${item}" and the ${other} plugin's would both be placed at ${dir}/${item}.md: rename one, or narrow one with only`;
902
+ owner.set(item, p.name);
903
+ }
904
+ }
905
+ const rules = layout.pluginUnpack?.rules;
906
+ const ruleOwner = /* @__PURE__ */ new Map();
907
+ for (const p of rules ? plugins : []) for (const rule of p.rules) {
908
+ const file = `${p.name}-${rule.replace(/\.mdc?$/, "")}.mdc`;
909
+ const what = `the ${p.name} plugin's rule "${rule}"`;
910
+ const other = ruleOwner.get(file);
911
+ if (other) return `${what} and ${other} would both be placed at ${rules}/${file}: rename one, or narrow one with only`;
912
+ ruleOwner.set(file, what);
913
+ }
914
+ }
530
915
  /** A real agent's catalog entry, with what its model's provider decides. */
531
916
  function agentFor(h) {
532
917
  const agent = AGENTS[h.kind];
@@ -543,17 +928,22 @@ const credentialOf = (h) => agentOf(h)?.credential;
543
928
  const FAKE_LAYOUT = {
544
929
  rulesFile: "AGENTS.md",
545
930
  workspaceSkillDir: ".agents/skills",
546
- harnessSkillDir: ".agents/skills"
931
+ harnessSkillDir: ".agents/skills",
932
+ pluginPlacement: "flat"
547
933
  };
548
934
  /** Where a harness's agent reads rules and skills; a fake one with `layout` mimics that agent. */
549
935
  function layoutOf(descriptor) {
550
936
  if (descriptor.kind !== "fake") return LAYOUTS[descriptor.kind];
551
937
  return descriptor.layout ? LAYOUTS[descriptor.layout] : FAKE_LAYOUT;
552
938
  }
553
- /** The hosts a harness's agent is known to try; a fake agent with `layout` expects that agent's. */
554
- function expectedBlockedFor(descriptor) {
939
+ /**
940
+ * The hosts a harness's agent is known to try in a session with or without plugins; a fake agent
941
+ * with `layout` expects that agent's.
942
+ */
943
+ function expectedBlockedFor(descriptor, plugins) {
555
944
  const kind = descriptor.kind === "fake" ? descriptor.layout : descriptor.kind;
556
- return kind ? AGENTS[kind].expectedBlocked : void 0;
945
+ const expected = kind ? AGENTS[kind].expectedBlocked : void 0;
946
+ return expected?.withPlugins && !plugins ? void 0 : expected;
557
947
  }
558
948
  /**
559
949
  * How the APIs behind the harnesses say they refused a key: an HTTP 401, Anthropic's and OpenAI's
@@ -701,10 +1091,21 @@ async function createFakeSandbox(descriptor, env = {}) {
701
1091
  const base = await mkdtemp(join(parent, "reeval-sandbox-"));
702
1092
  const workdir = join(base, "work");
703
1093
  await mkdir(workdir);
1094
+ const stateDir = `${base}.state`;
1095
+ await mkdir(stateDir);
704
1096
  let destroyed;
705
1097
  const resolve = (path) => path.startsWith("~/") ? join(base, path.slice(2)) : join(workdir, path);
706
1098
  return {
707
1099
  workdir,
1100
+ stateDir,
1101
+ execOwn: (command, { signal } = {}) => run(sh, ["-c", command], {
1102
+ cwd: workdir,
1103
+ env: {
1104
+ HOME: base,
1105
+ ...env
1106
+ },
1107
+ signal
1108
+ }),
708
1109
  exec: (command, { cwd, env: extra, signal } = {}) => {
709
1110
  const tag = process.platform === "win32" && signal ? randomUUID() : void 0;
710
1111
  const stop = () => killTagged(sh, tag);
@@ -730,6 +1131,10 @@ async function createFakeSandbox(descriptor, env = {}) {
730
1131
  },
731
1132
  destroy: () => {
732
1133
  destroyed ??= (async () => {
1134
+ await rm(stateDir, {
1135
+ recursive: true,
1136
+ force: true
1137
+ }).catch(() => {});
733
1138
  if (process.platform === "win32") {
734
1139
  if (existsSync(base)) await runSh(sh, KILL_UNDER, base);
735
1140
  await removeTree(base);
@@ -767,11 +1172,12 @@ function harnessHosts(harness) {
767
1172
  if (harness.kind !== "fake" && isAgentKind(harness.kind)) return agentFor(harness).hosts ?? HARNESS_HOSTS[harness.kind];
768
1173
  return harness.kind === "fake" && harness.layout ? HARNESS_HOSTS[harness.layout] : [];
769
1174
  }
770
- /** MCP `http`/`sse` servers' hosts: the agent connects to them from the sandbox. */
1175
+ /** MCP `http`/`sse` servers' hosts, local plugins' included: the agent connects to them from the sandbox. */
771
1176
  function mcpServerHosts(layers) {
772
1177
  const urls = /* @__PURE__ */ new Map();
773
1178
  for (const { spec } of layers) for (const [name, server] of Object.entries(spec.mcp ?? {})) if (server.transport === "stdio") urls.delete(name);
774
1179
  else urls.set(name, server.url);
1180
+ for (const [name, server] of localPluginServers(layers)) if (server.transport !== "stdio") urls.set(name, server.url);
775
1181
  return [...urls.values()].flatMap((url) => URL.parse(url)?.hostname ?? []);
776
1182
  }
777
1183
  /**
@@ -802,6 +1208,22 @@ function allowedHosts({ policy, auto }) {
802
1208
  if (!isRestricted(policy)) return null;
803
1209
  return [.../* @__PURE__ */ new Set([...policy === "deny-all" ? [] : policy.allow, ...auto])];
804
1210
  }
1211
+ /**
1212
+ * The policy the Docker sandbox's gateway enforces: `deny-all` when a restricted policy allows no
1213
+ * host at all, else an allowlist. A listed IP address is an allowed range too, since the gateway
1214
+ * reaches a private address only through one.
1215
+ */
1216
+ function gatewayPolicy(planned) {
1217
+ const hosts = allowedHosts(planned);
1218
+ if (hosts === null) return { mode: "allow-all" };
1219
+ if (!hosts.length) return { mode: "deny-all" };
1220
+ const cidrs = hosts.filter((h) => isIP(h)).map((h) => `${h}/${isIP(h) === 6 ? 128 : 32}`);
1221
+ return {
1222
+ mode: "custom",
1223
+ allowedHosts: hosts,
1224
+ ...cidrs.length ? { allowedCIDRs: cidrs } : {}
1225
+ };
1226
+ }
805
1227
  /** What enforcing the policy takes: nothing, turning egress off, or a host allowlist. */
806
1228
  function egressNeeds(planned) {
807
1229
  if (!isRestricted(planned.policy)) return "none";
@@ -831,6 +1253,6 @@ function egressLabel({ policy, auto }) {
831
1253
  return auto.length ? `${own} + auto: ${auto.join(", ")}` : own;
832
1254
  }
833
1255
  //#endregion
834
- export { layoutOf as _, unenforceable as a, DEFAULT_HARNESS as c, agentFor as d, authHint as f, isAgentKind as g, expectedBlockedFor as h, plannedEgress as i, HARNESS_EXAMPLE as l, credentialOf as m, allowedHosts as n, createFakeSandbox as o, brokeringFor as p, egressLabel as r, AGENTS as s, DEFAULT_EGRESS_ALLOW as t, agentAuth as u, refusedMcp as v };
1256
+ export { writePluginFiles as C, refusedPlugins as S, credentialOf as _, plannedEgress as a, layoutOf as b, AGENTS as c, agentAuth as d, agentFor as f, claudeMcpServers as g, brokeringFor as h, gatewayPolicy as i, DEFAULT_HARNESS as l, authHint as m, allowedHosts as n, unenforceable as o, agentMcp as p, egressLabel as r, createFakeSandbox as s, DEFAULT_EGRESS_ALLOW as t, HARNESS_EXAMPLE as u, expectedBlockedFor as v, refusedMcp as x, isAgentKind as y };
835
1257
 
836
- //# sourceMappingURL=egress-2-qzPvGi.js.map
1258
+ //# sourceMappingURL=egress-DEAvq8Fl.js.map