vilvona 1.0.0

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 (812) hide show
  1. package/CHANGELOG.md +12331 -0
  2. package/LICENSE +24 -0
  3. package/README.md +314 -0
  4. package/THIRD_PARTY_NOTICES.md +37 -0
  5. package/docs/.i18n/README.md +81 -0
  6. package/docs/.i18n/ar-navigation.json +18 -0
  7. package/docs/.i18n/de-navigation.json +18 -0
  8. package/docs/.i18n/es-navigation.json +18 -0
  9. package/docs/.i18n/fr-navigation.json +18 -0
  10. package/docs/.i18n/glossary.ar.json +82 -0
  11. package/docs/.i18n/glossary.de.json +82 -0
  12. package/docs/.i18n/glossary.es.json +82 -0
  13. package/docs/.i18n/glossary.fa.json +82 -0
  14. package/docs/.i18n/glossary.fr.json +82 -0
  15. package/docs/.i18n/glossary.id.json +82 -0
  16. package/docs/.i18n/glossary.it.json +82 -0
  17. package/docs/.i18n/glossary.ja-JP.json +102 -0
  18. package/docs/.i18n/glossary.ko.json +82 -0
  19. package/docs/.i18n/glossary.nl.json +82 -0
  20. package/docs/.i18n/glossary.pl.json +82 -0
  21. package/docs/.i18n/glossary.pt-BR.json +82 -0
  22. package/docs/.i18n/glossary.th.json +82 -0
  23. package/docs/.i18n/glossary.tr.json +82 -0
  24. package/docs/.i18n/glossary.uk.json +82 -0
  25. package/docs/.i18n/glossary.vi.json +82 -0
  26. package/docs/.i18n/glossary.zh-CN.json +1182 -0
  27. package/docs/.i18n/glossary.zh-TW.json +162 -0
  28. package/docs/.i18n/id-navigation.json +18 -0
  29. package/docs/.i18n/it-navigation.json +18 -0
  30. package/docs/.i18n/ja-navigation.json +18 -0
  31. package/docs/.i18n/ko-navigation.json +18 -0
  32. package/docs/.i18n/pl-navigation.json +18 -0
  33. package/docs/.i18n/pt-BR-navigation.json +18 -0
  34. package/docs/.i18n/tr-navigation.json +18 -0
  35. package/docs/.i18n/translation-workflow.md +111 -0
  36. package/docs/.i18n/zh-Hans-navigation.json +552 -0
  37. package/docs/AGENTS.md +36 -0
  38. package/docs/agent-runtime-architecture.md +48 -0
  39. package/docs/announcements/bluebubbles-imessage.md +79 -0
  40. package/docs/auth-credential-semantics.md +124 -0
  41. package/docs/automation/auth-monitoring.md +11 -0
  42. package/docs/automation/clawflow.md +12 -0
  43. package/docs/automation/cron-jobs.md +569 -0
  44. package/docs/automation/cron-vs-heartbeat.md +11 -0
  45. package/docs/automation/gmail-pubsub.md +11 -0
  46. package/docs/automation/hooks.md +387 -0
  47. package/docs/automation/index.md +135 -0
  48. package/docs/automation/poll.md +12 -0
  49. package/docs/automation/standing-orders.md +250 -0
  50. package/docs/automation/taskflow.md +155 -0
  51. package/docs/automation/tasks.md +374 -0
  52. package/docs/automation/troubleshooting.md +12 -0
  53. package/docs/automation/webhook.md +12 -0
  54. package/docs/brave-search.md +11 -0
  55. package/docs/channels/access-groups.md +201 -0
  56. package/docs/channels/ambient-room-events.md +214 -0
  57. package/docs/channels/bot-loop-protection.md +131 -0
  58. package/docs/channels/broadcast-groups.md +472 -0
  59. package/docs/channels/channel-routing.md +162 -0
  60. package/docs/channels/clickclack.md +146 -0
  61. package/docs/channels/discord.md +1758 -0
  62. package/docs/channels/feishu.md +654 -0
  63. package/docs/channels/googlechat.md +286 -0
  64. package/docs/channels/group-messages.md +95 -0
  65. package/docs/channels/groups.md +610 -0
  66. package/docs/channels/imessage-from-bluebubbles.md +259 -0
  67. package/docs/channels/imessage.md +864 -0
  68. package/docs/channels/index.md +65 -0
  69. package/docs/channels/irc.md +253 -0
  70. package/docs/channels/line.md +243 -0
  71. package/docs/channels/location.md +71 -0
  72. package/docs/channels/matrix-migration.md +375 -0
  73. package/docs/channels/matrix-presentation.md +77 -0
  74. package/docs/channels/matrix-push-rules.md +150 -0
  75. package/docs/channels/matrix.md +935 -0
  76. package/docs/channels/mattermost.md +542 -0
  77. package/docs/channels/msteams.md +1097 -0
  78. package/docs/channels/nextcloud-talk.md +176 -0
  79. package/docs/channels/nostr.md +253 -0
  80. package/docs/channels/pairing.md +214 -0
  81. package/docs/channels/qqbot.md +317 -0
  82. package/docs/channels/signal.md +417 -0
  83. package/docs/channels/slack.md +1623 -0
  84. package/docs/channels/sms.md +380 -0
  85. package/docs/channels/synology-chat.md +187 -0
  86. package/docs/channels/telegram.md +1121 -0
  87. package/docs/channels/tlon.md +296 -0
  88. package/docs/channels/troubleshooting.md +162 -0
  89. package/docs/channels/twitch.md +431 -0
  90. package/docs/channels/wechat.md +171 -0
  91. package/docs/channels/whatsapp.md +796 -0
  92. package/docs/channels/yuanbao.md +416 -0
  93. package/docs/channels/zalo.md +253 -0
  94. package/docs/channels/zalouser.md +217 -0
  95. package/docs/ci.md +665 -0
  96. package/docs/clawhub/cli.md +82 -0
  97. package/docs/clawhub/publishing.md +96 -0
  98. package/docs/cli/acp.md +370 -0
  99. package/docs/cli/agent.md +109 -0
  100. package/docs/cli/agents.md +253 -0
  101. package/docs/cli/approvals.md +193 -0
  102. package/docs/cli/backup.md +98 -0
  103. package/docs/cli/browser.md +322 -0
  104. package/docs/cli/channels.md +154 -0
  105. package/docs/cli/clawbot.md +25 -0
  106. package/docs/cli/commitments.md +90 -0
  107. package/docs/cli/completion.md +39 -0
  108. package/docs/cli/config.md +504 -0
  109. package/docs/cli/configure.md +77 -0
  110. package/docs/cli/crestodian.md +337 -0
  111. package/docs/cli/cron.md +344 -0
  112. package/docs/cli/daemon.md +67 -0
  113. package/docs/cli/dashboard.md +33 -0
  114. package/docs/cli/devices.md +240 -0
  115. package/docs/cli/directory.md +68 -0
  116. package/docs/cli/dns.md +53 -0
  117. package/docs/cli/docs.md +63 -0
  118. package/docs/cli/doctor.md +254 -0
  119. package/docs/cli/flows.md +52 -0
  120. package/docs/cli/gateway.md +572 -0
  121. package/docs/cli/health.md +43 -0
  122. package/docs/cli/hooks.md +345 -0
  123. package/docs/cli/index.md +406 -0
  124. package/docs/cli/infer.md +364 -0
  125. package/docs/cli/logs.md +68 -0
  126. package/docs/cli/mcp.md +851 -0
  127. package/docs/cli/memory.md +183 -0
  128. package/docs/cli/message.md +317 -0
  129. package/docs/cli/migrate.md +334 -0
  130. package/docs/cli/models.md +239 -0
  131. package/docs/cli/node.md +178 -0
  132. package/docs/cli/nodes.md +76 -0
  133. package/docs/cli/onboard.md +251 -0
  134. package/docs/cli/pairing.md +77 -0
  135. package/docs/cli/path.md +511 -0
  136. package/docs/cli/plugins.md +480 -0
  137. package/docs/cli/policy.md +929 -0
  138. package/docs/cli/proxy.md +89 -0
  139. package/docs/cli/qr.md +56 -0
  140. package/docs/cli/reset.md +39 -0
  141. package/docs/cli/sandbox.md +208 -0
  142. package/docs/cli/secrets.md +202 -0
  143. package/docs/cli/security.md +135 -0
  144. package/docs/cli/sessions.md +178 -0
  145. package/docs/cli/setup.md +60 -0
  146. package/docs/cli/skills.md +156 -0
  147. package/docs/cli/status.md +45 -0
  148. package/docs/cli/system.md +89 -0
  149. package/docs/cli/tasks.md +111 -0
  150. package/docs/cli/transcripts.md +151 -0
  151. package/docs/cli/tui.md +92 -0
  152. package/docs/cli/uninstall.md +45 -0
  153. package/docs/cli/update.md +283 -0
  154. package/docs/cli/voicecall.md +204 -0
  155. package/docs/cli/webhooks.md +117 -0
  156. package/docs/cli/wiki.md +256 -0
  157. package/docs/cli/workboard.md +228 -0
  158. package/docs/concepts/active-memory.md +856 -0
  159. package/docs/concepts/agent-loop.md +185 -0
  160. package/docs/concepts/agent-runtimes.md +276 -0
  161. package/docs/concepts/agent-workspace.md +230 -0
  162. package/docs/concepts/agent.md +142 -0
  163. package/docs/concepts/architecture.md +154 -0
  164. package/docs/concepts/channel-docking.md +145 -0
  165. package/docs/concepts/commitments.md +150 -0
  166. package/docs/concepts/compaction.md +203 -0
  167. package/docs/concepts/context-engine.md +347 -0
  168. package/docs/concepts/context.md +199 -0
  169. package/docs/concepts/delegate-architecture.md +319 -0
  170. package/docs/concepts/dreaming.md +279 -0
  171. package/docs/concepts/experimental-features.md +111 -0
  172. package/docs/concepts/features.md +91 -0
  173. package/docs/concepts/mantis-slack-desktop-runbook.md +231 -0
  174. package/docs/concepts/mantis.md +744 -0
  175. package/docs/concepts/markdown-formatting.md +139 -0
  176. package/docs/concepts/memory-builtin.md +151 -0
  177. package/docs/concepts/memory-honcho.md +144 -0
  178. package/docs/concepts/memory-qmd.md +277 -0
  179. package/docs/concepts/memory-search.md +175 -0
  180. package/docs/concepts/memory.md +299 -0
  181. package/docs/concepts/message-lifecycle-refactor.md +1126 -0
  182. package/docs/concepts/messages.md +216 -0
  183. package/docs/concepts/model-failover.md +405 -0
  184. package/docs/concepts/model-providers.md +719 -0
  185. package/docs/concepts/models.md +371 -0
  186. package/docs/concepts/multi-agent.md +625 -0
  187. package/docs/concepts/oauth.md +218 -0
  188. package/docs/concepts/parallel-specialist-lanes.md +127 -0
  189. package/docs/concepts/personal-agent-benchmark-pack.md +74 -0
  190. package/docs/concepts/presence.md +117 -0
  191. package/docs/concepts/progress-drafts.md +406 -0
  192. package/docs/concepts/qa-e2e-automation.md +979 -0
  193. package/docs/concepts/qa-matrix.md +139 -0
  194. package/docs/concepts/queue-steering.md +90 -0
  195. package/docs/concepts/queue.md +136 -0
  196. package/docs/concepts/retry.md +86 -0
  197. package/docs/concepts/session-pruning.md +104 -0
  198. package/docs/concepts/session-tool.md +201 -0
  199. package/docs/concepts/session.md +164 -0
  200. package/docs/concepts/soul.md +116 -0
  201. package/docs/concepts/streaming.md +258 -0
  202. package/docs/concepts/system-prompt.md +330 -0
  203. package/docs/concepts/timezone.md +47 -0
  204. package/docs/concepts/typebox.md +309 -0
  205. package/docs/concepts/typing-indicators.md +88 -0
  206. package/docs/concepts/usage-tracking.md +72 -0
  207. package/docs/date-time.md +126 -0
  208. package/docs/debug/node-issue.md +90 -0
  209. package/docs/diagnostics/flags.md +182 -0
  210. package/docs/docs.json +1885 -0
  211. package/docs/gateway/authentication.md +286 -0
  212. package/docs/gateway/background-process.md +147 -0
  213. package/docs/gateway/bonjour.md +303 -0
  214. package/docs/gateway/bridge-protocol.md +97 -0
  215. package/docs/gateway/cli-backends.md +463 -0
  216. package/docs/gateway/config-agents.md +1525 -0
  217. package/docs/gateway/config-channels.md +942 -0
  218. package/docs/gateway/config-tools.md +806 -0
  219. package/docs/gateway/configuration-examples.md +706 -0
  220. package/docs/gateway/configuration-reference.md +1449 -0
  221. package/docs/gateway/configuration.md +748 -0
  222. package/docs/gateway/diagnostics.md +213 -0
  223. package/docs/gateway/discovery.md +154 -0
  224. package/docs/gateway/doctor.md +576 -0
  225. package/docs/gateway/external-apps.md +86 -0
  226. package/docs/gateway/gateway-lock.md +37 -0
  227. package/docs/gateway/health.md +73 -0
  228. package/docs/gateway/heartbeat.md +498 -0
  229. package/docs/gateway/index.md +385 -0
  230. package/docs/gateway/local-model-services.md +205 -0
  231. package/docs/gateway/local-models.md +355 -0
  232. package/docs/gateway/logging.md +149 -0
  233. package/docs/gateway/multiple-gateways.md +178 -0
  234. package/docs/gateway/network-model.md +15 -0
  235. package/docs/gateway/openai-http-api.md +379 -0
  236. package/docs/gateway/openresponses-http-api.md +349 -0
  237. package/docs/gateway/openshell.md +316 -0
  238. package/docs/gateway/opentelemetry.md +440 -0
  239. package/docs/gateway/operator-scopes.md +119 -0
  240. package/docs/gateway/pairing.md +207 -0
  241. package/docs/gateway/prometheus.md +249 -0
  242. package/docs/gateway/protocol.md +839 -0
  243. package/docs/gateway/remote-gateway-readme.md +169 -0
  244. package/docs/gateway/remote.md +280 -0
  245. package/docs/gateway/sandbox-vs-tool-policy-vs-elevated.md +148 -0
  246. package/docs/gateway/sandboxing.md +546 -0
  247. package/docs/gateway/secrets-plan-contract.md +159 -0
  248. package/docs/gateway/secrets.md +805 -0
  249. package/docs/gateway/security/audit-checks.md +127 -0
  250. package/docs/gateway/security/exposure-runbook.md +212 -0
  251. package/docs/gateway/security/index.md +1344 -0
  252. package/docs/gateway/security/secure-file-operations.md +76 -0
  253. package/docs/gateway/security/shrinkwrap.md +111 -0
  254. package/docs/gateway/tailscale.md +180 -0
  255. package/docs/gateway/tools-invoke-http-api.md +175 -0
  256. package/docs/gateway/troubleshooting.md +881 -0
  257. package/docs/gateway/trusted-proxy-auth.md +483 -0
  258. package/docs/help/debugging.md +341 -0
  259. package/docs/help/environment.md +240 -0
  260. package/docs/help/faq-first-run.md +872 -0
  261. package/docs/help/faq-models.md +557 -0
  262. package/docs/help/faq.md +2115 -0
  263. package/docs/help/index.md +39 -0
  264. package/docs/help/scripts.md +56 -0
  265. package/docs/help/testing-live.md +592 -0
  266. package/docs/help/testing-updates-plugins.md +299 -0
  267. package/docs/help/testing.md +977 -0
  268. package/docs/help/troubleshooting.md +500 -0
  269. package/docs/index.md +196 -0
  270. package/docs/install/ansible.md +233 -0
  271. package/docs/install/azure.md +315 -0
  272. package/docs/install/bun.md +59 -0
  273. package/docs/install/clawdock.md +112 -0
  274. package/docs/install/development-channels.md +148 -0
  275. package/docs/install/digitalocean.md +174 -0
  276. package/docs/install/docker-vm-runtime.md +154 -0
  277. package/docs/install/docker.md +564 -0
  278. package/docs/install/exe-dev.md +201 -0
  279. package/docs/install/fly.md +524 -0
  280. package/docs/install/gcp.md +418 -0
  281. package/docs/install/hetzner.md +285 -0
  282. package/docs/install/hostinger.md +98 -0
  283. package/docs/install/index.md +236 -0
  284. package/docs/install/installer.md +447 -0
  285. package/docs/install/kubernetes.md +196 -0
  286. package/docs/install/macos-vm.md +281 -0
  287. package/docs/install/migrating-claude.md +165 -0
  288. package/docs/install/migrating-hermes.md +178 -0
  289. package/docs/install/migrating.md +137 -0
  290. package/docs/install/nix.md +112 -0
  291. package/docs/install/node.md +142 -0
  292. package/docs/install/northflank.mdx +44 -0
  293. package/docs/install/oracle.md +218 -0
  294. package/docs/install/podman.md +216 -0
  295. package/docs/install/railway.mdx +92 -0
  296. package/docs/install/raspberry-pi.md +234 -0
  297. package/docs/install/render.mdx +167 -0
  298. package/docs/install/uninstall.md +140 -0
  299. package/docs/install/updating.md +284 -0
  300. package/docs/install/upstash.md +96 -0
  301. package/docs/logging.md +322 -0
  302. package/docs/maturity-scores.yaml +5361 -0
  303. package/docs/nav-tabs-underline.js +104 -0
  304. package/docs/network.md +72 -0
  305. package/docs/nodes/audio.md +216 -0
  306. package/docs/nodes/camera.md +166 -0
  307. package/docs/nodes/images.md +77 -0
  308. package/docs/nodes/index.md +444 -0
  309. package/docs/nodes/location-command.md +102 -0
  310. package/docs/nodes/media-understanding.md +495 -0
  311. package/docs/nodes/talk.md +160 -0
  312. package/docs/nodes/troubleshooting.md +123 -0
  313. package/docs/nodes/voicewake.md +93 -0
  314. package/docs/openclaw-agent-runtime.md +82 -0
  315. package/docs/perplexity.md +11 -0
  316. package/docs/plan/codex-context-engine-harness.md +624 -0
  317. package/docs/plan/ui-channels.md +284 -0
  318. package/docs/platforms/android.md +286 -0
  319. package/docs/platforms/digitalocean.md +12 -0
  320. package/docs/platforms/easyrunner.md +109 -0
  321. package/docs/platforms/index.md +65 -0
  322. package/docs/platforms/ios.md +287 -0
  323. package/docs/platforms/linux.md +141 -0
  324. package/docs/platforms/mac/bundled-gateway.md +79 -0
  325. package/docs/platforms/mac/canvas.md +128 -0
  326. package/docs/platforms/mac/child-process.md +72 -0
  327. package/docs/platforms/mac/dev-setup.md +112 -0
  328. package/docs/platforms/mac/health.md +39 -0
  329. package/docs/platforms/mac/icon.md +36 -0
  330. package/docs/platforms/mac/logging.md +62 -0
  331. package/docs/platforms/mac/menu-bar.md +93 -0
  332. package/docs/platforms/mac/peekaboo.md +96 -0
  333. package/docs/platforms/mac/permissions.md +73 -0
  334. package/docs/platforms/mac/remote.md +123 -0
  335. package/docs/platforms/mac/signing.md +52 -0
  336. package/docs/platforms/mac/skills.md +45 -0
  337. package/docs/platforms/mac/voice-overlay.md +66 -0
  338. package/docs/platforms/mac/voicewake.md +79 -0
  339. package/docs/platforms/mac/webchat.md +54 -0
  340. package/docs/platforms/mac/xpc.md +66 -0
  341. package/docs/platforms/macos.md +228 -0
  342. package/docs/platforms/oracle.md +12 -0
  343. package/docs/platforms/raspberry-pi.md +13 -0
  344. package/docs/platforms/windows.md +304 -0
  345. package/docs/plugins/adding-capabilities.md +146 -0
  346. package/docs/plugins/admin-http-rpc.md +216 -0
  347. package/docs/plugins/agent-tools.md +13 -0
  348. package/docs/plugins/architecture-internals.md +1203 -0
  349. package/docs/plugins/architecture.md +483 -0
  350. package/docs/plugins/building-extensions.md +13 -0
  351. package/docs/plugins/building-plugins.md +343 -0
  352. package/docs/plugins/bundles.md +310 -0
  353. package/docs/plugins/cli-backend-plugins.md +328 -0
  354. package/docs/plugins/codex-computer-use.md +297 -0
  355. package/docs/plugins/codex-harness-reference.md +480 -0
  356. package/docs/plugins/codex-harness-runtime.md +268 -0
  357. package/docs/plugins/codex-harness.md +800 -0
  358. package/docs/plugins/codex-native-plugins.md +280 -0
  359. package/docs/plugins/community.md +77 -0
  360. package/docs/plugins/compatibility.md +198 -0
  361. package/docs/plugins/copilot.md +355 -0
  362. package/docs/plugins/dependency-resolution.md +176 -0
  363. package/docs/plugins/google-meet.md +1737 -0
  364. package/docs/plugins/hooks.md +525 -0
  365. package/docs/plugins/install-overrides.md +80 -0
  366. package/docs/plugins/llama-cpp.md +58 -0
  367. package/docs/plugins/manage-plugins.md +214 -0
  368. package/docs/plugins/manifest.md +1468 -0
  369. package/docs/plugins/memory-lancedb.md +385 -0
  370. package/docs/plugins/memory-wiki.md +529 -0
  371. package/docs/plugins/message-presentation.md +487 -0
  372. package/docs/plugins/oc-path.md +166 -0
  373. package/docs/plugins/plugin-inventory.md +318 -0
  374. package/docs/plugins/plugin-permission-requests.md +193 -0
  375. package/docs/plugins/reference/acpx.md +23 -0
  376. package/docs/plugins/reference/admin-http-rpc.md +23 -0
  377. package/docs/plugins/reference/alibaba.md +23 -0
  378. package/docs/plugins/reference/amazon-bedrock-mantle.md +23 -0
  379. package/docs/plugins/reference/amazon-bedrock.md +23 -0
  380. package/docs/plugins/reference/anthropic-vertex.md +29 -0
  381. package/docs/plugins/reference/anthropic.md +23 -0
  382. package/docs/plugins/reference/arcee.md +23 -0
  383. package/docs/plugins/reference/azure-speech.md +23 -0
  384. package/docs/plugins/reference/bonjour.md +19 -0
  385. package/docs/plugins/reference/brave.md +23 -0
  386. package/docs/plugins/reference/browser.md +23 -0
  387. package/docs/plugins/reference/byteplus.md +19 -0
  388. package/docs/plugins/reference/canvas.md +19 -0
  389. package/docs/plugins/reference/cerebras.md +23 -0
  390. package/docs/plugins/reference/chutes.md +23 -0
  391. package/docs/plugins/reference/clickclack.md +23 -0
  392. package/docs/plugins/reference/cloudflare-ai-gateway.md +23 -0
  393. package/docs/plugins/reference/codex-supervisor.md +27 -0
  394. package/docs/plugins/reference/codex.md +23 -0
  395. package/docs/plugins/reference/comfy.md +23 -0
  396. package/docs/plugins/reference/copilot-proxy.md +19 -0
  397. package/docs/plugins/reference/copilot.md +23 -0
  398. package/docs/plugins/reference/deepgram.md +23 -0
  399. package/docs/plugins/reference/deepinfra.md +23 -0
  400. package/docs/plugins/reference/deepseek.md +23 -0
  401. package/docs/plugins/reference/diagnostics-otel.md +19 -0
  402. package/docs/plugins/reference/diagnostics-prometheus.md +19 -0
  403. package/docs/plugins/reference/diffs-language-pack.md +31 -0
  404. package/docs/plugins/reference/diffs.md +19 -0
  405. package/docs/plugins/reference/discord.md +23 -0
  406. package/docs/plugins/reference/document-extract.md +23 -0
  407. package/docs/plugins/reference/duckduckgo.md +23 -0
  408. package/docs/plugins/reference/elevenlabs.md +23 -0
  409. package/docs/plugins/reference/exa.md +23 -0
  410. package/docs/plugins/reference/fal.md +23 -0
  411. package/docs/plugins/reference/feishu.md +23 -0
  412. package/docs/plugins/reference/file-transfer.md +19 -0
  413. package/docs/plugins/reference/firecrawl.md +23 -0
  414. package/docs/plugins/reference/fireworks.md +23 -0
  415. package/docs/plugins/reference/github-copilot.md +23 -0
  416. package/docs/plugins/reference/gmi.md +23 -0
  417. package/docs/plugins/reference/google-meet.md +23 -0
  418. package/docs/plugins/reference/google.md +23 -0
  419. package/docs/plugins/reference/googlechat.md +23 -0
  420. package/docs/plugins/reference/gradium.md +23 -0
  421. package/docs/plugins/reference/groq.md +23 -0
  422. package/docs/plugins/reference/huggingface.md +23 -0
  423. package/docs/plugins/reference/imessage.md +23 -0
  424. package/docs/plugins/reference/inworld.md +23 -0
  425. package/docs/plugins/reference/irc.md +23 -0
  426. package/docs/plugins/reference/kilocode.md +23 -0
  427. package/docs/plugins/reference/kimi.md +23 -0
  428. package/docs/plugins/reference/line.md +23 -0
  429. package/docs/plugins/reference/litellm.md +23 -0
  430. package/docs/plugins/reference/llama-cpp.md +23 -0
  431. package/docs/plugins/reference/llm-task.md +19 -0
  432. package/docs/plugins/reference/lmstudio.md +23 -0
  433. package/docs/plugins/reference/lobster.md +19 -0
  434. package/docs/plugins/reference/matrix.md +23 -0
  435. package/docs/plugins/reference/mattermost.md +23 -0
  436. package/docs/plugins/reference/memory-core.md +19 -0
  437. package/docs/plugins/reference/memory-lancedb.md +23 -0
  438. package/docs/plugins/reference/memory-wiki.md +23 -0
  439. package/docs/plugins/reference/microsoft-foundry.md +113 -0
  440. package/docs/plugins/reference/microsoft.md +19 -0
  441. package/docs/plugins/reference/migrate-claude.md +19 -0
  442. package/docs/plugins/reference/migrate-hermes.md +19 -0
  443. package/docs/plugins/reference/minimax.md +23 -0
  444. package/docs/plugins/reference/mistral.md +23 -0
  445. package/docs/plugins/reference/moonshot.md +23 -0
  446. package/docs/plugins/reference/msteams.md +23 -0
  447. package/docs/plugins/reference/nextcloud-talk.md +23 -0
  448. package/docs/plugins/reference/nostr.md +23 -0
  449. package/docs/plugins/reference/novita.md +23 -0
  450. package/docs/plugins/reference/nvidia.md +23 -0
  451. package/docs/plugins/reference/oc-path.md +23 -0
  452. package/docs/plugins/reference/ollama.md +24 -0
  453. package/docs/plugins/reference/open-prose.md +19 -0
  454. package/docs/plugins/reference/openai.md +23 -0
  455. package/docs/plugins/reference/opencode-go.md +23 -0
  456. package/docs/plugins/reference/opencode.md +23 -0
  457. package/docs/plugins/reference/openrouter.md +23 -0
  458. package/docs/plugins/reference/openshell.md +19 -0
  459. package/docs/plugins/reference/perplexity.md +23 -0
  460. package/docs/plugins/reference/pixverse.md +23 -0
  461. package/docs/plugins/reference/policy.md +79 -0
  462. package/docs/plugins/reference/qa-channel.md +23 -0
  463. package/docs/plugins/reference/qa-lab.md +19 -0
  464. package/docs/plugins/reference/qa-matrix.md +19 -0
  465. package/docs/plugins/reference/qianfan.md +23 -0
  466. package/docs/plugins/reference/qqbot.md +23 -0
  467. package/docs/plugins/reference/qwen.md +24 -0
  468. package/docs/plugins/reference/runway.md +23 -0
  469. package/docs/plugins/reference/searxng.md +19 -0
  470. package/docs/plugins/reference/senseaudio.md +23 -0
  471. package/docs/plugins/reference/sglang.md +23 -0
  472. package/docs/plugins/reference/signal.md +23 -0
  473. package/docs/plugins/reference/slack.md +23 -0
  474. package/docs/plugins/reference/sms.md +23 -0
  475. package/docs/plugins/reference/stepfun.md +23 -0
  476. package/docs/plugins/reference/synology-chat.md +23 -0
  477. package/docs/plugins/reference/synthetic.md +23 -0
  478. package/docs/plugins/reference/tavily.md +23 -0
  479. package/docs/plugins/reference/telegram.md +23 -0
  480. package/docs/plugins/reference/tencent.md +23 -0
  481. package/docs/plugins/reference/tlon.md +23 -0
  482. package/docs/plugins/reference/together.md +23 -0
  483. package/docs/plugins/reference/tokenjuice.md +23 -0
  484. package/docs/plugins/reference/tts-local-cli.md +19 -0
  485. package/docs/plugins/reference/twitch.md +23 -0
  486. package/docs/plugins/reference/venice.md +23 -0
  487. package/docs/plugins/reference/vercel-ai-gateway.md +23 -0
  488. package/docs/plugins/reference/vllm.md +23 -0
  489. package/docs/plugins/reference/voice-call.md +23 -0
  490. package/docs/plugins/reference/volcengine.md +23 -0
  491. package/docs/plugins/reference/voyage.md +19 -0
  492. package/docs/plugins/reference/vydra.md +23 -0
  493. package/docs/plugins/reference/web-readability.md +19 -0
  494. package/docs/plugins/reference/webhooks.md +23 -0
  495. package/docs/plugins/reference/whatsapp.md +23 -0
  496. package/docs/plugins/reference/workboard.md +23 -0
  497. package/docs/plugins/reference/xai.md +23 -0
  498. package/docs/plugins/reference/xiaomi.md +23 -0
  499. package/docs/plugins/reference/zai.md +23 -0
  500. package/docs/plugins/reference/zalo.md +23 -0
  501. package/docs/plugins/reference/zalouser.md +24 -0
  502. package/docs/plugins/reference.md +19 -0
  503. package/docs/plugins/sdk-agent-harness.md +339 -0
  504. package/docs/plugins/sdk-channel-inbound.md +70 -0
  505. package/docs/plugins/sdk-channel-ingress.md +137 -0
  506. package/docs/plugins/sdk-channel-message.md +18 -0
  507. package/docs/plugins/sdk-channel-outbound.md +113 -0
  508. package/docs/plugins/sdk-channel-plugins.md +770 -0
  509. package/docs/plugins/sdk-channel-turn.md +9 -0
  510. package/docs/plugins/sdk-entrypoints.md +344 -0
  511. package/docs/plugins/sdk-migration.md +1011 -0
  512. package/docs/plugins/sdk-overview.md +525 -0
  513. package/docs/plugins/sdk-provider-plugins.md +1019 -0
  514. package/docs/plugins/sdk-runtime.md +683 -0
  515. package/docs/plugins/sdk-setup.md +550 -0
  516. package/docs/plugins/sdk-subpaths.md +401 -0
  517. package/docs/plugins/sdk-testing.md +403 -0
  518. package/docs/plugins/tool-plugins.md +411 -0
  519. package/docs/plugins/voice-call.md +942 -0
  520. package/docs/plugins/webhooks.md +192 -0
  521. package/docs/plugins/workboard.md +402 -0
  522. package/docs/plugins/zalouser.md +86 -0
  523. package/docs/prose.md +191 -0
  524. package/docs/providers/alibaba.md +158 -0
  525. package/docs/providers/anthropic.md +386 -0
  526. package/docs/providers/arcee.md +144 -0
  527. package/docs/providers/azure-speech.md +119 -0
  528. package/docs/providers/bedrock-mantle.md +224 -0
  529. package/docs/providers/bedrock.md +433 -0
  530. package/docs/providers/cerebras.md +130 -0
  531. package/docs/providers/chutes.md +153 -0
  532. package/docs/providers/claude-max-api-proxy.md +191 -0
  533. package/docs/providers/cloudflare-ai-gateway.md +119 -0
  534. package/docs/providers/comfy.md +362 -0
  535. package/docs/providers/deepgram.md +184 -0
  536. package/docs/providers/deepinfra.md +92 -0
  537. package/docs/providers/deepseek.md +146 -0
  538. package/docs/providers/ds4.md +309 -0
  539. package/docs/providers/elevenlabs.md +130 -0
  540. package/docs/providers/fal.md +240 -0
  541. package/docs/providers/fireworks.md +144 -0
  542. package/docs/providers/github-copilot.md +257 -0
  543. package/docs/providers/gmi.md +92 -0
  544. package/docs/providers/google.md +472 -0
  545. package/docs/providers/gradium.md +123 -0
  546. package/docs/providers/groq.md +171 -0
  547. package/docs/providers/huggingface.md +235 -0
  548. package/docs/providers/index.md +105 -0
  549. package/docs/providers/inferrs.md +272 -0
  550. package/docs/providers/inworld.md +120 -0
  551. package/docs/providers/kilocode.md +135 -0
  552. package/docs/providers/litellm.md +234 -0
  553. package/docs/providers/lmstudio.md +224 -0
  554. package/docs/providers/minimax.md +518 -0
  555. package/docs/providers/mistral.md +235 -0
  556. package/docs/providers/models.md +64 -0
  557. package/docs/providers/moonshot.md +413 -0
  558. package/docs/providers/novita.md +92 -0
  559. package/docs/providers/nvidia.md +208 -0
  560. package/docs/providers/ollama-cloud.md +115 -0
  561. package/docs/providers/ollama.md +1225 -0
  562. package/docs/providers/openai.md +1091 -0
  563. package/docs/providers/opencode-go.md +123 -0
  564. package/docs/providers/opencode.md +149 -0
  565. package/docs/providers/openrouter.md +390 -0
  566. package/docs/providers/perplexity-provider.md +123 -0
  567. package/docs/providers/pixverse.md +165 -0
  568. package/docs/providers/qianfan.md +132 -0
  569. package/docs/providers/qwen-oauth.md +115 -0
  570. package/docs/providers/qwen.md +364 -0
  571. package/docs/providers/runway.md +103 -0
  572. package/docs/providers/senseaudio.md +68 -0
  573. package/docs/providers/sglang.md +161 -0
  574. package/docs/providers/stepfun.md +229 -0
  575. package/docs/providers/synthetic.md +154 -0
  576. package/docs/providers/tencent.md +130 -0
  577. package/docs/providers/together.md +140 -0
  578. package/docs/providers/venice.md +312 -0
  579. package/docs/providers/vercel-ai-gateway.md +128 -0
  580. package/docs/providers/vllm.md +407 -0
  581. package/docs/providers/volcengine.md +199 -0
  582. package/docs/providers/vydra.md +180 -0
  583. package/docs/providers/xai.md +571 -0
  584. package/docs/providers/xiaomi.md +286 -0
  585. package/docs/providers/zai.md +224 -0
  586. package/docs/refactor/access.md +9 -0
  587. package/docs/refactor/acp.md +298 -0
  588. package/docs/refactor/canvas.md +131 -0
  589. package/docs/refactor/database-first.md +2263 -0
  590. package/docs/refactor/ingress-core.md +341 -0
  591. package/docs/reference/AGENTS.default.md +131 -0
  592. package/docs/reference/RELEASING.md +844 -0
  593. package/docs/reference/api-usage-costs.md +208 -0
  594. package/docs/reference/application-modernization-plan.md +208 -0
  595. package/docs/reference/code-mode.md +1058 -0
  596. package/docs/reference/credits.md +33 -0
  597. package/docs/reference/device-models.md +50 -0
  598. package/docs/reference/full-release-validation.md +206 -0
  599. package/docs/reference/memory-config.md +630 -0
  600. package/docs/reference/prompt-caching.md +358 -0
  601. package/docs/reference/release-performance-sweep.md +347 -0
  602. package/docs/reference/rich-output-protocol.md +93 -0
  603. package/docs/reference/rpc.md +43 -0
  604. package/docs/reference/secret-placeholder-conventions.md +33 -0
  605. package/docs/reference/secretref-credential-surface.md +163 -0
  606. package/docs/reference/secretref-user-supplied-credentials-matrix.json +691 -0
  607. package/docs/reference/session-management-compaction.md +474 -0
  608. package/docs/reference/templates/AGENTS.dev.md +90 -0
  609. package/docs/reference/templates/AGENTS.md +227 -0
  610. package/docs/reference/templates/BOOT.md +16 -0
  611. package/docs/reference/templates/BOOTSTRAP.md +66 -0
  612. package/docs/reference/templates/HEARTBEAT.md +24 -0
  613. package/docs/reference/templates/IDENTITY.dev.md +52 -0
  614. package/docs/reference/templates/IDENTITY.md +34 -0
  615. package/docs/reference/templates/SOUL.dev.md +82 -0
  616. package/docs/reference/templates/SOUL.md +49 -0
  617. package/docs/reference/templates/TOOLS.dev.md +29 -0
  618. package/docs/reference/templates/TOOLS.md +51 -0
  619. package/docs/reference/templates/USER.dev.md +23 -0
  620. package/docs/reference/templates/USER.md +28 -0
  621. package/docs/reference/test.md +248 -0
  622. package/docs/reference/token-use.md +246 -0
  623. package/docs/reference/transcript-hygiene.md +226 -0
  624. package/docs/reference/wizard.md +252 -0
  625. package/docs/security/CONTRIBUTING-THREAT-MODEL.md +101 -0
  626. package/docs/security/THREAT-MODEL-ATLAS.md +611 -0
  627. package/docs/security/formal-verification.md +170 -0
  628. package/docs/security/incident-response.md +59 -0
  629. package/docs/security/network-proxy.md +268 -0
  630. package/docs/snippets/plugin-publish/minimal-openclaw.plugin.json +12 -0
  631. package/docs/snippets/plugin-publish/minimal-package.json +16 -0
  632. package/docs/specs/claw-supervisor.md +247 -0
  633. package/docs/start/bootstrapping.md +49 -0
  634. package/docs/start/docs-directory.md +69 -0
  635. package/docs/start/getting-started.md +152 -0
  636. package/docs/start/hubs.md +201 -0
  637. package/docs/start/lore.md +223 -0
  638. package/docs/start/onboarding-overview.md +72 -0
  639. package/docs/start/onboarding.md +98 -0
  640. package/docs/start/openclaw.md +246 -0
  641. package/docs/start/quickstart.md +25 -0
  642. package/docs/start/setup.md +178 -0
  643. package/docs/start/showcase.md +371 -0
  644. package/docs/start/wizard-cli-automation.md +232 -0
  645. package/docs/start/wizard-cli-reference.md +331 -0
  646. package/docs/start/wizard.md +142 -0
  647. package/docs/style.css +137 -0
  648. package/docs/tools/acp-agents-setup.md +356 -0
  649. package/docs/tools/acp-agents.md +865 -0
  650. package/docs/tools/agent-send.md +130 -0
  651. package/docs/tools/apply-patch.md +64 -0
  652. package/docs/tools/brave-search.md +139 -0
  653. package/docs/tools/browser-control.md +405 -0
  654. package/docs/tools/browser-linux-troubleshooting.md +173 -0
  655. package/docs/tools/browser-login.md +77 -0
  656. package/docs/tools/browser-wsl2-windows-remote-cdp-troubleshooting.md +219 -0
  657. package/docs/tools/browser.md +866 -0
  658. package/docs/tools/btw.md +159 -0
  659. package/docs/tools/capability-cookbook.md +12 -0
  660. package/docs/tools/clawhub.md +5 -0
  661. package/docs/tools/code-execution.md +173 -0
  662. package/docs/tools/creating-skills.md +271 -0
  663. package/docs/tools/diffs.md +527 -0
  664. package/docs/tools/duckduckgo-search.md +109 -0
  665. package/docs/tools/elevated.md +128 -0
  666. package/docs/tools/exa-search.md +152 -0
  667. package/docs/tools/exec-approvals-advanced.md +457 -0
  668. package/docs/tools/exec-approvals.md +520 -0
  669. package/docs/tools/exec.md +294 -0
  670. package/docs/tools/firecrawl.md +155 -0
  671. package/docs/tools/gemini-search.md +114 -0
  672. package/docs/tools/goal.md +217 -0
  673. package/docs/tools/grok-search.md +129 -0
  674. package/docs/tools/image-generation.md +538 -0
  675. package/docs/tools/index.md +176 -0
  676. package/docs/tools/kimi-search.md +105 -0
  677. package/docs/tools/llm-task.md +137 -0
  678. package/docs/tools/lobster.md +365 -0
  679. package/docs/tools/loop-detection.md +154 -0
  680. package/docs/tools/media-overview.md +161 -0
  681. package/docs/tools/minimax-search.md +102 -0
  682. package/docs/tools/multi-agent-sandbox-tools.md +409 -0
  683. package/docs/tools/music-generation.md +372 -0
  684. package/docs/tools/ollama-search.md +153 -0
  685. package/docs/tools/parallel-search.md +154 -0
  686. package/docs/tools/pdf.md +213 -0
  687. package/docs/tools/permission-modes.md +111 -0
  688. package/docs/tools/perplexity-search.md +220 -0
  689. package/docs/tools/plugin.md +378 -0
  690. package/docs/tools/reactions.md +100 -0
  691. package/docs/tools/searxng-search.md +141 -0
  692. package/docs/tools/skill-workshop.md +283 -0
  693. package/docs/tools/skills-config.md +457 -0
  694. package/docs/tools/skills.md +591 -0
  695. package/docs/tools/slash-commands.md +518 -0
  696. package/docs/tools/steer.md +77 -0
  697. package/docs/tools/subagents.md +652 -0
  698. package/docs/tools/tavily.md +162 -0
  699. package/docs/tools/thinking.md +142 -0
  700. package/docs/tools/tokenjuice.md +84 -0
  701. package/docs/tools/tool-search.md +269 -0
  702. package/docs/tools/trajectory.md +229 -0
  703. package/docs/tools/tts.md +1013 -0
  704. package/docs/tools/video-generation.md +555 -0
  705. package/docs/tools/web-fetch.md +210 -0
  706. package/docs/tools/web.md +476 -0
  707. package/docs/tts.md +11 -0
  708. package/docs/vps.md +139 -0
  709. package/docs/web/control-ui.md +530 -0
  710. package/docs/web/dashboard.md +107 -0
  711. package/docs/web/index.md +133 -0
  712. package/docs/web/tui.md +258 -0
  713. package/docs/web/webchat.md +102 -0
  714. package/npm-shrinkwrap.json +3485 -0
  715. package/openclaw.mjs +661 -0
  716. package/package.json +1971 -0
  717. package/patches/.gitkeep +0 -0
  718. package/patches/@agentclientprotocol__claude-agent-acp@0.39.0.patch +40 -0
  719. package/pnpm-workspace.yaml +124 -0
  720. package/scripts/crabbox-wrapper.mjs +2470 -0
  721. package/scripts/lib/official-external-channel-catalog.json +570 -0
  722. package/scripts/lib/official-external-plugin-catalog.json +284 -0
  723. package/scripts/lib/official-external-provider-catalog.json +158 -0
  724. package/scripts/lib/package-dist-imports.mjs +174 -0
  725. package/scripts/npm-runner.mjs +95 -0
  726. package/scripts/postinstall-bundled-plugins.mjs +978 -0
  727. package/scripts/preinstall-package-manager-warning.mjs +74 -0
  728. package/scripts/prepare-git-hooks.mjs +73 -0
  729. package/scripts/windows-cmd-helpers.mjs +29 -0
  730. package/skills/1password/SKILL.md +70 -0
  731. package/skills/1password/references/cli-examples.md +29 -0
  732. package/skills/1password/references/get-started.md +17 -0
  733. package/skills/apple-notes/SKILL.md +77 -0
  734. package/skills/apple-reminders/SKILL.md +118 -0
  735. package/skills/bear-notes/SKILL.md +107 -0
  736. package/skills/blogwatcher/SKILL.md +69 -0
  737. package/skills/blucli/SKILL.md +47 -0
  738. package/skills/camsnap/SKILL.md +45 -0
  739. package/skills/canvas/SKILL.md +78 -0
  740. package/skills/clawhub/SKILL.md +77 -0
  741. package/skills/coding-agent/SKILL.md +143 -0
  742. package/skills/diagram-maker/SKILL.md +53 -0
  743. package/skills/diagram-maker/references/excalidraw-patterns.md +85 -0
  744. package/skills/diagram-maker/references/svg-template.md +112 -0
  745. package/skills/discord/SKILL.md +136 -0
  746. package/skills/eightctl/SKILL.md +50 -0
  747. package/skills/gemini/SKILL.md +47 -0
  748. package/skills/gh-issues/SKILL.md +213 -0
  749. package/skills/gifgrep/SKILL.md +85 -0
  750. package/skills/github/SKILL.md +84 -0
  751. package/skills/gog/SKILL.md +116 -0
  752. package/skills/goplaces/SKILL.md +52 -0
  753. package/skills/healthcheck/SKILL.md +105 -0
  754. package/skills/himalaya/SKILL.md +80 -0
  755. package/skills/himalaya/references/configuration.md +184 -0
  756. package/skills/himalaya/references/message-composition.md +199 -0
  757. package/skills/imsg/SKILL.md +122 -0
  758. package/skills/mcporter/SKILL.md +61 -0
  759. package/skills/meme-maker/SKILL.md +42 -0
  760. package/skills/meme-maker/references/templates.json +358 -0
  761. package/skills/meme-maker/scripts/meme.mjs +398 -0
  762. package/skills/model-usage/SKILL.md +71 -0
  763. package/skills/model-usage/references/codexbar-cli.md +33 -0
  764. package/skills/model-usage/scripts/model_usage.py +319 -0
  765. package/skills/model-usage/scripts/test_model_usage.py +40 -0
  766. package/skills/nano-pdf/SKILL.md +38 -0
  767. package/skills/node-connect/SKILL.md +143 -0
  768. package/skills/node-inspect-debugger/SKILL.md +85 -0
  769. package/skills/notion/SKILL.md +150 -0
  770. package/skills/obsidian/SKILL.md +119 -0
  771. package/skills/openai-whisper/SKILL.md +38 -0
  772. package/skills/openai-whisper-api/SKILL.md +71 -0
  773. package/skills/openai-whisper-api/scripts/transcribe.sh +154 -0
  774. package/skills/openhue/SKILL.md +112 -0
  775. package/skills/oracle/SKILL.md +126 -0
  776. package/skills/ordercli/SKILL.md +78 -0
  777. package/skills/peekaboo/SKILL.md +198 -0
  778. package/skills/pyproject.toml +10 -0
  779. package/skills/python-debugpy/SKILL.md +73 -0
  780. package/skills/sag/SKILL.md +87 -0
  781. package/skills/session-logs/SKILL.md +151 -0
  782. package/skills/sherpa-onnx-tts/SKILL.md +109 -0
  783. package/skills/sherpa-onnx-tts/bin/sherpa-onnx-tts +178 -0
  784. package/skills/skill-creator/SKILL.md +78 -0
  785. package/skills/skill-creator/license.txt +202 -0
  786. package/skills/skill-creator/scripts/init_skill.py +378 -0
  787. package/skills/skill-creator/scripts/package_skill.py +144 -0
  788. package/skills/skill-creator/scripts/quick_validate.py +169 -0
  789. package/skills/skill-creator/scripts/test_package_skill.py +199 -0
  790. package/skills/skill-creator/scripts/test_quick_validate.py +116 -0
  791. package/skills/slack/SKILL.md +78 -0
  792. package/skills/songsee/SKILL.md +49 -0
  793. package/skills/sonoscli/SKILL.md +65 -0
  794. package/skills/spike/SKILL.md +51 -0
  795. package/skills/spotify-player/SKILL.md +64 -0
  796. package/skills/summarize/SKILL.md +87 -0
  797. package/skills/taskflow/SKILL.md +149 -0
  798. package/skills/taskflow/examples/inbox-triage.lobster +33 -0
  799. package/skills/taskflow/examples/pr-intake.lobster +32 -0
  800. package/skills/taskflow-inbox-triage/SKILL.md +119 -0
  801. package/skills/things-mac/SKILL.md +86 -0
  802. package/skills/tmux/SKILL.md +91 -0
  803. package/skills/tmux/scripts/find-sessions.sh +112 -0
  804. package/skills/tmux/scripts/wait-for-text.sh +83 -0
  805. package/skills/trello/SKILL.md +108 -0
  806. package/skills/video-frames/SKILL.md +46 -0
  807. package/skills/video-frames/scripts/frame.sh +81 -0
  808. package/skills/voice-call/SKILL.md +45 -0
  809. package/skills/wacli/SKILL.md +72 -0
  810. package/skills/weather/SKILL.md +87 -0
  811. package/skills/xurl/SKILL.md +120 -0
  812. package/src/agents/templates/HEARTBEAT.md +5 -0
@@ -0,0 +1,770 @@
1
+ ---
2
+ summary: "Step-by-step guide to building a messaging channel plugin for OpenClaw"
3
+ title: "Building channel plugins"
4
+ sidebarTitle: "Channel Plugins"
5
+ read_when:
6
+ - You are building a new messaging channel plugin
7
+ - You want to connect OpenClaw to a messaging platform
8
+ - You need to understand the ChannelPlugin adapter surface
9
+ ---
10
+
11
+ This guide walks through building a channel plugin that connects OpenClaw to a
12
+ messaging platform. By the end you will have a working channel with DM security,
13
+ pairing, reply threading, and outbound messaging.
14
+
15
+ <Info>
16
+ If you have not built any OpenClaw plugin before, read
17
+ [Getting Started](/plugins/building-plugins) first for the basic package
18
+ structure and manifest setup.
19
+ </Info>
20
+
21
+ ## How channel plugins work
22
+
23
+ Channel plugins do not need their own send/edit/react tools. OpenClaw keeps one
24
+ shared `message` tool in core. Your plugin owns:
25
+
26
+ - **Config** - account resolution and setup wizard
27
+ - **Security** - DM policy and allowlists
28
+ - **Pairing** - DM approval flow
29
+ - **Session grammar** - how provider-specific conversation ids map to base chats, thread ids, and parent fallbacks
30
+ - **Outbound** - sending text, media, and polls to the platform
31
+ - **Threading** - how replies are threaded
32
+ - **Heartbeat typing** - optional typing/busy signals for heartbeat delivery targets
33
+
34
+ Core owns the shared message tool, prompt wiring, the outer session-key shape,
35
+ generic `:thread:` bookkeeping, and dispatch.
36
+
37
+ New channel plugins should also expose a `message` adapter with
38
+ `defineChannelMessageAdapter` from `openclaw/plugin-sdk/channel-outbound`. The
39
+ adapter declares which durable final-send capabilities the native transport
40
+ actually supports and points text/media sends at the same transport functions as
41
+ the legacy `outbound` adapter. Only declare a capability when a contract test
42
+ proves the native side effect and returned receipt.
43
+ For the full API contract, examples, capability matrix, receipt rules, live
44
+ preview finalization, receive ack policy, tests, and migration table, see
45
+ [Channel outbound API](/plugins/sdk-channel-outbound).
46
+ If the existing `outbound` adapter already has the right send methods and
47
+ capability metadata, use `createChannelMessageAdapterFromOutbound(...)` to
48
+ derive the `message` adapter instead of hand-writing another bridge.
49
+ Adapter sends should return `MessageReceipt` values. When compatibility code
50
+ still needs legacy ids, derive them with `listMessageReceiptPlatformIds(...)`
51
+ or `resolveMessageReceiptPrimaryId(...)` instead of keeping parallel
52
+ `messageIds` fields in new lifecycle code.
53
+ Preview-capable channels should also declare `message.live.capabilities` with
54
+ the exact live lifecycle they own, such as `draftPreview`,
55
+ `previewFinalization`, `progressUpdates`, `nativeStreaming`, or
56
+ `quietFinalization`. Channels that finalize a draft preview in place should
57
+ also declare `message.live.finalizer.capabilities`, such as `finalEdit`,
58
+ `normalFallback`, `discardPending`, `previewReceipt`, and
59
+ `retainOnAmbiguousFailure`, and route the runtime logic through
60
+ `defineFinalizableLivePreviewAdapter(...)` plus
61
+ `deliverWithFinalizableLivePreviewAdapter(...)`. Keep those capabilities backed
62
+ by `verifyChannelMessageLiveCapabilityAdapterProofs(...)` and
63
+ `verifyChannelMessageLiveFinalizerProofs(...)` tests so native preview,
64
+ progress, edit, fallback/retention, cleanup, and receipt behavior cannot drift
65
+ silently.
66
+ Inbound receivers that defer platform acknowledgements should declare
67
+ `message.receive.defaultAckPolicy` and `supportedAckPolicies` instead of hiding
68
+ ack timing in monitor-local state. Cover every declared policy with
69
+ `verifyChannelMessageReceiveAckPolicyAdapterProofs(...)`.
70
+
71
+ Legacy reply helpers such as `createChannelTurnReplyPipeline`,
72
+ `dispatchInboundReplyWithBase`, and `recordInboundSessionAndDispatchReply`
73
+ remain available for compatibility dispatchers. Do not use those names for new
74
+ channel code; new plugins should start with the `message` adapter, receipts, and
75
+ receive/send lifecycle helpers on `openclaw/plugin-sdk/channel-outbound`.
76
+
77
+ Channels migrating inbound authorization can use the experimental
78
+ `openclaw/plugin-sdk/channel-ingress-runtime` subpath from runtime receive
79
+ paths. The subpath keeps platform lookup and side effects in the plugin, while
80
+ sharing allowlist state resolution, route/sender/command/event/activation
81
+ decisions, redacted diagnostics, and turn-admission mapping. Keep plugin
82
+ identity normalization in the descriptor you pass to the resolver; do not
83
+ serialize raw match values from the resolved state or decision. See
84
+ [Channel ingress API](/plugins/sdk-channel-ingress) for the API design,
85
+ ownership boundary, and test expectations.
86
+
87
+ If your channel supports typing indicators outside inbound replies, expose
88
+ `heartbeat.sendTyping(...)` on the channel plugin. Core calls it with the
89
+ resolved heartbeat delivery target before the heartbeat model run starts and
90
+ uses the shared typing keepalive/cleanup lifecycle. Add `heartbeat.clearTyping(...)`
91
+ when the platform needs an explicit stop signal.
92
+
93
+ If your channel adds message-tool params that carry media sources, expose those
94
+ param names through `describeMessageTool(...).mediaSourceParams`. Core uses
95
+ that explicit list for sandbox path normalization and outbound media-access
96
+ policy, so plugins do not need shared-core special cases for provider-specific
97
+ avatar, attachment, or cover-image params.
98
+ Prefer returning an action-keyed map such as
99
+ `{ "set-profile": ["avatarUrl", "avatarPath"] }` so unrelated actions do not
100
+ inherit another action's media args. A flat array still works for params that
101
+ are intentionally shared across every exposed action.
102
+ Channels that must expose a temporary public URL for a platform-side media fetch
103
+ can use `createHostedOutboundMediaStore(...)` from
104
+ `openclaw/plugin-sdk/outbound-media` with plugin state stores. Keep platform
105
+ route parsing and token enforcement in the channel plugin; the shared helper
106
+ only owns media loading, expiry metadata, chunk rows, and cleanup.
107
+
108
+ If your channel needs provider-specific shaping for `message(action="send")`,
109
+ prefer `actions.prepareSendPayload(...)`. Put native cards, blocks, embeds, or
110
+ other durable data under `payload.channelData.<channel>` and let core perform
111
+ the actual send through the outbound/message adapter. Use
112
+ `actions.handleAction(...)` for send only as a compatibility fallback for
113
+ payloads that cannot be serialized and retried.
114
+
115
+ If your platform stores extra scope inside conversation ids, keep that parsing
116
+ in the plugin with `messaging.resolveSessionConversation(...)`. That is the
117
+ canonical hook for mapping `rawId` to the base conversation id, optional thread
118
+ id, explicit `baseConversationId`, and any `parentConversationCandidates`.
119
+ When you return `parentConversationCandidates`, keep them ordered from the
120
+ narrowest parent to the broadest/base conversation.
121
+
122
+ Use `openclaw/plugin-sdk/channel-route` when plugin code needs to normalize
123
+ route-like fields, compare a child thread with its parent route, or build a
124
+ stable dedupe key from `{ channel, to, accountId, threadId }`. The helper
125
+ normalizes numeric thread ids the same way core does, so plugins should prefer
126
+ it over ad hoc `String(threadId)` comparisons.
127
+ Plugins with provider-specific target grammar should expose
128
+ `messaging.resolveOutboundSessionRoute(...)` so core gets provider-native
129
+ session and thread identity without using parser shims.
130
+
131
+ Bundled plugins that need the same parsing before the channel registry boots
132
+ can also expose a top-level `session-key-api.ts` file with a matching
133
+ `resolveSessionConversation(...)` export. Core uses that bootstrap-safe surface
134
+ only when the runtime plugin registry is not available yet.
135
+
136
+ `messaging.resolveParentConversationCandidates(...)` remains available as a
137
+ legacy compatibility fallback when a plugin only needs parent fallbacks on top
138
+ of the generic/raw id. If both hooks exist, core uses
139
+ `resolveSessionConversation(...).parentConversationCandidates` first and only
140
+ falls back to `resolveParentConversationCandidates(...)` when the canonical hook
141
+ omits them.
142
+
143
+ ## Approvals and channel capabilities
144
+
145
+ Most channel plugins do not need approval-specific code.
146
+
147
+ - Core owns same-chat `/approve`, shared approval button payloads, and generic fallback delivery.
148
+ - Prefer one `approvalCapability` object on the channel plugin when the channel needs approval-specific behavior.
149
+ - `ChannelPlugin.approvals` is removed. Put approval delivery/native/render/auth facts on `approvalCapability`.
150
+ - `plugin.auth` is login/logout only; core no longer reads approval auth hooks from that object.
151
+ - `approvalCapability.authorizeActorAction` and `approvalCapability.getActionAvailabilityState` are the canonical approval-auth seam.
152
+ - Use `approvalCapability.getActionAvailabilityState` for same-chat approval auth availability.
153
+ - If your channel exposes native exec approvals, use `approvalCapability.getExecInitiatingSurfaceState` for the initiating-surface/native-client state when it differs from same-chat approval auth. Core uses that exec-specific hook to distinguish `enabled` vs `disabled`, decide whether the initiating channel supports native exec approvals, and include the channel in native-client fallback guidance. `createApproverRestrictedNativeApprovalCapability(...)` fills this in for the common case.
154
+ - Use `outbound.shouldSuppressLocalPayloadPrompt` or `outbound.beforeDeliverPayload` for channel-specific payload lifecycle behavior such as hiding duplicate local approval prompts or sending typing indicators before delivery.
155
+ - Use `approvalCapability.delivery` only for native approval routing or fallback suppression.
156
+ - Use `approvalCapability.nativeRuntime` for channel-owned native approval facts. Keep it lazy on hot channel entrypoints with `createLazyChannelApprovalNativeRuntimeAdapter(...)`, which can import your runtime module on demand while still letting core assemble the approval lifecycle.
157
+ - Use `approvalCapability.render` only when a channel truly needs custom approval payloads instead of the shared renderer.
158
+ - Use `approvalCapability.describeExecApprovalSetup` when the channel wants the disabled-path reply to explain the exact config knobs needed to enable native exec approvals. The hook receives `{ channel, channelLabel, accountId }`; named-account channels should render account-scoped paths such as `channels.<channel>.accounts.<id>.execApprovals.*` instead of top-level defaults.
159
+ - If a channel can infer stable owner-like DM identities from existing config, use `createResolvedApproverActionAuthAdapter` from `openclaw/plugin-sdk/approval-runtime` to restrict same-chat `/approve` without adding approval-specific core logic.
160
+ - If custom approval auth intentionally allows only same-chat fallback, return `markImplicitSameChatApprovalAuthorization({ authorized: true })` from `openclaw/plugin-sdk/approval-auth-runtime`; otherwise core treats the result as explicit approver authorization.
161
+ - If a channel-owned native callback resolves approvals directly, use `isImplicitSameChatApprovalAuthorization(...)` before resolving so implicit fallback still goes through the channel's normal actor authorization.
162
+ - If a channel needs native approval delivery, keep channel code focused on target normalization plus transport/presentation facts. Use `createChannelExecApprovalProfile`, `createChannelNativeOriginTargetResolver`, `createChannelApproverDmTargetResolver`, and `createApproverRestrictedNativeApprovalCapability` from `openclaw/plugin-sdk/approval-runtime`. Put the channel-specific facts behind `approvalCapability.nativeRuntime`, ideally via `createChannelApprovalNativeRuntimeAdapter(...)` or `createLazyChannelApprovalNativeRuntimeAdapter(...)`, so core can assemble the handler and own request filtering, routing, dedupe, expiry, gateway subscription, and routed-elsewhere notices. `nativeRuntime` is split into a few smaller seams:
163
+ - Use `createNativeApprovalChannelRouteGates` from `openclaw/plugin-sdk/approval-native-runtime` when a channel supports both session-origin native delivery and explicit approval forwarding targets. The helper centralizes approval config selection, `mode` handling, agent/session filters, account binding, session-target matching, and target-list matching while callers still own the channel id, default forwarding mode, account lookup, transport-enabled check, target normalization, and turn-source target resolution. Do not use it to create core-owned channel policy defaults; pass the channel's documented default mode explicitly.
164
+ - `createChannelNativeOriginTargetResolver` uses the shared channel-route matcher by default for `{ to, accountId, threadId }` targets. Pass `targetsMatch` only when a channel has provider-specific equivalence rules, such as Slack timestamp prefix matching.
165
+ - Pass `normalizeTargetForMatch` to `createChannelNativeOriginTargetResolver` when the channel needs to canonicalize provider ids before the default route matcher or a custom `targetsMatch` callback runs, while preserving the original target for delivery. Use `normalizeTarget` only when the resolved delivery target itself should be canonicalized.
166
+ - `availability` - whether the account is configured and whether a request should be handled
167
+ - `presentation` - map the shared approval view model into pending/resolved/expired native payloads or final actions
168
+ - `transport` - prepare targets plus send/update/delete native approval messages
169
+ - `interactions` - optional bind/unbind/clear-action hooks for native buttons or reactions, plus an optional `cancelDelivered` hook. Implement `cancelDelivered` when `deliverPending` registers in-process or persistent state (such as a reaction target store) so that state can be released if a handler stop cancels the delivery before `bindPending` runs or when `bindPending` returns no handle
170
+ - `observe` - optional delivery diagnostics hooks
171
+ - If the channel needs runtime-owned objects such as a client, token, Bolt app, or webhook receiver, register them through `openclaw/plugin-sdk/channel-runtime-context`. The generic runtime-context registry lets core bootstrap capability-driven handlers from channel startup state without adding approval-specific wrapper glue.
172
+ - Reach for the lower-level `createChannelApprovalHandler` or `createChannelNativeApprovalRuntime` only when the capability-driven seam is not expressive enough yet.
173
+ - Native approval channels must route both `accountId` and `approvalKind` through those helpers. `accountId` keeps multi-account approval policy scoped to the right bot account, and `approvalKind` keeps exec vs plugin approval behavior available to the channel without hardcoded branches in core.
174
+ - Core now owns approval reroute notices too. Channel plugins should not send their own "approval went to DMs / another channel" follow-up messages from `createChannelNativeApprovalRuntime`; instead, expose accurate origin + approver-DM routing through the shared approval capability helpers and let core aggregate actual deliveries before posting any notice back to the initiating chat.
175
+ - Preserve the delivered approval id kind end-to-end. Native clients should not
176
+ guess or rewrite exec vs plugin approval routing from channel-local state.
177
+ - Different approval kinds can intentionally expose different native surfaces.
178
+ Current bundled examples:
179
+ - Slack keeps native approval routing available for both exec and plugin ids.
180
+ - Matrix keeps the same native DM/channel routing and reaction UX for exec
181
+ and plugin approvals, while still letting auth differ by approval kind.
182
+ - `createApproverRestrictedNativeApprovalAdapter` still exists as a compatibility wrapper, but new code should prefer the capability builder and expose `approvalCapability` on the plugin.
183
+
184
+ For hot channel entrypoints, prefer the narrower runtime subpaths when you only
185
+ need one part of that family:
186
+
187
+ - `openclaw/plugin-sdk/approval-auth-runtime`
188
+ - `openclaw/plugin-sdk/approval-client-runtime`
189
+ - `openclaw/plugin-sdk/approval-delivery-runtime`
190
+ - `openclaw/plugin-sdk/approval-gateway-runtime`
191
+ - `openclaw/plugin-sdk/approval-handler-adapter-runtime`
192
+ - `openclaw/plugin-sdk/approval-handler-runtime`
193
+ - `openclaw/plugin-sdk/approval-native-runtime`
194
+ - `openclaw/plugin-sdk/approval-reply-runtime`
195
+ - `openclaw/plugin-sdk/channel-runtime-context`
196
+
197
+ Likewise, prefer `openclaw/plugin-sdk/setup-runtime`,
198
+ `openclaw/plugin-sdk/setup-runtime`,
199
+ `openclaw/plugin-sdk/reply-runtime`,
200
+ `openclaw/plugin-sdk/reply-dispatch-runtime`,
201
+ `openclaw/plugin-sdk/reply-reference`, and
202
+ `openclaw/plugin-sdk/reply-chunking` when you do not need the broader umbrella
203
+ surface.
204
+
205
+ For setup specifically:
206
+
207
+ - `openclaw/plugin-sdk/setup-runtime` covers the runtime-safe setup helpers:
208
+ `createSetupTranslator`, import-safe setup patch adapters (`createPatchedAccountSetupAdapter`,
209
+ `createEnvPatchedAccountSetupAdapter`,
210
+ `createSetupInputPresenceValidator`), lookup-note output,
211
+ `promptResolvedAllowFrom`, `splitSetupEntries`, and the delegated
212
+ setup-proxy builders
213
+ - `openclaw/plugin-sdk/setup-runtime` includes the env-aware adapter seam for
214
+ `createEnvPatchedAccountSetupAdapter`
215
+ - `openclaw/plugin-sdk/channel-setup` covers the optional-install setup
216
+ builders plus a few setup-safe primitives:
217
+ `createOptionalChannelSetupSurface`, `createOptionalChannelSetupAdapter`,
218
+
219
+ If your channel supports env-driven setup or auth and generic startup/config
220
+ flows should know those env names before runtime loads, declare them in the
221
+ plugin manifest with `channelEnvVars`. Keep channel runtime `envVars` or local
222
+ constants for operator-facing copy only.
223
+
224
+ If your channel can appear in `status`, `channels list`, `channels status`, or
225
+ SecretRef scans before the plugin runtime starts, add `openclaw.setupEntry` in
226
+ `package.json`. That entrypoint should be safe to import in read-only command
227
+ paths and should return the channel metadata, setup-safe config adapter, status
228
+ adapter, and channel secret target metadata needed for those summaries. Do not
229
+ start clients, listeners, or transport runtimes from the setup entry.
230
+
231
+ Keep the main channel entry import path narrow too. Discovery can evaluate the
232
+ entry and the channel plugin module to register capabilities without activating
233
+ the channel. Files such as `channel-plugin-api.ts` should export the channel
234
+ plugin object without importing setup wizards, transport clients, socket
235
+ listeners, subprocess launchers, or service startup modules. Put those runtime
236
+ pieces in modules loaded from `registerFull(...)`, runtime setters, or lazy
237
+ capability adapters.
238
+
239
+ `createOptionalChannelSetupWizard`, `DEFAULT_ACCOUNT_ID`,
240
+ `createTopLevelChannelDmPolicy`, `setSetupChannelEnabled`, and
241
+ `splitSetupEntries`
242
+
243
+ - use the broader `openclaw/plugin-sdk/setup` seam only when you also need the
244
+ heavier shared setup/config helpers such as
245
+ `moveSingleAccountChannelSectionToDefaultAccount(...)`
246
+
247
+ If your channel only wants to advertise "install this plugin first" in setup
248
+ surfaces, prefer `createOptionalChannelSetupSurface(...)`. The generated
249
+ adapter/wizard fail closed on config writes and finalization, and they reuse
250
+ the same install-required message across validation, finalize, and docs-link
251
+ copy.
252
+
253
+ For other hot channel paths, prefer the narrow helpers over broader legacy
254
+ surfaces:
255
+
256
+ - `openclaw/plugin-sdk/account-core`,
257
+ `openclaw/plugin-sdk/account-id`,
258
+ `openclaw/plugin-sdk/account-resolution`, and
259
+ `openclaw/plugin-sdk/account-helpers` for multi-account config and
260
+ default-account fallback
261
+ - `openclaw/plugin-sdk/inbound-envelope` and
262
+ `openclaw/plugin-sdk/channel-inbound` for inbound route/envelope and
263
+ record-and-dispatch wiring
264
+ - `openclaw/plugin-sdk/channel-targets` for target parsing helpers
265
+ - `openclaw/plugin-sdk/outbound-media` for media loading and
266
+ `openclaw/plugin-sdk/channel-outbound` for outbound identity/send delegates
267
+ and payload planning
268
+ - `buildThreadAwareOutboundSessionRoute(...)` from
269
+ `openclaw/plugin-sdk/channel-core` when an outbound route should preserve an
270
+ explicit `replyToId`/`threadId` or recover the current `:thread:` session
271
+ after the base session key still matches. Provider plugins can override
272
+ precedence, suffix behavior, and thread id normalization when their platform
273
+ has native thread delivery semantics.
274
+ - `openclaw/plugin-sdk/thread-bindings-runtime` for thread-binding lifecycle
275
+ and adapter registration
276
+ - `openclaw/plugin-sdk/agent-media-payload` only when a legacy agent/media
277
+ payload field layout is still required
278
+ - `openclaw/plugin-sdk/telegram-command-config` for Telegram custom-command
279
+ normalization, duplicate/conflict validation, and a fallback-stable command
280
+ config contract
281
+
282
+ Auth-only channels can usually stop at the default path: core handles approvals and the plugin just exposes outbound/auth capabilities. Native approval channels such as Matrix, Slack, Telegram, and custom chat transports should use the shared native helpers instead of rolling their own approval lifecycle.
283
+
284
+ ## Inbound mention policy
285
+
286
+ Keep inbound mention handling split in two layers:
287
+
288
+ - plugin-owned evidence gathering
289
+ - shared policy evaluation
290
+
291
+ Use `openclaw/plugin-sdk/channel-mention-gating` for mention-policy decisions.
292
+ Use `openclaw/plugin-sdk/channel-inbound` only when you need the broader inbound
293
+ helper barrel.
294
+
295
+ Good fit for plugin-local logic:
296
+
297
+ - reply-to-bot detection
298
+ - quoted-bot detection
299
+ - thread-participation checks
300
+ - service/system-message exclusions
301
+ - platform-native caches needed to prove bot participation
302
+
303
+ Good fit for the shared helper:
304
+
305
+ - `requireMention`
306
+ - explicit mention result
307
+ - implicit mention allowlist
308
+ - command bypass
309
+ - final skip decision
310
+
311
+ Preferred flow:
312
+
313
+ 1. Compute local mention facts.
314
+ 2. Pass those facts into `resolveInboundMentionDecision({ facts, policy })`.
315
+ 3. Use `decision.effectiveWasMentioned`, `decision.shouldBypassMention`, and `decision.shouldSkip` in your inbound gate.
316
+
317
+ ```typescript
318
+ import {
319
+ implicitMentionKindWhen,
320
+ matchesMentionWithExplicit,
321
+ resolveInboundMentionDecision,
322
+ } from "openclaw/plugin-sdk/channel-inbound";
323
+
324
+ const mentionMatch = matchesMentionWithExplicit(text, {
325
+ mentionRegexes,
326
+ mentionPatterns,
327
+ });
328
+
329
+ const facts = {
330
+ canDetectMention: true,
331
+ wasMentioned: mentionMatch.matched,
332
+ hasAnyMention: mentionMatch.hasExplicitMention,
333
+ implicitMentionKinds: [
334
+ ...implicitMentionKindWhen("reply_to_bot", isReplyToBot),
335
+ ...implicitMentionKindWhen("quoted_bot", isQuoteOfBot),
336
+ ],
337
+ };
338
+
339
+ const decision = resolveInboundMentionDecision({
340
+ facts,
341
+ policy: {
342
+ isGroup,
343
+ requireMention,
344
+ allowedImplicitMentionKinds: requireExplicitMention ? [] : ["reply_to_bot", "quoted_bot"],
345
+ allowTextCommands,
346
+ hasControlCommand,
347
+ commandAuthorized,
348
+ },
349
+ });
350
+
351
+ if (decision.shouldSkip) return;
352
+ ```
353
+
354
+ `api.runtime.channel.mentions` exposes the same shared mention helpers for
355
+ bundled channel plugins that already depend on runtime injection:
356
+
357
+ - `buildMentionRegexes`
358
+ - `matchesMentionPatterns`
359
+ - `matchesMentionWithExplicit`
360
+ - `implicitMentionKindWhen`
361
+ - `resolveInboundMentionDecision`
362
+
363
+ If you only need `implicitMentionKindWhen` and
364
+ `resolveInboundMentionDecision`, import from
365
+ `openclaw/plugin-sdk/channel-mention-gating` to avoid loading unrelated inbound
366
+ runtime helpers.
367
+
368
+ Use `resolveInboundMentionDecision({ facts, policy })` for mention gating.
369
+
370
+ ## Walkthrough
371
+
372
+ <Steps>
373
+ <a id="step-1-package-and-manifest"></a>
374
+ <Step title="Package and manifest">
375
+ Create the standard plugin files. The `channel` field in `package.json` is
376
+ what makes this a channel plugin. For the full package-metadata surface,
377
+ see [Plugin Setup and Config](/plugins/sdk-setup#openclaw-channel):
378
+
379
+ <CodeGroup>
380
+ ```json package.json
381
+ {
382
+ "name": "@myorg/openclaw-acme-chat",
383
+ "version": "1.0.0",
384
+ "type": "module",
385
+ "openclaw": {
386
+ "extensions": ["./index.ts"],
387
+ "setupEntry": "./setup-entry.ts",
388
+ "channel": {
389
+ "id": "acme-chat",
390
+ "label": "Acme Chat",
391
+ "blurb": "Connect OpenClaw to Acme Chat."
392
+ }
393
+ }
394
+ }
395
+ ```
396
+
397
+ ```json openclaw.plugin.json
398
+ {
399
+ "id": "acme-chat",
400
+ "kind": "channel",
401
+ "channels": ["acme-chat"],
402
+ "name": "Acme Chat",
403
+ "description": "Acme Chat channel plugin",
404
+ "configSchema": {
405
+ "type": "object",
406
+ "additionalProperties": false,
407
+ "properties": {}
408
+ },
409
+ "channelConfigs": {
410
+ "acme-chat": {
411
+ "schema": {
412
+ "type": "object",
413
+ "additionalProperties": false,
414
+ "properties": {
415
+ "token": { "type": "string" },
416
+ "allowFrom": {
417
+ "type": "array",
418
+ "items": { "type": "string" }
419
+ }
420
+ }
421
+ },
422
+ "uiHints": {
423
+ "token": {
424
+ "label": "Bot token",
425
+ "sensitive": true
426
+ }
427
+ }
428
+ }
429
+ }
430
+ }
431
+ ```
432
+ </CodeGroup>
433
+
434
+ `configSchema` validates `plugins.entries.acme-chat.config`. Use it for
435
+ plugin-owned settings that are not the channel account config. `channelConfigs`
436
+ validates `channels.acme-chat` and is the cold-path source used by config
437
+ schema, setup, and UI surfaces before the plugin runtime loads.
438
+
439
+ </Step>
440
+
441
+ <Step title="Build the channel plugin object">
442
+ The `ChannelPlugin` interface has many optional adapter surfaces. Start with
443
+ the minimum - `id` and `setup` - and add adapters as you need them.
444
+
445
+ Create `src/channel.ts`:
446
+
447
+ ```typescript src/channel.ts
448
+ import {
449
+ createChatChannelPlugin,
450
+ createChannelPluginBase,
451
+ } from "openclaw/plugin-sdk/channel-core";
452
+ import type { OpenClawConfig } from "openclaw/plugin-sdk/channel-core";
453
+ import { acmeChatApi } from "./client.js"; // your platform API client
454
+
455
+ type ResolvedAccount = {
456
+ accountId: string | null;
457
+ token: string;
458
+ allowFrom: string[];
459
+ dmPolicy: string | undefined;
460
+ };
461
+
462
+ function resolveAccount(
463
+ cfg: OpenClawConfig,
464
+ accountId?: string | null,
465
+ ): ResolvedAccount {
466
+ const section = (cfg.channels as Record<string, any>)?.["acme-chat"];
467
+ const token = section?.token;
468
+ if (!token) throw new Error("acme-chat: token is required");
469
+ return {
470
+ accountId: accountId ?? null,
471
+ token,
472
+ allowFrom: section?.allowFrom ?? [],
473
+ dmPolicy: section?.dmSecurity,
474
+ };
475
+ }
476
+
477
+ export const acmeChatPlugin = createChatChannelPlugin<ResolvedAccount>({
478
+ base: createChannelPluginBase({
479
+ id: "acme-chat",
480
+ setup: {
481
+ resolveAccount,
482
+ inspectAccount(cfg, accountId) {
483
+ const section =
484
+ (cfg.channels as Record<string, any>)?.["acme-chat"];
485
+ return {
486
+ enabled: Boolean(section?.token),
487
+ configured: Boolean(section?.token),
488
+ tokenStatus: section?.token ? "available" : "missing",
489
+ };
490
+ },
491
+ },
492
+ }),
493
+
494
+ // DM security: who can message the bot
495
+ security: {
496
+ dm: {
497
+ channelKey: "acme-chat",
498
+ resolvePolicy: (account) => account.dmPolicy,
499
+ resolveAllowFrom: (account) => account.allowFrom,
500
+ defaultPolicy: "allowlist",
501
+ },
502
+ },
503
+
504
+ // Pairing: approval flow for new DM contacts
505
+ pairing: {
506
+ text: {
507
+ idLabel: "Acme Chat username",
508
+ message: "Send this code to verify your identity:",
509
+ notify: async ({ target, code }) => {
510
+ await acmeChatApi.sendDm(target, `Pairing code: ${code}`);
511
+ },
512
+ },
513
+ },
514
+
515
+ // Threading: how replies are delivered
516
+ threading: { topLevelReplyToMode: "reply" },
517
+
518
+ // Outbound: send messages to the platform
519
+ outbound: {
520
+ attachedResults: {
521
+ sendText: async (params) => {
522
+ const result = await acmeChatApi.sendMessage(
523
+ params.to,
524
+ params.text,
525
+ );
526
+ return { messageId: result.id };
527
+ },
528
+ },
529
+ base: {
530
+ sendMedia: async (params) => {
531
+ await acmeChatApi.sendFile(params.to, params.filePath);
532
+ },
533
+ },
534
+ },
535
+ });
536
+ ```
537
+
538
+ For channels that accept both canonical top-level DM keys and legacy nested keys, use the helpers from `plugin-sdk/channel-config-helpers`: `resolveChannelDmAccess`, `resolveChannelDmPolicy`, `resolveChannelDmAllowFrom`, and `normalizeChannelDmPolicy` keep account-local values ahead of inherited root values. Pair the same resolver with doctor repair through `normalizeLegacyDmAliases` so runtime and migration read the same contract.
539
+
540
+ <Accordion title="What createChatChannelPlugin does for you">
541
+ Instead of implementing low-level adapter interfaces manually, you pass
542
+ declarative options and the builder composes them:
543
+
544
+ | Option | What it wires |
545
+ | --- | --- |
546
+ | `security.dm` | Scoped DM security resolver from config fields |
547
+ | `pairing.text` | Text-based DM pairing flow with code exchange |
548
+ | `threading` | Reply-to-mode resolver (fixed, account-scoped, or custom) |
549
+ | `outbound.attachedResults` | Send functions that return result metadata (message IDs) |
550
+
551
+ You can also pass raw adapter objects instead of the declarative options
552
+ if you need full control.
553
+
554
+ Raw outbound adapters may define a `chunker(text, limit, ctx)` function.
555
+ The optional `ctx.formatting` carries delivery-time formatting decisions
556
+ such as `maxLinesPerMessage`; apply it before sending so reply threading
557
+ and chunk boundaries are resolved once by shared outbound delivery.
558
+ Send contexts also include `replyToIdSource` (`implicit` or `explicit`)
559
+ when a native reply target was resolved, so payload helpers can preserve
560
+ explicit reply tags without consuming an implicit single-use reply slot.
561
+ </Accordion>
562
+
563
+ </Step>
564
+
565
+ <Step title="Wire the entry point">
566
+ Create `index.ts`:
567
+
568
+ ```typescript index.ts
569
+ import { defineChannelPluginEntry } from "openclaw/plugin-sdk/channel-core";
570
+ import { acmeChatPlugin } from "./src/channel.js";
571
+
572
+ export default defineChannelPluginEntry({
573
+ id: "acme-chat",
574
+ name: "Acme Chat",
575
+ description: "Acme Chat channel plugin",
576
+ plugin: acmeChatPlugin,
577
+ registerCliMetadata(api) {
578
+ api.registerCli(
579
+ ({ program }) => {
580
+ program
581
+ .command("acme-chat")
582
+ .description("Acme Chat management");
583
+ },
584
+ {
585
+ descriptors: [
586
+ {
587
+ name: "acme-chat",
588
+ description: "Acme Chat management",
589
+ hasSubcommands: false,
590
+ },
591
+ ],
592
+ },
593
+ );
594
+ },
595
+ registerFull(api) {
596
+ api.registerGatewayMethod(/* ... */);
597
+ },
598
+ });
599
+ ```
600
+
601
+ Put channel-owned CLI descriptors in `registerCliMetadata(...)` so OpenClaw
602
+ can show them in root help without activating the full channel runtime,
603
+ while normal full loads still pick up the same descriptors for real command
604
+ registration. Keep `registerFull(...)` for runtime-only work.
605
+ If `registerFull(...)` registers gateway RPC methods, use a
606
+ plugin-specific prefix. Core admin namespaces (`config.*`,
607
+ `exec.approvals.*`, `wizard.*`, `update.*`) stay reserved and always
608
+ resolve to `operator.admin`.
609
+ `defineChannelPluginEntry` handles the registration-mode split automatically. See
610
+ [Entry Points](/plugins/sdk-entrypoints#definechannelpluginentry) for all
611
+ options.
612
+
613
+ </Step>
614
+
615
+ <Step title="Add a setup entry">
616
+ Create `setup-entry.ts` for lightweight loading during onboarding:
617
+
618
+ ```typescript setup-entry.ts
619
+ import { defineSetupPluginEntry } from "openclaw/plugin-sdk/channel-core";
620
+ import { acmeChatPlugin } from "./src/channel.js";
621
+
622
+ export default defineSetupPluginEntry(acmeChatPlugin);
623
+ ```
624
+
625
+ OpenClaw loads this instead of the full entry when the channel is disabled
626
+ or unconfigured. It avoids pulling in heavy runtime code during setup flows.
627
+ See [Setup and Config](/plugins/sdk-setup#setup-entry) for details.
628
+
629
+ Bundled workspace channels that split setup-safe exports into sidecar
630
+ modules can use `defineBundledChannelSetupEntry(...)` from
631
+ `openclaw/plugin-sdk/channel-entry-contract` when they also need an
632
+ explicit setup-time runtime setter.
633
+
634
+ </Step>
635
+
636
+ <Step title="Handle inbound messages">
637
+ Your plugin needs to receive messages from the platform and forward them to
638
+ OpenClaw. The typical pattern is a webhook that verifies the request and
639
+ dispatches it through your channel's inbound handler:
640
+
641
+ ```typescript
642
+ registerFull(api) {
643
+ api.registerHttpRoute({
644
+ path: "/acme-chat/webhook",
645
+ auth: "plugin", // plugin-managed auth (verify signatures yourself)
646
+ handler: async (req, res) => {
647
+ const event = parseWebhookPayload(req);
648
+
649
+ // Your inbound handler dispatches the message to OpenClaw.
650
+ // The exact wiring depends on your platform SDK -
651
+ // see a real example in the bundled Microsoft Teams or Google Chat plugin package.
652
+ await handleAcmeChatInbound(api, event);
653
+
654
+ res.statusCode = 200;
655
+ res.end("ok");
656
+ return true;
657
+ },
658
+ });
659
+ }
660
+ ```
661
+
662
+ <Note>
663
+ Inbound message handling is channel-specific. Each channel plugin owns
664
+ its own inbound pipeline. Look at bundled channel plugins
665
+ (for example the Microsoft Teams or Google Chat plugin package) for real patterns.
666
+ </Note>
667
+
668
+ </Step>
669
+
670
+ <a id="step-6-test"></a>
671
+ <Step title="Test">
672
+ Write colocated tests in `src/channel.test.ts`:
673
+
674
+ ```typescript src/channel.test.ts
675
+ import { describe, it, expect } from "vitest";
676
+ import { acmeChatPlugin } from "./channel.js";
677
+
678
+ describe("acme-chat plugin", () => {
679
+ it("resolves account from config", () => {
680
+ const cfg = {
681
+ channels: {
682
+ "acme-chat": { token: "test-token", allowFrom: ["user1"] },
683
+ },
684
+ } as any;
685
+ const account = acmeChatPlugin.setup!.resolveAccount(cfg, undefined);
686
+ expect(account.token).toBe("test-token");
687
+ });
688
+
689
+ it("inspects account without materializing secrets", () => {
690
+ const cfg = {
691
+ channels: { "acme-chat": { token: "test-token" } },
692
+ } as any;
693
+ const result = acmeChatPlugin.setup!.inspectAccount!(cfg, undefined);
694
+ expect(result.configured).toBe(true);
695
+ expect(result.tokenStatus).toBe("available");
696
+ });
697
+
698
+ it("reports missing config", () => {
699
+ const cfg = { channels: {} } as any;
700
+ const result = acmeChatPlugin.setup!.inspectAccount!(cfg, undefined);
701
+ expect(result.configured).toBe(false);
702
+ });
703
+ });
704
+ ```
705
+
706
+ ```bash
707
+ pnpm test -- <bundled-plugin-root>/acme-chat/
708
+ ```
709
+
710
+ For shared test helpers, see [Testing](/plugins/sdk-testing).
711
+
712
+ </Step>
713
+ </Steps>
714
+
715
+ ## File structure
716
+
717
+ ```
718
+ <bundled-plugin-root>/acme-chat/
719
+ ├── package.json # openclaw.channel metadata
720
+ ├── openclaw.plugin.json # Manifest with config schema
721
+ ├── index.ts # defineChannelPluginEntry
722
+ ├── setup-entry.ts # defineSetupPluginEntry
723
+ ├── api.ts # Public exports (optional)
724
+ ├── runtime-api.ts # Internal runtime exports (optional)
725
+ └── src/
726
+ ├── channel.ts # ChannelPlugin via createChatChannelPlugin
727
+ ├── channel.test.ts # Tests
728
+ ├── client.ts # Platform API client
729
+ └── runtime.ts # Runtime store (if needed)
730
+ ```
731
+
732
+ ## Advanced topics
733
+
734
+ <CardGroup cols={2}>
735
+ <Card title="Threading options" icon="git-branch" href="/plugins/sdk-entrypoints#registration-mode">
736
+ Fixed, account-scoped, or custom reply modes
737
+ </Card>
738
+ <Card title="Message tool integration" icon="puzzle" href="/plugins/architecture#channel-plugins-and-the-shared-message-tool">
739
+ describeMessageTool and action discovery
740
+ </Card>
741
+ <Card title="Target resolution" icon="crosshair" href="/plugins/architecture-internals#channel-target-resolution">
742
+ inferTargetChatType, looksLikeId, resolveTarget
743
+ </Card>
744
+ <Card title="Runtime helpers" icon="settings" href="/plugins/sdk-runtime">
745
+ TTS, STT, media, subagent via api.runtime
746
+ </Card>
747
+ <Card title="Channel inbound API" icon="bolt" href="/plugins/sdk-channel-inbound">
748
+ Shared inbound event lifecycle: ingest, resolve, record, dispatch, finalize
749
+ </Card>
750
+ </CardGroup>
751
+
752
+ <Note>
753
+ Some bundled helper seams still exist for bundled-plugin maintenance and
754
+ compatibility. They are not the recommended pattern for new channel plugins;
755
+ prefer the generic channel/setup/reply/runtime subpaths from the common SDK
756
+ surface unless you are maintaining that bundled plugin family directly.
757
+ </Note>
758
+
759
+ ## Next steps
760
+
761
+ - [Provider Plugins](/plugins/sdk-provider-plugins) - if your plugin also provides models
762
+ - [SDK Overview](/plugins/sdk-overview) - full subpath import reference
763
+ - [SDK Testing](/plugins/sdk-testing) - test utilities and contract tests
764
+ - [Plugin Manifest](/plugins/manifest) - full manifest schema
765
+
766
+ ## Related
767
+
768
+ - [Plugin SDK setup](/plugins/sdk-setup)
769
+ - [Building plugins](/plugins/building-plugins)
770
+ - [Agent harness plugins](/plugins/sdk-agent-harness)