@seanhogg/builderforce-agents 2026.10.9 → 2026.10.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{acp-cli-DcKpPsJa.js → acp-cli-C23mmrQt.js} +1 -1
- package/dist/{acp-cli-BxH-eUDl.js → acp-cli-D6F-D5JB.js} +1 -1
- package/dist/{agent-cXF-aL0g.js → agent-B-2r1Lr_.js} +1 -1
- package/dist/{agent-wJmvciTM.js → agent-BI9qSnSp.js} +1 -1
- package/dist/{agentbot-cli-Cub3Abbt.js → agentbot-cli-Cyrhr5jX.js} +1 -1
- package/dist/{agentbot-cli-CTRvEfBp.js → agentbot-cli-sC55m-XS.js} +1 -1
- package/dist/{agents-Cr7WO73I.js → agents-CMThT_Bj.js} +1 -1
- package/dist/agents-Chz9nfm2.js +1 -0
- package/dist/{api-key-rotation-CHBjUwUJ.js → api-key-rotation-CyCi-UqR.js} +1 -1
- package/dist/{audio-preflight-CWFuqbao.js → audio-preflight-B411b2-y.js} +1 -1
- package/dist/{audio-preflight-F2e3Y4CW.js → audio-preflight-Cs4eUjQk.js} +1 -1
- package/dist/{audit-DGnEhZYe.js → audit-B-USV03V.js} +1 -1
- package/dist/{audit-DBjjjW93.js → audit-SKNPS-K2.js} +1 -1
- package/dist/auth-choice-CChsMy-F.js +1 -0
- package/dist/{auth-choice-9gZuOvPS.js → auth-choice-CCib_yVL.js} +1 -1
- package/dist/auth-choice-DSnpkrMc.js +1 -0
- package/dist/{auth-choice-BoZFVmEa.js → auth-choice-DzBqqq7i.js} +1 -1
- package/dist/auth-choice.apply-6f3Jb_lS.js +1 -0
- package/dist/{auth-choice.apply-CcatXiNo.js → auth-choice.apply-BgOXoS8X.js} +1 -1
- package/dist/{auth-choice.apply-BHLQeym9.js → auth-choice.apply-DBuvopiF.js} +1 -1
- package/dist/auth-choice.apply-DeXnLwVS.js +1 -0
- package/dist/auth-choice.apply.transformers-CZDuBaOr.js +1 -0
- package/dist/{auth-choice.apply.transformers-CIn3fs7K.js → auth-choice.apply.transformers-Df9l_jRz.js} +2 -2
- package/dist/{auth-choice.apply.transformers-1plI0MUg.js → auth-choice.apply.transformers-DmdxpHGz.js} +2 -2
- package/dist/{auth-choice.apply.transformers-D5OrjEHo.js → auth-choice.apply.transformers-dn7l6XyJ.js} +1 -1
- package/dist/{auth-json-D1ite-pW.js → auth-json-BB-VBn5E.js} +1 -1
- package/dist/{auth-json-CN3MWw57.js → auth-json-BVyos95N.js} +1 -1
- package/dist/{auth-json-HGu227VM.js → auth-json-CoOe4tEg.js} +1 -1
- package/dist/{auth-json-DZ7E50Y1.js → auth-json-wrKixZxh.js} +1 -1
- package/dist/{auth-profiles-C1VbcUOm.js → auth-profiles-pt7Tr4HA.js} +1 -1
- package/dist/{auth-token-CyVfNEQb.js → auth-token-BE67qxLw.js} +1 -1
- package/dist/{auth-token-CoQ5ePPl.js → auth-token-BPHeoBAW.js} +1 -1
- package/dist/{banner-DY-L7_eI.js → banner-ErBINvbk.js} +1 -1
- package/dist/{browser-cli-D2O94twn.js → browser-cli-BZc64-Xx.js} +1 -1
- package/dist/{browser-cli-CoRx_4iM.js → browser-cli-CoxVKdon.js} +1 -1
- package/dist/build-info.json +3 -3
- package/dist/{builderforce-BmrsVdFw.js → builderforce-B9187Tm9.js} +4 -4
- package/dist/{builderforce-Bwyw0GJ6.js → builderforce-BLqHwgeu.js} +4 -4
- package/dist/builderforce-api-DKgXl8BH.js +1 -0
- package/dist/builderforce-api-DcPAGsla.js +1 -0
- package/dist/builderforce-onboarding-CaPJZSvw.js +24 -0
- package/dist/builderforce-onboarding-RXFb0gct.js +24 -0
- package/dist/{builderforcellm-syscheck-CprBhARf.js → builderforcellm-syscheck-9ksvqHYX.js} +1 -1
- package/dist/{builderforcellm-syscheck-DrFJ638L.js → builderforcellm-syscheck-F5JMAr3p.js} +1 -1
- package/dist/{call-DxPWzV-k.js → call-BnAs_SER.js} +1 -1
- package/dist/{call-DFjBq0H2.js → call-D1Opj5ev.js} +1 -1
- package/dist/{call-DmAU4cRX.js → call-Du2LiaX6.js} +1 -1
- package/dist/{call-BbRf8gFM.js → call-T8ciwMTA.js} +1 -1
- package/dist/{channel-options-d4EwVQD0.js → channel-options-B7sRMp2v.js} +1 -1
- package/dist/{channel-options-CDixz6dT.js → channel-options-rhDBCtlp.js} +1 -1
- package/dist/{channel-web-DJa8JC9W.js → channel-web-CcCqUQrJ.js} +1 -1
- package/dist/{channels-cli-BgKy0MbE.js → channels-cli-BjnLW14T.js} +1 -1
- package/dist/{channels-cli-nNW0ezPM.js → channels-cli-DVWUBsmc.js} +1 -1
- package/dist/{chrome-BnEbJV3D.js → chrome-CFmcixaE.js} +1 -1
- package/dist/{chrome-a3X9_-nf.js → chrome-DXt86tmV.js} +1 -1
- package/dist/cli/daemon-cli.js +1 -1
- package/dist/{cli-DkWt7p2x.js → cli-BUqtALJK.js} +1 -1
- package/dist/{cli-C5MbcECQ.js → cli-K4reS6IS.js} +1 -1
- package/dist/{coding-tools.policy-NEPm7Mz1.js → coding-tools.policy-D9Ba8eDh.js} +1 -1
- package/dist/{coding-tools.policy-6qh9acJy.js → coding-tools.policy-ZhOdlcEI.js} +1 -1
- package/dist/{command-registry-COUcUWby.js → command-registry-B7uAoROP.js} +1 -1
- package/dist/{command-registry-4_K-lfW5.js → command-registry-CW16Mk2Y.js} +1 -1
- package/dist/{completion-cli-DlvHqL86.js → completion-cli-ZvXrCQqk.js} +1 -1
- package/dist/{completion-cli-B2qcVd6q.js → completion-cli-gyvx5ZXu.js} +1 -1
- package/dist/{completion-cli-DpFvU4Qn.js → completion-cli-n8UsdT91.js} +1 -1
- package/dist/{completion-cli-SdcQ-kQj.js → completion-cli-sKReGv3d.js} +1 -1
- package/dist/{config-_1Ca6jGb.js → config-BgV_FYSq.js} +1 -1
- package/dist/{config-toczWD3q.js → config-BpChMIJ6.js} +1 -1
- package/dist/{config-BTWlKwtB.js → config-D01EgOky.js} +1 -1
- package/dist/{config-27_FNba3.js → config-Dsnbi-a3.js} +1 -1
- package/dist/{config-cli-DeiQz5sY.js → config-cli-Bpo74mE5.js} +1 -1
- package/dist/{config-cli-CfczShaZ.js → config-cli-CF31O_5s.js} +1 -1
- package/dist/{config-guard-CD-Wq8kk.js → config-guard-BRUOk5YL.js} +1 -1
- package/dist/{config-guard-ClVl2FvD.js → config-guard-BUpQiSTW.js} +1 -1
- package/dist/{config-guard-B4in8l8I.js → config-guard-USCN-dq0.js} +1 -1
- package/dist/{config-validation-jpeXzoU3.js → config-validation-BGpSeNbh.js} +1 -1
- package/dist/{config-validation-C6u-z9bJ.js → config-validation-CdBJ-tZq.js} +1 -1
- package/dist/{configure-3W9C5LiT.js → configure-CWr61Ph2.js} +1 -1
- package/dist/configure-DhazB2qh.js +1 -0
- package/dist/{configure-BtXQW7ue.js → configure-DlcO1tWx.js} +1 -1
- package/dist/configure-MXheujvX.js +1 -0
- package/dist/{control-service-CJuuqNOE.js → control-service-2PkCt256.js} +1 -1
- package/dist/{control-service-qKfWP7VD.js → control-service-CcsbseZS.js} +1 -1
- package/dist/{control-service-izGyCWQs.js → control-service-qK1oboMo.js} +1 -1
- package/dist/{control-service-BbsswoMy.js → control-service-y3GYvIBg.js} +1 -1
- package/dist/{cron-cli-BrOM4s6N.js → cron-cli-BYu_lA8i.js} +1 -1
- package/dist/{cron-cli-CwtTX6pg.js → cron-cli-D_Og20iB.js} +1 -1
- package/dist/{daemon-cli-DyVsMf8p.js → daemon-cli-BNzthScZ.js} +1 -1
- package/dist/{daemon-cli-DlwOVDbt.js → daemon-cli-Bh3p0hui.js} +1 -1
- package/dist/{daemon-cli-Br0wu9xQ.js → daemon-cli-DxxKiKVN.js} +1 -1
- package/dist/{daemon-cli-DmicpZED.js → daemon-cli-emNxLkIw.js} +1 -1
- package/dist/{daemon-runtime-CtOr1ncS.js → daemon-runtime-9XitJmIL.js} +1 -1
- package/dist/{daemon-runtime-B4UjqdyJ.js → daemon-runtime-Dx800VUt.js} +1 -1
- package/dist/{deliver-BpLm3ktn.js → deliver--6OBF3LL.js} +1 -1
- package/dist/{deliver-9o_SE4ZK.js → deliver-ADpnRGRf.js} +1 -1
- package/dist/{deliver-D2VAVelb.js → deliver-BM6-damm.js} +1 -1
- package/dist/{deliver-BuZu68tp.js → deliver-CsG0cHbZ.js} +1 -1
- package/dist/{deps-CkJiJ6wc.js → deps-Dg_9rfXK.js} +1 -1
- package/dist/{devices-cli-BfXeDnbx.js → devices-cli-B8DXzcRP.js} +1 -1
- package/dist/{devices-cli-B9G6YOsS.js → devices-cli-BZkdWSx-.js} +1 -1
- package/dist/{directory-cli-BRCaiGOn.js → directory-cli-B78pAVI_.js} +1 -1
- package/dist/{directory-cli-D5ciZ5fY.js → directory-cli-CSaRkkL8.js} +1 -1
- package/dist/{dm-policy-shared-CRZpjRv0.js → dm-policy-shared-B9lW-AsK.js} +1 -1
- package/dist/{dm-policy-shared-Dhw9_6mi.js → dm-policy-shared-DYZ_T-az.js} +1 -1
- package/dist/{dns-cli-CgZ7oMcT.js → dns-cli-CLPGOFA1.js} +1 -1
- package/dist/{dns-cli-C4f4Tyij.js → dns-cli-dr5dHzfI.js} +1 -1
- package/dist/{doctor-completion-BSotFS6p.js → doctor-completion-94zme499.js} +1 -1
- package/dist/{doctor-completion-DVxbs-74.js → doctor-completion-CbF34DIH.js} +1 -1
- package/dist/{embedded-helpers-CEsr3aQ0.js → embedded-helpers-C9jpiwlw.js} +1 -1
- package/dist/{embedded-helpers-DK8_apW0.js → embedded-helpers-DdU30lmt.js} +1 -1
- package/dist/entry.js +1 -1
- package/dist/{exec-approvals-cli-YuOu7mVg.js → exec-approvals-cli-CS_uabo7.js} +1 -1
- package/dist/{exec-approvals-cli-BPFi82B0.js → exec-approvals-cli-ktB7M7WE.js} +1 -1
- package/dist/{gateway-cli-D2Bg1Um6.js → gateway-cli-CKcoLVMA.js} +5 -5
- package/dist/{gateway-cli-DFEo8C0z.js → gateway-cli-CuXBDBWe.js} +5 -5
- package/dist/{gateway-rpc-BXR_lVIx.js → gateway-rpc-B02y0PnE.js} +1 -1
- package/dist/{gateway-rpc-ByUcnQ7W.js → gateway-rpc-ff1RVb0_.js} +1 -1
- package/dist/{gemini-auth-CkD5jCPh.js → gemini-auth-DDR12zst.js} +1 -1
- package/dist/health-D0DZmCmh.js +1 -0
- package/dist/{health-yS3NRKvY.js → health-FO8MG5Ur.js} +1 -1
- package/dist/{health-DVo8a9yg.js → health-zrsgFZmR.js} +1 -1
- package/dist/{hooks-cli-B0lVee-j.js → hooks-cli-5Y4hnSX9.js} +1 -1
- package/dist/{hooks-cli-DsVmrQAG.js → hooks-cli-DpHZzRo2.js} +1 -1
- package/dist/index.js +2 -2
- package/dist/{ink-session-BitZ1wcY.js → ink-session-Dt9Q4iH-.js} +2 -2
- package/dist/{ink-session-CyAqXDla.js → ink-session-N8wCBzwk.js} +2 -2
- package/dist/{installs-CWd54ARy.js → installs-B_t2YXgq.js} +1 -1
- package/dist/{installs-C9A8QFiF.js → installs-DFiF4lGy.js} +1 -1
- package/dist/{io-3R_ZyUxB.js → io-BLBq4T2o.js} +1 -1
- package/dist/{io-DSIGyPrT.js → io-CXN4uLS2.js} +1 -1
- package/dist/{io-6jLoKffb.js → io-Ckd4NlvH.js} +1 -1
- package/dist/{io-CohJffHG.js → io-D9hC2aG0.js} +1 -1
- package/dist/{lifecycle-core-BpMvDXy1.js → lifecycle-core-D9Dg5Qps.js} +1 -1
- package/dist/{lifecycle-core-Dwb4gHjZ.js → lifecycle-core-uxjxTzFv.js} +1 -1
- package/dist/login-B3sDAgHb.js +1 -0
- package/dist/{login-C_ZdMOvv.js → login-CwwuaXtb.js} +1 -1
- package/dist/{login-DtDUyFO3.js → login-D1bVUPlv.js} +1 -1
- package/dist/{login-CEnjUo5c.js → login-GLDax56V.js} +1 -1
- package/dist/{login-qr-B9lyIZVD.js → login-qr-CbiUcBLy.js} +1 -1
- package/dist/{login-qr-BCBsxwhT.js → login-qr-Cp0YqK4e.js} +1 -1
- package/dist/{logs-cli-CdM5W3HE.js → logs-cli-Cy11HfSG.js} +1 -1
- package/dist/{logs-cli-jh5Xn3TD.js → logs-cli-nD36c-Y1.js} +1 -1
- package/dist/{manager-CRba8roB.js → manager-BeohB4-8.js} +1 -1
- package/dist/{manager-B3IJ_IKf.js → manager-CTTXDBt3.js} +1 -1
- package/dist/{manager-TGVy_fAb.js → manager-CoQMlcrf.js} +1 -1
- package/dist/{manager-DwywI_5-.js → manager-DSz61dXv.js} +1 -1
- package/dist/{memory-cli-BlayFTAM.js → memory-cli-BpAiRntI.js} +1 -1
- package/dist/{memory-cli-DRz4wtHk.js → memory-cli-CbkWGjRn.js} +1 -1
- package/dist/{memory-cli-PdyTQ84w.js → memory-cli-CrBMLM2P.js} +1 -1
- package/dist/{memory-cli-ivAs7q7v.js → memory-cli-CveeVOWH.js} +1 -1
- package/dist/{model-catalog-CQOdhMUY.js → model-catalog-B29yeBYS.js} +1 -1
- package/dist/{model-catalog-CiiFJX77.js → model-catalog-BeBXvbFm.js} +1 -1
- package/dist/model-catalog-CMKHKuBL.js +1 -0
- package/dist/{model-catalog-C6UrZ0uG.js → model-catalog-DjNiebr7.js} +1 -1
- package/dist/{model-discovery-C9Xm95uL.js → model-discovery-D0i1JpiL.js} +1 -1
- package/dist/{model-picker-swoSwauV.js → model-picker-CGDNPRPc.js} +1 -1
- package/dist/model-picker-CGEF8yhc.js +1 -0
- package/dist/model-picker-DeUNOC78.js +1 -0
- package/dist/{model-picker-BUePD7Zg.js → model-picker-EIhpfOZa.js} +1 -1
- package/dist/{model-selection-9bRFKBI_.js → model-selection-DG9J_VTz.js} +1 -1
- package/dist/{models-BNivsd2o.js → models-BjIzVQYX.js} +2 -2
- package/dist/{models-DQeSIY6M.js → models-JoqOgEF5.js} +1 -1
- package/dist/{models-cli-KokGgWeP.js → models-cli-B2zbchgs.js} +1 -1
- package/dist/{models-cli-BcNxU4P_.js → models-cli-CkFdc8NN.js} +2 -2
- package/dist/{node-cli-DIMh3X2F.js → node-cli-CXnuxiBq.js} +1 -1
- package/dist/{node-cli-EmTU-Gh0.js → node-cli-oVyjVnb7.js} +1 -1
- package/dist/{nodes-cli-BX8TznFK.js → nodes-cli-BBVotxNt.js} +1 -1
- package/dist/{nodes-cli-DyHovdAc.js → nodes-cli-DVMBSUhK.js} +1 -1
- package/dist/{onboard-DfMVh1bM.js → onboard-BItclJp0.js} +1 -1
- package/dist/{onboard-BVmZ4jMw.js → onboard-CqvHIvKj.js} +1 -1
- package/dist/{onboard-auth.credentials-yagR-VMG.js → onboard-auth.credentials-DneFSdYg.js} +1 -1
- package/dist/{onboard-auth.credentials-BuT-etnE.js → onboard-auth.credentials-DpitLlzw.js} +1 -1
- package/dist/onboard-channels-B91m5S3w.js +1 -0
- package/dist/onboard-channels-BOoPtYbF.js +1 -0
- package/dist/{onboard-channels-B6QDFkkK.js → onboard-channels-Dn0u5C-C.js} +1 -1
- package/dist/{onboard-channels-C8FCFn29.js → onboard-channels-vhtccaIV.js} +1 -1
- package/dist/onboard-custom-BN0uzSq_.js +1 -0
- package/dist/{onboard-custom-D1nd8Hlu.js → onboard-custom-BYIza2e7.js} +1 -1
- package/dist/onboard-custom-CCFthqto.js +1 -0
- package/dist/{onboard-custom-C_BI0ZXn.js → onboard-custom-Ckf0xKXY.js} +1 -1
- package/dist/{onboard-helpers-CGlLpagb.js → onboard-helpers-B8I5AVyb.js} +1 -1
- package/dist/{onboard-helpers-CckrS8_K.js → onboard-helpers-Ce_c4Raj.js} +1 -1
- package/dist/{onboard-helpers-Cf5dNq7-.js → onboard-helpers-CiHzTaFX.js} +1 -1
- package/dist/{onboard-helpers-BvIZ4-R5.js → onboard-helpers-DC-nMl-V.js} +1 -1
- package/dist/{onboard-interactive-DYJttZ2w.js → onboard-interactive-Cl2K3EYn.js} +1 -1
- package/dist/{onboard-interactive-zgjmwJz-.js → onboard-interactive-JNux9zfA.js} +1 -1
- package/dist/{onboard-interactive-B3-KBZbZ.js → onboard-interactive-J_ObFzeW.js} +1 -1
- package/dist/{onboard-interactive-Dc_7URYb.js → onboard-interactive-OUNsvlh0.js} +1 -1
- package/dist/{onboard-remote-D5lR2lVm.js → onboard-remote-0-q7MG9t.js} +1 -1
- package/dist/{onboard-remote-BmSyHww1.js → onboard-remote-CgAAEZpq.js} +1 -1
- package/dist/{onboard-remote-CzzQMZ3X.js → onboard-remote-DKXHDdBD.js} +1 -1
- package/dist/{onboard-remote-DcuX8b2g.js → onboard-remote-cB8j9RG-.js} +1 -1
- package/dist/{onboard-skills-ILHIeg1R.js → onboard-skills-47upVdA2.js} +1 -1
- package/dist/{onboard-skills-BPlNN_-T.js → onboard-skills-9Um4TL2x.js} +1 -1
- package/dist/{onboard-skills-DIhjDMom.js → onboard-skills-DhCmvhJY.js} +1 -1
- package/dist/{onboard-skills-CI1OtWsE.js → onboard-skills-mI2kfvdT.js} +1 -1
- package/dist/{onboarding-D4-HDbmU.js → onboarding-BSENgR9C.js} +5 -5
- package/dist/{onboarding-CP9rrz8y.js → onboarding-CIaZLNc1.js} +5 -5
- package/dist/{onboarding.finalize-C2kZi7F0.js → onboarding.finalize-BwOpvoPE.js} +1 -1
- package/dist/{onboarding.finalize-BfWXPgX7.js → onboarding.finalize-yMK-g7Uy.js} +1 -1
- package/dist/{onboarding.gateway-config-Cd7_bXVs.js → onboarding.gateway-config-Kn1O-QFl.js} +1 -1
- package/dist/{onboarding.gateway-config-Bd8HJkso.js → onboarding.gateway-config-huOjFf8D.js} +1 -1
- package/dist/{openai-model-default-Cp3nf21W.js → openai-model-default-CH2-2Hvk.js} +1 -1
- package/dist/{openai-model-default-BMRrqTmH.js → openai-model-default-pfoEzWYJ.js} +1 -1
- package/dist/{outbound-BRInCJD9.js → outbound-BdeHcMAo.js} +1 -1
- package/dist/{outbound-CAtBpFoD.js → outbound-BylJYD7n.js} +1 -1
- package/dist/{outbound-OI-t5zZ0.js → outbound-CAirtWr1.js} +1 -1
- package/dist/{outbound-CnIvOJlU.js → outbound-VNcvF2MG.js} +1 -1
- package/dist/{outbound-send-deps-m6DqOma_.js → outbound-send-deps-B3Lg-uqF.js} +1 -1
- package/dist/{pairing-cli-CEr0yEsc.js → pairing-cli-5RtPvz2i.js} +1 -1
- package/dist/{pairing-cli-Dxfoni-F.js → pairing-cli-C_Mj6Dy4.js} +1 -1
- package/dist/{pairing-labels-3j_iRYOO.js → pairing-labels-BJPrScRl.js} +1 -1
- package/dist/{pairing-labels-BW5jQZlr.js → pairing-labels-oA-nKTaW.js} +1 -1
- package/dist/{pairing-store-QDb6lhIU.js → pairing-store-YRy7EBgI.js} +1 -1
- package/dist/{pairing-store-CbvMJhD3.js → pairing-store-ti3FEkmr.js} +1 -1
- package/dist/{plugin-auto-enable-BV9K9Vhr.js → plugin-auto-enable-Cupr4wbt.js} +1 -1
- package/dist/{plugin-auto-enable-DDry2fA6.js → plugin-auto-enable-D8gKiE3F.js} +1 -1
- package/dist/plugin-registry-BEfyc2f_.js +1 -0
- package/dist/{plugin-registry-C-_GA65s.js → plugin-registry-BoPaef5I.js} +1 -1
- package/dist/{plugin-registry-SAdxNUwm.js → plugin-registry-CxnuHO_n.js} +1 -1
- package/dist/plugin-registry-D0tIqo8L.js +1 -0
- package/dist/plugin-sdk/{accounts-Cy3WCbWg.js → accounts-BwreSNAR.js} +1 -1
- package/dist/plugin-sdk/{active-listener-DVWVNlT9.js → active-listener-DpQ7aGYd.js} +1 -1
- package/dist/plugin-sdk/agent-runtime/src/infra/workflow-telemetry.d.ts +12 -1
- package/dist/plugin-sdk/{agent-scope-DgKN27hJ.js → agent-scope-BQByW0cD.js} +1 -1
- package/dist/plugin-sdk/{api-key-rotation-ftXf7mBZ.js → api-key-rotation-7YdImWrh.js} +1 -1
- package/dist/plugin-sdk/{audio-preflight-CfTmmeS-.js → audio-preflight-EbkaATDO.js} +1 -1
- package/dist/plugin-sdk/{auth-json-BrNBg87n.js → auth-json-DK6qod1_.js} +1 -1
- package/dist/plugin-sdk/{bindings-CH-YLOLC.js → bindings-CDEzl4kl.js} +1 -1
- package/dist/plugin-sdk/{channel-web-B6rg0Rbf.js → channel-web-D2KuONp0.js} +1 -1
- package/dist/plugin-sdk/{chrome-CuXP-hes.js → chrome-SOXFIkUM.js} +1 -1
- package/dist/plugin-sdk/{chunk-C94IAOuf.js → chunk-cW0POl22.js} +1 -1
- package/dist/plugin-sdk/{command-format-B3XMq_73.js → command-format-CAX9XFjI.js} +1 -1
- package/dist/plugin-sdk/{common-n0l_XN-S.js → common-BxEWhN2X.js} +1 -1
- package/dist/plugin-sdk/{config-DsXZsCkJ.js → config-v1EU9Ll8.js} +2 -2
- package/dist/plugin-sdk/{fetch-B-GxSYRO.js → fetch-DH0Y8iyO.js} +1 -1
- package/dist/plugin-sdk/index.js +1 -1
- package/dist/plugin-sdk/{login-_my8QwPP.js → login-d1zBgykF.js} +1 -1
- package/dist/plugin-sdk/{login-qr-BaePtXuG.js → login-qr-B6exvQnN.js} +1 -1
- package/dist/plugin-sdk/{manager-BsC-4ymy.js → manager-BH_bmGds.js} +1 -1
- package/dist/plugin-sdk/{markdown-tables-BUfhHgfs.js → markdown-tables-Epim9b-0.js} +1 -1
- package/dist/plugin-sdk/{message-channel-CuZ2xOAM.js → message-channel-sBPQc_-T.js} +1 -1
- package/dist/plugin-sdk/{model-catalog-yuiXVcmw.js → model-catalog-cXsza5GU.js} +1 -1
- package/dist/plugin-sdk/{model-selection-BtgvnqB5.js → model-selection-K82MAGlL.js} +1 -1
- package/dist/plugin-sdk/{outbound-D_attiyO.js → outbound-Chn_H1O7.js} +1 -1
- package/dist/plugin-sdk/{plugins-BdkC9v5E.js → plugins-CaUOZBVb.js} +1 -1
- package/dist/plugin-sdk/{pw-ai-A7Rathx6.js → pw-ai-BIiJF7ZD.js} +1 -1
- package/dist/plugin-sdk/{qmd-manager-Dxn0jCpE.js → qmd-manager-BRe5fGZw.js} +1 -1
- package/dist/plugin-sdk/{registry-CZHRcH-q.js → registry-DJq2Cvo9.js} +1 -1
- package/dist/plugin-sdk/{render-CuA_WRX5.js → render-BUCRXPIk.js} +1 -1
- package/dist/plugin-sdk/{replies-DmLfO-pg.js → replies-Cz5OD3qN.js} +1 -1
- package/dist/plugin-sdk/{reply-3-ne-N_7.js → reply-D5Uk7pUv.js} +9 -9
- package/dist/plugin-sdk/{reply-prefix-w7kAvH11.js → reply-prefix-CCymsmsP.js} +1 -1
- package/dist/plugin-sdk/{resolve-route-0sbvl4ZN.js → resolve-route-DN1J7Wyc.js} +1 -1
- package/dist/plugin-sdk/{runner-4UfrAQnx.js → runner-CYkuO7Fh.js} +4 -4
- package/dist/plugin-sdk/{session-BB-yfDWx.js → session-D5jHDo78.js} +1 -1
- package/dist/plugin-sdk/{sqlite-JjFgDV-H.js → sqlite-BlMLqMl8.js} +1 -1
- package/dist/plugin-sdk/{subsystem-D0Ril4rt.js → subsystem-COTa5Ly_.js} +1 -1
- package/dist/plugin-sdk/{tool-images-WRTP95FT.js → tool-images-DSpchb4x.js} +1 -1
- package/dist/plugin-sdk/{tool-loop-detection-sC_rhJfb.js → tool-loop-detection-BP6u-mbh.js} +1 -1
- package/dist/plugin-sdk/web-BbganhKi.js +1 -0
- package/dist/plugin-sdk/{whatsapp-actions-ThxQ5niy.js → whatsapp-actions-CZUqxmP1.js} +1 -1
- package/dist/{plugins-BIG8NDB9.js → plugins-Cx29kkDj.js} +1 -1
- package/dist/{plugins-iAq-Gr8l.js → plugins-DJqou2hi.js} +1 -1
- package/dist/{plugins-cli-CpaVUv_r.js → plugins-cli-Bu-A8aGy.js} +1 -1
- package/dist/{plugins-cli-CPkSgvdL.js → plugins-cli-CGFsQDVW.js} +1 -1
- package/dist/{program-context-BCwL3wlM.js → program-context-ClBa4lUj.js} +1 -1
- package/dist/{program-2w7Ue902.js → program-vVCzU0cH.js} +2 -2
- package/dist/{prompt-select-styled-hB_nLOn1.js → prompt-select-styled-BJPGccTJ.js} +1 -1
- package/dist/{prompt-select-styled-Dd5swW2b.js → prompt-select-styled-BK74z6FF.js} +1 -1
- package/dist/{provider-auth-helpers-BpTnp2Yr.js → provider-auth-helpers-B84m5VMc.js} +1 -1
- package/dist/{provider-auth-helpers-CJTG_tVx.js → provider-auth-helpers-hNwpK_hl.js} +1 -1
- package/dist/{provider-dispatcher-TWwBT2aH.js → provider-dispatcher-BjR5DE3O.js} +1 -1
- package/dist/provider-dispatcher-DgOeVjcL.js +1 -0
- package/dist/{provider-usage-BdrU4cIE.js → provider-usage-B-wPVN_j.js} +1 -1
- package/dist/{provider-usage-Bn4ZrnU7.js → provider-usage-B8lFHp0K.js} +1 -1
- package/dist/{push-apns-C4sJnHbO.js → push-apns-BTPPvY81.js} +1 -1
- package/dist/{push-apns-CiD3rrVv.js → push-apns-CscYUS0D.js} +1 -1
- package/dist/{pw-ai-DSEj1QrV.js → pw-ai-CLS_VZ8p.js} +1 -1
- package/dist/{pw-ai-dNZY-qBs.js → pw-ai-D5og_rIf.js} +1 -1
- package/dist/{qr-cli-qr-SFLZW.js → qr-cli-CAquM1Zk.js} +1 -1
- package/dist/{qr-cli-B45dCV0o.js → qr-cli-GsR8n1cm.js} +1 -1
- package/dist/{qr-cli-CMlAIzrD.js → qr-cli-kAKgaL-T.js} +1 -1
- package/dist/{qr-cli-CySNSEFj.js → qr-cli-uyxNf-cQ.js} +1 -1
- package/dist/{register.agent-BA6LIJSb.js → register.agent-BwTCfyeJ.js} +1 -1
- package/dist/{register.agent-D2uCH8jZ.js → register.agent-Dhdo3_7k.js} +1 -1
- package/dist/register.configure-B0m0G3ot.js +1 -0
- package/dist/register.configure-D3cbjmTz.js +1 -0
- package/dist/{register.maintenance-BELfCO_C.js → register.maintenance-C6ocMld2.js} +1 -1
- package/dist/{register.maintenance-DukWFS_D.js → register.maintenance-CbE2zSyc.js} +1 -1
- package/dist/{register.message-DiZRRAE5.js → register.message-Jn4u533_.js} +1 -1
- package/dist/{register.message-8iGDhO8h.js → register.message-Tu1hlM0m.js} +1 -1
- package/dist/{register.onboard-B9DMNfHE.js → register.onboard-B34211N6.js} +1 -1
- package/dist/{register.onboard-Dt7rzAq-.js → register.onboard-S1d2WAE4.js} +1 -1
- package/dist/{register.setup-CSF-2ImP.js → register.setup-CJPyAwCQ.js} +1 -1
- package/dist/{register.setup-BRRVPrx7.js → register.setup-Sg8f3nsH.js} +1 -1
- package/dist/{register.status-health-sessions-D6wdwPwV.js → register.status-health-sessions-BlgVxoZ4.js} +1 -1
- package/dist/{register.status-health-sessions-ZSufYw5j.js → register.status-health-sessions-DwADQJ74.js} +1 -1
- package/dist/{register.subclis-4eDV9jKH.js → register.subclis-C9V_M-Lk.js} +1 -1
- package/dist/{register.subclis-Cr9DoYcv.js → register.subclis-pWn9XObB.js} +1 -1
- package/dist/{replies-DbkT_5BV.js → replies-BOGMDhSN.js} +1 -1
- package/dist/{replies-CzV-RFUG.js → replies-BXbV02ik.js} +1 -1
- package/dist/{replies-DIBQzxGp.js → replies-CUv671JF.js} +1 -1
- package/dist/{replies-Bd2RPZwQ.js → replies-DokbEfJD.js} +1 -1
- package/dist/{reply-Cd3vVnD7.js → reply-GY1C8tcv.js} +10 -10
- package/dist/{routes-BzfLvF8W.js → routes-DZntyPY6.js} +1 -1
- package/dist/{routes-lclJHOYY.js → routes-_iZdG1Fo.js} +1 -1
- package/dist/{rpc-BLqXRn5R.js → rpc-CbUnwStf.js} +1 -1
- package/dist/{rpc-DcQNGQlj.js → rpc-Cwm4gchc.js} +1 -1
- package/dist/{run-main-DLcDEJgv.js → run-main-DQMbgbcF.js} +1 -1
- package/dist/{runner-DwWmciCt.js → runner-Cu9NJouV.js} +1 -1
- package/dist/{runner-SxCr9kXD.js → runner-eTTUbLAK.js} +1 -1
- package/dist/{sandbox-BZibn6PX.js → sandbox-C4AKi2EX.js} +1 -1
- package/dist/{sandbox-z9t_PRf9.js → sandbox-DvKMuAXL.js} +1 -1
- package/dist/{sandbox-cli-BtGs0dBR.js → sandbox-cli-C0LhzYq_.js} +1 -1
- package/dist/{sandbox-cli-B8FpLgyY.js → sandbox-cli-De0iaoHB.js} +1 -1
- package/dist/{security-cli-D8Q8I7fn.js → security-cli-BvEfiO8m.js} +1 -1
- package/dist/{security-cli-IIMR7Pb4.js → security-cli-BzsQ0XQh.js} +1 -1
- package/dist/{send-DnMzjS7L.js → send-2dRKMWtl.js} +1 -1
- package/dist/{send-DerUBvXW.js → send-Aw8wK3vK.js} +1 -1
- package/dist/{send-BvroeIQ6.js → send-B7H8Ae5j.js} +1 -1
- package/dist/{send-4d9NswaD.js → send-BP5osGBo.js} +1 -1
- package/dist/{send-BU_-BGmf.js → send-BVal50Bi.js} +1 -1
- package/dist/{send-CxG2suVM.js → send-Bbo7TXLx.js} +1 -1
- package/dist/{send-CBBziNqM.js → send-BxoVLIy1.js} +1 -1
- package/dist/{send-dDpSBSBo.js → send-COKUbcqs.js} +1 -1
- package/dist/{send--12DIueA.js → send-CTw3PqN4.js} +1 -1
- package/dist/{send-UFtylOiq.js → send-CYGOPcKq.js} +1 -1
- package/dist/{send-DyF1Xy9K.js → send-ChGpVO3O.js} +1 -1
- package/dist/{send-Q-uTkSFE.js → send-Cqea2UFo.js} +1 -1
- package/dist/{send-j15662lv.js → send-CrFWgJKx.js} +1 -1
- package/dist/{send-gDb60Hk-.js → send-CwK8QBR3.js} +1 -1
- package/dist/{send-CceNWtYE.js → send-DqR7Rxzm.js} +1 -1
- package/dist/{send-CJHXQvVl.js → send-DxwfUIN-.js} +1 -1
- package/dist/{send-ByCVQQVz.js → send-KgN1P41U.js} +1 -1
- package/dist/{send-B1rJLLpr.js → send-bNp87SIq.js} +1 -1
- package/dist/{send-B_1BtyfA.js → send-kkm_zrHQ.js} +1 -1
- package/dist/{send-BJDzwYJN.js → send-l3ge4wkC.js} +1 -1
- package/dist/{server-context-DJZT7Upf.js → server-context-CQ2v4BAx.js} +1 -1
- package/dist/{server-context-owOmmyUM.js → server-context-CttALzrW.js} +1 -1
- package/dist/{server-node-events-54d8Rmjl.js → server-node-events-CIMO6Vae.js} +1 -1
- package/dist/{server-node-events-CSFVqgxX.js → server-node-events-iCF2ngcN.js} +1 -1
- package/dist/{session-BzQdcCqN.js → session-BJHsjD3z.js} +1 -1
- package/dist/{session-4FpEJvkE.js → session-C_b1ttHJ.js} +1 -1
- package/dist/{session-dirs-OxQuIvJW.js → session-dirs-Bvbgw0GC.js} +1 -1
- package/dist/{session-dirs-D_ARkyw0.js → session-dirs-DHaoq7zc.js} +1 -1
- package/dist/{session-utils-GMvum00v.js → session-utils-Dxou8SbO.js} +1 -1
- package/dist/{sessions-Bl1wwotX.js → sessions-BA8Se_bT.js} +1 -1
- package/dist/{sessions-CdanN_ZI.js → sessions-BuZVmOWt.js} +1 -1
- package/dist/{sessions-B5dwRhUC.js → sessions-DvbW0FNJ.js} +1 -1
- package/dist/{sessions-B1t7qeEn.js → sessions-DvqsIg0M.js} +1 -1
- package/dist/{shared-xj-xaKFi.js → shared-BBOiNdjf.js} +1 -1
- package/dist/{shared-BPN3qd7G.js → shared-C2orjbTD.js} +1 -1
- package/dist/{skill-scanner-U3AJgjqc.js → skill-scanner-BEvov9QH.js} +1 -1
- package/dist/{skill-scanner-DEmbPsRh.js → skill-scanner-OTLeRZ_p.js} +1 -1
- package/dist/{skills-cli-CIdnXa3B.js → skills-cli-C1BOgB3y.js} +1 -1
- package/dist/{skills-cli-BXbGr7vl.js → skills-cli-CFT2Aq5R.js} +1 -1
- package/dist/{skills-install-Btw_GHbI.js → skills-install-LlKntDHa.js} +1 -1
- package/dist/{skills-install-DMHQRpIl.js → skills-install-tx5Mahav.js} +1 -1
- package/dist/{status-DXaDS_0w.js → status-Bh8V7kjv.js} +1 -1
- package/dist/{status-BxeKmkVr.js → status-BtBHmhQh.js} +1 -1
- package/dist/{status-BkcmeZg6.js → status-CpwD4y9B.js} +1 -1
- package/dist/status-CqaTmyih.js +1 -0
- package/dist/{status-DouJcFzf.js → status-yXz8PUbL.js} +1 -1
- package/dist/{status.update-C9iy31xr.js → status.update-CdgsLBPg.js} +1 -1
- package/dist/{status.update-KYyRSDZY.js → status.update-hzMro-BT.js} +1 -1
- package/dist/{subagent-registry-Dr20nzwk.js → subagent-registry-CaRUNwCj.js} +1 -1
- package/dist/{subagent-registry-CyGxu3kP.js → subagent-registry-DDEN4oJi.js} +10 -10
- package/dist/{subagent-registry-BiXkIDeh.js → subagent-registry-DYYfeIc3.js} +1 -1
- package/dist/{system-cli-b4YgXPHv.js → system-cli-4aii1JYf.js} +1 -1
- package/dist/{system-cli-C7YzJeP4.js → system-cli-CfkDD3FV.js} +1 -1
- package/dist/{tui-DylWbrDx.js → tui-DnVRxfI8.js} +2 -2
- package/dist/{tui-BwWMByVp.js → tui-JfWoLGIV.js} +2 -2
- package/dist/{tui-cli-C_TTgabr.js → tui-cli-CGjg2Eb5.js} +1 -1
- package/dist/{tui-cli-Bh1V8-w9.js → tui-cli-cd7Efw5u.js} +1 -1
- package/dist/{tui-setup-check-DJZCJokQ.js → tui-setup-check-BEHm9wwo.js} +1 -1
- package/dist/{tui-setup-check-BABAyl-e.js → tui-setup-check-DK8vdhLI.js} +1 -1
- package/dist/{tui-stream-assembler-ign_cPkv.js → tui-stream-assembler-8ud9oyMK.js} +1 -1
- package/dist/{tui-stream-assembler-q9GANTDr.js → tui-stream-assembler-Br15rhRH.js} +1 -1
- package/dist/{update-BUzcmoDf.js → update-B5yKFeGO.js} +1 -1
- package/dist/{update-D6U-V8Au.js → update-DodoQDCk.js} +1 -1
- package/dist/{update-cli-DUrUIrYQ.js → update-cli-CfJJcSUS.js} +1 -1
- package/dist/{update-cli-CA3LuuJ7.js → update-cli-x8Ocbf-0.js} +1 -1
- package/dist/{usage-cli-CfEg1_NZ.js → usage-cli-CN7L1YRG.js} +1 -1
- package/dist/{usage-cli-CpbYMXxS.js → usage-cli-CQmokGkG.js} +1 -1
- package/dist/{web-D-NSyF6b.js → web-BXLk9UT2.js} +1 -1
- package/dist/web-Btgs8oWv.js +1 -0
- package/dist/{webhooks-cli-B_f61rq7.js → webhooks-cli-DIo8p3lk.js} +1 -1
- package/dist/{webhooks-cli-Bi0t3w6P.js → webhooks-cli-DhxEtiFt.js} +1 -1
- package/dist/{whatsapp-actions-JbF2MrTV.js → whatsapp-actions-B7r9AyZN.js} +1 -1
- package/dist/{whatsapp-actions-BkCMhD9X.js → whatsapp-actions-DX2QU6Gs.js} +1 -1
- package/dist/{with-timeout-T07SJo4N.js → with-timeout-B_p5pWDv.js} +1 -1
- package/dist/{with-timeout-Bwq-GyUQ.js → with-timeout-GDLpcjW7.js} +1 -1
- package/dist/workflow-telemetry-BMTg5lPd.js +1 -0
- package/dist/workflow-telemetry-Bg8MVUr_.js +2 -0
- package/dist/workflow-telemetry-Do1UsYwM.js +1 -0
- package/dist/workflow-telemetry-DqBPhVL4.js +2 -0
- package/package.json +1 -1
- package/dist/agents-DsZ5vLKE.js +0 -1
- package/dist/auth-choice-Btd2Rxxd.js +0 -1
- package/dist/auth-choice-CVV9wRFN.js +0 -1
- package/dist/auth-choice.apply-BOK9XRCQ.js +0 -1
- package/dist/auth-choice.apply-Cv-BiV5Q.js +0 -1
- package/dist/auth-choice.apply.transformers-CXywS3GZ.js +0 -1
- package/dist/builderforce-onboarding-Dq6VUSKZ.js +0 -24
- package/dist/builderforce-onboarding-DuUfZ6oL.js +0 -24
- package/dist/configure-CWBBFk3F.js +0 -1
- package/dist/configure-fHVOAucW.js +0 -1
- package/dist/health-GLcAfqDz.js +0 -1
- package/dist/login-CPyEf5h6.js +0 -1
- package/dist/model-catalog-J7R-tJDu.js +0 -1
- package/dist/model-picker-D2bcWrtu.js +0 -1
- package/dist/model-picker-DO1HtEEm.js +0 -1
- package/dist/onboard-channels-CmqKsAoW.js +0 -1
- package/dist/onboard-channels-Db0P4iWl.js +0 -1
- package/dist/onboard-custom-BABqIYa4.js +0 -1
- package/dist/onboard-custom-VpW3UC8u.js +0 -1
- package/dist/plugin-registry-B-UOeWqM.js +0 -1
- package/dist/plugin-registry-BjMr3yXM.js +0 -1
- package/dist/plugin-sdk/web-CThgoHQp.js +0 -1
- package/dist/provider-dispatcher-C4nHaNqn.js +0 -1
- package/dist/register.configure-DAL38e7r.js +0 -1
- package/dist/register.configure-DZG7-WVi.js +0 -1
- package/dist/status-BTYqHVha.js +0 -1
- package/dist/web-P6QsgmSD.js +0 -1
- package/dist/workflow-telemetry-B8Im0mPk.js +0 -1
- package/dist/workflow-telemetry-DLEnm5TI.js +0 -2
- package/dist/workflow-telemetry-Dc_oseV7.js +0 -2
- package/dist/workflow-telemetry-Dkm3mofI.js +0 -1
- /package/dist/{devtools-CI7JyCXv.js → devtools-Cg4F-l9O.js} +0 -0
- /package/dist/{devtools-eMFaIsAT.js → devtools-Dl2DACSO.js} +0 -0
- /package/dist/{github-copilot-token-D3gHtNUu.js → github-copilot-token-BlyiXyTy.js} +0 -0
- /package/dist/{github-copilot-token-DHP2kAiN.js → github-copilot-token-D5sB2AUI.js} +0 -0
- /package/dist/{onboard-hooks-Cenav0eW.js → onboard-hooks-BaOSgxs9.js} +0 -0
- /package/dist/{onboard-hooks-Ce20rwpW.js → onboard-hooks-fO5eeDe_.js} +0 -0
- /package/dist/{qmd-manager-DVd_aWEV.js → qmd-manager-BgplOjHN.js} +0 -0
- /package/dist/{qmd-manager-keHvLmvP.js → qmd-manager-COUi_Fqb.js} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
import"./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{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"./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{r as normalizeChannelId}from"./plugins-1Mn6RiNf.js";import"./accounts-BkTLjSrD.js";import"./bindings-CKSDlQ1i.js";import{c as listPairingChannels,l as notifyPairingApproved,n as approveChannelPairingCode,r as listChannelPairingRequests}from"./pairing-store-YRy7EBgI.js";import{t as formatDocsLink}from"./links-BKzP7VVP.js";import{t as resolvePairingIdLabel}from"./pairing-labels-BJPrScRl.js";import{t as renderTable}from"./table-BFCCZDsp.js";function parseChannel(raw,channels){let value=(typeof raw==`string`?raw:typeof raw==`number`||typeof raw==`boolean`?String(raw):``).trim().toLowerCase();if(!value)throw Error(`Channel required`);let normalized=normalizeChannelId(value);if(normalized){if(!channels.includes(normalized))throw Error(`Channel ${normalized} does not support pairing`);return normalized}if(/^[a-z][a-z0-9_-]{0,63}$/.test(value))return value;throw Error(`Invalid channel: ${value}`)}async function notifyApproved(channel,id){await notifyPairingApproved({channelId:channel,id,cfg:loadConfig()})}function registerPairingCli(program){let channels=listPairingChannels(),pairing=program.command(`pairing`).description(`Secure DM pairing (approve inbound requests)`).addHelpText(`after`,()=>`\n${theme.muted(`Docs:`)} ${formatDocsLink(`/cli/pairing`,`docs.builderforce.ai/cli/pairing`)}\n`);pairing.command(`list`).description(`List pending pairing requests`).option(`--channel <channel>`,`Channel (${channels.join(`, `)})`).option(`--account <accountId>`,`Account id (for multi-account channels)`).argument(`[channel]`,`Channel (${channels.join(`, `)})`).option(`--json`,`Print JSON`,!1).action(async(channelArg,opts)=>{let channelRaw=opts.channel??channelArg;if(!channelRaw)throw Error(`Channel required. Use --channel <channel> or pass it as the first argument (expected one of: ${channels.join(`, `)})`);let channel=parseChannel(channelRaw,channels),accountId=String(opts.account??``).trim(),requests=accountId?await listChannelPairingRequests(channel,process.env,accountId):await listChannelPairingRequests(channel);if(opts.json){defaultRuntime.log(JSON.stringify({channel,requests},null,2));return}if(requests.length===0){defaultRuntime.log(theme.muted(`No pending ${channel} pairing requests.`));return}let idLabel=resolvePairingIdLabel(channel),tableWidth=Math.max(60,(process.stdout.columns??120)-1);defaultRuntime.log(`${theme.heading(`Pairing requests`)} ${theme.muted(`(${requests.length})`)}`),defaultRuntime.log(renderTable({width:tableWidth,columns:[{key:`Code`,header:`Code`,minWidth:10},{key:`ID`,header:idLabel,minWidth:12,flex:!0},{key:`Meta`,header:`Meta`,minWidth:8,flex:!0},{key:`Requested`,header:`Requested`,minWidth:12}],rows:requests.map(r=>({Code:r.code,ID:r.id,Meta:r.meta?JSON.stringify(r.meta):``,Requested:r.createdAt}))}).trimEnd())}),pairing.command(`approve`).description(`Approve a pairing code and allow that sender`).option(`--channel <channel>`,`Channel (${channels.join(`, `)})`).option(`--account <accountId>`,`Account id (for multi-account channels)`).argument(`<codeOrChannel>`,`Pairing code (or channel when using 2 args)`).argument(`[code]`,`Pairing code (when channel is passed as the 1st arg)`).option(`--notify`,`Notify the requester on the same channel`,!1).action(async(codeOrChannel,code,opts)=>{let channelRaw=opts.channel??codeOrChannel,resolvedCode=opts.channel?codeOrChannel:code;if(!opts.channel&&!code)throw Error(`Usage: ${formatCliCommand(`builderforce pairing approve <channel> <code>`)} (or: ${formatCliCommand(`builderforce pairing approve --channel <channel> <code>`)})`);if(opts.channel&&code!=null)throw Error(`Too many arguments. Use: ${formatCliCommand(`builderforce pairing approve --channel <channel> <code>`)}`);let channel=parseChannel(channelRaw,channels),accountId=String(opts.account??``).trim(),approved=accountId?await approveChannelPairingCode({channel,code:String(resolvedCode),accountId}):await approveChannelPairingCode({channel,code:String(resolvedCode)});if(!approved)throw Error(`No pending pairing request found for code: ${String(resolvedCode)}`);defaultRuntime.log(`${theme.success(`Approved`)} ${theme.muted(channel)} sender ${theme.command(approved.id)}.`),opts.notify&&await notifyApproved(channel,approved.id).catch(err=>{defaultRuntime.log(theme.warn(`Failed to notify requester: ${String(err)}`))})})}export{registerPairingCli};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{s as getPairingAdapter}from"./pairing-store-
|
|
1
|
+
import{s as getPairingAdapter}from"./pairing-store-YRy7EBgI.js";function resolvePairingIdLabel(channel){return getPairingAdapter(channel)?.idLabel??`userId`}export{resolvePairingIdLabel as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{s as getPairingAdapter}from"./pairing-store-
|
|
1
|
+
import{s as getPairingAdapter}from"./pairing-store-ti3FEkmr.js";function resolvePairingIdLabel(channel){return getPairingAdapter(channel)?.idLabel??`userId`}export{resolvePairingIdLabel as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{g as resolveStateDir,m as resolveOAuthDir,y as resolveRequiredHomeDir}from"./paths-BHg-VHB4.js";import{b as safeParseJson}from"./utils-BP60e80M.js";import{E as withFileLock$1}from"./auth-profiles-C1VbcUOm.js";import{n as listChannelPlugins,t as getChannelPlugin}from"./plugins-1Mn6RiNf.js";import os from"node:os";import path from"node:path";import fs from"node:fs";import crypto from"node:crypto";function listPairingChannels(){return listChannelPlugins().filter(plugin=>plugin.pairing).map(plugin=>plugin.id)}function getPairingAdapter(channelId){return getChannelPlugin(channelId)?.pairing??null}function requirePairingAdapter(channelId){let adapter=getPairingAdapter(channelId);if(!adapter)throw Error(`Channel ${channelId} does not support pairing`);return adapter}async function notifyPairingApproved(params){let adapter=params.pairingAdapter??requirePairingAdapter(params.channelId);adapter.notifyApproval&&await adapter.notifyApproval({cfg:params.cfg,id:params.id,runtime:params.runtime})}async function readJsonFileWithFallback(filePath,fallback){try{let parsed=safeParseJson(await fs.promises.readFile(filePath,`utf-8`));return parsed==null?{value:fallback,exists:!0}:{value:parsed,exists:!0}}catch(err){return err.code,{value:fallback,exists:!1}}}async function writeJsonFileAtomically(filePath,value){let dir=path.dirname(filePath);await fs.promises.mkdir(dir,{recursive:!0,mode:448});let tmp=path.join(dir,`${path.basename(filePath)}.${crypto.randomUUID()}.tmp`);await fs.promises.writeFile(tmp,`${JSON.stringify(value,null,2)}\n`,{encoding:`utf-8`}),await fs.promises.chmod(tmp,384),await fs.promises.rename(tmp,filePath)}const PAIRING_STORE_LOCK_OPTIONS={retries:{retries:10,factor:2,minTimeout:100,maxTimeout:1e4,randomize:!0},stale:3e4};function resolveCredentialsDir(env=process.env){return resolveOAuthDir(env,resolveStateDir(env,()=>resolveRequiredHomeDir(env,os.homedir)))}function safeChannelKey(channel){let raw=String(channel).trim().toLowerCase();if(!raw)throw Error(`invalid pairing channel`);let safe=raw.replace(/[\\/:*?"<>|]/g,`_`).replace(/\.\./g,`_`);if(!safe||safe===`_`)throw Error(`invalid pairing channel`);return safe}function resolvePairingPath(channel,env=process.env){return path.join(resolveCredentialsDir(env),`${safeChannelKey(channel)}-pairing.json`)}function safeAccountKey(accountId){let raw=String(accountId).trim().toLowerCase();if(!raw)throw Error(`invalid pairing account id`);let safe=raw.replace(/[\\/:*?"<>|]/g,`_`).replace(/\.\./g,`_`);if(!safe||safe===`_`)throw Error(`invalid pairing account id`);return safe}function resolveAllowFromPath(channel,env=process.env,accountId){let base=safeChannelKey(channel),normalizedAccountId=typeof accountId==`string`?accountId.trim():``;return normalizedAccountId?path.join(resolveCredentialsDir(env),`${base}-${safeAccountKey(normalizedAccountId)}-allowFrom.json`):path.join(resolveCredentialsDir(env),`${base}-allowFrom.json`)}async function readJsonFile(filePath,fallback){return await readJsonFileWithFallback(filePath,fallback)}async function writeJsonFile(filePath,value){await writeJsonFileAtomically(filePath,value)}async function readPairingRequests(filePath){let{value}=await readJsonFile(filePath,{version:1,requests:[]});return Array.isArray(value.requests)?value.requests:[]}async function readPrunedPairingRequests(filePath){return pruneExpiredRequests(await readPairingRequests(filePath),Date.now())}async function ensureJsonFile(filePath,fallback){try{await fs.promises.access(filePath)}catch{await writeJsonFile(filePath,fallback)}}async function withFileLock(filePath,fallback,fn){return await ensureJsonFile(filePath,fallback),await withFileLock$1(filePath,PAIRING_STORE_LOCK_OPTIONS,async()=>await fn())}function parseTimestamp(value){if(!value)return null;let parsed=Date.parse(value);return Number.isFinite(parsed)?parsed:null}function isExpired(entry,nowMs){let createdAt=parseTimestamp(entry.createdAt);return createdAt?nowMs-createdAt>36e5:!0}function pruneExpiredRequests(reqs,nowMs){let kept=[],removed=!1;for(let req of reqs){if(isExpired(req,nowMs)){removed=!0;continue}kept.push(req)}return{requests:kept,removed}}function resolveLastSeenAt(entry){return parseTimestamp(entry.lastSeenAt)??parseTimestamp(entry.createdAt)??0}function pruneExcessRequests(reqs,maxPending){return maxPending<=0||reqs.length<=maxPending?{requests:reqs,removed:!1}:{requests:reqs.slice().toSorted((a,b)=>resolveLastSeenAt(a)-resolveLastSeenAt(b)).slice(-maxPending),removed:!0}}function randomCode(){let out=``;for(let i=0;i<8;i++){let idx=crypto.randomInt(0,32);out+=`ABCDEFGHJKLMNPQRSTUVWXYZ23456789`[idx]}return out}function generateUniqueCode(existing){for(let attempt=0;attempt<500;attempt+=1){let code=randomCode();if(!existing.has(code))return code}throw Error(`failed to generate unique pairing code`)}function normalizePairingAccountId(accountId){return accountId?.trim().toLowerCase()||``}function requestMatchesAccountId(entry,normalizedAccountId){return normalizedAccountId?String(entry.meta?.accountId??``).trim().toLowerCase()===normalizedAccountId:!0}function normalizeId(value){return String(value).trim()}function normalizeAllowEntry(channel,entry){let trimmed=entry.trim();if(!trimmed||trimmed===`*`)return``;let adapter=getPairingAdapter(channel),normalized=adapter?.normalizeAllowEntry?adapter.normalizeAllowEntry(trimmed):trimmed;return String(normalized).trim()}function normalizeAllowFromList(channel,store){return(Array.isArray(store.allowFrom)?store.allowFrom:[]).map(v=>normalizeAllowEntry(channel,String(v))).filter(Boolean)}function normalizeAllowFromInput(channel,entry){return normalizeAllowEntry(channel,normalizeId(entry))}function dedupePreserveOrder(entries){let seen=new Set,out=[];for(let entry of entries){let normalized=String(entry).trim();!normalized||seen.has(normalized)||(seen.add(normalized),out.push(normalized))}return out}async function readAllowFromStateForPath(channel,filePath){let{value}=await readJsonFile(filePath,{version:1,allowFrom:[]});return normalizeAllowFromList(channel,value)}async function readAllowFromState(params){let{value}=await readJsonFile(params.filePath,{version:1,allowFrom:[]});return{current:normalizeAllowFromList(params.channel,value),normalized:normalizeAllowFromInput(params.channel,params.entry)||null}}async function writeAllowFromState(filePath,allowFrom){await writeJsonFile(filePath,{version:1,allowFrom})}async function updateAllowFromStoreEntry(params){let env=params.env??process.env,filePath=resolveAllowFromPath(params.channel,env,params.accountId);return await withFileLock(filePath,{version:1,allowFrom:[]},async()=>{let{current,normalized}=await readAllowFromState({channel:params.channel,entry:params.entry,filePath});if(!normalized)return{changed:!1,allowFrom:current};let next=params.apply(current,normalized);return next?(await writeAllowFromState(filePath,next),{changed:!0,allowFrom:next}):{changed:!1,allowFrom:current}})}async function readChannelAllowFromStore(channel,env=process.env,accountId){if(!(accountId?.trim().toLowerCase()??``))return await readAllowFromStateForPath(channel,resolveAllowFromPath(channel,env));let scopedEntries=await readAllowFromStateForPath(channel,resolveAllowFromPath(channel,env,accountId)),legacyEntries=await readAllowFromStateForPath(channel,resolveAllowFromPath(channel,env));return dedupePreserveOrder([...scopedEntries,...legacyEntries])}async function updateChannelAllowFromStore(params){return await updateAllowFromStoreEntry({channel:params.channel,entry:params.entry,accountId:params.accountId,env:params.env,apply:params.apply})}async function addChannelAllowFromStoreEntry(params){return await updateChannelAllowFromStore({...params,apply:(current,normalized)=>current.includes(normalized)?null:[...current,normalized]})}async function removeChannelAllowFromStoreEntry(params){return await updateChannelAllowFromStore({...params,apply:(current,normalized)=>{let next=current.filter(entry=>entry!==normalized);return next.length===current.length?null:next}})}async function listChannelPairingRequests(channel,env=process.env,accountId){let filePath=resolvePairingPath(channel,env);return await withFileLock(filePath,{version:1,requests:[]},async()=>{let{requests:prunedExpired,removed:expiredRemoved}=await readPrunedPairingRequests(filePath),{requests:pruned,removed:cappedRemoved}=pruneExcessRequests(prunedExpired,3);(expiredRemoved||cappedRemoved)&&await writeJsonFile(filePath,{version:1,requests:pruned});let normalizedAccountId=normalizePairingAccountId(accountId);return(normalizedAccountId?pruned.filter(entry=>requestMatchesAccountId(entry,normalizedAccountId)):pruned).filter(r=>r&&typeof r.id==`string`&&typeof r.code==`string`&&typeof r.createdAt==`string`).slice().toSorted((a,b)=>a.createdAt.localeCompare(b.createdAt))})}async function upsertChannelPairingRequest(params){let env=params.env??process.env,filePath=resolvePairingPath(params.channel,env);return await withFileLock(filePath,{version:1,requests:[]},async()=>{let now=new Date().toISOString(),nowMs=Date.now(),id=normalizeId(params.id),normalizedAccountId=params.accountId?.trim(),baseMeta=params.meta&&typeof params.meta==`object`?Object.fromEntries(Object.entries(params.meta).map(([k,v])=>[k,String(v??``).trim()]).filter(([_,v])=>!!v)):void 0,meta=normalizedAccountId?{...baseMeta,accountId:normalizedAccountId}:baseMeta,reqs=await readPairingRequests(filePath),{requests:prunedExpired,removed:expiredRemoved}=pruneExpiredRequests(reqs,nowMs);reqs=prunedExpired;let existingIdx=reqs.findIndex(r=>r.id===id),existingCodes=new Set(reqs.map(req=>String(req.code??``).trim().toUpperCase()));if(existingIdx>=0){let existing=reqs[existingIdx],code=(existing&&typeof existing.code==`string`?existing.code.trim():``)||generateUniqueCode(existingCodes),next={id,code,createdAt:existing?.createdAt??now,lastSeenAt:now,meta:meta??existing?.meta};reqs[existingIdx]=next;let{requests:capped}=pruneExcessRequests(reqs,3);return await writeJsonFile(filePath,{version:1,requests:capped}),{code,created:!1}}let{requests:capped,removed:cappedRemoved}=pruneExcessRequests(reqs,3);if(reqs=capped,reqs.length>=3)return(expiredRemoved||cappedRemoved)&&await writeJsonFile(filePath,{version:1,requests:reqs}),{code:``,created:!1};let code=generateUniqueCode(existingCodes),next={id,code,createdAt:now,lastSeenAt:now,...meta?{meta}:{}};return await writeJsonFile(filePath,{version:1,requests:[...reqs,next]}),{code,created:!0}})}async function approveChannelPairingCode(params){let env=params.env??process.env,code=params.code.trim().toUpperCase();if(!code)return null;let filePath=resolvePairingPath(params.channel,env);return await withFileLock(filePath,{version:1,requests:[]},async()=>{let{requests:pruned,removed}=await readPrunedPairingRequests(filePath),normalizedAccountId=normalizePairingAccountId(params.accountId),idx=pruned.findIndex(r=>String(r.code??``).toUpperCase()===code?requestMatchesAccountId(r,normalizedAccountId):!1);if(idx<0)return removed&&await writeJsonFile(filePath,{version:1,requests:pruned}),null;let entry=pruned[idx];if(!entry)return null;pruned.splice(idx,1),await writeJsonFile(filePath,{version:1,requests:pruned});let entryAccountId=String(entry.meta?.accountId??``).trim()||void 0;return await addChannelAllowFromStoreEntry({channel:params.channel,entry:entry.id,accountId:params.accountId?.trim()||entryAccountId,env}),{id:entry.id,entry}})}export{removeChannelAllowFromStoreEntry as a,listPairingChannels as c,readChannelAllowFromStore as i,notifyPairingApproved as l,approveChannelPairingCode as n,upsertChannelPairingRequest as o,listChannelPairingRequests as r,getPairingAdapter as s,addChannelAllowFromStoreEntry as t};
|
|
1
|
+
import{g as resolveStateDir,m as resolveOAuthDir,y as resolveRequiredHomeDir}from"./paths-BHg-VHB4.js";import{b as safeParseJson}from"./utils-BP60e80M.js";import{E as withFileLock$1}from"./auth-profiles-pt7Tr4HA.js";import{n as listChannelPlugins,t as getChannelPlugin}from"./plugins-1Mn6RiNf.js";import os from"node:os";import path from"node:path";import fs from"node:fs";import crypto from"node:crypto";function listPairingChannels(){return listChannelPlugins().filter(plugin=>plugin.pairing).map(plugin=>plugin.id)}function getPairingAdapter(channelId){return getChannelPlugin(channelId)?.pairing??null}function requirePairingAdapter(channelId){let adapter=getPairingAdapter(channelId);if(!adapter)throw Error(`Channel ${channelId} does not support pairing`);return adapter}async function notifyPairingApproved(params){let adapter=params.pairingAdapter??requirePairingAdapter(params.channelId);adapter.notifyApproval&&await adapter.notifyApproval({cfg:params.cfg,id:params.id,runtime:params.runtime})}async function readJsonFileWithFallback(filePath,fallback){try{let parsed=safeParseJson(await fs.promises.readFile(filePath,`utf-8`));return parsed==null?{value:fallback,exists:!0}:{value:parsed,exists:!0}}catch(err){return err.code,{value:fallback,exists:!1}}}async function writeJsonFileAtomically(filePath,value){let dir=path.dirname(filePath);await fs.promises.mkdir(dir,{recursive:!0,mode:448});let tmp=path.join(dir,`${path.basename(filePath)}.${crypto.randomUUID()}.tmp`);await fs.promises.writeFile(tmp,`${JSON.stringify(value,null,2)}\n`,{encoding:`utf-8`}),await fs.promises.chmod(tmp,384),await fs.promises.rename(tmp,filePath)}const PAIRING_STORE_LOCK_OPTIONS={retries:{retries:10,factor:2,minTimeout:100,maxTimeout:1e4,randomize:!0},stale:3e4};function resolveCredentialsDir(env=process.env){return resolveOAuthDir(env,resolveStateDir(env,()=>resolveRequiredHomeDir(env,os.homedir)))}function safeChannelKey(channel){let raw=String(channel).trim().toLowerCase();if(!raw)throw Error(`invalid pairing channel`);let safe=raw.replace(/[\\/:*?"<>|]/g,`_`).replace(/\.\./g,`_`);if(!safe||safe===`_`)throw Error(`invalid pairing channel`);return safe}function resolvePairingPath(channel,env=process.env){return path.join(resolveCredentialsDir(env),`${safeChannelKey(channel)}-pairing.json`)}function safeAccountKey(accountId){let raw=String(accountId).trim().toLowerCase();if(!raw)throw Error(`invalid pairing account id`);let safe=raw.replace(/[\\/:*?"<>|]/g,`_`).replace(/\.\./g,`_`);if(!safe||safe===`_`)throw Error(`invalid pairing account id`);return safe}function resolveAllowFromPath(channel,env=process.env,accountId){let base=safeChannelKey(channel),normalizedAccountId=typeof accountId==`string`?accountId.trim():``;return normalizedAccountId?path.join(resolveCredentialsDir(env),`${base}-${safeAccountKey(normalizedAccountId)}-allowFrom.json`):path.join(resolveCredentialsDir(env),`${base}-allowFrom.json`)}async function readJsonFile(filePath,fallback){return await readJsonFileWithFallback(filePath,fallback)}async function writeJsonFile(filePath,value){await writeJsonFileAtomically(filePath,value)}async function readPairingRequests(filePath){let{value}=await readJsonFile(filePath,{version:1,requests:[]});return Array.isArray(value.requests)?value.requests:[]}async function readPrunedPairingRequests(filePath){return pruneExpiredRequests(await readPairingRequests(filePath),Date.now())}async function ensureJsonFile(filePath,fallback){try{await fs.promises.access(filePath)}catch{await writeJsonFile(filePath,fallback)}}async function withFileLock(filePath,fallback,fn){return await ensureJsonFile(filePath,fallback),await withFileLock$1(filePath,PAIRING_STORE_LOCK_OPTIONS,async()=>await fn())}function parseTimestamp(value){if(!value)return null;let parsed=Date.parse(value);return Number.isFinite(parsed)?parsed:null}function isExpired(entry,nowMs){let createdAt=parseTimestamp(entry.createdAt);return createdAt?nowMs-createdAt>36e5:!0}function pruneExpiredRequests(reqs,nowMs){let kept=[],removed=!1;for(let req of reqs){if(isExpired(req,nowMs)){removed=!0;continue}kept.push(req)}return{requests:kept,removed}}function resolveLastSeenAt(entry){return parseTimestamp(entry.lastSeenAt)??parseTimestamp(entry.createdAt)??0}function pruneExcessRequests(reqs,maxPending){return maxPending<=0||reqs.length<=maxPending?{requests:reqs,removed:!1}:{requests:reqs.slice().toSorted((a,b)=>resolveLastSeenAt(a)-resolveLastSeenAt(b)).slice(-maxPending),removed:!0}}function randomCode(){let out=``;for(let i=0;i<8;i++){let idx=crypto.randomInt(0,32);out+=`ABCDEFGHJKLMNPQRSTUVWXYZ23456789`[idx]}return out}function generateUniqueCode(existing){for(let attempt=0;attempt<500;attempt+=1){let code=randomCode();if(!existing.has(code))return code}throw Error(`failed to generate unique pairing code`)}function normalizePairingAccountId(accountId){return accountId?.trim().toLowerCase()||``}function requestMatchesAccountId(entry,normalizedAccountId){return normalizedAccountId?String(entry.meta?.accountId??``).trim().toLowerCase()===normalizedAccountId:!0}function normalizeId(value){return String(value).trim()}function normalizeAllowEntry(channel,entry){let trimmed=entry.trim();if(!trimmed||trimmed===`*`)return``;let adapter=getPairingAdapter(channel),normalized=adapter?.normalizeAllowEntry?adapter.normalizeAllowEntry(trimmed):trimmed;return String(normalized).trim()}function normalizeAllowFromList(channel,store){return(Array.isArray(store.allowFrom)?store.allowFrom:[]).map(v=>normalizeAllowEntry(channel,String(v))).filter(Boolean)}function normalizeAllowFromInput(channel,entry){return normalizeAllowEntry(channel,normalizeId(entry))}function dedupePreserveOrder(entries){let seen=new Set,out=[];for(let entry of entries){let normalized=String(entry).trim();!normalized||seen.has(normalized)||(seen.add(normalized),out.push(normalized))}return out}async function readAllowFromStateForPath(channel,filePath){let{value}=await readJsonFile(filePath,{version:1,allowFrom:[]});return normalizeAllowFromList(channel,value)}async function readAllowFromState(params){let{value}=await readJsonFile(params.filePath,{version:1,allowFrom:[]});return{current:normalizeAllowFromList(params.channel,value),normalized:normalizeAllowFromInput(params.channel,params.entry)||null}}async function writeAllowFromState(filePath,allowFrom){await writeJsonFile(filePath,{version:1,allowFrom})}async function updateAllowFromStoreEntry(params){let env=params.env??process.env,filePath=resolveAllowFromPath(params.channel,env,params.accountId);return await withFileLock(filePath,{version:1,allowFrom:[]},async()=>{let{current,normalized}=await readAllowFromState({channel:params.channel,entry:params.entry,filePath});if(!normalized)return{changed:!1,allowFrom:current};let next=params.apply(current,normalized);return next?(await writeAllowFromState(filePath,next),{changed:!0,allowFrom:next}):{changed:!1,allowFrom:current}})}async function readChannelAllowFromStore(channel,env=process.env,accountId){if(!(accountId?.trim().toLowerCase()??``))return await readAllowFromStateForPath(channel,resolveAllowFromPath(channel,env));let scopedEntries=await readAllowFromStateForPath(channel,resolveAllowFromPath(channel,env,accountId)),legacyEntries=await readAllowFromStateForPath(channel,resolveAllowFromPath(channel,env));return dedupePreserveOrder([...scopedEntries,...legacyEntries])}async function updateChannelAllowFromStore(params){return await updateAllowFromStoreEntry({channel:params.channel,entry:params.entry,accountId:params.accountId,env:params.env,apply:params.apply})}async function addChannelAllowFromStoreEntry(params){return await updateChannelAllowFromStore({...params,apply:(current,normalized)=>current.includes(normalized)?null:[...current,normalized]})}async function removeChannelAllowFromStoreEntry(params){return await updateChannelAllowFromStore({...params,apply:(current,normalized)=>{let next=current.filter(entry=>entry!==normalized);return next.length===current.length?null:next}})}async function listChannelPairingRequests(channel,env=process.env,accountId){let filePath=resolvePairingPath(channel,env);return await withFileLock(filePath,{version:1,requests:[]},async()=>{let{requests:prunedExpired,removed:expiredRemoved}=await readPrunedPairingRequests(filePath),{requests:pruned,removed:cappedRemoved}=pruneExcessRequests(prunedExpired,3);(expiredRemoved||cappedRemoved)&&await writeJsonFile(filePath,{version:1,requests:pruned});let normalizedAccountId=normalizePairingAccountId(accountId);return(normalizedAccountId?pruned.filter(entry=>requestMatchesAccountId(entry,normalizedAccountId)):pruned).filter(r=>r&&typeof r.id==`string`&&typeof r.code==`string`&&typeof r.createdAt==`string`).slice().toSorted((a,b)=>a.createdAt.localeCompare(b.createdAt))})}async function upsertChannelPairingRequest(params){let env=params.env??process.env,filePath=resolvePairingPath(params.channel,env);return await withFileLock(filePath,{version:1,requests:[]},async()=>{let now=new Date().toISOString(),nowMs=Date.now(),id=normalizeId(params.id),normalizedAccountId=params.accountId?.trim(),baseMeta=params.meta&&typeof params.meta==`object`?Object.fromEntries(Object.entries(params.meta).map(([k,v])=>[k,String(v??``).trim()]).filter(([_,v])=>!!v)):void 0,meta=normalizedAccountId?{...baseMeta,accountId:normalizedAccountId}:baseMeta,reqs=await readPairingRequests(filePath),{requests:prunedExpired,removed:expiredRemoved}=pruneExpiredRequests(reqs,nowMs);reqs=prunedExpired;let existingIdx=reqs.findIndex(r=>r.id===id),existingCodes=new Set(reqs.map(req=>String(req.code??``).trim().toUpperCase()));if(existingIdx>=0){let existing=reqs[existingIdx],code=(existing&&typeof existing.code==`string`?existing.code.trim():``)||generateUniqueCode(existingCodes),next={id,code,createdAt:existing?.createdAt??now,lastSeenAt:now,meta:meta??existing?.meta};reqs[existingIdx]=next;let{requests:capped}=pruneExcessRequests(reqs,3);return await writeJsonFile(filePath,{version:1,requests:capped}),{code,created:!1}}let{requests:capped,removed:cappedRemoved}=pruneExcessRequests(reqs,3);if(reqs=capped,reqs.length>=3)return(expiredRemoved||cappedRemoved)&&await writeJsonFile(filePath,{version:1,requests:reqs}),{code:``,created:!1};let code=generateUniqueCode(existingCodes),next={id,code,createdAt:now,lastSeenAt:now,...meta?{meta}:{}};return await writeJsonFile(filePath,{version:1,requests:[...reqs,next]}),{code,created:!0}})}async function approveChannelPairingCode(params){let env=params.env??process.env,code=params.code.trim().toUpperCase();if(!code)return null;let filePath=resolvePairingPath(params.channel,env);return await withFileLock(filePath,{version:1,requests:[]},async()=>{let{requests:pruned,removed}=await readPrunedPairingRequests(filePath),normalizedAccountId=normalizePairingAccountId(params.accountId),idx=pruned.findIndex(r=>String(r.code??``).toUpperCase()===code?requestMatchesAccountId(r,normalizedAccountId):!1);if(idx<0)return removed&&await writeJsonFile(filePath,{version:1,requests:pruned}),null;let entry=pruned[idx];if(!entry)return null;pruned.splice(idx,1),await writeJsonFile(filePath,{version:1,requests:pruned});let entryAccountId=String(entry.meta?.accountId??``).trim()||void 0;return await addChannelAllowFromStoreEntry({channel:params.channel,entry:entry.id,accountId:params.accountId?.trim()||entryAccountId,env}),{id:entry.id,entry}})}export{removeChannelAllowFromStoreEntry as a,listPairingChannels as c,readChannelAllowFromStore as i,notifyPairingApproved as l,approveChannelPairingCode as n,upsertChannelPairingRequest as o,listChannelPairingRequests as r,getPairingAdapter as s,addChannelAllowFromStoreEntry as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{g as resolveStateDir,m as resolveOAuthDir,y as resolveRequiredHomeDir}from"./paths-5FcIFMsj.js";import{x as safeParseJson}from"./utils-DbaBVFaK.js";import{un as withFileLock$1}from"./model-selection-9bRFKBI_.js";import{n as listChannelPlugins,t as getChannelPlugin}from"./plugins-D5zP6ENo.js";import fs from"node:fs";import os from"node:os";import path from"node:path";import crypto from"node:crypto";function listPairingChannels(){return listChannelPlugins().filter(plugin=>plugin.pairing).map(plugin=>plugin.id)}function getPairingAdapter(channelId){return getChannelPlugin(channelId)?.pairing??null}function requirePairingAdapter(channelId){let adapter=getPairingAdapter(channelId);if(!adapter)throw Error(`Channel ${channelId} does not support pairing`);return adapter}async function notifyPairingApproved(params){let adapter=params.pairingAdapter??requirePairingAdapter(params.channelId);adapter.notifyApproval&&await adapter.notifyApproval({cfg:params.cfg,id:params.id,runtime:params.runtime})}async function readJsonFileWithFallback(filePath,fallback){try{let parsed=safeParseJson(await fs.promises.readFile(filePath,`utf-8`));return parsed==null?{value:fallback,exists:!0}:{value:parsed,exists:!0}}catch(err){return err.code,{value:fallback,exists:!1}}}async function writeJsonFileAtomically(filePath,value){let dir=path.dirname(filePath);await fs.promises.mkdir(dir,{recursive:!0,mode:448});let tmp=path.join(dir,`${path.basename(filePath)}.${crypto.randomUUID()}.tmp`);await fs.promises.writeFile(tmp,`${JSON.stringify(value,null,2)}\n`,{encoding:`utf-8`}),await fs.promises.chmod(tmp,384),await fs.promises.rename(tmp,filePath)}const PAIRING_STORE_LOCK_OPTIONS={retries:{retries:10,factor:2,minTimeout:100,maxTimeout:1e4,randomize:!0},stale:3e4};function resolveCredentialsDir(env=process.env){return resolveOAuthDir(env,resolveStateDir(env,()=>resolveRequiredHomeDir(env,os.homedir)))}function safeChannelKey(channel){let raw=String(channel).trim().toLowerCase();if(!raw)throw Error(`invalid pairing channel`);let safe=raw.replace(/[\\/:*?"<>|]/g,`_`).replace(/\.\./g,`_`);if(!safe||safe===`_`)throw Error(`invalid pairing channel`);return safe}function resolvePairingPath(channel,env=process.env){return path.join(resolveCredentialsDir(env),`${safeChannelKey(channel)}-pairing.json`)}function safeAccountKey(accountId){let raw=String(accountId).trim().toLowerCase();if(!raw)throw Error(`invalid pairing account id`);let safe=raw.replace(/[\\/:*?"<>|]/g,`_`).replace(/\.\./g,`_`);if(!safe||safe===`_`)throw Error(`invalid pairing account id`);return safe}function resolveAllowFromPath(channel,env=process.env,accountId){let base=safeChannelKey(channel),normalizedAccountId=typeof accountId==`string`?accountId.trim():``;return normalizedAccountId?path.join(resolveCredentialsDir(env),`${base}-${safeAccountKey(normalizedAccountId)}-allowFrom.json`):path.join(resolveCredentialsDir(env),`${base}-allowFrom.json`)}async function readJsonFile(filePath,fallback){return await readJsonFileWithFallback(filePath,fallback)}async function writeJsonFile(filePath,value){await writeJsonFileAtomically(filePath,value)}async function readPairingRequests(filePath){let{value}=await readJsonFile(filePath,{version:1,requests:[]});return Array.isArray(value.requests)?value.requests:[]}async function readPrunedPairingRequests(filePath){return pruneExpiredRequests(await readPairingRequests(filePath),Date.now())}async function ensureJsonFile(filePath,fallback){try{await fs.promises.access(filePath)}catch{await writeJsonFile(filePath,fallback)}}async function withFileLock(filePath,fallback,fn){return await ensureJsonFile(filePath,fallback),await withFileLock$1(filePath,PAIRING_STORE_LOCK_OPTIONS,async()=>await fn())}function parseTimestamp(value){if(!value)return null;let parsed=Date.parse(value);return Number.isFinite(parsed)?parsed:null}function isExpired(entry,nowMs){let createdAt=parseTimestamp(entry.createdAt);return createdAt?nowMs-createdAt>36e5:!0}function pruneExpiredRequests(reqs,nowMs){let kept=[],removed=!1;for(let req of reqs){if(isExpired(req,nowMs)){removed=!0;continue}kept.push(req)}return{requests:kept,removed}}function resolveLastSeenAt(entry){return parseTimestamp(entry.lastSeenAt)??parseTimestamp(entry.createdAt)??0}function pruneExcessRequests(reqs,maxPending){return maxPending<=0||reqs.length<=maxPending?{requests:reqs,removed:!1}:{requests:reqs.slice().toSorted((a,b)=>resolveLastSeenAt(a)-resolveLastSeenAt(b)).slice(-maxPending),removed:!0}}function randomCode(){let out=``;for(let i=0;i<8;i++){let idx=crypto.randomInt(0,32);out+=`ABCDEFGHJKLMNPQRSTUVWXYZ23456789`[idx]}return out}function generateUniqueCode(existing){for(let attempt=0;attempt<500;attempt+=1){let code=randomCode();if(!existing.has(code))return code}throw Error(`failed to generate unique pairing code`)}function normalizePairingAccountId(accountId){return accountId?.trim().toLowerCase()||``}function requestMatchesAccountId(entry,normalizedAccountId){return normalizedAccountId?String(entry.meta?.accountId??``).trim().toLowerCase()===normalizedAccountId:!0}function normalizeId(value){return String(value).trim()}function normalizeAllowEntry(channel,entry){let trimmed=entry.trim();if(!trimmed||trimmed===`*`)return``;let adapter=getPairingAdapter(channel),normalized=adapter?.normalizeAllowEntry?adapter.normalizeAllowEntry(trimmed):trimmed;return String(normalized).trim()}function normalizeAllowFromList(channel,store){return(Array.isArray(store.allowFrom)?store.allowFrom:[]).map(v=>normalizeAllowEntry(channel,String(v))).filter(Boolean)}function normalizeAllowFromInput(channel,entry){return normalizeAllowEntry(channel,normalizeId(entry))}function dedupePreserveOrder(entries){let seen=new Set,out=[];for(let entry of entries){let normalized=String(entry).trim();!normalized||seen.has(normalized)||(seen.add(normalized),out.push(normalized))}return out}async function readAllowFromStateForPath(channel,filePath){let{value}=await readJsonFile(filePath,{version:1,allowFrom:[]});return normalizeAllowFromList(channel,value)}async function readAllowFromState(params){let{value}=await readJsonFile(params.filePath,{version:1,allowFrom:[]});return{current:normalizeAllowFromList(params.channel,value),normalized:normalizeAllowFromInput(params.channel,params.entry)||null}}async function writeAllowFromState(filePath,allowFrom){await writeJsonFile(filePath,{version:1,allowFrom})}async function updateAllowFromStoreEntry(params){let env=params.env??process.env,filePath=resolveAllowFromPath(params.channel,env,params.accountId);return await withFileLock(filePath,{version:1,allowFrom:[]},async()=>{let{current,normalized}=await readAllowFromState({channel:params.channel,entry:params.entry,filePath});if(!normalized)return{changed:!1,allowFrom:current};let next=params.apply(current,normalized);return next?(await writeAllowFromState(filePath,next),{changed:!0,allowFrom:next}):{changed:!1,allowFrom:current}})}async function readChannelAllowFromStore(channel,env=process.env,accountId){if(!(accountId?.trim().toLowerCase()??``))return await readAllowFromStateForPath(channel,resolveAllowFromPath(channel,env));let scopedEntries=await readAllowFromStateForPath(channel,resolveAllowFromPath(channel,env,accountId)),legacyEntries=await readAllowFromStateForPath(channel,resolveAllowFromPath(channel,env));return dedupePreserveOrder([...scopedEntries,...legacyEntries])}async function updateChannelAllowFromStore(params){return await updateAllowFromStoreEntry({channel:params.channel,entry:params.entry,accountId:params.accountId,env:params.env,apply:params.apply})}async function addChannelAllowFromStoreEntry(params){return await updateChannelAllowFromStore({...params,apply:(current,normalized)=>current.includes(normalized)?null:[...current,normalized]})}async function removeChannelAllowFromStoreEntry(params){return await updateChannelAllowFromStore({...params,apply:(current,normalized)=>{let next=current.filter(entry=>entry!==normalized);return next.length===current.length?null:next}})}async function listChannelPairingRequests(channel,env=process.env,accountId){let filePath=resolvePairingPath(channel,env);return await withFileLock(filePath,{version:1,requests:[]},async()=>{let{requests:prunedExpired,removed:expiredRemoved}=await readPrunedPairingRequests(filePath),{requests:pruned,removed:cappedRemoved}=pruneExcessRequests(prunedExpired,3);(expiredRemoved||cappedRemoved)&&await writeJsonFile(filePath,{version:1,requests:pruned});let normalizedAccountId=normalizePairingAccountId(accountId);return(normalizedAccountId?pruned.filter(entry=>requestMatchesAccountId(entry,normalizedAccountId)):pruned).filter(r=>r&&typeof r.id==`string`&&typeof r.code==`string`&&typeof r.createdAt==`string`).slice().toSorted((a,b)=>a.createdAt.localeCompare(b.createdAt))})}async function upsertChannelPairingRequest(params){let env=params.env??process.env,filePath=resolvePairingPath(params.channel,env);return await withFileLock(filePath,{version:1,requests:[]},async()=>{let now=new Date().toISOString(),nowMs=Date.now(),id=normalizeId(params.id),normalizedAccountId=params.accountId?.trim(),baseMeta=params.meta&&typeof params.meta==`object`?Object.fromEntries(Object.entries(params.meta).map(([k,v])=>[k,String(v??``).trim()]).filter(([_,v])=>!!v)):void 0,meta=normalizedAccountId?{...baseMeta,accountId:normalizedAccountId}:baseMeta,reqs=await readPairingRequests(filePath),{requests:prunedExpired,removed:expiredRemoved}=pruneExpiredRequests(reqs,nowMs);reqs=prunedExpired;let existingIdx=reqs.findIndex(r=>r.id===id),existingCodes=new Set(reqs.map(req=>String(req.code??``).trim().toUpperCase()));if(existingIdx>=0){let existing=reqs[existingIdx],code=(existing&&typeof existing.code==`string`?existing.code.trim():``)||generateUniqueCode(existingCodes),next={id,code,createdAt:existing?.createdAt??now,lastSeenAt:now,meta:meta??existing?.meta};reqs[existingIdx]=next;let{requests:capped}=pruneExcessRequests(reqs,3);return await writeJsonFile(filePath,{version:1,requests:capped}),{code,created:!1}}let{requests:capped,removed:cappedRemoved}=pruneExcessRequests(reqs,3);if(reqs=capped,reqs.length>=3)return(expiredRemoved||cappedRemoved)&&await writeJsonFile(filePath,{version:1,requests:reqs}),{code:``,created:!1};let code=generateUniqueCode(existingCodes),next={id,code,createdAt:now,lastSeenAt:now,...meta?{meta}:{}};return await writeJsonFile(filePath,{version:1,requests:[...reqs,next]}),{code,created:!0}})}async function approveChannelPairingCode(params){let env=params.env??process.env,code=params.code.trim().toUpperCase();if(!code)return null;let filePath=resolvePairingPath(params.channel,env);return await withFileLock(filePath,{version:1,requests:[]},async()=>{let{requests:pruned,removed}=await readPrunedPairingRequests(filePath),normalizedAccountId=normalizePairingAccountId(params.accountId),idx=pruned.findIndex(r=>String(r.code??``).toUpperCase()===code?requestMatchesAccountId(r,normalizedAccountId):!1);if(idx<0)return removed&&await writeJsonFile(filePath,{version:1,requests:pruned}),null;let entry=pruned[idx];if(!entry)return null;pruned.splice(idx,1),await writeJsonFile(filePath,{version:1,requests:pruned});let entryAccountId=String(entry.meta?.accountId??``).trim()||void 0;return await addChannelAllowFromStoreEntry({channel:params.channel,entry:entry.id,accountId:params.accountId?.trim()||entryAccountId,env}),{id:entry.id,entry}})}export{removeChannelAllowFromStoreEntry as a,listPairingChannels as c,readChannelAllowFromStore as i,notifyPairingApproved as l,approveChannelPairingCode as n,upsertChannelPairingRequest as o,listChannelPairingRequests as r,getPairingAdapter as s,addChannelAllowFromStoreEntry as t};
|
|
1
|
+
import{g as resolveStateDir,m as resolveOAuthDir,y as resolveRequiredHomeDir}from"./paths-5FcIFMsj.js";import{x as safeParseJson}from"./utils-DbaBVFaK.js";import{un as withFileLock$1}from"./model-selection-DG9J_VTz.js";import{n as listChannelPlugins,t as getChannelPlugin}from"./plugins-D5zP6ENo.js";import fs from"node:fs";import os from"node:os";import path from"node:path";import crypto from"node:crypto";function listPairingChannels(){return listChannelPlugins().filter(plugin=>plugin.pairing).map(plugin=>plugin.id)}function getPairingAdapter(channelId){return getChannelPlugin(channelId)?.pairing??null}function requirePairingAdapter(channelId){let adapter=getPairingAdapter(channelId);if(!adapter)throw Error(`Channel ${channelId} does not support pairing`);return adapter}async function notifyPairingApproved(params){let adapter=params.pairingAdapter??requirePairingAdapter(params.channelId);adapter.notifyApproval&&await adapter.notifyApproval({cfg:params.cfg,id:params.id,runtime:params.runtime})}async function readJsonFileWithFallback(filePath,fallback){try{let parsed=safeParseJson(await fs.promises.readFile(filePath,`utf-8`));return parsed==null?{value:fallback,exists:!0}:{value:parsed,exists:!0}}catch(err){return err.code,{value:fallback,exists:!1}}}async function writeJsonFileAtomically(filePath,value){let dir=path.dirname(filePath);await fs.promises.mkdir(dir,{recursive:!0,mode:448});let tmp=path.join(dir,`${path.basename(filePath)}.${crypto.randomUUID()}.tmp`);await fs.promises.writeFile(tmp,`${JSON.stringify(value,null,2)}\n`,{encoding:`utf-8`}),await fs.promises.chmod(tmp,384),await fs.promises.rename(tmp,filePath)}const PAIRING_STORE_LOCK_OPTIONS={retries:{retries:10,factor:2,minTimeout:100,maxTimeout:1e4,randomize:!0},stale:3e4};function resolveCredentialsDir(env=process.env){return resolveOAuthDir(env,resolveStateDir(env,()=>resolveRequiredHomeDir(env,os.homedir)))}function safeChannelKey(channel){let raw=String(channel).trim().toLowerCase();if(!raw)throw Error(`invalid pairing channel`);let safe=raw.replace(/[\\/:*?"<>|]/g,`_`).replace(/\.\./g,`_`);if(!safe||safe===`_`)throw Error(`invalid pairing channel`);return safe}function resolvePairingPath(channel,env=process.env){return path.join(resolveCredentialsDir(env),`${safeChannelKey(channel)}-pairing.json`)}function safeAccountKey(accountId){let raw=String(accountId).trim().toLowerCase();if(!raw)throw Error(`invalid pairing account id`);let safe=raw.replace(/[\\/:*?"<>|]/g,`_`).replace(/\.\./g,`_`);if(!safe||safe===`_`)throw Error(`invalid pairing account id`);return safe}function resolveAllowFromPath(channel,env=process.env,accountId){let base=safeChannelKey(channel),normalizedAccountId=typeof accountId==`string`?accountId.trim():``;return normalizedAccountId?path.join(resolveCredentialsDir(env),`${base}-${safeAccountKey(normalizedAccountId)}-allowFrom.json`):path.join(resolveCredentialsDir(env),`${base}-allowFrom.json`)}async function readJsonFile(filePath,fallback){return await readJsonFileWithFallback(filePath,fallback)}async function writeJsonFile(filePath,value){await writeJsonFileAtomically(filePath,value)}async function readPairingRequests(filePath){let{value}=await readJsonFile(filePath,{version:1,requests:[]});return Array.isArray(value.requests)?value.requests:[]}async function readPrunedPairingRequests(filePath){return pruneExpiredRequests(await readPairingRequests(filePath),Date.now())}async function ensureJsonFile(filePath,fallback){try{await fs.promises.access(filePath)}catch{await writeJsonFile(filePath,fallback)}}async function withFileLock(filePath,fallback,fn){return await ensureJsonFile(filePath,fallback),await withFileLock$1(filePath,PAIRING_STORE_LOCK_OPTIONS,async()=>await fn())}function parseTimestamp(value){if(!value)return null;let parsed=Date.parse(value);return Number.isFinite(parsed)?parsed:null}function isExpired(entry,nowMs){let createdAt=parseTimestamp(entry.createdAt);return createdAt?nowMs-createdAt>36e5:!0}function pruneExpiredRequests(reqs,nowMs){let kept=[],removed=!1;for(let req of reqs){if(isExpired(req,nowMs)){removed=!0;continue}kept.push(req)}return{requests:kept,removed}}function resolveLastSeenAt(entry){return parseTimestamp(entry.lastSeenAt)??parseTimestamp(entry.createdAt)??0}function pruneExcessRequests(reqs,maxPending){return maxPending<=0||reqs.length<=maxPending?{requests:reqs,removed:!1}:{requests:reqs.slice().toSorted((a,b)=>resolveLastSeenAt(a)-resolveLastSeenAt(b)).slice(-maxPending),removed:!0}}function randomCode(){let out=``;for(let i=0;i<8;i++){let idx=crypto.randomInt(0,32);out+=`ABCDEFGHJKLMNPQRSTUVWXYZ23456789`[idx]}return out}function generateUniqueCode(existing){for(let attempt=0;attempt<500;attempt+=1){let code=randomCode();if(!existing.has(code))return code}throw Error(`failed to generate unique pairing code`)}function normalizePairingAccountId(accountId){return accountId?.trim().toLowerCase()||``}function requestMatchesAccountId(entry,normalizedAccountId){return normalizedAccountId?String(entry.meta?.accountId??``).trim().toLowerCase()===normalizedAccountId:!0}function normalizeId(value){return String(value).trim()}function normalizeAllowEntry(channel,entry){let trimmed=entry.trim();if(!trimmed||trimmed===`*`)return``;let adapter=getPairingAdapter(channel),normalized=adapter?.normalizeAllowEntry?adapter.normalizeAllowEntry(trimmed):trimmed;return String(normalized).trim()}function normalizeAllowFromList(channel,store){return(Array.isArray(store.allowFrom)?store.allowFrom:[]).map(v=>normalizeAllowEntry(channel,String(v))).filter(Boolean)}function normalizeAllowFromInput(channel,entry){return normalizeAllowEntry(channel,normalizeId(entry))}function dedupePreserveOrder(entries){let seen=new Set,out=[];for(let entry of entries){let normalized=String(entry).trim();!normalized||seen.has(normalized)||(seen.add(normalized),out.push(normalized))}return out}async function readAllowFromStateForPath(channel,filePath){let{value}=await readJsonFile(filePath,{version:1,allowFrom:[]});return normalizeAllowFromList(channel,value)}async function readAllowFromState(params){let{value}=await readJsonFile(params.filePath,{version:1,allowFrom:[]});return{current:normalizeAllowFromList(params.channel,value),normalized:normalizeAllowFromInput(params.channel,params.entry)||null}}async function writeAllowFromState(filePath,allowFrom){await writeJsonFile(filePath,{version:1,allowFrom})}async function updateAllowFromStoreEntry(params){let env=params.env??process.env,filePath=resolveAllowFromPath(params.channel,env,params.accountId);return await withFileLock(filePath,{version:1,allowFrom:[]},async()=>{let{current,normalized}=await readAllowFromState({channel:params.channel,entry:params.entry,filePath});if(!normalized)return{changed:!1,allowFrom:current};let next=params.apply(current,normalized);return next?(await writeAllowFromState(filePath,next),{changed:!0,allowFrom:next}):{changed:!1,allowFrom:current}})}async function readChannelAllowFromStore(channel,env=process.env,accountId){if(!(accountId?.trim().toLowerCase()??``))return await readAllowFromStateForPath(channel,resolveAllowFromPath(channel,env));let scopedEntries=await readAllowFromStateForPath(channel,resolveAllowFromPath(channel,env,accountId)),legacyEntries=await readAllowFromStateForPath(channel,resolveAllowFromPath(channel,env));return dedupePreserveOrder([...scopedEntries,...legacyEntries])}async function updateChannelAllowFromStore(params){return await updateAllowFromStoreEntry({channel:params.channel,entry:params.entry,accountId:params.accountId,env:params.env,apply:params.apply})}async function addChannelAllowFromStoreEntry(params){return await updateChannelAllowFromStore({...params,apply:(current,normalized)=>current.includes(normalized)?null:[...current,normalized]})}async function removeChannelAllowFromStoreEntry(params){return await updateChannelAllowFromStore({...params,apply:(current,normalized)=>{let next=current.filter(entry=>entry!==normalized);return next.length===current.length?null:next}})}async function listChannelPairingRequests(channel,env=process.env,accountId){let filePath=resolvePairingPath(channel,env);return await withFileLock(filePath,{version:1,requests:[]},async()=>{let{requests:prunedExpired,removed:expiredRemoved}=await readPrunedPairingRequests(filePath),{requests:pruned,removed:cappedRemoved}=pruneExcessRequests(prunedExpired,3);(expiredRemoved||cappedRemoved)&&await writeJsonFile(filePath,{version:1,requests:pruned});let normalizedAccountId=normalizePairingAccountId(accountId);return(normalizedAccountId?pruned.filter(entry=>requestMatchesAccountId(entry,normalizedAccountId)):pruned).filter(r=>r&&typeof r.id==`string`&&typeof r.code==`string`&&typeof r.createdAt==`string`).slice().toSorted((a,b)=>a.createdAt.localeCompare(b.createdAt))})}async function upsertChannelPairingRequest(params){let env=params.env??process.env,filePath=resolvePairingPath(params.channel,env);return await withFileLock(filePath,{version:1,requests:[]},async()=>{let now=new Date().toISOString(),nowMs=Date.now(),id=normalizeId(params.id),normalizedAccountId=params.accountId?.trim(),baseMeta=params.meta&&typeof params.meta==`object`?Object.fromEntries(Object.entries(params.meta).map(([k,v])=>[k,String(v??``).trim()]).filter(([_,v])=>!!v)):void 0,meta=normalizedAccountId?{...baseMeta,accountId:normalizedAccountId}:baseMeta,reqs=await readPairingRequests(filePath),{requests:prunedExpired,removed:expiredRemoved}=pruneExpiredRequests(reqs,nowMs);reqs=prunedExpired;let existingIdx=reqs.findIndex(r=>r.id===id),existingCodes=new Set(reqs.map(req=>String(req.code??``).trim().toUpperCase()));if(existingIdx>=0){let existing=reqs[existingIdx],code=(existing&&typeof existing.code==`string`?existing.code.trim():``)||generateUniqueCode(existingCodes),next={id,code,createdAt:existing?.createdAt??now,lastSeenAt:now,meta:meta??existing?.meta};reqs[existingIdx]=next;let{requests:capped}=pruneExcessRequests(reqs,3);return await writeJsonFile(filePath,{version:1,requests:capped}),{code,created:!1}}let{requests:capped,removed:cappedRemoved}=pruneExcessRequests(reqs,3);if(reqs=capped,reqs.length>=3)return(expiredRemoved||cappedRemoved)&&await writeJsonFile(filePath,{version:1,requests:reqs}),{code:``,created:!1};let code=generateUniqueCode(existingCodes),next={id,code,createdAt:now,lastSeenAt:now,...meta?{meta}:{}};return await writeJsonFile(filePath,{version:1,requests:[...reqs,next]}),{code,created:!0}})}async function approveChannelPairingCode(params){let env=params.env??process.env,code=params.code.trim().toUpperCase();if(!code)return null;let filePath=resolvePairingPath(params.channel,env);return await withFileLock(filePath,{version:1,requests:[]},async()=>{let{requests:pruned,removed}=await readPrunedPairingRequests(filePath),normalizedAccountId=normalizePairingAccountId(params.accountId),idx=pruned.findIndex(r=>String(r.code??``).toUpperCase()===code?requestMatchesAccountId(r,normalizedAccountId):!1);if(idx<0)return removed&&await writeJsonFile(filePath,{version:1,requests:pruned}),null;let entry=pruned[idx];if(!entry)return null;pruned.splice(idx,1),await writeJsonFile(filePath,{version:1,requests:pruned});let entryAccountId=String(entry.meta?.accountId??``).trim()||void 0;return await addChannelAllowFromStoreEntry({channel:params.channel,entry:entry.id,accountId:params.accountId?.trim()||entryAccountId,env}),{id:entry.id,entry}})}export{removeChannelAllowFromStoreEntry as a,listPairingChannels as c,readChannelAllowFromStore as i,notifyPairingApproved as l,approveChannelPairingCode as n,upsertChannelPairingRequest as o,listChannelPairingRequests as r,getPairingAdapter as s,addChannelAllowFromStoreEntry as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{o as getChatChannelMeta,s as listChatChannels,u as normalizeChatChannelId}from"./registry-Cv7CoWAs.js";import{d as isRecord}from"./utils-BP60e80M.js";import{R as normalizeProviderId}from"./auth-profiles-
|
|
1
|
+
import{o as getChatChannelMeta,s as listChatChannels,u as normalizeChatChannelId}from"./registry-Cv7CoWAs.js";import{d as isRecord}from"./utils-BP60e80M.js";import{R as normalizeProviderId}from"./auth-profiles-pt7Tr4HA.js";import{t as hasAnyWhatsAppAuth}from"./accounts-BkTLjSrD.js";import{n as getChannelPluginCatalogEntry,r as listChannelPluginCatalogEntries}from"./catalog-li4bSIE2.js";import{t as ensurePluginAllowlisted}from"./plugins-allowlist-DfmKSjii.js";const CHANNEL_PLUGIN_IDS=Array.from(new Set([...listChatChannels().map(meta=>meta.id),...listChannelPluginCatalogEntries().map(entry=>entry.id)])),PROVIDER_PLUGIN_IDS=[{pluginId:`google-antigravity-auth`,providerId:`google-antigravity`},{pluginId:`google-gemini-cli-auth`,providerId:`google-gemini-cli`},{pluginId:`qwen-portal-auth`,providerId:`qwen-portal`},{pluginId:`copilot-proxy`,providerId:`copilot-proxy`},{pluginId:`minimax-portal-auth`,providerId:`minimax-portal`}];function hasNonEmptyString(value){return typeof value==`string`&&value.trim().length>0}function recordHasKeys(value){return isRecord(value)&&Object.keys(value).length>0}function accountsHaveKeys(value,keys){if(!isRecord(value))return!1;for(let account of Object.values(value))if(isRecord(account)){for(let key of keys)if(hasNonEmptyString(account[key]))return!0}return!1}function resolveChannelConfig(cfg,channelId){let entry=cfg.channels?.[channelId];return isRecord(entry)?entry:null}function isTelegramConfigured(cfg,env){if(hasNonEmptyString(env.TELEGRAM_BOT_TOKEN))return!0;let entry=resolveChannelConfig(cfg,`telegram`);return entry?hasNonEmptyString(entry.botToken)||hasNonEmptyString(entry.tokenFile)||accountsHaveKeys(entry.accounts,[`botToken`,`tokenFile`])?!0:recordHasKeys(entry):!1}function isDiscordConfigured(cfg,env){if(hasNonEmptyString(env.DISCORD_BOT_TOKEN))return!0;let entry=resolveChannelConfig(cfg,`discord`);return entry?hasNonEmptyString(entry.token)||accountsHaveKeys(entry.accounts,[`token`])?!0:recordHasKeys(entry):!1}function isIrcConfigured(cfg,env){if(hasNonEmptyString(env.IRC_HOST)&&hasNonEmptyString(env.IRC_NICK))return!0;let entry=resolveChannelConfig(cfg,`irc`);return entry?hasNonEmptyString(entry.host)||hasNonEmptyString(entry.nick)||accountsHaveKeys(entry.accounts,[`host`,`nick`])?!0:recordHasKeys(entry):!1}function isSlackConfigured(cfg,env){if(hasNonEmptyString(env.SLACK_BOT_TOKEN)||hasNonEmptyString(env.SLACK_APP_TOKEN)||hasNonEmptyString(env.SLACK_USER_TOKEN))return!0;let entry=resolveChannelConfig(cfg,`slack`);return entry?hasNonEmptyString(entry.botToken)||hasNonEmptyString(entry.appToken)||hasNonEmptyString(entry.userToken)||accountsHaveKeys(entry.accounts,[`botToken`,`appToken`,`userToken`])?!0:recordHasKeys(entry):!1}function isSignalConfigured(cfg){let entry=resolveChannelConfig(cfg,`signal`);return entry?hasNonEmptyString(entry.account)||hasNonEmptyString(entry.httpUrl)||hasNonEmptyString(entry.httpHost)||typeof entry.httpPort==`number`||hasNonEmptyString(entry.cliPath)||accountsHaveKeys(entry.accounts,[`account`,`httpUrl`,`httpHost`,`cliPath`])?!0:recordHasKeys(entry):!1}function isIMessageConfigured(cfg){let entry=resolveChannelConfig(cfg,`imessage`);return entry?hasNonEmptyString(entry.cliPath)?!0:recordHasKeys(entry):!1}function isWhatsAppConfigured(cfg){if(hasAnyWhatsAppAuth(cfg))return!0;let entry=resolveChannelConfig(cfg,`whatsapp`);return entry?recordHasKeys(entry):!1}function isGenericChannelConfigured(cfg,channelId){return recordHasKeys(resolveChannelConfig(cfg,channelId))}function isChannelConfigured(cfg,channelId,env=process.env){switch(channelId){case`whatsapp`:return isWhatsAppConfigured(cfg);case`telegram`:return isTelegramConfigured(cfg,env);case`discord`:return isDiscordConfigured(cfg,env);case`irc`:return isIrcConfigured(cfg,env);case`slack`:return isSlackConfigured(cfg,env);case`signal`:return isSignalConfigured(cfg);case`imessage`:return isIMessageConfigured(cfg);default:return isGenericChannelConfigured(cfg,channelId)}}function collectModelRefs(cfg){let refs=[],pushModelRef=value=>{typeof value==`string`&&value.trim()&&refs.push(value.trim())},collectFromAgent=agent=>{if(!agent)return;let model=agent.model;if(typeof model==`string`)pushModelRef(model);else if(isRecord(model)){pushModelRef(model.primary);let fallbacks=model.fallbacks;if(Array.isArray(fallbacks))for(let entry of fallbacks)pushModelRef(entry)}let models=agent.models;if(isRecord(models))for(let key of Object.keys(models))pushModelRef(key)},defaults=cfg.agents?.defaults;collectFromAgent(defaults);let list=cfg.agents?.list;if(Array.isArray(list))for(let entry of list)isRecord(entry)&&collectFromAgent(entry);return refs}function extractProviderFromModelRef(value){let trimmed=value.trim(),slash=trimmed.indexOf(`/`);return slash<=0?null:normalizeProviderId(trimmed.slice(0,slash))}function isProviderConfigured(cfg,providerId){let normalized=normalizeProviderId(providerId),profiles=cfg.auth?.profiles;if(profiles&&typeof profiles==`object`){for(let profile of Object.values(profiles))if(isRecord(profile)&&normalizeProviderId(String(profile.provider??``))===normalized)return!0}let providerConfig=cfg.models?.providers;if(providerConfig&&typeof providerConfig==`object`){for(let key of Object.keys(providerConfig))if(normalizeProviderId(key)===normalized)return!0}let modelRefs=collectModelRefs(cfg);for(let ref of modelRefs){let provider=extractProviderFromModelRef(ref);if(provider&&provider===normalized)return!0}return!1}function resolveConfiguredPlugins(cfg,env){let changes=[],channelIds=new Set(CHANNEL_PLUGIN_IDS),configuredChannels=cfg.channels;if(configuredChannels&&typeof configuredChannels==`object`)for(let key of Object.keys(configuredChannels))key!==`defaults`&&channelIds.add(key);for(let channelId of channelIds)channelId&&isChannelConfigured(cfg,channelId,env)&&changes.push({pluginId:channelId,reason:`${channelId} configured`});for(let mapping of PROVIDER_PLUGIN_IDS)isProviderConfigured(cfg,mapping.providerId)&&changes.push({pluginId:mapping.pluginId,reason:`${mapping.providerId} auth configured`});return changes}function isPluginExplicitlyDisabled(cfg,pluginId){return cfg.plugins?.entries?.[pluginId]?.enabled===!1}function isPluginDenied(cfg,pluginId){let deny=cfg.plugins?.deny;return Array.isArray(deny)&&deny.includes(pluginId)}function resolvePreferredOverIds(pluginId){let normalized=normalizeChatChannelId(pluginId);return normalized?getChatChannelMeta(normalized).preferOver??[]:getChannelPluginCatalogEntry(pluginId)?.meta.preferOver??[]}function shouldSkipPreferredPluginAutoEnable(cfg,entry,configured){for(let other of configured)if(other.pluginId!==entry.pluginId&&!isPluginDenied(cfg,other.pluginId)&&!isPluginExplicitlyDisabled(cfg,other.pluginId)&&resolvePreferredOverIds(other.pluginId).includes(entry.pluginId))return!0;return!1}function registerPluginEntry(cfg,pluginId){let entries={...cfg.plugins?.entries,[pluginId]:{...cfg.plugins?.entries?.[pluginId],enabled:!0}};return{...cfg,plugins:{...cfg.plugins,entries}}}function formatAutoEnableChange(entry){let reason=entry.reason.trim(),channelId=normalizeChatChannelId(entry.pluginId);if(channelId){let label=getChatChannelMeta(channelId).label;reason=reason.replace(RegExp(`^${channelId}\\b`,`i`),label)}return`${reason}, enabled automatically.`}function applyPluginAutoEnable(params){let env=params.env??process.env,configured=resolveConfiguredPlugins(params.config,env);if(configured.length===0)return{config:params.config,changes:[]};let next=params.config,changes=[];if(next.plugins?.enabled===!1)return{config:next,changes};for(let entry of configured){if(isPluginDenied(next,entry.pluginId)||isPluginExplicitlyDisabled(next,entry.pluginId)||shouldSkipPreferredPluginAutoEnable(next,entry,configured))continue;let allow=next.plugins?.allow,allowMissing=Array.isArray(allow)&&!allow.includes(entry.pluginId);next.plugins?.entries?.[entry.pluginId]?.enabled===!0&&!allowMissing||(next=registerPluginEntry(next,entry.pluginId),next=ensurePluginAllowlisted(next,entry.pluginId),changes.push(formatAutoEnableChange(entry)))}return{config:next,changes}}export{isChannelConfigured as n,applyPluginAutoEnable as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{f as isRecord}from"./utils-DbaBVFaK.js";import{o as getChatChannelMeta,s as listChatChannels,u as normalizeChatChannelId}from"./registry-TdK-aV05.js";import{u as normalizeProviderId}from"./model-selection-
|
|
1
|
+
import{f as isRecord}from"./utils-DbaBVFaK.js";import{o as getChatChannelMeta,s as listChatChannels,u as normalizeChatChannelId}from"./registry-TdK-aV05.js";import{u as normalizeProviderId}from"./model-selection-DG9J_VTz.js";import{t as hasAnyWhatsAppAuth}from"./accounts-o35LU_iy.js";import{n as getChannelPluginCatalogEntry,r as listChannelPluginCatalogEntries}from"./catalog-rgiY__UQ.js";import{t as ensurePluginAllowlisted}from"./plugins-allowlist-CfwmQxbE.js";const CHANNEL_PLUGIN_IDS=Array.from(new Set([...listChatChannels().map(meta=>meta.id),...listChannelPluginCatalogEntries().map(entry=>entry.id)])),PROVIDER_PLUGIN_IDS=[{pluginId:`google-antigravity-auth`,providerId:`google-antigravity`},{pluginId:`google-gemini-cli-auth`,providerId:`google-gemini-cli`},{pluginId:`qwen-portal-auth`,providerId:`qwen-portal`},{pluginId:`copilot-proxy`,providerId:`copilot-proxy`},{pluginId:`minimax-portal-auth`,providerId:`minimax-portal`}];function hasNonEmptyString(value){return typeof value==`string`&&value.trim().length>0}function recordHasKeys(value){return isRecord(value)&&Object.keys(value).length>0}function accountsHaveKeys(value,keys){if(!isRecord(value))return!1;for(let account of Object.values(value))if(isRecord(account)){for(let key of keys)if(hasNonEmptyString(account[key]))return!0}return!1}function resolveChannelConfig(cfg,channelId){let entry=cfg.channels?.[channelId];return isRecord(entry)?entry:null}function isTelegramConfigured(cfg,env){if(hasNonEmptyString(env.TELEGRAM_BOT_TOKEN))return!0;let entry=resolveChannelConfig(cfg,`telegram`);return entry?hasNonEmptyString(entry.botToken)||hasNonEmptyString(entry.tokenFile)||accountsHaveKeys(entry.accounts,[`botToken`,`tokenFile`])?!0:recordHasKeys(entry):!1}function isDiscordConfigured(cfg,env){if(hasNonEmptyString(env.DISCORD_BOT_TOKEN))return!0;let entry=resolveChannelConfig(cfg,`discord`);return entry?hasNonEmptyString(entry.token)||accountsHaveKeys(entry.accounts,[`token`])?!0:recordHasKeys(entry):!1}function isIrcConfigured(cfg,env){if(hasNonEmptyString(env.IRC_HOST)&&hasNonEmptyString(env.IRC_NICK))return!0;let entry=resolveChannelConfig(cfg,`irc`);return entry?hasNonEmptyString(entry.host)||hasNonEmptyString(entry.nick)||accountsHaveKeys(entry.accounts,[`host`,`nick`])?!0:recordHasKeys(entry):!1}function isSlackConfigured(cfg,env){if(hasNonEmptyString(env.SLACK_BOT_TOKEN)||hasNonEmptyString(env.SLACK_APP_TOKEN)||hasNonEmptyString(env.SLACK_USER_TOKEN))return!0;let entry=resolveChannelConfig(cfg,`slack`);return entry?hasNonEmptyString(entry.botToken)||hasNonEmptyString(entry.appToken)||hasNonEmptyString(entry.userToken)||accountsHaveKeys(entry.accounts,[`botToken`,`appToken`,`userToken`])?!0:recordHasKeys(entry):!1}function isSignalConfigured(cfg){let entry=resolveChannelConfig(cfg,`signal`);return entry?hasNonEmptyString(entry.account)||hasNonEmptyString(entry.httpUrl)||hasNonEmptyString(entry.httpHost)||typeof entry.httpPort==`number`||hasNonEmptyString(entry.cliPath)||accountsHaveKeys(entry.accounts,[`account`,`httpUrl`,`httpHost`,`cliPath`])?!0:recordHasKeys(entry):!1}function isIMessageConfigured(cfg){let entry=resolveChannelConfig(cfg,`imessage`);return entry?hasNonEmptyString(entry.cliPath)?!0:recordHasKeys(entry):!1}function isWhatsAppConfigured(cfg){if(hasAnyWhatsAppAuth(cfg))return!0;let entry=resolveChannelConfig(cfg,`whatsapp`);return entry?recordHasKeys(entry):!1}function isGenericChannelConfigured(cfg,channelId){return recordHasKeys(resolveChannelConfig(cfg,channelId))}function isChannelConfigured(cfg,channelId,env=process.env){switch(channelId){case`whatsapp`:return isWhatsAppConfigured(cfg);case`telegram`:return isTelegramConfigured(cfg,env);case`discord`:return isDiscordConfigured(cfg,env);case`irc`:return isIrcConfigured(cfg,env);case`slack`:return isSlackConfigured(cfg,env);case`signal`:return isSignalConfigured(cfg);case`imessage`:return isIMessageConfigured(cfg);default:return isGenericChannelConfigured(cfg,channelId)}}function collectModelRefs(cfg){let refs=[],pushModelRef=value=>{typeof value==`string`&&value.trim()&&refs.push(value.trim())},collectFromAgent=agent=>{if(!agent)return;let model=agent.model;if(typeof model==`string`)pushModelRef(model);else if(isRecord(model)){pushModelRef(model.primary);let fallbacks=model.fallbacks;if(Array.isArray(fallbacks))for(let entry of fallbacks)pushModelRef(entry)}let models=agent.models;if(isRecord(models))for(let key of Object.keys(models))pushModelRef(key)},defaults=cfg.agents?.defaults;collectFromAgent(defaults);let list=cfg.agents?.list;if(Array.isArray(list))for(let entry of list)isRecord(entry)&&collectFromAgent(entry);return refs}function extractProviderFromModelRef(value){let trimmed=value.trim(),slash=trimmed.indexOf(`/`);return slash<=0?null:normalizeProviderId(trimmed.slice(0,slash))}function isProviderConfigured(cfg,providerId){let normalized=normalizeProviderId(providerId),profiles=cfg.auth?.profiles;if(profiles&&typeof profiles==`object`){for(let profile of Object.values(profiles))if(isRecord(profile)&&normalizeProviderId(String(profile.provider??``))===normalized)return!0}let providerConfig=cfg.models?.providers;if(providerConfig&&typeof providerConfig==`object`){for(let key of Object.keys(providerConfig))if(normalizeProviderId(key)===normalized)return!0}let modelRefs=collectModelRefs(cfg);for(let ref of modelRefs){let provider=extractProviderFromModelRef(ref);if(provider&&provider===normalized)return!0}return!1}function resolveConfiguredPlugins(cfg,env){let changes=[],channelIds=new Set(CHANNEL_PLUGIN_IDS),configuredChannels=cfg.channels;if(configuredChannels&&typeof configuredChannels==`object`)for(let key of Object.keys(configuredChannels))key!==`defaults`&&channelIds.add(key);for(let channelId of channelIds)channelId&&isChannelConfigured(cfg,channelId,env)&&changes.push({pluginId:channelId,reason:`${channelId} configured`});for(let mapping of PROVIDER_PLUGIN_IDS)isProviderConfigured(cfg,mapping.providerId)&&changes.push({pluginId:mapping.pluginId,reason:`${mapping.providerId} auth configured`});return changes}function isPluginExplicitlyDisabled(cfg,pluginId){return cfg.plugins?.entries?.[pluginId]?.enabled===!1}function isPluginDenied(cfg,pluginId){let deny=cfg.plugins?.deny;return Array.isArray(deny)&&deny.includes(pluginId)}function resolvePreferredOverIds(pluginId){let normalized=normalizeChatChannelId(pluginId);return normalized?getChatChannelMeta(normalized).preferOver??[]:getChannelPluginCatalogEntry(pluginId)?.meta.preferOver??[]}function shouldSkipPreferredPluginAutoEnable(cfg,entry,configured){for(let other of configured)if(other.pluginId!==entry.pluginId&&!isPluginDenied(cfg,other.pluginId)&&!isPluginExplicitlyDisabled(cfg,other.pluginId)&&resolvePreferredOverIds(other.pluginId).includes(entry.pluginId))return!0;return!1}function registerPluginEntry(cfg,pluginId){let entries={...cfg.plugins?.entries,[pluginId]:{...cfg.plugins?.entries?.[pluginId],enabled:!0}};return{...cfg,plugins:{...cfg.plugins,entries}}}function formatAutoEnableChange(entry){let reason=entry.reason.trim(),channelId=normalizeChatChannelId(entry.pluginId);if(channelId){let label=getChatChannelMeta(channelId).label;reason=reason.replace(RegExp(`^${channelId}\\b`,`i`),label)}return`${reason}, enabled automatically.`}function applyPluginAutoEnable(params){let env=params.env??process.env,configured=resolveConfiguredPlugins(params.config,env);if(configured.length===0)return{config:params.config,changes:[]};let next=params.config,changes=[];if(next.plugins?.enabled===!1)return{config:next,changes};for(let entry of configured){if(isPluginDenied(next,entry.pluginId)||isPluginExplicitlyDisabled(next,entry.pluginId)||shouldSkipPreferredPluginAutoEnable(next,entry,configured))continue;let allow=next.plugins?.allow,allowMissing=Array.isArray(allow)&&!allow.includes(entry.pluginId);next.plugins?.entries?.[entry.pluginId]?.enabled===!0&&!allowMissing||(next=registerPluginEntry(next,entry.pluginId),next=ensurePluginAllowlisted(next,entry.pluginId),changes.push(formatAutoEnableChange(entry)))}return{config:next,changes}}export{isChannelConfigured as n,applyPluginAutoEnable as t};
|
|
@@ -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"./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{t as ensurePluginRegistryLoaded}from"./plugin-registry-BoPaef5I.js";export{ensurePluginRegistryLoaded};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{Mt as loadBuilderForceAgentsPlugins}from"./reply-
|
|
1
|
+
import{Mt as loadBuilderForceAgentsPlugins}from"./reply-GY1C8tcv.js";import{t as createSubsystemLogger}from"./subsystem-B3TqcCrZ.js";import{d as getActivePluginRegistry}from"./registry-TdK-aV05.js";import{c as resolveAgentWorkspaceDir,l as resolveDefaultAgentId}from"./agent-scope-DPtjOxzp.js";import{r as loadConfig}from"./io-BLBq4T2o.js";const log=createSubsystemLogger(`plugins`);let pluginRegistryLoaded=!1;function ensurePluginRegistryLoaded(){if(pluginRegistryLoaded)return;let active=getActivePluginRegistry();if(active&&(active.plugins.length>0||active.channels.length>0||active.tools.length>0)){pluginRegistryLoaded=!0;return}let config=loadConfig();loadBuilderForceAgentsPlugins({config,workspaceDir:resolveAgentWorkspaceDir(config,resolveDefaultAgentId(config)),logger:{info:msg=>log.info(msg),warn:msg=>log.warn(msg),error:msg=>log.error(msg),debug:msg=>log.debug(msg)}}),pluginRegistryLoaded=!0}export{ensurePluginRegistryLoaded as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{d as getActivePluginRegistry}from"./registry-Cv7CoWAs.js";import{t as createSubsystemLogger}from"./subsystem-C4b1Von0.js";import{c as resolveAgentWorkspaceDir,l as resolveDefaultAgentId}from"./agent-scope-CufEmNj_.js";import{r as loadConfig}from"./io-
|
|
1
|
+
import{d as getActivePluginRegistry}from"./registry-Cv7CoWAs.js";import{t as createSubsystemLogger}from"./subsystem-C4b1Von0.js";import{c as resolveAgentWorkspaceDir,l as resolveDefaultAgentId}from"./agent-scope-CufEmNj_.js";import{r as loadConfig}from"./io-D9hC2aG0.js";import{w as loadBuilderForceAgentsPlugins}from"./subagent-registry-DDEN4oJi.js";const log=createSubsystemLogger(`plugins`);let pluginRegistryLoaded=!1;function ensurePluginRegistryLoaded(){if(pluginRegistryLoaded)return;let active=getActivePluginRegistry();if(active&&(active.plugins.length>0||active.channels.length>0||active.tools.length>0)){pluginRegistryLoaded=!0;return}let config=loadConfig();loadBuilderForceAgentsPlugins({config,workspaceDir:resolveAgentWorkspaceDir(config,resolveDefaultAgentId(config)),logger:{info:msg=>log.info(msg),warn:msg=>log.warn(msg),error:msg=>log.error(msg),debug:msg=>log.debug(msg)}}),pluginRegistryLoaded=!0}export{ensurePluginRegistryLoaded as t};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import"./paths-BHg-VHB4.js";import"./registry-Cv7CoWAs.js";import"./utils-BP60e80M.js";import"./subsystem-C4b1Von0.js";import"./boolean-ssGoaBPk.js";import"./env-BoE8QSib.js";import"./warning-filter-nSTjpMIH.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"./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"./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"./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"./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"./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"./active-listener-Di9e1YAD.js";import"./mamba-state-engine-CV4nDcCk.js";import"./transformers-stream-Buj40qHl.js";import{t as ensurePluginRegistryLoaded}from"./plugin-registry-CxnuHO_n.js";export{ensurePluginRegistryLoaded};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{c as normalizeAccountId,t as DEFAULT_ACCOUNT_ID}from"./session-key-5J69DULS.js";import{B as info,E as jidToE164,K as success,Z as getChildLogger,j as resolveUserPath}from"./registry-
|
|
1
|
+
import{c as normalizeAccountId,t as DEFAULT_ACCOUNT_ID}from"./session-key-5J69DULS.js";import{B as info,E as jidToE164,K as success,Z as getChildLogger,j as resolveUserPath}from"./registry-DJq2Cvo9.js";import{a as resolveOAuthDir}from"./paths-Cb8zTlyG.js";import{i as defaultRuntime}from"./subsystem-COTa5Ly_.js";import{t as formatCliCommand}from"./command-format-CAX9XFjI.js";import path from"node:path";import fs from"node:fs";import fs$1 from"node:fs/promises";function createAccountListHelpers(channelKey){function listConfiguredAccountIds(cfg){let accounts=cfg.channels?.[channelKey]?.accounts;return!accounts||typeof accounts!=`object`?[]:Object.keys(accounts).filter(Boolean)}function listAccountIds(cfg){let ids=listConfiguredAccountIds(cfg);return ids.length===0?[DEFAULT_ACCOUNT_ID]:ids.toSorted((a,b)=>a.localeCompare(b))}function resolveDefaultAccountId(cfg){let ids=listAccountIds(cfg);return ids.includes(DEFAULT_ACCOUNT_ID)?DEFAULT_ACCOUNT_ID:ids[0]??DEFAULT_ACCOUNT_ID}return{listConfiguredAccountIds,listAccountIds,resolveDefaultAccountId}}function resolveDefaultWebAuthDir(){return path.join(resolveOAuthDir(),`whatsapp`,DEFAULT_ACCOUNT_ID)}const WA_WEB_AUTH_DIR=resolveDefaultWebAuthDir();function resolveWebCredsPath(authDir){return path.join(authDir,`creds.json`)}function resolveWebCredsBackupPath(authDir){return path.join(authDir,`creds.json.bak`)}function readCredsJsonRaw(filePath){try{if(!fs.existsSync(filePath))return null;let stats=fs.statSync(filePath);return!stats.isFile()||stats.size<=1?null:fs.readFileSync(filePath,`utf-8`)}catch{return null}}function maybeRestoreCredsFromBackup(authDir){let logger=getChildLogger({module:`web-session`});try{let credsPath=resolveWebCredsPath(authDir),backupPath=resolveWebCredsBackupPath(authDir),raw=readCredsJsonRaw(credsPath);if(raw){JSON.parse(raw);return}let backupRaw=readCredsJsonRaw(backupPath);if(!backupRaw)return;JSON.parse(backupRaw),fs.copyFileSync(backupPath,credsPath);try{fs.chmodSync(credsPath,384)}catch{}logger.warn({credsPath},`restored corrupted WhatsApp creds.json from backup`)}catch{}}async function webAuthExists(authDir=resolveDefaultWebAuthDir()){let resolvedAuthDir=resolveUserPath(authDir);maybeRestoreCredsFromBackup(resolvedAuthDir);let credsPath=resolveWebCredsPath(resolvedAuthDir);try{await fs$1.access(resolvedAuthDir)}catch{return!1}try{let stats=await fs$1.stat(credsPath);if(!stats.isFile()||stats.size<=1)return!1;let raw=await fs$1.readFile(credsPath,`utf-8`);return JSON.parse(raw),!0}catch{return!1}}async function clearLegacyBaileysAuthState(authDir){let entries=await fs$1.readdir(authDir,{withFileTypes:!0}),shouldDelete=name=>name===`oauth.json`?!1:name===`creds.json`||name===`creds.json.bak`?!0:name.endsWith(`.json`)?/^(app-state-sync|session|sender-key|pre-key)-/.test(name):!1;await Promise.all(entries.map(async entry=>{entry.isFile()&&shouldDelete(entry.name)&&await fs$1.rm(path.join(authDir,entry.name),{force:!0})}))}async function logoutWeb(params){let runtime=params.runtime??defaultRuntime,resolvedAuthDir=resolveUserPath(params.authDir??resolveDefaultWebAuthDir());return await webAuthExists(resolvedAuthDir)?(params.isLegacyAuthDir?await clearLegacyBaileysAuthState(resolvedAuthDir):await fs$1.rm(resolvedAuthDir,{recursive:!0,force:!0}),runtime.log(success(`Cleared WhatsApp Web credentials.`)),!0):(runtime.log(info(`No WhatsApp Web session found; nothing to delete.`)),!1)}function readWebSelfId(authDir=resolveDefaultWebAuthDir()){try{let credsPath=resolveWebCredsPath(resolveUserPath(authDir));if(!fs.existsSync(credsPath))return{e164:null,jid:null};let raw=fs.readFileSync(credsPath,`utf-8`),jid=JSON.parse(raw)?.me?.id??null;return{e164:jid?jidToE164(jid,{authDir}):null,jid}}catch{return{e164:null,jid:null}}}function getWebAuthAgeMs(authDir=resolveDefaultWebAuthDir()){try{let stats=fs.statSync(resolveWebCredsPath(resolveUserPath(authDir)));return Date.now()-stats.mtimeMs}catch{return null}}function logWebSelfId(authDir=resolveDefaultWebAuthDir(),runtime=defaultRuntime,includeChannelPrefix=!1){let{e164,jid}=readWebSelfId(authDir),details=e164||jid?`${e164??`unknown`}${jid?` (jid ${jid})`:``}`:`unknown`,prefix=includeChannelPrefix?`Web Channel: `:``;runtime.log(info(`${prefix}${details}`))}async function pickWebChannel(pref,authDir=resolveDefaultWebAuthDir()){let choice=pref===`auto`?`web`:pref;if(!await webAuthExists(authDir))throw Error(`No WhatsApp Web session found. Run \`${formatCliCommand(`builderforce channels login --channel whatsapp --verbose`)}\` to link.`);return choice}const{listConfiguredAccountIds,listAccountIds,resolveDefaultAccountId}=createAccountListHelpers(`whatsapp`),listWhatsAppAccountIds=listAccountIds,resolveDefaultWhatsAppAccountId=resolveDefaultAccountId;function resolveAccountConfig(cfg,accountId){let accounts=cfg.channels?.whatsapp?.accounts;if(!(!accounts||typeof accounts!=`object`))return accounts[accountId]}function resolveDefaultAuthDir(accountId){return path.join(resolveOAuthDir(),`whatsapp`,normalizeAccountId(accountId))}function resolveLegacyAuthDir(){return resolveOAuthDir()}function legacyAuthExists(authDir){try{return fs.existsSync(path.join(authDir,`creds.json`))}catch{return!1}}function resolveWhatsAppAuthDir(params){let accountId=params.accountId.trim()||DEFAULT_ACCOUNT_ID,configured=resolveAccountConfig(params.cfg,accountId)?.authDir?.trim();if(configured)return{authDir:resolveUserPath(configured),isLegacy:!1};let defaultDir=resolveDefaultAuthDir(accountId);if(accountId===DEFAULT_ACCOUNT_ID){let legacyDir=resolveLegacyAuthDir();if(legacyAuthExists(legacyDir)&&!legacyAuthExists(defaultDir))return{authDir:legacyDir,isLegacy:!0}}return{authDir:defaultDir,isLegacy:!1}}function resolveWhatsAppAccount(params){let rootCfg=params.cfg.channels?.whatsapp,accountId=params.accountId?.trim()||resolveDefaultWhatsAppAccountId(params.cfg),accountCfg=resolveAccountConfig(params.cfg,accountId),enabled=accountCfg?.enabled!==!1,{authDir,isLegacy}=resolveWhatsAppAuthDir({cfg:params.cfg,accountId});return{accountId,name:accountCfg?.name?.trim()||void 0,enabled,sendReadReceipts:accountCfg?.sendReadReceipts??rootCfg?.sendReadReceipts??!0,messagePrefix:accountCfg?.messagePrefix??rootCfg?.messagePrefix??params.cfg.messages?.messagePrefix,authDir,isLegacyAuthDir:isLegacy,selfChatMode:accountCfg?.selfChatMode??rootCfg?.selfChatMode,dmPolicy:accountCfg?.dmPolicy??rootCfg?.dmPolicy,allowFrom:accountCfg?.allowFrom??rootCfg?.allowFrom,groupAllowFrom:accountCfg?.groupAllowFrom??rootCfg?.groupAllowFrom,groupPolicy:accountCfg?.groupPolicy??rootCfg?.groupPolicy,textChunkLimit:accountCfg?.textChunkLimit??rootCfg?.textChunkLimit,chunkMode:accountCfg?.chunkMode??rootCfg?.chunkMode,mediaMaxMb:accountCfg?.mediaMaxMb??rootCfg?.mediaMaxMb,blockStreaming:accountCfg?.blockStreaming??rootCfg?.blockStreaming,ackReaction:accountCfg?.ackReaction??rootCfg?.ackReaction,groups:accountCfg?.groups??rootCfg?.groups,debounceMs:accountCfg?.debounceMs??rootCfg?.debounceMs}}export{createAccountListHelpers as _,WA_WEB_AUTH_DIR as a,logoutWeb as c,readCredsJsonRaw as d,readWebSelfId as f,webAuthExists as g,resolveWebCredsPath as h,resolveWhatsAppAuthDir as i,maybeRestoreCredsFromBackup as l,resolveWebCredsBackupPath as m,resolveDefaultWhatsAppAccountId as n,getWebAuthAgeMs as o,resolveDefaultWebAuthDir as p,resolveWhatsAppAccount as r,logWebSelfId as s,listWhatsAppAccountIds as t,pickWebChannel as u};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{t as DEFAULT_ACCOUNT_ID}from"./session-key-5J69DULS.js";import{t as formatCliCommand}from"./command-format-
|
|
1
|
+
import{t as DEFAULT_ACCOUNT_ID}from"./session-key-5J69DULS.js";import{t as formatCliCommand}from"./command-format-CAX9XFjI.js";import{i as markdownToIRWithMeta,t as renderMarkdownWithMarkers}from"./render-BUCRXPIk.js";function normalizePollInput(input,options={}){let question=input.question.trim();if(!question)throw Error(`Poll question is required`);let cleaned=(input.options??[]).map(option=>option.trim()).filter(Boolean);if(cleaned.length<2)throw Error(`Poll requires at least 2 options`);if(options.maxOptions!==void 0&&cleaned.length>options.maxOptions)throw Error(`Poll supports at most ${options.maxOptions} options`);let maxSelectionsRaw=input.maxSelections,maxSelections=typeof maxSelectionsRaw==`number`&&Number.isFinite(maxSelectionsRaw)?Math.floor(maxSelectionsRaw):1;if(maxSelections<1)throw Error(`maxSelections must be at least 1`);if(maxSelections>cleaned.length)throw Error(`maxSelections cannot exceed option count`);let durationSecondsRaw=input.durationSeconds,durationSeconds=typeof durationSecondsRaw==`number`&&Number.isFinite(durationSecondsRaw)?Math.floor(durationSecondsRaw):void 0;if(durationSeconds!==void 0&&durationSeconds<1)throw Error(`durationSeconds must be at least 1`);let durationRaw=input.durationHours,durationHours=typeof durationRaw==`number`&&Number.isFinite(durationRaw)?Math.floor(durationRaw):void 0;if(durationHours!==void 0&&durationHours<1)throw Error(`durationHours must be at least 1`);if(durationSeconds!==void 0&&durationHours!==void 0)throw Error(`durationSeconds and durationHours are mutually exclusive`);return{question,options:cleaned,maxSelections,durationSeconds,durationHours}}function normalizePollDurationHours(value,options){let base=typeof value==`number`&&Number.isFinite(value)?Math.floor(value):options.defaultHours;return Math.min(Math.max(base,1),options.maxHours)}const MARKDOWN_STYLE_MARKERS={bold:{open:`**`,close:`**`},italic:{open:`_`,close:`_`},strikethrough:{open:`~~`,close:`~~`},code:{open:"`",close:"`"},code_block:{open:"```\n",close:"```"}};function convertMarkdownTables(markdown,mode){if(!markdown||mode===`off`)return markdown;let{ir,hasTables}=markdownToIRWithMeta(markdown,{linkify:!1,autolink:!1,headingStyle:`none`,blockquotePrefix:``,tableMode:mode});return hasTables?renderMarkdownWithMarkers(ir,{styleMarkers:MARKDOWN_STYLE_MARKERS,escapeText:text=>text,buildLink:(link,text)=>{let href=link.href.trim();return!href||!text.slice(link.start,link.end)?null:{start:link.start,end:link.end,open:`[`,close:`](${href})`}}}):markdown}const listeners=new Map;function resolveWebAccountId(accountId){return(accountId??``).trim()||DEFAULT_ACCOUNT_ID}function requireActiveWebListener(accountId){let id=resolveWebAccountId(accountId),listener=listeners.get(id)??null;if(!listener)throw Error(`No active WhatsApp Web listener (account: ${id}). Start the gateway, then link WhatsApp with: ${formatCliCommand(`builderforce channels login --channel whatsapp --account ${id}`)}.`);return{accountId:id,listener}}function setActiveWebListener(accountIdOrListener,maybeListener){let{accountId,listener}=typeof accountIdOrListener==`string`?{accountId:accountIdOrListener,listener:maybeListener??null}:{accountId:DEFAULT_ACCOUNT_ID,listener:accountIdOrListener??null},id=resolveWebAccountId(accountId);listener?listeners.set(id,listener):listeners.delete(id)}function getActiveWebListener(accountId){let id=resolveWebAccountId(accountId);return listeners.get(id)??null}export{normalizePollDurationHours as a,convertMarkdownTables as i,requireActiveWebListener as n,normalizePollInput as o,setActiveWebListener as r,getActiveWebListener as t};
|
|
@@ -47,6 +47,9 @@ export declare class WorkflowTelemetryService {
|
|
|
47
47
|
private agentNodeId;
|
|
48
48
|
private apiUrl;
|
|
49
49
|
private apiKey;
|
|
50
|
+
/** Spans waiting for the next batched OTel POST. */
|
|
51
|
+
private otelBuffer;
|
|
52
|
+
private otelTimer;
|
|
50
53
|
/**
|
|
51
54
|
* Active trace ID for the current workflow (W3C-compatible, 32 hex chars).
|
|
52
55
|
* Set when a workflow starts, cleared when it ends.
|
|
@@ -107,8 +110,14 @@ export declare class WorkflowTelemetryService {
|
|
|
107
110
|
* task.fail → PATCH /api/workflows/:wfId/tasks/:tid (status=failed)
|
|
108
111
|
*/
|
|
109
112
|
private syncToBuilderforce;
|
|
110
|
-
/**
|
|
113
|
+
/**
|
|
114
|
+
* Queue a span for the Builderforce OTel ingest endpoint. Spans leave in ONE POST
|
|
115
|
+
* (an array) every {@link OTEL_FLUSH_SPANS} spans or {@link OTEL_FLUSH_MS}, instead of
|
|
116
|
+
* one request per span — each request is a database write on the server.
|
|
117
|
+
*/
|
|
111
118
|
private forwardToOtelProxy;
|
|
119
|
+
/** Send every queued span now (fire-and-forget). Also called at shutdown. */
|
|
120
|
+
flushOtelSpans(): void;
|
|
112
121
|
private spanToRelayEvent;
|
|
113
122
|
}
|
|
114
123
|
/** Process-wide singleton. Use the module-level shims below to interact with it. */
|
|
@@ -121,6 +130,8 @@ export declare function initTelemetry(opts: {
|
|
|
121
130
|
linkApiUrl?: string | null;
|
|
122
131
|
linkApiKey?: string | null;
|
|
123
132
|
}): void;
|
|
133
|
+
/** Send any batched spans now — for shutdown paths that would otherwise drop the last <2 s. */
|
|
134
|
+
export declare function flushTelemetry(): void;
|
|
124
135
|
export declare function emitSpan(span: Record<string, unknown>): void;
|
|
125
136
|
export declare function emitWorkflowStart(workflowId: string, description?: string): void;
|
|
126
137
|
export declare function emitWorkflowEnd(workflowId: string, failed: boolean): void;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{_ as isSubagentSessionKey,g as isCronSessionKey,l as normalizeAgentId,n as DEFAULT_AGENT_ID,v as parseAgentSessionKey}from"./session-key-5J69DULS.js";import{B as info,G as shouldLogVerbose,O as pathExists,Q as getLogger,U as logVerboseConsole,et as onLoggerReset,j as resolveUserPath,q as warn,z as danger}from"./registry-CZHRcH-q.js";import{s as resolveStateDir,u as resolveRequiredHomeDir}from"./paths-Cb8zTlyG.js";import{i as defaultRuntime,t as createSubsystemLogger}from"./subsystem-D0Ril4rt.js";import path from"node:path";import fs from"node:fs";import os from"node:os";import{fileURLToPath}from"node:url";import fs$1 from"node:fs/promises";import{promisify}from"node:util";import{execFile,spawn}from"node:child_process";const subsystemColonRe=/^([a-z][a-z0-9-]{1,30}):\s+(.*)$/i,subsystemBracketRe=/^\[([a-z][a-z0-9_.:/-]{0,40})\]\s*(.*)$/i;function parseSubsystem(message){let colonMatch=message.match(subsystemColonRe);if(colonMatch)return{subsystem:colonMatch[1],rest:colonMatch[2]};let bracketMatch=message.match(subsystemBracketRe);return bracketMatch?{subsystem:bracketMatch[1],rest:bracketMatch[2]}:null}const loggerCache=new Map;function getSubsystem(name){let logger=loggerCache.get(name);return logger||(logger=createSubsystemLogger(name),loggerCache.set(name,logger)),logger}function resetLoggerCache(){loggerCache.clear()}onLoggerReset(resetLoggerCache);function logInfo(message,runtime=defaultRuntime){if(runtime!==defaultRuntime){runtime.log(info(message)),getLogger().info(message);return}let parsed=parseSubsystem(message);parsed?getSubsystem(parsed.subsystem).info(parsed.rest):getSubsystem(`general`).info(message)}function logWarn(message,runtime=defaultRuntime){if(runtime!==defaultRuntime){runtime.log(warn(message)),getLogger().warn(message);return}let parsed=parseSubsystem(message);parsed?getSubsystem(parsed.subsystem).warn(parsed.rest):getSubsystem(`general`).warn(message)}function logError(message,runtime=defaultRuntime){if(runtime!==defaultRuntime){runtime.error(danger(message)),getLogger().error(message);return}let parsed=parseSubsystem(message);parsed?getSubsystem(parsed.subsystem).error(parsed.rest):getSubsystem(`general`).error(message)}function logDebug(message){getLogger().debug(message),logVerboseConsole(message)}const DEFAULT_RETRY_CODES=[`EBADF`];function resolveCommandStdio(params){return[params.hasInput?`pipe`:params.preferInherit?`inherit`:`pipe`,`pipe`,`pipe`]}function shouldRetry(err,codes){let code=err&&typeof err==`object`&&`code`in err?String(err.code):``;return code.length>0&&codes.includes(code)}async function spawnAndWaitForSpawn(spawnImpl,argv,options){let child=spawnImpl(argv[0],argv.slice(1),options);return await new Promise((resolve,reject)=>{let settled=!1,cleanup=()=>{child.removeListener(`error`,onError),child.removeListener(`spawn`,onSpawn)},finishResolve=()=>{settled||(settled=!0,cleanup(),resolve(child))},onError=err=>{settled||(settled=!0,cleanup(),reject(err))},onSpawn=()=>{finishResolve()};child.once(`error`,onError),child.once(`spawn`,onSpawn),process.nextTick(()=>{typeof child.pid==`number`&&finishResolve()})})}async function spawnWithFallback(params){let spawnImpl=params.spawnImpl??spawn,retryCodes=params.retryCodes??DEFAULT_RETRY_CODES,baseOptions={...params.options},fallbacks=params.fallbacks??[],attempts=[{options:baseOptions},...fallbacks.map(fallback=>({label:fallback.label,options:{...baseOptions,...fallback.options}}))],lastError;for(let index=0;index<attempts.length;index+=1){let attempt=attempts[index];try{return{child:await spawnAndWaitForSpawn(spawnImpl,params.argv,attempt.options),usedFallback:index>0,fallbackLabel:attempt.label}}catch(err){lastError=err;let nextFallback=fallbacks[index];if(!nextFallback||!shouldRetry(err,retryCodes))throw err;params.onFallback?.(err,nextFallback)}}throw lastError}const execFileAsync=promisify(execFile);function resolveCommand(command){if(process.platform!==`win32`)return command;let basename=path.basename(command).toLowerCase();return path.extname(basename)?command:[`npm`,`pnpm`,`yarn`,`npx`].includes(basename)?`${command}.cmd`:command}function shouldSpawnWithShell(params){return!1}async function runExec(command,args,opts=1e4){let options=typeof opts==`number`?{timeout:opts,encoding:`utf8`}:{timeout:opts.timeoutMs,maxBuffer:opts.maxBuffer,encoding:`utf8`};try{let{stdout,stderr}=await execFileAsync(resolveCommand(command),args,options);return shouldLogVerbose()&&(stdout.trim()&&logDebug(stdout.trim()),stderr.trim()&&logError(stderr.trim())),{stdout,stderr}}catch(err){throw shouldLogVerbose()&&logError(danger(`Command failed: ${command} ${args.join(` `)}`)),err}}async function runCommandWithTimeout(argv,optionsOrTimeout){let options=typeof optionsOrTimeout==`number`?{timeoutMs:optionsOrTimeout}:optionsOrTimeout,{timeoutMs,cwd,input,env,noOutputTimeoutMs}=options,{windowsVerbatimArguments}=options,hasInput=input!==void 0,shouldSuppressNpmFund=(()=>{let cmd=path.basename(argv[0]??``);return cmd===`npm`||cmd===`npm.cmd`||cmd===`npm.exe`?!0:cmd===`node`||cmd===`node.exe`?(argv[1]??``).includes(`npm-cli.js`):!1})(),mergedEnv=env?{...process.env,...env}:{...process.env},resolvedEnv=Object.fromEntries(Object.entries(mergedEnv).filter(([,value])=>value!==void 0).map(([key,value])=>[key,String(value)]));shouldSuppressNpmFund&&(resolvedEnv.NPM_CONFIG_FUND??=`false`,resolvedEnv.npm_config_fund??=`false`);let stdio=resolveCommandStdio({hasInput,preferInherit:!0}),resolvedCommand=resolveCommand(argv[0]??``),child=spawn(resolvedCommand,argv.slice(1),{stdio,cwd,env:resolvedEnv,windowsVerbatimArguments,...shouldSpawnWithShell({resolvedCommand,platform:process.platform})?{shell:!0}:{}});return await new Promise((resolve,reject)=>{let stdout=``,stderr=``,settled=!1,timedOut=!1,noOutputTimedOut=!1,noOutputTimer=null,shouldTrackOutputTimeout=typeof noOutputTimeoutMs==`number`&&Number.isFinite(noOutputTimeoutMs)&&noOutputTimeoutMs>0,clearNoOutputTimer=()=>{noOutputTimer&&=(clearTimeout(noOutputTimer),null)},armNoOutputTimer=()=>{!shouldTrackOutputTimeout||settled||(clearNoOutputTimer(),noOutputTimer=setTimeout(()=>{settled||(noOutputTimedOut=!0,typeof child.kill==`function`&&child.kill(`SIGKILL`))},Math.floor(noOutputTimeoutMs)))},timer=setTimeout(()=>{timedOut=!0,typeof child.kill==`function`&&child.kill(`SIGKILL`)},timeoutMs);armNoOutputTimer(),hasInput&&child.stdin&&(child.stdin.write(input??``),child.stdin.end()),child.stdout?.on(`data`,d=>{stdout+=d.toString(),armNoOutputTimer()}),child.stderr?.on(`data`,d=>{stderr+=d.toString(),armNoOutputTimer()}),child.on(`error`,err=>{settled||(settled=!0,clearTimeout(timer),clearNoOutputTimer(),reject(err))}),child.on(`close`,(code,signal)=>{if(settled)return;settled=!0,clearTimeout(timer),clearNoOutputTimer();let termination=noOutputTimedOut?`no-output-timeout`:timedOut?`timeout`:signal==null?`exit`:`signal`;resolve({pid:child.pid??void 0,stdout,stderr,code,signal,killed:child.killed,termination,noOutputTimedOut})})})}function normalizeSkillFilter(skillFilter){if(skillFilter!==void 0)return skillFilter.map(entry=>String(entry).trim()).filter(Boolean)}const CORE_PACKAGE_NAMES=[`@seanhogg/builderforce-agents`,...[`builderforce`]],CORE_PACKAGE_NAME_SET=new Set(CORE_PACKAGE_NAMES);function isCorePackageName(name){return!!(name&&CORE_PACKAGE_NAME_SET.has(name))}async function readPackageName(dir){try{let raw=await fs$1.readFile(path.join(dir,`package.json`),`utf-8`),parsed=JSON.parse(raw);return typeof parsed.name==`string`?parsed.name:null}catch{return null}}function readPackageNameSync(dir){try{let raw=fs.readFileSync(path.join(dir,`package.json`),`utf-8`),parsed=JSON.parse(raw);return typeof parsed.name==`string`?parsed.name:null}catch{return null}}async function findPackageRoot(startDir,maxDepth=12){let current=path.resolve(startDir);for(let i=0;i<maxDepth;i+=1){if(isCorePackageName(await readPackageName(current)))return current;let parent=path.dirname(current);if(parent===current)break;current=parent}return null}function findPackageRootSync(startDir,maxDepth=12){let current=path.resolve(startDir);for(let i=0;i<maxDepth;i+=1){if(isCorePackageName(readPackageNameSync(current)))return current;let parent=path.dirname(current);if(parent===current)break;current=parent}return null}function candidateDirsFromArgv1(argv1){let normalized=path.resolve(argv1),candidates=[path.dirname(normalized)];try{let resolved=fs.realpathSync(normalized);resolved!==normalized&&candidates.push(path.dirname(resolved))}catch{}let parts=normalized.split(path.sep),binIndex=parts.lastIndexOf(`.bin`);if(binIndex>0&&parts[binIndex-1]===`node_modules`){let binName=path.basename(normalized),nodeModulesDir=parts.slice(0,binIndex).join(path.sep);candidates.push(path.join(nodeModulesDir,binName))}return candidates}async function resolveBuilderForceAgentsPackageRoot(opts){for(let candidate of buildCandidates(opts)){let found=await findPackageRoot(candidate);if(found)return found}return null}function resolveBuilderForceAgentsPackageRootSync(opts){for(let candidate of buildCandidates(opts)){let found=findPackageRootSync(candidate);if(found)return found}return null}function buildCandidates(opts){let candidates=[];return opts.moduleUrl&&candidates.push(path.dirname(fileURLToPath(opts.moduleUrl))),opts.argv1&&candidates.push(...candidateDirsFromArgv1(opts.argv1)),opts.cwd&&candidates.push(opts.cwd),candidates}const FALLBACK_TEMPLATE_DIR=path.resolve(path.dirname(fileURLToPath(import.meta.url)),`../../foundation`);let cachedTemplateDir,resolvingTemplateDir;async function resolveWorkspaceTemplateDir(opts){if(cachedTemplateDir)return cachedTemplateDir;if(resolvingTemplateDir)return resolvingTemplateDir;resolvingTemplateDir=(async()=>{let moduleUrl=opts?.moduleUrl??import.meta.url,argv1=opts?.argv1??process.argv[1],cwd=opts?.cwd??process.cwd(),packageRoot=await resolveBuilderForceAgentsPackageRoot({moduleUrl,argv1,cwd}),candidates=[packageRoot?path.join(packageRoot,`foundation`):null,cwd?path.resolve(cwd,`foundation`):null,FALLBACK_TEMPLATE_DIR].filter(Boolean);for(let candidate of candidates)if(await pathExists(candidate))return cachedTemplateDir=candidate,candidate;return cachedTemplateDir=candidates[0]??FALLBACK_TEMPLATE_DIR,cachedTemplateDir})();try{return await resolvingTemplateDir}finally{resolvingTemplateDir=void 0}}function resolveDefaultAgentWorkspaceDir(env=process.env,homedir=os.homedir){let home=resolveRequiredHomeDir(env,homedir),profile=env.BUILDERFORCE_AGENTS_PROFILE?.trim();return profile&&profile.toLowerCase()!==`default`?path.join(home,`.builderforce`,`workspace-${profile}`):path.join(home,`.builderforce`,`workspace`)}const DEFAULT_AGENT_WORKSPACE_DIR=resolveDefaultAgentWorkspaceDir(),DEFAULT_AGENTS_FILENAME=`AGENTS.md`,DEFAULT_SOUL_FILENAME=`SOUL.md`,DEFAULT_TOOLS_FILENAME=`TOOLS.md`,DEFAULT_IDENTITY_FILENAME=`IDENTITY.md`,DEFAULT_USER_FILENAME=`USER.md`,DEFAULT_HEARTBEAT_FILENAME=`HEARTBEAT.md`,DEFAULT_BOOTSTRAP_FILENAME=`BOOTSTRAP.md`,EMBEDDED_WORKSPACE_TEMPLATES={[DEFAULT_AGENTS_FILENAME]:`# AGENTS
|
|
1
|
+
import{_ as isSubagentSessionKey,g as isCronSessionKey,l as normalizeAgentId,n as DEFAULT_AGENT_ID,v as parseAgentSessionKey}from"./session-key-5J69DULS.js";import{B as info,G as shouldLogVerbose,O as pathExists,Q as getLogger,U as logVerboseConsole,et as onLoggerReset,j as resolveUserPath,q as warn,z as danger}from"./registry-DJq2Cvo9.js";import{s as resolveStateDir,u as resolveRequiredHomeDir}from"./paths-Cb8zTlyG.js";import{i as defaultRuntime,t as createSubsystemLogger}from"./subsystem-COTa5Ly_.js";import path from"node:path";import fs from"node:fs";import os from"node:os";import{fileURLToPath}from"node:url";import fs$1 from"node:fs/promises";import{promisify}from"node:util";import{execFile,spawn}from"node:child_process";const subsystemColonRe=/^([a-z][a-z0-9-]{1,30}):\s+(.*)$/i,subsystemBracketRe=/^\[([a-z][a-z0-9_.:/-]{0,40})\]\s*(.*)$/i;function parseSubsystem(message){let colonMatch=message.match(subsystemColonRe);if(colonMatch)return{subsystem:colonMatch[1],rest:colonMatch[2]};let bracketMatch=message.match(subsystemBracketRe);return bracketMatch?{subsystem:bracketMatch[1],rest:bracketMatch[2]}:null}const loggerCache=new Map;function getSubsystem(name){let logger=loggerCache.get(name);return logger||(logger=createSubsystemLogger(name),loggerCache.set(name,logger)),logger}function resetLoggerCache(){loggerCache.clear()}onLoggerReset(resetLoggerCache);function logInfo(message,runtime=defaultRuntime){if(runtime!==defaultRuntime){runtime.log(info(message)),getLogger().info(message);return}let parsed=parseSubsystem(message);parsed?getSubsystem(parsed.subsystem).info(parsed.rest):getSubsystem(`general`).info(message)}function logWarn(message,runtime=defaultRuntime){if(runtime!==defaultRuntime){runtime.log(warn(message)),getLogger().warn(message);return}let parsed=parseSubsystem(message);parsed?getSubsystem(parsed.subsystem).warn(parsed.rest):getSubsystem(`general`).warn(message)}function logError(message,runtime=defaultRuntime){if(runtime!==defaultRuntime){runtime.error(danger(message)),getLogger().error(message);return}let parsed=parseSubsystem(message);parsed?getSubsystem(parsed.subsystem).error(parsed.rest):getSubsystem(`general`).error(message)}function logDebug(message){getLogger().debug(message),logVerboseConsole(message)}const DEFAULT_RETRY_CODES=[`EBADF`];function resolveCommandStdio(params){return[params.hasInput?`pipe`:params.preferInherit?`inherit`:`pipe`,`pipe`,`pipe`]}function shouldRetry(err,codes){let code=err&&typeof err==`object`&&`code`in err?String(err.code):``;return code.length>0&&codes.includes(code)}async function spawnAndWaitForSpawn(spawnImpl,argv,options){let child=spawnImpl(argv[0],argv.slice(1),options);return await new Promise((resolve,reject)=>{let settled=!1,cleanup=()=>{child.removeListener(`error`,onError),child.removeListener(`spawn`,onSpawn)},finishResolve=()=>{settled||(settled=!0,cleanup(),resolve(child))},onError=err=>{settled||(settled=!0,cleanup(),reject(err))},onSpawn=()=>{finishResolve()};child.once(`error`,onError),child.once(`spawn`,onSpawn),process.nextTick(()=>{typeof child.pid==`number`&&finishResolve()})})}async function spawnWithFallback(params){let spawnImpl=params.spawnImpl??spawn,retryCodes=params.retryCodes??DEFAULT_RETRY_CODES,baseOptions={...params.options},fallbacks=params.fallbacks??[],attempts=[{options:baseOptions},...fallbacks.map(fallback=>({label:fallback.label,options:{...baseOptions,...fallback.options}}))],lastError;for(let index=0;index<attempts.length;index+=1){let attempt=attempts[index];try{return{child:await spawnAndWaitForSpawn(spawnImpl,params.argv,attempt.options),usedFallback:index>0,fallbackLabel:attempt.label}}catch(err){lastError=err;let nextFallback=fallbacks[index];if(!nextFallback||!shouldRetry(err,retryCodes))throw err;params.onFallback?.(err,nextFallback)}}throw lastError}const execFileAsync=promisify(execFile);function resolveCommand(command){if(process.platform!==`win32`)return command;let basename=path.basename(command).toLowerCase();return path.extname(basename)?command:[`npm`,`pnpm`,`yarn`,`npx`].includes(basename)?`${command}.cmd`:command}function shouldSpawnWithShell(params){return!1}async function runExec(command,args,opts=1e4){let options=typeof opts==`number`?{timeout:opts,encoding:`utf8`}:{timeout:opts.timeoutMs,maxBuffer:opts.maxBuffer,encoding:`utf8`};try{let{stdout,stderr}=await execFileAsync(resolveCommand(command),args,options);return shouldLogVerbose()&&(stdout.trim()&&logDebug(stdout.trim()),stderr.trim()&&logError(stderr.trim())),{stdout,stderr}}catch(err){throw shouldLogVerbose()&&logError(danger(`Command failed: ${command} ${args.join(` `)}`)),err}}async function runCommandWithTimeout(argv,optionsOrTimeout){let options=typeof optionsOrTimeout==`number`?{timeoutMs:optionsOrTimeout}:optionsOrTimeout,{timeoutMs,cwd,input,env,noOutputTimeoutMs}=options,{windowsVerbatimArguments}=options,hasInput=input!==void 0,shouldSuppressNpmFund=(()=>{let cmd=path.basename(argv[0]??``);return cmd===`npm`||cmd===`npm.cmd`||cmd===`npm.exe`?!0:cmd===`node`||cmd===`node.exe`?(argv[1]??``).includes(`npm-cli.js`):!1})(),mergedEnv=env?{...process.env,...env}:{...process.env},resolvedEnv=Object.fromEntries(Object.entries(mergedEnv).filter(([,value])=>value!==void 0).map(([key,value])=>[key,String(value)]));shouldSuppressNpmFund&&(resolvedEnv.NPM_CONFIG_FUND??=`false`,resolvedEnv.npm_config_fund??=`false`);let stdio=resolveCommandStdio({hasInput,preferInherit:!0}),resolvedCommand=resolveCommand(argv[0]??``),child=spawn(resolvedCommand,argv.slice(1),{stdio,cwd,env:resolvedEnv,windowsVerbatimArguments,...shouldSpawnWithShell({resolvedCommand,platform:process.platform})?{shell:!0}:{}});return await new Promise((resolve,reject)=>{let stdout=``,stderr=``,settled=!1,timedOut=!1,noOutputTimedOut=!1,noOutputTimer=null,shouldTrackOutputTimeout=typeof noOutputTimeoutMs==`number`&&Number.isFinite(noOutputTimeoutMs)&&noOutputTimeoutMs>0,clearNoOutputTimer=()=>{noOutputTimer&&=(clearTimeout(noOutputTimer),null)},armNoOutputTimer=()=>{!shouldTrackOutputTimeout||settled||(clearNoOutputTimer(),noOutputTimer=setTimeout(()=>{settled||(noOutputTimedOut=!0,typeof child.kill==`function`&&child.kill(`SIGKILL`))},Math.floor(noOutputTimeoutMs)))},timer=setTimeout(()=>{timedOut=!0,typeof child.kill==`function`&&child.kill(`SIGKILL`)},timeoutMs);armNoOutputTimer(),hasInput&&child.stdin&&(child.stdin.write(input??``),child.stdin.end()),child.stdout?.on(`data`,d=>{stdout+=d.toString(),armNoOutputTimer()}),child.stderr?.on(`data`,d=>{stderr+=d.toString(),armNoOutputTimer()}),child.on(`error`,err=>{settled||(settled=!0,clearTimeout(timer),clearNoOutputTimer(),reject(err))}),child.on(`close`,(code,signal)=>{if(settled)return;settled=!0,clearTimeout(timer),clearNoOutputTimer();let termination=noOutputTimedOut?`no-output-timeout`:timedOut?`timeout`:signal==null?`exit`:`signal`;resolve({pid:child.pid??void 0,stdout,stderr,code,signal,killed:child.killed,termination,noOutputTimedOut})})})}function normalizeSkillFilter(skillFilter){if(skillFilter!==void 0)return skillFilter.map(entry=>String(entry).trim()).filter(Boolean)}const CORE_PACKAGE_NAMES=[`@seanhogg/builderforce-agents`,...[`builderforce`]],CORE_PACKAGE_NAME_SET=new Set(CORE_PACKAGE_NAMES);function isCorePackageName(name){return!!(name&&CORE_PACKAGE_NAME_SET.has(name))}async function readPackageName(dir){try{let raw=await fs$1.readFile(path.join(dir,`package.json`),`utf-8`),parsed=JSON.parse(raw);return typeof parsed.name==`string`?parsed.name:null}catch{return null}}function readPackageNameSync(dir){try{let raw=fs.readFileSync(path.join(dir,`package.json`),`utf-8`),parsed=JSON.parse(raw);return typeof parsed.name==`string`?parsed.name:null}catch{return null}}async function findPackageRoot(startDir,maxDepth=12){let current=path.resolve(startDir);for(let i=0;i<maxDepth;i+=1){if(isCorePackageName(await readPackageName(current)))return current;let parent=path.dirname(current);if(parent===current)break;current=parent}return null}function findPackageRootSync(startDir,maxDepth=12){let current=path.resolve(startDir);for(let i=0;i<maxDepth;i+=1){if(isCorePackageName(readPackageNameSync(current)))return current;let parent=path.dirname(current);if(parent===current)break;current=parent}return null}function candidateDirsFromArgv1(argv1){let normalized=path.resolve(argv1),candidates=[path.dirname(normalized)];try{let resolved=fs.realpathSync(normalized);resolved!==normalized&&candidates.push(path.dirname(resolved))}catch{}let parts=normalized.split(path.sep),binIndex=parts.lastIndexOf(`.bin`);if(binIndex>0&&parts[binIndex-1]===`node_modules`){let binName=path.basename(normalized),nodeModulesDir=parts.slice(0,binIndex).join(path.sep);candidates.push(path.join(nodeModulesDir,binName))}return candidates}async function resolveBuilderForceAgentsPackageRoot(opts){for(let candidate of buildCandidates(opts)){let found=await findPackageRoot(candidate);if(found)return found}return null}function resolveBuilderForceAgentsPackageRootSync(opts){for(let candidate of buildCandidates(opts)){let found=findPackageRootSync(candidate);if(found)return found}return null}function buildCandidates(opts){let candidates=[];return opts.moduleUrl&&candidates.push(path.dirname(fileURLToPath(opts.moduleUrl))),opts.argv1&&candidates.push(...candidateDirsFromArgv1(opts.argv1)),opts.cwd&&candidates.push(opts.cwd),candidates}const FALLBACK_TEMPLATE_DIR=path.resolve(path.dirname(fileURLToPath(import.meta.url)),`../../foundation`);let cachedTemplateDir,resolvingTemplateDir;async function resolveWorkspaceTemplateDir(opts){if(cachedTemplateDir)return cachedTemplateDir;if(resolvingTemplateDir)return resolvingTemplateDir;resolvingTemplateDir=(async()=>{let moduleUrl=opts?.moduleUrl??import.meta.url,argv1=opts?.argv1??process.argv[1],cwd=opts?.cwd??process.cwd(),packageRoot=await resolveBuilderForceAgentsPackageRoot({moduleUrl,argv1,cwd}),candidates=[packageRoot?path.join(packageRoot,`foundation`):null,cwd?path.resolve(cwd,`foundation`):null,FALLBACK_TEMPLATE_DIR].filter(Boolean);for(let candidate of candidates)if(await pathExists(candidate))return cachedTemplateDir=candidate,candidate;return cachedTemplateDir=candidates[0]??FALLBACK_TEMPLATE_DIR,cachedTemplateDir})();try{return await resolvingTemplateDir}finally{resolvingTemplateDir=void 0}}function resolveDefaultAgentWorkspaceDir(env=process.env,homedir=os.homedir){let home=resolveRequiredHomeDir(env,homedir),profile=env.BUILDERFORCE_AGENTS_PROFILE?.trim();return profile&&profile.toLowerCase()!==`default`?path.join(home,`.builderforce`,`workspace-${profile}`):path.join(home,`.builderforce`,`workspace`)}const DEFAULT_AGENT_WORKSPACE_DIR=resolveDefaultAgentWorkspaceDir(),DEFAULT_AGENTS_FILENAME=`AGENTS.md`,DEFAULT_SOUL_FILENAME=`SOUL.md`,DEFAULT_TOOLS_FILENAME=`TOOLS.md`,DEFAULT_IDENTITY_FILENAME=`IDENTITY.md`,DEFAULT_USER_FILENAME=`USER.md`,DEFAULT_HEARTBEAT_FILENAME=`HEARTBEAT.md`,DEFAULT_BOOTSTRAP_FILENAME=`BOOTSTRAP.md`,EMBEDDED_WORKSPACE_TEMPLATES={[DEFAULT_AGENTS_FILENAME]:`# AGENTS
|
|
2
2
|
|
|
3
3
|
Project rules and collaboration guidelines for this workspace.
|
|
4
4
|
`,[DEFAULT_SOUL_FILENAME]:`# SOUL
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{l as normalizeProviderId}from"./model-selection-
|
|
1
|
+
import{l as normalizeProviderId}from"./model-selection-K82MAGlL.js";import{n as formatErrorMessage}from"./errors-L3rugjUL.js";const SESSION_TRANSCRIPT_LISTENERS=new Set;function onSessionTranscriptUpdate(listener){return SESSION_TRANSCRIPT_LISTENERS.add(listener),()=>{SESSION_TRANSCRIPT_LISTENERS.delete(listener)}}function emitSessionTranscriptUpdate(sessionFile){let trimmed=sessionFile.trim();if(!trimmed)return;let update={sessionFile:trimmed};for(let listener of SESSION_TRANSCRIPT_LISTENERS)listener(update)}function parseGeminiAuth(apiKey){if(apiKey.startsWith(`{`))try{let parsed=JSON.parse(apiKey);if(typeof parsed.token==`string`&&parsed.token)return{headers:{Authorization:`Bearer ${parsed.token}`,"Content-Type":`application/json`}}}catch{}return{headers:{"x-goog-api-key":apiKey,"Content-Type":`application/json`}}}const KEY_SPLIT_RE=/[\s,;]+/g,GOOGLE_LIVE_SINGLE_KEY=`BUILDERFORCE_AGENTS_LIVE_GEMINI_KEY`,PROVIDER_PREFIX_OVERRIDES={google:`GEMINI`,"google-vertex":`GEMINI`},PROVIDER_API_KEY_CONFIG={anthropic:{liveSingle:`BUILDERFORCE_AGENTS_LIVE_ANTHROPIC_KEY`,listVar:`BUILDERFORCE_AGENTS_LIVE_ANTHROPIC_KEYS`,primaryVar:`ANTHROPIC_API_KEY`,prefixedVar:`ANTHROPIC_API_KEY_`},google:{liveSingle:GOOGLE_LIVE_SINGLE_KEY,listVar:`GEMINI_API_KEYS`,primaryVar:`GEMINI_API_KEY`,prefixedVar:`GEMINI_API_KEY_`},"google-vertex":{liveSingle:GOOGLE_LIVE_SINGLE_KEY,listVar:`GEMINI_API_KEYS`,primaryVar:`GEMINI_API_KEY`,prefixedVar:`GEMINI_API_KEY_`},openai:{liveSingle:`BUILDERFORCE_AGENTS_LIVE_OPENAI_KEY`,listVar:`OPENAI_API_KEYS`,primaryVar:`OPENAI_API_KEY`,prefixedVar:`OPENAI_API_KEY_`}};function parseKeyList(raw){return raw?raw.split(KEY_SPLIT_RE).map(value=>value.trim()).filter(Boolean):[]}function collectEnvPrefixedKeys(prefix){let keys=[];for(let[name,value]of Object.entries(process.env)){if(!name.startsWith(prefix))continue;let trimmed=value?.trim();trimmed&&keys.push(trimmed)}return keys}function resolveProviderApiKeyConfig(provider){let normalized=normalizeProviderId(provider),custom=PROVIDER_API_KEY_CONFIG[normalized],base=PROVIDER_PREFIX_OVERRIDES[normalized]??normalized.toUpperCase().replace(/-/g,`_`),liveSingle=custom?.liveSingle??`BUILDERFORCE_AGENTS_LIVE_${base}_KEY`,listVar=custom?.listVar??`${base}_API_KEYS`,primaryVar=custom?.primaryVar??`${base}_API_KEY`,prefixedVar=custom?.prefixedVar??`${base}_API_KEY_`;return normalized===`google`||normalized===`google-vertex`?{liveSingle,listVar,primaryVar,prefixedVar,fallbackVars:[`GOOGLE_API_KEY`]}:{liveSingle,listVar,primaryVar,prefixedVar,fallbackVars:[]}}function collectProviderApiKeys(provider){let config=resolveProviderApiKeyConfig(provider),forcedSingle=config.liveSingle?process.env[config.liveSingle]?.trim():void 0;if(forcedSingle)return[forcedSingle];let fromList=parseKeyList(config.listVar?process.env[config.listVar]:void 0),primary=config.primaryVar?process.env[config.primaryVar]?.trim():void 0,fromPrefixed=config.prefixedVar?collectEnvPrefixedKeys(config.prefixedVar):[],fallback=config.fallbackVars.map(envVar=>process.env[envVar]?.trim()).filter(Boolean),seen=new Set,add=value=>{value&&(seen.has(value)||seen.add(value))};for(let value of fromList)add(value);add(primary);for(let value of fromPrefixed)add(value);for(let value of fallback)add(value);return Array.from(seen)}function isApiKeyRateLimitError(message){let lower=message.toLowerCase();return!!(lower.includes(`rate_limit`)||lower.includes(`rate limit`)||lower.includes(`429`)||lower.includes(`quota exceeded`)||lower.includes(`quota_exceeded`)||lower.includes(`resource exhausted`)||lower.includes(`resource_exhausted`)||lower.includes(`too many requests`))}function dedupeApiKeys(raw){let seen=new Set,keys=[];for(let value of raw){let apiKey=value.trim();!apiKey||seen.has(apiKey)||(seen.add(apiKey),keys.push(apiKey))}return keys}function collectProviderApiKeysForExecution(params){let{primaryApiKey,provider}=params;return dedupeApiKeys([primaryApiKey?.trim()??``,...collectProviderApiKeys(provider)])}async function executeWithApiKeyRotation(params){let keys=dedupeApiKeys(params.apiKeys);if(keys.length===0)throw Error(`No API keys configured for provider "${params.provider}".`);let lastError;for(let attempt=0;attempt<keys.length;attempt+=1){let apiKey=keys[attempt];try{return await params.execute(apiKey)}catch(error){lastError=error;let message=formatErrorMessage(error);if(!(params.shouldRetry?params.shouldRetry({apiKey,error,attempt,message}):isApiKeyRateLimitError(message))||attempt+1>=keys.length)break;params.onRetry?.({apiKey,error,attempt,message})}}throw lastError===void 0?Error(`Failed to run API request for ${params.provider}.`):lastError}export{onSessionTranscriptUpdate as a,emitSessionTranscriptUpdate as i,executeWithApiKeyRotation as n,parseGeminiAuth as r,collectProviderApiKeysForExecution as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import"./session-key-5J69DULS.js";import"./accounts-
|
|
1
|
+
import"./session-key-5J69DULS.js";import"./accounts-BwreSNAR.js";import{G as shouldLogVerbose,H as logVerbose}from"./registry-DJq2Cvo9.js";import"./paths-Cb8zTlyG.js";import"./model-selection-K82MAGlL.js";import"./config-v1EU9Ll8.js";import"./fetch-DH0Y8iyO.js";import"./subsystem-COTa5Ly_.js";import"./agent-scope-BQByW0cD.js";import"./tool-images-DSpchb4x.js";import{a as runCapability,n as createMediaAttachmentCache,o as isAudioAttachment,r as normalizeMediaAttachments,t as buildProviderRegistry}from"./runner-CYkuO7Fh.js";import"./redact-Bv8wnIZm.js";import"./errors-L3rugjUL.js";import"./chrome-SOXFIkUM.js";import"./command-format-CAX9XFjI.js";import"./plugins-CaUOZBVb.js";import"./bindings-CDEzl4kl.js";import"./message-channel-sBPQc_-T.js";import"./src-BcDibXPq.js";import"./paths-DtbnCdO7.js";import"./api-key-rotation-7YdImWrh.js";import"./model-catalog-cXsza5GU.js";async function transcribeFirstAudio(params){let{ctx,cfg}=params,audioConfig=cfg.tools?.media?.audio;if(!audioConfig||audioConfig.enabled===!1)return;let attachments=normalizeMediaAttachments(ctx);if(!attachments||attachments.length===0)return;let firstAudio=attachments.find(att=>att&&isAudioAttachment(att)&&!att.alreadyTranscribed);if(!firstAudio)return;shouldLogVerbose()&&logVerbose(`audio-preflight: transcribing attachment ${firstAudio.index} for mention check`);let providerRegistry=buildProviderRegistry(params.providers),cache=createMediaAttachmentCache(attachments);try{let result=await runCapability({capability:`audio`,cfg,ctx,attachments:cache,media:attachments,agentDir:params.agentDir,providerRegistry,config:audioConfig,activeModel:params.activeModel});if(!result||result.outputs.length===0)return;let audioOutput=result.outputs.find(output=>output.kind===`audio.transcription`);return!audioOutput||!audioOutput.text?void 0:(firstAudio.alreadyTranscribed=!0,shouldLogVerbose()&&logVerbose(`audio-preflight: transcribed ${audioOutput.text.length} chars from attachment ${firstAudio.index}`),audioOutput.text)}catch(err){shouldLogVerbose()&&logVerbose(`audio-preflight: transcription failed: ${String(err)}`);return}finally{await cache.cleanup()}}export{transcribeFirstAudio};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import"./session-key-5J69DULS.js";import"./registry-
|
|
1
|
+
import"./session-key-5J69DULS.js";import"./registry-DJq2Cvo9.js";import"./paths-Cb8zTlyG.js";import{l as normalizeProviderId,lt as ensureAuthProfileStore}from"./model-selection-K82MAGlL.js";import"./subsystem-COTa5Ly_.js";import"./agent-scope-BQByW0cD.js";import"./command-format-CAX9XFjI.js";import"./src-BcDibXPq.js";import path from"node:path";import fs from"node:fs/promises";async function readAuthJson(filePath){try{let raw=await fs.readFile(filePath,`utf8`),parsed=JSON.parse(raw);return!parsed||typeof parsed!=`object`?{}:parsed}catch{return{}}}function convertCredential(cred){if(cred.type===`api_key`){let key=typeof cred.key==`string`?cred.key.trim():``;return key?{type:`api_key`,key}:null}if(cred.type===`token`){let token=typeof cred.token==`string`?cred.token.trim():``;if(!token)return null;let expires=typeof cred.expires==`number`?cred.expires:NaN;return Number.isFinite(expires)&&expires>0&&Date.now()>=expires?null:{type:`api_key`,key:token}}if(cred.type===`oauth`){let accessRaw=cred.access,refreshRaw=cred.refresh,expiresRaw=cred.expires,access=typeof accessRaw==`string`?accessRaw.trim():``,refresh=typeof refreshRaw==`string`?refreshRaw.trim():``,expires=typeof expiresRaw==`number`?expiresRaw:NaN;return!access||!refresh||!Number.isFinite(expires)||expires<=0?null:{type:`oauth`,access,refresh,expires}}return null}function credentialsEqual(a,b){return!a||typeof a!=`object`||a.type!==b.type?!1:a.type===`api_key`&&b.type===`api_key`?a.key===b.key:a.type===`oauth`&&b.type===`oauth`?a.access===b.access&&a.refresh===b.refresh&&a.expires===b.expires:!1}async function ensureAuthJsonFromAuthProfiles(agentDir){let store=await ensureAuthProfileStore(agentDir,{allowKeychainPrompt:!1}),authPath=path.join(agentDir,`auth.json`),providerCredentials=new Map;for(let[,cred]of Object.entries(store.profiles)){let provider=normalizeProviderId(String(cred.provider??``)).trim();if(!provider||providerCredentials.has(provider))continue;let converted=convertCredential(cred);converted&&providerCredentials.set(provider,converted)}if(providerCredentials.size===0)return{wrote:!1,authPath};let existing=await readAuthJson(authPath),changed=!1;for(let[provider,cred]of providerCredentials)credentialsEqual(existing[provider],cred)||(existing[provider]=cred,changed=!0);return changed?(await fs.mkdir(agentDir,{recursive:!0,mode:448}),await fs.writeFile(authPath,`${JSON.stringify(existing,null,2)}\n`,{mode:384}),{wrote:!0,authPath}):{wrote:!1,authPath}}export{ensureAuthJsonFromAuthProfiles};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{c as normalizeAccountId,l as normalizeAgentId}from"./session-key-5J69DULS.js";import{o as normalizeChatChannelId}from"./registry-
|
|
1
|
+
import{c as normalizeAccountId,l as normalizeAgentId}from"./session-key-5J69DULS.js";import{o as normalizeChatChannelId}from"./registry-DJq2Cvo9.js";import{c as resolveDefaultAgentId}from"./agent-scope-BQByW0cD.js";function normalizeBindingChannelId(raw){return normalizeChatChannelId(raw)||(raw??``).trim().toLowerCase()||null}function listBindings(cfg){return Array.isArray(cfg.bindings)?cfg.bindings:[]}function resolveNormalizedBindingMatch(binding){if(!binding||typeof binding!=`object`)return null;let match=binding.match;if(!match||typeof match!=`object`)return null;let channelId=normalizeBindingChannelId(match.channel);if(!channelId)return null;let accountId=typeof match.accountId==`string`?match.accountId.trim():``;return!accountId||accountId===`*`?null:{agentId:normalizeAgentId(binding.agentId),accountId:normalizeAccountId(accountId),channelId}}function listBoundAccountIds(cfg,channelId){let normalizedChannel=normalizeBindingChannelId(channelId);if(!normalizedChannel)return[];let ids=new Set;for(let binding of listBindings(cfg)){let resolved=resolveNormalizedBindingMatch(binding);!resolved||resolved.channelId!==normalizedChannel||ids.add(resolved.accountId)}return Array.from(ids).toSorted((a,b)=>a.localeCompare(b))}function resolveDefaultAgentBoundAccountId(cfg,channelId){let normalizedChannel=normalizeBindingChannelId(channelId);if(!normalizedChannel)return null;let defaultAgentId=normalizeAgentId(resolveDefaultAgentId(cfg));for(let binding of listBindings(cfg)){let resolved=resolveNormalizedBindingMatch(binding);if(!(!resolved||resolved.channelId!==normalizedChannel||resolved.agentId!==defaultAgentId))return resolved.accountId}return null}export{listBoundAccountIds as n,resolveDefaultAgentBoundAccountId as r,listBindings as t};
|