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,1737 +0,0 @@
1
- ---
2
- summary: "Google Meet plugin: join explicit Meet URLs through Chrome or Twilio with agent talk-back defaults"
3
- read_when:
4
- - You want an FengMing agent to join a Google Meet call
5
- - You want an FengMing agent to create a new Google Meet call
6
- - You are configuring Chrome, Chrome node, or Twilio as a Google Meet transport
7
- title: "Google Meet plugin"
8
- ---
9
-
10
- Google Meet participant support for FengMing — the plugin is explicit by design:
11
-
12
- - It only joins an explicit `https://meet.google.com/...` URL.
13
- - It can create a new Meet space through the Google Meet API, then join the
14
- returned URL.
15
- - `agent` is the default talk-back mode: realtime transcription listens, the
16
- configured FengMing agent answers, and regular FengMing TTS speaks into Meet.
17
- - `bidi` remains available as the fallback direct realtime voice model mode.
18
- - Agents choose the join behavior with `mode`: use `agent` for live
19
- listen/talk-back, `bidi` for direct realtime voice fallback, or `transcribe`
20
- to join/control the browser without the talk-back bridge.
21
- - Auth starts as personal Google OAuth or an already signed-in Chrome profile.
22
- - There is no automatic consent announcement.
23
- - The default Chrome audio backend is `BlackHole 2ch`.
24
- - Chrome can run locally or on a paired node host.
25
- - Twilio accepts a dial-in number plus optional PIN or DTMF sequence; it
26
- cannot dial a Meet URL directly.
27
- - The CLI command is `googlemeet`; `meet` is reserved for broader agent
28
- teleconference workflows.
29
-
30
- ## Quick start
31
-
32
- Install the local audio dependencies and configure a realtime transcription
33
- provider plus regular FengMing TTS. OpenAI is the default transcription
34
- provider; Google Gemini Live also works as a separate `bidi` voice fallback with
35
- `realtime.voiceProvider: "google"`:
36
-
37
- ```bash
38
- brew install blackhole-2ch sox
39
- export OPENAI_API_KEY=sk-...
40
- # only needed when realtime.voiceProvider is "google" for bidi mode
41
- export GEMINI_API_KEY=...
42
- ```
43
-
44
- `blackhole-2ch` installs the `BlackHole 2ch` virtual audio device. Homebrew's
45
- installer requires a reboot before macOS exposes the device:
46
-
47
- ```bash
48
- sudo reboot
49
- ```
50
-
51
- After reboot, verify both pieces:
52
-
53
- ```bash
54
- system_profiler SPAudioDataType | grep -i BlackHole
55
- command -v sox
56
- ```
57
-
58
- Enable the plugin:
59
-
60
- ```json5
61
- {
62
- plugins: {
63
- entries: {
64
- "google-meet": {
65
- enabled: true,
66
- config: {},
67
- },
68
- },
69
- },
70
- }
71
- ```
72
-
73
- Check setup:
74
-
75
- ```bash
76
- fengming googlemeet setup
77
- ```
78
-
79
- The setup output is meant to be agent-readable and mode-aware. It reports Chrome
80
- profile, node pinning, and, for realtime Chrome joins, the BlackHole/SoX audio
81
- bridge and delayed realtime intro checks. For observe-only joins, check the same
82
- transport with `--mode transcribe`; that mode skips realtime audio prerequisites
83
- because it does not listen through or speak through the bridge:
84
-
85
- ```bash
86
- fengming googlemeet setup --transport chrome-node --mode transcribe
87
- ```
88
-
89
- When Twilio delegation is configured, setup also reports whether the
90
- `voice-call` plugin, Twilio credentials, and public webhook exposure are ready.
91
- Treat any `ok: false` check as a blocker for the checked transport and mode
92
- before asking an agent to join. Use `fengming googlemeet setup --json` for
93
- scripts or machine-readable output. Use `--transport chrome`,
94
- `--transport chrome-node`, or `--transport twilio` to preflight a specific
95
- transport before an agent tries it.
96
-
97
- For Twilio, always preflight the transport explicitly when the default transport
98
- is Chrome:
99
-
100
- ```bash
101
- fengming googlemeet setup --transport twilio
102
- ```
103
-
104
- That catches missing `voice-call` wiring, Twilio credentials, or unreachable
105
- webhook exposure before the agent tries to dial the meeting.
106
-
107
- Join a meeting:
108
-
109
- ```bash
110
- fengming googlemeet join https://meet.google.com/abc-defg-hij
111
- ```
112
-
113
- Or let an agent join through the `google_meet` tool:
114
-
115
- ```json
116
- {
117
- "action": "join",
118
- "url": "https://meet.google.com/abc-defg-hij",
119
- "transport": "chrome-node",
120
- "mode": "agent"
121
- }
122
- ```
123
-
124
- The agent-facing `google_meet` tool stays available on non-macOS hosts for
125
- artifact, calendar, setup, transcribe, Twilio, and `chrome-node` flows. Local
126
- Chrome talk-back actions are blocked there because the bundled Chrome audio path
127
- currently depends on macOS `BlackHole 2ch`. On Linux, use `mode: "transcribe"`,
128
- Twilio dial-in, or a macOS `chrome-node` host for Chrome talk-back
129
- participation.
130
-
131
- Create a new meeting and join it:
132
-
133
- ```bash
134
- fengming googlemeet create --transport chrome-node --mode agent
135
- ```
136
-
137
- For API-created rooms, use Google Meet `SpaceConfig.accessType` when you want
138
- the room's no-knock policy to be explicit instead of inherited from the Google
139
- account defaults:
140
-
141
- ```bash
142
- fengming googlemeet create --access-type OPEN --transport chrome-node --mode agent
143
- ```
144
-
145
- `OPEN` lets anyone with the Meet URL join without knocking. `TRUSTED` lets the
146
- host organization's trusted users, invited external users, and dial-in users
147
- join without knocking. `RESTRICTED` limits no-knock entry to invitees. These
148
- settings only apply to the official Google Meet API creation path, so OAuth
149
- credentials must be configured.
150
-
151
- If you authenticated Google Meet before this option was available, rerun
152
- `fengming googlemeet auth login --json` after adding the
153
- `meetings.space.settings` scope to your Google OAuth consent screen.
154
-
155
- Create only the URL without joining:
156
-
157
- ```bash
158
- fengming googlemeet create --no-join
159
- ```
160
-
161
- `googlemeet create` has two paths:
162
-
163
- - API create: used when Google Meet OAuth credentials are configured. This is
164
- the most deterministic path and does not depend on browser UI state.
165
- - Browser fallback: used when OAuth credentials are absent. FengMing uses the
166
- pinned Chrome node, opens `https://meet.google.com/new`, waits for Google to
167
- redirect to a real meeting-code URL, then returns that URL. This path requires
168
- the FengMing Chrome profile on the node to already be signed in to Google.
169
- Browser automation handles Meet's own first-run microphone prompt; that prompt
170
- is not treated as a Google login failure.
171
- Join and create flows also try to reuse an existing Meet tab before opening a
172
- new one. Matching ignores harmless URL query strings such as `authuser`, so an
173
- agent retry should focus the already-open meeting instead of creating a second
174
- Chrome tab.
175
-
176
- The command/tool output includes a `source` field (`api` or `browser`) so agents
177
- can explain which path was used. `create` joins the new meeting by default and
178
- returns `joined: true` plus the join session. To only mint the URL, use
179
- `create --no-join` on the CLI or pass `"join": false` to the tool.
180
-
181
- Or tell an agent: "Create a Google Meet, join it with the agent talk-back mode,
182
- and send me the link." The agent should call `google_meet` with
183
- `action: "create"` and then share the returned `meetingUri`.
184
-
185
- ```json
186
- {
187
- "action": "create",
188
- "transport": "chrome-node",
189
- "mode": "agent"
190
- }
191
- ```
192
-
193
- For an observe-only/browser-control join, set `"mode": "transcribe"`. That does
194
- not start the duplex realtime voice bridge, does not require BlackHole or SoX,
195
- and will not talk back into the meeting. Chrome joins in this mode also avoid
196
- FengMing's microphone/camera permission grant and avoid the Meet **Use
197
- microphone** path. If Meet shows an audio-choice interstitial, automation tries
198
- the no-microphone path and otherwise reports a manual action instead of opening
199
- the local microphone. In transcribe mode, managed Chrome transports also install
200
- a best-effort Meet caption observer. `googlemeet status --json` and
201
- `googlemeet doctor` surface `captioning`, `captionsEnabledAttempted`,
202
- `transcriptLines`, `lastCaptionAt`, `lastCaptionSpeaker`, `lastCaptionText`,
203
- and a short `recentTranscript` tail so operators can tell whether the browser
204
- joined the call and whether Meet captions are producing text.
205
- Use `fengming googlemeet test-listen <meet-url> --transport chrome-node` when
206
- you need a yes/no probe: it joins in transcribe mode, waits for fresh caption or
207
- transcript movement, and returns `listenVerified`, `listenTimedOut`, manual
208
- action fields, and the latest caption health.
209
-
210
- During realtime sessions, `google_meet` status includes browser and audio bridge
211
- health such as `inCall`, `manualActionRequired`, `providerConnected`,
212
- `realtimeReady`, `audioInputActive`, `audioOutputActive`, last input/output
213
- timestamps, byte counters, and bridge closed state. If a safe Meet page prompt
214
- appears, browser automation handles it when it can. Login, host admission, and
215
- browser/OS permission prompts are reported as manual action with a reason and
216
- message for the agent to relay. Managed Chrome sessions only emit the intro or
217
- test phrase after browser health reports `inCall: true`; otherwise status reports
218
- `speechReady: false` and the speech attempt is blocked instead of pretending the
219
- agent spoke into the meeting.
220
-
221
- Local Chrome joins through the signed-in FengMing browser profile. Realtime mode
222
- requires `BlackHole 2ch` for the microphone/speaker path used by FengMing. For
223
- clean duplex audio, use separate virtual devices or a Loopback-style graph; a
224
- single BlackHole device is enough for a first smoke test but can echo.
225
-
226
- ### Local gateway + Parallels Chrome
227
-
228
- You do **not** need a full FengMing Gateway or model API key inside a macOS VM
229
- just to make the VM own Chrome. Run the Gateway and agent locally, then run a
230
- node host in the VM. Enable the bundled plugin on the VM once so the node
231
- advertises the Chrome command:
232
-
233
- What runs where:
234
-
235
- - Gateway host: FengMing Gateway, agent workspace, model/API keys, realtime
236
- provider, and the Google Meet plugin config.
237
- - Parallels macOS VM: FengMing CLI/node host, Google Chrome, SoX, BlackHole 2ch,
238
- and a Chrome profile signed in to Google.
239
- - Not needed in the VM: Gateway service, agent config, OpenAI/GPT key, or model
240
- provider setup.
241
-
242
- Install the VM dependencies:
243
-
244
- ```bash
245
- brew install blackhole-2ch sox
246
- ```
247
-
248
- Reboot the VM after installing BlackHole so macOS exposes `BlackHole 2ch`:
249
-
250
- ```bash
251
- sudo reboot
252
- ```
253
-
254
- After reboot, verify the VM can see the audio device and SoX commands:
255
-
256
- ```bash
257
- system_profiler SPAudioDataType | grep -i BlackHole
258
- command -v sox
259
- ```
260
-
261
- Install or update FengMing in the VM, then enable the bundled plugin there:
262
-
263
- ```bash
264
- fengming plugins enable google-meet
265
- ```
266
-
267
- Start the node host in the VM:
268
-
269
- ```bash
270
- fengming node run --host <gateway-host> --port 18789 --display-name parallels-macos
271
- ```
272
-
273
- If `<gateway-host>` is a LAN IP and you are not using TLS, the node refuses the
274
- plaintext WebSocket unless you opt in for that trusted private network:
275
-
276
- ```bash
277
- FENGMING_ALLOW_INSECURE_PRIVATE_WS=1 \
278
- fengming node run --host <gateway-lan-ip> --port 18789 --display-name parallels-macos
279
- ```
280
-
281
- Use the same environment variable when installing the node as a LaunchAgent:
282
-
283
- ```bash
284
- FENGMING_ALLOW_INSECURE_PRIVATE_WS=1 \
285
- fengming node install --host <gateway-lan-ip> --port 18789 --display-name parallels-macos --force
286
- fengming node restart
287
- ```
288
-
289
- `FENGMING_ALLOW_INSECURE_PRIVATE_WS=1` is process environment, not an
290
- `fengming.json` setting. `fengming node install` stores it in the LaunchAgent
291
- environment when it is present on the install command.
292
-
293
- Approve the node from the Gateway host:
294
-
295
- ```bash
296
- fengming devices list
297
- fengming devices approve <requestId>
298
- ```
299
-
300
- Confirm the Gateway sees the node and that it advertises both `googlemeet.chrome`
301
- and browser capability/`browser.proxy`:
302
-
303
- ```bash
304
- fengming nodes status
305
- ```
306
-
307
- Route Meet through that node on the Gateway host:
308
-
309
- ```json5
310
- {
311
- gateway: {
312
- nodes: {
313
- allowCommands: ["googlemeet.chrome", "browser.proxy"],
314
- },
315
- },
316
- plugins: {
317
- entries: {
318
- "google-meet": {
319
- enabled: true,
320
- config: {
321
- defaultTransport: "chrome-node",
322
- chrome: {
323
- guestName: "FengMing Agent",
324
- autoJoin: true,
325
- reuseExistingTab: true,
326
- },
327
- chromeNode: {
328
- node: "parallels-macos",
329
- },
330
- },
331
- },
332
- },
333
- },
334
- }
335
- ```
336
-
337
- Now join normally from the Gateway host:
338
-
339
- ```bash
340
- fengming googlemeet join https://meet.google.com/abc-defg-hij
341
- ```
342
-
343
- or ask the agent to use the `google_meet` tool with `transport: "chrome-node"`.
344
-
345
- For a one-command smoke test that creates or reuses a session, speaks a known
346
- phrase, and prints session health:
347
-
348
- ```bash
349
- fengming googlemeet test-speech https://meet.google.com/abc-defg-hij
350
- ```
351
-
352
- During realtime join, FengMing browser automation fills the guest name, clicks
353
- Join/Ask to join, and accepts Meet's first-run "Use microphone" choice when that
354
- prompt appears. During observe-only join or browser-only meeting creation, it
355
- continues past the same prompt without microphone when that choice is available.
356
- If the browser profile is not signed in, Meet is waiting for host admission,
357
- Chrome needs microphone/camera permission for a realtime join, or Meet is stuck
358
- on a prompt automation could not resolve, the join/test-speech result reports
359
- `manualActionRequired: true` with `manualActionReason` and
360
- `manualActionMessage`. Agents should stop retrying the join, report that exact
361
- message plus the current `browserUrl`/`browserTitle`, and retry only after the
362
- manual browser action is complete.
363
-
364
- If `chromeNode.node` is omitted, FengMing auto-selects only when exactly one
365
- connected node advertises both `googlemeet.chrome` and browser control. If
366
- several capable nodes are connected, set `chromeNode.node` to the node id,
367
- display name, or remote IP.
368
-
369
- Common failure checks:
370
-
371
- - `Configured Google Meet node ... is not usable: offline`: the pinned node is
372
- known to the Gateway but unavailable. Agents should treat that node as
373
- diagnostic state, not as a usable Chrome host, and report the setup blocker
374
- instead of falling back to another transport unless the user asked for that.
375
- - `No connected Google Meet-capable node`: start `fengming node run` in the VM,
376
- approve pairing, and make sure `fengming plugins enable google-meet` and
377
- `fengming plugins enable browser` were run in the VM. Also confirm the
378
- Gateway host allows both node commands with
379
- `gateway.nodes.allowCommands: ["googlemeet.chrome", "browser.proxy"]`.
380
- - `BlackHole 2ch audio device not found`: install `blackhole-2ch` on the host
381
- being checked and reboot before using local Chrome audio.
382
- - `BlackHole 2ch audio device not found on the node`: install `blackhole-2ch`
383
- in the VM and reboot the VM.
384
- - Chrome opens but cannot join: sign in to the browser profile inside the VM, or
385
- keep `chrome.guestName` set for guest join. Guest auto-join uses FengMing
386
- browser automation through the node browser proxy; make sure the node browser
387
- config points at the profile you want, for example
388
- `browser.defaultProfile: "user"` or a named existing-session profile.
389
- - Duplicate Meet tabs: leave `chrome.reuseExistingTab: true` enabled. FengMing
390
- activates an existing tab for the same Meet URL before opening a new one, and
391
- browser meeting creation reuses an in-progress `https://meet.google.com/new`
392
- or Google account prompt tab before opening another one.
393
- - No audio: in Meet, route microphone/speaker through the virtual audio device
394
- path used by FengMing; use separate virtual devices or Loopback-style routing
395
- for clean duplex audio.
396
-
397
- ## Install notes
398
-
399
- The Chrome talk-back default uses two external tools:
400
-
401
- - `sox`: command-line audio utility. The plugin uses explicit CoreAudio
402
- device commands for the default 24 kHz PCM16 audio bridge.
403
- - `blackhole-2ch`: macOS virtual audio driver. It creates the `BlackHole 2ch`
404
- audio device that Chrome/Meet can route through.
405
-
406
- FengMing does not bundle or redistribute either package. The docs ask users to
407
- install them as host dependencies through Homebrew. SoX is licensed as
408
- `LGPL-2.0-only AND GPL-2.0-only`; BlackHole is GPL-3.0. If you build an
409
- installer or appliance that bundles BlackHole with FengMing, review BlackHole's
410
- upstream licensing terms or get a separate license from Existential Audio.
411
-
412
- ## Transports
413
-
414
- ### Chrome
415
-
416
- Chrome transport opens the Meet URL through FengMing browser control and joins
417
- as the signed-in FengMing browser profile. On macOS, the plugin checks for
418
- `BlackHole 2ch` before launch. If configured, it also runs an audio bridge
419
- health command and startup command before opening Chrome. Use `chrome` when
420
- Chrome/audio live on the Gateway host; use `chrome-node` when Chrome/audio live
421
- on a paired node such as a Parallels macOS VM. For local Chrome, choose the
422
- profile with `browser.defaultProfile`; `chrome.browserProfile` is passed to
423
- `chrome-node` hosts.
424
-
425
- ```bash
426
- fengming googlemeet join https://meet.google.com/abc-defg-hij --transport chrome
427
- fengming googlemeet join https://meet.google.com/abc-defg-hij --transport chrome-node
428
- ```
429
-
430
- Route Chrome microphone and speaker audio through the local FengMing audio
431
- bridge. If `BlackHole 2ch` is not installed, the join fails with a setup error
432
- instead of silently joining without an audio path.
433
-
434
- ### Twilio
435
-
436
- Twilio transport is a strict dial plan delegated to the Voice Call plugin. It
437
- does not parse Meet pages for phone numbers.
438
-
439
- Use this when Chrome participation is not available or you want a phone dial-in
440
- fallback. Google Meet must expose a phone dial-in number and PIN for the
441
- meeting; FengMing does not discover those from the Meet page.
442
-
443
- Enable the Voice Call plugin on the Gateway host, not on the Chrome node:
444
-
445
- ```json5
446
- {
447
- plugins: {
448
- allow: ["google-meet", "voice-call", "google"],
449
- entries: {
450
- "google-meet": {
451
- enabled: true,
452
- config: {
453
- defaultTransport: "chrome-node",
454
- // or set "twilio" if Twilio should be the default
455
- },
456
- },
457
- "voice-call": {
458
- enabled: true,
459
- config: {
460
- provider: "twilio",
461
- inboundPolicy: "allowlist",
462
- realtime: {
463
- enabled: true,
464
- provider: "google",
465
- instructions: "Join this Google Meet as an FengMing agent. Be brief.",
466
- toolPolicy: "safe-read-only",
467
- providers: {
468
- google: {
469
- silenceDurationMs: 500,
470
- startSensitivity: "high",
471
- },
472
- },
473
- },
474
- },
475
- },
476
- google: {
477
- enabled: true,
478
- },
479
- },
480
- },
481
- }
482
- ```
483
-
484
- Provide Twilio credentials through environment or config. Environment keeps
485
- secrets out of `fengming.json`:
486
-
487
- ```bash
488
- export TWILIO_ACCOUNT_SID=AC...
489
- export TWILIO_AUTH_TOKEN=...
490
- export TWILIO_FROM_NUMBER=+15550001234
491
- export GEMINI_API_KEY=...
492
- ```
493
-
494
- Use `realtime.provider: "openai"` with the OpenAI provider plugin and
495
- `OPENAI_API_KEY` instead if that is your realtime voice provider.
496
-
497
- Restart or reload the Gateway after enabling `voice-call`; plugin config changes
498
- do not appear in an already running Gateway process until it reloads.
499
-
500
- Then verify:
501
-
502
- ```bash
503
- fengming config validate
504
- fengming plugins list | grep -E 'google-meet|voice-call'
505
- fengming googlemeet setup
506
- ```
507
-
508
- When Twilio delegation is wired, `googlemeet setup` includes successful
509
- `twilio-voice-call-plugin`, `twilio-voice-call-credentials`, and
510
- `twilio-voice-call-webhook` checks.
511
-
512
- ```bash
513
- fengming googlemeet join https://meet.google.com/abc-defg-hij \
514
- --transport twilio \
515
- --dial-in-number +15551234567 \
516
- --pin 123456
517
- ```
518
-
519
- Use `--dtmf-sequence` when the meeting needs a custom sequence:
520
-
521
- ```bash
522
- fengming googlemeet join https://meet.google.com/abc-defg-hij \
523
- --transport twilio \
524
- --dial-in-number +15551234567 \
525
- --dtmf-sequence ww123456#
526
- ```
527
-
528
- ## OAuth and preflight
529
-
530
- OAuth is optional for creating a Meet link because `googlemeet create` can fall
531
- back to browser automation. Configure OAuth when you want official API create,
532
- space resolution, or Meet Media API preflight checks.
533
-
534
- Google Meet API access uses user OAuth: create a Google Cloud OAuth client,
535
- request the required scopes, authorize a Google account, then store the
536
- resulting refresh token in the Google Meet plugin config or provide the
537
- `FENGMING_GOOGLE_MEET_*` environment variables.
538
-
539
- OAuth does not replace the Chrome join path. Chrome and Chrome-node transports
540
- still join through a signed-in Chrome profile, BlackHole/SoX, and a connected
541
- node when you use browser participation. OAuth is only for the official Google
542
- Meet API path: create meeting spaces, resolve spaces, and run Meet Media API
543
- preflight checks.
544
-
545
- ### Create Google credentials
546
-
547
- In Google Cloud Console:
548
-
549
- 1. Create or select a Google Cloud project.
550
- 2. Enable **Google Meet REST API** for that project.
551
- 3. Configure the OAuth consent screen.
552
- - **Internal** is simplest for a Google Workspace organization.
553
- - **External** works for personal/test setups; while the app is in Testing,
554
- add each Google account that will authorize the app as a test user.
555
- 4. Add the scopes FengMing requests:
556
- - `https://www.googleapis.com/auth/meetings.space.created`
557
- - `https://www.googleapis.com/auth/meetings.space.readonly`
558
- - `https://www.googleapis.com/auth/meetings.space.settings`
559
- - `https://www.googleapis.com/auth/meetings.conference.media.readonly`
560
- 5. Create an OAuth client ID.
561
- - Application type: **Web application**.
562
- - Authorized redirect URI:
563
-
564
- ```text
565
- http://localhost:8085/oauth2callback
566
- ```
567
-
568
- 6. Copy the client ID and client secret.
569
-
570
- `meetings.space.created` is required by Google Meet `spaces.create`.
571
- `meetings.space.readonly` lets FengMing resolve Meet URLs/codes to spaces.
572
- `meetings.space.settings` lets FengMing pass `SpaceConfig` settings such as
573
- `accessType` during API room creation.
574
- `meetings.conference.media.readonly` is for Meet Media API preflight and media
575
- work; Google may require Developer Preview enrollment for actual Media API use.
576
- If you only need browser-based Chrome joins, skip OAuth entirely.
577
-
578
- ### Mint the refresh token
579
-
580
- Configure `oauth.clientId` and optionally `oauth.clientSecret`, or pass them as
581
- environment variables, then run:
582
-
583
- ```bash
584
- fengming googlemeet auth login --json
585
- ```
586
-
587
- The command prints an `oauth` config block with a refresh token. It uses PKCE,
588
- localhost callback on `http://localhost:8085/oauth2callback`, and a manual
589
- copy/paste flow with `--manual`.
590
-
591
- Examples:
592
-
593
- ```bash
594
- FENGMING_GOOGLE_MEET_CLIENT_ID="your-client-id" \
595
- FENGMING_GOOGLE_MEET_CLIENT_SECRET="your-client-secret" \
596
- fengming googlemeet auth login --json
597
- ```
598
-
599
- Use manual mode when the browser cannot reach the local callback:
600
-
601
- ```bash
602
- FENGMING_GOOGLE_MEET_CLIENT_ID="your-client-id" \
603
- FENGMING_GOOGLE_MEET_CLIENT_SECRET="your-client-secret" \
604
- fengming googlemeet auth login --json --manual
605
- ```
606
-
607
- The JSON output includes:
608
-
609
- ```json
610
- {
611
- "oauth": {
612
- "clientId": "your-client-id",
613
- "clientSecret": "your-client-secret",
614
- "refreshToken": "refresh-token",
615
- "accessToken": "access-token",
616
- "expiresAt": 1770000000000
617
- },
618
- "scope": "..."
619
- }
620
- ```
621
-
622
- Store the `oauth` object under the Google Meet plugin config:
623
-
624
- ```json5
625
- {
626
- plugins: {
627
- entries: {
628
- "google-meet": {
629
- enabled: true,
630
- config: {
631
- oauth: {
632
- clientId: "your-client-id",
633
- clientSecret: "your-client-secret",
634
- refreshToken: "refresh-token",
635
- },
636
- },
637
- },
638
- },
639
- },
640
- }
641
- ```
642
-
643
- Prefer environment variables when you do not want the refresh token in config.
644
- If both config and environment values are present, the plugin resolves config
645
- first and then environment fallback.
646
-
647
- The OAuth consent includes Meet space creation, Meet space read access, and Meet
648
- conference media read access. If you authenticated before meeting creation
649
- support existed, rerun `fengming googlemeet auth login --json` so the refresh
650
- token has the `meetings.space.created` scope.
651
-
652
- ### Verify OAuth with doctor
653
-
654
- Run the OAuth doctor when you want a fast, non-secret health check:
655
-
656
- ```bash
657
- fengming googlemeet doctor --oauth --json
658
- ```
659
-
660
- This does not load the Chrome runtime or require a connected Chrome node. It
661
- checks that OAuth config exists and that the refresh token can mint an access
662
- token. The JSON report includes only status fields such as `ok`, `configured`,
663
- `tokenSource`, `expiresAt`, and check messages; it does not print the access
664
- token, refresh token, or client secret.
665
-
666
- Common results:
667
-
668
- | Check | Meaning |
669
- | -------------------- | --------------------------------------------------------------------------------------- |
670
- | `oauth-config` | `oauth.clientId` plus `oauth.refreshToken`, or a cached access token, is present. |
671
- | `oauth-token` | The cached access token is still valid, or the refresh token minted a new access token. |
672
- | `meet-spaces-get` | Optional `--meeting` check resolved an existing Meet space. |
673
- | `meet-spaces-create` | Optional `--create-space` check created a new Meet space. |
674
-
675
- To prove Google Meet API enablement and `spaces.create` scope as well, run the
676
- side-effecting create check:
677
-
678
- ```bash
679
- fengming googlemeet doctor --oauth --create-space --json
680
- fengming googlemeet create --no-join --json
681
- ```
682
-
683
- `--create-space` creates a throwaway Meet URL. Use it when you need to confirm
684
- that the Google Cloud project has the Meet API enabled and that the authorized
685
- account has the `meetings.space.created` scope.
686
-
687
- To prove read access for an existing meeting space:
688
-
689
- ```bash
690
- fengming googlemeet doctor --oauth --meeting https://meet.google.com/abc-defg-hij --json
691
- fengming googlemeet resolve-space --meeting https://meet.google.com/abc-defg-hij
692
- ```
693
-
694
- `doctor --oauth --meeting` and `resolve-space` prove read access to an existing
695
- space that the authorized Google account can access. A `403` from these checks
696
- usually means the Google Meet REST API is disabled, the consented refresh token
697
- is missing the required scope, or the Google account cannot access that Meet
698
- space. A refresh-token error means rerun `fengming googlemeet auth login
699
- --json` and store the new `oauth` block.
700
-
701
- No OAuth credentials are needed for the browser fallback. In that mode, Google
702
- auth comes from the signed-in Chrome profile on the selected node, not from
703
- FengMing config.
704
-
705
- These environment variables are accepted as fallbacks:
706
-
707
- - `FENGMING_GOOGLE_MEET_CLIENT_ID` or `GOOGLE_MEET_CLIENT_ID`
708
- - `FENGMING_GOOGLE_MEET_CLIENT_SECRET` or `GOOGLE_MEET_CLIENT_SECRET`
709
- - `FENGMING_GOOGLE_MEET_REFRESH_TOKEN` or `GOOGLE_MEET_REFRESH_TOKEN`
710
- - `FENGMING_GOOGLE_MEET_ACCESS_TOKEN` or `GOOGLE_MEET_ACCESS_TOKEN`
711
- - `FENGMING_GOOGLE_MEET_ACCESS_TOKEN_EXPIRES_AT` or
712
- `GOOGLE_MEET_ACCESS_TOKEN_EXPIRES_AT`
713
- - `FENGMING_GOOGLE_MEET_DEFAULT_MEETING` or `GOOGLE_MEET_DEFAULT_MEETING`
714
- - `FENGMING_GOOGLE_MEET_PREVIEW_ACK` or `GOOGLE_MEET_PREVIEW_ACK`
715
-
716
- Resolve a Meet URL, code, or `spaces/{id}` through `spaces.get`:
717
-
718
- ```bash
719
- fengming googlemeet resolve-space --meeting https://meet.google.com/abc-defg-hij
720
- ```
721
-
722
- Run preflight before media work:
723
-
724
- ```bash
725
- fengming googlemeet preflight --meeting https://meet.google.com/abc-defg-hij
726
- ```
727
-
728
- List meeting artifacts and attendance after Meet has created conference records:
729
-
730
- ```bash
731
- fengming googlemeet artifacts --meeting https://meet.google.com/abc-defg-hij
732
- fengming googlemeet attendance --meeting https://meet.google.com/abc-defg-hij
733
- fengming googlemeet export --meeting https://meet.google.com/abc-defg-hij --output ./meet-export
734
- ```
735
-
736
- With `--meeting`, `artifacts` and `attendance` use the latest conference record
737
- by default. Pass `--all-conference-records` when you want every retained record
738
- for that meeting.
739
-
740
- Calendar lookup can resolve the meeting URL from Google Calendar before reading
741
- Meet artifacts:
742
-
743
- ```bash
744
- fengming googlemeet latest --today
745
- fengming googlemeet calendar-events --today --json
746
- fengming googlemeet artifacts --event "Weekly sync"
747
- fengming googlemeet attendance --today --format csv --output attendance.csv
748
- ```
749
-
750
- `--today` searches today's `primary` calendar for a Calendar event with a
751
- Google Meet link. Use `--event <query>` to search matching event text, and
752
- `--calendar <id>` for a non-primary calendar. Calendar lookup requires a fresh
753
- OAuth login that includes the Calendar events readonly scope.
754
- `calendar-events` previews the matching Meet events and marks the event that
755
- `latest`, `artifacts`, `attendance`, or `export` will choose.
756
-
757
- If you already know the conference record id, address it directly:
758
-
759
- ```bash
760
- fengming googlemeet latest --meeting https://meet.google.com/abc-defg-hij
761
- fengming googlemeet artifacts --conference-record conferenceRecords/abc123 --json
762
- fengming googlemeet attendance --conference-record conferenceRecords/abc123 --json
763
- ```
764
-
765
- End an active conference for an API-created space when you want to close the
766
- room after the call:
767
-
768
- ```bash
769
- fengming googlemeet end-active-conference https://meet.google.com/abc-defg-hij
770
- ```
771
-
772
- This calls Google Meet `spaces.endActiveConference` and requires OAuth with the
773
- `meetings.space.created` scope for a space the authorized account can manage.
774
- FengMing accepts a Meet URL, meeting code, or `spaces/{id}` input and resolves it
775
- to the API space resource before ending the active conference.
776
- It is separate from `googlemeet leave`: `leave` stops FengMing's local/session
777
- participation, while `end-active-conference` asks Google Meet to end the active
778
- conference for the space.
779
-
780
- Write a readable report:
781
-
782
- ```bash
783
- fengming googlemeet artifacts --conference-record conferenceRecords/abc123 \
784
- --format markdown --output meet-artifacts.md
785
- fengming googlemeet attendance --conference-record conferenceRecords/abc123 \
786
- --format markdown --output meet-attendance.md
787
- fengming googlemeet attendance --conference-record conferenceRecords/abc123 \
788
- --format csv --output meet-attendance.csv
789
- fengming googlemeet export --conference-record conferenceRecords/abc123 \
790
- --include-doc-bodies --zip --output meet-export
791
- fengming googlemeet export --conference-record conferenceRecords/abc123 \
792
- --include-doc-bodies --dry-run
793
- ```
794
-
795
- `artifacts` returns conference record metadata plus participant, recording,
796
- transcript, structured transcript-entry, and smart-note resource metadata when
797
- Google exposes it for the meeting. Use `--no-transcript-entries` to skip
798
- entry lookup for large meetings. `attendance` expands participants into
799
- participant-session rows with first/last seen times, total session duration,
800
- late/early-leave flags, and duplicate participant resources merged by signed-in
801
- user or display name. Pass `--no-merge-duplicates` to keep raw participant
802
- resources separate, `--late-after-minutes` to tune late detection, and
803
- `--early-before-minutes` to tune early-leave detection.
804
-
805
- `export` writes a folder containing `summary.md`, `attendance.csv`,
806
- `transcript.md`, `artifacts.json`, `attendance.json`, and `manifest.json`.
807
- `manifest.json` records the chosen input, export options, conference records,
808
- output files, counts, token source, Calendar event when one was used, and any
809
- partial retrieval warnings. Pass `--zip` to also write a portable archive next
810
- to the folder. Pass `--include-doc-bodies` to export linked transcript and
811
- smart-note Google Docs text through Google Drive `files.export`; this requires a
812
- fresh OAuth login that includes the Drive Meet readonly scope. Without
813
- `--include-doc-bodies`, exports include Meet metadata and structured transcript
814
- entries only. If Google returns a partial artifact failure, such as a smart-note
815
- listing, transcript-entry, or Drive document-body error, the summary and
816
- manifest keep the warning instead of failing the whole export.
817
- Use `--dry-run` to fetch the same artifact/attendance data and print the
818
- manifest JSON without creating the folder or ZIP. That is useful before writing
819
- a large export or when an agent only needs counts, selected records, and
820
- warnings.
821
-
822
- Agents can also create the same bundle through the `google_meet` tool:
823
-
824
- ```json
825
- {
826
- "action": "export",
827
- "conferenceRecord": "conferenceRecords/abc123",
828
- "includeDocumentBodies": true,
829
- "outputDir": "meet-export",
830
- "zip": true
831
- }
832
- ```
833
-
834
- Set `"dryRun": true` to return only the export manifest and skip file writes.
835
-
836
- Agents can also create an API-backed room with an explicit access policy:
837
-
838
- ```json
839
- {
840
- "action": "create",
841
- "transport": "chrome-node",
842
- "mode": "agent",
843
- "accessType": "OPEN"
844
- }
845
- ```
846
-
847
- And they can end the active conference for a known room:
848
-
849
- ```json
850
- {
851
- "action": "end_active_conference",
852
- "meeting": "https://meet.google.com/abc-defg-hij"
853
- }
854
- ```
855
-
856
- For listen-first validation, agents should use `test_listen` before claiming the
857
- meeting is useful:
858
-
859
- ```json
860
- {
861
- "action": "test_listen",
862
- "url": "https://meet.google.com/abc-defg-hij",
863
- "transport": "chrome-node",
864
- "timeoutMs": 30000
865
- }
866
- ```
867
-
868
- Run the guarded live smoke against a real retained meeting:
869
-
870
- ```bash
871
- FENGMING_LIVE_TEST=1 \
872
- FENGMING_GOOGLE_MEET_LIVE_MEETING=https://meet.google.com/abc-defg-hij \
873
- pnpm test:live -- extensions/google-meet/google-meet.live.test.ts
874
- ```
875
-
876
- Run the live listen-first browser probe against a meeting where someone will
877
- speak with Meet captions available:
878
-
879
- ```bash
880
- fengming googlemeet setup --transport chrome-node --mode transcribe
881
- fengming googlemeet test-listen https://meet.google.com/abc-defg-hij --transport chrome-node --timeout-ms 30000
882
- ```
883
-
884
- Live smoke environment:
885
-
886
- - `FENGMING_LIVE_TEST=1` enables guarded live tests.
887
- - `FENGMING_GOOGLE_MEET_LIVE_MEETING` points at a retained Meet URL, code, or
888
- `spaces/{id}`.
889
- - `FENGMING_GOOGLE_MEET_CLIENT_ID` or `GOOGLE_MEET_CLIENT_ID` provides the OAuth
890
- client id.
891
- - `FENGMING_GOOGLE_MEET_REFRESH_TOKEN` or `GOOGLE_MEET_REFRESH_TOKEN` provides
892
- the refresh token.
893
- - Optional: `FENGMING_GOOGLE_MEET_CLIENT_SECRET`,
894
- `FENGMING_GOOGLE_MEET_ACCESS_TOKEN`, and
895
- `FENGMING_GOOGLE_MEET_ACCESS_TOKEN_EXPIRES_AT` use the same fallback names
896
- without the `FENGMING_` prefix.
897
-
898
- The base artifact/attendance live smoke needs
899
- `https://www.googleapis.com/auth/meetings.space.readonly` and
900
- `https://www.googleapis.com/auth/meetings.conference.media.readonly`. Calendar
901
- lookup needs `https://www.googleapis.com/auth/calendar.events.readonly`. Drive
902
- document-body export needs
903
- `https://www.googleapis.com/auth/drive.meet.readonly`.
904
-
905
- Create a fresh Meet space:
906
-
907
- ```bash
908
- fengming googlemeet create
909
- ```
910
-
911
- The command prints the new `meeting uri`, source, and join session. With OAuth
912
- credentials it uses the official Google Meet API. Without OAuth credentials it
913
- uses the pinned Chrome node's signed-in browser profile as a fallback. Agents can
914
- use the `google_meet` tool with `action: "create"` to create and join in one
915
- step. For URL-only creation, pass `"join": false`.
916
-
917
- Example JSON output from the browser fallback:
918
-
919
- ```json
920
- {
921
- "source": "browser",
922
- "meetingUri": "https://meet.google.com/abc-defg-hij",
923
- "joined": true,
924
- "browser": {
925
- "nodeId": "ba0f4e4bc...",
926
- "targetId": "tab-1"
927
- },
928
- "join": {
929
- "session": {
930
- "id": "meet_...",
931
- "url": "https://meet.google.com/abc-defg-hij"
932
- }
933
- }
934
- }
935
- ```
936
-
937
- If the browser fallback hits Google login or a Meet permission blocker before it
938
- can create the URL, the Gateway method returns a failed response and the
939
- `google_meet` tool returns structured details instead of a plain string:
940
-
941
- ```json
942
- {
943
- "source": "browser",
944
- "error": "google-login-required: Sign in to Google in the FengMing browser profile, then retry meeting creation.",
945
- "manualActionRequired": true,
946
- "manualActionReason": "google-login-required",
947
- "manualActionMessage": "Sign in to Google in the FengMing browser profile, then retry meeting creation.",
948
- "browser": {
949
- "nodeId": "ba0f4e4bc...",
950
- "targetId": "tab-1",
951
- "browserUrl": "https://accounts.google.com/signin",
952
- "browserTitle": "Sign in - Google Accounts"
953
- }
954
- }
955
- ```
956
-
957
- When an agent sees `manualActionRequired: true`, it should report the
958
- `manualActionMessage` plus the browser node/tab context and stop opening new
959
- Meet tabs until the operator completes the browser step.
960
-
961
- Example JSON output from API create:
962
-
963
- ```json
964
- {
965
- "source": "api",
966
- "meetingUri": "https://meet.google.com/abc-defg-hij",
967
- "joined": true,
968
- "space": {
969
- "name": "spaces/abc-defg-hij",
970
- "meetingCode": "abc-defg-hij",
971
- "meetingUri": "https://meet.google.com/abc-defg-hij"
972
- },
973
- "join": {
974
- "session": {
975
- "id": "meet_...",
976
- "url": "https://meet.google.com/abc-defg-hij"
977
- }
978
- }
979
- }
980
- ```
981
-
982
- Creating a Meet joins by default. The Chrome or Chrome-node transport still
983
- needs a signed-in Google Chrome profile to join through the browser. If the
984
- profile is signed out, FengMing reports `manualActionRequired: true` or a
985
- browser fallback error and asks the operator to finish Google login before
986
- retrying.
987
-
988
- Set `preview.enrollmentAcknowledged: true` only after confirming your Cloud
989
- project, OAuth principal, and meeting participants are enrolled in the Google
990
- Workspace Developer Preview Program for Meet media APIs.
991
-
992
- ## Config
993
-
994
- The common Chrome agent path only needs the plugin enabled, BlackHole, SoX, a
995
- realtime transcription provider key, and a configured FengMing TTS provider.
996
- OpenAI is the default transcription provider; set `realtime.voiceProvider` to
997
- `"google"` and `realtime.model` to use Google Gemini Live for `bidi` mode
998
- without changing the default agent-mode transcription provider:
999
-
1000
- ```bash
1001
- brew install blackhole-2ch sox
1002
- export OPENAI_API_KEY=sk-...
1003
- # or
1004
- export GEMINI_API_KEY=...
1005
- ```
1006
-
1007
- Set the plugin config under `plugins.entries.google-meet.config`:
1008
-
1009
- ```json5
1010
- {
1011
- plugins: {
1012
- entries: {
1013
- "google-meet": {
1014
- enabled: true,
1015
- config: {},
1016
- },
1017
- },
1018
- },
1019
- }
1020
- ```
1021
-
1022
- Defaults:
1023
-
1024
- - `defaultTransport: "chrome"`
1025
- - `defaultMode: "agent"` (`"realtime"` is accepted only as a legacy
1026
- compatibility alias for `"agent"`; new tool calls should say `"agent"`)
1027
- - `chromeNode.node`: optional node id/name/IP for `chrome-node`
1028
- - `chrome.audioBackend: "blackhole-2ch"`
1029
- - `chrome.guestName: "FengMing Agent"`: name used on the signed-out Meet guest
1030
- screen
1031
- - `chrome.autoJoin: true`: best-effort guest-name fill and Join Now click
1032
- through FengMing browser automation on `chrome-node`
1033
- - `chrome.reuseExistingTab: true`: activate an existing Meet tab instead of
1034
- opening duplicates
1035
- - `chrome.waitForInCallMs: 20000`: wait for the Meet tab to report in-call
1036
- before the talk-back intro is triggered
1037
- - `chrome.audioFormat: "pcm16-24khz"`: command-pair audio format. Use
1038
- `"g711-ulaw-8khz"` only for legacy/custom command pairs that still emit
1039
- telephony audio.
1040
- - `chrome.audioBufferBytes: 4096`: SoX processing buffer for generated Chrome
1041
- command-pair audio commands. This is half of SoX's default 8192-byte buffer,
1042
- reducing default pipe latency while leaving room to raise it on busy hosts.
1043
- Values below SoX's minimum are clamped to 17 bytes.
1044
- - `chrome.audioInputCommand`: SoX command reading from CoreAudio `BlackHole 2ch`
1045
- and writing audio in `chrome.audioFormat`
1046
- - `chrome.audioOutputCommand`: SoX command reading audio in `chrome.audioFormat`
1047
- and writing to CoreAudio `BlackHole 2ch`
1048
- - `chrome.bargeInInputCommand`: optional local microphone command that writes
1049
- signed 16-bit little-endian mono PCM for human barge-in detection while
1050
- assistant playback is active. This currently applies to the Gateway-hosted
1051
- `chrome` command-pair bridge.
1052
- - `chrome.bargeInRmsThreshold: 650`: RMS level that counts as a human
1053
- interruption on `chrome.bargeInInputCommand`
1054
- - `chrome.bargeInPeakThreshold: 2500`: peak level that counts as a human
1055
- interruption on `chrome.bargeInInputCommand`
1056
- - `chrome.bargeInCooldownMs: 900`: minimum delay between repeated human
1057
- interruption clears
1058
- - `mode: "agent"`: default talk-back mode. Participant speech is transcribed by
1059
- the configured realtime transcription provider, sent to the configured
1060
- FengMing agent in a per-meeting sub-agent session, and spoken back through the
1061
- normal FengMing TTS runtime.
1062
- - `mode: "bidi"`: fallback direct bidirectional realtime model mode. The
1063
- realtime voice provider answers participant speech directly and may call
1064
- `fengming_agent_consult` for deeper/tool-backed answers.
1065
- - `mode: "transcribe"`: observe-only mode without the talk-back bridge.
1066
- - `realtime.provider: "openai"`: compatibility fallback used when the scoped
1067
- provider fields below are unset.
1068
- - `realtime.transcriptionProvider: "openai"`: provider id used by `agent` mode
1069
- for realtime transcription.
1070
- - `realtime.voiceProvider`: provider id used by `bidi` mode for direct realtime
1071
- voice. Set this to `"google"` to use Gemini Live while keeping agent-mode
1072
- transcription on OpenAI.
1073
- - `realtime.toolPolicy: "safe-read-only"`
1074
- - `realtime.instructions`: brief spoken replies, with
1075
- `fengming_agent_consult` for deeper answers
1076
- - `realtime.introMessage`: short spoken readiness check when the realtime bridge
1077
- connects; set it to `""` to join silently
1078
- - `realtime.agentId`: optional FengMing agent id for
1079
- `fengming_agent_consult`; defaults to `main`
1080
-
1081
- Optional overrides:
1082
-
1083
- ```json5
1084
- {
1085
- defaults: {
1086
- meeting: "https://meet.google.com/abc-defg-hij",
1087
- },
1088
- browser: {
1089
- defaultProfile: "fengming",
1090
- },
1091
- chrome: {
1092
- guestName: "FengMing Agent",
1093
- waitForInCallMs: 30000,
1094
- bargeInInputCommand: [
1095
- "sox",
1096
- "-q",
1097
- "-t",
1098
- "coreaudio",
1099
- "External Microphone",
1100
- "-r",
1101
- "24000",
1102
- "-c",
1103
- "1",
1104
- "-b",
1105
- "16",
1106
- "-e",
1107
- "signed-integer",
1108
- "-t",
1109
- "raw",
1110
- "-",
1111
- ],
1112
- },
1113
- chromeNode: {
1114
- node: "parallels-macos",
1115
- },
1116
- defaultMode: "agent",
1117
- realtime: {
1118
- provider: "openai",
1119
- transcriptionProvider: "openai",
1120
- voiceProvider: "google",
1121
- model: "gemini-2.5-flash-native-audio-preview-12-2025",
1122
- agentId: "jay",
1123
- toolPolicy: "owner",
1124
- introMessage: "Say exactly: I'm here.",
1125
- providers: {
1126
- google: {
1127
- speakerVoice: "Kore",
1128
- },
1129
- },
1130
- },
1131
- }
1132
- ```
1133
-
1134
- ElevenLabs for both agent-mode listening and speaking:
1135
-
1136
- ```json5
1137
- {
1138
- messages: {
1139
- tts: {
1140
- provider: "elevenlabs",
1141
- providers: {
1142
- elevenlabs: {
1143
- modelId: "eleven_v3",
1144
- speakerVoiceId: "pMsXgVXv3BLzUgSXRplE",
1145
- },
1146
- },
1147
- },
1148
- },
1149
- plugins: {
1150
- entries: {
1151
- "google-meet": {
1152
- config: {
1153
- realtime: {
1154
- transcriptionProvider: "elevenlabs",
1155
- providers: {
1156
- elevenlabs: {
1157
- modelId: "scribe_v2_realtime",
1158
- audioFormat: "ulaw_8000",
1159
- sampleRate: 8000,
1160
- commitStrategy: "vad",
1161
- },
1162
- },
1163
- },
1164
- },
1165
- },
1166
- },
1167
- },
1168
- }
1169
- ```
1170
-
1171
- The persistent Meet voice comes from
1172
- `messages.tts.providers.elevenlabs.speakerVoiceId`. Agent replies can also use
1173
- per-reply `[[tts:speakerVoiceId=... model=eleven_v3]]` directives when TTS model
1174
- overrides are enabled, but config is the deterministic default for meetings.
1175
- On join, the logs should show `transcriptionProvider=elevenlabs` and each
1176
- spoken reply should log `provider=elevenlabs model=eleven_v3 speakerVoiceId=<voiceId>`.
1177
-
1178
- Twilio-only config:
1179
-
1180
- ```json5
1181
- {
1182
- defaultTransport: "twilio",
1183
- twilio: {
1184
- defaultDialInNumber: "+15551234567",
1185
- defaultPin: "123456",
1186
- },
1187
- voiceCall: {
1188
- gatewayUrl: "ws://127.0.0.1:18789",
1189
- },
1190
- }
1191
- ```
1192
-
1193
- `voiceCall.enabled` defaults to `true`; with Twilio transport it delegates the
1194
- actual PSTN call, DTMF, and intro greeting to the Voice Call plugin. Voice Call
1195
- plays the DTMF sequence before opening the realtime media stream, then uses the
1196
- saved intro text as the initial realtime greeting. If `voice-call` is not
1197
- enabled, Google Meet can still validate and record the dial plan, but it cannot
1198
- place the Twilio call.
1199
-
1200
- ## Tool
1201
-
1202
- Agents can use the `google_meet` tool:
1203
-
1204
- ```json
1205
- {
1206
- "action": "join",
1207
- "url": "https://meet.google.com/abc-defg-hij",
1208
- "transport": "chrome-node",
1209
- "mode": "agent"
1210
- }
1211
- ```
1212
-
1213
- Use `transport: "chrome"` when Chrome runs on the Gateway host. Use
1214
- `transport: "chrome-node"` when Chrome runs on a paired node such as a Parallels
1215
- VM. In both cases the model providers and `fengming_agent_consult` run on the
1216
- Gateway host, so model credentials stay there. With the default `mode: "agent"`,
1217
- the realtime transcription provider handles listening, the configured FengMing
1218
- agent produces the answer, and regular FengMing TTS speaks it into Meet. Use
1219
- `mode: "bidi"` when you want the realtime voice model to answer directly.
1220
- Raw `mode: "realtime"` remains accepted as a legacy compatibility alias for
1221
- `mode: "agent"`, but it is no longer advertised in the agent tool schema.
1222
- Agent-mode logs include the resolved transcription provider/model at bridge
1223
- startup and the TTS provider, model, voice, output format, and sample rate after
1224
- each synthesized reply.
1225
-
1226
- Use `action: "status"` to list active sessions or inspect a session ID. Use
1227
- `action: "speak"` with `sessionId` and `message` to make the realtime agent
1228
- speak immediately. Use `action: "test_speech"` to create or reuse the session,
1229
- trigger a known phrase, and return `inCall` health when the Chrome host can
1230
- report it. `test_speech` always forces `mode: "agent"` and fails if asked to
1231
- run in `mode: "transcribe"` because observe-only sessions intentionally cannot
1232
- emit speech. Its `speechOutputVerified` result is based on realtime audio output
1233
- bytes increasing during this test call, so a reused session with older audio
1234
- does not count as a fresh successful speech check. Use `action: "leave"` to mark
1235
- a session ended.
1236
-
1237
- `status` includes Chrome health when available:
1238
-
1239
- - `inCall`: Chrome appears to be inside the Meet call
1240
- - `micMuted`: best-effort Meet microphone state
1241
- - `manualActionRequired` / `manualActionReason` / `manualActionMessage`: the
1242
- browser profile needs manual login, Meet host admission, permissions, or
1243
- browser-control repair before speech can work
1244
- - `speechReady` / `speechBlockedReason` / `speechBlockedMessage`: whether
1245
- managed Chrome speech is allowed now. `speechReady: false` means FengMing did
1246
- not send the intro/test phrase into the audio bridge.
1247
- - `providerConnected` / `realtimeReady`: realtime voice bridge state
1248
- - `lastInputAt` / `lastOutputAt`: last audio seen from or sent to the bridge
1249
- - `audioOutputRouted` / `audioOutputDeviceLabel`: whether the Meet tab's media
1250
- output was actively routed to the BlackHole device used by the bridge
1251
- - `lastSuppressedInputAt` / `suppressedInputBytes`: loopback input ignored while
1252
- assistant playback is active
1253
-
1254
- ```json
1255
- {
1256
- "action": "speak",
1257
- "sessionId": "meet_...",
1258
- "message": "Say exactly: I'm here and listening."
1259
- }
1260
- ```
1261
-
1262
- ## Agent and bidi modes
1263
-
1264
- Chrome `agent` mode is optimized for "my agent is in the meeting" behavior. The
1265
- realtime transcription provider hears the meeting audio, final participant
1266
- transcripts are routed through the configured FengMing agent, and the answer is
1267
- spoken through the normal FengMing TTS runtime. Set `mode: "bidi"` when you want
1268
- the realtime voice model to answer directly.
1269
- Nearby final transcript fragments are coalesced before the consult so one spoken
1270
- turn does not produce several stale partial answers. Realtime input is also
1271
- suppressed while queued assistant audio is still playing,
1272
- and recent assistant-like transcript echoes are ignored before the agent consult
1273
- so BlackHole loopback does not make the agent answer its own speech.
1274
-
1275
- | Mode | Who decides the answer | Speech output path | Use when |
1276
- | ------- | ----------------------------- | -------------------------------------- | ----------------------------------------------------- |
1277
- | `agent` | The configured FengMing agent | Normal FengMing TTS runtime | You want "my agent is in the meeting" behavior |
1278
- | `bidi` | The realtime voice model | Realtime voice provider audio response | You want the lowest-latency conversational voice loop |
1279
-
1280
- In `bidi` mode, when the realtime model needs deeper reasoning, current
1281
- information, or normal FengMing tools, it can call `fengming_agent_consult`.
1282
-
1283
- The consult tool runs the regular FengMing agent behind the scenes with recent
1284
- meeting transcript context and returns a concise spoken answer. In `agent` mode,
1285
- FengMing sends that answer directly to the TTS runtime; in `bidi` mode, the
1286
- realtime voice model can speak the consult result back into the meeting. It uses
1287
- the same shared consult machinery as Voice Call.
1288
-
1289
- By default, consults run against the `main` agent. Set `realtime.agentId` when a
1290
- Meet lane should consult a dedicated FengMing agent workspace, model defaults,
1291
- tool policy, memory, and session history.
1292
-
1293
- Agent-mode consults use a per-meeting `agent:<id>:subagent:google-meet:<session>`
1294
- session key so follow-up questions keep meeting context while inheriting normal
1295
- agent policy from the configured agent.
1296
-
1297
- `realtime.toolPolicy` controls the consult run:
1298
-
1299
- - `safe-read-only`: expose the consult tool and limit the regular agent to
1300
- `read`, `web_search`, `web_fetch`, `x_search`, `memory_search`, and
1301
- `memory_get`.
1302
- - `owner`: expose the consult tool and let the regular agent use the normal
1303
- agent tool policy.
1304
- - `none`: do not expose the consult tool to the realtime voice model.
1305
-
1306
- The consult session key is scoped per Meet session, so follow-up consult calls
1307
- can reuse prior consult context during the same meeting.
1308
-
1309
- To force a spoken readiness check after Chrome has fully joined the call:
1310
-
1311
- ```bash
1312
- fengming googlemeet speak meet_... "Say exactly: I'm here and listening."
1313
- ```
1314
-
1315
- For the full join-and-speak smoke:
1316
-
1317
- ```bash
1318
- fengming googlemeet test-speech https://meet.google.com/abc-defg-hij \
1319
- --transport chrome-node \
1320
- --message "Say exactly: I'm here and listening."
1321
- ```
1322
-
1323
- ## Live test checklist
1324
-
1325
- Use this sequence before handing a meeting to an unattended agent:
1326
-
1327
- ```bash
1328
- fengming googlemeet setup
1329
- fengming nodes status
1330
- fengming googlemeet test-speech https://meet.google.com/abc-defg-hij \
1331
- --transport chrome-node \
1332
- --message "Say exactly: Google Meet speech test complete."
1333
- ```
1334
-
1335
- Expected Chrome-node state:
1336
-
1337
- - `googlemeet setup` is all green.
1338
- - `googlemeet setup` includes `chrome-node-connected` when Chrome-node is the
1339
- default transport or a node is pinned.
1340
- - `nodes status` shows the selected node connected.
1341
- - The selected node advertises both `googlemeet.chrome` and `browser.proxy`.
1342
- - The Meet tab joins the call and `test-speech` returns Chrome health with
1343
- `inCall: true`.
1344
-
1345
- For a remote Chrome host such as a Parallels macOS VM, this is the shortest
1346
- safe check after updating the Gateway or the VM:
1347
-
1348
- ```bash
1349
- fengming googlemeet setup
1350
- fengming nodes status --connected
1351
- fengming nodes invoke \
1352
- --node parallels-macos \
1353
- --command googlemeet.chrome \
1354
- --params '{"action":"setup"}'
1355
- ```
1356
-
1357
- That proves the Gateway plugin is loaded, the VM node is connected with the
1358
- current token, and the Meet audio bridge is available before an agent opens a
1359
- real meeting tab.
1360
-
1361
- For a Twilio smoke, use a meeting that exposes phone dial-in details:
1362
-
1363
- ```bash
1364
- fengming googlemeet setup
1365
- fengming googlemeet join https://meet.google.com/abc-defg-hij \
1366
- --transport twilio \
1367
- --dial-in-number +15551234567 \
1368
- --pin 123456
1369
- ```
1370
-
1371
- Expected Twilio state:
1372
-
1373
- - `googlemeet setup` includes green `twilio-voice-call-plugin`,
1374
- `twilio-voice-call-credentials`, and `twilio-voice-call-webhook` checks.
1375
- - `voicecall` is available in the CLI after Gateway reload.
1376
- - The returned session has `transport: "twilio"` and a `twilio.voiceCallId`.
1377
- - `fengming logs --follow` shows DTMF TwiML served before realtime TwiML, then a
1378
- realtime bridge with the initial greeting queued.
1379
- - `googlemeet leave <sessionId>` hangs up the delegated voice call.
1380
-
1381
- ## Troubleshooting
1382
-
1383
- ### Agent cannot see the Google Meet tool
1384
-
1385
- Confirm the plugin is enabled in the Gateway config and reload the Gateway:
1386
-
1387
- ```bash
1388
- fengming plugins list | grep google-meet
1389
- fengming googlemeet setup
1390
- ```
1391
-
1392
- If you just edited `plugins.entries.google-meet`, restart or reload the Gateway.
1393
- The running agent only sees plugin tools registered by the current Gateway
1394
- process.
1395
-
1396
- On non-macOS Gateway hosts, the agent-facing `google_meet` tool stays visible,
1397
- but local Chrome talk-back actions are blocked before they hit the audio bridge.
1398
- Local Chrome talk-back audio currently depends on macOS `BlackHole 2ch`, so
1399
- Linux agents should use `mode: "transcribe"`, Twilio dial-in, or a macOS
1400
- `chrome-node` host instead of the default local Chrome agent path.
1401
-
1402
- ### No connected Google Meet-capable node
1403
-
1404
- On the node host, run:
1405
-
1406
- ```bash
1407
- fengming plugins enable google-meet
1408
- fengming plugins enable browser
1409
- FENGMING_ALLOW_INSECURE_PRIVATE_WS=1 \
1410
- fengming node run --host <gateway-lan-ip> --port 18789 --display-name parallels-macos
1411
- ```
1412
-
1413
- On the Gateway host, approve the node and verify commands:
1414
-
1415
- ```bash
1416
- fengming devices list
1417
- fengming devices approve <requestId>
1418
- fengming nodes status
1419
- ```
1420
-
1421
- The node must be connected and list `googlemeet.chrome` plus `browser.proxy`.
1422
- The Gateway config must allow those node commands:
1423
-
1424
- ```json5
1425
- {
1426
- gateway: {
1427
- nodes: {
1428
- allowCommands: ["browser.proxy", "googlemeet.chrome"],
1429
- },
1430
- },
1431
- }
1432
- ```
1433
-
1434
- If `googlemeet setup` fails `chrome-node-connected` or the Gateway log reports
1435
- `gateway token mismatch`, reinstall or restart the node with the current Gateway
1436
- token. For a LAN Gateway this usually means:
1437
-
1438
- ```bash
1439
- FENGMING_ALLOW_INSECURE_PRIVATE_WS=1 \
1440
- fengming node install \
1441
- --host <gateway-lan-ip> \
1442
- --port 18789 \
1443
- --display-name parallels-macos \
1444
- --force
1445
- ```
1446
-
1447
- Then reload the node service and re-run:
1448
-
1449
- ```bash
1450
- fengming googlemeet setup
1451
- fengming nodes status --connected
1452
- ```
1453
-
1454
- ### Browser opens but agent cannot join
1455
-
1456
- Run `googlemeet test-listen` for observe-only joins or `googlemeet test-speech`
1457
- for realtime joins, then inspect the returned Chrome health. If either probe
1458
- reports `manualActionRequired: true`, show `manualActionMessage` to the operator
1459
- and stop retrying until the browser action is complete.
1460
-
1461
- Common manual actions:
1462
-
1463
- - Sign in to the Chrome profile.
1464
- - Admit the guest from the Meet host account.
1465
- - Grant Chrome microphone/camera permissions when Chrome's native permission
1466
- prompt appears.
1467
- - Close or repair a stuck Meet permission dialog.
1468
-
1469
- Do not report "not signed in" just because Meet shows "Do you want people to
1470
- hear you in the meeting?" That is Meet's audio-choice interstitial; FengMing
1471
- clicks **Use microphone** through browser automation when available and keeps
1472
- waiting for the real meeting state. For create-only browser fallback, FengMing
1473
- may click **Continue without microphone** because creating the URL does not need
1474
- the realtime audio path.
1475
-
1476
- ### Meeting creation fails
1477
-
1478
- `googlemeet create` first uses the Google Meet API `spaces.create` endpoint
1479
- when OAuth credentials are configured. Without OAuth credentials it falls back
1480
- to the pinned Chrome node browser. Confirm:
1481
-
1482
- - For API creation: `oauth.clientId` and `oauth.refreshToken` are configured,
1483
- or matching `FENGMING_GOOGLE_MEET_*` environment variables are present.
1484
- - For API creation: the refresh token was minted after create support was
1485
- added. Older tokens may be missing the `meetings.space.created` scope; rerun
1486
- `fengming googlemeet auth login --json` and update plugin config.
1487
- - For browser fallback: `defaultTransport: "chrome-node"` and
1488
- `chromeNode.node` point at a connected node with `browser.proxy` and
1489
- `googlemeet.chrome`.
1490
- - For browser fallback: the FengMing Chrome profile on that node is signed in
1491
- to Google and can open `https://meet.google.com/new`.
1492
- - For browser fallback: retries reuse an existing `https://meet.google.com/new`
1493
- or Google account prompt tab before opening a new tab. If an agent times out,
1494
- retry the tool call rather than manually opening another Meet tab.
1495
- - For browser fallback: if the tool returns `manualActionRequired: true`, use
1496
- the returned `browser.nodeId`, `browser.targetId`, `browserUrl`, and
1497
- `manualActionMessage` to guide the operator. Do not retry in a loop until that
1498
- action is complete.
1499
- - For browser fallback: if Meet shows "Do you want people to hear you in the
1500
- meeting?", leave the tab open. FengMing should click **Use microphone** or, for
1501
- create-only fallback, **Continue without microphone** through browser
1502
- automation and continue waiting for the generated Meet URL. If it cannot, the
1503
- error should mention `meet-audio-choice-required`, not `google-login-required`.
1504
-
1505
- ### Agent joins but does not talk
1506
-
1507
- Check the realtime path:
1508
-
1509
- ```bash
1510
- fengming googlemeet setup
1511
- fengming googlemeet doctor
1512
- ```
1513
-
1514
- Use `mode: "agent"` for the normal STT -> FengMing agent -> TTS talk-back path,
1515
- or `mode: "bidi"` for the direct realtime voice fallback. `mode: "transcribe"`
1516
- intentionally does not start the talk-back bridge. For observe-only debugging,
1517
- run `fengming googlemeet status --json <session-id>` after participants speak
1518
- and check `captioning`, `transcriptLines`, and `lastCaptionText`. If `inCall` is
1519
- true but `transcriptLines` stays at `0`, Meet captions may be disabled, no one
1520
- has spoken since the observer was installed, the Meet UI changed, or live
1521
- captions are unavailable for the meeting language/account.
1522
-
1523
- `googlemeet test-speech` always checks the realtime path and reports whether
1524
- bridge output bytes were observed for that invocation. If `speechOutputVerified` is false and
1525
- `speechOutputTimedOut` is true, the realtime provider may have accepted the
1526
- utterance but FengMing did not see new output bytes reach the Chrome audio
1527
- bridge.
1528
-
1529
- Also verify:
1530
-
1531
- - A realtime provider key is available on the Gateway host, such as
1532
- `OPENAI_API_KEY` or `GEMINI_API_KEY`.
1533
- - `BlackHole 2ch` is visible on the Chrome host.
1534
- - `sox` exists on the Chrome host.
1535
- - Meet microphone and speaker are routed through the virtual audio path used by
1536
- FengMing. `doctor` should show `meet output routed: yes` for local Chrome
1537
- realtime joins.
1538
-
1539
- `googlemeet doctor [session-id]` prints the session, node, in-call state,
1540
- manual action reason, realtime provider connection, `realtimeReady`, audio
1541
- input/output activity, last audio timestamps, byte counters, and browser URL.
1542
- Use `googlemeet status [session-id] --json` when you need the raw JSON. Use
1543
- `googlemeet doctor --oauth` when you need to verify Google Meet OAuth refresh
1544
- without exposing tokens; add `--meeting` or `--create-space` when you need a
1545
- Google Meet API proof as well.
1546
-
1547
- If an agent timed out and you can see a Meet tab already open, inspect that tab
1548
- without opening another one:
1549
-
1550
- ```bash
1551
- fengming googlemeet recover-tab
1552
- fengming googlemeet recover-tab https://meet.google.com/abc-defg-hij
1553
- ```
1554
-
1555
- The equivalent tool action is `recover_current_tab`. It focuses and inspects an
1556
- existing Meet tab for the selected transport. With `chrome`, it uses local
1557
- browser control through the Gateway; with `chrome-node`, it uses the configured
1558
- Chrome node. It does not open a new tab or create a new session; it reports the
1559
- current blocker, such as login, admission, permissions, or audio-choice state.
1560
- The CLI command talks to the configured Gateway, so the Gateway must be running;
1561
- `chrome-node` also requires the Chrome node to be connected.
1562
-
1563
- ### Twilio setup checks fail
1564
-
1565
- `twilio-voice-call-plugin` fails when `voice-call` is not allowed or not enabled.
1566
- Add it to `plugins.allow`, enable `plugins.entries.voice-call`, and reload the
1567
- Gateway.
1568
-
1569
- `twilio-voice-call-credentials` fails when the Twilio backend is missing account
1570
- SID, auth token, or caller number. Set these on the Gateway host:
1571
-
1572
- ```bash
1573
- export TWILIO_ACCOUNT_SID=AC...
1574
- export TWILIO_AUTH_TOKEN=...
1575
- export TWILIO_FROM_NUMBER=+15550001234
1576
- ```
1577
-
1578
- `twilio-voice-call-webhook` fails when `voice-call` has no public webhook
1579
- exposure, or when `publicUrl` points at loopback or private network space.
1580
- Set `plugins.entries.voice-call.config.publicUrl` to the public provider URL or
1581
- configure a `voice-call` tunnel/Tailscale exposure.
1582
-
1583
- Loopback and private URLs are not valid for carrier callbacks. Do not use
1584
- `localhost`, `127.0.0.1`, `0.0.0.0`, `10.x`, `172.16.x`-`172.31.x`,
1585
- `192.168.x`, `169.254.x`, `fc00::/7`, or `fd00::/8` as `publicUrl`.
1586
-
1587
- For a stable public URL:
1588
-
1589
- ```json5
1590
- {
1591
- plugins: {
1592
- entries: {
1593
- "voice-call": {
1594
- enabled: true,
1595
- config: {
1596
- provider: "twilio",
1597
- fromNumber: "+15550001234",
1598
- publicUrl: "https://voice.example.com/voice/webhook",
1599
- },
1600
- },
1601
- },
1602
- },
1603
- }
1604
- ```
1605
-
1606
- For local development, use a tunnel or Tailscale exposure instead of a private
1607
- host URL:
1608
-
1609
- ```json5
1610
- {
1611
- plugins: {
1612
- entries: {
1613
- "voice-call": {
1614
- config: {
1615
- tunnel: { provider: "ngrok" },
1616
- // or
1617
- tailscale: { mode: "funnel", path: "/voice/webhook" },
1618
- },
1619
- },
1620
- },
1621
- },
1622
- }
1623
- ```
1624
-
1625
- Then restart or reload the Gateway and run:
1626
-
1627
- ```bash
1628
- fengming googlemeet setup --transport twilio
1629
- fengming voicecall setup
1630
- fengming voicecall smoke
1631
- ```
1632
-
1633
- `voicecall smoke` is readiness-only by default. To dry-run a specific number:
1634
-
1635
- ```bash
1636
- fengming voicecall smoke --to "+15555550123"
1637
- ```
1638
-
1639
- Only add `--yes` when you intentionally want to place a live outbound notify
1640
- call:
1641
-
1642
- ```bash
1643
- fengming voicecall smoke --to "+15555550123" --yes
1644
- ```
1645
-
1646
- ### Twilio call starts but never enters the meeting
1647
-
1648
- Confirm the Meet event exposes phone dial-in details. Pass the exact dial-in
1649
- number and PIN or a custom DTMF sequence:
1650
-
1651
- ```bash
1652
- fengming googlemeet join https://meet.google.com/abc-defg-hij \
1653
- --transport twilio \
1654
- --dial-in-number +15551234567 \
1655
- --dtmf-sequence ww123456#
1656
- ```
1657
-
1658
- Use leading `w` or commas in `--dtmf-sequence` if the provider needs a pause
1659
- before entering the PIN.
1660
-
1661
- If the phone call is created but the Meet roster never shows the dial-in
1662
- participant:
1663
-
1664
- - Run `fengming googlemeet doctor <session-id>` to confirm the delegated Twilio
1665
- call ID, whether DTMF was queued, and whether the intro greeting was requested.
1666
- - Run `fengming voicecall status --call-id <id>` and confirm the call is still
1667
- active.
1668
- - Run `fengming voicecall tail` and check that Twilio webhooks are arriving at
1669
- the Gateway.
1670
- - Run `fengming logs --follow` and look for the Twilio Meet sequence: Google
1671
- Meet delegates the join, Voice Call stores and serves pre-connect DTMF TwiML,
1672
- Voice Call serves realtime TwiML for the Twilio call, then Google Meet requests
1673
- intro speech with `voicecall.speak`.
1674
- - Re-run `fengming googlemeet setup --transport twilio`; a green setup check is
1675
- required but does not prove the meeting PIN sequence is correct.
1676
- - Confirm the dial-in number belongs to the same Meet invitation and region as
1677
- the PIN.
1678
- - Increase `voiceCall.dtmfDelayMs` from the 12-second default if Meet answers
1679
- slowly or the call transcript still shows the prompt asking for a PIN after
1680
- pre-connect DTMF was sent.
1681
- - If the participant joins but you do not hear the greeting, check
1682
- `fengming logs --follow` for the post-DTMF `voicecall.speak` request and
1683
- either media-stream TTS playback or the Twilio `<Say>` fallback. If the call
1684
- transcript still contains "enter the meeting PIN", the phone leg has not joined
1685
- the Meet room yet, so meeting participants will not hear speech.
1686
-
1687
- If webhooks do not arrive, debug the Voice Call plugin first: the provider must
1688
- reach `plugins.entries.voice-call.config.publicUrl` or the configured tunnel.
1689
- See [Voice call troubleshooting](/plugins/voice-call#troubleshooting).
1690
-
1691
- ## Notes
1692
-
1693
- Google Meet's official media API is receive-oriented, so speaking into a Meet
1694
- call still needs a participant path. This plugin keeps that boundary visible:
1695
- Chrome handles browser participation and local audio routing; Twilio handles
1696
- phone dial-in participation.
1697
-
1698
- Chrome talk-back modes need `BlackHole 2ch` plus either:
1699
-
1700
- - `chrome.audioInputCommand` plus `chrome.audioOutputCommand`: FengMing owns the
1701
- bridge and pipes audio in `chrome.audioFormat` between those commands and the
1702
- selected provider. Agent mode uses realtime transcription plus regular TTS;
1703
- bidi mode uses the realtime voice provider. The default Chrome path is 24 kHz
1704
- PCM16 with `chrome.audioBufferBytes: 4096`; 8 kHz G.711 mu-law remains
1705
- available for legacy command pairs.
1706
- - `chrome.audioBridgeCommand`: an external bridge command owns the whole local
1707
- audio path and must exit after starting or validating its daemon. This is only
1708
- valid for `bidi` because `agent` mode needs direct command-pair access for TTS.
1709
-
1710
- When an agent calls the `google_meet` tool in agent mode, the meeting consultant
1711
- session forks the caller's current transcript before answering participant
1712
- speech. The Meet session still stays separate (`agent:<agentId>:subagent:google-meet:<sessionId>`)
1713
- so meeting follow-ups do not mutate the caller transcript directly.
1714
-
1715
- For clean duplex audio, route Meet output and Meet microphone through separate
1716
- virtual devices or a Loopback-style virtual device graph. A single shared
1717
- BlackHole device can echo other participants back into the call.
1718
-
1719
- With the command-pair Chrome bridge, `chrome.bargeInInputCommand` can listen to a
1720
- separate local microphone and clear assistant playback when the human starts
1721
- talking. This keeps human speech ahead of assistant output even when the shared
1722
- BlackHole loopback input is temporarily suppressed during assistant playback.
1723
- Like `chrome.audioInputCommand` and `chrome.audioOutputCommand`, it is an
1724
- operator-configured local command. Use an explicit trusted command path or
1725
- argument list, and do not point it at scripts from untrusted locations.
1726
-
1727
- `googlemeet speak` triggers the active talk-back audio bridge for a Chrome
1728
- session. `googlemeet leave` stops that bridge. For Twilio sessions delegated
1729
- through the Voice Call plugin, `leave` also hangs up the underlying voice call.
1730
- Use `googlemeet end-active-conference` when you also want to close the active
1731
- Google Meet conference for an API-managed space.
1732
-
1733
- ## Related
1734
-
1735
- - [Voice call plugin](/plugins/voice-call)
1736
- - [Talk mode](/nodes/talk)
1737
- - [Building plugins](/plugins/building-plugins)