Summary
When the google_meet agent tool creates or joins a realtime Google Meet room, the live session can be owned only by the tool-turn plugin runtime instead of the gateway-owned googlemeet.* runtime. After the agent turn completes, googlemeet.status, googlemeet.leave, and googlemeet.speak can no longer see that session, even though the Chrome tab and node audio bridge continue running.
Observed behavior
In a live OpenClaw 2026.4.24 install:
- An agent used
google_meet action create with join: true, transport: chrome-node, mode: realtime.
- The tool result returned a session id and initial same-turn
google_meet status could report realtime readiness.
- After the agent turn ended,
openclaw gateway call googlemeet.status --params '{"sessionId":"..."}' returned { "found": false } and googlemeet.status listed no active sessions.
- The Chrome Meet tab and BlackHole/SoX node bridge processes were still running.
- Tool-backed live conversation then stalled because the official gateway control path no longer owned the session.
Expected behavior
Stateful google_meet tool actions should use the registered googlemeet.* gateway methods so that the same gateway runtime owns session maps, speak/leave callbacks, and health checks after the agent turn exits.
Additional bridge cleanup issue found during verification
While verifying the fix, googlemeet.leave could still leave one side of the node command-pair audio bridge alive. The cause is stopSession() returning early when session.closed is already true; if one child process closes first, the later official stop path skips termination of the surviving child. Also, Node's child.killed flag only means a signal was sent, not that the process exited, so SIGKILL fallback should check exitCode/signalCode.
Fix in PR
- Routes stateful
google_meet tool actions (join, create, test_speech, status, recover_current_tab, setup_status, leave, speak) through the existing gateway methods.
- Preserves structured Google Meet gateway error payloads in protocol
error.details, while keeping legacy gateway payload shape for direct gateway handlers.
- Hardens node command-pair cleanup so both child processes are always signaled, even if the bridge was already marked closed, and escalates from SIGTERM to SIGKILL based on process exit state.
Local validation
pnpm exec oxfmt --check extensions/google-meet/index.ts extensions/google-meet/index.test.ts extensions/google-meet/index.create.test.ts extensions/google-meet/src/test-support/plugin-harness.ts extensions/google-meet/src/node-host.ts
pnpm exec vitest run extensions/google-meet/index.test.ts extensions/google-meet/index.create.test.ts
pnpm tsgo:extensions:test
Live smoke validation
On a patched OpenClaw 2026.4.24 install, an agent-created Google Meet room through the real google_meet tool stayed visible to googlemeet.status after the agent turn completed. A direct create/leave smoke after node-host cleanup left no BlackHole SoX bridge processes running.
Summary
When the
google_meetagent tool creates or joins a realtime Google Meet room, the live session can be owned only by the tool-turn plugin runtime instead of the gateway-ownedgooglemeet.*runtime. After the agent turn completes,googlemeet.status,googlemeet.leave, andgooglemeet.speakcan no longer see that session, even though the Chrome tab and node audio bridge continue running.Observed behavior
In a live OpenClaw 2026.4.24 install:
google_meetactioncreatewithjoin: true,transport: chrome-node,mode: realtime.google_meetstatus could report realtime readiness.openclaw gateway call googlemeet.status --params '{"sessionId":"..."}'returned{ "found": false }andgooglemeet.statuslisted no active sessions.Expected behavior
Stateful
google_meettool actions should use the registeredgooglemeet.*gateway methods so that the same gateway runtime owns session maps, speak/leave callbacks, and health checks after the agent turn exits.Additional bridge cleanup issue found during verification
While verifying the fix,
googlemeet.leavecould still leave one side of the node command-pair audio bridge alive. The cause isstopSession()returning early whensession.closedis already true; if one child process closes first, the later official stop path skips termination of the surviving child. Also, Node'schild.killedflag only means a signal was sent, not that the process exited, so SIGKILL fallback should checkexitCode/signalCode.Fix in PR
google_meettool actions (join,create,test_speech,status,recover_current_tab,setup_status,leave,speak) through the existing gateway methods.error.details, while keeping legacy gateway payload shape for direct gateway handlers.Local validation
pnpm exec oxfmt --check extensions/google-meet/index.ts extensions/google-meet/index.test.ts extensions/google-meet/index.create.test.ts extensions/google-meet/src/test-support/plugin-harness.ts extensions/google-meet/src/node-host.tspnpm exec vitest run extensions/google-meet/index.test.ts extensions/google-meet/index.create.test.tspnpm tsgo:extensions:testLive smoke validation
On a patched OpenClaw 2026.4.24 install, an agent-created Google Meet room through the real
google_meettool stayed visible togooglemeet.statusafter the agent turn completed. A direct create/leave smoke after node-host cleanup left no BlackHole SoX bridge processes running.