@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.
Files changed (205) hide show
  1. package/dist/{agent-CBRDuLO-.js → agent-59_cdTZl.js} +1 -1
  2. package/dist/{agent-CCY1r5YW.js → agent-CvMM49lm.js} +1 -1
  3. package/dist/{agents-DW3hte-y.js → agents-2d7A-Uwz.js} +1 -1
  4. package/dist/{agents-Ce4bN10e.js → agents-BdOgv61S.js} +1 -1
  5. package/dist/{audio-preflight-BvzGdNYy.js → audio-preflight-CmX2XJ3N.js} +1 -1
  6. package/dist/{audio-preflight-BYMboYmW.js → audio-preflight-Dnw3oDJr.js} +1 -1
  7. package/dist/{audio-preflight-CEOxJosQ.js → audio-preflight-HcRdB0oH.js} +1 -1
  8. package/dist/{audio-preflight-CswNxppe.js → audio-preflight-Sh649dxR.js} +1 -1
  9. package/dist/{auth-choice-DSLN0TLU.js → auth-choice-D06_TWBf.js} +1 -1
  10. package/dist/{auth-choice-BTrUlYmE.js → auth-choice-DyxxR025.js} +1 -1
  11. package/dist/{auth-choice.apply-BZ7E08Yb.js → auth-choice.apply-CUuLdlQd.js} +1 -1
  12. package/dist/{auth-choice.apply-D3EY1pZ3.js → auth-choice.apply-CfFhu_Vk.js} +1 -1
  13. package/dist/{auth-choice.apply-5dpCNO0l.js → auth-choice.apply-D57XA_d9.js} +1 -1
  14. package/dist/{auth-choice.apply-3tPFL-eH.js → auth-choice.apply-s_rOXFVz.js} +1 -1
  15. package/dist/{auth-choice.apply.transformers-B_Q6e8Yk.js → auth-choice.apply.transformers-CqQSUnsx.js} +1 -1
  16. package/dist/{auth-choice.apply.transformers-D1EzC906.js → auth-choice.apply.transformers-DXBWOilg.js} +1 -1
  17. package/dist/{auth-choice.apply.transformers-BJbpyCWs.js → auth-choice.apply.transformers-DizfkAmz.js} +1 -1
  18. package/dist/{auth-choice.apply.transformers-vLzCo5ew.js → auth-choice.apply.transformers-vyvtAxcX.js} +1 -1
  19. package/dist/{banner-DVNoUX5I.js → banner-BXpp_pEd.js} +1 -1
  20. package/dist/build-info.json +3 -3
  21. package/dist/{builderforce-Bs_G8kBN.js → builderforce-BdJAOfvE.js} +2 -2
  22. package/dist/{builderforce-BN_So1di.js → builderforce-BrFUSx35.js} +2 -2
  23. package/dist/{builderforce-directory-sync-BCZK4FYJ.js → builderforce-directory-sync-CFiQew6N.js} +1 -1
  24. package/dist/{builderforce-directory-sync-DHfiUf2g.js → builderforce-directory-sync-DIQQT09l.js} +1 -1
  25. package/dist/{builderforce-onboarding-Bbjz8F-r.js → builderforce-onboarding-CoGJY95Q.js} +1 -1
  26. package/dist/{builderforce-onboarding-8lL2bgtL.js → builderforce-onboarding-DyYM_cib.js} +1 -1
  27. package/dist/{builderforcellm-syscheck-CyZiwcdF.js → builderforcellm-syscheck-CfFrfeV2.js} +1 -1
  28. package/dist/{builderforcellm-syscheck-DMjMJNFI.js → builderforcellm-syscheck-DGZKIwPC.js} +1 -1
  29. package/dist/bundled/boot-md/handler.js +1 -1
  30. package/dist/bundled/session-memory/handler.js +1 -1
  31. package/dist/{channel-options-Zk5QnNPR.js → channel-options--DZ4jYy9.js} +1 -1
  32. package/dist/{channel-options-Cbz6vcgo.js → channel-options-xVK4amr4.js} +1 -1
  33. package/dist/{channel-web-1xD-Ad2T.js → channel-web-9vO41fn2.js} +1 -1
  34. package/dist/{channels-cli-CiVlP8_q.js → channels-cli-Ch1sZ58k.js} +1 -1
  35. package/dist/{channels-cli-BOcpgY_W.js → channels-cli-YMSOJUmp.js} +1 -1
  36. package/dist/chrome-Bi-3xZj-.js +4 -0
  37. package/dist/chrome-C6oWWmHX.js +4 -0
  38. package/dist/{cli-6znoaKr2.js → cli-gsxv7DrZ.js} +1 -1
  39. package/dist/{cli-BPwpRE1j.js → cli-zC5qoRAp.js} +1 -1
  40. package/dist/{command-registry-BTxAGdlS.js → command-registry-BXLjR3kb.js} +1 -1
  41. package/dist/{command-registry-BZINHmI9.js → command-registry-I83E6HLw.js} +1 -1
  42. package/dist/{completion-cli-BwCfUaHz.js → completion-cli-BQCxFDqY.js} +1 -1
  43. package/dist/{completion-cli-vR4Sx9zB.js → completion-cli-CDy8f_Fg.js} +1 -1
  44. package/dist/{completion-cli-C8kMJ401.js → completion-cli-DbIxXK1B.js} +1 -1
  45. package/dist/{completion-cli-D8WkqtSU.js → completion-cli-ydxyAE7J.js} +1 -1
  46. package/dist/{config-cli-BYFA4Nin.js → config-cli-5ZSrACPR.js} +1 -1
  47. package/dist/{config-cli-DVpEv0oj.js → config-cli-BvJso6op.js} +1 -1
  48. package/dist/{configure-COeSbyyP.js → configure-1e4C38zp.js} +1 -1
  49. package/dist/{configure-CW2bJ91q.js → configure-B_oI_bg-.js} +1 -1
  50. package/dist/{configure-B_juJzVi.js → configure-Dp71zeJI.js} +1 -1
  51. package/dist/{configure-CgkUUUpM.js → configure-NxmuXXEd.js} +1 -1
  52. package/dist/{deliver-qM1Zkf4i.js → deliver-C6HTqnzY.js} +1 -1
  53. package/dist/{deliver-BNMupwo6.js → deliver-CdwCHH01.js} +1 -1
  54. package/dist/{deliver-Bs-FVPQ4.js → deliver-DFhj1d_t.js} +1 -1
  55. package/dist/{deliver-C5lVQcrs.js → deliver-XGIFv80r.js} +1 -1
  56. package/dist/{deps-DWFMK9Xg.js → deps-C4YVdrEi.js} +1 -1
  57. package/dist/{doctor-completion-s5vcMc-C.js → doctor-completion-DhIR9uqB.js} +1 -1
  58. package/dist/{doctor-completion-BdMxCat-.js → doctor-completion-Dpy-8HV9.js} +1 -1
  59. package/dist/{embedded-CRoX1qTh.js → embedded-Cw4g0mzl.js} +7 -7
  60. package/dist/{embedded-DpSS2q2a.js → embedded-DG3sEMyg.js} +7 -7
  61. package/dist/{embedded-helpers-BrfnCpCe.js → embedded-helpers-3FEGD_4b.js} +1 -1
  62. package/dist/{embedded-helpers-Q5h1lA6D.js → embedded-helpers-DGDYymYx.js} +1 -1
  63. package/dist/entry.js +1 -1
  64. package/dist/extensionAPI.js +1 -1
  65. package/dist/{gateway-cli-oSSOT67p.js → gateway-cli-BBu6KI7r.js} +4 -4
  66. package/dist/{gateway-cli-DzxNTkvL.js → gateway-cli-CSmbpS6n.js} +4 -4
  67. package/dist/{health-_L8Avf4v.js → health-AOM42u9C.js} +1 -1
  68. package/dist/{health-hXlukqbf.js → health-CRIXA8je.js} +1 -1
  69. package/dist/{health-B_qWRpsT.js → health-Cuh0tZl2.js} +1 -1
  70. package/dist/{hooks-cli-C-vbyL2y.js → hooks-cli-BeqvyPiX.js} +1 -1
  71. package/dist/{hooks-cli-7gBXRQ81.js → hooks-cli-CYI9ZvNI.js} +1 -1
  72. package/dist/index.js +2 -2
  73. package/dist/{ink-session-DpO3VOYc.js → ink-session-MNcfJzij.js} +1 -1
  74. package/dist/{ink-session-CZj35xTR.js → ink-session-VqYNJYzq.js} +1 -1
  75. package/dist/llm-slug-generator.js +1 -1
  76. package/dist/{mamba-state-engine-CFwb8DcP.js → mamba-state-engine-BYmUnYwn.js} +1 -1
  77. package/dist/{mamba-state-engine-Ck2JCfL6.js → mamba-state-engine-BloJzrxU.js} +1 -1
  78. package/dist/{models-PPv9KRbb.js → models-B6kkCBLd.js} +1 -1
  79. package/dist/{models-cli-btaamH96.js → models-cli-C7u8eLls.js} +1 -1
  80. package/dist/{models-cli-BUDSwmIY.js → models-cli-DpbpZwjy.js} +1 -1
  81. package/dist/{models-DMrs_Zsc.js → models-hEa3avo7.js} +1 -1
  82. package/dist/{onboard-4JByma4r.js → onboard-BHlI_UVY.js} +2 -2
  83. package/dist/{onboard-Dq_XQQXY.js → onboard-BW5J0Ym8.js} +2 -2
  84. package/dist/{onboard-channels-Dzyeem1L.js → onboard-channels-BkrhZ79I.js} +1 -1
  85. package/dist/{onboard-channels-D4g6xuSC.js → onboard-channels-DXIqdoto.js} +1 -1
  86. package/dist/{onboard-channels-Dir2EguP.js → onboard-channels-V51s9X-h.js} +1 -1
  87. package/dist/{onboard-channels-UZOCuxN7.js → onboard-channels-fyGQ1v4S.js} +1 -1
  88. package/dist/{onboard-interactive-DvNhkCNr.js → onboard-interactive-ClPMlCIl.js} +1 -1
  89. package/dist/{onboard-interactive-DyyEDd9a.js → onboard-interactive-D6IBBU8m.js} +1 -1
  90. package/dist/{onboard-interactive-CwNfYxGe.js → onboard-interactive-DEeqmoeW.js} +1 -1
  91. package/dist/{onboard-interactive-Co2bcd7g.js → onboard-interactive-DSZak3YX.js} +1 -1
  92. package/dist/{onboarding-DBL-H1Qu.js → onboarding-CYOfGpd5.js} +3 -3
  93. package/dist/{onboarding-CIxLpuFP.js → onboarding-DIxm_q7P.js} +3 -3
  94. package/dist/{onboarding.finalize-CGGbkAOL.js → onboarding.finalize-Co5L0rNp.js} +1 -1
  95. package/dist/{onboarding.finalize-R3TfibWY.js → onboarding.finalize-DAwpQa7n.js} +1 -1
  96. package/dist/{outbound-send-deps-CsJgGsii.js → outbound-send-deps-Cys_MtmC.js} +1 -1
  97. package/dist/{plugin-registry-Ty9w94Rd.js → plugin-registry-BM1-sG-e.js} +1 -1
  98. package/dist/{plugin-registry-BkGhcUDV.js → plugin-registry-CAy3I1K1.js} +1 -1
  99. package/dist/{plugin-registry-BenvgIsJ.js → plugin-registry-DjmzOS3n.js} +1 -1
  100. package/dist/{plugin-registry-DZirturB.js → plugin-registry-l2iN7_1l.js} +1 -1
  101. package/dist/plugin-sdk/agent-runtime/src/builderforce/ports.d.ts +1 -1
  102. package/dist/plugin-sdk/agent-runtime/src/infra/limbic-system-service.d.ts +2 -3
  103. package/dist/plugin-sdk/{audio-preflight-lhP946UF.js → audio-preflight-BbtfbLzo.js} +1 -1
  104. package/dist/plugin-sdk/{channel-web-CzXHQXgb.js → channel-web-BHose9yJ.js} +1 -1
  105. package/dist/plugin-sdk/index.js +1 -1
  106. package/dist/plugin-sdk/packages/agent-tools/src/index.d.ts +0 -1
  107. package/dist/plugin-sdk/packages/agent-tools/src/psychometric-dims.d.ts +2 -2
  108. package/dist/plugin-sdk/packages/agent-tools/src/psychometrics.d.ts +38 -5
  109. package/dist/plugin-sdk/packages/agent-tools/src/spec.d.ts +3 -1
  110. package/dist/plugin-sdk/{reply-DkmZ32IH.js → reply-V98uAjNN.js} +5 -5
  111. package/dist/plugin-sdk/{runner-DeqVi2ay.js → runner-BpFNG45j.js} +1 -1
  112. package/dist/plugin-sdk/{src-yVjde9hC.js → src-pvdIxmTY.js} +2 -2
  113. package/dist/plugin-sdk/{tool-loop-detection-AO2R09bJ.js → tool-loop-detection-Bjiit8CZ.js} +1 -1
  114. package/dist/plugin-sdk/{web-D-h3WpSq.js → web-Bq6nGRsB.js} +1 -1
  115. package/dist/{plugins-r-hGfiMK.js → plugins-BbovMu2g.js} +1 -1
  116. package/dist/{plugins-ChYVZuHy.js → plugins-DrkC1ANW.js} +1 -1
  117. package/dist/{plugins-cli-CKQ2X7tA.js → plugins-cli-CqtTn-Gv.js} +1 -1
  118. package/dist/{plugins-cli-CB7e9eCK.js → plugins-cli-DWlQnRpV.js} +1 -1
  119. package/dist/{program-D71K23KC.js → program-DOGUG9Uz.js} +2 -2
  120. package/dist/{program-context-B9V62ZJg.js → program-context-DBtTOKkf.js} +1 -1
  121. package/dist/{project-context-Cnqfr64Z.js → project-context-C5KLsMTc.js} +1 -1
  122. package/dist/{project-context-DXP12xhk.js → project-context-Cg0S9eFT.js} +1 -1
  123. package/dist/project-context-DbBD_r4v.js +1 -0
  124. package/dist/project-context-nIzFswHk.js +1 -0
  125. package/dist/project-context-store-B96x1Lfk.js +1 -0
  126. package/dist/{project-context-store-C8TROXjr.js → project-context-store-BS994lZX.js} +1 -1
  127. package/dist/{project-context-store-ClFt-YDL.js → project-context-store-BSIWJD6S.js} +1 -1
  128. package/dist/project-context-store-BzX1YdMP.js +1 -0
  129. package/dist/{prompt-select-styled-Cect8vJu.js → prompt-select-styled-2q_0LOx1.js} +1 -1
  130. package/dist/{prompt-select-styled-CJBJZiX_.js → prompt-select-styled-D31D9EIl.js} +1 -1
  131. package/dist/{provider-auth-helpers-DItSj71N.js → provider-auth-helpers-9Ut-MHV9.js} +1 -1
  132. package/dist/{provider-auth-helpers-ByvJdQT3.js → provider-auth-helpers-u1GAP4Bi.js} +1 -1
  133. package/dist/{provider-dispatcher-E-RjX6WG.js → provider-dispatcher-4KsB_bCw.js} +1 -1
  134. package/dist/{provider-dispatcher-D6-kUWf8.js → provider-dispatcher-CG7kSp65.js} +1 -1
  135. package/dist/{push-apns-B6YfFR5s.js → push-apns-CEzi4ars.js} +1 -1
  136. package/dist/{push-apns-n8P3oclR.js → push-apns-oUAHr48A.js} +1 -1
  137. package/dist/{pw-ai-BpY-eMJT.js → pw-ai-CfV_5FWo.js} +1 -1
  138. package/dist/{pw-ai-Bu1w-1rC.js → pw-ai-Dx8XRyPq.js} +1 -1
  139. package/dist/{register.agent-CAsV5dRf.js → register.agent-C84ud-cS.js} +1 -1
  140. package/dist/{register.agent-DQ4zQymV.js → register.agent-Db9SzkZg.js} +1 -1
  141. package/dist/{register.configure-HcPL-Na2.js → register.configure-BfPiEcFk.js} +1 -1
  142. package/dist/{register.configure-B-xRsB-s.js → register.configure-WYMz_fwM.js} +1 -1
  143. package/dist/{register.connect-BcZeAJ1s.js → register.connect-CMN7lqC5.js} +1 -1
  144. package/dist/{register.connect-ChZQOiYF.js → register.connect-Dqhd81kK.js} +1 -1
  145. package/dist/{register.maintenance-C-7Arpam.js → register.maintenance-BpQE-3eC.js} +1 -1
  146. package/dist/{register.maintenance-Jdfg2LKA.js → register.maintenance-DjKxt-jl.js} +1 -1
  147. package/dist/{register.message-D1IU3K0a.js → register.message-C4Gf388m.js} +1 -1
  148. package/dist/{register.message-C3cFBIXY.js → register.message-D5A7-_wN.js} +1 -1
  149. package/dist/{register.onboard-DJ2QNnOi.js → register.onboard-BF5tXr7K.js} +1 -1
  150. package/dist/{register.onboard-DjrhC3jh.js → register.onboard-BO_OtYg9.js} +1 -1
  151. package/dist/{register.setup-BNUqkiVa.js → register.setup-BzDbYjEw.js} +1 -1
  152. package/dist/{register.setup-C8XgG5Zt.js → register.setup-CaWt1bhf.js} +1 -1
  153. package/dist/{register.status-health-sessions-DcqlqAhs.js → register.status-health-sessions-BbYzFw1X.js} +1 -1
  154. package/dist/{register.status-health-sessions-CBTZZ0Rh.js → register.status-health-sessions-CDD6Eoxf.js} +1 -1
  155. package/dist/{register.subclis-CqVl0uO4.js → register.subclis-Cfb5FUTI.js} +1 -1
  156. package/dist/{register.subclis-Meewq2dj.js → register.subclis-yYbEKj9a.js} +1 -1
  157. package/dist/{reply-BsRbeUhd.js → reply-CpGH-3If.js} +8 -8
  158. package/dist/{run-main-CFVoPcgN.js → run-main-B82VAQTQ.js} +1 -1
  159. package/dist/{runner-68-X3KHf.js → runner-BLCTET8O.js} +2 -2
  160. package/dist/{runner-CfNJMPWu.js → runner-C651oVfk.js} +2 -2
  161. package/dist/{runner-BgUG2-RV.js → runner-DCn9sBTn.js} +3 -3
  162. package/dist/{runner-BKHYCYMH.js → runner-xF3_-mDL.js} +3 -3
  163. package/dist/{server-node-events-DusCxrVm.js → server-node-events-Bam08x5E.js} +1 -1
  164. package/dist/{server-node-events-BahizW3Z.js → server-node-events-kbTUUaAA.js} +1 -1
  165. package/dist/{session-dirs-RIA98OsG.js → session-dirs-BBGuanHN.js} +1 -1
  166. package/dist/{session-dirs-Cutn9srI.js → session-dirs-DV-c-o7M.js} +1 -1
  167. package/dist/{src-BRo9ywDM.js → src-BM8G-tIl.js} +3 -3
  168. package/dist/{src-DxNC0IHE.js → src-D2-7sOAX.js} +3 -3
  169. package/dist/{src-NJhXretA.js → src-D5vOHX9i.js} +2 -2
  170. package/dist/{src-Enbbh3hH.js → src-Dptpvd0V.js} +2 -2
  171. package/dist/{status-DPza6sZ1.js → status-BcT4AI8l.js} +1 -1
  172. package/dist/{status-CMdPdaSM.js → status-C9D1ex2G.js} +1 -1
  173. package/dist/{status-CFDh5snF.js → status-D_YsiWpP.js} +1 -1
  174. package/dist/{status-SyaizSN6.js → status-V8zvPBOv.js} +1 -1
  175. package/dist/{status-C1toWVvJ.js → status-i_sJ6Ikx.js} +1 -1
  176. package/dist/{subagent-registry-oB_F2U2W.js → subagent-registry-BUKplZi1.js} +8 -8
  177. package/dist/{subagent-registry-DFzwOGge.js → subagent-registry-BgUoQjBB.js} +1 -1
  178. package/dist/{subagent-registry-C1opJIrJ.js → subagent-registry-DrrF3JoH.js} +1 -1
  179. package/dist/{tool-loop-detection-DxqiqYam.js → tool-loop-detection-Bv0aRyd6.js} +1 -1
  180. package/dist/{tool-loop-detection-3W6bLEza.js → tool-loop-detection-CgUkrbCZ.js} +1 -1
  181. package/dist/{tool-loop-detection-C3z1wqgV.js → tool-loop-detection-CshVZIOE.js} +1 -1
  182. package/dist/{tool-loop-detection-DNM8YCNW.js → tool-loop-detection-bpZ-S3A1.js} +1 -1
  183. package/dist/{tui-Dy1FnApe.js → tui-CdYI5f3k.js} +2 -2
  184. package/dist/{tui-lng2vIp3.js → tui-DgBGTw2s.js} +2 -2
  185. package/dist/{tui-cli-BTFEL897.js → tui-cli-BNeRzoEe.js} +1 -1
  186. package/dist/{tui-cli-D-cDh9DV.js → tui-cli-BZ--mp9s.js} +1 -1
  187. package/dist/{tui-stream-assembler-B_AQD4Kg.js → tui-stream-assembler-BNJE9PoS.js} +1 -1
  188. package/dist/{tui-stream-assembler-Bn1WXUGG.js → tui-stream-assembler-xFcJqFJ9.js} +1 -1
  189. package/dist/{update-cli-BdT4-P_D.js → update-cli-BATUCF7p.js} +1 -1
  190. package/dist/{update-cli-DMMSWPXh.js → update-cli-BRBoX_97.js} +1 -1
  191. package/dist/{web-BiSkmACr.js → web-BdYyXjsX.js} +1 -1
  192. package/dist/{web-CXrAweDC.js → web-C5hfXVCy.js} +1 -1
  193. package/dist/{web-BS6WUf7c.js → web-CsWqmV_E.js} +1 -1
  194. package/dist/{web-CfYUd-lX.js → web-fg3nA4Qq.js} +1 -1
  195. package/dist/{workflow-cli-Du4IfE1A.js → workflow-cli-D-o_-jfU.js} +1 -1
  196. package/dist/{workflow-cli-BuEKJ4ut.js → workflow-cli-DDWSXyi0.js} +1 -1
  197. package/package.json +6 -5
  198. package/dist/chrome-C6fODzE5.js +0 -4
  199. package/dist/chrome-Cm-kVyuA.js +0 -4
  200. package/dist/plugin-sdk/agent-runtime/src/builderforce/limbic.d.ts +0 -14
  201. package/dist/plugin-sdk/packages/agent-tools/src/limbic.d.ts +0 -104
  202. package/dist/project-context-DS52UwJZ.js +0 -1
  203. package/dist/project-context-PiiAmwVd.js +0 -1
  204. package/dist/project-context-store-B2GYSwld.js +0 -1
  205. package/dist/project-context-store-DNx9ScQ_.js +0 -1
@@ -1,2 +1,2 @@
1
- import"../../paths-BVMSM1lQ.js";import{d as resolveAgentIdFromSessionKey,l as normalizeAgentId,u as normalizeMainKey}from"../../session-key-CYpYHc1e.js";import{r as DEFAULT_CHAT_CHANNEL}from"../../registry-D_frpmHZ.js";import{a as resolveAgentModelPrimary,l as resolveEffectiveModelFallbacks,o as resolveAgentSkillsFilter,r as resolveAgentDir,s as resolveAgentWorkspaceDir,t as listAgentIds,u as resolveSessionAgentId}from"../../agent-scope-EkacNLg3.js";import{r as defaultRuntime,t as createSubsystemLogger}from"../../subsystem-BakM_oqD.js";import{h as resolveWorkspaceFilePath,l as ensureAgentWorkspace}from"../../workspace-BCjtHT4u.js";import{a as isCliProvider,dt as DEFAULT_MODEL,ft as DEFAULT_PROVIDER,m as resolveThinkingDefault,o as modelKey,s as normalizeModelRef,t as buildAllowedModelSet,tt as ensureAuthProfileStore,u as resolveConfiguredModelRef,ut as DEFAULT_CONTEXT_TOKENS}from"../../model-selection-CAA3jMci.js";import{n as formatCliCommand}from"../../env-BhRm7_r8.js";import"../../boolean-ssGoaBPk.js";import{A as clearSessionAuthProfileOverride,C as deriveSessionTotalTokens,D as getRemoteSkillEligibility,E as resolveSendPolicy,G as formatOutboundPayloadLog,J as clearAgentRunContext,K as normalizeOutboundPayloads,M as applyVerboseOverride,O as getSkillsSnapshotVersion,U as resolveAgentTimeoutMs,W as deliverOutboundPayloads,X as registerAgentRunContext,Y as emitAgentEvent,Z as runWithModelFallback,_ as resolveOutboundTarget,b as AGENT_LANE_SUBAGENT,g as runCliAgent,h as setCliSessionId,j as applyModelOverrideToSessionEntry,k as lookupContextTokens,m as getCliSessionId,q as normalizeOutboundPayloadsForJson,t as runEmbeddedAgent,v as resolveSessionDeliveryTarget,w as hasNonzeroUsage,y as AGENT_LANE_NESTED}from"../../embedded-CRoX1qTh.js";import"../../src-NJhXretA.js";import{s as SILENT_REPLY_TOKEN}from"../../replies-CXzO6hmR.js";import{r as normalizeChannelId,t as getChannelPlugin}from"../../plugins-J28Y83f5.js";import"../../accounts-193gfWbH.js";import"../../bindings-BfB5A-by.js";import"../../send-C7kUpwrI.js";import"../../send-Bhfq7nri.js";import"../../accounts-DHeA4T6C.js";import"../../send-C9R20JMQ.js";import"../../fetch-BklyLYYN.js";import{n as loadModelCatalog}from"../../model-catalog-DQvHHj3N.js";import"../../redact-sNZY-pGx.js";import"../../errors-BmztzL5I.js";import{$t as resolveChannelResetConfig,An as buildWorkspaceSkillSnapshot,H as normalizeThinkLevel,Ht as normalizeAccountId,K as supportsXHighThinking,L as formatThinkingLevels,Nt as updateSessionStore,Qt as evaluateSessionFreshness,R as formatXHighModelHint,W as normalizeVerboseLevel,Zt as resolveSessionKey,en as resolveSessionResetPolicy,kt as loadSessionStore,on as resolveExplicitAgentSessionKey,sn as resolveMainSessionKey,tn as resolveSessionResetType}from"../../runner-BKHYCYMH.js";import{n as loadConfig}from"../../config-Dtj-XfnY.js";import"../../chrome-Cm-kVyuA.js";import"../../frontmatter-DBVosMFY.js";import"../../store-DN9AcI73.js";import{i as isInternalMessageChannel,l as resolveMessageChannel,n as isDeliverableMessageChannel,r as isGatewayMessageChannel,s as normalizeMessageChannel,t as INTERNAL_MESSAGE_CHANNEL}from"../../message-channel-tBuQgYSD.js";import"../../accounts-C7FtIPYB.js";import{n as resolveSessionFilePath,s as resolveStorePath}from"../../paths-CzXKnIOb.js";import"../../gemini-auth-BIWFfEII.js";import"../../tool-images-mfC2sOfJ.js";import"../../config-DfXnxW-V.js";import"../../reply-prefix-me5vnbrB.js";import"../../sqlite-D3Ov16zb.js";import"../../manager-BEWSA2c7.js";import"../../retry-BYnMCvOU.js";import"../../common-CDXsNQYT.js";import"../../chunk-CrsAQ01n.js";import"../../markdown-tables-DvSC1OTb.js";import"../../ir-Ct8GNKB7.js";import"../../render-CVWbhuqU.js";import"../../send-D320A6MJ.js";import"../../outbound-attachment-U-XtahS5.js";import"../../fetch-Jq1KZsRq.js";import"../../send-B1D5T3_v.js";import"../../resolve-route-CGe48x_Z.js";import"../../channel-activity-xLea9vdo.js";import"../../tables-Desw59m6.js";import"../../active-listener-BQLkI7vg.js";import fs from"node:fs/promises";import crypto from"node:crypto";function createDefaultDeps(){return{sendMessageWhatsApp:async(...args)=>{let{sendMessageWhatsApp}=await import(`../../web-CfYUd-lX.js`);return await sendMessageWhatsApp(...args)},sendMessageTelegram:async(...args)=>{let{sendMessageTelegram}=await import(`../../send-C9R20JMQ.js`).then(n=>n.l);return await sendMessageTelegram(...args)},sendMessageDiscord:async(...args)=>{let{sendMessageDiscord}=await import(`../../send-Bhfq7nri.js`).then(n=>n.t);return await sendMessageDiscord(...args)},sendMessageSlack:async(...args)=>{let{sendMessageSlack}=await import(`../../send-C7kUpwrI.js`).then(n=>n.n);return await sendMessageSlack(...args)},sendMessageSignal:async(...args)=>{let{sendMessageSignal}=await import(`../../send-D320A6MJ.js`).then(n=>n.i);return await sendMessageSignal(...args)},sendMessageIMessage:async(...args)=>{let{sendMessageIMessage}=await import(`../../send-B1D5T3_v.js`).then(n=>n.n);return await sendMessageIMessage(...args)}}}function createOutboundSendDeps(deps){return{sendWhatsApp:deps.sendMessageWhatsApp,sendTelegram:deps.sendMessageTelegram,sendDiscord:deps.sendMessageDiscord,sendSlack:deps.sendMessageSlack,sendSignal:deps.sendMessageSignal,sendIMessage:deps.sendMessageIMessage}}function resolveAgentDeliveryPlan(params){let requestedRaw=typeof params.requestedChannel==`string`?params.requestedChannel.trim():``,requestedChannel=(requestedRaw?normalizeMessageChannel(requestedRaw):void 0)||`last`,explicitTo=typeof params.explicitTo==`string`&&params.explicitTo.trim()?params.explicitTo.trim():void 0,baseDelivery=resolveSessionDeliveryTarget({entry:params.sessionEntry,requestedChannel:requestedChannel===INTERNAL_MESSAGE_CHANNEL?`last`:requestedChannel,explicitTo,explicitThreadId:params.explicitThreadId}),resolvedChannel=requestedChannel===INTERNAL_MESSAGE_CHANNEL?INTERNAL_MESSAGE_CHANNEL:requestedChannel===`last`?baseDelivery.channel&&baseDelivery.channel!==INTERNAL_MESSAGE_CHANNEL?baseDelivery.channel:params.wantsDelivery?DEFAULT_CHAT_CHANNEL:INTERNAL_MESSAGE_CHANNEL:isGatewayMessageChannel(requestedChannel)?requestedChannel:baseDelivery.channel&&baseDelivery.channel!==INTERNAL_MESSAGE_CHANNEL?baseDelivery.channel:params.wantsDelivery?DEFAULT_CHAT_CHANNEL:INTERNAL_MESSAGE_CHANNEL,deliveryTargetMode=explicitTo?`explicit`:isDeliverableMessageChannel(resolvedChannel)?`implicit`:void 0,resolvedAccountId=normalizeAccountId(params.accountId)??(deliveryTargetMode===`implicit`?baseDelivery.accountId:void 0),resolvedTo=explicitTo;return!resolvedTo&&isDeliverableMessageChannel(resolvedChannel)&&resolvedChannel===baseDelivery.lastChannel&&(resolvedTo=baseDelivery.lastTo),{baseDelivery,resolvedChannel,resolvedTo,resolvedAccountId,resolvedThreadId:baseDelivery.threadId,deliveryTargetMode}}function resolveAgentOutboundTarget(params){let targetMode=params.targetMode??params.plan.deliveryTargetMode??(params.plan.resolvedTo?`explicit`:`implicit`);if(!isDeliverableMessageChannel(params.plan.resolvedChannel)||params.validateExplicitTarget!==!0&&params.plan.resolvedTo)return{resolvedTarget:null,resolvedTo:params.plan.resolvedTo,targetMode};let resolvedTarget=resolveOutboundTarget({channel:params.plan.resolvedChannel,to:params.plan.resolvedTo,cfg:params.cfg,accountId:params.plan.resolvedAccountId,mode:targetMode});return{resolvedTarget,resolvedTo:resolvedTarget.ok?resolvedTarget.to:params.plan.resolvedTo,targetMode}}const isOutboundPayloadJson=payload=>`mediaUrl`in payload;function buildOutboundResultEnvelope(params){let hasPayloads=params.payloads!==void 0,payloads=params.payloads===void 0?void 0:params.payloads.length===0?[]:isOutboundPayloadJson(params.payloads[0])?params.payloads:normalizeOutboundPayloadsForJson(params.payloads);return params.flattenDelivery!==!1&&params.delivery&&!params.meta&&!hasPayloads?params.delivery:{...hasPayloads?{payloads}:{},...params.meta?{meta:params.meta}:{},...params.delivery?{delivery:params.delivery}:{}}}function formatNestedLogPrefix(opts){let parts=[`[agent:nested]`],session=opts.sessionKey??opts.sessionId;session&&parts.push(`session=${session}`),opts.runId&&parts.push(`run=${opts.runId}`);let channel=opts.messageChannel??opts.channel;return channel&&parts.push(`channel=${channel}`),opts.to&&parts.push(`to=${opts.to}`),opts.accountId&&parts.push(`account=${opts.accountId}`),parts.join(` `)}function logNestedOutput(runtime,opts,output){let prefix=formatNestedLogPrefix(opts);for(let line of output.split(/\r?\n/))line&&runtime.log(`${prefix} ${line}`)}async function deliverAgentCommandResult(params){let{cfg,deps,runtime,opts,sessionEntry,payloads,result}=params,deliver=opts.deliver===!0,bestEffortDeliver=opts.bestEffortDeliver===!0,deliveryPlan=resolveAgentDeliveryPlan({sessionEntry,requestedChannel:opts.replyChannel??opts.channel,explicitTo:opts.replyTo??opts.to,explicitThreadId:opts.threadId,accountId:opts.replyAccountId??opts.accountId,wantsDelivery:deliver}),deliveryChannel=deliveryPlan.resolvedChannel,deliveryPlugin=isInternalMessageChannel(deliveryChannel)?void 0:getChannelPlugin(normalizeChannelId(deliveryChannel)??deliveryChannel),isDeliveryChannelKnown=isInternalMessageChannel(deliveryChannel)||!!deliveryPlugin,targetMode=opts.deliveryTargetMode??deliveryPlan.deliveryTargetMode??(opts.to?`explicit`:`implicit`),resolvedAccountId=deliveryPlan.resolvedAccountId,resolved=deliver&&isDeliveryChannelKnown&&deliveryChannel?resolveAgentOutboundTarget({cfg,plan:deliveryPlan,targetMode,validateExplicitTarget:!0}):{resolvedTarget:null,resolvedTo:deliveryPlan.resolvedTo,targetMode},resolvedTarget=resolved.resolvedTarget,deliveryTarget=resolved.resolvedTo,resolvedThreadId=deliveryPlan.resolvedThreadId??opts.threadId,resolvedReplyToId=deliveryChannel===`slack`&&resolvedThreadId!=null?String(resolvedThreadId):void 0,resolvedThreadTarget=deliveryChannel===`slack`?void 0:resolvedThreadId,logDeliveryError=err=>{let message=`Delivery failed (${deliveryChannel}${deliveryTarget?` to ${deliveryTarget}`:``}): ${String(err)}`;runtime.error?.(message),runtime.error||runtime.log(message)};if(deliver){if(!isDeliveryChannelKnown){let err=Error(`Unknown channel: ${deliveryChannel}`);if(!bestEffortDeliver)throw err;logDeliveryError(err)}else if(resolvedTarget&&!resolvedTarget.ok){if(!bestEffortDeliver)throw resolvedTarget.error;logDeliveryError(resolvedTarget.error)}}let normalizedPayloads=normalizeOutboundPayloadsForJson(payloads??[]);if(opts.json&&(runtime.log(JSON.stringify(buildOutboundResultEnvelope({payloads:normalizedPayloads,meta:result.meta}),null,2)),!deliver))return{payloads:normalizedPayloads,meta:result.meta};if(!payloads||payloads.length===0)return runtime.log(`No reply from agent.`),{payloads:[],meta:result.meta};let deliveryPayloads=normalizeOutboundPayloads(payloads),logPayload=payload=>{if(opts.json)return;let output=formatOutboundPayloadLog(payload);if(output){if(opts.lane===AGENT_LANE_NESTED){logNestedOutput(runtime,opts,output);return}runtime.log(output)}};if(!deliver)for(let payload of deliveryPayloads)logPayload(payload);return deliver&&deliveryChannel&&!isInternalMessageChannel(deliveryChannel)&&deliveryTarget&&await deliverOutboundPayloads({cfg,channel:deliveryChannel,to:deliveryTarget,accountId:resolvedAccountId,payloads:deliveryPayloads,agentId:opts.agentId??(opts.sessionKey?resolveSessionAgentId({sessionKey:opts.sessionKey,config:cfg}):void 0),replyToId:resolvedReplyToId??null,threadId:resolvedThreadTarget??null,bestEffort:bestEffortDeliver,onError:err=>logDeliveryError(err),onPayload:logPayload,deps:createOutboundSendDeps(deps)}),{payloads:normalizedPayloads,meta:result.meta}}function resolveAgentRunContext(opts){let merged=opts.runContext?{...opts.runContext}:{},normalizedChannel=resolveMessageChannel(merged.messageChannel??opts.messageChannel,opts.replyChannel??opts.channel);normalizedChannel&&(merged.messageChannel=normalizedChannel);let normalizedAccountId=normalizeAccountId(merged.accountId??opts.accountId);normalizedAccountId&&(merged.accountId=normalizedAccountId);let groupId=(merged.groupId??opts.groupId)?.toString().trim();groupId&&(merged.groupId=groupId);let groupChannel=(merged.groupChannel??opts.groupChannel)?.toString().trim();groupChannel&&(merged.groupChannel=groupChannel);let groupSpace=(merged.groupSpace??opts.groupSpace)?.toString().trim();if(groupSpace&&(merged.groupSpace=groupSpace),merged.currentThreadTs==null&&opts.threadId!=null&&opts.threadId!==``&&opts.threadId!==null&&(merged.currentThreadTs=String(opts.threadId)),!merged.currentChannelId&&opts.to){let trimmedTo=opts.to.trim();trimmedTo&&(merged.currentChannelId=trimmedTo)}return merged}async function updateSessionStoreAfterAgentRun(params){let{cfg,sessionId,sessionKey,storePath,sessionStore,defaultProvider,defaultModel,fallbackProvider,fallbackModel,result}=params,usage=result.meta.agentMeta?.usage,promptTokens=result.meta.agentMeta?.promptTokens,compactionsThisRun=Math.max(0,result.meta.agentMeta?.compactionCount??0),modelUsed=result.meta.agentMeta?.model??fallbackModel??defaultModel,providerUsed=result.meta.agentMeta?.provider??fallbackProvider??defaultProvider,contextTokens=params.contextTokensOverride??lookupContextTokens(modelUsed)??DEFAULT_CONTEXT_TOKENS,entry=sessionStore[sessionKey]??{sessionId,updatedAt:Date.now()},next={...entry,sessionId,updatedAt:Date.now(),modelProvider:providerUsed,model:modelUsed,contextTokens};if(isCliProvider(providerUsed,cfg)){let cliSessionId=result.meta.agentMeta?.sessionId?.trim();cliSessionId&&setCliSessionId(next,providerUsed,cliSessionId)}if(next.abortedLastRun=result.meta.aborted??!1,hasNonzeroUsage(usage)){let input=usage.input??0,output=usage.output??0,totalTokens=deriveSessionTotalTokens({usage,contextTokens,promptTokens})??input;next.inputTokens=input,next.outputTokens=output,next.totalTokens=totalTokens,next.totalTokensFresh=!0}compactionsThisRun>0&&(next.compactionCount=(entry.compactionCount??0)+compactionsThisRun),sessionStore[sessionKey]=next,await updateSessionStore(storePath,store=>{store[sessionKey]=next})}function resolveSessionKeyForRequest(opts){let sessionCfg=opts.cfg.session,scope=sessionCfg?.scope??`per-sender`,mainKey=normalizeMainKey(sessionCfg?.mainKey),explicitSessionKey=opts.sessionKey?.trim()||resolveExplicitAgentSessionKey({cfg:opts.cfg,agentId:opts.agentId}),storeAgentId=resolveAgentIdFromSessionKey(explicitSessionKey),storePath=resolveStorePath(sessionCfg?.store,{agentId:storeAgentId}),sessionStore=loadSessionStore(storePath),ctx=opts.to?.trim()?{From:opts.to}:void 0,sessionKey=explicitSessionKey??(ctx?resolveSessionKey(scope,ctx,mainKey):void 0);if(!explicitSessionKey&&opts.sessionId&&(!sessionKey||sessionStore[sessionKey]?.sessionId!==opts.sessionId)){let foundKey=Object.keys(sessionStore).find(key=>sessionStore[key]?.sessionId===opts.sessionId);foundKey&&(sessionKey=foundKey)}if(opts.sessionId&&!explicitSessionKey&&(!sessionKey||sessionStore[sessionKey]?.sessionId!==opts.sessionId)){let allAgentIds=listAgentIds(opts.cfg);for(let agentId of allAgentIds){if(agentId===storeAgentId)continue;let altStorePath=resolveStorePath(sessionCfg?.store,{agentId}),altStore=loadSessionStore(altStorePath),foundKey=Object.keys(altStore).find(key=>altStore[key]?.sessionId===opts.sessionId);if(foundKey)return{sessionKey:foundKey,sessionStore:altStore,storePath:altStorePath}}}return{sessionKey,sessionStore,storePath}}function resolveSession(opts){let sessionCfg=opts.cfg.session,{sessionKey,sessionStore,storePath}=resolveSessionKeyForRequest({cfg:opts.cfg,to:opts.to,sessionId:opts.sessionId,sessionKey:opts.sessionKey,agentId:opts.agentId}),now=Date.now(),sessionEntry=sessionKey?sessionStore[sessionKey]:void 0,resetPolicy=resolveSessionResetPolicy({sessionCfg,resetType:resolveSessionResetType({sessionKey}),resetOverride:resolveChannelResetConfig({sessionCfg,channel:sessionEntry?.lastChannel??sessionEntry?.channel})}),fresh=sessionEntry?evaluateSessionFreshness({updatedAt:sessionEntry.updatedAt,now,policy:resetPolicy}).fresh:!1;return{sessionId:opts.sessionId?.trim()||(fresh?sessionEntry?.sessionId:void 0)||crypto.randomUUID(),sessionKey,sessionEntry,sessionStore,storePath,isNewSession:!fresh&&!opts.sessionId,persistedThinking:fresh&&sessionEntry?.thinkingLevel?normalizeThinkLevel(sessionEntry.thinkingLevel):void 0,persistedVerbose:fresh&&sessionEntry?.verboseLevel?normalizeVerboseLevel(sessionEntry.verboseLevel):void 0}}async function persistSessionEntry(params){params.sessionStore[params.sessionKey]=params.entry,await updateSessionStore(params.storePath,store=>{store[params.sessionKey]=params.entry})}function resolveFallbackRetryPrompt(params){return params.isFallbackRetry?`Continue where you left off. The previous model attempt failed or timed out.`:params.body}function runAgentAttempt(params){let effectivePrompt=resolveFallbackRetryPrompt({body:params.body,isFallbackRetry:params.isFallbackRetry});if(isCliProvider(params.providerOverride,params.cfg)){let cliSessionId=getCliSessionId(params.sessionEntry,params.providerOverride);return runCliAgent({sessionId:params.sessionId,sessionKey:params.sessionKey,agentId:params.sessionAgentId,sessionFile:params.sessionFile,workspaceDir:params.workspaceDir,config:params.cfg,prompt:effectivePrompt,provider:params.providerOverride,model:params.modelOverride,thinkLevel:params.resolvedThinkLevel,timeoutMs:params.timeoutMs,runId:params.runId,extraSystemPrompt:params.opts.extraSystemPrompt,cliSessionId,images:params.isFallbackRetry?void 0:params.opts.images,streamParams:params.opts.streamParams})}let authProfileId=params.providerOverride===params.primaryProvider?params.sessionEntry?.authProfileOverride:void 0;return runEmbeddedAgent({sessionId:params.sessionId,sessionKey:params.sessionKey,agentId:params.sessionAgentId,messageChannel:params.messageChannel,agentAccountId:params.runContext.accountId,messageTo:params.opts.replyTo??params.opts.to,messageThreadId:params.opts.threadId,groupId:params.runContext.groupId,groupChannel:params.runContext.groupChannel,groupSpace:params.runContext.groupSpace,spawnedBy:params.spawnedBy,currentChannelId:params.runContext.currentChannelId,currentThreadTs:params.runContext.currentThreadTs,replyToMode:params.runContext.replyToMode,hasRepliedRef:params.runContext.hasRepliedRef,senderIsOwner:!0,sessionFile:params.sessionFile,workspaceDir:params.workspaceDir,config:params.cfg,skillsSnapshot:params.skillsSnapshot,prompt:effectivePrompt,images:params.isFallbackRetry?void 0:params.opts.images,clientTools:params.opts.clientTools,provider:params.providerOverride,model:params.modelOverride,authProfileId,authProfileIdSource:authProfileId?params.sessionEntry?.authProfileOverrideSource:void 0,thinkLevel:params.resolvedThinkLevel,verboseLevel:params.resolvedVerboseLevel,timeoutMs:params.timeoutMs,runId:params.runId,lane:params.opts.lane,abortSignal:params.opts.abortSignal,extraSystemPrompt:params.opts.extraSystemPrompt,inputProvenance:params.opts.inputProvenance,streamParams:params.opts.streamParams,agentDir:params.agentDir,onAgentEvent:params.onAgentEvent})}async function agentCommand(opts,runtime=defaultRuntime,deps=createDefaultDeps()){let body=(opts.message??``).trim();if(!body)throw Error(`Message (--message) is required`);if(!opts.to&&!opts.sessionId&&!opts.sessionKey&&!opts.agentId)throw Error(`Pass --to <E.164>, --session-id, or --agent to choose a session`);let cfg=loadConfig(),agentIdOverrideRaw=opts.agentId?.trim(),agentIdOverride=agentIdOverrideRaw?normalizeAgentId(agentIdOverrideRaw):void 0;if(agentIdOverride&&!listAgentIds(cfg).includes(agentIdOverride))throw Error(`Unknown agent id "${agentIdOverrideRaw}". Use "${formatCliCommand(`builderforce agents list`)}" to see configured agents.`);if(agentIdOverride&&opts.sessionKey){let sessionAgentId=resolveAgentIdFromSessionKey(opts.sessionKey);if(sessionAgentId!==agentIdOverride)throw Error(`Agent id "${agentIdOverrideRaw}" does not match session key agent "${sessionAgentId}".`)}let agentCfg=cfg.agents?.defaults,sessionAgentId=agentIdOverride??resolveAgentIdFromSessionKey(opts.sessionKey?.trim()),workspaceDirRaw=resolveAgentWorkspaceDir(cfg,sessionAgentId),agentDir=resolveAgentDir(cfg,sessionAgentId),workspaceDir=(await ensureAgentWorkspace({dir:workspaceDirRaw,ensureBootstrapFiles:!agentCfg?.skipBootstrap})).dir,configuredModel=resolveConfiguredModelRef({cfg,defaultProvider:DEFAULT_PROVIDER,defaultModel:DEFAULT_MODEL}),thinkingLevelsHint=formatThinkingLevels(configuredModel.provider,configuredModel.model),thinkOverride=normalizeThinkLevel(opts.thinking),thinkOnce=normalizeThinkLevel(opts.thinkingOnce);if(opts.thinking&&!thinkOverride)throw Error(`Invalid thinking level. Use one of: ${thinkingLevelsHint}.`);if(opts.thinkingOnce&&!thinkOnce)throw Error(`Invalid one-shot thinking level. Use one of: ${thinkingLevelsHint}.`);let verboseOverride=normalizeVerboseLevel(opts.verbose);if(opts.verbose&&!verboseOverride)throw Error(`Invalid verbose level. Use "on", "full", or "off".`);let isSubagentLane=(typeof opts.lane==`string`?opts.lane.trim():``)===String(AGENT_LANE_SUBAGENT),timeoutSecondsRaw=opts.timeout===void 0?isSubagentLane?0:void 0:Number.parseInt(String(opts.timeout),10);if(timeoutSecondsRaw!==void 0&&(Number.isNaN(timeoutSecondsRaw)||timeoutSecondsRaw<0))throw Error(`--timeout must be a non-negative integer (seconds; 0 means no timeout)`);let timeoutMs=resolveAgentTimeoutMs({cfg,overrideSeconds:timeoutSecondsRaw}),{sessionId,sessionKey,sessionEntry:resolvedSessionEntry,sessionStore,storePath,isNewSession,persistedThinking,persistedVerbose}=resolveSession({cfg,to:opts.to,sessionId:opts.sessionId,sessionKey:opts.sessionKey,agentId:agentIdOverride}),sessionEntry=resolvedSessionEntry,runId=opts.runId?.trim()||sessionId;try{if(opts.deliver===!0&&resolveSendPolicy({cfg,entry:sessionEntry,sessionKey,channel:sessionEntry?.channel,chatType:sessionEntry?.chatType})===`deny`)throw Error(`send blocked by session policy`);let resolvedThinkLevel=thinkOnce??thinkOverride??persistedThinking??agentCfg?.thinkingDefault,resolvedVerboseLevel=verboseOverride??persistedVerbose??agentCfg?.verboseDefault??`on`;sessionKey&&registerAgentRunContext(runId,{sessionKey,verboseLevel:resolvedVerboseLevel});let needsSkillsSnapshot=isNewSession||!sessionEntry?.skillsSnapshot,skillsSnapshotVersion=getSkillsSnapshotVersion(workspaceDir),skillFilter=resolveAgentSkillsFilter(cfg,sessionAgentId),skillsSnapshot=needsSkillsSnapshot?buildWorkspaceSkillSnapshot(workspaceDir,{config:cfg,eligibility:{remote:getRemoteSkillEligibility()},snapshotVersion:skillsSnapshotVersion,skillFilter}):sessionEntry?.skillsSnapshot;if(skillsSnapshot&&sessionStore&&sessionKey&&needsSkillsSnapshot){let next={...sessionEntry??{sessionId,updatedAt:Date.now()},sessionId,updatedAt:Date.now(),skillsSnapshot};await persistSessionEntry({sessionStore,sessionKey,storePath,entry:next}),sessionEntry=next}if(sessionStore&&sessionKey){let next={...sessionStore[sessionKey]??sessionEntry??{sessionId,updatedAt:Date.now()},sessionId,updatedAt:Date.now()};thinkOverride&&(next.thinkingLevel=thinkOverride),applyVerboseOverride(next,verboseOverride),await persistSessionEntry({sessionStore,sessionKey,storePath,entry:next})}let agentModelPrimary=resolveAgentModelPrimary(cfg,sessionAgentId),configuredDefaultRef=resolveConfiguredModelRef({cfg:agentModelPrimary?{...cfg,agents:{...cfg.agents,defaults:{...cfg.agents?.defaults,model:{...typeof cfg.agents?.defaults?.model==`object`?cfg.agents.defaults.model:void 0,primary:agentModelPrimary}}}}:cfg,defaultProvider:DEFAULT_PROVIDER,defaultModel:DEFAULT_MODEL}),{provider:defaultProvider,model:defaultModel}=normalizeModelRef(configuredDefaultRef.provider,configuredDefaultRef.model),provider=defaultProvider,model=defaultModel,hasAllowlist=agentCfg?.models&&Object.keys(agentCfg.models).length>0,hasStoredOverride=!!(sessionEntry?.modelOverride||sessionEntry?.providerOverride),needsModelCatalog=hasAllowlist||hasStoredOverride,allowedModelKeys=new Set,allowedModelCatalog=[],modelCatalog=null;if(needsModelCatalog){modelCatalog=await loadModelCatalog({config:cfg});let allowed=buildAllowedModelSet({cfg,catalog:modelCatalog,defaultProvider,defaultModel});allowedModelKeys=allowed.allowedKeys,allowedModelCatalog=allowed.allowedCatalog}if(sessionEntry&&sessionStore&&sessionKey&&hasStoredOverride){let entry=sessionEntry,overrideProvider=sessionEntry.providerOverride?.trim()||defaultProvider,overrideModel=sessionEntry.modelOverride?.trim();if(overrideModel){let normalizedOverride=normalizeModelRef(overrideProvider,overrideModel),key=modelKey(normalizedOverride.provider,normalizedOverride.model);if(!isCliProvider(normalizedOverride.provider,cfg)&&allowedModelKeys.size>0&&!allowedModelKeys.has(key)){let{updated}=applyModelOverrideToSessionEntry({entry,selection:{provider:defaultProvider,model:defaultModel,isDefault:!0}});updated&&await persistSessionEntry({sessionStore,sessionKey,storePath,entry})}}}let storedProviderOverride=sessionEntry?.providerOverride?.trim(),storedModelOverride=sessionEntry?.modelOverride?.trim();if(storedModelOverride){let normalizedStored=normalizeModelRef(storedProviderOverride||defaultProvider,storedModelOverride),key=modelKey(normalizedStored.provider,normalizedStored.model);(isCliProvider(normalizedStored.provider,cfg)||allowedModelKeys.size===0||allowedModelKeys.has(key))&&(provider=normalizedStored.provider,model=normalizedStored.model)}if(sessionEntry){let authProfileId=sessionEntry.authProfileOverride;if(authProfileId){let entry=sessionEntry,profile=(await ensureAuthProfileStore()).profiles[authProfileId];(!profile||profile.provider!==provider)&&sessionStore&&sessionKey&&await clearSessionAuthProfileOverride({sessionEntry:entry,sessionStore,sessionKey,storePath})}}if(!resolvedThinkLevel){let catalogForThinking=modelCatalog??allowedModelCatalog;(!catalogForThinking||catalogForThinking.length===0)&&(modelCatalog=await loadModelCatalog({config:cfg}),catalogForThinking=modelCatalog),resolvedThinkLevel=resolveThinkingDefault({cfg,provider,model,catalog:catalogForThinking})}if(resolvedThinkLevel===`xhigh`&&!supportsXHighThinking(provider,model)){if(thinkOnce||thinkOverride)throw Error(`Thinking level "xhigh" is only supported for ${formatXHighModelHint()}.`);if(resolvedThinkLevel=`high`,sessionEntry&&sessionStore&&sessionKey&&sessionEntry.thinkingLevel===`xhigh`){let entry=sessionEntry;entry.thinkingLevel=`high`,entry.updatedAt=Date.now(),await persistSessionEntry({sessionStore,sessionKey,storePath,entry})}}let sessionFile=resolveSessionFilePath(sessionId,sessionEntry,{agentId:sessionAgentId}),startedAt=Date.now(),lifecycleEnded=!1,result,fallbackProvider=provider,fallbackModel=model;try{let runContext=resolveAgentRunContext(opts),messageChannel=resolveMessageChannel(runContext.messageChannel,opts.replyChannel??opts.channel),spawnedBy=opts.spawnedBy??sessionEntry?.spawnedBy,effectiveFallbacksOverride=resolveEffectiveModelFallbacks({cfg,agentId:sessionAgentId,hasSessionModelOverride:!!storedModelOverride}),fallbackAttemptIndex=0,fallbackResult=await runWithModelFallback({cfg,provider,model,agentDir,fallbacksOverride:effectiveFallbacksOverride,run:(providerOverride,modelOverride)=>{let isFallbackRetry=fallbackAttemptIndex>0;return fallbackAttemptIndex+=1,runAgentAttempt({providerOverride,modelOverride,cfg,sessionEntry,sessionId,sessionKey,sessionAgentId,sessionFile,workspaceDir,body,isFallbackRetry,resolvedThinkLevel,timeoutMs,runId,opts,runContext,spawnedBy,messageChannel,skillsSnapshot,resolvedVerboseLevel,agentDir,primaryProvider:provider,onAgentEvent:evt=>{evt.stream===`lifecycle`&&typeof evt.data?.phase==`string`&&(evt.data.phase===`end`||evt.data.phase===`error`)&&(lifecycleEnded=!0)}})}});result=fallbackResult.result,fallbackProvider=fallbackResult.provider,fallbackModel=fallbackResult.model,lifecycleEnded||emitAgentEvent({runId,stream:`lifecycle`,data:{phase:`end`,startedAt,endedAt:Date.now(),aborted:result.meta.aborted??!1}})}catch(err){throw lifecycleEnded||emitAgentEvent({runId,stream:`lifecycle`,data:{phase:`error`,startedAt,endedAt:Date.now(),error:String(err)}}),err}sessionStore&&sessionKey&&await updateSessionStoreAfterAgentRun({cfg,contextTokensOverride:agentCfg?.contextTokens,sessionId,sessionKey,storePath,sessionStore,defaultProvider:provider,defaultModel:model,fallbackProvider,fallbackModel,result});let payloads=result.payloads??[];return await deliverAgentCommandResult({cfg,deps,runtime,opts,sessionEntry,result,payloads})}finally{clearAgentRunContext(runId)}}function generateBootSessionId(){return`boot-${new Date().toISOString().replace(/[:.]/g,`-`).replace(`T`,`_`).replace(`Z`,``)}-${crypto.randomUUID().slice(0,8)}`}const log=createSubsystemLogger(`gateway/boot`),BOOT_FILENAME=`BOOT.md`;function buildBootPrompt(content){return[`You are running a boot check. Follow BOOT.md instructions exactly.`,``,`BOOT.md:`,content,``,`If BOOT.md asks you to send a message, use the message tool (action=send with channel + target).`,"Use the `target` field (not `to`) for message tool destinations.",`After sending with the message tool, reply with ONLY: ${SILENT_REPLY_TOKEN}.`,`If nothing needs attention, reply with ONLY: ${SILENT_REPLY_TOKEN}.`].join(`
1
+ import"../../paths-BVMSM1lQ.js";import{d as resolveAgentIdFromSessionKey,l as normalizeAgentId,u as normalizeMainKey}from"../../session-key-CYpYHc1e.js";import{r as DEFAULT_CHAT_CHANNEL}from"../../registry-D_frpmHZ.js";import{a as resolveAgentModelPrimary,l as resolveEffectiveModelFallbacks,o as resolveAgentSkillsFilter,r as resolveAgentDir,s as resolveAgentWorkspaceDir,t as listAgentIds,u as resolveSessionAgentId}from"../../agent-scope-EkacNLg3.js";import{r as defaultRuntime,t as createSubsystemLogger}from"../../subsystem-BakM_oqD.js";import{h as resolveWorkspaceFilePath,l as ensureAgentWorkspace}from"../../workspace-BCjtHT4u.js";import{a as isCliProvider,dt as DEFAULT_MODEL,ft as DEFAULT_PROVIDER,m as resolveThinkingDefault,o as modelKey,s as normalizeModelRef,t as buildAllowedModelSet,tt as ensureAuthProfileStore,u as resolveConfiguredModelRef,ut as DEFAULT_CONTEXT_TOKENS}from"../../model-selection-CAA3jMci.js";import{n as formatCliCommand}from"../../env-BhRm7_r8.js";import"../../boolean-ssGoaBPk.js";import{A as clearSessionAuthProfileOverride,C as deriveSessionTotalTokens,D as getRemoteSkillEligibility,E as resolveSendPolicy,G as formatOutboundPayloadLog,J as clearAgentRunContext,K as normalizeOutboundPayloads,M as applyVerboseOverride,O as getSkillsSnapshotVersion,U as resolveAgentTimeoutMs,W as deliverOutboundPayloads,X as registerAgentRunContext,Y as emitAgentEvent,Z as runWithModelFallback,_ as resolveOutboundTarget,b as AGENT_LANE_SUBAGENT,g as runCliAgent,h as setCliSessionId,j as applyModelOverrideToSessionEntry,k as lookupContextTokens,m as getCliSessionId,q as normalizeOutboundPayloadsForJson,t as runEmbeddedAgent,v as resolveSessionDeliveryTarget,w as hasNonzeroUsage,y as AGENT_LANE_NESTED}from"../../embedded-Cw4g0mzl.js";import"../../src-D5vOHX9i.js";import{s as SILENT_REPLY_TOKEN}from"../../replies-CXzO6hmR.js";import{r as normalizeChannelId,t as getChannelPlugin}from"../../plugins-J28Y83f5.js";import"../../accounts-193gfWbH.js";import"../../bindings-BfB5A-by.js";import"../../send-C7kUpwrI.js";import"../../send-Bhfq7nri.js";import"../../accounts-DHeA4T6C.js";import"../../send-C9R20JMQ.js";import"../../fetch-BklyLYYN.js";import{n as loadModelCatalog}from"../../model-catalog-DQvHHj3N.js";import"../../redact-sNZY-pGx.js";import"../../errors-BmztzL5I.js";import{$t as resolveChannelResetConfig,An as buildWorkspaceSkillSnapshot,H as normalizeThinkLevel,Ht as normalizeAccountId,K as supportsXHighThinking,L as formatThinkingLevels,Nt as updateSessionStore,Qt as evaluateSessionFreshness,R as formatXHighModelHint,W as normalizeVerboseLevel,Zt as resolveSessionKey,en as resolveSessionResetPolicy,kt as loadSessionStore,on as resolveExplicitAgentSessionKey,sn as resolveMainSessionKey,tn as resolveSessionResetType}from"../../runner-xF3_-mDL.js";import{n as loadConfig}from"../../config-Dtj-XfnY.js";import"../../chrome-Bi-3xZj-.js";import"../../frontmatter-DBVosMFY.js";import"../../store-DN9AcI73.js";import{i as isInternalMessageChannel,l as resolveMessageChannel,n as isDeliverableMessageChannel,r as isGatewayMessageChannel,s as normalizeMessageChannel,t as INTERNAL_MESSAGE_CHANNEL}from"../../message-channel-tBuQgYSD.js";import"../../accounts-C7FtIPYB.js";import{n as resolveSessionFilePath,s as resolveStorePath}from"../../paths-CzXKnIOb.js";import"../../gemini-auth-BIWFfEII.js";import"../../tool-images-mfC2sOfJ.js";import"../../config-DfXnxW-V.js";import"../../reply-prefix-me5vnbrB.js";import"../../sqlite-D3Ov16zb.js";import"../../manager-BEWSA2c7.js";import"../../retry-BYnMCvOU.js";import"../../common-CDXsNQYT.js";import"../../chunk-CrsAQ01n.js";import"../../markdown-tables-DvSC1OTb.js";import"../../ir-Ct8GNKB7.js";import"../../render-CVWbhuqU.js";import"../../send-D320A6MJ.js";import"../../outbound-attachment-U-XtahS5.js";import"../../fetch-Jq1KZsRq.js";import"../../send-B1D5T3_v.js";import"../../resolve-route-CGe48x_Z.js";import"../../channel-activity-xLea9vdo.js";import"../../tables-Desw59m6.js";import"../../active-listener-BQLkI7vg.js";import fs from"node:fs/promises";import crypto from"node:crypto";function createDefaultDeps(){return{sendMessageWhatsApp:async(...args)=>{let{sendMessageWhatsApp}=await import(`../../web-fg3nA4Qq.js`);return await sendMessageWhatsApp(...args)},sendMessageTelegram:async(...args)=>{let{sendMessageTelegram}=await import(`../../send-C9R20JMQ.js`).then(n=>n.l);return await sendMessageTelegram(...args)},sendMessageDiscord:async(...args)=>{let{sendMessageDiscord}=await import(`../../send-Bhfq7nri.js`).then(n=>n.t);return await sendMessageDiscord(...args)},sendMessageSlack:async(...args)=>{let{sendMessageSlack}=await import(`../../send-C7kUpwrI.js`).then(n=>n.n);return await sendMessageSlack(...args)},sendMessageSignal:async(...args)=>{let{sendMessageSignal}=await import(`../../send-D320A6MJ.js`).then(n=>n.i);return await sendMessageSignal(...args)},sendMessageIMessage:async(...args)=>{let{sendMessageIMessage}=await import(`../../send-B1D5T3_v.js`).then(n=>n.n);return await sendMessageIMessage(...args)}}}function createOutboundSendDeps(deps){return{sendWhatsApp:deps.sendMessageWhatsApp,sendTelegram:deps.sendMessageTelegram,sendDiscord:deps.sendMessageDiscord,sendSlack:deps.sendMessageSlack,sendSignal:deps.sendMessageSignal,sendIMessage:deps.sendMessageIMessage}}function resolveAgentDeliveryPlan(params){let requestedRaw=typeof params.requestedChannel==`string`?params.requestedChannel.trim():``,requestedChannel=(requestedRaw?normalizeMessageChannel(requestedRaw):void 0)||`last`,explicitTo=typeof params.explicitTo==`string`&&params.explicitTo.trim()?params.explicitTo.trim():void 0,baseDelivery=resolveSessionDeliveryTarget({entry:params.sessionEntry,requestedChannel:requestedChannel===INTERNAL_MESSAGE_CHANNEL?`last`:requestedChannel,explicitTo,explicitThreadId:params.explicitThreadId}),resolvedChannel=requestedChannel===INTERNAL_MESSAGE_CHANNEL?INTERNAL_MESSAGE_CHANNEL:requestedChannel===`last`?baseDelivery.channel&&baseDelivery.channel!==INTERNAL_MESSAGE_CHANNEL?baseDelivery.channel:params.wantsDelivery?DEFAULT_CHAT_CHANNEL:INTERNAL_MESSAGE_CHANNEL:isGatewayMessageChannel(requestedChannel)?requestedChannel:baseDelivery.channel&&baseDelivery.channel!==INTERNAL_MESSAGE_CHANNEL?baseDelivery.channel:params.wantsDelivery?DEFAULT_CHAT_CHANNEL:INTERNAL_MESSAGE_CHANNEL,deliveryTargetMode=explicitTo?`explicit`:isDeliverableMessageChannel(resolvedChannel)?`implicit`:void 0,resolvedAccountId=normalizeAccountId(params.accountId)??(deliveryTargetMode===`implicit`?baseDelivery.accountId:void 0),resolvedTo=explicitTo;return!resolvedTo&&isDeliverableMessageChannel(resolvedChannel)&&resolvedChannel===baseDelivery.lastChannel&&(resolvedTo=baseDelivery.lastTo),{baseDelivery,resolvedChannel,resolvedTo,resolvedAccountId,resolvedThreadId:baseDelivery.threadId,deliveryTargetMode}}function resolveAgentOutboundTarget(params){let targetMode=params.targetMode??params.plan.deliveryTargetMode??(params.plan.resolvedTo?`explicit`:`implicit`);if(!isDeliverableMessageChannel(params.plan.resolvedChannel)||params.validateExplicitTarget!==!0&&params.plan.resolvedTo)return{resolvedTarget:null,resolvedTo:params.plan.resolvedTo,targetMode};let resolvedTarget=resolveOutboundTarget({channel:params.plan.resolvedChannel,to:params.plan.resolvedTo,cfg:params.cfg,accountId:params.plan.resolvedAccountId,mode:targetMode});return{resolvedTarget,resolvedTo:resolvedTarget.ok?resolvedTarget.to:params.plan.resolvedTo,targetMode}}const isOutboundPayloadJson=payload=>`mediaUrl`in payload;function buildOutboundResultEnvelope(params){let hasPayloads=params.payloads!==void 0,payloads=params.payloads===void 0?void 0:params.payloads.length===0?[]:isOutboundPayloadJson(params.payloads[0])?params.payloads:normalizeOutboundPayloadsForJson(params.payloads);return params.flattenDelivery!==!1&&params.delivery&&!params.meta&&!hasPayloads?params.delivery:{...hasPayloads?{payloads}:{},...params.meta?{meta:params.meta}:{},...params.delivery?{delivery:params.delivery}:{}}}function formatNestedLogPrefix(opts){let parts=[`[agent:nested]`],session=opts.sessionKey??opts.sessionId;session&&parts.push(`session=${session}`),opts.runId&&parts.push(`run=${opts.runId}`);let channel=opts.messageChannel??opts.channel;return channel&&parts.push(`channel=${channel}`),opts.to&&parts.push(`to=${opts.to}`),opts.accountId&&parts.push(`account=${opts.accountId}`),parts.join(` `)}function logNestedOutput(runtime,opts,output){let prefix=formatNestedLogPrefix(opts);for(let line of output.split(/\r?\n/))line&&runtime.log(`${prefix} ${line}`)}async function deliverAgentCommandResult(params){let{cfg,deps,runtime,opts,sessionEntry,payloads,result}=params,deliver=opts.deliver===!0,bestEffortDeliver=opts.bestEffortDeliver===!0,deliveryPlan=resolveAgentDeliveryPlan({sessionEntry,requestedChannel:opts.replyChannel??opts.channel,explicitTo:opts.replyTo??opts.to,explicitThreadId:opts.threadId,accountId:opts.replyAccountId??opts.accountId,wantsDelivery:deliver}),deliveryChannel=deliveryPlan.resolvedChannel,deliveryPlugin=isInternalMessageChannel(deliveryChannel)?void 0:getChannelPlugin(normalizeChannelId(deliveryChannel)??deliveryChannel),isDeliveryChannelKnown=isInternalMessageChannel(deliveryChannel)||!!deliveryPlugin,targetMode=opts.deliveryTargetMode??deliveryPlan.deliveryTargetMode??(opts.to?`explicit`:`implicit`),resolvedAccountId=deliveryPlan.resolvedAccountId,resolved=deliver&&isDeliveryChannelKnown&&deliveryChannel?resolveAgentOutboundTarget({cfg,plan:deliveryPlan,targetMode,validateExplicitTarget:!0}):{resolvedTarget:null,resolvedTo:deliveryPlan.resolvedTo,targetMode},resolvedTarget=resolved.resolvedTarget,deliveryTarget=resolved.resolvedTo,resolvedThreadId=deliveryPlan.resolvedThreadId??opts.threadId,resolvedReplyToId=deliveryChannel===`slack`&&resolvedThreadId!=null?String(resolvedThreadId):void 0,resolvedThreadTarget=deliveryChannel===`slack`?void 0:resolvedThreadId,logDeliveryError=err=>{let message=`Delivery failed (${deliveryChannel}${deliveryTarget?` to ${deliveryTarget}`:``}): ${String(err)}`;runtime.error?.(message),runtime.error||runtime.log(message)};if(deliver){if(!isDeliveryChannelKnown){let err=Error(`Unknown channel: ${deliveryChannel}`);if(!bestEffortDeliver)throw err;logDeliveryError(err)}else if(resolvedTarget&&!resolvedTarget.ok){if(!bestEffortDeliver)throw resolvedTarget.error;logDeliveryError(resolvedTarget.error)}}let normalizedPayloads=normalizeOutboundPayloadsForJson(payloads??[]);if(opts.json&&(runtime.log(JSON.stringify(buildOutboundResultEnvelope({payloads:normalizedPayloads,meta:result.meta}),null,2)),!deliver))return{payloads:normalizedPayloads,meta:result.meta};if(!payloads||payloads.length===0)return runtime.log(`No reply from agent.`),{payloads:[],meta:result.meta};let deliveryPayloads=normalizeOutboundPayloads(payloads),logPayload=payload=>{if(opts.json)return;let output=formatOutboundPayloadLog(payload);if(output){if(opts.lane===AGENT_LANE_NESTED){logNestedOutput(runtime,opts,output);return}runtime.log(output)}};if(!deliver)for(let payload of deliveryPayloads)logPayload(payload);return deliver&&deliveryChannel&&!isInternalMessageChannel(deliveryChannel)&&deliveryTarget&&await deliverOutboundPayloads({cfg,channel:deliveryChannel,to:deliveryTarget,accountId:resolvedAccountId,payloads:deliveryPayloads,agentId:opts.agentId??(opts.sessionKey?resolveSessionAgentId({sessionKey:opts.sessionKey,config:cfg}):void 0),replyToId:resolvedReplyToId??null,threadId:resolvedThreadTarget??null,bestEffort:bestEffortDeliver,onError:err=>logDeliveryError(err),onPayload:logPayload,deps:createOutboundSendDeps(deps)}),{payloads:normalizedPayloads,meta:result.meta}}function resolveAgentRunContext(opts){let merged=opts.runContext?{...opts.runContext}:{},normalizedChannel=resolveMessageChannel(merged.messageChannel??opts.messageChannel,opts.replyChannel??opts.channel);normalizedChannel&&(merged.messageChannel=normalizedChannel);let normalizedAccountId=normalizeAccountId(merged.accountId??opts.accountId);normalizedAccountId&&(merged.accountId=normalizedAccountId);let groupId=(merged.groupId??opts.groupId)?.toString().trim();groupId&&(merged.groupId=groupId);let groupChannel=(merged.groupChannel??opts.groupChannel)?.toString().trim();groupChannel&&(merged.groupChannel=groupChannel);let groupSpace=(merged.groupSpace??opts.groupSpace)?.toString().trim();if(groupSpace&&(merged.groupSpace=groupSpace),merged.currentThreadTs==null&&opts.threadId!=null&&opts.threadId!==``&&opts.threadId!==null&&(merged.currentThreadTs=String(opts.threadId)),!merged.currentChannelId&&opts.to){let trimmedTo=opts.to.trim();trimmedTo&&(merged.currentChannelId=trimmedTo)}return merged}async function updateSessionStoreAfterAgentRun(params){let{cfg,sessionId,sessionKey,storePath,sessionStore,defaultProvider,defaultModel,fallbackProvider,fallbackModel,result}=params,usage=result.meta.agentMeta?.usage,promptTokens=result.meta.agentMeta?.promptTokens,compactionsThisRun=Math.max(0,result.meta.agentMeta?.compactionCount??0),modelUsed=result.meta.agentMeta?.model??fallbackModel??defaultModel,providerUsed=result.meta.agentMeta?.provider??fallbackProvider??defaultProvider,contextTokens=params.contextTokensOverride??lookupContextTokens(modelUsed)??DEFAULT_CONTEXT_TOKENS,entry=sessionStore[sessionKey]??{sessionId,updatedAt:Date.now()},next={...entry,sessionId,updatedAt:Date.now(),modelProvider:providerUsed,model:modelUsed,contextTokens};if(isCliProvider(providerUsed,cfg)){let cliSessionId=result.meta.agentMeta?.sessionId?.trim();cliSessionId&&setCliSessionId(next,providerUsed,cliSessionId)}if(next.abortedLastRun=result.meta.aborted??!1,hasNonzeroUsage(usage)){let input=usage.input??0,output=usage.output??0,totalTokens=deriveSessionTotalTokens({usage,contextTokens,promptTokens})??input;next.inputTokens=input,next.outputTokens=output,next.totalTokens=totalTokens,next.totalTokensFresh=!0}compactionsThisRun>0&&(next.compactionCount=(entry.compactionCount??0)+compactionsThisRun),sessionStore[sessionKey]=next,await updateSessionStore(storePath,store=>{store[sessionKey]=next})}function resolveSessionKeyForRequest(opts){let sessionCfg=opts.cfg.session,scope=sessionCfg?.scope??`per-sender`,mainKey=normalizeMainKey(sessionCfg?.mainKey),explicitSessionKey=opts.sessionKey?.trim()||resolveExplicitAgentSessionKey({cfg:opts.cfg,agentId:opts.agentId}),storeAgentId=resolveAgentIdFromSessionKey(explicitSessionKey),storePath=resolveStorePath(sessionCfg?.store,{agentId:storeAgentId}),sessionStore=loadSessionStore(storePath),ctx=opts.to?.trim()?{From:opts.to}:void 0,sessionKey=explicitSessionKey??(ctx?resolveSessionKey(scope,ctx,mainKey):void 0);if(!explicitSessionKey&&opts.sessionId&&(!sessionKey||sessionStore[sessionKey]?.sessionId!==opts.sessionId)){let foundKey=Object.keys(sessionStore).find(key=>sessionStore[key]?.sessionId===opts.sessionId);foundKey&&(sessionKey=foundKey)}if(opts.sessionId&&!explicitSessionKey&&(!sessionKey||sessionStore[sessionKey]?.sessionId!==opts.sessionId)){let allAgentIds=listAgentIds(opts.cfg);for(let agentId of allAgentIds){if(agentId===storeAgentId)continue;let altStorePath=resolveStorePath(sessionCfg?.store,{agentId}),altStore=loadSessionStore(altStorePath),foundKey=Object.keys(altStore).find(key=>altStore[key]?.sessionId===opts.sessionId);if(foundKey)return{sessionKey:foundKey,sessionStore:altStore,storePath:altStorePath}}}return{sessionKey,sessionStore,storePath}}function resolveSession(opts){let sessionCfg=opts.cfg.session,{sessionKey,sessionStore,storePath}=resolveSessionKeyForRequest({cfg:opts.cfg,to:opts.to,sessionId:opts.sessionId,sessionKey:opts.sessionKey,agentId:opts.agentId}),now=Date.now(),sessionEntry=sessionKey?sessionStore[sessionKey]:void 0,resetPolicy=resolveSessionResetPolicy({sessionCfg,resetType:resolveSessionResetType({sessionKey}),resetOverride:resolveChannelResetConfig({sessionCfg,channel:sessionEntry?.lastChannel??sessionEntry?.channel})}),fresh=sessionEntry?evaluateSessionFreshness({updatedAt:sessionEntry.updatedAt,now,policy:resetPolicy}).fresh:!1;return{sessionId:opts.sessionId?.trim()||(fresh?sessionEntry?.sessionId:void 0)||crypto.randomUUID(),sessionKey,sessionEntry,sessionStore,storePath,isNewSession:!fresh&&!opts.sessionId,persistedThinking:fresh&&sessionEntry?.thinkingLevel?normalizeThinkLevel(sessionEntry.thinkingLevel):void 0,persistedVerbose:fresh&&sessionEntry?.verboseLevel?normalizeVerboseLevel(sessionEntry.verboseLevel):void 0}}async function persistSessionEntry(params){params.sessionStore[params.sessionKey]=params.entry,await updateSessionStore(params.storePath,store=>{store[params.sessionKey]=params.entry})}function resolveFallbackRetryPrompt(params){return params.isFallbackRetry?`Continue where you left off. The previous model attempt failed or timed out.`:params.body}function runAgentAttempt(params){let effectivePrompt=resolveFallbackRetryPrompt({body:params.body,isFallbackRetry:params.isFallbackRetry});if(isCliProvider(params.providerOverride,params.cfg)){let cliSessionId=getCliSessionId(params.sessionEntry,params.providerOverride);return runCliAgent({sessionId:params.sessionId,sessionKey:params.sessionKey,agentId:params.sessionAgentId,sessionFile:params.sessionFile,workspaceDir:params.workspaceDir,config:params.cfg,prompt:effectivePrompt,provider:params.providerOverride,model:params.modelOverride,thinkLevel:params.resolvedThinkLevel,timeoutMs:params.timeoutMs,runId:params.runId,extraSystemPrompt:params.opts.extraSystemPrompt,cliSessionId,images:params.isFallbackRetry?void 0:params.opts.images,streamParams:params.opts.streamParams})}let authProfileId=params.providerOverride===params.primaryProvider?params.sessionEntry?.authProfileOverride:void 0;return runEmbeddedAgent({sessionId:params.sessionId,sessionKey:params.sessionKey,agentId:params.sessionAgentId,messageChannel:params.messageChannel,agentAccountId:params.runContext.accountId,messageTo:params.opts.replyTo??params.opts.to,messageThreadId:params.opts.threadId,groupId:params.runContext.groupId,groupChannel:params.runContext.groupChannel,groupSpace:params.runContext.groupSpace,spawnedBy:params.spawnedBy,currentChannelId:params.runContext.currentChannelId,currentThreadTs:params.runContext.currentThreadTs,replyToMode:params.runContext.replyToMode,hasRepliedRef:params.runContext.hasRepliedRef,senderIsOwner:!0,sessionFile:params.sessionFile,workspaceDir:params.workspaceDir,config:params.cfg,skillsSnapshot:params.skillsSnapshot,prompt:effectivePrompt,images:params.isFallbackRetry?void 0:params.opts.images,clientTools:params.opts.clientTools,provider:params.providerOverride,model:params.modelOverride,authProfileId,authProfileIdSource:authProfileId?params.sessionEntry?.authProfileOverrideSource:void 0,thinkLevel:params.resolvedThinkLevel,verboseLevel:params.resolvedVerboseLevel,timeoutMs:params.timeoutMs,runId:params.runId,lane:params.opts.lane,abortSignal:params.opts.abortSignal,extraSystemPrompt:params.opts.extraSystemPrompt,inputProvenance:params.opts.inputProvenance,streamParams:params.opts.streamParams,agentDir:params.agentDir,onAgentEvent:params.onAgentEvent})}async function agentCommand(opts,runtime=defaultRuntime,deps=createDefaultDeps()){let body=(opts.message??``).trim();if(!body)throw Error(`Message (--message) is required`);if(!opts.to&&!opts.sessionId&&!opts.sessionKey&&!opts.agentId)throw Error(`Pass --to <E.164>, --session-id, or --agent to choose a session`);let cfg=loadConfig(),agentIdOverrideRaw=opts.agentId?.trim(),agentIdOverride=agentIdOverrideRaw?normalizeAgentId(agentIdOverrideRaw):void 0;if(agentIdOverride&&!listAgentIds(cfg).includes(agentIdOverride))throw Error(`Unknown agent id "${agentIdOverrideRaw}". Use "${formatCliCommand(`builderforce agents list`)}" to see configured agents.`);if(agentIdOverride&&opts.sessionKey){let sessionAgentId=resolveAgentIdFromSessionKey(opts.sessionKey);if(sessionAgentId!==agentIdOverride)throw Error(`Agent id "${agentIdOverrideRaw}" does not match session key agent "${sessionAgentId}".`)}let agentCfg=cfg.agents?.defaults,sessionAgentId=agentIdOverride??resolveAgentIdFromSessionKey(opts.sessionKey?.trim()),workspaceDirRaw=resolveAgentWorkspaceDir(cfg,sessionAgentId),agentDir=resolveAgentDir(cfg,sessionAgentId),workspaceDir=(await ensureAgentWorkspace({dir:workspaceDirRaw,ensureBootstrapFiles:!agentCfg?.skipBootstrap})).dir,configuredModel=resolveConfiguredModelRef({cfg,defaultProvider:DEFAULT_PROVIDER,defaultModel:DEFAULT_MODEL}),thinkingLevelsHint=formatThinkingLevels(configuredModel.provider,configuredModel.model),thinkOverride=normalizeThinkLevel(opts.thinking),thinkOnce=normalizeThinkLevel(opts.thinkingOnce);if(opts.thinking&&!thinkOverride)throw Error(`Invalid thinking level. Use one of: ${thinkingLevelsHint}.`);if(opts.thinkingOnce&&!thinkOnce)throw Error(`Invalid one-shot thinking level. Use one of: ${thinkingLevelsHint}.`);let verboseOverride=normalizeVerboseLevel(opts.verbose);if(opts.verbose&&!verboseOverride)throw Error(`Invalid verbose level. Use "on", "full", or "off".`);let isSubagentLane=(typeof opts.lane==`string`?opts.lane.trim():``)===String(AGENT_LANE_SUBAGENT),timeoutSecondsRaw=opts.timeout===void 0?isSubagentLane?0:void 0:Number.parseInt(String(opts.timeout),10);if(timeoutSecondsRaw!==void 0&&(Number.isNaN(timeoutSecondsRaw)||timeoutSecondsRaw<0))throw Error(`--timeout must be a non-negative integer (seconds; 0 means no timeout)`);let timeoutMs=resolveAgentTimeoutMs({cfg,overrideSeconds:timeoutSecondsRaw}),{sessionId,sessionKey,sessionEntry:resolvedSessionEntry,sessionStore,storePath,isNewSession,persistedThinking,persistedVerbose}=resolveSession({cfg,to:opts.to,sessionId:opts.sessionId,sessionKey:opts.sessionKey,agentId:agentIdOverride}),sessionEntry=resolvedSessionEntry,runId=opts.runId?.trim()||sessionId;try{if(opts.deliver===!0&&resolveSendPolicy({cfg,entry:sessionEntry,sessionKey,channel:sessionEntry?.channel,chatType:sessionEntry?.chatType})===`deny`)throw Error(`send blocked by session policy`);let resolvedThinkLevel=thinkOnce??thinkOverride??persistedThinking??agentCfg?.thinkingDefault,resolvedVerboseLevel=verboseOverride??persistedVerbose??agentCfg?.verboseDefault??`on`;sessionKey&&registerAgentRunContext(runId,{sessionKey,verboseLevel:resolvedVerboseLevel});let needsSkillsSnapshot=isNewSession||!sessionEntry?.skillsSnapshot,skillsSnapshotVersion=getSkillsSnapshotVersion(workspaceDir),skillFilter=resolveAgentSkillsFilter(cfg,sessionAgentId),skillsSnapshot=needsSkillsSnapshot?buildWorkspaceSkillSnapshot(workspaceDir,{config:cfg,eligibility:{remote:getRemoteSkillEligibility()},snapshotVersion:skillsSnapshotVersion,skillFilter}):sessionEntry?.skillsSnapshot;if(skillsSnapshot&&sessionStore&&sessionKey&&needsSkillsSnapshot){let next={...sessionEntry??{sessionId,updatedAt:Date.now()},sessionId,updatedAt:Date.now(),skillsSnapshot};await persistSessionEntry({sessionStore,sessionKey,storePath,entry:next}),sessionEntry=next}if(sessionStore&&sessionKey){let next={...sessionStore[sessionKey]??sessionEntry??{sessionId,updatedAt:Date.now()},sessionId,updatedAt:Date.now()};thinkOverride&&(next.thinkingLevel=thinkOverride),applyVerboseOverride(next,verboseOverride),await persistSessionEntry({sessionStore,sessionKey,storePath,entry:next})}let agentModelPrimary=resolveAgentModelPrimary(cfg,sessionAgentId),configuredDefaultRef=resolveConfiguredModelRef({cfg:agentModelPrimary?{...cfg,agents:{...cfg.agents,defaults:{...cfg.agents?.defaults,model:{...typeof cfg.agents?.defaults?.model==`object`?cfg.agents.defaults.model:void 0,primary:agentModelPrimary}}}}:cfg,defaultProvider:DEFAULT_PROVIDER,defaultModel:DEFAULT_MODEL}),{provider:defaultProvider,model:defaultModel}=normalizeModelRef(configuredDefaultRef.provider,configuredDefaultRef.model),provider=defaultProvider,model=defaultModel,hasAllowlist=agentCfg?.models&&Object.keys(agentCfg.models).length>0,hasStoredOverride=!!(sessionEntry?.modelOverride||sessionEntry?.providerOverride),needsModelCatalog=hasAllowlist||hasStoredOverride,allowedModelKeys=new Set,allowedModelCatalog=[],modelCatalog=null;if(needsModelCatalog){modelCatalog=await loadModelCatalog({config:cfg});let allowed=buildAllowedModelSet({cfg,catalog:modelCatalog,defaultProvider,defaultModel});allowedModelKeys=allowed.allowedKeys,allowedModelCatalog=allowed.allowedCatalog}if(sessionEntry&&sessionStore&&sessionKey&&hasStoredOverride){let entry=sessionEntry,overrideProvider=sessionEntry.providerOverride?.trim()||defaultProvider,overrideModel=sessionEntry.modelOverride?.trim();if(overrideModel){let normalizedOverride=normalizeModelRef(overrideProvider,overrideModel),key=modelKey(normalizedOverride.provider,normalizedOverride.model);if(!isCliProvider(normalizedOverride.provider,cfg)&&allowedModelKeys.size>0&&!allowedModelKeys.has(key)){let{updated}=applyModelOverrideToSessionEntry({entry,selection:{provider:defaultProvider,model:defaultModel,isDefault:!0}});updated&&await persistSessionEntry({sessionStore,sessionKey,storePath,entry})}}}let storedProviderOverride=sessionEntry?.providerOverride?.trim(),storedModelOverride=sessionEntry?.modelOverride?.trim();if(storedModelOverride){let normalizedStored=normalizeModelRef(storedProviderOverride||defaultProvider,storedModelOverride),key=modelKey(normalizedStored.provider,normalizedStored.model);(isCliProvider(normalizedStored.provider,cfg)||allowedModelKeys.size===0||allowedModelKeys.has(key))&&(provider=normalizedStored.provider,model=normalizedStored.model)}if(sessionEntry){let authProfileId=sessionEntry.authProfileOverride;if(authProfileId){let entry=sessionEntry,profile=(await ensureAuthProfileStore()).profiles[authProfileId];(!profile||profile.provider!==provider)&&sessionStore&&sessionKey&&await clearSessionAuthProfileOverride({sessionEntry:entry,sessionStore,sessionKey,storePath})}}if(!resolvedThinkLevel){let catalogForThinking=modelCatalog??allowedModelCatalog;(!catalogForThinking||catalogForThinking.length===0)&&(modelCatalog=await loadModelCatalog({config:cfg}),catalogForThinking=modelCatalog),resolvedThinkLevel=resolveThinkingDefault({cfg,provider,model,catalog:catalogForThinking})}if(resolvedThinkLevel===`xhigh`&&!supportsXHighThinking(provider,model)){if(thinkOnce||thinkOverride)throw Error(`Thinking level "xhigh" is only supported for ${formatXHighModelHint()}.`);if(resolvedThinkLevel=`high`,sessionEntry&&sessionStore&&sessionKey&&sessionEntry.thinkingLevel===`xhigh`){let entry=sessionEntry;entry.thinkingLevel=`high`,entry.updatedAt=Date.now(),await persistSessionEntry({sessionStore,sessionKey,storePath,entry})}}let sessionFile=resolveSessionFilePath(sessionId,sessionEntry,{agentId:sessionAgentId}),startedAt=Date.now(),lifecycleEnded=!1,result,fallbackProvider=provider,fallbackModel=model;try{let runContext=resolveAgentRunContext(opts),messageChannel=resolveMessageChannel(runContext.messageChannel,opts.replyChannel??opts.channel),spawnedBy=opts.spawnedBy??sessionEntry?.spawnedBy,effectiveFallbacksOverride=resolveEffectiveModelFallbacks({cfg,agentId:sessionAgentId,hasSessionModelOverride:!!storedModelOverride}),fallbackAttemptIndex=0,fallbackResult=await runWithModelFallback({cfg,provider,model,agentDir,fallbacksOverride:effectiveFallbacksOverride,run:(providerOverride,modelOverride)=>{let isFallbackRetry=fallbackAttemptIndex>0;return fallbackAttemptIndex+=1,runAgentAttempt({providerOverride,modelOverride,cfg,sessionEntry,sessionId,sessionKey,sessionAgentId,sessionFile,workspaceDir,body,isFallbackRetry,resolvedThinkLevel,timeoutMs,runId,opts,runContext,spawnedBy,messageChannel,skillsSnapshot,resolvedVerboseLevel,agentDir,primaryProvider:provider,onAgentEvent:evt=>{evt.stream===`lifecycle`&&typeof evt.data?.phase==`string`&&(evt.data.phase===`end`||evt.data.phase===`error`)&&(lifecycleEnded=!0)}})}});result=fallbackResult.result,fallbackProvider=fallbackResult.provider,fallbackModel=fallbackResult.model,lifecycleEnded||emitAgentEvent({runId,stream:`lifecycle`,data:{phase:`end`,startedAt,endedAt:Date.now(),aborted:result.meta.aborted??!1}})}catch(err){throw lifecycleEnded||emitAgentEvent({runId,stream:`lifecycle`,data:{phase:`error`,startedAt,endedAt:Date.now(),error:String(err)}}),err}sessionStore&&sessionKey&&await updateSessionStoreAfterAgentRun({cfg,contextTokensOverride:agentCfg?.contextTokens,sessionId,sessionKey,storePath,sessionStore,defaultProvider:provider,defaultModel:model,fallbackProvider,fallbackModel,result});let payloads=result.payloads??[];return await deliverAgentCommandResult({cfg,deps,runtime,opts,sessionEntry,result,payloads})}finally{clearAgentRunContext(runId)}}function generateBootSessionId(){return`boot-${new Date().toISOString().replace(/[:.]/g,`-`).replace(`T`,`_`).replace(`Z`,``)}-${crypto.randomUUID().slice(0,8)}`}const log=createSubsystemLogger(`gateway/boot`),BOOT_FILENAME=`BOOT.md`;function buildBootPrompt(content){return[`You are running a boot check. Follow BOOT.md instructions exactly.`,``,`BOOT.md:`,content,``,`If BOOT.md asks you to send a message, use the message tool (action=send with channel + target).`,"Use the `target` field (not `to`) for message tool destinations.",`After sending with the message tool, reply with ONLY: ${SILENT_REPLY_TOKEN}.`,`If nothing needs attention, reply with ONLY: ${SILENT_REPLY_TOKEN}.`].join(`
2
2
  `)}async function loadBootFile(workspaceDir){let bootPath=resolveWorkspaceFilePath(workspaceDir,BOOT_FILENAME);try{let trimmed=(await fs.readFile(bootPath,`utf-8`)).trim();return trimmed?{status:`ok`,content:trimmed}:{status:`empty`}}catch(err){if(err.code===`ENOENT`)return{status:`missing`};throw err}}function snapshotMainSessionMapping(params){let agentId=resolveAgentIdFromSessionKey(params.sessionKey),storePath=resolveStorePath(params.cfg.session?.store,{agentId});try{let entry=loadSessionStore(storePath,{skipCache:!0})[params.sessionKey];return entry?{storePath,sessionKey:params.sessionKey,canRestore:!0,hadEntry:!0,entry:structuredClone(entry)}:{storePath,sessionKey:params.sessionKey,canRestore:!0,hadEntry:!1}}catch(err){return log.debug(`boot: could not snapshot main session mapping`,{sessionKey:params.sessionKey,error:String(err)}),{storePath,sessionKey:params.sessionKey,canRestore:!1,hadEntry:!1}}}async function restoreMainSessionMapping(snapshot){if(snapshot.canRestore)try{await updateSessionStore(snapshot.storePath,store=>{if(snapshot.hadEntry&&snapshot.entry){store[snapshot.sessionKey]=snapshot.entry;return}delete store[snapshot.sessionKey]},{activeSessionKey:snapshot.sessionKey});return}catch(err){return err instanceof Error?err.message:String(err)}}async function runBootOnce(params){let bootRuntime={log:()=>{},error:message=>log.error(String(message)),exit:defaultRuntime.exit},result;try{result=await loadBootFile(params.workspaceDir)}catch(err){let message=err instanceof Error?err.message:String(err);return log.error(`boot: failed to read ${BOOT_FILENAME}: ${message}`),{status:`failed`,reason:message}}if(result.status===`missing`||result.status===`empty`)return{status:`skipped`,reason:result.status};let sessionKey=resolveMainSessionKey(params.cfg),message=buildBootPrompt(result.content??``),sessionId=generateBootSessionId(),mappingSnapshot=snapshotMainSessionMapping({cfg:params.cfg,sessionKey}),agentFailure;try{await agentCommand({message,sessionKey,sessionId,deliver:!1},bootRuntime,params.deps)}catch(err){agentFailure=err instanceof Error?err.message:String(err),log.error(`boot: agent run failed: ${agentFailure}`)}let mappingRestoreFailure=await restoreMainSessionMapping(mappingSnapshot);return mappingRestoreFailure&&log.error(`boot: failed to restore main session mapping: ${mappingRestoreFailure}`),!agentFailure&&!mappingRestoreFailure?{status:`ran`}:{status:`failed`,reason:[agentFailure?`agent run failed: ${agentFailure}`:void 0,mappingRestoreFailure?`mapping restore failed: ${mappingRestoreFailure}`:void 0].filter(part=>!!part).join(`; `)}}const runBootChecklist=async event=>{if(event.type!==`gateway`||event.action!==`startup`)return;let context=event.context??{};if(!context.cfg||!context.workspaceDir)return;let deps=context.deps??createDefaultDeps();await runBootOnce({cfg:context.cfg,deps,workspaceDir:context.workspaceDir})};export{runBootChecklist as default};
@@ -1,4 +1,4 @@
1
- import{s as resolveStateDir}from"../../paths-BVMSM1lQ.js";import{d as resolveAgentIdFromSessionKey}from"../../session-key-CYpYHc1e.js";import"../../registry-D_frpmHZ.js";import{s as resolveAgentWorkspaceDir}from"../../agent-scope-EkacNLg3.js";import{t as createSubsystemLogger}from"../../subsystem-BakM_oqD.js";import"../../workspace-BCjtHT4u.js";import"../../model-selection-CAA3jMci.js";import"../../env-BhRm7_r8.js";import"../../boolean-ssGoaBPk.js";import"../../embedded-CRoX1qTh.js";import"../../src-NJhXretA.js";import"../../replies-CXzO6hmR.js";import"../../plugins-J28Y83f5.js";import"../../accounts-193gfWbH.js";import"../../bindings-BfB5A-by.js";import"../../send-C7kUpwrI.js";import"../../send-Bhfq7nri.js";import"../../accounts-DHeA4T6C.js";import"../../send-C9R20JMQ.js";import"../../fetch-BklyLYYN.js";import"../../model-catalog-DQvHHj3N.js";import"../../redact-sNZY-pGx.js";import"../../errors-BmztzL5I.js";import{Yt as hasInterSessionUserProvenance}from"../../runner-BKHYCYMH.js";import"../../config-Dtj-XfnY.js";import"../../chrome-Cm-kVyuA.js";import"../../frontmatter-DBVosMFY.js";import"../../store-DN9AcI73.js";import"../../message-channel-tBuQgYSD.js";import"../../accounts-C7FtIPYB.js";import"../../paths-CzXKnIOb.js";import"../../gemini-auth-BIWFfEII.js";import"../../tool-images-mfC2sOfJ.js";import{t as resolveHookConfig}from"../../config-DfXnxW-V.js";import"../../reply-prefix-me5vnbrB.js";import"../../sqlite-D3Ov16zb.js";import"../../manager-BEWSA2c7.js";import"../../retry-BYnMCvOU.js";import"../../common-CDXsNQYT.js";import"../../chunk-CrsAQ01n.js";import"../../markdown-tables-DvSC1OTb.js";import"../../ir-Ct8GNKB7.js";import"../../render-CVWbhuqU.js";import"../../send-D320A6MJ.js";import"../../outbound-attachment-U-XtahS5.js";import"../../fetch-Jq1KZsRq.js";import"../../send-B1D5T3_v.js";import"../../resolve-route-CGe48x_Z.js";import"../../channel-activity-xLea9vdo.js";import"../../tables-Desw59m6.js";import"../../active-listener-BQLkI7vg.js";import{generateSlugViaLLM}from"../../llm-slug-generator.js";import fs from"node:fs/promises";import os from"node:os";import path from"node:path";const log=createSubsystemLogger(`hooks/session-memory`);async function getRecentSessionContent(sessionFilePath,messageCount=15){try{let lines=(await fs.readFile(sessionFilePath,`utf-8`)).trim().split(`
1
+ import{s as resolveStateDir}from"../../paths-BVMSM1lQ.js";import{d as resolveAgentIdFromSessionKey}from"../../session-key-CYpYHc1e.js";import"../../registry-D_frpmHZ.js";import{s as resolveAgentWorkspaceDir}from"../../agent-scope-EkacNLg3.js";import{t as createSubsystemLogger}from"../../subsystem-BakM_oqD.js";import"../../workspace-BCjtHT4u.js";import"../../model-selection-CAA3jMci.js";import"../../env-BhRm7_r8.js";import"../../boolean-ssGoaBPk.js";import"../../embedded-Cw4g0mzl.js";import"../../src-D5vOHX9i.js";import"../../replies-CXzO6hmR.js";import"../../plugins-J28Y83f5.js";import"../../accounts-193gfWbH.js";import"../../bindings-BfB5A-by.js";import"../../send-C7kUpwrI.js";import"../../send-Bhfq7nri.js";import"../../accounts-DHeA4T6C.js";import"../../send-C9R20JMQ.js";import"../../fetch-BklyLYYN.js";import"../../model-catalog-DQvHHj3N.js";import"../../redact-sNZY-pGx.js";import"../../errors-BmztzL5I.js";import{Yt as hasInterSessionUserProvenance}from"../../runner-xF3_-mDL.js";import"../../config-Dtj-XfnY.js";import"../../chrome-Bi-3xZj-.js";import"../../frontmatter-DBVosMFY.js";import"../../store-DN9AcI73.js";import"../../message-channel-tBuQgYSD.js";import"../../accounts-C7FtIPYB.js";import"../../paths-CzXKnIOb.js";import"../../gemini-auth-BIWFfEII.js";import"../../tool-images-mfC2sOfJ.js";import{t as resolveHookConfig}from"../../config-DfXnxW-V.js";import"../../reply-prefix-me5vnbrB.js";import"../../sqlite-D3Ov16zb.js";import"../../manager-BEWSA2c7.js";import"../../retry-BYnMCvOU.js";import"../../common-CDXsNQYT.js";import"../../chunk-CrsAQ01n.js";import"../../markdown-tables-DvSC1OTb.js";import"../../ir-Ct8GNKB7.js";import"../../render-CVWbhuqU.js";import"../../send-D320A6MJ.js";import"../../outbound-attachment-U-XtahS5.js";import"../../fetch-Jq1KZsRq.js";import"../../send-B1D5T3_v.js";import"../../resolve-route-CGe48x_Z.js";import"../../channel-activity-xLea9vdo.js";import"../../tables-Desw59m6.js";import"../../active-listener-BQLkI7vg.js";import{generateSlugViaLLM}from"../../llm-slug-generator.js";import fs from"node:fs/promises";import os from"node:os";import path from"node:path";const log=createSubsystemLogger(`hooks/session-memory`);async function getRecentSessionContent(sessionFilePath,messageCount=15){try{let lines=(await fs.readFile(sessionFilePath,`utf-8`)).trim().split(`
2
2
  `),allMessages=[];for(let line of lines)try{let entry=JSON.parse(line);if(entry.type===`message`&&entry.message){let msg=entry.message,role=msg.role;if((role===`user`||role===`assistant`)&&msg.content){if(role===`user`&&hasInterSessionUserProvenance(msg))continue;let text=Array.isArray(msg.content)?msg.content.find(c=>c.type===`text`)?.text:msg.content;text&&!text.startsWith(`/`)&&allMessages.push(`${role}: ${text}`)}}}catch{}return allMessages.slice(-messageCount).join(`
3
3
  `)}catch{return null}}async function getRecentSessionContentWithResetFallback(sessionFilePath,messageCount=15){let primary=await getRecentSessionContent(sessionFilePath,messageCount);if(primary)return primary;try{let dir=path.dirname(sessionFilePath),resetPrefix=`${path.basename(sessionFilePath)}.reset.`,resetCandidates=(await fs.readdir(dir)).filter(name=>name.startsWith(resetPrefix)).toSorted();if(resetCandidates.length===0)return primary;let latestResetPath=path.join(dir,resetCandidates[resetCandidates.length-1]),fallback=await getRecentSessionContent(latestResetPath,messageCount);return fallback&&log.debug(`Loaded session content from reset fallback`,{sessionFilePath,latestResetPath}),fallback||primary}catch{return primary}}function stripResetSuffix(fileName){let resetIndex=fileName.indexOf(`.reset.`);return resetIndex===-1?fileName:fileName.slice(0,resetIndex)}async function findPreviousSessionFile(params){try{let files=await fs.readdir(params.sessionsDir),fileSet=new Set(files),baseFromReset=params.currentSessionFile?stripResetSuffix(path.basename(params.currentSessionFile)):void 0;if(baseFromReset&&fileSet.has(baseFromReset))return path.join(params.sessionsDir,baseFromReset);let trimmedSessionId=params.sessionId?.trim();if(trimmedSessionId){let canonicalFile=`${trimmedSessionId}.jsonl`;if(fileSet.has(canonicalFile))return path.join(params.sessionsDir,canonicalFile);let topicVariants=files.filter(name=>name.startsWith(`${trimmedSessionId}-topic-`)&&name.endsWith(`.jsonl`)&&!name.includes(`.reset.`)).toSorted().toReversed();if(topicVariants.length>0)return path.join(params.sessionsDir,topicVariants[0])}if(!params.currentSessionFile)return;let nonResetJsonl=files.filter(name=>name.endsWith(`.jsonl`)&&!name.includes(`.reset.`)).toSorted().toReversed();if(nonResetJsonl.length>0)return path.join(params.sessionsDir,nonResetJsonl[0])}catch{}}const saveSessionToMemory=async event=>{if(!(event.type!==`command`||event.action!==`new`))try{log.debug(`Hook triggered for /new command`);let context=event.context||{},cfg=context.cfg,agentId=resolveAgentIdFromSessionKey(event.sessionKey),workspaceDir=cfg?resolveAgentWorkspaceDir(cfg,agentId):path.join(resolveStateDir(process.env,os.homedir),`workspace`),memoryDir=path.join(workspaceDir,`.builderforce`,`memory`);await fs.mkdir(memoryDir,{recursive:!0});let now=new Date(event.timestamp),dateStr=now.toISOString().split(`T`)[0],sessionEntry=context.previousSessionEntry||context.sessionEntry||{},currentSessionId=sessionEntry.sessionId,currentSessionFile=sessionEntry.sessionFile||void 0;if(!currentSessionFile||currentSessionFile.includes(`.reset.`)){let sessionsDirs=new Set;currentSessionFile&&sessionsDirs.add(path.dirname(currentSessionFile)),sessionsDirs.add(path.join(workspaceDir,`sessions`));for(let sessionsDir of sessionsDirs){let recoveredSessionFile=await findPreviousSessionFile({sessionsDir,currentSessionFile,sessionId:currentSessionId});if(recoveredSessionFile){currentSessionFile=recoveredSessionFile,log.debug(`Found previous session file`,{file:currentSessionFile});break}}}log.debug(`Session context resolved`,{sessionId:currentSessionId,sessionFile:currentSessionFile,hasCfg:!!cfg});let sessionFile=currentSessionFile||void 0,hookConfig=resolveHookConfig(cfg,`session-memory`),messageCount=typeof hookConfig?.messages==`number`&&hookConfig.messages>0?hookConfig.messages:15,slug=null,sessionContent=null;if(sessionFile){sessionContent=await getRecentSessionContentWithResetFallback(sessionFile,messageCount),log.debug(`Session content loaded`,{length:sessionContent?.length??0,messageCount});let allowLlmSlug=!(process.env.BUILDERFORCE_AGENTS_TEST_FAST===`1`||process.env.VITEST===`true`||process.env.VITEST===`1`)&&hookConfig?.llmSlug!==!1;sessionContent&&cfg&&allowLlmSlug&&(log.debug(`Calling generateSlugViaLLM...`),slug=await generateSlugViaLLM({sessionContent,cfg}),log.debug(`Generated slug`,{slug}))}slug||(slug=now.toISOString().split(`T`)[1].split(`.`)[0].replace(/:/g,``).slice(0,4),log.debug(`Using fallback timestamp slug`,{slug}));let filename=`${dateStr}-${slug}.md`,memoryFilePath=path.join(memoryDir,filename);log.debug(`Memory file path resolved`,{filename,path:memoryFilePath.replace(os.homedir(),`~`)});let timeStr=now.toISOString().split(`T`)[1].split(`.`)[0],sessionId=sessionEntry.sessionId||`unknown`,source=context.commandSource||`unknown`,entryParts=[`# Session: ${dateStr} ${timeStr} UTC`,``,`- **Session Key**: ${event.sessionKey}`,`- **Session ID**: ${sessionId}`,`- **Source**: ${source}`,``];sessionContent&&entryParts.push(`## Conversation Summary`,``,sessionContent,``);let entry=entryParts.join(`
4
4
  `);await fs.writeFile(memoryFilePath,entry,`utf-8`),log.debug(`Memory file written successfully`);let relPath=memoryFilePath.replace(os.homedir(),`~`);log.info(`Session context saved to ${relPath}`)}catch(err){err instanceof Error?log.error(`Failed to save session memory`,{errorName:err.name,errorMessage:err.message,stack:err.stack}):log.error(`Failed to save session memory`,{error:String(err)})}};export{saveSessionToMemory as default};
@@ -1 +1 @@
1
- import{n as CHAT_CHANNEL_ORDER}from"./registry-TdK-aV05.js";import{t as isTruthyEnvValue}from"./env-BHP32i7Q.js";import{n as listChannelPlugins}from"./plugins-COtQnUML.js";import{r as listChannelPluginCatalogEntries}from"./catalog-BsxosmSt.js";import{t as ensurePluginRegistryLoaded}from"./plugin-registry-BkGhcUDV.js";function dedupe(values){let seen=new Set,resolved=[];for(let value of values)!value||seen.has(value)||(seen.add(value),resolved.push(value));return resolved}function resolveCliChannelOptions(){let catalog=listChannelPluginCatalogEntries().map(entry=>entry.id),base=dedupe([...CHAT_CHANNEL_ORDER,...catalog]);if(isTruthyEnvValue(process.env.BUILDERFORCE_AGENTS_EAGER_CHANNEL_OPTIONS)){ensurePluginRegistryLoaded();let pluginIds=listChannelPlugins().map(plugin=>plugin.id);return dedupe([...base,...pluginIds])}return base}function formatCliChannelOptions(extra=[]){return[...extra,...resolveCliChannelOptions()].join(`|`)}export{resolveCliChannelOptions as n,formatCliChannelOptions as t};
1
+ import{n as CHAT_CHANNEL_ORDER}from"./registry-TdK-aV05.js";import{t as isTruthyEnvValue}from"./env-BHP32i7Q.js";import{n as listChannelPlugins}from"./plugins-COtQnUML.js";import{r as listChannelPluginCatalogEntries}from"./catalog-BsxosmSt.js";import{t as ensurePluginRegistryLoaded}from"./plugin-registry-CAy3I1K1.js";function dedupe(values){let seen=new Set,resolved=[];for(let value of values)!value||seen.has(value)||(seen.add(value),resolved.push(value));return resolved}function resolveCliChannelOptions(){let catalog=listChannelPluginCatalogEntries().map(entry=>entry.id),base=dedupe([...CHAT_CHANNEL_ORDER,...catalog]);if(isTruthyEnvValue(process.env.BUILDERFORCE_AGENTS_EAGER_CHANNEL_OPTIONS)){ensurePluginRegistryLoaded();let pluginIds=listChannelPlugins().map(plugin=>plugin.id);return dedupe([...base,...pluginIds])}return base}function formatCliChannelOptions(extra=[]){return[...extra,...resolveCliChannelOptions()].join(`|`)}export{resolveCliChannelOptions as n,formatCliChannelOptions as t};
@@ -1 +1 @@
1
- import{n as CHAT_CHANNEL_ORDER}from"./registry-Cv7CoWAs.js";import{t as isTruthyEnvValue}from"./env-BoE8QSib.js";import{n as listChannelPlugins}from"./plugins-DJGW_fnS.js";import{r as listChannelPluginCatalogEntries}from"./catalog-CEJqw4s-.js";import{t as ensurePluginRegistryLoaded}from"./plugin-registry-Ty9w94Rd.js";function dedupe(values){let seen=new Set,resolved=[];for(let value of values)!value||seen.has(value)||(seen.add(value),resolved.push(value));return resolved}function resolveCliChannelOptions(){let catalog=listChannelPluginCatalogEntries().map(entry=>entry.id),base=dedupe([...CHAT_CHANNEL_ORDER,...catalog]);if(isTruthyEnvValue(process.env.BUILDERFORCE_AGENTS_EAGER_CHANNEL_OPTIONS)){ensurePluginRegistryLoaded();let pluginIds=listChannelPlugins().map(plugin=>plugin.id);return dedupe([...base,...pluginIds])}return base}function formatCliChannelOptions(extra=[]){return[...extra,...resolveCliChannelOptions()].join(`|`)}export{resolveCliChannelOptions as n,formatCliChannelOptions as t};
1
+ import{n as CHAT_CHANNEL_ORDER}from"./registry-Cv7CoWAs.js";import{t as isTruthyEnvValue}from"./env-BoE8QSib.js";import{n as listChannelPlugins}from"./plugins-DJGW_fnS.js";import{r as listChannelPluginCatalogEntries}from"./catalog-CEJqw4s-.js";import{t as ensurePluginRegistryLoaded}from"./plugin-registry-BM1-sG-e.js";function dedupe(values){let seen=new Set,resolved=[];for(let value of values)!value||seen.has(value)||(seen.add(value),resolved.push(value));return resolved}function resolveCliChannelOptions(){let catalog=listChannelPluginCatalogEntries().map(entry=>entry.id),base=dedupe([...CHAT_CHANNEL_ORDER,...catalog]);if(isTruthyEnvValue(process.env.BUILDERFORCE_AGENTS_EAGER_CHANNEL_OPTIONS)){ensurePluginRegistryLoaded();let pluginIds=listChannelPlugins().map(plugin=>plugin.id);return dedupe([...base,...pluginIds])}return base}function formatCliChannelOptions(extra=[]){return[...extra,...resolveCliChannelOptions()].join(`|`)}export{resolveCliChannelOptions as n,formatCliChannelOptions as t};
@@ -1,4 +1,4 @@
1
- import{E as toWhatsappJid,F as shouldLogVerbose,M as logVerbose,U as getChildLogger,h as normalizeE164,m as jidToE164,p as isSelfChatMode,r as clamp,w as sleep,y as resolveJidToE164}from"./utils-DbaBVFaK.js";import{Cn as createInboundDebouncer,En as resolveEnvelopeFormatOptions,Mn as buildMentionRegexes,Mt as normalizeGroupActivation,Nn as normalizeMentionText,Nt as parseActivationCommand,On as hasControlCommand,Rt as computeBackoff,Sn as createDedupeCache,Tn as formatInboundEnvelope,_n as dispatchReplyWithBufferedBlockDispatcher,dn as buildPairingReply,fn as resolveMentionGating,gn as shouldAckReactionForWhatsApp,hn as recordPendingHistoryEntryIfEnabled,kn as shouldComputeCommandAuthorized,li as enqueueSystemEvent,mn as buildHistoryContextFromEntries,pn as DEFAULT_GROUP_HISTORY_LIMIT,t as getReplyFromConfig,wn as resolveInboundDebounceMs,zt as sleepWithAbort}from"./reply-BsRbeUhd.js";import{a as buildAgentMainSessionKey,d as normalizeAgentId,i as DEFAULT_MAIN_KEY,s as buildGroupHistoryKey}from"./session-key-EoB0qaG9.js";import{i as defaultRuntime,t as createSubsystemLogger}from"./subsystem-B3TqcCrZ.js";import{t as formatCliCommand}from"./command-format-Dd7BgZsg.js";import{r as loadConfig}from"./io-YzT_09GD.js";import{t as finalizeInboundContext}from"./inbound-context-D4EJydwW.js";import{l as registerUnhandledRejectionHandler}from"./runner-CfNJMPWu.js";import{r as saveMediaBuffer}from"./store-BoTKCB2d.js";import{J as resolveChannelGroupRequireMention,Z as resolveGroupSessionKey,a as loadSessionStore,l as updateLastRoute,o as readSessionUpdatedAt,q as resolveChannelGroupPolicy,s as recordSessionMetaFromInbound}from"./sessions-OZNhnSwZ.js";import{i as getWebAuthAgeMs,n as resolveWhatsAppAccount,u as readWebSelfId}from"./accounts-CTKk3xPO.js";import{c as resolveStorePath}from"./paths-CkcK939O.js";import{H as formatLocationText,U as toLocationContext}from"./send-DlPwTVpG.js";import{c as resolveIdentityNamePrefix,l as resolveMessagePrefix,n as createReplyPrefixOptions}from"./reply-prefix-BwtP84WV.js";import{c as resolveTextChunkLimit,i as chunkMarkdownTextWithMode,s as resolveChunkMode}from"./chunk-h7FZEwW2.js";import{t as resolveMarkdownTableMode}from"./markdown-tables-DOq8FfUr.js";import{a as loadWebMedia,s as getAgentScopedMediaLocalRoots}from"./ir-AM9J0QtO.js";import{n as recordChannelActivity}from"./channel-activity-qRD5c3VV.js";import{t as convertMarkdownTables}from"./tables-DirB1oU7.js";import{i as readChannelAllowFromStore,o as upsertChannelPairingRequest}from"./pairing-store-DIpKOfDK.js";import{r as formatDurationPrecise}from"./format-duration-BwzoPIex.js";import{n as resolveAgentRoute,t as buildAgentSessionKey}from"./resolve-route-BvfmiLqC.js";import{r as setActiveWebListener}from"./active-listener-DBdxNyOd.js";import{i as markdownToWhatsApp,r as sendReactionWhatsApp}from"./outbound-x_RWkIhC.js";import{i as waitForWaConnection,n as formatError,r as getStatusCode,t as createWaSocket}from"./session-CBCgyqjR.js";import{randomUUID}from"node:crypto";import{getMaxListeners,setMaxListeners}from"node:events";import{DisconnectReason,downloadMediaMessage,extractMessageContent,getContentType,isJidGroup,normalizeMessageContent}from"@whiskeysockets/baileys";const DEFAULT_RECONNECT_POLICY={initialMs:2e3,maxMs:3e4,factor:1.8,jitter:.25,maxAttempts:12};function resolveHeartbeatSeconds(cfg,overrideSeconds){let candidate=overrideSeconds??cfg.web?.heartbeatSeconds;return typeof candidate==`number`&&candidate>0?candidate:60}function resolveReconnectPolicy(cfg,overrides){let reconnectOverrides=cfg.web?.reconnect??{},overrideConfig=overrides??{},merged={...DEFAULT_RECONNECT_POLICY,...reconnectOverrides,...overrideConfig};return merged.initialMs=Math.max(250,merged.initialMs),merged.maxMs=Math.max(merged.initialMs,merged.maxMs),merged.factor=clamp(merged.factor,1.1,10),merged.jitter=clamp(merged.jitter,0,1),merged.maxAttempts=Math.max(0,Math.floor(merged.maxAttempts)),merged}function newConnectionId(){return randomUUID()}const whatsappLog=createSubsystemLogger(`gateway/channels/whatsapp`),whatsappInboundLog=whatsappLog.child(`inbound`),whatsappOutboundLog=whatsappLog.child(`outbound`),whatsappHeartbeatLog=whatsappLog.child(`heartbeat`);function elide(text,limit=400){return!text||text.length<=limit?text:`${text.slice(0,limit)}… (truncated ${text.length-limit} chars)`}function isLikelyWhatsAppCryptoError(reason){let haystack=(reason instanceof Error?`${reason.message}\n${reason.stack??``}`:(value=>{if(value==null)return``;if(typeof value==`string`)return value;if(value instanceof Error)return`${value.message}\n${value.stack??``}`;if(typeof value==`object`)try{return JSON.stringify(value)}catch{return Object.prototype.toString.call(value)}return typeof value==`number`||typeof value==`boolean`||typeof value==`bigint`?String(value):typeof value==`symbol`?value.description??value.toString():typeof value==`function`?value.name?`[function ${value.name}]`:`[function]`:Object.prototype.toString.call(value)})(reason)).toLowerCase();return haystack.includes(`unsupported state or unable to authenticate data`)||haystack.includes(`bad mac`)?haystack.includes(`@whiskeysockets/baileys`)||haystack.includes(`baileys`)||haystack.includes(`noise-handler`)||haystack.includes(`aesdecryptgcm`):!1}function waitForever(){return setInterval(()=>{},1e6).unref(),new Promise(()=>{})}const recentInboundMessages=createDedupeCache({ttlMs:20*6e4,maxSize:5e3});function isRecentInboundMessage(key){return recentInboundMessages.check(key)}const ALLOWED_VCARD_KEYS=new Set([`FN`,`N`,`TEL`]);function parseVcard(vcard){if(!vcard)return{phones:[]};let lines=vcard.split(/\r?\n/),nameFromN,nameFromFn,phones=[];for(let rawLine of lines){let line=rawLine.trim();if(!line)continue;let colonIndex=line.indexOf(`:`);if(colonIndex===-1)continue;let key=line.slice(0,colonIndex).toUpperCase(),rawValue=line.slice(colonIndex+1).trim();if(!rawValue)continue;let baseKey=normalizeVcardKey(key);if(!baseKey||!ALLOWED_VCARD_KEYS.has(baseKey))continue;let value=cleanVcardValue(rawValue);if(value){if(baseKey===`FN`&&!nameFromFn){nameFromFn=normalizeVcardName(value);continue}if(baseKey===`N`&&!nameFromN){nameFromN=normalizeVcardName(value);continue}if(baseKey===`TEL`){let phone=normalizeVcardPhone(value);phone&&phones.push(phone)}}}return{name:nameFromFn??nameFromN,phones}}function normalizeVcardKey(key){let[primary]=key.split(`;`);if(!primary)return;let segments=primary.split(`.`);return segments[segments.length-1]||void 0}function cleanVcardValue(value){return value.replace(/\\n/gi,` `).replace(/\\,/g,`,`).replace(/\\;/g,`;`).trim()}function normalizeVcardName(value){return value.replace(/;/g,` `).replace(/\s+/g,` `).trim()}function normalizeVcardPhone(value){let trimmed=value.trim();return trimmed?trimmed.toLowerCase().startsWith(`tel:`)?trimmed.slice(4).trim():trimmed:``}function unwrapMessage$1(message){return normalizeMessageContent(message)}function extractContextInfo(message){if(!message)return;let contentType=getContentType(message),candidate=contentType?message[contentType]:void 0,contextInfo=candidate&&typeof candidate==`object`&&`contextInfo`in candidate?candidate.contextInfo:void 0;if(contextInfo)return contextInfo;let fallback=message.extendedTextMessage?.contextInfo??message.imageMessage?.contextInfo??message.videoMessage?.contextInfo??message.documentMessage?.contextInfo??message.audioMessage?.contextInfo??message.stickerMessage?.contextInfo??message.buttonsResponseMessage?.contextInfo??message.listResponseMessage?.contextInfo??message.templateButtonReplyMessage?.contextInfo??message.interactiveResponseMessage?.contextInfo??message.buttonsMessage?.contextInfo??message.listMessage?.contextInfo;if(fallback)return fallback;for(let value of Object.values(message)){if(!value||typeof value!=`object`||!(`contextInfo`in value))continue;let candidateContext=value.contextInfo;if(candidateContext)return candidateContext}}function extractMentionedJids(rawMessage){let message=unwrapMessage$1(rawMessage);if(!message)return;let flattened=[message.extendedTextMessage?.contextInfo?.mentionedJid,message.extendedTextMessage?.contextInfo?.quotedMessage?.extendedTextMessage?.contextInfo?.mentionedJid,message.imageMessage?.contextInfo?.mentionedJid,message.videoMessage?.contextInfo?.mentionedJid,message.documentMessage?.contextInfo?.mentionedJid,message.audioMessage?.contextInfo?.mentionedJid,message.stickerMessage?.contextInfo?.mentionedJid,message.buttonsResponseMessage?.contextInfo?.mentionedJid,message.listResponseMessage?.contextInfo?.mentionedJid].flatMap(arr=>arr??[]).filter(Boolean);if(flattened.length!==0)return Array.from(new Set(flattened))}function extractText(rawMessage){let message=unwrapMessage$1(rawMessage);if(!message)return;let extracted=extractMessageContent(message),candidates=[message,extracted&&extracted!==message?extracted:void 0];for(let candidate of candidates){if(!candidate)continue;if(typeof candidate.conversation==`string`&&candidate.conversation.trim())return candidate.conversation.trim();let extended=candidate.extendedTextMessage?.text;if(extended?.trim())return extended.trim();let caption=candidate.imageMessage?.caption??candidate.videoMessage?.caption??candidate.documentMessage?.caption;if(caption?.trim())return caption.trim()}let contactPlaceholder=extractContactPlaceholder(message)??(extracted&&extracted!==message?extractContactPlaceholder(extracted):void 0);if(contactPlaceholder)return contactPlaceholder}function extractMediaPlaceholder(rawMessage){let message=unwrapMessage$1(rawMessage);if(message){if(message.imageMessage)return`<media:image>`;if(message.videoMessage)return`<media:video>`;if(message.audioMessage)return`<media:audio>`;if(message.documentMessage)return`<media:document>`;if(message.stickerMessage)return`<media:sticker>`}}function extractContactPlaceholder(rawMessage){let message=unwrapMessage$1(rawMessage);if(!message)return;let contact=message.contactMessage??void 0;if(contact){let{name,phones}=describeContact({displayName:contact.displayName,vcard:contact.vcard});return formatContactPlaceholder(name,phones)}let contactsArray=message.contactsArrayMessage?.contacts??void 0;if(!(!contactsArray||contactsArray.length===0))return formatContactsPlaceholder(contactsArray.map(entry=>describeContact({displayName:entry.displayName,vcard:entry.vcard})).map(entry=>formatContactLabel(entry.name,entry.phones)).filter(value=>!!value),contactsArray.length)}function describeContact(input){let displayName=(input.displayName??``).trim(),parsed=parseVcard(input.vcard??void 0);return{name:displayName||parsed.name,phones:parsed.phones}}function formatContactPlaceholder(name,phones){let label=formatContactLabel(name,phones);return label?`<contact: ${label}>`:`<contact>`}function formatContactsPlaceholder(labels,total){let cleaned=labels.map(label=>label.trim()).filter(Boolean);if(cleaned.length===0)return`<contacts: ${total} ${total===1?`contact`:`contacts`}>`;let remaining=Math.max(total-cleaned.length,0),suffix=remaining>0?` +${remaining} more`:``;return`<contacts: ${cleaned.join(`, `)}${suffix}>`}function formatContactLabel(name,phones){let parts=[name,formatPhoneList(phones)].filter(value=>!!value);if(parts.length!==0)return parts.join(`, `)}function formatPhoneList(phones){let cleaned=phones?.map(phone=>phone.trim()).filter(Boolean)??[];if(cleaned.length===0)return;let{shown,remaining}=summarizeList(cleaned,cleaned.length,1),[primary]=shown;if(primary)return remaining===0?primary:`${primary} (+${remaining} more)`}function summarizeList(values,total,maxShown){let shown=values.slice(0,maxShown);return{shown,remaining:Math.max(total-shown.length,0)}}function extractLocationData(rawMessage){let message=unwrapMessage$1(rawMessage);if(!message)return null;let live=message.liveLocationMessage??void 0;if(live){let latitudeRaw=live.degreesLatitude,longitudeRaw=live.degreesLongitude;if(latitudeRaw!=null&&longitudeRaw!=null){let latitude=Number(latitudeRaw),longitude=Number(longitudeRaw);if(Number.isFinite(latitude)&&Number.isFinite(longitude))return{latitude,longitude,accuracy:live.accuracyInMeters??void 0,caption:live.caption??void 0,source:`live`,isLive:!0}}}let location=message.locationMessage??void 0;if(location){let latitudeRaw=location.degreesLatitude,longitudeRaw=location.degreesLongitude;if(latitudeRaw!=null&&longitudeRaw!=null){let latitude=Number(latitudeRaw),longitude=Number(longitudeRaw);if(Number.isFinite(latitude)&&Number.isFinite(longitude)){let isLive=!!location.isLive;return{latitude,longitude,accuracy:location.accuracyInMeters??void 0,name:location.name??void 0,address:location.address??void 0,caption:location.comment??void 0,source:isLive?`live`:location.name||location.address?`place`:`pin`,isLive}}}}return null}function describeReplyContext(rawMessage){let message=unwrapMessage$1(rawMessage);if(!message)return null;let contextInfo=extractContextInfo(message),quoted=normalizeMessageContent(contextInfo?.quotedMessage);if(!quoted)return null;let location=extractLocationData(quoted),locationText=location?formatLocationText(location):void 0,body=[extractText(quoted),locationText].filter(Boolean).join(`
1
+ import{E as toWhatsappJid,F as shouldLogVerbose,M as logVerbose,U as getChildLogger,h as normalizeE164,m as jidToE164,p as isSelfChatMode,r as clamp,w as sleep,y as resolveJidToE164}from"./utils-DbaBVFaK.js";import{Cn as createInboundDebouncer,En as resolveEnvelopeFormatOptions,Mn as buildMentionRegexes,Mt as normalizeGroupActivation,Nn as normalizeMentionText,Nt as parseActivationCommand,On as hasControlCommand,Rt as computeBackoff,Sn as createDedupeCache,Tn as formatInboundEnvelope,_n as dispatchReplyWithBufferedBlockDispatcher,dn as buildPairingReply,fn as resolveMentionGating,gn as shouldAckReactionForWhatsApp,hn as recordPendingHistoryEntryIfEnabled,kn as shouldComputeCommandAuthorized,li as enqueueSystemEvent,mn as buildHistoryContextFromEntries,pn as DEFAULT_GROUP_HISTORY_LIMIT,t as getReplyFromConfig,wn as resolveInboundDebounceMs,zt as sleepWithAbort}from"./reply-CpGH-3If.js";import{a as buildAgentMainSessionKey,d as normalizeAgentId,i as DEFAULT_MAIN_KEY,s as buildGroupHistoryKey}from"./session-key-EoB0qaG9.js";import{i as defaultRuntime,t as createSubsystemLogger}from"./subsystem-B3TqcCrZ.js";import{t as formatCliCommand}from"./command-format-Dd7BgZsg.js";import{r as loadConfig}from"./io-YzT_09GD.js";import{t as finalizeInboundContext}from"./inbound-context-D4EJydwW.js";import{l as registerUnhandledRejectionHandler}from"./runner-C651oVfk.js";import{r as saveMediaBuffer}from"./store-BoTKCB2d.js";import{J as resolveChannelGroupRequireMention,Z as resolveGroupSessionKey,a as loadSessionStore,l as updateLastRoute,o as readSessionUpdatedAt,q as resolveChannelGroupPolicy,s as recordSessionMetaFromInbound}from"./sessions-OZNhnSwZ.js";import{i as getWebAuthAgeMs,n as resolveWhatsAppAccount,u as readWebSelfId}from"./accounts-CTKk3xPO.js";import{c as resolveStorePath}from"./paths-CkcK939O.js";import{H as formatLocationText,U as toLocationContext}from"./send-DlPwTVpG.js";import{c as resolveIdentityNamePrefix,l as resolveMessagePrefix,n as createReplyPrefixOptions}from"./reply-prefix-BwtP84WV.js";import{c as resolveTextChunkLimit,i as chunkMarkdownTextWithMode,s as resolveChunkMode}from"./chunk-h7FZEwW2.js";import{t as resolveMarkdownTableMode}from"./markdown-tables-DOq8FfUr.js";import{a as loadWebMedia,s as getAgentScopedMediaLocalRoots}from"./ir-AM9J0QtO.js";import{n as recordChannelActivity}from"./channel-activity-qRD5c3VV.js";import{t as convertMarkdownTables}from"./tables-DirB1oU7.js";import{i as readChannelAllowFromStore,o as upsertChannelPairingRequest}from"./pairing-store-DIpKOfDK.js";import{r as formatDurationPrecise}from"./format-duration-BwzoPIex.js";import{n as resolveAgentRoute,t as buildAgentSessionKey}from"./resolve-route-BvfmiLqC.js";import{r as setActiveWebListener}from"./active-listener-DBdxNyOd.js";import{i as markdownToWhatsApp,r as sendReactionWhatsApp}from"./outbound-x_RWkIhC.js";import{i as waitForWaConnection,n as formatError,r as getStatusCode,t as createWaSocket}from"./session-CBCgyqjR.js";import{randomUUID}from"node:crypto";import{getMaxListeners,setMaxListeners}from"node:events";import{DisconnectReason,downloadMediaMessage,extractMessageContent,getContentType,isJidGroup,normalizeMessageContent}from"@whiskeysockets/baileys";const DEFAULT_RECONNECT_POLICY={initialMs:2e3,maxMs:3e4,factor:1.8,jitter:.25,maxAttempts:12};function resolveHeartbeatSeconds(cfg,overrideSeconds){let candidate=overrideSeconds??cfg.web?.heartbeatSeconds;return typeof candidate==`number`&&candidate>0?candidate:60}function resolveReconnectPolicy(cfg,overrides){let reconnectOverrides=cfg.web?.reconnect??{},overrideConfig=overrides??{},merged={...DEFAULT_RECONNECT_POLICY,...reconnectOverrides,...overrideConfig};return merged.initialMs=Math.max(250,merged.initialMs),merged.maxMs=Math.max(merged.initialMs,merged.maxMs),merged.factor=clamp(merged.factor,1.1,10),merged.jitter=clamp(merged.jitter,0,1),merged.maxAttempts=Math.max(0,Math.floor(merged.maxAttempts)),merged}function newConnectionId(){return randomUUID()}const whatsappLog=createSubsystemLogger(`gateway/channels/whatsapp`),whatsappInboundLog=whatsappLog.child(`inbound`),whatsappOutboundLog=whatsappLog.child(`outbound`),whatsappHeartbeatLog=whatsappLog.child(`heartbeat`);function elide(text,limit=400){return!text||text.length<=limit?text:`${text.slice(0,limit)}… (truncated ${text.length-limit} chars)`}function isLikelyWhatsAppCryptoError(reason){let haystack=(reason instanceof Error?`${reason.message}\n${reason.stack??``}`:(value=>{if(value==null)return``;if(typeof value==`string`)return value;if(value instanceof Error)return`${value.message}\n${value.stack??``}`;if(typeof value==`object`)try{return JSON.stringify(value)}catch{return Object.prototype.toString.call(value)}return typeof value==`number`||typeof value==`boolean`||typeof value==`bigint`?String(value):typeof value==`symbol`?value.description??value.toString():typeof value==`function`?value.name?`[function ${value.name}]`:`[function]`:Object.prototype.toString.call(value)})(reason)).toLowerCase();return haystack.includes(`unsupported state or unable to authenticate data`)||haystack.includes(`bad mac`)?haystack.includes(`@whiskeysockets/baileys`)||haystack.includes(`baileys`)||haystack.includes(`noise-handler`)||haystack.includes(`aesdecryptgcm`):!1}function waitForever(){return setInterval(()=>{},1e6).unref(),new Promise(()=>{})}const recentInboundMessages=createDedupeCache({ttlMs:20*6e4,maxSize:5e3});function isRecentInboundMessage(key){return recentInboundMessages.check(key)}const ALLOWED_VCARD_KEYS=new Set([`FN`,`N`,`TEL`]);function parseVcard(vcard){if(!vcard)return{phones:[]};let lines=vcard.split(/\r?\n/),nameFromN,nameFromFn,phones=[];for(let rawLine of lines){let line=rawLine.trim();if(!line)continue;let colonIndex=line.indexOf(`:`);if(colonIndex===-1)continue;let key=line.slice(0,colonIndex).toUpperCase(),rawValue=line.slice(colonIndex+1).trim();if(!rawValue)continue;let baseKey=normalizeVcardKey(key);if(!baseKey||!ALLOWED_VCARD_KEYS.has(baseKey))continue;let value=cleanVcardValue(rawValue);if(value){if(baseKey===`FN`&&!nameFromFn){nameFromFn=normalizeVcardName(value);continue}if(baseKey===`N`&&!nameFromN){nameFromN=normalizeVcardName(value);continue}if(baseKey===`TEL`){let phone=normalizeVcardPhone(value);phone&&phones.push(phone)}}}return{name:nameFromFn??nameFromN,phones}}function normalizeVcardKey(key){let[primary]=key.split(`;`);if(!primary)return;let segments=primary.split(`.`);return segments[segments.length-1]||void 0}function cleanVcardValue(value){return value.replace(/\\n/gi,` `).replace(/\\,/g,`,`).replace(/\\;/g,`;`).trim()}function normalizeVcardName(value){return value.replace(/;/g,` `).replace(/\s+/g,` `).trim()}function normalizeVcardPhone(value){let trimmed=value.trim();return trimmed?trimmed.toLowerCase().startsWith(`tel:`)?trimmed.slice(4).trim():trimmed:``}function unwrapMessage$1(message){return normalizeMessageContent(message)}function extractContextInfo(message){if(!message)return;let contentType=getContentType(message),candidate=contentType?message[contentType]:void 0,contextInfo=candidate&&typeof candidate==`object`&&`contextInfo`in candidate?candidate.contextInfo:void 0;if(contextInfo)return contextInfo;let fallback=message.extendedTextMessage?.contextInfo??message.imageMessage?.contextInfo??message.videoMessage?.contextInfo??message.documentMessage?.contextInfo??message.audioMessage?.contextInfo??message.stickerMessage?.contextInfo??message.buttonsResponseMessage?.contextInfo??message.listResponseMessage?.contextInfo??message.templateButtonReplyMessage?.contextInfo??message.interactiveResponseMessage?.contextInfo??message.buttonsMessage?.contextInfo??message.listMessage?.contextInfo;if(fallback)return fallback;for(let value of Object.values(message)){if(!value||typeof value!=`object`||!(`contextInfo`in value))continue;let candidateContext=value.contextInfo;if(candidateContext)return candidateContext}}function extractMentionedJids(rawMessage){let message=unwrapMessage$1(rawMessage);if(!message)return;let flattened=[message.extendedTextMessage?.contextInfo?.mentionedJid,message.extendedTextMessage?.contextInfo?.quotedMessage?.extendedTextMessage?.contextInfo?.mentionedJid,message.imageMessage?.contextInfo?.mentionedJid,message.videoMessage?.contextInfo?.mentionedJid,message.documentMessage?.contextInfo?.mentionedJid,message.audioMessage?.contextInfo?.mentionedJid,message.stickerMessage?.contextInfo?.mentionedJid,message.buttonsResponseMessage?.contextInfo?.mentionedJid,message.listResponseMessage?.contextInfo?.mentionedJid].flatMap(arr=>arr??[]).filter(Boolean);if(flattened.length!==0)return Array.from(new Set(flattened))}function extractText(rawMessage){let message=unwrapMessage$1(rawMessage);if(!message)return;let extracted=extractMessageContent(message),candidates=[message,extracted&&extracted!==message?extracted:void 0];for(let candidate of candidates){if(!candidate)continue;if(typeof candidate.conversation==`string`&&candidate.conversation.trim())return candidate.conversation.trim();let extended=candidate.extendedTextMessage?.text;if(extended?.trim())return extended.trim();let caption=candidate.imageMessage?.caption??candidate.videoMessage?.caption??candidate.documentMessage?.caption;if(caption?.trim())return caption.trim()}let contactPlaceholder=extractContactPlaceholder(message)??(extracted&&extracted!==message?extractContactPlaceholder(extracted):void 0);if(contactPlaceholder)return contactPlaceholder}function extractMediaPlaceholder(rawMessage){let message=unwrapMessage$1(rawMessage);if(message){if(message.imageMessage)return`<media:image>`;if(message.videoMessage)return`<media:video>`;if(message.audioMessage)return`<media:audio>`;if(message.documentMessage)return`<media:document>`;if(message.stickerMessage)return`<media:sticker>`}}function extractContactPlaceholder(rawMessage){let message=unwrapMessage$1(rawMessage);if(!message)return;let contact=message.contactMessage??void 0;if(contact){let{name,phones}=describeContact({displayName:contact.displayName,vcard:contact.vcard});return formatContactPlaceholder(name,phones)}let contactsArray=message.contactsArrayMessage?.contacts??void 0;if(!(!contactsArray||contactsArray.length===0))return formatContactsPlaceholder(contactsArray.map(entry=>describeContact({displayName:entry.displayName,vcard:entry.vcard})).map(entry=>formatContactLabel(entry.name,entry.phones)).filter(value=>!!value),contactsArray.length)}function describeContact(input){let displayName=(input.displayName??``).trim(),parsed=parseVcard(input.vcard??void 0);return{name:displayName||parsed.name,phones:parsed.phones}}function formatContactPlaceholder(name,phones){let label=formatContactLabel(name,phones);return label?`<contact: ${label}>`:`<contact>`}function formatContactsPlaceholder(labels,total){let cleaned=labels.map(label=>label.trim()).filter(Boolean);if(cleaned.length===0)return`<contacts: ${total} ${total===1?`contact`:`contacts`}>`;let remaining=Math.max(total-cleaned.length,0),suffix=remaining>0?` +${remaining} more`:``;return`<contacts: ${cleaned.join(`, `)}${suffix}>`}function formatContactLabel(name,phones){let parts=[name,formatPhoneList(phones)].filter(value=>!!value);if(parts.length!==0)return parts.join(`, `)}function formatPhoneList(phones){let cleaned=phones?.map(phone=>phone.trim()).filter(Boolean)??[];if(cleaned.length===0)return;let{shown,remaining}=summarizeList(cleaned,cleaned.length,1),[primary]=shown;if(primary)return remaining===0?primary:`${primary} (+${remaining} more)`}function summarizeList(values,total,maxShown){let shown=values.slice(0,maxShown);return{shown,remaining:Math.max(total-shown.length,0)}}function extractLocationData(rawMessage){let message=unwrapMessage$1(rawMessage);if(!message)return null;let live=message.liveLocationMessage??void 0;if(live){let latitudeRaw=live.degreesLatitude,longitudeRaw=live.degreesLongitude;if(latitudeRaw!=null&&longitudeRaw!=null){let latitude=Number(latitudeRaw),longitude=Number(longitudeRaw);if(Number.isFinite(latitude)&&Number.isFinite(longitude))return{latitude,longitude,accuracy:live.accuracyInMeters??void 0,caption:live.caption??void 0,source:`live`,isLive:!0}}}let location=message.locationMessage??void 0;if(location){let latitudeRaw=location.degreesLatitude,longitudeRaw=location.degreesLongitude;if(latitudeRaw!=null&&longitudeRaw!=null){let latitude=Number(latitudeRaw),longitude=Number(longitudeRaw);if(Number.isFinite(latitude)&&Number.isFinite(longitude)){let isLive=!!location.isLive;return{latitude,longitude,accuracy:location.accuracyInMeters??void 0,name:location.name??void 0,address:location.address??void 0,caption:location.comment??void 0,source:isLive?`live`:location.name||location.address?`place`:`pin`,isLive}}}}return null}function describeReplyContext(rawMessage){let message=unwrapMessage$1(rawMessage);if(!message)return null;let contextInfo=extractContextInfo(message),quoted=normalizeMessageContent(contextInfo?.quotedMessage);if(!quoted)return null;let location=extractLocationData(quoted),locationText=location?formatLocationText(location):void 0,body=[extractText(quoted),locationText].filter(Boolean).join(`
2
2
  `).trim();if(body||=extractMediaPlaceholder(quoted),!body){let quotedType=quoted?getContentType(quoted):void 0;return logVerbose(`Quoted message missing extractable body${quotedType?` (type ${quotedType})`:``}`),null}let senderJid=contextInfo?.participant??void 0,senderE164=senderJid?jidToE164(senderJid)??senderJid:void 0,sender=senderE164??`unknown sender`;return{id:contextInfo?.stanzaId?String(contextInfo.stanzaId):void 0,body,sender,senderJid,senderE164}}async function checkInboundAccessControl(params){let cfg=loadConfig(),account=resolveWhatsAppAccount({cfg,accountId:params.accountId}),dmPolicy=account.dmPolicy??`pairing`,configuredAllowFrom=account.allowFrom,storeAllowFrom=await readChannelAllowFromStore(`whatsapp`,process.env,account.accountId).catch(()=>[]),combinedAllowFrom=Array.from(new Set([...configuredAllowFrom??[],...storeAllowFrom])),defaultAllowFrom=combinedAllowFrom.length===0&&params.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`&&params.pairingGraceMs>0?params.pairingGraceMs:3e4,suppressPairingReply=typeof params.connectedAtMs==`number`&&typeof params.messageTimestampMs==`number`&&params.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&&params.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`&&params.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&&params.msg.senderE164?`${params.msg.senderName} (${params.msg.senderE164})`:params.msg.senderName??params.msg.senderE164??`Unknown`;recordPendingHistoryEntryIfEnabled({historyMap:params.groupHistories,historyKey:params.groupHistoryKey,limit:params.groupHistoryLimit,entry:{sender,body:params.msg.body,timestamp:params.msg.timestamp,id:params.msg.id,senderJid:params.msg.senderJid}})}function applyGroupGating(params){let groupPolicy=resolveGroupPolicyFor(params.cfg,params.conversationId);if(groupPolicy.allowlistEnabled&&!groupPolicy.allowed)return params.logVerbose(`Skipping group message ${params.conversationId} (not in allowlist)`),{shouldProcess:!1};noteGroupMember(params.groupMemberNames,params.groupHistoryKey,params.msg.senderE164,params.msg.senderName);let mentionConfig=buildMentionConfig(params.cfg,params.agentId),commandBody=stripMentionsForCommand(params.msg.body,mentionConfig.mentionRegexes,params.msg.selfE164),activationCommand=parseActivationCommand(commandBody),owner=isOwnerSender(params.baseMentionConfig,params.msg),shouldBypassMention=owner&&hasControlCommand(commandBody,params.cfg);if(activationCommand.hasCommand&&!owner)return params.logVerbose(`Ignoring /activation from non-owner in group ${params.conversationId}`),recordPendingGroupHistoryEntry({msg:params.msg,groupHistories:params.groupHistories,groupHistoryKey:params.groupHistoryKey,groupHistoryLimit:params.groupHistoryLimit}),{shouldProcess:!1};let mentionDebug=debugMention(params.msg,mentionConfig,params.authDir);params.replyLogger.debug({conversationId:params.conversationId,wasMentioned:mentionDebug.wasMentioned,...mentionDebug.details},`group mention debug`);let wasMentioned=mentionDebug.wasMentioned,requireMention=resolveGroupActivationFor({cfg:params.cfg,agentId:params.agentId,sessionKey:params.sessionKey,conversationId:params.conversationId})!==`always`,selfJid=params.msg.selfJid?.replace(/:\\d+/,``),replySenderJid=params.msg.replyToSenderJid?.replace(/:\\d+/,``),selfE164=params.msg.selfE164?normalizeE164(params.msg.selfE164):null,replySenderE164=params.msg.replyToSenderE164?normalizeE164(params.msg.replyToSenderE164):null,mentionGate=resolveMentionGating({requireMention,canDetectMention:!0,wasMentioned,implicitMention:!!(selfJid&&replySenderJid&&selfJid===replySenderJid||selfE164&&replySenderE164&&selfE164===replySenderE164),shouldBypassMention});return params.msg.wasMentioned=mentionGate.effectiveWasMentioned,!shouldBypassMention&&requireMention&&mentionGate.shouldSkip?(params.logVerbose(`Group message stored for context (no mention detected) in ${params.conversationId}: ${params.msg.body}`),recordPendingGroupHistoryEntry({msg:params.msg,groupHistories:params.groupHistories,groupHistoryKey:params.groupHistoryKey,groupHistoryLimit:params.groupHistoryLimit}),{shouldProcess:!1}):{shouldProcess:!0}}function trackBackgroundTask(backgroundTasks,task){backgroundTasks.add(task),task.finally(()=>{backgroundTasks.delete(task)})}function updateLastRouteInBackground(params){let storePath=resolveStorePath(params.cfg.session?.store,{agentId:params.storeAgentId}),task=updateLastRoute({storePath,sessionKey:params.sessionKey,deliveryContext:{channel:params.channel,to:params.to,accountId:params.accountId},ctx:params.ctx}).catch(err=>{params.warn({error:formatError(err),storePath,sessionKey:params.sessionKey,to:params.to},`failed updating last route`)});trackBackgroundTask(params.backgroundTasks,task)}function resolvePeerId(msg){return msg.chatType===`group`?msg.conversationId??msg.from:msg.senderE164?normalizeE164(msg.senderE164)??msg.senderE164:msg.from.includes(`@`)?jidToE164(msg.from)??msg.from:normalizeE164(msg.from)??msg.from}async function deliverWebReply(params){let{replyResult,msg,maxMediaBytes,textLimit,replyLogger,connectionId,skipLog}=params,replyStarted=Date.now(),tableMode=params.tableMode??`code`,chunkMode=params.chunkMode??`length`,textChunks=chunkMarkdownTextWithMode(markdownToWhatsApp(convertMarkdownTables(replyResult.text||``,tableMode)),textLimit,chunkMode),mediaList=replyResult.mediaUrls?.length?replyResult.mediaUrls:replyResult.mediaUrl?[replyResult.mediaUrl]:[],sendWithRetry=async(fn,label,maxAttempts=3)=>{let lastErr;for(let attempt=1;attempt<=maxAttempts;attempt++)try{return await fn()}catch(err){lastErr=err;let errText=formatError(err),isLast=attempt===maxAttempts;if(!/closed|reset|timed\\s*out|disconnect/i.test(errText)||isLast)throw err;let backoffMs=500*attempt;logVerbose(`Retrying ${label} to ${msg.from} after failure (${attempt}/${maxAttempts-1}) in ${backoffMs}ms: ${errText}`),await sleep(backoffMs)}throw lastErr};if(mediaList.length===0&&textChunks.length){let totalChunks=textChunks.length;for(let[index,chunk]of textChunks.entries()){let chunkStarted=Date.now();if(await sendWithRetry(()=>msg.reply(chunk),`text`),!skipLog){let durationMs=Date.now()-chunkStarted;whatsappOutboundLog.debug(`Sent chunk ${index+1}/${totalChunks} to ${msg.from} (${durationMs.toFixed(0)}ms)`)}}replyLogger.info({correlationId:msg.id??newConnectionId(),connectionId:connectionId??null,to:msg.from,from:msg.to,text:elide(replyResult.text,240),mediaUrl:null,mediaSizeBytes:null,mediaKind:null,durationMs:Date.now()-replyStarted},`auto-reply sent (text)`);return}let remainingText=[...textChunks];for(let[index,mediaUrl]of mediaList.entries()){let caption=index===0&&remainingText.shift()||void 0;try{let media=await loadWebMedia(mediaUrl,{maxBytes:maxMediaBytes,localRoots:params.mediaLocalRoots});if(shouldLogVerbose()&&(logVerbose(`Web auto-reply media size: ${(media.buffer.length/(1024*1024)).toFixed(2)}MB`),logVerbose(`Web auto-reply media source: ${mediaUrl} (kind ${media.kind})`)),media.kind===`image`)await sendWithRetry(()=>msg.sendMedia({image:media.buffer,caption,mimetype:media.contentType}),`media:image`);else if(media.kind===`audio`)await sendWithRetry(()=>msg.sendMedia({audio:media.buffer,ptt:!0,mimetype:media.contentType,caption}),`media:audio`);else if(media.kind===`video`)await sendWithRetry(()=>msg.sendMedia({video:media.buffer,caption,mimetype:media.contentType}),`media:video`);else{let fileName=media.fileName??mediaUrl.split(`/`).pop()??`file`,mimetype=media.contentType??`application/octet-stream`;await sendWithRetry(()=>msg.sendMedia({document:media.buffer,fileName,caption,mimetype}),`media:document`)}whatsappOutboundLog.info(`Sent media reply to ${msg.from} (${(media.buffer.length/(1024*1024)).toFixed(2)}MB)`),replyLogger.info({correlationId:msg.id??newConnectionId(),connectionId:connectionId??null,to:msg.from,from:msg.to,text:caption??null,mediaUrl,mediaSizeBytes:media.buffer.length,mediaKind:media.kind,durationMs:Date.now()-replyStarted},`auto-reply sent (media)`)}catch(err){if(whatsappOutboundLog.error(`Failed sending web media to ${msg.from}: ${formatError(err)}`),replyLogger.warn({err,mediaUrl},`failed to send web media reply`),index===0){let warning=err instanceof Error?`⚠️ Media failed: ${err.message}`:`⚠️ Media failed.`,fallbackText=[remainingText.shift()??caption??``,warning].filter(Boolean).join(`
@@ -1,4 +1,4 @@
1
- import"./paths-BHg-VHB4.js";import{r as DEFAULT_CHAT_CHANNEL}from"./registry-Cv7CoWAs.js";import{D as danger,N as setVerbose,W as getResolvedLoggerSettings,d as isRecord,z as theme}from"./utils-BP60e80M.js";import{p as defaultRuntime}from"./subsystem-C4b1Von0.js";import"./boolean-ssGoaBPk.js";import"./env-BoE8QSib.js";import"./warning-filter-nSTjpMIH.js";import{x as loadAuthProfileStore}from"./auth-profiles-BARnVAUE.js";import{t as formatCliCommand}from"./command-format-DTMaGKs7.js";import"./logger-AbH8mdkv.js";import{n as DEFAULT_ACCOUNT_ID,u as normalizeAccountId}from"./session-key-D--2AEus.js";import"./builderforce-root-D3-p8W2n.js";import"./exec-CGuYALEs.js";import{c as resolveAgentWorkspaceDir,l as resolveDefaultAgentId}from"./agent-scope-BcoQBOwz.js";import"./env-file-BIKVpYUN.js";import{a as readConfigFileSnapshot,c as writeConfigFile,r as loadConfig}from"./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{n as callGateway}from"./call-CjC3SRPv.js";import"./message-channel-C-yw5fZm.js";import{T as deleteTelegramUpdateOffset}from"./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{l as resolveTelegramAccount,n as listChannelPlugins,r as normalizeChannelId,t as getChannelPlugin}from"./plugins-DJGW_fnS.js";import"./accounts-Z5bJpNrG.js";import"./bindings-D0uket3l.js";import{r as createSlackWebClient}from"./send-gG3CFJwv.js";import{Q as fetchChannelPermissionsDiscord,tt as parseDiscordTarget}from"./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{n as formatTimeAgo}from"./format-relative-CI0FaTqw.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{n as formatUsageReportLines,t as loadProviderUsageSummary}from"./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{n as resolveMessageChannelSelection}from"./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{t as formatDocsLink}from"./links-B6LU5cXN.js";import{n as runCommandWithRuntime}from"./cli-utils-ByV85M53.js";import{t as formatHelpExamples}from"./help-format-DIDk_7gh.js";import{n as withProgress}from"./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-CFwb8DcP.js";import"./transformers-stream-nSL4Xu31.js";import{t as hasExplicitOptions}from"./command-options-I0sHK97L.js";import{r as listChannelPluginCatalogEntries}from"./catalog-CEJqw4s-.js";import"./note-BvXfFmlu.js";import{t as createClackPrompter}from"./clack-prompter-ZmHdfPGJ.js";import{t as resolveChannelDefaultAccountId}from"./helpers-DDS6DSK4.js";import"./plugin-auto-enable-tSxWjjZC.js";import"./install-safe-path-BxCb3BJW.js";import"./npm-registry-spec-DXx5hKYJ.js";import"./skill-scanner-YCbLEfNS.js";import"./installs-BBKikcCJ.js";import{i as reloadOnboardingPluginRegistry,n as setupChannels,r as ensureOnboardingPluginInstalled}from"./onboard-channels-Dir2EguP.js";import{t as requireValidConfigSnapshot}from"./config-validation-BSOxA3Lt.js";import{t as buildChannelAccountSnapshot}from"./status-B3YnmG0_.js";import{t as parseLogLine}from"./parse-log-line-21Z5mz37.js";import{t as collectChannelStatusIssues}from"./channels-status-issues-DLF6QGGM.js";import"./plugin-registry-Ty9w94Rd.js";import{t as formatCliChannelOptions}from"./channel-options-Cbz6vcgo.js";import fs from"node:fs/promises";function applyAccountName(params){let accountId=normalizeAccountId(params.accountId),apply=getChannelPlugin(params.channel)?.setup?.applyAccountName;return apply?apply({cfg:params.cfg,accountId,name:params.name}):params.cfg}function applyChannelAccountConfig(params){let accountId=normalizeAccountId(params.accountId),apply=getChannelPlugin(params.channel)?.setup?.applyAccountConfig;return apply?apply({cfg:params.cfg,accountId,input:params.input}):params.cfg}async function requireValidConfig(runtime=defaultRuntime){return await requireValidConfigSnapshot(runtime)}function formatAccountLabel(params){let base=params.accountId||DEFAULT_ACCOUNT_ID;return params.name?.trim()?`${base} (${params.name.trim()})`:base}const channelLabel=channel=>getChannelPlugin(channel)?.meta.label??channel;function formatChannelAccountLabel(params){let channelText=channelLabel(params.channel),accountText=formatAccountLabel({accountId:params.accountId,name:params.name});return`${params.channelStyle?params.channelStyle(channelText):channelText} ${params.accountStyle?params.accountStyle(accountText):accountText}`}function shouldUseWizard(params){return params?.hasFlags===!1}function parseList(value){if(!value?.trim())return;let parsed=value.split(/[\n,;]+/g).map(entry=>entry.trim()).filter(Boolean);return parsed.length>0?parsed:void 0}function resolveCatalogChannelEntry(raw,cfg){let trimmed=raw.trim().toLowerCase();if(trimmed)return listChannelPluginCatalogEntries({workspaceDir:cfg?resolveAgentWorkspaceDir(cfg,resolveDefaultAgentId(cfg)):void 0}).find(entry=>entry.id.toLowerCase()===trimmed?!0:(entry.meta.aliases??[]).some(alias=>alias.trim().toLowerCase()===trimmed))}async function channelsAddCommand(opts,runtime=defaultRuntime,params){let cfg=await requireValidConfig(runtime);if(!cfg)return;let nextConfig=cfg;if(shouldUseWizard(params)){let prompter=createClackPrompter(),selection=[],accountIds={};await prompter.intro(`Channel setup`);let nextConfig=await setupChannels(cfg,runtime,prompter,{allowDisable:!1,allowSignalInstall:!0,promptAccountIds:!0,onSelection:value=>{selection=value},onAccountId:(channel,accountId)=>{accountIds[channel]=accountId}});if(selection.length===0){await prompter.outro(`No channels selected.`);return}if(await prompter.confirm({message:`Add display names for these accounts? (optional)`,initialValue:!1}))for(let channel of selection){let accountId=accountIds[channel]??DEFAULT_ACCOUNT_ID,plugin=getChannelPlugin(channel),account=plugin?.config.resolveAccount(nextConfig,accountId),existingName=plugin?.config.describeAccount?.(account,nextConfig)?.name??account?.name,name=await prompter.text({message:`${channel} account name (${accountId})`,initialValue:existingName});name?.trim()&&(nextConfig=applyAccountName({cfg:nextConfig,channel,accountId,name}))}await writeConfigFile(nextConfig),await prompter.outro(`Channels updated.`);return}let rawChannel=String(opts.channel??``),channel=normalizeChannelId(rawChannel),catalogEntry=channel?void 0:resolveCatalogChannelEntry(rawChannel,nextConfig);if(!channel&&catalogEntry){let prompter=createClackPrompter(),workspaceDir=resolveAgentWorkspaceDir(nextConfig,resolveDefaultAgentId(nextConfig)),result=await ensureOnboardingPluginInstalled({cfg:nextConfig,entry:catalogEntry,prompter,runtime,workspaceDir});if(nextConfig=result.cfg,!result.installed)return;reloadOnboardingPluginRegistry({cfg:nextConfig,runtime,workspaceDir}),channel=normalizeChannelId(catalogEntry.id)??catalogEntry.id}if(!channel){let hint=catalogEntry?`Plugin ${catalogEntry.meta.label} could not be loaded after install.`:`Unknown channel: ${String(opts.channel??``)}`;runtime.error(hint),runtime.exit(1);return}let plugin=getChannelPlugin(channel);if(!plugin?.setup?.applyAccountConfig){runtime.error(`Channel ${channel} does not support add.`),runtime.exit(1);return}let accountId=plugin.setup.resolveAccountId?.({cfg:nextConfig,accountId:opts.account})??normalizeAccountId(opts.account),useEnv=opts.useEnv===!0,initialSyncLimit=typeof opts.initialSyncLimit==`number`?opts.initialSyncLimit:typeof opts.initialSyncLimit==`string`&&opts.initialSyncLimit.trim()?Number.parseInt(opts.initialSyncLimit,10):void 0,groupChannels=parseList(opts.groupChannels),dmAllowlist=parseList(opts.dmAllowlist),input={name:opts.name,token:opts.token,tokenFile:opts.tokenFile,botToken:opts.botToken,appToken:opts.appToken,signalNumber:opts.signalNumber,cliPath:opts.cliPath,dbPath:opts.dbPath,service:opts.service,region:opts.region,authDir:opts.authDir,httpUrl:opts.httpUrl,httpHost:opts.httpHost,httpPort:opts.httpPort,webhookPath:opts.webhookPath,webhookUrl:opts.webhookUrl,audienceType:opts.audienceType,audience:opts.audience,homeserver:opts.homeserver,userId:opts.userId,accessToken:opts.accessToken,password:opts.password,deviceName:opts.deviceName,initialSyncLimit,useEnv,ship:opts.ship,url:opts.url,code:opts.code,groupChannels,dmAllowlist,autoDiscoverChannels:opts.autoDiscoverChannels},validationError=plugin.setup.validateInput?.({cfg:nextConfig,accountId,input});if(validationError){runtime.error(validationError),runtime.exit(1);return}let previousTelegramToken=channel===`telegram`?resolveTelegramAccount({cfg:nextConfig,accountId}).token.trim():``;nextConfig=applyChannelAccountConfig({cfg:nextConfig,channel,accountId,input}),channel===`telegram`&&previousTelegramToken!==resolveTelegramAccount({cfg:nextConfig,accountId}).token.trim()&&await deleteTelegramUpdateOffset({accountId}),await writeConfigFile(nextConfig),runtime.log(`Added ${channelLabel(channel)} account "${accountId}".`)}function collectScopes(value,into){if(value){if(Array.isArray(value)){for(let entry of value)typeof entry==`string`&&entry.trim()&&into.push(entry.trim());return}if(typeof value==`string`){let raw=value.trim();if(!raw)return;let parts=raw.split(/[,\s]+/).map(part=>part.trim());for(let part of parts)part&&into.push(part);return}if(isRecord(value))for(let entry of Object.values(value))(Array.isArray(entry)||typeof entry==`string`)&&collectScopes(entry,into)}}function normalizeScopes(scopes){return Array.from(new Set(scopes.map(scope=>scope.trim()).filter(Boolean))).toSorted()}function extractScopes(payload){if(!isRecord(payload))return[];let scopes=[];return collectScopes(payload.scopes,scopes),collectScopes(payload.scope,scopes),isRecord(payload.info)&&(collectScopes(payload.info.scopes,scopes),collectScopes(payload.info.scope,scopes),collectScopes(payload.info.user_scopes,scopes),collectScopes(payload.info.bot_scopes,scopes)),normalizeScopes(scopes)}function readError(payload){if(!isRecord(payload))return;let error=payload.error;return typeof error==`string`&&error.trim()?error.trim():void 0}async function callSlack(client,method){try{let result=await client.apiCall(method);return isRecord(result)?result:null}catch(err){return{ok:!1,error:err instanceof Error?err.message:String(err)}}}async function fetchSlackScopes(token,timeoutMs){let client=createSlackWebClient(token,{timeout:timeoutMs}),attempts=[`auth.scopes`,`apps.permissions.info`],errors=[];for(let method of attempts){let result=await callSlack(client,method),scopes=extractScopes(result);if(scopes.length>0)return{ok:!0,scopes,source:method};let error=readError(result);error&&errors.push(`${method}: ${error}`)}return{ok:!1,error:errors.length>0?errors.join(` | `):`no scopes returned`}}const REQUIRED_DISCORD_PERMISSIONS=[`ViewChannel`,`SendMessages`],TEAMS_GRAPH_PERMISSION_HINTS={"ChannelMessage.Read.All":`channel history`,"Chat.Read.All":`chat history`,"Channel.ReadBasic.All":`channel list`,"Team.ReadBasic.All":`team list`,"TeamsActivity.Read.All":`teams activity`,"Sites.Read.All":`files (SharePoint)`,"Files.Read.All":`files (OneDrive)`};function normalizeTimeout(raw,fallback=1e4){let value=Number(raw);return!Number.isFinite(value)||value<=0?fallback:value}function formatSupport(capabilities){if(!capabilities)return`unknown`;let bits=[];return capabilities.chatTypes?.length&&bits.push(`chatTypes=${capabilities.chatTypes.join(`,`)}`),capabilities.polls&&bits.push(`polls`),capabilities.reactions&&bits.push(`reactions`),capabilities.edit&&bits.push(`edit`),capabilities.unsend&&bits.push(`unsend`),capabilities.reply&&bits.push(`reply`),capabilities.effects&&bits.push(`effects`),capabilities.groupManagement&&bits.push(`groupManagement`),capabilities.threads&&bits.push(`threads`),capabilities.media&&bits.push(`media`),capabilities.nativeCommands&&bits.push(`nativeCommands`),capabilities.blockStreaming&&bits.push(`blockStreaming`),bits.length?bits.join(` `):`none`}function summarizeDiscordTarget(raw){if(!raw)return;let target=parseDiscordTarget(raw,{defaultKind:`channel`});return target?target.kind===`channel`?{raw,normalized:target.normalized,kind:`channel`,channelId:target.id}:target.kind===`user`?{raw,normalized:target.normalized,kind:`user`}:{raw,normalized:target.normalized}:{raw}}function formatDiscordIntents(intents){return intents?[`messageContent=${intents.messageContent??`unknown`}`,`guildMembers=${intents.guildMembers??`unknown`}`,`presence=${intents.presence??`unknown`}`].join(` `):`unknown`}function formatProbeLines(channelId,probe){let lines=[];if(!probe||typeof probe!=`object`)return lines;let probeObj=probe;if(channelId===`discord`){let bot=probeObj.bot;if(bot?.username){let botId=bot.id?` (${bot.id})`:``;lines.push(`Bot: ${theme.accent(`@${bot.username}`)}${botId}`)}let app=probeObj.application;app?.intents&&lines.push(`Intents: ${formatDiscordIntents(app.intents)}`)}if(channelId===`telegram`){let bot=probeObj.bot;if(bot?.username){let botId=bot.id?` (${bot.id})`:``;lines.push(`Bot: ${theme.accent(`@${bot.username}`)}${botId}`)}let flags=[],canJoinGroups=bot?.canJoinGroups,canReadAll=bot?.canReadAllGroupMessages,inlineQueries=bot?.supportsInlineQueries;typeof canJoinGroups==`boolean`&&flags.push(`joinGroups=${canJoinGroups}`),typeof canReadAll==`boolean`&&flags.push(`readAllGroupMessages=${canReadAll}`),typeof inlineQueries==`boolean`&&flags.push(`inlineQueries=${inlineQueries}`),flags.length>0&&lines.push(`Flags: ${flags.join(` `)}`);let webhook=probeObj.webhook;webhook?.url!==void 0&&lines.push(`Webhook: ${webhook.url||`none`}`)}if(channelId===`slack`){let bot=probeObj.bot,team=probeObj.team;if(bot?.name&&lines.push(`Bot: ${theme.accent(`@${bot.name}`)}`),team?.name||team?.id){let id=team?.id?` (${team.id})`:``;lines.push(`Team: ${team?.name??`unknown`}${id}`)}}if(channelId===`signal`){let version=probeObj.version;version&&lines.push(`Signal daemon: ${version}`)}if(channelId===`msteams`){let appId=typeof probeObj.appId==`string`?probeObj.appId.trim():``;appId&&lines.push(`App: ${theme.accent(appId)}`);let graph=probeObj.graph;if(graph){let roles=Array.isArray(graph.roles)?graph.roles.map(role=>String(role).trim()).filter(Boolean):[],scopes=typeof graph.scopes==`string`?graph.scopes.split(/\s+/).map(scope=>scope.trim()).filter(Boolean):Array.isArray(graph.scopes)?graph.scopes.map(scope=>String(scope).trim()).filter(Boolean):[];if(graph.ok===!1)lines.push(`Graph: ${theme.error(graph.error??`failed`)}`);else if(roles.length>0||scopes.length>0){let formatPermission=permission=>{let hint=TEAMS_GRAPH_PERMISSION_HINTS[permission];return hint?`${permission} (${hint})`:permission};roles.length>0&&lines.push(`Graph roles: ${roles.map(formatPermission).join(`, `)}`),scopes.length>0&&lines.push(`Graph scopes: ${scopes.map(formatPermission).join(`, `)}`)}else graph.ok===!0&&lines.push(`Graph: ok`)}}let ok=typeof probeObj.ok==`boolean`?probeObj.ok:void 0;if(ok===!0&&lines.length===0&&lines.push(`Probe: ok`),ok===!1){let error=typeof probeObj.error==`string`&&probeObj.error?` (${probeObj.error})`:``;lines.push(`Probe: ${theme.error(`failed${error}`)}`)}return lines}async function buildDiscordPermissions(params){let target=summarizeDiscordTarget(params.target?.trim());if(!target)return{};if(target.kind!==`channel`||!target.channelId)return{target,report:{error:`Target looks like a DM user; pass channel:<id> to audit channel permissions.`}};let token=params.account.token?.trim();if(!token)return{target,report:{channelId:target.channelId,error:`Discord bot token missing for permission audit.`}};try{let perms=await fetchChannelPermissionsDiscord(target.channelId,{token,accountId:params.account.accountId??void 0}),missing=REQUIRED_DISCORD_PERMISSIONS.filter(permission=>!perms.permissions.includes(permission));return{target,report:{channelId:perms.channelId,guildId:perms.guildId,isDm:perms.isDm,channelType:perms.channelType,permissions:perms.permissions,missingRequired:missing.length?missing:[],raw:perms.raw}}}catch(err){return{target,report:{channelId:target.channelId,error:err instanceof Error?err.message:String(err)}}}}async function resolveChannelReports(params){let{plugin,cfg,timeoutMs}=params,accountIds=params.accountOverride?[params.accountOverride]:(()=>{let ids=plugin.config.listAccountIds(cfg);return ids.length>0?ids:[resolveChannelDefaultAccountId({plugin,cfg,accountIds:ids})]})(),reports=[],listedActions=plugin.actions?.listActions?.({cfg})??[],actions=Array.from(new Set([`send`,`broadcast`,...listedActions.map(action=>String(action))]));for(let accountId of accountIds){let resolvedAccount=plugin.config.resolveAccount(cfg,accountId),configured=plugin.config.isConfigured?await plugin.config.isConfigured(resolvedAccount,cfg):!!resolvedAccount,enabled=plugin.config.isEnabled?plugin.config.isEnabled(resolvedAccount,cfg):resolvedAccount.enabled!==!1,probe;if(configured&&enabled&&plugin.status?.probeAccount)try{probe=await plugin.status.probeAccount({account:resolvedAccount,timeoutMs,cfg})}catch(err){probe={ok:!1,error:err instanceof Error?err.message:String(err)}}let slackScopes;if(plugin.id===`slack`&&configured&&enabled){let botToken=resolvedAccount.botToken?.trim(),userToken=resolvedAccount.config?.userToken?.trim(),scopeReports=[];botToken?scopeReports.push({tokenType:`bot`,result:await fetchSlackScopes(botToken,timeoutMs)}):scopeReports.push({tokenType:`bot`,result:{ok:!1,error:`Slack bot token missing.`}}),userToken&&scopeReports.push({tokenType:`user`,result:await fetchSlackScopes(userToken,timeoutMs)}),slackScopes=scopeReports}let discordTarget,discordPermissions;if(plugin.id===`discord`&&params.target){let perms=await buildDiscordPermissions({account:resolvedAccount,target:params.target});discordTarget=perms.target,discordPermissions=perms.report}reports.push({channel:plugin.id,accountId,accountName:typeof resolvedAccount.name==`string`&&resolvedAccount.name?.trim()||void 0,configured,enabled,support:plugin.capabilities,probe,target:discordTarget,channelPermissions:discordPermissions,actions,slackScopes})}return reports}async function channelsCapabilitiesCommand(opts,runtime=defaultRuntime){let cfg=await requireValidConfig(runtime);if(!cfg)return;let timeoutMs=normalizeTimeout(opts.timeout,1e4),rawChannel=typeof opts.channel==`string`?opts.channel.trim().toLowerCase():``,rawTarget=typeof opts.target==`string`?opts.target.trim():``;if(opts.account&&(!rawChannel||rawChannel===`all`)){runtime.error(danger(`--account requires a specific --channel.`)),runtime.exit(1);return}if(rawTarget&&rawChannel!==`discord`){runtime.error(danger(`--target requires --channel discord.`)),runtime.exit(1);return}let plugins=listChannelPlugins(),selected=!rawChannel||rawChannel===`all`?plugins:(()=>{let plugin=getChannelPlugin(rawChannel);return plugin?[plugin]:null})();if(!selected||selected.length===0){runtime.error(danger(`Unknown channel "${rawChannel}".`)),runtime.exit(1);return}let reports=[];for(let plugin of selected){let accountOverride=opts.account?.trim()||void 0;reports.push(...await resolveChannelReports({plugin,cfg,timeoutMs,accountOverride,target:rawTarget&&plugin.id===`discord`?rawTarget:void 0}))}if(opts.json){runtime.log(JSON.stringify({channels:reports},null,2));return}let lines=[];for(let report of reports){let label=formatChannelAccountLabel({channel:report.channel,accountId:report.accountId,name:report.accountName,channelStyle:theme.accent,accountStyle:theme.heading});if(lines.push(theme.heading(label)),lines.push(`Support: ${formatSupport(report.support)}`),report.actions&&report.actions.length>0&&lines.push(`Actions: ${report.actions.join(`, `)}`),report.configured===!1||report.enabled===!1){let configuredLabel=report.configured===!1?`not configured`:`configured`,enabledLabel=report.enabled===!1?`disabled`:`enabled`;lines.push(`Status: ${configuredLabel}, ${enabledLabel}`)}let probeLines=formatProbeLines(report.channel,report.probe);if(probeLines.length>0?lines.push(...probeLines):report.configured&&report.enabled&&lines.push(theme.muted(`Probe: unavailable`)),report.channel===`slack`&&report.slackScopes)for(let entry of report.slackScopes){let source=entry.result.source?` (${entry.result.source})`:``,label=entry.tokenType===`user`?`User scopes`:`Bot scopes`;entry.result.ok&&entry.result.scopes?.length?lines.push(`${label}${source}: ${entry.result.scopes.join(`, `)}`):entry.result.error&&lines.push(`${label}: ${theme.error(entry.result.error)}`)}if(report.channel===`discord`&&report.channelPermissions){let perms=report.channelPermissions;if(perms.error)lines.push(`Permissions: ${theme.error(perms.error)}`);else{let list=perms.permissions?.length?perms.permissions.join(`, `):`none`,label=perms.channelId?` (${perms.channelId})`:``;lines.push(`Permissions${label}: ${list}`),perms.missingRequired&&perms.missingRequired.length>0?lines.push(`${theme.warn(`Missing required:`)} ${perms.missingRequired.join(`, `)}`):lines.push(theme.success(`Missing required: none`))}}else report.channel===`discord`&&rawTarget&&!report.channelPermissions&&lines.push(theme.muted(`Permissions: skipped (no target).`));lines.push(``)}runtime.log(lines.join(`
1
+ import"./paths-BHg-VHB4.js";import{r as DEFAULT_CHAT_CHANNEL}from"./registry-Cv7CoWAs.js";import{D as danger,N as setVerbose,W as getResolvedLoggerSettings,d as isRecord,z as theme}from"./utils-BP60e80M.js";import{p as defaultRuntime}from"./subsystem-C4b1Von0.js";import"./boolean-ssGoaBPk.js";import"./env-BoE8QSib.js";import"./warning-filter-nSTjpMIH.js";import{x as loadAuthProfileStore}from"./auth-profiles-BARnVAUE.js";import{t as formatCliCommand}from"./command-format-DTMaGKs7.js";import"./logger-AbH8mdkv.js";import{n as DEFAULT_ACCOUNT_ID,u as normalizeAccountId}from"./session-key-D--2AEus.js";import"./builderforce-root-D3-p8W2n.js";import"./exec-CGuYALEs.js";import{c as resolveAgentWorkspaceDir,l as resolveDefaultAgentId}from"./agent-scope-BcoQBOwz.js";import"./env-file-BIKVpYUN.js";import{a as readConfigFileSnapshot,c as writeConfigFile,r as loadConfig}from"./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{n as callGateway}from"./call-CjC3SRPv.js";import"./message-channel-C-yw5fZm.js";import{T as deleteTelegramUpdateOffset}from"./subagent-registry-BUKplZi1.js";import"./sessions-ko0LxxGk.js";import"./src-BM8G-tIl.js";import"./project-context-store-BSIWJD6S.js";import"./tokens-BNwTTeJb.js";import{l as resolveTelegramAccount,n as listChannelPlugins,r as normalizeChannelId,t as getChannelPlugin}from"./plugins-DJGW_fnS.js";import"./accounts-Z5bJpNrG.js";import"./bindings-D0uket3l.js";import{r as createSlackWebClient}from"./send-gG3CFJwv.js";import{Q as fetchChannelPermissionsDiscord,tt as parseDiscordTarget}from"./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{n as formatTimeAgo}from"./format-relative-CI0FaTqw.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{n as formatUsageReportLines,t as loadProviderUsageSummary}from"./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{n as resolveMessageChannelSelection}from"./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{t as formatDocsLink}from"./links-B6LU5cXN.js";import{n as runCommandWithRuntime}from"./cli-utils-ByV85M53.js";import{t as formatHelpExamples}from"./help-format-DIDk_7gh.js";import{n as withProgress}from"./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 hasExplicitOptions}from"./command-options-I0sHK97L.js";import{r as listChannelPluginCatalogEntries}from"./catalog-CEJqw4s-.js";import"./note-BvXfFmlu.js";import{t as createClackPrompter}from"./clack-prompter-ZmHdfPGJ.js";import{t as resolveChannelDefaultAccountId}from"./helpers-DDS6DSK4.js";import"./plugin-auto-enable-tSxWjjZC.js";import"./install-safe-path-BxCb3BJW.js";import"./npm-registry-spec-DXx5hKYJ.js";import"./skill-scanner-YCbLEfNS.js";import"./installs-BBKikcCJ.js";import{i as reloadOnboardingPluginRegistry,n as setupChannels,r as ensureOnboardingPluginInstalled}from"./onboard-channels-V51s9X-h.js";import{t as requireValidConfigSnapshot}from"./config-validation-BSOxA3Lt.js";import{t as buildChannelAccountSnapshot}from"./status-B3YnmG0_.js";import{t as parseLogLine}from"./parse-log-line-21Z5mz37.js";import{t as collectChannelStatusIssues}from"./channels-status-issues-DLF6QGGM.js";import"./plugin-registry-BM1-sG-e.js";import{t as formatCliChannelOptions}from"./channel-options-xVK4amr4.js";import fs from"node:fs/promises";function applyAccountName(params){let accountId=normalizeAccountId(params.accountId),apply=getChannelPlugin(params.channel)?.setup?.applyAccountName;return apply?apply({cfg:params.cfg,accountId,name:params.name}):params.cfg}function applyChannelAccountConfig(params){let accountId=normalizeAccountId(params.accountId),apply=getChannelPlugin(params.channel)?.setup?.applyAccountConfig;return apply?apply({cfg:params.cfg,accountId,input:params.input}):params.cfg}async function requireValidConfig(runtime=defaultRuntime){return await requireValidConfigSnapshot(runtime)}function formatAccountLabel(params){let base=params.accountId||DEFAULT_ACCOUNT_ID;return params.name?.trim()?`${base} (${params.name.trim()})`:base}const channelLabel=channel=>getChannelPlugin(channel)?.meta.label??channel;function formatChannelAccountLabel(params){let channelText=channelLabel(params.channel),accountText=formatAccountLabel({accountId:params.accountId,name:params.name});return`${params.channelStyle?params.channelStyle(channelText):channelText} ${params.accountStyle?params.accountStyle(accountText):accountText}`}function shouldUseWizard(params){return params?.hasFlags===!1}function parseList(value){if(!value?.trim())return;let parsed=value.split(/[\n,;]+/g).map(entry=>entry.trim()).filter(Boolean);return parsed.length>0?parsed:void 0}function resolveCatalogChannelEntry(raw,cfg){let trimmed=raw.trim().toLowerCase();if(trimmed)return listChannelPluginCatalogEntries({workspaceDir:cfg?resolveAgentWorkspaceDir(cfg,resolveDefaultAgentId(cfg)):void 0}).find(entry=>entry.id.toLowerCase()===trimmed?!0:(entry.meta.aliases??[]).some(alias=>alias.trim().toLowerCase()===trimmed))}async function channelsAddCommand(opts,runtime=defaultRuntime,params){let cfg=await requireValidConfig(runtime);if(!cfg)return;let nextConfig=cfg;if(shouldUseWizard(params)){let prompter=createClackPrompter(),selection=[],accountIds={};await prompter.intro(`Channel setup`);let nextConfig=await setupChannels(cfg,runtime,prompter,{allowDisable:!1,allowSignalInstall:!0,promptAccountIds:!0,onSelection:value=>{selection=value},onAccountId:(channel,accountId)=>{accountIds[channel]=accountId}});if(selection.length===0){await prompter.outro(`No channels selected.`);return}if(await prompter.confirm({message:`Add display names for these accounts? (optional)`,initialValue:!1}))for(let channel of selection){let accountId=accountIds[channel]??DEFAULT_ACCOUNT_ID,plugin=getChannelPlugin(channel),account=plugin?.config.resolveAccount(nextConfig,accountId),existingName=plugin?.config.describeAccount?.(account,nextConfig)?.name??account?.name,name=await prompter.text({message:`${channel} account name (${accountId})`,initialValue:existingName});name?.trim()&&(nextConfig=applyAccountName({cfg:nextConfig,channel,accountId,name}))}await writeConfigFile(nextConfig),await prompter.outro(`Channels updated.`);return}let rawChannel=String(opts.channel??``),channel=normalizeChannelId(rawChannel),catalogEntry=channel?void 0:resolveCatalogChannelEntry(rawChannel,nextConfig);if(!channel&&catalogEntry){let prompter=createClackPrompter(),workspaceDir=resolveAgentWorkspaceDir(nextConfig,resolveDefaultAgentId(nextConfig)),result=await ensureOnboardingPluginInstalled({cfg:nextConfig,entry:catalogEntry,prompter,runtime,workspaceDir});if(nextConfig=result.cfg,!result.installed)return;reloadOnboardingPluginRegistry({cfg:nextConfig,runtime,workspaceDir}),channel=normalizeChannelId(catalogEntry.id)??catalogEntry.id}if(!channel){let hint=catalogEntry?`Plugin ${catalogEntry.meta.label} could not be loaded after install.`:`Unknown channel: ${String(opts.channel??``)}`;runtime.error(hint),runtime.exit(1);return}let plugin=getChannelPlugin(channel);if(!plugin?.setup?.applyAccountConfig){runtime.error(`Channel ${channel} does not support add.`),runtime.exit(1);return}let accountId=plugin.setup.resolveAccountId?.({cfg:nextConfig,accountId:opts.account})??normalizeAccountId(opts.account),useEnv=opts.useEnv===!0,initialSyncLimit=typeof opts.initialSyncLimit==`number`?opts.initialSyncLimit:typeof opts.initialSyncLimit==`string`&&opts.initialSyncLimit.trim()?Number.parseInt(opts.initialSyncLimit,10):void 0,groupChannels=parseList(opts.groupChannels),dmAllowlist=parseList(opts.dmAllowlist),input={name:opts.name,token:opts.token,tokenFile:opts.tokenFile,botToken:opts.botToken,appToken:opts.appToken,signalNumber:opts.signalNumber,cliPath:opts.cliPath,dbPath:opts.dbPath,service:opts.service,region:opts.region,authDir:opts.authDir,httpUrl:opts.httpUrl,httpHost:opts.httpHost,httpPort:opts.httpPort,webhookPath:opts.webhookPath,webhookUrl:opts.webhookUrl,audienceType:opts.audienceType,audience:opts.audience,homeserver:opts.homeserver,userId:opts.userId,accessToken:opts.accessToken,password:opts.password,deviceName:opts.deviceName,initialSyncLimit,useEnv,ship:opts.ship,url:opts.url,code:opts.code,groupChannels,dmAllowlist,autoDiscoverChannels:opts.autoDiscoverChannels},validationError=plugin.setup.validateInput?.({cfg:nextConfig,accountId,input});if(validationError){runtime.error(validationError),runtime.exit(1);return}let previousTelegramToken=channel===`telegram`?resolveTelegramAccount({cfg:nextConfig,accountId}).token.trim():``;nextConfig=applyChannelAccountConfig({cfg:nextConfig,channel,accountId,input}),channel===`telegram`&&previousTelegramToken!==resolveTelegramAccount({cfg:nextConfig,accountId}).token.trim()&&await deleteTelegramUpdateOffset({accountId}),await writeConfigFile(nextConfig),runtime.log(`Added ${channelLabel(channel)} account "${accountId}".`)}function collectScopes(value,into){if(value){if(Array.isArray(value)){for(let entry of value)typeof entry==`string`&&entry.trim()&&into.push(entry.trim());return}if(typeof value==`string`){let raw=value.trim();if(!raw)return;let parts=raw.split(/[,\s]+/).map(part=>part.trim());for(let part of parts)part&&into.push(part);return}if(isRecord(value))for(let entry of Object.values(value))(Array.isArray(entry)||typeof entry==`string`)&&collectScopes(entry,into)}}function normalizeScopes(scopes){return Array.from(new Set(scopes.map(scope=>scope.trim()).filter(Boolean))).toSorted()}function extractScopes(payload){if(!isRecord(payload))return[];let scopes=[];return collectScopes(payload.scopes,scopes),collectScopes(payload.scope,scopes),isRecord(payload.info)&&(collectScopes(payload.info.scopes,scopes),collectScopes(payload.info.scope,scopes),collectScopes(payload.info.user_scopes,scopes),collectScopes(payload.info.bot_scopes,scopes)),normalizeScopes(scopes)}function readError(payload){if(!isRecord(payload))return;let error=payload.error;return typeof error==`string`&&error.trim()?error.trim():void 0}async function callSlack(client,method){try{let result=await client.apiCall(method);return isRecord(result)?result:null}catch(err){return{ok:!1,error:err instanceof Error?err.message:String(err)}}}async function fetchSlackScopes(token,timeoutMs){let client=createSlackWebClient(token,{timeout:timeoutMs}),attempts=[`auth.scopes`,`apps.permissions.info`],errors=[];for(let method of attempts){let result=await callSlack(client,method),scopes=extractScopes(result);if(scopes.length>0)return{ok:!0,scopes,source:method};let error=readError(result);error&&errors.push(`${method}: ${error}`)}return{ok:!1,error:errors.length>0?errors.join(` | `):`no scopes returned`}}const REQUIRED_DISCORD_PERMISSIONS=[`ViewChannel`,`SendMessages`],TEAMS_GRAPH_PERMISSION_HINTS={"ChannelMessage.Read.All":`channel history`,"Chat.Read.All":`chat history`,"Channel.ReadBasic.All":`channel list`,"Team.ReadBasic.All":`team list`,"TeamsActivity.Read.All":`teams activity`,"Sites.Read.All":`files (SharePoint)`,"Files.Read.All":`files (OneDrive)`};function normalizeTimeout(raw,fallback=1e4){let value=Number(raw);return!Number.isFinite(value)||value<=0?fallback:value}function formatSupport(capabilities){if(!capabilities)return`unknown`;let bits=[];return capabilities.chatTypes?.length&&bits.push(`chatTypes=${capabilities.chatTypes.join(`,`)}`),capabilities.polls&&bits.push(`polls`),capabilities.reactions&&bits.push(`reactions`),capabilities.edit&&bits.push(`edit`),capabilities.unsend&&bits.push(`unsend`),capabilities.reply&&bits.push(`reply`),capabilities.effects&&bits.push(`effects`),capabilities.groupManagement&&bits.push(`groupManagement`),capabilities.threads&&bits.push(`threads`),capabilities.media&&bits.push(`media`),capabilities.nativeCommands&&bits.push(`nativeCommands`),capabilities.blockStreaming&&bits.push(`blockStreaming`),bits.length?bits.join(` `):`none`}function summarizeDiscordTarget(raw){if(!raw)return;let target=parseDiscordTarget(raw,{defaultKind:`channel`});return target?target.kind===`channel`?{raw,normalized:target.normalized,kind:`channel`,channelId:target.id}:target.kind===`user`?{raw,normalized:target.normalized,kind:`user`}:{raw,normalized:target.normalized}:{raw}}function formatDiscordIntents(intents){return intents?[`messageContent=${intents.messageContent??`unknown`}`,`guildMembers=${intents.guildMembers??`unknown`}`,`presence=${intents.presence??`unknown`}`].join(` `):`unknown`}function formatProbeLines(channelId,probe){let lines=[];if(!probe||typeof probe!=`object`)return lines;let probeObj=probe;if(channelId===`discord`){let bot=probeObj.bot;if(bot?.username){let botId=bot.id?` (${bot.id})`:``;lines.push(`Bot: ${theme.accent(`@${bot.username}`)}${botId}`)}let app=probeObj.application;app?.intents&&lines.push(`Intents: ${formatDiscordIntents(app.intents)}`)}if(channelId===`telegram`){let bot=probeObj.bot;if(bot?.username){let botId=bot.id?` (${bot.id})`:``;lines.push(`Bot: ${theme.accent(`@${bot.username}`)}${botId}`)}let flags=[],canJoinGroups=bot?.canJoinGroups,canReadAll=bot?.canReadAllGroupMessages,inlineQueries=bot?.supportsInlineQueries;typeof canJoinGroups==`boolean`&&flags.push(`joinGroups=${canJoinGroups}`),typeof canReadAll==`boolean`&&flags.push(`readAllGroupMessages=${canReadAll}`),typeof inlineQueries==`boolean`&&flags.push(`inlineQueries=${inlineQueries}`),flags.length>0&&lines.push(`Flags: ${flags.join(` `)}`);let webhook=probeObj.webhook;webhook?.url!==void 0&&lines.push(`Webhook: ${webhook.url||`none`}`)}if(channelId===`slack`){let bot=probeObj.bot,team=probeObj.team;if(bot?.name&&lines.push(`Bot: ${theme.accent(`@${bot.name}`)}`),team?.name||team?.id){let id=team?.id?` (${team.id})`:``;lines.push(`Team: ${team?.name??`unknown`}${id}`)}}if(channelId===`signal`){let version=probeObj.version;version&&lines.push(`Signal daemon: ${version}`)}if(channelId===`msteams`){let appId=typeof probeObj.appId==`string`?probeObj.appId.trim():``;appId&&lines.push(`App: ${theme.accent(appId)}`);let graph=probeObj.graph;if(graph){let roles=Array.isArray(graph.roles)?graph.roles.map(role=>String(role).trim()).filter(Boolean):[],scopes=typeof graph.scopes==`string`?graph.scopes.split(/\s+/).map(scope=>scope.trim()).filter(Boolean):Array.isArray(graph.scopes)?graph.scopes.map(scope=>String(scope).trim()).filter(Boolean):[];if(graph.ok===!1)lines.push(`Graph: ${theme.error(graph.error??`failed`)}`);else if(roles.length>0||scopes.length>0){let formatPermission=permission=>{let hint=TEAMS_GRAPH_PERMISSION_HINTS[permission];return hint?`${permission} (${hint})`:permission};roles.length>0&&lines.push(`Graph roles: ${roles.map(formatPermission).join(`, `)}`),scopes.length>0&&lines.push(`Graph scopes: ${scopes.map(formatPermission).join(`, `)}`)}else graph.ok===!0&&lines.push(`Graph: ok`)}}let ok=typeof probeObj.ok==`boolean`?probeObj.ok:void 0;if(ok===!0&&lines.length===0&&lines.push(`Probe: ok`),ok===!1){let error=typeof probeObj.error==`string`&&probeObj.error?` (${probeObj.error})`:``;lines.push(`Probe: ${theme.error(`failed${error}`)}`)}return lines}async function buildDiscordPermissions(params){let target=summarizeDiscordTarget(params.target?.trim());if(!target)return{};if(target.kind!==`channel`||!target.channelId)return{target,report:{error:`Target looks like a DM user; pass channel:<id> to audit channel permissions.`}};let token=params.account.token?.trim();if(!token)return{target,report:{channelId:target.channelId,error:`Discord bot token missing for permission audit.`}};try{let perms=await fetchChannelPermissionsDiscord(target.channelId,{token,accountId:params.account.accountId??void 0}),missing=REQUIRED_DISCORD_PERMISSIONS.filter(permission=>!perms.permissions.includes(permission));return{target,report:{channelId:perms.channelId,guildId:perms.guildId,isDm:perms.isDm,channelType:perms.channelType,permissions:perms.permissions,missingRequired:missing.length?missing:[],raw:perms.raw}}}catch(err){return{target,report:{channelId:target.channelId,error:err instanceof Error?err.message:String(err)}}}}async function resolveChannelReports(params){let{plugin,cfg,timeoutMs}=params,accountIds=params.accountOverride?[params.accountOverride]:(()=>{let ids=plugin.config.listAccountIds(cfg);return ids.length>0?ids:[resolveChannelDefaultAccountId({plugin,cfg,accountIds:ids})]})(),reports=[],listedActions=plugin.actions?.listActions?.({cfg})??[],actions=Array.from(new Set([`send`,`broadcast`,...listedActions.map(action=>String(action))]));for(let accountId of accountIds){let resolvedAccount=plugin.config.resolveAccount(cfg,accountId),configured=plugin.config.isConfigured?await plugin.config.isConfigured(resolvedAccount,cfg):!!resolvedAccount,enabled=plugin.config.isEnabled?plugin.config.isEnabled(resolvedAccount,cfg):resolvedAccount.enabled!==!1,probe;if(configured&&enabled&&plugin.status?.probeAccount)try{probe=await plugin.status.probeAccount({account:resolvedAccount,timeoutMs,cfg})}catch(err){probe={ok:!1,error:err instanceof Error?err.message:String(err)}}let slackScopes;if(plugin.id===`slack`&&configured&&enabled){let botToken=resolvedAccount.botToken?.trim(),userToken=resolvedAccount.config?.userToken?.trim(),scopeReports=[];botToken?scopeReports.push({tokenType:`bot`,result:await fetchSlackScopes(botToken,timeoutMs)}):scopeReports.push({tokenType:`bot`,result:{ok:!1,error:`Slack bot token missing.`}}),userToken&&scopeReports.push({tokenType:`user`,result:await fetchSlackScopes(userToken,timeoutMs)}),slackScopes=scopeReports}let discordTarget,discordPermissions;if(plugin.id===`discord`&&params.target){let perms=await buildDiscordPermissions({account:resolvedAccount,target:params.target});discordTarget=perms.target,discordPermissions=perms.report}reports.push({channel:plugin.id,accountId,accountName:typeof resolvedAccount.name==`string`&&resolvedAccount.name?.trim()||void 0,configured,enabled,support:plugin.capabilities,probe,target:discordTarget,channelPermissions:discordPermissions,actions,slackScopes})}return reports}async function channelsCapabilitiesCommand(opts,runtime=defaultRuntime){let cfg=await requireValidConfig(runtime);if(!cfg)return;let timeoutMs=normalizeTimeout(opts.timeout,1e4),rawChannel=typeof opts.channel==`string`?opts.channel.trim().toLowerCase():``,rawTarget=typeof opts.target==`string`?opts.target.trim():``;if(opts.account&&(!rawChannel||rawChannel===`all`)){runtime.error(danger(`--account requires a specific --channel.`)),runtime.exit(1);return}if(rawTarget&&rawChannel!==`discord`){runtime.error(danger(`--target requires --channel discord.`)),runtime.exit(1);return}let plugins=listChannelPlugins(),selected=!rawChannel||rawChannel===`all`?plugins:(()=>{let plugin=getChannelPlugin(rawChannel);return plugin?[plugin]:null})();if(!selected||selected.length===0){runtime.error(danger(`Unknown channel "${rawChannel}".`)),runtime.exit(1);return}let reports=[];for(let plugin of selected){let accountOverride=opts.account?.trim()||void 0;reports.push(...await resolveChannelReports({plugin,cfg,timeoutMs,accountOverride,target:rawTarget&&plugin.id===`discord`?rawTarget:void 0}))}if(opts.json){runtime.log(JSON.stringify({channels:reports},null,2));return}let lines=[];for(let report of reports){let label=formatChannelAccountLabel({channel:report.channel,accountId:report.accountId,name:report.accountName,channelStyle:theme.accent,accountStyle:theme.heading});if(lines.push(theme.heading(label)),lines.push(`Support: ${formatSupport(report.support)}`),report.actions&&report.actions.length>0&&lines.push(`Actions: ${report.actions.join(`, `)}`),report.configured===!1||report.enabled===!1){let configuredLabel=report.configured===!1?`not configured`:`configured`,enabledLabel=report.enabled===!1?`disabled`:`enabled`;lines.push(`Status: ${configuredLabel}, ${enabledLabel}`)}let probeLines=formatProbeLines(report.channel,report.probe);if(probeLines.length>0?lines.push(...probeLines):report.configured&&report.enabled&&lines.push(theme.muted(`Probe: unavailable`)),report.channel===`slack`&&report.slackScopes)for(let entry of report.slackScopes){let source=entry.result.source?` (${entry.result.source})`:``,label=entry.tokenType===`user`?`User scopes`:`Bot scopes`;entry.result.ok&&entry.result.scopes?.length?lines.push(`${label}${source}: ${entry.result.scopes.join(`, `)}`):entry.result.error&&lines.push(`${label}: ${theme.error(entry.result.error)}`)}if(report.channel===`discord`&&report.channelPermissions){let perms=report.channelPermissions;if(perms.error)lines.push(`Permissions: ${theme.error(perms.error)}`);else{let list=perms.permissions?.length?perms.permissions.join(`, `):`none`,label=perms.channelId?` (${perms.channelId})`:``;lines.push(`Permissions${label}: ${list}`),perms.missingRequired&&perms.missingRequired.length>0?lines.push(`${theme.warn(`Missing required:`)} ${perms.missingRequired.join(`, `)}`):lines.push(theme.success(`Missing required: none`))}}else report.channel===`discord`&&rawTarget&&!report.channelPermissions&&lines.push(theme.muted(`Permissions: skipped (no target).`));lines.push(``)}runtime.log(lines.join(`
2
2
  `).trimEnd())}const colorValue=value=>value===`none`?theme.error(value):value===`env`?theme.accent(value):theme.success(value);function formatEnabled(value){return value===!1?theme.error(`disabled`):theme.success(`enabled`)}function formatConfigured(value){return value?theme.success(`configured`):theme.warn(`not configured`)}function formatTokenSource(source){return`token=${colorValue(source||`none`)}`}function formatSource(label,source){return`${label}=${colorValue(source||`none`)}`}function formatLinked(value){return value?theme.success(`linked`):theme.warn(`not linked`)}function shouldShowConfigured(channel){return channel.meta.showConfigured!==!1}function formatAccountLine(params){let{channel,snapshot}=params,label=formatChannelAccountLabel({channel:channel.id,accountId:snapshot.accountId,name:snapshot.name,channelStyle:theme.accent,accountStyle:theme.heading}),bits=[];return snapshot.linked!==void 0&&bits.push(formatLinked(snapshot.linked)),shouldShowConfigured(channel)&&typeof snapshot.configured==`boolean`&&bits.push(formatConfigured(snapshot.configured)),snapshot.tokenSource&&bits.push(formatTokenSource(snapshot.tokenSource)),snapshot.botTokenSource&&bits.push(formatSource(`bot`,snapshot.botTokenSource)),snapshot.appTokenSource&&bits.push(formatSource(`app`,snapshot.appTokenSource)),snapshot.baseUrl&&bits.push(`base=${theme.muted(snapshot.baseUrl)}`),typeof snapshot.enabled==`boolean`&&bits.push(formatEnabled(snapshot.enabled)),`- ${label}: ${bits.join(`, `)}`}async function loadUsageWithProgress(runtime){try{return await withProgress({label:`Fetching usage snapshot…`,indeterminate:!0,enabled:!0},async()=>await loadProviderUsageSummary())}catch(err){return runtime.error(String(err)),null}}async function channelsListCommand(opts,runtime=defaultRuntime){let cfg=await requireValidConfig(runtime);if(!cfg)return;let includeUsage=opts.usage!==!1,plugins=listChannelPlugins(),authStore=await loadAuthProfileStore(),authProfiles=Object.entries(authStore.profiles).map(([profileId,profile])=>({id:profileId,provider:profile.provider,type:profile.type,isExternal:!1}));if(opts.json){let usage=includeUsage?await loadProviderUsageSummary():void 0,chat={};for(let plugin of plugins)chat[plugin.id]=plugin.config.listAccountIds(cfg);let payload={chat,auth:authProfiles,...usage?{usage}:{}};runtime.log(JSON.stringify(payload,null,2));return}let lines=[];lines.push(theme.heading(`Chat channels:`));for(let plugin of plugins){let accounts=plugin.config.listAccountIds(cfg);if(!(!accounts||accounts.length===0))for(let accountId of accounts){let snapshot=await buildChannelAccountSnapshot({plugin,cfg,accountId});lines.push(formatAccountLine({channel:plugin,snapshot}))}}if(lines.push(``),lines.push(theme.heading(`Auth providers (OAuth + API keys):`)),authProfiles.length===0)lines.push(theme.muted(`- none`));else for(let profile of authProfiles){let external=profile.isExternal?theme.muted(` (synced)`):``;lines.push(`- ${theme.accent(profile.id)} (${theme.success(profile.type)}${external})`)}if(runtime.log(lines.join(`
3
3
  `)),includeUsage){runtime.log(``);let usage=await loadUsageWithProgress(runtime);if(usage){let usageLines=formatUsageReportLines(usage);usageLines.length>0&&(usageLines[0]=theme.accent(usageLines[0]),runtime.log(usageLines.join(`
4
4
  `)))}}runtime.log(``),runtime.log(`Docs: ${formatDocsLink(`/gateway/configuration`,`gateway/configuration`)}`)}const getChannelSet=()=>new Set([...listChannelPlugins().map(plugin=>plugin.id),`all`]);function parseChannelFilter(raw){let trimmed=raw?.trim().toLowerCase();return trimmed&&getChannelSet().has(trimmed)?trimmed:`all`}function matchesChannel(line,channel){if(channel===`all`)return!0;let needle=`gateway/channels/${channel}`;return!!(line.subsystem?.includes(needle)||line.module?.includes(channel))}async function readTailLines(file,limit){let stat=await fs.stat(file).catch(()=>null);if(!stat)return[];let size=stat.size,start=Math.max(0,size-1e6),handle=await fs.open(file,`r`);try{let length=Math.max(0,size-start);if(length===0)return[];let buffer=Buffer.alloc(length),readResult=await handle.read(buffer,0,length,start),lines=buffer.toString(`utf8`,0,readResult.bytesRead).split(`