fix(browser): diagnose empty WSL2 Chrome replies#100590
Conversation
|
Land-ready proof for
Known proof gap: the AWS WSL2 provider image failed its own bootstrap, so the live Gateway ran locally through a loopback-only tunnel rather than inside WSL. That does not replace or hide the two product proofs above: the Windows listener/proxy transition was exercised natively, and the full Gateway/OpenAI/Browser path controlled that same Windows browser. No broad CDP bind, policy relaxation, or signed-in default Chrome profile was used. |
|
Codex review: needs changes before merge. Reviewed July 6, 2026, 12:32 AM ET / 04:32 UTC. Summary PR surface: Source +10, Tests +29, Docs +45. Total +84 across 5 files. Reproducibility: yes. Current main still has only the self-loop hint and no IPv4-vs-IPv6 WSL2 guidance, while the PR adds a focused empty-reply TCP probe test and real Windows/Gateway proof in the discussion. Review metrics: none identified. Root-cause cluster Members:
Proposal only: this assessment does not dispatch repair, suppress jobs, mutate sibling items, close, or merge anything. Merge readiness Overall follows the weaker of proof and patch quality, so missing proof can cap an otherwise strong patch. Rank-up moves:
Next step before merge
Security Review findings
Review detailsBest possible solution: Land the scoped diagnostics, docs, and test fix after dropping the direct CHANGELOG.md edit so release generation can derive the final entry from the PR body. Do we have a high-confidence way to reproduce the issue? Yes. Current main still has only the self-loop hint and no IPv4-vs-IPv6 WSL2 guidance, while the PR adds a focused empty-reply TCP probe test and real Windows/Gateway proof in the discussion. Is this the best way to solve the issue? Yes for the browser fix: docs plus diagnostic wording is the narrow maintainable surface because WSL cannot directly prove the Windows [::1] listener. The only safer adjustment is to leave CHANGELOG.md to the release-owned generation flow. Full review comments:
Overall correctness: patch is correct AGENTS.md: found and applied where relevant. Codex review notes: model internal, reasoning high; reviewed against 4b7661e9a0c4. Label changesLabel changes:
Label justifications:
Evidence reviewedPR surface: Source +10, Tests +29, Docs +45. Total +84 across 5 files. View PR surface stats
Acceptance criteria:
What I checked:
Likely related people:
What the crustacean ranks mean
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
|
2fdb715 to
d7b05bc
Compare
Base the repair on #93481 while matching Chromium's IPv4-first, IPv6-fallback listener contract and keeping CDP exposure loopback-scoped. Co-authored-by: ZengWen-DT <[email protected]>
d7b05bc to
73bb8ba
Compare
|
Landed as The final version preserves the contributor's useful listener-family diagnosis while correcting the Chromium invariant, covers clean-close and Final proof: exact-head CI 28772329460 passed with 45 successful jobs and no failures; Testbox 28771241151 passed the focused Browser suite 57/57 plus changed-surface checks; the native Windows + real Dev Gateway/OpenAI/Browser proof is recorded in the land-ready comment above. |
* origin/main: (1287 commits) fix(android): block loopback canvas navigation (openclaw#99874) fix(hooks): suppress unhandled stdout/stderr stream errors in gmail watcher (openclaw#100519) fix(memory-core): guard qmd mcporter JSON.parse against non-JSON stdout (openclaw#98381) fix(build): fall back to tsx for build TypeScript scripts (openclaw#91262) feat(skills): suggest saving detected reusable workflows by default (openclaw#95477) (openclaw#100692) docs(changelog): remove generated release-note entries feat(telegram): offer BotFather web app flow in setup help and docs (openclaw#100540) fix(ios): unify Talk and Settings row typography on one branded detail row (openclaw#100515) feat(gateway): add persisted crash-loop breaker and fatal-config exit contract refactor(macos): lock and unify PortGuardian tunnel record persistence so concurrent app instances cannot lose orphan records (openclaw#100601) fix: stop reconnecting on protocol mismatch (openclaw#98414) fix(maint): reuse recent hosted gates after rebase (openclaw#100663) fix(ui): reopen web terminals without stale content (openclaw#100665) fix(browser): diagnose empty WSL2 Chrome replies (openclaw#100590) fix(ios): chat snaps back to bottom when scrolling to top via status-bar tap (openclaw#100502) Treat already-compacted CLI compaction as no-op (openclaw#99136) docs(changelog): remove direct main fix entry fix(feishu): strip internal tool-trace banners from outbound text (openclaw#98705) fix(message): thread --limit through to CLI formatter and surface provider pagination hints (openclaw#99089) fix(voyage): close response body stream when batch output JSONL parsing throws (openclaw#98840) ... # Conflicts: # extensions/memory-wiki/package.json
* fix(browser): diagnose Windows CDP listener mismatch Base the repair on openclaw#93481 while matching Chromium's IPv4-first, IPv6-fallback listener contract and keeping CDP exposure loopback-scoped. Co-authored-by: ZengWen-DT <[email protected]> * style(docs): format browser troubleshooting table * docs: refresh browser troubleshooting map * fix(browser): diagnose reset CDP replies * docs: refresh browser troubleshooting map --------- Co-authored-by: ZengWen-DT <[email protected]>
* fix(browser): diagnose Windows CDP listener mismatch Base the repair on openclaw#93481 while matching Chromium's IPv4-first, IPv6-fallback listener contract and keeping CDP exposure loopback-scoped. Co-authored-by: ZengWen-DT <[email protected]> * style(docs): format browser troubleshooting table * docs: refresh browser troubleshooting map * fix(browser): diagnose reset CDP replies * docs: refresh browser troubleshooting map --------- Co-authored-by: ZengWen-DT <[email protected]>
Closes #54669
What Problem This Solves
Fixes an issue where users connecting from a WSL2 Gateway to Windows Chrome could receive an empty CDP reply and be told only about a stale self-loop, even when Chromium had fallen back to the IPv6 loopback listener. Existing guidance also attributed that fallback universally to Chrome 136+, while Chromium actually prefers
127.0.0.1and uses[::1]only after the IPv4 bind fails.Why This Change Was Made
This takes #93481 as the base, preserves its useful listener-family diagnosis, and corrects it against current Chromium source. The diagnostic and docs now tell operators to inspect both Windows loopback listeners and the actual portproxy table before choosing
v4tov4orv4tov6; they do not attempt a misleading WSL-side[::1]probe because that address belongs to WSL, not Windows.The docs also add Chrome 136+'s real command-line contract: remote debugging needs a non-default data directory. CDP remains bound only to the Windows adapter WSL2 needs; the guide explicitly warns against
0.0.0.0, LAN, or tailnet exposure.User Impact
Operators can distinguish a self-loop from Chromium's IPv6 fallback, repair the proxy without disabling browser automation, and keep the browser-control boundary scoped to the intended host path. Existing IPv4 setups keep working;
v4tov6is recommended only after Windows proves Chrome is listening on[::1].Evidence
chrome/browser/devtools/remote_debugging_server.cctries127.0.0.1first and[::1]second; Chrome's official security note says version 136 changed default-data-directory handling, not listener-family order.cbx_c077cdda0444(aws, Windows Server 2022, Edge/Chromium 150). Baseline wasipv4_exit=0 ipv6_exit=7with Chrome on127.0.0.1; an occupied IPv4 listener producedipv4_exit=56 ipv6_exit=0with Chromium on[::1]; replacing the mismatch withv4tov6 connectaddress=::1producedipv4_exit=0 ipv6_exit=0.gpt-5.5, Browser as the only callable tool, Windows Chromium reached through a loopback-only SSH tunnel. Rund0f4b2cc-eb43-477c-bea2-81dcf7abb47fmade 4 Browser calls with 0 failures and returnedREMOTE_BROWSER_OK title=Example Domain url=https://example.com/; the remote CDP target independently reported the same title and URL.73bb8bacb7245d9513e2213ec0d91a236954dc55with no failed jobs.tbx_01kwv0c2nqfddttj09jw5fweke:extensions/browser/src/browser/chrome.test.ts57/57;pnpm check:changedgreen across production/test typechecks, lint, docs, and repository guards after adding connection-reset coverage.pnpm format:docs:checkandpnpm docs:map:checkpassed after refreshing the generated docs map.73bb8bacb7245d9513e2213ec0d91a236954dc55retained the tested patch across the main rebase.AI-assisted. I reviewed the Chromium contract, the OpenClaw caller path, the tests, and the live behavior. No transcript is attached because the live proof used credential-injected infrastructure; secret values were never printed.