@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"./paths-5FcIFMsj.js";import{G as getResolvedLoggerSettings,b as resolveUserPath,g as pathExists}from"./utils-DbaBVFaK.js";import"./embedded-helpers-BrfnCpCe.js";import"./reply-BsRbeUhd.js";import"./session-key-EoB0qaG9.js";import"./builderforce-root-D64_sXEi.js";import"./subsystem-B3TqcCrZ.js";import"./registry-TdK-aV05.js";import{t as restoreTerminalState}from"./restore-gPan2ZAn.js";import{i as logWarn}from"./logger-Bch0bx9c.js";import"./exec-DdcIjeyn.js";import{A as resolveWorkspaceFilePath,h as DEFAULT_BOOTSTRAP_FILENAME}from"./agent-scope-DPtjOxzp.js";import"./model-selection-DX_WOc2P.js";import{r as resolveCliName,t as formatCliCommand}from"./command-format-Dd7BgZsg.js";import"./env-file-BI2jpOmF.js";import"./boolean-Cn4K2fc9.js";import"./env-BHP32i7Q.js";import"./io-YzT_09GD.js";import"./manifest-registry-BVDm_CP0.js";import"./config-8x9ZIdfF.js";import"./runner-CfNJMPWu.js";import"./model-catalog-C7PdRY6w.js";import"./sandbox-DzuXOMNa.js";import"./chrome-Dk-WNIhp.js";import"./tailscale-B-VKIlWm.js";import"./auth-CDcrUXYB.js";import"./server-context-DsuST81W.js";import"./frontmatter-DyJ2unbL.js";import"./skills-B4r9m770.js";import"./plugin-skills-C39wi4uD.js";import"./routes-DoGqdgOP.js";import"./redact-C3oo7_aY.js";import"./errors-CjmtpPBP.js";import"./paths-C1QKdGJX.js";import"./ssrf-4MnoQ7Sz.js";import"./image-ops-CONrkLJK.js";import"./store-BoTKCB2d.js";import"./ports-BNC_iRpw.js";import"./trash-Czxs8cUf.js";import"./sessions-OZNhnSwZ.js";import"./message-channel-DrfCCUg4.js";import"./plugins-COtQnUML.js";import"./accounts-CTKk3xPO.js";import"./accounts-DFqpWzeU.js";import"./accounts-CbQihLRU.js";import"./bindings-DMDv84HS.js";import"./send-Dmzp1gNF.js";import"./send-DEgD1Cfd.js";import"./paths-CkcK939O.js";import"./src-DxNC0IHE.js";import"./tool-images-DsKy1uNN.js";import"./tool-display-TRKLY-yH.js";import"./fetch-guard-BQuCLA1C.js";import"./api-key-rotation-ChHXb1Pq.js";import"./fetch-CDeJQlzN.js";import"./sqlite-DEiKj1vi.js";import"./tokens-Ct4DyfhX.js";import"./project-context-store-C8TROXjr.js";import"./with-timeout-YbYylXgf.js";import"./deliver-C5lVQcrs.js";import"./send-DlPwTVpG.js";import"./workspace-ChbaDWgp.js";import"./reply-prefix-BwtP84WV.js";import"./memory-cli-DWEtZrJ5.js";import"./manager-VPNjVm0W.js";import"./retry-Jis-ZZfm.js";import"./client-DhlZRznX.js";import"./call-DwWslKWv.js";import"./common-NHQnma5l.js";import"./chunk-h7FZEwW2.js";import"./markdown-tables-DOq8FfUr.js";import"./ir-AM9J0QtO.js";import"./render-CSLaFZoy.js";import"./builderforcellm-syscheck-DMjMJNFI.js";import"./send-DglIOKdS.js";import"./outbound-attachment-TWzrIR9Q.js";import"./fetch-B6_hd7w9.js";import"./delivery-queue-BZWZDdpJ.js";import"./channel-activity-qRD5c3VV.js";import"./tables-DirB1oU7.js";import"./pairing-store-DIpKOfDK.js";import"./links-CYRGsVCu.js";import"./cli-utils-BLNnV_WG.js";import"./help-format-NhTn4dWd.js";import"./progress-OKwbfa23.js";import"./resolve-route-BvfmiLqC.js";import"./replies-BoxyKuBS.js";import"./refresh-DgTiir08.js";import"./coding-tools.policy-BJQuylwM.js";import"./send-BgdpJymE.js";import{b as waitForGatewayReachable,d as openUrl,g as resolveControlUiLinks,i as detectBrowserOpenSupport,o as formatControlUiSshHint,p as probeGatewayReachable}from"./onboard-helpers-CPmBeDvt.js";import"./prompt-style-BwwmGo3-.js";import"./pairing-labels-CELZqNBC.js";import"./session-cost-usage-pgxrRRW4.js";import"./provider-usage-CbH7sm73.js";import"./active-listener-DBdxNyOd.js";import"./exec-approvals-kmxxyvIe.js";import"./nodes-screen-BWDONgPE.js";import"./project-context-Cnqfr64Z.js";import"./control-service-BhSaBRxC.js";import"./stagger-NaB6u1z1.js";import"./channel-selection-CQ5MM7Hi.js";import"./mamba-state-engine-Ck2JCfL6.js";import"./transformers-stream-QS2dnQob.js";import"./runtime-guard-BiPTd1ED.js";import"./program-context-B9V62ZJg.js";import"./note-CvzMolLy.js";import"./helpers-_XD3UAOf.js";import{n as installCompletion}from"./completion-cli-D8WkqtSU.js";import{a as gatewayInstallErrorHint,i as buildGatewayInstallPlan,n as GATEWAY_DAEMON_RUNTIME_OPTIONS,t as DEFAULT_GATEWAY_DAEMON_RUNTIME}from"./daemon-runtime-CHo7loUb.js";import{r as isSystemdUserServiceAvailable}from"./systemd-CTHIdkg9.js";import{t as resolveGatewayService}from"./service-BXrSjb3e.js";import{r as healthCommand}from"./health-B_qWRpsT.js";import{t as ensureControlUiAssetsBuilt}from"./control-ui-assets-CAmSpVpE.js";import"./builderforce-directory-sync-BCZK4FYJ.js";import"./shared-eZqGzEHT.js";import"./model-picker-CjrWGzFG.js";import"./auth-choice.apply.transformers-D1EzC906.js";import{t as formatHealthCheckFailure}from"./health-format-COHxl9I_.js";import{r as ensureCompletionCacheExists,t as checkShellCompletionStatus}from"./doctor-completion-s5vcMc-C.js";import{t as runTui}from"./tui-lng2vIp3.js";import"./tui-stream-assembler-Bn1WXUGG.js";import os from"node:os";import path from"node:path";import fs from"node:fs/promises";async function resolveProfileHint(shell){let home=process.env.HOME||os.homedir();return shell===`zsh`?`~/.zshrc`:shell===`bash`?await pathExists(path.join(home,`.bashrc`))?`~/.bashrc`:`~/.bash_profile`:shell===`fish`?`~/.config/fish/config.fish`:`$PROFILE`}function formatReloadHint(shell,profileHint){return shell===`powershell`?`Restart your shell (or reload your PowerShell profile).`:`Restart your shell or run: source ${profileHint}`}async function setupOnboardingShellCompletion(params){let deps={resolveCliName,checkShellCompletionStatus,ensureCompletionCacheExists,installCompletion,...params.deps},cliName=deps.resolveCliName(),completionStatus=await deps.checkShellCompletionStatus(cliName);if(completionStatus.usesSlowPattern){await deps.ensureCompletionCacheExists(cliName)&&await deps.installCompletion(completionStatus.shell,!0,cliName);return}if(completionStatus.profileInstalled&&!completionStatus.cacheExists){await deps.ensureCompletionCacheExists(cliName);return}if(!completionStatus.profileInstalled){if(!(params.flow===`quickstart`||await params.prompter.confirm({message:`Enable ${completionStatus.shell} shell completion for ${cliName}?`,initialValue:!0})))return;if(!await deps.ensureCompletionCacheExists(cliName)){await params.prompter.note(`Failed to generate completion cache. Run \`${cliName} completion --install\` later.`,`Shell completion`);return}await deps.installCompletion(completionStatus.shell,!0,cliName);let profileHint=await resolveProfileHint(completionStatus.shell);await params.prompter.note(`Shell completion installed. ${formatReloadHint(completionStatus.shell,profileHint)}`,`Shell completion`)}}async function finalizeOnboardingWizard(options){let{flow,opts,baseConfig,nextConfig,settings,prompter,runtime}=options,withWizardProgress=async(label,options,work)=>{let progress=prompter.progress(label);try{return await work(progress)}finally{progress.stop(options.doneMessage)}},systemdAvailable=process.platform===`linux`?await isSystemdUserServiceAvailable():!0;if(process.platform===`linux`&&!systemdAvailable&&await prompter.note(`Systemd user services are unavailable. Skipping lingering checks and service install.`,`Systemd`),process.platform===`linux`&&systemdAvailable){let{ensureSystemdUserLingerInteractive}=await import(`./systemd-linger-etEP-eYK.js`);await ensureSystemdUserLingerInteractive({runtime,prompter:{confirm:prompter.confirm,note:prompter.note},reason:`Linux installs use a systemd user service by default. Without lingering, systemd stops the user session on logout/idle and kills the Gateway.`,requireConfirm:!1})}let explicitInstallDaemon=typeof opts.installDaemon==`boolean`?opts.installDaemon:void 0,installDaemon;if(installDaemon=explicitInstallDaemon===void 0?process.platform===`linux`&&!systemdAvailable?!1:flow===`quickstart`?!0:await prompter.confirm({message:`Install Gateway service (recommended)`,initialValue:!0}):explicitInstallDaemon,process.platform===`linux`&&!systemdAvailable&&installDaemon&&(await prompter.note("Systemd user services are unavailable; skipping service install. Use your container supervisor or `docker compose up -d`.",`Gateway service`),installDaemon=!1),installDaemon){let daemonRuntime=flow===`quickstart`?DEFAULT_GATEWAY_DAEMON_RUNTIME:await prompter.select({message:`Gateway service runtime`,options:GATEWAY_DAEMON_RUNTIME_OPTIONS,initialValue:opts.daemonRuntime??DEFAULT_GATEWAY_DAEMON_RUNTIME});flow===`quickstart`&&await prompter.note(`QuickStart uses Node for the Gateway service (stable + supported).`,`Gateway service runtime`);let service=resolveGatewayService(),loaded=await service.isLoaded({env:process.env});if(loaded){let action=await prompter.select({message:`Gateway service already installed`,options:[{value:`restart`,label:`Restart`},{value:`reinstall`,label:`Reinstall`},{value:`skip`,label:`Skip`}]});action===`restart`?await withWizardProgress(`Gateway service`,{doneMessage:`Gateway service restarted.`},async progress=>{progress.update(`Restarting Gateway service…`),await service.restart({env:process.env,stdout:process.stdout})}):action===`reinstall`&&await withWizardProgress(`Gateway service`,{doneMessage:`Gateway service uninstalled.`},async progress=>{progress.update(`Uninstalling Gateway service…`),await service.uninstall({env:process.env,stdout:process.stdout})})}if(!loaded||loaded&&!await service.isLoaded({env:process.env})){let progress=prompter.progress(`Gateway service`),installError=null;try{progress.update(`Preparing Gateway service…`);let{programArguments,workingDirectory,environment}=await buildGatewayInstallPlan({env:process.env,port:settings.port,token:settings.gatewayToken,runtime:daemonRuntime,warn:(message,title)=>prompter.note(message,title),config:nextConfig});progress.update(`Installing Gateway service…`),await service.install({env:process.env,stdout:process.stdout,programArguments,workingDirectory,environment})}catch(err){installError=err instanceof Error?err.message:String(err)}finally{progress.stop(installError?`Gateway service install failed.`:`Gateway service installed.`)}installError&&(await prompter.note(`Gateway service install failed: ${installError}`,`Gateway`),await prompter.note(gatewayInstallErrorHint(),`Gateway`))}}if(!opts.skipHealth){await waitForGatewayReachable({url:resolveControlUiLinks({bind:nextConfig.gateway?.bind??`loopback`,port:settings.port,customBindHost:nextConfig.gateway?.customBindHost,basePath:void 0}).wsUrl,token:settings.gatewayToken,deadlineMs:15e3});try{await healthCommand({json:!1,timeoutMs:1e4},runtime)}catch(err){let msg=formatHealthCheckFailure(err);runtime.error(msg),logWarn(`[onboarding] health check failed: ${String(err)}`);let logFile=getResolvedLoggerSettings().file;await prompter.note([`Logs:`,logFile,`View: ${formatCliCommand(`builderforce logs --follow`)}`,``,`Docs:`,`https://docs.builderforce.ai/gateway/health`,`https://docs.builderforce.ai/gateway/troubleshooting`].join(`
|
|
1
|
+
import"./paths-5FcIFMsj.js";import{G as getResolvedLoggerSettings,b as resolveUserPath,g as pathExists}from"./utils-DbaBVFaK.js";import"./embedded-helpers-3FEGD_4b.js";import"./reply-CpGH-3If.js";import"./session-key-EoB0qaG9.js";import"./builderforce-root-D64_sXEi.js";import"./subsystem-B3TqcCrZ.js";import"./registry-TdK-aV05.js";import{t as restoreTerminalState}from"./restore-gPan2ZAn.js";import{i as logWarn}from"./logger-Bch0bx9c.js";import"./exec-DdcIjeyn.js";import{A as resolveWorkspaceFilePath,h as DEFAULT_BOOTSTRAP_FILENAME}from"./agent-scope-DPtjOxzp.js";import"./model-selection-DX_WOc2P.js";import{r as resolveCliName,t as formatCliCommand}from"./command-format-Dd7BgZsg.js";import"./env-file-BI2jpOmF.js";import"./boolean-Cn4K2fc9.js";import"./env-BHP32i7Q.js";import"./io-YzT_09GD.js";import"./manifest-registry-BVDm_CP0.js";import"./config-8x9ZIdfF.js";import"./runner-C651oVfk.js";import"./model-catalog-C7PdRY6w.js";import"./sandbox-DzuXOMNa.js";import"./chrome-Dk-WNIhp.js";import"./tailscale-B-VKIlWm.js";import"./auth-CDcrUXYB.js";import"./server-context-DsuST81W.js";import"./frontmatter-DyJ2unbL.js";import"./skills-B4r9m770.js";import"./plugin-skills-C39wi4uD.js";import"./routes-DoGqdgOP.js";import"./redact-C3oo7_aY.js";import"./errors-CjmtpPBP.js";import"./paths-C1QKdGJX.js";import"./ssrf-4MnoQ7Sz.js";import"./image-ops-CONrkLJK.js";import"./store-BoTKCB2d.js";import"./ports-BNC_iRpw.js";import"./trash-Czxs8cUf.js";import"./sessions-OZNhnSwZ.js";import"./message-channel-DrfCCUg4.js";import"./plugins-COtQnUML.js";import"./accounts-CTKk3xPO.js";import"./accounts-DFqpWzeU.js";import"./accounts-CbQihLRU.js";import"./bindings-DMDv84HS.js";import"./send-Dmzp1gNF.js";import"./send-DEgD1Cfd.js";import"./paths-CkcK939O.js";import"./src-D2-7sOAX.js";import"./tool-images-DsKy1uNN.js";import"./tool-display-TRKLY-yH.js";import"./fetch-guard-BQuCLA1C.js";import"./api-key-rotation-ChHXb1Pq.js";import"./fetch-CDeJQlzN.js";import"./sqlite-DEiKj1vi.js";import"./tokens-Ct4DyfhX.js";import"./project-context-store-BS994lZX.js";import"./with-timeout-YbYylXgf.js";import"./deliver-XGIFv80r.js";import"./send-DlPwTVpG.js";import"./workspace-ChbaDWgp.js";import"./reply-prefix-BwtP84WV.js";import"./memory-cli-DWEtZrJ5.js";import"./manager-VPNjVm0W.js";import"./retry-Jis-ZZfm.js";import"./client-DhlZRznX.js";import"./call-DwWslKWv.js";import"./common-NHQnma5l.js";import"./chunk-h7FZEwW2.js";import"./markdown-tables-DOq8FfUr.js";import"./ir-AM9J0QtO.js";import"./render-CSLaFZoy.js";import"./builderforcellm-syscheck-DGZKIwPC.js";import"./send-DglIOKdS.js";import"./outbound-attachment-TWzrIR9Q.js";import"./fetch-B6_hd7w9.js";import"./delivery-queue-BZWZDdpJ.js";import"./channel-activity-qRD5c3VV.js";import"./tables-DirB1oU7.js";import"./pairing-store-DIpKOfDK.js";import"./links-CYRGsVCu.js";import"./cli-utils-BLNnV_WG.js";import"./help-format-NhTn4dWd.js";import"./progress-OKwbfa23.js";import"./resolve-route-BvfmiLqC.js";import"./replies-BoxyKuBS.js";import"./refresh-DgTiir08.js";import"./coding-tools.policy-BJQuylwM.js";import"./send-BgdpJymE.js";import{b as waitForGatewayReachable,d as openUrl,g as resolveControlUiLinks,i as detectBrowserOpenSupport,o as formatControlUiSshHint,p as probeGatewayReachable}from"./onboard-helpers-CPmBeDvt.js";import"./prompt-style-BwwmGo3-.js";import"./pairing-labels-CELZqNBC.js";import"./session-cost-usage-pgxrRRW4.js";import"./provider-usage-CbH7sm73.js";import"./active-listener-DBdxNyOd.js";import"./exec-approvals-kmxxyvIe.js";import"./nodes-screen-BWDONgPE.js";import"./project-context-Cg0S9eFT.js";import"./control-service-BhSaBRxC.js";import"./stagger-NaB6u1z1.js";import"./channel-selection-CQ5MM7Hi.js";import"./mamba-state-engine-BloJzrxU.js";import"./transformers-stream-QS2dnQob.js";import"./runtime-guard-BiPTd1ED.js";import"./program-context-DBtTOKkf.js";import"./note-CvzMolLy.js";import"./helpers-_XD3UAOf.js";import{n as installCompletion}from"./completion-cli-ydxyAE7J.js";import{a as gatewayInstallErrorHint,i as buildGatewayInstallPlan,n as GATEWAY_DAEMON_RUNTIME_OPTIONS,t as DEFAULT_GATEWAY_DAEMON_RUNTIME}from"./daemon-runtime-CHo7loUb.js";import{r as isSystemdUserServiceAvailable}from"./systemd-CTHIdkg9.js";import{t as resolveGatewayService}from"./service-BXrSjb3e.js";import{r as healthCommand}from"./health-Cuh0tZl2.js";import{t as ensureControlUiAssetsBuilt}from"./control-ui-assets-CAmSpVpE.js";import"./builderforce-directory-sync-CFiQew6N.js";import"./shared-eZqGzEHT.js";import"./model-picker-CjrWGzFG.js";import"./auth-choice.apply.transformers-DXBWOilg.js";import{t as formatHealthCheckFailure}from"./health-format-COHxl9I_.js";import{r as ensureCompletionCacheExists,t as checkShellCompletionStatus}from"./doctor-completion-DhIR9uqB.js";import{t as runTui}from"./tui-DgBGTw2s.js";import"./tui-stream-assembler-xFcJqFJ9.js";import os from"node:os";import path from"node:path";import fs from"node:fs/promises";async function resolveProfileHint(shell){let home=process.env.HOME||os.homedir();return shell===`zsh`?`~/.zshrc`:shell===`bash`?await pathExists(path.join(home,`.bashrc`))?`~/.bashrc`:`~/.bash_profile`:shell===`fish`?`~/.config/fish/config.fish`:`$PROFILE`}function formatReloadHint(shell,profileHint){return shell===`powershell`?`Restart your shell (or reload your PowerShell profile).`:`Restart your shell or run: source ${profileHint}`}async function setupOnboardingShellCompletion(params){let deps={resolveCliName,checkShellCompletionStatus,ensureCompletionCacheExists,installCompletion,...params.deps},cliName=deps.resolveCliName(),completionStatus=await deps.checkShellCompletionStatus(cliName);if(completionStatus.usesSlowPattern){await deps.ensureCompletionCacheExists(cliName)&&await deps.installCompletion(completionStatus.shell,!0,cliName);return}if(completionStatus.profileInstalled&&!completionStatus.cacheExists){await deps.ensureCompletionCacheExists(cliName);return}if(!completionStatus.profileInstalled){if(!(params.flow===`quickstart`||await params.prompter.confirm({message:`Enable ${completionStatus.shell} shell completion for ${cliName}?`,initialValue:!0})))return;if(!await deps.ensureCompletionCacheExists(cliName)){await params.prompter.note(`Failed to generate completion cache. Run \`${cliName} completion --install\` later.`,`Shell completion`);return}await deps.installCompletion(completionStatus.shell,!0,cliName);let profileHint=await resolveProfileHint(completionStatus.shell);await params.prompter.note(`Shell completion installed. ${formatReloadHint(completionStatus.shell,profileHint)}`,`Shell completion`)}}async function finalizeOnboardingWizard(options){let{flow,opts,baseConfig,nextConfig,settings,prompter,runtime}=options,withWizardProgress=async(label,options,work)=>{let progress=prompter.progress(label);try{return await work(progress)}finally{progress.stop(options.doneMessage)}},systemdAvailable=process.platform===`linux`?await isSystemdUserServiceAvailable():!0;if(process.platform===`linux`&&!systemdAvailable&&await prompter.note(`Systemd user services are unavailable. Skipping lingering checks and service install.`,`Systemd`),process.platform===`linux`&&systemdAvailable){let{ensureSystemdUserLingerInteractive}=await import(`./systemd-linger-etEP-eYK.js`);await ensureSystemdUserLingerInteractive({runtime,prompter:{confirm:prompter.confirm,note:prompter.note},reason:`Linux installs use a systemd user service by default. Without lingering, systemd stops the user session on logout/idle and kills the Gateway.`,requireConfirm:!1})}let explicitInstallDaemon=typeof opts.installDaemon==`boolean`?opts.installDaemon:void 0,installDaemon;if(installDaemon=explicitInstallDaemon===void 0?process.platform===`linux`&&!systemdAvailable?!1:flow===`quickstart`?!0:await prompter.confirm({message:`Install Gateway service (recommended)`,initialValue:!0}):explicitInstallDaemon,process.platform===`linux`&&!systemdAvailable&&installDaemon&&(await prompter.note("Systemd user services are unavailable; skipping service install. Use your container supervisor or `docker compose up -d`.",`Gateway service`),installDaemon=!1),installDaemon){let daemonRuntime=flow===`quickstart`?DEFAULT_GATEWAY_DAEMON_RUNTIME:await prompter.select({message:`Gateway service runtime`,options:GATEWAY_DAEMON_RUNTIME_OPTIONS,initialValue:opts.daemonRuntime??DEFAULT_GATEWAY_DAEMON_RUNTIME});flow===`quickstart`&&await prompter.note(`QuickStart uses Node for the Gateway service (stable + supported).`,`Gateway service runtime`);let service=resolveGatewayService(),loaded=await service.isLoaded({env:process.env});if(loaded){let action=await prompter.select({message:`Gateway service already installed`,options:[{value:`restart`,label:`Restart`},{value:`reinstall`,label:`Reinstall`},{value:`skip`,label:`Skip`}]});action===`restart`?await withWizardProgress(`Gateway service`,{doneMessage:`Gateway service restarted.`},async progress=>{progress.update(`Restarting Gateway service…`),await service.restart({env:process.env,stdout:process.stdout})}):action===`reinstall`&&await withWizardProgress(`Gateway service`,{doneMessage:`Gateway service uninstalled.`},async progress=>{progress.update(`Uninstalling Gateway service…`),await service.uninstall({env:process.env,stdout:process.stdout})})}if(!loaded||loaded&&!await service.isLoaded({env:process.env})){let progress=prompter.progress(`Gateway service`),installError=null;try{progress.update(`Preparing Gateway service…`);let{programArguments,workingDirectory,environment}=await buildGatewayInstallPlan({env:process.env,port:settings.port,token:settings.gatewayToken,runtime:daemonRuntime,warn:(message,title)=>prompter.note(message,title),config:nextConfig});progress.update(`Installing Gateway service…`),await service.install({env:process.env,stdout:process.stdout,programArguments,workingDirectory,environment})}catch(err){installError=err instanceof Error?err.message:String(err)}finally{progress.stop(installError?`Gateway service install failed.`:`Gateway service installed.`)}installError&&(await prompter.note(`Gateway service install failed: ${installError}`,`Gateway`),await prompter.note(gatewayInstallErrorHint(),`Gateway`))}}if(!opts.skipHealth){await waitForGatewayReachable({url:resolveControlUiLinks({bind:nextConfig.gateway?.bind??`loopback`,port:settings.port,customBindHost:nextConfig.gateway?.customBindHost,basePath:void 0}).wsUrl,token:settings.gatewayToken,deadlineMs:15e3});try{await healthCommand({json:!1,timeoutMs:1e4},runtime)}catch(err){let msg=formatHealthCheckFailure(err);runtime.error(msg),logWarn(`[onboarding] health check failed: ${String(err)}`);let logFile=getResolvedLoggerSettings().file;await prompter.note([`Logs:`,logFile,`View: ${formatCliCommand(`builderforce logs --follow`)}`,``,`Docs:`,`https://docs.builderforce.ai/gateway/health`,`https://docs.builderforce.ai/gateway/troubleshooting`].join(`
|
|
2
2
|
`),`Health check help`)}}let controlUiEnabled=nextConfig.gateway?.controlUi?.enabled??baseConfig.gateway?.controlUi?.enabled??!0;if(!opts.skipUi&&controlUiEnabled){let controlUiAssets=await ensureControlUiAssetsBuilt(runtime);!controlUiAssets.ok&&controlUiAssets.message&&runtime.error(controlUiAssets.message)}await prompter.note([`Add nodes for extra features:`,`- macOS app (system + notifications)`,`- iOS app (camera/canvas)`,`- Android app (camera/canvas)`].join(`
|
|
3
3
|
`),`Optional apps`);let controlUiBasePath=nextConfig.gateway?.controlUi?.basePath??baseConfig.gateway?.controlUi?.basePath,links=resolveControlUiLinks({bind:settings.bind,port:settings.port,customBindHost:settings.customBindHost,basePath:controlUiBasePath}),authedUrl=settings.authMode===`token`&&settings.gatewayToken?`${links.httpUrl}#token=${encodeURIComponent(settings.gatewayToken)}`:links.httpUrl,gatewayProbe=await probeGatewayReachable({url:links.wsUrl,token:settings.authMode===`token`?settings.gatewayToken:void 0,password:settings.authMode===`password`?nextConfig.gateway?.auth?.password:``}),gatewayStatusLine=gatewayProbe.ok?`Gateway: reachable`:`Gateway: not detected${gatewayProbe.detail?` (${gatewayProbe.detail})`:``}`,bootstrapPath=resolveWorkspaceFilePath(resolveUserPath(options.workspaceDir),DEFAULT_BOOTSTRAP_FILENAME),hasBootstrap=await fs.access(bootstrapPath).then(()=>!0).catch(()=>!1);await prompter.note([`Web UI: ${links.httpUrl}`,settings.authMode===`token`&&settings.gatewayToken?`Web UI (with token): ${authedUrl}`:void 0,`Gateway WS: ${links.wsUrl}`,gatewayStatusLine,`Docs: https://docs.builderforce.ai/web/control-ui`].filter(Boolean).join(`
|
|
4
4
|
`),`Control UI`);let controlUiOpened=!1,controlUiOpenHint,hatchChoice=null,launchedTui=!1;!opts.skipUi&&gatewayProbe.ok?(hasBootstrap&&await prompter.note([`This is the defining action that makes your agent you.`,`Please take your time.`,`The more you tell it, the better the experience will be.`,`We will send: "Wake up, my friend!"`].join(`
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import"./paths-BHg-VHB4.js";import"./registry-Cv7CoWAs.js";import{W as getResolvedLoggerSettings,h as pathExists,y as resolveUserPath}from"./utils-BP60e80M.js";import{t as restoreTerminalState}from"./restore-BdB4wlsZ.js";import"./subsystem-C4b1Von0.js";import"./boolean-ssGoaBPk.js";import"./env-BoE8QSib.js";import"./warning-filter-nSTjpMIH.js";import"./auth-profiles-BARnVAUE.js";import{r as resolveCliName,t as formatCliCommand}from"./command-format-DTMaGKs7.js";import{i as logWarn}from"./logger-AbH8mdkv.js";import"./session-key-D--2AEus.js";import"./builderforce-root-D3-p8W2n.js";import"./exec-CGuYALEs.js";import{A as resolveWorkspaceFilePath,h as DEFAULT_BOOTSTRAP_FILENAME}from"./agent-scope-BcoQBOwz.js";import"./env-file-BIKVpYUN.js";import"./io-BySzqKzT.js";import"./manifest-registry-DtqFvEIR.js";import"./config-Bwt58P9r.js";import"./model-discovery-DxpimsRF.js";import"./model-catalog-wcISK04b.js";import"./frontmatter-DgRc5y_l.js";import"./skills-W00EPvKR.js";import"./plugin-skills-BSUncenp.js";import"./refresh-bgGvF0aF.js";import"./client-DeQ0LbP9.js";import"./call-CjC3SRPv.js";import"./message-channel-C-yw5fZm.js";import"./subagent-registry-oB_F2U2W.js";import"./sessions-ko0LxxGk.js";import"./src-BRo9ywDM.js";import"./project-context-store-ClFt-YDL.js";import"./tokens-BNwTTeJb.js";import"./plugins-DJGW_fnS.js";import"./accounts-Z5bJpNrG.js";import"./bindings-D0uket3l.js";import"./send-gG3CFJwv.js";import"./send-DqJCViFb.js";import"./with-timeout-By0c7Ur9.js";import"./deliver-Bs-FVPQ4.js";import"./accounts-DoJYLMfS.js";import"./send-mCN63Hkn.js";import"./image-ops-Bg9yFwjX.js";import"./redact-bWj_-q3j.js";import"./errors-t5wHPcwh.js";import"./embedded-helpers-Q5h1lA6D.js";import"./sandbox-BcH7kS1y.js";import"./chrome-IJYO1tSE.js";import"./tailscale-CgCG7AVQ.js";import"./auth-B4Kn3eee.js";import"./server-context-D3iiIzvV.js";import"./routes-7QTsp3sA.js";import"./paths-GamzES41.js";import"./ssrf-BiSQzdcA.js";import"./store-C5LmVaEC.js";import"./ports-LqFTyTSK.js";import"./trash-zs6gNxed.js";import"./accounts-BT-NzzBc.js";import"./paths-BQ9W7Bs0.js";import"./tool-images-DV2HMmx4.js";import"./workspace-Cz9mCy0P.js";import"./reply-prefix-9hmbzubX.js";import"./sqlite-BEgCClMz.js";import"./memory-cli-COgt0ROi.js";import"./manager-Cob4Ofzr.js";import"./gemini-auth-BZgBIY0M.js";import"./retry-Cc6xusE8.js";import"./common-BRdxH-uH.js";import"./runner-68-X3KHf.js";import"./tool-display-BIswnHaq.js";import"./chunk-UPhdkZNp.js";import"./markdown-tables-CpqWBduK.js";import"./fetch-guard-CoGEds8D.js";import"./fetch-CUsKv8oj.js";import"./ir-6L-eU4id.js";import"./render-1ABBE2Y6.js";import"./builderforcellm-syscheck-CyZiwcdF.js";import"./session-utils-VCGKYbgW.js";import"./coding-tools.policy-DIeVRurg.js";import"./pairing-store-tegvJa08.js";import"./fetch-CrbOFvsL.js";import"./exec-approvals-Cn0K-HtJ.js";import"./nodes-screen-OI7tHqlU.js";import"./session-cost-usage-BgZfN_WR.js";import"./provider-usage-BLkm6ojE.js";import"./send-BIR1Jhc5.js";import"./outbound-attachment-3GZbMqo1.js";import"./delivery-queue-DQXq7KUU.js";import"./project-context-DXP12xhk.js";import"./control-service-Cml__v8i.js";import"./stagger-CUH5rlmS.js";import"./channel-selection-DFf_nAm7.js";import"./send-9rUcCK7O.js";import"./resolve-route-D3X-bXU-.js";import"./channel-activity-By7lsk7N.js";import"./tables-DZSV6me6.js";import"./links-B6LU5cXN.js";import"./cli-utils-ByV85M53.js";import"./help-format-DIDk_7gh.js";import"./progress-BQMO_-7I.js";import"./replies-CL0uQgU7.js";import{b as waitForGatewayReachable,d as openUrl,g as resolveControlUiLinks,i as detectBrowserOpenSupport,o as formatControlUiSshHint,p as probeGatewayReachable}from"./onboard-helpers-Di5OXlap.js";import"./prompt-style-CZOeG0sw.js";import"./pairing-labels-DofkNLS2.js";import"./active-listener-BC31MA4v.js";import"./mamba-state-engine-CFwb8DcP.js";import"./transformers-stream-nSL4Xu31.js";import"./note-BvXfFmlu.js";import"./helpers-DDS6DSK4.js";import"./register.subclis-Meewq2dj.js";import"./command-registry-BTxAGdlS.js";import"./program-context-D37YNAO5.js";import{n as installCompletion}from"./completion-cli-C8kMJ401.js";import{a as gatewayInstallErrorHint,i as buildGatewayInstallPlan,n as GATEWAY_DAEMON_RUNTIME_OPTIONS,t as DEFAULT_GATEWAY_DAEMON_RUNTIME}from"./daemon-runtime-Ddsn0FJm.js";import"./runtime-guard-BThrXAmT.js";import{r as isSystemdUserServiceAvailable}from"./systemd-DpT8tcbh.js";import{t as resolveGatewayService}from"./service-ugwM110q.js";import{r as healthCommand}from"./health-hXlukqbf.js";import{t as ensureControlUiAssetsBuilt}from"./control-ui-assets-BweA3rDY.js";import"./builderforce-directory-sync-DHfiUf2g.js";import"./shared-DjBPjC55.js";import"./model-picker-Dl3do2OD.js";import"./auth-choice.apply.transformers-vLzCo5ew.js";import{t as formatHealthCheckFailure}from"./health-format-CtcXvo40.js";import{r as ensureCompletionCacheExists,t as checkShellCompletionStatus}from"./doctor-completion-BdMxCat-.js";import{t as runTui}from"./tui-Dy1FnApe.js";import"./tui-stream-assembler-B_AQD4Kg.js";import os from"node:os";import path from"node:path";import fs from"node:fs/promises";async function resolveProfileHint(shell){let home=process.env.HOME||os.homedir();return shell===`zsh`?`~/.zshrc`:shell===`bash`?await pathExists(path.join(home,`.bashrc`))?`~/.bashrc`:`~/.bash_profile`:shell===`fish`?`~/.config/fish/config.fish`:`$PROFILE`}function formatReloadHint(shell,profileHint){return shell===`powershell`?`Restart your shell (or reload your PowerShell profile).`:`Restart your shell or run: source ${profileHint}`}async function setupOnboardingShellCompletion(params){let deps={resolveCliName,checkShellCompletionStatus,ensureCompletionCacheExists,installCompletion,...params.deps},cliName=deps.resolveCliName(),completionStatus=await deps.checkShellCompletionStatus(cliName);if(completionStatus.usesSlowPattern){await deps.ensureCompletionCacheExists(cliName)&&await deps.installCompletion(completionStatus.shell,!0,cliName);return}if(completionStatus.profileInstalled&&!completionStatus.cacheExists){await deps.ensureCompletionCacheExists(cliName);return}if(!completionStatus.profileInstalled){if(!(params.flow===`quickstart`||await params.prompter.confirm({message:`Enable ${completionStatus.shell} shell completion for ${cliName}?`,initialValue:!0})))return;if(!await deps.ensureCompletionCacheExists(cliName)){await params.prompter.note(`Failed to generate completion cache. Run \`${cliName} completion --install\` later.`,`Shell completion`);return}await deps.installCompletion(completionStatus.shell,!0,cliName);let profileHint=await resolveProfileHint(completionStatus.shell);await params.prompter.note(`Shell completion installed. ${formatReloadHint(completionStatus.shell,profileHint)}`,`Shell completion`)}}async function finalizeOnboardingWizard(options){let{flow,opts,baseConfig,nextConfig,settings,prompter,runtime}=options,withWizardProgress=async(label,options,work)=>{let progress=prompter.progress(label);try{return await work(progress)}finally{progress.stop(options.doneMessage)}},systemdAvailable=process.platform===`linux`?await isSystemdUserServiceAvailable():!0;if(process.platform===`linux`&&!systemdAvailable&&await prompter.note(`Systemd user services are unavailable. Skipping lingering checks and service install.`,`Systemd`),process.platform===`linux`&&systemdAvailable){let{ensureSystemdUserLingerInteractive}=await import(`./systemd-linger-B5THedZK.js`);await ensureSystemdUserLingerInteractive({runtime,prompter:{confirm:prompter.confirm,note:prompter.note},reason:`Linux installs use a systemd user service by default. Without lingering, systemd stops the user session on logout/idle and kills the Gateway.`,requireConfirm:!1})}let explicitInstallDaemon=typeof opts.installDaemon==`boolean`?opts.installDaemon:void 0,installDaemon;if(installDaemon=explicitInstallDaemon===void 0?process.platform===`linux`&&!systemdAvailable?!1:flow===`quickstart`?!0:await prompter.confirm({message:`Install Gateway service (recommended)`,initialValue:!0}):explicitInstallDaemon,process.platform===`linux`&&!systemdAvailable&&installDaemon&&(await prompter.note("Systemd user services are unavailable; skipping service install. Use your container supervisor or `docker compose up -d`.",`Gateway service`),installDaemon=!1),installDaemon){let daemonRuntime=flow===`quickstart`?DEFAULT_GATEWAY_DAEMON_RUNTIME:await prompter.select({message:`Gateway service runtime`,options:GATEWAY_DAEMON_RUNTIME_OPTIONS,initialValue:opts.daemonRuntime??DEFAULT_GATEWAY_DAEMON_RUNTIME});flow===`quickstart`&&await prompter.note(`QuickStart uses Node for the Gateway service (stable + supported).`,`Gateway service runtime`);let service=resolveGatewayService(),loaded=await service.isLoaded({env:process.env});if(loaded){let action=await prompter.select({message:`Gateway service already installed`,options:[{value:`restart`,label:`Restart`},{value:`reinstall`,label:`Reinstall`},{value:`skip`,label:`Skip`}]});action===`restart`?await withWizardProgress(`Gateway service`,{doneMessage:`Gateway service restarted.`},async progress=>{progress.update(`Restarting Gateway service…`),await service.restart({env:process.env,stdout:process.stdout})}):action===`reinstall`&&await withWizardProgress(`Gateway service`,{doneMessage:`Gateway service uninstalled.`},async progress=>{progress.update(`Uninstalling Gateway service…`),await service.uninstall({env:process.env,stdout:process.stdout})})}if(!loaded||loaded&&!await service.isLoaded({env:process.env})){let progress=prompter.progress(`Gateway service`),installError=null;try{progress.update(`Preparing Gateway service…`);let{programArguments,workingDirectory,environment}=await buildGatewayInstallPlan({env:process.env,port:settings.port,token:settings.gatewayToken,runtime:daemonRuntime,warn:(message,title)=>prompter.note(message,title),config:nextConfig});progress.update(`Installing Gateway service…`),await service.install({env:process.env,stdout:process.stdout,programArguments,workingDirectory,environment})}catch(err){installError=err instanceof Error?err.message:String(err)}finally{progress.stop(installError?`Gateway service install failed.`:`Gateway service installed.`)}installError&&(await prompter.note(`Gateway service install failed: ${installError}`,`Gateway`),await prompter.note(gatewayInstallErrorHint(),`Gateway`))}}if(!opts.skipHealth){await waitForGatewayReachable({url:resolveControlUiLinks({bind:nextConfig.gateway?.bind??`loopback`,port:settings.port,customBindHost:nextConfig.gateway?.customBindHost,basePath:void 0}).wsUrl,token:settings.gatewayToken,deadlineMs:15e3});try{await healthCommand({json:!1,timeoutMs:1e4},runtime)}catch(err){let msg=formatHealthCheckFailure(err);runtime.error(msg),logWarn(`[onboarding] health check failed: ${String(err)}`);let logFile=getResolvedLoggerSettings().file;await prompter.note([`Logs:`,logFile,`View: ${formatCliCommand(`builderforce logs --follow`)}`,``,`Docs:`,`https://docs.builderforce.ai/gateway/health`,`https://docs.builderforce.ai/gateway/troubleshooting`].join(`
|
|
1
|
+
import"./paths-BHg-VHB4.js";import"./registry-Cv7CoWAs.js";import{W as getResolvedLoggerSettings,h as pathExists,y as resolveUserPath}from"./utils-BP60e80M.js";import{t as restoreTerminalState}from"./restore-BdB4wlsZ.js";import"./subsystem-C4b1Von0.js";import"./boolean-ssGoaBPk.js";import"./env-BoE8QSib.js";import"./warning-filter-nSTjpMIH.js";import"./auth-profiles-BARnVAUE.js";import{r as resolveCliName,t as formatCliCommand}from"./command-format-DTMaGKs7.js";import{i as logWarn}from"./logger-AbH8mdkv.js";import"./session-key-D--2AEus.js";import"./builderforce-root-D3-p8W2n.js";import"./exec-CGuYALEs.js";import{A as resolveWorkspaceFilePath,h as DEFAULT_BOOTSTRAP_FILENAME}from"./agent-scope-BcoQBOwz.js";import"./env-file-BIKVpYUN.js";import"./io-BySzqKzT.js";import"./manifest-registry-DtqFvEIR.js";import"./config-Bwt58P9r.js";import"./model-discovery-DxpimsRF.js";import"./model-catalog-wcISK04b.js";import"./frontmatter-DgRc5y_l.js";import"./skills-W00EPvKR.js";import"./plugin-skills-BSUncenp.js";import"./refresh-bgGvF0aF.js";import"./client-DeQ0LbP9.js";import"./call-CjC3SRPv.js";import"./message-channel-C-yw5fZm.js";import"./subagent-registry-BUKplZi1.js";import"./sessions-ko0LxxGk.js";import"./src-BM8G-tIl.js";import"./project-context-store-BSIWJD6S.js";import"./tokens-BNwTTeJb.js";import"./plugins-DJGW_fnS.js";import"./accounts-Z5bJpNrG.js";import"./bindings-D0uket3l.js";import"./send-gG3CFJwv.js";import"./send-DqJCViFb.js";import"./with-timeout-By0c7Ur9.js";import"./deliver-DFhj1d_t.js";import"./accounts-DoJYLMfS.js";import"./send-mCN63Hkn.js";import"./image-ops-Bg9yFwjX.js";import"./redact-bWj_-q3j.js";import"./errors-t5wHPcwh.js";import"./embedded-helpers-DGDYymYx.js";import"./sandbox-BcH7kS1y.js";import"./chrome-IJYO1tSE.js";import"./tailscale-CgCG7AVQ.js";import"./auth-B4Kn3eee.js";import"./server-context-D3iiIzvV.js";import"./routes-7QTsp3sA.js";import"./paths-GamzES41.js";import"./ssrf-BiSQzdcA.js";import"./store-C5LmVaEC.js";import"./ports-LqFTyTSK.js";import"./trash-zs6gNxed.js";import"./accounts-BT-NzzBc.js";import"./paths-BQ9W7Bs0.js";import"./tool-images-DV2HMmx4.js";import"./workspace-Cz9mCy0P.js";import"./reply-prefix-9hmbzubX.js";import"./sqlite-BEgCClMz.js";import"./memory-cli-COgt0ROi.js";import"./manager-Cob4Ofzr.js";import"./gemini-auth-BZgBIY0M.js";import"./retry-Cc6xusE8.js";import"./common-BRdxH-uH.js";import"./runner-BLCTET8O.js";import"./tool-display-BIswnHaq.js";import"./chunk-UPhdkZNp.js";import"./markdown-tables-CpqWBduK.js";import"./fetch-guard-CoGEds8D.js";import"./fetch-CUsKv8oj.js";import"./ir-6L-eU4id.js";import"./render-1ABBE2Y6.js";import"./builderforcellm-syscheck-CfFrfeV2.js";import"./session-utils-VCGKYbgW.js";import"./coding-tools.policy-DIeVRurg.js";import"./pairing-store-tegvJa08.js";import"./fetch-CrbOFvsL.js";import"./exec-approvals-Cn0K-HtJ.js";import"./nodes-screen-OI7tHqlU.js";import"./session-cost-usage-BgZfN_WR.js";import"./provider-usage-BLkm6ojE.js";import"./send-BIR1Jhc5.js";import"./outbound-attachment-3GZbMqo1.js";import"./delivery-queue-DQXq7KUU.js";import"./project-context-C5KLsMTc.js";import"./control-service-Cml__v8i.js";import"./stagger-CUH5rlmS.js";import"./channel-selection-DFf_nAm7.js";import"./send-9rUcCK7O.js";import"./resolve-route-D3X-bXU-.js";import"./channel-activity-By7lsk7N.js";import"./tables-DZSV6me6.js";import"./links-B6LU5cXN.js";import"./cli-utils-ByV85M53.js";import"./help-format-DIDk_7gh.js";import"./progress-BQMO_-7I.js";import"./replies-CL0uQgU7.js";import{b as waitForGatewayReachable,d as openUrl,g as resolveControlUiLinks,i as detectBrowserOpenSupport,o as formatControlUiSshHint,p as probeGatewayReachable}from"./onboard-helpers-Di5OXlap.js";import"./prompt-style-CZOeG0sw.js";import"./pairing-labels-DofkNLS2.js";import"./active-listener-BC31MA4v.js";import"./mamba-state-engine-BYmUnYwn.js";import"./transformers-stream-nSL4Xu31.js";import"./note-BvXfFmlu.js";import"./helpers-DDS6DSK4.js";import"./register.subclis-yYbEKj9a.js";import"./command-registry-BXLjR3kb.js";import"./program-context-D37YNAO5.js";import{n as installCompletion}from"./completion-cli-DbIxXK1B.js";import{a as gatewayInstallErrorHint,i as buildGatewayInstallPlan,n as GATEWAY_DAEMON_RUNTIME_OPTIONS,t as DEFAULT_GATEWAY_DAEMON_RUNTIME}from"./daemon-runtime-Ddsn0FJm.js";import"./runtime-guard-BThrXAmT.js";import{r as isSystemdUserServiceAvailable}from"./systemd-DpT8tcbh.js";import{t as resolveGatewayService}from"./service-ugwM110q.js";import{r as healthCommand}from"./health-CRIXA8je.js";import{t as ensureControlUiAssetsBuilt}from"./control-ui-assets-BweA3rDY.js";import"./builderforce-directory-sync-DIQQT09l.js";import"./shared-DjBPjC55.js";import"./model-picker-Dl3do2OD.js";import"./auth-choice.apply.transformers-vyvtAxcX.js";import{t as formatHealthCheckFailure}from"./health-format-CtcXvo40.js";import{r as ensureCompletionCacheExists,t as checkShellCompletionStatus}from"./doctor-completion-Dpy-8HV9.js";import{t as runTui}from"./tui-CdYI5f3k.js";import"./tui-stream-assembler-BNJE9PoS.js";import os from"node:os";import path from"node:path";import fs from"node:fs/promises";async function resolveProfileHint(shell){let home=process.env.HOME||os.homedir();return shell===`zsh`?`~/.zshrc`:shell===`bash`?await pathExists(path.join(home,`.bashrc`))?`~/.bashrc`:`~/.bash_profile`:shell===`fish`?`~/.config/fish/config.fish`:`$PROFILE`}function formatReloadHint(shell,profileHint){return shell===`powershell`?`Restart your shell (or reload your PowerShell profile).`:`Restart your shell or run: source ${profileHint}`}async function setupOnboardingShellCompletion(params){let deps={resolveCliName,checkShellCompletionStatus,ensureCompletionCacheExists,installCompletion,...params.deps},cliName=deps.resolveCliName(),completionStatus=await deps.checkShellCompletionStatus(cliName);if(completionStatus.usesSlowPattern){await deps.ensureCompletionCacheExists(cliName)&&await deps.installCompletion(completionStatus.shell,!0,cliName);return}if(completionStatus.profileInstalled&&!completionStatus.cacheExists){await deps.ensureCompletionCacheExists(cliName);return}if(!completionStatus.profileInstalled){if(!(params.flow===`quickstart`||await params.prompter.confirm({message:`Enable ${completionStatus.shell} shell completion for ${cliName}?`,initialValue:!0})))return;if(!await deps.ensureCompletionCacheExists(cliName)){await params.prompter.note(`Failed to generate completion cache. Run \`${cliName} completion --install\` later.`,`Shell completion`);return}await deps.installCompletion(completionStatus.shell,!0,cliName);let profileHint=await resolveProfileHint(completionStatus.shell);await params.prompter.note(`Shell completion installed. ${formatReloadHint(completionStatus.shell,profileHint)}`,`Shell completion`)}}async function finalizeOnboardingWizard(options){let{flow,opts,baseConfig,nextConfig,settings,prompter,runtime}=options,withWizardProgress=async(label,options,work)=>{let progress=prompter.progress(label);try{return await work(progress)}finally{progress.stop(options.doneMessage)}},systemdAvailable=process.platform===`linux`?await isSystemdUserServiceAvailable():!0;if(process.platform===`linux`&&!systemdAvailable&&await prompter.note(`Systemd user services are unavailable. Skipping lingering checks and service install.`,`Systemd`),process.platform===`linux`&&systemdAvailable){let{ensureSystemdUserLingerInteractive}=await import(`./systemd-linger-B5THedZK.js`);await ensureSystemdUserLingerInteractive({runtime,prompter:{confirm:prompter.confirm,note:prompter.note},reason:`Linux installs use a systemd user service by default. Without lingering, systemd stops the user session on logout/idle and kills the Gateway.`,requireConfirm:!1})}let explicitInstallDaemon=typeof opts.installDaemon==`boolean`?opts.installDaemon:void 0,installDaemon;if(installDaemon=explicitInstallDaemon===void 0?process.platform===`linux`&&!systemdAvailable?!1:flow===`quickstart`?!0:await prompter.confirm({message:`Install Gateway service (recommended)`,initialValue:!0}):explicitInstallDaemon,process.platform===`linux`&&!systemdAvailable&&installDaemon&&(await prompter.note("Systemd user services are unavailable; skipping service install. Use your container supervisor or `docker compose up -d`.",`Gateway service`),installDaemon=!1),installDaemon){let daemonRuntime=flow===`quickstart`?DEFAULT_GATEWAY_DAEMON_RUNTIME:await prompter.select({message:`Gateway service runtime`,options:GATEWAY_DAEMON_RUNTIME_OPTIONS,initialValue:opts.daemonRuntime??DEFAULT_GATEWAY_DAEMON_RUNTIME});flow===`quickstart`&&await prompter.note(`QuickStart uses Node for the Gateway service (stable + supported).`,`Gateway service runtime`);let service=resolveGatewayService(),loaded=await service.isLoaded({env:process.env});if(loaded){let action=await prompter.select({message:`Gateway service already installed`,options:[{value:`restart`,label:`Restart`},{value:`reinstall`,label:`Reinstall`},{value:`skip`,label:`Skip`}]});action===`restart`?await withWizardProgress(`Gateway service`,{doneMessage:`Gateway service restarted.`},async progress=>{progress.update(`Restarting Gateway service…`),await service.restart({env:process.env,stdout:process.stdout})}):action===`reinstall`&&await withWizardProgress(`Gateway service`,{doneMessage:`Gateway service uninstalled.`},async progress=>{progress.update(`Uninstalling Gateway service…`),await service.uninstall({env:process.env,stdout:process.stdout})})}if(!loaded||loaded&&!await service.isLoaded({env:process.env})){let progress=prompter.progress(`Gateway service`),installError=null;try{progress.update(`Preparing Gateway service…`);let{programArguments,workingDirectory,environment}=await buildGatewayInstallPlan({env:process.env,port:settings.port,token:settings.gatewayToken,runtime:daemonRuntime,warn:(message,title)=>prompter.note(message,title),config:nextConfig});progress.update(`Installing Gateway service…`),await service.install({env:process.env,stdout:process.stdout,programArguments,workingDirectory,environment})}catch(err){installError=err instanceof Error?err.message:String(err)}finally{progress.stop(installError?`Gateway service install failed.`:`Gateway service installed.`)}installError&&(await prompter.note(`Gateway service install failed: ${installError}`,`Gateway`),await prompter.note(gatewayInstallErrorHint(),`Gateway`))}}if(!opts.skipHealth){await waitForGatewayReachable({url:resolveControlUiLinks({bind:nextConfig.gateway?.bind??`loopback`,port:settings.port,customBindHost:nextConfig.gateway?.customBindHost,basePath:void 0}).wsUrl,token:settings.gatewayToken,deadlineMs:15e3});try{await healthCommand({json:!1,timeoutMs:1e4},runtime)}catch(err){let msg=formatHealthCheckFailure(err);runtime.error(msg),logWarn(`[onboarding] health check failed: ${String(err)}`);let logFile=getResolvedLoggerSettings().file;await prompter.note([`Logs:`,logFile,`View: ${formatCliCommand(`builderforce logs --follow`)}`,``,`Docs:`,`https://docs.builderforce.ai/gateway/health`,`https://docs.builderforce.ai/gateway/troubleshooting`].join(`
|
|
2
2
|
`),`Health check help`)}}let controlUiEnabled=nextConfig.gateway?.controlUi?.enabled??baseConfig.gateway?.controlUi?.enabled??!0;if(!opts.skipUi&&controlUiEnabled){let controlUiAssets=await ensureControlUiAssetsBuilt(runtime);!controlUiAssets.ok&&controlUiAssets.message&&runtime.error(controlUiAssets.message)}await prompter.note([`Add nodes for extra features:`,`- macOS app (system + notifications)`,`- iOS app (camera/canvas)`,`- Android app (camera/canvas)`].join(`
|
|
3
3
|
`),`Optional apps`);let controlUiBasePath=nextConfig.gateway?.controlUi?.basePath??baseConfig.gateway?.controlUi?.basePath,links=resolveControlUiLinks({bind:settings.bind,port:settings.port,customBindHost:settings.customBindHost,basePath:controlUiBasePath}),authedUrl=settings.authMode===`token`&&settings.gatewayToken?`${links.httpUrl}#token=${encodeURIComponent(settings.gatewayToken)}`:links.httpUrl,gatewayProbe=await probeGatewayReachable({url:links.wsUrl,token:settings.authMode===`token`?settings.gatewayToken:void 0,password:settings.authMode===`password`?nextConfig.gateway?.auth?.password:``}),gatewayStatusLine=gatewayProbe.ok?`Gateway: reachable`:`Gateway: not detected${gatewayProbe.detail?` (${gatewayProbe.detail})`:``}`,bootstrapPath=resolveWorkspaceFilePath(resolveUserPath(options.workspaceDir),DEFAULT_BOOTSTRAP_FILENAME),hasBootstrap=await fs.access(bootstrapPath).then(()=>!0).catch(()=>!1);await prompter.note([`Web UI: ${links.httpUrl}`,settings.authMode===`token`&&settings.gatewayToken?`Web UI (with token): ${authedUrl}`:void 0,`Gateway WS: ${links.wsUrl}`,gatewayStatusLine,`Docs: https://docs.builderforce.ai/web/control-ui`].filter(Boolean).join(`
|
|
4
4
|
`),`Control UI`);let controlUiOpened=!1,controlUiOpenHint,hatchChoice=null,launchedTui=!1;!opts.skipUi&&gatewayProbe.ok?(hasBootstrap&&await prompter.note([`This is the defining action that makes your agent you.`,`Please take your time.`,`The more you tell it, the better the experience will be.`,`We will send: "Wake up, my friend!"`].join(`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
function createDefaultDeps(){return{sendMessageWhatsApp:async(...args)=>{let{sendMessageWhatsApp}=await import(`./web-
|
|
1
|
+
function createDefaultDeps(){return{sendMessageWhatsApp:async(...args)=>{let{sendMessageWhatsApp}=await import(`./web-CsWqmV_E.js`);return await sendMessageWhatsApp(...args)},sendMessageTelegram:async(...args)=>{let{sendMessageTelegram}=await import(`./send-DG0N5cyM.js`);return await sendMessageTelegram(...args)},sendMessageDiscord:async(...args)=>{let{sendMessageDiscord}=await import(`./send-kayvBvvl.js`);return await sendMessageDiscord(...args)},sendMessageSlack:async(...args)=>{let{sendMessageSlack}=await import(`./send-OtFJcDqJ.js`);return await sendMessageSlack(...args)},sendMessageSignal:async(...args)=>{let{sendMessageSignal}=await import(`./send-uKfkR8s5.js`);return await sendMessageSignal(...args)},sendMessageIMessage:async(...args)=>{let{sendMessageIMessage}=await import(`./send-D20TfDSd.js`);return await sendMessageIMessage(...args)}}}function createOutboundSendDeps$1(deps){return{sendWhatsApp:deps.sendMessageWhatsApp,sendTelegram:deps.sendMessageTelegram,sendDiscord:deps.sendMessageDiscord,sendSlack:deps.sendMessageSlack,sendSignal:deps.sendMessageSignal,sendIMessage:deps.sendMessageIMessage}}function createOutboundSendDeps(deps){return{sendWhatsApp:deps.sendMessageWhatsApp,sendTelegram:deps.sendMessageTelegram,sendDiscord:deps.sendMessageDiscord,sendSlack:deps.sendMessageSlack,sendSignal:deps.sendMessageSignal,sendIMessage:deps.sendMessageIMessage}}export{createDefaultDeps as n,createOutboundSendDeps$1 as r,createOutboundSendDeps as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{d as getActivePluginRegistry}from"./registry-Cv7CoWAs.js";import{t as createSubsystemLogger}from"./subsystem-C4b1Von0.js";import{c as resolveAgentWorkspaceDir,l as resolveDefaultAgentId}from"./agent-scope-BcoQBOwz.js";import{r as loadConfig}from"./io-BySzqKzT.js";import{w as loadBuilderForceAgentsPlugins}from"./subagent-registry-
|
|
1
|
+
import{d as getActivePluginRegistry}from"./registry-Cv7CoWAs.js";import{t as createSubsystemLogger}from"./subsystem-C4b1Von0.js";import{c as resolveAgentWorkspaceDir,l as resolveDefaultAgentId}from"./agent-scope-BcoQBOwz.js";import{r as loadConfig}from"./io-BySzqKzT.js";import{w as loadBuilderForceAgentsPlugins}from"./subagent-registry-BUKplZi1.js";const log=createSubsystemLogger(`plugins`);let pluginRegistryLoaded=!1;function ensurePluginRegistryLoaded(){if(pluginRegistryLoaded)return;let active=getActivePluginRegistry();if(active&&(active.plugins.length>0||active.channels.length>0||active.tools.length>0)){pluginRegistryLoaded=!0;return}let config=loadConfig();loadBuilderForceAgentsPlugins({config,workspaceDir:resolveAgentWorkspaceDir(config,resolveDefaultAgentId(config)),logger:{info:msg=>log.info(msg),warn:msg=>log.warn(msg),error:msg=>log.error(msg),debug:msg=>log.debug(msg)}}),pluginRegistryLoaded=!0}export{ensurePluginRegistryLoaded as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{At as loadBuilderForceAgentsPlugins}from"./reply-
|
|
1
|
+
import{At as loadBuilderForceAgentsPlugins}from"./reply-CpGH-3If.js";import{t as createSubsystemLogger}from"./subsystem-B3TqcCrZ.js";import{d as getActivePluginRegistry}from"./registry-TdK-aV05.js";import{c as resolveAgentWorkspaceDir,l as resolveDefaultAgentId}from"./agent-scope-DPtjOxzp.js";import{r as loadConfig}from"./io-YzT_09GD.js";const log=createSubsystemLogger(`plugins`);let pluginRegistryLoaded=!1;function ensurePluginRegistryLoaded(){if(pluginRegistryLoaded)return;let active=getActivePluginRegistry();if(active&&(active.plugins.length>0||active.channels.length>0||active.tools.length>0)){pluginRegistryLoaded=!0;return}let config=loadConfig();loadBuilderForceAgentsPlugins({config,workspaceDir:resolveAgentWorkspaceDir(config,resolveDefaultAgentId(config)),logger:{info:msg=>log.info(msg),warn:msg=>log.warn(msg),error:msg=>log.error(msg),debug:msg=>log.debug(msg)}}),pluginRegistryLoaded=!0}export{ensurePluginRegistryLoaded as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import"./paths-BHg-VHB4.js";import"./registry-Cv7CoWAs.js";import"./utils-BP60e80M.js";import"./subsystem-C4b1Von0.js";import"./boolean-ssGoaBPk.js";import"./env-BoE8QSib.js";import"./warning-filter-nSTjpMIH.js";import"./auth-profiles-BARnVAUE.js";import"./logger-AbH8mdkv.js";import"./session-key-D--2AEus.js";import"./builderforce-root-D3-p8W2n.js";import"./exec-CGuYALEs.js";import"./agent-scope-BcoQBOwz.js";import"./env-file-BIKVpYUN.js";import"./io-BySzqKzT.js";import"./manifest-registry-DtqFvEIR.js";import"./config-Bwt58P9r.js";import"./model-discovery-DxpimsRF.js";import"./model-catalog-wcISK04b.js";import"./frontmatter-DgRc5y_l.js";import"./skills-W00EPvKR.js";import"./plugin-skills-BSUncenp.js";import"./refresh-bgGvF0aF.js";import"./client-DeQ0LbP9.js";import"./call-CjC3SRPv.js";import"./message-channel-C-yw5fZm.js";import"./subagent-registry-
|
|
1
|
+
import"./paths-BHg-VHB4.js";import"./registry-Cv7CoWAs.js";import"./utils-BP60e80M.js";import"./subsystem-C4b1Von0.js";import"./boolean-ssGoaBPk.js";import"./env-BoE8QSib.js";import"./warning-filter-nSTjpMIH.js";import"./auth-profiles-BARnVAUE.js";import"./logger-AbH8mdkv.js";import"./session-key-D--2AEus.js";import"./builderforce-root-D3-p8W2n.js";import"./exec-CGuYALEs.js";import"./agent-scope-BcoQBOwz.js";import"./env-file-BIKVpYUN.js";import"./io-BySzqKzT.js";import"./manifest-registry-DtqFvEIR.js";import"./config-Bwt58P9r.js";import"./model-discovery-DxpimsRF.js";import"./model-catalog-wcISK04b.js";import"./frontmatter-DgRc5y_l.js";import"./skills-W00EPvKR.js";import"./plugin-skills-BSUncenp.js";import"./refresh-bgGvF0aF.js";import"./client-DeQ0LbP9.js";import"./call-CjC3SRPv.js";import"./message-channel-C-yw5fZm.js";import"./subagent-registry-BUKplZi1.js";import"./sessions-ko0LxxGk.js";import"./src-BM8G-tIl.js";import"./project-context-store-BSIWJD6S.js";import"./tokens-BNwTTeJb.js";import"./plugins-DJGW_fnS.js";import"./accounts-Z5bJpNrG.js";import"./bindings-D0uket3l.js";import"./send-gG3CFJwv.js";import"./send-DqJCViFb.js";import"./with-timeout-By0c7Ur9.js";import"./deliver-DFhj1d_t.js";import"./accounts-DoJYLMfS.js";import"./send-mCN63Hkn.js";import"./image-ops-Bg9yFwjX.js";import"./redact-bWj_-q3j.js";import"./errors-t5wHPcwh.js";import"./embedded-helpers-DGDYymYx.js";import"./sandbox-BcH7kS1y.js";import"./chrome-IJYO1tSE.js";import"./tailscale-CgCG7AVQ.js";import"./auth-B4Kn3eee.js";import"./server-context-D3iiIzvV.js";import"./routes-7QTsp3sA.js";import"./paths-GamzES41.js";import"./ssrf-BiSQzdcA.js";import"./store-C5LmVaEC.js";import"./ports-LqFTyTSK.js";import"./trash-zs6gNxed.js";import"./accounts-BT-NzzBc.js";import"./paths-BQ9W7Bs0.js";import"./tool-images-DV2HMmx4.js";import"./workspace-Cz9mCy0P.js";import"./reply-prefix-9hmbzubX.js";import"./sqlite-BEgCClMz.js";import"./memory-cli-COgt0ROi.js";import"./manager-Cob4Ofzr.js";import"./gemini-auth-BZgBIY0M.js";import"./retry-Cc6xusE8.js";import"./common-BRdxH-uH.js";import"./runner-BLCTET8O.js";import"./tool-display-BIswnHaq.js";import"./chunk-UPhdkZNp.js";import"./markdown-tables-CpqWBduK.js";import"./fetch-guard-CoGEds8D.js";import"./fetch-CUsKv8oj.js";import"./ir-6L-eU4id.js";import"./render-1ABBE2Y6.js";import"./builderforcellm-syscheck-CfFrfeV2.js";import"./session-utils-VCGKYbgW.js";import"./coding-tools.policy-DIeVRurg.js";import"./pairing-store-tegvJa08.js";import"./fetch-CrbOFvsL.js";import"./exec-approvals-Cn0K-HtJ.js";import"./nodes-screen-OI7tHqlU.js";import"./session-cost-usage-BgZfN_WR.js";import"./provider-usage-BLkm6ojE.js";import"./send-BIR1Jhc5.js";import"./outbound-attachment-3GZbMqo1.js";import"./delivery-queue-DQXq7KUU.js";import"./project-context-C5KLsMTc.js";import"./control-service-Cml__v8i.js";import"./stagger-CUH5rlmS.js";import"./channel-selection-DFf_nAm7.js";import"./send-9rUcCK7O.js";import"./resolve-route-D3X-bXU-.js";import"./channel-activity-By7lsk7N.js";import"./tables-DZSV6me6.js";import"./links-B6LU5cXN.js";import"./cli-utils-ByV85M53.js";import"./help-format-DIDk_7gh.js";import"./progress-BQMO_-7I.js";import"./replies-CL0uQgU7.js";import"./onboard-helpers-Di5OXlap.js";import"./prompt-style-CZOeG0sw.js";import"./pairing-labels-DofkNLS2.js";import"./active-listener-BC31MA4v.js";import"./mamba-state-engine-BYmUnYwn.js";import"./transformers-stream-nSL4Xu31.js";import{t as ensurePluginRegistryLoaded}from"./plugin-registry-BM1-sG-e.js";export{ensurePluginRegistryLoaded};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import"./paths-5FcIFMsj.js";import"./utils-DbaBVFaK.js";import"./embedded-helpers-
|
|
1
|
+
import"./paths-5FcIFMsj.js";import"./utils-DbaBVFaK.js";import"./embedded-helpers-3FEGD_4b.js";import"./reply-CpGH-3If.js";import"./session-key-EoB0qaG9.js";import"./builderforce-root-D64_sXEi.js";import"./subsystem-B3TqcCrZ.js";import"./registry-TdK-aV05.js";import"./logger-Bch0bx9c.js";import"./exec-DdcIjeyn.js";import"./agent-scope-DPtjOxzp.js";import"./model-selection-DX_WOc2P.js";import"./env-file-BI2jpOmF.js";import"./boolean-Cn4K2fc9.js";import"./env-BHP32i7Q.js";import"./io-YzT_09GD.js";import"./manifest-registry-BVDm_CP0.js";import"./config-8x9ZIdfF.js";import"./runner-C651oVfk.js";import"./model-catalog-C7PdRY6w.js";import"./sandbox-DzuXOMNa.js";import"./chrome-Dk-WNIhp.js";import"./tailscale-B-VKIlWm.js";import"./auth-CDcrUXYB.js";import"./server-context-DsuST81W.js";import"./frontmatter-DyJ2unbL.js";import"./skills-B4r9m770.js";import"./plugin-skills-C39wi4uD.js";import"./routes-DoGqdgOP.js";import"./redact-C3oo7_aY.js";import"./errors-CjmtpPBP.js";import"./paths-C1QKdGJX.js";import"./ssrf-4MnoQ7Sz.js";import"./image-ops-CONrkLJK.js";import"./store-BoTKCB2d.js";import"./ports-BNC_iRpw.js";import"./trash-Czxs8cUf.js";import"./sessions-OZNhnSwZ.js";import"./message-channel-DrfCCUg4.js";import"./plugins-COtQnUML.js";import"./accounts-CTKk3xPO.js";import"./accounts-DFqpWzeU.js";import"./accounts-CbQihLRU.js";import"./bindings-DMDv84HS.js";import"./send-Dmzp1gNF.js";import"./send-DEgD1Cfd.js";import"./paths-CkcK939O.js";import"./src-D2-7sOAX.js";import"./tool-images-DsKy1uNN.js";import"./tool-display-TRKLY-yH.js";import"./fetch-guard-BQuCLA1C.js";import"./api-key-rotation-ChHXb1Pq.js";import"./fetch-CDeJQlzN.js";import"./sqlite-DEiKj1vi.js";import"./tokens-Ct4DyfhX.js";import"./project-context-store-BS994lZX.js";import"./with-timeout-YbYylXgf.js";import"./deliver-XGIFv80r.js";import"./send-DlPwTVpG.js";import"./workspace-ChbaDWgp.js";import"./reply-prefix-BwtP84WV.js";import"./memory-cli-DWEtZrJ5.js";import"./manager-VPNjVm0W.js";import"./retry-Jis-ZZfm.js";import"./client-DhlZRznX.js";import"./call-DwWslKWv.js";import"./common-NHQnma5l.js";import"./chunk-h7FZEwW2.js";import"./markdown-tables-DOq8FfUr.js";import"./ir-AM9J0QtO.js";import"./render-CSLaFZoy.js";import"./builderforcellm-syscheck-DGZKIwPC.js";import"./send-DglIOKdS.js";import"./outbound-attachment-TWzrIR9Q.js";import"./fetch-B6_hd7w9.js";import"./delivery-queue-BZWZDdpJ.js";import"./channel-activity-qRD5c3VV.js";import"./tables-DirB1oU7.js";import"./pairing-store-DIpKOfDK.js";import"./links-CYRGsVCu.js";import"./cli-utils-BLNnV_WG.js";import"./help-format-NhTn4dWd.js";import"./progress-OKwbfa23.js";import"./resolve-route-BvfmiLqC.js";import"./replies-BoxyKuBS.js";import"./refresh-DgTiir08.js";import"./coding-tools.policy-BJQuylwM.js";import"./send-BgdpJymE.js";import"./onboard-helpers-CPmBeDvt.js";import"./prompt-style-BwwmGo3-.js";import"./pairing-labels-CELZqNBC.js";import"./session-cost-usage-pgxrRRW4.js";import"./provider-usage-CbH7sm73.js";import"./active-listener-DBdxNyOd.js";import"./exec-approvals-kmxxyvIe.js";import"./nodes-screen-BWDONgPE.js";import"./project-context-Cg0S9eFT.js";import"./control-service-BhSaBRxC.js";import"./stagger-NaB6u1z1.js";import"./channel-selection-CQ5MM7Hi.js";import"./mamba-state-engine-BloJzrxU.js";import"./transformers-stream-QS2dnQob.js";import{t as ensurePluginRegistryLoaded}from"./plugin-registry-CAy3I1K1.js";export{ensurePluginRegistryLoaded};
|
|
@@ -49,7 +49,7 @@ export interface IAgentMemoryService {
|
|
|
49
49
|
epochs: number;
|
|
50
50
|
}): Promise<string>;
|
|
51
51
|
}
|
|
52
|
-
import type { CompiledLimbic, LimbicEvent, LimbicState } from "
|
|
52
|
+
import type { CompiledLimbic, LimbicEvent, LimbicState } from "@seanhogg/builderforce-memory-engine/limbic";
|
|
53
53
|
/**
|
|
54
54
|
* The agent's limbic system — the dynamic counterpart to the static psychometric
|
|
55
55
|
* personality. Tracks a live affective state and drives it through the brain
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* LimbicSystemService – the runtime home of the agent's limbic system.
|
|
3
3
|
*
|
|
4
4
|
* Holds the live affective state for a self-hosted node and drives it through
|
|
5
|
-
* the brain regions
|
|
5
|
+
* the brain regions of the one limbic implementation (`@seanhogg/builderforce-memory-engine/limbic`):
|
|
6
6
|
*
|
|
7
7
|
* experience → amygdala appraisal → state update → homeostasis (hypothalamus)
|
|
8
8
|
* → thalamus attention gate → basal-ganglia action selection
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
* experiences, persisting adapted weights to `limbic.bin`.
|
|
20
20
|
*/
|
|
21
21
|
import { type AgentEventPayload } from "./agent-events.js";
|
|
22
|
-
import {
|
|
22
|
+
import { type CompiledLimbic, type LimbicEvent, type LimbicSetpoints, type LimbicState } from "@seanhogg/builderforce-memory-engine/limbic";
|
|
23
23
|
export interface LimbicSystemServiceOptions {
|
|
24
24
|
/** On-disk checkpoint path. Resolution: opt → env → '.builderforce/limbic.bin'. */
|
|
25
25
|
checkpointPath?: string;
|
|
@@ -144,6 +144,5 @@ export declare function mapAgentEventToLimbic(evt: AgentEventPayload): LimbicEve
|
|
|
144
144
|
export declare function projectEmbedding(src: ArrayLike<number>, dim: number): Float32Array;
|
|
145
145
|
/** Deterministic hashed trigram embedding → unit-norm Float32Array(dim). */
|
|
146
146
|
export declare function hashedEmbedding(text: string, dim: number): Float32Array;
|
|
147
|
-
export { arrayToState };
|
|
148
147
|
export declare function getLimbicSystemService(): LimbicSystemService | null;
|
|
149
148
|
export declare function initLimbicSystemService(opts?: LimbicSystemServiceOptions): Promise<LimbicSystemService>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import"./session-key-5J69DULS.js";import"./accounts-Cy3WCbWg.js";import{G as shouldLogVerbose,H as logVerbose}from"./registry-CZHRcH-q.js";import"./paths-Cb8zTlyG.js";import"./model-selection-0ifLKoVR.js";import"./config-OPdt6NPU.js";import"./fetch-B-GxSYRO.js";import"./subsystem-D0Ril4rt.js";import"./agent-scope-DgKN27hJ.js";import"./tool-images-WRTP95FT.js";import{a as runCapability,n as createMediaAttachmentCache,o as isAudioAttachment,r as normalizeMediaAttachments,t as buildProviderRegistry}from"./runner-
|
|
1
|
+
import"./session-key-5J69DULS.js";import"./accounts-Cy3WCbWg.js";import{G as shouldLogVerbose,H as logVerbose}from"./registry-CZHRcH-q.js";import"./paths-Cb8zTlyG.js";import"./model-selection-0ifLKoVR.js";import"./config-OPdt6NPU.js";import"./fetch-B-GxSYRO.js";import"./subsystem-D0Ril4rt.js";import"./agent-scope-DgKN27hJ.js";import"./tool-images-WRTP95FT.js";import{a as runCapability,n as createMediaAttachmentCache,o as isAudioAttachment,r as normalizeMediaAttachments,t as buildProviderRegistry}from"./runner-BpFNG45j.js";import"./redact-Bv8wnIZm.js";import"./errors-L3rugjUL.js";import"./chrome-DsPy-YNT.js";import"./command-format-B3XMq_73.js";import"./plugins-BdkC9v5E.js";import"./bindings-CH-YLOLC.js";import"./message-channel-CuZ2xOAM.js";import"./paths-BGOFa09I.js";import"./api-key-rotation-6b0P0AXk.js";import"./model-catalog-Doc3qLxu.js";import"./src-pvdIxmTY.js";async function transcribeFirstAudio(params){let{ctx,cfg}=params,audioConfig=cfg.tools?.media?.audio;if(!audioConfig||audioConfig.enabled===!1)return;let attachments=normalizeMediaAttachments(ctx);if(!attachments||attachments.length===0)return;let firstAudio=attachments.find(att=>att&&isAudioAttachment(att)&&!att.alreadyTranscribed);if(!firstAudio)return;shouldLogVerbose()&&logVerbose(`audio-preflight: transcribing attachment ${firstAudio.index} for mention check`);let providerRegistry=buildProviderRegistry(params.providers),cache=createMediaAttachmentCache(attachments);try{let result=await runCapability({capability:`audio`,cfg,ctx,attachments:cache,media:attachments,agentDir:params.agentDir,providerRegistry,config:audioConfig,activeModel:params.activeModel});if(!result||result.outputs.length===0)return;let audioOutput=result.outputs.find(output=>output.kind===`audio.transcription`);return!audioOutput||!audioOutput.text?void 0:(firstAudio.alreadyTranscribed=!0,shouldLogVerbose()&&logVerbose(`audio-preflight: transcribed ${audioOutput.text.length} chars from attachment ${firstAudio.index}`),audioOutput.text)}catch(err){shouldLogVerbose()&&logVerbose(`audio-preflight: transcription failed: ${String(err)}`);return}finally{await cache.cleanup()}}export{transcribeFirstAudio};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{i as buildAgentMainSessionKey,l as normalizeAgentId,o as buildGroupHistoryKey,r as DEFAULT_MAIN_KEY}from"./session-key-5J69DULS.js";import{f as readWebSelfId,o as getWebAuthAgeMs,r as resolveWhatsAppAccount}from"./accounts-Cy3WCbWg.js";import{$ as formatLocationText,B as recordChannelActivity,Bt as createDedupeCache,O as enqueueSystemEvent,_ as resolveInboundDebounceMs,b as hasControlCommand,bt as buildMentionRegexes,c as computeBackoff,ct as shouldAckReactionForWhatsApp,d as formatDurationPrecise,et as toLocationContext,f as readChannelAllowFromStore,g as createInboundDebouncer,l as sleepWithAbort,lt as resolveMentionGating,m as dispatchReplyWithBufferedBlockDispatcher,mt as buildHistoryContextFromEntries,n as normalizeGroupActivation,p as upsertChannelPairingRequest,pt as DEFAULT_GROUP_HISTORY_LIMIT,r as parseActivationCommand,t as getReplyFromConfig,u as buildPairingReply,v as formatInboundEnvelope,x as shouldComputeCommandAuthorized,xt as normalizeMentionText,y as resolveEnvelopeFormatOptions,yt as recordPendingHistoryEntryIfEnabled}from"./reply-DkmZ32IH.js";import{A as resolveJidToE164,D as normalizeE164,E as jidToE164,F as sleep,G as shouldLogVerbose,H as logVerbose,L as toWhatsappJid,T as isSelfChatMode,Z as getChildLogger,_ as clamp,o as normalizeChatChannelId}from"./registry-CZHRcH-q.js";import{n as loadConfig}from"./config-OPdt6NPU.js";import{i as defaultRuntime,t as createSubsystemLogger}from"./subsystem-D0Ril4rt.js";import{c as resolveIdentityNamePrefix,l as resolveMessagePrefix,n as createReplyPrefixOptions}from"./reply-prefix-w7kAvH11.js";import{An as recordSessionMetaFromInbound,Br as resolveChannelGroupRequireMention,On as loadSessionStore,c as registerUnhandledRejectionHandler,cr as resolveGroupSessionKey,dn as saveMediaBuffer,jn as updateLastRoute,kn as readSessionUpdatedAt,zr as resolveChannelGroupPolicy}from"./runner-DeqVi2ay.js";import{t as formatCliCommand}from"./command-format-B3XMq_73.js";import{s as resolveStorePath}from"./paths-BGOFa09I.js";import{i as convertMarkdownTables,r as setActiveWebListener}from"./active-listener-DJKMUuYe.js";import{c as getAgentScopedMediaLocalRoots,o as loadWebMedia}from"./render-W2uKhcT9.js";import{c as resolveChunkMode,i as chunkMarkdownTextWithMode,l as resolveTextChunkLimit}from"./chunk-C8sryaZi.js";import{n as resolveMarkdownTableMode}from"./markdown-tables-l6wrDFWG.js";import{t as finalizeInboundContext}from"./inbound-context-B3Yay31f.js";import{n as resolveAgentRoute,t as buildAgentSessionKey}from"./resolve-route-0sbvl4ZN.js";import{i as markdownToWhatsApp,r as sendReactionWhatsApp}from"./outbound-CEct8L7D.js";import{i as waitForWaConnection,n as formatError,r as getStatusCode,t as createWaSocket}from"./session-CU-kbVQt.js";import{randomUUID}from"node:crypto";import{getMaxListeners,setMaxListeners}from"node:events";import{DisconnectReason,downloadMediaMessage,extractMessageContent,getContentType,isJidGroup,normalizeMessageContent}from"@whiskeysockets/baileys";function getSessionRecipients(cfg){if((cfg.session?.scope??`per-sender`)===`global`)return[];let store=loadSessionStore(resolveStorePath(cfg.session?.store)),isGroupKey=key=>key.includes(`:group:`)||key.includes(`:channel:`)||key.includes(`@g.us`),isCronKey=key=>key.startsWith(`cron:`),recipients=Object.entries(store).filter(([key])=>key!==`global`&&key!==`unknown`).filter(([key])=>!isGroupKey(key)&&!isCronKey(key)).map(([_,entry])=>({to:normalizeChatChannelId(entry?.lastChannel)===`whatsapp`&&entry?.lastTo?normalizeE164(entry.lastTo):``,updatedAt:entry?.updatedAt??0})).filter(({to})=>to.length>1).toSorted((a,b)=>b.updatedAt-a.updatedAt),seen=new Set;return recipients.filter(r=>seen.has(r.to)?!1:(seen.add(r.to),!0))}function resolveWhatsAppHeartbeatRecipients(cfg,opts={}){if(opts.to)return{recipients:[normalizeE164(opts.to)],source:`flag`};let sessionRecipients=getSessionRecipients(cfg),allowFrom=Array.isArray(cfg.channels?.whatsapp?.allowFrom)&&cfg.channels.whatsapp.allowFrom.length>0?cfg.channels.whatsapp.allowFrom.filter(v=>v!==`*`).map(normalizeE164):[];return opts.all?{recipients:(list=>[...new Set(list.filter(Boolean))])([...sessionRecipients.map(s=>s.to),...allowFrom]),source:`all`}:sessionRecipients.length===1?{recipients:[sessionRecipients[0].to],source:`session-single`}:sessionRecipients.length>1?{recipients:sessionRecipients.map(s=>s.to),source:`session-ambiguous`}:{recipients:allowFrom,source:`allowFrom`}}const DEFAULT_RECONNECT_POLICY={initialMs:2e3,maxMs:3e4,factor:1.8,jitter:.25,maxAttempts:12};function resolveHeartbeatSeconds(cfg,overrideSeconds){let candidate=overrideSeconds??cfg.web?.heartbeatSeconds;return typeof candidate==`number`&&candidate>0?candidate:60}function resolveReconnectPolicy(cfg,overrides){let reconnectOverrides=cfg.web?.reconnect??{},overrideConfig=overrides??{},merged={...DEFAULT_RECONNECT_POLICY,...reconnectOverrides,...overrideConfig};return merged.initialMs=Math.max(250,merged.initialMs),merged.maxMs=Math.max(merged.initialMs,merged.maxMs),merged.factor=clamp(merged.factor,1.1,10),merged.jitter=clamp(merged.jitter,0,1),merged.maxAttempts=Math.max(0,Math.floor(merged.maxAttempts)),merged}function newConnectionId(){return randomUUID()}const whatsappLog=createSubsystemLogger(`gateway/channels/whatsapp`),whatsappInboundLog=whatsappLog.child(`inbound`),whatsappOutboundLog=whatsappLog.child(`outbound`),whatsappHeartbeatLog=whatsappLog.child(`heartbeat`);function elide(text,limit=400){return!text||text.length<=limit?text:`${text.slice(0,limit)}… (truncated ${text.length-limit} chars)`}function isLikelyWhatsAppCryptoError(reason){let haystack=(reason instanceof Error?`${reason.message}\n${reason.stack??``}`:(value=>{if(value==null)return``;if(typeof value==`string`)return value;if(value instanceof Error)return`${value.message}\n${value.stack??``}`;if(typeof value==`object`)try{return JSON.stringify(value)}catch{return Object.prototype.toString.call(value)}return typeof value==`number`||typeof value==`boolean`||typeof value==`bigint`?String(value):typeof value==`symbol`?value.description??value.toString():typeof value==`function`?value.name?`[function ${value.name}]`:`[function]`:Object.prototype.toString.call(value)})(reason)).toLowerCase();return haystack.includes(`unsupported state or unable to authenticate data`)||haystack.includes(`bad mac`)?haystack.includes(`@whiskeysockets/baileys`)||haystack.includes(`baileys`)||haystack.includes(`noise-handler`)||haystack.includes(`aesdecryptgcm`):!1}function waitForever(){return setInterval(()=>{},1e6).unref(),new Promise(()=>{})}const recentInboundMessages=createDedupeCache({ttlMs:20*6e4,maxSize:5e3});function isRecentInboundMessage(key){return recentInboundMessages.check(key)}const ALLOWED_VCARD_KEYS=new Set([`FN`,`N`,`TEL`]);function parseVcard(vcard){if(!vcard)return{phones:[]};let lines=vcard.split(/\r?\n/),nameFromN,nameFromFn,phones=[];for(let rawLine of lines){let line=rawLine.trim();if(!line)continue;let colonIndex=line.indexOf(`:`);if(colonIndex===-1)continue;let key=line.slice(0,colonIndex).toUpperCase(),rawValue=line.slice(colonIndex+1).trim();if(!rawValue)continue;let baseKey=normalizeVcardKey(key);if(!baseKey||!ALLOWED_VCARD_KEYS.has(baseKey))continue;let value=cleanVcardValue(rawValue);if(value){if(baseKey===`FN`&&!nameFromFn){nameFromFn=normalizeVcardName(value);continue}if(baseKey===`N`&&!nameFromN){nameFromN=normalizeVcardName(value);continue}if(baseKey===`TEL`){let phone=normalizeVcardPhone(value);phone&&phones.push(phone)}}}return{name:nameFromFn??nameFromN,phones}}function normalizeVcardKey(key){let[primary]=key.split(`;`);if(!primary)return;let segments=primary.split(`.`);return segments[segments.length-1]||void 0}function cleanVcardValue(value){return value.replace(/\\n/gi,` `).replace(/\\,/g,`,`).replace(/\\;/g,`;`).trim()}function normalizeVcardName(value){return value.replace(/;/g,` `).replace(/\s+/g,` `).trim()}function normalizeVcardPhone(value){let trimmed=value.trim();return trimmed?trimmed.toLowerCase().startsWith(`tel:`)?trimmed.slice(4).trim():trimmed:``}function unwrapMessage$1(message){return normalizeMessageContent(message)}function extractContextInfo(message){if(!message)return;let contentType=getContentType(message),candidate=contentType?message[contentType]:void 0,contextInfo=candidate&&typeof candidate==`object`&&`contextInfo`in candidate?candidate.contextInfo:void 0;if(contextInfo)return contextInfo;let fallback=message.extendedTextMessage?.contextInfo??message.imageMessage?.contextInfo??message.videoMessage?.contextInfo??message.documentMessage?.contextInfo??message.audioMessage?.contextInfo??message.stickerMessage?.contextInfo??message.buttonsResponseMessage?.contextInfo??message.listResponseMessage?.contextInfo??message.templateButtonReplyMessage?.contextInfo??message.interactiveResponseMessage?.contextInfo??message.buttonsMessage?.contextInfo??message.listMessage?.contextInfo;if(fallback)return fallback;for(let value of Object.values(message)){if(!value||typeof value!=`object`||!(`contextInfo`in value))continue;let candidateContext=value.contextInfo;if(candidateContext)return candidateContext}}function extractMentionedJids(rawMessage){let message=unwrapMessage$1(rawMessage);if(!message)return;let flattened=[message.extendedTextMessage?.contextInfo?.mentionedJid,message.extendedTextMessage?.contextInfo?.quotedMessage?.extendedTextMessage?.contextInfo?.mentionedJid,message.imageMessage?.contextInfo?.mentionedJid,message.videoMessage?.contextInfo?.mentionedJid,message.documentMessage?.contextInfo?.mentionedJid,message.audioMessage?.contextInfo?.mentionedJid,message.stickerMessage?.contextInfo?.mentionedJid,message.buttonsResponseMessage?.contextInfo?.mentionedJid,message.listResponseMessage?.contextInfo?.mentionedJid].flatMap(arr=>arr??[]).filter(Boolean);if(flattened.length!==0)return Array.from(new Set(flattened))}function extractText(rawMessage){let message=unwrapMessage$1(rawMessage);if(!message)return;let extracted=extractMessageContent(message),candidates=[message,extracted&&extracted!==message?extracted:void 0];for(let candidate of candidates){if(!candidate)continue;if(typeof candidate.conversation==`string`&&candidate.conversation.trim())return candidate.conversation.trim();let extended=candidate.extendedTextMessage?.text;if(extended?.trim())return extended.trim();let caption=candidate.imageMessage?.caption??candidate.videoMessage?.caption??candidate.documentMessage?.caption;if(caption?.trim())return caption.trim()}let contactPlaceholder=extractContactPlaceholder(message)??(extracted&&extracted!==message?extractContactPlaceholder(extracted):void 0);if(contactPlaceholder)return contactPlaceholder}function extractMediaPlaceholder(rawMessage){let message=unwrapMessage$1(rawMessage);if(message){if(message.imageMessage)return`<media:image>`;if(message.videoMessage)return`<media:video>`;if(message.audioMessage)return`<media:audio>`;if(message.documentMessage)return`<media:document>`;if(message.stickerMessage)return`<media:sticker>`}}function extractContactPlaceholder(rawMessage){let message=unwrapMessage$1(rawMessage);if(!message)return;let contact=message.contactMessage??void 0;if(contact){let{name,phones}=describeContact({displayName:contact.displayName,vcard:contact.vcard});return formatContactPlaceholder(name,phones)}let contactsArray=message.contactsArrayMessage?.contacts??void 0;if(!(!contactsArray||contactsArray.length===0))return formatContactsPlaceholder(contactsArray.map(entry=>describeContact({displayName:entry.displayName,vcard:entry.vcard})).map(entry=>formatContactLabel(entry.name,entry.phones)).filter(value=>!!value),contactsArray.length)}function describeContact(input){let displayName=(input.displayName??``).trim(),parsed=parseVcard(input.vcard??void 0);return{name:displayName||parsed.name,phones:parsed.phones}}function formatContactPlaceholder(name,phones){let label=formatContactLabel(name,phones);return label?`<contact: ${label}>`:`<contact>`}function formatContactsPlaceholder(labels,total){let cleaned=labels.map(label=>label.trim()).filter(Boolean);if(cleaned.length===0)return`<contacts: ${total} ${total===1?`contact`:`contacts`}>`;let remaining=Math.max(total-cleaned.length,0),suffix=remaining>0?` +${remaining} more`:``;return`<contacts: ${cleaned.join(`, `)}${suffix}>`}function formatContactLabel(name,phones){let parts=[name,formatPhoneList(phones)].filter(value=>!!value);if(parts.length!==0)return parts.join(`, `)}function formatPhoneList(phones){let cleaned=phones?.map(phone=>phone.trim()).filter(Boolean)??[];if(cleaned.length===0)return;let{shown,remaining}=summarizeList(cleaned,cleaned.length,1),[primary]=shown;if(primary)return remaining===0?primary:`${primary} (+${remaining} more)`}function summarizeList(values,total,maxShown){let shown=values.slice(0,maxShown);return{shown,remaining:Math.max(total-shown.length,0)}}function extractLocationData(rawMessage){let message=unwrapMessage$1(rawMessage);if(!message)return null;let live=message.liveLocationMessage??void 0;if(live){let latitudeRaw=live.degreesLatitude,longitudeRaw=live.degreesLongitude;if(latitudeRaw!=null&&longitudeRaw!=null){let latitude=Number(latitudeRaw),longitude=Number(longitudeRaw);if(Number.isFinite(latitude)&&Number.isFinite(longitude))return{latitude,longitude,accuracy:live.accuracyInMeters??void 0,caption:live.caption??void 0,source:`live`,isLive:!0}}}let location=message.locationMessage??void 0;if(location){let latitudeRaw=location.degreesLatitude,longitudeRaw=location.degreesLongitude;if(latitudeRaw!=null&&longitudeRaw!=null){let latitude=Number(latitudeRaw),longitude=Number(longitudeRaw);if(Number.isFinite(latitude)&&Number.isFinite(longitude)){let isLive=!!location.isLive;return{latitude,longitude,accuracy:location.accuracyInMeters??void 0,name:location.name??void 0,address:location.address??void 0,caption:location.comment??void 0,source:isLive?`live`:location.name||location.address?`place`:`pin`,isLive}}}}return null}function describeReplyContext(rawMessage){let message=unwrapMessage$1(rawMessage);if(!message)return null;let contextInfo=extractContextInfo(message),quoted=normalizeMessageContent(contextInfo?.quotedMessage);if(!quoted)return null;let location=extractLocationData(quoted),locationText=location?formatLocationText(location):void 0,body=[extractText(quoted),locationText].filter(Boolean).join(`
|
|
1
|
+
import{i as buildAgentMainSessionKey,l as normalizeAgentId,o as buildGroupHistoryKey,r as DEFAULT_MAIN_KEY}from"./session-key-5J69DULS.js";import{f as readWebSelfId,o as getWebAuthAgeMs,r as resolveWhatsAppAccount}from"./accounts-Cy3WCbWg.js";import{$ as formatLocationText,B as recordChannelActivity,Bt as createDedupeCache,O as enqueueSystemEvent,_ as resolveInboundDebounceMs,b as hasControlCommand,bt as buildMentionRegexes,c as computeBackoff,ct as shouldAckReactionForWhatsApp,d as formatDurationPrecise,et as toLocationContext,f as readChannelAllowFromStore,g as createInboundDebouncer,l as sleepWithAbort,lt as resolveMentionGating,m as dispatchReplyWithBufferedBlockDispatcher,mt as buildHistoryContextFromEntries,n as normalizeGroupActivation,p as upsertChannelPairingRequest,pt as DEFAULT_GROUP_HISTORY_LIMIT,r as parseActivationCommand,t as getReplyFromConfig,u as buildPairingReply,v as formatInboundEnvelope,x as shouldComputeCommandAuthorized,xt as normalizeMentionText,y as resolveEnvelopeFormatOptions,yt as recordPendingHistoryEntryIfEnabled}from"./reply-V98uAjNN.js";import{A as resolveJidToE164,D as normalizeE164,E as jidToE164,F as sleep,G as shouldLogVerbose,H as logVerbose,L as toWhatsappJid,T as isSelfChatMode,Z as getChildLogger,_ as clamp,o as normalizeChatChannelId}from"./registry-CZHRcH-q.js";import{n as loadConfig}from"./config-OPdt6NPU.js";import{i as defaultRuntime,t as createSubsystemLogger}from"./subsystem-D0Ril4rt.js";import{c as resolveIdentityNamePrefix,l as resolveMessagePrefix,n as createReplyPrefixOptions}from"./reply-prefix-w7kAvH11.js";import{An as recordSessionMetaFromInbound,Br as resolveChannelGroupRequireMention,On as loadSessionStore,c as registerUnhandledRejectionHandler,cr as resolveGroupSessionKey,dn as saveMediaBuffer,jn as updateLastRoute,kn as readSessionUpdatedAt,zr as resolveChannelGroupPolicy}from"./runner-BpFNG45j.js";import{t as formatCliCommand}from"./command-format-B3XMq_73.js";import{s as resolveStorePath}from"./paths-BGOFa09I.js";import{i as convertMarkdownTables,r as setActiveWebListener}from"./active-listener-DJKMUuYe.js";import{c as getAgentScopedMediaLocalRoots,o as loadWebMedia}from"./render-W2uKhcT9.js";import{c as resolveChunkMode,i as chunkMarkdownTextWithMode,l as resolveTextChunkLimit}from"./chunk-C8sryaZi.js";import{n as resolveMarkdownTableMode}from"./markdown-tables-l6wrDFWG.js";import{t as finalizeInboundContext}from"./inbound-context-B3Yay31f.js";import{n as resolveAgentRoute,t as buildAgentSessionKey}from"./resolve-route-0sbvl4ZN.js";import{i as markdownToWhatsApp,r as sendReactionWhatsApp}from"./outbound-CEct8L7D.js";import{i as waitForWaConnection,n as formatError,r as getStatusCode,t as createWaSocket}from"./session-CU-kbVQt.js";import{randomUUID}from"node:crypto";import{getMaxListeners,setMaxListeners}from"node:events";import{DisconnectReason,downloadMediaMessage,extractMessageContent,getContentType,isJidGroup,normalizeMessageContent}from"@whiskeysockets/baileys";function getSessionRecipients(cfg){if((cfg.session?.scope??`per-sender`)===`global`)return[];let store=loadSessionStore(resolveStorePath(cfg.session?.store)),isGroupKey=key=>key.includes(`:group:`)||key.includes(`:channel:`)||key.includes(`@g.us`),isCronKey=key=>key.startsWith(`cron:`),recipients=Object.entries(store).filter(([key])=>key!==`global`&&key!==`unknown`).filter(([key])=>!isGroupKey(key)&&!isCronKey(key)).map(([_,entry])=>({to:normalizeChatChannelId(entry?.lastChannel)===`whatsapp`&&entry?.lastTo?normalizeE164(entry.lastTo):``,updatedAt:entry?.updatedAt??0})).filter(({to})=>to.length>1).toSorted((a,b)=>b.updatedAt-a.updatedAt),seen=new Set;return recipients.filter(r=>seen.has(r.to)?!1:(seen.add(r.to),!0))}function resolveWhatsAppHeartbeatRecipients(cfg,opts={}){if(opts.to)return{recipients:[normalizeE164(opts.to)],source:`flag`};let sessionRecipients=getSessionRecipients(cfg),allowFrom=Array.isArray(cfg.channels?.whatsapp?.allowFrom)&&cfg.channels.whatsapp.allowFrom.length>0?cfg.channels.whatsapp.allowFrom.filter(v=>v!==`*`).map(normalizeE164):[];return opts.all?{recipients:(list=>[...new Set(list.filter(Boolean))])([...sessionRecipients.map(s=>s.to),...allowFrom]),source:`all`}:sessionRecipients.length===1?{recipients:[sessionRecipients[0].to],source:`session-single`}:sessionRecipients.length>1?{recipients:sessionRecipients.map(s=>s.to),source:`session-ambiguous`}:{recipients:allowFrom,source:`allowFrom`}}const DEFAULT_RECONNECT_POLICY={initialMs:2e3,maxMs:3e4,factor:1.8,jitter:.25,maxAttempts:12};function resolveHeartbeatSeconds(cfg,overrideSeconds){let candidate=overrideSeconds??cfg.web?.heartbeatSeconds;return typeof candidate==`number`&&candidate>0?candidate:60}function resolveReconnectPolicy(cfg,overrides){let reconnectOverrides=cfg.web?.reconnect??{},overrideConfig=overrides??{},merged={...DEFAULT_RECONNECT_POLICY,...reconnectOverrides,...overrideConfig};return merged.initialMs=Math.max(250,merged.initialMs),merged.maxMs=Math.max(merged.initialMs,merged.maxMs),merged.factor=clamp(merged.factor,1.1,10),merged.jitter=clamp(merged.jitter,0,1),merged.maxAttempts=Math.max(0,Math.floor(merged.maxAttempts)),merged}function newConnectionId(){return randomUUID()}const whatsappLog=createSubsystemLogger(`gateway/channels/whatsapp`),whatsappInboundLog=whatsappLog.child(`inbound`),whatsappOutboundLog=whatsappLog.child(`outbound`),whatsappHeartbeatLog=whatsappLog.child(`heartbeat`);function elide(text,limit=400){return!text||text.length<=limit?text:`${text.slice(0,limit)}… (truncated ${text.length-limit} chars)`}function isLikelyWhatsAppCryptoError(reason){let haystack=(reason instanceof Error?`${reason.message}\n${reason.stack??``}`:(value=>{if(value==null)return``;if(typeof value==`string`)return value;if(value instanceof Error)return`${value.message}\n${value.stack??``}`;if(typeof value==`object`)try{return JSON.stringify(value)}catch{return Object.prototype.toString.call(value)}return typeof value==`number`||typeof value==`boolean`||typeof value==`bigint`?String(value):typeof value==`symbol`?value.description??value.toString():typeof value==`function`?value.name?`[function ${value.name}]`:`[function]`:Object.prototype.toString.call(value)})(reason)).toLowerCase();return haystack.includes(`unsupported state or unable to authenticate data`)||haystack.includes(`bad mac`)?haystack.includes(`@whiskeysockets/baileys`)||haystack.includes(`baileys`)||haystack.includes(`noise-handler`)||haystack.includes(`aesdecryptgcm`):!1}function waitForever(){return setInterval(()=>{},1e6).unref(),new Promise(()=>{})}const recentInboundMessages=createDedupeCache({ttlMs:20*6e4,maxSize:5e3});function isRecentInboundMessage(key){return recentInboundMessages.check(key)}const ALLOWED_VCARD_KEYS=new Set([`FN`,`N`,`TEL`]);function parseVcard(vcard){if(!vcard)return{phones:[]};let lines=vcard.split(/\r?\n/),nameFromN,nameFromFn,phones=[];for(let rawLine of lines){let line=rawLine.trim();if(!line)continue;let colonIndex=line.indexOf(`:`);if(colonIndex===-1)continue;let key=line.slice(0,colonIndex).toUpperCase(),rawValue=line.slice(colonIndex+1).trim();if(!rawValue)continue;let baseKey=normalizeVcardKey(key);if(!baseKey||!ALLOWED_VCARD_KEYS.has(baseKey))continue;let value=cleanVcardValue(rawValue);if(value){if(baseKey===`FN`&&!nameFromFn){nameFromFn=normalizeVcardName(value);continue}if(baseKey===`N`&&!nameFromN){nameFromN=normalizeVcardName(value);continue}if(baseKey===`TEL`){let phone=normalizeVcardPhone(value);phone&&phones.push(phone)}}}return{name:nameFromFn??nameFromN,phones}}function normalizeVcardKey(key){let[primary]=key.split(`;`);if(!primary)return;let segments=primary.split(`.`);return segments[segments.length-1]||void 0}function cleanVcardValue(value){return value.replace(/\\n/gi,` `).replace(/\\,/g,`,`).replace(/\\;/g,`;`).trim()}function normalizeVcardName(value){return value.replace(/;/g,` `).replace(/\s+/g,` `).trim()}function normalizeVcardPhone(value){let trimmed=value.trim();return trimmed?trimmed.toLowerCase().startsWith(`tel:`)?trimmed.slice(4).trim():trimmed:``}function unwrapMessage$1(message){return normalizeMessageContent(message)}function extractContextInfo(message){if(!message)return;let contentType=getContentType(message),candidate=contentType?message[contentType]:void 0,contextInfo=candidate&&typeof candidate==`object`&&`contextInfo`in candidate?candidate.contextInfo:void 0;if(contextInfo)return contextInfo;let fallback=message.extendedTextMessage?.contextInfo??message.imageMessage?.contextInfo??message.videoMessage?.contextInfo??message.documentMessage?.contextInfo??message.audioMessage?.contextInfo??message.stickerMessage?.contextInfo??message.buttonsResponseMessage?.contextInfo??message.listResponseMessage?.contextInfo??message.templateButtonReplyMessage?.contextInfo??message.interactiveResponseMessage?.contextInfo??message.buttonsMessage?.contextInfo??message.listMessage?.contextInfo;if(fallback)return fallback;for(let value of Object.values(message)){if(!value||typeof value!=`object`||!(`contextInfo`in value))continue;let candidateContext=value.contextInfo;if(candidateContext)return candidateContext}}function extractMentionedJids(rawMessage){let message=unwrapMessage$1(rawMessage);if(!message)return;let flattened=[message.extendedTextMessage?.contextInfo?.mentionedJid,message.extendedTextMessage?.contextInfo?.quotedMessage?.extendedTextMessage?.contextInfo?.mentionedJid,message.imageMessage?.contextInfo?.mentionedJid,message.videoMessage?.contextInfo?.mentionedJid,message.documentMessage?.contextInfo?.mentionedJid,message.audioMessage?.contextInfo?.mentionedJid,message.stickerMessage?.contextInfo?.mentionedJid,message.buttonsResponseMessage?.contextInfo?.mentionedJid,message.listResponseMessage?.contextInfo?.mentionedJid].flatMap(arr=>arr??[]).filter(Boolean);if(flattened.length!==0)return Array.from(new Set(flattened))}function extractText(rawMessage){let message=unwrapMessage$1(rawMessage);if(!message)return;let extracted=extractMessageContent(message),candidates=[message,extracted&&extracted!==message?extracted:void 0];for(let candidate of candidates){if(!candidate)continue;if(typeof candidate.conversation==`string`&&candidate.conversation.trim())return candidate.conversation.trim();let extended=candidate.extendedTextMessage?.text;if(extended?.trim())return extended.trim();let caption=candidate.imageMessage?.caption??candidate.videoMessage?.caption??candidate.documentMessage?.caption;if(caption?.trim())return caption.trim()}let contactPlaceholder=extractContactPlaceholder(message)??(extracted&&extracted!==message?extractContactPlaceholder(extracted):void 0);if(contactPlaceholder)return contactPlaceholder}function extractMediaPlaceholder(rawMessage){let message=unwrapMessage$1(rawMessage);if(message){if(message.imageMessage)return`<media:image>`;if(message.videoMessage)return`<media:video>`;if(message.audioMessage)return`<media:audio>`;if(message.documentMessage)return`<media:document>`;if(message.stickerMessage)return`<media:sticker>`}}function extractContactPlaceholder(rawMessage){let message=unwrapMessage$1(rawMessage);if(!message)return;let contact=message.contactMessage??void 0;if(contact){let{name,phones}=describeContact({displayName:contact.displayName,vcard:contact.vcard});return formatContactPlaceholder(name,phones)}let contactsArray=message.contactsArrayMessage?.contacts??void 0;if(!(!contactsArray||contactsArray.length===0))return formatContactsPlaceholder(contactsArray.map(entry=>describeContact({displayName:entry.displayName,vcard:entry.vcard})).map(entry=>formatContactLabel(entry.name,entry.phones)).filter(value=>!!value),contactsArray.length)}function describeContact(input){let displayName=(input.displayName??``).trim(),parsed=parseVcard(input.vcard??void 0);return{name:displayName||parsed.name,phones:parsed.phones}}function formatContactPlaceholder(name,phones){let label=formatContactLabel(name,phones);return label?`<contact: ${label}>`:`<contact>`}function formatContactsPlaceholder(labels,total){let cleaned=labels.map(label=>label.trim()).filter(Boolean);if(cleaned.length===0)return`<contacts: ${total} ${total===1?`contact`:`contacts`}>`;let remaining=Math.max(total-cleaned.length,0),suffix=remaining>0?` +${remaining} more`:``;return`<contacts: ${cleaned.join(`, `)}${suffix}>`}function formatContactLabel(name,phones){let parts=[name,formatPhoneList(phones)].filter(value=>!!value);if(parts.length!==0)return parts.join(`, `)}function formatPhoneList(phones){let cleaned=phones?.map(phone=>phone.trim()).filter(Boolean)??[];if(cleaned.length===0)return;let{shown,remaining}=summarizeList(cleaned,cleaned.length,1),[primary]=shown;if(primary)return remaining===0?primary:`${primary} (+${remaining} more)`}function summarizeList(values,total,maxShown){let shown=values.slice(0,maxShown);return{shown,remaining:Math.max(total-shown.length,0)}}function extractLocationData(rawMessage){let message=unwrapMessage$1(rawMessage);if(!message)return null;let live=message.liveLocationMessage??void 0;if(live){let latitudeRaw=live.degreesLatitude,longitudeRaw=live.degreesLongitude;if(latitudeRaw!=null&&longitudeRaw!=null){let latitude=Number(latitudeRaw),longitude=Number(longitudeRaw);if(Number.isFinite(latitude)&&Number.isFinite(longitude))return{latitude,longitude,accuracy:live.accuracyInMeters??void 0,caption:live.caption??void 0,source:`live`,isLive:!0}}}let location=message.locationMessage??void 0;if(location){let latitudeRaw=location.degreesLatitude,longitudeRaw=location.degreesLongitude;if(latitudeRaw!=null&&longitudeRaw!=null){let latitude=Number(latitudeRaw),longitude=Number(longitudeRaw);if(Number.isFinite(latitude)&&Number.isFinite(longitude)){let isLive=!!location.isLive;return{latitude,longitude,accuracy:location.accuracyInMeters??void 0,name:location.name??void 0,address:location.address??void 0,caption:location.comment??void 0,source:isLive?`live`:location.name||location.address?`place`:`pin`,isLive}}}}return null}function describeReplyContext(rawMessage){let message=unwrapMessage$1(rawMessage);if(!message)return null;let contextInfo=extractContextInfo(message),quoted=normalizeMessageContent(contextInfo?.quotedMessage);if(!quoted)return null;let location=extractLocationData(quoted),locationText=location?formatLocationText(location):void 0,body=[extractText(quoted),locationText].filter(Boolean).join(`
|
|
2
2
|
`).trim();if(body||=extractMediaPlaceholder(quoted),!body){let quotedType=quoted?getContentType(quoted):void 0;return logVerbose(`Quoted message missing extractable body${quotedType?` (type ${quotedType})`:``}`),null}let senderJid=contextInfo?.participant??void 0,senderE164=senderJid?jidToE164(senderJid)??senderJid:void 0,sender=senderE164??`unknown sender`;return{id:contextInfo?.stanzaId?String(contextInfo.stanzaId):void 0,body,sender,senderJid,senderE164}}async function checkInboundAccessControl(params){let cfg=loadConfig(),account=resolveWhatsAppAccount({cfg,accountId:params.accountId}),dmPolicy=account.dmPolicy??`pairing`,configuredAllowFrom=account.allowFrom,storeAllowFrom=await readChannelAllowFromStore(`whatsapp`,process.env,account.accountId).catch(()=>[]),combinedAllowFrom=Array.from(new Set([...configuredAllowFrom??[],...storeAllowFrom])),defaultAllowFrom=combinedAllowFrom.length===0&¶ms.selfE164?[params.selfE164]:void 0,allowFrom=combinedAllowFrom.length>0?combinedAllowFrom:defaultAllowFrom,groupAllowFrom=account.groupAllowFrom??(configuredAllowFrom&&configuredAllowFrom.length>0?configuredAllowFrom:void 0),isSamePhone=params.from===params.selfE164,isSelfChat=isSelfChatMode(params.selfE164,configuredAllowFrom),pairingGraceMs=typeof params.pairingGraceMs==`number`&¶ms.pairingGraceMs>0?params.pairingGraceMs:3e4,suppressPairingReply=typeof params.connectedAtMs==`number`&&typeof params.messageTimestampMs==`number`&¶ms.messageTimestampMs<params.connectedAtMs-pairingGraceMs,dmHasWildcard=allowFrom?.includes(`*`)??!1,normalizedAllowFrom=allowFrom&&allowFrom.length>0?allowFrom.filter(entry=>entry!==`*`).map(normalizeE164):[],groupHasWildcard=groupAllowFrom?.includes(`*`)??!1,normalizedGroupAllowFrom=groupAllowFrom&&groupAllowFrom.length>0?groupAllowFrom.filter(entry=>entry!==`*`).map(normalizeE164):[],defaultGroupPolicy=cfg.channels?.defaults?.groupPolicy,groupPolicy=account.groupPolicy??defaultGroupPolicy??`open`;if(params.group&&groupPolicy===`disabled`)return logVerbose(`Blocked group message (groupPolicy: disabled)`),{allowed:!1,shouldMarkRead:!1,isSelfChat,resolvedAccountId:account.accountId};if(params.group&&groupPolicy===`allowlist`){if(!groupAllowFrom||groupAllowFrom.length===0)return logVerbose(`Blocked group message (groupPolicy: allowlist, no groupAllowFrom)`),{allowed:!1,shouldMarkRead:!1,isSelfChat,resolvedAccountId:account.accountId};if(!(groupHasWildcard||params.senderE164!=null&&normalizedGroupAllowFrom.includes(params.senderE164)))return logVerbose(`Blocked group message from ${params.senderE164??`unknown sender`} (groupPolicy: allowlist)`),{allowed:!1,shouldMarkRead:!1,isSelfChat,resolvedAccountId:account.accountId}}if(!params.group){if(params.isFromMe&&!isSamePhone)return logVerbose(`Skipping outbound DM (fromMe); no pairing reply needed.`),{allowed:!1,shouldMarkRead:!1,isSelfChat,resolvedAccountId:account.accountId};if(dmPolicy===`disabled`)return logVerbose(`Blocked dm (dmPolicy: disabled)`),{allowed:!1,shouldMarkRead:!1,isSelfChat,resolvedAccountId:account.accountId};if(dmPolicy!==`open`&&!isSamePhone){let candidate=params.from;if(!(dmHasWildcard||normalizedAllowFrom.length>0&&normalizedAllowFrom.includes(candidate))){if(dmPolicy===`pairing`)if(suppressPairingReply)logVerbose(`Skipping pairing reply for historical DM from ${candidate}.`);else{let{code,created}=await upsertChannelPairingRequest({channel:`whatsapp`,id:candidate,accountId:account.accountId,meta:{name:(params.pushName??``).trim()||void 0}});if(created){logVerbose(`whatsapp pairing request sender=${candidate} name=${params.pushName??`unknown`}`);try{await params.sock.sendMessage(params.remoteJid,{text:buildPairingReply({channel:`whatsapp`,idLine:`Your WhatsApp phone number: ${candidate}`,code})})}catch(err){logVerbose(`whatsapp pairing reply failed for ${candidate}: ${String(err)}`)}}}else logVerbose(`Blocked unauthorized sender ${candidate} (dmPolicy=${dmPolicy})`);return{allowed:!1,shouldMarkRead:!1,isSelfChat,resolvedAccountId:account.accountId}}}}return{allowed:!0,shouldMarkRead:!0,isSelfChat,resolvedAccountId:account.accountId}}function unwrapMessage(message){return normalizeMessageContent(message)}function resolveMediaMimetype(message){let explicit=message.imageMessage?.mimetype??message.videoMessage?.mimetype??message.documentMessage?.mimetype??message.audioMessage?.mimetype??message.stickerMessage?.mimetype??void 0;if(explicit)return explicit;if(message.audioMessage)return`audio/ogg; codecs=opus`;if(message.imageMessage)return`image/jpeg`;if(message.videoMessage)return`video/mp4`;if(message.stickerMessage)return`image/webp`}async function downloadInboundMedia(msg,sock){let message=unwrapMessage(msg.message);if(!message)return;let mimetype=resolveMediaMimetype(message),fileName=message.documentMessage?.fileName??void 0;if(!(!message.imageMessage&&!message.videoMessage&&!message.documentMessage&&!message.audioMessage&&!message.stickerMessage))try{return{buffer:await downloadMediaMessage(msg,`buffer`,{},{reuploadRequest:sock.updateMediaMessage,logger:sock.logger}),mimetype,fileName}}catch(err){logVerbose(`downloadMediaMessage failed: ${String(err)}`);return}}function recordWhatsAppOutbound(accountId){recordChannelActivity({channel:`whatsapp`,accountId,direction:`outbound`})}function resolveOutboundMessageId(result){return typeof result==`object`&&result&&`key`in result?String(result.key?.id??`unknown`):`unknown`}function createWebSendApi(params){return{sendMessage:async(to,text,mediaBuffer,mediaType,sendOptions)=>{let jid=toWhatsappJid(to),payload;if(mediaBuffer&&mediaType)if(mediaType.startsWith(`image/`))payload={image:mediaBuffer,caption:text||void 0,mimetype:mediaType};else if(mediaType.startsWith(`audio/`))payload={audio:mediaBuffer,ptt:!0,mimetype:mediaType};else if(mediaType.startsWith(`video/`)){let gifPlayback=sendOptions?.gifPlayback;payload={video:mediaBuffer,caption:text||void 0,mimetype:mediaType,...gifPlayback?{gifPlayback:!0}:{}}}else payload={document:mediaBuffer,fileName:sendOptions?.fileName?.trim()||`file`,caption:text||void 0,mimetype:mediaType};else payload={text};let result=await params.sock.sendMessage(jid,payload);return recordWhatsAppOutbound(sendOptions?.accountId??params.defaultAccountId),{messageId:resolveOutboundMessageId(result)}},sendPoll:async(to,poll)=>{let jid=toWhatsappJid(to),result=await params.sock.sendMessage(jid,{poll:{name:poll.question,values:poll.options,selectableCount:poll.maxSelections??1}});return recordWhatsAppOutbound(params.defaultAccountId),{messageId:resolveOutboundMessageId(result)}},sendReaction:async(chatJid,messageId,emoji,fromMe,participant)=>{let jid=toWhatsappJid(chatJid);await params.sock.sendMessage(jid,{react:{text:emoji,key:{remoteJid:jid,id:messageId,fromMe,participant:participant?toWhatsappJid(participant):void 0}}})},sendComposingTo:async to=>{let jid=toWhatsappJid(to);await params.sock.sendPresenceUpdate(`composing`,jid)}}}async function monitorWebInbox(options){let inboundLogger=getChildLogger({module:`web-inbound`}),inboundConsoleLog=createSubsystemLogger(`gateway/channels/whatsapp`).child(`inbound`),sock=await createWaSocket(!1,options.verbose,{authDir:options.authDir});await waitForWaConnection(sock);let connectedAtMs=Date.now(),onCloseResolve=null,onClose=new Promise(resolve=>{onCloseResolve=resolve}),resolveClose=reason=>{if(!onCloseResolve)return;let resolver=onCloseResolve;onCloseResolve=null,resolver(reason)};try{await sock.sendPresenceUpdate(`available`),shouldLogVerbose()&&logVerbose(`Sent global 'available' presence on connect`)}catch(err){logVerbose(`Failed to send 'available' presence on connect: ${String(err)}`)}let selfJid=sock.user?.id,selfE164=selfJid?jidToE164(selfJid):null,debouncer=createInboundDebouncer({debounceMs:options.debounceMs??0,buildKey:msg=>{let senderKey=msg.chatType===`group`?msg.senderJid??msg.senderE164??msg.senderName??msg.from:msg.from;if(!senderKey)return null;let conversationKey=msg.chatType===`group`?msg.chatId:msg.from;return`${msg.accountId}:${conversationKey}:${senderKey}`},shouldDebounce:options.shouldDebounce,onFlush:async entries=>{let last=entries.at(-1);if(!last)return;if(entries.length===1){await options.onMessage(last);return}let mentioned=new Set;for(let entry of entries)for(let jid of entry.mentionedJids??[])mentioned.add(jid);let combinedBody=entries.map(entry=>entry.body).filter(Boolean).join(`
|
|
3
3
|
`),combinedMessage={...last,body:combinedBody,mentionedJids:mentioned.size>0?Array.from(mentioned):void 0};await options.onMessage(combinedMessage)},onError:err=>{inboundLogger.error({error:String(err)},`failed handling inbound web message`),inboundConsoleLog.error(`Failed handling inbound web message: ${String(err)}`)}}),groupMetaCache=new Map,GROUP_META_TTL_MS=300*1e3,lidLookup=sock.signalRepository?.lidMapping,resolveInboundJid=async jid=>resolveJidToE164(jid,{authDir:options.authDir,lidLookup}),getGroupMeta=async jid=>{let cached=groupMetaCache.get(jid);if(cached&&cached.expires>Date.now())return cached;try{let meta=await sock.groupMetadata(jid),participants=(await Promise.all(meta.participants?.map(async p=>await resolveInboundJid(p.id)??p.id)??[])).filter(Boolean)??[],entry={subject:meta.subject,participants,expires:Date.now()+GROUP_META_TTL_MS};return groupMetaCache.set(jid,entry),entry}catch(err){return logVerbose(`Failed to fetch group metadata for ${jid}: ${String(err)}`),{expires:Date.now()+GROUP_META_TTL_MS}}},handleMessagesUpsert=async upsert=>{if(!(upsert.type!==`notify`&&upsert.type!==`append`))for(let msg of upsert.messages??[]){recordChannelActivity({channel:`whatsapp`,accountId:options.accountId,direction:`inbound`});let id=msg.key?.id??void 0,remoteJid=msg.key?.remoteJid;if(!remoteJid||remoteJid.endsWith(`@status`)||remoteJid.endsWith(`@broadcast`))continue;let group=isJidGroup(remoteJid)===!0;if(id&&isRecentInboundMessage(`${options.accountId}:${remoteJid}:${id}`))continue;let participantJid=msg.key?.participant??void 0,from=group?remoteJid:await resolveInboundJid(remoteJid);if(!from)continue;let senderE164=group?participantJid?await resolveInboundJid(participantJid):null:from,groupSubject,groupParticipants;if(group){let meta=await getGroupMeta(remoteJid);groupSubject=meta.subject,groupParticipants=meta.participants}let messageTimestampMs=msg.messageTimestamp?Number(msg.messageTimestamp)*1e3:void 0,access=await checkInboundAccessControl({accountId:options.accountId,from,selfE164,senderE164,group,pushName:msg.pushName??void 0,isFromMe:!!msg.key?.fromMe,messageTimestampMs,connectedAtMs,sock:{sendMessage:(jid,content)=>sock.sendMessage(jid,content)},remoteJid});if(!access.allowed)continue;if(id&&!access.isSelfChat&&options.sendReadReceipts!==!1){let participant=msg.key?.participant;try{await sock.readMessages([{remoteJid,id,participant,fromMe:!1}]),shouldLogVerbose()&&logVerbose(`Marked message ${id} as read for ${remoteJid}${participant?` (participant ${participant})`:``}`)}catch(err){logVerbose(`Failed to mark message ${id} read: ${String(err)}`)}}else id&&access.isSelfChat&&shouldLogVerbose()&&logVerbose(`Self-chat mode: skipping read receipt for ${id}`);if(upsert.type===`append`)continue;let location=extractLocationData(msg.message??void 0),locationText=location?formatLocationText(location):void 0,body=extractText(msg.message??void 0);if(locationText&&(body=[body,locationText].filter(Boolean).join(`
|
|
4
4
|
`).trim()),!body&&(body=extractMediaPlaceholder(msg.message??void 0),!body))continue;let replyContext=describeReplyContext(msg.message),mediaPath,mediaType,mediaFileName;try{let inboundMedia=await downloadInboundMedia(msg,sock);if(inboundMedia){let maxBytes=(typeof options.mediaMaxMb==`number`&&options.mediaMaxMb>0?options.mediaMaxMb:50)*1024*1024;mediaPath=(await saveMediaBuffer(inboundMedia.buffer,inboundMedia.mimetype,`inbound`,maxBytes,inboundMedia.fileName)).path,mediaType=inboundMedia.mimetype,mediaFileName=inboundMedia.fileName}}catch(err){logVerbose(`Inbound media download failed: ${String(err)}`)}let chatJid=remoteJid,sendComposing=async()=>{try{await sock.sendPresenceUpdate(`composing`,chatJid)}catch(err){logVerbose(`Presence update failed: ${String(err)}`)}},reply=async text=>{await sock.sendMessage(chatJid,{text})},sendMedia=async payload=>{await sock.sendMessage(chatJid,payload)},timestamp=messageTimestampMs,mentionedJids=extractMentionedJids(msg.message),senderName=msg.pushName??void 0;inboundLogger.info({from,to:selfE164??`me`,body,mediaPath,mediaType,mediaFileName,timestamp},`inbound message`);let inboundMessage={id,from,conversationId:from,to:selfE164??`me`,accountId:access.resolvedAccountId,body,pushName:senderName,timestamp,chatType:group?`group`:`direct`,chatId:remoteJid,senderJid:participantJid,senderE164:senderE164??void 0,senderName,replyToId:replyContext?.id,replyToBody:replyContext?.body,replyToSender:replyContext?.sender,replyToSenderJid:replyContext?.senderJid,replyToSenderE164:replyContext?.senderE164,groupSubject,groupParticipants,mentionedJids:mentionedJids??void 0,selfJid,selfE164,location:location??void 0,sendComposing,reply,sendMedia,mediaPath,mediaType,mediaFileName};try{Promise.resolve(debouncer.enqueue(inboundMessage)).catch(err=>{inboundLogger.error({error:String(err)},`failed handling inbound web message`),inboundConsoleLog.error(`Failed handling inbound web message: ${String(err)}`)})}catch(err){inboundLogger.error({error:String(err)},`failed handling inbound web message`),inboundConsoleLog.error(`Failed handling inbound web message: ${String(err)}`)}}};sock.ev.on(`messages.upsert`,handleMessagesUpsert);let handleConnectionUpdate=update=>{try{if(update.connection===`close`){let status=getStatusCode(update.lastDisconnect?.error);resolveClose({status,isLoggedOut:status===DisconnectReason.loggedOut,error:update.lastDisconnect?.error})}}catch(err){inboundLogger.error({error:String(err)},`connection.update handler error`),resolveClose({status:void 0,isLoggedOut:!1,error:err})}};return sock.ev.on(`connection.update`,handleConnectionUpdate),{close:async()=>{try{let ev=sock.ev,messagesUpsertHandler=handleMessagesUpsert,connectionUpdateHandler=handleConnectionUpdate;typeof ev.off==`function`?(ev.off(`messages.upsert`,messagesUpsertHandler),ev.off(`connection.update`,connectionUpdateHandler)):typeof ev.removeListener==`function`&&(ev.removeListener(`messages.upsert`,messagesUpsertHandler),ev.removeListener(`connection.update`,connectionUpdateHandler)),sock.ws?.close()}catch(err){logVerbose(`Socket close failed: ${String(err)}`)}},onClose,signalClose:reason=>{resolveClose(reason??{status:void 0,isLoggedOut:!1,error:`closed`})},...createWebSendApi({sock:{sendMessage:(jid,content)=>sock.sendMessage(jid,content),sendPresenceUpdate:(presence,jid)=>sock.sendPresenceUpdate(presence,jid)},defaultAccountId:options.accountId})}}function buildMentionConfig(cfg,agentId){return{mentionRegexes:buildMentionRegexes(cfg,agentId),allowFrom:cfg.channels?.whatsapp?.allowFrom}}function resolveMentionTargets(msg,authDir){let jidOptions=authDir?{authDir}:void 0;return{normalizedMentions:msg.mentionedJids?.length?msg.mentionedJids.map(jid=>jidToE164(jid,jidOptions)??jid).filter(Boolean):[],selfE164:msg.selfE164??(msg.selfJid?jidToE164(msg.selfJid,jidOptions):null),selfJid:msg.selfJid?msg.selfJid.replace(/:\\d+/,``):null}}function isBotMentionedFromTargets(msg,mentionCfg,targets){let clean=text=>normalizeMentionText(text),isSelfChat=isSelfChatMode(targets.selfE164,mentionCfg.allowFrom);if((msg.mentionedJids?.length??0)>0&&!isSelfChat)return!!(targets.selfE164&&targets.normalizedMentions.includes(targets.selfE164)||targets.selfJid&&targets.normalizedMentions.includes(targets.selfJid));let bodyClean=clean(msg.body);if(mentionCfg.mentionRegexes.some(re=>re.test(bodyClean)))return!0;if(targets.selfE164){let selfDigits=targets.selfE164.replace(/\D/g,``);if(selfDigits){if(bodyClean.replace(/[^\d]/g,``).includes(selfDigits))return!0;let bodyNoSpace=msg.body.replace(/[\s-]/g,``);if(RegExp(`\\+?${selfDigits}`,`i`).test(bodyNoSpace))return!0}}return!1}function debugMention(msg,mentionCfg,authDir){let mentionTargets=resolveMentionTargets(msg,authDir);return{wasMentioned:isBotMentionedFromTargets(msg,mentionCfg,mentionTargets),details:{from:msg.from,body:msg.body,bodyClean:normalizeMentionText(msg.body),mentionedJids:msg.mentionedJids??null,normalizedMentionedJids:mentionTargets.normalizedMentions.length?mentionTargets.normalizedMentions:null,selfJid:msg.selfJid??null,selfJidBare:mentionTargets.selfJid,selfE164:msg.selfE164??null,resolvedSelfE164:mentionTargets.selfE164}}}function resolveOwnerList(mentionCfg,selfE164){let allowFrom=mentionCfg.allowFrom;return(Array.isArray(allowFrom)&&allowFrom.length>0?allowFrom:selfE164?[selfE164]:[]).filter(entry=>!!(entry&&entry!==`*`)).map(entry=>normalizeE164(entry)).filter(entry=>!!entry)}function createEchoTracker(params){let recentlySent=new Set,maxItems=Math.max(1,params.maxItems??100),buildCombinedKey=p=>`combined:${p.sessionKey}:${p.combinedBody}`,trim=()=>{for(;recentlySent.size>maxItems;){let firstKey=recentlySent.values().next().value;if(!firstKey)break;recentlySent.delete(firstKey)}};return{rememberText:(text,opts)=>{text&&(recentlySent.add(text),opts.combinedBody&&opts.combinedBodySessionKey&&recentlySent.add(buildCombinedKey({sessionKey:opts.combinedBodySessionKey,combinedBody:opts.combinedBody})),opts.logVerboseMessage&¶ms.logVerbose?.(`Added to echo detection set (size now: ${recentlySent.size}): ${text.substring(0,50)}...`),trim())},has:key=>recentlySent.has(key),forget:key=>{recentlySent.delete(key)},buildCombinedKey}}async function maybeBroadcastMessage(params){let broadcastAgents=params.cfg.broadcast?.[params.peerId];if(!broadcastAgents||!Array.isArray(broadcastAgents)||broadcastAgents.length===0)return!1;let strategy=params.cfg.broadcast?.strategy||`parallel`;whatsappInboundLog.info(`Broadcasting message to ${broadcastAgents.length} agents (${strategy})`);let agentIds=params.cfg.agents?.list?.map(agent=>normalizeAgentId(agent.id)),hasKnownAgents=(agentIds?.length??0)>0,groupHistorySnapshot=params.msg.chatType===`group`?params.groupHistories.get(params.groupHistoryKey)??[]:void 0,processForAgent=async agentId=>{let normalizedAgentId=normalizeAgentId(agentId);if(hasKnownAgents&&!agentIds?.includes(normalizedAgentId))return whatsappInboundLog.warn(`Broadcast agent ${agentId} not found in agents.list; skipping`),!1;let agentRoute={...params.route,agentId:normalizedAgentId,sessionKey:buildAgentSessionKey({agentId:normalizedAgentId,channel:`whatsapp`,accountId:params.route.accountId,peer:{kind:params.msg.chatType===`group`?`group`:`direct`,id:params.peerId},dmScope:params.cfg.session?.dmScope,identityLinks:params.cfg.session?.identityLinks}),mainSessionKey:buildAgentMainSessionKey({agentId:normalizedAgentId,mainKey:DEFAULT_MAIN_KEY})};try{return await params.processMessage(params.msg,agentRoute,params.groupHistoryKey,{groupHistory:groupHistorySnapshot,suppressGroupHistoryClear:!0})}catch(err){return whatsappInboundLog.error(`Broadcast agent ${agentId} failed: ${formatError(err)}`),!1}};if(strategy===`sequential`)for(let agentId of broadcastAgents)await processForAgent(agentId);else await Promise.allSettled(broadcastAgents.map(processForAgent));return params.msg.chatType===`group`&¶ms.groupHistories.set(params.groupHistoryKey,[]),!0}function stripMentionsForCommand(text,mentionRegexes,selfE164){let result=text;for(let re of mentionRegexes)result=result.replace(re,` `);if(selfE164){let digits=selfE164.replace(/\D/g,``);if(digits){let pattern=RegExp(`\\+?${digits}`,`g`);result=result.replace(pattern,` `)}}return result.replace(/\s+/g,` `).trim()}function resolveGroupPolicyFor(cfg,conversationId){let groupId=resolveGroupSessionKey({From:conversationId,ChatType:`group`,Provider:`whatsapp`})?.id;return resolveChannelGroupPolicy({cfg,channel:`whatsapp`,groupId:groupId??conversationId})}function resolveGroupRequireMentionFor(cfg,conversationId){let groupId=resolveGroupSessionKey({From:conversationId,ChatType:`group`,Provider:`whatsapp`})?.id;return resolveChannelGroupRequireMention({cfg,channel:`whatsapp`,groupId:groupId??conversationId})}function resolveGroupActivationFor(params){let entry=loadSessionStore(resolveStorePath(params.cfg.session?.store,{agentId:params.agentId}))[params.sessionKey],defaultActivation=resolveGroupRequireMentionFor(params.cfg,params.conversationId)?`mention`:`always`;return normalizeGroupActivation(entry?.groupActivation)??defaultActivation}function noteGroupMember(groupMemberNames,conversationId,e164,name){if(!e164||!name)return;let key=normalizeE164(e164)??e164;if(!key)return;let roster=groupMemberNames.get(conversationId);roster||(roster=new Map,groupMemberNames.set(conversationId,roster)),roster.set(key,name)}function formatGroupMembers(params){let{participants,roster,fallbackE164}=params,seen=new Set,ordered=[];if(participants?.length)for(let entry of participants){if(!entry)continue;let normalized=normalizeE164(entry)??entry;!normalized||seen.has(normalized)||(seen.add(normalized),ordered.push(normalized))}if(roster)for(let entry of roster.keys()){let normalized=normalizeE164(entry)??entry;!normalized||seen.has(normalized)||(seen.add(normalized),ordered.push(normalized))}if(ordered.length===0&&fallbackE164){let normalized=normalizeE164(fallbackE164)??fallbackE164;normalized&&ordered.push(normalized)}if(ordered.length!==0)return ordered.map(entry=>{let name=roster?.get(entry);return name?`${name} (${entry})`:entry}).join(`, `)}function isOwnerSender(baseMentionConfig,msg){let sender=normalizeE164(msg.senderE164??``);return sender?resolveOwnerList(baseMentionConfig,msg.selfE164??void 0).includes(sender):!1}function recordPendingGroupHistoryEntry(params){let sender=params.msg.senderName&¶ms.msg.senderE164?`${params.msg.senderName} (${params.msg.senderE164})`:params.msg.senderName??params.msg.senderE164??`Unknown`;recordPendingHistoryEntryIfEnabled({historyMap:params.groupHistories,historyKey:params.groupHistoryKey,limit:params.groupHistoryLimit,entry:{sender,body:params.msg.body,timestamp:params.msg.timestamp,id:params.msg.id,senderJid:params.msg.senderJid}})}function applyGroupGating(params){let groupPolicy=resolveGroupPolicyFor(params.cfg,params.conversationId);if(groupPolicy.allowlistEnabled&&!groupPolicy.allowed)return params.logVerbose(`Skipping group message ${params.conversationId} (not in allowlist)`),{shouldProcess:!1};noteGroupMember(params.groupMemberNames,params.groupHistoryKey,params.msg.senderE164,params.msg.senderName);let mentionConfig=buildMentionConfig(params.cfg,params.agentId),commandBody=stripMentionsForCommand(params.msg.body,mentionConfig.mentionRegexes,params.msg.selfE164),activationCommand=parseActivationCommand(commandBody),owner=isOwnerSender(params.baseMentionConfig,params.msg),shouldBypassMention=owner&&hasControlCommand(commandBody,params.cfg);if(activationCommand.hasCommand&&!owner)return params.logVerbose(`Ignoring /activation from non-owner in group ${params.conversationId}`),recordPendingGroupHistoryEntry({msg:params.msg,groupHistories:params.groupHistories,groupHistoryKey:params.groupHistoryKey,groupHistoryLimit:params.groupHistoryLimit}),{shouldProcess:!1};let mentionDebug=debugMention(params.msg,mentionConfig,params.authDir);params.replyLogger.debug({conversationId:params.conversationId,wasMentioned:mentionDebug.wasMentioned,...mentionDebug.details},`group mention debug`);let wasMentioned=mentionDebug.wasMentioned,requireMention=resolveGroupActivationFor({cfg:params.cfg,agentId:params.agentId,sessionKey:params.sessionKey,conversationId:params.conversationId})!==`always`,selfJid=params.msg.selfJid?.replace(/:\\d+/,``),replySenderJid=params.msg.replyToSenderJid?.replace(/:\\d+/,``),selfE164=params.msg.selfE164?normalizeE164(params.msg.selfE164):null,replySenderE164=params.msg.replyToSenderE164?normalizeE164(params.msg.replyToSenderE164):null,mentionGate=resolveMentionGating({requireMention,canDetectMention:!0,wasMentioned,implicitMention:!!(selfJid&&replySenderJid&&selfJid===replySenderJid||selfE164&&replySenderE164&&selfE164===replySenderE164),shouldBypassMention});return params.msg.wasMentioned=mentionGate.effectiveWasMentioned,!shouldBypassMention&&requireMention&&mentionGate.shouldSkip?(params.logVerbose(`Group message stored for context (no mention detected) in ${params.conversationId}: ${params.msg.body}`),recordPendingGroupHistoryEntry({msg:params.msg,groupHistories:params.groupHistories,groupHistoryKey:params.groupHistoryKey,groupHistoryLimit:params.groupHistoryLimit}),{shouldProcess:!1}):{shouldProcess:!0}}function trackBackgroundTask(backgroundTasks,task){backgroundTasks.add(task),task.finally(()=>{backgroundTasks.delete(task)})}function updateLastRouteInBackground(params){let storePath=resolveStorePath(params.cfg.session?.store,{agentId:params.storeAgentId}),task=updateLastRoute({storePath,sessionKey:params.sessionKey,deliveryContext:{channel:params.channel,to:params.to,accountId:params.accountId},ctx:params.ctx}).catch(err=>{params.warn({error:formatError(err),storePath,sessionKey:params.sessionKey,to:params.to},`failed updating last route`)});trackBackgroundTask(params.backgroundTasks,task)}function resolvePeerId(msg){return msg.chatType===`group`?msg.conversationId??msg.from:msg.senderE164?normalizeE164(msg.senderE164)??msg.senderE164:msg.from.includes(`@`)?jidToE164(msg.from)??msg.from:normalizeE164(msg.from)??msg.from}async function deliverWebReply(params){let{replyResult,msg,maxMediaBytes,textLimit,replyLogger,connectionId,skipLog}=params,replyStarted=Date.now(),tableMode=params.tableMode??`code`,chunkMode=params.chunkMode??`length`,textChunks=chunkMarkdownTextWithMode(markdownToWhatsApp(convertMarkdownTables(replyResult.text||``,tableMode)),textLimit,chunkMode),mediaList=replyResult.mediaUrls?.length?replyResult.mediaUrls:replyResult.mediaUrl?[replyResult.mediaUrl]:[],sendWithRetry=async(fn,label,maxAttempts=3)=>{let lastErr;for(let attempt=1;attempt<=maxAttempts;attempt++)try{return await fn()}catch(err){lastErr=err;let errText=formatError(err),isLast=attempt===maxAttempts;if(!/closed|reset|timed\\s*out|disconnect/i.test(errText)||isLast)throw err;let backoffMs=500*attempt;logVerbose(`Retrying ${label} to ${msg.from} after failure (${attempt}/${maxAttempts-1}) in ${backoffMs}ms: ${errText}`),await sleep(backoffMs)}throw lastErr};if(mediaList.length===0&&textChunks.length){let totalChunks=textChunks.length;for(let[index,chunk]of textChunks.entries()){let chunkStarted=Date.now();if(await sendWithRetry(()=>msg.reply(chunk),`text`),!skipLog){let durationMs=Date.now()-chunkStarted;whatsappOutboundLog.debug(`Sent chunk ${index+1}/${totalChunks} to ${msg.from} (${durationMs.toFixed(0)}ms)`)}}replyLogger.info({correlationId:msg.id??newConnectionId(),connectionId:connectionId??null,to:msg.from,from:msg.to,text:elide(replyResult.text,240),mediaUrl:null,mediaSizeBytes:null,mediaKind:null,durationMs:Date.now()-replyStarted},`auto-reply sent (text)`);return}let remainingText=[...textChunks];for(let[index,mediaUrl]of mediaList.entries()){let caption=index===0&&remainingText.shift()||void 0;try{let media=await loadWebMedia(mediaUrl,{maxBytes:maxMediaBytes,localRoots:params.mediaLocalRoots});if(shouldLogVerbose()&&(logVerbose(`Web auto-reply media size: ${(media.buffer.length/(1024*1024)).toFixed(2)}MB`),logVerbose(`Web auto-reply media source: ${mediaUrl} (kind ${media.kind})`)),media.kind===`image`)await sendWithRetry(()=>msg.sendMedia({image:media.buffer,caption,mimetype:media.contentType}),`media:image`);else if(media.kind===`audio`)await sendWithRetry(()=>msg.sendMedia({audio:media.buffer,ptt:!0,mimetype:media.contentType,caption}),`media:audio`);else if(media.kind===`video`)await sendWithRetry(()=>msg.sendMedia({video:media.buffer,caption,mimetype:media.contentType}),`media:video`);else{let fileName=media.fileName??mediaUrl.split(`/`).pop()??`file`,mimetype=media.contentType??`application/octet-stream`;await sendWithRetry(()=>msg.sendMedia({document:media.buffer,fileName,caption,mimetype}),`media:document`)}whatsappOutboundLog.info(`Sent media reply to ${msg.from} (${(media.buffer.length/(1024*1024)).toFixed(2)}MB)`),replyLogger.info({correlationId:msg.id??newConnectionId(),connectionId:connectionId??null,to:msg.from,from:msg.to,text:caption??null,mediaUrl,mediaSizeBytes:media.buffer.length,mediaKind:media.kind,durationMs:Date.now()-replyStarted},`auto-reply sent (media)`)}catch(err){if(whatsappOutboundLog.error(`Failed sending web media to ${msg.from}: ${formatError(err)}`),replyLogger.warn({err,mediaUrl},`failed to send web media reply`),index===0){let warning=err instanceof Error?`⚠️ Media failed: ${err.message}`:`⚠️ Media failed.`,fallbackText=[remainingText.shift()??caption??``,warning].filter(Boolean).join(`
|
package/dist/plugin-sdk/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{c as normalizeAccountId,t as DEFAULT_ACCOUNT_ID}from"./session-key-5J69DULS.js";import{_ as createAccountListHelpers,i as resolveWhatsAppAuthDir,n as resolveDefaultWhatsAppAccountId,r as resolveWhatsAppAccount,t as listWhatsAppAccountIds}from"./accounts-Cy3WCbWg.js";import{$ as formatLocationText,$t as registerPluginHttpRoute,A as resolveSlackChannelAllowlist,At as isWSLEnv,Bt as createDedupeCache,C as hasMarkdownToConvert,Ct as resolveAllowlistMatchSimple,D as attachFooterText,Dt as resolveChannelEntryMatchWithFallback,E as createReceiptCard,Et as resolveChannelEntryMatch,F as resolveServicePrefixedTarget,Ft as installRequestBodyLimitGuard,G as onDiagnosticEvent,Gt as readJsonFile,H as normalizeDiscordSlug,Ht as pruneExpiredPending,I as detectBinary,It as isRequestBodyLimitError,J as formatDocsLink,Jt as readJsonFileWithFallback,K as missingTargetError,Kt as writeJsonAtomic,L as resolveDiscordUserAllowlist,Lt as readJsonBodyWithLimit,M as parseChatAllowTargetPrefixes,Mt as DEFAULT_WEBHOOK_BODY_TIMEOUT_MS,N as parseChatTargetPrefixesOrThrow,Nt as DEFAULT_WEBHOOK_MAX_BODY_BYTES,Ot as resolveNestedAllowlistDecision,P as resolveServicePrefixedAllowTarget,Pt as RequestBodyLimitError,Q as resolveControlCommandGate,Qt as isAllowedParsedChatSender,R as resolveDiscordChannelAllowlist,Rt as readRequestBodyWithLimit,St as formatAllowlistMatchMeta,T as stripMarkdown,Tt as normalizeChannelSlug,U as emitDiagnosticEvent,Ut as resolvePairingPaths,V as parseDiscordTarget,Vt as generatePairingToken,W as isDiagnosticsEnabled,Wt as createAsyncLock,X as stringEnum,Xt as extractToolSend,Y as optionalStringEnum,Yt as writeJsonFileAtomically,Z as recordInboundSession,Zt as formatAllowFromLowercase,_t as clearHistoryEntriesIfEnabled,a as normalizeAccountId$1,at as createTypingCallbacks,ct as shouldAckReactionForWhatsApp,dt as mergeAllowlist,en as BLUEBUBBLES_ACTIONS,et as toLocationContext,ft as summarizeMapping,gt as clearHistoryEntries,ht as buildPendingHistoryContextFromMap,i as listLineAccountIds,it as logTypingFailure,j as normalizeIMessageHandle,jt as isWSLSync,k as resolveSlackUserAllowlist,kt as isWSL2Sync,lt as resolveMentionGating,nn as BLUEBUBBLES_GROUP_ACTIONS,nt as logAckFailure,o as resolveDefaultLineAccountId,ot as removeAckReactionAfterReply,pt as DEFAULT_GROUP_HISTORY_LIMIT,q as registerPluginHooksFromDir,qt as normalizeDeviceAuthScopes,rn as CHANNEL_MESSAGE_ACTION_NAMES,rt as logInboundDrop,s as resolveLineAccount,st as shouldAckReaction,tn as BLUEBUBBLES_ACTION_NAMES,tt as resolveChannelMediaMaxBytes,ut as resolveMentionGatingWithBypass,vt as recordPendingHistoryEntry,w as processLineMessage,wt as buildChannelKeyCandidates,yt as recordPendingHistoryEntryIfEnabled,z as collectDiscordAuditChannelIds,zt as requestBodyErrorToText}from"./reply-DkmZ32IH.js";import{D as normalizeE164,F as sleep,M as safeParseJson,O as pathExists,_ as clamp,g as CONFIG_DIR,lt as normalizePluginHttpPath,r as getChatChannelMeta,tt as registerLogTransport,w as isRecord,x as escapeRegExp}from"./registry-CZHRcH-q.js";import"./paths-Cb8zTlyG.js";import{dt as withFileLock,ut as acquireFileLock}from"./model-selection-0ifLKoVR.js";import{A as IMessageConfigSchema,B as MarkdownConfigSchema,D as WhatsAppConfigSchema,F as ToolPolicySchema,G as TtsProviderSchema,H as TtsAutoSchema,I as BlockStreamingCoalesceSchema,K as normalizeAllowFrom,L as DmConfigSchema,M as SignalConfigSchema,N as SlackConfigSchema,O as DiscordConfigSchema,P as TelegramConfigSchema,R as DmPolicySchema,U as TtsConfigSchema,V as MarkdownTableModeSchema,W as TtsModeSchema,j as MSTeamsConfigSchema,k as GoogleChatConfigSchema,q as requireOpenAllowFrom,z as GroupPolicySchema}from"./config-OPdt6NPU.js";import{a as SsrFBlockedError,b as getFileExtension,i as fetchWithSsrFGuard,o as isBlockedHostname,s as isPrivateIpAddress,v as detectMime,y as extensionForMime}from"./fetch-B-GxSYRO.js";import{n as stripAnsi}from"./subsystem-D0Ril4rt.js";import{D as runCommandWithTimeout}from"./agent-scope-DgKN27hJ.js";import"./tool-images-WRTP95FT.js";import{a as jsonResult,n as createActionGate,o as readNumberParam,s as readReactionParams,u as readStringParam}from"./common-n0l_XN-S.js";import{d as SILENT_REPLY_TOKEN,f as isSilentReplyText,p as parseSlackBlocksInput}from"./replies-BBzx3ZtF.js";import{a as resolveAckReaction,n as createReplyPrefixOptions,t as createReplyPrefixContext}from"./reply-prefix-w7kAvH11.js";import{Cr as resolveTelegramGroupRequireMention,Er as resolveWhatsAppGroupToolPolicy,Fr as resolveSignalAccount,Hr as resolveToolsBySender,Ir as listIMessageAccountIds,Lr as resolveDefaultIMessageAccountId,Nr as listSignalAccountIds,Pr as resolveDefaultSignalAccountId,Rr as resolveIMessageAccount,Sr as resolveSlackGroupToolPolicy,Tr as resolveWhatsAppGroupRequireMention,_r as resolveGoogleChatGroupRequireMention,br as resolveIMessageGroupToolPolicy,dr as looksLikeSignalTargetId,fr as normalizeSignalMessagingTarget,gr as resolveDiscordGroupToolPolicy,hr as resolveDiscordGroupRequireMention,jr as buildSlackThreadingToolContext,ln as extractOriginalFilename,mr as resolveBlueBubblesGroupToolPolicy,pr as resolveBlueBubblesGroupRequireMention,vr as resolveGoogleChatGroupToolPolicy,wr as resolveTelegramGroupToolPolicy,xr as resolveSlackGroupRequireMention,yr as resolveIMessageGroupRequireMention}from"./runner-DeqVi2ay.js";import"./redact-Bv8wnIZm.js";import{n as formatErrorMessage}from"./errors-L3rugjUL.js";import{M as rawDataToString}from"./chrome-DsPy-YNT.js";import{r as isTruthyEnvValue,t as formatCliCommand}from"./command-format-B3XMq_73.js";import{A as listSlackAccountIds,B as resolveDiscordAccount,D as resolveTelegramAccount,E as resolveDefaultTelegramAccountId,L as listDiscordAccountIds,M as resolveSlackAccount,N as resolveSlackReplyToMode,S as normalizeWhatsAppTarget,T as listTelegramAccountIds,a as listDiscordDirectoryPeersFromConfig,c as listTelegramDirectoryGroupsFromConfig,d as listWhatsAppDirectoryPeersFromConfig,f as looksLikeSlackTargetId,i as listDiscordDirectoryGroupsFromConfig,j as resolveDefaultSlackAccountId,k as listEnabledSlackAccounts,l as listTelegramDirectoryPeersFromConfig,o as listSlackDirectoryGroupsFromConfig,p as normalizeSlackMessagingTarget,s as listSlackDirectoryPeersFromConfig,u as listWhatsAppDirectoryGroupsFromConfig,x as isWhatsAppGroupJid,z as resolveDefaultDiscordAccountId}from"./plugins-BdkC9v5E.js";import"./bindings-CH-YLOLC.js";import"./message-channel-CuZ2xOAM.js";import"./paths-BGOFa09I.js";import"./api-key-rotation-6b0P0AXk.js";import"./active-listener-DJKMUuYe.js";import{o as loadWebMedia}from"./render-W2uKhcT9.js";import"./chunk-C8sryaZi.js";import"./manager-Y6lQ0x5Z.js";import"./markdown-tables-l6wrDFWG.js";import{r as resolveWhatsAppHeartbeatRecipients}from"./channel-web-CzXHQXgb.js";import"./model-catalog-Doc3qLxu.js";import"./src-yVjde9hC.js";import"./sqlite-D8ZTFA57.js";import"./resolve-route-0sbvl4ZN.js";import"./outbound-CEct8L7D.js";import"./session-CU-kbVQt.js";import{t as loginWeb}from"./login-BxnHE1i5.js";import path from"node:path";import fs,{createWriteStream}from"node:fs";import os from"node:os";import"node:crypto";import fs$1 from"node:fs/promises";import{z}from"zod";import{request}from"node:https";import{pipeline}from"node:stream/promises";import{Readable,Transform}from"node:stream";import JSZip from"jszip";import*as tar from"tar";function error(message){return{success:!1,error:{issues:[{path:[],message}]}}}function emptyPluginConfigSchema(){return{safeParse(value){return value===void 0?{success:!0,data:void 0}:!value||typeof value!=`object`||Array.isArray(value)?error(`expected config object`):Object.keys(value).length>0?error(`config must be empty`):{success:!0,data:value}},jsonSchema:{type:`object`,additionalProperties:!1,properties:{}}}}function normalizeWebhookPath(raw){let trimmed=raw.trim();if(!trimmed)return`/`;let withSlash=trimmed.startsWith(`/`)?trimmed:`/${trimmed}`;return withSlash.length>1&&withSlash.endsWith(`/`)?withSlash.slice(0,-1):withSlash}function resolveWebhookPath(params){let trimmedPath=params.webhookPath?.trim();if(trimmedPath)return normalizeWebhookPath(trimmedPath);if(params.webhookUrl?.trim())try{return normalizeWebhookPath(new URL(params.webhookUrl).pathname||`/`)}catch{return null}return params.defaultPath??null}function registerWebhookTarget(targetsByPath,target){let key=normalizeWebhookPath(target.path),normalizedTarget={...target,path:key},existing=targetsByPath.get(key)??[];return targetsByPath.set(key,[...existing,normalizedTarget]),{target:normalizedTarget,unregister:()=>{let updated=(targetsByPath.get(key)??[]).filter(entry=>entry!==normalizedTarget);if(updated.length>0){targetsByPath.set(key,updated);return}targetsByPath.delete(key)}}}function resolveWebhookTargets(req,targetsByPath){let path=normalizeWebhookPath(new URL(req.url??`/`,`http://localhost`).pathname),targets=targetsByPath.get(path);return!targets||targets.length===0?null:{path,targets}}function rejectNonPostWebhookRequest(req,res){return req.method===`POST`?!1:(res.statusCode=405,res.setHeader(`Allow`,`POST`),res.end(`Method Not Allowed`),!0)}function buildAgentMediaPayload(mediaList){let first=mediaList[0],mediaPaths=mediaList.map(media=>media.path),mediaTypes=mediaList.map(media=>media.contentType).filter(Boolean);return{MediaPath:first?.path,MediaType:first?.contentType??void 0,MediaUrl:first?.path,MediaPaths:mediaPaths.length>0?mediaPaths:void 0,MediaUrls:mediaPaths.length>0?mediaPaths:void 0,MediaTypes:mediaTypes.length>0?mediaTypes:void 0}}function createDefaultChannelRuntimeState(accountId,extra){return{accountId,running:!1,lastStartAt:null,lastStopAt:null,lastError:null,...extra??{}}}function buildBaseChannelStatusSummary(snapshot){return{configured:snapshot.configured??!1,running:snapshot.running??!1,lastStartAt:snapshot.lastStartAt??null,lastStopAt:snapshot.lastStopAt??null,lastError:snapshot.lastError??null}}function collectStatusIssuesFromLastError(channel,accounts){return accounts.flatMap(account=>{let lastError=typeof account.lastError==`string`?account.lastError.trim():``;return lastError?[{channel,accountId:account.accountId,kind:`runtime`,message:`Channel error: ${lastError}`}]:[]})}function buildOauthProviderAuthResult(params){let email=params.email??void 0;return{profiles:[{profileId:`${params.profilePrefix??params.providerId}:${email??`default`}`,credential:{type:`oauth`,provider:params.providerId,access:params.access,...params.refresh?{refresh:params.refresh}:{},...Number.isFinite(params.expires)?{expires:params.expires}:{},...email?{email}:{},...params.credentialExtra}}],configPatch:params.configPatch??{agents:{defaults:{models:{[params.defaultModel]:{}}}}},defaultModel:params.defaultModel,notes:params.notes}}async function resolveSenderCommandAuthorization(params){let shouldComputeAuth=params.shouldComputeCommandAuthorized(params.rawBody,params.cfg),storeAllowFrom=!params.isGroup&&(params.dmPolicy!==`open`||shouldComputeAuth)?await params.readAllowFromStore().catch(()=>[]):[],effectiveAllowFrom=[...params.configuredAllowFrom,...storeAllowFrom],useAccessGroups=params.cfg.commands?.useAccessGroups!==!1,senderAllowedForCommands=params.isSenderAllowed(params.senderId,effectiveAllowFrom);return{shouldComputeAuth,effectiveAllowFrom,senderAllowedForCommands,commandAuthorized:shouldComputeAuth?params.resolveCommandAuthorizedFromAuthorizers({useAccessGroups,authorizers:[{configured:effectiveAllowFrom.length>0,allowed:senderAllowedForCommands}]}):void 0}}function readSlackBlocksParam(actionParams){return parseSlackBlocksInput(actionParams.blocks)}async function handleSlackMessageAction(params){let{providerId,ctx,invoke,normalizeChannelId,includeReadThreadId=!1}=params,{action,cfg,params:actionParams}=ctx,accountId=ctx.accountId??void 0,resolveChannelId=()=>{let channelId=readStringParam(actionParams,`channelId`)??readStringParam(actionParams,`to`,{required:!0});return normalizeChannelId?normalizeChannelId(channelId):channelId};if(action===`send`){let to=readStringParam(actionParams,`to`,{required:!0}),content=readStringParam(actionParams,`message`,{required:!1,allowEmpty:!0}),mediaUrl=readStringParam(actionParams,`media`,{trim:!1}),blocks=readSlackBlocksParam(actionParams);if(!content&&!mediaUrl&&!blocks)throw Error(`Slack send requires message, blocks, or media.`);if(mediaUrl&&blocks)throw Error(`Slack send does not support blocks with media.`);let threadId=readStringParam(actionParams,`threadId`),replyTo=readStringParam(actionParams,`replyTo`);return await invoke({action:`sendMessage`,to,content:content??``,mediaUrl:mediaUrl??void 0,blocks,accountId,threadTs:threadId??replyTo??void 0},cfg,ctx.toolContext)}if(action===`react`){let messageId=readStringParam(actionParams,`messageId`,{required:!0}),emoji=readStringParam(actionParams,`emoji`,{allowEmpty:!0}),remove=typeof actionParams.remove==`boolean`?actionParams.remove:void 0;return await invoke({action:`react`,channelId:resolveChannelId(),messageId,emoji,remove,accountId},cfg)}if(action===`reactions`){let messageId=readStringParam(actionParams,`messageId`,{required:!0}),limit=readNumberParam(actionParams,`limit`,{integer:!0});return await invoke({action:`reactions`,channelId:resolveChannelId(),messageId,limit,accountId},cfg)}if(action===`read`){let limit=readNumberParam(actionParams,`limit`,{integer:!0}),readAction={action:`readMessages`,channelId:resolveChannelId(),limit,before:readStringParam(actionParams,`before`),after:readStringParam(actionParams,`after`),accountId};return includeReadThreadId&&(readAction.threadId=readStringParam(actionParams,`threadId`)),await invoke(readAction,cfg)}if(action===`edit`){let messageId=readStringParam(actionParams,`messageId`,{required:!0}),content=readStringParam(actionParams,`message`,{allowEmpty:!0}),blocks=readSlackBlocksParam(actionParams);if(!content&&!blocks)throw Error(`Slack edit requires message or blocks.`);return await invoke({action:`editMessage`,channelId:resolveChannelId(),messageId,content:content??``,blocks,accountId},cfg)}if(action===`delete`){let messageId=readStringParam(actionParams,`messageId`,{required:!0});return await invoke({action:`deleteMessage`,channelId:resolveChannelId(),messageId,accountId},cfg)}if(action===`pin`||action===`unpin`||action===`list-pins`){let messageId=action===`list-pins`?void 0:readStringParam(actionParams,`messageId`,{required:!0});return await invoke({action:action===`pin`?`pinMessage`:action===`unpin`?`unpinMessage`:`listPins`,channelId:resolveChannelId(),messageId,accountId},cfg)}if(action===`member-info`)return await invoke({action:`memberInfo`,userId:readStringParam(actionParams,`userId`,{required:!0}),accountId},cfg);if(action===`emoji-list`)return await invoke({action:`emojiList`,limit:readNumberParam(actionParams,`limit`,{integer:!0}),accountId},cfg);throw Error(`Action ${action} is not supported for provider ${providerId}.`)}function resolveChannelAccountConfigBasePath(params){return params.cfg.channels?.[params.channelKey]?.accounts?.[params.accountId]?`channels.${params.channelKey}.accounts.${params.accountId}.`:`channels.${params.channelKey}.`}function chunkTextForOutbound(text,limit){if(!text)return[];if(limit<=0||text.length<=limit)return[text];let chunks=[],remaining=text;for(;remaining.length>limit;){let window=remaining.slice(0,limit),lastNewline=window.lastIndexOf(`
|
|
1
|
+
import{c as normalizeAccountId,t as DEFAULT_ACCOUNT_ID}from"./session-key-5J69DULS.js";import{_ as createAccountListHelpers,i as resolveWhatsAppAuthDir,n as resolveDefaultWhatsAppAccountId,r as resolveWhatsAppAccount,t as listWhatsAppAccountIds}from"./accounts-Cy3WCbWg.js";import{$ as formatLocationText,$t as registerPluginHttpRoute,A as resolveSlackChannelAllowlist,At as isWSLEnv,Bt as createDedupeCache,C as hasMarkdownToConvert,Ct as resolveAllowlistMatchSimple,D as attachFooterText,Dt as resolveChannelEntryMatchWithFallback,E as createReceiptCard,Et as resolveChannelEntryMatch,F as resolveServicePrefixedTarget,Ft as installRequestBodyLimitGuard,G as onDiagnosticEvent,Gt as readJsonFile,H as normalizeDiscordSlug,Ht as pruneExpiredPending,I as detectBinary,It as isRequestBodyLimitError,J as formatDocsLink,Jt as readJsonFileWithFallback,K as missingTargetError,Kt as writeJsonAtomic,L as resolveDiscordUserAllowlist,Lt as readJsonBodyWithLimit,M as parseChatAllowTargetPrefixes,Mt as DEFAULT_WEBHOOK_BODY_TIMEOUT_MS,N as parseChatTargetPrefixesOrThrow,Nt as DEFAULT_WEBHOOK_MAX_BODY_BYTES,Ot as resolveNestedAllowlistDecision,P as resolveServicePrefixedAllowTarget,Pt as RequestBodyLimitError,Q as resolveControlCommandGate,Qt as isAllowedParsedChatSender,R as resolveDiscordChannelAllowlist,Rt as readRequestBodyWithLimit,St as formatAllowlistMatchMeta,T as stripMarkdown,Tt as normalizeChannelSlug,U as emitDiagnosticEvent,Ut as resolvePairingPaths,V as parseDiscordTarget,Vt as generatePairingToken,W as isDiagnosticsEnabled,Wt as createAsyncLock,X as stringEnum,Xt as extractToolSend,Y as optionalStringEnum,Yt as writeJsonFileAtomically,Z as recordInboundSession,Zt as formatAllowFromLowercase,_t as clearHistoryEntriesIfEnabled,a as normalizeAccountId$1,at as createTypingCallbacks,ct as shouldAckReactionForWhatsApp,dt as mergeAllowlist,en as BLUEBUBBLES_ACTIONS,et as toLocationContext,ft as summarizeMapping,gt as clearHistoryEntries,ht as buildPendingHistoryContextFromMap,i as listLineAccountIds,it as logTypingFailure,j as normalizeIMessageHandle,jt as isWSLSync,k as resolveSlackUserAllowlist,kt as isWSL2Sync,lt as resolveMentionGating,nn as BLUEBUBBLES_GROUP_ACTIONS,nt as logAckFailure,o as resolveDefaultLineAccountId,ot as removeAckReactionAfterReply,pt as DEFAULT_GROUP_HISTORY_LIMIT,q as registerPluginHooksFromDir,qt as normalizeDeviceAuthScopes,rn as CHANNEL_MESSAGE_ACTION_NAMES,rt as logInboundDrop,s as resolveLineAccount,st as shouldAckReaction,tn as BLUEBUBBLES_ACTION_NAMES,tt as resolveChannelMediaMaxBytes,ut as resolveMentionGatingWithBypass,vt as recordPendingHistoryEntry,w as processLineMessage,wt as buildChannelKeyCandidates,yt as recordPendingHistoryEntryIfEnabled,z as collectDiscordAuditChannelIds,zt as requestBodyErrorToText}from"./reply-V98uAjNN.js";import{D as normalizeE164,F as sleep,M as safeParseJson,O as pathExists,_ as clamp,g as CONFIG_DIR,lt as normalizePluginHttpPath,r as getChatChannelMeta,tt as registerLogTransport,w as isRecord,x as escapeRegExp}from"./registry-CZHRcH-q.js";import"./paths-Cb8zTlyG.js";import{dt as withFileLock,ut as acquireFileLock}from"./model-selection-0ifLKoVR.js";import{A as IMessageConfigSchema,B as MarkdownConfigSchema,D as WhatsAppConfigSchema,F as ToolPolicySchema,G as TtsProviderSchema,H as TtsAutoSchema,I as BlockStreamingCoalesceSchema,K as normalizeAllowFrom,L as DmConfigSchema,M as SignalConfigSchema,N as SlackConfigSchema,O as DiscordConfigSchema,P as TelegramConfigSchema,R as DmPolicySchema,U as TtsConfigSchema,V as MarkdownTableModeSchema,W as TtsModeSchema,j as MSTeamsConfigSchema,k as GoogleChatConfigSchema,q as requireOpenAllowFrom,z as GroupPolicySchema}from"./config-OPdt6NPU.js";import{a as SsrFBlockedError,b as getFileExtension,i as fetchWithSsrFGuard,o as isBlockedHostname,s as isPrivateIpAddress,v as detectMime,y as extensionForMime}from"./fetch-B-GxSYRO.js";import{n as stripAnsi}from"./subsystem-D0Ril4rt.js";import{D as runCommandWithTimeout}from"./agent-scope-DgKN27hJ.js";import"./tool-images-WRTP95FT.js";import{a as jsonResult,n as createActionGate,o as readNumberParam,s as readReactionParams,u as readStringParam}from"./common-n0l_XN-S.js";import{d as SILENT_REPLY_TOKEN,f as isSilentReplyText,p as parseSlackBlocksInput}from"./replies-BBzx3ZtF.js";import{a as resolveAckReaction,n as createReplyPrefixOptions,t as createReplyPrefixContext}from"./reply-prefix-w7kAvH11.js";import{Cr as resolveTelegramGroupRequireMention,Er as resolveWhatsAppGroupToolPolicy,Fr as resolveSignalAccount,Hr as resolveToolsBySender,Ir as listIMessageAccountIds,Lr as resolveDefaultIMessageAccountId,Nr as listSignalAccountIds,Pr as resolveDefaultSignalAccountId,Rr as resolveIMessageAccount,Sr as resolveSlackGroupToolPolicy,Tr as resolveWhatsAppGroupRequireMention,_r as resolveGoogleChatGroupRequireMention,br as resolveIMessageGroupToolPolicy,dr as looksLikeSignalTargetId,fr as normalizeSignalMessagingTarget,gr as resolveDiscordGroupToolPolicy,hr as resolveDiscordGroupRequireMention,jr as buildSlackThreadingToolContext,ln as extractOriginalFilename,mr as resolveBlueBubblesGroupToolPolicy,pr as resolveBlueBubblesGroupRequireMention,vr as resolveGoogleChatGroupToolPolicy,wr as resolveTelegramGroupToolPolicy,xr as resolveSlackGroupRequireMention,yr as resolveIMessageGroupRequireMention}from"./runner-BpFNG45j.js";import"./redact-Bv8wnIZm.js";import{n as formatErrorMessage}from"./errors-L3rugjUL.js";import{M as rawDataToString}from"./chrome-DsPy-YNT.js";import{r as isTruthyEnvValue,t as formatCliCommand}from"./command-format-B3XMq_73.js";import{A as listSlackAccountIds,B as resolveDiscordAccount,D as resolveTelegramAccount,E as resolveDefaultTelegramAccountId,L as listDiscordAccountIds,M as resolveSlackAccount,N as resolveSlackReplyToMode,S as normalizeWhatsAppTarget,T as listTelegramAccountIds,a as listDiscordDirectoryPeersFromConfig,c as listTelegramDirectoryGroupsFromConfig,d as listWhatsAppDirectoryPeersFromConfig,f as looksLikeSlackTargetId,i as listDiscordDirectoryGroupsFromConfig,j as resolveDefaultSlackAccountId,k as listEnabledSlackAccounts,l as listTelegramDirectoryPeersFromConfig,o as listSlackDirectoryGroupsFromConfig,p as normalizeSlackMessagingTarget,s as listSlackDirectoryPeersFromConfig,u as listWhatsAppDirectoryGroupsFromConfig,x as isWhatsAppGroupJid,z as resolveDefaultDiscordAccountId}from"./plugins-BdkC9v5E.js";import"./bindings-CH-YLOLC.js";import"./message-channel-CuZ2xOAM.js";import"./paths-BGOFa09I.js";import"./api-key-rotation-6b0P0AXk.js";import"./active-listener-DJKMUuYe.js";import{o as loadWebMedia}from"./render-W2uKhcT9.js";import"./chunk-C8sryaZi.js";import"./manager-Y6lQ0x5Z.js";import"./markdown-tables-l6wrDFWG.js";import{r as resolveWhatsAppHeartbeatRecipients}from"./channel-web-BHose9yJ.js";import"./model-catalog-Doc3qLxu.js";import"./src-pvdIxmTY.js";import"./sqlite-D8ZTFA57.js";import"./resolve-route-0sbvl4ZN.js";import"./outbound-CEct8L7D.js";import"./session-CU-kbVQt.js";import{t as loginWeb}from"./login-BxnHE1i5.js";import path from"node:path";import fs,{createWriteStream}from"node:fs";import os from"node:os";import"node:crypto";import fs$1 from"node:fs/promises";import{z}from"zod";import{request}from"node:https";import{pipeline}from"node:stream/promises";import{Readable,Transform}from"node:stream";import JSZip from"jszip";import*as tar from"tar";function error(message){return{success:!1,error:{issues:[{path:[],message}]}}}function emptyPluginConfigSchema(){return{safeParse(value){return value===void 0?{success:!0,data:void 0}:!value||typeof value!=`object`||Array.isArray(value)?error(`expected config object`):Object.keys(value).length>0?error(`config must be empty`):{success:!0,data:value}},jsonSchema:{type:`object`,additionalProperties:!1,properties:{}}}}function normalizeWebhookPath(raw){let trimmed=raw.trim();if(!trimmed)return`/`;let withSlash=trimmed.startsWith(`/`)?trimmed:`/${trimmed}`;return withSlash.length>1&&withSlash.endsWith(`/`)?withSlash.slice(0,-1):withSlash}function resolveWebhookPath(params){let trimmedPath=params.webhookPath?.trim();if(trimmedPath)return normalizeWebhookPath(trimmedPath);if(params.webhookUrl?.trim())try{return normalizeWebhookPath(new URL(params.webhookUrl).pathname||`/`)}catch{return null}return params.defaultPath??null}function registerWebhookTarget(targetsByPath,target){let key=normalizeWebhookPath(target.path),normalizedTarget={...target,path:key},existing=targetsByPath.get(key)??[];return targetsByPath.set(key,[...existing,normalizedTarget]),{target:normalizedTarget,unregister:()=>{let updated=(targetsByPath.get(key)??[]).filter(entry=>entry!==normalizedTarget);if(updated.length>0){targetsByPath.set(key,updated);return}targetsByPath.delete(key)}}}function resolveWebhookTargets(req,targetsByPath){let path=normalizeWebhookPath(new URL(req.url??`/`,`http://localhost`).pathname),targets=targetsByPath.get(path);return!targets||targets.length===0?null:{path,targets}}function rejectNonPostWebhookRequest(req,res){return req.method===`POST`?!1:(res.statusCode=405,res.setHeader(`Allow`,`POST`),res.end(`Method Not Allowed`),!0)}function buildAgentMediaPayload(mediaList){let first=mediaList[0],mediaPaths=mediaList.map(media=>media.path),mediaTypes=mediaList.map(media=>media.contentType).filter(Boolean);return{MediaPath:first?.path,MediaType:first?.contentType??void 0,MediaUrl:first?.path,MediaPaths:mediaPaths.length>0?mediaPaths:void 0,MediaUrls:mediaPaths.length>0?mediaPaths:void 0,MediaTypes:mediaTypes.length>0?mediaTypes:void 0}}function createDefaultChannelRuntimeState(accountId,extra){return{accountId,running:!1,lastStartAt:null,lastStopAt:null,lastError:null,...extra??{}}}function buildBaseChannelStatusSummary(snapshot){return{configured:snapshot.configured??!1,running:snapshot.running??!1,lastStartAt:snapshot.lastStartAt??null,lastStopAt:snapshot.lastStopAt??null,lastError:snapshot.lastError??null}}function collectStatusIssuesFromLastError(channel,accounts){return accounts.flatMap(account=>{let lastError=typeof account.lastError==`string`?account.lastError.trim():``;return lastError?[{channel,accountId:account.accountId,kind:`runtime`,message:`Channel error: ${lastError}`}]:[]})}function buildOauthProviderAuthResult(params){let email=params.email??void 0;return{profiles:[{profileId:`${params.profilePrefix??params.providerId}:${email??`default`}`,credential:{type:`oauth`,provider:params.providerId,access:params.access,...params.refresh?{refresh:params.refresh}:{},...Number.isFinite(params.expires)?{expires:params.expires}:{},...email?{email}:{},...params.credentialExtra}}],configPatch:params.configPatch??{agents:{defaults:{models:{[params.defaultModel]:{}}}}},defaultModel:params.defaultModel,notes:params.notes}}async function resolveSenderCommandAuthorization(params){let shouldComputeAuth=params.shouldComputeCommandAuthorized(params.rawBody,params.cfg),storeAllowFrom=!params.isGroup&&(params.dmPolicy!==`open`||shouldComputeAuth)?await params.readAllowFromStore().catch(()=>[]):[],effectiveAllowFrom=[...params.configuredAllowFrom,...storeAllowFrom],useAccessGroups=params.cfg.commands?.useAccessGroups!==!1,senderAllowedForCommands=params.isSenderAllowed(params.senderId,effectiveAllowFrom);return{shouldComputeAuth,effectiveAllowFrom,senderAllowedForCommands,commandAuthorized:shouldComputeAuth?params.resolveCommandAuthorizedFromAuthorizers({useAccessGroups,authorizers:[{configured:effectiveAllowFrom.length>0,allowed:senderAllowedForCommands}]}):void 0}}function readSlackBlocksParam(actionParams){return parseSlackBlocksInput(actionParams.blocks)}async function handleSlackMessageAction(params){let{providerId,ctx,invoke,normalizeChannelId,includeReadThreadId=!1}=params,{action,cfg,params:actionParams}=ctx,accountId=ctx.accountId??void 0,resolveChannelId=()=>{let channelId=readStringParam(actionParams,`channelId`)??readStringParam(actionParams,`to`,{required:!0});return normalizeChannelId?normalizeChannelId(channelId):channelId};if(action===`send`){let to=readStringParam(actionParams,`to`,{required:!0}),content=readStringParam(actionParams,`message`,{required:!1,allowEmpty:!0}),mediaUrl=readStringParam(actionParams,`media`,{trim:!1}),blocks=readSlackBlocksParam(actionParams);if(!content&&!mediaUrl&&!blocks)throw Error(`Slack send requires message, blocks, or media.`);if(mediaUrl&&blocks)throw Error(`Slack send does not support blocks with media.`);let threadId=readStringParam(actionParams,`threadId`),replyTo=readStringParam(actionParams,`replyTo`);return await invoke({action:`sendMessage`,to,content:content??``,mediaUrl:mediaUrl??void 0,blocks,accountId,threadTs:threadId??replyTo??void 0},cfg,ctx.toolContext)}if(action===`react`){let messageId=readStringParam(actionParams,`messageId`,{required:!0}),emoji=readStringParam(actionParams,`emoji`,{allowEmpty:!0}),remove=typeof actionParams.remove==`boolean`?actionParams.remove:void 0;return await invoke({action:`react`,channelId:resolveChannelId(),messageId,emoji,remove,accountId},cfg)}if(action===`reactions`){let messageId=readStringParam(actionParams,`messageId`,{required:!0}),limit=readNumberParam(actionParams,`limit`,{integer:!0});return await invoke({action:`reactions`,channelId:resolveChannelId(),messageId,limit,accountId},cfg)}if(action===`read`){let limit=readNumberParam(actionParams,`limit`,{integer:!0}),readAction={action:`readMessages`,channelId:resolveChannelId(),limit,before:readStringParam(actionParams,`before`),after:readStringParam(actionParams,`after`),accountId};return includeReadThreadId&&(readAction.threadId=readStringParam(actionParams,`threadId`)),await invoke(readAction,cfg)}if(action===`edit`){let messageId=readStringParam(actionParams,`messageId`,{required:!0}),content=readStringParam(actionParams,`message`,{allowEmpty:!0}),blocks=readSlackBlocksParam(actionParams);if(!content&&!blocks)throw Error(`Slack edit requires message or blocks.`);return await invoke({action:`editMessage`,channelId:resolveChannelId(),messageId,content:content??``,blocks,accountId},cfg)}if(action===`delete`){let messageId=readStringParam(actionParams,`messageId`,{required:!0});return await invoke({action:`deleteMessage`,channelId:resolveChannelId(),messageId,accountId},cfg)}if(action===`pin`||action===`unpin`||action===`list-pins`){let messageId=action===`list-pins`?void 0:readStringParam(actionParams,`messageId`,{required:!0});return await invoke({action:action===`pin`?`pinMessage`:action===`unpin`?`unpinMessage`:`listPins`,channelId:resolveChannelId(),messageId,accountId},cfg)}if(action===`member-info`)return await invoke({action:`memberInfo`,userId:readStringParam(actionParams,`userId`,{required:!0}),accountId},cfg);if(action===`emoji-list`)return await invoke({action:`emojiList`,limit:readNumberParam(actionParams,`limit`,{integer:!0}),accountId},cfg);throw Error(`Action ${action} is not supported for provider ${providerId}.`)}function resolveChannelAccountConfigBasePath(params){return params.cfg.channels?.[params.channelKey]?.accounts?.[params.accountId]?`channels.${params.channelKey}.accounts.${params.accountId}.`:`channels.${params.channelKey}.`}function chunkTextForOutbound(text,limit){if(!text)return[];if(limit<=0||text.length<=limit)return[text];let chunks=[],remaining=text;for(;remaining.length>limit;){let window=remaining.slice(0,limit),lastNewline=window.lastIndexOf(`
|
|
2
2
|
`),lastSpace=window.lastIndexOf(` `),breakIdx=lastNewline>0?lastNewline:lastSpace;breakIdx<=0&&(breakIdx=limit);let chunk=remaining.slice(0,breakIdx).trimEnd();chunk.length>0&&chunks.push(chunk);let brokeOnSeparator=breakIdx<remaining.length&&/\s/.test(remaining[breakIdx]),nextStart=Math.min(remaining.length,breakIdx+(brokeOnSeparator?1:0));remaining=remaining.slice(nextStart).trimStart()}return remaining.length&&chunks.push(remaining),chunks}const withLock=createAsyncLock();async function loadState(baseDir){let{pendingPath,pairedPath}=resolvePairingPaths(baseDir,`devices`),[pending,paired]=await Promise.all([readJsonFile(pendingPath),readJsonFile(pairedPath)]),state={pendingById:pending??{},pairedByDeviceId:paired??{}};return pruneExpiredPending(state.pendingById,Date.now(),3e5),state}async function persistState(state,baseDir){let{pendingPath,pairedPath}=resolvePairingPaths(baseDir,`devices`);await Promise.all([writeJsonAtomic(pendingPath,state.pendingById),writeJsonAtomic(pairedPath,state.pairedByDeviceId)])}function normalizeRole(role){return role?.trim()||null}function mergeRoles(...items){let roles=new Set;for(let item of items)if(item)if(Array.isArray(item))for(let role of item){let trimmed=role.trim();trimmed&&roles.add(trimmed)}else{let trimmed=item.trim();trimmed&&roles.add(trimmed)}if(roles.size!==0)return[...roles]}function mergeScopes(...items){let scopes=new Set;for(let item of items)if(item)for(let scope of item){let trimmed=scope.trim();trimmed&&scopes.add(trimmed)}if(scopes.size!==0)return[...scopes]}function newToken(){return generatePairingToken()}async function listDevicePairing(baseDir){let state=await loadState(baseDir);return{pending:Object.values(state.pendingById).toSorted((a,b)=>b.ts-a.ts),paired:Object.values(state.pairedByDeviceId).toSorted((a,b)=>b.approvedAtMs-a.approvedAtMs)}}async function approveDevicePairing(requestId,baseDir){return await withLock(async()=>{let state=await loadState(baseDir),pending=state.pendingById[requestId];if(!pending)return null;let now=Date.now(),existing=state.pairedByDeviceId[pending.deviceId],roles=mergeRoles(existing?.roles,existing?.role,pending.roles,pending.role),scopes=mergeScopes(existing?.scopes,pending.scopes),tokens=existing?.tokens?{...existing.tokens}:{},roleForToken=normalizeRole(pending.role);if(roleForToken){let nextScopes=normalizeDeviceAuthScopes(pending.scopes),existingToken=tokens[roleForToken],now=Date.now();tokens[roleForToken]={token:newToken(),role:roleForToken,scopes:nextScopes,createdAtMs:existingToken?.createdAtMs??now,rotatedAtMs:existingToken?now:void 0,revokedAtMs:void 0,lastUsedAtMs:existingToken?.lastUsedAtMs}}let device={deviceId:pending.deviceId,publicKey:pending.publicKey,displayName:pending.displayName,platform:pending.platform,clientId:pending.clientId,clientMode:pending.clientMode,role:pending.role,roles,scopes,remoteIp:pending.remoteIp,tokens,createdAtMs:existing?.createdAtMs??now,approvedAtMs:now};return delete state.pendingById[requestId],state.pairedByDeviceId[device.deviceId]=device,await persistState(state,baseDir),{requestId,device}})}async function rejectDevicePairing(requestId,baseDir){return await withLock(async()=>{let state=await loadState(baseDir),pending=state.pendingById[requestId];return pending?(delete state.pendingById[requestId],await persistState(state,baseDir),{requestId,deviceId:pending.deviceId}):null})}function buildChannelConfigSchema(schema){return{schema:schema.toJSONSchema({target:`draft-07`,unrepresentable:`any`})}}function setAccountEnabledInConfigSection(params){let accountKey=params.accountId||DEFAULT_ACCOUNT_ID,base=params.cfg.channels?.[params.sectionKey],hasAccounts=!!base?.accounts;if(params.allowTopLevel&&accountKey===DEFAULT_ACCOUNT_ID&&!hasAccounts)return{...params.cfg,channels:{...params.cfg.channels,[params.sectionKey]:{...base,enabled:params.enabled}}};let baseAccounts=base?.accounts??{},existing=baseAccounts[accountKey]??{};return{...params.cfg,channels:{...params.cfg.channels,[params.sectionKey]:{...base,accounts:{...baseAccounts,[accountKey]:{...existing,enabled:params.enabled}}}}}}function deleteAccountFromConfigSection(params){let accountKey=params.accountId||DEFAULT_ACCOUNT_ID,base=params.cfg.channels?.[params.sectionKey];if(!base)return params.cfg;let baseAccounts=base.accounts&&typeof base.accounts==`object`?{...base.accounts}:void 0;if(accountKey!==DEFAULT_ACCOUNT_ID){let accounts=baseAccounts?{...baseAccounts}:{};return delete accounts[accountKey],{...params.cfg,channels:{...params.cfg.channels,[params.sectionKey]:{...base,accounts:Object.keys(accounts).length?accounts:void 0}}}}if(baseAccounts&&Object.keys(baseAccounts).length>0){delete baseAccounts[accountKey];let baseRecord={...base};for(let field of params.clearBaseFields??[])field in baseRecord&&(baseRecord[field]=void 0);return{...params.cfg,channels:{...params.cfg.channels,[params.sectionKey]:{...baseRecord,accounts:Object.keys(baseAccounts).length?baseAccounts:void 0}}}}let nextChannels={...params.cfg.channels};delete nextChannels[params.sectionKey];let nextCfg={...params.cfg};return Object.keys(nextChannels).length>0?nextCfg.channels=nextChannels:delete nextCfg.channels,nextCfg}function channelHasAccounts(cfg,channelKey){let base=cfg.channels?.[channelKey];return!!(base?.accounts&&Object.keys(base.accounts).length>0)}function shouldStoreNameInAccounts(params){return params.alwaysUseAccounts||params.accountId!==DEFAULT_ACCOUNT_ID?!0:channelHasAccounts(params.cfg,params.channelKey)}function applyAccountNameToChannelSection(params){let trimmed=params.name?.trim();if(!trimmed)return params.cfg;let accountId=normalizeAccountId(params.accountId),baseConfig=params.cfg.channels?.[params.channelKey],base=typeof baseConfig==`object`&&baseConfig?baseConfig:void 0;if(!shouldStoreNameInAccounts({cfg:params.cfg,channelKey:params.channelKey,accountId,alwaysUseAccounts:params.alwaysUseAccounts})&&accountId===DEFAULT_ACCOUNT_ID){let safeBase=base??{};return{...params.cfg,channels:{...params.cfg.channels,[params.channelKey]:{...safeBase,name:trimmed}}}}let baseAccounts=base?.accounts??{},existingAccount=baseAccounts[accountId]??{},baseWithoutName=accountId===DEFAULT_ACCOUNT_ID?(({name:_ignored,...rest})=>rest)(base??{}):base??{};return{...params.cfg,channels:{...params.cfg.channels,[params.channelKey]:{...baseWithoutName,accounts:{...baseAccounts,[accountId]:{...existingAccount,name:trimmed}}}}}}function migrateBaseNameToDefaultAccount(params){if(params.alwaysUseAccounts)return params.cfg;let base=params.cfg.channels?.[params.channelKey],baseName=base?.name?.trim();if(!baseName)return params.cfg;let accounts={...base?.accounts},defaultAccount=accounts[DEFAULT_ACCOUNT_ID]??{};defaultAccount.name||(accounts[DEFAULT_ACCOUNT_ID]={...defaultAccount,name:baseName});let{name:_ignored,...rest}=base??{};return{...params.cfg,channels:{...params.cfg.channels,[params.channelKey]:{...rest,accounts}}}}function formatPairingApproveHint(channelId){return`Approve via: ${formatCliCommand(`builderforce pairing list ${channelId}`)} / ${formatCliCommand(`builderforce pairing approve ${channelId} <code>`)}`}const PAIRING_APPROVED_MESSAGE=`✅ BuilderForceAgents access approved. Send a message to start chatting.`;async function promptAccountId$1(params){let existingIds=params.listAccountIds(params.cfg),initial=params.currentId?.trim()||params.defaultAccountId||DEFAULT_ACCOUNT_ID,choice=await params.prompter.select({message:`${params.label} account`,options:[...existingIds.map(id=>({value:id,label:id===DEFAULT_ACCOUNT_ID?`default (primary)`:id})),{value:`__new__`,label:`Add a new account`}],initialValue:initial});if(choice!==`__new__`)return normalizeAccountId(choice);let entered=await params.prompter.text({message:`New ${params.label} account id`,validate:value=>value?.trim()?void 0:`Required`}),normalized=normalizeAccountId(String(entered));return String(entered).trim()!==normalized&&await params.prompter.note(`Normalized account id to "${normalized}".`,`${params.label} account`),normalized}const promptAccountId=async params=>await promptAccountId$1(params);function addWildcardAllowFrom(allowFrom){let next=(allowFrom??[]).map(v=>String(v).trim()).filter(Boolean);return next.includes(`*`)||next.push(`*`),next}function mergeAllowFromEntries(current,additions){let merged=[...current??[],...additions].map(v=>String(v).trim()).filter(Boolean);return[...new Set(merged)]}async function promptResolvedAllowFrom(params){for(;;){let entry=await params.prompter.text({message:params.message,placeholder:params.placeholder,initialValue:params.existing[0]?String(params.existing[0]):void 0,validate:value=>String(value??``).trim()?void 0:`Required`}),parts=params.parseInputs(String(entry));if(!params.token){let ids=parts.map(params.parseId).filter(Boolean);if(ids.length!==parts.length){await params.prompter.note(params.invalidWithoutTokenNote,params.label);continue}return mergeAllowFromEntries(params.existing,ids)}let results=await params.resolveEntries({token:params.token,entries:parts}).catch(()=>null);if(!results){await params.prompter.note(`Failed to resolve usernames. Try again.`,params.label);continue}let unresolved=results.filter(res=>!res.resolved||!res.id);if(unresolved.length>0){await params.prompter.note(`Could not resolve: ${unresolved.map(res=>res.input).join(`, `)}`,params.label);continue}let ids=results.map(res=>res.id);return mergeAllowFromEntries(params.existing,ids)}}function parseAllowlistEntries(raw){return String(raw??``).split(/[,\n]/g).map(entry=>entry.trim()).filter(Boolean)}function formatAllowlistEntries(entries){return entries.map(entry=>entry.trim()).filter(Boolean).join(`, `)}async function promptChannelAccessPolicy(params){let options=[{value:`allowlist`,label:`Allowlist (recommended)`}];params.allowOpen!==!1&&options.push({value:`open`,label:`Open (allow all channels)`}),params.allowDisabled!==!1&&options.push({value:`disabled`,label:`Disabled (block all channels)`});let initialValue=params.currentPolicy??`allowlist`;return await params.prompter.select({message:`${params.label} access`,options,initialValue})}async function promptChannelAllowlist(params){let initialValue=params.currentEntries&¶ms.currentEntries.length>0?formatAllowlistEntries(params.currentEntries):void 0;return parseAllowlistEntries(await params.prompter.text({message:`${params.label} allowlist (comma-separated)`,placeholder:params.placeholder,initialValue}))}async function promptChannelAccessConfig(params){let hasEntries=(params.currentEntries??[]).length>0,shouldPrompt=params.defaultPrompt??!hasEntries;if(!await params.prompter.confirm({message:params.updatePrompt?`Update ${params.label} access?`:`Configure ${params.label} access?`,initialValue:shouldPrompt}))return null;let policy=await promptChannelAccessPolicy({prompter:params.prompter,label:params.label,currentPolicy:params.currentPolicy,allowOpen:params.allowOpen,allowDisabled:params.allowDisabled});return policy===`allowlist`?{policy,entries:await promptChannelAllowlist({prompter:params.prompter,label:params.label,currentEntries:params.currentEntries,placeholder:params.placeholder})}:{policy,entries:[]}}const channel$5=`discord`;function setDiscordDmPolicy(cfg,dmPolicy){let existingAllowFrom=cfg.channels?.discord?.allowFrom??cfg.channels?.discord?.dm?.allowFrom,allowFrom=dmPolicy===`open`?addWildcardAllowFrom(existingAllowFrom):void 0;return{...cfg,channels:{...cfg.channels,discord:{...cfg.channels?.discord,dmPolicy,...allowFrom?{allowFrom}:{},dm:{...cfg.channels?.discord?.dm,enabled:cfg.channels?.discord?.dm?.enabled??!0}}}}}async function noteDiscordTokenHelp(prompter){await prompter.note([`1) Discord Developer Portal → Applications → New Application`,`2) Bot → Add Bot → Reset Token → copy token`,`3) OAuth2 → URL Generator → scope 'bot' → invite to your server`,`Tip: enable Message Content Intent if you need message text. (Bot → Privileged Gateway Intents → Message Content Intent)`,`Docs: ${formatDocsLink(`/discord`,`discord`)}`].join(`
|
|
3
3
|
`),`Discord bot token`)}function patchDiscordConfigForAccount(cfg,accountId,patch){return accountId===DEFAULT_ACCOUNT_ID?{...cfg,channels:{...cfg.channels,discord:{...cfg.channels?.discord,enabled:!0,...patch}}}:{...cfg,channels:{...cfg.channels,discord:{...cfg.channels?.discord,enabled:!0,accounts:{...cfg.channels?.discord?.accounts,[accountId]:{...cfg.channels?.discord?.accounts?.[accountId],enabled:cfg.channels?.discord?.accounts?.[accountId]?.enabled??!0,...patch}}}}}}function setDiscordGroupPolicy(cfg,accountId,groupPolicy){return patchDiscordConfigForAccount(cfg,accountId,{groupPolicy})}function setDiscordGuildChannelAllowlist(cfg,accountId,entries){let guilds={...accountId===DEFAULT_ACCOUNT_ID?cfg.channels?.discord?.guilds??{}:cfg.channels?.discord?.accounts?.[accountId]?.guilds??{}};for(let entry of entries){let guildKey=entry.guildKey||`*`,existing=guilds[guildKey]??{};if(entry.channelKey){let channels={...existing.channels};channels[entry.channelKey]={allow:!0},guilds[guildKey]={...existing,channels}}else guilds[guildKey]=existing}return patchDiscordConfigForAccount(cfg,accountId,{guilds})}function setDiscordAllowFrom(cfg,allowFrom){return{...cfg,channels:{...cfg.channels,discord:{...cfg.channels?.discord,allowFrom,dm:{...cfg.channels?.discord?.dm,enabled:cfg.channels?.discord?.dm?.enabled??!0}}}}}function parseDiscordAllowFromInput(raw){return raw.split(/[\n,;]+/g).map(entry=>entry.trim()).filter(Boolean)}async function promptDiscordAllowFrom(params){let accountId=params.accountId&&normalizeAccountId(params.accountId)?normalizeAccountId(params.accountId)??DEFAULT_ACCOUNT_ID:resolveDefaultDiscordAccountId(params.cfg),token=resolveDiscordAccount({cfg:params.cfg,accountId}).token,existing=params.cfg.channels?.discord?.allowFrom??params.cfg.channels?.discord?.dm?.allowFrom??[];await params.prompter.note([`Allowlist Discord DMs by username (we resolve to user ids).`,`Examples:`,`- 123456789012345678`,`- @alice`,`- alice#1234`,`Multiple entries: comma-separated.`,`Docs: ${formatDocsLink(`/discord`,`discord`)}`].join(`
|
|
4
4
|
`),`Discord allowlist`);let unique=await promptResolvedAllowFrom({prompter:params.prompter,existing,token,message:`Discord allowFrom (usernames or ids)`,placeholder:`@alice, 123456789012345678`,label:`Discord allowlist`,parseInputs:value=>parseDiscordAllowFromInput(value),parseId:value=>{let trimmed=value.trim();if(!trimmed)return null;let mention=trimmed.match(/^<@!?(\d+)>$/);if(mention)return mention[1];let prefixed=trimmed.replace(/^(user:|discord:)/i,``);return/^\d+$/.test(prefixed)?prefixed:null},invalidWithoutTokenNote:`Bot token missing; use numeric user ids (or mention form) only.`,resolveEntries:({token,entries})=>resolveDiscordUserAllowlist({token,entries})});return setDiscordAllowFrom(params.cfg,unique)}const discordOnboardingAdapter={channel:channel$5,getStatus:async({cfg})=>{let configured=listDiscordAccountIds(cfg).some(accountId=>!!resolveDiscordAccount({cfg,accountId}).token);return{channel:channel$5,configured,statusLines:[`Discord: ${configured?`configured`:`needs token`}`],selectionHint:configured?`configured`:`needs token`,quickstartScore:configured?2:1}},configure:async({cfg,prompter,accountOverrides,shouldPromptAccountIds})=>{let discordOverride=accountOverrides.discord?.trim(),defaultDiscordAccountId=resolveDefaultDiscordAccountId(cfg),discordAccountId=discordOverride?normalizeAccountId(discordOverride):defaultDiscordAccountId;shouldPromptAccountIds&&!discordOverride&&(discordAccountId=await promptAccountId({cfg,prompter,label:`Discord`,currentId:discordAccountId,listAccountIds:listDiscordAccountIds,defaultAccountId:defaultDiscordAccountId}));let next=cfg,resolvedAccount=resolveDiscordAccount({cfg:next,accountId:discordAccountId}),accountConfigured=!!resolvedAccount.token,canUseEnv=discordAccountId===DEFAULT_ACCOUNT_ID&&!!process.env.DISCORD_BOT_TOKEN?.trim(),hasConfigToken=!!resolvedAccount.config.token,token=null;accountConfigured||await noteDiscordTokenHelp(prompter),canUseEnv&&!resolvedAccount.config.token?await prompter.confirm({message:`DISCORD_BOT_TOKEN detected. Use env var?`,initialValue:!0})?next={...next,channels:{...next.channels,discord:{...next.channels?.discord,enabled:!0}}}:token=String(await prompter.text({message:`Enter Discord bot token`,validate:value=>value?.trim()?void 0:`Required`})).trim():hasConfigToken&&await prompter.confirm({message:`Discord token already configured. Keep it?`,initialValue:!0})||(token=String(await prompter.text({message:`Enter Discord bot token`,validate:value=>value?.trim()?void 0:`Required`})).trim()),token&&(next=discordAccountId===DEFAULT_ACCOUNT_ID?{...next,channels:{...next.channels,discord:{...next.channels?.discord,enabled:!0,token}}}:{...next,channels:{...next.channels,discord:{...next.channels?.discord,enabled:!0,accounts:{...next.channels?.discord?.accounts,[discordAccountId]:{...next.channels?.discord?.accounts?.[discordAccountId],enabled:next.channels?.discord?.accounts?.[discordAccountId]?.enabled??!0,token}}}}});let currentEntries=Object.entries(resolvedAccount.config.guilds??{}).flatMap(([guildKey,value])=>{let channels=value?.channels??{},channelKeys=Object.keys(channels);return channelKeys.length===0?[/^\d+$/.test(guildKey)?`guild:${guildKey}`:guildKey]:channelKeys.map(channelKey=>`${guildKey}/${channelKey}`)}),accessConfig=await promptChannelAccessConfig({prompter,label:`Discord channels`,currentPolicy:resolvedAccount.config.groupPolicy??`allowlist`,currentEntries,placeholder:`My Server/#general, guildId/channelId, #support`,updatePrompt:!!resolvedAccount.config.guilds});if(accessConfig)if(accessConfig.policy!==`allowlist`)next=setDiscordGroupPolicy(next,discordAccountId,accessConfig.policy);else{let accountWithTokens=resolveDiscordAccount({cfg:next,accountId:discordAccountId}),resolved=accessConfig.entries.map(input=>({input,resolved:!1}));if(accountWithTokens.token&&accessConfig.entries.length>0)try{resolved=await resolveDiscordChannelAllowlist({token:accountWithTokens.token,entries:accessConfig.entries});let resolvedChannels=resolved.filter(entry=>entry.resolved&&entry.channelId),resolvedGuilds=resolved.filter(entry=>entry.resolved&&entry.guildId&&!entry.channelId),unresolved=resolved.filter(entry=>!entry.resolved).map(entry=>entry.input);if(resolvedChannels.length>0||resolvedGuilds.length>0||unresolved.length>0){let summary=[];resolvedChannels.length>0&&summary.push(`Resolved channels: ${resolvedChannels.map(entry=>entry.channelId).filter(Boolean).join(`, `)}`),resolvedGuilds.length>0&&summary.push(`Resolved guilds: ${resolvedGuilds.map(entry=>entry.guildId).filter(Boolean).join(`, `)}`),unresolved.length>0&&summary.push(`Unresolved (kept as typed): ${unresolved.join(`, `)}`),await prompter.note(summary.join(`
|
|
@@ -17,7 +17,6 @@ export * from "./engine.js";
|
|
|
17
17
|
export * from "./spec.js";
|
|
18
18
|
export * from "./core-tools.js";
|
|
19
19
|
export * from "./psychometric-dims.js";
|
|
20
|
-
export * from "./limbic.js";
|
|
21
20
|
export * from "./psychometrics.js";
|
|
22
21
|
export * from "./knowledge-notes.js";
|
|
23
22
|
export * from "./skill-tools.js";
|
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
*
|
|
4
4
|
* These string ids are the cross-package contract between the personality
|
|
5
5
|
* compiler (agent-runtime `psychometrics.ts`), the catalog/scoring served to the
|
|
6
|
-
* UI (api `psychometricCatalog.ts`), and the limbic
|
|
7
|
-
* (`
|
|
6
|
+
* UI (api `psychometricCatalog.ts`), and the limbic trait projection
|
|
7
|
+
* (`psychometrics.ts` `limbicTraits`). They were previously duplicated as three separate `DIM` maps
|
|
8
8
|
* that had to be kept byte-identical by hand; this is now the one place they live.
|
|
9
9
|
* Every score in a profile vector is keyed by one of these. Scores are 0..100;
|
|
10
10
|
* an absent dimension is treated as neutral (50).
|