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.
- package/CHANGELOG.md +106 -0
- package/dist/{accounts-DbzMEfKN.js → accounts-DCDeFTra.js} +2 -2
- package/dist/{accounts-C2elk6PC.js → accounts-DeqIQjo1.js} +2 -2
- package/dist/{acp-cli-CVFTdsQY.js → acp-cli-CeYI4XRd.js} +15 -16
- package/dist/{acp-cli-BpJwIyLl.js → acp-cli-rNbGXICg.js} +14 -15
- package/dist/{agent-Bz1r5O8q.js → agent-BvNJF5QL.js} +19 -15
- package/dist/{agent-22-R4bNS.js → agent-CyMxTyrG.js} +20 -16
- package/dist/{agent-scope-D8miw9q_.js → agent-scope-BIEhVP4_.js} +172 -4
- package/dist/{agent-scope-CGmuusG9.js → agent-scope-CQCus0rI.js} +3 -3
- package/dist/{agent-scope-DQuy3dwI.js → agent-scope-CsRbLH4l.js} +4 -4
- package/dist/{agent-scope-BEf5crnU.js → agent-scope-DPIFau3f.js} +5 -1
- package/dist/audio-preflight-BU8W7uxc.js +60 -0
- package/dist/audio-preflight-CGsumMzb.js +60 -0
- package/dist/audio-preflight-SLmkJI6-.js +74 -0
- package/dist/audio-preflight-jZc5mFCZ.js +71 -0
- package/dist/{audit-C4wLaF0D.js → audit-Dmww_503.js} +71 -19
- package/dist/{audit-CY-yopxa.js → audit-wPu26VMb.js} +72 -20
- package/dist/{tailscale-DU6DgqVy.js → auth-9x3lqfIY.js} +208 -3
- package/dist/{tailscale-Cu-2HNvU.js → auth-CQNl_IaI.js} +190 -3
- package/dist/{auth-health-BFKUoCwJ.js → auth-health-C4L4FGBA.js} +1 -1
- package/dist/{auth-health-d7BMZlWG.js → auth-health-j6epgQbq.js} +1 -1
- package/dist/{auth-profiles-Bv1AEm-Y.js → auth-profiles-ByNs3eEm.js} +87 -31
- package/dist/build-info.json +3 -3
- package/dist/bundled/boot-md/handler.js +28 -22
- package/dist/bundled/session-memory/handler.js +33 -22
- package/dist/{call-7yrB6v4I.js → call-DVYCIV8m.js} +5 -5
- package/dist/{call-Bek1xlgk.js → call-SolyGS1r.js} +6 -6
- package/dist/canvas-host/a2ui/.bundle.hash +1 -1
- package/dist/{channel-options-3mdYN0C_.js → channel-options-BwC2yQcR.js} +4 -4
- package/dist/{channel-options-DJ0b1m7B.js → channel-options-Cq9BVDkP.js} +12 -7
- package/dist/{channel-selection-RZimme3j.js → channel-selection-D4D6ImhN.js} +2 -2
- package/dist/{channel-selection-B9b7Kuit.js → channel-selection-MZAHm4U8.js} +2 -2
- package/dist/{channels-cli-CYbK2Dku.js → channels-cli-9Dsk9Qm7.js} +57 -53
- package/dist/{channels-cli-BFznbGOs.js → channels-cli-BJUppQll.js} +59 -55
- package/dist/{channels-status-issues-B3KkflfR.js → channels-status-issues-D7GSV1GS.js} +1 -1
- package/dist/{channels-status-issues-DQkRaZts.js → channels-status-issues-DDAWeT-6.js} +1 -1
- package/dist/{chrome-Db7w64LF.js → chrome-BfB6JdKF.js} +4 -4
- package/dist/{chrome-Dm-EgOjJ.js → chrome-Cvr-57lg.js} +6 -5
- package/dist/{chrome-CF16STk9.js → chrome-DL0avO8n.js} +2 -1
- package/dist/{chrome-yIKmOzCO.js → chrome-foEwx3lN.js} +5 -4
- package/dist/{clack-prompter-BCiBkJVr.js → clack-prompter-Bz3Mmcl-.js} +5 -5
- package/dist/{clack-prompter-DuBVnTKy.js → clack-prompter-ChCGXfyt.js} +4 -4
- package/dist/cli/daemon-cli.js +1 -1
- package/dist/{cli-Cl3PdJei.js → cli-ZR9ugUBX.js} +42 -38
- package/dist/cli-miPe4Ujz.js +93 -0
- package/dist/{client-6xKrRC-1.js → client-BrYfyoDK.js} +54 -5
- package/dist/{client-DMloFP_O.js → client-CTwXnRl7.js} +54 -5
- package/dist/{command-format-ayFsmwwz.js → command-format-Bxe0mWee.js} +1 -1
- package/dist/{command-options-BTAzyqqb.js → command-options-BvgxzPbK.js} +9 -4
- package/dist/{commands-CjEGXOZ_.js → commands-BX_OIIVR.js} +4 -4
- package/dist/{completion-cli-DrJGfJGl.js → completion-cli-CR77-jyv.js} +3 -3
- package/dist/{completion-cli-DOec3E2Z.js → completion-cli-DnjpxAag.js} +30 -30
- package/dist/{config-B00lvFac.js → config-Bdhomfei.js} +21 -7
- package/dist/{config-XBdA0ciN.js → config-BvMsmctM.js} +83 -9
- package/dist/{config-BqGVMf1y.js → config-QYrbd7x7.js} +60 -6
- package/dist/{config--NUdpACy.js → config-aFQssWKX.js} +21 -7
- package/dist/{config-guard-4kCO_rnQ.js → config-guard-CljaSxJd.js} +160 -51
- package/dist/{configure-B69emwZv.js → configure-BXLiucXo.js} +28 -25
- package/dist/{configure-sMhpLzFf.js → configure-BYPqXzGZ.js} +28 -25
- package/dist/control-auth-8Cf4WXpR.js +54 -0
- package/dist/control-auth-DBCu3qyv.js +54 -0
- package/dist/{control-service-Db_1V-KY.js → control-service-B5KnPqGP.js} +11 -5
- package/dist/{control-service-IRAmbcbN.js → control-service-DKnttEus.js} +10 -4
- package/dist/control-ui/assets/{index-CnB9IO4a.js → index-B4LPvte9.js} +369 -369
- package/dist/control-ui/assets/index-B4LPvte9.js.map +1 -0
- package/dist/control-ui/index.html +1 -1
- package/dist/{cron-cli-Cum2324v.js → cron-cli-D7BRjDv2.js} +20 -20
- package/dist/{cron-cli-DhUWcYdk.js → cron-cli-z1zk_FXQ.js} +19 -19
- package/dist/{daemon-cli-q7nkEF5-.js → daemon-cli-BDkU2ocb.js} +60 -21
- package/dist/{daemon-cli-CTC2CHci.js → daemon-cli-cNSF93-v.js} +59 -20
- package/dist/{daemon-runtime-c0uXH4Dl.js → daemon-runtime-B0tg_LsX.js} +3 -3
- package/dist/{daemon-runtime-UsK-tOty.js → daemon-runtime-Bsjeut6m.js} +3 -3
- package/dist/{deliver-hf-WKyWd.js → deliver-CIU9Npgs.js} +373 -281
- package/dist/{deliver-CT6KiDqO.js → deliver-DYYCo1G7.js} +369 -278
- package/dist/{deliver-T9d44OpZ.js → deliver-LsxKETro.js} +371 -279
- package/dist/{deliver-CPy8jYj9.js → deliver-xUU3mGHo.js} +369 -277
- package/dist/{deps-Bv1kLtwo.js → deps-QSwGcoNZ.js} +2 -2
- package/dist/{deps-DFQdAWQc.js → deps-lAAA2zYI.js} +2 -2
- package/dist/{devices-cli-Cm7U1py9.js → devices-cli-BG3-2oqt.js} +14 -14
- package/dist/{devices-cli-ZpjlfK-e.js → devices-cli-VIQtOvt_.js} +14 -14
- package/dist/{directory-cli-B14TUSJA.js → directory-cli-BCJwjVC0.js} +16 -16
- package/dist/{directory-cli-67kzd4I5.js → directory-cli-jYzZ02gk.js} +14 -14
- package/dist/{dispatcher-3ElQWGVI.js → dispatcher-DY51b-Zc.js} +2 -2
- package/dist/{dns-cli-CU-xfhTN.js → dns-cli-DHIiMJjS.js} +12 -12
- package/dist/{dns-cli-Dqj7O6Q_.js → dns-cli-pZlv87Ib.js} +11 -11
- package/dist/{docs-cli-CamBqzb5.js → docs-cli-2JDiwfzP.js} +8 -8
- package/dist/{docs-cli-Cj3L5oqB.js → docs-cli-BhkYqoIQ.js} +7 -7
- package/dist/{doctor-BV1kvbMm.js → doctor-Bf8EhNtA.js} +36 -35
- package/dist/{doctor-BJirShBi.js → doctor-sYG5V4Co.js} +34 -33
- package/dist/entry.js +56 -18
- package/dist/{env-BxRc6wWv.js → env-ONzUVAG2.js} +1 -1
- package/dist/{exec-CijMSZd9.js → exec-B8lXct-k.js} +503 -14
- package/dist/{exec-B8JKbXKW.js → exec-CACT5OAW.js} +1 -1
- package/dist/{exec-57A8Rlc8.js → exec-CJFFoM7H.js} +32 -13
- package/dist/{exec-Cv_Ofd1m.js → exec-YIosokWE.js} +1 -1
- package/dist/{exec-approvals-cli-DEzz9Iai.js → exec-approvals-cli-7LH0lwhO.js} +21 -21
- package/dist/{exec-approvals-cli-DhXj3hQX.js → exec-approvals-cli-apGnQbpj.js} +21 -21
- package/dist/extensionAPI.js +7733 -8746
- package/dist/fetch-DmiOpALK.js +274 -0
- package/dist/fetch-timeout-BEtUjM1S.js +274 -0
- package/dist/fetch-timeout-DEoXG_SF.js +274 -0
- package/dist/fetch-timeout-DTK9vxex.js +274 -0
- package/dist/{gateway-cli-D1EdIq8I.js → gateway-cli-DUdYxlZS.js} +491 -136
- package/dist/{gateway-cli-B_xDUDy2.js → gateway-cli-DbvWmE-9.js} +495 -140
- package/dist/{gateway-rpc-3B5y445n.js → gateway-rpc-BByb2Snz.js} +3 -3
- package/dist/{gateway-rpc-BoL2vinh.js → gateway-rpc-wXSCUZXj.js} +3 -3
- package/dist/{github-copilot-auth-Omqrto0J.js → github-copilot-auth-D7ewvpMd.js} +205 -17
- package/dist/{github-copilot-auth-CZxurvdz.js → github-copilot-auth-DDispnyz.js} +205 -17
- package/dist/{github-copilot-token-SLWintYd.js → github-copilot-token-Cfs0Wxr8.js} +1 -1
- package/dist/{gmail-setup-utils-BXQKsLtI.js → gmail-setup-utils-Cfns8TQx.js} +3 -3
- package/dist/{gmail-setup-utils-CHcssBOA.js → gmail-setup-utils-DJb-_5kO.js} +4 -4
- package/dist/{health-format-Dy1caGsq.js → health-format-KGPokKJH.js} +97 -42
- package/dist/{health-format-DrGFg8bx.js → health-format-LZDxu3rv.js} +95 -40
- package/dist/{help-format-DAj7l5uV.js → help-format-C48TXngO.js} +1 -1
- package/dist/{help-format-CUnac_bT.js → help-format-R5fLToDw.js} +1 -1
- package/dist/{hooks-cli-ptEf6TIM.js → hooks-cli-CT8JCRkH.js} +51 -46
- package/dist/{hooks-cli-Bhf5VRp1.js → hooks-cli-S1MKumJO.js} +49 -44
- package/dist/{hooks-status-Br-2bK2G.js → hooks-status-Cw0xD8Lt.js} +3 -3
- package/dist/{hooks-status-DNQJSa4B.js → hooks-status-D9MhwHRp.js} +3 -3
- package/dist/{image-rOFfK3PJ.js → image-Brk1sJbw.js} +10 -7
- package/dist/{image-fUwR7slg.js → image-C4Nn2p3e.js} +10 -7
- package/dist/{image-Ds4NLGPR.js → image-DgtfXMcX.js} +9 -6
- package/dist/{image-Dnnxt82I.js → image-RKwc3fsL.js} +8 -5
- package/dist/index.js +208 -97
- package/dist/{installs-CRSjQxbR.js → installs-CrLcWYHe.js} +8 -7
- package/dist/{installs-89zeUsVn.js → installs-DscWb9b9.js} +8 -7
- package/dist/{links-7M-j83As.js → links-B8LAzWwg.js} +1 -1
- package/dist/{links-C591fM9M.js → links-Eax1UO3w.js} +1 -1
- package/dist/llm-slug-generator.js +18 -19
- package/dist/{loader-wXwp4rZJ.js → loader-KjT074JR.js} +5722 -6888
- package/dist/{logging-MMRGFxGI.js → logging-BAyPwvdH.js} +1 -1
- package/dist/{logging-DuK6YXuK.js → logging-CRq4h04P.js} +2 -2
- package/dist/{login-qr-wM8BnKJh.js → login-qr-B6ZgAuIf.js} +5 -5
- package/dist/{login-qr-CPEsT6dN.js → login-qr-Bua-p0nG.js} +3 -4
- package/dist/{login-qr-CGEu5TU-.js → login-qr-CuvemJj4.js} +6 -6
- package/dist/{login-qr-DH150tTp.js → login-qr-Djr1JfIf.js} +2 -2
- package/dist/{logs-cli-ClgkHnfT.js → logs-cli-9IAV7rWY.js} +38 -22
- package/dist/{logs-cli-CmfINsOj.js → logs-cli-EiKzUFPa.js} +37 -21
- package/dist/{manager-DYo4PlVM.js → manager-BIMh_eSm.js} +7 -8
- package/dist/{manager-D6EbxDV4.js → manager-CwinWQoz.js} +5 -5
- package/dist/{manager-BbnHek5T.js → manager-DkqF1GiK.js} +9 -9
- package/dist/{manager-CcVYv0N5.js → manager-T1XfGchB.js} +8 -8
- package/dist/{manifest-registry-3It8Z8yN.js → manifest-registry-CQhdnDBZ.js} +40 -2
- package/dist/{manifest-registry-D5SiA3xq.js → manifest-registry-u0okVSkU.js} +40 -2
- package/dist/{message-channel-Cu61-7H6.js → message-channel-BLi2a6Yw.js} +1 -1
- package/dist/{message-channel-BlgPSDAh.js → message-channel-C_MmebBt.js} +1 -1
- package/dist/{model-auth-ioeR_zLX.js → model-auth-CabXIF6O.js} +116 -34
- package/dist/{model-selection-BK7DuyH8.js → model-selection-BLuqsGVB.js} +86 -30
- package/dist/{model-selection-CezC36lH.js → model-selection-C1GmkTAV.js} +84 -28
- package/dist/{models-cli-C3uGdOrd.js → models-cli-9jmDv-h3.js} +52 -48
- package/dist/{models-cli-CUIVPgXE.js → models-cli-zS9rtWz8.js} +53 -49
- package/dist/{node-cli-BxBGSuPE.js → node-cli-CrpTxTTs.js} +28 -26
- package/dist/{node-cli-CdYAsuQQ.js → node-cli-wemUMCg-.js} +28 -26
- package/dist/{node-service-u8g85nD3.js → node-service-C8DTHTMg.js} +2 -2
- package/dist/{node-service-CM5vkdIo.js → node-service-WQuEKz6W.js} +2 -2
- package/dist/{nodes-cli-By6yeCTB.js → nodes-cli-BaU2SIFw.js} +20 -20
- package/dist/{nodes-cli-BaVMTAPc.js → nodes-cli-Dx23D72n.js} +20 -20
- package/dist/{nodes-screen-Dvl_ohUY.js → nodes-screen-C0IuBqUL.js} +1 -1
- package/dist/{note-5WqioBRA.js → note-BhRSeNeu.js} +2 -2
- package/dist/{note-Ci08TSbV.js → note-hhtubr2j.js} +1 -1
- package/dist/{onboard-channels-DxXvp8og.js → onboard-channels-C501x8GI.js} +8 -8
- package/dist/{onboard-channels-CXhnVy4E.js → onboard-channels-Dxzroasd.js} +8 -8
- package/dist/{onboard-skills-CBxsRGyf.js → onboard-skills-DV0Qzvjj.js} +440 -136
- package/dist/{onboard-skills-DQwOQ6Ry.js → onboard-skills-rlBHcu3Q.js} +439 -135
- package/dist/{onboarding-Du_7qEng.js → onboarding-CN-EDLjd.js} +38 -38
- package/dist/{openclaw-root-JLDMp6ux.js → openclaw-root-1VeFrph_.js} +4 -0
- package/dist/{openclaw-root-Dw6gumSU.js → openclaw-root-BNlEap4i.js} +4 -0
- package/dist/{pairing-cli-CRQDpj8f.js → pairing-cli-CDHG4xuI.js} +15 -15
- package/dist/{pairing-cli-Cng1KFWw.js → pairing-cli-CQP34Dlx.js} +15 -15
- package/dist/{pairing-labels-Ciu3Zoxj.js → pairing-labels-B6CN0SNH.js} +1 -1
- package/dist/{pairing-labels-CWFEtSc3.js → pairing-labels-CgNHnjzT.js} +1 -1
- package/dist/{pairing-store-c-QQ2u8p.js → pairing-store-CmlRVqOz.js} +2 -2
- package/dist/{pairing-store-CgXR3ZWJ.js → pairing-store-Dp5_JGnG.js} +3 -3
- package/dist/{path-env-CXWUFfFv.js → path-env-CLvYNwtL.js} +1 -1
- package/dist/{path-env-BgLvMbz_.js → path-env-CaYUVIML.js} +2 -2
- package/dist/{paths-MnZaxqPw.js → paths-B0a4ywSO.js} +30 -5
- package/dist/{paths-Bkhd_qY8.js → paths-B49s6UZQ.js} +30 -5
- package/dist/{paths-DL6EIRTw.js → paths-D0O87MfH.js} +30 -5
- package/dist/{paths-IivnSNkP.js → paths-DLINmNFQ.js} +31 -6
- package/dist/{pi-embedded-CgPTEqlB.js → pi-embedded-Ctrt2kz0.js} +8759 -9600
- package/dist/{pi-embedded-helpers-DYH6OWft.js → pi-embedded-helpers-CMKLjW6X.js} +68 -9
- package/dist/{pi-embedded-helpers-y1_Se0yq.js → pi-embedded-helpers-CUzTc1v6.js} +241 -24
- package/dist/{pi-embedded-helpers-Bkpd4fTr.js → pi-embedded-helpers-DfwkwPYD.js} +67 -8
- package/dist/{pi-embedded-helpers-BbWRSUnc.js → pi-embedded-helpers-WDwx99UA.js} +347 -32
- package/dist/{pi-tools.policy-akYsGFiA.js → pi-tools.policy-BpsROZbz.js} +4 -4
- package/dist/{plugin-auto-enable-lZwe2yX5.js → plugin-auto-enable-Bqhc3w5n.js} +5 -5
- package/dist/{plugin-auto-enable-AOSOJ-v1.js → plugin-auto-enable-PW76g_PJ.js} +5 -5
- package/dist/plugin-sdk/agents/bash-process-registry.d.ts +1 -0
- package/dist/plugin-sdk/agents/models-config.providers.d.ts +10 -0
- package/dist/plugin-sdk/agents/pi-embedded-helpers/errors.d.ts +5 -1
- package/dist/plugin-sdk/agents/pi-embedded-helpers.d.ts +1 -1
- package/dist/plugin-sdk/agents/pi-embedded-runner/google.d.ts +1 -0
- package/dist/plugin-sdk/agents/pi-embedded-runner/run/params.d.ts +2 -0
- package/dist/plugin-sdk/agents/pi-embedded-runner/run/payloads.d.ts +1 -0
- package/dist/plugin-sdk/agents/pi-embedded-runner/run/types.d.ts +2 -0
- package/dist/plugin-sdk/agents/pi-embedded-runner/types.d.ts +15 -0
- package/dist/plugin-sdk/agents/pi-embedded-subscribe.handlers.tools.d.ts +1 -1
- package/dist/plugin-sdk/agents/pi-embedded-subscribe.handlers.types.d.ts +2 -0
- package/dist/plugin-sdk/agents/pi-embedded-subscribe.types.d.ts +2 -0
- package/dist/plugin-sdk/agents/session-tool-result-guard-wrapper.d.ts +2 -0
- package/dist/plugin-sdk/agents/session-tool-result-guard.d.ts +4 -0
- package/dist/plugin-sdk/agents/tools/agent-step.d.ts +3 -0
- package/dist/plugin-sdk/agents/tools/browser-tool.schema.d.ts +1 -1
- package/dist/plugin-sdk/agents/tools/web-search.d.ts +10 -1
- package/dist/plugin-sdk/agents/usage.d.ts +1 -0
- package/dist/plugin-sdk/auto-reply/heartbeat.d.ts +1 -1
- package/dist/plugin-sdk/auto-reply/reply/get-reply-directives.d.ts +1 -0
- package/dist/plugin-sdk/auto-reply/reply/mentions.d.ts +1 -0
- package/dist/plugin-sdk/auto-reply/reply/model-selection.d.ts +3 -0
- package/dist/plugin-sdk/auto-reply/reply/reply-reference.d.ts +1 -1
- package/dist/plugin-sdk/auto-reply/reply/session-run-accounting.d.ts +11 -0
- package/dist/plugin-sdk/auto-reply/reply/session-usage.d.ts +8 -0
- package/dist/plugin-sdk/auto-reply/types.d.ts +2 -0
- package/dist/plugin-sdk/browser/control-auth.d.ts +13 -0
- package/dist/plugin-sdk/channels/plugins/onboarding/signal.d.ts +1 -0
- package/dist/plugin-sdk/cli/prompt.d.ts +1 -0
- package/dist/plugin-sdk/commands/agent/types.d.ts +2 -0
- package/dist/plugin-sdk/commands/onboard-types.d.ts +7 -1
- package/dist/plugin-sdk/config/sessions/paths.d.ts +7 -2
- package/dist/plugin-sdk/config/types.agents.d.ts +2 -0
- package/dist/plugin-sdk/config/types.discord.d.ts +5 -0
- package/dist/plugin-sdk/config/types.gateway.d.ts +15 -0
- package/dist/plugin-sdk/config/types.hooks.d.ts +15 -0
- package/dist/plugin-sdk/config/types.memory.d.ts +2 -0
- package/dist/plugin-sdk/config/zod-schema.agents.d.ts +1 -0
- package/dist/plugin-sdk/config/zod-schema.d.ts +13 -1
- package/dist/plugin-sdk/config/zod-schema.hooks.d.ts +1 -1
- package/dist/plugin-sdk/config/zod-schema.providers-core.d.ts +9 -0
- package/dist/plugin-sdk/config/zod-schema.providers.d.ts +4 -0
- package/dist/plugin-sdk/cron/service/jobs.d.ts +8 -0
- package/dist/plugin-sdk/cron/service/state.d.ts +1 -0
- package/dist/plugin-sdk/cron/types.d.ts +2 -0
- package/dist/plugin-sdk/discord/monitor/allow-list.d.ts +15 -0
- package/dist/plugin-sdk/discord/send.types.d.ts +5 -0
- package/dist/plugin-sdk/gateway/auth.d.ts +36 -0
- package/dist/plugin-sdk/gateway/protocol/index.d.ts +0 -3
- package/dist/plugin-sdk/gateway/protocol/schema/agent.d.ts +7 -1
- package/dist/plugin-sdk/gateway/session-utils.fs.d.ts +3 -1
- package/dist/plugin-sdk/index.js +935 -660
- package/dist/plugin-sdk/infra/binaries.d.ts +3 -0
- package/dist/plugin-sdk/infra/heartbeat-active-hours.d.ts +5 -0
- package/dist/plugin-sdk/infra/heartbeat-runner.d.ts +1 -0
- package/dist/plugin-sdk/infra/net/fetch-guard.d.ts +1 -0
- package/dist/plugin-sdk/infra/net/ssrf.d.ts +1 -0
- package/dist/plugin-sdk/infra/tailscale.d.ts +34 -0
- package/dist/plugin-sdk/infra/tmp-openclaw-dir.d.ts +10 -0
- package/dist/plugin-sdk/logging/console.d.ts +1 -0
- package/dist/plugin-sdk/logging/logger.d.ts +1 -1
- package/dist/plugin-sdk/logging/state.d.ts +1 -0
- package/dist/plugin-sdk/markdown/ir.d.ts +1 -1
- package/dist/plugin-sdk/markdown/whatsapp.d.ts +14 -0
- package/dist/plugin-sdk/media/input-files.d.ts +5 -0
- package/dist/plugin-sdk/media-understanding/audio-preflight.d.ts +16 -0
- package/dist/plugin-sdk/media-understanding/types.d.ts +1 -0
- package/dist/plugin-sdk/memory/backend-config.d.ts +2 -1
- package/dist/plugin-sdk/memory/qmd-manager.d.ts +2 -0
- package/dist/plugin-sdk/memory/qmd-query-parser.d.ts +8 -0
- package/dist/plugin-sdk/process/command-queue.d.ts +16 -0
- package/dist/plugin-sdk/routing/resolve-route.d.ts +3 -1
- package/dist/plugin-sdk/security/external-content.d.ts +1 -1
- package/dist/plugin-sdk/security/secret-equal.d.ts +1 -0
- package/dist/plugin-sdk/sessions/input-provenance.d.ts +16 -0
- package/dist/plugin-sdk/signal/monitor/event-handler.types.d.ts +8 -0
- package/dist/plugin-sdk/signal/monitor/mentions.d.ts +2 -0
- package/dist/plugin-sdk/slack/monitor/commands.d.ts +5 -0
- package/dist/plugin-sdk/telegram/bot-message-context.d.ts +2 -1
- package/dist/plugin-sdk/telegram/send.d.ts +3 -0
- package/dist/plugin-sdk/web/media.d.ts +2 -0
- package/dist/{plugins-Db5BiELK.js → plugins-4Hqd1WGf.js} +3 -3
- package/dist/{plugins-CNaHNND_.js → plugins-X7d_tfTE.js} +4 -4
- package/dist/{plugins-cli-8G-hQPCu.js → plugins-cli-Bgku3EGj.js} +253 -44
- package/dist/{plugins-cli-CDiocaDE.js → plugins-cli-CVToH3if.js} +257 -48
- package/dist/{ports-BeebfNCb.js → ports-qkt29rdC.js} +2 -2
- package/dist/{program-0Cj9YxRN.js → program-Cf7lkBur.js} +82 -80
- package/dist/{progress-DIQJt9Va.js → progress-C9kngsTD.js} +1 -1
- package/dist/{progress-Da1ehW-x.js → progress-DWqhRakV.js} +1 -1
- package/dist/{prompt-style-Dc0C5HC9.js → prompt-style-BFH5D5LN.js} +1 -1
- package/dist/{prompt-style-CjQRlDx4.js → prompt-style-CIbmaxSa.js} +1 -1
- package/dist/{pw-ai-C43wv1ZF.js → pw-ai-8mdv3h-d.js} +7 -6
- package/dist/{pw-ai-COWYvUfG.js → pw-ai-CM1IsSgZ.js} +6 -6
- package/dist/{pw-ai-BxJ-KCIy.js → pw-ai-FGoRVblI.js} +5 -6
- package/dist/{pw-ai-CsvaObGM.js → pw-ai-sS1fRKW_.js} +3 -3
- package/dist/{qmd-manager-CpsjQyaZ.js → qmd-manager-C67Fc8aN.js} +79 -26
- package/dist/{qmd-manager-C9YWFeG6.js → qmd-manager-CXVbfg99.js} +81 -26
- package/dist/{qmd-manager-C02E8ixK.js → qmd-manager-RMRE8Tqt.js} +81 -26
- package/dist/{qmd-manager-BzY2LQTT.js → qmd-manager-pyc_MTIe.js} +78 -23
- package/dist/{register.subclis-DUkirdHn.js → register.subclis-C02e4zuJ.js} +29 -29
- package/dist/{reply--b7BsXGP.js → reply-DICXkh_C.js} +7289 -8455
- package/dist/{routes-DUkEKAc1.js → routes-CmOI1hIH.js} +29 -11
- package/dist/{routes-B4QQiFju.js → routes-DewK5tq2.js} +29 -12
- package/dist/{rpc-CuMtxrRT.js → rpc-DHr30euf.js} +3 -3
- package/dist/{rpc-Blt6MJ4F.js → rpc-T300F8zI.js} +3 -3
- package/dist/{run-main-XZcPA23b.js → run-main-C5wpthq1.js} +84 -82
- package/dist/runner-CY0nmVme.js +1886 -0
- package/dist/runner-Cfm5nTMc.js +1785 -0
- package/dist/runner-D_dujMod.js +1886 -0
- package/dist/runner-DrGYLH5K.js +1785 -0
- package/dist/{sandbox-Aks-9EcZ.js → sandbox-BKYnhYQH.js} +24 -17
- package/dist/{sandbox-DqUO2K83.js → sandbox-Bhjnh1Xg.js} +23 -16
- package/dist/{sandbox-cli-C99Thxi8.js → sandbox-cli-DBsAjZJN.js} +21 -21
- package/dist/{sandbox-cli-CJqRM4V6.js → sandbox-cli-rV9LtFeu.js} +21 -21
- package/dist/{security-cli-iqYLMOz3.js → security-cli-BIwJM_rs.js} +27 -27
- package/dist/{security-cli-DW3lCz-o.js → security-cli-BRjny8Yu.js} +27 -27
- package/dist/{server-context-fX4xiYRh.js → server-context-BGpGs3qd.js} +7 -7
- package/dist/{server-context-8Qt35QdF.js → server-context-Cl0U0vE3.js} +7 -7
- package/dist/{server-node-events-CHWXfb_T.js → server-node-events-CBfTbiTA.js} +48 -44
- package/dist/{server-node-events-BzrEnKLX.js → server-node-events-QCvh8EgI.js} +45 -41
- package/dist/{service-Cd4BxKuo.js → service--nPk7DvT.js} +8 -4
- package/dist/{service-DDPRbf8a.js → service-99RDXwX4.js} +8 -4
- package/dist/{service-audit-CCFxuvKs.js → service-audit-DnLmRGQt.js} +4 -4
- package/dist/{service-audit-x6jCN-6a.js → service-audit-ckBaRCVC.js} +4 -4
- package/dist/{session-cost-usage-CcCEQNuc.js → session-cost-usage-D7HuoSSD.js} +12 -10
- package/dist/{session-cost-usage-PvyVZz-g.js → session-cost-usage-D9hHANWI.js} +12 -10
- package/dist/{shared-ILguacOr.js → shared-Bs4vduG4.js} +3 -3
- package/dist/{shared-CagUDdmp.js → shared-CEY5IkwG.js} +3 -3
- package/dist/{shared-gOyV38rM.js → shared-DRohONn_.js} +4 -4
- package/dist/{shared-BDk_zC9p.js → shared-ICqOZibV.js} +4 -4
- package/dist/{skill-scanner-C_fQzVDu.js → skill-scanner-CucvxYhu.js} +1 -1
- package/dist/{skill-scanner-DrVEHfC6.js → skill-scanner-rHMtUHtP.js} +1 -1
- package/dist/{skills-D5UZZZSY.js → skills-DRjfSQT3.js} +141 -6
- package/dist/{skills-ccAgQ3Ad.js → skills-DprQj9X2.js} +142 -7
- package/dist/{skills-cli-DQilTG3n.js → skills-cli-9WO-C55s.js} +12 -12
- package/dist/{skills-cli-ggyLBtAY.js → skills-cli-B9eej-EW.js} +13 -13
- package/dist/{skills-status-BosMnzIs.js → skills-status-5U3P3YfJ.js} +3 -3
- package/dist/{skills-status-DjtPPMnY.js → skills-status-TDIgVd1K.js} +2 -2
- package/dist/{sqlite-B7FPASCO.js → sqlite-BINzs1U0.js} +2 -2
- package/dist/{sqlite-Btrgi7-j.js → sqlite-D4w5TejA.js} +3 -3
- package/dist/{sqlite-BrQ9tw8B.js → sqlite-DRRHmlug.js} +3 -3
- package/dist/{sqlite-HepBVDoX.js → sqlite-F6PGkEm1.js} +2 -2
- package/dist/{status-BByCntWS.js → status-BKGkKC_v.js} +3 -3
- package/dist/{status-Dt7RE_Yy.js → status-CiHtHdaa.js} +4 -4
- package/dist/{status-zfL4Yej7.js → status-DDWoOpeB.js} +37 -37
- package/dist/{subsystem-Bh1Y_6Uv.js → subsystem-BoExtIHo.js} +52 -17
- package/dist/{system-cli-DwuUkdkH.js → system-cli-B6lr60Io.js} +14 -14
- package/dist/{system-cli-Clqsx8U5.js → system-cli-CprW9G3h.js} +14 -14
- package/dist/{systemd-BEWwfwn0.js → systemd-C0VZriGM.js} +3 -3
- package/dist/{systemd-D6wTPnHi.js → systemd-DrmBtJ5T.js} +3 -3
- package/dist/{systemd-hints-zi4ohCOY.js → systemd-hints-DZtXiVHa.js} +1 -1
- package/dist/{systemd-linger-CDo2UbHM.js → systemd-linger-NC2kl1SC.js} +2 -2
- package/dist/{systemd-linger-BxjTrgoH.js → systemd-linger-xdn3BdPh.js} +2 -2
- package/dist/{table-DEnmtvl5.js → table-B8dx3v4v.js} +2 -2
- package/dist/{table-cCoGqLsk.js → table-CwulTLQp.js} +1 -1
- package/dist/{tool-display-DskiU8Kt.js → tool-display-CZRIDMRm.js} +2 -2
- package/dist/{tool-display-o-dDAlqF.js → tool-display-ClRud3pg.js} +2 -2
- package/dist/{tui-BdJWZdto.js → tui-CVTQn-dC.js} +14 -13
- package/dist/{tui-Bc7XUQGP.js → tui-Lu8FdrlK.js} +13 -14
- package/dist/{tui-cli-BGYh0UL0.js → tui-cli-BLpTj1X9.js} +27 -27
- package/dist/{tui-cli-D3n-O9zB.js → tui-cli-BLx5kL2I.js} +26 -26
- package/dist/{tui-formatters-CA85v4U2.js → tui-formatters-CNySEfJN.js} +6 -6
- package/dist/{tui-formatters-C3NarH24.js → tui-formatters-DePhZK3J.js} +6 -6
- package/dist/{update-JB16aPIY.js → update-DHVxMTpQ.js} +3 -3
- package/dist/{update-Ct9sqJC_.js → update-DU1geolI.js} +3 -3
- package/dist/{update-cli-wWKDS3cm.js → update-cli-C0hUvJWK.js} +89 -71
- package/dist/{update-cli-DDXp_N9B.js → update-cli-Wb1GB3rL.js} +88 -70
- package/dist/{update-runner-ChTf6O6p.js → update-runner--ixK4J3W.js} +11 -11
- package/dist/{update-runner-CmE6cHdn.js → update-runner-7Qa1T9y6.js} +10 -10
- package/dist/{utils-Dk86IbEs.js → utils-BLJAc3ZV.js} +1 -1
- package/dist/{utils-es4ygvQ-.js → utils-Cd9QdCHh.js} +1 -1
- package/dist/{webhooks-cli-CVIE9TtX.js → webhooks-cli-DgcMy7RG.js} +12 -12
- package/dist/{webhooks-cli-BmKSiQQC.js → webhooks-cli-aVzUcJY9.js} +11 -11
- package/dist/{widearea-dns-2ah0bkAj.js → widearea-dns-BaIgNEhY.js} +3 -3
- package/dist/{widearea-dns-CMIG6-74.js → widearea-dns-DzuRdwk5.js} +3 -3
- package/dist/{ws-DtDKpbLR.js → ws-CHCQHs0F.js} +1 -1
- package/dist/{ws-log-BP3z_g6Z.js → ws-log-CIXbLCka.js} +1 -1
- package/dist/{ws-log-D7MkvKhg.js → ws-log-DcQFZByi.js} +2 -2
- package/dist/{wsl-Cwo7X0Un.js → wsl-BUOkxKJu.js} +2 -2
- package/docs/assets/install-script.svg +1 -0
- package/docs/automation/hooks.md +1 -38
- package/docs/automation/webhook.md +43 -2
- package/docs/channels/discord.md +389 -381
- package/docs/channels/imessage.md +229 -218
- package/docs/channels/slack.md +294 -415
- package/docs/channels/telegram.md +401 -505
- package/docs/channels/whatsapp.md +338 -310
- package/docs/ci.md +0 -12
- package/docs/cli/hooks.md +1 -14
- package/docs/cli/index.md +6 -1
- package/docs/cli/logs.md +4 -0
- package/docs/cli/onboard.md +30 -0
- package/docs/cli/plugins.md +20 -1
- package/docs/cli/security.md +1 -0
- package/docs/concepts/memory.md +7 -4
- package/docs/concepts/session-tool.md +1 -0
- package/docs/docs.json +11 -11
- package/docs/gateway/configuration-examples.md +9 -2
- package/docs/gateway/configuration-reference.md +2329 -0
- package/docs/gateway/configuration.md +338 -3304
- package/docs/gateway/index.md +162 -238
- package/docs/gateway/openresponses-http-api.md +15 -0
- package/docs/gateway/security/index.md +3 -0
- package/docs/help/faq.md +9 -0
- package/docs/install/hetzner.md +21 -0
- package/docs/install/installer.md +20 -0
- package/docs/nodes/audio.md +19 -0
- package/docs/platforms/mac/release.md +7 -7
- package/docs/providers/glm.md +3 -3
- package/docs/providers/index.md +1 -0
- package/docs/providers/litellm.md +153 -0
- package/docs/providers/zai.md +2 -2
- package/docs/reference/templates/AGENTS.md +26 -26
- package/docs/reference/templates/HEARTBEAT.md +31 -2
- package/docs/reference/templates/SOUL.md +14 -8
- package/docs/reference/transcript-hygiene.md +18 -0
- package/docs/start/getting-started.md +5 -0
- package/docs/start/wizard-cli-automation.md +17 -0
- package/docs/start/wizard-cli-reference.md +12 -0
- package/docs/tools/browser.md +6 -0
- package/docs/zh-CN/automation/hooks.md +1 -38
- package/docs/zh-CN/cli/hooks.md +1 -14
- package/extensions/bluebubbles/package.json +1 -1
- package/extensions/bluebubbles/src/monitor.test.ts +40 -28
- package/extensions/bluebubbles/src/monitor.ts +0 -4
- package/extensions/copilot-proxy/package.json +1 -1
- package/extensions/diagnostics-otel/package.json +10 -10
- package/extensions/discord/package.json +1 -1
- package/extensions/feishu/package.json +2 -5
- package/extensions/feishu/src/bot.checkBotMentioned.test.ts +64 -0
- package/extensions/feishu/src/bot.ts +1 -1
- package/extensions/feishu/src/channel.test.ts +48 -0
- package/extensions/feishu/src/channel.ts +1 -3
- package/extensions/feishu/src/config-schema.ts +6 -0
- package/extensions/feishu/src/docx.ts +14 -4
- package/extensions/feishu/src/media.test.ts +151 -0
- package/extensions/feishu/src/media.ts +27 -13
- package/extensions/feishu/src/reply-dispatcher.test.ts +116 -0
- package/extensions/feishu/src/reply-dispatcher.ts +124 -67
- package/extensions/feishu/src/streaming-card.ts +223 -0
- package/extensions/feishu/src/targets.test.ts +16 -0
- package/extensions/feishu/src/targets.ts +1 -1
- package/extensions/google-antigravity-auth/package.json +1 -1
- package/extensions/google-gemini-cli-auth/package.json +1 -1
- package/extensions/googlechat/package.json +1 -1
- package/extensions/imessage/package.json +1 -1
- package/extensions/irc/package.json +1 -1
- package/extensions/irc/src/client.ts +1 -1
- package/extensions/line/package.json +1 -1
- package/extensions/llm-task/package.json +1 -1
- package/extensions/lobster/package.json +1 -1
- package/extensions/matrix/CHANGELOG.md +6 -0
- package/extensions/matrix/package.json +2 -2
- package/extensions/mattermost/package.json +1 -1
- package/extensions/memory-core/package.json +1 -1
- package/extensions/memory-lancedb/index.ts +6 -2
- package/extensions/memory-lancedb/package.json +2 -2
- package/extensions/minimax-portal-auth/index.ts +7 -5
- package/extensions/minimax-portal-auth/package.json +1 -1
- package/extensions/msteams/CHANGELOG.md +6 -0
- package/extensions/msteams/package.json +1 -1
- package/extensions/nextcloud-talk/package.json +1 -1
- package/extensions/nostr/CHANGELOG.md +6 -0
- package/extensions/nostr/package.json +2 -2
- package/extensions/open-prose/package.json +1 -1
- package/extensions/signal/package.json +1 -1
- package/extensions/slack/package.json +1 -1
- package/extensions/telegram/package.json +1 -1
- package/extensions/tlon/package.json +1 -1
- package/extensions/twitch/CHANGELOG.md +6 -0
- package/extensions/twitch/package.json +1 -1
- package/extensions/voice-call/CHANGELOG.md +6 -0
- package/extensions/voice-call/package.json +1 -1
- package/extensions/voice-call/src/media-stream.ts +7 -1
- package/extensions/voice-call/src/providers/twilio.test.ts +5 -3
- package/extensions/voice-call/src/providers/twilio.ts +12 -1
- package/extensions/whatsapp/package.json +1 -1
- package/extensions/zalo/CHANGELOG.md +6 -0
- package/extensions/zalo/package.json +1 -1
- package/extensions/zalouser/CHANGELOG.md +6 -0
- package/extensions/zalouser/package.json +1 -1
- package/package.json +26 -22
- package/dist/auth-BcNHFK-i.js +0 -184
- package/dist/auth-BvIPpm7G.js +0 -184
- package/dist/boolean-M-esQJt6.js +0 -30
- package/dist/bundled/soul-evil/HOOK.md +0 -71
- package/dist/bundled/soul-evil/handler.js +0 -194
- package/dist/cli-DJbWJ9aB.js +0 -89
- package/dist/config-CI7EpvlP.js +0 -15
- package/dist/control-ui/assets/index-CnB9IO4a.js.map +0 -1
- package/dist/date-time-c6HTX6IW.js +0 -187
- package/dist/frontmatter-xwTm0734.js +0 -105
- package/dist/parse-duration-De_tAQSe.js +0 -24
- package/dist/session-key-nXYQSv-a.js +0 -167
- package/dist/utils-dp_OM900.js +0 -476
- package/docs/hooks/soul-evil.md +0 -69
- package/docs/zh-CN/hooks/soul-evil.md +0 -72
- /package/dist/{archive-CXhvR9nU.js → archive-beaSfAzA.js} +0 -0
- /package/dist/{brew-BIrWdDps.js → brew-BUIxHEkn.js} +0 -0
- /package/dist/{brew-B7YK4ZoL.js → brew-ROHf0-Xp.js} +0 -0
- /package/dist/{cli-utils-PlLcDZlM.js → cli-utils-CRhVAaLV.js} +0 -0
- /package/dist/{cli-utils-R-ECs5cY.js → cli-utils-LcHOt63h.js} +0 -0
- /package/dist/{command-format-BUxhT1xL.js → command-format-qUVxzqYm.js} +0 -0
- /package/dist/{constants-CNTiY-ZN.js → constants-BvQ6S8j5.js} +0 -0
- /package/dist/{constants-DuoCkWRh.js → constants-JPeoOZnw.js} +0 -0
- /package/dist/{errors-D3tYRJWG.js → errors-B91HIDPD.js} +0 -0
- /package/dist/{errors-B0eT3jVv.js → errors-Bv81hF2P.js} +0 -0
- /package/dist/{errors-x4NYs-1P.js → errors-DjZBTJJ3.js} +0 -0
- /package/dist/{exec-approvals-DGPTjO0N.js → exec-approvals-Cb4ZLukq.js} +0 -0
- /package/dist/{exec-approvals-DhmKpiIo.js → exec-approvals-DQ8TVVmj.js} +0 -0
- /package/dist/{format-CaxeRcue.js → format-CNU-Zkrz.js} +0 -0
- /package/dist/{format-DLOJPZmo.js → format-DcfK-dwd.js} +0 -0
- /package/dist/{format-duration-Be5Z7JdJ.js → format-duration-84n6_DgO.js} +0 -0
- /package/dist/{format-duration-CEmFWLyX.js → format-duration-Bo9zNKwO.js} +0 -0
- /package/dist/{format-relative-79_Y1n2Y.js → format-relative-CZOlQ2pA.js} +0 -0
- /package/dist/{format-relative-Db7eqEu8.js → format-relative-cegC_FF5.js} +0 -0
- /package/dist/{github-copilot-token-C9IJh2Pn.js → github-copilot-token-DkiRbJdR.js} +0 -0
- /package/dist/{helpers-CQI-5xS9.js → helpers-8O7IVGO-.js} +0 -0
- /package/dist/{helpers-CRzoyyXS.js → helpers-D_jqdWkd.js} +0 -0
- /package/dist/{helpers-C89IG08W.js → helpers-HyeZXsnu.js} +0 -0
- /package/dist/{is-main-WWuz28Ip.js → is-main-BWoXGz7p.js} +0 -0
- /package/dist/{logging-BzvBIA3Y.js → logging-fywhKCmE.js} +0 -0
- /package/dist/{nodes-screen-lykd2cny.js → nodes-screen-CdCWeiwy.js} +0 -0
- /package/dist/{parse-Cjiudy6x.js → parse-Bw0oH-rT.js} +0 -0
- /package/dist/{parse-DqAvJRIf.js → parse-ioZhOtha.js} +0 -0
- /package/dist/{parse-log-line-CUrpqe1w.js → parse-log-line-BoDqomM4.js} +0 -0
- /package/dist/{parse-log-line-D2UGw0wR.js → parse-log-line-DPxH1XZx.js} +0 -0
- /package/dist/{parse-timeout-DFSPLxpY.js → parse-timeout-D1XX_zN_.js} +0 -0
- /package/dist/{parse-timeout-DV8NQQWk.js → parse-timeout-DMW-z4Iz.js} +0 -0
- /package/dist/{pi-model-discovery-CV2V1HHz.js → pi-model-discovery-DqgqUyAv.js} +0 -0
- /package/dist/{pi-model-discovery-DzFOAbQt.js → pi-model-discovery-EwKVHlZB.js} +0 -0
- /package/dist/{prompts--d-6l5Ln.js → prompts-Bg96reub.js} +0 -0
- /package/dist/{redact-DAKeu7PA.js → redact-BRsnXqwD.js} +0 -0
- /package/dist/{redact-DuEEf1p1.js → redact-Br9GfacZ.js} +0 -0
- /package/dist/{redact-BOIof271.js → redact-BrXLgslJ.js} +0 -0
- /package/dist/{status-Cv36yYdi.js → status-BRZfQbJ2.js} +0 -0
- /package/dist/{status-Drziap9H.js → status-CoAy6bEC.js} +0 -0
- /package/dist/{systemd-hints-CH4pbCFD.js → systemd-hints-CXNtLw9Q.js} +0 -0
- /package/dist/{tailnet-DGRSvYuQ.js → tailnet-DATIFSsY.js} +0 -0
- /package/dist/{transcript-events-BlIONGVn.js → transcript-events-BHS7QoRl.js} +0 -0
- /package/dist/{transcript-events-C1hdue6u.js → transcript-events-Bp7fGnwv.js} +0 -0
- /package/dist/{transcript-events-CZ8CG4ht.js → transcript-events-BtNd-j6q.js} +0 -0
- /package/dist/{usage-format-6Uar63S0.js → usage-format-C4JfTbSp.js} +0 -0
- /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
|
|
10
|
+
Status: production-ready for bot DMs + groups via grammY. Long polling is the default mode; webhook mode is optional.
|
|
11
11
|
|
|
12
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
32
|
+
</Step>
|
|
37
33
|
|
|
38
|
-
|
|
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
|
|
73
|
-
If both env and config are set, config takes precedence.
|
|
49
|
+
Env fallback: `TELEGRAM_BOT_TOKEN=...` (default account only).
|
|
74
50
|
|
|
75
|
-
|
|
51
|
+
</Step>
|
|
76
52
|
|
|
77
|
-
|
|
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
|
-
|
|
55
|
+
```bash
|
|
56
|
+
openclaw gateway
|
|
57
|
+
openclaw pairing list telegram
|
|
58
|
+
openclaw pairing approve telegram <CODE>
|
|
59
|
+
```
|
|
82
60
|
|
|
83
|
-
|
|
61
|
+
Pairing codes expire after 1 hour.
|
|
84
62
|
|
|
85
|
-
|
|
86
|
-
- If a token leaks, revoke/regenerate it via @BotFather and update your config.
|
|
63
|
+
</Step>
|
|
87
64
|
|
|
88
|
-
|
|
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
|
-
|
|
91
|
-
|
|
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
|
-
|
|
94
|
-
- Add the bot as a group **admin** (admin bots receive all messages).
|
|
74
|
+
## Telegram side settings
|
|
95
75
|
|
|
96
|
-
|
|
97
|
-
|
|
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
|
-
|
|
80
|
+
If the bot must see all group messages, either:
|
|
100
81
|
|
|
101
|
-
|
|
102
|
-
|
|
82
|
+
- disable privacy mode via `/setprivacy`, or
|
|
83
|
+
- make the bot a group admin.
|
|
103
84
|
|
|
104
|
-
|
|
85
|
+
When toggling privacy mode, remove + re-add the bot in each group so Telegram applies the change.
|
|
105
86
|
|
|
106
|
-
|
|
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
|
-
|
|
89
|
+
<Accordion title="Group permissions">
|
|
90
|
+
Admin status is controlled in Telegram group settings.
|
|
114
91
|
|
|
115
|
-
|
|
92
|
+
Admin bots receive all group messages, which is useful for always-on group behavior.
|
|
116
93
|
|
|
117
|
-
|
|
94
|
+
</Accordion>
|
|
118
95
|
|
|
119
|
-
|
|
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
|
-
|
|
98
|
+
- `/setjoingroups` to allow/deny group adds
|
|
99
|
+
- `/setprivacy` for group visibility behavior
|
|
124
100
|
|
|
125
|
-
|
|
101
|
+
</Accordion>
|
|
102
|
+
</AccordionGroup>
|
|
126
103
|
|
|
127
|
-
|
|
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
|
-
|
|
106
|
+
<Tabs>
|
|
107
|
+
<Tab title="DM policy">
|
|
108
|
+
`channels.telegram.dmPolicy` controls direct message access:
|
|
133
109
|
|
|
134
|
-
|
|
135
|
-
|
|
110
|
+
- `pairing` (default)
|
|
111
|
+
- `allowlist`
|
|
112
|
+
- `open` (requires `allowFrom` to include `"*"`)
|
|
113
|
+
- `disabled`
|
|
136
114
|
|
|
137
|
-
|
|
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
|
-
|
|
117
|
+
### Finding your Telegram user ID
|
|
151
118
|
|
|
152
|
-
|
|
153
|
-
- If you see `sendMessage` or `sendChatAction` failures, check IPv6 routing and DNS.
|
|
119
|
+
Safer (no third-party bot):
|
|
154
120
|
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
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
|
-
|
|
125
|
+
Official Bot API method:
|
|
166
126
|
|
|
167
|
-
|
|
127
|
+
```bash
|
|
128
|
+
curl "https://api.telegram.org/bot<bot_token>/getUpdates"
|
|
129
|
+
```
|
|
168
130
|
|
|
169
|
-
|
|
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
|
-
|
|
133
|
+
</Tab>
|
|
174
134
|
|
|
175
|
-
|
|
135
|
+
<Tab title="Group policy and allowlists">
|
|
136
|
+
There are two independent controls:
|
|
176
137
|
|
|
177
|
-
|
|
178
|
-
-
|
|
179
|
-
-
|
|
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
|
-
|
|
142
|
+
2. **Which senders are allowed in groups** (`channels.telegram.groupPolicy`)
|
|
143
|
+
- `open`
|
|
144
|
+
- `allowlist` (default)
|
|
145
|
+
- `disabled`
|
|
185
146
|
|
|
186
|
-
|
|
147
|
+
`groupAllowFrom` is used for group sender filtering. If not set, Telegram falls back to `allowFrom`.
|
|
187
148
|
|
|
188
|
-
|
|
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": {
|
|
156
|
+
"-1001234567890": {
|
|
157
|
+
groupPolicy: "open",
|
|
158
|
+
requireMention: false,
|
|
159
|
+
},
|
|
196
160
|
},
|
|
197
161
|
},
|
|
198
162
|
},
|
|
199
163
|
}
|
|
200
164
|
```
|
|
201
165
|
|
|
202
|
-
|
|
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
|
-
|
|
168
|
+
<Tab title="Mention behavior">
|
|
169
|
+
Group replies require mention by default.
|
|
206
170
|
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
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
|
-
|
|
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:
|
|
192
|
+
"*": { requireMention: false },
|
|
227
193
|
},
|
|
228
194
|
},
|
|
229
195
|
},
|
|
230
196
|
}
|
|
231
197
|
```
|
|
232
198
|
|
|
233
|
-
|
|
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
|
-
|
|
231
|
+
Modes:
|
|
236
232
|
|
|
237
|
-
-
|
|
238
|
-
-
|
|
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
|
-
|
|
237
|
+
`draftChunk` defaults for block mode:
|
|
241
238
|
|
|
242
|
-
|
|
239
|
+
- `minChars: 200`
|
|
240
|
+
- `maxChars: 800`
|
|
241
|
+
- `breakPreference: "paragraph"`
|
|
243
242
|
|
|
244
|
-
|
|
243
|
+
`maxChars` is clamped by `channels.telegram.textChunkLimit`.
|
|
245
244
|
|
|
246
|
-
|
|
245
|
+
Draft streaming is DM-only; groups/channels do not use draft bubbles.
|
|
247
246
|
|
|
248
|
-
|
|
247
|
+
If you want early real Telegram messages instead of draft updates, use block streaming (`channels.telegram.blockStreaming: true`).
|
|
249
248
|
|
|
250
|
-
|
|
249
|
+
Telegram-only reasoning stream:
|
|
251
250
|
|
|
252
|
-
|
|
251
|
+
- `/reasoning stream` sends reasoning to the draft bubble while generating
|
|
252
|
+
- final answer is sent without reasoning text
|
|
253
253
|
|
|
254
|
-
|
|
254
|
+
</Accordion>
|
|
255
255
|
|
|
256
|
-
|
|
257
|
-
|
|
256
|
+
<Accordion title="Formatting and HTML fallback">
|
|
257
|
+
Outbound text uses Telegram `parse_mode: "HTML"`.
|
|
258
258
|
|
|
259
|
-
|
|
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: {
|
|
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
|
-
|
|
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
|
-
|
|
307
|
+
### Device pairing commands (`device-pair` plugin)
|
|
270
308
|
|
|
271
|
-
|
|
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
|
-
|
|
311
|
+
1. `/pair` generates setup code
|
|
312
|
+
2. paste code in iOS app
|
|
313
|
+
3. `/pair approve` approves latest pending request
|
|
279
314
|
|
|
280
|
-
|
|
315
|
+
More details: [Pairing](/channels/pairing#pair-via-telegram-recommended-for-ios).
|
|
281
316
|
|
|
282
|
-
|
|
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
|
-
|
|
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
|
-
|
|
323
|
-
|
|
354
|
+
- `off`
|
|
355
|
+
- `dm`
|
|
356
|
+
- `group`
|
|
357
|
+
- `all`
|
|
358
|
+
- `allowlist` (default)
|
|
324
359
|
|
|
325
|
-
|
|
360
|
+
Legacy `capabilities: ["inlineButtons"]` maps to `inlineButtons: "all"`.
|
|
326
361
|
|
|
327
|
-
|
|
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
|
-
|
|
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
|
-
|
|
383
|
+
</Accordion>
|
|
371
384
|
|
|
372
|
-
|
|
373
|
-
|
|
385
|
+
<Accordion title="Telegram message actions for agents and automation">
|
|
386
|
+
Telegram tool actions include:
|
|
374
387
|
|
|
375
|
-
|
|
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
|
-
|
|
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
|
-
|
|
381
|
-
curl "https://api.telegram.org/bot<bot_token>/getUpdates"
|
|
382
|
-
```
|
|
395
|
+
Gating controls:
|
|
383
396
|
|
|
384
|
-
|
|
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
|
-
|
|
403
|
+
Reaction removal semantics: [/tools/reactions](/tools/reactions)
|
|
387
404
|
|
|
388
|
-
|
|
405
|
+
</Accordion>
|
|
389
406
|
|
|
390
|
-
|
|
407
|
+
<Accordion title="Reply threading tags">
|
|
408
|
+
Telegram supports explicit reply threading tags in generated output:
|
|
391
409
|
|
|
392
|
-
|
|
410
|
+
- `[[reply_to_current]]` replies to the triggering message
|
|
411
|
+
- `[[reply_to:<id>]]` replies to a specific Telegram message ID
|
|
393
412
|
|
|
394
|
-
|
|
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
|
-
|
|
415
|
+
- `first` (default)
|
|
416
|
+
- `all`
|
|
417
|
+
- `off`
|
|
399
418
|
|
|
400
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
431
|
+
- message sends omit `message_thread_id` (Telegram rejects `sendMessage(...thread_id=1)`)
|
|
432
|
+
- typing actions still include `message_thread_id`
|
|
432
433
|
|
|
433
|
-
|
|
434
|
+
Topic inheritance: topic entries inherit group settings unless overridden (`requireMention`, `allowFrom`, `skills`, `systemPrompt`, `enabled`, `groupPolicy`).
|
|
434
435
|
|
|
435
|
-
|
|
436
|
-
- `[[reply_to:<id>]]` -- reply to a specific message id.
|
|
436
|
+
Template context includes:
|
|
437
437
|
|
|
438
|
-
|
|
438
|
+
- `MessageThreadId`
|
|
439
|
+
- `IsForum`
|
|
439
440
|
|
|
440
|
-
|
|
441
|
+
DM thread behavior:
|
|
441
442
|
|
|
442
|
-
|
|
443
|
+
- private chats with `message_thread_id` keep DM routing but use thread-aware session keys/reply targets.
|
|
443
444
|
|
|
444
|
-
|
|
445
|
-
OpenClaw defaults to audio files for backward compatibility.
|
|
445
|
+
</Accordion>
|
|
446
446
|
|
|
447
|
-
|
|
447
|
+
<Accordion title="Audio, video, and stickers">
|
|
448
|
+
### Audio messages
|
|
448
449
|
|
|
449
|
-
|
|
450
|
+
Telegram distinguishes voice notes vs audio files.
|
|
450
451
|
|
|
451
|
-
|
|
452
|
+
- default: audio file behavior
|
|
453
|
+
- tag `[[audio_as_voice]]` in agent reply to force voice-note send
|
|
452
454
|
|
|
453
|
-
|
|
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
|
-
|
|
467
|
+
### Video messages
|
|
467
468
|
|
|
468
|
-
Telegram distinguishes
|
|
469
|
-
OpenClaw defaults to video files.
|
|
469
|
+
Telegram distinguishes video files vs video notes.
|
|
470
470
|
|
|
471
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
487
|
+
Inbound sticker handling:
|
|
498
488
|
|
|
499
|
-
-
|
|
500
|
-
|
|
501
|
-
|
|
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
|
-
|
|
493
|
+
Sticker context fields:
|
|
507
494
|
|
|
508
|
-
|
|
495
|
+
- `Sticker.emoji`
|
|
496
|
+
- `Sticker.setName`
|
|
497
|
+
- `Sticker.fileId`
|
|
498
|
+
- `Sticker.fileUniqueId`
|
|
499
|
+
- `Sticker.cachedDescription`
|
|
509
500
|
|
|
510
|
-
|
|
501
|
+
Sticker cache file:
|
|
511
502
|
|
|
512
|
-
|
|
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
|
-
|
|
505
|
+
Stickers are described once (when possible) and cached to reduce repeated vision calls.
|
|
517
506
|
|
|
518
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
543
|
+
</Accordion>
|
|
586
544
|
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
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
|
-
|
|
552
|
+
Config:
|
|
603
553
|
|
|
604
|
-
|
|
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
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
threadId: 123,
|
|
580
|
+
channels: {
|
|
581
|
+
telegram: {
|
|
582
|
+
configWrites: false,
|
|
583
|
+
},
|
|
584
|
+
},
|
|
614
585
|
}
|
|
615
586
|
```
|
|
616
587
|
|
|
617
|
-
|
|
588
|
+
</Accordion>
|
|
618
589
|
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
final reply as a normal message.
|
|
590
|
+
<Accordion title="Long polling vs webhook">
|
|
591
|
+
Default: long polling.
|
|
622
592
|
|
|
623
|
-
|
|
593
|
+
Webhook mode:
|
|
624
594
|
|
|
625
|
-
-
|
|
626
|
-
-
|
|
627
|
-
-
|
|
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
|
-
|
|
599
|
+
Default local listener for webhook mode binds to `0.0.0.0:8787`.
|
|
630
600
|
|
|
631
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
623
|
+
</Accordion>
|
|
624
|
+
</AccordionGroup>
|
|
653
625
|
|
|
654
|
-
##
|
|
626
|
+
## Troubleshooting
|
|
655
627
|
|
|
656
|
-
|
|
657
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
646
|
+
</Accordion>
|
|
675
647
|
|
|
676
|
-
|
|
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
|
-
-
|
|
682
|
-
|
|
683
|
-
|
|
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
|
-
|
|
654
|
+
</Accordion>
|
|
688
655
|
|
|
689
|
-
|
|
656
|
+
<Accordion title="Polling or network instability">
|
|
690
657
|
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
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
|
-
|
|
667
|
+
</Accordion>
|
|
668
|
+
</AccordionGroup>
|
|
703
669
|
|
|
704
|
-
|
|
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
|
-
##
|
|
672
|
+
## Telegram config reference pointers
|
|
709
673
|
|
|
710
|
-
|
|
711
|
-
- Example: `openclaw message send --channel telegram --target 123456789 --message "hi"`.
|
|
674
|
+
Primary reference:
|
|
712
675
|
|
|
713
|
-
|
|
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
|
-
|
|
716
|
-
|
|
717
|
-
-
|
|
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)
|