Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
108 commits
Select commit Hold shift + click to select a range
6268385
fix: carry reviewed npm audit into protected builds
sandl99 Sep 7, 2026
ddca63d
refactor: narrow protected audit fix
sandl99 Sep 7, 2026
3d4672a
fix: order audit response type guards
sandl99 Sep 7, 2026
db2b598
fix: carry audit through protected cache seed
sandl99 Sep 7, 2026
a88afed
test: model protected audit verification helper
sandl99 Sep 7, 2026
46f28b5
fix(security): pin protected audit evidence paths
sandl99 Sep 7, 2026
fcd1873
Merge branch 'main' into fix/npm-audit-incomplete-11088
sandl99 Sep 8, 2026
cd32fc1
refactor: reduce protected audit handoff
sandl99 Sep 8, 2026
be13769
fix: preserve audit evidence in protected cache
sandl99 Sep 8, 2026
38ee435
test: stage protected audit verifier in fixtures
sandl99 Sep 8, 2026
5eaf8f5
Merge branch 'main' into fix/npm-audit-incomplete-11088
sandl99 Sep 8, 2026
d4c2731
Merge branch 'main' into fix/npm-audit-incomplete-11088
sandl99 Sep 8, 2026
cd3679e
fix(security): preserve protected audit isolation
rsliter Sep 8, 2026
08bb2e2
fix(images): preserve audit RUN parsing
rsliter Sep 8, 2026
8ac4d29
merge(security): refresh protected audit fix
rsliter Sep 8, 2026
253f247
fix(images): clean failed protected cache exports
rsliter Sep 8, 2026
5073932
test(security): verify protected audit handoff
rsliter Sep 8, 2026
bdf27c8
test(security): keep audit handoff setup direct
rsliter Sep 8, 2026
e7b9017
test(security): rely on audit verifier bindings
rsliter Sep 8, 2026
31d6876
merge(security): refresh protected audit handoff
rsliter Sep 8, 2026
ff73c97
fix(images): retry reviewed audit export
rsliter Sep 8, 2026
6a64064
merge(images): refresh reviewed audit export
rsliter Sep 8, 2026
20e04a2
merge(images): refresh reviewed audit export
rsliter Sep 8, 2026
b9b31a0
fix(security): reject build-context audit evidence
rsliter Sep 8, 2026
a5a7bd5
test(images): detect changed audit receipt
rsliter Sep 8, 2026
f479884
merge: refresh PR 11156 onto main
rsliter Sep 8, 2026
5d2782c
fix(audit): retry refused registry connections
rsliter Sep 8, 2026
4a8ab51
merge: refresh PR 11156 onto main
rsliter Sep 8, 2026
451ca9b
refactor(audit): share mcporter evidence verification
rsliter Sep 8, 2026
e433dfc
test(images): retain base audit outputs
rsliter Sep 8, 2026
3cfbff6
merge: refresh PR 11156 onto main
rsliter Sep 8, 2026
bdd9385
test(audit): execute protected mcporter handoff
rsliter Sep 8, 2026
fdb356e
merge: refresh PR #11156 with main
rsliter Sep 8, 2026
e165162
test(audit): keep producer handoff coverage lean
rsliter Sep 8, 2026
2512f82
merge: refresh PR #11156 with main
rsliter Sep 9, 2026
1871df2
merge: refresh PR #11156 with main
rsliter Sep 9, 2026
b6dce0c
fix(images): diagnose empty audit receipt hashes
rsliter Sep 9, 2026
ef37a0a
fix(e2e): run protected cache consumer from candidate
rsliter Sep 9, 2026
f946900
fix(ci): isolate candidate image build from docker auth
rsliter Sep 9, 2026
4ba522b
test(audit): canonicalize handoff temp path
jyaunches Sep 9, 2026
070c6a0
fix(ci): preserve trusted protected controller
rsliter Sep 9, 2026
8a8d335
merge: preserve concurrent PR #11156 fix
rsliter Sep 9, 2026
3f56655
merge: refresh PR #11156 with main
rsliter Sep 9, 2026
07459b1
fix(ci): trust protected npm audit handoff
rsliter Sep 9, 2026
c3a9682
Merge remote-tracking branch 'origin/main' into refresh-pr11156
rsliter Sep 9, 2026
1fc8653
docs(audit): describe trusted protected producer
rsliter Sep 9, 2026
897354b
refactor(ci): inline audit evidence input
rsliter Sep 9, 2026
cb44beb
fix(ci): remove stale audit state
rsliter Sep 9, 2026
e8531ca
Merge branch 'main' into fix/npm-audit-incomplete-11088
cv Sep 9, 2026
a0120b0
Merge remote-tracking branch 'origin/main' into fix/npm-audit-incompl…
jyaunches Sep 9, 2026
116d974
fix(ci): align protected audit workflow gates
jyaunches Sep 9, 2026
ab18eac
fix(ci): reuse audit evidence before protected builds
sandl99 Sep 9, 2026
40c2554
fix(ci): scope reviewed audit cache identity
jyaunches Sep 9, 2026
177f497
merge: integrate latest PR repairs
jyaunches Sep 9, 2026
c30ac05
Merge remote-tracking branch 'origin/main' into fix/npm-audit-incompl…
jyaunches Sep 9, 2026
8ab0aa4
test(ci): verify paired audit evidence handoff
jyaunches Sep 9, 2026
a638f70
Merge remote-tracking branch 'origin/main' into fix/npm-audit-incompl…
jyaunches Sep 9, 2026
663d7cf
fix(ci): centralize protected audit authority
jyaunches Sep 9, 2026
069cfa2
merge: integrate latest main into audit fix
rsliter Sep 9, 2026
1f9c0bb
fix(ci): refresh plugin cache seed identity
rsliter Sep 9, 2026
d92eff4
fix(audit): retry empty transport responses
rsliter Sep 9, 2026
284b0ce
merge: resolve conflicts with main
github-actions[bot] Sep 9, 2026
47708ed
test(security): isolate forged audit result
rsliter Sep 9, 2026
fbc4312
merge: prepare trusted conflict resolution
rsliter Sep 9, 2026
307ddd9
Merge branch 'main' into fix/npm-audit-incomplete-11088
rsliter Sep 9, 2026
65893ca
merge: restore reviewed protected audit resolution
rsliter Sep 9, 2026
320d57d
merge: prepare trusted conflict resolution
rsliter Sep 9, 2026
dbe9f0e
merge: integrate current main
rsliter Sep 9, 2026
7b3d841
merge: restore reviewed protected audit resolution
rsliter Sep 9, 2026
1b2805e
test(security): align audit fixture with Node 22
rsliter Sep 9, 2026
a6aead6
fix(ci): complete reviewed audit follow-up
jyaunches Sep 9, 2026
a8789d8
merge: integrate current main
jyaunches Sep 9, 2026
d0b70f7
test(security): align audit fixture with Node 22
rsliter Sep 9, 2026
2a88fc3
fix(build): tolerate omitted audit hash args
jyaunches Sep 9, 2026
16af7c9
Merge branch 'main' into fix/npm-audit-incomplete-11088
rsliter Sep 9, 2026
cf181d4
docs(audit): split handoff trust boundaries
jyaunches Sep 9, 2026
98f93c4
merge: integrate latest main
jyaunches Sep 9, 2026
3b1c655
merge: integrate current main
jyaunches Sep 9, 2026
c8f51be
merge: preserve protected PR history
jyaunches Sep 9, 2026
4b3130d
Merge branch 'main' into fix/npm-audit-incomplete-11088
rsliter Sep 9, 2026
91f49ab
Merge branch 'main' into fix/npm-audit-incomplete-11088
rsliter Sep 9, 2026
d59be95
Merge branch 'main' into fix/npm-audit-incomplete-11088
rsliter Sep 10, 2026
aa9075d
merge(ci): integrate trusted protected audit handoff
sandl99 Sep 10, 2026
73b67a6
merge(ci): consume published base and isolate vLLM fixtures
sandl99 Sep 10, 2026
71dd288
merge: integrate published main for protected image evidence
sandl99 Sep 10, 2026
a126c3f
merge: refresh PR #11156 onto current main
rsliter Sep 10, 2026
0d8a071
merge: include latest main in PR #11156
rsliter Sep 10, 2026
733c00a
Merge branch 'main' into fix/npm-audit-incomplete-11088
rsliter Sep 10, 2026
23a959a
Merge branch 'main' into fix/npm-audit-incomplete-11088
rsliter Sep 10, 2026
e0e1f71
Merge branch 'main' into fix/npm-audit-incomplete-11088
rsliter Sep 10, 2026
d364d1b
Merge branch 'main' into fix/npm-audit-incomplete-11088
rsliter Sep 10, 2026
0a17166
Merge branch 'main' into fix/npm-audit-incomplete-11088
rsliter Sep 10, 2026
736414d
Merge branch 'main' into fix/npm-audit-incomplete-11088
rsliter Sep 10, 2026
7268da9
merge: refresh PR #11156 onto main
rsliter Sep 10, 2026
063bfea
merge: include latest main in PR #11156
rsliter Sep 10, 2026
622b780
merge: include current main in PR #11156
rsliter Sep 10, 2026
c0e5a73
fix(ci): use current audit verifier flag
rsliter Sep 10, 2026
3747466
merge: refresh PR #11156 onto current main
rsliter Sep 10, 2026
1441df8
merge: include latest main in PR #11156
rsliter Sep 10, 2026
fb2c91e
fix(security): bind protected audit evidence
rsliter Sep 10, 2026
ffb23b1
fix(security): preserve shell-only audit verification
rsliter Sep 10, 2026
ace89a7
fix(security): parse cached audit receipts strictly
rsliter Sep 11, 2026
31645fc
style(test): apply audit handoff formatting
rsliter Sep 11, 2026
abbed15
fix(security): trim protected audit handoff
sandl99 Sep 11, 2026
86ca177
Merge branch 'main' into fix/npm-audit-incomplete-11088
sandl99 Sep 11, 2026
1bd6e08
merge: use published base for protected GPU qualification
sandl99 Sep 11, 2026
38fa1eb
test: isolate vLLM profile selection from host probes
sandl99 Sep 11, 2026
ca72fcb
test: retain bounded gateway diagnostics for activation failures
sandl99 Sep 11, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 9 additions & 1 deletion .github/actions/build-base-image-platform/action.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,10 @@ inputs:
description: Optional same-run reviewed mcporter raw audit report path.
required: false
default: ""
mcporter-audit-policy-result:
description: Optional same-run reviewed mcporter audit policy result path.
required: false
default: ""

runs:
using: composite
Expand All @@ -74,6 +78,7 @@ runs:
OPENCLAW_VERSION_INPUT: ${{ inputs.openclaw-version }}
MCPORTER_AUDIT_RECEIPT: ${{ inputs.mcporter-audit-receipt }}
MCPORTER_AUDIT_RAW_REPORT: ${{ inputs.mcporter-audit-raw-report }}
MCPORTER_AUDIT_POLICY_RESULT: ${{ inputs.mcporter-audit-policy-result }}
run: |
set -euo pipefail
build_args=()
Expand Down Expand Up @@ -101,7 +106,9 @@ runs:
if [ "$AGENT" = "openclaw" ] && [ -n "${MCPORTER_AUDIT_RECEIPT:-}" ]; then
test -f "$MCPORTER_AUDIT_RECEIPT"
test -f "${MCPORTER_AUDIT_RAW_REPORT:-}"
audit_build_args="NEMOCLAW_MCPORTER_AUDIT_RECEIPT_SHA256=$(sha256sum "$MCPORTER_AUDIT_RECEIPT" | cut -d' ' -f1)"
test -f "${MCPORTER_AUDIT_POLICY_RESULT:-}"
audit_build_args="NEMOCLAW_MCPORTER_AUDIT_RECEIPT_SHA256=$(sha256sum "$MCPORTER_AUDIT_RECEIPT" | cut -d' ' -f1)
NEMOCLAW_MCPORTER_AUDIT_POLICY_RESULT_SHA256=$(sha256sum "$MCPORTER_AUDIT_POLICY_RESULT" | cut -d' ' -f1)"
fi
printf 'openclaw_build_arg=%s\n' "$openclaw_build_arg" >> "$GITHUB_OUTPUT"
if [ -n "$audit_build_args" ]; then
Expand All @@ -127,6 +134,7 @@ runs:
secret-files: |
${{ inputs.agent == 'openclaw' && format('nemoclaw-mcporter-audit-receipt={0}', inputs.mcporter-audit-receipt) || '' }}
${{ inputs.agent == 'openclaw' && format('nemoclaw-mcporter-audit-raw-report={0}', inputs.mcporter-audit-raw-report) || '' }}
${{ inputs.agent == 'openclaw' && format('nemoclaw-mcporter-audit-policy-result={0}', inputs.mcporter-audit-policy-result) || '' }}

- name: Validate Deep Agents Code dos2unix executable
if: ${{ inputs.agent == 'langchain-deepagents-code' }}
Expand Down
1 change: 1 addition & 0 deletions .github/workflows/base-image-platform.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -86,3 +86,4 @@ jobs:
openclaw-version: ${{ inputs.openclaw-version }}
mcporter-audit-receipt: ${{ inputs.agent == 'openclaw' && format('{0}/reviewed-npm-audit/mcporter-runtime.receipt.json', runner.temp) || '' }}
mcporter-audit-raw-report: ${{ inputs.agent == 'openclaw' && format('{0}/reviewed-npm-audit/mcporter-runtime.raw.json', runner.temp) || '' }}
mcporter-audit-policy-result: ${{ inputs.agent == 'openclaw' && format('{0}/reviewed-npm-audit/mcporter-runtime.policy.json', runner.temp) || '' }}
59 changes: 50 additions & 9 deletions .github/workflows/managed-images.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -482,6 +482,25 @@ jobs:
name: reviewed-npm-audit
path: ${{ runner.temp }}/reviewed-npm-audit

- name: Checkout trusted mcporter audit verifier
if: matrix.agent == 'openclaw'
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
ref: ${{ github.event.pull_request.base.sha }}
path: .trusted-mcporter-audit
persist-credentials: false
sparse-checkout: |
ci/npm-audit-exceptions.json
ci/reviewed-npm-audit.json
scripts/lib/npm-audit-receipt.mts
scripts/lib/reviewed-npm-audit.mts
sparse-checkout-cone-mode: false

- name: Set up Node.js
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
with:
node-version: 22.19.0

- name: Prepare same-run mcporter audit evidence
if: matrix.agent == 'openclaw'
id: mcporter-audit
Expand All @@ -490,18 +509,29 @@ jobs:
set -euo pipefail
receipt="$RUNNER_TEMP/reviewed-npm-audit/mcporter-runtime.receipt.json"
raw="$RUNNER_TEMP/reviewed-npm-audit/mcporter-runtime.raw.json"
test -f "$receipt"; test -f "$raw"
printf 'receipt=%s\nraw=%s\nreceipt_sha256=%s\n' "$receipt" "$raw" "$(sha256sum "$receipt" | cut -d' ' -f1)" >> "$GITHUB_OUTPUT"
policy="$RUNNER_TEMP/reviewed-npm-audit/mcporter-runtime.policy.json"
trusted_root="$GITHUB_WORKSPACE/.trusted-mcporter-audit"
test "$(git -C "$trusted_root" rev-parse --verify HEAD)" = '${{ github.event.pull_request.base.sha }}'
node --experimental-strip-types --no-warnings \
"$trusted_root/scripts/lib/npm-audit-receipt.mts" \
--receipt "$receipt" \
--package-json "$GITHUB_WORKSPACE/agents/openclaw/mcporter-runtime/package.json" \
--package-lock "$GITHUB_WORKSPACE/agents/openclaw/mcporter-runtime/package-lock.json" \
--raw-report "$raw" \
--exceptions "$trusted_root/ci/npm-audit-exceptions.json" \
--graph mcporter-runtime \
--audit-config "$trusted_root/ci/reviewed-npm-audit.json" \
--registry https://registry.yarnpkg.com \
--threshold high \
--legacy-audit true \
--result "$policy"
test -f "$receipt"; test -f "$raw"; test -s "$policy"; test ! -L "$policy"
printf 'receipt=%s\nraw=%s\npolicy=%s\nreceipt_sha256=%s\npolicy_sha256=%s\n' "$receipt" "$raw" "$policy" "$(sha256sum "$receipt" | cut -d' ' -f1)" "$(sha256sum "$policy" | cut -d' ' -f1)" >> "$GITHUB_OUTPUT"

- name: Set up Docker Buildx
id: buildx
uses: docker/setup-buildx-action@bb05f3f5519dd87d3ba754cc423b652a5edd6d2c # v4.2.0

- name: Set up Node.js
uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
with:
node-version: 22.19.0

- name: Validate Deep Agents PR base build arguments
if: matrix.agent == 'langchain-deepagents-code'
shell: bash
Expand Down Expand Up @@ -550,7 +580,9 @@ jobs:
RESOLUTION_LABEL: ${{ steps.base.outputs.resolution_label }}
MCPORTER_AUDIT_RECEIPT: ${{ steps.mcporter-audit.outputs.receipt }}
MCPORTER_AUDIT_RAW_REPORT: ${{ steps.mcporter-audit.outputs.raw }}
MCPORTER_AUDIT_POLICY_RESULT: ${{ steps.mcporter-audit.outputs.policy }}
MCPORTER_AUDIT_RECEIPT_SHA256: ${{ steps.mcporter-audit.outputs.receipt_sha256 }}
MCPORTER_AUDIT_POLICY_RESULT_SHA256: ${{ steps.mcporter-audit.outputs.policy_sha256 }}
run: |
set -euo pipefail
# The base resolver loads a changed base into Docker's local image
Expand All @@ -561,8 +593,10 @@ jobs:
if [ "$AGENT" = "openclaw" ]; then
audit_options+=(
--build-arg "NEMOCLAW_MCPORTER_AUDIT_RECEIPT_SHA256=${MCPORTER_AUDIT_RECEIPT_SHA256}"
--build-arg "NEMOCLAW_MCPORTER_AUDIT_POLICY_RESULT_SHA256=${MCPORTER_AUDIT_POLICY_RESULT_SHA256}"
--secret "id=nemoclaw-mcporter-audit-receipt,src=${MCPORTER_AUDIT_RECEIPT}"
--secret "id=nemoclaw-mcporter-audit-raw-report,src=${MCPORTER_AUDIT_RAW_REPORT}"
--secret "id=nemoclaw-mcporter-audit-policy-result,src=${MCPORTER_AUDIT_POLICY_RESULT}"
)
fi
if [ "$AGENT" = "langchain-deepagents-code" ]; then
Expand Down Expand Up @@ -618,9 +652,11 @@ jobs:
NEMOCLAW_MANAGED_IMAGE_CAPABILITY_UNION=1
NEMOCLAW_MANAGED_IMAGE_RUNTIME_USER=root
${{ matrix.agent == 'openclaw' && format('NEMOCLAW_MCPORTER_AUDIT_RECEIPT_SHA256={0}', steps.mcporter-audit.outputs.receipt_sha256) || '' }}
${{ matrix.agent == 'openclaw' && format('NEMOCLAW_MCPORTER_AUDIT_POLICY_RESULT_SHA256={0}', steps.mcporter-audit.outputs.policy_sha256) || '' }}
secret-files: |
${{ matrix.agent == 'openclaw' && format('nemoclaw-mcporter-audit-receipt={0}', steps.mcporter-audit.outputs.receipt) || '' }}
${{ matrix.agent == 'openclaw' && format('nemoclaw-mcporter-audit-raw-report={0}', steps.mcporter-audit.outputs.raw) || '' }}
${{ matrix.agent == 'openclaw' && format('nemoclaw-mcporter-audit-policy-result={0}', steps.mcporter-audit.outputs.policy) || '' }}
cache-from: type=registry,ref=ghcr.io/nvidia/nemoclaw/${{ matrix.agent }}-sandbox:buildcache-linux-amd64
provenance: false
sbom: false
Expand Down Expand Up @@ -853,9 +889,11 @@ jobs:
NEMOCLAW_MANAGED_IMAGE_CAPABILITY_UNION=1
NEMOCLAW_MANAGED_IMAGE_RUNTIME_USER=root
${{ matrix.agent == 'openclaw' && format('NEMOCLAW_MCPORTER_AUDIT_RECEIPT_SHA256={0}', steps.mcporter-audit.outputs.receipt_sha256) || '' }}
${{ matrix.agent == 'openclaw' && format('NEMOCLAW_MCPORTER_AUDIT_POLICY_RESULT_SHA256={0}', steps.mcporter-audit.outputs.policy_sha256) || '' }}
secret-files: |
${{ matrix.agent == 'openclaw' && format('nemoclaw-mcporter-audit-receipt={0}', steps.mcporter-audit.outputs.receipt) || '' }}
${{ matrix.agent == 'openclaw' && format('nemoclaw-mcporter-audit-raw-report={0}', steps.mcporter-audit.outputs.raw) || '' }}
${{ matrix.agent == 'openclaw' && format('nemoclaw-mcporter-audit-policy-result={0}', steps.mcporter-audit.outputs.policy) || '' }}
cache-from: type=registry,ref=ghcr.io/nvidia/nemoclaw/${{ matrix.agent }}-sandbox:buildcache-linux-amd64
provenance: false
sbom: false
Expand Down Expand Up @@ -1736,8 +1774,9 @@ jobs:
set -euo pipefail
receipt="$RUNNER_TEMP/reviewed-npm-audit/mcporter-runtime.receipt.json"
raw="$RUNNER_TEMP/reviewed-npm-audit/mcporter-runtime.raw.json"
test -f "$receipt"; test -f "$raw"
printf 'receipt=%s\nraw=%s\nreceipt_sha256=%s\n' "$receipt" "$raw" "$(sha256sum "$receipt" | cut -d' ' -f1)" >> "$GITHUB_OUTPUT"
policy="$RUNNER_TEMP/reviewed-npm-audit/mcporter-runtime.policy.json"
test -f "$receipt"; test -f "$raw"; test -s "$policy"; test ! -L "$policy"
printf 'receipt=%s\nraw=%s\npolicy=%s\nreceipt_sha256=%s\npolicy_sha256=%s\n' "$receipt" "$raw" "$policy" "$(sha256sum "$receipt" | cut -d' ' -f1)" "$(sha256sum "$policy" | cut -d' ' -f1)" >> "$GITHUB_OUTPUT"

- name: Restore exact base image contract
shell: bash
Expand Down Expand Up @@ -1920,9 +1959,11 @@ jobs:
NEMOCLAW_MANAGED_IMAGE_CAPABILITY_UNION=1
NEMOCLAW_MANAGED_IMAGE_RUNTIME_USER=root
${{ matrix.agent == 'openclaw' && format('NEMOCLAW_MCPORTER_AUDIT_RECEIPT_SHA256={0}', steps.mcporter-audit.outputs.receipt_sha256) || '' }}
${{ matrix.agent == 'openclaw' && format('NEMOCLAW_MCPORTER_AUDIT_POLICY_RESULT_SHA256={0}', steps.mcporter-audit.outputs.policy_sha256) || '' }}
secret-files: |
${{ matrix.agent == 'openclaw' && format('nemoclaw-mcporter-audit-receipt={0}', steps.mcporter-audit.outputs.receipt) || '' }}
${{ matrix.agent == 'openclaw' && format('nemoclaw-mcporter-audit-raw-report={0}', steps.mcporter-audit.outputs.raw) || '' }}
${{ matrix.agent == 'openclaw' && format('nemoclaw-mcporter-audit-policy-result={0}', steps.mcporter-audit.outputs.policy) || '' }}
cache-from: type=registry,ref=${{ env.REGISTRY }}/${{ matrix.image }}:buildcache-${{ matrix.artifact_platform }}
cache-to: type=registry,ref=${{ env.REGISTRY }}/${{ matrix.image }}:buildcache-${{ matrix.artifact_platform }},mode=max
provenance: mode=max
Expand Down
50 changes: 24 additions & 26 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -544,8 +544,8 @@
COPY scripts/lib/reviewed-npm-archive.mts /scripts/lib/reviewed-npm-archive.mts
COPY scripts/lib/bundled-npm-package.mts /scripts/lib/bundled-npm-package.mts
COPY scripts/lib/reviewed-npm-audit.mts /scripts/lib/reviewed-npm-audit.mts
COPY scripts/lib/npm-audit-receipt.mts /scripts/lib/npm-audit-receipt.mts
COPY scripts/lib/openclaw-npm-remediation.mts /scripts/lib/openclaw-npm-remediation.mts
COPY scripts/lib/verify-mcporter-audit.sh /scripts/lib/verify-mcporter-audit.sh
COPY scripts/patch-bundled-npm-brace-expansion.mts /scripts/patch-bundled-npm-brace-expansion.mts
COPY scripts/lib/patch-bundled-npm-ip-address.mts /scripts/lib/patch-bundled-npm-ip-address.mts
COPY scripts/patch-bundled-npm-tar.mts /scripts/patch-bundled-npm-tar.mts
Expand Down Expand Up @@ -634,6 +634,7 @@
ARG MCPORTER_0_7_3_INTEGRITY=sha512-egoPVYqTnWb3NjRIxo+xc8OrAI0dlPrJm9pAiZx0pImuNIV5rKhGtTnIfH/Y1ldGPVu74ibj3KR5c9U/QSdQFA==
ARG MCPORTER_0_7_3_TARBALL=https://registry.npmjs.org/mcporter/-/mcporter-0.7.3.tgz
ARG NEMOCLAW_MCPORTER_AUDIT_RECEIPT_SHA256=
ARG NEMOCLAW_MCPORTER_AUDIT_POLICY_RESULT_SHA256=

# A cross-stage root copy is accepted by Docker's legacy builder and creates one
# final-image layer while preserving metadata on existing parent directories.
Expand Down Expand Up @@ -817,9 +818,9 @@
# OPENCLAW_VERSION is the NemoClaw runtime build target and must meet the blueprint minimum.
# Reviewed archives retain registry and packed-byte SRI, basename, local-only install, and cleanup gates.
# hadolint ignore=DL3059,DL4006,DL3016,SC2015
RUN --network=default \
--mount=type=secret,id=nemoclaw-mcporter-audit-receipt,required=false \
RUN --mount=type=secret,id=nemoclaw-mcporter-audit-receipt,required=false \
--mount=type=secret,id=nemoclaw-mcporter-audit-raw-report,required=false \
--mount=type=secret,id=nemoclaw-mcporter-audit-policy-result,required=false \
set -eu; \
if [ -f /usr/local/share/nemoclaw/corporate-ca.pem ]; then \
export CURL_CA_BUNDLE=/usr/local/share/nemoclaw/corporate-ca.pem; \
Expand Down Expand Up @@ -865,11 +866,22 @@
MCPORTER_LOCK_SHA256="$(sha256sum /usr/local/lib/nemoclaw/mcporter-runtime/package-lock.json | awk '{print $1}')"; \
[ -n "$MCPORTER_LOCK_SHA256" ] \
|| { echo "ERROR: Could not hash the committed mcporter lockfile" >&2; exit 1; }; \
MCPORTER_AUDIT_POLICY_SHA256="$(sha256sum /scripts/npm-audit-exceptions.json | awk '{print $1}')"; \
MCPORTER_EXPECTED_AUDIT_EXCEPTIONS="$(node --input-type=module -e \
'import fs from "node:fs"; import { parseAuditExceptionRegistry } from "/scripts/lib/reviewed-npm-audit.mts"; const policy=parseAuditExceptionRegistry(fs.readFileSync("/scripts/npm-audit-exceptions.json", "utf-8")); const ids=policy.exceptions.filter((entry)=>entry.graph==="mcporter-runtime").map((entry)=>entry.advisory).sort(); process.stdout.write(ids.join(",") || "none");')"; \
MCPORTER_EXPECTED_AUDIT_STATUS=clean; \
if [ "$MCPORTER_EXPECTED_AUDIT_EXCEPTIONS" != "none" ]; then MCPORTER_EXPECTED_AUDIT_STATUS=accepted-exceptions; fi; \
MCPORTER_AUDIT_EVIDENCE=0; \
if [ -n "${NEMOCLAW_MCPORTER_AUDIT_RECEIPT_SHA256:-}${NEMOCLAW_MCPORTER_AUDIT_POLICY_RESULT_SHA256:-}" ]; then \
NEMOCLAW_MCPORTER_AUDIT_REPORT_PATH=/tmp/mcporter-npm-audit.json \
NEMOCLAW_MCPORTER_AUDIT_RESULT_PATH=/tmp/mcporter-npm-audit-policy.json \
bash /scripts/lib/verify-mcporter-audit.sh; \
MCPORTER_AUDIT_EVIDENCE=1; \
MCPORTER_AUDIT_POLICY_SHA256="$(node -p "require('/tmp/mcporter-npm-audit-policy.json').exceptionPolicySha256")"; \
MCPORTER_EXPECTED_AUDIT_EXCEPTIONS="$(node -p "require('/tmp/mcporter-npm-audit-policy.json').acceptedAdvisories.join(',') || 'none'")"; \
MCPORTER_EXPECTED_AUDIT_STATUS="$(node -p "require('/tmp/mcporter-npm-audit-policy.json').status")"; \
else \
MCPORTER_AUDIT_POLICY_SHA256="$(sha256sum /scripts/npm-audit-exceptions.json | awk '{print $1}')"; \
MCPORTER_EXPECTED_AUDIT_EXCEPTIONS="$(node --input-type=module -e \
'import fs from "node:fs"; import { parseAuditExceptionRegistry } from "/scripts/lib/reviewed-npm-audit.mts"; const policy=parseAuditExceptionRegistry(fs.readFileSync("/scripts/npm-audit-exceptions.json", "utf-8")); const ids=policy.exceptions.filter((entry)=>entry.graph==="mcporter-runtime").map((entry)=>entry.advisory).sort(); process.stdout.write(ids.join(",") || "none");')"; \
MCPORTER_EXPECTED_AUDIT_STATUS=clean; \
if [ "$MCPORTER_EXPECTED_AUDIT_EXCEPTIONS" != "none" ]; then MCPORTER_EXPECTED_AUDIT_STATUS=accepted-exceptions; fi; \
fi; \
CUR_VER_OUTPUT="$(openclaw --version 2>/dev/null)" \
|| { echo "ERROR: Could not execute openclaw --version" >&2; exit 1; }; \
CUR_VER="$(printf '%s\n' "$CUR_VER_OUTPUT" | /usr/local/lib/nemoclaw/extract-semver openclaw)" \
Expand Down Expand Up @@ -983,24 +995,10 @@
ln -s /usr/local/lib/nemoclaw/mcporter-runtime/node_modules/.bin/mcporter /usr/local/bin/mcporter; \
test "$(mcporter --version)" = "$MCPORTER_VERSION"; \
fi; \
MCPORTER_RECEIPT=/run/secrets/nemoclaw-mcporter-audit-receipt; \
MCPORTER_RAW_REPORT=/run/secrets/nemoclaw-mcporter-audit-raw-report; \
if [ -f "$MCPORTER_RECEIPT" ] || [ -f "$MCPORTER_RAW_REPORT" ] || [ -n "${NEMOCLAW_MCPORTER_AUDIT_RECEIPT_SHA256:-}" ]; then \
[ -f "$MCPORTER_RECEIPT" ] && [ -f "$MCPORTER_RAW_REPORT" ] && printf %s "$NEMOCLAW_MCPORTER_AUDIT_RECEIPT_SHA256" | grep -qxE '[0-9a-f]{64}' \
|| { echo "ERROR: cached mcporter audit requires paired receipt, raw report, and receipt SHA-256" >&2; exit 1; }; \
printf '%s %s\n' "$NEMOCLAW_MCPORTER_AUDIT_RECEIPT_SHA256" "$MCPORTER_RECEIPT" | sha256sum -c -; \
node /scripts/lib/npm-audit-receipt.mts \
--receipt "$MCPORTER_RECEIPT" \
--package-json /usr/local/lib/nemoclaw/mcporter-runtime/package.json \
--package-lock /usr/local/lib/nemoclaw/mcporter-runtime/package-lock.json \
--raw-report "$MCPORTER_RAW_REPORT" --exceptions /scripts/npm-audit-exceptions.json \
--graph mcporter-runtime --audit-config /scripts/reviewed-npm-audit.json \
--registry https://registry.yarnpkg.com --threshold high --legacy-audit true; \
else \
node /scripts/lib/reviewed-npm-audit.mts \
--directory /usr/local/lib/nemoclaw/mcporter-runtime \
--exceptions /scripts/npm-audit-exceptions.json --graph mcporter-runtime --threshold high; \
fi
if [ "$MCPORTER_AUDIT_EVIDENCE" = 0 ]; then \
bash /scripts/lib/verify-mcporter-audit.sh; \
fi; \
rm -f /tmp/mcporter-npm-audit.json /tmp/mcporter-npm-audit-policy.json

# Patch OpenClaw media fetch for proxy-only sandbox (NVIDIA/NemoClaw#1755).
#
Expand Down Expand Up @@ -1570,10 +1568,10 @@
# CHAT_UI_URL is a non-loopback address (Brev Launchable, remote deployments)
# since terminal-based pairing is impossible in those contexts.
# Default: "0" (device auth enabled for local deployments — secure by default).
ARG NEMOCLAW_DISABLE_DEVICE_AUTH=0

Check warning on line 1571 in Dockerfile

View workflow job for this annotation

GitHub Actions / PR build and direct managed startup (OpenClaw)

Sensitive data should not be used in the ARG or ENV commands

SecretsUsedInArgOrEnv: Do not use ARG or ENV instructions for sensitive data (ARG "NEMOCLAW_DISABLE_DEVICE_AUTH") More info: https://docs.docker.com/go/dockerfile/rule/secrets-used-in-arg-or-env/
# Internal audit provenance for the opt-out above. Standard onboarding rewrites
# this to managed-onboard; direct image builders retain operator provenance.
ARG NEMOCLAW_DEVICE_AUTH_OPT_OUT_SOURCE=operator

Check warning on line 1574 in Dockerfile

View workflow job for this annotation

GitHub Actions / PR build and direct managed startup (OpenClaw)

Sensitive data should not be used in the ARG or ENV commands

SecretsUsedInArgOrEnv: Do not use ARG or ENV instructions for sensitive data (ARG "NEMOCLAW_DEVICE_AUTH_OPT_OUT_SOURCE") More info: https://docs.docker.com/go/dockerfile/rule/secrets-used-in-arg-or-env/
# Compatibility build arg for older custom Dockerfiles and rebuild tooling.
# NemoClaw-managed images intentionally do not consume it; gateway auth tokens
# are generated at container startup and are never baked into image layers.
Expand Down Expand Up @@ -1607,7 +1605,7 @@
# NEMOCLAW_MESSAGING_PLAN_B64 intentionally remains ARG-only: Docker exposes it
# to build RUN processes without retaining the full plan in the final image env.
# Direct ARG interpolation into inline source is a code injection vector (C-2).
ENV NEMOCLAW_MODEL=${NEMOCLAW_MODEL} \

Check warning on line 1608 in Dockerfile

View workflow job for this annotation

GitHub Actions / PR build and direct managed startup (OpenClaw)

Sensitive data should not be used in the ARG or ENV commands

SecretsUsedInArgOrEnv: Do not use ARG or ENV instructions for sensitive data (ENV "NEMOCLAW_DEVICE_AUTH_OPT_OUT_SOURCE") More info: https://docs.docker.com/go/dockerfile/rule/secrets-used-in-arg-or-env/

Check warning on line 1608 in Dockerfile

View workflow job for this annotation

GitHub Actions / PR build and direct managed startup (OpenClaw)

Sensitive data should not be used in the ARG or ENV commands

SecretsUsedInArgOrEnv: Do not use ARG or ENV instructions for sensitive data (ENV "NEMOCLAW_DISABLE_DEVICE_AUTH") More info: https://docs.docker.com/go/dockerfile/rule/secrets-used-in-arg-or-env/
NEMOCLAW_INFERENCE_PROVIDER_ID=${NEMOCLAW_INFERENCE_PROVIDER_ID} \
NEMOCLAW_UPSTREAM_PROVIDER=${NEMOCLAW_UPSTREAM_PROVIDER} \
NEMOCLAW_PRIMARY_MODEL_REF=${NEMOCLAW_PRIMARY_MODEL_REF} \
Expand Down
Loading
Loading