Fix Google Meet chrome-node bridge cleanup#72372
Conversation
Greptile SummaryThis PR adds URL/mode metadata to node-host bridge sessions, introduces Confidence Score: 4/5Safe to merge; only a minor API-clarity issue with listSessions returning closed sessions. No P0 or P1 issues found. The single P2 observation (listSessions returning closed sessions without documentation) does not affect correctness or the new lifecycle paths described in the PR. No files require special attention. Prompt To Fix All With AIThis is a comment left during a code review.
Path: extensions/google-meet/src/node-host.ts
Line: 360-368
Comment:
**`listSessions` returns closed sessions**
`listSessions` includes sessions where `closed === true`, so a caller filtering for active sessions to stop (or display) would silently include already-terminated entries. The summary object exposes a `closed` field, so callers can post-filter, but the `list` action docs/contract don't make this explicit. Consider filtering out closed sessions by default or accepting a `closed` filter parameter to avoid confusion.
How can I resolve this? If you propose a fix, please make it concise.Reviews (1): Last reviewed commit: "Fix Google Meet chrome-node bridge clean..." | Re-trigger Greptile |
| function listSessions(params: Record<string, unknown>) { | ||
| const urlKey = normalizeMeetKey(readString(params.url)); | ||
| const mode = readString(params.mode); | ||
| const bridges = [...sessions.values()] | ||
| .filter((session) => !urlKey || normalizeMeetKey(session.url) === urlKey) | ||
| .filter((session) => !mode || session.mode === mode) | ||
| .map(summarizeSession); | ||
| return { bridges }; | ||
| } |
There was a problem hiding this comment.
listSessions returns closed sessions
listSessions includes sessions where closed === true, so a caller filtering for active sessions to stop (or display) would silently include already-terminated entries. The summary object exposes a closed field, so callers can post-filter, but the list action docs/contract don't make this explicit. Consider filtering out closed sessions by default or accepting a closed filter parameter to avoid confusion.
Prompt To Fix With AI
This is a comment left during a code review.
Path: extensions/google-meet/src/node-host.ts
Line: 360-368
Comment:
**`listSessions` returns closed sessions**
`listSessions` includes sessions where `closed === true`, so a caller filtering for active sessions to stop (or display) would silently include already-terminated entries. The summary object exposes a `closed` field, so callers can post-filter, but the `list` action docs/contract don't make this explicit. Consider filtering out closed sessions by default or accepting a `closed` filter parameter to avoid confusion.
How can I resolve this? If you propose a fix, please make it concise.|
Codex automated review: keeping this open. Keep this PR open. Current main still has the Google Meet chrome-node lifecycle gap the PR targets: the gateway runtime owns only process-local session maps, node-host bridge sessions do not carry URL/mode metadata, node-host has no list/stop-by-URL action, launch starts a new node bridge without reconciling stale same-URL bridges, and realtime input stops on the first pullAudio failure. The PR is a focused implementation candidate paired with open beta-blocker #72371, and the bot review only raised a minor list-session semantics concern. Best possible solution: Keep this PR open as the implementation candidate for open beta-blocker #72371. Review the node-host list/stopByUrl API semantics, address or consciously accept the Greptile P2 comment, then run the focused Google Meet tests and a chrome-node smoke before landing. What I checked:
Remaining risk / open question:
Codex Review notes: model gpt-5.5, reasoning high; reviewed against d3fd275aa5fc. |
08e1428 to
d583a6b
Compare
|
Landed in What changed after review:
Remote proof, no local test lanes:
Thanks @BsnizND. |
- Google Meet integration: realtime voice sessions, participant plugin - DeepSeek V4 Flash + V4 Pro added to bundled catalog - Voice Call: realtime voice loops + webhook mode - Browser automation: coordinate clicks, longer action budgets - Memory-core: WAL journal mode default (~30% write performance) - Plugin SDK: workflow action/outbound/scheduler/retry seams (openclaw#72384/openclaw#72383) - Bug fixes: Bonjour crash loop (openclaw#72332), Google Meet cleanup (openclaw#72372) - Breaking: removed registerEmbeddedExtensionFactory compatibility path - Refs: github-sync-2026-04-27
Fixes openclaw#72371. Remote proof: - CI run 24980121791 passed on d583a6b. - Blacksmith Testbox tbx_01kq6t5jk2f51gxq30j9veyjhy passed focused Google Meet formatting and tests. Thanks @BsnizND. Co-authored-by: BSnizND <199837910+BsnizND@users.noreply.github.com>
Fixes openclaw#72371. Remote proof: - CI run 24980121791 passed on d583a6b. - Blacksmith Testbox tbx_01kq6t5jk2f51gxq30j9veyjhy passed focused Google Meet formatting and tests. Thanks @BsnizND. Co-authored-by: BSnizND <199837910+BsnizND@users.noreply.github.com>
Fixes openclaw#72371. Remote proof: - CI run 24980121791 passed on d583a6b. - Blacksmith Testbox tbx_01kq6t5jk2f51gxq30j9veyjhy passed focused Google Meet formatting and tests. Thanks @BsnizND. Co-authored-by: BSnizND <199837910+BsnizND@users.noreply.github.com>
Fixes openclaw#72371. Remote proof: - CI run 24980121791 passed on d583a6b. - Blacksmith Testbox tbx_01kq6t5jk2f51gxq30j9veyjhy passed focused Google Meet formatting and tests. Thanks @BsnizND. Co-authored-by: BSnizND <199837910+BsnizND@users.noreply.github.com>
Fixes openclaw#72371. Remote proof: - CI run 24980121791 passed on d583a6b. - Blacksmith Testbox tbx_01kq6t5jk2f51gxq30j9veyjhy passed focused Google Meet formatting and tests. Thanks @BsnizND. Co-authored-by: BSnizND <199837910+BsnizND@users.noreply.github.com>
Fixes openclaw#72371. Remote proof: - CI run 24980121791 passed on d583a6b. - Blacksmith Testbox tbx_01kq6t5jk2f51gxq30j9veyjhy passed focused Google Meet formatting and tests. Thanks @BsnizND. Co-authored-by: BSnizND <199837910+BsnizND@users.noreply.github.com>
Summary
Fixes #72371.
Fixes chrome-node Google Meet realtime bridge lifecycle handling so stale node-side command-pair bridges do not accumulate after gateway/plugin ownership is lost, and so transient
pullAudionode failures do not immediately tear down an otherwise healthy realtime session.Changes
googlemeet.chromenode-host actions:liststopByUrlconsecutiveInputErrorsandlastInputErrorthrough Chrome health.Why
The gateway-side Google Meet runtime and the persistent node-host command-pair bridge currently keep separate in-memory ownership maps. If the gateway/plugin side loses state, the node-side SoX/BlackHole bridge can remain alive while
googlemeet.statusno longer reports a session. A later join for the same Meet URL can create an additional bridge. A separate observed failure path was a transient node invoke timeout inpullAudio, which stopped the realtime bridge immediately and left the browser participant joined but silent/unresponsive.This keeps the existing official Google Meet plugin and chrome-node architecture intact; it only adds lifecycle reconciliation and input resilience around that path.
Validation
pnpm exec oxfmt --check extensions/google-meet/src/node-host.ts extensions/google-meet/src/realtime-node.ts extensions/google-meet/src/transports/chrome.ts extensions/google-meet/src/transports/types.ts extensions/google-meet/index.test.tspnpm exec vitest run extensions/google-meet/index.test.tspnpm tsgo:extensions:testDocs/release context