feat: add Google Meet paired-node Chrome transport

This commit is contained in:
Peter Steinberger
2026-04-24 05:31:20 +01:00
parent 098557623f
commit 569290c36d
19 changed files with 1226 additions and 34 deletions

View File

@@ -1,2 +1,2 @@
5949119eccfa6ccc1bca232b9cf6bb1df0bd4b5eb53f8314db59c95bd8fcb2b0 plugin-sdk-api-baseline.json
f2827b8c1078eef3ba84b12cafab560c42516bfc8af20c8a5bdd4b6fcee5158a plugin-sdk-api-baseline.jsonl
b9c997ae9dba2c534942c1c79e8285f773ab7481c282e8a981e362e8132f944f plugin-sdk-api-baseline.json
c2f8370ae879d4404a9ac7f7aa7f43859e990f04f4872cbd8bc48da05d4bc671 plugin-sdk-api-baseline.jsonl

View File

@@ -2,7 +2,7 @@
summary: "Google Meet plugin: join explicit Meet URLs through Chrome or Twilio with realtime voice defaults"
read_when:
- You want an OpenClaw agent to join a Google Meet call
- You are configuring Chrome or Twilio as a Google Meet transport
- You are configuring Chrome, Chrome node, or Twilio as a Google Meet transport
title: "Google Meet plugin"
---
@@ -19,6 +19,7 @@ The plugin is explicit by design:
- Auth starts as personal Google OAuth or an already signed-in Chrome profile.
- There is no automatic consent announcement.
- The default Chrome audio backend is `BlackHole 2ch`.
- Chrome can run locally or on a paired node host.
- Twilio accepts a dial-in number plus optional PIN or DTMF sequence.
- The CLI command is `googlemeet`; `meet` is reserved for broader agent
teleconference workflows.
@@ -88,6 +89,111 @@ the microphone/speaker path used by OpenClaw. For clean duplex audio, use
separate virtual devices or a Loopback-style graph; a single BlackHole device is
enough for a first smoke test but can echo.
### Local Gateway + Parallels Chrome
You do **not** need a full OpenClaw Gateway or model API key inside a macOS VM
just to make the VM own Chrome. Run the Gateway and agent locally, then run a
node host in the VM. Enable the bundled plugin on the VM once so the node
advertises the Chrome command:
What runs where:
- Gateway host: OpenClaw Gateway, agent workspace, model/API keys, realtime
provider, and the Google Meet plugin config.
- Parallels macOS VM: OpenClaw CLI/node host, Google Chrome, SoX, BlackHole 2ch,
and a Chrome profile signed in to Google.
- Not needed in the VM: Gateway service, agent config, OpenAI/GPT key, or model
provider setup.
Install the VM dependencies:
```bash
brew install blackhole-2ch sox
```
Reboot the VM after installing BlackHole so macOS exposes `BlackHole 2ch`:
```bash
sudo reboot
```
After reboot, verify the VM can see the audio device and SoX commands:
```bash
system_profiler SPAudioDataType | grep -i BlackHole
command -v rec play
```
Install or update OpenClaw in the VM, then enable the bundled plugin there:
```bash
openclaw plugins enable google-meet
```
Start the node host in the VM:
```bash
openclaw node run --host <gateway-host> --port 18789 --display-name parallels-macos
```
Approve the node from the Gateway host:
```bash
openclaw devices list
openclaw devices approve <requestId>
```
Confirm the Gateway sees the node and that it advertises `googlemeet.chrome`:
```bash
openclaw nodes status
```
Route Meet through that node on the Gateway host:
```json5
{
plugins: {
entries: {
"google-meet": {
enabled: true,
config: {
defaultTransport: "chrome-node",
chromeNode: {
node: "parallels-macos",
},
},
},
},
},
}
```
Now join normally from the Gateway host:
```bash
openclaw googlemeet join https://meet.google.com/abc-defg-hij
```
or ask the agent to use the `google_meet` tool with `transport: "chrome-node"`.
If `chromeNode.node` is omitted, OpenClaw auto-selects only when exactly one
connected node advertises `googlemeet.chrome`. If several capable nodes are
connected, set `chromeNode.node` to the node id, display name, or remote IP.
Common failure checks:
- `No connected Google Meet-capable node`: start `openclaw node run` in the VM,
approve pairing, and make sure `openclaw plugins enable google-meet` was run
in the VM.
- `BlackHole 2ch audio device not found on the node`: install `blackhole-2ch`
in the VM and reboot the VM.
- Chrome opens but cannot join: sign in to Chrome inside the VM and confirm that
profile can join the Meet URL manually.
- No audio: in Meet, route microphone/speaker through the virtual audio device
path used by OpenClaw; use separate virtual devices or Loopback-style routing
for clean duplex audio.
## Install notes
The Chrome realtime default uses two external tools:
@@ -110,10 +216,13 @@ upstream licensing terms or get a separate license from Existential Audio.
Chrome transport opens the Meet URL in Google Chrome and joins as the signed-in
Chrome profile. On macOS, the plugin checks for `BlackHole 2ch` before launch.
If configured, it also runs an audio bridge health command and startup command
before opening Chrome.
before opening Chrome. Use `chrome` when Chrome/audio live on the Gateway host;
use `chrome-node` when Chrome/audio live on a paired node such as a Parallels
macOS VM.
```bash
openclaw googlemeet join https://meet.google.com/abc-defg-hij --transport chrome
openclaw googlemeet join https://meet.google.com/abc-defg-hij --transport chrome-node
```
Route Chrome microphone and speaker audio through the local OpenClaw audio
@@ -210,6 +319,7 @@ Defaults:
- `defaultTransport: "chrome"`
- `defaultMode: "realtime"`
- `chromeNode.node`: optional node id/name/IP for `chrome-node`
- `chrome.audioBackend: "blackhole-2ch"`
- `chrome.audioInputCommand`: SoX `rec` command writing 8 kHz G.711 mu-law
audio to stdout
@@ -230,6 +340,9 @@ Optional overrides:
chrome: {
browserProfile: "Default",
},
chromeNode: {
node: "parallels-macos",
},
realtime: {
toolPolicy: "owner",
},
@@ -259,11 +372,16 @@ Agents can use the `google_meet` tool:
{
"action": "join",
"url": "https://meet.google.com/abc-defg-hij",
"transport": "chrome",
"transport": "chrome-node",
"mode": "realtime"
}
```
Use `transport: "chrome"` when Chrome runs on the Gateway host. Use
`transport: "chrome-node"` when Chrome runs on a paired node such as a Parallels
VM. In both cases the realtime model and `openclaw_agent_consult` run on the
Gateway host, so model credentials stay there.
Use `action: "status"` to list active sessions or inspect a session ID. Use
`action: "leave"` to mark a session ended.

View File

@@ -3,7 +3,7 @@ summary: "api.runtime -- the injected runtime helpers available to plugins"
title: "Plugin runtime helpers"
sidebarTitle: "Runtime Helpers"
read_when:
- You need to call core helpers from a plugin (TTS, STT, image gen, web search, subagent)
- You need to call core helpers from a plugin (TTS, STT, image gen, web search, subagent, nodes)
- You want to understand what api.runtime exposes
- You are accessing config, agent, or media helpers from plugin code
---
@@ -119,6 +119,27 @@ await api.runtime.subagent.deleteSession({
Untrusted plugins can still run subagents, but override requests are rejected.
</Warning>
### `api.runtime.nodes`
List connected nodes and invoke a node-host command from Gateway-loaded plugin
code. Use this when a plugin owns local work on a paired device, for example a
browser or audio bridge on another Mac.
```typescript
const { nodes } = await api.runtime.nodes.list({ connected: true });
const result = await api.runtime.nodes.invoke({
nodeId: "mac-studio",
command: "my-plugin.command",
params: { action: "start" },
timeoutMs: 30000,
});
```
This runtime is only available inside the Gateway. Node commands still go
through normal Gateway node pairing, command allowlists, and node-local command
handling.
### `api.runtime.taskFlow`
Bind a Task Flow runtime to an existing OpenClaw session key or trusted tool