@seanhogg/builderforce-agents 2026.9.5 → 2026.9.6
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/{agent-CBRDuLO-.js → agent-59_cdTZl.js} +1 -1
- package/dist/{agent-CCY1r5YW.js → agent-CvMM49lm.js} +1 -1
- package/dist/{agents-DW3hte-y.js → agents-2d7A-Uwz.js} +1 -1
- package/dist/{agents-Ce4bN10e.js → agents-BdOgv61S.js} +1 -1
- package/dist/{audio-preflight-BvzGdNYy.js → audio-preflight-CmX2XJ3N.js} +1 -1
- package/dist/{audio-preflight-BYMboYmW.js → audio-preflight-Dnw3oDJr.js} +1 -1
- package/dist/{audio-preflight-CEOxJosQ.js → audio-preflight-HcRdB0oH.js} +1 -1
- package/dist/{audio-preflight-CswNxppe.js → audio-preflight-Sh649dxR.js} +1 -1
- package/dist/{auth-choice-DSLN0TLU.js → auth-choice-D06_TWBf.js} +1 -1
- package/dist/{auth-choice-BTrUlYmE.js → auth-choice-DyxxR025.js} +1 -1
- package/dist/{auth-choice.apply-BZ7E08Yb.js → auth-choice.apply-CUuLdlQd.js} +1 -1
- package/dist/{auth-choice.apply-D3EY1pZ3.js → auth-choice.apply-CfFhu_Vk.js} +1 -1
- package/dist/{auth-choice.apply-5dpCNO0l.js → auth-choice.apply-D57XA_d9.js} +1 -1
- package/dist/{auth-choice.apply-3tPFL-eH.js → auth-choice.apply-s_rOXFVz.js} +1 -1
- package/dist/{auth-choice.apply.transformers-B_Q6e8Yk.js → auth-choice.apply.transformers-CqQSUnsx.js} +1 -1
- package/dist/{auth-choice.apply.transformers-D1EzC906.js → auth-choice.apply.transformers-DXBWOilg.js} +1 -1
- package/dist/{auth-choice.apply.transformers-BJbpyCWs.js → auth-choice.apply.transformers-DizfkAmz.js} +1 -1
- package/dist/{auth-choice.apply.transformers-vLzCo5ew.js → auth-choice.apply.transformers-vyvtAxcX.js} +1 -1
- package/dist/{banner-DVNoUX5I.js → banner-BXpp_pEd.js} +1 -1
- package/dist/build-info.json +3 -3
- package/dist/{builderforce-Bs_G8kBN.js → builderforce-BdJAOfvE.js} +2 -2
- package/dist/{builderforce-BN_So1di.js → builderforce-BrFUSx35.js} +2 -2
- package/dist/{builderforce-directory-sync-BCZK4FYJ.js → builderforce-directory-sync-CFiQew6N.js} +1 -1
- package/dist/{builderforce-directory-sync-DHfiUf2g.js → builderforce-directory-sync-DIQQT09l.js} +1 -1
- package/dist/{builderforce-onboarding-Bbjz8F-r.js → builderforce-onboarding-CoGJY95Q.js} +1 -1
- package/dist/{builderforce-onboarding-8lL2bgtL.js → builderforce-onboarding-DyYM_cib.js} +1 -1
- package/dist/{builderforcellm-syscheck-CyZiwcdF.js → builderforcellm-syscheck-CfFrfeV2.js} +1 -1
- package/dist/{builderforcellm-syscheck-DMjMJNFI.js → builderforcellm-syscheck-DGZKIwPC.js} +1 -1
- package/dist/bundled/boot-md/handler.js +1 -1
- package/dist/bundled/session-memory/handler.js +1 -1
- package/dist/{channel-options-Zk5QnNPR.js → channel-options--DZ4jYy9.js} +1 -1
- package/dist/{channel-options-Cbz6vcgo.js → channel-options-xVK4amr4.js} +1 -1
- package/dist/{channel-web-1xD-Ad2T.js → channel-web-9vO41fn2.js} +1 -1
- package/dist/{channels-cli-CiVlP8_q.js → channels-cli-Ch1sZ58k.js} +1 -1
- package/dist/{channels-cli-BOcpgY_W.js → channels-cli-YMSOJUmp.js} +1 -1
- package/dist/chrome-Bi-3xZj-.js +4 -0
- package/dist/chrome-C6oWWmHX.js +4 -0
- package/dist/{cli-6znoaKr2.js → cli-gsxv7DrZ.js} +1 -1
- package/dist/{cli-BPwpRE1j.js → cli-zC5qoRAp.js} +1 -1
- package/dist/{command-registry-BTxAGdlS.js → command-registry-BXLjR3kb.js} +1 -1
- package/dist/{command-registry-BZINHmI9.js → command-registry-I83E6HLw.js} +1 -1
- package/dist/{completion-cli-BwCfUaHz.js → completion-cli-BQCxFDqY.js} +1 -1
- package/dist/{completion-cli-vR4Sx9zB.js → completion-cli-CDy8f_Fg.js} +1 -1
- package/dist/{completion-cli-C8kMJ401.js → completion-cli-DbIxXK1B.js} +1 -1
- package/dist/{completion-cli-D8WkqtSU.js → completion-cli-ydxyAE7J.js} +1 -1
- package/dist/{config-cli-BYFA4Nin.js → config-cli-5ZSrACPR.js} +1 -1
- package/dist/{config-cli-DVpEv0oj.js → config-cli-BvJso6op.js} +1 -1
- package/dist/{configure-COeSbyyP.js → configure-1e4C38zp.js} +1 -1
- package/dist/{configure-CW2bJ91q.js → configure-B_oI_bg-.js} +1 -1
- package/dist/{configure-B_juJzVi.js → configure-Dp71zeJI.js} +1 -1
- package/dist/{configure-CgkUUUpM.js → configure-NxmuXXEd.js} +1 -1
- package/dist/{deliver-qM1Zkf4i.js → deliver-C6HTqnzY.js} +1 -1
- package/dist/{deliver-BNMupwo6.js → deliver-CdwCHH01.js} +1 -1
- package/dist/{deliver-Bs-FVPQ4.js → deliver-DFhj1d_t.js} +1 -1
- package/dist/{deliver-C5lVQcrs.js → deliver-XGIFv80r.js} +1 -1
- package/dist/{deps-DWFMK9Xg.js → deps-C4YVdrEi.js} +1 -1
- package/dist/{doctor-completion-s5vcMc-C.js → doctor-completion-DhIR9uqB.js} +1 -1
- package/dist/{doctor-completion-BdMxCat-.js → doctor-completion-Dpy-8HV9.js} +1 -1
- package/dist/{embedded-CRoX1qTh.js → embedded-Cw4g0mzl.js} +7 -7
- package/dist/{embedded-DpSS2q2a.js → embedded-DG3sEMyg.js} +7 -7
- package/dist/{embedded-helpers-BrfnCpCe.js → embedded-helpers-3FEGD_4b.js} +1 -1
- package/dist/{embedded-helpers-Q5h1lA6D.js → embedded-helpers-DGDYymYx.js} +1 -1
- package/dist/entry.js +1 -1
- package/dist/extensionAPI.js +1 -1
- package/dist/{gateway-cli-oSSOT67p.js → gateway-cli-BBu6KI7r.js} +4 -4
- package/dist/{gateway-cli-DzxNTkvL.js → gateway-cli-CSmbpS6n.js} +4 -4
- package/dist/{health-_L8Avf4v.js → health-AOM42u9C.js} +1 -1
- package/dist/{health-hXlukqbf.js → health-CRIXA8je.js} +1 -1
- package/dist/{health-B_qWRpsT.js → health-Cuh0tZl2.js} +1 -1
- package/dist/{hooks-cli-C-vbyL2y.js → hooks-cli-BeqvyPiX.js} +1 -1
- package/dist/{hooks-cli-7gBXRQ81.js → hooks-cli-CYI9ZvNI.js} +1 -1
- package/dist/index.js +2 -2
- package/dist/{ink-session-DpO3VOYc.js → ink-session-MNcfJzij.js} +1 -1
- package/dist/{ink-session-CZj35xTR.js → ink-session-VqYNJYzq.js} +1 -1
- package/dist/llm-slug-generator.js +1 -1
- package/dist/{mamba-state-engine-CFwb8DcP.js → mamba-state-engine-BYmUnYwn.js} +1 -1
- package/dist/{mamba-state-engine-Ck2JCfL6.js → mamba-state-engine-BloJzrxU.js} +1 -1
- package/dist/{models-PPv9KRbb.js → models-B6kkCBLd.js} +1 -1
- package/dist/{models-cli-btaamH96.js → models-cli-C7u8eLls.js} +1 -1
- package/dist/{models-cli-BUDSwmIY.js → models-cli-DpbpZwjy.js} +1 -1
- package/dist/{models-DMrs_Zsc.js → models-hEa3avo7.js} +1 -1
- package/dist/{onboard-4JByma4r.js → onboard-BHlI_UVY.js} +2 -2
- package/dist/{onboard-Dq_XQQXY.js → onboard-BW5J0Ym8.js} +2 -2
- package/dist/{onboard-channels-Dzyeem1L.js → onboard-channels-BkrhZ79I.js} +1 -1
- package/dist/{onboard-channels-D4g6xuSC.js → onboard-channels-DXIqdoto.js} +1 -1
- package/dist/{onboard-channels-Dir2EguP.js → onboard-channels-V51s9X-h.js} +1 -1
- package/dist/{onboard-channels-UZOCuxN7.js → onboard-channels-fyGQ1v4S.js} +1 -1
- package/dist/{onboard-interactive-DvNhkCNr.js → onboard-interactive-ClPMlCIl.js} +1 -1
- package/dist/{onboard-interactive-DyyEDd9a.js → onboard-interactive-D6IBBU8m.js} +1 -1
- package/dist/{onboard-interactive-CwNfYxGe.js → onboard-interactive-DEeqmoeW.js} +1 -1
- package/dist/{onboard-interactive-Co2bcd7g.js → onboard-interactive-DSZak3YX.js} +1 -1
- package/dist/{onboarding-DBL-H1Qu.js → onboarding-CYOfGpd5.js} +3 -3
- package/dist/{onboarding-CIxLpuFP.js → onboarding-DIxm_q7P.js} +3 -3
- package/dist/{onboarding.finalize-CGGbkAOL.js → onboarding.finalize-Co5L0rNp.js} +1 -1
- package/dist/{onboarding.finalize-R3TfibWY.js → onboarding.finalize-DAwpQa7n.js} +1 -1
- package/dist/{outbound-send-deps-CsJgGsii.js → outbound-send-deps-Cys_MtmC.js} +1 -1
- package/dist/{plugin-registry-Ty9w94Rd.js → plugin-registry-BM1-sG-e.js} +1 -1
- package/dist/{plugin-registry-BkGhcUDV.js → plugin-registry-CAy3I1K1.js} +1 -1
- package/dist/{plugin-registry-BenvgIsJ.js → plugin-registry-DjmzOS3n.js} +1 -1
- package/dist/{plugin-registry-DZirturB.js → plugin-registry-l2iN7_1l.js} +1 -1
- package/dist/plugin-sdk/agent-runtime/src/builderforce/ports.d.ts +1 -1
- package/dist/plugin-sdk/agent-runtime/src/infra/limbic-system-service.d.ts +2 -3
- package/dist/plugin-sdk/{audio-preflight-lhP946UF.js → audio-preflight-BbtfbLzo.js} +1 -1
- package/dist/plugin-sdk/{channel-web-CzXHQXgb.js → channel-web-BHose9yJ.js} +1 -1
- package/dist/plugin-sdk/index.js +1 -1
- package/dist/plugin-sdk/packages/agent-tools/src/index.d.ts +0 -1
- package/dist/plugin-sdk/packages/agent-tools/src/psychometric-dims.d.ts +2 -2
- package/dist/plugin-sdk/packages/agent-tools/src/psychometrics.d.ts +38 -5
- package/dist/plugin-sdk/packages/agent-tools/src/spec.d.ts +3 -1
- package/dist/plugin-sdk/{reply-DkmZ32IH.js → reply-V98uAjNN.js} +5 -5
- package/dist/plugin-sdk/{runner-DeqVi2ay.js → runner-BpFNG45j.js} +1 -1
- package/dist/plugin-sdk/{src-yVjde9hC.js → src-pvdIxmTY.js} +2 -2
- package/dist/plugin-sdk/{tool-loop-detection-AO2R09bJ.js → tool-loop-detection-Bjiit8CZ.js} +1 -1
- package/dist/plugin-sdk/{web-D-h3WpSq.js → web-Bq6nGRsB.js} +1 -1
- package/dist/{plugins-r-hGfiMK.js → plugins-BbovMu2g.js} +1 -1
- package/dist/{plugins-ChYVZuHy.js → plugins-DrkC1ANW.js} +1 -1
- package/dist/{plugins-cli-CKQ2X7tA.js → plugins-cli-CqtTn-Gv.js} +1 -1
- package/dist/{plugins-cli-CB7e9eCK.js → plugins-cli-DWlQnRpV.js} +1 -1
- package/dist/{program-D71K23KC.js → program-DOGUG9Uz.js} +2 -2
- package/dist/{program-context-B9V62ZJg.js → program-context-DBtTOKkf.js} +1 -1
- package/dist/{project-context-Cnqfr64Z.js → project-context-C5KLsMTc.js} +1 -1
- package/dist/{project-context-DXP12xhk.js → project-context-Cg0S9eFT.js} +1 -1
- package/dist/project-context-DbBD_r4v.js +1 -0
- package/dist/project-context-nIzFswHk.js +1 -0
- package/dist/project-context-store-B96x1Lfk.js +1 -0
- package/dist/{project-context-store-C8TROXjr.js → project-context-store-BS994lZX.js} +1 -1
- package/dist/{project-context-store-ClFt-YDL.js → project-context-store-BSIWJD6S.js} +1 -1
- package/dist/project-context-store-BzX1YdMP.js +1 -0
- package/dist/{prompt-select-styled-Cect8vJu.js → prompt-select-styled-2q_0LOx1.js} +1 -1
- package/dist/{prompt-select-styled-CJBJZiX_.js → prompt-select-styled-D31D9EIl.js} +1 -1
- package/dist/{provider-auth-helpers-DItSj71N.js → provider-auth-helpers-9Ut-MHV9.js} +1 -1
- package/dist/{provider-auth-helpers-ByvJdQT3.js → provider-auth-helpers-u1GAP4Bi.js} +1 -1
- package/dist/{provider-dispatcher-E-RjX6WG.js → provider-dispatcher-4KsB_bCw.js} +1 -1
- package/dist/{provider-dispatcher-D6-kUWf8.js → provider-dispatcher-CG7kSp65.js} +1 -1
- package/dist/{push-apns-B6YfFR5s.js → push-apns-CEzi4ars.js} +1 -1
- package/dist/{push-apns-n8P3oclR.js → push-apns-oUAHr48A.js} +1 -1
- package/dist/{pw-ai-BpY-eMJT.js → pw-ai-CfV_5FWo.js} +1 -1
- package/dist/{pw-ai-Bu1w-1rC.js → pw-ai-Dx8XRyPq.js} +1 -1
- package/dist/{register.agent-CAsV5dRf.js → register.agent-C84ud-cS.js} +1 -1
- package/dist/{register.agent-DQ4zQymV.js → register.agent-Db9SzkZg.js} +1 -1
- package/dist/{register.configure-HcPL-Na2.js → register.configure-BfPiEcFk.js} +1 -1
- package/dist/{register.configure-B-xRsB-s.js → register.configure-WYMz_fwM.js} +1 -1
- package/dist/{register.connect-BcZeAJ1s.js → register.connect-CMN7lqC5.js} +1 -1
- package/dist/{register.connect-ChZQOiYF.js → register.connect-Dqhd81kK.js} +1 -1
- package/dist/{register.maintenance-C-7Arpam.js → register.maintenance-BpQE-3eC.js} +1 -1
- package/dist/{register.maintenance-Jdfg2LKA.js → register.maintenance-DjKxt-jl.js} +1 -1
- package/dist/{register.message-D1IU3K0a.js → register.message-C4Gf388m.js} +1 -1
- package/dist/{register.message-C3cFBIXY.js → register.message-D5A7-_wN.js} +1 -1
- package/dist/{register.onboard-DJ2QNnOi.js → register.onboard-BF5tXr7K.js} +1 -1
- package/dist/{register.onboard-DjrhC3jh.js → register.onboard-BO_OtYg9.js} +1 -1
- package/dist/{register.setup-BNUqkiVa.js → register.setup-BzDbYjEw.js} +1 -1
- package/dist/{register.setup-C8XgG5Zt.js → register.setup-CaWt1bhf.js} +1 -1
- package/dist/{register.status-health-sessions-DcqlqAhs.js → register.status-health-sessions-BbYzFw1X.js} +1 -1
- package/dist/{register.status-health-sessions-CBTZZ0Rh.js → register.status-health-sessions-CDD6Eoxf.js} +1 -1
- package/dist/{register.subclis-CqVl0uO4.js → register.subclis-Cfb5FUTI.js} +1 -1
- package/dist/{register.subclis-Meewq2dj.js → register.subclis-yYbEKj9a.js} +1 -1
- package/dist/{reply-BsRbeUhd.js → reply-CpGH-3If.js} +8 -8
- package/dist/{run-main-CFVoPcgN.js → run-main-B82VAQTQ.js} +1 -1
- package/dist/{runner-68-X3KHf.js → runner-BLCTET8O.js} +2 -2
- package/dist/{runner-CfNJMPWu.js → runner-C651oVfk.js} +2 -2
- package/dist/{runner-BgUG2-RV.js → runner-DCn9sBTn.js} +3 -3
- package/dist/{runner-BKHYCYMH.js → runner-xF3_-mDL.js} +3 -3
- package/dist/{server-node-events-DusCxrVm.js → server-node-events-Bam08x5E.js} +1 -1
- package/dist/{server-node-events-BahizW3Z.js → server-node-events-kbTUUaAA.js} +1 -1
- package/dist/{session-dirs-RIA98OsG.js → session-dirs-BBGuanHN.js} +1 -1
- package/dist/{session-dirs-Cutn9srI.js → session-dirs-DV-c-o7M.js} +1 -1
- package/dist/{src-BRo9ywDM.js → src-BM8G-tIl.js} +3 -3
- package/dist/{src-DxNC0IHE.js → src-D2-7sOAX.js} +3 -3
- package/dist/{src-NJhXretA.js → src-D5vOHX9i.js} +2 -2
- package/dist/{src-Enbbh3hH.js → src-Dptpvd0V.js} +2 -2
- package/dist/{status-DPza6sZ1.js → status-BcT4AI8l.js} +1 -1
- package/dist/{status-CMdPdaSM.js → status-C9D1ex2G.js} +1 -1
- package/dist/{status-CFDh5snF.js → status-D_YsiWpP.js} +1 -1
- package/dist/{status-SyaizSN6.js → status-V8zvPBOv.js} +1 -1
- package/dist/{status-C1toWVvJ.js → status-i_sJ6Ikx.js} +1 -1
- package/dist/{subagent-registry-oB_F2U2W.js → subagent-registry-BUKplZi1.js} +8 -8
- package/dist/{subagent-registry-DFzwOGge.js → subagent-registry-BgUoQjBB.js} +1 -1
- package/dist/{subagent-registry-C1opJIrJ.js → subagent-registry-DrrF3JoH.js} +1 -1
- package/dist/{tool-loop-detection-DxqiqYam.js → tool-loop-detection-Bv0aRyd6.js} +1 -1
- package/dist/{tool-loop-detection-3W6bLEza.js → tool-loop-detection-CgUkrbCZ.js} +1 -1
- package/dist/{tool-loop-detection-C3z1wqgV.js → tool-loop-detection-CshVZIOE.js} +1 -1
- package/dist/{tool-loop-detection-DNM8YCNW.js → tool-loop-detection-bpZ-S3A1.js} +1 -1
- package/dist/{tui-Dy1FnApe.js → tui-CdYI5f3k.js} +2 -2
- package/dist/{tui-lng2vIp3.js → tui-DgBGTw2s.js} +2 -2
- package/dist/{tui-cli-BTFEL897.js → tui-cli-BNeRzoEe.js} +1 -1
- package/dist/{tui-cli-D-cDh9DV.js → tui-cli-BZ--mp9s.js} +1 -1
- package/dist/{tui-stream-assembler-B_AQD4Kg.js → tui-stream-assembler-BNJE9PoS.js} +1 -1
- package/dist/{tui-stream-assembler-Bn1WXUGG.js → tui-stream-assembler-xFcJqFJ9.js} +1 -1
- package/dist/{update-cli-BdT4-P_D.js → update-cli-BATUCF7p.js} +1 -1
- package/dist/{update-cli-DMMSWPXh.js → update-cli-BRBoX_97.js} +1 -1
- package/dist/{web-BiSkmACr.js → web-BdYyXjsX.js} +1 -1
- package/dist/{web-CXrAweDC.js → web-C5hfXVCy.js} +1 -1
- package/dist/{web-BS6WUf7c.js → web-CsWqmV_E.js} +1 -1
- package/dist/{web-CfYUd-lX.js → web-fg3nA4Qq.js} +1 -1
- package/dist/{workflow-cli-Du4IfE1A.js → workflow-cli-D-o_-jfU.js} +1 -1
- package/dist/{workflow-cli-BuEKJ4ut.js → workflow-cli-DDWSXyi0.js} +1 -1
- package/package.json +6 -5
- package/dist/chrome-C6fODzE5.js +0 -4
- package/dist/chrome-Cm-kVyuA.js +0 -4
- package/dist/plugin-sdk/agent-runtime/src/builderforce/limbic.d.ts +0 -14
- package/dist/plugin-sdk/packages/agent-tools/src/limbic.d.ts +0 -104
- package/dist/project-context-DS52UwJZ.js +0 -1
- package/dist/project-context-PiiAmwVd.js +0 -1
- package/dist/project-context-store-B2GYSwld.js +0 -1
- package/dist/project-context-store-DNx9ScQ_.js +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{c as normalizeAccountId$1,d as resolveAgentIdFromSessionKey,i as buildAgentMainSessionKey,l as normalizeAgentId,n as DEFAULT_AGENT_ID,u as normalizeMainKey}from"./session-key-5J69DULS.js";import{_ as createAccountListHelpers,r as resolveWhatsAppAccount}from"./accounts-Cy3WCbWg.js";import{D as normalizeE164,G as shouldLogVerbose,H as logVerbose,N as shortenHomeInString,R as truncateUtf16Safe,c as requireActivePluginRegistry,g as CONFIG_DIR,j as resolveUserPath,k as resolveConfigDir,n as CHAT_CHANNEL_ORDER,r as getChatChannelMeta,t as CHANNEL_IDS,w as isRecord$1,x as escapeRegExp}from"./registry-CZHRcH-q.js";import{i as resolveGatewayPort,t as STATE_DIR,u as resolveRequiredHomeDir}from"./paths-Cb8zTlyG.js";import{$ as normalizeSecretInput,D as stripReasoningTagsFromText,I as requireApiKey,L as resolveApiKeyForProvider,M as CURRENT_SESSION_VERSION,N as SessionManager,P as getApiKeyForModel,c as normalizeProviderId$1,ft as resolveProcessScopedMap,g as normalizeGoogleModelId,k as nativeComplete,pt as isPidAlive,tt as normalizeBaseUrl$1}from"./model-selection-0ifLKoVR.js";import{Y as parseDurationMs,a as writeConfigFile,d as LEGACY_MANIFEST_KEYS,f as MANIFEST_KEY,g as resolveMemorySlotDecision,h as resolveEnableState,l as loadPluginManifestRegistry,m as normalizePluginsConfig,n as loadConfig,s as parseByteSize,t as createConfigIO}from"./config-OPdt6NPU.js";import{S as isAudioFileName,_ as resizeToJpeg,b as getFileExtension,d as IMAGE_REDUCE_QUALITY_STEPS,f as buildImageResizeSideGrid,i as fetchWithSsrFGuard,m as getImageMetadata,n as fetchRemoteMedia,t as MediaFetchError,u as fetchWithTimeout,v as detectMime,w as kindFromMime,y as extensionForMime}from"./fetch-B-GxSYRO.js";import{i as defaultRuntime,t as createSubsystemLogger}from"./subsystem-D0Ril4rt.js";import{E as normalizeSkillFilter,O as runExec,T as resolveBuilderForceAgentsPackageRootSync,_ as DEFAULT_TOOLS_FILENAME,d as DEFAULT_AGENTS_FILENAME,f as DEFAULT_AGENT_WORKSPACE_DIR,g as DEFAULT_SOUL_FILENAME,h as DEFAULT_IDENTITY_FILENAME,l as resolveSessionAgentId,m as DEFAULT_HEARTBEAT_FILENAME,n as resolveAgentConfig,p as DEFAULT_BOOTSTRAP_FILENAME,v as DEFAULT_USER_FILENAME,y as ensureAgentWorkspace}from"./agent-scope-DgKN27hJ.js";import{t as sanitizeContentBlocksImages}from"./tool-images-WRTP95FT.js";import{n as redactToolDetail}from"./redact-Bv8wnIZm.js";import{n as formatErrorMessage,t as extractErrorCode}from"./errors-L3rugjUL.js";import{C as DEFAULT_BROWSER_DEFAULT_PROFILE_NAME,D as DEFAULT_BUILDERFORCE_AGENTS_BROWSER_PROFILE_NAME,E as DEFAULT_BUILDERFORCE_AGENTS_BROWSER_ENABLED,O as isLoopbackHost,S as DEFAULT_AI_SNAPSHOT_MAX_CHARS,T as DEFAULT_BUILDERFORCE_AGENTS_BROWSER_COLOR,a as resolveBuilderForceAgentsUserDataDir,b as DEFAULT_AI_SNAPSHOT_EFFICIENT_DEPTH,c as captureScreenshot,d as normalizeCdpWsUrl,f as snapshotAria,h as fetchOk,i as launchBuilderForceAgentsChrome,j as resolvePreferredBuilderForceAgentsTmpDir,l as createTargetViaCdp,m as fetchJson,n as isChromeCdpReady,o as stopBuilderForceAgentsChrome,p as appendCdpPath,r as isChromeReachable,s as resolveBrowserExecutableForPlatform,v as ensureChromeExtensionRelayServer,w as DEFAULT_BROWSER_EVALUATE_ENABLED,x as DEFAULT_AI_SNAPSHOT_EFFICIENT_MAX_CHARS,y as stopChromeExtensionRelayServer}from"./chrome-DsPy-YNT.js";import{i as parseBooleanValue,t as formatCliCommand}from"./command-format-B3XMq_73.js";import{B as resolveDiscordAccount,D as resolveTelegramAccount,M as resolveSlackAccount,N as resolveSlackReplyToMode,S as normalizeWhatsAppTarget,r as normalizeChannelId}from"./plugins-BdkC9v5E.js";import{t as normalizeChatType}from"./chat-type-Dv7EB0qD.js";import{a as listDeliverableMessageChannels,o as normalizeMessageChannel}from"./message-channel-CuZ2xOAM.js";import{n as resolveConversationLabel}from"./conversation-label-CIuPO6yM.js";import{a as resolveSessionTranscriptPathInDir,i as resolveSessionTranscriptPath,n as resolveSessionFilePath,s as resolveStorePath,t as resolveDefaultSessionStorePath}from"./paths-BGOFa09I.js";import{i as emitSessionTranscriptUpdate,n as executeWithApiKeyRotation,r as parseGeminiAuth,t as collectProviderApiKeysForExecution}from"./api-key-rotation-6b0P0AXk.js";import{a as discoverAuthStorage,n as loadModelCatalog,o as discoverModels,r as modelSupportsVision,s as ensureBuilderForceAgentsModelsJson,t as findModelInCatalog}from"./model-catalog-Doc3qLxu.js";import{t as stableStringify}from"./src-yVjde9hC.js";import path,{basename,dirname,join,posix}from"node:path";import fs,{constants,existsSync,readFileSync,readdirSync,realpathSync,statSync}from"node:fs";import os from"node:os";import crypto,{createHash,timingSafeEqual}from"node:crypto";import{fileURLToPath}from"node:url";import JSON5 from"json5";import fs$1 from"node:fs/promises";import{spawn}from"node:child_process";import YAML from"yaml";import"node:https";import"node:stream/promises";import"node:process";import express from"express";function safeEqualSecret(provided,expected){if(typeof provided!=`string`||typeof expected!=`string`)return!1;let providedBuffer=Buffer.from(provided),expectedBuffer=Buffer.from(expected);return providedBuffer.length===expectedBuffer.length?timingSafeEqual(providedBuffer,expectedBuffer):!1}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}const{listAccountIds:listAccountIds$1,resolveDefaultAccountId:resolveDefaultAccountId$1}=createAccountListHelpers(`imessage`),listIMessageAccountIds=listAccountIds$1,resolveDefaultIMessageAccountId=resolveDefaultAccountId$1;function resolveAccountConfig$1(cfg,accountId){let accounts=cfg.channels?.imessage?.accounts;if(!(!accounts||typeof accounts!=`object`))return accounts[accountId]}function mergeIMessageAccountConfig(cfg,accountId){let{accounts:_ignored,...base}=cfg.channels?.imessage??{},account=resolveAccountConfig$1(cfg,accountId)??{};return{...base,...account}}function resolveIMessageAccount(params){let accountId=normalizeAccountId$1(params.accountId),baseEnabled=params.cfg.channels?.imessage?.enabled!==!1,merged=mergeIMessageAccountConfig(params.cfg,accountId),accountEnabled=merged.enabled!==!1,configured=!!(merged.cliPath?.trim()||merged.dbPath?.trim()||merged.service||merged.region?.trim()||merged.allowFrom&&merged.allowFrom.length>0||merged.groupAllowFrom&&merged.groupAllowFrom.length>0||merged.dmPolicy||merged.groupPolicy||typeof merged.includeAttachments==`boolean`||typeof merged.mediaMaxMb==`number`||typeof merged.textChunkLimit==`number`||merged.groups&&Object.keys(merged.groups).length>0);return{accountId,enabled:baseEnabled&&accountEnabled,name:merged.name?.trim()||void 0,config:merged,configured}}const{listAccountIds,resolveDefaultAccountId}=createAccountListHelpers(`signal`),listSignalAccountIds=listAccountIds,resolveDefaultSignalAccountId=resolveDefaultAccountId;function resolveAccountConfig(cfg,accountId){let accounts=cfg.channels?.signal?.accounts;if(!(!accounts||typeof accounts!=`object`))return accounts[accountId]}function mergeSignalAccountConfig(cfg,accountId){let{accounts:_ignored,...base}=cfg.channels?.signal??{},account=resolveAccountConfig(cfg,accountId)??{};return{...base,...account}}function resolveSignalAccount(params){let accountId=normalizeAccountId$1(params.accountId),baseEnabled=params.cfg.channels?.signal?.enabled!==!1,merged=mergeSignalAccountConfig(params.cfg,accountId),accountEnabled=merged.enabled!==!1,enabled=baseEnabled&&accountEnabled,host=merged.httpHost?.trim()||`127.0.0.1`,port=merged.httpPort??8080,baseUrl=merged.httpUrl?.trim()||`http://${host}:${port}`,configured=!!(merged.account?.trim()||merged.httpUrl?.trim()||merged.cliPath?.trim()||merged.httpHost?.trim()||typeof merged.httpPort==`number`||typeof merged.autoStart==`boolean`);return{accountId,enabled,name:merged.name?.trim()||void 0,baseUrl,configured,config:merged}}function listEnabledSignalAccounts(cfg){return listSignalAccountIds(cfg).map(accountId=>resolveSignalAccount({cfg,accountId})).filter(account=>account.enabled)}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 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,``):``}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 resolveBlueBubblesGroupRequireMention(params){return resolveChannelGroupRequireMention({cfg:params.cfg,channel:`bluebubbles`,groupId:params.groupId,accountId:params.accountId})}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 resolveBlueBubblesGroupToolPolicy(params){return resolveChannelGroupToolsPolicy({cfg:params.cfg,channel:`bluebubbles`,groupId:params.groupId,accountId:params.accountId,senderId:params.senderId,senderName:params.senderName,senderUsername:params.senderUsername,senderE164:params.senderE164})}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 UUID_PATTERN=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,UUID_COMPACT_PATTERN=/^[0-9a-f]{32}$/i;function looksLikeSignalTargetId(raw,normalized){let candidates=[raw,normalized??``].map(value=>value.trim()).filter(Boolean);for(let candidate of candidates){if(/^(signal:)?(group:|username:|u:)/i.test(candidate))return!0;if(/^(signal:)?uuid:/i.test(candidate)){let stripped=candidate.replace(/^signal:/i,``).replace(/^uuid:/i,``).trim();if(!stripped)continue;if(UUID_PATTERN.test(stripped)||UUID_COMPACT_PATTERN.test(stripped))return!0;continue}let withoutSignalPrefix=candidate.replace(/^signal:/i,``).trim();if(UUID_PATTERN.test(withoutSignalPrefix)||UUID_COMPACT_PATTERN.test(withoutSignalPrefix)||/^\+?\d{3,}$/.test(withoutSignalPrefix))return!0}return!1}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 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}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 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 resolveAgentMainSessionKey(params){let mainKey=normalizeMainKey(params.cfg?.session?.mainKey);return buildAgentMainSessionKey({agentId:params.agentId,mainKey})}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 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_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 acquireSessionWriteLock(params){registerCleanupHandlers();let timeoutMs=resolvePositiveMs(params.timeoutMs,1e4,{allowInfinity:!0}),staleMs=resolvePositiveMs(params.staleMs,18e5),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];const INPUT_PROVENANCE_KIND_VALUES=[`external_user`,`inter_session`,`internal_system`];function normalizeOptionalString(value){return typeof value==`string`&&value.trim()||void 0}function isInputProvenanceKind(value){return typeof value==`string`&&INPUT_PROVENANCE_KIND_VALUES.includes(value)}function normalizeInputProvenance(value){if(!value||typeof value!=`object`)return;let record=value;if(isInputProvenanceKind(record.kind))return{kind:record.kind,sourceSessionKey:normalizeOptionalString(record.sourceSessionKey),sourceChannel:normalizeOptionalString(record.sourceChannel),sourceTool:normalizeOptionalString(record.sourceTool)}}function applyInputProvenanceToUserMessage(message,inputProvenance){return!inputProvenance||message.role!==`user`||normalizeInputProvenance(message.provenance)?message:{...message,provenance:inputProvenance}}function isInterSessionInputProvenance(value){return normalizeInputProvenance(value)?.kind===`inter_session`}function hasInterSessionUserProvenance(message){return!message||message.role!==`user`?!1:isInterSessionInputProvenance(message.provenance)}const TOOL_CALL_TYPES$1=new Set([`tool_use`,`toolcall`,`tool_call`]),TOOL_RESULT_TYPES=new Set([`tool_result`,`tool_result_error`]),normalizeType=value=>typeof value==`string`?value.trim().toLowerCase():``,extractToolCallNames=message=>{let names=new Set,toolNameRaw=message.toolName??message.tool_name;typeof toolNameRaw==`string`&&toolNameRaw.trim()&&names.add(toolNameRaw.trim());let content=message.content;if(!Array.isArray(content))return Array.from(names);for(let entry of content){if(!entry||typeof entry!=`object`)continue;let block=entry,type=normalizeType(block.type);if(!TOOL_CALL_TYPES$1.has(type))continue;let name=block.name;typeof name==`string`&&name.trim()&&names.add(name.trim())}return Array.from(names)},countToolResults=message=>{let content=message.content;if(!Array.isArray(content))return{total:0,errors:0};let total=0,errors=0;for(let entry of content){if(!entry||typeof entry!=`object`)continue;let block=entry,type=normalizeType(block.type);TOOL_RESULT_TYPES.has(type)&&(total+=1,block.is_error===!0&&(errors+=1))}return{total,errors}};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 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$1=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$1.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$1.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$1.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$1.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$1.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 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$1(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$1({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}}function isTruthy(value){return value==null?!1:typeof value==`boolean`?value:typeof value==`number`?value!==0:typeof value==`string`?value.trim().length>0:!0}function resolveConfigPath(config,pathStr){let parts=pathStr.split(`.`).filter(Boolean),current=config;for(let part of parts){if(typeof current!=`object`||!current)return;current=current[part]}return current}function isConfigPathTruthyWithDefaults(config,pathStr,defaults){let value=resolveConfigPath(config,pathStr);return value===void 0&&pathStr in defaults?defaults[pathStr]??!1:isTruthy(value)}function evaluateRuntimeRequires(params){let requires=params.requires;if(!requires)return!0;let requiredBins=requires.bins??[];if(requiredBins.length>0){for(let bin of requiredBins)if(!params.hasBin(bin)&&!params.hasRemoteBin?.(bin))return!1}let requiredAnyBins=requires.anyBins??[];if(requiredAnyBins.length>0&&!requiredAnyBins.some(bin=>params.hasBin(bin))&&!params.hasAnyRemoteBin?.(requiredAnyBins))return!1;let requiredEnv=requires.env??[];if(requiredEnv.length>0){for(let envName of requiredEnv)if(!params.hasEnv(envName))return!1}let requiredConfig=requires.config??[];if(requiredConfig.length>0){for(let configPath of requiredConfig)if(!params.isConfigPathTruthy(configPath))return!1}return!0}function resolveRuntimePlatform(){return process.platform}function windowsPathExtensions(){let raw=process.env.PATHEXT;return[``,...(raw===void 0?[`.EXE`,`.CMD`,`.BAT`,`.COM`]:raw.split(`;`).map(v=>v.trim())).filter(Boolean)]}let cachedHasBinaryPath,cachedHasBinaryPathExt;const hasBinaryCache=new Map;function hasBinary$1(bin){let pathEnv=process.env.PATH??``,pathExt=process.platform===`win32`?process.env.PATHEXT??``:``;if((cachedHasBinaryPath!==pathEnv||cachedHasBinaryPathExt!==pathExt)&&(cachedHasBinaryPath=pathEnv,cachedHasBinaryPathExt=pathExt,hasBinaryCache.clear()),hasBinaryCache.has(bin))return hasBinaryCache.get(bin);let parts=pathEnv.split(path.delimiter).filter(Boolean),extensions=process.platform===`win32`?windowsPathExtensions():[``];for(let part of parts)for(let ext of extensions){let candidate=path.join(part,bin+ext);try{return fs.accessSync(candidate,fs.constants.X_OK),hasBinaryCache.set(bin,!0),!0}catch{}}return hasBinaryCache.set(bin,!1),!1}function stripQuotes(value){return value.startsWith(`"`)&&value.endsWith(`"`)||value.startsWith(`'`)&&value.endsWith(`'`)?value.slice(1,-1):value}function coerceFrontmatterValue(value){if(value!=null){if(typeof value==`string`)return value.trim();if(typeof value==`number`||typeof value==`boolean`)return String(value);if(typeof value==`object`)try{return JSON.stringify(value)}catch{return}}}function parseYamlFrontmatter(block){try{let parsed=YAML.parse(block);if(!parsed||typeof parsed!=`object`||Array.isArray(parsed))return null;let result={};for(let[rawKey,value]of Object.entries(parsed)){let key=rawKey.trim();if(!key)continue;let coerced=coerceFrontmatterValue(value);coerced!==void 0&&(result[key]=coerced)}return result}catch{return null}}function extractMultiLineValue(lines,startIndex){let match=lines[startIndex].match(/^([\w-]+):\s*(.*)$/);if(!match)return{value:``,linesConsumed:1};let inlineValue=match[2].trim();if(inlineValue)return{value:inlineValue,linesConsumed:1};let valueLines=[],i=startIndex+1;for(;i<lines.length;){let line=lines[i];if(line.length>0&&!line.startsWith(` `)&&!line.startsWith(` `))break;valueLines.push(line),i++}return{value:valueLines.join(`
|
|
1
|
+
import{c as normalizeAccountId$1,d as resolveAgentIdFromSessionKey,i as buildAgentMainSessionKey,l as normalizeAgentId,n as DEFAULT_AGENT_ID,u as normalizeMainKey}from"./session-key-5J69DULS.js";import{_ as createAccountListHelpers,r as resolveWhatsAppAccount}from"./accounts-Cy3WCbWg.js";import{D as normalizeE164,G as shouldLogVerbose,H as logVerbose,N as shortenHomeInString,R as truncateUtf16Safe,c as requireActivePluginRegistry,g as CONFIG_DIR,j as resolveUserPath,k as resolveConfigDir,n as CHAT_CHANNEL_ORDER,r as getChatChannelMeta,t as CHANNEL_IDS,w as isRecord$1,x as escapeRegExp}from"./registry-CZHRcH-q.js";import{i as resolveGatewayPort,t as STATE_DIR,u as resolveRequiredHomeDir}from"./paths-Cb8zTlyG.js";import{$ as normalizeSecretInput,D as stripReasoningTagsFromText,I as requireApiKey,L as resolveApiKeyForProvider,M as CURRENT_SESSION_VERSION,N as SessionManager,P as getApiKeyForModel,c as normalizeProviderId$1,ft as resolveProcessScopedMap,g as normalizeGoogleModelId,k as nativeComplete,pt as isPidAlive,tt as normalizeBaseUrl$1}from"./model-selection-0ifLKoVR.js";import{Y as parseDurationMs,a as writeConfigFile,d as LEGACY_MANIFEST_KEYS,f as MANIFEST_KEY,g as resolveMemorySlotDecision,h as resolveEnableState,l as loadPluginManifestRegistry,m as normalizePluginsConfig,n as loadConfig,s as parseByteSize,t as createConfigIO}from"./config-OPdt6NPU.js";import{S as isAudioFileName,_ as resizeToJpeg,b as getFileExtension,d as IMAGE_REDUCE_QUALITY_STEPS,f as buildImageResizeSideGrid,i as fetchWithSsrFGuard,m as getImageMetadata,n as fetchRemoteMedia,t as MediaFetchError,u as fetchWithTimeout,v as detectMime,w as kindFromMime,y as extensionForMime}from"./fetch-B-GxSYRO.js";import{i as defaultRuntime,t as createSubsystemLogger}from"./subsystem-D0Ril4rt.js";import{E as normalizeSkillFilter,O as runExec,T as resolveBuilderForceAgentsPackageRootSync,_ as DEFAULT_TOOLS_FILENAME,d as DEFAULT_AGENTS_FILENAME,f as DEFAULT_AGENT_WORKSPACE_DIR,g as DEFAULT_SOUL_FILENAME,h as DEFAULT_IDENTITY_FILENAME,l as resolveSessionAgentId,m as DEFAULT_HEARTBEAT_FILENAME,n as resolveAgentConfig,p as DEFAULT_BOOTSTRAP_FILENAME,v as DEFAULT_USER_FILENAME,y as ensureAgentWorkspace}from"./agent-scope-DgKN27hJ.js";import{t as sanitizeContentBlocksImages}from"./tool-images-WRTP95FT.js";import{n as redactToolDetail}from"./redact-Bv8wnIZm.js";import{n as formatErrorMessage,t as extractErrorCode}from"./errors-L3rugjUL.js";import{C as DEFAULT_BROWSER_DEFAULT_PROFILE_NAME,D as DEFAULT_BUILDERFORCE_AGENTS_BROWSER_PROFILE_NAME,E as DEFAULT_BUILDERFORCE_AGENTS_BROWSER_ENABLED,O as isLoopbackHost,S as DEFAULT_AI_SNAPSHOT_MAX_CHARS,T as DEFAULT_BUILDERFORCE_AGENTS_BROWSER_COLOR,a as resolveBuilderForceAgentsUserDataDir,b as DEFAULT_AI_SNAPSHOT_EFFICIENT_DEPTH,c as captureScreenshot,d as normalizeCdpWsUrl,f as snapshotAria,h as fetchOk,i as launchBuilderForceAgentsChrome,j as resolvePreferredBuilderForceAgentsTmpDir,l as createTargetViaCdp,m as fetchJson,n as isChromeCdpReady,o as stopBuilderForceAgentsChrome,p as appendCdpPath,r as isChromeReachable,s as resolveBrowserExecutableForPlatform,v as ensureChromeExtensionRelayServer,w as DEFAULT_BROWSER_EVALUATE_ENABLED,x as DEFAULT_AI_SNAPSHOT_EFFICIENT_MAX_CHARS,y as stopChromeExtensionRelayServer}from"./chrome-DsPy-YNT.js";import{i as parseBooleanValue,t as formatCliCommand}from"./command-format-B3XMq_73.js";import{B as resolveDiscordAccount,D as resolveTelegramAccount,M as resolveSlackAccount,N as resolveSlackReplyToMode,S as normalizeWhatsAppTarget,r as normalizeChannelId}from"./plugins-BdkC9v5E.js";import{t as normalizeChatType}from"./chat-type-Dv7EB0qD.js";import{a as listDeliverableMessageChannels,o as normalizeMessageChannel}from"./message-channel-CuZ2xOAM.js";import{n as resolveConversationLabel}from"./conversation-label-CIuPO6yM.js";import{a as resolveSessionTranscriptPathInDir,i as resolveSessionTranscriptPath,n as resolveSessionFilePath,s as resolveStorePath,t as resolveDefaultSessionStorePath}from"./paths-BGOFa09I.js";import{i as emitSessionTranscriptUpdate,n as executeWithApiKeyRotation,r as parseGeminiAuth,t as collectProviderApiKeysForExecution}from"./api-key-rotation-6b0P0AXk.js";import{a as discoverAuthStorage,n as loadModelCatalog,o as discoverModels,r as modelSupportsVision,s as ensureBuilderForceAgentsModelsJson,t as findModelInCatalog}from"./model-catalog-Doc3qLxu.js";import{t as stableStringify}from"./src-pvdIxmTY.js";import path,{basename,dirname,join,posix}from"node:path";import fs,{constants,existsSync,readFileSync,readdirSync,realpathSync,statSync}from"node:fs";import os from"node:os";import crypto,{createHash,timingSafeEqual}from"node:crypto";import{fileURLToPath}from"node:url";import JSON5 from"json5";import fs$1 from"node:fs/promises";import{spawn}from"node:child_process";import YAML from"yaml";import"node:https";import"node:stream/promises";import"node:process";import express from"express";function safeEqualSecret(provided,expected){if(typeof provided!=`string`||typeof expected!=`string`)return!1;let providedBuffer=Buffer.from(provided),expectedBuffer=Buffer.from(expected);return providedBuffer.length===expectedBuffer.length?timingSafeEqual(providedBuffer,expectedBuffer):!1}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}const{listAccountIds:listAccountIds$1,resolveDefaultAccountId:resolveDefaultAccountId$1}=createAccountListHelpers(`imessage`),listIMessageAccountIds=listAccountIds$1,resolveDefaultIMessageAccountId=resolveDefaultAccountId$1;function resolveAccountConfig$1(cfg,accountId){let accounts=cfg.channels?.imessage?.accounts;if(!(!accounts||typeof accounts!=`object`))return accounts[accountId]}function mergeIMessageAccountConfig(cfg,accountId){let{accounts:_ignored,...base}=cfg.channels?.imessage??{},account=resolveAccountConfig$1(cfg,accountId)??{};return{...base,...account}}function resolveIMessageAccount(params){let accountId=normalizeAccountId$1(params.accountId),baseEnabled=params.cfg.channels?.imessage?.enabled!==!1,merged=mergeIMessageAccountConfig(params.cfg,accountId),accountEnabled=merged.enabled!==!1,configured=!!(merged.cliPath?.trim()||merged.dbPath?.trim()||merged.service||merged.region?.trim()||merged.allowFrom&&merged.allowFrom.length>0||merged.groupAllowFrom&&merged.groupAllowFrom.length>0||merged.dmPolicy||merged.groupPolicy||typeof merged.includeAttachments==`boolean`||typeof merged.mediaMaxMb==`number`||typeof merged.textChunkLimit==`number`||merged.groups&&Object.keys(merged.groups).length>0);return{accountId,enabled:baseEnabled&&accountEnabled,name:merged.name?.trim()||void 0,config:merged,configured}}const{listAccountIds,resolveDefaultAccountId}=createAccountListHelpers(`signal`),listSignalAccountIds=listAccountIds,resolveDefaultSignalAccountId=resolveDefaultAccountId;function resolveAccountConfig(cfg,accountId){let accounts=cfg.channels?.signal?.accounts;if(!(!accounts||typeof accounts!=`object`))return accounts[accountId]}function mergeSignalAccountConfig(cfg,accountId){let{accounts:_ignored,...base}=cfg.channels?.signal??{},account=resolveAccountConfig(cfg,accountId)??{};return{...base,...account}}function resolveSignalAccount(params){let accountId=normalizeAccountId$1(params.accountId),baseEnabled=params.cfg.channels?.signal?.enabled!==!1,merged=mergeSignalAccountConfig(params.cfg,accountId),accountEnabled=merged.enabled!==!1,enabled=baseEnabled&&accountEnabled,host=merged.httpHost?.trim()||`127.0.0.1`,port=merged.httpPort??8080,baseUrl=merged.httpUrl?.trim()||`http://${host}:${port}`,configured=!!(merged.account?.trim()||merged.httpUrl?.trim()||merged.cliPath?.trim()||merged.httpHost?.trim()||typeof merged.httpPort==`number`||typeof merged.autoStart==`boolean`);return{accountId,enabled,name:merged.name?.trim()||void 0,baseUrl,configured,config:merged}}function listEnabledSignalAccounts(cfg){return listSignalAccountIds(cfg).map(accountId=>resolveSignalAccount({cfg,accountId})).filter(account=>account.enabled)}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 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,``):``}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 resolveBlueBubblesGroupRequireMention(params){return resolveChannelGroupRequireMention({cfg:params.cfg,channel:`bluebubbles`,groupId:params.groupId,accountId:params.accountId})}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 resolveBlueBubblesGroupToolPolicy(params){return resolveChannelGroupToolsPolicy({cfg:params.cfg,channel:`bluebubbles`,groupId:params.groupId,accountId:params.accountId,senderId:params.senderId,senderName:params.senderName,senderUsername:params.senderUsername,senderE164:params.senderE164})}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 UUID_PATTERN=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,UUID_COMPACT_PATTERN=/^[0-9a-f]{32}$/i;function looksLikeSignalTargetId(raw,normalized){let candidates=[raw,normalized??``].map(value=>value.trim()).filter(Boolean);for(let candidate of candidates){if(/^(signal:)?(group:|username:|u:)/i.test(candidate))return!0;if(/^(signal:)?uuid:/i.test(candidate)){let stripped=candidate.replace(/^signal:/i,``).replace(/^uuid:/i,``).trim();if(!stripped)continue;if(UUID_PATTERN.test(stripped)||UUID_COMPACT_PATTERN.test(stripped))return!0;continue}let withoutSignalPrefix=candidate.replace(/^signal:/i,``).trim();if(UUID_PATTERN.test(withoutSignalPrefix)||UUID_COMPACT_PATTERN.test(withoutSignalPrefix)||/^\+?\d{3,}$/.test(withoutSignalPrefix))return!0}return!1}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 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}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 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 resolveAgentMainSessionKey(params){let mainKey=normalizeMainKey(params.cfg?.session?.mainKey);return buildAgentMainSessionKey({agentId:params.agentId,mainKey})}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 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_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 acquireSessionWriteLock(params){registerCleanupHandlers();let timeoutMs=resolvePositiveMs(params.timeoutMs,1e4,{allowInfinity:!0}),staleMs=resolvePositiveMs(params.staleMs,18e5),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];const INPUT_PROVENANCE_KIND_VALUES=[`external_user`,`inter_session`,`internal_system`];function normalizeOptionalString(value){return typeof value==`string`&&value.trim()||void 0}function isInputProvenanceKind(value){return typeof value==`string`&&INPUT_PROVENANCE_KIND_VALUES.includes(value)}function normalizeInputProvenance(value){if(!value||typeof value!=`object`)return;let record=value;if(isInputProvenanceKind(record.kind))return{kind:record.kind,sourceSessionKey:normalizeOptionalString(record.sourceSessionKey),sourceChannel:normalizeOptionalString(record.sourceChannel),sourceTool:normalizeOptionalString(record.sourceTool)}}function applyInputProvenanceToUserMessage(message,inputProvenance){return!inputProvenance||message.role!==`user`||normalizeInputProvenance(message.provenance)?message:{...message,provenance:inputProvenance}}function isInterSessionInputProvenance(value){return normalizeInputProvenance(value)?.kind===`inter_session`}function hasInterSessionUserProvenance(message){return!message||message.role!==`user`?!1:isInterSessionInputProvenance(message.provenance)}const TOOL_CALL_TYPES$1=new Set([`tool_use`,`toolcall`,`tool_call`]),TOOL_RESULT_TYPES=new Set([`tool_result`,`tool_result_error`]),normalizeType=value=>typeof value==`string`?value.trim().toLowerCase():``,extractToolCallNames=message=>{let names=new Set,toolNameRaw=message.toolName??message.tool_name;typeof toolNameRaw==`string`&&toolNameRaw.trim()&&names.add(toolNameRaw.trim());let content=message.content;if(!Array.isArray(content))return Array.from(names);for(let entry of content){if(!entry||typeof entry!=`object`)continue;let block=entry,type=normalizeType(block.type);if(!TOOL_CALL_TYPES$1.has(type))continue;let name=block.name;typeof name==`string`&&name.trim()&&names.add(name.trim())}return Array.from(names)},countToolResults=message=>{let content=message.content;if(!Array.isArray(content))return{total:0,errors:0};let total=0,errors=0;for(let entry of content){if(!entry||typeof entry!=`object`)continue;let block=entry,type=normalizeType(block.type);TOOL_RESULT_TYPES.has(type)&&(total+=1,block.is_error===!0&&(errors+=1))}return{total,errors}};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 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$1=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$1.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$1.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$1.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$1.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$1.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 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$1(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$1({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}}function isTruthy(value){return value==null?!1:typeof value==`boolean`?value:typeof value==`number`?value!==0:typeof value==`string`?value.trim().length>0:!0}function resolveConfigPath(config,pathStr){let parts=pathStr.split(`.`).filter(Boolean),current=config;for(let part of parts){if(typeof current!=`object`||!current)return;current=current[part]}return current}function isConfigPathTruthyWithDefaults(config,pathStr,defaults){let value=resolveConfigPath(config,pathStr);return value===void 0&&pathStr in defaults?defaults[pathStr]??!1:isTruthy(value)}function evaluateRuntimeRequires(params){let requires=params.requires;if(!requires)return!0;let requiredBins=requires.bins??[];if(requiredBins.length>0){for(let bin of requiredBins)if(!params.hasBin(bin)&&!params.hasRemoteBin?.(bin))return!1}let requiredAnyBins=requires.anyBins??[];if(requiredAnyBins.length>0&&!requiredAnyBins.some(bin=>params.hasBin(bin))&&!params.hasAnyRemoteBin?.(requiredAnyBins))return!1;let requiredEnv=requires.env??[];if(requiredEnv.length>0){for(let envName of requiredEnv)if(!params.hasEnv(envName))return!1}let requiredConfig=requires.config??[];if(requiredConfig.length>0){for(let configPath of requiredConfig)if(!params.isConfigPathTruthy(configPath))return!1}return!0}function resolveRuntimePlatform(){return process.platform}function windowsPathExtensions(){let raw=process.env.PATHEXT;return[``,...(raw===void 0?[`.EXE`,`.CMD`,`.BAT`,`.COM`]:raw.split(`;`).map(v=>v.trim())).filter(Boolean)]}let cachedHasBinaryPath,cachedHasBinaryPathExt;const hasBinaryCache=new Map;function hasBinary$1(bin){let pathEnv=process.env.PATH??``,pathExt=process.platform===`win32`?process.env.PATHEXT??``:``;if((cachedHasBinaryPath!==pathEnv||cachedHasBinaryPathExt!==pathExt)&&(cachedHasBinaryPath=pathEnv,cachedHasBinaryPathExt=pathExt,hasBinaryCache.clear()),hasBinaryCache.has(bin))return hasBinaryCache.get(bin);let parts=pathEnv.split(path.delimiter).filter(Boolean),extensions=process.platform===`win32`?windowsPathExtensions():[``];for(let part of parts)for(let ext of extensions){let candidate=path.join(part,bin+ext);try{return fs.accessSync(candidate,fs.constants.X_OK),hasBinaryCache.set(bin,!0),!0}catch{}}return hasBinaryCache.set(bin,!1),!1}function stripQuotes(value){return value.startsWith(`"`)&&value.endsWith(`"`)||value.startsWith(`'`)&&value.endsWith(`'`)?value.slice(1,-1):value}function coerceFrontmatterValue(value){if(value!=null){if(typeof value==`string`)return value.trim();if(typeof value==`number`||typeof value==`boolean`)return String(value);if(typeof value==`object`)try{return JSON.stringify(value)}catch{return}}}function parseYamlFrontmatter(block){try{let parsed=YAML.parse(block);if(!parsed||typeof parsed!=`object`||Array.isArray(parsed))return null;let result={};for(let[rawKey,value]of Object.entries(parsed)){let key=rawKey.trim();if(!key)continue;let coerced=coerceFrontmatterValue(value);coerced!==void 0&&(result[key]=coerced)}return result}catch{return null}}function extractMultiLineValue(lines,startIndex){let match=lines[startIndex].match(/^([\w-]+):\s*(.*)$/);if(!match)return{value:``,linesConsumed:1};let inlineValue=match[2].trim();if(inlineValue)return{value:inlineValue,linesConsumed:1};let valueLines=[],i=startIndex+1;for(;i<lines.length;){let line=lines[i];if(line.length>0&&!line.startsWith(` `)&&!line.startsWith(` `))break;valueLines.push(line),i++}return{value:valueLines.join(`
|
|
2
2
|
`).trim(),linesConsumed:i-startIndex}}function parseLineFrontmatter(block){let frontmatter={},lines=block.split(`
|
|
3
3
|
`),i=0;for(;i<lines.length;){let match=lines[i].match(/^([\w-]+):\s*(.*)$/);if(!match){i++;continue}let key=match[1],inlineValue=match[2].trim();if(!key){i++;continue}if(!inlineValue&&i+1<lines.length){let nextLine=lines[i+1];if(nextLine.startsWith(` `)||nextLine.startsWith(` `)){let{value,linesConsumed}=extractMultiLineValue(lines,i);value&&(frontmatter[key]=value),i+=linesConsumed;continue}}let value=stripQuotes(inlineValue);value&&(frontmatter[key]=value),i++}return frontmatter}function parseFrontmatterBlock(content){let normalized=content.replace(/\r\n/g,`
|
|
4
4
|
`).replace(/\r/g,`
|