fix(onboard): validate Windows Ollama from Docker - #8145
Conversation
Signed-off-by: Charan Jagwani <cjagwani@nvidia.com>
📝 WalkthroughWalkthroughThe PR adds a Docker-based curl probe, validates restricted Windows-host Ollama URLs, and propagates injectable process spawners through inference probing and retry paths. ChangesDocker-context Ollama probing
Estimated code review effort: 4 (Complex) | ~45 minutes Sequence Diagram(s)sequenceDiagram
participant Onboarding
participant OpenAILikeValidation
participant ContainerCurlProbe
participant Docker
participant Ollama
Onboarding->>OpenAILikeValidation: validate OpenAI-like selection
OpenAILikeValidation->>ContainerCurlProbe: request Docker-context probe
ContainerCurlProbe->>Docker: run curl container
Docker->>Ollama: request host.docker.internal:11434
Ollama-->>Docker: return endpoint response
Docker-->>ContainerCurlProbe: return curl result
ContainerCurlProbe-->>OpenAILikeValidation: return probe result
Possibly related PRs
Suggested labels: Suggested reviewers: 🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing Touches 💡 1📝 Generate docstrings 💡
🧪 Generate unit tests (beta)
Comment |
Code Coverage OverviewLanguages: TypeScript TypeScript / code-coverage/pluginThe overall coverage in commit add8bf0 in the TypeScript / code-coverage/cliThe overall coverage in commit add8bf0 in the Show a code coverage summary of the most impacted files.
Updated |
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: 1 warning · 0 suggestionsWarningsWarnings do not block.
|
There was a problem hiding this comment.
🧹 Nitpick comments (1)
src/lib/inference/onboard-probes.ts (1)
811-850: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winThread
spawnSyncImplthrough theresponsesProbebranches too.Every other curl-executing site in this function (calibration, tool-calling probe, standard chat-completions probe, both doubled-timeout retry branches) now passes
spawnSyncImpl: options.spawnSyncImpl. The tworesponsesProbebranches at Line 817-823 and Line 828-849 do not.Today this gap is inert:
options.probeFromDockerrequiresoptions.skipResponsesProbe === true(Line 700-706), andresponsesProbeis only included in theprobesarray when!options.skipResponsesProbe(Line 881-883). SoresponsesProbe.executecannot run while Docker-context probing is active.If a future change relaxes that coupling,
responsesProbewould silently fall back to the default hostspawnSyncinstead of the container-mediated one, reintroducing the exact WSL/host.docker.internalunreachability regression this PR fixes, without any test catching it. ThreadspawnSyncImplthrough both branches now so the invariant is enforced structurally rather than by an implicit skip-flag coupling.♻️ Proposed fix to thread spawnSyncImpl through the Responses probe branches
const responsesProbe = options.requireResponsesToolCalling === true ? { name: "Responses API with tool calling", api: "openai-responses", execute: () => probeResponsesToolCalling(endpointUrl, model, apiKey, { authMode: options.authMode, extraHeaders: options.extraHeaders, pinnedAddresses, trustedPrivateCapability: options.trustedPrivateCapability, validationTiming, + spawnSyncImpl: options.spawnSyncImpl, }), } : { name: "Responses API", api: "openai-responses", execute: () => runCurlProbe( [...], { trustedConfigFiles: authConfig.trustedConfigFiles, pinnedAddresses, trustedPrivateCapability: options.trustedPrivateCapability, + spawnSyncImpl: options.spawnSyncImpl, }, ), };🤖 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/inference/onboard-probes.ts` around lines 811 - 850, Update both `responsesProbe` branches to pass `spawnSyncImpl: options.spawnSyncImpl` into their curl-execution paths: the `probeResponsesToolCalling` options in the required-tool-calling branch and the `runCurlProbe` options in the standard Responses API branch. Preserve all existing probe arguments and behavior while ensuring both branches use the configured process-spawn implementation.
🤖 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/inference/onboard-probes.ts`:
- Around line 811-850: Update both `responsesProbe` branches to pass
`spawnSyncImpl: options.spawnSyncImpl` into their curl-execution paths: the
`probeResponsesToolCalling` options in the required-tool-calling branch and the
`runCurlProbe` options in the standard Responses API branch. Preserve all
existing probe arguments and behavior while ensuring both branches use the
configured process-spawn implementation.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Enterprise
Run ID: 68d39bbb-0c46-4cc3-81fd-d4177ae05282
📒 Files selected for processing (8)
src/lib/adapters/http/container-curl-probe.test.tssrc/lib/adapters/http/container-curl-probe.tssrc/lib/inference/local.test.tssrc/lib/inference/local.tssrc/lib/inference/onboard-host-docker-internal.test.tssrc/lib/inference/onboard-host-docker-internal.tssrc/lib/inference/onboard-probes.tssrc/lib/onboard/inference-selection-validation.ts
apurvvkumaria
left a comment
There was a problem hiding this comment.
Approve — reviewed exact head add8bf0. The Docker-context probe is restricted to the canonical credential-free Windows-host Ollama route, uses argv-based execution, rejects curl credential configuration, and mounts only the temporary response directory. Focused coverage exercises strict and compatibility paths plus credential, route, and mount rejection, and the exact-head CI and selected E2E gate pass. I found no blocking correctness, security, compatibility, or regression defect. The existing automated mutable-image warning remains non-blocking and is not duplicated here.
…8118) <!-- markdownlint-disable MD041 --> ## Summary `resolveGatewayEffectAuthority` refuses gateway effects when a sandbox's recorded gateway owner no longer matches the live one. Three callers let that refusal escape as an uncaught exception, so the CLI crashed with a raw Node stack trace instead of naming the migration. This PR raises the refusal as a typed error and reports it at those boundaries. Related report: issue 8103. This PR implements only the accepted reporting subset and does not close the remaining managed MCP recovery scope. ## Reproduction Executed on our DGX Spark aarch64 test host (GB10 GPU), Ubuntu 24.04, against `main` at `4cd4d64fe`. ```bash nemoclaw onboard --name repro-8103 --non-interactive --yes # records the live authority # reconstruct the pre-migration recording: source packaged-service, live standalone nemoclaw repro-8103 rebuild --yes nemoclaw repro-8103 destroy --yes --cleanup-gateway ``` **How the drift was produced.** The reporter's sandbox was onboarded while the packaged `openshell-gateway.service` was authoritative, then the managed gateway migrated to standalone. On our test host the packaged gateway service cannot start at all for an unrelated reason (its `EnvironmentFile` supplies a quoted `DOCKER_HOST`, so the value reaches the process with the quotes and the socket URL is invalid), so onboarding against it is not possible here. The recorded authority was therefore set to `packaged-service` directly in the onboarding checkpoint after a normal onboard, which reproduces the recorded-vs-live drift this issue is about while leaving the sandbox, gateway, and registry real. **Observed on `main` (before fix)** `rebuild --yes`: ```text Error: Gateway lifecycle authority changed since onboarding (nemoclaw@8080:nemoclaw-managed:packaged-service -> nemoclaw@8080:nemoclaw-managed:standalone). Changing authority requires a fresh onboarding run; gateway teardown will not perform gateway effects. at resolveGatewayEffectAuthority (.../dist/lib/onboard/gateway-teardown-authority.js:80:15) at resolveGatewayTeardownAuthority (.../dist/lib/onboard/gateway-teardown-authority.js:87:12) at openRebuildRecreateJournal (.../dist/lib/actions/sandbox/rebuild-recreate-journal.js:73:88) ... Node.js v22.22.2 ``` `destroy --yes --cleanup-gateway` crashed the same way from `cleanupGatewayAfterLastSandbox`. Both exited `1`. **Observed on `fix/...` (after fix)** — same host, same commit, same drifted state `rebuild --yes` (exit `1`, zero stack-trace lines): ```text ✓ State backed up (12 directories, 1 files) Refusing sandbox rebuild because the gateway lifecycle authority could not be revalidated. Gateway lifecycle authority changed since onboarding (nemoclaw@8080:nemoclaw-managed:packaged-service -> nemoclaw@8080:nemoclaw-managed:standalone). Changing authority requires a fresh onboarding run; gateway teardown will not perform gateway effects. Re-run onboarding to bind the current gateway authority before retrying. ``` `destroy --yes --cleanup-gateway` (exit `0`, zero stack-trace lines, registry empty afterwards): ```text Refusing shared gateway cleanup because the gateway lifecycle authority could not be revalidated. Gateway lifecycle authority changed since onboarding (...packaged-service -> ...standalone). ... Re-run onboarding to bind the current gateway authority before retrying. The shared NemoClaw gateway was left running. ✓ Sandbox 'repro-8103' destroyed ``` The verification script asserts the built `dist/` actually contains the change before running, because an earlier attempt silently tested an unpatched build. ## Analysis `resolveGatewayEffectAuthority` (`src/lib/onboard/gateway-teardown-authority.ts`) threw plain `Error`s. `credentials/command-support.ts` was the only caller that caught them, so `credentials add`/`reset` already reported the refusal cleanly. The remaining callers did not: - `rebuild-recreate-journal.ts` — reached from `rebuild --yes` - `onboard-recreate-journal.ts` — reached from `onboard --recreate-sandbox` - `destroy-gateway.ts` — reached from the final-sandbox gateway cleanup There is no process-level error boundary in the CLI entry, so each of those escaped as an uncaught exception and printed a Node stack trace. ## Fix - `GatewayAuthorityError` is a distinct type, so boundaries recognise the refusal without matching message text. All four refusal sites in the resolver raise it; an invalid management declaration deliberately keeps its own type because it is a different failure class. - `gatewayAuthorityFailureLines` is the single source of the wording `credentialsGatewayAuthorityFailureLines` already used. The remedy line is binary-agnostic so this module takes no branding dependency, which the source-architecture budget counts against every consumer. - The catches live in the two modules that already import the resolver, so no new import edges are added. `rebuild-recreate-journal` hands the lines back through a new `onAuthorityRefusal` callback and the pipeline routes it to its existing `bail`. - Shared gateway cleanup reports and returns instead of throwing. The sandbox and its registry entry are already gone at that point, so refusing the optional last step must not undo the removal. **The #6576 contract is preserved.** The catch sits at the resolver call, before any gateway effect, so nothing touches the gateway before authority is proven — the existing test asserting no side effects still passes unchanged, and a new case pins the same guarantee for the typed refusal. Any failure that is not an authority refusal still aborts outright. ## Scope This does not close issue 8103. The report also describes `destroy --yes` failing in MCP-bridge teardown with managed MCP servers present; that path raises `McpBridgeError`, a different root cause this PR does not touch. Our repro had no managed MCP servers and `destroy --yes` without `--cleanup-gateway` already succeeded on `main`, so that half is unverified here and left for a separate change. ## Interaction with #8098 #8098 makes NemoClaw decline a packaged gateway service whose binary is outside the blueprint version window, moving the resolved owner from `packaged-service` to `standalone`. That is exactly the drift this PR reports on, so landing this first (or together) keeps existing sandboxes on a working path. ## Changes - `src/lib/onboard/gateway-teardown-authority.ts`: add `GatewayAuthorityError` and `gatewayAuthorityFailureLines`; raise the typed error from every refusal site. - `src/lib/actions/sandbox/destroy-gateway.ts`: report an authority refusal and skip cleanup instead of throwing. - `src/lib/actions/sandbox/rebuild-recreate-journal.ts`: surface the refusal through an `onAuthorityRefusal` callback. - `src/lib/actions/sandbox/rebuild-pipeline.ts`: route that callback to the existing `bail`. - tests: regression coverage for the typed refusal, the shared wording, and the preserved no-side-effect guarantee. ## Type of Change - [x] 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) ## Quality Gates - [x] Tests added or updated for changed behavior - [ ] Existing tests cover changed behavior — justification: - [ ] Tests not applicable — justification: - [ ] Docs updated for user-facing behavior changes - [x] Docs not applicable — justification: Existing gateway lifecycle authority and sandbox destroy documentation already describes the unchanged fail-closed authority and optional cleanup boundaries; this PR replaces raw stack traces with existing-pattern operator guidance. - [x] Sensitive paths changed (security, policy, credentials, preflight, onboarding, inference, runner, sandbox, or messaging) - [x] Sensitive-path review completed or maintainer-approved waiver recorded — reviewer/approval link/justification: Exact-head nine-category security review at `27a3a1f13c7be9b6a7ab87a73585b99ec6de11e4` against base `e9fb170a2e3e4c4dcfa19e398232f71b8f2bace6`: PASS with no findings. Typed refusals remain fail closed, unrelated and malformed-declaration errors still propagate, diagnostics contain no credential material, and no gateway effect runs before authority is proven. Base commit #8145 changes separate Docker-context inference validation and does not interact with these typed errors. - [ ] Non-success, skipped, or missing CI check accepted by maintainer — check name, approval link, and follow-up issue: ## Documentation Writer Review - [x] Documentation writer subagent reviewed the completed changes - Result: `no-docs-needed` - Evidence: Reviewed the complete eight-file diff at `27a3a1f13` against base `e9fb170a2e3e4c4dcfa19e398232f71b8f2bace6`, stable patch ID `2a1a9ce90bda5c03abf2788d381656fb42c301da`, and the NemoClaw writing guide, controlled word list, documentation contributor guide, and shared documentation-writing review contract. The change replaces raw Node.js stack traces with existing-pattern operator guidance when gateway lifecycle authority cannot be revalidated during rebuild, `onboard --recreate-sandbox`, or final shared-gateway cleanup. It adds no command, flag, default, configuration, schema, workflow, or supported product surface. Existing documentation already states that authority drift requires fresh onboarding and prevents gateway effects, while command documentation describes final shared-gateway cleanup after sandbox and registry deletion. Base commit #8145 adds credential-free Windows Ollama validation from Docker's network context in separate adapter and inference-selection files. It does not throw or consume `GatewayAuthorityError` and does not interact with the changed command-boundary handling. Exact-head validation passed: CLI and plugin builds; 6 focused files and 104 tests; `npm run validate:pr`; and `git diff --check`. No blocking findings. - Agent: Codex Desktop documentation writer subagent <!-- docs-review-head-sha: 27a3a1f --> <!-- docs-review-agents-blob-sha: 3dd7c24 --> ## Verification - [x] Exact-head maintainer validation at `27a3a1f13`: 6 focused files / 104 tests passed; CLI and plugin builds passed; `npm run validate:pr` passed; `git diff --check` passed. - [x] PR description includes a `Signed-off-by:` line and every current commit appears as `Verified` in GitHub. - [x] `npx prek run` passes on the changed files - [x] `npm test` passes (640 files / 7228 tests under `src/lib/onboard`, `src/lib/actions`, `src/lib/credentials`) - [x] Tests added or updated for new or changed behavior - [x] No secrets, API keys, or credentials committed - [ ] Docs updated for user-facing behavior changes - [ ] `make docs` builds without warnings (doc changes only) - [ ] 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) Platform scope: reproduced and verified on aarch64 (DGX Spark), matching the reporter's environment. The changed code is platform-independent; x86_64 was not exercised. ## AI Disclosure - [x] AI-assisted — tool: Claude Code Signed-off-by: Yanyun Liao <yanyunl@nvidia.com> <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Bug Fixes** * Improved gateway teardown handling when ownership or authority cannot be confirmed. * Shared gateways remain running when authority checks fail, preventing unintended cleanup. * Sandbox rebuilds now report authority refusals clearly and stop safely. * CLI errors provide actionable details without exposing stack traces. * Unrelated errors continue to surface normally. * Gateway authority failure messages are standardized for invalid or changed authorization details. * **Tests** * Added coverage for authority changes, credential updates, invalid targets, declined checkpoints, malformed errors, and safe cleanup behavior. <!-- end of auto-generated comment: release notes by coderabbit.ai --> --------- Signed-off-by: yanyunl1991 <yanyunl@nvidia.com> Signed-off-by: Prekshi Vyas <prekshiv@nvidia.com> Co-authored-by: Prekshi Vyas <34834085+prekshivyas@users.noreply.github.com> Co-authored-by: Prekshi Vyas <prekshiv@nvidia.com> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Carlos Villela <cvillela@nvidia.com>
<!-- markdownlint-disable MD041 --> ## Summary Prepares the canonical v0.0.102 release documentation from the current release-labeled scope. The change adds a dated changelog for all 38 user-facing shipping PRs and corrects the OpenClaw agent command reference for the behavior delivered by #8191. ## Changes - Add `docs/changelog/2026-08-04.mdx` with the v0.0.102 release summary, detailed behavior changes, support boundaries, security evidence links, and links to durable documentation. - Update `docs/reference/commands.mdx` to describe non-JSON OpenClaw output capture, its combined limit, marker handling, stream suppression, recovery guidance, and exit behavior. - [#8167](#8167) -> `docs/changelog/2026-08-04.mdx`: Records authenticated attachment of operator-managed llama.cpp servers. - [#8129](#8129) -> `docs/changelog/2026-08-04.mdx`: Records the Experimental managed vLLM profile for two DGX Spark systems. - [#7983](#7983) -> `docs/changelog/2026-08-04.mdx`: Records qualification of the May 2026 GB300WS factory image. - [#8207](#8207) -> `docs/changelog/2026-08-04.mdx`: Records the qualified DGX Station driver transaction. - [#8208](#8208) -> `docs/changelog/2026-08-04.mdx`: Records mode-bound Express resume state. - [#8158](#8158) -> `docs/changelog/2026-08-04.mdx`: Records recovery of host-global dual-Station runtime ownership. - [#8145](#8145) -> `docs/changelog/2026-08-04.mdx`: Records Windows-host Ollama validation from Docker Desktop's network context. - [#8190](#8190) -> `docs/changelog/2026-08-04.mdx`: Records HTTP model pulls when WSL has no local Ollama executable. - [#8195](#8195) -> `docs/changelog/2026-08-04.mdx`: Records reuse of a healthy installer-managed CLI. - [#8053](#8053) -> `docs/changelog/2026-08-04.mdx`: Records early rejection of incompatible OpenShell gateway versions. - [#8098](#8098) -> `docs/changelog/2026-08-04.mdx`: Records the bounded package-service-to-standalone gateway recovery transition. - [#8216](#8216) -> `docs/changelog/2026-08-04.mdx`: Records the final dashboard port selected during multi-sandbox onboarding. - [#8146](#8146) -> `docs/changelog/2026-08-04.mdx`: Records managed startup-state restoration for stopped sandboxes. - [#8092](#8092) -> `docs/changelog/2026-08-04.mdx`: Records gateway watchdog recovery for classified not-serving states. - [#8182](#8182) -> `docs/changelog/2026-08-04.mdx`: Records consistent managed-recovery wait configuration. - [#8040](#8040) -> `docs/changelog/2026-08-04.mdx`: Records Docker sandbox rollback authority through late validation. - [#8130](#8130) -> `docs/changelog/2026-08-04.mdx`: Records bounded Shields deadline recovery and durable containment. - [#8086](#8086) -> `docs/changelog/2026-08-04.mdx`: Records repair of narrowly validated permission-only configuration drift. - [#8122](#8122) -> `docs/changelog/2026-08-04.mdx`: Records prompt failure and guidance for corrupt transition locks. - [#8124](#8124) -> `docs/changelog/2026-08-04.mdx`: Records policy restoration flags, previews, and target revalidation. - [#7886](#7886) -> `docs/changelog/2026-08-04.mdx`: Records explicit destruction after pre-delete Shields hardening failures while preserving recovery authority. - [#7901](#7901) -> `docs/changelog/2026-08-04.mdx`: Records multi-port uninstall behavior and shared-resource preservation. - [#7984](#7984) -> `docs/changelog/2026-08-04.mdx`: Records one classified transient remote MCP startup retry. - [#7954](#7954) -> `docs/changelog/2026-08-04.mdx`: Records bounded hosted-inference probe replies. - [#7574](#7574) -> `docs/changelog/2026-08-04.mdx`: Records preservation of validated reasoning capabilities through onboarding. - [#8089](#8089) -> `docs/changelog/2026-08-04.mdx`: Records proxy routing for Hermes WhatsApp pairing and media traffic. - [#7682](#7682) -> `docs/changelog/2026-08-04.mdx`: Records native Hermes session deletion and identifier validation. - [#8150](#8150) -> `docs/changelog/2026-08-04.mdx`: Records corporate CA trust for LangChain Deep Agents Code image builds. - [#8156](#8156) -> `docs/changelog/2026-08-04.mdx`: Records reviewed managed runtime dependency remediation. - [#8180](#8180) -> `docs/changelog/2026-08-04.mdx`: Records reviewed MCP discovery runtime dependency updates. - [#8196](#8196) -> `docs/changelog/2026-08-04.mdx`: Records private npm dependency remediation across managed images. - [#8203](#8203) -> `docs/changelog/2026-08-04.mdx`: Records reviewed Hermes and LangChain Deep Agents Code Python dependency updates. - [#8125](#8125) -> `docs/changelog/2026-08-04.mdx`: Records bounded diagnostics for invalid enumerated CLI values. - [#8193](#8193) -> `docs/changelog/2026-08-04.mdx`: Records bounded diagnostics for unresolved sandbox base images. - [#8118](#8118) -> `docs/changelog/2026-08-04.mdx`: Records bounded diagnostics for changed gateway authority. - [#8191](#8191) -> `docs/changelog/2026-08-04.mdx`, `docs/reference/commands.mdx`: Records output capture, marker handling, recovery guidance, and exit behavior for non-JSON OpenClaw agent commands. - [#8187](#8187) -> `docs/changelog/2026-08-04.mdx`: Records the aligned interactive-installation start across supported agents. - [#8153](#8153) -> `docs/changelog/2026-08-04.mdx`: Records current product capabilities and support boundaries. ## 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 - [ ] Existing tests cover changed behavior — justification: - [x] Tests not applicable — justification: This documentation-only release preparation does not change executable behavior. Existing changelog and published-route tests pass. - [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 - [x] Documentation writer subagent reviewed the completed changes - Result: `docs-updated` - Evidence: Independently reviewed `docs/changelog/2026-08-04.mdx` and `docs/reference/commands.mdx` at commit `b89913780`. All 38 user-facing v0.0.102 PRs are represented, #8191 behavior matches the implementation, and the writing rules, documentation style, controlled terminology, route structure, and skip policy pass review. Targeted tests pass 36/36 and the documentation build completes with 0 errors. - Agent: Codex Desktop independent documentation writer <!-- docs-review-head-sha: b899137 --> <!-- 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 --project integration test/changelog-docs.test.ts test/check-docs-published-routes.test.ts` passed 36/36. - [x] Applicable broad gate passed — not applicable to documentation-only changes; `npm run docs` completed successfully with 0 errors. - [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) - [x] New doc pages include SPDX header and frontmatter (new pages only) — the native dated changelog uses the required parser-safe MDX SPDX comment and intentionally has no frontmatter. --- Signed-off-by: Apurv Kumaria <akumaria@nvidia.com> <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit - **Documentation** - Added release notes for v0.0.102, covering authentication, hardware setup, WSL, installer recovery, sandbox resilience, policy management, inference reliability, CLI improvements, and unified quickstarts. - Updated command documentation to explain how non-JSON agent output is collected, replayed, and reported. - **Bug Fixes** - Improved command-output recovery guidance when output exceeds limits or contains unsupported fallback markers. - Preserved accurate command exit-status reporting after output processing. <!-- end of auto-generated comment: release notes by coderabbit.ai --> Signed-off-by: Apurv Kumaria <akumaria@nvidia.com>
Summary
Windows-host Ollama validation on WSL ran from the WSL host, where Docker Desktop does not define
host.docker.internal. This change runs the credential-free validation request from Docker Desktop's network context and restricts that path to the configured Windows-host Ollama endpoint.Related Issue
Fixes #8127
Changes
http://host.docker.internal:<ollama-port>/v1route with no API key, extra headers, query, fragment, or embedded URL credentials.The adapter is required because Docker Desktop defines
host.docker.internalin the container network context, not in the WSL host resolver.src/lib/inference/onboard-host-docker-internal.test.tsprotects the current Windows-host Ollama consumer and verifies that both validation modes execute through Docker.Type of Change
Quality Gates
docs/inference/set-up-ollama.mdxalready documents Windows-host Ollama from WSL, Docker Desktop integration,host.docker.internal:11434, validation, and the unauthenticated-port warning. This change restores that documented path.Documentation Writer Review
no-docs-neededdocs/inference/set-up-ollama.mdxanddocs/reference/troubleshooting.mdxalready cover the restored Windows-host Ollama behavior, validation, security warning, detection, and restart remediation. No documentation paths changed.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 exec vitest run -- --project cli src/lib/adapters/http/container-curl-probe.test.ts src/lib/inference/onboard-host-docker-internal.test.ts src/lib/inference/local.test.ts src/lib/onboard/inference-selection-validation.test.tspassed 112 tests in 4 files.npm run typecheck:clipassed.npm testfor broad runtime/test-harness changes;npm run checkfor repo-wide validation/coverage changes — command/result: Not run; this change is limited to the Windows-host Ollama validation path and has focused source-test coverage.npm run docsbuilds without warnings (doc changes only)Signed-off-by: Charan Jagwani cjagwani@nvidia.com
Summary by CodeRabbit
New Features
Bug Fixes