Skip to content

fix(onboard): bypass host proxy for managed inference hostname#4897

Merged
cv merged 8 commits into
mainfrom
fix/4846-no-proxy-inference-local
Jun 7, 2026
Merged

fix(onboard): bypass host proxy for managed inference hostname#4897
cv merged 8 commits into
mainfrom
fix/4846-no-proxy-inference-local

Conversation

@laitingsheng

@laitingsheng laitingsheng commented Jun 6, 2026

Copy link
Copy Markdown
Contributor

Summary

Follow-up to PR #4331 (fix(onboard): forward host proxy env into sandbox). #4331 started forwarding the host HTTP_PROXY / HTTPS_PROXY / NO_PROXY into openshell sandbox create -- env ... so OpenShell-internal traffic could traverse the host proxy when one is configured. The forwarded NO_PROXY seed list did not yet include the OpenShell-managed inference hostname (inference.local) or the rootless container-host alias (host.containers.internal). When a host HTTP_PROXY is active on macOS + Colima, OpenShell's L7 proxy chains inference.local through the host proxy — which cannot reach an OpenShell-internal hostname — and streaming chat completions stall until the 120 s idle timeout fires (#4846).

This PR seeds inference.local and host.containers.internal into the withLocalNoProxy() augmentation so the regression introduced by #4331's host-proxy forwarding stops short of the managed inference hostname.

Related Issue

Fixes #4846 (regression source: #4331).

Changes

  • src/lib/subprocess-env.ts and nemoclaw/src/lib/subprocess-env.ts (mirrored): append inference.local and host.containers.internal to the seeded NO_PROXY host list in withLocalNoProxy(); JSDoc documents the boundary (host-side subprocesses + openshell sandbox create -- env ...) and the removal condition.
  • src/lib/onboard/http-proxy-preflight.ts: warning copy now names the managed inference hostname and includes it in the suggested export NO_PROXY= line for tools running outside the sandbox. Suppression now also requires inference.local so users with the previous loopback-only guidance still see the new export advice.
  • docs/reference/troubleshooting.mdx: document the full set of host names NemoClaw adds to NO_PROXY when a host HTTP proxy is detected.
  • Regression tests in src/lib/subprocess-env.test.ts and src/lib/onboard/http-proxy-preflight.test.ts, plus test/host-proxy-inference-local-e2e.test.ts (curl-driven E2E proving inference.local reaches a local listener directly when HTTP_PROXY is set). subprocess-env.test.ts also adds negative tests proving arbitrary *.local / .local hostnames are not added to the bypass and that a caller-provided .local entry does not expand the bypass surface. CLI / plugin sync test in test/credential-exposure.test.ts updated to match the new host list.

Scope and boundaries

  • *.local suffix. Deliberately narrow: only exact inference.local is seeded. The reported failure path is the single OpenShell-managed inference hostname; widening to any *.local would change the bypass surface beyond the reported repro without evidence of other affected hostnames. A negative test (subprocess-env.test.ts) pins this behaviour.
  • Sandbox-runtime NO_PROXY is unchanged. scripts/nemoclaw-start.sh continues to set NO_PROXY=localhost,127.0.0.1,::1,${PROXY_HOST} inside the sandbox and intentionally does not include inference.local there — OpenShell's L7 proxy resolves that hostname internally, and bypassing it would force a direct DNS lookup that does not resolve from inside the container. This PR does not touch that runtime layer.
  • Fix surface is host-side env propagation. withLocalNoProxy() runs through appendHostProxyEnvArgs() into openshell sandbox create -- env .... The NO_PROXY entry is consumed by OpenShell at sandbox-create time when it decides whether to chain its L7 proxy through the host HTTP_PROXY for a given hostname. With inference.local in NO_PROXY at sandbox-create time, OpenShell stops tunneling that hostname through the host proxy (the reported Proxy connection error: Broken pipe (os error 32) path).
  • E2E coverage. test/host-proxy-inference-local-e2e.test.ts exercises the env-construction primitive end-to-end via a real curl spawn driven by buildSubprocessEnv() against a local listener bound to inference.local. The full macOS + Colima sandbox path requires a macOS runner and is left to scenario E2E (ubuntu-repo-cloud-openclaw covers the closest cloud-onboard cross-section).

Type of Change

  • Code change (feature, bug fix, or refactor)
  • Code change with doc updates
  • Doc only (prose changes, no code sample modifications)
  • Doc only (includes code sample changes)

Verification

  • npx prek run --all-files passes
  • npm test passes
  • Tests added or updated for new or changed behavior
  • No secrets, API keys, or credentials committed
  • Docs updated for user-facing behavior changes
  • npm run docs builds without warnings (doc changes only)
  • Doc pages follow the style guide (doc changes only)
  • New doc pages include SPDX header and frontmatter (new pages only)

Summary by CodeRabbit

  • Bug Fixes

    • Proxy bypass now also excludes additional local hostnames (inference.local, host.containers.internal, ::1, 0.0.0.0), preventing local services and managed inference from being routed through user proxies; preflight warning now requires inference.local to be present to suppress warnings.
  • Documentation

    • Updated proxy-preflight guidance and warning text to show suggested NO_PROXY/no_proxy exports including managed inference hosts and extra local aliases.
  • Tests

    • Added/updated unit and e2e tests validating the expanded NO_PROXY/no_proxy behavior and direct reachability of inference.local.

Signed-off-by: Tinson Lai tinsonl@nvidia.com

Signed-off-by: Tinson Lai <tinsonl@nvidia.com>
@coderabbitai

coderabbitai Bot commented Jun 6, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 4ae09239-6ce7-4890-aacd-a519e64153ed

📥 Commits

Reviewing files that changed from the base of the PR and between d277e5f and f19cedb.

📒 Files selected for processing (2)
  • docs/reference/troubleshooting.mdx
  • test/onboard.test.ts

📝 Walkthrough

Walkthrough

This PR expands the NO_PROXY/no_proxy allowlist injected into subprocess environments to include additional local hostnames (notably inference.local and host.containers.internal), updates the proxy preflight warning and docs to show the expanded exports, and adjusts/adds unit and e2e tests to validate the behavior.

Changes

NO_PROXY Allowlist Expansion for Local Inference

Layer / File(s) Summary
Core NO_PROXY allowlist expansion and implementation
src/lib/subprocess-env.ts, nemoclaw/src/lib/subprocess-env.ts
withLocalNoProxy now parses existing NO_PROXY/no_proxy, then appends additional local hostnames (including inference.local and host.containers.internal) when an HTTP/HTTPS proxy is detected.
Tests: constants and assertions updated
src/lib/subprocess-env.test.ts, test/credential-exposure.test.ts
Replace the LOCAL_NO_PROXY test constant and update assertions to expect the expanded comma-separated allowlist (adds host.containers.internal, inference.local, ::1, 0.0.0.0, etc.).
Behavioral unit tests for HTTP/HTTPS proxy cases
src/lib/subprocess-env.test.ts
Add unit tests asserting withLocalNoProxy includes inference.local when HTTP_PROXY is set and host.containers.internal when HTTPS_PROXY is set; enforce .local injection rules and preserve caller-provided .local values.
Onboard proxy preflight warning and tests
src/lib/onboard/http-proxy-preflight.ts, src/lib/onboard/http-proxy-preflight.test.ts
Require inference.local alongside loopback entries to suppress the onboard warning; update warning text and suggested NO_PROXY/no_proxy export examples and tests to include inference.local.
End-to-end test ensuring inference.local bypasses host proxy
test/host-proxy-inference-local-e2e.test.ts
New Vitest e2e: starts a local HTTP listener, sets unreachable HTTP_PROXY/HTTPS_PROXY, clears NO_PROXY, builds subprocess env, runs curl --resolve inference.local:..., and asserts curl succeeds and the listener received the request.
Sandbox-create env args test
test/onboard.test.ts
Add test asserting appendHostProxyEnvArgs() synthesizes both NO_PROXY= and no_proxy= entries containing inference.local and host.containers.internal when HTTP_PROXY is configured.
Troubleshooting docs
docs/reference/troubleshooting.mdx
Expand the documented NO_PROXY configuration to include ::1, 0.0.0.0, host.docker.internal, host.containers.internal, and inference.local in examples for NemoClaw-managed subprocesses.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related PRs

  • NVIDIA/NemoClaw#4215: Both PRs are tied to the shared withLocalNoProxy NO_PROXY augmentation: #4215 makes waitForHttp curl probes use an env built via withLocalNoProxy, while the main PR extends withLocalNoProxy’s injected bypass list (e.g., adding inference.local/host.containers.internal)—so the wait-probe behavior changes in tandem.
  • NVIDIA/NemoClaw#4086: Both PRs modify withLocalNoProxy in src/lib/subprocess-env.ts to parse/sanitize the existing NO_PROXY/no_proxy list via split→trim→filter before augmenting it (main PR adds inference.local/host.containers.internal, while the retrieved PR fixes empty comma segments).
  • NVIDIA/NemoClaw#4331: Both PRs are tied to the same proxy/no-proxy plumbing: #4331 forwards host HTTP_PROXY/HTTPS_PROXY/NO_PROXY into sandbox creation via appendHostProxyEnvArgs() (calling withLocalNoProxy), and the main PR updates withLocalNoProxy/onboard test expectations to include inference.local and related hosts in the generated NO_PROXY/no_proxy values.

Suggested labels

platform: macos

Suggested reviewers

  • cv
  • cjagwani

"🐰 I hop the env and tweak the trail,
inference.local follows without fail.
Subprocesses find the local door,
proxies shrug and watch me soar.
Carrots and tests — a tidy trail! 🥕"

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 60.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title 'fix(onboard): bypass host proxy for managed inference hostname' is specific and directly related to the main change—seeding inference.local and host.containers.internal into NO_PROXY to prevent the host proxy from tunneling managed inference traffic.
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.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/4846-no-proxy-inference-local

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

@laitingsheng laitingsheng added area: sandbox OpenShell sandbox lifecycle, runtime, config, or recovery bug-fix PR fixes a bug or regression area: networking DNS, proxy, TLS, ports, host aliases, or connectivity labels Jun 6, 2026
@github-actions

github-actions Bot commented Jun 6, 2026

Copy link
Copy Markdown
Contributor

E2E Advisor Recommendation

Required E2E: cloud-onboard-e2e, inference-routing-e2e, credential-sanitization-e2e
Optional E2E: network-policy-e2e, macos-e2e, test-e2e-ollama-proxy

Dispatch hint: cloud-onboard-e2e,inference-routing-e2e,credential-sanitization-e2e

Auto-dispatched E2E: cloud-onboard-e2e, inference-routing-e2e, credential-sanitization-e2e via nightly-e2e.yaml at f19cedb2dab5ad3b2a0f931efd1f360764668e4dnightly run

Workflow run

Full advisor summary

E2E Recommendation Advisor

Base: origin/main
Head: HEAD
Confidence: high

Required E2E

  • cloud-onboard-e2e (medium-high; live sandbox with NVIDIA_API_KEY): Validates the public install/onboard flow, sandbox health, API key leak checks, and inference.local HTTPS after changing the proxy env passed through onboarding and sandbox creation.
  • inference-routing-e2e (medium; live sandbox, selective tests use NVIDIA_API_KEY where available): Directly exercises inference routing through the OpenShell gateway proxy, credential isolation, and transport/credential error classification, which are the runtime areas most likely to regress if inference.local NO_PROXY seeding is wrong.
  • credential-sanitization-e2e (high; installs and onboards a live sandbox): Provides sandbox-level credential boundary coverage after changing subprocess env propagation. The unit tests cover allowlisting, but this E2E verifies no secret-shaped values leak into the running sandbox/config path.

Optional E2E

  • network-policy-e2e (high; live sandbox with restricted policy): Useful adjacent confidence that inference exemptions, direct-provider blocking, and OpenShell policy enforcement/audit behavior still hold after changing host proxy bypass entries.
  • macos-e2e (medium-high; macOS runner, runs only if Docker is available): The motivating proxy-chain failure mode mentions macOS + Colima/desktop proxy behavior. The existing macOS full E2E is useful platform confidence, though it does not explicitly configure a broken host HTTP_PROXY.
  • test-e2e-ollama-proxy (low; mock backend on ubuntu-latest): PR CI already includes this mock Ollama auth proxy E2E for code changes. It is a cheap adjacent check for local proxy behavior, but it does not validate sandbox-create NO_PROXY seeding for inference.local.

New E2E recommendations

  • host proxy plus sandbox-create inference.local routing (high): The PR adds a host-level curl/Vitest regression for inference.local NO_PROXY, but there is no existing sandbox E2E that sets HTTP_PROXY/http_proxy to a deliberately broken host proxy during openshell sandbox create and then proves a real onboarded sandbox can still route inference.local through OpenShell without host proxy chaining.
    • Suggested test: Add a dispatchable host-proxy-inference-local-sandbox-e2e script/workflow that onboards with HTTP_PROXY/http_proxy pointing at an unreachable local proxy, verifies sandbox creation succeeds, and performs a real inference.local request through the running sandbox.
  • macOS/Colima host proxy regression (medium): The documented failure mode specifically calls out macOS + Colima/desktop proxy behavior, but the existing macOS E2E does not force host HTTP_PROXY/no_proxy conditions. Platform-specific coverage would catch differences in curl/Node/OpenShell proxy handling.
    • Suggested test: Extend or add a macOS E2E variant that configures a broken desktop-style HTTP_PROXY, omits NO_PROXY in the host env, runs onboarding, and asserts inference.local is bypassed only at the host proxy boundary while sandbox runtime still uses OpenShell L7 routing.

Dispatch hint

  • Workflow: nightly-e2e.yaml
  • jobs input: cloud-onboard-e2e,inference-routing-e2e,credential-sanitization-e2e

@github-actions

github-actions Bot commented Jun 6, 2026

Copy link
Copy Markdown
Contributor

E2E Scenario Advisor Recommendation

Required scenario E2E: ubuntu-repo-cloud-openclaw
Optional scenario E2E: wsl-repo-cloud-openclaw

Dispatch required scenario E2E:

  • gh workflow run e2e-scenarios.yaml --ref <pr-head-ref> --field scenarios=ubuntu-repo-cloud-openclaw

Workflow run

Full scenario advisor summary

E2E Scenario Advisor

Base: origin/main
Head: HEAD
Confidence: high

Required scenario E2E

  • ubuntu-repo-cloud-openclaw: Changes modify subprocess environment forwarding and onboarding HTTP proxy preflight behavior, including NO_PROXY seeding for inference.local and container-host aliases at sandbox-create time. The Ubuntu repo cloud OpenClaw scenario is the smallest routed scenario that exercises repo-current onboarding, sandbox creation, gateway health, and the cloud inference.local path from inside the sandbox.
    • Dispatch: gh workflow run e2e-scenarios.yaml --ref <pr-head-ref> --field scenarios=ubuntu-repo-cloud-openclaw

Optional scenario E2E

  • wsl-repo-cloud-openclaw: Optional platform coverage for the same onboarding/subprocess environment surface on WSL, where proxy and host-reachability behavior can differ. This is not the primary target because the core changed surface is covered by the Ubuntu cloud OpenClaw scenario.
    • Dispatch: gh workflow run e2e-scenarios.yaml --ref <pr-head-ref> --field scenarios=wsl-repo-cloud-openclaw

Relevant changed files

  • nemoclaw/src/lib/subprocess-env.ts
  • src/lib/onboard/http-proxy-preflight.ts
  • src/lib/subprocess-env.ts

@github-actions

github-actions Bot commented Jun 6, 2026

Copy link
Copy Markdown
Contributor

PR Review Advisor

Findings: 0 needs attention, 1 worth checking, 0 nice ideas
Top item: PR review advisor unavailable

Review findings

🛠️ Needs attention

  • None.

🔎 Worth checking

  • PR review advisor unavailable: The automated advisor could not complete: Could not parse JSON from PR review advisor output; see /home/runner/work/NemoClaw/NemoClaw/artifacts/pr-review-advisor/pr-review-advisor-raw-output.txt
    • Recommendation: Re-run the PR Review Advisor or perform a manual review.
    • Evidence: Could not parse JSON from PR review advisor output; see /home/runner/work/NemoClaw/NemoClaw/artifacts/pr-review-advisor/pr-review-advisor-raw-output.txt

🌱 Nice ideas

  • None.
Consider writing more tests for
  • **Runtime validation** — Add or identify targeted runtime/integration validation for the changed behavior; do not report external E2E job pass/fail here.. Runtime/sandbox/infrastructure paths need behavioral runtime validation: docs/reference/troubleshooting.mdx, nemoclaw/src/lib/subprocess-env.ts, src/lib/onboard/http-proxy-preflight.ts, src/lib/subprocess-env.ts.

Workflow run details

This is an automated advisory review. A human maintainer must make the final merge decision.

@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.

🧹 Nitpick comments (1)
nemoclaw/src/lib/subprocess-env.ts (1)

63-66: ⚡ Quick win

Minor formatting inconsistency with the CLI mirror.

The CLI version (src/lib/subprocess-env.ts line 63) chains .split(",").map((s) => s.trim()).filter(Boolean) on a single line, while this plugin version spreads it across lines 63-66. Per the mirror-file note (line 17-18), these files should stay in sync.

Consider aligning the formatting to match the CLI version for consistency.

♻️ Align with CLI formatting
-    const parts = current
-      .split(",")
-      .map((s) => s.trim())
-      .filter(Boolean);
+    const parts = current.split(",").map((s) => s.trim()).filter(Boolean);
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@nemoclaw/src/lib/subprocess-env.ts` around lines 63 - 66, The file has a
formatting mismatch for the expression that builds parts; change the multi-line
chain in the const parts assignment to the single-line chained form used in the
CLI mirror: replace the current newline-separated ".split(",").map((s) =>
s.trim()).filter(Boolean)" sequence with a single-line chain on the same
statement where const parts = current.split(",").map((s) =>
s.trim()).filter(Boolean); so the expression in subprocess-env.ts (the const
parts assignment) matches the CLI formatting.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Nitpick comments:
In `@nemoclaw/src/lib/subprocess-env.ts`:
- Around line 63-66: The file has a formatting mismatch for the expression that
builds parts; change the multi-line chain in the const parts assignment to the
single-line chained form used in the CLI mirror: replace the current
newline-separated ".split(",").map((s) => s.trim()).filter(Boolean)" sequence
with a single-line chain on the same statement where const parts =
current.split(",").map((s) => s.trim()).filter(Boolean); so the expression in
subprocess-env.ts (the const parts assignment) matches the CLI formatting.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: be3efee2-52b7-4b58-b8dc-ec91bc808e39

📥 Commits

Reviewing files that changed from the base of the PR and between 76f6c77 and 9998a28.

📒 Files selected for processing (6)
  • nemoclaw/src/lib/subprocess-env.ts
  • src/lib/onboard/http-proxy-preflight.test.ts
  • src/lib/onboard/http-proxy-preflight.ts
  • src/lib/subprocess-env.test.ts
  • src/lib/subprocess-env.ts
  • test/credential-exposure.test.ts

Signed-off-by: Tinson Lai <tinsonl@nvidia.com>
@laitingsheng laitingsheng added the area: e2e End-to-end tests, nightly failures, or validation infrastructure label Jun 6, 2026
@github-actions

github-actions Bot commented Jun 6, 2026

Copy link
Copy Markdown
Contributor

Selective E2E Results — ✅ All requested jobs passed

Run: 27067948583
Target ref: 7c776895b1c426e10c61cff99198ad40fbf54f60
Workflow ref: main
Requested jobs: inference-routing-e2e,credential-sanitization-e2e
Summary: 2 passed, 0 failed, 0 skipped

Job Result
credential-sanitization-e2e ✅ success
inference-routing-e2e ✅ success

Signed-off-by: Tinson Lai <tinsonl@nvidia.com>
@github-actions

github-actions Bot commented Jun 6, 2026

Copy link
Copy Markdown
Contributor

@github-actions

github-actions Bot commented Jun 6, 2026

Copy link
Copy Markdown
Contributor

Selective E2E Results — ✅ All requested jobs passed

Run: 27069185612
Target ref: 55b5f8f30f03d69178c96ff9396b777879d4e409
Workflow ref: main
Requested jobs: inference-routing-e2e,credential-sanitization-e2e
Summary: 2 passed, 0 failed, 0 skipped

Job Result
credential-sanitization-e2e ✅ success
inference-routing-e2e ✅ success

@laitingsheng laitingsheng added the v0.0.61 Release target label Jun 6, 2026
@github-actions

github-actions Bot commented Jun 6, 2026

Copy link
Copy Markdown
Contributor

Selective E2E Results — ✅ All requested jobs passed

Run: 27069621748
Target ref: 69a3ec7f0b843fbdff2c2da096aec654f5296c64
Workflow ref: main
Requested jobs: cloud-onboard-e2e,messaging-compatible-endpoint-e2e,inference-routing-e2e,credential-sanitization-e2e
Summary: 4 passed, 0 failed, 0 skipped

Job Result
cloud-onboard-e2e ✅ success
credential-sanitization-e2e ✅ success
inference-routing-e2e ✅ success
messaging-compatible-endpoint-e2e ✅ success

@laitingsheng laitingsheng removed the v0.0.61 Release target label Jun 6, 2026
Signed-off-by: Tinson Lai <tinsonl@nvidia.com>
@github-actions

github-actions Bot commented Jun 6, 2026

Copy link
Copy Markdown
Contributor

Selective E2E Results — ✅ All requested jobs passed

Run: 27071742298
Target ref: e6dcbd2cbbf48f8bb99903804cc9015540a28b0f
Workflow ref: main
Requested jobs: inference-routing-e2e,messaging-compatible-endpoint-e2e
Summary: 2 passed, 0 failed, 0 skipped

Job Result
inference-routing-e2e ✅ success
messaging-compatible-endpoint-e2e ✅ success

Signed-off-by: Tinson Lai <tinsonl@nvidia.com>

@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.

🧹 Nitpick comments (2)
src/lib/subprocess-env.test.ts (2)

110-119: ⚡ Quick win

Consider checking both NO_PROXY and no_proxy for consistency.

The implementation in withLocalNoProxy modifies both NO_PROXY and no_proxy (Context snippet 1), and earlier tests (lines 96-101, 103-108) verify both variables. For consistency and completeness, consider adding an assertion for no_proxy as well.

♻️ Proposed enhancement for test completeness
   it("does not inject a broad .local suffix or arbitrary *.local hostnames", () => {
     const env: Record<string, string> = { HTTP_PROXY: "http://127.0.0.1:8118" };
     withLocalNoProxy(env);
     const parts = (env.NO_PROXY ?? "").split(",");
     expect(parts).not.toContain(".local");
     expect(parts).not.toContain("*.local");
     expect(parts).not.toContain("evil.local");
     expect(parts).not.toContain("attacker.local");
     expect(parts.filter((p) => p.endsWith(".local"))).toEqual(["inference.local"]);
+    const noParts = (env.no_proxy ?? "").split(",");
+    expect(noParts.filter((p) => p.endsWith(".local"))).toEqual(["inference.local"]);
   });
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/lib/subprocess-env.test.ts` around lines 110 - 119, The test only asserts
against env.NO_PROXY but the helper withLocalNoProxy updates both NO_PROXY and
no_proxy; update this test to also inspect env.no_proxy the same way (split on
commas and assert it does not contain ".local", "*.local", "evil.local",
"attacker.local" and that the only .local suffix present is "inference.local")
so both NO_PROXY and no_proxy are validated consistently alongside the existing
checks in withLocalNoProxy.

121-133: ⚡ Quick win

Consider checking both NO_PROXY and no_proxy for consistency.

The test sets both NO_PROXY and no_proxy in the input (lines 124-125), but only verifies NO_PROXY in the assertions. Since withLocalNoProxy modifies both variables and earlier tests verify both, consider adding assertions for no_proxy as well.

♻️ Proposed enhancement for test completeness
   it("preserves a caller-provided .local entry without expanding the bypass", () => {
     const env: Record<string, string> = {
       HTTP_PROXY: "http://127.0.0.1:8118",
       NO_PROXY: "trusted.local",
       no_proxy: "trusted.local",
     };
     withLocalNoProxy(env);
     const parts = (env.NO_PROXY ?? "").split(",");
     expect(parts).toContain("trusted.local");
     expect(parts).toContain("inference.local");
     expect(parts).not.toContain(".local");
     expect(parts).not.toContain("*.local");
+    const noParts = (env.no_proxy ?? "").split(",");
+    expect(noParts).toContain("trusted.local");
+    expect(noParts).toContain("inference.local");
+    expect(noParts).not.toContain(".local");
+    expect(noParts).not.toContain("*.local");
   });
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/lib/subprocess-env.test.ts` around lines 121 - 133, The test currently
only asserts against env.NO_PROXY even though the input sets both NO_PROXY and
no_proxy and withLocalNoProxy updates both; update the test for completeness by
also reading and splitting env.no_proxy (e.g., const lowerParts = (env.no_proxy
?? "").split(",")) and add the same expectations used for parts
(expect(lowerParts).toContain("trusted.local");
expect(lowerParts).toContain("inference.local");
expect(lowerParts).not.toContain(".local");
expect(lowerParts).not.toContain("*.local");) so both NO_PROXY and no_proxy are
validated after calling withLocalNoProxy.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Nitpick comments:
In `@src/lib/subprocess-env.test.ts`:
- Around line 110-119: The test only asserts against env.NO_PROXY but the helper
withLocalNoProxy updates both NO_PROXY and no_proxy; update this test to also
inspect env.no_proxy the same way (split on commas and assert it does not
contain ".local", "*.local", "evil.local", "attacker.local" and that the only
.local suffix present is "inference.local") so both NO_PROXY and no_proxy are
validated consistently alongside the existing checks in withLocalNoProxy.
- Around line 121-133: The test currently only asserts against env.NO_PROXY even
though the input sets both NO_PROXY and no_proxy and withLocalNoProxy updates
both; update the test for completeness by also reading and splitting
env.no_proxy (e.g., const lowerParts = (env.no_proxy ?? "").split(",")) and add
the same expectations used for parts
(expect(lowerParts).toContain("trusted.local");
expect(lowerParts).toContain("inference.local");
expect(lowerParts).not.toContain(".local");
expect(lowerParts).not.toContain("*.local");) so both NO_PROXY and no_proxy are
validated after calling withLocalNoProxy.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 3c817a82-e866-46e7-82db-0543064aaebd

📥 Commits

Reviewing files that changed from the base of the PR and between e6dcbd2 and 0e610b9.

📒 Files selected for processing (3)
  • nemoclaw/src/lib/subprocess-env.ts
  • src/lib/subprocess-env.test.ts
  • src/lib/subprocess-env.ts
🚧 Files skipped from review as they are similar to previous changes (2)
  • nemoclaw/src/lib/subprocess-env.ts
  • src/lib/subprocess-env.ts

@github-actions

github-actions Bot commented Jun 6, 2026

Copy link
Copy Markdown
Contributor

Selective E2E Results — ✅ All requested jobs passed

Run: 27072262172
Target ref: 0e610b9848cc0c0109011bd78bdfe4f638202717
Workflow ref: main
Requested jobs: inference-routing-e2e,messaging-compatible-endpoint-e2e,credential-sanitization-e2e
Summary: 3 passed, 0 failed, 0 skipped

Job Result
credential-sanitization-e2e ✅ success
inference-routing-e2e ✅ success
messaging-compatible-endpoint-e2e ✅ success

Signed-off-by: Tinson Lai <tinsonl@nvidia.com>
Signed-off-by: Tinson Lai <tinsonl@nvidia.com>
@github-actions

github-actions Bot commented Jun 7, 2026

Copy link
Copy Markdown
Contributor

Selective E2E Results — ✅ All requested jobs passed

Run: 27082239620
Target ref: d277e5f233e89626a6fa195de69a668cda7ced44
Workflow ref: main
Requested jobs: cloud-onboard-e2e,inference-routing-e2e,messaging-compatible-endpoint-e2e
Summary: 3 passed, 0 failed, 0 skipped

Job Result
cloud-onboard-e2e ✅ success
inference-routing-e2e ✅ success
messaging-compatible-endpoint-e2e ✅ success

@github-actions

github-actions Bot commented Jun 7, 2026

Copy link
Copy Markdown
Contributor

Selective E2E Results — ✅ All requested jobs passed

Run: 27082427593
Target ref: f19cedb2dab5ad3b2a0f931efd1f360764668e4d
Workflow ref: main
Requested jobs: cloud-onboard-e2e,inference-routing-e2e,credential-sanitization-e2e
Summary: 3 passed, 0 failed, 0 skipped

Job Result
cloud-onboard-e2e ✅ success
credential-sanitization-e2e ✅ success
inference-routing-e2e ✅ success

@laitingsheng laitingsheng added the v0.0.61 Release target label Jun 7, 2026
@cv cv merged commit d7aa5e0 into main Jun 7, 2026
39 checks passed
@cv cv deleted the fix/4846-no-proxy-inference-local branch June 7, 2026 04:34
@coderabbitai coderabbitai Bot mentioned this pull request Jun 7, 2026
12 tasks
miyoungc added a commit that referenced this pull request Jun 8, 2026
## Summary
- Add the v0.0.61 release notes from the GitHub dev announcement.
- Document managed vLLM recovery after host reboot and Slack
denied-mention feedback.
- Refresh generated `nemoclaw-user-*` skills from the source docs.

## Source summary
- #4983 -> `docs/about/release-notes.mdx`: Added the v0.0.61 release
summary from the dev announcement and linked behavior groups to deeper
docs.
- #4904 -> `docs/inference/use-local-inference.mdx`: Documented that
managed vLLM restarts the `nemoclaw-vllm` container after host reboot
during recovery.
- #4933 -> `docs/manage-sandboxes/messaging-channels.mdx`: Documented
Slack sender feedback for denied channel `@mention` events.
- #4879, #4915, #4935, #4759, #4164, #4888, #4897, #4944, #4959 ->
`.agents/skills/`: Refreshed generated user skills from the current
source docs for release prep.

## Verification
- `python3 scripts/docs-to-skills.py docs/ .agents/skills/ --prefix
nemoclaw-user --doc-platform fern-mdx`
- `npm run docs` (passed outside the tool sandbox after `tsx` IPC pipe
creation was blocked in the sandbox)
- `npm run build:cli` (refreshed local `dist/` for the pre-push
TypeScript hook)
- Commit and pre-push hooks passed, including docs-to-skills
verification, markdownlint, gitleaks, skills YAML tests, and CLI
TypeScript.

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **Documentation**
  * Updated sandbox security documentation with file descriptor limits.
  * Changed default inference model for DGX Station profile.
  * Enhanced agent policy and backup/restore documentation.
  * Improved command reference examples with clearer formatting.
  * Clarified Slack messaging denial notice behavior.
  * Added automatic vLLM container recovery during host reboot.
  * Updated release notes for v0.0.61.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area: e2e End-to-end tests, nightly failures, or validation infrastructure area: networking DNS, proxy, TLS, ports, host aliases, or connectivity area: sandbox OpenShell sandbox lifecycle, runtime, config, or recovery bug-fix PR fixes a bug or regression v0.0.61 Release target

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[macOS][Policy&Network] inference.local routed through host HTTP_PROXY on Colima — large model inference fails with 120s timeout

3 participants