Skip to content

Commit 1b3f032

Browse files
authored
Merge branch 'main' into patch-walker/openshell-0.0.105-31ee658967
2 parents 3d3ad49 + 03f5744 commit 1b3f032

82 files changed

Lines changed: 2235 additions & 1007 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.

.github/workflows/managed-images.yaml

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,46 @@ jobs:
169169
printf 'NemoClaw source commit: %s\n' "$STAGING_QA_SOURCE_SHA"
170170
} >> "$GITHUB_STEP_SUMMARY"
171171
172+
# NemoPatch exact Deep Agents candidate-base boundary.
173+
# Preserve the recorded staging tree and replace only the dependency inputs
174+
# that the candidate base image owns.
175+
- name: Overlay exact PR dependency inputs on staging QA base
176+
shell: bash
177+
run: |
178+
set -euo pipefail
179+
candidate_root="$GITHUB_WORKSPACE/candidate"
180+
staging_root="$GITHUB_WORKSPACE/staging-qa-base-source"
181+
for relative in \
182+
agents/langchain-deepagents-code/Dockerfile.base \
183+
agents/langchain-deepagents-code/requirements.lock
184+
do
185+
source_file="$candidate_root/$relative"
186+
destination_file="$staging_root/$relative"
187+
if [ ! -f "$source_file" ] || [ -L "$source_file" ] || [ ! -f "$destination_file" ] || [ -L "$destination_file" ]; then
188+
echo "ERROR: staging QA dependency input is missing, unsafe, or changed shape: $relative" >&2
189+
exit 1
190+
fi
191+
install -m 0644 "$source_file" "$destination_file"
192+
done
193+
for support_relative in \
194+
scripts/lib/bundled-npm-package.mts \
195+
scripts/security/patches/perl-5.44.0-net-ping-capability-tests.patch
196+
do
197+
support_source="$candidate_root/$support_relative"
198+
support_parent="$staging_root/$(dirname "$support_relative")"
199+
support_destination="$staging_root/$support_relative"
200+
if [ ! -f "$support_source" ] || [ -L "$support_source" ] || [ ! -d "$support_parent" ] || [ -L "$support_parent" ] || [ -L "$support_destination" ]; then
201+
echo "ERROR: staging QA Dockerfile support file is missing, unsafe, or changed shape: $support_relative" >&2
202+
exit 1
203+
fi
204+
if [ -e "$support_destination" ] && [ ! -f "$support_destination" ]; then
205+
echo "ERROR: staging QA Dockerfile support destination changed shape: $support_relative" >&2
206+
exit 1
207+
fi
208+
install -m 0644 "$support_source" "$support_destination"
209+
done
210+
printf '\nCandidate dependency inputs: %s\n' "$CANDIDATE_SHA" >> "$GITHUB_STEP_SUMMARY"
211+
172212
- name: Reproduce staging discovery permission drift
173213
shell: bash
174214
working-directory: candidate
@@ -406,6 +446,11 @@ jobs:
406446
with:
407447
node-version: 22.19.0
408448

449+
- name: Validate exact Deep Agents PR base build args
450+
if: matrix.agent == 'langchain-deepagents-code'
451+
shell: bash
452+
run: scripts/check-production-build-args.sh -f agents/langchain-deepagents-code/Dockerfile.base
453+
409454
- name: Resolve exact linux/amd64 PR base
410455
id: base
411456
shell: bash

.github/workflows/podman-cpu-proof.yaml

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ on:
2828
- "src/lib/onboard/runtime-provider/container-state-mutation.ts"
2929
- "src/lib/onboard/runtime-provider/docker-state-mutation.ts"
3030
- "src/lib/onboard/experimental/portable-host-preparation*.ts"
31+
- "src/lib/onboard/experimental/portable-profile.ts"
3132
- "src/lib/onboard/runtime-provider/podman*.ts"
3233
- "scripts/install-openshell.sh"
3334
- "scripts/checks/run-portable-cpu-delegation-proof.mts"
@@ -334,6 +335,21 @@ jobs:
334335
printf 'XDG_RUNTIME_DIR=%s\n' "$runtime_dir"
335336
} >>"$GITHUB_ENV"
336337
338+
- name: Configure exact Portable host gateway alias
339+
shell: bash
340+
run: |
341+
set -euo pipefail
342+
portable_host_gateway_ip="$(
343+
node --input-type=module --eval '
344+
const { PORTABLE_HOST_GATEWAY_IP } =
345+
await import("./dist/lib/onboard/docker-driver-platform.js");
346+
process.stdout.write(PORTABLE_HOST_GATEWAY_IP);
347+
'
348+
)"
349+
sudo ip address replace "$portable_host_gateway_ip/32" dev lo
350+
ip -o -4 address show dev lo | awk '{print $4}' | grep -Fx "$portable_host_gateway_ip/32"
351+
printf 'E2E_PORTABLE_HOST_GATEWAY_IP=%s\n' "$portable_host_gateway_ip" >>"$GITHUB_ENV"
352+
337353
- name: Start the exact connected gateway required by portable retirement
338354
shell: bash
339355
run: |
@@ -458,6 +474,17 @@ jobs:
458474
esac
459475
done < <(podman --url "$endpoint" secret ls --format '{{.Name}}' 2>/dev/null || true)
460476
podman --url "$endpoint" network rm openshell-docker 2>/dev/null || true
477+
portable_host_gateway_ip=""
478+
if portable_host_gateway_ip="$(
479+
node --input-type=module --eval '
480+
const { PORTABLE_HOST_GATEWAY_IP } =
481+
await import("./dist/lib/onboard/docker-driver-platform.js");
482+
process.stdout.write(PORTABLE_HOST_GATEWAY_IP);
483+
'
484+
)" && [ -n "$portable_host_gateway_ip" ] \
485+
&& [ "${E2E_PORTABLE_HOST_GATEWAY_IP:-}" = "$portable_host_gateway_ip" ]; then
486+
sudo ip address delete "$portable_host_gateway_ip/32" dev lo 2>/dev/null || true
487+
fi
461488
service_pid="${E2E_PODMAN_SERVICE_PID:-}"
462489
if [[ "$service_pid" =~ ^[1-9][0-9]*$ ]]; then
463490
kill "$service_pid" 2>/dev/null || true

agents/langchain-deepagents-code/Dockerfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -232,7 +232,7 @@ RUN test -f /usr/local/bin/nemoclaw-managed-bootstrap \
232232
&& cmp -s /usr/local/lib/nemoclaw/dcode-launcher.sh /usr/local/lib/nemoclaw/dcode-managed-exec \
233233
&& chmod -R a+rX /opt/nemoclaw-blueprint \
234234
&& test "$(find /opt/nemoclaw-deepagents-profile-plugin -type f -print | LC_ALL=C sort)" = "$(printf '%s\n' '/opt/nemoclaw-deepagents-profile-plugin/pyproject.toml' '/opt/nemoclaw-deepagents-profile-plugin/src/nemoclaw_deepagents_profile/__init__.py')" \
235-
&& printf '%s %s\n' '8fe85c62293c74147848732dc56c33e8ab60133fa41c071da4328ac60f2bf44f' '/opt/nemoclaw-deepagents-profile-plugin/src/nemoclaw_deepagents_profile/__init__.py' '7ba7b77bd6f889cc861eddbe3e38fc1f4433a85b7bc2a9b516e19a19a37a7686' '/opt/nemoclaw-deepagents-profile-plugin/pyproject.toml' | sha256sum -c - \
235+
&& printf '%s %s\n' '6bb8dc8108c5dd7e7f71c39aacfb0da07d285b7a324eecd691177a9ca460cfc0' '/opt/nemoclaw-deepagents-profile-plugin/src/nemoclaw_deepagents_profile/__init__.py' '7be3f7972d7cd78d3ddaf66e2ff8b07a5e6af3611034b956cf0475ba78f5a576' '/opt/nemoclaw-deepagents-profile-plugin/pyproject.toml' | sha256sum -c - \
236236
&& /opt/venv/bin/pip3 install --no-index --no-cache-dir --no-deps --no-build-isolation /opt/nemoclaw-deepagents-profile-plugin \
237237
&& /opt/venv/bin/python3 -I -c 'import nemoclaw_deepagents_profile; print("NEMOCLAW_DCODE_PROFILE_" + "IMPORT_GATE", flush=True); import deepagents; import deepagents_code' \
238238
&& /opt/venv/bin/pip3 check \

agents/langchain-deepagents-code/Dockerfile.base

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -339,7 +339,7 @@ RUN python3 -m venv --copies "$VIRTUAL_ENV" \
339339
-r /tmp/deepagents-code-requirements.lock \
340340
&& "$VIRTUAL_ENV/bin/pip3" check \
341341
&& "$VIRTUAL_ENV/bin/python3" -I -c \
342-
"from importlib.metadata import version; expected = {'aiohttp': '3.14.3', 'cryptography': '50.0.0', 'deepagents-code': '0.1.34', 'langgraph-checkpoint-sqlite': '3.1.1', 'mcp': '1.28.1', 'pillow': '12.3.0', 'pyasn1': '0.6.4', 'uv': '0.11.33'}; actual = {name: version(name) for name in expected}; assert actual == expected, actual" \
342+
"from importlib.metadata import version; expected = {'aiohttp': '3.14.3', 'cryptography': '50.0.0', 'deepagents-code': '0.1.55', 'langgraph-checkpoint-sqlite': '3.1.1', 'mcp': '1.28.1', 'pillow': '12.3.0', 'pyasn1': '0.6.4', 'uv': '0.11.33'}; actual = {name: version(name) for name in expected}; assert actual == expected, actual" \
343343
&& ln -sf "$VIRTUAL_ENV/bin/dcode" /usr/local/bin/dcode \
344344
&& ln -sf "$VIRTUAL_ENV/bin/deepagents-code" /usr/local/bin/deepagents-code \
345345
&& rm -f /tmp/deepagents-code-requirements.lock \

agents/langchain-deepagents-code/dcode-wrapper.sh

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ if [ "${1:-}" = "--nemoclaw-mcp-capability" ] && [ "$#" -eq 1 ]; then
1111
exit 0
1212
fi
1313

14-
unset BASH_ENV ENV OPENAI_PROXY
14+
unset BASH_ENV ENV OPENAI_PROXY DEEPAGENTS_CODE_APPROVAL_MODE DEEPAGENTS_CODE_STARTUP_MODE
1515
while IFS= read -r _nemoclaw_auto_approval_env; do
1616
unset "$_nemoclaw_auto_approval_env"
1717
done < <(compgen -A variable NEMOCLAW_DCODE_AUTO_APPROVAL || true)
@@ -637,7 +637,7 @@ try:
637637
except Exception:
638638
sys.exit(1)
639639
# Schema pin: detection assumes a truthy top-level "credentials" key,
640-
# matching the auth.json shape in deepagents-code==0.1.34. Nested or
640+
# matching the auth.json shape reviewed for deepagents-code==0.1.55. Nested or
641641
# renamed shapes ({"auth":{...}}, {"state":{"credentials":...}}, top-level
642642
# list) are not detected. When bumping the upstream pin, re-review this
643643
# assumption against the new auth.json schema.

agents/langchain-deepagents-code/dependency-review.md

Lines changed: 50 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ This file records the reviewed dependency baseline for the Deep Agents Code sand
77
Update it whenever `requirements.lock` changes.
88

99
- Lockfile: `agents/langchain-deepagents-code/requirements.lock`
10-
- Lockfile SHA-256: `56a1c9462b3a68773c7d223457630a52f6b79c35930d5a9212bd42032b7938c6`
10+
- Lockfile SHA-256: `203eeeb3786c736423be60ce2b315ad6f817d4adf0c13de184bf5deee4c793ad`
1111
- Audit command: `uv tool run --python 3.13 pip-audit -r agents/langchain-deepagents-code/requirements.lock --progress-spinner off --disable-pip`
1212
- Audit date: August 11, 2026
1313
- Targeted audit result: `aiohttp 3.14.3, cryptography 50.0.0, uv 0.11.33, langgraph-checkpoint-sqlite 3.1.1, MCP 1.28.1, Pillow 12.3.0, and pyasn1 0.6.4 have no known vulnerabilities`
@@ -18,17 +18,53 @@ The lock now selects `aiohttp==3.14.3`, `cryptography==50.0.0`, `uv==0.11.33`, `
1818
These selections clear `GHSA-cq5v-8q36-5273`, `GHSA-g6cj-pr64-35w5`, and `GHSA-47pj-3jcm-6whg`.
1919
The direct `langgraph-checkpoint-sqlite==3.1.1` requirement is a hash-locked security constraint for `GHSA-47pj-3jcm-6whg`.
2020
Remove it when the selected Deep Agents Code graph resolves `3.1.1` or later without the direct constraint and the complete-lock audit remains clear.
21-
The direct MCP and pyasn1 requirements are temporary, hash-locked constraints for the released Deep Agents Code `0.1.34` graph.
22-
Deep Agents Code `0.1.45` and later contain the MCP and pyasn1 fixes, but their hook boundary has changed.
23-
Remove the temporary direct constraints only as part of a separately validated semantic migration to `>=0.1.45` that preserves NemoClaw's managed runtime hooks.
21+
The Deep Agents Code selector is the published `0.1.55` release at commit
22+
`80fe3d3cbcd23b8ebbc2b1b0d67d7ea318d11ef6`. Its reviewed wheel is
23+
`deepagents_code-0.1.55-py3-none-any.whl` with SHA-256
24+
`3a0d3e332f132d0e910fb3cccb47f77d276e228b6df6e5f7bff08809aa163121`;
25+
the corresponding source archive has SHA-256
26+
`91c30b62cb96d5e803346b0d77e55d589ac1daa04b6c534f80384ceec2717c11`.
27+
This semantic migration through `0.1.55` crosses the MCP and pyasn1 fixes while retaining the
28+
managed hook, approval, credential, update, and startup-mode guards at the
29+
NemoClaw launcher and exact-version package-patch boundaries.
2430

2531
The image build runs `pip3 check` and asserts all eight installed package versions, including Deep Agents Code itself, before publishing.
2632
The complete point-in-time audit now reports only two duplicate database records for `setuptools==82.0.1`; that record is outside the Critical/High remediation scope.
2733
This review does not claim the complete lock is vulnerability-free.
2834

35+
## Progressive MCP Tool Catalog Compatibility
36+
37+
Deep Agents Code `0.1.55` with LangChain `1.3.14` can supply `search_tools` with a `ToolRuntime.tools` view that omits loaded MCP tools.
38+
The next model request can still expose those tools, but a search against only the middleware runtime view reports no match and cannot disclose them.
39+
40+
NemoClaw owns the progressive-disclosure middleware injection at graph construction.
41+
The main-agent middleware retains the parent graph's registered tool tuple.
42+
A declarative local subagent that defines `tools` retains that catalog, including an explicit empty list.
43+
A declarative local subagent that omits `tools` inherits the parent graph's catalog.
44+
An explicit subagent catalog therefore cannot search or expose a parent-only tool.
45+
At search time, the middleware combines that tuple with `ToolRuntime.tools` by object identity and applies the existing name, result, state, and schema limits to the combined catalog.
46+
Model requests still use their request-time tool view, and the existing callable-name validation still rejects ambiguous or reserved owners before graph construction.
47+
48+
Deep Agents Code `0.1.55` also derives MCP approval from protocol annotations.
49+
Its headless guard permits an MCP call without an approval UI only when `readOnlyHint` is literally `true`, `destructiveHint` is not `true`, and every supplied standard hint has a Boolean value.
50+
The guard rejects unannotated, malformed, contradictory, or mutating tools instead of treating them as read-only.
51+
NemoClaw retains that fail-closed behavior.
52+
53+
The live E2E `fake_echo` and `fake_status` tools perform only read-only proof and status operations, so their `tools/list` definitions declare `readOnlyHint: true`.
54+
The compatible-model fixture reports a search failure only when the `search_tools` result omits the target.
55+
After a valid search, the fixture reports a rejected or incorrect target result as an invocation failure.
56+
57+
The focused fixture and installed-image validator give `search_tools` a runtime view that contains only itself.
58+
They require a registered hidden MCP tool to appear in the search response and in the next model tool list.
59+
The focused fixture also assigns separate tools to the parent and one subagent.
60+
It requires an omitted subagent catalog to inherit the parent tool and an explicit subagent catalog to retain only the subagent tool.
61+
The same fixture requires the subagent tool to remain searchable and to appear in the next model request when `ToolRuntime.tools` contains only `search_tools`.
62+
The live Deep Agents MCP E2E test separately requires the tool to be hidden initially, returned by `search_tools`, exposed on the next model request, and invoked through the authenticated managed MCP path.
63+
Remove the retained catalog only after the pinned Deep Agents and LangChain runtime supplies every registered searchable tool to middleware calls and both evidence paths pass without it.
64+
2965
## Managed `fetch_url` Proxy Adapter
3066

31-
Deep Agents Code `0.1.34` deliberately disables ambient proxies and resolves
67+
Deep Agents Code `0.1.55` deliberately disables ambient proxies and resolves
3268
destination DNS locally before pinning the address used by `fetch_url`. That is
3369
the wrong transport inside a NemoClaw-managed sandbox: ordinary egress and
3470
destination resolution must pass through the policy proxy, so the direct path
@@ -64,19 +100,19 @@ behavior.
64100

65101
## Released Nemotron 3 Ultra Profile
66102

67-
Deep Agents Code `0.1.34` pins `deepagents==0.7.0a6`, whose official wheel
103+
Deep Agents Code `0.1.55` pins `deepagents==0.7.5`, whose official wheel
68104
contains the Nemotron 3 Ultra harness profile merged in Deep Agents PR #4192.
69105
NemoClaw no longer vendors or overlays that source.
70106

71-
- Native profile SHA-256: `c8e8dd2b0182334b54be4f46ff0c7b45fbb95dc13bd9a92c249eb47a14fa13d7`
107+
- Native profile SHA-256: `3b95b118e90c4ae19890c611cc7e1e85261217f971496e9bb7508142133c7d9a`
72108
- Unmodified built-in bootstrap SHA-256: `005a91e7fc4ca6b21220673dd9d02d6686bf63e1e4f1102d124b01f96886efcf`
73109
- First-party adapter: `nemoclaw-deepagents-profile==0.1.0`
74-
- Adapter module SHA-256: `8fe85c62293c74147848732dc56c33e8ab60133fa41c071da4328ac60f2bf44f`
75-
- Adapter project metadata SHA-256: `7ba7b77bd6f889cc861eddbe3e38fc1f4433a85b7bc2a9b516e19a19a37a7686`
110+
- Adapter module SHA-256: `6bb8dc8108c5dd7e7f71c39aacfb0da07d285b7a324eecd691177a9ca460cfc0`
111+
- Adapter project metadata SHA-256: `7be3f7972d7cd78d3ddaf66e2ff8b07a5e6af3611034b956cf0475ba78f5a576`
76112
- Adapter wheel license expression: `Apache-2.0`
77113
- Adapter dependency audit result: `No known vulnerabilities found`. Its only
78-
requirements are the exact `deepagents-code==0.1.34` and
79-
`deepagents==0.7.0a6` entries covered by the lockfile audit command above; no
114+
requirements are the exact `deepagents-code==0.1.55` and
115+
`deepagents==0.7.5` entries covered by the lockfile audit command above; no
80116
additional third-party distribution is introduced.
81117

82118
### Test-only legacy license fixture limitation
@@ -172,7 +208,7 @@ complete `execute.command` is the placeholder, ignoring case and whitespace
172208
around the token and brackets. The released Deep Agents parser/profile can carry that
173209
argument to normal tool middleware, where an unrestricted execute backend would
174210
otherwise treat it as a shell command. The model/provider emission and the
175-
hash-locked `deepagents==0.7.0a6` canonical profile are upstream boundaries;
211+
hash-locked `deepagents==0.7.5` canonical profile are upstream boundaries;
176212
NemoClaw owns the two managed aliases and the final middleware immediately before
177213
dispatch. The adapter therefore rejects only that observed complete argument and
178214
leaves concrete commands, other tools, the canonical NVIDIA profile, and
@@ -218,8 +254,8 @@ rejection, and unchanged concrete-command states. The
218254
deleted source-backport license path, `LICENSE.langchain-deepagents`, is not
219255
staged into the image, and image regression tests enforce that absence.
220256

221-
Deep Agents Code `0.1.34` is the released consumer; prerelease risk is limited
222-
to its exact `deepagents==0.7.0a6` SDK pin. That risk is accepted because the
257+
Deep Agents Code `0.1.55` is the released consumer; prerelease risk is limited
258+
to its exact `deepagents==0.7.5` SDK pin. That risk is accepted because the
223259
consumer and SDK are hash locked and all source, version, middleware, graph,
224260
and dispatch contracts are enforced by the isolated image-build validator.
225261
Separately, the point-in-time audit reports no known vulnerabilities for

agents/langchain-deepagents-code/manifest.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
name: langchain-deepagents-code
1010
display_name: "LangChain Deep Agents Code"
1111
description: "Terminal coding agent built on the Deep Agents SDK"
12-
version_constraint: ">=0.1.34"
12+
version_constraint: ">=0.1.55"
1313
language: python
1414
license: MIT
1515
homepage: "https://docs.langchain.com/oss/python/deepagents/code/overview"
@@ -18,7 +18,7 @@ homepage: "https://docs.langchain.com/oss/python/deepagents/code/overview"
1818
install_method: pip
1919
binary_path: /usr/local/bin/dcode
2020
version_command: "dcode --version"
21-
expected_version: "0.1.34"
21+
expected_version: "0.1.55"
2222
version_scheme: semver
2323
runtime:
2424
kind: terminal

0 commit comments

Comments
 (0)