Skip to content

fix(sandbox): reach the host broker under WSL mirrored networking - #280

Merged
quickbeard merged 2 commits into
mainfrom
wsl-broker-probe
Aug 20, 2026
Merged

quickbeard merged 2 commits into
mainfrom
wsl-broker-probe

Conversation

@quickbeard

Copy link
Copy Markdown
Owner

The guest found the host by assuming NAT: the default gateway is the
Windows host. Under mirrored networking (a .wslconfig opt-in common on
corporate proxy/VPN machines) the gateway is the LAN router, so the
socat bridge dialed the wrong box and every model call failed with
"Cannot connect to API: other side closed" while Code side worked.

Detect the mode with wslinfo at start, probe an ordered candidate list
(shared loopback first when mirrored, NAT gateway first otherwise)
before committing to an address, and bind the broker to loopback on
mirrored machines where the LAN never needs to see it. When no
candidate answers - a host firewall blocking WSL-to-host traffic - the
start now fails immediately with a named error instead of surfacing as
a cryptic retry loop on the first model call.

Co-Authored-By: Claude Fable 5 noreply@anthropic.com

Issue for this PR

Closes #

Type of change

  • Bug fix
  • New feature
  • Refactor / code improvement
  • Documentation

What does this PR do?

Please provide a description of the issue, the changes you made to fix it, and why they work. It is expected that you understand why your changes work and if you do not understand why at least say as much so a maintainer knows how much to value the PR.

If you paste a large clearly AI generated description here your PR may be IGNORED or CLOSED!

How did you verify your code works?

Screenshots / recordings

If this is a UI change, please include a screenshot or recording.

Checklist

  • I have tested my changes locally
  • I have not included unrelated changes in this PR

If you do not follow this template your PR will be automatically rejected.

Quickbeard and others added 2 commits August 20, 2026 10:49
The guest found the host by assuming NAT: the default gateway is the
Windows host. Under mirrored networking (a .wslconfig opt-in common on
corporate proxy/VPN machines) the gateway is the LAN router, so the
socat bridge dialed the wrong box and every model call failed with
"Cannot connect to API: other side closed" while Code side worked.

Detect the mode with wslinfo at start, probe an ordered candidate list
(shared loopback first when mirrored, NAT gateway first otherwise)
before committing to an address, and bind the broker to loopback on
mirrored machines where the LAN never needs to see it. When no
candidate answers - a host firewall blocking WSL-to-host traffic - the
start now fails immediately with a named error instead of surfacing as
a cryptic retry loop on the first model call.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… reach the broker

A managed Windows firewall can silently drop WSL guest-to-host TCP, and
users on those machines cannot allow it. The direction WSL always
provides is the opposite one: a guest loopback bind is republished on
the Windows loopback - the same channel the sandbox's health check and
UI traffic already ride - and Windows does not firewall loopback.

When the boot probe finds no reachable broker address, the guest now
announces tunnel mode on stdout and runs a small pairing daemon instead
of the socat stub: it serves the identical model-endpoint stub on the
guest loopback plus a rendezvous listener the host dials into, keeping
a pool of idle connections. Each server connection is paired with one
pooled connection, marked live with a single claim byte, and spliced -
one stream per connection, so there is no framing protocol. The daemon
travels inside the boot script's stdin delivery; published images need
nothing new. Direct mode is unchanged and remains the first choice.

Accepted daemon sockets are explicitly paused until pairing pipes them:
bytes arriving in the accept-to-pair gap must wait in the kernel buffer
rather than race the pipe attachment.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@quickbeard
quickbeard merged commit 6d48a18 into main Aug 20, 2026
0 of 5 checks passed
@quickbeard
quickbeard deleted the wsl-broker-probe branch August 20, 2026 06:31
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant