fengming 0.3.10 → 0.3.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (871) hide show
  1. package/dist/build-info.json +2 -2
  2. package/dist/canvas-host/a2ui/.bundle.hash +1 -1
  3. package/dist/cli/run-main.js +3 -3
  4. package/dist/cli-startup-metadata.json +8 -8
  5. package/dist/{command-registry-DMB-HKIk.js → command-registry-BHIBvpgR.js} +2 -2
  6. package/dist/{command-registry-C5ooX6PF.js → command-registry-BT5icv-c.js} +2 -2
  7. package/dist/{command-registry-core-B2w_XWvn.js → command-registry-core-C-a3GaYV.js} +2 -2
  8. package/dist/{completion-cli-Bf4mEw2W.js → completion-cli-BUfFF31m.js} +2 -2
  9. package/dist/control-ui/assets/{activity-D-mnRThU.js → activity-DF1iC1pF.js} +2 -2
  10. package/dist/control-ui/assets/{agents-U_KSP5I_.js → agents-CDGNJA8n.js} +2 -2
  11. package/dist/control-ui/assets/{channels-ohK9_G1O.js → channels-CAPFdCrE.js} +2 -2
  12. package/dist/control-ui/assets/{cron-6ZCzfU29.js → cron-DUUdUzzu.js} +2 -2
  13. package/dist/control-ui/assets/{debug-CSsDLg_s.js → debug-BwfVXGKK.js} +2 -2
  14. package/dist/control-ui/assets/{index-jUDczxhd.js → index-JWV4rMUy.js} +4 -4
  15. package/dist/control-ui/assets/{instances-782ZoDT4.js → instances-BqAPpn0Y.js} +2 -2
  16. package/dist/control-ui/assets/{nodes-BMX16BKM.js → nodes-gya-0PkG.js} +2 -2
  17. package/dist/control-ui/assets/{sessions-jLGSApYa.js → sessions-BdttyTpI.js} +2 -2
  18. package/dist/control-ui/assets/{skills-DweBwUhs.js → skills-D_rtwBjc.js} +2 -2
  19. package/dist/control-ui/assets/{workboard-BsU-FXIo.js → workboard-CIGDGkWB.js} +2 -2
  20. package/dist/control-ui/index.html +1 -1
  21. package/dist/control-ui/sw.js +1 -1
  22. package/dist/crestodian/crestodian.js +1 -1
  23. package/dist/crestodian/rescue-message.js +1 -1
  24. package/dist/{crestodian-C0x7JjF-.js → crestodian-CAxGCgHM.js} +3 -3
  25. package/dist/{dialogue-No0NvYX7.js → dialogue-CHuN9qet.js} +1 -1
  26. package/dist/gateway/protocol/index.d.ts +1 -1
  27. package/dist/{index-AZzJCgph.d.ts → index-DbpfOFUf.d.ts} +1 -1
  28. package/dist/{operations-Z85LFqsT.js → operations-Mvnrndji.js} +1 -1
  29. package/dist/plugin-sdk/.boundary-entry-shims.stamp +1 -1
  30. package/dist/plugin-sdk/{agent-harness-runtime-CgQiThzm.d.ts → agent-harness-runtime-Bkrjji63.d.ts} +2 -2
  31. package/dist/plugin-sdk/agent-harness-runtime.d.ts +4 -4
  32. package/dist/plugin-sdk/agent-harness-task-runtime.d.ts +1 -1
  33. package/dist/plugin-sdk/agent-harness.d.ts +4 -4
  34. package/dist/plugin-sdk/agent-runtime.d.ts +1 -1
  35. package/dist/plugin-sdk/{bundled-channel-config-schema-Dfn3b8sF.d.ts → bundled-channel-config-schema-ZTBQez8k.d.ts} +9 -9
  36. package/dist/plugin-sdk/bundled-channel-config-schema.d.ts +1 -1
  37. package/dist/plugin-sdk/channel-config-schema-legacy.d.ts +1 -1
  38. package/dist/plugin-sdk/channel-core.d.ts +2 -2
  39. package/dist/plugin-sdk/channel-entry-contract.d.ts +1 -1
  40. package/dist/plugin-sdk/{channel-pairing-CX6ncj1r.d.ts → channel-pairing-CzsPAHgH.d.ts} +1 -1
  41. package/dist/plugin-sdk/channel-pairing.d.ts +1 -1
  42. package/dist/plugin-sdk/channel-plugin-common.d.ts +2 -2
  43. package/dist/plugin-sdk/cli-backend.d.ts +1 -1
  44. package/dist/plugin-sdk/compat.d.ts +4 -4
  45. package/dist/plugin-sdk/{config-schema-DuJUjn6k.d.ts → config-schema-N64y7n8C.d.ts} +1 -1
  46. package/dist/plugin-sdk/config-schema.d.ts +4 -4
  47. package/dist/plugin-sdk/{core-CPtu2Ftl.d.ts → core-BWZB2hNB.d.ts} +1 -1
  48. package/dist/plugin-sdk/core.d.ts +7 -7
  49. package/dist/plugin-sdk/{delegate-uk6vAMkc.d.ts → delegate-o5xckIuc.d.ts} +1 -1
  50. package/dist/plugin-sdk/discord.d.ts +3 -3
  51. package/dist/plugin-sdk/{fengming-runtime-Dt2ZEVYX.d.ts → fengming-runtime-abXAXyq2.d.ts} +1 -1
  52. package/dist/plugin-sdk/gateway-runtime.d.ts +1 -1
  53. package/dist/plugin-sdk/{host-compat-CM0h9ODw.d.ts → host-compat-D2Ky8seZ.d.ts} +1 -1
  54. package/dist/plugin-sdk/{http-registry-BniL_epL.d.ts → http-registry-oxJbX3E-.d.ts} +2 -2
  55. package/dist/plugin-sdk/image-generation-core.d.ts +4 -4
  56. package/dist/plugin-sdk/image-generation-runtime.d.ts +3 -3
  57. package/dist/plugin-sdk/index.d.ts +4 -4
  58. package/dist/plugin-sdk/lmstudio.d.ts +1 -1
  59. package/dist/plugin-sdk/{loader-aELh60PE.d.ts → loader-CgJhYjxT.d.ts} +3 -3
  60. package/dist/plugin-sdk/{logger-BpB3--7Z.d.ts → logger-CyDIBtoX.d.ts} +1 -1
  61. package/dist/plugin-sdk/logging-core.d.ts +3 -3
  62. package/dist/plugin-sdk/memory-core-host-engine-embeddings.d.ts +2 -2
  63. package/dist/plugin-sdk/memory-core-host-engine-foundation.d.ts +3 -3
  64. package/dist/plugin-sdk/{memory-core-host-engine-storage-DYPjOQCg.d.ts → memory-core-host-engine-storage-DfW7ZqD0.d.ts} +1 -1
  65. package/dist/plugin-sdk/memory-core-host-engine-storage.d.ts +1 -1
  66. package/dist/plugin-sdk/memory-core-host-runtime-cli.d.ts +1 -1
  67. package/dist/plugin-sdk/memory-core-host-runtime-core.d.ts +3 -3
  68. package/dist/plugin-sdk/memory-core.d.ts +3 -3
  69. package/dist/plugin-sdk/memory-host-core.d.ts +3 -3
  70. package/dist/plugin-sdk/migration-runtime.d.ts +1 -1
  71. package/dist/plugin-sdk/migration.d.ts +1 -1
  72. package/dist/plugin-sdk/music-generation-core.d.ts +2 -2
  73. package/dist/plugin-sdk/{plugin-entry-DO9kQeTr.d.ts → plugin-entry-C9xM-ZA9.d.ts} +1 -1
  74. package/dist/plugin-sdk/plugin-entry.d.ts +3 -3
  75. package/dist/plugin-sdk/plugin-runtime.d.ts +3 -3
  76. package/dist/plugin-sdk/{provider-api-key-auth-DvIiojS6.d.ts → provider-api-key-auth-DOmYPTC2.d.ts} +1 -1
  77. package/dist/plugin-sdk/provider-auth-api-key.d.ts +4 -4
  78. package/dist/plugin-sdk/{provider-auth-helpers-CYkWZ0vq.d.ts → provider-auth-helpers-pqDNrZTd.d.ts} +1 -1
  79. package/dist/plugin-sdk/{provider-auth-input-DUV6ZTw4.d.ts → provider-auth-input-Ckt-cU4H.d.ts} +1 -1
  80. package/dist/plugin-sdk/provider-auth-result.d.ts +1 -1
  81. package/dist/plugin-sdk/provider-auth-runtime.d.ts +1 -1
  82. package/dist/plugin-sdk/provider-auth.d.ts +5 -5
  83. package/dist/plugin-sdk/provider-catalog-runtime.d.ts +2 -2
  84. package/dist/plugin-sdk/{provider-catalog-shared-Cm3SyFfL.d.ts → provider-catalog-shared-QvOT8Wz1.d.ts} +1 -1
  85. package/dist/plugin-sdk/provider-catalog-shared.d.ts +2 -2
  86. package/dist/plugin-sdk/provider-entry.d.ts +3 -3
  87. package/dist/plugin-sdk/{provider-model-shared-D5rgn7Gb.d.ts → provider-model-shared-Bnc8IMx5.d.ts} +1 -1
  88. package/dist/plugin-sdk/provider-model-shared.d.ts +2 -2
  89. package/dist/plugin-sdk/{provider-registry-DxdZT9UN.d.ts → provider-registry-Ba1nNfhA.d.ts} +1 -1
  90. package/dist/plugin-sdk/{provider-registry-DiKX35tc.d.ts → provider-registry-CqB5bSAD.d.ts} +1 -1
  91. package/dist/plugin-sdk/{provider-registry-D0vmhPWL.d.ts → provider-registry-CxdVib8g.d.ts} +1 -1
  92. package/dist/plugin-sdk/{provider-self-hosted-setup-BPx7JMDC.d.ts → provider-self-hosted-setup-eMoeVPnF.d.ts} +1 -1
  93. package/dist/plugin-sdk/provider-setup.d.ts +2 -2
  94. package/dist/plugin-sdk/{provider-stream-DcC2vn_N.d.ts → provider-stream-CGaLae9n.d.ts} +1 -1
  95. package/dist/plugin-sdk/provider-stream-family.d.ts +2 -2
  96. package/dist/plugin-sdk/{provider-stream-shared-ByDv3QKm.d.ts → provider-stream-shared-u5mt-8_i.d.ts} +1 -1
  97. package/dist/plugin-sdk/provider-stream-shared.d.ts +1 -1
  98. package/dist/plugin-sdk/provider-stream.d.ts +2 -2
  99. package/dist/plugin-sdk/provider-tools.d.ts +1 -1
  100. package/dist/plugin-sdk/provider-web-fetch-contract.d.ts +1 -1
  101. package/dist/plugin-sdk/provider-web-fetch.d.ts +1 -1
  102. package/dist/plugin-sdk/provider-web-search-config-contract.d.ts +2 -2
  103. package/dist/plugin-sdk/{provider-web-search-contract-fields-CY4v8kS-.d.ts → provider-web-search-contract-fields-BiWOSs_d.d.ts} +1 -1
  104. package/dist/plugin-sdk/provider-web-search-contract.d.ts +2 -2
  105. package/dist/plugin-sdk/provider-web-search.d.ts +1 -1
  106. package/dist/plugin-sdk/realtime-transcription.d.ts +1 -1
  107. package/dist/plugin-sdk/realtime-voice.d.ts +1 -1
  108. package/dist/plugin-sdk/{redact-identifier-CVwkabcI.d.ts → redact-identifier-CVqsKaEK.d.ts} +1 -1
  109. package/dist/plugin-sdk/{registry-CzaGoAKH.d.ts → registry-Gq9OFlb3.d.ts} +2 -2
  110. package/dist/plugin-sdk/{registry-types-DN1yiH3F.d.ts → registry-types-DyBkef1H.d.ts} +2 -2
  111. package/dist/plugin-sdk/reply-runtime.d.ts +1 -1
  112. package/dist/plugin-sdk/runtime-env.d.ts +3 -3
  113. package/dist/plugin-sdk/runtime-store.d.ts +1 -1
  114. package/dist/plugin-sdk/runtime.d.ts +3 -3
  115. package/dist/plugin-sdk/self-hosted-provider-setup.d.ts +2 -2
  116. package/dist/plugin-sdk/simple-completion-runtime.d.ts +1 -1
  117. package/dist/plugin-sdk/speech-core.d.ts +2 -2
  118. package/dist/plugin-sdk/speech.d.ts +2 -2
  119. package/dist/plugin-sdk/{subsystem-n4Y4vCcQ.d.ts → subsystem-Boo2DQIV.d.ts} +1 -1
  120. package/dist/plugin-sdk/text-runtime.d.ts +2 -2
  121. package/dist/plugin-sdk/tool-plugin.d.ts +2 -2
  122. package/dist/plugin-sdk/{types-BI8R-vGd.d.ts → types-DGF1KeaJ.d.ts} +2 -2
  123. package/dist/plugin-sdk/{types-CsqNt0j8.d.ts → types-DpaN54PS.d.ts} +1 -1
  124. package/dist/plugin-sdk/{unhandled-rejections-D9eBl3hT.d.ts → unhandled-rejections-Bez6JG0y.d.ts} +2 -2
  125. package/dist/plugin-sdk/video-generation-core.d.ts +3 -3
  126. package/dist/plugin-sdk/video-generation-runtime.d.ts +3 -3
  127. package/dist/plugin-sdk/webhook-ingress.d.ts +1 -1
  128. package/dist/plugin-sdk/webhook-targets.d.ts +1 -1
  129. package/dist/{program-D19g2jaa.js → program-BaCHjV-F.js} +1 -1
  130. package/dist/{register.crestodian-BhIukKDA.js → register.crestodian-DMJEPMf3.js} +1 -1
  131. package/dist/register.subclis-B0BgjwyK.js +3 -0
  132. package/dist/{register.subclis-DVk0HU4k.js → register.subclis-BuoWG93n.js} +2 -2
  133. package/dist/{register.subclis-core-BK7nVvl6.js → register.subclis-core-BGBFrWE3.js} +2 -2
  134. package/dist/{standalone-CHrieUsw.js → standalone-CV2Ud6F7.js} +1 -1
  135. package/dist/tui-Bvt7hhwe.js +3 -0
  136. package/dist/tui-CFSmzhsm.js +2 -0
  137. package/dist/{tui-backend-_Pn3Byj-.js → tui-backend-Bm_t5G7x.js} +4 -4
  138. package/dist/{tui-cli-CAiC39zd.js → tui-cli-9Ny23hmo.js} +1 -1
  139. package/dist/tui-ink-run-CuExfFLV.js +2 -0
  140. package/dist/{tui-ink-run-ChXEGj1h.js → tui-ink-run-qNL49iQn.js} +17 -1
  141. package/package.json +6 -410
  142. package/CHANGELOG.md +0 -42
  143. package/THIRD_PARTY_NOTICES.md +0 -37
  144. package/dist/register.subclis-Bsvdh8RI.js +0 -3
  145. package/dist/tui-C733Qov0.js +0 -2
  146. package/dist/tui-DqbscVN5.js +0 -3
  147. package/dist/tui-ink-run-D4mSfLHj.js +0 -2
  148. package/docs/.i18n/README.md +0 -81
  149. package/docs/.i18n/ar-navigation.json +0 -18
  150. package/docs/.i18n/de-navigation.json +0 -18
  151. package/docs/.i18n/es-navigation.json +0 -18
  152. package/docs/.i18n/fr-navigation.json +0 -18
  153. package/docs/.i18n/glossary.ar.json +0 -78
  154. package/docs/.i18n/glossary.de.json +0 -78
  155. package/docs/.i18n/glossary.es.json +0 -78
  156. package/docs/.i18n/glossary.fa.json +0 -78
  157. package/docs/.i18n/glossary.fr.json +0 -78
  158. package/docs/.i18n/glossary.id.json +0 -78
  159. package/docs/.i18n/glossary.it.json +0 -78
  160. package/docs/.i18n/glossary.ja-JP.json +0 -98
  161. package/docs/.i18n/glossary.ko.json +0 -78
  162. package/docs/.i18n/glossary.nl.json +0 -78
  163. package/docs/.i18n/glossary.pl.json +0 -78
  164. package/docs/.i18n/glossary.pt-BR.json +0 -78
  165. package/docs/.i18n/glossary.th.json +0 -78
  166. package/docs/.i18n/glossary.tr.json +0 -78
  167. package/docs/.i18n/glossary.uk.json +0 -78
  168. package/docs/.i18n/glossary.vi.json +0 -78
  169. package/docs/.i18n/glossary.zh-CN.json +0 -1122
  170. package/docs/.i18n/glossary.zh-TW.json +0 -78
  171. package/docs/.i18n/id-navigation.json +0 -18
  172. package/docs/.i18n/it-navigation.json +0 -18
  173. package/docs/.i18n/ja-navigation.json +0 -18
  174. package/docs/.i18n/ko-navigation.json +0 -18
  175. package/docs/.i18n/pl-navigation.json +0 -18
  176. package/docs/.i18n/pt-BR-navigation.json +0 -18
  177. package/docs/.i18n/tr-navigation.json +0 -18
  178. package/docs/.i18n/translation-workflow.md +0 -111
  179. package/docs/.i18n/zh-Hans-navigation.json +0 -552
  180. package/docs/AGENTS.md +0 -36
  181. package/docs/CLAUDE.md +0 -1
  182. package/docs/agent-runtime-architecture.md +0 -48
  183. package/docs/announcements/bluebubbles-imessage.md +0 -79
  184. package/docs/auth-credential-semantics.md +0 -124
  185. package/docs/automation/auth-monitoring.md +0 -11
  186. package/docs/automation/clawflow.md +0 -12
  187. package/docs/automation/cron-jobs.md +0 -534
  188. package/docs/automation/cron-vs-heartbeat.md +0 -11
  189. package/docs/automation/gmail-pubsub.md +0 -11
  190. package/docs/automation/hooks.md +0 -387
  191. package/docs/automation/index.md +0 -135
  192. package/docs/automation/poll.md +0 -12
  193. package/docs/automation/standing-orders.md +0 -250
  194. package/docs/automation/taskflow.md +0 -155
  195. package/docs/automation/tasks.md +0 -374
  196. package/docs/automation/troubleshooting.md +0 -12
  197. package/docs/automation/webhook.md +0 -12
  198. package/docs/brave-search.md +0 -11
  199. package/docs/channels/access-groups.md +0 -201
  200. package/docs/channels/ambient-room-events.md +0 -214
  201. package/docs/channels/bot-loop-protection.md +0 -131
  202. package/docs/channels/broadcast-groups.md +0 -472
  203. package/docs/channels/channel-routing.md +0 -162
  204. package/docs/channels/clickclack.md +0 -138
  205. package/docs/channels/discord.md +0 -1758
  206. package/docs/channels/feishu.md +0 -650
  207. package/docs/channels/googlechat.md +0 -284
  208. package/docs/channels/group-messages.md +0 -95
  209. package/docs/channels/groups.md +0 -524
  210. package/docs/channels/imessage-from-bluebubbles.md +0 -259
  211. package/docs/channels/imessage.md +0 -839
  212. package/docs/channels/index.md +0 -64
  213. package/docs/channels/irc.md +0 -253
  214. package/docs/channels/line.md +0 -243
  215. package/docs/channels/location.md +0 -71
  216. package/docs/channels/matrix-migration.md +0 -370
  217. package/docs/channels/matrix-presentation.md +0 -77
  218. package/docs/channels/matrix-push-rules.md +0 -150
  219. package/docs/channels/matrix.md +0 -921
  220. package/docs/channels/mattermost.md +0 -542
  221. package/docs/channels/msteams.md +0 -1096
  222. package/docs/channels/nextcloud-talk.md +0 -176
  223. package/docs/channels/nostr.md +0 -253
  224. package/docs/channels/pairing.md +0 -214
  225. package/docs/channels/qqbot.md +0 -314
  226. package/docs/channels/signal.md +0 -417
  227. package/docs/channels/slack.md +0 -1623
  228. package/docs/channels/synology-chat.md +0 -187
  229. package/docs/channels/telegram.md +0 -1124
  230. package/docs/channels/tlon.md +0 -296
  231. package/docs/channels/troubleshooting.md +0 -162
  232. package/docs/channels/twitch.md +0 -431
  233. package/docs/channels/wechat.md +0 -171
  234. package/docs/channels/whatsapp.md +0 -796
  235. package/docs/channels/yuanbao.md +0 -416
  236. package/docs/channels/zalo.md +0 -253
  237. package/docs/channels/zalouser.md +0 -217
  238. package/docs/ci.md +0 -657
  239. package/docs/clawhub/publishing.md +0 -96
  240. package/docs/cli/acp.md +0 -370
  241. package/docs/cli/agent.md +0 -109
  242. package/docs/cli/agents.md +0 -253
  243. package/docs/cli/approvals.md +0 -190
  244. package/docs/cli/backup.md +0 -98
  245. package/docs/cli/browser.md +0 -307
  246. package/docs/cli/channels.md +0 -154
  247. package/docs/cli/clawbot.md +0 -25
  248. package/docs/cli/commitments.md +0 -90
  249. package/docs/cli/completion.md +0 -39
  250. package/docs/cli/config.md +0 -504
  251. package/docs/cli/configure.md +0 -77
  252. package/docs/cli/crestodian.md +0 -337
  253. package/docs/cli/cron.md +0 -304
  254. package/docs/cli/daemon.md +0 -67
  255. package/docs/cli/dashboard.md +0 -33
  256. package/docs/cli/devices.md +0 -240
  257. package/docs/cli/directory.md +0 -68
  258. package/docs/cli/dns.md +0 -53
  259. package/docs/cli/docs.md +0 -63
  260. package/docs/cli/doctor.md +0 -241
  261. package/docs/cli/flows.md +0 -52
  262. package/docs/cli/gateway.md +0 -572
  263. package/docs/cli/health.md +0 -43
  264. package/docs/cli/hooks.md +0 -345
  265. package/docs/cli/index.md +0 -400
  266. package/docs/cli/infer.md +0 -364
  267. package/docs/cli/logs.md +0 -68
  268. package/docs/cli/mcp.md +0 -529
  269. package/docs/cli/memory.md +0 -183
  270. package/docs/cli/message.md +0 -317
  271. package/docs/cli/migrate.md +0 -334
  272. package/docs/cli/models.md +0 -239
  273. package/docs/cli/node.md +0 -177
  274. package/docs/cli/nodes.md +0 -76
  275. package/docs/cli/onboard.md +0 -250
  276. package/docs/cli/pairing.md +0 -77
  277. package/docs/cli/path.md +0 -511
  278. package/docs/cli/plugins.md +0 -459
  279. package/docs/cli/policy.md +0 -886
  280. package/docs/cli/proxy.md +0 -89
  281. package/docs/cli/qr.md +0 -56
  282. package/docs/cli/reset.md +0 -39
  283. package/docs/cli/sandbox.md +0 -208
  284. package/docs/cli/secrets.md +0 -202
  285. package/docs/cli/security.md +0 -136
  286. package/docs/cli/sessions.md +0 -164
  287. package/docs/cli/setup.md +0 -59
  288. package/docs/cli/skills.md +0 -122
  289. package/docs/cli/status.md +0 -45
  290. package/docs/cli/system.md +0 -89
  291. package/docs/cli/tasks.md +0 -111
  292. package/docs/cli/transcripts.md +0 -151
  293. package/docs/cli/tui.md +0 -91
  294. package/docs/cli/uninstall.md +0 -44
  295. package/docs/cli/update.md +0 -243
  296. package/docs/cli/voicecall.md +0 -204
  297. package/docs/cli/webhooks.md +0 -117
  298. package/docs/cli/wiki.md +0 -256
  299. package/docs/concepts/active-memory.md +0 -856
  300. package/docs/concepts/agent-loop.md +0 -185
  301. package/docs/concepts/agent-runtimes.md +0 -276
  302. package/docs/concepts/agent-workspace.md +0 -230
  303. package/docs/concepts/agent.md +0 -140
  304. package/docs/concepts/architecture.md +0 -154
  305. package/docs/concepts/channel-docking.md +0 -145
  306. package/docs/concepts/commitments.md +0 -150
  307. package/docs/concepts/compaction.md +0 -203
  308. package/docs/concepts/context-engine.md +0 -347
  309. package/docs/concepts/context.md +0 -199
  310. package/docs/concepts/delegate-architecture.md +0 -319
  311. package/docs/concepts/dreaming.md +0 -264
  312. package/docs/concepts/experimental-features.md +0 -109
  313. package/docs/concepts/features.md +0 -91
  314. package/docs/concepts/fengming-sdk.md +0 -323
  315. package/docs/concepts/mantis-slack-desktop-runbook.md +0 -231
  316. package/docs/concepts/mantis.md +0 -744
  317. package/docs/concepts/markdown-formatting.md +0 -139
  318. package/docs/concepts/memory-builtin.md +0 -148
  319. package/docs/concepts/memory-honcho.md +0 -144
  320. package/docs/concepts/memory-qmd.md +0 -271
  321. package/docs/concepts/memory-search.md +0 -167
  322. package/docs/concepts/memory.md +0 -299
  323. package/docs/concepts/message-lifecycle-refactor.md +0 -1126
  324. package/docs/concepts/messages.md +0 -214
  325. package/docs/concepts/model-failover.md +0 -384
  326. package/docs/concepts/model-providers.md +0 -719
  327. package/docs/concepts/models.md +0 -371
  328. package/docs/concepts/multi-agent.md +0 -625
  329. package/docs/concepts/oauth.md +0 -198
  330. package/docs/concepts/parallel-specialist-lanes.md +0 -127
  331. package/docs/concepts/personal-agent-benchmark-pack.md +0 -74
  332. package/docs/concepts/presence.md +0 -117
  333. package/docs/concepts/progress-drafts.md +0 -406
  334. package/docs/concepts/qa-e2e-automation.md +0 -947
  335. package/docs/concepts/qa-matrix.md +0 -139
  336. package/docs/concepts/queue-steering.md +0 -90
  337. package/docs/concepts/queue.md +0 -136
  338. package/docs/concepts/retry.md +0 -86
  339. package/docs/concepts/session-pruning.md +0 -104
  340. package/docs/concepts/session-tool.md +0 -188
  341. package/docs/concepts/session.md +0 -164
  342. package/docs/concepts/soul.md +0 -116
  343. package/docs/concepts/streaming.md +0 -257
  344. package/docs/concepts/system-prompt.md +0 -328
  345. package/docs/concepts/timezone.md +0 -47
  346. package/docs/concepts/typebox.md +0 -309
  347. package/docs/concepts/typing-indicators.md +0 -88
  348. package/docs/concepts/usage-tracking.md +0 -66
  349. package/docs/date-time.md +0 -126
  350. package/docs/debug/node-issue.md +0 -90
  351. package/docs/diagnostics/flags.md +0 -182
  352. package/docs/docs.json +0 -1862
  353. package/docs/fengming-agent-runtime.md +0 -82
  354. package/docs/gateway/authentication.md +0 -256
  355. package/docs/gateway/background-process.md +0 -147
  356. package/docs/gateway/bonjour.md +0 -303
  357. package/docs/gateway/bridge-protocol.md +0 -97
  358. package/docs/gateway/cli-backends.md +0 -439
  359. package/docs/gateway/config-agents.md +0 -1525
  360. package/docs/gateway/config-channels.md +0 -945
  361. package/docs/gateway/config-tools.md +0 -774
  362. package/docs/gateway/configuration-examples.md +0 -704
  363. package/docs/gateway/configuration-reference.md +0 -1391
  364. package/docs/gateway/configuration.md +0 -739
  365. package/docs/gateway/diagnostics.md +0 -213
  366. package/docs/gateway/discovery.md +0 -154
  367. package/docs/gateway/doctor.md +0 -575
  368. package/docs/gateway/gateway-lock.md +0 -37
  369. package/docs/gateway/health.md +0 -73
  370. package/docs/gateway/heartbeat.md +0 -498
  371. package/docs/gateway/index.md +0 -383
  372. package/docs/gateway/local-model-services.md +0 -205
  373. package/docs/gateway/local-models.md +0 -355
  374. package/docs/gateway/logging.md +0 -149
  375. package/docs/gateway/multiple-gateways.md +0 -178
  376. package/docs/gateway/network-model.md +0 -15
  377. package/docs/gateway/openai-http-api.md +0 -378
  378. package/docs/gateway/openresponses-http-api.md +0 -347
  379. package/docs/gateway/openshell.md +0 -316
  380. package/docs/gateway/opentelemetry.md +0 -433
  381. package/docs/gateway/operator-scopes.md +0 -119
  382. package/docs/gateway/pairing.md +0 -207
  383. package/docs/gateway/prometheus.md +0 -249
  384. package/docs/gateway/protocol.md +0 -826
  385. package/docs/gateway/remote-gateway-readme.md +0 -169
  386. package/docs/gateway/remote.md +0 -280
  387. package/docs/gateway/sandbox-vs-tool-policy-vs-elevated.md +0 -148
  388. package/docs/gateway/sandboxing.md +0 -546
  389. package/docs/gateway/secrets-plan-contract.md +0 -159
  390. package/docs/gateway/secrets.md +0 -805
  391. package/docs/gateway/security/audit-checks.md +0 -127
  392. package/docs/gateway/security/exposure-runbook.md +0 -212
  393. package/docs/gateway/security/index.md +0 -1343
  394. package/docs/gateway/security/secure-file-operations.md +0 -76
  395. package/docs/gateway/security/shrinkwrap.md +0 -111
  396. package/docs/gateway/tailscale.md +0 -156
  397. package/docs/gateway/tools-invoke-http-api.md +0 -169
  398. package/docs/gateway/troubleshooting.md +0 -877
  399. package/docs/gateway/trusted-proxy-auth.md +0 -483
  400. package/docs/help/debugging.md +0 -341
  401. package/docs/help/environment.md +0 -233
  402. package/docs/help/faq-first-run.md +0 -870
  403. package/docs/help/faq-models.md +0 -556
  404. package/docs/help/faq.md +0 -2041
  405. package/docs/help/index.md +0 -39
  406. package/docs/help/scripts.md +0 -56
  407. package/docs/help/testing-live.md +0 -587
  408. package/docs/help/testing-updates-plugins.md +0 -299
  409. package/docs/help/testing.md +0 -977
  410. package/docs/help/troubleshooting.md +0 -449
  411. package/docs/index.md +0 -196
  412. package/docs/install/ansible.md +0 -233
  413. package/docs/install/azure.md +0 -315
  414. package/docs/install/bun.md +0 -59
  415. package/docs/install/clawdock.md +0 -112
  416. package/docs/install/development-channels.md +0 -148
  417. package/docs/install/digitalocean.md +0 -174
  418. package/docs/install/docker-vm-runtime.md +0 -154
  419. package/docs/install/docker.md +0 -564
  420. package/docs/install/exe-dev.md +0 -201
  421. package/docs/install/fly.md +0 -524
  422. package/docs/install/gcp.md +0 -418
  423. package/docs/install/hetzner.md +0 -285
  424. package/docs/install/hostinger.md +0 -98
  425. package/docs/install/index.md +0 -232
  426. package/docs/install/installer.md +0 -447
  427. package/docs/install/kubernetes.md +0 -196
  428. package/docs/install/macos-vm.md +0 -281
  429. package/docs/install/migrating-claude.md +0 -165
  430. package/docs/install/migrating-hermes.md +0 -178
  431. package/docs/install/migrating.md +0 -137
  432. package/docs/install/nix.md +0 -112
  433. package/docs/install/node.md +0 -142
  434. package/docs/install/northflank.mdx +0 -44
  435. package/docs/install/oracle.md +0 -218
  436. package/docs/install/podman.md +0 -216
  437. package/docs/install/railway.mdx +0 -92
  438. package/docs/install/raspberry-pi.md +0 -234
  439. package/docs/install/render.mdx +0 -167
  440. package/docs/install/uninstall.md +0 -131
  441. package/docs/install/updating.md +0 -284
  442. package/docs/install/upstash.md +0 -96
  443. package/docs/logging.md +0 -320
  444. package/docs/nav-tabs-underline.js +0 -100
  445. package/docs/network.md +0 -72
  446. package/docs/nodes/audio.md +0 -216
  447. package/docs/nodes/camera.md +0 -166
  448. package/docs/nodes/images.md +0 -77
  449. package/docs/nodes/index.md +0 -439
  450. package/docs/nodes/location-command.md +0 -102
  451. package/docs/nodes/media-understanding.md +0 -495
  452. package/docs/nodes/talk.md +0 -160
  453. package/docs/nodes/troubleshooting.md +0 -123
  454. package/docs/nodes/voicewake.md +0 -93
  455. package/docs/perplexity.md +0 -11
  456. package/docs/plan/codex-context-engine-harness.md +0 -624
  457. package/docs/plan/ui-channels.md +0 -284
  458. package/docs/platforms/digitalocean.md +0 -12
  459. package/docs/platforms/easyrunner.md +0 -109
  460. package/docs/platforms/index.md +0 -51
  461. package/docs/platforms/linux.md +0 -141
  462. package/docs/platforms/mac/bundled-gateway.md +0 -79
  463. package/docs/platforms/mac/canvas.md +0 -128
  464. package/docs/platforms/mac/child-process.md +0 -72
  465. package/docs/platforms/mac/dev-setup.md +0 -112
  466. package/docs/platforms/mac/health.md +0 -39
  467. package/docs/platforms/mac/icon.md +0 -36
  468. package/docs/platforms/mac/logging.md +0 -62
  469. package/docs/platforms/mac/menu-bar.md +0 -93
  470. package/docs/platforms/mac/peekaboo.md +0 -96
  471. package/docs/platforms/mac/permissions.md +0 -73
  472. package/docs/platforms/mac/remote.md +0 -123
  473. package/docs/platforms/mac/signing.md +0 -52
  474. package/docs/platforms/mac/skills.md +0 -43
  475. package/docs/platforms/mac/voice-overlay.md +0 -66
  476. package/docs/platforms/mac/voicewake.md +0 -73
  477. package/docs/platforms/mac/webchat.md +0 -54
  478. package/docs/platforms/mac/xpc.md +0 -66
  479. package/docs/platforms/oracle.md +0 -12
  480. package/docs/platforms/raspberry-pi.md +0 -13
  481. package/docs/platforms/windows.md +0 -286
  482. package/docs/plugins/adding-capabilities.md +0 -146
  483. package/docs/plugins/admin-http-rpc.md +0 -216
  484. package/docs/plugins/agent-tools.md +0 -13
  485. package/docs/plugins/architecture-internals.md +0 -1196
  486. package/docs/plugins/architecture.md +0 -483
  487. package/docs/plugins/building-extensions.md +0 -13
  488. package/docs/plugins/building-plugins.md +0 -335
  489. package/docs/plugins/bundles.md +0 -310
  490. package/docs/plugins/cli-backend-plugins.md +0 -310
  491. package/docs/plugins/codex-computer-use.md +0 -297
  492. package/docs/plugins/codex-harness-reference.md +0 -470
  493. package/docs/plugins/codex-harness-runtime.md +0 -268
  494. package/docs/plugins/codex-harness.md +0 -780
  495. package/docs/plugins/codex-native-plugins.md +0 -276
  496. package/docs/plugins/community.md +0 -77
  497. package/docs/plugins/compatibility.md +0 -167
  498. package/docs/plugins/copilot.md +0 -356
  499. package/docs/plugins/dependency-resolution.md +0 -176
  500. package/docs/plugins/google-meet.md +0 -1737
  501. package/docs/plugins/hooks.md +0 -484
  502. package/docs/plugins/install-overrides.md +0 -80
  503. package/docs/plugins/manage-plugins.md +0 -210
  504. package/docs/plugins/manifest.md +0 -1457
  505. package/docs/plugins/memory-lancedb.md +0 -385
  506. package/docs/plugins/memory-wiki.md +0 -529
  507. package/docs/plugins/message-presentation.md +0 -473
  508. package/docs/plugins/oc-path.md +0 -166
  509. package/docs/plugins/plugin-inventory.md +0 -189
  510. package/docs/plugins/plugin-permission-requests.md +0 -193
  511. package/docs/plugins/reference/acpx.md +0 -23
  512. package/docs/plugins/reference/admin-http-rpc.md +0 -23
  513. package/docs/plugins/reference/alibaba.md +0 -23
  514. package/docs/plugins/reference/amazon-bedrock-mantle.md +0 -23
  515. package/docs/plugins/reference/amazon-bedrock.md +0 -23
  516. package/docs/plugins/reference/anthropic-vertex.md +0 -19
  517. package/docs/plugins/reference/anthropic.md +0 -23
  518. package/docs/plugins/reference/arcee.md +0 -23
  519. package/docs/plugins/reference/azure-speech.md +0 -23
  520. package/docs/plugins/reference/bonjour.md +0 -19
  521. package/docs/plugins/reference/brave.md +0 -23
  522. package/docs/plugins/reference/browser.md +0 -23
  523. package/docs/plugins/reference/byteplus.md +0 -19
  524. package/docs/plugins/reference/canvas.md +0 -19
  525. package/docs/plugins/reference/cerebras.md +0 -23
  526. package/docs/plugins/reference/chutes.md +0 -23
  527. package/docs/plugins/reference/clickclack.md +0 -23
  528. package/docs/plugins/reference/cloudflare-ai-gateway.md +0 -23
  529. package/docs/plugins/reference/codex-supervisor.md +0 -27
  530. package/docs/plugins/reference/codex.md +0 -23
  531. package/docs/plugins/reference/comfy.md +0 -23
  532. package/docs/plugins/reference/copilot-proxy.md +0 -19
  533. package/docs/plugins/reference/copilot.md +0 -23
  534. package/docs/plugins/reference/deepgram.md +0 -23
  535. package/docs/plugins/reference/deepinfra.md +0 -23
  536. package/docs/plugins/reference/deepseek.md +0 -23
  537. package/docs/plugins/reference/diagnostics-otel.md +0 -19
  538. package/docs/plugins/reference/diagnostics-prometheus.md +0 -19
  539. package/docs/plugins/reference/diffs-language-pack.md +0 -19
  540. package/docs/plugins/reference/diffs.md +0 -19
  541. package/docs/plugins/reference/discord.md +0 -23
  542. package/docs/plugins/reference/document-extract.md +0 -23
  543. package/docs/plugins/reference/duckduckgo.md +0 -23
  544. package/docs/plugins/reference/elevenlabs.md +0 -23
  545. package/docs/plugins/reference/exa.md +0 -23
  546. package/docs/plugins/reference/fal.md +0 -23
  547. package/docs/plugins/reference/feishu.md +0 -23
  548. package/docs/plugins/reference/file-transfer.md +0 -19
  549. package/docs/plugins/reference/firecrawl.md +0 -23
  550. package/docs/plugins/reference/fireworks.md +0 -23
  551. package/docs/plugins/reference/github-copilot.md +0 -23
  552. package/docs/plugins/reference/gmi.md +0 -23
  553. package/docs/plugins/reference/google-meet.md +0 -23
  554. package/docs/plugins/reference/google.md +0 -23
  555. package/docs/plugins/reference/googlechat.md +0 -23
  556. package/docs/plugins/reference/gradium.md +0 -23
  557. package/docs/plugins/reference/groq.md +0 -23
  558. package/docs/plugins/reference/huggingface.md +0 -23
  559. package/docs/plugins/reference/imessage.md +0 -23
  560. package/docs/plugins/reference/inworld.md +0 -23
  561. package/docs/plugins/reference/irc.md +0 -23
  562. package/docs/plugins/reference/kilocode.md +0 -23
  563. package/docs/plugins/reference/kimi.md +0 -23
  564. package/docs/plugins/reference/line.md +0 -23
  565. package/docs/plugins/reference/litellm.md +0 -23
  566. package/docs/plugins/reference/llm-task.md +0 -19
  567. package/docs/plugins/reference/lmstudio.md +0 -23
  568. package/docs/plugins/reference/lobster.md +0 -19
  569. package/docs/plugins/reference/matrix.md +0 -23
  570. package/docs/plugins/reference/mattermost.md +0 -23
  571. package/docs/plugins/reference/memory-core.md +0 -19
  572. package/docs/plugins/reference/memory-lancedb.md +0 -23
  573. package/docs/plugins/reference/memory-wiki.md +0 -23
  574. package/docs/plugins/reference/microsoft-foundry.md +0 -19
  575. package/docs/plugins/reference/microsoft.md +0 -19
  576. package/docs/plugins/reference/migrate-claude.md +0 -19
  577. package/docs/plugins/reference/migrate-hermes.md +0 -19
  578. package/docs/plugins/reference/minimax.md +0 -23
  579. package/docs/plugins/reference/mistral.md +0 -23
  580. package/docs/plugins/reference/moonshot.md +0 -23
  581. package/docs/plugins/reference/msteams.md +0 -23
  582. package/docs/plugins/reference/nextcloud-talk.md +0 -23
  583. package/docs/plugins/reference/nostr.md +0 -23
  584. package/docs/plugins/reference/novita.md +0 -23
  585. package/docs/plugins/reference/nvidia.md +0 -23
  586. package/docs/plugins/reference/oc-path.md +0 -23
  587. package/docs/plugins/reference/ollama.md +0 -23
  588. package/docs/plugins/reference/open-prose.md +0 -19
  589. package/docs/plugins/reference/openai.md +0 -23
  590. package/docs/plugins/reference/opencode-go.md +0 -23
  591. package/docs/plugins/reference/opencode.md +0 -23
  592. package/docs/plugins/reference/openrouter.md +0 -23
  593. package/docs/plugins/reference/openshell.md +0 -19
  594. package/docs/plugins/reference/perplexity.md +0 -23
  595. package/docs/plugins/reference/pixverse.md +0 -23
  596. package/docs/plugins/reference/policy.md +0 -72
  597. package/docs/plugins/reference/qa-channel.md +0 -23
  598. package/docs/plugins/reference/qa-lab.md +0 -19
  599. package/docs/plugins/reference/qa-matrix.md +0 -19
  600. package/docs/plugins/reference/qianfan.md +0 -23
  601. package/docs/plugins/reference/qqbot.md +0 -23
  602. package/docs/plugins/reference/qwen.md +0 -23
  603. package/docs/plugins/reference/runway.md +0 -23
  604. package/docs/plugins/reference/searxng.md +0 -19
  605. package/docs/plugins/reference/senseaudio.md +0 -23
  606. package/docs/plugins/reference/sglang.md +0 -23
  607. package/docs/plugins/reference/signal.md +0 -23
  608. package/docs/plugins/reference/skill-workshop.md +0 -23
  609. package/docs/plugins/reference/slack.md +0 -23
  610. package/docs/plugins/reference/stepfun.md +0 -23
  611. package/docs/plugins/reference/synology-chat.md +0 -23
  612. package/docs/plugins/reference/synthetic.md +0 -23
  613. package/docs/plugins/reference/tavily.md +0 -23
  614. package/docs/plugins/reference/telegram.md +0 -23
  615. package/docs/plugins/reference/tencent.md +0 -23
  616. package/docs/plugins/reference/tlon.md +0 -23
  617. package/docs/plugins/reference/together.md +0 -23
  618. package/docs/plugins/reference/tokenjuice.md +0 -23
  619. package/docs/plugins/reference/tts-local-cli.md +0 -19
  620. package/docs/plugins/reference/twitch.md +0 -23
  621. package/docs/plugins/reference/venice.md +0 -23
  622. package/docs/plugins/reference/vercel-ai-gateway.md +0 -23
  623. package/docs/plugins/reference/vllm.md +0 -23
  624. package/docs/plugins/reference/voice-call.md +0 -23
  625. package/docs/plugins/reference/volcengine.md +0 -23
  626. package/docs/plugins/reference/voyage.md +0 -19
  627. package/docs/plugins/reference/vydra.md +0 -23
  628. package/docs/plugins/reference/web-readability.md +0 -19
  629. package/docs/plugins/reference/webhooks.md +0 -23
  630. package/docs/plugins/reference/whatsapp.md +0 -23
  631. package/docs/plugins/reference/workboard.md +0 -23
  632. package/docs/plugins/reference/xai.md +0 -23
  633. package/docs/plugins/reference/xiaomi.md +0 -23
  634. package/docs/plugins/reference/zai.md +0 -23
  635. package/docs/plugins/reference/zalo.md +0 -23
  636. package/docs/plugins/reference/zalouser.md +0 -24
  637. package/docs/plugins/reference.md +0 -145
  638. package/docs/plugins/sdk-agent-harness.md +0 -338
  639. package/docs/plugins/sdk-channel-inbound.md +0 -70
  640. package/docs/plugins/sdk-channel-ingress.md +0 -137
  641. package/docs/plugins/sdk-channel-message.md +0 -18
  642. package/docs/plugins/sdk-channel-outbound.md +0 -113
  643. package/docs/plugins/sdk-channel-plugins.md +0 -765
  644. package/docs/plugins/sdk-channel-turn.md +0 -9
  645. package/docs/plugins/sdk-entrypoints.md +0 -344
  646. package/docs/plugins/sdk-migration.md +0 -979
  647. package/docs/plugins/sdk-overview.md +0 -511
  648. package/docs/plugins/sdk-provider-plugins.md +0 -846
  649. package/docs/plugins/sdk-runtime.md +0 -676
  650. package/docs/plugins/sdk-setup.md +0 -550
  651. package/docs/plugins/sdk-subpaths.md +0 -391
  652. package/docs/plugins/sdk-testing.md +0 -403
  653. package/docs/plugins/skill-workshop.md +0 -713
  654. package/docs/plugins/tool-plugins.md +0 -411
  655. package/docs/plugins/voice-call.md +0 -942
  656. package/docs/plugins/webhooks.md +0 -192
  657. package/docs/plugins/workboard.md +0 -252
  658. package/docs/plugins/zalouser.md +0 -86
  659. package/docs/prose.md +0 -137
  660. package/docs/providers/alibaba.md +0 -158
  661. package/docs/providers/anthropic.md +0 -381
  662. package/docs/providers/arcee.md +0 -144
  663. package/docs/providers/azure-speech.md +0 -119
  664. package/docs/providers/bedrock-mantle.md +0 -211
  665. package/docs/providers/bedrock.md +0 -414
  666. package/docs/providers/cerebras.md +0 -130
  667. package/docs/providers/chutes.md +0 -153
  668. package/docs/providers/claude-max-api-proxy.md +0 -191
  669. package/docs/providers/cloudflare-ai-gateway.md +0 -119
  670. package/docs/providers/comfy.md +0 -362
  671. package/docs/providers/deepgram.md +0 -184
  672. package/docs/providers/deepinfra.md +0 -92
  673. package/docs/providers/deepseek.md +0 -146
  674. package/docs/providers/ds4.md +0 -309
  675. package/docs/providers/elevenlabs.md +0 -130
  676. package/docs/providers/fal.md +0 -240
  677. package/docs/providers/fireworks.md +0 -144
  678. package/docs/providers/github-copilot.md +0 -257
  679. package/docs/providers/gmi.md +0 -92
  680. package/docs/providers/google.md +0 -472
  681. package/docs/providers/gradium.md +0 -123
  682. package/docs/providers/groq.md +0 -171
  683. package/docs/providers/huggingface.md +0 -235
  684. package/docs/providers/index.md +0 -105
  685. package/docs/providers/inferrs.md +0 -272
  686. package/docs/providers/inworld.md +0 -120
  687. package/docs/providers/kilocode.md +0 -135
  688. package/docs/providers/litellm.md +0 -234
  689. package/docs/providers/lmstudio.md +0 -224
  690. package/docs/providers/minimax.md +0 -505
  691. package/docs/providers/mistral.md +0 -235
  692. package/docs/providers/models.md +0 -64
  693. package/docs/providers/moonshot.md +0 -413
  694. package/docs/providers/novita.md +0 -92
  695. package/docs/providers/nvidia.md +0 -158
  696. package/docs/providers/ollama-cloud.md +0 -115
  697. package/docs/providers/ollama.md +0 -1225
  698. package/docs/providers/openai.md +0 -1093
  699. package/docs/providers/opencode-go.md +0 -123
  700. package/docs/providers/opencode.md +0 -149
  701. package/docs/providers/openrouter.md +0 -349
  702. package/docs/providers/perplexity-provider.md +0 -123
  703. package/docs/providers/pixverse.md +0 -165
  704. package/docs/providers/qianfan.md +0 -132
  705. package/docs/providers/qwen-oauth.md +0 -115
  706. package/docs/providers/qwen.md +0 -364
  707. package/docs/providers/runway.md +0 -103
  708. package/docs/providers/senseaudio.md +0 -68
  709. package/docs/providers/sglang.md +0 -161
  710. package/docs/providers/stepfun.md +0 -229
  711. package/docs/providers/synthetic.md +0 -154
  712. package/docs/providers/tencent.md +0 -130
  713. package/docs/providers/together.md +0 -140
  714. package/docs/providers/venice.md +0 -312
  715. package/docs/providers/vercel-ai-gateway.md +0 -128
  716. package/docs/providers/vllm.md +0 -407
  717. package/docs/providers/volcengine.md +0 -199
  718. package/docs/providers/vydra.md +0 -180
  719. package/docs/providers/xai.md +0 -571
  720. package/docs/providers/xiaomi.md +0 -262
  721. package/docs/providers/zai.md +0 -224
  722. package/docs/refactor/access.md +0 -9
  723. package/docs/refactor/acp.md +0 -298
  724. package/docs/refactor/canvas.md +0 -131
  725. package/docs/refactor/database-first.md +0 -2256
  726. package/docs/refactor/ingress-core.md +0 -341
  727. package/docs/reference/AGENTS.default.md +0 -131
  728. package/docs/reference/RELEASING.md +0 -799
  729. package/docs/reference/api-usage-costs.md +0 -208
  730. package/docs/reference/application-modernization-plan.md +0 -208
  731. package/docs/reference/code-mode.md +0 -773
  732. package/docs/reference/credits.md +0 -33
  733. package/docs/reference/device-models.md +0 -50
  734. package/docs/reference/fengming-sdk-api-design.md +0 -390
  735. package/docs/reference/full-release-validation.md +0 -202
  736. package/docs/reference/memory-config.md +0 -604
  737. package/docs/reference/prompt-caching.md +0 -358
  738. package/docs/reference/release-performance-sweep.md +0 -360
  739. package/docs/reference/rich-output-protocol.md +0 -101
  740. package/docs/reference/rpc.md +0 -43
  741. package/docs/reference/secret-placeholder-conventions.md +0 -33
  742. package/docs/reference/secretref-credential-surface.md +0 -159
  743. package/docs/reference/secretref-user-supplied-credentials-matrix.json +0 -663
  744. package/docs/reference/session-management-compaction.md +0 -474
  745. package/docs/reference/templates/AGENTS.dev.md +0 -90
  746. package/docs/reference/templates/AGENTS.md +0 -227
  747. package/docs/reference/templates/BOOT.md +0 -16
  748. package/docs/reference/templates/BOOTSTRAP.md +0 -66
  749. package/docs/reference/templates/CLAUDE.md +0 -1
  750. package/docs/reference/templates/HEARTBEAT.md +0 -24
  751. package/docs/reference/templates/IDENTITY.dev.md +0 -52
  752. package/docs/reference/templates/IDENTITY.md +0 -34
  753. package/docs/reference/templates/SOUL.dev.md +0 -82
  754. package/docs/reference/templates/SOUL.md +0 -49
  755. package/docs/reference/templates/TOOLS.dev.md +0 -29
  756. package/docs/reference/templates/TOOLS.md +0 -51
  757. package/docs/reference/templates/USER.dev.md +0 -23
  758. package/docs/reference/templates/USER.md +0 -28
  759. package/docs/reference/test.md +0 -247
  760. package/docs/reference/token-use.md +0 -246
  761. package/docs/reference/transcript-hygiene.md +0 -214
  762. package/docs/reference/wizard.md +0 -252
  763. package/docs/security/CONTRIBUTING-THREAT-MODEL.md +0 -101
  764. package/docs/security/THREAT-MODEL-ATLAS.md +0 -611
  765. package/docs/security/formal-verification.md +0 -170
  766. package/docs/security/incident-response.md +0 -59
  767. package/docs/security/network-proxy.md +0 -268
  768. package/docs/snippets/plugin-publish/minimal-fengming.plugin.json +0 -12
  769. package/docs/snippets/plugin-publish/minimal-package.json +0 -16
  770. package/docs/specs/claw-supervisor.md +0 -247
  771. package/docs/start/bootstrapping.md +0 -49
  772. package/docs/start/docs-directory.md +0 -69
  773. package/docs/start/fengming.md +0 -252
  774. package/docs/start/getting-started.md +0 -152
  775. package/docs/start/hubs.md +0 -201
  776. package/docs/start/lore.md +0 -223
  777. package/docs/start/onboarding-overview.md +0 -72
  778. package/docs/start/onboarding.md +0 -98
  779. package/docs/start/quickstart.md +0 -25
  780. package/docs/start/setup.md +0 -178
  781. package/docs/start/showcase.md +0 -363
  782. package/docs/start/wizard-cli-automation.md +0 -232
  783. package/docs/start/wizard-cli-reference.md +0 -331
  784. package/docs/start/wizard.md +0 -141
  785. package/docs/style.css +0 -137
  786. package/docs/superpowers/specs/2026-04-22-tweakcn-custom-theme-import-design.md +0 -316
  787. package/docs/tools/acp-agents-setup.md +0 -351
  788. package/docs/tools/acp-agents.md +0 -854
  789. package/docs/tools/agent-send.md +0 -130
  790. package/docs/tools/apply-patch.md +0 -64
  791. package/docs/tools/brave-search.md +0 -139
  792. package/docs/tools/browser-control.md +0 -391
  793. package/docs/tools/browser-linux-troubleshooting.md +0 -173
  794. package/docs/tools/browser-login.md +0 -77
  795. package/docs/tools/browser-wsl2-windows-remote-cdp-troubleshooting.md +0 -219
  796. package/docs/tools/browser.md +0 -810
  797. package/docs/tools/btw.md +0 -159
  798. package/docs/tools/capability-cookbook.md +0 -12
  799. package/docs/tools/clawhub.md +0 -5
  800. package/docs/tools/code-execution.md +0 -173
  801. package/docs/tools/creating-skills.md +0 -158
  802. package/docs/tools/diffs.md +0 -525
  803. package/docs/tools/duckduckgo-search.md +0 -109
  804. package/docs/tools/elevated.md +0 -128
  805. package/docs/tools/exa-search.md +0 -152
  806. package/docs/tools/exec-approvals-advanced.md +0 -444
  807. package/docs/tools/exec-approvals.md +0 -494
  808. package/docs/tools/exec.md +0 -285
  809. package/docs/tools/firecrawl.md +0 -155
  810. package/docs/tools/gemini-search.md +0 -114
  811. package/docs/tools/goal.md +0 -217
  812. package/docs/tools/grok-search.md +0 -129
  813. package/docs/tools/image-generation.md +0 -493
  814. package/docs/tools/index.md +0 -178
  815. package/docs/tools/kimi-search.md +0 -105
  816. package/docs/tools/llm-task.md +0 -137
  817. package/docs/tools/lobster.md +0 -365
  818. package/docs/tools/loop-detection.md +0 -154
  819. package/docs/tools/media-overview.md +0 -160
  820. package/docs/tools/minimax-search.md +0 -102
  821. package/docs/tools/multi-agent-sandbox-tools.md +0 -409
  822. package/docs/tools/music-generation.md +0 -372
  823. package/docs/tools/ollama-search.md +0 -153
  824. package/docs/tools/pdf.md +0 -213
  825. package/docs/tools/perplexity-search.md +0 -220
  826. package/docs/tools/plugin.md +0 -363
  827. package/docs/tools/reactions.md +0 -100
  828. package/docs/tools/searxng-search.md +0 -141
  829. package/docs/tools/skills-config.md +0 -195
  830. package/docs/tools/skills.md +0 -569
  831. package/docs/tools/slash-commands.md +0 -487
  832. package/docs/tools/steer.md +0 -77
  833. package/docs/tools/subagents.md +0 -651
  834. package/docs/tools/tavily.md +0 -162
  835. package/docs/tools/thinking.md +0 -142
  836. package/docs/tools/tokenjuice.md +0 -84
  837. package/docs/tools/tool-search.md +0 -269
  838. package/docs/tools/trajectory.md +0 -229
  839. package/docs/tools/tts.md +0 -1009
  840. package/docs/tools/video-generation.md +0 -555
  841. package/docs/tools/web-fetch.md +0 -210
  842. package/docs/tools/web.md +0 -461
  843. package/docs/tts.md +0 -11
  844. package/docs/vps.md +0 -139
  845. package/docs/web/control-ui.md +0 -512
  846. package/docs/web/dashboard.md +0 -107
  847. package/docs/web/index.md +0 -133
  848. package/docs/web/tui.md +0 -250
  849. package/docs/web/webchat.md +0 -102
  850. package/npm-shrinkwrap.json +0 -12861
  851. package/patches/.gitkeep +0 -0
  852. package/patches/@agentclientprotocol__claude-agent-acp@0.37.0.patch +0 -41
  853. package/pnpm-workspace.yaml +0 -120
  854. package/scripts/crabbox-wrapper.mjs +0 -2004
  855. package/scripts/lib/official-external-channel-catalog.json +0 -560
  856. package/scripts/lib/official-external-plugin-catalog.json +0 -264
  857. package/scripts/lib/official-external-provider-catalog.json +0 -158
  858. package/scripts/lib/package-dist-imports.mjs +0 -171
  859. package/scripts/npm-runner.mjs +0 -91
  860. package/scripts/postinstall-bundled-plugins.mjs +0 -978
  861. package/scripts/preinstall-package-manager-warning.mjs +0 -64
  862. package/scripts/prepare-git-hooks.mjs +0 -72
  863. package/scripts/windows-cmd-helpers.mjs +0 -22
  864. package/skills/batch/SKILL.md +0 -118
  865. package/skills/code-review/SKILL.md +0 -107
  866. package/skills/debug/SKILL.md +0 -83
  867. package/skills/loop/SKILL.md +0 -118
  868. package/skills/run/SKILL.md +0 -79
  869. package/skills/run-skill-generator/SKILL.md +0 -179
  870. package/skills/verify/SKILL.md +0 -103
  871. package/src/agents/templates/HEARTBEAT.md +0 -3
@@ -1,1343 +0,0 @@
1
- ---
2
- summary: "Security considerations and threat model for running an AI gateway with shell access"
3
- read_when:
4
- - Adding features that widen access or automation
5
- title: "Security"
6
- ---
7
-
8
- <Warning>
9
- **Personal assistant trust model.** This guidance assumes one trusted
10
- operator boundary per gateway (single-user, personal-assistant model).
11
- FengMing is **not** a hostile multi-tenant security boundary for multiple
12
- adversarial users sharing one agent or gateway. If you need mixed-trust or
13
- adversarial-user operation, split trust boundaries (separate gateway +
14
- credentials, ideally separate OS users or hosts).
15
- </Warning>
16
-
17
- ## Scope first: personal assistant security model
18
-
19
- FengMing security guidance assumes a **personal assistant** deployment: one trusted operator boundary, potentially many agents.
20
-
21
- - Supported security posture: one user/trust boundary per gateway (prefer one OS user/host/VPS per boundary).
22
- - Not a supported security boundary: one shared gateway/agent used by mutually untrusted or adversarial users.
23
- - If adversarial-user isolation is required, split by trust boundary (separate gateway + credentials, and ideally separate OS users/hosts).
24
- - If multiple untrusted users can message one tool-enabled agent, treat them as sharing the same delegated tool authority for that agent.
25
-
26
- This page explains hardening **within that model**. It does not claim hostile multi-tenant isolation on one shared gateway.
27
-
28
- Before changing remote access, DM policy, reverse proxy, or public exposure,
29
- use the [Gateway exposure runbook](/gateway/security/exposure-runbook) as a
30
- pre-flight and rollback checklist.
31
-
32
- ## Quick check: `fengming security audit`
33
-
34
- See also: [Formal Verification (Security Models)](/security/formal-verification)
35
-
36
- Run this regularly (especially after changing config or exposing network surfaces):
37
-
38
- ```bash
39
- fengming security audit
40
- fengming security audit --deep
41
- fengming security audit --fix
42
- fengming security audit --json
43
- ```
44
-
45
- `security audit --fix` stays intentionally narrow: it flips common open group
46
- policies to allowlists, restores `logging.redactSensitive: "tools"`, tightens
47
- state/config/include-file permissions, and uses Windows ACL resets instead of
48
- POSIX `chmod` when running on Windows.
49
-
50
- It flags common footguns (Gateway auth exposure, browser control exposure, elevated allowlists, filesystem permissions, permissive exec approvals, and open-channel tool exposure).
51
-
52
- FengMing is both a product and an experiment: you're wiring frontier-model behavior into real messaging surfaces and real tools. **There is no "perfectly secure" setup.** The goal is to be deliberate about:
53
-
54
- - who can talk to your bot
55
- - where the bot is allowed to act
56
- - what the bot can touch
57
-
58
- Start with the smallest access that still works, then widen it as you gain confidence.
59
-
60
- ### Published package dependency lock
61
-
62
- FengMing source checkouts use `pnpm-lock.yaml`. The published `fengming` npm
63
- package and FengMing-owned npm plugin packages include `npm-shrinkwrap.json`,
64
- npm's publishable dependency lockfile, so package installs use the reviewed
65
- transitive dependency graph from the release instead of resolving a fresh graph
66
- at install time.
67
-
68
- Shrinkwrap is a supply-chain hardening and release reproducibility boundary,
69
- not a sandbox. For the plain-English model, maintainer commands, and package
70
- inspection checks, see [npm shrinkwrap](/gateway/security/shrinkwrap).
71
-
72
- ### Deployment and host trust
73
-
74
- FengMing assumes the host and config boundary are trusted:
75
-
76
- - If someone can modify Gateway host state/config (`~/.fengming`, including `fengming.json`), treat them as a trusted operator.
77
- - Running one Gateway for multiple mutually untrusted/adversarial operators is **not a recommended setup**.
78
- - For mixed-trust teams, split trust boundaries with separate gateways (or at minimum separate OS users/hosts).
79
- - Recommended default: one user per machine/host (or VPS), one gateway for that user, and one or more agents in that gateway.
80
- - Inside one Gateway instance, authenticated operator access is a trusted control-plane role, not a per-user tenant role.
81
- - Session identifiers (`sessionKey`, session IDs, labels) are routing selectors, not authorization tokens.
82
- - If several people can message one tool-enabled agent, each of them can steer that same permission set. Per-user session/memory isolation helps privacy, but does not convert a shared agent into per-user host authorization.
83
-
84
- ### Secure file operations
85
-
86
- FengMing uses `@fengming/fs-safe` for root-bounded file access, atomic writes, archive extraction, temp workspaces, and secret-file helpers. FengMing defaults fs-safe's optional POSIX Python helper to **off**; set `FENGMING_FS_SAFE_PYTHON_MODE=auto` or `require` only when you want the extra fd-relative mutation hardening and can support a Python runtime.
87
-
88
- Details: [Secure file operations](/gateway/security/secure-file-operations).
89
-
90
- ### Shared Slack workspace: real risk
91
-
92
- If "everyone in Slack can message the bot," the core risk is delegated tool authority:
93
-
94
- - any allowed sender can induce tool calls (`exec`, browser, network/file tools) within the agent's policy;
95
- - prompt/content injection from one sender can cause actions that affect shared state, devices, or outputs;
96
- - if one shared agent has sensitive credentials/files, any allowed sender can potentially drive exfiltration via tool usage.
97
-
98
- Use separate agents/gateways with minimal tools for team workflows; keep personal-data agents private.
99
-
100
- ### Company-shared agent: acceptable pattern
101
-
102
- This is acceptable when everyone using that agent is in the same trust boundary (for example one company team) and the agent is strictly business-scoped.
103
-
104
- - run it on a dedicated machine/VM/container;
105
- - use a dedicated OS user + dedicated browser/profile/accounts for that runtime;
106
- - do not sign that runtime into personal Apple/Google accounts or personal password-manager/browser profiles.
107
-
108
- If you mix personal and company identities on the same runtime, you collapse the separation and increase personal-data exposure risk.
109
-
110
- ## Gateway and node trust concept
111
-
112
- Treat Gateway and node as one operator trust domain, with different roles:
113
-
114
- - **Gateway** is the control plane and policy surface (`gateway.auth`, tool policy, routing).
115
- - **Node** is remote execution surface paired to that Gateway (commands, device actions, host-local capabilities).
116
- - A caller authenticated to the Gateway is trusted at Gateway scope. After pairing, node actions are trusted operator actions on that node.
117
- - Operator scope levels and approval-time checks are summarized in
118
- [Operator scopes](/gateway/operator-scopes).
119
- - Direct loopback backend clients authenticated with the shared gateway
120
- token/password can make internal control-plane RPCs without presenting a user
121
- device identity. This is not a remote or browser pairing bypass: network
122
- clients, node clients, device-token clients, and explicit device identities
123
- still go through pairing and scope-upgrade enforcement.
124
- - `sessionKey` is routing/context selection, not per-user auth.
125
- - Exec approvals (allowlist + ask) are guardrails for operator intent, not hostile multi-tenant isolation.
126
- - FengMing's product default for trusted single-operator setups is that host exec on `gateway`/`node` is allowed without approval prompts (`security="full"`, `ask="off"` unless you tighten it). That default is intentional UX, not a vulnerability by itself.
127
- - Exec approvals bind exact request context and best-effort direct local file operands; they do not semantically model every runtime/interpreter loader path. Use sandboxing and host isolation for strong boundaries.
128
-
129
- If you need hostile-user isolation, split trust boundaries by OS user/host and run separate gateways.
130
-
131
- ## Trust boundary matrix
132
-
133
- Use this as the quick model when triaging risk:
134
-
135
- | Boundary or control | What it means | Common misread |
136
- | --------------------------------------------------------- | ------------------------------------------------- | ----------------------------------------------------------------------------- |
137
- | `gateway.auth` (token/password/trusted-proxy/device auth) | Authenticates callers to gateway APIs | "Needs per-message signatures on every frame to be secure" |
138
- | `sessionKey` | Routing key for context/session selection | "Session key is a user auth boundary" |
139
- | Prompt/content guardrails | Reduce model abuse risk | "Prompt injection alone proves auth bypass" |
140
- | `canvas.eval` / browser evaluate | Intentional operator capability when enabled | "Any JS eval primitive is automatically a vuln in this trust model" |
141
- | Local TUI `!` shell | Explicit operator-triggered local execution | "Local shell convenience command is remote injection" |
142
- | Node pairing and node commands | Operator-level remote execution on paired devices | "Remote device control should be treated as untrusted user access by default" |
143
- | `gateway.nodes.pairing.autoApproveCidrs` | Opt-in trusted-network node enrollment policy | "A disabled-by-default allowlist is an automatic pairing vulnerability" |
144
-
145
- ## Not vulnerabilities by design
146
-
147
- <Accordion title="Common findings that are out of scope">
148
-
149
- These patterns get reported often and are usually closed as no-action unless
150
- a real boundary bypass is demonstrated:
151
-
152
- - Prompt-injection-only chains without a policy, auth, or sandbox bypass.
153
- - Claims that assume hostile multi-tenant operation on one shared host or
154
- config.
155
- - Claims that classify normal operator read-path access (for example
156
- `sessions.list` / `sessions.preview` / `chat.history`) as IDOR in a
157
- shared-gateway setup.
158
- - Localhost-only deployment findings (for example HSTS on a loopback-only
159
- gateway).
160
- - Discord inbound webhook signature findings for inbound paths that do not
161
- exist in this repo.
162
- - Reports that treat node pairing metadata as a hidden second per-command
163
- approval layer for `system.run`, when the real execution boundary is still
164
- the gateway's global node command policy plus the node's own exec
165
- approvals.
166
- - Reports that treat configured `gateway.nodes.pairing.autoApproveCidrs` as a
167
- vulnerability by itself. This setting is disabled by default, requires
168
- explicit CIDR/IP entries, only applies to first-time `role: node` pairing with
169
- no requested scopes, and does not auto-approve operator/browser/Control UI,
170
- WebChat, role upgrades, scope upgrades, metadata changes, public-key changes,
171
- or same-host loopback trusted-proxy header paths unless loopback trusted-proxy auth was explicitly enabled.
172
- - "Missing per-user authorization" findings that treat `sessionKey` as an
173
- auth token.
174
-
175
- </Accordion>
176
-
177
- ## Hardened baseline in 60 seconds
178
-
179
- Use this baseline first, then selectively re-enable tools per trusted agent:
180
-
181
- ```json5
182
- {
183
- gateway: {
184
- mode: "local",
185
- bind: "loopback",
186
- auth: { mode: "token", token: "replace-with-long-random-token" },
187
- },
188
- session: {
189
- dmScope: "per-channel-peer",
190
- },
191
- tools: {
192
- profile: "messaging",
193
- deny: ["group:automation", "group:runtime", "group:fs", "sessions_spawn", "sessions_send"],
194
- fs: { workspaceOnly: true },
195
- exec: { security: "deny", ask: "always" },
196
- elevated: { enabled: false },
197
- },
198
- channels: {
199
- whatsapp: { dmPolicy: "pairing", groups: { "*": { requireMention: true } } },
200
- },
201
- }
202
- ```
203
-
204
- This keeps the Gateway local-only, isolates DMs, and disables control-plane/runtime tools by default.
205
-
206
- ## Shared inbox quick rule
207
-
208
- If more than one person can DM your bot:
209
-
210
- - Set `session.dmScope: "per-channel-peer"` (or `"per-account-channel-peer"` for multi-account channels).
211
- - Keep `dmPolicy: "pairing"` or strict allowlists.
212
- - Never combine shared DMs with broad tool access.
213
- - This hardens cooperative/shared inboxes, but is not designed as hostile co-tenant isolation when users share host/config write access.
214
-
215
- ## Context visibility model
216
-
217
- FengMing separates two concepts:
218
-
219
- - **Trigger authorization**: who can trigger the agent (`dmPolicy`, `groupPolicy`, allowlists, mention gates).
220
- - **Context visibility**: what supplemental context is injected into model input (reply body, quoted text, thread history, forwarded metadata).
221
-
222
- Allowlists gate triggers and command authorization. The `contextVisibility` setting controls how supplemental context (quoted replies, thread roots, fetched history) is filtered:
223
-
224
- - `contextVisibility: "all"` (default) keeps supplemental context as received.
225
- - `contextVisibility: "allowlist"` filters supplemental context to senders allowed by the active allowlist checks.
226
- - `contextVisibility: "allowlist_quote"` behaves like `allowlist`, but still keeps one explicit quoted reply.
227
-
228
- Set `contextVisibility` per channel or per room/conversation. See [Group Chats](/channels/groups#context-visibility-and-allowlists) for setup details.
229
-
230
- Advisory triage guidance:
231
-
232
- - Claims that only show "model can see quoted or historical text from non-allowlisted senders" are hardening findings addressable with `contextVisibility`, not auth or sandbox boundary bypasses by themselves.
233
- - To be security-impacting, reports still need a demonstrated trust-boundary bypass (auth, policy, sandbox, approval, or another documented boundary).
234
-
235
- ## What the audit checks (high level)
236
-
237
- - **Inbound access** (DM policies, group policies, allowlists): can strangers trigger the bot?
238
- - **Tool blast radius** (elevated tools + open rooms): could prompt injection turn into shell/file/network actions?
239
- - **Exec filesystem drift**: are mutating filesystem tools denied while `exec`/`process` remain available without sandbox filesystem constraints?
240
- - **Exec approval drift** (`security=full`, `autoAllowSkills`, interpreter allowlists without `strictInlineEval`): are host-exec guardrails still doing what you think they are?
241
- - `security="full"` is a broad posture warning, not proof of a bug. It is the chosen default for trusted personal-assistant setups; tighten it only when your threat model needs approval or allowlist guardrails.
242
- - **Network exposure** (Gateway bind/auth, Tailscale Serve/Funnel, weak/short auth tokens).
243
- - **Browser control exposure** (remote nodes, relay ports, remote CDP endpoints).
244
- - **Local disk hygiene** (permissions, symlinks, config includes, "synced folder" paths).
245
- - **Plugins** (plugins load without an explicit allowlist).
246
- - **Policy drift/misconfig** (sandbox docker settings configured but sandbox mode off; ineffective `gateway.nodes.denyCommands` patterns because matching is exact command-name only (for example `system.run`) and does not inspect shell text; dangerous `gateway.nodes.allowCommands` entries; global `tools.profile="minimal"` overridden by per-agent profiles; plugin-owned tools reachable under permissive tool policy).
247
- - **Runtime expectation drift** (for example assuming implicit exec still means `sandbox` when `tools.exec.host` now defaults to `auto`, or explicitly setting `tools.exec.host="sandbox"` while sandbox mode is off).
248
- - **Model hygiene** (warn when configured models look legacy; not a hard block).
249
-
250
- If you run `--deep`, FengMing also attempts a best-effort live Gateway probe.
251
-
252
- ## Credential storage map
253
-
254
- Use this when auditing access or deciding what to back up:
255
-
256
- - **WhatsApp**: `~/.fengming/credentials/whatsapp/<accountId>/creds.json`
257
- - **Telegram bot token**: config/env or `channels.telegram.tokenFile` (regular file only; symlinks rejected)
258
- - **Discord bot token**: config/env or SecretRef (env/file/exec providers)
259
- - **Slack tokens**: config/env (`channels.slack.*`)
260
- - **Pairing allowlists**:
261
- - `~/.fengming/credentials/<channel>-allowFrom.json` (default account)
262
- - `~/.fengming/credentials/<channel>-<accountId>-allowFrom.json` (non-default accounts)
263
- - **Model auth profiles**: `~/.fengming/agents/<agentId>/agent/auth-profiles.json`
264
- - **Codex runtime state**: `~/.fengming/agents/<agentId>/agent/codex-home/`
265
- - **File-backed secrets payload (optional)**: `~/.fengming/secrets.json`
266
- - **Legacy OAuth import**: `~/.fengming/credentials/oauth.json`
267
-
268
- ## Security audit checklist
269
-
270
- When the audit prints findings, treat this as a priority order:
271
-
272
- 1. **Anything "open" + tools enabled**: lock down DMs/groups first (pairing/allowlists), then tighten tool policy/sandboxing.
273
- 2. **Public network exposure** (LAN bind, Funnel, missing auth): fix immediately.
274
- 3. **Browser control remote exposure**: treat it like operator access (tailnet-only, pair nodes deliberately, avoid public exposure).
275
- 4. **Permissions**: make sure state/config/credentials/auth are not group/world-readable.
276
- 5. **Plugins**: only load what you explicitly trust.
277
- 6. **Model choice**: prefer modern, instruction-hardened models for any bot with tools.
278
-
279
- ## Security audit glossary
280
-
281
- Each audit finding is keyed by a structured `checkId` (for example
282
- `gateway.bind_no_auth` or `tools.exec.security_full_configured`). Common
283
- critical severity classes:
284
-
285
- - `fs.*` - filesystem permissions on state, config, credentials, auth profiles.
286
- - `gateway.*` - bind mode, auth, Tailscale, Control UI, trusted-proxy setup.
287
- - `hooks.*`, `browser.*`, `sandbox.*`, `tools.exec.*` - per-surface hardening.
288
- - `plugins.*`, `skills.*` - plugin/skill supply chain and scan findings.
289
- - `security.exposure.*` - cross-cutting checks where access policy meets tool blast radius.
290
-
291
- See the full catalog with severity levels, fix keys, and auto-fix support at
292
- [Security audit checks](/gateway/security/audit-checks).
293
-
294
- ## Control UI over HTTP
295
-
296
- The Control UI needs a **secure context** (HTTPS or localhost) to generate device
297
- identity. `gateway.controlUi.allowInsecureAuth` is a local compatibility toggle:
298
-
299
- - On localhost, it allows Control UI auth without device identity when the page
300
- is loaded over non-secure HTTP.
301
- - It does not bypass pairing checks.
302
- - It does not relax remote (non-localhost) device identity requirements.
303
-
304
- Prefer HTTPS (Tailscale Serve) or open the UI on `127.0.0.1`.
305
-
306
- For break-glass scenarios only, `gateway.controlUi.dangerouslyDisableDeviceAuth`
307
- disables device identity checks entirely. This is a severe security downgrade;
308
- keep it off unless you are actively debugging and can revert quickly.
309
-
310
- Separate from those dangerous flags, successful `gateway.auth.mode: "trusted-proxy"`
311
- can admit **operator** Control UI sessions without device identity. That is an
312
- intentional auth-mode behavior, not an `allowInsecureAuth` shortcut, and it still
313
- does not extend to node-role Control UI sessions.
314
-
315
- `fengming security audit` warns when this setting is enabled.
316
-
317
- ## Insecure or dangerous flags summary
318
-
319
- `fengming security audit` raises `config.insecure_or_dangerous_flags` when
320
- known insecure/dangerous debug switches are enabled. Keep these unset in
321
- production. Each enabled flag is reported as its own finding. If audit
322
- suppressions are configured, `security.audit.suppressions.active` remains in the
323
- active audit output even when matching findings move to `suppressedFindings`.
324
-
325
- <AccordionGroup>
326
- <Accordion title="Flags tracked by the audit today">
327
- - `gateway.controlUi.allowInsecureAuth=true`
328
- - `gateway.controlUi.dangerouslyAllowHostHeaderOriginFallback=true`
329
- - `gateway.controlUi.dangerouslyDisableDeviceAuth=true`
330
- - `security.audit.suppressions configured (<count>)`
331
- - `hooks.gmail.allowUnsafeExternalContent=true`
332
- - `hooks.mappings[<index>].allowUnsafeExternalContent=true`
333
- - `tools.exec.applyPatch.workspaceOnly=false`
334
- - `plugins.entries.acpx.config.permissionMode=approve-all`
335
-
336
- </Accordion>
337
-
338
- <Accordion title="All `dangerous*` / `dangerously*` keys in the config schema">
339
- Control UI and browser:
340
-
341
- - `gateway.controlUi.dangerouslyAllowHostHeaderOriginFallback`
342
- - `gateway.controlUi.dangerouslyDisableDeviceAuth`
343
- - `browser.ssrfPolicy.dangerouslyAllowPrivateNetwork`
344
-
345
- Channel name-matching (bundled and plugin channels; also available per
346
- `accounts.<accountId>` where applicable):
347
-
348
- - `channels.discord.dangerouslyAllowNameMatching`
349
- - `channels.slack.dangerouslyAllowNameMatching`
350
- - `channels.googlechat.dangerouslyAllowNameMatching`
351
- - `channels.msteams.dangerouslyAllowNameMatching`
352
- - `channels.synology-chat.dangerouslyAllowNameMatching` (plugin channel)
353
- - `channels.synology-chat.dangerouslyAllowInheritedWebhookPath` (plugin channel)
354
- - `channels.zalouser.dangerouslyAllowNameMatching` (plugin channel)
355
- - `channels.irc.dangerouslyAllowNameMatching` (plugin channel)
356
- - `channels.mattermost.dangerouslyAllowNameMatching` (plugin channel)
357
-
358
- Network exposure:
359
-
360
- - `channels.telegram.network.dangerouslyAllowPrivateNetwork` (also per account)
361
-
362
- Sandbox Docker (defaults + per-agent):
363
-
364
- - `agents.defaults.sandbox.docker.dangerouslyAllowReservedContainerTargets`
365
- - `agents.defaults.sandbox.docker.dangerouslyAllowExternalBindSources`
366
- - `agents.defaults.sandbox.docker.dangerouslyAllowContainerNamespaceJoin`
367
-
368
- </Accordion>
369
- </AccordionGroup>
370
-
371
- ## Reverse proxy configuration
372
-
373
- If you run the Gateway behind a reverse proxy (nginx, Caddy, Traefik, etc.), configure
374
- `gateway.trustedProxies` for proper forwarded-client IP handling.
375
-
376
- When the Gateway detects proxy headers from an address that is **not** in `trustedProxies`, it will **not** treat connections as local clients. If gateway auth is disabled, those connections are rejected. This prevents authentication bypass where proxied connections would otherwise appear to come from localhost and receive automatic trust.
377
-
378
- `gateway.trustedProxies` also feeds `gateway.auth.mode: "trusted-proxy"`, but that auth mode is stricter:
379
-
380
- - trusted-proxy auth **fails closed on loopback-source proxies by default**
381
- - same-host loopback reverse proxies can use `gateway.trustedProxies` for local-client detection and forwarded IP handling
382
- - same-host loopback reverse proxies can satisfy `gateway.auth.mode: "trusted-proxy"` only when `gateway.auth.trustedProxy.allowLoopback = true`; otherwise use token/password auth
383
-
384
- ```yaml
385
- gateway:
386
- trustedProxies:
387
- - "10.0.0.1" # reverse proxy IP
388
- # Optional. Default false.
389
- # Only enable if your proxy cannot provide X-Forwarded-For.
390
- allowRealIpFallback: false
391
- auth:
392
- mode: password
393
- password: ${FENGMING_GATEWAY_PASSWORD}
394
- ```
395
-
396
- When `trustedProxies` is configured, the Gateway uses `X-Forwarded-For` to determine the client IP. `X-Real-IP` is ignored by default unless `gateway.allowRealIpFallback: true` is explicitly set.
397
-
398
- Trusted proxy headers do not make node device pairing automatically trusted.
399
- `gateway.nodes.pairing.autoApproveCidrs` is a separate, disabled-by-default
400
- operator policy. Even when enabled, loopback-source trusted-proxy header paths
401
- are excluded from node auto-approval because local callers can forge those
402
- headers, including when loopback trusted-proxy auth is explicitly enabled.
403
-
404
- Good reverse proxy behavior (overwrite incoming forwarding headers):
405
-
406
- ```nginx
407
- proxy_set_header X-Forwarded-For $remote_addr;
408
- proxy_set_header X-Real-IP $remote_addr;
409
- ```
410
-
411
- Bad reverse proxy behavior (append/preserve untrusted forwarding headers):
412
-
413
- ```nginx
414
- proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
415
- ```
416
-
417
- ## HSTS and origin notes
418
-
419
- - FengMing gateway is local/loopback first. If you terminate TLS at a reverse proxy, set HSTS on the proxy-facing HTTPS domain there.
420
- - If the gateway itself terminates HTTPS, you can set `gateway.http.securityHeaders.strictTransportSecurity` to emit the HSTS header from FengMing responses.
421
- - Detailed deployment guidance is in [Trusted Proxy Auth](/gateway/trusted-proxy-auth#tls-termination-and-hsts).
422
- - For non-loopback Control UI deployments, `gateway.controlUi.allowedOrigins` is required by default.
423
- - `gateway.controlUi.allowedOrigins: ["*"]` is an explicit allow-all browser-origin policy, not a hardened default. Avoid it outside tightly controlled local testing.
424
- - Browser-origin auth failures on loopback are still rate-limited even when the
425
- general loopback exemption is enabled, but the lockout key is scoped per
426
- normalized `Origin` value instead of one shared localhost bucket.
427
- - `gateway.controlUi.dangerouslyAllowHostHeaderOriginFallback=true` enables Host-header origin fallback mode; treat it as a dangerous operator-selected policy.
428
- - Treat DNS rebinding and proxy-host header behavior as deployment hardening concerns; keep `trustedProxies` tight and avoid exposing the gateway directly to the public internet.
429
-
430
- ## Local session logs live on disk
431
-
432
- FengMing stores session transcripts on disk under `~/.fengming/agents/<agentId>/sessions/*.jsonl`.
433
- This is required for session continuity and (optionally) session memory indexing, but it also means
434
- **any process/user with filesystem access can read those logs**. Treat disk access as the trust
435
- boundary and lock down permissions on `~/.fengming` (see the audit section below). If you need
436
- stronger isolation between agents, run them under separate OS users or separate hosts.
437
-
438
- ## Node execution (system.run)
439
-
440
- If a macOS node is paired, the Gateway can invoke `system.run` on that node. This is **remote code execution** on the Mac:
441
-
442
- - Requires node pairing (approval + token).
443
- - Gateway node pairing is not a per-command approval surface. It establishes node identity/trust and token issuance.
444
- - The Gateway applies a coarse global node command policy via `gateway.nodes.allowCommands` / `denyCommands`.
445
- - Controlled on the Mac via **Settings → Exec approvals** (security + ask + allowlist).
446
- - The per-node `system.run` policy is the node's own exec approvals file (`exec.approvals.node.*`), which can be stricter or looser than the gateway's global command-ID policy.
447
- - A node running with `security="full"` and `ask="off"` is following the default trusted-operator model. Treat that as expected behavior unless your deployment explicitly requires a tighter approval or allowlist stance.
448
- - Approval mode binds exact request context and, when possible, one concrete local script/file operand. If FengMing cannot identify exactly one direct local file for an interpreter/runtime command, approval-backed execution is denied rather than promising full semantic coverage.
449
- - For `host=node`, approval-backed runs also store a canonical prepared
450
- `systemRunPlan`; later approved forwards reuse that stored plan, and gateway
451
- validation rejects caller edits to command/cwd/session context after the
452
- approval request was created.
453
- - If you don't want remote execution, set security to **deny** and remove node pairing for that Mac.
454
-
455
- This distinction matters for triage:
456
-
457
- - A reconnecting paired node advertising a different command list is not, by itself, a vulnerability if the Gateway global policy and the node's local exec approvals still enforce the actual execution boundary.
458
- - Reports that treat node pairing metadata as a second hidden per-command approval layer are usually policy/UX confusion, not a security boundary bypass.
459
-
460
- ## Dynamic skills (watcher / remote nodes)
461
-
462
- FengMing can refresh the skills list mid-session:
463
-
464
- - **Skills watcher**: changes to `SKILL.md` can update the skills snapshot on the next agent turn.
465
- - **Remote nodes**: connecting a macOS node can make macOS-only skills eligible (based on bin probing).
466
-
467
- Treat skill folders as **trusted code** and restrict who can modify them.
468
-
469
- ## The threat model
470
-
471
- Your AI assistant can:
472
-
473
- - Execute arbitrary shell commands
474
- - Read/write files
475
- - Access network services
476
- - Send messages to anyone (if you give it WhatsApp access)
477
-
478
- People who message you can:
479
-
480
- - Try to trick your AI into doing bad things
481
- - Social engineer access to your data
482
- - Probe for infrastructure details
483
-
484
- ## Core concept: access control before intelligence
485
-
486
- Most failures here are not fancy exploits - they're "someone messaged the bot and the bot did what they asked."
487
-
488
- FengMing's stance:
489
-
490
- - **Identity first:** decide who can talk to the bot (DM pairing / allowlists / explicit "open").
491
- - **Scope next:** decide where the bot is allowed to act (group allowlists + mention gating, tools, sandboxing, device permissions).
492
- - **Model last:** assume the model can be manipulated; design so manipulation has limited blast radius.
493
-
494
- ## Command authorization model
495
-
496
- Slash commands and directives are only honored for **authorized senders**. Authorization is derived from
497
- channel allowlists/pairing plus `commands.useAccessGroups` (see [Configuration](/gateway/configuration)
498
- and [Slash commands](/tools/slash-commands)). If a channel allowlist is empty or includes `"*"`,
499
- commands are effectively open for that channel.
500
-
501
- `/exec` is a session-only convenience for authorized operators. It does **not** write config or
502
- change other sessions.
503
-
504
- ## Control plane tools risk
505
-
506
- Two built-in tools can make persistent control-plane changes:
507
-
508
- - `gateway` can inspect config with `config.schema.lookup` / `config.get`, and can make persistent changes with `config.apply`, `config.patch`, and `update.run`.
509
- - `cron` can create scheduled jobs that keep running after the original chat/task ends.
510
-
511
- The agent-facing `gateway` runtime tool still refuses to rewrite
512
- `tools.exec.ask` or `tools.exec.security`; legacy `tools.bash.*` aliases are
513
- normalized to the same protected exec paths before the write.
514
- Agent-driven `gateway config.apply` and `gateway config.patch` edits are
515
- fail-closed by default: only a narrow set of prompt, model, and mention-gating
516
- paths are agent-tunable. New sensitive config trees are therefore protected
517
- unless they are deliberately added to the allowlist.
518
-
519
- For any agent/surface that handles untrusted content, deny these by default:
520
-
521
- ```json5
522
- {
523
- tools: {
524
- deny: ["gateway", "cron", "sessions_spawn", "sessions_send"],
525
- },
526
- }
527
- ```
528
-
529
- `commands.restart=false` only blocks restart actions. It does not disable `gateway` config/update actions.
530
-
531
- ## Plugins
532
-
533
- Plugins run **in-process** with the Gateway. Treat them as trusted code:
534
-
535
- - Only install plugins from sources you trust.
536
- - Prefer explicit `plugins.allow` allowlists.
537
- - Review plugin config before enabling.
538
- - Restart the Gateway after plugin changes.
539
- - If you install or update plugins (`fengming plugins install <package>`, `fengming plugins update <id>`), treat it like running untrusted code:
540
- - The install path is the per-plugin directory under the active plugin install root.
541
- - FengMing runs a built-in dangerous-code scan before install/update. `critical` findings block by default.
542
- - npm and git plugin installs run package-manager dependency convergence only during the explicit install/update flow. Local paths and archives are treated as self-contained plugin packages; FengMing copies/references them without running `npm install`.
543
- - Prefer pinned, exact versions (`@scope/pkg@1.2.3`), and inspect the unpacked code on disk before enabling.
544
- - `--dangerously-force-unsafe-install` is break-glass only for built-in scan false positives on plugin install/update flows. It does not bypass plugin `before_install` hook policy blocks and does not bypass scan failures.
545
- - Gateway-backed skill dependency installs follow the same dangerous/suspicious split: built-in `critical` findings block unless the caller explicitly sets `dangerouslyForceUnsafeInstall`, while suspicious findings still warn only. `fengming skills install` remains the separate ClawHub skill download/install flow.
546
-
547
- Details: [Plugins](/tools/plugin)
548
-
549
- ## DM access model: pairing, allowlist, open, disabled
550
-
551
- All current DM-capable channels support a DM policy (`dmPolicy` or `*.dm.policy`) that gates inbound DMs **before** the message is processed:
552
-
553
- - `pairing` (default): unknown senders receive a short pairing code and the bot ignores their message until approved. Codes expire after 1 hour; repeated DMs won't resend a code until a new request is created. Pending requests are capped at **3 per channel** by default.
554
- - `allowlist`: unknown senders are blocked (no pairing handshake).
555
- - `open`: allow anyone to DM (public). **Requires** the channel allowlist to include `"*"` (explicit opt-in).
556
- - `disabled`: ignore inbound DMs entirely.
557
-
558
- Approve via CLI:
559
-
560
- ```bash
561
- fengming pairing list <channel>
562
- fengming pairing approve <channel> <code>
563
- ```
564
-
565
- Details + files on disk: [Pairing](/channels/pairing)
566
-
567
- ## DM session isolation (multi-user mode)
568
-
569
- By default, FengMing routes **all DMs into the main session** so your assistant has continuity across devices and channels. If **multiple people** can DM the bot (open DMs or a multi-person allowlist), consider isolating DM sessions:
570
-
571
- ```json5
572
- {
573
- session: { dmScope: "per-channel-peer" },
574
- }
575
- ```
576
-
577
- This prevents cross-user context leakage while keeping group chats isolated.
578
-
579
- This is a messaging-context boundary, not a host-admin boundary. If users are mutually adversarial and share the same Gateway host/config, run separate gateways per trust boundary instead.
580
-
581
- ### Secure DM mode (recommended)
582
-
583
- Treat the snippet above as **secure DM mode**:
584
-
585
- - Default: `session.dmScope: "main"` (all DMs share one session for continuity).
586
- - Local CLI onboarding default: writes `session.dmScope: "per-channel-peer"` when unset (keeps existing explicit values).
587
- - Secure DM mode: `session.dmScope: "per-channel-peer"` (each channel+sender pair gets an isolated DM context).
588
- - Cross-channel peer isolation: `session.dmScope: "per-peer"` (each sender gets one session across all channels of the same type).
589
-
590
- If you run multiple accounts on the same channel, use `per-account-channel-peer` instead. If the same person contacts you on multiple channels, use `session.identityLinks` to collapse those DM sessions into one canonical identity. See [Session Management](/concepts/session) and [Configuration](/gateway/configuration).
591
-
592
- ## Allowlists for DMs and groups
593
-
594
- FengMing has two separate "who can trigger me?" layers:
595
-
596
- - **DM allowlist** (`allowFrom` / `channels.discord.allowFrom` / `channels.slack.allowFrom`; legacy: `channels.discord.dm.allowFrom`, `channels.slack.dm.allowFrom`): who is allowed to talk to the bot in direct messages.
597
- - When `dmPolicy="pairing"`, approvals are written to the account-scoped pairing allowlist store under `~/.fengming/credentials/` (`<channel>-allowFrom.json` for default account, `<channel>-<accountId>-allowFrom.json` for non-default accounts), merged with config allowlists.
598
- - **Group allowlist** (channel-specific): which groups/channels/guilds the bot will accept messages from at all.
599
- - Common patterns:
600
- - `channels.whatsapp.groups`, `channels.telegram.groups`, `channels.imessage.groups`: per-group defaults like `requireMention`; when set, it also acts as a group allowlist (include `"*"` to keep allow-all behavior).
601
- - `groupPolicy="allowlist"` + `groupAllowFrom`: restrict who can trigger the bot _inside_ a group session (WhatsApp/Telegram/Signal/iMessage/Microsoft Teams).
602
- - `channels.discord.guilds` / `channels.slack.channels`: per-surface allowlists + mention defaults.
603
- - Group checks run in this order: `groupPolicy`/group allowlists first, mention/reply activation second.
604
- - Replying to a bot message (implicit mention) does **not** bypass sender allowlists like `groupAllowFrom`.
605
- - **Security note:** treat `dmPolicy="open"` and `groupPolicy="open"` as last-resort settings. They should be barely used; prefer pairing + allowlists unless you fully trust every member of the room.
606
-
607
- Details: [Configuration](/gateway/configuration) and [Groups](/channels/groups)
608
-
609
- ## Prompt injection (what it is, why it matters)
610
-
611
- Prompt injection is when an attacker crafts a message that manipulates the model into doing something unsafe ("ignore your instructions", "dump your filesystem", "follow this link and run commands", etc.).
612
-
613
- Even with strong system prompts, **prompt injection is not solved**. System prompt guardrails are soft guidance only; hard enforcement comes from tool policy, exec approvals, sandboxing, and channel allowlists (and operators can disable these by design). What helps in practice:
614
-
615
- - Keep inbound DMs locked down (pairing/allowlists).
616
- - Prefer mention gating in groups; avoid "always-on" bots in public rooms.
617
- - Treat links, attachments, and pasted instructions as hostile by default.
618
- - Run sensitive tool execution in a sandbox; keep secrets out of the agent's reachable filesystem.
619
- - Note: sandboxing is opt-in. If sandbox mode is off, implicit `host=auto` resolves to the gateway host. Explicit `host=sandbox` still fails closed because no sandbox runtime is available. Set `host=gateway` if you want that behavior to be explicit in config.
620
- - Limit high-risk tools (`exec`, `browser`, `web_fetch`, `web_search`) to trusted agents or explicit allowlists.
621
- - If you allowlist interpreters (`python`, `node`, `ruby`, `perl`, `php`, `lua`, `osascript`), enable `tools.exec.strictInlineEval` so inline eval forms still need explicit approval.
622
- - Shell approval analysis also rejects POSIX parameter-expansion forms (`$VAR`, `$?`, `$$`, `$1`, `$@`, `${…}`) inside **unquoted heredocs**, so an allowlisted heredoc body cannot sneak shell expansion past allowlist review as plain text. Quote the heredoc terminator (for example `<<'EOF'`) to opt into literal body semantics; unquoted heredocs that would have expanded variables are rejected.
623
- - **Model choice matters:** older/smaller/legacy models are significantly less robust against prompt injection and tool misuse. For tool-enabled agents, use the strongest latest-generation, instruction-hardened model available.
624
-
625
- Red flags to treat as untrusted:
626
-
627
- - "Read this file/URL and do exactly what it says."
628
- - "Ignore your system prompt or safety rules."
629
- - "Reveal your hidden instructions or tool outputs."
630
- - "Paste the full contents of ~/.fengming or your logs."
631
-
632
- ## External content special-token sanitization
633
-
634
- FengMing strips common self-hosted LLM chat-template special-token literals from wrapped external content and metadata before they reach the model. Covered marker families include Qwen/ChatML, Llama, Gemma, Mistral, Phi, and GPT-OSS role/turn tokens.
635
-
636
- Why:
637
-
638
- - OpenAI-compatible backends that front self-hosted models sometimes preserve special tokens that appear in user text, instead of masking them. An attacker who can write into inbound external content (a fetched page, an email body, a file contents tool output) could otherwise inject a synthetic `assistant` or `system` role boundary and escape the wrapped-content guardrails.
639
- - Sanitization happens at the external-content wrapping layer, so it applies uniformly across fetch/read tools and inbound channel content rather than being per-provider.
640
- - Outbound model responses already have a separate sanitizer that strips leaked `<tool_call>`, `<function_calls>`, `<system-reminder>`, `<previous_response>`, and similar internal runtime scaffolding from user-visible replies at the final channel delivery boundary. The external-content sanitizer is the inbound counterpart.
641
-
642
- This does not replace the other hardening on this page - `dmPolicy`, allowlists, exec approvals, sandboxing, and `contextVisibility` still do the primary work. It closes one specific tokenizer-layer bypass against self-hosted stacks that forward user text with special tokens intact.
643
-
644
- ## Unsafe external content bypass flags
645
-
646
- FengMing includes explicit bypass flags that disable external-content safety wrapping:
647
-
648
- - `hooks.mappings[].allowUnsafeExternalContent`
649
- - `hooks.gmail.allowUnsafeExternalContent`
650
- - Cron payload field `allowUnsafeExternalContent`
651
-
652
- Guidance:
653
-
654
- - Keep these unset/false in production.
655
- - Only enable temporarily for tightly scoped debugging.
656
- - If enabled, isolate that agent (sandbox + minimal tools + dedicated session namespace).
657
-
658
- Hooks risk note:
659
-
660
- - Hook payloads are untrusted content, even when delivery comes from systems you control (mail/docs/web content can carry prompt injection).
661
- - Weak model tiers increase this risk. For hook-driven automation, prefer strong modern model tiers and keep tool policy tight (`tools.profile: "messaging"` or stricter), plus sandboxing where possible.
662
-
663
- ### Prompt injection does not require public DMs
664
-
665
- Even if **only you** can message the bot, prompt injection can still happen via
666
- any **untrusted content** the bot reads (web search/fetch results, browser pages,
667
- emails, docs, attachments, pasted logs/code). In other words: the sender is not
668
- the only threat surface; the **content itself** can carry adversarial instructions.
669
-
670
- When tools are enabled, the typical risk is exfiltrating context or triggering
671
- tool calls. Reduce the blast radius by:
672
-
673
- - Using a read-only or tool-disabled **reader agent** to summarize untrusted content,
674
- then pass the summary to your main agent.
675
- - Keeping `web_search` / `web_fetch` / `browser` off for tool-enabled agents unless needed.
676
- - For OpenResponses URL inputs (`input_file` / `input_image`), set tight
677
- `gateway.http.endpoints.responses.files.urlAllowlist` and
678
- `gateway.http.endpoints.responses.images.urlAllowlist`, and keep `maxUrlParts` low.
679
- Empty allowlists are treated as unset; use `files.allowUrl: false` / `images.allowUrl: false`
680
- if you want to disable URL fetching entirely.
681
- - For OpenResponses file inputs, decoded `input_file` text is still injected as
682
- **untrusted external content**. Do not rely on file text being trusted just because
683
- the Gateway decoded it locally. The injected block still carries explicit
684
- `<<<EXTERNAL_UNTRUSTED_CONTENT ...>>>` boundary markers plus `Source: External`
685
- metadata, even though this path omits the longer `SECURITY NOTICE:` banner.
686
- - The same marker-based wrapping is applied when media-understanding extracts text
687
- from attached documents before appending that text to the media prompt.
688
- - Enabling sandboxing and strict tool allowlists for any agent that touches untrusted input.
689
- - Keeping secrets out of prompts; pass them via env/config on the gateway host instead.
690
-
691
- ### Self-hosted LLM backends
692
-
693
- OpenAI-compatible self-hosted backends such as vLLM, SGLang, TGI, LM Studio,
694
- or custom Hugging Face tokenizer stacks can differ from hosted providers in how
695
- chat-template special tokens are handled. If a backend tokenizes literal strings
696
- such as `<|im_start|>`, `<|start_header_id|>`, or `<start_of_turn>` as
697
- structural chat-template tokens inside user content, untrusted text can try to
698
- forge role boundaries at the tokenizer layer.
699
-
700
- FengMing strips common model-family special-token literals from wrapped
701
- external content before dispatching it to the model. Keep external-content
702
- wrapping enabled, and prefer backend settings that split or escape special
703
- tokens in user-provided content when available. Hosted providers such as OpenAI
704
- and Anthropic already apply their own request-side sanitization.
705
-
706
- ### Model strength (security note)
707
-
708
- Prompt injection resistance is **not** uniform across model tiers. Smaller/cheaper models are generally more susceptible to tool misuse and instruction hijacking, especially under adversarial prompts.
709
-
710
- <Warning>
711
- For tool-enabled agents or agents that read untrusted content, prompt-injection risk with older/smaller models is often too high. Do not run those workloads on weak model tiers.
712
- </Warning>
713
-
714
- Recommendations:
715
-
716
- - **Use the latest generation, best-tier model** for any bot that can run tools or touch files/networks.
717
- - **Do not use older/weaker/smaller tiers** for tool-enabled agents or untrusted inboxes; the prompt-injection risk is too high.
718
- - If you must use a smaller model, **reduce blast radius** (read-only tools, strong sandboxing, minimal filesystem access, strict allowlists).
719
- - When running small models, **enable sandboxing for all sessions** and **disable web_search/web_fetch/browser** unless inputs are tightly controlled.
720
- - For chat-only personal assistants with trusted input and no tools, smaller models are usually fine.
721
-
722
- ## Reasoning and verbose output in groups
723
-
724
- `/reasoning`, `/verbose`, and `/trace` can expose internal reasoning, tool
725
- output, or plugin diagnostics that
726
- was not meant for a public channel. In group settings, treat them as **debug
727
- only** and keep them off unless you explicitly need them.
728
-
729
- Guidance:
730
-
731
- - Keep `/reasoning`, `/verbose`, and `/trace` disabled in public rooms.
732
- - If you enable them, do so only in trusted DMs or tightly controlled rooms.
733
- - Remember: verbose and trace output can include tool args, URLs, plugin diagnostics, and data the model saw.
734
-
735
- ## Configuration hardening examples
736
-
737
- ### File permissions
738
-
739
- Keep config + state private on the gateway host:
740
-
741
- - `~/.fengming/fengming.json`: `600` (user read/write only)
742
- - `~/.fengming`: `700` (user only)
743
-
744
- `fengming doctor` can warn and offer to tighten these permissions.
745
-
746
- ### Network exposure (bind, port, firewall)
747
-
748
- The Gateway multiplexes **WebSocket + HTTP** on a single port:
749
-
750
- - Default: `18789`
751
- - Config/flags/env: `gateway.port`, `--port`, `FENGMING_GATEWAY_PORT`
752
-
753
- This HTTP surface includes the Control UI and the canvas host:
754
-
755
- - Control UI (SPA assets) (default base path `/`)
756
- - Canvas host: `/__fengming__/canvas/` and `/__fengming__/a2ui/` (arbitrary HTML/JS; treat as untrusted content)
757
-
758
- If you load canvas content in a normal browser, treat it like any other untrusted web page:
759
-
760
- - Don't expose the canvas host to untrusted networks/users.
761
- - Don't make canvas content share the same origin as privileged web surfaces unless you fully understand the implications.
762
-
763
- Bind mode controls where the Gateway listens:
764
-
765
- - `gateway.bind: "loopback"` (default): only local clients can connect.
766
- - Non-loopback binds (`"lan"`, `"tailnet"`, `"custom"`) expand the attack surface. Only use them with gateway auth (shared token/password or a correctly configured trusted proxy) and a real firewall.
767
-
768
- Rules of thumb:
769
-
770
- - Prefer Tailscale Serve over LAN binds (Serve keeps the Gateway on loopback, and Tailscale handles access).
771
- - If you must bind to LAN, firewall the port to a tight allowlist of source IPs; do not port-forward it broadly.
772
- - Never expose the Gateway unauthenticated on `0.0.0.0`.
773
-
774
- ### Docker port publishing with UFW
775
-
776
- If you run FengMing with Docker on a VPS, remember that published container ports
777
- (`-p HOST:CONTAINER` or Compose `ports:`) are routed through Docker's forwarding
778
- chains, not only host `INPUT` rules.
779
-
780
- To keep Docker traffic aligned with your firewall policy, enforce rules in
781
- `DOCKER-USER` (this chain is evaluated before Docker's own accept rules).
782
- On many modern distros, `iptables`/`ip6tables` use the `iptables-nft` frontend
783
- and still apply these rules to the nftables backend.
784
-
785
- Minimal allowlist example (IPv4):
786
-
787
- ```bash
788
- # /etc/ufw/after.rules (append as its own *filter section)
789
- *filter
790
- :DOCKER-USER - [0:0]
791
- -A DOCKER-USER -m conntrack --ctstate ESTABLISHED,RELATED -j RETURN
792
- -A DOCKER-USER -s 127.0.0.0/8 -j RETURN
793
- -A DOCKER-USER -s 10.0.0.0/8 -j RETURN
794
- -A DOCKER-USER -s 172.16.0.0/12 -j RETURN
795
- -A DOCKER-USER -s 192.168.0.0/16 -j RETURN
796
- -A DOCKER-USER -s 100.64.0.0/10 -j RETURN
797
- -A DOCKER-USER -p tcp --dport 80 -j RETURN
798
- -A DOCKER-USER -p tcp --dport 443 -j RETURN
799
- -A DOCKER-USER -m conntrack --ctstate NEW -j DROP
800
- -A DOCKER-USER -j RETURN
801
- COMMIT
802
- ```
803
-
804
- IPv6 has separate tables. Add a matching policy in `/etc/ufw/after6.rules` if
805
- Docker IPv6 is enabled.
806
-
807
- Avoid hardcoding interface names like `eth0` in docs snippets. Interface names
808
- vary across VPS images (`ens3`, `enp*`, etc.) and mismatches can accidentally
809
- skip your deny rule.
810
-
811
- Quick validation after reload:
812
-
813
- ```bash
814
- ufw reload
815
- iptables -S DOCKER-USER
816
- ip6tables -S DOCKER-USER
817
- nmap -sT -p 1-65535 <public-ip> --open
818
- ```
819
-
820
- Expected external ports should be only what you intentionally expose (for most
821
- setups: SSH + your reverse proxy ports).
822
-
823
- ### mDNS/Bonjour discovery
824
-
825
- When the bundled `bonjour` plugin is enabled, the Gateway broadcasts its presence via mDNS (`_fengming-gw._tcp` on port 5353) for local device discovery. In full mode, this includes TXT records that may expose operational details:
826
-
827
- - `cliPath`: full filesystem path to the CLI binary (reveals username and install location)
828
- - `sshPort`: advertises SSH availability on the host
829
- - `displayName`, `lanHost`: hostname information
830
-
831
- **Operational security consideration:** Broadcasting infrastructure details makes reconnaissance easier for anyone on the local network. Even "harmless" info like filesystem paths and SSH availability helps attackers map your environment.
832
-
833
- **Recommendations:**
834
-
835
- 1. **Keep Bonjour disabled unless LAN discovery is needed.** Bonjour auto-starts on macOS hosts and is opt-in elsewhere; direct Gateway URLs, Tailnet, SSH, or wide-area DNS-SD avoid local multicast.
836
-
837
- 2. **Minimal mode** (default when Bonjour is enabled, recommended for exposed gateways): omit sensitive fields from mDNS broadcasts:
838
-
839
- ```json5
840
- {
841
- discovery: {
842
- mdns: { mode: "minimal" },
843
- },
844
- }
845
- ```
846
-
847
- 3. **Disable mDNS mode** if you want to keep the plugin enabled but suppress local device discovery:
848
-
849
- ```json5
850
- {
851
- discovery: {
852
- mdns: { mode: "off" },
853
- },
854
- }
855
- ```
856
-
857
- 4. **Full mode** (opt-in): include `cliPath` + `sshPort` in TXT records:
858
-
859
- ```json5
860
- {
861
- discovery: {
862
- mdns: { mode: "full" },
863
- },
864
- }
865
- ```
866
-
867
- 5. **Environment variable** (alternative): set `FENGMING_DISABLE_BONJOUR=1` to disable mDNS without config changes.
868
-
869
- When Bonjour is enabled in minimal mode, the Gateway broadcasts enough for device discovery (`role`, `gatewayPort`, `transport`) but omits `cliPath` and `sshPort`. Apps that need CLI path information can fetch it via the authenticated WebSocket connection instead.
870
-
871
- ### Lock down the Gateway WebSocket (local auth)
872
-
873
- Gateway auth is **required by default**. If no valid gateway auth path is configured,
874
- the Gateway refuses WebSocket connections (fail-closed).
875
-
876
- Onboarding generates a token by default (even for loopback) so
877
- local clients must authenticate.
878
-
879
- Set a token so **all** WS clients must authenticate:
880
-
881
- ```json5
882
- {
883
- gateway: {
884
- auth: { mode: "token", token: "your-token" },
885
- },
886
- }
887
- ```
888
-
889
- Doctor can generate one for you: `fengming doctor --generate-gateway-token`.
890
-
891
- <Note>
892
- `gateway.remote.token` and `gateway.remote.password` are client credential sources. They do **not** protect local WS access by themselves. Local call paths can use `gateway.remote.*` as fallback only when `gateway.auth.*` is unset. If `gateway.auth.token` or `gateway.auth.password` is explicitly configured via SecretRef and unresolved, resolution fails closed (no remote fallback masking).
893
- </Note>
894
- Optional: pin remote TLS with `gateway.remote.tlsFingerprint` when using `wss://`.
895
- Plaintext `ws://` is accepted for loopback, private IP literals, `.local`, and
896
- Tailnet `*.ts.net` gateway URLs. For other trusted private-DNS names, set
897
- `FENGMING_ALLOW_INSECURE_PRIVATE_WS=1` on the client process as break-glass.
898
- This is intentionally process environment only, not an `fengming.json` config
899
- key.
900
- Mobile pairing and Android manual or scanned gateway routes are stricter:
901
- cleartext is accepted for loopback, but private-LAN, link-local, `.local`, and
902
- dotless hostnames must use TLS unless you explicitly opt into the trusted
903
- private-network cleartext path.
904
-
905
- Local device pairing:
906
-
907
- - Device pairing is auto-approved for direct local loopback connects to keep
908
- same-host clients smooth.
909
- - FengMing also has a narrow backend/container-local self-connect path for
910
- trusted shared-secret helper flows.
911
- - Tailnet and LAN connects, including same-host tailnet binds, are treated as
912
- remote for pairing and still need approval.
913
- - Forwarded-header evidence on a loopback request disqualifies loopback
914
- locality. Metadata-upgrade auto-approval is scoped narrowly. See
915
- [Gateway pairing](/gateway/pairing) for both rules.
916
-
917
- Auth modes:
918
-
919
- - `gateway.auth.mode: "token"`: shared bearer token (recommended for most setups).
920
- - `gateway.auth.mode: "password"`: password auth (prefer setting via env: `FENGMING_GATEWAY_PASSWORD`).
921
- - `gateway.auth.mode: "trusted-proxy"`: trust an identity-aware reverse proxy to authenticate users and pass identity via headers (see [Trusted Proxy Auth](/gateway/trusted-proxy-auth)).
922
-
923
- Rotation checklist (token/password):
924
-
925
- 1. Generate/set a new secret (`gateway.auth.token` or `FENGMING_GATEWAY_PASSWORD`).
926
- 2. Restart the Gateway (or restart the macOS app if it supervises the Gateway).
927
- 3. Update any remote clients (`gateway.remote.token` / `.password` on machines that call into the Gateway).
928
- 4. Verify you can no longer connect with the old credentials.
929
-
930
- ### Tailscale Serve identity headers
931
-
932
- When `gateway.auth.allowTailscale` is `true` (default for Serve), FengMing
933
- accepts Tailscale Serve identity headers (`tailscale-user-login`) for Control
934
- UI/WebSocket authentication. FengMing verifies the identity by resolving the
935
- `x-forwarded-for` address through the local Tailscale daemon (`tailscale whois`)
936
- and matching it to the header. This only triggers for requests that hit loopback
937
- and include `x-forwarded-for`, `x-forwarded-proto`, and `x-forwarded-host` as
938
- injected by Tailscale.
939
- For this async identity check path, failed attempts for the same `{scope, ip}`
940
- are serialized before the limiter records the failure. Concurrent bad retries
941
- from one Serve client can therefore lock out the second attempt immediately
942
- instead of racing through as two plain mismatches.
943
- HTTP API endpoints (for example `/v1/*`, `/tools/invoke`, and `/api/channels/*`)
944
- do **not** use Tailscale identity-header auth. They still follow the gateway's
945
- configured HTTP auth mode.
946
-
947
- Important boundary note:
948
-
949
- - Gateway HTTP bearer auth is effectively all-or-nothing operator access.
950
- - Treat credentials that can call `/v1/chat/completions`, `/v1/responses`, plugin routes such as `/api/v1/admin/rpc`, or `/api/channels/*` as full-access operator secrets for that gateway.
951
- - On the OpenAI-compatible HTTP surface, shared-secret bearer auth restores the full default operator scopes (`operator.admin`, `operator.approvals`, `operator.pairing`, `operator.read`, `operator.talk.secrets`, `operator.write`) and owner semantics for agent turns; narrower `x-fengming-scopes` values do not reduce that shared-secret path.
952
- - Per-request scope semantics on HTTP only apply when the request comes from an identity-bearing mode such as trusted proxy auth, or from an explicitly no-auth private ingress.
953
- - In those identity-bearing modes, omitting `x-fengming-scopes` falls back to the normal operator default scope set; send the header explicitly when you want a narrower scope set.
954
- - `/tools/invoke` and HTTP session history endpoints follow the same shared-secret rule: token/password bearer auth is treated as full operator access there too, while identity-bearing modes still honor declared scopes.
955
- - Do not share these credentials with untrusted callers; prefer separate gateways per trust boundary.
956
-
957
- **Trust assumption:** tokenless Serve auth assumes the gateway host is trusted.
958
- Do not treat this as protection against hostile same-host processes. If untrusted
959
- local code may run on the gateway host, disable `gateway.auth.allowTailscale`
960
- and require explicit shared-secret auth with `gateway.auth.mode: "token"` or
961
- `"password"`.
962
-
963
- **Security rule:** do not forward these headers from your own reverse proxy. If
964
- you terminate TLS or proxy in front of the gateway, disable
965
- `gateway.auth.allowTailscale` and use shared-secret auth (`gateway.auth.mode:
966
- "token"` or `"password"`) or [Trusted Proxy Auth](/gateway/trusted-proxy-auth)
967
- instead.
968
-
969
- Trusted proxies:
970
-
971
- - If you terminate TLS in front of the Gateway, set `gateway.trustedProxies` to your proxy IPs.
972
- - FengMing will trust `x-forwarded-for` (or `x-real-ip`) from those IPs to determine the client IP for local pairing checks and HTTP auth/local checks.
973
- - Ensure your proxy **overwrites** `x-forwarded-for` and blocks direct access to the Gateway port.
974
-
975
- See [Tailscale](/gateway/tailscale) and [Web overview](/web).
976
-
977
- ### Browser control via node host (recommended)
978
-
979
- If your Gateway is remote but the browser runs on another machine, run a **node host**
980
- on the browser machine and let the Gateway proxy browser actions (see [Browser tool](/tools/browser)).
981
- Treat node pairing like admin access.
982
-
983
- Recommended pattern:
984
-
985
- - Keep the Gateway and node host on the same tailnet (Tailscale).
986
- - Pair the node intentionally; disable browser proxy routing if you don't need it.
987
-
988
- Avoid:
989
-
990
- - Exposing relay/control ports over LAN or public Internet.
991
- - Tailscale Funnel for browser control endpoints (public exposure).
992
-
993
- ### Secrets on disk
994
-
995
- Assume anything under `~/.fengming/` (or `$FENGMING_STATE_DIR/`) may contain secrets or private data:
996
-
997
- - `fengming.json`: config may include tokens (gateway, remote gateway), provider settings, and allowlists.
998
- - `credentials/**`: channel credentials (example: WhatsApp creds), pairing allowlists, legacy OAuth imports.
999
- - `agents/<agentId>/agent/auth-profiles.json`: API keys, token profiles, OAuth tokens, and optional `keyRef`/`tokenRef`.
1000
- - `agents/<agentId>/agent/codex-home/**`: per-agent Codex app-server account, config, skills, plugins, native thread state, and diagnostics.
1001
- - `secrets.json` (optional): file-backed secret payload used by `file` SecretRef providers (`secrets.providers`).
1002
- - `agents/<agentId>/agent/auth.json`: legacy compatibility file. Static `api_key` entries are scrubbed when discovered.
1003
- - `agents/<agentId>/sessions/**`: session transcripts (`*.jsonl`) + routing metadata (`sessions.json`) that can contain private messages and tool output.
1004
- - bundled plugin packages: installed plugins (plus their `node_modules/`).
1005
- - `sandboxes/**`: tool sandbox workspaces; can accumulate copies of files you read/write inside the sandbox.
1006
-
1007
- Hardening tips:
1008
-
1009
- - Keep permissions tight (`700` on dirs, `600` on files).
1010
- - Use full-disk encryption on the gateway host.
1011
- - Prefer a dedicated OS user account for the Gateway if the host is shared.
1012
-
1013
- ### Workspace `.env` files
1014
-
1015
- FengMing loads workspace-local `.env` files for agents and tools, but never lets those files silently override gateway runtime controls.
1016
-
1017
- - Provider credential environment variables are blocked from untrusted workspace `.env` files. Examples include `GEMINI_API_KEY`, `GOOGLE_API_KEY`, `XAI_API_KEY`, `MISTRAL_API_KEY`, `GROQ_API_KEY`, `DEEPSEEK_API_KEY`, `PERPLEXITY_API_KEY`, `BRAVE_API_KEY`, `TAVILY_API_KEY`, `EXA_API_KEY`, `FIRECRAWL_API_KEY`, and provider auth keys declared by installed trusted plugins. Put provider credentials in the Gateway process environment, `~/.fengming/.env` (`$FENGMING_STATE_DIR/.env`), the config `env` block, or optional login-shell import.
1018
- - Any key that starts with `FENGMING_*` is blocked from untrusted workspace `.env` files.
1019
- - Channel endpoint settings for Matrix, Mattermost, IRC, and Synology Chat are also blocked from workspace `.env` overrides, so cloned workspaces cannot redirect bundled connector traffic through local endpoint config. Endpoint env keys (such as `MATRIX_HOMESERVER`, `MATTERMOST_URL`, `IRC_HOST`, `SYNOLOGY_CHAT_INCOMING_URL`) must come from the gateway process environment or `env.shellEnv`, not from a workspace-loaded `.env`.
1020
- - The block is fail-closed: a new runtime-control variable added in a future release cannot be inherited from a checked-in or attacker-supplied `.env`; the key is ignored and the gateway keeps its own value.
1021
- - Trusted process/OS environment variables, global runtime dotenv, config `env`, and enabled login-shell import still apply - this only constrains workspace `.env` file loading.
1022
-
1023
- Why: workspace `.env` files frequently live next to agent code, get committed by accident, or get written by tools. Blocking provider credentials prevents a cloned workspace from substituting attacker-controlled provider accounts. Blocking the whole `FENGMING_*` prefix means adding a new `FENGMING_*` flag later can never regress into silent inheritance from workspace state.
1024
-
1025
- ### Logs and transcripts (redaction and retention)
1026
-
1027
- Logs and transcripts can leak sensitive info even when access controls are correct:
1028
-
1029
- - Gateway logs may include tool summaries, errors, and URLs.
1030
- - Session transcripts can include pasted secrets, file contents, command output, and links.
1031
-
1032
- Recommendations:
1033
-
1034
- - Keep log and transcript redaction on (`logging.redactSensitive: "tools"`; default).
1035
- - Add custom patterns for your environment via `logging.redactPatterns` (tokens, hostnames, internal URLs).
1036
- - When sharing diagnostics, prefer `fengming status --all` (pasteable, secrets redacted) over raw logs.
1037
- - Prune old session transcripts and log files if you don't need long retention.
1038
-
1039
- Details: [Logging](/gateway/logging)
1040
-
1041
- ### DMs: pairing by default
1042
-
1043
- ```json5
1044
- {
1045
- channels: { whatsapp: { dmPolicy: "pairing" } },
1046
- }
1047
- ```
1048
-
1049
- ### Groups: require mention everywhere
1050
-
1051
- ```json
1052
- {
1053
- "channels": {
1054
- "whatsapp": {
1055
- "groups": {
1056
- "*": { "requireMention": true }
1057
- }
1058
- }
1059
- },
1060
- "agents": {
1061
- "list": [
1062
- {
1063
- "id": "main",
1064
- "groupChat": { "mentionPatterns": ["@fengming", "@mybot"] }
1065
- }
1066
- ]
1067
- }
1068
- }
1069
- ```
1070
-
1071
- In group chats, only respond when explicitly mentioned.
1072
-
1073
- ### Separate numbers (WhatsApp, Signal, Telegram)
1074
-
1075
- For phone-number-based channels, consider running your AI on a separate phone number from your personal one:
1076
-
1077
- - Personal number: Your conversations stay private
1078
- - Bot number: AI handles these, with appropriate boundaries
1079
-
1080
- ### Read-only mode (via sandbox and tools)
1081
-
1082
- You can build a read-only profile by combining:
1083
-
1084
- - `agents.defaults.sandbox.workspaceAccess: "ro"` (or `"none"` for no workspace access)
1085
- - tool allow/deny lists that block `write`, `edit`, `apply_patch`, `exec`, `process`, etc.
1086
-
1087
- Additional hardening options:
1088
-
1089
- - `tools.exec.applyPatch.workspaceOnly: true` (default): ensures `apply_patch` cannot write/delete outside the workspace directory even when sandboxing is off. Set to `false` only if you intentionally want `apply_patch` to touch files outside the workspace.
1090
- - `tools.fs.workspaceOnly: true` (optional): restricts `read`/`write`/`edit`/`apply_patch` paths and native prompt image auto-load paths to the workspace directory (useful if you allow absolute paths today and want a single guardrail).
1091
- - Keep filesystem roots narrow: avoid broad roots like your home directory for agent workspaces/sandbox workspaces. Broad roots can expose sensitive local files (for example state/config under `~/.fengming`) to filesystem tools.
1092
-
1093
- ### Secure baseline (copy/paste)
1094
-
1095
- One "safe default" config that keeps the Gateway private, requires DM pairing, and avoids always-on group bots:
1096
-
1097
- ```json5
1098
- {
1099
- gateway: {
1100
- mode: "local",
1101
- bind: "loopback",
1102
- port: 18789,
1103
- auth: { mode: "token", token: "your-long-random-token" },
1104
- },
1105
- channels: {
1106
- whatsapp: {
1107
- dmPolicy: "pairing",
1108
- groups: { "*": { requireMention: true } },
1109
- },
1110
- },
1111
- }
1112
- ```
1113
-
1114
- If you want "safer by default" tool execution too, add a sandbox + deny dangerous tools for any non-owner agent (example below under "Per-agent access profiles").
1115
-
1116
- Built-in baseline for chat-driven agent turns: non-owner senders cannot use the `cron` or `gateway` tools.
1117
-
1118
- ## Sandboxing (recommended)
1119
-
1120
- Dedicated doc: [Sandboxing](/gateway/sandboxing)
1121
-
1122
- Two complementary approaches:
1123
-
1124
- - **Run the full Gateway in Docker** (container boundary): [Docker](/install/docker)
1125
- - **Tool sandbox** (`agents.defaults.sandbox`, host gateway + sandbox-isolated tools; Docker is the default backend): [Sandboxing](/gateway/sandboxing)
1126
-
1127
- <Note>
1128
- To prevent cross-agent access, keep `agents.defaults.sandbox.scope` at `"agent"` (default) or `"session"` for stricter per-session isolation. `scope: "shared"` uses a single container or workspace.
1129
- </Note>
1130
-
1131
- Also consider agent workspace access inside the sandbox:
1132
-
1133
- - `agents.defaults.sandbox.workspaceAccess: "none"` (default) keeps the agent workspace off-limits; tools run against a sandbox workspace under `~/.fengming/sandboxes`
1134
- - `agents.defaults.sandbox.workspaceAccess: "ro"` mounts the agent workspace read-only at `/agent` (disables `write`/`edit`/`apply_patch`)
1135
- - `agents.defaults.sandbox.workspaceAccess: "rw"` mounts the agent workspace read/write at `/workspace`
1136
- - Extra `sandbox.docker.binds` are validated against normalized and canonicalized source paths. Parent-symlink tricks and canonical home aliases still fail closed if they resolve into blocked roots such as `/etc`, `/var/run`, or credential directories under the OS home.
1137
-
1138
- <Warning>
1139
- `tools.elevated` is the global baseline escape hatch that runs exec outside the sandbox. The effective host is `gateway` by default, or `node` when the exec target is configured to `node`. Keep `tools.elevated.allowFrom` tight and do not enable it for strangers. You can further restrict elevated per agent via `agents.list[].tools.elevated`. See [Elevated mode](/tools/elevated).
1140
- </Warning>
1141
-
1142
- ### Sub-agent delegation guardrail
1143
-
1144
- If you allow session tools, treat delegated sub-agent runs as another boundary decision:
1145
-
1146
- - Deny `sessions_spawn` unless the agent truly needs delegation.
1147
- - Keep `agents.defaults.subagents.allowAgents` and any per-agent `agents.list[].subagents.allowAgents` overrides restricted to known-safe target agents.
1148
- - For any workflow that must remain sandboxed, call `sessions_spawn` with `sandbox: "require"` (default is `inherit`).
1149
- - `sandbox: "require"` fails fast when the target child runtime is not sandboxed.
1150
-
1151
- ## Browser control risks
1152
-
1153
- Enabling browser control gives the model the ability to drive a real browser.
1154
- If that browser profile already contains logged-in sessions, the model can
1155
- access those accounts and data. Treat browser profiles as **sensitive state**:
1156
-
1157
- - Prefer a dedicated profile for the agent (the default `fengming` profile).
1158
- - Avoid pointing the agent at your personal daily-driver profile.
1159
- - Keep host browser control disabled for sandboxed agents unless you trust them.
1160
- - The standalone loopback browser control API only honors shared-secret auth
1161
- (gateway token bearer auth or gateway password). It does not consume
1162
- trusted-proxy or Tailscale Serve identity headers.
1163
- - Treat browser downloads as untrusted input; prefer an isolated downloads directory.
1164
- - Disable browser sync/password managers in the agent profile if possible (reduces blast radius).
1165
- - For remote gateways, assume "browser control" is equivalent to "operator access" to whatever that profile can reach.
1166
- - Keep the Gateway and node hosts tailnet-only; avoid exposing browser control ports to LAN or public Internet.
1167
- - Disable browser proxy routing when you don't need it (`gateway.nodes.browser.mode="off"`).
1168
- - Chrome MCP existing-session mode is **not** "safer"; it can act as you in whatever that host Chrome profile can reach.
1169
-
1170
- ### Browser SSRF policy (strict by default)
1171
-
1172
- FengMing's browser navigation policy is strict by default: private/internal destinations stay blocked unless you explicitly opt in.
1173
-
1174
- - Default: `browser.ssrfPolicy.dangerouslyAllowPrivateNetwork` is unset, so browser navigation keeps private/internal/special-use destinations blocked.
1175
- - Legacy alias: `browser.ssrfPolicy.allowPrivateNetwork` is still accepted for compatibility.
1176
- - Opt-in mode: set `browser.ssrfPolicy.dangerouslyAllowPrivateNetwork: true` to allow private/internal/special-use destinations.
1177
- - In strict mode, use `hostnameAllowlist` (patterns like `*.example.com`) and `allowedHostnames` (exact host exceptions, including blocked names like `localhost`) for explicit exceptions.
1178
- - Navigation is checked before request and best-effort re-checked on the final `http(s)` URL after navigation to reduce redirect-based pivots.
1179
-
1180
- Example strict policy:
1181
-
1182
- ```json5
1183
- {
1184
- browser: {
1185
- ssrfPolicy: {
1186
- dangerouslyAllowPrivateNetwork: false,
1187
- hostnameAllowlist: ["*.example.com", "example.com"],
1188
- allowedHostnames: ["localhost"],
1189
- },
1190
- },
1191
- }
1192
- ```
1193
-
1194
- ## Per-agent access profiles (multi-agent)
1195
-
1196
- With multi-agent routing, each agent can have its own sandbox + tool policy:
1197
- use this to give **full access**, **read-only**, or **no access** per agent.
1198
- See [Multi-Agent Sandbox & Tools](/tools/multi-agent-sandbox-tools) for full details
1199
- and precedence rules.
1200
-
1201
- Common use cases:
1202
-
1203
- - Personal agent: full access, no sandbox
1204
- - Family/work agent: sandboxed + read-only tools
1205
- - Public agent: sandboxed + no filesystem/shell tools
1206
-
1207
- ### Example: full access (no sandbox)
1208
-
1209
- ```json5
1210
- {
1211
- agents: {
1212
- list: [
1213
- {
1214
- id: "personal",
1215
- workspace: "~/.fengming/workspace-personal",
1216
- sandbox: { mode: "off" },
1217
- },
1218
- ],
1219
- },
1220
- }
1221
- ```
1222
-
1223
- ### Example: read-only tools + read-only workspace
1224
-
1225
- ```json5
1226
- {
1227
- agents: {
1228
- list: [
1229
- {
1230
- id: "family",
1231
- workspace: "~/.fengming/workspace-family",
1232
- sandbox: {
1233
- mode: "all",
1234
- scope: "agent",
1235
- workspaceAccess: "ro",
1236
- },
1237
- tools: {
1238
- allow: ["read"],
1239
- deny: ["write", "edit", "apply_patch", "exec", "process", "browser"],
1240
- },
1241
- },
1242
- ],
1243
- },
1244
- }
1245
- ```
1246
-
1247
- ### Example: no filesystem/shell access (provider messaging allowed)
1248
-
1249
- ```json5
1250
- {
1251
- agents: {
1252
- list: [
1253
- {
1254
- id: "public",
1255
- workspace: "~/.fengming/workspace-public",
1256
- sandbox: {
1257
- mode: "all",
1258
- scope: "agent",
1259
- workspaceAccess: "none",
1260
- },
1261
- // Session tools can reveal sensitive data from transcripts. By default FengMing limits these tools
1262
- // to the current session + spawned subagent sessions, but you can clamp further if needed.
1263
- // See `tools.sessions.visibility` in the configuration reference.
1264
- tools: {
1265
- sessions: { visibility: "tree" }, // self | tree | agent | all
1266
- allow: [
1267
- "sessions_list",
1268
- "sessions_history",
1269
- "sessions_send",
1270
- "sessions_spawn",
1271
- "session_status",
1272
- "whatsapp",
1273
- "telegram",
1274
- "slack",
1275
- "discord",
1276
- ],
1277
- deny: [
1278
- "read",
1279
- "write",
1280
- "edit",
1281
- "apply_patch",
1282
- "exec",
1283
- "process",
1284
- "browser",
1285
- "canvas",
1286
- "nodes",
1287
- "cron",
1288
- "gateway",
1289
- "image",
1290
- ],
1291
- },
1292
- },
1293
- ],
1294
- },
1295
- }
1296
- ```
1297
-
1298
- ## Incident response
1299
-
1300
- If your AI does something bad:
1301
-
1302
- ### Contain
1303
-
1304
- 1. **Stop it:** stop the macOS app (if it supervises the Gateway) or terminate your `fengming gateway` process.
1305
- 2. **Close exposure:** set `gateway.bind: "loopback"` (or disable Tailscale Funnel/Serve) until you understand what happened.
1306
- 3. **Freeze access:** switch risky DMs/groups to `dmPolicy: "disabled"` / require mentions, and remove `"*"` allow-all entries if you had them.
1307
-
1308
- ### Rotate (assume compromise if secrets leaked)
1309
-
1310
- 1. Rotate Gateway auth (`gateway.auth.token` / `FENGMING_GATEWAY_PASSWORD`) and restart.
1311
- 2. Rotate remote client secrets (`gateway.remote.token` / `.password`) on any machine that can call the Gateway.
1312
- 3. Rotate provider/API credentials (WhatsApp creds, Slack/Discord tokens, model/API keys in `auth-profiles.json`, and encrypted secrets payload values when used).
1313
-
1314
- ### Audit
1315
-
1316
- 1. Check Gateway logs: `/tmp/fengming/fengming-YYYY-MM-DD.log` (or `logging.file`).
1317
- 2. Review the relevant transcript(s): `~/.fengming/agents/<agentId>/sessions/*.jsonl`.
1318
- 3. Review recent config changes (anything that could have widened access: `gateway.bind`, `gateway.auth`, dm/group policies, `tools.elevated`, plugin changes).
1319
- 4. Re-run `fengming security audit --deep` and confirm critical findings are resolved.
1320
-
1321
- ### Collect for a report
1322
-
1323
- - Timestamp, gateway host OS + FengMing version
1324
- - The session transcript(s) + a short log tail (after redacting)
1325
- - What the attacker sent + what the agent did
1326
- - Whether the Gateway was exposed beyond loopback (LAN/Tailscale Funnel/Serve)
1327
-
1328
- ## Secret scanning
1329
-
1330
- CI runs the pre-commit `detect-private-key` hook over the repository. If it
1331
- fails, remove or rotate the committed key material, then reproduce locally:
1332
-
1333
- ```bash
1334
- pre-commit run --all-files detect-private-key
1335
- ```
1336
-
1337
- ## Reporting security issues
1338
-
1339
- Found a vulnerability in FengMing? Please report responsibly:
1340
-
1341
- 1. Email: [security@fengming.ai](mailto:security@fengming.ai)
1342
- 2. Don't post publicly until fixed
1343
- 3. We'll credit you (unless you prefer anonymity)