Skip to content

Commit 569290c

Browse files
committed
feat: add Google Meet paired-node Chrome transport
1 parent 0985576 commit 569290c

19 files changed

Lines changed: 1226 additions & 34 deletions

File tree

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ Docs: https://docs.openclaw.ai
1717
- Codex harness/context-engine: run context-engine bootstrap, assembly, post-turn maintenance, and engine-owned compaction in Codex app-server sessions while keeping native Codex thread state and compaction auditable. (#70809) Thanks @jalehman.
1818
- Plugins/Google Meet: add a bundled participant plugin with personal Google auth, explicit meeting URL joins, Chrome and Twilio transports, and realtime voice support. (#70765) Thanks @steipete.
1919
- Plugins/Google Meet: default Chrome realtime sessions to OpenAI plus SoX `rec`/`play` audio bridge commands, so the usual setup only needs the plugin enabled and `OPENAI_API_KEY`.
20+
- Plugins/Google Meet: add a `chrome-node` transport so a paired macOS node, such as a Parallels VM, can own Chrome, BlackHole, and SoX while the Gateway machine keeps the agent and model key.
2021
- Providers/OpenAI: add image generation and reference-image editing through Codex OAuth, so `openai/gpt-image-2` works without an `OPENAI_API_KEY`. Fixes #70703.
2122
- Providers/OpenRouter: add image generation and reference-image editing through `image_generate`, so OpenRouter image models work with `OPENROUTER_API_KEY`. Fixes #55066 via #67668. Thanks @notamicrodose.
2223
- Image generation: let agents request provider-supported quality and output format hints, and pass OpenAI-specific background, moderation, compression, and user hints through the `image_generate` tool. (#70503) Thanks @ottodeng.
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
5949119eccfa6ccc1bca232b9cf6bb1df0bd4b5eb53f8314db59c95bd8fcb2b0 plugin-sdk-api-baseline.json
2-
f2827b8c1078eef3ba84b12cafab560c42516bfc8af20c8a5bdd4b6fcee5158a plugin-sdk-api-baseline.jsonl
1+
b9c997ae9dba2c534942c1c79e8285f773ab7481c282e8a981e362e8132f944f plugin-sdk-api-baseline.json
2+
c2f8370ae879d4404a9ac7f7aa7f43859e990f04f4872cbd8bc48da05d4bc671 plugin-sdk-api-baseline.jsonl

docs/plugins/google-meet.md

Lines changed: 121 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
summary: "Google Meet plugin: join explicit Meet URLs through Chrome or Twilio with realtime voice defaults"
33
read_when:
44
- You want an OpenClaw agent to join a Google Meet call
5-
- You are configuring Chrome or Twilio as a Google Meet transport
5+
- You are configuring Chrome, Chrome node, or Twilio as a Google Meet transport
66
title: "Google Meet plugin"
77
---
88

@@ -19,6 +19,7 @@ The plugin is explicit by design:
1919
- Auth starts as personal Google OAuth or an already signed-in Chrome profile.
2020
- There is no automatic consent announcement.
2121
- The default Chrome audio backend is `BlackHole 2ch`.
22+
- Chrome can run locally or on a paired node host.
2223
- Twilio accepts a dial-in number plus optional PIN or DTMF sequence.
2324
- The CLI command is `googlemeet`; `meet` is reserved for broader agent
2425
teleconference workflows.
@@ -88,6 +89,111 @@ the microphone/speaker path used by OpenClaw. For clean duplex audio, use
8889
separate virtual devices or a Loopback-style graph; a single BlackHole device is
8990
enough for a first smoke test but can echo.
9091

92+
### Local Gateway + Parallels Chrome
93+
94+
You do **not** need a full OpenClaw Gateway or model API key inside a macOS VM
95+
just to make the VM own Chrome. Run the Gateway and agent locally, then run a
96+
node host in the VM. Enable the bundled plugin on the VM once so the node
97+
advertises the Chrome command:
98+
99+
What runs where:
100+
101+
- Gateway host: OpenClaw Gateway, agent workspace, model/API keys, realtime
102+
provider, and the Google Meet plugin config.
103+
- Parallels macOS VM: OpenClaw CLI/node host, Google Chrome, SoX, BlackHole 2ch,
104+
and a Chrome profile signed in to Google.
105+
- Not needed in the VM: Gateway service, agent config, OpenAI/GPT key, or model
106+
provider setup.
107+
108+
Install the VM dependencies:
109+
110+
```bash
111+
brew install blackhole-2ch sox
112+
```
113+
114+
Reboot the VM after installing BlackHole so macOS exposes `BlackHole 2ch`:
115+
116+
```bash
117+
sudo reboot
118+
```
119+
120+
After reboot, verify the VM can see the audio device and SoX commands:
121+
122+
```bash
123+
system_profiler SPAudioDataType | grep -i BlackHole
124+
command -v rec play
125+
```
126+
127+
Install or update OpenClaw in the VM, then enable the bundled plugin there:
128+
129+
```bash
130+
openclaw plugins enable google-meet
131+
```
132+
133+
Start the node host in the VM:
134+
135+
```bash
136+
openclaw node run --host <gateway-host> --port 18789 --display-name parallels-macos
137+
```
138+
139+
Approve the node from the Gateway host:
140+
141+
```bash
142+
openclaw devices list
143+
openclaw devices approve <requestId>
144+
```
145+
146+
Confirm the Gateway sees the node and that it advertises `googlemeet.chrome`:
147+
148+
```bash
149+
openclaw nodes status
150+
```
151+
152+
Route Meet through that node on the Gateway host:
153+
154+
```json5
155+
{
156+
plugins: {
157+
entries: {
158+
"google-meet": {
159+
enabled: true,
160+
config: {
161+
defaultTransport: "chrome-node",
162+
chromeNode: {
163+
node: "parallels-macos",
164+
},
165+
},
166+
},
167+
},
168+
},
169+
}
170+
```
171+
172+
Now join normally from the Gateway host:
173+
174+
```bash
175+
openclaw googlemeet join https://meet.google.com/abc-defg-hij
176+
```
177+
178+
or ask the agent to use the `google_meet` tool with `transport: "chrome-node"`.
179+
180+
If `chromeNode.node` is omitted, OpenClaw auto-selects only when exactly one
181+
connected node advertises `googlemeet.chrome`. If several capable nodes are
182+
connected, set `chromeNode.node` to the node id, display name, or remote IP.
183+
184+
Common failure checks:
185+
186+
- `No connected Google Meet-capable node`: start `openclaw node run` in the VM,
187+
approve pairing, and make sure `openclaw plugins enable google-meet` was run
188+
in the VM.
189+
- `BlackHole 2ch audio device not found on the node`: install `blackhole-2ch`
190+
in the VM and reboot the VM.
191+
- Chrome opens but cannot join: sign in to Chrome inside the VM and confirm that
192+
profile can join the Meet URL manually.
193+
- No audio: in Meet, route microphone/speaker through the virtual audio device
194+
path used by OpenClaw; use separate virtual devices or Loopback-style routing
195+
for clean duplex audio.
196+
91197
## Install notes
92198

93199
The Chrome realtime default uses two external tools:
@@ -110,10 +216,13 @@ upstream licensing terms or get a separate license from Existential Audio.
110216
Chrome transport opens the Meet URL in Google Chrome and joins as the signed-in
111217
Chrome profile. On macOS, the plugin checks for `BlackHole 2ch` before launch.
112218
If configured, it also runs an audio bridge health command and startup command
113-
before opening Chrome.
219+
before opening Chrome. Use `chrome` when Chrome/audio live on the Gateway host;
220+
use `chrome-node` when Chrome/audio live on a paired node such as a Parallels
221+
macOS VM.
114222

115223
```bash
116224
openclaw googlemeet join https://meet.google.com/abc-defg-hij --transport chrome
225+
openclaw googlemeet join https://meet.google.com/abc-defg-hij --transport chrome-node
117226
```
118227

119228
Route Chrome microphone and speaker audio through the local OpenClaw audio
@@ -210,6 +319,7 @@ Defaults:
210319

211320
- `defaultTransport: "chrome"`
212321
- `defaultMode: "realtime"`
322+
- `chromeNode.node`: optional node id/name/IP for `chrome-node`
213323
- `chrome.audioBackend: "blackhole-2ch"`
214324
- `chrome.audioInputCommand`: SoX `rec` command writing 8 kHz G.711 mu-law
215325
audio to stdout
@@ -230,6 +340,9 @@ Optional overrides:
230340
chrome: {
231341
browserProfile: "Default",
232342
},
343+
chromeNode: {
344+
node: "parallels-macos",
345+
},
233346
realtime: {
234347
toolPolicy: "owner",
235348
},
@@ -259,11 +372,16 @@ Agents can use the `google_meet` tool:
259372
{
260373
"action": "join",
261374
"url": "https://meet.google.com/abc-defg-hij",
262-
"transport": "chrome",
375+
"transport": "chrome-node",
263376
"mode": "realtime"
264377
}
265378
```
266379

380+
Use `transport: "chrome"` when Chrome runs on the Gateway host. Use
381+
`transport: "chrome-node"` when Chrome runs on a paired node such as a Parallels
382+
VM. In both cases the realtime model and `openclaw_agent_consult` run on the
383+
Gateway host, so model credentials stay there.
384+
267385
Use `action: "status"` to list active sessions or inspect a session ID. Use
268386
`action: "leave"` to mark a session ended.
269387

docs/plugins/sdk-runtime.md

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ summary: "api.runtime -- the injected runtime helpers available to plugins"
33
title: "Plugin runtime helpers"
44
sidebarTitle: "Runtime Helpers"
55
read_when:
6-
- You need to call core helpers from a plugin (TTS, STT, image gen, web search, subagent)
6+
- You need to call core helpers from a plugin (TTS, STT, image gen, web search, subagent, nodes)
77
- You want to understand what api.runtime exposes
88
- You are accessing config, agent, or media helpers from plugin code
99
---
@@ -119,6 +119,27 @@ await api.runtime.subagent.deleteSession({
119119
Untrusted plugins can still run subagents, but override requests are rejected.
120120
</Warning>
121121

122+
### `api.runtime.nodes`
123+
124+
List connected nodes and invoke a node-host command from Gateway-loaded plugin
125+
code. Use this when a plugin owns local work on a paired device, for example a
126+
browser or audio bridge on another Mac.
127+
128+
```typescript
129+
const { nodes } = await api.runtime.nodes.list({ connected: true });
130+
131+
const result = await api.runtime.nodes.invoke({
132+
nodeId: "mac-studio",
133+
command: "my-plugin.command",
134+
params: { action: "start" },
135+
timeoutMs: 30000,
136+
});
137+
```
138+
139+
This runtime is only available inside the Gateway. Node commands still go
140+
through normal Gateway node pairing, command allowlists, and node-local command
141+
handling.
142+
122143
### `api.runtime.taskFlow`
123144

124145
Bind a Task Flow runtime to an existing OpenClaw session key or trusted tool

0 commit comments

Comments
 (0)