fengming 0.3.10 → 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 (761) hide show
  1. package/dist/build-info.json +2 -2
  2. package/dist/canvas-host/a2ui/.bundle.hash +1 -1
  3. package/dist/cli-startup-metadata.json +8 -8
  4. package/dist/control-ui/assets/{activity-D-mnRThU.js → activity-wgT0-JR0.js} +2 -2
  5. package/dist/control-ui/assets/{agents-U_KSP5I_.js → agents-DG5PobrT.js} +2 -2
  6. package/dist/control-ui/assets/{channels-ohK9_G1O.js → channels-CX28oM42.js} +2 -2
  7. package/dist/control-ui/assets/{cron-6ZCzfU29.js → cron-B8ixwBqU.js} +2 -2
  8. package/dist/control-ui/assets/{debug-CSsDLg_s.js → debug-CnkYZUXy.js} +2 -2
  9. package/dist/control-ui/assets/{index-jUDczxhd.js → index-DQRZJKbO.js} +4 -4
  10. package/dist/control-ui/assets/{instances-782ZoDT4.js → instances-BE3mV1JC.js} +2 -2
  11. package/dist/control-ui/assets/{nodes-BMX16BKM.js → nodes-Cou4PWRX.js} +2 -2
  12. package/dist/control-ui/assets/{sessions-jLGSApYa.js → sessions-DpAaBT21.js} +2 -2
  13. package/dist/control-ui/assets/{skills-DweBwUhs.js → skills-DjA_j_20.js} +2 -2
  14. package/dist/control-ui/assets/{workboard-BsU-FXIo.js → workboard-BFnvbS0k.js} +2 -2
  15. package/dist/control-ui/index.html +1 -1
  16. package/dist/control-ui/sw.js +1 -1
  17. package/dist/gateway/protocol/index.d.ts +1 -1
  18. package/dist/{index-AZzJCgph.d.ts → index-DuDY3bCZ.d.ts} +2 -2
  19. package/dist/plugin-sdk/.boundary-entry-shims.stamp +1 -1
  20. package/dist/plugin-sdk/agent-config-primitives.d.ts +1 -1
  21. package/dist/plugin-sdk/{bundled-channel-config-schema-Dfn3b8sF.d.ts → bundled-channel-config-schema-BPFNnbwu.d.ts} +23 -23
  22. package/dist/plugin-sdk/bundled-channel-config-schema.d.ts +3 -3
  23. package/dist/plugin-sdk/channel-config-primitives.d.ts +2 -2
  24. package/dist/plugin-sdk/channel-config-schema-legacy.d.ts +3 -3
  25. package/dist/plugin-sdk/channel-config-schema.d.ts +2 -2
  26. package/dist/plugin-sdk/channel-core.d.ts +1 -1
  27. package/dist/plugin-sdk/channel-plugin-common.d.ts +1 -1
  28. package/dist/plugin-sdk/compat.d.ts +2 -2
  29. package/dist/plugin-sdk/{config-schema-DUddICQM.d.ts → config-schema-D7cABQ6o.d.ts} +1 -1
  30. package/dist/plugin-sdk/config-schema.d.ts +2 -2
  31. package/dist/plugin-sdk/core.d.ts +1 -1
  32. package/dist/plugin-sdk/discord.d.ts +2 -2
  33. package/dist/plugin-sdk/tts-runtime.d.ts +1 -1
  34. package/dist/plugin-sdk/{zod-schema.core-B4_b2R5K.d.ts → zod-schema.core-CwBNqcXp.d.ts} +1 -1
  35. package/package.json +4 -409
  36. package/CHANGELOG.md +0 -42
  37. package/THIRD_PARTY_NOTICES.md +0 -37
  38. package/docs/.i18n/README.md +0 -81
  39. package/docs/.i18n/ar-navigation.json +0 -18
  40. package/docs/.i18n/de-navigation.json +0 -18
  41. package/docs/.i18n/es-navigation.json +0 -18
  42. package/docs/.i18n/fr-navigation.json +0 -18
  43. package/docs/.i18n/glossary.ar.json +0 -78
  44. package/docs/.i18n/glossary.de.json +0 -78
  45. package/docs/.i18n/glossary.es.json +0 -78
  46. package/docs/.i18n/glossary.fa.json +0 -78
  47. package/docs/.i18n/glossary.fr.json +0 -78
  48. package/docs/.i18n/glossary.id.json +0 -78
  49. package/docs/.i18n/glossary.it.json +0 -78
  50. package/docs/.i18n/glossary.ja-JP.json +0 -98
  51. package/docs/.i18n/glossary.ko.json +0 -78
  52. package/docs/.i18n/glossary.nl.json +0 -78
  53. package/docs/.i18n/glossary.pl.json +0 -78
  54. package/docs/.i18n/glossary.pt-BR.json +0 -78
  55. package/docs/.i18n/glossary.th.json +0 -78
  56. package/docs/.i18n/glossary.tr.json +0 -78
  57. package/docs/.i18n/glossary.uk.json +0 -78
  58. package/docs/.i18n/glossary.vi.json +0 -78
  59. package/docs/.i18n/glossary.zh-CN.json +0 -1122
  60. package/docs/.i18n/glossary.zh-TW.json +0 -78
  61. package/docs/.i18n/id-navigation.json +0 -18
  62. package/docs/.i18n/it-navigation.json +0 -18
  63. package/docs/.i18n/ja-navigation.json +0 -18
  64. package/docs/.i18n/ko-navigation.json +0 -18
  65. package/docs/.i18n/pl-navigation.json +0 -18
  66. package/docs/.i18n/pt-BR-navigation.json +0 -18
  67. package/docs/.i18n/tr-navigation.json +0 -18
  68. package/docs/.i18n/translation-workflow.md +0 -111
  69. package/docs/.i18n/zh-Hans-navigation.json +0 -552
  70. package/docs/AGENTS.md +0 -36
  71. package/docs/CLAUDE.md +0 -1
  72. package/docs/agent-runtime-architecture.md +0 -48
  73. package/docs/announcements/bluebubbles-imessage.md +0 -79
  74. package/docs/auth-credential-semantics.md +0 -124
  75. package/docs/automation/auth-monitoring.md +0 -11
  76. package/docs/automation/clawflow.md +0 -12
  77. package/docs/automation/cron-jobs.md +0 -534
  78. package/docs/automation/cron-vs-heartbeat.md +0 -11
  79. package/docs/automation/gmail-pubsub.md +0 -11
  80. package/docs/automation/hooks.md +0 -387
  81. package/docs/automation/index.md +0 -135
  82. package/docs/automation/poll.md +0 -12
  83. package/docs/automation/standing-orders.md +0 -250
  84. package/docs/automation/taskflow.md +0 -155
  85. package/docs/automation/tasks.md +0 -374
  86. package/docs/automation/troubleshooting.md +0 -12
  87. package/docs/automation/webhook.md +0 -12
  88. package/docs/brave-search.md +0 -11
  89. package/docs/channels/access-groups.md +0 -201
  90. package/docs/channels/ambient-room-events.md +0 -214
  91. package/docs/channels/bot-loop-protection.md +0 -131
  92. package/docs/channels/broadcast-groups.md +0 -472
  93. package/docs/channels/channel-routing.md +0 -162
  94. package/docs/channels/clickclack.md +0 -138
  95. package/docs/channels/discord.md +0 -1758
  96. package/docs/channels/feishu.md +0 -650
  97. package/docs/channels/googlechat.md +0 -284
  98. package/docs/channels/group-messages.md +0 -95
  99. package/docs/channels/groups.md +0 -524
  100. package/docs/channels/imessage-from-bluebubbles.md +0 -259
  101. package/docs/channels/imessage.md +0 -839
  102. package/docs/channels/index.md +0 -64
  103. package/docs/channels/irc.md +0 -253
  104. package/docs/channels/line.md +0 -243
  105. package/docs/channels/location.md +0 -71
  106. package/docs/channels/matrix-migration.md +0 -370
  107. package/docs/channels/matrix-presentation.md +0 -77
  108. package/docs/channels/matrix-push-rules.md +0 -150
  109. package/docs/channels/matrix.md +0 -921
  110. package/docs/channels/mattermost.md +0 -542
  111. package/docs/channels/msteams.md +0 -1096
  112. package/docs/channels/nextcloud-talk.md +0 -176
  113. package/docs/channels/nostr.md +0 -253
  114. package/docs/channels/pairing.md +0 -214
  115. package/docs/channels/qqbot.md +0 -314
  116. package/docs/channels/signal.md +0 -417
  117. package/docs/channels/slack.md +0 -1623
  118. package/docs/channels/synology-chat.md +0 -187
  119. package/docs/channels/telegram.md +0 -1124
  120. package/docs/channels/tlon.md +0 -296
  121. package/docs/channels/troubleshooting.md +0 -162
  122. package/docs/channels/twitch.md +0 -431
  123. package/docs/channels/wechat.md +0 -171
  124. package/docs/channels/whatsapp.md +0 -796
  125. package/docs/channels/yuanbao.md +0 -416
  126. package/docs/channels/zalo.md +0 -253
  127. package/docs/channels/zalouser.md +0 -217
  128. package/docs/ci.md +0 -657
  129. package/docs/clawhub/publishing.md +0 -96
  130. package/docs/cli/acp.md +0 -370
  131. package/docs/cli/agent.md +0 -109
  132. package/docs/cli/agents.md +0 -253
  133. package/docs/cli/approvals.md +0 -190
  134. package/docs/cli/backup.md +0 -98
  135. package/docs/cli/browser.md +0 -307
  136. package/docs/cli/channels.md +0 -154
  137. package/docs/cli/clawbot.md +0 -25
  138. package/docs/cli/commitments.md +0 -90
  139. package/docs/cli/completion.md +0 -39
  140. package/docs/cli/config.md +0 -504
  141. package/docs/cli/configure.md +0 -77
  142. package/docs/cli/crestodian.md +0 -337
  143. package/docs/cli/cron.md +0 -304
  144. package/docs/cli/daemon.md +0 -67
  145. package/docs/cli/dashboard.md +0 -33
  146. package/docs/cli/devices.md +0 -240
  147. package/docs/cli/directory.md +0 -68
  148. package/docs/cli/dns.md +0 -53
  149. package/docs/cli/docs.md +0 -63
  150. package/docs/cli/doctor.md +0 -241
  151. package/docs/cli/flows.md +0 -52
  152. package/docs/cli/gateway.md +0 -572
  153. package/docs/cli/health.md +0 -43
  154. package/docs/cli/hooks.md +0 -345
  155. package/docs/cli/index.md +0 -400
  156. package/docs/cli/infer.md +0 -364
  157. package/docs/cli/logs.md +0 -68
  158. package/docs/cli/mcp.md +0 -529
  159. package/docs/cli/memory.md +0 -183
  160. package/docs/cli/message.md +0 -317
  161. package/docs/cli/migrate.md +0 -334
  162. package/docs/cli/models.md +0 -239
  163. package/docs/cli/node.md +0 -177
  164. package/docs/cli/nodes.md +0 -76
  165. package/docs/cli/onboard.md +0 -250
  166. package/docs/cli/pairing.md +0 -77
  167. package/docs/cli/path.md +0 -511
  168. package/docs/cli/plugins.md +0 -459
  169. package/docs/cli/policy.md +0 -886
  170. package/docs/cli/proxy.md +0 -89
  171. package/docs/cli/qr.md +0 -56
  172. package/docs/cli/reset.md +0 -39
  173. package/docs/cli/sandbox.md +0 -208
  174. package/docs/cli/secrets.md +0 -202
  175. package/docs/cli/security.md +0 -136
  176. package/docs/cli/sessions.md +0 -164
  177. package/docs/cli/setup.md +0 -59
  178. package/docs/cli/skills.md +0 -122
  179. package/docs/cli/status.md +0 -45
  180. package/docs/cli/system.md +0 -89
  181. package/docs/cli/tasks.md +0 -111
  182. package/docs/cli/transcripts.md +0 -151
  183. package/docs/cli/tui.md +0 -91
  184. package/docs/cli/uninstall.md +0 -44
  185. package/docs/cli/update.md +0 -243
  186. package/docs/cli/voicecall.md +0 -204
  187. package/docs/cli/webhooks.md +0 -117
  188. package/docs/cli/wiki.md +0 -256
  189. package/docs/concepts/active-memory.md +0 -856
  190. package/docs/concepts/agent-loop.md +0 -185
  191. package/docs/concepts/agent-runtimes.md +0 -276
  192. package/docs/concepts/agent-workspace.md +0 -230
  193. package/docs/concepts/agent.md +0 -140
  194. package/docs/concepts/architecture.md +0 -154
  195. package/docs/concepts/channel-docking.md +0 -145
  196. package/docs/concepts/commitments.md +0 -150
  197. package/docs/concepts/compaction.md +0 -203
  198. package/docs/concepts/context-engine.md +0 -347
  199. package/docs/concepts/context.md +0 -199
  200. package/docs/concepts/delegate-architecture.md +0 -319
  201. package/docs/concepts/dreaming.md +0 -264
  202. package/docs/concepts/experimental-features.md +0 -109
  203. package/docs/concepts/features.md +0 -91
  204. package/docs/concepts/fengming-sdk.md +0 -323
  205. package/docs/concepts/mantis-slack-desktop-runbook.md +0 -231
  206. package/docs/concepts/mantis.md +0 -744
  207. package/docs/concepts/markdown-formatting.md +0 -139
  208. package/docs/concepts/memory-builtin.md +0 -148
  209. package/docs/concepts/memory-honcho.md +0 -144
  210. package/docs/concepts/memory-qmd.md +0 -271
  211. package/docs/concepts/memory-search.md +0 -167
  212. package/docs/concepts/memory.md +0 -299
  213. package/docs/concepts/message-lifecycle-refactor.md +0 -1126
  214. package/docs/concepts/messages.md +0 -214
  215. package/docs/concepts/model-failover.md +0 -384
  216. package/docs/concepts/model-providers.md +0 -719
  217. package/docs/concepts/models.md +0 -371
  218. package/docs/concepts/multi-agent.md +0 -625
  219. package/docs/concepts/oauth.md +0 -198
  220. package/docs/concepts/parallel-specialist-lanes.md +0 -127
  221. package/docs/concepts/personal-agent-benchmark-pack.md +0 -74
  222. package/docs/concepts/presence.md +0 -117
  223. package/docs/concepts/progress-drafts.md +0 -406
  224. package/docs/concepts/qa-e2e-automation.md +0 -947
  225. package/docs/concepts/qa-matrix.md +0 -139
  226. package/docs/concepts/queue-steering.md +0 -90
  227. package/docs/concepts/queue.md +0 -136
  228. package/docs/concepts/retry.md +0 -86
  229. package/docs/concepts/session-pruning.md +0 -104
  230. package/docs/concepts/session-tool.md +0 -188
  231. package/docs/concepts/session.md +0 -164
  232. package/docs/concepts/soul.md +0 -116
  233. package/docs/concepts/streaming.md +0 -257
  234. package/docs/concepts/system-prompt.md +0 -328
  235. package/docs/concepts/timezone.md +0 -47
  236. package/docs/concepts/typebox.md +0 -309
  237. package/docs/concepts/typing-indicators.md +0 -88
  238. package/docs/concepts/usage-tracking.md +0 -66
  239. package/docs/date-time.md +0 -126
  240. package/docs/debug/node-issue.md +0 -90
  241. package/docs/diagnostics/flags.md +0 -182
  242. package/docs/docs.json +0 -1862
  243. package/docs/fengming-agent-runtime.md +0 -82
  244. package/docs/gateway/authentication.md +0 -256
  245. package/docs/gateway/background-process.md +0 -147
  246. package/docs/gateway/bonjour.md +0 -303
  247. package/docs/gateway/bridge-protocol.md +0 -97
  248. package/docs/gateway/cli-backends.md +0 -439
  249. package/docs/gateway/config-agents.md +0 -1525
  250. package/docs/gateway/config-channels.md +0 -945
  251. package/docs/gateway/config-tools.md +0 -774
  252. package/docs/gateway/configuration-examples.md +0 -704
  253. package/docs/gateway/configuration-reference.md +0 -1391
  254. package/docs/gateway/configuration.md +0 -739
  255. package/docs/gateway/diagnostics.md +0 -213
  256. package/docs/gateway/discovery.md +0 -154
  257. package/docs/gateway/doctor.md +0 -575
  258. package/docs/gateway/gateway-lock.md +0 -37
  259. package/docs/gateway/health.md +0 -73
  260. package/docs/gateway/heartbeat.md +0 -498
  261. package/docs/gateway/index.md +0 -383
  262. package/docs/gateway/local-model-services.md +0 -205
  263. package/docs/gateway/local-models.md +0 -355
  264. package/docs/gateway/logging.md +0 -149
  265. package/docs/gateway/multiple-gateways.md +0 -178
  266. package/docs/gateway/network-model.md +0 -15
  267. package/docs/gateway/openai-http-api.md +0 -378
  268. package/docs/gateway/openresponses-http-api.md +0 -347
  269. package/docs/gateway/openshell.md +0 -316
  270. package/docs/gateway/opentelemetry.md +0 -433
  271. package/docs/gateway/operator-scopes.md +0 -119
  272. package/docs/gateway/pairing.md +0 -207
  273. package/docs/gateway/prometheus.md +0 -249
  274. package/docs/gateway/protocol.md +0 -826
  275. package/docs/gateway/remote-gateway-readme.md +0 -169
  276. package/docs/gateway/remote.md +0 -280
  277. package/docs/gateway/sandbox-vs-tool-policy-vs-elevated.md +0 -148
  278. package/docs/gateway/sandboxing.md +0 -546
  279. package/docs/gateway/secrets-plan-contract.md +0 -159
  280. package/docs/gateway/secrets.md +0 -805
  281. package/docs/gateway/security/audit-checks.md +0 -127
  282. package/docs/gateway/security/exposure-runbook.md +0 -212
  283. package/docs/gateway/security/index.md +0 -1343
  284. package/docs/gateway/security/secure-file-operations.md +0 -76
  285. package/docs/gateway/security/shrinkwrap.md +0 -111
  286. package/docs/gateway/tailscale.md +0 -156
  287. package/docs/gateway/tools-invoke-http-api.md +0 -169
  288. package/docs/gateway/troubleshooting.md +0 -877
  289. package/docs/gateway/trusted-proxy-auth.md +0 -483
  290. package/docs/help/debugging.md +0 -341
  291. package/docs/help/environment.md +0 -233
  292. package/docs/help/faq-first-run.md +0 -870
  293. package/docs/help/faq-models.md +0 -556
  294. package/docs/help/faq.md +0 -2041
  295. package/docs/help/index.md +0 -39
  296. package/docs/help/scripts.md +0 -56
  297. package/docs/help/testing-live.md +0 -587
  298. package/docs/help/testing-updates-plugins.md +0 -299
  299. package/docs/help/testing.md +0 -977
  300. package/docs/help/troubleshooting.md +0 -449
  301. package/docs/index.md +0 -196
  302. package/docs/install/ansible.md +0 -233
  303. package/docs/install/azure.md +0 -315
  304. package/docs/install/bun.md +0 -59
  305. package/docs/install/clawdock.md +0 -112
  306. package/docs/install/development-channels.md +0 -148
  307. package/docs/install/digitalocean.md +0 -174
  308. package/docs/install/docker-vm-runtime.md +0 -154
  309. package/docs/install/docker.md +0 -564
  310. package/docs/install/exe-dev.md +0 -201
  311. package/docs/install/fly.md +0 -524
  312. package/docs/install/gcp.md +0 -418
  313. package/docs/install/hetzner.md +0 -285
  314. package/docs/install/hostinger.md +0 -98
  315. package/docs/install/index.md +0 -232
  316. package/docs/install/installer.md +0 -447
  317. package/docs/install/kubernetes.md +0 -196
  318. package/docs/install/macos-vm.md +0 -281
  319. package/docs/install/migrating-claude.md +0 -165
  320. package/docs/install/migrating-hermes.md +0 -178
  321. package/docs/install/migrating.md +0 -137
  322. package/docs/install/nix.md +0 -112
  323. package/docs/install/node.md +0 -142
  324. package/docs/install/northflank.mdx +0 -44
  325. package/docs/install/oracle.md +0 -218
  326. package/docs/install/podman.md +0 -216
  327. package/docs/install/railway.mdx +0 -92
  328. package/docs/install/raspberry-pi.md +0 -234
  329. package/docs/install/render.mdx +0 -167
  330. package/docs/install/uninstall.md +0 -131
  331. package/docs/install/updating.md +0 -284
  332. package/docs/install/upstash.md +0 -96
  333. package/docs/logging.md +0 -320
  334. package/docs/nav-tabs-underline.js +0 -100
  335. package/docs/network.md +0 -72
  336. package/docs/nodes/audio.md +0 -216
  337. package/docs/nodes/camera.md +0 -166
  338. package/docs/nodes/images.md +0 -77
  339. package/docs/nodes/index.md +0 -439
  340. package/docs/nodes/location-command.md +0 -102
  341. package/docs/nodes/media-understanding.md +0 -495
  342. package/docs/nodes/talk.md +0 -160
  343. package/docs/nodes/troubleshooting.md +0 -123
  344. package/docs/nodes/voicewake.md +0 -93
  345. package/docs/perplexity.md +0 -11
  346. package/docs/plan/codex-context-engine-harness.md +0 -624
  347. package/docs/plan/ui-channels.md +0 -284
  348. package/docs/platforms/digitalocean.md +0 -12
  349. package/docs/platforms/easyrunner.md +0 -109
  350. package/docs/platforms/index.md +0 -51
  351. package/docs/platforms/linux.md +0 -141
  352. package/docs/platforms/mac/bundled-gateway.md +0 -79
  353. package/docs/platforms/mac/canvas.md +0 -128
  354. package/docs/platforms/mac/child-process.md +0 -72
  355. package/docs/platforms/mac/dev-setup.md +0 -112
  356. package/docs/platforms/mac/health.md +0 -39
  357. package/docs/platforms/mac/icon.md +0 -36
  358. package/docs/platforms/mac/logging.md +0 -62
  359. package/docs/platforms/mac/menu-bar.md +0 -93
  360. package/docs/platforms/mac/peekaboo.md +0 -96
  361. package/docs/platforms/mac/permissions.md +0 -73
  362. package/docs/platforms/mac/remote.md +0 -123
  363. package/docs/platforms/mac/signing.md +0 -52
  364. package/docs/platforms/mac/skills.md +0 -43
  365. package/docs/platforms/mac/voice-overlay.md +0 -66
  366. package/docs/platforms/mac/voicewake.md +0 -73
  367. package/docs/platforms/mac/webchat.md +0 -54
  368. package/docs/platforms/mac/xpc.md +0 -66
  369. package/docs/platforms/oracle.md +0 -12
  370. package/docs/platforms/raspberry-pi.md +0 -13
  371. package/docs/platforms/windows.md +0 -286
  372. package/docs/plugins/adding-capabilities.md +0 -146
  373. package/docs/plugins/admin-http-rpc.md +0 -216
  374. package/docs/plugins/agent-tools.md +0 -13
  375. package/docs/plugins/architecture-internals.md +0 -1196
  376. package/docs/plugins/architecture.md +0 -483
  377. package/docs/plugins/building-extensions.md +0 -13
  378. package/docs/plugins/building-plugins.md +0 -335
  379. package/docs/plugins/bundles.md +0 -310
  380. package/docs/plugins/cli-backend-plugins.md +0 -310
  381. package/docs/plugins/codex-computer-use.md +0 -297
  382. package/docs/plugins/codex-harness-reference.md +0 -470
  383. package/docs/plugins/codex-harness-runtime.md +0 -268
  384. package/docs/plugins/codex-harness.md +0 -780
  385. package/docs/plugins/codex-native-plugins.md +0 -276
  386. package/docs/plugins/community.md +0 -77
  387. package/docs/plugins/compatibility.md +0 -167
  388. package/docs/plugins/copilot.md +0 -356
  389. package/docs/plugins/dependency-resolution.md +0 -176
  390. package/docs/plugins/google-meet.md +0 -1737
  391. package/docs/plugins/hooks.md +0 -484
  392. package/docs/plugins/install-overrides.md +0 -80
  393. package/docs/plugins/manage-plugins.md +0 -210
  394. package/docs/plugins/manifest.md +0 -1457
  395. package/docs/plugins/memory-lancedb.md +0 -385
  396. package/docs/plugins/memory-wiki.md +0 -529
  397. package/docs/plugins/message-presentation.md +0 -473
  398. package/docs/plugins/oc-path.md +0 -166
  399. package/docs/plugins/plugin-inventory.md +0 -189
  400. package/docs/plugins/plugin-permission-requests.md +0 -193
  401. package/docs/plugins/reference/acpx.md +0 -23
  402. package/docs/plugins/reference/admin-http-rpc.md +0 -23
  403. package/docs/plugins/reference/alibaba.md +0 -23
  404. package/docs/plugins/reference/amazon-bedrock-mantle.md +0 -23
  405. package/docs/plugins/reference/amazon-bedrock.md +0 -23
  406. package/docs/plugins/reference/anthropic-vertex.md +0 -19
  407. package/docs/plugins/reference/anthropic.md +0 -23
  408. package/docs/plugins/reference/arcee.md +0 -23
  409. package/docs/plugins/reference/azure-speech.md +0 -23
  410. package/docs/plugins/reference/bonjour.md +0 -19
  411. package/docs/plugins/reference/brave.md +0 -23
  412. package/docs/plugins/reference/browser.md +0 -23
  413. package/docs/plugins/reference/byteplus.md +0 -19
  414. package/docs/plugins/reference/canvas.md +0 -19
  415. package/docs/plugins/reference/cerebras.md +0 -23
  416. package/docs/plugins/reference/chutes.md +0 -23
  417. package/docs/plugins/reference/clickclack.md +0 -23
  418. package/docs/plugins/reference/cloudflare-ai-gateway.md +0 -23
  419. package/docs/plugins/reference/codex-supervisor.md +0 -27
  420. package/docs/plugins/reference/codex.md +0 -23
  421. package/docs/plugins/reference/comfy.md +0 -23
  422. package/docs/plugins/reference/copilot-proxy.md +0 -19
  423. package/docs/plugins/reference/copilot.md +0 -23
  424. package/docs/plugins/reference/deepgram.md +0 -23
  425. package/docs/plugins/reference/deepinfra.md +0 -23
  426. package/docs/plugins/reference/deepseek.md +0 -23
  427. package/docs/plugins/reference/diagnostics-otel.md +0 -19
  428. package/docs/plugins/reference/diagnostics-prometheus.md +0 -19
  429. package/docs/plugins/reference/diffs-language-pack.md +0 -19
  430. package/docs/plugins/reference/diffs.md +0 -19
  431. package/docs/plugins/reference/discord.md +0 -23
  432. package/docs/plugins/reference/document-extract.md +0 -23
  433. package/docs/plugins/reference/duckduckgo.md +0 -23
  434. package/docs/plugins/reference/elevenlabs.md +0 -23
  435. package/docs/plugins/reference/exa.md +0 -23
  436. package/docs/plugins/reference/fal.md +0 -23
  437. package/docs/plugins/reference/feishu.md +0 -23
  438. package/docs/plugins/reference/file-transfer.md +0 -19
  439. package/docs/plugins/reference/firecrawl.md +0 -23
  440. package/docs/plugins/reference/fireworks.md +0 -23
  441. package/docs/plugins/reference/github-copilot.md +0 -23
  442. package/docs/plugins/reference/gmi.md +0 -23
  443. package/docs/plugins/reference/google-meet.md +0 -23
  444. package/docs/plugins/reference/google.md +0 -23
  445. package/docs/plugins/reference/googlechat.md +0 -23
  446. package/docs/plugins/reference/gradium.md +0 -23
  447. package/docs/plugins/reference/groq.md +0 -23
  448. package/docs/plugins/reference/huggingface.md +0 -23
  449. package/docs/plugins/reference/imessage.md +0 -23
  450. package/docs/plugins/reference/inworld.md +0 -23
  451. package/docs/plugins/reference/irc.md +0 -23
  452. package/docs/plugins/reference/kilocode.md +0 -23
  453. package/docs/plugins/reference/kimi.md +0 -23
  454. package/docs/plugins/reference/line.md +0 -23
  455. package/docs/plugins/reference/litellm.md +0 -23
  456. package/docs/plugins/reference/llm-task.md +0 -19
  457. package/docs/plugins/reference/lmstudio.md +0 -23
  458. package/docs/plugins/reference/lobster.md +0 -19
  459. package/docs/plugins/reference/matrix.md +0 -23
  460. package/docs/plugins/reference/mattermost.md +0 -23
  461. package/docs/plugins/reference/memory-core.md +0 -19
  462. package/docs/plugins/reference/memory-lancedb.md +0 -23
  463. package/docs/plugins/reference/memory-wiki.md +0 -23
  464. package/docs/plugins/reference/microsoft-foundry.md +0 -19
  465. package/docs/plugins/reference/microsoft.md +0 -19
  466. package/docs/plugins/reference/migrate-claude.md +0 -19
  467. package/docs/plugins/reference/migrate-hermes.md +0 -19
  468. package/docs/plugins/reference/minimax.md +0 -23
  469. package/docs/plugins/reference/mistral.md +0 -23
  470. package/docs/plugins/reference/moonshot.md +0 -23
  471. package/docs/plugins/reference/msteams.md +0 -23
  472. package/docs/plugins/reference/nextcloud-talk.md +0 -23
  473. package/docs/plugins/reference/nostr.md +0 -23
  474. package/docs/plugins/reference/novita.md +0 -23
  475. package/docs/plugins/reference/nvidia.md +0 -23
  476. package/docs/plugins/reference/oc-path.md +0 -23
  477. package/docs/plugins/reference/ollama.md +0 -23
  478. package/docs/plugins/reference/open-prose.md +0 -19
  479. package/docs/plugins/reference/openai.md +0 -23
  480. package/docs/plugins/reference/opencode-go.md +0 -23
  481. package/docs/plugins/reference/opencode.md +0 -23
  482. package/docs/plugins/reference/openrouter.md +0 -23
  483. package/docs/plugins/reference/openshell.md +0 -19
  484. package/docs/plugins/reference/perplexity.md +0 -23
  485. package/docs/plugins/reference/pixverse.md +0 -23
  486. package/docs/plugins/reference/policy.md +0 -72
  487. package/docs/plugins/reference/qa-channel.md +0 -23
  488. package/docs/plugins/reference/qa-lab.md +0 -19
  489. package/docs/plugins/reference/qa-matrix.md +0 -19
  490. package/docs/plugins/reference/qianfan.md +0 -23
  491. package/docs/plugins/reference/qqbot.md +0 -23
  492. package/docs/plugins/reference/qwen.md +0 -23
  493. package/docs/plugins/reference/runway.md +0 -23
  494. package/docs/plugins/reference/searxng.md +0 -19
  495. package/docs/plugins/reference/senseaudio.md +0 -23
  496. package/docs/plugins/reference/sglang.md +0 -23
  497. package/docs/plugins/reference/signal.md +0 -23
  498. package/docs/plugins/reference/skill-workshop.md +0 -23
  499. package/docs/plugins/reference/slack.md +0 -23
  500. package/docs/plugins/reference/stepfun.md +0 -23
  501. package/docs/plugins/reference/synology-chat.md +0 -23
  502. package/docs/plugins/reference/synthetic.md +0 -23
  503. package/docs/plugins/reference/tavily.md +0 -23
  504. package/docs/plugins/reference/telegram.md +0 -23
  505. package/docs/plugins/reference/tencent.md +0 -23
  506. package/docs/plugins/reference/tlon.md +0 -23
  507. package/docs/plugins/reference/together.md +0 -23
  508. package/docs/plugins/reference/tokenjuice.md +0 -23
  509. package/docs/plugins/reference/tts-local-cli.md +0 -19
  510. package/docs/plugins/reference/twitch.md +0 -23
  511. package/docs/plugins/reference/venice.md +0 -23
  512. package/docs/plugins/reference/vercel-ai-gateway.md +0 -23
  513. package/docs/plugins/reference/vllm.md +0 -23
  514. package/docs/plugins/reference/voice-call.md +0 -23
  515. package/docs/plugins/reference/volcengine.md +0 -23
  516. package/docs/plugins/reference/voyage.md +0 -19
  517. package/docs/plugins/reference/vydra.md +0 -23
  518. package/docs/plugins/reference/web-readability.md +0 -19
  519. package/docs/plugins/reference/webhooks.md +0 -23
  520. package/docs/plugins/reference/whatsapp.md +0 -23
  521. package/docs/plugins/reference/workboard.md +0 -23
  522. package/docs/plugins/reference/xai.md +0 -23
  523. package/docs/plugins/reference/xiaomi.md +0 -23
  524. package/docs/plugins/reference/zai.md +0 -23
  525. package/docs/plugins/reference/zalo.md +0 -23
  526. package/docs/plugins/reference/zalouser.md +0 -24
  527. package/docs/plugins/reference.md +0 -145
  528. package/docs/plugins/sdk-agent-harness.md +0 -338
  529. package/docs/plugins/sdk-channel-inbound.md +0 -70
  530. package/docs/plugins/sdk-channel-ingress.md +0 -137
  531. package/docs/plugins/sdk-channel-message.md +0 -18
  532. package/docs/plugins/sdk-channel-outbound.md +0 -113
  533. package/docs/plugins/sdk-channel-plugins.md +0 -765
  534. package/docs/plugins/sdk-channel-turn.md +0 -9
  535. package/docs/plugins/sdk-entrypoints.md +0 -344
  536. package/docs/plugins/sdk-migration.md +0 -979
  537. package/docs/plugins/sdk-overview.md +0 -511
  538. package/docs/plugins/sdk-provider-plugins.md +0 -846
  539. package/docs/plugins/sdk-runtime.md +0 -676
  540. package/docs/plugins/sdk-setup.md +0 -550
  541. package/docs/plugins/sdk-subpaths.md +0 -391
  542. package/docs/plugins/sdk-testing.md +0 -403
  543. package/docs/plugins/skill-workshop.md +0 -713
  544. package/docs/plugins/tool-plugins.md +0 -411
  545. package/docs/plugins/voice-call.md +0 -942
  546. package/docs/plugins/webhooks.md +0 -192
  547. package/docs/plugins/workboard.md +0 -252
  548. package/docs/plugins/zalouser.md +0 -86
  549. package/docs/prose.md +0 -137
  550. package/docs/providers/alibaba.md +0 -158
  551. package/docs/providers/anthropic.md +0 -381
  552. package/docs/providers/arcee.md +0 -144
  553. package/docs/providers/azure-speech.md +0 -119
  554. package/docs/providers/bedrock-mantle.md +0 -211
  555. package/docs/providers/bedrock.md +0 -414
  556. package/docs/providers/cerebras.md +0 -130
  557. package/docs/providers/chutes.md +0 -153
  558. package/docs/providers/claude-max-api-proxy.md +0 -191
  559. package/docs/providers/cloudflare-ai-gateway.md +0 -119
  560. package/docs/providers/comfy.md +0 -362
  561. package/docs/providers/deepgram.md +0 -184
  562. package/docs/providers/deepinfra.md +0 -92
  563. package/docs/providers/deepseek.md +0 -146
  564. package/docs/providers/ds4.md +0 -309
  565. package/docs/providers/elevenlabs.md +0 -130
  566. package/docs/providers/fal.md +0 -240
  567. package/docs/providers/fireworks.md +0 -144
  568. package/docs/providers/github-copilot.md +0 -257
  569. package/docs/providers/gmi.md +0 -92
  570. package/docs/providers/google.md +0 -472
  571. package/docs/providers/gradium.md +0 -123
  572. package/docs/providers/groq.md +0 -171
  573. package/docs/providers/huggingface.md +0 -235
  574. package/docs/providers/index.md +0 -105
  575. package/docs/providers/inferrs.md +0 -272
  576. package/docs/providers/inworld.md +0 -120
  577. package/docs/providers/kilocode.md +0 -135
  578. package/docs/providers/litellm.md +0 -234
  579. package/docs/providers/lmstudio.md +0 -224
  580. package/docs/providers/minimax.md +0 -505
  581. package/docs/providers/mistral.md +0 -235
  582. package/docs/providers/models.md +0 -64
  583. package/docs/providers/moonshot.md +0 -413
  584. package/docs/providers/novita.md +0 -92
  585. package/docs/providers/nvidia.md +0 -158
  586. package/docs/providers/ollama-cloud.md +0 -115
  587. package/docs/providers/ollama.md +0 -1225
  588. package/docs/providers/openai.md +0 -1093
  589. package/docs/providers/opencode-go.md +0 -123
  590. package/docs/providers/opencode.md +0 -149
  591. package/docs/providers/openrouter.md +0 -349
  592. package/docs/providers/perplexity-provider.md +0 -123
  593. package/docs/providers/pixverse.md +0 -165
  594. package/docs/providers/qianfan.md +0 -132
  595. package/docs/providers/qwen-oauth.md +0 -115
  596. package/docs/providers/qwen.md +0 -364
  597. package/docs/providers/runway.md +0 -103
  598. package/docs/providers/senseaudio.md +0 -68
  599. package/docs/providers/sglang.md +0 -161
  600. package/docs/providers/stepfun.md +0 -229
  601. package/docs/providers/synthetic.md +0 -154
  602. package/docs/providers/tencent.md +0 -130
  603. package/docs/providers/together.md +0 -140
  604. package/docs/providers/venice.md +0 -312
  605. package/docs/providers/vercel-ai-gateway.md +0 -128
  606. package/docs/providers/vllm.md +0 -407
  607. package/docs/providers/volcengine.md +0 -199
  608. package/docs/providers/vydra.md +0 -180
  609. package/docs/providers/xai.md +0 -571
  610. package/docs/providers/xiaomi.md +0 -262
  611. package/docs/providers/zai.md +0 -224
  612. package/docs/refactor/access.md +0 -9
  613. package/docs/refactor/acp.md +0 -298
  614. package/docs/refactor/canvas.md +0 -131
  615. package/docs/refactor/database-first.md +0 -2256
  616. package/docs/refactor/ingress-core.md +0 -341
  617. package/docs/reference/AGENTS.default.md +0 -131
  618. package/docs/reference/RELEASING.md +0 -799
  619. package/docs/reference/api-usage-costs.md +0 -208
  620. package/docs/reference/application-modernization-plan.md +0 -208
  621. package/docs/reference/code-mode.md +0 -773
  622. package/docs/reference/credits.md +0 -33
  623. package/docs/reference/device-models.md +0 -50
  624. package/docs/reference/fengming-sdk-api-design.md +0 -390
  625. package/docs/reference/full-release-validation.md +0 -202
  626. package/docs/reference/memory-config.md +0 -604
  627. package/docs/reference/prompt-caching.md +0 -358
  628. package/docs/reference/release-performance-sweep.md +0 -360
  629. package/docs/reference/rich-output-protocol.md +0 -101
  630. package/docs/reference/rpc.md +0 -43
  631. package/docs/reference/secret-placeholder-conventions.md +0 -33
  632. package/docs/reference/secretref-credential-surface.md +0 -159
  633. package/docs/reference/secretref-user-supplied-credentials-matrix.json +0 -663
  634. package/docs/reference/session-management-compaction.md +0 -474
  635. package/docs/reference/templates/AGENTS.dev.md +0 -90
  636. package/docs/reference/templates/AGENTS.md +0 -227
  637. package/docs/reference/templates/BOOT.md +0 -16
  638. package/docs/reference/templates/BOOTSTRAP.md +0 -66
  639. package/docs/reference/templates/CLAUDE.md +0 -1
  640. package/docs/reference/templates/HEARTBEAT.md +0 -24
  641. package/docs/reference/templates/IDENTITY.dev.md +0 -52
  642. package/docs/reference/templates/IDENTITY.md +0 -34
  643. package/docs/reference/templates/SOUL.dev.md +0 -82
  644. package/docs/reference/templates/SOUL.md +0 -49
  645. package/docs/reference/templates/TOOLS.dev.md +0 -29
  646. package/docs/reference/templates/TOOLS.md +0 -51
  647. package/docs/reference/templates/USER.dev.md +0 -23
  648. package/docs/reference/templates/USER.md +0 -28
  649. package/docs/reference/test.md +0 -247
  650. package/docs/reference/token-use.md +0 -246
  651. package/docs/reference/transcript-hygiene.md +0 -214
  652. package/docs/reference/wizard.md +0 -252
  653. package/docs/security/CONTRIBUTING-THREAT-MODEL.md +0 -101
  654. package/docs/security/THREAT-MODEL-ATLAS.md +0 -611
  655. package/docs/security/formal-verification.md +0 -170
  656. package/docs/security/incident-response.md +0 -59
  657. package/docs/security/network-proxy.md +0 -268
  658. package/docs/snippets/plugin-publish/minimal-fengming.plugin.json +0 -12
  659. package/docs/snippets/plugin-publish/minimal-package.json +0 -16
  660. package/docs/specs/claw-supervisor.md +0 -247
  661. package/docs/start/bootstrapping.md +0 -49
  662. package/docs/start/docs-directory.md +0 -69
  663. package/docs/start/fengming.md +0 -252
  664. package/docs/start/getting-started.md +0 -152
  665. package/docs/start/hubs.md +0 -201
  666. package/docs/start/lore.md +0 -223
  667. package/docs/start/onboarding-overview.md +0 -72
  668. package/docs/start/onboarding.md +0 -98
  669. package/docs/start/quickstart.md +0 -25
  670. package/docs/start/setup.md +0 -178
  671. package/docs/start/showcase.md +0 -363
  672. package/docs/start/wizard-cli-automation.md +0 -232
  673. package/docs/start/wizard-cli-reference.md +0 -331
  674. package/docs/start/wizard.md +0 -141
  675. package/docs/style.css +0 -137
  676. package/docs/superpowers/specs/2026-04-22-tweakcn-custom-theme-import-design.md +0 -316
  677. package/docs/tools/acp-agents-setup.md +0 -351
  678. package/docs/tools/acp-agents.md +0 -854
  679. package/docs/tools/agent-send.md +0 -130
  680. package/docs/tools/apply-patch.md +0 -64
  681. package/docs/tools/brave-search.md +0 -139
  682. package/docs/tools/browser-control.md +0 -391
  683. package/docs/tools/browser-linux-troubleshooting.md +0 -173
  684. package/docs/tools/browser-login.md +0 -77
  685. package/docs/tools/browser-wsl2-windows-remote-cdp-troubleshooting.md +0 -219
  686. package/docs/tools/browser.md +0 -810
  687. package/docs/tools/btw.md +0 -159
  688. package/docs/tools/capability-cookbook.md +0 -12
  689. package/docs/tools/clawhub.md +0 -5
  690. package/docs/tools/code-execution.md +0 -173
  691. package/docs/tools/creating-skills.md +0 -158
  692. package/docs/tools/diffs.md +0 -525
  693. package/docs/tools/duckduckgo-search.md +0 -109
  694. package/docs/tools/elevated.md +0 -128
  695. package/docs/tools/exa-search.md +0 -152
  696. package/docs/tools/exec-approvals-advanced.md +0 -444
  697. package/docs/tools/exec-approvals.md +0 -494
  698. package/docs/tools/exec.md +0 -285
  699. package/docs/tools/firecrawl.md +0 -155
  700. package/docs/tools/gemini-search.md +0 -114
  701. package/docs/tools/goal.md +0 -217
  702. package/docs/tools/grok-search.md +0 -129
  703. package/docs/tools/image-generation.md +0 -493
  704. package/docs/tools/index.md +0 -178
  705. package/docs/tools/kimi-search.md +0 -105
  706. package/docs/tools/llm-task.md +0 -137
  707. package/docs/tools/lobster.md +0 -365
  708. package/docs/tools/loop-detection.md +0 -154
  709. package/docs/tools/media-overview.md +0 -160
  710. package/docs/tools/minimax-search.md +0 -102
  711. package/docs/tools/multi-agent-sandbox-tools.md +0 -409
  712. package/docs/tools/music-generation.md +0 -372
  713. package/docs/tools/ollama-search.md +0 -153
  714. package/docs/tools/pdf.md +0 -213
  715. package/docs/tools/perplexity-search.md +0 -220
  716. package/docs/tools/plugin.md +0 -363
  717. package/docs/tools/reactions.md +0 -100
  718. package/docs/tools/searxng-search.md +0 -141
  719. package/docs/tools/skills-config.md +0 -195
  720. package/docs/tools/skills.md +0 -569
  721. package/docs/tools/slash-commands.md +0 -487
  722. package/docs/tools/steer.md +0 -77
  723. package/docs/tools/subagents.md +0 -651
  724. package/docs/tools/tavily.md +0 -162
  725. package/docs/tools/thinking.md +0 -142
  726. package/docs/tools/tokenjuice.md +0 -84
  727. package/docs/tools/tool-search.md +0 -269
  728. package/docs/tools/trajectory.md +0 -229
  729. package/docs/tools/tts.md +0 -1009
  730. package/docs/tools/video-generation.md +0 -555
  731. package/docs/tools/web-fetch.md +0 -210
  732. package/docs/tools/web.md +0 -461
  733. package/docs/tts.md +0 -11
  734. package/docs/vps.md +0 -139
  735. package/docs/web/control-ui.md +0 -512
  736. package/docs/web/dashboard.md +0 -107
  737. package/docs/web/index.md +0 -133
  738. package/docs/web/tui.md +0 -250
  739. package/docs/web/webchat.md +0 -102
  740. package/npm-shrinkwrap.json +0 -12861
  741. package/patches/.gitkeep +0 -0
  742. package/patches/@agentclientprotocol__claude-agent-acp@0.37.0.patch +0 -41
  743. package/pnpm-workspace.yaml +0 -120
  744. package/scripts/crabbox-wrapper.mjs +0 -2004
  745. package/scripts/lib/official-external-channel-catalog.json +0 -560
  746. package/scripts/lib/official-external-plugin-catalog.json +0 -264
  747. package/scripts/lib/official-external-provider-catalog.json +0 -158
  748. package/scripts/lib/package-dist-imports.mjs +0 -171
  749. package/scripts/npm-runner.mjs +0 -91
  750. package/scripts/postinstall-bundled-plugins.mjs +0 -978
  751. package/scripts/preinstall-package-manager-warning.mjs +0 -64
  752. package/scripts/prepare-git-hooks.mjs +0 -72
  753. package/scripts/windows-cmd-helpers.mjs +0 -22
  754. package/skills/batch/SKILL.md +0 -118
  755. package/skills/code-review/SKILL.md +0 -107
  756. package/skills/debug/SKILL.md +0 -83
  757. package/skills/loop/SKILL.md +0 -118
  758. package/skills/run/SKILL.md +0 -79
  759. package/skills/run-skill-generator/SKILL.md +0 -179
  760. package/skills/verify/SKILL.md +0 -103
  761. 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)