Skip to content

fix(google-meet): force English Meet UI via hl=en so automation works on any locale#89671

Merged
clawsweeper[bot] merged 9 commits into
openclaw:mainfrom
Unayung:fix/openai-realtime-and-meet-l10n
Jul 3, 2026
Merged

fix(google-meet): force English Meet UI via hl=en so automation works on any locale#89671
clawsweeper[bot] merged 9 commits into
openclaw:mainfrom
Unayung:fix/openai-realtime-and-meet-l10n

Conversation

@Unayung

@Unayung Unayung commented Jun 3, 2026

Copy link
Copy Markdown
Contributor

What Problem This Solves

The Google Meet browser automation script matches English UI labels (join now|ask to join, leave call, turn (off|on) microphone, your name, caption selectors). When the browser profile or Google account uses another language (e.g. Traditional Chinese), every DOM matcher goes blind: the bot cannot click join, detect in-call state, mute/unmute, or enable captions.

Why This Change Was Made

An earlier revision of this PR translated ~15 regex literals into 6 hand-picked languages. Review showed that approach is fragile (unanchored alternates like unirse, 退出, 登入, and bare name false-positive on unrelated buttons/inputs; activar micrófono is a substring of Desactivar micrófono, inverting mute detection) and still one-sided (chrome-create.ts untouched, all other locales still broken).

This revision fixes it at one seam instead: append hl=en (Google's standard UI-language parameter) to every Meet URL the plugin opens, so the Meet page always renders English labels and the existing matchers work for all locales — join and create flows both.

  • forceMeetEnglishUi() in chrome-browser-proxy.ts, applied at both /tabs/open call sites (chrome.ts join flow, chrome-create.ts create flow).
  • The created meeting link returned to users is stripped of query/hash so nobody is handed a ?hl=en link.
  • The join regex additionally matches the Join here too button (the "Switch here?" dialog shown when the same account is already in the meeting on another device — the scenario from the original repro).
  • Session/tab-reuse matching is unaffected: normalizeMeetUrlForReuse compares by pathname only.

Known limitation: a pre-existing Meet tab the user opened manually in a non-English locale is reused as-is (focus only, no navigation) — same behavior as before this PR; tabs opened by the plugin always carry hl=en.

User Impact

Meet join, talk-back, transcription, and meeting creation work on any account/browser locale. The automated Meet tab renders in English (visible if the browser window is watched); shared meeting links stay canonical.

Evidence

Live-verified over CDP against a signed-in zh-TW Edge profile (Arch Linux, Edg 147):

  • https://meet.google.com/landinglang="zh-TW", buttons 發起會議/加入; https://meet.google.com/landing?hl=enlang="en", buttons New meeting/Join.
  • Real meeting pre-join https://meet.google.com/qeo-ngsk-cqw?hl=enlang="en", Join now, Use Companion mode (without hl=en: 立即加入).
  • https://meet.google.com/new?hl=en → redirect lands on https://meet.google.com/yyr-vogp-vft?hl=en (param preserved), in-call UI English: Turn off microphone, Share screen.

Second locale, live-verified over CDP against a signed-out Japanese Chromium 148 (--lang=ja --accept-lang=ja-JP,ja, fresh profile):

  • https://meet.google.com/qeo-ngsk-cqwlang="ja", buttons ホーム画面に戻る, マイクとカメラを使用せずに続行; same URL with ?hl=enlang="en", Return to home screen, Continue without microphone and camera (the exact mic-choice label the automation matches). This also covers the signed-out/guest path, complementing the signed-in zh-TW run.

Local validation: pnpm test extensions/google-meet → 10 files, 168 tests passed (includes new forceMeetEnglishUi unit tests and updated /tabs/open URL assertions); pnpm tsgo:extensions and pnpm tsgo:test:extensions clean; oxlint/oxfmt clean.

Not tested: other locales beyond zh-TW (signed-in) and ja (guest) — the fix is locale-independent by construction since the page always renders English.

@openclaw-barnacle openclaw-barnacle Bot added plugin: google-meet size: XS triage: needs-real-behavior-proof Candidate: external PR needs after-fix proof from a real setup. labels Jun 3, 2026
@clawsweeper

clawsweeper Bot commented Jun 3, 2026

Copy link
Copy Markdown
Contributor

Codex review: passed. Reviewed July 3, 2026, 10:59 AM ET / 14:59 UTC.

Summary
The branch adds forceMeetEnglishUi() for Google Meet URLs, applies it to join/create browser opens, canonicalizes browser-created meeting links, and updates focused Google Meet tests.

PR surface: Source +18, Tests +19. Total +37 across 6 files.

Reproducibility: yes. Current main opens raw Meet URLs while the browser automation matches English-only labels, and the PR body provides after-fix CDP output showing non-English pages render expected English labels with hl=en.

Review metrics: 1 noteworthy metric.

  • Meet URL open surfaces: 2 changed. Both join and create browser-open call sites now force page language, which is the compatibility-sensitive behavior maintainers should notice before merge.

Merge readiness
Overall: 🐚 platinum hermit
Proof: 🦞 diamond lobster
Patch quality: 🐚 platinum hermit
Result: ready for maintainer review.

Overall follows the weaker of proof and patch quality, so missing proof can cap an otherwise strong patch.

Rank-up moves:

  • none.

Risk before merge

  • [P1] Plugin-opened Meet tabs will visibly render in English regardless of the user's browser or account locale, so maintainers should be aware of the compatibility tradeoff.
  • [P1] Manually opened non-English Meet tabs can still be reused without reloading, leaving the original locale-sensitive DOM matcher failure possible in that documented edge case.
  • [P1] The fix depends on Google Meet continuing to honor hl=en on live meeting pages, which green CI cannot fully settle.

Maintainer options:

  1. Accept English plugin-opened tabs (recommended)
    Land the focused hl=en seam and treat future Google Meet language-parameter or UI-label drift as normal plugin maintenance risk.
  2. Ask for one more live locale
    Pause merge until the author or maintainer verifies one more signed-in non-English Meet locale if stronger confidence in Google's live hl behavior is desired.
  3. Hold for reused-tab policy
    Keep the PR open if maintainers want existing non-English tabs to reload or be replaced, because that policy needs disruption proof.

Next step before merge

  • [P2] No repair job is needed; a member has opted the exact head into automerge, so deterministic checks and mergeability gates should handle the remaining landing path.

Security
Cleared: The diff changes plugin-local Google Meet browser automation and tests only; no dependency, workflow, lockfile, package, credential, permission, or secret-handling concern was found.

Review details

Best possible solution:

Land the focused plugin-local URL-language seam under exact-head automerge if maintainers accept the visible English UI behavior and the reused-tab limitation.

Do we have a high-confidence way to reproduce the issue?

Yes. Current main opens raw Meet URLs while the browser automation matches English-only labels, and the PR body provides after-fix CDP output showing non-English pages render expected English labels with hl=en.

Is this the best way to solve the issue?

Yes, likely. Applying the language parameter at the plugin's browser-open seam is narrower and less drift-prone than adding localized regexes throughout the DOM automation script.

AGENTS.md: found and applied where relevant.

Codex review notes: model internal, reasoning high; reviewed against e272da5c5579.

Label changes

Label justifications:

  • P2: This is a normal-priority Google Meet plugin bug fix for locale-specific browser automation failure with limited blast radius.
  • merge-risk: 🚨 compatibility: The diff intentionally changes existing Google Meet browser-open URLs and visible page language while preserving the reused-tab caveat.
  • rating: 🐚 platinum hermit: Overall readiness is 🐚 platinum hermit; proof is 🦞 diamond lobster and patch quality is 🐚 platinum hermit.
  • status: 👀 ready for maintainer look: ClawSweeper has no concrete contributor-facing blocker left for this PR. Sufficient (live_output): The PR body includes after-fix live CDP output for signed-in zh-TW Edge and signed-out Japanese Chromium showing hl=en produces English Meet UI labels on the changed real pages.
  • proof: sufficient: Contributor real behavior proof is sufficient. The PR body includes after-fix live CDP output for signed-in zh-TW Edge and signed-out Japanese Chromium showing hl=en produces English Meet UI labels on the changed real pages.
Evidence reviewed

PR surface:

Source +18, Tests +19. Total +37 across 6 files.

View PR surface stats
Area Files Added Removed Net
Source 3 22 4 +18
Tests 3 25 6 +19
Docs 0 0 0 0
Config 0 0 0 0
Generated 0 0 0 0
Other 0 0 0 0
Total 6 47 10 +37

What I checked:

  • Root policy read: Root AGENTS.md was read fully; its PR review, plugin boundary, proof, and compatibility-risk guidance affected this review. (AGENTS.md:1, e272da5c5579)
  • Scoped policy read: extensions/AGENTS.md was read fully and confirms bundled plugin production code should stay within plugin/plugin-sdk boundaries; the touched Google Meet files stay inside that boundary. (extensions/AGENTS.md:1, e272da5c5579)
  • Live PR state: GitHub reports the PR open, non-draft, mergeable, clean, and opted into clawsweeper:automerge at head 880a41b. (880a41b6f0de)
  • Maintainer opt-in: A repository member commented @clawsweeper automerge, and the bot acknowledged automerge for exact head 880a41b. (880a41b6f0de)
  • Current main join behavior: Current main opens a new Meet tab with body: { url: params.url } and detects join/microphone/captions through English labels such as join now, ask to join, and turn off microphone. (extensions/google-meet/src/transports/chrome.ts:435, e272da5c5579)
  • Current main create behavior: Current main opens https://meet.google.com/new without a language parameter and returns the browser-created meetingUri from the current href as-is. (extensions/google-meet/src/transports/chrome-create.ts:202, e272da5c5579)

Likely related people:

  • steipete: Commit history shows repeated Google Meet browser transport, tab reuse, caption health, and create-flow work across the affected files. (role: feature owner and recent area contributor; confidence: high; commits: 57401f158182, f9f7d6ffb596, 63dc5089b211; files: extensions/google-meet/src/transports/chrome.ts, extensions/google-meet/src/transports/chrome-create.ts, extensions/google-meet/src/transports/chrome-browser-proxy.ts)
  • vincentkoc: Recent commits touched malformed browser status/proxy handling and Google Meet docs adjacent to the changed browser control surface. (role: recent adjacent contributor; confidence: medium; commits: ae0cb0ac6fd9, c70adb8528f8; files: extensions/google-meet/src/transports/chrome.ts, extensions/google-meet/src/transports/chrome-browser-proxy.ts, docs/plugins/google-meet.md)
  • LaPhilosophie: Recent merged work required admin scope for browser proxy invokes in the same browser-proxy helper file. (role: recent adjacent contributor; confidence: medium; commits: 456c48f368cb; files: extensions/google-meet/src/transports/chrome-browser-proxy.ts)
What the crustacean ranks mean
  • 🦀 challenger crab: rare, exceptional readiness with strong proof, clean implementation, and convincing validation.
  • 🦞 diamond lobster: very strong readiness with only minor maintainer review expected.
  • 🐚 platinum hermit: good normal PR, likely mergeable with ordinary maintainer review.
  • 🦐 gold shrimp: useful signal, but proof or patch confidence is still limited.
  • 🦪 silver shellfish: thin signal; proof, validation, or implementation needs work.
  • 🧂 unranked krab: not merge-ready because proof is missing/unusable or there are serious correctness or safety concerns.
  • 🌊 off-meta tidepool: rating does not apply to this item.

Shiny media proof means a screenshot, video, or linked artifact directly shows the changed behavior. Runtime, network, CSP, and security claims still need visible diagnostics.

How this review workflow works
  • ClawSweeper keeps one durable marker-backed review comment per issue or PR.
  • Re-runs edit this comment so the latest verdict, findings, and automation markers stay together instead of adding duplicate bot comments.
  • A fresh review can be triggered by eligible @clawsweeper re-review comments, exact-item GitHub events, scheduled/background review runs, or manual workflow dispatch.
  • PR/issue authors and users with repository write access can comment @clawsweeper re-review or @clawsweeper re-run on an open PR or issue to request a fresh review only.
  • Maintainers can also comment @clawsweeper review to request a fresh review only.
  • Fresh-review commands do not start repair, autofix, rebase, CI repair, or automerge.
  • Maintainer-only repair and merge flows require explicit commands such as @clawsweeper autofix, @clawsweeper automerge, @clawsweeper fix ci, or @clawsweeper address review.
  • Maintainers can comment @clawsweeper explain to ask for more context, or @clawsweeper stop to stop active automation.

@Unayung
Unayung force-pushed the fix/openai-realtime-and-meet-l10n branch from 7b63849 to 069bdcd Compare June 3, 2026 03:05
@clawsweeper clawsweeper Bot added rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. P2 Normal backlog priority with limited blast radius. labels Jun 3, 2026
@openclaw-barnacle openclaw-barnacle Bot added scripts Repository scripts proof: supplied External PR includes structured after-fix real behavior proof. and removed triage: needs-real-behavior-proof Candidate: external PR needs after-fix proof from a real setup. labels Jun 3, 2026
@clawsweeper clawsweeper Bot added proof: sufficient ClawSweeper judged the real behavior proof convincing. rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. merge-risk: 🚨 automation 🚨 May affect CI, automerge, proof capture, label sync, or maintainer automation. and removed rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. status: 📣 needs proof The PR needs real behavior proof before ClawSweeper can clear the contributor ask. labels Jun 3, 2026
@Unayung

Unayung commented Jun 3, 2026

Copy link
Copy Markdown
Contributor Author

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Jun 3, 2026

Copy link
Copy Markdown
Contributor

🦞🧹
ClawSweeper re-review requested.

I asked ClawSweeper to review this item again.
Action: item re-review queued (workflow sweep.yml, event repository_dispatch).
Result: the existing ClawSweeper review comment will be edited in place when the review finishes.

Re-review progress:

@openclaw-barnacle openclaw-barnacle Bot removed the scripts Repository scripts label Jun 3, 2026
@clawsweeper clawsweeper Bot added rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. merge-risk: 🚨 compatibility 🚨 May break existing users, config, migrations, defaults, or upgrade paths. and removed rating: 🦪 silver shellfish Thin PR readiness signal; proof, validation, or implementation needs work. labels Jun 3, 2026
@clawsweeper

clawsweeper Bot commented Jun 3, 2026

Copy link
Copy Markdown
Contributor

🦞🧹
ClawSweeper re-review requested.

I asked ClawSweeper to review this item again.
Action: item re-review queued (workflow sweep.yml, event repository_dispatch).
Result: the existing ClawSweeper review comment will be edited in place when the review finishes.

Re-review progress:

@clawsweeper clawsweeper Bot added proof: sufficient ClawSweeper judged the real behavior proof convincing. rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. and removed rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. labels Jun 3, 2026
@clawsweeper clawsweeper Bot added rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. and removed rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. labels Jun 15, 2026
…on works on any locale

Replace the per-locale label regex approach with one seam: append hl=en to
every Meet URL the plugin opens (join + create), so the existing English DOM
matchers work regardless of the account/browser language. Live-verified on a
signed-in zh-TW profile: meeting pre-join and the /new redirect both honor
hl=en and keep it through navigation. Also match the 'Join here too'
switch-here dialog button and keep the created meeting link canonical by
stripping query/hash from meetingUri.
@Unayung Unayung changed the title fix(google-meet): resolve join and caption failures on Chinese locales fix(google-meet): force English Meet UI via hl=en so automation works on any locale Jul 2, 2026
@clawsweeper clawsweeper Bot added rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR. and removed rating: 🧂 unranked krab Not merge-ready due to missing proof or serious correctness/safety concerns. status: ⏳ waiting on author ClawSweeper has contributor-facing work open and is waiting for author action. labels Jul 2, 2026
@Unayung

Unayung commented Jul 2, 2026

Copy link
Copy Markdown
Contributor Author

@clawsweeper re-review

@clawsweeper

clawsweeper Bot commented Jul 2, 2026

Copy link
Copy Markdown
Contributor

🦞🧹
ClawSweeper re-review requested.

I asked ClawSweeper to review this item again.
Action: item re-review queued (workflow sweep.yml, event repository_dispatch).
Result: the existing ClawSweeper review comment will be edited in place when the review finishes.

@hxy91819

hxy91819 commented Jul 3, 2026

Copy link
Copy Markdown
Member

@clawsweeper automerge

@clawsweeper

clawsweeper Bot commented Jul 3, 2026

Copy link
Copy Markdown
Contributor

🦞✅
ClawSweeper merged this PR after the passing review.

Source: clawsweeper[bot]
Feedback: structured ClawSweeper verdict: pass (sha=880a41b6f0debed9361359be2c98d18b7a18c04c)
Merge status: merged by ClawSweeper automerge
Merged at: 2026-07-03T15:00:35Z
Merge commit: 5342effebcf7

What merged:

  • The branch adds forceMeetEnglishUi() for Google Meet URLs, applies it to join/create browser opens, canonicalizes browser-created meeting links, and updates focused Google Meet tests.
  • PR surface: Source +18, Tests +19. Total +37 across 6 files.
  • Reproducibility: yes. Current main opens raw Meet URLs while the browser automation matches English-only lab ... R body provides after-fix CDP output showing non-English pages render expected English labels with hl=en.

Automerge notes:

  • PR branch already contained follow-up commit before automerge: chore(tooling): add unused agent-cache-store files to knip optional a…
  • PR branch already contained follow-up commit before automerge: fix(google-meet): repair non-Latin mic regex matching boundary
  • PR branch already contained follow-up commit before automerge: revert(tooling): preserve current main deadcode allowlist guard
  • PR branch already contained follow-up commit before automerge: revert(tooling): perfectly match origin/main deadcode list
  • PR branch already contained follow-up commit before automerge: revert: match origin/main deadcode list exactly

The automerge loop is complete.

Automerge progress:

  • 2026-07-03 14:49:31 UTC review queued 880a41b6f0de (queued)
  • 2026-07-03 15:00:22 UTC review passed 880a41b6f0de (structured ClawSweeper verdict: pass (sha=880a41b6f0debed9361359be2c98d18b7a18c...)
  • 2026-07-03 15:00:37 UTC merged 880a41b6f0de (merged by ClawSweeper automerge)

@clawsweeper clawsweeper Bot added the clawsweeper:automerge Maintainer opted this PR into bounded ClawSweeper-reviewed automerge label Jul 3, 2026
@hxy91819

hxy91819 commented Jul 3, 2026

Copy link
Copy Markdown
Member

The issue is real, and the solution is reasonable. Given the constraint of not making major design changes, this is currently the best solution. Since openclaw joins the meeting itself, changing the page to English theoretically won't affect users.

@clawsweeper
clawsweeper Bot merged commit 5342eff into openclaw:main Jul 3, 2026
136 of 144 checks passed
github-actions Bot pushed a commit to Desicool/openclaw that referenced this pull request Jul 4, 2026
… on any locale (openclaw#89671)

Summary:
- The branch adds `forceMeetEnglishUi()` for Google Meet URLs, applies it to join/create browser opens, canonicalizes browser-created meeting links, and updates focused Google Meet tests.
- PR surface: Source +18, Tests +19. Total +37 across 6 files.
- Reproducibility: yes. Current main opens raw Meet URLs while the browser automation matches English-only lab ... R body provides after-fix CDP output showing non-English pages render expected English labels with `hl=en`.

Automerge notes:
- PR branch already contained follow-up commit before automerge: chore(tooling): add unused agent-cache-store files to knip optional a…
- PR branch already contained follow-up commit before automerge: fix(google-meet): repair non-Latin mic regex matching boundary
- PR branch already contained follow-up commit before automerge: revert(tooling): preserve current main deadcode allowlist guard
- PR branch already contained follow-up commit before automerge: revert(tooling): perfectly match origin/main deadcode list
- PR branch already contained follow-up commit before automerge: revert: match origin/main deadcode list exactly

Validation:
- ClawSweeper review passed for head 880a41b.
- Required merge gates passed before the squash merge.

Prepared head SHA: 880a41b
Review: openclaw#89671 (comment)

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

Labels

clawsweeper:automerge Maintainer opted this PR into bounded ClawSweeper-reviewed automerge merge-risk: 🚨 compatibility 🚨 May break existing users, config, migrations, defaults, or upgrade paths. P2 Normal backlog priority with limited blast radius. plugin: google-meet proof: sufficient ClawSweeper judged the real behavior proof convincing. proof: supplied External PR includes structured after-fix real behavior proof. rating: 🐚 platinum hermit Good normal PR readiness with ordinary maintainer review expected. size: S status: 👀 ready for maintainer look ClawSweeper has no concrete contributor-facing blocker left for this PR.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants