Skip to content

fix(wsl): rewrite loopback proxy URLs to the host gateway for guest shells - #21919

Closed
Bandersnatch0x wants to merge 6 commits into
stablyai:mainfrom
Bandersnatch0x:fix/wsl-loopback-proxy-gateway
Closed

Bandersnatch0x wants to merge 6 commits into
stablyai:mainfrom
Bandersnatch0x:fix/wsl-loopback-proxy-gateway

Conversation

@Bandersnatch0x

@Bandersnatch0x Bandersnatch0x commented Sep 21, 2026 •

Copy link
Copy Markdown

ELI5

If you run coding agents inside a WSL distro (WSL worktree on Windows) and you set a proxy in Settings > Advanced > Network like http://127.0.0.1:7890 (Clash, v2ray, ...), that proxy is unreachable from inside the distro under WSL2 NAT — the guest's 127.0.0.1 is the distro itself, not Windows. Every agent in a WSL pane silently ran without your proxy. This PR asks the distro whether the proxy address is reachable; if not, it rewrites the hostname to the WSL host gateway address (e.g. http://172.28.112.193:7890), but only after the guest confirms the rewritten address actually works. Mirrored-networking setups and every failure mode keep the original URL untouched.

What Changed

  • New module src/main/wsl/wsl-guest-proxy-gateway.ts:
    • pure helpers: loopback-hostname detection, gateway probe script (ip route show default, falling back to private/link-local resolv.conf nameservers), and a /dev/tcp reachability probe script;
    • resolveWslGuestProxySettings(): returns the settings untouched on every fast path (non-WSL, no proxy, non-loopback URL) and on any probe failure, and only produces a rewritten URL when the guest confirms the gateway address is reachable;
    • wslProxyForTarget(): PTY-spawn convenience wrapper keyed off the existing CodexAccountSelectionTarget (same WSL predicate as shouldSkipCodexHomeEnvForWindowsShell);
    • bounded-TTL caches (probe verdicts 60s, gateway 5min / 30s negative) so repeated pane spawns don't re-probe.
  • All three local-PTY env paths (local-configure.ts, spawn-env-codex.ts, spawn-preflight.ts) now pass the resolved settings into buildPtyHostEnv, which injects HTTP_PROXY/HTTPS_PROXY/... via buildConfiguredProxyEnv.
  • The hidden Claude usage PTY (rate-limits/claude-pty.ts) gets the same treatment for its WSL launch command.
  • Probes run through runWslProcess (bash, loginPath: 'none', 5s timeout) — no new direct wsl.exe spawn; the invocation-boundary and probe-failure-semantics guards stay green (one new allowlist entry for a pure URL-parse catch, with a note).

Why

Before: a loopback proxy configured in Orca settings was injected verbatim into WSL PTYs, where it cannot connect — agents in WSL ran proxy-less (timeouts, or direct egress that the user explicitly tried to route through a proxy). Orca already knows about the WSL NAT loopback hazard for agent hooks (wslHookRelayManager), but the proxy env path had no equivalent.

The probe-then-rewrite shape (and the gateway parsing rules, including rejecting public resolv.conf nameservers that are not the host) is ported from zai-org/ZCode's remote-WSL backend (packages/server/src/remote/wslProxy.ts, Apache-2.0), adapted to Orca's runWslProcess runner and proxy settings flow. Alternatives considered: always rewriting to the gateway (breaks mirrored networking), documenting a manual workaround (pushes the problem onto users), and pre-warming a sync cache (first spawn would still get the broken URL).

Linked Issue

No existing issue found for this; the problem report is contained in this PR. (Happy to move discussion to an issue if preferred.)

Visual Proof

N/A — no UI change; behavior is inside PTY environment assembly.

Testing

  • Automated tests added: src/main/wsl/wsl-guest-proxy-gateway.test.ts (39 cases: pure helpers + resolver behavior — mirrored networking keeps the URL, NAT rewrite applies, unreachable/gateway-failure/probe-error fall back, per-distro gateway cache, verdict cache), plus a claude-pty.test.ts case asserting the rewritten URL is exported inside the WSL launch command.

  • oxlint clean on all touched files; tsc --noEmit passes for all four tsconfig projects.

  • Windows 11 (WSL2 Ubuntu): targeted suites pass — wsl/, rate-limits/claude-pty, pty-ipc-* (36/36), daemon WSL spawn suites identical to the pre-change baseline (4 pre-existing failures are Windows path-separator issues reproducible on main without these changes).

  • I manually tested these changes locally (automated coverage above; end-to-end with a real proxy on a real distro would be a welcome second review)

  • Automated tests added/updated, or explained why not below

Review

AI review summary: cross-platform — all new code is guarded by process.platform === 'win32' + isWsl flags; non-Windows and non-WSL paths return the settings object identity unchanged, so macOS/Linux/SSH behavior is byte-for-byte identical. SSH/remote — no touch: buildPtyHostEnv is not called for SSH spawns, and the change only affects its local-PTY callers' networkProxySettings argument. Performance — hot path (PTY spawn) is unaffected unless a loopback proxy is configured AND the shell is WSL; then it is bounded by a 5s probe with 60s/5min caches, and every failure falls back to the original URL. Security — the rewrite only ever replaces the hostname with an address the guest itself reported as reachable; credentials and port are preserved; no new data leaves the machine. Agent compatibility — proxy env reaches all agents via the shared buildConfiguredProxyEnv, so the fix is agent-neutral.

Agent skill upstream boundary

  • Not applicable, or this change follows docs/reference/agent-skill-sharing-upstream-boundary.md and copies or mechanically translates no upstream skill-installer source, tests, fixtures, registry entries, path tables, comments, or documentation.

(The boundary targets vercel-labs/skills skill-installer material; this PR ports a small networking helper from zai-org/ZCode (Apache-2.0), attributed in the module header and above.)

Notes

  • Env-inherited proxies (a Windows shell exporting HTTP_PROXY that reaches the WSL PTY through process-env inheritance) are NOT rewritten — only the Settings-configured proxy, which is the documented path. A follow-up could cover the inherited case.
  • Authored with permission of the account owner (Bandersnatch0x). No X handle to share yet — happy to add one.

Checklist

  • This PR is small and focused
  • I explained what changed and why (ELI5, the user-facing before/after, the mechanism, and why over the alternatives)
  • Before/after screenshots or videos attached for UI changes, or N/A with reason
  • Self-reviewed for correctness, security, and performance
  • Cross-platform, SSH/remote, and path/shortcut impact considered (or N/A)
  • pnpm lint, pnpm typecheck, pnpm test, and pnpm build pass (or CI will cover; local preferred)

Part of the WSL-host series tracked in #22024 (this proxy-gateway fix is independent and can merge on its own).

…hells

A Windows loopback proxy configured in Settings > Advanced > Network is
unreachable from inside a WSL2 distro (NAT mode): the guest's 127.0.0.1 is
the distro itself, so agents in WSL worktrees silently run without the
configured proxy. When injecting HTTP_PROXY/HTTPS_PROXY into a WSL PTY,
probe the address from inside the distro (mirrored networking keeps
loopback working) and otherwise rewrite the hostname to the WSL host
gateway, keeping the rewrite only when the guest confirms it is reachable.
Probes run through runWslProcess with bounded TTL caching; every failure
falls back to the user's original URL.
@coderabbitai

coderabbitai Bot commented Sep 21, 2026 •

Copy link
Copy Markdown
Contributor

Review in Change Stack →

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

No actionable comments were generated in the recent review.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Advanced

Run ID: 8139a1b8-744f-4f6d-8cd7-2e2e6df55b11

📥 Commits

Reviewing files that changed from the base of the PR and between baf8a54 and 469bf0f.

📒 Files selected for processing (2)
  • src/main/rate-limits/claude-pty.test.ts
  • src/main/rate-limits/claude-pty.ts
🚧 Files skipped from review as they are similar to previous changes (2)
  • src/main/rate-limits/claude-pty.test.ts
  • src/main/rate-limits/claude-pty.ts

Included review availability: Your plan provides up to 10 included reviews per hour; 6 remain after this review.

Walkthrough

The change adds WSL guest proxy resolution for loopback proxy URLs. It probes proxy reachability, resolves a host gateway when needed, validates rewritten URLs, and caches probe results. PTY environment construction and Claude PTY launches now use the resolved settings for WSL targets. WSL proxy variables are registered through WSLENV only when the resolution crosses the boundary. Tests cover parsing, probing, rewriting, caching, failure handling, injection hardening, and generated proxy environment variables. The resolver is added to the probe-failure allowlist.

Priority: Low

Merge Risk: Minimal · up to 469bf

The change preserves fallback behavior while routing eligible loopback proxies for WSL; no merge-blocking production risk is evidenced.

🚥 Pre-merge checks | ✅ 3 | ❌ 2

❌ Failed checks (2 warnings)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 29.17% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 24 functions across 10 files. Write docstrings for the functions missing them to satisfy the coverage threshold.
Description check ⚠️ Warning The description covers the change, rationale, testing, security, compatibility, and performance impact. However, the required Linked Issue entry is not provided in the required form: it says no existi… Update the Linked Issue section with the relevant issue reference, such as "Fixes #22024" if that issue tracks this change. Remove or reconcile the statement that no existing issue was found.
✅ Passed checks (3 passed)
Check name Status Explanation
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Title check ✅ Passed The title clearly and concisely describes the main change: rewriting loopback proxy URLs to the WSL host gateway for guest shells.
Full details: Description check

Explanation

The description covers the change, rationale, testing, security, compatibility, and performance impact. However, the required Linked Issue entry is not provided in the required form: it says no existing issue was found, despite referencing #22024 later.

  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3


ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Advanced

Run ID: 89cc9082-2c63-40dd-b0a3-8328c935f16e

📥 Commits

Reviewing files that changed from the base of the PR and between 2872c3f and 1c91c27.

📒 Files selected for processing (8)
  • src/main/ipc/pty/ipc/spawn-env-codex.ts
  • src/main/ipc/pty/provider/local-configure.ts
  • src/main/ipc/pty/runtime/spawn-preflight.ts
  • src/main/rate-limits/claude-pty.test.ts
  • src/main/rate-limits/claude-pty.ts
  • src/main/wsl/__fixtures__/wsl-probe-failure-swallow-allowlist.txt
  • src/main/wsl/wsl-guest-proxy-gateway.test.ts
  • src/main/wsl/wsl-guest-proxy-gateway.ts

Included review availability: Your plan provides up to 10 included reviews per hour; 9 remain after this review.

Comment thread src/main/rate-limits/claude-pty.ts Resolved
Comment thread src/main/wsl/wsl-guest-proxy-gateway.ts Resolved
Comment thread src/main/wsl/wsl-guest-proxy-gateway.ts Resolved

@pullfrog pullfrog Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Caution

The PR's core mechanism does not reach WSL guest shells: the rewritten proxy URL is written into wsl.exe's Windows-side environment, but the proxy keys are never registered in WSLENV, so they are dropped at the boundary. Separately, the new wsl-guest-proxy-gateway.test.ts fails 6 cases on the repo's Linux unit lane because it never stubs process.platform (verified locally on ubuntu-latest: 6 failed | 33 passed).

Reviewed changes

  • New wsl-guest-proxy-gateway.ts — probe-then-rewrite resolver for loopback proxies in WSL, with pure helpers (loopback detection, gateway parsing, /dev/tcp probe script) and bounded TTL caches; ported from ZCode's remote-WSL backend (Apache-2.0, attributed).
  • Local-PTY env wiring — spawn-env-codex.ts, local-configure.ts, and spawn-preflight.ts now pass await wslProxyForTarget(...) into buildPtyHostEnv; the hidden Claude usage PTY resolves the settings and exports the proxy inside its guest bash -lc command.
  • Tests + allowlist — a 39-case unit suite for the helpers/resolver, one claude-pty case, and a probe-failure allowlist entry.

The helper logic itself is sound and well covered, and the hidden Claude-usage path (claude-pty.ts) is the one place the fix is correctly delivered to the guest. The two blocking findings below mean the stated goal — "agents in a WSL pane silently ran without your proxy" — is not yet met for normal panes, and CI is red as-is.

ℹ️ Nitpicks

  • src/main/wsl/wsl-guest-proxy-gateway.ts:44 — the probe defaults a missing port to 443 for https: and 80 otherwise. normalizeProxyUrl accepts socks:/socks4:/socks5: with no port, and those schemes have no WHATWG default, so a valid socks5://localhost is probed at port 80 while any client resolving it uses its own default (typically 1080). Consider skipping the rewrite path rather than probing the wrong port.

Pullfrog  | Fix all ➔ | Fix 👍s ➔ | View workflow run | Using DeepSeek Flash (free via Pullfrog for OSS) | 𝕏

Comment thread src/main/wsl/wsl-guest-proxy-gateway.ts Resolved
Comment thread src/main/wsl/wsl-guest-proxy-gateway.ts Resolved
- register HTTP(S)_PROXY/ALL_PROXY/NO_PROXY in WSLENV for WSL PTYs: WSLENV is
  the only channel that carries host variables into a distro, so the injected
  proxy env — rewritten to the host gateway or not — never reached guest
  shells without this
- treat an errored reachability probe as 'could not ask': keep the user's URL
  instead of racing into a gateway rewrite (matches the JSDoc contract)
- /dev/tcp rejects bracketed IPv6 literals — probe the bare address
- stub process.platform in the unit tests so the suite passes on the Linux CI lane
- check the abort signal right after proxy resolution in the hidden usage PTY
  (three sequential 5s probes must not delay cancellation into a spawn)
@Bandersnatch0x

Copy link
Copy Markdown
Author

All findings from the bot reviews are addressed in 9f6e34e:

  • WSLENV (both bots, Major): buildPtyHostEnv now registers the proxy keys (HTTP(S)_PROXY/ALL_PROXY/NO_PROXY, upper+lower) in WSLENV for WSL PTYs via the shared addWslEnvKeys — the guest shell finally receives the injected (and gateway-rewritten) proxy env. The hidden usage PTY already exported them in-command and is unchanged.
  • Linux CI (Major): the suite stubs process.platform to win32 (the resolver early-returns off-Windows), so it passes on the ubuntu lane.
  • IPv6 /dev/tcp (Major): the probe now uses the bare address (bash rejects bracketed literals); test updated.
  • Probe-error semantics (Major): an errored reachability probe now keeps the user's URL instead of racing into a rewrite — only a definitive 'unreachable' proceeds.
  • claude-pty cancellation (Minor): the abort signal is re-checked right after proxy resolution, so the up-to-15s probe window cannot delay cancellation into a spawn.

@pullfrog pullfrog Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Important

The new WSLENV carry fixes delivery of the resolved proxy into WSL, but it also starts forwarding proxy variables Orca never rewrote — see the inline note.

Reviewed changes

  • Registered the proxy env keys in WSLENV from buildPtyHostEnv when opts.isWsl, so the resolved/rewritten proxy actually crosses the wsl.exe boundary into the distro.
  • Exported PROXY_ENV_KEYS/NO_PROXY_ENV_KEYS from src/shared/network-proxy.ts for that registration.
  • Treated an errored loopback probe as "could not ask" (!== false), so the user's URL survives a probe failure, matching the module's JSDoc.
  • Probed bare IPv6 addresses over /dev/tcp (bracketed literals fail name resolution) and updated the assertion.
  • Stubbed process.platform in the new suite so it passes on the Linux unit lane.
  • Re-checked the abort signal after proxy resolution in fetchViaPty, so a cancellation during the probe window cannot still spawn the hidden PTY.

Pullfrog  | Fix all ➔ | Fix 👍s ➔ | View workflow run | Using DeepSeek Flash (free via Pullfrog for OSS) | 𝕏

Comment thread src/main/ipc/pty/host-env/assembly.ts Resolved
Comment thread src/main/rate-limits/claude-pty.test.ts Resolved
- POSIX-quote the hostname in buildWslProxyProbeScript so a crafted proxy
  host cannot inject a command substitution into the nested bash probe.
- Only forward proxy env keys through WSLENV when the configured proxy URL
  actually crosses the guest boundary (non-loopback), so an env-inherited
  loopback proxy is not leaked into the distro.
- Tighten claude-pty test type-assertions to optional-chained reads.

@pullfrog pullfrog Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Important

The new WSLENV gate closes the inherited-proxy leak, but it also suppresses a loopback proxy the guest has already confirmed reachable (mirrored networking / WSL1), and CI's changed-code cast gate is still red on the reshaped assertions.

Reviewed changes

  • Gated WSLENV proxy registration in buildPtyHostEnv on a new wslConfiguredProxyCrossesBoundary() helper, so only a non-loopback configured URL crosses the wsl.exe boundary.
  • Quoted the probe hostname with quotePosixShell in buildWslProxyProbeScript, hardening the nested bash -c against command substitution, with updated assertions and a new injection test.
  • Reshaped the spawnMock.mock.calls[0] reads in claude-pty.test.ts into optional-chained accesses and added a case asserting the gateway-rewritten proxy is exported inside the WSL launch command.

Pullfrog  | Fix all ➔ | Fix 👍s ➔ | View workflow run | Using DeepSeek Flash (free via Pullfrog for OSS) | 𝕏

Comment thread src/main/ipc/pty/host-env/assembly.ts Resolved
Comment thread src/main/rate-limits/claude-pty.test.ts Resolved
…casts

- resolveWslGuestProxySettings now returns { settings, crossesBoundary }: a
  guest-confirmed loopback (mirrored networking / WSL1) crosses into the guest
  instead of being suppressed alongside unverified loopbacks, while an errored
  probe still stays out. Threaded through wslProxyForTarget and the three spawn
  call sites via a wslProxyResolution option on buildPtyHostEnv.
- Drop the type assertions in claude-pty.test that tripped the changed-code
  cast gate; the untyped mock's calls are already any.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1


ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Advanced

Run ID: 45c9a612-d3f9-4a16-8489-3b694d4ee001

📥 Commits

Reviewing files that changed from the base of the PR and between 1e7d976 and baf8a54.

📒 Files selected for processing (9)
  • src/main/ipc/pty/host-env/assembly.ts
  • src/main/ipc/pty/host-env/types.ts
  • src/main/ipc/pty/ipc/spawn-env-codex.ts
  • src/main/ipc/pty/provider/local-configure.ts
  • src/main/ipc/pty/runtime/spawn-preflight.ts
  • src/main/rate-limits/claude-pty.test.ts
  • src/main/rate-limits/claude-pty.ts
  • src/main/wsl/wsl-guest-proxy-gateway.test.ts
  • src/main/wsl/wsl-guest-proxy-gateway.ts

Included review availability: Your plan provides up to 10 included reviews per hour; 8 remain after this review.

Comment thread src/main/rate-limits/claude-pty.ts Resolved

@pullfrog pullfrog Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ No new issues found.

Reviewed changes

Re-reviewed the delta since the prior pullfrog review (1e7d976 → baf8a54), covering all 11 changed files.

  • Resolver now reports whether the proxy crosses — resolveWslGuestProxySettings returns { settings, crossesBoundary }; a guest-confirmed loopback (mirrored networking / WSL1), a confirmed gateway rewrite, and any non-loopback proxy all set crossesBoundary: true, while an unverified loopback stays out.
  • WSLENV gate consumes the verdict — the three local-PTY callers pass wslProxyResolution and buildPtyHostEnv registers the proxy keys only when crossesBoundary is true, which restores the configured proxy for mirrored/WSL1 users without re-opening the inherited-proxy leak.
  • Hidden Claude usage PTY follows the resolved settings — claude-pty.ts resolves before spawning and exports the resolved proxy inside the guest command.
  • CI unblocked — the consistent-type-assertions casts in claude-pty.test.ts are dropped; pnpm run check:code-quality:changed reports 0 findings, and the 58 tests across the two touched suites pass.

Pullfrog  | View workflow run | Using DeepSeek Flash (free via Pullfrog for OSS) | 𝕏

…ommand

claude-pty exports the resolved proxy inside the guest bash command, so honor
crossesBoundary there too: when a WSL probe cannot confirm a loopback proxy,
drop it rather than forcing a dead egress path in the guest. Covered by tests
for both the crosses and the suppressed cases.

@pullfrog pullfrog Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ No new issues found.

Reviewed changes

Re-reviewed the delta since the prior pullfrog review (baf8a54 → 469bf0f), covering the two touched files plus the full 11-file PR for context.

  • claude-pty.ts now honours crossesBoundary — for a WSL target the resolved proxy is exported into the guest bash -lc command only when the resolver confirms it crosses the boundary; an unverified loopback is dropped from both the Windows-side spawn env and the guest command instead of forcing a dead egress path. Non-WSL still gets wslProxyResolution.settings unchanged.
  • Regression test added — does not export an unverified loopback proxy into the WSL launch command fails on the pre-fix source (verified by in-place revert), the existing proxy test is renamed and pins crossesBoundary: true, and the suite's resolver mock now defaults to crossesBoundary: false.

This closes the one asymmetry tracked from the previous run. pnpm run check:code-quality:changed reports 0 findings and the two touched suites pass (59 tests).

Pullfrog  | View workflow run | Using DeepSeek Flash (free via Pullfrog for OSS) | 𝕏

# Conflicts:
#	src/main/ipc/pty/host-env/assembly.ts
#	src/main/ipc/pty/ipc/spawn-env-codex.ts
#	src/main/ipc/pty/provider/local-configure.ts
#	src/main/ipc/pty/runtime/spawn-preflight.ts
#	src/main/rate-limits/claude-pty.test.ts
#	src/main/rate-limits/claude-pty.ts
#	src/main/wsl/__fixtures__/wsl-probe-failure-swallow-allowlist.txt
@Bandersnatch0x

Copy link
Copy Markdown
Author

Closing this in favour of the upstream WSL-via-orcad series (#27792, #27800, #27819, #27834, #27916, #27933, #27934, #27955), which now owns this area of the product.

The changes here were kept mergeable against main and still pass their checks, but the design they build on predates the orcad host architecture. Rather than maintain a parallel path, this work waits until the official WSL host implementation lands and can absorb it.

No action needed on this PR.

@Bandersnatch0x
Bandersnatch0x deleted the fix/wsl-loopback-proxy-gateway branch October 25, 2026 04:59
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