fix(onboard): reconcile registered extra providers#6587
Conversation
Co-authored-by: Ho Lim <subhoya@gmail.com> Signed-off-by: Apurv Kumaria <akumaria@nvidia.com>
📝 WalkthroughWalkthroughA new ChangesExtra provider reconciliation against gateway
Estimated code review effort: 3 (Moderate) | ~25 minutes Sequence Diagram(s)sequenceDiagram
participant onboard.ts
participant reconcileRegisteredExtraProviders
participant registry
participant OpenShellGateway
onboard.ts->>reconcileRegisteredExtraProviders: reconcileRegisteredExtraProviders(GATEWAY_NAME, { runOpenshell })
reconcileRegisteredExtraProviders->>registry: listExtraProviders()
reconcileRegisteredExtraProviders->>OpenShellGateway: provider list -g GATEWAY_NAME --names
OpenShellGateway-->>reconcileRegisteredExtraProviders: gateway names or failure
reconcileRegisteredExtraProviders-->>onboard.ts: filtered or original extraProviders
Suggested labels: Suggested reviewers: 🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Comment |
Code Coverage OverviewLanguages: TypeScript TypeScript / code-coverage/pluginThe overall coverage remains at 96%, unchanged from the TypeScript / code-coverage/cliThe overall coverage in the Show a code coverage summary of the most impacted files.
Updated |
There was a problem hiding this comment.
🧹 Nitpick comments (1)
test/onboard.test.ts (1)
1880-1880: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick winAssertion only checks
tavily-search; addbrave-searchcoverage too.The updated regex only forbids
--provider tavily-search, but the fix (and PR objective) is to remove all managed web-search providers when disabled, includingbrave-search. If a regression only reintroduces a stalebrave-searchattachment, this assertion won't catch it.✅ Suggested strengthened assertion
- assert.match(createCommand.command, /^(?=.*nemoclaw-start)(?!.*--provider tavily-search)/s); + assert.match( + createCommand.command, + /^(?=.*nemoclaw-start)(?!.*--provider (?:tavily|brave)-search)/s, + );🤖 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 `@test/onboard.test.ts` at line 1880, The onboarding test assertion only excludes `tavily-search`, so it can miss a regression where `brave-search` is still attached. Update the check in `test/onboard.test.ts` around the `createCommand.command` assertion to verify that both managed web-search providers are absent when disabled, using the existing command-matching test logic so it covers `nemoclaw-start` without `--provider tavily-search` or `--provider brave-search`.
🤖 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 `@test/onboard.test.ts`:
- Line 1880: The onboarding test assertion only excludes `tavily-search`, so it
can miss a regression where `brave-search` is still attached. Update the check
in `test/onboard.test.ts` around the `createCommand.command` assertion to verify
that both managed web-search providers are absent when disabled, using the
existing command-matching test logic so it covers `nemoclaw-start` without
`--provider tavily-search` or `--provider brave-search`.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Enterprise
Run ID: 90f1f207-902d-42e5-8f7a-5ccb35e23f75
📒 Files selected for processing (4)
src/lib/onboard.tssrc/lib/onboard/sandbox-create-plan.test.tssrc/lib/onboard/sandbox-create-plan.tstest/onboard.test.ts
Signed-off-by: Apurv Kumaria <akumaria@nvidia.com>
cjagwani
left a comment
There was a problem hiding this comment.
Requesting changes on exact head cee553b.
The clean replacement fixes the DCO defect from #6531, but it carries forward the substantive provider-ownership bug.
-
filterManagedWebSearchExtraProviders treats bare brave-search and tavily-search entries from registry.listExtraProviders() as NemoClaw-managed solely by name. That registry also holds user-created, gateway-wide extra providers. The current Deep Agents quickstart explicitly registers bare tavily-search through credentials add and says it attaches to every later build or rebuild; NemoClaw-managed OpenClaw and Hermes search providers are instead sandbox-scoped as -brave-search or -tavily-search and come through messaging preparation. With webSearchConfig null, including Deep Agents, this patch silently drops a healthy user provider. The changed integration assertion now pins that regression.
-
When Tavily is selected, the filter retains bare tavily-search without checking that the gateway provider exists or that NemoClaw owns it. A stale missing registry entry can therefore still reach openshell sandbox create and reproduce #6501.
Please reconcile extra-provider state using provider existence or explicit provenance instead of reserving these bare names. Add regressions proving that a healthy gateway-wide tavily-search survives for Deep Agents or null managed-web-search config, and that a missing stale bare provider is excluded under null, Brave, and Tavily selections.
- The required codebase-growth-guardrails check currently fails because src/lib/onboard.ts grows by one line. Please make that entrypoint net-neutral and rerun exact-head validation after updating from main.
The sole commit is GitHub Verified, the PR body now has a literal Signed-off-by declaration, and DCO passes. Those prior compliance defects are resolved. This is still a sensitive onboarding and host-glue change even though the generic gate script does not classify the nested planner file as risky.
E2E Advisor RecommendationRequired E2E: Dispatch hint: Full advisor summaryE2E Recommendation AdvisorBase: Required E2E
Optional E2E
New E2E recommendations
Dispatch hint
|
E2E Target RecommendationRequired E2E targets: Dispatch required E2E targets:
Full E2E target advisor summaryE2E Target AdvisorBase: Required E2E targets
Optional E2E targets
Relevant changed files
|
PR Review Advisor — Changes requestedMerge posture: Do not merge yet Action checklist
Findings index
Review findings by urgency: 0 required fixes, 1 item to resolve/justify, 0 in-scope improvements
|
PR Review Advisor (Nemotron Ultra) — Changes requestedMerge posture: Do not merge yet Action checklist
Findings index
Review findings by urgency: 0 required fixes, 5 items to resolve/justify, 0 in-scope improvements
|
Co-authored-by: Shawn Xie <shaxie@nvidia.com> Signed-off-by: Apurv Kumaria <akumaria@nvidia.com>
cjagwani
left a comment
There was a problem hiding this comment.
Re-reviewing exact head 6393639.
The net-neutral follow-up resolves the top-level src/lib/onboard.ts growth CI failure, and that required check is now green. The provider-semantics blockers remain unchanged.
A focused comparison against overlapping #6518 confirms that #6518 has the correct core ownership model: probe every registry-recorded extra provider against the selected gateway, retain confirmed providers, prune only an explicit provider-not-found result, and remove that provably stale record from registry state. In contrast, this PR still reserves bare brave-search and tavily-search by name. It drops a healthy gateway-wide Tavily provider when managed search is disabled, yet can retain a missing stale Tavily provider when Tavily is selected.
Please defer this name-based implementation. Do not stack it on #6518: the reconciliation layer could correctly retain a healthy confirmed tavily-search, after which this filter would incorrectly remove it based on webSearchConfig. If #6518 becomes the delivery vehicle, this PR should close as superseded after that fix lands. If this fresher branch must be used, replace the filter with the existence-based reconciliation design and carry forward credit; also incorporate the narrower provider-not-found matching that #6518 still needs.
Both exact-head PR advisors independently say merge_after_fixes. They also require planner and test monolith growth to be extracted or offset, and they require onboard-repair and onboard-resume evidence after the source-level fix; the E2E advisor additionally requires cloud-onboard. Do not spend those live runs on the current incorrect implementation.
No merge performed.
|
Addressed the valid provider-ownership and stale-record blockers on exact head
Validation: 17/17 focused tests, 65/65 onboard integration tests, CLI type-check, hooks, commitlint, source/test budgets, secret scan, and |
There was a problem hiding this comment.
🧹 Nitpick comments (1)
src/lib/onboard/extra-provider-reconciliation.ts (1)
51-80: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winMissing test coverage for guard/validation paths.
None of the unit tests in
extra-provider-reconciliation.test.tsexercise thegatewayNamemissing throw or theOPENSHELL_GATEWAY_ENDPOINToverride guard interaction (Lines 57-58). Given the guard's unusual uncaught-throw behavior flagged above, a regression test would catch this before it reaches production.🤖 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/onboard/extra-provider-reconciliation.ts` around lines 51 - 80, Add unit tests for the guard/validation paths in reconcileRegisteredExtraProviders: cover the missing gatewayName throw and the assertNoOpenShellGatewayEndpointOverride interaction before runOpenshell is called. Use the reconcileRegisteredExtraProviders symbol with mocked listExtraProviders and runOpenshell deps to verify the function throws when gatewayName is empty, and separately verify the endpoint override guard prevents execution as expected in extra-provider-reconciliation.test.ts.
🤖 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/onboard/extra-provider-reconciliation.ts`:
- Around line 51-80: Add unit tests for the guard/validation paths in
reconcileRegisteredExtraProviders: cover the missing gatewayName throw and the
assertNoOpenShellGatewayEndpointOverride interaction before runOpenshell is
called. Use the reconcileRegisteredExtraProviders symbol with mocked
listExtraProviders and runOpenshell deps to verify the function throws when
gatewayName is empty, and separately verify the endpoint override guard prevents
execution as expected in extra-provider-reconciliation.test.ts.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Enterprise
Run ID: e6ebb17a-15ba-4f27-bc43-d64c56bec346
📒 Files selected for processing (6)
src/lib/onboard.tssrc/lib/onboard/extra-provider-reconciliation.test.tssrc/lib/onboard/extra-provider-reconciliation.tssrc/lib/onboard/sandbox-provider-cleanup.tstest/onboard-extra-provider-reconciliation.test.tstest/onboard.test.ts
E2E Target Results — ✅ All requested jobs passedRun: 29037459044
|
|
Post-merge follow-up on shipped head dd93942 / verified squash ac9e1bc: The one-shot provider snapshot is not authoritative for the full gateway. In the pinned OpenShell v0.0.72 source, provider list defaults to --limit 100 and --offset 0. This implementation calls provider list -g --names once, then treats only that first page as the complete name set. On a gateway with more than 100 providers, any healthy registry-recorded extra outside page one is silently omitted from sandbox create, contradicting the stated preservation contract. This also revives the list-snapshot design that #6518 discarded after cli-test-shards (5) exposed the same unsafe assumption for an exit-0 empty response. The merged tests use only a handful of names and cannot detect truncation or an incomplete success response. Please track an immediate v0.0.79 follow-up before release: either probe each recorded extra with gateway-scoped provider get and prune only an explicit provider-not-found result, or exhaust pagination without treating a partial page as complete. Add a regression with more than 100 gateway providers where the recorded live extra is on a later page, plus an exit-0 empty/incomplete-response case. Preserve operator-visible diagnostics when reconciliation cannot prove a provider missing. No merge was performed by this babysitter. |
<!-- markdownlint-disable MD041 --> ## Summary Adds the pre-tag v0.0.79 release notes entry to `docs/about/release-notes.mdx` so the release plan can be generated after docs merge. The entry summarizes the merged v0.0.79 release train across inference, diagnostics, runtime hardening, policies, onboarding recovery, and release validation. ## Changes - Added the v0.0.79 release notes section with linked follow-up documentation for OpenRouter onboarding, managed vLLM changes, completion and logging, Deep Agents runtime limits, policy updates, onboarding recovery, and release validation. - Source summary: - #6461 -> `docs/about/release-notes.mdx`: Documents OpenRouter onboarding support and links to inference/provider references. - #6271 and #6272 -> `docs/about/release-notes.mdx`: Documents shell completion and structured logging highlights. - #6465, #6539, #6570, and #6528 -> `docs/about/release-notes.mdx`: Documents status route-drift, orphaned sandbox, gateway cleanup, and DGX Spark express-install diagnostics. - #6523, #6551, #6484, #6488, #6324, and #6542 -> `docs/about/release-notes.mdx`: Documents managed vLLM, Qwen3.6 tool parser, compaction, and timeout/readiness improvements. - #6559, #6538, #6560, #6568, #6552, #6567, and #6587 -> `docs/about/release-notes.mdx`: Documents runtime, credential, proxy, PID namespace, TOML, and provider-state hardening. - #6541, #5415, #6246, #6496, and #6573 -> `docs/about/release-notes.mdx`: Documents GitHub policy, Gmail policy, MCP allowlist, WhatsApp, and messaging-variant updates. - #6253, #6572, #6444, #6536, and #5860 -> `docs/about/release-notes.mdx`: Documents onboarding resume and create-step recovery improvements. - #6508, #6527, #5506, #6588, #6446, #6447, #6582, #6296, #6367, #6397, and #6505 -> `docs/about/release-notes.mdx`: Documents docs, release-risk, and E2E validation updates. ## 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 <!-- Check exactly one tests line and one docs line. Check other lines when applicable. Add every requested justification or approval reference. --> - [ ] Tests added or updated for changed behavior - [ ] Existing tests cover changed behavior — justification: - [x] Tests not applicable — justification: Release-note prose only. - [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: ## Verification <!-- Check each applicable item only when supported by the requested evidence. Run targeted tests once per relevant change set and rerun after later edits or hook autofixes that can affect the tested behavior. Do not rerun hook-covered checks. --> - [x] PR description includes the DCO sign-off declaration and every commit appears as `Verified` in GitHub - [x] Normal `pre-commit`, `commit-msg`, and `pre-push` hooks passed, or `npm run check:diff` passed when hooks were skipped or unavailable - [x] Targeted behavior tests pass for the current change set, or tests are marked not applicable above — command/result or justification: Tests not applicable, release-note prose only. - [ ] Applicable broad gate passed — `npm test` for broad runtime/test-harness changes; `npm run check` for repo-wide validation/coverage changes — command/result: - [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) - [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) Docs validation note: `npm run docs:check-agent-variants && npm run docs:check-routes && git diff --check` passed. Full `npm run docs` is currently blocked before Fern validation because the pinned `fern-api@5.65.2` package is unavailable from npm (`ETARGET No matching version found`). --- <!-- DCO sign-off is required in this PR description, and every commit must appear as Verified in GitHub. Run: git config user.name && git config user.email --> Signed-off-by: Julie Yaunches <jyaunches@nvidia.com> <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Documentation** * Added release notes for v0.0.79 with a new summary of recent improvements, including onboarding and inference options, operator/CLI diagnostics, sandbox recovery hardening, runtime limits, network policy behavior, and release validation updates. * Added updated references and links for the latest release. <!-- end of auto-generated comment: release notes by coderabbit.ai -->
<!-- markdownlint-disable MD041 --> ## Summary Fixes the post-merge #6587 gap where one paginated provider-list page could omit healthy registry extras beyond entry 100. Reconciliation now uses bounded, gateway-scoped per-provider probes, recognizes the exact wrapped OpenShell #6501 diagnostic, and preserves every indeterminate result. ## Related Issue Follow-up to #6501 and #6587. Supersedes #6518. ## Changes - Probe every recorded extra with argv-safe `provider get -g <gateway> <name>` instead of treating one list page as authoritative. - Omit only exit-1 diagnostics that bind the exact, case-sensitive quoted provider name to a tightly anchored not-found shape, including the wrapped not-found-and-unrecognized form reported in #6501. - Fail open on gateway, transport, authentication, timeout, signal, ambiguous, name-mismatched, or command-spoofed output. - Read canonical stderr/stdout without duplicating Node's composite `output` array, and treat process errors or capture-limit diagnostics as indeterminate. - Bound each probe to 5 seconds and 64 KiB, cap total reconciliation time at 15 seconds, and never mutate the local registry. - Cover stale providers after index 100, the literal wrapped issue diagnostic in a realistic `spawnSync` result, capture truncation, mixed-case names, multi-line diagnostic spoofing, gateway failures, aggregate timeout, and stable repeated sandbox-create provider arguments. The create-time filter is intentionally non-destructive. A provider omitted from one sandbox create remains in the user-owned registry for a later retry; `--fresh` does not purge it. Indeterminate probes preserve the attachment, and the final `sandbox create` remains authoritative and reports any concrete attachment failure. This avoids deleting healthy user configuration because of a transient gateway or transport failure. ## 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 <!-- Check exactly one tests line and one docs line. Check other lines when applicable. Add every requested justification or approval reference. --> - [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: internal provider-state reconciliation only; no CLI, prompt, configuration, policy, or required user action changes. - [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: independent nine-category security review passed after exact-name, whole-diagnostic, subprocess-bound, and fail-open checks. - [ ] Non-success, skipped, or missing CI check accepted by maintainer — check name, approval link, and follow-up issue: ## Verification <!-- Check each applicable item only when supported by the requested evidence. Run targeted tests once per relevant change set and rerun after later edits or hook autofixes that can affect the tested behavior. Do not rerun hook-covered checks. --> - [x] PR description includes the DCO sign-off declaration and every commit appears as `Verified` in GitHub - [x] Normal `pre-commit`, `commit-msg`, and `pre-push` hooks passed, or `npm run check:diff` passed when hooks were skipped or unavailable - [x] Targeted behavior tests pass for the current change set, or tests are marked not applicable above — command/result or justification: CLI unit 14/14 and spawn integration 1/1 passed; the spawn test uses a realistic composite process result, executes two create attempts, and proves identical filtered provider arguments. - [ ] Applicable broad gate passed — `npm test` for broad runtime/test-harness changes; `npm run check` for repo-wide validation/coverage changes — command/result: not applicable to this focused reconciliation change; `npm run typecheck:cli`, `npm run check:diff`, source-shape, test-size, and test-conditional scans passed. - [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) - [ ] 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) Exact-head live validation for `onboard-repair`, `onboard-resume`, and `cloud-onboard` passed at [workflow run 29048610487](https://github.com/NVIDIA/NemoClaw/actions/runs/29048610487) for head `a0ea6e60f98c6e15a6084dba7a5ba9ff1e89215a`. --- <!-- DCO sign-off is required in this PR description, and every commit must appear as Verified in GitHub. Run: git config user.name && git config user.email --> Signed-off-by: Apurv Kumaria <akumaria@nvidia.com> <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * Onboarding and repair now detect and remove stale extra-provider records. * Resume operations can explicitly recreate an existing sandbox while preserving its registry entry. * Sandbox creation and retries now use a consistent, deduplicated provider list. * **Bug Fixes** * Providers are retained when availability checks are inconclusive, preventing accidental removal. * Reconciliation now avoids relying on potentially stale provider-list snapshots and handles diagnostic variations more reliably. <!-- end of auto-generated comment: release notes by coderabbit.ai --> --------- Signed-off-by: Apurv Kumaria <akumaria@nvidia.com> Signed-off-by: Prekshi Vyas <prekshiv@nvidia.com> Signed-off-by: Carlos Villela <cvillela@nvidia.com> Co-authored-by: Shawn Xie <shaxie@nvidia.com> Co-authored-by: Prekshi Vyas <prekshiv@nvidia.com> Co-authored-by: Carlos Villela <cvillela@nvidia.com>
<!-- markdownlint-disable MD041 --> ## Summary Reconcile registry-recorded extra providers against the authoritative OpenShell gateway list before sandbox creation. This prevents a stale `tavily-search` record from breaking onboarding while preserving every healthy gateway-wide user provider. The PR replaces NVIDIA#6531, preserves Ho Lim's original issue work, and credits Shawn Xie's provider-reconciliation direction from NVIDIA#6518. ## Related Issue Fixes NVIDIA#6501. ## Changes - Query `provider list -g <gateway> --names` once when registry extras exist. - Attach only exact provider names returned by a successful authoritative list. - Preserve all recorded providers if the gateway query fails or throws, avoiding silent user-state loss during an outage. - Keep local registry state unchanged; reconciliation affects only the current sandbox-create plan. - Preserve healthy bare `brave-search`, `tavily-search`, custom, and bridge providers without treating their names as NemoClaw-owned. - Add focused and spawn-level regressions for healthy providers, stale records, exact-name matching, gateway scoping, and fail-open behavior. ## 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: this silently restores the documented provider source-of-truth contract without adding or changing a command, option, output, configuration, or remediation step. - [x] Sensitive paths changed (security, policy, credentials, preflight, onboarding, inference, runner, sandbox, or messaging) - [x] Sensitive-path review completed or maintainer-approved waiver recorded — exact-name gateway reconciliation was independently audited; it avoids diagnostic regexes, preserves healthy user-owned providers, fails open on gateway-list failure, and does not mutate registry state. - [ ] Non-success, skipped, or missing CI check accepted by maintainer — check name, approval link, and follow-up issue: ## Verification - [x] PR description includes the DCO sign-off declaration and every commit appears as `Verified` in GitHub - [x] Git hooks passed during commit and push, or `npx prek run --from-ref main --to-ref HEAD` passes - [x] Targeted tests pass for changed behavior — 17 focused reconciliation tests and all 65 onboard integration tests passed. - [ ] Full `npm test` passes (broad runtime changes only) - [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) - [ ] 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) Additional exact-head validation: CLI type-check, file/commit/push hooks, commitlint, test-size/source-shape budgets, secret scan, and `npm run check:diff` passed. Documentation review found no update required. `src/lib/onboard.ts` is net-neutral. --- Signed-off-by: Apurv Kumaria <akumaria@nvidia.com> <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * Sandbox creation now better matches configured providers to what’s actually available, reducing unexpected provider options during onboarding. * **Bug Fixes** * Fixed cases where stale or unavailable extra providers could still appear in sandbox setup. * Improved behavior when provider lookup fails, helping preserve previously configured choices instead of removing them unexpectedly. <!-- end of auto-generated comment: release notes by coderabbit.ai --> --------- Signed-off-by: Apurv Kumaria <akumaria@nvidia.com> Co-authored-by: Ho Lim <subhoya@gmail.com> Co-authored-by: Shawn Xie <shaxie@nvidia.com>
<!-- markdownlint-disable MD041 --> ## Summary Adds the pre-tag v0.0.79 release notes entry to `docs/about/release-notes.mdx` so the release plan can be generated after docs merge. The entry summarizes the merged v0.0.79 release train across inference, diagnostics, runtime hardening, policies, onboarding recovery, and release validation. ## Changes - Added the v0.0.79 release notes section with linked follow-up documentation for OpenRouter onboarding, managed vLLM changes, completion and logging, Deep Agents runtime limits, policy updates, onboarding recovery, and release validation. - Source summary: - NVIDIA#6461 -> `docs/about/release-notes.mdx`: Documents OpenRouter onboarding support and links to inference/provider references. - NVIDIA#6271 and NVIDIA#6272 -> `docs/about/release-notes.mdx`: Documents shell completion and structured logging highlights. - NVIDIA#6465, NVIDIA#6539, NVIDIA#6570, and NVIDIA#6528 -> `docs/about/release-notes.mdx`: Documents status route-drift, orphaned sandbox, gateway cleanup, and DGX Spark express-install diagnostics. - NVIDIA#6523, NVIDIA#6551, NVIDIA#6484, NVIDIA#6488, NVIDIA#6324, and NVIDIA#6542 -> `docs/about/release-notes.mdx`: Documents managed vLLM, Qwen3.6 tool parser, compaction, and timeout/readiness improvements. - NVIDIA#6559, NVIDIA#6538, NVIDIA#6560, NVIDIA#6568, NVIDIA#6552, NVIDIA#6567, and NVIDIA#6587 -> `docs/about/release-notes.mdx`: Documents runtime, credential, proxy, PID namespace, TOML, and provider-state hardening. - NVIDIA#6541, NVIDIA#5415, NVIDIA#6246, NVIDIA#6496, and NVIDIA#6573 -> `docs/about/release-notes.mdx`: Documents GitHub policy, Gmail policy, MCP allowlist, WhatsApp, and messaging-variant updates. - NVIDIA#6253, NVIDIA#6572, NVIDIA#6444, NVIDIA#6536, and NVIDIA#5860 -> `docs/about/release-notes.mdx`: Documents onboarding resume and create-step recovery improvements. - NVIDIA#6508, NVIDIA#6527, NVIDIA#5506, NVIDIA#6588, NVIDIA#6446, NVIDIA#6447, NVIDIA#6582, NVIDIA#6296, NVIDIA#6367, NVIDIA#6397, and NVIDIA#6505 -> `docs/about/release-notes.mdx`: Documents docs, release-risk, and E2E validation updates. ## 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 <!-- Check exactly one tests line and one docs line. Check other lines when applicable. Add every requested justification or approval reference. --> - [ ] Tests added or updated for changed behavior - [ ] Existing tests cover changed behavior — justification: - [x] Tests not applicable — justification: Release-note prose only. - [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: ## Verification <!-- Check each applicable item only when supported by the requested evidence. Run targeted tests once per relevant change set and rerun after later edits or hook autofixes that can affect the tested behavior. Do not rerun hook-covered checks. --> - [x] PR description includes the DCO sign-off declaration and every commit appears as `Verified` in GitHub - [x] Normal `pre-commit`, `commit-msg`, and `pre-push` hooks passed, or `npm run check:diff` passed when hooks were skipped or unavailable - [x] Targeted behavior tests pass for the current change set, or tests are marked not applicable above — command/result or justification: Tests not applicable, release-note prose only. - [ ] Applicable broad gate passed — `npm test` for broad runtime/test-harness changes; `npm run check` for repo-wide validation/coverage changes — command/result: - [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) - [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) Docs validation note: `npm run docs:check-agent-variants && npm run docs:check-routes && git diff --check` passed. Full `npm run docs` is currently blocked before Fern validation because the pinned `fern-api@5.65.2` package is unavailable from npm (`ETARGET No matching version found`). --- <!-- DCO sign-off is required in this PR description, and every commit must appear as Verified in GitHub. Run: git config user.name && git config user.email --> Signed-off-by: Julie Yaunches <jyaunches@nvidia.com> <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Documentation** * Added release notes for v0.0.79 with a new summary of recent improvements, including onboarding and inference options, operator/CLI diagnostics, sandbox recovery hardening, runtime limits, network policy behavior, and release validation updates. * Added updated references and links for the latest release. <!-- end of auto-generated comment: release notes by coderabbit.ai -->
<!-- markdownlint-disable MD041 --> ## Summary Fixes the post-merge NVIDIA#6587 gap where one paginated provider-list page could omit healthy registry extras beyond entry 100. Reconciliation now uses bounded, gateway-scoped per-provider probes, recognizes the exact wrapped OpenShell NVIDIA#6501 diagnostic, and preserves every indeterminate result. ## Related Issue Follow-up to NVIDIA#6501 and NVIDIA#6587. Supersedes NVIDIA#6518. ## Changes - Probe every recorded extra with argv-safe `provider get -g <gateway> <name>` instead of treating one list page as authoritative. - Omit only exit-1 diagnostics that bind the exact, case-sensitive quoted provider name to a tightly anchored not-found shape, including the wrapped not-found-and-unrecognized form reported in NVIDIA#6501. - Fail open on gateway, transport, authentication, timeout, signal, ambiguous, name-mismatched, or command-spoofed output. - Read canonical stderr/stdout without duplicating Node's composite `output` array, and treat process errors or capture-limit diagnostics as indeterminate. - Bound each probe to 5 seconds and 64 KiB, cap total reconciliation time at 15 seconds, and never mutate the local registry. - Cover stale providers after index 100, the literal wrapped issue diagnostic in a realistic `spawnSync` result, capture truncation, mixed-case names, multi-line diagnostic spoofing, gateway failures, aggregate timeout, and stable repeated sandbox-create provider arguments. The create-time filter is intentionally non-destructive. A provider omitted from one sandbox create remains in the user-owned registry for a later retry; `--fresh` does not purge it. Indeterminate probes preserve the attachment, and the final `sandbox create` remains authoritative and reports any concrete attachment failure. This avoids deleting healthy user configuration because of a transient gateway or transport failure. ## 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 <!-- Check exactly one tests line and one docs line. Check other lines when applicable. Add every requested justification or approval reference. --> - [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: internal provider-state reconciliation only; no CLI, prompt, configuration, policy, or required user action changes. - [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: independent nine-category security review passed after exact-name, whole-diagnostic, subprocess-bound, and fail-open checks. - [ ] Non-success, skipped, or missing CI check accepted by maintainer — check name, approval link, and follow-up issue: ## Verification <!-- Check each applicable item only when supported by the requested evidence. Run targeted tests once per relevant change set and rerun after later edits or hook autofixes that can affect the tested behavior. Do not rerun hook-covered checks. --> - [x] PR description includes the DCO sign-off declaration and every commit appears as `Verified` in GitHub - [x] Normal `pre-commit`, `commit-msg`, and `pre-push` hooks passed, or `npm run check:diff` passed when hooks were skipped or unavailable - [x] Targeted behavior tests pass for the current change set, or tests are marked not applicable above — command/result or justification: CLI unit 14/14 and spawn integration 1/1 passed; the spawn test uses a realistic composite process result, executes two create attempts, and proves identical filtered provider arguments. - [ ] Applicable broad gate passed — `npm test` for broad runtime/test-harness changes; `npm run check` for repo-wide validation/coverage changes — command/result: not applicable to this focused reconciliation change; `npm run typecheck:cli`, `npm run check:diff`, source-shape, test-size, and test-conditional scans passed. - [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) - [ ] 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) Exact-head live validation for `onboard-repair`, `onboard-resume`, and `cloud-onboard` passed at [workflow run 29048610487](https://github.com/NVIDIA/NemoClaw/actions/runs/29048610487) for head `a0ea6e60f98c6e15a6084dba7a5ba9ff1e89215a`. --- <!-- DCO sign-off is required in this PR description, and every commit must appear as Verified in GitHub. Run: git config user.name && git config user.email --> Signed-off-by: Apurv Kumaria <akumaria@nvidia.com> <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * Onboarding and repair now detect and remove stale extra-provider records. * Resume operations can explicitly recreate an existing sandbox while preserving its registry entry. * Sandbox creation and retries now use a consistent, deduplicated provider list. * **Bug Fixes** * Providers are retained when availability checks are inconclusive, preventing accidental removal. * Reconciliation now avoids relying on potentially stale provider-list snapshots and handles diagnostic variations more reliably. <!-- end of auto-generated comment: release notes by coderabbit.ai --> --------- Signed-off-by: Apurv Kumaria <akumaria@nvidia.com> Signed-off-by: Prekshi Vyas <prekshiv@nvidia.com> Signed-off-by: Carlos Villela <cvillela@nvidia.com> Co-authored-by: Shawn Xie <shaxie@nvidia.com> Co-authored-by: Prekshi Vyas <prekshiv@nvidia.com> Co-authored-by: Carlos Villela <cvillela@nvidia.com>
Summary
Reconcile registry-recorded extra providers against the authoritative OpenShell gateway list before sandbox creation. This prevents a stale
tavily-searchrecord from breaking onboarding while preserving every healthy gateway-wide user provider. The PR replaces #6531, preserves Ho Lim's original issue work, and credits Shawn Xie's provider-reconciliation direction from #6518.Related Issue
Fixes #6501.
Changes
provider list -g <gateway> --namesonce when registry extras exist.brave-search,tavily-search, custom, and bridge providers without treating their names as NemoClaw-owned.Type of Change
Quality Gates
Verification
Verifiedin GitHubnpx prek run --from-ref main --to-ref HEADpassesnpm testpasses (broad runtime changes only)npm run docsbuilds without warnings (doc changes only)Additional exact-head validation: CLI type-check, file/commit/push hooks, commitlint, test-size/source-shape budgets, secret scan, and
npm run check:diffpassed. Documentation review found no update required.src/lib/onboard.tsis net-neutral.Signed-off-by: Apurv Kumaria akumaria@nvidia.com
Summary by CodeRabbit
New Features
Bug Fixes