Skip to content

Commit 3106809

Browse files
committed
Merge remote-tracking branch 'origin/main' into fix/agent-timeout-enforcement
Signed-off-by: Hung Le <hple@nvidia.com> # Conflicts: # src/lib/actions/sandbox/agent/passthrough-dispatch.test.ts # src/lib/actions/sandbox/agent/passthrough-dispatch.ts # src/lib/actions/sandbox/agent/passthrough-json.test.ts # src/lib/actions/sandbox/agent/passthrough-json.ts # src/lib/actions/sandbox/agent/passthrough.test.ts # src/lib/actions/sandbox/agent/passthrough.ts
2 parents 846d8a4 + 0810a95 commit 3106809

68 files changed

Lines changed: 2221 additions & 3076 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/base-image.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ on:
6868
- "scripts/lib/reviewed-npm-audit.mts"
6969
- "scripts/security/build-native-security-packages.sh"
7070
- "scripts/security/build-perl-security-packages.sh"
71+
- "scripts/security/patches/perl-5.44.0-net-ping-capability-tests.patch"
7172
- "scripts/security/patches/libssh2-1.11.1-cve-2026.patch"
7273
- "scripts/security/patches/python3.13-htmlparser-cve-2026-15308.patch"
7374
- "scripts/patch-bundled-npm-brace-expansion.mts"

Dockerfile.base

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ ARG PERL_SHA256
8888
ARG PERL_PACKAGE_REVISION
8989

9090
COPY scripts/security/build-perl-security-packages.sh /scripts/security/build-perl-security-packages.sh
91+
COPY scripts/security/patches/perl-5.44.0-net-ping-capability-tests.patch /scripts/security/patches/perl-5.44.0-net-ping-capability-tests.patch
9192

9293
RUN apt-get update && apt-get install -y --no-install-recommends \
9394
netbase=6.5 \

agents/hermes/Dockerfile.base

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ ARG PERL_SHA256
4949
ARG PERL_PACKAGE_REVISION
5050

5151
COPY scripts/security/build-perl-security-packages.sh /scripts/security/build-perl-security-packages.sh
52+
COPY scripts/security/patches/perl-5.44.0-net-ping-capability-tests.patch /scripts/security/patches/perl-5.44.0-net-ping-capability-tests.patch
5253

5354
RUN apt-get update && apt-get install -y --no-install-recommends \
5455
netbase=6.5 \

agents/hermes/runtime-config-guard.py

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4754,17 +4754,17 @@ def _is_generated_api_server_key(value: str) -> bool:
47544754
def _placeholder_suffix_matches_env_key(suffix: str, env_key: str) -> bool:
47554755
if suffix == env_key:
47564756
return True
4757-
revision_match = re.fullmatch(r"v[0-9]+_(.+)", suffix)
4757+
revision_match = re.fullmatch(r"v[0-9]{1,20}_(.+)", suffix)
47584758
return revision_match is not None and revision_match.group(1) == env_key
47594759

47604760

4761-
def _normalize_provider_placeholder_for_env_key(value: str, env_key: str) -> str | None:
4761+
def _provider_placeholder_for_env_key(value: str, env_key: str) -> str | None:
47624762
if not value.startswith(SCOPED_PLACEHOLDER_PREFIX):
47634763
return None
47644764
suffix = value[len(SCOPED_PLACEHOLDER_PREFIX) :]
47654765
if not _placeholder_suffix_matches_env_key(suffix, env_key):
47664766
return None
4767-
return f"{SCOPED_PLACEHOLDER_PREFIX}{env_key}"
4767+
return value
47684768

47694769

47704770
def _has_env_control_chars(value: str) -> bool:
@@ -4914,7 +4914,12 @@ def _runtime_plan_replacements_and_provider_keys(
49144914
raise UnsafePathError(
49154915
f"messaging runtime plan env alias regex is invalid: {exc}"
49164916
) from exc
4917-
if compiled.search(os.environ.get(env_key, "")):
4917+
runtime_value = os.environ.get(env_key, "")
4918+
if runtime_value.startswith(SCOPED_PLACEHOLDER_PREFIX):
4919+
suffix = runtime_value[len(SCOPED_PLACEHOLDER_PREFIX) :]
4920+
if not _placeholder_suffix_matches_env_key(suffix, env_key):
4921+
continue
4922+
if compiled.search(runtime_value):
49184923
replacements[env_key] = (value, message)
49194924
return replacements, provider_env_keys, True
49204925

@@ -4971,11 +4976,11 @@ def provider_placeholders(
49714976
for key in allowed_fallback_keys:
49724977
if key in replacements:
49734978
continue
4974-
normalized = _normalize_provider_placeholder_for_env_key(
4979+
placeholder = _provider_placeholder_for_env_key(
49754980
os.environ.get(key, ""), key
49764981
)
4977-
if normalized:
4978-
replacements[key] = (normalized, "")
4982+
if placeholder:
4983+
replacements[key] = (placeholder, "")
49794984
if not replacements:
49804985
return
49814986

agents/langchain-deepagents-code/Dockerfile.base

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ ARG PERL_SHA256
5353
ARG PERL_PACKAGE_REVISION
5454

5555
COPY scripts/security/build-perl-security-packages.sh /scripts/security/build-perl-security-packages.sh
56+
COPY scripts/security/patches/perl-5.44.0-net-ping-capability-tests.patch /scripts/security/patches/perl-5.44.0-net-ping-capability-tests.patch
5657

5758
RUN apt-get update && apt-get install -y --no-install-recommends \
5859
netbase=6.5 \

ci/platform-matrix.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -253,7 +253,7 @@
253253
{
254254
"name": "Podman / other container runtimes",
255255
"status": "unsupported",
256-
"notes": "Onboard surfaces an explicit unsupported-runtime error for Podman (`src/lib/onboard/fatal-runtime-preflight.ts` prints the rejection; `src/lib/onboard/preflight.ts` flags the unsupported runtime upstream). Only Docker Engine, Docker Desktop, and Colima are supported. See issue #420 (closed)."
256+
"notes": "Standard onboarding surfaces an explicit unsupported-runtime error for Podman (`src/lib/onboard/fatal-runtime-preflight.ts` prints the rejection; `src/lib/onboard/preflight.ts` flags the unsupported runtime upstream). The explicit portable experimental profile has one installer-preflight admission exception for the Podman unsupported-runtime finding, as accepted in issue #9007. It does not waive any other readiness blocker or make Podman generally supported. Only Docker Engine, Docker Desktop, and Colima are supported. See issue #420 (closed)."
257257
},
258258
{
259259
"name": "Intel Mac (macOS x86_64)",

docs/changelog/2026-08-12.mdx

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,11 @@ NemoClaw v0.0.108 adds read-only host mounts and an Experimental Muse Glimmer pr
99
It improves onboarding recovery, messaging credential rotation, inference validation, MCP registration, snapshots, and Hermes configuration.
1010
It also strengthens managed images, gateway credentials, runtime state, and release qualification.
1111

12-
- On Linux and Windows Subsystem for Linux 2 (WSL2), `nemoclaw onboard` and `nemoclaw <sandbox> rebuild` can now mount an existing host directory read-only beneath `/sandbox` with `--host-mount`.
13-
NemoClaw validates each source, destination, and symlink boundary before mutation, persists accepted mounts for `rebuild` and interrupted `onboard --resume`, removes their declaration during `destroy`, and reports them in sandbox status.
12+
- On Linux and Windows Subsystem for Linux 2 (WSL2), `nemoclaw onboard --host-mount <host:/sandbox/path>` can now expose an existing host directory read-only beneath `/sandbox`.
13+
NemoClaw validates each source, destination, and symlink boundary before mutation.
14+
It persists accepted mounts across `nemoclaw <sandbox> rebuild` and interrupted onboarding resumed with `nemoclaw onboard --resume`.
15+
The `nemoclaw <sandbox> destroy` command removes their declaration.
16+
The `nemoclaw <sandbox> status` command reports them.
1417
For more information, refer to [Understand Sandbox State](/user-guide/openclaw/manage-sandboxes/state-and-backups/understand-sandbox-state) and the [NemoClaw CLI Commands Reference](/user-guide/openclaw/reference/commands).
1518
Related change: [PR #8280](https://github.com/NVIDIA/NemoClaw/pull/8280).
1619
- The explicit-only Experimental Muse Glimmer managed vLLM profile now runs on one DGX Spark with its validated checkpoint, ARM64 image, parser settings, and resource limits.

docs/inference/set-up-vllm.mdx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -295,7 +295,9 @@ Two behaviors surprise direct callers of the managed vLLM endpoint; the OpenClaw
295295

296296
- **Read reasoning from `reasoning`, not `reasoning_content`.**
297297
The pinned vLLM runtime renamed the deprecated `reasoning_content` response field to `reasoning`, so `choices[].message.reasoning_content` is `null` even for prompts that reasoned heavily.
298-
The reasoning is not discarded — read `choices[].message.reasoning` (and the `delta.reasoning` field when streaming).
298+
The reasoning is not discarded.
299+
Read non-streaming reasoning from `choices[].message.reasoning`.
300+
For streaming responses, read `choices[].delta.reasoning`.
299301
- **Send a generous `max_tokens` (at least `1024`, and more for hard prompts).**
300302
The reasoning trace counts against `max_tokens`.
301303
With a modest budget the model can spend the entire budget on reasoning before it reaches the answer, returning an empty `content` with `finish_reason=length`.

docs/manage-sandboxes/uninstall-nemoclaw.mdx

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,13 @@ Rerun `NEMOCLAW_GATEWAY_PORT=<port> $$nemoclaw uninstall` with the gateway port
115115
For an externally supervised authority, uninstall preserves the local gateway state used by the running process in both full and gateway-scoped cleanup.
116116
It also preserves the gateway process, supervisor resources, marked Linux unit, Docker resources, OpenShell binaries, and the declared external state directory.
117117
A custom-port uninstall does not stop or remove the default gateway service or its environment file.
118+
Uninstall does not stop an `openshell-gateway` process that another non-root user owns and that this installation did not record.
119+
It names the owner and process ID, leaves that process running, and continues with the remaining cleanup.
120+
If no other cleanup fails, uninstall exits with status `0` even though that process can keep its port in use.
121+
Uninstall still tries to stop a `root`-owned process and the gateway process that this installation recorded.
122+
If either of those stops fails, uninstall prints `sudo kill -9 <pid>` for the process.
123+
A gateway-scoped uninstall and every `--all-gateway-ports` pass exit nonzero after that failure.
124+
A single full uninstall reports the process and continues.
118125
Before scoped cleanup stops a Docker gateway process, including a managed default gateway service, NemoClaw requires two Docker namespace proofs.
119126
The selected Docker gateway configuration and any running gateway process must use the state-root-specific OpenShell sandbox namespace that NemoClaw generated.
120127
Because the supported OpenShell Podman schema does not expose `sandbox_namespace`, scoped Podman uninstall fails closed before signaling and preserves the gateway runtime evidence and local state.

docs/manage-sandboxes/update-sandboxes.mdx

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,10 @@ The `langchain-deepagents-code` agent manifest declares the expected Deep Agents
3838

3939
</AgentOnly>
4040

41+
## Use the Automatic Upgrade Path
42+
43+
Run the maintained installer to update the host CLI and reconcile registered sandboxes.
44+
4145
<Warning>
4246
OpenShell 0.0.101 limits a routed sandbox name to 19 characters and rejects consecutive hyphens.
4347
A NemoClaw sandbox name must contain 1 to 19 characters.
@@ -84,12 +88,24 @@ After the automatic path retires an out-of-range gateway, it forces installation
8488
This mandatory installation applies to source and managed install modes and cannot remain deferred after gateway retirement.
8589
If the forced installation fails, the installer does not stage a gateway service or start sandbox recovery, preserves the backups, and reports how to retry.
8690

87-
For any registered-sandbox upgrade that you already prepared manually, set `NEMOCLAW_OPENSHELL_UPGRADE_PREPARED=1` only after you back up every registered sandbox and retire the gateway.
88-
This environment variable asserts that you completed those steps, so the installer skips the repeated backup and gateway-retirement phase before it checks whether OpenShell is installed or whether its version is in range.
91+
## Resume a Manually Prepared Upgrade
92+
93+
Use this path only after you back up every registered sandbox and retire the gateway.
94+
Set `NEMOCLAW_GATEWAY_PORT` to the port for the gateway that you retired.
95+
Set `NEMOCLAW_OPENSHELL_UPGRADE_PREPARED=1` on the `bash` side of the install pipeline when you rerun the installer.
96+
97+
```bash
98+
curl -fsSL https://www.nvidia.com/nemoclaw.sh | NEMOCLAW_GATEWAY_PORT=<selected-port> NEMOCLAW_OPENSHELL_UPGRADE_PREPARED=1 bash
99+
```
100+
101+
You can omit `NEMOCLAW_GATEWAY_PORT` when you prepared the default gateway on port `8080`.
102+
`NEMOCLAW_OPENSHELL_UPGRADE_PREPARED` asserts that you completed those steps, so the installer skips the repeated backup and gateway-retirement phase before it checks whether OpenShell is installed or whether its version is in range.
89103
It reuses the latest backups, forces installation of the OpenShell version pinned by the prepared source, and starts recovery only after that installation succeeds.
90-
If the forced installation fails, rerun the installer with `NEMOCLAW_OPENSHELL_UPGRADE_PREPARED=1` to reuse the prepared state and retry the OpenShell installation.
104+
If the installation fails, rerun the same install-pipeline command to preserve `NEMOCLAW_GATEWAY_PORT` and `NEMOCLAW_OPENSHELL_UPGRADE_PREPARED`.
91105
Outside these forced paths, an in-range source checkout preserves an existing OpenShell installation and installs OpenShell only when it is missing.
92106

107+
## Reconcile Registered Sandboxes
108+
93109
After the host CLI and OpenShell update, the installer runs `$$nemoclaw upgrade-sandboxes --auto` to reconcile the existing sandboxes.
94110

95111
During installer-driven recovery, each stale or non-Ready sandbox requires a validated latest backup.
@@ -121,7 +137,9 @@ This usually means a prior uninstall removed the gateway and Docker image while
121137

122138
The installer finishes with `Installation completed with warnings` and tells you to run `$$nemoclaw <name> destroy`, then `$$nemoclaw onboard`, instead of claiming recovery succeeded.
123139

124-
For a manual update flow, create a snapshot first:
140+
### Use the Manual Update Flow
141+
142+
Create a snapshot before a manual update.
125143

126144
```bash
127145
$$nemoclaw <sandbox-name> snapshot create --name pre-upgrade

0 commit comments

Comments
 (0)