Repository navigation
v1.91.86.0 fix(browse): proxy from environment, Windows 8.3 temp paths, no NUL bunfig (Wave 9 Lane E) - #3135
Merged
Merged
Conversation
Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
…atchet Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
…t pins Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
|
😎 This pull request was merged. |
Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com> # Conflicts: # CHANGELOG.md
Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
garrytan
added a commit
that referenced
this pull request
Oct 11, 2026
Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
Contributor
E2E Evals: ✅ PASS4 executed, 0 reused rule/judge records | 0 manual accepted (unscored; no score-cache credit) | $.47 rule/judge cost | reconcile exit: 0 Profile: pr / mode Rule and judge shards
Fail-closed reconciliationSliced lane: planner → duration-packed executors → fail-closed report. Behavior cases run a pre-registered 3-trial panel (PASS at 2/3 with no contract violation); a PASS 2/3 is shown with its failed trial, never as a clean pass. Reused results retain their original provenance and expiry. |
This was referenced Oct 11, 2026
levi85
pushed a commit
to levi85/gstack
that referenced
this pull request
Oct 14, 2026
…s, no NUL bunfig (Wave 9 Lane E) (garrytan#3135) browse resolves its proxy from --proxy, BROWSE_PROXY_URL, then HTTPS_PROXY, HTTP_PROXY and ALL_PROXY (BROWSE_PROXY_URL=direct opts out), translates NO_PROXY to Chromium bypass rules with loopback always kept, and hashes the proxy and NO_PROXY rules into the daemon config so a differing environment is refused with the variable named. Unparseable standard variables warn and go direct; browse stop always stops (garrytan#915, supersedes garrytan#916). Safe directories and targets resolve through one realpath (fs.realpathSync.native), fixing Windows 8.3 temp paths (garrytan#3104). Bun children get an empty private bunfig instead of --config=NUL, which panicked Bun 1.3.10 on Windows (garrytan#3085). Co-authored-by: ningfeemic-dev <239259264+ningfeemic-dev@users.noreply.github.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.
Summary
Wave 9, lane E (browse). This lane covers four reported issues: #915 (proxy from the environment), #3104 (Windows 8.3 temp paths), #3085 (
--config=NULcrash windows) and #3092 (did not reproduce, so it is closed separately).#915: browse follows the proxy your environment sets
--proxycomes first, thenBROWSE_PROXY_URL, thenHTTPS_PROXY/https_proxy, thenHTTP_PROXY/http_proxy, thenALL_PROXY/all_proxy. With none of these set, the connection is direct. SettingBROWSE_PROXY_URL=directopts out of the standard variables. All of this lives inresolveProxy(browse/src/proxy-config.ts).parseProxyConfig, so the same credential policy applies. The cred-mixing hint names the variable the URL came from.socks5h://is accepted and mapped to Chromium'ssocks5://.host:port, an unsupported scheme, a bad port) prints a warning when the server starts, and browse connects directly. The warning never echoes the raw value, because it may carry credentials.example.comand.example.comcover the domain plus its subdomains,*matches everything, CIDR blocks andhost:portentries pass through, and bare IPv6 addresses get brackets.localhost,127.0.0.1and[::1]are always bypassed. Naming them also stops Playwright from adding<-loopback>, which would send localhost through the proxy; a negative control confirms this.connectand its supervisor. Chromium receives the bypass list on all four of its launch paths.Starting server with proxy http://***:***@host:3128/ from HTTPS_PROXY....NO_PROXY differs,HTTPS_PROXY differs)browse stop, plusBROWSE_PROXY_URL=directwhen the daemon has no proxyBROWSER.md#proxy-from-environment--proxyand headed differences keep their existing refusals.#3104: one realpath for safe directories and targets
SAFE_DIRECTORIES,TEMP_ONLY) and every target go through a single function,resolveRealPath, built onfs.realpathSync.native. It resolves the longest existing prefix and then appends the missing tail.validateOutputPath,validateReadPathandvalidateTempPathall use it.cookie-importinbrowse/src/write-commands.tshad its own check built onfs.realpathSync. That check now callsvalidateReadPath, so it can't regress the same way.#3085: no
--config=NULanywherebrowse/src/bun-child-config.tsaddsemptyBunConfig()./dev/null.bunfig.tomlexclusively (wx, mode 0600) in a privatemkdtempdirectory. Before each spawn it checks that the file is still a zero-byte regular file (vialstat, so a symlink fails the check). If the file has grown or been replaced, a fresh one is created instead.bunChildFlags(), which replaces theBUN_CHILD_FLAGSconstant), the native-cookie supervisor and its member worker.NATIVE_CODE_INPUTS.#3092: does not reproduce on main
I ran the generated browse SKILL.md blocks from 1.91.83.0 with no
asideon PATH and no project-local install. The output wasNEEDS_ASIDE: Linux, thenBROWSER_OK, thenREADY: ~/.claude/skills/gstack/browse/dist/browse. The queue closes the issue with that explanation.Behavior changes
HTTPS_PROXY,HTTP_PROXYorALL_PROXYset now get Chromium routed through that proxy. Before, these variables were ignored. Opt out withBROWSE_PROXY_URL=direct.--proxyandBROWSE_PROXY_URLstill fail closed when they don't parse, since they are explicit browse settings and a silent direct connection could expose the user's real IP.--proxy. Before, Playwright sent localhost through a--proxyproxy.browse stopalways stops. It skips the config-mismatch check, so it stops a daemon started with different proxy or headed settings. Before, it was refused and told to usebrowse disconnect.validateReadPathnow resolves the longest existing prefix of a missing path. For example,/tmp/new-dir/fileon macOS is now accepted, because/tmpresolves to/private/tmp. Non-ENOENT failures on a parent now raiseCannot resolve real pathinstead of being ignored.--config=<private empty bunfig.toml>instead of--config=NUL.BUN_CHILD_FLAGSis replaced bybunChildFlags().Tests
New tests:
browse/test/proxy-env.test.ts: precedence,direct,socks5h, cred policy, the warning fallback with no echo, NO_PROXY translation, hash stability, server env,serverProxyEnv, mismatch lines, and the BROWSER.md anchor.browse/test/proxy-env-daemon.test.ts: a local HTTP proxy driven through the real CLI and Chromium, covering launch, reuse with loopback kept direct, a NO_PROXY-only change being refused,BROWSE_PROXY_URL=directbeing refused, restart afterbrowse stopapplying the new NO_PROXY, and the curl-style warning.browse/test/path-security-realpath.test.ts: an aliased temp dir (an 8.3 short name on Windows, a symlink on POSIX), the case-folded missing tail on Windows only, and exact comparison.browse/test/bun-child-config.test.ts:/dev/nullon POSIX, the private zero-byte file, replacement after tampering, a child ignoring the project's bunfig preload, and a check that no spawn site passesNULand every--configgoes through the helper.Results:
bun run typecheckandtypecheck:testclean. Credential scan 0 high. Skill docs fresh.module-size-ratchet,spawnsync-timeout-tripwireandparity-suitepass.bun run test:freeon a Ubicloud standard-16 VM withzipinstalled), run on 32a9df6: 17 of 17 shards pass, 1186 files, 27,829 tests, 27,738 pass, 0 fail, 91 skip. The first full run, on 484353e, failed one case:browse/test/pair-agent-optin-gate.test.tspins the exact source linelet state = await ensureServer(globalFlags);, and thebrowse stopchange had rewritten that line. 32a9df6 restores the line and applies the stop override on the line before it; after that, the focused test and the full rerun both passed.Not verified
Credits
Supersedes #916. Contributed by @ningfeemic-dev: the diagnosis that every Chromium launch path ignored the standard proxy variables, and the HTTPS → HTTP → ALL order.