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
@@ -254,9 +254,20 @@ function createMockRequest(
254
254
  body: unknown,
255
255
  headers: Record<string, string> = {},
256
256
  ): IncomingMessage {
257
+ const parsedUrl = new URL(url, "http://localhost");
258
+ const hasAuthQuery = parsedUrl.searchParams.has("guid") || parsedUrl.searchParams.has("password");
259
+ const hasAuthHeader =
260
+ headers["x-guid"] !== undefined ||
261
+ headers["x-password"] !== undefined ||
262
+ headers["x-bluebubbles-guid"] !== undefined ||
263
+ headers.authorization !== undefined;
264
+ if (!hasAuthQuery && !hasAuthHeader) {
265
+ parsedUrl.searchParams.set("password", "test-password");
266
+ }
267
+
257
268
  const req = new EventEmitter() as IncomingMessage;
258
269
  req.method = method;
259
- req.url = url;
270
+ req.url = `${parsedUrl.pathname}${parsedUrl.search}`;
260
271
  req.headers = headers;
261
272
  (req as unknown as { socket: { remoteAddress: string } }).socket = { remoteAddress: "127.0.0.1" };
262
273
 
@@ -546,40 +557,41 @@ describe("BlueBubbles webhook monitor", () => {
546
557
  expect(res.statusCode).toBe(401);
547
558
  });
548
559
 
549
- it("allows localhost requests without authentication", async () => {
560
+ it("requires authentication for loopback requests when password is configured", async () => {
550
561
  const account = createMockAccount({ password: "secret-token" });
551
562
  const config: OpenClawConfig = {};
552
563
  const core = createMockRuntime();
553
564
  setBlueBubblesRuntime(core);
565
+ for (const remoteAddress of ["127.0.0.1", "::1", "::ffff:127.0.0.1"]) {
566
+ const req = createMockRequest("POST", "/bluebubbles-webhook", {
567
+ type: "new-message",
568
+ data: {
569
+ text: "hello",
570
+ handle: { address: "+15551234567" },
571
+ isGroup: false,
572
+ isFromMe: false,
573
+ guid: "msg-1",
574
+ },
575
+ });
576
+ (req as unknown as { socket: { remoteAddress: string } }).socket = {
577
+ remoteAddress,
578
+ };
554
579
 
555
- const req = createMockRequest("POST", "/bluebubbles-webhook", {
556
- type: "new-message",
557
- data: {
558
- text: "hello",
559
- handle: { address: "+15551234567" },
560
- isGroup: false,
561
- isFromMe: false,
562
- guid: "msg-1",
563
- },
564
- });
565
- // Localhost address
566
- (req as unknown as { socket: { remoteAddress: string } }).socket = {
567
- remoteAddress: "127.0.0.1",
568
- };
569
-
570
- unregister = registerBlueBubblesWebhookTarget({
571
- account,
572
- config,
573
- runtime: { log: vi.fn(), error: vi.fn() },
574
- core,
575
- path: "/bluebubbles-webhook",
576
- });
580
+ const loopbackUnregister = registerBlueBubblesWebhookTarget({
581
+ account,
582
+ config,
583
+ runtime: { log: vi.fn(), error: vi.fn() },
584
+ core,
585
+ path: "/bluebubbles-webhook",
586
+ });
577
587
 
578
- const res = createMockResponse();
579
- const handled = await handleBlueBubblesWebhookRequest(req, res);
588
+ const res = createMockResponse();
589
+ const handled = await handleBlueBubblesWebhookRequest(req, res);
590
+ expect(handled).toBe(true);
591
+ expect(res.statusCode).toBe(401);
580
592
 
581
- expect(handled).toBe(true);
582
- expect(res.statusCode).toBe(200);
593
+ loopbackUnregister();
594
+ }
583
595
  });
584
596
 
585
597
  it("ignores unregistered webhook paths", async () => {
@@ -1533,10 +1533,6 @@ export async function handleBlueBubblesWebhookRequest(
1533
1533
  if (guid && guid.trim() === token) {
1534
1534
  return true;
1535
1535
  }
1536
- const remote = req.socket?.remoteAddress ?? "";
1537
- if (remote === "127.0.0.1" || remote === "::1" || remote === "::ffff:127.0.0.1") {
1538
- return true;
1539
- }
1540
1536
  return false;
1541
1537
  });
1542
1538
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openclaw/copilot-proxy",
3
- "version": "2026.2.9",
3
+ "version": "2026.2.12",
4
4
  "private": true,
5
5
  "description": "OpenClaw Copilot Proxy provider plugin",
6
6
  "type": "module",
@@ -1,19 +1,19 @@
1
1
  {
2
2
  "name": "@openclaw/diagnostics-otel",
3
- "version": "2026.2.9",
3
+ "version": "2026.2.12",
4
4
  "description": "OpenClaw diagnostics OpenTelemetry exporter",
5
5
  "type": "module",
6
6
  "dependencies": {
7
7
  "@opentelemetry/api": "^1.9.0",
8
- "@opentelemetry/api-logs": "^0.211.0",
9
- "@opentelemetry/exporter-logs-otlp-http": "^0.211.0",
10
- "@opentelemetry/exporter-metrics-otlp-http": "^0.211.0",
11
- "@opentelemetry/exporter-trace-otlp-http": "^0.211.0",
12
- "@opentelemetry/resources": "^2.5.0",
13
- "@opentelemetry/sdk-logs": "^0.211.0",
14
- "@opentelemetry/sdk-metrics": "^2.5.0",
15
- "@opentelemetry/sdk-node": "^0.211.0",
16
- "@opentelemetry/sdk-trace-base": "^2.5.0",
8
+ "@opentelemetry/api-logs": "^0.212.0",
9
+ "@opentelemetry/exporter-logs-otlp-http": "^0.212.0",
10
+ "@opentelemetry/exporter-metrics-otlp-http": "^0.212.0",
11
+ "@opentelemetry/exporter-trace-otlp-http": "^0.212.0",
12
+ "@opentelemetry/resources": "^2.5.1",
13
+ "@opentelemetry/sdk-logs": "^0.212.0",
14
+ "@opentelemetry/sdk-metrics": "^2.5.1",
15
+ "@opentelemetry/sdk-node": "^0.212.0",
16
+ "@opentelemetry/sdk-trace-base": "^2.5.1",
17
17
  "@opentelemetry/semantic-conventions": "^1.39.0"
18
18
  },
19
19
  "devDependencies": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openclaw/discord",
3
- "version": "2026.2.9",
3
+ "version": "2026.2.12",
4
4
  "description": "OpenClaw Discord channel plugin",
5
5
  "type": "module",
6
6
  "devDependencies": {
@@ -1,16 +1,13 @@
1
1
  {
2
2
  "name": "@openclaw/feishu",
3
- "version": "2026.2.9",
3
+ "version": "2026.2.12",
4
4
  "description": "OpenClaw Feishu/Lark channel plugin (community maintained by @m1heng)",
5
5
  "type": "module",
6
6
  "dependencies": {
7
- "@larksuiteoapi/node-sdk": "^1.58.0",
7
+ "@larksuiteoapi/node-sdk": "^1.59.0",
8
8
  "@sinclair/typebox": "0.34.48",
9
9
  "zod": "^4.3.6"
10
10
  },
11
- "devDependencies": {
12
- "openclaw": "workspace:*"
13
- },
14
11
  "openclaw": {
15
12
  "extensions": [
16
13
  "./index.ts"
@@ -0,0 +1,64 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { parseFeishuMessageEvent } from "./bot.js";
3
+
4
+ // Helper to build a minimal FeishuMessageEvent for testing
5
+ function makeEvent(
6
+ chatType: "p2p" | "group",
7
+ mentions?: Array<{ key: string; name: string; id: { open_id?: string } }>,
8
+ ) {
9
+ return {
10
+ sender: {
11
+ sender_id: { user_id: "u1", open_id: "ou_sender" },
12
+ },
13
+ message: {
14
+ message_id: "msg_1",
15
+ chat_id: "oc_chat1",
16
+ chat_type: chatType,
17
+ message_type: "text",
18
+ content: JSON.stringify({ text: "hello" }),
19
+ mentions,
20
+ },
21
+ };
22
+ }
23
+
24
+ describe("parseFeishuMessageEvent – mentionedBot", () => {
25
+ const BOT_OPEN_ID = "ou_bot_123";
26
+
27
+ it("returns mentionedBot=false when there are no mentions", () => {
28
+ const event = makeEvent("group", []);
29
+ const ctx = parseFeishuMessageEvent(event as any, BOT_OPEN_ID);
30
+ expect(ctx.mentionedBot).toBe(false);
31
+ });
32
+
33
+ it("returns mentionedBot=true when bot is mentioned", () => {
34
+ const event = makeEvent("group", [
35
+ { key: "@_user_1", name: "Bot", id: { open_id: BOT_OPEN_ID } },
36
+ ]);
37
+ const ctx = parseFeishuMessageEvent(event as any, BOT_OPEN_ID);
38
+ expect(ctx.mentionedBot).toBe(true);
39
+ });
40
+
41
+ it("returns mentionedBot=false when only other users are mentioned", () => {
42
+ const event = makeEvent("group", [
43
+ { key: "@_user_1", name: "Alice", id: { open_id: "ou_alice" } },
44
+ ]);
45
+ const ctx = parseFeishuMessageEvent(event as any, BOT_OPEN_ID);
46
+ expect(ctx.mentionedBot).toBe(false);
47
+ });
48
+
49
+ it("returns mentionedBot=false when botOpenId is undefined (unknown bot)", () => {
50
+ const event = makeEvent("group", [
51
+ { key: "@_user_1", name: "Alice", id: { open_id: "ou_alice" } },
52
+ ]);
53
+ const ctx = parseFeishuMessageEvent(event as any, undefined);
54
+ expect(ctx.mentionedBot).toBe(false);
55
+ });
56
+
57
+ it("returns mentionedBot=false when botOpenId is empty string (probe failed)", () => {
58
+ const event = makeEvent("group", [
59
+ { key: "@_user_1", name: "Alice", id: { open_id: "ou_alice" } },
60
+ ]);
61
+ const ctx = parseFeishuMessageEvent(event as any, "");
62
+ expect(ctx.mentionedBot).toBe(false);
63
+ });
64
+ });
@@ -216,7 +216,7 @@ function parseMessageContent(content: string, messageType: string): string {
216
216
  function checkBotMentioned(event: FeishuMessageEvent, botOpenId?: string): boolean {
217
217
  const mentions = event.message.mentions ?? [];
218
218
  if (mentions.length === 0) return false;
219
- if (!botOpenId) return mentions.length > 0;
219
+ if (!botOpenId) return false;
220
220
  return mentions.some((m) => m.id.open_id === botOpenId);
221
221
  }
222
222
 
@@ -0,0 +1,48 @@
1
+ import type { OpenClawConfig } from "openclaw/plugin-sdk";
2
+ import { describe, expect, it, vi } from "vitest";
3
+
4
+ const probeFeishuMock = vi.hoisted(() => vi.fn());
5
+
6
+ vi.mock("./probe.js", () => ({
7
+ probeFeishu: probeFeishuMock,
8
+ }));
9
+
10
+ import { feishuPlugin } from "./channel.js";
11
+
12
+ describe("feishuPlugin.status.probeAccount", () => {
13
+ it("uses current account credentials for multi-account config", async () => {
14
+ const cfg = {
15
+ channels: {
16
+ feishu: {
17
+ enabled: true,
18
+ accounts: {
19
+ main: {
20
+ appId: "cli_main",
21
+ appSecret: "secret_main",
22
+ enabled: true,
23
+ },
24
+ },
25
+ },
26
+ },
27
+ } as OpenClawConfig;
28
+
29
+ const account = feishuPlugin.config.resolveAccount(cfg, "main");
30
+ probeFeishuMock.mockResolvedValueOnce({ ok: true, appId: "cli_main" });
31
+
32
+ const result = await feishuPlugin.status?.probeAccount?.({
33
+ account,
34
+ timeoutMs: 1_000,
35
+ cfg,
36
+ });
37
+
38
+ expect(probeFeishuMock).toHaveBeenCalledTimes(1);
39
+ expect(probeFeishuMock).toHaveBeenCalledWith(
40
+ expect.objectContaining({
41
+ accountId: "main",
42
+ appId: "cli_main",
43
+ appSecret: "secret_main",
44
+ }),
45
+ );
46
+ expect(result).toMatchObject({ ok: true, appId: "cli_main" });
47
+ });
48
+ });
@@ -321,9 +321,7 @@ export const feishuPlugin: ChannelPlugin<ResolvedFeishuAccount> = {
321
321
  probe: snapshot.probe,
322
322
  lastProbeAt: snapshot.lastProbeAt ?? null,
323
323
  }),
324
- probeAccount: async ({ account }) => {
325
- return await probeFeishu(account);
326
- },
324
+ probeAccount: async ({ account }) => await probeFeishu(account),
327
325
  buildAccountSnapshot: ({ account, runtime, probe }) => ({
328
326
  accountId: account.accountId,
329
327
  enabled: account.enabled,
@@ -36,6 +36,10 @@ const MarkdownConfigSchema = z
36
36
  // Message render mode: auto (default) = detect markdown, raw = plain text, card = always card
37
37
  const RenderModeSchema = z.enum(["auto", "raw", "card"]).optional();
38
38
 
39
+ // Streaming card mode: when enabled, card replies use Feishu's Card Kit streaming API
40
+ // for incremental text display with a "Thinking..." placeholder
41
+ const StreamingModeSchema = z.boolean().optional();
42
+
39
43
  const BlockStreamingCoalesceSchema = z
40
44
  .object({
41
45
  enabled: z.boolean().optional(),
@@ -142,6 +146,7 @@ export const FeishuAccountConfigSchema = z
142
146
  mediaMaxMb: z.number().positive().optional(),
143
147
  heartbeat: ChannelHeartbeatVisibilitySchema,
144
148
  renderMode: RenderModeSchema,
149
+ streaming: StreamingModeSchema, // Enable streaming card mode (default: true)
145
150
  tools: FeishuToolsConfigSchema,
146
151
  })
147
152
  .strict();
@@ -177,6 +182,7 @@ export const FeishuConfigSchema = z
177
182
  mediaMaxMb: z.number().positive().optional(),
178
183
  heartbeat: ChannelHeartbeatVisibilitySchema,
179
184
  renderMode: RenderModeSchema, // raw = plain text (default), card = interactive card with markdown
185
+ streaming: StreamingModeSchema, // Enable streaming card mode (default: true)
180
186
  tools: FeishuToolsConfigSchema,
181
187
  // Dynamic agent creation for DM users
182
188
  dynamicAgentCreation: DynamicAgentCreationSchema,
@@ -92,6 +92,14 @@ async function convertMarkdown(client: Lark.Client, markdown: string) {
92
92
  };
93
93
  }
94
94
 
95
+ function sortBlocksByFirstLevel(blocks: any[], firstLevelIds: string[]): any[] {
96
+ if (!firstLevelIds || firstLevelIds.length === 0) return blocks;
97
+ const sorted = firstLevelIds.map((id) => blocks.find((b) => b.block_id === id)).filter(Boolean);
98
+ const sortedIds = new Set(firstLevelIds);
99
+ const remaining = blocks.filter((b) => !sortedIds.has(b.block_id));
100
+ return [...sorted, ...remaining];
101
+ }
102
+
95
103
  /* eslint-disable @typescript-eslint/no-explicit-any -- SDK block types */
96
104
  async function insertBlocks(
97
105
  client: Lark.Client,
@@ -279,12 +287,13 @@ async function createDoc(client: Lark.Client, title: string, folderToken?: strin
279
287
  async function writeDoc(client: Lark.Client, docToken: string, markdown: string) {
280
288
  const deleted = await clearDocumentContent(client, docToken);
281
289
 
282
- const { blocks } = await convertMarkdown(client, markdown);
290
+ const { blocks, firstLevelBlockIds } = await convertMarkdown(client, markdown);
283
291
  if (blocks.length === 0) {
284
292
  return { success: true, blocks_deleted: deleted, blocks_added: 0, images_processed: 0 };
285
293
  }
294
+ const sortedBlocks = sortBlocksByFirstLevel(blocks, firstLevelBlockIds);
286
295
 
287
- const { children: inserted, skipped } = await insertBlocks(client, docToken, blocks);
296
+ const { children: inserted, skipped } = await insertBlocks(client, docToken, sortedBlocks);
288
297
  const imagesProcessed = await processImages(client, docToken, markdown, inserted);
289
298
 
290
299
  return {
@@ -299,12 +308,13 @@ async function writeDoc(client: Lark.Client, docToken: string, markdown: string)
299
308
  }
300
309
 
301
310
  async function appendDoc(client: Lark.Client, docToken: string, markdown: string) {
302
- const { blocks } = await convertMarkdown(client, markdown);
311
+ const { blocks, firstLevelBlockIds } = await convertMarkdown(client, markdown);
303
312
  if (blocks.length === 0) {
304
313
  throw new Error("Content is empty");
305
314
  }
315
+ const sortedBlocks = sortBlocksByFirstLevel(blocks, firstLevelBlockIds);
306
316
 
307
- const { children: inserted, skipped } = await insertBlocks(client, docToken, blocks);
317
+ const { children: inserted, skipped } = await insertBlocks(client, docToken, sortedBlocks);
308
318
  const imagesProcessed = await processImages(client, docToken, markdown, inserted);
309
319
 
310
320
  return {
@@ -0,0 +1,151 @@
1
+ import { beforeEach, describe, expect, it, vi } from "vitest";
2
+
3
+ const createFeishuClientMock = vi.hoisted(() => vi.fn());
4
+ const resolveFeishuAccountMock = vi.hoisted(() => vi.fn());
5
+ const normalizeFeishuTargetMock = vi.hoisted(() => vi.fn());
6
+ const resolveReceiveIdTypeMock = vi.hoisted(() => vi.fn());
7
+
8
+ const fileCreateMock = vi.hoisted(() => vi.fn());
9
+ const messageCreateMock = vi.hoisted(() => vi.fn());
10
+ const messageReplyMock = vi.hoisted(() => vi.fn());
11
+
12
+ vi.mock("./client.js", () => ({
13
+ createFeishuClient: createFeishuClientMock,
14
+ }));
15
+
16
+ vi.mock("./accounts.js", () => ({
17
+ resolveFeishuAccount: resolveFeishuAccountMock,
18
+ }));
19
+
20
+ vi.mock("./targets.js", () => ({
21
+ normalizeFeishuTarget: normalizeFeishuTargetMock,
22
+ resolveReceiveIdType: resolveReceiveIdTypeMock,
23
+ }));
24
+
25
+ import { sendMediaFeishu } from "./media.js";
26
+
27
+ describe("sendMediaFeishu msg_type routing", () => {
28
+ beforeEach(() => {
29
+ vi.clearAllMocks();
30
+
31
+ resolveFeishuAccountMock.mockReturnValue({
32
+ configured: true,
33
+ accountId: "main",
34
+ appId: "app_id",
35
+ appSecret: "app_secret",
36
+ domain: "feishu",
37
+ });
38
+
39
+ normalizeFeishuTargetMock.mockReturnValue("ou_target");
40
+ resolveReceiveIdTypeMock.mockReturnValue("open_id");
41
+
42
+ createFeishuClientMock.mockReturnValue({
43
+ im: {
44
+ file: {
45
+ create: fileCreateMock,
46
+ },
47
+ message: {
48
+ create: messageCreateMock,
49
+ reply: messageReplyMock,
50
+ },
51
+ },
52
+ });
53
+
54
+ fileCreateMock.mockResolvedValue({
55
+ code: 0,
56
+ data: { file_key: "file_key_1" },
57
+ });
58
+
59
+ messageCreateMock.mockResolvedValue({
60
+ code: 0,
61
+ data: { message_id: "msg_1" },
62
+ });
63
+
64
+ messageReplyMock.mockResolvedValue({
65
+ code: 0,
66
+ data: { message_id: "reply_1" },
67
+ });
68
+ });
69
+
70
+ it("uses msg_type=media for mp4", async () => {
71
+ await sendMediaFeishu({
72
+ cfg: {} as any,
73
+ to: "user:ou_target",
74
+ mediaBuffer: Buffer.from("video"),
75
+ fileName: "clip.mp4",
76
+ });
77
+
78
+ expect(fileCreateMock).toHaveBeenCalledWith(
79
+ expect.objectContaining({
80
+ data: expect.objectContaining({ file_type: "mp4" }),
81
+ }),
82
+ );
83
+
84
+ expect(messageCreateMock).toHaveBeenCalledWith(
85
+ expect.objectContaining({
86
+ data: expect.objectContaining({ msg_type: "media" }),
87
+ }),
88
+ );
89
+ });
90
+
91
+ it("uses msg_type=media for opus", async () => {
92
+ await sendMediaFeishu({
93
+ cfg: {} as any,
94
+ to: "user:ou_target",
95
+ mediaBuffer: Buffer.from("audio"),
96
+ fileName: "voice.opus",
97
+ });
98
+
99
+ expect(fileCreateMock).toHaveBeenCalledWith(
100
+ expect.objectContaining({
101
+ data: expect.objectContaining({ file_type: "opus" }),
102
+ }),
103
+ );
104
+
105
+ expect(messageCreateMock).toHaveBeenCalledWith(
106
+ expect.objectContaining({
107
+ data: expect.objectContaining({ msg_type: "media" }),
108
+ }),
109
+ );
110
+ });
111
+
112
+ it("uses msg_type=file for documents", async () => {
113
+ await sendMediaFeishu({
114
+ cfg: {} as any,
115
+ to: "user:ou_target",
116
+ mediaBuffer: Buffer.from("doc"),
117
+ fileName: "paper.pdf",
118
+ });
119
+
120
+ expect(fileCreateMock).toHaveBeenCalledWith(
121
+ expect.objectContaining({
122
+ data: expect.objectContaining({ file_type: "pdf" }),
123
+ }),
124
+ );
125
+
126
+ expect(messageCreateMock).toHaveBeenCalledWith(
127
+ expect.objectContaining({
128
+ data: expect.objectContaining({ msg_type: "file" }),
129
+ }),
130
+ );
131
+ });
132
+
133
+ it("uses msg_type=media when replying with mp4", async () => {
134
+ await sendMediaFeishu({
135
+ cfg: {} as any,
136
+ to: "user:ou_target",
137
+ mediaBuffer: Buffer.from("video"),
138
+ fileName: "reply.mp4",
139
+ replyToMessageId: "om_parent",
140
+ });
141
+
142
+ expect(messageReplyMock).toHaveBeenCalledWith(
143
+ expect.objectContaining({
144
+ path: { message_id: "om_parent" },
145
+ data: expect.objectContaining({ msg_type: "media" }),
146
+ }),
147
+ );
148
+
149
+ expect(messageCreateMock).not.toHaveBeenCalled();
150
+ });
151
+ });
@@ -210,15 +210,16 @@ export async function uploadImageFeishu(params: {
210
210
 
211
211
  const client = createFeishuClient(account);
212
212
 
213
- // SDK expects a Readable stream, not a Buffer
214
- // Use type assertion since SDK actually accepts any Readable at runtime
215
- const imageStream = typeof image === "string" ? fs.createReadStream(image) : Readable.from(image);
213
+ // SDK accepts Buffer directly or fs.ReadStream for file paths
214
+ // Using Readable.from(buffer) causes issues with form-data library
215
+ // See: https://github.com/larksuite/node-sdk/issues/121
216
+ const imageData = typeof image === "string" ? fs.createReadStream(image) : image;
216
217
 
217
218
  const response = await client.im.image.create({
218
219
  data: {
219
220
  image_type: imageType,
220
- // eslint-disable-next-line @typescript-eslint/no-explicit-any -- SDK stream type
221
- image: imageStream as any,
221
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any -- SDK accepts Buffer or ReadStream
222
+ image: imageData as any,
222
223
  },
223
224
  });
224
225
 
@@ -258,16 +259,17 @@ export async function uploadFileFeishu(params: {
258
259
 
259
260
  const client = createFeishuClient(account);
260
261
 
261
- // SDK expects a Readable stream, not a Buffer
262
- // Use type assertion since SDK actually accepts any Readable at runtime
263
- const fileStream = typeof file === "string" ? fs.createReadStream(file) : Readable.from(file);
262
+ // SDK accepts Buffer directly or fs.ReadStream for file paths
263
+ // Using Readable.from(buffer) causes issues with form-data library
264
+ // See: https://github.com/larksuite/node-sdk/issues/121
265
+ const fileData = typeof file === "string" ? fs.createReadStream(file) : file;
264
266
 
265
267
  const response = await client.im.file.create({
266
268
  data: {
267
269
  file_type: fileType,
268
270
  file_name: fileName,
269
- // eslint-disable-next-line @typescript-eslint/no-explicit-any -- SDK stream type
270
- file: fileStream as any,
271
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any -- SDK accepts Buffer or ReadStream
272
+ file: fileData as any,
271
273
  ...(duration !== undefined && { duration }),
272
274
  },
273
275
  });
@@ -357,10 +359,13 @@ export async function sendFileFeishu(params: {
357
359
  cfg: ClawdbotConfig;
358
360
  to: string;
359
361
  fileKey: string;
362
+ /** Use "media" for audio/video files, "file" for documents */
363
+ msgType?: "file" | "media";
360
364
  replyToMessageId?: string;
361
365
  accountId?: string;
362
366
  }): Promise<SendMediaResult> {
363
367
  const { cfg, to, fileKey, replyToMessageId, accountId } = params;
368
+ const msgType = params.msgType ?? "file";
364
369
  const account = resolveFeishuAccount({ cfg, accountId });
365
370
  if (!account.configured) {
366
371
  throw new Error(`Feishu account "${account.accountId}" not configured`);
@@ -380,7 +385,7 @@ export async function sendFileFeishu(params: {
380
385
  path: { message_id: replyToMessageId },
381
386
  data: {
382
387
  content,
383
- msg_type: "file",
388
+ msg_type: msgType,
384
389
  },
385
390
  });
386
391
 
@@ -399,7 +404,7 @@ export async function sendFileFeishu(params: {
399
404
  data: {
400
405
  receive_id: receiveId,
401
406
  content,
402
- msg_type: "file",
407
+ msg_type: msgType,
403
408
  },
404
409
  });
405
410
 
@@ -522,6 +527,15 @@ export async function sendMediaFeishu(params: {
522
527
  fileType,
523
528
  accountId,
524
529
  });
525
- return sendFileFeishu({ cfg, to, fileKey, replyToMessageId, accountId });
530
+ // Feishu requires msg_type "media" for audio/video, "file" for documents
531
+ const isMedia = fileType === "mp4" || fileType === "opus";
532
+ return sendFileFeishu({
533
+ cfg,
534
+ to,
535
+ fileKey,
536
+ msgType: isMedia ? "media" : "file",
537
+ replyToMessageId,
538
+ accountId,
539
+ });
526
540
  }
527
541
  }