feat(agents): add Deep Agents Code harness - #5197
Conversation
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Enterprise Run ID: 📒 Files selected for processing (15)
✅ Files skipped from review due to trivial changes (3)
🚧 Files skipped from review as they are similar to previous changes (6)
📝 WalkthroughWalkthroughAdds ChangesTerminal Agent Runtime Integration
Estimated code review effort🎯 4 (Complex) | ⏱️ ~75 minutes Poem
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Comment |
|
🌿 Preview your docs: https://nvidia-preview-pr-5197.docs.buildwithfern.com/nemoclaw |
E2E Advisor RecommendationRequired E2E: Full advisor summaryE2E Recommendation AdvisorBase: Required E2E
Optional E2E
New E2E recommendations
|
Vitest E2E Scenario RecommendationRequired Vitest E2E scenarios: Dispatch required Vitest E2E scenarios:
Full Vitest E2E advisor summaryVitest E2E Scenario AdvisorBase: Required Vitest E2E scenarios
Optional Vitest E2E scenarios
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. |
This comment was marked as outdated.
This comment was marked as outdated.
There was a problem hiding this comment.
Actionable comments posted: 4
🤖 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/agent/binary-availability.ts`:
- Around line 33-39: The health-check shell snippet misreports a non-executable
explicit binary_path as "not_found" when command -v fails; update the
constructed command in binary-availability.ts (the array building the shell
string that references binaryPath, executable and AGENT_BINARY_CHECK_PREFIX) to
first check existence without execute permission (e.g., test -e or [ -f ] and
not -x) and emit the AGENT_BINARY_CHECK_PREFIX + "not_executable" with the
resolved path before falling back to the command -v branch; apply the same fix
to the analogous block around the lines that reference the same variables (the
second occurrence noted in the comment).
In `@src/lib/agent/runtime-manifest.ts`:
- Around line 24-28: The readStringArray helper currently silently filters out
non-string elements which lets malformed runtime.smoke_commands pass; change
readStringArray (used for parsing RuntimeRecord) to fail fast: if record[key] is
undefined return undefined, but if it's present and not an array throw a
descriptive error, and if it is an array validate that every element is a
string—if any element is not a string throw a descriptive error (include the key
name like "runtime.smoke_commands" in the message) instead of returning a
filtered array so malformed manifests are rejected early.
In `@src/lib/agent/terminal-smoke.ts`:
- Around line 22-29: The smoke-check currently infers success from output text
(using runCaptureOpenshell result -> output and regex matches) which is
unreliable; update the logic to use the command's exit status from
runCaptureOpenshell (e.g., result.exitCode or equivalent) as the source of
truth: inspect the returned result object instead of testing output for
"error"/"failed", treat exitCode === 0 as success even if output is empty, treat
any non-zero exit code as failure and return { ok: false, command, output,
exitCode } (or include exitCode in the success return), and ensure
runCaptureOpenshell call still preserves ignoreError: true so you can read
exitCode from result.
In `@test/sandbox-status-json-stdout.test.ts`:
- Line 4: The import line currently brings in an unused symbol `vi` from Vitest;
remove `vi` from the named import list in the line that reads "import {
afterEach, beforeEach, describe, expect, it, vi } from 'vitest';" (or if the
symbol is intentionally reserved for future use, rename it to `_vi` to satisfy
the unused-variable rule) so the file no longer imports an unused identifier.
🪄 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: bc9db013-0833-44a5-8689-1877e1685cd3
📒 Files selected for processing (16)
agents/langchain-deepagents-code/Dockerfileagents/langchain-deepagents-code/generate-config.tsagents/langchain-deepagents-code/start.shsrc/lib/actions/sandbox/connect.tssrc/lib/actions/sandbox/logs.tssrc/lib/actions/sandbox/status-snapshot.tssrc/lib/agent/binary-availability.tssrc/lib/agent/defs.tssrc/lib/agent/onboard.tssrc/lib/agent/runtime-manifest.tssrc/lib/agent/terminal-smoke.tssrc/lib/onboard.tstest/cli/connect-terminal-agent.test.tstest/langchain-deepagents-code-image.test.tstest/sandbox-logs-terminal.test.tstest/sandbox-status-json-stdout.test.ts
💤 Files with no reviewable changes (1)
- src/lib/onboard.ts
🚧 Files skipped from review as they are similar to previous changes (5)
- src/lib/actions/sandbox/logs.ts
- agents/langchain-deepagents-code/start.sh
- agents/langchain-deepagents-code/Dockerfile
- agents/langchain-deepagents-code/generate-config.ts
- src/lib/agent/onboard.ts
This comment was marked as outdated.
This comment was marked as outdated.
Selective E2E Results — ❌ Some jobs failedRun: 27322004615
|
This comment was marked as outdated.
This comment was marked as outdated.
This comment was marked as outdated.
This comment was marked as outdated.
This comment was marked as outdated.
This comment was marked as outdated.
This comment was marked as outdated.
This comment was marked as outdated.
PR #5197 landed Deep Agents Code as an experimental NemoClaw agent runtime yesterday, but the canonical matrix's agents section still only listed OpenClaw and Hermes. The advisor flagged the published onboarding claim as absent from and contradicted by the matrix. Add a row for LangChain Deep Agents Code that captures: - Status experimental, matching the PR's own framing and the open acceptance epic #4861. - Terminal runtime kind (no in-sandbox gateway or dashboard), so readers know the operational shape differs from OpenClaw/Hermes. - Onboard command `$$nemoclaw onboard --agent deepagents-code` plus a pointer to the existing quickstart. - Managed-harness posture (rejects unmanaged sandbox, MCP, and shell overrides; drops credential-bearing proxy URLs from persisted shell env) so the security boundary is on the page. - Inference routes through `inference.local` via Deep Agents Code's OpenAI-compatible provider. - Reference to issue #4861 for the broader live-runtime acceptance, launch material, and terminal-agent diagnostics work that is not in scope for this PR. Regenerated docs/reference/platform-support.mdx and the .agents/ skills/ + skills/ trees. Signed-off-by: Charan Jagwani <cjagwani@nvidia.com>
NVIDIA#5621) Deep Agents Code ships Tavily/LangSmith deny-by-default (PR NVIDIA#5197). This adds the opt-in path for Tavily web search: - New maintained policy preset nemoclaw-blueprint/policies/presets/tavily.yaml that opens egress to api.tavily.com:443 only, scoped to the python3/node/curl binaries (dcode traffic is attributed to the sandbox python3 interpreter). - Quickstart now documents the concrete enable flow (`nemoclaw <name> policy-add tavily`), where the Tavily credential is supplied at runtime (never baked into managed config/image), and how to remove it. - LangSmith is explicitly documented as not yet supported: no preset opens api.smith.langchain.com and no supported mechanism injects LANGSMITH_API_KEY. - Test asserts the preset declares api.tavily.com and that the Deep Agents Code default policy still denies both Tavily and LangSmith, plus updates the known preset-name list. Live egress validation (that enabling the preset actually reaches api.tavily.com through OpenShell) and the formal decision on LangSmith support remain for the live e2e environment and maintainers. Signed-off-by: Abhimanyu Kumar <abhimanyukumar7290@gmail.com>
## Summary Restore issue #5800 parity package `P0-E` for merged bash-suite deltas only. ## Related Issues Refs #5800 Refs #5098 Refs #5197 Refs #5245 Refs #5508 Refs #5587 ## Scope gate - Package: `P0-E — Platform, tunnel, cloud-experimental, and docs parity decisions` - Included PRs all merged and touched `test/e2e`: yes — #5197, #5245, #5508, #5587 - Out of scope: unmerged/non-bash PRs; shell lane retirement / PR #5756 cleanup ## Parity map | ID | Source PR | Contract | Inference classification | Vitest assertion / waiver | Status | | --- | --- | --- | --- | --- | --- | | E1 | #5197 | Deep Agents Code cloud-experimental Landlock check: `.deepagents` and `/tmp` writable, `/usr` and `/etc` read-only. | `hosted-compatible capable` | `ubuntu-repo-cloud-langchain-deepagents-code` live scenario now runs `05-deepagents-code-landlock-readonly.sh` after onboarding. | covered | | E2 | #5197 | Deep Agents Code arbitrary Python egress permits GitHub/PyPI and blocks Tavily/LangSmith/MCP/example.com absent explicit policy. | `hosted-compatible capable` | `ubuntu-repo-cloud-langchain-deepagents-code` live scenario now runs `06-deepagents-code-python-egress.sh` after onboarding. | covered | | E3 | #5245 | Trace timing signal is trusted summary only; raw target-controlled traces are not uploaded. | `none` | Existing `test/e2e-script-workflow.test.ts` and sanitizer tests cover trusted trace summary, scorecard comparison, and redaction boundary. | covered | | E4 | #5508 | GPU Local Ollama small-context config carries reduced OpenClaw compaction reserve. | `none` / local inference | `test/e2e-scenario/live/gpu-e2e.test.ts` now reads `/sandbox/.openclaw/openclaw.json` and asserts `reserveTokens` / `reserveTokensFloor` for small windows. | covered | | E5 | #5508 | Interactive OpenClaw TUI first turn must not fail auto-compaction. | `none` / local inference | No Vitest TUI fixture exists yet; config-level assertion covers the deterministic contract and the interactive smoke remains platform/manual-runner follow-up. Owner: NemoClaw maintainers; date: 2026-06-25; tracked in #5800 closeout. | waived/follow-up | | E6 | #5587 | Cloudflared exact-version override validates Debian version syntax before APT install. | `hosted-compatible capable` for live tunnel job; resolver itself `none` | Existing `test/cloudflared-version-resolver.test.ts`; tunnel workflow boundary already requires resolver use before `apt-get install cloudflared=${cf_version}`. | covered | ## Inference mode support - Default mode for touched live targets: `hosted-compatible capable` for Deep Agents Code and tunnel lifecycle; local Ollama/GPU uses local inference; trace/resolver tests are `none`. - Real inference support preserved: yes for Deep Agents Code scenario via `NVIDIA_INFERENCE_API_KEY`; yes for tunnel lifecycle via existing hosted-compatible route; local Ollama GPU remains local inference. - Modes validated in this PR: local unit/support tests plus live scenario selection without secret; selective hosted/GPU workflow dispatch required after PR opens. - If not validated with real inference: local machine lacks `NVIDIA_INFERENCE_API_KEY`, GPU runner, and Docker daemon; selective GitHub Actions will validate runner/secret boundaries. ## Validation - [x] `npm run build:cli` - [x] `npx vitest run test/e2e-scenario/support-tests/e2e-scenario-matrix.test.ts test/e2e-scenario/support-tests/e2e-scenario-registry.test.ts test/langchain-deepagents-code-image.test.ts test/ollama-local-openclaw-config-propagation.test.ts test/cloudflared-version-resolver.test.ts --silent=false --reporter=default` - [x] `NEMOCLAW_RUN_E2E_SCENARIOS=1 npx vitest run --project e2e-scenarios-live test/e2e-scenario/live/registry-scenarios.test.ts -t '^ubuntu-repo-cloud-langchain-deepagents-code$' --silent=false --reporter=verbose` (local result: skipped due missing `NVIDIA_INFERENCE_API_KEY`, confirms scenario wiring) - [ ] hosted/public selective E2E workflow, if required by classification: pending PR dispatch ## Follow-ups / waivers - E5: Interactive TUI first-turn smoke remains waived until a Vitest TUI fixture exists. Owner: NemoClaw maintainers; date: 2026-06-25; deterministic config contract is covered here. <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * Added a new cloud onboarding path for LangChain Deep Agents Code, including dedicated fixtures and live scenario coverage. * Surfaced new “cloud experimental” checks in live run planning and scenario matrix output. * **Bug Fixes** * Improved GPU live E2E validation by asserting the reserve-token compaction policy. * Updated Deep Agents Code expected gateway health handling to be optional. * **Security/Policy** * Expanded Deep Agents Code Python egress allowlists for approved GitHub/PyPI hosts. * **Tests** * Updated E2E checks and assertions (including Python egress probe behavior) and adjusted scenario/support-matrix expectations. <!-- end of auto-generated comment: release notes by coderabbit.ai --> --------- Co-authored-by: Carlos Villela <cvillela@nvidia.com>
## Summary Restore issue NVIDIA#5800 parity package `P0-E` for merged bash-suite deltas only. ## Related Issues Refs NVIDIA#5800 Refs NVIDIA#5098 Refs NVIDIA#5197 Refs NVIDIA#5245 Refs NVIDIA#5508 Refs NVIDIA#5587 ## Scope gate - Package: `P0-E — Platform, tunnel, cloud-experimental, and docs parity decisions` - Included PRs all merged and touched `test/e2e`: yes — NVIDIA#5197, NVIDIA#5245, NVIDIA#5508, NVIDIA#5587 - Out of scope: unmerged/non-bash PRs; shell lane retirement / PR NVIDIA#5756 cleanup ## Parity map | ID | Source PR | Contract | Inference classification | Vitest assertion / waiver | Status | | --- | --- | --- | --- | --- | --- | | E1 | NVIDIA#5197 | Deep Agents Code cloud-experimental Landlock check: `.deepagents` and `/tmp` writable, `/usr` and `/etc` read-only. | `hosted-compatible capable` | `ubuntu-repo-cloud-langchain-deepagents-code` live scenario now runs `05-deepagents-code-landlock-readonly.sh` after onboarding. | covered | | E2 | NVIDIA#5197 | Deep Agents Code arbitrary Python egress permits GitHub/PyPI and blocks Tavily/LangSmith/MCP/example.com absent explicit policy. | `hosted-compatible capable` | `ubuntu-repo-cloud-langchain-deepagents-code` live scenario now runs `06-deepagents-code-python-egress.sh` after onboarding. | covered | | E3 | NVIDIA#5245 | Trace timing signal is trusted summary only; raw target-controlled traces are not uploaded. | `none` | Existing `test/e2e-script-workflow.test.ts` and sanitizer tests cover trusted trace summary, scorecard comparison, and redaction boundary. | covered | | E4 | NVIDIA#5508 | GPU Local Ollama small-context config carries reduced OpenClaw compaction reserve. | `none` / local inference | `test/e2e-scenario/live/gpu-e2e.test.ts` now reads `/sandbox/.openclaw/openclaw.json` and asserts `reserveTokens` / `reserveTokensFloor` for small windows. | covered | | E5 | NVIDIA#5508 | Interactive OpenClaw TUI first turn must not fail auto-compaction. | `none` / local inference | No Vitest TUI fixture exists yet; config-level assertion covers the deterministic contract and the interactive smoke remains platform/manual-runner follow-up. Owner: NemoClaw maintainers; date: 2026-06-25; tracked in NVIDIA#5800 closeout. | waived/follow-up | | E6 | NVIDIA#5587 | Cloudflared exact-version override validates Debian version syntax before APT install. | `hosted-compatible capable` for live tunnel job; resolver itself `none` | Existing `test/cloudflared-version-resolver.test.ts`; tunnel workflow boundary already requires resolver use before `apt-get install cloudflared=${cf_version}`. | covered | ## Inference mode support - Default mode for touched live targets: `hosted-compatible capable` for Deep Agents Code and tunnel lifecycle; local Ollama/GPU uses local inference; trace/resolver tests are `none`. - Real inference support preserved: yes for Deep Agents Code scenario via `NVIDIA_INFERENCE_API_KEY`; yes for tunnel lifecycle via existing hosted-compatible route; local Ollama GPU remains local inference. - Modes validated in this PR: local unit/support tests plus live scenario selection without secret; selective hosted/GPU workflow dispatch required after PR opens. - If not validated with real inference: local machine lacks `NVIDIA_INFERENCE_API_KEY`, GPU runner, and Docker daemon; selective GitHub Actions will validate runner/secret boundaries. ## Validation - [x] `npm run build:cli` - [x] `npx vitest run test/e2e-scenario/support-tests/e2e-scenario-matrix.test.ts test/e2e-scenario/support-tests/e2e-scenario-registry.test.ts test/langchain-deepagents-code-image.test.ts test/ollama-local-openclaw-config-propagation.test.ts test/cloudflared-version-resolver.test.ts --silent=false --reporter=default` - [x] `NEMOCLAW_RUN_E2E_SCENARIOS=1 npx vitest run --project e2e-scenarios-live test/e2e-scenario/live/registry-scenarios.test.ts -t '^ubuntu-repo-cloud-langchain-deepagents-code$' --silent=false --reporter=verbose` (local result: skipped due missing `NVIDIA_INFERENCE_API_KEY`, confirms scenario wiring) - [ ] hosted/public selective E2E workflow, if required by classification: pending PR dispatch ## Follow-ups / waivers - E5: Interactive TUI first-turn smoke remains waived until a Vitest TUI fixture exists. Owner: NemoClaw maintainers; date: 2026-06-25; deterministic config contract is covered here. <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * Added a new cloud onboarding path for LangChain Deep Agents Code, including dedicated fixtures and live scenario coverage. * Surfaced new “cloud experimental” checks in live run planning and scenario matrix output. * **Bug Fixes** * Improved GPU live E2E validation by asserting the reserve-token compaction policy. * Updated Deep Agents Code expected gateway health handling to be optional. * **Security/Policy** * Expanded Deep Agents Code Python egress allowlists for approved GitHub/PyPI hosts. * **Tests** * Updated E2E checks and assertions (including Python egress probe behavior) and adjusted scenario/support-matrix expectations. <!-- end of auto-generated comment: release notes by coderabbit.ai --> --------- Co-authored-by: Carlos Villela <cvillela@nvidia.com>
) ## Summary A fresh DCode sandbox has no `dos2unix`, while OpenClaw and Hermes sandboxes do. This adds the package to the Deep Agents Code base image with the same pinned form the other two images already use. ## Related Issue Closes #8691 ## Root Cause `dos2unix` reached the OpenClaw and Hermes base images in #3091 (2026-05-07) as a plain-apt entry. `agents/langchain-deepagents-code/Dockerfile.base` was created 46 days later in #5197 (2026-06-22), so it never inherited that line. #7563 then moved the DCode image onto the same reviewed-artifact boundary and carried the snapshot-pinned `jq` and `vim-tiny` packages across — but not the plain-apt `dos2unix`. That is exactly the reported probe output: `vi: OK`, `jq: OK`, `dos2unix: MISSING`. The two utilities that travelled arrive through the checksum-pinned snapshot path; the one that did not travel is the only one installed through plain apt. ## Changes - `agents/langchain-deepagents-code/Dockerfile.base`: add `"dos2unix=7.5.2-1*"` to the runtime apt layer, immediately after `e2fsprogs`, mirroring the position and pin used at `Dockerfile.base:130` and `agents/hermes/Dockerfile.base:105`. - `test/sandbox-base-security-packages.test.ts`: run the runtime apt layer of each managed base image and assert on the `apt-get install` invocation it actually issues. Parameterized over all three images and both architectures (6 cases), so it fails when an image stops installing the utility rather than only when the literal string leaves the Dockerfile. Verified to have teeth: deleting the pin from the Deep Agents Code base fails exactly the two Deep Agents Code cases and leaves the other four passing. The version pin transfers verbatim because the DCode runtime stage uses a base image digest byte-identical to OpenClaw's (`node:22-trixie-slim@sha256:e6d9a389...`). ## The wildcard is required, not stylistic Debian trixie ships `dos2unix` as `7.5.2-1` on amd64 but as the binNMU `7.5.2-1+b1` on arm64. An exact `dos2unix=7.5.2-1` pin builds on amd64 and fails on arm64 — the reporter's own platform (Jetson Thor). ## Two-architecture install evidence The patched runtime apt layer was built and run on both architectures from the pinned base image. This is a real install and a real conversion, not an `apt-get -s` simulation. ```text # amd64 — reporter's exact probe command ps: OK top: OK free: OK uptime: OK vmstat: OK dos2unix: OK dos2unix 7.5.2 (2024-01-22) printf 'a\r\nb\r\n' | dos2unix -> od -c: 0000000 a \n b \n # arm64 — the reporter's platform dpkg --print-architecture: arm64 command -v dos2unix: /usr/bin/dos2unix installed version: 7.5.2-1+b1 printf 'x\r\ny\r\n' | dos2unix -> od -c: 0000000 x \n y \n ``` For contrast, the exact pin fails on arm64 at resolution time: ```text arm64: E: Version '7.5.2-1' for 'dos2unix' was not found ``` Both architectures report `0 upgraded, 1 newly installed` — the package pulls no transitive dependencies, so image surface grows by `dos2unix` alone. ## Deliberately not changed - **Security-package inventory.** `dos2unix` is a plain apt package, not one of the 10 snapshot/rebuilt debs. OpenClaw installs it yet omits it from that inventory, and `test/sandbox-base-security-packages.test.ts` asserts the inventory with an exact `toEqual` — adding an entry there would break the contract. - **Docs.** `docs/deployment/sandbox-hardening.mdx:20` is the repo's only `dos2unix` prose. It declares `agent-variants: ["openclaw"]`, so it does not formally cover DCode today. After this change that sentence is true of all three images, so no doc text is left needing correction. Extending the page's variant scope needs a matching `docs/index.yml` entry and a new `configure-sandboxes` slug in the deepagents tree, or `scripts/sync-agent-variant-docs.mts` hard-fails — a separate change that equally affects Hermes. ## 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: the only `dos2unix` prose is `docs/deployment/sandbox-hardening.mdx:20`, which is `agent-variants: ["openclaw"]` scoped. This change makes that existing sentence true of all three images rather than requiring new or corrected text. Extending the page to the deepagents variant is a separate change that equally affects Hermes. - [x] 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: requesting maintainer review. The change adds one Debian-pinned utility to the DCode sandbox base apt layer. It installs no setuid binaries and pulls no transitive dependencies on either architecture; it does not touch the reviewed snapshot/checksum path, the security-package inventory, capabilities, or network policy. - [ ] Non-success, skipped, or missing CI check accepted by maintainer — check name, approval link, and follow-up issue: ## Documentation Writer Review - [ ] Documentation writer subagent reviewed the completed changes - Result: `no-docs-needed` - Evidence: no documentation paths changed. The repo's only `dos2unix` prose is `docs/deployment/sandbox-hardening.mdx:20`, which this change makes accurate for all three managed images rather than requiring an edit. - Agent: Claude Code ## 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 - [x] Targeted behavior tests pass for the current change set — `npx vitest run` over the base-image surface: 13 files, 184 tests passing (`sandbox-base-runtime-tools`, `sandbox-base-security-packages`, `dcode-base-image-workflow`, `langchain-deepagents-code-profile-build-gate`, `base-image-publication`, `src/lib/sandbox-base-image/**`, `deep-agents-code-base-image`) - [ ] Applicable broad gate passed — not applicable; this is a single-package Dockerfile change, not a broad runtime or test-harness change - [x] Quality Gates section completed with required justifications or waivers - [x] No secrets, API keys, or credentials committed - [ ] `npm run docs` builds without warnings (doc changes only) - [ ] Doc pages follow the style guide (doc changes only) - [ ] New doc pages include SPDX header and frontmatter (new pages only) Additional checks run locally: - `hadolint 2.14.0` (the checksum-pinned CI version) on the edited Dockerfile: exit 0, zero findings. `DL3008` is active — the quoted wildcard satisfies it. - `npm run typecheck`: clean. - Two-architecture build and probe of the patched apt layer, as quoted above. **CI timing note for reviewers:** PR CI does not build the edited file. `base-image.yaml` triggers on push-to-main, `v*` tags, and `workflow_dispatch` only. The `managed-images.yaml` pull_request lane fires on `agents/**` but resolves the already-published `langchain-deepagents-code-sandbox-base:latest` and builds only `agents/langchain-deepagents-code/Dockerfile` — it completed in about a minute on this PR, which is consistent with no base build. The `pr-self-hosted.yaml` `build-sandbox-images` jobs likewise resolve the published base and build the production `Dockerfile`. The two-architecture evidence above stands in for that gap; happy to trigger a `workflow_dispatch` base build if you want a real in-CI build before merge. Signed-off-by: Dongni Yang <dongniy@nvidia.com> <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * Added `dos2unix` to the runtime environment for supported security images and architectures. * **Tests** * Added coverage to verify successful installation of the expected `dos2unix` package version. <!-- end of auto-generated comment: release notes by coderabbit.ai --> --------- Signed-off-by: Dongni Yang <dongniy@nvidia.com>
Summary
Adds experimental LangChain Deep Agents Code support as a terminal-oriented NemoClaw harness. The change introduces manifest-driven terminal runtime handling so NemoClaw can onboard, status-check, log, snapshot, and document an agent that does not expose an in-sandbox gateway.
Related Issue
Refs #4861. This PR is scoped to the experimental harness/framework slice; #4861 remains open for live runtime acceptance, release/launch material, and broader terminal-agent diagnostics.
Changes
agents/langchain-deepagents-code/with pinneddeepagents-code[nvidia], manageddcodewrapper, deterministic non-secretconfig.tomlgeneration, sandbox policy additions, and durable state declarations.gatewayvsterminalruntime metadata and skips dashboard forwarding, gateway recovery, and gateway log probing for terminal agents.Type of Change
Verification
Targeted local verification plus commit/push hooks were used by design; full
npm testwas not run locally.npx prek run --all-filespassesnpm testpassesnpm run docsbuilds without warnings (doc changes only)Ran:
npm run build:clinpx vitest run src/lib/onboard/initial-policy.test.ts src/lib/agent/defs.test.ts src/lib/agent/runtime.test.ts test/process-recovery.test.ts test/onboard-dashboard.test.ts test/langchain-deepagents-code-config.test.ts test/onboard-sandbox-name.test.tsnpx vitest run test/e2e-scenario/support-tests/e2e-manifests.test.ts test/e2e-scenario/support-tests/e2e-live-registry-discovery.test.ts test/e2e-scenario/support-tests/e2e-scenario-matrix.test.tsnpx vitest run test/langchain-deepagents-code-image.test.tsnpx vitest run src/lib/agent/runtime-terminal.test.tsnpx tsx scripts/validate-configs.tsbash -n agents/langchain-deepagents-code/start.shbash -n agents/langchain-deepagents-code/dcode-wrapper.shnpx prek run shellcheck --files agents/langchain-deepagents-code/start.sh agents/langchain-deepagents-code/dcode-wrapper.sha0a1f1281codex/4861-langchain-deepagents-code, including latest push toa0a1f1281E2E / Vitest Scenariosworkflow fora0a1f1281: https://github.com/NVIDIA/NemoClaw/actions/runs/27326191673Signed-off-by: Carlos Villela cvillela@nvidia.com
Summary by CodeRabbit
Release Notes