fix(browser): name Chrome 136+ IPv6 CDP binding in WSL2 portproxy hint#93481
fix(browser): name Chrome 136+ IPv6 CDP binding in WSL2 portproxy hint#93481ZengWen-DT wants to merge 1 commit into
Conversation
The empty-reply CDP diagnostic asserted only one cause (a stale netsh self-loop), so when Chrome 136+ binds remote debugging to [::1] (IPv6) only and a v4tov4 portproxy targets 127.0.0.1, the hint pointed users at the wrong fix. Name both empty-reply causes and document the v4tov6 remedy in the WSL2 + Windows remote CDP troubleshooting guide. Closes openclaw#54669 Co-Authored-By: Claude Opus 4.8 <[email protected]>
|
Closing this because the proposed Chrome 136+ invariant is not supported by Chromium's implementation. Current Chromium remote-debugging source binds A |
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]>
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]>
* fix(browser): diagnose Windows CDP listener mismatch 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]> * 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]>
|
Thank you, @ZengWen-DT. I took this PR as the implementation base, preserved your listener-family diagnosis and contributor credit, and landed the corrected version in #100590. The landed fix keeps the useful Proof included native Windows Chromium listener/proxy transitions, a real Dev Gateway + OpenAI agent controlling that Windows browser, 57/57 focused Browser tests, changed-surface type/lint/guard checks, and exact-head CI. Landed commit: |
* 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]>
Summary
In WSL2-to-Windows setups, when a CDP probe gets an empty reply through a
netshportproxy, OpenClaw's diagnostic asserted a single cause — a stale127.0.0.1:9222 -> 127.0.0.1:9222self-loop owned bysvchost/iphlpsvc. As of Chrome 136+, a second cause produces the identical empty reply: Chrome ignores--remote-debugging-addressand binds the CDP listener to[::1]:9222(IPv6 loopback) only, so av4tov4portproxy forwarding to127.0.0.1:9222reaches nothing. Users following the old hint went looking for a self-loop that wasn't there, while the real fix is av4tov6portproxy.This PR makes the empty-reply hint name both causes and tell the user to run
netstat -ano | findstr :9222to disambiguate, and documents the IPv6-binding case +v4tov6remedy in the dedicated WSL2 remote-CDP troubleshooting guide.Why guidance, not an auto-probe
Issue suggestion (2) proposed having OpenClaw probe both
127.0.0.1:9222and[::1]:9222. In the reported topology the gateway runs in WSL2 and Chrome runs on Windows behind the portproxy, so[::1]from WSL2 is WSL2's own loopback, not Windows Chrome — OpenClaw cannot reach the Windows IPv6 listener to auto-detect this. The actionable improvement OpenClaw can make from the WSL2 side is to stop pointing users at the wrong cause and surface the correct remedy. Suggestion (1), the doc update, is implemented.Changed surface
extensions/browser/src/browser/chrome.diagnostics.ts—formatChromeCdpDiagnosticempty-reply hint now names both causes (self-loop and Chrome 136+ IPv6 binding) and thev4tov6fix. Extracted to a commentedWSL_EMPTY_REPLY_PORTPROXY_HINTconstant.docs/tools/browser-wsl2-windows-remote-cdp-troubleshooting.md— new "Chrome 136+ binds CDP to IPv6 loopback" section under Layer 1 + a clue in "Common misleading errors".This is additive diagnostic text + docs. The CDP connection path itself is unchanged.
Verification
Real environment tested: Linux/WSL2; reproduced the field report's IPv4-vs-IPv6 split and the empty-reply diagnostic with real loopback servers (no Windows Chrome required to drive the diagnostic path under test).
Reproduction of the field-report signature — a server bound to
[::1]only (mirroring Chrome 136+) answers on IPv6 but not IPv4, exactly as reported (curl.exe http://[::1]:9222200 vs127.0.0.1:9222empty/refused):Diagnostic behavior, before → after — a TCP server that accepts then closes the socket reproduces the portproxy empty-reply.
diagnoseChromeCdp("http://127.0.0.1:<port>")returnshttp_unreachable("other side closed"), andformatChromeCdpDiagnosticis asserted in a live end-to-end test:v4tov6remedy. Existing self-loop substrings preserved.Exact commands run after this patch:
What was not tested: I could not exercise the genuine Chrome 136+ Windows binding (no Windows host with Chrome 136+ in this environment); the IPv6-only listener is simulated with a real
[::1]-bound server that produces the same observable IPv4/IPv6 split and empty-reply diagnostic.pnpm docs:check-links:anchorscould not run locally (missing@mintlify/scrapingtransitive dep + network); the new same-page anchor#chrome-136-binds-cdp-to-ipv6-loopbackwas verified by hand against the heading slug.AI-assisted; all proof above was produced by real local runs.
Closes #54669