Repository navigation
fix(sandbox): reach the host broker under WSL mirrored networking - #280
Merged
Merged
Conversation
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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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
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
If you do not follow this template your PR will be automatically rejected.