activeclaw 2026.2.11 → 2026.2.13

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 (531) hide show
  1. package/CHANGELOG.md +106 -0
  2. package/dist/{accounts-DbzMEfKN.js → accounts-DCDeFTra.js} +2 -2
  3. package/dist/{accounts-C2elk6PC.js → accounts-DeqIQjo1.js} +2 -2
  4. package/dist/{acp-cli-CVFTdsQY.js → acp-cli-CeYI4XRd.js} +15 -16
  5. package/dist/{acp-cli-BpJwIyLl.js → acp-cli-rNbGXICg.js} +14 -15
  6. package/dist/{agent-Bz1r5O8q.js → agent-BvNJF5QL.js} +19 -15
  7. package/dist/{agent-22-R4bNS.js → agent-CyMxTyrG.js} +20 -16
  8. package/dist/{agent-scope-D8miw9q_.js → agent-scope-BIEhVP4_.js} +172 -4
  9. package/dist/{agent-scope-CGmuusG9.js → agent-scope-CQCus0rI.js} +3 -3
  10. package/dist/{agent-scope-DQuy3dwI.js → agent-scope-CsRbLH4l.js} +4 -4
  11. package/dist/{agent-scope-BEf5crnU.js → agent-scope-DPIFau3f.js} +5 -1
  12. package/dist/audio-preflight-BU8W7uxc.js +60 -0
  13. package/dist/audio-preflight-CGsumMzb.js +60 -0
  14. package/dist/audio-preflight-SLmkJI6-.js +74 -0
  15. package/dist/audio-preflight-jZc5mFCZ.js +71 -0
  16. package/dist/{audit-C4wLaF0D.js → audit-Dmww_503.js} +71 -19
  17. package/dist/{audit-CY-yopxa.js → audit-wPu26VMb.js} +72 -20
  18. package/dist/{tailscale-DU6DgqVy.js → auth-9x3lqfIY.js} +208 -3
  19. package/dist/{tailscale-Cu-2HNvU.js → auth-CQNl_IaI.js} +190 -3
  20. package/dist/{auth-health-BFKUoCwJ.js → auth-health-C4L4FGBA.js} +1 -1
  21. package/dist/{auth-health-d7BMZlWG.js → auth-health-j6epgQbq.js} +1 -1
  22. package/dist/{auth-profiles-Bv1AEm-Y.js → auth-profiles-ByNs3eEm.js} +87 -31
  23. package/dist/build-info.json +3 -3
  24. package/dist/bundled/boot-md/handler.js +28 -22
  25. package/dist/bundled/session-memory/handler.js +33 -22
  26. package/dist/{call-7yrB6v4I.js → call-DVYCIV8m.js} +5 -5
  27. package/dist/{call-Bek1xlgk.js → call-SolyGS1r.js} +6 -6
  28. package/dist/canvas-host/a2ui/.bundle.hash +1 -1
  29. package/dist/{channel-options-3mdYN0C_.js → channel-options-BwC2yQcR.js} +4 -4
  30. package/dist/{channel-options-DJ0b1m7B.js → channel-options-Cq9BVDkP.js} +12 -7
  31. package/dist/{channel-selection-RZimme3j.js → channel-selection-D4D6ImhN.js} +2 -2
  32. package/dist/{channel-selection-B9b7Kuit.js → channel-selection-MZAHm4U8.js} +2 -2
  33. package/dist/{channels-cli-CYbK2Dku.js → channels-cli-9Dsk9Qm7.js} +57 -53
  34. package/dist/{channels-cli-BFznbGOs.js → channels-cli-BJUppQll.js} +59 -55
  35. package/dist/{channels-status-issues-B3KkflfR.js → channels-status-issues-D7GSV1GS.js} +1 -1
  36. package/dist/{channels-status-issues-DQkRaZts.js → channels-status-issues-DDAWeT-6.js} +1 -1
  37. package/dist/{chrome-Db7w64LF.js → chrome-BfB6JdKF.js} +4 -4
  38. package/dist/{chrome-Dm-EgOjJ.js → chrome-Cvr-57lg.js} +6 -5
  39. package/dist/{chrome-CF16STk9.js → chrome-DL0avO8n.js} +2 -1
  40. package/dist/{chrome-yIKmOzCO.js → chrome-foEwx3lN.js} +5 -4
  41. package/dist/{clack-prompter-BCiBkJVr.js → clack-prompter-Bz3Mmcl-.js} +5 -5
  42. package/dist/{clack-prompter-DuBVnTKy.js → clack-prompter-ChCGXfyt.js} +4 -4
  43. package/dist/cli/daemon-cli.js +1 -1
  44. package/dist/{cli-Cl3PdJei.js → cli-ZR9ugUBX.js} +42 -38
  45. package/dist/cli-miPe4Ujz.js +93 -0
  46. package/dist/{client-6xKrRC-1.js → client-BrYfyoDK.js} +54 -5
  47. package/dist/{client-DMloFP_O.js → client-CTwXnRl7.js} +54 -5
  48. package/dist/{command-format-ayFsmwwz.js → command-format-Bxe0mWee.js} +1 -1
  49. package/dist/{command-options-BTAzyqqb.js → command-options-BvgxzPbK.js} +9 -4
  50. package/dist/{commands-CjEGXOZ_.js → commands-BX_OIIVR.js} +4 -4
  51. package/dist/{completion-cli-DrJGfJGl.js → completion-cli-CR77-jyv.js} +3 -3
  52. package/dist/{completion-cli-DOec3E2Z.js → completion-cli-DnjpxAag.js} +30 -30
  53. package/dist/{config-B00lvFac.js → config-Bdhomfei.js} +21 -7
  54. package/dist/{config-XBdA0ciN.js → config-BvMsmctM.js} +83 -9
  55. package/dist/{config-BqGVMf1y.js → config-QYrbd7x7.js} +60 -6
  56. package/dist/{config--NUdpACy.js → config-aFQssWKX.js} +21 -7
  57. package/dist/{config-guard-4kCO_rnQ.js → config-guard-CljaSxJd.js} +160 -51
  58. package/dist/{configure-B69emwZv.js → configure-BXLiucXo.js} +28 -25
  59. package/dist/{configure-sMhpLzFf.js → configure-BYPqXzGZ.js} +28 -25
  60. package/dist/control-auth-8Cf4WXpR.js +54 -0
  61. package/dist/control-auth-DBCu3qyv.js +54 -0
  62. package/dist/{control-service-Db_1V-KY.js → control-service-B5KnPqGP.js} +11 -5
  63. package/dist/{control-service-IRAmbcbN.js → control-service-DKnttEus.js} +10 -4
  64. package/dist/control-ui/assets/{index-CnB9IO4a.js → index-B4LPvte9.js} +369 -369
  65. package/dist/control-ui/assets/index-B4LPvte9.js.map +1 -0
  66. package/dist/control-ui/index.html +1 -1
  67. package/dist/{cron-cli-Cum2324v.js → cron-cli-D7BRjDv2.js} +20 -20
  68. package/dist/{cron-cli-DhUWcYdk.js → cron-cli-z1zk_FXQ.js} +19 -19
  69. package/dist/{daemon-cli-q7nkEF5-.js → daemon-cli-BDkU2ocb.js} +60 -21
  70. package/dist/{daemon-cli-CTC2CHci.js → daemon-cli-cNSF93-v.js} +59 -20
  71. package/dist/{daemon-runtime-c0uXH4Dl.js → daemon-runtime-B0tg_LsX.js} +3 -3
  72. package/dist/{daemon-runtime-UsK-tOty.js → daemon-runtime-Bsjeut6m.js} +3 -3
  73. package/dist/{deliver-hf-WKyWd.js → deliver-CIU9Npgs.js} +373 -281
  74. package/dist/{deliver-CT6KiDqO.js → deliver-DYYCo1G7.js} +369 -278
  75. package/dist/{deliver-T9d44OpZ.js → deliver-LsxKETro.js} +371 -279
  76. package/dist/{deliver-CPy8jYj9.js → deliver-xUU3mGHo.js} +369 -277
  77. package/dist/{deps-Bv1kLtwo.js → deps-QSwGcoNZ.js} +2 -2
  78. package/dist/{deps-DFQdAWQc.js → deps-lAAA2zYI.js} +2 -2
  79. package/dist/{devices-cli-Cm7U1py9.js → devices-cli-BG3-2oqt.js} +14 -14
  80. package/dist/{devices-cli-ZpjlfK-e.js → devices-cli-VIQtOvt_.js} +14 -14
  81. package/dist/{directory-cli-B14TUSJA.js → directory-cli-BCJwjVC0.js} +16 -16
  82. package/dist/{directory-cli-67kzd4I5.js → directory-cli-jYzZ02gk.js} +14 -14
  83. package/dist/{dispatcher-3ElQWGVI.js → dispatcher-DY51b-Zc.js} +2 -2
  84. package/dist/{dns-cli-CU-xfhTN.js → dns-cli-DHIiMJjS.js} +12 -12
  85. package/dist/{dns-cli-Dqj7O6Q_.js → dns-cli-pZlv87Ib.js} +11 -11
  86. package/dist/{docs-cli-CamBqzb5.js → docs-cli-2JDiwfzP.js} +8 -8
  87. package/dist/{docs-cli-Cj3L5oqB.js → docs-cli-BhkYqoIQ.js} +7 -7
  88. package/dist/{doctor-BV1kvbMm.js → doctor-Bf8EhNtA.js} +36 -35
  89. package/dist/{doctor-BJirShBi.js → doctor-sYG5V4Co.js} +34 -33
  90. package/dist/entry.js +56 -18
  91. package/dist/{env-BxRc6wWv.js → env-ONzUVAG2.js} +1 -1
  92. package/dist/{exec-CijMSZd9.js → exec-B8lXct-k.js} +503 -14
  93. package/dist/{exec-B8JKbXKW.js → exec-CACT5OAW.js} +1 -1
  94. package/dist/{exec-57A8Rlc8.js → exec-CJFFoM7H.js} +32 -13
  95. package/dist/{exec-Cv_Ofd1m.js → exec-YIosokWE.js} +1 -1
  96. package/dist/{exec-approvals-cli-DEzz9Iai.js → exec-approvals-cli-7LH0lwhO.js} +21 -21
  97. package/dist/{exec-approvals-cli-DhXj3hQX.js → exec-approvals-cli-apGnQbpj.js} +21 -21
  98. package/dist/extensionAPI.js +7733 -8746
  99. package/dist/fetch-DmiOpALK.js +274 -0
  100. package/dist/fetch-timeout-BEtUjM1S.js +274 -0
  101. package/dist/fetch-timeout-DEoXG_SF.js +274 -0
  102. package/dist/fetch-timeout-DTK9vxex.js +274 -0
  103. package/dist/{gateway-cli-D1EdIq8I.js → gateway-cli-DUdYxlZS.js} +491 -136
  104. package/dist/{gateway-cli-B_xDUDy2.js → gateway-cli-DbvWmE-9.js} +495 -140
  105. package/dist/{gateway-rpc-3B5y445n.js → gateway-rpc-BByb2Snz.js} +3 -3
  106. package/dist/{gateway-rpc-BoL2vinh.js → gateway-rpc-wXSCUZXj.js} +3 -3
  107. package/dist/{github-copilot-auth-Omqrto0J.js → github-copilot-auth-D7ewvpMd.js} +205 -17
  108. package/dist/{github-copilot-auth-CZxurvdz.js → github-copilot-auth-DDispnyz.js} +205 -17
  109. package/dist/{github-copilot-token-SLWintYd.js → github-copilot-token-Cfs0Wxr8.js} +1 -1
  110. package/dist/{gmail-setup-utils-BXQKsLtI.js → gmail-setup-utils-Cfns8TQx.js} +3 -3
  111. package/dist/{gmail-setup-utils-CHcssBOA.js → gmail-setup-utils-DJb-_5kO.js} +4 -4
  112. package/dist/{health-format-Dy1caGsq.js → health-format-KGPokKJH.js} +97 -42
  113. package/dist/{health-format-DrGFg8bx.js → health-format-LZDxu3rv.js} +95 -40
  114. package/dist/{help-format-DAj7l5uV.js → help-format-C48TXngO.js} +1 -1
  115. package/dist/{help-format-CUnac_bT.js → help-format-R5fLToDw.js} +1 -1
  116. package/dist/{hooks-cli-ptEf6TIM.js → hooks-cli-CT8JCRkH.js} +51 -46
  117. package/dist/{hooks-cli-Bhf5VRp1.js → hooks-cli-S1MKumJO.js} +49 -44
  118. package/dist/{hooks-status-Br-2bK2G.js → hooks-status-Cw0xD8Lt.js} +3 -3
  119. package/dist/{hooks-status-DNQJSa4B.js → hooks-status-D9MhwHRp.js} +3 -3
  120. package/dist/{image-rOFfK3PJ.js → image-Brk1sJbw.js} +10 -7
  121. package/dist/{image-fUwR7slg.js → image-C4Nn2p3e.js} +10 -7
  122. package/dist/{image-Ds4NLGPR.js → image-DgtfXMcX.js} +9 -6
  123. package/dist/{image-Dnnxt82I.js → image-RKwc3fsL.js} +8 -5
  124. package/dist/index.js +208 -97
  125. package/dist/{installs-CRSjQxbR.js → installs-CrLcWYHe.js} +8 -7
  126. package/dist/{installs-89zeUsVn.js → installs-DscWb9b9.js} +8 -7
  127. package/dist/{links-7M-j83As.js → links-B8LAzWwg.js} +1 -1
  128. package/dist/{links-C591fM9M.js → links-Eax1UO3w.js} +1 -1
  129. package/dist/llm-slug-generator.js +18 -19
  130. package/dist/{loader-wXwp4rZJ.js → loader-KjT074JR.js} +5722 -6888
  131. package/dist/{logging-MMRGFxGI.js → logging-BAyPwvdH.js} +1 -1
  132. package/dist/{logging-DuK6YXuK.js → logging-CRq4h04P.js} +2 -2
  133. package/dist/{login-qr-wM8BnKJh.js → login-qr-B6ZgAuIf.js} +5 -5
  134. package/dist/{login-qr-CPEsT6dN.js → login-qr-Bua-p0nG.js} +3 -4
  135. package/dist/{login-qr-CGEu5TU-.js → login-qr-CuvemJj4.js} +6 -6
  136. package/dist/{login-qr-DH150tTp.js → login-qr-Djr1JfIf.js} +2 -2
  137. package/dist/{logs-cli-ClgkHnfT.js → logs-cli-9IAV7rWY.js} +38 -22
  138. package/dist/{logs-cli-CmfINsOj.js → logs-cli-EiKzUFPa.js} +37 -21
  139. package/dist/{manager-DYo4PlVM.js → manager-BIMh_eSm.js} +7 -8
  140. package/dist/{manager-D6EbxDV4.js → manager-CwinWQoz.js} +5 -5
  141. package/dist/{manager-BbnHek5T.js → manager-DkqF1GiK.js} +9 -9
  142. package/dist/{manager-CcVYv0N5.js → manager-T1XfGchB.js} +8 -8
  143. package/dist/{manifest-registry-3It8Z8yN.js → manifest-registry-CQhdnDBZ.js} +40 -2
  144. package/dist/{manifest-registry-D5SiA3xq.js → manifest-registry-u0okVSkU.js} +40 -2
  145. package/dist/{message-channel-Cu61-7H6.js → message-channel-BLi2a6Yw.js} +1 -1
  146. package/dist/{message-channel-BlgPSDAh.js → message-channel-C_MmebBt.js} +1 -1
  147. package/dist/{model-auth-ioeR_zLX.js → model-auth-CabXIF6O.js} +116 -34
  148. package/dist/{model-selection-BK7DuyH8.js → model-selection-BLuqsGVB.js} +86 -30
  149. package/dist/{model-selection-CezC36lH.js → model-selection-C1GmkTAV.js} +84 -28
  150. package/dist/{models-cli-C3uGdOrd.js → models-cli-9jmDv-h3.js} +52 -48
  151. package/dist/{models-cli-CUIVPgXE.js → models-cli-zS9rtWz8.js} +53 -49
  152. package/dist/{node-cli-BxBGSuPE.js → node-cli-CrpTxTTs.js} +28 -26
  153. package/dist/{node-cli-CdYAsuQQ.js → node-cli-wemUMCg-.js} +28 -26
  154. package/dist/{node-service-u8g85nD3.js → node-service-C8DTHTMg.js} +2 -2
  155. package/dist/{node-service-CM5vkdIo.js → node-service-WQuEKz6W.js} +2 -2
  156. package/dist/{nodes-cli-By6yeCTB.js → nodes-cli-BaU2SIFw.js} +20 -20
  157. package/dist/{nodes-cli-BaVMTAPc.js → nodes-cli-Dx23D72n.js} +20 -20
  158. package/dist/{nodes-screen-Dvl_ohUY.js → nodes-screen-C0IuBqUL.js} +1 -1
  159. package/dist/{note-5WqioBRA.js → note-BhRSeNeu.js} +2 -2
  160. package/dist/{note-Ci08TSbV.js → note-hhtubr2j.js} +1 -1
  161. package/dist/{onboard-channels-DxXvp8og.js → onboard-channels-C501x8GI.js} +8 -8
  162. package/dist/{onboard-channels-CXhnVy4E.js → onboard-channels-Dxzroasd.js} +8 -8
  163. package/dist/{onboard-skills-CBxsRGyf.js → onboard-skills-DV0Qzvjj.js} +440 -136
  164. package/dist/{onboard-skills-DQwOQ6Ry.js → onboard-skills-rlBHcu3Q.js} +439 -135
  165. package/dist/{onboarding-Du_7qEng.js → onboarding-CN-EDLjd.js} +38 -38
  166. package/dist/{openclaw-root-JLDMp6ux.js → openclaw-root-1VeFrph_.js} +4 -0
  167. package/dist/{openclaw-root-Dw6gumSU.js → openclaw-root-BNlEap4i.js} +4 -0
  168. package/dist/{pairing-cli-CRQDpj8f.js → pairing-cli-CDHG4xuI.js} +15 -15
  169. package/dist/{pairing-cli-Cng1KFWw.js → pairing-cli-CQP34Dlx.js} +15 -15
  170. package/dist/{pairing-labels-Ciu3Zoxj.js → pairing-labels-B6CN0SNH.js} +1 -1
  171. package/dist/{pairing-labels-CWFEtSc3.js → pairing-labels-CgNHnjzT.js} +1 -1
  172. package/dist/{pairing-store-c-QQ2u8p.js → pairing-store-CmlRVqOz.js} +2 -2
  173. package/dist/{pairing-store-CgXR3ZWJ.js → pairing-store-Dp5_JGnG.js} +3 -3
  174. package/dist/{path-env-CXWUFfFv.js → path-env-CLvYNwtL.js} +1 -1
  175. package/dist/{path-env-BgLvMbz_.js → path-env-CaYUVIML.js} +2 -2
  176. package/dist/{paths-MnZaxqPw.js → paths-B0a4ywSO.js} +30 -5
  177. package/dist/{paths-Bkhd_qY8.js → paths-B49s6UZQ.js} +30 -5
  178. package/dist/{paths-DL6EIRTw.js → paths-D0O87MfH.js} +30 -5
  179. package/dist/{paths-IivnSNkP.js → paths-DLINmNFQ.js} +31 -6
  180. package/dist/{pi-embedded-CgPTEqlB.js → pi-embedded-Ctrt2kz0.js} +8759 -9600
  181. package/dist/{pi-embedded-helpers-DYH6OWft.js → pi-embedded-helpers-CMKLjW6X.js} +68 -9
  182. package/dist/{pi-embedded-helpers-y1_Se0yq.js → pi-embedded-helpers-CUzTc1v6.js} +241 -24
  183. package/dist/{pi-embedded-helpers-Bkpd4fTr.js → pi-embedded-helpers-DfwkwPYD.js} +67 -8
  184. package/dist/{pi-embedded-helpers-BbWRSUnc.js → pi-embedded-helpers-WDwx99UA.js} +347 -32
  185. package/dist/{pi-tools.policy-akYsGFiA.js → pi-tools.policy-BpsROZbz.js} +4 -4
  186. package/dist/{plugin-auto-enable-lZwe2yX5.js → plugin-auto-enable-Bqhc3w5n.js} +5 -5
  187. package/dist/{plugin-auto-enable-AOSOJ-v1.js → plugin-auto-enable-PW76g_PJ.js} +5 -5
  188. package/dist/plugin-sdk/agents/bash-process-registry.d.ts +1 -0
  189. package/dist/plugin-sdk/agents/models-config.providers.d.ts +10 -0
  190. package/dist/plugin-sdk/agents/pi-embedded-helpers/errors.d.ts +5 -1
  191. package/dist/plugin-sdk/agents/pi-embedded-helpers.d.ts +1 -1
  192. package/dist/plugin-sdk/agents/pi-embedded-runner/google.d.ts +1 -0
  193. package/dist/plugin-sdk/agents/pi-embedded-runner/run/params.d.ts +2 -0
  194. package/dist/plugin-sdk/agents/pi-embedded-runner/run/payloads.d.ts +1 -0
  195. package/dist/plugin-sdk/agents/pi-embedded-runner/run/types.d.ts +2 -0
  196. package/dist/plugin-sdk/agents/pi-embedded-runner/types.d.ts +15 -0
  197. package/dist/plugin-sdk/agents/pi-embedded-subscribe.handlers.tools.d.ts +1 -1
  198. package/dist/plugin-sdk/agents/pi-embedded-subscribe.handlers.types.d.ts +2 -0
  199. package/dist/plugin-sdk/agents/pi-embedded-subscribe.types.d.ts +2 -0
  200. package/dist/plugin-sdk/agents/session-tool-result-guard-wrapper.d.ts +2 -0
  201. package/dist/plugin-sdk/agents/session-tool-result-guard.d.ts +4 -0
  202. package/dist/plugin-sdk/agents/tools/agent-step.d.ts +3 -0
  203. package/dist/plugin-sdk/agents/tools/browser-tool.schema.d.ts +1 -1
  204. package/dist/plugin-sdk/agents/tools/web-search.d.ts +10 -1
  205. package/dist/plugin-sdk/agents/usage.d.ts +1 -0
  206. package/dist/plugin-sdk/auto-reply/heartbeat.d.ts +1 -1
  207. package/dist/plugin-sdk/auto-reply/reply/get-reply-directives.d.ts +1 -0
  208. package/dist/plugin-sdk/auto-reply/reply/mentions.d.ts +1 -0
  209. package/dist/plugin-sdk/auto-reply/reply/model-selection.d.ts +3 -0
  210. package/dist/plugin-sdk/auto-reply/reply/reply-reference.d.ts +1 -1
  211. package/dist/plugin-sdk/auto-reply/reply/session-run-accounting.d.ts +11 -0
  212. package/dist/plugin-sdk/auto-reply/reply/session-usage.d.ts +8 -0
  213. package/dist/plugin-sdk/auto-reply/types.d.ts +2 -0
  214. package/dist/plugin-sdk/browser/control-auth.d.ts +13 -0
  215. package/dist/plugin-sdk/channels/plugins/onboarding/signal.d.ts +1 -0
  216. package/dist/plugin-sdk/cli/prompt.d.ts +1 -0
  217. package/dist/plugin-sdk/commands/agent/types.d.ts +2 -0
  218. package/dist/plugin-sdk/commands/onboard-types.d.ts +7 -1
  219. package/dist/plugin-sdk/config/sessions/paths.d.ts +7 -2
  220. package/dist/plugin-sdk/config/types.agents.d.ts +2 -0
  221. package/dist/plugin-sdk/config/types.discord.d.ts +5 -0
  222. package/dist/plugin-sdk/config/types.gateway.d.ts +15 -0
  223. package/dist/plugin-sdk/config/types.hooks.d.ts +15 -0
  224. package/dist/plugin-sdk/config/types.memory.d.ts +2 -0
  225. package/dist/plugin-sdk/config/zod-schema.agents.d.ts +1 -0
  226. package/dist/plugin-sdk/config/zod-schema.d.ts +13 -1
  227. package/dist/plugin-sdk/config/zod-schema.hooks.d.ts +1 -1
  228. package/dist/plugin-sdk/config/zod-schema.providers-core.d.ts +9 -0
  229. package/dist/plugin-sdk/config/zod-schema.providers.d.ts +4 -0
  230. package/dist/plugin-sdk/cron/service/jobs.d.ts +8 -0
  231. package/dist/plugin-sdk/cron/service/state.d.ts +1 -0
  232. package/dist/plugin-sdk/cron/types.d.ts +2 -0
  233. package/dist/plugin-sdk/discord/monitor/allow-list.d.ts +15 -0
  234. package/dist/plugin-sdk/discord/send.types.d.ts +5 -0
  235. package/dist/plugin-sdk/gateway/auth.d.ts +36 -0
  236. package/dist/plugin-sdk/gateway/protocol/index.d.ts +0 -3
  237. package/dist/plugin-sdk/gateway/protocol/schema/agent.d.ts +7 -1
  238. package/dist/plugin-sdk/gateway/session-utils.fs.d.ts +3 -1
  239. package/dist/plugin-sdk/index.js +935 -660
  240. package/dist/plugin-sdk/infra/binaries.d.ts +3 -0
  241. package/dist/plugin-sdk/infra/heartbeat-active-hours.d.ts +5 -0
  242. package/dist/plugin-sdk/infra/heartbeat-runner.d.ts +1 -0
  243. package/dist/plugin-sdk/infra/net/fetch-guard.d.ts +1 -0
  244. package/dist/plugin-sdk/infra/net/ssrf.d.ts +1 -0
  245. package/dist/plugin-sdk/infra/tailscale.d.ts +34 -0
  246. package/dist/plugin-sdk/infra/tmp-openclaw-dir.d.ts +10 -0
  247. package/dist/plugin-sdk/logging/console.d.ts +1 -0
  248. package/dist/plugin-sdk/logging/logger.d.ts +1 -1
  249. package/dist/plugin-sdk/logging/state.d.ts +1 -0
  250. package/dist/plugin-sdk/markdown/ir.d.ts +1 -1
  251. package/dist/plugin-sdk/markdown/whatsapp.d.ts +14 -0
  252. package/dist/plugin-sdk/media/input-files.d.ts +5 -0
  253. package/dist/plugin-sdk/media-understanding/audio-preflight.d.ts +16 -0
  254. package/dist/plugin-sdk/media-understanding/types.d.ts +1 -0
  255. package/dist/plugin-sdk/memory/backend-config.d.ts +2 -1
  256. package/dist/plugin-sdk/memory/qmd-manager.d.ts +2 -0
  257. package/dist/plugin-sdk/memory/qmd-query-parser.d.ts +8 -0
  258. package/dist/plugin-sdk/process/command-queue.d.ts +16 -0
  259. package/dist/plugin-sdk/routing/resolve-route.d.ts +3 -1
  260. package/dist/plugin-sdk/security/external-content.d.ts +1 -1
  261. package/dist/plugin-sdk/security/secret-equal.d.ts +1 -0
  262. package/dist/plugin-sdk/sessions/input-provenance.d.ts +16 -0
  263. package/dist/plugin-sdk/signal/monitor/event-handler.types.d.ts +8 -0
  264. package/dist/plugin-sdk/signal/monitor/mentions.d.ts +2 -0
  265. package/dist/plugin-sdk/slack/monitor/commands.d.ts +5 -0
  266. package/dist/plugin-sdk/telegram/bot-message-context.d.ts +2 -1
  267. package/dist/plugin-sdk/telegram/send.d.ts +3 -0
  268. package/dist/plugin-sdk/web/media.d.ts +2 -0
  269. package/dist/{plugins-Db5BiELK.js → plugins-4Hqd1WGf.js} +3 -3
  270. package/dist/{plugins-CNaHNND_.js → plugins-X7d_tfTE.js} +4 -4
  271. package/dist/{plugins-cli-8G-hQPCu.js → plugins-cli-Bgku3EGj.js} +253 -44
  272. package/dist/{plugins-cli-CDiocaDE.js → plugins-cli-CVToH3if.js} +257 -48
  273. package/dist/{ports-BeebfNCb.js → ports-qkt29rdC.js} +2 -2
  274. package/dist/{program-0Cj9YxRN.js → program-Cf7lkBur.js} +82 -80
  275. package/dist/{progress-DIQJt9Va.js → progress-C9kngsTD.js} +1 -1
  276. package/dist/{progress-Da1ehW-x.js → progress-DWqhRakV.js} +1 -1
  277. package/dist/{prompt-style-Dc0C5HC9.js → prompt-style-BFH5D5LN.js} +1 -1
  278. package/dist/{prompt-style-CjQRlDx4.js → prompt-style-CIbmaxSa.js} +1 -1
  279. package/dist/{pw-ai-C43wv1ZF.js → pw-ai-8mdv3h-d.js} +7 -6
  280. package/dist/{pw-ai-COWYvUfG.js → pw-ai-CM1IsSgZ.js} +6 -6
  281. package/dist/{pw-ai-BxJ-KCIy.js → pw-ai-FGoRVblI.js} +5 -6
  282. package/dist/{pw-ai-CsvaObGM.js → pw-ai-sS1fRKW_.js} +3 -3
  283. package/dist/{qmd-manager-CpsjQyaZ.js → qmd-manager-C67Fc8aN.js} +79 -26
  284. package/dist/{qmd-manager-C9YWFeG6.js → qmd-manager-CXVbfg99.js} +81 -26
  285. package/dist/{qmd-manager-C02E8ixK.js → qmd-manager-RMRE8Tqt.js} +81 -26
  286. package/dist/{qmd-manager-BzY2LQTT.js → qmd-manager-pyc_MTIe.js} +78 -23
  287. package/dist/{register.subclis-DUkirdHn.js → register.subclis-C02e4zuJ.js} +29 -29
  288. package/dist/{reply--b7BsXGP.js → reply-DICXkh_C.js} +7289 -8455
  289. package/dist/{routes-DUkEKAc1.js → routes-CmOI1hIH.js} +29 -11
  290. package/dist/{routes-B4QQiFju.js → routes-DewK5tq2.js} +29 -12
  291. package/dist/{rpc-CuMtxrRT.js → rpc-DHr30euf.js} +3 -3
  292. package/dist/{rpc-Blt6MJ4F.js → rpc-T300F8zI.js} +3 -3
  293. package/dist/{run-main-XZcPA23b.js → run-main-C5wpthq1.js} +84 -82
  294. package/dist/runner-CY0nmVme.js +1886 -0
  295. package/dist/runner-Cfm5nTMc.js +1785 -0
  296. package/dist/runner-D_dujMod.js +1886 -0
  297. package/dist/runner-DrGYLH5K.js +1785 -0
  298. package/dist/{sandbox-Aks-9EcZ.js → sandbox-BKYnhYQH.js} +24 -17
  299. package/dist/{sandbox-DqUO2K83.js → sandbox-Bhjnh1Xg.js} +23 -16
  300. package/dist/{sandbox-cli-C99Thxi8.js → sandbox-cli-DBsAjZJN.js} +21 -21
  301. package/dist/{sandbox-cli-CJqRM4V6.js → sandbox-cli-rV9LtFeu.js} +21 -21
  302. package/dist/{security-cli-iqYLMOz3.js → security-cli-BIwJM_rs.js} +27 -27
  303. package/dist/{security-cli-DW3lCz-o.js → security-cli-BRjny8Yu.js} +27 -27
  304. package/dist/{server-context-fX4xiYRh.js → server-context-BGpGs3qd.js} +7 -7
  305. package/dist/{server-context-8Qt35QdF.js → server-context-Cl0U0vE3.js} +7 -7
  306. package/dist/{server-node-events-CHWXfb_T.js → server-node-events-CBfTbiTA.js} +48 -44
  307. package/dist/{server-node-events-BzrEnKLX.js → server-node-events-QCvh8EgI.js} +45 -41
  308. package/dist/{service-Cd4BxKuo.js → service--nPk7DvT.js} +8 -4
  309. package/dist/{service-DDPRbf8a.js → service-99RDXwX4.js} +8 -4
  310. package/dist/{service-audit-CCFxuvKs.js → service-audit-DnLmRGQt.js} +4 -4
  311. package/dist/{service-audit-x6jCN-6a.js → service-audit-ckBaRCVC.js} +4 -4
  312. package/dist/{session-cost-usage-CcCEQNuc.js → session-cost-usage-D7HuoSSD.js} +12 -10
  313. package/dist/{session-cost-usage-PvyVZz-g.js → session-cost-usage-D9hHANWI.js} +12 -10
  314. package/dist/{shared-ILguacOr.js → shared-Bs4vduG4.js} +3 -3
  315. package/dist/{shared-CagUDdmp.js → shared-CEY5IkwG.js} +3 -3
  316. package/dist/{shared-gOyV38rM.js → shared-DRohONn_.js} +4 -4
  317. package/dist/{shared-BDk_zC9p.js → shared-ICqOZibV.js} +4 -4
  318. package/dist/{skill-scanner-C_fQzVDu.js → skill-scanner-CucvxYhu.js} +1 -1
  319. package/dist/{skill-scanner-DrVEHfC6.js → skill-scanner-rHMtUHtP.js} +1 -1
  320. package/dist/{skills-D5UZZZSY.js → skills-DRjfSQT3.js} +141 -6
  321. package/dist/{skills-ccAgQ3Ad.js → skills-DprQj9X2.js} +142 -7
  322. package/dist/{skills-cli-DQilTG3n.js → skills-cli-9WO-C55s.js} +12 -12
  323. package/dist/{skills-cli-ggyLBtAY.js → skills-cli-B9eej-EW.js} +13 -13
  324. package/dist/{skills-status-BosMnzIs.js → skills-status-5U3P3YfJ.js} +3 -3
  325. package/dist/{skills-status-DjtPPMnY.js → skills-status-TDIgVd1K.js} +2 -2
  326. package/dist/{sqlite-B7FPASCO.js → sqlite-BINzs1U0.js} +2 -2
  327. package/dist/{sqlite-Btrgi7-j.js → sqlite-D4w5TejA.js} +3 -3
  328. package/dist/{sqlite-BrQ9tw8B.js → sqlite-DRRHmlug.js} +3 -3
  329. package/dist/{sqlite-HepBVDoX.js → sqlite-F6PGkEm1.js} +2 -2
  330. package/dist/{status-BByCntWS.js → status-BKGkKC_v.js} +3 -3
  331. package/dist/{status-Dt7RE_Yy.js → status-CiHtHdaa.js} +4 -4
  332. package/dist/{status-zfL4Yej7.js → status-DDWoOpeB.js} +37 -37
  333. package/dist/{subsystem-Bh1Y_6Uv.js → subsystem-BoExtIHo.js} +52 -17
  334. package/dist/{system-cli-DwuUkdkH.js → system-cli-B6lr60Io.js} +14 -14
  335. package/dist/{system-cli-Clqsx8U5.js → system-cli-CprW9G3h.js} +14 -14
  336. package/dist/{systemd-BEWwfwn0.js → systemd-C0VZriGM.js} +3 -3
  337. package/dist/{systemd-D6wTPnHi.js → systemd-DrmBtJ5T.js} +3 -3
  338. package/dist/{systemd-hints-zi4ohCOY.js → systemd-hints-DZtXiVHa.js} +1 -1
  339. package/dist/{systemd-linger-CDo2UbHM.js → systemd-linger-NC2kl1SC.js} +2 -2
  340. package/dist/{systemd-linger-BxjTrgoH.js → systemd-linger-xdn3BdPh.js} +2 -2
  341. package/dist/{table-DEnmtvl5.js → table-B8dx3v4v.js} +2 -2
  342. package/dist/{table-cCoGqLsk.js → table-CwulTLQp.js} +1 -1
  343. package/dist/{tool-display-DskiU8Kt.js → tool-display-CZRIDMRm.js} +2 -2
  344. package/dist/{tool-display-o-dDAlqF.js → tool-display-ClRud3pg.js} +2 -2
  345. package/dist/{tui-BdJWZdto.js → tui-CVTQn-dC.js} +14 -13
  346. package/dist/{tui-Bc7XUQGP.js → tui-Lu8FdrlK.js} +13 -14
  347. package/dist/{tui-cli-BGYh0UL0.js → tui-cli-BLpTj1X9.js} +27 -27
  348. package/dist/{tui-cli-D3n-O9zB.js → tui-cli-BLx5kL2I.js} +26 -26
  349. package/dist/{tui-formatters-CA85v4U2.js → tui-formatters-CNySEfJN.js} +6 -6
  350. package/dist/{tui-formatters-C3NarH24.js → tui-formatters-DePhZK3J.js} +6 -6
  351. package/dist/{update-JB16aPIY.js → update-DHVxMTpQ.js} +3 -3
  352. package/dist/{update-Ct9sqJC_.js → update-DU1geolI.js} +3 -3
  353. package/dist/{update-cli-wWKDS3cm.js → update-cli-C0hUvJWK.js} +89 -71
  354. package/dist/{update-cli-DDXp_N9B.js → update-cli-Wb1GB3rL.js} +88 -70
  355. package/dist/{update-runner-ChTf6O6p.js → update-runner--ixK4J3W.js} +11 -11
  356. package/dist/{update-runner-CmE6cHdn.js → update-runner-7Qa1T9y6.js} +10 -10
  357. package/dist/{utils-Dk86IbEs.js → utils-BLJAc3ZV.js} +1 -1
  358. package/dist/{utils-es4ygvQ-.js → utils-Cd9QdCHh.js} +1 -1
  359. package/dist/{webhooks-cli-CVIE9TtX.js → webhooks-cli-DgcMy7RG.js} +12 -12
  360. package/dist/{webhooks-cli-BmKSiQQC.js → webhooks-cli-aVzUcJY9.js} +11 -11
  361. package/dist/{widearea-dns-2ah0bkAj.js → widearea-dns-BaIgNEhY.js} +3 -3
  362. package/dist/{widearea-dns-CMIG6-74.js → widearea-dns-DzuRdwk5.js} +3 -3
  363. package/dist/{ws-DtDKpbLR.js → ws-CHCQHs0F.js} +1 -1
  364. package/dist/{ws-log-BP3z_g6Z.js → ws-log-CIXbLCka.js} +1 -1
  365. package/dist/{ws-log-D7MkvKhg.js → ws-log-DcQFZByi.js} +2 -2
  366. package/dist/{wsl-Cwo7X0Un.js → wsl-BUOkxKJu.js} +2 -2
  367. package/docs/assets/install-script.svg +1 -0
  368. package/docs/automation/hooks.md +1 -38
  369. package/docs/automation/webhook.md +43 -2
  370. package/docs/channels/discord.md +389 -381
  371. package/docs/channels/imessage.md +229 -218
  372. package/docs/channels/slack.md +294 -415
  373. package/docs/channels/telegram.md +401 -505
  374. package/docs/channels/whatsapp.md +338 -310
  375. package/docs/ci.md +0 -12
  376. package/docs/cli/hooks.md +1 -14
  377. package/docs/cli/index.md +6 -1
  378. package/docs/cli/logs.md +4 -0
  379. package/docs/cli/onboard.md +30 -0
  380. package/docs/cli/plugins.md +20 -1
  381. package/docs/cli/security.md +1 -0
  382. package/docs/concepts/memory.md +7 -4
  383. package/docs/concepts/session-tool.md +1 -0
  384. package/docs/docs.json +11 -11
  385. package/docs/gateway/configuration-examples.md +9 -2
  386. package/docs/gateway/configuration-reference.md +2329 -0
  387. package/docs/gateway/configuration.md +338 -3304
  388. package/docs/gateway/index.md +162 -238
  389. package/docs/gateway/openresponses-http-api.md +15 -0
  390. package/docs/gateway/security/index.md +3 -0
  391. package/docs/help/faq.md +9 -0
  392. package/docs/install/hetzner.md +21 -0
  393. package/docs/install/installer.md +20 -0
  394. package/docs/nodes/audio.md +19 -0
  395. package/docs/platforms/mac/release.md +7 -7
  396. package/docs/providers/glm.md +3 -3
  397. package/docs/providers/index.md +1 -0
  398. package/docs/providers/litellm.md +153 -0
  399. package/docs/providers/zai.md +2 -2
  400. package/docs/reference/templates/AGENTS.md +26 -26
  401. package/docs/reference/templates/HEARTBEAT.md +31 -2
  402. package/docs/reference/templates/SOUL.md +14 -8
  403. package/docs/reference/transcript-hygiene.md +18 -0
  404. package/docs/start/getting-started.md +5 -0
  405. package/docs/start/wizard-cli-automation.md +17 -0
  406. package/docs/start/wizard-cli-reference.md +12 -0
  407. package/docs/tools/browser.md +6 -0
  408. package/docs/zh-CN/automation/hooks.md +1 -38
  409. package/docs/zh-CN/cli/hooks.md +1 -14
  410. package/extensions/bluebubbles/package.json +1 -1
  411. package/extensions/bluebubbles/src/monitor.test.ts +40 -28
  412. package/extensions/bluebubbles/src/monitor.ts +0 -4
  413. package/extensions/copilot-proxy/package.json +1 -1
  414. package/extensions/diagnostics-otel/package.json +10 -10
  415. package/extensions/discord/package.json +1 -1
  416. package/extensions/feishu/package.json +2 -5
  417. package/extensions/feishu/src/bot.checkBotMentioned.test.ts +64 -0
  418. package/extensions/feishu/src/bot.ts +1 -1
  419. package/extensions/feishu/src/channel.test.ts +48 -0
  420. package/extensions/feishu/src/channel.ts +1 -3
  421. package/extensions/feishu/src/config-schema.ts +6 -0
  422. package/extensions/feishu/src/docx.ts +14 -4
  423. package/extensions/feishu/src/media.test.ts +151 -0
  424. package/extensions/feishu/src/media.ts +27 -13
  425. package/extensions/feishu/src/reply-dispatcher.test.ts +116 -0
  426. package/extensions/feishu/src/reply-dispatcher.ts +124 -67
  427. package/extensions/feishu/src/streaming-card.ts +223 -0
  428. package/extensions/feishu/src/targets.test.ts +16 -0
  429. package/extensions/feishu/src/targets.ts +1 -1
  430. package/extensions/google-antigravity-auth/package.json +1 -1
  431. package/extensions/google-gemini-cli-auth/package.json +1 -1
  432. package/extensions/googlechat/package.json +1 -1
  433. package/extensions/imessage/package.json +1 -1
  434. package/extensions/irc/package.json +1 -1
  435. package/extensions/irc/src/client.ts +1 -1
  436. package/extensions/line/package.json +1 -1
  437. package/extensions/llm-task/package.json +1 -1
  438. package/extensions/lobster/package.json +1 -1
  439. package/extensions/matrix/CHANGELOG.md +6 -0
  440. package/extensions/matrix/package.json +2 -2
  441. package/extensions/mattermost/package.json +1 -1
  442. package/extensions/memory-core/package.json +1 -1
  443. package/extensions/memory-lancedb/index.ts +6 -2
  444. package/extensions/memory-lancedb/package.json +2 -2
  445. package/extensions/minimax-portal-auth/index.ts +7 -5
  446. package/extensions/minimax-portal-auth/package.json +1 -1
  447. package/extensions/msteams/CHANGELOG.md +6 -0
  448. package/extensions/msteams/package.json +1 -1
  449. package/extensions/nextcloud-talk/package.json +1 -1
  450. package/extensions/nostr/CHANGELOG.md +6 -0
  451. package/extensions/nostr/package.json +2 -2
  452. package/extensions/open-prose/package.json +1 -1
  453. package/extensions/signal/package.json +1 -1
  454. package/extensions/slack/package.json +1 -1
  455. package/extensions/telegram/package.json +1 -1
  456. package/extensions/tlon/package.json +1 -1
  457. package/extensions/twitch/CHANGELOG.md +6 -0
  458. package/extensions/twitch/package.json +1 -1
  459. package/extensions/voice-call/CHANGELOG.md +6 -0
  460. package/extensions/voice-call/package.json +1 -1
  461. package/extensions/voice-call/src/media-stream.ts +7 -1
  462. package/extensions/voice-call/src/providers/twilio.test.ts +5 -3
  463. package/extensions/voice-call/src/providers/twilio.ts +12 -1
  464. package/extensions/whatsapp/package.json +1 -1
  465. package/extensions/zalo/CHANGELOG.md +6 -0
  466. package/extensions/zalo/package.json +1 -1
  467. package/extensions/zalouser/CHANGELOG.md +6 -0
  468. package/extensions/zalouser/package.json +1 -1
  469. package/package.json +26 -22
  470. package/dist/auth-BcNHFK-i.js +0 -184
  471. package/dist/auth-BvIPpm7G.js +0 -184
  472. package/dist/boolean-M-esQJt6.js +0 -30
  473. package/dist/bundled/soul-evil/HOOK.md +0 -71
  474. package/dist/bundled/soul-evil/handler.js +0 -194
  475. package/dist/cli-DJbWJ9aB.js +0 -89
  476. package/dist/config-CI7EpvlP.js +0 -15
  477. package/dist/control-ui/assets/index-CnB9IO4a.js.map +0 -1
  478. package/dist/date-time-c6HTX6IW.js +0 -187
  479. package/dist/frontmatter-xwTm0734.js +0 -105
  480. package/dist/parse-duration-De_tAQSe.js +0 -24
  481. package/dist/session-key-nXYQSv-a.js +0 -167
  482. package/dist/utils-dp_OM900.js +0 -476
  483. package/docs/hooks/soul-evil.md +0 -69
  484. package/docs/zh-CN/hooks/soul-evil.md +0 -72
  485. /package/dist/{archive-CXhvR9nU.js → archive-beaSfAzA.js} +0 -0
  486. /package/dist/{brew-BIrWdDps.js → brew-BUIxHEkn.js} +0 -0
  487. /package/dist/{brew-B7YK4ZoL.js → brew-ROHf0-Xp.js} +0 -0
  488. /package/dist/{cli-utils-PlLcDZlM.js → cli-utils-CRhVAaLV.js} +0 -0
  489. /package/dist/{cli-utils-R-ECs5cY.js → cli-utils-LcHOt63h.js} +0 -0
  490. /package/dist/{command-format-BUxhT1xL.js → command-format-qUVxzqYm.js} +0 -0
  491. /package/dist/{constants-CNTiY-ZN.js → constants-BvQ6S8j5.js} +0 -0
  492. /package/dist/{constants-DuoCkWRh.js → constants-JPeoOZnw.js} +0 -0
  493. /package/dist/{errors-D3tYRJWG.js → errors-B91HIDPD.js} +0 -0
  494. /package/dist/{errors-B0eT3jVv.js → errors-Bv81hF2P.js} +0 -0
  495. /package/dist/{errors-x4NYs-1P.js → errors-DjZBTJJ3.js} +0 -0
  496. /package/dist/{exec-approvals-DGPTjO0N.js → exec-approvals-Cb4ZLukq.js} +0 -0
  497. /package/dist/{exec-approvals-DhmKpiIo.js → exec-approvals-DQ8TVVmj.js} +0 -0
  498. /package/dist/{format-CaxeRcue.js → format-CNU-Zkrz.js} +0 -0
  499. /package/dist/{format-DLOJPZmo.js → format-DcfK-dwd.js} +0 -0
  500. /package/dist/{format-duration-Be5Z7JdJ.js → format-duration-84n6_DgO.js} +0 -0
  501. /package/dist/{format-duration-CEmFWLyX.js → format-duration-Bo9zNKwO.js} +0 -0
  502. /package/dist/{format-relative-79_Y1n2Y.js → format-relative-CZOlQ2pA.js} +0 -0
  503. /package/dist/{format-relative-Db7eqEu8.js → format-relative-cegC_FF5.js} +0 -0
  504. /package/dist/{github-copilot-token-C9IJh2Pn.js → github-copilot-token-DkiRbJdR.js} +0 -0
  505. /package/dist/{helpers-CQI-5xS9.js → helpers-8O7IVGO-.js} +0 -0
  506. /package/dist/{helpers-CRzoyyXS.js → helpers-D_jqdWkd.js} +0 -0
  507. /package/dist/{helpers-C89IG08W.js → helpers-HyeZXsnu.js} +0 -0
  508. /package/dist/{is-main-WWuz28Ip.js → is-main-BWoXGz7p.js} +0 -0
  509. /package/dist/{logging-BzvBIA3Y.js → logging-fywhKCmE.js} +0 -0
  510. /package/dist/{nodes-screen-lykd2cny.js → nodes-screen-CdCWeiwy.js} +0 -0
  511. /package/dist/{parse-Cjiudy6x.js → parse-Bw0oH-rT.js} +0 -0
  512. /package/dist/{parse-DqAvJRIf.js → parse-ioZhOtha.js} +0 -0
  513. /package/dist/{parse-log-line-CUrpqe1w.js → parse-log-line-BoDqomM4.js} +0 -0
  514. /package/dist/{parse-log-line-D2UGw0wR.js → parse-log-line-DPxH1XZx.js} +0 -0
  515. /package/dist/{parse-timeout-DFSPLxpY.js → parse-timeout-D1XX_zN_.js} +0 -0
  516. /package/dist/{parse-timeout-DV8NQQWk.js → parse-timeout-DMW-z4Iz.js} +0 -0
  517. /package/dist/{pi-model-discovery-CV2V1HHz.js → pi-model-discovery-DqgqUyAv.js} +0 -0
  518. /package/dist/{pi-model-discovery-DzFOAbQt.js → pi-model-discovery-EwKVHlZB.js} +0 -0
  519. /package/dist/{prompts--d-6l5Ln.js → prompts-Bg96reub.js} +0 -0
  520. /package/dist/{redact-DAKeu7PA.js → redact-BRsnXqwD.js} +0 -0
  521. /package/dist/{redact-DuEEf1p1.js → redact-Br9GfacZ.js} +0 -0
  522. /package/dist/{redact-BOIof271.js → redact-BrXLgslJ.js} +0 -0
  523. /package/dist/{status-Cv36yYdi.js → status-BRZfQbJ2.js} +0 -0
  524. /package/dist/{status-Drziap9H.js → status-CoAy6bEC.js} +0 -0
  525. /package/dist/{systemd-hints-CH4pbCFD.js → systemd-hints-CXNtLw9Q.js} +0 -0
  526. /package/dist/{tailnet-DGRSvYuQ.js → tailnet-DATIFSsY.js} +0 -0
  527. /package/dist/{transcript-events-BlIONGVn.js → transcript-events-BHS7QoRl.js} +0 -0
  528. /package/dist/{transcript-events-C1hdue6u.js → transcript-events-Bp7fGnwv.js} +0 -0
  529. /package/dist/{transcript-events-CZ8CG4ht.js → transcript-events-BtNd-j6q.js} +0 -0
  530. /package/dist/{usage-format-6Uar63S0.js → usage-format-C4JfTbSp.js} +0 -0
  531. /package/dist/{usage-format-hd37en6b.js → usage-format-CpORtVCG.js} +0 -0
@@ -1,10 +1,11 @@
1
1
  import { t as __exportAll } from "./rolldown-runtime-Cbj13DAv.js";
2
- import { c as normalizeAccountId$1 } from "./session-key-nXYQSv-a.js";
3
- import { A as shouldLogVerbose, D as logVerbose, g as resolveUserPath, o as escapeRegExp } from "./utils-dp_OM900.js";
4
- import { x as getActivePluginRegistry } from "./exec-CijMSZd9.js";
5
- import { An as resolveSignalAccount, Bt as resolvePinnedHostnameWithPolicy, Dn as maxBytesForKind, Ft as saveMediaBuffer, G as appendAssistantMessageToSessionTranscript, K as resolveMirroredTranscriptText, Lt as closeDispatcher, Mt as optimizeImageToPng, Nn as normalizeChannelId, Nt as resizeToJpeg, On as mediaKindFromMime, Rt as createPinnedDispatcher, _t as getChannelDock, bn as extensionForMime, jn as getChannelPlugin, jt as hasAlphaChannel, kt as convertHeicToJpeg, m as isMessagingToolDuplicate, sn as INTERNAL_MESSAGE_CHANNEL, yn as detectMime, zt as resolvePinnedHostname } from "./pi-embedded-helpers-BbWRSUnc.js";
6
- import { t as loadConfig } from "./config-XBdA0ciN.js";
2
+ import { j as normalizeAccountId$1 } from "./agent-scope-BIEhVP4_.js";
3
+ import { Y as logVerbose, Z as shouldLogVerbose, k as escapeRegExp, l as createSubsystemLogger, x as getActivePluginRegistry, z as resolveUserPath } from "./exec-B8lXct-k.js";
4
+ import { Cn as detectMime, Fn as getChannelPlugin, Ft as resizeToJpeg, J as resolveMirroredTranscriptText, Ln as normalizeChannelId, Lt as saveMediaBuffer, Mn as mediaKindFromMime, Nt as hasAlphaChannel, Pn as resolveSignalAccount, Pt as optimizeImageToPng, dn as INTERNAL_MESSAGE_CHANNEL, jn as maxBytesForKind, jt as convertHeicToJpeg, m as isMessagingToolDuplicate, q as appendAssistantMessageToSessionTranscript, wn as extensionForMime, yt as getChannelDock } from "./pi-embedded-helpers-WDwx99UA.js";
5
+ import { t as loadConfig } from "./config-BvMsmctM.js";
6
+ import { r as fetchRemoteMedia, t as fetchWithTimeout } from "./fetch-timeout-BEtUjM1S.js";
7
7
  import fs from "node:fs/promises";
8
+ import os from "node:os";
8
9
  import path from "node:path";
9
10
  import { fileURLToPath } from "node:url";
10
11
  import { randomUUID } from "node:crypto";
@@ -20,6 +21,260 @@ function isSilentReplyText(text, token = SILENT_REPLY_TOKEN) {
20
21
  return new RegExp(`\\b${escaped}\\b\\W*$`).test(text);
21
22
  }
22
23
 
24
+ //#endregion
25
+ //#region src/plugins/hooks.ts
26
+ /**
27
+ * Get hooks for a specific hook name, sorted by priority (higher first).
28
+ */
29
+ function getHooksForName(registry, hookName) {
30
+ return registry.typedHooks.filter((h) => h.hookName === hookName).toSorted((a, b) => (b.priority ?? 0) - (a.priority ?? 0));
31
+ }
32
+ /**
33
+ * Create a hook runner for a specific registry.
34
+ */
35
+ function createHookRunner(registry, options = {}) {
36
+ const logger = options.logger;
37
+ const catchErrors = options.catchErrors ?? true;
38
+ /**
39
+ * Run a hook that doesn't return a value (fire-and-forget style).
40
+ * All handlers are executed in parallel for performance.
41
+ */
42
+ async function runVoidHook(hookName, event, ctx) {
43
+ const hooks = getHooksForName(registry, hookName);
44
+ if (hooks.length === 0) return;
45
+ logger?.debug?.(`[hooks] running ${hookName} (${hooks.length} handlers)`);
46
+ const promises = hooks.map(async (hook) => {
47
+ try {
48
+ await hook.handler(event, ctx);
49
+ } catch (err) {
50
+ const msg = `[hooks] ${hookName} handler from ${hook.pluginId} failed: ${String(err)}`;
51
+ if (catchErrors) logger?.error(msg);
52
+ else throw new Error(msg, { cause: err });
53
+ }
54
+ });
55
+ await Promise.all(promises);
56
+ }
57
+ /**
58
+ * Run a hook that can return a modifying result.
59
+ * Handlers are executed sequentially in priority order, and results are merged.
60
+ */
61
+ async function runModifyingHook(hookName, event, ctx, mergeResults) {
62
+ const hooks = getHooksForName(registry, hookName);
63
+ if (hooks.length === 0) return;
64
+ logger?.debug?.(`[hooks] running ${hookName} (${hooks.length} handlers, sequential)`);
65
+ let result;
66
+ for (const hook of hooks) try {
67
+ const handlerResult = await hook.handler(event, ctx);
68
+ if (handlerResult !== void 0 && handlerResult !== null) if (mergeResults && result !== void 0) result = mergeResults(result, handlerResult);
69
+ else result = handlerResult;
70
+ } catch (err) {
71
+ const msg = `[hooks] ${hookName} handler from ${hook.pluginId} failed: ${String(err)}`;
72
+ if (catchErrors) logger?.error(msg);
73
+ else throw new Error(msg, { cause: err });
74
+ }
75
+ return result;
76
+ }
77
+ /**
78
+ * Run before_agent_start hook.
79
+ * Allows plugins to inject context into the system prompt.
80
+ * Runs sequentially, merging systemPrompt and prependContext from all handlers.
81
+ */
82
+ async function runBeforeAgentStart(event, ctx) {
83
+ return runModifyingHook("before_agent_start", event, ctx, (acc, next) => ({
84
+ systemPrompt: next.systemPrompt ?? acc?.systemPrompt,
85
+ prependContext: acc?.prependContext && next.prependContext ? `${acc.prependContext}\n\n${next.prependContext}` : next.prependContext ?? acc?.prependContext
86
+ }));
87
+ }
88
+ /**
89
+ * Run agent_end hook.
90
+ * Allows plugins to analyze completed conversations.
91
+ * Runs in parallel (fire-and-forget).
92
+ */
93
+ async function runAgentEnd(event, ctx) {
94
+ return runVoidHook("agent_end", event, ctx);
95
+ }
96
+ /**
97
+ * Run before_compaction hook.
98
+ */
99
+ async function runBeforeCompaction(event, ctx) {
100
+ return runVoidHook("before_compaction", event, ctx);
101
+ }
102
+ /**
103
+ * Run after_compaction hook.
104
+ */
105
+ async function runAfterCompaction(event, ctx) {
106
+ return runVoidHook("after_compaction", event, ctx);
107
+ }
108
+ /**
109
+ * Run message_received hook.
110
+ * Runs in parallel (fire-and-forget).
111
+ */
112
+ async function runMessageReceived(event, ctx) {
113
+ return runVoidHook("message_received", event, ctx);
114
+ }
115
+ /**
116
+ * Run message_sending hook.
117
+ * Allows plugins to modify or cancel outgoing messages.
118
+ * Runs sequentially.
119
+ */
120
+ async function runMessageSending(event, ctx) {
121
+ return runModifyingHook("message_sending", event, ctx, (acc, next) => ({
122
+ content: next.content ?? acc?.content,
123
+ cancel: next.cancel ?? acc?.cancel
124
+ }));
125
+ }
126
+ /**
127
+ * Run message_sent hook.
128
+ * Runs in parallel (fire-and-forget).
129
+ */
130
+ async function runMessageSent(event, ctx) {
131
+ return runVoidHook("message_sent", event, ctx);
132
+ }
133
+ /**
134
+ * Run before_tool_call hook.
135
+ * Allows plugins to modify or block tool calls.
136
+ * Runs sequentially.
137
+ */
138
+ async function runBeforeToolCall(event, ctx) {
139
+ return runModifyingHook("before_tool_call", event, ctx, (acc, next) => ({
140
+ params: next.params ?? acc?.params,
141
+ block: next.block ?? acc?.block,
142
+ blockReason: next.blockReason ?? acc?.blockReason
143
+ }));
144
+ }
145
+ /**
146
+ * Run after_tool_call hook.
147
+ * Runs in parallel (fire-and-forget).
148
+ */
149
+ async function runAfterToolCall(event, ctx) {
150
+ return runVoidHook("after_tool_call", event, ctx);
151
+ }
152
+ /**
153
+ * Run tool_result_persist hook.
154
+ *
155
+ * This hook is intentionally synchronous: it runs in hot paths where session
156
+ * transcripts are appended synchronously.
157
+ *
158
+ * Handlers are executed sequentially in priority order (higher first). Each
159
+ * handler may return `{ message }` to replace the message passed to the next
160
+ * handler.
161
+ */
162
+ function runToolResultPersist(event, ctx) {
163
+ const hooks = getHooksForName(registry, "tool_result_persist");
164
+ if (hooks.length === 0) return;
165
+ let current = event.message;
166
+ for (const hook of hooks) try {
167
+ const out = hook.handler({
168
+ ...event,
169
+ message: current
170
+ }, ctx);
171
+ if (out && typeof out.then === "function") {
172
+ const msg = `[hooks] tool_result_persist handler from ${hook.pluginId} returned a Promise; this hook is synchronous and the result was ignored.`;
173
+ if (catchErrors) {
174
+ logger?.warn?.(msg);
175
+ continue;
176
+ }
177
+ throw new Error(msg);
178
+ }
179
+ const next = out?.message;
180
+ if (next) current = next;
181
+ } catch (err) {
182
+ const msg = `[hooks] tool_result_persist handler from ${hook.pluginId} failed: ${String(err)}`;
183
+ if (catchErrors) logger?.error(msg);
184
+ else throw new Error(msg, { cause: err });
185
+ }
186
+ return { message: current };
187
+ }
188
+ /**
189
+ * Run session_start hook.
190
+ * Runs in parallel (fire-and-forget).
191
+ */
192
+ async function runSessionStart(event, ctx) {
193
+ return runVoidHook("session_start", event, ctx);
194
+ }
195
+ /**
196
+ * Run session_end hook.
197
+ * Runs in parallel (fire-and-forget).
198
+ */
199
+ async function runSessionEnd(event, ctx) {
200
+ return runVoidHook("session_end", event, ctx);
201
+ }
202
+ /**
203
+ * Run gateway_start hook.
204
+ * Runs in parallel (fire-and-forget).
205
+ */
206
+ async function runGatewayStart(event, ctx) {
207
+ return runVoidHook("gateway_start", event, ctx);
208
+ }
209
+ /**
210
+ * Run gateway_stop hook.
211
+ * Runs in parallel (fire-and-forget).
212
+ */
213
+ async function runGatewayStop(event, ctx) {
214
+ return runVoidHook("gateway_stop", event, ctx);
215
+ }
216
+ /**
217
+ * Check if any hooks are registered for a given hook name.
218
+ */
219
+ function hasHooks(hookName) {
220
+ return registry.typedHooks.some((h) => h.hookName === hookName);
221
+ }
222
+ /**
223
+ * Get count of registered hooks for a given hook name.
224
+ */
225
+ function getHookCount(hookName) {
226
+ return registry.typedHooks.filter((h) => h.hookName === hookName).length;
227
+ }
228
+ return {
229
+ runBeforeAgentStart,
230
+ runAgentEnd,
231
+ runBeforeCompaction,
232
+ runAfterCompaction,
233
+ runMessageReceived,
234
+ runMessageSending,
235
+ runMessageSent,
236
+ runBeforeToolCall,
237
+ runAfterToolCall,
238
+ runToolResultPersist,
239
+ runSessionStart,
240
+ runSessionEnd,
241
+ runGatewayStart,
242
+ runGatewayStop,
243
+ hasHooks,
244
+ getHookCount
245
+ };
246
+ }
247
+
248
+ //#endregion
249
+ //#region src/plugins/hook-runner-global.ts
250
+ const log = createSubsystemLogger("plugins");
251
+ let globalHookRunner = null;
252
+ let globalRegistry = null;
253
+ /**
254
+ * Initialize the global hook runner with a plugin registry.
255
+ * Called once when plugins are loaded during gateway startup.
256
+ */
257
+ function initializeGlobalHookRunner(registry) {
258
+ globalRegistry = registry;
259
+ globalHookRunner = createHookRunner(registry, {
260
+ logger: {
261
+ debug: (msg) => log.debug(msg),
262
+ warn: (msg) => log.warn(msg),
263
+ error: (msg) => log.error(msg)
264
+ },
265
+ catchErrors: true
266
+ });
267
+ const hookCount = registry.hooks.length;
268
+ if (hookCount > 0) log.info(`hook runner initialized with ${hookCount} registered hooks`);
269
+ }
270
+ /**
271
+ * Get the global hook runner.
272
+ * Returns null if plugins haven't been loaded yet.
273
+ */
274
+ function getGlobalHookRunner() {
275
+ return globalHookRunner;
276
+ }
277
+
23
278
  //#endregion
24
279
  //#region src/markdown/fences.ts
25
280
  function parseFenceSpans(buffer) {
@@ -364,250 +619,35 @@ function resolveMarkdownTableMode(params) {
364
619
  }
365
620
 
366
621
  //#endregion
367
- //#region src/infra/net/fetch-guard.ts
368
- const DEFAULT_MAX_REDIRECTS = 3;
369
- function isRedirectStatus(status) {
370
- return status === 301 || status === 302 || status === 303 || status === 307 || status === 308;
371
- }
372
- function buildAbortSignal(params) {
373
- const { timeoutMs, signal } = params;
374
- if (!timeoutMs && !signal) return {
375
- signal: void 0,
376
- cleanup: () => {}
377
- };
378
- if (!timeoutMs) return {
379
- signal,
380
- cleanup: () => {}
381
- };
382
- const controller = new AbortController();
383
- const timeoutId = setTimeout(() => controller.abort(), timeoutMs);
384
- const onAbort = () => controller.abort();
385
- if (signal) if (signal.aborted) controller.abort();
386
- else signal.addEventListener("abort", onAbort, { once: true });
387
- const cleanup = () => {
388
- clearTimeout(timeoutId);
389
- if (signal) signal.removeEventListener("abort", onAbort);
390
- };
391
- return {
392
- signal: controller.signal,
393
- cleanup
394
- };
395
- }
396
- async function fetchWithSsrFGuard(params) {
397
- const fetcher = params.fetchImpl ?? globalThis.fetch;
398
- if (!fetcher) throw new Error("fetch is not available");
399
- const maxRedirects = typeof params.maxRedirects === "number" && Number.isFinite(params.maxRedirects) ? Math.max(0, Math.floor(params.maxRedirects)) : DEFAULT_MAX_REDIRECTS;
400
- const { signal, cleanup } = buildAbortSignal({
401
- timeoutMs: params.timeoutMs,
402
- signal: params.signal
403
- });
404
- let released = false;
405
- const release = async (dispatcher) => {
406
- if (released) return;
407
- released = true;
408
- cleanup();
409
- await closeDispatcher(dispatcher ?? void 0);
410
- };
411
- const visited = /* @__PURE__ */ new Set();
412
- let currentUrl = params.url;
413
- let redirectCount = 0;
414
- while (true) {
415
- let parsedUrl;
416
- try {
417
- parsedUrl = new URL(currentUrl);
418
- } catch {
419
- await release();
420
- throw new Error("Invalid URL: must be http or https");
421
- }
422
- if (!["http:", "https:"].includes(parsedUrl.protocol)) {
423
- await release();
424
- throw new Error("Invalid URL: must be http or https");
425
- }
426
- let dispatcher = null;
427
- try {
428
- const pinned = Boolean(params.policy?.allowPrivateNetwork || params.policy?.allowedHostnames?.length) ? await resolvePinnedHostnameWithPolicy(parsedUrl.hostname, {
429
- lookupFn: params.lookupFn,
430
- policy: params.policy
431
- }) : await resolvePinnedHostname(parsedUrl.hostname, params.lookupFn);
432
- if (params.pinDns !== false) dispatcher = createPinnedDispatcher(pinned);
433
- const init = {
434
- ...params.init ? { ...params.init } : {},
435
- redirect: "manual",
436
- ...dispatcher ? { dispatcher } : {},
437
- ...signal ? { signal } : {}
438
- };
439
- const response = await fetcher(parsedUrl.toString(), init);
440
- if (isRedirectStatus(response.status)) {
441
- const location = response.headers.get("location");
442
- if (!location) {
443
- await release(dispatcher);
444
- throw new Error(`Redirect missing location header (${response.status})`);
445
- }
446
- redirectCount += 1;
447
- if (redirectCount > maxRedirects) {
448
- await release(dispatcher);
449
- throw new Error(`Too many redirects (limit: ${maxRedirects})`);
450
- }
451
- const nextUrl = new URL(location, parsedUrl).toString();
452
- if (visited.has(nextUrl)) {
453
- await release(dispatcher);
454
- throw new Error("Redirect loop detected");
455
- }
456
- visited.add(nextUrl);
457
- response.body?.cancel();
458
- await closeDispatcher(dispatcher);
459
- currentUrl = nextUrl;
460
- continue;
461
- }
462
- return {
463
- response,
464
- finalUrl: currentUrl,
465
- release: async () => release(dispatcher)
466
- };
467
- } catch (err) {
468
- await release(dispatcher);
469
- throw err;
470
- }
471
- }
472
- }
473
-
474
- //#endregion
475
- //#region src/media/fetch.ts
476
- var MediaFetchError = class extends Error {
477
- constructor(code, message) {
478
- super(message);
479
- this.code = code;
480
- this.name = "MediaFetchError";
481
- }
482
- };
483
- function stripQuotes(value) {
484
- return value.replace(/^["']|["']$/g, "");
485
- }
486
- function parseContentDispositionFileName(header) {
487
- if (!header) return;
488
- const starMatch = /filename\*\s*=\s*([^;]+)/i.exec(header);
489
- if (starMatch?.[1]) {
490
- const cleaned = stripQuotes(starMatch[1].trim());
491
- const encoded = cleaned.split("''").slice(1).join("''") || cleaned;
492
- try {
493
- return path.basename(decodeURIComponent(encoded));
494
- } catch {
495
- return path.basename(encoded);
496
- }
497
- }
498
- const match = /filename\s*=\s*([^;]+)/i.exec(header);
499
- if (match?.[1]) return path.basename(stripQuotes(match[1].trim()));
622
+ //#region src/web/media.ts
623
+ function getDefaultLocalRoots() {
624
+ const home = os.homedir();
625
+ return [
626
+ os.tmpdir(),
627
+ path.join(home, ".openclaw", "media"),
628
+ path.join(home, ".openclaw", "agents")
629
+ ];
500
630
  }
501
- async function readErrorBodySnippet(res, maxChars = 200) {
631
+ async function assertLocalMediaAllowed(mediaPath, localRoots) {
632
+ if (localRoots === "any") return;
633
+ const roots = localRoots ?? getDefaultLocalRoots();
634
+ let resolved;
502
635
  try {
503
- const text = await res.text();
504
- if (!text) return;
505
- const collapsed = text.replace(/\s+/g, " ").trim();
506
- if (!collapsed) return;
507
- if (collapsed.length <= maxChars) return collapsed;
508
- return `${collapsed.slice(0, maxChars)}…`;
636
+ resolved = await fs.realpath(mediaPath);
509
637
  } catch {
510
- return;
638
+ resolved = path.resolve(mediaPath);
511
639
  }
512
- }
513
- async function fetchRemoteMedia(options) {
514
- const { url, fetchImpl, filePathHint, maxBytes, maxRedirects, ssrfPolicy, lookupFn } = options;
515
- let res;
516
- let finalUrl = url;
517
- let release = null;
518
- try {
519
- const result = await fetchWithSsrFGuard({
520
- url,
521
- fetchImpl,
522
- maxRedirects,
523
- policy: ssrfPolicy,
524
- lookupFn
525
- });
526
- res = result.response;
527
- finalUrl = result.finalUrl;
528
- release = result.release;
529
- } catch (err) {
530
- throw new MediaFetchError("fetch_failed", `Failed to fetch media from ${url}: ${String(err)}`);
531
- }
532
- try {
533
- if (!res.ok) {
534
- const statusText = res.statusText ? ` ${res.statusText}` : "";
535
- const redirected = finalUrl !== url ? ` (redirected to ${finalUrl})` : "";
536
- let detail = `HTTP ${res.status}${statusText}`;
537
- if (!res.body) detail = `HTTP ${res.status}${statusText}; empty response body`;
538
- else {
539
- const snippet = await readErrorBodySnippet(res);
540
- if (snippet) detail += `; body: ${snippet}`;
541
- }
542
- throw new MediaFetchError("http_error", `Failed to fetch media from ${url}${redirected}: ${detail}`);
543
- }
544
- const contentLength = res.headers.get("content-length");
545
- if (maxBytes && contentLength) {
546
- const length = Number(contentLength);
547
- if (Number.isFinite(length) && length > maxBytes) throw new MediaFetchError("max_bytes", `Failed to fetch media from ${url}: content length ${length} exceeds maxBytes ${maxBytes}`);
548
- }
549
- const buffer = maxBytes ? await readResponseWithLimit(res, maxBytes) : Buffer.from(await res.arrayBuffer());
550
- let fileNameFromUrl;
640
+ for (const root of roots) {
641
+ let resolvedRoot;
551
642
  try {
552
- const parsed = new URL(finalUrl);
553
- fileNameFromUrl = path.basename(parsed.pathname) || void 0;
554
- } catch {}
555
- const headerFileName = parseContentDispositionFileName(res.headers.get("content-disposition"));
556
- let fileName = headerFileName || fileNameFromUrl || (filePathHint ? path.basename(filePathHint) : void 0);
557
- const filePathForMime = headerFileName && path.extname(headerFileName) ? headerFileName : filePathHint ?? finalUrl;
558
- const contentType = await detectMime({
559
- buffer,
560
- headerMime: res.headers.get("content-type"),
561
- filePath: filePathForMime
562
- });
563
- if (fileName && !path.extname(fileName) && contentType) {
564
- const ext = extensionForMime(contentType);
565
- if (ext) fileName = `${fileName}${ext}`;
566
- }
567
- return {
568
- buffer,
569
- contentType: contentType ?? void 0,
570
- fileName
571
- };
572
- } finally {
573
- if (release) await release();
574
- }
575
- }
576
- async function readResponseWithLimit(res, maxBytes) {
577
- const body = res.body;
578
- if (!body || typeof body.getReader !== "function") {
579
- const fallback = Buffer.from(await res.arrayBuffer());
580
- if (fallback.length > maxBytes) throw new MediaFetchError("max_bytes", `Failed to fetch media from ${res.url || "response"}: payload exceeds maxBytes ${maxBytes}`);
581
- return fallback;
582
- }
583
- const reader = body.getReader();
584
- const chunks = [];
585
- let total = 0;
586
- try {
587
- while (true) {
588
- const { done, value } = await reader.read();
589
- if (done) break;
590
- if (value?.length) {
591
- total += value.length;
592
- if (total > maxBytes) {
593
- try {
594
- await reader.cancel();
595
- } catch {}
596
- throw new MediaFetchError("max_bytes", `Failed to fetch media from ${res.url || "response"}: payload exceeds maxBytes ${maxBytes}`);
597
- }
598
- chunks.push(value);
599
- }
643
+ resolvedRoot = await fs.realpath(root);
644
+ } catch {
645
+ resolvedRoot = path.resolve(root);
600
646
  }
601
- } finally {
602
- try {
603
- reader.releaseLock();
604
- } catch {}
647
+ if (resolved === resolvedRoot || resolved.startsWith(resolvedRoot + path.sep)) return;
605
648
  }
606
- return Buffer.concat(chunks.map((chunk) => Buffer.from(chunk)), total);
649
+ throw new Error(`Local media path is not under an allowed directory: ${mediaPath}`);
607
650
  }
608
-
609
- //#endregion
610
- //#region src/web/media.ts
611
651
  const HEIC_MIME_RE = /^image\/hei[cf]$/i;
612
652
  const HEIC_EXT_RE = /\.(heic|heif)$/i;
613
653
  const MB$1 = 1024 * 1024;
@@ -666,7 +706,7 @@ async function optimizeImageWithFallback(params) {
666
706
  };
667
707
  }
668
708
  async function loadWebMediaInternal(mediaUrl, options = {}) {
669
- const { maxBytes, optimizeImages = true, ssrfPolicy } = options;
709
+ const { maxBytes, optimizeImages = true, ssrfPolicy, localRoots } = options;
670
710
  if (mediaUrl.startsWith("file://")) try {
671
711
  mediaUrl = fileURLToPath(mediaUrl);
672
712
  } catch {
@@ -734,6 +774,7 @@ async function loadWebMediaInternal(mediaUrl, options = {}) {
734
774
  });
735
775
  }
736
776
  if (mediaUrl.startsWith("~")) mediaUrl = resolveUserPath(mediaUrl);
777
+ await assertLocalMediaAllowed(mediaUrl, localRoots);
737
778
  const data = await fs.readFile(mediaUrl);
738
779
  const mime = await detectMime({
739
780
  buffer: data,
@@ -756,14 +797,16 @@ async function loadWebMedia(mediaUrl, maxBytes, options) {
756
797
  return await loadWebMediaInternal(mediaUrl, {
757
798
  maxBytes,
758
799
  optimizeImages: true,
759
- ssrfPolicy: options?.ssrfPolicy
800
+ ssrfPolicy: options?.ssrfPolicy,
801
+ localRoots: options?.localRoots
760
802
  });
761
803
  }
762
804
  async function loadWebMediaRaw(mediaUrl, maxBytes, options) {
763
805
  return await loadWebMediaInternal(mediaUrl, {
764
806
  maxBytes,
765
807
  optimizeImages: false,
766
- ssrfPolicy: options?.ssrfPolicy
808
+ ssrfPolicy: options?.ssrfPolicy,
809
+ localRoots: options?.localRoots
767
810
  });
768
811
  }
769
812
  async function optimizeImageToJpeg(buffer, maxBytes, opts = {}) {
@@ -1206,8 +1249,10 @@ function renderTokens(tokens, state) {
1206
1249
  break;
1207
1250
  case "blockquote_open":
1208
1251
  if (state.blockquotePrefix) state.text += state.blockquotePrefix;
1252
+ openStyle(state, "blockquote");
1209
1253
  break;
1210
1254
  case "blockquote_close":
1255
+ closeStyle(state, "blockquote");
1211
1256
  state.text += "\n";
1212
1257
  break;
1213
1258
  case "bullet_list_open":
@@ -1438,31 +1483,6 @@ function chunkMarkdownIR(ir, limit) {
1438
1483
  return results;
1439
1484
  }
1440
1485
 
1441
- //#endregion
1442
- //#region src/utils/fetch-timeout.ts
1443
- /**
1444
- * Fetch wrapper that adds timeout support via AbortController.
1445
- *
1446
- * @param url - The URL to fetch
1447
- * @param init - RequestInit options (headers, method, body, etc.)
1448
- * @param timeoutMs - Timeout in milliseconds
1449
- * @param fetchFn - The fetch implementation to use (defaults to global fetch)
1450
- * @returns The fetch Response
1451
- * @throws AbortError if the request times out
1452
- */
1453
- async function fetchWithTimeout(url, init, timeoutMs, fetchFn = fetch) {
1454
- const controller = new AbortController();
1455
- const timer = setTimeout(() => controller.abort(), Math.max(1, timeoutMs));
1456
- try {
1457
- return await fetchFn(url, {
1458
- ...init,
1459
- signal: controller.signal
1460
- });
1461
- } finally {
1462
- clearTimeout(timer);
1463
- }
1464
- }
1465
-
1466
1486
  //#endregion
1467
1487
  //#region src/infra/fetch.ts
1468
1488
  function withDuplex(init, input) {
@@ -1580,12 +1600,20 @@ function normalizeMediaSource(src) {
1580
1600
  function cleanCandidate(raw) {
1581
1601
  return raw.replace(/^[`"'[{(]+/, "").replace(/[`"'\\})\],]+$/, "");
1582
1602
  }
1603
+ const WINDOWS_DRIVE_RE = /^[a-zA-Z]:[\\/]/;
1604
+ const SCHEME_RE = /^[a-zA-Z][a-zA-Z0-9+.-]*:/;
1605
+ const HAS_FILE_EXT = /\.\w{1,10}$/;
1606
+ function isLikelyLocalPath(candidate) {
1607
+ return candidate.startsWith("/") || candidate.startsWith("./") || candidate.startsWith("../") || candidate.startsWith("~") || WINDOWS_DRIVE_RE.test(candidate) || candidate.startsWith("\\\\") || !SCHEME_RE.test(candidate) && (candidate.includes("/") || candidate.includes("\\"));
1608
+ }
1583
1609
  function isValidMedia(candidate, opts) {
1584
1610
  if (!candidate) return false;
1585
1611
  if (candidate.length > 4096) return false;
1586
1612
  if (!opts?.allowSpaces && /\s/.test(candidate)) return false;
1587
1613
  if (/^https?:\/\//i.test(candidate)) return true;
1588
- return candidate.startsWith("./") && !candidate.includes("..");
1614
+ if (isLikelyLocalPath(candidate)) return true;
1615
+ if (opts?.allowBareFilename && !SCHEME_RE.test(candidate) && HAS_FILE_EXT.test(candidate)) return true;
1616
+ return false;
1589
1617
  }
1590
1618
  function unwrapQuoted(value) {
1591
1619
  const trimmed = value.trim();
@@ -1647,7 +1675,7 @@ function splitMediaFromOutput(raw) {
1647
1675
  } else invalidParts.push(part);
1648
1676
  }
1649
1677
  const trimmedPayload = payloadValue.trim();
1650
- const looksLikeLocalPath = trimmedPayload.startsWith("/") || trimmedPayload.startsWith("./") || trimmedPayload.startsWith("../") || trimmedPayload.startsWith("~") || trimmedPayload.startsWith("file://");
1678
+ const looksLikeLocalPath = isLikelyLocalPath(trimmedPayload) || trimmedPayload.startsWith("file://");
1651
1679
  if (!unwrapped && validCount === 1 && invalidParts.length > 0 && /\s/.test(payloadValue) && looksLikeLocalPath) {
1652
1680
  const fallback = normalizeMediaSource(cleanCandidate(payloadValue));
1653
1681
  if (isValidMedia(fallback, { allowSpaces: true })) {
@@ -1660,7 +1688,10 @@ function splitMediaFromOutput(raw) {
1660
1688
  }
1661
1689
  if (!hasValidMedia) {
1662
1690
  const fallback = normalizeMediaSource(cleanCandidate(payloadValue));
1663
- if (isValidMedia(fallback, { allowSpaces: true })) {
1691
+ if (isValidMedia(fallback, {
1692
+ allowSpaces: true,
1693
+ allowBareFilename: true
1694
+ })) {
1664
1695
  media.push(fallback);
1665
1696
  hasValidMedia = true;
1666
1697
  foundMediaToken = true;
@@ -1669,7 +1700,8 @@ function splitMediaFromOutput(raw) {
1669
1700
  }
1670
1701
  if (hasValidMedia) {
1671
1702
  if (invalidParts.length > 0) pieces.push(invalidParts.join(" "));
1672
- } else pieces.push(match[0]);
1703
+ } else if (looksLikeLocalPath) foundMediaToken = true;
1704
+ else pieces.push(match[0]);
1673
1705
  cursor = start + match[0].length;
1674
1706
  }
1675
1707
  pieces.push(line.slice(cursor));
@@ -1745,7 +1777,7 @@ function normalizeChannelTargetInput(raw) {
1745
1777
  function normalizeTargetForProvider(provider, raw) {
1746
1778
  if (!raw) return;
1747
1779
  const providerId = normalizeChannelId(provider);
1748
- return ((providerId ? getChannelPlugin(providerId) : void 0)?.messaging?.normalizeTarget?.(raw) ?? (raw.trim().toLowerCase() || void 0)) || void 0;
1780
+ return ((providerId ? getChannelPlugin(providerId) : void 0)?.messaging?.normalizeTarget?.(raw) ?? (raw.trim() || void 0)) || void 0;
1749
1781
  }
1750
1782
  function buildTargetResolverSignature(channel) {
1751
1783
  const resolver = getChannelPlugin(channel)?.messaging?.targetResolver;
@@ -2560,23 +2592,80 @@ async function deliverOutboundPayloads(params) {
2560
2592
  })
2561
2593
  };
2562
2594
  };
2563
- const normalizedPayloads = normalizeReplyPayloadsForDelivery(payloads);
2595
+ const normalizeWhatsAppPayload = (payload) => {
2596
+ const hasMedia = Boolean(payload.mediaUrl) || (payload.mediaUrls?.length ?? 0) > 0;
2597
+ const normalizedText = (typeof payload.text === "string" ? payload.text : "").replace(/^(?:[ \t]*\r?\n)+/, "");
2598
+ if (!normalizedText.trim()) {
2599
+ if (!hasMedia) return null;
2600
+ return {
2601
+ ...payload,
2602
+ text: ""
2603
+ };
2604
+ }
2605
+ return {
2606
+ ...payload,
2607
+ text: normalizedText
2608
+ };
2609
+ };
2610
+ const normalizedPayloads = normalizeReplyPayloadsForDelivery(payloads).flatMap((payload) => {
2611
+ if (channel !== "whatsapp") return [payload];
2612
+ const normalized = normalizeWhatsAppPayload(payload);
2613
+ return normalized ? [normalized] : [];
2614
+ });
2615
+ const hookRunner = getGlobalHookRunner();
2564
2616
  for (const payload of normalizedPayloads) {
2565
2617
  const payloadSummary = {
2566
2618
  text: payload.text ?? "",
2567
2619
  mediaUrls: payload.mediaUrls ?? (payload.mediaUrl ? [payload.mediaUrl] : []),
2568
2620
  channelData: payload.channelData
2569
2621
  };
2622
+ const emitMessageSent = (success, error) => {
2623
+ if (!hookRunner?.hasHooks("message_sent")) return;
2624
+ hookRunner.runMessageSent({
2625
+ to,
2626
+ content: payloadSummary.text,
2627
+ success,
2628
+ ...error ? { error } : {}
2629
+ }, {
2630
+ channelId: channel,
2631
+ accountId: accountId ?? void 0
2632
+ }).catch(() => {});
2633
+ };
2570
2634
  try {
2571
2635
  throwIfAborted(abortSignal);
2636
+ let effectivePayload = payload;
2637
+ if (hookRunner?.hasHooks("message_sending")) try {
2638
+ const sendingResult = await hookRunner.runMessageSending({
2639
+ to,
2640
+ content: payloadSummary.text,
2641
+ metadata: {
2642
+ channel,
2643
+ accountId,
2644
+ mediaUrls: payloadSummary.mediaUrls
2645
+ }
2646
+ }, {
2647
+ channelId: channel,
2648
+ accountId: accountId ?? void 0
2649
+ });
2650
+ if (sendingResult?.cancel) continue;
2651
+ if (sendingResult?.content != null) {
2652
+ effectivePayload = {
2653
+ ...payload,
2654
+ text: sendingResult.content
2655
+ };
2656
+ payloadSummary.text = sendingResult.content;
2657
+ }
2658
+ } catch {}
2572
2659
  params.onPayload?.(payloadSummary);
2573
- if (handler.sendPayload && payload.channelData) {
2574
- results.push(await handler.sendPayload(payload));
2660
+ if (handler.sendPayload && effectivePayload.channelData) {
2661
+ results.push(await handler.sendPayload(effectivePayload));
2662
+ emitMessageSent(true);
2575
2663
  continue;
2576
2664
  }
2577
2665
  if (payloadSummary.mediaUrls.length === 0) {
2578
2666
  if (isSignalChannel) await sendSignalTextChunks(payloadSummary.text);
2579
2667
  else await sendTextChunks(payloadSummary.text);
2668
+ emitMessageSent(true);
2580
2669
  continue;
2581
2670
  }
2582
2671
  let first = true;
@@ -2587,7 +2676,9 @@ async function deliverOutboundPayloads(params) {
2587
2676
  if (isSignalChannel) results.push(await sendSignalMedia(caption, url));
2588
2677
  else results.push(await handler.sendMedia(caption, url));
2589
2678
  }
2679
+ emitMessageSent(true);
2590
2680
  } catch (err) {
2681
+ emitMessageSent(false, err instanceof Error ? err.message : String(err));
2591
2682
  if (!params.bestEffort) throw err;
2592
2683
  params.onError?.(err, payloadSummary);
2593
2684
  }
@@ -2607,4 +2698,4 @@ async function deliverOutboundPayloads(params) {
2607
2698
  }
2608
2699
 
2609
2700
  //#endregion
2610
- export { chunkMarkdownIR as A, chunkMarkdownText as B, throwIfAborted as C, resolveFetch as D, parseInlineDirectives as E, MediaFetchError as F, resolveTextChunkLimit as G, chunkText as H, fetchRemoteMedia as I, parseFenceSpans as J, findFenceSpanAt as K, fetchWithSsrFGuard as L, markdownToIRWithMeta as M, loadWebMedia as N, wrapFetchWithAbortSignal as O, loadWebMediaRaw as P, resolveMarkdownTableMode as R, normalizeTargetForProvider as S, splitMediaFromOutput as T, chunkTextWithMode as U, chunkMarkdownTextWithMode as V, resolveChunkMode as W, SILENT_REPLY_TOKEN as X, HEARTBEAT_TOKEN as Y, isSilentReplyText as Z, signalCheck as _, normalizeOutboundPayloadsForJson as a, buildTargetResolverSignature as b, applyReplyThreading as c, shouldSuppressMessagingToolReplies as d, createReplyToModeFilterForChannel as f, sendTypingSignal as g, sendReadReceiptSignal as h, normalizeOutboundPayloads as i, markdownToIR as j, fetchWithTimeout as k, filterMessagingToolDuplicates as l, sendMessageSignal as m, deliver_exports as n, normalizeReplyPayloadsForDelivery as o, resolveReplyToMode as p, isSafeFenceBreak as q, formatOutboundPayloadLog as r, applyReplyTagsToPayload as s, deliverOutboundPayloads as t, isRenderablePayload as u, signalRpcRequest as v, parseReplyDirectives as w, normalizeChannelTargetInput as x, streamSignalEvents as y, chunkByNewline as z };
2701
+ export { markdownToIR as A, resolveChunkMode as B, throwIfAborted as C, resolveFetch as D, parseInlineDirectives as E, chunkByNewline as F, getGlobalHookRunner as G, findFenceSpanAt as H, chunkMarkdownText as I, SILENT_REPLY_TOKEN as J, initializeGlobalHookRunner as K, chunkMarkdownTextWithMode as L, loadWebMedia as M, loadWebMediaRaw as N, wrapFetchWithAbortSignal as O, resolveMarkdownTableMode as P, chunkText as R, normalizeTargetForProvider as S, splitMediaFromOutput as T, isSafeFenceBreak as U, resolveTextChunkLimit as V, parseFenceSpans as W, isSilentReplyText as Y, signalCheck as _, normalizeOutboundPayloadsForJson as a, buildTargetResolverSignature as b, applyReplyThreading as c, shouldSuppressMessagingToolReplies as d, createReplyToModeFilterForChannel as f, sendTypingSignal as g, sendReadReceiptSignal as h, normalizeOutboundPayloads as i, markdownToIRWithMeta as j, chunkMarkdownIR as k, filterMessagingToolDuplicates as l, sendMessageSignal as m, deliver_exports as n, normalizeReplyPayloadsForDelivery as o, resolveReplyToMode as p, HEARTBEAT_TOKEN as q, formatOutboundPayloadLog as r, applyReplyTagsToPayload as s, deliverOutboundPayloads as t, isRenderablePayload as u, signalRpcRequest as v, parseReplyDirectives as w, normalizeChannelTargetInput as x, streamSignalEvents as y, chunkTextWithMode as z };