@ebrindley/build 0.0.0-stage → 1.42.1-rc28
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/.build-project/providers/catalog.json +13951 -0
- package/.build-project/providers/pricing.json +1978 -0
- package/.build-project/providers/registry.json +4103 -0
- package/.github/SECURITY.md +75 -0
- package/.nvmrc +1 -0
- package/CHANGELOG.md +661 -0
- package/CODE_OF_CONDUCT.md +44 -0
- package/CONTRIBUTING.md +24 -0
- package/INSTALL.md +623 -0
- package/LICENSE +21 -0
- package/README.md +118 -2
- package/THIRD_PARTY_NOTICES.txt +26 -0
- package/dist/ai-judge-UE5UOYOO.js +191 -0
- package/dist/allowlist-grounding-KPLN6NC5.js +16 -0
- package/dist/allowlist-utils-MZZKKXRD.js +31 -0
- package/dist/apply-completion-mode-EM37UZHB.js +110 -0
- package/dist/artifact-migrator-WPACNSEP.js +276 -0
- package/dist/ask-2OZ4JFQR.js +176 -0
- package/dist/auth-6UKBTJUQ.js +185 -0
- package/dist/auth-H5KJL6HL.js +165 -0
- package/dist/auth-LVJRJDMU.js +12 -0
- package/dist/auth-NHZOCNRR.js +94 -0
- package/dist/auth-PBXHWXGW.js +95 -0
- package/dist/auth-T7Y5DCAH.js +91 -0
- package/dist/auth-TVVKCHQW.js +13 -0
- package/dist/auth-UHB2UCSS.js +97 -0
- package/dist/auth-VACA3VUL.js +98 -0
- package/dist/auth-VVLC77S3.js +44 -0
- package/dist/auth-liveness-XO4AGDDD.js +53 -0
- package/dist/autoloop-cleanup-SI3VGAAR.js +106 -0
- package/dist/autoloop-evidence-gates-J5GG5YQB.js +39 -0
- package/dist/autoloop-gate-policy-SUNAEP6Q.js +169 -0
- package/dist/autoloop-helpers-VQGQNTT6.js +52 -0
- package/dist/autoloop-ledger-P6TIDP7C.js +96 -0
- package/dist/autoloop-ledger-subscriber-HFAGOZXH.js +161 -0
- package/dist/autoloop-run-defaults-GWGZBNT7.js +27 -0
- package/dist/autoloop-run-lock-GBWRM5A2.js +197 -0
- package/dist/autoloop-success-C32QVWOP.js +93 -0
- package/dist/autoloop-termination-summary-GI6IBQWD.js +58 -0
- package/dist/autoloop-trajectory-AMKSQISD.js +70 -0
- package/dist/autoloop-wall-clock-T7ZVIQOC.js +12 -0
- package/dist/automatic-branch-cleanup-R62X2C5O.js +49 -0
- package/dist/autonomous-loop-controller-2WL363LW.js +4386 -0
- package/dist/backend-YUTFDZXZ.js +30 -0
- package/dist/background-executor-Z3ODTMD7.js +260 -0
- package/dist/backlog-75QPEAMW.js +403 -0
- package/dist/backlog-execution-intent-GWUV5TUK.js +19 -0
- package/dist/backup-active-store-XHWLN34M.js +16 -0
- package/dist/backup-machine-stores-UI4LTJOY.js +251 -0
- package/dist/backup-telemetry-db-Z4ICYCNW.js +26 -0
- package/dist/branch-archive-manager-FMSQ7YJF.js +18 -0
- package/dist/branch-cleanup-manager-ST6FJGND.js +35 -0
- package/dist/build-gate-7NKWPY62.js +68 -0
- package/dist/build-root-S7DINODY.js +18 -0
- package/dist/change-summary-R6CB6VXJ.js +50 -0
- package/dist/chunk-24MNKKOM.js +173 -0
- package/dist/chunk-2H6VZFIO.js +235 -0
- package/dist/chunk-2JIX3EKV.js +39 -0
- package/dist/chunk-2KO7HVZM.js +106 -0
- package/dist/chunk-2L36U25O.js +100 -0
- package/dist/chunk-2NMNFUQA.js +475 -0
- package/dist/chunk-2OUAEH67.js +83 -0
- package/dist/chunk-2VLJUXJU.js +115 -0
- package/dist/chunk-2VUEDIUM.js +77 -0
- package/dist/chunk-2Y2IIHPI.js +430 -0
- package/dist/chunk-2YRG3LHZ.js +220 -0
- package/dist/chunk-2Z5Q3SUY.js +65 -0
- package/dist/chunk-32IYXIE5.js +873 -0
- package/dist/chunk-33IGPPUI.js +292 -0
- package/dist/chunk-352PCJLK.js +283 -0
- package/dist/chunk-35J4NE6S.js +226 -0
- package/dist/chunk-3C7WBIVK.js +1016 -0
- package/dist/chunk-3H3EY6U7.js +1225 -0
- package/dist/chunk-3H4MWYIC.js +198 -0
- package/dist/chunk-3HHWQR3N.js +2479 -0
- package/dist/chunk-3JKNRYEE.js +14 -0
- package/dist/chunk-3LECCYZY.js +128 -0
- package/dist/chunk-3LOY6YZI.js +852 -0
- package/dist/chunk-3M57DADF.js +44 -0
- package/dist/chunk-3NOTLVLG.js +3803 -0
- package/dist/chunk-3OPP2OZB.js +1480 -0
- package/dist/chunk-3P5IN5E7.js +9 -0
- package/dist/chunk-3PL22IYZ.js +20 -0
- package/dist/chunk-3REDAJUJ.js +14 -0
- package/dist/chunk-3S2R4XJI.js +203 -0
- package/dist/chunk-3UBZI5DW.js +61 -0
- package/dist/chunk-3VV5OBGG.js +308 -0
- package/dist/chunk-3WY5TU2O.js +823 -0
- package/dist/chunk-43OKHTW4.js +82 -0
- package/dist/chunk-45KUJBDI.js +112 -0
- package/dist/chunk-47X5LM7B.js +224 -0
- package/dist/chunk-4B6FQJ77.js +268 -0
- package/dist/chunk-4BTDUT2S.js +42 -0
- package/dist/chunk-4DJL2VXA.js +24 -0
- package/dist/chunk-4EBSXZ73.js +48 -0
- package/dist/chunk-4QKP6I4C.js +294 -0
- package/dist/chunk-4U6XK2DG.js +300 -0
- package/dist/chunk-4UMRUFBD.js +132 -0
- package/dist/chunk-4US4SYJ4.js +569 -0
- package/dist/chunk-4ZPLWEZO.js +154 -0
- package/dist/chunk-56WPYDJH.js +624 -0
- package/dist/chunk-57WRCJJW.js +50 -0
- package/dist/chunk-5AW4RMNG.js +24 -0
- package/dist/chunk-5EQN56OZ.js +155 -0
- package/dist/chunk-5F43TUIN.js +38 -0
- package/dist/chunk-5FKHIKTS.js +115 -0
- package/dist/chunk-5HDP7XZG.js +91 -0
- package/dist/chunk-5KQETTNS.js +152 -0
- package/dist/chunk-5PDVN2KO.js +498 -0
- package/dist/chunk-5UBIFVRD.js +509 -0
- package/dist/chunk-5YDE3Q62.js +46 -0
- package/dist/chunk-626AJVMU.js +302 -0
- package/dist/chunk-633XZ7UF.js +3583 -0
- package/dist/chunk-63DHNHGA.js +236 -0
- package/dist/chunk-666656AR.js +568 -0
- package/dist/chunk-67YRJPJO.js +19 -0
- package/dist/chunk-6CAU7VBA.js +20 -0
- package/dist/chunk-6CB3KJRY.js +21 -0
- package/dist/chunk-6DBMALXL.js +29 -0
- package/dist/chunk-6E25C4IA.js +269 -0
- package/dist/chunk-6FIBNIQU.js +73 -0
- package/dist/chunk-6G57FYBV.js +189 -0
- package/dist/chunk-6KZKRTG3.js +4885 -0
- package/dist/chunk-6LAH2UV2.js +525 -0
- package/dist/chunk-6PZY2TTU.js +921 -0
- package/dist/chunk-6T6NHXK4.js +230 -0
- package/dist/chunk-6TBEX4R4.js +432 -0
- package/dist/chunk-6TRD7TEE.js +911 -0
- package/dist/chunk-6XCP2RAI.js +47 -0
- package/dist/chunk-726G6WDL.js +351 -0
- package/dist/chunk-75EMT7BF.js +616 -0
- package/dist/chunk-762ACDZJ.js +4696 -0
- package/dist/chunk-77I6G4CO.js +1 -0
- package/dist/chunk-7DJ6SQH3.js +510 -0
- package/dist/chunk-7HPCIOMA.js +1383 -0
- package/dist/chunk-7HYBSRPZ.js +17503 -0
- package/dist/chunk-7KBEOPVB.js +73 -0
- package/dist/chunk-7LHJDJB3.js +2222 -0
- package/dist/chunk-7NVJMH52.js +306 -0
- package/dist/chunk-7RMARDVH.js +33 -0
- package/dist/chunk-7SEWU4QG.js +36 -0
- package/dist/chunk-7TUTZTI2.js +911 -0
- package/dist/chunk-7VBDFPUM.js +340 -0
- package/dist/chunk-7VRJHTGZ.js +6406 -0
- package/dist/chunk-7YAOUUKK.js +493 -0
- package/dist/chunk-AAAODV76.js +860 -0
- package/dist/chunk-AB4HUJVQ.js +339 -0
- package/dist/chunk-AEQWV746.js +611 -0
- package/dist/chunk-AHU3FKPA.js +11639 -0
- package/dist/chunk-AISTV5XU.js +226 -0
- package/dist/chunk-AJBTKGJZ.js +48 -0
- package/dist/chunk-AJJNW7XT.js +248 -0
- package/dist/chunk-AJN5Y5YZ.js +160 -0
- package/dist/chunk-ALDTFNZ3.js +150 -0
- package/dist/chunk-ARARVIZK.js +281 -0
- package/dist/chunk-ATBM6AW5.js +53 -0
- package/dist/chunk-ATKEKM3E.js +206 -0
- package/dist/chunk-AUJLW6JZ.js +92 -0
- package/dist/chunk-AY3MHEFM.js +24 -0
- package/dist/chunk-B7PYTV72.js +236 -0
- package/dist/chunk-B7YRSULE.js +1423 -0
- package/dist/chunk-BAWJNMWF.js +339 -0
- package/dist/chunk-BBPIILO2.js +88 -0
- package/dist/chunk-BD3PGW6A.js +957 -0
- package/dist/chunk-BDPYFAB4.js +44 -0
- package/dist/chunk-BIUV23HH.js +729 -0
- package/dist/chunk-BQ3VAGXH.js +243 -0
- package/dist/chunk-BQJOGAWT.js +31 -0
- package/dist/chunk-BT7EG7CO.js +68 -0
- package/dist/chunk-BV3XQQLU.js +27 -0
- package/dist/chunk-BY6ODHNZ.js +78 -0
- package/dist/chunk-BZRLSZNV.js +79 -0
- package/dist/chunk-C3DH3NCY.js +2773 -0
- package/dist/chunk-C3KCMAJP.js +756 -0
- package/dist/chunk-C7AGUJ5K.js +267 -0
- package/dist/chunk-CBSWKQCX.js +342 -0
- package/dist/chunk-CE5OZBYY.js +21 -0
- package/dist/chunk-CFCVYHSW.js +373 -0
- package/dist/chunk-CHA2HDE5.js +126 -0
- package/dist/chunk-CIHWPGS5.js +146 -0
- package/dist/chunk-CJBSZX3F.js +127 -0
- package/dist/chunk-CLA6QIJM.js +43 -0
- package/dist/chunk-CPSVQR2I.js +365 -0
- package/dist/chunk-CRPRVNQ4.js +254 -0
- package/dist/chunk-CSIE4Y7C.js +1093 -0
- package/dist/chunk-CSOPSYDY.js +142 -0
- package/dist/chunk-CSXLLEGB.js +205 -0
- package/dist/chunk-CTDLERWU.js +293 -0
- package/dist/chunk-CULBXMSK.js +110 -0
- package/dist/chunk-D2M2Y5ID.js +21 -0
- package/dist/chunk-D37WY7SH.js +1060 -0
- package/dist/chunk-D4VJFCGZ.js +89 -0
- package/dist/chunk-D6WTZMZB.js +48 -0
- package/dist/chunk-DBHOWDUH.js +976 -0
- package/dist/chunk-DCACX7BV.js +19364 -0
- package/dist/chunk-DFHX4XYA.js +128 -0
- package/dist/chunk-DIKBRRKE.js +176 -0
- package/dist/chunk-DJG5RIOR.js +9 -0
- package/dist/chunk-DNIOIISW.js +616 -0
- package/dist/chunk-DOA5G7IA.js +315 -0
- package/dist/chunk-DP7FKP6W.js +855 -0
- package/dist/chunk-DS2JZ677.js +79 -0
- package/dist/chunk-DSRLVYBS.js +82 -0
- package/dist/chunk-EAEVKNJA.js +209 -0
- package/dist/chunk-EEUESN3T.js +575 -0
- package/dist/chunk-EJ4LUU5Y.js +73 -0
- package/dist/chunk-EJIWTPSZ.js +1063 -0
- package/dist/chunk-EJVCDTAN.js +116 -0
- package/dist/chunk-EKLUBDBQ.js +627 -0
- package/dist/chunk-EN62WLFD.js +849 -0
- package/dist/chunk-ENYRCL43.js +26 -0
- package/dist/chunk-EP22ZMFO.js +273 -0
- package/dist/chunk-EP4SVAVI.js +87 -0
- package/dist/chunk-EPAMVGI3.js +1562 -0
- package/dist/chunk-EPRMH6HO.js +24 -0
- package/dist/chunk-ES6NWJ36.js +4057 -0
- package/dist/chunk-ETA2K4KI.js +30 -0
- package/dist/chunk-ETAD4NKD.js +31 -0
- package/dist/chunk-EUWIIDQ7.js +93 -0
- package/dist/chunk-EVE3OD2W.js +141 -0
- package/dist/chunk-EXA26FFC.js +459 -0
- package/dist/chunk-EXSPAA35.js +244 -0
- package/dist/chunk-F55YABKV.js +258 -0
- package/dist/chunk-F5DNGU5W.js +27 -0
- package/dist/chunk-F622MJYV.js +103 -0
- package/dist/chunk-F6NIQD74.js +5111 -0
- package/dist/chunk-FAWJTC34.js +43 -0
- package/dist/chunk-FAZBRHGG.js +47 -0
- package/dist/chunk-FIEUSGNJ.js +39 -0
- package/dist/chunk-FKCG7K6H.js +1146 -0
- package/dist/chunk-FOVVXV45.js +229 -0
- package/dist/chunk-FRBPKBFE.js +30 -0
- package/dist/chunk-FSA5BPFI.js +268 -0
- package/dist/chunk-FSJ5TTZ3.js +29 -0
- package/dist/chunk-FT7SGLXT.js +193 -0
- package/dist/chunk-FUUVZZUB.js +62 -0
- package/dist/chunk-FYMRVUNZ.js +1697 -0
- package/dist/chunk-FYTAA5FG.js +162 -0
- package/dist/chunk-G3VB2UCZ.js +3892 -0
- package/dist/chunk-G6OIMVXH.js +405 -0
- package/dist/chunk-G7PQCXVH.js +228 -0
- package/dist/chunk-GAB6UW52.js +1087 -0
- package/dist/chunk-GAFJEYLK.js +29 -0
- package/dist/chunk-GC4CRMTS.js +642 -0
- package/dist/chunk-GFHSIWHL.js +5297 -0
- package/dist/chunk-GI5M67YA.js +735 -0
- package/dist/chunk-GIJWHUWF.js +191 -0
- package/dist/chunk-GO6DRECI.js +1 -0
- package/dist/chunk-GOFVBTMN.js +314 -0
- package/dist/chunk-GQIP72ZJ.js +13 -0
- package/dist/chunk-GQXLXRFA.js +28 -0
- package/dist/chunk-GT6HFKJB.js +48 -0
- package/dist/chunk-GVJGSSKM.js +174 -0
- package/dist/chunk-GWHGTG37.js +36 -0
- package/dist/chunk-GZAJHLKO.js +18 -0
- package/dist/chunk-GZK62I3N.js +314 -0
- package/dist/chunk-H3HGMISG.js +483 -0
- package/dist/chunk-H3ISZJMJ.js +403 -0
- package/dist/chunk-H4HXVWEC.js +9 -0
- package/dist/chunk-H6MJGKAW.js +120 -0
- package/dist/chunk-HBTTGVR5.js +353 -0
- package/dist/chunk-HBZ322WZ.js +35 -0
- package/dist/chunk-HEP3ILP4.js +34 -0
- package/dist/chunk-HGFXODKO.js +106 -0
- package/dist/chunk-HHWDTB6S.js +59 -0
- package/dist/chunk-HKO45NLZ.js +286 -0
- package/dist/chunk-HLVTEA6A.js +89 -0
- package/dist/chunk-HS3SY6HN.js +160 -0
- package/dist/chunk-HT5OCGKN.js +899 -0
- package/dist/chunk-HXIIEMGF.js +78 -0
- package/dist/chunk-I56TH7VM.js +46 -0
- package/dist/chunk-I6FN3R5D.js +352 -0
- package/dist/chunk-I7SCBHJN.js +655 -0
- package/dist/chunk-IJM4GKAT.js +529 -0
- package/dist/chunk-IMEYU36R.js +344 -0
- package/dist/chunk-INJ3SS6A.js +936 -0
- package/dist/chunk-IUKOPCCE.js +441 -0
- package/dist/chunk-IVEPZQJO.js +33 -0
- package/dist/chunk-IVZEONFC.js +43 -0
- package/dist/chunk-IWBHRSG7.js +936 -0
- package/dist/chunk-IYY3HQAD.js +484 -0
- package/dist/chunk-J2ICMYDA.js +48 -0
- package/dist/chunk-J2QCFLUN.js +505 -0
- package/dist/chunk-J5HM6V5P.js +1039 -0
- package/dist/chunk-J6NZX6QH.js +398 -0
- package/dist/chunk-JBBB2Y47.js +432 -0
- package/dist/chunk-JDCZQZU7.js +42 -0
- package/dist/chunk-JEDNXGSS.js +169 -0
- package/dist/chunk-JHP7OT6K.js +89 -0
- package/dist/chunk-JLS65NUQ.js +14 -0
- package/dist/chunk-JNMWYMC6.js +38 -0
- package/dist/chunk-JNSTWNNW.js +25 -0
- package/dist/chunk-JOSK6GEU.js +9564 -0
- package/dist/chunk-JQUMSIGC.js +100 -0
- package/dist/chunk-JVHGMURQ.js +1106 -0
- package/dist/chunk-JYXS47FQ.js +951 -0
- package/dist/chunk-K2ZMW2Z5.js +2147 -0
- package/dist/chunk-K7FAFORM.js +14 -0
- package/dist/chunk-KBJXX3ON.js +333 -0
- package/dist/chunk-KHFKVQWY.js +486 -0
- package/dist/chunk-KHMEI3DQ.js +173 -0
- package/dist/chunk-KHW3UD7B.js +69 -0
- package/dist/chunk-KKQKWAMF.js +365 -0
- package/dist/chunk-KOKXJV2U.js +455 -0
- package/dist/chunk-KQ4NGOJI.js +14 -0
- package/dist/chunk-KQYQOXMS.js +342 -0
- package/dist/chunk-KTMW65UX.js +14 -0
- package/dist/chunk-KUEWV2JH.js +593 -0
- package/dist/chunk-KXYDV3HP.js +1523 -0
- package/dist/chunk-KZ4JMGZ5.js +96 -0
- package/dist/chunk-KZWGBUIO.js +2659 -0
- package/dist/chunk-L2CBG5IX.js +1892 -0
- package/dist/chunk-L2S235CU.js +314 -0
- package/dist/chunk-L32WD57F.js +98 -0
- package/dist/chunk-LDJCKAJP.js +123 -0
- package/dist/chunk-LDWNBEN7.js +541 -0
- package/dist/chunk-LJVH57G2.js +241 -0
- package/dist/chunk-LPQ7NZEN.js +209 -0
- package/dist/chunk-LRGH3CCV.js +148 -0
- package/dist/chunk-LULOGMMM.js +1133 -0
- package/dist/chunk-LWGKN2GY.js +8284 -0
- package/dist/chunk-LX4F24ZH.js +157 -0
- package/dist/chunk-M4BUEXXF.js +839 -0
- package/dist/chunk-M6UHOC4I.js +553 -0
- package/dist/chunk-MCBNWZNO.js +657 -0
- package/dist/chunk-MEMSY6VY.js +223 -0
- package/dist/chunk-MHLEZQQI.js +145 -0
- package/dist/chunk-MJ6WNSIX.js +192 -0
- package/dist/chunk-MKASIKWZ.js +442 -0
- package/dist/chunk-MNOVBYFU.js +60 -0
- package/dist/chunk-MO2BYAAF.js +2896 -0
- package/dist/chunk-MP6P7Y2A.js +180 -0
- package/dist/chunk-MQ4TFJAG.js +3365 -0
- package/dist/chunk-MT2WAIR3.js +131 -0
- package/dist/chunk-MTU7VTNN.js +1122 -0
- package/dist/chunk-MULMXX4V.js +150 -0
- package/dist/chunk-MW2DWWVA.js +147 -0
- package/dist/chunk-MY3ZPUN4.js +151 -0
- package/dist/chunk-MYLH2S4G.js +64 -0
- package/dist/chunk-MZ5WYKNA.js +28 -0
- package/dist/chunk-N3Q2JNPV.js +249 -0
- package/dist/chunk-N5DX4JAK.js +12 -0
- package/dist/chunk-NAINGKHF.js +35 -0
- package/dist/chunk-NEQUQHOX.js +223 -0
- package/dist/chunk-NHNPEZS4.js +1408 -0
- package/dist/chunk-NHTIXJCR.js +17 -0
- package/dist/chunk-NKLPMBNV.js +1154 -0
- package/dist/chunk-NMVZ5YES.js +199 -0
- package/dist/chunk-NRFRY3GE.js +256 -0
- package/dist/chunk-NTD6CSI6.js +1266 -0
- package/dist/chunk-NUO7B3SH.js +318 -0
- package/dist/chunk-NVOHIJKG.js +1319 -0
- package/dist/chunk-NXH3RX7O.js +523 -0
- package/dist/chunk-NXZ3DURF.js +257 -0
- package/dist/chunk-O26L6F7F.js +209 -0
- package/dist/chunk-O5RRIUEP.js +124 -0
- package/dist/chunk-O5X6BKAO.js +10 -0
- package/dist/chunk-O6ZQUVTR.js +31 -0
- package/dist/chunk-O7FE75QZ.js +306 -0
- package/dist/chunk-OC7Z6AJQ.js +81 -0
- package/dist/chunk-OH7IEZ63.js +307 -0
- package/dist/chunk-OI734GRS.js +115 -0
- package/dist/chunk-OJBH62DK.js +684 -0
- package/dist/chunk-OKJLVSTJ.js +247 -0
- package/dist/chunk-OMX5VL43.js +79 -0
- package/dist/chunk-ONHAMBN6.js +12 -0
- package/dist/chunk-ONYPLIVE.js +753 -0
- package/dist/chunk-OSK7QWPD.js +637 -0
- package/dist/chunk-OTXLMJKP.js +438 -0
- package/dist/chunk-OV5PKQMA.js +213 -0
- package/dist/chunk-OXK5HA4B.js +31 -0
- package/dist/chunk-OYDWFQA4.js +272 -0
- package/dist/chunk-OZAUKWHB.js +22 -0
- package/dist/chunk-P5P2EKGH.js +94 -0
- package/dist/chunk-P6SSWAKY.js +29 -0
- package/dist/chunk-P7CQGPLS.js +30 -0
- package/dist/chunk-P7RVCHQV.js +197 -0
- package/dist/chunk-PEBWDYIW.js +726 -0
- package/dist/chunk-PFCXFO7A.js +9193 -0
- package/dist/chunk-PFLDWMX6.js +168 -0
- package/dist/chunk-PHZGLQSK.js +15883 -0
- package/dist/chunk-PNFTPNSR.js +20 -0
- package/dist/chunk-PPHXX4W7.js +175 -0
- package/dist/chunk-PPZESPJT.js +262 -0
- package/dist/chunk-PRDHI2L5.js +296 -0
- package/dist/chunk-PSTKWHHN.js +32 -0
- package/dist/chunk-PV53ODOT.js +555 -0
- package/dist/chunk-PVJBTI7P.js +24 -0
- package/dist/chunk-PXKERBKX.js +100 -0
- package/dist/chunk-PZ5AY32C.js +10 -0
- package/dist/chunk-Q3DHEZA5.js +85 -0
- package/dist/chunk-Q5RZDVQK.js +204 -0
- package/dist/chunk-Q64IR2Z2.js +4933 -0
- package/dist/chunk-Q6Z5UGPL.js +398 -0
- package/dist/chunk-QAMAV4DT.js +627 -0
- package/dist/chunk-QBWF4444.js +112 -0
- package/dist/chunk-QDKYT4CI.js +22805 -0
- package/dist/chunk-QFLBRWCJ.js +126 -0
- package/dist/chunk-QILAQACE.js +107 -0
- package/dist/chunk-QJ6OEH4K.js +3683 -0
- package/dist/chunk-QK3NLYTV.js +320 -0
- package/dist/chunk-QOFLUS24.js +535 -0
- package/dist/chunk-QOIASNEJ.js +98 -0
- package/dist/chunk-QP4UTSOV.js +3587 -0
- package/dist/chunk-QP5ST7RI.js +904 -0
- package/dist/chunk-QS5AGRZN.js +167 -0
- package/dist/chunk-QTAOU53N.js +107 -0
- package/dist/chunk-QTCLJHLZ.js +351 -0
- package/dist/chunk-QTOLTG4L.js +119 -0
- package/dist/chunk-QWDV4OSL.js +142 -0
- package/dist/chunk-QWMQ74KD.js +508 -0
- package/dist/chunk-QX6LOMMH.js +158 -0
- package/dist/chunk-QXBKIHY7.js +238 -0
- package/dist/chunk-QXBKTJT6.js +270 -0
- package/dist/chunk-QYQOVOLR.js +196 -0
- package/dist/chunk-R2CKS6WT.js +73 -0
- package/dist/chunk-R2TIYG7U.js +68 -0
- package/dist/chunk-R2W3LESH.js +465 -0
- package/dist/chunk-R5EXHMUN.js +100 -0
- package/dist/chunk-RBBTBCHX.js +289 -0
- package/dist/chunk-RBKLOUXA.js +121 -0
- package/dist/chunk-RCP2Y6DQ.js +86 -0
- package/dist/chunk-RCYEJSD5.js +260 -0
- package/dist/chunk-RFDVSI4N.js +134 -0
- package/dist/chunk-RGJU63FV.js +1717 -0
- package/dist/chunk-RI4EX2QE.js +18 -0
- package/dist/chunk-RIMARPCF.js +152 -0
- package/dist/chunk-RJ6RSNT6.js +42 -0
- package/dist/chunk-RNI2GUIF.js +131 -0
- package/dist/chunk-RPHUWJ3K.js +264 -0
- package/dist/chunk-RPIMAMV7.js +361 -0
- package/dist/chunk-RQFX6YRN.js +49 -0
- package/dist/chunk-RRC5BL7B.js +285 -0
- package/dist/chunk-RSYTSBOO.js +79 -0
- package/dist/chunk-RWQQIKIC.js +35 -0
- package/dist/chunk-RZUBOZH2.js +373 -0
- package/dist/chunk-S2E632FQ.js +380 -0
- package/dist/chunk-S2VQCZO4.js +22 -0
- package/dist/chunk-S2XIMQJQ.js +681 -0
- package/dist/chunk-S47ISY27.js +183 -0
- package/dist/chunk-S6I4KISU.js +142 -0
- package/dist/chunk-S6TAFQI5.js +2403 -0
- package/dist/chunk-SBBNT5ZJ.js +27 -0
- package/dist/chunk-SDJV2DTQ.js +491 -0
- package/dist/chunk-SDPIFNLD.js +33 -0
- package/dist/chunk-SF6YK3JI.js +835 -0
- package/dist/chunk-SK3ZFONO.js +976 -0
- package/dist/chunk-SKTFRFQ7.js +1775 -0
- package/dist/chunk-SNGM452K.js +2002 -0
- package/dist/chunk-STW7OFOA.js +581 -0
- package/dist/chunk-SU6UFUQY.js +1351 -0
- package/dist/chunk-SVJM3LJA.js +27 -0
- package/dist/chunk-SVUNZOPG.js +129 -0
- package/dist/chunk-T5XLUYV3.js +34 -0
- package/dist/chunk-T7E5JS6N.js +57 -0
- package/dist/chunk-TA3N5MMO.js +450 -0
- package/dist/chunk-TAJPCXSB.js +13 -0
- package/dist/chunk-TDEMDRN2.js +1639 -0
- package/dist/chunk-TDSEX5CF.js +24 -0
- package/dist/chunk-TGCVL74Y.js +28 -0
- package/dist/chunk-TGXXYDL4.js +1012 -0
- package/dist/chunk-TIKTYUJO.js +296 -0
- package/dist/chunk-TIZAJD4M.js +6029 -0
- package/dist/chunk-TLSEZZCG.js +5549 -0
- package/dist/chunk-TMBDRHAX.js +19 -0
- package/dist/chunk-TRURQUBP.js +1217 -0
- package/dist/chunk-TSQ256N5.js +152 -0
- package/dist/chunk-TUQMMFEQ.js +2244 -0
- package/dist/chunk-U424MJLC.js +81 -0
- package/dist/chunk-U4DRS6ZW.js +11 -0
- package/dist/chunk-U5KS22IN.js +204 -0
- package/dist/chunk-UAPHFJPN.js +673 -0
- package/dist/chunk-UB7LQITD.js +1040 -0
- package/dist/chunk-UBVRHGAZ.js +237 -0
- package/dist/chunk-UDNNAQN5.js +98 -0
- package/dist/chunk-UJP3XM54.js +342 -0
- package/dist/chunk-UJYDH2MW.js +305 -0
- package/dist/chunk-UKMPASIC.js +399 -0
- package/dist/chunk-UKUL3EHK.js +763 -0
- package/dist/chunk-UPHU64NB.js +1327 -0
- package/dist/chunk-URMSZXAD.js +43 -0
- package/dist/chunk-US3RT6CY.js +525 -0
- package/dist/chunk-UTDEOPKV.js +30 -0
- package/dist/chunk-UUUDKV7N.js +13 -0
- package/dist/chunk-UVKWU3SM.js +39 -0
- package/dist/chunk-V2TVPO3X.js +521 -0
- package/dist/chunk-V3KLVK7B.js +398 -0
- package/dist/chunk-V3YFFHDR.js +17 -0
- package/dist/chunk-VAG6GUBR.js +1162 -0
- package/dist/chunk-VBENAHDA.js +1814 -0
- package/dist/chunk-VBNCKCCI.js +16 -0
- package/dist/chunk-VCGSWN5M.js +1300 -0
- package/dist/chunk-VE2O2I7M.js +115 -0
- package/dist/chunk-VIFHYTI5.js +31 -0
- package/dist/chunk-VJER3FUS.js +5080 -0
- package/dist/chunk-VLMDM56Q.js +268 -0
- package/dist/chunk-VMFZEVVX.js +99 -0
- package/dist/chunk-VNDPQVUZ.js +1853 -0
- package/dist/chunk-VSPJRLGA.js +4783 -0
- package/dist/chunk-VSWC5ZXI.js +103 -0
- package/dist/chunk-VYI4DSZP.js +2017 -0
- package/dist/chunk-W4BAIQ6L.js +1212 -0
- package/dist/chunk-W7VQAL2K.js +2203 -0
- package/dist/chunk-WEI3ZDZH.js +33 -0
- package/dist/chunk-WEIUS5NT.js +26 -0
- package/dist/chunk-WEW7UFWE.js +546 -0
- package/dist/chunk-WGQAXLNA.js +384 -0
- package/dist/chunk-WJAL4JL3.js +206 -0
- package/dist/chunk-WKFOJ5ZG.js +141 -0
- package/dist/chunk-WMWQEFLN.js +2177 -0
- package/dist/chunk-WNECKKO2.js +154 -0
- package/dist/chunk-WPKLYOAM.js +195 -0
- package/dist/chunk-WSH37YQN.js +243 -0
- package/dist/chunk-WV3KQDPE.js +84 -0
- package/dist/chunk-WZFC4V4U.js +389 -0
- package/dist/chunk-XCOIBNET.js +13 -0
- package/dist/chunk-XDM65LBX.js +53 -0
- package/dist/chunk-XGU6PBO5.js +645 -0
- package/dist/chunk-XHOI4V62.js +43 -0
- package/dist/chunk-XIBVFMLQ.js +6858 -0
- package/dist/chunk-XJ2E7YEJ.js +117 -0
- package/dist/chunk-XON4ZCYX.js +69 -0
- package/dist/chunk-XQPEWJPI.js +127 -0
- package/dist/chunk-XSJTIFUY.js +31 -0
- package/dist/chunk-XT7OVWM3.js +64 -0
- package/dist/chunk-XTXYIISX.js +1104 -0
- package/dist/chunk-XV7NZL4B.js +57 -0
- package/dist/chunk-XWIZ6B5S.js +109 -0
- package/dist/chunk-XWLIKOBX.js +240 -0
- package/dist/chunk-XZOXEIN4.js +156 -0
- package/dist/chunk-XZRS7I7W.js +3673 -0
- package/dist/chunk-Y4ZDDHB6.js +44 -0
- package/dist/chunk-Y733RB7T.js +194 -0
- package/dist/chunk-YBHUB4XR.js +14931 -0
- package/dist/chunk-YKC75XK4.js +147 -0
- package/dist/chunk-YKMXFVK7.js +27 -0
- package/dist/chunk-YO5BAJ55.js +225 -0
- package/dist/chunk-YPDCLXNZ.js +568 -0
- package/dist/chunk-YSQPGVFK.js +116 -0
- package/dist/chunk-YTVVTIWJ.js +716 -0
- package/dist/chunk-YVCMDVBB.js +698 -0
- package/dist/chunk-YYTOA6DP.js +114 -0
- package/dist/chunk-Z5WGNULV.js +88 -0
- package/dist/chunk-Z6NGVVXG.js +66 -0
- package/dist/chunk-Z7CDQNH3.js +20 -0
- package/dist/chunk-ZH4G3FU5.js +187 -0
- package/dist/chunk-ZJB6SQPA.js +257 -0
- package/dist/chunk-ZL6E4HMY.js +42 -0
- package/dist/chunk-ZMLOC3DW.js +62 -0
- package/dist/chunk-ZORW64QH.js +101 -0
- package/dist/chunk-ZVVD2XGV.js +1369 -0
- package/dist/cli-utils-ER33ODC5.js +31 -0
- package/dist/cli-validation-6CHPTANV.js +146 -0
- package/dist/commit-utils-3STAY7C7.js +49 -0
- package/dist/compatibility-notice-IHNXR2JR.js +21 -0
- package/dist/compete-config-resolver-V3GDNJMM.js +125 -0
- package/dist/compete-results-XUM3PJHS.js +318 -0
- package/dist/competition-outcome-tracker-NWSMVUPG.js +62 -0
- package/dist/config-4HHE4OIK.js +238 -0
- package/dist/config-D6YAZASH.js +10 -0
- package/dist/config-MIPRDYYV.js +46 -0
- package/dist/config-audit-GA5DCUAI.js +371 -0
- package/dist/config-explain-4LMO556H.js +71 -0
- package/dist/config-loader-RGP634PC.js +51 -0
- package/dist/config-manager-J2UTO635.js +114 -0
- package/dist/config-merger-TVUJBZTS.js +14 -0
- package/dist/config-validator-H4ZVIE56.js +122 -0
- package/dist/cost-HSIV5U2Y.js +85 -0
- package/dist/data-migration-state-OAUL2WPQ.js +35 -0
- package/dist/db-migrator-NUOW5NKR.js +34 -0
- package/dist/default-paths-UILB62BN.js +49 -0
- package/dist/discovery-V6GYUJUC.js +53 -0
- package/dist/doctor-BBSMCDWE.js +271 -0
- package/dist/doctor-context-blocks-LPY75VZA.js +231 -0
- package/dist/doctor-instructions-import-JXHDDOE5.js +70 -0
- package/dist/doctor-purpose-6YJOXPBE.js +30 -0
- package/dist/domain-analyzer-S35ABUNA.js +48 -0
- package/dist/ensure-initialized-Q6PEU55O.js +78 -0
- package/dist/entry.js +922 -0
- package/dist/error-parser-core-MZFMFANN.js +70 -0
- package/dist/evaluation-context-GQBYDAEV.js +63 -0
- package/dist/evidence-plan-resolver-5FUAP3SA.js +111 -0
- package/dist/execution-data-writer-YCG5UH37.js +72 -0
- package/dist/execution-policy-applier-PWZM5LNA.js +63 -0
- package/dist/execution-preflight-DASJWWQF.js +223 -0
- package/dist/execution-roles-KNSNNB2D.js +112 -0
- package/dist/exit-code-error-QIY5DOKF.js +18 -0
- package/dist/external-temp-cleanup-CAW7LQ6R.js +360 -0
- package/dist/factory-YCYCB7AE.js +209 -0
- package/dist/file-utils-ZQYNBQBW.js +45 -0
- package/dist/flywheel-allowlist-revert-H22HA6JE.js +21 -0
- package/dist/flywheel-autoloop-executor-PDOASJEZ.js +316 -0
- package/dist/flywheel-autoloop-unverified-TOKYFCDC.js +36 -0
- package/dist/flywheel-competition-executor-YJUMMEJO.js +320 -0
- package/dist/flywheel-executor-JWU43KAY.js +437 -0
- package/dist/flywheel-git-isolation-FQ2TRWMB.js +56 -0
- package/dist/flywheel-manifest-HDPNMWWF.js +114 -0
- package/dist/flywheel-model-defaults-UHAKTZT3.js +110 -0
- package/dist/flywheel-preflight-III2C7TH.js +163 -0
- package/dist/flywheel-resume-2O45MS7Y.js +31 -0
- package/dist/flywheel-resume-execution-lease-P2BK257J.js +59 -0
- package/dist/flywheel-safety-AVAVFXIJ.js +19 -0
- package/dist/flywheel-scope-decision-ALJUUNGG.js +14 -0
- package/dist/get-telemetry-logger-MPDVO2JA.js +155 -0
- package/dist/git-message-style-KCXGMTDT.js +104 -0
- package/dist/guidance-profile-config-G3K5YQOO.js +113 -0
- package/dist/guidance-profile-renderer-TX4TNDFL.js +23 -0
- package/dist/identity-XLQJ4YJF.js +25 -0
- package/dist/index-query-6NUY4FKX.js +37 -0
- package/dist/index.js +85588 -0
- package/dist/indexer-DL54CM3K.js +44 -0
- package/dist/init-OUZ72344.js +245 -0
- package/dist/instructions-import-offer-NSYXSITC.js +363 -0
- package/dist/instructions-run-NBII7W36.js +114 -0
- package/dist/interrupted-work-E4TLKJLE.js +43 -0
- package/dist/invoke-provider-auth-NEWEIHCI.js +38 -0
- package/dist/judge-scoring.json +64 -0
- package/dist/lab-mode-YXQ2Y3NG.js +44 -0
- package/dist/lab-utils-5QAMDJR5.js +29 -0
- package/dist/linux-host-class-YDWQX65O.js +31 -0
- package/dist/llm-judge-executor-OJSNCTFJ.js +179 -0
- package/dist/local-ci-config-VZ4WWDT5.js +48 -0
- package/dist/local-executor-DCMDDRX2.js +280 -0
- package/dist/logger-5KNKS3O4.js +154 -0
- package/dist/matrix-prompt-builder-4ZBOGZSB.js +527 -0
- package/dist/matrix-result-parser-EZJM4YXP.js +14 -0
- package/dist/merge-batch-RTEEMVDB.js +313 -0
- package/dist/merge-batch-members-VIWGVRHP.js +24 -0
- package/dist/merge-queue-TIIUSOY6.js +126 -0
- package/dist/merge-queue-trust-DUNZ4J65.js +21 -0
- package/dist/metadata-UKSMWM6J.js +29 -0
- package/dist/model-catalog-readiness-R5KJBP5M.js +202 -0
- package/dist/model-invocations-db-XTUPPQ34.js +70 -0
- package/dist/model-resolver-JFZ2MHOJ.js +39 -0
- package/dist/model-resolver-SCQ57KAQ.js +217 -0
- package/dist/model-roles-D3OR4NAH.js +110 -0
- package/dist/monitor-F4SIU5G2.js +96 -0
- package/dist/nested-worktrees-2WUWQ75N.js +23 -0
- package/dist/next-S3IRLVER.js +96 -0
- package/dist/next-UKPFRXOO.js +148 -0
- package/dist/opportunistic-TL4S26VX.js +86 -0
- package/dist/optimization-config-resolver-NAEIYU6A.js +148 -0
- package/dist/package-HJR4QJT4.js +10 -0
- package/dist/parse-git-status-7PIYFPS2.js +21 -0
- package/dist/path-security-5WJSY56G.js +41 -0
- package/dist/paths-JUI7C4KU.js +45 -0
- package/dist/plan-backlog-list-fast-SSTQL5XP.js +89 -0
- package/dist/plan-backlog-show-fast-PFRAQ3JB.js +114 -0
- package/dist/plan-sprint-list-fast-HD2KBZSY.js +110 -0
- package/dist/plan-sprint-status-fast-YFYH7WQF.js +116 -0
- package/dist/plan-task-status-fast-JU5PNLUU.js +114 -0
- package/dist/plan-to-flywheel-PY5MSY2H.js +529 -0
- package/dist/preflight-PJHGTJNZ.js +12 -0
- package/dist/process-registry-B4ZUCN7T.js +28 -0
- package/dist/process-scanner-TU3QHWVB.js +23 -0
- package/dist/processes-6FHVGT72.js +28 -0
- package/dist/processes-json-fast-YWTMUWXB.js +72 -0
- package/dist/profile-HWTC56SG.js +209 -0
- package/dist/project-runtime-paths-2UQNG5Y4.js +41 -0
- package/dist/protected-branches-N36LDBFY.js +71 -0
- package/dist/provider-aware-resource-manager-YTFAHNGJ.js +40 -0
- package/dist/provider-matrix-2KO2V5OM.js +214 -0
- package/dist/provider-matrix-renderer-MEC3PER7.js +139 -0
- package/dist/provider-output-forwarding-2AHL7YMA.js +26 -0
- package/dist/provider-registry-WCZ65QHC.js +136 -0
- package/dist/provider-temp-cleanup-IUNPJCZF.js +14 -0
- package/dist/prune-engine-EOQVWEP6.js +448 -0
- package/dist/publication-turn-S42RZTQF.js +44 -0
- package/dist/quality-gate-JQMVCKOO.js +72 -0
- package/dist/quickstart-3O6FRCFB.js +105 -0
- package/dist/readiness-GW6ABRHB.js +139 -0
- package/dist/readiness-KFZCXDTT.js +215 -0
- package/dist/registry-7XG376SY.js +217 -0
- package/dist/repair-helpers-TTV5FEF4.js +117 -0
- package/dist/repo-root-YG6MQZDW.js +28 -0
- package/dist/resolution-engine-FFEK7HQ2.js +187 -0
- package/dist/resolve-provider-cli-ZEXVZKET.js +44 -0
- package/dist/restore-telemetry-db-E7BR5PO7.js +459 -0
- package/dist/routing-events-AW6SRZ6G.js +13 -0
- package/dist/routing-history-store-FMDDQL6W.js +39 -0
- package/dist/routing-planner-C6OHO3EY.js +221 -0
- package/dist/runner-KHDNQ5KU.js +1194 -0
- package/dist/runner-PIS2BW7Y.js +1801 -0
- package/dist/safety-E3JJVSFL.js +67 -0
- package/dist/safety-stanza-HE6GXP4G.js +49 -0
- package/dist/sandbox-7LBZC5PE.js +72 -0
- package/dist/sandbox-ASWCDYZL.js +80 -0
- package/dist/schema-extensions.sql +234 -0
- package/dist/security-JI22TBEB.js +17 -0
- package/dist/setup-bb-plugin-FQXLA76Y.js +531 -0
- package/dist/setup-claude-code-NF4ZSHVE.js +197 -0
- package/dist/setup-temp-cleanup-2APZ4HMA.js +29 -0
- package/dist/shared-utils-34HJZ6JX.js +40 -0
- package/dist/simple-artifact-goal-MQLDDMMX.js +29 -0
- package/dist/sprint-N7JFTEGL.js +403 -0
- package/dist/sprint-bridge-KJXIBNRJ.js +117 -0
- package/dist/sprint-completion-dependents-34SR7JVL.js +43 -0
- package/dist/sprint-execution-service-A6JPUBWY.js +376 -0
- package/dist/sprint-manager-MU2ZUWN2.js +140 -0
- package/dist/sqlite-timeout-config-U2CT4LKU.js +13 -0
- package/dist/sqlite-wrapper-FSGJ2QEW.js +19 -0
- package/dist/stale-cleanup-orchestrator-4X6324VF.js +71 -0
- package/dist/storage-access-I3V5LER7.js +31 -0
- package/dist/store-XVG64ZR2.js +25 -0
- package/dist/task-classifier-MN2DYE5R.js +558 -0
- package/dist/task-list-fast-7AT6LTTA.js +112 -0
- package/dist/task-manager-LHPBBRRE.js +136 -0
- package/dist/task-report-OLPAWBTK.js +64 -0
- package/dist/task-type-detector-6RG3YNZF.js +27 -0
- package/dist/task-type-resolver-EQHOUIHT.js +64 -0
- package/dist/telemetry-5VYSK772.js +212 -0
- package/dist/telemetry-health-tracker-4GFW2EMP.js +12 -0
- package/dist/telemetry-path-resolver-H3NFHHQY.js +34 -0
- package/dist/telemetry-reliability-URJDTNPZ.js +76 -0
- package/dist/transports-NREZQTJK.js +106 -0
- package/dist/unified-cost-tracker-5MTBJ2CL.js +59 -0
- package/dist/unified-state-cleanup-GGAXLHXF.js +292 -0
- package/dist/universal-cost-calculator-JTFEJVWK.js +70 -0
- package/dist/user-agents-QLIGPLP2.js +30 -0
- package/dist/variant-execution-I4ZZUAWY.js +319 -0
- package/dist/variant-opt-parser-JHCXKY2K.js +251 -0
- package/dist/variant-request-input-PL37N3AN.js +11 -0
- package/dist/variant-state-cleanup-KHMXRBZN.js +287 -0
- package/dist/variant-worker-COB5YTJX.js +4517 -0
- package/dist/variant-worker.js +26 -0
- package/dist/variants-XGDSXYG3.js +267 -0
- package/dist/verification-command-YSPU4VBH.js +66 -0
- package/dist/verify-command-timeout-DQUYH33Z.js +11 -0
- package/dist/verify-commands-LOHMOFKC.js +65 -0
- package/dist/warning-JSKSFKBT.js +13 -0
- package/dist/work-edge-K65NHVWY.js +50 -0
- package/dist/work-item-writer-KY5ZWZWW.js +30 -0
- package/dist/worker-JNXXEIT6.js +1504 -0
- package/dist/worker.js +21 -0
- package/dist/workspace-tree-identity-JO5PSKTW.js +52 -0
- package/dist/worktree-environment-WTVABAQW.js +64 -0
- package/dist/worktree-metrics-VZRQI26T.js +66 -0
- package/dist/writeback-TQFQBJNU.js +50 -0
- package/docs/CLI_REFERENCE.md +8287 -0
- package/docs/PROVIDER_SETUP.md +1737 -0
- package/docs/README.md +96 -0
- package/docs/TROUBLESHOOTING.md +2209 -0
- package/docs/getting-started/QUICK_START.md +260 -0
- package/docs/getting-started/README.md +198 -0
- package/docs/getting-started/SETUP.md +25 -0
- package/docs/reference/AGENT_CONTEXT.md +84 -0
- package/docs/reference/DELIVERY_ONBOARDING.md +198 -0
- package/docs/reference/PROVIDER_RELEASE_TIERS.md +34 -0
- package/docs/reference/SECURITY.md +291 -0
- package/docs/reference/TELEMETRY_PRIVACY.md +259 -0
- package/integrations/bb-plugin-build/README.md +391 -0
- package/integrations/bb-plugin-build/app.css +431 -0
- package/integrations/bb-plugin-build/app.tsx +6210 -0
- package/integrations/bb-plugin-build/package.json +45 -0
- package/integrations/bb-plugin-build/server.ts +488 -0
- package/integrations/bb-plugin-build/src/adapter.ts +3672 -0
- package/integrations/bb-plugin-build/src/backlog-authoring-model.ts +150 -0
- package/integrations/bb-plugin-build/src/backlog-authoring-schema.ts +458 -0
- package/integrations/bb-plugin-build/src/backlog-authoring-service.ts +467 -0
- package/integrations/bb-plugin-build/src/backlog-authoring-view.ts +1025 -0
- package/integrations/bb-plugin-build/src/command-evidence-schema.ts +13 -0
- package/integrations/bb-plugin-build/src/competition-defaults-schema.ts +122 -0
- package/integrations/bb-plugin-build/src/competition-defaults-service.ts +105 -0
- package/integrations/bb-plugin-build/src/competition-defaults-view.ts +138 -0
- package/integrations/bb-plugin-build/src/contract.ts +718 -0
- package/integrations/bb-plugin-build/src/execution-activity-view.ts +98 -0
- package/integrations/bb-plugin-build/src/finalize-model.ts +205 -0
- package/integrations/bb-plugin-build/src/finalize-schema.ts +150 -0
- package/integrations/bb-plugin-build/src/finalize-service.ts +330 -0
- package/integrations/bb-plugin-build/src/finalize-view.ts +159 -0
- package/integrations/bb-plugin-build/src/judge-operations-readback.ts +303 -0
- package/integrations/bb-plugin-build/src/judge-operations-schema.ts +33 -0
- package/integrations/bb-plugin-build/src/judge-operations-view.ts +459 -0
- package/integrations/bb-plugin-build/src/model.ts +1318 -0
- package/integrations/bb-plugin-build/src/monitor-service.ts +233 -0
- package/integrations/bb-plugin-build/src/panel-read-ux.ts +97 -0
- package/integrations/bb-plugin-build/src/patch-preview-schema.ts +166 -0
- package/integrations/bb-plugin-build/src/patch-preview-service.ts +480 -0
- package/integrations/bb-plugin-build/src/patch-preview-view.ts +109 -0
- package/integrations/bb-plugin-build/src/planning-readback.ts +228 -0
- package/integrations/bb-plugin-build/src/planning-service.ts +647 -0
- package/integrations/bb-plugin-build/src/planning-sync-evidence.ts +37 -0
- package/integrations/bb-plugin-build/src/planning-workspace-readback.ts +33 -0
- package/integrations/bb-plugin-build/src/planning-workspace-schema.ts +131 -0
- package/integrations/bb-plugin-build/src/planning-workspace.ts +333 -0
- package/integrations/bb-plugin-build/src/poll-handoff.ts +136 -0
- package/integrations/bb-plugin-build/src/project-target-server.ts +21 -0
- package/integrations/bb-plugin-build/src/project-target.ts +45 -0
- package/integrations/bb-plugin-build/src/reference-index.ts +218 -0
- package/integrations/bb-plugin-build/src/repository-identity.ts +17 -0
- package/integrations/bb-plugin-build/src/repository-schema.ts +30 -0
- package/integrations/bb-plugin-build/src/result-explorer-view.ts +597 -0
- package/integrations/bb-plugin-build/src/result-readback-model.ts +163 -0
- package/integrations/bb-plugin-build/src/result-readback-schema.ts +319 -0
- package/integrations/bb-plugin-build/src/result-readback-service.ts +333 -0
- package/integrations/bb-plugin-build/src/run-page-view.ts +332 -0
- package/integrations/bb-plugin-build/src/setup-config-schema.ts +293 -0
- package/integrations/bb-plugin-build/src/setup-config-service.ts +620 -0
- package/integrations/bb-plugin-build/src/setup-config-view.ts +388 -0
- package/integrations/bb-plugin-build/src/sprint-close-model.ts +150 -0
- package/integrations/bb-plugin-build/src/sprint-close-schema.ts +128 -0
- package/integrations/bb-plugin-build/src/sprint-close-service.ts +293 -0
- package/integrations/bb-plugin-build/src/sprint-close-view.ts +116 -0
- package/integrations/bb-plugin-build/src/sprint-composition-model.ts +709 -0
- package/integrations/bb-plugin-build/src/sprint-composition-readback.ts +231 -0
- package/integrations/bb-plugin-build/src/sprint-composition-schema.ts +597 -0
- package/integrations/bb-plugin-build/src/sprint-composition-service.ts +773 -0
- package/integrations/bb-plugin-build/src/sprint-composition-view.ts +1221 -0
- package/integrations/bb-plugin-build/src/sprint-execution-schema.ts +188 -0
- package/integrations/bb-plugin-build/src/sprint-execution-service.ts +289 -0
- package/integrations/bb-plugin-build/src/sprint-execution-view.ts +54 -0
- package/integrations/bb-plugin-build/src/task-authoring-model.ts +563 -0
- package/integrations/bb-plugin-build/src/task-authoring-schema.ts +629 -0
- package/integrations/bb-plugin-build/src/task-authoring-service.ts +842 -0
- package/integrations/bb-plugin-build/src/task-authoring-view.ts +1227 -0
- package/integrations/bb-plugin-build/src/task-catalog-schema.ts +46 -0
- package/integrations/bb-plugin-build/src/task-catalog-service.ts +44 -0
- package/integrations/bb-plugin-build/src/task-detail-readback.ts +56 -0
- package/integrations/bb-plugin-build/src/task-detail-schema.ts +171 -0
- package/integrations/bb-plugin-build/src/task-navigation.ts +446 -0
- package/integrations/bb-plugin-build/src/workbench-route.ts +74 -0
- package/package.json +306 -4
- package/schemas/README.md +80 -0
- package/schemas/build.config.schema.json +2110 -0
- package/schemas/config-v1.schema.json +136 -0
- package/schemas/execution-config.schema.json +47 -0
- package/schemas/judge-scoring.schema.json +257 -0
- package/schemas/provider-config.schema.json +179 -0
- package/schemas/telemetry-config.schema.json +79 -0
- package/schemas/user-preferences.schema.json +141 -0
- package/scripts/assert-node-runtime.mjs +146 -0
- package/scripts/preflight-native.mjs +49 -0
- package/scripts/setup-git-hooks.mjs +39 -0
- package/scripts/sync.sh +2871 -0
- package/scripts/write-node-launcher.sh +138 -0
- package/src/resources/gemini/slash-packs/default/plan.toml +15 -0
- package/src/resources/gemini/slash-packs/default/summary.toml +16 -0
- package/src/resources/gemini/slash-packs/default/tests.toml +16 -0
- package/templates/.build-project/README.md +41 -0
- package/templates/.build-project/agents/README.md +50 -0
- package/templates/.build-project/agents/architect.md +10 -0
- package/templates/.build-project/agents/code-reviewer.md +10 -0
- package/templates/.build-project/agents/debugger.md +10 -0
- package/templates/.build-project/agents/documenter.md +10 -0
- package/templates/.build-project/agents/test-automator.md +10 -0
- package/templates/.build-project/config/build.config.jsonc +64 -0
- package/templates/.build-project/config/project-context.template.json +6 -0
- package/templates/.build-project/config/task-type-aliases.presets/kanban.yaml +14 -0
- package/templates/.build-project/config/task-type-aliases.presets/scrum.yaml +17 -0
- package/templates/.build-project/config/task-type-aliases.presets/xp.yaml +12 -0
- package/templates/.build-project/config/task-type-aliases.yaml +29 -0
- package/templates/.build-project/gitignore.template +70 -0
- package/templates/.build-project/task-types/analysis.yaml +38 -0
- package/templates/.build-project/task-types/architecture.yaml +35 -0
- package/templates/.build-project/task-types/doc.yaml +34 -0
- package/templates/.build-project/task-types/feature.yaml +22 -0
- package/templates/.build-project/task-types/general.yaml +4 -0
- package/templates/.build-project/task-types/security.yaml +38 -0
- package/templates/AGENTS.template.md +85 -0
- package/templates/CLAUDE.template.md +1 -0
- package/templates/GEMINI.template.md +1 -0
- package/templates/builtin-workflows/code-review.yaml +73 -0
- package/templates/builtin-workflows/skills/code-review/SKILL.md +61 -0
- package/templates/builtin-workflows/skills/execution-contract-analysis/SKILL.md +24 -0
- package/templates/builtin-workflows/skills/execution-contract-code/SKILL.md +19 -0
- package/templates/builtin-workflows/skills/execution-contract-structured/SKILL.md +17 -0
- package/templates/ci/incident-intake.mjs +787 -0
- package/templates/ci/incidents.yml.template +103 -0
- package/templates/ci/node.yml.template +17 -0
- package/templates/ci/python.yml.template +17 -0
- package/templates/guard-kit/GUARD_SETUP.md.template +258 -0
- package/templates/guard-kit/build-guard.yml.template +189 -0
- package/templates/guard-kit/check.mjs.template +932 -0
- package/templates/guard-kit/config.json.template +7 -0
- package/templates/guard-kit/policy.json.template +1 -0
- package/templates/profiles/README.md +57 -0
- package/templates/profiles/frontier-claude.json +23 -0
- package/templates/profiles/frontier-codex.json +23 -0
|
@@ -0,0 +1,1423 @@
|
|
|
1
|
+
import {
|
|
2
|
+
LOCAL_CI_PUBLICATION_MAC_KEY_HOME_RELATIVE_DIR
|
|
3
|
+
} from "./chunk-4U6XK2DG.js";
|
|
4
|
+
import {
|
|
5
|
+
getCheckoutPathForms,
|
|
6
|
+
getRecursiveWriteGrantRoots,
|
|
7
|
+
isCheckoutCoveredByWriteGrant,
|
|
8
|
+
isPathWithinResolved,
|
|
9
|
+
resolveCheckoutIdentity,
|
|
10
|
+
resolveRealPathOrThrow
|
|
11
|
+
} from "./chunk-BY6ODHNZ.js";
|
|
12
|
+
import {
|
|
13
|
+
formatSandboxCapabilityFailure,
|
|
14
|
+
probeProviderSandboxCapability
|
|
15
|
+
} from "./chunk-3H4MWYIC.js";
|
|
16
|
+
import {
|
|
17
|
+
getAllProviderWritePathSpecs,
|
|
18
|
+
getBuildAuthorityWriteDenyPathSpecs,
|
|
19
|
+
getProviderAuthorityRoots,
|
|
20
|
+
getProviderAuthorityWriteDenyPathSpecs,
|
|
21
|
+
getProviderAuthorityWriteReallowPathSpecs,
|
|
22
|
+
getRequiredWritePathsForProvider,
|
|
23
|
+
isAllowedRuntimeWritePath,
|
|
24
|
+
resolveWritePathSpec,
|
|
25
|
+
withResolvedTarget
|
|
26
|
+
} from "./chunk-DP7FKP6W.js";
|
|
27
|
+
import {
|
|
28
|
+
resolveAllowAwsCredentialRead
|
|
29
|
+
} from "./chunk-VIFHYTI5.js";
|
|
30
|
+
import {
|
|
31
|
+
isKernelSandboxActive,
|
|
32
|
+
isNestedSandboxReinitDenied,
|
|
33
|
+
isSandboxEnforcementSupported,
|
|
34
|
+
isSandboxSupported,
|
|
35
|
+
logLinuxHostClassNote,
|
|
36
|
+
logSandboxEnforcementUnavailable,
|
|
37
|
+
logSandboxUnavailable
|
|
38
|
+
} from "./chunk-MJ6WNSIX.js";
|
|
39
|
+
import {
|
|
40
|
+
execGitSync
|
|
41
|
+
} from "./chunk-MHLEZQQI.js";
|
|
42
|
+
import {
|
|
43
|
+
ProviderRegistry
|
|
44
|
+
} from "./chunk-QJ6OEH4K.js";
|
|
45
|
+
import {
|
|
46
|
+
authorizeLinuxHostClassWrites,
|
|
47
|
+
hasContainerOsSignal,
|
|
48
|
+
resolveLinuxHostClass
|
|
49
|
+
} from "./chunk-V2TVPO3X.js";
|
|
50
|
+
import {
|
|
51
|
+
ProviderExecutionError
|
|
52
|
+
} from "./chunk-RRC5BL7B.js";
|
|
53
|
+
import {
|
|
54
|
+
BUILD_SANDBOX_BOUNDARY_POLICY,
|
|
55
|
+
BUILD_SANDBOX_CONTAINER_ATTESTED,
|
|
56
|
+
BUILD_SANDBOX_PROFILE_PATH,
|
|
57
|
+
BUILD_SANDBOX_PROVENANCE,
|
|
58
|
+
getRuntimeEnv,
|
|
59
|
+
isDebugMode,
|
|
60
|
+
readEnv,
|
|
61
|
+
readRawEnv
|
|
62
|
+
} from "./chunk-7VRJHTGZ.js";
|
|
63
|
+
|
|
64
|
+
// src/core/sandbox/index.ts
|
|
65
|
+
import fs3 from "fs";
|
|
66
|
+
import os3 from "os";
|
|
67
|
+
|
|
68
|
+
// src/telemetry/sandbox-decision-log.ts
|
|
69
|
+
var SANDBOX_DECISION_EVENT = "sandbox_decision";
|
|
70
|
+
var SANDBOX_CAPABILITY_DENIED_EVENT = "sandbox_capability_denied";
|
|
71
|
+
function buildSandboxDecisionEvent(entry, options = {}) {
|
|
72
|
+
const denial = options.denial ?? false;
|
|
73
|
+
const event = {
|
|
74
|
+
event: denial ? SANDBOX_CAPABILITY_DENIED_EVENT : SANDBOX_DECISION_EVENT,
|
|
75
|
+
providerName: entry.providerName,
|
|
76
|
+
sandboxed: entry.sandboxed,
|
|
77
|
+
platform: entry.platform
|
|
78
|
+
};
|
|
79
|
+
if (entry.providerId !== void 0) event.providerId = entry.providerId;
|
|
80
|
+
if (entry.reason !== void 0) event.reason = entry.reason;
|
|
81
|
+
if (entry.provenance !== void 0) event.provenance = entry.provenance;
|
|
82
|
+
if (entry.boundaryProof !== void 0) event.boundaryProof = entry.boundaryProof;
|
|
83
|
+
if (entry.policyProof !== void 0) event.policyProof = entry.policyProof;
|
|
84
|
+
if (denial && entry.deniedPaths && entry.deniedPaths.length > 0) {
|
|
85
|
+
event.deniedPaths = entry.deniedPaths;
|
|
86
|
+
}
|
|
87
|
+
return event;
|
|
88
|
+
}
|
|
89
|
+
var cachedLogger = null;
|
|
90
|
+
var loaderStarted = false;
|
|
91
|
+
var PENDING_QUEUE_MAX = 32;
|
|
92
|
+
var pendingEvents = [];
|
|
93
|
+
var droppedPendingCount = 0;
|
|
94
|
+
function enqueuePending(payload) {
|
|
95
|
+
pendingEvents.push(payload);
|
|
96
|
+
while (pendingEvents.length > PENDING_QUEUE_MAX) {
|
|
97
|
+
pendingEvents.shift();
|
|
98
|
+
droppedPendingCount += 1;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
function flushPending() {
|
|
102
|
+
if (!cachedLogger || pendingEvents.length === 0) return;
|
|
103
|
+
const queued = pendingEvents.splice(0, pendingEvents.length);
|
|
104
|
+
for (const payload of queued) {
|
|
105
|
+
try {
|
|
106
|
+
cachedLogger.logCustomEvent(payload);
|
|
107
|
+
} catch {
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
if (droppedPendingCount > 0) {
|
|
111
|
+
try {
|
|
112
|
+
cachedLogger.logCustomEvent({
|
|
113
|
+
event: "sandbox_decision_queue_overflow",
|
|
114
|
+
dropped: droppedPendingCount
|
|
115
|
+
});
|
|
116
|
+
} catch {
|
|
117
|
+
}
|
|
118
|
+
droppedPendingCount = 0;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
function ensureLoggerLoading() {
|
|
122
|
+
if (cachedLogger || loaderStarted) return;
|
|
123
|
+
loaderStarted = true;
|
|
124
|
+
void import("./get-telemetry-logger-MPDVO2JA.js").then(({ getTelemetryLogger }) => {
|
|
125
|
+
try {
|
|
126
|
+
cachedLogger = getTelemetryLogger();
|
|
127
|
+
flushPending();
|
|
128
|
+
} catch {
|
|
129
|
+
pendingEvents.length = 0;
|
|
130
|
+
droppedPendingCount = 0;
|
|
131
|
+
}
|
|
132
|
+
}).catch(() => {
|
|
133
|
+
pendingEvents.length = 0;
|
|
134
|
+
droppedPendingCount = 0;
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
var recordedDecisionRunId;
|
|
138
|
+
var recordedDecisions = /* @__PURE__ */ new Set();
|
|
139
|
+
function isRepeatedDecision(payload) {
|
|
140
|
+
const runId = getRuntimeEnv("BUILD_RUN_ID");
|
|
141
|
+
if (runId !== recordedDecisionRunId) {
|
|
142
|
+
recordedDecisionRunId = runId;
|
|
143
|
+
recordedDecisions.clear();
|
|
144
|
+
}
|
|
145
|
+
const key = JSON.stringify(payload);
|
|
146
|
+
if (recordedDecisions.has(key)) return true;
|
|
147
|
+
recordedDecisions.add(key);
|
|
148
|
+
return false;
|
|
149
|
+
}
|
|
150
|
+
function recordSandboxDecision(entry) {
|
|
151
|
+
try {
|
|
152
|
+
const denial = Boolean(entry.deniedPaths && entry.deniedPaths.length > 0);
|
|
153
|
+
const payload = buildSandboxDecisionEvent(entry, { denial });
|
|
154
|
+
if (!denial && isRepeatedDecision(payload)) return;
|
|
155
|
+
if (!cachedLogger) {
|
|
156
|
+
enqueuePending(payload);
|
|
157
|
+
ensureLoggerLoading();
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
cachedLogger.logCustomEvent(payload);
|
|
161
|
+
} catch {
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
// src/core/sandbox/inherited-read-only.ts
|
|
166
|
+
function hasInheritedBoundaryReadOnlyPosture(providerId) {
|
|
167
|
+
try {
|
|
168
|
+
return ProviderRegistry.getCapability(providerId, "supports_inherited_boundary_read_only") === true;
|
|
169
|
+
} catch {
|
|
170
|
+
return false;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
function listInheritedBoundaryReadOnlyProviderIds() {
|
|
174
|
+
try {
|
|
175
|
+
return ProviderRegistry.getEnabledProviders().filter((provider) => provider.capabilities.supports_inherited_boundary_read_only === true).map((provider) => provider.id).sort();
|
|
176
|
+
} catch {
|
|
177
|
+
return [];
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
function assertReadOnlyCanInheritOuterBoundary(providerName, providerId) {
|
|
181
|
+
if (hasInheritedBoundaryReadOnlyPosture(providerId)) return;
|
|
182
|
+
const alternatives = listInheritedBoundaryReadOnlyProviderIds();
|
|
183
|
+
throw new ProviderExecutionError(
|
|
184
|
+
`[${providerName}] read-only confinement cannot be established inside the host's sandbox: Build cannot nest its own read-only profile and ${providerName} has no read-only posture that holds without it. ${alternatives.length > 0 ? `Use a provider whose read-only posture holds inside the host sandbox (${alternatives.join(", ")}), or run` : "No enabled provider offers that; run"} Build outside the host sandbox [reason=read_only_confinement_unavailable]`,
|
|
185
|
+
{ retryable: false, reason: "read_only_confinement_unavailable", providerName }
|
|
186
|
+
);
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
// src/core/sandbox/profile-cache.ts
|
|
190
|
+
import crypto from "crypto";
|
|
191
|
+
import fs2 from "fs";
|
|
192
|
+
import path4 from "path";
|
|
193
|
+
|
|
194
|
+
// src/core/sandbox/profile-generator.ts
|
|
195
|
+
import fs from "fs";
|
|
196
|
+
import os2 from "os";
|
|
197
|
+
import path3 from "path";
|
|
198
|
+
|
|
199
|
+
// src/core/sandbox/profile-storage.ts
|
|
200
|
+
import os from "os";
|
|
201
|
+
import path from "path";
|
|
202
|
+
function getSandboxProfileStorageDirectory() {
|
|
203
|
+
return path.join(os.homedir(), "Library", "Application Support", "Build", "sandbox-profiles");
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
// src/core/sandbox/provider-authority.ts
|
|
207
|
+
import path2 from "path";
|
|
208
|
+
function renderProviderAuthorityWriteDenyEntries(env, providerId, escapePath, tempVariants) {
|
|
209
|
+
const entries = /* @__PURE__ */ new Set();
|
|
210
|
+
for (const spec of getProviderAuthorityWriteDenyPathSpecs(providerId, { env })) {
|
|
211
|
+
const resolved = resolveWritePathSpec(spec, env?.HOME);
|
|
212
|
+
if (!resolved) continue;
|
|
213
|
+
for (const candidate of tempVariants(resolved)) {
|
|
214
|
+
entries.add(`
|
|
215
|
+
(${spec.kind} "${escapePath(candidate)}")`);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
if (entries.size === 0) return "";
|
|
219
|
+
const reallow = /* @__PURE__ */ new Set();
|
|
220
|
+
for (const spec of getProviderAuthorityWriteReallowPathSpecs(providerId, { env })) {
|
|
221
|
+
const resolved = resolveWritePathSpec(spec, env?.HOME);
|
|
222
|
+
if (!resolved) continue;
|
|
223
|
+
for (const candidate of tempVariants(resolved)) {
|
|
224
|
+
reallow.add(`
|
|
225
|
+
(${spec.kind} "${escapePath(candidate)}")`);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
const reallowBlock = reallow.size > 0 ? `;; Runtime data carved out of the denies above (last match wins).
|
|
229
|
+
(allow file-write*${[...reallow].join("")}
|
|
230
|
+
)
|
|
231
|
+
` : "";
|
|
232
|
+
const roots = /* @__PURE__ */ new Set();
|
|
233
|
+
for (const authorityRoot of getProviderAuthorityRoots(providerId, { env })) {
|
|
234
|
+
for (let current = authorityRoot; current !== path2.dirname(current); current = path2.dirname(current)) {
|
|
235
|
+
for (const form of getCheckoutPathForms(current)) {
|
|
236
|
+
for (const candidate of tempVariants(form)) roots.add(candidate);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
const unlink = [...roots].map((root) => `
|
|
241
|
+
(literal "${escapePath(root)}")`).join("");
|
|
242
|
+
return `;; PROVIDER SETTINGS AND HOOK SURFACES (DENY)
|
|
243
|
+
(deny file-write*${[...entries].join("")}
|
|
244
|
+
)
|
|
245
|
+
${reallowBlock}${unlink ? `;; Keep authority roots in place without blocking mkdir, auth or lock writes.
|
|
246
|
+
(deny file-write-unlink${unlink}
|
|
247
|
+
)
|
|
248
|
+
` : ""}`;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
// src/core/sandbox/profile-generator.ts
|
|
252
|
+
var CREDENTIAL_DENY_SPECS = [
|
|
253
|
+
{ kind: "subpath", homeRelative: ".ssh" },
|
|
254
|
+
{ kind: "subpath", homeRelative: ".azure" },
|
|
255
|
+
{ kind: "subpath", homeRelative: ".gnupg" },
|
|
256
|
+
{ kind: "subpath", homeRelative: ".kube" },
|
|
257
|
+
{ kind: "subpath", homeRelative: ".docker/config.json" },
|
|
258
|
+
{ kind: "literal", homeRelative: ".npmrc" },
|
|
259
|
+
{ kind: "literal", homeRelative: ".git-credentials" },
|
|
260
|
+
{ kind: "literal", homeRelative: ".config/git/credentials" },
|
|
261
|
+
{ kind: "subpath", homeRelative: ".op" },
|
|
262
|
+
{ kind: "subpath", homeRelative: ".config/op" },
|
|
263
|
+
{ kind: "literal", homeRelative: ".netrc" },
|
|
264
|
+
{ kind: "literal", homeRelative: ".pypirc" },
|
|
265
|
+
{ kind: "subpath", homeRelative: ".gem/credentials" },
|
|
266
|
+
{ kind: "literal", homeRelative: ".cargo/credentials" },
|
|
267
|
+
{ kind: "literal", homeRelative: ".cargo/credentials.toml" },
|
|
268
|
+
{ kind: "subpath", homeRelative: ".config/heroku" },
|
|
269
|
+
{ kind: "subpath", homeRelative: ".terraform.d" },
|
|
270
|
+
{ kind: "literal", homeRelative: ".vault-token" },
|
|
271
|
+
{ kind: "subpath", homeRelative: ".config/stripe" },
|
|
272
|
+
{ kind: "subpath", homeRelative: ".cloudflare" },
|
|
273
|
+
{ kind: "subpath", homeRelative: ".wrangler" },
|
|
274
|
+
{ kind: "literal", homeRelative: ".pulumi/credentials.json" },
|
|
275
|
+
{ kind: "subpath", homeRelative: ".config/vercel" },
|
|
276
|
+
{ kind: "subpath", homeRelative: ".config/netlify" },
|
|
277
|
+
// Local CI publication MAC key. Outside the sandbox-writable `~/.build`
|
|
278
|
+
// tree; denied for read+write so a confined agent cannot mint a valid
|
|
279
|
+
// success publication.
|
|
280
|
+
{
|
|
281
|
+
kind: "subpath",
|
|
282
|
+
homeRelative: LOCAL_CI_PUBLICATION_MAC_KEY_HOME_RELATIVE_DIR
|
|
283
|
+
}
|
|
284
|
+
];
|
|
285
|
+
var AWS_CREDENTIAL_DENY_SPECS = [
|
|
286
|
+
{ kind: "subpath", homeRelative: ".aws" },
|
|
287
|
+
{ kind: "literal", homeRelative: ".aws/credentials" }
|
|
288
|
+
];
|
|
289
|
+
function getCredentialDenySpecs(allowAwsCredentialRead = false) {
|
|
290
|
+
return allowAwsCredentialRead ? CREDENTIAL_DENY_SPECS : [...CREDENTIAL_DENY_SPECS, ...AWS_CREDENTIAL_DENY_SPECS];
|
|
291
|
+
}
|
|
292
|
+
var TOOLCHAIN_CREDENTIAL_DENY_SPECS = [
|
|
293
|
+
{ kind: "literal", homeRelative: ".m2/settings.xml" },
|
|
294
|
+
{ kind: "literal", homeRelative: ".m2/settings-security.xml" },
|
|
295
|
+
{ kind: "literal", homeRelative: ".gradle/gradle.properties" },
|
|
296
|
+
// Gradle init scripts auto-execute as the user on the next build (deferred
|
|
297
|
+
// exec). ~/.gradle is write-granted via COMMON_TOOLCHAIN_WRITE_PATHS, so these
|
|
298
|
+
// must be re-denied post-allow to block planted init scripts.
|
|
299
|
+
{ kind: "subpath", homeRelative: ".gradle/init.d" },
|
|
300
|
+
{ kind: "literal", homeRelative: ".gradle/init.gradle" },
|
|
301
|
+
{ kind: "literal", homeRelative: ".gradle/init.gradle.kts" }
|
|
302
|
+
];
|
|
303
|
+
var PROVIDER_TOKEN_WRITE_DENY_SPECS = [
|
|
304
|
+
{ kind: "literal", homeRelative: ".config/gh/hosts.yml" },
|
|
305
|
+
{ kind: "literal", homeRelative: ".gemini/oauth_creds.json" },
|
|
306
|
+
{
|
|
307
|
+
kind: "literal",
|
|
308
|
+
homeRelative: ".config/gcloud/application_default_credentials.json"
|
|
309
|
+
},
|
|
310
|
+
// gcloud stores live OAuth/access tokens in SQLite stores under the recursively
|
|
311
|
+
// write-granted ~/.config/gcloud tree, not just the ADC json. credentials.db and
|
|
312
|
+
// access_tokens.db are the actual token stores gcloud reads/refreshes. Deny WRITES
|
|
313
|
+
// to them (reads stay allowed) so a confined agent cannot overwrite/forge tokens.
|
|
314
|
+
// Note: denying writes may interfere with in-sandbox gcloud token refresh, which
|
|
315
|
+
// is the same posture already chosen for .config/gh/hosts.yml and .gemini tokens.
|
|
316
|
+
{ kind: "literal", homeRelative: ".config/gcloud/credentials.db" },
|
|
317
|
+
{ kind: "literal", homeRelative: ".config/gcloud/access_tokens.db" },
|
|
318
|
+
// Codex stores browser-login tokens in auth.json under the recursively
|
|
319
|
+
// write-granted ~/.codex (CODEX_HOME) tree. Re-deny writes (reads stay
|
|
320
|
+
// allowed) so a confined agent cannot overwrite/forge the login secret.
|
|
321
|
+
// Isolated/custom CODEX_HOME is re-denied separately via absolute paths
|
|
322
|
+
// (see renderCodexAuthJsonRedenyEntries) so every granted state root is covered.
|
|
323
|
+
{ kind: "literal", homeRelative: ".codex/auth.json" }
|
|
324
|
+
];
|
|
325
|
+
var CLIENT_SIDE_GIT_HOOK_NAMES = [
|
|
326
|
+
"applypatch-msg",
|
|
327
|
+
"pre-applypatch",
|
|
328
|
+
"post-applypatch",
|
|
329
|
+
"pre-commit",
|
|
330
|
+
"pre-merge-commit",
|
|
331
|
+
"prepare-commit-msg",
|
|
332
|
+
"commit-msg",
|
|
333
|
+
"post-commit",
|
|
334
|
+
"pre-rebase",
|
|
335
|
+
"post-checkout",
|
|
336
|
+
"post-merge",
|
|
337
|
+
"pre-push",
|
|
338
|
+
"post-rewrite",
|
|
339
|
+
"post-index-change",
|
|
340
|
+
"pre-auto-gc"
|
|
341
|
+
];
|
|
342
|
+
function renderWritePathDirectives(home, specs) {
|
|
343
|
+
const render = (spec, p) => `
|
|
344
|
+
(${spec.kind} "${escapeSeatbeltString(p)}")`;
|
|
345
|
+
return specs.flatMap((s) => withResolvedTarget(`${home}/${s.homeRelative}`).map((p) => render(s, p))).join("");
|
|
346
|
+
}
|
|
347
|
+
function escapeSeatbeltString(value) {
|
|
348
|
+
return value.replace(/\\/g, "\\\\").replace(/"/g, '\\"').replace(/\n/g, "\\n").replace(/\r/g, "\\r").replace(/\t/g, "\\t");
|
|
349
|
+
}
|
|
350
|
+
function regexEscapeString(value) {
|
|
351
|
+
return value.replace(/[.*+?^${}()|[\]\\/]/g, "\\$&");
|
|
352
|
+
}
|
|
353
|
+
function renderProviderStateWriteEntries(home, env, providerId) {
|
|
354
|
+
const specs = providerId ? getRequiredWritePathsForProvider(providerId, { env }) : getAllProviderWritePathSpecs({ env });
|
|
355
|
+
return specs.flatMap((spec) => {
|
|
356
|
+
if (spec.rejected) return [];
|
|
357
|
+
if (spec.kind === "regex") {
|
|
358
|
+
const anchoredPrefix = `^${regexEscapeString(home)}/`;
|
|
359
|
+
return [`
|
|
360
|
+
(regex "${escapeSeatbeltString(anchoredPrefix)}${spec.homeRelative}")`];
|
|
361
|
+
}
|
|
362
|
+
const resolved = resolveWritePathSpec(spec, home);
|
|
363
|
+
if (!resolved) return [];
|
|
364
|
+
switch (spec.kind) {
|
|
365
|
+
case "literal":
|
|
366
|
+
return [`
|
|
367
|
+
(literal "${escapeSeatbeltString(resolved)}")`];
|
|
368
|
+
default:
|
|
369
|
+
return [`
|
|
370
|
+
(subpath "${escapeSeatbeltString(resolved)}")`];
|
|
371
|
+
}
|
|
372
|
+
}).join("");
|
|
373
|
+
}
|
|
374
|
+
function renderProviderStateWriteEntriesWithinWorkingDir(home, checkout, env, providerId) {
|
|
375
|
+
const specs = providerId ? getRequiredWritePathsForProvider(providerId, { env }) : getAllProviderWritePathSpecs({ env });
|
|
376
|
+
const workingDirVariants = checkout.forms.flatMap(getMacosTempRootSymlinkVariants);
|
|
377
|
+
const entries = /* @__PURE__ */ new Set();
|
|
378
|
+
for (const spec of specs) {
|
|
379
|
+
if (spec.rejected || spec.kind === "regex") continue;
|
|
380
|
+
const resolved = resolveWritePathSpec(spec, home);
|
|
381
|
+
if (!resolved) continue;
|
|
382
|
+
const candidates = getCheckoutPathForms(resolved).flatMap(getMacosTempRootSymlinkVariants);
|
|
383
|
+
for (const candidate of candidates) {
|
|
384
|
+
const contained = workingDirVariants.some(
|
|
385
|
+
(workingDirVariant) => candidate !== workingDirVariant && isPathUnder(candidate, workingDirVariant)
|
|
386
|
+
);
|
|
387
|
+
if (!contained) continue;
|
|
388
|
+
const directive = spec.kind === "literal" ? "literal" : "subpath";
|
|
389
|
+
entries.add(`
|
|
390
|
+
(${directive} "${escapeSeatbeltString(candidate)}")`);
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
return [...entries].join("");
|
|
394
|
+
}
|
|
395
|
+
function renderOperatorXdgGitCredentialsEntry() {
|
|
396
|
+
const xdgConfigHome = process.env.XDG_CONFIG_HOME?.trim();
|
|
397
|
+
if (!xdgConfigHome || !path3.isAbsolute(xdgConfigHome)) return "";
|
|
398
|
+
return withResolvedTarget(path3.join(xdgConfigHome, "git", "credentials")).flatMap(getMacosTempRootSymlinkVariants).map((credentialsPath) => `
|
|
399
|
+
(literal "${escapeSeatbeltString(credentialsPath)}")`).join("");
|
|
400
|
+
}
|
|
401
|
+
function renderCredentialWriteDenyEntries(realHome, envHome, allowAwsCredentialRead = false) {
|
|
402
|
+
return `${renderWritePathDirectives(realHome, getCredentialDenySpecs(allowAwsCredentialRead))}${renderOperatorXdgGitCredentialsEntry()}${renderWritePathDirectives(
|
|
403
|
+
realHome,
|
|
404
|
+
TOOLCHAIN_CREDENTIAL_DENY_SPECS
|
|
405
|
+
)}${renderWritePathDirectives(envHome, PROVIDER_TOKEN_WRITE_DENY_SPECS)}`;
|
|
406
|
+
}
|
|
407
|
+
function renderCodexAuthJsonRedenyEntries(home, env) {
|
|
408
|
+
const authPaths = /* @__PURE__ */ new Set();
|
|
409
|
+
authPaths.add(path3.join(home, ".codex", "auth.json"));
|
|
410
|
+
const specs = getRequiredWritePathsForProvider("codex", {
|
|
411
|
+
env: env ?? { HOME: home },
|
|
412
|
+
includeSharedPaths: false
|
|
413
|
+
});
|
|
414
|
+
for (const spec of specs) {
|
|
415
|
+
if (spec.rejected) continue;
|
|
416
|
+
const resolved = resolveWritePathSpec(spec, home);
|
|
417
|
+
if (!resolved) continue;
|
|
418
|
+
authPaths.add(path3.join(resolved, "auth.json"));
|
|
419
|
+
}
|
|
420
|
+
return [...authPaths].flatMap((authPath) => getMacosTempRootSymlinkVariants(authPath)).map((authPath) => `
|
|
421
|
+
(literal "${escapeSeatbeltString(authPath)}")`).join("");
|
|
422
|
+
}
|
|
423
|
+
function renderCredentialRedenyEntries(realHome, envHome, env, allowAwsCredentialRead = false) {
|
|
424
|
+
return `
|
|
425
|
+
;; Credential directories/files must be re-denied after the write allow block.
|
|
426
|
+
;; macOS seatbelt uses last-match-wins, so the early read/write deny is not
|
|
427
|
+
;; enough if a runtime provider path accidentally overlaps a credential path.${renderCredentialWriteDenyEntries(realHome, envHome, allowAwsCredentialRead)}${renderCodexAuthJsonRedenyEntries(envHome, env)}`;
|
|
428
|
+
}
|
|
429
|
+
function renderBuildAuthorityWriteDenyEntries(env) {
|
|
430
|
+
const entries = /* @__PURE__ */ new Set();
|
|
431
|
+
for (const spec of getBuildAuthorityWriteDenyPathSpecs(env)) {
|
|
432
|
+
const resolved = resolveWritePathSpec(spec, env?.HOME);
|
|
433
|
+
if (!resolved) continue;
|
|
434
|
+
for (const candidate of getMacosTempRootSymlinkVariants(resolved)) {
|
|
435
|
+
entries.add(`
|
|
436
|
+
(${spec.kind} "${escapeSeatbeltString(candidate)}")`);
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
return [...entries].join("");
|
|
440
|
+
}
|
|
441
|
+
var MACOS_TEMP_ROOT_PREFIXES = [
|
|
442
|
+
"/tmp",
|
|
443
|
+
"/private/tmp",
|
|
444
|
+
"/var/folders",
|
|
445
|
+
"/private/var/folders"
|
|
446
|
+
];
|
|
447
|
+
function normalizeSeatbeltPath(candidatePath) {
|
|
448
|
+
return path3.sep === "\\" ? candidatePath.replace(/\\/g, "/") : candidatePath;
|
|
449
|
+
}
|
|
450
|
+
function isPathUnder(candidate, parent) {
|
|
451
|
+
const rel = path3.relative(parent, candidate);
|
|
452
|
+
return rel === "" || !!rel && !rel.startsWith("..") && !path3.isAbsolute(rel);
|
|
453
|
+
}
|
|
454
|
+
function isUnderMacosTempRoot(resolvedPath) {
|
|
455
|
+
const normalized = normalizeSeatbeltPath(path3.resolve(resolvedPath));
|
|
456
|
+
return MACOS_TEMP_ROOT_PREFIXES.some(
|
|
457
|
+
(root) => normalized === root || normalized.startsWith(`${root}/`)
|
|
458
|
+
);
|
|
459
|
+
}
|
|
460
|
+
function getMacosTempRootSymlinkVariants(resolvedPath) {
|
|
461
|
+
const normalized = normalizeSeatbeltPath(path3.resolve(resolvedPath));
|
|
462
|
+
const variants = /* @__PURE__ */ new Set([normalized]);
|
|
463
|
+
if (normalized === "/private/tmp" || normalized.startsWith("/private/tmp/")) {
|
|
464
|
+
variants.add(normalized.replace(/^\/private\/tmp/, "/tmp"));
|
|
465
|
+
} else if (normalized === "/tmp" || normalized.startsWith("/tmp/")) {
|
|
466
|
+
variants.add(normalized.replace(/^\/tmp/, "/private/tmp"));
|
|
467
|
+
}
|
|
468
|
+
if (normalized === "/private/var/folders" || normalized.startsWith("/private/var/folders/")) {
|
|
469
|
+
variants.add(normalized.replace(/^\/private\/var\/folders/, "/var/folders"));
|
|
470
|
+
} else if (normalized === "/var/folders" || normalized.startsWith("/var/folders/")) {
|
|
471
|
+
variants.add(normalized.replace(/^\/var\/folders/, "/private/var/folders"));
|
|
472
|
+
}
|
|
473
|
+
if (normalized === "/private/var/tmp" || normalized.startsWith("/private/var/tmp/")) {
|
|
474
|
+
variants.add(normalized.replace(/^\/private\/var\/tmp/, "/var/tmp"));
|
|
475
|
+
} else if (normalized === "/var/tmp" || normalized.startsWith("/var/tmp/")) {
|
|
476
|
+
variants.add(normalized.replace(/^\/var\/tmp/, "/private/var/tmp"));
|
|
477
|
+
}
|
|
478
|
+
return Array.from(variants).sort();
|
|
479
|
+
}
|
|
480
|
+
function renderReadOnlyCheckoutDenyEntry(checkout, readOnlyWorkingDir, grantedRoots) {
|
|
481
|
+
if (!readOnlyWorkingDir || !isCheckoutCoveredByWriteGrant(checkout, grantedRoots)) return "";
|
|
482
|
+
return [...new Set(checkout.forms.flatMap(getMacosTempRootSymlinkVariants))].map((candidate) => `
|
|
483
|
+
(subpath "${escapeSeatbeltString(candidate)}")`).join("");
|
|
484
|
+
}
|
|
485
|
+
var GIT_AUTHORITY_READ_TIMEOUT_MS = 5e3;
|
|
486
|
+
function getGitWorktreeLayout(worktreePath) {
|
|
487
|
+
try {
|
|
488
|
+
const probe = execGitSync(
|
|
489
|
+
["rev-parse", "--path-format=absolute", "--git-common-dir", "--git-dir"],
|
|
490
|
+
{
|
|
491
|
+
cwd: worktreePath,
|
|
492
|
+
timeoutMs: GIT_AUTHORITY_READ_TIMEOUT_MS,
|
|
493
|
+
scrubGitConfigFileOverrides: true
|
|
494
|
+
}
|
|
495
|
+
);
|
|
496
|
+
const [commonDir, worktreeGitDir] = probe.exitCode === 0 ? probe.stdout.trim().split(/\r?\n/) : [];
|
|
497
|
+
if (commonDir) return { sharedGitDir: commonDir, worktreeGitDir };
|
|
498
|
+
} catch {
|
|
499
|
+
}
|
|
500
|
+
const normalizedPath = worktreePath.replace(/\\/g, "/");
|
|
501
|
+
const tmpWorktreeMarker = "/.build-project/tmp/worktrees/";
|
|
502
|
+
const tmpIdx = normalizedPath.indexOf(tmpWorktreeMarker);
|
|
503
|
+
if (tmpIdx > 0) {
|
|
504
|
+
return { sharedGitDir: path3.join(normalizedPath.slice(0, tmpIdx), ".git") };
|
|
505
|
+
}
|
|
506
|
+
const labWorktreeMarker = "/.build-project/labs/";
|
|
507
|
+
const labIdx = normalizedPath.indexOf(labWorktreeMarker);
|
|
508
|
+
if (labIdx > 0) {
|
|
509
|
+
const suffix = normalizedPath.slice(labIdx + labWorktreeMarker.length);
|
|
510
|
+
const segments = suffix.split("/").filter(Boolean);
|
|
511
|
+
const isLabWorktreePath = segments.length >= 5 && segments[1] === "runs" && segments[3] === "worktrees";
|
|
512
|
+
if (isLabWorktreePath) {
|
|
513
|
+
return { sharedGitDir: path3.join(normalizedPath.slice(0, labIdx), ".git") };
|
|
514
|
+
}
|
|
515
|
+
}
|
|
516
|
+
return {};
|
|
517
|
+
}
|
|
518
|
+
function generateSandboxProfile(workingDir, extraWritePaths, readOnlyWorkingDir = false, env, providerId, allowGitWrites = true, allowAwsCredentialRead = false) {
|
|
519
|
+
const realHome = resolveCheckoutIdentity(process.env.HOME ?? os2.homedir()).canonical;
|
|
520
|
+
const home = resolveCheckoutIdentity(env?.HOME ?? realHome).canonical;
|
|
521
|
+
const homeEnv = { ...env, HOME: home };
|
|
522
|
+
const checkout = resolveCheckoutIdentity(workingDir);
|
|
523
|
+
const resolvedWorkingDir = checkout.canonical;
|
|
524
|
+
const { sharedGitDir: commonGitDir, worktreeGitDir } = getGitWorktreeLayout(resolvedWorkingDir);
|
|
525
|
+
const sharedGitDir = commonGitDir ? resolveCheckoutIdentity(commonGitDir).canonical : void 0;
|
|
526
|
+
const sharedGitDirEntry = sharedGitDir && !readOnlyWorkingDir && allowGitWrites ? `
|
|
527
|
+
(subpath "${escapeSeatbeltString(sharedGitDir)}")` : "";
|
|
528
|
+
const workingDirWriteEntry = readOnlyWorkingDir ? "" : `
|
|
529
|
+
(subpath "${escapeSeatbeltString(resolvedWorkingDir)}")`;
|
|
530
|
+
const gitWriteGuardDirs = Array.from(
|
|
531
|
+
new Set([sharedGitDir, path3.join(resolvedWorkingDir, ".git")].filter((d) => !!d))
|
|
532
|
+
);
|
|
533
|
+
const gitTail = "/(config[.]worktree|worktrees/[^/]+/config[.]worktree|(worktrees/[^/]+/)?modules/.+/(config|config[.]worktree|hooks(/.*)?))$";
|
|
534
|
+
let gitHookConfigDenyEntry = gitWriteGuardDirs.map(
|
|
535
|
+
(g) => `
|
|
536
|
+
(subpath "${escapeSeatbeltString(`${g}/hooks`)}")
|
|
537
|
+
(literal "${escapeSeatbeltString(`${g}/config`)}")` + getMacosTempRootSymlinkVariants(g).map((v) => `
|
|
538
|
+
(regex "${escapeSeatbeltString(`^${regexEscapeString(v)}${gitTail}`)}")`).join("")
|
|
539
|
+
).join("");
|
|
540
|
+
if (!allowGitWrites || readOnlyWorkingDir) {
|
|
541
|
+
gitHookConfigDenyEntry += gitWriteGuardDirs.flatMap((gitDir) => getMacosTempRootSymlinkVariants(gitDir)).map((gitDir) => `
|
|
542
|
+
(subpath "${escapeSeatbeltString(gitDir)}")`).join("");
|
|
543
|
+
}
|
|
544
|
+
let sharedGitRefDenyEntry = "";
|
|
545
|
+
let activeGitRefAllowEntry = "";
|
|
546
|
+
if (sharedGitDir && !readOnlyWorkingDir && allowGitWrites) {
|
|
547
|
+
const protectedGitPaths = [
|
|
548
|
+
path3.join(sharedGitDir, "refs"),
|
|
549
|
+
path3.join(sharedGitDir, "logs", "refs"),
|
|
550
|
+
path3.join(sharedGitDir, "packed-refs")
|
|
551
|
+
// Not the lock: every ref deletion takes it; new content goes to packed-refs.new, then a rename.
|
|
552
|
+
];
|
|
553
|
+
sharedGitRefDenyEntry = protectedGitPaths.flatMap((protectedPath) => getMacosTempRootSymlinkVariants(protectedPath)).map((protectedPath) => `
|
|
554
|
+
(subpath "${escapeSeatbeltString(protectedPath)}")`).join("");
|
|
555
|
+
try {
|
|
556
|
+
const head = execGitSync(["symbolic-ref", "--quiet", "HEAD"], {
|
|
557
|
+
cwd: resolvedWorkingDir,
|
|
558
|
+
timeoutMs: GIT_AUTHORITY_READ_TIMEOUT_MS,
|
|
559
|
+
scrubGitConfigFileOverrides: true
|
|
560
|
+
});
|
|
561
|
+
const activeRef = head.exitCode === 0 ? head.stdout.trim() : "";
|
|
562
|
+
if (activeRef && /^refs\/heads\/[A-Za-z0-9._/-]+$/.test(activeRef) && !activeRef.includes("..")) {
|
|
563
|
+
const refPath = path3.join(sharedGitDir, activeRef);
|
|
564
|
+
const logPath = path3.join(sharedGitDir, "logs", activeRef);
|
|
565
|
+
activeGitRefAllowEntry = [refPath, `${refPath}.lock`, logPath, `${logPath}.lock`].flatMap((activePath) => getMacosTempRootSymlinkVariants(activePath)).map((activePath) => `
|
|
566
|
+
(literal "${escapeSeatbeltString(activePath)}")`).join("");
|
|
567
|
+
}
|
|
568
|
+
} catch {
|
|
569
|
+
}
|
|
570
|
+
}
|
|
571
|
+
const worktreeGitfile = path3.join(resolvedWorkingDir, ".git");
|
|
572
|
+
if (sharedGitDir) {
|
|
573
|
+
try {
|
|
574
|
+
const stat = fs.lstatSync(worktreeGitfile);
|
|
575
|
+
const match = stat.isFile() ? /^gitdir:\s*(.+)\s*$/i.exec(fs.readFileSync(worktreeGitfile, "utf8").trim()) : null;
|
|
576
|
+
if (match?.[1]) {
|
|
577
|
+
const declaredGitDir = path3.resolve(resolvedWorkingDir, match[1]);
|
|
578
|
+
if (!worktreeGitDir) throw new Error("Git did not report a worktree git directory");
|
|
579
|
+
const realDeclaredGitDir = resolveRealPathOrThrow(declaredGitDir);
|
|
580
|
+
const realActualGitDir = resolveRealPathOrThrow(worktreeGitDir);
|
|
581
|
+
const realWorktreesDir = resolveRealPathOrThrow(path3.join(sharedGitDir, "worktrees"));
|
|
582
|
+
if (realDeclaredGitDir === realActualGitDir && isPathUnder(realActualGitDir, realWorktreesDir)) {
|
|
583
|
+
gitHookConfigDenyEntry += getMacosTempRootSymlinkVariants(worktreeGitfile).map((gitfile) => `
|
|
584
|
+
(literal "${escapeSeatbeltString(gitfile)}")`).join("");
|
|
585
|
+
}
|
|
586
|
+
}
|
|
587
|
+
} catch {
|
|
588
|
+
}
|
|
589
|
+
}
|
|
590
|
+
const profileStorageDenyEntry = `
|
|
591
|
+
(subpath "${escapeSeatbeltString(
|
|
592
|
+
getSandboxProfileStorageDirectory()
|
|
593
|
+
)}")`;
|
|
594
|
+
const isAllowedExtraWritePath = (resolved) => isPathWithinResolved(resolved, resolvedWorkingDir) || !!sharedGitDir && isPathWithinResolved(resolved, sharedGitDir) || isUnderMacosTempRoot(resolved) || isAllowedRuntimeWritePath(resolved, env);
|
|
595
|
+
const droppedExtraWritePaths = [];
|
|
596
|
+
const grantedExtraWritePaths = (extraWritePaths || []).map((p) => resolveCheckoutIdentity(p).canonical).filter((p) => p && p !== resolvedWorkingDir && p !== sharedGitDir).filter((p) => {
|
|
597
|
+
if (isAllowedExtraWritePath(p)) return true;
|
|
598
|
+
droppedExtraWritePaths.push(p);
|
|
599
|
+
return false;
|
|
600
|
+
}).sort();
|
|
601
|
+
const isUnderBroadWriteRoot = (candidate) => isUnderMacosTempRoot(candidate) || !!sharedGitDir && (candidate === sharedGitDir || isPathUnder(candidate, sharedGitDir)) || grantedExtraWritePaths.some((root) => candidate === root || isPathUnder(candidate, root));
|
|
602
|
+
try {
|
|
603
|
+
const hooksPathProbe = execGitSync(["config", "--get", "core.hooksPath"], {
|
|
604
|
+
cwd: resolvedWorkingDir,
|
|
605
|
+
timeoutMs: GIT_AUTHORITY_READ_TIMEOUT_MS,
|
|
606
|
+
scrubGitConfigFileOverrides: true
|
|
607
|
+
});
|
|
608
|
+
const hooksPathRaw = hooksPathProbe.exitCode === 0 ? hooksPathProbe.stdout.trim() : "";
|
|
609
|
+
if (hooksPathRaw) {
|
|
610
|
+
const absHooksPath = path3.isAbsolute(hooksPathRaw) ? path3.resolve(hooksPathRaw) : path3.resolve(resolvedWorkingDir, hooksPathRaw);
|
|
611
|
+
const rel = path3.relative(resolvedWorkingDir, absHooksPath);
|
|
612
|
+
if (rel === "") {
|
|
613
|
+
if (!readOnlyWorkingDir) {
|
|
614
|
+
for (const hookName of CLIENT_SIDE_GIT_HOOK_NAMES) {
|
|
615
|
+
gitHookConfigDenyEntry += `
|
|
616
|
+
(literal "${escapeSeatbeltString(
|
|
617
|
+
path3.join(resolvedWorkingDir, hookName)
|
|
618
|
+
)}")`;
|
|
619
|
+
}
|
|
620
|
+
}
|
|
621
|
+
} else {
|
|
622
|
+
const strictlyInside = !rel.startsWith("..") && !path3.isAbsolute(rel);
|
|
623
|
+
if (strictlyInside) {
|
|
624
|
+
if (!readOnlyWorkingDir) {
|
|
625
|
+
gitHookConfigDenyEntry += `
|
|
626
|
+
(subpath "${escapeSeatbeltString(absHooksPath)}")`;
|
|
627
|
+
try {
|
|
628
|
+
const realHooksPath = resolveRealPathOrThrow(absHooksPath);
|
|
629
|
+
if (realHooksPath !== absHooksPath) {
|
|
630
|
+
gitHookConfigDenyEntry += `
|
|
631
|
+
(subpath "${escapeSeatbeltString(realHooksPath)}")`;
|
|
632
|
+
}
|
|
633
|
+
} catch {
|
|
634
|
+
}
|
|
635
|
+
}
|
|
636
|
+
} else {
|
|
637
|
+
let realHooksPath;
|
|
638
|
+
try {
|
|
639
|
+
realHooksPath = resolveRealPathOrThrow(absHooksPath);
|
|
640
|
+
} catch {
|
|
641
|
+
}
|
|
642
|
+
if (isUnderBroadWriteRoot(absHooksPath)) {
|
|
643
|
+
gitHookConfigDenyEntry += `
|
|
644
|
+
(subpath "${escapeSeatbeltString(absHooksPath)}")`;
|
|
645
|
+
}
|
|
646
|
+
if (realHooksPath && realHooksPath !== absHooksPath && isUnderBroadWriteRoot(realHooksPath)) {
|
|
647
|
+
gitHookConfigDenyEntry += `
|
|
648
|
+
(subpath "${escapeSeatbeltString(realHooksPath)}")`;
|
|
649
|
+
}
|
|
650
|
+
}
|
|
651
|
+
}
|
|
652
|
+
}
|
|
653
|
+
} catch {
|
|
654
|
+
}
|
|
655
|
+
const extraWritePathsEntry = grantedExtraWritePaths.map((p) => `
|
|
656
|
+
(subpath "${escapeSeatbeltString(p)}")`).join("");
|
|
657
|
+
if (droppedExtraWritePaths.length > 0 && isDebugMode()) {
|
|
658
|
+
process.stderr.write(
|
|
659
|
+
`[sandbox] dropped out-of-allowed-root extraWritePaths: ${droppedExtraWritePaths.join(", ")}
|
|
660
|
+
`
|
|
661
|
+
);
|
|
662
|
+
}
|
|
663
|
+
const readOnlyCheckoutDenyEntry = renderReadOnlyCheckoutDenyEntry(checkout, readOnlyWorkingDir, [
|
|
664
|
+
...MACOS_TEMP_ROOT_PREFIXES,
|
|
665
|
+
...getRecursiveWriteGrantRoots({ home, env, providerId }),
|
|
666
|
+
...grantedExtraWritePaths
|
|
667
|
+
]);
|
|
668
|
+
const readOnlyProviderStateReallowEntry = readOnlyCheckoutDenyEntry ? renderProviderStateWriteEntriesWithinWorkingDir(home, checkout, env, providerId) : "";
|
|
669
|
+
const providerAuthorityWriteDenyEntry = renderProviderAuthorityWriteDenyEntries(
|
|
670
|
+
homeEnv,
|
|
671
|
+
providerId,
|
|
672
|
+
escapeSeatbeltString,
|
|
673
|
+
getMacosTempRootSymlinkVariants
|
|
674
|
+
);
|
|
675
|
+
const buildAuthorityWriteDenyEntry = renderBuildAuthorityWriteDenyEntries(homeEnv);
|
|
676
|
+
return `(version 1)
|
|
677
|
+
(deny default)
|
|
678
|
+
|
|
679
|
+
;; ============================================
|
|
680
|
+
;; FILESYSTEM READ ACCESS (BROAD)
|
|
681
|
+
;; ============================================
|
|
682
|
+
;; Allow reading most of the filesystem - the security
|
|
683
|
+
;; boundary is on WRITE access, not read access.
|
|
684
|
+
;; This matches Claude Code's default behavior.
|
|
685
|
+
(allow file-read* (subpath "/"))
|
|
686
|
+
|
|
687
|
+
;; ============================================
|
|
688
|
+
;; EXPLICIT DENY - SENSITIVE DIRECTORIES
|
|
689
|
+
;; ============================================
|
|
690
|
+
;; Protect credentials, keys, and secrets from read/write
|
|
691
|
+
;; These are blocked even with broad filesystem read access
|
|
692
|
+
(deny file-read* file-write*
|
|
693
|
+
${renderWritePathDirectives(realHome, getCredentialDenySpecs(allowAwsCredentialRead))}${renderOperatorXdgGitCredentialsEntry()}
|
|
694
|
+
)
|
|
695
|
+
|
|
696
|
+
;; ============================================
|
|
697
|
+
;; EXPLICIT DENY - TOOLCHAIN CREDENTIAL WRITES
|
|
698
|
+
;; ============================================
|
|
699
|
+
;; Allow build caches, but prevent tampering with common local credential files.
|
|
700
|
+
;; Safe for ordinary target builds against public package registries, and reduces
|
|
701
|
+
;; the risk of an AI process modifying user credential configuration.
|
|
702
|
+
(deny file-write*
|
|
703
|
+
${renderWritePathDirectives(realHome, TOOLCHAIN_CREDENTIAL_DENY_SPECS)}
|
|
704
|
+
)
|
|
705
|
+
|
|
706
|
+
;; ============================================
|
|
707
|
+
;; AI CLI PROVIDER CREDENTIALS (ALLOWED)
|
|
708
|
+
;; ============================================
|
|
709
|
+
;; These directories are needed for AI CLI tools to authenticate.
|
|
710
|
+
;; Read access is allowed by removing them from the deny list. Some CLIs also
|
|
711
|
+
;; require small, scoped write access for token caches (e.g. AWS SSO), which is
|
|
712
|
+
;; granted below under FILESYSTEM WRITE ACCESS.
|
|
713
|
+
;; - ~/.aws: Bedrock backends only (allowAwsCredentialRead);
|
|
714
|
+
;; missing attestation fails closed and denies ~/.aws)
|
|
715
|
+
;; - ~/.config/gh: GitHub Copilot CLI
|
|
716
|
+
;; - ~/.gcloud, ~/.config/gcloud: Gemini CLI
|
|
717
|
+
;; - ~/.config/opencode: OpenCode CLI state
|
|
718
|
+
|
|
719
|
+
;; ============================================
|
|
720
|
+
;; FILESYSTEM WRITE ACCESS (RESTRICTED)
|
|
721
|
+
;; ============================================
|
|
722
|
+
;; This is the main security boundary - writes are
|
|
723
|
+
;; restricted to worktree, temp dirs, caches, and
|
|
724
|
+
;; CLI tool state directories.
|
|
725
|
+
(allow file-write*${workingDirWriteEntry}${sharedGitDirEntry}
|
|
726
|
+
;; macOS temp directories - allow both symlinked and canonical paths
|
|
727
|
+
;; /var/folders is a symlink to /private/var/folders, but sandbox-exec
|
|
728
|
+
;; doesn't resolve symlinks when checking paths, so we need both
|
|
729
|
+
(subpath "/var/folders")
|
|
730
|
+
(subpath "/private/var/folders")
|
|
731
|
+
(subpath "/private/tmp")
|
|
732
|
+
(subpath "/tmp")
|
|
733
|
+
;; Credential/token caches required by some provider auth flows. These are not
|
|
734
|
+
;; declared in provider manifests (they live under the otherwise-denied ~/.aws
|
|
735
|
+
;; tree and are scoped to the cache subdirs only).
|
|
736
|
+
(subpath "${escapeSeatbeltString(`${home}/.aws/cli/cache`)}")
|
|
737
|
+
(subpath "${escapeSeatbeltString(`${home}/.aws/sso/cache`)}")
|
|
738
|
+
;; NOTE: macOS Keychain write access is NOT granted here. Providers that store
|
|
739
|
+
;; credentials in the system keychain declare ~/Library/Keychains in their own
|
|
740
|
+
;; manifest (provider-manifests.ts) so the grant is provider-scoped and is
|
|
741
|
+
;; covered by the inherited-sandbox capability probe. Reading a keychain secret
|
|
742
|
+
;; genuinely requires WRITE access (Security.framework updates lock/session
|
|
743
|
+
;; state and the db during a lookup), so a keychain-backed provider that also
|
|
744
|
+
;; hits a GUI authorization prompt on first read has TWO independent gates:
|
|
745
|
+
;; this profile and the keychain item's own per-item ACL, which no sandbox
|
|
746
|
+
;; profile can satisfy. An unattended run blocks on that prompt until a human
|
|
747
|
+
;; chooses "Always Allow"; a provider that stalls unattended after working
|
|
748
|
+
;; interactively is the ACL gate, not this profile.
|
|
749
|
+
;; Provider state/config/cache and Build runtime paths, derived from the
|
|
750
|
+
;; filesystem manifests (provider-manifests.ts) so the granted allowlist stays
|
|
751
|
+
;; in lockstep with the sandbox capability probe.${renderProviderStateWriteEntries(home, env, providerId)}
|
|
752
|
+
(subpath "/dev")${extraWritePathsEntry}
|
|
753
|
+
)
|
|
754
|
+
|
|
755
|
+
${readOnlyCheckoutDenyEntry ? `;; ============================================
|
|
756
|
+
;; READ-ONLY CHECKOUT (RESOLVED DENY)
|
|
757
|
+
;; ============================================
|
|
758
|
+
;; readOnlyWorkingDir omits the working-dir write entry, but other allows can still
|
|
759
|
+
;; cover the checkout: the temp roots are granted wholesale, and the checkout can
|
|
760
|
+
;; sit inside a granted state or extra write root. Re-deny it as the kernel names it.
|
|
761
|
+
(deny file-write*${readOnlyCheckoutDenyEntry}
|
|
762
|
+
)
|
|
763
|
+
|
|
764
|
+
` : ""}${readOnlyProviderStateReallowEntry ? `;; ============================================
|
|
765
|
+
;; PROVIDER RUNTIME STATE INSIDE READ-ONLY WORKTREE (ALLOW)
|
|
766
|
+
;; ============================================
|
|
767
|
+
;; Re-open only manifest-declared provider runtime state beneath the worktree.
|
|
768
|
+
;; Credential files are re-denied by the following block.
|
|
769
|
+
(allow file-write*${readOnlyProviderStateReallowEntry}
|
|
770
|
+
)
|
|
771
|
+
|
|
772
|
+
` : ""};; ============================================
|
|
773
|
+
;; CREDENTIAL WRITE SURFACES (DENY)
|
|
774
|
+
;; ============================================
|
|
775
|
+
;; Re-deny credential writes after the provider write allow block so
|
|
776
|
+
;; environment-derived paths cannot reopen sensitive locations under
|
|
777
|
+
;; last-match-wins seatbelt semantics. Includes Codex auth.json under the
|
|
778
|
+
;; default ~/.codex root and any granted isolated/custom CODEX_HOME.
|
|
779
|
+
(deny file-write*${renderCredentialRedenyEntries(realHome, home, env, allowAwsCredentialRead)}
|
|
780
|
+
)
|
|
781
|
+
|
|
782
|
+
${providerAuthorityWriteDenyEntry}${buildAuthorityWriteDenyEntry ? `;; ============================================
|
|
783
|
+
;; BUILD CONFIGURATION AUTHORITY (DENY)
|
|
784
|
+
;; ============================================
|
|
785
|
+
;; Shared runtime state remains writable, but provider runs must not rewrite
|
|
786
|
+
;; Build's executable-selection or policy configuration for future runs.
|
|
787
|
+
(deny file-write*${buildAuthorityWriteDenyEntry}
|
|
788
|
+
)
|
|
789
|
+
|
|
790
|
+
` : ""};; ============================================
|
|
791
|
+
;; GIT EXECUTABLE/AUTHORITY SURFACES (DENY)
|
|
792
|
+
;; ============================================
|
|
793
|
+
;; Block writes to git hooks and config even though the surrounding .git is
|
|
794
|
+
;; writable for normal worktree operations. This closes deferred host code
|
|
795
|
+
;; execution (planted hooks / core.hooksPath) without breaking commits.
|
|
796
|
+
;; Placed AFTER the write-allow block so it wins under last-match-wins.
|
|
797
|
+
(deny file-write*${gitHookConfigDenyEntry}${profileStorageDenyEntry}
|
|
798
|
+
)
|
|
799
|
+
|
|
800
|
+
${sharedGitRefDenyEntry ? `;; Shared Git refs are global across linked worktrees. Deny all ref writes, then
|
|
801
|
+
;; reopen only this worktree's active branch ref and reflog for normal commits.
|
|
802
|
+
(deny file-write*${sharedGitRefDenyEntry}
|
|
803
|
+
)` : ""}
|
|
804
|
+
${activeGitRefAllowEntry ? `(allow file-write*${activeGitRefAllowEntry}
|
|
805
|
+
)` : ""}
|
|
806
|
+
|
|
807
|
+
;; ============================================
|
|
808
|
+
;; IPC & MACH (FOR CLI AUTH + SUBPROCESSES)
|
|
809
|
+
;; ============================================
|
|
810
|
+
(allow mach*)
|
|
811
|
+
(allow ipc*)
|
|
812
|
+
|
|
813
|
+
;; ============================================
|
|
814
|
+
;; NETWORK (OUTBOUND + LOCAL SERVER)
|
|
815
|
+
;; ============================================
|
|
816
|
+
(allow network-outbound)
|
|
817
|
+
;; Some CLIs (notably OpenCode) start a local loopback server even for one-shot
|
|
818
|
+
;; commands (e.g. "opencode run"). Allow inbound connections but restrict binds
|
|
819
|
+
;; to loopback interfaces only.
|
|
820
|
+
(allow network-inbound)
|
|
821
|
+
(allow network-bind (local ip "localhost:*"))
|
|
822
|
+
|
|
823
|
+
;; ============================================
|
|
824
|
+
;; PROCESS EXECUTION
|
|
825
|
+
;; ============================================
|
|
826
|
+
(allow process-exec*)
|
|
827
|
+
(allow process-fork)
|
|
828
|
+
(allow signal)
|
|
829
|
+
(allow sysctl-read)
|
|
830
|
+
`;
|
|
831
|
+
}
|
|
832
|
+
|
|
833
|
+
// src/core/sandbox/profile-cache.ts
|
|
834
|
+
var profileCache = /* @__PURE__ */ new Map();
|
|
835
|
+
function getProfileBaseDir() {
|
|
836
|
+
return getSandboxProfileStorageDirectory();
|
|
837
|
+
}
|
|
838
|
+
function getProfileCacheKey(profile) {
|
|
839
|
+
return crypto.createHash("sha256").update(profile).digest("hex");
|
|
840
|
+
}
|
|
841
|
+
function isExpectedProfile(profilePath, profile) {
|
|
842
|
+
try {
|
|
843
|
+
const stat = fs2.lstatSync(profilePath);
|
|
844
|
+
return stat.isFile() && !stat.isSymbolicLink() && (stat.mode & 511) === 384 && fs2.readFileSync(profilePath, "utf8") === profile;
|
|
845
|
+
} catch {
|
|
846
|
+
return false;
|
|
847
|
+
}
|
|
848
|
+
}
|
|
849
|
+
function ensurePrivateStorageDirectory(baseDir) {
|
|
850
|
+
fs2.mkdirSync(baseDir, { recursive: true, mode: 448 });
|
|
851
|
+
const stat = fs2.lstatSync(baseDir);
|
|
852
|
+
if (!stat.isDirectory() || stat.isSymbolicLink()) {
|
|
853
|
+
throw new Error(`Sandbox profile storage is not a private directory: ${baseDir}`);
|
|
854
|
+
}
|
|
855
|
+
if ((stat.mode & 511) !== 448) {
|
|
856
|
+
fs2.chmodSync(baseDir, 448);
|
|
857
|
+
}
|
|
858
|
+
}
|
|
859
|
+
function writeProfileAtomically(profilePath, profile) {
|
|
860
|
+
const temporaryPath = `${profilePath}.${process.pid}.${crypto.randomUUID()}.tmp`;
|
|
861
|
+
try {
|
|
862
|
+
fs2.writeFileSync(temporaryPath, profile, { encoding: "utf8", flag: "wx", mode: 384 });
|
|
863
|
+
fs2.renameSync(temporaryPath, profilePath);
|
|
864
|
+
fs2.chmodSync(profilePath, 384);
|
|
865
|
+
} finally {
|
|
866
|
+
try {
|
|
867
|
+
fs2.rmSync(temporaryPath, { force: true });
|
|
868
|
+
} catch {
|
|
869
|
+
}
|
|
870
|
+
}
|
|
871
|
+
}
|
|
872
|
+
function getOrCreateProfile(workingDir, extraWritePaths, readOnlyWorkingDir = false, env, providerId, allowGitWrites = true, allowAwsCredentialRead = false) {
|
|
873
|
+
const profile = generateSandboxProfile(
|
|
874
|
+
workingDir,
|
|
875
|
+
extraWritePaths,
|
|
876
|
+
readOnlyWorkingDir,
|
|
877
|
+
env,
|
|
878
|
+
providerId,
|
|
879
|
+
allowGitWrites,
|
|
880
|
+
allowAwsCredentialRead
|
|
881
|
+
);
|
|
882
|
+
const cacheKey = getProfileCacheKey(profile);
|
|
883
|
+
const baseDir = getProfileBaseDir();
|
|
884
|
+
ensurePrivateStorageDirectory(baseDir);
|
|
885
|
+
const profilePath = path4.join(baseDir, `${cacheKey}.sb`);
|
|
886
|
+
const cached = profileCache.get(cacheKey);
|
|
887
|
+
if (cached === profilePath && isExpectedProfile(cached, profile)) {
|
|
888
|
+
return cached;
|
|
889
|
+
}
|
|
890
|
+
if (!isExpectedProfile(profilePath, profile)) {
|
|
891
|
+
writeProfileAtomically(profilePath, profile);
|
|
892
|
+
}
|
|
893
|
+
profileCache.set(cacheKey, profilePath);
|
|
894
|
+
return profilePath;
|
|
895
|
+
}
|
|
896
|
+
function registerGlobalCleanup() {
|
|
897
|
+
}
|
|
898
|
+
|
|
899
|
+
// src/core/sandbox/index.ts
|
|
900
|
+
function isTestRuntime() {
|
|
901
|
+
return Boolean(process.env.VITEST || process.env.VITEST_WORKER_ID);
|
|
902
|
+
}
|
|
903
|
+
function isBooleanTrueEnv(value) {
|
|
904
|
+
if (value === void 0) return false;
|
|
905
|
+
return ["1", "true", "yes", "on"].includes(value.trim().toLowerCase());
|
|
906
|
+
}
|
|
907
|
+
function isContainerAttestedByEnv(env) {
|
|
908
|
+
const source = env ?? process.env;
|
|
909
|
+
const attestedClaim = env ? isBooleanTrueEnv(source[BUILD_SANDBOX_CONTAINER_ATTESTED.name]) : readEnv(BUILD_SANDBOX_CONTAINER_ATTESTED).value === true;
|
|
910
|
+
const provenanceClaim = env ? source[BUILD_SANDBOX_PROVENANCE.name] === "container" : readRawEnv(BUILD_SANDBOX_PROVENANCE) === "container";
|
|
911
|
+
if (!attestedClaim && !provenanceClaim) return false;
|
|
912
|
+
return hasContainerOsSignal();
|
|
913
|
+
}
|
|
914
|
+
function isLinuxHostClassProvenance(provenance) {
|
|
915
|
+
return provenance === "linux_isolated" || provenance === "linux_acknowledged" || provenance === "linux_desktop_unacked";
|
|
916
|
+
}
|
|
917
|
+
function isLinuxWriteProvenance(provenance) {
|
|
918
|
+
return provenance === "linux_isolated" || provenance === "linux_acknowledged";
|
|
919
|
+
}
|
|
920
|
+
function normalizeProviderName(name) {
|
|
921
|
+
return name.toUpperCase().replace(/[^A-Z0-9]/g, "_");
|
|
922
|
+
}
|
|
923
|
+
function hasExplicitSandboxOptOut(providerName, providerId) {
|
|
924
|
+
if (!isImplicitTestRuntimeSandboxDisable()) {
|
|
925
|
+
return !isSandboxEnabled(providerName, providerId);
|
|
926
|
+
}
|
|
927
|
+
return isProviderSandboxOptOut(providerName, providerId);
|
|
928
|
+
}
|
|
929
|
+
function isSandboxEnabledForProvider(providerName, providerId) {
|
|
930
|
+
return isSandboxEnabled(providerName, providerId);
|
|
931
|
+
}
|
|
932
|
+
function willSandboxBeActive(providerName, providerId, options) {
|
|
933
|
+
const enabled = isSandboxEnabled(providerName, providerId);
|
|
934
|
+
if (!enabled) return false;
|
|
935
|
+
if (isSandboxSupported() && !(isKernelSandboxActive() && isNestedSandboxReinitDenied())) {
|
|
936
|
+
return true;
|
|
937
|
+
}
|
|
938
|
+
const attestation = detectSandboxBoundaryAttestation(providerName, providerId, options);
|
|
939
|
+
if (isLinuxHostClassProvenance(attestation.provenance)) {
|
|
940
|
+
return false;
|
|
941
|
+
}
|
|
942
|
+
return isSandboxBoundaryAccepted(attestation, resolveEnvSandboxBoundaryPolicy());
|
|
943
|
+
}
|
|
944
|
+
function isSandboxEnforcementOperational(providerName, providerId) {
|
|
945
|
+
if (!willSandboxBeActive(providerName, providerId)) return false;
|
|
946
|
+
return isSandboxEnforcementSupported();
|
|
947
|
+
}
|
|
948
|
+
function isSelfGeneratedSeatbeltOperational(providerName, providerId) {
|
|
949
|
+
if (!isSandboxEnabled(providerName, providerId)) return false;
|
|
950
|
+
if (!isSandboxSupported()) return false;
|
|
951
|
+
return isSandboxEnforcementSupported();
|
|
952
|
+
}
|
|
953
|
+
function requireActiveSandboxBoundary(providerName, reason, providerId, options) {
|
|
954
|
+
const attestation = detectSandboxBoundaryAttestation(providerName, providerId, options);
|
|
955
|
+
const effectivePolicy = resolveEnvSandboxBoundaryPolicy();
|
|
956
|
+
const accepted = isSandboxBoundaryAccepted(attestation, effectivePolicy);
|
|
957
|
+
if (accepted) {
|
|
958
|
+
return attestation;
|
|
959
|
+
}
|
|
960
|
+
if (os3.platform() === "linux") {
|
|
961
|
+
const authorized = authorizeLinuxHostClassWrites(options);
|
|
962
|
+
if (authorized.status === "allowed") {
|
|
963
|
+
return {
|
|
964
|
+
provenance: authorized.provenance,
|
|
965
|
+
evidence: attestation.evidence
|
|
966
|
+
};
|
|
967
|
+
}
|
|
968
|
+
}
|
|
969
|
+
throw new ProviderExecutionError(
|
|
970
|
+
`[${providerName}] ${reason} requires an active sandbox boundary, but none is available (provenance=${attestation.provenance}) [reason=sandbox_boundary_required]`,
|
|
971
|
+
{ retryable: false, reason: "sandbox_boundary_required" }
|
|
972
|
+
);
|
|
973
|
+
}
|
|
974
|
+
function provenanceProvesPolicyByConstruction(attestation) {
|
|
975
|
+
return attestation.provenance === "seatbelt_self";
|
|
976
|
+
}
|
|
977
|
+
function provenanceSkipsCapabilityProbe(attestation) {
|
|
978
|
+
return attestation.provenance === "seatbelt_self" || attestation.provenance === "linux_isolated" || attestation.provenance === "linux_acknowledged";
|
|
979
|
+
}
|
|
980
|
+
function policyProofForAcceptedBoundary(attestation, providerId, env) {
|
|
981
|
+
if (isLinuxWriteProvenance(attestation.provenance)) {
|
|
982
|
+
return "linux_host_class";
|
|
983
|
+
}
|
|
984
|
+
if (provenanceProvesPolicyByConstruction(attestation)) {
|
|
985
|
+
return "wrap_applied";
|
|
986
|
+
}
|
|
987
|
+
const capability = probeProviderSandboxCapability(providerId, {
|
|
988
|
+
env,
|
|
989
|
+
includeSharedPaths: false
|
|
990
|
+
});
|
|
991
|
+
return capability.capable ? "capability_probe" : void 0;
|
|
992
|
+
}
|
|
993
|
+
function boundaryProofForProvenance(provenance) {
|
|
994
|
+
switch (provenance) {
|
|
995
|
+
case "seatbelt_self":
|
|
996
|
+
return void 0;
|
|
997
|
+
case "container":
|
|
998
|
+
return "container";
|
|
999
|
+
case "inherited_outer":
|
|
1000
|
+
return "inherited_outer";
|
|
1001
|
+
case "linux_isolated":
|
|
1002
|
+
return "linux_isolated";
|
|
1003
|
+
case "linux_acknowledged":
|
|
1004
|
+
return "linux_acknowledged";
|
|
1005
|
+
default:
|
|
1006
|
+
return void 0;
|
|
1007
|
+
}
|
|
1008
|
+
}
|
|
1009
|
+
function requireActivePolicyBoundary(providerName, reason, providerId, options = {}) {
|
|
1010
|
+
const attestation = requireActiveSandboxBoundary(providerName, reason, providerId, options);
|
|
1011
|
+
if (provenanceSkipsCapabilityProbe(attestation)) {
|
|
1012
|
+
return { attestation, kind: "policy" };
|
|
1013
|
+
}
|
|
1014
|
+
const capability = probeProviderSandboxCapability(providerId ?? providerName.toLowerCase(), {
|
|
1015
|
+
env: options.env,
|
|
1016
|
+
includeSharedPaths: false
|
|
1017
|
+
});
|
|
1018
|
+
if (capability.capable) {
|
|
1019
|
+
return { attestation, kind: "policy", capability };
|
|
1020
|
+
}
|
|
1021
|
+
recordSandboxDecision({
|
|
1022
|
+
providerName,
|
|
1023
|
+
providerId: providerId ?? providerName.toLowerCase(),
|
|
1024
|
+
sandboxed: false,
|
|
1025
|
+
reason: "sandbox_capability_denied",
|
|
1026
|
+
provenance: attestation.provenance,
|
|
1027
|
+
deniedPaths: capability.missing.map((entry) => entry.path),
|
|
1028
|
+
platform: os3.platform()
|
|
1029
|
+
});
|
|
1030
|
+
throw new ProviderExecutionError(
|
|
1031
|
+
`[${providerName}] ${reason}: ${formatSandboxCapabilityFailure(capability)} [reason=sandbox_capability_denied]`,
|
|
1032
|
+
{ retryable: false, reason: "sandbox_capability_denied" }
|
|
1033
|
+
);
|
|
1034
|
+
}
|
|
1035
|
+
function shouldBypassProviderInternalSandbox(providerName, reason, providerId, options = {}) {
|
|
1036
|
+
requireActivePolicyBoundary(providerName, reason, providerId, options);
|
|
1037
|
+
return true;
|
|
1038
|
+
}
|
|
1039
|
+
function detectSandboxBoundaryAttestation(providerName, providerId, options) {
|
|
1040
|
+
const seatbeltSelfOperational = isSelfGeneratedSeatbeltOperational(providerName, providerId);
|
|
1041
|
+
const sandboxRuntimeEnv = process.env.SANDBOX_RUNTIME === "1";
|
|
1042
|
+
const kernelSandboxActive = isKernelSandboxActive();
|
|
1043
|
+
const nestedSandboxReinitDenied = isNestedSandboxReinitDenied();
|
|
1044
|
+
const containerAttested = isContainerAttestedByEnv(options?.env);
|
|
1045
|
+
const evidence = {
|
|
1046
|
+
seatbeltSelfOperational,
|
|
1047
|
+
sandboxRuntimeEnv,
|
|
1048
|
+
kernelSandboxActive,
|
|
1049
|
+
nestedSandboxReinitDenied,
|
|
1050
|
+
containerAttested
|
|
1051
|
+
};
|
|
1052
|
+
if (seatbeltSelfOperational) {
|
|
1053
|
+
return { provenance: "seatbelt_self", evidence };
|
|
1054
|
+
}
|
|
1055
|
+
const linuxResolution = os3.platform() === "linux" ? resolveLinuxHostClass(options) : null;
|
|
1056
|
+
const forcedDesktop = linuxResolution?.source === "env_desktop" || linuxResolution?.evidence.envHostClass === "desktop";
|
|
1057
|
+
if (containerAttested && !forcedDesktop) {
|
|
1058
|
+
return { provenance: "container", evidence };
|
|
1059
|
+
}
|
|
1060
|
+
if (linuxResolution?.hostClass === "isolated" && linuxResolution.source !== "container_attested") {
|
|
1061
|
+
logLinuxHostClassNote(linuxResolution);
|
|
1062
|
+
return { provenance: "linux_isolated", evidence };
|
|
1063
|
+
}
|
|
1064
|
+
const inheritedOuterAttested = kernelSandboxActive && (sandboxRuntimeEnv || nestedSandboxReinitDenied);
|
|
1065
|
+
if (inheritedOuterAttested) {
|
|
1066
|
+
return { provenance: "inherited_outer", evidence };
|
|
1067
|
+
}
|
|
1068
|
+
if (linuxResolution?.hostClass === "desktop-acked") {
|
|
1069
|
+
logLinuxHostClassNote(linuxResolution);
|
|
1070
|
+
return { provenance: "linux_acknowledged", evidence };
|
|
1071
|
+
}
|
|
1072
|
+
if (linuxResolution?.hostClass === "desktop-unacked") {
|
|
1073
|
+
return { provenance: "linux_desktop_unacked", evidence };
|
|
1074
|
+
}
|
|
1075
|
+
return { provenance: "none", evidence };
|
|
1076
|
+
}
|
|
1077
|
+
function resolveSandboxBoundaryPolicy(raw) {
|
|
1078
|
+
return raw === "strict" ? "strict" : "attested_outer_ok";
|
|
1079
|
+
}
|
|
1080
|
+
function resolveEnvSandboxBoundaryPolicy() {
|
|
1081
|
+
return resolveSandboxBoundaryPolicy(readRawEnv(BUILD_SANDBOX_BOUNDARY_POLICY));
|
|
1082
|
+
}
|
|
1083
|
+
function isAttestedInheritedOuterBoundary(attestation) {
|
|
1084
|
+
return attestation.provenance === "inherited_outer" && attestation.evidence.kernelSandboxActive && attestation.evidence.nestedSandboxReinitDenied;
|
|
1085
|
+
}
|
|
1086
|
+
function isSandboxBoundaryAccepted(attestation, policy) {
|
|
1087
|
+
if (attestation.provenance === "seatbelt_self" || attestation.provenance === "container") {
|
|
1088
|
+
return true;
|
|
1089
|
+
}
|
|
1090
|
+
if (isLinuxWriteProvenance(attestation.provenance)) {
|
|
1091
|
+
return os3.platform() === "linux";
|
|
1092
|
+
}
|
|
1093
|
+
if (policy === "attested_outer_ok" && isAttestedInheritedOuterBoundary(attestation)) {
|
|
1094
|
+
return true;
|
|
1095
|
+
}
|
|
1096
|
+
return false;
|
|
1097
|
+
}
|
|
1098
|
+
function warnSandboxEnforcementUnavailable() {
|
|
1099
|
+
logSandboxEnforcementUnavailable();
|
|
1100
|
+
}
|
|
1101
|
+
function isImplicitTestRuntimeSandboxDisable() {
|
|
1102
|
+
return isTestRuntime() && process.env.BUILD_SANDBOX_ENABLED === void 0;
|
|
1103
|
+
}
|
|
1104
|
+
function isSandboxEnabled(providerName, providerId) {
|
|
1105
|
+
if (isImplicitTestRuntimeSandboxDisable()) {
|
|
1106
|
+
return false;
|
|
1107
|
+
}
|
|
1108
|
+
return !isProviderSandboxOptOut(providerName, providerId);
|
|
1109
|
+
}
|
|
1110
|
+
function isProviderSandboxOptOut(providerName, providerId) {
|
|
1111
|
+
const globalDisabled = process.env.BUILD_SANDBOX_ENABLED === "0";
|
|
1112
|
+
if (globalDisabled) return true;
|
|
1113
|
+
const normalizedName = normalizeProviderName(providerName);
|
|
1114
|
+
const nameOverride = process.env[`BUILD_SANDBOX_${normalizedName}_ENABLED`];
|
|
1115
|
+
if (nameOverride === "0") return true;
|
|
1116
|
+
if (providerId) {
|
|
1117
|
+
const normalizedId = normalizeProviderName(providerId);
|
|
1118
|
+
const idOverride = process.env[`BUILD_SANDBOX_${normalizedId}_ENABLED`];
|
|
1119
|
+
if (idOverride === "0") return true;
|
|
1120
|
+
}
|
|
1121
|
+
return false;
|
|
1122
|
+
}
|
|
1123
|
+
function validateCustomSandboxProfile(profilePath) {
|
|
1124
|
+
let contents;
|
|
1125
|
+
try {
|
|
1126
|
+
const stat = fs3.statSync(profilePath);
|
|
1127
|
+
if (!stat.isFile()) {
|
|
1128
|
+
throw new ProviderExecutionError(
|
|
1129
|
+
`[Sandbox] BUILD_SANDBOX_PROFILE_PATH is not a regular file: ${profilePath} [reason=invalid_custom_sandbox_profile]`,
|
|
1130
|
+
{ retryable: false, reason: "invalid_custom_sandbox_profile" }
|
|
1131
|
+
);
|
|
1132
|
+
}
|
|
1133
|
+
contents = fs3.readFileSync(profilePath, "utf8");
|
|
1134
|
+
} catch (error) {
|
|
1135
|
+
if (error instanceof ProviderExecutionError) throw error;
|
|
1136
|
+
throw new ProviderExecutionError(
|
|
1137
|
+
`[Sandbox] BUILD_SANDBOX_PROFILE_PATH could not be read: ${profilePath} [reason=invalid_custom_sandbox_profile]`,
|
|
1138
|
+
{ retryable: false, reason: "invalid_custom_sandbox_profile" }
|
|
1139
|
+
);
|
|
1140
|
+
}
|
|
1141
|
+
const policy = contents.replace(/;.*$/gm, "");
|
|
1142
|
+
const hasDenyDefault = /\(\s*deny\s+default\s*\)/.test(policy);
|
|
1143
|
+
const hasAllowDefault = /\(\s*allow\s+default\s*\)/.test(policy);
|
|
1144
|
+
if (hasAllowDefault) {
|
|
1145
|
+
throw new ProviderExecutionError(
|
|
1146
|
+
`[Sandbox] Custom sandbox profile contains (allow default), which grants an unrestricted sandbox: ${profilePath} [reason=invalid_custom_sandbox_profile]`,
|
|
1147
|
+
{ retryable: false, reason: "invalid_custom_sandbox_profile" }
|
|
1148
|
+
);
|
|
1149
|
+
}
|
|
1150
|
+
if (!hasDenyDefault) {
|
|
1151
|
+
throw new ProviderExecutionError(
|
|
1152
|
+
`[Sandbox] Custom sandbox profile must contain (deny default): ${profilePath} [reason=invalid_custom_sandbox_profile]`,
|
|
1153
|
+
{ retryable: false, reason: "invalid_custom_sandbox_profile" }
|
|
1154
|
+
);
|
|
1155
|
+
}
|
|
1156
|
+
}
|
|
1157
|
+
function unwrappedAcceptedBoundaryResult(attestation, config, platform) {
|
|
1158
|
+
const boundaryProof = boundaryProofForProvenance(attestation.provenance);
|
|
1159
|
+
if (boundaryProof === void 0) {
|
|
1160
|
+
return void 0;
|
|
1161
|
+
}
|
|
1162
|
+
const policyProof = policyProofForAcceptedBoundary(
|
|
1163
|
+
attestation,
|
|
1164
|
+
config.providerId ?? config.providerName.toLowerCase(),
|
|
1165
|
+
config.env
|
|
1166
|
+
);
|
|
1167
|
+
const linuxHostClass = isLinuxWriteProvenance(attestation.provenance);
|
|
1168
|
+
logSandboxTelemetry(
|
|
1169
|
+
{
|
|
1170
|
+
providerName: config.providerName,
|
|
1171
|
+
sandboxed: !linuxHostClass,
|
|
1172
|
+
reason: attestation.provenance,
|
|
1173
|
+
platform,
|
|
1174
|
+
workingDir: config.workingDir
|
|
1175
|
+
},
|
|
1176
|
+
{
|
|
1177
|
+
provenance: attestation.provenance,
|
|
1178
|
+
boundaryProof,
|
|
1179
|
+
policyProof,
|
|
1180
|
+
providerId: config.providerId ?? config.providerName.toLowerCase()
|
|
1181
|
+
}
|
|
1182
|
+
);
|
|
1183
|
+
return {
|
|
1184
|
+
command: config.command,
|
|
1185
|
+
args: config.args,
|
|
1186
|
+
// Host class is write permission, not confinement. Gate 3 checks proofs.
|
|
1187
|
+
sandboxed: !linuxHostClass,
|
|
1188
|
+
boundaryProof,
|
|
1189
|
+
policyProof
|
|
1190
|
+
};
|
|
1191
|
+
}
|
|
1192
|
+
function willReadOnlyWorkspaceBeEnforced(providerName, providerId) {
|
|
1193
|
+
if (!isSandboxEnabled(providerName, providerId)) return false;
|
|
1194
|
+
if (readEnv(BUILD_SANDBOX_PROFILE_PATH).value) return false;
|
|
1195
|
+
if (!isSelfGeneratedSeatbeltOperational(providerName, providerId)) return false;
|
|
1196
|
+
if (isKernelSandboxActive() && isNestedSandboxReinitDenied()) return false;
|
|
1197
|
+
return true;
|
|
1198
|
+
}
|
|
1199
|
+
function wrapWithSandbox(config, options) {
|
|
1200
|
+
const {
|
|
1201
|
+
workingDir,
|
|
1202
|
+
command,
|
|
1203
|
+
args,
|
|
1204
|
+
providerName,
|
|
1205
|
+
extraWritePaths,
|
|
1206
|
+
readOnlyWorkingDir,
|
|
1207
|
+
allowGitWrites,
|
|
1208
|
+
requiresBoundaryForWrites,
|
|
1209
|
+
providerId,
|
|
1210
|
+
env
|
|
1211
|
+
} = config;
|
|
1212
|
+
const platform = os3.platform();
|
|
1213
|
+
let reason;
|
|
1214
|
+
const runningUnderVitest = isTestRuntime();
|
|
1215
|
+
if (!isSandboxEnabled(providerName, providerId)) {
|
|
1216
|
+
const attestation = detectSandboxBoundaryAttestation(providerName, providerId, options);
|
|
1217
|
+
const boundaryPolicy = resolveEnvSandboxBoundaryPolicy();
|
|
1218
|
+
if (isSandboxBoundaryAccepted(attestation, boundaryPolicy)) {
|
|
1219
|
+
const accepted = unwrappedAcceptedBoundaryResult(attestation, config, platform);
|
|
1220
|
+
if (accepted) {
|
|
1221
|
+
return accepted;
|
|
1222
|
+
}
|
|
1223
|
+
}
|
|
1224
|
+
const globalDisabled = process.env.BUILD_SANDBOX_ENABLED === "0";
|
|
1225
|
+
const disabledKey = providerId ? `provider_disabled_${providerId}` : `provider_disabled_${providerName}`;
|
|
1226
|
+
reason = globalDisabled ? "globally_disabled" : disabledKey;
|
|
1227
|
+
logSandboxTelemetry({
|
|
1228
|
+
providerName,
|
|
1229
|
+
sandboxed: false,
|
|
1230
|
+
reason,
|
|
1231
|
+
platform,
|
|
1232
|
+
workingDir
|
|
1233
|
+
});
|
|
1234
|
+
if (requiresBoundaryForWrites && !readOnlyWorkingDir && !hasExplicitSandboxOptOut(providerName, providerId)) {
|
|
1235
|
+
if (platform === "linux") {
|
|
1236
|
+
authorizeLinuxHostClassWrites(options);
|
|
1237
|
+
}
|
|
1238
|
+
throw new ProviderExecutionError(
|
|
1239
|
+
`[${providerName}] write-capable provider execution requires an active sandbox boundary; the sandbox is disabled only by an implicit test-runtime signal (reason=${reason}). Set BUILD_SANDBOX_ENABLED=0 explicitly to accept unconfined execution [reason=sandbox_boundary_required]`,
|
|
1240
|
+
{ retryable: false, reason: "sandbox_boundary_required", providerName }
|
|
1241
|
+
);
|
|
1242
|
+
}
|
|
1243
|
+
return { command, args, sandboxed: false };
|
|
1244
|
+
}
|
|
1245
|
+
if (!isSandboxSupported()) {
|
|
1246
|
+
const attestation = detectSandboxBoundaryAttestation(providerName, providerId, options);
|
|
1247
|
+
const boundaryPolicy = resolveEnvSandboxBoundaryPolicy();
|
|
1248
|
+
if (isSandboxBoundaryAccepted(attestation, boundaryPolicy)) {
|
|
1249
|
+
const accepted = unwrappedAcceptedBoundaryResult(attestation, config, platform);
|
|
1250
|
+
if (accepted) {
|
|
1251
|
+
return accepted;
|
|
1252
|
+
}
|
|
1253
|
+
}
|
|
1254
|
+
if (platform !== "linux") {
|
|
1255
|
+
logSandboxUnavailable();
|
|
1256
|
+
}
|
|
1257
|
+
reason = platform === "darwin" ? "sandbox_exec_not_found" : "unsupported_platform";
|
|
1258
|
+
logSandboxTelemetry({
|
|
1259
|
+
providerName,
|
|
1260
|
+
sandboxed: false,
|
|
1261
|
+
reason,
|
|
1262
|
+
platform,
|
|
1263
|
+
workingDir
|
|
1264
|
+
});
|
|
1265
|
+
if (requiresBoundaryForWrites && !readOnlyWorkingDir) {
|
|
1266
|
+
if (platform === "linux") {
|
|
1267
|
+
const authorized = authorizeLinuxHostClassWrites(options);
|
|
1268
|
+
if (authorized.status === "allowed") {
|
|
1269
|
+
const allowedAttestation = {
|
|
1270
|
+
provenance: authorized.provenance,
|
|
1271
|
+
evidence: attestation.evidence
|
|
1272
|
+
};
|
|
1273
|
+
const accepted = unwrappedAcceptedBoundaryResult(allowedAttestation, config, platform);
|
|
1274
|
+
if (accepted) {
|
|
1275
|
+
return accepted;
|
|
1276
|
+
}
|
|
1277
|
+
}
|
|
1278
|
+
}
|
|
1279
|
+
throw new ProviderExecutionError(
|
|
1280
|
+
`[${providerName}] write-capable provider execution requires an active sandbox boundary, but none is available on this platform (platform=${platform}, provenance=${attestation.provenance}) [reason=sandbox_boundary_required]`,
|
|
1281
|
+
{ retryable: false, reason: "sandbox_boundary_required", providerName }
|
|
1282
|
+
);
|
|
1283
|
+
}
|
|
1284
|
+
return { command, args, sandboxed: false };
|
|
1285
|
+
}
|
|
1286
|
+
if (!runningUnderVitest && isKernelSandboxActive() && isNestedSandboxReinitDenied()) {
|
|
1287
|
+
if (readOnlyWorkingDir) {
|
|
1288
|
+
assertReadOnlyCanInheritOuterBoundary(providerName, providerId ?? providerName.toLowerCase());
|
|
1289
|
+
}
|
|
1290
|
+
const inheritedAttestation = {
|
|
1291
|
+
provenance: "inherited_outer",
|
|
1292
|
+
evidence: {
|
|
1293
|
+
seatbeltSelfOperational: false,
|
|
1294
|
+
sandboxRuntimeEnv: process.env.SANDBOX_RUNTIME === "1",
|
|
1295
|
+
kernelSandboxActive: true,
|
|
1296
|
+
nestedSandboxReinitDenied: true,
|
|
1297
|
+
containerAttested: isContainerAttestedByEnv()
|
|
1298
|
+
}
|
|
1299
|
+
};
|
|
1300
|
+
if (!isSandboxBoundaryAccepted(inheritedAttestation, resolveEnvSandboxBoundaryPolicy())) {
|
|
1301
|
+
logSandboxTelemetry({
|
|
1302
|
+
providerName,
|
|
1303
|
+
sandboxed: false,
|
|
1304
|
+
reason: "inherited_outer_rejected_by_policy",
|
|
1305
|
+
platform,
|
|
1306
|
+
workingDir
|
|
1307
|
+
});
|
|
1308
|
+
if (requiresBoundaryForWrites) {
|
|
1309
|
+
throw new ProviderExecutionError(
|
|
1310
|
+
`[${providerName}] ${readOnlyWorkingDir ? "read-only" : "write-capable"} provider execution requires an active sandbox boundary, but the inherited outer boundary is rejected under BUILD_SANDBOX_BOUNDARY_POLICY=strict [reason=sandbox_boundary_required]`,
|
|
1311
|
+
{ retryable: false, reason: "sandbox_boundary_required", providerName }
|
|
1312
|
+
);
|
|
1313
|
+
}
|
|
1314
|
+
return { command, args, sandboxed: false };
|
|
1315
|
+
}
|
|
1316
|
+
reason = "inherited_outer";
|
|
1317
|
+
logSandboxTelemetry({
|
|
1318
|
+
providerName,
|
|
1319
|
+
sandboxed: true,
|
|
1320
|
+
reason,
|
|
1321
|
+
platform,
|
|
1322
|
+
workingDir
|
|
1323
|
+
});
|
|
1324
|
+
return {
|
|
1325
|
+
command,
|
|
1326
|
+
args,
|
|
1327
|
+
sandboxed: true,
|
|
1328
|
+
boundaryProof: "inherited_outer",
|
|
1329
|
+
policyProof: policyProofForAcceptedBoundary(
|
|
1330
|
+
inheritedAttestation,
|
|
1331
|
+
providerId ?? providerName.toLowerCase(),
|
|
1332
|
+
env
|
|
1333
|
+
)
|
|
1334
|
+
};
|
|
1335
|
+
}
|
|
1336
|
+
const customProfile = process.env.BUILD_SANDBOX_PROFILE_PATH;
|
|
1337
|
+
let profilePath;
|
|
1338
|
+
try {
|
|
1339
|
+
if (customProfile) {
|
|
1340
|
+
validateCustomSandboxProfile(customProfile);
|
|
1341
|
+
profilePath = customProfile;
|
|
1342
|
+
} else {
|
|
1343
|
+
profilePath = getOrCreateProfile(
|
|
1344
|
+
workingDir,
|
|
1345
|
+
extraWritePaths,
|
|
1346
|
+
readOnlyWorkingDir,
|
|
1347
|
+
env,
|
|
1348
|
+
providerId ?? providerName.toLowerCase(),
|
|
1349
|
+
allowGitWrites,
|
|
1350
|
+
resolveAllowAwsCredentialRead({
|
|
1351
|
+
providerId: providerId ?? providerName.toLowerCase(),
|
|
1352
|
+
env,
|
|
1353
|
+
workingDir
|
|
1354
|
+
})
|
|
1355
|
+
);
|
|
1356
|
+
registerGlobalCleanup();
|
|
1357
|
+
}
|
|
1358
|
+
} catch (error) {
|
|
1359
|
+
reason = "profile_generation_failed";
|
|
1360
|
+
logSandboxTelemetry({
|
|
1361
|
+
providerName,
|
|
1362
|
+
sandboxed: false,
|
|
1363
|
+
reason,
|
|
1364
|
+
platform,
|
|
1365
|
+
workingDir
|
|
1366
|
+
});
|
|
1367
|
+
throw error;
|
|
1368
|
+
}
|
|
1369
|
+
const policyProof = customProfile ? void 0 : "wrap_applied";
|
|
1370
|
+
logSandboxTelemetry(
|
|
1371
|
+
{
|
|
1372
|
+
providerName,
|
|
1373
|
+
sandboxed: true,
|
|
1374
|
+
platform,
|
|
1375
|
+
workingDir,
|
|
1376
|
+
customProfile: !!customProfile
|
|
1377
|
+
},
|
|
1378
|
+
{
|
|
1379
|
+
provenance: "seatbelt_self",
|
|
1380
|
+
boundaryProof: "wrap_applied",
|
|
1381
|
+
policyProof,
|
|
1382
|
+
providerId: providerId ?? providerName.toLowerCase()
|
|
1383
|
+
}
|
|
1384
|
+
);
|
|
1385
|
+
return {
|
|
1386
|
+
command: "sandbox-exec",
|
|
1387
|
+
args: ["-f", profilePath, command, ...args],
|
|
1388
|
+
sandboxed: true,
|
|
1389
|
+
boundaryProof: "wrap_applied",
|
|
1390
|
+
policyProof
|
|
1391
|
+
};
|
|
1392
|
+
}
|
|
1393
|
+
function logSandboxTelemetry(entry, durable) {
|
|
1394
|
+
recordSandboxDecision({
|
|
1395
|
+
providerName: entry.providerName,
|
|
1396
|
+
providerId: durable?.providerId,
|
|
1397
|
+
sandboxed: entry.sandboxed,
|
|
1398
|
+
reason: entry.reason,
|
|
1399
|
+
provenance: durable?.provenance,
|
|
1400
|
+
boundaryProof: durable?.boundaryProof,
|
|
1401
|
+
policyProof: durable?.policyProof,
|
|
1402
|
+
platform: entry.platform
|
|
1403
|
+
});
|
|
1404
|
+
}
|
|
1405
|
+
|
|
1406
|
+
export {
|
|
1407
|
+
hasExplicitSandboxOptOut,
|
|
1408
|
+
isSandboxEnabledForProvider,
|
|
1409
|
+
willSandboxBeActive,
|
|
1410
|
+
isSandboxEnforcementOperational,
|
|
1411
|
+
requireActiveSandboxBoundary,
|
|
1412
|
+
requireActivePolicyBoundary,
|
|
1413
|
+
shouldBypassProviderInternalSandbox,
|
|
1414
|
+
detectSandboxBoundaryAttestation,
|
|
1415
|
+
resolveSandboxBoundaryPolicy,
|
|
1416
|
+
resolveEnvSandboxBoundaryPolicy,
|
|
1417
|
+
isAttestedInheritedOuterBoundary,
|
|
1418
|
+
isSandboxBoundaryAccepted,
|
|
1419
|
+
warnSandboxEnforcementUnavailable,
|
|
1420
|
+
willReadOnlyWorkspaceBeEnforced,
|
|
1421
|
+
wrapWithSandbox
|
|
1422
|
+
};
|
|
1423
|
+
//# sourceMappingURL=chunk-B7YRSULE.js.map
|