@seanhogg/builderforce-agents 2026.10.10 → 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/{audio-preflight-Dm9zyfJq.js → audio-preflight-CvvHdoWy.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-2EpP2M8q.js → builderforce-B9187Tm9.js} +4 -4
- package/dist/{builderforce-Cyg20uU8.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-Brg9KsB9.js +4 -0
- 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-CDcuHGpx.js → command-registry-B7uAoROP.js} +1 -1
- package/dist/{command-registry-hHegQvBn.js → command-registry-CW16Mk2Y.js} +1 -1
- package/dist/{completion-cli-Bqr0W4L6.js → completion-cli-ZvXrCQqk.js} +1 -1
- package/dist/{completion-cli-Ch9ozmkg.js → completion-cli-gyvx5ZXu.js} +1 -1
- package/dist/{completion-cli-Do4vXo1k.js → completion-cli-n8UsdT91.js} +1 -1
- package/dist/{completion-cli-Ck0FTqPT.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-BjBTLcoC.js → doctor-completion-94zme499.js} +1 -1
- package/dist/{doctor-completion-Ccs-JEvV.js → doctor-completion-CbF34DIH.js} +1 -1
- package/dist/{embedded-cvG_LpfQ.js → embedded-D-citLF2.js} +6 -6
- 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/extensionAPI.js +1 -1
- package/dist/{gateway-cli-CiHNwzdS.js → gateway-cli-CKcoLVMA.js} +5 -5
- package/dist/{gateway-cli-z47dfosr.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-D4uXN5Ec.js → onboard-BItclJp0.js} +1 -1
- package/dist/{onboard-cB37uVxy.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-vwqLS6pe.js → onboard-interactive-Cl2K3EYn.js} +1 -1
- package/dist/{onboard-interactive-gvfRcLOt.js → onboard-interactive-JNux9zfA.js} +1 -1
- package/dist/{onboard-interactive-CnXgQrpI.js → onboard-interactive-J_ObFzeW.js} +1 -1
- package/dist/{onboard-interactive-CoFFuSJT.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-DdKW5K8Y.js → onboarding-BSENgR9C.js} +5 -5
- package/dist/{onboarding-B9GqKO5L.js → onboarding-CIaZLNc1.js} +5 -5
- package/dist/{onboarding.finalize-CcuO4Yxw.js → onboarding.finalize-BwOpvoPE.js} +1 -1
- package/dist/{onboarding.finalize-D3mTpOdc.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/agent-runtime/src/infra/workflow-telemetry.d.ts +12 -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-CpxTJP1m.js → program-context-ClBa4lUj.js} +1 -1
- package/dist/{program-BgDciyOQ.js → program-vVCzU0cH.js} +2 -2
- package/dist/{prompt-select-styled-Qb0DubNy.js → prompt-select-styled-BJPGccTJ.js} +1 -1
- package/dist/{prompt-select-styled-Bu7WPMzB.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/{pw-ai-D8HJAvv-.js → pw-ai-DaxMmaVL.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-CPnm6L-m.js → register.maintenance-C6ocMld2.js} +1 -1
- package/dist/{register.maintenance-D8WmeEaD.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-DMfqe2nX.js → register.onboard-B34211N6.js} +1 -1
- package/dist/{register.onboard-BoUicPRh.js → register.onboard-S1d2WAE4.js} +1 -1
- package/dist/{register.setup-BK6OEvY3.js → register.setup-CJPyAwCQ.js} +1 -1
- package/dist/{register.setup-CtcAR3JR.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-Dl6jPPsc.js → register.subclis-C9V_M-Lk.js} +1 -1
- package/dist/{register.subclis-EScCVgbV.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-C3lmcvyV.js → run-main-DQMbgbcF.js} +1 -1
- package/dist/{runner-CviGu3Nk.js → runner-COldX-El.js} +3 -3
- 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-D2sTsa4p.js → tui-DnVRxfI8.js} +2 -2
- package/dist/{tui-DY2oYbxk.js → tui-JfWoLGIV.js} +2 -2
- package/dist/{tui-cli-GW-qybY6.js → tui-cli-CGjg2Eb5.js} +1 -1
- package/dist/{tui-cli-wn3DmvUG.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-K5dGZmg8.js → update-cli-CfJJcSUS.js} +1 -1
- package/dist/{update-cli-CN0oxZ_A.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-DONGrYXq.js → web-BQPd6gQJ.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-C89jVb-9.js +0 -24
- package/dist/builderforce-onboarding-D5A-wEs-.js +0 -24
- package/dist/chrome-DUBgoZpO.js +0 -4
- 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/provider-dispatcher-C4nHaNqn.js +0 -1
- package/dist/register.configure-DAL38e7r.js +0 -1
- package/dist/register.configure-DZG7-WVi.js +0 -1
- package/dist/status-BTYqHVha.js +0 -1
- package/dist/web-P6QsgmSD.js +0 -1
- package/dist/workflow-telemetry-B8Im0mPk.js +0 -1
- package/dist/workflow-telemetry-DLEnm5TI.js +0 -2
- package/dist/workflow-telemetry-Dc_oseV7.js +0 -2
- package/dist/workflow-telemetry-Dkm3mofI.js +0 -1
- /package/dist/{devtools-CI7JyCXv.js → devtools-Cg4F-l9O.js} +0 -0
- /package/dist/{devtools-eMFaIsAT.js → devtools-Dl2DACSO.js} +0 -0
- /package/dist/{github-copilot-token-D3gHtNUu.js → github-copilot-token-BlyiXyTy.js} +0 -0
- /package/dist/{github-copilot-token-DHP2kAiN.js → github-copilot-token-D5sB2AUI.js} +0 -0
- /package/dist/{onboard-hooks-Cenav0eW.js → onboard-hooks-BaOSgxs9.js} +0 -0
- /package/dist/{onboard-hooks-Ce20rwpW.js → onboard-hooks-fO5eeDe_.js} +0 -0
- /package/dist/{qmd-manager-DVd_aWEV.js → qmd-manager-BgplOjHN.js} +0 -0
- /package/dist/{qmd-manager-keHvLmvP.js → qmd-manager-COUi_Fqb.js} +0 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{g as resolveStateDir}from"./paths-5FcIFMsj.js";import{B as theme,g as pathExists}from"./utils-DbaBVFaK.js";import"./embedded-helpers-CEsr3aQ0.js";import{cr as trimLogTail}from"./reply-Cd3vVnD7.js";import"./session-key-EoB0qaG9.js";import{a as isCorePackageName,o as stripPackagePrefix,r as CORE_PACKAGE_NAME,t as resolveBuilderForceAgentsPackageRoot}from"./builderforce-root-D64_sXEi.js";import{i as defaultRuntime}from"./subsystem-B3TqcCrZ.js";import"./registry-TdK-aV05.js";import"./logger-Bch0bx9c.js";import{t as runCommandWithTimeout}from"./exec-DdcIjeyn.js";import"./agent-scope-DPtjOxzp.js";import"./src-CA0fU67C.js";import"./model-selection-9bRFKBI_.js";import{n as replaceCliName,r as resolveCliName,t as formatCliCommand}from"./command-format-D806O2pt.js";import"./env-file-D1MDi-AM.js";import"./boolean-Cnh1KNl1.js";import"./env-BIdU5BAp.js";import"./src-DTFqOIQD.js";import{a as readConfigFileSnapshot,c as writeConfigFile}from"./io-3R_ZyUxB.js";import"./manifest-registry-BJCfNV1a.js";import"./config-_1Ca6jGb.js";import"./runner-SxCr9kXD.js";import"./model-catalog-C6UrZ0uG.js";import"./sandbox-BZibn6PX.js";import"./chrome-a3X9_-nf.js";import"./tailscale-DLkpGquM.js";import"./auth-lebUHrkd.js";import"./server-context-DJZT7Upf.js";import"./frontmatter-3D1EdC1L.js";import"./skills-Ba4ftrB-.js";import"./plugin-skills-B11rggZh.js";import"./routes-BzfLvF8W.js";import"./redact-BHdfp2MZ.js";import"./errors-B1MIg3g-.js";import"./paths-cR8ct-Y3.js";import"./ssrf-p9k-iapc.js";import"./image-ops-C8IUQKjn.js";import"./store-CmHBQ-yX.js";import"./ports-DgmEDNOm.js";import"./trash-DD2Hc5oq.js";import"./sessions-CdanN_ZI.js";import"./message-channel-D_jXxXQj.js";import"./plugins-D5zP6ENo.js";import"./accounts-o35LU_iy.js";import"./accounts-rmXEiebi.js";import"./accounts-BLueHgKj.js";import"./bindings-DR59065T.js";import"./send-DerUBvXW.js";import"./send-DyF1Xy9K.js";import"./paths-DJ6rztqJ.js";import"./tool-images-B7b_OiMz.js";import"./tool-display-ByOZtWvA.js";import"./fetch-guard-8mwt3-hm.js";import"./api-key-rotation-CHBjUwUJ.js";import"./fetch-BuOLY9KP.js";import"./sqlite-C39E12XS.js";import"./tokens-CCU3zO-D.js";import"./project-context-store-wcq7lXuI.js";import"./with-timeout-Bwq-GyUQ.js";import"./deliver-BpLm3ktn.js";import"./send-CBBziNqM.js";import"./workspace-D4LK4thI.js";import"./reply-prefix-zIMgi6K6.js";import{c as resolveGatewayLaunchAgentLabel,d as resolveGatewaySystemdServiceName,f as resolveGatewayWindowsTaskName}from"./constants-BBbGeL3t.js";import"./memory-cli-DRz4wtHk.js";import"./manager-DwywI_5-.js";import"./retry-DlVhg5qu.js";import"./client-xfoidwPI.js";import"./call-BbRf8gFM.js";import"./common-BTbIhLyt.js";import"./chunk-FCBlVOyo.js";import"./markdown-tables-P6uoUSFa.js";import"./ir-5BNoIXZm.js";import"./render-D1dVTEB1.js";import"./builderforcellm-syscheck-DrFJ638L.js";import"./send-4d9NswaD.js";import"./outbound-attachment-C7wByQO5.js";import"./fetch-DnVtDecb.js";import"./delivery-queue-CXKynF1P.js";import"./channel-activity-CCNDbdD3.js";import"./tables-ERcoWFDp.js";import"./pairing-store-CbvMJhD3.js";import{t as formatDocsLink}from"./links-BgWWaaOT.js";import"./cli-utils-LBYKdNFb.js";import{t as formatHelpExamples}from"./help-format-Qfk2vDNX.js";import"./progress-BfOtdN6b.js";import{r as formatDurationPrecise}from"./format-duration-HN2dpHE0.js";import"./resolve-route-D49haUnv.js";import"./replies-Bd2RPZwQ.js";import"./refresh-TiC_kLgE.js";import"./coding-tools.policy-6qh9acJy.js";import"./send-BJDzwYJN.js";import"./onboard-helpers-Cf5dNq7-.js";import{n as stylePromptMessage}from"./prompt-style-BpVK43GK.js";import"./pairing-labels-BW5jQZlr.js";import"./session-cost-usage-BjH7mxVj.js";import"./usage-format-DGf8ZWPH.js";import"./provider-usage-BdrU4cIE.js";import"./active-listener-Dcg19lJG.js";import"./exec-approvals-BpVPDVtV.js";import"./nodes-screen-C3TDIi8d.js";import"./project-context-CJj0Inz-.js";import"./control-service-BbsswoMy.js";import"./stagger-8EkqkqJv.js";import"./channel-selection-DyAvzlY8.js";import"./mamba-state-engine-CoGqoBTH.js";import"./transformers-stream-D7nRu4Qu.js";import{r as parseSemver}from"./runtime-guard-DhksRHci.js";import"./program-context-CpxTJP1m.js";import"./catalog-rgiY__UQ.js";import"./skills-status-vWC0PU8J.js";import{n as inheritOptionFromParent}from"./command-options-DzGFCQYs.js";import"./note-B6NtFdXt.js";import"./helpers-DTDCy17p.js";import"./plugin-auto-enable-DDry2fA6.js";import"./install-safe-path-DsLq2BUJ.js";import"./npm-registry-spec-DIW6RsGN.js";import"./skill-scanner-U3AJgjqc.js";import"./installs-C9A8QFiF.js";import"./channels-status-issues-BlOu0Ul_.js";import{n as installCompletion}from"./completion-cli-Ch9ozmkg.js";import"./daemon-runtime-CtOr1ncS.js";import"./systemd-BG3_QT6W.js";import{t as resolveGatewayService}from"./service-D-NLDyK3.js";import"./lifecycle-core-Dwb4gHjZ.js";import"./diagnostics-DCjg0nBH.js";import{o as runDaemonRestart}from"./daemon-cli-DlwOVDbt.js";import{t as renderTable}from"./table-BoCHYKoQ.js";import"./health-yS3NRKvY.js";import"./control-ui-assets-CWgH1Tda.js";import{_ as resolveUpdateChannelDisplay,c as DEFAULT_GIT_CHANNEL,d as channelToNpmTag,f as formatUpdateChannelLabel,g as resolveEffectiveUpdateChannel,h as normalizeUpdateChannel,l as DEFAULT_PACKAGE_CHANNEL,n as compareSemverStrings,o as resolveNpmChannelTag,r as fetchNpmTagVersion,t as checkUpdateStatus}from"./update-check-D6MvqVFE.js";import"./dm-policy-shared-Dhw9_6mi.js";import{i as resolveUpdateAvailability,n as formatUpdateOneLiner,t as formatUpdateAvailableHint}from"./status.update-C9iy31xr.js";import{a as detectGlobalInstallManagerForRoot,c as readPackageName,i as detectGlobalInstallManagerByPresence,l as readPackageVersion,n as runGatewayUpdate,o as globalInstallArgs,r as cleanupGlobalRenameDirs,s as resolveGlobalPackageRoot}from"./session-dirs-D_ARkyw0.js";import"./logging-DHa3jQN3.js";import{n as updateNpmInstalledPlugins,t as syncPluginsForUpdateChannel}from"./update-BUzcmoDf.js";import"./systemd-linger-CT-VHPB3.js";import"./health-format-iE_KYEwP.js";import{n as doctorCommand,t as selectStyled}from"./prompt-select-styled-Qb0DubNy.js";import{r as ensureCompletionCacheExists,t as checkShellCompletionStatus}from"./doctor-completion-Ccs-JEvV.js";import os from"node:os";import path from"node:path";import fs from"node:fs/promises";import{spawn,spawnSync}from"node:child_process";import{confirm,isCancel,spinner}from"@clack/prompts";function parseTimeoutMsOrExit(timeout){let timeoutMs=timeout?Number.parseInt(timeout,10)*1e3:void 0;return timeoutMs!==void 0&&(Number.isNaN(timeoutMs)||timeoutMs<=0)?(defaultRuntime.error(`--timeout must be a positive integer (seconds)`),defaultRuntime.exit(1),null):timeoutMs}const BUILDERFORCE_AGENTS_REPO_URL=`https://github.com/SeanHogg/Builderforce.ai.git`,MAX_LOG_CHARS=8e3,DEFAULT_PACKAGE_NAME=CORE_PACKAGE_NAME;function normalizeTag(value){if(!value)return null;let trimmed=value.trim();return trimmed?stripPackagePrefix(trimmed):null}function normalizeVersionTag(tag){let trimmed=tag.trim();if(!trimmed)return null;let cleaned=trimmed.startsWith(`v`)?trimmed.slice(1):trimmed;return parseSemver(cleaned)?cleaned:null}async function resolveTargetVersion(tag,timeoutMs){return normalizeVersionTag(tag)||((await fetchNpmTagVersion({tag,timeoutMs})).version??null)}async function isGitCheckout(root){try{return await fs.stat(path.join(root,`.git`)),!0}catch{return!1}}async function isCorePackage(root){return isCorePackageName(await readPackageName(root))}async function isEmptyDir(targetPath){try{return(await fs.readdir(targetPath)).length===0}catch{return!1}}function resolveGitInstallDir(){let override=process.env.BUILDERFORCE_AGENTS_GIT_DIR?.trim();return override?path.resolve(override):resolveDefaultGitDir()}function resolveDefaultGitDir(){return resolveStateDir(process.env,os.homedir)}function resolveNodeRunner(){let base=path.basename(process.execPath).toLowerCase();return base===`node`||base===`node.exe`?process.execPath:`node`}async function resolveUpdateRoot(){return await resolveBuilderForceAgentsPackageRoot({moduleUrl:import.meta.url,argv1:process.argv[1],cwd:process.cwd()})??process.cwd()}async function runUpdateStep(params){let command=params.argv.join(` `);params.progress?.onStepStart?.({name:params.name,command,index:0,total:0});let started=Date.now(),res=await runCommandWithTimeout(params.argv,{cwd:params.cwd,timeoutMs:params.timeoutMs}),durationMs=Date.now()-started,stderrTail=trimLogTail(res.stderr,MAX_LOG_CHARS);return params.progress?.onStepComplete?.({name:params.name,command,index:0,total:0,durationMs,exitCode:res.code,stderrTail}),{name:params.name,command,cwd:params.cwd??process.cwd(),durationMs,exitCode:res.code,stdoutTail:trimLogTail(res.stdout,MAX_LOG_CHARS),stderrTail}}async function ensureGitCheckout(params){if(!await pathExists(params.dir))return await runUpdateStep({name:`git clone`,argv:[`git`,`clone`,BUILDERFORCE_AGENTS_REPO_URL,params.dir],timeoutMs:params.timeoutMs,progress:params.progress});if(!await isGitCheckout(params.dir)){if(!await isEmptyDir(params.dir))throw Error(`BUILDERFORCE_AGENTS_GIT_DIR points at a non-git directory: ${params.dir}. Set BUILDERFORCE_AGENTS_GIT_DIR to an empty folder or a builderforce checkout.`);return await runUpdateStep({name:`git clone`,argv:[`git`,`clone`,BUILDERFORCE_AGENTS_REPO_URL,params.dir],cwd:params.dir,timeoutMs:params.timeoutMs,progress:params.progress})}if(!await isCorePackage(params.dir))throw Error(`BUILDERFORCE_AGENTS_GIT_DIR does not look like a core checkout: ${params.dir}.`);return null}async function resolveGlobalManager(params){let runCommand=async(argv,options)=>{let res=await runCommandWithTimeout(argv,options);return{stdout:res.stdout,stderr:res.stderr,code:res.code}};if(params.installKind===`package`){let detected=await detectGlobalInstallManagerForRoot(runCommand,params.root,params.timeoutMs);if(detected)return detected}return await detectGlobalInstallManagerByPresence(runCommand,params.timeoutMs)??`npm`}async function tryWriteCompletionCache(root,jsonMode){let binPath=path.join(root,`builderforce.mjs`);if(!await pathExists(binPath))return;let result=spawnSync(resolveNodeRunner(),[binPath,`completion`,`--write-state`],{cwd:root,env:process.env,encoding:`utf-8`});if(result.error){jsonMode||defaultRuntime.log(theme.warn(`Completion cache update failed: ${String(result.error)}`));return}if(result.status!==0&&!jsonMode){let stderr=(result.stderr??``).toString().trim(),detail=stderr?` (${stderr})`:``;defaultRuntime.log(theme.warn(`Completion cache update failed${detail}.`))}}function formatGitStatusLine(params){let shortSha=params.sha?params.sha.slice(0,8):null,branch=params.branch&¶ms.branch!==`HEAD`?params.branch:null,tag=params.tag;return[branch??(tag?`detached`:`git`),tag?`tag ${tag}`:null,shortSha?`@ ${shortSha}`:null].filter(Boolean).join(` · `)}async function updateStatusCommand(opts){let timeoutMs=parseTimeoutMsOrExit(opts.timeout);if(timeoutMs===null)return;let root=await resolveUpdateRoot(),configSnapshot=await readConfigFileSnapshot(),configChannel=configSnapshot.valid?normalizeUpdateChannel(configSnapshot.config.update?.channel):null,update=await checkUpdateStatus({root,timeoutMs:timeoutMs??3500,fetchGit:!0,includeRegistry:!0}),channelInfo=resolveUpdateChannelDisplay({configChannel,installKind:update.installKind,gitTag:update.git?.tag??null,gitBranch:update.git?.branch??null}),channelLabel=channelInfo.label,gitLabel=update.installKind===`git`?formatGitStatusLine({branch:update.git?.branch??null,tag:update.git?.tag??null,sha:update.git?.sha??null}):null,updateAvailability=resolveUpdateAvailability(update),updateLine=formatUpdateOneLiner(update).replace(/^Update:\s*/i,``);if(opts.json){defaultRuntime.log(JSON.stringify({update,channel:{value:channelInfo.channel,source:channelInfo.source,label:channelLabel,config:configChannel},availability:updateAvailability},null,2));return}let tableWidth=Math.max(60,(process.stdout.columns??120)-1),rows=[{Item:`Install`,Value:update.installKind===`git`?`git (${update.root??`unknown`})`:update.installKind===`package`?update.packageManager:`unknown`},{Item:`Channel`,Value:channelLabel},...gitLabel?[{Item:`Git`,Value:gitLabel}]:[],{Item:`Update`,Value:updateAvailability.available?theme.warn(`available · ${updateLine}`):updateLine}];defaultRuntime.log(theme.heading(`BuilderForceAgents update status`)),defaultRuntime.log(``),defaultRuntime.log(renderTable({width:tableWidth,columns:[{key:`Item`,header:`Item`,minWidth:10},{key:`Value`,header:`Value`,flex:!0,minWidth:24}],rows}).trimEnd()),defaultRuntime.log(``);let updateHint=formatUpdateAvailableHint(update);updateHint&&defaultRuntime.log(theme.warn(updateHint))}const STEP_LABELS={"clean check":`Working directory is clean`,"upstream check":`Upstream branch exists`,"git fetch":`Fetching latest changes`,"git rebase":`Rebasing onto target commit`,"git rev-parse @{upstream}":`Resolving upstream commit`,"git rev-list":`Enumerating candidate commits`,"git clone":`Cloning git checkout`,"preflight worktree":`Preparing preflight worktree`,"preflight cleanup":`Cleaning preflight worktree`,"deps install":`Installing dependencies`,build:`Building`,"ui:build":`Building UI assets`,"ui:build (post-doctor repair)":`Restoring missing UI assets`,"ui assets verify":`Validating UI assets`,"builderforce doctor entry":`Checking doctor entrypoint`,"builderforce doctor":`Running doctor checks`,"git rev-parse HEAD (after)":`Verifying update`,"global update":`Updating via package manager`,"global install":`Installing global package`};function getStepLabel(step){return STEP_LABELS[step.name]??step.name}function createUpdateProgress(enabled){if(!enabled)return{progress:{},stop:()=>{}};let currentSpinner=null;return{progress:{onStepStart:step=>{currentSpinner=spinner(),currentSpinner.start(theme.accent(getStepLabel(step)))},onStepComplete:step=>{if(!currentSpinner)return;let label=getStepLabel(step),duration=theme.muted(`(${formatDurationPrecise(step.durationMs)})`),icon=step.exitCode===0?theme.success(`✓`):theme.error(`✗`);if(currentSpinner.stop(`${icon} ${label} ${duration}`),currentSpinner=null,step.exitCode!==0&&step.stderrTail){let lines=step.stderrTail.split(`
|
|
1
|
+
import{g as resolveStateDir}from"./paths-5FcIFMsj.js";import{B as theme,g as pathExists}from"./utils-DbaBVFaK.js";import"./embedded-helpers-C9jpiwlw.js";import{cr as trimLogTail}from"./reply-GY1C8tcv.js";import"./session-key-EoB0qaG9.js";import{a as isCorePackageName,o as stripPackagePrefix,r as CORE_PACKAGE_NAME,t as resolveBuilderForceAgentsPackageRoot}from"./builderforce-root-D64_sXEi.js";import{i as defaultRuntime}from"./subsystem-B3TqcCrZ.js";import"./registry-TdK-aV05.js";import"./logger-Bch0bx9c.js";import{t as runCommandWithTimeout}from"./exec-DdcIjeyn.js";import"./agent-scope-DPtjOxzp.js";import"./src-CA0fU67C.js";import"./model-selection-DG9J_VTz.js";import{n as replaceCliName,r as resolveCliName,t as formatCliCommand}from"./command-format-D806O2pt.js";import"./env-file-D1MDi-AM.js";import"./boolean-Cnh1KNl1.js";import"./env-BIdU5BAp.js";import"./src-DTFqOIQD.js";import{a as readConfigFileSnapshot,c as writeConfigFile}from"./io-BLBq4T2o.js";import"./manifest-registry-BJCfNV1a.js";import"./config-BgV_FYSq.js";import"./runner-eTTUbLAK.js";import"./model-catalog-DjNiebr7.js";import"./sandbox-C4AKi2EX.js";import"./chrome-DXt86tmV.js";import"./tailscale-DLkpGquM.js";import"./auth-lebUHrkd.js";import"./server-context-CQ2v4BAx.js";import"./frontmatter-3D1EdC1L.js";import"./skills-Ba4ftrB-.js";import"./plugin-skills-B11rggZh.js";import"./routes-DZntyPY6.js";import"./redact-BHdfp2MZ.js";import"./errors-B1MIg3g-.js";import"./paths-cR8ct-Y3.js";import"./ssrf-p9k-iapc.js";import"./image-ops-C8IUQKjn.js";import"./store-CmHBQ-yX.js";import"./ports-DgmEDNOm.js";import"./trash-DD2Hc5oq.js";import"./sessions-BuZVmOWt.js";import"./message-channel-D_jXxXQj.js";import"./plugins-D5zP6ENo.js";import"./accounts-o35LU_iy.js";import"./accounts-rmXEiebi.js";import"./accounts-BLueHgKj.js";import"./bindings-DR59065T.js";import"./send-Aw8wK3vK.js";import"./send-ChGpVO3O.js";import"./paths-DJ6rztqJ.js";import"./tool-images-B7b_OiMz.js";import"./tool-display-ByOZtWvA.js";import"./fetch-guard-8mwt3-hm.js";import"./api-key-rotation-CyCi-UqR.js";import"./fetch-BuOLY9KP.js";import"./sqlite-C39E12XS.js";import"./tokens-CCU3zO-D.js";import"./project-context-store-wcq7lXuI.js";import"./with-timeout-GDLpcjW7.js";import"./deliver--6OBF3LL.js";import"./send-BxoVLIy1.js";import"./workspace-D4LK4thI.js";import"./reply-prefix-zIMgi6K6.js";import{c as resolveGatewayLaunchAgentLabel,d as resolveGatewaySystemdServiceName,f as resolveGatewayWindowsTaskName}from"./constants-BBbGeL3t.js";import"./memory-cli-CbkWGjRn.js";import"./manager-DSz61dXv.js";import"./retry-DlVhg5qu.js";import"./client-xfoidwPI.js";import"./call-T8ciwMTA.js";import"./common-BTbIhLyt.js";import"./chunk-FCBlVOyo.js";import"./markdown-tables-P6uoUSFa.js";import"./ir-5BNoIXZm.js";import"./render-D1dVTEB1.js";import"./builderforcellm-syscheck-F5JMAr3p.js";import"./send-BP5osGBo.js";import"./outbound-attachment-C7wByQO5.js";import"./fetch-DnVtDecb.js";import"./delivery-queue-CXKynF1P.js";import"./channel-activity-CCNDbdD3.js";import"./tables-ERcoWFDp.js";import"./pairing-store-ti3FEkmr.js";import{t as formatDocsLink}from"./links-BgWWaaOT.js";import"./cli-utils-LBYKdNFb.js";import{t as formatHelpExamples}from"./help-format-Qfk2vDNX.js";import"./progress-BfOtdN6b.js";import{r as formatDurationPrecise}from"./format-duration-HN2dpHE0.js";import"./resolve-route-D49haUnv.js";import"./replies-DokbEfJD.js";import"./refresh-TiC_kLgE.js";import"./coding-tools.policy-ZhOdlcEI.js";import"./send-l3ge4wkC.js";import"./onboard-helpers-CiHzTaFX.js";import{n as stylePromptMessage}from"./prompt-style-BpVK43GK.js";import"./pairing-labels-oA-nKTaW.js";import"./session-cost-usage-BjH7mxVj.js";import"./usage-format-DGf8ZWPH.js";import"./provider-usage-B-wPVN_j.js";import"./active-listener-Dcg19lJG.js";import"./exec-approvals-BpVPDVtV.js";import"./nodes-screen-C3TDIi8d.js";import"./project-context-CJj0Inz-.js";import"./control-service-y3GYvIBg.js";import"./stagger-8EkqkqJv.js";import"./channel-selection-DyAvzlY8.js";import"./mamba-state-engine-CoGqoBTH.js";import"./transformers-stream-D7nRu4Qu.js";import{r as parseSemver}from"./runtime-guard-DhksRHci.js";import"./program-context-ClBa4lUj.js";import"./catalog-rgiY__UQ.js";import"./skills-status-vWC0PU8J.js";import{n as inheritOptionFromParent}from"./command-options-DzGFCQYs.js";import"./note-B6NtFdXt.js";import"./helpers-DTDCy17p.js";import"./plugin-auto-enable-D8gKiE3F.js";import"./install-safe-path-DsLq2BUJ.js";import"./npm-registry-spec-DIW6RsGN.js";import"./skill-scanner-BEvov9QH.js";import"./installs-DFiF4lGy.js";import"./channels-status-issues-BlOu0Ul_.js";import{n as installCompletion}from"./completion-cli-gyvx5ZXu.js";import"./daemon-runtime-9XitJmIL.js";import"./systemd-BG3_QT6W.js";import{t as resolveGatewayService}from"./service-D-NLDyK3.js";import"./lifecycle-core-uxjxTzFv.js";import"./diagnostics-DCjg0nBH.js";import{o as runDaemonRestart}from"./daemon-cli-Bh3p0hui.js";import{t as renderTable}from"./table-BoCHYKoQ.js";import"./health-FO8MG5Ur.js";import"./control-ui-assets-CWgH1Tda.js";import{_ as resolveUpdateChannelDisplay,c as DEFAULT_GIT_CHANNEL,d as channelToNpmTag,f as formatUpdateChannelLabel,g as resolveEffectiveUpdateChannel,h as normalizeUpdateChannel,l as DEFAULT_PACKAGE_CHANNEL,n as compareSemverStrings,o as resolveNpmChannelTag,r as fetchNpmTagVersion,t as checkUpdateStatus}from"./update-check-D6MvqVFE.js";import"./dm-policy-shared-DYZ_T-az.js";import{i as resolveUpdateAvailability,n as formatUpdateOneLiner,t as formatUpdateAvailableHint}from"./status.update-CdgsLBPg.js";import{a as detectGlobalInstallManagerForRoot,c as readPackageName,i as detectGlobalInstallManagerByPresence,l as readPackageVersion,n as runGatewayUpdate,o as globalInstallArgs,r as cleanupGlobalRenameDirs,s as resolveGlobalPackageRoot}from"./session-dirs-DHaoq7zc.js";import"./logging-DHa3jQN3.js";import{n as updateNpmInstalledPlugins,t as syncPluginsForUpdateChannel}from"./update-B5yKFeGO.js";import"./systemd-linger-CT-VHPB3.js";import"./health-format-iE_KYEwP.js";import{n as doctorCommand,t as selectStyled}from"./prompt-select-styled-BJPGccTJ.js";import{r as ensureCompletionCacheExists,t as checkShellCompletionStatus}from"./doctor-completion-CbF34DIH.js";import os from"node:os";import path from"node:path";import fs from"node:fs/promises";import{spawn,spawnSync}from"node:child_process";import{confirm,isCancel,spinner}from"@clack/prompts";function parseTimeoutMsOrExit(timeout){let timeoutMs=timeout?Number.parseInt(timeout,10)*1e3:void 0;return timeoutMs!==void 0&&(Number.isNaN(timeoutMs)||timeoutMs<=0)?(defaultRuntime.error(`--timeout must be a positive integer (seconds)`),defaultRuntime.exit(1),null):timeoutMs}const BUILDERFORCE_AGENTS_REPO_URL=`https://github.com/SeanHogg/Builderforce.ai.git`,MAX_LOG_CHARS=8e3,DEFAULT_PACKAGE_NAME=CORE_PACKAGE_NAME;function normalizeTag(value){if(!value)return null;let trimmed=value.trim();return trimmed?stripPackagePrefix(trimmed):null}function normalizeVersionTag(tag){let trimmed=tag.trim();if(!trimmed)return null;let cleaned=trimmed.startsWith(`v`)?trimmed.slice(1):trimmed;return parseSemver(cleaned)?cleaned:null}async function resolveTargetVersion(tag,timeoutMs){return normalizeVersionTag(tag)||((await fetchNpmTagVersion({tag,timeoutMs})).version??null)}async function isGitCheckout(root){try{return await fs.stat(path.join(root,`.git`)),!0}catch{return!1}}async function isCorePackage(root){return isCorePackageName(await readPackageName(root))}async function isEmptyDir(targetPath){try{return(await fs.readdir(targetPath)).length===0}catch{return!1}}function resolveGitInstallDir(){let override=process.env.BUILDERFORCE_AGENTS_GIT_DIR?.trim();return override?path.resolve(override):resolveDefaultGitDir()}function resolveDefaultGitDir(){return resolveStateDir(process.env,os.homedir)}function resolveNodeRunner(){let base=path.basename(process.execPath).toLowerCase();return base===`node`||base===`node.exe`?process.execPath:`node`}async function resolveUpdateRoot(){return await resolveBuilderForceAgentsPackageRoot({moduleUrl:import.meta.url,argv1:process.argv[1],cwd:process.cwd()})??process.cwd()}async function runUpdateStep(params){let command=params.argv.join(` `);params.progress?.onStepStart?.({name:params.name,command,index:0,total:0});let started=Date.now(),res=await runCommandWithTimeout(params.argv,{cwd:params.cwd,timeoutMs:params.timeoutMs}),durationMs=Date.now()-started,stderrTail=trimLogTail(res.stderr,MAX_LOG_CHARS);return params.progress?.onStepComplete?.({name:params.name,command,index:0,total:0,durationMs,exitCode:res.code,stderrTail}),{name:params.name,command,cwd:params.cwd??process.cwd(),durationMs,exitCode:res.code,stdoutTail:trimLogTail(res.stdout,MAX_LOG_CHARS),stderrTail}}async function ensureGitCheckout(params){if(!await pathExists(params.dir))return await runUpdateStep({name:`git clone`,argv:[`git`,`clone`,BUILDERFORCE_AGENTS_REPO_URL,params.dir],timeoutMs:params.timeoutMs,progress:params.progress});if(!await isGitCheckout(params.dir)){if(!await isEmptyDir(params.dir))throw Error(`BUILDERFORCE_AGENTS_GIT_DIR points at a non-git directory: ${params.dir}. Set BUILDERFORCE_AGENTS_GIT_DIR to an empty folder or a builderforce checkout.`);return await runUpdateStep({name:`git clone`,argv:[`git`,`clone`,BUILDERFORCE_AGENTS_REPO_URL,params.dir],cwd:params.dir,timeoutMs:params.timeoutMs,progress:params.progress})}if(!await isCorePackage(params.dir))throw Error(`BUILDERFORCE_AGENTS_GIT_DIR does not look like a core checkout: ${params.dir}.`);return null}async function resolveGlobalManager(params){let runCommand=async(argv,options)=>{let res=await runCommandWithTimeout(argv,options);return{stdout:res.stdout,stderr:res.stderr,code:res.code}};if(params.installKind===`package`){let detected=await detectGlobalInstallManagerForRoot(runCommand,params.root,params.timeoutMs);if(detected)return detected}return await detectGlobalInstallManagerByPresence(runCommand,params.timeoutMs)??`npm`}async function tryWriteCompletionCache(root,jsonMode){let binPath=path.join(root,`builderforce.mjs`);if(!await pathExists(binPath))return;let result=spawnSync(resolveNodeRunner(),[binPath,`completion`,`--write-state`],{cwd:root,env:process.env,encoding:`utf-8`});if(result.error){jsonMode||defaultRuntime.log(theme.warn(`Completion cache update failed: ${String(result.error)}`));return}if(result.status!==0&&!jsonMode){let stderr=(result.stderr??``).toString().trim(),detail=stderr?` (${stderr})`:``;defaultRuntime.log(theme.warn(`Completion cache update failed${detail}.`))}}function formatGitStatusLine(params){let shortSha=params.sha?params.sha.slice(0,8):null,branch=params.branch&¶ms.branch!==`HEAD`?params.branch:null,tag=params.tag;return[branch??(tag?`detached`:`git`),tag?`tag ${tag}`:null,shortSha?`@ ${shortSha}`:null].filter(Boolean).join(` · `)}async function updateStatusCommand(opts){let timeoutMs=parseTimeoutMsOrExit(opts.timeout);if(timeoutMs===null)return;let root=await resolveUpdateRoot(),configSnapshot=await readConfigFileSnapshot(),configChannel=configSnapshot.valid?normalizeUpdateChannel(configSnapshot.config.update?.channel):null,update=await checkUpdateStatus({root,timeoutMs:timeoutMs??3500,fetchGit:!0,includeRegistry:!0}),channelInfo=resolveUpdateChannelDisplay({configChannel,installKind:update.installKind,gitTag:update.git?.tag??null,gitBranch:update.git?.branch??null}),channelLabel=channelInfo.label,gitLabel=update.installKind===`git`?formatGitStatusLine({branch:update.git?.branch??null,tag:update.git?.tag??null,sha:update.git?.sha??null}):null,updateAvailability=resolveUpdateAvailability(update),updateLine=formatUpdateOneLiner(update).replace(/^Update:\s*/i,``);if(opts.json){defaultRuntime.log(JSON.stringify({update,channel:{value:channelInfo.channel,source:channelInfo.source,label:channelLabel,config:configChannel},availability:updateAvailability},null,2));return}let tableWidth=Math.max(60,(process.stdout.columns??120)-1),rows=[{Item:`Install`,Value:update.installKind===`git`?`git (${update.root??`unknown`})`:update.installKind===`package`?update.packageManager:`unknown`},{Item:`Channel`,Value:channelLabel},...gitLabel?[{Item:`Git`,Value:gitLabel}]:[],{Item:`Update`,Value:updateAvailability.available?theme.warn(`available · ${updateLine}`):updateLine}];defaultRuntime.log(theme.heading(`BuilderForceAgents update status`)),defaultRuntime.log(``),defaultRuntime.log(renderTable({width:tableWidth,columns:[{key:`Item`,header:`Item`,minWidth:10},{key:`Value`,header:`Value`,flex:!0,minWidth:24}],rows}).trimEnd()),defaultRuntime.log(``);let updateHint=formatUpdateAvailableHint(update);updateHint&&defaultRuntime.log(theme.warn(updateHint))}const STEP_LABELS={"clean check":`Working directory is clean`,"upstream check":`Upstream branch exists`,"git fetch":`Fetching latest changes`,"git rebase":`Rebasing onto target commit`,"git rev-parse @{upstream}":`Resolving upstream commit`,"git rev-list":`Enumerating candidate commits`,"git clone":`Cloning git checkout`,"preflight worktree":`Preparing preflight worktree`,"preflight cleanup":`Cleaning preflight worktree`,"deps install":`Installing dependencies`,build:`Building`,"ui:build":`Building UI assets`,"ui:build (post-doctor repair)":`Restoring missing UI assets`,"ui assets verify":`Validating UI assets`,"builderforce doctor entry":`Checking doctor entrypoint`,"builderforce doctor":`Running doctor checks`,"git rev-parse HEAD (after)":`Verifying update`,"global update":`Updating via package manager`,"global install":`Installing global package`};function getStepLabel(step){return STEP_LABELS[step.name]??step.name}function createUpdateProgress(enabled){if(!enabled)return{progress:{},stop:()=>{}};let currentSpinner=null;return{progress:{onStepStart:step=>{currentSpinner=spinner(),currentSpinner.start(theme.accent(getStepLabel(step)))},onStepComplete:step=>{if(!currentSpinner)return;let label=getStepLabel(step),duration=theme.muted(`(${formatDurationPrecise(step.durationMs)})`),icon=step.exitCode===0?theme.success(`✓`):theme.error(`✗`);if(currentSpinner.stop(`${icon} ${label} ${duration}`),currentSpinner=null,step.exitCode!==0&&step.stderrTail){let lines=step.stderrTail.split(`
|
|
2
2
|
`).slice(-10);for(let line of lines)line.trim()&&defaultRuntime.log(` ${theme.error(line)}`)}}},stop:()=>{currentSpinner&&=(currentSpinner.stop(),null)}}}function formatStepStatus(exitCode){return exitCode===0?theme.success(`✓`):exitCode===null?theme.warn(`?`):theme.error(`✗`)}function printResult(result,opts){if(opts.json){defaultRuntime.log(JSON.stringify(result,null,2));return}let statusColor=result.status===`ok`?theme.success:result.status===`skipped`?theme.warn:theme.error;if(defaultRuntime.log(``),defaultRuntime.log(`${theme.heading(`Update Result:`)} ${statusColor(result.status.toUpperCase())}`),result.root&&defaultRuntime.log(` Root: ${theme.muted(result.root)}`),result.reason&&defaultRuntime.log(` Reason: ${theme.muted(result.reason)}`),result.before?.version||result.before?.sha){let before=result.before.version??result.before.sha?.slice(0,8)??``;defaultRuntime.log(` Before: ${theme.muted(before)}`)}if(result.after?.version||result.after?.sha){let after=result.after.version??result.after.sha?.slice(0,8)??``;defaultRuntime.log(` After: ${theme.muted(after)}`)}if(!opts.hideSteps&&result.steps.length>0){defaultRuntime.log(``),defaultRuntime.log(theme.heading(`Steps:`));for(let step of result.steps){let status=formatStepStatus(step.exitCode),duration=theme.muted(`(${formatDurationPrecise(step.durationMs)})`);if(defaultRuntime.log(` ${status} ${step.name} ${duration}`),step.exitCode!==0&&step.stderrTail){let lines=step.stderrTail.split(`
|
|
3
3
|
`).slice(0,5);for(let line of lines)line.trim()&&defaultRuntime.log(` ${theme.error(line)}`)}}}defaultRuntime.log(``),defaultRuntime.log(`Total time: ${theme.muted(formatDurationPrecise(result.durationMs))}`)}function shellEscape(value){return value.replace(/'/g,`'\\''`)}function isBatchSafe(value){return/^[A-Za-z0-9 _\-().]+$/.test(value)}function resolveSystemdUnit(env){let override=env.BUILDERFORCE_AGENTS_SYSTEMD_UNIT?.trim();return override?override.endsWith(`.service`)?override:`${override}.service`:`${resolveGatewaySystemdServiceName(env.BUILDERFORCE_AGENTS_PROFILE)}.service`}function resolveLaunchdLabel(env){return env.BUILDERFORCE_AGENTS_LAUNCHD_LABEL?.trim()||resolveGatewayLaunchAgentLabel(env.BUILDERFORCE_AGENTS_PROFILE)}function resolveWindowsTaskName(env){return env.BUILDERFORCE_AGENTS_WINDOWS_TASK_NAME?.trim()||resolveGatewayWindowsTaskName(env.BUILDERFORCE_AGENTS_PROFILE)}async function prepareRestartScript(env=process.env){let tmpDir=os.tmpdir(),timestamp=Date.now(),platform=process.platform,scriptContent=``,filename=``;try{if(platform===`linux`){let escaped=shellEscape(resolveSystemdUnit(env));filename=`builderforce-restart-${timestamp}.sh`,scriptContent=`#!/bin/sh
|
|
4
4
|
# Standalone restart script — survives parent process termination.
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{g as resolveStateDir}from"./paths-BHg-VHB4.js";import"./registry-Cv7CoWAs.js";import{h as pathExists,z as theme}from"./utils-BP60e80M.js";import{p as defaultRuntime}from"./subsystem-C4b1Von0.js";import"./boolean-ssGoaBPk.js";import"./env-BoE8QSib.js";import"./warning-filter-nSTjpMIH.js";import"./auth-profiles-C1VbcUOm.js";import{n as replaceCliName,r as resolveCliName,t as formatCliCommand}from"./command-format-DTMaGKs7.js";import"./src-DvWaTze9.js";import"./logger-wuOr7HKl.js";import"./session-key-CksCYipj.js";import{a as isCorePackageName,o as stripPackagePrefix,r as CORE_PACKAGE_NAME,t as resolveBuilderForceAgentsPackageRoot}from"./builderforce-root-DY1qbWNX.js";import{t as runCommandWithTimeout}from"./exec-COgsU9ql.js";import"./agent-scope-CufEmNj_.js";import"./env-file-DeS6x2OL.js";import"./src-HrLX5bhG.js";import{a as readConfigFileSnapshot,c as writeConfigFile}from"./io-CohJffHG.js";import"./manifest-registry-009gLJ4l.js";import"./config-toczWD3q.js";import"./model-discovery-C9Xm95uL.js";import"./model-catalog-CiiFJX77.js";import"./frontmatter-CaY7feZm.js";import"./skills-D3MwwPOH.js";import"./plugin-skills-pSFUbhg_.js";import"./skills-status-CGlKz1D1.js";import"./refresh-C4vwneXT.js";import"./client-CGgp3zkQ.js";import"./call-DmAU4cRX.js";import"./message-channel-z5YRpR2d.js";import{xr as trimLogTail}from"./subagent-registry-CyGxu3kP.js";import"./sessions-Bl1wwotX.js";import"./project-context-store-CIUcwUP_.js";import"./tokens-CFKkpUIu.js";import"./plugins-1Mn6RiNf.js";import"./accounts-BkTLjSrD.js";import"./bindings-CKSDlQ1i.js";import"./send-BvroeIQ6.js";import"./send-CceNWtYE.js";import"./with-timeout-T07SJo4N.js";import"./deliver-BuZu68tp.js";import"./accounts-Cx82nj4E.js";import"./send-ByCVQQVz.js";import"./image-ops-CotJhwRR.js";import"./redact-CgO7wehS.js";import"./errors-tAt19c1E.js";import"./embedded-helpers-DK8_apW0.js";import"./sandbox-z9t_PRf9.js";import"./chrome-BnEbJV3D.js";import"./tailscale-DV-yOmYe.js";import"./auth-ChecwOXS.js";import"./server-context-owOmmyUM.js";import"./routes-lclJHOYY.js";import"./paths-BnOjueoX.js";import"./ssrf-DJXLYZ0d.js";import"./store-DHD2IEgd.js";import"./ports-DTku9NSx.js";import"./trash-C3zmJ_O7.js";import"./accounts-DcoaLXKI.js";import"./paths-ClsbsPQP.js";import"./tool-images-CCpqFtrL.js";import"./workspace-waBqRxiy.js";import"./reply-prefix-Cg7AqaK0.js";import{c as resolveGatewayLaunchAgentLabel,d as resolveGatewaySystemdServiceName,f as resolveGatewayWindowsTaskName}from"./constants-D2th5NXV.js";import"./sqlite-CIGM1WKg.js";import"./memory-cli-ivAs7q7v.js";import"./manager-CRba8roB.js";import"./gemini-auth-CkD5jCPh.js";import"./retry-B151Hej5.js";import"./common-BfwMxpLu.js";import"./runner-DwWmciCt.js";import"./tool-display-Cs4hDP1f.js";import"./chunk-Dly7lM4r.js";import"./markdown-tables-B1Rx8hv6.js";import"./fetch-guard-DnXqPKae.js";import"./fetch-Cn_THzz8.js";import"./ir-CSdQJPqu.js";import"./render-DlHYsbvQ.js";import"./builderforcellm-syscheck-CprBhARf.js";import"./session-utils-GMvum00v.js";import"./coding-tools.policy-NEPm7Mz1.js";import"./pairing-store-QDb6lhIU.js";import"./fetch-DnWD6ydH.js";import"./exec-approvals-D7ZPAZpt.js";import"./nodes-screen-D6GHv_S0.js";import{r as formatDurationPrecise}from"./format-duration-HN2dpHE0.js";import"./session-cost-usage-S0nkbPoW.js";import"./usage-format-5sp5AMSu.js";import"./provider-usage-Bn4ZrnU7.js";import"./send-B_1BtyfA.js";import"./outbound-attachment-BaTYE4qp.js";import"./delivery-queue-Cp3t4Upn.js";import"./project-context-D3Mx4maV.js";import"./control-service-CJuuqNOE.js";import"./stagger-CRe77dWL.js";import"./channel-selection-BLwXhb9t.js";import"./send-UFtylOiq.js";import"./resolve-route-DEIW5uKy.js";import"./channel-activity-DX36RadH.js";import"./tables-CojSfTth.js";import{t as formatDocsLink}from"./links-BKzP7VVP.js";import"./cli-utils-C9pW69LF.js";import{t as formatHelpExamples}from"./help-format-CfFf-w62.js";import"./progress-Cqb-jAjT.js";import"./replies-DbkT_5BV.js";import"./onboard-helpers-CckrS8_K.js";import{n as stylePromptMessage}from"./prompt-style-BMWmaqSC.js";import"./pairing-labels-3j_iRYOO.js";import"./active-listener-Di9e1YAD.js";import"./mamba-state-engine-CV4nDcCk.js";import"./transformers-stream-Buj40qHl.js";import{n as inheritOptionFromParent}from"./command-options-DbMbMxM2.js";import"./catalog-li4bSIE2.js";import"./note-DgDXuE0F.js";import"./helpers-DPPVplyk.js";import"./plugin-auto-enable-BV9K9Vhr.js";import"./install-safe-path-ObPl6zIf.js";import"./npm-registry-spec-BV1VDmuN.js";import"./skill-scanner-DEmbPsRh.js";import"./installs-CWd54ARy.js";import"./channels-status-issues-NLYb8w9i.js";import"./register.subclis-EScCVgbV.js";import"./command-registry-CDcuHGpx.js";import"./program-context-Wpc-6CdI.js";import{n as installCompletion}from"./completion-cli-Do4vXo1k.js";import"./daemon-runtime-B4UjqdyJ.js";import{r as parseSemver}from"./runtime-guard-Bi8k55v9.js";import"./systemd-DdVd5Yet.js";import{t as resolveGatewayService}from"./service-EKJG69M3.js";import"./lifecycle-core-BpMvDXy1.js";import"./diagnostics-DamNPi4e.js";import{o as runDaemonRestart}from"./daemon-cli-DyVsMf8p.js";import{t as renderTable}from"./table-BFCCZDsp.js";import"./health-DVo8a9yg.js";import"./control-ui-assets-BxgWcomx.js";import{_ as resolveUpdateChannelDisplay,c as DEFAULT_GIT_CHANNEL,d as channelToNpmTag,f as formatUpdateChannelLabel,g as resolveEffectiveUpdateChannel,h as normalizeUpdateChannel,l as DEFAULT_PACKAGE_CHANNEL,n as compareSemverStrings,o as resolveNpmChannelTag,r as fetchNpmTagVersion,t as checkUpdateStatus}from"./update-check-B0YqSZJr.js";import"./dm-policy-shared-CRZpjRv0.js";import{i as resolveUpdateAvailability,n as formatUpdateOneLiner,t as formatUpdateAvailableHint}from"./status.update-KYyRSDZY.js";import{a as detectGlobalInstallManagerForRoot,c as readPackageName,i as detectGlobalInstallManagerByPresence,l as readPackageVersion,n as runGatewayUpdate,o as globalInstallArgs,r as cleanupGlobalRenameDirs,s as resolveGlobalPackageRoot}from"./session-dirs-OxQuIvJW.js";import"./logging-ayt7F7vy.js";import{n as updateNpmInstalledPlugins,t as syncPluginsForUpdateChannel}from"./update-D6U-V8Au.js";import"./systemd-linger-CPKngdUf.js";import"./health-format-D4MaIjaG.js";import{n as doctorCommand,t as selectStyled}from"./prompt-select-styled-Bu7WPMzB.js";import{r as ensureCompletionCacheExists,t as checkShellCompletionStatus}from"./doctor-completion-BjBTLcoC.js";import{spawn,spawnSync}from"node:child_process";import os from"node:os";import path from"node:path";import fs from"node:fs/promises";import{confirm,isCancel,spinner}from"@clack/prompts";function parseTimeoutMsOrExit(timeout){let timeoutMs=timeout?Number.parseInt(timeout,10)*1e3:void 0;return timeoutMs!==void 0&&(Number.isNaN(timeoutMs)||timeoutMs<=0)?(defaultRuntime.error(`--timeout must be a positive integer (seconds)`),defaultRuntime.exit(1),null):timeoutMs}const BUILDERFORCE_AGENTS_REPO_URL=`https://github.com/SeanHogg/Builderforce.ai.git`,MAX_LOG_CHARS=8e3,DEFAULT_PACKAGE_NAME=CORE_PACKAGE_NAME;function normalizeTag(value){if(!value)return null;let trimmed=value.trim();return trimmed?stripPackagePrefix(trimmed):null}function normalizeVersionTag(tag){let trimmed=tag.trim();if(!trimmed)return null;let cleaned=trimmed.startsWith(`v`)?trimmed.slice(1):trimmed;return parseSemver(cleaned)?cleaned:null}async function resolveTargetVersion(tag,timeoutMs){return normalizeVersionTag(tag)||((await fetchNpmTagVersion({tag,timeoutMs})).version??null)}async function isGitCheckout(root){try{return await fs.stat(path.join(root,`.git`)),!0}catch{return!1}}async function isCorePackage(root){return isCorePackageName(await readPackageName(root))}async function isEmptyDir(targetPath){try{return(await fs.readdir(targetPath)).length===0}catch{return!1}}function resolveGitInstallDir(){let override=process.env.BUILDERFORCE_AGENTS_GIT_DIR?.trim();return override?path.resolve(override):resolveDefaultGitDir()}function resolveDefaultGitDir(){return resolveStateDir(process.env,os.homedir)}function resolveNodeRunner(){let base=path.basename(process.execPath).toLowerCase();return base===`node`||base===`node.exe`?process.execPath:`node`}async function resolveUpdateRoot(){return await resolveBuilderForceAgentsPackageRoot({moduleUrl:import.meta.url,argv1:process.argv[1],cwd:process.cwd()})??process.cwd()}async function runUpdateStep(params){let command=params.argv.join(` `);params.progress?.onStepStart?.({name:params.name,command,index:0,total:0});let started=Date.now(),res=await runCommandWithTimeout(params.argv,{cwd:params.cwd,timeoutMs:params.timeoutMs}),durationMs=Date.now()-started,stderrTail=trimLogTail(res.stderr,MAX_LOG_CHARS);return params.progress?.onStepComplete?.({name:params.name,command,index:0,total:0,durationMs,exitCode:res.code,stderrTail}),{name:params.name,command,cwd:params.cwd??process.cwd(),durationMs,exitCode:res.code,stdoutTail:trimLogTail(res.stdout,MAX_LOG_CHARS),stderrTail}}async function ensureGitCheckout(params){if(!await pathExists(params.dir))return await runUpdateStep({name:`git clone`,argv:[`git`,`clone`,BUILDERFORCE_AGENTS_REPO_URL,params.dir],timeoutMs:params.timeoutMs,progress:params.progress});if(!await isGitCheckout(params.dir)){if(!await isEmptyDir(params.dir))throw Error(`BUILDERFORCE_AGENTS_GIT_DIR points at a non-git directory: ${params.dir}. Set BUILDERFORCE_AGENTS_GIT_DIR to an empty folder or a builderforce checkout.`);return await runUpdateStep({name:`git clone`,argv:[`git`,`clone`,BUILDERFORCE_AGENTS_REPO_URL,params.dir],cwd:params.dir,timeoutMs:params.timeoutMs,progress:params.progress})}if(!await isCorePackage(params.dir))throw Error(`BUILDERFORCE_AGENTS_GIT_DIR does not look like a core checkout: ${params.dir}.`);return null}async function resolveGlobalManager(params){let runCommand=async(argv,options)=>{let res=await runCommandWithTimeout(argv,options);return{stdout:res.stdout,stderr:res.stderr,code:res.code}};if(params.installKind===`package`){let detected=await detectGlobalInstallManagerForRoot(runCommand,params.root,params.timeoutMs);if(detected)return detected}return await detectGlobalInstallManagerByPresence(runCommand,params.timeoutMs)??`npm`}async function tryWriteCompletionCache(root,jsonMode){let binPath=path.join(root,`builderforce.mjs`);if(!await pathExists(binPath))return;let result=spawnSync(resolveNodeRunner(),[binPath,`completion`,`--write-state`],{cwd:root,env:process.env,encoding:`utf-8`});if(result.error){jsonMode||defaultRuntime.log(theme.warn(`Completion cache update failed: ${String(result.error)}`));return}if(result.status!==0&&!jsonMode){let stderr=(result.stderr??``).toString().trim(),detail=stderr?` (${stderr})`:``;defaultRuntime.log(theme.warn(`Completion cache update failed${detail}.`))}}function formatGitStatusLine(params){let shortSha=params.sha?params.sha.slice(0,8):null,branch=params.branch&¶ms.branch!==`HEAD`?params.branch:null,tag=params.tag;return[branch??(tag?`detached`:`git`),tag?`tag ${tag}`:null,shortSha?`@ ${shortSha}`:null].filter(Boolean).join(` · `)}async function updateStatusCommand(opts){let timeoutMs=parseTimeoutMsOrExit(opts.timeout);if(timeoutMs===null)return;let root=await resolveUpdateRoot(),configSnapshot=await readConfigFileSnapshot(),configChannel=configSnapshot.valid?normalizeUpdateChannel(configSnapshot.config.update?.channel):null,update=await checkUpdateStatus({root,timeoutMs:timeoutMs??3500,fetchGit:!0,includeRegistry:!0}),channelInfo=resolveUpdateChannelDisplay({configChannel,installKind:update.installKind,gitTag:update.git?.tag??null,gitBranch:update.git?.branch??null}),channelLabel=channelInfo.label,gitLabel=update.installKind===`git`?formatGitStatusLine({branch:update.git?.branch??null,tag:update.git?.tag??null,sha:update.git?.sha??null}):null,updateAvailability=resolveUpdateAvailability(update),updateLine=formatUpdateOneLiner(update).replace(/^Update:\s*/i,``);if(opts.json){defaultRuntime.log(JSON.stringify({update,channel:{value:channelInfo.channel,source:channelInfo.source,label:channelLabel,config:configChannel},availability:updateAvailability},null,2));return}let tableWidth=Math.max(60,(process.stdout.columns??120)-1),rows=[{Item:`Install`,Value:update.installKind===`git`?`git (${update.root??`unknown`})`:update.installKind===`package`?update.packageManager:`unknown`},{Item:`Channel`,Value:channelLabel},...gitLabel?[{Item:`Git`,Value:gitLabel}]:[],{Item:`Update`,Value:updateAvailability.available?theme.warn(`available · ${updateLine}`):updateLine}];defaultRuntime.log(theme.heading(`BuilderForceAgents update status`)),defaultRuntime.log(``),defaultRuntime.log(renderTable({width:tableWidth,columns:[{key:`Item`,header:`Item`,minWidth:10},{key:`Value`,header:`Value`,flex:!0,minWidth:24}],rows}).trimEnd()),defaultRuntime.log(``);let updateHint=formatUpdateAvailableHint(update);updateHint&&defaultRuntime.log(theme.warn(updateHint))}const STEP_LABELS={"clean check":`Working directory is clean`,"upstream check":`Upstream branch exists`,"git fetch":`Fetching latest changes`,"git rebase":`Rebasing onto target commit`,"git rev-parse @{upstream}":`Resolving upstream commit`,"git rev-list":`Enumerating candidate commits`,"git clone":`Cloning git checkout`,"preflight worktree":`Preparing preflight worktree`,"preflight cleanup":`Cleaning preflight worktree`,"deps install":`Installing dependencies`,build:`Building`,"ui:build":`Building UI assets`,"ui:build (post-doctor repair)":`Restoring missing UI assets`,"ui assets verify":`Validating UI assets`,"builderforce doctor entry":`Checking doctor entrypoint`,"builderforce doctor":`Running doctor checks`,"git rev-parse HEAD (after)":`Verifying update`,"global update":`Updating via package manager`,"global install":`Installing global package`};function getStepLabel(step){return STEP_LABELS[step.name]??step.name}function createUpdateProgress(enabled){if(!enabled)return{progress:{},stop:()=>{}};let currentSpinner=null;return{progress:{onStepStart:step=>{currentSpinner=spinner(),currentSpinner.start(theme.accent(getStepLabel(step)))},onStepComplete:step=>{if(!currentSpinner)return;let label=getStepLabel(step),duration=theme.muted(`(${formatDurationPrecise(step.durationMs)})`),icon=step.exitCode===0?theme.success(`✓`):theme.error(`✗`);if(currentSpinner.stop(`${icon} ${label} ${duration}`),currentSpinner=null,step.exitCode!==0&&step.stderrTail){let lines=step.stderrTail.split(`
|
|
1
|
+
import{g as resolveStateDir}from"./paths-BHg-VHB4.js";import"./registry-Cv7CoWAs.js";import{h as pathExists,z as theme}from"./utils-BP60e80M.js";import{p as defaultRuntime}from"./subsystem-C4b1Von0.js";import"./boolean-ssGoaBPk.js";import"./env-BoE8QSib.js";import"./warning-filter-nSTjpMIH.js";import"./auth-profiles-pt7Tr4HA.js";import{n as replaceCliName,r as resolveCliName,t as formatCliCommand}from"./command-format-DTMaGKs7.js";import"./src-DvWaTze9.js";import"./logger-wuOr7HKl.js";import"./session-key-CksCYipj.js";import{a as isCorePackageName,o as stripPackagePrefix,r as CORE_PACKAGE_NAME,t as resolveBuilderForceAgentsPackageRoot}from"./builderforce-root-DY1qbWNX.js";import{t as runCommandWithTimeout}from"./exec-COgsU9ql.js";import"./agent-scope-CufEmNj_.js";import"./env-file-DeS6x2OL.js";import"./src-HrLX5bhG.js";import{a as readConfigFileSnapshot,c as writeConfigFile}from"./io-D9hC2aG0.js";import"./manifest-registry-009gLJ4l.js";import"./config-BpChMIJ6.js";import"./model-discovery-D0i1JpiL.js";import"./model-catalog-BeBXvbFm.js";import"./frontmatter-CaY7feZm.js";import"./skills-D3MwwPOH.js";import"./plugin-skills-pSFUbhg_.js";import"./skills-status-CGlKz1D1.js";import"./refresh-C4vwneXT.js";import"./client-CGgp3zkQ.js";import"./call-Du2LiaX6.js";import"./message-channel-z5YRpR2d.js";import{xr as trimLogTail}from"./subagent-registry-DDEN4oJi.js";import"./sessions-BA8Se_bT.js";import"./project-context-store-CIUcwUP_.js";import"./tokens-CFKkpUIu.js";import"./plugins-1Mn6RiNf.js";import"./accounts-BkTLjSrD.js";import"./bindings-CKSDlQ1i.js";import"./send-B7H8Ae5j.js";import"./send-DqR7Rxzm.js";import"./with-timeout-B_p5pWDv.js";import"./deliver-CsG0cHbZ.js";import"./accounts-Cx82nj4E.js";import"./send-KgN1P41U.js";import"./image-ops-CotJhwRR.js";import"./redact-CgO7wehS.js";import"./errors-tAt19c1E.js";import"./embedded-helpers-DdU30lmt.js";import"./sandbox-DvKMuAXL.js";import"./chrome-CFmcixaE.js";import"./tailscale-DV-yOmYe.js";import"./auth-ChecwOXS.js";import"./server-context-CttALzrW.js";import"./routes-_iZdG1Fo.js";import"./paths-BnOjueoX.js";import"./ssrf-DJXLYZ0d.js";import"./store-DHD2IEgd.js";import"./ports-DTku9NSx.js";import"./trash-C3zmJ_O7.js";import"./accounts-DcoaLXKI.js";import"./paths-ClsbsPQP.js";import"./tool-images-CCpqFtrL.js";import"./workspace-waBqRxiy.js";import"./reply-prefix-Cg7AqaK0.js";import{c as resolveGatewayLaunchAgentLabel,d as resolveGatewaySystemdServiceName,f as resolveGatewayWindowsTaskName}from"./constants-D2th5NXV.js";import"./sqlite-CIGM1WKg.js";import"./memory-cli-CveeVOWH.js";import"./manager-BeohB4-8.js";import"./gemini-auth-DDR12zst.js";import"./retry-B151Hej5.js";import"./common-BfwMxpLu.js";import"./runner-Cu9NJouV.js";import"./tool-display-Cs4hDP1f.js";import"./chunk-Dly7lM4r.js";import"./markdown-tables-B1Rx8hv6.js";import"./fetch-guard-DnXqPKae.js";import"./fetch-Cn_THzz8.js";import"./ir-CSdQJPqu.js";import"./render-DlHYsbvQ.js";import"./builderforcellm-syscheck-9ksvqHYX.js";import"./session-utils-Dxou8SbO.js";import"./coding-tools.policy-D9Ba8eDh.js";import"./pairing-store-YRy7EBgI.js";import"./fetch-DnWD6ydH.js";import"./exec-approvals-D7ZPAZpt.js";import"./nodes-screen-D6GHv_S0.js";import{r as formatDurationPrecise}from"./format-duration-HN2dpHE0.js";import"./session-cost-usage-S0nkbPoW.js";import"./usage-format-5sp5AMSu.js";import"./provider-usage-B8lFHp0K.js";import"./send-kkm_zrHQ.js";import"./outbound-attachment-BaTYE4qp.js";import"./delivery-queue-Cp3t4Upn.js";import"./project-context-D3Mx4maV.js";import"./control-service-2PkCt256.js";import"./stagger-CRe77dWL.js";import"./channel-selection-BLwXhb9t.js";import"./send-CYGOPcKq.js";import"./resolve-route-DEIW5uKy.js";import"./channel-activity-DX36RadH.js";import"./tables-CojSfTth.js";import{t as formatDocsLink}from"./links-BKzP7VVP.js";import"./cli-utils-C9pW69LF.js";import{t as formatHelpExamples}from"./help-format-CfFf-w62.js";import"./progress-Cqb-jAjT.js";import"./replies-BOGMDhSN.js";import"./onboard-helpers-Ce_c4Raj.js";import{n as stylePromptMessage}from"./prompt-style-BMWmaqSC.js";import"./pairing-labels-BJPrScRl.js";import"./active-listener-Di9e1YAD.js";import"./mamba-state-engine-CV4nDcCk.js";import"./transformers-stream-Buj40qHl.js";import{n as inheritOptionFromParent}from"./command-options-DbMbMxM2.js";import"./catalog-li4bSIE2.js";import"./note-DgDXuE0F.js";import"./helpers-DPPVplyk.js";import"./plugin-auto-enable-Cupr4wbt.js";import"./install-safe-path-ObPl6zIf.js";import"./npm-registry-spec-BV1VDmuN.js";import"./skill-scanner-OTLeRZ_p.js";import"./installs-B_t2YXgq.js";import"./channels-status-issues-NLYb8w9i.js";import"./register.subclis-pWn9XObB.js";import"./command-registry-B7uAoROP.js";import"./program-context-Wpc-6CdI.js";import{n as installCompletion}from"./completion-cli-n8UsdT91.js";import"./daemon-runtime-Dx800VUt.js";import{r as parseSemver}from"./runtime-guard-Bi8k55v9.js";import"./systemd-DdVd5Yet.js";import{t as resolveGatewayService}from"./service-EKJG69M3.js";import"./lifecycle-core-D9Dg5Qps.js";import"./diagnostics-DamNPi4e.js";import{o as runDaemonRestart}from"./daemon-cli-BNzthScZ.js";import{t as renderTable}from"./table-BFCCZDsp.js";import"./health-zrsgFZmR.js";import"./control-ui-assets-BxgWcomx.js";import{_ as resolveUpdateChannelDisplay,c as DEFAULT_GIT_CHANNEL,d as channelToNpmTag,f as formatUpdateChannelLabel,g as resolveEffectiveUpdateChannel,h as normalizeUpdateChannel,l as DEFAULT_PACKAGE_CHANNEL,n as compareSemverStrings,o as resolveNpmChannelTag,r as fetchNpmTagVersion,t as checkUpdateStatus}from"./update-check-B0YqSZJr.js";import"./dm-policy-shared-B9lW-AsK.js";import{i as resolveUpdateAvailability,n as formatUpdateOneLiner,t as formatUpdateAvailableHint}from"./status.update-hzMro-BT.js";import{a as detectGlobalInstallManagerForRoot,c as readPackageName,i as detectGlobalInstallManagerByPresence,l as readPackageVersion,n as runGatewayUpdate,o as globalInstallArgs,r as cleanupGlobalRenameDirs,s as resolveGlobalPackageRoot}from"./session-dirs-Bvbgw0GC.js";import"./logging-ayt7F7vy.js";import{n as updateNpmInstalledPlugins,t as syncPluginsForUpdateChannel}from"./update-DodoQDCk.js";import"./systemd-linger-CPKngdUf.js";import"./health-format-D4MaIjaG.js";import{n as doctorCommand,t as selectStyled}from"./prompt-select-styled-BK74z6FF.js";import{r as ensureCompletionCacheExists,t as checkShellCompletionStatus}from"./doctor-completion-94zme499.js";import{spawn,spawnSync}from"node:child_process";import os from"node:os";import path from"node:path";import fs from"node:fs/promises";import{confirm,isCancel,spinner}from"@clack/prompts";function parseTimeoutMsOrExit(timeout){let timeoutMs=timeout?Number.parseInt(timeout,10)*1e3:void 0;return timeoutMs!==void 0&&(Number.isNaN(timeoutMs)||timeoutMs<=0)?(defaultRuntime.error(`--timeout must be a positive integer (seconds)`),defaultRuntime.exit(1),null):timeoutMs}const BUILDERFORCE_AGENTS_REPO_URL=`https://github.com/SeanHogg/Builderforce.ai.git`,MAX_LOG_CHARS=8e3,DEFAULT_PACKAGE_NAME=CORE_PACKAGE_NAME;function normalizeTag(value){if(!value)return null;let trimmed=value.trim();return trimmed?stripPackagePrefix(trimmed):null}function normalizeVersionTag(tag){let trimmed=tag.trim();if(!trimmed)return null;let cleaned=trimmed.startsWith(`v`)?trimmed.slice(1):trimmed;return parseSemver(cleaned)?cleaned:null}async function resolveTargetVersion(tag,timeoutMs){return normalizeVersionTag(tag)||((await fetchNpmTagVersion({tag,timeoutMs})).version??null)}async function isGitCheckout(root){try{return await fs.stat(path.join(root,`.git`)),!0}catch{return!1}}async function isCorePackage(root){return isCorePackageName(await readPackageName(root))}async function isEmptyDir(targetPath){try{return(await fs.readdir(targetPath)).length===0}catch{return!1}}function resolveGitInstallDir(){let override=process.env.BUILDERFORCE_AGENTS_GIT_DIR?.trim();return override?path.resolve(override):resolveDefaultGitDir()}function resolveDefaultGitDir(){return resolveStateDir(process.env,os.homedir)}function resolveNodeRunner(){let base=path.basename(process.execPath).toLowerCase();return base===`node`||base===`node.exe`?process.execPath:`node`}async function resolveUpdateRoot(){return await resolveBuilderForceAgentsPackageRoot({moduleUrl:import.meta.url,argv1:process.argv[1],cwd:process.cwd()})??process.cwd()}async function runUpdateStep(params){let command=params.argv.join(` `);params.progress?.onStepStart?.({name:params.name,command,index:0,total:0});let started=Date.now(),res=await runCommandWithTimeout(params.argv,{cwd:params.cwd,timeoutMs:params.timeoutMs}),durationMs=Date.now()-started,stderrTail=trimLogTail(res.stderr,MAX_LOG_CHARS);return params.progress?.onStepComplete?.({name:params.name,command,index:0,total:0,durationMs,exitCode:res.code,stderrTail}),{name:params.name,command,cwd:params.cwd??process.cwd(),durationMs,exitCode:res.code,stdoutTail:trimLogTail(res.stdout,MAX_LOG_CHARS),stderrTail}}async function ensureGitCheckout(params){if(!await pathExists(params.dir))return await runUpdateStep({name:`git clone`,argv:[`git`,`clone`,BUILDERFORCE_AGENTS_REPO_URL,params.dir],timeoutMs:params.timeoutMs,progress:params.progress});if(!await isGitCheckout(params.dir)){if(!await isEmptyDir(params.dir))throw Error(`BUILDERFORCE_AGENTS_GIT_DIR points at a non-git directory: ${params.dir}. Set BUILDERFORCE_AGENTS_GIT_DIR to an empty folder or a builderforce checkout.`);return await runUpdateStep({name:`git clone`,argv:[`git`,`clone`,BUILDERFORCE_AGENTS_REPO_URL,params.dir],cwd:params.dir,timeoutMs:params.timeoutMs,progress:params.progress})}if(!await isCorePackage(params.dir))throw Error(`BUILDERFORCE_AGENTS_GIT_DIR does not look like a core checkout: ${params.dir}.`);return null}async function resolveGlobalManager(params){let runCommand=async(argv,options)=>{let res=await runCommandWithTimeout(argv,options);return{stdout:res.stdout,stderr:res.stderr,code:res.code}};if(params.installKind===`package`){let detected=await detectGlobalInstallManagerForRoot(runCommand,params.root,params.timeoutMs);if(detected)return detected}return await detectGlobalInstallManagerByPresence(runCommand,params.timeoutMs)??`npm`}async function tryWriteCompletionCache(root,jsonMode){let binPath=path.join(root,`builderforce.mjs`);if(!await pathExists(binPath))return;let result=spawnSync(resolveNodeRunner(),[binPath,`completion`,`--write-state`],{cwd:root,env:process.env,encoding:`utf-8`});if(result.error){jsonMode||defaultRuntime.log(theme.warn(`Completion cache update failed: ${String(result.error)}`));return}if(result.status!==0&&!jsonMode){let stderr=(result.stderr??``).toString().trim(),detail=stderr?` (${stderr})`:``;defaultRuntime.log(theme.warn(`Completion cache update failed${detail}.`))}}function formatGitStatusLine(params){let shortSha=params.sha?params.sha.slice(0,8):null,branch=params.branch&¶ms.branch!==`HEAD`?params.branch:null,tag=params.tag;return[branch??(tag?`detached`:`git`),tag?`tag ${tag}`:null,shortSha?`@ ${shortSha}`:null].filter(Boolean).join(` · `)}async function updateStatusCommand(opts){let timeoutMs=parseTimeoutMsOrExit(opts.timeout);if(timeoutMs===null)return;let root=await resolveUpdateRoot(),configSnapshot=await readConfigFileSnapshot(),configChannel=configSnapshot.valid?normalizeUpdateChannel(configSnapshot.config.update?.channel):null,update=await checkUpdateStatus({root,timeoutMs:timeoutMs??3500,fetchGit:!0,includeRegistry:!0}),channelInfo=resolveUpdateChannelDisplay({configChannel,installKind:update.installKind,gitTag:update.git?.tag??null,gitBranch:update.git?.branch??null}),channelLabel=channelInfo.label,gitLabel=update.installKind===`git`?formatGitStatusLine({branch:update.git?.branch??null,tag:update.git?.tag??null,sha:update.git?.sha??null}):null,updateAvailability=resolveUpdateAvailability(update),updateLine=formatUpdateOneLiner(update).replace(/^Update:\s*/i,``);if(opts.json){defaultRuntime.log(JSON.stringify({update,channel:{value:channelInfo.channel,source:channelInfo.source,label:channelLabel,config:configChannel},availability:updateAvailability},null,2));return}let tableWidth=Math.max(60,(process.stdout.columns??120)-1),rows=[{Item:`Install`,Value:update.installKind===`git`?`git (${update.root??`unknown`})`:update.installKind===`package`?update.packageManager:`unknown`},{Item:`Channel`,Value:channelLabel},...gitLabel?[{Item:`Git`,Value:gitLabel}]:[],{Item:`Update`,Value:updateAvailability.available?theme.warn(`available · ${updateLine}`):updateLine}];defaultRuntime.log(theme.heading(`BuilderForceAgents update status`)),defaultRuntime.log(``),defaultRuntime.log(renderTable({width:tableWidth,columns:[{key:`Item`,header:`Item`,minWidth:10},{key:`Value`,header:`Value`,flex:!0,minWidth:24}],rows}).trimEnd()),defaultRuntime.log(``);let updateHint=formatUpdateAvailableHint(update);updateHint&&defaultRuntime.log(theme.warn(updateHint))}const STEP_LABELS={"clean check":`Working directory is clean`,"upstream check":`Upstream branch exists`,"git fetch":`Fetching latest changes`,"git rebase":`Rebasing onto target commit`,"git rev-parse @{upstream}":`Resolving upstream commit`,"git rev-list":`Enumerating candidate commits`,"git clone":`Cloning git checkout`,"preflight worktree":`Preparing preflight worktree`,"preflight cleanup":`Cleaning preflight worktree`,"deps install":`Installing dependencies`,build:`Building`,"ui:build":`Building UI assets`,"ui:build (post-doctor repair)":`Restoring missing UI assets`,"ui assets verify":`Validating UI assets`,"builderforce doctor entry":`Checking doctor entrypoint`,"builderforce doctor":`Running doctor checks`,"git rev-parse HEAD (after)":`Verifying update`,"global update":`Updating via package manager`,"global install":`Installing global package`};function getStepLabel(step){return STEP_LABELS[step.name]??step.name}function createUpdateProgress(enabled){if(!enabled)return{progress:{},stop:()=>{}};let currentSpinner=null;return{progress:{onStepStart:step=>{currentSpinner=spinner(),currentSpinner.start(theme.accent(getStepLabel(step)))},onStepComplete:step=>{if(!currentSpinner)return;let label=getStepLabel(step),duration=theme.muted(`(${formatDurationPrecise(step.durationMs)})`),icon=step.exitCode===0?theme.success(`✓`):theme.error(`✗`);if(currentSpinner.stop(`${icon} ${label} ${duration}`),currentSpinner=null,step.exitCode!==0&&step.stderrTail){let lines=step.stderrTail.split(`
|
|
2
2
|
`).slice(-10);for(let line of lines)line.trim()&&defaultRuntime.log(` ${theme.error(line)}`)}}},stop:()=>{currentSpinner&&=(currentSpinner.stop(),null)}}}function formatStepStatus(exitCode){return exitCode===0?theme.success(`✓`):exitCode===null?theme.warn(`?`):theme.error(`✗`)}function printResult(result,opts){if(opts.json){defaultRuntime.log(JSON.stringify(result,null,2));return}let statusColor=result.status===`ok`?theme.success:result.status===`skipped`?theme.warn:theme.error;if(defaultRuntime.log(``),defaultRuntime.log(`${theme.heading(`Update Result:`)} ${statusColor(result.status.toUpperCase())}`),result.root&&defaultRuntime.log(` Root: ${theme.muted(result.root)}`),result.reason&&defaultRuntime.log(` Reason: ${theme.muted(result.reason)}`),result.before?.version||result.before?.sha){let before=result.before.version??result.before.sha?.slice(0,8)??``;defaultRuntime.log(` Before: ${theme.muted(before)}`)}if(result.after?.version||result.after?.sha){let after=result.after.version??result.after.sha?.slice(0,8)??``;defaultRuntime.log(` After: ${theme.muted(after)}`)}if(!opts.hideSteps&&result.steps.length>0){defaultRuntime.log(``),defaultRuntime.log(theme.heading(`Steps:`));for(let step of result.steps){let status=formatStepStatus(step.exitCode),duration=theme.muted(`(${formatDurationPrecise(step.durationMs)})`);if(defaultRuntime.log(` ${status} ${step.name} ${duration}`),step.exitCode!==0&&step.stderrTail){let lines=step.stderrTail.split(`
|
|
3
3
|
`).slice(0,5);for(let line of lines)line.trim()&&defaultRuntime.log(` ${theme.error(line)}`)}}}defaultRuntime.log(``),defaultRuntime.log(`Total time: ${theme.muted(formatDurationPrecise(result.durationMs))}`)}function shellEscape(value){return value.replace(/'/g,`'\\''`)}function isBatchSafe(value){return/^[A-Za-z0-9 _\-().]+$/.test(value)}function resolveSystemdUnit(env){let override=env.BUILDERFORCE_AGENTS_SYSTEMD_UNIT?.trim();return override?override.endsWith(`.service`)?override:`${override}.service`:`${resolveGatewaySystemdServiceName(env.BUILDERFORCE_AGENTS_PROFILE)}.service`}function resolveLaunchdLabel(env){return env.BUILDERFORCE_AGENTS_LAUNCHD_LABEL?.trim()||resolveGatewayLaunchAgentLabel(env.BUILDERFORCE_AGENTS_PROFILE)}function resolveWindowsTaskName(env){return env.BUILDERFORCE_AGENTS_WINDOWS_TASK_NAME?.trim()||resolveGatewayWindowsTaskName(env.BUILDERFORCE_AGENTS_PROFILE)}async function prepareRestartScript(env=process.env){let tmpDir=os.tmpdir(),timestamp=Date.now(),platform=process.platform,scriptContent=``,filename=``;try{if(platform===`linux`){let escaped=shellEscape(resolveSystemdUnit(env));filename=`builderforce-restart-${timestamp}.sh`,scriptContent=`#!/bin/sh
|
|
4
4
|
# Standalone restart script — survives parent process termination.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import"./paths-5FcIFMsj.js";import{B as theme}from"./utils-DbaBVFaK.js";import"./session-key-EoB0qaG9.js";import"./builderforce-root-D64_sXEi.js";import{i as defaultRuntime}from"./subsystem-B3TqcCrZ.js";import"./registry-TdK-aV05.js";import"./logger-Bch0bx9c.js";import"./exec-DdcIjeyn.js";import"./agent-scope-DPtjOxzp.js";import"./src-CA0fU67C.js";import"./model-selection-
|
|
1
|
+
import"./paths-5FcIFMsj.js";import{B as theme}from"./utils-DbaBVFaK.js";import"./session-key-EoB0qaG9.js";import"./builderforce-root-D64_sXEi.js";import{i as defaultRuntime}from"./subsystem-B3TqcCrZ.js";import"./registry-TdK-aV05.js";import"./logger-Bch0bx9c.js";import"./exec-DdcIjeyn.js";import"./agent-scope-DPtjOxzp.js";import"./src-CA0fU67C.js";import"./model-selection-DG9J_VTz.js";import"./env-file-D1MDi-AM.js";import"./boolean-Cnh1KNl1.js";import"./env-BIdU5BAp.js";import"./src-DTFqOIQD.js";import"./io-BLBq4T2o.js";import"./manifest-registry-BJCfNV1a.js";import"./config-BgV_FYSq.js";import"./fetch-DnVtDecb.js";import{n as formatUsageReportLines,t as loadProviderUsageSummary}from"./provider-usage-B-wPVN_j.js";function resolveGateway(){let url=process.env.BUILDERFORCE_GATEWAY_URL??process.env.BUILDERFORCE_URL,token=process.env.BUILDERFORCE_API_KEY;return!url||!token?null:{url:url.replace(/\/+$/,``),token}}async function fetchBuilderInsights(){let gw=resolveGateway();if(!gw)return null;try{let res=await fetch(`${gw.url}/llm/v1/builder-insights`,{headers:{authorization:`Bearer ${gw.token}`}});return res.ok?await res.json():null}catch{return null}}function formatBuilderInsightsLines(s){let lines=[`Workspace (gateway):`];return lines.push(` Tokens (${s.windowLabel}): ${s.todayTokens.toLocaleString()}`),lines.push(` Cost: $${s.todayCostUsd.toFixed(2)}`),lines.push(` % of daily cap: ${s.pctOfDailyCap==null?`no cap`:`${s.pctOfDailyCap}%${s.dailyCapTokens?` of ${s.dailyCapTokens.toLocaleString()}`:``}`}`),s.topModel&&lines.push(` Top model: ${s.topModel.model} (${s.topModel.tokens.toLocaleString()} tok)`),s.costPerMergedPrUsd!=null&&lines.push(` Cost / merged PR: $${s.costPerMergedPrUsd.toFixed(2)}`),s.tip&&lines.push(` Tip: ${s.tip}`),lines}function registerUsageCli(program){program.command(`usage`).description(`Show provider usage / quota (and workspace spend when a gateway is configured)`).option(`--json`,`Emit raw JSON instead of a formatted report`,!1).action(async opts=>{try{let summary=await loadProviderUsageSummary(),insights=await fetchBuilderInsights();if(opts.json){defaultRuntime.log(JSON.stringify({providers:summary,workspace:insights},null,2));return}for(let line of formatUsageReportLines(summary))defaultRuntime.log(line);if(insights){defaultRuntime.log(``);for(let line of formatBuilderInsightsLines(insights))defaultRuntime.log(line)}else resolveGateway()&&(defaultRuntime.log(``),defaultRuntime.log(theme.muted(`Workspace (gateway): unavailable.`)))}catch(err){defaultRuntime.error(String(err)),defaultRuntime.exit(1)}})}export{registerUsageCli};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import"./paths-BHg-VHB4.js";import"./registry-Cv7CoWAs.js";import{z as theme}from"./utils-BP60e80M.js";import{p as defaultRuntime}from"./subsystem-C4b1Von0.js";import"./boolean-ssGoaBPk.js";import"./env-BoE8QSib.js";import"./auth-profiles-
|
|
1
|
+
import"./paths-BHg-VHB4.js";import"./registry-Cv7CoWAs.js";import{z as theme}from"./utils-BP60e80M.js";import{p as defaultRuntime}from"./subsystem-C4b1Von0.js";import"./boolean-ssGoaBPk.js";import"./env-BoE8QSib.js";import"./auth-profiles-pt7Tr4HA.js";import"./src-DvWaTze9.js";import"./logger-wuOr7HKl.js";import"./session-key-CksCYipj.js";import"./builderforce-root-DY1qbWNX.js";import"./exec-COgsU9ql.js";import"./agent-scope-CufEmNj_.js";import"./env-file-DeS6x2OL.js";import"./src-HrLX5bhG.js";import"./io-D9hC2aG0.js";import"./manifest-registry-009gLJ4l.js";import"./config-BpChMIJ6.js";import"./fetch-DnWD6ydH.js";import{n as formatUsageReportLines,t as loadProviderUsageSummary}from"./provider-usage-B8lFHp0K.js";function resolveGateway(){let url=process.env.BUILDERFORCE_GATEWAY_URL??process.env.BUILDERFORCE_URL,token=process.env.BUILDERFORCE_API_KEY;return!url||!token?null:{url:url.replace(/\/+$/,``),token}}async function fetchBuilderInsights(){let gw=resolveGateway();if(!gw)return null;try{let res=await fetch(`${gw.url}/llm/v1/builder-insights`,{headers:{authorization:`Bearer ${gw.token}`}});return res.ok?await res.json():null}catch{return null}}function formatBuilderInsightsLines(s){let lines=[`Workspace (gateway):`];return lines.push(` Tokens (${s.windowLabel}): ${s.todayTokens.toLocaleString()}`),lines.push(` Cost: $${s.todayCostUsd.toFixed(2)}`),lines.push(` % of daily cap: ${s.pctOfDailyCap==null?`no cap`:`${s.pctOfDailyCap}%${s.dailyCapTokens?` of ${s.dailyCapTokens.toLocaleString()}`:``}`}`),s.topModel&&lines.push(` Top model: ${s.topModel.model} (${s.topModel.tokens.toLocaleString()} tok)`),s.costPerMergedPrUsd!=null&&lines.push(` Cost / merged PR: $${s.costPerMergedPrUsd.toFixed(2)}`),s.tip&&lines.push(` Tip: ${s.tip}`),lines}function registerUsageCli(program){program.command(`usage`).description(`Show provider usage / quota (and workspace spend when a gateway is configured)`).option(`--json`,`Emit raw JSON instead of a formatted report`,!1).action(async opts=>{try{let summary=await loadProviderUsageSummary(),insights=await fetchBuilderInsights();if(opts.json){defaultRuntime.log(JSON.stringify({providers:summary,workspace:insights},null,2));return}for(let line of formatUsageReportLines(summary))defaultRuntime.log(line);if(insights){defaultRuntime.log(``);for(let line of formatBuilderInsightsLines(insights))defaultRuntime.log(line)}else resolveGateway()&&(defaultRuntime.log(``),defaultRuntime.log(theme.muted(`Workspace (gateway): unavailable.`)))}catch(err){defaultRuntime.error(String(err)),defaultRuntime.exit(1)}})}export{registerUsageCli};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import"./paths-CAQcjxp2.js";import{i as buildAgentMainSessionKey,l as normalizeAgentId,o as buildGroupHistoryKey,r as DEFAULT_MAIN_KEY}from"./session-key-CYpYHc1e.js";import{A as normalizeE164,B as toWhatsappJid,G as logVerbose,J as shouldLogVerbose,N as resolveJidToE164,O as isSelfChatMode,R as sleep,b as clamp,et as getChildLogger,k as jidToE164}from"./registry-j1UKIotU.js";import"./agent-scope-C7zGN7Pz.js";import{r as defaultRuntime,t as createSubsystemLogger}from"./subsystem-ykSbyaud.js";import"./model-selection-BGEkWWV7.js";import{c as resolveIdentityNamePrefix,l as resolveMessagePrefix,t as createReplyPrefixOptions}from"./reply-prefix-CWwv5MP-.js";import{r as formatCliCommand}from"./env-44XUbLhk.js";import"./src-izs0XSXm.js";import{A as normalizeMentionText,C as createInboundDebouncer,D as hasControlCommand,E as resolveEnvelopeFormatOptions,O as shouldComputeCommandAuthorized,S as enqueueSystemEvent,T as formatInboundEnvelope,_ as normalizeGroupActivation,a as resolveMentionGating,b as readChannelAllowFromStore,c as recordPendingHistoryEntryIfEnabled,d as dispatchReplyWithBufferedBlockDispatcher,g as toLocationContext,h as formatLocationText,i as buildPairingReply,k as buildMentionRegexes,l as recordChannelActivity,m as getReplyFromConfig,n as computeBackoff,o as DEFAULT_GROUP_HISTORY_LIMIT,p as createDedupeCache,r as sleepWithAbort,s as buildHistoryContextFromEntries,u as shouldAckReactionForWhatsApp,v as parseActivationCommand,w as resolveInboundDebounceMs,x as upsertChannelPairingRequest,y as formatDurationPrecise}from"./embedded-cvG_LpfQ.js";import"./replies-CllKyBdY.js";import"./plugins-CjU7Ut5E.js";import{i as logWebSelfId,l as readWebSelfId,n as WA_WEB_AUTH_DIR,p as webAuthExists,r as getWebAuthAgeMs,s as pickWebChannel,t as resolveWhatsAppAccount}from"./accounts-xbnfJmsd.js";import"./bindings-6UAwilZE.js";import{At as readSessionUpdatedAt,Dn as saveMediaBuffer,Nt as updateLastRoute,c as registerUnhandledRejectionHandler,fn as resolveChannelGroupPolicy,hn as resolveGroupSessionKey,jt as recordSessionMetaFromInbound,kt as loadSessionStore,pn as resolveChannelGroupRequireMention}from"./runner-CviGu3Nk.js";import"./fetch-D2i2BBd3.js";import"./model-catalog-BTMhKeCz.js";import"./redact-xFefzy4M.js";import"./errors-CguQr0Ja.js";import{n as loadConfig}from"./config-C7baFOp1.js";import"./chrome-DUBgoZpO.js";import"./message-channel-BKGbjp9g.js";import{s as resolveStorePath}from"./paths-ZHayVsQS.js";import"./gemini-auth-eXEUozQC.js";import"./tool-images-B8YdlzZb.js";import"./sqlite-DDTPj41Y.js";import"./manager-C7WmOAX4.js";import"./common-CgaBYMHL.js";import{c as resolveChunkMode,i as chunkMarkdownTextWithMode,l as resolveTextChunkLimit}from"./chunk-BCl8axDo.js";import{n as resolveMarkdownTableMode}from"./markdown-tables-C-Z5_lwN.js";import{c as getAgentScopedMediaLocalRoots,o as loadWebMedia}from"./render-NRLMXKq3.js";import{t as finalizeInboundContext}from"./inbound-context-C3QX6t8E.js";import{i as convertMarkdownTables,r as setActiveWebListener}from"./active-listener-FQKmkr1L.js";import{n as resolveAgentRoute,t as buildAgentSessionKey}from"./resolve-route-D5Ptdm3e.js";import{i as markdownToWhatsApp,n as sendMessageWhatsApp,r as sendReactionWhatsApp}from"./outbound-JmV6INRK.js";import{i as waitForWaConnection,n as formatError,r as getStatusCode,t as createWaSocket}from"./session-DdbDbdLz.js";import{t as loginWeb}from"./login-Ieb7RHYd.js";import{randomUUID}from"node:crypto";import{getMaxListeners,setMaxListeners}from"node:events";import{DisconnectReason,downloadMediaMessage,extractMessageContent,getContentType,isJidGroup,normalizeMessageContent}from"@whiskeysockets/baileys";const DEFAULT_RECONNECT_POLICY={initialMs:2e3,maxMs:3e4,factor:1.8,jitter:.25,maxAttempts:12};function resolveHeartbeatSeconds(cfg,overrideSeconds){let candidate=overrideSeconds??cfg.web?.heartbeatSeconds;return typeof candidate==`number`&&candidate>0?candidate:60}function resolveReconnectPolicy(cfg,overrides){let reconnectOverrides=cfg.web?.reconnect??{},overrideConfig=overrides??{},merged={...DEFAULT_RECONNECT_POLICY,...reconnectOverrides,...overrideConfig};return merged.initialMs=Math.max(250,merged.initialMs),merged.maxMs=Math.max(merged.initialMs,merged.maxMs),merged.factor=clamp(merged.factor,1.1,10),merged.jitter=clamp(merged.jitter,0,1),merged.maxAttempts=Math.max(0,Math.floor(merged.maxAttempts)),merged}function newConnectionId(){return randomUUID()}const whatsappLog=createSubsystemLogger(`gateway/channels/whatsapp`),whatsappInboundLog=whatsappLog.child(`inbound`),whatsappOutboundLog=whatsappLog.child(`outbound`),whatsappHeartbeatLog=whatsappLog.child(`heartbeat`);function elide(text,limit=400){return!text||text.length<=limit?text:`${text.slice(0,limit)}… (truncated ${text.length-limit} chars)`}function isLikelyWhatsAppCryptoError(reason){let haystack=(reason instanceof Error?`${reason.message}\n${reason.stack??``}`:(value=>{if(value==null)return``;if(typeof value==`string`)return value;if(value instanceof Error)return`${value.message}\n${value.stack??``}`;if(typeof value==`object`)try{return JSON.stringify(value)}catch{return Object.prototype.toString.call(value)}return typeof value==`number`||typeof value==`boolean`||typeof value==`bigint`?String(value):typeof value==`symbol`?value.description??value.toString():typeof value==`function`?value.name?`[function ${value.name}]`:`[function]`:Object.prototype.toString.call(value)})(reason)).toLowerCase();return haystack.includes(`unsupported state or unable to authenticate data`)||haystack.includes(`bad mac`)?haystack.includes(`@whiskeysockets/baileys`)||haystack.includes(`baileys`)||haystack.includes(`noise-handler`)||haystack.includes(`aesdecryptgcm`):!1}function waitForever(){return setInterval(()=>{},1e6).unref(),new Promise(()=>{})}const recentInboundMessages=createDedupeCache({ttlMs:20*6e4,maxSize:5e3});function isRecentInboundMessage(key){return recentInboundMessages.check(key)}const ALLOWED_VCARD_KEYS=new Set([`FN`,`N`,`TEL`]);function parseVcard(vcard){if(!vcard)return{phones:[]};let lines=vcard.split(/\r?\n/),nameFromN,nameFromFn,phones=[];for(let rawLine of lines){let line=rawLine.trim();if(!line)continue;let colonIndex=line.indexOf(`:`);if(colonIndex===-1)continue;let key=line.slice(0,colonIndex).toUpperCase(),rawValue=line.slice(colonIndex+1).trim();if(!rawValue)continue;let baseKey=normalizeVcardKey(key);if(!baseKey||!ALLOWED_VCARD_KEYS.has(baseKey))continue;let value=cleanVcardValue(rawValue);if(value){if(baseKey===`FN`&&!nameFromFn){nameFromFn=normalizeVcardName(value);continue}if(baseKey===`N`&&!nameFromN){nameFromN=normalizeVcardName(value);continue}if(baseKey===`TEL`){let phone=normalizeVcardPhone(value);phone&&phones.push(phone)}}}return{name:nameFromFn??nameFromN,phones}}function normalizeVcardKey(key){let[primary]=key.split(`;`);if(!primary)return;let segments=primary.split(`.`);return segments[segments.length-1]||void 0}function cleanVcardValue(value){return value.replace(/\\n/gi,` `).replace(/\\,/g,`,`).replace(/\\;/g,`;`).trim()}function normalizeVcardName(value){return value.replace(/;/g,` `).replace(/\s+/g,` `).trim()}function normalizeVcardPhone(value){let trimmed=value.trim();return trimmed?trimmed.toLowerCase().startsWith(`tel:`)?trimmed.slice(4).trim():trimmed:``}function unwrapMessage$1(message){return normalizeMessageContent(message)}function extractContextInfo(message){if(!message)return;let contentType=getContentType(message),candidate=contentType?message[contentType]:void 0,contextInfo=candidate&&typeof candidate==`object`&&`contextInfo`in candidate?candidate.contextInfo:void 0;if(contextInfo)return contextInfo;let fallback=message.extendedTextMessage?.contextInfo??message.imageMessage?.contextInfo??message.videoMessage?.contextInfo??message.documentMessage?.contextInfo??message.audioMessage?.contextInfo??message.stickerMessage?.contextInfo??message.buttonsResponseMessage?.contextInfo??message.listResponseMessage?.contextInfo??message.templateButtonReplyMessage?.contextInfo??message.interactiveResponseMessage?.contextInfo??message.buttonsMessage?.contextInfo??message.listMessage?.contextInfo;if(fallback)return fallback;for(let value of Object.values(message)){if(!value||typeof value!=`object`||!(`contextInfo`in value))continue;let candidateContext=value.contextInfo;if(candidateContext)return candidateContext}}function extractMentionedJids(rawMessage){let message=unwrapMessage$1(rawMessage);if(!message)return;let flattened=[message.extendedTextMessage?.contextInfo?.mentionedJid,message.extendedTextMessage?.contextInfo?.quotedMessage?.extendedTextMessage?.contextInfo?.mentionedJid,message.imageMessage?.contextInfo?.mentionedJid,message.videoMessage?.contextInfo?.mentionedJid,message.documentMessage?.contextInfo?.mentionedJid,message.audioMessage?.contextInfo?.mentionedJid,message.stickerMessage?.contextInfo?.mentionedJid,message.buttonsResponseMessage?.contextInfo?.mentionedJid,message.listResponseMessage?.contextInfo?.mentionedJid].flatMap(arr=>arr??[]).filter(Boolean);if(flattened.length!==0)return Array.from(new Set(flattened))}function extractText(rawMessage){let message=unwrapMessage$1(rawMessage);if(!message)return;let extracted=extractMessageContent(message),candidates=[message,extracted&&extracted!==message?extracted:void 0];for(let candidate of candidates){if(!candidate)continue;if(typeof candidate.conversation==`string`&&candidate.conversation.trim())return candidate.conversation.trim();let extended=candidate.extendedTextMessage?.text;if(extended?.trim())return extended.trim();let caption=candidate.imageMessage?.caption??candidate.videoMessage?.caption??candidate.documentMessage?.caption;if(caption?.trim())return caption.trim()}let contactPlaceholder=extractContactPlaceholder(message)??(extracted&&extracted!==message?extractContactPlaceholder(extracted):void 0);if(contactPlaceholder)return contactPlaceholder}function extractMediaPlaceholder(rawMessage){let message=unwrapMessage$1(rawMessage);if(message){if(message.imageMessage)return`<media:image>`;if(message.videoMessage)return`<media:video>`;if(message.audioMessage)return`<media:audio>`;if(message.documentMessage)return`<media:document>`;if(message.stickerMessage)return`<media:sticker>`}}function extractContactPlaceholder(rawMessage){let message=unwrapMessage$1(rawMessage);if(!message)return;let contact=message.contactMessage??void 0;if(contact){let{name,phones}=describeContact({displayName:contact.displayName,vcard:contact.vcard});return formatContactPlaceholder(name,phones)}let contactsArray=message.contactsArrayMessage?.contacts??void 0;if(!(!contactsArray||contactsArray.length===0))return formatContactsPlaceholder(contactsArray.map(entry=>describeContact({displayName:entry.displayName,vcard:entry.vcard})).map(entry=>formatContactLabel(entry.name,entry.phones)).filter(value=>!!value),contactsArray.length)}function describeContact(input){let displayName=(input.displayName??``).trim(),parsed=parseVcard(input.vcard??void 0);return{name:displayName||parsed.name,phones:parsed.phones}}function formatContactPlaceholder(name,phones){let label=formatContactLabel(name,phones);return label?`<contact: ${label}>`:`<contact>`}function formatContactsPlaceholder(labels,total){let cleaned=labels.map(label=>label.trim()).filter(Boolean);if(cleaned.length===0)return`<contacts: ${total} ${total===1?`contact`:`contacts`}>`;let remaining=Math.max(total-cleaned.length,0),suffix=remaining>0?` +${remaining} more`:``;return`<contacts: ${cleaned.join(`, `)}${suffix}>`}function formatContactLabel(name,phones){let parts=[name,formatPhoneList(phones)].filter(value=>!!value);if(parts.length!==0)return parts.join(`, `)}function formatPhoneList(phones){let cleaned=phones?.map(phone=>phone.trim()).filter(Boolean)??[];if(cleaned.length===0)return;let{shown,remaining}=summarizeList(cleaned,cleaned.length,1),[primary]=shown;if(primary)return remaining===0?primary:`${primary} (+${remaining} more)`}function summarizeList(values,total,maxShown){let shown=values.slice(0,maxShown);return{shown,remaining:Math.max(total-shown.length,0)}}function extractLocationData(rawMessage){let message=unwrapMessage$1(rawMessage);if(!message)return null;let live=message.liveLocationMessage??void 0;if(live){let latitudeRaw=live.degreesLatitude,longitudeRaw=live.degreesLongitude;if(latitudeRaw!=null&&longitudeRaw!=null){let latitude=Number(latitudeRaw),longitude=Number(longitudeRaw);if(Number.isFinite(latitude)&&Number.isFinite(longitude))return{latitude,longitude,accuracy:live.accuracyInMeters??void 0,caption:live.caption??void 0,source:`live`,isLive:!0}}}let location=message.locationMessage??void 0;if(location){let latitudeRaw=location.degreesLatitude,longitudeRaw=location.degreesLongitude;if(latitudeRaw!=null&&longitudeRaw!=null){let latitude=Number(latitudeRaw),longitude=Number(longitudeRaw);if(Number.isFinite(latitude)&&Number.isFinite(longitude)){let isLive=!!location.isLive;return{latitude,longitude,accuracy:location.accuracyInMeters??void 0,name:location.name??void 0,address:location.address??void 0,caption:location.comment??void 0,source:isLive?`live`:location.name||location.address?`place`:`pin`,isLive}}}}return null}function describeReplyContext(rawMessage){let message=unwrapMessage$1(rawMessage);if(!message)return null;let contextInfo=extractContextInfo(message),quoted=normalizeMessageContent(contextInfo?.quotedMessage);if(!quoted)return null;let location=extractLocationData(quoted),locationText=location?formatLocationText(location):void 0,body=[extractText(quoted),locationText].filter(Boolean).join(`
|
|
1
|
+
import"./paths-CAQcjxp2.js";import{i as buildAgentMainSessionKey,l as normalizeAgentId,o as buildGroupHistoryKey,r as DEFAULT_MAIN_KEY}from"./session-key-CYpYHc1e.js";import{A as normalizeE164,B as toWhatsappJid,G as logVerbose,J as shouldLogVerbose,N as resolveJidToE164,O as isSelfChatMode,R as sleep,b as clamp,et as getChildLogger,k as jidToE164}from"./registry-j1UKIotU.js";import"./agent-scope-C7zGN7Pz.js";import{r as defaultRuntime,t as createSubsystemLogger}from"./subsystem-ykSbyaud.js";import"./model-selection-BGEkWWV7.js";import{c as resolveIdentityNamePrefix,l as resolveMessagePrefix,t as createReplyPrefixOptions}from"./reply-prefix-CWwv5MP-.js";import{r as formatCliCommand}from"./env-44XUbLhk.js";import"./src-izs0XSXm.js";import{A as normalizeMentionText,C as createInboundDebouncer,D as hasControlCommand,E as resolveEnvelopeFormatOptions,O as shouldComputeCommandAuthorized,S as enqueueSystemEvent,T as formatInboundEnvelope,_ as normalizeGroupActivation,a as resolveMentionGating,b as readChannelAllowFromStore,c as recordPendingHistoryEntryIfEnabled,d as dispatchReplyWithBufferedBlockDispatcher,g as toLocationContext,h as formatLocationText,i as buildPairingReply,k as buildMentionRegexes,l as recordChannelActivity,m as getReplyFromConfig,n as computeBackoff,o as DEFAULT_GROUP_HISTORY_LIMIT,p as createDedupeCache,r as sleepWithAbort,s as buildHistoryContextFromEntries,u as shouldAckReactionForWhatsApp,v as parseActivationCommand,w as resolveInboundDebounceMs,x as upsertChannelPairingRequest,y as formatDurationPrecise}from"./embedded-D-citLF2.js";import"./replies-CllKyBdY.js";import"./plugins-CjU7Ut5E.js";import{i as logWebSelfId,l as readWebSelfId,n as WA_WEB_AUTH_DIR,p as webAuthExists,r as getWebAuthAgeMs,s as pickWebChannel,t as resolveWhatsAppAccount}from"./accounts-xbnfJmsd.js";import"./bindings-6UAwilZE.js";import{At as readSessionUpdatedAt,Dn as saveMediaBuffer,Nt as updateLastRoute,c as registerUnhandledRejectionHandler,fn as resolveChannelGroupPolicy,hn as resolveGroupSessionKey,jt as recordSessionMetaFromInbound,kt as loadSessionStore,pn as resolveChannelGroupRequireMention}from"./runner-COldX-El.js";import"./fetch-D2i2BBd3.js";import"./model-catalog-BTMhKeCz.js";import"./redact-xFefzy4M.js";import"./errors-CguQr0Ja.js";import{n as loadConfig}from"./config-C7baFOp1.js";import"./chrome-Brg9KsB9.js";import"./message-channel-BKGbjp9g.js";import{s as resolveStorePath}from"./paths-ZHayVsQS.js";import"./gemini-auth-eXEUozQC.js";import"./tool-images-B8YdlzZb.js";import"./sqlite-DDTPj41Y.js";import"./manager-C7WmOAX4.js";import"./common-CgaBYMHL.js";import{c as resolveChunkMode,i as chunkMarkdownTextWithMode,l as resolveTextChunkLimit}from"./chunk-BCl8axDo.js";import{n as resolveMarkdownTableMode}from"./markdown-tables-C-Z5_lwN.js";import{c as getAgentScopedMediaLocalRoots,o as loadWebMedia}from"./render-NRLMXKq3.js";import{t as finalizeInboundContext}from"./inbound-context-C3QX6t8E.js";import{i as convertMarkdownTables,r as setActiveWebListener}from"./active-listener-FQKmkr1L.js";import{n as resolveAgentRoute,t as buildAgentSessionKey}from"./resolve-route-D5Ptdm3e.js";import{i as markdownToWhatsApp,n as sendMessageWhatsApp,r as sendReactionWhatsApp}from"./outbound-JmV6INRK.js";import{i as waitForWaConnection,n as formatError,r as getStatusCode,t as createWaSocket}from"./session-DdbDbdLz.js";import{t as loginWeb}from"./login-Ieb7RHYd.js";import{randomUUID}from"node:crypto";import{getMaxListeners,setMaxListeners}from"node:events";import{DisconnectReason,downloadMediaMessage,extractMessageContent,getContentType,isJidGroup,normalizeMessageContent}from"@whiskeysockets/baileys";const DEFAULT_RECONNECT_POLICY={initialMs:2e3,maxMs:3e4,factor:1.8,jitter:.25,maxAttempts:12};function resolveHeartbeatSeconds(cfg,overrideSeconds){let candidate=overrideSeconds??cfg.web?.heartbeatSeconds;return typeof candidate==`number`&&candidate>0?candidate:60}function resolveReconnectPolicy(cfg,overrides){let reconnectOverrides=cfg.web?.reconnect??{},overrideConfig=overrides??{},merged={...DEFAULT_RECONNECT_POLICY,...reconnectOverrides,...overrideConfig};return merged.initialMs=Math.max(250,merged.initialMs),merged.maxMs=Math.max(merged.initialMs,merged.maxMs),merged.factor=clamp(merged.factor,1.1,10),merged.jitter=clamp(merged.jitter,0,1),merged.maxAttempts=Math.max(0,Math.floor(merged.maxAttempts)),merged}function newConnectionId(){return randomUUID()}const whatsappLog=createSubsystemLogger(`gateway/channels/whatsapp`),whatsappInboundLog=whatsappLog.child(`inbound`),whatsappOutboundLog=whatsappLog.child(`outbound`),whatsappHeartbeatLog=whatsappLog.child(`heartbeat`);function elide(text,limit=400){return!text||text.length<=limit?text:`${text.slice(0,limit)}… (truncated ${text.length-limit} chars)`}function isLikelyWhatsAppCryptoError(reason){let haystack=(reason instanceof Error?`${reason.message}\n${reason.stack??``}`:(value=>{if(value==null)return``;if(typeof value==`string`)return value;if(value instanceof Error)return`${value.message}\n${value.stack??``}`;if(typeof value==`object`)try{return JSON.stringify(value)}catch{return Object.prototype.toString.call(value)}return typeof value==`number`||typeof value==`boolean`||typeof value==`bigint`?String(value):typeof value==`symbol`?value.description??value.toString():typeof value==`function`?value.name?`[function ${value.name}]`:`[function]`:Object.prototype.toString.call(value)})(reason)).toLowerCase();return haystack.includes(`unsupported state or unable to authenticate data`)||haystack.includes(`bad mac`)?haystack.includes(`@whiskeysockets/baileys`)||haystack.includes(`baileys`)||haystack.includes(`noise-handler`)||haystack.includes(`aesdecryptgcm`):!1}function waitForever(){return setInterval(()=>{},1e6).unref(),new Promise(()=>{})}const recentInboundMessages=createDedupeCache({ttlMs:20*6e4,maxSize:5e3});function isRecentInboundMessage(key){return recentInboundMessages.check(key)}const ALLOWED_VCARD_KEYS=new Set([`FN`,`N`,`TEL`]);function parseVcard(vcard){if(!vcard)return{phones:[]};let lines=vcard.split(/\r?\n/),nameFromN,nameFromFn,phones=[];for(let rawLine of lines){let line=rawLine.trim();if(!line)continue;let colonIndex=line.indexOf(`:`);if(colonIndex===-1)continue;let key=line.slice(0,colonIndex).toUpperCase(),rawValue=line.slice(colonIndex+1).trim();if(!rawValue)continue;let baseKey=normalizeVcardKey(key);if(!baseKey||!ALLOWED_VCARD_KEYS.has(baseKey))continue;let value=cleanVcardValue(rawValue);if(value){if(baseKey===`FN`&&!nameFromFn){nameFromFn=normalizeVcardName(value);continue}if(baseKey===`N`&&!nameFromN){nameFromN=normalizeVcardName(value);continue}if(baseKey===`TEL`){let phone=normalizeVcardPhone(value);phone&&phones.push(phone)}}}return{name:nameFromFn??nameFromN,phones}}function normalizeVcardKey(key){let[primary]=key.split(`;`);if(!primary)return;let segments=primary.split(`.`);return segments[segments.length-1]||void 0}function cleanVcardValue(value){return value.replace(/\\n/gi,` `).replace(/\\,/g,`,`).replace(/\\;/g,`;`).trim()}function normalizeVcardName(value){return value.replace(/;/g,` `).replace(/\s+/g,` `).trim()}function normalizeVcardPhone(value){let trimmed=value.trim();return trimmed?trimmed.toLowerCase().startsWith(`tel:`)?trimmed.slice(4).trim():trimmed:``}function unwrapMessage$1(message){return normalizeMessageContent(message)}function extractContextInfo(message){if(!message)return;let contentType=getContentType(message),candidate=contentType?message[contentType]:void 0,contextInfo=candidate&&typeof candidate==`object`&&`contextInfo`in candidate?candidate.contextInfo:void 0;if(contextInfo)return contextInfo;let fallback=message.extendedTextMessage?.contextInfo??message.imageMessage?.contextInfo??message.videoMessage?.contextInfo??message.documentMessage?.contextInfo??message.audioMessage?.contextInfo??message.stickerMessage?.contextInfo??message.buttonsResponseMessage?.contextInfo??message.listResponseMessage?.contextInfo??message.templateButtonReplyMessage?.contextInfo??message.interactiveResponseMessage?.contextInfo??message.buttonsMessage?.contextInfo??message.listMessage?.contextInfo;if(fallback)return fallback;for(let value of Object.values(message)){if(!value||typeof value!=`object`||!(`contextInfo`in value))continue;let candidateContext=value.contextInfo;if(candidateContext)return candidateContext}}function extractMentionedJids(rawMessage){let message=unwrapMessage$1(rawMessage);if(!message)return;let flattened=[message.extendedTextMessage?.contextInfo?.mentionedJid,message.extendedTextMessage?.contextInfo?.quotedMessage?.extendedTextMessage?.contextInfo?.mentionedJid,message.imageMessage?.contextInfo?.mentionedJid,message.videoMessage?.contextInfo?.mentionedJid,message.documentMessage?.contextInfo?.mentionedJid,message.audioMessage?.contextInfo?.mentionedJid,message.stickerMessage?.contextInfo?.mentionedJid,message.buttonsResponseMessage?.contextInfo?.mentionedJid,message.listResponseMessage?.contextInfo?.mentionedJid].flatMap(arr=>arr??[]).filter(Boolean);if(flattened.length!==0)return Array.from(new Set(flattened))}function extractText(rawMessage){let message=unwrapMessage$1(rawMessage);if(!message)return;let extracted=extractMessageContent(message),candidates=[message,extracted&&extracted!==message?extracted:void 0];for(let candidate of candidates){if(!candidate)continue;if(typeof candidate.conversation==`string`&&candidate.conversation.trim())return candidate.conversation.trim();let extended=candidate.extendedTextMessage?.text;if(extended?.trim())return extended.trim();let caption=candidate.imageMessage?.caption??candidate.videoMessage?.caption??candidate.documentMessage?.caption;if(caption?.trim())return caption.trim()}let contactPlaceholder=extractContactPlaceholder(message)??(extracted&&extracted!==message?extractContactPlaceholder(extracted):void 0);if(contactPlaceholder)return contactPlaceholder}function extractMediaPlaceholder(rawMessage){let message=unwrapMessage$1(rawMessage);if(message){if(message.imageMessage)return`<media:image>`;if(message.videoMessage)return`<media:video>`;if(message.audioMessage)return`<media:audio>`;if(message.documentMessage)return`<media:document>`;if(message.stickerMessage)return`<media:sticker>`}}function extractContactPlaceholder(rawMessage){let message=unwrapMessage$1(rawMessage);if(!message)return;let contact=message.contactMessage??void 0;if(contact){let{name,phones}=describeContact({displayName:contact.displayName,vcard:contact.vcard});return formatContactPlaceholder(name,phones)}let contactsArray=message.contactsArrayMessage?.contacts??void 0;if(!(!contactsArray||contactsArray.length===0))return formatContactsPlaceholder(contactsArray.map(entry=>describeContact({displayName:entry.displayName,vcard:entry.vcard})).map(entry=>formatContactLabel(entry.name,entry.phones)).filter(value=>!!value),contactsArray.length)}function describeContact(input){let displayName=(input.displayName??``).trim(),parsed=parseVcard(input.vcard??void 0);return{name:displayName||parsed.name,phones:parsed.phones}}function formatContactPlaceholder(name,phones){let label=formatContactLabel(name,phones);return label?`<contact: ${label}>`:`<contact>`}function formatContactsPlaceholder(labels,total){let cleaned=labels.map(label=>label.trim()).filter(Boolean);if(cleaned.length===0)return`<contacts: ${total} ${total===1?`contact`:`contacts`}>`;let remaining=Math.max(total-cleaned.length,0),suffix=remaining>0?` +${remaining} more`:``;return`<contacts: ${cleaned.join(`, `)}${suffix}>`}function formatContactLabel(name,phones){let parts=[name,formatPhoneList(phones)].filter(value=>!!value);if(parts.length!==0)return parts.join(`, `)}function formatPhoneList(phones){let cleaned=phones?.map(phone=>phone.trim()).filter(Boolean)??[];if(cleaned.length===0)return;let{shown,remaining}=summarizeList(cleaned,cleaned.length,1),[primary]=shown;if(primary)return remaining===0?primary:`${primary} (+${remaining} more)`}function summarizeList(values,total,maxShown){let shown=values.slice(0,maxShown);return{shown,remaining:Math.max(total-shown.length,0)}}function extractLocationData(rawMessage){let message=unwrapMessage$1(rawMessage);if(!message)return null;let live=message.liveLocationMessage??void 0;if(live){let latitudeRaw=live.degreesLatitude,longitudeRaw=live.degreesLongitude;if(latitudeRaw!=null&&longitudeRaw!=null){let latitude=Number(latitudeRaw),longitude=Number(longitudeRaw);if(Number.isFinite(latitude)&&Number.isFinite(longitude))return{latitude,longitude,accuracy:live.accuracyInMeters??void 0,caption:live.caption??void 0,source:`live`,isLive:!0}}}let location=message.locationMessage??void 0;if(location){let latitudeRaw=location.degreesLatitude,longitudeRaw=location.degreesLongitude;if(latitudeRaw!=null&&longitudeRaw!=null){let latitude=Number(latitudeRaw),longitude=Number(longitudeRaw);if(Number.isFinite(latitude)&&Number.isFinite(longitude)){let isLive=!!location.isLive;return{latitude,longitude,accuracy:location.accuracyInMeters??void 0,name:location.name??void 0,address:location.address??void 0,caption:location.comment??void 0,source:isLive?`live`:location.name||location.address?`place`:`pin`,isLive}}}}return null}function describeReplyContext(rawMessage){let message=unwrapMessage$1(rawMessage);if(!message)return null;let contextInfo=extractContextInfo(message),quoted=normalizeMessageContent(contextInfo?.quotedMessage);if(!quoted)return null;let location=extractLocationData(quoted),locationText=location?formatLocationText(location):void 0,body=[extractText(quoted),locationText].filter(Boolean).join(`
|
|
2
2
|
`).trim();if(body||=extractMediaPlaceholder(quoted),!body){let quotedType=quoted?getContentType(quoted):void 0;return logVerbose(`Quoted message missing extractable body${quotedType?` (type ${quotedType})`:``}`),null}let senderJid=contextInfo?.participant??void 0,senderE164=senderJid?jidToE164(senderJid)??senderJid:void 0,sender=senderE164??`unknown sender`;return{id:contextInfo?.stanzaId?String(contextInfo.stanzaId):void 0,body,sender,senderJid,senderE164}}async function checkInboundAccessControl(params){let cfg=loadConfig(),account=resolveWhatsAppAccount({cfg,accountId:params.accountId}),dmPolicy=account.dmPolicy??`pairing`,configuredAllowFrom=account.allowFrom,storeAllowFrom=await readChannelAllowFromStore(`whatsapp`,process.env,account.accountId).catch(()=>[]),combinedAllowFrom=Array.from(new Set([...configuredAllowFrom??[],...storeAllowFrom])),defaultAllowFrom=combinedAllowFrom.length===0&¶ms.selfE164?[params.selfE164]:void 0,allowFrom=combinedAllowFrom.length>0?combinedAllowFrom:defaultAllowFrom,groupAllowFrom=account.groupAllowFrom??(configuredAllowFrom&&configuredAllowFrom.length>0?configuredAllowFrom:void 0),isSamePhone=params.from===params.selfE164,isSelfChat=isSelfChatMode(params.selfE164,configuredAllowFrom),pairingGraceMs=typeof params.pairingGraceMs==`number`&¶ms.pairingGraceMs>0?params.pairingGraceMs:3e4,suppressPairingReply=typeof params.connectedAtMs==`number`&&typeof params.messageTimestampMs==`number`&¶ms.messageTimestampMs<params.connectedAtMs-pairingGraceMs,dmHasWildcard=allowFrom?.includes(`*`)??!1,normalizedAllowFrom=allowFrom&&allowFrom.length>0?allowFrom.filter(entry=>entry!==`*`).map(normalizeE164):[],groupHasWildcard=groupAllowFrom?.includes(`*`)??!1,normalizedGroupAllowFrom=groupAllowFrom&&groupAllowFrom.length>0?groupAllowFrom.filter(entry=>entry!==`*`).map(normalizeE164):[],defaultGroupPolicy=cfg.channels?.defaults?.groupPolicy,groupPolicy=account.groupPolicy??defaultGroupPolicy??`open`;if(params.group&&groupPolicy===`disabled`)return logVerbose(`Blocked group message (groupPolicy: disabled)`),{allowed:!1,shouldMarkRead:!1,isSelfChat,resolvedAccountId:account.accountId};if(params.group&&groupPolicy===`allowlist`){if(!groupAllowFrom||groupAllowFrom.length===0)return logVerbose(`Blocked group message (groupPolicy: allowlist, no groupAllowFrom)`),{allowed:!1,shouldMarkRead:!1,isSelfChat,resolvedAccountId:account.accountId};if(!(groupHasWildcard||params.senderE164!=null&&normalizedGroupAllowFrom.includes(params.senderE164)))return logVerbose(`Blocked group message from ${params.senderE164??`unknown sender`} (groupPolicy: allowlist)`),{allowed:!1,shouldMarkRead:!1,isSelfChat,resolvedAccountId:account.accountId}}if(!params.group){if(params.isFromMe&&!isSamePhone)return logVerbose(`Skipping outbound DM (fromMe); no pairing reply needed.`),{allowed:!1,shouldMarkRead:!1,isSelfChat,resolvedAccountId:account.accountId};if(dmPolicy===`disabled`)return logVerbose(`Blocked dm (dmPolicy: disabled)`),{allowed:!1,shouldMarkRead:!1,isSelfChat,resolvedAccountId:account.accountId};if(dmPolicy!==`open`&&!isSamePhone){let candidate=params.from;if(!(dmHasWildcard||normalizedAllowFrom.length>0&&normalizedAllowFrom.includes(candidate))){if(dmPolicy===`pairing`)if(suppressPairingReply)logVerbose(`Skipping pairing reply for historical DM from ${candidate}.`);else{let{code,created}=await upsertChannelPairingRequest({channel:`whatsapp`,id:candidate,accountId:account.accountId,meta:{name:(params.pushName??``).trim()||void 0}});if(created){logVerbose(`whatsapp pairing request sender=${candidate} name=${params.pushName??`unknown`}`);try{await params.sock.sendMessage(params.remoteJid,{text:buildPairingReply({channel:`whatsapp`,idLine:`Your WhatsApp phone number: ${candidate}`,code})})}catch(err){logVerbose(`whatsapp pairing reply failed for ${candidate}: ${String(err)}`)}}}else logVerbose(`Blocked unauthorized sender ${candidate} (dmPolicy=${dmPolicy})`);return{allowed:!1,shouldMarkRead:!1,isSelfChat,resolvedAccountId:account.accountId}}}}return{allowed:!0,shouldMarkRead:!0,isSelfChat,resolvedAccountId:account.accountId}}function unwrapMessage(message){return normalizeMessageContent(message)}function resolveMediaMimetype(message){let explicit=message.imageMessage?.mimetype??message.videoMessage?.mimetype??message.documentMessage?.mimetype??message.audioMessage?.mimetype??message.stickerMessage?.mimetype??void 0;if(explicit)return explicit;if(message.audioMessage)return`audio/ogg; codecs=opus`;if(message.imageMessage)return`image/jpeg`;if(message.videoMessage)return`video/mp4`;if(message.stickerMessage)return`image/webp`}async function downloadInboundMedia(msg,sock){let message=unwrapMessage(msg.message);if(!message)return;let mimetype=resolveMediaMimetype(message),fileName=message.documentMessage?.fileName??void 0;if(!(!message.imageMessage&&!message.videoMessage&&!message.documentMessage&&!message.audioMessage&&!message.stickerMessage))try{return{buffer:await downloadMediaMessage(msg,`buffer`,{},{reuploadRequest:sock.updateMediaMessage,logger:sock.logger}),mimetype,fileName}}catch(err){logVerbose(`downloadMediaMessage failed: ${String(err)}`);return}}function recordWhatsAppOutbound(accountId){recordChannelActivity({channel:`whatsapp`,accountId,direction:`outbound`})}function resolveOutboundMessageId(result){return typeof result==`object`&&result&&`key`in result?String(result.key?.id??`unknown`):`unknown`}function createWebSendApi(params){return{sendMessage:async(to,text,mediaBuffer,mediaType,sendOptions)=>{let jid=toWhatsappJid(to),payload;if(mediaBuffer&&mediaType)if(mediaType.startsWith(`image/`))payload={image:mediaBuffer,caption:text||void 0,mimetype:mediaType};else if(mediaType.startsWith(`audio/`))payload={audio:mediaBuffer,ptt:!0,mimetype:mediaType};else if(mediaType.startsWith(`video/`)){let gifPlayback=sendOptions?.gifPlayback;payload={video:mediaBuffer,caption:text||void 0,mimetype:mediaType,...gifPlayback?{gifPlayback:!0}:{}}}else payload={document:mediaBuffer,fileName:sendOptions?.fileName?.trim()||`file`,caption:text||void 0,mimetype:mediaType};else payload={text};let result=await params.sock.sendMessage(jid,payload);return recordWhatsAppOutbound(sendOptions?.accountId??params.defaultAccountId),{messageId:resolveOutboundMessageId(result)}},sendPoll:async(to,poll)=>{let jid=toWhatsappJid(to),result=await params.sock.sendMessage(jid,{poll:{name:poll.question,values:poll.options,selectableCount:poll.maxSelections??1}});return recordWhatsAppOutbound(params.defaultAccountId),{messageId:resolveOutboundMessageId(result)}},sendReaction:async(chatJid,messageId,emoji,fromMe,participant)=>{let jid=toWhatsappJid(chatJid);await params.sock.sendMessage(jid,{react:{text:emoji,key:{remoteJid:jid,id:messageId,fromMe,participant:participant?toWhatsappJid(participant):void 0}}})},sendComposingTo:async to=>{let jid=toWhatsappJid(to);await params.sock.sendPresenceUpdate(`composing`,jid)}}}async function monitorWebInbox(options){let inboundLogger=getChildLogger({module:`web-inbound`}),inboundConsoleLog=createSubsystemLogger(`gateway/channels/whatsapp`).child(`inbound`),sock=await createWaSocket(!1,options.verbose,{authDir:options.authDir});await waitForWaConnection(sock);let connectedAtMs=Date.now(),onCloseResolve=null,onClose=new Promise(resolve=>{onCloseResolve=resolve}),resolveClose=reason=>{if(!onCloseResolve)return;let resolver=onCloseResolve;onCloseResolve=null,resolver(reason)};try{await sock.sendPresenceUpdate(`available`),shouldLogVerbose()&&logVerbose(`Sent global 'available' presence on connect`)}catch(err){logVerbose(`Failed to send 'available' presence on connect: ${String(err)}`)}let selfJid=sock.user?.id,selfE164=selfJid?jidToE164(selfJid):null,debouncer=createInboundDebouncer({debounceMs:options.debounceMs??0,buildKey:msg=>{let senderKey=msg.chatType===`group`?msg.senderJid??msg.senderE164??msg.senderName??msg.from:msg.from;if(!senderKey)return null;let conversationKey=msg.chatType===`group`?msg.chatId:msg.from;return`${msg.accountId}:${conversationKey}:${senderKey}`},shouldDebounce:options.shouldDebounce,onFlush:async entries=>{let last=entries.at(-1);if(!last)return;if(entries.length===1){await options.onMessage(last);return}let mentioned=new Set;for(let entry of entries)for(let jid of entry.mentionedJids??[])mentioned.add(jid);let combinedBody=entries.map(entry=>entry.body).filter(Boolean).join(`
|
|
3
3
|
`),combinedMessage={...last,body:combinedBody,mentionedJids:mentioned.size>0?Array.from(mentioned):void 0};await options.onMessage(combinedMessage)},onError:err=>{inboundLogger.error({error:String(err)},`failed handling inbound web message`),inboundConsoleLog.error(`Failed handling inbound web message: ${String(err)}`)}}),groupMetaCache=new Map,GROUP_META_TTL_MS=300*1e3,lidLookup=sock.signalRepository?.lidMapping,resolveInboundJid=async jid=>resolveJidToE164(jid,{authDir:options.authDir,lidLookup}),getGroupMeta=async jid=>{let cached=groupMetaCache.get(jid);if(cached&&cached.expires>Date.now())return cached;try{let meta=await sock.groupMetadata(jid),participants=(await Promise.all(meta.participants?.map(async p=>await resolveInboundJid(p.id)??p.id)??[])).filter(Boolean)??[],entry={subject:meta.subject,participants,expires:Date.now()+GROUP_META_TTL_MS};return groupMetaCache.set(jid,entry),entry}catch(err){return logVerbose(`Failed to fetch group metadata for ${jid}: ${String(err)}`),{expires:Date.now()+GROUP_META_TTL_MS}}},handleMessagesUpsert=async upsert=>{if(!(upsert.type!==`notify`&&upsert.type!==`append`))for(let msg of upsert.messages??[]){recordChannelActivity({channel:`whatsapp`,accountId:options.accountId,direction:`inbound`});let id=msg.key?.id??void 0,remoteJid=msg.key?.remoteJid;if(!remoteJid||remoteJid.endsWith(`@status`)||remoteJid.endsWith(`@broadcast`))continue;let group=isJidGroup(remoteJid)===!0;if(id&&isRecentInboundMessage(`${options.accountId}:${remoteJid}:${id}`))continue;let participantJid=msg.key?.participant??void 0,from=group?remoteJid:await resolveInboundJid(remoteJid);if(!from)continue;let senderE164=group?participantJid?await resolveInboundJid(participantJid):null:from,groupSubject,groupParticipants;if(group){let meta=await getGroupMeta(remoteJid);groupSubject=meta.subject,groupParticipants=meta.participants}let messageTimestampMs=msg.messageTimestamp?Number(msg.messageTimestamp)*1e3:void 0,access=await checkInboundAccessControl({accountId:options.accountId,from,selfE164,senderE164,group,pushName:msg.pushName??void 0,isFromMe:!!msg.key?.fromMe,messageTimestampMs,connectedAtMs,sock:{sendMessage:(jid,content)=>sock.sendMessage(jid,content)},remoteJid});if(!access.allowed)continue;if(id&&!access.isSelfChat&&options.sendReadReceipts!==!1){let participant=msg.key?.participant;try{await sock.readMessages([{remoteJid,id,participant,fromMe:!1}]),shouldLogVerbose()&&logVerbose(`Marked message ${id} as read for ${remoteJid}${participant?` (participant ${participant})`:``}`)}catch(err){logVerbose(`Failed to mark message ${id} read: ${String(err)}`)}}else id&&access.isSelfChat&&shouldLogVerbose()&&logVerbose(`Self-chat mode: skipping read receipt for ${id}`);if(upsert.type===`append`)continue;let location=extractLocationData(msg.message??void 0),locationText=location?formatLocationText(location):void 0,body=extractText(msg.message??void 0);if(locationText&&(body=[body,locationText].filter(Boolean).join(`
|
|
4
4
|
`).trim()),!body&&(body=extractMediaPlaceholder(msg.message??void 0),!body))continue;let replyContext=describeReplyContext(msg.message),mediaPath,mediaType,mediaFileName;try{let inboundMedia=await downloadInboundMedia(msg,sock);if(inboundMedia){let maxBytes=(typeof options.mediaMaxMb==`number`&&options.mediaMaxMb>0?options.mediaMaxMb:50)*1024*1024;mediaPath=(await saveMediaBuffer(inboundMedia.buffer,inboundMedia.mimetype,`inbound`,maxBytes,inboundMedia.fileName)).path,mediaType=inboundMedia.mimetype,mediaFileName=inboundMedia.fileName}}catch(err){logVerbose(`Inbound media download failed: ${String(err)}`)}let chatJid=remoteJid,sendComposing=async()=>{try{await sock.sendPresenceUpdate(`composing`,chatJid)}catch(err){logVerbose(`Presence update failed: ${String(err)}`)}},reply=async text=>{await sock.sendMessage(chatJid,{text})},sendMedia=async payload=>{await sock.sendMessage(chatJid,payload)},timestamp=messageTimestampMs,mentionedJids=extractMentionedJids(msg.message),senderName=msg.pushName??void 0;inboundLogger.info({from,to:selfE164??`me`,body,mediaPath,mediaType,mediaFileName,timestamp},`inbound message`);let inboundMessage={id,from,conversationId:from,to:selfE164??`me`,accountId:access.resolvedAccountId,body,pushName:senderName,timestamp,chatType:group?`group`:`direct`,chatId:remoteJid,senderJid:participantJid,senderE164:senderE164??void 0,senderName,replyToId:replyContext?.id,replyToBody:replyContext?.body,replyToSender:replyContext?.sender,replyToSenderJid:replyContext?.senderJid,replyToSenderE164:replyContext?.senderE164,groupSubject,groupParticipants,mentionedJids:mentionedJids??void 0,selfJid,selfE164,location:location??void 0,sendComposing,reply,sendMedia,mediaPath,mediaType,mediaFileName};try{Promise.resolve(debouncer.enqueue(inboundMessage)).catch(err=>{inboundLogger.error({error:String(err)},`failed handling inbound web message`),inboundConsoleLog.error(`Failed handling inbound web message: ${String(err)}`)})}catch(err){inboundLogger.error({error:String(err)},`failed handling inbound web message`),inboundConsoleLog.error(`Failed handling inbound web message: ${String(err)}`)}}};sock.ev.on(`messages.upsert`,handleMessagesUpsert);let handleConnectionUpdate=update=>{try{if(update.connection===`close`){let status=getStatusCode(update.lastDisconnect?.error);resolveClose({status,isLoggedOut:status===DisconnectReason.loggedOut,error:update.lastDisconnect?.error})}}catch(err){inboundLogger.error({error:String(err)},`connection.update handler error`),resolveClose({status:void 0,isLoggedOut:!1,error:err})}};return sock.ev.on(`connection.update`,handleConnectionUpdate),{close:async()=>{try{let ev=sock.ev,messagesUpsertHandler=handleMessagesUpsert,connectionUpdateHandler=handleConnectionUpdate;typeof ev.off==`function`?(ev.off(`messages.upsert`,messagesUpsertHandler),ev.off(`connection.update`,connectionUpdateHandler)):typeof ev.removeListener==`function`&&(ev.removeListener(`messages.upsert`,messagesUpsertHandler),ev.removeListener(`connection.update`,connectionUpdateHandler)),sock.ws?.close()}catch(err){logVerbose(`Socket close failed: ${String(err)}`)}},onClose,signalClose:reason=>{resolveClose(reason??{status:void 0,isLoggedOut:!1,error:`closed`})},...createWebSendApi({sock:{sendMessage:(jid,content)=>sock.sendMessage(jid,content),sendPresenceUpdate:(presence,jid)=>sock.sendPresenceUpdate(presence,jid)},defaultAccountId:options.accountId})}}function buildMentionConfig(cfg,agentId){return{mentionRegexes:buildMentionRegexes(cfg,agentId),allowFrom:cfg.channels?.whatsapp?.allowFrom}}function resolveMentionTargets(msg,authDir){let jidOptions=authDir?{authDir}:void 0;return{normalizedMentions:msg.mentionedJids?.length?msg.mentionedJids.map(jid=>jidToE164(jid,jidOptions)??jid).filter(Boolean):[],selfE164:msg.selfE164??(msg.selfJid?jidToE164(msg.selfJid,jidOptions):null),selfJid:msg.selfJid?msg.selfJid.replace(/:\\d+/,``):null}}function isBotMentionedFromTargets(msg,mentionCfg,targets){let clean=text=>normalizeMentionText(text),isSelfChat=isSelfChatMode(targets.selfE164,mentionCfg.allowFrom);if((msg.mentionedJids?.length??0)>0&&!isSelfChat)return!!(targets.selfE164&&targets.normalizedMentions.includes(targets.selfE164)||targets.selfJid&&targets.normalizedMentions.includes(targets.selfJid));let bodyClean=clean(msg.body);if(mentionCfg.mentionRegexes.some(re=>re.test(bodyClean)))return!0;if(targets.selfE164){let selfDigits=targets.selfE164.replace(/\D/g,``);if(selfDigits){if(bodyClean.replace(/[^\d]/g,``).includes(selfDigits))return!0;let bodyNoSpace=msg.body.replace(/[\s-]/g,``);if(RegExp(`\\+?${selfDigits}`,`i`).test(bodyNoSpace))return!0}}return!1}function debugMention(msg,mentionCfg,authDir){let mentionTargets=resolveMentionTargets(msg,authDir);return{wasMentioned:isBotMentionedFromTargets(msg,mentionCfg,mentionTargets),details:{from:msg.from,body:msg.body,bodyClean:normalizeMentionText(msg.body),mentionedJids:msg.mentionedJids??null,normalizedMentionedJids:mentionTargets.normalizedMentions.length?mentionTargets.normalizedMentions:null,selfJid:msg.selfJid??null,selfJidBare:mentionTargets.selfJid,selfE164:msg.selfE164??null,resolvedSelfE164:mentionTargets.selfE164}}}function resolveOwnerList(mentionCfg,selfE164){let allowFrom=mentionCfg.allowFrom;return(Array.isArray(allowFrom)&&allowFrom.length>0?allowFrom:selfE164?[selfE164]:[]).filter(entry=>!!(entry&&entry!==`*`)).map(entry=>normalizeE164(entry)).filter(entry=>!!entry)}function createEchoTracker(params){let recentlySent=new Set,maxItems=Math.max(1,params.maxItems??100),buildCombinedKey=p=>`combined:${p.sessionKey}:${p.combinedBody}`,trim=()=>{for(;recentlySent.size>maxItems;){let firstKey=recentlySent.values().next().value;if(!firstKey)break;recentlySent.delete(firstKey)}};return{rememberText:(text,opts)=>{text&&(recentlySent.add(text),opts.combinedBody&&opts.combinedBodySessionKey&&recentlySent.add(buildCombinedKey({sessionKey:opts.combinedBodySessionKey,combinedBody:opts.combinedBody})),opts.logVerboseMessage&¶ms.logVerbose?.(`Added to echo detection set (size now: ${recentlySent.size}): ${text.substring(0,50)}...`),trim())},has:key=>recentlySent.has(key),forget:key=>{recentlySent.delete(key)},buildCombinedKey}}async function maybeBroadcastMessage(params){let broadcastAgents=params.cfg.broadcast?.[params.peerId];if(!broadcastAgents||!Array.isArray(broadcastAgents)||broadcastAgents.length===0)return!1;let strategy=params.cfg.broadcast?.strategy||`parallel`;whatsappInboundLog.info(`Broadcasting message to ${broadcastAgents.length} agents (${strategy})`);let agentIds=params.cfg.agents?.list?.map(agent=>normalizeAgentId(agent.id)),hasKnownAgents=(agentIds?.length??0)>0,groupHistorySnapshot=params.msg.chatType===`group`?params.groupHistories.get(params.groupHistoryKey)??[]:void 0,processForAgent=async agentId=>{let normalizedAgentId=normalizeAgentId(agentId);if(hasKnownAgents&&!agentIds?.includes(normalizedAgentId))return whatsappInboundLog.warn(`Broadcast agent ${agentId} not found in agents.list; skipping`),!1;let agentRoute={...params.route,agentId:normalizedAgentId,sessionKey:buildAgentSessionKey({agentId:normalizedAgentId,channel:`whatsapp`,accountId:params.route.accountId,peer:{kind:params.msg.chatType===`group`?`group`:`direct`,id:params.peerId},dmScope:params.cfg.session?.dmScope,identityLinks:params.cfg.session?.identityLinks}),mainSessionKey:buildAgentMainSessionKey({agentId:normalizedAgentId,mainKey:DEFAULT_MAIN_KEY})};try{return await params.processMessage(params.msg,agentRoute,params.groupHistoryKey,{groupHistory:groupHistorySnapshot,suppressGroupHistoryClear:!0})}catch(err){return whatsappInboundLog.error(`Broadcast agent ${agentId} failed: ${formatError(err)}`),!1}};if(strategy===`sequential`)for(let agentId of broadcastAgents)await processForAgent(agentId);else await Promise.allSettled(broadcastAgents.map(processForAgent));return params.msg.chatType===`group`&¶ms.groupHistories.set(params.groupHistoryKey,[]),!0}function stripMentionsForCommand(text,mentionRegexes,selfE164){let result=text;for(let re of mentionRegexes)result=result.replace(re,` `);if(selfE164){let digits=selfE164.replace(/\D/g,``);if(digits){let pattern=RegExp(`\\+?${digits}`,`g`);result=result.replace(pattern,` `)}}return result.replace(/\s+/g,` `).trim()}function resolveGroupPolicyFor(cfg,conversationId){let groupId=resolveGroupSessionKey({From:conversationId,ChatType:`group`,Provider:`whatsapp`})?.id;return resolveChannelGroupPolicy({cfg,channel:`whatsapp`,groupId:groupId??conversationId})}function resolveGroupRequireMentionFor(cfg,conversationId){let groupId=resolveGroupSessionKey({From:conversationId,ChatType:`group`,Provider:`whatsapp`})?.id;return resolveChannelGroupRequireMention({cfg,channel:`whatsapp`,groupId:groupId??conversationId})}function resolveGroupActivationFor(params){let entry=loadSessionStore(resolveStorePath(params.cfg.session?.store,{agentId:params.agentId}))[params.sessionKey],defaultActivation=resolveGroupRequireMentionFor(params.cfg,params.conversationId)?`mention`:`always`;return normalizeGroupActivation(entry?.groupActivation)??defaultActivation}function noteGroupMember(groupMemberNames,conversationId,e164,name){if(!e164||!name)return;let key=normalizeE164(e164)??e164;if(!key)return;let roster=groupMemberNames.get(conversationId);roster||(roster=new Map,groupMemberNames.set(conversationId,roster)),roster.set(key,name)}function formatGroupMembers(params){let{participants,roster,fallbackE164}=params,seen=new Set,ordered=[];if(participants?.length)for(let entry of participants){if(!entry)continue;let normalized=normalizeE164(entry)??entry;!normalized||seen.has(normalized)||(seen.add(normalized),ordered.push(normalized))}if(roster)for(let entry of roster.keys()){let normalized=normalizeE164(entry)??entry;!normalized||seen.has(normalized)||(seen.add(normalized),ordered.push(normalized))}if(ordered.length===0&&fallbackE164){let normalized=normalizeE164(fallbackE164)??fallbackE164;normalized&&ordered.push(normalized)}if(ordered.length!==0)return ordered.map(entry=>{let name=roster?.get(entry);return name?`${name} (${entry})`:entry}).join(`, `)}function isOwnerSender(baseMentionConfig,msg){let sender=normalizeE164(msg.senderE164??``);return sender?resolveOwnerList(baseMentionConfig,msg.selfE164??void 0).includes(sender):!1}function recordPendingGroupHistoryEntry(params){let sender=params.msg.senderName&¶ms.msg.senderE164?`${params.msg.senderName} (${params.msg.senderE164})`:params.msg.senderName??params.msg.senderE164??`Unknown`;recordPendingHistoryEntryIfEnabled({historyMap:params.groupHistories,historyKey:params.groupHistoryKey,limit:params.groupHistoryLimit,entry:{sender,body:params.msg.body,timestamp:params.msg.timestamp,id:params.msg.id,senderJid:params.msg.senderJid}})}function applyGroupGating(params){let groupPolicy=resolveGroupPolicyFor(params.cfg,params.conversationId);if(groupPolicy.allowlistEnabled&&!groupPolicy.allowed)return params.logVerbose(`Skipping group message ${params.conversationId} (not in allowlist)`),{shouldProcess:!1};noteGroupMember(params.groupMemberNames,params.groupHistoryKey,params.msg.senderE164,params.msg.senderName);let mentionConfig=buildMentionConfig(params.cfg,params.agentId),commandBody=stripMentionsForCommand(params.msg.body,mentionConfig.mentionRegexes,params.msg.selfE164),activationCommand=parseActivationCommand(commandBody),owner=isOwnerSender(params.baseMentionConfig,params.msg),shouldBypassMention=owner&&hasControlCommand(commandBody,params.cfg);if(activationCommand.hasCommand&&!owner)return params.logVerbose(`Ignoring /activation from non-owner in group ${params.conversationId}`),recordPendingGroupHistoryEntry({msg:params.msg,groupHistories:params.groupHistories,groupHistoryKey:params.groupHistoryKey,groupHistoryLimit:params.groupHistoryLimit}),{shouldProcess:!1};let mentionDebug=debugMention(params.msg,mentionConfig,params.authDir);params.replyLogger.debug({conversationId:params.conversationId,wasMentioned:mentionDebug.wasMentioned,...mentionDebug.details},`group mention debug`);let wasMentioned=mentionDebug.wasMentioned,requireMention=resolveGroupActivationFor({cfg:params.cfg,agentId:params.agentId,sessionKey:params.sessionKey,conversationId:params.conversationId})!==`always`,selfJid=params.msg.selfJid?.replace(/:\\d+/,``),replySenderJid=params.msg.replyToSenderJid?.replace(/:\\d+/,``),selfE164=params.msg.selfE164?normalizeE164(params.msg.selfE164):null,replySenderE164=params.msg.replyToSenderE164?normalizeE164(params.msg.replyToSenderE164):null,mentionGate=resolveMentionGating({requireMention,canDetectMention:!0,wasMentioned,implicitMention:!!(selfJid&&replySenderJid&&selfJid===replySenderJid||selfE164&&replySenderE164&&selfE164===replySenderE164),shouldBypassMention});return params.msg.wasMentioned=mentionGate.effectiveWasMentioned,!shouldBypassMention&&requireMention&&mentionGate.shouldSkip?(params.logVerbose(`Group message stored for context (no mention detected) in ${params.conversationId}: ${params.msg.body}`),recordPendingGroupHistoryEntry({msg:params.msg,groupHistories:params.groupHistories,groupHistoryKey:params.groupHistoryKey,groupHistoryLimit:params.groupHistoryLimit}),{shouldProcess:!1}):{shouldProcess:!0}}function trackBackgroundTask(backgroundTasks,task){backgroundTasks.add(task),task.finally(()=>{backgroundTasks.delete(task)})}function updateLastRouteInBackground(params){let storePath=resolveStorePath(params.cfg.session?.store,{agentId:params.storeAgentId}),task=updateLastRoute({storePath,sessionKey:params.sessionKey,deliveryContext:{channel:params.channel,to:params.to,accountId:params.accountId},ctx:params.ctx}).catch(err=>{params.warn({error:formatError(err),storePath,sessionKey:params.sessionKey,to:params.to},`failed updating last route`)});trackBackgroundTask(params.backgroundTasks,task)}function resolvePeerId(msg){return msg.chatType===`group`?msg.conversationId??msg.from:msg.senderE164?normalizeE164(msg.senderE164)??msg.senderE164:msg.from.includes(`@`)?jidToE164(msg.from)??msg.from:normalizeE164(msg.from)??msg.from}async function deliverWebReply(params){let{replyResult,msg,maxMediaBytes,textLimit,replyLogger,connectionId,skipLog}=params,replyStarted=Date.now(),tableMode=params.tableMode??`code`,chunkMode=params.chunkMode??`length`,textChunks=chunkMarkdownTextWithMode(markdownToWhatsApp(convertMarkdownTables(replyResult.text||``,tableMode)),textLimit,chunkMode),mediaList=replyResult.mediaUrls?.length?replyResult.mediaUrls:replyResult.mediaUrl?[replyResult.mediaUrl]:[],sendWithRetry=async(fn,label,maxAttempts=3)=>{let lastErr;for(let attempt=1;attempt<=maxAttempts;attempt++)try{return await fn()}catch(err){lastErr=err;let errText=formatError(err),isLast=attempt===maxAttempts;if(!/closed|reset|timed\\s*out|disconnect/i.test(errText)||isLast)throw err;let backoffMs=500*attempt;logVerbose(`Retrying ${label} to ${msg.from} after failure (${attempt}/${maxAttempts-1}) in ${backoffMs}ms: ${errText}`),await sleep(backoffMs)}throw lastErr};if(mediaList.length===0&&textChunks.length){let totalChunks=textChunks.length;for(let[index,chunk]of textChunks.entries()){let chunkStarted=Date.now();if(await sendWithRetry(()=>msg.reply(chunk),`text`),!skipLog){let durationMs=Date.now()-chunkStarted;whatsappOutboundLog.debug(`Sent chunk ${index+1}/${totalChunks} to ${msg.from} (${durationMs.toFixed(0)}ms)`)}}replyLogger.info({correlationId:msg.id??newConnectionId(),connectionId:connectionId??null,to:msg.from,from:msg.to,text:elide(replyResult.text,240),mediaUrl:null,mediaSizeBytes:null,mediaKind:null,durationMs:Date.now()-replyStarted},`auto-reply sent (text)`);return}let remainingText=[...textChunks];for(let[index,mediaUrl]of mediaList.entries()){let caption=index===0&&remainingText.shift()||void 0;try{let media=await loadWebMedia(mediaUrl,{maxBytes:maxMediaBytes,localRoots:params.mediaLocalRoots});if(shouldLogVerbose()&&(logVerbose(`Web auto-reply media size: ${(media.buffer.length/(1024*1024)).toFixed(2)}MB`),logVerbose(`Web auto-reply media source: ${mediaUrl} (kind ${media.kind})`)),media.kind===`image`)await sendWithRetry(()=>msg.sendMedia({image:media.buffer,caption,mimetype:media.contentType}),`media:image`);else if(media.kind===`audio`)await sendWithRetry(()=>msg.sendMedia({audio:media.buffer,ptt:!0,mimetype:media.contentType,caption}),`media:audio`);else if(media.kind===`video`)await sendWithRetry(()=>msg.sendMedia({video:media.buffer,caption,mimetype:media.contentType}),`media:video`);else{let fileName=media.fileName??mediaUrl.split(`/`).pop()??`file`,mimetype=media.contentType??`application/octet-stream`;await sendWithRetry(()=>msg.sendMedia({document:media.buffer,fileName,caption,mimetype}),`media:document`)}whatsappOutboundLog.info(`Sent media reply to ${msg.from} (${(media.buffer.length/(1024*1024)).toFixed(2)}MB)`),replyLogger.info({correlationId:msg.id??newConnectionId(),connectionId:connectionId??null,to:msg.from,from:msg.to,text:caption??null,mediaUrl,mediaSizeBytes:media.buffer.length,mediaKind:media.kind,durationMs:Date.now()-replyStarted},`auto-reply sent (media)`)}catch(err){if(whatsappOutboundLog.error(`Failed sending web media to ${msg.from}: ${formatError(err)}`),replyLogger.warn({err,mediaUrl},`failed to send web media reply`),index===0){let warning=err instanceof Error?`⚠️ Media failed: ${err.message}`:`⚠️ Media failed.`,fallbackText=[remainingText.shift()??caption??``,warning].filter(Boolean).join(`
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import"./paths-BHg-VHB4.js";import"./registry-Cv7CoWAs.js";import{C as sleep,H as getChildLogger,P as shouldLogVerbose,T as toWhatsappJid,f as isSelfChatMode,j as logVerbose,m as normalizeE164,n as clamp,p as jidToE164,v as resolveJidToE164}from"./utils-BP60e80M.js";import{p as defaultRuntime,t as createSubsystemLogger}from"./subsystem-C4b1Von0.js";import"./boolean-ssGoaBPk.js";import"./env-BoE8QSib.js";import"./warning-filter-nSTjpMIH.js";import"./auth-profiles-C1VbcUOm.js";import{t as formatCliCommand}from"./command-format-DTMaGKs7.js";import"./src-DvWaTze9.js";import"./logger-wuOr7HKl.js";import{a as buildAgentMainSessionKey,d as normalizeAgentId,i as DEFAULT_MAIN_KEY,s as buildGroupHistoryKey}from"./session-key-CksCYipj.js";import"./builderforce-root-DY1qbWNX.js";import"./exec-COgsU9ql.js";import"./agent-scope-CufEmNj_.js";import"./env-file-DeS6x2OL.js";import"./src-HrLX5bhG.js";import{r as loadConfig}from"./io-CohJffHG.js";import"./manifest-registry-009gLJ4l.js";import"./config-toczWD3q.js";import"./model-discovery-C9Xm95uL.js";import"./model-catalog-CiiFJX77.js";import"./frontmatter-CaY7feZm.js";import"./skills-D3MwwPOH.js";import"./plugin-skills-pSFUbhg_.js";import"./refresh-C4vwneXT.js";import"./client-CGgp3zkQ.js";import"./call-DmAU4cRX.js";import"./message-channel-z5YRpR2d.js";import{$n as formatInboundEnvelope,$t as parseActivationCommand,A as sleepWithAbort,F as recordPendingHistoryEntryIfEnabled,H as createDedupeCache,I as shouldAckReactionForWhatsApp,L as dispatchReplyWithBufferedBlockDispatcher,Ln as enqueueSystemEvent,M as resolveMentionGating,N as DEFAULT_GROUP_HISTORY_LIMIT,P as buildHistoryContextFromEntries,Qn as resolveInboundDebounceMs,Qt as normalizeGroupActivation,U as getReplyFromConfig,Zn as createInboundDebouncer,er as resolveEnvelopeFormatOptions,j as buildPairingReply,k as computeBackoff,nr as hasControlCommand,or as buildMentionRegexes,rr as shouldComputeCommandAuthorized,sr as normalizeMentionText}from"./subagent-registry-CyGxu3kP.js";import{B as resolveChannelGroupPolicy,V as resolveChannelGroupRequireMention,W as resolveGroupSessionKey,a as loadSessionStore,l as updateLastRoute,o as readSessionUpdatedAt,s as recordSessionMetaFromInbound}from"./sessions-Bl1wwotX.js";import"./project-context-store-CIUcwUP_.js";import"./tokens-CFKkpUIu.js";import"./plugins-1Mn6RiNf.js";import{a as logWebSelfId,c as pickWebChannel,i as getWebAuthAgeMs,m as webAuthExists,n as resolveWhatsAppAccount,r as WA_WEB_AUTH_DIR,u as readWebSelfId}from"./accounts-BkTLjSrD.js";import"./bindings-CKSDlQ1i.js";import"./send-BvroeIQ6.js";import"./send-CceNWtYE.js";import"./with-timeout-T07SJo4N.js";import"./deliver-BuZu68tp.js";import"./accounts-Cx82nj4E.js";import{U as formatLocationText,W as toLocationContext}from"./send-ByCVQQVz.js";import"./image-ops-CotJhwRR.js";import"./redact-CgO7wehS.js";import"./errors-tAt19c1E.js";import"./embedded-helpers-DK8_apW0.js";import"./sandbox-z9t_PRf9.js";import"./chrome-BnEbJV3D.js";import"./tailscale-DV-yOmYe.js";import"./auth-ChecwOXS.js";import"./server-context-owOmmyUM.js";import"./routes-lclJHOYY.js";import"./paths-BnOjueoX.js";import"./ssrf-DJXLYZ0d.js";import{r as saveMediaBuffer}from"./store-DHD2IEgd.js";import"./ports-DTku9NSx.js";import"./trash-C3zmJ_O7.js";import"./accounts-DcoaLXKI.js";import{c as resolveStorePath}from"./paths-ClsbsPQP.js";import"./tool-images-CCpqFtrL.js";import"./workspace-waBqRxiy.js";import{c as resolveIdentityNamePrefix,l as resolveMessagePrefix,n as createReplyPrefixOptions}from"./reply-prefix-Cg7AqaK0.js";import"./sqlite-CIGM1WKg.js";import"./memory-cli-ivAs7q7v.js";import"./manager-CRba8roB.js";import"./gemini-auth-CkD5jCPh.js";import"./retry-B151Hej5.js";import"./common-BfwMxpLu.js";import{l as registerUnhandledRejectionHandler}from"./runner-DwWmciCt.js";import"./tool-display-Cs4hDP1f.js";import{c as resolveTextChunkLimit,i as chunkMarkdownTextWithMode,s as resolveChunkMode}from"./chunk-Dly7lM4r.js";import{t as resolveMarkdownTableMode}from"./markdown-tables-B1Rx8hv6.js";import"./fetch-guard-DnXqPKae.js";import"./fetch-Cn_THzz8.js";import{a as loadWebMedia,s as getAgentScopedMediaLocalRoots}from"./ir-CSdQJPqu.js";import"./render-DlHYsbvQ.js";import"./builderforcellm-syscheck-CprBhARf.js";import{t as finalizeInboundContext}from"./inbound-context-NEZRiLx6.js";import"./session-utils-GMvum00v.js";import"./coding-tools.policy-NEPm7Mz1.js";import{i as readChannelAllowFromStore,o as upsertChannelPairingRequest}from"./pairing-store-QDb6lhIU.js";import"./fetch-DnWD6ydH.js";import"./exec-approvals-D7ZPAZpt.js";import"./nodes-screen-D6GHv_S0.js";import{r as formatDurationPrecise}from"./format-duration-HN2dpHE0.js";import"./session-cost-usage-S0nkbPoW.js";import"./usage-format-5sp5AMSu.js";import"./provider-usage-Bn4ZrnU7.js";import"./send-B_1BtyfA.js";import"./outbound-attachment-BaTYE4qp.js";import"./delivery-queue-Cp3t4Upn.js";import"./project-context-D3Mx4maV.js";import"./control-service-CJuuqNOE.js";import"./stagger-CRe77dWL.js";import"./channel-selection-BLwXhb9t.js";import"./send-UFtylOiq.js";import{n as resolveAgentRoute,t as buildAgentSessionKey}from"./resolve-route-DEIW5uKy.js";import{n as recordChannelActivity}from"./channel-activity-DX36RadH.js";import{t as convertMarkdownTables}from"./tables-CojSfTth.js";import"./links-BKzP7VVP.js";import"./cli-utils-C9pW69LF.js";import"./help-format-CfFf-w62.js";import"./progress-Cqb-jAjT.js";import"./replies-DbkT_5BV.js";import"./onboard-helpers-CckrS8_K.js";import"./prompt-style-BMWmaqSC.js";import"./pairing-labels-3j_iRYOO.js";import{r as setActiveWebListener}from"./active-listener-Di9e1YAD.js";import"./mamba-state-engine-CV4nDcCk.js";import"./transformers-stream-Buj40qHl.js";import{i as markdownToWhatsApp,r as sendReactionWhatsApp,t as sendMessageWhatsApp}from"./outbound-CAtBpFoD.js";import{i as waitForWaConnection,n as formatError,r as getStatusCode,t as createWaSocket}from"./session-4FpEJvkE.js";import{t as loginWeb}from"./login-CEnjUo5c.js";import{randomUUID}from"node:crypto";import{getMaxListeners,setMaxListeners}from"node:events";import{DisconnectReason,downloadMediaMessage,extractMessageContent,getContentType,isJidGroup,normalizeMessageContent}from"@whiskeysockets/baileys";const DEFAULT_RECONNECT_POLICY={initialMs:2e3,maxMs:3e4,factor:1.8,jitter:.25,maxAttempts:12};function resolveHeartbeatSeconds(cfg,overrideSeconds){let candidate=overrideSeconds??cfg.web?.heartbeatSeconds;return typeof candidate==`number`&&candidate>0?candidate:60}function resolveReconnectPolicy(cfg,overrides){let reconnectOverrides=cfg.web?.reconnect??{},overrideConfig=overrides??{},merged={...DEFAULT_RECONNECT_POLICY,...reconnectOverrides,...overrideConfig};return merged.initialMs=Math.max(250,merged.initialMs),merged.maxMs=Math.max(merged.initialMs,merged.maxMs),merged.factor=clamp(merged.factor,1.1,10),merged.jitter=clamp(merged.jitter,0,1),merged.maxAttempts=Math.max(0,Math.floor(merged.maxAttempts)),merged}function newConnectionId(){return randomUUID()}const whatsappLog=createSubsystemLogger(`gateway/channels/whatsapp`),whatsappInboundLog=whatsappLog.child(`inbound`),whatsappOutboundLog=whatsappLog.child(`outbound`),whatsappHeartbeatLog=whatsappLog.child(`heartbeat`);function elide(text,limit=400){return!text||text.length<=limit?text:`${text.slice(0,limit)}… (truncated ${text.length-limit} chars)`}function isLikelyWhatsAppCryptoError(reason){let haystack=(reason instanceof Error?`${reason.message}\n${reason.stack??``}`:(value=>{if(value==null)return``;if(typeof value==`string`)return value;if(value instanceof Error)return`${value.message}\n${value.stack??``}`;if(typeof value==`object`)try{return JSON.stringify(value)}catch{return Object.prototype.toString.call(value)}return typeof value==`number`||typeof value==`boolean`||typeof value==`bigint`?String(value):typeof value==`symbol`?value.description??value.toString():typeof value==`function`?value.name?`[function ${value.name}]`:`[function]`:Object.prototype.toString.call(value)})(reason)).toLowerCase();return haystack.includes(`unsupported state or unable to authenticate data`)||haystack.includes(`bad mac`)?haystack.includes(`@whiskeysockets/baileys`)||haystack.includes(`baileys`)||haystack.includes(`noise-handler`)||haystack.includes(`aesdecryptgcm`):!1}function waitForever(){return setInterval(()=>{},1e6).unref(),new Promise(()=>{})}const recentInboundMessages=createDedupeCache({ttlMs:20*6e4,maxSize:5e3});function isRecentInboundMessage(key){return recentInboundMessages.check(key)}const ALLOWED_VCARD_KEYS=new Set([`FN`,`N`,`TEL`]);function parseVcard(vcard){if(!vcard)return{phones:[]};let lines=vcard.split(/\r?\n/),nameFromN,nameFromFn,phones=[];for(let rawLine of lines){let line=rawLine.trim();if(!line)continue;let colonIndex=line.indexOf(`:`);if(colonIndex===-1)continue;let key=line.slice(0,colonIndex).toUpperCase(),rawValue=line.slice(colonIndex+1).trim();if(!rawValue)continue;let baseKey=normalizeVcardKey(key);if(!baseKey||!ALLOWED_VCARD_KEYS.has(baseKey))continue;let value=cleanVcardValue(rawValue);if(value){if(baseKey===`FN`&&!nameFromFn){nameFromFn=normalizeVcardName(value);continue}if(baseKey===`N`&&!nameFromN){nameFromN=normalizeVcardName(value);continue}if(baseKey===`TEL`){let phone=normalizeVcardPhone(value);phone&&phones.push(phone)}}}return{name:nameFromFn??nameFromN,phones}}function normalizeVcardKey(key){let[primary]=key.split(`;`);if(!primary)return;let segments=primary.split(`.`);return segments[segments.length-1]||void 0}function cleanVcardValue(value){return value.replace(/\\n/gi,` `).replace(/\\,/g,`,`).replace(/\\;/g,`;`).trim()}function normalizeVcardName(value){return value.replace(/;/g,` `).replace(/\s+/g,` `).trim()}function normalizeVcardPhone(value){let trimmed=value.trim();return trimmed?trimmed.toLowerCase().startsWith(`tel:`)?trimmed.slice(4).trim():trimmed:``}function unwrapMessage$1(message){return normalizeMessageContent(message)}function extractContextInfo(message){if(!message)return;let contentType=getContentType(message),candidate=contentType?message[contentType]:void 0,contextInfo=candidate&&typeof candidate==`object`&&`contextInfo`in candidate?candidate.contextInfo:void 0;if(contextInfo)return contextInfo;let fallback=message.extendedTextMessage?.contextInfo??message.imageMessage?.contextInfo??message.videoMessage?.contextInfo??message.documentMessage?.contextInfo??message.audioMessage?.contextInfo??message.stickerMessage?.contextInfo??message.buttonsResponseMessage?.contextInfo??message.listResponseMessage?.contextInfo??message.templateButtonReplyMessage?.contextInfo??message.interactiveResponseMessage?.contextInfo??message.buttonsMessage?.contextInfo??message.listMessage?.contextInfo;if(fallback)return fallback;for(let value of Object.values(message)){if(!value||typeof value!=`object`||!(`contextInfo`in value))continue;let candidateContext=value.contextInfo;if(candidateContext)return candidateContext}}function extractMentionedJids(rawMessage){let message=unwrapMessage$1(rawMessage);if(!message)return;let flattened=[message.extendedTextMessage?.contextInfo?.mentionedJid,message.extendedTextMessage?.contextInfo?.quotedMessage?.extendedTextMessage?.contextInfo?.mentionedJid,message.imageMessage?.contextInfo?.mentionedJid,message.videoMessage?.contextInfo?.mentionedJid,message.documentMessage?.contextInfo?.mentionedJid,message.audioMessage?.contextInfo?.mentionedJid,message.stickerMessage?.contextInfo?.mentionedJid,message.buttonsResponseMessage?.contextInfo?.mentionedJid,message.listResponseMessage?.contextInfo?.mentionedJid].flatMap(arr=>arr??[]).filter(Boolean);if(flattened.length!==0)return Array.from(new Set(flattened))}function extractText(rawMessage){let message=unwrapMessage$1(rawMessage);if(!message)return;let extracted=extractMessageContent(message),candidates=[message,extracted&&extracted!==message?extracted:void 0];for(let candidate of candidates){if(!candidate)continue;if(typeof candidate.conversation==`string`&&candidate.conversation.trim())return candidate.conversation.trim();let extended=candidate.extendedTextMessage?.text;if(extended?.trim())return extended.trim();let caption=candidate.imageMessage?.caption??candidate.videoMessage?.caption??candidate.documentMessage?.caption;if(caption?.trim())return caption.trim()}let contactPlaceholder=extractContactPlaceholder(message)??(extracted&&extracted!==message?extractContactPlaceholder(extracted):void 0);if(contactPlaceholder)return contactPlaceholder}function extractMediaPlaceholder(rawMessage){let message=unwrapMessage$1(rawMessage);if(message){if(message.imageMessage)return`<media:image>`;if(message.videoMessage)return`<media:video>`;if(message.audioMessage)return`<media:audio>`;if(message.documentMessage)return`<media:document>`;if(message.stickerMessage)return`<media:sticker>`}}function extractContactPlaceholder(rawMessage){let message=unwrapMessage$1(rawMessage);if(!message)return;let contact=message.contactMessage??void 0;if(contact){let{name,phones}=describeContact({displayName:contact.displayName,vcard:contact.vcard});return formatContactPlaceholder(name,phones)}let contactsArray=message.contactsArrayMessage?.contacts??void 0;if(!(!contactsArray||contactsArray.length===0))return formatContactsPlaceholder(contactsArray.map(entry=>describeContact({displayName:entry.displayName,vcard:entry.vcard})).map(entry=>formatContactLabel(entry.name,entry.phones)).filter(value=>!!value),contactsArray.length)}function describeContact(input){let displayName=(input.displayName??``).trim(),parsed=parseVcard(input.vcard??void 0);return{name:displayName||parsed.name,phones:parsed.phones}}function formatContactPlaceholder(name,phones){let label=formatContactLabel(name,phones);return label?`<contact: ${label}>`:`<contact>`}function formatContactsPlaceholder(labels,total){let cleaned=labels.map(label=>label.trim()).filter(Boolean);if(cleaned.length===0)return`<contacts: ${total} ${total===1?`contact`:`contacts`}>`;let remaining=Math.max(total-cleaned.length,0),suffix=remaining>0?` +${remaining} more`:``;return`<contacts: ${cleaned.join(`, `)}${suffix}>`}function formatContactLabel(name,phones){let parts=[name,formatPhoneList(phones)].filter(value=>!!value);if(parts.length!==0)return parts.join(`, `)}function formatPhoneList(phones){let cleaned=phones?.map(phone=>phone.trim()).filter(Boolean)??[];if(cleaned.length===0)return;let{shown,remaining}=summarizeList(cleaned,cleaned.length,1),[primary]=shown;if(primary)return remaining===0?primary:`${primary} (+${remaining} more)`}function summarizeList(values,total,maxShown){let shown=values.slice(0,maxShown);return{shown,remaining:Math.max(total-shown.length,0)}}function extractLocationData(rawMessage){let message=unwrapMessage$1(rawMessage);if(!message)return null;let live=message.liveLocationMessage??void 0;if(live){let latitudeRaw=live.degreesLatitude,longitudeRaw=live.degreesLongitude;if(latitudeRaw!=null&&longitudeRaw!=null){let latitude=Number(latitudeRaw),longitude=Number(longitudeRaw);if(Number.isFinite(latitude)&&Number.isFinite(longitude))return{latitude,longitude,accuracy:live.accuracyInMeters??void 0,caption:live.caption??void 0,source:`live`,isLive:!0}}}let location=message.locationMessage??void 0;if(location){let latitudeRaw=location.degreesLatitude,longitudeRaw=location.degreesLongitude;if(latitudeRaw!=null&&longitudeRaw!=null){let latitude=Number(latitudeRaw),longitude=Number(longitudeRaw);if(Number.isFinite(latitude)&&Number.isFinite(longitude)){let isLive=!!location.isLive;return{latitude,longitude,accuracy:location.accuracyInMeters??void 0,name:location.name??void 0,address:location.address??void 0,caption:location.comment??void 0,source:isLive?`live`:location.name||location.address?`place`:`pin`,isLive}}}}return null}function describeReplyContext(rawMessage){let message=unwrapMessage$1(rawMessage);if(!message)return null;let contextInfo=extractContextInfo(message),quoted=normalizeMessageContent(contextInfo?.quotedMessage);if(!quoted)return null;let location=extractLocationData(quoted),locationText=location?formatLocationText(location):void 0,body=[extractText(quoted),locationText].filter(Boolean).join(`
|
|
1
|
+
import"./paths-BHg-VHB4.js";import"./registry-Cv7CoWAs.js";import{C as sleep,H as getChildLogger,P as shouldLogVerbose,T as toWhatsappJid,f as isSelfChatMode,j as logVerbose,m as normalizeE164,n as clamp,p as jidToE164,v as resolveJidToE164}from"./utils-BP60e80M.js";import{p as defaultRuntime,t as createSubsystemLogger}from"./subsystem-C4b1Von0.js";import"./boolean-ssGoaBPk.js";import"./env-BoE8QSib.js";import"./warning-filter-nSTjpMIH.js";import"./auth-profiles-pt7Tr4HA.js";import{t as formatCliCommand}from"./command-format-DTMaGKs7.js";import"./src-DvWaTze9.js";import"./logger-wuOr7HKl.js";import{a as buildAgentMainSessionKey,d as normalizeAgentId,i as DEFAULT_MAIN_KEY,s as buildGroupHistoryKey}from"./session-key-CksCYipj.js";import"./builderforce-root-DY1qbWNX.js";import"./exec-COgsU9ql.js";import"./agent-scope-CufEmNj_.js";import"./env-file-DeS6x2OL.js";import"./src-HrLX5bhG.js";import{r as loadConfig}from"./io-D9hC2aG0.js";import"./manifest-registry-009gLJ4l.js";import"./config-BpChMIJ6.js";import"./model-discovery-D0i1JpiL.js";import"./model-catalog-BeBXvbFm.js";import"./frontmatter-CaY7feZm.js";import"./skills-D3MwwPOH.js";import"./plugin-skills-pSFUbhg_.js";import"./refresh-C4vwneXT.js";import"./client-CGgp3zkQ.js";import"./call-Du2LiaX6.js";import"./message-channel-z5YRpR2d.js";import{$n as formatInboundEnvelope,$t as parseActivationCommand,A as sleepWithAbort,F as recordPendingHistoryEntryIfEnabled,H as createDedupeCache,I as shouldAckReactionForWhatsApp,L as dispatchReplyWithBufferedBlockDispatcher,Ln as enqueueSystemEvent,M as resolveMentionGating,N as DEFAULT_GROUP_HISTORY_LIMIT,P as buildHistoryContextFromEntries,Qn as resolveInboundDebounceMs,Qt as normalizeGroupActivation,U as getReplyFromConfig,Zn as createInboundDebouncer,er as resolveEnvelopeFormatOptions,j as buildPairingReply,k as computeBackoff,nr as hasControlCommand,or as buildMentionRegexes,rr as shouldComputeCommandAuthorized,sr as normalizeMentionText}from"./subagent-registry-DDEN4oJi.js";import{B as resolveChannelGroupPolicy,V as resolveChannelGroupRequireMention,W as resolveGroupSessionKey,a as loadSessionStore,l as updateLastRoute,o as readSessionUpdatedAt,s as recordSessionMetaFromInbound}from"./sessions-BA8Se_bT.js";import"./project-context-store-CIUcwUP_.js";import"./tokens-CFKkpUIu.js";import"./plugins-1Mn6RiNf.js";import{a as logWebSelfId,c as pickWebChannel,i as getWebAuthAgeMs,m as webAuthExists,n as resolveWhatsAppAccount,r as WA_WEB_AUTH_DIR,u as readWebSelfId}from"./accounts-BkTLjSrD.js";import"./bindings-CKSDlQ1i.js";import"./send-B7H8Ae5j.js";import"./send-DqR7Rxzm.js";import"./with-timeout-B_p5pWDv.js";import"./deliver-CsG0cHbZ.js";import"./accounts-Cx82nj4E.js";import{U as formatLocationText,W as toLocationContext}from"./send-KgN1P41U.js";import"./image-ops-CotJhwRR.js";import"./redact-CgO7wehS.js";import"./errors-tAt19c1E.js";import"./embedded-helpers-DdU30lmt.js";import"./sandbox-DvKMuAXL.js";import"./chrome-CFmcixaE.js";import"./tailscale-DV-yOmYe.js";import"./auth-ChecwOXS.js";import"./server-context-CttALzrW.js";import"./routes-_iZdG1Fo.js";import"./paths-BnOjueoX.js";import"./ssrf-DJXLYZ0d.js";import{r as saveMediaBuffer}from"./store-DHD2IEgd.js";import"./ports-DTku9NSx.js";import"./trash-C3zmJ_O7.js";import"./accounts-DcoaLXKI.js";import{c as resolveStorePath}from"./paths-ClsbsPQP.js";import"./tool-images-CCpqFtrL.js";import"./workspace-waBqRxiy.js";import{c as resolveIdentityNamePrefix,l as resolveMessagePrefix,n as createReplyPrefixOptions}from"./reply-prefix-Cg7AqaK0.js";import"./sqlite-CIGM1WKg.js";import"./memory-cli-CveeVOWH.js";import"./manager-BeohB4-8.js";import"./gemini-auth-DDR12zst.js";import"./retry-B151Hej5.js";import"./common-BfwMxpLu.js";import{l as registerUnhandledRejectionHandler}from"./runner-Cu9NJouV.js";import"./tool-display-Cs4hDP1f.js";import{c as resolveTextChunkLimit,i as chunkMarkdownTextWithMode,s as resolveChunkMode}from"./chunk-Dly7lM4r.js";import{t as resolveMarkdownTableMode}from"./markdown-tables-B1Rx8hv6.js";import"./fetch-guard-DnXqPKae.js";import"./fetch-Cn_THzz8.js";import{a as loadWebMedia,s as getAgentScopedMediaLocalRoots}from"./ir-CSdQJPqu.js";import"./render-DlHYsbvQ.js";import"./builderforcellm-syscheck-9ksvqHYX.js";import{t as finalizeInboundContext}from"./inbound-context-NEZRiLx6.js";import"./session-utils-Dxou8SbO.js";import"./coding-tools.policy-D9Ba8eDh.js";import{i as readChannelAllowFromStore,o as upsertChannelPairingRequest}from"./pairing-store-YRy7EBgI.js";import"./fetch-DnWD6ydH.js";import"./exec-approvals-D7ZPAZpt.js";import"./nodes-screen-D6GHv_S0.js";import{r as formatDurationPrecise}from"./format-duration-HN2dpHE0.js";import"./session-cost-usage-S0nkbPoW.js";import"./usage-format-5sp5AMSu.js";import"./provider-usage-B8lFHp0K.js";import"./send-kkm_zrHQ.js";import"./outbound-attachment-BaTYE4qp.js";import"./delivery-queue-Cp3t4Upn.js";import"./project-context-D3Mx4maV.js";import"./control-service-2PkCt256.js";import"./stagger-CRe77dWL.js";import"./channel-selection-BLwXhb9t.js";import"./send-CYGOPcKq.js";import{n as resolveAgentRoute,t as buildAgentSessionKey}from"./resolve-route-DEIW5uKy.js";import{n as recordChannelActivity}from"./channel-activity-DX36RadH.js";import{t as convertMarkdownTables}from"./tables-CojSfTth.js";import"./links-BKzP7VVP.js";import"./cli-utils-C9pW69LF.js";import"./help-format-CfFf-w62.js";import"./progress-Cqb-jAjT.js";import"./replies-BOGMDhSN.js";import"./onboard-helpers-Ce_c4Raj.js";import"./prompt-style-BMWmaqSC.js";import"./pairing-labels-BJPrScRl.js";import{r as setActiveWebListener}from"./active-listener-Di9e1YAD.js";import"./mamba-state-engine-CV4nDcCk.js";import"./transformers-stream-Buj40qHl.js";import{i as markdownToWhatsApp,r as sendReactionWhatsApp,t as sendMessageWhatsApp}from"./outbound-BylJYD7n.js";import{i as waitForWaConnection,n as formatError,r as getStatusCode,t as createWaSocket}from"./session-C_b1ttHJ.js";import{t as loginWeb}from"./login-GLDax56V.js";import{randomUUID}from"node:crypto";import{getMaxListeners,setMaxListeners}from"node:events";import{DisconnectReason,downloadMediaMessage,extractMessageContent,getContentType,isJidGroup,normalizeMessageContent}from"@whiskeysockets/baileys";const DEFAULT_RECONNECT_POLICY={initialMs:2e3,maxMs:3e4,factor:1.8,jitter:.25,maxAttempts:12};function resolveHeartbeatSeconds(cfg,overrideSeconds){let candidate=overrideSeconds??cfg.web?.heartbeatSeconds;return typeof candidate==`number`&&candidate>0?candidate:60}function resolveReconnectPolicy(cfg,overrides){let reconnectOverrides=cfg.web?.reconnect??{},overrideConfig=overrides??{},merged={...DEFAULT_RECONNECT_POLICY,...reconnectOverrides,...overrideConfig};return merged.initialMs=Math.max(250,merged.initialMs),merged.maxMs=Math.max(merged.initialMs,merged.maxMs),merged.factor=clamp(merged.factor,1.1,10),merged.jitter=clamp(merged.jitter,0,1),merged.maxAttempts=Math.max(0,Math.floor(merged.maxAttempts)),merged}function newConnectionId(){return randomUUID()}const whatsappLog=createSubsystemLogger(`gateway/channels/whatsapp`),whatsappInboundLog=whatsappLog.child(`inbound`),whatsappOutboundLog=whatsappLog.child(`outbound`),whatsappHeartbeatLog=whatsappLog.child(`heartbeat`);function elide(text,limit=400){return!text||text.length<=limit?text:`${text.slice(0,limit)}… (truncated ${text.length-limit} chars)`}function isLikelyWhatsAppCryptoError(reason){let haystack=(reason instanceof Error?`${reason.message}\n${reason.stack??``}`:(value=>{if(value==null)return``;if(typeof value==`string`)return value;if(value instanceof Error)return`${value.message}\n${value.stack??``}`;if(typeof value==`object`)try{return JSON.stringify(value)}catch{return Object.prototype.toString.call(value)}return typeof value==`number`||typeof value==`boolean`||typeof value==`bigint`?String(value):typeof value==`symbol`?value.description??value.toString():typeof value==`function`?value.name?`[function ${value.name}]`:`[function]`:Object.prototype.toString.call(value)})(reason)).toLowerCase();return haystack.includes(`unsupported state or unable to authenticate data`)||haystack.includes(`bad mac`)?haystack.includes(`@whiskeysockets/baileys`)||haystack.includes(`baileys`)||haystack.includes(`noise-handler`)||haystack.includes(`aesdecryptgcm`):!1}function waitForever(){return setInterval(()=>{},1e6).unref(),new Promise(()=>{})}const recentInboundMessages=createDedupeCache({ttlMs:20*6e4,maxSize:5e3});function isRecentInboundMessage(key){return recentInboundMessages.check(key)}const ALLOWED_VCARD_KEYS=new Set([`FN`,`N`,`TEL`]);function parseVcard(vcard){if(!vcard)return{phones:[]};let lines=vcard.split(/\r?\n/),nameFromN,nameFromFn,phones=[];for(let rawLine of lines){let line=rawLine.trim();if(!line)continue;let colonIndex=line.indexOf(`:`);if(colonIndex===-1)continue;let key=line.slice(0,colonIndex).toUpperCase(),rawValue=line.slice(colonIndex+1).trim();if(!rawValue)continue;let baseKey=normalizeVcardKey(key);if(!baseKey||!ALLOWED_VCARD_KEYS.has(baseKey))continue;let value=cleanVcardValue(rawValue);if(value){if(baseKey===`FN`&&!nameFromFn){nameFromFn=normalizeVcardName(value);continue}if(baseKey===`N`&&!nameFromN){nameFromN=normalizeVcardName(value);continue}if(baseKey===`TEL`){let phone=normalizeVcardPhone(value);phone&&phones.push(phone)}}}return{name:nameFromFn??nameFromN,phones}}function normalizeVcardKey(key){let[primary]=key.split(`;`);if(!primary)return;let segments=primary.split(`.`);return segments[segments.length-1]||void 0}function cleanVcardValue(value){return value.replace(/\\n/gi,` `).replace(/\\,/g,`,`).replace(/\\;/g,`;`).trim()}function normalizeVcardName(value){return value.replace(/;/g,` `).replace(/\s+/g,` `).trim()}function normalizeVcardPhone(value){let trimmed=value.trim();return trimmed?trimmed.toLowerCase().startsWith(`tel:`)?trimmed.slice(4).trim():trimmed:``}function unwrapMessage$1(message){return normalizeMessageContent(message)}function extractContextInfo(message){if(!message)return;let contentType=getContentType(message),candidate=contentType?message[contentType]:void 0,contextInfo=candidate&&typeof candidate==`object`&&`contextInfo`in candidate?candidate.contextInfo:void 0;if(contextInfo)return contextInfo;let fallback=message.extendedTextMessage?.contextInfo??message.imageMessage?.contextInfo??message.videoMessage?.contextInfo??message.documentMessage?.contextInfo??message.audioMessage?.contextInfo??message.stickerMessage?.contextInfo??message.buttonsResponseMessage?.contextInfo??message.listResponseMessage?.contextInfo??message.templateButtonReplyMessage?.contextInfo??message.interactiveResponseMessage?.contextInfo??message.buttonsMessage?.contextInfo??message.listMessage?.contextInfo;if(fallback)return fallback;for(let value of Object.values(message)){if(!value||typeof value!=`object`||!(`contextInfo`in value))continue;let candidateContext=value.contextInfo;if(candidateContext)return candidateContext}}function extractMentionedJids(rawMessage){let message=unwrapMessage$1(rawMessage);if(!message)return;let flattened=[message.extendedTextMessage?.contextInfo?.mentionedJid,message.extendedTextMessage?.contextInfo?.quotedMessage?.extendedTextMessage?.contextInfo?.mentionedJid,message.imageMessage?.contextInfo?.mentionedJid,message.videoMessage?.contextInfo?.mentionedJid,message.documentMessage?.contextInfo?.mentionedJid,message.audioMessage?.contextInfo?.mentionedJid,message.stickerMessage?.contextInfo?.mentionedJid,message.buttonsResponseMessage?.contextInfo?.mentionedJid,message.listResponseMessage?.contextInfo?.mentionedJid].flatMap(arr=>arr??[]).filter(Boolean);if(flattened.length!==0)return Array.from(new Set(flattened))}function extractText(rawMessage){let message=unwrapMessage$1(rawMessage);if(!message)return;let extracted=extractMessageContent(message),candidates=[message,extracted&&extracted!==message?extracted:void 0];for(let candidate of candidates){if(!candidate)continue;if(typeof candidate.conversation==`string`&&candidate.conversation.trim())return candidate.conversation.trim();let extended=candidate.extendedTextMessage?.text;if(extended?.trim())return extended.trim();let caption=candidate.imageMessage?.caption??candidate.videoMessage?.caption??candidate.documentMessage?.caption;if(caption?.trim())return caption.trim()}let contactPlaceholder=extractContactPlaceholder(message)??(extracted&&extracted!==message?extractContactPlaceholder(extracted):void 0);if(contactPlaceholder)return contactPlaceholder}function extractMediaPlaceholder(rawMessage){let message=unwrapMessage$1(rawMessage);if(message){if(message.imageMessage)return`<media:image>`;if(message.videoMessage)return`<media:video>`;if(message.audioMessage)return`<media:audio>`;if(message.documentMessage)return`<media:document>`;if(message.stickerMessage)return`<media:sticker>`}}function extractContactPlaceholder(rawMessage){let message=unwrapMessage$1(rawMessage);if(!message)return;let contact=message.contactMessage??void 0;if(contact){let{name,phones}=describeContact({displayName:contact.displayName,vcard:contact.vcard});return formatContactPlaceholder(name,phones)}let contactsArray=message.contactsArrayMessage?.contacts??void 0;if(!(!contactsArray||contactsArray.length===0))return formatContactsPlaceholder(contactsArray.map(entry=>describeContact({displayName:entry.displayName,vcard:entry.vcard})).map(entry=>formatContactLabel(entry.name,entry.phones)).filter(value=>!!value),contactsArray.length)}function describeContact(input){let displayName=(input.displayName??``).trim(),parsed=parseVcard(input.vcard??void 0);return{name:displayName||parsed.name,phones:parsed.phones}}function formatContactPlaceholder(name,phones){let label=formatContactLabel(name,phones);return label?`<contact: ${label}>`:`<contact>`}function formatContactsPlaceholder(labels,total){let cleaned=labels.map(label=>label.trim()).filter(Boolean);if(cleaned.length===0)return`<contacts: ${total} ${total===1?`contact`:`contacts`}>`;let remaining=Math.max(total-cleaned.length,0),suffix=remaining>0?` +${remaining} more`:``;return`<contacts: ${cleaned.join(`, `)}${suffix}>`}function formatContactLabel(name,phones){let parts=[name,formatPhoneList(phones)].filter(value=>!!value);if(parts.length!==0)return parts.join(`, `)}function formatPhoneList(phones){let cleaned=phones?.map(phone=>phone.trim()).filter(Boolean)??[];if(cleaned.length===0)return;let{shown,remaining}=summarizeList(cleaned,cleaned.length,1),[primary]=shown;if(primary)return remaining===0?primary:`${primary} (+${remaining} more)`}function summarizeList(values,total,maxShown){let shown=values.slice(0,maxShown);return{shown,remaining:Math.max(total-shown.length,0)}}function extractLocationData(rawMessage){let message=unwrapMessage$1(rawMessage);if(!message)return null;let live=message.liveLocationMessage??void 0;if(live){let latitudeRaw=live.degreesLatitude,longitudeRaw=live.degreesLongitude;if(latitudeRaw!=null&&longitudeRaw!=null){let latitude=Number(latitudeRaw),longitude=Number(longitudeRaw);if(Number.isFinite(latitude)&&Number.isFinite(longitude))return{latitude,longitude,accuracy:live.accuracyInMeters??void 0,caption:live.caption??void 0,source:`live`,isLive:!0}}}let location=message.locationMessage??void 0;if(location){let latitudeRaw=location.degreesLatitude,longitudeRaw=location.degreesLongitude;if(latitudeRaw!=null&&longitudeRaw!=null){let latitude=Number(latitudeRaw),longitude=Number(longitudeRaw);if(Number.isFinite(latitude)&&Number.isFinite(longitude)){let isLive=!!location.isLive;return{latitude,longitude,accuracy:location.accuracyInMeters??void 0,name:location.name??void 0,address:location.address??void 0,caption:location.comment??void 0,source:isLive?`live`:location.name||location.address?`place`:`pin`,isLive}}}}return null}function describeReplyContext(rawMessage){let message=unwrapMessage$1(rawMessage);if(!message)return null;let contextInfo=extractContextInfo(message),quoted=normalizeMessageContent(contextInfo?.quotedMessage);if(!quoted)return null;let location=extractLocationData(quoted),locationText=location?formatLocationText(location):void 0,body=[extractText(quoted),locationText].filter(Boolean).join(`
|
|
2
2
|
`).trim();if(body||=extractMediaPlaceholder(quoted),!body){let quotedType=quoted?getContentType(quoted):void 0;return logVerbose(`Quoted message missing extractable body${quotedType?` (type ${quotedType})`:``}`),null}let senderJid=contextInfo?.participant??void 0,senderE164=senderJid?jidToE164(senderJid)??senderJid:void 0,sender=senderE164??`unknown sender`;return{id:contextInfo?.stanzaId?String(contextInfo.stanzaId):void 0,body,sender,senderJid,senderE164}}async function checkInboundAccessControl(params){let cfg=loadConfig(),account=resolveWhatsAppAccount({cfg,accountId:params.accountId}),dmPolicy=account.dmPolicy??`pairing`,configuredAllowFrom=account.allowFrom,storeAllowFrom=await readChannelAllowFromStore(`whatsapp`,process.env,account.accountId).catch(()=>[]),combinedAllowFrom=Array.from(new Set([...configuredAllowFrom??[],...storeAllowFrom])),defaultAllowFrom=combinedAllowFrom.length===0&¶ms.selfE164?[params.selfE164]:void 0,allowFrom=combinedAllowFrom.length>0?combinedAllowFrom:defaultAllowFrom,groupAllowFrom=account.groupAllowFrom??(configuredAllowFrom&&configuredAllowFrom.length>0?configuredAllowFrom:void 0),isSamePhone=params.from===params.selfE164,isSelfChat=isSelfChatMode(params.selfE164,configuredAllowFrom),pairingGraceMs=typeof params.pairingGraceMs==`number`&¶ms.pairingGraceMs>0?params.pairingGraceMs:3e4,suppressPairingReply=typeof params.connectedAtMs==`number`&&typeof params.messageTimestampMs==`number`&¶ms.messageTimestampMs<params.connectedAtMs-pairingGraceMs,dmHasWildcard=allowFrom?.includes(`*`)??!1,normalizedAllowFrom=allowFrom&&allowFrom.length>0?allowFrom.filter(entry=>entry!==`*`).map(normalizeE164):[],groupHasWildcard=groupAllowFrom?.includes(`*`)??!1,normalizedGroupAllowFrom=groupAllowFrom&&groupAllowFrom.length>0?groupAllowFrom.filter(entry=>entry!==`*`).map(normalizeE164):[],defaultGroupPolicy=cfg.channels?.defaults?.groupPolicy,groupPolicy=account.groupPolicy??defaultGroupPolicy??`open`;if(params.group&&groupPolicy===`disabled`)return logVerbose(`Blocked group message (groupPolicy: disabled)`),{allowed:!1,shouldMarkRead:!1,isSelfChat,resolvedAccountId:account.accountId};if(params.group&&groupPolicy===`allowlist`){if(!groupAllowFrom||groupAllowFrom.length===0)return logVerbose(`Blocked group message (groupPolicy: allowlist, no groupAllowFrom)`),{allowed:!1,shouldMarkRead:!1,isSelfChat,resolvedAccountId:account.accountId};if(!(groupHasWildcard||params.senderE164!=null&&normalizedGroupAllowFrom.includes(params.senderE164)))return logVerbose(`Blocked group message from ${params.senderE164??`unknown sender`} (groupPolicy: allowlist)`),{allowed:!1,shouldMarkRead:!1,isSelfChat,resolvedAccountId:account.accountId}}if(!params.group){if(params.isFromMe&&!isSamePhone)return logVerbose(`Skipping outbound DM (fromMe); no pairing reply needed.`),{allowed:!1,shouldMarkRead:!1,isSelfChat,resolvedAccountId:account.accountId};if(dmPolicy===`disabled`)return logVerbose(`Blocked dm (dmPolicy: disabled)`),{allowed:!1,shouldMarkRead:!1,isSelfChat,resolvedAccountId:account.accountId};if(dmPolicy!==`open`&&!isSamePhone){let candidate=params.from;if(!(dmHasWildcard||normalizedAllowFrom.length>0&&normalizedAllowFrom.includes(candidate))){if(dmPolicy===`pairing`)if(suppressPairingReply)logVerbose(`Skipping pairing reply for historical DM from ${candidate}.`);else{let{code,created}=await upsertChannelPairingRequest({channel:`whatsapp`,id:candidate,accountId:account.accountId,meta:{name:(params.pushName??``).trim()||void 0}});if(created){logVerbose(`whatsapp pairing request sender=${candidate} name=${params.pushName??`unknown`}`);try{await params.sock.sendMessage(params.remoteJid,{text:buildPairingReply({channel:`whatsapp`,idLine:`Your WhatsApp phone number: ${candidate}`,code})})}catch(err){logVerbose(`whatsapp pairing reply failed for ${candidate}: ${String(err)}`)}}}else logVerbose(`Blocked unauthorized sender ${candidate} (dmPolicy=${dmPolicy})`);return{allowed:!1,shouldMarkRead:!1,isSelfChat,resolvedAccountId:account.accountId}}}}return{allowed:!0,shouldMarkRead:!0,isSelfChat,resolvedAccountId:account.accountId}}function unwrapMessage(message){return normalizeMessageContent(message)}function resolveMediaMimetype(message){let explicit=message.imageMessage?.mimetype??message.videoMessage?.mimetype??message.documentMessage?.mimetype??message.audioMessage?.mimetype??message.stickerMessage?.mimetype??void 0;if(explicit)return explicit;if(message.audioMessage)return`audio/ogg; codecs=opus`;if(message.imageMessage)return`image/jpeg`;if(message.videoMessage)return`video/mp4`;if(message.stickerMessage)return`image/webp`}async function downloadInboundMedia(msg,sock){let message=unwrapMessage(msg.message);if(!message)return;let mimetype=resolveMediaMimetype(message),fileName=message.documentMessage?.fileName??void 0;if(!(!message.imageMessage&&!message.videoMessage&&!message.documentMessage&&!message.audioMessage&&!message.stickerMessage))try{return{buffer:await downloadMediaMessage(msg,`buffer`,{},{reuploadRequest:sock.updateMediaMessage,logger:sock.logger}),mimetype,fileName}}catch(err){logVerbose(`downloadMediaMessage failed: ${String(err)}`);return}}function recordWhatsAppOutbound(accountId){recordChannelActivity({channel:`whatsapp`,accountId,direction:`outbound`})}function resolveOutboundMessageId(result){return typeof result==`object`&&result&&`key`in result?String(result.key?.id??`unknown`):`unknown`}function createWebSendApi(params){return{sendMessage:async(to,text,mediaBuffer,mediaType,sendOptions)=>{let jid=toWhatsappJid(to),payload;if(mediaBuffer&&mediaType)if(mediaType.startsWith(`image/`))payload={image:mediaBuffer,caption:text||void 0,mimetype:mediaType};else if(mediaType.startsWith(`audio/`))payload={audio:mediaBuffer,ptt:!0,mimetype:mediaType};else if(mediaType.startsWith(`video/`)){let gifPlayback=sendOptions?.gifPlayback;payload={video:mediaBuffer,caption:text||void 0,mimetype:mediaType,...gifPlayback?{gifPlayback:!0}:{}}}else payload={document:mediaBuffer,fileName:sendOptions?.fileName?.trim()||`file`,caption:text||void 0,mimetype:mediaType};else payload={text};let result=await params.sock.sendMessage(jid,payload);return recordWhatsAppOutbound(sendOptions?.accountId??params.defaultAccountId),{messageId:resolveOutboundMessageId(result)}},sendPoll:async(to,poll)=>{let jid=toWhatsappJid(to),result=await params.sock.sendMessage(jid,{poll:{name:poll.question,values:poll.options,selectableCount:poll.maxSelections??1}});return recordWhatsAppOutbound(params.defaultAccountId),{messageId:resolveOutboundMessageId(result)}},sendReaction:async(chatJid,messageId,emoji,fromMe,participant)=>{let jid=toWhatsappJid(chatJid);await params.sock.sendMessage(jid,{react:{text:emoji,key:{remoteJid:jid,id:messageId,fromMe,participant:participant?toWhatsappJid(participant):void 0}}})},sendComposingTo:async to=>{let jid=toWhatsappJid(to);await params.sock.sendPresenceUpdate(`composing`,jid)}}}async function monitorWebInbox(options){let inboundLogger=getChildLogger({module:`web-inbound`}),inboundConsoleLog=createSubsystemLogger(`gateway/channels/whatsapp`).child(`inbound`),sock=await createWaSocket(!1,options.verbose,{authDir:options.authDir});await waitForWaConnection(sock);let connectedAtMs=Date.now(),onCloseResolve=null,onClose=new Promise(resolve=>{onCloseResolve=resolve}),resolveClose=reason=>{if(!onCloseResolve)return;let resolver=onCloseResolve;onCloseResolve=null,resolver(reason)};try{await sock.sendPresenceUpdate(`available`),shouldLogVerbose()&&logVerbose(`Sent global 'available' presence on connect`)}catch(err){logVerbose(`Failed to send 'available' presence on connect: ${String(err)}`)}let selfJid=sock.user?.id,selfE164=selfJid?jidToE164(selfJid):null,debouncer=createInboundDebouncer({debounceMs:options.debounceMs??0,buildKey:msg=>{let senderKey=msg.chatType===`group`?msg.senderJid??msg.senderE164??msg.senderName??msg.from:msg.from;if(!senderKey)return null;let conversationKey=msg.chatType===`group`?msg.chatId:msg.from;return`${msg.accountId}:${conversationKey}:${senderKey}`},shouldDebounce:options.shouldDebounce,onFlush:async entries=>{let last=entries.at(-1);if(!last)return;if(entries.length===1){await options.onMessage(last);return}let mentioned=new Set;for(let entry of entries)for(let jid of entry.mentionedJids??[])mentioned.add(jid);let combinedBody=entries.map(entry=>entry.body).filter(Boolean).join(`
|
|
3
3
|
`),combinedMessage={...last,body:combinedBody,mentionedJids:mentioned.size>0?Array.from(mentioned):void 0};await options.onMessage(combinedMessage)},onError:err=>{inboundLogger.error({error:String(err)},`failed handling inbound web message`),inboundConsoleLog.error(`Failed handling inbound web message: ${String(err)}`)}}),groupMetaCache=new Map,GROUP_META_TTL_MS=300*1e3,lidLookup=sock.signalRepository?.lidMapping,resolveInboundJid=async jid=>resolveJidToE164(jid,{authDir:options.authDir,lidLookup}),getGroupMeta=async jid=>{let cached=groupMetaCache.get(jid);if(cached&&cached.expires>Date.now())return cached;try{let meta=await sock.groupMetadata(jid),participants=(await Promise.all(meta.participants?.map(async p=>await resolveInboundJid(p.id)??p.id)??[])).filter(Boolean)??[],entry={subject:meta.subject,participants,expires:Date.now()+GROUP_META_TTL_MS};return groupMetaCache.set(jid,entry),entry}catch(err){return logVerbose(`Failed to fetch group metadata for ${jid}: ${String(err)}`),{expires:Date.now()+GROUP_META_TTL_MS}}},handleMessagesUpsert=async upsert=>{if(!(upsert.type!==`notify`&&upsert.type!==`append`))for(let msg of upsert.messages??[]){recordChannelActivity({channel:`whatsapp`,accountId:options.accountId,direction:`inbound`});let id=msg.key?.id??void 0,remoteJid=msg.key?.remoteJid;if(!remoteJid||remoteJid.endsWith(`@status`)||remoteJid.endsWith(`@broadcast`))continue;let group=isJidGroup(remoteJid)===!0;if(id&&isRecentInboundMessage(`${options.accountId}:${remoteJid}:${id}`))continue;let participantJid=msg.key?.participant??void 0,from=group?remoteJid:await resolveInboundJid(remoteJid);if(!from)continue;let senderE164=group?participantJid?await resolveInboundJid(participantJid):null:from,groupSubject,groupParticipants;if(group){let meta=await getGroupMeta(remoteJid);groupSubject=meta.subject,groupParticipants=meta.participants}let messageTimestampMs=msg.messageTimestamp?Number(msg.messageTimestamp)*1e3:void 0,access=await checkInboundAccessControl({accountId:options.accountId,from,selfE164,senderE164,group,pushName:msg.pushName??void 0,isFromMe:!!msg.key?.fromMe,messageTimestampMs,connectedAtMs,sock:{sendMessage:(jid,content)=>sock.sendMessage(jid,content)},remoteJid});if(!access.allowed)continue;if(id&&!access.isSelfChat&&options.sendReadReceipts!==!1){let participant=msg.key?.participant;try{await sock.readMessages([{remoteJid,id,participant,fromMe:!1}]),shouldLogVerbose()&&logVerbose(`Marked message ${id} as read for ${remoteJid}${participant?` (participant ${participant})`:``}`)}catch(err){logVerbose(`Failed to mark message ${id} read: ${String(err)}`)}}else id&&access.isSelfChat&&shouldLogVerbose()&&logVerbose(`Self-chat mode: skipping read receipt for ${id}`);if(upsert.type===`append`)continue;let location=extractLocationData(msg.message??void 0),locationText=location?formatLocationText(location):void 0,body=extractText(msg.message??void 0);if(locationText&&(body=[body,locationText].filter(Boolean).join(`
|
|
4
4
|
`).trim()),!body&&(body=extractMediaPlaceholder(msg.message??void 0),!body))continue;let replyContext=describeReplyContext(msg.message),mediaPath,mediaType,mediaFileName;try{let inboundMedia=await downloadInboundMedia(msg,sock);if(inboundMedia){let maxBytes=(typeof options.mediaMaxMb==`number`&&options.mediaMaxMb>0?options.mediaMaxMb:50)*1024*1024;mediaPath=(await saveMediaBuffer(inboundMedia.buffer,inboundMedia.mimetype,`inbound`,maxBytes,inboundMedia.fileName)).path,mediaType=inboundMedia.mimetype,mediaFileName=inboundMedia.fileName}}catch(err){logVerbose(`Inbound media download failed: ${String(err)}`)}let chatJid=remoteJid,sendComposing=async()=>{try{await sock.sendPresenceUpdate(`composing`,chatJid)}catch(err){logVerbose(`Presence update failed: ${String(err)}`)}},reply=async text=>{await sock.sendMessage(chatJid,{text})},sendMedia=async payload=>{await sock.sendMessage(chatJid,payload)},timestamp=messageTimestampMs,mentionedJids=extractMentionedJids(msg.message),senderName=msg.pushName??void 0;inboundLogger.info({from,to:selfE164??`me`,body,mediaPath,mediaType,mediaFileName,timestamp},`inbound message`);let inboundMessage={id,from,conversationId:from,to:selfE164??`me`,accountId:access.resolvedAccountId,body,pushName:senderName,timestamp,chatType:group?`group`:`direct`,chatId:remoteJid,senderJid:participantJid,senderE164:senderE164??void 0,senderName,replyToId:replyContext?.id,replyToBody:replyContext?.body,replyToSender:replyContext?.sender,replyToSenderJid:replyContext?.senderJid,replyToSenderE164:replyContext?.senderE164,groupSubject,groupParticipants,mentionedJids:mentionedJids??void 0,selfJid,selfE164,location:location??void 0,sendComposing,reply,sendMedia,mediaPath,mediaType,mediaFileName};try{Promise.resolve(debouncer.enqueue(inboundMessage)).catch(err=>{inboundLogger.error({error:String(err)},`failed handling inbound web message`),inboundConsoleLog.error(`Failed handling inbound web message: ${String(err)}`)})}catch(err){inboundLogger.error({error:String(err)},`failed handling inbound web message`),inboundConsoleLog.error(`Failed handling inbound web message: ${String(err)}`)}}};sock.ev.on(`messages.upsert`,handleMessagesUpsert);let handleConnectionUpdate=update=>{try{if(update.connection===`close`){let status=getStatusCode(update.lastDisconnect?.error);resolveClose({status,isLoggedOut:status===DisconnectReason.loggedOut,error:update.lastDisconnect?.error})}}catch(err){inboundLogger.error({error:String(err)},`connection.update handler error`),resolveClose({status:void 0,isLoggedOut:!1,error:err})}};return sock.ev.on(`connection.update`,handleConnectionUpdate),{close:async()=>{try{let ev=sock.ev,messagesUpsertHandler=handleMessagesUpsert,connectionUpdateHandler=handleConnectionUpdate;typeof ev.off==`function`?(ev.off(`messages.upsert`,messagesUpsertHandler),ev.off(`connection.update`,connectionUpdateHandler)):typeof ev.removeListener==`function`&&(ev.removeListener(`messages.upsert`,messagesUpsertHandler),ev.removeListener(`connection.update`,connectionUpdateHandler)),sock.ws?.close()}catch(err){logVerbose(`Socket close failed: ${String(err)}`)}},onClose,signalClose:reason=>{resolveClose(reason??{status:void 0,isLoggedOut:!1,error:`closed`})},...createWebSendApi({sock:{sendMessage:(jid,content)=>sock.sendMessage(jid,content),sendPresenceUpdate:(presence,jid)=>sock.sendPresenceUpdate(presence,jid)},defaultAccountId:options.accountId})}}function buildMentionConfig(cfg,agentId){return{mentionRegexes:buildMentionRegexes(cfg,agentId),allowFrom:cfg.channels?.whatsapp?.allowFrom}}function resolveMentionTargets(msg,authDir){let jidOptions=authDir?{authDir}:void 0;return{normalizedMentions:msg.mentionedJids?.length?msg.mentionedJids.map(jid=>jidToE164(jid,jidOptions)??jid).filter(Boolean):[],selfE164:msg.selfE164??(msg.selfJid?jidToE164(msg.selfJid,jidOptions):null),selfJid:msg.selfJid?msg.selfJid.replace(/:\\d+/,``):null}}function isBotMentionedFromTargets(msg,mentionCfg,targets){let clean=text=>normalizeMentionText(text),isSelfChat=isSelfChatMode(targets.selfE164,mentionCfg.allowFrom);if((msg.mentionedJids?.length??0)>0&&!isSelfChat)return!!(targets.selfE164&&targets.normalizedMentions.includes(targets.selfE164)||targets.selfJid&&targets.normalizedMentions.includes(targets.selfJid));let bodyClean=clean(msg.body);if(mentionCfg.mentionRegexes.some(re=>re.test(bodyClean)))return!0;if(targets.selfE164){let selfDigits=targets.selfE164.replace(/\D/g,``);if(selfDigits){if(bodyClean.replace(/[^\d]/g,``).includes(selfDigits))return!0;let bodyNoSpace=msg.body.replace(/[\s-]/g,``);if(RegExp(`\\+?${selfDigits}`,`i`).test(bodyNoSpace))return!0}}return!1}function debugMention(msg,mentionCfg,authDir){let mentionTargets=resolveMentionTargets(msg,authDir);return{wasMentioned:isBotMentionedFromTargets(msg,mentionCfg,mentionTargets),details:{from:msg.from,body:msg.body,bodyClean:normalizeMentionText(msg.body),mentionedJids:msg.mentionedJids??null,normalizedMentionedJids:mentionTargets.normalizedMentions.length?mentionTargets.normalizedMentions:null,selfJid:msg.selfJid??null,selfJidBare:mentionTargets.selfJid,selfE164:msg.selfE164??null,resolvedSelfE164:mentionTargets.selfE164}}}function resolveOwnerList(mentionCfg,selfE164){let allowFrom=mentionCfg.allowFrom;return(Array.isArray(allowFrom)&&allowFrom.length>0?allowFrom:selfE164?[selfE164]:[]).filter(entry=>!!(entry&&entry!==`*`)).map(entry=>normalizeE164(entry)).filter(entry=>!!entry)}function createEchoTracker(params){let recentlySent=new Set,maxItems=Math.max(1,params.maxItems??100),buildCombinedKey=p=>`combined:${p.sessionKey}:${p.combinedBody}`,trim=()=>{for(;recentlySent.size>maxItems;){let firstKey=recentlySent.values().next().value;if(!firstKey)break;recentlySent.delete(firstKey)}};return{rememberText:(text,opts)=>{text&&(recentlySent.add(text),opts.combinedBody&&opts.combinedBodySessionKey&&recentlySent.add(buildCombinedKey({sessionKey:opts.combinedBodySessionKey,combinedBody:opts.combinedBody})),opts.logVerboseMessage&¶ms.logVerbose?.(`Added to echo detection set (size now: ${recentlySent.size}): ${text.substring(0,50)}...`),trim())},has:key=>recentlySent.has(key),forget:key=>{recentlySent.delete(key)},buildCombinedKey}}async function maybeBroadcastMessage(params){let broadcastAgents=params.cfg.broadcast?.[params.peerId];if(!broadcastAgents||!Array.isArray(broadcastAgents)||broadcastAgents.length===0)return!1;let strategy=params.cfg.broadcast?.strategy||`parallel`;whatsappInboundLog.info(`Broadcasting message to ${broadcastAgents.length} agents (${strategy})`);let agentIds=params.cfg.agents?.list?.map(agent=>normalizeAgentId(agent.id)),hasKnownAgents=(agentIds?.length??0)>0,groupHistorySnapshot=params.msg.chatType===`group`?params.groupHistories.get(params.groupHistoryKey)??[]:void 0,processForAgent=async agentId=>{let normalizedAgentId=normalizeAgentId(agentId);if(hasKnownAgents&&!agentIds?.includes(normalizedAgentId))return whatsappInboundLog.warn(`Broadcast agent ${agentId} not found in agents.list; skipping`),!1;let agentRoute={...params.route,agentId:normalizedAgentId,sessionKey:buildAgentSessionKey({agentId:normalizedAgentId,channel:`whatsapp`,accountId:params.route.accountId,peer:{kind:params.msg.chatType===`group`?`group`:`direct`,id:params.peerId},dmScope:params.cfg.session?.dmScope,identityLinks:params.cfg.session?.identityLinks}),mainSessionKey:buildAgentMainSessionKey({agentId:normalizedAgentId,mainKey:DEFAULT_MAIN_KEY})};try{return await params.processMessage(params.msg,agentRoute,params.groupHistoryKey,{groupHistory:groupHistorySnapshot,suppressGroupHistoryClear:!0})}catch(err){return whatsappInboundLog.error(`Broadcast agent ${agentId} failed: ${formatError(err)}`),!1}};if(strategy===`sequential`)for(let agentId of broadcastAgents)await processForAgent(agentId);else await Promise.allSettled(broadcastAgents.map(processForAgent));return params.msg.chatType===`group`&¶ms.groupHistories.set(params.groupHistoryKey,[]),!0}function stripMentionsForCommand(text,mentionRegexes,selfE164){let result=text;for(let re of mentionRegexes)result=result.replace(re,` `);if(selfE164){let digits=selfE164.replace(/\D/g,``);if(digits){let pattern=RegExp(`\\+?${digits}`,`g`);result=result.replace(pattern,` `)}}return result.replace(/\s+/g,` `).trim()}function resolveGroupPolicyFor(cfg,conversationId){let groupId=resolveGroupSessionKey({From:conversationId,ChatType:`group`,Provider:`whatsapp`})?.id;return resolveChannelGroupPolicy({cfg,channel:`whatsapp`,groupId:groupId??conversationId})}function resolveGroupRequireMentionFor(cfg,conversationId){let groupId=resolveGroupSessionKey({From:conversationId,ChatType:`group`,Provider:`whatsapp`})?.id;return resolveChannelGroupRequireMention({cfg,channel:`whatsapp`,groupId:groupId??conversationId})}function resolveGroupActivationFor(params){let entry=loadSessionStore(resolveStorePath(params.cfg.session?.store,{agentId:params.agentId}))[params.sessionKey],defaultActivation=resolveGroupRequireMentionFor(params.cfg,params.conversationId)?`mention`:`always`;return normalizeGroupActivation(entry?.groupActivation)??defaultActivation}function noteGroupMember(groupMemberNames,conversationId,e164,name){if(!e164||!name)return;let key=normalizeE164(e164)??e164;if(!key)return;let roster=groupMemberNames.get(conversationId);roster||(roster=new Map,groupMemberNames.set(conversationId,roster)),roster.set(key,name)}function formatGroupMembers(params){let{participants,roster,fallbackE164}=params,seen=new Set,ordered=[];if(participants?.length)for(let entry of participants){if(!entry)continue;let normalized=normalizeE164(entry)??entry;!normalized||seen.has(normalized)||(seen.add(normalized),ordered.push(normalized))}if(roster)for(let entry of roster.keys()){let normalized=normalizeE164(entry)??entry;!normalized||seen.has(normalized)||(seen.add(normalized),ordered.push(normalized))}if(ordered.length===0&&fallbackE164){let normalized=normalizeE164(fallbackE164)??fallbackE164;normalized&&ordered.push(normalized)}if(ordered.length!==0)return ordered.map(entry=>{let name=roster?.get(entry);return name?`${name} (${entry})`:entry}).join(`, `)}function isOwnerSender(baseMentionConfig,msg){let sender=normalizeE164(msg.senderE164??``);return sender?resolveOwnerList(baseMentionConfig,msg.selfE164??void 0).includes(sender):!1}function recordPendingGroupHistoryEntry(params){let sender=params.msg.senderName&¶ms.msg.senderE164?`${params.msg.senderName} (${params.msg.senderE164})`:params.msg.senderName??params.msg.senderE164??`Unknown`;recordPendingHistoryEntryIfEnabled({historyMap:params.groupHistories,historyKey:params.groupHistoryKey,limit:params.groupHistoryLimit,entry:{sender,body:params.msg.body,timestamp:params.msg.timestamp,id:params.msg.id,senderJid:params.msg.senderJid}})}function applyGroupGating(params){let groupPolicy=resolveGroupPolicyFor(params.cfg,params.conversationId);if(groupPolicy.allowlistEnabled&&!groupPolicy.allowed)return params.logVerbose(`Skipping group message ${params.conversationId} (not in allowlist)`),{shouldProcess:!1};noteGroupMember(params.groupMemberNames,params.groupHistoryKey,params.msg.senderE164,params.msg.senderName);let mentionConfig=buildMentionConfig(params.cfg,params.agentId),commandBody=stripMentionsForCommand(params.msg.body,mentionConfig.mentionRegexes,params.msg.selfE164),activationCommand=parseActivationCommand(commandBody),owner=isOwnerSender(params.baseMentionConfig,params.msg),shouldBypassMention=owner&&hasControlCommand(commandBody,params.cfg);if(activationCommand.hasCommand&&!owner)return params.logVerbose(`Ignoring /activation from non-owner in group ${params.conversationId}`),recordPendingGroupHistoryEntry({msg:params.msg,groupHistories:params.groupHistories,groupHistoryKey:params.groupHistoryKey,groupHistoryLimit:params.groupHistoryLimit}),{shouldProcess:!1};let mentionDebug=debugMention(params.msg,mentionConfig,params.authDir);params.replyLogger.debug({conversationId:params.conversationId,wasMentioned:mentionDebug.wasMentioned,...mentionDebug.details},`group mention debug`);let wasMentioned=mentionDebug.wasMentioned,requireMention=resolveGroupActivationFor({cfg:params.cfg,agentId:params.agentId,sessionKey:params.sessionKey,conversationId:params.conversationId})!==`always`,selfJid=params.msg.selfJid?.replace(/:\\d+/,``),replySenderJid=params.msg.replyToSenderJid?.replace(/:\\d+/,``),selfE164=params.msg.selfE164?normalizeE164(params.msg.selfE164):null,replySenderE164=params.msg.replyToSenderE164?normalizeE164(params.msg.replyToSenderE164):null,mentionGate=resolveMentionGating({requireMention,canDetectMention:!0,wasMentioned,implicitMention:!!(selfJid&&replySenderJid&&selfJid===replySenderJid||selfE164&&replySenderE164&&selfE164===replySenderE164),shouldBypassMention});return params.msg.wasMentioned=mentionGate.effectiveWasMentioned,!shouldBypassMention&&requireMention&&mentionGate.shouldSkip?(params.logVerbose(`Group message stored for context (no mention detected) in ${params.conversationId}: ${params.msg.body}`),recordPendingGroupHistoryEntry({msg:params.msg,groupHistories:params.groupHistories,groupHistoryKey:params.groupHistoryKey,groupHistoryLimit:params.groupHistoryLimit}),{shouldProcess:!1}):{shouldProcess:!0}}function trackBackgroundTask(backgroundTasks,task){backgroundTasks.add(task),task.finally(()=>{backgroundTasks.delete(task)})}function updateLastRouteInBackground(params){let storePath=resolveStorePath(params.cfg.session?.store,{agentId:params.storeAgentId}),task=updateLastRoute({storePath,sessionKey:params.sessionKey,deliveryContext:{channel:params.channel,to:params.to,accountId:params.accountId},ctx:params.ctx}).catch(err=>{params.warn({error:formatError(err),storePath,sessionKey:params.sessionKey,to:params.to},`failed updating last route`)});trackBackgroundTask(params.backgroundTasks,task)}function resolvePeerId(msg){return msg.chatType===`group`?msg.conversationId??msg.from:msg.senderE164?normalizeE164(msg.senderE164)??msg.senderE164:msg.from.includes(`@`)?jidToE164(msg.from)??msg.from:normalizeE164(msg.from)??msg.from}async function deliverWebReply(params){let{replyResult,msg,maxMediaBytes,textLimit,replyLogger,connectionId,skipLog}=params,replyStarted=Date.now(),tableMode=params.tableMode??`code`,chunkMode=params.chunkMode??`length`,textChunks=chunkMarkdownTextWithMode(markdownToWhatsApp(convertMarkdownTables(replyResult.text||``,tableMode)),textLimit,chunkMode),mediaList=replyResult.mediaUrls?.length?replyResult.mediaUrls:replyResult.mediaUrl?[replyResult.mediaUrl]:[],sendWithRetry=async(fn,label,maxAttempts=3)=>{let lastErr;for(let attempt=1;attempt<=maxAttempts;attempt++)try{return await fn()}catch(err){lastErr=err;let errText=formatError(err),isLast=attempt===maxAttempts;if(!/closed|reset|timed\\s*out|disconnect/i.test(errText)||isLast)throw err;let backoffMs=500*attempt;logVerbose(`Retrying ${label} to ${msg.from} after failure (${attempt}/${maxAttempts-1}) in ${backoffMs}ms: ${errText}`),await sleep(backoffMs)}throw lastErr};if(mediaList.length===0&&textChunks.length){let totalChunks=textChunks.length;for(let[index,chunk]of textChunks.entries()){let chunkStarted=Date.now();if(await sendWithRetry(()=>msg.reply(chunk),`text`),!skipLog){let durationMs=Date.now()-chunkStarted;whatsappOutboundLog.debug(`Sent chunk ${index+1}/${totalChunks} to ${msg.from} (${durationMs.toFixed(0)}ms)`)}}replyLogger.info({correlationId:msg.id??newConnectionId(),connectionId:connectionId??null,to:msg.from,from:msg.to,text:elide(replyResult.text,240),mediaUrl:null,mediaSizeBytes:null,mediaKind:null,durationMs:Date.now()-replyStarted},`auto-reply sent (text)`);return}let remainingText=[...textChunks];for(let[index,mediaUrl]of mediaList.entries()){let caption=index===0&&remainingText.shift()||void 0;try{let media=await loadWebMedia(mediaUrl,{maxBytes:maxMediaBytes,localRoots:params.mediaLocalRoots});if(shouldLogVerbose()&&(logVerbose(`Web auto-reply media size: ${(media.buffer.length/(1024*1024)).toFixed(2)}MB`),logVerbose(`Web auto-reply media source: ${mediaUrl} (kind ${media.kind})`)),media.kind===`image`)await sendWithRetry(()=>msg.sendMedia({image:media.buffer,caption,mimetype:media.contentType}),`media:image`);else if(media.kind===`audio`)await sendWithRetry(()=>msg.sendMedia({audio:media.buffer,ptt:!0,mimetype:media.contentType,caption}),`media:audio`);else if(media.kind===`video`)await sendWithRetry(()=>msg.sendMedia({video:media.buffer,caption,mimetype:media.contentType}),`media:video`);else{let fileName=media.fileName??mediaUrl.split(`/`).pop()??`file`,mimetype=media.contentType??`application/octet-stream`;await sendWithRetry(()=>msg.sendMedia({document:media.buffer,fileName,caption,mimetype}),`media:document`)}whatsappOutboundLog.info(`Sent media reply to ${msg.from} (${(media.buffer.length/(1024*1024)).toFixed(2)}MB)`),replyLogger.info({correlationId:msg.id??newConnectionId(),connectionId:connectionId??null,to:msg.from,from:msg.to,text:caption??null,mediaUrl,mediaSizeBytes:media.buffer.length,mediaKind:media.kind,durationMs:Date.now()-replyStarted},`auto-reply sent (media)`)}catch(err){if(whatsappOutboundLog.error(`Failed sending web media to ${msg.from}: ${formatError(err)}`),replyLogger.warn({err,mediaUrl},`failed to send web media reply`),index===0){let warning=err instanceof Error?`⚠️ Media failed: ${err.message}`:`⚠️ Media failed.`,fallbackText=[remainingText.shift()??caption??``,warning].filter(Boolean).join(`
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import"./paths-5FcIFMsj.js";import"./utils-DbaBVFaK.js";import"./embedded-helpers-C9jpiwlw.js";import"./reply-GY1C8tcv.js";import"./session-key-EoB0qaG9.js";import"./builderforce-root-D64_sXEi.js";import"./subsystem-B3TqcCrZ.js";import"./registry-TdK-aV05.js";import"./logger-Bch0bx9c.js";import"./exec-DdcIjeyn.js";import"./agent-scope-DPtjOxzp.js";import"./src-CA0fU67C.js";import"./model-selection-DG9J_VTz.js";import"./env-file-D1MDi-AM.js";import"./boolean-Cnh1KNl1.js";import"./env-BIdU5BAp.js";import"./src-DTFqOIQD.js";import"./io-BLBq4T2o.js";import"./manifest-registry-BJCfNV1a.js";import"./config-BgV_FYSq.js";import"./runner-eTTUbLAK.js";import"./model-catalog-DjNiebr7.js";import"./sandbox-C4AKi2EX.js";import"./chrome-DXt86tmV.js";import"./tailscale-DLkpGquM.js";import"./auth-lebUHrkd.js";import"./server-context-CQ2v4BAx.js";import"./frontmatter-3D1EdC1L.js";import"./skills-Ba4ftrB-.js";import"./plugin-skills-B11rggZh.js";import"./routes-DZntyPY6.js";import"./redact-BHdfp2MZ.js";import"./errors-B1MIg3g-.js";import"./paths-cR8ct-Y3.js";import"./ssrf-p9k-iapc.js";import"./image-ops-C8IUQKjn.js";import"./store-CmHBQ-yX.js";import"./ports-DgmEDNOm.js";import"./trash-DD2Hc5oq.js";import"./sessions-BuZVmOWt.js";import"./message-channel-D_jXxXQj.js";import"./plugins-D5zP6ENo.js";import{a as logWebSelfId,c as pickWebChannel,m as webAuthExists,r as WA_WEB_AUTH_DIR}from"./accounts-o35LU_iy.js";import"./accounts-rmXEiebi.js";import"./accounts-BLueHgKj.js";import"./bindings-DR59065T.js";import"./send-Aw8wK3vK.js";import"./send-ChGpVO3O.js";import"./paths-DJ6rztqJ.js";import"./tool-images-B7b_OiMz.js";import"./tool-display-ByOZtWvA.js";import"./fetch-guard-8mwt3-hm.js";import"./api-key-rotation-CyCi-UqR.js";import"./fetch-BuOLY9KP.js";import"./sqlite-C39E12XS.js";import"./tokens-CCU3zO-D.js";import"./project-context-store-wcq7lXuI.js";import"./with-timeout-GDLpcjW7.js";import"./deliver--6OBF3LL.js";import"./send-BxoVLIy1.js";import"./workspace-D4LK4thI.js";import"./reply-prefix-zIMgi6K6.js";import"./memory-cli-CbkWGjRn.js";import"./manager-DSz61dXv.js";import"./retry-DlVhg5qu.js";import"./client-xfoidwPI.js";import"./call-T8ciwMTA.js";import"./common-BTbIhLyt.js";import"./chunk-FCBlVOyo.js";import"./markdown-tables-P6uoUSFa.js";import"./ir-5BNoIXZm.js";import"./render-D1dVTEB1.js";import"./builderforcellm-syscheck-F5JMAr3p.js";import"./send-BP5osGBo.js";import"./outbound-attachment-C7wByQO5.js";import"./fetch-DnVtDecb.js";import"./delivery-queue-CXKynF1P.js";import"./channel-activity-CCNDbdD3.js";import"./tables-ERcoWFDp.js";import"./pairing-store-ti3FEkmr.js";import"./links-BgWWaaOT.js";import"./cli-utils-LBYKdNFb.js";import"./help-format-Qfk2vDNX.js";import"./progress-BfOtdN6b.js";import"./resolve-route-D49haUnv.js";import"./replies-DokbEfJD.js";import"./refresh-TiC_kLgE.js";import"./coding-tools.policy-ZhOdlcEI.js";import"./send-l3ge4wkC.js";import"./onboard-helpers-CiHzTaFX.js";import"./prompt-style-BpVK43GK.js";import"./pairing-labels-oA-nKTaW.js";import"./session-cost-usage-BjH7mxVj.js";import"./usage-format-DGf8ZWPH.js";import"./provider-usage-B-wPVN_j.js";import"./active-listener-Dcg19lJG.js";import"./exec-approvals-BpVPDVtV.js";import"./nodes-screen-C3TDIi8d.js";import"./project-context-CJj0Inz-.js";import"./control-service-y3GYvIBg.js";import"./stagger-8EkqkqJv.js";import"./channel-selection-DyAvzlY8.js";import"./mamba-state-engine-CoGqoBTH.js";import"./transformers-stream-D7nRu4Qu.js";import{n as monitorWebInbox,t as monitorWebChannel}from"./channel-web-CcCqUQrJ.js";import{t as sendMessageWhatsApp}from"./outbound-CAirtWr1.js";import{i as waitForWaConnection,t as createWaSocket}from"./session-BJHsjD3z.js";import{t as loginWeb}from"./login-D1bVUPlv.js";export{WA_WEB_AUTH_DIR,createWaSocket,logWebSelfId,loginWeb,monitorWebChannel,monitorWebInbox,pickWebChannel,sendMessageWhatsApp,waitForWaConnection,webAuthExists};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{t as CONFIG_PATH,u as resolveGatewayPort}from"./paths-BHg-VHB4.js";import"./registry-Cv7CoWAs.js";import{D as danger,a as displayPath,z as theme}from"./utils-BP60e80M.js";import{p as defaultRuntime}from"./subsystem-C4b1Von0.js";import"./boolean-ssGoaBPk.js";import"./env-BoE8QSib.js";import"./auth-profiles-C1VbcUOm.js";import{t as formatCliCommand}from"./command-format-DTMaGKs7.js";import"./src-DvWaTze9.js";import"./logger-wuOr7HKl.js";import"./session-key-CksCYipj.js";import"./builderforce-root-DY1qbWNX.js";import{t as runCommandWithTimeout}from"./exec-COgsU9ql.js";import"./agent-scope-CufEmNj_.js";import"./env-file-DeS6x2OL.js";import"./src-HrLX5bhG.js";import{a as readConfigFileSnapshot,c as writeConfigFile,f as validateConfigObjectWithPlugins,r as loadConfig}from"./io-CohJffHG.js";import"./manifest-registry-009gLJ4l.js";import"./config-toczWD3q.js";import"./frontmatter-CaY7feZm.js";import"./skills-D3MwwPOH.js";import"./plugin-skills-pSFUbhg_.js";import{t as formatDocsLink}from"./links-BKzP7VVP.js";import{C as normalizeServePath,S as normalizeHooksPath,T as resolveGmailHookRuntimeConfig,_ as buildGogWatchServeArgs,a as ensureTopic,b as generateHookToken,c as DEFAULT_GMAIL_LABEL,d as DEFAULT_GMAIL_SERVE_BIND,f as DEFAULT_GMAIL_SERVE_PATH,g as buildDefaultHookUrl,h as DEFAULT_GMAIL_TOPIC,i as ensureTailscaleEndpoint,l as DEFAULT_GMAIL_MAX_BYTES,m as DEFAULT_GMAIL_SUBSCRIPTION,n as ensureGcloudAuth,o as resolveProjectIdFromGogCredentials,p as DEFAULT_GMAIL_SERVE_PORT,r as ensureSubscription,s as runGcloud,t as ensureDependency,u as DEFAULT_GMAIL_RENEW_MINUTES,v as buildGogWatchStartArgs,w as parseTopicPath,x as mergeHookPresets,y as buildTopicPath}from"./gmail-setup-utils-CVafFKTa.js";import{spawn}from"node:child_process";async function runGmailSetup(opts){await ensureDependency(`gcloud`,[`--cask`,`gcloud-cli`]),await ensureDependency(`gog`,[`gogcli`]),opts.tailscale!==`off`&&!opts.pushEndpoint&&await ensureDependency(`tailscale`,[`tailscale`]),await ensureGcloudAuth();let configSnapshot=await readConfigFileSnapshot();if(!configSnapshot.valid)throw Error(`Config invalid: ${CONFIG_PATH}`);let baseConfig=configSnapshot.config,hooksPath=normalizeHooksPath(baseConfig.hooks?.path),hookToken=opts.hookToken??baseConfig.hooks?.token??generateHookToken(),pushToken=opts.pushToken??baseConfig.hooks?.gmail?.pushToken??generateHookToken(),topicInput=opts.topic??baseConfig.hooks?.gmail?.topic??DEFAULT_GMAIL_TOPIC,parsedTopic=parseTopicPath(topicInput),topicName=parsedTopic?.topicName??topicInput,projectId=opts.project??parsedTopic?.projectId??await resolveProjectIdFromGogCredentials();if(!projectId)throw Error(`GCP project id required (use --project or ensure gog credentials are available)`);let topicPath=buildTopicPath(projectId,topicName),subscription=opts.subscription??DEFAULT_GMAIL_SUBSCRIPTION,label=opts.label??DEFAULT_GMAIL_LABEL,hookUrl=opts.hookUrl??baseConfig.hooks?.gmail?.hookUrl??buildDefaultHookUrl(hooksPath,resolveGatewayPort(baseConfig)),serveBind=opts.bind??DEFAULT_GMAIL_SERVE_BIND,servePort=opts.port??DEFAULT_GMAIL_SERVE_PORT,configuredServePath=opts.path??baseConfig.hooks?.gmail?.serve?.path,configuredTailscaleTarget=opts.tailscaleTarget??baseConfig.hooks?.gmail?.tailscale?.target,normalizedServePath=typeof configuredServePath==`string`&&configuredServePath.trim().length>0?normalizeServePath(configuredServePath):DEFAULT_GMAIL_SERVE_PATH,normalizedTailscaleTarget=typeof configuredTailscaleTarget==`string`&&configuredTailscaleTarget.trim().length>0?configuredTailscaleTarget.trim():void 0,includeBody=opts.includeBody??!0,maxBytes=opts.maxBytes??DEFAULT_GMAIL_MAX_BYTES,renewEveryMinutes=opts.renewEveryMinutes??DEFAULT_GMAIL_RENEW_MINUTES,tailscaleMode=opts.tailscale??`funnel`,servePath=normalizeServePath(tailscaleMode!==`off`&&!normalizedTailscaleTarget?`/`:normalizedServePath),tailscalePath=normalizeServePath(opts.tailscalePath??baseConfig.hooks?.gmail?.tailscale?.path??(tailscaleMode===`off`?servePath:normalizedServePath));await runGcloud([`config`,`set`,`project`,projectId,`--quiet`]),await runGcloud([`services`,`enable`,`gmail.googleapis.com`,`pubsub.googleapis.com`,`--project`,projectId,`--quiet`]),await ensureTopic(projectId,topicName),await runGcloud([`pubsub`,`topics`,`add-iam-policy-binding`,topicName,`--project`,projectId,`--member`,`serviceAccount:gmail-api-push@system.gserviceaccount.com`,`--role`,`roles/pubsub.publisher`,`--quiet`]);let pushEndpoint=opts.pushEndpoint?opts.pushEndpoint:await ensureTailscaleEndpoint({mode:tailscaleMode,path:tailscalePath,port:servePort,target:normalizedTailscaleTarget,token:pushToken});if(!pushEndpoint)throw Error(`push endpoint required (set --push-endpoint)`);await ensureSubscription(projectId,subscription,topicName,pushEndpoint),await startGmailWatch({account:opts.account,label,topic:topicPath},!0);let validated=validateConfigObjectWithPlugins({...baseConfig,hooks:{...baseConfig.hooks,enabled:!0,path:hooksPath,token:hookToken,presets:mergeHookPresets(baseConfig.hooks?.presets,`gmail`),gmail:{...baseConfig.hooks?.gmail,account:opts.account,label,topic:topicPath,subscription,pushToken,hookUrl,includeBody,maxBytes,renewEveryMinutes,serve:{...baseConfig.hooks?.gmail?.serve,bind:serveBind,port:servePort,path:servePath},tailscale:{...baseConfig.hooks?.gmail?.tailscale,mode:tailscaleMode,path:tailscalePath,target:normalizedTailscaleTarget}}}});if(!validated.ok)throw Error(`Config validation failed: ${validated.issues[0]?.message??`invalid`}`);await writeConfigFile(validated.config);let summary={projectId,topic:topicPath,subscription,pushEndpoint,hookUrl,hookToken,pushToken,serve:{bind:serveBind,port:servePort,path:servePath}};if(opts.json){defaultRuntime.log(JSON.stringify(summary,null,2));return}defaultRuntime.log(`Gmail hooks configured:`),defaultRuntime.log(`- project: ${projectId}`),defaultRuntime.log(`- topic: ${topicPath}`),defaultRuntime.log(`- subscription: ${subscription}`),defaultRuntime.log(`- push endpoint: ${pushEndpoint}`),defaultRuntime.log(`- hook url: ${hookUrl}`),defaultRuntime.log(`- config: ${displayPath(CONFIG_PATH)}`),defaultRuntime.log(`Next: ${formatCliCommand(`builderforce webhooks gmail run`)}`)}async function runGmailService(opts){await ensureDependency(`gog`,[`gogcli`]);let resolved=resolveGmailHookRuntimeConfig(loadConfig(),{account:opts.account,topic:opts.topic,subscription:opts.subscription,label:opts.label,hookToken:opts.hookToken,pushToken:opts.pushToken,hookUrl:opts.hookUrl,serveBind:opts.bind,servePort:opts.port,servePath:opts.path,includeBody:opts.includeBody,maxBytes:opts.maxBytes,renewEveryMinutes:opts.renewEveryMinutes,tailscaleMode:opts.tailscale,tailscalePath:opts.tailscalePath,tailscaleTarget:opts.tailscaleTarget});if(!resolved.ok)throw Error(resolved.error);let runtimeConfig=resolved.value;runtimeConfig.tailscale.mode!==`off`&&(await ensureDependency(`tailscale`,[`tailscale`]),await ensureTailscaleEndpoint({mode:runtimeConfig.tailscale.mode,path:runtimeConfig.tailscale.path,port:runtimeConfig.serve.port,target:runtimeConfig.tailscale.target})),await startGmailWatch(runtimeConfig);let shuttingDown=!1,child=spawnGogServe(runtimeConfig),renewMs=runtimeConfig.renewEveryMinutes*6e4,renewTimer=setInterval(()=>{startGmailWatch(runtimeConfig)},renewMs),detachSignals=()=>{process.off(`SIGINT`,shutdown),process.off(`SIGTERM`,shutdown)},shutdown=()=>{shuttingDown||(shuttingDown=!0,detachSignals(),clearInterval(renewTimer),child.kill(`SIGTERM`))};process.on(`SIGINT`,shutdown),process.on(`SIGTERM`,shutdown),child.on(`exit`,()=>{if(shuttingDown){detachSignals();return}defaultRuntime.log(`gog watch serve exited; restarting in 2s`),setTimeout(()=>{shuttingDown||(child=spawnGogServe(runtimeConfig))},2e3)})}function spawnGogServe(cfg){let args=buildGogWatchServeArgs(cfg);return defaultRuntime.log(`Starting gog ${args.join(` `)}`),spawn(`gog`,args,{stdio:`inherit`})}async function startGmailWatch(cfg,fatal=!1){let result=await runCommandWithTimeout([`gog`,...buildGogWatchStartArgs(cfg)],{timeoutMs:12e4});if(result.code!==0){let message=result.stderr||result.stdout||`gog watch start failed`;if(fatal)throw Error(message);defaultRuntime.error(message)}}function registerWebhooksCli(program){let gmail=program.command(`webhooks`).description(`Webhook helpers and integrations`).addHelpText(`after`,()=>`\n${theme.muted(`Docs:`)} ${formatDocsLink(`/cli/webhooks`,`docs.builderforce.ai/cli/webhooks`)}\n`).command(`gmail`).description(`Gmail Pub/Sub hooks (via gogcli)`);gmail.command(`setup`).description(`Configure Gmail watch + Pub/Sub + BuilderForceAgents hooks`).requiredOption(`--account <email>`,`Gmail account to watch`).option(`--project <id>`,`GCP project id (OAuth client owner)`).option(`--topic <name>`,`Pub/Sub topic name`,DEFAULT_GMAIL_TOPIC).option(`--subscription <name>`,`Pub/Sub subscription name`,DEFAULT_GMAIL_SUBSCRIPTION).option(`--label <label>`,`Gmail label to watch`,DEFAULT_GMAIL_LABEL).option(`--hook-url <url>`,`BuilderForceAgents hook URL`).option(`--hook-token <token>`,`BuilderForceAgents hook token`).option(`--push-token <token>`,`Push token for gog watch serve`).option(`--bind <host>`,`gog watch serve bind host`,DEFAULT_GMAIL_SERVE_BIND).option(`--port <port>`,`gog watch serve port`,String(DEFAULT_GMAIL_SERVE_PORT)).option(`--path <path>`,`gog watch serve path`,DEFAULT_GMAIL_SERVE_PATH).option(`--include-body`,`Include email body snippets`,!0).option(`--max-bytes <n>`,`Max bytes for body snippets`,String(DEFAULT_GMAIL_MAX_BYTES)).option(`--renew-minutes <n>`,`Renew watch every N minutes`,String(DEFAULT_GMAIL_RENEW_MINUTES)).option(`--tailscale <mode>`,`Expose push endpoint via tailscale (funnel|serve|off)`,`funnel`).option(`--tailscale-path <path>`,`Path for tailscale serve/funnel`).option(`--tailscale-target <target>`,`Tailscale serve/funnel target (port, host:port, or URL)`).option(`--push-endpoint <url>`,`Explicit Pub/Sub push endpoint`).option(`--json`,`Output JSON summary`,!1).action(async opts=>{try{await runGmailSetup(parseGmailSetupOptions(opts))}catch(err){defaultRuntime.error(danger(String(err))),defaultRuntime.exit(1)}}),gmail.command(`run`).description(`Run gog watch serve + auto-renew loop`).option(`--account <email>`,`Gmail account to watch`).option(`--topic <topic>`,`Pub/Sub topic path (projects/.../topics/..)`).option(`--subscription <name>`,`Pub/Sub subscription name`).option(`--label <label>`,`Gmail label to watch`).option(`--hook-url <url>`,`BuilderForceAgents hook URL`).option(`--hook-token <token>`,`BuilderForceAgents hook token`).option(`--push-token <token>`,`Push token for gog watch serve`).option(`--bind <host>`,`gog watch serve bind host`).option(`--port <port>`,`gog watch serve port`).option(`--path <path>`,`gog watch serve path`).option(`--include-body`,`Include email body snippets`).option(`--max-bytes <n>`,`Max bytes for body snippets`).option(`--renew-minutes <n>`,`Renew watch every N minutes`).option(`--tailscale <mode>`,`Expose push endpoint via tailscale (funnel|serve|off)`).option(`--tailscale-path <path>`,`Path for tailscale serve/funnel`).option(`--tailscale-target <target>`,`Tailscale serve/funnel target (port, host:port, or URL)`).action(async opts=>{try{await runGmailService(parseGmailRunOptions(opts))}catch(err){defaultRuntime.error(danger(String(err))),defaultRuntime.exit(1)}})}function parseGmailSetupOptions(raw){let accountRaw=raw.account,account=typeof accountRaw==`string`?accountRaw.trim():``;if(!account)throw Error(`--account is required`);let common=parseGmailCommonOptions(raw);return{account,project:stringOption(raw.project),...gmailOptionsFromCommon(common),pushEndpoint:stringOption(raw.pushEndpoint),json:!!raw.json}}function parseGmailRunOptions(raw){let common=parseGmailCommonOptions(raw);return{account:stringOption(raw.account),...gmailOptionsFromCommon(common)}}function parseGmailCommonOptions(raw){return{topic:stringOption(raw.topic),subscription:stringOption(raw.subscription),label:stringOption(raw.label),hookUrl:stringOption(raw.hookUrl),hookToken:stringOption(raw.hookToken),pushToken:stringOption(raw.pushToken),bind:stringOption(raw.bind),port:numberOption(raw.port),path:stringOption(raw.path),includeBody:booleanOption(raw.includeBody),maxBytes:numberOption(raw.maxBytes),renewEveryMinutes:numberOption(raw.renewMinutes),tailscaleRaw:stringOption(raw.tailscale),tailscalePath:stringOption(raw.tailscalePath),tailscaleTarget:stringOption(raw.tailscaleTarget)}}function gmailOptionsFromCommon(common){return{topic:common.topic,subscription:common.subscription,label:common.label,hookUrl:common.hookUrl,hookToken:common.hookToken,pushToken:common.pushToken,bind:common.bind,port:common.port,path:common.path,includeBody:common.includeBody,maxBytes:common.maxBytes,renewEveryMinutes:common.renewEveryMinutes,tailscale:common.tailscaleRaw,tailscalePath:common.tailscalePath,tailscaleTarget:common.tailscaleTarget}}function stringOption(value){return typeof value==`string`&&value.trim()||void 0}function numberOption(value){if(value==null)return;let n=typeof value==`number`?value:Number(value);if(!(!Number.isFinite(n)||n<=0))return Math.floor(n)}function booleanOption(value){if(value!=null)return!!value}export{registerWebhooksCli};
|
|
1
|
+
import{t as CONFIG_PATH,u as resolveGatewayPort}from"./paths-BHg-VHB4.js";import"./registry-Cv7CoWAs.js";import{D as danger,a as displayPath,z as theme}from"./utils-BP60e80M.js";import{p as defaultRuntime}from"./subsystem-C4b1Von0.js";import"./boolean-ssGoaBPk.js";import"./env-BoE8QSib.js";import"./auth-profiles-pt7Tr4HA.js";import{t as formatCliCommand}from"./command-format-DTMaGKs7.js";import"./src-DvWaTze9.js";import"./logger-wuOr7HKl.js";import"./session-key-CksCYipj.js";import"./builderforce-root-DY1qbWNX.js";import{t as runCommandWithTimeout}from"./exec-COgsU9ql.js";import"./agent-scope-CufEmNj_.js";import"./env-file-DeS6x2OL.js";import"./src-HrLX5bhG.js";import{a as readConfigFileSnapshot,c as writeConfigFile,f as validateConfigObjectWithPlugins,r as loadConfig}from"./io-D9hC2aG0.js";import"./manifest-registry-009gLJ4l.js";import"./config-BpChMIJ6.js";import"./frontmatter-CaY7feZm.js";import"./skills-D3MwwPOH.js";import"./plugin-skills-pSFUbhg_.js";import{t as formatDocsLink}from"./links-BKzP7VVP.js";import{C as normalizeServePath,S as normalizeHooksPath,T as resolveGmailHookRuntimeConfig,_ as buildGogWatchServeArgs,a as ensureTopic,b as generateHookToken,c as DEFAULT_GMAIL_LABEL,d as DEFAULT_GMAIL_SERVE_BIND,f as DEFAULT_GMAIL_SERVE_PATH,g as buildDefaultHookUrl,h as DEFAULT_GMAIL_TOPIC,i as ensureTailscaleEndpoint,l as DEFAULT_GMAIL_MAX_BYTES,m as DEFAULT_GMAIL_SUBSCRIPTION,n as ensureGcloudAuth,o as resolveProjectIdFromGogCredentials,p as DEFAULT_GMAIL_SERVE_PORT,r as ensureSubscription,s as runGcloud,t as ensureDependency,u as DEFAULT_GMAIL_RENEW_MINUTES,v as buildGogWatchStartArgs,w as parseTopicPath,x as mergeHookPresets,y as buildTopicPath}from"./gmail-setup-utils-CVafFKTa.js";import{spawn}from"node:child_process";async function runGmailSetup(opts){await ensureDependency(`gcloud`,[`--cask`,`gcloud-cli`]),await ensureDependency(`gog`,[`gogcli`]),opts.tailscale!==`off`&&!opts.pushEndpoint&&await ensureDependency(`tailscale`,[`tailscale`]),await ensureGcloudAuth();let configSnapshot=await readConfigFileSnapshot();if(!configSnapshot.valid)throw Error(`Config invalid: ${CONFIG_PATH}`);let baseConfig=configSnapshot.config,hooksPath=normalizeHooksPath(baseConfig.hooks?.path),hookToken=opts.hookToken??baseConfig.hooks?.token??generateHookToken(),pushToken=opts.pushToken??baseConfig.hooks?.gmail?.pushToken??generateHookToken(),topicInput=opts.topic??baseConfig.hooks?.gmail?.topic??DEFAULT_GMAIL_TOPIC,parsedTopic=parseTopicPath(topicInput),topicName=parsedTopic?.topicName??topicInput,projectId=opts.project??parsedTopic?.projectId??await resolveProjectIdFromGogCredentials();if(!projectId)throw Error(`GCP project id required (use --project or ensure gog credentials are available)`);let topicPath=buildTopicPath(projectId,topicName),subscription=opts.subscription??DEFAULT_GMAIL_SUBSCRIPTION,label=opts.label??DEFAULT_GMAIL_LABEL,hookUrl=opts.hookUrl??baseConfig.hooks?.gmail?.hookUrl??buildDefaultHookUrl(hooksPath,resolveGatewayPort(baseConfig)),serveBind=opts.bind??DEFAULT_GMAIL_SERVE_BIND,servePort=opts.port??DEFAULT_GMAIL_SERVE_PORT,configuredServePath=opts.path??baseConfig.hooks?.gmail?.serve?.path,configuredTailscaleTarget=opts.tailscaleTarget??baseConfig.hooks?.gmail?.tailscale?.target,normalizedServePath=typeof configuredServePath==`string`&&configuredServePath.trim().length>0?normalizeServePath(configuredServePath):DEFAULT_GMAIL_SERVE_PATH,normalizedTailscaleTarget=typeof configuredTailscaleTarget==`string`&&configuredTailscaleTarget.trim().length>0?configuredTailscaleTarget.trim():void 0,includeBody=opts.includeBody??!0,maxBytes=opts.maxBytes??DEFAULT_GMAIL_MAX_BYTES,renewEveryMinutes=opts.renewEveryMinutes??DEFAULT_GMAIL_RENEW_MINUTES,tailscaleMode=opts.tailscale??`funnel`,servePath=normalizeServePath(tailscaleMode!==`off`&&!normalizedTailscaleTarget?`/`:normalizedServePath),tailscalePath=normalizeServePath(opts.tailscalePath??baseConfig.hooks?.gmail?.tailscale?.path??(tailscaleMode===`off`?servePath:normalizedServePath));await runGcloud([`config`,`set`,`project`,projectId,`--quiet`]),await runGcloud([`services`,`enable`,`gmail.googleapis.com`,`pubsub.googleapis.com`,`--project`,projectId,`--quiet`]),await ensureTopic(projectId,topicName),await runGcloud([`pubsub`,`topics`,`add-iam-policy-binding`,topicName,`--project`,projectId,`--member`,`serviceAccount:gmail-api-push@system.gserviceaccount.com`,`--role`,`roles/pubsub.publisher`,`--quiet`]);let pushEndpoint=opts.pushEndpoint?opts.pushEndpoint:await ensureTailscaleEndpoint({mode:tailscaleMode,path:tailscalePath,port:servePort,target:normalizedTailscaleTarget,token:pushToken});if(!pushEndpoint)throw Error(`push endpoint required (set --push-endpoint)`);await ensureSubscription(projectId,subscription,topicName,pushEndpoint),await startGmailWatch({account:opts.account,label,topic:topicPath},!0);let validated=validateConfigObjectWithPlugins({...baseConfig,hooks:{...baseConfig.hooks,enabled:!0,path:hooksPath,token:hookToken,presets:mergeHookPresets(baseConfig.hooks?.presets,`gmail`),gmail:{...baseConfig.hooks?.gmail,account:opts.account,label,topic:topicPath,subscription,pushToken,hookUrl,includeBody,maxBytes,renewEveryMinutes,serve:{...baseConfig.hooks?.gmail?.serve,bind:serveBind,port:servePort,path:servePath},tailscale:{...baseConfig.hooks?.gmail?.tailscale,mode:tailscaleMode,path:tailscalePath,target:normalizedTailscaleTarget}}}});if(!validated.ok)throw Error(`Config validation failed: ${validated.issues[0]?.message??`invalid`}`);await writeConfigFile(validated.config);let summary={projectId,topic:topicPath,subscription,pushEndpoint,hookUrl,hookToken,pushToken,serve:{bind:serveBind,port:servePort,path:servePath}};if(opts.json){defaultRuntime.log(JSON.stringify(summary,null,2));return}defaultRuntime.log(`Gmail hooks configured:`),defaultRuntime.log(`- project: ${projectId}`),defaultRuntime.log(`- topic: ${topicPath}`),defaultRuntime.log(`- subscription: ${subscription}`),defaultRuntime.log(`- push endpoint: ${pushEndpoint}`),defaultRuntime.log(`- hook url: ${hookUrl}`),defaultRuntime.log(`- config: ${displayPath(CONFIG_PATH)}`),defaultRuntime.log(`Next: ${formatCliCommand(`builderforce webhooks gmail run`)}`)}async function runGmailService(opts){await ensureDependency(`gog`,[`gogcli`]);let resolved=resolveGmailHookRuntimeConfig(loadConfig(),{account:opts.account,topic:opts.topic,subscription:opts.subscription,label:opts.label,hookToken:opts.hookToken,pushToken:opts.pushToken,hookUrl:opts.hookUrl,serveBind:opts.bind,servePort:opts.port,servePath:opts.path,includeBody:opts.includeBody,maxBytes:opts.maxBytes,renewEveryMinutes:opts.renewEveryMinutes,tailscaleMode:opts.tailscale,tailscalePath:opts.tailscalePath,tailscaleTarget:opts.tailscaleTarget});if(!resolved.ok)throw Error(resolved.error);let runtimeConfig=resolved.value;runtimeConfig.tailscale.mode!==`off`&&(await ensureDependency(`tailscale`,[`tailscale`]),await ensureTailscaleEndpoint({mode:runtimeConfig.tailscale.mode,path:runtimeConfig.tailscale.path,port:runtimeConfig.serve.port,target:runtimeConfig.tailscale.target})),await startGmailWatch(runtimeConfig);let shuttingDown=!1,child=spawnGogServe(runtimeConfig),renewMs=runtimeConfig.renewEveryMinutes*6e4,renewTimer=setInterval(()=>{startGmailWatch(runtimeConfig)},renewMs),detachSignals=()=>{process.off(`SIGINT`,shutdown),process.off(`SIGTERM`,shutdown)},shutdown=()=>{shuttingDown||(shuttingDown=!0,detachSignals(),clearInterval(renewTimer),child.kill(`SIGTERM`))};process.on(`SIGINT`,shutdown),process.on(`SIGTERM`,shutdown),child.on(`exit`,()=>{if(shuttingDown){detachSignals();return}defaultRuntime.log(`gog watch serve exited; restarting in 2s`),setTimeout(()=>{shuttingDown||(child=spawnGogServe(runtimeConfig))},2e3)})}function spawnGogServe(cfg){let args=buildGogWatchServeArgs(cfg);return defaultRuntime.log(`Starting gog ${args.join(` `)}`),spawn(`gog`,args,{stdio:`inherit`})}async function startGmailWatch(cfg,fatal=!1){let result=await runCommandWithTimeout([`gog`,...buildGogWatchStartArgs(cfg)],{timeoutMs:12e4});if(result.code!==0){let message=result.stderr||result.stdout||`gog watch start failed`;if(fatal)throw Error(message);defaultRuntime.error(message)}}function registerWebhooksCli(program){let gmail=program.command(`webhooks`).description(`Webhook helpers and integrations`).addHelpText(`after`,()=>`\n${theme.muted(`Docs:`)} ${formatDocsLink(`/cli/webhooks`,`docs.builderforce.ai/cli/webhooks`)}\n`).command(`gmail`).description(`Gmail Pub/Sub hooks (via gogcli)`);gmail.command(`setup`).description(`Configure Gmail watch + Pub/Sub + BuilderForceAgents hooks`).requiredOption(`--account <email>`,`Gmail account to watch`).option(`--project <id>`,`GCP project id (OAuth client owner)`).option(`--topic <name>`,`Pub/Sub topic name`,DEFAULT_GMAIL_TOPIC).option(`--subscription <name>`,`Pub/Sub subscription name`,DEFAULT_GMAIL_SUBSCRIPTION).option(`--label <label>`,`Gmail label to watch`,DEFAULT_GMAIL_LABEL).option(`--hook-url <url>`,`BuilderForceAgents hook URL`).option(`--hook-token <token>`,`BuilderForceAgents hook token`).option(`--push-token <token>`,`Push token for gog watch serve`).option(`--bind <host>`,`gog watch serve bind host`,DEFAULT_GMAIL_SERVE_BIND).option(`--port <port>`,`gog watch serve port`,String(DEFAULT_GMAIL_SERVE_PORT)).option(`--path <path>`,`gog watch serve path`,DEFAULT_GMAIL_SERVE_PATH).option(`--include-body`,`Include email body snippets`,!0).option(`--max-bytes <n>`,`Max bytes for body snippets`,String(DEFAULT_GMAIL_MAX_BYTES)).option(`--renew-minutes <n>`,`Renew watch every N minutes`,String(DEFAULT_GMAIL_RENEW_MINUTES)).option(`--tailscale <mode>`,`Expose push endpoint via tailscale (funnel|serve|off)`,`funnel`).option(`--tailscale-path <path>`,`Path for tailscale serve/funnel`).option(`--tailscale-target <target>`,`Tailscale serve/funnel target (port, host:port, or URL)`).option(`--push-endpoint <url>`,`Explicit Pub/Sub push endpoint`).option(`--json`,`Output JSON summary`,!1).action(async opts=>{try{await runGmailSetup(parseGmailSetupOptions(opts))}catch(err){defaultRuntime.error(danger(String(err))),defaultRuntime.exit(1)}}),gmail.command(`run`).description(`Run gog watch serve + auto-renew loop`).option(`--account <email>`,`Gmail account to watch`).option(`--topic <topic>`,`Pub/Sub topic path (projects/.../topics/..)`).option(`--subscription <name>`,`Pub/Sub subscription name`).option(`--label <label>`,`Gmail label to watch`).option(`--hook-url <url>`,`BuilderForceAgents hook URL`).option(`--hook-token <token>`,`BuilderForceAgents hook token`).option(`--push-token <token>`,`Push token for gog watch serve`).option(`--bind <host>`,`gog watch serve bind host`).option(`--port <port>`,`gog watch serve port`).option(`--path <path>`,`gog watch serve path`).option(`--include-body`,`Include email body snippets`).option(`--max-bytes <n>`,`Max bytes for body snippets`).option(`--renew-minutes <n>`,`Renew watch every N minutes`).option(`--tailscale <mode>`,`Expose push endpoint via tailscale (funnel|serve|off)`).option(`--tailscale-path <path>`,`Path for tailscale serve/funnel`).option(`--tailscale-target <target>`,`Tailscale serve/funnel target (port, host:port, or URL)`).action(async opts=>{try{await runGmailService(parseGmailRunOptions(opts))}catch(err){defaultRuntime.error(danger(String(err))),defaultRuntime.exit(1)}})}function parseGmailSetupOptions(raw){let accountRaw=raw.account,account=typeof accountRaw==`string`?accountRaw.trim():``;if(!account)throw Error(`--account is required`);let common=parseGmailCommonOptions(raw);return{account,project:stringOption(raw.project),...gmailOptionsFromCommon(common),pushEndpoint:stringOption(raw.pushEndpoint),json:!!raw.json}}function parseGmailRunOptions(raw){let common=parseGmailCommonOptions(raw);return{account:stringOption(raw.account),...gmailOptionsFromCommon(common)}}function parseGmailCommonOptions(raw){return{topic:stringOption(raw.topic),subscription:stringOption(raw.subscription),label:stringOption(raw.label),hookUrl:stringOption(raw.hookUrl),hookToken:stringOption(raw.hookToken),pushToken:stringOption(raw.pushToken),bind:stringOption(raw.bind),port:numberOption(raw.port),path:stringOption(raw.path),includeBody:booleanOption(raw.includeBody),maxBytes:numberOption(raw.maxBytes),renewEveryMinutes:numberOption(raw.renewMinutes),tailscaleRaw:stringOption(raw.tailscale),tailscalePath:stringOption(raw.tailscalePath),tailscaleTarget:stringOption(raw.tailscaleTarget)}}function gmailOptionsFromCommon(common){return{topic:common.topic,subscription:common.subscription,label:common.label,hookUrl:common.hookUrl,hookToken:common.hookToken,pushToken:common.pushToken,bind:common.bind,port:common.port,path:common.path,includeBody:common.includeBody,maxBytes:common.maxBytes,renewEveryMinutes:common.renewEveryMinutes,tailscale:common.tailscaleRaw,tailscalePath:common.tailscalePath,tailscaleTarget:common.tailscaleTarget}}function stringOption(value){return typeof value==`string`&&value.trim()||void 0}function numberOption(value){if(value==null)return;let n=typeof value==`number`?value:Number(value);if(!(!Number.isFinite(n)||n<=0))return Math.floor(n)}function booleanOption(value){if(value!=null)return!!value}export{registerWebhooksCli};
|