fix(install): defer Windows WSL provider selection until Node.js reads Docker config - #8209
Conversation
…s Docker config Express setup ran before the Node.js bootstrap, so a readable Docker configuration it could not parse resolved as non-local and pinned install-ollama on hosts whose Docker Desktop topology supports Windows-host Ollama. Selection now waits for the runtime and applies the same check. Keep the WSL-local install entry on offer when the container runtime cannot reach an installed Windows-host Ollama, so a requested install-ollama still has a provider to select. Signed-off-by: Tinson Lai <tinsonl@nvidia.com>
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Enterprise Run ID: 📒 Files selected for processing (1)
💤 Files with no reviewable changes (1)
📝 WalkthroughWalkthroughThe WSL installer defers Ollama provider selection until Node.js can resolve Docker configuration. Onboarding checks Windows-host Ollama reachability and retains WSL-local installation when the host service is inaccessible. Tests cover provider resolution, cleanup injection, policy handling, and integration timing. ChangesWSL Ollama provider handling
Test seam updates
Estimated code review effort: 3 (Moderate) | ~20 minutes Possibly related PRs
Suggested labels: 🚥 Pre-merge checks | ✅ 3 | ❌ 2❌ Failed checks (2 warnings)
✅ Passed checks (3 passed)
✨ Finishing Touches 💡 1📝 Generate docstrings 💡
🧪 Generate unit tests (beta)
Comment |
Code Coverage OverviewLanguages: TypeScript TypeScript / code-coverage/pluginThe overall coverage in commit 6bca27b in the TypeScript / code-coverage/cliThe overall coverage in commit 6bca27b in the Show a code coverage summary of the most impacted files.
Updated |
|
🌿 Preview your docs: https://nvidia-preview-pr-8209.docs.buildwithfern.com/nemoclaw |
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 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.
Inline comments:
In `@src/lib/onboard/provider-host-state.ts`:
- Line 223: Update the value assigned to windowsHostOllamaSupported in the
provider-host state construction to require both
windowsHostOllamaDockerRequirement.supported and windowsOllamaReachable, so it
represents usable Windows-host Ollama reachability rather than Docker topology
alone. Add a regression test covering Docker Desktop with an installed but
unreachable Windows-host daemon and verify install-ollama remains available.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Enterprise
Run ID: b6109db5-74c2-4f08-84a3-3fed27b56c6b
📒 Files selected for processing (7)
docs/get-started/windows-preparation.mdxscripts/install.shsrc/lib/onboard/ollama-install-menu.test.tssrc/lib/onboard/ollama-install-menu.tssrc/lib/onboard/provider-host-state.test.tssrc/lib/onboard/provider-host-state.tstest/install-express-wsl-ollama.test.ts
PR Review Advisor — InformationalAdvisor assessment: Informational / low confidence Model lanes
Second-opinion terminology and E2E selections are advisory. They do not change the primary assessment or E2E / PR Gate. 3 semantic terminology decisionsTerminology decisions are advisory. They affect the assessment only when a separate finding identifies concrete semantic impact.
E2E guidanceAdvisory only. E2E / PR Gate selects and runs jobs independently. Recommended E2E: This automated review informs maintainers. Warnings and suggestions do not require a response. A maintainer decides whether to merge. |
cv
left a comment
There was a problem hiding this comment.
The current wiring does not implement the documented reachability rule. detectInferenceProviderHostState passes only windowsHostOllamaDockerRequirement.supported as windowsHostOllamaSupported, even though windowsOllamaReachable is computed immediately above. On Docker Desktop with an installed but unreachable Windows-host daemon, usableWindowsOllama remains true and suppresses the WSL-local install-ollama entry. Pass actual usability (topology support and daemon reachability) and add a regression test where Docker Desktop is supported but the host probe fails.
Security review: no hardcoded secret, unsafe parser, authorization bypass, dependency, cryptography, header, or privilege regression was found in the current diff. The installer/onboarding correctness defect above blocks approval because it can leave the user without the fallback provider that this PR promises. The branch is also behind main; refresh it and obtain current required E2E evidence after the fix. Complete the documentation-writer review receipt for the changed Windows page on the final head.
cv
left a comment
There was a problem hiding this comment.
Reviewed commit 9828f6c16. The only change after the prior review is the main merge, so the reachability defect remains: windowsHostOllamaSupported receives topology support without windowsOllamaReachable. An installed but unreachable Windows daemon can still suppress the WSL-local install entry. Pass actual usability and add the Docker Desktop/unreachable-daemon regression test requested in the prior review.
The shared aiohttp main-CI failure is tracked by #8213 and does not replace this code correction. After the fix, rerun required CI/E2E and the documentation-writer review for the resulting commit.
Signed-off-by: Julie Yaunches <jyaunches@nvidia.com>
Signed-off-by: Julie Yaunches <jyaunches@nvidia.com>
jyaunches
left a comment
There was a problem hiding this comment.
Reviewed exact head f54c3a6. This is the right solution for #8199: it keeps the authoritative JSON parser, defers WSL provider selection only until Node.js is available, preserves fail-closed remote Docker handling, and requires Windows-host Ollama reachability before suppressing the WSL-local fallback. All actionable CodeRabbit and published PR Review Advisor feedback is addressed; the primary advisor reports merge_as_is with zero findings. Required CI and the selected cloud-onboard, onboard-repair, and onboard-resume E2E scenarios pass. Security review found no issues across the nine required categories.
Signed-off-by: Julie Yaunches <jyaunches@nvidia.com>
Signed-off-by: Julie Yaunches <jyaunches@nvidia.com>
Signed-off-by: Julie Yaunches <jyaunches@nvidia.com>
|
Note GitHub couldn't provide a complete incremental comparison for this pull request, so CodeRabbit is performing a full review instead. This review may take a little longer. |
|
CI for #8278 has now timed out twice in the unchanged To preserve Julie Yaunches's authorship when those commits are transferred to a focused CI repair, repository policy requires Julie's own DCO declaration in this PR description. Julie, please add this line to the description yourself:
Maintainers cannot add or copy that declaration on a contributor's behalf. No code change is requested. |
There was a problem hiding this comment.
🧹 Nitpick comments (1)
src/lib/tunnel/services.test.ts (1)
454-456: 🩺 Stability & Availability | 🔵 Trivial | ⚡ Quick winCover the default Ollama cleanup path.
stopAllForTestalways injectsunloadOllamaModels, so the changed tests exercise only the injected branch. Add or retain one test that callsstopAllwithout this option, mocks../inference/ollama/proxy, and verifies that the fallback cleanup runs.As per path instructions, tests must verify behavior through the public boundary and mock external dependencies instead of calling a real NVIDIA API.
🤖 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/tunnel/services.test.ts` around lines 454 - 456, Update the tests around stopAllForTest and the public stopAll API to cover the default cleanup path without injecting unloadOllamaModels. Mock ../inference/ollama/proxy, call stopAll without the option, and verify the fallback Ollama cleanup executes without contacting a real NVIDIA API; retain the injected-branch coverage separately.Source: Path instructions
🤖 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/tunnel/services.test.ts`:
- Around line 454-456: Update the tests around stopAllForTest and the public
stopAll API to cover the default cleanup path without injecting
unloadOllamaModels. Mock ../inference/ollama/proxy, call stopAll without the
option, and verify the fallback Ollama cleanup executes without contacting a
real NVIDIA API; retain the injected-branch coverage separately.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Enterprise
Run ID: 0c825694-aaa7-48c8-b4cb-f3134042d293
📒 Files selected for processing (11)
docs/get-started/windows-preparation.mdxscripts/install.shsrc/lib/onboard/ollama-install-menu.test.tssrc/lib/onboard/ollama-install-menu.tssrc/lib/onboard/provider-host-state.test.tssrc/lib/onboard/provider-host-state.tssrc/lib/shields/index.test.tssrc/lib/state/onboard-session-station-express.test.tssrc/lib/tunnel/services.test.tssrc/lib/tunnel/services.tstest/install-express-wsl-ollama.test.ts
🚧 Files skipped from review as they are similar to previous changes (7)
- src/lib/onboard/provider-host-state.ts
- test/install-express-wsl-ollama.test.ts
- src/lib/onboard/ollama-install-menu.test.ts
- src/lib/onboard/ollama-install-menu.ts
- src/lib/onboard/provider-host-state.test.ts
- docs/get-started/windows-preparation.mdx
- scripts/install.sh
Signed-off-by: Apurv Kumaria <akumaria@nvidia.com>
Signed-off-by: Apurv Kumaria <akumaria@nvidia.com>
Signed-off-by: Apurv Kumaria <akumaria@nvidia.com>
<!-- markdownlint-disable MD041 --> ## Summary Add the canonical dated changelog entry for the planned NemoClaw v0.0.103 release. The new `docs/changelog/2026-08-05.mdx` entry uses the exact `## v0.0.103` heading and summarizes supported user-visible changes merged since v0.0.102. ## Changes - Add the parser-safe MDX SPDX header, three-paragraph release summary, and detailed grouped bullets to `docs/changelog/2026-08-05.mdx`. - Link each release-note group to the most specific published OpenClaw, Hermes, or Deep Agents documentation routes. - Exclude dormant MXC and Podman foundations, internal managed-inference adapters, test-only changes, and maintainer tooling from the supported product narrative. ### Source summary - [#8082](#8082) -> `docs/changelog/2026-08-05.mdx`: Document the new one-command agent launch flow. - [#8314](#8314) -> `docs/changelog/2026-08-05.mdx`: Document managed vLLM host capability validation and restart handling. - [#8248](#8248) -> `docs/changelog/2026-08-05.mdx`: Record the DGX Spark Qwen profile MTP default change. - [#8223](#8223) -> `docs/changelog/2026-08-05.mdx`: Record explicit model preservation across provider switches. - [#8209](#8209) -> `docs/changelog/2026-08-05.mdx`: Document corrected Windows WSL provider selection. - [#8316](#8316) -> `docs/changelog/2026-08-05.mdx`: Record clean managed-checkout reuse after installation. - [#8239](#8239) -> `docs/changelog/2026-08-05.mdx`: Record the packaged-service teardown fallback. - [#8247](#8247) -> `docs/changelog/2026-08-05.mdx`: Document uninstall behavior for an already-removed sandbox. - [#7998](#7998) -> `docs/changelog/2026-08-05.mdx`: Record preserved container-start diagnostics. - [#8027](#8027) -> `docs/changelog/2026-08-05.mdx`: Record journal-backed not-ready repair authority. - [#7812](#7812) -> `docs/changelog/2026-08-05.mdx`: Document actionable rebuild preflight diagnostics. - [#8222](#8222) -> `docs/changelog/2026-08-05.mdx`: Record redacted top-level CLI failures. - [#8313](#8313) -> `docs/changelog/2026-08-05.mdx`: Record structured MCP bridge destruction failures. - [#8211](#8211) -> `docs/changelog/2026-08-05.mdx`: Document cleanup of incomplete snapshot captures. - [#8212](#8212) -> `docs/changelog/2026-08-05.mdx`: Document best-effort post-restore policy reconciliation. - [#8245](#8245) -> `docs/changelog/2026-08-05.mdx`: Clarify manifest-defined OpenClaw workspace persistence. - [#8254](#8254) -> `docs/changelog/2026-08-05.mdx`: Include corrected snapshot restore selection guidance. - [#8238](#8238) -> `docs/changelog/2026-08-05.mdx`: Document preservation of managed MCP policy entries. - [#7568](#7568) -> `docs/changelog/2026-08-05.mdx`: Record mutable-default Shields rollback preservation. - [#8200](#8200) -> `docs/changelog/2026-08-05.mdx`: Record truthful Shields state after a rejected transition. - [#7895](#7895) -> `docs/changelog/2026-08-05.mdx`: Record descriptor-bound Shields lock inspection. - [#7892](#7892) -> `docs/changelog/2026-08-05.mdx`: Document the canonical Hermes dashboard profile and migration. - [#7871](#7871) -> `docs/changelog/2026-08-05.mdx`: Document fail-closed Hermes cron restore. - [#7894](#7894) -> `docs/changelog/2026-08-05.mdx`: Record the reset Hermes health budget after recovery. - [#8228](#8228) -> `docs/changelog/2026-08-05.mdx`: Document Hermes build-time corporate CA trust. - [#8206](#8206) -> `docs/changelog/2026-08-05.mdx`: Document bounded Deep Agents Code failure classification. - [#8297](#8297) -> `docs/changelog/2026-08-05.mdx`: Record reuse of the published Deep Agents Code base image. - [#8321](#8321) -> `docs/changelog/2026-08-05.mdx`: Document aligned endpoint SSRF protections and userinfo rejection. - [#8299](#8299) -> `docs/changelog/2026-08-05.mdx`: Document the fail-closed `setpriv` transition in managed images. - [#7603](#7603) -> `docs/changelog/2026-08-05.mdx`: Record corrected confidentiality-root traversal. - [#8334](#8334) -> `docs/changelog/2026-08-05.mdx`: Record removal of the unsupported logs audit example. - [#8256](#8256) -> `docs/changelog/2026-08-05.mdx`: Record reordered network-policy walkthrough prerequisites. - [#7767](#7767) -> `docs/changelog/2026-08-05.mdx`: Record platform runtime shape validation. ## Type of Change - [ ] Code change (feature, bug fix, or refactor) - [ ] Code change with doc updates - [x] Doc only (prose changes, no code sample modifications) - [ ] Doc only (includes code sample changes) ## Quality Gates - [ ] Tests added or updated for changed behavior - [x] Existing tests cover changed behavior — justification: `npx vitest run test/changelog-docs.test.ts` passed all 6 tests. - [ ] Tests not applicable — justification: - [x] Docs updated for user-facing behavior changes - [ ] Docs not applicable — justification: - [ ] Sensitive paths changed (security, policy, credentials, preflight, onboarding, inference, runner, sandbox, or messaging) - [ ] Sensitive-path review completed or maintainer-approved waiver recorded — reviewer/approval link/justification: - [ ] Non-success, skipped, or missing CI check accepted by maintainer — check name, approval link, and follow-up issue: ## Documentation Writer Review - [ ] Documentation writer subagent reviewed the completed changes - Result: `docs-updated` - Evidence: `docs/changelog/2026-08-05.mdx` follows the release-prep and documentation writing rules. The changelog contract tests passed 6/6, and `npm run docs` completed with 0 errors and the repository's 2 existing Fern warnings. - Agent: Codex Desktop <!-- docs-review-head-sha: 66fcd80 --> <!-- docs-review-agents-blob-sha: 3dd7c24 --> ## DGX Station Hardware Evidence - [ ] Tested on DGX Station - Tested commit: Not applicable. - Station profile/scenario: Not applicable. - Result: Not applicable. - Supporting evidence: Not applicable. ## Verification - [x] PR description includes a `Signed-off-by:` line and every commit appears as `Verified` in GitHub - [x] Normal `pre-commit`, `commit-msg`, and `pre-push` hooks passed, or `npm run validate:pr` passed after refreshing `origin/main` when hooks were skipped or unavailable - [x] Targeted behavior tests pass for the current change set, or tests are marked not applicable above — `npx vitest run test/changelog-docs.test.ts`: 1 file and 6 tests passed. - [ ] Applicable broad gate passed — `npm test` for broad runtime/test-harness changes; `npm run check` for repo-wide validation/coverage changes — command/result: Not run for this doc-only change. - [x] Quality Gates section completed with required justifications or waivers - [x] No secrets, API keys, or credentials committed - [ ] `npm run docs` builds without warnings (doc changes only) — completed with 0 errors and 2 existing Fern warnings. - [x] Doc pages follow the [style guide](https://github.com/NVIDIA/NemoClaw/blob/main/docs/CONTRIBUTING.md) (doc changes only) - [ ] New doc pages include SPDX header and frontmatter (new pages only) — the native changelog uses the required parser-safe MDX SPDX comment and does not use page frontmatter. --- Signed-off-by: Charan Jagwani <cjagwani@nvidia.com> <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Documentation** * Added release notes for v0.0.103. * Documented the new `nemoclaw launch` command. * Included updates covering onboarding, inference, installation, recovery, snapshots, security, integrations, endpoint validation, sandbox hardening, and related guidance. <!-- end of auto-generated comment: release notes by coderabbit.ai -->
Summary
Express setup chose the Windows WSL inference provider before the installer had installed Node.js, so a readable Docker configuration that it could not parse resolved as non-local and pinned
install-ollama. Onboarding then detected the Windows-host Ollama, withheld that provider, and stopped before sandbox creation. Express selection now waits for the Node.js runtime and applies the same Docker Desktop check, and an installed Windows-host Ollama that the container runtime cannot reach no longer withholds the WSL-local install entry.Related Issue
Fixes #8199
Changes
express_wsl_docker_context_needs_nodeinscripts/install.sh, true only when a readable Docker configuration decides the context and no Node.js can parse it yet.select_express_wsl_ollama_provider, which selects Windows-host Ollama when the topology proves it, defers when only the missing runtime blocks the decision, and otherwise selects WSL-local Ollama.resolve_pending_express_wsl_provider, called afterinstall_nodejsandensure_supported_runtime, which repeats the check with the exact configuration parse and reports the selected provider.install-ollamamenu entry only when the sandbox can reach the detected Windows-host Ollama, and pass that reachability fromdetectInferenceProviderHostState.The deferral keeps every existing fail-closed outcome:
DOCKER_HOST, an overridingDOCKER_CONTEXT, a persisted non-default context, an unreadable configuration, and a malformed configuration all still select WSL-local Ollama. Its current consumer is the Windows WSL express path inmain, andtest/install-express-wsl-ollama.test.tsprotects both the deferral and each fail-closed outcome.windowsHostOllamaSupportedis optional onOllamaInstallMenuInputbecause the value is read only whenhasWindowsOllamais set. Its current consumer isdetectInferenceProviderHostState, which always passes the resolved requirement, andsrc/lib/onboard/provider-host-state.test.tsprotects that wiring.Type of Change
Quality Gates
6bca27be8; the current-main merge and removal of a redundant cache-sensitive assertion did not change production behavior. No blocking findings were identified across secrets, input validation, authorization, dependencies, logging, cryptography, configuration, or privilege boundaries.Documentation Writer Review
docs-updateddocs/get-started/windows-preparation.mdxdocuments deferred Windows WSL provider selection and the WSL-local Ollama fallback. The independent documentation-writer review covered commit6bca27be8, passed the docs build with 0 errors, and verified the OpenClaw, Hermes, and Deep Agents variants. The tunnel refactor preserves existing best-effort model unloading; the final test-only commit removes a redundant cache-sensitive assertion. The complete tunnel test file passed 38/38,git diff --checkpassed, and signed commit plus push hooks passed, including CLI type checking.DGX Station Hardware Evidence
Verification
Signed-off-by:line and every commit appears asVerifiedin GitHubpre-commit,commit-msg, andpre-pushhooks passed, ornpm run validate:prpassed after refreshingorigin/mainwhen hooks were skipped or unavailablenpm run typecheck:clipassed;npm run docspassed with route check OK; normal merge and prior-head pre-push hooks passed.npm testfor broad runtime/test-harness changes;npm run checkfor repo-wide validation/coverage changes — command/result:npm run docsbuilds without warnings (doc changes only) — passed with 0 errors and 2 warningsSigned-off-by: Tinson Lai tinsonl@nvidia.com
Summary by CodeRabbit
New Features
Documentation
Bug Fixes