nodmix 2026.5.25

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