Skip to content

Commit df08f88

Browse files
committed
merge: resolve conflicts with latest main
Merge origin/main into feat/jetson-orin-nano-support to resolve conflicts from recent changes (NVIDIA#1208, NVIDIA#1200, NVIDIA#836, NVIDIA#1221, NVIDIA#1223). Jetson detection now leverages main's UNIFIED_MEMORY_GPU_TAGS with added jetson flag and /proc/device-tree fallback. All 116 tests pass.
2 parents 79af0ff + 39e9b1f commit df08f88

114 files changed

Lines changed: 12836 additions & 2802 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.agents/skills/nemoclaw-reference/references/troubleshooting.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ If another process is already bound to this port, onboarding fails.
6969
Identify the conflicting process, verify it is safe to stop, and terminate it:
7070

7171
```console
72-
$ lsof -i :18789
72+
$ sudo lsof -i :18789
7373
$ kill <PID>
7474
```
7575

.dockerignore

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,9 @@ node_modules
44
*.pyc
55
__pycache__
66
.pytest_cache
7+
.venv
8+
.ruff_cache
9+
.mypy_cache
10+
.env
11+
*.egg-info
12+
.DS_Store

.github/PULL_REQUEST_TEMPLATE.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,3 +40,7 @@
4040
- [ ] Follows the [style guide](https://github.com/NVIDIA/NemoClaw/blob/main/docs/CONTRIBUTING.md). Try running the `update-docs` agent skill to draft changes while complying with the style guide. For example, prompt your agent with "`/update-docs` catch up the docs for the new changes I made in this PR."
4141
- [ ] New pages include SPDX license header and frontmatter, if creating a new page.
4242
- [ ] Cross-references and links verified.
43+
44+
---
45+
<!-- DCO sign-off (required by CI). Replace with your real name and email. -->
46+
Signed-off-by: Your Name <your-email@example.com>
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2+
# SPDX-License-Identifier: Apache-2.0
3+
4+
name: basic-checks
5+
description: Run the shared Node.js, hadolint, build, and prek-based checks used by CI.
6+
7+
runs:
8+
using: composite
9+
steps:
10+
- name: Setup Node.js
11+
uses: actions/setup-node@v6
12+
with:
13+
node-version: "22"
14+
cache: npm
15+
16+
- name: Install hadolint
17+
shell: bash
18+
run: |
19+
HADOLINT_VERSION="v2.14.0"
20+
HADOLINT_URL="https://github.com/hadolint/hadolint/releases/download/${HADOLINT_VERSION}/hadolint-Linux-x86_64"
21+
curl -fsSL -o /usr/local/bin/hadolint "$HADOLINT_URL"
22+
EXPECTED=$(curl -fsSL "${HADOLINT_URL}.sha256" | awk '{print $1}')
23+
ACTUAL=$(sha256sum /usr/local/bin/hadolint | awk '{print $1}')
24+
[ "$EXPECTED" = "$ACTUAL" ] || { echo "::error::hadolint checksum mismatch"; exit 1; }
25+
chmod +x /usr/local/bin/hadolint
26+
27+
- name: Install dependencies
28+
shell: bash
29+
run: |
30+
npm install --ignore-scripts
31+
cd nemoclaw && npm install
32+
33+
- name: Build TypeScript plugin
34+
shell: bash
35+
run: cd nemoclaw && npm run build
36+
37+
- name: Run checks
38+
shell: bash
39+
run: npx prek run --all-files --stage pre-push
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2+
# SPDX-License-Identifier: Apache-2.0
3+
4+
name: resolve-sandbox-base-image
5+
description: Resolve the sandbox base image from GHCR, falling back to a local Dockerfile.base build.
6+
7+
runs:
8+
using: composite
9+
steps:
10+
- name: Resolve sandbox base image
11+
shell: bash
12+
run: |
13+
if docker pull ghcr.io/nvidia/nemoclaw/sandbox-base:latest 2>/dev/null; then
14+
echo "BASE_IMAGE=ghcr.io/nvidia/nemoclaw/sandbox-base:latest" >> "$GITHUB_ENV"
15+
else
16+
echo "::warning::GHCR base image not available, building locally"
17+
docker build -f Dockerfile.base -t nemoclaw-sandbox-base-local .
18+
echo "BASE_IMAGE=nemoclaw-sandbox-base-local" >> "$GITHUB_ENV"
19+
fi

.github/dco-bypass.txt

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
adityanjothi
2+
brandonpelfrey
3+
cjagwani
4+
cr7258
5+
cv
6+
dnandakumar-nv
7+
ericksoa
8+
gagandaroach
9+
hulynn
10+
jacobtomlinson
11+
jayavenkatesh19
12+
jbfbell
13+
jieunl24
14+
jneeee
15+
jyaunches
16+
kjw3
17+
krmurph
18+
mercl-lau
19+
miyoungc
20+
nv-ddave
21+
nv-kasikritc
22+
paritoshd-nv
23+
prekshivyas
24+
rwipfelnv
25+
sayalinvidia
26+
senthilr-nv
27+
theFong
28+
wscurran

.github/workflows/base-image.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ jobs:
4545
uses: docker/setup-qemu-action@v3
4646

4747
- name: Set up Docker Buildx
48-
uses: docker/setup-buildx-action@v3
48+
uses: docker/setup-buildx-action@v4
4949

5050
- name: Log in to GHCR
5151
uses: docker/login-action@v3

.github/workflows/dco-check.yaml

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2+
# SPDX-License-Identifier: Apache-2.0
3+
4+
name: dco-check
5+
6+
on:
7+
pull_request:
8+
types: [opened, edited, synchronize, reopened]
9+
10+
permissions:
11+
contents: read
12+
13+
concurrency:
14+
group: ${{ github.workflow }}-${{ github.ref }}
15+
cancel-in-progress: true
16+
17+
jobs:
18+
dco-check:
19+
runs-on: ubuntu-latest
20+
timeout-minutes: 5
21+
permissions:
22+
contents: read
23+
steps:
24+
- name: Check out repository
25+
uses: actions/checkout@v4
26+
27+
- name: Check DCO bypass list
28+
id: dco-bypass
29+
env:
30+
USERNAME: ${{ github.event.pull_request.user.login }}
31+
run: |
32+
if grep -Fxq "$USERNAME" .github/dco-bypass.txt; then
33+
echo "bypass=true" >> "$GITHUB_OUTPUT"
34+
echo "Author is in dco-bypass.txt; skipping DCO sign-off requirement."
35+
else
36+
echo "bypass=false" >> "$GITHUB_OUTPUT"
37+
echo "Author is not in dco-bypass.txt; DCO sign-off is required."
38+
fi
39+
40+
- name: Check PR body for Signed-off-by
41+
if: ${{ steps.dco-bypass.outputs.bypass != 'true' }}
42+
env:
43+
PR_BODY: ${{ github.event.pull_request.body }}
44+
run: |
45+
normalized_body="$(printf '%s\n' "$PR_BODY" | tr -d '\r')"
46+
47+
if ! printf '%s\n' "$normalized_body" | grep -qP '^Signed-off-by:\s+.+\s+<[^<>]+>$'; then
48+
echo "::error::PR description must contain a DCO sign-off line."
49+
echo "::error::Expected format: Signed-off-by: Your Name <your-email@example.com>"
50+
exit 1
51+
fi
52+
53+
echo "PR description contains a DCO sign-off."

.github/workflows/docs-preview-deploy.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ jobs:
7878

7979
- name: Post preview comment
8080
if: steps.meta.outputs.action != 'closed' && steps.meta.outputs.same-repo == 'true'
81-
uses: marocchino/sticky-pull-request-comment@773744901bac0e8cbb5a0dc842800d45e9b2b405 # v2
81+
uses: marocchino/sticky-pull-request-comment@70d2764d1a7d5d9560b100cbea0077fc8f633987 # v3.0.2
8282
with:
8383
header: pr-preview
8484
number: ${{ steps.meta.outputs.pr-number }}
@@ -99,7 +99,7 @@ jobs:
9999

100100
- name: Remove preview comment
101101
if: steps.meta.outputs.action == 'closed'
102-
uses: marocchino/sticky-pull-request-comment@773744901bac0e8cbb5a0dc842800d45e9b2b405 # v2
102+
uses: marocchino/sticky-pull-request-comment@70d2764d1a7d5d9560b100cbea0077fc8f633987 # v3.0.2
103103
with:
104104
header: pr-preview
105105
number: ${{ steps.meta.outputs.pr-number }}

.github/workflows/e2e-brev.yaml

Lines changed: 32 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,28 @@
33

44
name: e2e-brev
55

6+
# Ephemeral Brev E2E: provisions a cloud instance, bootstraps NemoClaw,
7+
# runs test suites remotely, then tears down. Use workflow_dispatch to
8+
# trigger manually from the Actions tab, or workflow_call from other workflows.
9+
#
10+
# Test suites:
11+
# full — Install → onboard → sandbox verify → live inference
12+
# against NVIDIA Endpoints → CLI operations. Tests the
13+
# complete user journey. (~10 min, destroys sandbox)
14+
# credential-sanitization — 24 tests validating PR #743: credential stripping from
15+
# migration snapshots, auth-profiles.json deletion, blueprint
16+
# digest verification, symlink traversal protection, and
17+
# runtime sandbox credential checks. Requires running sandbox.
18+
# telegram-injection — 18 tests validating PR #584: command injection prevention
19+
# through $(cmd), backticks, quote breakout, ${VAR} expansion,
20+
# process table leak checks, and SANDBOX_NAME validation.
21+
# Requires running sandbox.
22+
# all — Runs credential-sanitization + telegram-injection (NOT full,
23+
# which destroys the sandbox the security tests need).
24+
#
25+
# Required secrets: BREV_API_TOKEN, NVIDIA_API_KEY
26+
# Instance cost: Brev CPU credits (~$0.10/run for 4x16 instance)
27+
628
on:
729
workflow_dispatch:
830
inputs:
@@ -15,19 +37,24 @@ on:
1537
required: false
1638
default: ""
1739
test_suite:
18-
description: "Test suite to run"
40+
description: "Test suite to run (see workflow header for descriptions)"
1941
required: true
2042
default: "full"
2143
type: choice
2244
options:
2345
- full
2446
- credential-sanitization
47+
- telegram-injection
2548
- all
2649
keep_alive:
2750
description: "Keep Brev instance alive after tests (for SSH debugging)"
2851
required: false
2952
type: boolean
3053
default: true
54+
brev_token:
55+
description: "Brev refresh token (overrides BREV_API_TOKEN secret if provided)"
56+
required: false
57+
default: ""
3158
workflow_call:
3259
inputs:
3360
branch:
@@ -64,7 +91,7 @@ jobs:
6491
e2e-brev:
6592
if: github.repository == 'NVIDIA/NemoClaw'
6693
runs-on: ubuntu-latest
67-
timeout-minutes: 45
94+
timeout-minutes: 90
6895
steps:
6996
- name: Checkout target branch
7097
uses: actions/checkout@v6
@@ -95,8 +122,8 @@ jobs:
95122

96123
- name: Install Brev CLI
97124
run: |
98-
# Pin to v0.6.310 — v0.6.322 removed --cpu flag and defaults to GPU instances
99-
curl -fsSL -o /tmp/brev.tar.gz "https://github.com/brevdev/brev-cli/releases/download/v0.6.310/brev-cli_0.6.310_linux_amd64.tar.gz"
125+
# Use latest Brev CLI (v0.6.322+) — CPU instances require `brev search cpu | brev create`
126+
curl -fsSL -o /tmp/brev.tar.gz "https://github.com/brevdev/brev-cli/releases/download/v0.6.322/brev-cli_0.6.322_linux_amd64.tar.gz"
100127
tar -xzf /tmp/brev.tar.gz -C /usr/local/bin brev
101128
chmod +x /usr/local/bin/brev
102129
@@ -105,7 +132,7 @@ jobs:
105132

106133
- name: Run ephemeral Brev E2E
107134
env:
108-
BREV_API_TOKEN: ${{ secrets.BREV_API_TOKEN }}
135+
BREV_API_TOKEN: ${{ inputs.brev_token || secrets.BREV_API_TOKEN }}
109136
NVIDIA_API_KEY: ${{ secrets.NVIDIA_API_KEY }}
110137
GITHUB_TOKEN: ${{ github.token }}
111138
INSTANCE_NAME: e2e-pr-${{ inputs.pr_number || github.run_id }}

0 commit comments

Comments
 (0)