@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 +1 @@
|
|
|
1
|
-
import{N as logWarn,O as runExec}from"./agent-scope-DgKN27hJ.js";import path from"node:path";import os from"node:os";import fs from"node:fs/promises";import{fileTypeFromBuffer}from"file-type";import{lookup}from"node:dns";import{lookup as lookup$1}from"node:dns/promises";import{Agent}from"undici";const MAX_IMAGE_BYTES=6*1024*1024,MAX_DOCUMENT_BYTES=100*1024*1024;function mediaKindFromMime(mime){return mime?mime.startsWith(`image/`)?`image`:mime.startsWith(`audio/`)?`audio`:mime.startsWith(`video/`)?`video`:mime===`application/pdf`||mime.startsWith(`text/`)||mime.startsWith(`application/`)?`document`:`unknown`:`unknown`}function maxBytesForKind(kind){switch(kind){case`image`:return MAX_IMAGE_BYTES;case`audio`:return 16777216;case`video`:return 16777216;case`document`:return MAX_DOCUMENT_BYTES;default:return MAX_DOCUMENT_BYTES}}const EXT_BY_MIME={"image/heic":`.heic`,"image/heif":`.heif`,"image/jpeg":`.jpg`,"image/png":`.png`,"image/webp":`.webp`,"image/gif":`.gif`,"audio/ogg":`.ogg`,"audio/mpeg":`.mp3`,"audio/x-m4a":`.m4a`,"audio/mp4":`.m4a`,"video/mp4":`.mp4`,"video/quicktime":`.mov`,"application/pdf":`.pdf`,"application/json":`.json`,"application/zip":`.zip`,"application/gzip":`.gz`,"application/x-tar":`.tar`,"application/x-7z-compressed":`.7z`,"application/vnd.rar":`.rar`,"application/msword":`.doc`,"application/vnd.ms-excel":`.xls`,"application/vnd.ms-powerpoint":`.ppt`,"application/vnd.openxmlformats-officedocument.wordprocessingml.document":`.docx`,"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":`.xlsx`,"application/vnd.openxmlformats-officedocument.presentationml.presentation":`.pptx`,"text/csv":`.csv`,"text/plain":`.txt`,"text/markdown":`.md`},MIME_BY_EXT={...Object.fromEntries(Object.entries(EXT_BY_MIME).map(([mime,ext])=>[ext,mime])),".jpeg":`image/jpeg`},AUDIO_FILE_EXTENSIONS=new Set([`.aac`,`.caf`,`.flac`,`.m4a`,`.mp3`,`.oga`,`.ogg`,`.opus`,`.wav`]);function normalizeMimeType(mime){if(mime)return mime.split(`;`)[0]?.trim().toLowerCase()||void 0}async function sniffMime(buffer){if(buffer)try{return(await fileTypeFromBuffer(buffer))?.mime??void 0}catch{return}}function getFileExtension(filePath){if(filePath){try{if(/^https?:\/\//i.test(filePath)){let url=new URL(filePath);return path.extname(url.pathname).toLowerCase()||void 0}}catch{}return path.extname(filePath).toLowerCase()||void 0}}function isAudioFileName(fileName){let ext=getFileExtension(fileName);return ext?AUDIO_FILE_EXTENSIONS.has(ext):!1}function detectMime(opts){return detectMimeImpl(opts)}function isGenericMime(mime){if(!mime)return!0;let m=mime.toLowerCase();return m===`application/octet-stream`||m===`application/zip`}async function detectMimeImpl(opts){let ext=getFileExtension(opts.filePath),extMime=ext?MIME_BY_EXT[ext]:void 0,headerMime=normalizeMimeType(opts.headerMime),sniffed=await sniffMime(opts.buffer);if(sniffed&&(!isGenericMime(sniffed)||!extMime))return sniffed;if(extMime)return extMime;if(headerMime&&!isGenericMime(headerMime))return headerMime;if(sniffed)return sniffed;if(headerMime)return headerMime}function extensionForMime(mime){let normalized=normalizeMimeType(mime);if(normalized)return EXT_BY_MIME[normalized]}function isGifMedia(opts){return opts.contentType?.toLowerCase()===`image/gif`?!0:getFileExtension(opts.fileName)===`.gif`}function imageMimeFromFormat(format){if(format)switch(format.toLowerCase()){case`jpg`:case`jpeg`:return`image/jpeg`;case`heic`:return`image/heic`;case`heif`:return`image/heif`;case`png`:return`image/png`;case`webp`:return`image/webp`;case`gif`:return`image/gif`;default:return}}function kindFromMime(mime){return mediaKindFromMime(mime)}const IMAGE_REDUCE_QUALITY_STEPS=[85,75,65,55,45,35];function buildImageResizeSideGrid(maxSide,sideStart){return[sideStart,1800,1600,1400,1200,1e3,800].map(value=>Math.min(maxSide,value)).filter((value,idx,arr)=>value>0&&arr.indexOf(value)===idx).toSorted((a,b)=>b-a)}function isBun(){return typeof process.versions.bun==`string`}function prefersSips(){return process.env.BUILDERFORCE_AGENTS_IMAGE_BACKEND===`sips`||process.env.BUILDERFORCE_AGENTS_IMAGE_BACKEND!==`sharp`&&isBun()&&process.platform===`darwin`}async function loadSharp(){let mod=await import(`sharp`),sharp=mod.default??mod;return buffer=>sharp(buffer,{failOn:`none`})}function readJpegExifOrientation(buffer){if(buffer.length<2||buffer[0]!==255||buffer[1]!==216)return null;let offset=2;for(;offset<buffer.length-4;){if(buffer[offset]!==255){offset++;continue}let marker=buffer[offset+1];if(marker===255){offset++;continue}if(marker===225){let exifStart=offset+4;if(buffer.length>exifStart+6&&buffer.toString(`ascii`,exifStart,exifStart+4)===`Exif`&&buffer[exifStart+4]===0&&buffer[exifStart+5]===0){let tiffStart=exifStart+6;if(buffer.length<tiffStart+8)return null;let isLittleEndian=buffer.toString(`ascii`,tiffStart,tiffStart+2)===`II`,readU16=pos=>isLittleEndian?buffer.readUInt16LE(pos):buffer.readUInt16BE(pos),ifd0Start=tiffStart+(pos=>isLittleEndian?buffer.readUInt32LE(pos):buffer.readUInt32BE(pos))(tiffStart+4);if(buffer.length<ifd0Start+2)return null;let numEntries=readU16(ifd0Start);for(let i=0;i<numEntries;i++){let entryOffset=ifd0Start+2+i*12;if(buffer.length<entryOffset+12)break;if(readU16(entryOffset)===274){let value=readU16(entryOffset+8);return value>=1&&value<=8?value:null}}}return null}if(marker>=224&&marker<=239){let segmentLength=buffer.readUInt16BE(offset+2);offset+=2+segmentLength;continue}if(marker===192||marker===218)break;offset++}return null}async function withTempDir(fn){let dir=await fs.mkdtemp(path.join(os.tmpdir(),`builderforce-img-`));try{return await fn(dir)}finally{await fs.rm(dir,{recursive:!0,force:!0}).catch(()=>{})}}async function sipsMetadataFromBuffer(buffer){return await withTempDir(async dir=>{let input=path.join(dir,`in.img`);await fs.writeFile(input,buffer);let{stdout}=await runExec(`/usr/bin/sips`,[`-g`,`pixelWidth`,`-g`,`pixelHeight`,input],{timeoutMs:1e4,maxBuffer:512*1024}),w=stdout.match(/pixelWidth:\s*([0-9]+)/),h=stdout.match(/pixelHeight:\s*([0-9]+)/);if(!w?.[1]||!h?.[1])return null;let width=Number.parseInt(w[1],10),height=Number.parseInt(h[1],10);return!Number.isFinite(width)||!Number.isFinite(height)||width<=0||height<=0?null:{width,height}})}async function sipsResizeToJpeg(params){return await withTempDir(async dir=>{let input=path.join(dir,`in.img`),output=path.join(dir,`out.jpg`);return await fs.writeFile(input,params.buffer),await runExec(`/usr/bin/sips`,[`-Z`,String(Math.max(1,Math.round(params.maxSide))),`-s`,`format`,`jpeg`,`-s`,`formatOptions`,String(Math.max(1,Math.min(100,Math.round(params.quality)))),input,`--out`,output],{timeoutMs:2e4,maxBuffer:1024*1024}),await fs.readFile(output)})}async function sipsConvertToJpeg(buffer){return await withTempDir(async dir=>{let input=path.join(dir,`in.heic`),output=path.join(dir,`out.jpg`);return await fs.writeFile(input,buffer),await runExec(`/usr/bin/sips`,[`-s`,`format`,`jpeg`,input,`--out`,output],{timeoutMs:2e4,maxBuffer:1024*1024}),await fs.readFile(output)})}async function getImageMetadata(buffer){if(prefersSips())return await sipsMetadataFromBuffer(buffer).catch(()=>null);try{let meta=await(await loadSharp())(buffer).metadata(),width=Number(meta.width??0),height=Number(meta.height??0);return!Number.isFinite(width)||!Number.isFinite(height)||width<=0||height<=0?null:{width,height}}catch{return null}}async function sipsApplyOrientation(buffer,orientation){let ops=[];switch(orientation){case 2:ops.push(`-f`,`horizontal`);break;case 3:ops.push(`-r`,`180`);break;case 4:ops.push(`-f`,`vertical`);break;case 5:ops.push(`-r`,`270`,`-f`,`horizontal`);break;case 6:ops.push(`-r`,`90`);break;case 7:ops.push(`-r`,`90`,`-f`,`horizontal`);break;case 8:ops.push(`-r`,`270`);break;default:return buffer}return await withTempDir(async dir=>{let input=path.join(dir,`in.jpg`),output=path.join(dir,`out.jpg`);return await fs.writeFile(input,buffer),await runExec(`/usr/bin/sips`,[...ops,input,`--out`,output],{timeoutMs:2e4,maxBuffer:1024*1024}),await fs.readFile(output)})}async function resizeToJpeg(params){if(prefersSips()){let normalized=await normalizeExifOrientationSips(params.buffer);if(params.withoutEnlargement!==!1){let meta=await getImageMetadata(normalized);if(meta){let maxDim=Math.max(meta.width,meta.height);if(maxDim>0&&maxDim<=params.maxSide)return await sipsResizeToJpeg({buffer:normalized,maxSide:maxDim,quality:params.quality})}}return await sipsResizeToJpeg({buffer:normalized,maxSide:params.maxSide,quality:params.quality})}return await(await loadSharp())(params.buffer).rotate().resize({width:params.maxSide,height:params.maxSide,fit:`inside`,withoutEnlargement:params.withoutEnlargement!==!1}).jpeg({quality:params.quality,mozjpeg:!0}).toBuffer()}async function convertHeicToJpeg(buffer){return prefersSips()?await sipsConvertToJpeg(buffer):await(await loadSharp())(buffer).jpeg({quality:90,mozjpeg:!0}).toBuffer()}async function hasAlphaChannel(buffer){try{let meta=await(await loadSharp())(buffer).metadata();return meta.hasAlpha||meta.channels===4}catch{return!1}}async function resizeToPng(params){let sharp=await loadSharp(),compressionLevel=params.compressionLevel??6;return await sharp(params.buffer).rotate().resize({width:params.maxSide,height:params.maxSide,fit:`inside`,withoutEnlargement:params.withoutEnlargement!==!1}).png({compressionLevel}).toBuffer()}async function optimizeImageToPng(buffer,maxBytes){let sides=[2048,1536,1280,1024,800],compressionLevels=[6,7,8,9],smallest=null;for(let side of sides)for(let compressionLevel of compressionLevels)try{let out=await resizeToPng({buffer,maxSide:side,compressionLevel,withoutEnlargement:!0}),size=out.length;if((!smallest||size<smallest.size)&&(smallest={buffer:out,size,resizeSide:side,compressionLevel}),size<=maxBytes)return{buffer:out,optimizedSize:size,resizeSide:side,compressionLevel}}catch{}if(smallest)return{buffer:smallest.buffer,optimizedSize:smallest.size,resizeSide:smallest.resizeSide,compressionLevel:smallest.compressionLevel};throw Error(`Failed to optimize PNG image`)}async function normalizeExifOrientationSips(buffer){try{let orientation=readJpegExifOrientation(buffer);return!orientation||orientation===1?buffer:await sipsApplyOrientation(buffer,orientation)}catch{return buffer}}function relayAbort(){this.abort()}function bindAbortRelay(controller){return relayAbort.bind(controller)}async function fetchWithTimeout(url,init,timeoutMs,fetchFn=fetch){let controller=new AbortController,timer=setTimeout(controller.abort.bind(controller),Math.max(1,timeoutMs));try{return await fetchFn(url,{...init,signal:controller.signal})}finally{clearTimeout(timer)}}function normalizeHostname(hostname){let normalized=hostname.trim().toLowerCase().replace(/\.$/,``);return normalized.startsWith(`[`)&&normalized.endsWith(`]`)?normalized.slice(1,-1):normalized}var SsrFBlockedError=class extends Error{constructor(message){super(message),this.name=`SsrFBlockedError`}};const BLOCKED_HOSTNAMES=new Set([`localhost`,`metadata.google.internal`]);function normalizeHostnameSet(values){return!values||values.length===0?new Set:new Set(values.map(value=>normalizeHostname(value)).filter(Boolean))}function normalizeHostnameAllowlist(values){return!values||values.length===0?[]:Array.from(new Set(values.map(value=>normalizeHostname(value)).filter(value=>value!==`*`&&value!==`*.`&&value.length>0)))}function isHostnameAllowedByPattern(hostname,pattern){if(pattern.startsWith(`*.`)){let suffix=pattern.slice(2);return!suffix||hostname===suffix?!1:hostname.endsWith(`.${suffix}`)}return hostname===pattern}function matchesHostnameAllowlist(hostname,allowlist){return allowlist.length===0?!0:allowlist.some(pattern=>isHostnameAllowedByPattern(hostname,pattern))}function parseIpv4(address){let parts=address.split(`.`);if(parts.length!==4)return null;let numbers=parts.map(part=>Number.parseInt(part,10));return numbers.some(value=>Number.isNaN(value)||value<0||value>255)?null:numbers}function stripIpv6ZoneId(address){let index=address.indexOf(`%`);return index>=0?address.slice(0,index):address}function parseIpv6Hextets(address){let input=stripIpv6ZoneId(address.trim().toLowerCase());if(!input)return null;if(input.includes(`.`)){let lastColon=input.lastIndexOf(`:`);if(lastColon<0)return null;let ipv4=parseIpv4(input.slice(lastColon+1));if(!ipv4)return null;let high=(ipv4[0]<<8)+ipv4[1],low=(ipv4[2]<<8)+ipv4[3];input=`${input.slice(0,lastColon)}:${high.toString(16)}:${low.toString(16)}`}let doubleColonParts=input.split(`::`);if(doubleColonParts.length>2)return null;let headParts=doubleColonParts[0]?.length>0?doubleColonParts[0].split(`:`).filter(Boolean):[],tailParts=doubleColonParts.length===2&&doubleColonParts[1]?.length>0?doubleColonParts[1].split(`:`).filter(Boolean):[],missingParts=8-headParts.length-tailParts.length;if(missingParts<0)return null;let fullParts=doubleColonParts.length===1?input.split(`:`):[...headParts,...Array.from({length:missingParts},()=>`0`),...tailParts];if(fullParts.length!==8)return null;let hextets=[];for(let part of fullParts){if(!part)return null;let value=Number.parseInt(part,16);if(Number.isNaN(value)||value<0||value>65535)return null;hextets.push(value)}return hextets}function decodeIpv4FromHextets(high,low){return[high>>>8&255,high&255,low>>>8&255,low&255]}const EMBEDDED_IPV4_RULES=[{matches:hextets=>hextets[0]===0&&hextets[1]===0&&hextets[2]===0&&hextets[3]===0&&hextets[4]===0&&(hextets[5]===65535||hextets[5]===0),extract:hextets=>[hextets[6],hextets[7]]},{matches:hextets=>hextets[0]===100&&hextets[1]===65435&&hextets[2]===0&&hextets[3]===0&&hextets[4]===0&&hextets[5]===0,extract:hextets=>[hextets[6],hextets[7]]},{matches:hextets=>hextets[0]===100&&hextets[1]===65435&&hextets[2]===1&&hextets[3]===0&&hextets[4]===0&&hextets[5]===0,extract:hextets=>[hextets[6],hextets[7]]},{matches:hextets=>hextets[0]===8194,extract:hextets=>[hextets[1],hextets[2]]},{matches:hextets=>hextets[0]===8193&&hextets[1]===0,extract:hextets=>[hextets[6]^65535,hextets[7]^65535]}];function extractIpv4FromEmbeddedIpv6(hextets){for(let rule of EMBEDDED_IPV4_RULES){if(!rule.matches(hextets))continue;let[high,low]=rule.extract(hextets);return decodeIpv4FromHextets(high,low)}return null}function isPrivateIpv4(parts){let[octet1,octet2]=parts;return octet1===0||octet1===10||octet1===127||octet1===169&&octet2===254||octet1===172&&octet2>=16&&octet2<=31||octet1===192&&octet2===168||octet1===100&&octet2>=64&&octet2<=127}function isPrivateIpAddress(address){let normalized=address.trim().toLowerCase();if(normalized.startsWith(`[`)&&normalized.endsWith(`]`)&&(normalized=normalized.slice(1,-1)),!normalized)return!1;if(normalized.includes(`:`)){let hextets=parseIpv6Hextets(normalized);if(!hextets)return!0;let isUnspecified=hextets[0]===0&&hextets[1]===0&&hextets[2]===0&&hextets[3]===0&&hextets[4]===0&&hextets[5]===0&&hextets[6]===0&&hextets[7]===0,isLoopback=hextets[0]===0&&hextets[1]===0&&hextets[2]===0&&hextets[3]===0&&hextets[4]===0&&hextets[5]===0&&hextets[6]===0&&hextets[7]===1;if(isUnspecified||isLoopback)return!0;let embeddedIpv4=extractIpv4FromEmbeddedIpv6(hextets);if(embeddedIpv4)return isPrivateIpv4(embeddedIpv4);let first=hextets[0];return(first&65472)==65152||(first&65472)==65216||(first&65024)==64512}let ipv4=parseIpv4(normalized);return ipv4?isPrivateIpv4(ipv4):!1}function isBlockedHostname(hostname){let normalized=normalizeHostname(hostname);return normalized?BLOCKED_HOSTNAMES.has(normalized)?!0:normalized.endsWith(`.localhost`)||normalized.endsWith(`.local`)||normalized.endsWith(`.internal`):!1}function createPinnedLookup(params){let normalizedHost=normalizeHostname(params.hostname),fallback=params.fallback??lookup,fallbackLookup=fallback,fallbackWithOptions=fallback,records=params.addresses.map(address=>({address,family:address.includes(`:`)?6:4})),index=0;return((host,options,callback)=>{let cb=typeof options==`function`?options:callback;if(!cb)return;let normalized=normalizeHostname(host);if(!normalized||normalized!==normalizedHost)return typeof options==`function`||options===void 0?fallbackLookup(host,cb):fallbackWithOptions(host,options,cb);let opts=typeof options==`object`&&options?options:{},requestedFamily=typeof options==`number`?options:typeof opts.family==`number`?opts.family:0,candidates=requestedFamily===4||requestedFamily===6?records.filter(entry=>entry.family===requestedFamily):records,usable=candidates.length>0?candidates:records;if(opts.all){cb(null,usable);return}let chosen=usable[index%usable.length];index+=1,cb(null,chosen.address,chosen.family)})}async function resolvePinnedHostnameWithPolicy(hostname,params={}){let normalized=normalizeHostname(hostname);if(!normalized)throw Error(`Invalid hostname`);let allowPrivateNetwork=!!params.policy?.allowPrivateNetwork,allowedHostnames=normalizeHostnameSet(params.policy?.allowedHostnames),hostnameAllowlist=normalizeHostnameAllowlist(params.policy?.hostnameAllowlist),isExplicitAllowed=allowedHostnames.has(normalized);if(!matchesHostnameAllowlist(normalized,hostnameAllowlist))throw new SsrFBlockedError(`Blocked hostname (not in allowlist): ${hostname}`);if(!allowPrivateNetwork&&!isExplicitAllowed){if(isBlockedHostname(normalized))throw new SsrFBlockedError(`Blocked hostname: ${hostname}`);if(isPrivateIpAddress(normalized))throw new SsrFBlockedError(`Blocked: private/internal IP address`)}let results=await(params.lookupFn??lookup$1)(normalized,{all:!0});if(results.length===0)throw Error(`Unable to resolve hostname: ${hostname}`);if(!allowPrivateNetwork&&!isExplicitAllowed){for(let entry of results)if(isPrivateIpAddress(entry.address))throw new SsrFBlockedError(`Blocked: resolves to private/internal IP address`)}let addresses=Array.from(new Set(results.map(entry=>entry.address)));if(addresses.length===0)throw Error(`Unable to resolve hostname: ${hostname}`);return{hostname:normalized,addresses,lookup:createPinnedLookup({hostname:normalized,addresses})}}function createPinnedDispatcher(pinned){return new Agent({connect:{lookup:pinned.lookup}})}async function closeDispatcher(dispatcher){if(!dispatcher)return;let candidate=dispatcher;try{if(typeof candidate.close==`function`){await candidate.close();return}typeof candidate.destroy==`function`&&candidate.destroy()}catch{}}function isRedirectStatus(status){return status===301||status===302||status===303||status===307||status===308}function buildAbortSignal(params){let{timeoutMs,signal}=params;if(!timeoutMs&&!signal)return{signal:void 0,cleanup:()=>{}};if(!timeoutMs)return{signal,cleanup:()=>{}};let controller=new AbortController,timeoutId=setTimeout(controller.abort.bind(controller),timeoutMs),onAbort=bindAbortRelay(controller);return signal&&(signal.aborted?controller.abort():signal.addEventListener(`abort`,onAbort,{once:!0})),{signal:controller.signal,cleanup:()=>{clearTimeout(timeoutId),signal&&signal.removeEventListener(`abort`,onAbort)}}}async function fetchWithSsrFGuard(params){let fetcher=params.fetchImpl??globalThis.fetch;if(!fetcher)throw Error(`fetch is not available`);let maxRedirects=typeof params.maxRedirects==`number`&&Number.isFinite(params.maxRedirects)?Math.max(0,Math.floor(params.maxRedirects)):3,{signal,cleanup}=buildAbortSignal({timeoutMs:params.timeoutMs,signal:params.signal}),released=!1,release=async dispatcher=>{released||(released=!0,cleanup(),await closeDispatcher(dispatcher??void 0))},visited=new Set,currentUrl=params.url,redirectCount=0;for(;;){let parsedUrl;try{parsedUrl=new URL(currentUrl)}catch{throw await release(),Error(`Invalid URL: must be http or https`)}if(![`http:`,`https:`].includes(parsedUrl.protocol))throw await release(),Error(`Invalid URL: must be http or https`);let dispatcher=null;try{let pinned=await resolvePinnedHostnameWithPolicy(parsedUrl.hostname,{lookupFn:params.lookupFn,policy:params.policy});params.pinDns!==!1&&(dispatcher=createPinnedDispatcher(pinned));let init={...params.init?{...params.init}:{},redirect:`manual`,...dispatcher?{dispatcher}:{},...signal?{signal}:{}},response=await fetcher(parsedUrl.toString(),init);if(isRedirectStatus(response.status)){let location=response.headers.get(`location`);if(!location)throw await release(dispatcher),Error(`Redirect missing location header (${response.status})`);if(redirectCount+=1,redirectCount>maxRedirects)throw await release(dispatcher),Error(`Too many redirects (limit: ${maxRedirects})`);let nextUrl=new URL(location,parsedUrl).toString();if(visited.has(nextUrl))throw await release(dispatcher),Error(`Redirect loop detected`);visited.add(nextUrl),response.body?.cancel(),await closeDispatcher(dispatcher),currentUrl=nextUrl;continue}return{response,finalUrl:currentUrl,release:async()=>release(dispatcher)}}catch(err){throw err instanceof SsrFBlockedError&&logWarn(`security: blocked URL fetch (${params.auditContext??`url-fetch`}) target=${parsedUrl.origin}${parsedUrl.pathname} reason=${err.message}`),await release(dispatcher),err}}}async function readResponseWithLimit(res,maxBytes,opts){let onOverflow=opts?.onOverflow??(params=>Error(`Content too large: ${params.size} bytes (limit: ${params.maxBytes} bytes)`)),body=res.body;if(!body||typeof body.getReader!=`function`){let fallback=Buffer.from(await res.arrayBuffer());if(fallback.length>maxBytes)throw onOverflow({size:fallback.length,maxBytes,res});return fallback}let reader=body.getReader(),chunks=[],total=0;try{for(;;){let{done,value}=await reader.read();if(done)break;if(value?.length){if(total+=value.length,total>maxBytes){try{await reader.cancel()}catch{}throw onOverflow({size:total,maxBytes,res})}chunks.push(value)}}}finally{try{reader.releaseLock()}catch{}}return Buffer.concat(chunks.map(chunk=>Buffer.from(chunk)),total)}var MediaFetchError=class extends Error{constructor(code,message){super(message),this.code=code,this.name=`MediaFetchError`}};function stripQuotes(value){return value.replace(/^["']|["']$/g,``)}function parseContentDispositionFileName(header){if(!header)return;let starMatch=/filename\*\s*=\s*([^;]+)/i.exec(header);if(starMatch?.[1]){let cleaned=stripQuotes(starMatch[1].trim()),encoded=cleaned.split(`''`).slice(1).join(`''`)||cleaned;try{return path.basename(decodeURIComponent(encoded))}catch{return path.basename(encoded)}}let match=/filename\s*=\s*([^;]+)/i.exec(header);if(match?.[1])return path.basename(stripQuotes(match[1].trim()))}async function readErrorBodySnippet(res,maxChars=200){try{let text=await res.text();if(!text)return;let collapsed=text.replace(/\s+/g,` `).trim();return collapsed?collapsed.length<=maxChars?collapsed:`${collapsed.slice(0,maxChars)}…`:void 0}catch{return}}async function fetchRemoteMedia(options){let{url,fetchImpl,filePathHint,maxBytes,maxRedirects,ssrfPolicy,lookupFn}=options,res,finalUrl=url,release=null;try{let result=await fetchWithSsrFGuard({url,fetchImpl,maxRedirects,policy:ssrfPolicy,lookupFn});res=result.response,finalUrl=result.finalUrl,release=result.release}catch(err){throw new MediaFetchError(`fetch_failed`,`Failed to fetch media from ${url}: ${String(err)}`)}try{if(!res.ok){let statusText=res.statusText?` ${res.statusText}`:``,redirected=finalUrl===url?``:` (redirected to ${finalUrl})`,detail=`HTTP ${res.status}${statusText}`;if(!res.body)detail=`HTTP ${res.status}${statusText}; empty response body`;else{let snippet=await readErrorBodySnippet(res);snippet&&(detail+=`; body: ${snippet}`)}throw new MediaFetchError(`http_error`,`Failed to fetch media from ${url}${redirected}: ${detail}`)}let contentLength=res.headers.get(`content-length`);if(maxBytes&&contentLength){let length=Number(contentLength);if(Number.isFinite(length)&&length>maxBytes)throw new MediaFetchError(`max_bytes`,`Failed to fetch media from ${url}: content length ${length} exceeds maxBytes ${maxBytes}`)}let buffer=maxBytes?await readResponseWithLimit(res,maxBytes,{onOverflow:({maxBytes,res})=>new MediaFetchError(`max_bytes`,`Failed to fetch media from ${res.url||url}: payload exceeds maxBytes ${maxBytes}`)}):Buffer.from(await res.arrayBuffer()),fileNameFromUrl;try{let parsed=new URL(finalUrl);fileNameFromUrl=path.basename(parsed.pathname)||void 0}catch{}let headerFileName=parseContentDispositionFileName(res.headers.get(`content-disposition`)),fileName=headerFileName||fileNameFromUrl||(filePathHint?path.basename(filePathHint):void 0),filePathForMime=headerFileName&&path.extname(headerFileName)?headerFileName:filePathHint??finalUrl,contentType=await detectMime({buffer,headerMime:res.headers.get(`content-type`),filePath:filePathForMime});if(fileName&&!path.extname(fileName)&&contentType){let ext=extensionForMime(contentType);ext&&(fileName=`${fileName}${ext}`)}return{buffer,contentType:contentType??void 0,fileName}}finally{release&&await release()}}export{isGifMedia as C,maxBytesForKind as D,MAX_IMAGE_BYTES as E,mediaKindFromMime as O,isAudioFileName as S,normalizeMimeType as T,resizeToJpeg as _,SsrFBlockedError as a,getFileExtension as b,normalizeHostname as c,IMAGE_REDUCE_QUALITY_STEPS as d,buildImageResizeSideGrid as f,optimizeImageToPng as g,hasAlphaChannel as h,fetchWithSsrFGuard as i,bindAbortRelay as l,getImageMetadata as m,fetchRemoteMedia as n,isBlockedHostname as o,convertHeicToJpeg as p,readResponseWithLimit as r,isPrivateIpAddress as s,MediaFetchError as t,fetchWithTimeout as u,detectMime as v,kindFromMime as w,imageMimeFromFormat as x,extensionForMime as y};
|
|
1
|
+
import{N as logWarn,O as runExec}from"./agent-scope-BQByW0cD.js";import path from"node:path";import os from"node:os";import fs from"node:fs/promises";import{fileTypeFromBuffer}from"file-type";import{lookup}from"node:dns";import{lookup as lookup$1}from"node:dns/promises";import{Agent}from"undici";const MAX_IMAGE_BYTES=6*1024*1024,MAX_DOCUMENT_BYTES=100*1024*1024;function mediaKindFromMime(mime){return mime?mime.startsWith(`image/`)?`image`:mime.startsWith(`audio/`)?`audio`:mime.startsWith(`video/`)?`video`:mime===`application/pdf`||mime.startsWith(`text/`)||mime.startsWith(`application/`)?`document`:`unknown`:`unknown`}function maxBytesForKind(kind){switch(kind){case`image`:return MAX_IMAGE_BYTES;case`audio`:return 16777216;case`video`:return 16777216;case`document`:return MAX_DOCUMENT_BYTES;default:return MAX_DOCUMENT_BYTES}}const EXT_BY_MIME={"image/heic":`.heic`,"image/heif":`.heif`,"image/jpeg":`.jpg`,"image/png":`.png`,"image/webp":`.webp`,"image/gif":`.gif`,"audio/ogg":`.ogg`,"audio/mpeg":`.mp3`,"audio/x-m4a":`.m4a`,"audio/mp4":`.m4a`,"video/mp4":`.mp4`,"video/quicktime":`.mov`,"application/pdf":`.pdf`,"application/json":`.json`,"application/zip":`.zip`,"application/gzip":`.gz`,"application/x-tar":`.tar`,"application/x-7z-compressed":`.7z`,"application/vnd.rar":`.rar`,"application/msword":`.doc`,"application/vnd.ms-excel":`.xls`,"application/vnd.ms-powerpoint":`.ppt`,"application/vnd.openxmlformats-officedocument.wordprocessingml.document":`.docx`,"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":`.xlsx`,"application/vnd.openxmlformats-officedocument.presentationml.presentation":`.pptx`,"text/csv":`.csv`,"text/plain":`.txt`,"text/markdown":`.md`},MIME_BY_EXT={...Object.fromEntries(Object.entries(EXT_BY_MIME).map(([mime,ext])=>[ext,mime])),".jpeg":`image/jpeg`},AUDIO_FILE_EXTENSIONS=new Set([`.aac`,`.caf`,`.flac`,`.m4a`,`.mp3`,`.oga`,`.ogg`,`.opus`,`.wav`]);function normalizeMimeType(mime){if(mime)return mime.split(`;`)[0]?.trim().toLowerCase()||void 0}async function sniffMime(buffer){if(buffer)try{return(await fileTypeFromBuffer(buffer))?.mime??void 0}catch{return}}function getFileExtension(filePath){if(filePath){try{if(/^https?:\/\//i.test(filePath)){let url=new URL(filePath);return path.extname(url.pathname).toLowerCase()||void 0}}catch{}return path.extname(filePath).toLowerCase()||void 0}}function isAudioFileName(fileName){let ext=getFileExtension(fileName);return ext?AUDIO_FILE_EXTENSIONS.has(ext):!1}function detectMime(opts){return detectMimeImpl(opts)}function isGenericMime(mime){if(!mime)return!0;let m=mime.toLowerCase();return m===`application/octet-stream`||m===`application/zip`}async function detectMimeImpl(opts){let ext=getFileExtension(opts.filePath),extMime=ext?MIME_BY_EXT[ext]:void 0,headerMime=normalizeMimeType(opts.headerMime),sniffed=await sniffMime(opts.buffer);if(sniffed&&(!isGenericMime(sniffed)||!extMime))return sniffed;if(extMime)return extMime;if(headerMime&&!isGenericMime(headerMime))return headerMime;if(sniffed)return sniffed;if(headerMime)return headerMime}function extensionForMime(mime){let normalized=normalizeMimeType(mime);if(normalized)return EXT_BY_MIME[normalized]}function isGifMedia(opts){return opts.contentType?.toLowerCase()===`image/gif`?!0:getFileExtension(opts.fileName)===`.gif`}function imageMimeFromFormat(format){if(format)switch(format.toLowerCase()){case`jpg`:case`jpeg`:return`image/jpeg`;case`heic`:return`image/heic`;case`heif`:return`image/heif`;case`png`:return`image/png`;case`webp`:return`image/webp`;case`gif`:return`image/gif`;default:return}}function kindFromMime(mime){return mediaKindFromMime(mime)}const IMAGE_REDUCE_QUALITY_STEPS=[85,75,65,55,45,35];function buildImageResizeSideGrid(maxSide,sideStart){return[sideStart,1800,1600,1400,1200,1e3,800].map(value=>Math.min(maxSide,value)).filter((value,idx,arr)=>value>0&&arr.indexOf(value)===idx).toSorted((a,b)=>b-a)}function isBun(){return typeof process.versions.bun==`string`}function prefersSips(){return process.env.BUILDERFORCE_AGENTS_IMAGE_BACKEND===`sips`||process.env.BUILDERFORCE_AGENTS_IMAGE_BACKEND!==`sharp`&&isBun()&&process.platform===`darwin`}async function loadSharp(){let mod=await import(`sharp`),sharp=mod.default??mod;return buffer=>sharp(buffer,{failOn:`none`})}function readJpegExifOrientation(buffer){if(buffer.length<2||buffer[0]!==255||buffer[1]!==216)return null;let offset=2;for(;offset<buffer.length-4;){if(buffer[offset]!==255){offset++;continue}let marker=buffer[offset+1];if(marker===255){offset++;continue}if(marker===225){let exifStart=offset+4;if(buffer.length>exifStart+6&&buffer.toString(`ascii`,exifStart,exifStart+4)===`Exif`&&buffer[exifStart+4]===0&&buffer[exifStart+5]===0){let tiffStart=exifStart+6;if(buffer.length<tiffStart+8)return null;let isLittleEndian=buffer.toString(`ascii`,tiffStart,tiffStart+2)===`II`,readU16=pos=>isLittleEndian?buffer.readUInt16LE(pos):buffer.readUInt16BE(pos),ifd0Start=tiffStart+(pos=>isLittleEndian?buffer.readUInt32LE(pos):buffer.readUInt32BE(pos))(tiffStart+4);if(buffer.length<ifd0Start+2)return null;let numEntries=readU16(ifd0Start);for(let i=0;i<numEntries;i++){let entryOffset=ifd0Start+2+i*12;if(buffer.length<entryOffset+12)break;if(readU16(entryOffset)===274){let value=readU16(entryOffset+8);return value>=1&&value<=8?value:null}}}return null}if(marker>=224&&marker<=239){let segmentLength=buffer.readUInt16BE(offset+2);offset+=2+segmentLength;continue}if(marker===192||marker===218)break;offset++}return null}async function withTempDir(fn){let dir=await fs.mkdtemp(path.join(os.tmpdir(),`builderforce-img-`));try{return await fn(dir)}finally{await fs.rm(dir,{recursive:!0,force:!0}).catch(()=>{})}}async function sipsMetadataFromBuffer(buffer){return await withTempDir(async dir=>{let input=path.join(dir,`in.img`);await fs.writeFile(input,buffer);let{stdout}=await runExec(`/usr/bin/sips`,[`-g`,`pixelWidth`,`-g`,`pixelHeight`,input],{timeoutMs:1e4,maxBuffer:512*1024}),w=stdout.match(/pixelWidth:\s*([0-9]+)/),h=stdout.match(/pixelHeight:\s*([0-9]+)/);if(!w?.[1]||!h?.[1])return null;let width=Number.parseInt(w[1],10),height=Number.parseInt(h[1],10);return!Number.isFinite(width)||!Number.isFinite(height)||width<=0||height<=0?null:{width,height}})}async function sipsResizeToJpeg(params){return await withTempDir(async dir=>{let input=path.join(dir,`in.img`),output=path.join(dir,`out.jpg`);return await fs.writeFile(input,params.buffer),await runExec(`/usr/bin/sips`,[`-Z`,String(Math.max(1,Math.round(params.maxSide))),`-s`,`format`,`jpeg`,`-s`,`formatOptions`,String(Math.max(1,Math.min(100,Math.round(params.quality)))),input,`--out`,output],{timeoutMs:2e4,maxBuffer:1024*1024}),await fs.readFile(output)})}async function sipsConvertToJpeg(buffer){return await withTempDir(async dir=>{let input=path.join(dir,`in.heic`),output=path.join(dir,`out.jpg`);return await fs.writeFile(input,buffer),await runExec(`/usr/bin/sips`,[`-s`,`format`,`jpeg`,input,`--out`,output],{timeoutMs:2e4,maxBuffer:1024*1024}),await fs.readFile(output)})}async function getImageMetadata(buffer){if(prefersSips())return await sipsMetadataFromBuffer(buffer).catch(()=>null);try{let meta=await(await loadSharp())(buffer).metadata(),width=Number(meta.width??0),height=Number(meta.height??0);return!Number.isFinite(width)||!Number.isFinite(height)||width<=0||height<=0?null:{width,height}}catch{return null}}async function sipsApplyOrientation(buffer,orientation){let ops=[];switch(orientation){case 2:ops.push(`-f`,`horizontal`);break;case 3:ops.push(`-r`,`180`);break;case 4:ops.push(`-f`,`vertical`);break;case 5:ops.push(`-r`,`270`,`-f`,`horizontal`);break;case 6:ops.push(`-r`,`90`);break;case 7:ops.push(`-r`,`90`,`-f`,`horizontal`);break;case 8:ops.push(`-r`,`270`);break;default:return buffer}return await withTempDir(async dir=>{let input=path.join(dir,`in.jpg`),output=path.join(dir,`out.jpg`);return await fs.writeFile(input,buffer),await runExec(`/usr/bin/sips`,[...ops,input,`--out`,output],{timeoutMs:2e4,maxBuffer:1024*1024}),await fs.readFile(output)})}async function resizeToJpeg(params){if(prefersSips()){let normalized=await normalizeExifOrientationSips(params.buffer);if(params.withoutEnlargement!==!1){let meta=await getImageMetadata(normalized);if(meta){let maxDim=Math.max(meta.width,meta.height);if(maxDim>0&&maxDim<=params.maxSide)return await sipsResizeToJpeg({buffer:normalized,maxSide:maxDim,quality:params.quality})}}return await sipsResizeToJpeg({buffer:normalized,maxSide:params.maxSide,quality:params.quality})}return await(await loadSharp())(params.buffer).rotate().resize({width:params.maxSide,height:params.maxSide,fit:`inside`,withoutEnlargement:params.withoutEnlargement!==!1}).jpeg({quality:params.quality,mozjpeg:!0}).toBuffer()}async function convertHeicToJpeg(buffer){return prefersSips()?await sipsConvertToJpeg(buffer):await(await loadSharp())(buffer).jpeg({quality:90,mozjpeg:!0}).toBuffer()}async function hasAlphaChannel(buffer){try{let meta=await(await loadSharp())(buffer).metadata();return meta.hasAlpha||meta.channels===4}catch{return!1}}async function resizeToPng(params){let sharp=await loadSharp(),compressionLevel=params.compressionLevel??6;return await sharp(params.buffer).rotate().resize({width:params.maxSide,height:params.maxSide,fit:`inside`,withoutEnlargement:params.withoutEnlargement!==!1}).png({compressionLevel}).toBuffer()}async function optimizeImageToPng(buffer,maxBytes){let sides=[2048,1536,1280,1024,800],compressionLevels=[6,7,8,9],smallest=null;for(let side of sides)for(let compressionLevel of compressionLevels)try{let out=await resizeToPng({buffer,maxSide:side,compressionLevel,withoutEnlargement:!0}),size=out.length;if((!smallest||size<smallest.size)&&(smallest={buffer:out,size,resizeSide:side,compressionLevel}),size<=maxBytes)return{buffer:out,optimizedSize:size,resizeSide:side,compressionLevel}}catch{}if(smallest)return{buffer:smallest.buffer,optimizedSize:smallest.size,resizeSide:smallest.resizeSide,compressionLevel:smallest.compressionLevel};throw Error(`Failed to optimize PNG image`)}async function normalizeExifOrientationSips(buffer){try{let orientation=readJpegExifOrientation(buffer);return!orientation||orientation===1?buffer:await sipsApplyOrientation(buffer,orientation)}catch{return buffer}}function relayAbort(){this.abort()}function bindAbortRelay(controller){return relayAbort.bind(controller)}async function fetchWithTimeout(url,init,timeoutMs,fetchFn=fetch){let controller=new AbortController,timer=setTimeout(controller.abort.bind(controller),Math.max(1,timeoutMs));try{return await fetchFn(url,{...init,signal:controller.signal})}finally{clearTimeout(timer)}}function normalizeHostname(hostname){let normalized=hostname.trim().toLowerCase().replace(/\.$/,``);return normalized.startsWith(`[`)&&normalized.endsWith(`]`)?normalized.slice(1,-1):normalized}var SsrFBlockedError=class extends Error{constructor(message){super(message),this.name=`SsrFBlockedError`}};const BLOCKED_HOSTNAMES=new Set([`localhost`,`metadata.google.internal`]);function normalizeHostnameSet(values){return!values||values.length===0?new Set:new Set(values.map(value=>normalizeHostname(value)).filter(Boolean))}function normalizeHostnameAllowlist(values){return!values||values.length===0?[]:Array.from(new Set(values.map(value=>normalizeHostname(value)).filter(value=>value!==`*`&&value!==`*.`&&value.length>0)))}function isHostnameAllowedByPattern(hostname,pattern){if(pattern.startsWith(`*.`)){let suffix=pattern.slice(2);return!suffix||hostname===suffix?!1:hostname.endsWith(`.${suffix}`)}return hostname===pattern}function matchesHostnameAllowlist(hostname,allowlist){return allowlist.length===0?!0:allowlist.some(pattern=>isHostnameAllowedByPattern(hostname,pattern))}function parseIpv4(address){let parts=address.split(`.`);if(parts.length!==4)return null;let numbers=parts.map(part=>Number.parseInt(part,10));return numbers.some(value=>Number.isNaN(value)||value<0||value>255)?null:numbers}function stripIpv6ZoneId(address){let index=address.indexOf(`%`);return index>=0?address.slice(0,index):address}function parseIpv6Hextets(address){let input=stripIpv6ZoneId(address.trim().toLowerCase());if(!input)return null;if(input.includes(`.`)){let lastColon=input.lastIndexOf(`:`);if(lastColon<0)return null;let ipv4=parseIpv4(input.slice(lastColon+1));if(!ipv4)return null;let high=(ipv4[0]<<8)+ipv4[1],low=(ipv4[2]<<8)+ipv4[3];input=`${input.slice(0,lastColon)}:${high.toString(16)}:${low.toString(16)}`}let doubleColonParts=input.split(`::`);if(doubleColonParts.length>2)return null;let headParts=doubleColonParts[0]?.length>0?doubleColonParts[0].split(`:`).filter(Boolean):[],tailParts=doubleColonParts.length===2&&doubleColonParts[1]?.length>0?doubleColonParts[1].split(`:`).filter(Boolean):[],missingParts=8-headParts.length-tailParts.length;if(missingParts<0)return null;let fullParts=doubleColonParts.length===1?input.split(`:`):[...headParts,...Array.from({length:missingParts},()=>`0`),...tailParts];if(fullParts.length!==8)return null;let hextets=[];for(let part of fullParts){if(!part)return null;let value=Number.parseInt(part,16);if(Number.isNaN(value)||value<0||value>65535)return null;hextets.push(value)}return hextets}function decodeIpv4FromHextets(high,low){return[high>>>8&255,high&255,low>>>8&255,low&255]}const EMBEDDED_IPV4_RULES=[{matches:hextets=>hextets[0]===0&&hextets[1]===0&&hextets[2]===0&&hextets[3]===0&&hextets[4]===0&&(hextets[5]===65535||hextets[5]===0),extract:hextets=>[hextets[6],hextets[7]]},{matches:hextets=>hextets[0]===100&&hextets[1]===65435&&hextets[2]===0&&hextets[3]===0&&hextets[4]===0&&hextets[5]===0,extract:hextets=>[hextets[6],hextets[7]]},{matches:hextets=>hextets[0]===100&&hextets[1]===65435&&hextets[2]===1&&hextets[3]===0&&hextets[4]===0&&hextets[5]===0,extract:hextets=>[hextets[6],hextets[7]]},{matches:hextets=>hextets[0]===8194,extract:hextets=>[hextets[1],hextets[2]]},{matches:hextets=>hextets[0]===8193&&hextets[1]===0,extract:hextets=>[hextets[6]^65535,hextets[7]^65535]}];function extractIpv4FromEmbeddedIpv6(hextets){for(let rule of EMBEDDED_IPV4_RULES){if(!rule.matches(hextets))continue;let[high,low]=rule.extract(hextets);return decodeIpv4FromHextets(high,low)}return null}function isPrivateIpv4(parts){let[octet1,octet2]=parts;return octet1===0||octet1===10||octet1===127||octet1===169&&octet2===254||octet1===172&&octet2>=16&&octet2<=31||octet1===192&&octet2===168||octet1===100&&octet2>=64&&octet2<=127}function isPrivateIpAddress(address){let normalized=address.trim().toLowerCase();if(normalized.startsWith(`[`)&&normalized.endsWith(`]`)&&(normalized=normalized.slice(1,-1)),!normalized)return!1;if(normalized.includes(`:`)){let hextets=parseIpv6Hextets(normalized);if(!hextets)return!0;let isUnspecified=hextets[0]===0&&hextets[1]===0&&hextets[2]===0&&hextets[3]===0&&hextets[4]===0&&hextets[5]===0&&hextets[6]===0&&hextets[7]===0,isLoopback=hextets[0]===0&&hextets[1]===0&&hextets[2]===0&&hextets[3]===0&&hextets[4]===0&&hextets[5]===0&&hextets[6]===0&&hextets[7]===1;if(isUnspecified||isLoopback)return!0;let embeddedIpv4=extractIpv4FromEmbeddedIpv6(hextets);if(embeddedIpv4)return isPrivateIpv4(embeddedIpv4);let first=hextets[0];return(first&65472)==65152||(first&65472)==65216||(first&65024)==64512}let ipv4=parseIpv4(normalized);return ipv4?isPrivateIpv4(ipv4):!1}function isBlockedHostname(hostname){let normalized=normalizeHostname(hostname);return normalized?BLOCKED_HOSTNAMES.has(normalized)?!0:normalized.endsWith(`.localhost`)||normalized.endsWith(`.local`)||normalized.endsWith(`.internal`):!1}function createPinnedLookup(params){let normalizedHost=normalizeHostname(params.hostname),fallback=params.fallback??lookup,fallbackLookup=fallback,fallbackWithOptions=fallback,records=params.addresses.map(address=>({address,family:address.includes(`:`)?6:4})),index=0;return((host,options,callback)=>{let cb=typeof options==`function`?options:callback;if(!cb)return;let normalized=normalizeHostname(host);if(!normalized||normalized!==normalizedHost)return typeof options==`function`||options===void 0?fallbackLookup(host,cb):fallbackWithOptions(host,options,cb);let opts=typeof options==`object`&&options?options:{},requestedFamily=typeof options==`number`?options:typeof opts.family==`number`?opts.family:0,candidates=requestedFamily===4||requestedFamily===6?records.filter(entry=>entry.family===requestedFamily):records,usable=candidates.length>0?candidates:records;if(opts.all){cb(null,usable);return}let chosen=usable[index%usable.length];index+=1,cb(null,chosen.address,chosen.family)})}async function resolvePinnedHostnameWithPolicy(hostname,params={}){let normalized=normalizeHostname(hostname);if(!normalized)throw Error(`Invalid hostname`);let allowPrivateNetwork=!!params.policy?.allowPrivateNetwork,allowedHostnames=normalizeHostnameSet(params.policy?.allowedHostnames),hostnameAllowlist=normalizeHostnameAllowlist(params.policy?.hostnameAllowlist),isExplicitAllowed=allowedHostnames.has(normalized);if(!matchesHostnameAllowlist(normalized,hostnameAllowlist))throw new SsrFBlockedError(`Blocked hostname (not in allowlist): ${hostname}`);if(!allowPrivateNetwork&&!isExplicitAllowed){if(isBlockedHostname(normalized))throw new SsrFBlockedError(`Blocked hostname: ${hostname}`);if(isPrivateIpAddress(normalized))throw new SsrFBlockedError(`Blocked: private/internal IP address`)}let results=await(params.lookupFn??lookup$1)(normalized,{all:!0});if(results.length===0)throw Error(`Unable to resolve hostname: ${hostname}`);if(!allowPrivateNetwork&&!isExplicitAllowed){for(let entry of results)if(isPrivateIpAddress(entry.address))throw new SsrFBlockedError(`Blocked: resolves to private/internal IP address`)}let addresses=Array.from(new Set(results.map(entry=>entry.address)));if(addresses.length===0)throw Error(`Unable to resolve hostname: ${hostname}`);return{hostname:normalized,addresses,lookup:createPinnedLookup({hostname:normalized,addresses})}}function createPinnedDispatcher(pinned){return new Agent({connect:{lookup:pinned.lookup}})}async function closeDispatcher(dispatcher){if(!dispatcher)return;let candidate=dispatcher;try{if(typeof candidate.close==`function`){await candidate.close();return}typeof candidate.destroy==`function`&&candidate.destroy()}catch{}}function isRedirectStatus(status){return status===301||status===302||status===303||status===307||status===308}function buildAbortSignal(params){let{timeoutMs,signal}=params;if(!timeoutMs&&!signal)return{signal:void 0,cleanup:()=>{}};if(!timeoutMs)return{signal,cleanup:()=>{}};let controller=new AbortController,timeoutId=setTimeout(controller.abort.bind(controller),timeoutMs),onAbort=bindAbortRelay(controller);return signal&&(signal.aborted?controller.abort():signal.addEventListener(`abort`,onAbort,{once:!0})),{signal:controller.signal,cleanup:()=>{clearTimeout(timeoutId),signal&&signal.removeEventListener(`abort`,onAbort)}}}async function fetchWithSsrFGuard(params){let fetcher=params.fetchImpl??globalThis.fetch;if(!fetcher)throw Error(`fetch is not available`);let maxRedirects=typeof params.maxRedirects==`number`&&Number.isFinite(params.maxRedirects)?Math.max(0,Math.floor(params.maxRedirects)):3,{signal,cleanup}=buildAbortSignal({timeoutMs:params.timeoutMs,signal:params.signal}),released=!1,release=async dispatcher=>{released||(released=!0,cleanup(),await closeDispatcher(dispatcher??void 0))},visited=new Set,currentUrl=params.url,redirectCount=0;for(;;){let parsedUrl;try{parsedUrl=new URL(currentUrl)}catch{throw await release(),Error(`Invalid URL: must be http or https`)}if(![`http:`,`https:`].includes(parsedUrl.protocol))throw await release(),Error(`Invalid URL: must be http or https`);let dispatcher=null;try{let pinned=await resolvePinnedHostnameWithPolicy(parsedUrl.hostname,{lookupFn:params.lookupFn,policy:params.policy});params.pinDns!==!1&&(dispatcher=createPinnedDispatcher(pinned));let init={...params.init?{...params.init}:{},redirect:`manual`,...dispatcher?{dispatcher}:{},...signal?{signal}:{}},response=await fetcher(parsedUrl.toString(),init);if(isRedirectStatus(response.status)){let location=response.headers.get(`location`);if(!location)throw await release(dispatcher),Error(`Redirect missing location header (${response.status})`);if(redirectCount+=1,redirectCount>maxRedirects)throw await release(dispatcher),Error(`Too many redirects (limit: ${maxRedirects})`);let nextUrl=new URL(location,parsedUrl).toString();if(visited.has(nextUrl))throw await release(dispatcher),Error(`Redirect loop detected`);visited.add(nextUrl),response.body?.cancel(),await closeDispatcher(dispatcher),currentUrl=nextUrl;continue}return{response,finalUrl:currentUrl,release:async()=>release(dispatcher)}}catch(err){throw err instanceof SsrFBlockedError&&logWarn(`security: blocked URL fetch (${params.auditContext??`url-fetch`}) target=${parsedUrl.origin}${parsedUrl.pathname} reason=${err.message}`),await release(dispatcher),err}}}async function readResponseWithLimit(res,maxBytes,opts){let onOverflow=opts?.onOverflow??(params=>Error(`Content too large: ${params.size} bytes (limit: ${params.maxBytes} bytes)`)),body=res.body;if(!body||typeof body.getReader!=`function`){let fallback=Buffer.from(await res.arrayBuffer());if(fallback.length>maxBytes)throw onOverflow({size:fallback.length,maxBytes,res});return fallback}let reader=body.getReader(),chunks=[],total=0;try{for(;;){let{done,value}=await reader.read();if(done)break;if(value?.length){if(total+=value.length,total>maxBytes){try{await reader.cancel()}catch{}throw onOverflow({size:total,maxBytes,res})}chunks.push(value)}}}finally{try{reader.releaseLock()}catch{}}return Buffer.concat(chunks.map(chunk=>Buffer.from(chunk)),total)}var MediaFetchError=class extends Error{constructor(code,message){super(message),this.code=code,this.name=`MediaFetchError`}};function stripQuotes(value){return value.replace(/^["']|["']$/g,``)}function parseContentDispositionFileName(header){if(!header)return;let starMatch=/filename\*\s*=\s*([^;]+)/i.exec(header);if(starMatch?.[1]){let cleaned=stripQuotes(starMatch[1].trim()),encoded=cleaned.split(`''`).slice(1).join(`''`)||cleaned;try{return path.basename(decodeURIComponent(encoded))}catch{return path.basename(encoded)}}let match=/filename\s*=\s*([^;]+)/i.exec(header);if(match?.[1])return path.basename(stripQuotes(match[1].trim()))}async function readErrorBodySnippet(res,maxChars=200){try{let text=await res.text();if(!text)return;let collapsed=text.replace(/\s+/g,` `).trim();return collapsed?collapsed.length<=maxChars?collapsed:`${collapsed.slice(0,maxChars)}…`:void 0}catch{return}}async function fetchRemoteMedia(options){let{url,fetchImpl,filePathHint,maxBytes,maxRedirects,ssrfPolicy,lookupFn}=options,res,finalUrl=url,release=null;try{let result=await fetchWithSsrFGuard({url,fetchImpl,maxRedirects,policy:ssrfPolicy,lookupFn});res=result.response,finalUrl=result.finalUrl,release=result.release}catch(err){throw new MediaFetchError(`fetch_failed`,`Failed to fetch media from ${url}: ${String(err)}`)}try{if(!res.ok){let statusText=res.statusText?` ${res.statusText}`:``,redirected=finalUrl===url?``:` (redirected to ${finalUrl})`,detail=`HTTP ${res.status}${statusText}`;if(!res.body)detail=`HTTP ${res.status}${statusText}; empty response body`;else{let snippet=await readErrorBodySnippet(res);snippet&&(detail+=`; body: ${snippet}`)}throw new MediaFetchError(`http_error`,`Failed to fetch media from ${url}${redirected}: ${detail}`)}let contentLength=res.headers.get(`content-length`);if(maxBytes&&contentLength){let length=Number(contentLength);if(Number.isFinite(length)&&length>maxBytes)throw new MediaFetchError(`max_bytes`,`Failed to fetch media from ${url}: content length ${length} exceeds maxBytes ${maxBytes}`)}let buffer=maxBytes?await readResponseWithLimit(res,maxBytes,{onOverflow:({maxBytes,res})=>new MediaFetchError(`max_bytes`,`Failed to fetch media from ${res.url||url}: payload exceeds maxBytes ${maxBytes}`)}):Buffer.from(await res.arrayBuffer()),fileNameFromUrl;try{let parsed=new URL(finalUrl);fileNameFromUrl=path.basename(parsed.pathname)||void 0}catch{}let headerFileName=parseContentDispositionFileName(res.headers.get(`content-disposition`)),fileName=headerFileName||fileNameFromUrl||(filePathHint?path.basename(filePathHint):void 0),filePathForMime=headerFileName&&path.extname(headerFileName)?headerFileName:filePathHint??finalUrl,contentType=await detectMime({buffer,headerMime:res.headers.get(`content-type`),filePath:filePathForMime});if(fileName&&!path.extname(fileName)&&contentType){let ext=extensionForMime(contentType);ext&&(fileName=`${fileName}${ext}`)}return{buffer,contentType:contentType??void 0,fileName}}finally{release&&await release()}}export{isGifMedia as C,maxBytesForKind as D,MAX_IMAGE_BYTES as E,mediaKindFromMime as O,isAudioFileName as S,normalizeMimeType as T,resizeToJpeg as _,SsrFBlockedError as a,getFileExtension as b,normalizeHostname as c,IMAGE_REDUCE_QUALITY_STEPS as d,buildImageResizeSideGrid as f,optimizeImageToPng as g,hasAlphaChannel as h,fetchWithSsrFGuard as i,bindAbortRelay as l,getImageMetadata as m,fetchRemoteMedia as n,isBlockedHostname as o,convertHeicToJpeg as p,readResponseWithLimit as r,isPrivateIpAddress as s,MediaFetchError as t,fetchWithTimeout as u,detectMime as v,kindFromMime as w,imageMimeFromFormat as x,extensionForMime as y};
|
package/dist/plugin-sdk/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{c as normalizeAccountId,t as DEFAULT_ACCOUNT_ID}from"./session-key-5J69DULS.js";import{_ as createAccountListHelpers,i as resolveWhatsAppAuthDir,n as resolveDefaultWhatsAppAccountId,r as resolveWhatsAppAccount,t as listWhatsAppAccountIds}from"./accounts-Cy3WCbWg.js";import{$ as formatLocationText,$t as registerPluginHttpRoute,A as resolveSlackChannelAllowlist,At as isWSLEnv,Bt as createDedupeCache,C as hasMarkdownToConvert,Ct as resolveAllowlistMatchSimple,D as attachFooterText,Dt as resolveChannelEntryMatchWithFallback,E as createReceiptCard,Et as resolveChannelEntryMatch,F as resolveServicePrefixedTarget,Ft as installRequestBodyLimitGuard,G as onDiagnosticEvent,Gt as readJsonFile,H as normalizeDiscordSlug,Ht as pruneExpiredPending,I as detectBinary,It as isRequestBodyLimitError,J as formatDocsLink,Jt as readJsonFileWithFallback,K as missingTargetError,Kt as writeJsonAtomic,L as resolveDiscordUserAllowlist,Lt as readJsonBodyWithLimit,M as parseChatAllowTargetPrefixes,Mt as DEFAULT_WEBHOOK_BODY_TIMEOUT_MS,N as parseChatTargetPrefixesOrThrow,Nt as DEFAULT_WEBHOOK_MAX_BODY_BYTES,Ot as resolveNestedAllowlistDecision,P as resolveServicePrefixedAllowTarget,Pt as RequestBodyLimitError,Q as resolveControlCommandGate,Qt as isAllowedParsedChatSender,R as resolveDiscordChannelAllowlist,Rt as readRequestBodyWithLimit,St as formatAllowlistMatchMeta,T as stripMarkdown,Tt as normalizeChannelSlug,U as emitDiagnosticEvent,Ut as resolvePairingPaths,V as parseDiscordTarget,Vt as generatePairingToken,W as isDiagnosticsEnabled,Wt as createAsyncLock,X as stringEnum,Xt as extractToolSend,Y as optionalStringEnum,Yt as writeJsonFileAtomically,Z as recordInboundSession,Zt as formatAllowFromLowercase,_t as clearHistoryEntriesIfEnabled,a as normalizeAccountId$1,at as createTypingCallbacks,ct as shouldAckReactionForWhatsApp,dt as mergeAllowlist,en as BLUEBUBBLES_ACTIONS,et as toLocationContext,ft as summarizeMapping,gt as clearHistoryEntries,ht as buildPendingHistoryContextFromMap,i as listLineAccountIds,it as logTypingFailure,j as normalizeIMessageHandle,jt as isWSLSync,k as resolveSlackUserAllowlist,kt as isWSL2Sync,lt as resolveMentionGating,nn as BLUEBUBBLES_GROUP_ACTIONS,nt as logAckFailure,o as resolveDefaultLineAccountId,ot as removeAckReactionAfterReply,pt as DEFAULT_GROUP_HISTORY_LIMIT,q as registerPluginHooksFromDir,qt as normalizeDeviceAuthScopes,rn as CHANNEL_MESSAGE_ACTION_NAMES,rt as logInboundDrop,s as resolveLineAccount,st as shouldAckReaction,tn as BLUEBUBBLES_ACTION_NAMES,tt as resolveChannelMediaMaxBytes,ut as resolveMentionGatingWithBypass,vt as recordPendingHistoryEntry,w as processLineMessage,wt as buildChannelKeyCandidates,yt as recordPendingHistoryEntryIfEnabled,z as collectDiscordAuditChannelIds,zt as requestBodyErrorToText}from"./reply-3-ne-N_7.js";import{D as normalizeE164,F as sleep,M as safeParseJson,O as pathExists,_ as clamp,g as CONFIG_DIR,lt as normalizePluginHttpPath,r as getChatChannelMeta,tt as registerLogTransport,w as isRecord,x as escapeRegExp}from"./registry-CZHRcH-q.js";import"./paths-Cb8zTlyG.js";import{Mt as acquireFileLock,Nt as withFileLock}from"./model-selection-BtgvnqB5.js";import{A as IMessageConfigSchema,B as MarkdownConfigSchema,D as WhatsAppConfigSchema,F as ToolPolicySchema,G as TtsProviderSchema,H as TtsAutoSchema,I as BlockStreamingCoalesceSchema,K as normalizeAllowFrom,L as DmConfigSchema,M as SignalConfigSchema,N as SlackConfigSchema,O as DiscordConfigSchema,P as TelegramConfigSchema,R as DmPolicySchema,U as TtsConfigSchema,V as MarkdownTableModeSchema,W as TtsModeSchema,j as MSTeamsConfigSchema,k as GoogleChatConfigSchema,q as requireOpenAllowFrom,z as GroupPolicySchema}from"./config-DsXZsCkJ.js";import{a as SsrFBlockedError,b as getFileExtension,i as fetchWithSsrFGuard,o as isBlockedHostname,s as isPrivateIpAddress,v as detectMime,y as extensionForMime}from"./fetch-B-GxSYRO.js";import{n as stripAnsi}from"./subsystem-D0Ril4rt.js";import{D as runCommandWithTimeout}from"./agent-scope-DgKN27hJ.js";import"./tool-images-WRTP95FT.js";import{a as jsonResult,n as createActionGate,o as readNumberParam,s as readReactionParams,u as readStringParam}from"./common-n0l_XN-S.js";import{d as SILENT_REPLY_TOKEN,f as isSilentReplyText,p as parseSlackBlocksInput}from"./replies-DmLfO-pg.js";import{a as resolveAckReaction,n as createReplyPrefixOptions,t as createReplyPrefixContext}from"./reply-prefix-w7kAvH11.js";import{Cr as resolveTelegramGroupRequireMention,Er as resolveWhatsAppGroupToolPolicy,Fr as resolveSignalAccount,Hr as resolveToolsBySender,Ir as listIMessageAccountIds,Lr as resolveDefaultIMessageAccountId,Nr as listSignalAccountIds,Pr as resolveDefaultSignalAccountId,Rr as resolveIMessageAccount,Sr as resolveSlackGroupToolPolicy,Tr as resolveWhatsAppGroupRequireMention,_r as resolveGoogleChatGroupRequireMention,br as resolveIMessageGroupToolPolicy,dr as looksLikeSignalTargetId,fr as normalizeSignalMessagingTarget,gr as resolveDiscordGroupToolPolicy,hr as resolveDiscordGroupRequireMention,jr as buildSlackThreadingToolContext,ln as extractOriginalFilename,mr as resolveBlueBubblesGroupToolPolicy,pr as resolveBlueBubblesGroupRequireMention,vr as resolveGoogleChatGroupToolPolicy,wr as resolveTelegramGroupToolPolicy,xr as resolveSlackGroupRequireMention,yr as resolveIMessageGroupRequireMention}from"./runner-4UfrAQnx.js";import"./redact-Bv8wnIZm.js";import{n as formatErrorMessage}from"./errors-L3rugjUL.js";import{M as rawDataToString}from"./chrome-CuXP-hes.js";import{r as isTruthyEnvValue,t as formatCliCommand}from"./command-format-B3XMq_73.js";import{A as listSlackAccountIds,B as resolveDiscordAccount,D as resolveTelegramAccount,E as resolveDefaultTelegramAccountId,L as listDiscordAccountIds,M as resolveSlackAccount,N as resolveSlackReplyToMode,S as normalizeWhatsAppTarget,T as listTelegramAccountIds,a as listDiscordDirectoryPeersFromConfig,c as listTelegramDirectoryGroupsFromConfig,d as listWhatsAppDirectoryPeersFromConfig,f as looksLikeSlackTargetId,i as listDiscordDirectoryGroupsFromConfig,j as resolveDefaultSlackAccountId,k as listEnabledSlackAccounts,l as listTelegramDirectoryPeersFromConfig,o as listSlackDirectoryGroupsFromConfig,p as normalizeSlackMessagingTarget,s as listSlackDirectoryPeersFromConfig,u as listWhatsAppDirectoryGroupsFromConfig,x as isWhatsAppGroupJid,z as resolveDefaultDiscordAccountId}from"./plugins-BdkC9v5E.js";import"./bindings-CH-YLOLC.js";import"./message-channel-CuZ2xOAM.js";import"./src-BcDibXPq.js";import"./paths-DtbnCdO7.js";import"./api-key-rotation-ftXf7mBZ.js";import"./active-listener-DVWVNlT9.js";import{o as loadWebMedia}from"./render-CuA_WRX5.js";import"./chunk-C94IAOuf.js";import"./manager-BsC-4ymy.js";import"./markdown-tables-BUfhHgfs.js";import{r as resolveWhatsAppHeartbeatRecipients}from"./channel-web-B6rg0Rbf.js";import"./model-catalog-yuiXVcmw.js";import"./sqlite-JjFgDV-H.js";import"./resolve-route-0sbvl4ZN.js";import"./outbound-D_attiyO.js";import"./session-BB-yfDWx.js";import{t as loginWeb}from"./login-_my8QwPP.js";import path from"node:path";import fs,{createWriteStream}from"node:fs";import os from"node:os";import"node:crypto";import fs$1 from"node:fs/promises";import{z}from"zod";import{request}from"node:https";import{pipeline}from"node:stream/promises";import{Readable,Transform}from"node:stream";import JSZip from"jszip";import*as tar from"tar";function error(message){return{success:!1,error:{issues:[{path:[],message}]}}}function emptyPluginConfigSchema(){return{safeParse(value){return value===void 0?{success:!0,data:void 0}:!value||typeof value!=`object`||Array.isArray(value)?error(`expected config object`):Object.keys(value).length>0?error(`config must be empty`):{success:!0,data:value}},jsonSchema:{type:`object`,additionalProperties:!1,properties:{}}}}function normalizeWebhookPath(raw){let trimmed=raw.trim();if(!trimmed)return`/`;let withSlash=trimmed.startsWith(`/`)?trimmed:`/${trimmed}`;return withSlash.length>1&&withSlash.endsWith(`/`)?withSlash.slice(0,-1):withSlash}function resolveWebhookPath(params){let trimmedPath=params.webhookPath?.trim();if(trimmedPath)return normalizeWebhookPath(trimmedPath);if(params.webhookUrl?.trim())try{return normalizeWebhookPath(new URL(params.webhookUrl).pathname||`/`)}catch{return null}return params.defaultPath??null}function registerWebhookTarget(targetsByPath,target){let key=normalizeWebhookPath(target.path),normalizedTarget={...target,path:key},existing=targetsByPath.get(key)??[];return targetsByPath.set(key,[...existing,normalizedTarget]),{target:normalizedTarget,unregister:()=>{let updated=(targetsByPath.get(key)??[]).filter(entry=>entry!==normalizedTarget);if(updated.length>0){targetsByPath.set(key,updated);return}targetsByPath.delete(key)}}}function resolveWebhookTargets(req,targetsByPath){let path=normalizeWebhookPath(new URL(req.url??`/`,`http://localhost`).pathname),targets=targetsByPath.get(path);return!targets||targets.length===0?null:{path,targets}}function rejectNonPostWebhookRequest(req,res){return req.method===`POST`?!1:(res.statusCode=405,res.setHeader(`Allow`,`POST`),res.end(`Method Not Allowed`),!0)}function buildAgentMediaPayload(mediaList){let first=mediaList[0],mediaPaths=mediaList.map(media=>media.path),mediaTypes=mediaList.map(media=>media.contentType).filter(Boolean);return{MediaPath:first?.path,MediaType:first?.contentType??void 0,MediaUrl:first?.path,MediaPaths:mediaPaths.length>0?mediaPaths:void 0,MediaUrls:mediaPaths.length>0?mediaPaths:void 0,MediaTypes:mediaTypes.length>0?mediaTypes:void 0}}function createDefaultChannelRuntimeState(accountId,extra){return{accountId,running:!1,lastStartAt:null,lastStopAt:null,lastError:null,...extra??{}}}function buildBaseChannelStatusSummary(snapshot){return{configured:snapshot.configured??!1,running:snapshot.running??!1,lastStartAt:snapshot.lastStartAt??null,lastStopAt:snapshot.lastStopAt??null,lastError:snapshot.lastError??null}}function collectStatusIssuesFromLastError(channel,accounts){return accounts.flatMap(account=>{let lastError=typeof account.lastError==`string`?account.lastError.trim():``;return lastError?[{channel,accountId:account.accountId,kind:`runtime`,message:`Channel error: ${lastError}`}]:[]})}function buildOauthProviderAuthResult(params){let email=params.email??void 0;return{profiles:[{profileId:`${params.profilePrefix??params.providerId}:${email??`default`}`,credential:{type:`oauth`,provider:params.providerId,access:params.access,...params.refresh?{refresh:params.refresh}:{},...Number.isFinite(params.expires)?{expires:params.expires}:{},...email?{email}:{},...params.credentialExtra}}],configPatch:params.configPatch??{agents:{defaults:{models:{[params.defaultModel]:{}}}}},defaultModel:params.defaultModel,notes:params.notes}}async function resolveSenderCommandAuthorization(params){let shouldComputeAuth=params.shouldComputeCommandAuthorized(params.rawBody,params.cfg),storeAllowFrom=!params.isGroup&&(params.dmPolicy!==`open`||shouldComputeAuth)?await params.readAllowFromStore().catch(()=>[]):[],effectiveAllowFrom=[...params.configuredAllowFrom,...storeAllowFrom],useAccessGroups=params.cfg.commands?.useAccessGroups!==!1,senderAllowedForCommands=params.isSenderAllowed(params.senderId,effectiveAllowFrom);return{shouldComputeAuth,effectiveAllowFrom,senderAllowedForCommands,commandAuthorized:shouldComputeAuth?params.resolveCommandAuthorizedFromAuthorizers({useAccessGroups,authorizers:[{configured:effectiveAllowFrom.length>0,allowed:senderAllowedForCommands}]}):void 0}}function readSlackBlocksParam(actionParams){return parseSlackBlocksInput(actionParams.blocks)}async function handleSlackMessageAction(params){let{providerId,ctx,invoke,normalizeChannelId,includeReadThreadId=!1}=params,{action,cfg,params:actionParams}=ctx,accountId=ctx.accountId??void 0,resolveChannelId=()=>{let channelId=readStringParam(actionParams,`channelId`)??readStringParam(actionParams,`to`,{required:!0});return normalizeChannelId?normalizeChannelId(channelId):channelId};if(action===`send`){let to=readStringParam(actionParams,`to`,{required:!0}),content=readStringParam(actionParams,`message`,{required:!1,allowEmpty:!0}),mediaUrl=readStringParam(actionParams,`media`,{trim:!1}),blocks=readSlackBlocksParam(actionParams);if(!content&&!mediaUrl&&!blocks)throw Error(`Slack send requires message, blocks, or media.`);if(mediaUrl&&blocks)throw Error(`Slack send does not support blocks with media.`);let threadId=readStringParam(actionParams,`threadId`),replyTo=readStringParam(actionParams,`replyTo`);return await invoke({action:`sendMessage`,to,content:content??``,mediaUrl:mediaUrl??void 0,blocks,accountId,threadTs:threadId??replyTo??void 0},cfg,ctx.toolContext)}if(action===`react`){let messageId=readStringParam(actionParams,`messageId`,{required:!0}),emoji=readStringParam(actionParams,`emoji`,{allowEmpty:!0}),remove=typeof actionParams.remove==`boolean`?actionParams.remove:void 0;return await invoke({action:`react`,channelId:resolveChannelId(),messageId,emoji,remove,accountId},cfg)}if(action===`reactions`){let messageId=readStringParam(actionParams,`messageId`,{required:!0}),limit=readNumberParam(actionParams,`limit`,{integer:!0});return await invoke({action:`reactions`,channelId:resolveChannelId(),messageId,limit,accountId},cfg)}if(action===`read`){let limit=readNumberParam(actionParams,`limit`,{integer:!0}),readAction={action:`readMessages`,channelId:resolveChannelId(),limit,before:readStringParam(actionParams,`before`),after:readStringParam(actionParams,`after`),accountId};return includeReadThreadId&&(readAction.threadId=readStringParam(actionParams,`threadId`)),await invoke(readAction,cfg)}if(action===`edit`){let messageId=readStringParam(actionParams,`messageId`,{required:!0}),content=readStringParam(actionParams,`message`,{allowEmpty:!0}),blocks=readSlackBlocksParam(actionParams);if(!content&&!blocks)throw Error(`Slack edit requires message or blocks.`);return await invoke({action:`editMessage`,channelId:resolveChannelId(),messageId,content:content??``,blocks,accountId},cfg)}if(action===`delete`){let messageId=readStringParam(actionParams,`messageId`,{required:!0});return await invoke({action:`deleteMessage`,channelId:resolveChannelId(),messageId,accountId},cfg)}if(action===`pin`||action===`unpin`||action===`list-pins`){let messageId=action===`list-pins`?void 0:readStringParam(actionParams,`messageId`,{required:!0});return await invoke({action:action===`pin`?`pinMessage`:action===`unpin`?`unpinMessage`:`listPins`,channelId:resolveChannelId(),messageId,accountId},cfg)}if(action===`member-info`)return await invoke({action:`memberInfo`,userId:readStringParam(actionParams,`userId`,{required:!0}),accountId},cfg);if(action===`emoji-list`)return await invoke({action:`emojiList`,limit:readNumberParam(actionParams,`limit`,{integer:!0}),accountId},cfg);throw Error(`Action ${action} is not supported for provider ${providerId}.`)}function resolveChannelAccountConfigBasePath(params){return params.cfg.channels?.[params.channelKey]?.accounts?.[params.accountId]?`channels.${params.channelKey}.accounts.${params.accountId}.`:`channels.${params.channelKey}.`}function chunkTextForOutbound(text,limit){if(!text)return[];if(limit<=0||text.length<=limit)return[text];let chunks=[],remaining=text;for(;remaining.length>limit;){let window=remaining.slice(0,limit),lastNewline=window.lastIndexOf(`
|
|
1
|
+
import{c as normalizeAccountId,t as DEFAULT_ACCOUNT_ID}from"./session-key-5J69DULS.js";import{_ as createAccountListHelpers,i as resolveWhatsAppAuthDir,n as resolveDefaultWhatsAppAccountId,r as resolveWhatsAppAccount,t as listWhatsAppAccountIds}from"./accounts-BwreSNAR.js";import{$ as formatLocationText,$t as registerPluginHttpRoute,A as resolveSlackChannelAllowlist,At as isWSLEnv,Bt as createDedupeCache,C as hasMarkdownToConvert,Ct as resolveAllowlistMatchSimple,D as attachFooterText,Dt as resolveChannelEntryMatchWithFallback,E as createReceiptCard,Et as resolveChannelEntryMatch,F as resolveServicePrefixedTarget,Ft as installRequestBodyLimitGuard,G as onDiagnosticEvent,Gt as readJsonFile,H as normalizeDiscordSlug,Ht as pruneExpiredPending,I as detectBinary,It as isRequestBodyLimitError,J as formatDocsLink,Jt as readJsonFileWithFallback,K as missingTargetError,Kt as writeJsonAtomic,L as resolveDiscordUserAllowlist,Lt as readJsonBodyWithLimit,M as parseChatAllowTargetPrefixes,Mt as DEFAULT_WEBHOOK_BODY_TIMEOUT_MS,N as parseChatTargetPrefixesOrThrow,Nt as DEFAULT_WEBHOOK_MAX_BODY_BYTES,Ot as resolveNestedAllowlistDecision,P as resolveServicePrefixedAllowTarget,Pt as RequestBodyLimitError,Q as resolveControlCommandGate,Qt as isAllowedParsedChatSender,R as resolveDiscordChannelAllowlist,Rt as readRequestBodyWithLimit,St as formatAllowlistMatchMeta,T as stripMarkdown,Tt as normalizeChannelSlug,U as emitDiagnosticEvent,Ut as resolvePairingPaths,V as parseDiscordTarget,Vt as generatePairingToken,W as isDiagnosticsEnabled,Wt as createAsyncLock,X as stringEnum,Xt as extractToolSend,Y as optionalStringEnum,Yt as writeJsonFileAtomically,Z as recordInboundSession,Zt as formatAllowFromLowercase,_t as clearHistoryEntriesIfEnabled,a as normalizeAccountId$1,at as createTypingCallbacks,ct as shouldAckReactionForWhatsApp,dt as mergeAllowlist,en as BLUEBUBBLES_ACTIONS,et as toLocationContext,ft as summarizeMapping,gt as clearHistoryEntries,ht as buildPendingHistoryContextFromMap,i as listLineAccountIds,it as logTypingFailure,j as normalizeIMessageHandle,jt as isWSLSync,k as resolveSlackUserAllowlist,kt as isWSL2Sync,lt as resolveMentionGating,nn as BLUEBUBBLES_GROUP_ACTIONS,nt as logAckFailure,o as resolveDefaultLineAccountId,ot as removeAckReactionAfterReply,pt as DEFAULT_GROUP_HISTORY_LIMIT,q as registerPluginHooksFromDir,qt as normalizeDeviceAuthScopes,rn as CHANNEL_MESSAGE_ACTION_NAMES,rt as logInboundDrop,s as resolveLineAccount,st as shouldAckReaction,tn as BLUEBUBBLES_ACTION_NAMES,tt as resolveChannelMediaMaxBytes,ut as resolveMentionGatingWithBypass,vt as recordPendingHistoryEntry,w as processLineMessage,wt as buildChannelKeyCandidates,yt as recordPendingHistoryEntryIfEnabled,z as collectDiscordAuditChannelIds,zt as requestBodyErrorToText}from"./reply-D5Uk7pUv.js";import{D as normalizeE164,F as sleep,M as safeParseJson,O as pathExists,_ as clamp,g as CONFIG_DIR,lt as normalizePluginHttpPath,r as getChatChannelMeta,tt as registerLogTransport,w as isRecord,x as escapeRegExp}from"./registry-DJq2Cvo9.js";import"./paths-Cb8zTlyG.js";import{Mt as acquireFileLock,Nt as withFileLock}from"./model-selection-K82MAGlL.js";import{A as IMessageConfigSchema,B as MarkdownConfigSchema,D as WhatsAppConfigSchema,F as ToolPolicySchema,G as TtsProviderSchema,H as TtsAutoSchema,I as BlockStreamingCoalesceSchema,K as normalizeAllowFrom,L as DmConfigSchema,M as SignalConfigSchema,N as SlackConfigSchema,O as DiscordConfigSchema,P as TelegramConfigSchema,R as DmPolicySchema,U as TtsConfigSchema,V as MarkdownTableModeSchema,W as TtsModeSchema,j as MSTeamsConfigSchema,k as GoogleChatConfigSchema,q as requireOpenAllowFrom,z as GroupPolicySchema}from"./config-v1EU9Ll8.js";import{a as SsrFBlockedError,b as getFileExtension,i as fetchWithSsrFGuard,o as isBlockedHostname,s as isPrivateIpAddress,v as detectMime,y as extensionForMime}from"./fetch-DH0Y8iyO.js";import{n as stripAnsi}from"./subsystem-COTa5Ly_.js";import{D as runCommandWithTimeout}from"./agent-scope-BQByW0cD.js";import"./tool-images-DSpchb4x.js";import{a as jsonResult,n as createActionGate,o as readNumberParam,s as readReactionParams,u as readStringParam}from"./common-BxEWhN2X.js";import{d as SILENT_REPLY_TOKEN,f as isSilentReplyText,p as parseSlackBlocksInput}from"./replies-Cz5OD3qN.js";import{a as resolveAckReaction,n as createReplyPrefixOptions,t as createReplyPrefixContext}from"./reply-prefix-CCymsmsP.js";import{Cr as resolveTelegramGroupRequireMention,Er as resolveWhatsAppGroupToolPolicy,Fr as resolveSignalAccount,Hr as resolveToolsBySender,Ir as listIMessageAccountIds,Lr as resolveDefaultIMessageAccountId,Nr as listSignalAccountIds,Pr as resolveDefaultSignalAccountId,Rr as resolveIMessageAccount,Sr as resolveSlackGroupToolPolicy,Tr as resolveWhatsAppGroupRequireMention,_r as resolveGoogleChatGroupRequireMention,br as resolveIMessageGroupToolPolicy,dr as looksLikeSignalTargetId,fr as normalizeSignalMessagingTarget,gr as resolveDiscordGroupToolPolicy,hr as resolveDiscordGroupRequireMention,jr as buildSlackThreadingToolContext,ln as extractOriginalFilename,mr as resolveBlueBubblesGroupToolPolicy,pr as resolveBlueBubblesGroupRequireMention,vr as resolveGoogleChatGroupToolPolicy,wr as resolveTelegramGroupToolPolicy,xr as resolveSlackGroupRequireMention,yr as resolveIMessageGroupRequireMention}from"./runner-CYkuO7Fh.js";import"./redact-Bv8wnIZm.js";import{n as formatErrorMessage}from"./errors-L3rugjUL.js";import{M as rawDataToString}from"./chrome-SOXFIkUM.js";import{r as isTruthyEnvValue,t as formatCliCommand}from"./command-format-CAX9XFjI.js";import{A as listSlackAccountIds,B as resolveDiscordAccount,D as resolveTelegramAccount,E as resolveDefaultTelegramAccountId,L as listDiscordAccountIds,M as resolveSlackAccount,N as resolveSlackReplyToMode,S as normalizeWhatsAppTarget,T as listTelegramAccountIds,a as listDiscordDirectoryPeersFromConfig,c as listTelegramDirectoryGroupsFromConfig,d as listWhatsAppDirectoryPeersFromConfig,f as looksLikeSlackTargetId,i as listDiscordDirectoryGroupsFromConfig,j as resolveDefaultSlackAccountId,k as listEnabledSlackAccounts,l as listTelegramDirectoryPeersFromConfig,o as listSlackDirectoryGroupsFromConfig,p as normalizeSlackMessagingTarget,s as listSlackDirectoryPeersFromConfig,u as listWhatsAppDirectoryGroupsFromConfig,x as isWhatsAppGroupJid,z as resolveDefaultDiscordAccountId}from"./plugins-CaUOZBVb.js";import"./bindings-CDEzl4kl.js";import"./message-channel-sBPQc_-T.js";import"./src-BcDibXPq.js";import"./paths-DtbnCdO7.js";import"./api-key-rotation-7YdImWrh.js";import"./active-listener-DpQ7aGYd.js";import{o as loadWebMedia}from"./render-BUCRXPIk.js";import"./chunk-cW0POl22.js";import"./manager-BH_bmGds.js";import"./markdown-tables-Epim9b-0.js";import{r as resolveWhatsAppHeartbeatRecipients}from"./channel-web-D2KuONp0.js";import"./model-catalog-cXsza5GU.js";import"./sqlite-BlMLqMl8.js";import"./resolve-route-DN1J7Wyc.js";import"./outbound-Chn_H1O7.js";import"./session-D5jHDo78.js";import{t as loginWeb}from"./login-d1zBgykF.js";import path from"node:path";import fs,{createWriteStream}from"node:fs";import os from"node:os";import"node:crypto";import fs$1 from"node:fs/promises";import{z}from"zod";import{request}from"node:https";import{pipeline}from"node:stream/promises";import{Readable,Transform}from"node:stream";import JSZip from"jszip";import*as tar from"tar";function error(message){return{success:!1,error:{issues:[{path:[],message}]}}}function emptyPluginConfigSchema(){return{safeParse(value){return value===void 0?{success:!0,data:void 0}:!value||typeof value!=`object`||Array.isArray(value)?error(`expected config object`):Object.keys(value).length>0?error(`config must be empty`):{success:!0,data:value}},jsonSchema:{type:`object`,additionalProperties:!1,properties:{}}}}function normalizeWebhookPath(raw){let trimmed=raw.trim();if(!trimmed)return`/`;let withSlash=trimmed.startsWith(`/`)?trimmed:`/${trimmed}`;return withSlash.length>1&&withSlash.endsWith(`/`)?withSlash.slice(0,-1):withSlash}function resolveWebhookPath(params){let trimmedPath=params.webhookPath?.trim();if(trimmedPath)return normalizeWebhookPath(trimmedPath);if(params.webhookUrl?.trim())try{return normalizeWebhookPath(new URL(params.webhookUrl).pathname||`/`)}catch{return null}return params.defaultPath??null}function registerWebhookTarget(targetsByPath,target){let key=normalizeWebhookPath(target.path),normalizedTarget={...target,path:key},existing=targetsByPath.get(key)??[];return targetsByPath.set(key,[...existing,normalizedTarget]),{target:normalizedTarget,unregister:()=>{let updated=(targetsByPath.get(key)??[]).filter(entry=>entry!==normalizedTarget);if(updated.length>0){targetsByPath.set(key,updated);return}targetsByPath.delete(key)}}}function resolveWebhookTargets(req,targetsByPath){let path=normalizeWebhookPath(new URL(req.url??`/`,`http://localhost`).pathname),targets=targetsByPath.get(path);return!targets||targets.length===0?null:{path,targets}}function rejectNonPostWebhookRequest(req,res){return req.method===`POST`?!1:(res.statusCode=405,res.setHeader(`Allow`,`POST`),res.end(`Method Not Allowed`),!0)}function buildAgentMediaPayload(mediaList){let first=mediaList[0],mediaPaths=mediaList.map(media=>media.path),mediaTypes=mediaList.map(media=>media.contentType).filter(Boolean);return{MediaPath:first?.path,MediaType:first?.contentType??void 0,MediaUrl:first?.path,MediaPaths:mediaPaths.length>0?mediaPaths:void 0,MediaUrls:mediaPaths.length>0?mediaPaths:void 0,MediaTypes:mediaTypes.length>0?mediaTypes:void 0}}function createDefaultChannelRuntimeState(accountId,extra){return{accountId,running:!1,lastStartAt:null,lastStopAt:null,lastError:null,...extra??{}}}function buildBaseChannelStatusSummary(snapshot){return{configured:snapshot.configured??!1,running:snapshot.running??!1,lastStartAt:snapshot.lastStartAt??null,lastStopAt:snapshot.lastStopAt??null,lastError:snapshot.lastError??null}}function collectStatusIssuesFromLastError(channel,accounts){return accounts.flatMap(account=>{let lastError=typeof account.lastError==`string`?account.lastError.trim():``;return lastError?[{channel,accountId:account.accountId,kind:`runtime`,message:`Channel error: ${lastError}`}]:[]})}function buildOauthProviderAuthResult(params){let email=params.email??void 0;return{profiles:[{profileId:`${params.profilePrefix??params.providerId}:${email??`default`}`,credential:{type:`oauth`,provider:params.providerId,access:params.access,...params.refresh?{refresh:params.refresh}:{},...Number.isFinite(params.expires)?{expires:params.expires}:{},...email?{email}:{},...params.credentialExtra}}],configPatch:params.configPatch??{agents:{defaults:{models:{[params.defaultModel]:{}}}}},defaultModel:params.defaultModel,notes:params.notes}}async function resolveSenderCommandAuthorization(params){let shouldComputeAuth=params.shouldComputeCommandAuthorized(params.rawBody,params.cfg),storeAllowFrom=!params.isGroup&&(params.dmPolicy!==`open`||shouldComputeAuth)?await params.readAllowFromStore().catch(()=>[]):[],effectiveAllowFrom=[...params.configuredAllowFrom,...storeAllowFrom],useAccessGroups=params.cfg.commands?.useAccessGroups!==!1,senderAllowedForCommands=params.isSenderAllowed(params.senderId,effectiveAllowFrom);return{shouldComputeAuth,effectiveAllowFrom,senderAllowedForCommands,commandAuthorized:shouldComputeAuth?params.resolveCommandAuthorizedFromAuthorizers({useAccessGroups,authorizers:[{configured:effectiveAllowFrom.length>0,allowed:senderAllowedForCommands}]}):void 0}}function readSlackBlocksParam(actionParams){return parseSlackBlocksInput(actionParams.blocks)}async function handleSlackMessageAction(params){let{providerId,ctx,invoke,normalizeChannelId,includeReadThreadId=!1}=params,{action,cfg,params:actionParams}=ctx,accountId=ctx.accountId??void 0,resolveChannelId=()=>{let channelId=readStringParam(actionParams,`channelId`)??readStringParam(actionParams,`to`,{required:!0});return normalizeChannelId?normalizeChannelId(channelId):channelId};if(action===`send`){let to=readStringParam(actionParams,`to`,{required:!0}),content=readStringParam(actionParams,`message`,{required:!1,allowEmpty:!0}),mediaUrl=readStringParam(actionParams,`media`,{trim:!1}),blocks=readSlackBlocksParam(actionParams);if(!content&&!mediaUrl&&!blocks)throw Error(`Slack send requires message, blocks, or media.`);if(mediaUrl&&blocks)throw Error(`Slack send does not support blocks with media.`);let threadId=readStringParam(actionParams,`threadId`),replyTo=readStringParam(actionParams,`replyTo`);return await invoke({action:`sendMessage`,to,content:content??``,mediaUrl:mediaUrl??void 0,blocks,accountId,threadTs:threadId??replyTo??void 0},cfg,ctx.toolContext)}if(action===`react`){let messageId=readStringParam(actionParams,`messageId`,{required:!0}),emoji=readStringParam(actionParams,`emoji`,{allowEmpty:!0}),remove=typeof actionParams.remove==`boolean`?actionParams.remove:void 0;return await invoke({action:`react`,channelId:resolveChannelId(),messageId,emoji,remove,accountId},cfg)}if(action===`reactions`){let messageId=readStringParam(actionParams,`messageId`,{required:!0}),limit=readNumberParam(actionParams,`limit`,{integer:!0});return await invoke({action:`reactions`,channelId:resolveChannelId(),messageId,limit,accountId},cfg)}if(action===`read`){let limit=readNumberParam(actionParams,`limit`,{integer:!0}),readAction={action:`readMessages`,channelId:resolveChannelId(),limit,before:readStringParam(actionParams,`before`),after:readStringParam(actionParams,`after`),accountId};return includeReadThreadId&&(readAction.threadId=readStringParam(actionParams,`threadId`)),await invoke(readAction,cfg)}if(action===`edit`){let messageId=readStringParam(actionParams,`messageId`,{required:!0}),content=readStringParam(actionParams,`message`,{allowEmpty:!0}),blocks=readSlackBlocksParam(actionParams);if(!content&&!blocks)throw Error(`Slack edit requires message or blocks.`);return await invoke({action:`editMessage`,channelId:resolveChannelId(),messageId,content:content??``,blocks,accountId},cfg)}if(action===`delete`){let messageId=readStringParam(actionParams,`messageId`,{required:!0});return await invoke({action:`deleteMessage`,channelId:resolveChannelId(),messageId,accountId},cfg)}if(action===`pin`||action===`unpin`||action===`list-pins`){let messageId=action===`list-pins`?void 0:readStringParam(actionParams,`messageId`,{required:!0});return await invoke({action:action===`pin`?`pinMessage`:action===`unpin`?`unpinMessage`:`listPins`,channelId:resolveChannelId(),messageId,accountId},cfg)}if(action===`member-info`)return await invoke({action:`memberInfo`,userId:readStringParam(actionParams,`userId`,{required:!0}),accountId},cfg);if(action===`emoji-list`)return await invoke({action:`emojiList`,limit:readNumberParam(actionParams,`limit`,{integer:!0}),accountId},cfg);throw Error(`Action ${action} is not supported for provider ${providerId}.`)}function resolveChannelAccountConfigBasePath(params){return params.cfg.channels?.[params.channelKey]?.accounts?.[params.accountId]?`channels.${params.channelKey}.accounts.${params.accountId}.`:`channels.${params.channelKey}.`}function chunkTextForOutbound(text,limit){if(!text)return[];if(limit<=0||text.length<=limit)return[text];let chunks=[],remaining=text;for(;remaining.length>limit;){let window=remaining.slice(0,limit),lastNewline=window.lastIndexOf(`
|
|
2
2
|
`),lastSpace=window.lastIndexOf(` `),breakIdx=lastNewline>0?lastNewline:lastSpace;breakIdx<=0&&(breakIdx=limit);let chunk=remaining.slice(0,breakIdx).trimEnd();chunk.length>0&&chunks.push(chunk);let brokeOnSeparator=breakIdx<remaining.length&&/\s/.test(remaining[breakIdx]),nextStart=Math.min(remaining.length,breakIdx+(brokeOnSeparator?1:0));remaining=remaining.slice(nextStart).trimStart()}return remaining.length&&chunks.push(remaining),chunks}const withLock=createAsyncLock();async function loadState(baseDir){let{pendingPath,pairedPath}=resolvePairingPaths(baseDir,`devices`),[pending,paired]=await Promise.all([readJsonFile(pendingPath),readJsonFile(pairedPath)]),state={pendingById:pending??{},pairedByDeviceId:paired??{}};return pruneExpiredPending(state.pendingById,Date.now(),3e5),state}async function persistState(state,baseDir){let{pendingPath,pairedPath}=resolvePairingPaths(baseDir,`devices`);await Promise.all([writeJsonAtomic(pendingPath,state.pendingById),writeJsonAtomic(pairedPath,state.pairedByDeviceId)])}function normalizeRole(role){return role?.trim()||null}function mergeRoles(...items){let roles=new Set;for(let item of items)if(item)if(Array.isArray(item))for(let role of item){let trimmed=role.trim();trimmed&&roles.add(trimmed)}else{let trimmed=item.trim();trimmed&&roles.add(trimmed)}if(roles.size!==0)return[...roles]}function mergeScopes(...items){let scopes=new Set;for(let item of items)if(item)for(let scope of item){let trimmed=scope.trim();trimmed&&scopes.add(trimmed)}if(scopes.size!==0)return[...scopes]}function newToken(){return generatePairingToken()}async function listDevicePairing(baseDir){let state=await loadState(baseDir);return{pending:Object.values(state.pendingById).toSorted((a,b)=>b.ts-a.ts),paired:Object.values(state.pairedByDeviceId).toSorted((a,b)=>b.approvedAtMs-a.approvedAtMs)}}async function approveDevicePairing(requestId,baseDir){return await withLock(async()=>{let state=await loadState(baseDir),pending=state.pendingById[requestId];if(!pending)return null;let now=Date.now(),existing=state.pairedByDeviceId[pending.deviceId],roles=mergeRoles(existing?.roles,existing?.role,pending.roles,pending.role),scopes=mergeScopes(existing?.scopes,pending.scopes),tokens=existing?.tokens?{...existing.tokens}:{},roleForToken=normalizeRole(pending.role);if(roleForToken){let nextScopes=normalizeDeviceAuthScopes(pending.scopes),existingToken=tokens[roleForToken],now=Date.now();tokens[roleForToken]={token:newToken(),role:roleForToken,scopes:nextScopes,createdAtMs:existingToken?.createdAtMs??now,rotatedAtMs:existingToken?now:void 0,revokedAtMs:void 0,lastUsedAtMs:existingToken?.lastUsedAtMs}}let device={deviceId:pending.deviceId,publicKey:pending.publicKey,displayName:pending.displayName,platform:pending.platform,clientId:pending.clientId,clientMode:pending.clientMode,role:pending.role,roles,scopes,remoteIp:pending.remoteIp,tokens,createdAtMs:existing?.createdAtMs??now,approvedAtMs:now};return delete state.pendingById[requestId],state.pairedByDeviceId[device.deviceId]=device,await persistState(state,baseDir),{requestId,device}})}async function rejectDevicePairing(requestId,baseDir){return await withLock(async()=>{let state=await loadState(baseDir),pending=state.pendingById[requestId];return pending?(delete state.pendingById[requestId],await persistState(state,baseDir),{requestId,deviceId:pending.deviceId}):null})}function buildChannelConfigSchema(schema){return{schema:schema.toJSONSchema({target:`draft-07`,unrepresentable:`any`})}}function setAccountEnabledInConfigSection(params){let accountKey=params.accountId||DEFAULT_ACCOUNT_ID,base=params.cfg.channels?.[params.sectionKey],hasAccounts=!!base?.accounts;if(params.allowTopLevel&&accountKey===DEFAULT_ACCOUNT_ID&&!hasAccounts)return{...params.cfg,channels:{...params.cfg.channels,[params.sectionKey]:{...base,enabled:params.enabled}}};let baseAccounts=base?.accounts??{},existing=baseAccounts[accountKey]??{};return{...params.cfg,channels:{...params.cfg.channels,[params.sectionKey]:{...base,accounts:{...baseAccounts,[accountKey]:{...existing,enabled:params.enabled}}}}}}function deleteAccountFromConfigSection(params){let accountKey=params.accountId||DEFAULT_ACCOUNT_ID,base=params.cfg.channels?.[params.sectionKey];if(!base)return params.cfg;let baseAccounts=base.accounts&&typeof base.accounts==`object`?{...base.accounts}:void 0;if(accountKey!==DEFAULT_ACCOUNT_ID){let accounts=baseAccounts?{...baseAccounts}:{};return delete accounts[accountKey],{...params.cfg,channels:{...params.cfg.channels,[params.sectionKey]:{...base,accounts:Object.keys(accounts).length?accounts:void 0}}}}if(baseAccounts&&Object.keys(baseAccounts).length>0){delete baseAccounts[accountKey];let baseRecord={...base};for(let field of params.clearBaseFields??[])field in baseRecord&&(baseRecord[field]=void 0);return{...params.cfg,channels:{...params.cfg.channels,[params.sectionKey]:{...baseRecord,accounts:Object.keys(baseAccounts).length?baseAccounts:void 0}}}}let nextChannels={...params.cfg.channels};delete nextChannels[params.sectionKey];let nextCfg={...params.cfg};return Object.keys(nextChannels).length>0?nextCfg.channels=nextChannels:delete nextCfg.channels,nextCfg}function channelHasAccounts(cfg,channelKey){let base=cfg.channels?.[channelKey];return!!(base?.accounts&&Object.keys(base.accounts).length>0)}function shouldStoreNameInAccounts(params){return params.alwaysUseAccounts||params.accountId!==DEFAULT_ACCOUNT_ID?!0:channelHasAccounts(params.cfg,params.channelKey)}function applyAccountNameToChannelSection(params){let trimmed=params.name?.trim();if(!trimmed)return params.cfg;let accountId=normalizeAccountId(params.accountId),baseConfig=params.cfg.channels?.[params.channelKey],base=typeof baseConfig==`object`&&baseConfig?baseConfig:void 0;if(!shouldStoreNameInAccounts({cfg:params.cfg,channelKey:params.channelKey,accountId,alwaysUseAccounts:params.alwaysUseAccounts})&&accountId===DEFAULT_ACCOUNT_ID){let safeBase=base??{};return{...params.cfg,channels:{...params.cfg.channels,[params.channelKey]:{...safeBase,name:trimmed}}}}let baseAccounts=base?.accounts??{},existingAccount=baseAccounts[accountId]??{},baseWithoutName=accountId===DEFAULT_ACCOUNT_ID?(({name:_ignored,...rest})=>rest)(base??{}):base??{};return{...params.cfg,channels:{...params.cfg.channels,[params.channelKey]:{...baseWithoutName,accounts:{...baseAccounts,[accountId]:{...existingAccount,name:trimmed}}}}}}function migrateBaseNameToDefaultAccount(params){if(params.alwaysUseAccounts)return params.cfg;let base=params.cfg.channels?.[params.channelKey],baseName=base?.name?.trim();if(!baseName)return params.cfg;let accounts={...base?.accounts},defaultAccount=accounts[DEFAULT_ACCOUNT_ID]??{};defaultAccount.name||(accounts[DEFAULT_ACCOUNT_ID]={...defaultAccount,name:baseName});let{name:_ignored,...rest}=base??{};return{...params.cfg,channels:{...params.cfg.channels,[params.channelKey]:{...rest,accounts}}}}function formatPairingApproveHint(channelId){return`Approve via: ${formatCliCommand(`builderforce pairing list ${channelId}`)} / ${formatCliCommand(`builderforce pairing approve ${channelId} <code>`)}`}const PAIRING_APPROVED_MESSAGE=`✅ BuilderForceAgents access approved. Send a message to start chatting.`;async function promptAccountId$1(params){let existingIds=params.listAccountIds(params.cfg),initial=params.currentId?.trim()||params.defaultAccountId||DEFAULT_ACCOUNT_ID,choice=await params.prompter.select({message:`${params.label} account`,options:[...existingIds.map(id=>({value:id,label:id===DEFAULT_ACCOUNT_ID?`default (primary)`:id})),{value:`__new__`,label:`Add a new account`}],initialValue:initial});if(choice!==`__new__`)return normalizeAccountId(choice);let entered=await params.prompter.text({message:`New ${params.label} account id`,validate:value=>value?.trim()?void 0:`Required`}),normalized=normalizeAccountId(String(entered));return String(entered).trim()!==normalized&&await params.prompter.note(`Normalized account id to "${normalized}".`,`${params.label} account`),normalized}const promptAccountId=async params=>await promptAccountId$1(params);function addWildcardAllowFrom(allowFrom){let next=(allowFrom??[]).map(v=>String(v).trim()).filter(Boolean);return next.includes(`*`)||next.push(`*`),next}function mergeAllowFromEntries(current,additions){let merged=[...current??[],...additions].map(v=>String(v).trim()).filter(Boolean);return[...new Set(merged)]}async function promptResolvedAllowFrom(params){for(;;){let entry=await params.prompter.text({message:params.message,placeholder:params.placeholder,initialValue:params.existing[0]?String(params.existing[0]):void 0,validate:value=>String(value??``).trim()?void 0:`Required`}),parts=params.parseInputs(String(entry));if(!params.token){let ids=parts.map(params.parseId).filter(Boolean);if(ids.length!==parts.length){await params.prompter.note(params.invalidWithoutTokenNote,params.label);continue}return mergeAllowFromEntries(params.existing,ids)}let results=await params.resolveEntries({token:params.token,entries:parts}).catch(()=>null);if(!results){await params.prompter.note(`Failed to resolve usernames. Try again.`,params.label);continue}let unresolved=results.filter(res=>!res.resolved||!res.id);if(unresolved.length>0){await params.prompter.note(`Could not resolve: ${unresolved.map(res=>res.input).join(`, `)}`,params.label);continue}let ids=results.map(res=>res.id);return mergeAllowFromEntries(params.existing,ids)}}function parseAllowlistEntries(raw){return String(raw??``).split(/[,\n]/g).map(entry=>entry.trim()).filter(Boolean)}function formatAllowlistEntries(entries){return entries.map(entry=>entry.trim()).filter(Boolean).join(`, `)}async function promptChannelAccessPolicy(params){let options=[{value:`allowlist`,label:`Allowlist (recommended)`}];params.allowOpen!==!1&&options.push({value:`open`,label:`Open (allow all channels)`}),params.allowDisabled!==!1&&options.push({value:`disabled`,label:`Disabled (block all channels)`});let initialValue=params.currentPolicy??`allowlist`;return await params.prompter.select({message:`${params.label} access`,options,initialValue})}async function promptChannelAllowlist(params){let initialValue=params.currentEntries&¶ms.currentEntries.length>0?formatAllowlistEntries(params.currentEntries):void 0;return parseAllowlistEntries(await params.prompter.text({message:`${params.label} allowlist (comma-separated)`,placeholder:params.placeholder,initialValue}))}async function promptChannelAccessConfig(params){let hasEntries=(params.currentEntries??[]).length>0,shouldPrompt=params.defaultPrompt??!hasEntries;if(!await params.prompter.confirm({message:params.updatePrompt?`Update ${params.label} access?`:`Configure ${params.label} access?`,initialValue:shouldPrompt}))return null;let policy=await promptChannelAccessPolicy({prompter:params.prompter,label:params.label,currentPolicy:params.currentPolicy,allowOpen:params.allowOpen,allowDisabled:params.allowDisabled});return policy===`allowlist`?{policy,entries:await promptChannelAllowlist({prompter:params.prompter,label:params.label,currentEntries:params.currentEntries,placeholder:params.placeholder})}:{policy,entries:[]}}const channel$5=`discord`;function setDiscordDmPolicy(cfg,dmPolicy){let existingAllowFrom=cfg.channels?.discord?.allowFrom??cfg.channels?.discord?.dm?.allowFrom,allowFrom=dmPolicy===`open`?addWildcardAllowFrom(existingAllowFrom):void 0;return{...cfg,channels:{...cfg.channels,discord:{...cfg.channels?.discord,dmPolicy,...allowFrom?{allowFrom}:{},dm:{...cfg.channels?.discord?.dm,enabled:cfg.channels?.discord?.dm?.enabled??!0}}}}}async function noteDiscordTokenHelp(prompter){await prompter.note([`1) Discord Developer Portal → Applications → New Application`,`2) Bot → Add Bot → Reset Token → copy token`,`3) OAuth2 → URL Generator → scope 'bot' → invite to your server`,`Tip: enable Message Content Intent if you need message text. (Bot → Privileged Gateway Intents → Message Content Intent)`,`Docs: ${formatDocsLink(`/discord`,`discord`)}`].join(`
|
|
3
3
|
`),`Discord bot token`)}function patchDiscordConfigForAccount(cfg,accountId,patch){return accountId===DEFAULT_ACCOUNT_ID?{...cfg,channels:{...cfg.channels,discord:{...cfg.channels?.discord,enabled:!0,...patch}}}:{...cfg,channels:{...cfg.channels,discord:{...cfg.channels?.discord,enabled:!0,accounts:{...cfg.channels?.discord?.accounts,[accountId]:{...cfg.channels?.discord?.accounts?.[accountId],enabled:cfg.channels?.discord?.accounts?.[accountId]?.enabled??!0,...patch}}}}}}function setDiscordGroupPolicy(cfg,accountId,groupPolicy){return patchDiscordConfigForAccount(cfg,accountId,{groupPolicy})}function setDiscordGuildChannelAllowlist(cfg,accountId,entries){let guilds={...accountId===DEFAULT_ACCOUNT_ID?cfg.channels?.discord?.guilds??{}:cfg.channels?.discord?.accounts?.[accountId]?.guilds??{}};for(let entry of entries){let guildKey=entry.guildKey||`*`,existing=guilds[guildKey]??{};if(entry.channelKey){let channels={...existing.channels};channels[entry.channelKey]={allow:!0},guilds[guildKey]={...existing,channels}}else guilds[guildKey]=existing}return patchDiscordConfigForAccount(cfg,accountId,{guilds})}function setDiscordAllowFrom(cfg,allowFrom){return{...cfg,channels:{...cfg.channels,discord:{...cfg.channels?.discord,allowFrom,dm:{...cfg.channels?.discord?.dm,enabled:cfg.channels?.discord?.dm?.enabled??!0}}}}}function parseDiscordAllowFromInput(raw){return raw.split(/[\n,;]+/g).map(entry=>entry.trim()).filter(Boolean)}async function promptDiscordAllowFrom(params){let accountId=params.accountId&&normalizeAccountId(params.accountId)?normalizeAccountId(params.accountId)??DEFAULT_ACCOUNT_ID:resolveDefaultDiscordAccountId(params.cfg),token=resolveDiscordAccount({cfg:params.cfg,accountId}).token,existing=params.cfg.channels?.discord?.allowFrom??params.cfg.channels?.discord?.dm?.allowFrom??[];await params.prompter.note([`Allowlist Discord DMs by username (we resolve to user ids).`,`Examples:`,`- 123456789012345678`,`- @alice`,`- alice#1234`,`Multiple entries: comma-separated.`,`Docs: ${formatDocsLink(`/discord`,`discord`)}`].join(`
|
|
4
4
|
`),`Discord allowlist`);let unique=await promptResolvedAllowFrom({prompter:params.prompter,existing,token,message:`Discord allowFrom (usernames or ids)`,placeholder:`@alice, 123456789012345678`,label:`Discord allowlist`,parseInputs:value=>parseDiscordAllowFromInput(value),parseId:value=>{let trimmed=value.trim();if(!trimmed)return null;let mention=trimmed.match(/^<@!?(\d+)>$/);if(mention)return mention[1];let prefixed=trimmed.replace(/^(user:|discord:)/i,``);return/^\d+$/.test(prefixed)?prefixed:null},invalidWithoutTokenNote:`Bot token missing; use numeric user ids (or mention form) only.`,resolveEntries:({token,entries})=>resolveDiscordUserAllowlist({token,entries})});return setDiscordAllowFrom(params.cfg,unique)}const discordOnboardingAdapter={channel:channel$5,getStatus:async({cfg})=>{let configured=listDiscordAccountIds(cfg).some(accountId=>!!resolveDiscordAccount({cfg,accountId}).token);return{channel:channel$5,configured,statusLines:[`Discord: ${configured?`configured`:`needs token`}`],selectionHint:configured?`configured`:`needs token`,quickstartScore:configured?2:1}},configure:async({cfg,prompter,accountOverrides,shouldPromptAccountIds})=>{let discordOverride=accountOverrides.discord?.trim(),defaultDiscordAccountId=resolveDefaultDiscordAccountId(cfg),discordAccountId=discordOverride?normalizeAccountId(discordOverride):defaultDiscordAccountId;shouldPromptAccountIds&&!discordOverride&&(discordAccountId=await promptAccountId({cfg,prompter,label:`Discord`,currentId:discordAccountId,listAccountIds:listDiscordAccountIds,defaultAccountId:defaultDiscordAccountId}));let next=cfg,resolvedAccount=resolveDiscordAccount({cfg:next,accountId:discordAccountId}),accountConfigured=!!resolvedAccount.token,canUseEnv=discordAccountId===DEFAULT_ACCOUNT_ID&&!!process.env.DISCORD_BOT_TOKEN?.trim(),hasConfigToken=!!resolvedAccount.config.token,token=null;accountConfigured||await noteDiscordTokenHelp(prompter),canUseEnv&&!resolvedAccount.config.token?await prompter.confirm({message:`DISCORD_BOT_TOKEN detected. Use env var?`,initialValue:!0})?next={...next,channels:{...next.channels,discord:{...next.channels?.discord,enabled:!0}}}:token=String(await prompter.text({message:`Enter Discord bot token`,validate:value=>value?.trim()?void 0:`Required`})).trim():hasConfigToken&&await prompter.confirm({message:`Discord token already configured. Keep it?`,initialValue:!0})||(token=String(await prompter.text({message:`Enter Discord bot token`,validate:value=>value?.trim()?void 0:`Required`})).trim()),token&&(next=discordAccountId===DEFAULT_ACCOUNT_ID?{...next,channels:{...next.channels,discord:{...next.channels?.discord,enabled:!0,token}}}:{...next,channels:{...next.channels,discord:{...next.channels?.discord,enabled:!0,accounts:{...next.channels?.discord?.accounts,[discordAccountId]:{...next.channels?.discord?.accounts?.[discordAccountId],enabled:next.channels?.discord?.accounts?.[discordAccountId]?.enabled??!0,token}}}}});let currentEntries=Object.entries(resolvedAccount.config.guilds??{}).flatMap(([guildKey,value])=>{let channels=value?.channels??{},channelKeys=Object.keys(channels);return channelKeys.length===0?[/^\d+$/.test(guildKey)?`guild:${guildKey}`:guildKey]:channelKeys.map(channelKey=>`${guildKey}/${channelKey}`)}),accessConfig=await promptChannelAccessConfig({prompter,label:`Discord channels`,currentPolicy:resolvedAccount.config.groupPolicy??`allowlist`,currentEntries,placeholder:`My Server/#general, guildId/channelId, #support`,updatePrompt:!!resolvedAccount.config.guilds});if(accessConfig)if(accessConfig.policy!==`allowlist`)next=setDiscordGroupPolicy(next,discordAccountId,accessConfig.policy);else{let accountWithTokens=resolveDiscordAccount({cfg:next,accountId:discordAccountId}),resolved=accessConfig.entries.map(input=>({input,resolved:!1}));if(accountWithTokens.token&&accessConfig.entries.length>0)try{resolved=await resolveDiscordChannelAllowlist({token:accountWithTokens.token,entries:accessConfig.entries});let resolvedChannels=resolved.filter(entry=>entry.resolved&&entry.channelId),resolvedGuilds=resolved.filter(entry=>entry.resolved&&entry.guildId&&!entry.channelId),unresolved=resolved.filter(entry=>!entry.resolved).map(entry=>entry.input);if(resolvedChannels.length>0||resolvedGuilds.length>0||unresolved.length>0){let summary=[];resolvedChannels.length>0&&summary.push(`Resolved channels: ${resolvedChannels.map(entry=>entry.channelId).filter(Boolean).join(`, `)}`),resolvedGuilds.length>0&&summary.push(`Resolved guilds: ${resolvedGuilds.map(entry=>entry.guildId).filter(Boolean).join(`, `)}`),unresolved.length>0&&summary.push(`Unresolved (kept as typed): ${unresolved.join(`, `)}`),await prompter.note(summary.join(`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{t as __exportAll}from"./rolldown-runtime-BlRA8w72.js";import{c as logoutWeb,r as resolveWhatsAppAccount}from"./accounts-
|
|
1
|
+
import{t as __exportAll}from"./rolldown-runtime-BlRA8w72.js";import{c as logoutWeb,r as resolveWhatsAppAccount}from"./accounts-BwreSNAR.js";import{B as info,K as success,z as danger}from"./registry-DJq2Cvo9.js";import{n as loadConfig}from"./config-v1EU9Ll8.js";import{i as defaultRuntime}from"./subsystem-COTa5Ly_.js";import{M as logInfo}from"./agent-scope-BQByW0cD.js";import{t as formatCliCommand}from"./command-format-CAX9XFjI.js";import{i as waitForWaConnection,n as formatError,t as createWaSocket}from"./session-D5jHDo78.js";import{DisconnectReason}from"@whiskeysockets/baileys";var login_exports=__exportAll({loginWeb:()=>loginWeb});async function loginWeb(verbose,waitForConnection,runtime=defaultRuntime,accountId){let wait=waitForConnection??waitForWaConnection,account=resolveWhatsAppAccount({cfg:loadConfig(),accountId}),sock=await createWaSocket(!0,verbose,{authDir:account.authDir});logInfo(`Waiting for WhatsApp connection...`,runtime);try{await wait(sock),console.log(success(`✅ Linked! Credentials saved for future sends.`))}catch(err){let code=err?.error?.output?.statusCode??err?.output?.statusCode;if(code===515){console.log(info(`WhatsApp asked for a restart after pairing (code 515); creds are saved. Restarting connection once…`));try{sock.ws?.close()}catch{}let retry=await createWaSocket(!1,verbose,{authDir:account.authDir});try{await wait(retry),console.log(success(`✅ Linked after restart; web session ready.`));return}finally{setTimeout(()=>retry.ws?.close(),500)}}if(code===DisconnectReason.loggedOut)throw await logoutWeb({authDir:account.authDir,isLegacyAuthDir:account.isLegacyAuthDir,runtime}),console.error(danger(`WhatsApp reported the session is logged out. Cleared cached web session; please rerun ${formatCliCommand(`builderforce channels login`)} and scan the QR again.`)),Error(`Session logged out; cache cleared. Re-run login.`,{cause:err});let formatted=formatError(err);throw console.error(danger(`WhatsApp Web connection ended before fully opening. ${formatted}`)),Error(formatted,{cause:err})}finally{setTimeout(()=>{try{sock.ws?.close()}catch{}},500)}}export{login_exports as n,loginWeb as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import"./session-key-5J69DULS.js";import{c as logoutWeb,f as readWebSelfId,g as webAuthExists,r as resolveWhatsAppAccount}from"./accounts-
|
|
1
|
+
import"./session-key-5J69DULS.js";import{c as logoutWeb,f as readWebSelfId,g as webAuthExists,r as resolveWhatsAppAccount}from"./accounts-BwreSNAR.js";import{B as info,K as success,z as danger}from"./registry-DJq2Cvo9.js";import"./paths-Cb8zTlyG.js";import"./model-selection-K82MAGlL.js";import{n as loadConfig}from"./config-v1EU9Ll8.js";import{i as defaultRuntime}from"./subsystem-COTa5Ly_.js";import{M as logInfo}from"./agent-scope-BQByW0cD.js";import"./command-format-CAX9XFjI.js";import"./src-BcDibXPq.js";import{i as waitForWaConnection,n as formatError,r as getStatusCode,t as createWaSocket}from"./session-D5jHDo78.js";import{randomUUID}from"node:crypto";import{DisconnectReason}from"@whiskeysockets/baileys";import QRCodeModule from"qrcode-terminal/vendor/QRCode/index.js";import QRErrorCorrectLevelModule from"qrcode-terminal/vendor/QRCode/QRErrorCorrectLevel.js";import{deflateSync}from"node:zlib";const CRC_TABLE=(()=>{let table=new Uint32Array(256);for(let i=0;i<256;i+=1){let c=i;for(let k=0;k<8;k+=1)c=c&1?3988292384^c>>>1:c>>>1;table[i]=c>>>0}return table})();function crc32(buf){let crc=4294967295;for(let i=0;i<buf.length;i+=1)crc=CRC_TABLE[(crc^buf[i])&255]^crc>>>8;return(crc^4294967295)>>>0}function pngChunk(type,data){let typeBuf=Buffer.from(type,`ascii`),len=Buffer.alloc(4);len.writeUInt32BE(data.length,0);let crc=crc32(Buffer.concat([typeBuf,data])),crcBuf=Buffer.alloc(4);return crcBuf.writeUInt32BE(crc,0),Buffer.concat([len,typeBuf,data,crcBuf])}function fillPixel(buf,x,y,width,r,g,b,a=255){if(x<0||y<0||x>=width)return;let idx=(y*width+x)*4;idx<0||idx+3>=buf.length||(buf[idx]=r,buf[idx+1]=g,buf[idx+2]=b,buf[idx+3]=a)}function encodePngRgba(buffer,width,height){let stride=width*4,raw=Buffer.alloc((stride+1)*height);for(let row=0;row<height;row+=1){let rawOffset=row*(stride+1);raw[rawOffset]=0,buffer.copy(raw,rawOffset+1,row*stride,row*stride+stride)}let compressed=deflateSync(raw),signature=Buffer.from([137,80,78,71,13,10,26,10]),ihdr=Buffer.alloc(13);return ihdr.writeUInt32BE(width,0),ihdr.writeUInt32BE(height,4),ihdr[8]=8,ihdr[9]=6,ihdr[10]=0,ihdr[11]=0,ihdr[12]=0,Buffer.concat([signature,pngChunk(`IHDR`,ihdr),pngChunk(`IDAT`,compressed),pngChunk(`IEND`,Buffer.alloc(0))])}const QRCode=QRCodeModule,QRErrorCorrectLevel=QRErrorCorrectLevelModule;function createQrMatrix(input){let qr=new QRCode(-1,QRErrorCorrectLevel.L);return qr.addData(input),qr.make(),qr}async function renderQrPngBase64(input,opts={}){let{scale=6,marginModules=4}=opts,qr=createQrMatrix(input),modules=qr.getModuleCount(),size=(modules+marginModules*2)*scale,buf=Buffer.alloc(size*size*4,255);for(let row=0;row<modules;row+=1)for(let col=0;col<modules;col+=1){if(!qr.isDark(row,col))continue;let startX=(col+marginModules)*scale,startY=(row+marginModules)*scale;for(let y=0;y<scale;y+=1){let pixelY=startY+y;for(let x=0;x<scale;x+=1)fillPixel(buf,startX+x,pixelY,size,0,0,0,255)}}return encodePngRgba(buf,size,size).toString(`base64`)}const activeLogins=new Map;function closeSocket(sock){try{sock.ws?.close()}catch{}}async function resetActiveLogin(accountId,reason){let login=activeLogins.get(accountId);login&&(closeSocket(login.sock),activeLogins.delete(accountId)),reason&&logInfo(reason)}function isLoginFresh(login){return Date.now()-login.startedAt<18e4}function attachLoginWaiter(accountId,login){login.waitPromise=waitForWaConnection(login.sock).then(()=>{let current=activeLogins.get(accountId);current?.id===login.id&&(current.connected=!0)}).catch(err=>{let current=activeLogins.get(accountId);current?.id===login.id&&(current.error=formatError(err),current.errorStatus=getStatusCode(err))})}async function restartLoginSocket(login,runtime){if(login.restartAttempted)return!1;login.restartAttempted=!0,runtime.log(info(`WhatsApp asked for a restart after pairing (code 515); retrying connection once…`)),closeSocket(login.sock);try{return login.sock=await createWaSocket(!1,login.verbose,{authDir:login.authDir}),login.connected=!1,login.error=void 0,login.errorStatus=void 0,attachLoginWaiter(login.accountId,login),!0}catch(err){return login.error=formatError(err),login.errorStatus=getStatusCode(err),!1}}async function startWebLoginWithQr(opts={}){let runtime=opts.runtime??defaultRuntime,account=resolveWhatsAppAccount({cfg:loadConfig(),accountId:opts.accountId}),hasWeb=await webAuthExists(account.authDir),selfId=readWebSelfId(account.authDir);if(hasWeb&&!opts.force)return{message:`WhatsApp is already linked (${selfId.e164??selfId.jid??`unknown`}). Say “relink” if you want a fresh QR.`};let existing=activeLogins.get(account.accountId);if(existing&&isLoginFresh(existing)&&existing.qrDataUrl)return{qrDataUrl:existing.qrDataUrl,message:`QR already active. Scan it in WhatsApp → Linked Devices.`};await resetActiveLogin(account.accountId);let resolveQr=null,rejectQr=null,qrPromise=new Promise((resolve,reject)=>{resolveQr=resolve,rejectQr=reject}),qrTimer=setTimeout(()=>{rejectQr?.(Error(`Timed out waiting for WhatsApp QR`))},Math.max(opts.timeoutMs??3e4,5e3)),sock,pendingQr=null;try{sock=await createWaSocket(!1,!!opts.verbose,{authDir:account.authDir,onQr:qr=>{if(pendingQr)return;pendingQr=qr;let current=activeLogins.get(account.accountId);current&&!current.qr&&(current.qr=qr),clearTimeout(qrTimer),runtime.log(info(`WhatsApp QR received.`)),resolveQr?.(qr)}})}catch(err){return clearTimeout(qrTimer),await resetActiveLogin(account.accountId),{message:`Failed to start WhatsApp login: ${String(err)}`}}let login={accountId:account.accountId,authDir:account.authDir,isLegacyAuthDir:account.isLegacyAuthDir,id:randomUUID(),sock,startedAt:Date.now(),connected:!1,waitPromise:Promise.resolve(),restartAttempted:!1,verbose:!!opts.verbose};activeLogins.set(account.accountId,login),pendingQr&&!login.qr&&(login.qr=pendingQr),attachLoginWaiter(account.accountId,login);let qr;try{qr=await qrPromise}catch(err){return clearTimeout(qrTimer),await resetActiveLogin(account.accountId),{message:`Failed to get QR: ${String(err)}`}}return login.qrDataUrl=`data:image/png;base64,${await renderQrPngBase64(qr)}`,{qrDataUrl:login.qrDataUrl,message:`Scan this QR in WhatsApp → Linked Devices.`}}async function waitForWebLogin(opts={}){let runtime=opts.runtime??defaultRuntime,account=resolveWhatsAppAccount({cfg:loadConfig(),accountId:opts.accountId}),activeLogin=activeLogins.get(account.accountId);if(!activeLogin)return{connected:!1,message:`No active WhatsApp login in progress.`};let login=activeLogin;if(!isLoginFresh(login))return await resetActiveLogin(account.accountId),{connected:!1,message:`The login QR expired. Ask me to generate a new one.`};let timeoutMs=Math.max(opts.timeoutMs??12e4,1e3),deadline=Date.now()+timeoutMs;for(;;){let remaining=deadline-Date.now();if(remaining<=0)return{connected:!1,message:`Still waiting for the QR scan. Let me know when you’ve scanned it.`};let timeout=new Promise(resolve=>setTimeout(()=>resolve(`timeout`),remaining));if(await Promise.race([login.waitPromise.then(()=>`done`),timeout])===`timeout`)return{connected:!1,message:`Still waiting for the QR scan. Let me know when you’ve scanned it.`};if(login.error){if(login.errorStatus===DisconnectReason.loggedOut){await logoutWeb({authDir:login.authDir,isLegacyAuthDir:login.isLegacyAuthDir,runtime});let message=`WhatsApp reported the session is logged out. Cleared cached web session; please scan a new QR.`;return await resetActiveLogin(account.accountId,message),runtime.log(danger(message)),{connected:!1,message}}if(login.errorStatus===515&&await restartLoginSocket(login,runtime)&&isLoginFresh(login))continue;let message=`WhatsApp login failed: ${login.error}`;return await resetActiveLogin(account.accountId,message),runtime.log(danger(message)),{connected:!1,message}}if(login.connected){let message=`✅ Linked! WhatsApp is ready.`;return runtime.log(success(message)),await resetActiveLogin(account.accountId),{connected:!0,message}}return{connected:!1,message:`Login ended without a connection.`}}}export{startWebLoginWithQr,waitForWebLogin};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{t as __exportAll}from"./rolldown-runtime-BlRA8w72.js";import{F as sleep,R as truncateUtf16Safe,j as resolveUserPath,v as clampInt,y as clampNumber$1}from"./registry-CZHRcH-q.js";import{s as resolveStateDir}from"./paths-Cb8zTlyG.js";import{X as resolveApiKeyForProvider,Y as requireApiKey,mt as normalizeBaseUrl}from"./model-selection-BtgvnqB5.js";import{t as createSubsystemLogger}from"./subsystem-D0Ril4rt.js";import{n as resolveAgentConfig,r as resolveAgentDir,s as resolveAgentWorkspaceDir}from"./agent-scope-DgKN27hJ.js";import{n as formatErrorMessage}from"./errors-L3rugjUL.js";import{r as isTruthyEnvValue}from"./command-format-B3XMq_73.js";import{o as resolveSessionTranscriptsDirForAgent}from"./paths-DtbnCdO7.js";import{a as onSessionTranscriptUpdate,n as executeWithApiKeyRotation,r as parseGeminiAuth,t as collectProviderApiKeysForExecution}from"./api-key-rotation-ftXf7mBZ.js";import{_ as runWithConcurrency,a as buildFileEntry,d as hashText,f as isMemoryPath,g as remapChunkLines,h as parseEmbedding,i as sessionPathForFile,m as normalizeExtraMemoryPaths,n as buildSessionEntry,o as chunkMarkdown,p as listMemoryFiles,r as listSessionFilesForAgent,s as ensureDir,t as requireNodeSqlite,u as getDefaultMemoryWatchPatterns}from"./sqlite-JjFgDV-H.js";import path from"node:path";import fs from"node:fs";import os from"node:os";import{randomUUID}from"node:crypto";import fs$1 from"node:fs/promises";import{Readable}from"node:stream";import{createInterface}from"node:readline";import chokidar from"chokidar";const DEFAULT_RETRY_CONFIG={attempts:3,minDelayMs:300,maxDelayMs:3e4,jitter:0},asFiniteNumber=value=>typeof value==`number`&&Number.isFinite(value)?value:void 0,clampNumber=(value,fallback,min,max)=>{let next=asFiniteNumber(value);if(next===void 0)return fallback;let floor=typeof min==`number`?min:-1/0,ceiling=typeof max==`number`?max:1/0;return Math.min(Math.max(next,floor),ceiling)};function resolveRetryConfig(defaults=DEFAULT_RETRY_CONFIG,overrides){let attempts=Math.max(1,Math.round(clampNumber(overrides?.attempts,defaults.attempts,1))),minDelayMs=Math.max(0,Math.round(clampNumber(overrides?.minDelayMs,defaults.minDelayMs,0)));return{attempts,minDelayMs,maxDelayMs:Math.max(minDelayMs,Math.round(clampNumber(overrides?.maxDelayMs,defaults.maxDelayMs,0))),jitter:clampNumber(overrides?.jitter,defaults.jitter,0,1)}}function applyJitter(delayMs,jitter){if(jitter<=0)return delayMs;let offset=(Math.random()*2-1)*jitter;return Math.max(0,Math.round(delayMs*(1+offset)))}async function retryAsync(fn,attemptsOrOptions=3,initialDelayMs=300){if(typeof attemptsOrOptions==`number`){let attempts=Math.max(1,Math.round(attemptsOrOptions)),lastErr;for(let i=0;i<attempts;i+=1)try{return await fn()}catch(err){if(lastErr=err,i===attempts-1)break;await sleep(initialDelayMs*2**i)}throw lastErr??Error(`Retry failed`)}let options=attemptsOrOptions,resolved=resolveRetryConfig(DEFAULT_RETRY_CONFIG,options),maxAttempts=resolved.attempts,minDelayMs=resolved.minDelayMs,maxDelayMs=Number.isFinite(resolved.maxDelayMs)&&resolved.maxDelayMs>0?resolved.maxDelayMs:1/0,jitter=resolved.jitter,shouldRetry=options.shouldRetry??(()=>!0),lastErr;for(let attempt=1;attempt<=maxAttempts;attempt+=1)try{return await fn()}catch(err){if(lastErr=err,attempt>=maxAttempts||!shouldRetry(err,attempt))break;let retryAfterMs=options.retryAfterMs?.(err),baseDelay=typeof retryAfterMs==`number`&&Number.isFinite(retryAfterMs)?Math.max(retryAfterMs,minDelayMs):minDelayMs*2**(attempt-1),delay=Math.min(baseDelay,maxDelayMs);delay=applyJitter(delay,jitter),delay=Math.min(Math.max(delay,minDelayMs),maxDelayMs),options.onRetry?.({attempt,maxAttempts,delayMs:delay,err,label:options.label}),await sleep(delay)}throw lastErr??Error(`Retry failed`)}function tokenize$1(text){return text.toLowerCase().split(/[\s\W]+/).filter(Boolean)}function jaccardSimilarity(a,b){if(a.size===0&&b.size===0)return 1;let intersection=0;for(let token of a)b.has(token)&&intersection++;let union=a.size+b.size-intersection;return intersection/union}function cosineSimilarity(a,b){let n=Math.min(a.length,b.length),dot=0,na=0,nb=0;for(let i=0;i<n;i++)dot+=a[i]*b[i],na+=a[i]*a[i],nb+=b[i]*b[i];let denom=Math.sqrt(na)*Math.sqrt(nb);return denom===0?0:dot/denom}function mmrSelect(items,opts){let lambda=opts.lambda??.7,limit=Math.min(opts.topK??items.length,items.length),remaining=[...items],relevance=new Map;for(let item of remaining)relevance.set(item,opts.relevance(item));let selected=[];for(;selected.length<limit&&remaining.length>0;){let bestIdx=-1,bestScore=-1/0;for(let i=0;i<remaining.length;i++){let candidate=remaining[i],maxSimToSelected=0;for(let s of selected){let sim=opts.similarity(candidate,s);sim>maxSimToSelected&&(maxSimToSelected=sim)}let score=lambda*relevance.get(candidate)-(1-lambda)*maxSimToSelected;(score>bestScore||score===bestScore&&bestIdx>=0&&opts.tieScore!==void 0&&opts.tieScore(candidate)>opts.tieScore(remaining[bestIdx]))&&(bestScore=score,bestIdx=i)}if(bestIdx<0)break;selected.push(remaining.splice(bestIdx,1)[0])}return selected}function textMaximalMarginalRelevance(items,lambda=.7){if(items.length<=1)return[...items];let l=Math.max(0,Math.min(1,lambda));if(l===1)return[...items].sort((a,b)=>b.score-a.score);let tokens=new Map;for(let item of items)tokens.set(item.id,new Set(tokenize$1(item.content)));let tokensOf=item=>tokens.get(item.id)??new Set(tokenize$1(item.content)),scores=items.map(i=>i.score),min=Math.min(...scores),range=Math.max(...scores)-min;return mmrSelect(items,{relevance:item=>range===0?1:(item.score-min)/range,similarity:(a,b)=>jaccardSimilarity(tokensOf(a),tokensOf(b)),lambda:l,tieScore:item=>item.score})}const DEFAULT_HYBRID_VECTOR_WEIGHT$1=.7,DEFAULT_HYBRID_TEXT_WEIGHT$1=.3;function normalizeHybridWeights(vectorWeight,textWeight){let clamp=(n,fallback)=>typeof n==`number`&&Number.isFinite(n)?Math.max(0,n):fallback,v=clamp(vectorWeight,DEFAULT_HYBRID_VECTOR_WEIGHT$1),t=clamp(textWeight,DEFAULT_HYBRID_TEXT_WEIGHT$1),sum=v+t;return sum<=0?{vectorWeight:DEFAULT_HYBRID_VECTOR_WEIGHT$1,textWeight:DEFAULT_HYBRID_TEXT_WEIGHT$1}:{vectorWeight:v/sum,textWeight:t/sum}}function hybridScore(scores,weights){let v=Number.isFinite(scores.vectorScore)?scores.vectorScore:0,t=Number.isFinite(scores.textScore)?scores.textScore:0;return weights.vectorWeight*v+weights.textWeight*t}function bm25RankToScore$1(rank){return 1/(1+(Number.isFinite(rank)?Math.max(0,rank):999))}function toDecayLambda(halfLifeDays){return!Number.isFinite(halfLifeDays)||halfLifeDays<=0?0:Math.LN2/halfLifeDays}function calculateTemporalDecayMultiplier(params){let lambda=toDecayLambda(params.halfLifeDays),clampedAge=Math.max(0,params.ageInDays);return lambda<=0||!Number.isFinite(clampedAge)?1:Math.exp(-lambda*clampedAge)}function applyTemporalDecayToScore(params){return params.score*calculateTemporalDecayMultiplier(params)}const DEFAULT_MMR_LAMBDA=.7,DEFAULT_SOURCES=[`memory`];function normalizeSources(sources,sessionMemoryEnabled){let normalized=new Set,input=sources?.length?sources:DEFAULT_SOURCES;for(let source of input)source===`memory`&&normalized.add(`memory`),source===`sessions`&&sessionMemoryEnabled&&normalized.add(`sessions`);return normalized.size===0&&normalized.add(`memory`),Array.from(normalized)}function resolveStorePath(agentId,raw){let stateDir=resolveStateDir(process.env,os.homedir),fallback=path.join(stateDir,`memory`,`${agentId}.sqlite`);return raw?resolveUserPath(raw.includes(`{agentId}`)?raw.replaceAll(`{agentId}`,agentId):raw):fallback}function mergeConfig(defaults,overrides,agentId){let enabled=overrides?.enabled??defaults?.enabled??!0,sessionMemory=overrides?.experimental?.sessionMemory??defaults?.experimental?.sessionMemory??!1,provider=overrides?.provider??defaults?.provider??`auto`,defaultRemote=defaults?.remote,overrideRemote=overrides?.remote,includeRemote=!!(overrideRemote?.baseUrl||overrideRemote?.apiKey||overrideRemote?.headers||defaultRemote?.baseUrl||defaultRemote?.apiKey||defaultRemote?.headers)||provider===`openai`||provider===`gemini`||provider===`voyage`||provider===`auto`,batch={enabled:overrideRemote?.batch?.enabled??defaultRemote?.batch?.enabled??!1,wait:overrideRemote?.batch?.wait??defaultRemote?.batch?.wait??!0,concurrency:Math.max(1,overrideRemote?.batch?.concurrency??defaultRemote?.batch?.concurrency??2),pollIntervalMs:overrideRemote?.batch?.pollIntervalMs??defaultRemote?.batch?.pollIntervalMs??2e3,timeoutMinutes:overrideRemote?.batch?.timeoutMinutes??defaultRemote?.batch?.timeoutMinutes??60},remote=includeRemote?{baseUrl:overrideRemote?.baseUrl??defaultRemote?.baseUrl,apiKey:overrideRemote?.apiKey??defaultRemote?.apiKey,headers:overrideRemote?.headers??defaultRemote?.headers,batch}:void 0,fallback=overrides?.fallback??defaults?.fallback??`none`,modelDefault=provider===`gemini`?`gemini-embedding-001`:provider===`openai`?`text-embedding-3-small`:provider===`voyage`?`voyage-4-large`:void 0,model=overrides?.model??defaults?.model??modelDefault??``,local={modelPath:overrides?.local?.modelPath??defaults?.local?.modelPath,modelCacheDir:overrides?.local?.modelCacheDir??defaults?.local?.modelCacheDir},sources=normalizeSources(overrides?.sources??defaults?.sources,sessionMemory),rawPaths=[...defaults?.extraPaths??[],...overrides?.extraPaths??[]].map(value=>value.trim()).filter(Boolean),extraPaths=Array.from(new Set(rawPaths)),vector={enabled:overrides?.store?.vector?.enabled??defaults?.store?.vector?.enabled??!0,extensionPath:overrides?.store?.vector?.extensionPath??defaults?.store?.vector?.extensionPath},store={driver:overrides?.store?.driver??defaults?.store?.driver??`sqlite`,path:resolveStorePath(agentId,overrides?.store?.path??defaults?.store?.path),vector},chunking={tokens:overrides?.chunking?.tokens??defaults?.chunking?.tokens??400,overlap:overrides?.chunking?.overlap??defaults?.chunking?.overlap??80},sync={onSessionStart:overrides?.sync?.onSessionStart??defaults?.sync?.onSessionStart??!0,onSearch:overrides?.sync?.onSearch??defaults?.sync?.onSearch??!0,watch:overrides?.sync?.watch??defaults?.sync?.watch??!0,watchDebounceMs:overrides?.sync?.watchDebounceMs??defaults?.sync?.watchDebounceMs??1500,intervalMinutes:overrides?.sync?.intervalMinutes??defaults?.sync?.intervalMinutes??0,sessions:{deltaBytes:overrides?.sync?.sessions?.deltaBytes??defaults?.sync?.sessions?.deltaBytes??1e5,deltaMessages:overrides?.sync?.sessions?.deltaMessages??defaults?.sync?.sessions?.deltaMessages??50}},query={maxResults:overrides?.query?.maxResults??defaults?.query?.maxResults??6,minScore:overrides?.query?.minScore??defaults?.query?.minScore??.35},hybrid={enabled:overrides?.query?.hybrid?.enabled??defaults?.query?.hybrid?.enabled??!0,vectorWeight:overrides?.query?.hybrid?.vectorWeight??defaults?.query?.hybrid?.vectorWeight??.7,textWeight:overrides?.query?.hybrid?.textWeight??defaults?.query?.hybrid?.textWeight??.3,candidateMultiplier:overrides?.query?.hybrid?.candidateMultiplier??defaults?.query?.hybrid?.candidateMultiplier??4,mmr:{enabled:overrides?.query?.hybrid?.mmr?.enabled??defaults?.query?.hybrid?.mmr?.enabled??!1,lambda:overrides?.query?.hybrid?.mmr?.lambda??defaults?.query?.hybrid?.mmr?.lambda??DEFAULT_MMR_LAMBDA},temporalDecay:{enabled:overrides?.query?.hybrid?.temporalDecay?.enabled??defaults?.query?.hybrid?.temporalDecay?.enabled??!1,halfLifeDays:overrides?.query?.hybrid?.temporalDecay?.halfLifeDays??defaults?.query?.hybrid?.temporalDecay?.halfLifeDays??30}},cache={enabled:overrides?.cache?.enabled??defaults?.cache?.enabled??!0,maxEntries:overrides?.cache?.maxEntries??defaults?.cache?.maxEntries},overlap=clampNumber$1(chunking.overlap,0,Math.max(0,chunking.tokens-1)),minScore=clampNumber$1(query.minScore,0,1),{vectorWeight:normalizedVectorWeight,textWeight:normalizedTextWeight}=normalizeHybridWeights(hybrid.vectorWeight,hybrid.textWeight),candidateMultiplier=clampInt(hybrid.candidateMultiplier,1,20),temporalDecayHalfLifeDays=Math.max(1,Math.floor(Number.isFinite(hybrid.temporalDecay.halfLifeDays)?hybrid.temporalDecay.halfLifeDays:30)),deltaBytes=clampInt(sync.sessions.deltaBytes,0,2**53-1),deltaMessages=clampInt(sync.sessions.deltaMessages,0,2**53-1);return{enabled,sources,extraPaths,provider,remote,experimental:{sessionMemory},fallback,model,local,store,chunking:{tokens:Math.max(1,chunking.tokens),overlap},sync:{...sync,sessions:{deltaBytes,deltaMessages}},query:{...query,minScore,hybrid:{enabled:!!hybrid.enabled,vectorWeight:normalizedVectorWeight,textWeight:normalizedTextWeight,candidateMultiplier,mmr:{enabled:!!hybrid.mmr.enabled,lambda:Number.isFinite(hybrid.mmr.lambda)?Math.max(0,Math.min(1,hybrid.mmr.lambda)):DEFAULT_MMR_LAMBDA},temporalDecay:{enabled:!!hybrid.temporalDecay.enabled,halfLifeDays:temporalDecayHalfLifeDays}}},cache:{enabled:!!cache.enabled,maxEntries:typeof cache.maxEntries==`number`&&Number.isFinite(cache.maxEntries)?Math.max(1,Math.floor(cache.maxEntries)):void 0}}}function resolveMemorySearchConfig(cfg,agentId){let defaults=cfg.agents?.defaults?.memorySearch,overrides=resolveAgentConfig(cfg,agentId)?.memorySearch,resolved=mergeConfig(defaults,overrides,agentId);return resolved.enabled?resolved:null}const debugEmbeddings=isTruthyEnvValue(process.env.BUILDERFORCE_AGENTS_DEBUG_MEMORY_EMBEDDINGS),log$3=createSubsystemLogger(`memory/embeddings`);function debugEmbeddingsLog(message,meta){if(!debugEmbeddings)return;let suffix=meta?` ${JSON.stringify(meta)}`:``;log$3.raw(`${message}${suffix}`)}const DEFAULT_GEMINI_EMBEDDING_MODEL=`gemini-embedding-001`,GEMINI_MAX_INPUT_TOKENS={"text-embedding-004":2048};function resolveRemoteApiKey(remoteApiKey){let trimmed=remoteApiKey?.trim();if(trimmed)return trimmed===`GOOGLE_API_KEY`||trimmed===`GEMINI_API_KEY`?process.env[trimmed]?.trim():trimmed}function normalizeGeminiModel(model){let trimmed=model.trim();if(!trimmed)return DEFAULT_GEMINI_EMBEDDING_MODEL;let withoutPrefix=trimmed.replace(/^models\//,``);return withoutPrefix.startsWith(`gemini/`)||withoutPrefix.startsWith(`google/`)?withoutPrefix.slice(7):withoutPrefix}function normalizeGeminiBaseUrl(raw){let trimmed=normalizeBaseUrl(raw),openAiIndex=trimmed.indexOf(`/openai`);return openAiIndex>-1?trimmed.slice(0,openAiIndex):trimmed}function buildGeminiModelPath(model){return model.startsWith(`models/`)?model:`models/${model}`}async function createGeminiEmbeddingProvider(options){let client=await resolveGeminiEmbeddingClient(options),baseUrl=client.baseUrl.replace(/\/$/,``),embedUrl=`${baseUrl}/${client.modelPath}:embedContent`,batchUrl=`${baseUrl}/${client.modelPath}:batchEmbedContents`,fetchWithGeminiAuth=async(apiKey,endpoint,body)=>{let headers={...parseGeminiAuth(apiKey).headers,...client.headers},res=await fetch(endpoint,{method:`POST`,headers,body:JSON.stringify(body)});if(!res.ok){let payload=await res.text();throw Error(`gemini embeddings failed: ${res.status} ${payload}`)}return await res.json()};return{provider:{id:`gemini`,model:client.model,maxInputTokens:GEMINI_MAX_INPUT_TOKENS[client.model],embedQuery:async text=>text.trim()?(await executeWithApiKeyRotation({provider:`google`,apiKeys:client.apiKeys,execute:apiKey=>fetchWithGeminiAuth(apiKey,embedUrl,{content:{parts:[{text}]},taskType:`RETRIEVAL_QUERY`})})).embedding?.values??[]:[],embedBatch:async texts=>{if(texts.length===0)return[];let requests=texts.map(text=>({model:client.modelPath,content:{parts:[{text}]},taskType:`RETRIEVAL_DOCUMENT`})),payload=await executeWithApiKeyRotation({provider:`google`,apiKeys:client.apiKeys,execute:apiKey=>fetchWithGeminiAuth(apiKey,batchUrl,{requests})}),embeddings=Array.isArray(payload.embeddings)?payload.embeddings:[];return texts.map((_,index)=>embeddings[index]?.values??[])}},client}}async function resolveGeminiEmbeddingClient(options){let remote=options.remote,remoteApiKey=resolveRemoteApiKey(remote?.apiKey),remoteBaseUrl=remote?.baseUrl?.trim(),apiKey=remoteApiKey||requireApiKey(await resolveApiKeyForProvider({provider:`google`,cfg:options.config,agentDir:options.agentDir}),`google`),providerConfig=options.config.models?.providers?.google,rawBaseUrl=remoteBaseUrl||providerConfig?.baseUrl?.trim()||`https://generativelanguage.googleapis.com/v1beta`,baseUrl=normalizeGeminiBaseUrl(rawBaseUrl),headers={...Object.assign({},providerConfig?.headers,remote?.headers)},apiKeys=collectProviderApiKeysForExecution({provider:`google`,primaryApiKey:apiKey}),model=normalizeGeminiModel(options.model),modelPath=buildGeminiModelPath(model);return debugEmbeddingsLog(`memory embeddings: gemini client`,{rawBaseUrl,baseUrl,model,modelPath,embedEndpoint:`${baseUrl}/${modelPath}:embedContent`,batchEndpoint:`${baseUrl}/${modelPath}:batchEmbedContents`}),{baseUrl,headers,model,modelPath,apiKeys}}async function resolveRemoteEmbeddingBearerClient(params){let remote=params.options.remote,remoteApiKey=remote?.apiKey?.trim(),remoteBaseUrl=remote?.baseUrl?.trim(),providerConfig=params.options.config.models?.providers?.[params.provider],apiKey=remoteApiKey||requireApiKey(await resolveApiKeyForProvider({provider:params.provider,cfg:params.options.config,agentDir:params.options.agentDir}),params.provider),baseUrl=remoteBaseUrl||providerConfig?.baseUrl?.trim()||params.defaultBaseUrl,headerOverrides=Object.assign({},providerConfig?.headers,remote?.headers);return{baseUrl,headers:{"Content-Type":`application/json`,Authorization:`Bearer ${apiKey}`,...headerOverrides}}}async function fetchRemoteEmbeddingVectors(params){let res=await fetch(params.url,{method:`POST`,headers:params.headers,body:JSON.stringify(params.body)});if(!res.ok){let text=await res.text();throw Error(`${params.errorPrefix}: ${res.status} ${text}`)}return((await res.json()).data??[]).map(entry=>entry.embedding??[])}const DEFAULT_OPENAI_EMBEDDING_MODEL=`text-embedding-3-small`,OPENAI_MAX_INPUT_TOKENS={"text-embedding-3-small":8192,"text-embedding-3-large":8192,"text-embedding-ada-002":8191};function normalizeOpenAiModel(model){let trimmed=model.trim();return trimmed?trimmed.startsWith(`openai/`)?trimmed.slice(7):trimmed:DEFAULT_OPENAI_EMBEDDING_MODEL}async function createOpenAiEmbeddingProvider(options){let client=await resolveOpenAiEmbeddingClient(options),url=`${client.baseUrl.replace(/\/$/,``)}/embeddings`,embed=async input=>input.length===0?[]:await fetchRemoteEmbeddingVectors({url,headers:client.headers,body:{model:client.model,input},errorPrefix:`openai embeddings failed`});return{provider:{id:`openai`,model:client.model,maxInputTokens:OPENAI_MAX_INPUT_TOKENS[client.model],embedQuery:async text=>{let[vec]=await embed([text]);return vec??[]},embedBatch:embed},client}}async function resolveOpenAiEmbeddingClient(options){let{baseUrl,headers}=await resolveRemoteEmbeddingBearerClient({provider:`openai`,options,defaultBaseUrl:`https://api.openai.com/v1`});return{baseUrl,headers,model:normalizeOpenAiModel(options.model)}}const DEFAULT_VOYAGE_EMBEDDING_MODEL=`voyage-4-large`,VOYAGE_MAX_INPUT_TOKENS={"voyage-3":32e3,"voyage-3-lite":16e3,"voyage-code-3":32e3};function normalizeVoyageModel(model){let trimmed=model.trim();return trimmed?trimmed.startsWith(`voyage/`)?trimmed.slice(7):trimmed:DEFAULT_VOYAGE_EMBEDDING_MODEL}async function createVoyageEmbeddingProvider(options){let client=await resolveVoyageEmbeddingClient(options),url=`${client.baseUrl.replace(/\/$/,``)}/embeddings`,embed=async(input,input_type)=>{if(input.length===0)return[];let body={model:client.model,input};return input_type&&(body.input_type=input_type),await fetchRemoteEmbeddingVectors({url,headers:client.headers,body,errorPrefix:`voyage embeddings failed`})};return{provider:{id:`voyage`,model:client.model,maxInputTokens:VOYAGE_MAX_INPUT_TOKENS[client.model],embedQuery:async text=>{let[vec]=await embed([text],`query`);return vec??[]},embedBatch:async texts=>embed(texts,`document`)},client}}async function resolveVoyageEmbeddingClient(options){let{baseUrl,headers}=await resolveRemoteEmbeddingBearerClient({provider:`voyage`,options,defaultBaseUrl:`https://api.voyageai.com/v1`});return{baseUrl,headers,model:normalizeVoyageModel(options.model)}}async function importNodeLlamaCpp(){return import(`node-llama-cpp`)}function sanitizeAndNormalizeEmbedding(vec){let sanitized=vec.map(value=>Number.isFinite(value)?value:0),magnitude=Math.sqrt(sanitized.reduce((sum,value)=>sum+value*value,0));return magnitude<1e-10?sanitized:sanitized.map(value=>value/magnitude)}const REMOTE_EMBEDDING_PROVIDER_IDS=[`openai`,`gemini`,`voyage`];function canAutoSelectLocal(options){let modelPath=options.local?.modelPath?.trim();if(!modelPath||/^(hf:|https?:)/i.test(modelPath))return!1;let resolved=resolveUserPath(modelPath);try{return fs.statSync(resolved).isFile()}catch{return!1}}function isMissingApiKeyError(err){return formatErrorMessage(err).includes(`No API key found for provider`)}async function createLocalEmbeddingProvider(options){let modelPath=options.local?.modelPath?.trim()||`hf:ggml-org/embeddinggemma-300m-qat-q8_0-GGUF/embeddinggemma-300m-qat-Q8_0.gguf`,modelCacheDir=options.local?.modelCacheDir?.trim(),{getLlama,resolveModelFile,LlamaLogLevel}=await importNodeLlamaCpp(),llama=null,embeddingModel=null,embeddingContext=null,ensureContext=async()=>{if(llama||=await getLlama({logLevel:LlamaLogLevel.error}),!embeddingModel){let resolved=await resolveModelFile(modelPath,modelCacheDir||void 0);embeddingModel=await llama.loadModel({modelPath:resolved})}return embeddingContext||=await embeddingModel.createEmbeddingContext(),embeddingContext};return{id:`local`,model:modelPath,embedQuery:async text=>{let embedding=await(await ensureContext()).getEmbeddingFor(text);return sanitizeAndNormalizeEmbedding(Array.from(embedding.vector))},embedBatch:async texts=>{let ctx=await ensureContext();return await Promise.all(texts.map(async text=>{let embedding=await ctx.getEmbeddingFor(text);return sanitizeAndNormalizeEmbedding(Array.from(embedding.vector))}))}}}async function createEmbeddingProvider(options){let requestedProvider=options.provider,fallback=options.fallback,createProvider=async id=>{if(id===`local`)return{provider:await createLocalEmbeddingProvider(options)};if(id===`gemini`){let{provider,client}=await createGeminiEmbeddingProvider(options);return{provider,gemini:client}}if(id===`voyage`){let{provider,client}=await createVoyageEmbeddingProvider(options);return{provider,voyage:client}}let{provider,client}=await createOpenAiEmbeddingProvider(options);return{provider,openAi:client}},formatPrimaryError=(err,provider)=>provider===`local`?formatLocalSetupError(err):formatErrorMessage(err);if(requestedProvider===`auto`){let missingKeyErrors=[],localError=null;if(canAutoSelectLocal(options))try{return{...await createProvider(`local`),requestedProvider}}catch(err){localError=formatLocalSetupError(err)}for(let provider of REMOTE_EMBEDDING_PROVIDER_IDS)try{return{...await createProvider(provider),requestedProvider}}catch(err){let message=formatPrimaryError(err,provider);if(isMissingApiKeyError(err)){missingKeyErrors.push(message);continue}throw Error(message,{cause:err})}let details=[...missingKeyErrors,localError].filter(Boolean);return{provider:null,requestedProvider,providerUnavailableReason:details.length>0?details.join(`
|
|
1
|
+
import{t as __exportAll}from"./rolldown-runtime-BlRA8w72.js";import{F as sleep,R as truncateUtf16Safe,j as resolveUserPath,v as clampInt,y as clampNumber$1}from"./registry-DJq2Cvo9.js";import{s as resolveStateDir}from"./paths-Cb8zTlyG.js";import{X as resolveApiKeyForProvider,Y as requireApiKey,mt as normalizeBaseUrl}from"./model-selection-K82MAGlL.js";import{t as createSubsystemLogger}from"./subsystem-COTa5Ly_.js";import{n as resolveAgentConfig,r as resolveAgentDir,s as resolveAgentWorkspaceDir}from"./agent-scope-BQByW0cD.js";import{n as formatErrorMessage}from"./errors-L3rugjUL.js";import{r as isTruthyEnvValue}from"./command-format-CAX9XFjI.js";import{o as resolveSessionTranscriptsDirForAgent}from"./paths-DtbnCdO7.js";import{a as onSessionTranscriptUpdate,n as executeWithApiKeyRotation,r as parseGeminiAuth,t as collectProviderApiKeysForExecution}from"./api-key-rotation-7YdImWrh.js";import{_ as runWithConcurrency,a as buildFileEntry,d as hashText,f as isMemoryPath,g as remapChunkLines,h as parseEmbedding,i as sessionPathForFile,m as normalizeExtraMemoryPaths,n as buildSessionEntry,o as chunkMarkdown,p as listMemoryFiles,r as listSessionFilesForAgent,s as ensureDir,t as requireNodeSqlite,u as getDefaultMemoryWatchPatterns}from"./sqlite-BlMLqMl8.js";import path from"node:path";import fs from"node:fs";import os from"node:os";import{randomUUID}from"node:crypto";import fs$1 from"node:fs/promises";import{Readable}from"node:stream";import{createInterface}from"node:readline";import chokidar from"chokidar";const DEFAULT_RETRY_CONFIG={attempts:3,minDelayMs:300,maxDelayMs:3e4,jitter:0},asFiniteNumber=value=>typeof value==`number`&&Number.isFinite(value)?value:void 0,clampNumber=(value,fallback,min,max)=>{let next=asFiniteNumber(value);if(next===void 0)return fallback;let floor=typeof min==`number`?min:-1/0,ceiling=typeof max==`number`?max:1/0;return Math.min(Math.max(next,floor),ceiling)};function resolveRetryConfig(defaults=DEFAULT_RETRY_CONFIG,overrides){let attempts=Math.max(1,Math.round(clampNumber(overrides?.attempts,defaults.attempts,1))),minDelayMs=Math.max(0,Math.round(clampNumber(overrides?.minDelayMs,defaults.minDelayMs,0)));return{attempts,minDelayMs,maxDelayMs:Math.max(minDelayMs,Math.round(clampNumber(overrides?.maxDelayMs,defaults.maxDelayMs,0))),jitter:clampNumber(overrides?.jitter,defaults.jitter,0,1)}}function applyJitter(delayMs,jitter){if(jitter<=0)return delayMs;let offset=(Math.random()*2-1)*jitter;return Math.max(0,Math.round(delayMs*(1+offset)))}async function retryAsync(fn,attemptsOrOptions=3,initialDelayMs=300){if(typeof attemptsOrOptions==`number`){let attempts=Math.max(1,Math.round(attemptsOrOptions)),lastErr;for(let i=0;i<attempts;i+=1)try{return await fn()}catch(err){if(lastErr=err,i===attempts-1)break;await sleep(initialDelayMs*2**i)}throw lastErr??Error(`Retry failed`)}let options=attemptsOrOptions,resolved=resolveRetryConfig(DEFAULT_RETRY_CONFIG,options),maxAttempts=resolved.attempts,minDelayMs=resolved.minDelayMs,maxDelayMs=Number.isFinite(resolved.maxDelayMs)&&resolved.maxDelayMs>0?resolved.maxDelayMs:1/0,jitter=resolved.jitter,shouldRetry=options.shouldRetry??(()=>!0),lastErr;for(let attempt=1;attempt<=maxAttempts;attempt+=1)try{return await fn()}catch(err){if(lastErr=err,attempt>=maxAttempts||!shouldRetry(err,attempt))break;let retryAfterMs=options.retryAfterMs?.(err),baseDelay=typeof retryAfterMs==`number`&&Number.isFinite(retryAfterMs)?Math.max(retryAfterMs,minDelayMs):minDelayMs*2**(attempt-1),delay=Math.min(baseDelay,maxDelayMs);delay=applyJitter(delay,jitter),delay=Math.min(Math.max(delay,minDelayMs),maxDelayMs),options.onRetry?.({attempt,maxAttempts,delayMs:delay,err,label:options.label}),await sleep(delay)}throw lastErr??Error(`Retry failed`)}function tokenize$1(text){return text.toLowerCase().split(/[\s\W]+/).filter(Boolean)}function jaccardSimilarity(a,b){if(a.size===0&&b.size===0)return 1;let intersection=0;for(let token of a)b.has(token)&&intersection++;let union=a.size+b.size-intersection;return intersection/union}function cosineSimilarity(a,b){let n=Math.min(a.length,b.length),dot=0,na=0,nb=0;for(let i=0;i<n;i++)dot+=a[i]*b[i],na+=a[i]*a[i],nb+=b[i]*b[i];let denom=Math.sqrt(na)*Math.sqrt(nb);return denom===0?0:dot/denom}function mmrSelect(items,opts){let lambda=opts.lambda??.7,limit=Math.min(opts.topK??items.length,items.length),remaining=[...items],relevance=new Map;for(let item of remaining)relevance.set(item,opts.relevance(item));let selected=[];for(;selected.length<limit&&remaining.length>0;){let bestIdx=-1,bestScore=-1/0;for(let i=0;i<remaining.length;i++){let candidate=remaining[i],maxSimToSelected=0;for(let s of selected){let sim=opts.similarity(candidate,s);sim>maxSimToSelected&&(maxSimToSelected=sim)}let score=lambda*relevance.get(candidate)-(1-lambda)*maxSimToSelected;(score>bestScore||score===bestScore&&bestIdx>=0&&opts.tieScore!==void 0&&opts.tieScore(candidate)>opts.tieScore(remaining[bestIdx]))&&(bestScore=score,bestIdx=i)}if(bestIdx<0)break;selected.push(remaining.splice(bestIdx,1)[0])}return selected}function textMaximalMarginalRelevance(items,lambda=.7){if(items.length<=1)return[...items];let l=Math.max(0,Math.min(1,lambda));if(l===1)return[...items].sort((a,b)=>b.score-a.score);let tokens=new Map;for(let item of items)tokens.set(item.id,new Set(tokenize$1(item.content)));let tokensOf=item=>tokens.get(item.id)??new Set(tokenize$1(item.content)),scores=items.map(i=>i.score),min=Math.min(...scores),range=Math.max(...scores)-min;return mmrSelect(items,{relevance:item=>range===0?1:(item.score-min)/range,similarity:(a,b)=>jaccardSimilarity(tokensOf(a),tokensOf(b)),lambda:l,tieScore:item=>item.score})}const DEFAULT_HYBRID_VECTOR_WEIGHT$1=.7,DEFAULT_HYBRID_TEXT_WEIGHT$1=.3;function normalizeHybridWeights(vectorWeight,textWeight){let clamp=(n,fallback)=>typeof n==`number`&&Number.isFinite(n)?Math.max(0,n):fallback,v=clamp(vectorWeight,DEFAULT_HYBRID_VECTOR_WEIGHT$1),t=clamp(textWeight,DEFAULT_HYBRID_TEXT_WEIGHT$1),sum=v+t;return sum<=0?{vectorWeight:DEFAULT_HYBRID_VECTOR_WEIGHT$1,textWeight:DEFAULT_HYBRID_TEXT_WEIGHT$1}:{vectorWeight:v/sum,textWeight:t/sum}}function hybridScore(scores,weights){let v=Number.isFinite(scores.vectorScore)?scores.vectorScore:0,t=Number.isFinite(scores.textScore)?scores.textScore:0;return weights.vectorWeight*v+weights.textWeight*t}function bm25RankToScore$1(rank){return 1/(1+(Number.isFinite(rank)?Math.max(0,rank):999))}function toDecayLambda(halfLifeDays){return!Number.isFinite(halfLifeDays)||halfLifeDays<=0?0:Math.LN2/halfLifeDays}function calculateTemporalDecayMultiplier(params){let lambda=toDecayLambda(params.halfLifeDays),clampedAge=Math.max(0,params.ageInDays);return lambda<=0||!Number.isFinite(clampedAge)?1:Math.exp(-lambda*clampedAge)}function applyTemporalDecayToScore(params){return params.score*calculateTemporalDecayMultiplier(params)}const DEFAULT_MMR_LAMBDA=.7,DEFAULT_SOURCES=[`memory`];function normalizeSources(sources,sessionMemoryEnabled){let normalized=new Set,input=sources?.length?sources:DEFAULT_SOURCES;for(let source of input)source===`memory`&&normalized.add(`memory`),source===`sessions`&&sessionMemoryEnabled&&normalized.add(`sessions`);return normalized.size===0&&normalized.add(`memory`),Array.from(normalized)}function resolveStorePath(agentId,raw){let stateDir=resolveStateDir(process.env,os.homedir),fallback=path.join(stateDir,`memory`,`${agentId}.sqlite`);return raw?resolveUserPath(raw.includes(`{agentId}`)?raw.replaceAll(`{agentId}`,agentId):raw):fallback}function mergeConfig(defaults,overrides,agentId){let enabled=overrides?.enabled??defaults?.enabled??!0,sessionMemory=overrides?.experimental?.sessionMemory??defaults?.experimental?.sessionMemory??!1,provider=overrides?.provider??defaults?.provider??`auto`,defaultRemote=defaults?.remote,overrideRemote=overrides?.remote,includeRemote=!!(overrideRemote?.baseUrl||overrideRemote?.apiKey||overrideRemote?.headers||defaultRemote?.baseUrl||defaultRemote?.apiKey||defaultRemote?.headers)||provider===`openai`||provider===`gemini`||provider===`voyage`||provider===`auto`,batch={enabled:overrideRemote?.batch?.enabled??defaultRemote?.batch?.enabled??!1,wait:overrideRemote?.batch?.wait??defaultRemote?.batch?.wait??!0,concurrency:Math.max(1,overrideRemote?.batch?.concurrency??defaultRemote?.batch?.concurrency??2),pollIntervalMs:overrideRemote?.batch?.pollIntervalMs??defaultRemote?.batch?.pollIntervalMs??2e3,timeoutMinutes:overrideRemote?.batch?.timeoutMinutes??defaultRemote?.batch?.timeoutMinutes??60},remote=includeRemote?{baseUrl:overrideRemote?.baseUrl??defaultRemote?.baseUrl,apiKey:overrideRemote?.apiKey??defaultRemote?.apiKey,headers:overrideRemote?.headers??defaultRemote?.headers,batch}:void 0,fallback=overrides?.fallback??defaults?.fallback??`none`,modelDefault=provider===`gemini`?`gemini-embedding-001`:provider===`openai`?`text-embedding-3-small`:provider===`voyage`?`voyage-4-large`:void 0,model=overrides?.model??defaults?.model??modelDefault??``,local={modelPath:overrides?.local?.modelPath??defaults?.local?.modelPath,modelCacheDir:overrides?.local?.modelCacheDir??defaults?.local?.modelCacheDir},sources=normalizeSources(overrides?.sources??defaults?.sources,sessionMemory),rawPaths=[...defaults?.extraPaths??[],...overrides?.extraPaths??[]].map(value=>value.trim()).filter(Boolean),extraPaths=Array.from(new Set(rawPaths)),vector={enabled:overrides?.store?.vector?.enabled??defaults?.store?.vector?.enabled??!0,extensionPath:overrides?.store?.vector?.extensionPath??defaults?.store?.vector?.extensionPath},store={driver:overrides?.store?.driver??defaults?.store?.driver??`sqlite`,path:resolveStorePath(agentId,overrides?.store?.path??defaults?.store?.path),vector},chunking={tokens:overrides?.chunking?.tokens??defaults?.chunking?.tokens??400,overlap:overrides?.chunking?.overlap??defaults?.chunking?.overlap??80},sync={onSessionStart:overrides?.sync?.onSessionStart??defaults?.sync?.onSessionStart??!0,onSearch:overrides?.sync?.onSearch??defaults?.sync?.onSearch??!0,watch:overrides?.sync?.watch??defaults?.sync?.watch??!0,watchDebounceMs:overrides?.sync?.watchDebounceMs??defaults?.sync?.watchDebounceMs??1500,intervalMinutes:overrides?.sync?.intervalMinutes??defaults?.sync?.intervalMinutes??0,sessions:{deltaBytes:overrides?.sync?.sessions?.deltaBytes??defaults?.sync?.sessions?.deltaBytes??1e5,deltaMessages:overrides?.sync?.sessions?.deltaMessages??defaults?.sync?.sessions?.deltaMessages??50}},query={maxResults:overrides?.query?.maxResults??defaults?.query?.maxResults??6,minScore:overrides?.query?.minScore??defaults?.query?.minScore??.35},hybrid={enabled:overrides?.query?.hybrid?.enabled??defaults?.query?.hybrid?.enabled??!0,vectorWeight:overrides?.query?.hybrid?.vectorWeight??defaults?.query?.hybrid?.vectorWeight??.7,textWeight:overrides?.query?.hybrid?.textWeight??defaults?.query?.hybrid?.textWeight??.3,candidateMultiplier:overrides?.query?.hybrid?.candidateMultiplier??defaults?.query?.hybrid?.candidateMultiplier??4,mmr:{enabled:overrides?.query?.hybrid?.mmr?.enabled??defaults?.query?.hybrid?.mmr?.enabled??!1,lambda:overrides?.query?.hybrid?.mmr?.lambda??defaults?.query?.hybrid?.mmr?.lambda??DEFAULT_MMR_LAMBDA},temporalDecay:{enabled:overrides?.query?.hybrid?.temporalDecay?.enabled??defaults?.query?.hybrid?.temporalDecay?.enabled??!1,halfLifeDays:overrides?.query?.hybrid?.temporalDecay?.halfLifeDays??defaults?.query?.hybrid?.temporalDecay?.halfLifeDays??30}},cache={enabled:overrides?.cache?.enabled??defaults?.cache?.enabled??!0,maxEntries:overrides?.cache?.maxEntries??defaults?.cache?.maxEntries},overlap=clampNumber$1(chunking.overlap,0,Math.max(0,chunking.tokens-1)),minScore=clampNumber$1(query.minScore,0,1),{vectorWeight:normalizedVectorWeight,textWeight:normalizedTextWeight}=normalizeHybridWeights(hybrid.vectorWeight,hybrid.textWeight),candidateMultiplier=clampInt(hybrid.candidateMultiplier,1,20),temporalDecayHalfLifeDays=Math.max(1,Math.floor(Number.isFinite(hybrid.temporalDecay.halfLifeDays)?hybrid.temporalDecay.halfLifeDays:30)),deltaBytes=clampInt(sync.sessions.deltaBytes,0,2**53-1),deltaMessages=clampInt(sync.sessions.deltaMessages,0,2**53-1);return{enabled,sources,extraPaths,provider,remote,experimental:{sessionMemory},fallback,model,local,store,chunking:{tokens:Math.max(1,chunking.tokens),overlap},sync:{...sync,sessions:{deltaBytes,deltaMessages}},query:{...query,minScore,hybrid:{enabled:!!hybrid.enabled,vectorWeight:normalizedVectorWeight,textWeight:normalizedTextWeight,candidateMultiplier,mmr:{enabled:!!hybrid.mmr.enabled,lambda:Number.isFinite(hybrid.mmr.lambda)?Math.max(0,Math.min(1,hybrid.mmr.lambda)):DEFAULT_MMR_LAMBDA},temporalDecay:{enabled:!!hybrid.temporalDecay.enabled,halfLifeDays:temporalDecayHalfLifeDays}}},cache:{enabled:!!cache.enabled,maxEntries:typeof cache.maxEntries==`number`&&Number.isFinite(cache.maxEntries)?Math.max(1,Math.floor(cache.maxEntries)):void 0}}}function resolveMemorySearchConfig(cfg,agentId){let defaults=cfg.agents?.defaults?.memorySearch,overrides=resolveAgentConfig(cfg,agentId)?.memorySearch,resolved=mergeConfig(defaults,overrides,agentId);return resolved.enabled?resolved:null}const debugEmbeddings=isTruthyEnvValue(process.env.BUILDERFORCE_AGENTS_DEBUG_MEMORY_EMBEDDINGS),log$3=createSubsystemLogger(`memory/embeddings`);function debugEmbeddingsLog(message,meta){if(!debugEmbeddings)return;let suffix=meta?` ${JSON.stringify(meta)}`:``;log$3.raw(`${message}${suffix}`)}const DEFAULT_GEMINI_EMBEDDING_MODEL=`gemini-embedding-001`,GEMINI_MAX_INPUT_TOKENS={"text-embedding-004":2048};function resolveRemoteApiKey(remoteApiKey){let trimmed=remoteApiKey?.trim();if(trimmed)return trimmed===`GOOGLE_API_KEY`||trimmed===`GEMINI_API_KEY`?process.env[trimmed]?.trim():trimmed}function normalizeGeminiModel(model){let trimmed=model.trim();if(!trimmed)return DEFAULT_GEMINI_EMBEDDING_MODEL;let withoutPrefix=trimmed.replace(/^models\//,``);return withoutPrefix.startsWith(`gemini/`)||withoutPrefix.startsWith(`google/`)?withoutPrefix.slice(7):withoutPrefix}function normalizeGeminiBaseUrl(raw){let trimmed=normalizeBaseUrl(raw),openAiIndex=trimmed.indexOf(`/openai`);return openAiIndex>-1?trimmed.slice(0,openAiIndex):trimmed}function buildGeminiModelPath(model){return model.startsWith(`models/`)?model:`models/${model}`}async function createGeminiEmbeddingProvider(options){let client=await resolveGeminiEmbeddingClient(options),baseUrl=client.baseUrl.replace(/\/$/,``),embedUrl=`${baseUrl}/${client.modelPath}:embedContent`,batchUrl=`${baseUrl}/${client.modelPath}:batchEmbedContents`,fetchWithGeminiAuth=async(apiKey,endpoint,body)=>{let headers={...parseGeminiAuth(apiKey).headers,...client.headers},res=await fetch(endpoint,{method:`POST`,headers,body:JSON.stringify(body)});if(!res.ok){let payload=await res.text();throw Error(`gemini embeddings failed: ${res.status} ${payload}`)}return await res.json()};return{provider:{id:`gemini`,model:client.model,maxInputTokens:GEMINI_MAX_INPUT_TOKENS[client.model],embedQuery:async text=>text.trim()?(await executeWithApiKeyRotation({provider:`google`,apiKeys:client.apiKeys,execute:apiKey=>fetchWithGeminiAuth(apiKey,embedUrl,{content:{parts:[{text}]},taskType:`RETRIEVAL_QUERY`})})).embedding?.values??[]:[],embedBatch:async texts=>{if(texts.length===0)return[];let requests=texts.map(text=>({model:client.modelPath,content:{parts:[{text}]},taskType:`RETRIEVAL_DOCUMENT`})),payload=await executeWithApiKeyRotation({provider:`google`,apiKeys:client.apiKeys,execute:apiKey=>fetchWithGeminiAuth(apiKey,batchUrl,{requests})}),embeddings=Array.isArray(payload.embeddings)?payload.embeddings:[];return texts.map((_,index)=>embeddings[index]?.values??[])}},client}}async function resolveGeminiEmbeddingClient(options){let remote=options.remote,remoteApiKey=resolveRemoteApiKey(remote?.apiKey),remoteBaseUrl=remote?.baseUrl?.trim(),apiKey=remoteApiKey||requireApiKey(await resolveApiKeyForProvider({provider:`google`,cfg:options.config,agentDir:options.agentDir}),`google`),providerConfig=options.config.models?.providers?.google,rawBaseUrl=remoteBaseUrl||providerConfig?.baseUrl?.trim()||`https://generativelanguage.googleapis.com/v1beta`,baseUrl=normalizeGeminiBaseUrl(rawBaseUrl),headers={...Object.assign({},providerConfig?.headers,remote?.headers)},apiKeys=collectProviderApiKeysForExecution({provider:`google`,primaryApiKey:apiKey}),model=normalizeGeminiModel(options.model),modelPath=buildGeminiModelPath(model);return debugEmbeddingsLog(`memory embeddings: gemini client`,{rawBaseUrl,baseUrl,model,modelPath,embedEndpoint:`${baseUrl}/${modelPath}:embedContent`,batchEndpoint:`${baseUrl}/${modelPath}:batchEmbedContents`}),{baseUrl,headers,model,modelPath,apiKeys}}async function resolveRemoteEmbeddingBearerClient(params){let remote=params.options.remote,remoteApiKey=remote?.apiKey?.trim(),remoteBaseUrl=remote?.baseUrl?.trim(),providerConfig=params.options.config.models?.providers?.[params.provider],apiKey=remoteApiKey||requireApiKey(await resolveApiKeyForProvider({provider:params.provider,cfg:params.options.config,agentDir:params.options.agentDir}),params.provider),baseUrl=remoteBaseUrl||providerConfig?.baseUrl?.trim()||params.defaultBaseUrl,headerOverrides=Object.assign({},providerConfig?.headers,remote?.headers);return{baseUrl,headers:{"Content-Type":`application/json`,Authorization:`Bearer ${apiKey}`,...headerOverrides}}}async function fetchRemoteEmbeddingVectors(params){let res=await fetch(params.url,{method:`POST`,headers:params.headers,body:JSON.stringify(params.body)});if(!res.ok){let text=await res.text();throw Error(`${params.errorPrefix}: ${res.status} ${text}`)}return((await res.json()).data??[]).map(entry=>entry.embedding??[])}const DEFAULT_OPENAI_EMBEDDING_MODEL=`text-embedding-3-small`,OPENAI_MAX_INPUT_TOKENS={"text-embedding-3-small":8192,"text-embedding-3-large":8192,"text-embedding-ada-002":8191};function normalizeOpenAiModel(model){let trimmed=model.trim();return trimmed?trimmed.startsWith(`openai/`)?trimmed.slice(7):trimmed:DEFAULT_OPENAI_EMBEDDING_MODEL}async function createOpenAiEmbeddingProvider(options){let client=await resolveOpenAiEmbeddingClient(options),url=`${client.baseUrl.replace(/\/$/,``)}/embeddings`,embed=async input=>input.length===0?[]:await fetchRemoteEmbeddingVectors({url,headers:client.headers,body:{model:client.model,input},errorPrefix:`openai embeddings failed`});return{provider:{id:`openai`,model:client.model,maxInputTokens:OPENAI_MAX_INPUT_TOKENS[client.model],embedQuery:async text=>{let[vec]=await embed([text]);return vec??[]},embedBatch:embed},client}}async function resolveOpenAiEmbeddingClient(options){let{baseUrl,headers}=await resolveRemoteEmbeddingBearerClient({provider:`openai`,options,defaultBaseUrl:`https://api.openai.com/v1`});return{baseUrl,headers,model:normalizeOpenAiModel(options.model)}}const DEFAULT_VOYAGE_EMBEDDING_MODEL=`voyage-4-large`,VOYAGE_MAX_INPUT_TOKENS={"voyage-3":32e3,"voyage-3-lite":16e3,"voyage-code-3":32e3};function normalizeVoyageModel(model){let trimmed=model.trim();return trimmed?trimmed.startsWith(`voyage/`)?trimmed.slice(7):trimmed:DEFAULT_VOYAGE_EMBEDDING_MODEL}async function createVoyageEmbeddingProvider(options){let client=await resolveVoyageEmbeddingClient(options),url=`${client.baseUrl.replace(/\/$/,``)}/embeddings`,embed=async(input,input_type)=>{if(input.length===0)return[];let body={model:client.model,input};return input_type&&(body.input_type=input_type),await fetchRemoteEmbeddingVectors({url,headers:client.headers,body,errorPrefix:`voyage embeddings failed`})};return{provider:{id:`voyage`,model:client.model,maxInputTokens:VOYAGE_MAX_INPUT_TOKENS[client.model],embedQuery:async text=>{let[vec]=await embed([text],`query`);return vec??[]},embedBatch:async texts=>embed(texts,`document`)},client}}async function resolveVoyageEmbeddingClient(options){let{baseUrl,headers}=await resolveRemoteEmbeddingBearerClient({provider:`voyage`,options,defaultBaseUrl:`https://api.voyageai.com/v1`});return{baseUrl,headers,model:normalizeVoyageModel(options.model)}}async function importNodeLlamaCpp(){return import(`node-llama-cpp`)}function sanitizeAndNormalizeEmbedding(vec){let sanitized=vec.map(value=>Number.isFinite(value)?value:0),magnitude=Math.sqrt(sanitized.reduce((sum,value)=>sum+value*value,0));return magnitude<1e-10?sanitized:sanitized.map(value=>value/magnitude)}const REMOTE_EMBEDDING_PROVIDER_IDS=[`openai`,`gemini`,`voyage`];function canAutoSelectLocal(options){let modelPath=options.local?.modelPath?.trim();if(!modelPath||/^(hf:|https?:)/i.test(modelPath))return!1;let resolved=resolveUserPath(modelPath);try{return fs.statSync(resolved).isFile()}catch{return!1}}function isMissingApiKeyError(err){return formatErrorMessage(err).includes(`No API key found for provider`)}async function createLocalEmbeddingProvider(options){let modelPath=options.local?.modelPath?.trim()||`hf:ggml-org/embeddinggemma-300m-qat-q8_0-GGUF/embeddinggemma-300m-qat-Q8_0.gguf`,modelCacheDir=options.local?.modelCacheDir?.trim(),{getLlama,resolveModelFile,LlamaLogLevel}=await importNodeLlamaCpp(),llama=null,embeddingModel=null,embeddingContext=null,ensureContext=async()=>{if(llama||=await getLlama({logLevel:LlamaLogLevel.error}),!embeddingModel){let resolved=await resolveModelFile(modelPath,modelCacheDir||void 0);embeddingModel=await llama.loadModel({modelPath:resolved})}return embeddingContext||=await embeddingModel.createEmbeddingContext(),embeddingContext};return{id:`local`,model:modelPath,embedQuery:async text=>{let embedding=await(await ensureContext()).getEmbeddingFor(text);return sanitizeAndNormalizeEmbedding(Array.from(embedding.vector))},embedBatch:async texts=>{let ctx=await ensureContext();return await Promise.all(texts.map(async text=>{let embedding=await ctx.getEmbeddingFor(text);return sanitizeAndNormalizeEmbedding(Array.from(embedding.vector))}))}}}async function createEmbeddingProvider(options){let requestedProvider=options.provider,fallback=options.fallback,createProvider=async id=>{if(id===`local`)return{provider:await createLocalEmbeddingProvider(options)};if(id===`gemini`){let{provider,client}=await createGeminiEmbeddingProvider(options);return{provider,gemini:client}}if(id===`voyage`){let{provider,client}=await createVoyageEmbeddingProvider(options);return{provider,voyage:client}}let{provider,client}=await createOpenAiEmbeddingProvider(options);return{provider,openAi:client}},formatPrimaryError=(err,provider)=>provider===`local`?formatLocalSetupError(err):formatErrorMessage(err);if(requestedProvider===`auto`){let missingKeyErrors=[],localError=null;if(canAutoSelectLocal(options))try{return{...await createProvider(`local`),requestedProvider}}catch(err){localError=formatLocalSetupError(err)}for(let provider of REMOTE_EMBEDDING_PROVIDER_IDS)try{return{...await createProvider(provider),requestedProvider}}catch(err){let message=formatPrimaryError(err,provider);if(isMissingApiKeyError(err)){missingKeyErrors.push(message);continue}throw Error(message,{cause:err})}let details=[...missingKeyErrors,localError].filter(Boolean);return{provider:null,requestedProvider,providerUnavailableReason:details.length>0?details.join(`
|
|
2
2
|
|
|
3
3
|
`):`No embeddings provider available.`}}try{return{...await createProvider(requestedProvider),requestedProvider}}catch(primaryErr){let reason=formatPrimaryError(primaryErr,requestedProvider);if(fallback&&fallback!==`none`&&fallback!==requestedProvider)try{return{...await createProvider(fallback),requestedProvider,fallbackFrom:requestedProvider,fallbackReason:reason}}catch(fallbackErr){let combinedReason=`${reason}\n\nFallback to ${fallback} failed: ${formatErrorMessage(fallbackErr)}`;if(isMissingApiKeyError(primaryErr)&&isMissingApiKeyError(fallbackErr))return{provider:null,requestedProvider,fallbackFrom:requestedProvider,fallbackReason:reason,providerUnavailableReason:combinedReason};throw Error(combinedReason,{cause:fallbackErr})}if(isMissingApiKeyError(primaryErr))return{provider:null,requestedProvider,providerUnavailableReason:reason};throw Error(reason,{cause:primaryErr})}}function isNodeLlamaCppMissing(err){return err instanceof Error&&err.code===`ERR_MODULE_NOT_FOUND`?err.message.includes(`node-llama-cpp`):!1}function formatLocalSetupError(err){let detail=formatErrorMessage(err),missing=isNodeLlamaCppMissing(err);return[`Local embeddings unavailable.`,missing?`Reason: optional dependency node-llama-cpp is missing (or failed to install).`:detail?`Reason: ${detail}`:void 0,missing&&detail?`Detail: ${detail}`:null,`To enable local embeddings:`,`1) Use Node 22 LTS (recommended for installs/updates)`,missing?`2) Reinstall BuilderForceAgents (this should install node-llama-cpp): npm i -g @seanhogg/builderforce-agents@latest`:null,`3) If you use pnpm: pnpm approve-builds (select node-llama-cpp), then pnpm rebuild node-llama-cpp`,...REMOTE_EMBEDDING_PROVIDER_IDS.map(provider=>`Or set agents.defaults.memorySearch.provider = "${provider}" (remote).`)].filter(Boolean).join(`
|
|
4
4
|
`)}const DEFAULT_MMR_CONFIG={enabled:!1,lambda:.7};function mmrRerank(items,config={}){let{enabled=DEFAULT_MMR_CONFIG.enabled,lambda=DEFAULT_MMR_CONFIG.lambda}=config;return!enabled||items.length<=1?[...items]:textMaximalMarginalRelevance(items,lambda)}function applyMMRToHybridResults(results,config={}){if(results.length===0)return results;let itemById=new Map;return mmrRerank(results.map((r,index)=>{let id=`${r.path}:${r.startLine}:${index}`;return itemById.set(id,r),{id,score:r.score,content:r.snippet}}),config).map(item=>itemById.get(item.id))}const DEFAULT_TEMPORAL_DECAY_CONFIG={enabled:!1,halfLifeDays:30},DATED_MEMORY_PATH_RE=/(?:^|\/)memory\/(\d{4})-(\d{2})-(\d{2})\.md$/;function parseMemoryDateFromPath(filePath){let normalized=filePath.replaceAll(`\\`,`/`).replace(/^\.\//,``),match=DATED_MEMORY_PATH_RE.exec(normalized);if(!match)return null;let year=Number(match[1]),month=Number(match[2]),day=Number(match[3]);if(!Number.isInteger(year)||!Number.isInteger(month)||!Number.isInteger(day))return null;let timestamp=Date.UTC(year,month-1,day),parsed=new Date(timestamp);return parsed.getUTCFullYear()!==year||parsed.getUTCMonth()!==month-1||parsed.getUTCDate()!==day?null:parsed}function isEvergreenMemoryPath(filePath){let normalized=filePath.replaceAll(`\\`,`/`).replace(/^\.\//,``);return normalized===`MEMORY.md`||normalized===`memory.md`||normalized===`.builderforce/MEMORY.md`||normalized===`.builderforce/memory.md`?!0:!normalized.startsWith(`memory/`)&&!normalized.startsWith(`.builderforce/memory/`)?!1:!DATED_MEMORY_PATH_RE.test(normalized)}async function extractTimestamp(params){let fromPath=parseMemoryDateFromPath(params.filePath);if(fromPath)return fromPath;if(params.source===`memory`&&isEvergreenMemoryPath(params.filePath)||!params.workspaceDir)return null;let absolutePath=path.isAbsolute(params.filePath)?params.filePath:path.resolve(params.workspaceDir,params.filePath);try{let stat=await fs$1.stat(absolutePath);return Number.isFinite(stat.mtimeMs)?new Date(stat.mtimeMs):null}catch{return null}}function ageInDaysFromTimestamp(timestamp,nowMs){return Math.max(0,nowMs-timestamp.getTime())/864e5}async function applyTemporalDecayToHybridResults(params){let config={...DEFAULT_TEMPORAL_DECAY_CONFIG,...params.temporalDecay};if(!config.enabled)return[...params.results];let nowMs=params.nowMs??Date.now(),timestampPromiseCache=new Map;return Promise.all(params.results.map(async entry=>{let cacheKey=`${entry.source}:${entry.path}`,timestampPromise=timestampPromiseCache.get(cacheKey);timestampPromise||(timestampPromise=extractTimestamp({filePath:entry.path,source:entry.source,workspaceDir:params.workspaceDir}),timestampPromiseCache.set(cacheKey,timestampPromise));let timestamp=await timestampPromise;if(!timestamp)return entry;let decayedScore=applyTemporalDecayToScore({score:entry.score,ageInDays:ageInDaysFromTimestamp(timestamp,nowMs),halfLifeDays:config.halfLifeDays});return{...entry,score:decayedScore}}))}function buildFtsQuery(raw){let tokens=raw.match(/[\p{L}\p{N}_]+/gu)?.map(t=>t.trim()).filter(Boolean)??[];return tokens.length===0?null:tokens.map(t=>`"${t.replaceAll(`"`,``)}"`).join(` AND `)}const bm25RankToScore=bm25RankToScore$1;async function mergeHybridResults(params){let byId=new Map;for(let r of params.vector)byId.set(r.id,{id:r.id,path:r.path,startLine:r.startLine,endLine:r.endLine,source:r.source,snippet:r.snippet,vectorScore:r.vectorScore,textScore:0});for(let r of params.keyword){let existing=byId.get(r.id);existing?(existing.textScore=r.textScore,r.snippet&&r.snippet.length>0&&(existing.snippet=r.snippet)):byId.set(r.id,{id:r.id,path:r.path,startLine:r.startLine,endLine:r.endLine,source:r.source,snippet:r.snippet,vectorScore:0,textScore:r.textScore})}let weights=normalizeHybridWeights(params.vectorWeight,params.textWeight),sorted=(await applyTemporalDecayToHybridResults({results:Array.from(byId.values()).map(entry=>{let score=hybridScore({vectorScore:entry.vectorScore,textScore:entry.textScore},weights);return{path:entry.path,startLine:entry.startLine,endLine:entry.endLine,score,snippet:entry.snippet,source:entry.source}}),temporalDecay:{...DEFAULT_TEMPORAL_DECAY_CONFIG,...params.temporalDecay},workspaceDir:params.workspaceDir,nowMs:params.nowMs})).toSorted((a,b)=>b.score-a.score),mmrConfig={...DEFAULT_MMR_CONFIG,...params.mmr};return mmrConfig.enabled?applyMMRToHybridResults(sorted,mmrConfig):sorted}function normalizeBatchBaseUrl(client){return client.baseUrl?.replace(/\/$/,``)??``}function buildBatchHeaders(client,params){let headers=client.headers?{...client.headers}:{};return params.json?!headers[`Content-Type`]&&!headers[`content-type`]&&(headers[`Content-Type`]=`application/json`):(delete headers[`Content-Type`],delete headers[`content-type`]),headers}function splitBatchRequests(requests,maxRequests){if(requests.length<=maxRequests)return[requests];let groups=[];for(let i=0;i<requests.length;i+=maxRequests)groups.push(requests.slice(i,i+maxRequests));return groups}async function runEmbeddingBatchGroups(params){if(params.requests.length===0)return new Map;let groups=splitBatchRequests(params.requests,params.maxRequests),byCustomId=new Map,tasks=groups.map((group,groupIndex)=>async()=>{await params.runGroup({group,groupIndex,groups:groups.length,byCustomId})});return params.debug?.(params.debugLabel,{requests:params.requests.length,groups:groups.length,wait:params.wait,concurrency:params.concurrency,pollIntervalMs:params.pollIntervalMs,timeoutMs:params.timeoutMs}),await runWithConcurrency(tasks,params.concurrency),byCustomId}function getGeminiUploadUrl(baseUrl){return baseUrl.includes(`/v1beta`)?baseUrl.replace(/\/v1beta\/?$/,`/upload/v1beta`):`${baseUrl.replace(/\/$/,``)}/upload`}function buildGeminiUploadBody(params){let boundary=`builderforce-${hashText(params.displayName)}`,jsonPart=JSON.stringify({file:{displayName:params.displayName,mimeType:`application/jsonl`}}),delimiter=`--${boundary}\r\n`,closeDelimiter=`--${boundary}--\r\n`,parts=[`${delimiter}Content-Type: application/json; charset=UTF-8\r\n\r\n${jsonPart}\r\n`,`${delimiter}Content-Type: application/jsonl; charset=UTF-8\r\n\r\n${params.jsonl}\r\n`,closeDelimiter];return{body:new Blob([parts.join(``)],{type:`multipart/related`}),contentType:`multipart/related; boundary=${boundary}`}}async function submitGeminiBatch(params){let baseUrl=normalizeBatchBaseUrl(params.gemini),uploadPayload=buildGeminiUploadBody({jsonl:params.requests.map(request=>JSON.stringify({key:request.custom_id,request:{content:request.content,task_type:request.taskType}})).join(`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{t as __exportAll}from"./rolldown-runtime-BlRA8w72.js";import{c as normalizeAccountId}from"./session-key-5J69DULS.js";import{r as normalizeChannelId}from"./plugins-
|
|
1
|
+
import{t as __exportAll}from"./rolldown-runtime-BlRA8w72.js";import{c as normalizeAccountId}from"./session-key-5J69DULS.js";import{r as normalizeChannelId}from"./plugins-CaUOZBVb.js";var markdown_tables_exports=__exportAll({resolveMarkdownTableMode:()=>resolveMarkdownTableMode});const DEFAULT_TABLE_MODES=new Map([[`signal`,`bullets`],[`whatsapp`,`bullets`]]),isMarkdownTableMode=value=>value===`off`||value===`bullets`||value===`code`;function resolveMarkdownModeFromSection(section,accountId){if(!section)return;let normalizedAccountId=normalizeAccountId(accountId),accounts=section.accounts;if(accounts&&typeof accounts==`object`){let directMode=accounts[normalizedAccountId]?.markdown?.tables;if(isMarkdownTableMode(directMode))return directMode;let matchKey=Object.keys(accounts).find(key=>key.toLowerCase()===normalizedAccountId.toLowerCase()),matchMode=(matchKey?accounts[matchKey]:void 0)?.markdown?.tables;if(isMarkdownTableMode(matchMode))return matchMode}let sectionMode=section.markdown?.tables;return isMarkdownTableMode(sectionMode)?sectionMode:void 0}function resolveMarkdownTableMode(params){let channel=normalizeChannelId(params.channel),defaultMode=channel?DEFAULT_TABLE_MODES.get(channel)??`code`:`code`;return!channel||!params.cfg?defaultMode:resolveMarkdownModeFromSection(params.cfg.channels?.[channel]??params.cfg?.[channel],params.accountId)??defaultMode}export{resolveMarkdownTableMode as n,markdown_tables_exports as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{o as normalizeChatChannelId,s as getActivePluginRegistry,t as CHANNEL_IDS}from"./registry-
|
|
1
|
+
import{o as normalizeChatChannelId,s as getActivePluginRegistry,t as CHANNEL_IDS}from"./registry-DJq2Cvo9.js";const GATEWAY_CLIENT_IDS={WEBCHAT_UI:`webchat-ui`,CONTROL_UI:`builderforce-control-ui`,BUILDERFORCE_AGENTS_CONTROL_UI:`builderforce-control-ui`,WEBCHAT:`webchat`,CLI:`cli`,GATEWAY_CLIENT:`gateway-client`,MACOS_APP:`builderforce-macos`,IOS_APP:`builderforce-ios`,ANDROID_APP:`builderforce-android`,NODE_HOST:`node-host`,TEST:`test`,FINGERPRINT:`fingerprint`,PROBE:`builderforce-probe`},GATEWAY_CLIENT_NAMES=GATEWAY_CLIENT_IDS,GATEWAY_CLIENT_MODES={WEBCHAT:`webchat`,CLI:`cli`,UI:`ui`,BACKEND:`backend`,NODE:`node`,PROBE:`probe`,TEST:`test`};new Set(Object.values(GATEWAY_CLIENT_IDS)),new Set(Object.values(GATEWAY_CLIENT_MODES));const INTERNAL_MESSAGE_CHANNEL=`webchat`,MARKDOWN_CAPABLE_CHANNELS=new Set([`slack`,`telegram`,`signal`,`discord`,`googlechat`,`tui`,INTERNAL_MESSAGE_CHANNEL]);function isInternalMessageChannel(raw){return normalizeMessageChannel(raw)===INTERNAL_MESSAGE_CHANNEL}function normalizeMessageChannel(raw){let normalized=raw?.trim().toLowerCase();return normalized?normalized===INTERNAL_MESSAGE_CHANNEL?INTERNAL_MESSAGE_CHANNEL:normalizeChatChannelId(normalized)||((getActivePluginRegistry()?.channels.find(entry=>entry.plugin.id.toLowerCase()===normalized?!0:(entry.plugin.meta.aliases??[]).some(alias=>alias.trim().toLowerCase()===normalized)))?.plugin.id??normalized):void 0}const listPluginChannelIds=()=>{let registry=getActivePluginRegistry();return registry?registry.channels.map(entry=>entry.plugin.id):[]},listDeliverableMessageChannels=()=>Array.from(new Set([...CHANNEL_IDS,...listPluginChannelIds()])),listGatewayMessageChannels=()=>[...listDeliverableMessageChannels(),INTERNAL_MESSAGE_CHANNEL];function isGatewayMessageChannel(value){return listGatewayMessageChannels().includes(value)}function isDeliverableMessageChannel(value){return listDeliverableMessageChannels().includes(value)}function resolveGatewayMessageChannel(raw){let normalized=normalizeMessageChannel(raw);if(normalized)return isGatewayMessageChannel(normalized)?normalized:void 0}function resolveMessageChannel(primary,fallback){return normalizeMessageChannel(primary)??normalizeMessageChannel(fallback)}function isMarkdownCapableMessageChannel(raw){let channel=normalizeMessageChannel(raw);return channel?MARKDOWN_CAPABLE_CHANNELS.has(channel):!1}export{listDeliverableMessageChannels as a,resolveMessageChannel as c,GATEWAY_CLIENT_NAMES as d,isMarkdownCapableMessageChannel as i,GATEWAY_CLIENT_IDS as l,isDeliverableMessageChannel as n,normalizeMessageChannel as o,isInternalMessageChannel as r,resolveGatewayMessageChannel as s,INTERNAL_MESSAGE_CHANNEL as t,GATEWAY_CLIENT_MODES as u};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{t as __exportAll}from"./rolldown-runtime-BlRA8w72.js";import{w as isRecord}from"./registry-
|
|
1
|
+
import{t as __exportAll}from"./rolldown-runtime-BlRA8w72.js";import{w as isRecord}from"./registry-DJq2Cvo9.js";import{S as resolveImplicitProviders,_ as discoverOllamaModels,b as resolveImplicitBedrockProvider,dt as resolveBuilderForceAgentsAgentDir,x as resolveImplicitCopilotProvider,y as normalizeProviders}from"./model-selection-K82MAGlL.js";import{n as loadConfig}from"./config-v1EU9Ll8.js";import path from"node:path";import{existsSync,readFileSync}from"node:fs";import fs$1 from"node:fs/promises";function mergeProviderModels(implicit,explicit){let implicitModels=Array.isArray(implicit.models)?implicit.models:[],explicitModels=Array.isArray(explicit.models)?explicit.models:[];if(implicitModels.length===0)return{...implicit,...explicit};let getId=model=>{if(!model||typeof model!=`object`)return``;let id=model.id;return typeof id==`string`?id.trim():``},seen=new Set(explicitModels.map(getId).filter(Boolean)),mergedModels=[...explicitModels,...implicitModels.filter(model=>{let id=getId(model);return!id||seen.has(id)?!1:(seen.add(id),!0)})];return{...implicit,...explicit,models:mergedModels}}function mergeProviders(params){let out=params.implicit?{...params.implicit}:{};for(let[key,explicit]of Object.entries(params.explicit??{})){let providerKey=key.trim();if(!providerKey)continue;let implicit=out[providerKey];out[providerKey]=implicit?mergeProviderModels(implicit,explicit):explicit}return out}async function readJson(pathname){try{let raw=await fs$1.readFile(pathname,`utf8`);return JSON.parse(raw)}catch{return null}}async function ensureBuilderForceAgentsModelsJson(config,agentDirOverride){let cfg=config??loadConfig(),agentDir=agentDirOverride?.trim()?agentDirOverride.trim():resolveBuilderForceAgentsAgentDir(),explicitProviders=cfg.models?.providers??{},providers=mergeProviders({implicit:await resolveImplicitProviders({agentDir,explicitProviders}),explicit:explicitProviders}),implicitBedrock=await resolveImplicitBedrockProvider({agentDir,config:cfg});if(implicitBedrock){let existing=providers[`amazon-bedrock`];providers[`amazon-bedrock`]=existing?mergeProviderModels(implicitBedrock,existing):implicitBedrock}let implicitCopilot=await resolveImplicitCopilotProvider({agentDir});if(implicitCopilot&&!providers[`github-copilot`]&&(providers[`github-copilot`]=implicitCopilot),Object.keys(providers).length===0)return{agentDir,wrote:!1};let mode=cfg.models?.mode??`merge`,targetPath=path.join(agentDir,`models.json`),mergedProviders=providers,existingRaw=``;if(mode===`merge`){let existing=await readJson(targetPath);isRecord(existing)&&isRecord(existing.providers)&&(mergedProviders={...existing.providers,...providers})}let normalizedProviders=await normalizeProviders({providers:mergedProviders,agentDir}),next=`${JSON.stringify({providers:normalizedProviders},null,2)}\n`;try{existingRaw=await fs$1.readFile(targetPath,`utf8`)}catch{existingRaw=``}if(existingRaw===next)return{agentDir,wrote:!1};await fs$1.mkdir(agentDir,{recursive:!0,mode:448}),await fs$1.writeFile(targetPath,next,{mode:384});let ollamaProvider=mergedProviders?.ollama;if(ollamaProvider&&Array.isArray(ollamaProvider.models)&&ollamaProvider.models.length===0){let baseUrl=ollamaProvider.baseUrl;(async()=>{try{let models=await discoverOllamaModels(baseUrl);if(models.length===0)return;let existing=await readJson(targetPath);if(!isRecord(existing)||!isRecord(existing.providers))return;let providers=existing.providers,ollama=providers.ollama;if(!ollama)return;providers.ollama={...ollama,models};let normalized=await normalizeProviders({providers,agentDir});await fs$1.writeFile(targetPath,`${JSON.stringify({providers:normalized},null,2)}\n`,{mode:384});let{invalidateModelCatalogCache}=await Promise.resolve().then(()=>model_catalog_exports);invalidateModelCatalogCache()}catch{}})()}return{agentDir,wrote:!0}}var AuthStorage=class AuthStorage{constructor(storePath){this.storePath=storePath,this.runtimeKeys=new Map}static create(storePath){return new AuthStorage(storePath)}setRuntimeApiKey(provider,key){this.runtimeKeys.set(provider,key)}getRuntimeApiKey(provider){return this.runtimeKeys.get(provider)}},ModelRegistry=class{constructor(authStorage,modelsPath){if(this.models=[],modelsPath&&existsSync(modelsPath))try{let data=JSON.parse(readFileSync(modelsPath,`utf-8`));for(let[provider,pc]of Object.entries(data.providers??{})){let api=pc.api??`openai-completions`,baseUrl=pc.baseUrl??``;for(let m of pc.models??[]){let id=String(m.id??``);id&&this.models.push({id,name:typeof m.name==`string`?m.name:id,api,provider,baseUrl,reasoning:m.reasoning===!0,input:Array.isArray(m.input)?m.input:[`text`],cost:m.cost??{input:0,output:0,cacheRead:0,cacheWrite:0},contextWindow:typeof m.contextWindow==`number`?m.contextWindow:128e3,maxTokens:typeof m.maxTokens==`number`?m.maxTokens:4096})}}}catch{}}find(provider,modelId){return this.models.find(m=>m.provider===provider&&m.id===modelId)??null}getAll(){return this.models}getAvailable(){return this.models}async getApiKey(model){}};function discoverAuthStorage(agentDir){return AuthStorage.create(path.join(agentDir,`auth.json`))}function discoverModels(authStorage,agentDir){return new ModelRegistry(authStorage,path.join(agentDir,`models.json`))}var model_catalog_exports=__exportAll({findModelInCatalog:()=>findModelInCatalog,invalidateModelCatalogCache:()=>invalidateModelCatalogCache,loadModelCatalog:()=>loadModelCatalog,modelSupportsVision:()=>modelSupportsVision});let modelCatalogPromise=null,hasLoggedModelCatalogError=!1,importModelSdk=()=>Promise.resolve({AuthStorage,ModelRegistry});const CODEX_PROVIDER=`openai-codex`,OPENAI_CODEX_GPT53_SPARK_MODEL_ID=`gpt-5.3-codex-spark`;function applyOpenAICodexSparkFallback(models){if(models.some(entry=>entry.provider===CODEX_PROVIDER&&entry.id.toLowerCase()===OPENAI_CODEX_GPT53_SPARK_MODEL_ID))return;let baseModel=models.find(entry=>entry.provider===CODEX_PROVIDER&&entry.id.toLowerCase()===`gpt-5.3-codex`);baseModel&&models.push({...baseModel,id:OPENAI_CODEX_GPT53_SPARK_MODEL_ID,name:OPENAI_CODEX_GPT53_SPARK_MODEL_ID})}function invalidateModelCatalogCache(){modelCatalogPromise=null}function createAuthStorage(AuthStorageLike,path){let withFactory=AuthStorageLike;return typeof withFactory.create==`function`?withFactory.create(path):new AuthStorageLike(path)}async function loadModelCatalog(params){return params?.useCache===!1&&(modelCatalogPromise=null),modelCatalogPromise||(modelCatalogPromise=(async()=>{let models=[],sortModels=entries=>entries.sort((a,b)=>{let p=a.provider.localeCompare(b.provider);return p===0?a.name.localeCompare(b.name):p});try{await ensureBuilderForceAgentsModelsJson(params?.config??loadConfig()),await(await import(`./auth-json-DK6qod1_.js`)).ensureAuthJsonFromAuthProfiles(resolveBuilderForceAgentsAgentDir());let modelSdk=await importModelSdk(),agentDir=resolveBuilderForceAgentsAgentDir(),{join}=await import(`node:path`),authStorage=createAuthStorage(modelSdk.AuthStorage,join(agentDir,`auth.json`)),registry=new modelSdk.ModelRegistry(authStorage,join(agentDir,`models.json`)),entries=Array.isArray(registry)?registry:registry.getAll();for(let entry of entries){let id=String(entry?.id??``).trim();if(!id)continue;let provider=String(entry?.provider??``).trim();if(!provider)continue;let name=String(entry?.name??id).trim()||id,contextWindow=typeof entry?.contextWindow==`number`&&entry.contextWindow>0?entry.contextWindow:void 0,reasoning=typeof entry?.reasoning==`boolean`?entry.reasoning:void 0,input=Array.isArray(entry?.input)?entry.input:void 0;models.push({id,name,provider,contextWindow,reasoning,input})}return applyOpenAICodexSparkFallback(models),models.length===0&&(modelCatalogPromise=null),sortModels(models)}catch(error){return hasLoggedModelCatalogError||(hasLoggedModelCatalogError=!0,console.warn(`[model-catalog] Failed to load model catalog: ${String(error)}`)),modelCatalogPromise=null,models.length>0?sortModels(models):[]}})(),modelCatalogPromise)}function modelSupportsVision(entry){return entry?.input?.includes(`image`)??!1}function findModelInCatalog(catalog,provider,modelId){let normalizedProvider=provider.toLowerCase().trim(),normalizedModelId=modelId.toLowerCase().trim();return catalog.find(entry=>entry.provider.toLowerCase()===normalizedProvider&&entry.id.toLowerCase()===normalizedModelId)}export{discoverAuthStorage as a,model_catalog_exports as i,loadModelCatalog as n,discoverModels as o,modelSupportsVision as r,ensureBuilderForceAgentsModelsJson as s,findModelInCatalog as t};
|