fix(state): accept dashboardPort 0 as no dashboard - #7021
Conversation
A dcode sandbox persists dashboardPort 0 to mean "no dashboard", but the gateway registry parser rejected any value below 1 and threw for the entire read, so a single entry blocked every registry operation (list, onboard, rebuild) and could leave a rebuilt sandbox destroyed. Treat 0 as no dashboard (normalise to null) so one row can no longer fail the whole registry. Fixes #7020 Signed-off-by: Tinson Lai <tinsonl@nvidia.com>
📝 WalkthroughWalkthroughThe gateway registry and sandbox persistence now treat ChangesDashboard port normalization
Estimated code review effort: 2 (Simple) | ~10 minutes Possibly related PRs
Suggested labels: Suggested reviewers: 🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Comment |
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/state/gateway-registry.test.ts`:
- Line 72: Update the test title in the zero persisted dashboard port case to
end with the issue reference suffix "(`#7020`)", preserving the existing title
text and behavior.
🪄 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: 025b97ef-f55a-482d-9632-aaf598629539
📒 Files selected for processing (2)
src/lib/state/gateway-registry.test.tssrc/lib/state/gateway-registry.ts
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 |
PR Review Advisor — InformationalAdvisor assessment: Informational / high confidence Model lanes
Nemotron output stays in workflow artifacts and does not change the assessment above. E2E guidanceAdvisory only. E2E / PR Gate selects and runs jobs independently. Recommended E2E: 2 optional E2E recommendations
1 warning · 0 suggestionsWarningsWarnings do not block.
|
Signed-off-by: Tinson Lai <tinsonl@nvidia.com>
Persist the no-dashboard zero sentinel as null at the common registry serialization boundary while retaining reader compatibility for existing state. Add focused coverage from reused terminal-sandbox metadata through persisted registry reads and host dashboard-port allocation. Signed-off-by: Apurv Kumaria <akumaria@nvidia.com> Co-authored-by: Tinson Lai <tinsonl@nvidia.com>
Signed-off-by: Apurv Kumaria <akumaria@nvidia.com>
cv
left a comment
There was a problem hiding this comment.
Approved at exact head 13f2af5 against current base d034b7f. The refresh commit is merge-only and preserves the reviewed patch; parser, persistence, and allocation tests cover the dashboardPort 0 sentinel. All 54 current checks and exact-diff E2E are green, CodeRabbit is clear, DCO is present, and all commits are Verified.
<!-- markdownlint-disable MD041 --> ## Summary Add the canonical dated changelog entry required before the v0.0.85 release plan can be generated. The entry summarizes the user-visible OpenShell, DGX Station, inference, MCP, onboarding, and recovery changes merged since v0.0.84 and links to their owning guides. ## Changes - Add `docs/changelog/2026-07-16.mdx` with the exact `## v0.0.85` heading, parser-safe SPDX comment, release summary, and detailed bullets. - Link every documented theme to its most specific published OpenClaw guide routes. - Reconcile the release entry with these merged source PRs: - #6726 -> `docs/changelog/2026-07-16.mdx`: Document the supported OpenShell v0.0.85 upgrade, immutable consumed artifacts, multiline exec, credential rewrite diagnostics, and child-process TLS boundary. - #6986 -> `docs/changelog/2026-07-16.mdx`: Document managed MCP behavior shared across supported agents. - #6991 and #7045 -> `docs/changelog/2026-07-16.mdx`: Document qualified DGX Station host preparation and the interactive-terminal boundary for `--station-deepseek`. - #6992, #7001, #7006, and #7044 -> `docs/changelog/2026-07-16.mdx`: Document managed-model reasoning behavior, safe inference route mutation, and verified vLLM served aliases. - #6865, #7010, and #7028 -> `docs/changelog/2026-07-16.mdx`: Document onboarding DNS recovery, explicit notice acceptance, and upgrades with user-local OpenShell. - #7005, #7021, #7029, and #7049 -> `docs/changelog/2026-07-16.mdx`: Document rebuild backup safety, no-dashboard state, managed gateway discovery, and Hermes shields topology checks. ## 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: `test/changelog-docs.test.ts` validates the canonical heading, parser-safe SPDX comment, and detailed entry structure; the docs build validates published routes. - [ ] 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: ## 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 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 — `npx vitest run test/changelog-docs.test.ts` passed 6/6. - [ ] Applicable broad gate passed — `npm test` for broad runtime/test-harness changes; `npm run check` for repo-wide validation/coverage changes — not applicable to this doc-only entry. - [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) — passed with 0 errors and 2 pre-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) — native changelog entries use the required parser-safe MDX SPDX comment instead of 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 NemoClaw v0.0.85. * Documented improvements to compatibility, credential handling, setup validation, recovery workflows, endpoint configuration, gateway discovery, and runtime validation. * Added links to relevant user-guide sections. <!-- end of auto-generated comment: release notes by coderabbit.ai --> Signed-off-by: Charan Jagwani <cjagwani@nvidia.com>
Summary
The gateway registry parser rejected a persisted
dashboardPortof0— the value a no-dashboard (dcode) sandbox records — and threw for the entire registry read, so one such row blocked every registry operation (list,onboard,rebuild) and could leave a rebuilt sandbox destroyed and unrecreatable until the file was hand-edited. Registry reads now treat0as "no dashboard" (equivalent tonull), and registry writes canonicalize either form tonull, so one legacy row can no longer fail host-wide parsing and future writes converge on the canonical representation.Related Issue
Fixes #7020
Changes
src/lib/state/gateway-registry.ts:parseRegistryaccepts adashboardPortof0, rejecting only negative, non-integer, or out-of-range values, and normalizes a stored0tonullin memory so every consumer treats it as no dashboard.src/lib/state/registry.ts: registry serialization canonicalizesdashboardPort: 0tonull. An existing on-disk0is safe immediately on read and is persisted asnullthe next time the registry is written.src/lib/state/gateway-registry.test.ts: adds a regression test asserting a persisted0parses and is surfaced as no dashboard instead of throwing.src/lib/onboard/sandbox-registry-metadata.test.ts: verifies a reused dcode sandbox is persisted and listed withdashboardPort: null, and that a later sandbox allocation still sees the dashboard port as available.Type of Change
Quality Gates
dashboardPort; path-safety (O_NOFOLLOW, symlink rejection), size-limit, and gateway-identity guards are untouched — maintainer review requested.Verification
Signed-off-by:line and every commit appears asVerifiedin GitHubpre-commit,commit-msg, andpre-pushhooks passed, ornpm run check:diffpassed when hooks were skipped or unavailablenpx vitest run src/lib/state/gateway-registry.test.ts→ 5/5 passed; adjacentdashboard-port+registry-normalization→ 42/42 passed. Current-head remote CLI shards, static checks, type checks, security checks, and installer/plugin suites are green.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)Signed-off-by: Tinson Lai tinsonl@nvidia.com
Summary by CodeRabbit
dashboardPort: 0, treating them as having no dashboard.dashboardPortvalues from0to65535, while still rejecting out-of-range inputs.dashboardPortvalue of0.dashboardPortis0.dashboardPort: 0to “no dashboard” (null).