Skip to content

Fix Google Meet realtime interruption playback#72524

Merged
steipete merged 2 commits into
openclaw:mainfrom
BsnizND:fix/google-meet-clear-audio-vad
Apr 27, 2026
Merged

Fix Google Meet realtime interruption playback#72524
steipete merged 2 commits into
openclaw:mainfrom
BsnizND:fix/google-meet-clear-audio-vad

Conversation

@BsnizND

@BsnizND BsnizND commented Apr 27, 2026

Copy link
Copy Markdown
Contributor

Summary

  • add Google Live realtime input config knobs for interruption handling, turn coverage, and optional automatic VAD disablement
  • implement audioSink.clearAudio for Google Meet Chrome command-pair and chrome-node bridges
  • restart the output command on Gemini interruption clears so queued SoX/Chrome audio cannot resume later
  • expose clear counters/timestamps in Google Meet bridge health for diagnostics

Fixes #72523.

Validation

  • node scripts/test-projects.mjs extensions/google/realtime-voice-provider.test.ts extensions/google-meet/index.test.ts
  • pnpm tsgo:extensions:test
  • pnpm exec oxfmt --check extensions/google/realtime-voice-provider.ts extensions/google/realtime-voice-provider.test.ts extensions/google-meet/src/realtime.ts extensions/google-meet/src/realtime-node.ts extensions/google-meet/src/node-host.ts extensions/google-meet/src/transports/types.ts extensions/google-meet/index.test.ts
  • git diff --check

Notes

This does not change the Google Meet command-pair audio format. The current documented path remains 8 kHz G.711 mu-law, so HD-quality audio likely needs a separate bridge-format follow-up.

@greptile-apps

greptile-apps Bot commented Apr 27, 2026

Copy link
Copy Markdown
Contributor

Greptile Summary

This PR fixes Google Meet realtime interruption playback by implementing audioSink.clearAudio for both the command-pair (realtime.ts) and chrome-node (realtime-node.ts + node-host.ts) bridges — restarting the output process on Gemini interruption clears so queued audio can't resume. It also adds Google Live activityHandling, turnCoverage, and automaticActivityDetectionDisabled config knobs, and exposes clear counters/timestamps in bridge health.

Confidence Score: 4/5

Safe to merge; one inconsistency in the error-handler guard that is unlikely to trigger in practice.

One P2/P1 finding: the error handler in realtime.ts's attachOutputProcessHandlers lacks the proc !== outputProcess guard that the exit handler uses, creating a theoretical path where a just-killed stale process triggers full session teardown. All other logic is correct, tests cover the key scenarios, and the node-host.ts parallel implementation handles this correctly.

extensions/google-meet/src/realtime.ts — specifically the error handler in attachOutputProcessHandlers

Prompt To Fix All With AI
This is a comment left during a code review.
Path: extensions/google-meet/src/realtime.ts
Line: 133-134

Comment:
**`error` handler missing stale-process guard**

The `exit` handler correctly skips teardown when `proc !== outputProcess` (i.e. the process is a previously-cleared one), but the `error` handler calls `fail()` unconditionally. If a just-killed `previousOutput` ever emits an `error` event after `clearOutputPlayback` replaces it, the whole session would be torn down. The parallel implementation in `node-host.ts` applies the same identity check to both `exit` and `error`.

```suggestion
  const attachOutputProcessHandlers = (proc: BridgeProcess) => {
    proc.on("error", (error) => {
      if (proc !== outputProcess) {
        return;
      }
      fail("audio output command")(error);
    });
```

How can I resolve this? If you propose a fix, please make it concise.

Reviews (1): Last reviewed commit: "Fix Google Meet realtime interruption pl..." | Re-trigger Greptile

Comment thread extensions/google-meet/src/realtime.ts Outdated
Comment on lines +133 to +134
proc.on("error", fail("audio output command"));
proc.on("exit", (code, signal) => {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 error handler missing stale-process guard

The exit handler correctly skips teardown when proc !== outputProcess (i.e. the process is a previously-cleared one), but the error handler calls fail() unconditionally. If a just-killed previousOutput ever emits an error event after clearOutputPlayback replaces it, the whole session would be torn down. The parallel implementation in node-host.ts applies the same identity check to both exit and error.

Suggested change
proc.on("error", fail("audio output command"));
proc.on("exit", (code, signal) => {
const attachOutputProcessHandlers = (proc: BridgeProcess) => {
proc.on("error", (error) => {
if (proc !== outputProcess) {
return;
}
fail("audio output command")(error);
});
Prompt To Fix With AI
This is a comment left during a code review.
Path: extensions/google-meet/src/realtime.ts
Line: 133-134

Comment:
**`error` handler missing stale-process guard**

The `exit` handler correctly skips teardown when `proc !== outputProcess` (i.e. the process is a previously-cleared one), but the `error` handler calls `fail()` unconditionally. If a just-killed `previousOutput` ever emits an `error` event after `clearOutputPlayback` replaces it, the whole session would be torn down. The parallel implementation in `node-host.ts` applies the same identity check to both `exit` and `error`.

```suggestion
  const attachOutputProcessHandlers = (proc: BridgeProcess) => {
    proc.on("error", (error) => {
      if (proc !== outputProcess) {
        return;
      }
      fail("audio output command")(error);
    });
```

How can I resolve this? If you propose a fix, please make it concise.

@steipete
steipete force-pushed the fix/google-meet-clear-audio-vad branch from b013b29 to 29f825b Compare April 27, 2026 06:44
@openclaw-barnacle openclaw-barnacle Bot added the docs Improvements or additions to documentation label Apr 27, 2026
@steipete
steipete merged commit 2785be2 into openclaw:main Apr 27, 2026
65 of 66 checks passed
@steipete

Copy link
Copy Markdown
Contributor

Landed in 2785be2604d99b3c57786c48de20655548b73c58.

What changed after maintainer review:

  • rebased onto current main after Fix Google Meet chrome-node bridge cleanup #72372 changed the same node-host bridge lifecycle code
  • kept stale node bridge cleanup and added clearAudio/clear health state on top
  • fixed the stale output-process error handler guard in extensions/google-meet/src/realtime.ts
  • added regression coverage for node-host clearAudio and stale output-process errors
  • documented the new Google Live realtime config knobs and added the changelog attribution

Remote proof, no local test lanes:

  • GitHub CI 24980529154 passed on 29f825bea5c2ac4b840fee6bc6a332f7e1256eb2
  • Blacksmith Testbox tbx_01kq6tsgbaxgstxmtearwy9n4w passed git diff --check, targeted oxfmt --check, Google Meet tests, Google realtime provider tests, and pnpm tsgo:extensions:test

Thanks @BsnizND.

ogt-redknie pushed a commit to ogt-redknie/OPENX that referenced this pull request May 2, 2026
Fixes openclaw#72523.

Remote proof:
- CI run 24980529154 passed on 29f825b.
- Blacksmith Testbox tbx_01kq6tsgbaxgstxmtearwy9n4w passed focused formatting, Google Meet tests, Google realtime provider tests, and extension test typecheck.

Thanks @BsnizND.

Co-authored-by: BSnizND <[email protected]>
github-actions Bot pushed a commit to Desicool/openclaw that referenced this pull request May 9, 2026
Fixes openclaw#72523.

Remote proof:
- CI run 24980529154 passed on 29f825b.
- Blacksmith Testbox tbx_01kq6tsgbaxgstxmtearwy9n4w passed focused formatting, Google Meet tests, Google realtime provider tests, and extension test typecheck.

Thanks @BsnizND.

Co-authored-by: BSnizND <[email protected]>
globalcaos pushed a commit to globalcaos/tinkerclaw that referenced this pull request May 13, 2026
Fixes openclaw#72523.

Remote proof:
- CI run 24980529154 passed on 29f825b.
- Blacksmith Testbox tbx_01kq6tsgbaxgstxmtearwy9n4w passed focused formatting, Google Meet tests, Google realtime provider tests, and extension test typecheck.

Thanks @BsnizND.

Co-authored-by: BSnizND <[email protected]>
github-actions Bot pushed a commit to Desicool/openclaw that referenced this pull request May 24, 2026
Fixes openclaw#72523.

Remote proof:
- CI run 24980529154 passed on 29f825b.
- Blacksmith Testbox tbx_01kq6tsgbaxgstxmtearwy9n4w passed focused formatting, Google Meet tests, Google realtime provider tests, and extension test typecheck.

Thanks @BsnizND.

Co-authored-by: BSnizND <[email protected]>
jameslcowan pushed a commit to jameslcowan/openclaw that referenced this pull request Jun 2, 2026
Fixes openclaw#72523.

Remote proof:
- CI run 24980529154 passed on 29f825b.
- Blacksmith Testbox tbx_01kq6tsgbaxgstxmtearwy9n4w passed focused formatting, Google Meet tests, Google realtime provider tests, and extension test typecheck.

Thanks @BsnizND.

Co-authored-by: BSnizND <[email protected]>
sablehead pushed a commit to sablehead/openclaw that referenced this pull request Jun 10, 2026
Fixes openclaw#72523.

Remote proof:
- CI run 24980529154 passed on 29f825b.
- Blacksmith Testbox tbx_01kq6tsgbaxgstxmtearwy9n4w passed focused formatting, Google Meet tests, Google realtime provider tests, and extension test typecheck.

Thanks @BsnizND.

Co-authored-by: BSnizND <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

docs Improvements or additions to documentation plugin: google-meet size: M

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Google Meet realtime should clear playback on Gemini Live interruptions

2 participants