fix(sessions): route sessions passthrough at the sandbox's own agent binary - #6249
Conversation
…binary `nemoclaw <name> sessions [list]` and its `nemohermes hermes sessions` alias hardcoded `openclaw sessions` as the in-sandbox command. Hermes sandboxes ship the `hermes` binary at `/usr/local/bin/hermes` and do not carry `openclaw`, so `openshell sandbox exec --name <hermes> -- openclaw sessions` fails with `openclaw: command not found` before the Hermes agent's sessions surface can respond. Look up the sandbox's agent via `registry.getSandbox(name)` and pick `hermes` when the agent is `hermes`, keeping `openclaw` as the default. The OpenClaw-specific warm-up filter (a NemoClaw onboard artifact) is now gated on the OpenClaw binary path; Hermes sandboxes go straight through `execSandbox` so their native output is preserved verbatim. Fixes #6247 Signed-off-by: Yanyun Liao <yanyunl@nvidia.com>
Code Coverage OverviewLanguages: TypeScript TypeScript / code-coverage/pluginThe overall coverage in the Show a code coverage summary of the most covered files.
TypeScript / code-coverage/cliThe overall coverage in the Show a code coverage summary of the most covered files.
Updated |
|
Note Reviews pausedIt looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the Use the following commands to manage reviews:
Use the checkboxes below for quick actions:
📝 WalkthroughWalkthrough
ChangesSessions passthrough agent routing
Estimated code review effort: 3 (Moderate) | ~20 minutes Suggested labels: Suggested reviewers: 🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Comment |
PR Review Advisor (Nemotron Ultra) — Changes requestedMerge posture: Do not merge yet Action checklist
Findings index
🚨 Required before mergeAddress these before merging unless a maintainer explicitly overrides the advisor with rationale.
|
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 — No blocking findingsMerge posture: No blocking advisor findings Action checklist
Test follow-ups to resolve or justifyIf these cover changed behavior, prefer adding them in this PR; otherwise state why existing coverage is enough or link the follow-up.
This is an automated, non-binding review; it still expects maintainers and agents to respond to each required or warning item. Treat suggestions as current-PR improvements when they touch changed code; defer only with maintainer rationale or a linked follow-up. A human maintainer must make the final merge decision. |
…ault-agent tests Address PR review advisor feedback on #6249: - Update oclif command descriptions in `src/commands/sandbox/sessions.ts` and `src/commands/sandbox/sessions/list.ts`, and the `printSessionsPassthroughHelp` output, so hermes users are no longer told the command passes through to `openclaw sessions` or that all flags are OpenClaw flags. The help now names both agent binaries and scopes warm-up filtering + OpenClaw-only flags to OpenClaw sandboxes. - Add a code comment at the `registry.getSandbox` call documenting the trust boundary: the registry is CLI-owned and sandbox processes cannot mutate it, so the `agent` field is a trusted configuration input; unknown/missing values fall through to the default `openclaw` branch. - Add regression tests: default (null registry entry) uses openclaw binary + filter path; unknown agent value ('custom-future-agent') also falls through to openclaw + filter; help text asserts hermes is named and OpenClaw-only passthrough is not promised. Refs #6247 Signed-off-by: Yanyun Liao <yanyunl@nvidia.com>
PR advisor feedback — addressed in a301f70Advisor #1 (Nemotron Ultra)
Advisor #2
Test-follow-up items ( |
…rict typecheck `build-typecheck` (`tsc -p tsconfig.cli.json`) has stricter `noImplicitAny` than the `build:cli` project graph, and flagged the `(call) => ...` callback parameter in the new `printSessionsPassthroughHelp` describe block as implicit `any`. Annotate it as `unknown[]` (matching vitest's `mock.calls` element type) so the typecheck passes. Refs #6247 Signed-off-by: Yanyun Liao <yanyunl@nvidia.com>
Map the parent command to Hermes' required list subcommand and align help, tests, and docs. Signed-off-by: Carlos Villela <cvillela@nvidia.com>
|
🌿 Preview your docs: https://nvidia-preview-pr-6249.docs.buildwithfern.com/nemoclaw |
Vitest E2E Target Results — ✅ All requested jobs passedRun: 28690239014
|
cv
left a comment
There was a problem hiding this comment.
Reviewed exact head 9c7cf1d. Bare Hermes sessions now maps to the pinned CLI required sessions list command; OpenClaw behavior is preserved. Full local coverage, type, and docs checks passed, refreshed CI is green, and required live sessions-agents-cli plus hermes-e2e both passed. The secondary advisor required path correction is resolved. Its argv concern is covered by the shared real execSandbox guard suite plus exact passthrough argv tests; the registry is host-side and not sandbox-writable. PR #6196 is separately owned; this PR is conflict-free and should land first so that owner can rebase.
Vitest E2E Target Results — ✅ All requested jobs passedRun: 28753214222
|
Signed-off-by: Aaron Erickson <aerickson@nvidia.com>
E2E Target Results — ✅ All requested jobs passedRun: 28838212101
|
<!-- markdownlint-disable MD041 --> ## Summary Prepares the user-facing documentation for NemoClaw v0.0.76 and closes the release-prep documentation gate. It adds the release highlights, documents the arm64 Local NIM warning and expanded image cleanup behavior, and fixes agent-specific command headings in generated guides. ## Changes - Add the v0.0.76 release-notes section and move the shared-gateway route containment entry out of the v0.0.74 history where it was incorrectly placed. - Document the advisory Linux arm64 Local NIM manifest warning in the canonical platform matrix and local-inference guidance. - Document that `gc` scans both gateway-built and locally prebuilt sandbox image repositories. - Keep OpenClaw and Hermes session headings out of the generated Deep Agents command guide. - Add a focused variant regression test for the agent-specific session headings. ### Source summary | Merged sources | Documentation coverage | | --- | --- | | [#6414](#6414), [#6418](#6418), [#6416](#6416), [#6344](#6344) | v0.0.76 release notes and the Deep Agents quickstart/inference routes | | [#6340](#6340) | v0.0.76 release notes and existing Deep Agents observability guidance | | [#6338](#6338), [#6378](#6378), [#6297](#6297) | v0.0.76 release notes and existing inference/troubleshooting guidance | | [#6362](#6362) | v0.0.76 release notes and existing lifecycle, command, and credential guidance | | [#6330](#6330), [#6307](#6307), [#6008](#6008) | v0.0.76 release notes and existing security, troubleshooting, and command guidance | | [#6382](#6382) | v0.0.76 release notes and existing MCP/command guidance | | [#6326](#6326), [#5868](#5868), [#5539](#5539) | v0.0.76 release notes, platform matrix, inference options, and local-inference guidance | | [#6396](#6396), [#6390](#6390), [#6007](#6007) | v0.0.76 release notes and existing messaging guidance | | [#5388](#5388), [#6249](#6249), [#6303](#6303), [#6306](#6306) | v0.0.76 release notes and command/lifecycle guidance | ## Type of Change - [ ] Code change (feature, bug fix, or refactor) - [x] 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: - [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 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 — `npx vitest run --project integration test/generate-platform-docs.test.ts test/agent-variant-docs.test.ts test/sync-agent-variant-docs.test.ts` (3 files, 29 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: - [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 pre-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) --- Signed-off-by: Apurv Kumaria <akumaria@nvidia.com> <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Documentation** * Added v0.0.76 release notes content, and removed an older conflicting bullet from the surrounding release history. * Expanded Local NVIDIA NIM guidance across inference/provider docs, including an advisory for Linux arm64 DGX Spark/DGX Station hosts when a matching `linux/arm64` image manifest is unavailable. * Updated the command reference for correct session-section rendering and clarified `gc` image cleanup sources. * **Tests** * Added coverage ensuring Deep Agents omits sessions headings while Hermes includes them. * **CI** * Refreshed Local NVIDIA NIM provider notes used in the platform matrix. <!-- end of auto-generated comment: release notes by coderabbit.ai --> --------- Signed-off-by: Apurv Kumaria <akumaria@nvidia.com>
…binary (NVIDIA#6249) <!-- markdownlint-disable MD041 --> ## Summary `nemohermes <sandbox> sessions` failed with `openclaw: command not found` because the host-side passthrough always selected the `openclaw` binary, while Hermes sandboxes install `hermes` instead. This change selects the in-sandbox binary from the sandbox's recorded agent, maps bare Hermes `sessions` to `hermes sessions list`, preserves OpenClaw behavior, and documents both command surfaces. ## Related Issue Closes NVIDIA#6247. ## Changes - Resolve the sandbox agent from the host-owned registry before constructing the sessions command. - Route bare Hermes sessions to `hermes sessions list` and explicit `sessions list` flags to the same argv path. - Keep OpenClaw's existing `openclaw sessions` routing and warm-up-session filtering unchanged. - Stream Hermes output through `execSandbox` without applying OpenClaw-specific filtering. - Update CLI help, public command display, and generated command references for OpenClaw and Hermes. - Add regression coverage for Hermes, OpenClaw, missing-agent, unknown-agent, and help-text behavior. - Merge current `main` (`bd38b389af7aa68a767a88058bf849cc83d8486d`) without rewriting contributor history. ## Type of Change - [ ] Code change (feature, bug fix, or refactor) - [x] 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: - [x] Docs updated for user-facing behavior changes - [ ] Docs not applicable — justification: - [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: [Maintainer approval](NVIDIA#6249 (review)); the current-main refresh at `ab547b61b525a5189ee5243f60a01304c151bd97` was re-audited against `execSandbox` and its protected runtime-env wrapper. The host-owned registry selects only the fixed `hermes` or `openclaw` binary, forwarded flags remain discrete argv elements, and the wrapper preserves them through `exec -- "$@"` after removing `OPENCLAW_GATEWAY_TOKEN` from the child environment. - [ ] 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] 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 src/lib/actions/sandbox/sessions` (109/109); `npx vitest run src/lib/actions/sandbox/sessions/passthrough.test.ts src/lib/actions/sandbox/runtime-env.test.ts src/lib/actions/sandbox/exec.multiline-guard.test.ts` (46/46); `npm run typecheck:cli` (passed) - [ ] 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) `npm run docs` passed with zero errors and the two pre-existing Fern warnings. `npm run check:diff` passed at `ab547b61b525a5189ee5243f60a01304c151bd97`, including commitlint, CLI typecheck, gitleaks, formatting, lint, repository checks, and the test-file budget. ### Reproduction and root cause Reporter's environment: - OS: Debian GNU/Linux 13 (trixie). - Architecture: x86_64. - Docker: 26.1.5+dfsg1. - NemoClaw: v0.0.71. - Sandbox agent: Hermes. The reported command failed before Hermes ran: ```console $ nemohermes hermes sessions /bin/bash: line 1: openclaw: command not found ``` The reporter's trace showed the incorrect argv: ```text execve("/home/code/.local/bin/openshell", ["/home/code/.local/bin/openshell", "sandbox", "exec", "--name", "hermes", "--", "openclaw", "sessions"], ...) ``` Every non-help `sessions` entry point funnels through `runSessionsPassthrough`, which previously constructed `["openclaw", "sessions"]` unconditionally. Hermes images instead pin `/usr/local/bin/hermes` in `agents/hermes/manifest.yaml` and do not install an `openclaw` shim. The corrected routing produces these commands: ```text nemohermes hermes sessions -> hermes sessions list nemohermes hermes sessions list --limit 5 -> hermes sessions list --limit 5 ``` The current `main` runtime-env wrapper does not flatten or shell-interpolate these values: it appends the original command as positional argv and executes it with `exec -- "$@"`. The exact passthrough tests cover both Hermes commands, while the current-main runtime-env and real `execSandbox` boundary tests cover argv preservation through that wrapper, so no duplicate test-only production seam was added during the refresh. ### AI Disclosure - [x] AI-assisted — tools: Claude Code and Codex. Signed-off-by: Yanyun Liao <yanyunl@nvidia.com> <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * Sandbox session passthrough is now agent-aware: Hermes runs `hermes sessions list` (and defaults to `list`), while OpenClaw uses its in-sandbox binary. * **Bug Fixes** * Warm-up session filtering/capture is now applied only for OpenClaw sandboxes; non-OpenClaw agents skip it. * Missing or unknown sandbox agent values now reliably fall back to OpenClaw routing. * **Documentation** * Updated CLI help and command reference/docs for Hermes vs OpenClaw, including `sessions` and `sessions list` semantics. * **Tests** * Added routing and help-text coverage using a resettable sandbox registry mock. <!-- end of auto-generated comment: release notes by coderabbit.ai --> --------- Signed-off-by: Yanyun Liao <yanyunl@nvidia.com> Signed-off-by: Carlos Villela <cvillela@nvidia.com> Signed-off-by: Aaron Erickson <aerickson@nvidia.com> Co-authored-by: Carlos Villela <cvillela@nvidia.com> Co-authored-by: Aaron Erickson <aerickson@nvidia.com>
<!-- markdownlint-disable MD041 --> ## Summary Prepares the user-facing documentation for NemoClaw v0.0.76 and closes the release-prep documentation gate. It adds the release highlights, documents the arm64 Local NIM warning and expanded image cleanup behavior, and fixes agent-specific command headings in generated guides. ## Changes - Add the v0.0.76 release-notes section and move the shared-gateway route containment entry out of the v0.0.74 history where it was incorrectly placed. - Document the advisory Linux arm64 Local NIM manifest warning in the canonical platform matrix and local-inference guidance. - Document that `gc` scans both gateway-built and locally prebuilt sandbox image repositories. - Keep OpenClaw and Hermes session headings out of the generated Deep Agents command guide. - Add a focused variant regression test for the agent-specific session headings. ### Source summary | Merged sources | Documentation coverage | | --- | --- | | [NVIDIA#6414](NVIDIA#6414), [NVIDIA#6418](NVIDIA#6418), [NVIDIA#6416](NVIDIA#6416), [NVIDIA#6344](NVIDIA#6344) | v0.0.76 release notes and the Deep Agents quickstart/inference routes | | [NVIDIA#6340](NVIDIA#6340) | v0.0.76 release notes and existing Deep Agents observability guidance | | [NVIDIA#6338](NVIDIA#6338), [NVIDIA#6378](NVIDIA#6378), [NVIDIA#6297](NVIDIA#6297) | v0.0.76 release notes and existing inference/troubleshooting guidance | | [NVIDIA#6362](NVIDIA#6362) | v0.0.76 release notes and existing lifecycle, command, and credential guidance | | [NVIDIA#6330](NVIDIA#6330), [NVIDIA#6307](NVIDIA#6307), [NVIDIA#6008](NVIDIA#6008) | v0.0.76 release notes and existing security, troubleshooting, and command guidance | | [NVIDIA#6382](NVIDIA#6382) | v0.0.76 release notes and existing MCP/command guidance | | [NVIDIA#6326](NVIDIA#6326), [NVIDIA#5868](NVIDIA#5868), [NVIDIA#5539](NVIDIA#5539) | v0.0.76 release notes, platform matrix, inference options, and local-inference guidance | | [NVIDIA#6396](NVIDIA#6396), [NVIDIA#6390](NVIDIA#6390), [NVIDIA#6007](NVIDIA#6007) | v0.0.76 release notes and existing messaging guidance | | [NVIDIA#5388](NVIDIA#5388), [NVIDIA#6249](NVIDIA#6249), [NVIDIA#6303](NVIDIA#6303), [NVIDIA#6306](NVIDIA#6306) | v0.0.76 release notes and command/lifecycle guidance | ## Type of Change - [ ] Code change (feature, bug fix, or refactor) - [x] 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: - [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 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 — `npx vitest run --project integration test/generate-platform-docs.test.ts test/agent-variant-docs.test.ts test/sync-agent-variant-docs.test.ts` (3 files, 29 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: - [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 pre-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) --- Signed-off-by: Apurv Kumaria <akumaria@nvidia.com> <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Documentation** * Added v0.0.76 release notes content, and removed an older conflicting bullet from the surrounding release history. * Expanded Local NVIDIA NIM guidance across inference/provider docs, including an advisory for Linux arm64 DGX Spark/DGX Station hosts when a matching `linux/arm64` image manifest is unavailable. * Updated the command reference for correct session-section rendering and clarified `gc` image cleanup sources. * **Tests** * Added coverage ensuring Deep Agents omits sessions headings while Hermes includes them. * **CI** * Refreshed Local NVIDIA NIM provider notes used in the platform matrix. <!-- end of auto-generated comment: release notes by coderabbit.ai --> --------- Signed-off-by: Apurv Kumaria <akumaria@nvidia.com>
Summary
nemohermes <sandbox> sessionsfailed withopenclaw: command not foundbecause the host-side passthrough always selected theopenclawbinary, while Hermes sandboxes installhermesinstead.This change selects the in-sandbox binary from the sandbox's recorded agent, maps bare Hermes
sessionstohermes sessions list, preserves OpenClaw behavior, and documents both command surfaces.Related Issue
Closes #6247.
Changes
hermes sessions listand explicitsessions listflags to the same argv path.openclaw sessionsrouting and warm-up-session filtering unchanged.execSandboxwithout applying OpenClaw-specific filtering.main(bd38b389af7aa68a767a88058bf849cc83d8486d) without rewriting contributor history.Type of Change
Quality Gates
ab547b61b525a5189ee5243f60a01304c151bd97was re-audited againstexecSandboxand its protected runtime-env wrapper. The host-owned registry selects only the fixedhermesoropenclawbinary, forwarded flags remain discrete argv elements, and the wrapper preserves them throughexec -- "$@"after removingOPENCLAW_GATEWAY_TOKENfrom the child environment.Verification
Verifiedin GitHubpre-commit,commit-msg, andpre-pushhooks passed, ornpm run check:diffpassed when hooks were skipped or unavailablenpx vitest run src/lib/actions/sandbox/sessions(109/109);npx vitest run src/lib/actions/sandbox/sessions/passthrough.test.ts src/lib/actions/sandbox/runtime-env.test.ts src/lib/actions/sandbox/exec.multiline-guard.test.ts(46/46);npm run typecheck:cli(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)npm run docspassed with zero errors and the two pre-existing Fern warnings.npm run check:diffpassed atab547b61b525a5189ee5243f60a01304c151bd97, including commitlint, CLI typecheck, gitleaks, formatting, lint, repository checks, and the test-file budget.Reproduction and root cause
Reporter's environment:
The reported command failed before Hermes ran:
The reporter's trace showed the incorrect argv:
Every non-help
sessionsentry point funnels throughrunSessionsPassthrough, which previously constructed["openclaw", "sessions"]unconditionally.Hermes images instead pin
/usr/local/bin/hermesinagents/hermes/manifest.yamland do not install anopenclawshim.The corrected routing produces these commands:
The current
mainruntime-env wrapper does not flatten or shell-interpolate these values: it appends the original command as positional argv and executes it withexec -- "$@".The exact passthrough tests cover both Hermes commands, while the current-main runtime-env and real
execSandboxboundary tests cover argv preservation through that wrapper, so no duplicate test-only production seam was added during the refresh.AI Disclosure
Signed-off-by: Yanyun Liao yanyunl@nvidia.com
Summary by CodeRabbit
hermes sessions list(and defaults tolist), while OpenClaw uses its in-sandbox binary.sessionsandsessions listsemantics.