diff --git a/.openclaw-sync/source.json b/.openclaw-sync/source.json index 2db98367f..af0e2f53a 100644 --- a/.openclaw-sync/source.json +++ b/.openclaw-sync/source.json @@ -1,5 +1,5 @@ { "repository": "openclaw/openclaw", - "sha": "c971c58fc7592344539ac3cf87c7c4229be9978e", - "syncedAt": "2026-04-24T04:23:00.859Z" + "sha": "569290c36ddece84ae4159d08a4da1d1edd802f5", + "syncedAt": "2026-04-24T04:32:25.481Z" } diff --git a/docs/.generated/plugin-sdk-api-baseline.sha256 b/docs/.generated/plugin-sdk-api-baseline.sha256 index daacb1013..de03d5b46 100644 --- a/docs/.generated/plugin-sdk-api-baseline.sha256 +++ b/docs/.generated/plugin-sdk-api-baseline.sha256 @@ -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 diff --git a/docs/plugins/google-meet.md b/docs/plugins/google-meet.md index 7bcf8c42a..c96f048b1 100644 --- a/docs/plugins/google-meet.md +++ b/docs/plugins/google-meet.md @@ -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 --port 18789 --display-name parallels-macos +``` + +Approve the node from the Gateway host: + +```bash +openclaw devices list +openclaw devices approve +``` + +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. diff --git a/docs/plugins/sdk-runtime.md b/docs/plugins/sdk-runtime.md index 2935869a8..0c60f98e6 100644 --- a/docs/plugins/sdk-runtime.md +++ b/docs/plugins/sdk-runtime.md @@ -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. +### `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