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.
- package/README.md +115 -257
- package/assets/package.json +1 -1
- package/assets/pnpm-lock.yaml +41 -30
- package/bin/mcp-timer.cjs +224 -0
- package/dist/{adapter-Bwy3QxAK.js → adapter-IKKo4sZj.js} +4 -4
- package/dist/{adapter-Bwy3QxAK.js.map → adapter-IKKo4sZj.js.map} +1 -1
- package/dist/{agent-DpE80WPz.js → agent-ClE-g9VL.js} +22 -7
- package/dist/{agent-DpE80WPz.js.map → agent-ClE-g9VL.js.map} +1 -1
- package/dist/{analysis-Bxub9LMT.js → analysis-B0nOfAzA.js} +3 -3
- package/dist/{analysis-Bxub9LMT.js.map → analysis-B0nOfAzA.js.map} +1 -1
- package/dist/{assemble-D9GWr-HS.js → assemble-BO93VAk1.js} +22 -20
- package/dist/assemble-BO93VAk1.js.map +1 -0
- package/dist/assemble-VQxyoDxK.js +1 -0
- package/dist/{attempt-CGPV3BZY.js → attempt-jI0OWxlz.js} +2 -2
- package/dist/{attempt-CGPV3BZY.js.map → attempt-jI0OWxlz.js.map} +1 -1
- package/dist/bridge/index.mjs +2 -1
- package/dist/{capture-BQlGHiMC.js → capture-dn2hjSLj.js} +29 -21
- package/dist/{capture-BQlGHiMC.js.map → capture-dn2hjSLj.js.map} +1 -1
- package/dist/capture-nIJ-7kUE.js +1 -0
- package/dist/{cli-ClpPT8kn.js → cli-BCE1xlm4.js} +176 -120
- package/dist/cli-BCE1xlm4.js.map +1 -0
- package/dist/{cli-spec-qmEnQ25_.js → cli-spec-BXIBUlaK.js} +34 -15
- package/dist/cli-spec-BXIBUlaK.js.map +1 -0
- package/dist/cli.js +2 -2
- package/dist/{command-BlM0y8jN.js → command-Bh3yhN_b.js} +8 -8
- package/dist/{command-BlM0y8jN.js.map → command-Bh3yhN_b.js.map} +1 -1
- package/dist/command-C6vwmjS7.js +91 -0
- package/dist/command-C6vwmjS7.js.map +1 -0
- package/dist/{command-DbAe1Rzb.js → command-CANun0m0.js} +16 -19
- package/dist/command-CANun0m0.js.map +1 -0
- package/dist/command-CBaHukyl.js +335 -0
- package/dist/command-CBaHukyl.js.map +1 -0
- package/dist/{command-TgbzPizb.js → command-D_kEnYcX.js} +17 -16
- package/dist/command-D_kEnYcX.js.map +1 -0
- package/dist/commands-7tH3EsVu.js +666 -0
- package/dist/commands-7tH3EsVu.js.map +1 -0
- package/dist/{commands-CthqwkAn.js → commands-BKGzBMgb.js} +1 -1
- package/dist/{config-DrVSEVN0.js → config-D7TFvUpL.js} +40 -55
- package/dist/config-D7TFvUpL.js.map +1 -0
- package/dist/{context-C1mxXh80.js → context-Dgn48BqT.js} +13 -2
- package/dist/context-Dgn48BqT.js.map +1 -0
- package/dist/{contrasts-5zsj32gk.js → contrasts-B4nOhn0Z.js} +3 -3
- package/dist/{contrasts-5zsj32gk.js.map → contrasts-B4nOhn0Z.js.map} +1 -1
- package/dist/db-DJUuFoWQ.js +602 -0
- package/dist/db-DJUuFoWQ.js.map +1 -0
- package/dist/db-W9EFlXnn.js +2 -0
- package/dist/{dist-CuY4ehEk.js → dist-Dp_AJgYN.js} +3 -3
- package/dist/{dist-CuY4ehEk.js.map → dist-Dp_AJgYN.js.map} +1 -1
- package/dist/{docker-D1HZDS6q.js → docker-CQxucRPe.js} +16 -15
- package/dist/docker-CQxucRPe.js.map +1 -0
- package/dist/{docker-DNmMPOBb.js → docker-Dac6Zalz.js} +1 -1
- package/dist/{docker-DOvjji9I.js → docker-DuHcQidD.js} +3 -3
- package/dist/{docker-DOvjji9I.js.map → docker-DuHcQidD.js.map} +1 -1
- package/dist/{doctor-D2MbNO8L.js → doctor-De_QlOTM.js} +72 -38
- package/dist/doctor-De_QlOTM.js.map +1 -0
- package/dist/{egress-2-qzPvGi.js → egress-DEAvq8Fl.js} +453 -31
- package/dist/egress-DEAvq8Fl.js.map +1 -0
- package/dist/env-BQqj93gu.js +21 -0
- package/dist/env-BQqj93gu.js.map +1 -0
- package/dist/{environment-Cca6a4wB.js → environment-B4IuURK1.js} +247 -14
- package/dist/environment-B4IuURK1.js.map +1 -0
- package/dist/{evaluate-DMyaGQEj.d.ts → evaluate-C9-ritA5.d.ts} +2 -2
- package/dist/{evaluate-DKIl54Hb.js → evaluate-Djk1YPFL.js} +540 -560
- package/dist/evaluate-Djk1YPFL.js.map +1 -0
- package/dist/facts-Cfx1H70y.js +898 -0
- package/dist/facts-Cfx1H70y.js.map +1 -0
- package/dist/files-Bs6H3HiG.js +65 -0
- package/dist/files-Bs6H3HiG.js.map +1 -0
- package/dist/{files-BpUYBwGu.js → files-CN1QfenC.js} +31 -8
- package/dist/files-CN1QfenC.js.map +1 -0
- package/dist/files-CtjEXWXm.js +1 -0
- package/dist/{files-BXHZFWmx.js → files-D27nUk0K.js} +6 -17
- package/dist/files-D27nUk0K.js.map +1 -0
- package/dist/files-D3gJa91B.js +1 -0
- package/dist/generate-BnrvBAzF.js +1646 -0
- package/dist/generate-BnrvBAzF.js.map +1 -0
- package/dist/{git-Crl3b87o.js → git-rPfl7AD1.js} +3 -3
- package/dist/{git-Crl3b87o.js.map → git-rPfl7AD1.js.map} +1 -1
- package/dist/{harness-CEuntrla.js → harness-1OkumOAm.js} +3 -3
- package/dist/{harness-CEuntrla.js.map → harness-1OkumOAm.js.map} +1 -1
- package/dist/harness.d.ts +1 -1
- package/dist/harness.js +1 -1
- package/dist/{header-DHQv_ZrF.js → header-BVzbRnNv.js} +10 -3
- package/dist/{header-DHQv_ZrF.js.map → header-BVzbRnNv.js.map} +1 -1
- package/dist/{images-Bi3aGxb9.js → images-m784ueGK.js} +61 -13
- package/dist/images-m784ueGK.js.map +1 -0
- package/dist/index.d.ts +3 -3
- package/dist/index.js +4 -4
- package/dist/init-hiTkiM4L.js +543 -0
- package/dist/init-hiTkiM4L.js.map +1 -0
- package/dist/init-kMkTgTZc.js +1 -0
- package/dist/insights-B2Xmhz9o.js +64 -0
- package/dist/insights-B2Xmhz9o.js.map +1 -0
- package/dist/{invocations-BYDPe3fV.js → invocations-D_ePcwyL.js} +4 -4
- package/dist/{invocations-BYDPe3fV.js.map → invocations-D_ePcwyL.js.map} +1 -1
- package/dist/{judge-DW_GDOmB.js → judge-CEDIfRiU.js} +50 -15
- package/dist/judge-CEDIfRiU.js.map +1 -0
- package/dist/judge.d.ts +7 -6
- package/dist/judge.js +8 -7
- package/dist/judge.js.map +1 -1
- package/dist/{live-jlfszAbb.js → live-DYd2QEyR.js} +2 -2
- package/dist/{live-jlfszAbb.js.map → live-DYd2QEyR.js.map} +1 -1
- package/dist/model-B8H3gL69.js +1 -0
- package/dist/{model-DaVCY3rb.js → model-CTiuzkWw.js} +9 -7
- package/dist/model-CTiuzkWw.js.map +1 -0
- package/dist/model-DcIbmggK.js +1 -0
- package/dist/{model-D0IcOQao.js → model-DpkclE4r.js} +60 -25
- package/dist/model-DpkclE4r.js.map +1 -0
- package/dist/{model-DaX4bNLZ.js → model-UgHDMhI1.js} +144 -46
- package/dist/model-UgHDMhI1.js.map +1 -0
- package/dist/{node-B3ydHo6t.js → node-CGZYh4Fj.js} +4 -4
- package/dist/{node-B3ydHo6t.js.map → node-CGZYh4Fj.js.map} +1 -1
- package/dist/{opencode-providers-J9colP0-.js → opencode-providers-snfeWd6Z.js} +86 -47
- package/dist/opencode-providers-snfeWd6Z.js.map +1 -0
- package/dist/{options-C0d0AzeR.js → options-CyAyLjgJ.js} +22 -11
- package/dist/options-CyAyLjgJ.js.map +1 -0
- package/dist/{pairs-CnInRu-G.js → pairs-DP6XOJby.js} +2 -2
- package/dist/{pairs-CnInRu-G.js.map → pairs-DP6XOJby.js.map} +1 -1
- package/dist/{patch-B1bnfhN-.js → patch-uMq9rCl_.js} +2 -2
- package/dist/{patch-B1bnfhN-.js.map → patch-uMq9rCl_.js.map} +1 -1
- package/dist/{plan-DgQxp9yy.js → plan-CZYgXnZh.js} +21 -8
- package/dist/plan-CZYgXnZh.js.map +1 -0
- package/dist/plugins-P-uh54VF.js +654 -0
- package/dist/plugins-P-uh54VF.js.map +1 -0
- package/dist/{preflight-DlQvbySb.js → preflight-BQlPTHVu.js} +1 -1
- package/dist/{preflight-BRzD30L5.js → preflight-D3HvKeAx.js} +14 -10
- package/dist/preflight-D3HvKeAx.js.map +1 -0
- package/dist/prepare-DCwM2KKD.js +2 -0
- package/dist/{prepare-B_y-AFMv.js → prepare-Dx7dOnJB.js} +70 -23
- package/dist/prepare-Dx7dOnJB.js.map +1 -0
- package/dist/{provenance-DQ0AXn6c.js → provenance-C_-8y-x3.js} +4 -4
- package/dist/{provenance-DQ0AXn6c.js.map → provenance-C_-8y-x3.js.map} +1 -1
- package/dist/{providers-DoTq1jHW.js → providers-CF5UEaP8.js} +24 -10
- package/dist/providers-CF5UEaP8.js.map +1 -0
- package/dist/providers-CTBYvMxu.js +1 -0
- package/dist/{query-BO-ux7RB.js → query-DXthKmq0.js} +3 -3
- package/dist/{query-BO-ux7RB.js.map → query-DXthKmq0.js.map} +1 -1
- package/dist/query-D_1ARx5q.js +1 -0
- package/dist/{questions-C2dym2ce.js → questions-KENpWnfV.js} +8 -9
- package/dist/questions-KENpWnfV.js.map +1 -0
- package/dist/{record-BKmMvZ6O.js → record-kk9M1hj-.js} +8 -4
- package/dist/record-kk9M1hj-.js.map +1 -0
- package/dist/{redact-DJ9JCShu.js → redact-CRGdfV2s.js} +4 -2
- package/dist/redact-CRGdfV2s.js.map +1 -0
- package/dist/remarks-1521zwfW.js +38 -0
- package/dist/remarks-1521zwfW.js.map +1 -0
- package/dist/remarks-BhAV1H4V.js +1 -0
- package/dist/remarks-Ml6bcSdV.js +278 -0
- package/dist/remarks-Ml6bcSdV.js.map +1 -0
- package/dist/{remote-CPPW86Q9.js → remote-Dkeghk8k.js} +3 -3
- package/dist/{remote-CPPW86Q9.js.map → remote-Dkeghk8k.js.map} +1 -1
- package/dist/resolve-CMmhACr6.js +1 -0
- package/dist/resolve-DzdWcIL6.js +724 -0
- package/dist/resolve-DzdWcIL6.js.map +1 -0
- package/dist/{results-BE2f-1XS.js → results-D-naai_Q.js} +33 -8
- package/dist/results-D-naai_Q.js.map +1 -0
- package/dist/{resume-Ca1c8vix.js → resume-8-nnW8iO.js} +4 -4
- package/dist/{resume-Ca1c8vix.js.map → resume-8-nnW8iO.js.map} +1 -1
- package/dist/{root-DICDHCtp.js → root-DNuLhaA5.js} +2 -2
- package/dist/root-DNuLhaA5.js.map +1 -0
- package/dist/rules-CcV3zLDR.js +318 -0
- package/dist/rules-CcV3zLDR.js.map +1 -0
- package/dist/run-Bel7Vde4.js +88 -0
- package/dist/run-Bel7Vde4.js.map +1 -0
- package/dist/{sandbox-DLrsvu7U.js → sandbox-YLbk9mO7.js} +2 -2
- package/dist/{sandbox-DLrsvu7U.js.map → sandbox-YLbk9mO7.js.map} +1 -1
- package/dist/sandbox.d.ts +1 -1
- package/dist/sandbox.js +1 -1
- package/dist/server-C-ysqkLv.js +1 -0
- package/dist/{server-TUY5xA_A.js → server-De8oH3bt.js} +10 -10
- package/dist/{server-TUY5xA_A.js.map → server-De8oH3bt.js.map} +1 -1
- package/dist/{source-DJGS0a0u.js → source-C686eZpY.js} +2 -2
- package/dist/{source-DJGS0a0u.js.map → source-C686eZpY.js.map} +1 -1
- package/dist/source-DjgypUHW.js +1 -0
- package/dist/src-3mP821Pt.js +2 -0
- package/dist/src-B3KCLZVk.js +3 -0
- package/dist/src-BAyg6CtQ.js +2 -0
- package/dist/{src-CF17Ug08.js → src-BYLM3hEz.js} +22 -6
- package/dist/src-BYLM3hEz.js.map +1 -0
- package/dist/src-BezgGX4X.js +2 -0
- package/dist/{src-DvCg0NBs.js → src-C7W6kg81.js} +40 -10
- package/dist/{src-DvCg0NBs.js.map → src-C7W6kg81.js.map} +1 -1
- package/dist/{src-ftu5wPSt.js → src-CIpKL45U.js} +782 -169
- package/dist/src-CIpKL45U.js.map +1 -0
- package/dist/src-ChBhk06Q.js +2 -0
- package/dist/{src-BxfCKA3_.js → src-CoqZYspK.js} +1 -1
- package/dist/{src-CFp86GtV.js → src-CzQrAcF8.js} +49 -49
- package/dist/src-CzQrAcF8.js.map +1 -0
- package/dist/src-D9fSTxlc.js +1 -0
- package/dist/{src-FGXhkEkH.js → src-DeY52Gyf.js} +182 -23
- package/dist/src-DeY52Gyf.js.map +1 -0
- package/dist/src-DrJSnoMR.js +2 -0
- package/dist/{src-DvK0EIZx.js → src-Xj_BZKbq.js} +112 -13
- package/dist/src-Xj_BZKbq.js.map +1 -0
- package/dist/{src-u8_ixn_F.js → src-cbCb-MPy.js} +20 -4
- package/dist/src-cbCb-MPy.js.map +1 -0
- package/dist/src-dhSTRN50.js +2 -0
- package/dist/{src-C7_1SqDP.js → src-djNNYIdP.js} +2 -2
- package/dist/{src-C7_1SqDP.js.map → src-djNNYIdP.js.map} +1 -1
- package/dist/state-BGWGAwdo.js +1 -0
- package/dist/{state-DfpHox6b.js → state-C0i_ujQZ.js} +19 -17
- package/dist/{state-DfpHox6b.js.map → state-C0i_ujQZ.js.map} +1 -1
- package/dist/studio-app/assets/{index-CBkhNAv8.js → index-Bb_cid9k.js} +9 -9
- package/dist/studio-app/index.html +1 -1
- package/dist/{suite-Cw_7G2RM.js → suite-DmuF_ApO.js} +80 -30
- package/dist/suite-DmuF_ApO.js.map +1 -0
- package/dist/suite-mn9g4veR.js +2 -0
- package/dist/{summary-BUKfU-9l.js → summary-BFMHMTz2.js} +273 -47
- package/dist/summary-BFMHMTz2.js.map +1 -0
- package/dist/testing.d.ts +2 -2
- package/dist/testing.js +2 -2
- package/dist/{text-gEcKjAyp.js → text-CrVy5ioL.js} +18 -2
- package/dist/text-CrVy5ioL.js.map +1 -0
- package/dist/{transcript-BNNANU8A.js → transcript-BTxJpW4R.js} +2 -2
- package/dist/{transcript-BNNANU8A.js.map → transcript-BTxJpW4R.js.map} +1 -1
- package/dist/{types-BYdlwMwo.d.ts → types-B-9b1MDV.d.ts} +850 -34
- package/dist/types-C5vI3g1C.js.map +1 -1
- package/dist/usage-BDo2q_yu.js +1 -0
- package/dist/{command-Bj39y-Wm.js → validate-DWjkshl1.js} +20 -377
- package/dist/validate-DWjkshl1.js.map +1 -0
- package/dist/view/index.d.ts +31 -263
- package/dist/view/index.js +8 -7
- package/dist/views-DE2A1jEX.js +2 -0
- package/dist/{views-B8w2J-gD.js → views-Dk8MCQKr.js} +8 -98
- package/dist/views-Dk8MCQKr.js.map +1 -0
- package/dist/{worker-entry-DNnveLqx.js → worker-entry-CqrzGPF4.js} +2 -2
- package/dist/{worker-entry-DNnveLqx.js.map → worker-entry-CqrzGPF4.js.map} +1 -1
- package/dist/workspace-B1eGO46M.js +1 -0
- package/dist/{workspace-C4RA3srV.js → workspace-CLeOybkr.js} +45 -11
- package/dist/workspace-CLeOybkr.js.map +1 -0
- package/package.json +5 -1
- package/skills/eval-rubric/SKILL.md +130 -0
- package/dist/agent-D483ru7D.js +0 -334
- package/dist/agent-D483ru7D.js.map +0 -1
- package/dist/assemble-D5KGrwnJ.js +0 -1
- package/dist/assemble-D9GWr-HS.js.map +0 -1
- package/dist/capture-CYGLpWxR.js +0 -1
- package/dist/cli-ClpPT8kn.js.map +0 -1
- package/dist/cli-spec-qmEnQ25_.js.map +0 -1
- package/dist/command-Bj39y-Wm.js.map +0 -1
- package/dist/command-C-cVjlny.js +0 -1
- package/dist/command-DbAe1Rzb.js.map +0 -1
- package/dist/command-TgbzPizb.js.map +0 -1
- package/dist/commands-YUwlyTbr.js +0 -228
- package/dist/commands-YUwlyTbr.js.map +0 -1
- package/dist/config-DrVSEVN0.js.map +0 -1
- package/dist/context-C1mxXh80.js.map +0 -1
- package/dist/db-CKg5NtiW.js +0 -2
- package/dist/db-DfhipHEF.js +0 -1416
- package/dist/db-DfhipHEF.js.map +0 -1
- package/dist/docker-D1HZDS6q.js.map +0 -1
- package/dist/doctor-D2MbNO8L.js.map +0 -1
- package/dist/egress-2-qzPvGi.js.map +0 -1
- package/dist/environment-Cca6a4wB.js.map +0 -1
- package/dist/evaluate-DKIl54Hb.js.map +0 -1
- package/dist/files-BXHZFWmx.js.map +0 -1
- package/dist/files-BpUYBwGu.js.map +0 -1
- package/dist/files-Bw8lWEjg.js +0 -1
- package/dist/files-D6J0iSdx.js +0 -1
- package/dist/images-Bi3aGxb9.js.map +0 -1
- package/dist/init-Cl3f3NBT.js +0 -360
- package/dist/init-Cl3f3NBT.js.map +0 -1
- package/dist/init-fhOXED8F.js +0 -1
- package/dist/judge-DW_GDOmB.js.map +0 -1
- package/dist/model-CXhrziBe.js +0 -1
- package/dist/model-D0IcOQao.js.map +0 -1
- package/dist/model-DaVCY3rb.js.map +0 -1
- package/dist/model-DaX4bNLZ.js.map +0 -1
- package/dist/model-_bxNrk2h.js +0 -1
- package/dist/opencode-providers-J9colP0-.js.map +0 -1
- package/dist/options-C0d0AzeR.js.map +0 -1
- package/dist/plan-DgQxp9yy.js.map +0 -1
- package/dist/preflight-BRzD30L5.js.map +0 -1
- package/dist/prepare-B_y-AFMv.js.map +0 -1
- package/dist/prepare-DCKTLHN3.js +0 -2
- package/dist/providers-B9yTdIqF.js +0 -1
- package/dist/providers-DoTq1jHW.js.map +0 -1
- package/dist/query-CRQfsw0e.js +0 -1
- package/dist/questions-C2dym2ce.js.map +0 -1
- package/dist/record-BKmMvZ6O.js.map +0 -1
- package/dist/redact-DJ9JCShu.js.map +0 -1
- package/dist/results-BE2f-1XS.js.map +0 -1
- package/dist/root-DICDHCtp.js.map +0 -1
- package/dist/server-Dp8eOeK5.js +0 -1
- package/dist/source-DdbLGR1M.js +0 -1
- package/dist/src-CF17Ug08.js.map +0 -1
- package/dist/src-CFp86GtV.js.map +0 -1
- package/dist/src-CLoOMVWI.js +0 -3
- package/dist/src-CcrQbpG8.js +0 -2
- package/dist/src-DCFtJRp0.js +0 -2
- package/dist/src-DSYYPEOj.js +0 -2
- package/dist/src-DYO3DdnQ.js +0 -1
- package/dist/src-DvK0EIZx.js.map +0 -1
- package/dist/src-FGXhkEkH.js.map +0 -1
- package/dist/src-WD-zgQYZ.js +0 -2
- package/dist/src-_oI9AePb.js +0 -2
- package/dist/src-ftu5wPSt.js.map +0 -1
- package/dist/src-qsKCqv7a.js +0 -2
- package/dist/src-u8_ixn_F.js.map +0 -1
- package/dist/state-DpAxYyED.js +0 -1
- package/dist/suite-Cw_7G2RM.js.map +0 -1
- package/dist/suite-DamAEnNF.js +0 -1
- package/dist/summary-BUKfU-9l.js.map +0 -1
- package/dist/summary-Baa4rTHS.js +0 -192
- package/dist/summary-Baa4rTHS.js.map +0 -1
- package/dist/text-gEcKjAyp.js.map +0 -1
- package/dist/tools-DLHgetpx.js +0 -249
- package/dist/tools-DLHgetpx.js.map +0 -1
- package/dist/views-B8w2J-gD.js.map +0 -1
- package/dist/views-DblnI3kA.js +0 -2
- package/dist/workspace-C4RA3srV.js.map +0 -1
- 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-
|
|
3
|
-
import {
|
|
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
|
-
|
|
189
|
-
|
|
190
|
-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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
|
-
/**
|
|
554
|
-
|
|
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
|
-
|
|
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 {
|
|
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-
|
|
1258
|
+
//# sourceMappingURL=egress-DEAvq8Fl.js.map
|