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,1196 +0,0 @@
1
- ---
2
- summary: "Plugin architecture internals: load pipeline, registry, runtime hooks, HTTP routes, and reference tables"
3
- read_when:
4
- - Implementing provider runtime hooks, channel lifecycle, or package packs
5
- - Debugging plugin load order or registry state
6
- - Adding a new plugin capability or context engine plugin
7
- title: "Plugin architecture internals"
8
- ---
9
-
10
- For the public capability model, plugin shapes, and ownership/execution
11
- contracts, see [Plugin architecture](/plugins/architecture). This page is the
12
- reference for the internal mechanics: load pipeline, registry, runtime hooks,
13
- Gateway HTTP routes, import paths, and schema tables.
14
-
15
- ## Load pipeline
16
-
17
- At startup, FengMing does roughly this:
18
-
19
- 1. discover candidate plugin roots
20
- 2. read native or compatible bundle manifests and package metadata
21
- 3. reject unsafe candidates
22
- 4. normalize plugin config (`plugins.enabled`, `allow`, `deny`, `entries`,
23
- `slots`, `load.paths`)
24
- 5. decide enablement for each candidate
25
- 6. load enabled native modules: built bundled modules use a native loader;
26
- third-party local source TypeScript uses the emergency Jiti fallback
27
- 7. call native `register(api)` hooks and collect registrations into the plugin registry
28
- 8. expose the registry to commands/runtime surfaces
29
-
30
- <Note>
31
- `activate` is a legacy alias for `register` — the loader resolves whichever is present (`def.register ?? def.activate`) and calls it at the same point. All bundled plugins use `register`; prefer `register` for new plugins.
32
- </Note>
33
-
34
- The safety gates happen **before** runtime execution. Candidates are blocked
35
- when the entry escapes the plugin root, the path is world-writable, or path
36
- ownership looks suspicious for non-bundled plugins.
37
-
38
- Blocked candidates remain tied to their plugin id for diagnostics. If config
39
- still references that id, validation reports the plugin as present but blocked
40
- and points back to the path-safety warning instead of treating the config entry
41
- as stale.
42
-
43
- ### Manifest-first behavior
44
-
45
- The manifest is the control-plane source of truth. FengMing uses it to:
46
-
47
- - identify the plugin
48
- - discover declared channels/skills/config schema or bundle capabilities
49
- - validate `plugins.entries.<id>.config`
50
- - augment Control UI labels/placeholders
51
- - show install/catalog metadata
52
- - preserve cheap activation and setup descriptors without loading plugin runtime
53
-
54
- For native plugins, the runtime module is the data-plane part. It registers
55
- actual behavior such as hooks, tools, commands, or provider flows.
56
-
57
- Optional manifest `activation` and `setup` blocks stay on the control plane.
58
- They are metadata-only descriptors for activation planning and setup discovery;
59
- they do not replace runtime registration, `register(...)`, or `setupEntry`.
60
- The first live activation consumers now use manifest command, channel, and provider hints
61
- to narrow plugin loading before broader registry materialization:
62
-
63
- - CLI loading narrows to plugins that own the requested primary command
64
- - channel setup/plugin resolution narrows to plugins that own the requested
65
- channel id
66
- - explicit provider setup/runtime resolution narrows to plugins that own the
67
- requested provider id
68
- - Gateway startup planning uses `activation.onStartup` for explicit startup
69
- imports and startup opt-outs; plugins without startup metadata load only
70
- through narrower activation triggers
71
-
72
- Request-time runtime preloads that ask for the broad `all` scope still derive an
73
- explicit effective plugin id set from config, startup planning, configured
74
- channels, slots, and auto-enable rules. If that derived set is empty, FengMing
75
- loads an empty runtime registry instead of widening to every discoverable
76
- plugin.
77
-
78
- The activation planner exposes both an ids-only API for existing callers and a
79
- plan API for new diagnostics. Plan entries report why a plugin was selected,
80
- separating explicit `activation.*` planner hints from manifest ownership
81
- fallback such as `providers`, `channels`, `commandAliases`, `setup.providers`,
82
- `contracts.tools`, and hooks. That reason split is the compatibility boundary:
83
- existing plugin metadata keeps working, while new code can detect broad hints
84
- or fallback behavior without changing runtime loading semantics.
85
-
86
- Setup discovery now prefers descriptor-owned ids such as `setup.providers` and
87
- `setup.cliBackends` to narrow candidate plugins before it falls back to
88
- `setup-api` for plugins that still need setup-time runtime hooks. Provider
89
- setup lists use manifest `providerAuthChoices`, descriptor-derived setup
90
- choices, and install-catalog metadata without loading provider runtime. Explicit
91
- `setup.requiresRuntime: false` is a descriptor-only cutoff; omitted
92
- `requiresRuntime` keeps the legacy setup-api fallback for compatibility. If more
93
- than one discovered plugin claims the same normalized setup provider or CLI
94
- backend id, setup lookup refuses the ambiguous owner instead of relying on
95
- discovery order. When setup runtime does execute, registry diagnostics report
96
- drift between `setup.providers` / `setup.cliBackends` and the providers or CLI
97
- backends registered by setup-api without blocking legacy plugins.
98
-
99
- ### Plugin cache boundary
100
-
101
- FengMing does not cache plugin discovery results or direct manifest registry
102
- data behind wall-clock windows. Installs, manifest edits, and load-path changes
103
- must become visible on the next explicit metadata read or snapshot rebuild.
104
- The manifest file parser may keep a bounded file-signature cache keyed by the
105
- opened manifest path, inode, size, and timestamps; that cache only avoids
106
- re-parsing unchanged bytes and must not cache discovery, registry, owner, or
107
- policy answers.
108
-
109
- The safe metadata fast path is explicit object ownership, not a hidden cache.
110
- Gateway startup hot paths should pass the current `PluginMetadataSnapshot`, the
111
- derived `PluginLookUpTable`, or an explicit manifest registry through the call
112
- chain. Config validation, startup auto-enable, plugin bootstrap, and provider
113
- selection can reuse those objects while they represent the current config and
114
- plugin inventory. Setup lookup still reconstructs manifest metadata on demand
115
- unless the specific setup path receives an explicit manifest registry; keep that
116
- as a cold-path fallback rather than adding hidden lookup caches. When the input
117
- changes, rebuild and replace the snapshot instead of mutating it or keeping
118
- historical copies.
119
- Views over the active plugin registry and bundled channel bootstrap helpers
120
- should be recomputed from the current registry/root. Short-lived maps are fine
121
- inside one call to dedupe work or guard reentry; they must not become process
122
- metadata caches.
123
-
124
- For plugin loading, the persistent cache layer is runtime loading. It may reuse
125
- loader state when code or installed artifacts are actually loaded, such as:
126
-
127
- - `PluginLoaderCacheState` and compatible active runtime registries
128
- - jiti/module caches and public-surface loader caches used to avoid importing
129
- the same runtime surface repeatedly
130
- - filesystem caches for installed plugin artifacts
131
- - short-lived per-call maps for path normalization or duplicate resolution
132
-
133
- Those caches are data-plane implementation details. They must not answer
134
- control-plane questions such as "which plugin owns this provider?" unless the
135
- caller deliberately asked for runtime loading.
136
-
137
- Do not add persistent or wall-clock caches for:
138
-
139
- - discovery results
140
- - direct manifest registries
141
- - manifest registries reconstructed from the installed plugin index
142
- - provider owner lookup, model suppression, provider policy, or public-artifact
143
- metadata
144
- - any other manifest-derived answer where a changed manifest, installed index,
145
- or load path should be visible on the next metadata read
146
-
147
- Callers that rebuild manifest metadata from the persisted installed plugin
148
- index reconstruct that registry on demand. The installed index is durable
149
- source-plane state; it is not a hidden in-process metadata cache.
150
-
151
- ## Registry model
152
-
153
- Loaded plugins do not directly mutate random core globals. They register into a
154
- central plugin registry.
155
-
156
- The registry tracks:
157
-
158
- - plugin records (identity, source, origin, status, diagnostics)
159
- - tools
160
- - legacy hooks and typed hooks
161
- - channels
162
- - providers
163
- - gateway RPC handlers
164
- - HTTP routes
165
- - CLI registrars
166
- - background services
167
- - plugin-owned commands
168
-
169
- Core features then read from that registry instead of talking to plugin modules
170
- directly. This keeps loading one-way:
171
-
172
- - plugin module -> registry registration
173
- - core runtime -> registry consumption
174
-
175
- That separation matters for maintainability. It means most core surfaces only
176
- need one integration point: "read the registry", not "special-case every plugin
177
- module".
178
-
179
- ## Conversation binding callbacks
180
-
181
- Plugins that bind a conversation can react when an approval is resolved.
182
-
183
- Use `api.onConversationBindingResolved(...)` to receive a callback after a bind
184
- request is approved or denied:
185
-
186
- ```ts
187
- export default {
188
- id: "my-plugin",
189
- register(api) {
190
- api.onConversationBindingResolved(async (event) => {
191
- if (event.status === "approved") {
192
- // A binding now exists for this plugin + conversation.
193
- console.log(event.binding?.conversationId);
194
- return;
195
- }
196
-
197
- // The request was denied; clear any local pending state.
198
- console.log(event.request.conversation.conversationId);
199
- });
200
- },
201
- };
202
- ```
203
-
204
- Callback payload fields:
205
-
206
- - `status`: `"approved"` or `"denied"`
207
- - `decision`: `"allow-once"`, `"allow-always"`, or `"deny"`
208
- - `binding`: the resolved binding for approved requests
209
- - `request`: the original request summary, detach hint, sender id, and
210
- conversation metadata
211
-
212
- This callback is notification-only. It does not change who is allowed to bind a
213
- conversation, and it runs after core approval handling finishes.
214
-
215
- ## Provider runtime hooks
216
-
217
- Provider plugins have three layers:
218
-
219
- - **Manifest metadata** for cheap pre-runtime lookup:
220
- `setup.providers[].envVars`, deprecated compatibility `providerAuthEnvVars`,
221
- `providerAuthAliases`, `providerAuthChoices`, and `channelEnvVars`.
222
- - **Config-time hooks**: `catalog` (legacy `discovery`) plus
223
- `applyConfigDefaults`.
224
- - **Runtime hooks**: 40+ optional hooks covering auth, model resolution,
225
- stream wrapping, thinking levels, replay policy, and usage endpoints. See
226
- the full list under [Hook order and usage](#hook-order-and-usage).
227
-
228
- FengMing still owns the generic agent loop, failover, transcript handling, and
229
- tool policy. These hooks are the extension surface for provider-specific
230
- behavior without needing a whole custom inference transport.
231
-
232
- Use manifest `setup.providers[].envVars` when the provider has env-based
233
- credentials that generic auth/status/model-picker paths should see without
234
- loading plugin runtime. Deprecated `providerAuthEnvVars` is still read by the
235
- compatibility adapter during the deprecation window, and non-bundled plugins
236
- that use it receive a manifest diagnostic. Use manifest `providerAuthAliases`
237
- when one provider id should reuse another provider id's env vars, auth profiles,
238
- config-backed auth, and API-key onboarding choice. Use manifest
239
- `providerAuthChoices` when onboarding/auth-choice CLI surfaces should know the
240
- provider's choice id, group labels, and simple one-flag auth wiring without
241
- loading provider runtime. Keep provider runtime
242
- `envVars` for operator-facing hints such as onboarding labels or OAuth
243
- client-id/client-secret setup vars.
244
-
245
- Use manifest `channelEnvVars` when a channel has env-driven auth or setup that
246
- generic shell-env fallback, config/status checks, or setup prompts should see
247
- without loading channel runtime.
248
-
249
- ### Hook order and usage
250
-
251
- For model/provider plugins, FengMing calls hooks in this rough order.
252
- The "When to use" column is the quick decision guide.
253
- Compatibility-only provider fields that FengMing no longer calls, such as
254
- `ProviderPlugin.capabilities` and `suppressBuiltInModel`, are intentionally not
255
- listed here.
256
-
257
- | # | Hook | What it does | When to use |
258
- | --- | --------------------------------- | -------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------- |
259
- | 1 | `catalog` | Publish provider config into `models.providers` during `models.json` generation | Provider owns a catalog or base URL defaults |
260
- | 2 | `applyConfigDefaults` | Apply provider-owned global config defaults during config materialization | Defaults depend on auth mode, env, or provider model-family semantics |
261
- | -- | _(built-in model lookup)_ | FengMing tries the normal registry/catalog path first | _(not a plugin hook)_ |
262
- | 3 | `normalizeModelId` | Normalize legacy or preview model-id aliases before lookup | Provider owns alias cleanup before canonical model resolution |
263
- | 4 | `normalizeTransport` | Normalize provider-family `api` / `baseUrl` before generic model assembly | Provider owns transport cleanup for custom provider ids in the same transport family |
264
- | 5 | `normalizeConfig` | Normalize `models.providers.<id>` before runtime/provider resolution | Provider needs config cleanup that should live with the plugin; bundled Google-family helpers also backstop supported Google config entries |
265
- | 6 | `applyNativeStreamingUsageCompat` | Apply native streaming-usage compat rewrites to config providers | Provider needs endpoint-driven native streaming usage metadata fixes |
266
- | 7 | `resolveConfigApiKey` | Resolve env-marker auth for config providers before runtime auth loading | Providers expose their own env-marker API-key resolution hooks |
267
- | 8 | `resolveSyntheticAuth` | Surface local/self-hosted or config-backed auth without persisting plaintext | Provider can operate with a synthetic/local credential marker |
268
- | 9 | `resolveExternalAuthProfiles` | Overlay provider-owned external auth profiles; default `persistence` is `runtime-only` for CLI/app-owned creds | Provider reuses external auth credentials without persisting copied refresh tokens; declare `contracts.externalAuthProviders` in the manifest |
269
- | 10 | `shouldDeferSyntheticProfileAuth` | Lower stored synthetic profile placeholders behind env/config-backed auth | Provider stores synthetic placeholder profiles that should not win precedence |
270
- | 11 | `resolveDynamicModel` | Sync fallback for provider-owned model ids not in the local registry yet | Provider accepts arbitrary upstream model ids |
271
- | 12 | `prepareDynamicModel` | Async warm-up, then `resolveDynamicModel` runs again | Provider needs network metadata before resolving unknown ids |
272
- | 13 | `normalizeResolvedModel` | Final rewrite before the embedded runner uses the resolved model | Provider needs transport rewrites but still uses a core transport |
273
- | 14 | `normalizeToolSchemas` | Normalize tool schemas before the embedded runner sees them | Provider needs transport-family schema cleanup |
274
- | 15 | `inspectToolSchemas` | Surface provider-owned schema diagnostics after normalization | Provider wants keyword warnings without teaching core provider-specific rules |
275
- | 16 | `resolveReasoningOutputMode` | Select native vs tagged reasoning-output contract | Provider needs tagged reasoning/final output instead of native fields |
276
- | 17 | `prepareExtraParams` | Request-param normalization before generic stream option wrappers | Provider needs default request params or per-provider param cleanup |
277
- | 18 | `createStreamFn` | Fully replace the normal stream path with a custom transport | Provider needs a custom wire protocol, not just a wrapper |
278
- | 20 | `wrapStreamFn` | Stream wrapper after generic wrappers are applied | Provider needs request headers/body/model compat wrappers without a custom transport |
279
- | 21 | `resolveTransportTurnState` | Attach native per-turn transport headers or metadata | Provider wants generic transports to send provider-native turn identity |
280
- | 22 | `resolveWebSocketSessionPolicy` | Attach native WebSocket headers or session cool-down policy | Provider wants generic WS transports to tune session headers or fallback policy |
281
- | 23 | `formatApiKey` | Auth-profile formatter: stored profile becomes the runtime `apiKey` string | Provider stores extra auth metadata and needs a custom runtime token shape |
282
- | 24 | `refreshOAuth` | OAuth refresh override for custom refresh endpoints or refresh-failure policy | Provider does not fit the shared FengMing refreshers |
283
- | 25 | `buildAuthDoctorHint` | Repair hint appended when OAuth refresh fails | Provider needs provider-owned auth repair guidance after refresh failure |
284
- | 26 | `matchesContextOverflowError` | Provider-owned context-window overflow matcher | Provider has raw overflow errors generic heuristics would miss |
285
- | 27 | `classifyFailoverReason` | Provider-owned failover reason classification | Provider can map raw API/transport errors to rate-limit/overload/etc |
286
- | 28 | `isCacheTtlEligible` | Prompt-cache policy for proxy/backhaul providers | Provider needs proxy-specific cache TTL gating |
287
- | 29 | `buildMissingAuthMessage` | Replacement for the generic missing-auth recovery message | Provider needs a provider-specific missing-auth recovery hint |
288
- | 30 | `augmentModelCatalog` | Synthetic/final catalog rows appended after discovery | Provider needs synthetic forward-compat rows in `models list` and pickers |
289
- | 31 | `resolveThinkingProfile` | Model-specific `/think` level set, display labels, and default | Provider exposes a custom thinking ladder or binary label for selected models |
290
- | 32 | `isBinaryThinking` | On/off reasoning toggle compatibility hook | Provider exposes only binary thinking on/off |
291
- | 33 | `supportsXHighThinking` | `xhigh` reasoning support compatibility hook | Provider wants `xhigh` on only a subset of models |
292
- | 34 | `resolveDefaultThinkingLevel` | Default `/think` level compatibility hook | Provider owns default `/think` policy for a model family |
293
- | 35 | `isModernModelRef` | Modern-model matcher for live profile filters and smoke selection | Provider owns live/smoke preferred-model matching |
294
- | 36 | `prepareRuntimeAuth` | Exchange a configured credential into the actual runtime token/key just before inference | Provider needs a token exchange or short-lived request credential |
295
- | 37 | `resolveUsageAuth` | Resolve usage/billing credentials for `/usage` and related status surfaces | Provider needs custom usage/quota token parsing or a different usage credential |
296
- | 38 | `fetchUsageSnapshot` | Fetch and normalize provider-specific usage/quota snapshots after auth is resolved | Provider needs a provider-specific usage endpoint or payload parser |
297
- | 39 | `createEmbeddingProvider` | Build a provider-owned embedding adapter for memory/search | Memory embedding behavior belongs with the provider plugin |
298
- | 40 | `buildReplayPolicy` | Return a replay policy controlling transcript handling for the provider | Provider needs custom transcript policy (for example, thinking-block stripping) |
299
- | 41 | `sanitizeReplayHistory` | Rewrite replay history after generic transcript cleanup | Provider needs provider-specific replay rewrites beyond shared compaction helpers |
300
- | 42 | `validateReplayTurns` | Final replay-turn validation or reshaping before the embedded runner | Provider transport needs stricter turn validation after generic sanitation |
301
- | 43 | `onModelSelected` | Run provider-owned post-selection side effects | Provider needs telemetry or provider-owned state when a model becomes active |
302
-
303
- `normalizeModelId`, `normalizeTransport`, and `normalizeConfig` first check the
304
- matched provider plugin, then fall through other hook-capable provider plugins
305
- until one actually changes the model id or transport/config. That keeps
306
- alias/compat provider shims working without requiring the caller to know which
307
- bundled plugin owns the rewrite. If no provider hook rewrites a supported
308
- Google-family config entry, the bundled Google config normalizer still applies
309
- that compatibility cleanup.
310
-
311
- If the provider needs a fully custom wire protocol or custom request executor,
312
- that is a different class of extension. These hooks are for provider behavior
313
- that still runs on FengMing's normal inference loop.
314
-
315
- ### Provider example
316
-
317
- ```ts
318
- api.registerProvider({
319
- id: "example-proxy",
320
- label: "Example Proxy",
321
- auth: [],
322
- catalog: {
323
- order: "simple",
324
- run: async (ctx) => {
325
- const apiKey = ctx.resolveProviderApiKey("example-proxy").apiKey;
326
- if (!apiKey) {
327
- return null;
328
- }
329
- return {
330
- provider: {
331
- baseUrl: "https://proxy.example.com/v1",
332
- apiKey,
333
- api: "openai-completions",
334
- models: [{ id: "auto", name: "Auto" }],
335
- },
336
- };
337
- },
338
- },
339
- resolveDynamicModel: (ctx) => ({
340
- id: ctx.modelId,
341
- name: ctx.modelId,
342
- provider: "example-proxy",
343
- api: "openai-completions",
344
- baseUrl: "https://proxy.example.com/v1",
345
- reasoning: false,
346
- input: ["text"],
347
- cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
348
- contextWindow: 128000,
349
- maxTokens: 8192,
350
- }),
351
- prepareRuntimeAuth: async (ctx) => {
352
- const exchanged = await exchangeToken(ctx.apiKey);
353
- return {
354
- apiKey: exchanged.token,
355
- baseUrl: exchanged.baseUrl,
356
- expiresAt: exchanged.expiresAt,
357
- };
358
- },
359
- resolveUsageAuth: async (ctx) => {
360
- const auth = await ctx.resolveOAuthToken();
361
- return auth ? { token: auth.token } : null;
362
- },
363
- fetchUsageSnapshot: async (ctx) => {
364
- return await fetchExampleProxyUsage(ctx.token, ctx.timeoutMs, ctx.fetchFn);
365
- },
366
- });
367
- ```
368
-
369
- ### Built-in examples
370
-
371
- Bundled provider plugins combine the hooks above to fit each vendor's catalog,
372
- auth, thinking, replay, and usage needs. The authoritative hook set lives with
373
- each plugin under `extensions/`; this page illustrates the shapes rather than
374
- mirroring the list.
375
-
376
- <AccordionGroup>
377
- <Accordion title="Pass-through catalog providers">
378
- OpenRouter, Kilocode, Z.AI, xAI register `catalog` plus
379
- `resolveDynamicModel` / `prepareDynamicModel` so they can surface upstream
380
- model ids ahead of FengMing's static catalog.
381
- </Accordion>
382
- <Accordion title="OAuth and usage endpoint providers">
383
- GitHub Copilot, Gemini CLI, ChatGPT Codex, MiniMax, Xiaomi, z.ai pair
384
- `prepareRuntimeAuth` or `formatApiKey` with `resolveUsageAuth` +
385
- `fetchUsageSnapshot` to own token exchange and `/usage` integration.
386
- </Accordion>
387
- <Accordion title="Replay and transcript cleanup families">
388
- Shared named families (`google-gemini`, `passthrough-gemini`,
389
- `anthropic-by-model`, `hybrid-anthropic-openai`) let providers opt into
390
- transcript policy via `buildReplayPolicy` instead of each plugin
391
- re-implementing cleanup.
392
- </Accordion>
393
- <Accordion title="Catalog-only providers">
394
- `byteplus`, `cloudflare-ai-gateway`, `huggingface`, `kimi-coding`, `nvidia`,
395
- `qianfan`, `synthetic`, `together`, `venice`, `vercel-ai-gateway`, and
396
- `volcengine` register just `catalog` and ride the shared inference loop.
397
- </Accordion>
398
- <Accordion title="Anthropic-specific stream helpers">
399
- Beta headers, `/fast` / `serviceTier`, and `context1m` live inside the
400
- Anthropic plugin's public `api.ts` / `contract-api.ts` seam
401
- (`wrapAnthropicProviderStream`, `resolveAnthropicBetas`,
402
- `resolveAnthropicFastMode`, `resolveAnthropicServiceTier`) rather than in
403
- the generic SDK.
404
- </Accordion>
405
- </AccordionGroup>
406
-
407
- ## Runtime helpers
408
-
409
- Plugins can access selected core helpers via `api.runtime`. For TTS:
410
-
411
- ```ts
412
- const clip = await api.runtime.tts.textToSpeech({
413
- text: "Hello from FengMing",
414
- cfg: api.config,
415
- });
416
-
417
- const result = await api.runtime.tts.textToSpeechTelephony({
418
- text: "Hello from FengMing",
419
- cfg: api.config,
420
- });
421
-
422
- const voices = await api.runtime.tts.listVoices({
423
- provider: "elevenlabs",
424
- cfg: api.config,
425
- });
426
- ```
427
-
428
- Notes:
429
-
430
- - `textToSpeech` returns the normal core TTS output payload for file/voice-note surfaces.
431
- - Uses core `messages.tts` configuration and provider selection.
432
- - Returns PCM audio buffer + sample rate. Plugins must resample/encode for providers.
433
- - `listVoices` is optional per provider. Use it for vendor-owned voice pickers or setup flows.
434
- - Voice listings can include richer metadata such as locale, gender, and personality tags for provider-aware pickers.
435
- - OpenAI and ElevenLabs support telephony today. Microsoft does not.
436
-
437
- Plugins can also register speech providers via `api.registerSpeechProvider(...)`.
438
-
439
- ```ts
440
- api.registerSpeechProvider({
441
- id: "acme-speech",
442
- label: "Acme Speech",
443
- isConfigured: ({ config }) => Boolean(config.messages?.tts),
444
- synthesize: async (req) => {
445
- return {
446
- audioBuffer: Buffer.from([]),
447
- outputFormat: "mp3",
448
- fileExtension: ".mp3",
449
- voiceCompatible: false,
450
- };
451
- },
452
- });
453
- ```
454
-
455
- Notes:
456
-
457
- - Keep TTS policy, fallback, and reply delivery in core.
458
- - Use speech providers for vendor-owned synthesis behavior.
459
- - Legacy Microsoft `edge` input is normalized to the `microsoft` provider id.
460
- - The preferred ownership model is company-oriented: one vendor plugin can own
461
- text, speech, image, and future media providers as FengMing adds those
462
- capability contracts.
463
-
464
- For image/audio/video understanding, plugins register one typed
465
- media-understanding provider instead of a generic key/value bag:
466
-
467
- ```ts
468
- api.registerMediaUnderstandingProvider({
469
- id: "google",
470
- capabilities: ["image", "audio", "video"],
471
- describeImage: async (req) => ({ text: "..." }),
472
- transcribeAudio: async (req) => ({ text: "..." }),
473
- describeVideo: async (req) => ({ text: "..." }),
474
- });
475
- ```
476
-
477
- Notes:
478
-
479
- - Keep orchestration, fallback, config, and channel wiring in core.
480
- - Keep vendor behavior in the provider plugin.
481
- - Additive expansion should stay typed: new optional methods, new optional
482
- result fields, new optional capabilities.
483
- - Video generation already follows the same pattern:
484
- - core owns the capability contract and runtime helper
485
- - vendor plugins register `api.registerVideoGenerationProvider(...)`
486
- - feature/channel plugins consume `api.runtime.videoGeneration.*`
487
-
488
- For media-understanding runtime helpers, plugins can call:
489
-
490
- ```ts
491
- const image = await api.runtime.mediaUnderstanding.describeImageFile({
492
- filePath: "/tmp/inbound-photo.jpg",
493
- cfg: api.config,
494
- agentDir: "/tmp/agent",
495
- });
496
-
497
- const video = await api.runtime.mediaUnderstanding.describeVideoFile({
498
- filePath: "/tmp/inbound-video.mp4",
499
- cfg: api.config,
500
- });
501
-
502
- const extraction = await api.runtime.mediaUnderstanding.extractStructuredWithModel({
503
- provider: "codex",
504
- model: "gpt-5.5",
505
- input: [
506
- {
507
- type: "image",
508
- buffer: receiptImageBuffer,
509
- fileName: "receipt.png",
510
- mime: "image/png",
511
- },
512
- { type: "text", text: "Use the printed fields as the source of truth." },
513
- ],
514
- instructions: "Return entities and searchable tags.",
515
- schemaName: "example.evidence",
516
- jsonSchema: {
517
- type: "object",
518
- properties: {
519
- entities: { type: "array", items: { type: "string" } },
520
- tags: { type: "array", items: { type: "string" } },
521
- },
522
- },
523
- cfg: api.config,
524
- });
525
- ```
526
-
527
- For audio transcription, plugins can use either the media-understanding runtime
528
- or the older STT alias:
529
-
530
- ```ts
531
- const { text } = await api.runtime.mediaUnderstanding.transcribeAudioFile({
532
- filePath: "/tmp/inbound-audio.ogg",
533
- cfg: api.config,
534
- // Optional when MIME cannot be inferred reliably:
535
- mime: "audio/ogg",
536
- });
537
- ```
538
-
539
- Notes:
540
-
541
- - `api.runtime.mediaUnderstanding.*` is the preferred shared surface for
542
- image/audio/video understanding.
543
- - `extractStructuredWithModel(...)` is the plugin-facing seam for bounded
544
- provider-owned image-first extraction. Include at least one image input;
545
- text inputs are supplemental context.
546
- product plugins own their routes and schemas while FengMing owns the
547
- provider/runtime boundary.
548
- - Uses core media-understanding audio configuration (`tools.media.audio`) and provider fallback order.
549
- - Returns `{ text: undefined }` when no transcription output is produced (for example skipped/unsupported input).
550
- - `api.runtime.stt.transcribeAudioFile(...)` remains as a compatibility alias.
551
-
552
- Plugins can also launch background subagent runs through `api.runtime.subagent`:
553
-
554
- ```ts
555
- const result = await api.runtime.subagent.run({
556
- sessionKey: "agent:main:subagent:search-helper",
557
- message: "Expand this query into focused follow-up searches.",
558
- provider: "openai",
559
- model: "gpt-4.1-mini",
560
- deliver: false,
561
- });
562
- ```
563
-
564
- Notes:
565
-
566
- - `provider` and `model` are optional per-run overrides, not persistent session changes.
567
- - FengMing only honors those override fields for trusted callers.
568
- - For plugin-owned fallback runs, operators must opt in with `plugins.entries.<id>.subagent.allowModelOverride: true`.
569
- - Use `plugins.entries.<id>.subagent.allowedModels` to restrict trusted plugins to specific canonical `provider/model` targets, or `"*"` to allow any target explicitly.
570
- - Untrusted plugin subagent runs still work, but override requests are rejected instead of silently falling back.
571
- - Plugin-created subagent sessions are tagged with the creating plugin id. Fallback `api.runtime.subagent.deleteSession(...)` may delete those owned sessions only; arbitrary session deletion still requires an admin-scoped Gateway request.
572
-
573
- For web search, plugins can consume the shared runtime helper instead of
574
- reaching into the agent tool wiring:
575
-
576
- ```ts
577
- const providers = api.runtime.webSearch.listProviders({
578
- config: api.config,
579
- });
580
-
581
- const result = await api.runtime.webSearch.search({
582
- config: api.config,
583
- args: {
584
- query: "FengMing plugin runtime helpers",
585
- count: 5,
586
- },
587
- });
588
- ```
589
-
590
- Plugins can also register web-search providers via
591
- `api.registerWebSearchProvider(...)`.
592
-
593
- Notes:
594
-
595
- - Keep provider selection, credential resolution, and shared request semantics in core.
596
- - Use web-search providers for vendor-specific search transports.
597
- - `api.runtime.webSearch.*` is the preferred shared surface for feature/channel plugins that need search behavior without depending on the agent tool wrapper.
598
-
599
- ### `api.runtime.imageGeneration`
600
-
601
- ```ts
602
- const result = await api.runtime.imageGeneration.generate({
603
- config: api.config,
604
- args: { prompt: "A friendly lobster mascot", size: "1024x1024" },
605
- });
606
-
607
- const providers = api.runtime.imageGeneration.listProviders({
608
- config: api.config,
609
- });
610
- ```
611
-
612
- - `generate(...)`: generate an image using the configured image-generation provider chain.
613
- - `listProviders(...)`: list available image-generation providers and their capabilities.
614
-
615
- ## Gateway HTTP routes
616
-
617
- Plugins can expose HTTP endpoints with `api.registerHttpRoute(...)`.
618
-
619
- ```ts
620
- api.registerHttpRoute({
621
- path: "/acme/webhook",
622
- auth: "plugin",
623
- match: "exact",
624
- handler: async (_req, res) => {
625
- res.statusCode = 200;
626
- res.end("ok");
627
- return true;
628
- },
629
- });
630
- ```
631
-
632
- Route fields:
633
-
634
- - `path`: route path under the gateway HTTP server.
635
- - `auth`: required. Use `"gateway"` to require normal gateway auth, or `"plugin"` for plugin-managed auth/webhook verification.
636
- - `match`: optional. `"exact"` (default) or `"prefix"`.
637
- - `replaceExisting`: optional. Allows the same plugin to replace its own existing route registration.
638
- - `handler`: return `true` when the route handled the request.
639
-
640
- Notes:
641
-
642
- - `api.registerHttpHandler(...)` was removed and will cause a plugin-load error. Use `api.registerHttpRoute(...)` instead.
643
- - Plugin routes must declare `auth` explicitly.
644
- - Exact `path + match` conflicts are rejected unless `replaceExisting: true`, and one plugin cannot replace another plugin's route.
645
- - Overlapping routes with different `auth` levels are rejected. Keep `exact`/`prefix` fallthrough chains on the same auth level only.
646
- - `auth: "plugin"` routes do **not** receive operator runtime scopes automatically. They are for plugin-managed webhooks/signature verification, not privileged Gateway helper calls.
647
- - `auth: "gateway"` routes run inside a Gateway request runtime scope, but that scope is intentionally conservative:
648
- - shared-secret bearer auth (`gateway.auth.mode = "token"` / `"password"`) keeps plugin-route runtime scopes pinned to `operator.write`, even if the caller sends `x-fengming-scopes`
649
- - trusted identity-bearing HTTP modes (for example `trusted-proxy` or `gateway.auth.mode = "none"` on a private ingress) honor `x-fengming-scopes` only when the header is explicitly present
650
- - if `x-fengming-scopes` is absent on those identity-bearing plugin-route requests, runtime scope falls back to `operator.write`
651
- - Practical rule: do not assume a gateway-auth plugin route is an implicit admin surface. If your route needs admin-only behavior, require an identity-bearing auth mode and document the explicit `x-fengming-scopes` header contract.
652
-
653
- ## Plugin SDK import paths
654
-
655
- Use narrow SDK subpaths instead of the monolithic `fengming/plugin-sdk` root
656
- barrel when authoring new plugins. Core subpaths:
657
-
658
- | Subpath | Purpose |
659
- | ----------------------------------- | -------------------------------------------------- |
660
- | `fengming/plugin-sdk/plugin-entry` | Plugin registration primitives |
661
- | `fengming/plugin-sdk/channel-core` | Channel entry/build helpers |
662
- | `fengming/plugin-sdk/core` | Generic shared helpers and umbrella contract |
663
- | `fengming/plugin-sdk/config-schema` | Root `fengming.json` Zod schema (`FengMingSchema`) |
664
-
665
- Channel plugins pick from a family of narrow seams — `channel-setup`,
666
- `setup-runtime`, `setup-tools`, `channel-pairing`,
667
- `channel-contract`, `channel-feedback`, `channel-inbound`, `channel-outbound`,
668
- `command-auth`, `secret-input`, `webhook-ingress`,
669
- `channel-targets`, and `channel-actions`. Approval behavior should consolidate
670
- on one `approvalCapability` contract rather than mixing across unrelated
671
- plugin fields. See [Channel plugins](/plugins/sdk-channel-plugins).
672
-
673
- Runtime and config helpers live under matching focused `*-runtime` subpaths
674
- (`approval-runtime`, `agent-runtime`, `lazy-runtime`, `directory-runtime`,
675
- `text-runtime`, `runtime-store`, `system-event-runtime`, `heartbeat-runtime`,
676
- `channel-activity-runtime`, etc.). Prefer `config-contracts`,
677
- `plugin-config-runtime`, `runtime-config-snapshot`, and `config-mutation`
678
- instead of the broad `config-runtime` compatibility barrel.
679
-
680
- <Info>
681
- `fengming/plugin-sdk/channel-runtime`, `fengming/plugin-sdk/channel-lifecycle`,
682
- small channel helper facades, `fengming/plugin-sdk/outbound-runtime`,
683
- `fengming/plugin-sdk/outbound-send-deps`, `fengming/plugin-sdk/config-runtime`,
684
- and `fengming/plugin-sdk/infra-runtime` are deprecated compatibility shims for
685
- older plugins. New code should import narrower generic primitives instead.
686
- </Info>
687
-
688
- Repo-internal entry points (per bundled plugin package root):
689
-
690
- - `index.js` — bundled plugin entry
691
- - `api.js` — helper/types barrel
692
- - `runtime-api.js` — runtime-only barrel
693
- - `setup-entry.js` — setup plugin entry
694
-
695
- External plugins should only import `fengming/plugin-sdk/*` subpaths. Never
696
- import another plugin package's `src/*` from core or from another plugin.
697
- Facade-loaded entry points prefer the active runtime config snapshot when one
698
- exists, then fall back to the resolved config file on disk.
699
-
700
- Capability-specific subpaths such as `image-generation`, `media-understanding`,
701
- and `speech` exist because bundled plugins use them today. They are not
702
- automatically long-term frozen external contracts — check the relevant SDK
703
- reference page when relying on them.
704
-
705
- ## Message tool schemas
706
-
707
- Plugins should own channel-specific `describeMessageTool(...)` schema
708
- contributions for non-message primitives such as reactions, reads, and polls.
709
- Shared send presentation should use the generic `MessagePresentation` contract
710
- instead of provider-native button, component, block, or card fields.
711
- See [Message Presentation](/plugins/message-presentation) for the contract,
712
- fallback rules, provider mapping, and plugin author checklist.
713
-
714
- Send-capable plugins declare what they can render through message capabilities:
715
-
716
- - `presentation` for semantic presentation blocks (`text`, `context`, `divider`, `buttons`, `select`)
717
- - `delivery-pin` for pinned-delivery requests
718
-
719
- Core decides whether to render the presentation natively or degrade it to text.
720
- Do not expose provider-native UI escape hatches from the generic message tool.
721
- Deprecated SDK helpers for legacy native schemas remain exported for existing
722
- third-party plugins, but new plugins should not use them.
723
-
724
- ## Channel target resolution
725
-
726
- Channel plugins should own channel-specific target semantics. Keep the shared
727
- outbound host generic and use the messaging adapter surface for provider rules:
728
-
729
- - `messaging.inferTargetChatType({ to })` decides whether a normalized target
730
- should be treated as `direct`, `group`, or `channel` before directory lookup.
731
- - `messaging.targetResolver.looksLikeId(raw, normalized)` tells core whether an
732
- input should skip straight to id-like resolution instead of directory search.
733
- - `messaging.targetResolver.resolveTarget(...)` is the plugin fallback when
734
- core needs a final provider-owned resolution after normalization or after a
735
- directory miss.
736
- - `messaging.resolveOutboundSessionRoute(...)` owns provider-specific session
737
- route construction once a target is resolved.
738
-
739
- Recommended split:
740
-
741
- - Use `inferTargetChatType` for category decisions that should happen before
742
- searching peers/groups.
743
- - Use `looksLikeId` for "treat this as an explicit/native target id" checks.
744
- - Use `resolveTarget` for provider-specific normalization fallback, not for
745
- broad directory search.
746
- - Keep provider-native ids like chat ids, thread ids, JIDs, handles, and room
747
- ids inside `target` values or provider-specific params, not in generic SDK
748
- fields.
749
-
750
- ## Config-backed directories
751
-
752
- Plugins that derive directory entries from config should keep that logic in the
753
- plugin and reuse the shared helpers from
754
- `fengming/plugin-sdk/directory-runtime`.
755
-
756
- Use this when a channel needs config-backed peers/groups such as:
757
-
758
- - allowlist-driven DM peers
759
- - configured channel/group maps
760
- - account-scoped static directory fallbacks
761
-
762
- The shared helpers in `directory-runtime` only handle generic operations:
763
-
764
- - query filtering
765
- - limit application
766
- - deduping/normalization helpers
767
- - building `ChannelDirectoryEntry[]`
768
-
769
- Channel-specific account inspection and id normalization should stay in the
770
- plugin implementation.
771
-
772
- ## Provider catalogs
773
-
774
- Provider plugins can define model catalogs for inference with
775
- `registerProvider({ catalog: { run(...) { ... } } })`.
776
-
777
- `catalog.run(...)` returns the same shape FengMing writes into
778
- `models.providers`:
779
-
780
- - `{ provider }` for one provider entry
781
- - `{ providers }` for multiple provider entries
782
-
783
- Use `catalog` when the plugin owns provider-specific model ids, base URL
784
- defaults, or auth-gated model metadata.
785
-
786
- `catalog.order` controls when a plugin's catalog merges relative to FengMing's
787
- built-in implicit providers:
788
-
789
- - `simple`: plain API-key or env-driven providers
790
- - `profile`: providers that appear when auth profiles exist
791
- - `paired`: providers that synthesize multiple related provider entries
792
- - `late`: last pass, after other implicit providers
793
-
794
- Later providers win on key collision, so plugins can intentionally override a
795
- built-in provider entry with the same provider id.
796
-
797
- Plugins can also publish read-only model rows through
798
- `api.registerModelCatalogProvider({ provider, kinds, staticCatalog, liveCatalog
799
- })`. This is the forward path for list/help/picker surfaces and supports
800
- `text`, `image_generation`, `video_generation`, and `music_generation` rows.
801
- Provider plugins still own live endpoint calls, token exchange, and vendor
802
- response mapping; core owns the common row shape, source labels, and media tool
803
- help formatting. Media-generation provider registrations synthesize static
804
- catalog rows automatically from `defaultModel`, `models`, and `capabilities`.
805
-
806
- Compatibility:
807
-
808
- - `discovery` still works as a legacy alias, but emits a deprecation warning
809
- - if both `catalog` and `discovery` are registered, FengMing uses `catalog`
810
- - `augmentModelCatalog` is deprecated; bundled providers should publish
811
- supplemental rows through `registerModelCatalogProvider`
812
-
813
- ## Read-only channel inspection
814
-
815
- If your plugin registers a channel, prefer implementing
816
- `plugin.config.inspectAccount(cfg, accountId)` alongside `resolveAccount(...)`.
817
-
818
- Why:
819
-
820
- - `resolveAccount(...)` is the runtime path. It is allowed to assume credentials
821
- are fully materialized and can fail fast when required secrets are missing.
822
- - Read-only command paths such as `fengming status`, `fengming status --all`,
823
- `fengming channels status`, `fengming channels resolve`, and doctor/config
824
- repair flows should not need to materialize runtime credentials just to
825
- describe configuration.
826
-
827
- Recommended `inspectAccount(...)` behavior:
828
-
829
- - Return descriptive account state only.
830
- - Preserve `enabled` and `configured`.
831
- - Include credential source/status fields when relevant, such as:
832
- - `tokenSource`, `tokenStatus`
833
- - `botTokenSource`, `botTokenStatus`
834
- - `appTokenSource`, `appTokenStatus`
835
- - `signingSecretSource`, `signingSecretStatus`
836
- - You do not need to return raw token values just to report read-only
837
- availability. Returning `tokenStatus: "available"` (and the matching source
838
- field) is enough for status-style commands.
839
- - Use `configured_unavailable` when a credential is configured via SecretRef but
840
- unavailable in the current command path.
841
-
842
- This lets read-only commands report "configured but unavailable in this command
843
- path" instead of crashing or misreporting the account as not configured.
844
-
845
- ## Package packs
846
-
847
- A plugin directory may include a `package.json` with `fengming.extensions`:
848
-
849
- ```json
850
- {
851
- "name": "my-pack",
852
- "fengming": {
853
- "extensions": ["./src/safety.ts", "./src/tools.ts"],
854
- "setupEntry": "./src/setup-entry.ts"
855
- }
856
- }
857
- ```
858
-
859
- Each entry becomes a plugin. If the pack lists multiple extensions, the plugin id
860
- becomes `name/<fileBase>`.
861
-
862
- If your plugin imports npm deps, install them in that directory so
863
- `node_modules` is available (`npm install` / `pnpm install`).
864
-
865
- Security guardrail: every `fengming.extensions` entry must stay inside the plugin
866
- directory after symlink resolution. Entries that escape the package directory are
867
- rejected.
868
-
869
- Security note: `fengming plugins install` installs plugin dependencies with a
870
- project-local `npm install --omit=dev --ignore-scripts` (no lifecycle scripts,
871
- no dev dependencies at runtime), ignoring inherited global npm install settings.
872
- Keep plugin dependency trees "pure JS/TS" and avoid packages that require
873
- `postinstall` builds.
874
-
875
- Optional: `fengming.setupEntry` can point at a lightweight setup-only module.
876
- When FengMing needs setup surfaces for a disabled channel plugin, or
877
- when a channel plugin is enabled but still unconfigured, it loads `setupEntry`
878
- instead of the full plugin entry. This keeps startup and setup lighter
879
- when your main plugin entry also wires tools, hooks, or other runtime-only
880
- code.
881
-
882
- Optional: `fengming.startup.deferConfiguredChannelFullLoadUntilAfterListen`
883
- can opt a channel plugin into the same `setupEntry` path during the gateway's
884
- pre-listen startup phase, even when the channel is already configured.
885
-
886
- Use this only when `setupEntry` fully covers the startup surface that must exist
887
- before the gateway starts listening. In practice, that means the setup entry
888
- must register every channel-owned capability that startup depends on, such as:
889
-
890
- - channel registration itself
891
- - any HTTP routes that must be available before the gateway starts listening
892
- - any gateway methods, tools, or services that must exist during that same window
893
-
894
- If your full entry still owns any required startup capability, do not enable
895
- this flag. Keep the plugin on the default behavior and let FengMing load the
896
- full entry during startup.
897
-
898
- Bundled channels can also publish setup-only contract-surface helpers that core
899
- can consult before the full channel runtime is loaded. The current setup
900
- promotion surface is:
901
-
902
- - `singleAccountKeysToMove`
903
- - `namedAccountPromotionKeys`
904
- - `resolveSingleAccountPromotionTarget(...)`
905
-
906
- Core uses that surface when it needs to promote a legacy single-account channel
907
- config into `channels.<id>.accounts.*` without loading the full plugin entry.
908
- Matrix is the current bundled example: it moves only auth/bootstrap keys into a
909
- named promoted account when named accounts already exist, and it can preserve a
910
- configured non-canonical default-account key instead of always creating
911
- `accounts.default`.
912
-
913
- Those setup patch adapters keep bundled contract-surface discovery lazy. Import
914
- time stays light; the promotion surface is loaded only on first use instead of
915
- re-entering bundled channel startup on module import.
916
-
917
- When those startup surfaces include gateway RPC methods, keep them on a
918
- plugin-specific prefix. Core admin namespaces (`config.*`,
919
- `exec.approvals.*`, `wizard.*`, `update.*`) remain reserved and always resolve
920
- to `operator.admin`, even if a plugin requests a narrower scope.
921
-
922
- Example:
923
-
924
- ```json
925
- {
926
- "name": "@scope/my-channel",
927
- "fengming": {
928
- "extensions": ["./index.ts"],
929
- "setupEntry": "./setup-entry.ts",
930
- "startup": {
931
- "deferConfiguredChannelFullLoadUntilAfterListen": true
932
- }
933
- }
934
- }
935
- ```
936
-
937
- ### Channel catalog metadata
938
-
939
- Channel plugins can advertise setup/discovery metadata via `fengming.channel` and
940
- install hints via `fengming.install`. This keeps the core catalog data-free.
941
-
942
- Example:
943
-
944
- ```json
945
- {
946
- "name": "@fengming/nextcloud-talk",
947
- "fengming": {
948
- "extensions": ["./index.ts"],
949
- "channel": {
950
- "id": "nextcloud-talk",
951
- "label": "Nextcloud Talk",
952
- "selectionLabel": "Nextcloud Talk (self-hosted)",
953
- "docsPath": "/channels/nextcloud-talk",
954
- "docsLabel": "nextcloud-talk",
955
- "blurb": "Self-hosted chat via Nextcloud Talk webhook bots.",
956
- "order": 65,
957
- "aliases": ["nc-talk", "nc"]
958
- },
959
- "install": {
960
- "npmSpec": "@fengming/nextcloud-talk",
961
- "localPath": "<bundled-plugin-local-path>",
962
- "defaultChoice": "npm"
963
- }
964
- }
965
- }
966
- ```
967
-
968
- Useful `fengming.channel` fields beyond the minimal example:
969
-
970
- - `detailLabel`: secondary label for richer catalog/status surfaces
971
- - `docsLabel`: override link text for the docs link
972
- - `preferOver`: lower-priority plugin/channel ids this catalog entry should outrank
973
- - `selectionDocsPrefix`, `selectionDocsOmitLabel`, `selectionExtras`: selection-surface copy controls
974
- - `markdownCapable`: marks the channel as markdown-capable for outbound formatting decisions
975
- - `exposure.configured`: hide the channel from configured-channel listing surfaces when set to `false`
976
- - `exposure.setup`: hide the channel from interactive setup/configure pickers when set to `false`
977
- - `exposure.docs`: mark the channel as internal/private for docs navigation surfaces
978
- - `showConfigured` / `showInSetup`: legacy aliases still accepted for compatibility; prefer `exposure`
979
- - `quickstartAllowFrom`: opt the channel into the standard quickstart `allowFrom` flow
980
- - `forceAccountBinding`: require explicit account binding even when only one account exists
981
- - `preferSessionLookupForAnnounceTarget`: prefer session lookup when resolving announce targets
982
-
983
- FengMing can also merge **external channel catalogs** (for example, an MPM
984
- registry export). Drop a JSON file at one of:
985
-
986
- - `~/.fengming/mpm/plugins.json`
987
- - `~/.fengming/mpm/catalog.json`
988
- - `~/.fengming/plugins/catalog.json`
989
-
990
- Or point `FENGMING_PLUGIN_CATALOG_PATHS` (or `FENGMING_MPM_CATALOG_PATHS`) at
991
- one or more JSON files (comma/semicolon/`PATH`-delimited). Each file should
992
- contain `{ "entries": [ { "name": "@scope/pkg", "fengming": { "channel": {...}, "install": {...} } } ] }`. The parser also accepts `"packages"` or `"plugins"` as legacy aliases for the `"entries"` key.
993
-
994
- Generated channel catalog entries and provider install catalog entries expose
995
- normalized install-source facts next to the raw `fengming.install` block. The
996
- normalized facts identify whether the npm spec is an exact version or floating
997
- selector, whether expected integrity metadata is present, and whether a local
998
- source path is also available. When the catalog/package identity is known, the
999
- normalized facts warn if the parsed npm package name drifts from that identity.
1000
- They also warn when `defaultChoice` is invalid or points at a source that is
1001
- not available, and when npm integrity metadata is present without a valid npm
1002
- source. Consumers should treat `installSource` as an additive optional field so
1003
- hand-built entries and catalog shims do not have to synthesize it.
1004
- This lets onboarding and diagnostics explain source-plane state without
1005
- importing plugin runtime.
1006
-
1007
- Official external npm entries should prefer an exact `npmSpec` plus
1008
- `expectedIntegrity`. Bare package names and dist-tags still work for
1009
- compatibility, but they surface source-plane warnings so the catalog can move
1010
- toward pinned, integrity-checked installs without breaking existing plugins.
1011
- When onboarding installs from a local catalog path, it records a managed plugin
1012
- plugin index entry with `source: "path"` and a workspace-relative
1013
- `sourcePath` when possible. The absolute operational load path stays in
1014
- `plugins.load.paths`; the install record avoids duplicating local workstation
1015
- paths into long-lived config. This keeps local development installs visible to
1016
- source-plane diagnostics without adding a second raw filesystem-path disclosure
1017
- surface. The persisted `plugins/installs.json` plugin index is the install
1018
- source of truth and can be refreshed without loading plugin runtime modules.
1019
- Its `installRecords` map is durable even when a plugin manifest is missing or
1020
- invalid; its `plugins` array is a rebuildable manifest view.
1021
-
1022
- ## Context engine plugins
1023
-
1024
- Context engine plugins own session context orchestration for ingest, assembly,
1025
- and compaction. Register them from your plugin with
1026
- `api.registerContextEngine(id, factory)`, then select the active engine with
1027
- `plugins.slots.contextEngine`.
1028
-
1029
- Use this when your plugin needs to replace or extend the default context
1030
- pipeline rather than just add memory search or hooks.
1031
-
1032
- ```ts
1033
- import { buildMemorySystemPromptAddition } from "fengming/plugin-sdk/core";
1034
-
1035
- export default function (api) {
1036
- api.registerContextEngine("lossless-claw", (ctx) => ({
1037
- info: { id: "lossless-claw", name: "Lossless Claw", ownsCompaction: true },
1038
- async ingest() {
1039
- return { ingested: true };
1040
- },
1041
- async assemble({ messages, availableTools, citationsMode }) {
1042
- return {
1043
- messages,
1044
- estimatedTokens: 0,
1045
- systemPromptAddition: buildMemorySystemPromptAddition({
1046
- availableTools: availableTools ?? new Set(),
1047
- citationsMode,
1048
- }),
1049
- };
1050
- },
1051
- async compact() {
1052
- return { ok: true, compacted: false };
1053
- },
1054
- }));
1055
- }
1056
- ```
1057
-
1058
- The factory `ctx` exposes optional `config`, `agentDir`, and `workspaceDir`
1059
- values for construction-time initialization.
1060
-
1061
- `assemble()` may return `contextProjection` when the active harness has a
1062
- persistent backend thread. Omit it for legacy per-turn projection. Return
1063
- `{ mode: "thread_bootstrap", epoch }` when the assembled context should be
1064
- injected once into a backend thread and reused until the epoch changes. Change
1065
- the epoch after the engine's semantic context changes, such as after an
1066
- engine-owned compaction pass. Hosts may preserve tool-call metadata, input
1067
- shape, and redacted tool results in a thread-bootstrap projection so fresh
1068
- backend threads retain tool continuity without copying raw secret-bearing
1069
- payloads.
1070
-
1071
- If your engine does **not** own the compaction algorithm, keep `compact()`
1072
- implemented and delegate it explicitly:
1073
-
1074
- ```ts
1075
- import {
1076
- buildMemorySystemPromptAddition,
1077
- delegateCompactionToRuntime,
1078
- } from "fengming/plugin-sdk/core";
1079
-
1080
- export default function (api) {
1081
- api.registerContextEngine("my-memory-engine", (ctx) => ({
1082
- info: {
1083
- id: "my-memory-engine",
1084
- name: "My Memory Engine",
1085
- ownsCompaction: false,
1086
- },
1087
- async ingest() {
1088
- return { ingested: true };
1089
- },
1090
- async assemble({ messages, availableTools, citationsMode }) {
1091
- return {
1092
- messages,
1093
- estimatedTokens: 0,
1094
- systemPromptAddition: buildMemorySystemPromptAddition({
1095
- availableTools: availableTools ?? new Set(),
1096
- citationsMode,
1097
- }),
1098
- };
1099
- },
1100
- async compact(params) {
1101
- return await delegateCompactionToRuntime(params);
1102
- },
1103
- }));
1104
- }
1105
- ```
1106
-
1107
- ## Adding a new capability
1108
-
1109
- When a plugin needs behavior that does not fit the current API, do not bypass
1110
- the plugin system with a private reach-in. Add the missing capability.
1111
-
1112
- Recommended sequence:
1113
-
1114
- 1. define the core contract
1115
- Decide what shared behavior core should own: policy, fallback, config merge,
1116
- lifecycle, channel-facing semantics, and runtime helper shape.
1117
- 2. add typed plugin registration/runtime surfaces
1118
- Extend `FengMingPluginApi` and/or `api.runtime` with the smallest useful
1119
- typed capability surface.
1120
- 3. wire core + channel/feature consumers
1121
- Channels and feature plugins should consume the new capability through core,
1122
- not by importing a vendor implementation directly.
1123
- 4. register vendor implementations
1124
- Vendor plugins then register their backends against the capability.
1125
- 5. add contract coverage
1126
- Add tests so ownership and registration shape stay explicit over time.
1127
-
1128
- This is how FengMing stays opinionated without becoming hardcoded to one
1129
- provider's worldview. See the [Capability Cookbook](/tools/capability-cookbook)
1130
- for a concrete file checklist and worked example.
1131
-
1132
- ### Capability checklist
1133
-
1134
- When you add a new capability, the implementation should usually touch these
1135
- surfaces together:
1136
-
1137
- - core contract types in `src/<capability>/types.ts`
1138
- - core runner/runtime helper in `src/<capability>/runtime.ts`
1139
- - plugin API registration surface in `src/plugins/types.ts`
1140
- - plugin registry wiring in `src/plugins/registry.ts`
1141
- - plugin runtime exposure in `src/plugins/runtime/*` when feature/channel
1142
- plugins need to consume it
1143
- - capture/test helpers in `src/test-utils/plugin-registration.ts`
1144
- - ownership/contract assertions in `src/plugins/contracts/registry.ts`
1145
- - operator/plugin docs in `docs/`
1146
-
1147
- If one of those surfaces is missing, that is usually a sign the capability is
1148
- not fully integrated yet.
1149
-
1150
- ### Capability template
1151
-
1152
- Minimal pattern:
1153
-
1154
- ```ts
1155
- // core contract
1156
- export type VideoGenerationProviderPlugin = {
1157
- id: string;
1158
- label: string;
1159
- generateVideo: (req: VideoGenerationRequest) => Promise<VideoGenerationResult>;
1160
- };
1161
-
1162
- // plugin API
1163
- api.registerVideoGenerationProvider({
1164
- id: "openai",
1165
- label: "OpenAI",
1166
- async generateVideo(req) {
1167
- return await generateOpenAiVideo(req);
1168
- },
1169
- });
1170
-
1171
- // shared runtime helper for feature/channel plugins
1172
- const clip = await api.runtime.videoGeneration.generate({
1173
- prompt: "Show the robot walking through the lab.",
1174
- cfg,
1175
- });
1176
- ```
1177
-
1178
- Contract test pattern:
1179
-
1180
- ```ts
1181
- expect(findVideoGenerationProviderIdsForPlugin("openai")).toEqual(["openai"]);
1182
- ```
1183
-
1184
- That keeps the rule simple:
1185
-
1186
- - core owns the capability contract + orchestration
1187
- - vendor plugins own vendor implementations
1188
- - feature/channel plugins consume runtime helpers
1189
- - contract tests keep ownership explicit
1190
-
1191
- ## Related
1192
-
1193
- - [Plugin architecture](/plugins/architecture) — public capability model and shapes
1194
- - [Plugin SDK subpaths](/plugins/sdk-subpaths)
1195
- - [Plugin SDK setup](/plugins/sdk-setup)
1196
- - [Building plugins](/plugins/building-plugins)