fengming 0.3.9 → 0.3.11

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