fengming 0.3.10 → 0.3.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (761) hide show
  1. package/dist/build-info.json +2 -2
  2. package/dist/canvas-host/a2ui/.bundle.hash +1 -1
  3. package/dist/cli-startup-metadata.json +8 -8
  4. package/dist/control-ui/assets/{activity-D-mnRThU.js → activity-wgT0-JR0.js} +2 -2
  5. package/dist/control-ui/assets/{agents-U_KSP5I_.js → agents-DG5PobrT.js} +2 -2
  6. package/dist/control-ui/assets/{channels-ohK9_G1O.js → channels-CX28oM42.js} +2 -2
  7. package/dist/control-ui/assets/{cron-6ZCzfU29.js → cron-B8ixwBqU.js} +2 -2
  8. package/dist/control-ui/assets/{debug-CSsDLg_s.js → debug-CnkYZUXy.js} +2 -2
  9. package/dist/control-ui/assets/{index-jUDczxhd.js → index-DQRZJKbO.js} +4 -4
  10. package/dist/control-ui/assets/{instances-782ZoDT4.js → instances-BE3mV1JC.js} +2 -2
  11. package/dist/control-ui/assets/{nodes-BMX16BKM.js → nodes-Cou4PWRX.js} +2 -2
  12. package/dist/control-ui/assets/{sessions-jLGSApYa.js → sessions-DpAaBT21.js} +2 -2
  13. package/dist/control-ui/assets/{skills-DweBwUhs.js → skills-DjA_j_20.js} +2 -2
  14. package/dist/control-ui/assets/{workboard-BsU-FXIo.js → workboard-BFnvbS0k.js} +2 -2
  15. package/dist/control-ui/index.html +1 -1
  16. package/dist/control-ui/sw.js +1 -1
  17. package/dist/gateway/protocol/index.d.ts +1 -1
  18. package/dist/{index-AZzJCgph.d.ts → index-DuDY3bCZ.d.ts} +2 -2
  19. package/dist/plugin-sdk/.boundary-entry-shims.stamp +1 -1
  20. package/dist/plugin-sdk/agent-config-primitives.d.ts +1 -1
  21. package/dist/plugin-sdk/{bundled-channel-config-schema-Dfn3b8sF.d.ts → bundled-channel-config-schema-BPFNnbwu.d.ts} +23 -23
  22. package/dist/plugin-sdk/bundled-channel-config-schema.d.ts +3 -3
  23. package/dist/plugin-sdk/channel-config-primitives.d.ts +2 -2
  24. package/dist/plugin-sdk/channel-config-schema-legacy.d.ts +3 -3
  25. package/dist/plugin-sdk/channel-config-schema.d.ts +2 -2
  26. package/dist/plugin-sdk/channel-core.d.ts +1 -1
  27. package/dist/plugin-sdk/channel-plugin-common.d.ts +1 -1
  28. package/dist/plugin-sdk/compat.d.ts +2 -2
  29. package/dist/plugin-sdk/{config-schema-DUddICQM.d.ts → config-schema-D7cABQ6o.d.ts} +1 -1
  30. package/dist/plugin-sdk/config-schema.d.ts +2 -2
  31. package/dist/plugin-sdk/core.d.ts +1 -1
  32. package/dist/plugin-sdk/discord.d.ts +2 -2
  33. package/dist/plugin-sdk/tts-runtime.d.ts +1 -1
  34. package/dist/plugin-sdk/{zod-schema.core-B4_b2R5K.d.ts → zod-schema.core-CwBNqcXp.d.ts} +1 -1
  35. package/package.json +4 -409
  36. package/CHANGELOG.md +0 -42
  37. package/THIRD_PARTY_NOTICES.md +0 -37
  38. package/docs/.i18n/README.md +0 -81
  39. package/docs/.i18n/ar-navigation.json +0 -18
  40. package/docs/.i18n/de-navigation.json +0 -18
  41. package/docs/.i18n/es-navigation.json +0 -18
  42. package/docs/.i18n/fr-navigation.json +0 -18
  43. package/docs/.i18n/glossary.ar.json +0 -78
  44. package/docs/.i18n/glossary.de.json +0 -78
  45. package/docs/.i18n/glossary.es.json +0 -78
  46. package/docs/.i18n/glossary.fa.json +0 -78
  47. package/docs/.i18n/glossary.fr.json +0 -78
  48. package/docs/.i18n/glossary.id.json +0 -78
  49. package/docs/.i18n/glossary.it.json +0 -78
  50. package/docs/.i18n/glossary.ja-JP.json +0 -98
  51. package/docs/.i18n/glossary.ko.json +0 -78
  52. package/docs/.i18n/glossary.nl.json +0 -78
  53. package/docs/.i18n/glossary.pl.json +0 -78
  54. package/docs/.i18n/glossary.pt-BR.json +0 -78
  55. package/docs/.i18n/glossary.th.json +0 -78
  56. package/docs/.i18n/glossary.tr.json +0 -78
  57. package/docs/.i18n/glossary.uk.json +0 -78
  58. package/docs/.i18n/glossary.vi.json +0 -78
  59. package/docs/.i18n/glossary.zh-CN.json +0 -1122
  60. package/docs/.i18n/glossary.zh-TW.json +0 -78
  61. package/docs/.i18n/id-navigation.json +0 -18
  62. package/docs/.i18n/it-navigation.json +0 -18
  63. package/docs/.i18n/ja-navigation.json +0 -18
  64. package/docs/.i18n/ko-navigation.json +0 -18
  65. package/docs/.i18n/pl-navigation.json +0 -18
  66. package/docs/.i18n/pt-BR-navigation.json +0 -18
  67. package/docs/.i18n/tr-navigation.json +0 -18
  68. package/docs/.i18n/translation-workflow.md +0 -111
  69. package/docs/.i18n/zh-Hans-navigation.json +0 -552
  70. package/docs/AGENTS.md +0 -36
  71. package/docs/CLAUDE.md +0 -1
  72. package/docs/agent-runtime-architecture.md +0 -48
  73. package/docs/announcements/bluebubbles-imessage.md +0 -79
  74. package/docs/auth-credential-semantics.md +0 -124
  75. package/docs/automation/auth-monitoring.md +0 -11
  76. package/docs/automation/clawflow.md +0 -12
  77. package/docs/automation/cron-jobs.md +0 -534
  78. package/docs/automation/cron-vs-heartbeat.md +0 -11
  79. package/docs/automation/gmail-pubsub.md +0 -11
  80. package/docs/automation/hooks.md +0 -387
  81. package/docs/automation/index.md +0 -135
  82. package/docs/automation/poll.md +0 -12
  83. package/docs/automation/standing-orders.md +0 -250
  84. package/docs/automation/taskflow.md +0 -155
  85. package/docs/automation/tasks.md +0 -374
  86. package/docs/automation/troubleshooting.md +0 -12
  87. package/docs/automation/webhook.md +0 -12
  88. package/docs/brave-search.md +0 -11
  89. package/docs/channels/access-groups.md +0 -201
  90. package/docs/channels/ambient-room-events.md +0 -214
  91. package/docs/channels/bot-loop-protection.md +0 -131
  92. package/docs/channels/broadcast-groups.md +0 -472
  93. package/docs/channels/channel-routing.md +0 -162
  94. package/docs/channels/clickclack.md +0 -138
  95. package/docs/channels/discord.md +0 -1758
  96. package/docs/channels/feishu.md +0 -650
  97. package/docs/channels/googlechat.md +0 -284
  98. package/docs/channels/group-messages.md +0 -95
  99. package/docs/channels/groups.md +0 -524
  100. package/docs/channels/imessage-from-bluebubbles.md +0 -259
  101. package/docs/channels/imessage.md +0 -839
  102. package/docs/channels/index.md +0 -64
  103. package/docs/channels/irc.md +0 -253
  104. package/docs/channels/line.md +0 -243
  105. package/docs/channels/location.md +0 -71
  106. package/docs/channels/matrix-migration.md +0 -370
  107. package/docs/channels/matrix-presentation.md +0 -77
  108. package/docs/channels/matrix-push-rules.md +0 -150
  109. package/docs/channels/matrix.md +0 -921
  110. package/docs/channels/mattermost.md +0 -542
  111. package/docs/channels/msteams.md +0 -1096
  112. package/docs/channels/nextcloud-talk.md +0 -176
  113. package/docs/channels/nostr.md +0 -253
  114. package/docs/channels/pairing.md +0 -214
  115. package/docs/channels/qqbot.md +0 -314
  116. package/docs/channels/signal.md +0 -417
  117. package/docs/channels/slack.md +0 -1623
  118. package/docs/channels/synology-chat.md +0 -187
  119. package/docs/channels/telegram.md +0 -1124
  120. package/docs/channels/tlon.md +0 -296
  121. package/docs/channels/troubleshooting.md +0 -162
  122. package/docs/channels/twitch.md +0 -431
  123. package/docs/channels/wechat.md +0 -171
  124. package/docs/channels/whatsapp.md +0 -796
  125. package/docs/channels/yuanbao.md +0 -416
  126. package/docs/channels/zalo.md +0 -253
  127. package/docs/channels/zalouser.md +0 -217
  128. package/docs/ci.md +0 -657
  129. package/docs/clawhub/publishing.md +0 -96
  130. package/docs/cli/acp.md +0 -370
  131. package/docs/cli/agent.md +0 -109
  132. package/docs/cli/agents.md +0 -253
  133. package/docs/cli/approvals.md +0 -190
  134. package/docs/cli/backup.md +0 -98
  135. package/docs/cli/browser.md +0 -307
  136. package/docs/cli/channels.md +0 -154
  137. package/docs/cli/clawbot.md +0 -25
  138. package/docs/cli/commitments.md +0 -90
  139. package/docs/cli/completion.md +0 -39
  140. package/docs/cli/config.md +0 -504
  141. package/docs/cli/configure.md +0 -77
  142. package/docs/cli/crestodian.md +0 -337
  143. package/docs/cli/cron.md +0 -304
  144. package/docs/cli/daemon.md +0 -67
  145. package/docs/cli/dashboard.md +0 -33
  146. package/docs/cli/devices.md +0 -240
  147. package/docs/cli/directory.md +0 -68
  148. package/docs/cli/dns.md +0 -53
  149. package/docs/cli/docs.md +0 -63
  150. package/docs/cli/doctor.md +0 -241
  151. package/docs/cli/flows.md +0 -52
  152. package/docs/cli/gateway.md +0 -572
  153. package/docs/cli/health.md +0 -43
  154. package/docs/cli/hooks.md +0 -345
  155. package/docs/cli/index.md +0 -400
  156. package/docs/cli/infer.md +0 -364
  157. package/docs/cli/logs.md +0 -68
  158. package/docs/cli/mcp.md +0 -529
  159. package/docs/cli/memory.md +0 -183
  160. package/docs/cli/message.md +0 -317
  161. package/docs/cli/migrate.md +0 -334
  162. package/docs/cli/models.md +0 -239
  163. package/docs/cli/node.md +0 -177
  164. package/docs/cli/nodes.md +0 -76
  165. package/docs/cli/onboard.md +0 -250
  166. package/docs/cli/pairing.md +0 -77
  167. package/docs/cli/path.md +0 -511
  168. package/docs/cli/plugins.md +0 -459
  169. package/docs/cli/policy.md +0 -886
  170. package/docs/cli/proxy.md +0 -89
  171. package/docs/cli/qr.md +0 -56
  172. package/docs/cli/reset.md +0 -39
  173. package/docs/cli/sandbox.md +0 -208
  174. package/docs/cli/secrets.md +0 -202
  175. package/docs/cli/security.md +0 -136
  176. package/docs/cli/sessions.md +0 -164
  177. package/docs/cli/setup.md +0 -59
  178. package/docs/cli/skills.md +0 -122
  179. package/docs/cli/status.md +0 -45
  180. package/docs/cli/system.md +0 -89
  181. package/docs/cli/tasks.md +0 -111
  182. package/docs/cli/transcripts.md +0 -151
  183. package/docs/cli/tui.md +0 -91
  184. package/docs/cli/uninstall.md +0 -44
  185. package/docs/cli/update.md +0 -243
  186. package/docs/cli/voicecall.md +0 -204
  187. package/docs/cli/webhooks.md +0 -117
  188. package/docs/cli/wiki.md +0 -256
  189. package/docs/concepts/active-memory.md +0 -856
  190. package/docs/concepts/agent-loop.md +0 -185
  191. package/docs/concepts/agent-runtimes.md +0 -276
  192. package/docs/concepts/agent-workspace.md +0 -230
  193. package/docs/concepts/agent.md +0 -140
  194. package/docs/concepts/architecture.md +0 -154
  195. package/docs/concepts/channel-docking.md +0 -145
  196. package/docs/concepts/commitments.md +0 -150
  197. package/docs/concepts/compaction.md +0 -203
  198. package/docs/concepts/context-engine.md +0 -347
  199. package/docs/concepts/context.md +0 -199
  200. package/docs/concepts/delegate-architecture.md +0 -319
  201. package/docs/concepts/dreaming.md +0 -264
  202. package/docs/concepts/experimental-features.md +0 -109
  203. package/docs/concepts/features.md +0 -91
  204. package/docs/concepts/fengming-sdk.md +0 -323
  205. package/docs/concepts/mantis-slack-desktop-runbook.md +0 -231
  206. package/docs/concepts/mantis.md +0 -744
  207. package/docs/concepts/markdown-formatting.md +0 -139
  208. package/docs/concepts/memory-builtin.md +0 -148
  209. package/docs/concepts/memory-honcho.md +0 -144
  210. package/docs/concepts/memory-qmd.md +0 -271
  211. package/docs/concepts/memory-search.md +0 -167
  212. package/docs/concepts/memory.md +0 -299
  213. package/docs/concepts/message-lifecycle-refactor.md +0 -1126
  214. package/docs/concepts/messages.md +0 -214
  215. package/docs/concepts/model-failover.md +0 -384
  216. package/docs/concepts/model-providers.md +0 -719
  217. package/docs/concepts/models.md +0 -371
  218. package/docs/concepts/multi-agent.md +0 -625
  219. package/docs/concepts/oauth.md +0 -198
  220. package/docs/concepts/parallel-specialist-lanes.md +0 -127
  221. package/docs/concepts/personal-agent-benchmark-pack.md +0 -74
  222. package/docs/concepts/presence.md +0 -117
  223. package/docs/concepts/progress-drafts.md +0 -406
  224. package/docs/concepts/qa-e2e-automation.md +0 -947
  225. package/docs/concepts/qa-matrix.md +0 -139
  226. package/docs/concepts/queue-steering.md +0 -90
  227. package/docs/concepts/queue.md +0 -136
  228. package/docs/concepts/retry.md +0 -86
  229. package/docs/concepts/session-pruning.md +0 -104
  230. package/docs/concepts/session-tool.md +0 -188
  231. package/docs/concepts/session.md +0 -164
  232. package/docs/concepts/soul.md +0 -116
  233. package/docs/concepts/streaming.md +0 -257
  234. package/docs/concepts/system-prompt.md +0 -328
  235. package/docs/concepts/timezone.md +0 -47
  236. package/docs/concepts/typebox.md +0 -309
  237. package/docs/concepts/typing-indicators.md +0 -88
  238. package/docs/concepts/usage-tracking.md +0 -66
  239. package/docs/date-time.md +0 -126
  240. package/docs/debug/node-issue.md +0 -90
  241. package/docs/diagnostics/flags.md +0 -182
  242. package/docs/docs.json +0 -1862
  243. package/docs/fengming-agent-runtime.md +0 -82
  244. package/docs/gateway/authentication.md +0 -256
  245. package/docs/gateway/background-process.md +0 -147
  246. package/docs/gateway/bonjour.md +0 -303
  247. package/docs/gateway/bridge-protocol.md +0 -97
  248. package/docs/gateway/cli-backends.md +0 -439
  249. package/docs/gateway/config-agents.md +0 -1525
  250. package/docs/gateway/config-channels.md +0 -945
  251. package/docs/gateway/config-tools.md +0 -774
  252. package/docs/gateway/configuration-examples.md +0 -704
  253. package/docs/gateway/configuration-reference.md +0 -1391
  254. package/docs/gateway/configuration.md +0 -739
  255. package/docs/gateway/diagnostics.md +0 -213
  256. package/docs/gateway/discovery.md +0 -154
  257. package/docs/gateway/doctor.md +0 -575
  258. package/docs/gateway/gateway-lock.md +0 -37
  259. package/docs/gateway/health.md +0 -73
  260. package/docs/gateway/heartbeat.md +0 -498
  261. package/docs/gateway/index.md +0 -383
  262. package/docs/gateway/local-model-services.md +0 -205
  263. package/docs/gateway/local-models.md +0 -355
  264. package/docs/gateway/logging.md +0 -149
  265. package/docs/gateway/multiple-gateways.md +0 -178
  266. package/docs/gateway/network-model.md +0 -15
  267. package/docs/gateway/openai-http-api.md +0 -378
  268. package/docs/gateway/openresponses-http-api.md +0 -347
  269. package/docs/gateway/openshell.md +0 -316
  270. package/docs/gateway/opentelemetry.md +0 -433
  271. package/docs/gateway/operator-scopes.md +0 -119
  272. package/docs/gateway/pairing.md +0 -207
  273. package/docs/gateway/prometheus.md +0 -249
  274. package/docs/gateway/protocol.md +0 -826
  275. package/docs/gateway/remote-gateway-readme.md +0 -169
  276. package/docs/gateway/remote.md +0 -280
  277. package/docs/gateway/sandbox-vs-tool-policy-vs-elevated.md +0 -148
  278. package/docs/gateway/sandboxing.md +0 -546
  279. package/docs/gateway/secrets-plan-contract.md +0 -159
  280. package/docs/gateway/secrets.md +0 -805
  281. package/docs/gateway/security/audit-checks.md +0 -127
  282. package/docs/gateway/security/exposure-runbook.md +0 -212
  283. package/docs/gateway/security/index.md +0 -1343
  284. package/docs/gateway/security/secure-file-operations.md +0 -76
  285. package/docs/gateway/security/shrinkwrap.md +0 -111
  286. package/docs/gateway/tailscale.md +0 -156
  287. package/docs/gateway/tools-invoke-http-api.md +0 -169
  288. package/docs/gateway/troubleshooting.md +0 -877
  289. package/docs/gateway/trusted-proxy-auth.md +0 -483
  290. package/docs/help/debugging.md +0 -341
  291. package/docs/help/environment.md +0 -233
  292. package/docs/help/faq-first-run.md +0 -870
  293. package/docs/help/faq-models.md +0 -556
  294. package/docs/help/faq.md +0 -2041
  295. package/docs/help/index.md +0 -39
  296. package/docs/help/scripts.md +0 -56
  297. package/docs/help/testing-live.md +0 -587
  298. package/docs/help/testing-updates-plugins.md +0 -299
  299. package/docs/help/testing.md +0 -977
  300. package/docs/help/troubleshooting.md +0 -449
  301. package/docs/index.md +0 -196
  302. package/docs/install/ansible.md +0 -233
  303. package/docs/install/azure.md +0 -315
  304. package/docs/install/bun.md +0 -59
  305. package/docs/install/clawdock.md +0 -112
  306. package/docs/install/development-channels.md +0 -148
  307. package/docs/install/digitalocean.md +0 -174
  308. package/docs/install/docker-vm-runtime.md +0 -154
  309. package/docs/install/docker.md +0 -564
  310. package/docs/install/exe-dev.md +0 -201
  311. package/docs/install/fly.md +0 -524
  312. package/docs/install/gcp.md +0 -418
  313. package/docs/install/hetzner.md +0 -285
  314. package/docs/install/hostinger.md +0 -98
  315. package/docs/install/index.md +0 -232
  316. package/docs/install/installer.md +0 -447
  317. package/docs/install/kubernetes.md +0 -196
  318. package/docs/install/macos-vm.md +0 -281
  319. package/docs/install/migrating-claude.md +0 -165
  320. package/docs/install/migrating-hermes.md +0 -178
  321. package/docs/install/migrating.md +0 -137
  322. package/docs/install/nix.md +0 -112
  323. package/docs/install/node.md +0 -142
  324. package/docs/install/northflank.mdx +0 -44
  325. package/docs/install/oracle.md +0 -218
  326. package/docs/install/podman.md +0 -216
  327. package/docs/install/railway.mdx +0 -92
  328. package/docs/install/raspberry-pi.md +0 -234
  329. package/docs/install/render.mdx +0 -167
  330. package/docs/install/uninstall.md +0 -131
  331. package/docs/install/updating.md +0 -284
  332. package/docs/install/upstash.md +0 -96
  333. package/docs/logging.md +0 -320
  334. package/docs/nav-tabs-underline.js +0 -100
  335. package/docs/network.md +0 -72
  336. package/docs/nodes/audio.md +0 -216
  337. package/docs/nodes/camera.md +0 -166
  338. package/docs/nodes/images.md +0 -77
  339. package/docs/nodes/index.md +0 -439
  340. package/docs/nodes/location-command.md +0 -102
  341. package/docs/nodes/media-understanding.md +0 -495
  342. package/docs/nodes/talk.md +0 -160
  343. package/docs/nodes/troubleshooting.md +0 -123
  344. package/docs/nodes/voicewake.md +0 -93
  345. package/docs/perplexity.md +0 -11
  346. package/docs/plan/codex-context-engine-harness.md +0 -624
  347. package/docs/plan/ui-channels.md +0 -284
  348. package/docs/platforms/digitalocean.md +0 -12
  349. package/docs/platforms/easyrunner.md +0 -109
  350. package/docs/platforms/index.md +0 -51
  351. package/docs/platforms/linux.md +0 -141
  352. package/docs/platforms/mac/bundled-gateway.md +0 -79
  353. package/docs/platforms/mac/canvas.md +0 -128
  354. package/docs/platforms/mac/child-process.md +0 -72
  355. package/docs/platforms/mac/dev-setup.md +0 -112
  356. package/docs/platforms/mac/health.md +0 -39
  357. package/docs/platforms/mac/icon.md +0 -36
  358. package/docs/platforms/mac/logging.md +0 -62
  359. package/docs/platforms/mac/menu-bar.md +0 -93
  360. package/docs/platforms/mac/peekaboo.md +0 -96
  361. package/docs/platforms/mac/permissions.md +0 -73
  362. package/docs/platforms/mac/remote.md +0 -123
  363. package/docs/platforms/mac/signing.md +0 -52
  364. package/docs/platforms/mac/skills.md +0 -43
  365. package/docs/platforms/mac/voice-overlay.md +0 -66
  366. package/docs/platforms/mac/voicewake.md +0 -73
  367. package/docs/platforms/mac/webchat.md +0 -54
  368. package/docs/platforms/mac/xpc.md +0 -66
  369. package/docs/platforms/oracle.md +0 -12
  370. package/docs/platforms/raspberry-pi.md +0 -13
  371. package/docs/platforms/windows.md +0 -286
  372. package/docs/plugins/adding-capabilities.md +0 -146
  373. package/docs/plugins/admin-http-rpc.md +0 -216
  374. package/docs/plugins/agent-tools.md +0 -13
  375. package/docs/plugins/architecture-internals.md +0 -1196
  376. package/docs/plugins/architecture.md +0 -483
  377. package/docs/plugins/building-extensions.md +0 -13
  378. package/docs/plugins/building-plugins.md +0 -335
  379. package/docs/plugins/bundles.md +0 -310
  380. package/docs/plugins/cli-backend-plugins.md +0 -310
  381. package/docs/plugins/codex-computer-use.md +0 -297
  382. package/docs/plugins/codex-harness-reference.md +0 -470
  383. package/docs/plugins/codex-harness-runtime.md +0 -268
  384. package/docs/plugins/codex-harness.md +0 -780
  385. package/docs/plugins/codex-native-plugins.md +0 -276
  386. package/docs/plugins/community.md +0 -77
  387. package/docs/plugins/compatibility.md +0 -167
  388. package/docs/plugins/copilot.md +0 -356
  389. package/docs/plugins/dependency-resolution.md +0 -176
  390. package/docs/plugins/google-meet.md +0 -1737
  391. package/docs/plugins/hooks.md +0 -484
  392. package/docs/plugins/install-overrides.md +0 -80
  393. package/docs/plugins/manage-plugins.md +0 -210
  394. package/docs/plugins/manifest.md +0 -1457
  395. package/docs/plugins/memory-lancedb.md +0 -385
  396. package/docs/plugins/memory-wiki.md +0 -529
  397. package/docs/plugins/message-presentation.md +0 -473
  398. package/docs/plugins/oc-path.md +0 -166
  399. package/docs/plugins/plugin-inventory.md +0 -189
  400. package/docs/plugins/plugin-permission-requests.md +0 -193
  401. package/docs/plugins/reference/acpx.md +0 -23
  402. package/docs/plugins/reference/admin-http-rpc.md +0 -23
  403. package/docs/plugins/reference/alibaba.md +0 -23
  404. package/docs/plugins/reference/amazon-bedrock-mantle.md +0 -23
  405. package/docs/plugins/reference/amazon-bedrock.md +0 -23
  406. package/docs/plugins/reference/anthropic-vertex.md +0 -19
  407. package/docs/plugins/reference/anthropic.md +0 -23
  408. package/docs/plugins/reference/arcee.md +0 -23
  409. package/docs/plugins/reference/azure-speech.md +0 -23
  410. package/docs/plugins/reference/bonjour.md +0 -19
  411. package/docs/plugins/reference/brave.md +0 -23
  412. package/docs/plugins/reference/browser.md +0 -23
  413. package/docs/plugins/reference/byteplus.md +0 -19
  414. package/docs/plugins/reference/canvas.md +0 -19
  415. package/docs/plugins/reference/cerebras.md +0 -23
  416. package/docs/plugins/reference/chutes.md +0 -23
  417. package/docs/plugins/reference/clickclack.md +0 -23
  418. package/docs/plugins/reference/cloudflare-ai-gateway.md +0 -23
  419. package/docs/plugins/reference/codex-supervisor.md +0 -27
  420. package/docs/plugins/reference/codex.md +0 -23
  421. package/docs/plugins/reference/comfy.md +0 -23
  422. package/docs/plugins/reference/copilot-proxy.md +0 -19
  423. package/docs/plugins/reference/copilot.md +0 -23
  424. package/docs/plugins/reference/deepgram.md +0 -23
  425. package/docs/plugins/reference/deepinfra.md +0 -23
  426. package/docs/plugins/reference/deepseek.md +0 -23
  427. package/docs/plugins/reference/diagnostics-otel.md +0 -19
  428. package/docs/plugins/reference/diagnostics-prometheus.md +0 -19
  429. package/docs/plugins/reference/diffs-language-pack.md +0 -19
  430. package/docs/plugins/reference/diffs.md +0 -19
  431. package/docs/plugins/reference/discord.md +0 -23
  432. package/docs/plugins/reference/document-extract.md +0 -23
  433. package/docs/plugins/reference/duckduckgo.md +0 -23
  434. package/docs/plugins/reference/elevenlabs.md +0 -23
  435. package/docs/plugins/reference/exa.md +0 -23
  436. package/docs/plugins/reference/fal.md +0 -23
  437. package/docs/plugins/reference/feishu.md +0 -23
  438. package/docs/plugins/reference/file-transfer.md +0 -19
  439. package/docs/plugins/reference/firecrawl.md +0 -23
  440. package/docs/plugins/reference/fireworks.md +0 -23
  441. package/docs/plugins/reference/github-copilot.md +0 -23
  442. package/docs/plugins/reference/gmi.md +0 -23
  443. package/docs/plugins/reference/google-meet.md +0 -23
  444. package/docs/plugins/reference/google.md +0 -23
  445. package/docs/plugins/reference/googlechat.md +0 -23
  446. package/docs/plugins/reference/gradium.md +0 -23
  447. package/docs/plugins/reference/groq.md +0 -23
  448. package/docs/plugins/reference/huggingface.md +0 -23
  449. package/docs/plugins/reference/imessage.md +0 -23
  450. package/docs/plugins/reference/inworld.md +0 -23
  451. package/docs/plugins/reference/irc.md +0 -23
  452. package/docs/plugins/reference/kilocode.md +0 -23
  453. package/docs/plugins/reference/kimi.md +0 -23
  454. package/docs/plugins/reference/line.md +0 -23
  455. package/docs/plugins/reference/litellm.md +0 -23
  456. package/docs/plugins/reference/llm-task.md +0 -19
  457. package/docs/plugins/reference/lmstudio.md +0 -23
  458. package/docs/plugins/reference/lobster.md +0 -19
  459. package/docs/plugins/reference/matrix.md +0 -23
  460. package/docs/plugins/reference/mattermost.md +0 -23
  461. package/docs/plugins/reference/memory-core.md +0 -19
  462. package/docs/plugins/reference/memory-lancedb.md +0 -23
  463. package/docs/plugins/reference/memory-wiki.md +0 -23
  464. package/docs/plugins/reference/microsoft-foundry.md +0 -19
  465. package/docs/plugins/reference/microsoft.md +0 -19
  466. package/docs/plugins/reference/migrate-claude.md +0 -19
  467. package/docs/plugins/reference/migrate-hermes.md +0 -19
  468. package/docs/plugins/reference/minimax.md +0 -23
  469. package/docs/plugins/reference/mistral.md +0 -23
  470. package/docs/plugins/reference/moonshot.md +0 -23
  471. package/docs/plugins/reference/msteams.md +0 -23
  472. package/docs/plugins/reference/nextcloud-talk.md +0 -23
  473. package/docs/plugins/reference/nostr.md +0 -23
  474. package/docs/plugins/reference/novita.md +0 -23
  475. package/docs/plugins/reference/nvidia.md +0 -23
  476. package/docs/plugins/reference/oc-path.md +0 -23
  477. package/docs/plugins/reference/ollama.md +0 -23
  478. package/docs/plugins/reference/open-prose.md +0 -19
  479. package/docs/plugins/reference/openai.md +0 -23
  480. package/docs/plugins/reference/opencode-go.md +0 -23
  481. package/docs/plugins/reference/opencode.md +0 -23
  482. package/docs/plugins/reference/openrouter.md +0 -23
  483. package/docs/plugins/reference/openshell.md +0 -19
  484. package/docs/plugins/reference/perplexity.md +0 -23
  485. package/docs/plugins/reference/pixverse.md +0 -23
  486. package/docs/plugins/reference/policy.md +0 -72
  487. package/docs/plugins/reference/qa-channel.md +0 -23
  488. package/docs/plugins/reference/qa-lab.md +0 -19
  489. package/docs/plugins/reference/qa-matrix.md +0 -19
  490. package/docs/plugins/reference/qianfan.md +0 -23
  491. package/docs/plugins/reference/qqbot.md +0 -23
  492. package/docs/plugins/reference/qwen.md +0 -23
  493. package/docs/plugins/reference/runway.md +0 -23
  494. package/docs/plugins/reference/searxng.md +0 -19
  495. package/docs/plugins/reference/senseaudio.md +0 -23
  496. package/docs/plugins/reference/sglang.md +0 -23
  497. package/docs/plugins/reference/signal.md +0 -23
  498. package/docs/plugins/reference/skill-workshop.md +0 -23
  499. package/docs/plugins/reference/slack.md +0 -23
  500. package/docs/plugins/reference/stepfun.md +0 -23
  501. package/docs/plugins/reference/synology-chat.md +0 -23
  502. package/docs/plugins/reference/synthetic.md +0 -23
  503. package/docs/plugins/reference/tavily.md +0 -23
  504. package/docs/plugins/reference/telegram.md +0 -23
  505. package/docs/plugins/reference/tencent.md +0 -23
  506. package/docs/plugins/reference/tlon.md +0 -23
  507. package/docs/plugins/reference/together.md +0 -23
  508. package/docs/plugins/reference/tokenjuice.md +0 -23
  509. package/docs/plugins/reference/tts-local-cli.md +0 -19
  510. package/docs/plugins/reference/twitch.md +0 -23
  511. package/docs/plugins/reference/venice.md +0 -23
  512. package/docs/plugins/reference/vercel-ai-gateway.md +0 -23
  513. package/docs/plugins/reference/vllm.md +0 -23
  514. package/docs/plugins/reference/voice-call.md +0 -23
  515. package/docs/plugins/reference/volcengine.md +0 -23
  516. package/docs/plugins/reference/voyage.md +0 -19
  517. package/docs/plugins/reference/vydra.md +0 -23
  518. package/docs/plugins/reference/web-readability.md +0 -19
  519. package/docs/plugins/reference/webhooks.md +0 -23
  520. package/docs/plugins/reference/whatsapp.md +0 -23
  521. package/docs/plugins/reference/workboard.md +0 -23
  522. package/docs/plugins/reference/xai.md +0 -23
  523. package/docs/plugins/reference/xiaomi.md +0 -23
  524. package/docs/plugins/reference/zai.md +0 -23
  525. package/docs/plugins/reference/zalo.md +0 -23
  526. package/docs/plugins/reference/zalouser.md +0 -24
  527. package/docs/plugins/reference.md +0 -145
  528. package/docs/plugins/sdk-agent-harness.md +0 -338
  529. package/docs/plugins/sdk-channel-inbound.md +0 -70
  530. package/docs/plugins/sdk-channel-ingress.md +0 -137
  531. package/docs/plugins/sdk-channel-message.md +0 -18
  532. package/docs/plugins/sdk-channel-outbound.md +0 -113
  533. package/docs/plugins/sdk-channel-plugins.md +0 -765
  534. package/docs/plugins/sdk-channel-turn.md +0 -9
  535. package/docs/plugins/sdk-entrypoints.md +0 -344
  536. package/docs/plugins/sdk-migration.md +0 -979
  537. package/docs/plugins/sdk-overview.md +0 -511
  538. package/docs/plugins/sdk-provider-plugins.md +0 -846
  539. package/docs/plugins/sdk-runtime.md +0 -676
  540. package/docs/plugins/sdk-setup.md +0 -550
  541. package/docs/plugins/sdk-subpaths.md +0 -391
  542. package/docs/plugins/sdk-testing.md +0 -403
  543. package/docs/plugins/skill-workshop.md +0 -713
  544. package/docs/plugins/tool-plugins.md +0 -411
  545. package/docs/plugins/voice-call.md +0 -942
  546. package/docs/plugins/webhooks.md +0 -192
  547. package/docs/plugins/workboard.md +0 -252
  548. package/docs/plugins/zalouser.md +0 -86
  549. package/docs/prose.md +0 -137
  550. package/docs/providers/alibaba.md +0 -158
  551. package/docs/providers/anthropic.md +0 -381
  552. package/docs/providers/arcee.md +0 -144
  553. package/docs/providers/azure-speech.md +0 -119
  554. package/docs/providers/bedrock-mantle.md +0 -211
  555. package/docs/providers/bedrock.md +0 -414
  556. package/docs/providers/cerebras.md +0 -130
  557. package/docs/providers/chutes.md +0 -153
  558. package/docs/providers/claude-max-api-proxy.md +0 -191
  559. package/docs/providers/cloudflare-ai-gateway.md +0 -119
  560. package/docs/providers/comfy.md +0 -362
  561. package/docs/providers/deepgram.md +0 -184
  562. package/docs/providers/deepinfra.md +0 -92
  563. package/docs/providers/deepseek.md +0 -146
  564. package/docs/providers/ds4.md +0 -309
  565. package/docs/providers/elevenlabs.md +0 -130
  566. package/docs/providers/fal.md +0 -240
  567. package/docs/providers/fireworks.md +0 -144
  568. package/docs/providers/github-copilot.md +0 -257
  569. package/docs/providers/gmi.md +0 -92
  570. package/docs/providers/google.md +0 -472
  571. package/docs/providers/gradium.md +0 -123
  572. package/docs/providers/groq.md +0 -171
  573. package/docs/providers/huggingface.md +0 -235
  574. package/docs/providers/index.md +0 -105
  575. package/docs/providers/inferrs.md +0 -272
  576. package/docs/providers/inworld.md +0 -120
  577. package/docs/providers/kilocode.md +0 -135
  578. package/docs/providers/litellm.md +0 -234
  579. package/docs/providers/lmstudio.md +0 -224
  580. package/docs/providers/minimax.md +0 -505
  581. package/docs/providers/mistral.md +0 -235
  582. package/docs/providers/models.md +0 -64
  583. package/docs/providers/moonshot.md +0 -413
  584. package/docs/providers/novita.md +0 -92
  585. package/docs/providers/nvidia.md +0 -158
  586. package/docs/providers/ollama-cloud.md +0 -115
  587. package/docs/providers/ollama.md +0 -1225
  588. package/docs/providers/openai.md +0 -1093
  589. package/docs/providers/opencode-go.md +0 -123
  590. package/docs/providers/opencode.md +0 -149
  591. package/docs/providers/openrouter.md +0 -349
  592. package/docs/providers/perplexity-provider.md +0 -123
  593. package/docs/providers/pixverse.md +0 -165
  594. package/docs/providers/qianfan.md +0 -132
  595. package/docs/providers/qwen-oauth.md +0 -115
  596. package/docs/providers/qwen.md +0 -364
  597. package/docs/providers/runway.md +0 -103
  598. package/docs/providers/senseaudio.md +0 -68
  599. package/docs/providers/sglang.md +0 -161
  600. package/docs/providers/stepfun.md +0 -229
  601. package/docs/providers/synthetic.md +0 -154
  602. package/docs/providers/tencent.md +0 -130
  603. package/docs/providers/together.md +0 -140
  604. package/docs/providers/venice.md +0 -312
  605. package/docs/providers/vercel-ai-gateway.md +0 -128
  606. package/docs/providers/vllm.md +0 -407
  607. package/docs/providers/volcengine.md +0 -199
  608. package/docs/providers/vydra.md +0 -180
  609. package/docs/providers/xai.md +0 -571
  610. package/docs/providers/xiaomi.md +0 -262
  611. package/docs/providers/zai.md +0 -224
  612. package/docs/refactor/access.md +0 -9
  613. package/docs/refactor/acp.md +0 -298
  614. package/docs/refactor/canvas.md +0 -131
  615. package/docs/refactor/database-first.md +0 -2256
  616. package/docs/refactor/ingress-core.md +0 -341
  617. package/docs/reference/AGENTS.default.md +0 -131
  618. package/docs/reference/RELEASING.md +0 -799
  619. package/docs/reference/api-usage-costs.md +0 -208
  620. package/docs/reference/application-modernization-plan.md +0 -208
  621. package/docs/reference/code-mode.md +0 -773
  622. package/docs/reference/credits.md +0 -33
  623. package/docs/reference/device-models.md +0 -50
  624. package/docs/reference/fengming-sdk-api-design.md +0 -390
  625. package/docs/reference/full-release-validation.md +0 -202
  626. package/docs/reference/memory-config.md +0 -604
  627. package/docs/reference/prompt-caching.md +0 -358
  628. package/docs/reference/release-performance-sweep.md +0 -360
  629. package/docs/reference/rich-output-protocol.md +0 -101
  630. package/docs/reference/rpc.md +0 -43
  631. package/docs/reference/secret-placeholder-conventions.md +0 -33
  632. package/docs/reference/secretref-credential-surface.md +0 -159
  633. package/docs/reference/secretref-user-supplied-credentials-matrix.json +0 -663
  634. package/docs/reference/session-management-compaction.md +0 -474
  635. package/docs/reference/templates/AGENTS.dev.md +0 -90
  636. package/docs/reference/templates/AGENTS.md +0 -227
  637. package/docs/reference/templates/BOOT.md +0 -16
  638. package/docs/reference/templates/BOOTSTRAP.md +0 -66
  639. package/docs/reference/templates/CLAUDE.md +0 -1
  640. package/docs/reference/templates/HEARTBEAT.md +0 -24
  641. package/docs/reference/templates/IDENTITY.dev.md +0 -52
  642. package/docs/reference/templates/IDENTITY.md +0 -34
  643. package/docs/reference/templates/SOUL.dev.md +0 -82
  644. package/docs/reference/templates/SOUL.md +0 -49
  645. package/docs/reference/templates/TOOLS.dev.md +0 -29
  646. package/docs/reference/templates/TOOLS.md +0 -51
  647. package/docs/reference/templates/USER.dev.md +0 -23
  648. package/docs/reference/templates/USER.md +0 -28
  649. package/docs/reference/test.md +0 -247
  650. package/docs/reference/token-use.md +0 -246
  651. package/docs/reference/transcript-hygiene.md +0 -214
  652. package/docs/reference/wizard.md +0 -252
  653. package/docs/security/CONTRIBUTING-THREAT-MODEL.md +0 -101
  654. package/docs/security/THREAT-MODEL-ATLAS.md +0 -611
  655. package/docs/security/formal-verification.md +0 -170
  656. package/docs/security/incident-response.md +0 -59
  657. package/docs/security/network-proxy.md +0 -268
  658. package/docs/snippets/plugin-publish/minimal-fengming.plugin.json +0 -12
  659. package/docs/snippets/plugin-publish/minimal-package.json +0 -16
  660. package/docs/specs/claw-supervisor.md +0 -247
  661. package/docs/start/bootstrapping.md +0 -49
  662. package/docs/start/docs-directory.md +0 -69
  663. package/docs/start/fengming.md +0 -252
  664. package/docs/start/getting-started.md +0 -152
  665. package/docs/start/hubs.md +0 -201
  666. package/docs/start/lore.md +0 -223
  667. package/docs/start/onboarding-overview.md +0 -72
  668. package/docs/start/onboarding.md +0 -98
  669. package/docs/start/quickstart.md +0 -25
  670. package/docs/start/setup.md +0 -178
  671. package/docs/start/showcase.md +0 -363
  672. package/docs/start/wizard-cli-automation.md +0 -232
  673. package/docs/start/wizard-cli-reference.md +0 -331
  674. package/docs/start/wizard.md +0 -141
  675. package/docs/style.css +0 -137
  676. package/docs/superpowers/specs/2026-04-22-tweakcn-custom-theme-import-design.md +0 -316
  677. package/docs/tools/acp-agents-setup.md +0 -351
  678. package/docs/tools/acp-agents.md +0 -854
  679. package/docs/tools/agent-send.md +0 -130
  680. package/docs/tools/apply-patch.md +0 -64
  681. package/docs/tools/brave-search.md +0 -139
  682. package/docs/tools/browser-control.md +0 -391
  683. package/docs/tools/browser-linux-troubleshooting.md +0 -173
  684. package/docs/tools/browser-login.md +0 -77
  685. package/docs/tools/browser-wsl2-windows-remote-cdp-troubleshooting.md +0 -219
  686. package/docs/tools/browser.md +0 -810
  687. package/docs/tools/btw.md +0 -159
  688. package/docs/tools/capability-cookbook.md +0 -12
  689. package/docs/tools/clawhub.md +0 -5
  690. package/docs/tools/code-execution.md +0 -173
  691. package/docs/tools/creating-skills.md +0 -158
  692. package/docs/tools/diffs.md +0 -525
  693. package/docs/tools/duckduckgo-search.md +0 -109
  694. package/docs/tools/elevated.md +0 -128
  695. package/docs/tools/exa-search.md +0 -152
  696. package/docs/tools/exec-approvals-advanced.md +0 -444
  697. package/docs/tools/exec-approvals.md +0 -494
  698. package/docs/tools/exec.md +0 -285
  699. package/docs/tools/firecrawl.md +0 -155
  700. package/docs/tools/gemini-search.md +0 -114
  701. package/docs/tools/goal.md +0 -217
  702. package/docs/tools/grok-search.md +0 -129
  703. package/docs/tools/image-generation.md +0 -493
  704. package/docs/tools/index.md +0 -178
  705. package/docs/tools/kimi-search.md +0 -105
  706. package/docs/tools/llm-task.md +0 -137
  707. package/docs/tools/lobster.md +0 -365
  708. package/docs/tools/loop-detection.md +0 -154
  709. package/docs/tools/media-overview.md +0 -160
  710. package/docs/tools/minimax-search.md +0 -102
  711. package/docs/tools/multi-agent-sandbox-tools.md +0 -409
  712. package/docs/tools/music-generation.md +0 -372
  713. package/docs/tools/ollama-search.md +0 -153
  714. package/docs/tools/pdf.md +0 -213
  715. package/docs/tools/perplexity-search.md +0 -220
  716. package/docs/tools/plugin.md +0 -363
  717. package/docs/tools/reactions.md +0 -100
  718. package/docs/tools/searxng-search.md +0 -141
  719. package/docs/tools/skills-config.md +0 -195
  720. package/docs/tools/skills.md +0 -569
  721. package/docs/tools/slash-commands.md +0 -487
  722. package/docs/tools/steer.md +0 -77
  723. package/docs/tools/subagents.md +0 -651
  724. package/docs/tools/tavily.md +0 -162
  725. package/docs/tools/thinking.md +0 -142
  726. package/docs/tools/tokenjuice.md +0 -84
  727. package/docs/tools/tool-search.md +0 -269
  728. package/docs/tools/trajectory.md +0 -229
  729. package/docs/tools/tts.md +0 -1009
  730. package/docs/tools/video-generation.md +0 -555
  731. package/docs/tools/web-fetch.md +0 -210
  732. package/docs/tools/web.md +0 -461
  733. package/docs/tts.md +0 -11
  734. package/docs/vps.md +0 -139
  735. package/docs/web/control-ui.md +0 -512
  736. package/docs/web/dashboard.md +0 -107
  737. package/docs/web/index.md +0 -133
  738. package/docs/web/tui.md +0 -250
  739. package/docs/web/webchat.md +0 -102
  740. package/npm-shrinkwrap.json +0 -12861
  741. package/patches/.gitkeep +0 -0
  742. package/patches/@agentclientprotocol__claude-agent-acp@0.37.0.patch +0 -41
  743. package/pnpm-workspace.yaml +0 -120
  744. package/scripts/crabbox-wrapper.mjs +0 -2004
  745. package/scripts/lib/official-external-channel-catalog.json +0 -560
  746. package/scripts/lib/official-external-plugin-catalog.json +0 -264
  747. package/scripts/lib/official-external-provider-catalog.json +0 -158
  748. package/scripts/lib/package-dist-imports.mjs +0 -171
  749. package/scripts/npm-runner.mjs +0 -91
  750. package/scripts/postinstall-bundled-plugins.mjs +0 -978
  751. package/scripts/preinstall-package-manager-warning.mjs +0 -64
  752. package/scripts/prepare-git-hooks.mjs +0 -72
  753. package/scripts/windows-cmd-helpers.mjs +0 -22
  754. package/skills/batch/SKILL.md +0 -118
  755. package/skills/code-review/SKILL.md +0 -107
  756. package/skills/debug/SKILL.md +0 -83
  757. package/skills/loop/SKILL.md +0 -118
  758. package/skills/run/SKILL.md +0 -79
  759. package/skills/run-skill-generator/SKILL.md +0 -179
  760. package/skills/verify/SKILL.md +0 -103
  761. package/src/agents/templates/HEARTBEAT.md +0 -3
@@ -1,1457 +0,0 @@
1
- ---
2
- summary: "Plugin manifest + JSON schema requirements (strict config validation)"
3
- read_when:
4
- - You are building an FengMing plugin
5
- - You need to ship a plugin config schema or debug plugin validation errors
6
- title: "Plugin manifest"
7
- ---
8
-
9
- This page is for the **native FengMing plugin manifest** only.
10
-
11
- For compatible bundle layouts, see [Plugin bundles](/plugins/bundles).
12
-
13
- Compatible bundle formats use different manifest files:
14
-
15
- - Codex bundle: `.codex-plugin/plugin.json`
16
- - Claude bundle: `.claude-plugin/plugin.json` or the default Claude component
17
- layout without a manifest
18
- - Cursor bundle: `.cursor-plugin/plugin.json`
19
-
20
- FengMing auto-detects those bundle layouts too, but they are not validated
21
- against the `fengming.plugin.json` schema described here.
22
-
23
- For compatible bundles, FengMing currently reads bundle metadata plus declared
24
- skill roots, Claude command roots, Claude bundle `settings.json` defaults,
25
- Claude bundle LSP defaults, and supported hook packs when the layout matches
26
- FengMing runtime expectations.
27
-
28
- Every native FengMing plugin **must** ship a `fengming.plugin.json` file in the
29
- **plugin root**. FengMing uses this manifest to validate configuration
30
- **without executing plugin code**. Missing or invalid manifests are treated as
31
- plugin errors and block config validation.
32
-
33
- See the full plugin system guide: [Plugins](/tools/plugin).
34
- For the native capability model and current external-compatibility guidance:
35
- [Capability model](/plugins/architecture#public-capability-model).
36
-
37
- ## What this file does
38
-
39
- `fengming.plugin.json` is the metadata FengMing reads **before it loads your
40
- plugin code**. Everything below must be cheap enough to inspect without booting
41
- plugin runtime.
42
-
43
- **Use it for:**
44
-
45
- - plugin identity, config validation, and config UI hints
46
- - auth, onboarding, and setup metadata (alias, auto-enable, provider env vars, auth choices)
47
- - activation hints for control-plane surfaces
48
- - shorthand model-family ownership
49
- - static capability-ownership snapshots (`contracts`)
50
- - QA runner metadata the shared `fengming qa` host can inspect
51
- - channel-specific config metadata merged into catalog and validation surfaces
52
-
53
- **Do not use it for:** registering runtime behavior, declaring code entrypoints,
54
- or npm install metadata. Those belong in your plugin code and `package.json`.
55
-
56
- ## Minimal example
57
-
58
- ```json
59
- {
60
- "id": "voice-call",
61
- "configSchema": {
62
- "type": "object",
63
- "additionalProperties": false,
64
- "properties": {}
65
- }
66
- }
67
- ```
68
-
69
- ## Rich example
70
-
71
- ```json
72
- {
73
- "id": "openrouter",
74
- "name": "OpenRouter",
75
- "description": "OpenRouter provider plugin",
76
- "version": "1.0.0",
77
- "providers": ["openrouter"],
78
- "modelSupport": {
79
- "modelPrefixes": ["router-"]
80
- },
81
- "modelIdNormalization": {
82
- "providers": {
83
- "openrouter": {
84
- "prefixWhenBare": "openrouter"
85
- }
86
- }
87
- },
88
- "providerEndpoints": [
89
- {
90
- "endpointClass": "openrouter",
91
- "hostSuffixes": ["openrouter.ai"]
92
- }
93
- ],
94
- "providerRequest": {
95
- "providers": {
96
- "openrouter": {
97
- "family": "openrouter"
98
- }
99
- }
100
- },
101
- "cliBackends": ["openrouter-cli"],
102
- "syntheticAuthRefs": ["openrouter-cli"],
103
- "setup": {
104
- "providers": [
105
- {
106
- "id": "openrouter",
107
- "envVars": ["OPENROUTER_API_KEY"]
108
- }
109
- ]
110
- },
111
- "providerAuthAliases": {
112
- "openrouter-coding": "openrouter"
113
- },
114
- "channelEnvVars": {
115
- "openrouter-chatops": ["OPENROUTER_CHATOPS_TOKEN"]
116
- },
117
- "providerAuthChoices": [
118
- {
119
- "provider": "openrouter",
120
- "method": "api-key",
121
- "choiceId": "openrouter-api-key",
122
- "choiceLabel": "OpenRouter API key",
123
- "groupId": "openrouter",
124
- "groupLabel": "OpenRouter",
125
- "optionKey": "openrouterApiKey",
126
- "cliFlag": "--openrouter-api-key",
127
- "cliOption": "--openrouter-api-key <key>",
128
- "cliDescription": "OpenRouter API key",
129
- "onboardingScopes": ["text-inference"]
130
- }
131
- ],
132
- "uiHints": {
133
- "apiKey": {
134
- "label": "API key",
135
- "placeholder": "sk-or-v1-...",
136
- "sensitive": true
137
- }
138
- },
139
- "configSchema": {
140
- "type": "object",
141
- "additionalProperties": false,
142
- "properties": {
143
- "apiKey": {
144
- "type": "string"
145
- }
146
- }
147
- }
148
- }
149
- ```
150
-
151
- ## Top-level field reference
152
-
153
- | Field | Required | Type | What it means |
154
- | ------------------------------------ | -------- | -------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
155
- | `id` | Yes | `string` | Canonical plugin id. This is the id used in `plugins.entries.<id>`. |
156
- | `configSchema` | Yes | `object` | Inline JSON Schema for this plugin's config. |
157
- | `requiresPlugins` | No | `string[]` | Plugin ids that must also be installed for this plugin to have an effect. Discovery keeps the plugin loadable but warns when any required plugin is missing. |
158
- | `enabledByDefault` | No | `true` | Marks a bundled plugin as enabled by default. Omit it, or set any non-`true` value, to leave the plugin disabled by default. |
159
- | `enabledByDefaultOnPlatforms` | No | `string[]` | Marks a bundled plugin as enabled by default only on the listed Node.js platforms, for example `["darwin"]`. Explicit config still wins. |
160
- | `legacyPluginIds` | No | `string[]` | Legacy ids that normalize to this canonical plugin id. |
161
- | `autoEnableWhenConfiguredProviders` | No | `string[]` | Provider ids that should auto-enable this plugin when auth, config, or model refs mention them. |
162
- | `kind` | No | `"memory"` \| `"context-engine"` | Declares an exclusive plugin kind used by `plugins.slots.*`. |
163
- | `channels` | No | `string[]` | Channel ids owned by this plugin. Used for discovery and config validation. |
164
- | `providers` | No | `string[]` | Provider ids owned by this plugin. |
165
- | `providerCatalogEntry` | No | `string` | Lightweight provider-catalog module path, relative to the plugin root, for manifest-scoped provider catalog metadata that can be loaded without activating the full plugin runtime. |
166
- | `modelSupport` | No | `object` | Manifest-owned shorthand model-family metadata used to auto-load the plugin before runtime. |
167
- | `modelCatalog` | No | `object` | Declarative model catalog metadata for providers owned by this plugin. This is the control-plane contract for future read-only listing, onboarding, model pickers, aliases, and suppression without loading plugin runtime. |
168
- | `modelPricing` | No | `object` | Provider-owned external pricing lookup policy. Use it to opt local/self-hosted providers out of remote pricing catalogs or map provider refs to OpenRouter/LiteLLM catalog ids without hardcoding provider ids in core. |
169
- | `modelIdNormalization` | No | `object` | Provider-owned model-id alias/prefix cleanup that must run before provider runtime loads. |
170
- | `providerEndpoints` | No | `object[]` | Manifest-owned endpoint host/baseUrl metadata for provider routes that core must classify before provider runtime loads. |
171
- | `providerRequest` | No | `object` | Cheap provider-family and request-compatibility metadata used by generic request policy before provider runtime loads. |
172
- | `secretProviderIntegrations` | No | `Record<string, object>` | Declarative SecretRef exec provider presets that setup or install surfaces can offer without hardcoding provider-specific integrations in core. |
173
- | `cliBackends` | No | `string[]` | CLI inference backend ids owned by this plugin. Used for startup auto-activation from explicit config refs. |
174
- | `syntheticAuthRefs` | No | `string[]` | Provider or CLI backend refs whose plugin-owned synthetic auth hook should be probed during cold model discovery before runtime loads. |
175
- | `nonSecretAuthMarkers` | No | `string[]` | Bundled-plugin-owned placeholder API key values that represent non-secret local, OAuth, or ambient credential state. |
176
- | `commandAliases` | No | `object[]` | Command names owned by this plugin that should produce plugin-aware config and CLI diagnostics before runtime loads. |
177
- | `providerAuthEnvVars` | No | `Record<string, string[]>` | Deprecated compatibility env metadata for provider auth/status lookup. Prefer `setup.providers[].envVars` for new plugins; FengMing still reads this during the deprecation window. |
178
- | `providerAuthAliases` | No | `Record<string, string>` | Provider ids that should reuse another provider id for auth lookup, for example a coding provider that shares the base provider API key and auth profiles. |
179
- | `channelEnvVars` | No | `Record<string, string[]>` | Cheap channel env metadata that FengMing can inspect without loading plugin code. Use this for env-driven channel setup or auth surfaces that generic startup/config helpers should see. |
180
- | `providerAuthChoices` | No | `object[]` | Cheap auth-choice metadata for onboarding pickers, preferred-provider resolution, and simple CLI flag wiring. |
181
- | `activation` | No | `object` | Cheap activation planner metadata for startup, provider, command, channel, route, and capability-triggered loading. Metadata only; plugin runtime still owns actual behavior. |
182
- | `setup` | No | `object` | Cheap setup/onboarding descriptors that discovery and setup surfaces can inspect without loading plugin runtime. |
183
- | `qaRunners` | No | `object[]` | Cheap QA runner descriptors used by the shared `fengming qa` host before plugin runtime loads. |
184
- | `contracts` | No | `object` | Static capability ownership snapshot for external auth hooks, embeddings, speech, realtime transcription, realtime voice, media-understanding, image-generation, music-generation, video-generation, web-fetch, web search, and tool ownership. |
185
- | `mediaUnderstandingProviderMetadata` | No | `Record<string, object>` | Cheap media-understanding defaults for provider ids declared in `contracts.mediaUnderstandingProviders`. |
186
- | `imageGenerationProviderMetadata` | No | `Record<string, object>` | Cheap image-generation auth metadata for provider ids declared in `contracts.imageGenerationProviders`, including provider-owned auth aliases and base-url guards. |
187
- | `videoGenerationProviderMetadata` | No | `Record<string, object>` | Cheap video-generation auth metadata for provider ids declared in `contracts.videoGenerationProviders`, including provider-owned auth aliases and base-url guards. |
188
- | `musicGenerationProviderMetadata` | No | `Record<string, object>` | Cheap music-generation auth metadata for provider ids declared in `contracts.musicGenerationProviders`, including provider-owned auth aliases and base-url guards. |
189
- | `toolMetadata` | No | `Record<string, object>` | Cheap availability metadata for plugin-owned tools declared in `contracts.tools`. Use it when a tool should not load runtime unless config, env, or auth evidence exists. |
190
- | `channelConfigs` | No | `Record<string, object>` | Manifest-owned channel config metadata merged into discovery and validation surfaces before runtime loads. |
191
- | `skills` | No | `string[]` | Skill directories to load, relative to the plugin root. |
192
- | `name` | No | `string` | Human-readable plugin name. |
193
- | `description` | No | `string` | Short summary shown in plugin surfaces. |
194
- | `version` | No | `string` | Informational plugin version. |
195
- | `uiHints` | No | `Record<string, object>` | UI labels, placeholders, and sensitivity hints for config fields. |
196
-
197
- ## Generation provider metadata reference
198
-
199
- The generation provider metadata fields describe static auth signals for
200
- providers declared in the matching `contracts.*GenerationProviders` list.
201
- FengMing reads these fields before provider runtime loads so core tools can
202
- decide whether a generation provider is available without importing every
203
- provider plugin.
204
-
205
- Use these fields only for cheap, declarative facts. Transport, request
206
- transforms, token refresh, credential validation, and actual generation behavior
207
- stay in the plugin runtime.
208
-
209
- ```json
210
- {
211
- "contracts": {
212
- "imageGenerationProviders": ["example-image"]
213
- },
214
- "imageGenerationProviderMetadata": {
215
- "example-image": {
216
- "aliases": ["example-image-oauth"],
217
- "authProviders": ["example-image"],
218
- "configSignals": [
219
- {
220
- "rootPath": "plugins.entries.example-image.config",
221
- "overlayPath": "image",
222
- "mode": {
223
- "path": "mode",
224
- "default": "local",
225
- "allowed": ["local"]
226
- },
227
- "requiredAny": ["workflow", "workflowPath"],
228
- "required": ["promptNodeId"]
229
- }
230
- ],
231
- "authSignals": [
232
- {
233
- "provider": "example-image"
234
- },
235
- {
236
- "provider": "example-image-oauth",
237
- "providerBaseUrl": {
238
- "provider": "example-image",
239
- "defaultBaseUrl": "https://api.example.com/v1",
240
- "allowedBaseUrls": ["https://api.example.com/v1"]
241
- }
242
- }
243
- ]
244
- }
245
- }
246
- }
247
- ```
248
-
249
- Each metadata entry supports:
250
-
251
- | Field | Required | Type | What it means |
252
- | ---------------------- | -------- | ---------- | --------------------------------------------------------------------------------------------------------------------------------------------------- |
253
- | `aliases` | No | `string[]` | Additional provider ids that should count as static auth aliases for the generation provider. |
254
- | `authProviders` | No | `string[]` | Provider ids whose configured auth profiles should count as auth for this generation provider. |
255
- | `configSignals` | No | `object[]` | Cheap config-only availability signals for local or self-hosted providers that can be configured without auth profiles or env vars. |
256
- | `authSignals` | No | `object[]` | Explicit auth signals. When present, these replace the default signal set from the provider id, `aliases`, and `authProviders`. |
257
- | `referenceAudioInputs` | No | `boolean` | Video-generation only. Set to `true` when the provider accepts reference audio assets; otherwise `video_generate` hides audio reference parameters. |
258
-
259
- Each `configSignals` entry supports:
260
-
261
- | Field | Required | Type | What it means |
262
- | ------------- | -------- | ---------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
263
- | `rootPath` | Yes | `string` | Dot path to the plugin-owned config object to inspect, for example `plugins.entries.example.config`. |
264
- | `overlayPath` | No | `string` | Dot path inside the root config whose object should overlay the root object before evaluating the signal. Use this for capability-specific config such as `image`, `video`, or `music`. |
265
- | `required` | No | `string[]` | Dot paths inside the effective config that must have configured values. Strings must be non-empty; objects and arrays must not be empty. |
266
- | `requiredAny` | No | `string[]` | Dot paths inside the effective config where at least one must have a configured value. |
267
- | `mode` | No | `object` | Optional string mode guard inside the effective config. Use this when config-only availability applies only to one mode. |
268
-
269
- Each `mode` guard supports:
270
-
271
- | Field | Required | Type | What it means |
272
- | ------------ | -------- | ---------- | ---------------------------------------------------------------------------------- |
273
- | `path` | No | `string` | Dot path inside the effective config. Defaults to `mode`. |
274
- | `default` | No | `string` | Mode value to use when the config omits the path. |
275
- | `allowed` | No | `string[]` | If present, the signal passes only when the effective mode is one of these values. |
276
- | `disallowed` | No | `string[]` | If present, the signal fails when the effective mode is one of these values. |
277
-
278
- Each `authSignals` entry supports:
279
-
280
- | Field | Required | Type | What it means |
281
- | ----------------- | -------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
282
- | `provider` | Yes | `string` | Provider id to check in configured auth profiles. |
283
- | `providerBaseUrl` | No | `object` | Optional guard that makes the signal count only when the referenced configured provider uses an allowed base URL. Use this when an auth alias is valid only for certain APIs. |
284
-
285
- Each `providerBaseUrl` guard supports:
286
-
287
- | Field | Required | Type | What it means |
288
- | ----------------- | -------- | ---------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- |
289
- | `provider` | Yes | `string` | Provider config id whose `baseUrl` should be checked. |
290
- | `defaultBaseUrl` | No | `string` | Base URL to assume when the provider config omits `baseUrl`. |
291
- | `allowedBaseUrls` | Yes | `string[]` | Allowed base URLs for this auth signal. The signal is ignored when the configured or default base URL does not match one of these normalized values. |
292
-
293
- ## Tool metadata reference
294
-
295
- `toolMetadata` uses the same `configSignals` and `authSignals` shapes as
296
- generation provider metadata, keyed by tool name. `contracts.tools` declares
297
- ownership. `toolMetadata` declares cheap availability evidence so FengMing can
298
- avoid importing a plugin runtime just to have its tool factory return `null`.
299
-
300
- ```json
301
- {
302
- "setup": {
303
- "providers": [
304
- {
305
- "id": "example",
306
- "envVars": ["EXAMPLE_API_KEY"]
307
- }
308
- ]
309
- },
310
- "contracts": {
311
- "tools": ["example_search"]
312
- },
313
- "toolMetadata": {
314
- "example_search": {
315
- "authSignals": [
316
- {
317
- "provider": "example"
318
- }
319
- ],
320
- "configSignals": [
321
- {
322
- "rootPath": "plugins.entries.example.config",
323
- "overlayPath": "search",
324
- "required": ["apiKey"]
325
- }
326
- ]
327
- }
328
- }
329
- }
330
- ```
331
-
332
- If a tool has no `toolMetadata`, FengMing preserves the existing behavior and
333
- loads the owning plugin when the tool contract matches policy. For hot-path
334
- tools whose factory depends on auth/config, plugin authors should declare
335
- `toolMetadata` instead of making core import runtime to ask.
336
-
337
- ## providerAuthChoices reference
338
-
339
- Each `providerAuthChoices` entry describes one onboarding or auth choice.
340
- FengMing reads this before provider runtime loads.
341
- Provider setup lists use these manifest choices, descriptor-derived setup
342
- choices, and install-catalog metadata without loading provider runtime.
343
-
344
- | Field | Required | Type | What it means |
345
- | --------------------- | -------- | --------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------- |
346
- | `provider` | Yes | `string` | Provider id this choice belongs to. |
347
- | `method` | Yes | `string` | Auth method id to dispatch to. |
348
- | `choiceId` | Yes | `string` | Stable auth-choice id used by onboarding and CLI flows. |
349
- | `choiceLabel` | No | `string` | User-facing label. If omitted, FengMing falls back to `choiceId`. |
350
- | `choiceHint` | No | `string` | Short helper text for the picker. |
351
- | `assistantPriority` | No | `number` | Lower values sort earlier in assistant-driven interactive pickers. |
352
- | `assistantVisibility` | No | `"visible"` \| `"manual-only"` | Hide the choice from assistant pickers while still allowing manual CLI selection. |
353
- | `deprecatedChoiceIds` | No | `string[]` | Legacy choice ids that should redirect users to this replacement choice. |
354
- | `groupId` | No | `string` | Optional group id for grouping related choices. |
355
- | `groupLabel` | No | `string` | User-facing label for that group. |
356
- | `groupHint` | No | `string` | Short helper text for the group. |
357
- | `optionKey` | No | `string` | Internal option key for simple one-flag auth flows. |
358
- | `cliFlag` | No | `string` | CLI flag name, such as `--openrouter-api-key`. |
359
- | `cliOption` | No | `string` | Full CLI option shape, such as `--openrouter-api-key <key>`. |
360
- | `cliDescription` | No | `string` | Description used in CLI help. |
361
- | `onboardingScopes` | No | `Array<"text-inference" \| "image-generation" \| "music-generation">` | Which onboarding surfaces this choice should appear in. If omitted, it defaults to `["text-inference"]`. |
362
-
363
- ## commandAliases reference
364
-
365
- Use `commandAliases` when a plugin owns a runtime command name that users may
366
- mistakenly put in `plugins.allow` or try to run as a root CLI command. FengMing
367
- uses this metadata for diagnostics without importing plugin runtime code.
368
-
369
- ```json
370
- {
371
- "commandAliases": [
372
- {
373
- "name": "dreaming",
374
- "kind": "runtime-slash",
375
- "cliCommand": "memory"
376
- }
377
- ]
378
- }
379
- ```
380
-
381
- | Field | Required | Type | What it means |
382
- | ------------ | -------- | ----------------- | ----------------------------------------------------------------------- |
383
- | `name` | Yes | `string` | Command name that belongs to this plugin. |
384
- | `kind` | No | `"runtime-slash"` | Marks the alias as a chat slash command rather than a root CLI command. |
385
- | `cliCommand` | No | `string` | Related root CLI command to suggest for CLI operations, if one exists. |
386
-
387
- ## activation reference
388
-
389
- Use `activation` when the plugin can cheaply declare which control-plane events
390
- should include it in an activation/load plan.
391
-
392
- This block is planner metadata, not a lifecycle API. It does not register
393
- runtime behavior, does not replace `register(...)`, and does not promise that
394
- plugin code has already executed. The activation planner uses these fields to
395
- narrow candidate plugins before falling back to existing manifest ownership
396
- metadata such as `providers`, `channels`, `commandAliases`, `setup.providers`,
397
- `contracts.tools`, and hooks.
398
-
399
- Prefer the narrowest metadata that already describes ownership. Use
400
- `providers`, `channels`, `commandAliases`, setup descriptors, or `contracts`
401
- when those fields express the relationship. Use `activation` for extra planner
402
- hints that cannot be represented by those ownership fields.
403
- Use top-level `cliBackends` for CLI runtime aliases such as `claude-cli`,
404
- `my-cli`, or `google-gemini-cli`; `activation.onAgentHarnesses` is only for
405
- embedded agent harness ids that do not already have an ownership field.
406
-
407
- This block is metadata only. It does not register runtime behavior, and it does
408
- not replace `register(...)`, `setupEntry`, or other runtime/plugin entrypoints.
409
- Current consumers use it as a narrowing hint before broader plugin loading, so
410
- missing non-startup activation metadata usually only costs performance; it
411
- should not change correctness while manifest ownership fallbacks still exist.
412
-
413
- Every plugin should set `activation.onStartup` intentionally. Set it to `true`
414
- only when the plugin must run during Gateway startup. Set it to `false` when
415
- the plugin is inert at startup and should load only from narrower triggers.
416
- Omitting `onStartup` no longer startup-loads the plugin implicitly; use explicit
417
- activation metadata for startup, channel, config, agent-harness, memory, or
418
- other narrower activation triggers.
419
-
420
- ```json
421
- {
422
- "activation": {
423
- "onStartup": false,
424
- "onProviders": ["openai"],
425
- "onCommands": ["models"],
426
- "onChannels": ["web"],
427
- "onRoutes": ["gateway-webhook"],
428
- "onConfigPaths": ["browser"],
429
- "onCapabilities": ["provider", "tool"]
430
- }
431
- }
432
- ```
433
-
434
- | Field | Required | Type | What it means |
435
- | ------------------ | -------- | ---------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
436
- | `onStartup` | No | `boolean` | Explicit Gateway startup activation. Every plugin should set this. `true` imports the plugin during startup; `false` keeps it startup-lazy unless another matched trigger requires loading. |
437
- | `onProviders` | No | `string[]` | Provider ids that should include this plugin in activation/load plans. |
438
- | `onAgentHarnesses` | No | `string[]` | Embedded agent harness runtime ids that should include this plugin in activation/load plans. Use top-level `cliBackends` for CLI backend aliases. |
439
- | `onCommands` | No | `string[]` | Command ids that should include this plugin in activation/load plans. |
440
- | `onChannels` | No | `string[]` | Channel ids that should include this plugin in activation/load plans. |
441
- | `onRoutes` | No | `string[]` | Route kinds that should include this plugin in activation/load plans. |
442
- | `onConfigPaths` | No | `string[]` | Root-relative config paths that should include this plugin in startup/load plans when the path is present and not explicitly disabled. |
443
- | `onCapabilities` | No | `Array<"provider" \| "channel" \| "tool" \| "hook">` | Broad capability hints used by control-plane activation planning. Prefer narrower fields when possible. |
444
-
445
- Current live consumers:
446
-
447
- - Gateway startup planning uses `activation.onStartup` for explicit startup
448
- import
449
- - command-triggered CLI planning falls back to legacy
450
- `commandAliases[].cliCommand` or `commandAliases[].name`
451
- - agent-runtime startup planning uses `activation.onAgentHarnesses` for
452
- embedded harnesses and top-level `cliBackends[]` for CLI runtime aliases
453
- - channel-triggered setup/channel planning falls back to legacy `channels[]`
454
- ownership when explicit channel activation metadata is missing
455
- - startup plugin planning uses `activation.onConfigPaths` for non-channel root
456
- config surfaces such as the bundled browser plugin's `browser` block
457
- - provider-triggered setup/runtime planning falls back to legacy
458
- `providers[]` and top-level `cliBackends[]` ownership when explicit provider
459
- activation metadata is missing
460
-
461
- Planner diagnostics can distinguish explicit activation hints from manifest
462
- ownership fallback. For example, `activation-command-hint` means
463
- `activation.onCommands` matched, while `manifest-command-alias` means the
464
- planner used `commandAliases` ownership instead. These reason labels are for
465
- host diagnostics and tests; plugin authors should keep declaring the metadata
466
- that best describes ownership.
467
-
468
- ## qaRunners reference
469
-
470
- Use `qaRunners` when a plugin contributes one or more transport runners beneath
471
- the shared `fengming qa` root. Keep this metadata cheap and static; the plugin
472
- runtime still owns actual CLI registration through a lightweight
473
- `runtime-api.ts` surface that exports `qaRunnerCliRegistrations`.
474
-
475
- ```json
476
- {
477
- "qaRunners": [
478
- {
479
- "commandName": "matrix",
480
- "description": "Run the Docker-backed Matrix live QA lane against a disposable homeserver"
481
- }
482
- ]
483
- }
484
- ```
485
-
486
- | Field | Required | Type | What it means |
487
- | ------------- | -------- | -------- | ------------------------------------------------------------------ |
488
- | `commandName` | Yes | `string` | Subcommand mounted beneath `fengming qa`, for example `matrix`. |
489
- | `description` | No | `string` | Fallback help text used when the shared host needs a stub command. |
490
-
491
- ## setup reference
492
-
493
- Use `setup` when setup and onboarding surfaces need cheap plugin-owned metadata
494
- before runtime loads.
495
-
496
- ```json
497
- {
498
- "setup": {
499
- "providers": [
500
- {
501
- "id": "openai",
502
- "authMethods": ["api-key"],
503
- "envVars": ["OPENAI_API_KEY"],
504
- "authEvidence": [
505
- {
506
- "type": "local-file-with-env",
507
- "fileEnvVar": "OPENAI_CREDENTIALS_FILE",
508
- "requiresAllEnv": ["OPENAI_PROJECT"],
509
- "credentialMarker": "openai-local-credentials",
510
- "source": "openai local credentials"
511
- }
512
- ]
513
- }
514
- ],
515
- "cliBackends": ["openai-cli"],
516
- "configMigrations": ["legacy-openai-auth"],
517
- "requiresRuntime": false
518
- }
519
- }
520
- ```
521
-
522
- Top-level `cliBackends` stays valid and continues to describe CLI inference
523
- backends. `setup.cliBackends` is the setup-specific descriptor surface for
524
- control-plane/setup flows that should stay metadata-only.
525
-
526
- When present, `setup.providers` and `setup.cliBackends` are the preferred
527
- descriptor-first lookup surface for setup discovery. If the descriptor only
528
- narrows the candidate plugin and setup still needs richer setup-time runtime
529
- hooks, set `requiresRuntime: true` and keep `setup-api` in place as the
530
- fallback execution path.
531
-
532
- FengMing also includes `setup.providers[].envVars` in generic provider auth and
533
- env-var lookups. `providerAuthEnvVars` remains supported through a compatibility
534
- adapter during the deprecation window, but non-bundled plugins that still use it
535
- receive a manifest diagnostic. New plugins should put setup/status env metadata
536
- on `setup.providers[].envVars`.
537
-
538
- FengMing can also derive simple setup choices from `setup.providers[].authMethods`
539
- when no setup entry is available, or when `setup.requiresRuntime: false`
540
- declares setup runtime unnecessary. Explicit `providerAuthChoices` entries stay
541
- preferred for custom labels, CLI flags, onboarding scope, and assistant metadata.
542
-
543
- Set `requiresRuntime: false` only when those descriptors are sufficient for the
544
- setup surface. FengMing treats explicit `false` as a descriptor-only contract
545
- and will not execute `setup-api` or `fengming.setupEntry` for setup lookup. If
546
- a descriptor-only plugin still ships one of those setup runtime entries,
547
- FengMing reports an additive diagnostic and continues ignoring it. Omitted
548
- `requiresRuntime` keeps legacy fallback behavior so existing plugins that added
549
- descriptors without the flag do not break.
550
-
551
- Because setup lookup can execute plugin-owned `setup-api` code, normalized
552
- `setup.providers[].id` and `setup.cliBackends[]` values must stay unique across
553
- discovered plugins. Ambiguous ownership fails closed instead of picking a
554
- winner from discovery order.
555
-
556
- When setup runtime does execute, setup registry diagnostics report descriptor
557
- drift if `setup-api` registers a provider or CLI backend that the manifest
558
- descriptors do not declare, or if a descriptor has no matching runtime
559
- registration. These diagnostics are additive and do not reject legacy plugins.
560
-
561
- ### setup.providers reference
562
-
563
- | Field | Required | Type | What it means |
564
- | -------------- | -------- | ---------- | ------------------------------------------------------------------------------------------------ |
565
- | `id` | Yes | `string` | Provider id exposed during setup or onboarding. Keep normalized ids globally unique. |
566
- | `authMethods` | No | `string[]` | Setup/auth method ids this provider supports without loading full runtime. |
567
- | `envVars` | No | `string[]` | Env vars that generic setup/status surfaces can check before plugin runtime loads. |
568
- | `authEvidence` | No | `object[]` | Cheap local auth evidence checks for providers that can authenticate through non-secret markers. |
569
-
570
- `authEvidence` is for provider-owned local credential markers that can be
571
- verified without loading runtime code. These checks must stay cheap and local:
572
- no network calls, no keychain or secret-manager reads, no shell commands, and no
573
- provider API probes.
574
-
575
- Supported evidence entries:
576
-
577
- | Field | Required | Type | What it means |
578
- | ------------------ | -------- | ---------- | -------------------------------------------------------------------------------------------------------------- |
579
- | `type` | Yes | `string` | Currently `local-file-with-env`. |
580
- | `fileEnvVar` | No | `string` | Env var containing an explicit credential file path. |
581
- | `fallbackPaths` | No | `string[]` | Local credential file paths checked when `fileEnvVar` is absent or empty. Supports `${HOME}` and `${APPDATA}`. |
582
- | `requiresAnyEnv` | No | `string[]` | At least one listed env var must be non-empty before the evidence is valid. |
583
- | `requiresAllEnv` | No | `string[]` | Every listed env var must be non-empty before the evidence is valid. |
584
- | `credentialMarker` | Yes | `string` | Non-secret marker returned when the evidence is present. |
585
- | `source` | No | `string` | User-facing source label for auth/status output. |
586
-
587
- ### setup fields
588
-
589
- | Field | Required | Type | What it means |
590
- | ------------------ | -------- | ---------- | --------------------------------------------------------------------------------------------------- |
591
- | `providers` | No | `object[]` | Provider setup descriptors exposed during setup and onboarding. |
592
- | `cliBackends` | No | `string[]` | Setup-time backend ids used for descriptor-first setup lookup. Keep normalized ids globally unique. |
593
- | `configMigrations` | No | `string[]` | Config migration ids owned by this plugin's setup surface. |
594
- | `requiresRuntime` | No | `boolean` | Whether setup still needs `setup-api` execution after descriptor lookup. |
595
-
596
- ## uiHints reference
597
-
598
- `uiHints` is a map from config field names to small rendering hints.
599
-
600
- ```json
601
- {
602
- "uiHints": {
603
- "apiKey": {
604
- "label": "API key",
605
- "help": "Used for OpenRouter requests",
606
- "placeholder": "sk-or-v1-...",
607
- "sensitive": true
608
- }
609
- }
610
- }
611
- ```
612
-
613
- Each field hint can include:
614
-
615
- | Field | Type | What it means |
616
- | ------------- | ---------- | --------------------------------------- |
617
- | `label` | `string` | User-facing field label. |
618
- | `help` | `string` | Short helper text. |
619
- | `tags` | `string[]` | Optional UI tags. |
620
- | `advanced` | `boolean` | Marks the field as advanced. |
621
- | `sensitive` | `boolean` | Marks the field as secret or sensitive. |
622
- | `placeholder` | `string` | Placeholder text for form inputs. |
623
-
624
- ## contracts reference
625
-
626
- Use `contracts` only for static capability ownership metadata that FengMing can
627
- read without importing the plugin runtime.
628
-
629
- ```json
630
- {
631
- "contracts": {
632
- "agentToolResultMiddleware": ["fengming", "codex"],
633
- "externalAuthProviders": ["acme-ai"],
634
- "embeddingProviders": ["openai-compatible"],
635
- "speechProviders": ["openai"],
636
- "realtimeTranscriptionProviders": ["openai"],
637
- "realtimeVoiceProviders": ["openai"],
638
- "memoryEmbeddingProviders": ["local"],
639
- "mediaUnderstandingProviders": ["openai"],
640
- "imageGenerationProviders": ["openai"],
641
- "videoGenerationProviders": ["qwen"],
642
- "webFetchProviders": ["firecrawl"],
643
- "webSearchProviders": ["gemini"],
644
- "migrationProviders": ["hermes"],
645
- "gatewayMethodDispatch": ["authenticated-request"],
646
- "tools": ["firecrawl_search", "firecrawl_scrape"]
647
- }
648
- }
649
- ```
650
-
651
- Each list is optional:
652
-
653
- | Field | Type | What it means |
654
- | -------------------------------- | ---------- | ---------------------------------------------------------------------------------------------------- |
655
- | `embeddedExtensionFactories` | `string[]` | Codex app-server extension factory ids, currently `codex-app-server`. |
656
- | `agentToolResultMiddleware` | `string[]` | Runtime ids a bundled plugin may register tool-result middleware for. |
657
- | `externalAuthProviders` | `string[]` | Provider ids whose external auth profile hook this plugin owns. |
658
- | `embeddingProviders` | `string[]` | General embedding provider ids this plugin owns for reusable vector embedding use, including memory. |
659
- | `speechProviders` | `string[]` | Speech provider ids this plugin owns. |
660
- | `realtimeTranscriptionProviders` | `string[]` | Realtime-transcription provider ids this plugin owns. |
661
- | `realtimeVoiceProviders` | `string[]` | Realtime-voice provider ids this plugin owns. |
662
- | `memoryEmbeddingProviders` | `string[]` | Deprecated memory-specific embedding provider ids this plugin owns. |
663
- | `mediaUnderstandingProviders` | `string[]` | Media-understanding provider ids this plugin owns. |
664
- | `transcriptSourceProviders` | `string[]` | Transcript source provider ids this plugin owns. |
665
- | `imageGenerationProviders` | `string[]` | Image-generation provider ids this plugin owns. |
666
- | `videoGenerationProviders` | `string[]` | Video-generation provider ids this plugin owns. |
667
- | `webFetchProviders` | `string[]` | Web-fetch provider ids this plugin owns. |
668
- | `webSearchProviders` | `string[]` | Web-search provider ids this plugin owns. |
669
- | `migrationProviders` | `string[]` | Import provider ids this plugin owns for `fengming migrate`. |
670
- | `gatewayMethodDispatch` | `string[]` | Reserved entitlement for authenticated plugin HTTP routes that dispatch Gateway methods in-process. |
671
- | `tools` | `string[]` | Agent tool names this plugin owns. |
672
-
673
- `contracts.embeddedExtensionFactories` is retained for bundled Codex
674
- app-server-only extension factories. Bundled tool-result transforms should
675
- declare `contracts.agentToolResultMiddleware` and register with
676
- `api.registerAgentToolResultMiddleware(...)` instead. External plugins cannot
677
- register tool-result middleware because the seam can rewrite high-trust tool
678
- output before the model sees it.
679
-
680
- Runtime `api.registerTool(...)` registrations must match `contracts.tools`.
681
- Tool discovery uses this list to load only the plugin runtimes that can own the
682
- requested tools.
683
-
684
- Provider plugins that implement `resolveExternalAuthProfiles` should declare
685
- `contracts.externalAuthProviders`; undeclared external-auth hooks are ignored.
686
-
687
- General embedding providers should declare `contracts.embeddingProviders` for
688
- each adapter registered with `api.registerEmbeddingProvider(...)`. Use the
689
- general contract for reusable vector generation, including providers consumed by
690
- memory search. `contracts.memoryEmbeddingProviders` is deprecated
691
- memory-specific compatibility and remains only while existing providers migrate
692
- to the generic embedding provider seam.
693
-
694
- `contracts.gatewayMethodDispatch` currently accepts
695
- `"authenticated-request"`. It is an API hygiene gate for native plugin HTTP
696
- routes that intentionally dispatch Gateway control-plane methods in-process, not
697
- a sandbox against malicious native plugins. Use it only for tightly reviewed
698
- bundled/operator surfaces that already require Gateway HTTP auth.
699
-
700
- ## mediaUnderstandingProviderMetadata reference
701
-
702
- Use `mediaUnderstandingProviderMetadata` when a media-understanding provider has
703
- default models, auto-auth fallback priority, or native document support that
704
- generic core helpers need before runtime loads. Keys must also be declared in
705
- `contracts.mediaUnderstandingProviders`.
706
-
707
- ```json
708
- {
709
- "contracts": {
710
- "mediaUnderstandingProviders": ["example"]
711
- },
712
- "mediaUnderstandingProviderMetadata": {
713
- "example": {
714
- "capabilities": ["image", "audio"],
715
- "defaultModels": {
716
- "image": "example-vision-latest",
717
- "audio": "example-transcribe-latest"
718
- },
719
- "autoPriority": {
720
- "image": 40
721
- },
722
- "nativeDocumentInputs": ["pdf"]
723
- }
724
- }
725
- }
726
- ```
727
-
728
- Each provider entry can include:
729
-
730
- | Field | Type | What it means |
731
- | ---------------------- | ----------------------------------- | ---------------------------------------------------------------------------- |
732
- | `capabilities` | `("image" \| "audio" \| "video")[]` | Media capabilities exposed by this provider. |
733
- | `defaultModels` | `Record<string, string>` | Capability-to-model defaults used when config does not specify a model. |
734
- | `autoPriority` | `Record<string, number>` | Lower numbers sort earlier for automatic credential-based provider fallback. |
735
- | `nativeDocumentInputs` | `"pdf"[]` | Native document inputs supported by the provider. |
736
-
737
- ## channelConfigs reference
738
-
739
- Use `channelConfigs` when a channel plugin needs cheap config metadata before
740
- runtime loads. Read-only channel setup/status discovery can use this metadata
741
- directly for configured external channels when no setup entry is available, or
742
- when `setup.requiresRuntime: false` declares setup runtime unnecessary.
743
-
744
- `channelConfigs` is plugin manifest metadata, not a new top-level user config
745
- section. Users still configure channel instances under `channels.<channel-id>`.
746
- FengMing reads manifest metadata to decide which plugin owns that configured
747
- channel before plugin runtime code executes.
748
-
749
- For a channel plugin, `configSchema` and `channelConfigs` describe different
750
- paths:
751
-
752
- - `configSchema` validates `plugins.entries.<plugin-id>.config`
753
- - `channelConfigs.<channel-id>.schema` validates `channels.<channel-id>`
754
-
755
- Non-bundled plugins that declare `channels[]` should also declare matching
756
- `channelConfigs` entries. Without them, FengMing can still load the plugin, but
757
- cold-path config schema, setup, and Control UI surfaces cannot know the
758
- channel-owned option shape until plugin runtime executes.
759
-
760
- `channelConfigs.<channel-id>.commands.nativeCommandsAutoEnabled` and
761
- `nativeSkillsAutoEnabled` can declare static `auto` defaults for command config
762
- checks that run before channel runtime loads. Bundled channels can also publish
763
- the same defaults through `package.json#fengming.channel.commands` alongside
764
- their other package-owned channel catalog metadata.
765
-
766
- ```json
767
- {
768
- "channelConfigs": {
769
- "matrix": {
770
- "schema": {
771
- "type": "object",
772
- "additionalProperties": false,
773
- "properties": {
774
- "homeserverUrl": { "type": "string" }
775
- }
776
- },
777
- "uiHints": {
778
- "homeserverUrl": {
779
- "label": "Homeserver URL",
780
- "placeholder": "https://matrix.example.com"
781
- }
782
- },
783
- "label": "Matrix",
784
- "description": "Matrix homeserver connection",
785
- "commands": {
786
- "nativeCommandsAutoEnabled": true,
787
- "nativeSkillsAutoEnabled": true
788
- },
789
- "preferOver": ["matrix-legacy"]
790
- }
791
- }
792
- }
793
- ```
794
-
795
- Each channel entry can include:
796
-
797
- | Field | Type | What it means |
798
- | ------------- | ------------------------ | ----------------------------------------------------------------------------------------- |
799
- | `schema` | `object` | JSON Schema for `channels.<id>`. Required for each declared channel config entry. |
800
- | `uiHints` | `Record<string, object>` | Optional UI labels/placeholders/sensitive hints for that channel config section. |
801
- | `label` | `string` | Channel label merged into picker and inspect surfaces when runtime metadata is not ready. |
802
- | `description` | `string` | Short channel description for inspect and catalog surfaces. |
803
- | `commands` | `object` | Static native command and native skill auto-defaults for pre-runtime config checks. |
804
- | `preferOver` | `string[]` | Legacy or lower-priority plugin ids this channel should outrank in selection surfaces. |
805
-
806
- ### Replacing another channel plugin
807
-
808
- Use `preferOver` when your plugin is the preferred owner for a channel id that
809
- another plugin can also provide. Common cases are a renamed plugin id, a
810
- standalone plugin that supersedes a bundled plugin, or a maintained fork that
811
- keeps the same channel id for config compatibility.
812
-
813
- ```json
814
- {
815
- "id": "acme-chat",
816
- "channels": ["chat"],
817
- "channelConfigs": {
818
- "chat": {
819
- "schema": {
820
- "type": "object",
821
- "additionalProperties": false,
822
- "properties": {
823
- "webhookUrl": { "type": "string" }
824
- }
825
- },
826
- "preferOver": ["chat"]
827
- }
828
- }
829
- }
830
- ```
831
-
832
- When `channels.chat` is configured, FengMing considers both the channel id and
833
- the preferred plugin id. If the lower-priority plugin was only selected because
834
- it is bundled or enabled by default, FengMing disables it in the effective
835
- runtime config so one plugin owns the channel and its tools. Explicit user
836
- selection still wins: if the user explicitly enables both plugins, FengMing
837
- preserves that choice and reports duplicate channel/tool diagnostics instead of
838
- silently changing the requested plugin set.
839
-
840
- Keep `preferOver` scoped to plugin ids that can really provide the same channel.
841
- It is not a general priority field and it does not rename user config keys.
842
-
843
- ## modelSupport reference
844
-
845
- Use `modelSupport` when FengMing should infer your provider plugin from
846
- shorthand model ids like `gpt-5.5` or `claude-sonnet-4.6` before plugin runtime
847
- loads.
848
-
849
- ```json
850
- {
851
- "modelSupport": {
852
- "modelPrefixes": ["gpt-", "o1", "o3", "o4"],
853
- "modelPatterns": ["^computer-use-preview"]
854
- }
855
- }
856
- ```
857
-
858
- FengMing applies this precedence:
859
-
860
- - explicit `provider/model` refs use the owning `providers` manifest metadata
861
- - `modelPatterns` beat `modelPrefixes`
862
- - if one non-bundled plugin and one bundled plugin both match, the non-bundled
863
- plugin wins
864
- - remaining ambiguity is ignored until the user or config specifies a provider
865
-
866
- Fields:
867
-
868
- | Field | Type | What it means |
869
- | --------------- | ---------- | ------------------------------------------------------------------------------- |
870
- | `modelPrefixes` | `string[]` | Prefixes matched with `startsWith` against shorthand model ids. |
871
- | `modelPatterns` | `string[]` | Regex sources matched against shorthand model ids after profile suffix removal. |
872
-
873
- `modelPatterns` entries are compiled through `compileSafeRegex`, which rejects
874
- patterns containing nested repetition (for example `(a+)+$`). Patterns that fail
875
- the safety check are silently skipped, the same as syntactically invalid regex.
876
- Keep patterns simple and avoid nested quantifiers.
877
-
878
- ## modelCatalog reference
879
-
880
- Use `modelCatalog` when FengMing should know provider model metadata before
881
- loading plugin runtime. This is the manifest-owned source for fixed catalog
882
- rows, provider aliases, suppression rules, and discovery mode. Runtime refresh
883
- still belongs in provider runtime code, but the manifest tells core when runtime
884
- is required.
885
-
886
- ```json
887
- {
888
- "providers": ["openai"],
889
- "modelCatalog": {
890
- "providers": {
891
- "openai": {
892
- "baseUrl": "https://api.openai.com/v1",
893
- "api": "openai-responses",
894
- "models": [
895
- {
896
- "id": "gpt-5.4",
897
- "name": "GPT-5.4",
898
- "input": ["text", "image"],
899
- "reasoning": true,
900
- "contextWindow": 256000,
901
- "maxTokens": 128000,
902
- "cost": {
903
- "input": 1.25,
904
- "output": 10,
905
- "cacheRead": 0.125
906
- },
907
- "status": "available",
908
- "tags": ["default"]
909
- }
910
- ]
911
- }
912
- },
913
- "aliases": {
914
- "azure-openai-responses": {
915
- "provider": "openai",
916
- "api": "azure-openai-responses"
917
- }
918
- },
919
- "suppressions": [
920
- {
921
- "provider": "azure-openai-responses",
922
- "model": "gpt-5.3-codex-spark",
923
- "reason": "not available on Azure OpenAI Responses"
924
- }
925
- ],
926
- "discovery": {
927
- "openai": "static"
928
- }
929
- }
930
- }
931
- ```
932
-
933
- Top-level fields:
934
-
935
- | Field | Type | What it means |
936
- | ---------------- | -------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------- |
937
- | `providers` | `Record<string, object>` | Catalog rows for provider ids owned by this plugin. Keys should also appear in top-level `providers`. |
938
- | `aliases` | `Record<string, object>` | Provider aliases that should resolve to an owned provider for catalog or suppression planning. |
939
- | `suppressions` | `object[]` | Model rows from another source that this plugin suppresses for a provider-specific reason. |
940
- | `discovery` | `Record<string, "static" \| "refreshable" \| "runtime">` | Whether the provider catalog can be read from manifest metadata, refreshed into cache, or requires runtime. |
941
- | `runtimeAugment` | `boolean` | Set to `true` only when the provider runtime must append catalog rows after manifest/config planning. |
942
-
943
- `aliases` participates in provider ownership lookup for model-catalog planning.
944
- Alias targets must be top-level providers owned by the same plugin. When a
945
- provider-filtered list uses an alias, FengMing can read the owning manifest and
946
- apply alias API/base URL overrides without loading provider runtime.
947
- Aliases do not expand unfiltered catalog listings; broad lists emit the owning
948
- canonical provider rows only.
949
-
950
- `suppressions` replaces the old provider runtime `suppressBuiltInModel` hook.
951
- Suppression entries are honored only when the provider is owned by the plugin or
952
- declared as a `modelCatalog.aliases` key that targets an owned provider. Runtime
953
- suppression hooks are no longer called during model resolution.
954
-
955
- Provider fields:
956
-
957
- | Field | Type | What it means |
958
- | --------- | ------------------------ | ----------------------------------------------------------------- |
959
- | `baseUrl` | `string` | Optional default base URL for models in this provider catalog. |
960
- | `api` | `ModelApi` | Optional default API adapter for models in this provider catalog. |
961
- | `headers` | `Record<string, string>` | Optional static headers that apply to this provider catalog. |
962
- | `models` | `object[]` | Required model rows. Rows without an `id` are ignored. |
963
-
964
- Model fields:
965
-
966
- | Field | Type | What it means |
967
- | --------------- | -------------------------------------------------------------- | --------------------------------------------------------------------------- |
968
- | `id` | `string` | Provider-local model id, without the `provider/` prefix. |
969
- | `name` | `string` | Optional display name. |
970
- | `api` | `ModelApi` | Optional per-model API override. |
971
- | `baseUrl` | `string` | Optional per-model base URL override. |
972
- | `headers` | `Record<string, string>` | Optional per-model static headers. |
973
- | `input` | `Array<"text" \| "image" \| "document" \| "audio" \| "video">` | Modalities the model accepts. |
974
- | `reasoning` | `boolean` | Whether the model exposes reasoning behavior. |
975
- | `contextWindow` | `number` | Native provider context window. |
976
- | `contextTokens` | `number` | Optional effective runtime context cap when different from `contextWindow`. |
977
- | `maxTokens` | `number` | Maximum output tokens when known. |
978
- | `cost` | `object` | Optional USD per million token pricing, including optional `tieredPricing`. |
979
- | `compat` | `object` | Optional compatibility flags matching FengMing model config compatibility. |
980
- | `status` | `"available"` \| `"preview"` \| `"deprecated"` \| `"disabled"` | Listing status. Suppress only when the row must not appear at all. |
981
- | `statusReason` | `string` | Optional reason shown with non-available status. |
982
- | `replaces` | `string[]` | Older provider-local model ids this model supersedes. |
983
- | `replacedBy` | `string` | Replacement provider-local model id for deprecated rows. |
984
- | `tags` | `string[]` | Stable tags used by pickers and filters. |
985
-
986
- Suppression fields:
987
-
988
- | Field | Type | What it means |
989
- | -------------------------- | ---------- | --------------------------------------------------------------------------------------------------------- |
990
- | `provider` | `string` | Provider id for the upstream row to suppress. Must be owned by this plugin or declared as an owned alias. |
991
- | `model` | `string` | Provider-local model id to suppress. |
992
- | `reason` | `string` | Optional message shown when the suppressed row is requested directly. |
993
- | `when.baseUrlHosts` | `string[]` | Optional list of effective provider base URL hosts required before the suppression applies. |
994
- | `when.providerConfigApiIn` | `string[]` | Optional list of exact provider-config `api` values required before the suppression applies. |
995
-
996
- Do not put runtime-only data in `modelCatalog`. Use `static` only when manifest
997
- rows are complete enough for provider-filtered list and picker surfaces to skip
998
- registry/runtime discovery. Use `refreshable` when manifest rows are useful
999
- listable seeds or supplements but a refresh/cache can add more rows later;
1000
- refreshable rows are not authoritative by themselves. Use `runtime` when FengMing
1001
- must load provider runtime to know the list.
1002
-
1003
- ## modelIdNormalization reference
1004
-
1005
- Use `modelIdNormalization` for cheap provider-owned model-id cleanup that must
1006
- happen before provider runtime loads. This keeps aliases such as short model
1007
- names, provider-local legacy ids, and proxy prefix rules in the owning plugin
1008
- manifest instead of in core model-selection tables.
1009
-
1010
- ```json
1011
- {
1012
- "providers": ["anthropic", "openrouter"],
1013
- "modelIdNormalization": {
1014
- "providers": {
1015
- "anthropic": {
1016
- "aliases": {
1017
- "sonnet-4.6": "claude-sonnet-4-6"
1018
- }
1019
- },
1020
- "openrouter": {
1021
- "prefixWhenBare": "openrouter"
1022
- }
1023
- }
1024
- }
1025
- }
1026
- ```
1027
-
1028
- Provider fields:
1029
-
1030
- | Field | Type | What it means |
1031
- | ------------------------------------ | ----------------------- | ----------------------------------------------------------------------------------------- |
1032
- | `aliases` | `Record<string,string>` | Case-insensitive exact model-id aliases. Values are returned as written. |
1033
- | `stripPrefixes` | `string[]` | Prefixes to remove before alias lookup, useful for legacy provider/model duplication. |
1034
- | `prefixWhenBare` | `string` | Prefix to add when the normalized model id does not already contain `/`. |
1035
- | `prefixWhenBareAfterAliasStartsWith` | `object[]` | Conditional bare-id prefix rules after alias lookup, keyed by `modelPrefix` and `prefix`. |
1036
-
1037
- ## providerEndpoints reference
1038
-
1039
- Use `providerEndpoints` for endpoint classification that generic request policy
1040
- must know before provider runtime loads. Core still owns the meaning of each
1041
- `endpointClass`; plugin manifests own the host and base URL metadata.
1042
-
1043
- Endpoint fields:
1044
-
1045
- | Field | Type | What it means |
1046
- | ------------------------------ | ---------- | ---------------------------------------------------------------------------------------------- |
1047
- | `endpointClass` | `string` | Known core endpoint class, such as `openrouter`, `moonshot-native`, or `google-vertex`. |
1048
- | `hosts` | `string[]` | Exact hostnames that map to the endpoint class. |
1049
- | `hostSuffixes` | `string[]` | Host suffixes that map to the endpoint class. Prefix with `.` for domain suffix-only matching. |
1050
- | `baseUrls` | `string[]` | Exact normalized HTTP(S) base URLs that map to the endpoint class. |
1051
- | `googleVertexRegion` | `string` | Static Google Vertex region for exact global hosts. |
1052
- | `googleVertexRegionHostSuffix` | `string` | Suffix to strip from matching hosts to expose the Google Vertex region prefix. |
1053
-
1054
- ## providerRequest reference
1055
-
1056
- Use `providerRequest` for cheap request-compatibility metadata that generic
1057
- request policy needs without loading provider runtime. Keep behavior-specific
1058
- payload rewriting in provider runtime hooks or shared provider-family helpers.
1059
-
1060
- ```json
1061
- {
1062
- "providers": ["vllm"],
1063
- "providerRequest": {
1064
- "providers": {
1065
- "vllm": {
1066
- "family": "vllm",
1067
- "openAICompletions": {
1068
- "supportsStreamingUsage": true
1069
- }
1070
- }
1071
- }
1072
- }
1073
- }
1074
- ```
1075
-
1076
- Provider fields:
1077
-
1078
- | Field | Type | What it means |
1079
- | --------------------- | ------------ | -------------------------------------------------------------------------------------- |
1080
- | `family` | `string` | Provider family label used by generic request compatibility decisions and diagnostics. |
1081
- | `compatibilityFamily` | `"moonshot"` | Optional provider-family compatibility bucket for shared request helpers. |
1082
- | `openAICompletions` | `object` | OpenAI-compatible completions request flags, currently `supportsStreamingUsage`. |
1083
-
1084
- ## secretProviderIntegrations reference
1085
-
1086
- Use `secretProviderIntegrations` when a plugin can publish a reusable SecretRef
1087
- exec provider preset. FengMing reads this metadata before plugin runtime loads,
1088
- stores plugin ownership in `secrets.providers.<alias>.pluginIntegration`, and
1089
- leaves actual secret resolution to the SecretRef runtime.
1090
- Presets are exposed only for bundled plugins and installed plugins discovered
1091
- from the managed plugin install roots, such as git and ClawHub installs.
1092
-
1093
- ```json
1094
- {
1095
- "secretProviderIntegrations": {
1096
- "secret-store": {
1097
- "providerAlias": "team-secrets",
1098
- "displayName": "Team secrets",
1099
- "source": "exec",
1100
- "command": "${node}",
1101
- "args": ["./bin/resolve-secrets.mjs"]
1102
- }
1103
- }
1104
- }
1105
- ```
1106
-
1107
- The map key is the integration id. If `providerAlias` is omitted, FengMing uses
1108
- the integration id as the SecretRef provider alias. Provider aliases must match
1109
- the normal SecretRef provider alias pattern, for example `team-secrets` or
1110
- `onepassword-work`.
1111
-
1112
- When an operator selects the preset, FengMing writes a provider reference like:
1113
-
1114
- ```json
1115
- {
1116
- "secrets": {
1117
- "providers": {
1118
- "team-secrets": {
1119
- "source": "exec",
1120
- "pluginIntegration": {
1121
- "pluginId": "acme-secrets",
1122
- "integrationId": "secret-store"
1123
- }
1124
- }
1125
- }
1126
- }
1127
- }
1128
- ```
1129
-
1130
- At startup/reload, FengMing resolves that provider by loading current plugin
1131
- manifest metadata, checking that the owning plugin is installed and active, and
1132
- materializing the exec command from the manifest. Disabling or removing the
1133
- plugin revokes the provider for active SecretRefs. Operators who want standalone
1134
- exec configuration can still write manual `command`/`args` providers directly.
1135
-
1136
- Only `source: "exec"` presets are currently supported. `command` must be
1137
- `${node}`, and `args[0]` must be a `./` plugin-root-relative resolver script.
1138
- FengMing materializes it at startup/reload to the current Node executable and
1139
- the absolute in-plugin script path. Node options such as `--require`, `--import`,
1140
- `--loader`, `--env-file`, `--eval`, and `--print` are not part of the manifest
1141
- preset contract. Operators who need non-Node commands can configure standalone
1142
- manual exec providers directly.
1143
-
1144
- FengMing derives `trustedDirs` for manifest presets from the plugin root and,
1145
- for `${node}` presets, the current Node executable directory. Manifest-authored
1146
- `trustedDirs` are ignored. Other exec provider options such as `timeoutMs`,
1147
- `maxOutputBytes`, `jsonOnly`, `env`, `passEnv`, and `allowInsecurePath` pass
1148
- through to the normal SecretRef exec provider config.
1149
-
1150
- ## modelPricing reference
1151
-
1152
- Use `modelPricing` when a provider needs control-plane pricing behavior before
1153
- runtime loads. The Gateway pricing cache reads this metadata without importing
1154
- provider runtime code.
1155
-
1156
- ```json
1157
- {
1158
- "providers": ["ollama", "openrouter"],
1159
- "modelPricing": {
1160
- "providers": {
1161
- "ollama": {
1162
- "external": false
1163
- },
1164
- "openrouter": {
1165
- "openRouter": {
1166
- "passthroughProviderModel": true
1167
- },
1168
- "liteLLM": false
1169
- }
1170
- }
1171
- }
1172
- }
1173
- ```
1174
-
1175
- Provider fields:
1176
-
1177
- | Field | Type | What it means |
1178
- | ------------ | ----------------- | -------------------------------------------------------------------------------------------------- |
1179
- | `external` | `boolean` | Set `false` for local/self-hosted providers that should never fetch OpenRouter or LiteLLM pricing. |
1180
- | `openRouter` | `false \| object` | OpenRouter pricing lookup mapping. `false` disables OpenRouter lookup for this provider. |
1181
- | `liteLLM` | `false \| object` | LiteLLM pricing lookup mapping. `false` disables LiteLLM lookup for this provider. |
1182
-
1183
- Source fields:
1184
-
1185
- | Field | Type | What it means |
1186
- | -------------------------- | ------------------ | -------------------------------------------------------------------------------------------------------------------- |
1187
- | `provider` | `string` | External catalog provider id when it differs from the FengMing provider id, for example `z-ai` for a `zai` provider. |
1188
- | `passthroughProviderModel` | `boolean` | Treat slash-containing model ids as nested provider/model refs, useful for proxy providers such as OpenRouter. |
1189
- | `modelIdTransforms` | `"version-dots"[]` | Extra external catalog model-id variants. `version-dots` tries dotted version ids like `claude-opus-4.6`. |
1190
-
1191
- ### FengMing Provider Index
1192
-
1193
- The FengMing Provider Index is FengMing-owned preview metadata for providers
1194
- whose plugins may not be installed yet. It is not part of a plugin manifest.
1195
- Plugin manifests remain the installed-plugin authority. The Provider Index is
1196
- the internal fallback contract that future installable-provider and pre-install
1197
- model picker surfaces will consume when a provider plugin is not installed.
1198
-
1199
- Catalog authority order:
1200
-
1201
- 1. User config.
1202
- 2. Installed plugin manifest `modelCatalog`.
1203
- 3. Model catalog cache from explicit refresh.
1204
- 4. FengMing Provider Index preview rows.
1205
-
1206
- The Provider Index must not contain secrets, enabled state, runtime hooks, or
1207
- live account-specific model data. Its preview catalogs use the same
1208
- `modelCatalog` provider row shape as plugin manifests, but should stay limited
1209
- to stable display metadata unless runtime adapter fields such as `api`,
1210
- `baseUrl`, pricing, or compatibility flags are intentionally kept aligned with
1211
- the installed plugin manifest. Providers with live `/models` discovery should
1212
- write refreshed rows through the explicit model catalog cache path instead of
1213
- making normal listing or onboarding call provider APIs.
1214
-
1215
- Provider Index entries may also carry installable-plugin metadata for providers
1216
- whose plugin has moved out of core or is otherwise not installed yet. This
1217
- metadata mirrors the channel catalog pattern: package name, npm install spec,
1218
- expected integrity, and cheap auth-choice labels are enough to show an
1219
- installable setup option. Once the plugin is installed, its manifest wins and
1220
- the Provider Index entry is ignored for that provider.
1221
-
1222
- Legacy top-level capability keys are deprecated. Use `fengming doctor --fix` to
1223
- move `speechProviders`, `realtimeTranscriptionProviders`,
1224
- `realtimeVoiceProviders`, `mediaUnderstandingProviders`,
1225
- `imageGenerationProviders`, `videoGenerationProviders`,
1226
- `webFetchProviders`, and `webSearchProviders` under `contracts`; normal
1227
- manifest loading no longer treats those top-level fields as capability
1228
- ownership.
1229
-
1230
- ## Manifest versus package.json
1231
-
1232
- The two files serve different jobs:
1233
-
1234
- | File | Use it for |
1235
- | ---------------------- | -------------------------------------------------------------------------------------------------------------------------------- |
1236
- | `fengming.plugin.json` | Discovery, config validation, auth-choice metadata, and UI hints that must exist before plugin code runs |
1237
- | `package.json` | npm metadata, dependency installation, and the `fengming` block used for entrypoints, install gating, setup, or catalog metadata |
1238
-
1239
- If you are unsure where a piece of metadata belongs, use this rule:
1240
-
1241
- - if FengMing must know it before loading plugin code, put it in `fengming.plugin.json`
1242
- - if it is about packaging, entry files, or npm install behavior, put it in `package.json`
1243
-
1244
- ### package.json fields that affect discovery
1245
-
1246
- Some pre-runtime plugin metadata intentionally lives in `package.json` under the
1247
- `fengming` block instead of `fengming.plugin.json`.
1248
- `fengming.bundle` and `fengming.bundle.json` are not FengMing plugin contracts;
1249
- native plugins must use `fengming.plugin.json` plus the supported
1250
- `package.json#fengming` fields below.
1251
-
1252
- Important examples:
1253
-
1254
- | Field | What it means |
1255
- | ------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
1256
- | `fengming.extensions` | Declares native plugin entrypoints. Must stay inside the plugin package directory. |
1257
- | `fengming.runtimeExtensions` | Declares built JavaScript runtime entrypoints for installed packages. Must stay inside the plugin package directory. |
1258
- | `fengming.setupEntry` | Lightweight setup-only entrypoint used during onboarding, deferred channel startup, and read-only channel status/SecretRef discovery. Must stay inside the plugin package directory. |
1259
- | `fengming.runtimeSetupEntry` | Declares the built JavaScript setup entrypoint for installed packages. Requires `setupEntry`, must exist, and must stay inside the plugin package directory. |
1260
- | `fengming.channel` | Cheap channel catalog metadata like labels, docs paths, aliases, and selection copy. |
1261
- | `fengming.channel.commands` | Static native command and native skill auto-default metadata used by config, audit, and command-list surfaces before channel runtime loads. |
1262
- | `fengming.channel.configuredState` | Lightweight configured-state checker metadata that can answer "does env-only setup already exist?" without loading the full channel runtime. |
1263
- | `fengming.channel.persistedAuthState` | Lightweight persisted-auth checker metadata that can answer "is anything already signed in?" without loading the full channel runtime. |
1264
- | `fengming.install.clawhubSpec` / `fengming.install.npmSpec` / `fengming.install.localPath` | Install/update hints for bundled and externally published plugins. |
1265
- | `fengming.install.defaultChoice` | Preferred install path when multiple install sources are available. |
1266
- | `fengming.install.minHostVersion` | Minimum supported FengMing host version, using a semver floor like `>=2026.3.22` or `>=2026.5.1-beta.1`. |
1267
- | `fengming.compat.pluginApi` | Minimum FengMing plugin API range required by this package, using a semver floor like `>=2026.5.27`. |
1268
- | `fengming.install.expectedIntegrity` | Expected npm dist integrity string such as `sha512-...`; install and update flows verify the fetched artifact against it. |
1269
- | `fengming.install.allowInvalidConfigRecovery` | Allows a narrow bundled-plugin reinstall recovery path when config is invalid. |
1270
- | `fengming.startup.deferConfiguredChannelFullLoadUntilAfterListen` | Lets setup-runtime channel surfaces load before listen, then defers the full configured channel plugin until post-listen activation. |
1271
-
1272
- Manifest metadata decides which provider/channel/setup choices appear in
1273
- onboarding before runtime loads. `package.json#fengming.install` tells
1274
- onboarding how to fetch or enable that plugin when the user picks one of those
1275
- choices. Do not move install hints into `fengming.plugin.json`.
1276
-
1277
- `fengming.install.minHostVersion` is enforced during install and manifest
1278
- registry loading for non-bundled plugin sources. Invalid values are rejected;
1279
- newer-but-valid values skip external plugins on older hosts. Bundled source
1280
- plugins are assumed to be co-versioned with the host checkout.
1281
-
1282
- `fengming.compat.pluginApi` is enforced during package install for non-bundled
1283
- plugin sources. Use it for the FengMing plugin SDK/runtime API floor that the
1284
- package was built against. It can be stricter than `minHostVersion` when a
1285
- plugin package needs a newer API but still keeps a lower install hint for other
1286
- flows. Official FengMing release sync bumps existing official plugin API floors
1287
- to the FengMing release version by default, but plugin-only releases can keep a
1288
- lower floor when the package intentionally supports older hosts. Do not use the
1289
- package version alone as the compatibility contract. `peerDependencies.fengming`
1290
- remains npm package metadata; FengMing uses the `fengming.compat.pluginApi`
1291
- contract for install compatibility decisions.
1292
-
1293
- Official install-on-demand metadata should use `clawhubSpec` when the plugin is
1294
- published on ClawHub; onboarding treats that as the preferred remote source and
1295
- records ClawHub artifact facts after install. `npmSpec` remains the compatibility
1296
- fallback for packages that have not moved to ClawHub yet.
1297
-
1298
- Exact npm version pinning already lives in `npmSpec`, for example
1299
- `"npmSpec": "@wecom/wecom-fengming-plugin@1.2.3"`. Official external catalog
1300
- entries should pair exact specs with `expectedIntegrity` so update flows fail
1301
- closed if the fetched npm artifact no longer matches the pinned release.
1302
- Interactive onboarding still offers trusted registry npm specs, including bare
1303
- package names and dist-tags, for compatibility. Catalog diagnostics can
1304
- distinguish exact, floating, integrity-pinned, missing-integrity, package-name
1305
- mismatch, and invalid default-choice sources. They also warn when
1306
- `expectedIntegrity` is present but there is no valid npm source it can pin.
1307
- When `expectedIntegrity` is present,
1308
- install/update flows enforce it; when it is omitted, the registry resolution is
1309
- recorded without an integrity pin.
1310
-
1311
- Channel plugins should provide `fengming.setupEntry` when status, channel list,
1312
- or SecretRef scans need to identify configured accounts without loading the full
1313
- runtime. The setup entry should expose channel metadata plus setup-safe config,
1314
- status, and secrets adapters; keep network clients, gateway listeners, and
1315
- transport runtimes in the main extension entrypoint.
1316
-
1317
- Runtime entrypoint fields do not override package-boundary checks for source
1318
- entrypoint fields. For example, `fengming.runtimeExtensions` cannot make an
1319
- escaping `fengming.extensions` path loadable.
1320
-
1321
- `fengming.install.allowInvalidConfigRecovery` is intentionally narrow. It does
1322
- not make arbitrary broken configs installable. Today it only allows install
1323
- flows to recover from specific stale bundled-plugin upgrade failures, such as a
1324
- missing bundled plugin path or a stale `channels.<id>` entry for that same
1325
- bundled plugin. Unrelated config errors still block install and send operators
1326
- to `fengming doctor --fix`.
1327
-
1328
- `fengming.channel.persistedAuthState` is package metadata for a tiny checker
1329
- module:
1330
-
1331
- ```json
1332
- {
1333
- "fengming": {
1334
- "channel": {
1335
- "id": "whatsapp",
1336
- "persistedAuthState": {
1337
- "specifier": "./auth-presence",
1338
- "exportName": "hasAnyWhatsAppAuth"
1339
- }
1340
- }
1341
- }
1342
- }
1343
- ```
1344
-
1345
- Use it when setup, doctor, status, or read-only presence flows need a cheap
1346
- yes/no auth probe before the full channel plugin loads. Persisted auth state is
1347
- not configured channel state: do not use this metadata to auto-enable plugins,
1348
- repair runtime dependencies, or decide whether a channel runtime should load.
1349
- The target export should be a small function that reads persisted state only; do
1350
- not route it through the full channel runtime barrel.
1351
-
1352
- `fengming.channel.configuredState` follows the same shape for cheap env-only
1353
- configured checks:
1354
-
1355
- ```json
1356
- {
1357
- "fengming": {
1358
- "channel": {
1359
- "id": "telegram",
1360
- "configuredState": {
1361
- "specifier": "./configured-state",
1362
- "exportName": "hasTelegramConfiguredState"
1363
- }
1364
- }
1365
- }
1366
- }
1367
- ```
1368
-
1369
- Use it when a channel can answer configured-state from env or other tiny
1370
- non-runtime inputs. If the check needs full config resolution or the real
1371
- channel runtime, keep that logic in the plugin `config.hasConfiguredState`
1372
- hook instead.
1373
-
1374
- ## Discovery precedence (duplicate plugin ids)
1375
-
1376
- FengMing discovers plugins from several roots. For the raw filesystem scan
1377
- order, see [Plugin scan
1378
- order](/gateway/configuration-reference#plugin-scan-order). If two discoveries
1379
- share the same `id`, only the **highest-precedence** manifest is kept;
1380
- lower-precedence duplicates are dropped instead of loading beside it.
1381
-
1382
- Precedence, highest to lowest:
1383
-
1384
- 1. **Config-selected** — a path explicitly pinned in `plugins.entries.<id>`
1385
- 2. **Bundled** — plugins shipped with FengMing
1386
- 3. **Global install** — plugins installed into the global FengMing plugin root
1387
- 4. **Workspace** — plugins discovered relative to the current workspace
1388
-
1389
- Implications:
1390
-
1391
- - A forked or stale copy of a bundled plugin sitting in the workspace will not shadow the bundled build.
1392
- - To actually override a bundled plugin with a local one, pin it via `plugins.entries.<id>` so it wins by precedence rather than relying on workspace discovery.
1393
- - Duplicate drops are logged so Doctor and startup diagnostics can point at the discarded copy.
1394
- - Config-selected duplicate overrides are worded as explicit overrides in diagnostics, but still warn so stale forks and accidental shadows stay visible.
1395
-
1396
- ## JSON Schema requirements
1397
-
1398
- - **Every plugin must ship a JSON Schema**, even if it accepts no config.
1399
- - An empty schema is acceptable (for example, `{ "type": "object", "additionalProperties": false }`).
1400
- - Schemas are validated at config read/write time, not at runtime.
1401
- - When extending or forking a bundled plugin with new config keys, update that plugin's `fengming.plugin.json` `configSchema` at the same time. Bundled plugin schemas are strict, so adding `plugins.entries.<id>.config.myNewKey` in user config without adding `myNewKey` to `configSchema.properties` will be rejected before the plugin runtime loads.
1402
-
1403
- Example schema extension:
1404
-
1405
- ```json
1406
- {
1407
- "configSchema": {
1408
- "type": "object",
1409
- "additionalProperties": false,
1410
- "properties": {
1411
- "myNewKey": {
1412
- "type": "string"
1413
- }
1414
- }
1415
- }
1416
- }
1417
- ```
1418
-
1419
- ## Validation behavior
1420
-
1421
- - Unknown `channels.*` keys are **errors**, unless the channel id is declared by
1422
- a plugin manifest.
1423
- - `plugins.entries.<id>`, `plugins.allow`, `plugins.deny`, and `plugins.slots.*`
1424
- must reference **discoverable** plugin ids. Unknown ids are **errors**.
1425
- - If a plugin is installed but has a broken or missing manifest or schema,
1426
- validation fails and Doctor reports the plugin error.
1427
- - If plugin config exists but the plugin is **disabled**, the config is kept and
1428
- a **warning** is surfaced in Doctor + logs.
1429
-
1430
- See [Configuration reference](/gateway/configuration) for the full `plugins.*` schema.
1431
-
1432
- ## Notes
1433
-
1434
- - The manifest is **required for native FengMing plugins**, including local filesystem loads. Runtime still loads the plugin module separately; the manifest is only for discovery + validation.
1435
- - Native manifests are parsed with JSON5, so comments, trailing commas, and unquoted keys are accepted as long as the final value is still an object.
1436
- - Only documented manifest fields are read by the manifest loader. Avoid custom top-level keys.
1437
- - `channels`, `providers`, `cliBackends`, and `skills` can all be omitted when a plugin does not need them.
1438
- - `providerCatalogEntry` must stay lightweight and should not import broad runtime code; use it for static provider catalog metadata or narrow discovery descriptors, not request-time execution.
1439
- - Exclusive plugin kinds are selected through `plugins.slots.*`: `kind: "memory"` via `plugins.slots.memory`, `kind: "context-engine"` via `plugins.slots.contextEngine` (default `legacy`).
1440
- - Declare exclusive plugin kind in this manifest. Runtime-entry `FengMingPluginDefinition.kind` is deprecated and remains only as a compatibility fallback for older plugins.
1441
- - Env-var metadata (`setup.providers[].envVars`, deprecated `providerAuthEnvVars`, and `channelEnvVars`) is declarative only. Status, audit, cron delivery validation, and other read-only surfaces still apply plugin trust and effective activation policy before treating an env var as configured.
1442
- - For runtime wizard metadata that requires provider code, see [Provider runtime hooks](/plugins/architecture-internals#provider-runtime-hooks).
1443
- - If your plugin depends on native modules, document the build steps and any package-manager allowlist requirements (for example, pnpm `allow-build-scripts` + `pnpm rebuild <package>`).
1444
-
1445
- ## Related
1446
-
1447
- <CardGroup cols={3}>
1448
- <Card title="Building plugins" href="/plugins/building-plugins" icon="rocket">
1449
- Getting started with plugins.
1450
- </Card>
1451
- <Card title="Plugin architecture" href="/plugins/architecture" icon="diagram-project">
1452
- Internal architecture and capability model.
1453
- </Card>
1454
- <Card title="SDK overview" href="/plugins/sdk-overview" icon="book">
1455
- Plugin SDK reference and subpath imports.
1456
- </Card>
1457
- </CardGroup>