@seanhogg/builderforce-agents 2026.10.9 → 2026.10.11
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/dist/{acp-cli-DcKpPsJa.js → acp-cli-C23mmrQt.js} +1 -1
- package/dist/{acp-cli-BxH-eUDl.js → acp-cli-D6F-D5JB.js} +1 -1
- package/dist/{agent-cXF-aL0g.js → agent-B-2r1Lr_.js} +1 -1
- package/dist/{agent-wJmvciTM.js → agent-BI9qSnSp.js} +1 -1
- package/dist/{agentbot-cli-Cub3Abbt.js → agentbot-cli-Cyrhr5jX.js} +1 -1
- package/dist/{agentbot-cli-CTRvEfBp.js → agentbot-cli-sC55m-XS.js} +1 -1
- package/dist/{agents-Cr7WO73I.js → agents-CMThT_Bj.js} +1 -1
- package/dist/agents-Chz9nfm2.js +1 -0
- package/dist/{api-key-rotation-CHBjUwUJ.js → api-key-rotation-CyCi-UqR.js} +1 -1
- package/dist/{audio-preflight-CWFuqbao.js → audio-preflight-B411b2-y.js} +1 -1
- package/dist/{audio-preflight-F2e3Y4CW.js → audio-preflight-Cs4eUjQk.js} +1 -1
- package/dist/{audit-DGnEhZYe.js → audit-B-USV03V.js} +1 -1
- package/dist/{audit-DBjjjW93.js → audit-SKNPS-K2.js} +1 -1
- package/dist/auth-choice-CChsMy-F.js +1 -0
- package/dist/{auth-choice-9gZuOvPS.js → auth-choice-CCib_yVL.js} +1 -1
- package/dist/auth-choice-DSnpkrMc.js +1 -0
- package/dist/{auth-choice-BoZFVmEa.js → auth-choice-DzBqqq7i.js} +1 -1
- package/dist/auth-choice.apply-6f3Jb_lS.js +1 -0
- package/dist/{auth-choice.apply-CcatXiNo.js → auth-choice.apply-BgOXoS8X.js} +1 -1
- package/dist/{auth-choice.apply-BHLQeym9.js → auth-choice.apply-DBuvopiF.js} +1 -1
- package/dist/auth-choice.apply-DeXnLwVS.js +1 -0
- package/dist/auth-choice.apply.transformers-CZDuBaOr.js +1 -0
- package/dist/{auth-choice.apply.transformers-CIn3fs7K.js → auth-choice.apply.transformers-Df9l_jRz.js} +2 -2
- package/dist/{auth-choice.apply.transformers-1plI0MUg.js → auth-choice.apply.transformers-DmdxpHGz.js} +2 -2
- package/dist/{auth-choice.apply.transformers-D5OrjEHo.js → auth-choice.apply.transformers-dn7l6XyJ.js} +1 -1
- package/dist/{auth-json-D1ite-pW.js → auth-json-BB-VBn5E.js} +1 -1
- package/dist/{auth-json-CN3MWw57.js → auth-json-BVyos95N.js} +1 -1
- package/dist/{auth-json-HGu227VM.js → auth-json-CoOe4tEg.js} +1 -1
- package/dist/{auth-json-DZ7E50Y1.js → auth-json-wrKixZxh.js} +1 -1
- package/dist/{auth-profiles-C1VbcUOm.js → auth-profiles-pt7Tr4HA.js} +1 -1
- package/dist/{auth-token-CyVfNEQb.js → auth-token-BE67qxLw.js} +1 -1
- package/dist/{auth-token-CoQ5ePPl.js → auth-token-BPHeoBAW.js} +1 -1
- package/dist/{banner-DY-L7_eI.js → banner-ErBINvbk.js} +1 -1
- package/dist/{browser-cli-D2O94twn.js → browser-cli-BZc64-Xx.js} +1 -1
- package/dist/{browser-cli-CoRx_4iM.js → browser-cli-CoxVKdon.js} +1 -1
- package/dist/build-info.json +3 -3
- package/dist/{builderforce-BmrsVdFw.js → builderforce-B9187Tm9.js} +4 -4
- package/dist/{builderforce-Bwyw0GJ6.js → builderforce-BLqHwgeu.js} +4 -4
- package/dist/builderforce-api-DKgXl8BH.js +1 -0
- package/dist/builderforce-api-DcPAGsla.js +1 -0
- package/dist/builderforce-onboarding-CaPJZSvw.js +24 -0
- package/dist/builderforce-onboarding-RXFb0gct.js +24 -0
- package/dist/{builderforcellm-syscheck-CprBhARf.js → builderforcellm-syscheck-9ksvqHYX.js} +1 -1
- package/dist/{builderforcellm-syscheck-DrFJ638L.js → builderforcellm-syscheck-F5JMAr3p.js} +1 -1
- package/dist/{call-DxPWzV-k.js → call-BnAs_SER.js} +1 -1
- package/dist/{call-DFjBq0H2.js → call-D1Opj5ev.js} +1 -1
- package/dist/{call-DmAU4cRX.js → call-Du2LiaX6.js} +1 -1
- package/dist/{call-BbRf8gFM.js → call-T8ciwMTA.js} +1 -1
- package/dist/{channel-options-d4EwVQD0.js → channel-options-B7sRMp2v.js} +1 -1
- package/dist/{channel-options-CDixz6dT.js → channel-options-rhDBCtlp.js} +1 -1
- package/dist/{channel-web-DJa8JC9W.js → channel-web-CcCqUQrJ.js} +1 -1
- package/dist/{channels-cli-BgKy0MbE.js → channels-cli-BjnLW14T.js} +1 -1
- package/dist/{channels-cli-nNW0ezPM.js → channels-cli-DVWUBsmc.js} +1 -1
- package/dist/{chrome-BnEbJV3D.js → chrome-CFmcixaE.js} +1 -1
- package/dist/{chrome-a3X9_-nf.js → chrome-DXt86tmV.js} +1 -1
- package/dist/cli/daemon-cli.js +1 -1
- package/dist/{cli-DkWt7p2x.js → cli-BUqtALJK.js} +1 -1
- package/dist/{cli-C5MbcECQ.js → cli-K4reS6IS.js} +1 -1
- package/dist/{coding-tools.policy-NEPm7Mz1.js → coding-tools.policy-D9Ba8eDh.js} +1 -1
- package/dist/{coding-tools.policy-6qh9acJy.js → coding-tools.policy-ZhOdlcEI.js} +1 -1
- package/dist/{command-registry-COUcUWby.js → command-registry-B7uAoROP.js} +1 -1
- package/dist/{command-registry-4_K-lfW5.js → command-registry-CW16Mk2Y.js} +1 -1
- package/dist/{completion-cli-DlvHqL86.js → completion-cli-ZvXrCQqk.js} +1 -1
- package/dist/{completion-cli-B2qcVd6q.js → completion-cli-gyvx5ZXu.js} +1 -1
- package/dist/{completion-cli-DpFvU4Qn.js → completion-cli-n8UsdT91.js} +1 -1
- package/dist/{completion-cli-SdcQ-kQj.js → completion-cli-sKReGv3d.js} +1 -1
- package/dist/{config-_1Ca6jGb.js → config-BgV_FYSq.js} +1 -1
- package/dist/{config-toczWD3q.js → config-BpChMIJ6.js} +1 -1
- package/dist/{config-BTWlKwtB.js → config-D01EgOky.js} +1 -1
- package/dist/{config-27_FNba3.js → config-Dsnbi-a3.js} +1 -1
- package/dist/{config-cli-DeiQz5sY.js → config-cli-Bpo74mE5.js} +1 -1
- package/dist/{config-cli-CfczShaZ.js → config-cli-CF31O_5s.js} +1 -1
- package/dist/{config-guard-CD-Wq8kk.js → config-guard-BRUOk5YL.js} +1 -1
- package/dist/{config-guard-ClVl2FvD.js → config-guard-BUpQiSTW.js} +1 -1
- package/dist/{config-guard-B4in8l8I.js → config-guard-USCN-dq0.js} +1 -1
- package/dist/{config-validation-jpeXzoU3.js → config-validation-BGpSeNbh.js} +1 -1
- package/dist/{config-validation-C6u-z9bJ.js → config-validation-CdBJ-tZq.js} +1 -1
- package/dist/{configure-3W9C5LiT.js → configure-CWr61Ph2.js} +1 -1
- package/dist/configure-DhazB2qh.js +1 -0
- package/dist/{configure-BtXQW7ue.js → configure-DlcO1tWx.js} +1 -1
- package/dist/configure-MXheujvX.js +1 -0
- package/dist/{control-service-CJuuqNOE.js → control-service-2PkCt256.js} +1 -1
- package/dist/{control-service-qKfWP7VD.js → control-service-CcsbseZS.js} +1 -1
- package/dist/{control-service-izGyCWQs.js → control-service-qK1oboMo.js} +1 -1
- package/dist/{control-service-BbsswoMy.js → control-service-y3GYvIBg.js} +1 -1
- package/dist/{cron-cli-BrOM4s6N.js → cron-cli-BYu_lA8i.js} +1 -1
- package/dist/{cron-cli-CwtTX6pg.js → cron-cli-D_Og20iB.js} +1 -1
- package/dist/{daemon-cli-DyVsMf8p.js → daemon-cli-BNzthScZ.js} +1 -1
- package/dist/{daemon-cli-DlwOVDbt.js → daemon-cli-Bh3p0hui.js} +1 -1
- package/dist/{daemon-cli-Br0wu9xQ.js → daemon-cli-DxxKiKVN.js} +1 -1
- package/dist/{daemon-cli-DmicpZED.js → daemon-cli-emNxLkIw.js} +1 -1
- package/dist/{daemon-runtime-CtOr1ncS.js → daemon-runtime-9XitJmIL.js} +1 -1
- package/dist/{daemon-runtime-B4UjqdyJ.js → daemon-runtime-Dx800VUt.js} +1 -1
- package/dist/{deliver-BpLm3ktn.js → deliver--6OBF3LL.js} +1 -1
- package/dist/{deliver-9o_SE4ZK.js → deliver-ADpnRGRf.js} +1 -1
- package/dist/{deliver-D2VAVelb.js → deliver-BM6-damm.js} +1 -1
- package/dist/{deliver-BuZu68tp.js → deliver-CsG0cHbZ.js} +1 -1
- package/dist/{deps-CkJiJ6wc.js → deps-Dg_9rfXK.js} +1 -1
- package/dist/{devices-cli-BfXeDnbx.js → devices-cli-B8DXzcRP.js} +1 -1
- package/dist/{devices-cli-B9G6YOsS.js → devices-cli-BZkdWSx-.js} +1 -1
- package/dist/{directory-cli-BRCaiGOn.js → directory-cli-B78pAVI_.js} +1 -1
- package/dist/{directory-cli-D5ciZ5fY.js → directory-cli-CSaRkkL8.js} +1 -1
- package/dist/{dm-policy-shared-CRZpjRv0.js → dm-policy-shared-B9lW-AsK.js} +1 -1
- package/dist/{dm-policy-shared-Dhw9_6mi.js → dm-policy-shared-DYZ_T-az.js} +1 -1
- package/dist/{dns-cli-CgZ7oMcT.js → dns-cli-CLPGOFA1.js} +1 -1
- package/dist/{dns-cli-C4f4Tyij.js → dns-cli-dr5dHzfI.js} +1 -1
- package/dist/{doctor-completion-BSotFS6p.js → doctor-completion-94zme499.js} +1 -1
- package/dist/{doctor-completion-DVxbs-74.js → doctor-completion-CbF34DIH.js} +1 -1
- package/dist/{embedded-helpers-CEsr3aQ0.js → embedded-helpers-C9jpiwlw.js} +1 -1
- package/dist/{embedded-helpers-DK8_apW0.js → embedded-helpers-DdU30lmt.js} +1 -1
- package/dist/entry.js +1 -1
- package/dist/{exec-approvals-cli-YuOu7mVg.js → exec-approvals-cli-CS_uabo7.js} +1 -1
- package/dist/{exec-approvals-cli-BPFi82B0.js → exec-approvals-cli-ktB7M7WE.js} +1 -1
- package/dist/{gateway-cli-D2Bg1Um6.js → gateway-cli-CKcoLVMA.js} +5 -5
- package/dist/{gateway-cli-DFEo8C0z.js → gateway-cli-CuXBDBWe.js} +5 -5
- package/dist/{gateway-rpc-BXR_lVIx.js → gateway-rpc-B02y0PnE.js} +1 -1
- package/dist/{gateway-rpc-ByUcnQ7W.js → gateway-rpc-ff1RVb0_.js} +1 -1
- package/dist/{gemini-auth-CkD5jCPh.js → gemini-auth-DDR12zst.js} +1 -1
- package/dist/health-D0DZmCmh.js +1 -0
- package/dist/{health-yS3NRKvY.js → health-FO8MG5Ur.js} +1 -1
- package/dist/{health-DVo8a9yg.js → health-zrsgFZmR.js} +1 -1
- package/dist/{hooks-cli-B0lVee-j.js → hooks-cli-5Y4hnSX9.js} +1 -1
- package/dist/{hooks-cli-DsVmrQAG.js → hooks-cli-DpHZzRo2.js} +1 -1
- package/dist/index.js +2 -2
- package/dist/{ink-session-BitZ1wcY.js → ink-session-Dt9Q4iH-.js} +2 -2
- package/dist/{ink-session-CyAqXDla.js → ink-session-N8wCBzwk.js} +2 -2
- package/dist/{installs-CWd54ARy.js → installs-B_t2YXgq.js} +1 -1
- package/dist/{installs-C9A8QFiF.js → installs-DFiF4lGy.js} +1 -1
- package/dist/{io-3R_ZyUxB.js → io-BLBq4T2o.js} +1 -1
- package/dist/{io-DSIGyPrT.js → io-CXN4uLS2.js} +1 -1
- package/dist/{io-6jLoKffb.js → io-Ckd4NlvH.js} +1 -1
- package/dist/{io-CohJffHG.js → io-D9hC2aG0.js} +1 -1
- package/dist/{lifecycle-core-BpMvDXy1.js → lifecycle-core-D9Dg5Qps.js} +1 -1
- package/dist/{lifecycle-core-Dwb4gHjZ.js → lifecycle-core-uxjxTzFv.js} +1 -1
- package/dist/login-B3sDAgHb.js +1 -0
- package/dist/{login-C_ZdMOvv.js → login-CwwuaXtb.js} +1 -1
- package/dist/{login-DtDUyFO3.js → login-D1bVUPlv.js} +1 -1
- package/dist/{login-CEnjUo5c.js → login-GLDax56V.js} +1 -1
- package/dist/{login-qr-B9lyIZVD.js → login-qr-CbiUcBLy.js} +1 -1
- package/dist/{login-qr-BCBsxwhT.js → login-qr-Cp0YqK4e.js} +1 -1
- package/dist/{logs-cli-CdM5W3HE.js → logs-cli-Cy11HfSG.js} +1 -1
- package/dist/{logs-cli-jh5Xn3TD.js → logs-cli-nD36c-Y1.js} +1 -1
- package/dist/{manager-CRba8roB.js → manager-BeohB4-8.js} +1 -1
- package/dist/{manager-B3IJ_IKf.js → manager-CTTXDBt3.js} +1 -1
- package/dist/{manager-TGVy_fAb.js → manager-CoQMlcrf.js} +1 -1
- package/dist/{manager-DwywI_5-.js → manager-DSz61dXv.js} +1 -1
- package/dist/{memory-cli-BlayFTAM.js → memory-cli-BpAiRntI.js} +1 -1
- package/dist/{memory-cli-DRz4wtHk.js → memory-cli-CbkWGjRn.js} +1 -1
- package/dist/{memory-cli-PdyTQ84w.js → memory-cli-CrBMLM2P.js} +1 -1
- package/dist/{memory-cli-ivAs7q7v.js → memory-cli-CveeVOWH.js} +1 -1
- package/dist/{model-catalog-CQOdhMUY.js → model-catalog-B29yeBYS.js} +1 -1
- package/dist/{model-catalog-CiiFJX77.js → model-catalog-BeBXvbFm.js} +1 -1
- package/dist/model-catalog-CMKHKuBL.js +1 -0
- package/dist/{model-catalog-C6UrZ0uG.js → model-catalog-DjNiebr7.js} +1 -1
- package/dist/{model-discovery-C9Xm95uL.js → model-discovery-D0i1JpiL.js} +1 -1
- package/dist/{model-picker-swoSwauV.js → model-picker-CGDNPRPc.js} +1 -1
- package/dist/model-picker-CGEF8yhc.js +1 -0
- package/dist/model-picker-DeUNOC78.js +1 -0
- package/dist/{model-picker-BUePD7Zg.js → model-picker-EIhpfOZa.js} +1 -1
- package/dist/{model-selection-9bRFKBI_.js → model-selection-DG9J_VTz.js} +1 -1
- package/dist/{models-BNivsd2o.js → models-BjIzVQYX.js} +2 -2
- package/dist/{models-DQeSIY6M.js → models-JoqOgEF5.js} +1 -1
- package/dist/{models-cli-KokGgWeP.js → models-cli-B2zbchgs.js} +1 -1
- package/dist/{models-cli-BcNxU4P_.js → models-cli-CkFdc8NN.js} +2 -2
- package/dist/{node-cli-DIMh3X2F.js → node-cli-CXnuxiBq.js} +1 -1
- package/dist/{node-cli-EmTU-Gh0.js → node-cli-oVyjVnb7.js} +1 -1
- package/dist/{nodes-cli-BX8TznFK.js → nodes-cli-BBVotxNt.js} +1 -1
- package/dist/{nodes-cli-DyHovdAc.js → nodes-cli-DVMBSUhK.js} +1 -1
- package/dist/{onboard-DfMVh1bM.js → onboard-BItclJp0.js} +1 -1
- package/dist/{onboard-BVmZ4jMw.js → onboard-CqvHIvKj.js} +1 -1
- package/dist/{onboard-auth.credentials-yagR-VMG.js → onboard-auth.credentials-DneFSdYg.js} +1 -1
- package/dist/{onboard-auth.credentials-BuT-etnE.js → onboard-auth.credentials-DpitLlzw.js} +1 -1
- package/dist/onboard-channels-B91m5S3w.js +1 -0
- package/dist/onboard-channels-BOoPtYbF.js +1 -0
- package/dist/{onboard-channels-B6QDFkkK.js → onboard-channels-Dn0u5C-C.js} +1 -1
- package/dist/{onboard-channels-C8FCFn29.js → onboard-channels-vhtccaIV.js} +1 -1
- package/dist/onboard-custom-BN0uzSq_.js +1 -0
- package/dist/{onboard-custom-D1nd8Hlu.js → onboard-custom-BYIza2e7.js} +1 -1
- package/dist/onboard-custom-CCFthqto.js +1 -0
- package/dist/{onboard-custom-C_BI0ZXn.js → onboard-custom-Ckf0xKXY.js} +1 -1
- package/dist/{onboard-helpers-CGlLpagb.js → onboard-helpers-B8I5AVyb.js} +1 -1
- package/dist/{onboard-helpers-CckrS8_K.js → onboard-helpers-Ce_c4Raj.js} +1 -1
- package/dist/{onboard-helpers-Cf5dNq7-.js → onboard-helpers-CiHzTaFX.js} +1 -1
- package/dist/{onboard-helpers-BvIZ4-R5.js → onboard-helpers-DC-nMl-V.js} +1 -1
- package/dist/{onboard-interactive-DYJttZ2w.js → onboard-interactive-Cl2K3EYn.js} +1 -1
- package/dist/{onboard-interactive-zgjmwJz-.js → onboard-interactive-JNux9zfA.js} +1 -1
- package/dist/{onboard-interactive-B3-KBZbZ.js → onboard-interactive-J_ObFzeW.js} +1 -1
- package/dist/{onboard-interactive-Dc_7URYb.js → onboard-interactive-OUNsvlh0.js} +1 -1
- package/dist/{onboard-remote-D5lR2lVm.js → onboard-remote-0-q7MG9t.js} +1 -1
- package/dist/{onboard-remote-BmSyHww1.js → onboard-remote-CgAAEZpq.js} +1 -1
- package/dist/{onboard-remote-CzzQMZ3X.js → onboard-remote-DKXHDdBD.js} +1 -1
- package/dist/{onboard-remote-DcuX8b2g.js → onboard-remote-cB8j9RG-.js} +1 -1
- package/dist/{onboard-skills-ILHIeg1R.js → onboard-skills-47upVdA2.js} +1 -1
- package/dist/{onboard-skills-BPlNN_-T.js → onboard-skills-9Um4TL2x.js} +1 -1
- package/dist/{onboard-skills-DIhjDMom.js → onboard-skills-DhCmvhJY.js} +1 -1
- package/dist/{onboard-skills-CI1OtWsE.js → onboard-skills-mI2kfvdT.js} +1 -1
- package/dist/{onboarding-D4-HDbmU.js → onboarding-BSENgR9C.js} +5 -5
- package/dist/{onboarding-CP9rrz8y.js → onboarding-CIaZLNc1.js} +5 -5
- package/dist/{onboarding.finalize-C2kZi7F0.js → onboarding.finalize-BwOpvoPE.js} +1 -1
- package/dist/{onboarding.finalize-BfWXPgX7.js → onboarding.finalize-yMK-g7Uy.js} +1 -1
- package/dist/{onboarding.gateway-config-Cd7_bXVs.js → onboarding.gateway-config-Kn1O-QFl.js} +1 -1
- package/dist/{onboarding.gateway-config-Bd8HJkso.js → onboarding.gateway-config-huOjFf8D.js} +1 -1
- package/dist/{openai-model-default-Cp3nf21W.js → openai-model-default-CH2-2Hvk.js} +1 -1
- package/dist/{openai-model-default-BMRrqTmH.js → openai-model-default-pfoEzWYJ.js} +1 -1
- package/dist/{outbound-BRInCJD9.js → outbound-BdeHcMAo.js} +1 -1
- package/dist/{outbound-CAtBpFoD.js → outbound-BylJYD7n.js} +1 -1
- package/dist/{outbound-OI-t5zZ0.js → outbound-CAirtWr1.js} +1 -1
- package/dist/{outbound-CnIvOJlU.js → outbound-VNcvF2MG.js} +1 -1
- package/dist/{outbound-send-deps-m6DqOma_.js → outbound-send-deps-B3Lg-uqF.js} +1 -1
- package/dist/{pairing-cli-CEr0yEsc.js → pairing-cli-5RtPvz2i.js} +1 -1
- package/dist/{pairing-cli-Dxfoni-F.js → pairing-cli-C_Mj6Dy4.js} +1 -1
- package/dist/{pairing-labels-3j_iRYOO.js → pairing-labels-BJPrScRl.js} +1 -1
- package/dist/{pairing-labels-BW5jQZlr.js → pairing-labels-oA-nKTaW.js} +1 -1
- package/dist/{pairing-store-QDb6lhIU.js → pairing-store-YRy7EBgI.js} +1 -1
- package/dist/{pairing-store-CbvMJhD3.js → pairing-store-ti3FEkmr.js} +1 -1
- package/dist/{plugin-auto-enable-BV9K9Vhr.js → plugin-auto-enable-Cupr4wbt.js} +1 -1
- package/dist/{plugin-auto-enable-DDry2fA6.js → plugin-auto-enable-D8gKiE3F.js} +1 -1
- package/dist/plugin-registry-BEfyc2f_.js +1 -0
- package/dist/{plugin-registry-C-_GA65s.js → plugin-registry-BoPaef5I.js} +1 -1
- package/dist/{plugin-registry-SAdxNUwm.js → plugin-registry-CxnuHO_n.js} +1 -1
- package/dist/plugin-registry-D0tIqo8L.js +1 -0
- package/dist/plugin-sdk/{accounts-Cy3WCbWg.js → accounts-BwreSNAR.js} +1 -1
- package/dist/plugin-sdk/{active-listener-DVWVNlT9.js → active-listener-DpQ7aGYd.js} +1 -1
- package/dist/plugin-sdk/agent-runtime/src/infra/workflow-telemetry.d.ts +12 -1
- package/dist/plugin-sdk/{agent-scope-DgKN27hJ.js → agent-scope-BQByW0cD.js} +1 -1
- package/dist/plugin-sdk/{api-key-rotation-ftXf7mBZ.js → api-key-rotation-7YdImWrh.js} +1 -1
- package/dist/plugin-sdk/{audio-preflight-CfTmmeS-.js → audio-preflight-EbkaATDO.js} +1 -1
- package/dist/plugin-sdk/{auth-json-BrNBg87n.js → auth-json-DK6qod1_.js} +1 -1
- package/dist/plugin-sdk/{bindings-CH-YLOLC.js → bindings-CDEzl4kl.js} +1 -1
- package/dist/plugin-sdk/{channel-web-B6rg0Rbf.js → channel-web-D2KuONp0.js} +1 -1
- package/dist/plugin-sdk/{chrome-CuXP-hes.js → chrome-SOXFIkUM.js} +1 -1
- package/dist/plugin-sdk/{chunk-C94IAOuf.js → chunk-cW0POl22.js} +1 -1
- package/dist/plugin-sdk/{command-format-B3XMq_73.js → command-format-CAX9XFjI.js} +1 -1
- package/dist/plugin-sdk/{common-n0l_XN-S.js → common-BxEWhN2X.js} +1 -1
- package/dist/plugin-sdk/{config-DsXZsCkJ.js → config-v1EU9Ll8.js} +2 -2
- package/dist/plugin-sdk/{fetch-B-GxSYRO.js → fetch-DH0Y8iyO.js} +1 -1
- package/dist/plugin-sdk/index.js +1 -1
- package/dist/plugin-sdk/{login-_my8QwPP.js → login-d1zBgykF.js} +1 -1
- package/dist/plugin-sdk/{login-qr-BaePtXuG.js → login-qr-B6exvQnN.js} +1 -1
- package/dist/plugin-sdk/{manager-BsC-4ymy.js → manager-BH_bmGds.js} +1 -1
- package/dist/plugin-sdk/{markdown-tables-BUfhHgfs.js → markdown-tables-Epim9b-0.js} +1 -1
- package/dist/plugin-sdk/{message-channel-CuZ2xOAM.js → message-channel-sBPQc_-T.js} +1 -1
- package/dist/plugin-sdk/{model-catalog-yuiXVcmw.js → model-catalog-cXsza5GU.js} +1 -1
- package/dist/plugin-sdk/{model-selection-BtgvnqB5.js → model-selection-K82MAGlL.js} +1 -1
- package/dist/plugin-sdk/{outbound-D_attiyO.js → outbound-Chn_H1O7.js} +1 -1
- package/dist/plugin-sdk/{plugins-BdkC9v5E.js → plugins-CaUOZBVb.js} +1 -1
- package/dist/plugin-sdk/{pw-ai-A7Rathx6.js → pw-ai-BIiJF7ZD.js} +1 -1
- package/dist/plugin-sdk/{qmd-manager-Dxn0jCpE.js → qmd-manager-BRe5fGZw.js} +1 -1
- package/dist/plugin-sdk/{registry-CZHRcH-q.js → registry-DJq2Cvo9.js} +1 -1
- package/dist/plugin-sdk/{render-CuA_WRX5.js → render-BUCRXPIk.js} +1 -1
- package/dist/plugin-sdk/{replies-DmLfO-pg.js → replies-Cz5OD3qN.js} +1 -1
- package/dist/plugin-sdk/{reply-3-ne-N_7.js → reply-D5Uk7pUv.js} +9 -9
- package/dist/plugin-sdk/{reply-prefix-w7kAvH11.js → reply-prefix-CCymsmsP.js} +1 -1
- package/dist/plugin-sdk/{resolve-route-0sbvl4ZN.js → resolve-route-DN1J7Wyc.js} +1 -1
- package/dist/plugin-sdk/{runner-4UfrAQnx.js → runner-CYkuO7Fh.js} +4 -4
- package/dist/plugin-sdk/{session-BB-yfDWx.js → session-D5jHDo78.js} +1 -1
- package/dist/plugin-sdk/{sqlite-JjFgDV-H.js → sqlite-BlMLqMl8.js} +1 -1
- package/dist/plugin-sdk/{subsystem-D0Ril4rt.js → subsystem-COTa5Ly_.js} +1 -1
- package/dist/plugin-sdk/{tool-images-WRTP95FT.js → tool-images-DSpchb4x.js} +1 -1
- package/dist/plugin-sdk/{tool-loop-detection-sC_rhJfb.js → tool-loop-detection-BP6u-mbh.js} +1 -1
- package/dist/plugin-sdk/web-BbganhKi.js +1 -0
- package/dist/plugin-sdk/{whatsapp-actions-ThxQ5niy.js → whatsapp-actions-CZUqxmP1.js} +1 -1
- package/dist/{plugins-BIG8NDB9.js → plugins-Cx29kkDj.js} +1 -1
- package/dist/{plugins-iAq-Gr8l.js → plugins-DJqou2hi.js} +1 -1
- package/dist/{plugins-cli-CpaVUv_r.js → plugins-cli-Bu-A8aGy.js} +1 -1
- package/dist/{plugins-cli-CPkSgvdL.js → plugins-cli-CGFsQDVW.js} +1 -1
- package/dist/{program-context-BCwL3wlM.js → program-context-ClBa4lUj.js} +1 -1
- package/dist/{program-2w7Ue902.js → program-vVCzU0cH.js} +2 -2
- package/dist/{prompt-select-styled-hB_nLOn1.js → prompt-select-styled-BJPGccTJ.js} +1 -1
- package/dist/{prompt-select-styled-Dd5swW2b.js → prompt-select-styled-BK74z6FF.js} +1 -1
- package/dist/{provider-auth-helpers-BpTnp2Yr.js → provider-auth-helpers-B84m5VMc.js} +1 -1
- package/dist/{provider-auth-helpers-CJTG_tVx.js → provider-auth-helpers-hNwpK_hl.js} +1 -1
- package/dist/{provider-dispatcher-TWwBT2aH.js → provider-dispatcher-BjR5DE3O.js} +1 -1
- package/dist/provider-dispatcher-DgOeVjcL.js +1 -0
- package/dist/{provider-usage-BdrU4cIE.js → provider-usage-B-wPVN_j.js} +1 -1
- package/dist/{provider-usage-Bn4ZrnU7.js → provider-usage-B8lFHp0K.js} +1 -1
- package/dist/{push-apns-C4sJnHbO.js → push-apns-BTPPvY81.js} +1 -1
- package/dist/{push-apns-CiD3rrVv.js → push-apns-CscYUS0D.js} +1 -1
- package/dist/{pw-ai-DSEj1QrV.js → pw-ai-CLS_VZ8p.js} +1 -1
- package/dist/{pw-ai-dNZY-qBs.js → pw-ai-D5og_rIf.js} +1 -1
- package/dist/{qr-cli-qr-SFLZW.js → qr-cli-CAquM1Zk.js} +1 -1
- package/dist/{qr-cli-B45dCV0o.js → qr-cli-GsR8n1cm.js} +1 -1
- package/dist/{qr-cli-CMlAIzrD.js → qr-cli-kAKgaL-T.js} +1 -1
- package/dist/{qr-cli-CySNSEFj.js → qr-cli-uyxNf-cQ.js} +1 -1
- package/dist/{register.agent-BA6LIJSb.js → register.agent-BwTCfyeJ.js} +1 -1
- package/dist/{register.agent-D2uCH8jZ.js → register.agent-Dhdo3_7k.js} +1 -1
- package/dist/register.configure-B0m0G3ot.js +1 -0
- package/dist/register.configure-D3cbjmTz.js +1 -0
- package/dist/{register.maintenance-BELfCO_C.js → register.maintenance-C6ocMld2.js} +1 -1
- package/dist/{register.maintenance-DukWFS_D.js → register.maintenance-CbE2zSyc.js} +1 -1
- package/dist/{register.message-DiZRRAE5.js → register.message-Jn4u533_.js} +1 -1
- package/dist/{register.message-8iGDhO8h.js → register.message-Tu1hlM0m.js} +1 -1
- package/dist/{register.onboard-B9DMNfHE.js → register.onboard-B34211N6.js} +1 -1
- package/dist/{register.onboard-Dt7rzAq-.js → register.onboard-S1d2WAE4.js} +1 -1
- package/dist/{register.setup-CSF-2ImP.js → register.setup-CJPyAwCQ.js} +1 -1
- package/dist/{register.setup-BRRVPrx7.js → register.setup-Sg8f3nsH.js} +1 -1
- package/dist/{register.status-health-sessions-D6wdwPwV.js → register.status-health-sessions-BlgVxoZ4.js} +1 -1
- package/dist/{register.status-health-sessions-ZSufYw5j.js → register.status-health-sessions-DwADQJ74.js} +1 -1
- package/dist/{register.subclis-4eDV9jKH.js → register.subclis-C9V_M-Lk.js} +1 -1
- package/dist/{register.subclis-Cr9DoYcv.js → register.subclis-pWn9XObB.js} +1 -1
- package/dist/{replies-DbkT_5BV.js → replies-BOGMDhSN.js} +1 -1
- package/dist/{replies-CzV-RFUG.js → replies-BXbV02ik.js} +1 -1
- package/dist/{replies-DIBQzxGp.js → replies-CUv671JF.js} +1 -1
- package/dist/{replies-Bd2RPZwQ.js → replies-DokbEfJD.js} +1 -1
- package/dist/{reply-Cd3vVnD7.js → reply-GY1C8tcv.js} +10 -10
- package/dist/{routes-BzfLvF8W.js → routes-DZntyPY6.js} +1 -1
- package/dist/{routes-lclJHOYY.js → routes-_iZdG1Fo.js} +1 -1
- package/dist/{rpc-BLqXRn5R.js → rpc-CbUnwStf.js} +1 -1
- package/dist/{rpc-DcQNGQlj.js → rpc-Cwm4gchc.js} +1 -1
- package/dist/{run-main-DLcDEJgv.js → run-main-DQMbgbcF.js} +1 -1
- package/dist/{runner-DwWmciCt.js → runner-Cu9NJouV.js} +1 -1
- package/dist/{runner-SxCr9kXD.js → runner-eTTUbLAK.js} +1 -1
- package/dist/{sandbox-BZibn6PX.js → sandbox-C4AKi2EX.js} +1 -1
- package/dist/{sandbox-z9t_PRf9.js → sandbox-DvKMuAXL.js} +1 -1
- package/dist/{sandbox-cli-BtGs0dBR.js → sandbox-cli-C0LhzYq_.js} +1 -1
- package/dist/{sandbox-cli-B8FpLgyY.js → sandbox-cli-De0iaoHB.js} +1 -1
- package/dist/{security-cli-D8Q8I7fn.js → security-cli-BvEfiO8m.js} +1 -1
- package/dist/{security-cli-IIMR7Pb4.js → security-cli-BzsQ0XQh.js} +1 -1
- package/dist/{send-DnMzjS7L.js → send-2dRKMWtl.js} +1 -1
- package/dist/{send-DerUBvXW.js → send-Aw8wK3vK.js} +1 -1
- package/dist/{send-BvroeIQ6.js → send-B7H8Ae5j.js} +1 -1
- package/dist/{send-4d9NswaD.js → send-BP5osGBo.js} +1 -1
- package/dist/{send-BU_-BGmf.js → send-BVal50Bi.js} +1 -1
- package/dist/{send-CxG2suVM.js → send-Bbo7TXLx.js} +1 -1
- package/dist/{send-CBBziNqM.js → send-BxoVLIy1.js} +1 -1
- package/dist/{send-dDpSBSBo.js → send-COKUbcqs.js} +1 -1
- package/dist/{send--12DIueA.js → send-CTw3PqN4.js} +1 -1
- package/dist/{send-UFtylOiq.js → send-CYGOPcKq.js} +1 -1
- package/dist/{send-DyF1Xy9K.js → send-ChGpVO3O.js} +1 -1
- package/dist/{send-Q-uTkSFE.js → send-Cqea2UFo.js} +1 -1
- package/dist/{send-j15662lv.js → send-CrFWgJKx.js} +1 -1
- package/dist/{send-gDb60Hk-.js → send-CwK8QBR3.js} +1 -1
- package/dist/{send-CceNWtYE.js → send-DqR7Rxzm.js} +1 -1
- package/dist/{send-CJHXQvVl.js → send-DxwfUIN-.js} +1 -1
- package/dist/{send-ByCVQQVz.js → send-KgN1P41U.js} +1 -1
- package/dist/{send-B1rJLLpr.js → send-bNp87SIq.js} +1 -1
- package/dist/{send-B_1BtyfA.js → send-kkm_zrHQ.js} +1 -1
- package/dist/{send-BJDzwYJN.js → send-l3ge4wkC.js} +1 -1
- package/dist/{server-context-DJZT7Upf.js → server-context-CQ2v4BAx.js} +1 -1
- package/dist/{server-context-owOmmyUM.js → server-context-CttALzrW.js} +1 -1
- package/dist/{server-node-events-54d8Rmjl.js → server-node-events-CIMO6Vae.js} +1 -1
- package/dist/{server-node-events-CSFVqgxX.js → server-node-events-iCF2ngcN.js} +1 -1
- package/dist/{session-BzQdcCqN.js → session-BJHsjD3z.js} +1 -1
- package/dist/{session-4FpEJvkE.js → session-C_b1ttHJ.js} +1 -1
- package/dist/{session-dirs-OxQuIvJW.js → session-dirs-Bvbgw0GC.js} +1 -1
- package/dist/{session-dirs-D_ARkyw0.js → session-dirs-DHaoq7zc.js} +1 -1
- package/dist/{session-utils-GMvum00v.js → session-utils-Dxou8SbO.js} +1 -1
- package/dist/{sessions-Bl1wwotX.js → sessions-BA8Se_bT.js} +1 -1
- package/dist/{sessions-CdanN_ZI.js → sessions-BuZVmOWt.js} +1 -1
- package/dist/{sessions-B5dwRhUC.js → sessions-DvbW0FNJ.js} +1 -1
- package/dist/{sessions-B1t7qeEn.js → sessions-DvqsIg0M.js} +1 -1
- package/dist/{shared-xj-xaKFi.js → shared-BBOiNdjf.js} +1 -1
- package/dist/{shared-BPN3qd7G.js → shared-C2orjbTD.js} +1 -1
- package/dist/{skill-scanner-U3AJgjqc.js → skill-scanner-BEvov9QH.js} +1 -1
- package/dist/{skill-scanner-DEmbPsRh.js → skill-scanner-OTLeRZ_p.js} +1 -1
- package/dist/{skills-cli-CIdnXa3B.js → skills-cli-C1BOgB3y.js} +1 -1
- package/dist/{skills-cli-BXbGr7vl.js → skills-cli-CFT2Aq5R.js} +1 -1
- package/dist/{skills-install-Btw_GHbI.js → skills-install-LlKntDHa.js} +1 -1
- package/dist/{skills-install-DMHQRpIl.js → skills-install-tx5Mahav.js} +1 -1
- package/dist/{status-DXaDS_0w.js → status-Bh8V7kjv.js} +1 -1
- package/dist/{status-BxeKmkVr.js → status-BtBHmhQh.js} +1 -1
- package/dist/{status-BkcmeZg6.js → status-CpwD4y9B.js} +1 -1
- package/dist/status-CqaTmyih.js +1 -0
- package/dist/{status-DouJcFzf.js → status-yXz8PUbL.js} +1 -1
- package/dist/{status.update-C9iy31xr.js → status.update-CdgsLBPg.js} +1 -1
- package/dist/{status.update-KYyRSDZY.js → status.update-hzMro-BT.js} +1 -1
- package/dist/{subagent-registry-Dr20nzwk.js → subagent-registry-CaRUNwCj.js} +1 -1
- package/dist/{subagent-registry-CyGxu3kP.js → subagent-registry-DDEN4oJi.js} +10 -10
- package/dist/{subagent-registry-BiXkIDeh.js → subagent-registry-DYYfeIc3.js} +1 -1
- package/dist/{system-cli-b4YgXPHv.js → system-cli-4aii1JYf.js} +1 -1
- package/dist/{system-cli-C7YzJeP4.js → system-cli-CfkDD3FV.js} +1 -1
- package/dist/{tui-DylWbrDx.js → tui-DnVRxfI8.js} +2 -2
- package/dist/{tui-BwWMByVp.js → tui-JfWoLGIV.js} +2 -2
- package/dist/{tui-cli-C_TTgabr.js → tui-cli-CGjg2Eb5.js} +1 -1
- package/dist/{tui-cli-Bh1V8-w9.js → tui-cli-cd7Efw5u.js} +1 -1
- package/dist/{tui-setup-check-DJZCJokQ.js → tui-setup-check-BEHm9wwo.js} +1 -1
- package/dist/{tui-setup-check-BABAyl-e.js → tui-setup-check-DK8vdhLI.js} +1 -1
- package/dist/{tui-stream-assembler-ign_cPkv.js → tui-stream-assembler-8ud9oyMK.js} +1 -1
- package/dist/{tui-stream-assembler-q9GANTDr.js → tui-stream-assembler-Br15rhRH.js} +1 -1
- package/dist/{update-BUzcmoDf.js → update-B5yKFeGO.js} +1 -1
- package/dist/{update-D6U-V8Au.js → update-DodoQDCk.js} +1 -1
- package/dist/{update-cli-DUrUIrYQ.js → update-cli-CfJJcSUS.js} +1 -1
- package/dist/{update-cli-CA3LuuJ7.js → update-cli-x8Ocbf-0.js} +1 -1
- package/dist/{usage-cli-CfEg1_NZ.js → usage-cli-CN7L1YRG.js} +1 -1
- package/dist/{usage-cli-CpbYMXxS.js → usage-cli-CQmokGkG.js} +1 -1
- package/dist/{web-D-NSyF6b.js → web-BXLk9UT2.js} +1 -1
- package/dist/web-Btgs8oWv.js +1 -0
- package/dist/{webhooks-cli-B_f61rq7.js → webhooks-cli-DIo8p3lk.js} +1 -1
- package/dist/{webhooks-cli-Bi0t3w6P.js → webhooks-cli-DhxEtiFt.js} +1 -1
- package/dist/{whatsapp-actions-JbF2MrTV.js → whatsapp-actions-B7r9AyZN.js} +1 -1
- package/dist/{whatsapp-actions-BkCMhD9X.js → whatsapp-actions-DX2QU6Gs.js} +1 -1
- package/dist/{with-timeout-T07SJo4N.js → with-timeout-B_p5pWDv.js} +1 -1
- package/dist/{with-timeout-Bwq-GyUQ.js → with-timeout-GDLpcjW7.js} +1 -1
- package/dist/workflow-telemetry-BMTg5lPd.js +1 -0
- package/dist/workflow-telemetry-Bg8MVUr_.js +2 -0
- package/dist/workflow-telemetry-Do1UsYwM.js +1 -0
- package/dist/workflow-telemetry-DqBPhVL4.js +2 -0
- package/package.json +1 -1
- package/dist/agents-DsZ5vLKE.js +0 -1
- package/dist/auth-choice-Btd2Rxxd.js +0 -1
- package/dist/auth-choice-CVV9wRFN.js +0 -1
- package/dist/auth-choice.apply-BOK9XRCQ.js +0 -1
- package/dist/auth-choice.apply-Cv-BiV5Q.js +0 -1
- package/dist/auth-choice.apply.transformers-CXywS3GZ.js +0 -1
- package/dist/builderforce-onboarding-Dq6VUSKZ.js +0 -24
- package/dist/builderforce-onboarding-DuUfZ6oL.js +0 -24
- package/dist/configure-CWBBFk3F.js +0 -1
- package/dist/configure-fHVOAucW.js +0 -1
- package/dist/health-GLcAfqDz.js +0 -1
- package/dist/login-CPyEf5h6.js +0 -1
- package/dist/model-catalog-J7R-tJDu.js +0 -1
- package/dist/model-picker-D2bcWrtu.js +0 -1
- package/dist/model-picker-DO1HtEEm.js +0 -1
- package/dist/onboard-channels-CmqKsAoW.js +0 -1
- package/dist/onboard-channels-Db0P4iWl.js +0 -1
- package/dist/onboard-custom-BABqIYa4.js +0 -1
- package/dist/onboard-custom-VpW3UC8u.js +0 -1
- package/dist/plugin-registry-B-UOeWqM.js +0 -1
- package/dist/plugin-registry-BjMr3yXM.js +0 -1
- package/dist/plugin-sdk/web-CThgoHQp.js +0 -1
- package/dist/provider-dispatcher-C4nHaNqn.js +0 -1
- package/dist/register.configure-DAL38e7r.js +0 -1
- package/dist/register.configure-DZG7-WVi.js +0 -1
- package/dist/status-BTYqHVha.js +0 -1
- package/dist/web-P6QsgmSD.js +0 -1
- package/dist/workflow-telemetry-B8Im0mPk.js +0 -1
- package/dist/workflow-telemetry-DLEnm5TI.js +0 -2
- package/dist/workflow-telemetry-Dc_oseV7.js +0 -2
- package/dist/workflow-telemetry-Dkm3mofI.js +0 -1
- /package/dist/{devtools-CI7JyCXv.js → devtools-Cg4F-l9O.js} +0 -0
- /package/dist/{devtools-eMFaIsAT.js → devtools-Dl2DACSO.js} +0 -0
- /package/dist/{github-copilot-token-D3gHtNUu.js → github-copilot-token-BlyiXyTy.js} +0 -0
- /package/dist/{github-copilot-token-DHP2kAiN.js → github-copilot-token-D5sB2AUI.js} +0 -0
- /package/dist/{onboard-hooks-Cenav0eW.js → onboard-hooks-BaOSgxs9.js} +0 -0
- /package/dist/{onboard-hooks-Ce20rwpW.js → onboard-hooks-fO5eeDe_.js} +0 -0
- /package/dist/{qmd-manager-DVd_aWEV.js → qmd-manager-BgplOjHN.js} +0 -0
- /package/dist/{qmd-manager-keHvLmvP.js → qmd-manager-COUi_Fqb.js} +0 -0
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import"./paths-5FcIFMsj.js";import{B as theme}from"./utils-DbaBVFaK.js";import"./session-key-EoB0qaG9.js";import"./builderforce-root-D64_sXEi.js";import{i as defaultRuntime}from"./subsystem-B3TqcCrZ.js";import"./registry-TdK-aV05.js";import"./logger-Bch0bx9c.js";import"./exec-DdcIjeyn.js";import"./agent-scope-DPtjOxzp.js";import"./src-CA0fU67C.js";import"./model-selection-
|
|
1
|
+
import"./paths-5FcIFMsj.js";import{B as theme}from"./utils-DbaBVFaK.js";import"./session-key-EoB0qaG9.js";import"./builderforce-root-D64_sXEi.js";import{i as defaultRuntime}from"./subsystem-B3TqcCrZ.js";import"./registry-TdK-aV05.js";import"./logger-Bch0bx9c.js";import"./exec-DdcIjeyn.js";import"./agent-scope-DPtjOxzp.js";import"./src-CA0fU67C.js";import"./model-selection-DG9J_VTz.js";import"./env-file-D1MDi-AM.js";import"./boolean-Cnh1KNl1.js";import"./env-BIdU5BAp.js";import"./src-DTFqOIQD.js";import{r as loadConfig}from"./io-BLBq4T2o.js";import"./manifest-registry-BJCfNV1a.js";import"./config-BgV_FYSq.js";import{n as pickPrimaryTailnetIPv4,r as pickPrimaryTailnetIPv6}from"./tailnet-CTj65CYb.js";import{t as formatDocsLink}from"./links-BgWWaaOT.js";import{t as renderTable}from"./table-BoCHYKoQ.js";import{n as resolveWideAreaDiscoveryDomain,t as getWideAreaZonePath}from"./widearea-dns-CZR56vQb.js";import fs from"node:fs";import path from"node:path";import{spawnSync}from"node:child_process";function run(cmd,args,opts){let res=spawnSync(cmd,args,{encoding:`utf-8`,stdio:opts?.inherit?`inherit`:`pipe`});if(res.error)throw res.error;if(!opts?.allowFailure&&res.status!==0){let errText=typeof res.stderr==`string`&&res.stderr.trim()?res.stderr.trim():`exit ${res.status??`unknown`}`;throw Error(`${cmd} ${args.join(` `)} failed: ${errText}`)}return typeof res.stdout==`string`?res.stdout:``}function writeFileSudoIfNeeded(filePath,content){try{fs.writeFileSync(filePath,content,`utf-8`);return}catch(err){let code=err.code;if(code!==`EACCES`&&code!==`EPERM`)throw err instanceof Error?err:Error(String(err))}let res=spawnSync(`sudo`,[`tee`,filePath],{input:content,encoding:`utf-8`,stdio:[`pipe`,`ignore`,`inherit`]});if(res.error)throw res.error;if(res.status!==0)throw Error(`sudo tee ${filePath} failed: exit ${res.status??`unknown`}`)}function mkdirSudoIfNeeded(dirPath){try{fs.mkdirSync(dirPath,{recursive:!0});return}catch(err){let code=err.code;if(code!==`EACCES`&&code!==`EPERM`)throw err instanceof Error?err:Error(String(err))}run(`sudo`,[`mkdir`,`-p`,dirPath],{inherit:!0})}function zoneFileNeedsBootstrap(zonePath){if(!fs.existsSync(zonePath))return!0;try{let content=fs.readFileSync(zonePath,`utf-8`);return!/\bSOA\b/.test(content)||!/\bNS\b/.test(content)}catch{return!0}}function detectBrewPrefix(){let prefix=run(`brew`,[`--prefix`]).trim();if(!prefix)throw Error(`failed to resolve Homebrew prefix`);return prefix}function ensureImportLine(corefilePath,importGlob){let existing=fs.readFileSync(corefilePath,`utf-8`);return existing.includes(importGlob)?!1:(writeFileSudoIfNeeded(corefilePath,`${existing.replace(/\s*$/,``)}\n\nimport ${importGlob}\n`),!0)}function registerDnsCli(program){program.command(`dns`).description(`DNS helpers for wide-area discovery (Tailscale + CoreDNS)`).addHelpText(`after`,()=>`\n${theme.muted(`Docs:`)} ${formatDocsLink(`/cli/dns`,`docs.builderforce.ai/cli/dns`)}\n`).command(`setup`).description(`Set up CoreDNS to serve your discovery domain for unicast DNS-SD (Wide-Area Bonjour)`).option(`--domain <domain>`,`Wide-area discovery domain (e.g. builderforce.internal)`).option(`--apply`,`Install/update CoreDNS config and (re)start the service (requires sudo)`,!1).action(async opts=>{let cfg=loadConfig(),tailnetIPv4=pickPrimaryTailnetIPv4(),tailnetIPv6=pickPrimaryTailnetIPv6(),wideAreaDomain=resolveWideAreaDiscoveryDomain({configDomain:opts.domain??cfg.discovery?.wideArea?.domain});if(!wideAreaDomain)throw Error(`No wide-area domain configured. Set discovery.wideArea.domain or pass --domain.`);let zonePath=getWideAreaZonePath(wideAreaDomain),tableWidth=Math.max(60,(process.stdout.columns??120)-1);if(defaultRuntime.log(theme.heading(`DNS setup`)),defaultRuntime.log(renderTable({width:tableWidth,columns:[{key:`Key`,header:`Key`,minWidth:18},{key:`Value`,header:`Value`,minWidth:24,flex:!0}],rows:[{Key:`Domain`,Value:wideAreaDomain},{Key:`Zone file`,Value:zonePath},{Key:`Tailnet IP`,Value:`${tailnetIPv4??`—`}${tailnetIPv6?` (v6 ${tailnetIPv6})`:``}`}]}).trimEnd()),defaultRuntime.log(``),defaultRuntime.log(theme.heading(`Recommended ~/.builderforce/builderforce.json:`)),defaultRuntime.log(JSON.stringify({gateway:{bind:`auto`},discovery:{wideArea:{enabled:!0,domain:wideAreaDomain}}},null,2)),defaultRuntime.log(``),defaultRuntime.log(theme.heading(`Tailscale admin (DNS → Nameservers):`)),defaultRuntime.log(theme.muted(`- Add nameserver: ${tailnetIPv4??`<this machine's tailnet IPv4>`}`)),defaultRuntime.log(theme.muted(`- Restrict to domain (Split DNS): ${wideAreaDomain.replace(/\.$/,``)}`)),!opts.apply){defaultRuntime.log(``),defaultRuntime.log(theme.muted(`Run with --apply to install CoreDNS and configure it.`));return}if(process.platform!==`darwin`)throw Error(`dns setup is currently supported on macOS only`);if(!tailnetIPv4&&!tailnetIPv6)throw Error(`no tailnet IP detected; ensure Tailscale is running on this machine`);let prefix=detectBrewPrefix(),etcDir=path.join(prefix,`etc`,`coredns`),corefilePath=path.join(etcDir,`Corefile`),confDir=path.join(etcDir,`conf.d`),importGlob=path.join(confDir,`*.server`),serverPath=path.join(confDir,`${wideAreaDomain.replace(/\.$/,``)}.server`);run(`brew`,[`list`,`coredns`],{allowFailure:!0}),run(`brew`,[`install`,`coredns`],{inherit:!0,allowFailure:!0}),mkdirSudoIfNeeded(confDir),fs.existsSync(corefilePath)?ensureImportLine(corefilePath,importGlob):writeFileSudoIfNeeded(corefilePath,`import ${importGlob}\n`);let bindArgs=[tailnetIPv4,tailnetIPv6].filter(v=>!!v?.trim());if(writeFileSudoIfNeeded(serverPath,[`${wideAreaDomain.replace(/\.$/,``)}:53 {`,` bind ${bindArgs.join(` `)}`,` file ${zonePath} {`,` reload 10s`,` }`,` errors`,` log`,`}`,``].join(`
|
|
2
2
|
`)),await fs.promises.mkdir(path.dirname(zonePath),{recursive:!0}),zoneFileNeedsBootstrap(zonePath)){let serial=`${new Date().getUTCFullYear()}${String(new Date().getUTCMonth()+1).padStart(2,`0`)}${String(new Date().getUTCDate()).padStart(2,`0`)}01`,zoneLines=[`; created by builderforce dns setup (will be overwritten by the gateway when wide-area discovery is enabled)`,`$ORIGIN ${wideAreaDomain}`,`$TTL 60`,`@ IN SOA ns1 hostmaster ${serial} 7200 3600 1209600 60`,`@ IN NS ns1`,tailnetIPv4?`ns1 IN A ${tailnetIPv4}`:null,tailnetIPv6?`ns1 IN AAAA ${tailnetIPv6}`:null,``].filter(line=>!!line);fs.writeFileSync(zonePath,zoneLines.join(`
|
|
3
3
|
`),`utf-8`)}defaultRuntime.log(``),defaultRuntime.log(theme.heading(`Starting CoreDNS (sudo)…`)),run(`sudo`,[`brew`,`services`,`restart`,`coredns`],{inherit:!0}),cfg.discovery?.wideArea?.enabled!==!0&&(defaultRuntime.log(``),defaultRuntime.log(theme.muted(`Note: enable discovery.wideArea.enabled in ~/.builderforce/builderforce.json on the gateway and restart the gateway so it writes the DNS-SD zone.`)))})}export{registerDnsCli};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r as resolveCliName}from"./command-format-DTMaGKs7.js";import{t as resolveBuilderForceAgentsPackageRoot}from"./builderforce-root-DY1qbWNX.js";import{t as note}from"./note-DgDXuE0F.js";import{a as resolveCompletionCachePath,n as installCompletion,o as resolveShellFromEnv,r as isCompletionInstalled,s as usesSlowDynamicCompletion,t as completionCacheExists}from"./completion-cli-
|
|
1
|
+
import{r as resolveCliName}from"./command-format-DTMaGKs7.js";import{t as resolveBuilderForceAgentsPackageRoot}from"./builderforce-root-DY1qbWNX.js";import{t as note}from"./note-DgDXuE0F.js";import{a as resolveCompletionCachePath,n as installCompletion,o as resolveShellFromEnv,r as isCompletionInstalled,s as usesSlowDynamicCompletion,t as completionCacheExists}from"./completion-cli-n8UsdT91.js";import{spawnSync}from"node:child_process";import path from"node:path";async function generateCompletionCache(){let root=await resolveBuilderForceAgentsPackageRoot({moduleUrl:import.meta.url,argv1:process.argv[1],cwd:process.cwd()});if(!root)return!1;let binPath=path.join(root,`builderforce.mjs`);return spawnSync(process.execPath,[binPath,`completion`,`--write-state`],{cwd:root,env:process.env,encoding:`utf-8`}).status===0}async function checkShellCompletionStatus(binName=`builderforce`){let shell=resolveShellFromEnv();return{shell,profileInstalled:await isCompletionInstalled(shell,binName),cacheExists:await completionCacheExists(shell,binName),cachePath:resolveCompletionCachePath(shell,binName),usesSlowPattern:await usesSlowDynamicCompletion(shell,binName)}}async function doctorShellCompletion(runtime,prompter,options={}){let cliName=resolveCliName(),status=await checkShellCompletionStatus(cliName);if(status.usesSlowPattern){if(note(`Your ${status.shell} profile uses slow dynamic completion (source <(...)).\nUpgrading to cached completion for faster shell startup...`,`Shell completion`),!status.cacheExists&&!await generateCompletionCache()){note(`Failed to generate completion cache. Run \`${cliName} completion --write-state\` manually.`,`Shell completion`);return}await installCompletion(status.shell,!0,cliName),note(`Shell completion upgraded. Restart your shell or run: source ~/.${status.shell===`zsh`?`zshrc`:status.shell===`bash`?`bashrc`:`config/fish/config.fish`}`,`Shell completion`);return}if(status.profileInstalled&&!status.cacheExists){note(`Shell completion is configured in your ${status.shell} profile but the cache is missing.\nRegenerating cache...`,`Shell completion`),await generateCompletionCache()?note(`Completion cache regenerated at ${status.cachePath}`,`Shell completion`):note(`Failed to regenerate completion cache. Run \`${cliName} completion --write-state\` manually.`,`Shell completion`);return}if(!status.profileInstalled){if(options.nonInteractive)return;if(await prompter.confirm({message:`Enable ${status.shell} shell completion for ${cliName}?`,initialValue:!0})){if(!await generateCompletionCache()){note(`Failed to generate completion cache. Run \`${cliName} completion --write-state\` manually.`,`Shell completion`);return}await installCompletion(status.shell,!0,cliName),note(`Shell completion installed. Restart your shell or run: source ~/.${status.shell===`zsh`?`zshrc`:status.shell===`bash`?`bashrc`:`config/fish/config.fish`}`,`Shell completion`)}}}async function ensureCompletionCacheExists(binName=`builderforce`){return await completionCacheExists(resolveShellFromEnv(),binName)?!0:generateCompletionCache()}export{doctorShellCompletion as n,ensureCompletionCacheExists as r,checkShellCompletionStatus as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{t as resolveBuilderForceAgentsPackageRoot}from"./builderforce-root-D64_sXEi.js";import{r as resolveCliName}from"./command-format-D806O2pt.js";import{t as note}from"./note-B6NtFdXt.js";import{a as resolveCompletionCachePath,n as installCompletion,o as resolveShellFromEnv,r as isCompletionInstalled,s as usesSlowDynamicCompletion,t as completionCacheExists}from"./completion-cli-
|
|
1
|
+
import{t as resolveBuilderForceAgentsPackageRoot}from"./builderforce-root-D64_sXEi.js";import{r as resolveCliName}from"./command-format-D806O2pt.js";import{t as note}from"./note-B6NtFdXt.js";import{a as resolveCompletionCachePath,n as installCompletion,o as resolveShellFromEnv,r as isCompletionInstalled,s as usesSlowDynamicCompletion,t as completionCacheExists}from"./completion-cli-gyvx5ZXu.js";import path from"node:path";import{spawnSync}from"node:child_process";async function generateCompletionCache(){let root=await resolveBuilderForceAgentsPackageRoot({moduleUrl:import.meta.url,argv1:process.argv[1],cwd:process.cwd()});if(!root)return!1;let binPath=path.join(root,`builderforce.mjs`);return spawnSync(process.execPath,[binPath,`completion`,`--write-state`],{cwd:root,env:process.env,encoding:`utf-8`}).status===0}async function checkShellCompletionStatus(binName=`builderforce`){let shell=resolveShellFromEnv();return{shell,profileInstalled:await isCompletionInstalled(shell,binName),cacheExists:await completionCacheExists(shell,binName),cachePath:resolveCompletionCachePath(shell,binName),usesSlowPattern:await usesSlowDynamicCompletion(shell,binName)}}async function doctorShellCompletion(runtime,prompter,options={}){let cliName=resolveCliName(),status=await checkShellCompletionStatus(cliName);if(status.usesSlowPattern){if(note(`Your ${status.shell} profile uses slow dynamic completion (source <(...)).\nUpgrading to cached completion for faster shell startup...`,`Shell completion`),!status.cacheExists&&!await generateCompletionCache()){note(`Failed to generate completion cache. Run \`${cliName} completion --write-state\` manually.`,`Shell completion`);return}await installCompletion(status.shell,!0,cliName),note(`Shell completion upgraded. Restart your shell or run: source ~/.${status.shell===`zsh`?`zshrc`:status.shell===`bash`?`bashrc`:`config/fish/config.fish`}`,`Shell completion`);return}if(status.profileInstalled&&!status.cacheExists){note(`Shell completion is configured in your ${status.shell} profile but the cache is missing.\nRegenerating cache...`,`Shell completion`),await generateCompletionCache()?note(`Completion cache regenerated at ${status.cachePath}`,`Shell completion`):note(`Failed to regenerate completion cache. Run \`${cliName} completion --write-state\` manually.`,`Shell completion`);return}if(!status.profileInstalled){if(options.nonInteractive)return;if(await prompter.confirm({message:`Enable ${status.shell} shell completion for ${cliName}?`,initialValue:!0})){if(!await generateCompletionCache()){note(`Failed to generate completion cache. Run \`${cliName} completion --write-state\` manually.`,`Shell completion`);return}await installCompletion(status.shell,!0,cliName),note(`Shell completion installed. Restart your shell or run: source ~/.${status.shell===`zsh`?`zshrc`:status.shell===`bash`?`bashrc`:`config/fish/config.fish`}`,`Shell completion`)}}}async function ensureCompletionCacheExists(binName=`builderforce`){return await completionCacheExists(resolveShellFromEnv(),binName)?!0:generateCompletionCache()}export{doctorShellCompletion as n,ensureCompletionCacheExists as r,checkShellCompletionStatus as t};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{D as truncateUtf16Safe}from"./utils-DbaBVFaK.js";import{t as stableStringify}from"./src-DTFqOIQD.js";import{s as formatSandboxToolPolicyBlockedMessage}from"./sandbox-
|
|
1
|
+
import{D as truncateUtf16Safe}from"./utils-DbaBVFaK.js";import{t as stableStringify}from"./src-DTFqOIQD.js";import{s as formatSandboxToolPolicyBlockedMessage}from"./sandbox-C4AKi2EX.js";import{t as sanitizeContentBlocksImages}from"./tool-images-B7b_OiMz.js";import path from"node:path";import{createHash}from"node:crypto";import fs from"node:fs/promises";function normalizeProviderId(provider){if(!provider)return``;let normalized=provider.trim().toLowerCase();return normalized===`z.ai`||normalized===`z-ai`?`zai`:normalized}function isBinaryThinkingProvider(provider){return normalizeProviderId(provider)===`zai`}const XHIGH_MODEL_REFS=[`openai/gpt-5.2`,`openai-codex/gpt-5.3-codex`,`openai-codex/gpt-5.3-codex-spark`,`openai-codex/gpt-5.2-codex`,`openai-codex/gpt-5.1-codex`,`github-copilot/gpt-5.2-codex`,`github-copilot/gpt-5.2`],XHIGH_MODEL_SET=new Set(XHIGH_MODEL_REFS.map(entry=>entry.toLowerCase())),XHIGH_MODEL_IDS=new Set(XHIGH_MODEL_REFS.map(entry=>entry.split(`/`)[1]?.toLowerCase()).filter(entry=>!!entry));function normalizeThinkLevel(raw){if(!raw)return;let key=raw.trim().toLowerCase(),collapsed=key.replace(/[\s_-]+/g,``);if(collapsed===`xhigh`||collapsed===`extrahigh`)return`xhigh`;if([`off`].includes(key))return`off`;if([`on`,`enable`,`enabled`].includes(key))return`low`;if([`min`,`minimal`].includes(key))return`minimal`;if([`low`,`thinkhard`,`think-hard`,`think_hard`].includes(key))return`low`;if([`mid`,`med`,`medium`,`thinkharder`,`think-harder`,`harder`].includes(key))return`medium`;if([`high`,`ultra`,`ultrathink`,`think-hard`,`thinkhardest`,`highest`,`max`].includes(key))return`high`;if([`think`].includes(key))return`minimal`}function supportsXHighThinking(provider,model){let modelKey=model?.trim().toLowerCase();if(!modelKey)return!1;let providerKey=provider?.trim().toLowerCase();return providerKey?XHIGH_MODEL_SET.has(`${providerKey}/${modelKey}`):XHIGH_MODEL_IDS.has(modelKey)}function listThinkingLevels(provider,model){let levels=[`off`,`minimal`,`low`,`medium`,`high`];return supportsXHighThinking(provider,model)&&levels.push(`xhigh`),levels}function listThinkingLevelLabels(provider,model){return isBinaryThinkingProvider(provider)?[`off`,`on`]:listThinkingLevels(provider,model)}function formatThinkingLevels(provider,model,separator=`, `){return listThinkingLevelLabels(provider,model).join(separator)}function formatXHighModelHint(){let refs=[...XHIGH_MODEL_REFS];return refs.length===0?`unknown model`:refs.length===1?refs[0]:refs.length===2?`${refs[0]} or ${refs[1]}`:`${refs.slice(0,-1).join(`, `)} or ${refs[refs.length-1]}`}function normalizeOnOffFullLevel(raw){if(!raw)return;let key=raw.toLowerCase();if([`off`,`false`,`no`,`0`].includes(key))return`off`;if([`full`,`all`,`everything`].includes(key))return`full`;if([`on`,`minimal`,`true`,`yes`,`1`].includes(key))return`on`}function normalizeVerboseLevel(raw){return normalizeOnOffFullLevel(raw)}function normalizeUsageDisplay(raw){if(!raw)return;let key=raw.toLowerCase();if([`off`,`false`,`no`,`0`,`disable`,`disabled`].includes(key))return`off`;if([`on`,`true`,`yes`,`1`,`enable`,`enabled`].includes(key)||[`tokens`,`token`,`tok`,`minimal`,`min`].includes(key))return`tokens`;if([`full`,`session`].includes(key))return`full`}function resolveResponseUsageMode(raw){return normalizeUsageDisplay(raw)??`off`}function normalizeElevatedLevel(raw){if(!raw)return;let key=raw.toLowerCase();if([`off`,`false`,`no`,`0`].includes(key))return`off`;if([`full`,`auto`,`auto-approve`,`autoapprove`].includes(key))return`full`;if([`ask`,`prompt`,`approval`,`approve`].includes(key))return`ask`;if([`on`,`true`,`yes`,`1`].includes(key))return`on`}function normalizeReasoningLevel(raw){if(!raw)return;let key=raw.toLowerCase();if([`off`,`false`,`no`,`0`,`hide`,`hidden`,`disable`,`disabled`].includes(key))return`off`;if([`on`,`true`,`yes`,`1`,`show`,`visible`,`enable`,`enabled`].includes(key))return`on`;if([`stream`,`streaming`,`draft`,`live`].includes(key))return`stream`}function isBase64Signature(value){let trimmed=value.trim();if(!trimmed)return!1;let compact=trimmed.replace(/\s+/g,``);if(!/^[A-Za-z0-9+/=_-]+$/.test(compact))return!1;let isUrl=compact.includes(`-`)||compact.includes(`_`);try{let buf=Buffer.from(compact,isUrl?`base64url`:`base64`);if(buf.length===0)return!1;let encoded=buf.toString(isUrl?`base64url`:`base64`),normalize=input=>input.replace(/=+$/g,``);return normalize(encoded)===normalize(compact)}catch{return!1}}function stripThoughtSignatures(content,options){if(!Array.isArray(content))return content;let allowBase64Only=options?.allowBase64Only??!1,includeCamelCase=options?.includeCamelCase??!1,shouldStripSignature=value=>allowBase64Only?typeof value!=`string`||!isBase64Signature(value):typeof value==`string`&&value.startsWith(`msg_`);return content.map(block=>{if(!block||typeof block!=`object`)return block;let rec=block,stripSnake=shouldStripSignature(rec.thought_signature),stripCamel=includeCamelCase?shouldStripSignature(rec.thoughtSignature):!1;if(!stripSnake&&!stripCamel)return block;let next={...rec};return stripSnake&&delete next.thought_signature,stripCamel&&delete next.thoughtSignature,next})}const DEFAULT_BOOTSTRAP_MAX_CHARS=2e4,DEFAULT_BOOTSTRAP_TOTAL_MAX_CHARS=15e4;function resolveBootstrapMaxChars(cfg){let raw=cfg?.agents?.defaults?.bootstrapMaxChars;return typeof raw==`number`&&Number.isFinite(raw)&&raw>0?Math.floor(raw):DEFAULT_BOOTSTRAP_MAX_CHARS}function resolveBootstrapTotalMaxChars(cfg){let raw=cfg?.agents?.defaults?.bootstrapTotalMaxChars;return typeof raw==`number`&&Number.isFinite(raw)&&raw>0?Math.floor(raw):DEFAULT_BOOTSTRAP_TOTAL_MAX_CHARS}function trimBootstrapContent(content,fileName,maxChars){let trimmed=content.trimEnd();if(trimmed.length<=maxChars)return{content:trimmed,truncated:!1,maxChars,originalLength:trimmed.length};let headChars=Math.floor(maxChars*.7),tailChars=Math.floor(maxChars*.2),head=trimmed.slice(0,headChars),tail=trimmed.slice(-tailChars);return{content:[head,[``,`[...truncated, read ${fileName} for full content...]`,`…(truncated ${fileName}: kept ${headChars}+${tailChars} chars of ${trimmed.length})…`,``].join(`
|
|
2
2
|
`),tail].join(`
|
|
3
3
|
`),truncated:!0,maxChars,originalLength:trimmed.length}}function clampToBudget(content,budget){return budget<=0?``:content.length<=budget?content:budget<=3?truncateUtf16Safe(content,budget):`${truncateUtf16Safe(content,budget-1)}…`}async function ensureSessionHeader(params){let file=params.sessionFile;try{await fs.stat(file);return}catch{}await fs.mkdir(path.dirname(file),{recursive:!0});let entry={type:`session`,version:2,id:params.sessionId,timestamp:new Date().toISOString(),cwd:params.cwd};await fs.writeFile(file,`${JSON.stringify(entry)}\n`,`utf-8`)}function buildBootstrapContextFiles(files,opts){let maxChars=opts?.maxChars??DEFAULT_BOOTSTRAP_MAX_CHARS,remainingTotalChars=Math.max(1,Math.floor(opts?.totalMaxChars??Math.max(maxChars,DEFAULT_BOOTSTRAP_TOTAL_MAX_CHARS))),result=[];for(let file of files){if(remainingTotalChars<=0)break;if(file.missing){let cappedMissingText=clampToBudget(`[MISSING] Expected at: ${file.path}`,remainingTotalChars);if(!cappedMissingText)break;remainingTotalChars=Math.max(0,remainingTotalChars-cappedMissingText.length),result.push({path:file.path,content:cappedMissingText});continue}if(remainingTotalChars<64){opts?.warn?.(`remaining bootstrap budget is ${remainingTotalChars} chars (<64); skipping additional bootstrap files`);break}let fileMaxChars=Math.max(1,Math.min(maxChars,remainingTotalChars)),trimmed=trimBootstrapContent(file.content??``,file.name,fileMaxChars),contentWithinBudget=clampToBudget(trimmed.content,remainingTotalChars);contentWithinBudget&&((trimmed.truncated||contentWithinBudget.length<trimmed.content.length)&&opts?.warn?.(`workspace bootstrap file ${file.name} is ${trimmed.originalLength} chars (limit ${trimmed.maxChars}); truncating in injected context`),remainingTotalChars=Math.max(0,remainingTotalChars-contentWithinBudget.length),result.push({path:file.path,content:contentWithinBudget}))}return result}function sanitizeGoogleTurnOrdering(messages){let GOOGLE_TURN_ORDER_BOOTSTRAP_TEXT=`(session bootstrap)`,first=messages[0],role=first?.role,content=first?.content;return role===`user`&&typeof content==`string`&&content.trim()===GOOGLE_TURN_ORDER_BOOTSTRAP_TEXT||role!==`assistant`?messages:[{role:`user`,content:GOOGLE_TURN_ORDER_BOOTSTRAP_TEXT,timestamp:Date.now()},...messages]}function formatBillingErrorMessage(provider,model){let providerName=provider?.trim(),modelName=model?.trim(),providerLabel=providerName&&modelName?`${providerName} (${modelName})`:providerName||void 0;return providerLabel?`⚠️ ${providerLabel} returned a billing error — your API key has run out of credits or has an insufficient balance. Check your ${providerName} billing dashboard and top up or switch to a different API key.`:`⚠️ API provider returned a billing error — your API key has run out of credits or has an insufficient balance. Check your provider's billing dashboard and top up or switch to a different API key.`}const BILLING_ERROR_USER_MESSAGE=formatBillingErrorMessage();function formatRateLimitOrOverloadedErrorCopy(raw){if(isRateLimitErrorMessage(raw))return`⚠️ API rate limit reached. Please try again later.`;if(isOverloadedErrorMessage(raw))return`The AI service is temporarily overloaded. Please try again in a moment.`}function isContextOverflowError(errorMessage){if(!errorMessage)return!1;let lower=errorMessage.toLowerCase(),hasRequestSizeExceeds=lower.includes(`request size exceeds`),hasContextWindow=lower.includes(`context window`)||lower.includes(`context length`)||lower.includes(`maximum context length`);return lower.includes(`request_too_large`)||lower.includes(`request exceeds the maximum size`)||lower.includes(`context length exceeded`)||lower.includes(`maximum context length`)||lower.includes(`prompt is too long`)||lower.includes(`exceeds model context window`)||hasRequestSizeExceeds&&hasContextWindow||lower.includes(`context overflow:`)||lower.includes(`413`)&&lower.includes(`too large`)}const CONTEXT_WINDOW_TOO_SMALL_RE=/context window.*(too small|minimum is)/i,CONTEXT_OVERFLOW_HINT_RE=/context.*overflow|context window.*(too (?:large|long)|exceed|over|limit|max(?:imum)?|requested|sent|tokens)|prompt.*(too (?:large|long)|exceed|over|limit|max(?:imum)?)|(?:request|input).*(?:context|window|length|token).*(too (?:large|long)|exceed|over|limit|max(?:imum)?)/i,RATE_LIMIT_HINT_RE=/rate limit|too many requests|requests per (?:minute|hour|day)|quota|throttl|429\b/i;function isLikelyContextOverflowError(errorMessage){return!errorMessage||CONTEXT_WINDOW_TOO_SMALL_RE.test(errorMessage)||isRateLimitErrorMessage(errorMessage)?!1:isContextOverflowError(errorMessage)?!0:RATE_LIMIT_HINT_RE.test(errorMessage)?!1:CONTEXT_OVERFLOW_HINT_RE.test(errorMessage)}function isCompactionFailureError(errorMessage){if(!errorMessage)return!1;let lower=errorMessage.toLowerCase();return lower.includes(`summarization failed`)||lower.includes(`auto-compaction`)||lower.includes(`compaction failed`)||lower.includes(`compaction`)?isLikelyContextOverflowError(errorMessage)?!0:lower.includes(`context overflow`):!1}const ERROR_PAYLOAD_PREFIX_RE=/^(?:error|api\s*error|apierror|openai\s*error|anthropic\s*error|gateway\s*error)[:\s-]+/i,FINAL_TAG_RE=/<\s*\/?\s*final\s*>/gi,ERROR_PREFIX_RE=/^(?:error|api\s*error|openai\s*error|anthropic\s*error|gateway\s*error|request failed|failed|exception)[:\s-]+/i,CONTEXT_OVERFLOW_ERROR_HEAD_RE=/^(?:context overflow:|request_too_large\b|request size exceeds\b|request exceeds the maximum size\b|context length exceeded\b|maximum context length\b|prompt is too long\b|exceeds model context window\b)/i,BILLING_ERROR_HEAD_RE=/^(?:error[:\s-]+)?billing(?:\s+error)?(?:[:\s-]+|$)|^(?:error[:\s-]+)?(?:credit balance|insufficient credits?|payment required|http\s*402\b)/i,HTTP_STATUS_PREFIX_RE=/^(?:http\s*)?(\d{3})\s+(.+)$/i,HTTP_STATUS_CODE_PREFIX_RE=/^(?:http\s*)?(\d{3})(?:\s+([\s\S]+))?$/i,HTML_ERROR_PREFIX_RE=/^\s*(?:<!doctype\s+html\b|<html\b)/i,CLOUDFLARE_HTML_ERROR_CODES=new Set([521,522,523,524,525,526,530]),TRANSIENT_HTTP_ERROR_CODES=new Set([500,502,503,521,522,523,524,529]),HTTP_ERROR_HINTS=[`error`,`bad request`,`not found`,`unauthorized`,`forbidden`,`internal server`,`service unavailable`,`gateway`,`rate limit`,`overloaded`,`timeout`,`timed out`,`invalid`,`too many requests`,`permission`];function extractLeadingHttpStatus(raw){let match=raw.match(HTTP_STATUS_CODE_PREFIX_RE);if(!match)return null;let code=Number(match[1]);return Number.isFinite(code)?{code,rest:(match[2]??``).trim()}:null}function isCloudflareOrHtmlErrorPage(raw){let trimmed=raw.trim();if(!trimmed)return!1;let status=extractLeadingHttpStatus(trimmed);return!status||status.code<500?!1:CLOUDFLARE_HTML_ERROR_CODES.has(status.code)?!0:status.code<600&&HTML_ERROR_PREFIX_RE.test(status.rest)&&/<\/html>/i.test(status.rest)}function isTransientHttpError(raw){let trimmed=raw.trim();if(!trimmed)return!1;let status=extractLeadingHttpStatus(trimmed);return status?TRANSIENT_HTTP_ERROR_CODES.has(status.code):!1}function stripFinalTagsFromText(text){return text&&text.replace(FINAL_TAG_RE,``)}function collapseConsecutiveDuplicateBlocks(text){let trimmed=text.trim();if(!trimmed)return text;let blocks=trimmed.split(/\n{2,}/);if(blocks.length<2)return text;let normalizeBlock=value=>value.trim().replace(/\s+/g,` `),result=[],lastNormalized=null;for(let block of blocks){let normalized=normalizeBlock(block);lastNormalized&&normalized===lastNormalized||(result.push(block.trim()),lastNormalized=normalized)}return result.length===blocks.length?text:result.join(`
|
|
4
4
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{E as truncateUtf16Safe}from"./utils-BP60e80M.js";import{t as stableStringify}from"./src-HrLX5bhG.js";import{s as formatSandboxToolPolicyBlockedMessage}from"./sandbox-
|
|
1
|
+
import{E as truncateUtf16Safe}from"./utils-BP60e80M.js";import{t as stableStringify}from"./src-HrLX5bhG.js";import{s as formatSandboxToolPolicyBlockedMessage}from"./sandbox-DvKMuAXL.js";import{t as sanitizeContentBlocksImages}from"./tool-images-CCpqFtrL.js";import path from"node:path";import{createHash}from"node:crypto";import fs from"node:fs/promises";function isBase64Signature(value){let trimmed=value.trim();if(!trimmed)return!1;let compact=trimmed.replace(/\s+/g,``);if(!/^[A-Za-z0-9+/=_-]+$/.test(compact))return!1;let isUrl=compact.includes(`-`)||compact.includes(`_`);try{let buf=Buffer.from(compact,isUrl?`base64url`:`base64`);if(buf.length===0)return!1;let encoded=buf.toString(isUrl?`base64url`:`base64`),normalize=input=>input.replace(/=+$/g,``);return normalize(encoded)===normalize(compact)}catch{return!1}}function stripThoughtSignatures(content,options){if(!Array.isArray(content))return content;let allowBase64Only=options?.allowBase64Only??!1,includeCamelCase=options?.includeCamelCase??!1,shouldStripSignature=value=>allowBase64Only?typeof value!=`string`||!isBase64Signature(value):typeof value==`string`&&value.startsWith(`msg_`);return content.map(block=>{if(!block||typeof block!=`object`)return block;let rec=block,stripSnake=shouldStripSignature(rec.thought_signature),stripCamel=includeCamelCase?shouldStripSignature(rec.thoughtSignature):!1;if(!stripSnake&&!stripCamel)return block;let next={...rec};return stripSnake&&delete next.thought_signature,stripCamel&&delete next.thoughtSignature,next})}const DEFAULT_BOOTSTRAP_MAX_CHARS=2e4,DEFAULT_BOOTSTRAP_TOTAL_MAX_CHARS=15e4;function resolveBootstrapMaxChars(cfg){let raw=cfg?.agents?.defaults?.bootstrapMaxChars;return typeof raw==`number`&&Number.isFinite(raw)&&raw>0?Math.floor(raw):DEFAULT_BOOTSTRAP_MAX_CHARS}function resolveBootstrapTotalMaxChars(cfg){let raw=cfg?.agents?.defaults?.bootstrapTotalMaxChars;return typeof raw==`number`&&Number.isFinite(raw)&&raw>0?Math.floor(raw):DEFAULT_BOOTSTRAP_TOTAL_MAX_CHARS}function trimBootstrapContent(content,fileName,maxChars){let trimmed=content.trimEnd();if(trimmed.length<=maxChars)return{content:trimmed,truncated:!1,maxChars,originalLength:trimmed.length};let headChars=Math.floor(maxChars*.7),tailChars=Math.floor(maxChars*.2),head=trimmed.slice(0,headChars),tail=trimmed.slice(-tailChars);return{content:[head,[``,`[...truncated, read ${fileName} for full content...]`,`…(truncated ${fileName}: kept ${headChars}+${tailChars} chars of ${trimmed.length})…`,``].join(`
|
|
2
2
|
`),tail].join(`
|
|
3
3
|
`),truncated:!0,maxChars,originalLength:trimmed.length}}function clampToBudget(content,budget){return budget<=0?``:content.length<=budget?content:budget<=3?truncateUtf16Safe(content,budget):`${truncateUtf16Safe(content,budget-1)}…`}async function ensureSessionHeader(params){let file=params.sessionFile;try{await fs.stat(file);return}catch{}await fs.mkdir(path.dirname(file),{recursive:!0});let entry={type:`session`,version:2,id:params.sessionId,timestamp:new Date().toISOString(),cwd:params.cwd};await fs.writeFile(file,`${JSON.stringify(entry)}\n`,`utf-8`)}function buildBootstrapContextFiles(files,opts){let maxChars=opts?.maxChars??DEFAULT_BOOTSTRAP_MAX_CHARS,remainingTotalChars=Math.max(1,Math.floor(opts?.totalMaxChars??Math.max(maxChars,DEFAULT_BOOTSTRAP_TOTAL_MAX_CHARS))),result=[];for(let file of files){if(remainingTotalChars<=0)break;if(file.missing){let cappedMissingText=clampToBudget(`[MISSING] Expected at: ${file.path}`,remainingTotalChars);if(!cappedMissingText)break;remainingTotalChars=Math.max(0,remainingTotalChars-cappedMissingText.length),result.push({path:file.path,content:cappedMissingText});continue}if(remainingTotalChars<64){opts?.warn?.(`remaining bootstrap budget is ${remainingTotalChars} chars (<64); skipping additional bootstrap files`);break}let fileMaxChars=Math.max(1,Math.min(maxChars,remainingTotalChars)),trimmed=trimBootstrapContent(file.content??``,file.name,fileMaxChars),contentWithinBudget=clampToBudget(trimmed.content,remainingTotalChars);contentWithinBudget&&((trimmed.truncated||contentWithinBudget.length<trimmed.content.length)&&opts?.warn?.(`workspace bootstrap file ${file.name} is ${trimmed.originalLength} chars (limit ${trimmed.maxChars}); truncating in injected context`),remainingTotalChars=Math.max(0,remainingTotalChars-contentWithinBudget.length),result.push({path:file.path,content:contentWithinBudget}))}return result}function sanitizeGoogleTurnOrdering(messages){let GOOGLE_TURN_ORDER_BOOTSTRAP_TEXT=`(session bootstrap)`,first=messages[0],role=first?.role,content=first?.content;return role===`user`&&typeof content==`string`&&content.trim()===GOOGLE_TURN_ORDER_BOOTSTRAP_TEXT||role!==`assistant`?messages:[{role:`user`,content:GOOGLE_TURN_ORDER_BOOTSTRAP_TEXT,timestamp:Date.now()},...messages]}function formatBillingErrorMessage(provider,model){let providerName=provider?.trim(),modelName=model?.trim(),providerLabel=providerName&&modelName?`${providerName} (${modelName})`:providerName||void 0;return providerLabel?`⚠️ ${providerLabel} returned a billing error — your API key has run out of credits or has an insufficient balance. Check your ${providerName} billing dashboard and top up or switch to a different API key.`:`⚠️ API provider returned a billing error — your API key has run out of credits or has an insufficient balance. Check your provider's billing dashboard and top up or switch to a different API key.`}const BILLING_ERROR_USER_MESSAGE=formatBillingErrorMessage();function formatRateLimitOrOverloadedErrorCopy(raw){if(isRateLimitErrorMessage(raw))return`⚠️ API rate limit reached. Please try again later.`;if(isOverloadedErrorMessage(raw))return`The AI service is temporarily overloaded. Please try again in a moment.`}function isContextOverflowError(errorMessage){if(!errorMessage)return!1;let lower=errorMessage.toLowerCase(),hasRequestSizeExceeds=lower.includes(`request size exceeds`),hasContextWindow=lower.includes(`context window`)||lower.includes(`context length`)||lower.includes(`maximum context length`);return lower.includes(`request_too_large`)||lower.includes(`request exceeds the maximum size`)||lower.includes(`context length exceeded`)||lower.includes(`maximum context length`)||lower.includes(`prompt is too long`)||lower.includes(`exceeds model context window`)||hasRequestSizeExceeds&&hasContextWindow||lower.includes(`context overflow:`)||lower.includes(`413`)&&lower.includes(`too large`)}const CONTEXT_WINDOW_TOO_SMALL_RE=/context window.*(too small|minimum is)/i,CONTEXT_OVERFLOW_HINT_RE=/context.*overflow|context window.*(too (?:large|long)|exceed|over|limit|max(?:imum)?|requested|sent|tokens)|prompt.*(too (?:large|long)|exceed|over|limit|max(?:imum)?)|(?:request|input).*(?:context|window|length|token).*(too (?:large|long)|exceed|over|limit|max(?:imum)?)/i,RATE_LIMIT_HINT_RE=/rate limit|too many requests|requests per (?:minute|hour|day)|quota|throttl|429\b/i;function isLikelyContextOverflowError(errorMessage){return!errorMessage||CONTEXT_WINDOW_TOO_SMALL_RE.test(errorMessage)||isRateLimitErrorMessage(errorMessage)?!1:isContextOverflowError(errorMessage)?!0:RATE_LIMIT_HINT_RE.test(errorMessage)?!1:CONTEXT_OVERFLOW_HINT_RE.test(errorMessage)}function isCompactionFailureError(errorMessage){if(!errorMessage)return!1;let lower=errorMessage.toLowerCase();return lower.includes(`summarization failed`)||lower.includes(`auto-compaction`)||lower.includes(`compaction failed`)||lower.includes(`compaction`)?isLikelyContextOverflowError(errorMessage)?!0:lower.includes(`context overflow`):!1}const ERROR_PAYLOAD_PREFIX_RE=/^(?:error|api\s*error|apierror|openai\s*error|anthropic\s*error|gateway\s*error)[:\s-]+/i,FINAL_TAG_RE=/<\s*\/?\s*final\s*>/gi,ERROR_PREFIX_RE=/^(?:error|api\s*error|openai\s*error|anthropic\s*error|gateway\s*error|request failed|failed|exception)[:\s-]+/i,CONTEXT_OVERFLOW_ERROR_HEAD_RE=/^(?:context overflow:|request_too_large\b|request size exceeds\b|request exceeds the maximum size\b|context length exceeded\b|maximum context length\b|prompt is too long\b|exceeds model context window\b)/i,BILLING_ERROR_HEAD_RE=/^(?:error[:\s-]+)?billing(?:\s+error)?(?:[:\s-]+|$)|^(?:error[:\s-]+)?(?:credit balance|insufficient credits?|payment required|http\s*402\b)/i,HTTP_STATUS_PREFIX_RE=/^(?:http\s*)?(\d{3})\s+(.+)$/i,HTTP_STATUS_CODE_PREFIX_RE=/^(?:http\s*)?(\d{3})(?:\s+([\s\S]+))?$/i,HTML_ERROR_PREFIX_RE=/^\s*(?:<!doctype\s+html\b|<html\b)/i,CLOUDFLARE_HTML_ERROR_CODES=new Set([521,522,523,524,525,526,530]),TRANSIENT_HTTP_ERROR_CODES=new Set([500,502,503,521,522,523,524,529]),HTTP_ERROR_HINTS=[`error`,`bad request`,`not found`,`unauthorized`,`forbidden`,`internal server`,`service unavailable`,`gateway`,`rate limit`,`overloaded`,`timeout`,`timed out`,`invalid`,`too many requests`,`permission`];function extractLeadingHttpStatus(raw){let match=raw.match(HTTP_STATUS_CODE_PREFIX_RE);if(!match)return null;let code=Number(match[1]);return Number.isFinite(code)?{code,rest:(match[2]??``).trim()}:null}function isCloudflareOrHtmlErrorPage(raw){let trimmed=raw.trim();if(!trimmed)return!1;let status=extractLeadingHttpStatus(trimmed);return!status||status.code<500?!1:CLOUDFLARE_HTML_ERROR_CODES.has(status.code)?!0:status.code<600&&HTML_ERROR_PREFIX_RE.test(status.rest)&&/<\/html>/i.test(status.rest)}function isTransientHttpError(raw){let trimmed=raw.trim();if(!trimmed)return!1;let status=extractLeadingHttpStatus(trimmed);return status?TRANSIENT_HTTP_ERROR_CODES.has(status.code):!1}function stripFinalTagsFromText(text){return text&&text.replace(FINAL_TAG_RE,``)}function collapseConsecutiveDuplicateBlocks(text){let trimmed=text.trim();if(!trimmed)return text;let blocks=trimmed.split(/\n{2,}/);if(blocks.length<2)return text;let normalizeBlock=value=>value.trim().replace(/\s+/g,` `),result=[],lastNormalized=null;for(let block of blocks){let normalized=normalizeBlock(block);lastNormalized&&normalized===lastNormalized||(result.push(block.trim()),lastNormalized=normalized)}return result.length===blocks.length?text:result.join(`
|
|
4
4
|
|
package/dist/entry.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{y as resolveRequiredHomeDir}from"./paths-BHg-VHB4.js";import{t as isValidProfileName}from"./profile-utils-BKdObK6T.js";import{c as hasHelpOrVersion}from"./argv-BgQk38nl.js";import{t as normalizeWindowsArgv}from"./windows-argv-ClCYQujd.js";import"./registry-Cv7CoWAs.js";import"./utils-BP60e80M.js";import"./subsystem-C4b1Von0.js";import"./boolean-ssGoaBPk.js";import{r as normalizeEnv,t as isTruthyEnvValue}from"./env-BoE8QSib.js";import{t as installProcessWarningFilter}from"./warning-filter-nSTjpMIH.js";import{spawn}from"node:child_process";import process$1 from"node:process";import os from"node:os";import path from"node:path";function takeValue(raw,next){if(raw.includes(`=`)){let[,value]=raw.split(`=`,2);return{value:(value??``).trim()||null,consumedNext:!1}}return{value:(next??``).trim()||null,consumedNext:!!next}}function parseCliProfileArgs(argv){if(argv.length<2)return{ok:!0,profile:null,argv};let out=argv.slice(0,2),profile=null,sawDev=!1,sawCommand=!1,args=argv.slice(2);for(let i=0;i<args.length;i+=1){let arg=args[i];if(arg!==void 0){if(sawCommand){out.push(arg);continue}if(arg===`--dev`){if(profile&&profile!==`dev`)return{ok:!1,error:`Cannot combine --dev with --profile`};sawDev=!0,profile=`dev`;continue}if(arg===`--profile`||arg.startsWith(`--profile=`)){if(sawDev)return{ok:!1,error:`Cannot combine --dev with --profile`};let next=args[i+1],{value,consumedNext}=takeValue(arg,next);if(consumedNext&&(i+=1),!value)return{ok:!1,error:`--profile requires a value`};if(!isValidProfileName(value))return{ok:!1,error:`Invalid --profile (use letters, numbers, "_", "-" only)`};profile=value;continue}if(!arg.startsWith(`-`)){sawCommand=!0,out.push(arg);continue}out.push(arg)}}return{ok:!0,profile,argv:out}}function resolveProfileStateDir(profile,env,homedir){let suffix=profile.toLowerCase()===`default`?``:`-${profile}`;return path.join(resolveRequiredHomeDir(env,homedir),`.builderforce${suffix}`)}function applyCliProfileEnv(params){let env=params.env??process.env,homedir=params.homedir??os.homedir,profile=params.profile.trim();if(!profile)return;env.BUILDERFORCE_AGENTS_PROFILE=profile;let stateDir=env.BUILDERFORCE_AGENTS_STATE_DIR?.trim()||resolveProfileStateDir(profile,env,homedir);env.BUILDERFORCE_AGENTS_STATE_DIR?.trim()||(env.BUILDERFORCE_AGENTS_STATE_DIR=stateDir),env.BUILDERFORCE_AGENTS_CONFIG_PATH?.trim()||(env.BUILDERFORCE_AGENTS_CONFIG_PATH=path.join(stateDir,`builderforce.json`)),profile===`dev`&&!env.BUILDERFORCE_AGENTS_GATEWAY_PORT?.trim()&&(env.BUILDERFORCE_AGENTS_GATEWAY_PORT=`19001`)}function shouldSkipRespawnForArgv(argv){return hasHelpOrVersion(argv)}const defaultSignals=process$1.platform===`win32`?[`SIGTERM`,`SIGINT`,`SIGBREAK`]:[`SIGTERM`,`SIGINT`,`SIGHUP`,`SIGQUIT`];function attachChildProcessBridge(child,{signals=defaultSignals,onSignal}={}){let listeners=new Map;for(let signal of signals){let listener=()=>{onSignal?.(signal);try{child.kill(signal)}catch{}};try{process$1.on(signal,listener),listeners.set(signal,listener)}catch{}}let detach=()=>{for(let[signal,listener]of listeners)process$1.off(signal,listener);listeners.clear()};return child.once(`exit`,detach),child.once(`error`,detach),{detach}}process$1.title=`builderforce`,installProcessWarningFilter(),normalizeEnv(),process$1.argv.includes(`--no-color`)&&(process$1.env.NO_COLOR=`1`,process$1.env.FORCE_COLOR=`0`);const EXPERIMENTAL_WARNING_FLAG=`--disable-warning=ExperimentalWarning`;function hasExperimentalWarningSuppressed(){let nodeOptions=process$1.env.NODE_OPTIONS??``;if(nodeOptions.includes(EXPERIMENTAL_WARNING_FLAG)||nodeOptions.includes(`--no-warnings`))return!0;for(let arg of process$1.execArgv)if(arg===EXPERIMENTAL_WARNING_FLAG||arg===`--no-warnings`)return!0;return!1}function ensureExperimentalWarningSuppressed(){if(shouldSkipRespawnForArgv(process$1.argv)||isTruthyEnvValue(process$1.env.BUILDERFORCE_AGENTS_NO_RESPAWN)||isTruthyEnvValue(process$1.env.BUILDERFORCE_AGENTS_NODE_OPTIONS_READY)||hasExperimentalWarningSuppressed())return!1;process$1.env.BUILDERFORCE_AGENTS_NODE_OPTIONS_READY=`1`;let child=spawn(process$1.execPath,[EXPERIMENTAL_WARNING_FLAG,...process$1.execArgv,...process$1.argv.slice(1)],{stdio:`inherit`,env:process$1.env});return attachChildProcessBridge(child),child.once(`exit`,(code,signal)=>{if(signal){process$1.exitCode=1;return}process$1.exit(code??1)}),child.once(`error`,error=>{console.error(`[builderforce] Failed to respawn CLI:`,error instanceof Error?error.stack??error.message:error),process$1.exit(1)}),!0}if(process$1.argv=normalizeWindowsArgv(process$1.argv),!ensureExperimentalWarningSuppressed()){let parsed=parseCliProfileArgs(process$1.argv);parsed.ok||(console.error(`[builderforce] ${parsed.error}`),process$1.exit(2)),parsed.profile&&(applyCliProfileEnv({profile:parsed.profile}),process$1.argv=parsed.argv),import(`./run-main-
|
|
2
|
+
import{y as resolveRequiredHomeDir}from"./paths-BHg-VHB4.js";import{t as isValidProfileName}from"./profile-utils-BKdObK6T.js";import{c as hasHelpOrVersion}from"./argv-BgQk38nl.js";import{t as normalizeWindowsArgv}from"./windows-argv-ClCYQujd.js";import"./registry-Cv7CoWAs.js";import"./utils-BP60e80M.js";import"./subsystem-C4b1Von0.js";import"./boolean-ssGoaBPk.js";import{r as normalizeEnv,t as isTruthyEnvValue}from"./env-BoE8QSib.js";import{t as installProcessWarningFilter}from"./warning-filter-nSTjpMIH.js";import{spawn}from"node:child_process";import process$1 from"node:process";import os from"node:os";import path from"node:path";function takeValue(raw,next){if(raw.includes(`=`)){let[,value]=raw.split(`=`,2);return{value:(value??``).trim()||null,consumedNext:!1}}return{value:(next??``).trim()||null,consumedNext:!!next}}function parseCliProfileArgs(argv){if(argv.length<2)return{ok:!0,profile:null,argv};let out=argv.slice(0,2),profile=null,sawDev=!1,sawCommand=!1,args=argv.slice(2);for(let i=0;i<args.length;i+=1){let arg=args[i];if(arg!==void 0){if(sawCommand){out.push(arg);continue}if(arg===`--dev`){if(profile&&profile!==`dev`)return{ok:!1,error:`Cannot combine --dev with --profile`};sawDev=!0,profile=`dev`;continue}if(arg===`--profile`||arg.startsWith(`--profile=`)){if(sawDev)return{ok:!1,error:`Cannot combine --dev with --profile`};let next=args[i+1],{value,consumedNext}=takeValue(arg,next);if(consumedNext&&(i+=1),!value)return{ok:!1,error:`--profile requires a value`};if(!isValidProfileName(value))return{ok:!1,error:`Invalid --profile (use letters, numbers, "_", "-" only)`};profile=value;continue}if(!arg.startsWith(`-`)){sawCommand=!0,out.push(arg);continue}out.push(arg)}}return{ok:!0,profile,argv:out}}function resolveProfileStateDir(profile,env,homedir){let suffix=profile.toLowerCase()===`default`?``:`-${profile}`;return path.join(resolveRequiredHomeDir(env,homedir),`.builderforce${suffix}`)}function applyCliProfileEnv(params){let env=params.env??process.env,homedir=params.homedir??os.homedir,profile=params.profile.trim();if(!profile)return;env.BUILDERFORCE_AGENTS_PROFILE=profile;let stateDir=env.BUILDERFORCE_AGENTS_STATE_DIR?.trim()||resolveProfileStateDir(profile,env,homedir);env.BUILDERFORCE_AGENTS_STATE_DIR?.trim()||(env.BUILDERFORCE_AGENTS_STATE_DIR=stateDir),env.BUILDERFORCE_AGENTS_CONFIG_PATH?.trim()||(env.BUILDERFORCE_AGENTS_CONFIG_PATH=path.join(stateDir,`builderforce.json`)),profile===`dev`&&!env.BUILDERFORCE_AGENTS_GATEWAY_PORT?.trim()&&(env.BUILDERFORCE_AGENTS_GATEWAY_PORT=`19001`)}function shouldSkipRespawnForArgv(argv){return hasHelpOrVersion(argv)}const defaultSignals=process$1.platform===`win32`?[`SIGTERM`,`SIGINT`,`SIGBREAK`]:[`SIGTERM`,`SIGINT`,`SIGHUP`,`SIGQUIT`];function attachChildProcessBridge(child,{signals=defaultSignals,onSignal}={}){let listeners=new Map;for(let signal of signals){let listener=()=>{onSignal?.(signal);try{child.kill(signal)}catch{}};try{process$1.on(signal,listener),listeners.set(signal,listener)}catch{}}let detach=()=>{for(let[signal,listener]of listeners)process$1.off(signal,listener);listeners.clear()};return child.once(`exit`,detach),child.once(`error`,detach),{detach}}process$1.title=`builderforce`,installProcessWarningFilter(),normalizeEnv(),process$1.argv.includes(`--no-color`)&&(process$1.env.NO_COLOR=`1`,process$1.env.FORCE_COLOR=`0`);const EXPERIMENTAL_WARNING_FLAG=`--disable-warning=ExperimentalWarning`;function hasExperimentalWarningSuppressed(){let nodeOptions=process$1.env.NODE_OPTIONS??``;if(nodeOptions.includes(EXPERIMENTAL_WARNING_FLAG)||nodeOptions.includes(`--no-warnings`))return!0;for(let arg of process$1.execArgv)if(arg===EXPERIMENTAL_WARNING_FLAG||arg===`--no-warnings`)return!0;return!1}function ensureExperimentalWarningSuppressed(){if(shouldSkipRespawnForArgv(process$1.argv)||isTruthyEnvValue(process$1.env.BUILDERFORCE_AGENTS_NO_RESPAWN)||isTruthyEnvValue(process$1.env.BUILDERFORCE_AGENTS_NODE_OPTIONS_READY)||hasExperimentalWarningSuppressed())return!1;process$1.env.BUILDERFORCE_AGENTS_NODE_OPTIONS_READY=`1`;let child=spawn(process$1.execPath,[EXPERIMENTAL_WARNING_FLAG,...process$1.execArgv,...process$1.argv.slice(1)],{stdio:`inherit`,env:process$1.env});return attachChildProcessBridge(child),child.once(`exit`,(code,signal)=>{if(signal){process$1.exitCode=1;return}process$1.exit(code??1)}),child.once(`error`,error=>{console.error(`[builderforce] Failed to respawn CLI:`,error instanceof Error?error.stack??error.message:error),process$1.exit(1)}),!0}if(process$1.argv=normalizeWindowsArgv(process$1.argv),!ensureExperimentalWarningSuppressed()){let parsed=parseCliProfileArgs(process$1.argv);parsed.ok||(console.error(`[builderforce] ${parsed.error}`),process$1.exit(2)),parsed.profile&&(applyCliProfileEnv({profile:parsed.profile}),process$1.argv=parsed.argv),import(`./run-main-DQMbgbcF.js`).then(({runCli})=>runCli(process$1.argv)).catch(error=>{console.error(`[builderforce] Failed to start CLI:`,error instanceof Error?error.stack??error.message:error),process$1.exitCode=1})}export{};
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import"./paths-5FcIFMsj.js";import{B as theme,z as isRich}from"./utils-DbaBVFaK.js";import"./session-key-EoB0qaG9.js";import"./builderforce-root-D64_sXEi.js";import{i as defaultRuntime}from"./subsystem-B3TqcCrZ.js";import"./registry-TdK-aV05.js";import"./logger-Bch0bx9c.js";import"./exec-DdcIjeyn.js";import"./agent-scope-DPtjOxzp.js";import"./src-CA0fU67C.js";import"./model-selection-
|
|
1
|
+
import"./paths-5FcIFMsj.js";import{B as theme,z as isRich}from"./utils-DbaBVFaK.js";import"./session-key-EoB0qaG9.js";import"./builderforce-root-D64_sXEi.js";import{i as defaultRuntime}from"./subsystem-B3TqcCrZ.js";import"./registry-TdK-aV05.js";import"./logger-Bch0bx9c.js";import"./exec-DdcIjeyn.js";import"./agent-scope-DPtjOxzp.js";import"./src-CA0fU67C.js";import"./model-selection-DG9J_VTz.js";import"./env-file-D1MDi-AM.js";import"./boolean-Cnh1KNl1.js";import"./env-BIdU5BAp.js";import"./src-DTFqOIQD.js";import"./io-BLBq4T2o.js";import"./manifest-registry-BJCfNV1a.js";import"./config-BgV_FYSq.js";import"./message-channel-D_jXxXQj.js";import"./client-xfoidwPI.js";import"./call-T8ciwMTA.js";import{n as formatTimeAgo}from"./format-relative-niF9gXss.js";import{t as formatDocsLink}from"./links-BgWWaaOT.js";import"./progress-BfOtdN6b.js";import{c as readExecApprovalsSnapshot,p as saveExecApprovals}from"./exec-approvals-BpVPDVtV.js";import{n as callGatewayFromCli}from"./gateway-rpc-B02y0PnE.js";import"./systemd-BG3_QT6W.js";import"./service-D-NLDyK3.js";import{t as renderTable}from"./table-BoCHYKoQ.js";import{t as describeUnknownError}from"./shared-XAatqRQ6.js";import{i as resolveNodeId,r as nodesCallOpts}from"./rpc-CbUnwStf.js";import JSON5 from"json5";import fs from"node:fs/promises";async function readStdin(){let chunks=[];for await(let chunk of process.stdin)chunks.push(Buffer.isBuffer(chunk)?chunk:Buffer.from(String(chunk)));return Buffer.concat(chunks).toString(`utf8`)}async function resolveTargetNodeId(opts){if(opts.gateway)return null;let raw=opts.node?.trim()??``;return raw?await resolveNodeId(opts,raw):null}async function loadSnapshot(opts,nodeId){return await callGatewayFromCli(nodeId?`exec.approvals.node.get`:`exec.approvals.get`,opts,nodeId?{nodeId}:{})}function loadSnapshotLocal(){let snapshot=readExecApprovalsSnapshot();return{path:snapshot.path,exists:snapshot.exists,hash:snapshot.hash,file:snapshot.file}}function saveSnapshotLocal(file){return saveExecApprovals(file),loadSnapshotLocal()}async function loadSnapshotTarget(opts){if(!opts.gateway&&!opts.node)return{snapshot:loadSnapshotLocal(),nodeId:null,source:`local`};let nodeId=await resolveTargetNodeId(opts);return{snapshot:await loadSnapshot(opts,nodeId),nodeId,source:nodeId?`node`:`gateway`}}function exitWithError(message){throw defaultRuntime.error(message),defaultRuntime.exit(1),Error(message)}function requireTrimmedNonEmpty(value,message){let trimmed=value.trim();return trimmed||exitWithError(message),trimmed}async function loadWritableSnapshotTarget(opts){let{snapshot,nodeId,source}=await loadSnapshotTarget(opts);source===`local`&&defaultRuntime.log(theme.muted(`Writing local approvals.`));let targetLabel=source===`local`?`local`:nodeId?`node:${nodeId}`:`gateway`,baseHash=snapshot.hash;return baseHash||exitWithError(`Exec approvals hash missing; reload and retry.`),{snapshot,nodeId,source,targetLabel,baseHash}}async function saveSnapshotTargeted(params){let next=params.source===`local`?saveSnapshotLocal(params.file):await saveSnapshot(params.opts,params.nodeId,params.file,params.baseHash);if(params.opts.json){defaultRuntime.log(JSON.stringify(next));return}defaultRuntime.log(theme.muted(`Target: ${params.targetLabel}`)),renderApprovalsSnapshot(next,params.targetLabel)}function formatCliError(err){let msg=describeUnknownError(err);return msg.includes(`
|
|
2
2
|
`)?msg.split(`
|
|
3
3
|
`)[0]:msg}function renderApprovalsSnapshot(snapshot,targetLabel){let rich=isRich(),heading=text=>rich?theme.heading(text):text,muted=text=>rich?theme.muted(text):text,tableWidth=Math.max(60,(process.stdout.columns??120)-1),file=snapshot.file??{version:1},defaults=file.defaults??{},defaultsParts=[defaults.security?`security=${defaults.security}`:null,defaults.ask?`ask=${defaults.ask}`:null,defaults.askFallback?`askFallback=${defaults.askFallback}`:null,typeof defaults.autoAllowSkills==`boolean`?`autoAllowSkills=${defaults.autoAllowSkills?`on`:`off`}`:null].filter(Boolean),agents=file.agents??{},allowlistRows=[],now=Date.now();for(let[agentId,agent]of Object.entries(agents)){let allowlist=Array.isArray(agent.allowlist)?agent.allowlist:[];for(let entry of allowlist){let pattern=entry?.pattern?.trim()??``;if(!pattern)continue;let lastUsedAt=typeof entry.lastUsedAt==`number`?entry.lastUsedAt:null;allowlistRows.push({Target:targetLabel,Agent:agentId,Pattern:pattern,LastUsed:lastUsedAt?formatTimeAgo(Math.max(0,now-lastUsedAt)):muted(`unknown`)})}}let summaryRows=[{Field:`Target`,Value:targetLabel},{Field:`Path`,Value:snapshot.path},{Field:`Exists`,Value:snapshot.exists?`yes`:`no`},{Field:`Hash`,Value:snapshot.hash},{Field:`Version`,Value:String(file.version??1)},{Field:`Socket`,Value:file.socket?.path??`default`},{Field:`Defaults`,Value:defaultsParts.length>0?defaultsParts.join(`, `):`none`},{Field:`Agents`,Value:String(Object.keys(agents).length)},{Field:`Allowlist`,Value:String(allowlistRows.length)}];if(defaultRuntime.log(heading(`Approvals`)),defaultRuntime.log(renderTable({width:tableWidth,columns:[{key:`Field`,header:`Field`,minWidth:8},{key:`Value`,header:`Value`,minWidth:24,flex:!0}],rows:summaryRows}).trimEnd()),allowlistRows.length===0){defaultRuntime.log(``),defaultRuntime.log(muted(`No allowlist entries.`));return}defaultRuntime.log(``),defaultRuntime.log(heading(`Allowlist`)),defaultRuntime.log(renderTable({width:tableWidth,columns:[{key:`Target`,header:`Target`,minWidth:10},{key:`Agent`,header:`Agent`,minWidth:8},{key:`Pattern`,header:`Pattern`,minWidth:20,flex:!0},{key:`LastUsed`,header:`Last Used`,minWidth:10}],rows:allowlistRows}).trimEnd())}async function saveSnapshot(opts,nodeId,file,baseHash){return await callGatewayFromCli(nodeId?`exec.approvals.node.set`:`exec.approvals.set`,opts,nodeId?{nodeId,file,baseHash}:{file,baseHash})}function resolveAgentKey(value){return(value?.trim()??``)||`*`}function normalizeAllowlistEntry(entry){return(entry?.pattern?.trim()??``)||null}function ensureAgent(file,agentKey){let agents=file.agents??{},entry=agents[agentKey]??{};return file.agents=agents,entry}function isEmptyAgent(agent){let allowlist=Array.isArray(agent.allowlist)?agent.allowlist:[];return!agent.security&&!agent.ask&&!agent.askFallback&&agent.autoAllowSkills===void 0&&allowlist.length===0}async function loadWritableAllowlistAgent(opts){let{snapshot,nodeId,source,targetLabel,baseHash}=await loadWritableSnapshotTarget(opts),file=snapshot.file??{version:1};file.version=1;let agentKey=resolveAgentKey(opts.agent),agent=ensureAgent(file,agentKey);return{nodeId,source,targetLabel,baseHash,file,agentKey,agent,allowlistEntries:Array.isArray(agent.allowlist)?agent.allowlist:[]}}function registerExecApprovalsCli(program){let formatExample=(cmd,desc)=>` ${theme.command(cmd)}\n ${theme.muted(desc)}`,approvals=program.command(`approvals`).alias(`exec-approvals`).description(`Manage exec approvals (gateway or node host)`).addHelpText(`after`,()=>`\n${theme.muted(`Docs:`)} ${formatDocsLink(`/cli/approvals`,`docs.builderforce.ai/cli/approvals`)}\n`);nodesCallOpts(approvals.command(`get`).description(`Fetch exec approvals snapshot`).option(`--node <node>`,`Target node id/name/IP`).option(`--gateway`,`Force gateway approvals`,!1).action(async opts=>{try{let{snapshot,nodeId,source}=await loadSnapshotTarget(opts);if(opts.json){defaultRuntime.log(JSON.stringify(snapshot));return}source===`local`&&(defaultRuntime.log((text=>isRich()?theme.muted(text):text)(`Showing local approvals.`)),defaultRuntime.log(``)),renderApprovalsSnapshot(snapshot,source===`local`?`local`:nodeId?`node:${nodeId}`:`gateway`)}catch(err){defaultRuntime.error(formatCliError(err)),defaultRuntime.exit(1)}})),nodesCallOpts(approvals.command(`set`).description(`Replace exec approvals with a JSON file`).option(`--node <node>`,`Target node id/name/IP`).option(`--gateway`,`Force gateway approvals`,!1).option(`--file <path>`,`Path to JSON file to upload`).option(`--stdin`,`Read JSON from stdin`,!1).action(async opts=>{try{!opts.file&&!opts.stdin&&exitWithError(`Provide --file or --stdin.`),opts.file&&opts.stdin&&exitWithError(`Use either --file or --stdin (not both).`);let{source,nodeId,targetLabel,baseHash}=await loadWritableSnapshotTarget(opts),raw=opts.stdin?await readStdin():await fs.readFile(String(opts.file),`utf8`),file;try{file=JSON5.parse(raw)}catch(err){exitWithError(`Failed to parse approvals JSON: ${String(err)}`)}file.version=1,await saveSnapshotTargeted({opts,source,nodeId,file,baseHash,targetLabel})}catch(err){defaultRuntime.error(formatCliError(err)),defaultRuntime.exit(1)}}));let allowlist=approvals.command(`allowlist`).description(`Edit the per-agent allowlist`).addHelpText(`after`,()=>`\n${theme.heading(`Examples:`)}\n${formatExample(`builderforce approvals allowlist add "~/Projects/**/bin/rg"`,`Allowlist a local binary pattern for the main agent.`)}\n${formatExample(`builderforce approvals allowlist add --agent main --node <id|name|ip> "/usr/bin/uptime"`,`Allowlist on a specific node/agent.`)}\n${formatExample(`builderforce approvals allowlist add --agent "*" "/usr/bin/uname"`,`Allowlist for all agents (wildcard).`)}\n${formatExample(`builderforce approvals allowlist remove "~/Projects/**/bin/rg"`,`Remove an allowlist pattern.`)}\n\n${theme.muted(`Docs:`)} ${formatDocsLink(`/cli/approvals`,`docs.builderforce.ai/cli/approvals`)}\n`);nodesCallOpts(allowlist.command(`add <pattern>`).description(`Add a glob pattern to an allowlist`).option(`--node <node>`,`Target node id/name/IP`).option(`--gateway`,`Force gateway approvals`,!1).option(`--agent <id>`,`Agent id (defaults to "*")`).action(async(pattern,opts)=>{try{let trimmed=requireTrimmedNonEmpty(pattern,`Pattern required.`),{nodeId,source,targetLabel,baseHash,file,agentKey,agent,allowlistEntries}=await loadWritableAllowlistAgent(opts);if(allowlistEntries.some(entry=>normalizeAllowlistEntry(entry)===trimmed)){defaultRuntime.log(`Already allowlisted.`);return}allowlistEntries.push({pattern:trimmed,lastUsedAt:Date.now()}),agent.allowlist=allowlistEntries,file.agents={...file.agents,[agentKey]:agent},await saveSnapshotTargeted({opts,source,nodeId,file,baseHash,targetLabel})}catch(err){defaultRuntime.error(formatCliError(err)),defaultRuntime.exit(1)}})),nodesCallOpts(allowlist.command(`remove <pattern>`).description(`Remove a glob pattern from an allowlist`).option(`--node <node>`,`Target node id/name/IP`).option(`--gateway`,`Force gateway approvals`,!1).option(`--agent <id>`,`Agent id (defaults to "*")`).action(async(pattern,opts)=>{try{let trimmed=requireTrimmedNonEmpty(pattern,`Pattern required.`),{nodeId,source,targetLabel,baseHash,file,agentKey,agent,allowlistEntries}=await loadWritableAllowlistAgent(opts),nextEntries=allowlistEntries.filter(entry=>normalizeAllowlistEntry(entry)!==trimmed);if(nextEntries.length===allowlistEntries.length){defaultRuntime.log(`Pattern not found.`);return}if(nextEntries.length===0?delete agent.allowlist:agent.allowlist=nextEntries,isEmptyAgent(agent)){let agents={...file.agents};delete agents[agentKey],file.agents=Object.keys(agents).length>0?agents:void 0}else file.agents={...file.agents,[agentKey]:agent};await saveSnapshotTargeted({opts,source,nodeId,file,baseHash,targetLabel})}catch(err){defaultRuntime.error(formatCliError(err)),defaultRuntime.exit(1)}}))}export{registerExecApprovalsCli};
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import"./paths-BHg-VHB4.js";import"./registry-Cv7CoWAs.js";import{R as isRich,z as theme}from"./utils-BP60e80M.js";import{p as defaultRuntime}from"./subsystem-C4b1Von0.js";import"./boolean-ssGoaBPk.js";import"./env-BoE8QSib.js";import"./auth-profiles-
|
|
1
|
+
import"./paths-BHg-VHB4.js";import"./registry-Cv7CoWAs.js";import{R as isRich,z as theme}from"./utils-BP60e80M.js";import{p as defaultRuntime}from"./subsystem-C4b1Von0.js";import"./boolean-ssGoaBPk.js";import"./env-BoE8QSib.js";import"./auth-profiles-pt7Tr4HA.js";import"./src-DvWaTze9.js";import"./logger-wuOr7HKl.js";import"./session-key-CksCYipj.js";import"./builderforce-root-DY1qbWNX.js";import"./exec-COgsU9ql.js";import"./agent-scope-CufEmNj_.js";import"./env-file-DeS6x2OL.js";import"./src-HrLX5bhG.js";import"./io-D9hC2aG0.js";import"./manifest-registry-009gLJ4l.js";import"./config-BpChMIJ6.js";import"./client-CGgp3zkQ.js";import"./call-Du2LiaX6.js";import"./message-channel-z5YRpR2d.js";import{n as formatTimeAgo}from"./format-relative-CruqE52s.js";import{c as readExecApprovalsSnapshot,p as saveExecApprovals}from"./exec-approvals-D7ZPAZpt.js";import{t as formatDocsLink}from"./links-BKzP7VVP.js";import"./progress-Cqb-jAjT.js";import{n as callGatewayFromCli}from"./gateway-rpc-ff1RVb0_.js";import"./systemd-DdVd5Yet.js";import"./service-EKJG69M3.js";import{t as renderTable}from"./table-BFCCZDsp.js";import{t as describeUnknownError}from"./shared-rsjJRWla.js";import{i as resolveNodeId,r as nodesCallOpts}from"./rpc-Cwm4gchc.js";import JSON5 from"json5";import fs from"node:fs/promises";async function readStdin(){let chunks=[];for await(let chunk of process.stdin)chunks.push(Buffer.isBuffer(chunk)?chunk:Buffer.from(String(chunk)));return Buffer.concat(chunks).toString(`utf8`)}async function resolveTargetNodeId(opts){if(opts.gateway)return null;let raw=opts.node?.trim()??``;return raw?await resolveNodeId(opts,raw):null}async function loadSnapshot(opts,nodeId){return await callGatewayFromCli(nodeId?`exec.approvals.node.get`:`exec.approvals.get`,opts,nodeId?{nodeId}:{})}function loadSnapshotLocal(){let snapshot=readExecApprovalsSnapshot();return{path:snapshot.path,exists:snapshot.exists,hash:snapshot.hash,file:snapshot.file}}function saveSnapshotLocal(file){return saveExecApprovals(file),loadSnapshotLocal()}async function loadSnapshotTarget(opts){if(!opts.gateway&&!opts.node)return{snapshot:loadSnapshotLocal(),nodeId:null,source:`local`};let nodeId=await resolveTargetNodeId(opts);return{snapshot:await loadSnapshot(opts,nodeId),nodeId,source:nodeId?`node`:`gateway`}}function exitWithError(message){throw defaultRuntime.error(message),defaultRuntime.exit(1),Error(message)}function requireTrimmedNonEmpty(value,message){let trimmed=value.trim();return trimmed||exitWithError(message),trimmed}async function loadWritableSnapshotTarget(opts){let{snapshot,nodeId,source}=await loadSnapshotTarget(opts);source===`local`&&defaultRuntime.log(theme.muted(`Writing local approvals.`));let targetLabel=source===`local`?`local`:nodeId?`node:${nodeId}`:`gateway`,baseHash=snapshot.hash;return baseHash||exitWithError(`Exec approvals hash missing; reload and retry.`),{snapshot,nodeId,source,targetLabel,baseHash}}async function saveSnapshotTargeted(params){let next=params.source===`local`?saveSnapshotLocal(params.file):await saveSnapshot(params.opts,params.nodeId,params.file,params.baseHash);if(params.opts.json){defaultRuntime.log(JSON.stringify(next));return}defaultRuntime.log(theme.muted(`Target: ${params.targetLabel}`)),renderApprovalsSnapshot(next,params.targetLabel)}function formatCliError(err){let msg=describeUnknownError(err);return msg.includes(`
|
|
2
2
|
`)?msg.split(`
|
|
3
3
|
`)[0]:msg}function renderApprovalsSnapshot(snapshot,targetLabel){let rich=isRich(),heading=text=>rich?theme.heading(text):text,muted=text=>rich?theme.muted(text):text,tableWidth=Math.max(60,(process.stdout.columns??120)-1),file=snapshot.file??{version:1},defaults=file.defaults??{},defaultsParts=[defaults.security?`security=${defaults.security}`:null,defaults.ask?`ask=${defaults.ask}`:null,defaults.askFallback?`askFallback=${defaults.askFallback}`:null,typeof defaults.autoAllowSkills==`boolean`?`autoAllowSkills=${defaults.autoAllowSkills?`on`:`off`}`:null].filter(Boolean),agents=file.agents??{},allowlistRows=[],now=Date.now();for(let[agentId,agent]of Object.entries(agents)){let allowlist=Array.isArray(agent.allowlist)?agent.allowlist:[];for(let entry of allowlist){let pattern=entry?.pattern?.trim()??``;if(!pattern)continue;let lastUsedAt=typeof entry.lastUsedAt==`number`?entry.lastUsedAt:null;allowlistRows.push({Target:targetLabel,Agent:agentId,Pattern:pattern,LastUsed:lastUsedAt?formatTimeAgo(Math.max(0,now-lastUsedAt)):muted(`unknown`)})}}let summaryRows=[{Field:`Target`,Value:targetLabel},{Field:`Path`,Value:snapshot.path},{Field:`Exists`,Value:snapshot.exists?`yes`:`no`},{Field:`Hash`,Value:snapshot.hash},{Field:`Version`,Value:String(file.version??1)},{Field:`Socket`,Value:file.socket?.path??`default`},{Field:`Defaults`,Value:defaultsParts.length>0?defaultsParts.join(`, `):`none`},{Field:`Agents`,Value:String(Object.keys(agents).length)},{Field:`Allowlist`,Value:String(allowlistRows.length)}];if(defaultRuntime.log(heading(`Approvals`)),defaultRuntime.log(renderTable({width:tableWidth,columns:[{key:`Field`,header:`Field`,minWidth:8},{key:`Value`,header:`Value`,minWidth:24,flex:!0}],rows:summaryRows}).trimEnd()),allowlistRows.length===0){defaultRuntime.log(``),defaultRuntime.log(muted(`No allowlist entries.`));return}defaultRuntime.log(``),defaultRuntime.log(heading(`Allowlist`)),defaultRuntime.log(renderTable({width:tableWidth,columns:[{key:`Target`,header:`Target`,minWidth:10},{key:`Agent`,header:`Agent`,minWidth:8},{key:`Pattern`,header:`Pattern`,minWidth:20,flex:!0},{key:`LastUsed`,header:`Last Used`,minWidth:10}],rows:allowlistRows}).trimEnd())}async function saveSnapshot(opts,nodeId,file,baseHash){return await callGatewayFromCli(nodeId?`exec.approvals.node.set`:`exec.approvals.set`,opts,nodeId?{nodeId,file,baseHash}:{file,baseHash})}function resolveAgentKey(value){return(value?.trim()??``)||`*`}function normalizeAllowlistEntry(entry){return(entry?.pattern?.trim()??``)||null}function ensureAgent(file,agentKey){let agents=file.agents??{},entry=agents[agentKey]??{};return file.agents=agents,entry}function isEmptyAgent(agent){let allowlist=Array.isArray(agent.allowlist)?agent.allowlist:[];return!agent.security&&!agent.ask&&!agent.askFallback&&agent.autoAllowSkills===void 0&&allowlist.length===0}async function loadWritableAllowlistAgent(opts){let{snapshot,nodeId,source,targetLabel,baseHash}=await loadWritableSnapshotTarget(opts),file=snapshot.file??{version:1};file.version=1;let agentKey=resolveAgentKey(opts.agent),agent=ensureAgent(file,agentKey);return{nodeId,source,targetLabel,baseHash,file,agentKey,agent,allowlistEntries:Array.isArray(agent.allowlist)?agent.allowlist:[]}}function registerExecApprovalsCli(program){let formatExample=(cmd,desc)=>` ${theme.command(cmd)}\n ${theme.muted(desc)}`,approvals=program.command(`approvals`).alias(`exec-approvals`).description(`Manage exec approvals (gateway or node host)`).addHelpText(`after`,()=>`\n${theme.muted(`Docs:`)} ${formatDocsLink(`/cli/approvals`,`docs.builderforce.ai/cli/approvals`)}\n`);nodesCallOpts(approvals.command(`get`).description(`Fetch exec approvals snapshot`).option(`--node <node>`,`Target node id/name/IP`).option(`--gateway`,`Force gateway approvals`,!1).action(async opts=>{try{let{snapshot,nodeId,source}=await loadSnapshotTarget(opts);if(opts.json){defaultRuntime.log(JSON.stringify(snapshot));return}source===`local`&&(defaultRuntime.log((text=>isRich()?theme.muted(text):text)(`Showing local approvals.`)),defaultRuntime.log(``)),renderApprovalsSnapshot(snapshot,source===`local`?`local`:nodeId?`node:${nodeId}`:`gateway`)}catch(err){defaultRuntime.error(formatCliError(err)),defaultRuntime.exit(1)}})),nodesCallOpts(approvals.command(`set`).description(`Replace exec approvals with a JSON file`).option(`--node <node>`,`Target node id/name/IP`).option(`--gateway`,`Force gateway approvals`,!1).option(`--file <path>`,`Path to JSON file to upload`).option(`--stdin`,`Read JSON from stdin`,!1).action(async opts=>{try{!opts.file&&!opts.stdin&&exitWithError(`Provide --file or --stdin.`),opts.file&&opts.stdin&&exitWithError(`Use either --file or --stdin (not both).`);let{source,nodeId,targetLabel,baseHash}=await loadWritableSnapshotTarget(opts),raw=opts.stdin?await readStdin():await fs.readFile(String(opts.file),`utf8`),file;try{file=JSON5.parse(raw)}catch(err){exitWithError(`Failed to parse approvals JSON: ${String(err)}`)}file.version=1,await saveSnapshotTargeted({opts,source,nodeId,file,baseHash,targetLabel})}catch(err){defaultRuntime.error(formatCliError(err)),defaultRuntime.exit(1)}}));let allowlist=approvals.command(`allowlist`).description(`Edit the per-agent allowlist`).addHelpText(`after`,()=>`\n${theme.heading(`Examples:`)}\n${formatExample(`builderforce approvals allowlist add "~/Projects/**/bin/rg"`,`Allowlist a local binary pattern for the main agent.`)}\n${formatExample(`builderforce approvals allowlist add --agent main --node <id|name|ip> "/usr/bin/uptime"`,`Allowlist on a specific node/agent.`)}\n${formatExample(`builderforce approvals allowlist add --agent "*" "/usr/bin/uname"`,`Allowlist for all agents (wildcard).`)}\n${formatExample(`builderforce approvals allowlist remove "~/Projects/**/bin/rg"`,`Remove an allowlist pattern.`)}\n\n${theme.muted(`Docs:`)} ${formatDocsLink(`/cli/approvals`,`docs.builderforce.ai/cli/approvals`)}\n`);nodesCallOpts(allowlist.command(`add <pattern>`).description(`Add a glob pattern to an allowlist`).option(`--node <node>`,`Target node id/name/IP`).option(`--gateway`,`Force gateway approvals`,!1).option(`--agent <id>`,`Agent id (defaults to "*")`).action(async(pattern,opts)=>{try{let trimmed=requireTrimmedNonEmpty(pattern,`Pattern required.`),{nodeId,source,targetLabel,baseHash,file,agentKey,agent,allowlistEntries}=await loadWritableAllowlistAgent(opts);if(allowlistEntries.some(entry=>normalizeAllowlistEntry(entry)===trimmed)){defaultRuntime.log(`Already allowlisted.`);return}allowlistEntries.push({pattern:trimmed,lastUsedAt:Date.now()}),agent.allowlist=allowlistEntries,file.agents={...file.agents,[agentKey]:agent},await saveSnapshotTargeted({opts,source,nodeId,file,baseHash,targetLabel})}catch(err){defaultRuntime.error(formatCliError(err)),defaultRuntime.exit(1)}})),nodesCallOpts(allowlist.command(`remove <pattern>`).description(`Remove a glob pattern from an allowlist`).option(`--node <node>`,`Target node id/name/IP`).option(`--gateway`,`Force gateway approvals`,!1).option(`--agent <id>`,`Agent id (defaults to "*")`).action(async(pattern,opts)=>{try{let trimmed=requireTrimmedNonEmpty(pattern,`Pattern required.`),{nodeId,source,targetLabel,baseHash,file,agentKey,agent,allowlistEntries}=await loadWritableAllowlistAgent(opts),nextEntries=allowlistEntries.filter(entry=>normalizeAllowlistEntry(entry)!==trimmed);if(nextEntries.length===allowlistEntries.length){defaultRuntime.log(`Pattern not found.`);return}if(nextEntries.length===0?delete agent.allowlist:agent.allowlist=nextEntries,isEmptyAgent(agent)){let agents={...file.agents};delete agents[agentKey],file.agents=Object.keys(agents).length>0?agents:void 0}else file.agents={...file.agents,[agentKey]:agent};await saveSnapshotTargeted({opts,source,nodeId,file,baseHash,targetLabel})}catch(err){defaultRuntime.error(formatCliError(err)),defaultRuntime.exit(1)}}))}export{registerExecApprovalsCli};
|