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
@@ -7,54 +7,31 @@ title: "Telegram"
7
7
 
8
8
  # Telegram (Bot API)
9
9
 
10
- Status: production-ready for bot DMs + groups via grammY. Long-polling by default; webhook optional.
10
+ Status: production-ready for bot DMs + groups via grammY. Long polling is the default mode; webhook mode is optional.
11
11
 
12
- ## Quick setup (beginner)
12
+ <CardGroup cols={3}>
13
+ <Card title="Pairing" icon="link" href="/channels/pairing">
14
+ Default DM policy for Telegram is pairing.
15
+ </Card>
16
+ <Card title="Channel troubleshooting" icon="wrench" href="/channels/troubleshooting">
17
+ Cross-channel diagnostics and repair playbooks.
18
+ </Card>
19
+ <Card title="Gateway configuration" icon="settings" href="/gateway/configuration">
20
+ Full channel config patterns and examples.
21
+ </Card>
22
+ </CardGroup>
13
23
 
14
- 1. Create a bot with **@BotFather** ([direct link](https://t.me/BotFather)). Confirm the handle is exactly `@BotFather`, then copy the token.
15
- 2. Set the token:
16
- - Env: `TELEGRAM_BOT_TOKEN=...`
17
- - Or config: `channels.telegram.botToken: "..."`.
18
- - If both are set, config takes precedence (env fallback is default-account only).
19
- 3. Start the gateway.
20
- 4. DM access is pairing by default; approve the pairing code on first contact.
24
+ ## Quick setup
21
25
 
22
- Minimal config:
26
+ <Steps>
27
+ <Step title="Create the bot token in BotFather">
28
+ Open Telegram and chat with **@BotFather** (confirm the handle is exactly `@BotFather`).
23
29
 
24
- ```json5
25
- {
26
- channels: {
27
- telegram: {
28
- enabled: true,
29
- botToken: "123:abc",
30
- dmPolicy: "pairing",
31
- },
32
- },
33
- }
34
- ```
30
+ Run `/newbot`, follow prompts, and save the token.
35
31
 
36
- ## What it is
32
+ </Step>
37
33
 
38
- - A Telegram Bot API channel owned by the Gateway.
39
- - Deterministic routing: replies go back to Telegram; the model never chooses channels.
40
- - DMs share the agent's main session; groups stay isolated (`agent:<agentId>:telegram:group:<chatId>`).
41
-
42
- ## Setup (fast path)
43
-
44
- ### 1) Create a bot token (BotFather)
45
-
46
- 1. Open Telegram and chat with **@BotFather** ([direct link](https://t.me/BotFather)). Confirm the handle is exactly `@BotFather`.
47
- 2. Run `/newbot`, then follow the prompts (name + username ending in `bot`).
48
- 3. Copy the token and store it safely.
49
-
50
- Optional BotFather settings:
51
-
52
- - `/setjoingroups` — allow/deny adding the bot to groups.
53
- - `/setprivacy` — control whether the bot sees all group messages.
54
-
55
- ### 2) Configure the token (env or config)
56
-
57
- Example:
34
+ <Step title="Configure token and DM policy">
58
35
 
59
36
  ```json5
60
37
  {
@@ -69,217 +46,278 @@ Example:
69
46
  }
70
47
  ```
71
48
 
72
- Env option: `TELEGRAM_BOT_TOKEN=...` (works for the default account).
73
- If both env and config are set, config takes precedence.
49
+ Env fallback: `TELEGRAM_BOT_TOKEN=...` (default account only).
74
50
 
75
- Multi-account support: use `channels.telegram.accounts` with per-account tokens and optional `name`. See [`gateway/configuration`](/gateway/configuration#telegramaccounts--discordaccounts--slackaccounts--signalaccounts--imessageaccounts) for the shared pattern.
51
+ </Step>
76
52
 
77
- 3. Start the gateway. Telegram starts when a token is resolved (config first, env fallback).
78
- 4. DM access defaults to pairing. Approve the code when the bot is first contacted.
79
- 5. For groups: add the bot, decide privacy/admin behavior (below), then set `channels.telegram.groups` to control mention gating + allowlists.
53
+ <Step title="Start gateway and approve first DM">
80
54
 
81
- ## Token + privacy + permissions (Telegram side)
55
+ ```bash
56
+ openclaw gateway
57
+ openclaw pairing list telegram
58
+ openclaw pairing approve telegram <CODE>
59
+ ```
82
60
 
83
- ### Token creation (BotFather)
61
+ Pairing codes expire after 1 hour.
84
62
 
85
- - `/newbot` creates the bot and returns the token (keep it secret).
86
- - If a token leaks, revoke/regenerate it via @BotFather and update your config.
63
+ </Step>
87
64
 
88
- ### Group message visibility (Privacy Mode)
65
+ <Step title="Add the bot to a group">
66
+ Add the bot to your group, then set `channels.telegram.groups` and `groupPolicy` to match your access model.
67
+ </Step>
68
+ </Steps>
89
69
 
90
- Telegram bots default to **Privacy Mode**, which limits which group messages they receive.
91
- If your bot must see _all_ group messages, you have two options:
70
+ <Note>
71
+ Token resolution order is account-aware. In practice, config values win over env fallback, and `TELEGRAM_BOT_TOKEN` only applies to the default account.
72
+ </Note>
92
73
 
93
- - Disable privacy mode with `/setprivacy` **or**
94
- - Add the bot as a group **admin** (admin bots receive all messages).
74
+ ## Telegram side settings
95
75
 
96
- **Note:** When you toggle privacy mode, Telegram requires removing + re‑adding the bot
97
- to each group for the change to take effect.
76
+ <AccordionGroup>
77
+ <Accordion title="Privacy mode and group visibility">
78
+ Telegram bots default to **Privacy Mode**, which limits what group messages they receive.
98
79
 
99
- ### Group permissions (admin rights)
80
+ If the bot must see all group messages, either:
100
81
 
101
- Admin status is set inside the group (Telegram UI). Admin bots always receive all
102
- group messages, so use admin if you need full visibility.
82
+ - disable privacy mode via `/setprivacy`, or
83
+ - make the bot a group admin.
103
84
 
104
- ## How it works (behavior)
85
+ When toggling privacy mode, remove + re-add the bot in each group so Telegram applies the change.
105
86
 
106
- - Inbound messages are normalized into the shared channel envelope with reply context and media placeholders.
107
- - Group replies require a mention by default (native @mention or `agents.list[].groupChat.mentionPatterns` / `messages.groupChat.mentionPatterns`).
108
- - Multi-agent override: set per-agent patterns on `agents.list[].groupChat.mentionPatterns`.
109
- - Replies always route back to the same Telegram chat.
110
- - Long-polling uses grammY runner with per-chat sequencing; overall concurrency is capped by `agents.defaults.maxConcurrent`.
111
- - Telegram Bot API does not support read receipts; there is no `sendReadReceipts` option.
87
+ </Accordion>
112
88
 
113
- ## Draft streaming
89
+ <Accordion title="Group permissions">
90
+ Admin status is controlled in Telegram group settings.
114
91
 
115
- OpenClaw can stream partial replies in Telegram DMs using `sendMessageDraft`.
92
+ Admin bots receive all group messages, which is useful for always-on group behavior.
116
93
 
117
- Requirements:
94
+ </Accordion>
118
95
 
119
- - Threaded Mode enabled for the bot in @BotFather (forum topic mode).
120
- - Private chat threads only (Telegram includes `message_thread_id` on inbound messages).
121
- - `channels.telegram.streamMode` not set to `"off"` (default: `"partial"`, `"block"` enables chunked draft updates).
96
+ <Accordion title="Helpful BotFather toggles">
122
97
 
123
- Draft streaming is DM-only; Telegram does not support it in groups or channels.
98
+ - `/setjoingroups` to allow/deny group adds
99
+ - `/setprivacy` for group visibility behavior
124
100
 
125
- ## Formatting (Telegram HTML)
101
+ </Accordion>
102
+ </AccordionGroup>
126
103
 
127
- - Outbound Telegram text uses `parse_mode: "HTML"` (Telegram’s supported tag subset).
128
- - Markdown-ish input is rendered into **Telegram-safe HTML** (bold/italic/strike/code/links); block elements are flattened to text with newlines/bullets.
129
- - Raw HTML from models is escaped to avoid Telegram parse errors.
130
- - If Telegram rejects the HTML payload, OpenClaw retries the same message as plain text.
104
+ ## Access control and activation
131
105
 
132
- ## Commands (native + custom)
106
+ <Tabs>
107
+ <Tab title="DM policy">
108
+ `channels.telegram.dmPolicy` controls direct message access:
133
109
 
134
- OpenClaw registers native commands (like `/status`, `/reset`, `/model`) with Telegram’s bot menu on startup.
135
- You can add custom commands to the menu via config:
110
+ - `pairing` (default)
111
+ - `allowlist`
112
+ - `open` (requires `allowFrom` to include `"*"`)
113
+ - `disabled`
136
114
 
137
- ```json5
138
- {
139
- channels: {
140
- telegram: {
141
- customCommands: [
142
- { command: "backup", description: "Git backup" },
143
- { command: "generate", description: "Create an image" },
144
- ],
145
- },
146
- },
147
- }
148
- ```
115
+ `channels.telegram.allowFrom` accepts numeric IDs and usernames. `telegram:` / `tg:` prefixes are accepted and normalized.
149
116
 
150
- ## Setup troubleshooting (commands)
117
+ ### Finding your Telegram user ID
151
118
 
152
- - `setMyCommands failed` in logs usually means outbound HTTPS/DNS is blocked to `api.telegram.org`.
153
- - If you see `sendMessage` or `sendChatAction` failures, check IPv6 routing and DNS.
119
+ Safer (no third-party bot):
154
120
 
155
- More help: [Channel troubleshooting](/channels/troubleshooting).
156
-
157
- Notes:
158
-
159
- - Custom commands are **menu entries only**; OpenClaw does not implement them unless you handle them elsewhere.
160
- - Some commands can be handled by plugins/skills without being registered in Telegram’s command menu. These still work when typed (they just won't show up in `/commands` / the menu).
161
- - Command names are normalized (leading `/` stripped, lowercased) and must match `a-z`, `0-9`, `_` (1–32 chars).
162
- - Custom commands **cannot override native commands**. Conflicts are ignored and logged.
163
- - If `commands.native` is disabled, only custom commands are registered (or cleared if none).
121
+ 1. DM your bot.
122
+ 2. Run `openclaw logs --follow`.
123
+ 3. Read `from.id`.
164
124
 
165
- ### Device pairing commands (`device-pair` plugin)
125
+ Official Bot API method:
166
126
 
167
- If the `device-pair` plugin is installed, it adds a Telegram-first flow for pairing a new phone:
127
+ ```bash
128
+ curl "https://api.telegram.org/bot<bot_token>/getUpdates"
129
+ ```
168
130
 
169
- 1. `/pair` generates a setup code (sent as a separate message for easy copy/paste).
170
- 2. Paste the setup code in the iOS app to connect.
171
- 3. `/pair approve` approves the latest pending device request.
131
+ Third-party method (less private): `@userinfobot` or `@getidsbot`.
172
132
 
173
- More details: [Pairing](/channels/pairing#pair-via-telegram-recommended-for-ios).
133
+ </Tab>
174
134
 
175
- ## Limits
135
+ <Tab title="Group policy and allowlists">
136
+ There are two independent controls:
176
137
 
177
- - Outbound text is chunked to `channels.telegram.textChunkLimit` (default 4000).
178
- - Optional newline chunking: set `channels.telegram.chunkMode="newline"` to split on blank lines (paragraph boundaries) before length chunking.
179
- - Media downloads/uploads are capped by `channels.telegram.mediaMaxMb` (default 5).
180
- - Telegram Bot API requests time out after `channels.telegram.timeoutSeconds` (default 500 via grammY). Set lower to avoid long hangs.
181
- - Group history context uses `channels.telegram.historyLimit` (or `channels.telegram.accounts.*.historyLimit`), falling back to `messages.groupChat.historyLimit`. Set `0` to disable (default 50).
182
- - DM history can be limited with `channels.telegram.dmHistoryLimit` (user turns). Per-user overrides: `channels.telegram.dms["<user_id>"].historyLimit`.
138
+ 1. **Which groups are allowed** (`channels.telegram.groups`)
139
+ - no `groups` config: all groups allowed
140
+ - `groups` configured: acts as allowlist (explicit IDs or `"*"`)
183
141
 
184
- ## Group activation modes
142
+ 2. **Which senders are allowed in groups** (`channels.telegram.groupPolicy`)
143
+ - `open`
144
+ - `allowlist` (default)
145
+ - `disabled`
185
146
 
186
- By default, the bot only responds to mentions in groups (`@botname` or patterns in `agents.list[].groupChat.mentionPatterns`). To change this behavior:
147
+ `groupAllowFrom` is used for group sender filtering. If not set, Telegram falls back to `allowFrom`.
187
148
 
188
- ### Via config (recommended)
149
+ Example: allow any member in one specific group:
189
150
 
190
151
  ```json5
191
152
  {
192
153
  channels: {
193
154
  telegram: {
194
155
  groups: {
195
- "-1001234567890": { requireMention: false }, // always respond in this group
156
+ "-1001234567890": {
157
+ groupPolicy: "open",
158
+ requireMention: false,
159
+ },
196
160
  },
197
161
  },
198
162
  },
199
163
  }
200
164
  ```
201
165
 
202
- **Important:** Setting `channels.telegram.groups` creates an **allowlist** - only listed groups (or `"*"`) will be accepted.
203
- Forum topics inherit their parent group config (allowFrom, requireMention, skills, prompts) unless you add per-topic overrides under `channels.telegram.groups.<groupId>.topics.<topicId>`.
166
+ </Tab>
204
167
 
205
- To allow all groups with always-respond:
168
+ <Tab title="Mention behavior">
169
+ Group replies require mention by default.
206
170
 
207
- ```json5
208
- {
209
- channels: {
210
- telegram: {
211
- groups: {
212
- "*": { requireMention: false }, // all groups, always respond
213
- },
214
- },
215
- },
216
- }
217
- ```
171
+ Mention can come from:
172
+
173
+ - native `@botusername` mention, or
174
+ - mention patterns in:
175
+ - `agents.list[].groupChat.mentionPatterns`
176
+ - `messages.groupChat.mentionPatterns`
177
+
178
+ Session-level command toggles:
218
179
 
219
- To keep mention-only for all groups (default behavior):
180
+ - `/activation always`
181
+ - `/activation mention`
182
+
183
+ These update session state only. Use config for persistence.
184
+
185
+ Persistent config example:
220
186
 
221
187
  ```json5
222
188
  {
223
189
  channels: {
224
190
  telegram: {
225
191
  groups: {
226
- "*": { requireMention: true }, // or omit groups entirely
192
+ "*": { requireMention: false },
227
193
  },
228
194
  },
229
195
  },
230
196
  }
231
197
  ```
232
198
 
233
- ### Via command (session-level)
199
+ Getting the group chat ID:
200
+
201
+ - forward a group message to `@userinfobot` / `@getidsbot`
202
+ - or read `chat.id` from `openclaw logs --follow`
203
+ - or inspect Bot API `getUpdates`
204
+
205
+ </Tab>
206
+ </Tabs>
207
+
208
+ ## Runtime behavior
209
+
210
+ - Telegram is owned by the gateway process.
211
+ - Routing is deterministic: Telegram inbound replies back to Telegram (the model does not pick channels).
212
+ - Inbound messages normalize into the shared channel envelope with reply metadata and media placeholders.
213
+ - Group sessions are isolated by group ID. Forum topics append `:topic:<threadId>` to keep topics isolated.
214
+ - DM messages can carry `message_thread_id`; OpenClaw routes them with thread-aware session keys and preserves thread ID for replies.
215
+ - Long polling uses grammY runner with per-chat/per-thread sequencing. Overall runner sink concurrency uses `agents.defaults.maxConcurrent`.
216
+ - Telegram Bot API has no read-receipt support (`sendReadReceipts` does not apply).
217
+
218
+ ## Feature reference
219
+
220
+ <AccordionGroup>
221
+ <Accordion title="Draft streaming in Telegram DMs">
222
+ OpenClaw can stream partial replies with Telegram draft bubbles (`sendMessageDraft`).
223
+
224
+ Requirements:
225
+
226
+ - `channels.telegram.streamMode` is not `"off"` (default: `"partial"`)
227
+ - private chat
228
+ - inbound update includes `message_thread_id`
229
+ - bot topics are enabled (`getMe().has_topics_enabled`)
234
230
 
235
- Send in the group:
231
+ Modes:
236
232
 
237
- - `/activation always` - respond to all messages
238
- - `/activation mention` - require mentions (default)
233
+ - `off`: no draft streaming
234
+ - `partial`: frequent draft updates from partial text
235
+ - `block`: chunked draft updates using `channels.telegram.draftChunk`
239
236
 
240
- **Note:** Commands update session state only. For persistent behavior across restarts, use config.
237
+ `draftChunk` defaults for block mode:
241
238
 
242
- ### Getting the group chat ID
239
+ - `minChars: 200`
240
+ - `maxChars: 800`
241
+ - `breakPreference: "paragraph"`
243
242
 
244
- Forward any message from the group to `@userinfobot` or `@getidsbot` on Telegram to see the chat ID (negative number like `-1001234567890`).
243
+ `maxChars` is clamped by `channels.telegram.textChunkLimit`.
245
244
 
246
- **Tip:** For your own user ID, DM the bot and it will reply with your user ID (pairing message), or use `/whoami` once commands are enabled.
245
+ Draft streaming is DM-only; groups/channels do not use draft bubbles.
247
246
 
248
- **Privacy note:** `@userinfobot` is a third-party bot. If you prefer, add the bot to the group, send a message, and use `openclaw logs --follow` to read `chat.id`, or use the Bot API `getUpdates`.
247
+ If you want early real Telegram messages instead of draft updates, use block streaming (`channels.telegram.blockStreaming: true`).
249
248
 
250
- ## Config writes
249
+ Telegram-only reasoning stream:
251
250
 
252
- By default, Telegram is allowed to write config updates triggered by channel events or `/config set|unset`.
251
+ - `/reasoning stream` sends reasoning to the draft bubble while generating
252
+ - final answer is sent without reasoning text
253
253
 
254
- This happens when:
254
+ </Accordion>
255
255
 
256
- - A group is upgraded to a supergroup and Telegram emits `migrate_to_chat_id` (chat ID changes). OpenClaw can migrate `channels.telegram.groups` automatically.
257
- - You run `/config set` or `/config unset` in a Telegram chat (requires `commands.config: true`).
256
+ <Accordion title="Formatting and HTML fallback">
257
+ Outbound text uses Telegram `parse_mode: "HTML"`.
258
258
 
259
- Disable with:
259
+ - Markdown-ish text is rendered to Telegram-safe HTML.
260
+ - Raw model HTML is escaped to reduce Telegram parse failures.
261
+ - If Telegram rejects parsed HTML, OpenClaw retries as plain text.
262
+
263
+ Link previews are enabled by default and can be disabled with `channels.telegram.linkPreview: false`.
264
+
265
+ </Accordion>
266
+
267
+ <Accordion title="Native commands and custom commands">
268
+ Telegram command menu registration is handled at startup with `setMyCommands`.
269
+
270
+ Native command defaults:
271
+
272
+ - `commands.native: "auto"` enables native commands for Telegram
273
+
274
+ Add custom command menu entries:
260
275
 
261
276
  ```json5
262
277
  {
263
- channels: { telegram: { configWrites: false } },
278
+ channels: {
279
+ telegram: {
280
+ customCommands: [
281
+ { command: "backup", description: "Git backup" },
282
+ { command: "generate", description: "Create an image" },
283
+ ],
284
+ },
285
+ },
264
286
  }
265
287
  ```
266
288
 
267
- ## Topics (forum supergroups)
289
+ Rules:
290
+
291
+ - names are normalized (strip leading `/`, lowercase)
292
+ - valid pattern: `a-z`, `0-9`, `_`, length `1..32`
293
+ - custom commands cannot override native commands
294
+ - conflicts/duplicates are skipped and logged
295
+
296
+ Notes:
297
+
298
+ - custom commands are menu entries only; they do not auto-implement behavior
299
+ - plugin/skill commands can still work when typed even if not shown in Telegram menu
300
+
301
+ If native commands are disabled, built-ins are removed. Custom/plugin commands may still register if configured.
302
+
303
+ Common setup failure:
304
+
305
+ - `setMyCommands failed` usually means outbound DNS/HTTPS to `api.telegram.org` is blocked.
268
306
 
269
- Telegram forum topics include a `message_thread_id` per message. OpenClaw:
307
+ ### Device pairing commands (`device-pair` plugin)
270
308
 
271
- - Appends `:topic:<threadId>` to the Telegram group session key so each topic is isolated.
272
- - Sends typing indicators and replies with `message_thread_id` so responses stay in the topic.
273
- - General topic (thread id `1`) is special: message sends omit `message_thread_id` (Telegram rejects it), but typing indicators still include it.
274
- - Exposes `MessageThreadId` + `IsForum` in template context for routing/templating.
275
- - Topic-specific configuration is available under `channels.telegram.groups.<chatId>.topics.<threadId>` (skills, allowlists, auto-reply, system prompts, disable).
276
- - Topic configs inherit group settings (requireMention, allowlists, skills, prompts, enabled) unless overridden per topic.
309
+ When the `device-pair` plugin is installed:
277
310
 
278
- Private chats can include `message_thread_id` in some edge cases. OpenClaw keeps the DM session key unchanged, but still uses the thread id for replies/draft streaming when it is present.
311
+ 1. `/pair` generates setup code
312
+ 2. paste code in iOS app
313
+ 3. `/pair approve` approves latest pending request
279
314
 
280
- ## Inline Buttons
315
+ More details: [Pairing](/channels/pairing#pair-via-telegram-recommended-for-ios).
281
316
 
282
- Telegram supports inline keyboards with callback buttons.
317
+ </Accordion>
318
+
319
+ <Accordion title="Inline buttons">
320
+ Configure inline keyboard scope:
283
321
 
284
322
  ```json5
285
323
  {
@@ -293,7 +331,7 @@ Telegram supports inline keyboards with callback buttons.
293
331
  }
294
332
  ```
295
333
 
296
- For per-account configuration:
334
+ Per-account override:
297
335
 
298
336
  ```json5
299
337
  {
@@ -311,20 +349,17 @@ For per-account configuration:
311
349
  }
312
350
  ```
313
351
 
314
- Scopes:
315
-
316
- - `off` — inline buttons disabled
317
- - `dm` — only DMs (group targets blocked)
318
- - `group` — only groups (DM targets blocked)
319
- - `all` — DMs + groups
320
- - `allowlist` — DMs + groups, but only senders allowed by `allowFrom`/`groupAllowFrom` (same rules as control commands)
352
+ Scopes:
321
353
 
322
- Default: `allowlist`.
323
- Legacy: `capabilities: ["inlineButtons"]` = `inlineButtons: "all"`.
354
+ - `off`
355
+ - `dm`
356
+ - `group`
357
+ - `all`
358
+ - `allowlist` (default)
324
359
 
325
- ### Sending buttons
360
+ Legacy `capabilities: ["inlineButtons"]` maps to `inlineButtons: "all"`.
326
361
 
327
- Use the message tool with the `buttons` parameter:
362
+ Message action example:
328
363
 
329
364
  ```json5
330
365
  {
@@ -342,116 +377,82 @@ Use the message tool with the `buttons` parameter:
342
377
  }
343
378
  ```
344
379
 
345
- When a user clicks a button, the callback data is sent back to the agent as a message with the format:
346
- `callback_data: value`
347
-
348
- ### Configuration options
349
-
350
- Telegram capabilities can be configured at two levels (object form shown above; legacy string arrays still supported):
351
-
352
- - `channels.telegram.capabilities`: Global default capability config applied to all Telegram accounts unless overridden.
353
- - `channels.telegram.accounts.<account>.capabilities`: Per-account capabilities that override the global defaults for that specific account.
354
-
355
- Use the global setting when all Telegram bots/accounts should behave the same. Use per-account configuration when different bots need different behaviors (for example, one account only handles DMs while another is allowed in groups).
356
-
357
- ## Access control (DMs + groups)
358
-
359
- ### DM access
360
-
361
- - Default: `channels.telegram.dmPolicy = "pairing"`. Unknown senders receive a pairing code; messages are ignored until approved (codes expire after 1 hour).
362
- - Approve via:
363
- - `openclaw pairing list telegram`
364
- - `openclaw pairing approve telegram <CODE>`
365
- - Pairing is the default token exchange used for Telegram DMs. Details: [Pairing](/channels/pairing)
366
- - `channels.telegram.allowFrom` accepts numeric user IDs (recommended) or `@username` entries. It is **not** the bot username; use the human sender’s ID. The wizard accepts `@username` and resolves it to the numeric ID when possible.
367
-
368
- #### Finding your Telegram user ID
380
+ Callback clicks are passed to the agent as text:
381
+ `callback_data: <value>`
369
382
 
370
- Safer (no third-party bot):
383
+ </Accordion>
371
384
 
372
- 1. Start the gateway and DM your bot.
373
- 2. Run `openclaw logs --follow` and look for `from.id`.
385
+ <Accordion title="Telegram message actions for agents and automation">
386
+ Telegram tool actions include:
374
387
 
375
- Alternate (official Bot API):
388
+ - `sendMessage` (`to`, `content`, optional `mediaUrl`, `replyToMessageId`, `messageThreadId`)
389
+ - `react` (`chatId`, `messageId`, `emoji`)
390
+ - `deleteMessage` (`chatId`, `messageId`)
391
+ - `editMessage` (`chatId`, `messageId`, `content`)
376
392
 
377
- 1. DM your bot.
378
- 2. Fetch updates with your bot token and read `message.from.id`:
393
+ Channel message actions expose ergonomic aliases (`send`, `react`, `delete`, `edit`, `sticker`, `sticker-search`).
379
394
 
380
- ```bash
381
- curl "https://api.telegram.org/bot<bot_token>/getUpdates"
382
- ```
395
+ Gating controls:
383
396
 
384
- Third-party (less private):
397
+ - `channels.telegram.actions.sendMessage`
398
+ - `channels.telegram.actions.editMessage`
399
+ - `channels.telegram.actions.deleteMessage`
400
+ - `channels.telegram.actions.reactions`
401
+ - `channels.telegram.actions.sticker` (default: disabled)
385
402
 
386
- - DM `@userinfobot` or `@getidsbot` and use the returned user id.
403
+ Reaction removal semantics: [/tools/reactions](/tools/reactions)
387
404
 
388
- ### Group access
405
+ </Accordion>
389
406
 
390
- Two independent controls:
407
+ <Accordion title="Reply threading tags">
408
+ Telegram supports explicit reply threading tags in generated output:
391
409
 
392
- **1. Which groups are allowed** (group allowlist via `channels.telegram.groups`):
410
+ - `[[reply_to_current]]` replies to the triggering message
411
+ - `[[reply_to:<id>]]` replies to a specific Telegram message ID
393
412
 
394
- - No `groups` config = all groups allowed
395
- - With `groups` config = only listed groups or `"*"` are allowed
396
- - Example: `"groups": { "-1001234567890": {}, "*": {} }` allows all groups
413
+ `channels.telegram.replyToMode` controls handling:
397
414
 
398
- **2. Which senders are allowed** (sender filtering via `channels.telegram.groupPolicy`):
415
+ - `first` (default)
416
+ - `all`
417
+ - `off`
399
418
 
400
- - `"open"` = all senders in allowed groups can message
401
- - `"allowlist"` = only senders in `channels.telegram.groupAllowFrom` can message
402
- - `"disabled"` = no group messages accepted at all
403
- Default is `groupPolicy: "allowlist"` (blocked unless you add `groupAllowFrom`).
419
+ </Accordion>
404
420
 
405
- Most users want: `groupPolicy: "allowlist"` + `groupAllowFrom` + specific groups listed in `channels.telegram.groups`
406
-
407
- To allow **any group member** to talk in a specific group (while still keeping control commands restricted to authorized senders), set a per-group override:
408
-
409
- ```json5
410
- {
411
- channels: {
412
- telegram: {
413
- groups: {
414
- "-1001234567890": {
415
- groupPolicy: "open",
416
- requireMention: false,
417
- },
418
- },
419
- },
420
- },
421
- }
422
- ```
421
+ <Accordion title="Forum topics and thread behavior">
422
+ Forum supergroups:
423
423
 
424
- ## Long-polling vs webhook
424
+ - topic session keys append `:topic:<threadId>`
425
+ - replies and typing target the topic thread
426
+ - topic config path:
427
+ `channels.telegram.groups.<chatId>.topics.<threadId>`
425
428
 
426
- - Default: long-polling (no public URL required).
427
- - Webhook mode: set `channels.telegram.webhookUrl` and `channels.telegram.webhookSecret` (optionally `channels.telegram.webhookPath`).
428
- - The local listener binds to `0.0.0.0:8787` and serves `POST /telegram-webhook` by default.
429
- - If your public URL is different, use a reverse proxy and point `channels.telegram.webhookUrl` at the public endpoint.
429
+ General topic (`threadId=1`) special-case:
430
430
 
431
- ## Reply threading
431
+ - message sends omit `message_thread_id` (Telegram rejects `sendMessage(...thread_id=1)`)
432
+ - typing actions still include `message_thread_id`
432
433
 
433
- Telegram supports optional threaded replies via tags:
434
+ Topic inheritance: topic entries inherit group settings unless overridden (`requireMention`, `allowFrom`, `skills`, `systemPrompt`, `enabled`, `groupPolicy`).
434
435
 
435
- - `[[reply_to_current]]` -- reply to the triggering message.
436
- - `[[reply_to:<id>]]` -- reply to a specific message id.
436
+ Template context includes:
437
437
 
438
- Controlled by `channels.telegram.replyToMode`:
438
+ - `MessageThreadId`
439
+ - `IsForum`
439
440
 
440
- - `first` (default), `all`, `off`.
441
+ DM thread behavior:
441
442
 
442
- ## Audio messages (voice vs file)
443
+ - private chats with `message_thread_id` keep DM routing but use thread-aware session keys/reply targets.
443
444
 
444
- Telegram distinguishes **voice notes** (round bubble) from **audio files** (metadata card).
445
- OpenClaw defaults to audio files for backward compatibility.
445
+ </Accordion>
446
446
 
447
- To force a voice note bubble in agent replies, include this tag anywhere in the reply:
447
+ <Accordion title="Audio, video, and stickers">
448
+ ### Audio messages
448
449
 
449
- - `[[audio_as_voice]]` — send audio as a voice note instead of a file.
450
+ Telegram distinguishes voice notes vs audio files.
450
451
 
451
- The tag is stripped from the delivered text. Other channels ignore this tag.
452
+ - default: audio file behavior
453
+ - tag `[[audio_as_voice]]` in agent reply to force voice-note send
452
454
 
453
- For message tool sends, set `asVoice: true` with a voice-compatible audio `media` URL
454
- (`message` is optional when media is present):
455
+ Message action example:
455
456
 
456
457
  ```json5
457
458
  {
@@ -463,12 +464,11 @@ For message tool sends, set `asVoice: true` with a voice-compatible audio `media
463
464
  }
464
465
  ```
465
466
 
466
- ## Video messages (video vs video note)
467
+ ### Video messages
467
468
 
468
- Telegram distinguishes **video notes** (round bubble) from **video files** (rectangular).
469
- OpenClaw defaults to video files.
469
+ Telegram distinguishes video files vs video notes.
470
470
 
471
- For message tool sends, set `asVideoNote: true` with a video `media` URL:
471
+ Message action example:
472
472
 
473
473
  ```json5
474
474
  {
@@ -480,65 +480,31 @@ For message tool sends, set `asVideoNote: true` with a video `media` URL:
480
480
  }
481
481
  ```
482
482
 
483
- (Note: Video notes do not support captions. If you provide a message text, it will be sent as a separate message.)
484
-
485
- ## Stickers
486
-
487
- OpenClaw supports receiving and sending Telegram stickers with intelligent caching.
488
-
489
- ### Receiving stickers
490
-
491
- When a user sends a sticker, OpenClaw handles it based on the sticker type:
483
+ Video notes do not support captions; provided message text is sent separately.
492
484
 
493
- - **Static stickers (WEBP):** Downloaded and processed through vision. The sticker appears as a `<media:sticker>` placeholder in the message content.
494
- - **Animated stickers (TGS):** Skipped (Lottie format not supported for processing).
495
- - **Video stickers (WEBM):** Skipped (video format not supported for processing).
485
+ ### Stickers
496
486
 
497
- Template context field available when receiving stickers:
487
+ Inbound sticker handling:
498
488
 
499
- - `Sticker` object with:
500
- - `emoji` emoji associated with the sticker
501
- - `setName` name of the sticker set
502
- - `fileId` — Telegram file ID (send the same sticker back)
503
- - `fileUniqueId` — stable ID for cache lookup
504
- - `cachedDescription` — cached vision description when available
489
+ - static WEBP: downloaded and processed (placeholder `<media:sticker>`)
490
+ - animated TGS: skipped
491
+ - video WEBM: skipped
505
492
 
506
- ### Sticker cache
493
+ Sticker context fields:
507
494
 
508
- Stickers are processed through the AI's vision capabilities to generate descriptions. Since the same stickers are often sent repeatedly, OpenClaw caches these descriptions to avoid redundant API calls.
495
+ - `Sticker.emoji`
496
+ - `Sticker.setName`
497
+ - `Sticker.fileId`
498
+ - `Sticker.fileUniqueId`
499
+ - `Sticker.cachedDescription`
509
500
 
510
- **How it works:**
501
+ Sticker cache file:
511
502
 
512
- 1. **First encounter:** The sticker image is sent to the AI for vision analysis. The AI generates a description (e.g., "A cartoon cat waving enthusiastically").
513
- 2. **Cache storage:** The description is saved along with the sticker's file ID, emoji, and set name.
514
- 3. **Subsequent encounters:** When the same sticker is seen again, the cached description is used directly. The image is not sent to the AI.
503
+ - `~/.openclaw/telegram/sticker-cache.json`
515
504
 
516
- **Cache location:** `~/.openclaw/telegram/sticker-cache.json`
505
+ Stickers are described once (when possible) and cached to reduce repeated vision calls.
517
506
 
518
- **Cache entry format:**
519
-
520
- ```json
521
- {
522
- "fileId": "CAACAgIAAxkBAAI...",
523
- "fileUniqueId": "AgADBAADb6cxG2Y",
524
- "emoji": "👋",
525
- "setName": "CoolCats",
526
- "description": "A cartoon cat waving enthusiastically",
527
- "cachedAt": "2026-01-15T10:30:00.000Z"
528
- }
529
- ```
530
-
531
- **Benefits:**
532
-
533
- - Reduces API costs by avoiding repeated vision calls for the same sticker
534
- - Faster response times for cached stickers (no vision processing delay)
535
- - Enables sticker search functionality based on cached descriptions
536
-
537
- The cache is populated automatically as stickers are received. There is no manual cache management required.
538
-
539
- ### Sending stickers
540
-
541
- The agent can send and search stickers using the `sticker` and `sticker-search` actions. These are disabled by default and must be enabled in config:
507
+ Enable sticker actions:
542
508
 
543
509
  ```json5
544
510
  {
@@ -552,7 +518,7 @@ The agent can send and search stickers using the `sticker` and `sticker-search`
552
518
  }
553
519
  ```
554
520
 
555
- **Send a sticker:**
521
+ Send sticker action:
556
522
 
557
523
  ```json5
558
524
  {
@@ -563,15 +529,7 @@ The agent can send and search stickers using the `sticker` and `sticker-search`
563
529
  }
564
530
  ```
565
531
 
566
- Parameters:
567
-
568
- - `fileId` (required) — the Telegram file ID of the sticker. Obtain this from `Sticker.fileId` when receiving a sticker, or from a `sticker-search` result.
569
- - `replyTo` (optional) — message ID to reply to.
570
- - `threadId` (optional) — message thread ID for forum topics.
571
-
572
- **Search for stickers:**
573
-
574
- The agent can search cached stickers by description, emoji, or set name:
532
+ Search cached stickers:
575
533
 
576
534
  ```json5
577
535
  {
@@ -582,219 +540,157 @@ The agent can search cached stickers by description, emoji, or set name:
582
540
  }
583
541
  ```
584
542
 
585
- Returns matching stickers from the cache:
543
+ </Accordion>
586
544
 
587
- ```json5
588
- {
589
- ok: true,
590
- count: 2,
591
- stickers: [
592
- {
593
- fileId: "CAACAgIAAxkBAAI...",
594
- emoji: "👋",
595
- description: "A cartoon cat waving enthusiastically",
596
- setName: "CoolCats",
597
- },
598
- ],
599
- }
600
- ```
545
+ <Accordion title="Reaction notifications">
546
+ Telegram reactions arrive as `message_reaction` updates (separate from message payloads).
547
+
548
+ When enabled, OpenClaw enqueues system events like:
549
+
550
+ - `Telegram reaction added: 👍 by Alice (@alice) on msg 42`
601
551
 
602
- The search uses fuzzy matching across description text, emoji characters, and set names.
552
+ Config:
603
553
 
604
- **Example with threading:**
554
+ - `channels.telegram.reactionNotifications`: `off | own | all` (default: `own`)
555
+ - `channels.telegram.reactionLevel`: `off | ack | minimal | extensive` (default: `minimal`)
556
+
557
+ Notes:
558
+
559
+ - `own` means user reactions to bot-sent messages only (best-effort via sent-message cache).
560
+ - Telegram does not provide thread IDs in reaction updates.
561
+ - non-forum groups route to group chat session
562
+ - forum groups route to the group general-topic session (`:topic:1`), not the exact originating topic
563
+
564
+ `allowed_updates` for polling/webhook include `message_reaction` automatically.
565
+
566
+ </Accordion>
567
+
568
+ <Accordion title="Config writes from Telegram events and commands">
569
+ Channel config writes are enabled by default (`configWrites !== false`).
570
+
571
+ Telegram-triggered writes include:
572
+
573
+ - group migration events (`migrate_to_chat_id`) to update `channels.telegram.groups`
574
+ - `/config set` and `/config unset` (requires command enablement)
575
+
576
+ Disable:
605
577
 
606
578
  ```json5
607
579
  {
608
- action: "sticker",
609
- channel: "telegram",
610
- to: "-1001234567890",
611
- fileId: "CAACAgIAAxkBAAI...",
612
- replyTo: 42,
613
- threadId: 123,
580
+ channels: {
581
+ telegram: {
582
+ configWrites: false,
583
+ },
584
+ },
614
585
  }
615
586
  ```
616
587
 
617
- ## Streaming (drafts)
588
+ </Accordion>
618
589
 
619
- Telegram can stream **draft bubbles** while the agent is generating a response.
620
- OpenClaw uses Bot API `sendMessageDraft` (not real messages) and then sends the
621
- final reply as a normal message.
590
+ <Accordion title="Long polling vs webhook">
591
+ Default: long polling.
622
592
 
623
- Requirements (Telegram Bot API 9.3+):
593
+ Webhook mode:
624
594
 
625
- - **Private chats with topics enabled** (forum topic mode for the bot).
626
- - Incoming messages must include `message_thread_id` (private topic thread).
627
- - Streaming is ignored for groups/supergroups/channels.
595
+ - set `channels.telegram.webhookUrl`
596
+ - set `channels.telegram.webhookSecret` (required when webhook URL is set)
597
+ - optional `channels.telegram.webhookPath` (default `/telegram-webhook`)
628
598
 
629
- Config:
599
+ Default local listener for webhook mode binds to `0.0.0.0:8787`.
630
600
 
631
- - `channels.telegram.streamMode: "off" | "partial" | "block"` (default: `partial`)
632
- - `partial`: update the draft bubble with the latest streaming text.
633
- - `block`: update the draft bubble in larger blocks (chunked).
634
- - `off`: disable draft streaming.
635
- - Optional (only for `streamMode: "block"`):
636
- - `channels.telegram.draftChunk: { minChars?, maxChars?, breakPreference? }`
637
- - defaults: `minChars: 200`, `maxChars: 800`, `breakPreference: "paragraph"` (clamped to `channels.telegram.textChunkLimit`).
601
+ If your public endpoint differs, place a reverse proxy in front and point `webhookUrl` at the public URL.
638
602
 
639
- Note: draft streaming is separate from **block streaming** (channel messages).
640
- Block streaming is off by default and requires `channels.telegram.blockStreaming: true`
641
- if you want early Telegram messages instead of draft updates.
603
+ </Accordion>
642
604
 
643
- Reasoning stream (Telegram only):
605
+ <Accordion title="Limits, retry, and CLI targets">
606
+ - `channels.telegram.textChunkLimit` default is 4000.
607
+ - `channels.telegram.chunkMode="newline"` prefers paragraph boundaries (blank lines) before length splitting.
608
+ - `channels.telegram.mediaMaxMb` (default 5) caps inbound Telegram media download/processing size.
609
+ - `channels.telegram.timeoutSeconds` overrides Telegram API client timeout (if unset, grammY default applies).
610
+ - group context history uses `channels.telegram.historyLimit` or `messages.groupChat.historyLimit` (default 50); `0` disables.
611
+ - DM history controls:
612
+ - `channels.telegram.dmHistoryLimit`
613
+ - `channels.telegram.dms["<user_id>"].historyLimit`
614
+ - outbound Telegram API retries are configurable via `channels.telegram.retry`.
644
615
 
645
- - `/reasoning stream` streams reasoning into the draft bubble while the reply is
646
- generating, then sends the final answer without reasoning.
647
- - If `channels.telegram.streamMode` is `off`, reasoning stream is disabled.
648
- More context: [Streaming + chunking](/concepts/streaming).
616
+ CLI send target can be numeric chat ID or username:
649
617
 
650
- ## Retry policy
618
+ ```bash
619
+ openclaw message send --channel telegram --target 123456789 --message "hi"
620
+ openclaw message send --channel telegram --target @name --message "hi"
621
+ ```
651
622
 
652
- Outbound Telegram API calls retry on transient network/429 errors with exponential backoff and jitter. Configure via `channels.telegram.retry`. See [Retry policy](/concepts/retry).
623
+ </Accordion>
624
+ </AccordionGroup>
653
625
 
654
- ## Agent tool (messages + reactions)
626
+ ## Troubleshooting
655
627
 
656
- - Tool: `telegram` with `sendMessage` action (`to`, `content`, optional `mediaUrl`, `replyToMessageId`, `messageThreadId`).
657
- - Tool: `telegram` with `react` action (`chatId`, `messageId`, `emoji`).
658
- - Tool: `telegram` with `deleteMessage` action (`chatId`, `messageId`).
659
- - Reaction removal semantics: see [/tools/reactions](/tools/reactions).
660
- - Tool gating: `channels.telegram.actions.reactions`, `channels.telegram.actions.sendMessage`, `channels.telegram.actions.deleteMessage` (default: enabled), and `channels.telegram.actions.sticker` (default: disabled).
628
+ <AccordionGroup>
629
+ <Accordion title="Bot does not respond to non mention group messages">
661
630
 
662
- ## Reaction notifications
631
+ - If `requireMention=false`, Telegram privacy mode must allow full visibility.
632
+ - BotFather: `/setprivacy` -> Disable
633
+ - then remove + re-add bot to group
634
+ - `openclaw channels status` warns when config expects unmentioned group messages.
635
+ - `openclaw channels status --probe` can check explicit numeric group IDs; wildcard `"*"` cannot be membership-probed.
636
+ - quick session test: `/activation always`.
663
637
 
664
- **How reactions work:**
665
- Telegram reactions arrive as **separate `message_reaction` events**, not as properties in message payloads. When a user adds a reaction, OpenClaw:
638
+ </Accordion>
666
639
 
667
- 1. Receives the `message_reaction` update from Telegram API
668
- 2. Converts it to a **system event** with format: `"Telegram reaction added: {emoji} by {user} on msg {id}"`
669
- 3. Enqueues the system event using the **same session key** as regular messages
670
- 4. When the next message arrives in that conversation, system events are drained and prepended to the agent's context
640
+ <Accordion title="Bot not seeing group messages at all">
671
641
 
672
- The agent sees reactions as **system notifications** in the conversation history, not as message metadata.
642
+ - when `channels.telegram.groups` exists, group must be listed (or include `"*"`)
643
+ - verify bot membership in group
644
+ - review logs: `openclaw logs --follow` for skip reasons
673
645
 
674
- **Configuration:**
646
+ </Accordion>
675
647
 
676
- - `channels.telegram.reactionNotifications`: Controls which reactions trigger notifications
677
- - `"off"` — ignore all reactions
678
- - `"own"` — notify when users react to bot messages (best-effort; in-memory) (default)
679
- - `"all"` — notify for all reactions
648
+ <Accordion title="Commands work partially or not at all">
680
649
 
681
- - `channels.telegram.reactionLevel`: Controls agent's reaction capability
682
- - `"off"` agent cannot react to messages
683
- - `"ack"` bot sends acknowledgment reactions (👀 while processing) (default)
684
- - `"minimal"` — agent can react sparingly (guideline: 1 per 5-10 exchanges)
685
- - `"extensive"` — agent can react liberally when appropriate
650
+ - authorize your sender identity (pairing and/or `allowFrom`)
651
+ - command authorization still applies even when group policy is `open`
652
+ - `setMyCommands failed` usually indicates DNS/HTTPS reachability issues to `api.telegram.org`
686
653
 
687
- **Forum groups:** Reactions in forum groups include `message_thread_id` and use session keys like `agent:main:telegram:group:{chatId}:topic:{threadId}`. This ensures reactions and messages in the same topic stay together.
654
+ </Accordion>
688
655
 
689
- **Example config:**
656
+ <Accordion title="Polling or network instability">
690
657
 
691
- ```json5
692
- {
693
- channels: {
694
- telegram: {
695
- reactionNotifications: "all", // See all reactions
696
- reactionLevel: "minimal", // Agent can react sparingly
697
- },
698
- },
699
- }
658
+ - Node 22+ + custom fetch/proxy can trigger immediate abort behavior if AbortSignal types mismatch.
659
+ - Some hosts resolve `api.telegram.org` to IPv6 first; broken IPv6 egress can cause intermittent Telegram API failures.
660
+ - Validate DNS answers:
661
+
662
+ ```bash
663
+ dig +short api.telegram.org A
664
+ dig +short api.telegram.org AAAA
700
665
  ```
701
666
 
702
- **Requirements:**
667
+ </Accordion>
668
+ </AccordionGroup>
703
669
 
704
- - Telegram bots must explicitly request `message_reaction` in `allowed_updates` (configured automatically by OpenClaw)
705
- - For webhook mode, reactions are included in the webhook `allowed_updates`
706
- - For polling mode, reactions are included in the `getUpdates` `allowed_updates`
670
+ More help: [Channel troubleshooting](/channels/troubleshooting).
707
671
 
708
- ## Delivery targets (CLI/cron)
672
+ ## Telegram config reference pointers
709
673
 
710
- - Use a chat id (`123456789`) or a username (`@name`) as the target.
711
- - Example: `openclaw message send --channel telegram --target 123456789 --message "hi"`.
674
+ Primary reference:
712
675
 
713
- ## Troubleshooting
676
+ - [Configuration reference - Telegram](/gateway/configuration-reference#telegram)
677
+
678
+ Telegram-specific high-signal fields:
679
+
680
+ - startup/auth: `enabled`, `botToken`, `tokenFile`, `accounts.*`
681
+ - access control: `dmPolicy`, `allowFrom`, `groupPolicy`, `groupAllowFrom`, `groups`, `groups.*.topics.*`
682
+ - command/menu: `commands.native`, `customCommands`
683
+ - threading/replies: `replyToMode`
684
+ - streaming: `streamMode`, `draftChunk`, `blockStreaming`
685
+ - formatting/delivery: `textChunkLimit`, `chunkMode`, `linkPreview`, `responsePrefix`
686
+ - media/network: `mediaMaxMb`, `timeoutSeconds`, `retry`, `network.autoSelectFamily`, `proxy`
687
+ - webhook: `webhookUrl`, `webhookSecret`, `webhookPath`
688
+ - actions/capabilities: `capabilities.inlineButtons`, `actions.sendMessage|editMessage|deleteMessage|reactions|sticker`
689
+ - reactions: `reactionNotifications`, `reactionLevel`
690
+ - writes/history: `configWrites`, `historyLimit`, `dmHistoryLimit`, `dms.*.historyLimit`
691
+
692
+ ## Related
714
693
 
715
- **Bot doesn’t respond to non-mention messages in a group:**
716
-
717
- - If you set `channels.telegram.groups.*.requireMention=false`, Telegram’s Bot API **privacy mode** must be disabled.
718
- - BotFather: `/setprivacy` → **Disable** (then remove + re-add the bot to the group)
719
- - `openclaw channels status` shows a warning when config expects unmentioned group messages.
720
- - `openclaw channels status --probe` can additionally check membership for explicit numeric group IDs (it can’t audit wildcard `"*"` rules).
721
- - Quick test: `/activation always` (session-only; use config for persistence)
722
-
723
- **Bot not seeing group messages at all:**
724
-
725
- - If `channels.telegram.groups` is set, the group must be listed or use `"*"`
726
- - Check Privacy Settings in @BotFather → "Group Privacy" should be **OFF**
727
- - Verify bot is actually a member (not just an admin with no read access)
728
- - Check gateway logs: `openclaw logs --follow` (look for "skipping group message")
729
-
730
- **Bot responds to mentions but not `/activation always`:**
731
-
732
- - The `/activation` command updates session state but doesn't persist to config
733
- - For persistent behavior, add group to `channels.telegram.groups` with `requireMention: false`
734
-
735
- **Commands like `/status` don't work:**
736
-
737
- - Make sure your Telegram user ID is authorized (via pairing or `channels.telegram.allowFrom`)
738
- - Commands require authorization even in groups with `groupPolicy: "open"`
739
-
740
- **Long-polling aborts immediately on Node 22+ (often with proxies/custom fetch):**
741
-
742
- - Node 22+ is stricter about `AbortSignal` instances; foreign signals can abort `fetch` calls right away.
743
- - Upgrade to a OpenClaw build that normalizes abort signals, or run the gateway on Node 20 until you can upgrade.
744
-
745
- **Bot starts, then silently stops responding (or logs `HttpError: Network request ... failed`):**
746
-
747
- - Some hosts resolve `api.telegram.org` to IPv6 first. If your server does not have working IPv6 egress, grammY can get stuck on IPv6-only requests.
748
- - Fix by enabling IPv6 egress **or** forcing IPv4 resolution for `api.telegram.org` (for example, add an `/etc/hosts` entry using the IPv4 A record, or prefer IPv4 in your OS DNS stack), then restart the gateway.
749
- - Quick check: `dig +short api.telegram.org A` and `dig +short api.telegram.org AAAA` to confirm what DNS returns.
750
-
751
- ## Configuration reference (Telegram)
752
-
753
- Full configuration: [Configuration](/gateway/configuration)
754
-
755
- Provider options:
756
-
757
- - `channels.telegram.enabled`: enable/disable channel startup.
758
- - `channels.telegram.botToken`: bot token (BotFather).
759
- - `channels.telegram.tokenFile`: read token from file path.
760
- - `channels.telegram.dmPolicy`: `pairing | allowlist | open | disabled` (default: pairing).
761
- - `channels.telegram.allowFrom`: DM allowlist (ids/usernames). `open` requires `"*"`.
762
- - `channels.telegram.groupPolicy`: `open | allowlist | disabled` (default: allowlist).
763
- - `channels.telegram.groupAllowFrom`: group sender allowlist (ids/usernames).
764
- - `channels.telegram.groups`: per-group defaults + allowlist (use `"*"` for global defaults).
765
- - `channels.telegram.groups.<id>.groupPolicy`: per-group override for groupPolicy (`open | allowlist | disabled`).
766
- - `channels.telegram.groups.<id>.requireMention`: mention gating default.
767
- - `channels.telegram.groups.<id>.skills`: skill filter (omit = all skills, empty = none).
768
- - `channels.telegram.groups.<id>.allowFrom`: per-group sender allowlist override.
769
- - `channels.telegram.groups.<id>.systemPrompt`: extra system prompt for the group.
770
- - `channels.telegram.groups.<id>.enabled`: disable the group when `false`.
771
- - `channels.telegram.groups.<id>.topics.<threadId>.*`: per-topic overrides (same fields as group).
772
- - `channels.telegram.groups.<id>.topics.<threadId>.groupPolicy`: per-topic override for groupPolicy (`open | allowlist | disabled`).
773
- - `channels.telegram.groups.<id>.topics.<threadId>.requireMention`: per-topic mention gating override.
774
- - `channels.telegram.capabilities.inlineButtons`: `off | dm | group | all | allowlist` (default: allowlist).
775
- - `channels.telegram.accounts.<account>.capabilities.inlineButtons`: per-account override.
776
- - `channels.telegram.replyToMode`: `off | first | all` (default: `first`).
777
- - `channels.telegram.textChunkLimit`: outbound chunk size (chars).
778
- - `channels.telegram.chunkMode`: `length` (default) or `newline` to split on blank lines (paragraph boundaries) before length chunking.
779
- - `channels.telegram.linkPreview`: toggle link previews for outbound messages (default: true).
780
- - `channels.telegram.streamMode`: `off | partial | block` (draft streaming).
781
- - `channels.telegram.mediaMaxMb`: inbound/outbound media cap (MB).
782
- - `channels.telegram.retry`: retry policy for outbound Telegram API calls (attempts, minDelayMs, maxDelayMs, jitter).
783
- - `channels.telegram.network.autoSelectFamily`: override Node autoSelectFamily (true=enable, false=disable). Defaults to disabled on Node 22 to avoid Happy Eyeballs timeouts.
784
- - `channels.telegram.proxy`: proxy URL for Bot API calls (SOCKS/HTTP).
785
- - `channels.telegram.webhookUrl`: enable webhook mode (requires `channels.telegram.webhookSecret`).
786
- - `channels.telegram.webhookSecret`: webhook secret (required when webhookUrl is set).
787
- - `channels.telegram.webhookPath`: local webhook path (default `/telegram-webhook`).
788
- - `channels.telegram.actions.reactions`: gate Telegram tool reactions.
789
- - `channels.telegram.actions.sendMessage`: gate Telegram tool message sends.
790
- - `channels.telegram.actions.deleteMessage`: gate Telegram tool message deletes.
791
- - `channels.telegram.actions.sticker`: gate Telegram sticker actions — send and search (default: false).
792
- - `channels.telegram.reactionNotifications`: `off | own | all` — control which reactions trigger system events (default: `own` when not set).
793
- - `channels.telegram.reactionLevel`: `off | ack | minimal | extensive` — control agent's reaction capability (default: `minimal` when not set).
794
-
795
- Related global options:
796
-
797
- - `agents.list[].groupChat.mentionPatterns` (mention gating patterns).
798
- - `messages.groupChat.mentionPatterns` (global fallback).
799
- - `commands.native` (defaults to `"auto"` → on for Telegram/Discord, off for Slack), `commands.text`, `commands.useAccessGroups` (command behavior). Override with `channels.telegram.commands.native`.
800
- - `messages.responsePrefix`, `messages.ackReaction`, `messages.ackReactionScope`, `messages.removeAckAfterReply`.
694
+ - [Pairing](/channels/pairing)
695
+ - [Channel routing](/channels/channel-routing)
696
+ - [Troubleshooting](/channels/troubleshooting)