@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,4 +1,4 @@
|
|
|
1
|
-
import"./paths-BHg-VHB4.js";import"./registry-Cv7CoWAs.js";import{z as theme}from"./utils-BP60e80M.js";import"./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{z as theme}from"./utils-BP60e80M.js";import"./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{t as normalizeBaseUrl}from"./normalize-base-url-D_sv6Zgt.js";import{a as upsertSharedEnvVar,i as readSharedEnvVar}from"./env-file-DeS6x2OL.js";import"./src-HrLX5bhG.js";import{U as VERSION,a as readConfigFileSnapshot,c as writeConfigFile}from"./io-D9hC2aG0.js";import"./manifest-registry-009gLJ4l.js";import"./config-BpChMIJ6.js";import"./model-discovery-D0i1JpiL.js";import"./model-catalog-BeBXvbFm.js";import"./frontmatter-CaY7feZm.js";import"./skills-D3MwwPOH.js";import"./plugin-skills-pSFUbhg_.js";import"./client-CGgp3zkQ.js";import"./call-Du2LiaX6.js";import"./message-channel-z5YRpR2d.js";import"./sessions-BA8Se_bT.js";import{_ as isBuilderForceAgentsProject,n as loadProjectContext,o as updateProjectContextFields}from"./project-context-store-CIUcwUP_.js";import"./plugins-1Mn6RiNf.js";import"./accounts-BkTLjSrD.js";import"./bindings-CKSDlQ1i.js";import"./accounts-Cx82nj4E.js";import"./image-ops-CotJhwRR.js";import"./redact-CgO7wehS.js";import"./errors-tAt19c1E.js";import"./embedded-helpers-DdU30lmt.js";import"./sandbox-DvKMuAXL.js";import"./chrome-CFmcixaE.js";import"./tailscale-DV-yOmYe.js";import"./auth-ChecwOXS.js";import"./server-context-CttALzrW.js";import"./routes-_iZdG1Fo.js";import"./paths-BnOjueoX.js";import"./ssrf-DJXLYZ0d.js";import"./store-DHD2IEgd.js";import"./ports-DTku9NSx.js";import"./trash-C3zmJ_O7.js";import"./accounts-DcoaLXKI.js";import"./paths-ClsbsPQP.js";import"./tool-images-CCpqFtrL.js";import"./tool-display-Cs4hDP1f.js";import{n as fetchWithTimeout}from"./fetch-timeout-Cb8Yj9Tw.js";import"./builderforcellm-syscheck-9ksvqHYX.js";import"./usage-format-5sp5AMSu.js";import{f as initializeBuilderForceAgentsProject}from"./project-context-D3Mx4maV.js";import{r as saveMambaState}from"./mamba-state-engine-CV4nDcCk.js";import"./transformers-stream-Buj40qHl.js";import"./builderforce-directory-sync-DQ6u60yX.js";import"./shared-BBOiNdjf.js";import{_ as setOpenrouterApiKey,c as setAnthropicApiKey,u as setGeminiApiKey}from"./onboard-auth.credentials-DneFSdYg.js";import"./model-picker-CGDNPRPc.js";import"./auth-choice.apply.transformers-DmdxpHGz.js";import{t as runTui}from"./tui-JfWoLGIV.js";import"./tui-stream-assembler-Br15rhRH.js";import{i as selectTenantAndToken,n as builderforceApiFetch,r as ensureProjectMapping,t as authenticateWithPassword}from"./builderforce-api-DKgXl8BH.js";import path from"node:path";import fs from"node:fs/promises";import{confirm,intro,note,outro,password,select,spinner,text}from"@clack/prompts";import{Command}from"commander";const DEFAULT_REGISTRY_URL=`https://api.builderforce.ai`;function resolveRegistryUrl(){return normalizeBaseUrl(readSharedEnvVar(`BUILDERFORCE_AGENTS_LINK_URL`)??DEFAULT_REGISTRY_URL)}function resolveAuthHeaders(){let apiKey=readSharedEnvVar(`BUILDERFORCE_AGENTS_LINK_API_KEY`);return apiKey?{Authorization:`Bearer ${apiKey}`}:{}}function isV2Package(pkg){return pkg.version===`2.0`}async function fetchAgentPackage(params){let url=`${normalizeBaseUrl(params.registryUrl??resolveRegistryUrl())}/api/agents/${encodeURIComponent(params.agentId)}/package`,res;try{res=await fetchWithTimeout(url,{method:`GET`,headers:{Accept:`application/json`,...resolveAuthHeaders()}},3e4)}catch(err){let msg=err instanceof Error?err.message:String(err);throw Error(`Network error fetching agent package: ${msg}`,{cause:err})}if(!res.ok){let text=await res.text().catch(()=>``);throw Error(`Registry returned ${res.status} ${res.statusText}${text?`: ${text}`:``}`)}let pkg=await res.json();if(!pkg.version||!pkg.platform||!pkg.name||!pkg.base_model)throw Error(`Invalid agent package: missing required fields (version, platform, name, base_model)`);return pkg}function resolveWorkforceModelRef(params){return readSharedEnvVar(`BUILDERFORCE_AGENTS_LINK_API_KEY`)?`builderforcellm/workforce-${params.agentId}`:params.pkg.base_model}async function installWorkforceAgent(params){let registryUrl=params.registryUrl??resolveRegistryUrl(),spin=spinner();spin.start(`Fetching agent package for "${params.agentId}" from ${registryUrl}…`);let pkg;try{pkg=await fetchAgentPackage({agentId:params.agentId,registryUrl}),spin.stop(`Package downloaded: ${pkg.name} (v${pkg.version})`)}catch(err){throw spin.stop(`Failed to download agent package`),err}let modelRef=resolveWorkforceModelRef({agentId:params.agentId,pkg}),hasMambaState=isV2Package(pkg)&&!!pkg.mamba_state,installed={agentId:params.agentId,name:pkg.name,title:pkg.title,baseModel:pkg.base_model,modelRef,loraArtifactKey:pkg.r2_artifact_key,packageVersion:pkg.version,hasMambaState,installedAt:new Date().toISOString(),registryUrl};return await updateProjectContextFields(params.projectRoot,{customAgent:installed,llm:{provider:`builderforcellm`,model:modelRef}}),hasMambaState&&isV2Package(pkg)&&pkg.mamba_state&&await saveMambaState(params.projectRoot,pkg.mamba_state),[`Workforce agent installed: ${pkg.name} (${params.agentId})`,` Base model: ${pkg.base_model}`,` Package: v${pkg.version}`,` Mamba state: ${hasMambaState?`yes (persistent memory)`:`no`}`,` Model ref: ${modelRef}`].join(`
|
|
2
2
|
`)}async function showWorkforceAgentInfo(projectRoot){let ctx=await loadProjectContext(projectRoot);if(!ctx?.customAgent){note(`No Workforce agent is installed in this project.
|
|
3
3
|
|
|
4
4
|
Run: builderforce agent install <agentId>`,`No agent installed`);return}let a=ctx.customAgent;note([theme.heading(`Workforce Agent`),` ID: ${a.agentId}`,` Name: ${a.name}${a.title?` — ${a.title}`:``}`,` Base model: ${a.baseModel}`,` Model ref: ${a.modelRef}`,` Package: v${a.packageVersion}`,` Mamba state: ${a.hasMambaState?`yes (persistent memory)`:`no`}`,` Installed: ${a.installedAt}`,` Registry: ${a.registryUrl}`].join(`
|
|
@@ -6,9 +6,9 @@ Run: builderforce agent install <agentId>`,`No agent installed`);return}let a=ct
|
|
|
6
6
|
`)+`
|
|
7
7
|
|
|
8
8
|
`),await runTui({message:opts.message})}async function readJsonFile(filePath){try{let content=await fs.readFile(filePath,`utf-8`);return JSON.parse(content)}catch{return null}}async function fileExists(filePath){try{return await fs.access(filePath),!0}catch{return!1}}async function detectLanguagesFromFiles(projectRoot){let extLangMap={".ts":`typescript`,".tsx":`typescript`,".js":`javascript`,".jsx":`javascript`,".mjs":`javascript`,".cjs":`javascript`,".py":`python`,".go":`go`,".rs":`rust`,".java":`java`,".kt":`kotlin`,".swift":`swift`,".rb":`ruby`,".php":`php`,".cs":`csharp`,".cpp":`cpp`,".c":`c`,".dart":`dart`,".ex":`elixir`,".exs":`elixir`,".hs":`haskell`},counts={},ignoreDirs=new Set([`node_modules`,`.git`,`dist`,`build`,`.builderForceAgents`,`__pycache__`,`.next`,`out`,`coverage`,`vendor`]);async function walk(dir,depth){if(depth>3)return;let entries;try{entries=await fs.readdir(dir,{withFileTypes:!0})}catch{return}for(let entry of entries)if(entry.isDirectory())!ignoreDirs.has(entry.name)&&!entry.name.startsWith(`.`)&&await walk(path.join(dir,entry.name),depth+1);else{let lang=extLangMap[path.extname(entry.name).toLowerCase()];lang&&(counts[lang]=(counts[lang]??0)+1)}}return await walk(projectRoot,0),Object.entries(counts).toSorted((a,b)=>b[1]-a[1]).map(([lang])=>lang)}async function detectFrameworks(projectRoot,pkgDeps){let found=[],all=Object.keys(pkgDeps);for(let[match,label]of[[`next`,`next.js`],[`nuxt`,`nuxt`],[/^@remix-run/,`remix`],[`astro`,`astro`],[`@sveltejs/kit`,`sveltekit`],[`svelte`,`svelte`],[`react`,`react`],[`vue`,`@vue`],[`angular`,`angular`],[`express`,`express`],[`fastify`,`fastify`],[`hono`,`hono`],[`koa`,`koa`],[`nest`,`nestjs`],[/^@nestjs/,`nestjs`],[`trpc`,`trpc`],[/^@trpc/,`trpc`],[`drizzle-orm`,`drizzle`],[`prisma`,`prisma`],[/^@prisma/,`prisma`],[`mongoose`,`mongoose`],[`typeorm`,`typeorm`],[`django`,`django`],[`flask`,`flask`],[`fastapi`,`fastapi`],[`tailwindcss`,`tailwind`]])found.includes(label)||(typeof match==`string`?all.some(k=>k===match||k.startsWith(`${match}/`)||k.startsWith(`@${match}/`))&&found.push(label):all.some(k=>match.test(k))&&found.push(label));for(let[file,label]of[[`next.config.js`,`next.js`],[`next.config.ts`,`next.js`],[`nuxt.config.ts`,`nuxt`],[`astro.config.mjs`,`astro`],[`astro.config.ts`,`astro`],[`svelte.config.js`,`sveltekit`],[`vite.config.ts`,`vite`],[`vite.config.js`,`vite`],[`angular.json`,`angular`],[`remix.config.js`,`remix`],[`tailwind.config.ts`,`tailwind`],[`tailwind.config.js`,`tailwind`]])!found.includes(label)&&await fileExists(path.join(projectRoot,file))&&found.push(label);return[...new Set(found)]}async function detectTestFramework(projectRoot,pkgDeps){let all=Object.keys(pkgDeps);if(all.includes(`vitest`))return`vitest`;if(all.includes(`jest`)||all.some(k=>k.startsWith(`@jest/`)))return`jest`;if(all.includes(`mocha`))return`mocha`;if(all.includes(`jasmine`))return`jasmine`;if(all.includes(`ava`))return`ava`;if(all.includes(`pytest`)||await fileExists(path.join(projectRoot,`pytest.ini`)))return`pytest`;if(await fileExists(path.join(projectRoot,`vitest.config.ts`)))return`vitest`;if(await fileExists(path.join(projectRoot,`jest.config.js`))||await fileExists(path.join(projectRoot,`jest.config.ts`)))return`jest`}async function detectLintingTools(projectRoot,pkgDeps){let tools=[],all=Object.keys(pkgDeps);return(all.includes(`eslint`)||await fileExists(path.join(projectRoot,`.eslintrc.js`)))&&tools.push(`eslint`),all.includes(`oxlint`)&&tools.push(`oxlint`),(all.includes(`prettier`)||await fileExists(path.join(projectRoot,`.prettierrc`)))&&tools.push(`prettier`),all.includes(`biome`)&&tools.push(`biome`),(all.includes(`ruff`)||await fileExists(path.join(projectRoot,`ruff.toml`)))&&tools.push(`ruff`),all.includes(`pylint`)&&tools.push(`pylint`),tools}async function detectBuildSystem(projectRoot,pkgDeps){let all=Object.keys(pkgDeps);if(all.includes(`turbo`))return`turborepo`;if(all.includes(`nx`))return`nx`;if(all.includes(`tsdown`)||all.includes(`tsup`))return all.includes(`tsdown`)?`tsdown`:`tsup`;if(all.includes(`vite`))return`vite`;if(all.includes(`webpack`))return`webpack`;if(all.includes(`rollup`))return`rollup`;if(all.includes(`esbuild`))return`esbuild`;if(await fileExists(path.join(projectRoot,`Makefile`)))return`make`;if(await fileExists(path.join(projectRoot,`CMakeLists.txt`)))return`cmake`;if(await fileExists(path.join(projectRoot,`Cargo.toml`)))return`cargo`;if(await fileExists(path.join(projectRoot,`pyproject.toml`)))return`poetry`;if(await fileExists(path.join(projectRoot,`setup.py`)))return`setuptools`;if(await fileExists(path.join(projectRoot,`pnpm-lock.yaml`)))return`pnpm`;if(await fileExists(path.join(projectRoot,`yarn.lock`)))return`yarn`;if(await fileExists(path.join(projectRoot,`package-lock.json`)))return`npm`}async function detectProjectInfo(projectRoot){let pkg=await readJsonFile(path.join(projectRoot,`package.json`)),pkgName=typeof pkg?.name==`string`?pkg.name:``,pkgDesc=typeof pkg?.description==`string`?pkg.description:``,allDeps={...pkg?.dependencies,...pkg?.devDependencies,...pkg?.peerDependencies},[langsByFile,frameworks,testFramework,lintingTools,buildSystem]=await Promise.all([detectLanguagesFromFiles(projectRoot),detectFrameworks(projectRoot,allDeps),detectTestFramework(projectRoot,allDeps),detectLintingTools(projectRoot,allDeps),detectBuildSystem(projectRoot,allDeps)]),languages=await fileExists(path.join(projectRoot,`tsconfig.json`))?[`typescript`,...langsByFile.filter(l=>l!==`typescript`)]:langsByFile;return{projectName:pkgName||path.basename(projectRoot),description:pkgDesc,languages:[...new Set(languages)].slice(0,6),frameworks,buildSystem,testFramework,lintingTools}}const PROVIDERS=[{id:`builderforcellm`,label:`BuilderForceAgentsLLM (recommended) — Builderforce.AI`,defaultModel:`builderforcellm/auto`},{id:`anthropic`,label:`Anthropic (Claude)`,envVar:`ANTHROPIC_API_KEY`,defaultModel:`anthropic/claude-sonnet-4-6`},{id:`openai`,label:`OpenAI (GPT-4o)`,envVar:`OPENAI_API_KEY`,defaultModel:`openai/gpt-4o`},{id:`openrouter`,label:`OpenRouter`,envVar:`OPENROUTER_API_KEY`,defaultModel:`openrouter/auto`},{id:`gemini`,label:`Google Gemini`,envVar:`GEMINI_API_KEY`,defaultModel:`google/gemini-2.0-flash`},{id:`ollama`,label:`Ollama (local)`,envVar:`OLLAMA_API_KEY`,defaultModel:`ollama/llama3.3`},{id:`vllm`,label:`vLLM / llama.cpp / LiteLLM (local)`,defaultModel:`vllm/your-model-id`},{id:`workforce`,label:`Builderforce Workforce Agent (custom trained LLM)`,defaultModel:`builderforcellm/auto`}];function isProviderConfigured(p){if(!p.envVar)return!1;let val=process.env[p.envVar];return typeof val==`string`&&val.trim().length>0}async function applyLlmProviderModel(projectRoot,provider,modelRef){try{await updateProjectContextFields(projectRoot,{llm:{provider,model:modelRef}})}catch{}}async function promptWorkforceAgentProvider(projectRoot){let registryUrl=await text({message:`Builderforce registry URL:`,initialValue:DEFAULT_REGISTRY_URL});if(typeof registryUrl==`symbol`)return null;let agentIdInput=await text({message:`Workforce agent ID (from the Builderforce registry):`,placeholder:`e.g. 550e8400-e29b-41d4-a716-446655440000`});if(typeof agentIdInput==`symbol`||!agentIdInput.trim())return null;let agentId=agentIdInput.trim();try{return await installWorkforceAgent({agentId,projectRoot,registryUrl:normalizeBaseUrl(registryUrl.trim())||DEFAULT_REGISTRY_URL})}catch(err){return note([err instanceof Error?err.message:String(err),``,`You can retry later with: builderforce agent install <agentId>`].join(`
|
|
9
|
-
`),`Failed to install Workforce agent`),null}}async function promptLlmProvider(projectRoot){let chosen=await select({message:`LLM provider to use for AI agents:`,options:[...PROVIDERS.map(p=>({value:p.id,label:isProviderConfigured(p)?`${p.label} ✓ configured`:p.label,hint:p.id===`builderforcellm`?`managed proxy (no local API key needed)`:isProviderConfigured(p)?`${p.envVar} is set`:p.envVar?`needs ${p.envVar}`:`enter server URL`})),{value:`skip`,label:`Skip — configure later`}]});if(typeof chosen==`symbol`||chosen===`skip`)return null;if(chosen===`workforce`)return promptWorkforceAgentProvider(projectRoot);let meta=PROVIDERS.find(p=>p.id===chosen);if(chosen===`builderforcellm`||chosen===`anthropic`||chosen===`openai`||chosen===`openrouter`||chosen===`gemini`){if(chosen===`builderforcellm`){if(!readSharedEnvVar(`BUILDERFORCE_API_KEY`)?.trim()){let{promptBuilderforceOnboarding}=await import(`./builderforce-onboarding-
|
|
10
|
-
`),`Skipped — BuilderForceAgentsLLM won't be available yet`)}return await applyLlmProviderModel(projectRoot,chosen,meta.defaultModel),`${meta.label} configured, model → ${meta.defaultModel}`}if(isProviderConfigured(meta))return note(`${meta.envVar} is already set — keeping existing credential.`,meta.label),await applyLlmProviderModel(projectRoot,chosen,meta.defaultModel),`${meta.label} (existing credential kept), model → ${meta.defaultModel}`;let apiKey=await password({message:`${meta.label} API key:`});if(typeof apiKey==`symbol`||!apiKey.trim())return null;let keyValue=apiKey.trim();return chosen===`anthropic`?await setAnthropicApiKey(keyValue):chosen===`openrouter`?await setOpenrouterApiKey(keyValue):chosen===`gemini`?await setGeminiApiKey(keyValue):upsertSharedEnvVar({key:`OPENAI_API_KEY`,value:keyValue}),await applyLlmProviderModel(projectRoot,chosen,meta.defaultModel),`${meta.label} configured, model → ${meta.defaultModel}`}if(chosen===`ollama`){let ollamaUrl=await text({message:`Ollama base URL:`,initialValue:`http://127.0.0.1:11434`});if(typeof ollamaUrl==`symbol`)return null;let ollamaModel=await text({message:`Ollama model to use as default:`,initialValue:`llama3.3`,placeholder:`llama3.3 or qwen2.5-coder:32b or deepseek-r1:32b`});if(typeof ollamaModel==`symbol`)return null;let modelRef=`ollama/${ollamaModel.trim()||`llama3.3`}`;upsertSharedEnvVar({key:`OLLAMA_API_KEY`,value:`ollama-local`});let normalizedUrl=normalizeBaseUrl(ollamaUrl.trim());if(normalizedUrl!==`http://127.0.0.1:11434`)try{let existing=(await readConfigFileSnapshot())?.config??{};await writeConfigFile({...existing,models:{...existing.models,providers:{...existing.models?.providers,ollama:{baseUrl:normalizedUrl,api:`ollama`,apiKey:`ollama-local`,models:[]}}}})}catch{}return await applyLlmProviderModel(projectRoot,`ollama`,modelRef),`Ollama configured (${normalizedUrl}), model → ${modelRef}`}if(chosen===`vllm`){let vllmUrl=await text({message:`Server base URL (e.g. http://127.0.0.1:8000/v1):`,initialValue:`http://127.0.0.1:8000/v1`});if(typeof vllmUrl==`symbol`)return null;let vllmModelId=await text({message:`Model ID served at that endpoint:`,placeholder:`meta-llama/Llama-3.1-8B-Instruct`});if(typeof vllmModelId==`symbol`||!vllmModelId.trim())return null;let modelId=vllmModelId.trim(),modelRef=`vllm/${modelId}`;try{let existing=(await readConfigFileSnapshot())?.config??{};await writeConfigFile({...existing,models:{...existing.models,providers:{...existing.models?.providers,vllm:{baseUrl:normalizeBaseUrl(vllmUrl.trim()),api:`openai-completions`,apiKey:`VLLM_API_KEY`,models:[{id:modelId,name:modelId,reasoning:!1,input:[`text`],cost:{input:0,output:0,cacheRead:0,cacheWrite:0},contextWindow:128e3,maxTokens:8192}]}}}})}catch{}return await applyLlmProviderModel(projectRoot,`vllm`,modelRef),`vLLM configured (${vllmUrl.trim()}), model → ${modelRef}`}return null}async function
|
|
11
|
-
`),`Already connected to Builderforce`),`Builderforce: already connected (${existingUrl})`}if(readSharedEnvVar(`BUILDERFORCE_SKIPPED`)===`1`)return null;let connect=await confirm({message:`Connect to Builderforce? (optional — manage projects, tasks & agents across your mesh)`,initialValue:!0});if(typeof connect==`symbol`||!connect)return upsertSharedEnvVar({key:`BUILDERFORCE_SKIPPED`,value:`1`}),note(`You can connect to Builderforce anytime with: builderforce init --reconnect`,`Skipped`),null;let urlInput=await text({message:`Orchestration API URL (Builderforce):`,initialValue:`https://api.builderforce.ai`});if(typeof urlInput==`symbol`)return null;let serverUrl=normalizeBaseUrl(urlInput.trim())||`https://api.builderforce.ai`,
|
|
9
|
+
`),`Failed to install Workforce agent`),null}}async function promptLlmProvider(projectRoot){let chosen=await select({message:`LLM provider to use for AI agents:`,options:[...PROVIDERS.map(p=>({value:p.id,label:isProviderConfigured(p)?`${p.label} ✓ configured`:p.label,hint:p.id===`builderforcellm`?`managed proxy (no local API key needed)`:isProviderConfigured(p)?`${p.envVar} is set`:p.envVar?`needs ${p.envVar}`:`enter server URL`})),{value:`skip`,label:`Skip — configure later`}]});if(typeof chosen==`symbol`||chosen===`skip`)return null;if(chosen===`workforce`)return promptWorkforceAgentProvider(projectRoot);let meta=PROVIDERS.find(p=>p.id===chosen);if(chosen===`builderforcellm`||chosen===`anthropic`||chosen===`openai`||chosen===`openrouter`||chosen===`gemini`){if(chosen===`builderforcellm`){if(!readSharedEnvVar(`BUILDERFORCE_API_KEY`)?.trim()){let{promptBuilderforceOnboarding}=await import(`./builderforce-onboarding-RXFb0gct.js`);await promptBuilderforceOnboarding({projectRoot,defaultInstanceName:path.basename(projectRoot)||`builderforce`,forcePrompt:!0}),readSharedEnvVar(`BUILDERFORCE_API_KEY`)?.trim()||note([`BuilderForceAgentsLLM requires a Builderforce account to work.`,`You can connect later with: builderforce init --reconnect`,`Or switch to a different provider with: builderforce init`].join(`
|
|
10
|
+
`),`Skipped — BuilderForceAgentsLLM won't be available yet`)}return await applyLlmProviderModel(projectRoot,chosen,meta.defaultModel),`${meta.label} configured, model → ${meta.defaultModel}`}if(isProviderConfigured(meta))return note(`${meta.envVar} is already set — keeping existing credential.`,meta.label),await applyLlmProviderModel(projectRoot,chosen,meta.defaultModel),`${meta.label} (existing credential kept), model → ${meta.defaultModel}`;let apiKey=await password({message:`${meta.label} API key:`});if(typeof apiKey==`symbol`||!apiKey.trim())return null;let keyValue=apiKey.trim();return chosen===`anthropic`?await setAnthropicApiKey(keyValue):chosen===`openrouter`?await setOpenrouterApiKey(keyValue):chosen===`gemini`?await setGeminiApiKey(keyValue):upsertSharedEnvVar({key:`OPENAI_API_KEY`,value:keyValue}),await applyLlmProviderModel(projectRoot,chosen,meta.defaultModel),`${meta.label} configured, model → ${meta.defaultModel}`}if(chosen===`ollama`){let ollamaUrl=await text({message:`Ollama base URL:`,initialValue:`http://127.0.0.1:11434`});if(typeof ollamaUrl==`symbol`)return null;let ollamaModel=await text({message:`Ollama model to use as default:`,initialValue:`llama3.3`,placeholder:`llama3.3 or qwen2.5-coder:32b or deepseek-r1:32b`});if(typeof ollamaModel==`symbol`)return null;let modelRef=`ollama/${ollamaModel.trim()||`llama3.3`}`;upsertSharedEnvVar({key:`OLLAMA_API_KEY`,value:`ollama-local`});let normalizedUrl=normalizeBaseUrl(ollamaUrl.trim());if(normalizedUrl!==`http://127.0.0.1:11434`)try{let existing=(await readConfigFileSnapshot())?.config??{};await writeConfigFile({...existing,models:{...existing.models,providers:{...existing.models?.providers,ollama:{baseUrl:normalizedUrl,api:`ollama`,apiKey:`ollama-local`,models:[]}}}})}catch{}return await applyLlmProviderModel(projectRoot,`ollama`,modelRef),`Ollama configured (${normalizedUrl}), model → ${modelRef}`}if(chosen===`vllm`){let vllmUrl=await text({message:`Server base URL (e.g. http://127.0.0.1:8000/v1):`,initialValue:`http://127.0.0.1:8000/v1`});if(typeof vllmUrl==`symbol`)return null;let vllmModelId=await text({message:`Model ID served at that endpoint:`,placeholder:`meta-llama/Llama-3.1-8B-Instruct`});if(typeof vllmModelId==`symbol`||!vllmModelId.trim())return null;let modelId=vllmModelId.trim(),modelRef=`vllm/${modelId}`;try{let existing=(await readConfigFileSnapshot())?.config??{};await writeConfigFile({...existing,models:{...existing.models,providers:{...existing.models?.providers,vllm:{baseUrl:normalizeBaseUrl(vllmUrl.trim()),api:`openai-completions`,apiKey:`VLLM_API_KEY`,models:[{id:modelId,name:modelId,reasoning:!1,input:[`text`],cost:{input:0,output:0,cacheRead:0,cacheWrite:0},contextWindow:128e3,maxTokens:8192}]}}}})}catch{}return await applyLlmProviderModel(projectRoot,`vllm`,modelRef),`vLLM configured (${vllmUrl.trim()}), model → ${modelRef}`}return null}async function ensureProjectMappingFromStoredCreds(params){let serverUrl=readSharedEnvVar(`BUILDERFORCE_URL`)??`https://api.builderforce.ai`,webToken=readSharedEnvVar(`BUILDERFORCE_WEB_TOKEN`),tenantIdRaw=readSharedEnvVar(`BUILDERFORCE_TENANT_ID`);if(!webToken||!tenantIdRaw)return;let tenantId=Number(tenantIdRaw);if(!Number.isFinite(tenantId)||tenantId<=0)return;let ctx=await loadProjectContext(params.projectRoot).catch(()=>null),agentNodeId=ctx?.builderforce?.instanceId?.trim();if(!agentNodeId)return;let tenantJwtRes=await builderforceApiFetch(`${serverUrl}/api/auth/tenant-token`,{method:`POST`,token:webToken,body:JSON.stringify({tenantId})}).catch(()=>null);if(!tenantJwtRes?.token)return;let mapped=await ensureProjectMapping({serverUrl,tenantJwt:tenantJwtRes.token,projectRoot:params.projectRoot,projectName:params.projectName,description:params.description,agentNodeId});mapped&&await updateProjectContextFields(params.projectRoot,{builderforce:{instanceId:agentNodeId,...ctx?.builderforce,projectId:mapped.projectId}}).catch(()=>void 0)}async function promptBuilderforceSetup(projectRoot,defaultInstanceName){if(readSharedEnvVar(`BUILDERFORCE_API_KEY`)){let existingUrl=readSharedEnvVar(`BUILDERFORCE_URL`)??`https://api.builderforce.ai`,existingTenantId=readSharedEnvVar(`BUILDERFORCE_TENANT_ID`),existingCtx=await loadProjectContext(projectRoot).catch(()=>null),agentNodeLabel=existingCtx?.builderforce?.instanceSlug??existingCtx?.builderforce?.instanceName??existingCtx?.builderforce?.instanceId??`(registered)`;return note([`URL: ${existingUrl}`,`Tenant: ${existingTenantId??`unknown`}`,`AgentNode: ${agentNodeLabel}`,``,`Run 'builderforce init --reconnect' to link a different account.`].join(`
|
|
11
|
+
`),`Already connected to Builderforce`),`Builderforce: already connected (${existingUrl})`}if(readSharedEnvVar(`BUILDERFORCE_SKIPPED`)===`1`)return null;let connect=await confirm({message:`Connect to Builderforce? (optional — manage projects, tasks & agents across your mesh)`,initialValue:!0});if(typeof connect==`symbol`||!connect)return upsertSharedEnvVar({key:`BUILDERFORCE_SKIPPED`,value:`1`}),note(`You can connect to Builderforce anytime with: builderforce init --reconnect`,`Skipped`),null;let urlInput=await text({message:`Orchestration API URL (Builderforce):`,initialValue:`https://api.builderforce.ai`});if(typeof urlInput==`symbol`)return null;let serverUrl=normalizeBaseUrl(urlInput.trim())||`https://api.builderforce.ai`,webToken=await authenticateWithPassword({serverUrl,defaultInstanceName});if(!webToken)return null;let tenant=await selectTenantAndToken({serverUrl,webToken,defaultInstanceName});if(!tenant)return null;let{tenantId,tenantJwt}=tenant,agentNodeNameInput=await text({message:`AgentNode instance name (shown in dashboard):`,initialValue:defaultInstanceName});if(typeof agentNodeNameInput==`symbol`)return null;let agentNodeName=agentNodeNameInput.trim()||defaultInstanceName,agentNodeSpin=spinner();agentNodeSpin.start(`Registering agentNode instance…`);let agentNodeId=``,agentNodeSlug=``,apiKey=``,projectId=``,projectAction=`unknown`;try{let res=await builderforceApiFetch(`${serverUrl}/api/agent-hosts`,{method:`POST`,token:tenantJwt,body:JSON.stringify({name:agentNodeName})});agentNodeId=String(res.agentHost.id),agentNodeSlug=res.agentHost.slug,apiKey=res.apiKey;let mapped=await ensureProjectMapping({serverUrl,tenantJwt,agentNodeId,projectRoot,projectName:defaultInstanceName,description:`builderForceAgents project at ${projectRoot}`});mapped&&(projectId=mapped.projectId,projectAction=mapped.action),agentNodeSpin.stop(`AgentNode "${res.agentHost.name}" registered`)}catch(err){return agentNodeSpin.stop(`AgentNode registration failed`),note(String(err instanceof Error?err.message:err),`Error`),null}upsertSharedEnvVar({key:`BUILDERFORCE_URL`,value:serverUrl}),upsertSharedEnvVar({key:`BUILDERFORCE_WEB_TOKEN`,value:webToken}),upsertSharedEnvVar({key:`BUILDERFORCE_TENANT_ID`,value:String(tenantId)}),upsertSharedEnvVar({key:`BUILDERFORCE_API_KEY`,value:apiKey});try{await updateProjectContextFields(projectRoot,{builderforce:{instanceId:agentNodeId,instanceSlug:agentNodeSlug,instanceName:agentNodeName,...projectId?{projectId}:{},tenantId,url:serverUrl}})}catch{}return note([`AgentNode API key saved to ~/.builderforce/.env`,`This key was shown once — it is hashed on the server.`,`Instance slug: ${agentNodeSlug} · tenant: ${tenantId}`,projectId?`Project ${projectAction}: ${projectId}`:`Project mapping: not available`].join(`
|
|
12
12
|
`),`Builderforce connected`),`Builderforce: ${agentNodeName} (${agentNodeSlug}) on tenant ${tenantId}`}function createBuilderForceAgentsCommand(){let cmd=new Command(`project`);return cmd.description(`Manage builderForceAgents project context`).addCommand(createStatusCommand()),cmd}function createInitCommand(){return new Command(`init`).description(`Initialize a project with builderForceAgents`).argument(`[path]`,`Project directory path`,`.`).action(async projectPath=>{let projectRoot=projectPath===`.`?process.cwd():projectPath;if(await isBuilderForceAgentsProject(projectRoot)){await runBuilderForceAgentsSession(projectRoot);return}intro(theme.accent(`builderForceAgents`));let detectSpin=spinner();detectSpin.start(`Detecting project info...`);let detected=await detectProjectInfo(projectRoot);detectSpin.stop(`Project info detected`),note([`name: ${detected.projectName}`,`languages: ${detected.languages.join(`, `)||`(none detected)`}`,`frameworks: ${detected.frameworks.join(`, `)||`(none detected)`}`,`build: ${detected.buildSystem??`(unknown)`}`,`test: ${detected.testFramework??`(unknown)`}`,`lint: ${detected.lintingTools.join(`, `)||`(none detected)`}`].join(`
|
|
13
13
|
`),`Auto-detected`);let projectNameInput=await text({message:`Project name:`,initialValue:detected.projectName});if(typeof projectNameInput==`symbol`){outro(theme.muted(`Cancelled`));return}let descriptionInput=await text({message:`Project description:`,initialValue:detected.description,placeholder:`A brief description of what this project does`});if(typeof descriptionInput==`symbol`){outro(theme.muted(`Cancelled`));return}let languagesInput=await text({message:`Primary languages (comma-separated):`,initialValue:detected.languages.join(`, `),placeholder:`typescript, javascript`});if(typeof languagesInput==`symbol`){outro(theme.muted(`Cancelled`));return}let frameworksInput=await text({message:`Frameworks used (comma-separated):`,initialValue:detected.frameworks.join(`, `),placeholder:`express, react`});if(typeof frameworksInput==`symbol`){outro(theme.muted(`Cancelled`));return}let spin=spinner();spin.start(`Setting up .builderforce/...`);try{await initializeBuilderForceAgentsProject(projectRoot,{projectName:projectNameInput||detected.projectName,description:descriptionInput||detected.description,languages:languagesInput.trim().length>0?languagesInput.split(`,`).map(l=>l.trim()).filter(Boolean):detected.languages,frameworks:frameworksInput.trim().length>0?frameworksInput.split(`,`).map(f=>f.trim()).filter(Boolean):detected.frameworks,buildSystem:detected.buildSystem,testFramework:detected.testFramework,lintingTools:detected.lintingTools}),spin.stop(theme.success(`builderForceAgents initialized!`)),note([` ${theme.muted(`context.yaml`)} – project metadata (edit to tune AI understanding)`,` ${theme.muted(`architecture.md`)} – high-level design docs`,` ${theme.muted(`rules.yaml`)} – coding standards & conventions`].join(`
|
|
14
14
|
`),`.builderforce/ created`),await promptLlmProvider(projectRoot),await promptBuilderforceSetup(projectRoot,projectNameInput||detected.projectName),await ensureProjectMappingFromStoredCreds({projectRoot,projectName:projectNameInput||detected.projectName,description:descriptionInput||detected.description});let aiPopulate=await confirm({message:`Use an AI agent to populate context.yaml, architecture.md, and rules.yaml now?`,initialValue:!0});await runBuilderForceAgentsSession(projectRoot,{message:typeof aiPopulate!=`symbol`&&aiPopulate?`Analyze this project and populate .builderforce/context.yaml, architecture.md, and rules.yaml with accurate project context`:void 0})}catch(error){spin.stop(theme.error(`Failed to initialize project`)),outro(theme.error(error instanceof Error?error.message:String(error)))}})}function createStatusCommand(){return new Command(`status`).description(`Show builderForceAgents project status and context`).argument(`[path]`,`Project directory path`,`.`).action(async projectPath=>{let projectRoot=projectPath===`.`?process.cwd():projectPath;if(!await isBuilderForceAgentsProject(projectRoot)){console.log(theme.warn(`Project is not initialized with builderForceAgents`)),console.log(theme.muted(`Run 'builderforce init' to initialize`));return}console.log(theme.success(`✓ builderForceAgents project detected`)),console.log(theme.muted(` Location: ${projectRoot}/.builderforce/`))})}function createAgentCommand(){let cmd=new Command(`workforce`).description(`Manage Builderforce Workforce agents (custom trained LLMs)`);return cmd.addCommand(new Command(`install`).description(`Install a Workforce agent from the Builderforce registry`).argument(`<agentId>`,`Agent UUID or name from the Workforce Registry`).option(`--registry <url>`,`Builderforce registry URL`,DEFAULT_REGISTRY_URL).option(`--path <dir>`,`Project directory`,`.`).action(async(agentId,opts)=>{let projectRoot=opts.path===`.`?process.cwd():opts.path;intro(theme.accent(`builderForceAgents`)+` `+theme.muted(`agent install`));try{let summary=await installWorkforceAgent({agentId,projectRoot,registryUrl:opts.registry});outro(theme.success(`Agent installed!
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import"./paths-5FcIFMsj.js";import{B as theme}from"./utils-DbaBVFaK.js";import"./embedded-helpers-
|
|
1
|
+
import"./paths-5FcIFMsj.js";import{B as theme}from"./utils-DbaBVFaK.js";import"./embedded-helpers-C9jpiwlw.js";import"./session-key-EoB0qaG9.js";import"./builderforce-root-D64_sXEi.js";import"./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{t as normalizeBaseUrl}from"./normalize-base-url-DmugqkQ6.js";import{a as upsertSharedEnvVar,i as readSharedEnvVar}from"./env-file-D1MDi-AM.js";import"./boolean-Cnh1KNl1.js";import"./env-BIdU5BAp.js";import"./src-DTFqOIQD.js";import{U as VERSION,a as readConfigFileSnapshot,c as writeConfigFile}from"./io-BLBq4T2o.js";import"./manifest-registry-BJCfNV1a.js";import"./config-BgV_FYSq.js";import"./model-catalog-DjNiebr7.js";import"./sandbox-C4AKi2EX.js";import"./chrome-DXt86tmV.js";import"./tailscale-DLkpGquM.js";import"./auth-lebUHrkd.js";import"./server-context-CQ2v4BAx.js";import"./frontmatter-3D1EdC1L.js";import"./skills-Ba4ftrB-.js";import"./plugin-skills-B11rggZh.js";import"./routes-DZntyPY6.js";import"./redact-BHdfp2MZ.js";import"./errors-B1MIg3g-.js";import"./paths-cR8ct-Y3.js";import"./ssrf-p9k-iapc.js";import"./image-ops-C8IUQKjn.js";import"./store-CmHBQ-yX.js";import"./ports-DgmEDNOm.js";import"./trash-DD2Hc5oq.js";import"./sessions-BuZVmOWt.js";import"./message-channel-D_jXxXQj.js";import"./plugins-D5zP6ENo.js";import"./accounts-o35LU_iy.js";import"./accounts-rmXEiebi.js";import"./accounts-BLueHgKj.js";import"./bindings-DR59065T.js";import"./paths-DJ6rztqJ.js";import"./tool-images-B7b_OiMz.js";import"./tool-display-ByOZtWvA.js";import{n as fetchWithTimeout}from"./fetch-timeout-BIqoSVfA.js";import{_ as isBuilderForceAgentsProject,n as loadProjectContext,o as updateProjectContextFields}from"./project-context-store-wcq7lXuI.js";import"./client-xfoidwPI.js";import"./call-T8ciwMTA.js";import"./builderforcellm-syscheck-F5JMAr3p.js";import"./usage-format-DGf8ZWPH.js";import{f as initializeBuilderForceAgentsProject}from"./project-context-CJj0Inz-.js";import{r as saveMambaState}from"./mamba-state-engine-CoGqoBTH.js";import"./transformers-stream-D7nRu4Qu.js";import"./builderforce-directory-sync-DAH62b3b.js";import"./shared-C2orjbTD.js";import{_ as setOpenrouterApiKey,c as setAnthropicApiKey,u as setGeminiApiKey}from"./onboard-auth.credentials-DpitLlzw.js";import"./model-picker-EIhpfOZa.js";import"./auth-choice.apply.transformers-Df9l_jRz.js";import{t as runTui}from"./tui-DnVRxfI8.js";import"./tui-stream-assembler-8ud9oyMK.js";import{i as selectTenantAndToken,n as builderforceApiFetch,r as ensureProjectMapping,t as authenticateWithPassword}from"./builderforce-api-DcPAGsla.js";import path from"node:path";import fs from"node:fs/promises";import{confirm,intro,note,outro,password,select,spinner,text}from"@clack/prompts";import{Command}from"commander";const DEFAULT_REGISTRY_URL=`https://api.builderforce.ai`;function resolveRegistryUrl(){return normalizeBaseUrl(readSharedEnvVar(`BUILDERFORCE_AGENTS_LINK_URL`)??DEFAULT_REGISTRY_URL)}function resolveAuthHeaders(){let apiKey=readSharedEnvVar(`BUILDERFORCE_AGENTS_LINK_API_KEY`);return apiKey?{Authorization:`Bearer ${apiKey}`}:{}}function isV2Package(pkg){return pkg.version===`2.0`}async function fetchAgentPackage(params){let url=`${normalizeBaseUrl(params.registryUrl??resolveRegistryUrl())}/api/agents/${encodeURIComponent(params.agentId)}/package`,res;try{res=await fetchWithTimeout(url,{method:`GET`,headers:{Accept:`application/json`,...resolveAuthHeaders()}},3e4)}catch(err){let msg=err instanceof Error?err.message:String(err);throw Error(`Network error fetching agent package: ${msg}`,{cause:err})}if(!res.ok){let text=await res.text().catch(()=>``);throw Error(`Registry returned ${res.status} ${res.statusText}${text?`: ${text}`:``}`)}let pkg=await res.json();if(!pkg.version||!pkg.platform||!pkg.name||!pkg.base_model)throw Error(`Invalid agent package: missing required fields (version, platform, name, base_model)`);return pkg}function resolveWorkforceModelRef(params){return readSharedEnvVar(`BUILDERFORCE_AGENTS_LINK_API_KEY`)?`builderforcellm/workforce-${params.agentId}`:params.pkg.base_model}async function installWorkforceAgent(params){let registryUrl=params.registryUrl??resolveRegistryUrl(),spin=spinner();spin.start(`Fetching agent package for "${params.agentId}" from ${registryUrl}…`);let pkg;try{pkg=await fetchAgentPackage({agentId:params.agentId,registryUrl}),spin.stop(`Package downloaded: ${pkg.name} (v${pkg.version})`)}catch(err){throw spin.stop(`Failed to download agent package`),err}let modelRef=resolveWorkforceModelRef({agentId:params.agentId,pkg}),hasMambaState=isV2Package(pkg)&&!!pkg.mamba_state,installed={agentId:params.agentId,name:pkg.name,title:pkg.title,baseModel:pkg.base_model,modelRef,loraArtifactKey:pkg.r2_artifact_key,packageVersion:pkg.version,hasMambaState,installedAt:new Date().toISOString(),registryUrl};return await updateProjectContextFields(params.projectRoot,{customAgent:installed,llm:{provider:`builderforcellm`,model:modelRef}}),hasMambaState&&isV2Package(pkg)&&pkg.mamba_state&&await saveMambaState(params.projectRoot,pkg.mamba_state),[`Workforce agent installed: ${pkg.name} (${params.agentId})`,` Base model: ${pkg.base_model}`,` Package: v${pkg.version}`,` Mamba state: ${hasMambaState?`yes (persistent memory)`:`no`}`,` Model ref: ${modelRef}`].join(`
|
|
2
2
|
`)}async function showWorkforceAgentInfo(projectRoot){let ctx=await loadProjectContext(projectRoot);if(!ctx?.customAgent){note(`No Workforce agent is installed in this project.
|
|
3
3
|
|
|
4
4
|
Run: builderforce agent install <agentId>`,`No agent installed`);return}let a=ctx.customAgent;note([theme.heading(`Workforce Agent`),` ID: ${a.agentId}`,` Name: ${a.name}${a.title?` — ${a.title}`:``}`,` Base model: ${a.baseModel}`,` Model ref: ${a.modelRef}`,` Package: v${a.packageVersion}`,` Mamba state: ${a.hasMambaState?`yes (persistent memory)`:`no`}`,` Installed: ${a.installedAt}`,` Registry: ${a.registryUrl}`].join(`
|
|
@@ -6,9 +6,9 @@ Run: builderforce agent install <agentId>`,`No agent installed`);return}let a=ct
|
|
|
6
6
|
`)+`
|
|
7
7
|
|
|
8
8
|
`),await runTui({message:opts.message})}async function readJsonFile(filePath){try{let content=await fs.readFile(filePath,`utf-8`);return JSON.parse(content)}catch{return null}}async function fileExists(filePath){try{return await fs.access(filePath),!0}catch{return!1}}async function detectLanguagesFromFiles(projectRoot){let extLangMap={".ts":`typescript`,".tsx":`typescript`,".js":`javascript`,".jsx":`javascript`,".mjs":`javascript`,".cjs":`javascript`,".py":`python`,".go":`go`,".rs":`rust`,".java":`java`,".kt":`kotlin`,".swift":`swift`,".rb":`ruby`,".php":`php`,".cs":`csharp`,".cpp":`cpp`,".c":`c`,".dart":`dart`,".ex":`elixir`,".exs":`elixir`,".hs":`haskell`},counts={},ignoreDirs=new Set([`node_modules`,`.git`,`dist`,`build`,`.builderForceAgents`,`__pycache__`,`.next`,`out`,`coverage`,`vendor`]);async function walk(dir,depth){if(depth>3)return;let entries;try{entries=await fs.readdir(dir,{withFileTypes:!0})}catch{return}for(let entry of entries)if(entry.isDirectory())!ignoreDirs.has(entry.name)&&!entry.name.startsWith(`.`)&&await walk(path.join(dir,entry.name),depth+1);else{let lang=extLangMap[path.extname(entry.name).toLowerCase()];lang&&(counts[lang]=(counts[lang]??0)+1)}}return await walk(projectRoot,0),Object.entries(counts).toSorted((a,b)=>b[1]-a[1]).map(([lang])=>lang)}async function detectFrameworks(projectRoot,pkgDeps){let found=[],all=Object.keys(pkgDeps);for(let[match,label]of[[`next`,`next.js`],[`nuxt`,`nuxt`],[/^@remix-run/,`remix`],[`astro`,`astro`],[`@sveltejs/kit`,`sveltekit`],[`svelte`,`svelte`],[`react`,`react`],[`vue`,`@vue`],[`angular`,`angular`],[`express`,`express`],[`fastify`,`fastify`],[`hono`,`hono`],[`koa`,`koa`],[`nest`,`nestjs`],[/^@nestjs/,`nestjs`],[`trpc`,`trpc`],[/^@trpc/,`trpc`],[`drizzle-orm`,`drizzle`],[`prisma`,`prisma`],[/^@prisma/,`prisma`],[`mongoose`,`mongoose`],[`typeorm`,`typeorm`],[`django`,`django`],[`flask`,`flask`],[`fastapi`,`fastapi`],[`tailwindcss`,`tailwind`]])found.includes(label)||(typeof match==`string`?all.some(k=>k===match||k.startsWith(`${match}/`)||k.startsWith(`@${match}/`))&&found.push(label):all.some(k=>match.test(k))&&found.push(label));for(let[file,label]of[[`next.config.js`,`next.js`],[`next.config.ts`,`next.js`],[`nuxt.config.ts`,`nuxt`],[`astro.config.mjs`,`astro`],[`astro.config.ts`,`astro`],[`svelte.config.js`,`sveltekit`],[`vite.config.ts`,`vite`],[`vite.config.js`,`vite`],[`angular.json`,`angular`],[`remix.config.js`,`remix`],[`tailwind.config.ts`,`tailwind`],[`tailwind.config.js`,`tailwind`]])!found.includes(label)&&await fileExists(path.join(projectRoot,file))&&found.push(label);return[...new Set(found)]}async function detectTestFramework(projectRoot,pkgDeps){let all=Object.keys(pkgDeps);if(all.includes(`vitest`))return`vitest`;if(all.includes(`jest`)||all.some(k=>k.startsWith(`@jest/`)))return`jest`;if(all.includes(`mocha`))return`mocha`;if(all.includes(`jasmine`))return`jasmine`;if(all.includes(`ava`))return`ava`;if(all.includes(`pytest`)||await fileExists(path.join(projectRoot,`pytest.ini`)))return`pytest`;if(await fileExists(path.join(projectRoot,`vitest.config.ts`)))return`vitest`;if(await fileExists(path.join(projectRoot,`jest.config.js`))||await fileExists(path.join(projectRoot,`jest.config.ts`)))return`jest`}async function detectLintingTools(projectRoot,pkgDeps){let tools=[],all=Object.keys(pkgDeps);return(all.includes(`eslint`)||await fileExists(path.join(projectRoot,`.eslintrc.js`)))&&tools.push(`eslint`),all.includes(`oxlint`)&&tools.push(`oxlint`),(all.includes(`prettier`)||await fileExists(path.join(projectRoot,`.prettierrc`)))&&tools.push(`prettier`),all.includes(`biome`)&&tools.push(`biome`),(all.includes(`ruff`)||await fileExists(path.join(projectRoot,`ruff.toml`)))&&tools.push(`ruff`),all.includes(`pylint`)&&tools.push(`pylint`),tools}async function detectBuildSystem(projectRoot,pkgDeps){let all=Object.keys(pkgDeps);if(all.includes(`turbo`))return`turborepo`;if(all.includes(`nx`))return`nx`;if(all.includes(`tsdown`)||all.includes(`tsup`))return all.includes(`tsdown`)?`tsdown`:`tsup`;if(all.includes(`vite`))return`vite`;if(all.includes(`webpack`))return`webpack`;if(all.includes(`rollup`))return`rollup`;if(all.includes(`esbuild`))return`esbuild`;if(await fileExists(path.join(projectRoot,`Makefile`)))return`make`;if(await fileExists(path.join(projectRoot,`CMakeLists.txt`)))return`cmake`;if(await fileExists(path.join(projectRoot,`Cargo.toml`)))return`cargo`;if(await fileExists(path.join(projectRoot,`pyproject.toml`)))return`poetry`;if(await fileExists(path.join(projectRoot,`setup.py`)))return`setuptools`;if(await fileExists(path.join(projectRoot,`pnpm-lock.yaml`)))return`pnpm`;if(await fileExists(path.join(projectRoot,`yarn.lock`)))return`yarn`;if(await fileExists(path.join(projectRoot,`package-lock.json`)))return`npm`}async function detectProjectInfo(projectRoot){let pkg=await readJsonFile(path.join(projectRoot,`package.json`)),pkgName=typeof pkg?.name==`string`?pkg.name:``,pkgDesc=typeof pkg?.description==`string`?pkg.description:``,allDeps={...pkg?.dependencies,...pkg?.devDependencies,...pkg?.peerDependencies},[langsByFile,frameworks,testFramework,lintingTools,buildSystem]=await Promise.all([detectLanguagesFromFiles(projectRoot),detectFrameworks(projectRoot,allDeps),detectTestFramework(projectRoot,allDeps),detectLintingTools(projectRoot,allDeps),detectBuildSystem(projectRoot,allDeps)]),languages=await fileExists(path.join(projectRoot,`tsconfig.json`))?[`typescript`,...langsByFile.filter(l=>l!==`typescript`)]:langsByFile;return{projectName:pkgName||path.basename(projectRoot),description:pkgDesc,languages:[...new Set(languages)].slice(0,6),frameworks,buildSystem,testFramework,lintingTools}}const PROVIDERS=[{id:`builderforcellm`,label:`BuilderForceAgentsLLM (recommended) — Builderforce.AI`,defaultModel:`builderforcellm/auto`},{id:`anthropic`,label:`Anthropic (Claude)`,envVar:`ANTHROPIC_API_KEY`,defaultModel:`anthropic/claude-sonnet-4-6`},{id:`openai`,label:`OpenAI (GPT-4o)`,envVar:`OPENAI_API_KEY`,defaultModel:`openai/gpt-4o`},{id:`openrouter`,label:`OpenRouter`,envVar:`OPENROUTER_API_KEY`,defaultModel:`openrouter/auto`},{id:`gemini`,label:`Google Gemini`,envVar:`GEMINI_API_KEY`,defaultModel:`google/gemini-2.0-flash`},{id:`ollama`,label:`Ollama (local)`,envVar:`OLLAMA_API_KEY`,defaultModel:`ollama/llama3.3`},{id:`vllm`,label:`vLLM / llama.cpp / LiteLLM (local)`,defaultModel:`vllm/your-model-id`},{id:`workforce`,label:`Builderforce Workforce Agent (custom trained LLM)`,defaultModel:`builderforcellm/auto`}];function isProviderConfigured(p){if(!p.envVar)return!1;let val=process.env[p.envVar];return typeof val==`string`&&val.trim().length>0}async function applyLlmProviderModel(projectRoot,provider,modelRef){try{await updateProjectContextFields(projectRoot,{llm:{provider,model:modelRef}})}catch{}}async function promptWorkforceAgentProvider(projectRoot){let registryUrl=await text({message:`Builderforce registry URL:`,initialValue:DEFAULT_REGISTRY_URL});if(typeof registryUrl==`symbol`)return null;let agentIdInput=await text({message:`Workforce agent ID (from the Builderforce registry):`,placeholder:`e.g. 550e8400-e29b-41d4-a716-446655440000`});if(typeof agentIdInput==`symbol`||!agentIdInput.trim())return null;let agentId=agentIdInput.trim();try{return await installWorkforceAgent({agentId,projectRoot,registryUrl:normalizeBaseUrl(registryUrl.trim())||DEFAULT_REGISTRY_URL})}catch(err){return note([err instanceof Error?err.message:String(err),``,`You can retry later with: builderforce agent install <agentId>`].join(`
|
|
9
|
-
`),`Failed to install Workforce agent`),null}}async function promptLlmProvider(projectRoot){let chosen=await select({message:`LLM provider to use for AI agents:`,options:[...PROVIDERS.map(p=>({value:p.id,label:isProviderConfigured(p)?`${p.label} ✓ configured`:p.label,hint:p.id===`builderforcellm`?`managed proxy (no local API key needed)`:isProviderConfigured(p)?`${p.envVar} is set`:p.envVar?`needs ${p.envVar}`:`enter server URL`})),{value:`skip`,label:`Skip — configure later`}]});if(typeof chosen==`symbol`||chosen===`skip`)return null;if(chosen===`workforce`)return promptWorkforceAgentProvider(projectRoot);let meta=PROVIDERS.find(p=>p.id===chosen);if(chosen===`builderforcellm`||chosen===`anthropic`||chosen===`openai`||chosen===`openrouter`||chosen===`gemini`){if(chosen===`builderforcellm`){if(!readSharedEnvVar(`BUILDERFORCE_API_KEY`)?.trim()){let{promptBuilderforceOnboarding}=await import(`./builderforce-onboarding-
|
|
10
|
-
`),`Skipped — BuilderForceAgentsLLM won't be available yet`)}return await applyLlmProviderModel(projectRoot,chosen,meta.defaultModel),`${meta.label} configured, model → ${meta.defaultModel}`}if(isProviderConfigured(meta))return note(`${meta.envVar} is already set — keeping existing credential.`,meta.label),await applyLlmProviderModel(projectRoot,chosen,meta.defaultModel),`${meta.label} (existing credential kept), model → ${meta.defaultModel}`;let apiKey=await password({message:`${meta.label} API key:`});if(typeof apiKey==`symbol`||!apiKey.trim())return null;let keyValue=apiKey.trim();return chosen===`anthropic`?await setAnthropicApiKey(keyValue):chosen===`openrouter`?await setOpenrouterApiKey(keyValue):chosen===`gemini`?await setGeminiApiKey(keyValue):upsertSharedEnvVar({key:`OPENAI_API_KEY`,value:keyValue}),await applyLlmProviderModel(projectRoot,chosen,meta.defaultModel),`${meta.label} configured, model → ${meta.defaultModel}`}if(chosen===`ollama`){let ollamaUrl=await text({message:`Ollama base URL:`,initialValue:`http://127.0.0.1:11434`});if(typeof ollamaUrl==`symbol`)return null;let ollamaModel=await text({message:`Ollama model to use as default:`,initialValue:`llama3.3`,placeholder:`llama3.3 or qwen2.5-coder:32b or deepseek-r1:32b`});if(typeof ollamaModel==`symbol`)return null;let modelRef=`ollama/${ollamaModel.trim()||`llama3.3`}`;upsertSharedEnvVar({key:`OLLAMA_API_KEY`,value:`ollama-local`});let normalizedUrl=normalizeBaseUrl(ollamaUrl.trim());if(normalizedUrl!==`http://127.0.0.1:11434`)try{let existing=(await readConfigFileSnapshot())?.config??{};await writeConfigFile({...existing,models:{...existing.models,providers:{...existing.models?.providers,ollama:{baseUrl:normalizedUrl,api:`ollama`,apiKey:`ollama-local`,models:[]}}}})}catch{}return await applyLlmProviderModel(projectRoot,`ollama`,modelRef),`Ollama configured (${normalizedUrl}), model → ${modelRef}`}if(chosen===`vllm`){let vllmUrl=await text({message:`Server base URL (e.g. http://127.0.0.1:8000/v1):`,initialValue:`http://127.0.0.1:8000/v1`});if(typeof vllmUrl==`symbol`)return null;let vllmModelId=await text({message:`Model ID served at that endpoint:`,placeholder:`meta-llama/Llama-3.1-8B-Instruct`});if(typeof vllmModelId==`symbol`||!vllmModelId.trim())return null;let modelId=vllmModelId.trim(),modelRef=`vllm/${modelId}`;try{let existing=(await readConfigFileSnapshot())?.config??{};await writeConfigFile({...existing,models:{...existing.models,providers:{...existing.models?.providers,vllm:{baseUrl:normalizeBaseUrl(vllmUrl.trim()),api:`openai-completions`,apiKey:`VLLM_API_KEY`,models:[{id:modelId,name:modelId,reasoning:!1,input:[`text`],cost:{input:0,output:0,cacheRead:0,cacheWrite:0},contextWindow:128e3,maxTokens:8192}]}}}})}catch{}return await applyLlmProviderModel(projectRoot,`vllm`,modelRef),`vLLM configured (${vllmUrl.trim()}), model → ${modelRef}`}return null}async function
|
|
11
|
-
`),`Already connected to Builderforce`),`Builderforce: already connected (${existingUrl})`}if(readSharedEnvVar(`BUILDERFORCE_SKIPPED`)===`1`)return null;let connect=await confirm({message:`Connect to Builderforce? (optional — manage projects, tasks & agents across your mesh)`,initialValue:!0});if(typeof connect==`symbol`||!connect)return upsertSharedEnvVar({key:`BUILDERFORCE_SKIPPED`,value:`1`}),note(`You can connect to Builderforce anytime with: builderforce init --reconnect`,`Skipped`),null;let urlInput=await text({message:`Orchestration API URL (Builderforce):`,initialValue:`https://api.builderforce.ai`});if(typeof urlInput==`symbol`)return null;let serverUrl=normalizeBaseUrl(urlInput.trim())||`https://api.builderforce.ai`,
|
|
9
|
+
`),`Failed to install Workforce agent`),null}}async function promptLlmProvider(projectRoot){let chosen=await select({message:`LLM provider to use for AI agents:`,options:[...PROVIDERS.map(p=>({value:p.id,label:isProviderConfigured(p)?`${p.label} ✓ configured`:p.label,hint:p.id===`builderforcellm`?`managed proxy (no local API key needed)`:isProviderConfigured(p)?`${p.envVar} is set`:p.envVar?`needs ${p.envVar}`:`enter server URL`})),{value:`skip`,label:`Skip — configure later`}]});if(typeof chosen==`symbol`||chosen===`skip`)return null;if(chosen===`workforce`)return promptWorkforceAgentProvider(projectRoot);let meta=PROVIDERS.find(p=>p.id===chosen);if(chosen===`builderforcellm`||chosen===`anthropic`||chosen===`openai`||chosen===`openrouter`||chosen===`gemini`){if(chosen===`builderforcellm`){if(!readSharedEnvVar(`BUILDERFORCE_API_KEY`)?.trim()){let{promptBuilderforceOnboarding}=await import(`./builderforce-onboarding-CaPJZSvw.js`);await promptBuilderforceOnboarding({projectRoot,defaultInstanceName:path.basename(projectRoot)||`builderforce`,forcePrompt:!0}),readSharedEnvVar(`BUILDERFORCE_API_KEY`)?.trim()||note([`BuilderForceAgentsLLM requires a Builderforce account to work.`,`You can connect later with: builderforce init --reconnect`,`Or switch to a different provider with: builderforce init`].join(`
|
|
10
|
+
`),`Skipped — BuilderForceAgentsLLM won't be available yet`)}return await applyLlmProviderModel(projectRoot,chosen,meta.defaultModel),`${meta.label} configured, model → ${meta.defaultModel}`}if(isProviderConfigured(meta))return note(`${meta.envVar} is already set — keeping existing credential.`,meta.label),await applyLlmProviderModel(projectRoot,chosen,meta.defaultModel),`${meta.label} (existing credential kept), model → ${meta.defaultModel}`;let apiKey=await password({message:`${meta.label} API key:`});if(typeof apiKey==`symbol`||!apiKey.trim())return null;let keyValue=apiKey.trim();return chosen===`anthropic`?await setAnthropicApiKey(keyValue):chosen===`openrouter`?await setOpenrouterApiKey(keyValue):chosen===`gemini`?await setGeminiApiKey(keyValue):upsertSharedEnvVar({key:`OPENAI_API_KEY`,value:keyValue}),await applyLlmProviderModel(projectRoot,chosen,meta.defaultModel),`${meta.label} configured, model → ${meta.defaultModel}`}if(chosen===`ollama`){let ollamaUrl=await text({message:`Ollama base URL:`,initialValue:`http://127.0.0.1:11434`});if(typeof ollamaUrl==`symbol`)return null;let ollamaModel=await text({message:`Ollama model to use as default:`,initialValue:`llama3.3`,placeholder:`llama3.3 or qwen2.5-coder:32b or deepseek-r1:32b`});if(typeof ollamaModel==`symbol`)return null;let modelRef=`ollama/${ollamaModel.trim()||`llama3.3`}`;upsertSharedEnvVar({key:`OLLAMA_API_KEY`,value:`ollama-local`});let normalizedUrl=normalizeBaseUrl(ollamaUrl.trim());if(normalizedUrl!==`http://127.0.0.1:11434`)try{let existing=(await readConfigFileSnapshot())?.config??{};await writeConfigFile({...existing,models:{...existing.models,providers:{...existing.models?.providers,ollama:{baseUrl:normalizedUrl,api:`ollama`,apiKey:`ollama-local`,models:[]}}}})}catch{}return await applyLlmProviderModel(projectRoot,`ollama`,modelRef),`Ollama configured (${normalizedUrl}), model → ${modelRef}`}if(chosen===`vllm`){let vllmUrl=await text({message:`Server base URL (e.g. http://127.0.0.1:8000/v1):`,initialValue:`http://127.0.0.1:8000/v1`});if(typeof vllmUrl==`symbol`)return null;let vllmModelId=await text({message:`Model ID served at that endpoint:`,placeholder:`meta-llama/Llama-3.1-8B-Instruct`});if(typeof vllmModelId==`symbol`||!vllmModelId.trim())return null;let modelId=vllmModelId.trim(),modelRef=`vllm/${modelId}`;try{let existing=(await readConfigFileSnapshot())?.config??{};await writeConfigFile({...existing,models:{...existing.models,providers:{...existing.models?.providers,vllm:{baseUrl:normalizeBaseUrl(vllmUrl.trim()),api:`openai-completions`,apiKey:`VLLM_API_KEY`,models:[{id:modelId,name:modelId,reasoning:!1,input:[`text`],cost:{input:0,output:0,cacheRead:0,cacheWrite:0},contextWindow:128e3,maxTokens:8192}]}}}})}catch{}return await applyLlmProviderModel(projectRoot,`vllm`,modelRef),`vLLM configured (${vllmUrl.trim()}), model → ${modelRef}`}return null}async function ensureProjectMappingFromStoredCreds(params){let serverUrl=readSharedEnvVar(`BUILDERFORCE_URL`)??`https://api.builderforce.ai`,webToken=readSharedEnvVar(`BUILDERFORCE_WEB_TOKEN`),tenantIdRaw=readSharedEnvVar(`BUILDERFORCE_TENANT_ID`);if(!webToken||!tenantIdRaw)return;let tenantId=Number(tenantIdRaw);if(!Number.isFinite(tenantId)||tenantId<=0)return;let ctx=await loadProjectContext(params.projectRoot).catch(()=>null),agentNodeId=ctx?.builderforce?.instanceId?.trim();if(!agentNodeId)return;let tenantJwtRes=await builderforceApiFetch(`${serverUrl}/api/auth/tenant-token`,{method:`POST`,token:webToken,body:JSON.stringify({tenantId})}).catch(()=>null);if(!tenantJwtRes?.token)return;let mapped=await ensureProjectMapping({serverUrl,tenantJwt:tenantJwtRes.token,projectRoot:params.projectRoot,projectName:params.projectName,description:params.description,agentNodeId});mapped&&await updateProjectContextFields(params.projectRoot,{builderforce:{instanceId:agentNodeId,...ctx?.builderforce,projectId:mapped.projectId}}).catch(()=>void 0)}async function promptBuilderforceSetup(projectRoot,defaultInstanceName){if(readSharedEnvVar(`BUILDERFORCE_API_KEY`)){let existingUrl=readSharedEnvVar(`BUILDERFORCE_URL`)??`https://api.builderforce.ai`,existingTenantId=readSharedEnvVar(`BUILDERFORCE_TENANT_ID`),existingCtx=await loadProjectContext(projectRoot).catch(()=>null),agentNodeLabel=existingCtx?.builderforce?.instanceSlug??existingCtx?.builderforce?.instanceName??existingCtx?.builderforce?.instanceId??`(registered)`;return note([`URL: ${existingUrl}`,`Tenant: ${existingTenantId??`unknown`}`,`AgentNode: ${agentNodeLabel}`,``,`Run 'builderforce init --reconnect' to link a different account.`].join(`
|
|
11
|
+
`),`Already connected to Builderforce`),`Builderforce: already connected (${existingUrl})`}if(readSharedEnvVar(`BUILDERFORCE_SKIPPED`)===`1`)return null;let connect=await confirm({message:`Connect to Builderforce? (optional — manage projects, tasks & agents across your mesh)`,initialValue:!0});if(typeof connect==`symbol`||!connect)return upsertSharedEnvVar({key:`BUILDERFORCE_SKIPPED`,value:`1`}),note(`You can connect to Builderforce anytime with: builderforce init --reconnect`,`Skipped`),null;let urlInput=await text({message:`Orchestration API URL (Builderforce):`,initialValue:`https://api.builderforce.ai`});if(typeof urlInput==`symbol`)return null;let serverUrl=normalizeBaseUrl(urlInput.trim())||`https://api.builderforce.ai`,webToken=await authenticateWithPassword({serverUrl,defaultInstanceName});if(!webToken)return null;let tenant=await selectTenantAndToken({serverUrl,webToken,defaultInstanceName});if(!tenant)return null;let{tenantId,tenantJwt}=tenant,agentNodeNameInput=await text({message:`AgentNode instance name (shown in dashboard):`,initialValue:defaultInstanceName});if(typeof agentNodeNameInput==`symbol`)return null;let agentNodeName=agentNodeNameInput.trim()||defaultInstanceName,agentNodeSpin=spinner();agentNodeSpin.start(`Registering agentNode instance…`);let agentNodeId=``,agentNodeSlug=``,apiKey=``,projectId=``,projectAction=`unknown`;try{let res=await builderforceApiFetch(`${serverUrl}/api/agent-hosts`,{method:`POST`,token:tenantJwt,body:JSON.stringify({name:agentNodeName})});agentNodeId=String(res.agentHost.id),agentNodeSlug=res.agentHost.slug,apiKey=res.apiKey;let mapped=await ensureProjectMapping({serverUrl,tenantJwt,agentNodeId,projectRoot,projectName:defaultInstanceName,description:`builderForceAgents project at ${projectRoot}`});mapped&&(projectId=mapped.projectId,projectAction=mapped.action),agentNodeSpin.stop(`AgentNode "${res.agentHost.name}" registered`)}catch(err){return agentNodeSpin.stop(`AgentNode registration failed`),note(String(err instanceof Error?err.message:err),`Error`),null}upsertSharedEnvVar({key:`BUILDERFORCE_URL`,value:serverUrl}),upsertSharedEnvVar({key:`BUILDERFORCE_WEB_TOKEN`,value:webToken}),upsertSharedEnvVar({key:`BUILDERFORCE_TENANT_ID`,value:String(tenantId)}),upsertSharedEnvVar({key:`BUILDERFORCE_API_KEY`,value:apiKey});try{await updateProjectContextFields(projectRoot,{builderforce:{instanceId:agentNodeId,instanceSlug:agentNodeSlug,instanceName:agentNodeName,...projectId?{projectId}:{},tenantId,url:serverUrl}})}catch{}return note([`AgentNode API key saved to ~/.builderforce/.env`,`This key was shown once — it is hashed on the server.`,`Instance slug: ${agentNodeSlug} · tenant: ${tenantId}`,projectId?`Project ${projectAction}: ${projectId}`:`Project mapping: not available`].join(`
|
|
12
12
|
`),`Builderforce connected`),`Builderforce: ${agentNodeName} (${agentNodeSlug}) on tenant ${tenantId}`}function createBuilderForceAgentsCommand(){let cmd=new Command(`project`);return cmd.description(`Manage builderForceAgents project context`).addCommand(createStatusCommand()),cmd}function createInitCommand(){return new Command(`init`).description(`Initialize a project with builderForceAgents`).argument(`[path]`,`Project directory path`,`.`).action(async projectPath=>{let projectRoot=projectPath===`.`?process.cwd():projectPath;if(await isBuilderForceAgentsProject(projectRoot)){await runBuilderForceAgentsSession(projectRoot);return}intro(theme.accent(`builderForceAgents`));let detectSpin=spinner();detectSpin.start(`Detecting project info...`);let detected=await detectProjectInfo(projectRoot);detectSpin.stop(`Project info detected`),note([`name: ${detected.projectName}`,`languages: ${detected.languages.join(`, `)||`(none detected)`}`,`frameworks: ${detected.frameworks.join(`, `)||`(none detected)`}`,`build: ${detected.buildSystem??`(unknown)`}`,`test: ${detected.testFramework??`(unknown)`}`,`lint: ${detected.lintingTools.join(`, `)||`(none detected)`}`].join(`
|
|
13
13
|
`),`Auto-detected`);let projectNameInput=await text({message:`Project name:`,initialValue:detected.projectName});if(typeof projectNameInput==`symbol`){outro(theme.muted(`Cancelled`));return}let descriptionInput=await text({message:`Project description:`,initialValue:detected.description,placeholder:`A brief description of what this project does`});if(typeof descriptionInput==`symbol`){outro(theme.muted(`Cancelled`));return}let languagesInput=await text({message:`Primary languages (comma-separated):`,initialValue:detected.languages.join(`, `),placeholder:`typescript, javascript`});if(typeof languagesInput==`symbol`){outro(theme.muted(`Cancelled`));return}let frameworksInput=await text({message:`Frameworks used (comma-separated):`,initialValue:detected.frameworks.join(`, `),placeholder:`express, react`});if(typeof frameworksInput==`symbol`){outro(theme.muted(`Cancelled`));return}let spin=spinner();spin.start(`Setting up .builderforce/...`);try{await initializeBuilderForceAgentsProject(projectRoot,{projectName:projectNameInput||detected.projectName,description:descriptionInput||detected.description,languages:languagesInput.trim().length>0?languagesInput.split(`,`).map(l=>l.trim()).filter(Boolean):detected.languages,frameworks:frameworksInput.trim().length>0?frameworksInput.split(`,`).map(f=>f.trim()).filter(Boolean):detected.frameworks,buildSystem:detected.buildSystem,testFramework:detected.testFramework,lintingTools:detected.lintingTools}),spin.stop(theme.success(`builderForceAgents initialized!`)),note([` ${theme.muted(`context.yaml`)} – project metadata (edit to tune AI understanding)`,` ${theme.muted(`architecture.md`)} – high-level design docs`,` ${theme.muted(`rules.yaml`)} – coding standards & conventions`].join(`
|
|
14
14
|
`),`.builderforce/ created`),await promptLlmProvider(projectRoot),await promptBuilderforceSetup(projectRoot,projectNameInput||detected.projectName),await ensureProjectMappingFromStoredCreds({projectRoot,projectName:projectNameInput||detected.projectName,description:descriptionInput||detected.description});let aiPopulate=await confirm({message:`Use an AI agent to populate context.yaml, architecture.md, and rules.yaml now?`,initialValue:!0});await runBuilderForceAgentsSession(projectRoot,{message:typeof aiPopulate!=`symbol`&&aiPopulate?`Analyze this project and populate .builderforce/context.yaml, architecture.md, and rules.yaml with accurate project context`:void 0})}catch(error){spin.stop(theme.error(`Failed to initialize project`)),outro(theme.error(error instanceof Error?error.message:String(error)))}})}function createStatusCommand(){return new Command(`status`).description(`Show builderForceAgents project status and context`).argument(`[path]`,`Project directory path`,`.`).action(async projectPath=>{let projectRoot=projectPath===`.`?process.cwd():projectPath;if(!await isBuilderForceAgentsProject(projectRoot)){console.log(theme.warn(`Project is not initialized with builderForceAgents`)),console.log(theme.muted(`Run 'builderforce init' to initialize`));return}console.log(theme.success(`✓ builderForceAgents project detected`)),console.log(theme.muted(` Location: ${projectRoot}/.builderforce/`))})}function createAgentCommand(){let cmd=new Command(`workforce`).description(`Manage Builderforce Workforce agents (custom trained LLMs)`);return cmd.addCommand(new Command(`install`).description(`Install a Workforce agent from the Builderforce registry`).argument(`<agentId>`,`Agent UUID or name from the Workforce Registry`).option(`--registry <url>`,`Builderforce registry URL`,DEFAULT_REGISTRY_URL).option(`--path <dir>`,`Project directory`,`.`).action(async(agentId,opts)=>{let projectRoot=opts.path===`.`?process.cwd():opts.path;intro(theme.accent(`builderForceAgents`)+` `+theme.muted(`agent install`));try{let summary=await installWorkforceAgent({agentId,projectRoot,registryUrl:opts.registry});outro(theme.success(`Agent installed!
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{note,password,select,spinner,text}from"@clack/prompts";function flattenErrorMessage(body){let err=body.error,nested=typeof err==`object`&&err?err:null;return[body.message,nested?.message,err].find(c=>typeof c==`string`&&c.length>0)}async function builderforceApiFetch(url,opts={}){let{token,...rest}=opts,headers={"Content-Type":`application/json`,...token?{Authorization:`Bearer ${token}`}:{}},res=await fetch(url,{...rest,headers}),body=await res.json().catch(()=>({}));if(!res.ok)throw Error(`${res.status} ${flattenErrorMessage(body)??res.statusText}`);return body}async function ensureProjectMapping(params){try{let upsert=await builderforceApiFetch(`${params.serverUrl}/api/projects/upsert`,{method:`POST`,token:params.tenantJwt,body:JSON.stringify({name:params.projectName,description:params.description??`Managed from ${params.projectRoot}`})});return await builderforceApiFetch(`${params.serverUrl}/api/agent-hosts/${params.agentNodeId}/projects/${upsert.project.id}`,{method:`PUT`,token:params.tenantJwt}),{projectId:upsert.project.id,action:upsert.action}}catch{return null}}async function authenticateWithPassword(params){let{serverUrl,defaultInstanceName}=params,authMode=await select({message:`Do you have a Builderforce account?`,options:[{value:`login`,label:`Yes — log in`},{value:`register`,label:`No — create a free account`}]});if(typeof authMode==`symbol`)return null;let emailInput=await text({message:`Email:`});if(typeof emailInput==`symbol`||!emailInput.trim())return null;let email=emailInput.trim(),usernameForReg=``;if(authMode===`register`){let unInput=await text({message:`Username:`,initialValue:defaultInstanceName.toLowerCase().replace(/[^a-z0-9]+/g,`-`)});if(typeof unInput==`symbol`||!unInput.trim())return null;usernameForReg=unInput.trim()}let pwdInput=await password({message:`Password:`});if(typeof pwdInput==`symbol`||!pwdInput.trim())return null;let pwd=pwdInput.trim(),authSpin=spinner();try{if(authMode===`register`){authSpin.start(`Creating account…`);let res=await builderforceApiFetch(`${serverUrl}/api/auth/web/register`,{method:`POST`,body:JSON.stringify({email,username:usernameForReg,password:pwd})});return authSpin.stop(`Account created`),res.token}authSpin.start(`Authenticating…`);let res=await builderforceApiFetch(`${serverUrl}/api/auth/web/login`,{method:`POST`,body:JSON.stringify({email,password:pwd})});return authSpin.stop(`Authenticated`),res.token}catch(err){return authSpin.stop(`Authentication failed`),note(String(err instanceof Error?err.message:err),`Error`),null}}async function selectTenantAndToken(params){let{serverUrl,webToken,defaultInstanceName}=params,tenantId=0,tenantSpin=spinner();tenantSpin.start(`Loading workspaces…`);let tenants=[];try{tenants=(await builderforceApiFetch(`${serverUrl}/api/tenants`,{token:webToken})).tenants,tenantSpin.stop(`${tenants.length} workspace(s) found`)}catch(err){return tenantSpin.stop(`Could not load workspaces`),note(String(err instanceof Error?err.message:err),`Error`),null}if(tenants.length===0){let wsNameInput=await text({message:`Create your first workspace:`,initialValue:defaultInstanceName});if(typeof wsNameInput==`symbol`||!wsNameInput.trim())return null;let wsSpin=spinner();wsSpin.start(`Creating workspace…`);try{let created=await builderforceApiFetch(`${serverUrl}/api/tenants`,{method:`POST`,token:webToken,body:JSON.stringify({name:wsNameInput.trim()})});tenantId=created.id,wsSpin.stop(`Workspace "${created.name}" created`)}catch(err){return wsSpin.stop(`Could not create workspace`),note(String(err instanceof Error?err.message:err),`Error`),null}}else if(tenants.length===1)tenantId=tenants[0].id,note(`Using workspace: ${tenants[0].name}`,`Workspace`);else{let picked=await select({message:`Select workspace:`,options:tenants.map(t=>({value:t.id,label:t.name,hint:t.slug}))});if(typeof picked==`symbol`)return null;tenantId=picked}try{let res=await builderforceApiFetch(`${serverUrl}/api/auth/tenant-token`,{method:`POST`,token:webToken,body:JSON.stringify({tenantId})});return{tenantId,tenantJwt:res.token}}catch(err){return note(String(err instanceof Error?err.message:err),`Could not get workspace token`),null}}export{selectTenantAndToken as i,builderforceApiFetch as n,ensureProjectMapping as r,authenticateWithPassword as t};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{note,password,select,spinner,text}from"@clack/prompts";function flattenErrorMessage(body){let err=body.error,nested=typeof err==`object`&&err?err:null;return[body.message,nested?.message,err].find(c=>typeof c==`string`&&c.length>0)}async function builderforceApiFetch(url,opts={}){let{token,...rest}=opts,headers={"Content-Type":`application/json`,...token?{Authorization:`Bearer ${token}`}:{}},res=await fetch(url,{...rest,headers}),body=await res.json().catch(()=>({}));if(!res.ok)throw Error(`${res.status} ${flattenErrorMessage(body)??res.statusText}`);return body}async function ensureProjectMapping(params){try{let upsert=await builderforceApiFetch(`${params.serverUrl}/api/projects/upsert`,{method:`POST`,token:params.tenantJwt,body:JSON.stringify({name:params.projectName,description:params.description??`Managed from ${params.projectRoot}`})});return await builderforceApiFetch(`${params.serverUrl}/api/agent-hosts/${params.agentNodeId}/projects/${upsert.project.id}`,{method:`PUT`,token:params.tenantJwt}),{projectId:upsert.project.id,action:upsert.action}}catch{return null}}async function authenticateWithPassword(params){let{serverUrl,defaultInstanceName}=params,authMode=await select({message:`Do you have a Builderforce account?`,options:[{value:`login`,label:`Yes — log in`},{value:`register`,label:`No — create a free account`}]});if(typeof authMode==`symbol`)return null;let emailInput=await text({message:`Email:`});if(typeof emailInput==`symbol`||!emailInput.trim())return null;let email=emailInput.trim(),usernameForReg=``;if(authMode===`register`){let unInput=await text({message:`Username:`,initialValue:defaultInstanceName.toLowerCase().replace(/[^a-z0-9]+/g,`-`)});if(typeof unInput==`symbol`||!unInput.trim())return null;usernameForReg=unInput.trim()}let pwdInput=await password({message:`Password:`});if(typeof pwdInput==`symbol`||!pwdInput.trim())return null;let pwd=pwdInput.trim(),authSpin=spinner();try{if(authMode===`register`){authSpin.start(`Creating account…`);let res=await builderforceApiFetch(`${serverUrl}/api/auth/web/register`,{method:`POST`,body:JSON.stringify({email,username:usernameForReg,password:pwd})});return authSpin.stop(`Account created`),res.token}authSpin.start(`Authenticating…`);let res=await builderforceApiFetch(`${serverUrl}/api/auth/web/login`,{method:`POST`,body:JSON.stringify({email,password:pwd})});return authSpin.stop(`Authenticated`),res.token}catch(err){return authSpin.stop(`Authentication failed`),note(String(err instanceof Error?err.message:err),`Error`),null}}async function selectTenantAndToken(params){let{serverUrl,webToken,defaultInstanceName}=params,tenantId=0,tenantSpin=spinner();tenantSpin.start(`Loading workspaces…`);let tenants=[];try{tenants=(await builderforceApiFetch(`${serverUrl}/api/tenants`,{token:webToken})).tenants,tenantSpin.stop(`${tenants.length} workspace(s) found`)}catch(err){return tenantSpin.stop(`Could not load workspaces`),note(String(err instanceof Error?err.message:err),`Error`),null}if(tenants.length===0){let wsNameInput=await text({message:`Create your first workspace:`,initialValue:defaultInstanceName});if(typeof wsNameInput==`symbol`||!wsNameInput.trim())return null;let wsSpin=spinner();wsSpin.start(`Creating workspace…`);try{let created=await builderforceApiFetch(`${serverUrl}/api/tenants`,{method:`POST`,token:webToken,body:JSON.stringify({name:wsNameInput.trim()})});tenantId=created.id,wsSpin.stop(`Workspace "${created.name}" created`)}catch(err){return wsSpin.stop(`Could not create workspace`),note(String(err instanceof Error?err.message:err),`Error`),null}}else if(tenants.length===1)tenantId=tenants[0].id,note(`Using workspace: ${tenants[0].name}`,`Workspace`);else{let picked=await select({message:`Select workspace:`,options:tenants.map(t=>({value:t.id,label:t.name,hint:t.slug}))});if(typeof picked==`symbol`)return null;tenantId=picked}try{let res=await builderforceApiFetch(`${serverUrl}/api/auth/tenant-token`,{method:`POST`,token:webToken,body:JSON.stringify({tenantId})});return{tenantId,tenantJwt:res.token}}catch(err){return note(String(err instanceof Error?err.message:err),`Could not get workspace token`),null}}export{selectTenantAndToken as i,builderforceApiFetch as n,ensureProjectMapping as r,authenticateWithPassword as t};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import"./paths-5FcIFMsj.js";import"./utils-DbaBVFaK.js";import"./session-key-EoB0qaG9.js";import"./builderforce-root-D64_sXEi.js";import"./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{t as normalizeBaseUrl}from"./normalize-base-url-DmugqkQ6.js";import{a as upsertSharedEnvVar,i as readSharedEnvVar}from"./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"./sessions-BuZVmOWt.js";import"./message-channel-D_jXxXQj.js";import"./plugins-D5zP6ENo.js";import"./accounts-o35LU_iy.js";import"./accounts-rmXEiebi.js";import"./accounts-BLueHgKj.js";import"./bindings-DR59065T.js";import"./paths-DJ6rztqJ.js";import{n as loadProjectContext,o as updateProjectContextFields}from"./project-context-store-wcq7lXuI.js";import"./client-xfoidwPI.js";import"./call-T8ciwMTA.js";import{d as openUrl,i as detectBrowserOpenSupport}from"./onboard-helpers-CiHzTaFX.js";import"./prompt-style-BpVK43GK.js";import"./project-context-CJj0Inz-.js";import{t as buildLocalMachineProfile}from"./builderforce-context-DEsrFVCz.js";import{i as selectTenantAndToken,n as builderforceApiFetch,r as ensureProjectMapping,t as authenticateWithPassword}from"./builderforce-api-DcPAGsla.js";import{randomBytes}from"node:crypto";import http from"node:http";import{confirm,note,select,spinner,text}from"@clack/prompts";const CALLBACK_PORT=51122;async function authenticateViaBrowser(opts){let state=randomBytes(16).toString(`hex`),callbackUrl=`http://localhost:${CALLBACK_PORT}/callback`,authUrl=`${opts.serverUrl.replace(`api.builderforce.ai`,`builderforce.ai`).replace(`api.builderforce.ai`,`builderforce.ai`)}/auth/cli?callback=${encodeURIComponent(callbackUrl)}&state=${encodeURIComponent(state)}`;return(await detectBrowserOpenSupport()).ok?authenticateWithCallbackServer({state,authUrl,prompter:opts.prompter}):authenticateManually({state,authUrl,prompter:opts.prompter})}async function authenticateWithCallbackServer(opts){let tokenPromise=startCallbackServer(opts.state);if(await opts.prompter.note(`Opening browser for authentication…\n${opts.authUrl}`,`Builderforce Auth`),!await openUrl(opts.authUrl))return authenticateManually({state:opts.state,authUrl:opts.authUrl,prompter:opts.prompter});try{return await tokenPromise}catch{return await opts.prompter.note(`Authentication timed out or was cancelled.`,`Auth Error`),null}}async function authenticateManually(opts){await opts.prompter.note([`Open this URL in a browser to authenticate:`,``,opts.authUrl,``,`After authenticating, paste the full callback URL shown in the browser.`].join(`
|
|
2
|
+
`),`Builderforce Auth (manual)`);let pastedUrl=await opts.prompter.text({message:`Paste the callback URL:`,validate:val=>{if(!val.includes(`token=`))return`Invalid callback URL — must contain a token parameter`}});if(typeof pastedUrl==`symbol`||!pastedUrl?.trim())return null;let url=new URL(pastedUrl.trim()),token=url.searchParams.get(`token`);if(url.searchParams.get(`state`)!==opts.state)throw Error(`State mismatch — authentication may have been tampered with.`);if(!token)throw Error(`No token found in callback URL.`);return{webToken:token}}function startCallbackServer(expectedState){return new Promise((resolve,reject)=>{let server=http.createServer((req,res)=>{let url=new URL(req.url??`/`,`http://localhost:${CALLBACK_PORT}`);if(url.pathname!==`/callback`){res.writeHead(404,{"Content-Type":`text/plain`}),res.end(`Not found`);return}let token=url.searchParams.get(`token`);if(url.searchParams.get(`state`)!==expectedState){res.writeHead(400,{"Content-Type":`text/plain`}),res.end(`State mismatch`);return}if(!token){res.writeHead(400,{"Content-Type":`text/plain`}),res.end(`Missing token`);return}res.writeHead(200,{"Content-Type":`text/html; charset=utf-8`,"Cache-Control":`no-store`}),res.end(`<!DOCTYPE html>
|
|
3
|
+
<html lang="en">
|
|
4
|
+
<head>
|
|
5
|
+
<meta charset="utf-8">
|
|
6
|
+
<title>BuilderForceAgents — Authenticated</title>
|
|
7
|
+
<style>
|
|
8
|
+
body { font-family: system-ui, sans-serif; display: flex; justify-content: center;
|
|
9
|
+
align-items: center; min-height: 100vh; margin: 0; background: #0d1117; color: #c9d1d9; }
|
|
10
|
+
.card { text-align: center; padding: 2rem; border-radius: 12px;
|
|
11
|
+
background: #161b22; border: 1px solid #30363d; max-width: 420px; }
|
|
12
|
+
h1 { font-size: 1.4rem; margin: 0 0 .5rem; }
|
|
13
|
+
p { color: #8b949e; }
|
|
14
|
+
</style>
|
|
15
|
+
</head>
|
|
16
|
+
<body>
|
|
17
|
+
<div class="card">
|
|
18
|
+
<h1>✅ Authentication complete</h1>
|
|
19
|
+
<p>You can close this tab and return to the terminal.</p>
|
|
20
|
+
</div>
|
|
21
|
+
</body>
|
|
22
|
+
</html>`),setImmediate(()=>server.close()),resolve({webToken:token})});server.listen(CALLBACK_PORT,`127.0.0.1`);let timer=setTimeout(()=>{server.close(),reject(Error(`Authentication timed out after 5 minutes.`))},3e5);server.on(`close`,()=>clearTimeout(timer))})}async function promptBuilderforceOnboarding(params){if(readSharedEnvVar(`BUILDERFORCE_API_KEY`)){let existingUrl=readSharedEnvVar(`BUILDERFORCE_URL`)??`https://api.builderforce.ai`,existingTenantId=readSharedEnvVar(`BUILDERFORCE_TENANT_ID`),existingCtx=await loadProjectContext(params.projectRoot).catch(()=>null),agentNodeLabel=existingCtx?.builderforce?.instanceSlug??existingCtx?.builderforce?.instanceName??existingCtx?.builderforce?.instanceId??`(registered)`;return note([`URL: ${existingUrl}`,`Tenant: ${existingTenantId??`unknown`}`,`AgentNode: ${agentNodeLabel}`,``,`Run 'builderforce init --reconnect' to link a different account.`].join(`
|
|
23
|
+
`),`Already connected to Builderforce`),`Builderforce: already connected (${existingUrl})`}if(!params.forcePrompt&&readSharedEnvVar(`BUILDERFORCE_SKIPPED`)===`1`)return null;let connect=await confirm({message:`Connect to Builderforce? (optional — manage projects, tasks & agents across your mesh)`,initialValue:!0});if(typeof connect==`symbol`||!connect)return upsertSharedEnvVar({key:`BUILDERFORCE_SKIPPED`,value:`1`}),null;let urlInput=await text({message:`Orchestration API URL (Builderforce):`,initialValue:`https://api.builderforce.ai`});if(typeof urlInput==`symbol`)return null;let serverUrl=normalizeBaseUrl(urlInput.trim())||`https://api.builderforce.ai`,authMethod=(await detectBrowserOpenSupport()).ok?await select({message:`How would you like to authenticate?`,options:[{value:`browser`,label:`Open browser (recommended)`,hint:`login or register in your browser`},{value:`terminal`,label:`Type here`,hint:`enter email & password in this terminal`}]}):`terminal`;if(typeof authMethod==`symbol`)return null;let webToken=``;if(authMethod===`browser`){let result=await authenticateViaBrowser({serverUrl,prompter:{note:async(msg,title)=>{note(msg,title)},text:opts=>text({...opts,validate:opts.validate?value=>opts.validate(value??``):void 0})}});if(!result)return null;webToken=result.webToken}else{let token=await authenticateWithPassword({serverUrl,defaultInstanceName:params.defaultInstanceName});if(!token)return null;webToken=token}let tenant=await selectTenantAndToken({serverUrl,webToken,defaultInstanceName:params.defaultInstanceName});if(!tenant)return null;let{tenantId,tenantJwt}=tenant,agentNodeNameInput=await text({message:`AgentNode instance name (shown in dashboard):`,initialValue:params.defaultInstanceName});if(typeof agentNodeNameInput==`symbol`)return null;let agentNodeName=agentNodeNameInput.trim()||params.defaultInstanceName,agentNodeSpin=spinner();agentNodeSpin.start(`Registering agentNode instance…`);let agentNodeId=``,agentNodeSlug=``,apiKey=``,projectId=``,projectAction=`unknown`,machineProfile=buildLocalMachineProfile({workspaceDirectory:params.projectRoot,rootInstallDirectory:process.cwd(),gatewayPort:18789,tunnelUrl:process.env.BUILDERFORCE_AGENTS_PUBLIC_TUNNEL_URL,tunnelStatus:process.env.BUILDERFORCE_AGENTS_PUBLIC_TUNNEL_URL?`connected`:`none`});try{let res=await builderforceApiFetch(`${serverUrl}/api/agent-hosts`,{method:`POST`,token:tenantJwt,body:JSON.stringify({name:agentNodeName,machineProfile})});agentNodeId=String(res.agentHost.id),agentNodeSlug=res.agentHost.slug,apiKey=res.apiKey;let mapped=await ensureProjectMapping({serverUrl,tenantJwt,agentNodeId,projectRoot:params.projectRoot,projectName:params.defaultInstanceName,description:`builderForceAgents project at ${params.projectRoot}`});mapped&&(projectId=mapped.projectId,projectAction=mapped.action),agentNodeSpin.stop(`AgentNode "${res.agentHost.name}" registered`)}catch(err){return agentNodeSpin.stop(`AgentNode registration failed`),note(String(err instanceof Error?err.message:err),`Error`),null}upsertSharedEnvVar({key:`BUILDERFORCE_URL`,value:serverUrl}),upsertSharedEnvVar({key:`BUILDERFORCE_WEB_TOKEN`,value:webToken}),upsertSharedEnvVar({key:`BUILDERFORCE_TENANT_ID`,value:String(tenantId)}),upsertSharedEnvVar({key:`BUILDERFORCE_API_KEY`,value:apiKey}),upsertSharedEnvVar({key:`BUILDERFORCE_SKIPPED`,value:`0`});try{await updateProjectContextFields(params.projectRoot,{builderforce:{instanceId:agentNodeId,instanceSlug:agentNodeSlug,instanceName:agentNodeName,...projectId?{projectId}:{},tenantId,url:serverUrl,machineProfile}})}catch{}return note([`AgentNode API key saved to ~/.builderforce/.env`,`This key was shown once — it is hashed on the server.`,`Instance slug: ${agentNodeSlug} · tenant: ${tenantId}`,projectId?`Project ${projectAction}: ${projectId}`:`Project mapping: not available`].join(`
|
|
24
|
+
`),`Builderforce connected`),`Builderforce: ${agentNodeName} (${agentNodeSlug}) on tenant ${tenantId}`}export{promptBuilderforceOnboarding};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import"./paths-BHg-VHB4.js";import"./registry-Cv7CoWAs.js";import"./utils-BP60e80M.js";import"./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{t as normalizeBaseUrl}from"./normalize-base-url-D_sv6Zgt.js";import{a as upsertSharedEnvVar,i as readSharedEnvVar}from"./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"./sessions-BA8Se_bT.js";import{n as loadProjectContext,o as updateProjectContextFields}from"./project-context-store-CIUcwUP_.js";import"./plugins-1Mn6RiNf.js";import"./accounts-BkTLjSrD.js";import"./bindings-CKSDlQ1i.js";import"./accounts-Cx82nj4E.js";import"./accounts-DcoaLXKI.js";import"./paths-ClsbsPQP.js";import"./project-context-D3Mx4maV.js";import{d as openUrl,i as detectBrowserOpenSupport}from"./onboard-helpers-Ce_c4Raj.js";import"./prompt-style-BMWmaqSC.js";import{t as buildLocalMachineProfile}from"./builderforce-context-CyUg2pSn.js";import{i as selectTenantAndToken,n as builderforceApiFetch,r as ensureProjectMapping,t as authenticateWithPassword}from"./builderforce-api-DKgXl8BH.js";import{randomBytes}from"node:crypto";import http from"node:http";import{confirm,note,select,spinner,text}from"@clack/prompts";const CALLBACK_PORT=51122;async function authenticateViaBrowser(opts){let state=randomBytes(16).toString(`hex`),callbackUrl=`http://localhost:${CALLBACK_PORT}/callback`,authUrl=`${opts.serverUrl.replace(`api.builderforce.ai`,`builderforce.ai`).replace(`api.builderforce.ai`,`builderforce.ai`)}/auth/cli?callback=${encodeURIComponent(callbackUrl)}&state=${encodeURIComponent(state)}`;return(await detectBrowserOpenSupport()).ok?authenticateWithCallbackServer({state,authUrl,prompter:opts.prompter}):authenticateManually({state,authUrl,prompter:opts.prompter})}async function authenticateWithCallbackServer(opts){let tokenPromise=startCallbackServer(opts.state);if(await opts.prompter.note(`Opening browser for authentication…\n${opts.authUrl}`,`Builderforce Auth`),!await openUrl(opts.authUrl))return authenticateManually({state:opts.state,authUrl:opts.authUrl,prompter:opts.prompter});try{return await tokenPromise}catch{return await opts.prompter.note(`Authentication timed out or was cancelled.`,`Auth Error`),null}}async function authenticateManually(opts){await opts.prompter.note([`Open this URL in a browser to authenticate:`,``,opts.authUrl,``,`After authenticating, paste the full callback URL shown in the browser.`].join(`
|
|
2
|
+
`),`Builderforce Auth (manual)`);let pastedUrl=await opts.prompter.text({message:`Paste the callback URL:`,validate:val=>{if(!val.includes(`token=`))return`Invalid callback URL — must contain a token parameter`}});if(typeof pastedUrl==`symbol`||!pastedUrl?.trim())return null;let url=new URL(pastedUrl.trim()),token=url.searchParams.get(`token`);if(url.searchParams.get(`state`)!==opts.state)throw Error(`State mismatch — authentication may have been tampered with.`);if(!token)throw Error(`No token found in callback URL.`);return{webToken:token}}function startCallbackServer(expectedState){return new Promise((resolve,reject)=>{let server=http.createServer((req,res)=>{let url=new URL(req.url??`/`,`http://localhost:${CALLBACK_PORT}`);if(url.pathname!==`/callback`){res.writeHead(404,{"Content-Type":`text/plain`}),res.end(`Not found`);return}let token=url.searchParams.get(`token`);if(url.searchParams.get(`state`)!==expectedState){res.writeHead(400,{"Content-Type":`text/plain`}),res.end(`State mismatch`);return}if(!token){res.writeHead(400,{"Content-Type":`text/plain`}),res.end(`Missing token`);return}res.writeHead(200,{"Content-Type":`text/html; charset=utf-8`,"Cache-Control":`no-store`}),res.end(`<!DOCTYPE html>
|
|
3
|
+
<html lang="en">
|
|
4
|
+
<head>
|
|
5
|
+
<meta charset="utf-8">
|
|
6
|
+
<title>BuilderForceAgents — Authenticated</title>
|
|
7
|
+
<style>
|
|
8
|
+
body { font-family: system-ui, sans-serif; display: flex; justify-content: center;
|
|
9
|
+
align-items: center; min-height: 100vh; margin: 0; background: #0d1117; color: #c9d1d9; }
|
|
10
|
+
.card { text-align: center; padding: 2rem; border-radius: 12px;
|
|
11
|
+
background: #161b22; border: 1px solid #30363d; max-width: 420px; }
|
|
12
|
+
h1 { font-size: 1.4rem; margin: 0 0 .5rem; }
|
|
13
|
+
p { color: #8b949e; }
|
|
14
|
+
</style>
|
|
15
|
+
</head>
|
|
16
|
+
<body>
|
|
17
|
+
<div class="card">
|
|
18
|
+
<h1>✅ Authentication complete</h1>
|
|
19
|
+
<p>You can close this tab and return to the terminal.</p>
|
|
20
|
+
</div>
|
|
21
|
+
</body>
|
|
22
|
+
</html>`),setImmediate(()=>server.close()),resolve({webToken:token})});server.listen(CALLBACK_PORT,`127.0.0.1`);let timer=setTimeout(()=>{server.close(),reject(Error(`Authentication timed out after 5 minutes.`))},3e5);server.on(`close`,()=>clearTimeout(timer))})}async function promptBuilderforceOnboarding(params){if(readSharedEnvVar(`BUILDERFORCE_API_KEY`)){let existingUrl=readSharedEnvVar(`BUILDERFORCE_URL`)??`https://api.builderforce.ai`,existingTenantId=readSharedEnvVar(`BUILDERFORCE_TENANT_ID`),existingCtx=await loadProjectContext(params.projectRoot).catch(()=>null),agentNodeLabel=existingCtx?.builderforce?.instanceSlug??existingCtx?.builderforce?.instanceName??existingCtx?.builderforce?.instanceId??`(registered)`;return note([`URL: ${existingUrl}`,`Tenant: ${existingTenantId??`unknown`}`,`AgentNode: ${agentNodeLabel}`,``,`Run 'builderforce init --reconnect' to link a different account.`].join(`
|
|
23
|
+
`),`Already connected to Builderforce`),`Builderforce: already connected (${existingUrl})`}if(!params.forcePrompt&&readSharedEnvVar(`BUILDERFORCE_SKIPPED`)===`1`)return null;let connect=await confirm({message:`Connect to Builderforce? (optional — manage projects, tasks & agents across your mesh)`,initialValue:!0});if(typeof connect==`symbol`||!connect)return upsertSharedEnvVar({key:`BUILDERFORCE_SKIPPED`,value:`1`}),null;let urlInput=await text({message:`Orchestration API URL (Builderforce):`,initialValue:`https://api.builderforce.ai`});if(typeof urlInput==`symbol`)return null;let serverUrl=normalizeBaseUrl(urlInput.trim())||`https://api.builderforce.ai`,authMethod=(await detectBrowserOpenSupport()).ok?await select({message:`How would you like to authenticate?`,options:[{value:`browser`,label:`Open browser (recommended)`,hint:`login or register in your browser`},{value:`terminal`,label:`Type here`,hint:`enter email & password in this terminal`}]}):`terminal`;if(typeof authMethod==`symbol`)return null;let webToken=``;if(authMethod===`browser`){let result=await authenticateViaBrowser({serverUrl,prompter:{note:async(msg,title)=>{note(msg,title)},text:opts=>text({...opts,validate:opts.validate?value=>opts.validate(value??``):void 0})}});if(!result)return null;webToken=result.webToken}else{let token=await authenticateWithPassword({serverUrl,defaultInstanceName:params.defaultInstanceName});if(!token)return null;webToken=token}let tenant=await selectTenantAndToken({serverUrl,webToken,defaultInstanceName:params.defaultInstanceName});if(!tenant)return null;let{tenantId,tenantJwt}=tenant,agentNodeNameInput=await text({message:`AgentNode instance name (shown in dashboard):`,initialValue:params.defaultInstanceName});if(typeof agentNodeNameInput==`symbol`)return null;let agentNodeName=agentNodeNameInput.trim()||params.defaultInstanceName,agentNodeSpin=spinner();agentNodeSpin.start(`Registering agentNode instance…`);let agentNodeId=``,agentNodeSlug=``,apiKey=``,projectId=``,projectAction=`unknown`,machineProfile=buildLocalMachineProfile({workspaceDirectory:params.projectRoot,rootInstallDirectory:process.cwd(),gatewayPort:18789,tunnelUrl:process.env.BUILDERFORCE_AGENTS_PUBLIC_TUNNEL_URL,tunnelStatus:process.env.BUILDERFORCE_AGENTS_PUBLIC_TUNNEL_URL?`connected`:`none`});try{let res=await builderforceApiFetch(`${serverUrl}/api/agent-hosts`,{method:`POST`,token:tenantJwt,body:JSON.stringify({name:agentNodeName,machineProfile})});agentNodeId=String(res.agentHost.id),agentNodeSlug=res.agentHost.slug,apiKey=res.apiKey;let mapped=await ensureProjectMapping({serverUrl,tenantJwt,agentNodeId,projectRoot:params.projectRoot,projectName:params.defaultInstanceName,description:`builderForceAgents project at ${params.projectRoot}`});mapped&&(projectId=mapped.projectId,projectAction=mapped.action),agentNodeSpin.stop(`AgentNode "${res.agentHost.name}" registered`)}catch(err){return agentNodeSpin.stop(`AgentNode registration failed`),note(String(err instanceof Error?err.message:err),`Error`),null}upsertSharedEnvVar({key:`BUILDERFORCE_URL`,value:serverUrl}),upsertSharedEnvVar({key:`BUILDERFORCE_WEB_TOKEN`,value:webToken}),upsertSharedEnvVar({key:`BUILDERFORCE_TENANT_ID`,value:String(tenantId)}),upsertSharedEnvVar({key:`BUILDERFORCE_API_KEY`,value:apiKey}),upsertSharedEnvVar({key:`BUILDERFORCE_SKIPPED`,value:`0`});try{await updateProjectContextFields(params.projectRoot,{builderforce:{instanceId:agentNodeId,instanceSlug:agentNodeSlug,instanceName:agentNodeName,...projectId?{projectId}:{},tenantId,url:serverUrl,machineProfile}})}catch{}return note([`AgentNode API key saved to ~/.builderforce/.env`,`This key was shown once — it is hashed on the server.`,`Instance slug: ${agentNodeSlug} · tenant: ${tenantId}`,projectId?`Project ${projectAction}: ${projectId}`:`Project mapping: not available`].join(`
|
|
24
|
+
`),`Builderforce connected`),`Builderforce: ${agentNodeName} (${agentNodeSlug}) on tenant ${tenantId}`}export{promptBuilderforceOnboarding};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{d as getActivePluginRegistry}from"./registry-Cv7CoWAs.js";import{H as resolveConfiguredModelRef,_n as DEFAULT_PROVIDER,gn as DEFAULT_MODEL}from"./auth-profiles-
|
|
1
|
+
import{d as getActivePluginRegistry}from"./registry-Cv7CoWAs.js";import{H as resolveConfiguredModelRef,_n as DEFAULT_PROVIDER,gn as DEFAULT_MODEL}from"./auth-profiles-pt7Tr4HA.js";import{R as listChannelDocks}from"./sessions-BA8Se_bT.js";import{s as listThinkingLevels}from"./embedded-helpers-DdU30lmt.js";import"node:os";import path from"node:path";import fs from"node:fs";import fs$1 from"node:fs/promises";function normalizeArgValue(value){if(value==null)return;let text;return text=typeof value==`string`?value.trim():typeof value==`number`||typeof value==`boolean`||typeof value==`bigint`?String(value).trim():typeof value==`symbol`||typeof value==`function`?value.toString().trim():JSON.stringify(value),text||void 0}function formatActionArgs(values,params){let action=normalizeArgValue(values.action)?.toLowerCase(),path=normalizeArgValue(values.path),value=normalizeArgValue(values.value);return action?params.formatKnownAction(action,path)||formatSetUnsetArgAction(action,{path,value}):void 0}const formatConfigArgs=values=>formatActionArgs(values,{formatKnownAction:(action,path)=>{if(action===`show`||action===`get`)return path?`${action} ${path}`:action}}),formatDebugArgs=values=>formatActionArgs(values,{formatKnownAction:action=>{if(action===`show`||action===`reset`)return action}});function formatSetUnsetArgAction(action,params){return action===`unset`?params.path?`${action} ${params.path}`:action:action===`set`&¶ms.path?params.value?`${action} ${params.path}=${params.value}`:`${action} ${params.path}`:action}const COMMAND_ARG_FORMATTERS={config:formatConfigArgs,debug:formatDebugArgs,queue:values=>{let mode=normalizeArgValue(values.mode),debounce=normalizeArgValue(values.debounce),cap=normalizeArgValue(values.cap),drop=normalizeArgValue(values.drop),parts=[];return mode&&parts.push(mode),debounce&&parts.push(`debounce:${debounce}`),cap&&parts.push(`cap:${cap}`),drop&&parts.push(`drop:${drop}`),parts.length>0?parts.join(` `):void 0},exec:values=>{let host=normalizeArgValue(values.host),security=normalizeArgValue(values.security),ask=normalizeArgValue(values.ask),node=normalizeArgValue(values.node),parts=[];return host&&parts.push(`host=${host}`),security&&parts.push(`security=${security}`),ask&&parts.push(`ask=${ask}`),node&&parts.push(`node=${node}`),parts.length>0?parts.join(` `):void 0}};function defineChatCommand(command){let aliases=(command.textAliases??(command.textAlias?[command.textAlias]:[])).map(alias=>alias.trim()).filter(Boolean),scope=command.scope??(command.nativeName?aliases.length?`both`:`native`:`text`),acceptsArgs=command.acceptsArgs??!!command.args?.length,argsParsing=command.argsParsing??(command.args?.length?`positional`:`none`);return{key:command.key,nativeName:command.nativeName,description:command.description,acceptsArgs,args:command.args,argsParsing,formatArgs:command.formatArgs,argsMenu:command.argsMenu,textAliases:aliases,scope,category:command.category}}function defineDockCommand(dock){return defineChatCommand({key:`dock:${dock.id}`,nativeName:`dock_${dock.id}`,description:`Switch to ${dock.id} for replies.`,textAliases:[`/dock-${dock.id}`,`/dock_${dock.id}`],category:`docks`})}function registerAlias(commands,key,...aliases){let command=commands.find(entry=>entry.key===key);if(!command)throw Error(`registerAlias: unknown command key: ${key}`);let existing=new Set(command.textAliases.map(alias=>alias.trim().toLowerCase()));for(let alias of aliases){let trimmed=alias.trim();if(!trimmed)continue;let lowered=trimmed.toLowerCase();existing.has(lowered)||(existing.add(lowered),command.textAliases.push(trimmed))}}function assertCommandRegistry(commands){let keys=new Set,nativeNames=new Set,textAliases=new Set;for(let command of commands){if(keys.has(command.key))throw Error(`Duplicate command key: ${command.key}`);keys.add(command.key);let nativeName=command.nativeName?.trim();if(command.scope===`text`){if(nativeName)throw Error(`Text-only command has native name: ${command.key}`);if(command.textAliases.length===0)throw Error(`Text-only command missing text alias: ${command.key}`)}else if(nativeName){let nativeKey=nativeName.toLowerCase();if(nativeNames.has(nativeKey))throw Error(`Duplicate native command: ${nativeName}`);nativeNames.add(nativeKey)}else throw Error(`Native command missing native name: ${command.key}`);if(command.scope===`native`&&command.textAliases.length>0)throw Error(`Native-only command has text aliases: ${command.key}`);for(let alias of command.textAliases){if(!alias.startsWith(`/`))throw Error(`Command alias missing leading '/': ${alias}`);let aliasKey=alias.toLowerCase();if(textAliases.has(aliasKey))throw Error(`Duplicate command alias: ${alias}`);textAliases.add(aliasKey)}}}let cachedCommands=null,cachedRegistry=null,cachedNativeCommandSurfaces=null,cachedNativeRegistry=null;function buildChatCommands(){let commands=[defineChatCommand({key:`help`,nativeName:`help`,description:`Show available commands.`,textAlias:`/help`,category:`status`}),defineChatCommand({key:`commands`,nativeName:`commands`,description:`List all slash commands.`,textAlias:`/commands`,category:`status`}),defineChatCommand({key:`skill`,nativeName:`skill`,description:`Run a skill by name.`,textAlias:`/skill`,category:`tools`,args:[{name:`name`,description:`Skill name`,type:`string`,required:!0},{name:`input`,description:`Skill input`,type:`string`,captureRemaining:!0}]}),defineChatCommand({key:`status`,nativeName:`status`,description:`Show current status.`,textAlias:`/status`,category:`status`}),defineChatCommand({key:`allowlist`,description:`List/add/remove allowlist entries.`,textAlias:`/allowlist`,acceptsArgs:!0,scope:`text`,category:`management`}),defineChatCommand({key:`approve`,nativeName:`approve`,description:`Approve or deny exec requests.`,textAlias:`/approve`,acceptsArgs:!0,category:`management`}),defineChatCommand({key:`context`,nativeName:`context`,description:`Explain how context is built and used.`,textAlias:`/context`,acceptsArgs:!0,category:`status`}),defineChatCommand({key:`export-session`,nativeName:`export-session`,description:`Export current session to HTML file with full system prompt.`,textAliases:[`/export-session`,`/export`],acceptsArgs:!0,category:`status`,args:[{name:`path`,description:`Output path (default: workspace)`,type:`string`,required:!1}]}),defineChatCommand({key:`tts`,nativeName:`tts`,description:`Control text-to-speech (TTS).`,textAlias:`/tts`,category:`media`,args:[{name:`action`,description:`TTS action`,type:`string`,choices:[{value:`on`,label:`On`},{value:`off`,label:`Off`},{value:`status`,label:`Status`},{value:`provider`,label:`Provider`},{value:`limit`,label:`Limit`},{value:`summary`,label:`Summary`},{value:`audio`,label:`Audio`},{value:`help`,label:`Help`}]},{name:`value`,description:`Provider, limit, or text`,type:`string`,captureRemaining:!0}],argsMenu:{arg:`action`,title:`TTS Actions:
|
|
2
2
|
• On – Enable TTS for responses
|
|
3
3
|
• Off – Disable TTS
|
|
4
4
|
• Status – Show current settings
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{H as listThinkingLevels}from"./embedded-helpers-
|
|
1
|
+
import{H as listThinkingLevels}from"./embedded-helpers-C9jpiwlw.js";import{d as getActivePluginRegistry}from"./registry-TdK-aV05.js";import{bn as DEFAULT_PROVIDER,m as resolveConfiguredModelRef,yn as DEFAULT_MODEL}from"./model-selection-DG9J_VTz.js";import{G as listChannelDocks}from"./sessions-BuZVmOWt.js";import fs from"node:fs";import"node:os";import path from"node:path";import fs$1 from"node:fs/promises";function normalizeArgValue(value){if(value==null)return;let text;return text=typeof value==`string`?value.trim():typeof value==`number`||typeof value==`boolean`||typeof value==`bigint`?String(value).trim():typeof value==`symbol`||typeof value==`function`?value.toString().trim():JSON.stringify(value),text||void 0}function formatActionArgs(values,params){let action=normalizeArgValue(values.action)?.toLowerCase(),path=normalizeArgValue(values.path),value=normalizeArgValue(values.value);return action?params.formatKnownAction(action,path)||formatSetUnsetArgAction(action,{path,value}):void 0}const formatConfigArgs=values=>formatActionArgs(values,{formatKnownAction:(action,path)=>{if(action===`show`||action===`get`)return path?`${action} ${path}`:action}}),formatDebugArgs=values=>formatActionArgs(values,{formatKnownAction:action=>{if(action===`show`||action===`reset`)return action}});function formatSetUnsetArgAction(action,params){return action===`unset`?params.path?`${action} ${params.path}`:action:action===`set`&¶ms.path?params.value?`${action} ${params.path}=${params.value}`:`${action} ${params.path}`:action}const COMMAND_ARG_FORMATTERS={config:formatConfigArgs,debug:formatDebugArgs,queue:values=>{let mode=normalizeArgValue(values.mode),debounce=normalizeArgValue(values.debounce),cap=normalizeArgValue(values.cap),drop=normalizeArgValue(values.drop),parts=[];return mode&&parts.push(mode),debounce&&parts.push(`debounce:${debounce}`),cap&&parts.push(`cap:${cap}`),drop&&parts.push(`drop:${drop}`),parts.length>0?parts.join(` `):void 0},exec:values=>{let host=normalizeArgValue(values.host),security=normalizeArgValue(values.security),ask=normalizeArgValue(values.ask),node=normalizeArgValue(values.node),parts=[];return host&&parts.push(`host=${host}`),security&&parts.push(`security=${security}`),ask&&parts.push(`ask=${ask}`),node&&parts.push(`node=${node}`),parts.length>0?parts.join(` `):void 0}};function defineChatCommand(command){let aliases=(command.textAliases??(command.textAlias?[command.textAlias]:[])).map(alias=>alias.trim()).filter(Boolean),scope=command.scope??(command.nativeName?aliases.length?`both`:`native`:`text`),acceptsArgs=command.acceptsArgs??!!command.args?.length,argsParsing=command.argsParsing??(command.args?.length?`positional`:`none`);return{key:command.key,nativeName:command.nativeName,description:command.description,acceptsArgs,args:command.args,argsParsing,formatArgs:command.formatArgs,argsMenu:command.argsMenu,textAliases:aliases,scope,category:command.category}}function defineDockCommand(dock){return defineChatCommand({key:`dock:${dock.id}`,nativeName:`dock_${dock.id}`,description:`Switch to ${dock.id} for replies.`,textAliases:[`/dock-${dock.id}`,`/dock_${dock.id}`],category:`docks`})}function registerAlias(commands,key,...aliases){let command=commands.find(entry=>entry.key===key);if(!command)throw Error(`registerAlias: unknown command key: ${key}`);let existing=new Set(command.textAliases.map(alias=>alias.trim().toLowerCase()));for(let alias of aliases){let trimmed=alias.trim();if(!trimmed)continue;let lowered=trimmed.toLowerCase();existing.has(lowered)||(existing.add(lowered),command.textAliases.push(trimmed))}}function assertCommandRegistry(commands){let keys=new Set,nativeNames=new Set,textAliases=new Set;for(let command of commands){if(keys.has(command.key))throw Error(`Duplicate command key: ${command.key}`);keys.add(command.key);let nativeName=command.nativeName?.trim();if(command.scope===`text`){if(nativeName)throw Error(`Text-only command has native name: ${command.key}`);if(command.textAliases.length===0)throw Error(`Text-only command missing text alias: ${command.key}`)}else if(nativeName){let nativeKey=nativeName.toLowerCase();if(nativeNames.has(nativeKey))throw Error(`Duplicate native command: ${nativeName}`);nativeNames.add(nativeKey)}else throw Error(`Native command missing native name: ${command.key}`);if(command.scope===`native`&&command.textAliases.length>0)throw Error(`Native-only command has text aliases: ${command.key}`);for(let alias of command.textAliases){if(!alias.startsWith(`/`))throw Error(`Command alias missing leading '/': ${alias}`);let aliasKey=alias.toLowerCase();if(textAliases.has(aliasKey))throw Error(`Duplicate command alias: ${alias}`);textAliases.add(aliasKey)}}}let cachedCommands=null,cachedRegistry=null,cachedNativeCommandSurfaces=null,cachedNativeRegistry=null;function buildChatCommands(){let commands=[defineChatCommand({key:`help`,nativeName:`help`,description:`Show available commands.`,textAlias:`/help`,category:`status`}),defineChatCommand({key:`commands`,nativeName:`commands`,description:`List all slash commands.`,textAlias:`/commands`,category:`status`}),defineChatCommand({key:`skill`,nativeName:`skill`,description:`Run a skill by name.`,textAlias:`/skill`,category:`tools`,args:[{name:`name`,description:`Skill name`,type:`string`,required:!0},{name:`input`,description:`Skill input`,type:`string`,captureRemaining:!0}]}),defineChatCommand({key:`status`,nativeName:`status`,description:`Show current status.`,textAlias:`/status`,category:`status`}),defineChatCommand({key:`allowlist`,description:`List/add/remove allowlist entries.`,textAlias:`/allowlist`,acceptsArgs:!0,scope:`text`,category:`management`}),defineChatCommand({key:`approve`,nativeName:`approve`,description:`Approve or deny exec requests.`,textAlias:`/approve`,acceptsArgs:!0,category:`management`}),defineChatCommand({key:`context`,nativeName:`context`,description:`Explain how context is built and used.`,textAlias:`/context`,acceptsArgs:!0,category:`status`}),defineChatCommand({key:`export-session`,nativeName:`export-session`,description:`Export current session to HTML file with full system prompt.`,textAliases:[`/export-session`,`/export`],acceptsArgs:!0,category:`status`,args:[{name:`path`,description:`Output path (default: workspace)`,type:`string`,required:!1}]}),defineChatCommand({key:`tts`,nativeName:`tts`,description:`Control text-to-speech (TTS).`,textAlias:`/tts`,category:`media`,args:[{name:`action`,description:`TTS action`,type:`string`,choices:[{value:`on`,label:`On`},{value:`off`,label:`Off`},{value:`status`,label:`Status`},{value:`provider`,label:`Provider`},{value:`limit`,label:`Limit`},{value:`summary`,label:`Summary`},{value:`audio`,label:`Audio`},{value:`help`,label:`Help`}]},{name:`value`,description:`Provider, limit, or text`,type:`string`,captureRemaining:!0}],argsMenu:{arg:`action`,title:`TTS Actions:
|
|
2
2
|
• On – Enable TTS for responses
|
|
3
3
|
• Off – Disable TTS
|
|
4
4
|
• Status – Show current settings
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import"./paths-5FcIFMsj.js";import"./utils-DbaBVFaK.js";import"./session-key-EoB0qaG9.js";import"./builderforce-root-D64_sXEi.js";import"./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"./utils-DbaBVFaK.js";import"./session-key-EoB0qaG9.js";import"./builderforce-root-D64_sXEi.js";import"./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{t as buildGatewayConnectionDetails}from"./call-T8ciwMTA.js";export{buildGatewayConnectionDetails};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import"./paths-BHg-VHB4.js";import"./registry-Cv7CoWAs.js";import"./utils-BP60e80M.js";import"./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"./utils-BP60e80M.js";import"./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{t as buildGatewayConnectionDetails}from"./call-Du2LiaX6.js";import"./message-channel-z5YRpR2d.js";export{buildGatewayConnectionDetails};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{g as resolveStateDir,o as resolveConfigPath,u as resolveGatewayPort}from"./paths-BHg-VHB4.js";import{s as ensureDir,t as CONFIG_DIR,x as shortenHomeInString,y as resolveUserPath}from"./utils-BP60e80M.js";import{r as loadConfig}from"./io-
|
|
1
|
+
import{g as resolveStateDir,o as resolveConfigPath,u as resolveGatewayPort}from"./paths-BHg-VHB4.js";import{s as ensureDir,t as CONFIG_DIR,x as shortenHomeInString,y as resolveUserPath}from"./utils-BP60e80M.js";import{r as loadConfig}from"./io-D9hC2aG0.js";import{Bt as loadOrCreateDeviceIdentity,Rt as normalizeFingerprint,jt as PROTOCOL_VERSION,t as GatewayClient}from"./client-CGgp3zkQ.js";import{n as pickPrimaryTailnetIPv4}from"./tailnet-B0Q5E6lZ.js";import{h as GATEWAY_CLIENT_NAMES,m as GATEWAY_CLIENT_MODES}from"./message-channel-z5YRpR2d.js";import{c as pickPrimaryLanIPv4}from"./net-DtnXq2dW.js";import{execFile}from"node:child_process";import path from"node:path";import{promisify}from"node:util";import{X509Certificate,randomUUID}from"node:crypto";import fs from"node:fs/promises";const execFileAsync=promisify(execFile);async function fileExists(filePath){try{return await fs.access(filePath),!0}catch{return!1}}async function generateSelfSignedCert(params){let certDir=path.dirname(params.certPath),keyDir=path.dirname(params.keyPath);await ensureDir(certDir),keyDir!==certDir&&await ensureDir(keyDir),await execFileAsync(`openssl`,[`req`,`-x509`,`-newkey`,`rsa:2048`,`-sha256`,`-days`,`3650`,`-nodes`,`-keyout`,params.keyPath,`-out`,params.certPath,`-subj`,`/CN=builderforce-gateway`]),await fs.chmod(params.keyPath,384).catch(()=>{}),await fs.chmod(params.certPath,384).catch(()=>{}),params.log?.info?.(`gateway tls: generated self-signed cert at ${shortenHomeInString(params.certPath)}`)}async function loadGatewayTlsRuntime(cfg,log){if(!cfg||cfg.enabled!==!0)return{enabled:!1,required:!1};let autoGenerate=cfg.autoGenerate!==!1,baseDir=path.join(CONFIG_DIR,`gateway`,`tls`),certPath=resolveUserPath(cfg.certPath??path.join(baseDir,`gateway-cert.pem`)),keyPath=resolveUserPath(cfg.keyPath??path.join(baseDir,`gateway-key.pem`)),caPath=cfg.caPath?resolveUserPath(cfg.caPath):void 0,hasCert=await fileExists(certPath),hasKey=await fileExists(keyPath);if(!hasCert&&!hasKey&&autoGenerate)try{await generateSelfSignedCert({certPath,keyPath,log})}catch(err){return{enabled:!1,required:!0,certPath,keyPath,error:`gateway tls: failed to generate cert (${String(err)})`}}if(!await fileExists(certPath)||!await fileExists(keyPath))return{enabled:!1,required:!0,certPath,keyPath,error:`gateway tls: cert/key missing`};try{let cert=await fs.readFile(certPath,`utf8`),key=await fs.readFile(keyPath,`utf8`),ca=caPath?await fs.readFile(caPath,`utf8`):void 0,fingerprintSha256=normalizeFingerprint(new X509Certificate(cert).fingerprint256??``);return fingerprintSha256?{enabled:!0,required:!0,certPath,keyPath,caPath,fingerprintSha256,tlsOptions:{cert,key,ca,minVersion:`TLSv1.3`}}:{enabled:!1,required:!0,certPath,keyPath,caPath,error:`gateway tls: unable to compute certificate fingerprint`}}catch(err){return{enabled:!1,required:!0,certPath,keyPath,caPath,error:`gateway tls: failed to load cert (${String(err)})`}}}function resolveExplicitGatewayAuth(opts){return{token:typeof opts?.token==`string`&&opts.token.trim().length>0?opts.token.trim():void 0,password:typeof opts?.password==`string`&&opts.password.trim().length>0?opts.password.trim():void 0}}function ensureExplicitGatewayAuth(params){if(!params.urlOverride||params.auth.token||params.auth.password)return;let message=[`gateway url override requires explicit credentials`,params.errorHint,params.configPath?`Config: ${params.configPath}`:void 0].filter(Boolean).join(`
|
|
2
2
|
`);throw Error(message)}function buildGatewayConnectionDetails(options={}){let config=options.config??loadConfig(),configPath=options.configPath??resolveConfigPath(process.env,resolveStateDir(process.env)),isRemoteMode=config.gateway?.mode===`remote`,remote=isRemoteMode?config.gateway?.remote:void 0,tlsEnabled=config.gateway?.tls?.enabled===!0,localPort=resolveGatewayPort(config),tailnetIPv4=pickPrimaryTailnetIPv4(),bindMode=config.gateway?.bind??`loopback`,preferTailnet=bindMode===`tailnet`&&!!tailnetIPv4,preferLan=bindMode===`lan`,lanIPv4=preferLan?pickPrimaryLanIPv4():void 0,scheme=tlsEnabled?`wss`:`ws`,localUrl=preferTailnet&&tailnetIPv4?`${scheme}://${tailnetIPv4}:${localPort}`:preferLan&&lanIPv4?`${scheme}://${lanIPv4}:${localPort}`:`${scheme}://127.0.0.1:${localPort}`,urlOverride=typeof options.url==`string`&&options.url.trim().length>0?options.url.trim():void 0,remoteUrl=typeof remote?.url==`string`&&remote.url.trim().length>0?remote.url.trim():void 0,remoteMisconfigured=isRemoteMode&&!urlOverride&&!remoteUrl,url=urlOverride||remoteUrl||localUrl,urlSource=urlOverride?`cli --url`:remoteUrl?`config gateway.remote.url`:remoteMisconfigured?`missing gateway.remote.url (fallback local)`:preferTailnet&&tailnetIPv4?`local tailnet ${tailnetIPv4}`:preferLan&&lanIPv4?`local lan ${lanIPv4}`:`local loopback`,remoteFallbackNote=remoteMisconfigured?`Warn: gateway.mode=remote but gateway.remote.url is missing; set gateway.remote.url or switch gateway.mode=local.`:void 0,bindDetail=!urlOverride&&!remoteUrl?`Bind: ${bindMode}`:void 0;return{url,urlSource,bindDetail,remoteFallbackNote,message:[`Gateway target: ${url}`,`Source: ${urlSource}`,`Config: ${configPath}`,bindDetail,remoteFallbackNote].filter(Boolean).join(`
|
|
3
3
|
`)}}async function callGateway(opts){let timeoutMs=typeof opts.timeoutMs==`number`&&Number.isFinite(opts.timeoutMs)?opts.timeoutMs:1e4,safeTimerTimeoutMs=Math.max(1,Math.min(Math.floor(timeoutMs),2147483647)),config=opts.config??loadConfig(),isRemoteMode=config.gateway?.mode===`remote`,remote=isRemoteMode?config.gateway?.remote:void 0,urlOverride=typeof opts.url==`string`&&opts.url.trim().length>0?opts.url.trim():void 0,explicitAuth=resolveExplicitGatewayAuth({token:opts.token,password:opts.password});ensureExplicitGatewayAuth({urlOverride,auth:explicitAuth,errorHint:`Fix: pass --token or --password (or gatewayToken in tools).`,configPath:opts.configPath??resolveConfigPath(process.env,resolveStateDir(process.env))});let remoteUrl=typeof remote?.url==`string`&&remote.url.trim().length>0?remote.url.trim():void 0;if(isRemoteMode&&!urlOverride&&!remoteUrl){let configPath=opts.configPath??resolveConfigPath(process.env,resolveStateDir(process.env));throw Error([`gateway remote mode misconfigured: gateway.remote.url missing`,`Config: ${configPath}`,`Fix: set gateway.remote.url, or set gateway.mode=local.`].join(`
|
|
4
4
|
`))}let authToken=config.gateway?.auth?.token,authPassword=config.gateway?.auth?.password,connectionDetails=buildGatewayConnectionDetails({config,url:urlOverride,...opts.configPath?{configPath:opts.configPath}:{}}),url=connectionDetails.url,tlsRuntime=config.gateway?.tls?.enabled===!0&&!urlOverride&&!remoteUrl&&url.startsWith(`wss://`)?await loadGatewayTlsRuntime(config.gateway?.tls):void 0,remoteTlsFingerprint=isRemoteMode&&!urlOverride&&remoteUrl&&typeof remote?.tlsFingerprint==`string`?remote.tlsFingerprint.trim():void 0,tlsFingerprint=(typeof opts.tlsFingerprint==`string`?opts.tlsFingerprint.trim():void 0)||remoteTlsFingerprint||(tlsRuntime?.enabled?tlsRuntime.fingerprintSha256:void 0),token=explicitAuth.token||(urlOverride?void 0:isRemoteMode?typeof remote?.token==`string`&&remote.token.trim().length>0?remote.token.trim():void 0:process.env.BUILDERFORCE_AGENTS_GATEWAY_TOKEN?.trim()||process.env.BUILDERFORCE_AGENTS_GATEWAY_TOKEN?.trim()||(typeof authToken==`string`&&authToken.trim().length>0?authToken.trim():void 0)),password=explicitAuth.password||(urlOverride?void 0:process.env.BUILDERFORCE_AGENTS_GATEWAY_PASSWORD?.trim()||process.env.BUILDERFORCE_AGENTS_GATEWAY_PASSWORD?.trim()||(isRemoteMode?typeof remote?.password==`string`&&remote.password.trim().length>0?remote.password.trim():void 0:typeof authPassword==`string`&&authPassword.trim().length>0?authPassword.trim():void 0)),formatCloseError=(code,reason)=>{let reasonText=reason?.trim()||`no close reason`,hint=code===1006?`abnormal closure (no close frame)`:code===1e3?`normal closure`:``;return`gateway closed (${code}${hint?` ${hint}`:``}): ${reasonText}\n${connectionDetails.message}`},formatTimeoutError=()=>`gateway timeout after ${timeoutMs}ms\n${connectionDetails.message}`;return await new Promise((resolve,reject)=>{let settled=!1,ignoreClose=!1,stop=(err,value)=>{settled||(settled=!0,clearTimeout(timer),err?reject(err):resolve(value))},client=new GatewayClient({url,token,password,tlsFingerprint,instanceId:opts.instanceId??randomUUID(),clientName:opts.clientName??GATEWAY_CLIENT_NAMES.CLI,clientDisplayName:opts.clientDisplayName,clientVersion:opts.clientVersion??`dev`,platform:opts.platform,mode:opts.mode??GATEWAY_CLIENT_MODES.CLI,role:`operator`,scopes:[`operator.admin`,`operator.approvals`,`operator.pairing`],deviceIdentity:loadOrCreateDeviceIdentity(),minProtocol:opts.minProtocol??PROTOCOL_VERSION,maxProtocol:opts.maxProtocol??PROTOCOL_VERSION,onHelloOk:async()=>{try{let result=await client.request(opts.method,opts.params,{expectFinal:opts.expectFinal});ignoreClose=!0,stop(void 0,result),client.stop()}catch(err){ignoreClose=!0,client.stop(),stop(err)}},onClose:(code,reason)=>{settled||ignoreClose||(ignoreClose=!0,client.stop(),stop(Error(formatCloseError(code,reason))))}}),timer=setTimeout(()=>{ignoreClose=!0,client.stop(),stop(Error(formatTimeoutError()))},safeTimerTimeoutMs);client.start()})}function randomIdempotencyKey(){return randomUUID()}export{resolveExplicitGatewayAuth as a,randomIdempotencyKey as i,callGateway as n,loadGatewayTlsRuntime as o,ensureExplicitGatewayAuth as r,buildGatewayConnectionDetails as t};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{g as resolveStateDir,o as resolveConfigPath,u as resolveGatewayPort}from"./paths-5FcIFMsj.js";import{S as shortenHomeInString,b as resolveUserPath,c as ensureDir,t as CONFIG_DIR}from"./utils-DbaBVFaK.js";import{r as loadConfig}from"./io-
|
|
1
|
+
import{g as resolveStateDir,o as resolveConfigPath,u as resolveGatewayPort}from"./paths-5FcIFMsj.js";import{S as shortenHomeInString,b as resolveUserPath,c as ensureDir,t as CONFIG_DIR}from"./utils-DbaBVFaK.js";import{r as loadConfig}from"./io-BLBq4T2o.js";import{n as pickPrimaryTailnetIPv4}from"./tailnet-CTj65CYb.js";import{l as pickPrimaryLanIPv4}from"./ws-Bbu03j3h.js";import{h as GATEWAY_CLIENT_NAMES,m as GATEWAY_CLIENT_MODES}from"./message-channel-D_jXxXQj.js";import{Bt as loadOrCreateDeviceIdentity,Rt as normalizeFingerprint,jt as PROTOCOL_VERSION,t as GatewayClient}from"./client-xfoidwPI.js";import path from"node:path";import{X509Certificate,randomUUID}from"node:crypto";import fs from"node:fs/promises";import{execFile}from"node:child_process";import{promisify}from"node:util";const execFileAsync=promisify(execFile);async function fileExists(filePath){try{return await fs.access(filePath),!0}catch{return!1}}async function generateSelfSignedCert(params){let certDir=path.dirname(params.certPath),keyDir=path.dirname(params.keyPath);await ensureDir(certDir),keyDir!==certDir&&await ensureDir(keyDir),await execFileAsync(`openssl`,[`req`,`-x509`,`-newkey`,`rsa:2048`,`-sha256`,`-days`,`3650`,`-nodes`,`-keyout`,params.keyPath,`-out`,params.certPath,`-subj`,`/CN=builderforce-gateway`]),await fs.chmod(params.keyPath,384).catch(()=>{}),await fs.chmod(params.certPath,384).catch(()=>{}),params.log?.info?.(`gateway tls: generated self-signed cert at ${shortenHomeInString(params.certPath)}`)}async function loadGatewayTlsRuntime(cfg,log){if(!cfg||cfg.enabled!==!0)return{enabled:!1,required:!1};let autoGenerate=cfg.autoGenerate!==!1,baseDir=path.join(CONFIG_DIR,`gateway`,`tls`),certPath=resolveUserPath(cfg.certPath??path.join(baseDir,`gateway-cert.pem`)),keyPath=resolveUserPath(cfg.keyPath??path.join(baseDir,`gateway-key.pem`)),caPath=cfg.caPath?resolveUserPath(cfg.caPath):void 0,hasCert=await fileExists(certPath),hasKey=await fileExists(keyPath);if(!hasCert&&!hasKey&&autoGenerate)try{await generateSelfSignedCert({certPath,keyPath,log})}catch(err){return{enabled:!1,required:!0,certPath,keyPath,error:`gateway tls: failed to generate cert (${String(err)})`}}if(!await fileExists(certPath)||!await fileExists(keyPath))return{enabled:!1,required:!0,certPath,keyPath,error:`gateway tls: cert/key missing`};try{let cert=await fs.readFile(certPath,`utf8`),key=await fs.readFile(keyPath,`utf8`),ca=caPath?await fs.readFile(caPath,`utf8`):void 0,fingerprintSha256=normalizeFingerprint(new X509Certificate(cert).fingerprint256??``);return fingerprintSha256?{enabled:!0,required:!0,certPath,keyPath,caPath,fingerprintSha256,tlsOptions:{cert,key,ca,minVersion:`TLSv1.3`}}:{enabled:!1,required:!0,certPath,keyPath,caPath,error:`gateway tls: unable to compute certificate fingerprint`}}catch(err){return{enabled:!1,required:!0,certPath,keyPath,caPath,error:`gateway tls: failed to load cert (${String(err)})`}}}function resolveExplicitGatewayAuth(opts){return{token:typeof opts?.token==`string`&&opts.token.trim().length>0?opts.token.trim():void 0,password:typeof opts?.password==`string`&&opts.password.trim().length>0?opts.password.trim():void 0}}function ensureExplicitGatewayAuth(params){if(!params.urlOverride||params.auth.token||params.auth.password)return;let message=[`gateway url override requires explicit credentials`,params.errorHint,params.configPath?`Config: ${params.configPath}`:void 0].filter(Boolean).join(`
|
|
2
2
|
`);throw Error(message)}function buildGatewayConnectionDetails(options={}){let config=options.config??loadConfig(),configPath=options.configPath??resolveConfigPath(process.env,resolveStateDir(process.env)),isRemoteMode=config.gateway?.mode===`remote`,remote=isRemoteMode?config.gateway?.remote:void 0,tlsEnabled=config.gateway?.tls?.enabled===!0,localPort=resolveGatewayPort(config),tailnetIPv4=pickPrimaryTailnetIPv4(),bindMode=config.gateway?.bind??`loopback`,preferTailnet=bindMode===`tailnet`&&!!tailnetIPv4,preferLan=bindMode===`lan`,lanIPv4=preferLan?pickPrimaryLanIPv4():void 0,scheme=tlsEnabled?`wss`:`ws`,localUrl=preferTailnet&&tailnetIPv4?`${scheme}://${tailnetIPv4}:${localPort}`:preferLan&&lanIPv4?`${scheme}://${lanIPv4}:${localPort}`:`${scheme}://127.0.0.1:${localPort}`,urlOverride=typeof options.url==`string`&&options.url.trim().length>0?options.url.trim():void 0,remoteUrl=typeof remote?.url==`string`&&remote.url.trim().length>0?remote.url.trim():void 0,remoteMisconfigured=isRemoteMode&&!urlOverride&&!remoteUrl,url=urlOverride||remoteUrl||localUrl,urlSource=urlOverride?`cli --url`:remoteUrl?`config gateway.remote.url`:remoteMisconfigured?`missing gateway.remote.url (fallback local)`:preferTailnet&&tailnetIPv4?`local tailnet ${tailnetIPv4}`:preferLan&&lanIPv4?`local lan ${lanIPv4}`:`local loopback`,remoteFallbackNote=remoteMisconfigured?`Warn: gateway.mode=remote but gateway.remote.url is missing; set gateway.remote.url or switch gateway.mode=local.`:void 0,bindDetail=!urlOverride&&!remoteUrl?`Bind: ${bindMode}`:void 0;return{url,urlSource,bindDetail,remoteFallbackNote,message:[`Gateway target: ${url}`,`Source: ${urlSource}`,`Config: ${configPath}`,bindDetail,remoteFallbackNote].filter(Boolean).join(`
|
|
3
3
|
`)}}async function callGateway(opts){let timeoutMs=typeof opts.timeoutMs==`number`&&Number.isFinite(opts.timeoutMs)?opts.timeoutMs:1e4,safeTimerTimeoutMs=Math.max(1,Math.min(Math.floor(timeoutMs),2147483647)),config=opts.config??loadConfig(),isRemoteMode=config.gateway?.mode===`remote`,remote=isRemoteMode?config.gateway?.remote:void 0,urlOverride=typeof opts.url==`string`&&opts.url.trim().length>0?opts.url.trim():void 0,explicitAuth=resolveExplicitGatewayAuth({token:opts.token,password:opts.password});ensureExplicitGatewayAuth({urlOverride,auth:explicitAuth,errorHint:`Fix: pass --token or --password (or gatewayToken in tools).`,configPath:opts.configPath??resolveConfigPath(process.env,resolveStateDir(process.env))});let remoteUrl=typeof remote?.url==`string`&&remote.url.trim().length>0?remote.url.trim():void 0;if(isRemoteMode&&!urlOverride&&!remoteUrl){let configPath=opts.configPath??resolveConfigPath(process.env,resolveStateDir(process.env));throw Error([`gateway remote mode misconfigured: gateway.remote.url missing`,`Config: ${configPath}`,`Fix: set gateway.remote.url, or set gateway.mode=local.`].join(`
|
|
4
4
|
`))}let authToken=config.gateway?.auth?.token,authPassword=config.gateway?.auth?.password,connectionDetails=buildGatewayConnectionDetails({config,url:urlOverride,...opts.configPath?{configPath:opts.configPath}:{}}),url=connectionDetails.url,tlsRuntime=config.gateway?.tls?.enabled===!0&&!urlOverride&&!remoteUrl&&url.startsWith(`wss://`)?await loadGatewayTlsRuntime(config.gateway?.tls):void 0,remoteTlsFingerprint=isRemoteMode&&!urlOverride&&remoteUrl&&typeof remote?.tlsFingerprint==`string`?remote.tlsFingerprint.trim():void 0,tlsFingerprint=(typeof opts.tlsFingerprint==`string`?opts.tlsFingerprint.trim():void 0)||remoteTlsFingerprint||(tlsRuntime?.enabled?tlsRuntime.fingerprintSha256:void 0),token=explicitAuth.token||(urlOverride?void 0:isRemoteMode?typeof remote?.token==`string`&&remote.token.trim().length>0?remote.token.trim():void 0:process.env.BUILDERFORCE_AGENTS_GATEWAY_TOKEN?.trim()||process.env.BUILDERFORCE_AGENTS_GATEWAY_TOKEN?.trim()||(typeof authToken==`string`&&authToken.trim().length>0?authToken.trim():void 0)),password=explicitAuth.password||(urlOverride?void 0:process.env.BUILDERFORCE_AGENTS_GATEWAY_PASSWORD?.trim()||process.env.BUILDERFORCE_AGENTS_GATEWAY_PASSWORD?.trim()||(isRemoteMode?typeof remote?.password==`string`&&remote.password.trim().length>0?remote.password.trim():void 0:typeof authPassword==`string`&&authPassword.trim().length>0?authPassword.trim():void 0)),formatCloseError=(code,reason)=>{let reasonText=reason?.trim()||`no close reason`,hint=code===1006?`abnormal closure (no close frame)`:code===1e3?`normal closure`:``;return`gateway closed (${code}${hint?` ${hint}`:``}): ${reasonText}\n${connectionDetails.message}`},formatTimeoutError=()=>`gateway timeout after ${timeoutMs}ms\n${connectionDetails.message}`;return await new Promise((resolve,reject)=>{let settled=!1,ignoreClose=!1,stop=(err,value)=>{settled||(settled=!0,clearTimeout(timer),err?reject(err):resolve(value))},client=new GatewayClient({url,token,password,tlsFingerprint,instanceId:opts.instanceId??randomUUID(),clientName:opts.clientName??GATEWAY_CLIENT_NAMES.CLI,clientDisplayName:opts.clientDisplayName,clientVersion:opts.clientVersion??`dev`,platform:opts.platform,mode:opts.mode??GATEWAY_CLIENT_MODES.CLI,role:`operator`,scopes:[`operator.admin`,`operator.approvals`,`operator.pairing`],deviceIdentity:loadOrCreateDeviceIdentity(),minProtocol:opts.minProtocol??PROTOCOL_VERSION,maxProtocol:opts.maxProtocol??PROTOCOL_VERSION,onHelloOk:async()=>{try{let result=await client.request(opts.method,opts.params,{expectFinal:opts.expectFinal});ignoreClose=!0,stop(void 0,result),client.stop()}catch(err){ignoreClose=!0,client.stop(),stop(err)}},onClose:(code,reason)=>{settled||ignoreClose||(ignoreClose=!0,client.stop(),stop(Error(formatCloseError(code,reason))))}}),timer=setTimeout(()=>{ignoreClose=!0,client.stop(),stop(Error(formatTimeoutError()))},safeTimerTimeoutMs);client.start()})}function randomIdempotencyKey(){return randomUUID()}export{resolveExplicitGatewayAuth as a,randomIdempotencyKey as i,callGateway as n,loadGatewayTlsRuntime as o,ensureExplicitGatewayAuth as r,buildGatewayConnectionDetails as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{n as CHAT_CHANNEL_ORDER}from"./registry-Cv7CoWAs.js";import{t as isTruthyEnvValue}from"./env-BoE8QSib.js";import{n as listChannelPlugins}from"./plugins-1Mn6RiNf.js";import{r as listChannelPluginCatalogEntries}from"./catalog-li4bSIE2.js";import{t as ensurePluginRegistryLoaded}from"./plugin-registry-
|
|
1
|
+
import{n as CHAT_CHANNEL_ORDER}from"./registry-Cv7CoWAs.js";import{t as isTruthyEnvValue}from"./env-BoE8QSib.js";import{n as listChannelPlugins}from"./plugins-1Mn6RiNf.js";import{r as listChannelPluginCatalogEntries}from"./catalog-li4bSIE2.js";import{t as ensurePluginRegistryLoaded}from"./plugin-registry-CxnuHO_n.js";function dedupe(values){let seen=new Set,resolved=[];for(let value of values)!value||seen.has(value)||(seen.add(value),resolved.push(value));return resolved}function resolveCliChannelOptions(){let catalog=listChannelPluginCatalogEntries().map(entry=>entry.id),base=dedupe([...CHAT_CHANNEL_ORDER,...catalog]);if(isTruthyEnvValue(process.env.BUILDERFORCE_AGENTS_EAGER_CHANNEL_OPTIONS)){ensurePluginRegistryLoaded();let pluginIds=listChannelPlugins().map(plugin=>plugin.id);return dedupe([...base,...pluginIds])}return base}function formatCliChannelOptions(extra=[]){return[...extra,...resolveCliChannelOptions()].join(`|`)}export{resolveCliChannelOptions as n,formatCliChannelOptions as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{n as CHAT_CHANNEL_ORDER}from"./registry-TdK-aV05.js";import{t as isTruthyEnvValue}from"./env-BIdU5BAp.js";import{n as listChannelPlugins}from"./plugins-D5zP6ENo.js";import{r as listChannelPluginCatalogEntries}from"./catalog-rgiY__UQ.js";import{t as ensurePluginRegistryLoaded}from"./plugin-registry-
|
|
1
|
+
import{n as CHAT_CHANNEL_ORDER}from"./registry-TdK-aV05.js";import{t as isTruthyEnvValue}from"./env-BIdU5BAp.js";import{n as listChannelPlugins}from"./plugins-D5zP6ENo.js";import{r as listChannelPluginCatalogEntries}from"./catalog-rgiY__UQ.js";import{t as ensurePluginRegistryLoaded}from"./plugin-registry-BoPaef5I.js";function dedupe(values){let seen=new Set,resolved=[];for(let value of values)!value||seen.has(value)||(seen.add(value),resolved.push(value));return resolved}function resolveCliChannelOptions(){let catalog=listChannelPluginCatalogEntries().map(entry=>entry.id),base=dedupe([...CHAT_CHANNEL_ORDER,...catalog]);if(isTruthyEnvValue(process.env.BUILDERFORCE_AGENTS_EAGER_CHANNEL_OPTIONS)){ensurePluginRegistryLoaded();let pluginIds=listChannelPlugins().map(plugin=>plugin.id);return dedupe([...base,...pluginIds])}return base}function formatCliChannelOptions(extra=[]){return[...extra,...resolveCliChannelOptions()].join(`|`)}export{resolveCliChannelOptions as n,formatCliChannelOptions as t};
|