@seanhogg/builderforce-agents 2026.10.10 → 2026.10.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{acp-cli-DcKpPsJa.js → acp-cli-C23mmrQt.js} +1 -1
- package/dist/{acp-cli-BxH-eUDl.js → acp-cli-D6F-D5JB.js} +1 -1
- package/dist/{agent-cXF-aL0g.js → agent-B-2r1Lr_.js} +1 -1
- package/dist/{agent-wJmvciTM.js → agent-BI9qSnSp.js} +1 -1
- package/dist/{agentbot-cli-Cub3Abbt.js → agentbot-cli-Cyrhr5jX.js} +1 -1
- package/dist/{agentbot-cli-CTRvEfBp.js → agentbot-cli-sC55m-XS.js} +1 -1
- package/dist/{agents-Cr7WO73I.js → agents-CMThT_Bj.js} +1 -1
- package/dist/agents-Chz9nfm2.js +1 -0
- package/dist/{api-key-rotation-CHBjUwUJ.js → api-key-rotation-CyCi-UqR.js} +1 -1
- package/dist/{audio-preflight-CWFuqbao.js → audio-preflight-B411b2-y.js} +1 -1
- package/dist/{audio-preflight-F2e3Y4CW.js → audio-preflight-Cs4eUjQk.js} +1 -1
- package/dist/{audio-preflight-Dm9zyfJq.js → audio-preflight-CvvHdoWy.js} +1 -1
- package/dist/{audit-DGnEhZYe.js → audit-B-USV03V.js} +1 -1
- package/dist/{audit-DBjjjW93.js → audit-SKNPS-K2.js} +1 -1
- package/dist/auth-choice-CChsMy-F.js +1 -0
- package/dist/{auth-choice-9gZuOvPS.js → auth-choice-CCib_yVL.js} +1 -1
- package/dist/auth-choice-DSnpkrMc.js +1 -0
- package/dist/{auth-choice-BoZFVmEa.js → auth-choice-DzBqqq7i.js} +1 -1
- package/dist/auth-choice.apply-6f3Jb_lS.js +1 -0
- package/dist/{auth-choice.apply-CcatXiNo.js → auth-choice.apply-BgOXoS8X.js} +1 -1
- package/dist/{auth-choice.apply-BHLQeym9.js → auth-choice.apply-DBuvopiF.js} +1 -1
- package/dist/auth-choice.apply-DeXnLwVS.js +1 -0
- package/dist/auth-choice.apply.transformers-CZDuBaOr.js +1 -0
- package/dist/{auth-choice.apply.transformers-CIn3fs7K.js → auth-choice.apply.transformers-Df9l_jRz.js} +2 -2
- package/dist/{auth-choice.apply.transformers-1plI0MUg.js → auth-choice.apply.transformers-DmdxpHGz.js} +2 -2
- package/dist/{auth-choice.apply.transformers-D5OrjEHo.js → auth-choice.apply.transformers-dn7l6XyJ.js} +1 -1
- package/dist/{auth-json-D1ite-pW.js → auth-json-BB-VBn5E.js} +1 -1
- package/dist/{auth-json-CN3MWw57.js → auth-json-BVyos95N.js} +1 -1
- package/dist/{auth-json-HGu227VM.js → auth-json-CoOe4tEg.js} +1 -1
- package/dist/{auth-json-DZ7E50Y1.js → auth-json-wrKixZxh.js} +1 -1
- package/dist/{auth-profiles-C1VbcUOm.js → auth-profiles-pt7Tr4HA.js} +1 -1
- package/dist/{auth-token-CyVfNEQb.js → auth-token-BE67qxLw.js} +1 -1
- package/dist/{auth-token-CoQ5ePPl.js → auth-token-BPHeoBAW.js} +1 -1
- package/dist/{banner-DY-L7_eI.js → banner-ErBINvbk.js} +1 -1
- package/dist/{browser-cli-D2O94twn.js → browser-cli-BZc64-Xx.js} +1 -1
- package/dist/{browser-cli-CoRx_4iM.js → browser-cli-CoxVKdon.js} +1 -1
- package/dist/build-info.json +3 -3
- package/dist/{builderforce-2EpP2M8q.js → builderforce-B9187Tm9.js} +4 -4
- package/dist/{builderforce-Cyg20uU8.js → builderforce-BLqHwgeu.js} +4 -4
- package/dist/builderforce-api-DKgXl8BH.js +1 -0
- package/dist/builderforce-api-DcPAGsla.js +1 -0
- package/dist/builderforce-onboarding-CaPJZSvw.js +24 -0
- package/dist/builderforce-onboarding-RXFb0gct.js +24 -0
- package/dist/{builderforcellm-syscheck-CprBhARf.js → builderforcellm-syscheck-9ksvqHYX.js} +1 -1
- package/dist/{builderforcellm-syscheck-DrFJ638L.js → builderforcellm-syscheck-F5JMAr3p.js} +1 -1
- package/dist/{call-DxPWzV-k.js → call-BnAs_SER.js} +1 -1
- package/dist/{call-DFjBq0H2.js → call-D1Opj5ev.js} +1 -1
- package/dist/{call-DmAU4cRX.js → call-Du2LiaX6.js} +1 -1
- package/dist/{call-BbRf8gFM.js → call-T8ciwMTA.js} +1 -1
- package/dist/{channel-options-d4EwVQD0.js → channel-options-B7sRMp2v.js} +1 -1
- package/dist/{channel-options-CDixz6dT.js → channel-options-rhDBCtlp.js} +1 -1
- package/dist/{channel-web-DJa8JC9W.js → channel-web-CcCqUQrJ.js} +1 -1
- package/dist/{channels-cli-BgKy0MbE.js → channels-cli-BjnLW14T.js} +1 -1
- package/dist/{channels-cli-nNW0ezPM.js → channels-cli-DVWUBsmc.js} +1 -1
- package/dist/chrome-Brg9KsB9.js +4 -0
- package/dist/{chrome-BnEbJV3D.js → chrome-CFmcixaE.js} +1 -1
- package/dist/{chrome-a3X9_-nf.js → chrome-DXt86tmV.js} +1 -1
- package/dist/cli/daemon-cli.js +1 -1
- package/dist/{cli-DkWt7p2x.js → cli-BUqtALJK.js} +1 -1
- package/dist/{cli-C5MbcECQ.js → cli-K4reS6IS.js} +1 -1
- package/dist/{coding-tools.policy-NEPm7Mz1.js → coding-tools.policy-D9Ba8eDh.js} +1 -1
- package/dist/{coding-tools.policy-6qh9acJy.js → coding-tools.policy-ZhOdlcEI.js} +1 -1
- package/dist/{command-registry-CDcuHGpx.js → command-registry-B7uAoROP.js} +1 -1
- package/dist/{command-registry-hHegQvBn.js → command-registry-CW16Mk2Y.js} +1 -1
- package/dist/{completion-cli-Bqr0W4L6.js → completion-cli-ZvXrCQqk.js} +1 -1
- package/dist/{completion-cli-Ch9ozmkg.js → completion-cli-gyvx5ZXu.js} +1 -1
- package/dist/{completion-cli-Do4vXo1k.js → completion-cli-n8UsdT91.js} +1 -1
- package/dist/{completion-cli-Ck0FTqPT.js → completion-cli-sKReGv3d.js} +1 -1
- package/dist/{config-_1Ca6jGb.js → config-BgV_FYSq.js} +1 -1
- package/dist/{config-toczWD3q.js → config-BpChMIJ6.js} +1 -1
- package/dist/{config-BTWlKwtB.js → config-D01EgOky.js} +1 -1
- package/dist/{config-27_FNba3.js → config-Dsnbi-a3.js} +1 -1
- package/dist/{config-cli-DeiQz5sY.js → config-cli-Bpo74mE5.js} +1 -1
- package/dist/{config-cli-CfczShaZ.js → config-cli-CF31O_5s.js} +1 -1
- package/dist/{config-guard-CD-Wq8kk.js → config-guard-BRUOk5YL.js} +1 -1
- package/dist/{config-guard-ClVl2FvD.js → config-guard-BUpQiSTW.js} +1 -1
- package/dist/{config-guard-B4in8l8I.js → config-guard-USCN-dq0.js} +1 -1
- package/dist/{config-validation-jpeXzoU3.js → config-validation-BGpSeNbh.js} +1 -1
- package/dist/{config-validation-C6u-z9bJ.js → config-validation-CdBJ-tZq.js} +1 -1
- package/dist/{configure-3W9C5LiT.js → configure-CWr61Ph2.js} +1 -1
- package/dist/configure-DhazB2qh.js +1 -0
- package/dist/{configure-BtXQW7ue.js → configure-DlcO1tWx.js} +1 -1
- package/dist/configure-MXheujvX.js +1 -0
- package/dist/{control-service-CJuuqNOE.js → control-service-2PkCt256.js} +1 -1
- package/dist/{control-service-qKfWP7VD.js → control-service-CcsbseZS.js} +1 -1
- package/dist/{control-service-izGyCWQs.js → control-service-qK1oboMo.js} +1 -1
- package/dist/{control-service-BbsswoMy.js → control-service-y3GYvIBg.js} +1 -1
- package/dist/{cron-cli-BrOM4s6N.js → cron-cli-BYu_lA8i.js} +1 -1
- package/dist/{cron-cli-CwtTX6pg.js → cron-cli-D_Og20iB.js} +1 -1
- package/dist/{daemon-cli-DyVsMf8p.js → daemon-cli-BNzthScZ.js} +1 -1
- package/dist/{daemon-cli-DlwOVDbt.js → daemon-cli-Bh3p0hui.js} +1 -1
- package/dist/{daemon-cli-Br0wu9xQ.js → daemon-cli-DxxKiKVN.js} +1 -1
- package/dist/{daemon-cli-DmicpZED.js → daemon-cli-emNxLkIw.js} +1 -1
- package/dist/{daemon-runtime-CtOr1ncS.js → daemon-runtime-9XitJmIL.js} +1 -1
- package/dist/{daemon-runtime-B4UjqdyJ.js → daemon-runtime-Dx800VUt.js} +1 -1
- package/dist/{deliver-BpLm3ktn.js → deliver--6OBF3LL.js} +1 -1
- package/dist/{deliver-9o_SE4ZK.js → deliver-ADpnRGRf.js} +1 -1
- package/dist/{deliver-D2VAVelb.js → deliver-BM6-damm.js} +1 -1
- package/dist/{deliver-BuZu68tp.js → deliver-CsG0cHbZ.js} +1 -1
- package/dist/{deps-CkJiJ6wc.js → deps-Dg_9rfXK.js} +1 -1
- package/dist/{devices-cli-BfXeDnbx.js → devices-cli-B8DXzcRP.js} +1 -1
- package/dist/{devices-cli-B9G6YOsS.js → devices-cli-BZkdWSx-.js} +1 -1
- package/dist/{directory-cli-BRCaiGOn.js → directory-cli-B78pAVI_.js} +1 -1
- package/dist/{directory-cli-D5ciZ5fY.js → directory-cli-CSaRkkL8.js} +1 -1
- package/dist/{dm-policy-shared-CRZpjRv0.js → dm-policy-shared-B9lW-AsK.js} +1 -1
- package/dist/{dm-policy-shared-Dhw9_6mi.js → dm-policy-shared-DYZ_T-az.js} +1 -1
- package/dist/{dns-cli-CgZ7oMcT.js → dns-cli-CLPGOFA1.js} +1 -1
- package/dist/{dns-cli-C4f4Tyij.js → dns-cli-dr5dHzfI.js} +1 -1
- package/dist/{doctor-completion-BjBTLcoC.js → doctor-completion-94zme499.js} +1 -1
- package/dist/{doctor-completion-Ccs-JEvV.js → doctor-completion-CbF34DIH.js} +1 -1
- package/dist/{embedded-cvG_LpfQ.js → embedded-D-citLF2.js} +6 -6
- package/dist/{embedded-helpers-CEsr3aQ0.js → embedded-helpers-C9jpiwlw.js} +1 -1
- package/dist/{embedded-helpers-DK8_apW0.js → embedded-helpers-DdU30lmt.js} +1 -1
- package/dist/entry.js +1 -1
- package/dist/{exec-approvals-cli-YuOu7mVg.js → exec-approvals-cli-CS_uabo7.js} +1 -1
- package/dist/{exec-approvals-cli-BPFi82B0.js → exec-approvals-cli-ktB7M7WE.js} +1 -1
- package/dist/extensionAPI.js +1 -1
- package/dist/{gateway-cli-CiHNwzdS.js → gateway-cli-CKcoLVMA.js} +5 -5
- package/dist/{gateway-cli-z47dfosr.js → gateway-cli-CuXBDBWe.js} +5 -5
- package/dist/{gateway-rpc-BXR_lVIx.js → gateway-rpc-B02y0PnE.js} +1 -1
- package/dist/{gateway-rpc-ByUcnQ7W.js → gateway-rpc-ff1RVb0_.js} +1 -1
- package/dist/{gemini-auth-CkD5jCPh.js → gemini-auth-DDR12zst.js} +1 -1
- package/dist/health-D0DZmCmh.js +1 -0
- package/dist/{health-yS3NRKvY.js → health-FO8MG5Ur.js} +1 -1
- package/dist/{health-DVo8a9yg.js → health-zrsgFZmR.js} +1 -1
- package/dist/{hooks-cli-B0lVee-j.js → hooks-cli-5Y4hnSX9.js} +1 -1
- package/dist/{hooks-cli-DsVmrQAG.js → hooks-cli-DpHZzRo2.js} +1 -1
- package/dist/index.js +2 -2
- package/dist/{ink-session-BitZ1wcY.js → ink-session-Dt9Q4iH-.js} +2 -2
- package/dist/{ink-session-CyAqXDla.js → ink-session-N8wCBzwk.js} +2 -2
- package/dist/{installs-CWd54ARy.js → installs-B_t2YXgq.js} +1 -1
- package/dist/{installs-C9A8QFiF.js → installs-DFiF4lGy.js} +1 -1
- package/dist/{io-3R_ZyUxB.js → io-BLBq4T2o.js} +1 -1
- package/dist/{io-DSIGyPrT.js → io-CXN4uLS2.js} +1 -1
- package/dist/{io-6jLoKffb.js → io-Ckd4NlvH.js} +1 -1
- package/dist/{io-CohJffHG.js → io-D9hC2aG0.js} +1 -1
- package/dist/{lifecycle-core-BpMvDXy1.js → lifecycle-core-D9Dg5Qps.js} +1 -1
- package/dist/{lifecycle-core-Dwb4gHjZ.js → lifecycle-core-uxjxTzFv.js} +1 -1
- package/dist/login-B3sDAgHb.js +1 -0
- package/dist/{login-C_ZdMOvv.js → login-CwwuaXtb.js} +1 -1
- package/dist/{login-DtDUyFO3.js → login-D1bVUPlv.js} +1 -1
- package/dist/{login-CEnjUo5c.js → login-GLDax56V.js} +1 -1
- package/dist/{login-qr-B9lyIZVD.js → login-qr-CbiUcBLy.js} +1 -1
- package/dist/{login-qr-BCBsxwhT.js → login-qr-Cp0YqK4e.js} +1 -1
- package/dist/{logs-cli-CdM5W3HE.js → logs-cli-Cy11HfSG.js} +1 -1
- package/dist/{logs-cli-jh5Xn3TD.js → logs-cli-nD36c-Y1.js} +1 -1
- package/dist/{manager-CRba8roB.js → manager-BeohB4-8.js} +1 -1
- package/dist/{manager-B3IJ_IKf.js → manager-CTTXDBt3.js} +1 -1
- package/dist/{manager-TGVy_fAb.js → manager-CoQMlcrf.js} +1 -1
- package/dist/{manager-DwywI_5-.js → manager-DSz61dXv.js} +1 -1
- package/dist/{memory-cli-BlayFTAM.js → memory-cli-BpAiRntI.js} +1 -1
- package/dist/{memory-cli-DRz4wtHk.js → memory-cli-CbkWGjRn.js} +1 -1
- package/dist/{memory-cli-PdyTQ84w.js → memory-cli-CrBMLM2P.js} +1 -1
- package/dist/{memory-cli-ivAs7q7v.js → memory-cli-CveeVOWH.js} +1 -1
- package/dist/{model-catalog-CQOdhMUY.js → model-catalog-B29yeBYS.js} +1 -1
- package/dist/{model-catalog-CiiFJX77.js → model-catalog-BeBXvbFm.js} +1 -1
- package/dist/model-catalog-CMKHKuBL.js +1 -0
- package/dist/{model-catalog-C6UrZ0uG.js → model-catalog-DjNiebr7.js} +1 -1
- package/dist/{model-discovery-C9Xm95uL.js → model-discovery-D0i1JpiL.js} +1 -1
- package/dist/{model-picker-swoSwauV.js → model-picker-CGDNPRPc.js} +1 -1
- package/dist/model-picker-CGEF8yhc.js +1 -0
- package/dist/model-picker-DeUNOC78.js +1 -0
- package/dist/{model-picker-BUePD7Zg.js → model-picker-EIhpfOZa.js} +1 -1
- package/dist/{model-selection-9bRFKBI_.js → model-selection-DG9J_VTz.js} +1 -1
- package/dist/{models-BNivsd2o.js → models-BjIzVQYX.js} +2 -2
- package/dist/{models-DQeSIY6M.js → models-JoqOgEF5.js} +1 -1
- package/dist/{models-cli-KokGgWeP.js → models-cli-B2zbchgs.js} +1 -1
- package/dist/{models-cli-BcNxU4P_.js → models-cli-CkFdc8NN.js} +2 -2
- package/dist/{node-cli-DIMh3X2F.js → node-cli-CXnuxiBq.js} +1 -1
- package/dist/{node-cli-EmTU-Gh0.js → node-cli-oVyjVnb7.js} +1 -1
- package/dist/{nodes-cli-BX8TznFK.js → nodes-cli-BBVotxNt.js} +1 -1
- package/dist/{nodes-cli-DyHovdAc.js → nodes-cli-DVMBSUhK.js} +1 -1
- package/dist/{onboard-D4uXN5Ec.js → onboard-BItclJp0.js} +1 -1
- package/dist/{onboard-cB37uVxy.js → onboard-CqvHIvKj.js} +1 -1
- package/dist/{onboard-auth.credentials-yagR-VMG.js → onboard-auth.credentials-DneFSdYg.js} +1 -1
- package/dist/{onboard-auth.credentials-BuT-etnE.js → onboard-auth.credentials-DpitLlzw.js} +1 -1
- package/dist/onboard-channels-B91m5S3w.js +1 -0
- package/dist/onboard-channels-BOoPtYbF.js +1 -0
- package/dist/{onboard-channels-B6QDFkkK.js → onboard-channels-Dn0u5C-C.js} +1 -1
- package/dist/{onboard-channels-C8FCFn29.js → onboard-channels-vhtccaIV.js} +1 -1
- package/dist/onboard-custom-BN0uzSq_.js +1 -0
- package/dist/{onboard-custom-D1nd8Hlu.js → onboard-custom-BYIza2e7.js} +1 -1
- package/dist/onboard-custom-CCFthqto.js +1 -0
- package/dist/{onboard-custom-C_BI0ZXn.js → onboard-custom-Ckf0xKXY.js} +1 -1
- package/dist/{onboard-helpers-CGlLpagb.js → onboard-helpers-B8I5AVyb.js} +1 -1
- package/dist/{onboard-helpers-CckrS8_K.js → onboard-helpers-Ce_c4Raj.js} +1 -1
- package/dist/{onboard-helpers-Cf5dNq7-.js → onboard-helpers-CiHzTaFX.js} +1 -1
- package/dist/{onboard-helpers-BvIZ4-R5.js → onboard-helpers-DC-nMl-V.js} +1 -1
- package/dist/{onboard-interactive-vwqLS6pe.js → onboard-interactive-Cl2K3EYn.js} +1 -1
- package/dist/{onboard-interactive-gvfRcLOt.js → onboard-interactive-JNux9zfA.js} +1 -1
- package/dist/{onboard-interactive-CnXgQrpI.js → onboard-interactive-J_ObFzeW.js} +1 -1
- package/dist/{onboard-interactive-CoFFuSJT.js → onboard-interactive-OUNsvlh0.js} +1 -1
- package/dist/{onboard-remote-D5lR2lVm.js → onboard-remote-0-q7MG9t.js} +1 -1
- package/dist/{onboard-remote-BmSyHww1.js → onboard-remote-CgAAEZpq.js} +1 -1
- package/dist/{onboard-remote-CzzQMZ3X.js → onboard-remote-DKXHDdBD.js} +1 -1
- package/dist/{onboard-remote-DcuX8b2g.js → onboard-remote-cB8j9RG-.js} +1 -1
- package/dist/{onboard-skills-ILHIeg1R.js → onboard-skills-47upVdA2.js} +1 -1
- package/dist/{onboard-skills-BPlNN_-T.js → onboard-skills-9Um4TL2x.js} +1 -1
- package/dist/{onboard-skills-DIhjDMom.js → onboard-skills-DhCmvhJY.js} +1 -1
- package/dist/{onboard-skills-CI1OtWsE.js → onboard-skills-mI2kfvdT.js} +1 -1
- package/dist/{onboarding-DdKW5K8Y.js → onboarding-BSENgR9C.js} +5 -5
- package/dist/{onboarding-B9GqKO5L.js → onboarding-CIaZLNc1.js} +5 -5
- package/dist/{onboarding.finalize-CcuO4Yxw.js → onboarding.finalize-BwOpvoPE.js} +1 -1
- package/dist/{onboarding.finalize-D3mTpOdc.js → onboarding.finalize-yMK-g7Uy.js} +1 -1
- package/dist/{onboarding.gateway-config-Cd7_bXVs.js → onboarding.gateway-config-Kn1O-QFl.js} +1 -1
- package/dist/{onboarding.gateway-config-Bd8HJkso.js → onboarding.gateway-config-huOjFf8D.js} +1 -1
- package/dist/{openai-model-default-Cp3nf21W.js → openai-model-default-CH2-2Hvk.js} +1 -1
- package/dist/{openai-model-default-BMRrqTmH.js → openai-model-default-pfoEzWYJ.js} +1 -1
- package/dist/{outbound-BRInCJD9.js → outbound-BdeHcMAo.js} +1 -1
- package/dist/{outbound-CAtBpFoD.js → outbound-BylJYD7n.js} +1 -1
- package/dist/{outbound-OI-t5zZ0.js → outbound-CAirtWr1.js} +1 -1
- package/dist/{outbound-CnIvOJlU.js → outbound-VNcvF2MG.js} +1 -1
- package/dist/{outbound-send-deps-m6DqOma_.js → outbound-send-deps-B3Lg-uqF.js} +1 -1
- package/dist/{pairing-cli-CEr0yEsc.js → pairing-cli-5RtPvz2i.js} +1 -1
- package/dist/{pairing-cli-Dxfoni-F.js → pairing-cli-C_Mj6Dy4.js} +1 -1
- package/dist/{pairing-labels-3j_iRYOO.js → pairing-labels-BJPrScRl.js} +1 -1
- package/dist/{pairing-labels-BW5jQZlr.js → pairing-labels-oA-nKTaW.js} +1 -1
- package/dist/{pairing-store-QDb6lhIU.js → pairing-store-YRy7EBgI.js} +1 -1
- package/dist/{pairing-store-CbvMJhD3.js → pairing-store-ti3FEkmr.js} +1 -1
- package/dist/{plugin-auto-enable-BV9K9Vhr.js → plugin-auto-enable-Cupr4wbt.js} +1 -1
- package/dist/{plugin-auto-enable-DDry2fA6.js → plugin-auto-enable-D8gKiE3F.js} +1 -1
- package/dist/plugin-registry-BEfyc2f_.js +1 -0
- package/dist/{plugin-registry-C-_GA65s.js → plugin-registry-BoPaef5I.js} +1 -1
- package/dist/{plugin-registry-SAdxNUwm.js → plugin-registry-CxnuHO_n.js} +1 -1
- package/dist/plugin-registry-D0tIqo8L.js +1 -0
- package/dist/plugin-sdk/agent-runtime/src/infra/workflow-telemetry.d.ts +12 -1
- package/dist/{plugins-BIG8NDB9.js → plugins-Cx29kkDj.js} +1 -1
- package/dist/{plugins-iAq-Gr8l.js → plugins-DJqou2hi.js} +1 -1
- package/dist/{plugins-cli-CpaVUv_r.js → plugins-cli-Bu-A8aGy.js} +1 -1
- package/dist/{plugins-cli-CPkSgvdL.js → plugins-cli-CGFsQDVW.js} +1 -1
- package/dist/{program-context-CpxTJP1m.js → program-context-ClBa4lUj.js} +1 -1
- package/dist/{program-BgDciyOQ.js → program-vVCzU0cH.js} +2 -2
- package/dist/{prompt-select-styled-Qb0DubNy.js → prompt-select-styled-BJPGccTJ.js} +1 -1
- package/dist/{prompt-select-styled-Bu7WPMzB.js → prompt-select-styled-BK74z6FF.js} +1 -1
- package/dist/{provider-auth-helpers-BpTnp2Yr.js → provider-auth-helpers-B84m5VMc.js} +1 -1
- package/dist/{provider-auth-helpers-CJTG_tVx.js → provider-auth-helpers-hNwpK_hl.js} +1 -1
- package/dist/{provider-dispatcher-TWwBT2aH.js → provider-dispatcher-BjR5DE3O.js} +1 -1
- package/dist/provider-dispatcher-DgOeVjcL.js +1 -0
- package/dist/{provider-usage-BdrU4cIE.js → provider-usage-B-wPVN_j.js} +1 -1
- package/dist/{provider-usage-Bn4ZrnU7.js → provider-usage-B8lFHp0K.js} +1 -1
- package/dist/{push-apns-C4sJnHbO.js → push-apns-BTPPvY81.js} +1 -1
- package/dist/{push-apns-CiD3rrVv.js → push-apns-CscYUS0D.js} +1 -1
- package/dist/{pw-ai-DSEj1QrV.js → pw-ai-CLS_VZ8p.js} +1 -1
- package/dist/{pw-ai-dNZY-qBs.js → pw-ai-D5og_rIf.js} +1 -1
- package/dist/{pw-ai-D8HJAvv-.js → pw-ai-DaxMmaVL.js} +1 -1
- package/dist/{qr-cli-qr-SFLZW.js → qr-cli-CAquM1Zk.js} +1 -1
- package/dist/{qr-cli-B45dCV0o.js → qr-cli-GsR8n1cm.js} +1 -1
- package/dist/{qr-cli-CMlAIzrD.js → qr-cli-kAKgaL-T.js} +1 -1
- package/dist/{qr-cli-CySNSEFj.js → qr-cli-uyxNf-cQ.js} +1 -1
- package/dist/{register.agent-BA6LIJSb.js → register.agent-BwTCfyeJ.js} +1 -1
- package/dist/{register.agent-D2uCH8jZ.js → register.agent-Dhdo3_7k.js} +1 -1
- package/dist/register.configure-B0m0G3ot.js +1 -0
- package/dist/register.configure-D3cbjmTz.js +1 -0
- package/dist/{register.maintenance-CPnm6L-m.js → register.maintenance-C6ocMld2.js} +1 -1
- package/dist/{register.maintenance-D8WmeEaD.js → register.maintenance-CbE2zSyc.js} +1 -1
- package/dist/{register.message-DiZRRAE5.js → register.message-Jn4u533_.js} +1 -1
- package/dist/{register.message-8iGDhO8h.js → register.message-Tu1hlM0m.js} +1 -1
- package/dist/{register.onboard-DMfqe2nX.js → register.onboard-B34211N6.js} +1 -1
- package/dist/{register.onboard-BoUicPRh.js → register.onboard-S1d2WAE4.js} +1 -1
- package/dist/{register.setup-BK6OEvY3.js → register.setup-CJPyAwCQ.js} +1 -1
- package/dist/{register.setup-CtcAR3JR.js → register.setup-Sg8f3nsH.js} +1 -1
- package/dist/{register.status-health-sessions-D6wdwPwV.js → register.status-health-sessions-BlgVxoZ4.js} +1 -1
- package/dist/{register.status-health-sessions-ZSufYw5j.js → register.status-health-sessions-DwADQJ74.js} +1 -1
- package/dist/{register.subclis-Dl6jPPsc.js → register.subclis-C9V_M-Lk.js} +1 -1
- package/dist/{register.subclis-EScCVgbV.js → register.subclis-pWn9XObB.js} +1 -1
- package/dist/{replies-DbkT_5BV.js → replies-BOGMDhSN.js} +1 -1
- package/dist/{replies-CzV-RFUG.js → replies-BXbV02ik.js} +1 -1
- package/dist/{replies-DIBQzxGp.js → replies-CUv671JF.js} +1 -1
- package/dist/{replies-Bd2RPZwQ.js → replies-DokbEfJD.js} +1 -1
- package/dist/{reply-Cd3vVnD7.js → reply-GY1C8tcv.js} +10 -10
- package/dist/{routes-BzfLvF8W.js → routes-DZntyPY6.js} +1 -1
- package/dist/{routes-lclJHOYY.js → routes-_iZdG1Fo.js} +1 -1
- package/dist/{rpc-BLqXRn5R.js → rpc-CbUnwStf.js} +1 -1
- package/dist/{rpc-DcQNGQlj.js → rpc-Cwm4gchc.js} +1 -1
- package/dist/{run-main-C3lmcvyV.js → run-main-DQMbgbcF.js} +1 -1
- package/dist/{runner-CviGu3Nk.js → runner-COldX-El.js} +3 -3
- package/dist/{runner-DwWmciCt.js → runner-Cu9NJouV.js} +1 -1
- package/dist/{runner-SxCr9kXD.js → runner-eTTUbLAK.js} +1 -1
- package/dist/{sandbox-BZibn6PX.js → sandbox-C4AKi2EX.js} +1 -1
- package/dist/{sandbox-z9t_PRf9.js → sandbox-DvKMuAXL.js} +1 -1
- package/dist/{sandbox-cli-BtGs0dBR.js → sandbox-cli-C0LhzYq_.js} +1 -1
- package/dist/{sandbox-cli-B8FpLgyY.js → sandbox-cli-De0iaoHB.js} +1 -1
- package/dist/{security-cli-D8Q8I7fn.js → security-cli-BvEfiO8m.js} +1 -1
- package/dist/{security-cli-IIMR7Pb4.js → security-cli-BzsQ0XQh.js} +1 -1
- package/dist/{send-DnMzjS7L.js → send-2dRKMWtl.js} +1 -1
- package/dist/{send-DerUBvXW.js → send-Aw8wK3vK.js} +1 -1
- package/dist/{send-BvroeIQ6.js → send-B7H8Ae5j.js} +1 -1
- package/dist/{send-4d9NswaD.js → send-BP5osGBo.js} +1 -1
- package/dist/{send-BU_-BGmf.js → send-BVal50Bi.js} +1 -1
- package/dist/{send-CxG2suVM.js → send-Bbo7TXLx.js} +1 -1
- package/dist/{send-CBBziNqM.js → send-BxoVLIy1.js} +1 -1
- package/dist/{send-dDpSBSBo.js → send-COKUbcqs.js} +1 -1
- package/dist/{send--12DIueA.js → send-CTw3PqN4.js} +1 -1
- package/dist/{send-UFtylOiq.js → send-CYGOPcKq.js} +1 -1
- package/dist/{send-DyF1Xy9K.js → send-ChGpVO3O.js} +1 -1
- package/dist/{send-Q-uTkSFE.js → send-Cqea2UFo.js} +1 -1
- package/dist/{send-j15662lv.js → send-CrFWgJKx.js} +1 -1
- package/dist/{send-gDb60Hk-.js → send-CwK8QBR3.js} +1 -1
- package/dist/{send-CceNWtYE.js → send-DqR7Rxzm.js} +1 -1
- package/dist/{send-CJHXQvVl.js → send-DxwfUIN-.js} +1 -1
- package/dist/{send-ByCVQQVz.js → send-KgN1P41U.js} +1 -1
- package/dist/{send-B1rJLLpr.js → send-bNp87SIq.js} +1 -1
- package/dist/{send-B_1BtyfA.js → send-kkm_zrHQ.js} +1 -1
- package/dist/{send-BJDzwYJN.js → send-l3ge4wkC.js} +1 -1
- package/dist/{server-context-DJZT7Upf.js → server-context-CQ2v4BAx.js} +1 -1
- package/dist/{server-context-owOmmyUM.js → server-context-CttALzrW.js} +1 -1
- package/dist/{server-node-events-54d8Rmjl.js → server-node-events-CIMO6Vae.js} +1 -1
- package/dist/{server-node-events-CSFVqgxX.js → server-node-events-iCF2ngcN.js} +1 -1
- package/dist/{session-BzQdcCqN.js → session-BJHsjD3z.js} +1 -1
- package/dist/{session-4FpEJvkE.js → session-C_b1ttHJ.js} +1 -1
- package/dist/{session-dirs-OxQuIvJW.js → session-dirs-Bvbgw0GC.js} +1 -1
- package/dist/{session-dirs-D_ARkyw0.js → session-dirs-DHaoq7zc.js} +1 -1
- package/dist/{session-utils-GMvum00v.js → session-utils-Dxou8SbO.js} +1 -1
- package/dist/{sessions-Bl1wwotX.js → sessions-BA8Se_bT.js} +1 -1
- package/dist/{sessions-CdanN_ZI.js → sessions-BuZVmOWt.js} +1 -1
- package/dist/{sessions-B5dwRhUC.js → sessions-DvbW0FNJ.js} +1 -1
- package/dist/{sessions-B1t7qeEn.js → sessions-DvqsIg0M.js} +1 -1
- package/dist/{shared-xj-xaKFi.js → shared-BBOiNdjf.js} +1 -1
- package/dist/{shared-BPN3qd7G.js → shared-C2orjbTD.js} +1 -1
- package/dist/{skill-scanner-U3AJgjqc.js → skill-scanner-BEvov9QH.js} +1 -1
- package/dist/{skill-scanner-DEmbPsRh.js → skill-scanner-OTLeRZ_p.js} +1 -1
- package/dist/{skills-cli-CIdnXa3B.js → skills-cli-C1BOgB3y.js} +1 -1
- package/dist/{skills-cli-BXbGr7vl.js → skills-cli-CFT2Aq5R.js} +1 -1
- package/dist/{skills-install-Btw_GHbI.js → skills-install-LlKntDHa.js} +1 -1
- package/dist/{skills-install-DMHQRpIl.js → skills-install-tx5Mahav.js} +1 -1
- package/dist/{status-DXaDS_0w.js → status-Bh8V7kjv.js} +1 -1
- package/dist/{status-BxeKmkVr.js → status-BtBHmhQh.js} +1 -1
- package/dist/{status-BkcmeZg6.js → status-CpwD4y9B.js} +1 -1
- package/dist/status-CqaTmyih.js +1 -0
- package/dist/{status-DouJcFzf.js → status-yXz8PUbL.js} +1 -1
- package/dist/{status.update-C9iy31xr.js → status.update-CdgsLBPg.js} +1 -1
- package/dist/{status.update-KYyRSDZY.js → status.update-hzMro-BT.js} +1 -1
- package/dist/{subagent-registry-Dr20nzwk.js → subagent-registry-CaRUNwCj.js} +1 -1
- package/dist/{subagent-registry-CyGxu3kP.js → subagent-registry-DDEN4oJi.js} +10 -10
- package/dist/{subagent-registry-BiXkIDeh.js → subagent-registry-DYYfeIc3.js} +1 -1
- package/dist/{system-cli-b4YgXPHv.js → system-cli-4aii1JYf.js} +1 -1
- package/dist/{system-cli-C7YzJeP4.js → system-cli-CfkDD3FV.js} +1 -1
- package/dist/{tui-D2sTsa4p.js → tui-DnVRxfI8.js} +2 -2
- package/dist/{tui-DY2oYbxk.js → tui-JfWoLGIV.js} +2 -2
- package/dist/{tui-cli-GW-qybY6.js → tui-cli-CGjg2Eb5.js} +1 -1
- package/dist/{tui-cli-wn3DmvUG.js → tui-cli-cd7Efw5u.js} +1 -1
- package/dist/{tui-setup-check-DJZCJokQ.js → tui-setup-check-BEHm9wwo.js} +1 -1
- package/dist/{tui-setup-check-BABAyl-e.js → tui-setup-check-DK8vdhLI.js} +1 -1
- package/dist/{tui-stream-assembler-ign_cPkv.js → tui-stream-assembler-8ud9oyMK.js} +1 -1
- package/dist/{tui-stream-assembler-q9GANTDr.js → tui-stream-assembler-Br15rhRH.js} +1 -1
- package/dist/{update-BUzcmoDf.js → update-B5yKFeGO.js} +1 -1
- package/dist/{update-D6U-V8Au.js → update-DodoQDCk.js} +1 -1
- package/dist/{update-cli-K5dGZmg8.js → update-cli-CfJJcSUS.js} +1 -1
- package/dist/{update-cli-CN0oxZ_A.js → update-cli-x8Ocbf-0.js} +1 -1
- package/dist/{usage-cli-CfEg1_NZ.js → usage-cli-CN7L1YRG.js} +1 -1
- package/dist/{usage-cli-CpbYMXxS.js → usage-cli-CQmokGkG.js} +1 -1
- package/dist/{web-DONGrYXq.js → web-BQPd6gQJ.js} +1 -1
- package/dist/{web-D-NSyF6b.js → web-BXLk9UT2.js} +1 -1
- package/dist/web-Btgs8oWv.js +1 -0
- package/dist/{webhooks-cli-B_f61rq7.js → webhooks-cli-DIo8p3lk.js} +1 -1
- package/dist/{webhooks-cli-Bi0t3w6P.js → webhooks-cli-DhxEtiFt.js} +1 -1
- package/dist/{whatsapp-actions-JbF2MrTV.js → whatsapp-actions-B7r9AyZN.js} +1 -1
- package/dist/{whatsapp-actions-BkCMhD9X.js → whatsapp-actions-DX2QU6Gs.js} +1 -1
- package/dist/{with-timeout-T07SJo4N.js → with-timeout-B_p5pWDv.js} +1 -1
- package/dist/{with-timeout-Bwq-GyUQ.js → with-timeout-GDLpcjW7.js} +1 -1
- package/dist/workflow-telemetry-BMTg5lPd.js +1 -0
- package/dist/workflow-telemetry-Bg8MVUr_.js +2 -0
- package/dist/workflow-telemetry-Do1UsYwM.js +1 -0
- package/dist/workflow-telemetry-DqBPhVL4.js +2 -0
- package/package.json +1 -1
- package/dist/agents-DsZ5vLKE.js +0 -1
- package/dist/auth-choice-Btd2Rxxd.js +0 -1
- package/dist/auth-choice-CVV9wRFN.js +0 -1
- package/dist/auth-choice.apply-BOK9XRCQ.js +0 -1
- package/dist/auth-choice.apply-Cv-BiV5Q.js +0 -1
- package/dist/auth-choice.apply.transformers-CXywS3GZ.js +0 -1
- package/dist/builderforce-onboarding-C89jVb-9.js +0 -24
- package/dist/builderforce-onboarding-D5A-wEs-.js +0 -24
- package/dist/chrome-DUBgoZpO.js +0 -4
- package/dist/configure-CWBBFk3F.js +0 -1
- package/dist/configure-fHVOAucW.js +0 -1
- package/dist/health-GLcAfqDz.js +0 -1
- package/dist/login-CPyEf5h6.js +0 -1
- package/dist/model-catalog-J7R-tJDu.js +0 -1
- package/dist/model-picker-D2bcWrtu.js +0 -1
- package/dist/model-picker-DO1HtEEm.js +0 -1
- package/dist/onboard-channels-CmqKsAoW.js +0 -1
- package/dist/onboard-channels-Db0P4iWl.js +0 -1
- package/dist/onboard-custom-BABqIYa4.js +0 -1
- package/dist/onboard-custom-VpW3UC8u.js +0 -1
- package/dist/plugin-registry-B-UOeWqM.js +0 -1
- package/dist/plugin-registry-BjMr3yXM.js +0 -1
- package/dist/provider-dispatcher-C4nHaNqn.js +0 -1
- package/dist/register.configure-DAL38e7r.js +0 -1
- package/dist/register.configure-DZG7-WVi.js +0 -1
- package/dist/status-BTYqHVha.js +0 -1
- package/dist/web-P6QsgmSD.js +0 -1
- package/dist/workflow-telemetry-B8Im0mPk.js +0 -1
- package/dist/workflow-telemetry-DLEnm5TI.js +0 -2
- package/dist/workflow-telemetry-Dc_oseV7.js +0 -2
- package/dist/workflow-telemetry-Dkm3mofI.js +0 -1
- /package/dist/{devtools-CI7JyCXv.js → devtools-Cg4F-l9O.js} +0 -0
- /package/dist/{devtools-eMFaIsAT.js → devtools-Dl2DACSO.js} +0 -0
- /package/dist/{github-copilot-token-D3gHtNUu.js → github-copilot-token-BlyiXyTy.js} +0 -0
- /package/dist/{github-copilot-token-DHP2kAiN.js → github-copilot-token-D5sB2AUI.js} +0 -0
- /package/dist/{onboard-hooks-Cenav0eW.js → onboard-hooks-BaOSgxs9.js} +0 -0
- /package/dist/{onboard-hooks-Ce20rwpW.js → onboard-hooks-fO5eeDe_.js} +0 -0
- /package/dist/{qmd-manager-DVd_aWEV.js → qmd-manager-BgplOjHN.js} +0 -0
- /package/dist/{qmd-manager-keHvLmvP.js → qmd-manager-COUi_Fqb.js} +0 -0
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import{y as resolveRequiredHomeDir}from"./paths-BHg-VHB4.js";import{f as requireActivePluginRegistry,n as CHAT_CHANNEL_ORDER,o as getChatChannelMeta}from"./registry-Cv7CoWAs.js";import{c as escapeRegExp,m as normalizeE164}from"./utils-BP60e80M.js";import{t as createSubsystemLogger}from"./subsystem-C4b1Von0.js";import{D as resolveProcessScopedMap,Ht as CURRENT_SESSION_VERSION,O as isPidAlive,Ut as SessionManager}from"./auth-profiles-C1VbcUOm.js";import{a as buildAgentMainSessionKey,d as normalizeAgentId,f as normalizeMainKey,r as DEFAULT_AGENT_ID,u as normalizeAccountId$1}from"./session-key-CksCYipj.js";import{m as parseByteSize,r as loadConfig,y as parseDurationMs}from"./io-CohJffHG.js";import{c as listDeliverableMessageChannels,l as normalizeMessageChannel}from"./message-channel-z5YRpR2d.js";import{r as hasInterSessionUserProvenance}from"./input-provenance-Rnkkt19n.js";import{_ as resolveDiscordAccount,a as normalizeWhatsAppTarget,d as resolveSlackAccount,f as resolveSlackReplyToMode,l as resolveTelegramAccount,r as normalizeChannelId}from"./plugins-1Mn6RiNf.js";import{n as resolveWhatsAppAccount}from"./accounts-BkTLjSrD.js";import{t as normalizeChatType}from"./chat-type-BSDVym_t.js";import{n as resolveSignalAccount}from"./accounts-Cx82nj4E.js";import{t as resolveConversationLabel}from"./conversation-label-YgiB0mdr.js";import{t as resolveIMessageAccount}from"./accounts-DcoaLXKI.js";import{a as resolveSessionTranscriptPathInDir,c as resolveStorePath,i as resolveSessionTranscriptPath,n as resolveSessionFilePath,t as resolveDefaultSessionStorePath}from"./paths-ClsbsPQP.js";import{n as extractToolCallNames,r as hasToolCall}from"./transcript-tools-tpHa22sp.js";import{t as emitSessionTranscriptUpdate}from"./transcript-events-XyildGuH.js";import os from"node:os";import path from"node:path";import fs from"node:fs";import crypto from"node:crypto";import fs$1 from"node:fs/promises";function normalizeAccountId(value){if(typeof value==`string`)return value.trim()||void 0}function normalizeDeliveryContext(context){if(!context)return;let channel=typeof context.channel==`string`?normalizeMessageChannel(context.channel)??context.channel.trim():void 0,to=typeof context.to==`string`?context.to.trim():void 0,accountId=normalizeAccountId(context.accountId),threadId=typeof context.threadId==`number`&&Number.isFinite(context.threadId)?Math.trunc(context.threadId):typeof context.threadId==`string`?context.threadId.trim():void 0,normalizedThreadId=typeof threadId==`string`?threadId||void 0:threadId;if(!channel&&!to&&!accountId&&normalizedThreadId==null)return;let normalized={channel:channel||void 0,to:to||void 0,accountId};return normalizedThreadId!=null&&(normalized.threadId=normalizedThreadId),normalized}function normalizeSessionDeliveryFields(source){if(!source)return{deliveryContext:void 0,lastChannel:void 0,lastTo:void 0,lastAccountId:void 0,lastThreadId:void 0};let merged=mergeDeliveryContext(normalizeDeliveryContext({channel:source.lastChannel??source.channel,to:source.lastTo,accountId:source.lastAccountId,threadId:source.lastThreadId}),normalizeDeliveryContext(source.deliveryContext));return merged?{deliveryContext:merged,lastChannel:merged.channel,lastTo:merged.to,lastAccountId:merged.accountId,lastThreadId:merged.threadId}:{deliveryContext:void 0,lastChannel:void 0,lastTo:void 0,lastAccountId:void 0,lastThreadId:void 0}}function deliveryContextFromSession(entry){if(entry)return normalizeSessionDeliveryFields({channel:entry.channel,lastChannel:entry.lastChannel,lastTo:entry.lastTo,lastAccountId:entry.lastAccountId,lastThreadId:entry.lastThreadId??entry.deliveryContext?.threadId??entry.origin?.threadId,deliveryContext:entry.deliveryContext}).deliveryContext}function mergeDeliveryContext(primary,fallback){let normalizedPrimary=normalizeDeliveryContext(primary),normalizedFallback=normalizeDeliveryContext(fallback);if(!(!normalizedPrimary&&!normalizedFallback))return normalizeDeliveryContext({channel:normalizedPrimary?.channel??normalizedFallback?.channel,to:normalizedPrimary?.to??normalizedFallback?.to,accountId:normalizedPrimary?.accountId??normalizedFallback?.accountId,threadId:normalizedPrimary?.threadId??normalizedFallback?.threadId})}function deliveryContextKey(context){let normalized=normalizeDeliveryContext(context);if(!normalized?.channel||!normalized?.to)return;let threadId=normalized.threadId!=null&&normalized.threadId!==``?String(normalized.threadId):``;return`${normalized.channel}|${normalized.to}|${normalized.accountId??``}|${threadId}`}const CLEANUP_SIGNALS=[`SIGINT`,`SIGTERM`,`SIGQUIT`,`SIGABRT`],CLEANUP_STATE_KEY=Symbol.for(`builderforce.sessionWriteLockCleanupState`),HELD_LOCKS_KEY=Symbol.for(`builderforce.sessionWriteLockHeldLocks`),WATCHDOG_STATE_KEY=Symbol.for(`builderforce.sessionWriteLockWatchdogState`),DEFAULT_STALE_MS=1800*1e3,DEFAULT_MAX_HOLD_MS=300*1e3,DEFAULT_WATCHDOG_INTERVAL_MS=6e4,MAX_LOCK_HOLD_MS=2147e6,HELD_LOCKS=resolveProcessScopedMap(HELD_LOCKS_KEY);function resolveCleanupState(){let proc=process;return proc[CLEANUP_STATE_KEY]||(proc[CLEANUP_STATE_KEY]={registered:!1,cleanupHandlers:new Map}),proc[CLEANUP_STATE_KEY]}function resolveWatchdogState(){let proc=process;return proc[WATCHDOG_STATE_KEY]||(proc[WATCHDOG_STATE_KEY]={started:!1,intervalMs:DEFAULT_WATCHDOG_INTERVAL_MS}),proc[WATCHDOG_STATE_KEY]}function resolvePositiveMs(value,fallback,opts={}){return typeof value!=`number`||Number.isNaN(value)||value<=0?fallback:value===1/0?opts.allowInfinity?value:fallback:Number.isFinite(value)?value:fallback}function resolveSessionLockMaxHoldFromTimeout(params){let minMs=resolvePositiveMs(params.minMs,DEFAULT_MAX_HOLD_MS),timeoutMs=resolvePositiveMs(params.timeoutMs,minMs,{allowInfinity:!0});if(timeoutMs===1/0)return MAX_LOCK_HOLD_MS;let graceMs=resolvePositiveMs(params.graceMs,12e4);return Math.min(MAX_LOCK_HOLD_MS,Math.max(minMs,timeoutMs+graceMs))}async function releaseHeldLock(normalizedSessionFile,held,opts={}){if(HELD_LOCKS.get(normalizedSessionFile)!==held)return!1;if(opts.force)held.count=0;else if(--held.count,held.count>0)return!1;if(held.releasePromise)return await held.releasePromise.catch(()=>void 0),!0;HELD_LOCKS.delete(normalizedSessionFile),held.releasePromise=(async()=>{try{await held.handle.close()}catch{}try{await fs$1.rm(held.lockPath,{force:!0})}catch{}})();try{return await held.releasePromise,!0}finally{held.releasePromise=void 0}}function releaseAllLocksSync(){for(let[sessionFile,held]of HELD_LOCKS){try{typeof held.handle.close==`function`&&held.handle.close().catch(()=>{})}catch{}try{fs.rmSync(held.lockPath,{force:!0})}catch{}HELD_LOCKS.delete(sessionFile)}}async function runLockWatchdogCheck(nowMs=Date.now()){let released=0;for(let[sessionFile,held]of HELD_LOCKS.entries()){let heldForMs=nowMs-held.acquiredAt;heldForMs<=held.maxHoldMs||(console.warn(`[session-write-lock] releasing lock held for ${heldForMs}ms (max=${held.maxHoldMs}ms): ${held.lockPath}`),await releaseHeldLock(sessionFile,held,{force:!0})&&(released+=1))}return released}function ensureWatchdogStarted(intervalMs){let watchdogState=resolveWatchdogState();watchdogState.started||(watchdogState.started=!0,watchdogState.intervalMs=intervalMs,watchdogState.timer=setInterval(()=>{runLockWatchdogCheck().catch(()=>{})},intervalMs),watchdogState.timer.unref?.())}function handleTerminationSignal(signal){releaseAllLocksSync();let cleanupState=resolveCleanupState();if(process.listenerCount(signal)===1){let handler=cleanupState.cleanupHandlers.get(signal);handler&&(process.off(signal,handler),cleanupState.cleanupHandlers.delete(signal));try{process.kill(process.pid,signal)}catch{}}}function registerCleanupHandlers(){let cleanupState=resolveCleanupState();cleanupState.registered||(cleanupState.registered=!0,process.on(`exit`,()=>{releaseAllLocksSync()})),ensureWatchdogStarted(DEFAULT_WATCHDOG_INTERVAL_MS);for(let signal of CLEANUP_SIGNALS)if(!cleanupState.cleanupHandlers.has(signal))try{let handler=()=>handleTerminationSignal(signal);cleanupState.cleanupHandlers.set(signal,handler),process.on(signal,handler)}catch{}}async function readLockPayload(lockPath){try{let raw=await fs$1.readFile(lockPath,`utf8`),parsed=JSON.parse(raw),payload={};return typeof parsed.pid==`number`&&(payload.pid=parsed.pid),typeof parsed.createdAt==`string`&&(payload.createdAt=parsed.createdAt),payload}catch{return null}}function inspectLockPayload(payload,staleMs,nowMs){let pid=typeof payload?.pid==`number`?payload.pid:null,pidAlive=pid===null?!1:isPidAlive(pid),createdAt=typeof payload?.createdAt==`string`?payload.createdAt:null,createdAtMs=createdAt?Date.parse(createdAt):NaN,ageMs=Number.isFinite(createdAtMs)?Math.max(0,nowMs-createdAtMs):null,staleReasons=[];return pid===null?staleReasons.push(`missing-pid`):pidAlive||staleReasons.push(`dead-pid`),ageMs===null?staleReasons.push(`invalid-createdAt`):ageMs>staleMs&&staleReasons.push(`too-old`),{pid,pidAlive,createdAt,ageMs,stale:staleReasons.length>0,staleReasons}}async function cleanStaleLockFiles(params){let sessionsDir=path.resolve(params.sessionsDir),staleMs=resolvePositiveMs(params.staleMs,DEFAULT_STALE_MS),removeStale=params.removeStale!==!1,nowMs=params.nowMs??Date.now(),entries=[];try{entries=await fs$1.readdir(sessionsDir,{withFileTypes:!0})}catch(err){if(err.code===`ENOENT`)return{locks:[],cleaned:[]};throw err}let locks=[],cleaned=[],lockEntries=entries.filter(entry=>entry.name.endsWith(`.jsonl.lock`)).toSorted((a,b)=>a.name.localeCompare(b.name));for(let entry of lockEntries){let lockPath=path.join(sessionsDir,entry.name),lockInfo={lockPath,...inspectLockPayload(await readLockPayload(lockPath),staleMs,nowMs),removed:!1};lockInfo.stale&&removeStale&&(await fs$1.rm(lockPath,{force:!0}),lockInfo.removed=!0,cleaned.push(lockInfo),params.log?.warn?.(`removed stale session lock: ${lockPath} (${lockInfo.staleReasons.join(`, `)||`unknown`})`)),locks.push(lockInfo)}return{locks,cleaned}}async function acquireSessionWriteLock(params){registerCleanupHandlers();let timeoutMs=resolvePositiveMs(params.timeoutMs,1e4,{allowInfinity:!0}),staleMs=resolvePositiveMs(params.staleMs,DEFAULT_STALE_MS),maxHoldMs=resolvePositiveMs(params.maxHoldMs,DEFAULT_MAX_HOLD_MS),sessionFile=path.resolve(params.sessionFile),sessionDir=path.dirname(sessionFile);await fs$1.mkdir(sessionDir,{recursive:!0});let normalizedDir=sessionDir;try{normalizedDir=await fs$1.realpath(sessionDir)}catch{}let normalizedSessionFile=path.join(normalizedDir,path.basename(sessionFile)),lockPath=`${normalizedSessionFile}.lock`,allowReentrant=params.allowReentrant??!0,held=HELD_LOCKS.get(normalizedSessionFile);if(allowReentrant&&held)return held.count+=1,{release:async()=>{await releaseHeldLock(normalizedSessionFile,held)}};let startedAt=Date.now(),attempt=0;for(;Date.now()-startedAt<timeoutMs;){attempt+=1;try{let handle=await fs$1.open(lockPath,`wx`),createdAt=new Date().toISOString();await handle.writeFile(JSON.stringify({pid:process.pid,createdAt},null,2),`utf8`);let createdHeld={count:1,handle,lockPath,acquiredAt:Date.now(),maxHoldMs};return HELD_LOCKS.set(normalizedSessionFile,createdHeld),{release:async()=>{await releaseHeldLock(normalizedSessionFile,createdHeld)}}}catch(err){if(err.code!==`EEXIST`)throw err;if(inspectLockPayload(await readLockPayload(lockPath),staleMs,Date.now()).stale){await fs$1.rm(lockPath,{force:!0});continue}let delay=Math.min(1e3,50*attempt);await new Promise(r=>setTimeout(r,delay))}}let payload=await readLockPayload(lockPath),owner=typeof payload?.pid==`number`?`pid=${payload.pid}`:`unknown`;throw Error(`session file locked (timeout ${timeoutMs}ms): ${owner} ${lockPath}`)}[...CLEANUP_SIGNALS];function normalizeStringEntries(list){return(list??[]).map(entry=>String(entry).trim()).filter(Boolean)}function normalizeStringEntriesLower(list){return normalizeStringEntries(list).map(entry=>entry.toLowerCase())}function normalizeHyphenSlug(raw){let trimmed=raw?.trim().toLowerCase()??``;return trimmed?trimmed.replace(/\s+/g,`-`).replace(/[^a-z0-9#@._+-]+/g,`-`).replace(/-{2,}/g,`-`).replace(/^[-.]+|[-.]+$/g,``):``}function normalizeAtHashSlug(raw){let trimmed=raw?.trim().toLowerCase()??``;return trimmed?trimmed.replace(/^[@#]+/,``).replace(/[\s_]+/g,`-`).replace(/[^a-z0-9-]+/g,`-`).replace(/-{2,}/g,`-`).replace(/^-+|-+$/g,``):``}const getGroupSurfaces=()=>new Set([...listDeliverableMessageChannels(),`webchat`]);function normalizeGroupLabel(raw){return normalizeHyphenSlug(raw)}function shortenGroupId(value){let trimmed=value?.trim()??``;return trimmed?trimmed.length<=14?trimmed:`${trimmed.slice(0,6)}...${trimmed.slice(-4)}`:``}function buildGroupDisplayName(params){let providerKey=(params.provider?.trim().toLowerCase()||`group`).trim(),groupChannel=params.groupChannel?.trim(),space=params.space?.trim(),subject=params.subject?.trim(),detail=(groupChannel&&space?`${space}${groupChannel.startsWith(`#`)?``:`#`}${groupChannel}`:groupChannel||subject||space||``)||``,fallbackId=params.id?.trim()||params.key,rawLabel=detail||fallbackId,token=normalizeGroupLabel(rawLabel);return token||=normalizeGroupLabel(shortenGroupId(rawLabel)),!params.groupChannel&&token.startsWith(`#`)&&(token=token.replace(/^#+/,``)),token&&!/^[@#]/.test(token)&&!token.startsWith(`g-`)&&!token.includes(`#`)&&(token=`g-${token}`),token?`${providerKey}:${token}`:providerKey}function resolveGroupSessionKey(ctx){let from=typeof ctx.From==`string`?ctx.From.trim():``,chatType=ctx.ChatType?.trim().toLowerCase(),normalizedChatType=chatType===`channel`?`channel`:chatType===`group`?`group`:void 0,isWhatsAppGroupId=from.toLowerCase().endsWith(`@g.us`);if(!(normalizedChatType===`group`||normalizedChatType===`channel`||from.includes(`:group:`)||from.includes(`:channel:`)||isWhatsAppGroupId))return null;let providerHint=ctx.Provider?.trim().toLowerCase(),parts=from.split(`:`).filter(Boolean),head=parts[0]?.trim().toLowerCase()??``,headIsSurface=head?getGroupSurfaces().has(head):!1,provider=headIsSurface?head:providerHint??(isWhatsAppGroupId?`whatsapp`:void 0);if(!provider)return null;let second=parts[1]?.trim().toLowerCase(),secondIsKind=second===`group`||second===`channel`,kind=secondIsKind?second:from.includes(`:channel:`)||normalizedChatType===`channel`?`channel`:`group`,finalId=(headIsSurface?secondIsKind?parts.slice(2).join(`:`):parts.slice(1).join(`:`):from).trim().toLowerCase();return finalId?{key:`${provider}:${kind}:${finalId}`,channel:provider,id:finalId,chatType:kind===`channel`?`channel`:`group`}:null}function resolveChannelGroupConfig(groups,groupId,caseInsensitive=!1){if(!groups)return;let direct=groups[groupId];if(direct)return direct;if(!caseInsensitive)return;let target=groupId.toLowerCase(),matchedKey=Object.keys(groups).find(key=>key!==`*`&&key.toLowerCase()===target);if(matchedKey)return groups[matchedKey]}function normalizeSenderKey(value){let trimmed=value.trim();return trimmed?(trimmed.startsWith(`@`)?trimmed.slice(1):trimmed).toLowerCase():``}function resolveToolsBySender(params){let toolsBySender=params.toolsBySender;if(!toolsBySender)return;let entries=Object.entries(toolsBySender);if(entries.length===0)return;let normalized=new Map,wildcard;for(let[rawKey,policy]of entries){if(!policy)continue;let key=normalizeSenderKey(rawKey);if(key){if(key===`*`){wildcard=policy;continue}normalized.has(key)||normalized.set(key,policy)}}let candidates=[],pushCandidate=value=>{let trimmed=value?.trim();trimmed&&candidates.push(trimmed)};pushCandidate(params.senderId),pushCandidate(params.senderE164),pushCandidate(params.senderUsername),pushCandidate(params.senderName);for(let candidate of candidates){let key=normalizeSenderKey(candidate);if(!key)continue;let match=normalized.get(key);if(match)return match}return wildcard}function resolveChannelGroups(cfg,channel,accountId){let normalizedAccountId=normalizeAccountId$1(accountId),channelConfig=cfg.channels?.[channel];if(channelConfig)return channelConfig.accounts?.[normalizedAccountId]?.groups??channelConfig.accounts?.[Object.keys(channelConfig.accounts??{}).find(key=>key.toLowerCase()===normalizedAccountId.toLowerCase())??``]?.groups??channelConfig.groups}function resolveChannelGroupPolicy(params){let{cfg,channel}=params,groups=resolveChannelGroups(cfg,channel,params.accountId),allowlistEnabled=!!(groups&&Object.keys(groups).length>0),normalizedId=params.groupId?.trim(),groupConfig=normalizedId?resolveChannelGroupConfig(groups,normalizedId,params.groupIdCaseInsensitive):void 0,defaultConfig=groups?.[`*`];return{allowlistEnabled,allowed:!allowlistEnabled||allowlistEnabled&&!!(groups&&Object.hasOwn(groups,`*`))||!!groupConfig,groupConfig,defaultConfig}}function resolveChannelGroupRequireMention(params){let{requireMentionOverride,overrideOrder=`after-config`}=params,{groupConfig,defaultConfig}=resolveChannelGroupPolicy(params),configMention=typeof groupConfig?.requireMention==`boolean`?groupConfig.requireMention:typeof defaultConfig?.requireMention==`boolean`?defaultConfig.requireMention:void 0;return overrideOrder===`before-config`&&typeof requireMentionOverride==`boolean`?requireMentionOverride:typeof configMention==`boolean`?configMention:overrideOrder!==`before-config`&&typeof requireMentionOverride==`boolean`?requireMentionOverride:!0}function resolveChannelGroupToolsPolicy(params){let{groupConfig,defaultConfig}=resolveChannelGroupPolicy(params),groupSenderPolicy=resolveToolsBySender({toolsBySender:groupConfig?.toolsBySender,senderId:params.senderId,senderName:params.senderName,senderUsername:params.senderUsername,senderE164:params.senderE164});if(groupSenderPolicy)return groupSenderPolicy;if(groupConfig?.tools)return groupConfig.tools;let defaultSenderPolicy=resolveToolsBySender({toolsBySender:defaultConfig?.toolsBySender,senderId:params.senderId,senderName:params.senderName,senderUsername:params.senderUsername,senderE164:params.senderE164});if(defaultSenderPolicy)return defaultSenderPolicy;if(defaultConfig?.tools)return defaultConfig.tools}function buildSlackThreadingToolContext(params){let configuredReplyToMode=resolveSlackReplyToMode(resolveSlackAccount({cfg:params.cfg,accountId:params.accountId}),params.context.ChatType),effectiveReplyToMode=params.context.ThreadLabel?`all`:configuredReplyToMode,threadId=params.context.MessageThreadId??params.context.ReplyToId;return{currentChannelId:params.context.To?.startsWith(`channel:`)?params.context.To.slice(8):void 0,currentThreadTs:threadId==null?void 0:String(threadId),replyToMode:effectiveReplyToMode,hasRepliedRef:params.hasRepliedRef}}function normalizeDiscordSlug(value){return normalizeAtHashSlug(value)}function parseTelegramGroupId(value){let raw=value?.trim()??``;if(!raw)return{chatId:void 0,topicId:void 0};let parts=raw.split(`:`).filter(Boolean);return parts.length>=3&&parts[1]===`topic`&&/^-?\d+$/.test(parts[0])&&/^\d+$/.test(parts[2])?{chatId:parts[0],topicId:parts[2]}:parts.length>=2&&/^-?\d+$/.test(parts[0])&&/^\d+$/.test(parts[1])?{chatId:parts[0],topicId:parts[1]}:{chatId:raw,topicId:void 0}}function resolveTelegramRequireMention(params){let{cfg,chatId,topicId}=params;if(!chatId)return;let groupConfig=cfg.channels?.telegram?.groups?.[chatId],groupDefault=cfg.channels?.telegram?.groups?.[`*`],topicConfig=topicId&&groupConfig?.topics?groupConfig.topics[topicId]:void 0,defaultTopicConfig=topicId&&groupDefault?.topics?groupDefault.topics[topicId]:void 0;if(typeof topicConfig?.requireMention==`boolean`)return topicConfig.requireMention;if(typeof defaultTopicConfig?.requireMention==`boolean`)return defaultTopicConfig.requireMention;if(typeof groupConfig?.requireMention==`boolean`)return groupConfig.requireMention;if(typeof groupDefault?.requireMention==`boolean`)return groupDefault.requireMention}function resolveDiscordGuildEntry(guilds,groupSpace){if(!guilds||Object.keys(guilds).length===0)return null;let space=groupSpace?.trim()??``;if(space&&guilds[space])return guilds[space];let normalized=normalizeDiscordSlug(space);if(normalized&&guilds[normalized])return guilds[normalized];if(normalized){let match=Object.values(guilds).find(entry=>normalizeDiscordSlug(entry?.slug??void 0)===normalized);if(match)return match}return guilds[`*`]??null}function resolveDiscordChannelEntry(channelEntries,params){if(!channelEntries||Object.keys(channelEntries).length===0)return;let groupChannel=params.groupChannel,channelSlug=normalizeDiscordSlug(groupChannel);return(params.groupId?channelEntries[params.groupId]:void 0)??(channelSlug?channelEntries[channelSlug]??channelEntries[`#${channelSlug}`]:void 0)??(groupChannel?channelEntries[normalizeDiscordSlug(groupChannel)]:void 0)}function resolveSlackChannelPolicyEntry(params){let channels=resolveSlackAccount({cfg:params.cfg,accountId:params.accountId}).channels??{};if(Object.keys(channels).length===0)return;let channelId=params.groupId?.trim(),channelName=params.groupChannel?.replace(/^#/,``),normalizedName=normalizeHyphenSlug(channelName),candidates=[channelId??``,channelName?`#${channelName}`:``,channelName??``,normalizedName].filter(Boolean);for(let candidate of candidates)if(candidate&&channels[candidate])return channels[candidate];return channels[`*`]}function resolveTelegramGroupRequireMention(params){let{chatId,topicId}=parseTelegramGroupId(params.groupId),requireMention=resolveTelegramRequireMention({cfg:params.cfg,chatId,topicId});return typeof requireMention==`boolean`?requireMention:resolveChannelGroupRequireMention({cfg:params.cfg,channel:`telegram`,groupId:chatId??params.groupId,accountId:params.accountId})}function resolveWhatsAppGroupRequireMention(params){return resolveChannelGroupRequireMention({cfg:params.cfg,channel:`whatsapp`,groupId:params.groupId,accountId:params.accountId})}function resolveIMessageGroupRequireMention(params){return resolveChannelGroupRequireMention({cfg:params.cfg,channel:`imessage`,groupId:params.groupId,accountId:params.accountId})}function resolveDiscordGroupRequireMention(params){let guildEntry=resolveDiscordGuildEntry(params.cfg.channels?.discord?.guilds,params.groupSpace),channelEntries=guildEntry?.channels;if(channelEntries&&Object.keys(channelEntries).length>0){let entry=resolveDiscordChannelEntry(channelEntries,params);if(entry&&typeof entry.requireMention==`boolean`)return entry.requireMention}return typeof guildEntry?.requireMention==`boolean`?guildEntry.requireMention:!0}function resolveGoogleChatGroupRequireMention(params){return resolveChannelGroupRequireMention({cfg:params.cfg,channel:`googlechat`,groupId:params.groupId,accountId:params.accountId})}function resolveGoogleChatGroupToolPolicy(params){return resolveChannelGroupToolsPolicy({cfg:params.cfg,channel:`googlechat`,groupId:params.groupId,accountId:params.accountId,senderId:params.senderId,senderName:params.senderName,senderUsername:params.senderUsername,senderE164:params.senderE164})}function resolveSlackGroupRequireMention(params){let resolved=resolveSlackChannelPolicyEntry(params);return typeof resolved?.requireMention==`boolean`?resolved.requireMention:!0}function resolveTelegramGroupToolPolicy(params){let{chatId}=parseTelegramGroupId(params.groupId);return resolveChannelGroupToolsPolicy({cfg:params.cfg,channel:`telegram`,groupId:chatId??params.groupId,accountId:params.accountId,senderId:params.senderId,senderName:params.senderName,senderUsername:params.senderUsername,senderE164:params.senderE164})}function resolveWhatsAppGroupToolPolicy(params){return resolveChannelGroupToolsPolicy({cfg:params.cfg,channel:`whatsapp`,groupId:params.groupId,accountId:params.accountId,senderId:params.senderId,senderName:params.senderName,senderUsername:params.senderUsername,senderE164:params.senderE164})}function resolveIMessageGroupToolPolicy(params){return resolveChannelGroupToolsPolicy({cfg:params.cfg,channel:`imessage`,groupId:params.groupId,accountId:params.accountId,senderId:params.senderId,senderName:params.senderName,senderUsername:params.senderUsername,senderE164:params.senderE164})}function resolveDiscordGroupToolPolicy(params){let guildEntry=resolveDiscordGuildEntry(params.cfg.channels?.discord?.guilds,params.groupSpace),channelEntries=guildEntry?.channels;if(channelEntries&&Object.keys(channelEntries).length>0){let entry=resolveDiscordChannelEntry(channelEntries,params),senderPolicy=resolveToolsBySender({toolsBySender:entry?.toolsBySender,senderId:params.senderId,senderName:params.senderName,senderUsername:params.senderUsername,senderE164:params.senderE164});if(senderPolicy)return senderPolicy;if(entry?.tools)return entry.tools}let guildSenderPolicy=resolveToolsBySender({toolsBySender:guildEntry?.toolsBySender,senderId:params.senderId,senderName:params.senderName,senderUsername:params.senderUsername,senderE164:params.senderE164});if(guildSenderPolicy)return guildSenderPolicy;if(guildEntry?.tools)return guildEntry.tools}function resolveSlackGroupToolPolicy(params){let resolved=resolveSlackChannelPolicyEntry(params);if(!resolved)return;let senderPolicy=resolveToolsBySender({toolsBySender:resolved?.toolsBySender,senderId:params.senderId,senderName:params.senderName,senderUsername:params.senderUsername,senderE164:params.senderE164});if(senderPolicy)return senderPolicy;if(resolved?.tools)return resolved.tools}function normalizeSignalMessagingTarget(raw){let trimmed=raw.trim();if(!trimmed)return;let normalized=trimmed;if(normalized.toLowerCase().startsWith(`signal:`)&&(normalized=normalized.slice(7).trim()),!normalized)return;let lower=normalized.toLowerCase();if(lower.startsWith(`group:`)){let id=normalized.slice(6).trim();return id?`group:${id}`:void 0}if(lower.startsWith(`username:`)){let id=normalized.slice(9).trim();return id?`username:${id}`.toLowerCase():void 0}if(lower.startsWith(`u:`)){let id=normalized.slice(2).trim();return id?`username:${id}`.toLowerCase():void 0}if(lower.startsWith(`uuid:`)){let id=normalized.slice(5).trim();return id?id.toLowerCase():void 0}return normalized.toLowerCase()}const formatLower=allowFrom=>allowFrom.map(entry=>String(entry).trim()).filter(Boolean).map(entry=>entry.toLowerCase()),formatDiscordAllowFrom=allowFrom=>allowFrom.map(entry=>String(entry).trim().replace(/^<@!?/,``).replace(/>$/,``).replace(/^discord:/i,``).replace(/^user:/i,``).replace(/^pk:/i,``).trim().toLowerCase()).filter(Boolean);function resolveDirectOrGroupChannelId(context){return(context.ChatType?.toLowerCase()===`direct`?context.From??context.To:context.To)?.trim()||void 0}function buildSignalThreadToolContext(params){let currentChannelIdRaw=resolveDirectOrGroupChannelId(params.context);return{currentChannelId:currentChannelIdRaw?normalizeSignalMessagingTarget(currentChannelIdRaw)??currentChannelIdRaw.trim():void 0,currentThreadTs:params.context.ReplyToId,hasRepliedRef:params.hasRepliedRef}}function buildIMessageThreadToolContext(params){return{currentChannelId:resolveDirectOrGroupChannelId(params.context),currentThreadTs:params.context.ReplyToId,hasRepliedRef:params.hasRepliedRef}}function resolveCaseInsensitiveAccount(accounts,accountId){if(!accounts)return;let normalized=normalizeAccountId$1(accountId);return accounts[normalized]??accounts[Object.keys(accounts).find(key=>key.toLowerCase()===normalized.toLowerCase())??``]}const DOCKS={telegram:{id:`telegram`,capabilities:{chatTypes:[`direct`,`group`,`channel`,`thread`],nativeCommands:!0,blockStreaming:!0},outbound:{textChunkLimit:4e3},config:{resolveAllowFrom:({cfg,accountId})=>(resolveTelegramAccount({cfg,accountId}).config.allowFrom??[]).map(entry=>String(entry)),formatAllowFrom:({allowFrom})=>allowFrom.map(entry=>String(entry).trim()).filter(Boolean).map(entry=>entry.replace(/^(telegram|tg):/i,``)).map(entry=>entry.toLowerCase())},groups:{resolveRequireMention:resolveTelegramGroupRequireMention,resolveToolPolicy:resolveTelegramGroupToolPolicy},threading:{resolveReplyToMode:({cfg})=>cfg.channels?.telegram?.replyToMode??`off`,buildToolContext:({context,hasRepliedRef})=>{let threadId=context.MessageThreadId??context.ReplyToId;return{currentChannelId:context.To?.trim()||void 0,currentThreadTs:threadId==null?void 0:String(threadId),hasRepliedRef}}}},whatsapp:{id:`whatsapp`,capabilities:{chatTypes:[`direct`,`group`],polls:!0,reactions:!0,media:!0},commands:{enforceOwnerForCommands:!0,skipWhenConfigEmpty:!0},outbound:{textChunkLimit:4e3},config:{resolveAllowFrom:({cfg,accountId})=>resolveWhatsAppAccount({cfg,accountId}).allowFrom??[],formatAllowFrom:({allowFrom})=>allowFrom.map(entry=>String(entry).trim()).filter(entry=>!!entry).map(entry=>entry===`*`?entry:normalizeWhatsAppTarget(entry)).filter(entry=>!!entry)},groups:{resolveRequireMention:resolveWhatsAppGroupRequireMention,resolveToolPolicy:resolveWhatsAppGroupToolPolicy,resolveGroupIntroHint:()=>`WhatsApp IDs: SenderId is the participant JID (group participant id).`},mentions:{stripPatterns:({ctx})=>{let selfE164=(ctx.To??``).replace(/^whatsapp:/,``);if(!selfE164)return[];let escaped=escapeRegExp(selfE164);return[escaped,`@${escaped}`]}},threading:{buildToolContext:({context,hasRepliedRef})=>({currentChannelId:context.From?.trim()||context.To?.trim()||void 0,currentThreadTs:context.ReplyToId,hasRepliedRef})}},discord:{id:`discord`,capabilities:{chatTypes:[`direct`,`channel`,`thread`],polls:!0,reactions:!0,media:!0,nativeCommands:!0,threads:!0},outbound:{textChunkLimit:2e3},streaming:{blockStreamingCoalesceDefaults:{minChars:1500,idleMs:1e3}},elevated:{allowFromFallback:({cfg})=>cfg.channels?.discord?.allowFrom??cfg.channels?.discord?.dm?.allowFrom},config:{resolveAllowFrom:({cfg,accountId})=>{let account=resolveDiscordAccount({cfg,accountId});return(account.config.allowFrom??account.config.dm?.allowFrom??[]).map(entry=>String(entry))},formatAllowFrom:({allowFrom})=>formatDiscordAllowFrom(allowFrom)},groups:{resolveRequireMention:resolveDiscordGroupRequireMention,resolveToolPolicy:resolveDiscordGroupToolPolicy},mentions:{stripPatterns:()=>[`<@!?\\d+>`]},threading:{resolveReplyToMode:({cfg})=>cfg.channels?.discord?.replyToMode??`off`,buildToolContext:({context,hasRepliedRef})=>({currentChannelId:context.To?.trim()||void 0,currentThreadTs:context.ReplyToId,hasRepliedRef})}},irc:{id:`irc`,capabilities:{chatTypes:[`direct`,`group`],media:!0,blockStreaming:!0},outbound:{textChunkLimit:350},streaming:{blockStreamingCoalesceDefaults:{minChars:300,idleMs:1e3}},config:{resolveAllowFrom:({cfg,accountId})=>{let channel=cfg.channels?.irc;return(resolveCaseInsensitiveAccount(channel?.accounts,accountId)?.allowFrom??channel?.allowFrom??[]).map(entry=>String(entry))},formatAllowFrom:({allowFrom})=>allowFrom.map(entry=>String(entry).trim()).filter(Boolean).map(entry=>entry.replace(/^irc:/i,``).replace(/^user:/i,``).toLowerCase())},groups:{resolveRequireMention:({cfg,accountId,groupId})=>groupId?resolveChannelGroupRequireMention({cfg,channel:`irc`,groupId,accountId,groupIdCaseInsensitive:!0}):!0,resolveToolPolicy:({cfg,accountId,groupId,senderId,senderName,senderUsername})=>{if(groupId)return resolveChannelGroupToolsPolicy({cfg,channel:`irc`,groupId,accountId,groupIdCaseInsensitive:!0,senderId,senderName,senderUsername})}}},googlechat:{id:`googlechat`,capabilities:{chatTypes:[`direct`,`group`,`thread`],reactions:!0,media:!0,threads:!0,blockStreaming:!0},outbound:{textChunkLimit:4e3},config:{resolveAllowFrom:({cfg,accountId})=>{let channel=cfg.channels?.googlechat;return(resolveCaseInsensitiveAccount(channel?.accounts,accountId)?.dm?.allowFrom??channel?.dm?.allowFrom??[]).map(entry=>String(entry))},formatAllowFrom:({allowFrom})=>allowFrom.map(entry=>String(entry).trim()).filter(Boolean).map(entry=>entry.replace(/^(googlechat|google-chat|gchat):/i,``).replace(/^user:/i,``).replace(/^users\//i,``).toLowerCase())},groups:{resolveRequireMention:resolveGoogleChatGroupRequireMention,resolveToolPolicy:resolveGoogleChatGroupToolPolicy},threading:{resolveReplyToMode:({cfg})=>cfg.channels?.googlechat?.replyToMode??`off`,buildToolContext:({context,hasRepliedRef})=>{let threadId=context.MessageThreadId??context.ReplyToId;return{currentChannelId:context.To?.trim()||void 0,currentThreadTs:threadId==null?void 0:String(threadId),hasRepliedRef}}}},slack:{id:`slack`,capabilities:{chatTypes:[`direct`,`channel`,`thread`],reactions:!0,media:!0,nativeCommands:!0,threads:!0},outbound:{textChunkLimit:4e3},streaming:{blockStreamingCoalesceDefaults:{minChars:1500,idleMs:1e3}},config:{resolveAllowFrom:({cfg,accountId})=>{let account=resolveSlackAccount({cfg,accountId});return(account.config.allowFrom??account.dm?.allowFrom??[]).map(entry=>String(entry))},formatAllowFrom:({allowFrom})=>formatLower(allowFrom)},groups:{resolveRequireMention:resolveSlackGroupRequireMention,resolveToolPolicy:resolveSlackGroupToolPolicy},mentions:{stripPatterns:()=>[`<@[^>]+>`]},threading:{resolveReplyToMode:({cfg,accountId,chatType})=>resolveSlackReplyToMode(resolveSlackAccount({cfg,accountId}),chatType),allowExplicitReplyTagsWhenOff:!0,buildToolContext:params=>buildSlackThreadingToolContext(params)}},signal:{id:`signal`,capabilities:{chatTypes:[`direct`,`group`],reactions:!0,media:!0},outbound:{textChunkLimit:4e3},streaming:{blockStreamingCoalesceDefaults:{minChars:1500,idleMs:1e3}},config:{resolveAllowFrom:({cfg,accountId})=>(resolveSignalAccount({cfg,accountId}).config.allowFrom??[]).map(entry=>String(entry)),formatAllowFrom:({allowFrom})=>allowFrom.map(entry=>String(entry).trim()).filter(Boolean).map(entry=>entry===`*`?`*`:normalizeE164(entry.replace(/^signal:/i,``))).filter(Boolean)},threading:{buildToolContext:({context,hasRepliedRef})=>buildSignalThreadToolContext({context,hasRepliedRef})}},imessage:{id:`imessage`,capabilities:{chatTypes:[`direct`,`group`],reactions:!0,media:!0},outbound:{textChunkLimit:4e3},config:{resolveAllowFrom:({cfg,accountId})=>(resolveIMessageAccount({cfg,accountId}).config.allowFrom??[]).map(entry=>String(entry)),formatAllowFrom:({allowFrom})=>allowFrom.map(entry=>String(entry).trim()).filter(Boolean)},groups:{resolveRequireMention:resolveIMessageGroupRequireMention,resolveToolPolicy:resolveIMessageGroupToolPolicy},threading:{buildToolContext:({context,hasRepliedRef})=>buildIMessageThreadToolContext({context,hasRepliedRef})}}};function buildDockFromPlugin(plugin){return{id:plugin.id,capabilities:plugin.capabilities,commands:plugin.commands,outbound:plugin.outbound?.textChunkLimit?{textChunkLimit:plugin.outbound.textChunkLimit}:void 0,streaming:plugin.streaming?{blockStreamingCoalesceDefaults:plugin.streaming.blockStreamingCoalesceDefaults}:void 0,elevated:plugin.elevated,config:plugin.config?{resolveAllowFrom:plugin.config.resolveAllowFrom,formatAllowFrom:plugin.config.formatAllowFrom}:void 0,groups:plugin.groups,mentions:plugin.mentions,threading:plugin.threading,agentPrompt:plugin.agentPrompt}}function listPluginDockEntries(){let registry=requireActivePluginRegistry(),entries=[],seen=new Set;for(let entry of registry.channels){let plugin=entry.plugin,id=String(plugin.id).trim();if(!id||seen.has(id)||(seen.add(id),CHAT_CHANNEL_ORDER.includes(plugin.id)))continue;let dock=entry.dock??buildDockFromPlugin(plugin);entries.push({id:plugin.id,dock,order:plugin.meta.order})}return entries}function listChannelDocks(){let baseEntries=CHAT_CHANNEL_ORDER.map(id=>({id,dock:DOCKS[id],order:getChatChannelMeta(id).order})),pluginEntries=listPluginDockEntries(),combined=[...baseEntries,...pluginEntries];return combined.sort((a,b)=>{let indexA=CHAT_CHANNEL_ORDER.indexOf(a.id),indexB=CHAT_CHANNEL_ORDER.indexOf(b.id),orderA=a.order??(indexA===-1?999:indexA),orderB=b.order??(indexB===-1?999:indexB);return orderA===orderB?String(a.id).localeCompare(String(b.id)):orderA-orderB}),combined.map(entry=>entry.dock)}function getChannelDock(id){let core=DOCKS[id];if(core)return core;let pluginEntry=requireActivePluginRegistry().channels.find(entry=>entry.plugin.id===id);if(pluginEntry)return pluginEntry.dock??buildDockFromPlugin(pluginEntry.plugin)}const mergeOrigin=(existing,next)=>{if(!existing&&!next)return;let merged=existing?{...existing}:{};return next?.label&&(merged.label=next.label),next?.provider&&(merged.provider=next.provider),next?.surface&&(merged.surface=next.surface),next?.chatType&&(merged.chatType=next.chatType),next?.from&&(merged.from=next.from),next?.to&&(merged.to=next.to),next?.accountId&&(merged.accountId=next.accountId),next?.threadId!=null&&next.threadId!==``&&(merged.threadId=next.threadId),Object.keys(merged).length>0?merged:void 0};function deriveSessionOrigin(ctx){let label=resolveConversationLabel(ctx)?.trim(),provider=normalizeMessageChannel(typeof ctx.OriginatingChannel==`string`&&ctx.OriginatingChannel||ctx.Surface||ctx.Provider),surface=ctx.Surface?.trim().toLowerCase(),chatType=normalizeChatType(ctx.ChatType)??void 0,from=ctx.From?.trim(),to=(typeof ctx.OriginatingTo==`string`?ctx.OriginatingTo:ctx.To)?.trim()??void 0,accountId=ctx.AccountId?.trim(),threadId=ctx.MessageThreadId??void 0,origin={};return label&&(origin.label=label),provider&&(origin.provider=provider),surface&&(origin.surface=surface),chatType&&(origin.chatType=chatType),from&&(origin.from=from),to&&(origin.to=to),accountId&&(origin.accountId=accountId),threadId!=null&&threadId!==``&&(origin.threadId=threadId),Object.keys(origin).length>0?origin:void 0}function snapshotSessionOrigin(entry){if(entry?.origin)return{...entry.origin}}function deriveGroupSessionPatch(params){let resolution=params.groupResolution??resolveGroupSessionKey(params.ctx);if(!resolution?.channel)return null;let channel=resolution.channel,subject=params.ctx.GroupSubject?.trim(),space=params.ctx.GroupSpace?.trim(),explicitChannel=params.ctx.GroupChannel?.trim(),normalizedChannel=normalizeChannelId(channel),isChannelProvider=!!(normalizedChannel&&getChannelDock(normalizedChannel)?.capabilities.chatTypes.includes(`channel`)),nextGroupChannel=explicitChannel??((resolution.chatType===`channel`||isChannelProvider)&&subject&&subject.startsWith(`#`)?subject:void 0),nextSubject=nextGroupChannel?void 0:subject,patch={chatType:resolution.chatType??`group`,channel,groupId:resolution.id};nextSubject&&(patch.subject=nextSubject),nextGroupChannel&&(patch.groupChannel=nextGroupChannel),space&&(patch.space=space);let displayName=buildGroupDisplayName({provider:channel,subject:nextSubject??params.existing?.subject,groupChannel:nextGroupChannel??params.existing?.groupChannel,space:space??params.existing?.space,id:resolution.id,key:params.sessionKey});return displayName&&(patch.displayName=displayName),patch}function deriveSessionMetaPatch(params){let groupPatch=deriveGroupSessionPatch(params),origin=deriveSessionOrigin(params.ctx);if(!groupPatch&&!origin)return null;let patch=groupPatch?{...groupPatch}:{},mergedOrigin=mergeOrigin(params.existing?.origin,origin);return mergedOrigin&&(patch.origin=mergedOrigin),Object.keys(patch).length>0?patch:null}function resolveMainSessionKey(cfg){if(cfg?.session?.scope===`global`)return`global`;let agents=cfg?.agents?.list??[];return buildAgentMainSessionKey({agentId:normalizeAgentId(agents.find(agent=>agent?.default)?.id??agents[0]?.id??DEFAULT_AGENT_ID),mainKey:normalizeMainKey(cfg?.session?.mainKey)})}function resolveMainSessionKeyFromConfig(){return resolveMainSessionKey(loadConfig())}function resolveAgentMainSessionKey(params){let mainKey=normalizeMainKey(params.cfg?.session?.mainKey);return buildAgentMainSessionKey({agentId:params.agentId,mainKey})}function resolveExplicitAgentSessionKey(params){let agentId=params.agentId?.trim();if(agentId)return resolveAgentMainSessionKey({cfg:params.cfg,agentId})}function canonicalizeMainSessionAlias(params){let raw=params.sessionKey.trim();if(!raw)return raw;let agentId=normalizeAgentId(params.agentId),mainKey=normalizeMainKey(params.cfg?.session?.mainKey),agentMainSessionKey=buildAgentMainSessionKey({agentId,mainKey}),agentMainAliasKey=buildAgentMainSessionKey({agentId,mainKey:`main`}),isMainAlias=raw===`main`||raw===mainKey||raw===agentMainSessionKey||raw===agentMainAliasKey;return params.cfg?.session?.scope===`global`&&isMainAlias?`global`:isMainAlias?agentMainSessionKey:raw}function mergeSessionEntry(existing,patch){let sessionId=patch.sessionId??existing?.sessionId??crypto.randomUUID(),updatedAt=Math.max(existing?.updatedAt??0,patch.updatedAt??0,Date.now());return existing?{...existing,...patch,sessionId,updatedAt}:{...patch,sessionId,updatedAt}}function resolveFreshSessionTotalTokens(entry){let total=entry?.totalTokens;if(!(typeof total!=`number`||!Number.isFinite(total)||total<0)&&entry?.totalTokensFresh!==!1)return total}const DEFAULT_RESET_TRIGGERS=[`/new`,`/reset`],THREAD_SESSION_MARKERS=[`:thread:`,`:topic:`],GROUP_SESSION_MARKERS=[`:group:`,`:channel:`];function isThreadSessionKey(sessionKey){let normalized=(sessionKey??``).toLowerCase();return normalized?THREAD_SESSION_MARKERS.some(marker=>normalized.includes(marker)):!1}function resolveSessionResetType(params){if(params.isThread||isThreadSessionKey(params.sessionKey))return`thread`;if(params.isGroup)return`group`;let normalized=(params.sessionKey??``).toLowerCase();return GROUP_SESSION_MARKERS.some(marker=>normalized.includes(marker))?`group`:`direct`}function resolveThreadFlag(params){return params.messageThreadId!=null||params.threadLabel?.trim()||params.threadStarterBody?.trim()||params.parentSessionKey?.trim()?!0:isThreadSessionKey(params.sessionKey)}function resolveDailyResetAtMs(now,atHour){let normalizedAtHour=normalizeResetAtHour(atHour),resetAt=new Date(now);return resetAt.setHours(normalizedAtHour,0,0,0),now<resetAt.getTime()&&resetAt.setDate(resetAt.getDate()-1),resetAt.getTime()}function resolveSessionResetPolicy(params){let sessionCfg=params.sessionCfg,baseReset=params.resetOverride??sessionCfg?.reset,typeReset=params.resetOverride?void 0:sessionCfg?.resetByType?.[params.resetType]??(params.resetType===`direct`?sessionCfg?.resetByType?.dm:void 0),hasExplicitReset=!!(baseReset||sessionCfg?.resetByType),legacyIdleMinutes=params.resetOverride?void 0:sessionCfg?.idleMinutes,mode=typeReset?.mode??baseReset?.mode??(!hasExplicitReset&&legacyIdleMinutes!=null?`idle`:`daily`),atHour=normalizeResetAtHour(typeReset?.atHour??baseReset?.atHour??4),idleMinutesRaw=typeReset?.idleMinutes??baseReset?.idleMinutes??legacyIdleMinutes,idleMinutes;if(idleMinutesRaw!=null){let normalized=Math.floor(idleMinutesRaw);Number.isFinite(normalized)&&(idleMinutes=Math.max(normalized,1))}else mode===`idle`&&(idleMinutes=60);return{mode,atHour,idleMinutes}}function resolveChannelResetConfig(params){let resetByChannel=params.sessionCfg?.resetByChannel;if(!resetByChannel)return;let normalized=normalizeMessageChannel(params.channel),fallback=params.channel?.trim().toLowerCase(),key=normalized??fallback;if(key)return resetByChannel[key]??resetByChannel[key.toLowerCase()]}function evaluateSessionFreshness(params){let dailyResetAt=params.policy.mode===`daily`?resolveDailyResetAtMs(params.now,params.policy.atHour):void 0,idleExpiresAt=params.policy.idleMinutes==null?void 0:params.updatedAt+params.policy.idleMinutes*6e4,staleDaily=dailyResetAt!=null&¶ms.updatedAt<dailyResetAt,staleIdle=idleExpiresAt!=null&¶ms.now>idleExpiresAt;return{fresh:!(staleDaily||staleIdle),dailyResetAt,idleExpiresAt}}function normalizeResetAtHour(value){if(typeof value!=`number`||!Number.isFinite(value))return 4;let normalized=Math.floor(value);return Number.isFinite(normalized)?normalized<0?0:normalized>23?23:normalized:4}function deriveSessionKey(scope,ctx){if(scope===`global`)return`global`;let resolvedGroup=resolveGroupSessionKey(ctx);return resolvedGroup?resolvedGroup.key:(ctx.From?normalizeE164(ctx.From):``)||`unknown`}function resolveSessionKey(scope,ctx,mainKey){let explicit=ctx.SessionKey?.trim();if(explicit)return explicit.toLowerCase();let raw=deriveSessionKey(scope,ctx);if(scope===`global`)return raw;let canonical=buildAgentMainSessionKey({agentId:DEFAULT_AGENT_ID,mainKey:normalizeMainKey(mainKey)});return raw.includes(`:group:`)||raw.includes(`:channel:`)?`agent:${DEFAULT_AGENT_ID}:${raw}`:canonical}const ENVELOPE_PREFIX=/^\[([^\]]+)\]\s*/,ENVELOPE_CHANNELS=[`WebChat`,`WhatsApp`,`Telegram`,`Signal`,`Slack`,`Discord`,`Google Chat`,`iMessage`,`Teams`,`Matrix`,`Zalo`,`Zalo Personal`,`BlueBubbles`],MESSAGE_ID_LINE=/^\s*\[message_id:\s*[^\]]+\]\s*$/i;function looksLikeEnvelopeHeader(header){return/\d{4}-\d{2}-\d{2}T\d{2}:\d{2}Z\b/.test(header)||/\d{4}-\d{2}-\d{2} \d{2}:\d{2}\b/.test(header)?!0:ENVELOPE_CHANNELS.some(label=>header.startsWith(`${label} `))}function stripEnvelope(text){let match=text.match(ENVELOPE_PREFIX);return!match||!looksLikeEnvelopeHeader(match[1]??``)?text:text.slice(match[0].length)}function stripMessageIdHints(text){if(!text.includes(`[message_id:`))return text;let lines=text.split(/\r?\n/),filtered=lines.filter(line=>!MESSAGE_ID_LINE.test(line));return filtered.length===lines.length?text:filtered.join(`
|
|
1
|
+
import{y as resolveRequiredHomeDir}from"./paths-BHg-VHB4.js";import{f as requireActivePluginRegistry,n as CHAT_CHANNEL_ORDER,o as getChatChannelMeta}from"./registry-Cv7CoWAs.js";import{c as escapeRegExp,m as normalizeE164}from"./utils-BP60e80M.js";import{t as createSubsystemLogger}from"./subsystem-C4b1Von0.js";import{D as resolveProcessScopedMap,Ht as CURRENT_SESSION_VERSION,O as isPidAlive,Ut as SessionManager}from"./auth-profiles-pt7Tr4HA.js";import{a as buildAgentMainSessionKey,d as normalizeAgentId,f as normalizeMainKey,r as DEFAULT_AGENT_ID,u as normalizeAccountId$1}from"./session-key-CksCYipj.js";import{m as parseByteSize,r as loadConfig,y as parseDurationMs}from"./io-D9hC2aG0.js";import{c as listDeliverableMessageChannels,l as normalizeMessageChannel}from"./message-channel-z5YRpR2d.js";import{r as hasInterSessionUserProvenance}from"./input-provenance-Rnkkt19n.js";import{_ as resolveDiscordAccount,a as normalizeWhatsAppTarget,d as resolveSlackAccount,f as resolveSlackReplyToMode,l as resolveTelegramAccount,r as normalizeChannelId}from"./plugins-1Mn6RiNf.js";import{n as resolveWhatsAppAccount}from"./accounts-BkTLjSrD.js";import{t as normalizeChatType}from"./chat-type-BSDVym_t.js";import{n as resolveSignalAccount}from"./accounts-Cx82nj4E.js";import{t as resolveConversationLabel}from"./conversation-label-YgiB0mdr.js";import{t as resolveIMessageAccount}from"./accounts-DcoaLXKI.js";import{a as resolveSessionTranscriptPathInDir,c as resolveStorePath,i as resolveSessionTranscriptPath,n as resolveSessionFilePath,t as resolveDefaultSessionStorePath}from"./paths-ClsbsPQP.js";import{n as extractToolCallNames,r as hasToolCall}from"./transcript-tools-tpHa22sp.js";import{t as emitSessionTranscriptUpdate}from"./transcript-events-XyildGuH.js";import os from"node:os";import path from"node:path";import fs from"node:fs";import crypto from"node:crypto";import fs$1 from"node:fs/promises";function normalizeAccountId(value){if(typeof value==`string`)return value.trim()||void 0}function normalizeDeliveryContext(context){if(!context)return;let channel=typeof context.channel==`string`?normalizeMessageChannel(context.channel)??context.channel.trim():void 0,to=typeof context.to==`string`?context.to.trim():void 0,accountId=normalizeAccountId(context.accountId),threadId=typeof context.threadId==`number`&&Number.isFinite(context.threadId)?Math.trunc(context.threadId):typeof context.threadId==`string`?context.threadId.trim():void 0,normalizedThreadId=typeof threadId==`string`?threadId||void 0:threadId;if(!channel&&!to&&!accountId&&normalizedThreadId==null)return;let normalized={channel:channel||void 0,to:to||void 0,accountId};return normalizedThreadId!=null&&(normalized.threadId=normalizedThreadId),normalized}function normalizeSessionDeliveryFields(source){if(!source)return{deliveryContext:void 0,lastChannel:void 0,lastTo:void 0,lastAccountId:void 0,lastThreadId:void 0};let merged=mergeDeliveryContext(normalizeDeliveryContext({channel:source.lastChannel??source.channel,to:source.lastTo,accountId:source.lastAccountId,threadId:source.lastThreadId}),normalizeDeliveryContext(source.deliveryContext));return merged?{deliveryContext:merged,lastChannel:merged.channel,lastTo:merged.to,lastAccountId:merged.accountId,lastThreadId:merged.threadId}:{deliveryContext:void 0,lastChannel:void 0,lastTo:void 0,lastAccountId:void 0,lastThreadId:void 0}}function deliveryContextFromSession(entry){if(entry)return normalizeSessionDeliveryFields({channel:entry.channel,lastChannel:entry.lastChannel,lastTo:entry.lastTo,lastAccountId:entry.lastAccountId,lastThreadId:entry.lastThreadId??entry.deliveryContext?.threadId??entry.origin?.threadId,deliveryContext:entry.deliveryContext}).deliveryContext}function mergeDeliveryContext(primary,fallback){let normalizedPrimary=normalizeDeliveryContext(primary),normalizedFallback=normalizeDeliveryContext(fallback);if(!(!normalizedPrimary&&!normalizedFallback))return normalizeDeliveryContext({channel:normalizedPrimary?.channel??normalizedFallback?.channel,to:normalizedPrimary?.to??normalizedFallback?.to,accountId:normalizedPrimary?.accountId??normalizedFallback?.accountId,threadId:normalizedPrimary?.threadId??normalizedFallback?.threadId})}function deliveryContextKey(context){let normalized=normalizeDeliveryContext(context);if(!normalized?.channel||!normalized?.to)return;let threadId=normalized.threadId!=null&&normalized.threadId!==``?String(normalized.threadId):``;return`${normalized.channel}|${normalized.to}|${normalized.accountId??``}|${threadId}`}const CLEANUP_SIGNALS=[`SIGINT`,`SIGTERM`,`SIGQUIT`,`SIGABRT`],CLEANUP_STATE_KEY=Symbol.for(`builderforce.sessionWriteLockCleanupState`),HELD_LOCKS_KEY=Symbol.for(`builderforce.sessionWriteLockHeldLocks`),WATCHDOG_STATE_KEY=Symbol.for(`builderforce.sessionWriteLockWatchdogState`),DEFAULT_STALE_MS=1800*1e3,DEFAULT_MAX_HOLD_MS=300*1e3,DEFAULT_WATCHDOG_INTERVAL_MS=6e4,MAX_LOCK_HOLD_MS=2147e6,HELD_LOCKS=resolveProcessScopedMap(HELD_LOCKS_KEY);function resolveCleanupState(){let proc=process;return proc[CLEANUP_STATE_KEY]||(proc[CLEANUP_STATE_KEY]={registered:!1,cleanupHandlers:new Map}),proc[CLEANUP_STATE_KEY]}function resolveWatchdogState(){let proc=process;return proc[WATCHDOG_STATE_KEY]||(proc[WATCHDOG_STATE_KEY]={started:!1,intervalMs:DEFAULT_WATCHDOG_INTERVAL_MS}),proc[WATCHDOG_STATE_KEY]}function resolvePositiveMs(value,fallback,opts={}){return typeof value!=`number`||Number.isNaN(value)||value<=0?fallback:value===1/0?opts.allowInfinity?value:fallback:Number.isFinite(value)?value:fallback}function resolveSessionLockMaxHoldFromTimeout(params){let minMs=resolvePositiveMs(params.minMs,DEFAULT_MAX_HOLD_MS),timeoutMs=resolvePositiveMs(params.timeoutMs,minMs,{allowInfinity:!0});if(timeoutMs===1/0)return MAX_LOCK_HOLD_MS;let graceMs=resolvePositiveMs(params.graceMs,12e4);return Math.min(MAX_LOCK_HOLD_MS,Math.max(minMs,timeoutMs+graceMs))}async function releaseHeldLock(normalizedSessionFile,held,opts={}){if(HELD_LOCKS.get(normalizedSessionFile)!==held)return!1;if(opts.force)held.count=0;else if(--held.count,held.count>0)return!1;if(held.releasePromise)return await held.releasePromise.catch(()=>void 0),!0;HELD_LOCKS.delete(normalizedSessionFile),held.releasePromise=(async()=>{try{await held.handle.close()}catch{}try{await fs$1.rm(held.lockPath,{force:!0})}catch{}})();try{return await held.releasePromise,!0}finally{held.releasePromise=void 0}}function releaseAllLocksSync(){for(let[sessionFile,held]of HELD_LOCKS){try{typeof held.handle.close==`function`&&held.handle.close().catch(()=>{})}catch{}try{fs.rmSync(held.lockPath,{force:!0})}catch{}HELD_LOCKS.delete(sessionFile)}}async function runLockWatchdogCheck(nowMs=Date.now()){let released=0;for(let[sessionFile,held]of HELD_LOCKS.entries()){let heldForMs=nowMs-held.acquiredAt;heldForMs<=held.maxHoldMs||(console.warn(`[session-write-lock] releasing lock held for ${heldForMs}ms (max=${held.maxHoldMs}ms): ${held.lockPath}`),await releaseHeldLock(sessionFile,held,{force:!0})&&(released+=1))}return released}function ensureWatchdogStarted(intervalMs){let watchdogState=resolveWatchdogState();watchdogState.started||(watchdogState.started=!0,watchdogState.intervalMs=intervalMs,watchdogState.timer=setInterval(()=>{runLockWatchdogCheck().catch(()=>{})},intervalMs),watchdogState.timer.unref?.())}function handleTerminationSignal(signal){releaseAllLocksSync();let cleanupState=resolveCleanupState();if(process.listenerCount(signal)===1){let handler=cleanupState.cleanupHandlers.get(signal);handler&&(process.off(signal,handler),cleanupState.cleanupHandlers.delete(signal));try{process.kill(process.pid,signal)}catch{}}}function registerCleanupHandlers(){let cleanupState=resolveCleanupState();cleanupState.registered||(cleanupState.registered=!0,process.on(`exit`,()=>{releaseAllLocksSync()})),ensureWatchdogStarted(DEFAULT_WATCHDOG_INTERVAL_MS);for(let signal of CLEANUP_SIGNALS)if(!cleanupState.cleanupHandlers.has(signal))try{let handler=()=>handleTerminationSignal(signal);cleanupState.cleanupHandlers.set(signal,handler),process.on(signal,handler)}catch{}}async function readLockPayload(lockPath){try{let raw=await fs$1.readFile(lockPath,`utf8`),parsed=JSON.parse(raw),payload={};return typeof parsed.pid==`number`&&(payload.pid=parsed.pid),typeof parsed.createdAt==`string`&&(payload.createdAt=parsed.createdAt),payload}catch{return null}}function inspectLockPayload(payload,staleMs,nowMs){let pid=typeof payload?.pid==`number`?payload.pid:null,pidAlive=pid===null?!1:isPidAlive(pid),createdAt=typeof payload?.createdAt==`string`?payload.createdAt:null,createdAtMs=createdAt?Date.parse(createdAt):NaN,ageMs=Number.isFinite(createdAtMs)?Math.max(0,nowMs-createdAtMs):null,staleReasons=[];return pid===null?staleReasons.push(`missing-pid`):pidAlive||staleReasons.push(`dead-pid`),ageMs===null?staleReasons.push(`invalid-createdAt`):ageMs>staleMs&&staleReasons.push(`too-old`),{pid,pidAlive,createdAt,ageMs,stale:staleReasons.length>0,staleReasons}}async function cleanStaleLockFiles(params){let sessionsDir=path.resolve(params.sessionsDir),staleMs=resolvePositiveMs(params.staleMs,DEFAULT_STALE_MS),removeStale=params.removeStale!==!1,nowMs=params.nowMs??Date.now(),entries=[];try{entries=await fs$1.readdir(sessionsDir,{withFileTypes:!0})}catch(err){if(err.code===`ENOENT`)return{locks:[],cleaned:[]};throw err}let locks=[],cleaned=[],lockEntries=entries.filter(entry=>entry.name.endsWith(`.jsonl.lock`)).toSorted((a,b)=>a.name.localeCompare(b.name));for(let entry of lockEntries){let lockPath=path.join(sessionsDir,entry.name),lockInfo={lockPath,...inspectLockPayload(await readLockPayload(lockPath),staleMs,nowMs),removed:!1};lockInfo.stale&&removeStale&&(await fs$1.rm(lockPath,{force:!0}),lockInfo.removed=!0,cleaned.push(lockInfo),params.log?.warn?.(`removed stale session lock: ${lockPath} (${lockInfo.staleReasons.join(`, `)||`unknown`})`)),locks.push(lockInfo)}return{locks,cleaned}}async function acquireSessionWriteLock(params){registerCleanupHandlers();let timeoutMs=resolvePositiveMs(params.timeoutMs,1e4,{allowInfinity:!0}),staleMs=resolvePositiveMs(params.staleMs,DEFAULT_STALE_MS),maxHoldMs=resolvePositiveMs(params.maxHoldMs,DEFAULT_MAX_HOLD_MS),sessionFile=path.resolve(params.sessionFile),sessionDir=path.dirname(sessionFile);await fs$1.mkdir(sessionDir,{recursive:!0});let normalizedDir=sessionDir;try{normalizedDir=await fs$1.realpath(sessionDir)}catch{}let normalizedSessionFile=path.join(normalizedDir,path.basename(sessionFile)),lockPath=`${normalizedSessionFile}.lock`,allowReentrant=params.allowReentrant??!0,held=HELD_LOCKS.get(normalizedSessionFile);if(allowReentrant&&held)return held.count+=1,{release:async()=>{await releaseHeldLock(normalizedSessionFile,held)}};let startedAt=Date.now(),attempt=0;for(;Date.now()-startedAt<timeoutMs;){attempt+=1;try{let handle=await fs$1.open(lockPath,`wx`),createdAt=new Date().toISOString();await handle.writeFile(JSON.stringify({pid:process.pid,createdAt},null,2),`utf8`);let createdHeld={count:1,handle,lockPath,acquiredAt:Date.now(),maxHoldMs};return HELD_LOCKS.set(normalizedSessionFile,createdHeld),{release:async()=>{await releaseHeldLock(normalizedSessionFile,createdHeld)}}}catch(err){if(err.code!==`EEXIST`)throw err;if(inspectLockPayload(await readLockPayload(lockPath),staleMs,Date.now()).stale){await fs$1.rm(lockPath,{force:!0});continue}let delay=Math.min(1e3,50*attempt);await new Promise(r=>setTimeout(r,delay))}}let payload=await readLockPayload(lockPath),owner=typeof payload?.pid==`number`?`pid=${payload.pid}`:`unknown`;throw Error(`session file locked (timeout ${timeoutMs}ms): ${owner} ${lockPath}`)}[...CLEANUP_SIGNALS];function normalizeStringEntries(list){return(list??[]).map(entry=>String(entry).trim()).filter(Boolean)}function normalizeStringEntriesLower(list){return normalizeStringEntries(list).map(entry=>entry.toLowerCase())}function normalizeHyphenSlug(raw){let trimmed=raw?.trim().toLowerCase()??``;return trimmed?trimmed.replace(/\s+/g,`-`).replace(/[^a-z0-9#@._+-]+/g,`-`).replace(/-{2,}/g,`-`).replace(/^[-.]+|[-.]+$/g,``):``}function normalizeAtHashSlug(raw){let trimmed=raw?.trim().toLowerCase()??``;return trimmed?trimmed.replace(/^[@#]+/,``).replace(/[\s_]+/g,`-`).replace(/[^a-z0-9-]+/g,`-`).replace(/-{2,}/g,`-`).replace(/^-+|-+$/g,``):``}const getGroupSurfaces=()=>new Set([...listDeliverableMessageChannels(),`webchat`]);function normalizeGroupLabel(raw){return normalizeHyphenSlug(raw)}function shortenGroupId(value){let trimmed=value?.trim()??``;return trimmed?trimmed.length<=14?trimmed:`${trimmed.slice(0,6)}...${trimmed.slice(-4)}`:``}function buildGroupDisplayName(params){let providerKey=(params.provider?.trim().toLowerCase()||`group`).trim(),groupChannel=params.groupChannel?.trim(),space=params.space?.trim(),subject=params.subject?.trim(),detail=(groupChannel&&space?`${space}${groupChannel.startsWith(`#`)?``:`#`}${groupChannel}`:groupChannel||subject||space||``)||``,fallbackId=params.id?.trim()||params.key,rawLabel=detail||fallbackId,token=normalizeGroupLabel(rawLabel);return token||=normalizeGroupLabel(shortenGroupId(rawLabel)),!params.groupChannel&&token.startsWith(`#`)&&(token=token.replace(/^#+/,``)),token&&!/^[@#]/.test(token)&&!token.startsWith(`g-`)&&!token.includes(`#`)&&(token=`g-${token}`),token?`${providerKey}:${token}`:providerKey}function resolveGroupSessionKey(ctx){let from=typeof ctx.From==`string`?ctx.From.trim():``,chatType=ctx.ChatType?.trim().toLowerCase(),normalizedChatType=chatType===`channel`?`channel`:chatType===`group`?`group`:void 0,isWhatsAppGroupId=from.toLowerCase().endsWith(`@g.us`);if(!(normalizedChatType===`group`||normalizedChatType===`channel`||from.includes(`:group:`)||from.includes(`:channel:`)||isWhatsAppGroupId))return null;let providerHint=ctx.Provider?.trim().toLowerCase(),parts=from.split(`:`).filter(Boolean),head=parts[0]?.trim().toLowerCase()??``,headIsSurface=head?getGroupSurfaces().has(head):!1,provider=headIsSurface?head:providerHint??(isWhatsAppGroupId?`whatsapp`:void 0);if(!provider)return null;let second=parts[1]?.trim().toLowerCase(),secondIsKind=second===`group`||second===`channel`,kind=secondIsKind?second:from.includes(`:channel:`)||normalizedChatType===`channel`?`channel`:`group`,finalId=(headIsSurface?secondIsKind?parts.slice(2).join(`:`):parts.slice(1).join(`:`):from).trim().toLowerCase();return finalId?{key:`${provider}:${kind}:${finalId}`,channel:provider,id:finalId,chatType:kind===`channel`?`channel`:`group`}:null}function resolveChannelGroupConfig(groups,groupId,caseInsensitive=!1){if(!groups)return;let direct=groups[groupId];if(direct)return direct;if(!caseInsensitive)return;let target=groupId.toLowerCase(),matchedKey=Object.keys(groups).find(key=>key!==`*`&&key.toLowerCase()===target);if(matchedKey)return groups[matchedKey]}function normalizeSenderKey(value){let trimmed=value.trim();return trimmed?(trimmed.startsWith(`@`)?trimmed.slice(1):trimmed).toLowerCase():``}function resolveToolsBySender(params){let toolsBySender=params.toolsBySender;if(!toolsBySender)return;let entries=Object.entries(toolsBySender);if(entries.length===0)return;let normalized=new Map,wildcard;for(let[rawKey,policy]of entries){if(!policy)continue;let key=normalizeSenderKey(rawKey);if(key){if(key===`*`){wildcard=policy;continue}normalized.has(key)||normalized.set(key,policy)}}let candidates=[],pushCandidate=value=>{let trimmed=value?.trim();trimmed&&candidates.push(trimmed)};pushCandidate(params.senderId),pushCandidate(params.senderE164),pushCandidate(params.senderUsername),pushCandidate(params.senderName);for(let candidate of candidates){let key=normalizeSenderKey(candidate);if(!key)continue;let match=normalized.get(key);if(match)return match}return wildcard}function resolveChannelGroups(cfg,channel,accountId){let normalizedAccountId=normalizeAccountId$1(accountId),channelConfig=cfg.channels?.[channel];if(channelConfig)return channelConfig.accounts?.[normalizedAccountId]?.groups??channelConfig.accounts?.[Object.keys(channelConfig.accounts??{}).find(key=>key.toLowerCase()===normalizedAccountId.toLowerCase())??``]?.groups??channelConfig.groups}function resolveChannelGroupPolicy(params){let{cfg,channel}=params,groups=resolveChannelGroups(cfg,channel,params.accountId),allowlistEnabled=!!(groups&&Object.keys(groups).length>0),normalizedId=params.groupId?.trim(),groupConfig=normalizedId?resolveChannelGroupConfig(groups,normalizedId,params.groupIdCaseInsensitive):void 0,defaultConfig=groups?.[`*`];return{allowlistEnabled,allowed:!allowlistEnabled||allowlistEnabled&&!!(groups&&Object.hasOwn(groups,`*`))||!!groupConfig,groupConfig,defaultConfig}}function resolveChannelGroupRequireMention(params){let{requireMentionOverride,overrideOrder=`after-config`}=params,{groupConfig,defaultConfig}=resolveChannelGroupPolicy(params),configMention=typeof groupConfig?.requireMention==`boolean`?groupConfig.requireMention:typeof defaultConfig?.requireMention==`boolean`?defaultConfig.requireMention:void 0;return overrideOrder===`before-config`&&typeof requireMentionOverride==`boolean`?requireMentionOverride:typeof configMention==`boolean`?configMention:overrideOrder!==`before-config`&&typeof requireMentionOverride==`boolean`?requireMentionOverride:!0}function resolveChannelGroupToolsPolicy(params){let{groupConfig,defaultConfig}=resolveChannelGroupPolicy(params),groupSenderPolicy=resolveToolsBySender({toolsBySender:groupConfig?.toolsBySender,senderId:params.senderId,senderName:params.senderName,senderUsername:params.senderUsername,senderE164:params.senderE164});if(groupSenderPolicy)return groupSenderPolicy;if(groupConfig?.tools)return groupConfig.tools;let defaultSenderPolicy=resolveToolsBySender({toolsBySender:defaultConfig?.toolsBySender,senderId:params.senderId,senderName:params.senderName,senderUsername:params.senderUsername,senderE164:params.senderE164});if(defaultSenderPolicy)return defaultSenderPolicy;if(defaultConfig?.tools)return defaultConfig.tools}function buildSlackThreadingToolContext(params){let configuredReplyToMode=resolveSlackReplyToMode(resolveSlackAccount({cfg:params.cfg,accountId:params.accountId}),params.context.ChatType),effectiveReplyToMode=params.context.ThreadLabel?`all`:configuredReplyToMode,threadId=params.context.MessageThreadId??params.context.ReplyToId;return{currentChannelId:params.context.To?.startsWith(`channel:`)?params.context.To.slice(8):void 0,currentThreadTs:threadId==null?void 0:String(threadId),replyToMode:effectiveReplyToMode,hasRepliedRef:params.hasRepliedRef}}function normalizeDiscordSlug(value){return normalizeAtHashSlug(value)}function parseTelegramGroupId(value){let raw=value?.trim()??``;if(!raw)return{chatId:void 0,topicId:void 0};let parts=raw.split(`:`).filter(Boolean);return parts.length>=3&&parts[1]===`topic`&&/^-?\d+$/.test(parts[0])&&/^\d+$/.test(parts[2])?{chatId:parts[0],topicId:parts[2]}:parts.length>=2&&/^-?\d+$/.test(parts[0])&&/^\d+$/.test(parts[1])?{chatId:parts[0],topicId:parts[1]}:{chatId:raw,topicId:void 0}}function resolveTelegramRequireMention(params){let{cfg,chatId,topicId}=params;if(!chatId)return;let groupConfig=cfg.channels?.telegram?.groups?.[chatId],groupDefault=cfg.channels?.telegram?.groups?.[`*`],topicConfig=topicId&&groupConfig?.topics?groupConfig.topics[topicId]:void 0,defaultTopicConfig=topicId&&groupDefault?.topics?groupDefault.topics[topicId]:void 0;if(typeof topicConfig?.requireMention==`boolean`)return topicConfig.requireMention;if(typeof defaultTopicConfig?.requireMention==`boolean`)return defaultTopicConfig.requireMention;if(typeof groupConfig?.requireMention==`boolean`)return groupConfig.requireMention;if(typeof groupDefault?.requireMention==`boolean`)return groupDefault.requireMention}function resolveDiscordGuildEntry(guilds,groupSpace){if(!guilds||Object.keys(guilds).length===0)return null;let space=groupSpace?.trim()??``;if(space&&guilds[space])return guilds[space];let normalized=normalizeDiscordSlug(space);if(normalized&&guilds[normalized])return guilds[normalized];if(normalized){let match=Object.values(guilds).find(entry=>normalizeDiscordSlug(entry?.slug??void 0)===normalized);if(match)return match}return guilds[`*`]??null}function resolveDiscordChannelEntry(channelEntries,params){if(!channelEntries||Object.keys(channelEntries).length===0)return;let groupChannel=params.groupChannel,channelSlug=normalizeDiscordSlug(groupChannel);return(params.groupId?channelEntries[params.groupId]:void 0)??(channelSlug?channelEntries[channelSlug]??channelEntries[`#${channelSlug}`]:void 0)??(groupChannel?channelEntries[normalizeDiscordSlug(groupChannel)]:void 0)}function resolveSlackChannelPolicyEntry(params){let channels=resolveSlackAccount({cfg:params.cfg,accountId:params.accountId}).channels??{};if(Object.keys(channels).length===0)return;let channelId=params.groupId?.trim(),channelName=params.groupChannel?.replace(/^#/,``),normalizedName=normalizeHyphenSlug(channelName),candidates=[channelId??``,channelName?`#${channelName}`:``,channelName??``,normalizedName].filter(Boolean);for(let candidate of candidates)if(candidate&&channels[candidate])return channels[candidate];return channels[`*`]}function resolveTelegramGroupRequireMention(params){let{chatId,topicId}=parseTelegramGroupId(params.groupId),requireMention=resolveTelegramRequireMention({cfg:params.cfg,chatId,topicId});return typeof requireMention==`boolean`?requireMention:resolveChannelGroupRequireMention({cfg:params.cfg,channel:`telegram`,groupId:chatId??params.groupId,accountId:params.accountId})}function resolveWhatsAppGroupRequireMention(params){return resolveChannelGroupRequireMention({cfg:params.cfg,channel:`whatsapp`,groupId:params.groupId,accountId:params.accountId})}function resolveIMessageGroupRequireMention(params){return resolveChannelGroupRequireMention({cfg:params.cfg,channel:`imessage`,groupId:params.groupId,accountId:params.accountId})}function resolveDiscordGroupRequireMention(params){let guildEntry=resolveDiscordGuildEntry(params.cfg.channels?.discord?.guilds,params.groupSpace),channelEntries=guildEntry?.channels;if(channelEntries&&Object.keys(channelEntries).length>0){let entry=resolveDiscordChannelEntry(channelEntries,params);if(entry&&typeof entry.requireMention==`boolean`)return entry.requireMention}return typeof guildEntry?.requireMention==`boolean`?guildEntry.requireMention:!0}function resolveGoogleChatGroupRequireMention(params){return resolveChannelGroupRequireMention({cfg:params.cfg,channel:`googlechat`,groupId:params.groupId,accountId:params.accountId})}function resolveGoogleChatGroupToolPolicy(params){return resolveChannelGroupToolsPolicy({cfg:params.cfg,channel:`googlechat`,groupId:params.groupId,accountId:params.accountId,senderId:params.senderId,senderName:params.senderName,senderUsername:params.senderUsername,senderE164:params.senderE164})}function resolveSlackGroupRequireMention(params){let resolved=resolveSlackChannelPolicyEntry(params);return typeof resolved?.requireMention==`boolean`?resolved.requireMention:!0}function resolveTelegramGroupToolPolicy(params){let{chatId}=parseTelegramGroupId(params.groupId);return resolveChannelGroupToolsPolicy({cfg:params.cfg,channel:`telegram`,groupId:chatId??params.groupId,accountId:params.accountId,senderId:params.senderId,senderName:params.senderName,senderUsername:params.senderUsername,senderE164:params.senderE164})}function resolveWhatsAppGroupToolPolicy(params){return resolveChannelGroupToolsPolicy({cfg:params.cfg,channel:`whatsapp`,groupId:params.groupId,accountId:params.accountId,senderId:params.senderId,senderName:params.senderName,senderUsername:params.senderUsername,senderE164:params.senderE164})}function resolveIMessageGroupToolPolicy(params){return resolveChannelGroupToolsPolicy({cfg:params.cfg,channel:`imessage`,groupId:params.groupId,accountId:params.accountId,senderId:params.senderId,senderName:params.senderName,senderUsername:params.senderUsername,senderE164:params.senderE164})}function resolveDiscordGroupToolPolicy(params){let guildEntry=resolveDiscordGuildEntry(params.cfg.channels?.discord?.guilds,params.groupSpace),channelEntries=guildEntry?.channels;if(channelEntries&&Object.keys(channelEntries).length>0){let entry=resolveDiscordChannelEntry(channelEntries,params),senderPolicy=resolveToolsBySender({toolsBySender:entry?.toolsBySender,senderId:params.senderId,senderName:params.senderName,senderUsername:params.senderUsername,senderE164:params.senderE164});if(senderPolicy)return senderPolicy;if(entry?.tools)return entry.tools}let guildSenderPolicy=resolveToolsBySender({toolsBySender:guildEntry?.toolsBySender,senderId:params.senderId,senderName:params.senderName,senderUsername:params.senderUsername,senderE164:params.senderE164});if(guildSenderPolicy)return guildSenderPolicy;if(guildEntry?.tools)return guildEntry.tools}function resolveSlackGroupToolPolicy(params){let resolved=resolveSlackChannelPolicyEntry(params);if(!resolved)return;let senderPolicy=resolveToolsBySender({toolsBySender:resolved?.toolsBySender,senderId:params.senderId,senderName:params.senderName,senderUsername:params.senderUsername,senderE164:params.senderE164});if(senderPolicy)return senderPolicy;if(resolved?.tools)return resolved.tools}function normalizeSignalMessagingTarget(raw){let trimmed=raw.trim();if(!trimmed)return;let normalized=trimmed;if(normalized.toLowerCase().startsWith(`signal:`)&&(normalized=normalized.slice(7).trim()),!normalized)return;let lower=normalized.toLowerCase();if(lower.startsWith(`group:`)){let id=normalized.slice(6).trim();return id?`group:${id}`:void 0}if(lower.startsWith(`username:`)){let id=normalized.slice(9).trim();return id?`username:${id}`.toLowerCase():void 0}if(lower.startsWith(`u:`)){let id=normalized.slice(2).trim();return id?`username:${id}`.toLowerCase():void 0}if(lower.startsWith(`uuid:`)){let id=normalized.slice(5).trim();return id?id.toLowerCase():void 0}return normalized.toLowerCase()}const formatLower=allowFrom=>allowFrom.map(entry=>String(entry).trim()).filter(Boolean).map(entry=>entry.toLowerCase()),formatDiscordAllowFrom=allowFrom=>allowFrom.map(entry=>String(entry).trim().replace(/^<@!?/,``).replace(/>$/,``).replace(/^discord:/i,``).replace(/^user:/i,``).replace(/^pk:/i,``).trim().toLowerCase()).filter(Boolean);function resolveDirectOrGroupChannelId(context){return(context.ChatType?.toLowerCase()===`direct`?context.From??context.To:context.To)?.trim()||void 0}function buildSignalThreadToolContext(params){let currentChannelIdRaw=resolveDirectOrGroupChannelId(params.context);return{currentChannelId:currentChannelIdRaw?normalizeSignalMessagingTarget(currentChannelIdRaw)??currentChannelIdRaw.trim():void 0,currentThreadTs:params.context.ReplyToId,hasRepliedRef:params.hasRepliedRef}}function buildIMessageThreadToolContext(params){return{currentChannelId:resolveDirectOrGroupChannelId(params.context),currentThreadTs:params.context.ReplyToId,hasRepliedRef:params.hasRepliedRef}}function resolveCaseInsensitiveAccount(accounts,accountId){if(!accounts)return;let normalized=normalizeAccountId$1(accountId);return accounts[normalized]??accounts[Object.keys(accounts).find(key=>key.toLowerCase()===normalized.toLowerCase())??``]}const DOCKS={telegram:{id:`telegram`,capabilities:{chatTypes:[`direct`,`group`,`channel`,`thread`],nativeCommands:!0,blockStreaming:!0},outbound:{textChunkLimit:4e3},config:{resolveAllowFrom:({cfg,accountId})=>(resolveTelegramAccount({cfg,accountId}).config.allowFrom??[]).map(entry=>String(entry)),formatAllowFrom:({allowFrom})=>allowFrom.map(entry=>String(entry).trim()).filter(Boolean).map(entry=>entry.replace(/^(telegram|tg):/i,``)).map(entry=>entry.toLowerCase())},groups:{resolveRequireMention:resolveTelegramGroupRequireMention,resolveToolPolicy:resolveTelegramGroupToolPolicy},threading:{resolveReplyToMode:({cfg})=>cfg.channels?.telegram?.replyToMode??`off`,buildToolContext:({context,hasRepliedRef})=>{let threadId=context.MessageThreadId??context.ReplyToId;return{currentChannelId:context.To?.trim()||void 0,currentThreadTs:threadId==null?void 0:String(threadId),hasRepliedRef}}}},whatsapp:{id:`whatsapp`,capabilities:{chatTypes:[`direct`,`group`],polls:!0,reactions:!0,media:!0},commands:{enforceOwnerForCommands:!0,skipWhenConfigEmpty:!0},outbound:{textChunkLimit:4e3},config:{resolveAllowFrom:({cfg,accountId})=>resolveWhatsAppAccount({cfg,accountId}).allowFrom??[],formatAllowFrom:({allowFrom})=>allowFrom.map(entry=>String(entry).trim()).filter(entry=>!!entry).map(entry=>entry===`*`?entry:normalizeWhatsAppTarget(entry)).filter(entry=>!!entry)},groups:{resolveRequireMention:resolveWhatsAppGroupRequireMention,resolveToolPolicy:resolveWhatsAppGroupToolPolicy,resolveGroupIntroHint:()=>`WhatsApp IDs: SenderId is the participant JID (group participant id).`},mentions:{stripPatterns:({ctx})=>{let selfE164=(ctx.To??``).replace(/^whatsapp:/,``);if(!selfE164)return[];let escaped=escapeRegExp(selfE164);return[escaped,`@${escaped}`]}},threading:{buildToolContext:({context,hasRepliedRef})=>({currentChannelId:context.From?.trim()||context.To?.trim()||void 0,currentThreadTs:context.ReplyToId,hasRepliedRef})}},discord:{id:`discord`,capabilities:{chatTypes:[`direct`,`channel`,`thread`],polls:!0,reactions:!0,media:!0,nativeCommands:!0,threads:!0},outbound:{textChunkLimit:2e3},streaming:{blockStreamingCoalesceDefaults:{minChars:1500,idleMs:1e3}},elevated:{allowFromFallback:({cfg})=>cfg.channels?.discord?.allowFrom??cfg.channels?.discord?.dm?.allowFrom},config:{resolveAllowFrom:({cfg,accountId})=>{let account=resolveDiscordAccount({cfg,accountId});return(account.config.allowFrom??account.config.dm?.allowFrom??[]).map(entry=>String(entry))},formatAllowFrom:({allowFrom})=>formatDiscordAllowFrom(allowFrom)},groups:{resolveRequireMention:resolveDiscordGroupRequireMention,resolveToolPolicy:resolveDiscordGroupToolPolicy},mentions:{stripPatterns:()=>[`<@!?\\d+>`]},threading:{resolveReplyToMode:({cfg})=>cfg.channels?.discord?.replyToMode??`off`,buildToolContext:({context,hasRepliedRef})=>({currentChannelId:context.To?.trim()||void 0,currentThreadTs:context.ReplyToId,hasRepliedRef})}},irc:{id:`irc`,capabilities:{chatTypes:[`direct`,`group`],media:!0,blockStreaming:!0},outbound:{textChunkLimit:350},streaming:{blockStreamingCoalesceDefaults:{minChars:300,idleMs:1e3}},config:{resolveAllowFrom:({cfg,accountId})=>{let channel=cfg.channels?.irc;return(resolveCaseInsensitiveAccount(channel?.accounts,accountId)?.allowFrom??channel?.allowFrom??[]).map(entry=>String(entry))},formatAllowFrom:({allowFrom})=>allowFrom.map(entry=>String(entry).trim()).filter(Boolean).map(entry=>entry.replace(/^irc:/i,``).replace(/^user:/i,``).toLowerCase())},groups:{resolveRequireMention:({cfg,accountId,groupId})=>groupId?resolveChannelGroupRequireMention({cfg,channel:`irc`,groupId,accountId,groupIdCaseInsensitive:!0}):!0,resolveToolPolicy:({cfg,accountId,groupId,senderId,senderName,senderUsername})=>{if(groupId)return resolveChannelGroupToolsPolicy({cfg,channel:`irc`,groupId,accountId,groupIdCaseInsensitive:!0,senderId,senderName,senderUsername})}}},googlechat:{id:`googlechat`,capabilities:{chatTypes:[`direct`,`group`,`thread`],reactions:!0,media:!0,threads:!0,blockStreaming:!0},outbound:{textChunkLimit:4e3},config:{resolveAllowFrom:({cfg,accountId})=>{let channel=cfg.channels?.googlechat;return(resolveCaseInsensitiveAccount(channel?.accounts,accountId)?.dm?.allowFrom??channel?.dm?.allowFrom??[]).map(entry=>String(entry))},formatAllowFrom:({allowFrom})=>allowFrom.map(entry=>String(entry).trim()).filter(Boolean).map(entry=>entry.replace(/^(googlechat|google-chat|gchat):/i,``).replace(/^user:/i,``).replace(/^users\//i,``).toLowerCase())},groups:{resolveRequireMention:resolveGoogleChatGroupRequireMention,resolveToolPolicy:resolveGoogleChatGroupToolPolicy},threading:{resolveReplyToMode:({cfg})=>cfg.channels?.googlechat?.replyToMode??`off`,buildToolContext:({context,hasRepliedRef})=>{let threadId=context.MessageThreadId??context.ReplyToId;return{currentChannelId:context.To?.trim()||void 0,currentThreadTs:threadId==null?void 0:String(threadId),hasRepliedRef}}}},slack:{id:`slack`,capabilities:{chatTypes:[`direct`,`channel`,`thread`],reactions:!0,media:!0,nativeCommands:!0,threads:!0},outbound:{textChunkLimit:4e3},streaming:{blockStreamingCoalesceDefaults:{minChars:1500,idleMs:1e3}},config:{resolveAllowFrom:({cfg,accountId})=>{let account=resolveSlackAccount({cfg,accountId});return(account.config.allowFrom??account.dm?.allowFrom??[]).map(entry=>String(entry))},formatAllowFrom:({allowFrom})=>formatLower(allowFrom)},groups:{resolveRequireMention:resolveSlackGroupRequireMention,resolveToolPolicy:resolveSlackGroupToolPolicy},mentions:{stripPatterns:()=>[`<@[^>]+>`]},threading:{resolveReplyToMode:({cfg,accountId,chatType})=>resolveSlackReplyToMode(resolveSlackAccount({cfg,accountId}),chatType),allowExplicitReplyTagsWhenOff:!0,buildToolContext:params=>buildSlackThreadingToolContext(params)}},signal:{id:`signal`,capabilities:{chatTypes:[`direct`,`group`],reactions:!0,media:!0},outbound:{textChunkLimit:4e3},streaming:{blockStreamingCoalesceDefaults:{minChars:1500,idleMs:1e3}},config:{resolveAllowFrom:({cfg,accountId})=>(resolveSignalAccount({cfg,accountId}).config.allowFrom??[]).map(entry=>String(entry)),formatAllowFrom:({allowFrom})=>allowFrom.map(entry=>String(entry).trim()).filter(Boolean).map(entry=>entry===`*`?`*`:normalizeE164(entry.replace(/^signal:/i,``))).filter(Boolean)},threading:{buildToolContext:({context,hasRepliedRef})=>buildSignalThreadToolContext({context,hasRepliedRef})}},imessage:{id:`imessage`,capabilities:{chatTypes:[`direct`,`group`],reactions:!0,media:!0},outbound:{textChunkLimit:4e3},config:{resolveAllowFrom:({cfg,accountId})=>(resolveIMessageAccount({cfg,accountId}).config.allowFrom??[]).map(entry=>String(entry)),formatAllowFrom:({allowFrom})=>allowFrom.map(entry=>String(entry).trim()).filter(Boolean)},groups:{resolveRequireMention:resolveIMessageGroupRequireMention,resolveToolPolicy:resolveIMessageGroupToolPolicy},threading:{buildToolContext:({context,hasRepliedRef})=>buildIMessageThreadToolContext({context,hasRepliedRef})}}};function buildDockFromPlugin(plugin){return{id:plugin.id,capabilities:plugin.capabilities,commands:plugin.commands,outbound:plugin.outbound?.textChunkLimit?{textChunkLimit:plugin.outbound.textChunkLimit}:void 0,streaming:plugin.streaming?{blockStreamingCoalesceDefaults:plugin.streaming.blockStreamingCoalesceDefaults}:void 0,elevated:plugin.elevated,config:plugin.config?{resolveAllowFrom:plugin.config.resolveAllowFrom,formatAllowFrom:plugin.config.formatAllowFrom}:void 0,groups:plugin.groups,mentions:plugin.mentions,threading:plugin.threading,agentPrompt:plugin.agentPrompt}}function listPluginDockEntries(){let registry=requireActivePluginRegistry(),entries=[],seen=new Set;for(let entry of registry.channels){let plugin=entry.plugin,id=String(plugin.id).trim();if(!id||seen.has(id)||(seen.add(id),CHAT_CHANNEL_ORDER.includes(plugin.id)))continue;let dock=entry.dock??buildDockFromPlugin(plugin);entries.push({id:plugin.id,dock,order:plugin.meta.order})}return entries}function listChannelDocks(){let baseEntries=CHAT_CHANNEL_ORDER.map(id=>({id,dock:DOCKS[id],order:getChatChannelMeta(id).order})),pluginEntries=listPluginDockEntries(),combined=[...baseEntries,...pluginEntries];return combined.sort((a,b)=>{let indexA=CHAT_CHANNEL_ORDER.indexOf(a.id),indexB=CHAT_CHANNEL_ORDER.indexOf(b.id),orderA=a.order??(indexA===-1?999:indexA),orderB=b.order??(indexB===-1?999:indexB);return orderA===orderB?String(a.id).localeCompare(String(b.id)):orderA-orderB}),combined.map(entry=>entry.dock)}function getChannelDock(id){let core=DOCKS[id];if(core)return core;let pluginEntry=requireActivePluginRegistry().channels.find(entry=>entry.plugin.id===id);if(pluginEntry)return pluginEntry.dock??buildDockFromPlugin(pluginEntry.plugin)}const mergeOrigin=(existing,next)=>{if(!existing&&!next)return;let merged=existing?{...existing}:{};return next?.label&&(merged.label=next.label),next?.provider&&(merged.provider=next.provider),next?.surface&&(merged.surface=next.surface),next?.chatType&&(merged.chatType=next.chatType),next?.from&&(merged.from=next.from),next?.to&&(merged.to=next.to),next?.accountId&&(merged.accountId=next.accountId),next?.threadId!=null&&next.threadId!==``&&(merged.threadId=next.threadId),Object.keys(merged).length>0?merged:void 0};function deriveSessionOrigin(ctx){let label=resolveConversationLabel(ctx)?.trim(),provider=normalizeMessageChannel(typeof ctx.OriginatingChannel==`string`&&ctx.OriginatingChannel||ctx.Surface||ctx.Provider),surface=ctx.Surface?.trim().toLowerCase(),chatType=normalizeChatType(ctx.ChatType)??void 0,from=ctx.From?.trim(),to=(typeof ctx.OriginatingTo==`string`?ctx.OriginatingTo:ctx.To)?.trim()??void 0,accountId=ctx.AccountId?.trim(),threadId=ctx.MessageThreadId??void 0,origin={};return label&&(origin.label=label),provider&&(origin.provider=provider),surface&&(origin.surface=surface),chatType&&(origin.chatType=chatType),from&&(origin.from=from),to&&(origin.to=to),accountId&&(origin.accountId=accountId),threadId!=null&&threadId!==``&&(origin.threadId=threadId),Object.keys(origin).length>0?origin:void 0}function snapshotSessionOrigin(entry){if(entry?.origin)return{...entry.origin}}function deriveGroupSessionPatch(params){let resolution=params.groupResolution??resolveGroupSessionKey(params.ctx);if(!resolution?.channel)return null;let channel=resolution.channel,subject=params.ctx.GroupSubject?.trim(),space=params.ctx.GroupSpace?.trim(),explicitChannel=params.ctx.GroupChannel?.trim(),normalizedChannel=normalizeChannelId(channel),isChannelProvider=!!(normalizedChannel&&getChannelDock(normalizedChannel)?.capabilities.chatTypes.includes(`channel`)),nextGroupChannel=explicitChannel??((resolution.chatType===`channel`||isChannelProvider)&&subject&&subject.startsWith(`#`)?subject:void 0),nextSubject=nextGroupChannel?void 0:subject,patch={chatType:resolution.chatType??`group`,channel,groupId:resolution.id};nextSubject&&(patch.subject=nextSubject),nextGroupChannel&&(patch.groupChannel=nextGroupChannel),space&&(patch.space=space);let displayName=buildGroupDisplayName({provider:channel,subject:nextSubject??params.existing?.subject,groupChannel:nextGroupChannel??params.existing?.groupChannel,space:space??params.existing?.space,id:resolution.id,key:params.sessionKey});return displayName&&(patch.displayName=displayName),patch}function deriveSessionMetaPatch(params){let groupPatch=deriveGroupSessionPatch(params),origin=deriveSessionOrigin(params.ctx);if(!groupPatch&&!origin)return null;let patch=groupPatch?{...groupPatch}:{},mergedOrigin=mergeOrigin(params.existing?.origin,origin);return mergedOrigin&&(patch.origin=mergedOrigin),Object.keys(patch).length>0?patch:null}function resolveMainSessionKey(cfg){if(cfg?.session?.scope===`global`)return`global`;let agents=cfg?.agents?.list??[];return buildAgentMainSessionKey({agentId:normalizeAgentId(agents.find(agent=>agent?.default)?.id??agents[0]?.id??DEFAULT_AGENT_ID),mainKey:normalizeMainKey(cfg?.session?.mainKey)})}function resolveMainSessionKeyFromConfig(){return resolveMainSessionKey(loadConfig())}function resolveAgentMainSessionKey(params){let mainKey=normalizeMainKey(params.cfg?.session?.mainKey);return buildAgentMainSessionKey({agentId:params.agentId,mainKey})}function resolveExplicitAgentSessionKey(params){let agentId=params.agentId?.trim();if(agentId)return resolveAgentMainSessionKey({cfg:params.cfg,agentId})}function canonicalizeMainSessionAlias(params){let raw=params.sessionKey.trim();if(!raw)return raw;let agentId=normalizeAgentId(params.agentId),mainKey=normalizeMainKey(params.cfg?.session?.mainKey),agentMainSessionKey=buildAgentMainSessionKey({agentId,mainKey}),agentMainAliasKey=buildAgentMainSessionKey({agentId,mainKey:`main`}),isMainAlias=raw===`main`||raw===mainKey||raw===agentMainSessionKey||raw===agentMainAliasKey;return params.cfg?.session?.scope===`global`&&isMainAlias?`global`:isMainAlias?agentMainSessionKey:raw}function mergeSessionEntry(existing,patch){let sessionId=patch.sessionId??existing?.sessionId??crypto.randomUUID(),updatedAt=Math.max(existing?.updatedAt??0,patch.updatedAt??0,Date.now());return existing?{...existing,...patch,sessionId,updatedAt}:{...patch,sessionId,updatedAt}}function resolveFreshSessionTotalTokens(entry){let total=entry?.totalTokens;if(!(typeof total!=`number`||!Number.isFinite(total)||total<0)&&entry?.totalTokensFresh!==!1)return total}const DEFAULT_RESET_TRIGGERS=[`/new`,`/reset`],THREAD_SESSION_MARKERS=[`:thread:`,`:topic:`],GROUP_SESSION_MARKERS=[`:group:`,`:channel:`];function isThreadSessionKey(sessionKey){let normalized=(sessionKey??``).toLowerCase();return normalized?THREAD_SESSION_MARKERS.some(marker=>normalized.includes(marker)):!1}function resolveSessionResetType(params){if(params.isThread||isThreadSessionKey(params.sessionKey))return`thread`;if(params.isGroup)return`group`;let normalized=(params.sessionKey??``).toLowerCase();return GROUP_SESSION_MARKERS.some(marker=>normalized.includes(marker))?`group`:`direct`}function resolveThreadFlag(params){return params.messageThreadId!=null||params.threadLabel?.trim()||params.threadStarterBody?.trim()||params.parentSessionKey?.trim()?!0:isThreadSessionKey(params.sessionKey)}function resolveDailyResetAtMs(now,atHour){let normalizedAtHour=normalizeResetAtHour(atHour),resetAt=new Date(now);return resetAt.setHours(normalizedAtHour,0,0,0),now<resetAt.getTime()&&resetAt.setDate(resetAt.getDate()-1),resetAt.getTime()}function resolveSessionResetPolicy(params){let sessionCfg=params.sessionCfg,baseReset=params.resetOverride??sessionCfg?.reset,typeReset=params.resetOverride?void 0:sessionCfg?.resetByType?.[params.resetType]??(params.resetType===`direct`?sessionCfg?.resetByType?.dm:void 0),hasExplicitReset=!!(baseReset||sessionCfg?.resetByType),legacyIdleMinutes=params.resetOverride?void 0:sessionCfg?.idleMinutes,mode=typeReset?.mode??baseReset?.mode??(!hasExplicitReset&&legacyIdleMinutes!=null?`idle`:`daily`),atHour=normalizeResetAtHour(typeReset?.atHour??baseReset?.atHour??4),idleMinutesRaw=typeReset?.idleMinutes??baseReset?.idleMinutes??legacyIdleMinutes,idleMinutes;if(idleMinutesRaw!=null){let normalized=Math.floor(idleMinutesRaw);Number.isFinite(normalized)&&(idleMinutes=Math.max(normalized,1))}else mode===`idle`&&(idleMinutes=60);return{mode,atHour,idleMinutes}}function resolveChannelResetConfig(params){let resetByChannel=params.sessionCfg?.resetByChannel;if(!resetByChannel)return;let normalized=normalizeMessageChannel(params.channel),fallback=params.channel?.trim().toLowerCase(),key=normalized??fallback;if(key)return resetByChannel[key]??resetByChannel[key.toLowerCase()]}function evaluateSessionFreshness(params){let dailyResetAt=params.policy.mode===`daily`?resolveDailyResetAtMs(params.now,params.policy.atHour):void 0,idleExpiresAt=params.policy.idleMinutes==null?void 0:params.updatedAt+params.policy.idleMinutes*6e4,staleDaily=dailyResetAt!=null&¶ms.updatedAt<dailyResetAt,staleIdle=idleExpiresAt!=null&¶ms.now>idleExpiresAt;return{fresh:!(staleDaily||staleIdle),dailyResetAt,idleExpiresAt}}function normalizeResetAtHour(value){if(typeof value!=`number`||!Number.isFinite(value))return 4;let normalized=Math.floor(value);return Number.isFinite(normalized)?normalized<0?0:normalized>23?23:normalized:4}function deriveSessionKey(scope,ctx){if(scope===`global`)return`global`;let resolvedGroup=resolveGroupSessionKey(ctx);return resolvedGroup?resolvedGroup.key:(ctx.From?normalizeE164(ctx.From):``)||`unknown`}function resolveSessionKey(scope,ctx,mainKey){let explicit=ctx.SessionKey?.trim();if(explicit)return explicit.toLowerCase();let raw=deriveSessionKey(scope,ctx);if(scope===`global`)return raw;let canonical=buildAgentMainSessionKey({agentId:DEFAULT_AGENT_ID,mainKey:normalizeMainKey(mainKey)});return raw.includes(`:group:`)||raw.includes(`:channel:`)?`agent:${DEFAULT_AGENT_ID}:${raw}`:canonical}const ENVELOPE_PREFIX=/^\[([^\]]+)\]\s*/,ENVELOPE_CHANNELS=[`WebChat`,`WhatsApp`,`Telegram`,`Signal`,`Slack`,`Discord`,`Google Chat`,`iMessage`,`Teams`,`Matrix`,`Zalo`,`Zalo Personal`,`BlueBubbles`],MESSAGE_ID_LINE=/^\s*\[message_id:\s*[^\]]+\]\s*$/i;function looksLikeEnvelopeHeader(header){return/\d{4}-\d{2}-\d{2}T\d{2}:\d{2}Z\b/.test(header)||/\d{4}-\d{2}-\d{2} \d{2}:\d{2}\b/.test(header)?!0:ENVELOPE_CHANNELS.some(label=>header.startsWith(`${label} `))}function stripEnvelope(text){let match=text.match(ENVELOPE_PREFIX);return!match||!looksLikeEnvelopeHeader(match[1]??``)?text:text.slice(match[0].length)}function stripMessageIdHints(text){if(!text.includes(`[message_id:`))return text;let lines=text.split(/\r?\n/),filtered=lines.filter(line=>!MESSAGE_ID_LINE.test(line));return filtered.length===lines.length?text:filtered.join(`
|
|
2
2
|
`)}function stripEnvelopeFromContent(content){let changed=!1;return{content:content.map(item=>{if(!item||typeof item!=`object`)return item;let entry=item;if(entry.type!==`text`||typeof entry.text!=`string`)return item;let stripped=stripMessageIdHints(stripEnvelope(entry.text));return stripped===entry.text?item:(changed=!0,{...entry,text:stripped})}),changed}}function stripEnvelopeFromMessage(message){if(!message||typeof message!=`object`)return message;let entry=message;if((typeof entry.role==`string`?entry.role.toLowerCase():``)!==`user`)return message;let changed=!1,next={...entry};if(typeof entry.content==`string`){let stripped=stripMessageIdHints(stripEnvelope(entry.content));stripped!==entry.content&&(next.content=stripped,changed=!0)}else if(Array.isArray(entry.content)){let updated=stripEnvelopeFromContent(entry.content);updated.changed&&(next.content=updated.content,changed=!0)}else if(typeof entry.text==`string`){let stripped=stripMessageIdHints(stripEnvelope(entry.text));stripped!==entry.text&&(next.text=stripped,changed=!0)}return changed?next:message}function stripEnvelopeFromMessages(messages){if(messages.length===0)return messages;let changed=!1,next=messages.map(message=>{let stripped=stripEnvelopeFromMessage(message);return stripped!==message&&(changed=!0),stripped});return changed?next:messages}const sessionTitleFieldsCache=new Map;function readSessionTitleFieldsCacheKey(filePath,opts){return`${filePath}\t${opts?.includeInterSession===!0?`1`:`0`}`}function getCachedSessionTitleFields(cacheKey,stat){let cached=sessionTitleFieldsCache.get(cacheKey);return cached?cached.mtimeMs!==stat.mtimeMs||cached.size!==stat.size?(sessionTitleFieldsCache.delete(cacheKey),null):(sessionTitleFieldsCache.delete(cacheKey),sessionTitleFieldsCache.set(cacheKey,cached),{firstUserMessage:cached.firstUserMessage,lastMessagePreview:cached.lastMessagePreview}):null}function setCachedSessionTitleFields(cacheKey,stat,value){for(sessionTitleFieldsCache.set(cacheKey,{...value,mtimeMs:stat.mtimeMs,size:stat.size});sessionTitleFieldsCache.size>5e3;){let oldestKey=sessionTitleFieldsCache.keys().next().value;if(typeof oldestKey!=`string`||!oldestKey)break;sessionTitleFieldsCache.delete(oldestKey)}}function readSessionMessages(sessionId,storePath,sessionFile){let filePath=resolveSessionTranscriptCandidates(sessionId,storePath,sessionFile).find(p=>fs.existsSync(p));if(!filePath)return[];let lines=fs.readFileSync(filePath,`utf-8`).split(/\r?\n/),messages=[];for(let line of lines)if(line.trim())try{let parsed=JSON.parse(line);if(parsed?.message){messages.push(parsed.message);continue}if(parsed?.type===`compaction`){let ts=typeof parsed.timestamp==`string`?Date.parse(parsed.timestamp):NaN,timestamp=Number.isFinite(ts)?ts:Date.now();messages.push({role:`system`,content:[{type:`text`,text:`Compaction`}],timestamp,__builderforce:{kind:`compaction`,id:typeof parsed.id==`string`?parsed.id:void 0}})}}catch{}return messages}function resolveSessionTranscriptCandidates(sessionId,storePath,sessionFile,agentId){let candidates=[],pushCandidate=resolve=>{try{candidates.push(resolve())}catch{}};if(storePath){let sessionsDir=path.dirname(storePath);sessionFile&&pushCandidate(()=>resolveSessionFilePath(sessionId,{sessionFile},{sessionsDir,agentId})),pushCandidate(()=>resolveSessionTranscriptPathInDir(sessionId,sessionsDir))}else if(sessionFile)if(agentId)pushCandidate(()=>resolveSessionFilePath(sessionId,{sessionFile},{agentId}));else{let trimmed=sessionFile.trim();trimmed&&candidates.push(path.resolve(trimmed))}agentId&&pushCandidate(()=>resolveSessionTranscriptPath(sessionId,agentId));let home=resolveRequiredHomeDir(process.env,os.homedir),legacyDir=path.join(home,`.builderforce`,`sessions`);return pushCandidate(()=>resolveSessionTranscriptPathInDir(sessionId,legacyDir)),Array.from(new Set(candidates))}function archiveFileOnDisk(filePath,reason){let archived=`${filePath}.${reason}.${new Date().toISOString().replaceAll(`:`,`-`)}`;return fs.renameSync(filePath,archived),archived}function archiveSessionTranscripts(opts){let archived=[];for(let candidate of resolveSessionTranscriptCandidates(opts.sessionId,opts.storePath,opts.sessionFile,opts.agentId))if(fs.existsSync(candidate))try{archived.push(archiveFileOnDisk(candidate,opts.reason))}catch{}return archived}function restoreArchiveTimestamp(raw){let[datePart,timePart]=raw.split(`T`);return!datePart||!timePart?raw:`${datePart}T${timePart.replace(/-/g,`:`)}`}function parseArchivedTimestamp(fileName,reason){let marker=`.${reason}.`,index=fileName.lastIndexOf(marker);if(index<0)return null;let raw=fileName.slice(index+marker.length);if(!raw)return null;let timestamp=Date.parse(restoreArchiveTimestamp(raw));return Number.isNaN(timestamp)?null:timestamp}async function cleanupArchivedSessionTranscripts(opts){if(!Number.isFinite(opts.olderThanMs)||opts.olderThanMs<0)return{removed:0,scanned:0};let now=opts.nowMs??Date.now(),reason=opts.reason??`deleted`,directories=Array.from(new Set(opts.directories.map(dir=>path.resolve(dir)))),removed=0,scanned=0;for(let dir of directories){let entries=await fs.promises.readdir(dir).catch(()=>[]);for(let entry of entries){let timestamp=parseArchivedTimestamp(entry,reason);if(timestamp==null||(scanned+=1,now-timestamp<=opts.olderThanMs))continue;let fullPath=path.join(dir,entry);(await fs.promises.stat(fullPath).catch(()=>null))?.isFile()&&(await fs.promises.rm(fullPath).catch(()=>void 0),removed+=1)}}return{removed,scanned}}function jsonUtf8Bytes(value){try{return Buffer.byteLength(JSON.stringify(value),`utf8`)}catch{return Buffer.byteLength(String(value),`utf8`)}}function capArrayByJsonBytes(items,maxBytes){if(items.length===0)return{items,bytes:2};let parts=items.map(item=>jsonUtf8Bytes(item)),bytes=2+parts.reduce((a,b)=>a+b,0)+(items.length-1),start=0;for(;bytes>maxBytes&&start<items.length-1;)bytes-=parts[start]+1,start+=1;return{items:start>0?items.slice(start):items,bytes}}function readSessionTitleFieldsFromTranscript(sessionId,storePath,sessionFile,agentId,opts){let filePath=resolveSessionTranscriptCandidates(sessionId,storePath,sessionFile,agentId).find(p=>fs.existsSync(p));if(!filePath)return{firstUserMessage:null,lastMessagePreview:null};let stat;try{stat=fs.statSync(filePath)}catch{return{firstUserMessage:null,lastMessagePreview:null}}let cacheKey=readSessionTitleFieldsCacheKey(filePath,opts),cached=getCachedSessionTitleFields(cacheKey,stat);if(cached)return cached;if(stat.size===0){let empty={firstUserMessage:null,lastMessagePreview:null};return setCachedSessionTitleFields(cacheKey,stat,empty),empty}let fd=null;try{fd=fs.openSync(filePath,`r`);let size=stat.size,firstUserMessage=null;try{let chunk=readTranscriptHeadChunk(fd);chunk&&(firstUserMessage=extractFirstUserMessageFromTranscriptChunk(chunk,opts))}catch{}let lastMessagePreview=null;try{lastMessagePreview=readLastMessagePreviewFromOpenTranscript({fd,size})}catch{}let result={firstUserMessage,lastMessagePreview};return setCachedSessionTitleFields(cacheKey,stat,result),result}catch{return{firstUserMessage:null,lastMessagePreview:null}}finally{if(fd!==null)try{fs.closeSync(fd)}catch{}}}function extractTextFromContent(content){if(typeof content==`string`)return content.trim()||null;if(!Array.isArray(content))return null;for(let part of content)if(!(!part||typeof part.text!=`string`)&&(part.type===`text`||part.type===`output_text`||part.type===`input_text`)){let trimmed=part.text.trim();if(trimmed)return trimmed}return null}function readTranscriptHeadChunk(fd,maxBytes=8192){let buf=Buffer.alloc(maxBytes),bytesRead=fs.readSync(fd,buf,0,buf.length,0);return bytesRead<=0?null:buf.toString(`utf-8`,0,bytesRead)}function extractFirstUserMessageFromTranscriptChunk(chunk,opts){let lines=chunk.split(/\r?\n/).slice(0,10);for(let line of lines)if(line.trim())try{let msg=JSON.parse(line)?.message;if(msg?.role!==`user`||opts?.includeInterSession!==!0&&hasInterSessionUserProvenance(msg))continue;let text=extractTextFromContent(msg.content);if(text)return text}catch{}return null}const LAST_MSG_MAX_BYTES=16384;function readLastMessagePreviewFromOpenTranscript(params){let readStart=Math.max(0,params.size-LAST_MSG_MAX_BYTES),readLen=Math.min(params.size,LAST_MSG_MAX_BYTES),buf=Buffer.alloc(readLen);fs.readSync(params.fd,buf,0,readLen,readStart);let tailLines=buf.toString(`utf-8`).split(/\r?\n/).filter(l=>l.trim()).slice(-20);for(let i=tailLines.length-1;i>=0;i--){let line=tailLines[i];try{let msg=JSON.parse(line)?.message;if(msg?.role!==`user`&&msg?.role!==`assistant`)continue;let text=extractTextFromContent(msg.content);if(text)return text}catch{}}return null}const PREVIEW_READ_SIZES=[64*1024,256*1024,1024*1024];function normalizeRole(role,isTool){if(isTool)return`tool`;switch((role??``).toLowerCase()){case`user`:return`user`;case`assistant`:return`assistant`;case`system`:return`system`;case`tool`:return`tool`;default:return`other`}}function truncatePreviewText(text,maxChars){return maxChars<=0||text.length<=maxChars?text:maxChars<=3?text.slice(0,maxChars):`${text.slice(0,maxChars-3)}...`}function extractPreviewText(message){if(typeof message.content==`string`)return message.content.trim()||null;if(Array.isArray(message.content)){let parts=message.content.map(entry=>typeof entry?.text==`string`?entry.text:``).filter(text=>text.trim().length>0);if(parts.length>0)return parts.join(`
|
|
3
3
|
`).trim()}return typeof message.text==`string`&&message.text.trim()||null}function isToolCall(message){return hasToolCall(message)}function extractToolNames(message){return extractToolCallNames(message)}function extractMediaSummary(message){if(!Array.isArray(message.content))return null;for(let entry of message.content){let raw=typeof entry?.type==`string`?entry.type.trim().toLowerCase():``;if(!(!raw||raw===`text`||raw===`toolcall`||raw===`tool_call`))return`[${raw}]`}return null}function buildPreviewItems(messages,maxItems,maxChars){let items=[];for(let message of messages){let toolCall=isToolCall(message),role=normalizeRole(message.role,toolCall),text=extractPreviewText(message);if(!text){let toolNames=extractToolNames(message);if(toolNames.length>0){let shown=toolNames.slice(0,2),overflow=toolNames.length-shown.length;text=`call ${shown.join(`, `)}`,overflow>0&&(text+=` +${overflow}`)}}if(text||=extractMediaSummary(message),!text)continue;let trimmed=text.trim();trimmed&&(role===`user`&&(trimmed=stripEnvelope(trimmed)),trimmed=truncatePreviewText(trimmed,maxChars),items.push({role,text:trimmed}))}return items.length<=maxItems?items:items.slice(-maxItems)}function readRecentMessagesFromTranscript(filePath,maxMessages,readBytes){let fd=null;try{fd=fs.openSync(filePath,`r`);let size=fs.fstatSync(fd).size;if(size===0)return[];let readStart=Math.max(0,size-readBytes),readLen=Math.min(size,readBytes),buf=Buffer.alloc(readLen);fs.readSync(fd,buf,0,readLen,readStart);let tailLines=buf.toString(`utf-8`).split(/\r?\n/).filter(l=>l.trim()).slice(-200),collected=[];for(let i=tailLines.length-1;i>=0;i--){let line=tailLines[i];try{let msg=JSON.parse(line)?.message;if(msg&&typeof msg==`object`&&(collected.push(msg),collected.length>=maxMessages))break}catch{}}return collected.toReversed()}catch{return[]}finally{fd!==null&&fs.closeSync(fd)}}function readSessionPreviewItemsFromTranscript(sessionId,storePath,sessionFile,agentId,maxItems,maxChars){let filePath=resolveSessionTranscriptCandidates(sessionId,storePath,sessionFile,agentId).find(p=>fs.existsSync(p));if(!filePath)return[];let boundedItems=Math.max(1,Math.min(maxItems,50)),boundedChars=Math.max(20,Math.min(maxChars,2e3));for(let readSize of PREVIEW_READ_SIZES){let messages=readRecentMessagesFromTranscript(filePath,boundedItems,readSize);if(messages.length>0||readSize===PREVIEW_READ_SIZES[PREVIEW_READ_SIZES.length-1])return buildPreviewItems(messages,boundedItems,boundedChars)}return[]}function resolveCacheTtlMs(params){let{envValue,defaultTtlMs}=params;if(envValue){let parsed=Number.parseInt(envValue,10);if(Number.isFinite(parsed)&&parsed>=0)return parsed}return defaultTtlMs}function isCacheEnabled(ttlMs){return ttlMs>0}function getFileMtimeMs(filePath){try{return fs.statSync(filePath).mtimeMs}catch{return}}const log=createSubsystemLogger(`sessions/store`),SESSION_STORE_CACHE=new Map;function isSessionStoreRecord(value){return!!value&&typeof value==`object`&&!Array.isArray(value)}function getSessionStoreTtl(){return resolveCacheTtlMs({envValue:process.env.BUILDERFORCE_AGENTS_SESSION_CACHE_TTL_MS,defaultTtlMs:45e3})}function isSessionStoreCacheEnabled(){return isCacheEnabled(getSessionStoreTtl())}function isSessionStoreCacheValid(entry){let now=Date.now(),ttl=getSessionStoreTtl();return now-entry.loadedAt<=ttl}function invalidateSessionStoreCache(storePath){SESSION_STORE_CACHE.delete(storePath)}function normalizeSessionEntryDelivery(entry){let normalized=normalizeSessionDeliveryFields({channel:entry.channel,lastChannel:entry.lastChannel,lastTo:entry.lastTo,lastAccountId:entry.lastAccountId,lastThreadId:entry.lastThreadId??entry.deliveryContext?.threadId??entry.origin?.threadId,deliveryContext:entry.deliveryContext}),nextDelivery=normalized.deliveryContext,sameDelivery=(entry.deliveryContext?.channel??void 0)===nextDelivery?.channel&&(entry.deliveryContext?.to??void 0)===nextDelivery?.to&&(entry.deliveryContext?.accountId??void 0)===nextDelivery?.accountId&&(entry.deliveryContext?.threadId??void 0)===nextDelivery?.threadId,sameLast=entry.lastChannel===normalized.lastChannel&&entry.lastTo===normalized.lastTo&&entry.lastAccountId===normalized.lastAccountId&&entry.lastThreadId===normalized.lastThreadId;return sameDelivery&&sameLast?entry:{...entry,deliveryContext:nextDelivery,lastChannel:normalized.lastChannel,lastTo:normalized.lastTo,lastAccountId:normalized.lastAccountId,lastThreadId:normalized.lastThreadId}}function removeThreadFromDeliveryContext(context){if(!context||context.threadId==null)return context;let next={...context};return delete next.threadId,next}function normalizeSessionStore(store){for(let[key,entry]of Object.entries(store)){if(!entry)continue;let normalized=normalizeSessionEntryDelivery(entry);normalized!==entry&&(store[key]=normalized)}}function loadSessionStore(storePath,opts={}){if(!opts.skipCache&&isSessionStoreCacheEnabled()){let cached=SESSION_STORE_CACHE.get(storePath);if(cached&&isSessionStoreCacheValid(cached)){if(getFileMtimeMs(storePath)===cached.mtimeMs)return structuredClone(cached.store);invalidateSessionStoreCache(storePath)}}let store={},mtimeMs=getFileMtimeMs(storePath),maxReadAttempts=process.platform===`win32`?3:1,retryBuf=maxReadAttempts>1?new Int32Array(new SharedArrayBuffer(4)):void 0;for(let attempt=0;attempt<maxReadAttempts;attempt++)try{let raw=fs.readFileSync(storePath,`utf-8`);if(raw.length===0&&attempt<maxReadAttempts-1){Atomics.wait(retryBuf,0,0,50);continue}let parsed=JSON.parse(raw);isSessionStoreRecord(parsed)&&(store=parsed),mtimeMs=getFileMtimeMs(storePath)??mtimeMs;break}catch{if(attempt<maxReadAttempts-1){Atomics.wait(retryBuf,0,0,50);continue}}for(let entry of Object.values(store)){if(!entry||typeof entry!=`object`)continue;let rec=entry;typeof rec.channel!=`string`&&typeof rec.provider==`string`&&(rec.channel=rec.provider,delete rec.provider),typeof rec.lastChannel!=`string`&&typeof rec.lastProvider==`string`&&(rec.lastChannel=rec.lastProvider,delete rec.lastProvider),typeof rec.groupChannel!=`string`&&typeof rec.room==`string`?(rec.groupChannel=rec.room,delete rec.room):`room`in rec&&delete rec.room}return!opts.skipCache&&isSessionStoreCacheEnabled()&&SESSION_STORE_CACHE.set(storePath,{store:structuredClone(store),loadedAt:Date.now(),storePath,mtimeMs}),structuredClone(store)}function readSessionUpdatedAt(params){try{return loadSessionStore(params.storePath)[params.sessionKey]?.updatedAt}catch{return}}const DEFAULT_SESSION_PRUNE_AFTER_MS=720*60*60*1e3,DEFAULT_SESSION_ROTATE_BYTES=10485760;function resolvePruneAfterMs(maintenance){let raw=maintenance?.pruneAfter??maintenance?.pruneDays;if(raw==null||raw===``)return DEFAULT_SESSION_PRUNE_AFTER_MS;try{return parseDurationMs(String(raw).trim(),{defaultUnit:`d`})}catch{return DEFAULT_SESSION_PRUNE_AFTER_MS}}function resolveRotateBytes(maintenance){let raw=maintenance?.rotateBytes;if(raw==null||raw===``)return DEFAULT_SESSION_ROTATE_BYTES;try{return parseByteSize(String(raw).trim(),{defaultUnit:`b`})}catch{return DEFAULT_SESSION_ROTATE_BYTES}}function resolveMaintenanceConfig(){let maintenance;try{maintenance=loadConfig().session?.maintenance}catch{}return{mode:maintenance?.mode??`warn`,pruneAfterMs:resolvePruneAfterMs(maintenance),maxEntries:maintenance?.maxEntries??500,rotateBytes:resolveRotateBytes(maintenance)}}function pruneStaleEntries(store,overrideMaxAgeMs,opts={}){let maxAgeMs=overrideMaxAgeMs??resolveMaintenanceConfig().pruneAfterMs,cutoffMs=Date.now()-maxAgeMs,pruned=0;for(let[key,entry]of Object.entries(store))entry?.updatedAt!=null&&entry.updatedAt<cutoffMs&&(opts.onPruned?.({key,entry}),delete store[key],pruned++);return pruned>0&&opts.log!==!1&&log.info(`pruned stale session entries`,{pruned,maxAgeMs}),pruned}function getEntryUpdatedAt(entry){return entry?.updatedAt??-1/0}function getActiveSessionMaintenanceWarning(params){let activeSessionKey=params.activeSessionKey.trim();if(!activeSessionKey)return null;let activeEntry=params.store[activeSessionKey];if(!activeEntry)return null;let cutoffMs=(params.nowMs??Date.now())-params.pruneAfterMs,wouldPrune=activeEntry.updatedAt==null?!1:activeEntry.updatedAt<cutoffMs,keys=Object.keys(params.store),wouldCap=keys.length>params.maxEntries&&keys.toSorted((a,b)=>getEntryUpdatedAt(params.store[b])-getEntryUpdatedAt(params.store[a])).slice(params.maxEntries).includes(activeSessionKey);return!wouldPrune&&!wouldCap?null:{activeSessionKey,activeUpdatedAt:activeEntry.updatedAt,totalEntries:keys.length,pruneAfterMs:params.pruneAfterMs,maxEntries:params.maxEntries,wouldPrune,wouldCap}}function capEntryCount(store,overrideMax,opts={}){let maxEntries=overrideMax??resolveMaintenanceConfig().maxEntries,keys=Object.keys(store);if(keys.length<=maxEntries)return 0;let toRemove=keys.toSorted((a,b)=>{let aTime=getEntryUpdatedAt(store[a]);return getEntryUpdatedAt(store[b])-aTime}).slice(maxEntries);for(let key of toRemove)delete store[key];return opts.log!==!1&&log.info(`capped session entry count`,{removed:toRemove.length,maxEntries}),toRemove.length}async function getSessionFileSize(storePath){try{return(await fs.promises.stat(storePath)).size}catch{return null}}async function rotateSessionFile(storePath,overrideBytes){let maxBytes=overrideBytes??resolveMaintenanceConfig().rotateBytes,fileSize=await getSessionFileSize(storePath);if(fileSize==null||fileSize<=maxBytes)return!1;let backupPath=`${storePath}.bak.${Date.now()}`;try{await fs.promises.rename(storePath,backupPath),log.info(`rotated session store file`,{backupPath:path.basename(backupPath),sizeBytes:fileSize})}catch{return!1}try{let dir=path.dirname(storePath),baseName=path.basename(storePath),backups=(await fs.promises.readdir(dir)).filter(f=>f.startsWith(`${baseName}.bak.`)).toSorted().toReversed();if(backups.length>3){let toDelete=backups.slice(3);for(let old of toDelete)await fs.promises.unlink(path.join(dir,old)).catch(()=>void 0);log.info(`cleaned up old session store backups`,{deleted:toDelete.length})}}catch{}return!0}async function saveSessionStoreUnlocked(storePath,store,opts){if(invalidateSessionStoreCache(storePath),normalizeSessionStore(store),!opts?.skipMaintenance){let maintenance=resolveMaintenanceConfig();if(maintenance.mode===`warn`){let activeSessionKey=opts?.activeSessionKey?.trim();if(activeSessionKey){let warning=getActiveSessionMaintenanceWarning({store,activeSessionKey,pruneAfterMs:maintenance.pruneAfterMs,maxEntries:maintenance.maxEntries});warning&&(log.warn(`session maintenance would evict active session; skipping enforcement`,{activeSessionKey:warning.activeSessionKey,wouldPrune:warning.wouldPrune,wouldCap:warning.wouldCap,pruneAfterMs:warning.pruneAfterMs,maxEntries:warning.maxEntries}),await opts?.onWarn?.(warning))}}else{let prunedSessionFiles=new Map;pruneStaleEntries(store,maintenance.pruneAfterMs,{onPruned:({entry})=>{(!prunedSessionFiles.has(entry.sessionId)||entry.sessionFile)&&prunedSessionFiles.set(entry.sessionId,entry.sessionFile)}}),capEntryCount(store,maintenance.maxEntries);let archivedDirs=new Set;for(let[sessionId,sessionFile]of prunedSessionFiles){let archived=archiveSessionTranscripts({sessionId,storePath,sessionFile,reason:`deleted`});for(let archivedPath of archived)archivedDirs.add(path.dirname(archivedPath))}archivedDirs.size>0&&await cleanupArchivedSessionTranscripts({directories:[...archivedDirs],olderThanMs:maintenance.pruneAfterMs,reason:`deleted`}),await rotateSessionFile(storePath,maintenance.rotateBytes)}}await fs.promises.mkdir(path.dirname(storePath),{recursive:!0});let json=JSON.stringify(store,null,2);if(process.platform===`win32`){let tmp=`${storePath}.${process.pid}.${crypto.randomUUID()}.tmp`;try{await fs.promises.writeFile(tmp,json,`utf-8`);for(let i=0;i<5;i++)try{await fs.promises.rename(tmp,storePath);break}catch{i<4&&await new Promise(r=>setTimeout(r,50*(i+1))),i===4&&console.warn(`[session-store] rename failed after 5 attempts: ${storePath}`)}}catch(err){if((err&&typeof err==`object`&&`code`in err?String(err.code):null)===`ENOENT`)return;throw err}finally{await fs.promises.rm(tmp,{force:!0}).catch(()=>void 0)}return}let tmp=`${storePath}.${process.pid}.${crypto.randomUUID()}.tmp`;try{await fs.promises.writeFile(tmp,json,{mode:384,encoding:`utf-8`}),await fs.promises.rename(tmp,storePath),await fs.promises.chmod(storePath,384)}catch(err){if((err&&typeof err==`object`&&`code`in err?String(err.code):null)===`ENOENT`){try{await fs.promises.mkdir(path.dirname(storePath),{recursive:!0}),await fs.promises.writeFile(storePath,json,{mode:384,encoding:`utf-8`}),await fs.promises.chmod(storePath,384)}catch(err2){if((err2&&typeof err2==`object`&&`code`in err2?String(err2.code):null)===`ENOENT`)return;throw err2}return}throw err}finally{await fs.promises.rm(tmp,{force:!0})}}async function saveSessionStore(storePath,store,opts){await withSessionStoreLock(storePath,async()=>{await saveSessionStoreUnlocked(storePath,store,opts)})}async function updateSessionStore(storePath,mutator,opts){return await withSessionStoreLock(storePath,async()=>{let store=loadSessionStore(storePath,{skipCache:!0}),result=await mutator(store);return await saveSessionStoreUnlocked(storePath,store,opts),result})}const LOCK_QUEUES=new Map;function lockTimeoutError(storePath){return Error(`timeout waiting for session store lock: ${storePath}`)}function getOrCreateLockQueue(storePath){let existing=LOCK_QUEUES.get(storePath);if(existing)return existing;let created={running:!1,pending:[]};return LOCK_QUEUES.set(storePath,created),created}async function drainSessionStoreLockQueue(storePath){let queue=LOCK_QUEUES.get(storePath);if(!(!queue||queue.running)){queue.running=!0;try{for(;queue.pending.length>0;){let task=queue.pending.shift();if(!task)continue;let remainingTimeoutMs=task.timeoutMs??1/0;if(task.timeoutMs!=null&&remainingTimeoutMs<=0){task.reject(lockTimeoutError(storePath));continue}let lock,result,failed,hasFailure=!1;try{lock=await acquireSessionWriteLock({sessionFile:storePath,timeoutMs:remainingTimeoutMs,staleMs:task.staleMs}),result=await task.fn()}catch(err){hasFailure=!0,failed=err}finally{await lock?.release().catch(()=>void 0)}if(hasFailure){task.reject(failed);continue}task.resolve(result)}}finally{queue.running=!1,queue.pending.length===0?LOCK_QUEUES.delete(storePath):queueMicrotask(()=>{drainSessionStoreLockQueue(storePath)})}}}async function withSessionStoreLock(storePath,fn,opts={}){if(!storePath||typeof storePath!=`string`)throw Error(`withSessionStoreLock: storePath must be a non-empty string, got ${JSON.stringify(storePath)}`);let timeoutMs=opts.timeoutMs??1e4,staleMs=opts.staleMs??3e4;opts.pollIntervalMs;let hasTimeout=timeoutMs>0&&Number.isFinite(timeoutMs),queue=getOrCreateLockQueue(storePath);return await new Promise((resolve,reject)=>{let task={fn:async()=>await fn(),resolve:value=>resolve(value),reject,timeoutMs:hasTimeout?timeoutMs:void 0,staleMs};queue.pending.push(task),drainSessionStoreLockQueue(storePath)})}async function updateSessionStoreEntry(params){let{storePath,sessionKey,update}=params;return await withSessionStoreLock(storePath,async()=>{let store=loadSessionStore(storePath),existing=store[sessionKey];if(!existing)return null;let patch=await update(existing);if(!patch)return existing;let next=mergeSessionEntry(existing,patch);return store[sessionKey]=next,await saveSessionStoreUnlocked(storePath,store,{activeSessionKey:sessionKey}),next})}async function recordSessionMetaFromInbound(params){let{storePath,sessionKey,ctx}=params,createIfMissing=params.createIfMissing??!0;return await updateSessionStore(storePath,store=>{let existing=store[sessionKey],patch=deriveSessionMetaPatch({ctx,sessionKey,existing,groupResolution:params.groupResolution});if(!patch)return existing??null;if(!existing&&!createIfMissing)return null;let next=mergeSessionEntry(existing,patch);return store[sessionKey]=next,next},{activeSessionKey:sessionKey})}async function updateLastRoute(params){let{storePath,sessionKey,channel,to,accountId,threadId,ctx}=params;return await withSessionStoreLock(storePath,async()=>{let store=loadSessionStore(storePath),existing=store[sessionKey],now=Date.now(),explicitContext=normalizeDeliveryContext(params.deliveryContext),inlineContext=normalizeDeliveryContext({channel,to,accountId,threadId}),mergedInput=mergeDeliveryContext(explicitContext,inlineContext),explicitDeliveryContext=params.deliveryContext,explicitThreadValue=(explicitDeliveryContext!=null&&Object.prototype.hasOwnProperty.call(explicitDeliveryContext,`threadId`)?explicitDeliveryContext.threadId:void 0)??(threadId!=null&&threadId!==``?threadId:void 0),merged=mergeDeliveryContext(mergedInput,(explicitContext?.channel||explicitContext?.to||inlineContext?.channel||inlineContext?.to)&&explicitThreadValue==null?removeThreadFromDeliveryContext(deliveryContextFromSession(existing)):deliveryContextFromSession(existing)),normalized=normalizeSessionDeliveryFields({deliveryContext:{channel:merged?.channel,to:merged?.to,accountId:merged?.accountId,threadId:merged?.threadId}}),metaPatch=ctx?deriveSessionMetaPatch({ctx,sessionKey,existing,groupResolution:params.groupResolution}):null,basePatch={updatedAt:Math.max(existing?.updatedAt??0,now),deliveryContext:normalized.deliveryContext,lastChannel:normalized.lastChannel,lastTo:normalized.lastTo,lastAccountId:normalized.lastAccountId,lastThreadId:normalized.lastThreadId},next=mergeSessionEntry(existing,metaPatch?{...basePatch,...metaPatch}:basePatch);return store[sessionKey]=next,await saveSessionStoreUnlocked(storePath,store,{activeSessionKey:sessionKey}),next})}function stripQuery(value){let noHash=value.split(`#`)[0]??value;return noHash.split(`?`)[0]??noHash}function extractFileNameFromMediaUrl(value){let trimmed=value.trim();if(!trimmed)return null;let cleaned=stripQuery(trimmed);try{let parsed=new URL(cleaned),base=path.basename(parsed.pathname);if(!base)return null;try{return decodeURIComponent(base)}catch{return base}}catch{let base=path.basename(cleaned);return!base||base===`/`||base===`.`?null:base}}function resolveMirroredTranscriptText(params){let mediaUrls=params.mediaUrls?.filter(url=>url&&url.trim())??[];if(mediaUrls.length>0){let names=mediaUrls.map(url=>extractFileNameFromMediaUrl(url)).filter(name=>!!(name&&name.trim()));return names.length>0?names.join(`, `):`media`}return(params.text??``).trim()||null}async function ensureSessionHeader(params){if(fs.existsSync(params.sessionFile))return;await fs.promises.mkdir(path.dirname(params.sessionFile),{recursive:!0});let header={type:`session`,version:CURRENT_SESSION_VERSION,id:params.sessionId,timestamp:new Date().toISOString(),cwd:process.cwd()};await fs.promises.writeFile(params.sessionFile,`${JSON.stringify(header)}\n`,{encoding:`utf-8`,mode:384})}async function appendAssistantMessageToSessionTranscript(params){let sessionKey=params.sessionKey.trim();if(!sessionKey)return{ok:!1,reason:`missing sessionKey`};let mirrorText=resolveMirroredTranscriptText({text:params.text,mediaUrls:params.mediaUrls});if(!mirrorText)return{ok:!1,reason:`empty text`};let storePath=params.storePath??resolveDefaultSessionStorePath(params.agentId),entry=loadSessionStore(storePath,{skipCache:!0})[sessionKey];if(!entry?.sessionId)return{ok:!1,reason:`unknown sessionKey: ${sessionKey}`};let sessionFile;try{sessionFile=resolveSessionFilePath(entry.sessionId,entry,{agentId:params.agentId,sessionsDir:path.dirname(storePath)})}catch(err){return{ok:!1,reason:err instanceof Error?err.message:String(err)}}return await ensureSessionHeader({sessionFile,sessionId:entry.sessionId}),SessionManager.open(sessionFile).appendMessage({role:`assistant`,content:[{type:`text`,text:mirrorText}],api:`openai-responses`,provider:`builderforce`,model:`delivery-mirror`,usage:{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},stopReason:`stop`,timestamp:Date.now()}),(!entry.sessionFile||entry.sessionFile!==sessionFile)&&await updateSessionStore(storePath,current=>{current[sessionKey]={...entry,sessionFile}},{activeSessionKey:sessionKey}),emitSessionTranscriptUpdate(sessionFile),{ok:!0,sessionFile}}function parseSessionThreadInfo(sessionKey){if(!sessionKey)return{baseSessionKey:void 0,threadId:void 0};let topicIndex=sessionKey.lastIndexOf(`:topic:`),threadIndex=sessionKey.lastIndexOf(`:thread:`),markerIndex=Math.max(topicIndex,threadIndex),marker=topicIndex>threadIndex?`:topic:`:`:thread:`;return{baseSessionKey:markerIndex===-1?sessionKey:sessionKey.slice(0,markerIndex),threadId:(markerIndex===-1?void 0:sessionKey.slice(markerIndex+marker.length))?.trim()||void 0}}function extractDeliveryInfo(sessionKey){let{baseSessionKey,threadId}=parseSessionThreadInfo(sessionKey);if(!sessionKey||!baseSessionKey)return{deliveryContext:void 0,threadId};let deliveryContext;try{let store=loadSessionStore(resolveStorePath(loadConfig().session?.store)),entry=store[sessionKey];!entry?.deliveryContext&&baseSessionKey!==sessionKey&&(entry=store[baseSessionKey]),entry?.deliveryContext&&(deliveryContext={channel:entry.deliveryContext.channel,to:entry.deliveryContext.to,accountId:entry.deliveryContext.accountId})}catch{}return{deliveryContext,threadId}}export{deliveryContextKey as $,canonicalizeMainSessionAlias as A,resolveChannelGroupPolicy as B,evaluateSessionFreshness as C,resolveThreadFlag as D,resolveSessionResetType as E,deriveSessionMetaPatch as F,normalizeAtHashSlug as G,resolveChannelGroupToolsPolicy as H,snapshotSessionOrigin as I,normalizeStringEntriesLower as J,normalizeHyphenSlug as K,getChannelDock as L,resolveExplicitAgentSessionKey as M,resolveMainSessionKey as N,DEFAULT_RESET_TRIGGERS as O,resolveMainSessionKeyFromConfig as P,deliveryContextFromSession as Q,listChannelDocks as R,resolveSessionKey as S,resolveSessionResetPolicy as T,buildGroupDisplayName as U,resolveChannelGroupRequireMention as V,resolveGroupSessionKey as W,cleanStaleLockFiles as X,acquireSessionWriteLock as Y,resolveSessionLockMaxHoldFromTimeout as Z,readSessionMessages as _,loadSessionStore as a,resolveSessionTranscriptCandidates as b,saveSessionStore as c,updateSessionStoreEntry as d,mergeDeliveryContext as et,isCacheEnabled as f,capArrayByJsonBytes as g,archiveSessionTranscripts as h,resolveMirroredTranscriptText as i,resolveAgentMainSessionKey as j,resolveFreshSessionTotalTokens as k,updateLastRoute as l,archiveFileOnDisk as m,parseSessionThreadInfo as n,normalizeSessionDeliveryFields as nt,readSessionUpdatedAt as o,resolveCacheTtlMs as p,normalizeStringEntries as q,appendAssistantMessageToSessionTranscript as r,normalizeAccountId as rt,recordSessionMetaFromInbound as s,extractDeliveryInfo as t,normalizeDeliveryContext as tt,updateSessionStore as u,readSessionPreviewItemsFromTranscript as v,resolveChannelResetConfig as w,stripEnvelopeFromMessages as x,readSessionTitleFieldsFromTranscript as y,normalizeSignalMessagingTarget as z};
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import{y as resolveRequiredHomeDir}from"./paths-5FcIFMsj.js";import{h as normalizeE164,l as escapeRegExp}from"./utils-DbaBVFaK.js";import{a as buildAgentMainSessionKey,d as normalizeAgentId,f as normalizeMainKey,r as DEFAULT_AGENT_ID,u as normalizeAccountId$1}from"./session-key-EoB0qaG9.js";import{t as createSubsystemLogger}from"./subsystem-B3TqcCrZ.js";import{f as requireActivePluginRegistry,n as CHAT_CHANNEL_ORDER,o as getChatChannelMeta}from"./registry-TdK-aV05.js";import{dn as resolveProcessScopedMap,fn as isPidAlive,ht as SessionManager,mt as CURRENT_SESSION_VERSION}from"./model-selection-9bRFKBI_.js";import{m as parseByteSize,r as loadConfig,y as parseDurationMs}from"./io-3R_ZyUxB.js";import{t as normalizeChatType}from"./chat-type-Cxpp3yM-.js";import{t as resolveConversationLabel}from"./conversation-label-D33-icmX.js";import{c as listDeliverableMessageChannels,l as normalizeMessageChannel}from"./message-channel-D_jXxXQj.js";import{_ as resolveDiscordAccount,a as normalizeWhatsAppTarget,d as resolveSlackAccount,f as resolveSlackReplyToMode,l as resolveTelegramAccount,r as normalizeChannelId}from"./plugins-D5zP6ENo.js";import{n as resolveWhatsAppAccount}from"./accounts-o35LU_iy.js";import{t as resolveIMessageAccount}from"./accounts-rmXEiebi.js";import{n as resolveSignalAccount}from"./accounts-BLueHgKj.js";import{a as resolveSessionTranscriptPathInDir,c as resolveStorePath,i as resolveSessionTranscriptPath,n as resolveSessionFilePath,t as resolveDefaultSessionStorePath}from"./paths-DJ6rztqJ.js";import{r as hasInterSessionUserProvenance}from"./input-provenance-Ch8I_rOX.js";import{n as extractToolCallNames,r as hasToolCall}from"./transcript-tools-BtY3Yyqr.js";import{t as emitSessionTranscriptUpdate}from"./transcript-events-C4rFYweQ.js";import fs from"node:fs";import os from"node:os";import path from"node:path";import crypto from"node:crypto";import fs$1 from"node:fs/promises";const CLEANUP_SIGNALS=[`SIGINT`,`SIGTERM`,`SIGQUIT`,`SIGABRT`],CLEANUP_STATE_KEY=Symbol.for(`builderforce.sessionWriteLockCleanupState`),HELD_LOCKS_KEY=Symbol.for(`builderforce.sessionWriteLockHeldLocks`),WATCHDOG_STATE_KEY=Symbol.for(`builderforce.sessionWriteLockWatchdogState`),DEFAULT_STALE_MS=1800*1e3,DEFAULT_MAX_HOLD_MS=300*1e3,DEFAULT_WATCHDOG_INTERVAL_MS=6e4,MAX_LOCK_HOLD_MS=2147e6,HELD_LOCKS=resolveProcessScopedMap(HELD_LOCKS_KEY);function resolveCleanupState(){let proc=process;return proc[CLEANUP_STATE_KEY]||(proc[CLEANUP_STATE_KEY]={registered:!1,cleanupHandlers:new Map}),proc[CLEANUP_STATE_KEY]}function resolveWatchdogState(){let proc=process;return proc[WATCHDOG_STATE_KEY]||(proc[WATCHDOG_STATE_KEY]={started:!1,intervalMs:DEFAULT_WATCHDOG_INTERVAL_MS}),proc[WATCHDOG_STATE_KEY]}function resolvePositiveMs(value,fallback,opts={}){return typeof value!=`number`||Number.isNaN(value)||value<=0?fallback:value===1/0?opts.allowInfinity?value:fallback:Number.isFinite(value)?value:fallback}function resolveSessionLockMaxHoldFromTimeout(params){let minMs=resolvePositiveMs(params.minMs,DEFAULT_MAX_HOLD_MS),timeoutMs=resolvePositiveMs(params.timeoutMs,minMs,{allowInfinity:!0});if(timeoutMs===1/0)return MAX_LOCK_HOLD_MS;let graceMs=resolvePositiveMs(params.graceMs,12e4);return Math.min(MAX_LOCK_HOLD_MS,Math.max(minMs,timeoutMs+graceMs))}async function releaseHeldLock(normalizedSessionFile,held,opts={}){if(HELD_LOCKS.get(normalizedSessionFile)!==held)return!1;if(opts.force)held.count=0;else if(--held.count,held.count>0)return!1;if(held.releasePromise)return await held.releasePromise.catch(()=>void 0),!0;HELD_LOCKS.delete(normalizedSessionFile),held.releasePromise=(async()=>{try{await held.handle.close()}catch{}try{await fs$1.rm(held.lockPath,{force:!0})}catch{}})();try{return await held.releasePromise,!0}finally{held.releasePromise=void 0}}function releaseAllLocksSync(){for(let[sessionFile,held]of HELD_LOCKS){try{typeof held.handle.close==`function`&&held.handle.close().catch(()=>{})}catch{}try{fs.rmSync(held.lockPath,{force:!0})}catch{}HELD_LOCKS.delete(sessionFile)}}async function runLockWatchdogCheck(nowMs=Date.now()){let released=0;for(let[sessionFile,held]of HELD_LOCKS.entries()){let heldForMs=nowMs-held.acquiredAt;heldForMs<=held.maxHoldMs||(console.warn(`[session-write-lock] releasing lock held for ${heldForMs}ms (max=${held.maxHoldMs}ms): ${held.lockPath}`),await releaseHeldLock(sessionFile,held,{force:!0})&&(released+=1))}return released}function ensureWatchdogStarted(intervalMs){let watchdogState=resolveWatchdogState();watchdogState.started||(watchdogState.started=!0,watchdogState.intervalMs=intervalMs,watchdogState.timer=setInterval(()=>{runLockWatchdogCheck().catch(()=>{})},intervalMs),watchdogState.timer.unref?.())}function handleTerminationSignal(signal){releaseAllLocksSync();let cleanupState=resolveCleanupState();if(process.listenerCount(signal)===1){let handler=cleanupState.cleanupHandlers.get(signal);handler&&(process.off(signal,handler),cleanupState.cleanupHandlers.delete(signal));try{process.kill(process.pid,signal)}catch{}}}function registerCleanupHandlers(){let cleanupState=resolveCleanupState();cleanupState.registered||(cleanupState.registered=!0,process.on(`exit`,()=>{releaseAllLocksSync()})),ensureWatchdogStarted(DEFAULT_WATCHDOG_INTERVAL_MS);for(let signal of CLEANUP_SIGNALS)if(!cleanupState.cleanupHandlers.has(signal))try{let handler=()=>handleTerminationSignal(signal);cleanupState.cleanupHandlers.set(signal,handler),process.on(signal,handler)}catch{}}async function readLockPayload(lockPath){try{let raw=await fs$1.readFile(lockPath,`utf8`),parsed=JSON.parse(raw),payload={};return typeof parsed.pid==`number`&&(payload.pid=parsed.pid),typeof parsed.createdAt==`string`&&(payload.createdAt=parsed.createdAt),payload}catch{return null}}function inspectLockPayload(payload,staleMs,nowMs){let pid=typeof payload?.pid==`number`?payload.pid:null,pidAlive=pid===null?!1:isPidAlive(pid),createdAt=typeof payload?.createdAt==`string`?payload.createdAt:null,createdAtMs=createdAt?Date.parse(createdAt):NaN,ageMs=Number.isFinite(createdAtMs)?Math.max(0,nowMs-createdAtMs):null,staleReasons=[];return pid===null?staleReasons.push(`missing-pid`):pidAlive||staleReasons.push(`dead-pid`),ageMs===null?staleReasons.push(`invalid-createdAt`):ageMs>staleMs&&staleReasons.push(`too-old`),{pid,pidAlive,createdAt,ageMs,stale:staleReasons.length>0,staleReasons}}async function cleanStaleLockFiles(params){let sessionsDir=path.resolve(params.sessionsDir),staleMs=resolvePositiveMs(params.staleMs,DEFAULT_STALE_MS),removeStale=params.removeStale!==!1,nowMs=params.nowMs??Date.now(),entries=[];try{entries=await fs$1.readdir(sessionsDir,{withFileTypes:!0})}catch(err){if(err.code===`ENOENT`)return{locks:[],cleaned:[]};throw err}let locks=[],cleaned=[],lockEntries=entries.filter(entry=>entry.name.endsWith(`.jsonl.lock`)).toSorted((a,b)=>a.name.localeCompare(b.name));for(let entry of lockEntries){let lockPath=path.join(sessionsDir,entry.name),lockInfo={lockPath,...inspectLockPayload(await readLockPayload(lockPath),staleMs,nowMs),removed:!1};lockInfo.stale&&removeStale&&(await fs$1.rm(lockPath,{force:!0}),lockInfo.removed=!0,cleaned.push(lockInfo),params.log?.warn?.(`removed stale session lock: ${lockPath} (${lockInfo.staleReasons.join(`, `)||`unknown`})`)),locks.push(lockInfo)}return{locks,cleaned}}async function acquireSessionWriteLock(params){registerCleanupHandlers();let timeoutMs=resolvePositiveMs(params.timeoutMs,1e4,{allowInfinity:!0}),staleMs=resolvePositiveMs(params.staleMs,DEFAULT_STALE_MS),maxHoldMs=resolvePositiveMs(params.maxHoldMs,DEFAULT_MAX_HOLD_MS),sessionFile=path.resolve(params.sessionFile),sessionDir=path.dirname(sessionFile);await fs$1.mkdir(sessionDir,{recursive:!0});let normalizedDir=sessionDir;try{normalizedDir=await fs$1.realpath(sessionDir)}catch{}let normalizedSessionFile=path.join(normalizedDir,path.basename(sessionFile)),lockPath=`${normalizedSessionFile}.lock`,allowReentrant=params.allowReentrant??!0,held=HELD_LOCKS.get(normalizedSessionFile);if(allowReentrant&&held)return held.count+=1,{release:async()=>{await releaseHeldLock(normalizedSessionFile,held)}};let startedAt=Date.now(),attempt=0;for(;Date.now()-startedAt<timeoutMs;){attempt+=1;try{let handle=await fs$1.open(lockPath,`wx`),createdAt=new Date().toISOString();await handle.writeFile(JSON.stringify({pid:process.pid,createdAt},null,2),`utf8`);let createdHeld={count:1,handle,lockPath,acquiredAt:Date.now(),maxHoldMs};return HELD_LOCKS.set(normalizedSessionFile,createdHeld),{release:async()=>{await releaseHeldLock(normalizedSessionFile,createdHeld)}}}catch(err){if(err.code!==`EEXIST`)throw err;if(inspectLockPayload(await readLockPayload(lockPath),staleMs,Date.now()).stale){await fs$1.rm(lockPath,{force:!0});continue}let delay=Math.min(1e3,50*attempt);await new Promise(r=>setTimeout(r,delay))}}let payload=await readLockPayload(lockPath),owner=typeof payload?.pid==`number`?`pid=${payload.pid}`:`unknown`;throw Error(`session file locked (timeout ${timeoutMs}ms): ${owner} ${lockPath}`)}[...CLEANUP_SIGNALS];function normalizeStringEntries(list){return(list??[]).map(entry=>String(entry).trim()).filter(Boolean)}function normalizeStringEntriesLower(list){return normalizeStringEntries(list).map(entry=>entry.toLowerCase())}function normalizeHyphenSlug(raw){let trimmed=raw?.trim().toLowerCase()??``;return trimmed?trimmed.replace(/\s+/g,`-`).replace(/[^a-z0-9#@._+-]+/g,`-`).replace(/-{2,}/g,`-`).replace(/^[-.]+|[-.]+$/g,``):``}function normalizeAtHashSlug(raw){let trimmed=raw?.trim().toLowerCase()??``;return trimmed?trimmed.replace(/^[@#]+/,``).replace(/[\s_]+/g,`-`).replace(/[^a-z0-9-]+/g,`-`).replace(/-{2,}/g,`-`).replace(/^-+|-+$/g,``):``}const getGroupSurfaces=()=>new Set([...listDeliverableMessageChannels(),`webchat`]);function normalizeGroupLabel(raw){return normalizeHyphenSlug(raw)}function shortenGroupId(value){let trimmed=value?.trim()??``;return trimmed?trimmed.length<=14?trimmed:`${trimmed.slice(0,6)}...${trimmed.slice(-4)}`:``}function buildGroupDisplayName(params){let providerKey=(params.provider?.trim().toLowerCase()||`group`).trim(),groupChannel=params.groupChannel?.trim(),space=params.space?.trim(),subject=params.subject?.trim(),detail=(groupChannel&&space?`${space}${groupChannel.startsWith(`#`)?``:`#`}${groupChannel}`:groupChannel||subject||space||``)||``,fallbackId=params.id?.trim()||params.key,rawLabel=detail||fallbackId,token=normalizeGroupLabel(rawLabel);return token||=normalizeGroupLabel(shortenGroupId(rawLabel)),!params.groupChannel&&token.startsWith(`#`)&&(token=token.replace(/^#+/,``)),token&&!/^[@#]/.test(token)&&!token.startsWith(`g-`)&&!token.includes(`#`)&&(token=`g-${token}`),token?`${providerKey}:${token}`:providerKey}function resolveGroupSessionKey(ctx){let from=typeof ctx.From==`string`?ctx.From.trim():``,chatType=ctx.ChatType?.trim().toLowerCase(),normalizedChatType=chatType===`channel`?`channel`:chatType===`group`?`group`:void 0,isWhatsAppGroupId=from.toLowerCase().endsWith(`@g.us`);if(!(normalizedChatType===`group`||normalizedChatType===`channel`||from.includes(`:group:`)||from.includes(`:channel:`)||isWhatsAppGroupId))return null;let providerHint=ctx.Provider?.trim().toLowerCase(),parts=from.split(`:`).filter(Boolean),head=parts[0]?.trim().toLowerCase()??``,headIsSurface=head?getGroupSurfaces().has(head):!1,provider=headIsSurface?head:providerHint??(isWhatsAppGroupId?`whatsapp`:void 0);if(!provider)return null;let second=parts[1]?.trim().toLowerCase(),secondIsKind=second===`group`||second===`channel`,kind=secondIsKind?second:from.includes(`:channel:`)||normalizedChatType===`channel`?`channel`:`group`,finalId=(headIsSurface?secondIsKind?parts.slice(2).join(`:`):parts.slice(1).join(`:`):from).trim().toLowerCase();return finalId?{key:`${provider}:${kind}:${finalId}`,channel:provider,id:finalId,chatType:kind===`channel`?`channel`:`group`}:null}function resolveChannelGroupConfig(groups,groupId,caseInsensitive=!1){if(!groups)return;let direct=groups[groupId];if(direct)return direct;if(!caseInsensitive)return;let target=groupId.toLowerCase(),matchedKey=Object.keys(groups).find(key=>key!==`*`&&key.toLowerCase()===target);if(matchedKey)return groups[matchedKey]}function normalizeSenderKey(value){let trimmed=value.trim();return trimmed?(trimmed.startsWith(`@`)?trimmed.slice(1):trimmed).toLowerCase():``}function resolveToolsBySender(params){let toolsBySender=params.toolsBySender;if(!toolsBySender)return;let entries=Object.entries(toolsBySender);if(entries.length===0)return;let normalized=new Map,wildcard;for(let[rawKey,policy]of entries){if(!policy)continue;let key=normalizeSenderKey(rawKey);if(key){if(key===`*`){wildcard=policy;continue}normalized.has(key)||normalized.set(key,policy)}}let candidates=[],pushCandidate=value=>{let trimmed=value?.trim();trimmed&&candidates.push(trimmed)};pushCandidate(params.senderId),pushCandidate(params.senderE164),pushCandidate(params.senderUsername),pushCandidate(params.senderName);for(let candidate of candidates){let key=normalizeSenderKey(candidate);if(!key)continue;let match=normalized.get(key);if(match)return match}return wildcard}function resolveChannelGroups(cfg,channel,accountId){let normalizedAccountId=normalizeAccountId$1(accountId),channelConfig=cfg.channels?.[channel];if(channelConfig)return channelConfig.accounts?.[normalizedAccountId]?.groups??channelConfig.accounts?.[Object.keys(channelConfig.accounts??{}).find(key=>key.toLowerCase()===normalizedAccountId.toLowerCase())??``]?.groups??channelConfig.groups}function resolveChannelGroupPolicy(params){let{cfg,channel}=params,groups=resolveChannelGroups(cfg,channel,params.accountId),allowlistEnabled=!!(groups&&Object.keys(groups).length>0),normalizedId=params.groupId?.trim(),groupConfig=normalizedId?resolveChannelGroupConfig(groups,normalizedId,params.groupIdCaseInsensitive):void 0,defaultConfig=groups?.[`*`];return{allowlistEnabled,allowed:!allowlistEnabled||allowlistEnabled&&!!(groups&&Object.hasOwn(groups,`*`))||!!groupConfig,groupConfig,defaultConfig}}function resolveChannelGroupRequireMention(params){let{requireMentionOverride,overrideOrder=`after-config`}=params,{groupConfig,defaultConfig}=resolveChannelGroupPolicy(params),configMention=typeof groupConfig?.requireMention==`boolean`?groupConfig.requireMention:typeof defaultConfig?.requireMention==`boolean`?defaultConfig.requireMention:void 0;return overrideOrder===`before-config`&&typeof requireMentionOverride==`boolean`?requireMentionOverride:typeof configMention==`boolean`?configMention:overrideOrder!==`before-config`&&typeof requireMentionOverride==`boolean`?requireMentionOverride:!0}function resolveChannelGroupToolsPolicy(params){let{groupConfig,defaultConfig}=resolveChannelGroupPolicy(params),groupSenderPolicy=resolveToolsBySender({toolsBySender:groupConfig?.toolsBySender,senderId:params.senderId,senderName:params.senderName,senderUsername:params.senderUsername,senderE164:params.senderE164});if(groupSenderPolicy)return groupSenderPolicy;if(groupConfig?.tools)return groupConfig.tools;let defaultSenderPolicy=resolveToolsBySender({toolsBySender:defaultConfig?.toolsBySender,senderId:params.senderId,senderName:params.senderName,senderUsername:params.senderUsername,senderE164:params.senderE164});if(defaultSenderPolicy)return defaultSenderPolicy;if(defaultConfig?.tools)return defaultConfig.tools}function buildSlackThreadingToolContext(params){let configuredReplyToMode=resolveSlackReplyToMode(resolveSlackAccount({cfg:params.cfg,accountId:params.accountId}),params.context.ChatType),effectiveReplyToMode=params.context.ThreadLabel?`all`:configuredReplyToMode,threadId=params.context.MessageThreadId??params.context.ReplyToId;return{currentChannelId:params.context.To?.startsWith(`channel:`)?params.context.To.slice(8):void 0,currentThreadTs:threadId==null?void 0:String(threadId),replyToMode:effectiveReplyToMode,hasRepliedRef:params.hasRepliedRef}}function normalizeDiscordSlug(value){return normalizeAtHashSlug(value)}function parseTelegramGroupId(value){let raw=value?.trim()??``;if(!raw)return{chatId:void 0,topicId:void 0};let parts=raw.split(`:`).filter(Boolean);return parts.length>=3&&parts[1]===`topic`&&/^-?\d+$/.test(parts[0])&&/^\d+$/.test(parts[2])?{chatId:parts[0],topicId:parts[2]}:parts.length>=2&&/^-?\d+$/.test(parts[0])&&/^\d+$/.test(parts[1])?{chatId:parts[0],topicId:parts[1]}:{chatId:raw,topicId:void 0}}function resolveTelegramRequireMention(params){let{cfg,chatId,topicId}=params;if(!chatId)return;let groupConfig=cfg.channels?.telegram?.groups?.[chatId],groupDefault=cfg.channels?.telegram?.groups?.[`*`],topicConfig=topicId&&groupConfig?.topics?groupConfig.topics[topicId]:void 0,defaultTopicConfig=topicId&&groupDefault?.topics?groupDefault.topics[topicId]:void 0;if(typeof topicConfig?.requireMention==`boolean`)return topicConfig.requireMention;if(typeof defaultTopicConfig?.requireMention==`boolean`)return defaultTopicConfig.requireMention;if(typeof groupConfig?.requireMention==`boolean`)return groupConfig.requireMention;if(typeof groupDefault?.requireMention==`boolean`)return groupDefault.requireMention}function resolveDiscordGuildEntry(guilds,groupSpace){if(!guilds||Object.keys(guilds).length===0)return null;let space=groupSpace?.trim()??``;if(space&&guilds[space])return guilds[space];let normalized=normalizeDiscordSlug(space);if(normalized&&guilds[normalized])return guilds[normalized];if(normalized){let match=Object.values(guilds).find(entry=>normalizeDiscordSlug(entry?.slug??void 0)===normalized);if(match)return match}return guilds[`*`]??null}function resolveDiscordChannelEntry(channelEntries,params){if(!channelEntries||Object.keys(channelEntries).length===0)return;let groupChannel=params.groupChannel,channelSlug=normalizeDiscordSlug(groupChannel);return(params.groupId?channelEntries[params.groupId]:void 0)??(channelSlug?channelEntries[channelSlug]??channelEntries[`#${channelSlug}`]:void 0)??(groupChannel?channelEntries[normalizeDiscordSlug(groupChannel)]:void 0)}function resolveSlackChannelPolicyEntry(params){let channels=resolveSlackAccount({cfg:params.cfg,accountId:params.accountId}).channels??{};if(Object.keys(channels).length===0)return;let channelId=params.groupId?.trim(),channelName=params.groupChannel?.replace(/^#/,``),normalizedName=normalizeHyphenSlug(channelName),candidates=[channelId??``,channelName?`#${channelName}`:``,channelName??``,normalizedName].filter(Boolean);for(let candidate of candidates)if(candidate&&channels[candidate])return channels[candidate];return channels[`*`]}function resolveTelegramGroupRequireMention(params){let{chatId,topicId}=parseTelegramGroupId(params.groupId),requireMention=resolveTelegramRequireMention({cfg:params.cfg,chatId,topicId});return typeof requireMention==`boolean`?requireMention:resolveChannelGroupRequireMention({cfg:params.cfg,channel:`telegram`,groupId:chatId??params.groupId,accountId:params.accountId})}function resolveWhatsAppGroupRequireMention(params){return resolveChannelGroupRequireMention({cfg:params.cfg,channel:`whatsapp`,groupId:params.groupId,accountId:params.accountId})}function resolveIMessageGroupRequireMention(params){return resolveChannelGroupRequireMention({cfg:params.cfg,channel:`imessage`,groupId:params.groupId,accountId:params.accountId})}function resolveDiscordGroupRequireMention(params){let guildEntry=resolveDiscordGuildEntry(params.cfg.channels?.discord?.guilds,params.groupSpace),channelEntries=guildEntry?.channels;if(channelEntries&&Object.keys(channelEntries).length>0){let entry=resolveDiscordChannelEntry(channelEntries,params);if(entry&&typeof entry.requireMention==`boolean`)return entry.requireMention}return typeof guildEntry?.requireMention==`boolean`?guildEntry.requireMention:!0}function resolveGoogleChatGroupRequireMention(params){return resolveChannelGroupRequireMention({cfg:params.cfg,channel:`googlechat`,groupId:params.groupId,accountId:params.accountId})}function resolveGoogleChatGroupToolPolicy(params){return resolveChannelGroupToolsPolicy({cfg:params.cfg,channel:`googlechat`,groupId:params.groupId,accountId:params.accountId,senderId:params.senderId,senderName:params.senderName,senderUsername:params.senderUsername,senderE164:params.senderE164})}function resolveSlackGroupRequireMention(params){let resolved=resolveSlackChannelPolicyEntry(params);return typeof resolved?.requireMention==`boolean`?resolved.requireMention:!0}function resolveTelegramGroupToolPolicy(params){let{chatId}=parseTelegramGroupId(params.groupId);return resolveChannelGroupToolsPolicy({cfg:params.cfg,channel:`telegram`,groupId:chatId??params.groupId,accountId:params.accountId,senderId:params.senderId,senderName:params.senderName,senderUsername:params.senderUsername,senderE164:params.senderE164})}function resolveWhatsAppGroupToolPolicy(params){return resolveChannelGroupToolsPolicy({cfg:params.cfg,channel:`whatsapp`,groupId:params.groupId,accountId:params.accountId,senderId:params.senderId,senderName:params.senderName,senderUsername:params.senderUsername,senderE164:params.senderE164})}function resolveIMessageGroupToolPolicy(params){return resolveChannelGroupToolsPolicy({cfg:params.cfg,channel:`imessage`,groupId:params.groupId,accountId:params.accountId,senderId:params.senderId,senderName:params.senderName,senderUsername:params.senderUsername,senderE164:params.senderE164})}function resolveDiscordGroupToolPolicy(params){let guildEntry=resolveDiscordGuildEntry(params.cfg.channels?.discord?.guilds,params.groupSpace),channelEntries=guildEntry?.channels;if(channelEntries&&Object.keys(channelEntries).length>0){let entry=resolveDiscordChannelEntry(channelEntries,params),senderPolicy=resolveToolsBySender({toolsBySender:entry?.toolsBySender,senderId:params.senderId,senderName:params.senderName,senderUsername:params.senderUsername,senderE164:params.senderE164});if(senderPolicy)return senderPolicy;if(entry?.tools)return entry.tools}let guildSenderPolicy=resolveToolsBySender({toolsBySender:guildEntry?.toolsBySender,senderId:params.senderId,senderName:params.senderName,senderUsername:params.senderUsername,senderE164:params.senderE164});if(guildSenderPolicy)return guildSenderPolicy;if(guildEntry?.tools)return guildEntry.tools}function resolveSlackGroupToolPolicy(params){let resolved=resolveSlackChannelPolicyEntry(params);if(!resolved)return;let senderPolicy=resolveToolsBySender({toolsBySender:resolved?.toolsBySender,senderId:params.senderId,senderName:params.senderName,senderUsername:params.senderUsername,senderE164:params.senderE164});if(senderPolicy)return senderPolicy;if(resolved?.tools)return resolved.tools}function normalizeSignalMessagingTarget(raw){let trimmed=raw.trim();if(!trimmed)return;let normalized=trimmed;if(normalized.toLowerCase().startsWith(`signal:`)&&(normalized=normalized.slice(7).trim()),!normalized)return;let lower=normalized.toLowerCase();if(lower.startsWith(`group:`)){let id=normalized.slice(6).trim();return id?`group:${id}`:void 0}if(lower.startsWith(`username:`)){let id=normalized.slice(9).trim();return id?`username:${id}`.toLowerCase():void 0}if(lower.startsWith(`u:`)){let id=normalized.slice(2).trim();return id?`username:${id}`.toLowerCase():void 0}if(lower.startsWith(`uuid:`)){let id=normalized.slice(5).trim();return id?id.toLowerCase():void 0}return normalized.toLowerCase()}const formatLower=allowFrom=>allowFrom.map(entry=>String(entry).trim()).filter(Boolean).map(entry=>entry.toLowerCase()),formatDiscordAllowFrom=allowFrom=>allowFrom.map(entry=>String(entry).trim().replace(/^<@!?/,``).replace(/>$/,``).replace(/^discord:/i,``).replace(/^user:/i,``).replace(/^pk:/i,``).trim().toLowerCase()).filter(Boolean);function resolveDirectOrGroupChannelId(context){return(context.ChatType?.toLowerCase()===`direct`?context.From??context.To:context.To)?.trim()||void 0}function buildSignalThreadToolContext(params){let currentChannelIdRaw=resolveDirectOrGroupChannelId(params.context);return{currentChannelId:currentChannelIdRaw?normalizeSignalMessagingTarget(currentChannelIdRaw)??currentChannelIdRaw.trim():void 0,currentThreadTs:params.context.ReplyToId,hasRepliedRef:params.hasRepliedRef}}function buildIMessageThreadToolContext(params){return{currentChannelId:resolveDirectOrGroupChannelId(params.context),currentThreadTs:params.context.ReplyToId,hasRepliedRef:params.hasRepliedRef}}function resolveCaseInsensitiveAccount(accounts,accountId){if(!accounts)return;let normalized=normalizeAccountId$1(accountId);return accounts[normalized]??accounts[Object.keys(accounts).find(key=>key.toLowerCase()===normalized.toLowerCase())??``]}const DOCKS={telegram:{id:`telegram`,capabilities:{chatTypes:[`direct`,`group`,`channel`,`thread`],nativeCommands:!0,blockStreaming:!0},outbound:{textChunkLimit:4e3},config:{resolveAllowFrom:({cfg,accountId})=>(resolveTelegramAccount({cfg,accountId}).config.allowFrom??[]).map(entry=>String(entry)),formatAllowFrom:({allowFrom})=>allowFrom.map(entry=>String(entry).trim()).filter(Boolean).map(entry=>entry.replace(/^(telegram|tg):/i,``)).map(entry=>entry.toLowerCase())},groups:{resolveRequireMention:resolveTelegramGroupRequireMention,resolveToolPolicy:resolveTelegramGroupToolPolicy},threading:{resolveReplyToMode:({cfg})=>cfg.channels?.telegram?.replyToMode??`off`,buildToolContext:({context,hasRepliedRef})=>{let threadId=context.MessageThreadId??context.ReplyToId;return{currentChannelId:context.To?.trim()||void 0,currentThreadTs:threadId==null?void 0:String(threadId),hasRepliedRef}}}},whatsapp:{id:`whatsapp`,capabilities:{chatTypes:[`direct`,`group`],polls:!0,reactions:!0,media:!0},commands:{enforceOwnerForCommands:!0,skipWhenConfigEmpty:!0},outbound:{textChunkLimit:4e3},config:{resolveAllowFrom:({cfg,accountId})=>resolveWhatsAppAccount({cfg,accountId}).allowFrom??[],formatAllowFrom:({allowFrom})=>allowFrom.map(entry=>String(entry).trim()).filter(entry=>!!entry).map(entry=>entry===`*`?entry:normalizeWhatsAppTarget(entry)).filter(entry=>!!entry)},groups:{resolveRequireMention:resolveWhatsAppGroupRequireMention,resolveToolPolicy:resolveWhatsAppGroupToolPolicy,resolveGroupIntroHint:()=>`WhatsApp IDs: SenderId is the participant JID (group participant id).`},mentions:{stripPatterns:({ctx})=>{let selfE164=(ctx.To??``).replace(/^whatsapp:/,``);if(!selfE164)return[];let escaped=escapeRegExp(selfE164);return[escaped,`@${escaped}`]}},threading:{buildToolContext:({context,hasRepliedRef})=>({currentChannelId:context.From?.trim()||context.To?.trim()||void 0,currentThreadTs:context.ReplyToId,hasRepliedRef})}},discord:{id:`discord`,capabilities:{chatTypes:[`direct`,`channel`,`thread`],polls:!0,reactions:!0,media:!0,nativeCommands:!0,threads:!0},outbound:{textChunkLimit:2e3},streaming:{blockStreamingCoalesceDefaults:{minChars:1500,idleMs:1e3}},elevated:{allowFromFallback:({cfg})=>cfg.channels?.discord?.allowFrom??cfg.channels?.discord?.dm?.allowFrom},config:{resolveAllowFrom:({cfg,accountId})=>{let account=resolveDiscordAccount({cfg,accountId});return(account.config.allowFrom??account.config.dm?.allowFrom??[]).map(entry=>String(entry))},formatAllowFrom:({allowFrom})=>formatDiscordAllowFrom(allowFrom)},groups:{resolveRequireMention:resolveDiscordGroupRequireMention,resolveToolPolicy:resolveDiscordGroupToolPolicy},mentions:{stripPatterns:()=>[`<@!?\\d+>`]},threading:{resolveReplyToMode:({cfg})=>cfg.channels?.discord?.replyToMode??`off`,buildToolContext:({context,hasRepliedRef})=>({currentChannelId:context.To?.trim()||void 0,currentThreadTs:context.ReplyToId,hasRepliedRef})}},irc:{id:`irc`,capabilities:{chatTypes:[`direct`,`group`],media:!0,blockStreaming:!0},outbound:{textChunkLimit:350},streaming:{blockStreamingCoalesceDefaults:{minChars:300,idleMs:1e3}},config:{resolveAllowFrom:({cfg,accountId})=>{let channel=cfg.channels?.irc;return(resolveCaseInsensitiveAccount(channel?.accounts,accountId)?.allowFrom??channel?.allowFrom??[]).map(entry=>String(entry))},formatAllowFrom:({allowFrom})=>allowFrom.map(entry=>String(entry).trim()).filter(Boolean).map(entry=>entry.replace(/^irc:/i,``).replace(/^user:/i,``).toLowerCase())},groups:{resolveRequireMention:({cfg,accountId,groupId})=>groupId?resolveChannelGroupRequireMention({cfg,channel:`irc`,groupId,accountId,groupIdCaseInsensitive:!0}):!0,resolveToolPolicy:({cfg,accountId,groupId,senderId,senderName,senderUsername})=>{if(groupId)return resolveChannelGroupToolsPolicy({cfg,channel:`irc`,groupId,accountId,groupIdCaseInsensitive:!0,senderId,senderName,senderUsername})}}},googlechat:{id:`googlechat`,capabilities:{chatTypes:[`direct`,`group`,`thread`],reactions:!0,media:!0,threads:!0,blockStreaming:!0},outbound:{textChunkLimit:4e3},config:{resolveAllowFrom:({cfg,accountId})=>{let channel=cfg.channels?.googlechat;return(resolveCaseInsensitiveAccount(channel?.accounts,accountId)?.dm?.allowFrom??channel?.dm?.allowFrom??[]).map(entry=>String(entry))},formatAllowFrom:({allowFrom})=>allowFrom.map(entry=>String(entry).trim()).filter(Boolean).map(entry=>entry.replace(/^(googlechat|google-chat|gchat):/i,``).replace(/^user:/i,``).replace(/^users\//i,``).toLowerCase())},groups:{resolveRequireMention:resolveGoogleChatGroupRequireMention,resolveToolPolicy:resolveGoogleChatGroupToolPolicy},threading:{resolveReplyToMode:({cfg})=>cfg.channels?.googlechat?.replyToMode??`off`,buildToolContext:({context,hasRepliedRef})=>{let threadId=context.MessageThreadId??context.ReplyToId;return{currentChannelId:context.To?.trim()||void 0,currentThreadTs:threadId==null?void 0:String(threadId),hasRepliedRef}}}},slack:{id:`slack`,capabilities:{chatTypes:[`direct`,`channel`,`thread`],reactions:!0,media:!0,nativeCommands:!0,threads:!0},outbound:{textChunkLimit:4e3},streaming:{blockStreamingCoalesceDefaults:{minChars:1500,idleMs:1e3}},config:{resolveAllowFrom:({cfg,accountId})=>{let account=resolveSlackAccount({cfg,accountId});return(account.config.allowFrom??account.dm?.allowFrom??[]).map(entry=>String(entry))},formatAllowFrom:({allowFrom})=>formatLower(allowFrom)},groups:{resolveRequireMention:resolveSlackGroupRequireMention,resolveToolPolicy:resolveSlackGroupToolPolicy},mentions:{stripPatterns:()=>[`<@[^>]+>`]},threading:{resolveReplyToMode:({cfg,accountId,chatType})=>resolveSlackReplyToMode(resolveSlackAccount({cfg,accountId}),chatType),allowExplicitReplyTagsWhenOff:!0,buildToolContext:params=>buildSlackThreadingToolContext(params)}},signal:{id:`signal`,capabilities:{chatTypes:[`direct`,`group`],reactions:!0,media:!0},outbound:{textChunkLimit:4e3},streaming:{blockStreamingCoalesceDefaults:{minChars:1500,idleMs:1e3}},config:{resolveAllowFrom:({cfg,accountId})=>(resolveSignalAccount({cfg,accountId}).config.allowFrom??[]).map(entry=>String(entry)),formatAllowFrom:({allowFrom})=>allowFrom.map(entry=>String(entry).trim()).filter(Boolean).map(entry=>entry===`*`?`*`:normalizeE164(entry.replace(/^signal:/i,``))).filter(Boolean)},threading:{buildToolContext:({context,hasRepliedRef})=>buildSignalThreadToolContext({context,hasRepliedRef})}},imessage:{id:`imessage`,capabilities:{chatTypes:[`direct`,`group`],reactions:!0,media:!0},outbound:{textChunkLimit:4e3},config:{resolveAllowFrom:({cfg,accountId})=>(resolveIMessageAccount({cfg,accountId}).config.allowFrom??[]).map(entry=>String(entry)),formatAllowFrom:({allowFrom})=>allowFrom.map(entry=>String(entry).trim()).filter(Boolean)},groups:{resolveRequireMention:resolveIMessageGroupRequireMention,resolveToolPolicy:resolveIMessageGroupToolPolicy},threading:{buildToolContext:({context,hasRepliedRef})=>buildIMessageThreadToolContext({context,hasRepliedRef})}}};function buildDockFromPlugin(plugin){return{id:plugin.id,capabilities:plugin.capabilities,commands:plugin.commands,outbound:plugin.outbound?.textChunkLimit?{textChunkLimit:plugin.outbound.textChunkLimit}:void 0,streaming:plugin.streaming?{blockStreamingCoalesceDefaults:plugin.streaming.blockStreamingCoalesceDefaults}:void 0,elevated:plugin.elevated,config:plugin.config?{resolveAllowFrom:plugin.config.resolveAllowFrom,formatAllowFrom:plugin.config.formatAllowFrom}:void 0,groups:plugin.groups,mentions:plugin.mentions,threading:plugin.threading,agentPrompt:plugin.agentPrompt}}function listPluginDockEntries(){let registry=requireActivePluginRegistry(),entries=[],seen=new Set;for(let entry of registry.channels){let plugin=entry.plugin,id=String(plugin.id).trim();if(!id||seen.has(id)||(seen.add(id),CHAT_CHANNEL_ORDER.includes(plugin.id)))continue;let dock=entry.dock??buildDockFromPlugin(plugin);entries.push({id:plugin.id,dock,order:plugin.meta.order})}return entries}function listChannelDocks(){let baseEntries=CHAT_CHANNEL_ORDER.map(id=>({id,dock:DOCKS[id],order:getChatChannelMeta(id).order})),pluginEntries=listPluginDockEntries(),combined=[...baseEntries,...pluginEntries];return combined.sort((a,b)=>{let indexA=CHAT_CHANNEL_ORDER.indexOf(a.id),indexB=CHAT_CHANNEL_ORDER.indexOf(b.id),orderA=a.order??(indexA===-1?999:indexA),orderB=b.order??(indexB===-1?999:indexB);return orderA===orderB?String(a.id).localeCompare(String(b.id)):orderA-orderB}),combined.map(entry=>entry.dock)}function getChannelDock(id){let core=DOCKS[id];if(core)return core;let pluginEntry=requireActivePluginRegistry().channels.find(entry=>entry.plugin.id===id);if(pluginEntry)return pluginEntry.dock??buildDockFromPlugin(pluginEntry.plugin)}const mergeOrigin=(existing,next)=>{if(!existing&&!next)return;let merged=existing?{...existing}:{};return next?.label&&(merged.label=next.label),next?.provider&&(merged.provider=next.provider),next?.surface&&(merged.surface=next.surface),next?.chatType&&(merged.chatType=next.chatType),next?.from&&(merged.from=next.from),next?.to&&(merged.to=next.to),next?.accountId&&(merged.accountId=next.accountId),next?.threadId!=null&&next.threadId!==``&&(merged.threadId=next.threadId),Object.keys(merged).length>0?merged:void 0};function deriveSessionOrigin(ctx){let label=resolveConversationLabel(ctx)?.trim(),provider=normalizeMessageChannel(typeof ctx.OriginatingChannel==`string`&&ctx.OriginatingChannel||ctx.Surface||ctx.Provider),surface=ctx.Surface?.trim().toLowerCase(),chatType=normalizeChatType(ctx.ChatType)??void 0,from=ctx.From?.trim(),to=(typeof ctx.OriginatingTo==`string`?ctx.OriginatingTo:ctx.To)?.trim()??void 0,accountId=ctx.AccountId?.trim(),threadId=ctx.MessageThreadId??void 0,origin={};return label&&(origin.label=label),provider&&(origin.provider=provider),surface&&(origin.surface=surface),chatType&&(origin.chatType=chatType),from&&(origin.from=from),to&&(origin.to=to),accountId&&(origin.accountId=accountId),threadId!=null&&threadId!==``&&(origin.threadId=threadId),Object.keys(origin).length>0?origin:void 0}function snapshotSessionOrigin(entry){if(entry?.origin)return{...entry.origin}}function deriveGroupSessionPatch(params){let resolution=params.groupResolution??resolveGroupSessionKey(params.ctx);if(!resolution?.channel)return null;let channel=resolution.channel,subject=params.ctx.GroupSubject?.trim(),space=params.ctx.GroupSpace?.trim(),explicitChannel=params.ctx.GroupChannel?.trim(),normalizedChannel=normalizeChannelId(channel),isChannelProvider=!!(normalizedChannel&&getChannelDock(normalizedChannel)?.capabilities.chatTypes.includes(`channel`)),nextGroupChannel=explicitChannel??((resolution.chatType===`channel`||isChannelProvider)&&subject&&subject.startsWith(`#`)?subject:void 0),nextSubject=nextGroupChannel?void 0:subject,patch={chatType:resolution.chatType??`group`,channel,groupId:resolution.id};nextSubject&&(patch.subject=nextSubject),nextGroupChannel&&(patch.groupChannel=nextGroupChannel),space&&(patch.space=space);let displayName=buildGroupDisplayName({provider:channel,subject:nextSubject??params.existing?.subject,groupChannel:nextGroupChannel??params.existing?.groupChannel,space:space??params.existing?.space,id:resolution.id,key:params.sessionKey});return displayName&&(patch.displayName=displayName),patch}function deriveSessionMetaPatch(params){let groupPatch=deriveGroupSessionPatch(params),origin=deriveSessionOrigin(params.ctx);if(!groupPatch&&!origin)return null;let patch=groupPatch?{...groupPatch}:{},mergedOrigin=mergeOrigin(params.existing?.origin,origin);return mergedOrigin&&(patch.origin=mergedOrigin),Object.keys(patch).length>0?patch:null}function resolveMainSessionKey(cfg){if(cfg?.session?.scope===`global`)return`global`;let agents=cfg?.agents?.list??[];return buildAgentMainSessionKey({agentId:normalizeAgentId(agents.find(agent=>agent?.default)?.id??agents[0]?.id??DEFAULT_AGENT_ID),mainKey:normalizeMainKey(cfg?.session?.mainKey)})}function resolveMainSessionKeyFromConfig(){return resolveMainSessionKey(loadConfig())}function resolveAgentMainSessionKey(params){let mainKey=normalizeMainKey(params.cfg?.session?.mainKey);return buildAgentMainSessionKey({agentId:params.agentId,mainKey})}function resolveExplicitAgentSessionKey(params){let agentId=params.agentId?.trim();if(agentId)return resolveAgentMainSessionKey({cfg:params.cfg,agentId})}function canonicalizeMainSessionAlias(params){let raw=params.sessionKey.trim();if(!raw)return raw;let agentId=normalizeAgentId(params.agentId),mainKey=normalizeMainKey(params.cfg?.session?.mainKey),agentMainSessionKey=buildAgentMainSessionKey({agentId,mainKey}),agentMainAliasKey=buildAgentMainSessionKey({agentId,mainKey:`main`}),isMainAlias=raw===`main`||raw===mainKey||raw===agentMainSessionKey||raw===agentMainAliasKey;return params.cfg?.session?.scope===`global`&&isMainAlias?`global`:isMainAlias?agentMainSessionKey:raw}function mergeSessionEntry(existing,patch){let sessionId=patch.sessionId??existing?.sessionId??crypto.randomUUID(),updatedAt=Math.max(existing?.updatedAt??0,patch.updatedAt??0,Date.now());return existing?{...existing,...patch,sessionId,updatedAt}:{...patch,sessionId,updatedAt}}function resolveFreshSessionTotalTokens(entry){let total=entry?.totalTokens;if(!(typeof total!=`number`||!Number.isFinite(total)||total<0)&&entry?.totalTokensFresh!==!1)return total}const DEFAULT_RESET_TRIGGERS=[`/new`,`/reset`],THREAD_SESSION_MARKERS=[`:thread:`,`:topic:`],GROUP_SESSION_MARKERS=[`:group:`,`:channel:`];function isThreadSessionKey(sessionKey){let normalized=(sessionKey??``).toLowerCase();return normalized?THREAD_SESSION_MARKERS.some(marker=>normalized.includes(marker)):!1}function resolveSessionResetType(params){if(params.isThread||isThreadSessionKey(params.sessionKey))return`thread`;if(params.isGroup)return`group`;let normalized=(params.sessionKey??``).toLowerCase();return GROUP_SESSION_MARKERS.some(marker=>normalized.includes(marker))?`group`:`direct`}function resolveThreadFlag(params){return params.messageThreadId!=null||params.threadLabel?.trim()||params.threadStarterBody?.trim()||params.parentSessionKey?.trim()?!0:isThreadSessionKey(params.sessionKey)}function resolveDailyResetAtMs(now,atHour){let normalizedAtHour=normalizeResetAtHour(atHour),resetAt=new Date(now);return resetAt.setHours(normalizedAtHour,0,0,0),now<resetAt.getTime()&&resetAt.setDate(resetAt.getDate()-1),resetAt.getTime()}function resolveSessionResetPolicy(params){let sessionCfg=params.sessionCfg,baseReset=params.resetOverride??sessionCfg?.reset,typeReset=params.resetOverride?void 0:sessionCfg?.resetByType?.[params.resetType]??(params.resetType===`direct`?sessionCfg?.resetByType?.dm:void 0),hasExplicitReset=!!(baseReset||sessionCfg?.resetByType),legacyIdleMinutes=params.resetOverride?void 0:sessionCfg?.idleMinutes,mode=typeReset?.mode??baseReset?.mode??(!hasExplicitReset&&legacyIdleMinutes!=null?`idle`:`daily`),atHour=normalizeResetAtHour(typeReset?.atHour??baseReset?.atHour??4),idleMinutesRaw=typeReset?.idleMinutes??baseReset?.idleMinutes??legacyIdleMinutes,idleMinutes;if(idleMinutesRaw!=null){let normalized=Math.floor(idleMinutesRaw);Number.isFinite(normalized)&&(idleMinutes=Math.max(normalized,1))}else mode===`idle`&&(idleMinutes=60);return{mode,atHour,idleMinutes}}function resolveChannelResetConfig(params){let resetByChannel=params.sessionCfg?.resetByChannel;if(!resetByChannel)return;let normalized=normalizeMessageChannel(params.channel),fallback=params.channel?.trim().toLowerCase(),key=normalized??fallback;if(key)return resetByChannel[key]??resetByChannel[key.toLowerCase()]}function evaluateSessionFreshness(params){let dailyResetAt=params.policy.mode===`daily`?resolveDailyResetAtMs(params.now,params.policy.atHour):void 0,idleExpiresAt=params.policy.idleMinutes==null?void 0:params.updatedAt+params.policy.idleMinutes*6e4,staleDaily=dailyResetAt!=null&¶ms.updatedAt<dailyResetAt,staleIdle=idleExpiresAt!=null&¶ms.now>idleExpiresAt;return{fresh:!(staleDaily||staleIdle),dailyResetAt,idleExpiresAt}}function normalizeResetAtHour(value){if(typeof value!=`number`||!Number.isFinite(value))return 4;let normalized=Math.floor(value);return Number.isFinite(normalized)?normalized<0?0:normalized>23?23:normalized:4}function deriveSessionKey(scope,ctx){if(scope===`global`)return`global`;let resolvedGroup=resolveGroupSessionKey(ctx);return resolvedGroup?resolvedGroup.key:(ctx.From?normalizeE164(ctx.From):``)||`unknown`}function resolveSessionKey(scope,ctx,mainKey){let explicit=ctx.SessionKey?.trim();if(explicit)return explicit.toLowerCase();let raw=deriveSessionKey(scope,ctx);if(scope===`global`)return raw;let canonical=buildAgentMainSessionKey({agentId:DEFAULT_AGENT_ID,mainKey:normalizeMainKey(mainKey)});return raw.includes(`:group:`)||raw.includes(`:channel:`)?`agent:${DEFAULT_AGENT_ID}:${raw}`:canonical}const ENVELOPE_PREFIX=/^\[([^\]]+)\]\s*/,ENVELOPE_CHANNELS=[`WebChat`,`WhatsApp`,`Telegram`,`Signal`,`Slack`,`Discord`,`Google Chat`,`iMessage`,`Teams`,`Matrix`,`Zalo`,`Zalo Personal`,`BlueBubbles`],MESSAGE_ID_LINE=/^\s*\[message_id:\s*[^\]]+\]\s*$/i;function looksLikeEnvelopeHeader(header){return/\d{4}-\d{2}-\d{2}T\d{2}:\d{2}Z\b/.test(header)||/\d{4}-\d{2}-\d{2} \d{2}:\d{2}\b/.test(header)?!0:ENVELOPE_CHANNELS.some(label=>header.startsWith(`${label} `))}function stripEnvelope(text){let match=text.match(ENVELOPE_PREFIX);return!match||!looksLikeEnvelopeHeader(match[1]??``)?text:text.slice(match[0].length)}function stripMessageIdHints(text){if(!text.includes(`[message_id:`))return text;let lines=text.split(/\r?\n/),filtered=lines.filter(line=>!MESSAGE_ID_LINE.test(line));return filtered.length===lines.length?text:filtered.join(`
|
|
1
|
+
import{y as resolveRequiredHomeDir}from"./paths-5FcIFMsj.js";import{h as normalizeE164,l as escapeRegExp}from"./utils-DbaBVFaK.js";import{a as buildAgentMainSessionKey,d as normalizeAgentId,f as normalizeMainKey,r as DEFAULT_AGENT_ID,u as normalizeAccountId$1}from"./session-key-EoB0qaG9.js";import{t as createSubsystemLogger}from"./subsystem-B3TqcCrZ.js";import{f as requireActivePluginRegistry,n as CHAT_CHANNEL_ORDER,o as getChatChannelMeta}from"./registry-TdK-aV05.js";import{dn as resolveProcessScopedMap,fn as isPidAlive,ht as SessionManager,mt as CURRENT_SESSION_VERSION}from"./model-selection-DG9J_VTz.js";import{m as parseByteSize,r as loadConfig,y as parseDurationMs}from"./io-BLBq4T2o.js";import{t as normalizeChatType}from"./chat-type-Cxpp3yM-.js";import{t as resolveConversationLabel}from"./conversation-label-D33-icmX.js";import{c as listDeliverableMessageChannels,l as normalizeMessageChannel}from"./message-channel-D_jXxXQj.js";import{_ as resolveDiscordAccount,a as normalizeWhatsAppTarget,d as resolveSlackAccount,f as resolveSlackReplyToMode,l as resolveTelegramAccount,r as normalizeChannelId}from"./plugins-D5zP6ENo.js";import{n as resolveWhatsAppAccount}from"./accounts-o35LU_iy.js";import{t as resolveIMessageAccount}from"./accounts-rmXEiebi.js";import{n as resolveSignalAccount}from"./accounts-BLueHgKj.js";import{a as resolveSessionTranscriptPathInDir,c as resolveStorePath,i as resolveSessionTranscriptPath,n as resolveSessionFilePath,t as resolveDefaultSessionStorePath}from"./paths-DJ6rztqJ.js";import{r as hasInterSessionUserProvenance}from"./input-provenance-Ch8I_rOX.js";import{n as extractToolCallNames,r as hasToolCall}from"./transcript-tools-BtY3Yyqr.js";import{t as emitSessionTranscriptUpdate}from"./transcript-events-C4rFYweQ.js";import fs from"node:fs";import os from"node:os";import path from"node:path";import crypto from"node:crypto";import fs$1 from"node:fs/promises";const CLEANUP_SIGNALS=[`SIGINT`,`SIGTERM`,`SIGQUIT`,`SIGABRT`],CLEANUP_STATE_KEY=Symbol.for(`builderforce.sessionWriteLockCleanupState`),HELD_LOCKS_KEY=Symbol.for(`builderforce.sessionWriteLockHeldLocks`),WATCHDOG_STATE_KEY=Symbol.for(`builderforce.sessionWriteLockWatchdogState`),DEFAULT_STALE_MS=1800*1e3,DEFAULT_MAX_HOLD_MS=300*1e3,DEFAULT_WATCHDOG_INTERVAL_MS=6e4,MAX_LOCK_HOLD_MS=2147e6,HELD_LOCKS=resolveProcessScopedMap(HELD_LOCKS_KEY);function resolveCleanupState(){let proc=process;return proc[CLEANUP_STATE_KEY]||(proc[CLEANUP_STATE_KEY]={registered:!1,cleanupHandlers:new Map}),proc[CLEANUP_STATE_KEY]}function resolveWatchdogState(){let proc=process;return proc[WATCHDOG_STATE_KEY]||(proc[WATCHDOG_STATE_KEY]={started:!1,intervalMs:DEFAULT_WATCHDOG_INTERVAL_MS}),proc[WATCHDOG_STATE_KEY]}function resolvePositiveMs(value,fallback,opts={}){return typeof value!=`number`||Number.isNaN(value)||value<=0?fallback:value===1/0?opts.allowInfinity?value:fallback:Number.isFinite(value)?value:fallback}function resolveSessionLockMaxHoldFromTimeout(params){let minMs=resolvePositiveMs(params.minMs,DEFAULT_MAX_HOLD_MS),timeoutMs=resolvePositiveMs(params.timeoutMs,minMs,{allowInfinity:!0});if(timeoutMs===1/0)return MAX_LOCK_HOLD_MS;let graceMs=resolvePositiveMs(params.graceMs,12e4);return Math.min(MAX_LOCK_HOLD_MS,Math.max(minMs,timeoutMs+graceMs))}async function releaseHeldLock(normalizedSessionFile,held,opts={}){if(HELD_LOCKS.get(normalizedSessionFile)!==held)return!1;if(opts.force)held.count=0;else if(--held.count,held.count>0)return!1;if(held.releasePromise)return await held.releasePromise.catch(()=>void 0),!0;HELD_LOCKS.delete(normalizedSessionFile),held.releasePromise=(async()=>{try{await held.handle.close()}catch{}try{await fs$1.rm(held.lockPath,{force:!0})}catch{}})();try{return await held.releasePromise,!0}finally{held.releasePromise=void 0}}function releaseAllLocksSync(){for(let[sessionFile,held]of HELD_LOCKS){try{typeof held.handle.close==`function`&&held.handle.close().catch(()=>{})}catch{}try{fs.rmSync(held.lockPath,{force:!0})}catch{}HELD_LOCKS.delete(sessionFile)}}async function runLockWatchdogCheck(nowMs=Date.now()){let released=0;for(let[sessionFile,held]of HELD_LOCKS.entries()){let heldForMs=nowMs-held.acquiredAt;heldForMs<=held.maxHoldMs||(console.warn(`[session-write-lock] releasing lock held for ${heldForMs}ms (max=${held.maxHoldMs}ms): ${held.lockPath}`),await releaseHeldLock(sessionFile,held,{force:!0})&&(released+=1))}return released}function ensureWatchdogStarted(intervalMs){let watchdogState=resolveWatchdogState();watchdogState.started||(watchdogState.started=!0,watchdogState.intervalMs=intervalMs,watchdogState.timer=setInterval(()=>{runLockWatchdogCheck().catch(()=>{})},intervalMs),watchdogState.timer.unref?.())}function handleTerminationSignal(signal){releaseAllLocksSync();let cleanupState=resolveCleanupState();if(process.listenerCount(signal)===1){let handler=cleanupState.cleanupHandlers.get(signal);handler&&(process.off(signal,handler),cleanupState.cleanupHandlers.delete(signal));try{process.kill(process.pid,signal)}catch{}}}function registerCleanupHandlers(){let cleanupState=resolveCleanupState();cleanupState.registered||(cleanupState.registered=!0,process.on(`exit`,()=>{releaseAllLocksSync()})),ensureWatchdogStarted(DEFAULT_WATCHDOG_INTERVAL_MS);for(let signal of CLEANUP_SIGNALS)if(!cleanupState.cleanupHandlers.has(signal))try{let handler=()=>handleTerminationSignal(signal);cleanupState.cleanupHandlers.set(signal,handler),process.on(signal,handler)}catch{}}async function readLockPayload(lockPath){try{let raw=await fs$1.readFile(lockPath,`utf8`),parsed=JSON.parse(raw),payload={};return typeof parsed.pid==`number`&&(payload.pid=parsed.pid),typeof parsed.createdAt==`string`&&(payload.createdAt=parsed.createdAt),payload}catch{return null}}function inspectLockPayload(payload,staleMs,nowMs){let pid=typeof payload?.pid==`number`?payload.pid:null,pidAlive=pid===null?!1:isPidAlive(pid),createdAt=typeof payload?.createdAt==`string`?payload.createdAt:null,createdAtMs=createdAt?Date.parse(createdAt):NaN,ageMs=Number.isFinite(createdAtMs)?Math.max(0,nowMs-createdAtMs):null,staleReasons=[];return pid===null?staleReasons.push(`missing-pid`):pidAlive||staleReasons.push(`dead-pid`),ageMs===null?staleReasons.push(`invalid-createdAt`):ageMs>staleMs&&staleReasons.push(`too-old`),{pid,pidAlive,createdAt,ageMs,stale:staleReasons.length>0,staleReasons}}async function cleanStaleLockFiles(params){let sessionsDir=path.resolve(params.sessionsDir),staleMs=resolvePositiveMs(params.staleMs,DEFAULT_STALE_MS),removeStale=params.removeStale!==!1,nowMs=params.nowMs??Date.now(),entries=[];try{entries=await fs$1.readdir(sessionsDir,{withFileTypes:!0})}catch(err){if(err.code===`ENOENT`)return{locks:[],cleaned:[]};throw err}let locks=[],cleaned=[],lockEntries=entries.filter(entry=>entry.name.endsWith(`.jsonl.lock`)).toSorted((a,b)=>a.name.localeCompare(b.name));for(let entry of lockEntries){let lockPath=path.join(sessionsDir,entry.name),lockInfo={lockPath,...inspectLockPayload(await readLockPayload(lockPath),staleMs,nowMs),removed:!1};lockInfo.stale&&removeStale&&(await fs$1.rm(lockPath,{force:!0}),lockInfo.removed=!0,cleaned.push(lockInfo),params.log?.warn?.(`removed stale session lock: ${lockPath} (${lockInfo.staleReasons.join(`, `)||`unknown`})`)),locks.push(lockInfo)}return{locks,cleaned}}async function acquireSessionWriteLock(params){registerCleanupHandlers();let timeoutMs=resolvePositiveMs(params.timeoutMs,1e4,{allowInfinity:!0}),staleMs=resolvePositiveMs(params.staleMs,DEFAULT_STALE_MS),maxHoldMs=resolvePositiveMs(params.maxHoldMs,DEFAULT_MAX_HOLD_MS),sessionFile=path.resolve(params.sessionFile),sessionDir=path.dirname(sessionFile);await fs$1.mkdir(sessionDir,{recursive:!0});let normalizedDir=sessionDir;try{normalizedDir=await fs$1.realpath(sessionDir)}catch{}let normalizedSessionFile=path.join(normalizedDir,path.basename(sessionFile)),lockPath=`${normalizedSessionFile}.lock`,allowReentrant=params.allowReentrant??!0,held=HELD_LOCKS.get(normalizedSessionFile);if(allowReentrant&&held)return held.count+=1,{release:async()=>{await releaseHeldLock(normalizedSessionFile,held)}};let startedAt=Date.now(),attempt=0;for(;Date.now()-startedAt<timeoutMs;){attempt+=1;try{let handle=await fs$1.open(lockPath,`wx`),createdAt=new Date().toISOString();await handle.writeFile(JSON.stringify({pid:process.pid,createdAt},null,2),`utf8`);let createdHeld={count:1,handle,lockPath,acquiredAt:Date.now(),maxHoldMs};return HELD_LOCKS.set(normalizedSessionFile,createdHeld),{release:async()=>{await releaseHeldLock(normalizedSessionFile,createdHeld)}}}catch(err){if(err.code!==`EEXIST`)throw err;if(inspectLockPayload(await readLockPayload(lockPath),staleMs,Date.now()).stale){await fs$1.rm(lockPath,{force:!0});continue}let delay=Math.min(1e3,50*attempt);await new Promise(r=>setTimeout(r,delay))}}let payload=await readLockPayload(lockPath),owner=typeof payload?.pid==`number`?`pid=${payload.pid}`:`unknown`;throw Error(`session file locked (timeout ${timeoutMs}ms): ${owner} ${lockPath}`)}[...CLEANUP_SIGNALS];function normalizeStringEntries(list){return(list??[]).map(entry=>String(entry).trim()).filter(Boolean)}function normalizeStringEntriesLower(list){return normalizeStringEntries(list).map(entry=>entry.toLowerCase())}function normalizeHyphenSlug(raw){let trimmed=raw?.trim().toLowerCase()??``;return trimmed?trimmed.replace(/\s+/g,`-`).replace(/[^a-z0-9#@._+-]+/g,`-`).replace(/-{2,}/g,`-`).replace(/^[-.]+|[-.]+$/g,``):``}function normalizeAtHashSlug(raw){let trimmed=raw?.trim().toLowerCase()??``;return trimmed?trimmed.replace(/^[@#]+/,``).replace(/[\s_]+/g,`-`).replace(/[^a-z0-9-]+/g,`-`).replace(/-{2,}/g,`-`).replace(/^-+|-+$/g,``):``}const getGroupSurfaces=()=>new Set([...listDeliverableMessageChannels(),`webchat`]);function normalizeGroupLabel(raw){return normalizeHyphenSlug(raw)}function shortenGroupId(value){let trimmed=value?.trim()??``;return trimmed?trimmed.length<=14?trimmed:`${trimmed.slice(0,6)}...${trimmed.slice(-4)}`:``}function buildGroupDisplayName(params){let providerKey=(params.provider?.trim().toLowerCase()||`group`).trim(),groupChannel=params.groupChannel?.trim(),space=params.space?.trim(),subject=params.subject?.trim(),detail=(groupChannel&&space?`${space}${groupChannel.startsWith(`#`)?``:`#`}${groupChannel}`:groupChannel||subject||space||``)||``,fallbackId=params.id?.trim()||params.key,rawLabel=detail||fallbackId,token=normalizeGroupLabel(rawLabel);return token||=normalizeGroupLabel(shortenGroupId(rawLabel)),!params.groupChannel&&token.startsWith(`#`)&&(token=token.replace(/^#+/,``)),token&&!/^[@#]/.test(token)&&!token.startsWith(`g-`)&&!token.includes(`#`)&&(token=`g-${token}`),token?`${providerKey}:${token}`:providerKey}function resolveGroupSessionKey(ctx){let from=typeof ctx.From==`string`?ctx.From.trim():``,chatType=ctx.ChatType?.trim().toLowerCase(),normalizedChatType=chatType===`channel`?`channel`:chatType===`group`?`group`:void 0,isWhatsAppGroupId=from.toLowerCase().endsWith(`@g.us`);if(!(normalizedChatType===`group`||normalizedChatType===`channel`||from.includes(`:group:`)||from.includes(`:channel:`)||isWhatsAppGroupId))return null;let providerHint=ctx.Provider?.trim().toLowerCase(),parts=from.split(`:`).filter(Boolean),head=parts[0]?.trim().toLowerCase()??``,headIsSurface=head?getGroupSurfaces().has(head):!1,provider=headIsSurface?head:providerHint??(isWhatsAppGroupId?`whatsapp`:void 0);if(!provider)return null;let second=parts[1]?.trim().toLowerCase(),secondIsKind=second===`group`||second===`channel`,kind=secondIsKind?second:from.includes(`:channel:`)||normalizedChatType===`channel`?`channel`:`group`,finalId=(headIsSurface?secondIsKind?parts.slice(2).join(`:`):parts.slice(1).join(`:`):from).trim().toLowerCase();return finalId?{key:`${provider}:${kind}:${finalId}`,channel:provider,id:finalId,chatType:kind===`channel`?`channel`:`group`}:null}function resolveChannelGroupConfig(groups,groupId,caseInsensitive=!1){if(!groups)return;let direct=groups[groupId];if(direct)return direct;if(!caseInsensitive)return;let target=groupId.toLowerCase(),matchedKey=Object.keys(groups).find(key=>key!==`*`&&key.toLowerCase()===target);if(matchedKey)return groups[matchedKey]}function normalizeSenderKey(value){let trimmed=value.trim();return trimmed?(trimmed.startsWith(`@`)?trimmed.slice(1):trimmed).toLowerCase():``}function resolveToolsBySender(params){let toolsBySender=params.toolsBySender;if(!toolsBySender)return;let entries=Object.entries(toolsBySender);if(entries.length===0)return;let normalized=new Map,wildcard;for(let[rawKey,policy]of entries){if(!policy)continue;let key=normalizeSenderKey(rawKey);if(key){if(key===`*`){wildcard=policy;continue}normalized.has(key)||normalized.set(key,policy)}}let candidates=[],pushCandidate=value=>{let trimmed=value?.trim();trimmed&&candidates.push(trimmed)};pushCandidate(params.senderId),pushCandidate(params.senderE164),pushCandidate(params.senderUsername),pushCandidate(params.senderName);for(let candidate of candidates){let key=normalizeSenderKey(candidate);if(!key)continue;let match=normalized.get(key);if(match)return match}return wildcard}function resolveChannelGroups(cfg,channel,accountId){let normalizedAccountId=normalizeAccountId$1(accountId),channelConfig=cfg.channels?.[channel];if(channelConfig)return channelConfig.accounts?.[normalizedAccountId]?.groups??channelConfig.accounts?.[Object.keys(channelConfig.accounts??{}).find(key=>key.toLowerCase()===normalizedAccountId.toLowerCase())??``]?.groups??channelConfig.groups}function resolveChannelGroupPolicy(params){let{cfg,channel}=params,groups=resolveChannelGroups(cfg,channel,params.accountId),allowlistEnabled=!!(groups&&Object.keys(groups).length>0),normalizedId=params.groupId?.trim(),groupConfig=normalizedId?resolveChannelGroupConfig(groups,normalizedId,params.groupIdCaseInsensitive):void 0,defaultConfig=groups?.[`*`];return{allowlistEnabled,allowed:!allowlistEnabled||allowlistEnabled&&!!(groups&&Object.hasOwn(groups,`*`))||!!groupConfig,groupConfig,defaultConfig}}function resolveChannelGroupRequireMention(params){let{requireMentionOverride,overrideOrder=`after-config`}=params,{groupConfig,defaultConfig}=resolveChannelGroupPolicy(params),configMention=typeof groupConfig?.requireMention==`boolean`?groupConfig.requireMention:typeof defaultConfig?.requireMention==`boolean`?defaultConfig.requireMention:void 0;return overrideOrder===`before-config`&&typeof requireMentionOverride==`boolean`?requireMentionOverride:typeof configMention==`boolean`?configMention:overrideOrder!==`before-config`&&typeof requireMentionOverride==`boolean`?requireMentionOverride:!0}function resolveChannelGroupToolsPolicy(params){let{groupConfig,defaultConfig}=resolveChannelGroupPolicy(params),groupSenderPolicy=resolveToolsBySender({toolsBySender:groupConfig?.toolsBySender,senderId:params.senderId,senderName:params.senderName,senderUsername:params.senderUsername,senderE164:params.senderE164});if(groupSenderPolicy)return groupSenderPolicy;if(groupConfig?.tools)return groupConfig.tools;let defaultSenderPolicy=resolveToolsBySender({toolsBySender:defaultConfig?.toolsBySender,senderId:params.senderId,senderName:params.senderName,senderUsername:params.senderUsername,senderE164:params.senderE164});if(defaultSenderPolicy)return defaultSenderPolicy;if(defaultConfig?.tools)return defaultConfig.tools}function buildSlackThreadingToolContext(params){let configuredReplyToMode=resolveSlackReplyToMode(resolveSlackAccount({cfg:params.cfg,accountId:params.accountId}),params.context.ChatType),effectiveReplyToMode=params.context.ThreadLabel?`all`:configuredReplyToMode,threadId=params.context.MessageThreadId??params.context.ReplyToId;return{currentChannelId:params.context.To?.startsWith(`channel:`)?params.context.To.slice(8):void 0,currentThreadTs:threadId==null?void 0:String(threadId),replyToMode:effectiveReplyToMode,hasRepliedRef:params.hasRepliedRef}}function normalizeDiscordSlug(value){return normalizeAtHashSlug(value)}function parseTelegramGroupId(value){let raw=value?.trim()??``;if(!raw)return{chatId:void 0,topicId:void 0};let parts=raw.split(`:`).filter(Boolean);return parts.length>=3&&parts[1]===`topic`&&/^-?\d+$/.test(parts[0])&&/^\d+$/.test(parts[2])?{chatId:parts[0],topicId:parts[2]}:parts.length>=2&&/^-?\d+$/.test(parts[0])&&/^\d+$/.test(parts[1])?{chatId:parts[0],topicId:parts[1]}:{chatId:raw,topicId:void 0}}function resolveTelegramRequireMention(params){let{cfg,chatId,topicId}=params;if(!chatId)return;let groupConfig=cfg.channels?.telegram?.groups?.[chatId],groupDefault=cfg.channels?.telegram?.groups?.[`*`],topicConfig=topicId&&groupConfig?.topics?groupConfig.topics[topicId]:void 0,defaultTopicConfig=topicId&&groupDefault?.topics?groupDefault.topics[topicId]:void 0;if(typeof topicConfig?.requireMention==`boolean`)return topicConfig.requireMention;if(typeof defaultTopicConfig?.requireMention==`boolean`)return defaultTopicConfig.requireMention;if(typeof groupConfig?.requireMention==`boolean`)return groupConfig.requireMention;if(typeof groupDefault?.requireMention==`boolean`)return groupDefault.requireMention}function resolveDiscordGuildEntry(guilds,groupSpace){if(!guilds||Object.keys(guilds).length===0)return null;let space=groupSpace?.trim()??``;if(space&&guilds[space])return guilds[space];let normalized=normalizeDiscordSlug(space);if(normalized&&guilds[normalized])return guilds[normalized];if(normalized){let match=Object.values(guilds).find(entry=>normalizeDiscordSlug(entry?.slug??void 0)===normalized);if(match)return match}return guilds[`*`]??null}function resolveDiscordChannelEntry(channelEntries,params){if(!channelEntries||Object.keys(channelEntries).length===0)return;let groupChannel=params.groupChannel,channelSlug=normalizeDiscordSlug(groupChannel);return(params.groupId?channelEntries[params.groupId]:void 0)??(channelSlug?channelEntries[channelSlug]??channelEntries[`#${channelSlug}`]:void 0)??(groupChannel?channelEntries[normalizeDiscordSlug(groupChannel)]:void 0)}function resolveSlackChannelPolicyEntry(params){let channels=resolveSlackAccount({cfg:params.cfg,accountId:params.accountId}).channels??{};if(Object.keys(channels).length===0)return;let channelId=params.groupId?.trim(),channelName=params.groupChannel?.replace(/^#/,``),normalizedName=normalizeHyphenSlug(channelName),candidates=[channelId??``,channelName?`#${channelName}`:``,channelName??``,normalizedName].filter(Boolean);for(let candidate of candidates)if(candidate&&channels[candidate])return channels[candidate];return channels[`*`]}function resolveTelegramGroupRequireMention(params){let{chatId,topicId}=parseTelegramGroupId(params.groupId),requireMention=resolveTelegramRequireMention({cfg:params.cfg,chatId,topicId});return typeof requireMention==`boolean`?requireMention:resolveChannelGroupRequireMention({cfg:params.cfg,channel:`telegram`,groupId:chatId??params.groupId,accountId:params.accountId})}function resolveWhatsAppGroupRequireMention(params){return resolveChannelGroupRequireMention({cfg:params.cfg,channel:`whatsapp`,groupId:params.groupId,accountId:params.accountId})}function resolveIMessageGroupRequireMention(params){return resolveChannelGroupRequireMention({cfg:params.cfg,channel:`imessage`,groupId:params.groupId,accountId:params.accountId})}function resolveDiscordGroupRequireMention(params){let guildEntry=resolveDiscordGuildEntry(params.cfg.channels?.discord?.guilds,params.groupSpace),channelEntries=guildEntry?.channels;if(channelEntries&&Object.keys(channelEntries).length>0){let entry=resolveDiscordChannelEntry(channelEntries,params);if(entry&&typeof entry.requireMention==`boolean`)return entry.requireMention}return typeof guildEntry?.requireMention==`boolean`?guildEntry.requireMention:!0}function resolveGoogleChatGroupRequireMention(params){return resolveChannelGroupRequireMention({cfg:params.cfg,channel:`googlechat`,groupId:params.groupId,accountId:params.accountId})}function resolveGoogleChatGroupToolPolicy(params){return resolveChannelGroupToolsPolicy({cfg:params.cfg,channel:`googlechat`,groupId:params.groupId,accountId:params.accountId,senderId:params.senderId,senderName:params.senderName,senderUsername:params.senderUsername,senderE164:params.senderE164})}function resolveSlackGroupRequireMention(params){let resolved=resolveSlackChannelPolicyEntry(params);return typeof resolved?.requireMention==`boolean`?resolved.requireMention:!0}function resolveTelegramGroupToolPolicy(params){let{chatId}=parseTelegramGroupId(params.groupId);return resolveChannelGroupToolsPolicy({cfg:params.cfg,channel:`telegram`,groupId:chatId??params.groupId,accountId:params.accountId,senderId:params.senderId,senderName:params.senderName,senderUsername:params.senderUsername,senderE164:params.senderE164})}function resolveWhatsAppGroupToolPolicy(params){return resolveChannelGroupToolsPolicy({cfg:params.cfg,channel:`whatsapp`,groupId:params.groupId,accountId:params.accountId,senderId:params.senderId,senderName:params.senderName,senderUsername:params.senderUsername,senderE164:params.senderE164})}function resolveIMessageGroupToolPolicy(params){return resolveChannelGroupToolsPolicy({cfg:params.cfg,channel:`imessage`,groupId:params.groupId,accountId:params.accountId,senderId:params.senderId,senderName:params.senderName,senderUsername:params.senderUsername,senderE164:params.senderE164})}function resolveDiscordGroupToolPolicy(params){let guildEntry=resolveDiscordGuildEntry(params.cfg.channels?.discord?.guilds,params.groupSpace),channelEntries=guildEntry?.channels;if(channelEntries&&Object.keys(channelEntries).length>0){let entry=resolveDiscordChannelEntry(channelEntries,params),senderPolicy=resolveToolsBySender({toolsBySender:entry?.toolsBySender,senderId:params.senderId,senderName:params.senderName,senderUsername:params.senderUsername,senderE164:params.senderE164});if(senderPolicy)return senderPolicy;if(entry?.tools)return entry.tools}let guildSenderPolicy=resolveToolsBySender({toolsBySender:guildEntry?.toolsBySender,senderId:params.senderId,senderName:params.senderName,senderUsername:params.senderUsername,senderE164:params.senderE164});if(guildSenderPolicy)return guildSenderPolicy;if(guildEntry?.tools)return guildEntry.tools}function resolveSlackGroupToolPolicy(params){let resolved=resolveSlackChannelPolicyEntry(params);if(!resolved)return;let senderPolicy=resolveToolsBySender({toolsBySender:resolved?.toolsBySender,senderId:params.senderId,senderName:params.senderName,senderUsername:params.senderUsername,senderE164:params.senderE164});if(senderPolicy)return senderPolicy;if(resolved?.tools)return resolved.tools}function normalizeSignalMessagingTarget(raw){let trimmed=raw.trim();if(!trimmed)return;let normalized=trimmed;if(normalized.toLowerCase().startsWith(`signal:`)&&(normalized=normalized.slice(7).trim()),!normalized)return;let lower=normalized.toLowerCase();if(lower.startsWith(`group:`)){let id=normalized.slice(6).trim();return id?`group:${id}`:void 0}if(lower.startsWith(`username:`)){let id=normalized.slice(9).trim();return id?`username:${id}`.toLowerCase():void 0}if(lower.startsWith(`u:`)){let id=normalized.slice(2).trim();return id?`username:${id}`.toLowerCase():void 0}if(lower.startsWith(`uuid:`)){let id=normalized.slice(5).trim();return id?id.toLowerCase():void 0}return normalized.toLowerCase()}const formatLower=allowFrom=>allowFrom.map(entry=>String(entry).trim()).filter(Boolean).map(entry=>entry.toLowerCase()),formatDiscordAllowFrom=allowFrom=>allowFrom.map(entry=>String(entry).trim().replace(/^<@!?/,``).replace(/>$/,``).replace(/^discord:/i,``).replace(/^user:/i,``).replace(/^pk:/i,``).trim().toLowerCase()).filter(Boolean);function resolveDirectOrGroupChannelId(context){return(context.ChatType?.toLowerCase()===`direct`?context.From??context.To:context.To)?.trim()||void 0}function buildSignalThreadToolContext(params){let currentChannelIdRaw=resolveDirectOrGroupChannelId(params.context);return{currentChannelId:currentChannelIdRaw?normalizeSignalMessagingTarget(currentChannelIdRaw)??currentChannelIdRaw.trim():void 0,currentThreadTs:params.context.ReplyToId,hasRepliedRef:params.hasRepliedRef}}function buildIMessageThreadToolContext(params){return{currentChannelId:resolveDirectOrGroupChannelId(params.context),currentThreadTs:params.context.ReplyToId,hasRepliedRef:params.hasRepliedRef}}function resolveCaseInsensitiveAccount(accounts,accountId){if(!accounts)return;let normalized=normalizeAccountId$1(accountId);return accounts[normalized]??accounts[Object.keys(accounts).find(key=>key.toLowerCase()===normalized.toLowerCase())??``]}const DOCKS={telegram:{id:`telegram`,capabilities:{chatTypes:[`direct`,`group`,`channel`,`thread`],nativeCommands:!0,blockStreaming:!0},outbound:{textChunkLimit:4e3},config:{resolveAllowFrom:({cfg,accountId})=>(resolveTelegramAccount({cfg,accountId}).config.allowFrom??[]).map(entry=>String(entry)),formatAllowFrom:({allowFrom})=>allowFrom.map(entry=>String(entry).trim()).filter(Boolean).map(entry=>entry.replace(/^(telegram|tg):/i,``)).map(entry=>entry.toLowerCase())},groups:{resolveRequireMention:resolveTelegramGroupRequireMention,resolveToolPolicy:resolveTelegramGroupToolPolicy},threading:{resolveReplyToMode:({cfg})=>cfg.channels?.telegram?.replyToMode??`off`,buildToolContext:({context,hasRepliedRef})=>{let threadId=context.MessageThreadId??context.ReplyToId;return{currentChannelId:context.To?.trim()||void 0,currentThreadTs:threadId==null?void 0:String(threadId),hasRepliedRef}}}},whatsapp:{id:`whatsapp`,capabilities:{chatTypes:[`direct`,`group`],polls:!0,reactions:!0,media:!0},commands:{enforceOwnerForCommands:!0,skipWhenConfigEmpty:!0},outbound:{textChunkLimit:4e3},config:{resolveAllowFrom:({cfg,accountId})=>resolveWhatsAppAccount({cfg,accountId}).allowFrom??[],formatAllowFrom:({allowFrom})=>allowFrom.map(entry=>String(entry).trim()).filter(entry=>!!entry).map(entry=>entry===`*`?entry:normalizeWhatsAppTarget(entry)).filter(entry=>!!entry)},groups:{resolveRequireMention:resolveWhatsAppGroupRequireMention,resolveToolPolicy:resolveWhatsAppGroupToolPolicy,resolveGroupIntroHint:()=>`WhatsApp IDs: SenderId is the participant JID (group participant id).`},mentions:{stripPatterns:({ctx})=>{let selfE164=(ctx.To??``).replace(/^whatsapp:/,``);if(!selfE164)return[];let escaped=escapeRegExp(selfE164);return[escaped,`@${escaped}`]}},threading:{buildToolContext:({context,hasRepliedRef})=>({currentChannelId:context.From?.trim()||context.To?.trim()||void 0,currentThreadTs:context.ReplyToId,hasRepliedRef})}},discord:{id:`discord`,capabilities:{chatTypes:[`direct`,`channel`,`thread`],polls:!0,reactions:!0,media:!0,nativeCommands:!0,threads:!0},outbound:{textChunkLimit:2e3},streaming:{blockStreamingCoalesceDefaults:{minChars:1500,idleMs:1e3}},elevated:{allowFromFallback:({cfg})=>cfg.channels?.discord?.allowFrom??cfg.channels?.discord?.dm?.allowFrom},config:{resolveAllowFrom:({cfg,accountId})=>{let account=resolveDiscordAccount({cfg,accountId});return(account.config.allowFrom??account.config.dm?.allowFrom??[]).map(entry=>String(entry))},formatAllowFrom:({allowFrom})=>formatDiscordAllowFrom(allowFrom)},groups:{resolveRequireMention:resolveDiscordGroupRequireMention,resolveToolPolicy:resolveDiscordGroupToolPolicy},mentions:{stripPatterns:()=>[`<@!?\\d+>`]},threading:{resolveReplyToMode:({cfg})=>cfg.channels?.discord?.replyToMode??`off`,buildToolContext:({context,hasRepliedRef})=>({currentChannelId:context.To?.trim()||void 0,currentThreadTs:context.ReplyToId,hasRepliedRef})}},irc:{id:`irc`,capabilities:{chatTypes:[`direct`,`group`],media:!0,blockStreaming:!0},outbound:{textChunkLimit:350},streaming:{blockStreamingCoalesceDefaults:{minChars:300,idleMs:1e3}},config:{resolveAllowFrom:({cfg,accountId})=>{let channel=cfg.channels?.irc;return(resolveCaseInsensitiveAccount(channel?.accounts,accountId)?.allowFrom??channel?.allowFrom??[]).map(entry=>String(entry))},formatAllowFrom:({allowFrom})=>allowFrom.map(entry=>String(entry).trim()).filter(Boolean).map(entry=>entry.replace(/^irc:/i,``).replace(/^user:/i,``).toLowerCase())},groups:{resolveRequireMention:({cfg,accountId,groupId})=>groupId?resolveChannelGroupRequireMention({cfg,channel:`irc`,groupId,accountId,groupIdCaseInsensitive:!0}):!0,resolveToolPolicy:({cfg,accountId,groupId,senderId,senderName,senderUsername})=>{if(groupId)return resolveChannelGroupToolsPolicy({cfg,channel:`irc`,groupId,accountId,groupIdCaseInsensitive:!0,senderId,senderName,senderUsername})}}},googlechat:{id:`googlechat`,capabilities:{chatTypes:[`direct`,`group`,`thread`],reactions:!0,media:!0,threads:!0,blockStreaming:!0},outbound:{textChunkLimit:4e3},config:{resolveAllowFrom:({cfg,accountId})=>{let channel=cfg.channels?.googlechat;return(resolveCaseInsensitiveAccount(channel?.accounts,accountId)?.dm?.allowFrom??channel?.dm?.allowFrom??[]).map(entry=>String(entry))},formatAllowFrom:({allowFrom})=>allowFrom.map(entry=>String(entry).trim()).filter(Boolean).map(entry=>entry.replace(/^(googlechat|google-chat|gchat):/i,``).replace(/^user:/i,``).replace(/^users\//i,``).toLowerCase())},groups:{resolveRequireMention:resolveGoogleChatGroupRequireMention,resolveToolPolicy:resolveGoogleChatGroupToolPolicy},threading:{resolveReplyToMode:({cfg})=>cfg.channels?.googlechat?.replyToMode??`off`,buildToolContext:({context,hasRepliedRef})=>{let threadId=context.MessageThreadId??context.ReplyToId;return{currentChannelId:context.To?.trim()||void 0,currentThreadTs:threadId==null?void 0:String(threadId),hasRepliedRef}}}},slack:{id:`slack`,capabilities:{chatTypes:[`direct`,`channel`,`thread`],reactions:!0,media:!0,nativeCommands:!0,threads:!0},outbound:{textChunkLimit:4e3},streaming:{blockStreamingCoalesceDefaults:{minChars:1500,idleMs:1e3}},config:{resolveAllowFrom:({cfg,accountId})=>{let account=resolveSlackAccount({cfg,accountId});return(account.config.allowFrom??account.dm?.allowFrom??[]).map(entry=>String(entry))},formatAllowFrom:({allowFrom})=>formatLower(allowFrom)},groups:{resolveRequireMention:resolveSlackGroupRequireMention,resolveToolPolicy:resolveSlackGroupToolPolicy},mentions:{stripPatterns:()=>[`<@[^>]+>`]},threading:{resolveReplyToMode:({cfg,accountId,chatType})=>resolveSlackReplyToMode(resolveSlackAccount({cfg,accountId}),chatType),allowExplicitReplyTagsWhenOff:!0,buildToolContext:params=>buildSlackThreadingToolContext(params)}},signal:{id:`signal`,capabilities:{chatTypes:[`direct`,`group`],reactions:!0,media:!0},outbound:{textChunkLimit:4e3},streaming:{blockStreamingCoalesceDefaults:{minChars:1500,idleMs:1e3}},config:{resolveAllowFrom:({cfg,accountId})=>(resolveSignalAccount({cfg,accountId}).config.allowFrom??[]).map(entry=>String(entry)),formatAllowFrom:({allowFrom})=>allowFrom.map(entry=>String(entry).trim()).filter(Boolean).map(entry=>entry===`*`?`*`:normalizeE164(entry.replace(/^signal:/i,``))).filter(Boolean)},threading:{buildToolContext:({context,hasRepliedRef})=>buildSignalThreadToolContext({context,hasRepliedRef})}},imessage:{id:`imessage`,capabilities:{chatTypes:[`direct`,`group`],reactions:!0,media:!0},outbound:{textChunkLimit:4e3},config:{resolveAllowFrom:({cfg,accountId})=>(resolveIMessageAccount({cfg,accountId}).config.allowFrom??[]).map(entry=>String(entry)),formatAllowFrom:({allowFrom})=>allowFrom.map(entry=>String(entry).trim()).filter(Boolean)},groups:{resolveRequireMention:resolveIMessageGroupRequireMention,resolveToolPolicy:resolveIMessageGroupToolPolicy},threading:{buildToolContext:({context,hasRepliedRef})=>buildIMessageThreadToolContext({context,hasRepliedRef})}}};function buildDockFromPlugin(plugin){return{id:plugin.id,capabilities:plugin.capabilities,commands:plugin.commands,outbound:plugin.outbound?.textChunkLimit?{textChunkLimit:plugin.outbound.textChunkLimit}:void 0,streaming:plugin.streaming?{blockStreamingCoalesceDefaults:plugin.streaming.blockStreamingCoalesceDefaults}:void 0,elevated:plugin.elevated,config:plugin.config?{resolveAllowFrom:plugin.config.resolveAllowFrom,formatAllowFrom:plugin.config.formatAllowFrom}:void 0,groups:plugin.groups,mentions:plugin.mentions,threading:plugin.threading,agentPrompt:plugin.agentPrompt}}function listPluginDockEntries(){let registry=requireActivePluginRegistry(),entries=[],seen=new Set;for(let entry of registry.channels){let plugin=entry.plugin,id=String(plugin.id).trim();if(!id||seen.has(id)||(seen.add(id),CHAT_CHANNEL_ORDER.includes(plugin.id)))continue;let dock=entry.dock??buildDockFromPlugin(plugin);entries.push({id:plugin.id,dock,order:plugin.meta.order})}return entries}function listChannelDocks(){let baseEntries=CHAT_CHANNEL_ORDER.map(id=>({id,dock:DOCKS[id],order:getChatChannelMeta(id).order})),pluginEntries=listPluginDockEntries(),combined=[...baseEntries,...pluginEntries];return combined.sort((a,b)=>{let indexA=CHAT_CHANNEL_ORDER.indexOf(a.id),indexB=CHAT_CHANNEL_ORDER.indexOf(b.id),orderA=a.order??(indexA===-1?999:indexA),orderB=b.order??(indexB===-1?999:indexB);return orderA===orderB?String(a.id).localeCompare(String(b.id)):orderA-orderB}),combined.map(entry=>entry.dock)}function getChannelDock(id){let core=DOCKS[id];if(core)return core;let pluginEntry=requireActivePluginRegistry().channels.find(entry=>entry.plugin.id===id);if(pluginEntry)return pluginEntry.dock??buildDockFromPlugin(pluginEntry.plugin)}const mergeOrigin=(existing,next)=>{if(!existing&&!next)return;let merged=existing?{...existing}:{};return next?.label&&(merged.label=next.label),next?.provider&&(merged.provider=next.provider),next?.surface&&(merged.surface=next.surface),next?.chatType&&(merged.chatType=next.chatType),next?.from&&(merged.from=next.from),next?.to&&(merged.to=next.to),next?.accountId&&(merged.accountId=next.accountId),next?.threadId!=null&&next.threadId!==``&&(merged.threadId=next.threadId),Object.keys(merged).length>0?merged:void 0};function deriveSessionOrigin(ctx){let label=resolveConversationLabel(ctx)?.trim(),provider=normalizeMessageChannel(typeof ctx.OriginatingChannel==`string`&&ctx.OriginatingChannel||ctx.Surface||ctx.Provider),surface=ctx.Surface?.trim().toLowerCase(),chatType=normalizeChatType(ctx.ChatType)??void 0,from=ctx.From?.trim(),to=(typeof ctx.OriginatingTo==`string`?ctx.OriginatingTo:ctx.To)?.trim()??void 0,accountId=ctx.AccountId?.trim(),threadId=ctx.MessageThreadId??void 0,origin={};return label&&(origin.label=label),provider&&(origin.provider=provider),surface&&(origin.surface=surface),chatType&&(origin.chatType=chatType),from&&(origin.from=from),to&&(origin.to=to),accountId&&(origin.accountId=accountId),threadId!=null&&threadId!==``&&(origin.threadId=threadId),Object.keys(origin).length>0?origin:void 0}function snapshotSessionOrigin(entry){if(entry?.origin)return{...entry.origin}}function deriveGroupSessionPatch(params){let resolution=params.groupResolution??resolveGroupSessionKey(params.ctx);if(!resolution?.channel)return null;let channel=resolution.channel,subject=params.ctx.GroupSubject?.trim(),space=params.ctx.GroupSpace?.trim(),explicitChannel=params.ctx.GroupChannel?.trim(),normalizedChannel=normalizeChannelId(channel),isChannelProvider=!!(normalizedChannel&&getChannelDock(normalizedChannel)?.capabilities.chatTypes.includes(`channel`)),nextGroupChannel=explicitChannel??((resolution.chatType===`channel`||isChannelProvider)&&subject&&subject.startsWith(`#`)?subject:void 0),nextSubject=nextGroupChannel?void 0:subject,patch={chatType:resolution.chatType??`group`,channel,groupId:resolution.id};nextSubject&&(patch.subject=nextSubject),nextGroupChannel&&(patch.groupChannel=nextGroupChannel),space&&(patch.space=space);let displayName=buildGroupDisplayName({provider:channel,subject:nextSubject??params.existing?.subject,groupChannel:nextGroupChannel??params.existing?.groupChannel,space:space??params.existing?.space,id:resolution.id,key:params.sessionKey});return displayName&&(patch.displayName=displayName),patch}function deriveSessionMetaPatch(params){let groupPatch=deriveGroupSessionPatch(params),origin=deriveSessionOrigin(params.ctx);if(!groupPatch&&!origin)return null;let patch=groupPatch?{...groupPatch}:{},mergedOrigin=mergeOrigin(params.existing?.origin,origin);return mergedOrigin&&(patch.origin=mergedOrigin),Object.keys(patch).length>0?patch:null}function resolveMainSessionKey(cfg){if(cfg?.session?.scope===`global`)return`global`;let agents=cfg?.agents?.list??[];return buildAgentMainSessionKey({agentId:normalizeAgentId(agents.find(agent=>agent?.default)?.id??agents[0]?.id??DEFAULT_AGENT_ID),mainKey:normalizeMainKey(cfg?.session?.mainKey)})}function resolveMainSessionKeyFromConfig(){return resolveMainSessionKey(loadConfig())}function resolveAgentMainSessionKey(params){let mainKey=normalizeMainKey(params.cfg?.session?.mainKey);return buildAgentMainSessionKey({agentId:params.agentId,mainKey})}function resolveExplicitAgentSessionKey(params){let agentId=params.agentId?.trim();if(agentId)return resolveAgentMainSessionKey({cfg:params.cfg,agentId})}function canonicalizeMainSessionAlias(params){let raw=params.sessionKey.trim();if(!raw)return raw;let agentId=normalizeAgentId(params.agentId),mainKey=normalizeMainKey(params.cfg?.session?.mainKey),agentMainSessionKey=buildAgentMainSessionKey({agentId,mainKey}),agentMainAliasKey=buildAgentMainSessionKey({agentId,mainKey:`main`}),isMainAlias=raw===`main`||raw===mainKey||raw===agentMainSessionKey||raw===agentMainAliasKey;return params.cfg?.session?.scope===`global`&&isMainAlias?`global`:isMainAlias?agentMainSessionKey:raw}function mergeSessionEntry(existing,patch){let sessionId=patch.sessionId??existing?.sessionId??crypto.randomUUID(),updatedAt=Math.max(existing?.updatedAt??0,patch.updatedAt??0,Date.now());return existing?{...existing,...patch,sessionId,updatedAt}:{...patch,sessionId,updatedAt}}function resolveFreshSessionTotalTokens(entry){let total=entry?.totalTokens;if(!(typeof total!=`number`||!Number.isFinite(total)||total<0)&&entry?.totalTokensFresh!==!1)return total}const DEFAULT_RESET_TRIGGERS=[`/new`,`/reset`],THREAD_SESSION_MARKERS=[`:thread:`,`:topic:`],GROUP_SESSION_MARKERS=[`:group:`,`:channel:`];function isThreadSessionKey(sessionKey){let normalized=(sessionKey??``).toLowerCase();return normalized?THREAD_SESSION_MARKERS.some(marker=>normalized.includes(marker)):!1}function resolveSessionResetType(params){if(params.isThread||isThreadSessionKey(params.sessionKey))return`thread`;if(params.isGroup)return`group`;let normalized=(params.sessionKey??``).toLowerCase();return GROUP_SESSION_MARKERS.some(marker=>normalized.includes(marker))?`group`:`direct`}function resolveThreadFlag(params){return params.messageThreadId!=null||params.threadLabel?.trim()||params.threadStarterBody?.trim()||params.parentSessionKey?.trim()?!0:isThreadSessionKey(params.sessionKey)}function resolveDailyResetAtMs(now,atHour){let normalizedAtHour=normalizeResetAtHour(atHour),resetAt=new Date(now);return resetAt.setHours(normalizedAtHour,0,0,0),now<resetAt.getTime()&&resetAt.setDate(resetAt.getDate()-1),resetAt.getTime()}function resolveSessionResetPolicy(params){let sessionCfg=params.sessionCfg,baseReset=params.resetOverride??sessionCfg?.reset,typeReset=params.resetOverride?void 0:sessionCfg?.resetByType?.[params.resetType]??(params.resetType===`direct`?sessionCfg?.resetByType?.dm:void 0),hasExplicitReset=!!(baseReset||sessionCfg?.resetByType),legacyIdleMinutes=params.resetOverride?void 0:sessionCfg?.idleMinutes,mode=typeReset?.mode??baseReset?.mode??(!hasExplicitReset&&legacyIdleMinutes!=null?`idle`:`daily`),atHour=normalizeResetAtHour(typeReset?.atHour??baseReset?.atHour??4),idleMinutesRaw=typeReset?.idleMinutes??baseReset?.idleMinutes??legacyIdleMinutes,idleMinutes;if(idleMinutesRaw!=null){let normalized=Math.floor(idleMinutesRaw);Number.isFinite(normalized)&&(idleMinutes=Math.max(normalized,1))}else mode===`idle`&&(idleMinutes=60);return{mode,atHour,idleMinutes}}function resolveChannelResetConfig(params){let resetByChannel=params.sessionCfg?.resetByChannel;if(!resetByChannel)return;let normalized=normalizeMessageChannel(params.channel),fallback=params.channel?.trim().toLowerCase(),key=normalized??fallback;if(key)return resetByChannel[key]??resetByChannel[key.toLowerCase()]}function evaluateSessionFreshness(params){let dailyResetAt=params.policy.mode===`daily`?resolveDailyResetAtMs(params.now,params.policy.atHour):void 0,idleExpiresAt=params.policy.idleMinutes==null?void 0:params.updatedAt+params.policy.idleMinutes*6e4,staleDaily=dailyResetAt!=null&¶ms.updatedAt<dailyResetAt,staleIdle=idleExpiresAt!=null&¶ms.now>idleExpiresAt;return{fresh:!(staleDaily||staleIdle),dailyResetAt,idleExpiresAt}}function normalizeResetAtHour(value){if(typeof value!=`number`||!Number.isFinite(value))return 4;let normalized=Math.floor(value);return Number.isFinite(normalized)?normalized<0?0:normalized>23?23:normalized:4}function deriveSessionKey(scope,ctx){if(scope===`global`)return`global`;let resolvedGroup=resolveGroupSessionKey(ctx);return resolvedGroup?resolvedGroup.key:(ctx.From?normalizeE164(ctx.From):``)||`unknown`}function resolveSessionKey(scope,ctx,mainKey){let explicit=ctx.SessionKey?.trim();if(explicit)return explicit.toLowerCase();let raw=deriveSessionKey(scope,ctx);if(scope===`global`)return raw;let canonical=buildAgentMainSessionKey({agentId:DEFAULT_AGENT_ID,mainKey:normalizeMainKey(mainKey)});return raw.includes(`:group:`)||raw.includes(`:channel:`)?`agent:${DEFAULT_AGENT_ID}:${raw}`:canonical}const ENVELOPE_PREFIX=/^\[([^\]]+)\]\s*/,ENVELOPE_CHANNELS=[`WebChat`,`WhatsApp`,`Telegram`,`Signal`,`Slack`,`Discord`,`Google Chat`,`iMessage`,`Teams`,`Matrix`,`Zalo`,`Zalo Personal`,`BlueBubbles`],MESSAGE_ID_LINE=/^\s*\[message_id:\s*[^\]]+\]\s*$/i;function looksLikeEnvelopeHeader(header){return/\d{4}-\d{2}-\d{2}T\d{2}:\d{2}Z\b/.test(header)||/\d{4}-\d{2}-\d{2} \d{2}:\d{2}\b/.test(header)?!0:ENVELOPE_CHANNELS.some(label=>header.startsWith(`${label} `))}function stripEnvelope(text){let match=text.match(ENVELOPE_PREFIX);return!match||!looksLikeEnvelopeHeader(match[1]??``)?text:text.slice(match[0].length)}function stripMessageIdHints(text){if(!text.includes(`[message_id:`))return text;let lines=text.split(/\r?\n/),filtered=lines.filter(line=>!MESSAGE_ID_LINE.test(line));return filtered.length===lines.length?text:filtered.join(`
|
|
2
2
|
`)}function stripEnvelopeFromContent(content){let changed=!1;return{content:content.map(item=>{if(!item||typeof item!=`object`)return item;let entry=item;if(entry.type!==`text`||typeof entry.text!=`string`)return item;let stripped=stripMessageIdHints(stripEnvelope(entry.text));return stripped===entry.text?item:(changed=!0,{...entry,text:stripped})}),changed}}function stripEnvelopeFromMessage(message){if(!message||typeof message!=`object`)return message;let entry=message;if((typeof entry.role==`string`?entry.role.toLowerCase():``)!==`user`)return message;let changed=!1,next={...entry};if(typeof entry.content==`string`){let stripped=stripMessageIdHints(stripEnvelope(entry.content));stripped!==entry.content&&(next.content=stripped,changed=!0)}else if(Array.isArray(entry.content)){let updated=stripEnvelopeFromContent(entry.content);updated.changed&&(next.content=updated.content,changed=!0)}else if(typeof entry.text==`string`){let stripped=stripMessageIdHints(stripEnvelope(entry.text));stripped!==entry.text&&(next.text=stripped,changed=!0)}return changed?next:message}function stripEnvelopeFromMessages(messages){if(messages.length===0)return messages;let changed=!1,next=messages.map(message=>{let stripped=stripEnvelopeFromMessage(message);return stripped!==message&&(changed=!0),stripped});return changed?next:messages}const sessionTitleFieldsCache=new Map;function readSessionTitleFieldsCacheKey(filePath,opts){return`${filePath}\t${opts?.includeInterSession===!0?`1`:`0`}`}function getCachedSessionTitleFields(cacheKey,stat){let cached=sessionTitleFieldsCache.get(cacheKey);return cached?cached.mtimeMs!==stat.mtimeMs||cached.size!==stat.size?(sessionTitleFieldsCache.delete(cacheKey),null):(sessionTitleFieldsCache.delete(cacheKey),sessionTitleFieldsCache.set(cacheKey,cached),{firstUserMessage:cached.firstUserMessage,lastMessagePreview:cached.lastMessagePreview}):null}function setCachedSessionTitleFields(cacheKey,stat,value){for(sessionTitleFieldsCache.set(cacheKey,{...value,mtimeMs:stat.mtimeMs,size:stat.size});sessionTitleFieldsCache.size>5e3;){let oldestKey=sessionTitleFieldsCache.keys().next().value;if(typeof oldestKey!=`string`||!oldestKey)break;sessionTitleFieldsCache.delete(oldestKey)}}function readSessionMessages(sessionId,storePath,sessionFile){let filePath=resolveSessionTranscriptCandidates(sessionId,storePath,sessionFile).find(p=>fs.existsSync(p));if(!filePath)return[];let lines=fs.readFileSync(filePath,`utf-8`).split(/\r?\n/),messages=[];for(let line of lines)if(line.trim())try{let parsed=JSON.parse(line);if(parsed?.message){messages.push(parsed.message);continue}if(parsed?.type===`compaction`){let ts=typeof parsed.timestamp==`string`?Date.parse(parsed.timestamp):NaN,timestamp=Number.isFinite(ts)?ts:Date.now();messages.push({role:`system`,content:[{type:`text`,text:`Compaction`}],timestamp,__builderforce:{kind:`compaction`,id:typeof parsed.id==`string`?parsed.id:void 0}})}}catch{}return messages}function resolveSessionTranscriptCandidates(sessionId,storePath,sessionFile,agentId){let candidates=[],pushCandidate=resolve=>{try{candidates.push(resolve())}catch{}};if(storePath){let sessionsDir=path.dirname(storePath);sessionFile&&pushCandidate(()=>resolveSessionFilePath(sessionId,{sessionFile},{sessionsDir,agentId})),pushCandidate(()=>resolveSessionTranscriptPathInDir(sessionId,sessionsDir))}else if(sessionFile)if(agentId)pushCandidate(()=>resolveSessionFilePath(sessionId,{sessionFile},{agentId}));else{let trimmed=sessionFile.trim();trimmed&&candidates.push(path.resolve(trimmed))}agentId&&pushCandidate(()=>resolveSessionTranscriptPath(sessionId,agentId));let home=resolveRequiredHomeDir(process.env,os.homedir),legacyDir=path.join(home,`.builderforce`,`sessions`);return pushCandidate(()=>resolveSessionTranscriptPathInDir(sessionId,legacyDir)),Array.from(new Set(candidates))}function archiveFileOnDisk(filePath,reason){let archived=`${filePath}.${reason}.${new Date().toISOString().replaceAll(`:`,`-`)}`;return fs.renameSync(filePath,archived),archived}function archiveSessionTranscripts(opts){let archived=[];for(let candidate of resolveSessionTranscriptCandidates(opts.sessionId,opts.storePath,opts.sessionFile,opts.agentId))if(fs.existsSync(candidate))try{archived.push(archiveFileOnDisk(candidate,opts.reason))}catch{}return archived}function restoreArchiveTimestamp(raw){let[datePart,timePart]=raw.split(`T`);return!datePart||!timePart?raw:`${datePart}T${timePart.replace(/-/g,`:`)}`}function parseArchivedTimestamp(fileName,reason){let marker=`.${reason}.`,index=fileName.lastIndexOf(marker);if(index<0)return null;let raw=fileName.slice(index+marker.length);if(!raw)return null;let timestamp=Date.parse(restoreArchiveTimestamp(raw));return Number.isNaN(timestamp)?null:timestamp}async function cleanupArchivedSessionTranscripts(opts){if(!Number.isFinite(opts.olderThanMs)||opts.olderThanMs<0)return{removed:0,scanned:0};let now=opts.nowMs??Date.now(),reason=opts.reason??`deleted`,directories=Array.from(new Set(opts.directories.map(dir=>path.resolve(dir)))),removed=0,scanned=0;for(let dir of directories){let entries=await fs.promises.readdir(dir).catch(()=>[]);for(let entry of entries){let timestamp=parseArchivedTimestamp(entry,reason);if(timestamp==null||(scanned+=1,now-timestamp<=opts.olderThanMs))continue;let fullPath=path.join(dir,entry);(await fs.promises.stat(fullPath).catch(()=>null))?.isFile()&&(await fs.promises.rm(fullPath).catch(()=>void 0),removed+=1)}}return{removed,scanned}}function jsonUtf8Bytes(value){try{return Buffer.byteLength(JSON.stringify(value),`utf8`)}catch{return Buffer.byteLength(String(value),`utf8`)}}function capArrayByJsonBytes(items,maxBytes){if(items.length===0)return{items,bytes:2};let parts=items.map(item=>jsonUtf8Bytes(item)),bytes=2+parts.reduce((a,b)=>a+b,0)+(items.length-1),start=0;for(;bytes>maxBytes&&start<items.length-1;)bytes-=parts[start]+1,start+=1;return{items:start>0?items.slice(start):items,bytes}}function readSessionTitleFieldsFromTranscript(sessionId,storePath,sessionFile,agentId,opts){let filePath=resolveSessionTranscriptCandidates(sessionId,storePath,sessionFile,agentId).find(p=>fs.existsSync(p));if(!filePath)return{firstUserMessage:null,lastMessagePreview:null};let stat;try{stat=fs.statSync(filePath)}catch{return{firstUserMessage:null,lastMessagePreview:null}}let cacheKey=readSessionTitleFieldsCacheKey(filePath,opts),cached=getCachedSessionTitleFields(cacheKey,stat);if(cached)return cached;if(stat.size===0){let empty={firstUserMessage:null,lastMessagePreview:null};return setCachedSessionTitleFields(cacheKey,stat,empty),empty}let fd=null;try{fd=fs.openSync(filePath,`r`);let size=stat.size,firstUserMessage=null;try{let chunk=readTranscriptHeadChunk(fd);chunk&&(firstUserMessage=extractFirstUserMessageFromTranscriptChunk(chunk,opts))}catch{}let lastMessagePreview=null;try{lastMessagePreview=readLastMessagePreviewFromOpenTranscript({fd,size})}catch{}let result={firstUserMessage,lastMessagePreview};return setCachedSessionTitleFields(cacheKey,stat,result),result}catch{return{firstUserMessage:null,lastMessagePreview:null}}finally{if(fd!==null)try{fs.closeSync(fd)}catch{}}}function extractTextFromContent(content){if(typeof content==`string`)return content.trim()||null;if(!Array.isArray(content))return null;for(let part of content)if(!(!part||typeof part.text!=`string`)&&(part.type===`text`||part.type===`output_text`||part.type===`input_text`)){let trimmed=part.text.trim();if(trimmed)return trimmed}return null}function readTranscriptHeadChunk(fd,maxBytes=8192){let buf=Buffer.alloc(maxBytes),bytesRead=fs.readSync(fd,buf,0,buf.length,0);return bytesRead<=0?null:buf.toString(`utf-8`,0,bytesRead)}function extractFirstUserMessageFromTranscriptChunk(chunk,opts){let lines=chunk.split(/\r?\n/).slice(0,10);for(let line of lines)if(line.trim())try{let msg=JSON.parse(line)?.message;if(msg?.role!==`user`||opts?.includeInterSession!==!0&&hasInterSessionUserProvenance(msg))continue;let text=extractTextFromContent(msg.content);if(text)return text}catch{}return null}const LAST_MSG_MAX_BYTES=16384;function readLastMessagePreviewFromOpenTranscript(params){let readStart=Math.max(0,params.size-LAST_MSG_MAX_BYTES),readLen=Math.min(params.size,LAST_MSG_MAX_BYTES),buf=Buffer.alloc(readLen);fs.readSync(params.fd,buf,0,readLen,readStart);let tailLines=buf.toString(`utf-8`).split(/\r?\n/).filter(l=>l.trim()).slice(-20);for(let i=tailLines.length-1;i>=0;i--){let line=tailLines[i];try{let msg=JSON.parse(line)?.message;if(msg?.role!==`user`&&msg?.role!==`assistant`)continue;let text=extractTextFromContent(msg.content);if(text)return text}catch{}}return null}const PREVIEW_READ_SIZES=[64*1024,256*1024,1024*1024];function normalizeRole(role,isTool){if(isTool)return`tool`;switch((role??``).toLowerCase()){case`user`:return`user`;case`assistant`:return`assistant`;case`system`:return`system`;case`tool`:return`tool`;default:return`other`}}function truncatePreviewText(text,maxChars){return maxChars<=0||text.length<=maxChars?text:maxChars<=3?text.slice(0,maxChars):`${text.slice(0,maxChars-3)}...`}function extractPreviewText(message){if(typeof message.content==`string`)return message.content.trim()||null;if(Array.isArray(message.content)){let parts=message.content.map(entry=>typeof entry?.text==`string`?entry.text:``).filter(text=>text.trim().length>0);if(parts.length>0)return parts.join(`
|
|
3
3
|
`).trim()}return typeof message.text==`string`&&message.text.trim()||null}function isToolCall(message){return hasToolCall(message)}function extractToolNames(message){return extractToolCallNames(message)}function extractMediaSummary(message){if(!Array.isArray(message.content))return null;for(let entry of message.content){let raw=typeof entry?.type==`string`?entry.type.trim().toLowerCase():``;if(!(!raw||raw===`text`||raw===`toolcall`||raw===`tool_call`))return`[${raw}]`}return null}function buildPreviewItems(messages,maxItems,maxChars){let items=[];for(let message of messages){let toolCall=isToolCall(message),role=normalizeRole(message.role,toolCall),text=extractPreviewText(message);if(!text){let toolNames=extractToolNames(message);if(toolNames.length>0){let shown=toolNames.slice(0,2),overflow=toolNames.length-shown.length;text=`call ${shown.join(`, `)}`,overflow>0&&(text+=` +${overflow}`)}}if(text||=extractMediaSummary(message),!text)continue;let trimmed=text.trim();trimmed&&(role===`user`&&(trimmed=stripEnvelope(trimmed)),trimmed=truncatePreviewText(trimmed,maxChars),items.push({role,text:trimmed}))}return items.length<=maxItems?items:items.slice(-maxItems)}function readRecentMessagesFromTranscript(filePath,maxMessages,readBytes){let fd=null;try{fd=fs.openSync(filePath,`r`);let size=fs.fstatSync(fd).size;if(size===0)return[];let readStart=Math.max(0,size-readBytes),readLen=Math.min(size,readBytes),buf=Buffer.alloc(readLen);fs.readSync(fd,buf,0,readLen,readStart);let tailLines=buf.toString(`utf-8`).split(/\r?\n/).filter(l=>l.trim()).slice(-200),collected=[];for(let i=tailLines.length-1;i>=0;i--){let line=tailLines[i];try{let msg=JSON.parse(line)?.message;if(msg&&typeof msg==`object`&&(collected.push(msg),collected.length>=maxMessages))break}catch{}}return collected.toReversed()}catch{return[]}finally{fd!==null&&fs.closeSync(fd)}}function readSessionPreviewItemsFromTranscript(sessionId,storePath,sessionFile,agentId,maxItems,maxChars){let filePath=resolveSessionTranscriptCandidates(sessionId,storePath,sessionFile,agentId).find(p=>fs.existsSync(p));if(!filePath)return[];let boundedItems=Math.max(1,Math.min(maxItems,50)),boundedChars=Math.max(20,Math.min(maxChars,2e3));for(let readSize of PREVIEW_READ_SIZES){let messages=readRecentMessagesFromTranscript(filePath,boundedItems,readSize);if(messages.length>0||readSize===PREVIEW_READ_SIZES[PREVIEW_READ_SIZES.length-1])return buildPreviewItems(messages,boundedItems,boundedChars)}return[]}function normalizeAccountId(value){if(typeof value==`string`)return value.trim()||void 0}function normalizeDeliveryContext(context){if(!context)return;let channel=typeof context.channel==`string`?normalizeMessageChannel(context.channel)??context.channel.trim():void 0,to=typeof context.to==`string`?context.to.trim():void 0,accountId=normalizeAccountId(context.accountId),threadId=typeof context.threadId==`number`&&Number.isFinite(context.threadId)?Math.trunc(context.threadId):typeof context.threadId==`string`?context.threadId.trim():void 0,normalizedThreadId=typeof threadId==`string`?threadId||void 0:threadId;if(!channel&&!to&&!accountId&&normalizedThreadId==null)return;let normalized={channel:channel||void 0,to:to||void 0,accountId};return normalizedThreadId!=null&&(normalized.threadId=normalizedThreadId),normalized}function normalizeSessionDeliveryFields(source){if(!source)return{deliveryContext:void 0,lastChannel:void 0,lastTo:void 0,lastAccountId:void 0,lastThreadId:void 0};let merged=mergeDeliveryContext(normalizeDeliveryContext({channel:source.lastChannel??source.channel,to:source.lastTo,accountId:source.lastAccountId,threadId:source.lastThreadId}),normalizeDeliveryContext(source.deliveryContext));return merged?{deliveryContext:merged,lastChannel:merged.channel,lastTo:merged.to,lastAccountId:merged.accountId,lastThreadId:merged.threadId}:{deliveryContext:void 0,lastChannel:void 0,lastTo:void 0,lastAccountId:void 0,lastThreadId:void 0}}function deliveryContextFromSession(entry){if(entry)return normalizeSessionDeliveryFields({channel:entry.channel,lastChannel:entry.lastChannel,lastTo:entry.lastTo,lastAccountId:entry.lastAccountId,lastThreadId:entry.lastThreadId??entry.deliveryContext?.threadId??entry.origin?.threadId,deliveryContext:entry.deliveryContext}).deliveryContext}function mergeDeliveryContext(primary,fallback){let normalizedPrimary=normalizeDeliveryContext(primary),normalizedFallback=normalizeDeliveryContext(fallback);if(!(!normalizedPrimary&&!normalizedFallback))return normalizeDeliveryContext({channel:normalizedPrimary?.channel??normalizedFallback?.channel,to:normalizedPrimary?.to??normalizedFallback?.to,accountId:normalizedPrimary?.accountId??normalizedFallback?.accountId,threadId:normalizedPrimary?.threadId??normalizedFallback?.threadId})}function deliveryContextKey(context){let normalized=normalizeDeliveryContext(context);if(!normalized?.channel||!normalized?.to)return;let threadId=normalized.threadId!=null&&normalized.threadId!==``?String(normalized.threadId):``;return`${normalized.channel}|${normalized.to}|${normalized.accountId??``}|${threadId}`}function resolveCacheTtlMs(params){let{envValue,defaultTtlMs}=params;if(envValue){let parsed=Number.parseInt(envValue,10);if(Number.isFinite(parsed)&&parsed>=0)return parsed}return defaultTtlMs}function isCacheEnabled(ttlMs){return ttlMs>0}function getFileMtimeMs(filePath){try{return fs.statSync(filePath).mtimeMs}catch{return}}const log=createSubsystemLogger(`sessions/store`),SESSION_STORE_CACHE=new Map;function isSessionStoreRecord(value){return!!value&&typeof value==`object`&&!Array.isArray(value)}function getSessionStoreTtl(){return resolveCacheTtlMs({envValue:process.env.BUILDERFORCE_AGENTS_SESSION_CACHE_TTL_MS,defaultTtlMs:45e3})}function isSessionStoreCacheEnabled(){return isCacheEnabled(getSessionStoreTtl())}function isSessionStoreCacheValid(entry){let now=Date.now(),ttl=getSessionStoreTtl();return now-entry.loadedAt<=ttl}function invalidateSessionStoreCache(storePath){SESSION_STORE_CACHE.delete(storePath)}function normalizeSessionEntryDelivery(entry){let normalized=normalizeSessionDeliveryFields({channel:entry.channel,lastChannel:entry.lastChannel,lastTo:entry.lastTo,lastAccountId:entry.lastAccountId,lastThreadId:entry.lastThreadId??entry.deliveryContext?.threadId??entry.origin?.threadId,deliveryContext:entry.deliveryContext}),nextDelivery=normalized.deliveryContext,sameDelivery=(entry.deliveryContext?.channel??void 0)===nextDelivery?.channel&&(entry.deliveryContext?.to??void 0)===nextDelivery?.to&&(entry.deliveryContext?.accountId??void 0)===nextDelivery?.accountId&&(entry.deliveryContext?.threadId??void 0)===nextDelivery?.threadId,sameLast=entry.lastChannel===normalized.lastChannel&&entry.lastTo===normalized.lastTo&&entry.lastAccountId===normalized.lastAccountId&&entry.lastThreadId===normalized.lastThreadId;return sameDelivery&&sameLast?entry:{...entry,deliveryContext:nextDelivery,lastChannel:normalized.lastChannel,lastTo:normalized.lastTo,lastAccountId:normalized.lastAccountId,lastThreadId:normalized.lastThreadId}}function removeThreadFromDeliveryContext(context){if(!context||context.threadId==null)return context;let next={...context};return delete next.threadId,next}function normalizeSessionStore(store){for(let[key,entry]of Object.entries(store)){if(!entry)continue;let normalized=normalizeSessionEntryDelivery(entry);normalized!==entry&&(store[key]=normalized)}}function loadSessionStore(storePath,opts={}){if(!opts.skipCache&&isSessionStoreCacheEnabled()){let cached=SESSION_STORE_CACHE.get(storePath);if(cached&&isSessionStoreCacheValid(cached)){if(getFileMtimeMs(storePath)===cached.mtimeMs)return structuredClone(cached.store);invalidateSessionStoreCache(storePath)}}let store={},mtimeMs=getFileMtimeMs(storePath),maxReadAttempts=process.platform===`win32`?3:1,retryBuf=maxReadAttempts>1?new Int32Array(new SharedArrayBuffer(4)):void 0;for(let attempt=0;attempt<maxReadAttempts;attempt++)try{let raw=fs.readFileSync(storePath,`utf-8`);if(raw.length===0&&attempt<maxReadAttempts-1){Atomics.wait(retryBuf,0,0,50);continue}let parsed=JSON.parse(raw);isSessionStoreRecord(parsed)&&(store=parsed),mtimeMs=getFileMtimeMs(storePath)??mtimeMs;break}catch{if(attempt<maxReadAttempts-1){Atomics.wait(retryBuf,0,0,50);continue}}for(let entry of Object.values(store)){if(!entry||typeof entry!=`object`)continue;let rec=entry;typeof rec.channel!=`string`&&typeof rec.provider==`string`&&(rec.channel=rec.provider,delete rec.provider),typeof rec.lastChannel!=`string`&&typeof rec.lastProvider==`string`&&(rec.lastChannel=rec.lastProvider,delete rec.lastProvider),typeof rec.groupChannel!=`string`&&typeof rec.room==`string`?(rec.groupChannel=rec.room,delete rec.room):`room`in rec&&delete rec.room}return!opts.skipCache&&isSessionStoreCacheEnabled()&&SESSION_STORE_CACHE.set(storePath,{store:structuredClone(store),loadedAt:Date.now(),storePath,mtimeMs}),structuredClone(store)}function readSessionUpdatedAt(params){try{return loadSessionStore(params.storePath)[params.sessionKey]?.updatedAt}catch{return}}const DEFAULT_SESSION_PRUNE_AFTER_MS=720*60*60*1e3,DEFAULT_SESSION_ROTATE_BYTES=10485760;function resolvePruneAfterMs(maintenance){let raw=maintenance?.pruneAfter??maintenance?.pruneDays;if(raw==null||raw===``)return DEFAULT_SESSION_PRUNE_AFTER_MS;try{return parseDurationMs(String(raw).trim(),{defaultUnit:`d`})}catch{return DEFAULT_SESSION_PRUNE_AFTER_MS}}function resolveRotateBytes(maintenance){let raw=maintenance?.rotateBytes;if(raw==null||raw===``)return DEFAULT_SESSION_ROTATE_BYTES;try{return parseByteSize(String(raw).trim(),{defaultUnit:`b`})}catch{return DEFAULT_SESSION_ROTATE_BYTES}}function resolveMaintenanceConfig(){let maintenance;try{maintenance=loadConfig().session?.maintenance}catch{}return{mode:maintenance?.mode??`warn`,pruneAfterMs:resolvePruneAfterMs(maintenance),maxEntries:maintenance?.maxEntries??500,rotateBytes:resolveRotateBytes(maintenance)}}function pruneStaleEntries(store,overrideMaxAgeMs,opts={}){let maxAgeMs=overrideMaxAgeMs??resolveMaintenanceConfig().pruneAfterMs,cutoffMs=Date.now()-maxAgeMs,pruned=0;for(let[key,entry]of Object.entries(store))entry?.updatedAt!=null&&entry.updatedAt<cutoffMs&&(opts.onPruned?.({key,entry}),delete store[key],pruned++);return pruned>0&&opts.log!==!1&&log.info(`pruned stale session entries`,{pruned,maxAgeMs}),pruned}function getEntryUpdatedAt(entry){return entry?.updatedAt??-1/0}function getActiveSessionMaintenanceWarning(params){let activeSessionKey=params.activeSessionKey.trim();if(!activeSessionKey)return null;let activeEntry=params.store[activeSessionKey];if(!activeEntry)return null;let cutoffMs=(params.nowMs??Date.now())-params.pruneAfterMs,wouldPrune=activeEntry.updatedAt==null?!1:activeEntry.updatedAt<cutoffMs,keys=Object.keys(params.store),wouldCap=keys.length>params.maxEntries&&keys.toSorted((a,b)=>getEntryUpdatedAt(params.store[b])-getEntryUpdatedAt(params.store[a])).slice(params.maxEntries).includes(activeSessionKey);return!wouldPrune&&!wouldCap?null:{activeSessionKey,activeUpdatedAt:activeEntry.updatedAt,totalEntries:keys.length,pruneAfterMs:params.pruneAfterMs,maxEntries:params.maxEntries,wouldPrune,wouldCap}}function capEntryCount(store,overrideMax,opts={}){let maxEntries=overrideMax??resolveMaintenanceConfig().maxEntries,keys=Object.keys(store);if(keys.length<=maxEntries)return 0;let toRemove=keys.toSorted((a,b)=>{let aTime=getEntryUpdatedAt(store[a]);return getEntryUpdatedAt(store[b])-aTime}).slice(maxEntries);for(let key of toRemove)delete store[key];return opts.log!==!1&&log.info(`capped session entry count`,{removed:toRemove.length,maxEntries}),toRemove.length}async function getSessionFileSize(storePath){try{return(await fs.promises.stat(storePath)).size}catch{return null}}async function rotateSessionFile(storePath,overrideBytes){let maxBytes=overrideBytes??resolveMaintenanceConfig().rotateBytes,fileSize=await getSessionFileSize(storePath);if(fileSize==null||fileSize<=maxBytes)return!1;let backupPath=`${storePath}.bak.${Date.now()}`;try{await fs.promises.rename(storePath,backupPath),log.info(`rotated session store file`,{backupPath:path.basename(backupPath),sizeBytes:fileSize})}catch{return!1}try{let dir=path.dirname(storePath),baseName=path.basename(storePath),backups=(await fs.promises.readdir(dir)).filter(f=>f.startsWith(`${baseName}.bak.`)).toSorted().toReversed();if(backups.length>3){let toDelete=backups.slice(3);for(let old of toDelete)await fs.promises.unlink(path.join(dir,old)).catch(()=>void 0);log.info(`cleaned up old session store backups`,{deleted:toDelete.length})}}catch{}return!0}async function saveSessionStoreUnlocked(storePath,store,opts){if(invalidateSessionStoreCache(storePath),normalizeSessionStore(store),!opts?.skipMaintenance){let maintenance=resolveMaintenanceConfig();if(maintenance.mode===`warn`){let activeSessionKey=opts?.activeSessionKey?.trim();if(activeSessionKey){let warning=getActiveSessionMaintenanceWarning({store,activeSessionKey,pruneAfterMs:maintenance.pruneAfterMs,maxEntries:maintenance.maxEntries});warning&&(log.warn(`session maintenance would evict active session; skipping enforcement`,{activeSessionKey:warning.activeSessionKey,wouldPrune:warning.wouldPrune,wouldCap:warning.wouldCap,pruneAfterMs:warning.pruneAfterMs,maxEntries:warning.maxEntries}),await opts?.onWarn?.(warning))}}else{let prunedSessionFiles=new Map;pruneStaleEntries(store,maintenance.pruneAfterMs,{onPruned:({entry})=>{(!prunedSessionFiles.has(entry.sessionId)||entry.sessionFile)&&prunedSessionFiles.set(entry.sessionId,entry.sessionFile)}}),capEntryCount(store,maintenance.maxEntries);let archivedDirs=new Set;for(let[sessionId,sessionFile]of prunedSessionFiles){let archived=archiveSessionTranscripts({sessionId,storePath,sessionFile,reason:`deleted`});for(let archivedPath of archived)archivedDirs.add(path.dirname(archivedPath))}archivedDirs.size>0&&await cleanupArchivedSessionTranscripts({directories:[...archivedDirs],olderThanMs:maintenance.pruneAfterMs,reason:`deleted`}),await rotateSessionFile(storePath,maintenance.rotateBytes)}}await fs.promises.mkdir(path.dirname(storePath),{recursive:!0});let json=JSON.stringify(store,null,2);if(process.platform===`win32`){let tmp=`${storePath}.${process.pid}.${crypto.randomUUID()}.tmp`;try{await fs.promises.writeFile(tmp,json,`utf-8`);for(let i=0;i<5;i++)try{await fs.promises.rename(tmp,storePath);break}catch{i<4&&await new Promise(r=>setTimeout(r,50*(i+1))),i===4&&console.warn(`[session-store] rename failed after 5 attempts: ${storePath}`)}}catch(err){if((err&&typeof err==`object`&&`code`in err?String(err.code):null)===`ENOENT`)return;throw err}finally{await fs.promises.rm(tmp,{force:!0}).catch(()=>void 0)}return}let tmp=`${storePath}.${process.pid}.${crypto.randomUUID()}.tmp`;try{await fs.promises.writeFile(tmp,json,{mode:384,encoding:`utf-8`}),await fs.promises.rename(tmp,storePath),await fs.promises.chmod(storePath,384)}catch(err){if((err&&typeof err==`object`&&`code`in err?String(err.code):null)===`ENOENT`){try{await fs.promises.mkdir(path.dirname(storePath),{recursive:!0}),await fs.promises.writeFile(storePath,json,{mode:384,encoding:`utf-8`}),await fs.promises.chmod(storePath,384)}catch(err2){if((err2&&typeof err2==`object`&&`code`in err2?String(err2.code):null)===`ENOENT`)return;throw err2}return}throw err}finally{await fs.promises.rm(tmp,{force:!0})}}async function saveSessionStore(storePath,store,opts){await withSessionStoreLock(storePath,async()=>{await saveSessionStoreUnlocked(storePath,store,opts)})}async function updateSessionStore(storePath,mutator,opts){return await withSessionStoreLock(storePath,async()=>{let store=loadSessionStore(storePath,{skipCache:!0}),result=await mutator(store);return await saveSessionStoreUnlocked(storePath,store,opts),result})}const LOCK_QUEUES=new Map;function lockTimeoutError(storePath){return Error(`timeout waiting for session store lock: ${storePath}`)}function getOrCreateLockQueue(storePath){let existing=LOCK_QUEUES.get(storePath);if(existing)return existing;let created={running:!1,pending:[]};return LOCK_QUEUES.set(storePath,created),created}async function drainSessionStoreLockQueue(storePath){let queue=LOCK_QUEUES.get(storePath);if(!(!queue||queue.running)){queue.running=!0;try{for(;queue.pending.length>0;){let task=queue.pending.shift();if(!task)continue;let remainingTimeoutMs=task.timeoutMs??1/0;if(task.timeoutMs!=null&&remainingTimeoutMs<=0){task.reject(lockTimeoutError(storePath));continue}let lock,result,failed,hasFailure=!1;try{lock=await acquireSessionWriteLock({sessionFile:storePath,timeoutMs:remainingTimeoutMs,staleMs:task.staleMs}),result=await task.fn()}catch(err){hasFailure=!0,failed=err}finally{await lock?.release().catch(()=>void 0)}if(hasFailure){task.reject(failed);continue}task.resolve(result)}}finally{queue.running=!1,queue.pending.length===0?LOCK_QUEUES.delete(storePath):queueMicrotask(()=>{drainSessionStoreLockQueue(storePath)})}}}async function withSessionStoreLock(storePath,fn,opts={}){if(!storePath||typeof storePath!=`string`)throw Error(`withSessionStoreLock: storePath must be a non-empty string, got ${JSON.stringify(storePath)}`);let timeoutMs=opts.timeoutMs??1e4,staleMs=opts.staleMs??3e4;opts.pollIntervalMs;let hasTimeout=timeoutMs>0&&Number.isFinite(timeoutMs),queue=getOrCreateLockQueue(storePath);return await new Promise((resolve,reject)=>{let task={fn:async()=>await fn(),resolve:value=>resolve(value),reject,timeoutMs:hasTimeout?timeoutMs:void 0,staleMs};queue.pending.push(task),drainSessionStoreLockQueue(storePath)})}async function updateSessionStoreEntry(params){let{storePath,sessionKey,update}=params;return await withSessionStoreLock(storePath,async()=>{let store=loadSessionStore(storePath),existing=store[sessionKey];if(!existing)return null;let patch=await update(existing);if(!patch)return existing;let next=mergeSessionEntry(existing,patch);return store[sessionKey]=next,await saveSessionStoreUnlocked(storePath,store,{activeSessionKey:sessionKey}),next})}async function recordSessionMetaFromInbound(params){let{storePath,sessionKey,ctx}=params,createIfMissing=params.createIfMissing??!0;return await updateSessionStore(storePath,store=>{let existing=store[sessionKey],patch=deriveSessionMetaPatch({ctx,sessionKey,existing,groupResolution:params.groupResolution});if(!patch)return existing??null;if(!existing&&!createIfMissing)return null;let next=mergeSessionEntry(existing,patch);return store[sessionKey]=next,next},{activeSessionKey:sessionKey})}async function updateLastRoute(params){let{storePath,sessionKey,channel,to,accountId,threadId,ctx}=params;return await withSessionStoreLock(storePath,async()=>{let store=loadSessionStore(storePath),existing=store[sessionKey],now=Date.now(),explicitContext=normalizeDeliveryContext(params.deliveryContext),inlineContext=normalizeDeliveryContext({channel,to,accountId,threadId}),mergedInput=mergeDeliveryContext(explicitContext,inlineContext),explicitDeliveryContext=params.deliveryContext,explicitThreadValue=(explicitDeliveryContext!=null&&Object.prototype.hasOwnProperty.call(explicitDeliveryContext,`threadId`)?explicitDeliveryContext.threadId:void 0)??(threadId!=null&&threadId!==``?threadId:void 0),merged=mergeDeliveryContext(mergedInput,(explicitContext?.channel||explicitContext?.to||inlineContext?.channel||inlineContext?.to)&&explicitThreadValue==null?removeThreadFromDeliveryContext(deliveryContextFromSession(existing)):deliveryContextFromSession(existing)),normalized=normalizeSessionDeliveryFields({deliveryContext:{channel:merged?.channel,to:merged?.to,accountId:merged?.accountId,threadId:merged?.threadId}}),metaPatch=ctx?deriveSessionMetaPatch({ctx,sessionKey,existing,groupResolution:params.groupResolution}):null,basePatch={updatedAt:Math.max(existing?.updatedAt??0,now),deliveryContext:normalized.deliveryContext,lastChannel:normalized.lastChannel,lastTo:normalized.lastTo,lastAccountId:normalized.lastAccountId,lastThreadId:normalized.lastThreadId},next=mergeSessionEntry(existing,metaPatch?{...basePatch,...metaPatch}:basePatch);return store[sessionKey]=next,await saveSessionStoreUnlocked(storePath,store,{activeSessionKey:sessionKey}),next})}function stripQuery(value){let noHash=value.split(`#`)[0]??value;return noHash.split(`?`)[0]??noHash}function extractFileNameFromMediaUrl(value){let trimmed=value.trim();if(!trimmed)return null;let cleaned=stripQuery(trimmed);try{let parsed=new URL(cleaned),base=path.basename(parsed.pathname);if(!base)return null;try{return decodeURIComponent(base)}catch{return base}}catch{let base=path.basename(cleaned);return!base||base===`/`||base===`.`?null:base}}function resolveMirroredTranscriptText(params){let mediaUrls=params.mediaUrls?.filter(url=>url&&url.trim())??[];if(mediaUrls.length>0){let names=mediaUrls.map(url=>extractFileNameFromMediaUrl(url)).filter(name=>!!(name&&name.trim()));return names.length>0?names.join(`, `):`media`}return(params.text??``).trim()||null}async function ensureSessionHeader(params){if(fs.existsSync(params.sessionFile))return;await fs.promises.mkdir(path.dirname(params.sessionFile),{recursive:!0});let header={type:`session`,version:CURRENT_SESSION_VERSION,id:params.sessionId,timestamp:new Date().toISOString(),cwd:process.cwd()};await fs.promises.writeFile(params.sessionFile,`${JSON.stringify(header)}\n`,{encoding:`utf-8`,mode:384})}async function appendAssistantMessageToSessionTranscript(params){let sessionKey=params.sessionKey.trim();if(!sessionKey)return{ok:!1,reason:`missing sessionKey`};let mirrorText=resolveMirroredTranscriptText({text:params.text,mediaUrls:params.mediaUrls});if(!mirrorText)return{ok:!1,reason:`empty text`};let storePath=params.storePath??resolveDefaultSessionStorePath(params.agentId),entry=loadSessionStore(storePath,{skipCache:!0})[sessionKey];if(!entry?.sessionId)return{ok:!1,reason:`unknown sessionKey: ${sessionKey}`};let sessionFile;try{sessionFile=resolveSessionFilePath(entry.sessionId,entry,{agentId:params.agentId,sessionsDir:path.dirname(storePath)})}catch(err){return{ok:!1,reason:err instanceof Error?err.message:String(err)}}return await ensureSessionHeader({sessionFile,sessionId:entry.sessionId}),SessionManager.open(sessionFile).appendMessage({role:`assistant`,content:[{type:`text`,text:mirrorText}],api:`openai-responses`,provider:`builderforce`,model:`delivery-mirror`,usage:{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},stopReason:`stop`,timestamp:Date.now()}),(!entry.sessionFile||entry.sessionFile!==sessionFile)&&await updateSessionStore(storePath,current=>{current[sessionKey]={...entry,sessionFile}},{activeSessionKey:sessionKey}),emitSessionTranscriptUpdate(sessionFile),{ok:!0,sessionFile}}function parseSessionThreadInfo(sessionKey){if(!sessionKey)return{baseSessionKey:void 0,threadId:void 0};let topicIndex=sessionKey.lastIndexOf(`:topic:`),threadIndex=sessionKey.lastIndexOf(`:thread:`),markerIndex=Math.max(topicIndex,threadIndex),marker=topicIndex>threadIndex?`:topic:`:`:thread:`;return{baseSessionKey:markerIndex===-1?sessionKey:sessionKey.slice(0,markerIndex),threadId:(markerIndex===-1?void 0:sessionKey.slice(markerIndex+marker.length))?.trim()||void 0}}function extractDeliveryInfo(sessionKey){let{baseSessionKey,threadId}=parseSessionThreadInfo(sessionKey);if(!sessionKey||!baseSessionKey)return{deliveryContext:void 0,threadId};let deliveryContext;try{let store=loadSessionStore(resolveStorePath(loadConfig().session?.store)),entry=store[sessionKey];!entry?.deliveryContext&&baseSessionKey!==sessionKey&&(entry=store[baseSessionKey]),entry?.deliveryContext&&(deliveryContext={channel:entry.deliveryContext.channel,to:entry.deliveryContext.to,accountId:entry.deliveryContext.accountId})}catch{}return{deliveryContext,threadId}}export{normalizeHyphenSlug as $,evaluateSessionFreshness as A,resolveMainSessionKey as B,readSessionMessages as C,stripEnvelopeFromMessages as D,resolveSessionTranscriptCandidates as E,DEFAULT_RESET_TRIGGERS as F,listChannelDocks as G,deriveSessionMetaPatch as H,resolveFreshSessionTotalTokens as I,resolveChannelGroupRequireMention as J,normalizeSignalMessagingTarget as K,canonicalizeMainSessionAlias as L,resolveSessionResetPolicy as M,resolveSessionResetType as N,deriveSessionKey as O,resolveThreadFlag as P,normalizeAtHashSlug as Q,resolveAgentMainSessionKey as R,capArrayByJsonBytes as S,readSessionTitleFieldsFromTranscript as T,snapshotSessionOrigin as U,resolveMainSessionKeyFromConfig as V,getChannelDock as W,buildGroupDisplayName as X,resolveChannelGroupToolsPolicy as Y,resolveGroupSessionKey as Z,normalizeDeliveryContext as _,loadSessionStore as a,archiveFileOnDisk as b,saveSessionStore as c,updateSessionStoreEntry as d,normalizeStringEntries as et,isCacheEnabled as f,mergeDeliveryContext as g,deliveryContextKey as h,resolveMirroredTranscriptText as i,resolveSessionLockMaxHoldFromTimeout as it,resolveChannelResetConfig as j,resolveSessionKey as k,updateLastRoute as l,deliveryContextFromSession as m,parseSessionThreadInfo as n,acquireSessionWriteLock as nt,readSessionUpdatedAt as o,resolveCacheTtlMs as p,resolveChannelGroupPolicy as q,appendAssistantMessageToSessionTranscript as r,cleanStaleLockFiles as rt,recordSessionMetaFromInbound as s,extractDeliveryInfo as t,normalizeStringEntriesLower as tt,updateSessionStore as u,normalizeSessionDeliveryFields as v,readSessionPreviewItemsFromTranscript as w,archiveSessionTranscripts as x,normalizeAccountId as y,resolveExplicitAgentSessionKey as z};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import"./paths-BHg-VHB4.js";import"./registry-Cv7CoWAs.js";import"./utils-BP60e80M.js";import"./subsystem-C4b1Von0.js";import"./boolean-ssGoaBPk.js";import"./env-BoE8QSib.js";import"./auth-profiles-
|
|
1
|
+
import"./paths-BHg-VHB4.js";import"./registry-Cv7CoWAs.js";import"./utils-BP60e80M.js";import"./subsystem-C4b1Von0.js";import"./boolean-ssGoaBPk.js";import"./env-BoE8QSib.js";import"./auth-profiles-pt7Tr4HA.js";import"./src-DvWaTze9.js";import"./logger-wuOr7HKl.js";import"./session-key-CksCYipj.js";import"./builderforce-root-DY1qbWNX.js";import"./exec-COgsU9ql.js";import"./agent-scope-CufEmNj_.js";import"./env-file-DeS6x2OL.js";import"./src-HrLX5bhG.js";import"./io-D9hC2aG0.js";import"./manifest-registry-009gLJ4l.js";import"./config-BpChMIJ6.js";import"./model-discovery-D0i1JpiL.js";import"./message-channel-z5YRpR2d.js";import"./sessions-BA8Se_bT.js";import"./plugins-1Mn6RiNf.js";import"./accounts-BkTLjSrD.js";import"./bindings-CKSDlQ1i.js";import"./accounts-Cx82nj4E.js";import"./accounts-DcoaLXKI.js";import"./paths-ClsbsPQP.js";import"./session-utils-Dxou8SbO.js";import{t as sessionsCommand}from"./sessions-DvqsIg0M.js";export{sessionsCommand};
|