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
@@ -0,0 +1,116 @@
1
+ import { beforeEach, describe, expect, it, vi } from "vitest";
2
+
3
+ const resolveFeishuAccountMock = vi.hoisted(() => vi.fn());
4
+ const getFeishuRuntimeMock = vi.hoisted(() => vi.fn());
5
+ const sendMessageFeishuMock = vi.hoisted(() => vi.fn());
6
+ const sendMarkdownCardFeishuMock = vi.hoisted(() => vi.fn());
7
+ const createFeishuClientMock = vi.hoisted(() => vi.fn());
8
+ const resolveReceiveIdTypeMock = vi.hoisted(() => vi.fn());
9
+ const createReplyDispatcherWithTypingMock = vi.hoisted(() => vi.fn());
10
+ const streamingInstances = vi.hoisted(() => [] as any[]);
11
+
12
+ vi.mock("./accounts.js", () => ({ resolveFeishuAccount: resolveFeishuAccountMock }));
13
+ vi.mock("./runtime.js", () => ({ getFeishuRuntime: getFeishuRuntimeMock }));
14
+ vi.mock("./send.js", () => ({
15
+ sendMessageFeishu: sendMessageFeishuMock,
16
+ sendMarkdownCardFeishu: sendMarkdownCardFeishuMock,
17
+ }));
18
+ vi.mock("./client.js", () => ({ createFeishuClient: createFeishuClientMock }));
19
+ vi.mock("./targets.js", () => ({ resolveReceiveIdType: resolveReceiveIdTypeMock }));
20
+ vi.mock("./streaming-card.js", () => ({
21
+ FeishuStreamingSession: class {
22
+ active = false;
23
+ start = vi.fn(async () => {
24
+ this.active = true;
25
+ });
26
+ update = vi.fn(async () => {});
27
+ close = vi.fn(async () => {
28
+ this.active = false;
29
+ });
30
+ isActive = vi.fn(() => this.active);
31
+
32
+ constructor() {
33
+ streamingInstances.push(this);
34
+ }
35
+ },
36
+ }));
37
+
38
+ import { createFeishuReplyDispatcher } from "./reply-dispatcher.js";
39
+
40
+ describe("createFeishuReplyDispatcher streaming behavior", () => {
41
+ beforeEach(() => {
42
+ vi.clearAllMocks();
43
+ streamingInstances.length = 0;
44
+
45
+ resolveFeishuAccountMock.mockReturnValue({
46
+ accountId: "main",
47
+ appId: "app_id",
48
+ appSecret: "app_secret",
49
+ domain: "feishu",
50
+ config: {
51
+ renderMode: "auto",
52
+ streaming: true,
53
+ },
54
+ });
55
+
56
+ resolveReceiveIdTypeMock.mockReturnValue("chat_id");
57
+ createFeishuClientMock.mockReturnValue({});
58
+
59
+ createReplyDispatcherWithTypingMock.mockImplementation((opts) => ({
60
+ dispatcher: {},
61
+ replyOptions: {},
62
+ markDispatchIdle: vi.fn(),
63
+ _opts: opts,
64
+ }));
65
+
66
+ getFeishuRuntimeMock.mockReturnValue({
67
+ channel: {
68
+ text: {
69
+ resolveTextChunkLimit: vi.fn(() => 4000),
70
+ resolveChunkMode: vi.fn(() => "line"),
71
+ resolveMarkdownTableMode: vi.fn(() => "preserve"),
72
+ convertMarkdownTables: vi.fn((text) => text),
73
+ chunkTextWithMode: vi.fn((text) => [text]),
74
+ },
75
+ reply: {
76
+ createReplyDispatcherWithTyping: createReplyDispatcherWithTypingMock,
77
+ resolveHumanDelayConfig: vi.fn(() => undefined),
78
+ },
79
+ },
80
+ });
81
+ });
82
+
83
+ it("keeps auto mode plain text on non-streaming send path", async () => {
84
+ createFeishuReplyDispatcher({
85
+ cfg: {} as never,
86
+ agentId: "agent",
87
+ runtime: {} as never,
88
+ chatId: "oc_chat",
89
+ });
90
+
91
+ const options = createReplyDispatcherWithTypingMock.mock.calls[0]?.[0];
92
+ await options.deliver({ text: "plain text" }, { kind: "final" });
93
+
94
+ expect(streamingInstances).toHaveLength(0);
95
+ expect(sendMessageFeishuMock).toHaveBeenCalledTimes(1);
96
+ expect(sendMarkdownCardFeishuMock).not.toHaveBeenCalled();
97
+ });
98
+
99
+ it("uses streaming session for auto mode markdown payloads", async () => {
100
+ createFeishuReplyDispatcher({
101
+ cfg: {} as never,
102
+ agentId: "agent",
103
+ runtime: { log: vi.fn(), error: vi.fn() } as never,
104
+ chatId: "oc_chat",
105
+ });
106
+
107
+ const options = createReplyDispatcherWithTypingMock.mock.calls[0]?.[0];
108
+ await options.deliver({ text: "```ts\nconst x = 1\n```" }, { kind: "final" });
109
+
110
+ expect(streamingInstances).toHaveLength(1);
111
+ expect(streamingInstances[0].start).toHaveBeenCalledTimes(1);
112
+ expect(streamingInstances[0].close).toHaveBeenCalledTimes(1);
113
+ expect(sendMessageFeishuMock).not.toHaveBeenCalled();
114
+ expect(sendMarkdownCardFeishuMock).not.toHaveBeenCalled();
115
+ });
116
+ });
@@ -3,29 +3,22 @@ import {
3
3
  createTypingCallbacks,
4
4
  logTypingFailure,
5
5
  type ClawdbotConfig,
6
- type RuntimeEnv,
7
6
  type ReplyPayload,
7
+ type RuntimeEnv,
8
8
  } from "openclaw/plugin-sdk";
9
9
  import type { MentionTarget } from "./mention.js";
10
10
  import { resolveFeishuAccount } from "./accounts.js";
11
+ import { createFeishuClient } from "./client.js";
12
+ import { buildMentionedCardContent } from "./mention.js";
11
13
  import { getFeishuRuntime } from "./runtime.js";
12
- import { sendMessageFeishu, sendMarkdownCardFeishu } from "./send.js";
14
+ import { sendMarkdownCardFeishu, sendMessageFeishu } from "./send.js";
15
+ import { FeishuStreamingSession } from "./streaming-card.js";
16
+ import { resolveReceiveIdType } from "./targets.js";
13
17
  import { addTypingIndicator, removeTypingIndicator, type TypingIndicatorState } from "./typing.js";
14
18
 
15
- /**
16
- * Detect if text contains markdown elements that benefit from card rendering.
17
- * Used by auto render mode.
18
- */
19
+ /** Detect if text contains markdown elements that benefit from card rendering */
19
20
  function shouldUseCard(text: string): boolean {
20
- // Code blocks (fenced)
21
- if (/```[\s\S]*?```/.test(text)) {
22
- return true;
23
- }
24
- // Tables (at least header + separator row with |)
25
- if (/\|.+\|[\r\n]+\|[-:| ]+\|/.test(text)) {
26
- return true;
27
- }
28
- return false;
21
+ return /```[\s\S]*?```/.test(text) || /\|.+\|[\r\n]+\|[-:| ]+\|/.test(text);
29
22
  }
30
23
 
31
24
  export type CreateFeishuReplyDispatcherParams = {
@@ -34,35 +27,23 @@ export type CreateFeishuReplyDispatcherParams = {
34
27
  runtime: RuntimeEnv;
35
28
  chatId: string;
36
29
  replyToMessageId?: string;
37
- /** Mention targets, will be auto-included in replies */
38
30
  mentionTargets?: MentionTarget[];
39
- /** Account ID for multi-account support */
40
31
  accountId?: string;
41
32
  };
42
33
 
43
34
  export function createFeishuReplyDispatcher(params: CreateFeishuReplyDispatcherParams) {
44
35
  const core = getFeishuRuntime();
45
36
  const { cfg, agentId, chatId, replyToMessageId, mentionTargets, accountId } = params;
46
-
47
- // Resolve account for config access
48
37
  const account = resolveFeishuAccount({ cfg, accountId });
38
+ const prefixContext = createReplyPrefixContext({ cfg, agentId });
49
39
 
50
- const prefixContext = createReplyPrefixContext({
51
- cfg,
52
- agentId,
53
- });
54
-
55
- // Feishu doesn't have a native typing indicator API.
56
- // We use message reactions as a typing indicator substitute.
57
40
  let typingState: TypingIndicatorState | null = null;
58
-
59
41
  const typingCallbacks = createTypingCallbacks({
60
42
  start: async () => {
61
43
  if (!replyToMessageId) {
62
44
  return;
63
45
  }
64
46
  typingState = await addTypingIndicator({ cfg, messageId: replyToMessageId, accountId });
65
- params.runtime.log?.(`feishu[${account.accountId}]: added typing indicator reaction`);
66
47
  },
67
48
  stop: async () => {
68
49
  if (!typingState) {
@@ -70,24 +51,21 @@ export function createFeishuReplyDispatcher(params: CreateFeishuReplyDispatcherP
70
51
  }
71
52
  await removeTypingIndicator({ cfg, state: typingState, accountId });
72
53
  typingState = null;
73
- params.runtime.log?.(`feishu[${account.accountId}]: removed typing indicator reaction`);
74
54
  },
75
- onStartError: (err) => {
55
+ onStartError: (err) =>
76
56
  logTypingFailure({
77
57
  log: (message) => params.runtime.log?.(message),
78
58
  channel: "feishu",
79
59
  action: "start",
80
60
  error: err,
81
- });
82
- },
83
- onStopError: (err) => {
61
+ }),
62
+ onStopError: (err) =>
84
63
  logTypingFailure({
85
64
  log: (message) => params.runtime.log?.(message),
86
65
  channel: "feishu",
87
66
  action: "stop",
88
67
  error: err,
89
- });
90
- },
68
+ }),
91
69
  });
92
70
 
93
71
  const textChunkLimit = core.channel.text.resolveTextChunkLimit(cfg, "feishu", accountId, {
@@ -95,77 +73,139 @@ export function createFeishuReplyDispatcher(params: CreateFeishuReplyDispatcherP
95
73
  });
96
74
  const chunkMode = core.channel.text.resolveChunkMode(cfg, "feishu");
97
75
  const tableMode = core.channel.text.resolveMarkdownTableMode({ cfg, channel: "feishu" });
76
+ const renderMode = account.config?.renderMode ?? "auto";
77
+ const streamingEnabled = account.config?.streaming !== false && renderMode !== "raw";
78
+
79
+ let streaming: FeishuStreamingSession | null = null;
80
+ let streamText = "";
81
+ let lastPartial = "";
82
+ let partialUpdateQueue: Promise<void> = Promise.resolve();
83
+ let streamingStartPromise: Promise<void> | null = null;
84
+
85
+ const startStreaming = () => {
86
+ if (!streamingEnabled || streamingStartPromise || streaming) {
87
+ return;
88
+ }
89
+ streamingStartPromise = (async () => {
90
+ const creds =
91
+ account.appId && account.appSecret
92
+ ? { appId: account.appId, appSecret: account.appSecret, domain: account.domain }
93
+ : null;
94
+ if (!creds) {
95
+ return;
96
+ }
97
+
98
+ streaming = new FeishuStreamingSession(createFeishuClient(account), creds, (message) =>
99
+ params.runtime.log?.(`feishu[${account.accountId}] ${message}`),
100
+ );
101
+ try {
102
+ await streaming.start(chatId, resolveReceiveIdType(chatId));
103
+ } catch (error) {
104
+ params.runtime.error?.(`feishu: streaming start failed: ${String(error)}`);
105
+ streaming = null;
106
+ }
107
+ })();
108
+ };
109
+
110
+ const closeStreaming = async () => {
111
+ if (streamingStartPromise) {
112
+ await streamingStartPromise;
113
+ }
114
+ await partialUpdateQueue;
115
+ if (streaming?.isActive()) {
116
+ let text = streamText;
117
+ if (mentionTargets?.length) {
118
+ text = buildMentionedCardContent(mentionTargets, text);
119
+ }
120
+ await streaming.close(text);
121
+ }
122
+ streaming = null;
123
+ streamingStartPromise = null;
124
+ streamText = "";
125
+ lastPartial = "";
126
+ };
98
127
 
99
128
  const { dispatcher, replyOptions, markDispatchIdle } =
100
129
  core.channel.reply.createReplyDispatcherWithTyping({
101
130
  responsePrefix: prefixContext.responsePrefix,
102
131
  responsePrefixContextProvider: prefixContext.responsePrefixContextProvider,
103
132
  humanDelay: core.channel.reply.resolveHumanDelayConfig(cfg, agentId),
104
- onReplyStart: typingCallbacks.onReplyStart,
105
- deliver: async (payload: ReplyPayload) => {
106
- params.runtime.log?.(
107
- `feishu[${account.accountId}] deliver called: text=${payload.text?.slice(0, 100)}`,
108
- );
133
+ onReplyStart: () => {
134
+ if (streamingEnabled && renderMode === "card") {
135
+ startStreaming();
136
+ }
137
+ void typingCallbacks.onReplyStart?.();
138
+ },
139
+ deliver: async (payload: ReplyPayload, info) => {
109
140
  const text = payload.text ?? "";
110
141
  if (!text.trim()) {
111
- params.runtime.log?.(`feishu[${account.accountId}] deliver: empty text, skipping`);
112
142
  return;
113
143
  }
114
144
 
115
- // Check render mode: auto (default), raw, or card
116
- const feishuCfg = account.config;
117
- const renderMode = feishuCfg?.renderMode ?? "auto";
118
-
119
- // Determine if we should use card for this message
120
145
  const useCard = renderMode === "card" || (renderMode === "auto" && shouldUseCard(text));
121
146
 
122
- // Only include @mentions in the first chunk (avoid duplicate @s)
123
- let isFirstChunk = true;
147
+ if ((info?.kind === "block" || info?.kind === "final") && streamingEnabled && useCard) {
148
+ startStreaming();
149
+ if (streamingStartPromise) {
150
+ await streamingStartPromise;
151
+ }
152
+ }
153
+
154
+ if (streaming?.isActive()) {
155
+ if (info?.kind === "final") {
156
+ streamText = text;
157
+ await closeStreaming();
158
+ }
159
+ return;
160
+ }
124
161
 
162
+ let first = true;
125
163
  if (useCard) {
126
- // Card mode: send as interactive card with markdown rendering
127
- const chunks = core.channel.text.chunkTextWithMode(text, textChunkLimit, chunkMode);
128
- params.runtime.log?.(
129
- `feishu[${account.accountId}] deliver: sending ${chunks.length} card chunks to ${chatId}`,
130
- );
131
- for (const chunk of chunks) {
164
+ for (const chunk of core.channel.text.chunkTextWithMode(
165
+ text,
166
+ textChunkLimit,
167
+ chunkMode,
168
+ )) {
132
169
  await sendMarkdownCardFeishu({
133
170
  cfg,
134
171
  to: chatId,
135
172
  text: chunk,
136
173
  replyToMessageId,
137
- mentions: isFirstChunk ? mentionTargets : undefined,
174
+ mentions: first ? mentionTargets : undefined,
138
175
  accountId,
139
176
  });
140
- isFirstChunk = false;
177
+ first = false;
141
178
  }
142
179
  } else {
143
- // Raw mode: send as plain text with table conversion
144
180
  const converted = core.channel.text.convertMarkdownTables(text, tableMode);
145
- const chunks = core.channel.text.chunkTextWithMode(converted, textChunkLimit, chunkMode);
146
- params.runtime.log?.(
147
- `feishu[${account.accountId}] deliver: sending ${chunks.length} text chunks to ${chatId}`,
148
- );
149
- for (const chunk of chunks) {
181
+ for (const chunk of core.channel.text.chunkTextWithMode(
182
+ converted,
183
+ textChunkLimit,
184
+ chunkMode,
185
+ )) {
150
186
  await sendMessageFeishu({
151
187
  cfg,
152
188
  to: chatId,
153
189
  text: chunk,
154
190
  replyToMessageId,
155
- mentions: isFirstChunk ? mentionTargets : undefined,
191
+ mentions: first ? mentionTargets : undefined,
156
192
  accountId,
157
193
  });
158
- isFirstChunk = false;
194
+ first = false;
159
195
  }
160
196
  }
161
197
  },
162
- onError: (err, info) => {
198
+ onError: async (error, info) => {
163
199
  params.runtime.error?.(
164
- `feishu[${account.accountId}] ${info.kind} reply failed: ${String(err)}`,
200
+ `feishu[${account.accountId}] ${info.kind} reply failed: ${String(error)}`,
165
201
  );
202
+ await closeStreaming();
203
+ typingCallbacks.onIdle?.();
204
+ },
205
+ onIdle: async () => {
206
+ await closeStreaming();
166
207
  typingCallbacks.onIdle?.();
167
208
  },
168
- onIdle: typingCallbacks.onIdle,
169
209
  });
170
210
 
171
211
  return {
@@ -173,6 +213,23 @@ export function createFeishuReplyDispatcher(params: CreateFeishuReplyDispatcherP
173
213
  replyOptions: {
174
214
  ...replyOptions,
175
215
  onModelSelected: prefixContext.onModelSelected,
216
+ onPartialReply: streamingEnabled
217
+ ? (payload: ReplyPayload) => {
218
+ if (!payload.text || payload.text === lastPartial) {
219
+ return;
220
+ }
221
+ lastPartial = payload.text;
222
+ streamText = payload.text;
223
+ partialUpdateQueue = partialUpdateQueue.then(async () => {
224
+ if (streamingStartPromise) {
225
+ await streamingStartPromise;
226
+ }
227
+ if (streaming?.isActive()) {
228
+ await streaming.update(streamText);
229
+ }
230
+ });
231
+ }
232
+ : undefined,
176
233
  },
177
234
  markDispatchIdle,
178
235
  };
@@ -0,0 +1,223 @@
1
+ /**
2
+ * Feishu Streaming Card - Card Kit streaming API for real-time text output
3
+ */
4
+
5
+ import type { Client } from "@larksuiteoapi/node-sdk";
6
+ import type { FeishuDomain } from "./types.js";
7
+
8
+ type Credentials = { appId: string; appSecret: string; domain?: FeishuDomain };
9
+ type CardState = { cardId: string; messageId: string; sequence: number; currentText: string };
10
+
11
+ // Token cache (keyed by domain + appId)
12
+ const tokenCache = new Map<string, { token: string; expiresAt: number }>();
13
+
14
+ function resolveApiBase(domain?: FeishuDomain): string {
15
+ if (domain === "lark") {
16
+ return "https://open.larksuite.com/open-apis";
17
+ }
18
+ if (domain && domain !== "feishu" && domain.startsWith("http")) {
19
+ return `${domain.replace(/\/+$/, "")}/open-apis`;
20
+ }
21
+ return "https://open.feishu.cn/open-apis";
22
+ }
23
+
24
+ async function getToken(creds: Credentials): Promise<string> {
25
+ const key = `${creds.domain ?? "feishu"}|${creds.appId}`;
26
+ const cached = tokenCache.get(key);
27
+ if (cached && cached.expiresAt > Date.now() + 60000) {
28
+ return cached.token;
29
+ }
30
+
31
+ const res = await fetch(`${resolveApiBase(creds.domain)}/auth/v3/tenant_access_token/internal`, {
32
+ method: "POST",
33
+ headers: { "Content-Type": "application/json" },
34
+ body: JSON.stringify({ app_id: creds.appId, app_secret: creds.appSecret }),
35
+ });
36
+ const data = (await res.json()) as {
37
+ code: number;
38
+ msg: string;
39
+ tenant_access_token?: string;
40
+ expire?: number;
41
+ };
42
+ if (data.code !== 0 || !data.tenant_access_token) {
43
+ throw new Error(`Token error: ${data.msg}`);
44
+ }
45
+ tokenCache.set(key, {
46
+ token: data.tenant_access_token,
47
+ expiresAt: Date.now() + (data.expire ?? 7200) * 1000,
48
+ });
49
+ return data.tenant_access_token;
50
+ }
51
+
52
+ function truncateSummary(text: string, max = 50): string {
53
+ if (!text) {
54
+ return "";
55
+ }
56
+ const clean = text.replace(/\n/g, " ").trim();
57
+ return clean.length <= max ? clean : clean.slice(0, max - 3) + "...";
58
+ }
59
+
60
+ /** Streaming card session manager */
61
+ export class FeishuStreamingSession {
62
+ private client: Client;
63
+ private creds: Credentials;
64
+ private state: CardState | null = null;
65
+ private queue: Promise<void> = Promise.resolve();
66
+ private closed = false;
67
+ private log?: (msg: string) => void;
68
+ private lastUpdateTime = 0;
69
+ private pendingText: string | null = null;
70
+ private updateThrottleMs = 100; // Throttle updates to max 10/sec
71
+
72
+ constructor(client: Client, creds: Credentials, log?: (msg: string) => void) {
73
+ this.client = client;
74
+ this.creds = creds;
75
+ this.log = log;
76
+ }
77
+
78
+ async start(
79
+ receiveId: string,
80
+ receiveIdType: "open_id" | "user_id" | "union_id" | "email" | "chat_id" = "chat_id",
81
+ ): Promise<void> {
82
+ if (this.state) {
83
+ return;
84
+ }
85
+
86
+ const apiBase = resolveApiBase(this.creds.domain);
87
+ const cardJson = {
88
+ schema: "2.0",
89
+ config: {
90
+ streaming_mode: true,
91
+ summary: { content: "[Generating...]" },
92
+ streaming_config: { print_frequency_ms: { default: 50 }, print_step: { default: 2 } },
93
+ },
94
+ body: {
95
+ elements: [{ tag: "markdown", content: "⏳ Thinking...", element_id: "content" }],
96
+ },
97
+ };
98
+
99
+ // Create card entity
100
+ const createRes = await fetch(`${apiBase}/cardkit/v1/cards`, {
101
+ method: "POST",
102
+ headers: {
103
+ Authorization: `Bearer ${await getToken(this.creds)}`,
104
+ "Content-Type": "application/json",
105
+ },
106
+ body: JSON.stringify({ type: "card_json", data: JSON.stringify(cardJson) }),
107
+ });
108
+ const createData = (await createRes.json()) as {
109
+ code: number;
110
+ msg: string;
111
+ data?: { card_id: string };
112
+ };
113
+ if (createData.code !== 0 || !createData.data?.card_id) {
114
+ throw new Error(`Create card failed: ${createData.msg}`);
115
+ }
116
+ const cardId = createData.data.card_id;
117
+
118
+ // Send card message
119
+ const sendRes = await this.client.im.message.create({
120
+ params: { receive_id_type: receiveIdType },
121
+ data: {
122
+ receive_id: receiveId,
123
+ msg_type: "interactive",
124
+ content: JSON.stringify({ type: "card", data: { card_id: cardId } }),
125
+ },
126
+ });
127
+ if (sendRes.code !== 0 || !sendRes.data?.message_id) {
128
+ throw new Error(`Send card failed: ${sendRes.msg}`);
129
+ }
130
+
131
+ this.state = { cardId, messageId: sendRes.data.message_id, sequence: 1, currentText: "" };
132
+ this.log?.(`Started streaming: cardId=${cardId}, messageId=${sendRes.data.message_id}`);
133
+ }
134
+
135
+ async update(text: string): Promise<void> {
136
+ if (!this.state || this.closed) {
137
+ return;
138
+ }
139
+ // Throttle: skip if updated recently, but remember pending text
140
+ const now = Date.now();
141
+ if (now - this.lastUpdateTime < this.updateThrottleMs) {
142
+ this.pendingText = text;
143
+ return;
144
+ }
145
+ this.pendingText = null;
146
+ this.lastUpdateTime = now;
147
+
148
+ this.queue = this.queue.then(async () => {
149
+ if (!this.state || this.closed) {
150
+ return;
151
+ }
152
+ this.state.currentText = text;
153
+ this.state.sequence += 1;
154
+ const apiBase = resolveApiBase(this.creds.domain);
155
+ await fetch(`${apiBase}/cardkit/v1/cards/${this.state.cardId}/elements/content/content`, {
156
+ method: "PUT",
157
+ headers: {
158
+ Authorization: `Bearer ${await getToken(this.creds)}`,
159
+ "Content-Type": "application/json",
160
+ },
161
+ body: JSON.stringify({
162
+ content: text,
163
+ sequence: this.state.sequence,
164
+ uuid: `s_${this.state.cardId}_${this.state.sequence}`,
165
+ }),
166
+ }).catch((e) => this.log?.(`Update failed: ${String(e)}`));
167
+ });
168
+ await this.queue;
169
+ }
170
+
171
+ async close(finalText?: string): Promise<void> {
172
+ if (!this.state || this.closed) {
173
+ return;
174
+ }
175
+ this.closed = true;
176
+ await this.queue;
177
+
178
+ // Use finalText, or pending throttled text, or current text
179
+ const text = finalText ?? this.pendingText ?? this.state.currentText;
180
+ const apiBase = resolveApiBase(this.creds.domain);
181
+
182
+ // Only send final update if content differs from what's already displayed
183
+ if (text && text !== this.state.currentText) {
184
+ this.state.sequence += 1;
185
+ await fetch(`${apiBase}/cardkit/v1/cards/${this.state.cardId}/elements/content/content`, {
186
+ method: "PUT",
187
+ headers: {
188
+ Authorization: `Bearer ${await getToken(this.creds)}`,
189
+ "Content-Type": "application/json",
190
+ },
191
+ body: JSON.stringify({
192
+ content: text,
193
+ sequence: this.state.sequence,
194
+ uuid: `s_${this.state.cardId}_${this.state.sequence}`,
195
+ }),
196
+ }).catch(() => {});
197
+ this.state.currentText = text;
198
+ }
199
+
200
+ // Close streaming mode
201
+ this.state.sequence += 1;
202
+ await fetch(`${apiBase}/cardkit/v1/cards/${this.state.cardId}/settings`, {
203
+ method: "PATCH",
204
+ headers: {
205
+ Authorization: `Bearer ${await getToken(this.creds)}`,
206
+ "Content-Type": "application/json; charset=utf-8",
207
+ },
208
+ body: JSON.stringify({
209
+ settings: JSON.stringify({
210
+ config: { streaming_mode: false, summary: { content: truncateSummary(text) } },
211
+ }),
212
+ sequence: this.state.sequence,
213
+ uuid: `c_${this.state.cardId}_${this.state.sequence}`,
214
+ }),
215
+ }).catch((e) => this.log?.(`Close failed: ${String(e)}`));
216
+
217
+ this.log?.(`Closed streaming: cardId=${this.state.cardId}`);
218
+ }
219
+
220
+ isActive(): boolean {
221
+ return this.state !== null && !this.closed;
222
+ }
223
+ }
@@ -0,0 +1,16 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { resolveReceiveIdType } from "./targets.js";
3
+
4
+ describe("resolveReceiveIdType", () => {
5
+ it("resolves chat IDs by oc_ prefix", () => {
6
+ expect(resolveReceiveIdType("oc_123")).toBe("chat_id");
7
+ });
8
+
9
+ it("resolves open IDs by ou_ prefix", () => {
10
+ expect(resolveReceiveIdType("ou_123")).toBe("open_id");
11
+ });
12
+
13
+ it("defaults unprefixed IDs to user_id", () => {
14
+ expect(resolveReceiveIdType("u_123")).toBe("user_id");
15
+ });
16
+ });
@@ -57,7 +57,7 @@ export function resolveReceiveIdType(id: string): "chat_id" | "open_id" | "user_
57
57
  if (trimmed.startsWith(OPEN_ID_PREFIX)) {
58
58
  return "open_id";
59
59
  }
60
- return "open_id";
60
+ return "user_id";
61
61
  }
62
62
 
63
63
  export function looksLikeFeishuId(raw: string): boolean {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openclaw/google-antigravity-auth",
3
- "version": "2026.2.9",
3
+ "version": "2026.2.12",
4
4
  "private": true,
5
5
  "description": "OpenClaw Google Antigravity OAuth provider plugin",
6
6
  "type": "module",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openclaw/google-gemini-cli-auth",
3
- "version": "2026.2.9",
3
+ "version": "2026.2.12",
4
4
  "private": true,
5
5
  "description": "OpenClaw Gemini CLI OAuth provider plugin",
6
6
  "type": "module",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openclaw/googlechat",
3
- "version": "2026.2.9",
3
+ "version": "2026.2.12",
4
4
  "private": true,
5
5
  "description": "OpenClaw Google Chat channel plugin",
6
6
  "type": "module",