fengming 0.3.10 → 0.3.12

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 (871) hide show
  1. package/dist/build-info.json +2 -2
  2. package/dist/canvas-host/a2ui/.bundle.hash +1 -1
  3. package/dist/cli/run-main.js +3 -3
  4. package/dist/cli-startup-metadata.json +8 -8
  5. package/dist/{command-registry-DMB-HKIk.js → command-registry-BHIBvpgR.js} +2 -2
  6. package/dist/{command-registry-C5ooX6PF.js → command-registry-BT5icv-c.js} +2 -2
  7. package/dist/{command-registry-core-B2w_XWvn.js → command-registry-core-C-a3GaYV.js} +2 -2
  8. package/dist/{completion-cli-Bf4mEw2W.js → completion-cli-BUfFF31m.js} +2 -2
  9. package/dist/control-ui/assets/{activity-D-mnRThU.js → activity-DF1iC1pF.js} +2 -2
  10. package/dist/control-ui/assets/{agents-U_KSP5I_.js → agents-CDGNJA8n.js} +2 -2
  11. package/dist/control-ui/assets/{channels-ohK9_G1O.js → channels-CAPFdCrE.js} +2 -2
  12. package/dist/control-ui/assets/{cron-6ZCzfU29.js → cron-DUUdUzzu.js} +2 -2
  13. package/dist/control-ui/assets/{debug-CSsDLg_s.js → debug-BwfVXGKK.js} +2 -2
  14. package/dist/control-ui/assets/{index-jUDczxhd.js → index-JWV4rMUy.js} +4 -4
  15. package/dist/control-ui/assets/{instances-782ZoDT4.js → instances-BqAPpn0Y.js} +2 -2
  16. package/dist/control-ui/assets/{nodes-BMX16BKM.js → nodes-gya-0PkG.js} +2 -2
  17. package/dist/control-ui/assets/{sessions-jLGSApYa.js → sessions-BdttyTpI.js} +2 -2
  18. package/dist/control-ui/assets/{skills-DweBwUhs.js → skills-D_rtwBjc.js} +2 -2
  19. package/dist/control-ui/assets/{workboard-BsU-FXIo.js → workboard-CIGDGkWB.js} +2 -2
  20. package/dist/control-ui/index.html +1 -1
  21. package/dist/control-ui/sw.js +1 -1
  22. package/dist/crestodian/crestodian.js +1 -1
  23. package/dist/crestodian/rescue-message.js +1 -1
  24. package/dist/{crestodian-C0x7JjF-.js → crestodian-CAxGCgHM.js} +3 -3
  25. package/dist/{dialogue-No0NvYX7.js → dialogue-CHuN9qet.js} +1 -1
  26. package/dist/gateway/protocol/index.d.ts +1 -1
  27. package/dist/{index-AZzJCgph.d.ts → index-DbpfOFUf.d.ts} +1 -1
  28. package/dist/{operations-Z85LFqsT.js → operations-Mvnrndji.js} +1 -1
  29. package/dist/plugin-sdk/.boundary-entry-shims.stamp +1 -1
  30. package/dist/plugin-sdk/{agent-harness-runtime-CgQiThzm.d.ts → agent-harness-runtime-Bkrjji63.d.ts} +2 -2
  31. package/dist/plugin-sdk/agent-harness-runtime.d.ts +4 -4
  32. package/dist/plugin-sdk/agent-harness-task-runtime.d.ts +1 -1
  33. package/dist/plugin-sdk/agent-harness.d.ts +4 -4
  34. package/dist/plugin-sdk/agent-runtime.d.ts +1 -1
  35. package/dist/plugin-sdk/{bundled-channel-config-schema-Dfn3b8sF.d.ts → bundled-channel-config-schema-ZTBQez8k.d.ts} +9 -9
  36. package/dist/plugin-sdk/bundled-channel-config-schema.d.ts +1 -1
  37. package/dist/plugin-sdk/channel-config-schema-legacy.d.ts +1 -1
  38. package/dist/plugin-sdk/channel-core.d.ts +2 -2
  39. package/dist/plugin-sdk/channel-entry-contract.d.ts +1 -1
  40. package/dist/plugin-sdk/{channel-pairing-CX6ncj1r.d.ts → channel-pairing-CzsPAHgH.d.ts} +1 -1
  41. package/dist/plugin-sdk/channel-pairing.d.ts +1 -1
  42. package/dist/plugin-sdk/channel-plugin-common.d.ts +2 -2
  43. package/dist/plugin-sdk/cli-backend.d.ts +1 -1
  44. package/dist/plugin-sdk/compat.d.ts +4 -4
  45. package/dist/plugin-sdk/{config-schema-DuJUjn6k.d.ts → config-schema-N64y7n8C.d.ts} +1 -1
  46. package/dist/plugin-sdk/config-schema.d.ts +4 -4
  47. package/dist/plugin-sdk/{core-CPtu2Ftl.d.ts → core-BWZB2hNB.d.ts} +1 -1
  48. package/dist/plugin-sdk/core.d.ts +7 -7
  49. package/dist/plugin-sdk/{delegate-uk6vAMkc.d.ts → delegate-o5xckIuc.d.ts} +1 -1
  50. package/dist/plugin-sdk/discord.d.ts +3 -3
  51. package/dist/plugin-sdk/{fengming-runtime-Dt2ZEVYX.d.ts → fengming-runtime-abXAXyq2.d.ts} +1 -1
  52. package/dist/plugin-sdk/gateway-runtime.d.ts +1 -1
  53. package/dist/plugin-sdk/{host-compat-CM0h9ODw.d.ts → host-compat-D2Ky8seZ.d.ts} +1 -1
  54. package/dist/plugin-sdk/{http-registry-BniL_epL.d.ts → http-registry-oxJbX3E-.d.ts} +2 -2
  55. package/dist/plugin-sdk/image-generation-core.d.ts +4 -4
  56. package/dist/plugin-sdk/image-generation-runtime.d.ts +3 -3
  57. package/dist/plugin-sdk/index.d.ts +4 -4
  58. package/dist/plugin-sdk/lmstudio.d.ts +1 -1
  59. package/dist/plugin-sdk/{loader-aELh60PE.d.ts → loader-CgJhYjxT.d.ts} +3 -3
  60. package/dist/plugin-sdk/{logger-BpB3--7Z.d.ts → logger-CyDIBtoX.d.ts} +1 -1
  61. package/dist/plugin-sdk/logging-core.d.ts +3 -3
  62. package/dist/plugin-sdk/memory-core-host-engine-embeddings.d.ts +2 -2
  63. package/dist/plugin-sdk/memory-core-host-engine-foundation.d.ts +3 -3
  64. package/dist/plugin-sdk/{memory-core-host-engine-storage-DYPjOQCg.d.ts → memory-core-host-engine-storage-DfW7ZqD0.d.ts} +1 -1
  65. package/dist/plugin-sdk/memory-core-host-engine-storage.d.ts +1 -1
  66. package/dist/plugin-sdk/memory-core-host-runtime-cli.d.ts +1 -1
  67. package/dist/plugin-sdk/memory-core-host-runtime-core.d.ts +3 -3
  68. package/dist/plugin-sdk/memory-core.d.ts +3 -3
  69. package/dist/plugin-sdk/memory-host-core.d.ts +3 -3
  70. package/dist/plugin-sdk/migration-runtime.d.ts +1 -1
  71. package/dist/plugin-sdk/migration.d.ts +1 -1
  72. package/dist/plugin-sdk/music-generation-core.d.ts +2 -2
  73. package/dist/plugin-sdk/{plugin-entry-DO9kQeTr.d.ts → plugin-entry-C9xM-ZA9.d.ts} +1 -1
  74. package/dist/plugin-sdk/plugin-entry.d.ts +3 -3
  75. package/dist/plugin-sdk/plugin-runtime.d.ts +3 -3
  76. package/dist/plugin-sdk/{provider-api-key-auth-DvIiojS6.d.ts → provider-api-key-auth-DOmYPTC2.d.ts} +1 -1
  77. package/dist/plugin-sdk/provider-auth-api-key.d.ts +4 -4
  78. package/dist/plugin-sdk/{provider-auth-helpers-CYkWZ0vq.d.ts → provider-auth-helpers-pqDNrZTd.d.ts} +1 -1
  79. package/dist/plugin-sdk/{provider-auth-input-DUV6ZTw4.d.ts → provider-auth-input-Ckt-cU4H.d.ts} +1 -1
  80. package/dist/plugin-sdk/provider-auth-result.d.ts +1 -1
  81. package/dist/plugin-sdk/provider-auth-runtime.d.ts +1 -1
  82. package/dist/plugin-sdk/provider-auth.d.ts +5 -5
  83. package/dist/plugin-sdk/provider-catalog-runtime.d.ts +2 -2
  84. package/dist/plugin-sdk/{provider-catalog-shared-Cm3SyFfL.d.ts → provider-catalog-shared-QvOT8Wz1.d.ts} +1 -1
  85. package/dist/plugin-sdk/provider-catalog-shared.d.ts +2 -2
  86. package/dist/plugin-sdk/provider-entry.d.ts +3 -3
  87. package/dist/plugin-sdk/{provider-model-shared-D5rgn7Gb.d.ts → provider-model-shared-Bnc8IMx5.d.ts} +1 -1
  88. package/dist/plugin-sdk/provider-model-shared.d.ts +2 -2
  89. package/dist/plugin-sdk/{provider-registry-DxdZT9UN.d.ts → provider-registry-Ba1nNfhA.d.ts} +1 -1
  90. package/dist/plugin-sdk/{provider-registry-DiKX35tc.d.ts → provider-registry-CqB5bSAD.d.ts} +1 -1
  91. package/dist/plugin-sdk/{provider-registry-D0vmhPWL.d.ts → provider-registry-CxdVib8g.d.ts} +1 -1
  92. package/dist/plugin-sdk/{provider-self-hosted-setup-BPx7JMDC.d.ts → provider-self-hosted-setup-eMoeVPnF.d.ts} +1 -1
  93. package/dist/plugin-sdk/provider-setup.d.ts +2 -2
  94. package/dist/plugin-sdk/{provider-stream-DcC2vn_N.d.ts → provider-stream-CGaLae9n.d.ts} +1 -1
  95. package/dist/plugin-sdk/provider-stream-family.d.ts +2 -2
  96. package/dist/plugin-sdk/{provider-stream-shared-ByDv3QKm.d.ts → provider-stream-shared-u5mt-8_i.d.ts} +1 -1
  97. package/dist/plugin-sdk/provider-stream-shared.d.ts +1 -1
  98. package/dist/plugin-sdk/provider-stream.d.ts +2 -2
  99. package/dist/plugin-sdk/provider-tools.d.ts +1 -1
  100. package/dist/plugin-sdk/provider-web-fetch-contract.d.ts +1 -1
  101. package/dist/plugin-sdk/provider-web-fetch.d.ts +1 -1
  102. package/dist/plugin-sdk/provider-web-search-config-contract.d.ts +2 -2
  103. package/dist/plugin-sdk/{provider-web-search-contract-fields-CY4v8kS-.d.ts → provider-web-search-contract-fields-BiWOSs_d.d.ts} +1 -1
  104. package/dist/plugin-sdk/provider-web-search-contract.d.ts +2 -2
  105. package/dist/plugin-sdk/provider-web-search.d.ts +1 -1
  106. package/dist/plugin-sdk/realtime-transcription.d.ts +1 -1
  107. package/dist/plugin-sdk/realtime-voice.d.ts +1 -1
  108. package/dist/plugin-sdk/{redact-identifier-CVwkabcI.d.ts → redact-identifier-CVqsKaEK.d.ts} +1 -1
  109. package/dist/plugin-sdk/{registry-CzaGoAKH.d.ts → registry-Gq9OFlb3.d.ts} +2 -2
  110. package/dist/plugin-sdk/{registry-types-DN1yiH3F.d.ts → registry-types-DyBkef1H.d.ts} +2 -2
  111. package/dist/plugin-sdk/reply-runtime.d.ts +1 -1
  112. package/dist/plugin-sdk/runtime-env.d.ts +3 -3
  113. package/dist/plugin-sdk/runtime-store.d.ts +1 -1
  114. package/dist/plugin-sdk/runtime.d.ts +3 -3
  115. package/dist/plugin-sdk/self-hosted-provider-setup.d.ts +2 -2
  116. package/dist/plugin-sdk/simple-completion-runtime.d.ts +1 -1
  117. package/dist/plugin-sdk/speech-core.d.ts +2 -2
  118. package/dist/plugin-sdk/speech.d.ts +2 -2
  119. package/dist/plugin-sdk/{subsystem-n4Y4vCcQ.d.ts → subsystem-Boo2DQIV.d.ts} +1 -1
  120. package/dist/plugin-sdk/text-runtime.d.ts +2 -2
  121. package/dist/plugin-sdk/tool-plugin.d.ts +2 -2
  122. package/dist/plugin-sdk/{types-BI8R-vGd.d.ts → types-DGF1KeaJ.d.ts} +2 -2
  123. package/dist/plugin-sdk/{types-CsqNt0j8.d.ts → types-DpaN54PS.d.ts} +1 -1
  124. package/dist/plugin-sdk/{unhandled-rejections-D9eBl3hT.d.ts → unhandled-rejections-Bez6JG0y.d.ts} +2 -2
  125. package/dist/plugin-sdk/video-generation-core.d.ts +3 -3
  126. package/dist/plugin-sdk/video-generation-runtime.d.ts +3 -3
  127. package/dist/plugin-sdk/webhook-ingress.d.ts +1 -1
  128. package/dist/plugin-sdk/webhook-targets.d.ts +1 -1
  129. package/dist/{program-D19g2jaa.js → program-BaCHjV-F.js} +1 -1
  130. package/dist/{register.crestodian-BhIukKDA.js → register.crestodian-DMJEPMf3.js} +1 -1
  131. package/dist/register.subclis-B0BgjwyK.js +3 -0
  132. package/dist/{register.subclis-DVk0HU4k.js → register.subclis-BuoWG93n.js} +2 -2
  133. package/dist/{register.subclis-core-BK7nVvl6.js → register.subclis-core-BGBFrWE3.js} +2 -2
  134. package/dist/{standalone-CHrieUsw.js → standalone-CV2Ud6F7.js} +1 -1
  135. package/dist/tui-Bvt7hhwe.js +3 -0
  136. package/dist/tui-CFSmzhsm.js +2 -0
  137. package/dist/{tui-backend-_Pn3Byj-.js → tui-backend-Bm_t5G7x.js} +4 -4
  138. package/dist/{tui-cli-CAiC39zd.js → tui-cli-9Ny23hmo.js} +1 -1
  139. package/dist/tui-ink-run-CuExfFLV.js +2 -0
  140. package/dist/{tui-ink-run-ChXEGj1h.js → tui-ink-run-qNL49iQn.js} +17 -1
  141. package/package.json +6 -410
  142. package/CHANGELOG.md +0 -42
  143. package/THIRD_PARTY_NOTICES.md +0 -37
  144. package/dist/register.subclis-Bsvdh8RI.js +0 -3
  145. package/dist/tui-C733Qov0.js +0 -2
  146. package/dist/tui-DqbscVN5.js +0 -3
  147. package/dist/tui-ink-run-D4mSfLHj.js +0 -2
  148. package/docs/.i18n/README.md +0 -81
  149. package/docs/.i18n/ar-navigation.json +0 -18
  150. package/docs/.i18n/de-navigation.json +0 -18
  151. package/docs/.i18n/es-navigation.json +0 -18
  152. package/docs/.i18n/fr-navigation.json +0 -18
  153. package/docs/.i18n/glossary.ar.json +0 -78
  154. package/docs/.i18n/glossary.de.json +0 -78
  155. package/docs/.i18n/glossary.es.json +0 -78
  156. package/docs/.i18n/glossary.fa.json +0 -78
  157. package/docs/.i18n/glossary.fr.json +0 -78
  158. package/docs/.i18n/glossary.id.json +0 -78
  159. package/docs/.i18n/glossary.it.json +0 -78
  160. package/docs/.i18n/glossary.ja-JP.json +0 -98
  161. package/docs/.i18n/glossary.ko.json +0 -78
  162. package/docs/.i18n/glossary.nl.json +0 -78
  163. package/docs/.i18n/glossary.pl.json +0 -78
  164. package/docs/.i18n/glossary.pt-BR.json +0 -78
  165. package/docs/.i18n/glossary.th.json +0 -78
  166. package/docs/.i18n/glossary.tr.json +0 -78
  167. package/docs/.i18n/glossary.uk.json +0 -78
  168. package/docs/.i18n/glossary.vi.json +0 -78
  169. package/docs/.i18n/glossary.zh-CN.json +0 -1122
  170. package/docs/.i18n/glossary.zh-TW.json +0 -78
  171. package/docs/.i18n/id-navigation.json +0 -18
  172. package/docs/.i18n/it-navigation.json +0 -18
  173. package/docs/.i18n/ja-navigation.json +0 -18
  174. package/docs/.i18n/ko-navigation.json +0 -18
  175. package/docs/.i18n/pl-navigation.json +0 -18
  176. package/docs/.i18n/pt-BR-navigation.json +0 -18
  177. package/docs/.i18n/tr-navigation.json +0 -18
  178. package/docs/.i18n/translation-workflow.md +0 -111
  179. package/docs/.i18n/zh-Hans-navigation.json +0 -552
  180. package/docs/AGENTS.md +0 -36
  181. package/docs/CLAUDE.md +0 -1
  182. package/docs/agent-runtime-architecture.md +0 -48
  183. package/docs/announcements/bluebubbles-imessage.md +0 -79
  184. package/docs/auth-credential-semantics.md +0 -124
  185. package/docs/automation/auth-monitoring.md +0 -11
  186. package/docs/automation/clawflow.md +0 -12
  187. package/docs/automation/cron-jobs.md +0 -534
  188. package/docs/automation/cron-vs-heartbeat.md +0 -11
  189. package/docs/automation/gmail-pubsub.md +0 -11
  190. package/docs/automation/hooks.md +0 -387
  191. package/docs/automation/index.md +0 -135
  192. package/docs/automation/poll.md +0 -12
  193. package/docs/automation/standing-orders.md +0 -250
  194. package/docs/automation/taskflow.md +0 -155
  195. package/docs/automation/tasks.md +0 -374
  196. package/docs/automation/troubleshooting.md +0 -12
  197. package/docs/automation/webhook.md +0 -12
  198. package/docs/brave-search.md +0 -11
  199. package/docs/channels/access-groups.md +0 -201
  200. package/docs/channels/ambient-room-events.md +0 -214
  201. package/docs/channels/bot-loop-protection.md +0 -131
  202. package/docs/channels/broadcast-groups.md +0 -472
  203. package/docs/channels/channel-routing.md +0 -162
  204. package/docs/channels/clickclack.md +0 -138
  205. package/docs/channels/discord.md +0 -1758
  206. package/docs/channels/feishu.md +0 -650
  207. package/docs/channels/googlechat.md +0 -284
  208. package/docs/channels/group-messages.md +0 -95
  209. package/docs/channels/groups.md +0 -524
  210. package/docs/channels/imessage-from-bluebubbles.md +0 -259
  211. package/docs/channels/imessage.md +0 -839
  212. package/docs/channels/index.md +0 -64
  213. package/docs/channels/irc.md +0 -253
  214. package/docs/channels/line.md +0 -243
  215. package/docs/channels/location.md +0 -71
  216. package/docs/channels/matrix-migration.md +0 -370
  217. package/docs/channels/matrix-presentation.md +0 -77
  218. package/docs/channels/matrix-push-rules.md +0 -150
  219. package/docs/channels/matrix.md +0 -921
  220. package/docs/channels/mattermost.md +0 -542
  221. package/docs/channels/msteams.md +0 -1096
  222. package/docs/channels/nextcloud-talk.md +0 -176
  223. package/docs/channels/nostr.md +0 -253
  224. package/docs/channels/pairing.md +0 -214
  225. package/docs/channels/qqbot.md +0 -314
  226. package/docs/channels/signal.md +0 -417
  227. package/docs/channels/slack.md +0 -1623
  228. package/docs/channels/synology-chat.md +0 -187
  229. package/docs/channels/telegram.md +0 -1124
  230. package/docs/channels/tlon.md +0 -296
  231. package/docs/channels/troubleshooting.md +0 -162
  232. package/docs/channels/twitch.md +0 -431
  233. package/docs/channels/wechat.md +0 -171
  234. package/docs/channels/whatsapp.md +0 -796
  235. package/docs/channels/yuanbao.md +0 -416
  236. package/docs/channels/zalo.md +0 -253
  237. package/docs/channels/zalouser.md +0 -217
  238. package/docs/ci.md +0 -657
  239. package/docs/clawhub/publishing.md +0 -96
  240. package/docs/cli/acp.md +0 -370
  241. package/docs/cli/agent.md +0 -109
  242. package/docs/cli/agents.md +0 -253
  243. package/docs/cli/approvals.md +0 -190
  244. package/docs/cli/backup.md +0 -98
  245. package/docs/cli/browser.md +0 -307
  246. package/docs/cli/channels.md +0 -154
  247. package/docs/cli/clawbot.md +0 -25
  248. package/docs/cli/commitments.md +0 -90
  249. package/docs/cli/completion.md +0 -39
  250. package/docs/cli/config.md +0 -504
  251. package/docs/cli/configure.md +0 -77
  252. package/docs/cli/crestodian.md +0 -337
  253. package/docs/cli/cron.md +0 -304
  254. package/docs/cli/daemon.md +0 -67
  255. package/docs/cli/dashboard.md +0 -33
  256. package/docs/cli/devices.md +0 -240
  257. package/docs/cli/directory.md +0 -68
  258. package/docs/cli/dns.md +0 -53
  259. package/docs/cli/docs.md +0 -63
  260. package/docs/cli/doctor.md +0 -241
  261. package/docs/cli/flows.md +0 -52
  262. package/docs/cli/gateway.md +0 -572
  263. package/docs/cli/health.md +0 -43
  264. package/docs/cli/hooks.md +0 -345
  265. package/docs/cli/index.md +0 -400
  266. package/docs/cli/infer.md +0 -364
  267. package/docs/cli/logs.md +0 -68
  268. package/docs/cli/mcp.md +0 -529
  269. package/docs/cli/memory.md +0 -183
  270. package/docs/cli/message.md +0 -317
  271. package/docs/cli/migrate.md +0 -334
  272. package/docs/cli/models.md +0 -239
  273. package/docs/cli/node.md +0 -177
  274. package/docs/cli/nodes.md +0 -76
  275. package/docs/cli/onboard.md +0 -250
  276. package/docs/cli/pairing.md +0 -77
  277. package/docs/cli/path.md +0 -511
  278. package/docs/cli/plugins.md +0 -459
  279. package/docs/cli/policy.md +0 -886
  280. package/docs/cli/proxy.md +0 -89
  281. package/docs/cli/qr.md +0 -56
  282. package/docs/cli/reset.md +0 -39
  283. package/docs/cli/sandbox.md +0 -208
  284. package/docs/cli/secrets.md +0 -202
  285. package/docs/cli/security.md +0 -136
  286. package/docs/cli/sessions.md +0 -164
  287. package/docs/cli/setup.md +0 -59
  288. package/docs/cli/skills.md +0 -122
  289. package/docs/cli/status.md +0 -45
  290. package/docs/cli/system.md +0 -89
  291. package/docs/cli/tasks.md +0 -111
  292. package/docs/cli/transcripts.md +0 -151
  293. package/docs/cli/tui.md +0 -91
  294. package/docs/cli/uninstall.md +0 -44
  295. package/docs/cli/update.md +0 -243
  296. package/docs/cli/voicecall.md +0 -204
  297. package/docs/cli/webhooks.md +0 -117
  298. package/docs/cli/wiki.md +0 -256
  299. package/docs/concepts/active-memory.md +0 -856
  300. package/docs/concepts/agent-loop.md +0 -185
  301. package/docs/concepts/agent-runtimes.md +0 -276
  302. package/docs/concepts/agent-workspace.md +0 -230
  303. package/docs/concepts/agent.md +0 -140
  304. package/docs/concepts/architecture.md +0 -154
  305. package/docs/concepts/channel-docking.md +0 -145
  306. package/docs/concepts/commitments.md +0 -150
  307. package/docs/concepts/compaction.md +0 -203
  308. package/docs/concepts/context-engine.md +0 -347
  309. package/docs/concepts/context.md +0 -199
  310. package/docs/concepts/delegate-architecture.md +0 -319
  311. package/docs/concepts/dreaming.md +0 -264
  312. package/docs/concepts/experimental-features.md +0 -109
  313. package/docs/concepts/features.md +0 -91
  314. package/docs/concepts/fengming-sdk.md +0 -323
  315. package/docs/concepts/mantis-slack-desktop-runbook.md +0 -231
  316. package/docs/concepts/mantis.md +0 -744
  317. package/docs/concepts/markdown-formatting.md +0 -139
  318. package/docs/concepts/memory-builtin.md +0 -148
  319. package/docs/concepts/memory-honcho.md +0 -144
  320. package/docs/concepts/memory-qmd.md +0 -271
  321. package/docs/concepts/memory-search.md +0 -167
  322. package/docs/concepts/memory.md +0 -299
  323. package/docs/concepts/message-lifecycle-refactor.md +0 -1126
  324. package/docs/concepts/messages.md +0 -214
  325. package/docs/concepts/model-failover.md +0 -384
  326. package/docs/concepts/model-providers.md +0 -719
  327. package/docs/concepts/models.md +0 -371
  328. package/docs/concepts/multi-agent.md +0 -625
  329. package/docs/concepts/oauth.md +0 -198
  330. package/docs/concepts/parallel-specialist-lanes.md +0 -127
  331. package/docs/concepts/personal-agent-benchmark-pack.md +0 -74
  332. package/docs/concepts/presence.md +0 -117
  333. package/docs/concepts/progress-drafts.md +0 -406
  334. package/docs/concepts/qa-e2e-automation.md +0 -947
  335. package/docs/concepts/qa-matrix.md +0 -139
  336. package/docs/concepts/queue-steering.md +0 -90
  337. package/docs/concepts/queue.md +0 -136
  338. package/docs/concepts/retry.md +0 -86
  339. package/docs/concepts/session-pruning.md +0 -104
  340. package/docs/concepts/session-tool.md +0 -188
  341. package/docs/concepts/session.md +0 -164
  342. package/docs/concepts/soul.md +0 -116
  343. package/docs/concepts/streaming.md +0 -257
  344. package/docs/concepts/system-prompt.md +0 -328
  345. package/docs/concepts/timezone.md +0 -47
  346. package/docs/concepts/typebox.md +0 -309
  347. package/docs/concepts/typing-indicators.md +0 -88
  348. package/docs/concepts/usage-tracking.md +0 -66
  349. package/docs/date-time.md +0 -126
  350. package/docs/debug/node-issue.md +0 -90
  351. package/docs/diagnostics/flags.md +0 -182
  352. package/docs/docs.json +0 -1862
  353. package/docs/fengming-agent-runtime.md +0 -82
  354. package/docs/gateway/authentication.md +0 -256
  355. package/docs/gateway/background-process.md +0 -147
  356. package/docs/gateway/bonjour.md +0 -303
  357. package/docs/gateway/bridge-protocol.md +0 -97
  358. package/docs/gateway/cli-backends.md +0 -439
  359. package/docs/gateway/config-agents.md +0 -1525
  360. package/docs/gateway/config-channels.md +0 -945
  361. package/docs/gateway/config-tools.md +0 -774
  362. package/docs/gateway/configuration-examples.md +0 -704
  363. package/docs/gateway/configuration-reference.md +0 -1391
  364. package/docs/gateway/configuration.md +0 -739
  365. package/docs/gateway/diagnostics.md +0 -213
  366. package/docs/gateway/discovery.md +0 -154
  367. package/docs/gateway/doctor.md +0 -575
  368. package/docs/gateway/gateway-lock.md +0 -37
  369. package/docs/gateway/health.md +0 -73
  370. package/docs/gateway/heartbeat.md +0 -498
  371. package/docs/gateway/index.md +0 -383
  372. package/docs/gateway/local-model-services.md +0 -205
  373. package/docs/gateway/local-models.md +0 -355
  374. package/docs/gateway/logging.md +0 -149
  375. package/docs/gateway/multiple-gateways.md +0 -178
  376. package/docs/gateway/network-model.md +0 -15
  377. package/docs/gateway/openai-http-api.md +0 -378
  378. package/docs/gateway/openresponses-http-api.md +0 -347
  379. package/docs/gateway/openshell.md +0 -316
  380. package/docs/gateway/opentelemetry.md +0 -433
  381. package/docs/gateway/operator-scopes.md +0 -119
  382. package/docs/gateway/pairing.md +0 -207
  383. package/docs/gateway/prometheus.md +0 -249
  384. package/docs/gateway/protocol.md +0 -826
  385. package/docs/gateway/remote-gateway-readme.md +0 -169
  386. package/docs/gateway/remote.md +0 -280
  387. package/docs/gateway/sandbox-vs-tool-policy-vs-elevated.md +0 -148
  388. package/docs/gateway/sandboxing.md +0 -546
  389. package/docs/gateway/secrets-plan-contract.md +0 -159
  390. package/docs/gateway/secrets.md +0 -805
  391. package/docs/gateway/security/audit-checks.md +0 -127
  392. package/docs/gateway/security/exposure-runbook.md +0 -212
  393. package/docs/gateway/security/index.md +0 -1343
  394. package/docs/gateway/security/secure-file-operations.md +0 -76
  395. package/docs/gateway/security/shrinkwrap.md +0 -111
  396. package/docs/gateway/tailscale.md +0 -156
  397. package/docs/gateway/tools-invoke-http-api.md +0 -169
  398. package/docs/gateway/troubleshooting.md +0 -877
  399. package/docs/gateway/trusted-proxy-auth.md +0 -483
  400. package/docs/help/debugging.md +0 -341
  401. package/docs/help/environment.md +0 -233
  402. package/docs/help/faq-first-run.md +0 -870
  403. package/docs/help/faq-models.md +0 -556
  404. package/docs/help/faq.md +0 -2041
  405. package/docs/help/index.md +0 -39
  406. package/docs/help/scripts.md +0 -56
  407. package/docs/help/testing-live.md +0 -587
  408. package/docs/help/testing-updates-plugins.md +0 -299
  409. package/docs/help/testing.md +0 -977
  410. package/docs/help/troubleshooting.md +0 -449
  411. package/docs/index.md +0 -196
  412. package/docs/install/ansible.md +0 -233
  413. package/docs/install/azure.md +0 -315
  414. package/docs/install/bun.md +0 -59
  415. package/docs/install/clawdock.md +0 -112
  416. package/docs/install/development-channels.md +0 -148
  417. package/docs/install/digitalocean.md +0 -174
  418. package/docs/install/docker-vm-runtime.md +0 -154
  419. package/docs/install/docker.md +0 -564
  420. package/docs/install/exe-dev.md +0 -201
  421. package/docs/install/fly.md +0 -524
  422. package/docs/install/gcp.md +0 -418
  423. package/docs/install/hetzner.md +0 -285
  424. package/docs/install/hostinger.md +0 -98
  425. package/docs/install/index.md +0 -232
  426. package/docs/install/installer.md +0 -447
  427. package/docs/install/kubernetes.md +0 -196
  428. package/docs/install/macos-vm.md +0 -281
  429. package/docs/install/migrating-claude.md +0 -165
  430. package/docs/install/migrating-hermes.md +0 -178
  431. package/docs/install/migrating.md +0 -137
  432. package/docs/install/nix.md +0 -112
  433. package/docs/install/node.md +0 -142
  434. package/docs/install/northflank.mdx +0 -44
  435. package/docs/install/oracle.md +0 -218
  436. package/docs/install/podman.md +0 -216
  437. package/docs/install/railway.mdx +0 -92
  438. package/docs/install/raspberry-pi.md +0 -234
  439. package/docs/install/render.mdx +0 -167
  440. package/docs/install/uninstall.md +0 -131
  441. package/docs/install/updating.md +0 -284
  442. package/docs/install/upstash.md +0 -96
  443. package/docs/logging.md +0 -320
  444. package/docs/nav-tabs-underline.js +0 -100
  445. package/docs/network.md +0 -72
  446. package/docs/nodes/audio.md +0 -216
  447. package/docs/nodes/camera.md +0 -166
  448. package/docs/nodes/images.md +0 -77
  449. package/docs/nodes/index.md +0 -439
  450. package/docs/nodes/location-command.md +0 -102
  451. package/docs/nodes/media-understanding.md +0 -495
  452. package/docs/nodes/talk.md +0 -160
  453. package/docs/nodes/troubleshooting.md +0 -123
  454. package/docs/nodes/voicewake.md +0 -93
  455. package/docs/perplexity.md +0 -11
  456. package/docs/plan/codex-context-engine-harness.md +0 -624
  457. package/docs/plan/ui-channels.md +0 -284
  458. package/docs/platforms/digitalocean.md +0 -12
  459. package/docs/platforms/easyrunner.md +0 -109
  460. package/docs/platforms/index.md +0 -51
  461. package/docs/platforms/linux.md +0 -141
  462. package/docs/platforms/mac/bundled-gateway.md +0 -79
  463. package/docs/platforms/mac/canvas.md +0 -128
  464. package/docs/platforms/mac/child-process.md +0 -72
  465. package/docs/platforms/mac/dev-setup.md +0 -112
  466. package/docs/platforms/mac/health.md +0 -39
  467. package/docs/platforms/mac/icon.md +0 -36
  468. package/docs/platforms/mac/logging.md +0 -62
  469. package/docs/platforms/mac/menu-bar.md +0 -93
  470. package/docs/platforms/mac/peekaboo.md +0 -96
  471. package/docs/platforms/mac/permissions.md +0 -73
  472. package/docs/platforms/mac/remote.md +0 -123
  473. package/docs/platforms/mac/signing.md +0 -52
  474. package/docs/platforms/mac/skills.md +0 -43
  475. package/docs/platforms/mac/voice-overlay.md +0 -66
  476. package/docs/platforms/mac/voicewake.md +0 -73
  477. package/docs/platforms/mac/webchat.md +0 -54
  478. package/docs/platforms/mac/xpc.md +0 -66
  479. package/docs/platforms/oracle.md +0 -12
  480. package/docs/platforms/raspberry-pi.md +0 -13
  481. package/docs/platforms/windows.md +0 -286
  482. package/docs/plugins/adding-capabilities.md +0 -146
  483. package/docs/plugins/admin-http-rpc.md +0 -216
  484. package/docs/plugins/agent-tools.md +0 -13
  485. package/docs/plugins/architecture-internals.md +0 -1196
  486. package/docs/plugins/architecture.md +0 -483
  487. package/docs/plugins/building-extensions.md +0 -13
  488. package/docs/plugins/building-plugins.md +0 -335
  489. package/docs/plugins/bundles.md +0 -310
  490. package/docs/plugins/cli-backend-plugins.md +0 -310
  491. package/docs/plugins/codex-computer-use.md +0 -297
  492. package/docs/plugins/codex-harness-reference.md +0 -470
  493. package/docs/plugins/codex-harness-runtime.md +0 -268
  494. package/docs/plugins/codex-harness.md +0 -780
  495. package/docs/plugins/codex-native-plugins.md +0 -276
  496. package/docs/plugins/community.md +0 -77
  497. package/docs/plugins/compatibility.md +0 -167
  498. package/docs/plugins/copilot.md +0 -356
  499. package/docs/plugins/dependency-resolution.md +0 -176
  500. package/docs/plugins/google-meet.md +0 -1737
  501. package/docs/plugins/hooks.md +0 -484
  502. package/docs/plugins/install-overrides.md +0 -80
  503. package/docs/plugins/manage-plugins.md +0 -210
  504. package/docs/plugins/manifest.md +0 -1457
  505. package/docs/plugins/memory-lancedb.md +0 -385
  506. package/docs/plugins/memory-wiki.md +0 -529
  507. package/docs/plugins/message-presentation.md +0 -473
  508. package/docs/plugins/oc-path.md +0 -166
  509. package/docs/plugins/plugin-inventory.md +0 -189
  510. package/docs/plugins/plugin-permission-requests.md +0 -193
  511. package/docs/plugins/reference/acpx.md +0 -23
  512. package/docs/plugins/reference/admin-http-rpc.md +0 -23
  513. package/docs/plugins/reference/alibaba.md +0 -23
  514. package/docs/plugins/reference/amazon-bedrock-mantle.md +0 -23
  515. package/docs/plugins/reference/amazon-bedrock.md +0 -23
  516. package/docs/plugins/reference/anthropic-vertex.md +0 -19
  517. package/docs/plugins/reference/anthropic.md +0 -23
  518. package/docs/plugins/reference/arcee.md +0 -23
  519. package/docs/plugins/reference/azure-speech.md +0 -23
  520. package/docs/plugins/reference/bonjour.md +0 -19
  521. package/docs/plugins/reference/brave.md +0 -23
  522. package/docs/plugins/reference/browser.md +0 -23
  523. package/docs/plugins/reference/byteplus.md +0 -19
  524. package/docs/plugins/reference/canvas.md +0 -19
  525. package/docs/plugins/reference/cerebras.md +0 -23
  526. package/docs/plugins/reference/chutes.md +0 -23
  527. package/docs/plugins/reference/clickclack.md +0 -23
  528. package/docs/plugins/reference/cloudflare-ai-gateway.md +0 -23
  529. package/docs/plugins/reference/codex-supervisor.md +0 -27
  530. package/docs/plugins/reference/codex.md +0 -23
  531. package/docs/plugins/reference/comfy.md +0 -23
  532. package/docs/plugins/reference/copilot-proxy.md +0 -19
  533. package/docs/plugins/reference/copilot.md +0 -23
  534. package/docs/plugins/reference/deepgram.md +0 -23
  535. package/docs/plugins/reference/deepinfra.md +0 -23
  536. package/docs/plugins/reference/deepseek.md +0 -23
  537. package/docs/plugins/reference/diagnostics-otel.md +0 -19
  538. package/docs/plugins/reference/diagnostics-prometheus.md +0 -19
  539. package/docs/plugins/reference/diffs-language-pack.md +0 -19
  540. package/docs/plugins/reference/diffs.md +0 -19
  541. package/docs/plugins/reference/discord.md +0 -23
  542. package/docs/plugins/reference/document-extract.md +0 -23
  543. package/docs/plugins/reference/duckduckgo.md +0 -23
  544. package/docs/plugins/reference/elevenlabs.md +0 -23
  545. package/docs/plugins/reference/exa.md +0 -23
  546. package/docs/plugins/reference/fal.md +0 -23
  547. package/docs/plugins/reference/feishu.md +0 -23
  548. package/docs/plugins/reference/file-transfer.md +0 -19
  549. package/docs/plugins/reference/firecrawl.md +0 -23
  550. package/docs/plugins/reference/fireworks.md +0 -23
  551. package/docs/plugins/reference/github-copilot.md +0 -23
  552. package/docs/plugins/reference/gmi.md +0 -23
  553. package/docs/plugins/reference/google-meet.md +0 -23
  554. package/docs/plugins/reference/google.md +0 -23
  555. package/docs/plugins/reference/googlechat.md +0 -23
  556. package/docs/plugins/reference/gradium.md +0 -23
  557. package/docs/plugins/reference/groq.md +0 -23
  558. package/docs/plugins/reference/huggingface.md +0 -23
  559. package/docs/plugins/reference/imessage.md +0 -23
  560. package/docs/plugins/reference/inworld.md +0 -23
  561. package/docs/plugins/reference/irc.md +0 -23
  562. package/docs/plugins/reference/kilocode.md +0 -23
  563. package/docs/plugins/reference/kimi.md +0 -23
  564. package/docs/plugins/reference/line.md +0 -23
  565. package/docs/plugins/reference/litellm.md +0 -23
  566. package/docs/plugins/reference/llm-task.md +0 -19
  567. package/docs/plugins/reference/lmstudio.md +0 -23
  568. package/docs/plugins/reference/lobster.md +0 -19
  569. package/docs/plugins/reference/matrix.md +0 -23
  570. package/docs/plugins/reference/mattermost.md +0 -23
  571. package/docs/plugins/reference/memory-core.md +0 -19
  572. package/docs/plugins/reference/memory-lancedb.md +0 -23
  573. package/docs/plugins/reference/memory-wiki.md +0 -23
  574. package/docs/plugins/reference/microsoft-foundry.md +0 -19
  575. package/docs/plugins/reference/microsoft.md +0 -19
  576. package/docs/plugins/reference/migrate-claude.md +0 -19
  577. package/docs/plugins/reference/migrate-hermes.md +0 -19
  578. package/docs/plugins/reference/minimax.md +0 -23
  579. package/docs/plugins/reference/mistral.md +0 -23
  580. package/docs/plugins/reference/moonshot.md +0 -23
  581. package/docs/plugins/reference/msteams.md +0 -23
  582. package/docs/plugins/reference/nextcloud-talk.md +0 -23
  583. package/docs/plugins/reference/nostr.md +0 -23
  584. package/docs/plugins/reference/novita.md +0 -23
  585. package/docs/plugins/reference/nvidia.md +0 -23
  586. package/docs/plugins/reference/oc-path.md +0 -23
  587. package/docs/plugins/reference/ollama.md +0 -23
  588. package/docs/plugins/reference/open-prose.md +0 -19
  589. package/docs/plugins/reference/openai.md +0 -23
  590. package/docs/plugins/reference/opencode-go.md +0 -23
  591. package/docs/plugins/reference/opencode.md +0 -23
  592. package/docs/plugins/reference/openrouter.md +0 -23
  593. package/docs/plugins/reference/openshell.md +0 -19
  594. package/docs/plugins/reference/perplexity.md +0 -23
  595. package/docs/plugins/reference/pixverse.md +0 -23
  596. package/docs/plugins/reference/policy.md +0 -72
  597. package/docs/plugins/reference/qa-channel.md +0 -23
  598. package/docs/plugins/reference/qa-lab.md +0 -19
  599. package/docs/plugins/reference/qa-matrix.md +0 -19
  600. package/docs/plugins/reference/qianfan.md +0 -23
  601. package/docs/plugins/reference/qqbot.md +0 -23
  602. package/docs/plugins/reference/qwen.md +0 -23
  603. package/docs/plugins/reference/runway.md +0 -23
  604. package/docs/plugins/reference/searxng.md +0 -19
  605. package/docs/plugins/reference/senseaudio.md +0 -23
  606. package/docs/plugins/reference/sglang.md +0 -23
  607. package/docs/plugins/reference/signal.md +0 -23
  608. package/docs/plugins/reference/skill-workshop.md +0 -23
  609. package/docs/plugins/reference/slack.md +0 -23
  610. package/docs/plugins/reference/stepfun.md +0 -23
  611. package/docs/plugins/reference/synology-chat.md +0 -23
  612. package/docs/plugins/reference/synthetic.md +0 -23
  613. package/docs/plugins/reference/tavily.md +0 -23
  614. package/docs/plugins/reference/telegram.md +0 -23
  615. package/docs/plugins/reference/tencent.md +0 -23
  616. package/docs/plugins/reference/tlon.md +0 -23
  617. package/docs/plugins/reference/together.md +0 -23
  618. package/docs/plugins/reference/tokenjuice.md +0 -23
  619. package/docs/plugins/reference/tts-local-cli.md +0 -19
  620. package/docs/plugins/reference/twitch.md +0 -23
  621. package/docs/plugins/reference/venice.md +0 -23
  622. package/docs/plugins/reference/vercel-ai-gateway.md +0 -23
  623. package/docs/plugins/reference/vllm.md +0 -23
  624. package/docs/plugins/reference/voice-call.md +0 -23
  625. package/docs/plugins/reference/volcengine.md +0 -23
  626. package/docs/plugins/reference/voyage.md +0 -19
  627. package/docs/plugins/reference/vydra.md +0 -23
  628. package/docs/plugins/reference/web-readability.md +0 -19
  629. package/docs/plugins/reference/webhooks.md +0 -23
  630. package/docs/plugins/reference/whatsapp.md +0 -23
  631. package/docs/plugins/reference/workboard.md +0 -23
  632. package/docs/plugins/reference/xai.md +0 -23
  633. package/docs/plugins/reference/xiaomi.md +0 -23
  634. package/docs/plugins/reference/zai.md +0 -23
  635. package/docs/plugins/reference/zalo.md +0 -23
  636. package/docs/plugins/reference/zalouser.md +0 -24
  637. package/docs/plugins/reference.md +0 -145
  638. package/docs/plugins/sdk-agent-harness.md +0 -338
  639. package/docs/plugins/sdk-channel-inbound.md +0 -70
  640. package/docs/plugins/sdk-channel-ingress.md +0 -137
  641. package/docs/plugins/sdk-channel-message.md +0 -18
  642. package/docs/plugins/sdk-channel-outbound.md +0 -113
  643. package/docs/plugins/sdk-channel-plugins.md +0 -765
  644. package/docs/plugins/sdk-channel-turn.md +0 -9
  645. package/docs/plugins/sdk-entrypoints.md +0 -344
  646. package/docs/plugins/sdk-migration.md +0 -979
  647. package/docs/plugins/sdk-overview.md +0 -511
  648. package/docs/plugins/sdk-provider-plugins.md +0 -846
  649. package/docs/plugins/sdk-runtime.md +0 -676
  650. package/docs/plugins/sdk-setup.md +0 -550
  651. package/docs/plugins/sdk-subpaths.md +0 -391
  652. package/docs/plugins/sdk-testing.md +0 -403
  653. package/docs/plugins/skill-workshop.md +0 -713
  654. package/docs/plugins/tool-plugins.md +0 -411
  655. package/docs/plugins/voice-call.md +0 -942
  656. package/docs/plugins/webhooks.md +0 -192
  657. package/docs/plugins/workboard.md +0 -252
  658. package/docs/plugins/zalouser.md +0 -86
  659. package/docs/prose.md +0 -137
  660. package/docs/providers/alibaba.md +0 -158
  661. package/docs/providers/anthropic.md +0 -381
  662. package/docs/providers/arcee.md +0 -144
  663. package/docs/providers/azure-speech.md +0 -119
  664. package/docs/providers/bedrock-mantle.md +0 -211
  665. package/docs/providers/bedrock.md +0 -414
  666. package/docs/providers/cerebras.md +0 -130
  667. package/docs/providers/chutes.md +0 -153
  668. package/docs/providers/claude-max-api-proxy.md +0 -191
  669. package/docs/providers/cloudflare-ai-gateway.md +0 -119
  670. package/docs/providers/comfy.md +0 -362
  671. package/docs/providers/deepgram.md +0 -184
  672. package/docs/providers/deepinfra.md +0 -92
  673. package/docs/providers/deepseek.md +0 -146
  674. package/docs/providers/ds4.md +0 -309
  675. package/docs/providers/elevenlabs.md +0 -130
  676. package/docs/providers/fal.md +0 -240
  677. package/docs/providers/fireworks.md +0 -144
  678. package/docs/providers/github-copilot.md +0 -257
  679. package/docs/providers/gmi.md +0 -92
  680. package/docs/providers/google.md +0 -472
  681. package/docs/providers/gradium.md +0 -123
  682. package/docs/providers/groq.md +0 -171
  683. package/docs/providers/huggingface.md +0 -235
  684. package/docs/providers/index.md +0 -105
  685. package/docs/providers/inferrs.md +0 -272
  686. package/docs/providers/inworld.md +0 -120
  687. package/docs/providers/kilocode.md +0 -135
  688. package/docs/providers/litellm.md +0 -234
  689. package/docs/providers/lmstudio.md +0 -224
  690. package/docs/providers/minimax.md +0 -505
  691. package/docs/providers/mistral.md +0 -235
  692. package/docs/providers/models.md +0 -64
  693. package/docs/providers/moonshot.md +0 -413
  694. package/docs/providers/novita.md +0 -92
  695. package/docs/providers/nvidia.md +0 -158
  696. package/docs/providers/ollama-cloud.md +0 -115
  697. package/docs/providers/ollama.md +0 -1225
  698. package/docs/providers/openai.md +0 -1093
  699. package/docs/providers/opencode-go.md +0 -123
  700. package/docs/providers/opencode.md +0 -149
  701. package/docs/providers/openrouter.md +0 -349
  702. package/docs/providers/perplexity-provider.md +0 -123
  703. package/docs/providers/pixverse.md +0 -165
  704. package/docs/providers/qianfan.md +0 -132
  705. package/docs/providers/qwen-oauth.md +0 -115
  706. package/docs/providers/qwen.md +0 -364
  707. package/docs/providers/runway.md +0 -103
  708. package/docs/providers/senseaudio.md +0 -68
  709. package/docs/providers/sglang.md +0 -161
  710. package/docs/providers/stepfun.md +0 -229
  711. package/docs/providers/synthetic.md +0 -154
  712. package/docs/providers/tencent.md +0 -130
  713. package/docs/providers/together.md +0 -140
  714. package/docs/providers/venice.md +0 -312
  715. package/docs/providers/vercel-ai-gateway.md +0 -128
  716. package/docs/providers/vllm.md +0 -407
  717. package/docs/providers/volcengine.md +0 -199
  718. package/docs/providers/vydra.md +0 -180
  719. package/docs/providers/xai.md +0 -571
  720. package/docs/providers/xiaomi.md +0 -262
  721. package/docs/providers/zai.md +0 -224
  722. package/docs/refactor/access.md +0 -9
  723. package/docs/refactor/acp.md +0 -298
  724. package/docs/refactor/canvas.md +0 -131
  725. package/docs/refactor/database-first.md +0 -2256
  726. package/docs/refactor/ingress-core.md +0 -341
  727. package/docs/reference/AGENTS.default.md +0 -131
  728. package/docs/reference/RELEASING.md +0 -799
  729. package/docs/reference/api-usage-costs.md +0 -208
  730. package/docs/reference/application-modernization-plan.md +0 -208
  731. package/docs/reference/code-mode.md +0 -773
  732. package/docs/reference/credits.md +0 -33
  733. package/docs/reference/device-models.md +0 -50
  734. package/docs/reference/fengming-sdk-api-design.md +0 -390
  735. package/docs/reference/full-release-validation.md +0 -202
  736. package/docs/reference/memory-config.md +0 -604
  737. package/docs/reference/prompt-caching.md +0 -358
  738. package/docs/reference/release-performance-sweep.md +0 -360
  739. package/docs/reference/rich-output-protocol.md +0 -101
  740. package/docs/reference/rpc.md +0 -43
  741. package/docs/reference/secret-placeholder-conventions.md +0 -33
  742. package/docs/reference/secretref-credential-surface.md +0 -159
  743. package/docs/reference/secretref-user-supplied-credentials-matrix.json +0 -663
  744. package/docs/reference/session-management-compaction.md +0 -474
  745. package/docs/reference/templates/AGENTS.dev.md +0 -90
  746. package/docs/reference/templates/AGENTS.md +0 -227
  747. package/docs/reference/templates/BOOT.md +0 -16
  748. package/docs/reference/templates/BOOTSTRAP.md +0 -66
  749. package/docs/reference/templates/CLAUDE.md +0 -1
  750. package/docs/reference/templates/HEARTBEAT.md +0 -24
  751. package/docs/reference/templates/IDENTITY.dev.md +0 -52
  752. package/docs/reference/templates/IDENTITY.md +0 -34
  753. package/docs/reference/templates/SOUL.dev.md +0 -82
  754. package/docs/reference/templates/SOUL.md +0 -49
  755. package/docs/reference/templates/TOOLS.dev.md +0 -29
  756. package/docs/reference/templates/TOOLS.md +0 -51
  757. package/docs/reference/templates/USER.dev.md +0 -23
  758. package/docs/reference/templates/USER.md +0 -28
  759. package/docs/reference/test.md +0 -247
  760. package/docs/reference/token-use.md +0 -246
  761. package/docs/reference/transcript-hygiene.md +0 -214
  762. package/docs/reference/wizard.md +0 -252
  763. package/docs/security/CONTRIBUTING-THREAT-MODEL.md +0 -101
  764. package/docs/security/THREAT-MODEL-ATLAS.md +0 -611
  765. package/docs/security/formal-verification.md +0 -170
  766. package/docs/security/incident-response.md +0 -59
  767. package/docs/security/network-proxy.md +0 -268
  768. package/docs/snippets/plugin-publish/minimal-fengming.plugin.json +0 -12
  769. package/docs/snippets/plugin-publish/minimal-package.json +0 -16
  770. package/docs/specs/claw-supervisor.md +0 -247
  771. package/docs/start/bootstrapping.md +0 -49
  772. package/docs/start/docs-directory.md +0 -69
  773. package/docs/start/fengming.md +0 -252
  774. package/docs/start/getting-started.md +0 -152
  775. package/docs/start/hubs.md +0 -201
  776. package/docs/start/lore.md +0 -223
  777. package/docs/start/onboarding-overview.md +0 -72
  778. package/docs/start/onboarding.md +0 -98
  779. package/docs/start/quickstart.md +0 -25
  780. package/docs/start/setup.md +0 -178
  781. package/docs/start/showcase.md +0 -363
  782. package/docs/start/wizard-cli-automation.md +0 -232
  783. package/docs/start/wizard-cli-reference.md +0 -331
  784. package/docs/start/wizard.md +0 -141
  785. package/docs/style.css +0 -137
  786. package/docs/superpowers/specs/2026-04-22-tweakcn-custom-theme-import-design.md +0 -316
  787. package/docs/tools/acp-agents-setup.md +0 -351
  788. package/docs/tools/acp-agents.md +0 -854
  789. package/docs/tools/agent-send.md +0 -130
  790. package/docs/tools/apply-patch.md +0 -64
  791. package/docs/tools/brave-search.md +0 -139
  792. package/docs/tools/browser-control.md +0 -391
  793. package/docs/tools/browser-linux-troubleshooting.md +0 -173
  794. package/docs/tools/browser-login.md +0 -77
  795. package/docs/tools/browser-wsl2-windows-remote-cdp-troubleshooting.md +0 -219
  796. package/docs/tools/browser.md +0 -810
  797. package/docs/tools/btw.md +0 -159
  798. package/docs/tools/capability-cookbook.md +0 -12
  799. package/docs/tools/clawhub.md +0 -5
  800. package/docs/tools/code-execution.md +0 -173
  801. package/docs/tools/creating-skills.md +0 -158
  802. package/docs/tools/diffs.md +0 -525
  803. package/docs/tools/duckduckgo-search.md +0 -109
  804. package/docs/tools/elevated.md +0 -128
  805. package/docs/tools/exa-search.md +0 -152
  806. package/docs/tools/exec-approvals-advanced.md +0 -444
  807. package/docs/tools/exec-approvals.md +0 -494
  808. package/docs/tools/exec.md +0 -285
  809. package/docs/tools/firecrawl.md +0 -155
  810. package/docs/tools/gemini-search.md +0 -114
  811. package/docs/tools/goal.md +0 -217
  812. package/docs/tools/grok-search.md +0 -129
  813. package/docs/tools/image-generation.md +0 -493
  814. package/docs/tools/index.md +0 -178
  815. package/docs/tools/kimi-search.md +0 -105
  816. package/docs/tools/llm-task.md +0 -137
  817. package/docs/tools/lobster.md +0 -365
  818. package/docs/tools/loop-detection.md +0 -154
  819. package/docs/tools/media-overview.md +0 -160
  820. package/docs/tools/minimax-search.md +0 -102
  821. package/docs/tools/multi-agent-sandbox-tools.md +0 -409
  822. package/docs/tools/music-generation.md +0 -372
  823. package/docs/tools/ollama-search.md +0 -153
  824. package/docs/tools/pdf.md +0 -213
  825. package/docs/tools/perplexity-search.md +0 -220
  826. package/docs/tools/plugin.md +0 -363
  827. package/docs/tools/reactions.md +0 -100
  828. package/docs/tools/searxng-search.md +0 -141
  829. package/docs/tools/skills-config.md +0 -195
  830. package/docs/tools/skills.md +0 -569
  831. package/docs/tools/slash-commands.md +0 -487
  832. package/docs/tools/steer.md +0 -77
  833. package/docs/tools/subagents.md +0 -651
  834. package/docs/tools/tavily.md +0 -162
  835. package/docs/tools/thinking.md +0 -142
  836. package/docs/tools/tokenjuice.md +0 -84
  837. package/docs/tools/tool-search.md +0 -269
  838. package/docs/tools/trajectory.md +0 -229
  839. package/docs/tools/tts.md +0 -1009
  840. package/docs/tools/video-generation.md +0 -555
  841. package/docs/tools/web-fetch.md +0 -210
  842. package/docs/tools/web.md +0 -461
  843. package/docs/tts.md +0 -11
  844. package/docs/vps.md +0 -139
  845. package/docs/web/control-ui.md +0 -512
  846. package/docs/web/dashboard.md +0 -107
  847. package/docs/web/index.md +0 -133
  848. package/docs/web/tui.md +0 -250
  849. package/docs/web/webchat.md +0 -102
  850. package/npm-shrinkwrap.json +0 -12861
  851. package/patches/.gitkeep +0 -0
  852. package/patches/@agentclientprotocol__claude-agent-acp@0.37.0.patch +0 -41
  853. package/pnpm-workspace.yaml +0 -120
  854. package/scripts/crabbox-wrapper.mjs +0 -2004
  855. package/scripts/lib/official-external-channel-catalog.json +0 -560
  856. package/scripts/lib/official-external-plugin-catalog.json +0 -264
  857. package/scripts/lib/official-external-provider-catalog.json +0 -158
  858. package/scripts/lib/package-dist-imports.mjs +0 -171
  859. package/scripts/npm-runner.mjs +0 -91
  860. package/scripts/postinstall-bundled-plugins.mjs +0 -978
  861. package/scripts/preinstall-package-manager-warning.mjs +0 -64
  862. package/scripts/prepare-git-hooks.mjs +0 -72
  863. package/scripts/windows-cmd-helpers.mjs +0 -22
  864. package/skills/batch/SKILL.md +0 -118
  865. package/skills/code-review/SKILL.md +0 -107
  866. package/skills/debug/SKILL.md +0 -83
  867. package/skills/loop/SKILL.md +0 -118
  868. package/skills/run/SKILL.md +0 -79
  869. package/skills/run-skill-generator/SKILL.md +0 -179
  870. package/skills/verify/SKILL.md +0 -103
  871. package/src/agents/templates/HEARTBEAT.md +0 -3
@@ -1,1126 +0,0 @@
1
- ---
2
- summary: "Design plan for the unified durable message receive, send, preview, edit, and streaming lifecycle"
3
- read_when:
4
- - Refactoring channel send or receive behavior
5
- - Changing channel inbound, reply dispatch, outbound queue, preview streaming, or plugin SDK message APIs
6
- - Designing a new channel plugin that needs durable sends, receipts, previews, edits, or retries
7
- title: "Message lifecycle refactor"
8
- ---
9
-
10
- This page is the target design for replacing scattered channel inbound, reply
11
- dispatch, preview streaming, and outbound delivery helpers with one durable
12
- message lifecycle.
13
-
14
- The short version:
15
-
16
- - The core primitives should be **receive** and **send**, not **reply**.
17
- - A reply is only a relation on an outbound message.
18
- - A turn is an inbound-processing convenience, not the owner of delivery.
19
- - Sending must be context based: `begin`, render, preview or stream, final send,
20
- commit, fail.
21
- - Receiving must be context based too: normalize, dedupe, route, record,
22
- dispatch, platform ack, fail.
23
- - The public plugin SDK should collapse to one small channel-outbound surface.
24
-
25
- ## Problems
26
-
27
- The current channel stack grew from several valid local needs:
28
-
29
- - Simple inbound adapters use `runtime.channel.inbound.run`.
30
- - Rich adapters use `runtime.channel.inbound.runPreparedReply`.
31
- - Legacy helpers use `dispatchInboundReplyWithBase`,
32
- `recordInboundSessionAndDispatchReply`, reply payload helpers, reply chunking,
33
- reply references, and outbound runtime helpers.
34
- - Preview streaming lives in channel-specific dispatchers.
35
- - Final delivery durability is being added around existing reply payload paths.
36
-
37
- That shape fixes local bugs, but it leaves FengMing with too many public
38
- concepts and too many places where delivery semantics can drift.
39
-
40
- The reliability issue that exposed this is:
41
-
42
- ```text
43
- Telegram polling update acked
44
- -> assistant final text exists
45
- -> process restarts before sendMessage succeeds
46
- -> final response is lost
47
- ```
48
-
49
- The target invariant is broader than Telegram: once core decides a visible
50
- outbound message should exist, the intent must be durable before the platform
51
- send is attempted, and the platform receipt must be committed after success.
52
- That gives FengMing at-least-once recovery. Exactly-once behavior exists only
53
- for adapters that can prove native idempotency or reconcile an
54
- unknown-after-send attempt against platform state before replay.
55
-
56
- That is the end state for this refactor, not a description of every current
57
- path. During migration, existing outbound helpers can still fall through to a
58
- direct send when best-effort queue writes fail. The refactor is complete only
59
- when durable final sends fail closed or explicitly opt out with a documented
60
- non-durable policy.
61
-
62
- ## Goals
63
-
64
- - One core lifecycle for all channel message receive and send paths.
65
- - Durable final sends by default in the new message lifecycle after an adapter
66
- declares replay-safe behavior.
67
- - Shared preview, edit, stream, finalization, retry, recovery, and receipt
68
- semantics.
69
- - A small plugin SDK surface that third-party plugins can learn and maintain.
70
- - Compatibility for existing inbound reply compatibility callers during migration.
71
- - Clear extension points for new channel capabilities.
72
- - No platform-specific branches in core.
73
- - No token-delta channel messages. Channel streaming remains message preview,
74
- edit, append, or completed block delivery.
75
- - Structured FengMing-origin metadata for operational/system output so visible
76
- gateway failures do not re-enter shared bot-enabled rooms as fresh prompts.
77
-
78
- ## Non goals
79
-
80
- - Do not force every existing channel onto durable message delivery in the first phase.
81
- - Do not force every channel into the same native transport behavior.
82
- - Do not teach core Telegram topics, Slack native streams, Matrix redactions,
83
- Feishu cards, QQ voice, or Teams activities.
84
- - Do not publish all internal migration helpers as stable SDK API.
85
- - Do not make retries replay completed non-idempotent platform operations.
86
-
87
- ## Reference model
88
-
89
- Vercel Chat has a good public mental model:
90
-
91
- - `Chat`
92
- - `Thread`
93
- - `Channel`
94
- - `Message`
95
- - adapter methods such as `postMessage`, `editMessage`, `deleteMessage`,
96
- `stream`, `startTyping`, and history fetches
97
- - a state adapter for dedupe, locks, queues, and persistence
98
-
99
- FengMing should borrow the vocabulary, not copy the surface.
100
-
101
- What FengMing needs beyond that model:
102
-
103
- - Durable outbound send intents before direct transport calls.
104
- - Explicit send contexts with begin, commit, and fail.
105
- - Receive contexts that know platform ack policy.
106
- - Receipts that survive restart and can drive edits, deletes, recovery, and
107
- duplicate suppression.
108
- - A smaller public SDK. Bundled plugins can use internal runtime helpers, but
109
- third-party plugins should see one coherent message API.
110
- - Agent-specific behavior: sessions, transcripts, block streaming, tool
111
- progress, approvals, media directives, silent replies, and group mention
112
- history.
113
-
114
- `thread.post()` style promises are not enough for FengMing. They hide the
115
- transaction boundary that decides whether a send is recoverable.
116
-
117
- ## Core model
118
-
119
- The new domain should live under an internal core namespace such as
120
- `src/channels/message/*`.
121
-
122
- It has four concepts:
123
-
124
- ```typescript
125
- core.messages.receive(...)
126
- core.messages.send(...)
127
- core.messages.live(...)
128
- core.messages.state(...)
129
- ```
130
-
131
- `receive` owns inbound lifecycle.
132
-
133
- `send` owns outbound lifecycle.
134
-
135
- `live` owns preview, edit, progress, and stream state.
136
-
137
- `state` owns durable intent storage, receipts, idempotency, recovery, locks, and
138
- dedupe.
139
-
140
- ## Message terms
141
-
142
- ### Message
143
-
144
- A normalized message is platform-neutral:
145
-
146
- ```typescript
147
- type ChannelMessage = {
148
- id: string;
149
- channel: string;
150
- accountId?: string;
151
- direction: "inbound" | "outbound";
152
- target: MessageTarget;
153
- sender?: MessageActor;
154
- body?: MessageBody;
155
- attachments?: MessageAttachment[];
156
- relation?: MessageRelation;
157
- origin?: MessageOrigin;
158
- timestamp?: number;
159
- raw?: unknown;
160
- };
161
- ```
162
-
163
- ### Target
164
-
165
- The target describes where the message lives:
166
-
167
- ```typescript
168
- type MessageTarget = {
169
- kind: "direct" | "group" | "channel" | "thread";
170
- id: string;
171
- label?: string;
172
- spaceId?: string;
173
- parentId?: string;
174
- threadId?: string;
175
- nativeChannelId?: string;
176
- };
177
- ```
178
-
179
- ### Relation
180
-
181
- Reply is a relation, not an API root:
182
-
183
- ```typescript
184
- type MessageRelation =
185
- | {
186
- kind: "reply";
187
- inboundMessageId?: string;
188
- replyToId?: string;
189
- threadId?: string;
190
- quote?: MessageQuote;
191
- }
192
- | {
193
- kind: "followup";
194
- sessionKey?: string;
195
- previousMessageId?: string;
196
- }
197
- | {
198
- kind: "broadcast";
199
- reason?: string;
200
- }
201
- | {
202
- kind: "system";
203
- reason:
204
- | "approval"
205
- | "task"
206
- | "hook"
207
- | "cron"
208
- | "subagent"
209
- | "message_tool"
210
- | "cli"
211
- | "control_ui"
212
- | "automation"
213
- | "error";
214
- };
215
- ```
216
-
217
- This lets the same send path handle normal replies, cron notifications, approval
218
- prompts, task completions, message-tool sends, CLI or Control UI sends, subagent
219
- results, and automation sends.
220
-
221
- ### Origin
222
-
223
- Origin describes who produced a message and how FengMing should treat echoes of
224
- that message. It is separate from relation: a message can be a reply to a user
225
- and still be FengMing-originated operational output.
226
-
227
- ```typescript
228
- type MessageOrigin =
229
- | {
230
- source: "fengming";
231
- schemaVersion: 1;
232
- kind: "gateway_failure";
233
- code: "agent_failed_before_reply" | "missing_api_key" | "model_login_expired";
234
- echoPolicy: "drop_bot_room_echo";
235
- }
236
- | {
237
- source: "user" | "external_bot" | "platform" | "unknown";
238
- };
239
- ```
240
-
241
- Core owns the meaning of FengMing-originated output. Channels own how that
242
- origin is encoded into their transport.
243
-
244
- The first required use is gateway failure output. Humans should still see
245
- messages such as "Agent failed before reply" or "Missing API key", but tagged
246
- FengMing operational output must not be accepted as bot-authored input in shared
247
- rooms when `allowBots` is enabled.
248
-
249
- ### Receipt
250
-
251
- Receipts are first-class:
252
-
253
- ```typescript
254
- type MessageReceipt = {
255
- primaryPlatformMessageId?: string;
256
- platformMessageIds: string[];
257
- parts: MessageReceiptPart[];
258
- threadId?: string;
259
- replyToId?: string;
260
- editToken?: string;
261
- deleteToken?: string;
262
- url?: string;
263
- sentAt: number;
264
- raw?: unknown;
265
- };
266
-
267
- type MessageReceiptPart = {
268
- platformMessageId: string;
269
- kind: "text" | "media" | "voice" | "card" | "preview" | "unknown";
270
- index: number;
271
- threadId?: string;
272
- replyToId?: string;
273
- editToken?: string;
274
- deleteToken?: string;
275
- url?: string;
276
- raw?: unknown;
277
- };
278
- ```
279
-
280
- Receipts are the bridge from durable intent to future edit, delete, preview
281
- finalization, duplicate suppression, and recovery.
282
-
283
- A receipt can describe one platform message or a multi-part delivery. Chunked
284
- text, media plus text, voice plus text, and card fallbacks must preserve all
285
- platform ids while still exposing a primary id for threading and later edits.
286
-
287
- ## Receive context
288
-
289
- Receiving should not be a bare helper call. The core needs a context that knows
290
- dedupe, routing, session recording, and platform ack policy.
291
-
292
- ```typescript
293
- type MessageReceiveContext = {
294
- id: string;
295
- channel: string;
296
- accountId?: string;
297
- input: ChannelMessage;
298
- ack: ReceiveAckController;
299
- route: MessageRouteController;
300
- session: MessageSessionController;
301
- log: MessageLifecycleLogger;
302
-
303
- dedupe(): Promise<ReceiveDedupeResult>;
304
- resolve(): Promise<ResolvedInboundMessage>;
305
- record(resolved: ResolvedInboundMessage): Promise<RecordResult>;
306
- dispatch(recorded: RecordResult): Promise<DispatchResult>;
307
- commit(result: DispatchResult): Promise<void>;
308
- fail(error: unknown): Promise<void>;
309
- };
310
- ```
311
-
312
- Receive flow:
313
-
314
- ```text
315
- platform event
316
- -> begin receive context
317
- -> normalize
318
- -> classify
319
- -> dedupe and self-echo gate
320
- -> route and authorize
321
- -> record inbound session metadata
322
- -> dispatch agent run
323
- -> durable outbound sends happen through send context
324
- -> commit receive
325
- -> ack platform when policy allows
326
- ```
327
-
328
- Ack is not one thing. The receive contract must keep these signals separate:
329
-
330
- - **Transport ack:** tells the platform webhook or socket that FengMing accepted
331
- the event envelope. Some platforms require this before dispatch.
332
- - **Polling offset ack:** advances a cursor so the same event is not fetched
333
- again. This must not advance past work that cannot be recovered.
334
- - **Inbound record ack:** confirms FengMing persisted enough inbound metadata to
335
- dedupe and route a redelivery.
336
- - **User-visible receipt:** optional read/status/typing behavior; never a
337
- durability boundary.
338
-
339
- `ReceiveAckPolicy` controls transport or polling acknowledgement only. It must
340
- not be reused for read receipts or status reactions.
341
-
342
- Before bot authorization, receive must apply the shared FengMing echo policy
343
- when the channel can decode message origin metadata:
344
-
345
- ```typescript
346
- function shouldDropFengMingEcho(params: {
347
- origin?: MessageOrigin;
348
- isBotAuthor: boolean;
349
- isRoomish: boolean;
350
- }): boolean {
351
- return (
352
- params.isBotAuthor &&
353
- params.isRoomish &&
354
- params.origin?.source === "fengming" &&
355
- params.origin.kind === "gateway_failure" &&
356
- params.origin.echoPolicy === "drop_bot_room_echo"
357
- );
358
- }
359
- ```
360
-
361
- This drop is tag-based, not text-based. A bot-authored room message with the
362
- same visible gateway-failure text but without FengMing origin metadata still
363
- goes through normal `allowBots` authorization.
364
-
365
- Ack policy is explicit:
366
-
367
- ```typescript
368
- type ReceiveAckPolicy =
369
- | { kind: "immediate"; reason: "webhook-timeout" | "platform-contract" }
370
- | { kind: "after-record" }
371
- | { kind: "after-durable-send" }
372
- | { kind: "manual" };
373
- ```
374
-
375
- Telegram polling now uses the receive-context ack policy for its persisted
376
- restart watermark. The tracker still observes grammY updates as they enter the
377
- middleware chain, but FengMing persists only the safe completed update id after
378
- successful dispatch, leaving failed or lower pending updates replayable after a
379
- restart. Telegram's upstream `getUpdates` fetch offset is still controlled by
380
- the polling library, so the remaining deeper cut is a fully durable polling
381
- source if we need platform-level redelivery beyond FengMing's restart
382
- watermark. Webhook platforms may need immediate HTTP ack, but they still need
383
- inbound dedupe and durable outbound send intents because webhooks can redeliver.
384
-
385
- ## Send context
386
-
387
- Sending is also context based:
388
-
389
- ```typescript
390
- type MessageSendContext = {
391
- id: string;
392
- channel: string;
393
- accountId?: string;
394
- message: ChannelMessage;
395
- intent: DurableSendIntent;
396
- attempt: number;
397
- signal: AbortSignal;
398
- previousReceipt?: MessageReceipt;
399
- preview?: LiveMessageState;
400
- log: MessageLifecycleLogger;
401
-
402
- render(): Promise<RenderedMessageBatch>;
403
- previewUpdate(rendered: RenderedMessageBatch): Promise<LiveMessageState>;
404
- send(rendered: RenderedMessageBatch): Promise<MessageReceipt>;
405
- edit(receipt: MessageReceipt, rendered: RenderedMessageBatch): Promise<MessageReceipt>;
406
- delete(receipt: MessageReceipt): Promise<void>;
407
- commit(receipt: MessageReceipt): Promise<void>;
408
- fail(error: unknown): Promise<void>;
409
- };
410
- ```
411
-
412
- Preferred orchestration:
413
-
414
- ```typescript
415
- await core.messages.withSendContext(message, async (ctx) => {
416
- const rendered = await ctx.render();
417
-
418
- if (ctx.preview?.canFinalizeInPlace) {
419
- return await ctx.edit(ctx.preview.receipt, rendered);
420
- }
421
-
422
- return await ctx.send(rendered);
423
- });
424
- ```
425
-
426
- The helper expands to:
427
-
428
- ```text
429
- begin durable intent
430
- -> render
431
- -> optional preview/edit/stream work
432
- -> mark sending
433
- -> final platform send or final edit
434
- -> mark committing with raw receipt
435
- -> commit receipt
436
- -> ack durable intent
437
- -> fail durable intent on classified failure
438
- ```
439
-
440
- The intent must exist before transport I/O. A restart after begin but before
441
- commit is recoverable.
442
-
443
- The dangerous boundary is after platform success and before receipt commit. If a
444
- process dies there, FengMing cannot know whether the platform message exists
445
- unless the adapter provides native idempotency or a receipt reconciliation path.
446
- Those attempts must resume in `unknown_after_send`, not blindly replay. Channels
447
- without reconciliation may choose at-least-once replay only if duplicate visible
448
- messages are an acceptable, documented tradeoff for that channel and relation.
449
- The current SDK reconciliation bridge requires the adapter to declare
450
- `reconcileUnknownSend`, then asks `durableFinal.reconcileUnknownSend` to
451
- classify an unknown entry as `sent`, `not_sent`, or `unresolved`; only `not_sent`
452
- permits replay, and unresolved entries stay terminal or retry only the
453
- reconciliation check.
454
-
455
- Durability policy must be explicit:
456
-
457
- ```typescript
458
- type MessageDurabilityPolicy = "required" | "best_effort" | "disabled";
459
- ```
460
-
461
- `required` means core must fail closed when it cannot write the durable intent.
462
- `best_effort` can fall through when persistence is unavailable. `disabled` keeps
463
- the old direct send behavior. During migration, legacy wrappers and public
464
- compatibility helpers default to `disabled`; they must not infer `required` from
465
- the fact that a channel has a generic outbound adapter.
466
-
467
- Send contexts also own channel-local post-send effects. A migration is not safe
468
- if durable delivery bypasses local behavior that was previously attached to the
469
- channel's direct send path. Examples include self-echo suppression caches,
470
- thread participation markers, native edit anchors, model-signature rendering,
471
- and platform-specific duplicate guards. Those effects must either move into the
472
- send adapter, the render adapter, or a named send-context hook before that
473
- channel can enable durable generic final delivery.
474
-
475
- Send helpers must return receipts all the way back to their caller. Durable
476
- wrappers cannot swallow message ids or replace a channel delivery result with
477
- `undefined`; buffered dispatchers use those ids for thread anchors, later edits,
478
- preview finalization, and duplicate suppression.
479
-
480
- Fallback sends operate on batches, not single payloads. Silent-reply rewrites,
481
- media fallback, card fallback, and chunk projection can all produce more than
482
- one deliverable message, so a send context must either deliver the whole
483
- projected batch or explicitly document why only one payload is valid.
484
-
485
- ```typescript
486
- type RenderedMessageBatch = {
487
- units: RenderedMessageUnit[];
488
- atomicity: "all_or_retry_remaining" | "best_effort_parts";
489
- idempotencyKey: string;
490
- };
491
-
492
- type RenderedMessageUnit = {
493
- index: number;
494
- kind: "text" | "media" | "voice" | "card" | "preview" | "unknown";
495
- payload: unknown;
496
- required: boolean;
497
- };
498
- ```
499
-
500
- When such a fallback is durable, the whole projected batch must be represented by
501
- one durable send intent or another atomic batch plan. Recording each payload
502
- one-by-one is not enough: a crash between payloads can leave a partial visible
503
- fallback with no durable record for the remaining payloads. Recovery must know
504
- which units already have receipts and either replay only missing units or mark
505
- the batch `unknown_after_send` until the adapter reconciles it.
506
-
507
- ## Live context
508
-
509
- Preview, edit, progress, and stream behavior should be one opt-in lifecycle.
510
-
511
- ```typescript
512
- type MessageLiveAdapter = {
513
- begin?(ctx: MessageSendContext): Promise<LiveMessageState>;
514
- update?(
515
- ctx: MessageSendContext,
516
- state: LiveMessageState,
517
- update: LiveMessageUpdate,
518
- ): Promise<LiveMessageState>;
519
- finalize?(
520
- ctx: MessageSendContext,
521
- state: LiveMessageState,
522
- final: RenderedMessageBatch,
523
- ): Promise<MessageReceipt>;
524
- cancel?(
525
- ctx: MessageSendContext,
526
- state: LiveMessageState,
527
- reason: LiveCancelReason,
528
- ): Promise<void>;
529
- };
530
- ```
531
-
532
- Live state is durable enough to recover or suppress duplicates:
533
-
534
- ```typescript
535
- type LiveMessageState = {
536
- mode: "partial" | "block" | "progress" | "native";
537
- receipt?: MessageReceipt;
538
- visibleSince?: number;
539
- canFinalizeInPlace: boolean;
540
- lastRenderedHash?: string;
541
- staleAfterMs?: number;
542
- };
543
- ```
544
-
545
- This should cover current behavior:
546
-
547
- - Telegram send plus edit preview, with fresh final after stale preview age.
548
- - Discord send plus edit preview, cancel on media/error/explicit reply.
549
- - Slack native stream or draft preview depending on thread shape.
550
- - Mattermost draft post finalization.
551
- - Matrix draft event finalization or redaction on mismatch.
552
- - Teams native progress stream.
553
- - QQ Bot stream or accumulated fallback.
554
-
555
- ## Adapter surface
556
-
557
- The public SDK target should be one subpath:
558
-
559
- ```typescript
560
- import { defineChannelMessageAdapter } from "fengming/plugin-sdk/channel-outbound";
561
- ```
562
-
563
- Target shape:
564
-
565
- ```typescript
566
- type ChannelMessageAdapter = {
567
- receive?: MessageReceiveAdapter;
568
- send: MessageSendAdapter;
569
- live?: MessageLiveAdapter;
570
- origin?: MessageOriginAdapter;
571
- render?: MessageRenderAdapter;
572
- capabilities: MessageCapabilities;
573
- };
574
- ```
575
-
576
- Send adapter:
577
-
578
- ```typescript
579
- type MessageSendAdapter = {
580
- send(ctx: MessageSendContext, rendered: RenderedMessageBatch): Promise<MessageReceipt>;
581
- edit?(
582
- ctx: MessageSendContext,
583
- receipt: MessageReceipt,
584
- rendered: RenderedMessageBatch,
585
- ): Promise<MessageReceipt>;
586
- delete?(ctx: MessageSendContext, receipt: MessageReceipt): Promise<void>;
587
- classifyError?(ctx: MessageSendContext, error: unknown): DeliveryFailureKind;
588
- reconcileUnknownSend?(ctx: MessageSendContext): Promise<MessageReceipt | null>;
589
- afterSendSuccess?(ctx: MessageSendContext, receipt: MessageReceipt): Promise<void>;
590
- afterCommit?(ctx: MessageSendContext, receipt: MessageReceipt): Promise<void>;
591
- };
592
- ```
593
-
594
- Receive adapter:
595
-
596
- ```typescript
597
- type MessageReceiveAdapter<TRaw = unknown> = {
598
- normalize(raw: TRaw, ctx: MessageNormalizeContext): Promise<ChannelMessage>;
599
- classify?(message: ChannelMessage): Promise<MessageEventClass>;
600
- preflight?(message: ChannelMessage, event: MessageEventClass): Promise<MessagePreflightResult>;
601
- ackPolicy?(message: ChannelMessage, event: MessageEventClass): ReceiveAckPolicy;
602
- };
603
- ```
604
-
605
- Before preflight authorization, core must run the shared FengMing echo predicate
606
- whenever `origin.decode` returns FengMing-origin metadata. The receive adapter
607
- supplies platform facts such as bot author and room shape; core owns the drop
608
- decision and ordering so channels do not reimplement text filters.
609
-
610
- Origin adapter:
611
-
612
- ```typescript
613
- type MessageOriginAdapter<TRaw = unknown, TNative = unknown> = {
614
- encode?(origin: MessageOrigin): TNative | undefined;
615
- decode?(raw: TRaw): MessageOrigin | undefined;
616
- };
617
- ```
618
-
619
- Core sets `MessageOrigin`. Channels only translate it to and from native
620
- transport metadata. Slack maps this to `chat.postMessage({ metadata })` and
621
- inbound `message.metadata`; Matrix can map it to extra event content; channels
622
- without native metadata can use a receipt/outbound registry when that is the
623
- best available approximation.
624
-
625
- Capabilities:
626
-
627
- ```typescript
628
- type MessageCapabilities = {
629
- text: { maxLength?: number; chunking?: boolean };
630
- attachments?: {
631
- upload: boolean;
632
- remoteUrl: boolean;
633
- voice?: boolean;
634
- };
635
- threads?: {
636
- reply: boolean;
637
- topic?: boolean;
638
- nativeThread?: boolean;
639
- };
640
- live?: {
641
- edit: boolean;
642
- delete: boolean;
643
- nativeStream?: boolean;
644
- progress?: boolean;
645
- };
646
- delivery?: {
647
- idempotencyKey?: boolean;
648
- retryAfter?: boolean;
649
- receiptRequired?: boolean;
650
- };
651
- };
652
- ```
653
-
654
- ## Public SDK reduction
655
-
656
- The new public surface should absorb or deprecate these conceptual areas:
657
-
658
- - `reply-runtime`
659
- - `reply-dispatch-runtime`
660
- - `reply-reference`
661
- - `reply-chunking`
662
- - `reply-payload`
663
- - `inbound-reply-dispatch`
664
- - `channel-reply-pipeline`
665
- - most public uses of `outbound-runtime`
666
- - ad hoc draft stream lifecycle helpers
667
-
668
- Compatibility subpaths can remain as wrappers, but new third-party plugins
669
- should not need them.
670
-
671
- Bundled plugins may keep internal helper imports through reserved runtime
672
- subpaths while migrating. Public docs should steer plugin authors to
673
- `plugin-sdk/channel-outbound` once it exists.
674
-
675
- ## Relationship to channel inbound
676
-
677
- `runtime.channel.inbound.*` is the runtime bridge during migration.
678
-
679
- It should become a compatibility adapter:
680
-
681
- ```text
682
- channel.inbound.run
683
- -> messages.receive context
684
- -> session dispatch
685
- -> messages.send context for visible output
686
- ```
687
-
688
- `channel.inbound.runPreparedReply` should also remain initially:
689
-
690
- ```text
691
- channel-owned dispatcher
692
- -> messages.receive record/finalize bridge
693
- -> messages.live for preview/progress
694
- -> messages.send for final delivery
695
- ```
696
-
697
- The old `channel.turn` runtime surface was removed. Runtime callers use
698
- `channel.inbound.*`; channel docs and SDK subpaths use inbound/message nouns.
699
-
700
- ## Compatibility guardrails
701
-
702
- During migration, generic durable delivery is opt-in for any channel whose
703
- existing delivery callback has side effects beyond "send this payload".
704
-
705
- Legacy entry points are non-durable by default:
706
-
707
- - `channel.inbound.run` and `dispatchChannelInboundReply` use the channel's
708
- delivery callback unless that channel explicitly supplies an audited durable
709
- policy/options object.
710
- - `channel.inbound.runPreparedReply` stays channel-owned until the prepared dispatcher
711
- explicitly calls the send context.
712
- - Public compatibility helpers such as `recordInboundSessionAndDispatchReply`,
713
- `dispatchInboundReplyWithBase`, and direct-DM helpers never inject generic
714
- durable delivery before the caller-provided `deliver` or `reply` callback.
715
-
716
- For migration bridge types, `durable: undefined` means "not durable". The
717
- durable path is enabled only by an explicit policy/options value. `durable:
718
- false` can remain as a compatibility spelling, but implementation should not
719
- require every unmigrated channel to add it.
720
-
721
- Current bridge code must keep the durability decision explicit:
722
-
723
- - Durable final delivery returns a discriminated status. `handled_visible` and
724
- `handled_no_send` are terminal; `unsupported` and `not_applicable` may fall
725
- back to channel-owned delivery; `failed` propagates the send failure.
726
- - Generic durable final delivery is gated by adapter capabilities such as
727
- silent delivery, reply target preservation, native quote preservation, and
728
- message-sending hooks. Missing parity should choose channel-owned delivery,
729
- not a generic send that changes user-visible behavior.
730
- - Queue-backed durable sends expose a delivery intent reference. Existing
731
- `pendingFinalDelivery*` session fields can carry the intent id during the
732
- transition; the end state is a `MessageSendIntent` store instead of frozen
733
- reply text plus ad hoc context fields.
734
-
735
- Do not enable the generic durable path for a channel until all of these are
736
- true:
737
-
738
- - The generic send adapter executes the same rendering and transport behavior as
739
- the old direct path.
740
- - Local post-send side effects are preserved through the send context.
741
- - The adapter returns receipts or delivery results with all platform message
742
- ids.
743
- - Prepared dispatcher paths either call the new send context or stay documented
744
- as outside the durable guarantee.
745
- - Fallback delivery handles every projected payload, not only the first one.
746
- - Durable fallback delivery records the whole projected payload array as one
747
- replayable intent or batch plan.
748
-
749
- Concrete migration hazards to preserve:
750
-
751
- - iMessage monitor delivery records sent messages in an echo cache after a
752
- successful send. Durable final sends must still populate that cache, otherwise
753
- FengMing can re-ingest its own final replies as inbound user messages.
754
- - Tlon appends an optional model signature and records participated threads
755
- after group replies. Generic durable delivery must not bypass those effects;
756
- either move them into Tlon render/send/finalize adapters or keep Tlon on the
757
- channel-owned path.
758
- - Discord and other prepared dispatchers already own direct delivery and preview
759
- behavior. They are not covered by an assembled-turn durable guarantee until
760
- their prepared dispatchers explicitly route finals through the send context.
761
- - Telegram silent fallback delivery must deliver the full projected payload
762
- array. A single-payload shortcut can drop additional fallback payloads after
763
- projection.
764
- - LINE, Zalo, Nostr, and other existing assembled/helper paths may
765
- have reply-token handling, media proxying, sent-message caches, loading/status
766
- cleanup, or callback-only targets. They stay on channel-owned delivery until
767
- those semantics are represented by the send adapter and verified by tests.
768
- - Direct-DM helpers can have a reply callback that is the only correct transport
769
- target. Generic outbound must not guess from `OriginatingTo` or `To` and skip
770
- that callback.
771
- - FengMing gateway failure output must stay visible to humans, but tagged
772
- bot-authored room echoes must be dropped before `allowBots` authorization.
773
- Channels must not implement this with visible-text prefix filters except as a
774
- short emergency stopgap; the durable contract is structured origin metadata.
775
-
776
- ## Internal storage
777
-
778
- The durable queue should store message send intents, not reply payloads.
779
-
780
- ```typescript
781
- type DurableSendIntent = {
782
- id: string;
783
- idempotencyKey: string;
784
- channel: string;
785
- accountId?: string;
786
- message: ChannelMessage;
787
- batch?: RenderedMessageBatch;
788
- liveState?: LiveMessageState;
789
- status:
790
- | "pending"
791
- | "sending"
792
- | "committing"
793
- | "unknown_after_send"
794
- | "sent"
795
- | "failed"
796
- | "cancelled";
797
- attempt: number;
798
- nextAttemptAt?: number;
799
- receipt?: MessageReceipt;
800
- partialReceipt?: MessageReceipt;
801
- failure?: DeliveryFailure;
802
- createdAt: number;
803
- updatedAt: number;
804
- };
805
- ```
806
-
807
- Recovery loop:
808
-
809
- ```text
810
- load pending or sending intents
811
- -> acquire idempotency lock
812
- -> skip if receipt already committed
813
- -> reconstruct send context
814
- -> render if needed
815
- -> reconcile unknown_after_send if needed
816
- -> call adapter send/edit/finalize
817
- -> commit receipt, mark unknown_after_send, or schedule retry
818
- ```
819
-
820
- The queue should keep enough identity to replay through the same account,
821
- thread, target, formatting policy, and media rules after restart.
822
-
823
- ## Failure classes
824
-
825
- Channel adapters classify transport failures into closed categories:
826
-
827
- ```typescript
828
- type DeliveryFailureKind =
829
- | "transient"
830
- | "rate_limit"
831
- | "auth"
832
- | "permission"
833
- | "not_found"
834
- | "invalid_payload"
835
- | "conflict"
836
- | "cancelled"
837
- | "unknown";
838
- ```
839
-
840
- Core policy:
841
-
842
- - Retry `transient` and `rate_limit`.
843
- - Do not retry `invalid_payload` unless a render fallback exists.
844
- - Do not retry `auth` or `permission` until configuration changes.
845
- - For `not_found`, let live finalization fall back from edit to fresh send when
846
- the channel declares that safe.
847
- - For `conflict`, use receipt/idempotency rules to decide whether the message
848
- already exists.
849
- - Any error after the adapter may have completed platform I/O but before receipt
850
- commit becomes `unknown_after_send` unless the adapter can prove the platform
851
- operation did not happen.
852
-
853
- ## Channel mapping
854
-
855
- | Channel | Target migration |
856
- | --------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
857
- | Telegram | Receive ack policy plus durable final sends. Live adapter owns send plus edit preview, stale preview final send, topics, quote-reply preview skip, media fallback, and retry-after handling. |
858
- | Discord | Send adapter wraps existing durable payload delivery. Live adapter owns draft edit, progress draft, media/error preview cancel, reply target preservation, and message id receipts. Audit bot-authored gateway-failure echoes in shared rooms; use an outbound registry or other native equivalent if Discord cannot carry origin metadata on normal messages. |
859
- | Slack | Send adapter handles normal chat posts. Live adapter chooses native stream when thread shape supports it, otherwise draft preview. Receipts preserve thread timestamps. Origin adapter maps FengMing gateway failures to Slack `chat.postMessage.metadata` and drops tagged bot-room echoes before `allowBots` authorization. |
860
- | WhatsApp | Send adapter owns text/media send with durable final intents. Receive adapter handles group mention and sender identity. Live can stay absent until WhatsApp has an editable transport. |
861
- | Matrix | Live adapter owns draft event edits, finalization, redaction, encrypted media constraints, and reply-target mismatch fallback. Receive adapter owns encrypted event hydration and dedupe. Origin adapter should encode FengMing gateway-failure origin into Matrix event content and drop configured-bot room echoes before `allowBots` handling. |
862
- | Mattermost | Live adapter owns one draft post, progress/tool folding, finalization in place, and fresh-send fallback. |
863
- | Microsoft Teams | Live adapter owns native progress and block stream behavior. Send adapter owns activities and attachment/card receipts. |
864
- | Feishu | Render adapter owns text/card/raw rendering. Live adapter owns streaming cards and duplicate final suppression. Send adapter owns comments, topic sessions, media, and voice suppression. |
865
- | QQ Bot | Live adapter owns C2C streaming, accumulator timeout, and fallback final send. Render adapter owns media tags and text-as-voice. |
866
- | Signal | Simple receive plus send adapter. No live adapter unless signal-cli adds reliable edit support. |
867
- | iMessage | Simple receive plus send adapter. iMessage send must preserve monitor echo-cache population before durable finals can bypass monitor delivery. |
868
- | Google Chat | Simple receive plus send adapter with thread relation mapped to spaces and thread ids. Audit `allowBots=true` room behavior for tagged FengMing gateway-failure echoes. |
869
- | LINE | Simple receive plus send adapter with reply-token constraints modeled as target/relation capability. |
870
- | Nextcloud Talk | SDK receive bridge plus send adapter. |
871
- | IRC | Simple receive plus send adapter, no durable edit receipts. |
872
- | Nostr | Receive plus send adapter for encrypted DMs; receipts are event ids. |
873
- | QA Channel | Contract-test adapter for receive, send, live, retry, and recovery behavior. |
874
- | Synology Chat | Simple receive plus send adapter. |
875
- | Tlon | Send adapter must preserve model-signature rendering and participated-thread tracking before generic durable final delivery is enabled. |
876
- | Twitch | Simple receive plus send adapter with rate-limit classification. |
877
- | Zalo | Simple receive plus send adapter. |
878
- | Zalo Personal | Simple receive plus send adapter. |
879
-
880
- ## Migration plan
881
-
882
- ### Phase 1: Internal Message Domain
883
-
884
- - Add `src/channels/message/*` types for messages, targets, relations,
885
- origins, receipts, capabilities, durable intents, receive context, send
886
- context, live context, and failure classes.
887
- - Add `origin?: MessageOrigin` to the migration bridge payload type used by
888
- current reply delivery, then move that field to `ChannelMessage` and rendered
889
- message types as the refactor replaces reply payloads.
890
- - Keep this internal until adapters and tests prove the shape.
891
- - Add pure unit tests for state transitions and serialization.
892
-
893
- ### Phase 2: Durable Send Core
894
-
895
- - Move the existing outbound queue from reply-payload durability to durable
896
- message send intents.
897
- - Let a durable send intent carry a projected payload array or batch plan, not
898
- only one reply payload.
899
- - Preserve the current queue recovery behavior through compatibility conversion.
900
- - Make `deliverOutboundPayloads` call `messages.send`.
901
- - Make final-send durability the default and fail closed when the durable intent
902
- cannot be written in the new message lifecycle, after the adapter declares
903
- replay safety. Existing inbound runner and SDK compatibility paths remain
904
- direct-send by default during this phase.
905
- - Record receipts consistently.
906
- - Return receipts and delivery results to the original dispatcher caller instead
907
- of treating durable send as a terminal side effect.
908
- - Persist message origin through durable send intents so recovery, replay, and
909
- chunked sends preserve FengMing operational provenance.
910
-
911
- ### Phase 3: Channel Inbound Bridge
912
-
913
- - Reimplement `channel.inbound.run` and `dispatchChannelInboundReply` on top of
914
- `messages.receive` and `messages.send`.
915
- - Keep current fact types stable.
916
- - Keep legacy behavior by default. An assembled-turn channel becomes durable
917
- only when its adapter explicitly opts in with a replay-safe durability policy.
918
- - Keep `durable: false` as a compatibility escape hatch for paths that finalize
919
- native edits and cannot replay safely yet, but do not rely on `false` markers
920
- to protect unmigrated channels.
921
- - Default assembled-turn durability only in the new message lifecycle, after
922
- the channel mapping proves the generic send path preserves the old channel
923
- delivery semantics.
924
-
925
- ### Phase 4: Prepared Dispatcher Bridge
926
-
927
- - Replace `deliverDurableInboundReplyPayload` with a send-context bridge.
928
- - Keep the old helper as a wrapper.
929
- - Port Telegram, WhatsApp, Slack, Signal, iMessage, and Discord first because
930
- they already have durable-final work or simpler send paths.
931
- - Treat every prepared dispatcher as uncovered until it explicitly opts in to
932
- the send context. Documentation and changelog entries must say "assembled
933
- channel turns" or name the migrated channel paths rather than claiming all
934
- automatic final replies.
935
- - Keep `recordInboundSessionAndDispatchReply`, direct-DM helpers, and similar
936
- public compatibility helpers behavior-preserving. They may expose an explicit
937
- send-context opt-in later, but must not automatically attempt generic durable
938
- delivery before the caller-owned delivery callback.
939
-
940
- ### Phase 5: Unified Live Lifecycle
941
-
942
- - Build `messages.live` with two proof adapters:
943
- - Telegram for send plus edit plus stale final send.
944
- - Matrix for draft finalization plus redaction fallback.
945
- - Then migrate Discord, Slack, Mattermost, Teams, QQ Bot, and Feishu.
946
- - Delete duplicated preview finalization code only after each channel has
947
- parity tests.
948
-
949
- ### Phase 6: Public SDK
950
-
951
- - Add `fengming/plugin-sdk/channel-outbound`.
952
- - Document it as the preferred channel plugin API.
953
- - Update package exports, entrypoint inventory, generated API baselines, and
954
- plugin SDK docs.
955
- - Include `MessageOrigin`, origin encode/decode hooks, and the shared
956
- `shouldDropFengMingEcho` predicate in the channel-outbound SDK surface.
957
- - Keep compatibility wrappers for old subpaths.
958
- - Mark reply-named SDK helpers as deprecated in docs after bundled plugins are
959
- migrated.
960
-
961
- ### Phase 7: All Senders
962
-
963
- Move all non-reply outbound producers onto `messages.send`:
964
-
965
- - cron and heartbeat notifications
966
- - task completions
967
- - hook results
968
- - approval prompts and approval results
969
- - message tool sends
970
- - subagent completion announcements
971
- - explicit CLI or Control UI sends
972
- - automation/broadcast paths
973
-
974
- This is where the model stops being "agent replies" and becomes "FengMing sends
975
- messages".
976
-
977
- ### Phase 8: Remove Turn-Named Compatibility
978
-
979
- - Keep inbound/message-named wrappers as the compatibility window.
980
- - Publish migration notes.
981
- - Run plugin SDK compatibility tests against old imports.
982
- - Remove or hide old internal helpers only after no bundled plugin needs them
983
- and third-party contracts have a stable replacement.
984
-
985
- ## Test plan
986
-
987
- Unit tests:
988
-
989
- - Durable send intent serialization and recovery.
990
- - Idempotency key reuse and duplicate suppression.
991
- - Receipt commit and replay skip.
992
- - `unknown_after_send` recovery that reconciles before replay when an adapter
993
- supports reconciliation.
994
- - Failure classification policy.
995
- - Receive ack policy sequencing.
996
- - Relation mapping for reply, followup, system, and broadcast sends.
997
- - Gateway-failure origin factory and `shouldDropFengMingEcho` predicate.
998
- - Origin preservation through payload normalization, chunking, durable queue
999
- serialization, and recovery.
1000
-
1001
- Integration tests:
1002
-
1003
- - `channel.inbound.run` simple adapter still records and sends.
1004
- - Legacy assembled-event delivery does not become durable unless the channel
1005
- explicitly opts in.
1006
- - `channel.inbound.runPreparedReply` bridge still records and finalizes.
1007
- - Public compatibility helpers call caller-owned delivery callbacks by default
1008
- and do not generic-send before those callbacks.
1009
- - Durable fallback delivery replays the whole projected payload array after
1010
- restart and cannot leave the later payloads unrecorded after an early crash.
1011
- - Durable assembled-event delivery returns platform message ids to the buffered
1012
- dispatcher.
1013
- - Custom delivery hooks still return platform message ids when durable delivery
1014
- is disabled or unavailable.
1015
- - Final reply survives restart between assistant completion and platform send.
1016
- - Preview draft finalizes in place when allowed.
1017
- - Preview draft is cancelled or redacted when media/error/reply-target mismatch
1018
- requires normal delivery.
1019
- - Block streaming and preview streaming do not both deliver the same text.
1020
- - Media streamed early is not duplicated in final delivery.
1021
-
1022
- Channel tests:
1023
-
1024
- - Telegram topic reply with polling ack delayed until the receive context's safe
1025
- completed watermark.
1026
- - Telegram polling recovery for accepted-but-not-delivered updates covered by
1027
- the persisted safe-completed offset model.
1028
- - Telegram stale preview sends fresh final and cleans up preview.
1029
- - Telegram silent fallback sends every projected fallback payload.
1030
- - Telegram silent fallback durability records the full projected fallback array
1031
- atomically, not one single-payload durable intent per loop iteration.
1032
- - Discord preview cancel on media/error/explicit reply.
1033
- - Discord prepared dispatcher finals route through the send context before docs
1034
- or changelog claim Discord final-reply durability.
1035
- - iMessage durable final sends populate the monitor sent-message echo cache.
1036
- - LINE, Zalo, and Nostr legacy delivery paths are not bypassed by
1037
- generic durable send until their adapter parity tests exist.
1038
- - Direct-DM/Nostr callback delivery remains authoritative unless explicitly
1039
- migrated to a complete message target and replay-safe send adapter.
1040
- - Slack tagged FengMing gateway failure messages stay visible outbound, tagged
1041
- bot-room echoes drop before `allowBots`, and untagged bot messages with the
1042
- same visible text still follow normal bot authorization.
1043
- - Slack native stream fallback to draft preview in top-level DMs.
1044
- - Matrix preview finalization and redaction fallback.
1045
- - Matrix tagged FengMing gateway-failure room echoes from configured bot
1046
- accounts drop before `allowBots` handling.
1047
- - Discord and Google Chat shared-room gateway-failure cascade audits cover
1048
- `allowBots` modes before claiming generic protection there.
1049
- - Mattermost draft finalization and fresh-send fallback.
1050
- - Teams native progress finalization.
1051
- - Feishu duplicate final suppression.
1052
- - QQ Bot accumulator timeout fallback.
1053
- - Tlon durable final sends preserve model-signature rendering and participated
1054
- thread tracking.
1055
- - WhatsApp, Signal, iMessage, Google Chat, LINE, IRC, Nostr, Nextcloud Talk,
1056
- Synology Chat, Tlon, Twitch, Zalo, and Zalo Personal simple durable final
1057
- sends.
1058
-
1059
- Validation:
1060
-
1061
- - Targeted Vitest files during development.
1062
- - `pnpm check:changed` in Testbox for the full changed surface.
1063
- - Broader `pnpm check` in Testbox before landing the complete refactor or after
1064
- public SDK/export changes.
1065
- - Live or qa-channel smoke for at least one edit-capable channel and one
1066
- simple send-only channel before removing compatibility wrappers.
1067
-
1068
- ## Open questions
1069
-
1070
- - Whether Telegram should eventually replace the grammY runner source with a
1071
- fully durable polling source that can control platform-level redelivery, not
1072
- only FengMing's persisted restart watermark.
1073
- - Whether durable live preview state should be stored in the same queue record
1074
- as the final send intent or in a sibling live-state store.
1075
- - How long compatibility wrappers stay documented after
1076
- `plugin-sdk/channel-outbound` ships.
1077
- - Whether third-party plugins should implement receive adapters directly or only
1078
- provide normalize/send/live hooks through `defineChannelMessageAdapter`.
1079
- - Which receipt fields are safe to expose in public SDK versus internal runtime
1080
- state.
1081
- - Whether side effects such as self-echo caches and participated-thread markers
1082
- should be modeled as send-context hooks, adapter-owned finalize steps, or
1083
- receipt subscribers.
1084
- - Which channels have native origin metadata, which need persisted outbound
1085
- registries, and which cannot offer reliable cross-bot echo suppression.
1086
-
1087
- ## Acceptance criteria
1088
-
1089
- - Every bundled message channel sends final visible output through
1090
- `messages.send`.
1091
- - Every inbound message channel enters through `messages.receive` or a
1092
- documented compatibility wrapper.
1093
- - Every preview/edit/stream channel uses `messages.live` for draft state and
1094
- finalization.
1095
- - `channel.inbound` is only a wrapper.
1096
- - Reply-named SDK helpers are compatibility exports, not the recommended path.
1097
- - Durable recovery can replay pending final sends after restart without losing
1098
- the final response or duplicating already committed sends; sends whose
1099
- platform outcome is unknown are reconciled before replay or documented as
1100
- at-least-once for that adapter.
1101
- - Durable final sends fail closed when the durable intent cannot be written,
1102
- unless a caller explicitly selected a documented non-durable mode.
1103
- - Legacy SDK compatibility helpers default to direct
1104
- channel-owned delivery; generic durable send is explicit opt-in only.
1105
- - Receipts preserve all platform message ids for multi-part deliveries and a
1106
- primary id for threading/edit convenience.
1107
- - Durable wrappers preserve channel-local side effects before replacing direct
1108
- delivery callbacks.
1109
- - Prepared dispatchers are not counted as durable until their final delivery
1110
- path explicitly uses the send context.
1111
- - Fallback delivery handles every projected payload.
1112
- - Durable fallback delivery records every projected payload in one replayable
1113
- intent or batch plan.
1114
- - FengMing-originated gateway failure output is visible to humans but tagged
1115
- bot-authored room echoes are dropped before bot authorization on channels that
1116
- declare support for the origin contract.
1117
- - The docs explain send, receive, live, state, receipts, relations, failure
1118
- policy, migration, and test coverage.
1119
-
1120
- ## Related
1121
-
1122
- - [Messages](/concepts/messages)
1123
- - [Streaming and chunking](/concepts/streaming)
1124
- - [Progress drafts](/concepts/progress-drafts)
1125
- - [Retry policy](/concepts/retry)
1126
- - [Channel inbound API](/plugins/sdk-channel-inbound)