Skip to content

feat(hermes): add managed tool gateway broker#3742

Merged
cv merged 11 commits into
mainfrom
aerickson/pr-3556-hermes-resume-fix
May 19, 2026
Merged

feat(hermes): add managed tool gateway broker#3742
cv merged 11 commits into
mainfrom
aerickson/pr-3556-hermes-resume-fix

Conversation

@ericksoa
Copy link
Copy Markdown
Contributor

@ericksoa ericksoa commented May 18, 2026

Summary

Maintainer replay of #3556 from @shannonsands / NousResearch, with one maintainer follow-up commit on top to make the branch shippable.

This keeps the original Hermes managed Nous Tool Gateway support: OAuth/subscription onboarding without raw Nous OAuth tokens in the sandbox, a Hermes-owned host broker for selected managed tool planes, broker-mode Hermes config/env generation, and broker-scoped policy presets.

Maintainer Follow-Up

Original PR

Supersedes/continues #3556.

Original author: @shannonsands
Original PR head before this maintainer patch: 4db9a302c3e385978a12eccc3d9f748c4a91939e
Maintainer patch commit: 3f767eeff503a1d36827022033ad3aa075b0b7e3

Verification

  • npm run build:cli
  • npx vitest run test/onboard.test.ts -t "Hermes Provider|sandbox name before"
  • npx vitest run test/onboard.test.ts test/onboard-resume-provider-recovery.test.ts test/onboard-policy-suggestions.test.ts src/lib/state/onboard-session.test.ts src/lib/onboard/dockerfile-patch.test.ts src/lib/hermes-provider-auth.test.ts src/lib/oauth-device-code.test.ts test/generate-hermes-config.test.ts test/hermes-plugin-handlers.test.ts test/hermes-tool-gateway-broker.test.ts test/policies.test.ts
  • npm run checks
  • git diff --check

Merge Gate

Before approval/merge, still require one live Hermes OAuth onboarding smoke with at least nous-web, broker health on 127.0.0.1:11436/health, and one managed-tool call through the sandbox. If local Nous OAuth/subscription is unavailable, get that exact smoke result from Nous before merging.

Signed-off-by: Shannon Sands shannon@nousresearch.com
Signed-off-by: Aaron Erickson aerickson@nvidia.com

Summary by CodeRabbit

  • New Features

    • Interactive onboarding and selection for five managed Nous tools (audio, browser, code, image, web).
    • Local host-side managed-tool gateway broker and runtime “broker-mode” plugin; new audio transcription handler.
  • Improvements

    • Broker-aware onboarding, OAuth/device flows, token registration/persistence, and sandbox lifecycle preservation of managed-tool selections.
    • Generated runtime config/env support for enabling broker and presets; new policy presets enforcing network and binary restrictions.
  • Documentation

    • Docs updated with broker behavior and environment options.
  • Tests

    • Added unit and integration tests for broker, plugin, and config generation.

Review Change Stack

Signed-off-by: Aaron Erickson <aerickson@nvidia.com>
@ericksoa ericksoa added the v0.0.46 Release target label May 18, 2026
@ericksoa ericksoa self-assigned this May 18, 2026
@copy-pr-bot
Copy link
Copy Markdown

copy-pr-bot Bot commented May 18, 2026

This pull request requires additional validation before any workflows can run on NVIDIA's runners.

Pull request vetters can view their responsibilities here.

Contributors can view more details about this message here.

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented May 18, 2026

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

Adds end-to-end Hermes managed-tool gateway support: Docker/build wiring, managed-tool matrix and presets, host broker server and lifecycle helpers, Hermes config/messaging generation, Python plugin runtime patches, onboarding/policy selection integration, session/registry persistence, and tests.

Changes

Hermes Managed Tool Gateways

Layer / File(s) Summary
Broker config & build wiring
agents/hermes/Dockerfile, agents/hermes/config/build-env.ts, docs/reference/commands.md, agents/hermes/policy-additions.yaml
Adds Docker COPY, build args/ENV for broker control; extends HermesBuildSettings with managedToolGateways parsed from env; documents broker port/env and updates policy additions.
Managed tool gateway matrix & utils
agents/hermes/host/managed-tool-gateway-matrix.json, agents/hermes/config/managed-tool-gateway.ts
Adds static matrix JSON mapping nous-* presets and a loader + applyManagedToolConfig utility to merge per-preset entries into generated Hermes config.
Hermes config generation & messaging env
agents/hermes/config/hermes-config.ts, agents/hermes/config/messaging-config.ts, agents/hermes/generate-config.ts
Injects plugins.enabled and platform_toolsets.api_server; applies per-preset managed-tool config when broker enabled; conditionally includes tts for nous-audio; emits broker env vars and per-preset env entries into Hermes messaging .env.
Host-side broker server
agents/hermes/host/tool-gateway-broker.ts
Implements broker CLI/server (default port 11436) that loads matrix, matches sandbox state, refreshes Nous OAuth via x-nous-refresh-token, ensures inference keys, proxies upstream requests with header normalization/filtering, persists per-sandbox state atomically, runs periodic refresh, and exposes health/internal endpoints.
Broker lifecycle helpers & auth
src/lib/hermes-tool-gateway-broker.ts, src/lib/hermes-provider-auth.ts, src/lib/oauth-device-code.ts
Adds lifecycle module to manage broker subprocess, token/hash persistence, provider upsert, health/reuse-or-restart logic; updates OAuth refresh flow to send refresh token via x-nous-refresh-token header and accept extra POST headers; onboarding auth can register a managed-tool refresh provider.
Python plugin broker patches & tools
agents/hermes/plugin/__init__.py
Adds broker-mode patching to route managed Nous tools (Firecrawl, OpenAI-audio/STT, Browser Use, FAL, Modal) through broker URLs, DNS-independent safety, new transcribe_audio tool handler, and pre_llm_call context injection when applicable.
Policy presets, policy selection, docs
nemoclaw-blueprint/policies/presets/*, agents/hermes/policy-additions.yaml, docs/reference/commands.md
Adds managed_inference policy and five nous-* presets (nous-audio, nous-browser, nous-code, nous-image, nous-web); tightens Nous Research allowlist and documents broker port/env vars and non-interactive selection options.
Onboarding integration & Dockerfile patching
src/lib/onboard.ts, src/lib/onboard/dockerfile-patch.ts, src/lib/onboard/hermes-managed-tools.ts, src/lib/onboard/policy-selection.ts, src/lib/onboard/initial-policy.ts, src/lib/onboard/summary.ts
Threads hermesToolGateways through onboarding: interactive/ENV selection, merge required presets into policies, provider-store preflight, Dockerfile build-arg injection, registry persistence, drift detection forcing recreate, and reflects managed tools in onboarding summary.
Session, registry, and actions persistence
src/lib/state/onboard-session.ts, src/lib/state/registry.ts, src/lib/actions/sandbox/*
Extends Session and SandboxEntry with hermesToolGateways, updates session create/normalize/filter/summarize and registry persistence, and attempts broker setup from connect/status/rebuild flows for Hermes sandboxes with managed tools.
Tests
test/generate-hermes-config.test.ts, test/hermes-plugin-handlers.test.ts, test/hermes-tool-gateway-broker.test.ts, test/onboard.test.ts, test/policies.test.ts, src/lib/hermes-provider-auth.test.ts, src/lib/oauth-device-code.test.ts
Adds integration and unit tests covering config generation with broker, plugin broker patching, broker lifecycle and proxy behavior, onboarding resume/reuse changes, policy presets expansion, and OAuth refresh-header behavior.

Sequence Diagram(s)

sequenceDiagram
  participant Client
  participant Broker
  participant Portal
  participant OpenShell
  participant Upstream
  Client->>Broker: HTTP request with broker token or refresh header
  Broker->>Portal: POST /api/oauth/token (x-nous-refresh-token)
  Portal-->>Broker: access token / agent key
  Broker->>OpenShell: openshell provider update (inference/agent key)
  Broker->>Upstream: proxy request to service upstream URL (stripped headers)
  Upstream-->>Broker: response (filtered headers/body)
  Broker-->>Client: proxied response
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

Suggested labels

enhancement, Integration: Hermes, enhancement: policy

Suggested reviewers

  • cv
  • jyaunches

"I hopped through configs, tokens, and code,
Broker and matrix to lighten the load.
Tools routed safely, tests all in tow,
A rabbit-approved gateway — off we go! 🐇"

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch aerickson/pr-3556-hermes-resume-fix

@github-actions
Copy link
Copy Markdown
Contributor

🚀 Docs preview ready!

https://NVIDIA.github.io/NemoClaw/pr-preview/pr-3742/

Comment thread agents/hermes/plugin/__init__.py Fixed
Comment thread agents/hermes/plugin/__init__.py Fixed
Comment thread agents/hermes/plugin/__init__.py Fixed
Comment thread agents/hermes/plugin/__init__.py Fixed
Comment thread agents/hermes/plugin/__init__.py Fixed
Comment thread agents/hermes/plugin/__init__.py Fixed
Comment thread agents/hermes/plugin/__init__.py Fixed
Comment thread agents/hermes/host/tool-gateway-broker.ts Fixed
Comment thread agents/hermes/host/tool-gateway-broker.ts Fixed
Comment thread test/hermes-tool-gateway-broker.test.ts Fixed
Comment thread test/hermes-tool-gateway-broker.test.ts Fixed
Comment thread src/lib/onboard.ts Fixed
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 18, 2026

E2E Advisor Recommendation

Required E2E: hermes-e2e, hermes-inference-switch-e2e, rebuild-hermes-e2e, sandbox-operations-e2e, network-policy-e2e, credential-sanitization-e2e
Optional E2E: onboard-resume-e2e, hermes-discord-e2e, hermes-slack-e2e, credential-migration-e2e

Dispatch hint: hermes-e2e,hermes-inference-switch-e2e,rebuild-hermes-e2e,sandbox-operations-e2e,network-policy-e2e,credential-sanitization-e2e

Auto-dispatched E2E: hermes-e2e, hermes-inference-switch-e2e, rebuild-hermes-e2e, sandbox-operations-e2e, network-policy-e2e, credential-sanitization-e2e via nightly-e2e.yaml at d75c8c46646b03de1bce89180ed1897bfaf71995nightly run

Workflow run

Full advisor summary

E2E Recommendation Advisor

Base: origin/main
Head: HEAD
Confidence: high

Required E2E

  • hermes-e2e (~60 min, ubuntu-latest, requires NVIDIA_API_KEY): Validates the primary Hermes user journey after changes to the Hermes Dockerfile, config generator, plugin, policy additions, and managed-tool env wiring: install/onboard with --agent hermes, sandbox health, config presence, and live inference.
  • hermes-inference-switch-e2e (~60 min, ubuntu-latest, requires NVIDIA_API_KEY): Required because Hermes provider auth, OAuth agent-key minting/refresh, and managed inference routing changed; this checks nemohermes inference set, route/config hash updates, and live requests on a running Hermes sandbox.
  • rebuild-hermes-e2e (~60 min, ubuntu-latest, requires NVIDIA_API_KEY): Required for Dockerfile/build-arg/config-generator and sandbox rebuild changes; verifies Hermes can rebuild/upgrade and preserve a working agent after image and lifecycle changes.
  • sandbox-operations-e2e (~60 min, ubuntu-latest): Required because sandbox connect/status/rebuild actions and registry state changed; validates sandbox lifecycle operations, recovery, multi-sandbox metadata, and isolation behavior.
  • network-policy-e2e (~45 min, ubuntu-latest, requires NVIDIA_API_KEY): Required because Hermes policy additions and new nous-* policy presets change security boundaries and allowed egress; this is the existing policy regression suite for deny-by-default, whitelist, hot reload, inference exemption, and SSRF validation.
  • credential-sanitization-e2e (~60 min, ubuntu-latest, requires NVIDIA_API_KEY): Required because the PR adds host-managed OAuth refresh credentials, broker tokens, provider updates, and placeholder/env handling; this is the closest existing E2E for preventing credential leakage into sandbox-readable state and diagnostics.

Optional E2E

  • onboard-resume-e2e (~60 min, ubuntu-latest, requires NVIDIA_API_KEY): Useful adjacent coverage for changes to onboarding session state, provider selection, registry, and resume summaries; Hermes-specific OAuth managed-tool resume is not directly covered, but this catches generic resume regressions.
  • hermes-discord-e2e (~60 min, ubuntu-latest, requires NVIDIA_API_KEY): Optional confidence because Hermes config/plugin/messaging env generation changed; this verifies Hermes Discord schema, placeholders, provider isolation, and native WebSocket credential rewrite.
  • hermes-slack-e2e (~60 min, linux-amd64-cpu4, requires NVIDIA_API_KEY): Optional confidence for Hermes messaging .env and policy behavior after shared config/plugin changes; validates Slack provider placeholders and credential rewrite path.
  • credential-migration-e2e (~30 min, ubuntu-latest, requires NVIDIA_API_KEY): Optional broader credential-storage regression coverage; the PR mainly adds new Hermes OAuth/broker credential flows rather than legacy credentials.json migration, but the storage hardening path is adjacent.

New E2E recommendations

  • hermes-managed-tool-gateway (high): No existing E2E appears to exercise NEMOCLAW_HERMES_TOOL_GATEWAYS, the host broker on port 11436, broker-token placeholders, OAuth refresh-token rotation, upstream auth header injection, or the nous-web/audio/image/browser/code gateway matrix end-to-end.
    • Suggested test: Add a hermes-managed-tool-gateway-e2e job using a local mock Nous Portal OAuth/token/agent-key service and mock managed gateway upstreams; onboard Hermes Provider OAuth with selected managed-tool presets, verify broker health, sandbox .env/config.yaml, no raw OAuth token in sandbox files/processes, successful brokered tool HTTP calls, and denied direct access to Nous gateway hosts.
  • hermes-managed-tool-network-policy (high): The PR adds new nous-* policy presets and removes direct sandbox access to Nous managed gateway hosts, but the current network-policy E2E is generic and does not prove Hermes managed-tool broker-only egress for each preset.
    • Suggested test: Add a Hermes policy scenario that enables each nous-* preset, asserts direct egress to portal/gateway hosts is blocked from the sandbox, asserts host.openshell.internal:11436/<service> is reachable only with the broker credential placeholder, and checks browser CDP transport exceptions for nous-browser.
  • hermes-oauth-onboard-resume (medium): Existing onboard-resume coverage uses the default NVIDIA provider and does not cover interrupted/resumed Hermes Provider OAuth with managed-tool selection and broker state recovery.
    • Suggested test: Add an E2E that interrupts Hermes Provider OAuth onboarding after broker/provider state is written, runs nemohermes onboard --resume, and verifies provider registration, broker state file permissions/hashes, generated build args, and final sandbox health.

Dispatch hint

  • Workflow: nightly-e2e.yaml
  • jobs input: hermes-e2e,hermes-inference-switch-e2e,rebuild-hermes-e2e,sandbox-operations-e2e,network-policy-e2e,credential-sanitization-e2e

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 7

🧹 Nitpick comments (4)
agents/hermes/host/tool-gateway-broker.ts (1)

1-5: ⚡ Quick win

@ts-nocheck bypasses TypeScript safety in a .ts file.

The file uses @ts-nocheck and CommonJS require syntax, effectively treating this as untyped JavaScript despite the .ts extension. Consider either:

  1. Renaming to .js and adjusting the build config if types aren't needed, or
  2. Adding proper TypeScript types and using ES module imports to benefit from type checking.

This is a credential-handling server where type safety would help catch subtle bugs.

🤖 Prompt for 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.

In `@agents/hermes/host/tool-gateway-broker.ts` around lines 1 - 5, The file
begins with "`@ts-nocheck`" and appears to use CommonJS-style runtime in a .ts
file, which disables TypeScript safety for a credential-handling server; remove
the "`@ts-nocheck`" directive, convert CommonJS requires to ES module
imports/exports, and add appropriate TypeScript types/interfaces for the main
runtime symbols (e.g., the tool gateway broker initialization function and any
exported handlers) so the compiler can catch type errors—if you truly do not
want TypeScript, rename the file to .js and update the build config instead.
src/lib/hermes-tool-gateway-broker.ts (1)

1-3: 💤 Low value

SPDX license header should appear before @ts-nocheck.

Per coding guidelines, the SPDX license header should be at the top of every source file. The @ts-nocheck directive should come after the license header.

Suggested reordering
-// `@ts-nocheck`
 // SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
 // SPDX-License-Identifier: Apache-2.0
+// `@ts-nocheck`
 //
 // Thin lifecycle glue for the Hermes managed-tool host broker.

As per coding guidelines: "Include SPDX license header at the top of every source file".

🤖 Prompt for 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.

In `@src/lib/hermes-tool-gateway-broker.ts` around lines 1 - 3, Move the SPDX
header lines so they appear before the TypeScript directive: place the
SPDX‑FileCopyrightText and SPDX‑License-Identifier comment block at the very top
of the file and then keep the // `@ts-nocheck` directive immediately after; update
the header order near the existing top-of-file comments (the // `@ts-nocheck` line
and the SPDX comment lines) so the SPDX header is the first thing in the file.
src/lib/onboard.ts (1)

9150-10254: Please rerun the onboarding E2Es on this path.

This change set touches core resume, inference, sandbox recreation, and policy application flow. I’d at least rerun the onboarding/sandbox lifecycle jobs plus the Hermes-specific smoke before merge.

As per coding guidelines: "src/lib/onboard.ts: This file contains core onboarding logic. Changes here affect the full sandbox creation and configuration flow. E2E test recommendation: cloud-e2e, sandbox-operations-e2e, rebuild-openclaw-e2e, channels-stop-start-e2e, messaging-compatible-endpoint-e2e, hermes-discord-e2e, hermes-slack-e2e, openshell-gateway-upgrade-e2e."

🤖 Prompt for 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.

In `@src/lib/onboard.ts` around lines 9150 - 10254, The diff modifies core
onboarding flows (async function onboard) including resume handling, inference
setup (setupInference), sandbox creation (createSandbox), policy application
(setupPoliciesWithSelection), agent setup (agentOnboard.handleAgentSetup) and
post-deploy verification (verifyDeploymentModule.verifyDeployment); rerun the
full E2E suites that exercise resume, sandbox lifecycle, agent/Hermes
integrations and gateway upgrades: specifically run cloud-e2e,
sandbox-operations-e2e, rebuild-openclaw-e2e, channels-stop-start-e2e,
messaging-compatible-endpoint-e2e, hermes-discord-e2e, hermes-slack-e2e and
openshell-gateway-upgrade-e2e to validate resume/inference/sandbox
recreation/policy application paths end-to-end and report any failures so we can
iterate on fixes.
docs/reference/commands.md (1)

1133-1133: ⚡ Quick win

Use active voice for broker startup behavior.

Line 1133 is passive (“it is started only…”). Prefer active voice (for example, “NemoClaw starts this broker only…”).

As per coding guidelines, "Active voice required. Flag passive constructions."

🤖 Prompt for 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.

In `@docs/reference/commands.md` at line 1133, The sentence "it is started only
for Hermes managed-tool gateway sessions" is passive; change it to active voice
by naming the actor (e.g., "NemoClaw starts this broker only for Hermes-managed
tool gateway sessions") and apply the hyphenation "Hermes-managed" and "tool
gateway" as needed; update the sentence in the docs/reference/commands.md where
that phrase appears (replace the passive clause with the active clause and
ensure punctuation/capitalization matches surrounding style).
🤖 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 `@agents/hermes/config/messaging-config.ts`:
- Around line 36-39: The loop over managedToolGatewayPresets silently skips when
matrix[preset] is missing; change this to fail fast by throwing an error instead
of continuing: inside the for (const preset of managedToolGatewayPresets) loop,
replace the "if (!entry) continue;" behavior with a throw that includes the
preset name and context (e.g., which preset is missing for the
managedToolGatewayPresets → matrix mapping) so envLines only receives fully
validated entries (refer to managedToolGatewayPresets, matrix, envLines, and
entry.envKey/entry.envValue to locate the code).

In `@agents/hermes/Dockerfile`:
- Around line 92-94: Remove the build-time ARG/ENV usage for
NEMOCLAW_HERMES_TOOL_BROKER_TOKEN (and the duplicate usage around the later
ARGs) so the broker token is not baked into the image; stop declaring or setting
NEMOCLAW_HERMES_TOOL_BROKER_TOKEN in the Dockerfile (references: ARG
NEMOCLAW_HERMES_TOOL_BROKER_TOKEN and any subsequent ARG/ENV blocks), and
instead document/expect the secret to be provided at container start (via
runtime environment variable, Docker secrets, Kubernetes secret/volume, or a
credential file mounted into the container) and update any entrypoint/startup
logic to read the token from the runtime source rather than the Dockerfile.

In `@agents/hermes/host/tool-gateway-broker.ts`:
- Around line 549-560: The upstream fetch in the try block calling
fetch(route.upstreamUrl, ...) must include an AbortSignal timeout so hung
upstreams don't block; create a signal via AbortSignal.timeout(timeoutMs) (or an
AbortController if older runtime), pass it as the signal option to fetch
alongside method/headers/body, and update the catch to detect an abort/timeout
(e.g., AbortError) and return an appropriate response (e.g., 504) instead of the
generic 502; references: the fetch call where upstreamResp is assigned,
route.upstreamUrl, buildForwardHeaders(req, route, accessToken), and the
try/catch around upstreamResp.

In `@agents/hermes/plugin/__init__.py`:
- Around line 625-629: The _cleanup_browser_use_cdp_tunnels function currently
only terminates live subprocesses but never removes dead entries from the
_BROWSER_USE_CDP_TUNNELS cache, allowing it to grow unbounded; update this
function (and the equivalent cleanup block referenced around the other
occurrence) to iterate over list(_BROWSER_USE_CDP_TUNNELS.items()), call
proc.poll() to detect liveness, terminate live procs as now, and remove entries
for processes that are already dead (and optionally remove entries after
terminating), making sure to mutate the dict only using keys collected from the
list() to avoid in-loop mutation errors; reference symbols:
_cleanup_browser_use_cdp_tunnels and _BROWSER_USE_CDP_TUNNELS.

In `@src/lib/onboard.ts`:
- Around line 7465-7477: shouldPrepareHermesCredentials can skip credential
reconciliation when the sandbox/provider exists even though hermesToolGateways
selection has changed; update the logic to also force reconciliation when the
configured hermesToolGateways differ from what the provider currently has
registered. Use
getHermesToolGatewayBroker().getHermesToolGatewayProviderName(targetSandbox) to
fetch the provider name, query the provider's registered tool-gateway presets
(instead of relying solely on providerExistsInGateway) and compute a boolean
like toolGatewaySelectionChanged (compare the provider's registered presets to
the current hermesToolGateways array), then include that boolean in the
shouldPrepareHermesCredentials condition so
ensureHermesProvider*Credentials(...) runs when selection drift is detected.
- Around line 5004-5005: The persisted Hermes gateway presets loaded via
registry.getSandbox(sandboxName)?.hermesToolGateways are used directly (const
recordedHermesToolGateways ... ?? []), which can let non-arrays or unknown names
leak into drift checks (hermesToolGatewayDrift), policy merging and patching;
add and call a normalization/validation helper that (a) coerces non-array values
to an empty array, (b) filters out entries that are not valid preset names, and
(c) returns a deduplicated, sorted array, then replace the raw use of
registry.getSandbox(...)? .hermesToolGateways ?? [] with the normalized result
before computing hermesToolGatewayDrift and apply the same helper at the other
noted call sites (lines referenced by similar patterns).

In `@test/onboard.test.ts`:
- Around line 682-685: The test harness is leaking inherited messaging
credentials by spreading process.env into the child env; before the
onboarding/sandbox creation step (the code that sets up process.env and spawns
the resume harness), explicitly delete any DISCORD_* and TELEGRAM_* variables
(e.g. remove process.env.DISCORD_TOKEN, process.env.DISCORD_WEBHOOK_*,
process.env.TELEGRAM_TOKEN, process.env.TELEGRAM_CHAT_ID, and any other keys
matching /^DISCORD_/ or /^TELEGRAM_/) so the child env used by the
resume/onboard flow is hermetic and cannot activate messaging channels when the
test calls the functions that build the sandbox or spawn the child process.

---

Nitpick comments:
In `@agents/hermes/host/tool-gateway-broker.ts`:
- Around line 1-5: The file begins with "`@ts-nocheck`" and appears to use
CommonJS-style runtime in a .ts file, which disables TypeScript safety for a
credential-handling server; remove the "`@ts-nocheck`" directive, convert CommonJS
requires to ES module imports/exports, and add appropriate TypeScript
types/interfaces for the main runtime symbols (e.g., the tool gateway broker
initialization function and any exported handlers) so the compiler can catch
type errors—if you truly do not want TypeScript, rename the file to .js and
update the build config instead.

In `@docs/reference/commands.md`:
- Line 1133: The sentence "it is started only for Hermes managed-tool gateway
sessions" is passive; change it to active voice by naming the actor (e.g.,
"NemoClaw starts this broker only for Hermes-managed tool gateway sessions") and
apply the hyphenation "Hermes-managed" and "tool gateway" as needed; update the
sentence in the docs/reference/commands.md where that phrase appears (replace
the passive clause with the active clause and ensure punctuation/capitalization
matches surrounding style).

In `@src/lib/hermes-tool-gateway-broker.ts`:
- Around line 1-3: Move the SPDX header lines so they appear before the
TypeScript directive: place the SPDX‑FileCopyrightText and
SPDX‑License-Identifier comment block at the very top of the file and then keep
the // `@ts-nocheck` directive immediately after; update the header order near the
existing top-of-file comments (the // `@ts-nocheck` line and the SPDX comment
lines) so the SPDX header is the first thing in the file.

In `@src/lib/onboard.ts`:
- Around line 9150-10254: The diff modifies core onboarding flows (async
function onboard) including resume handling, inference setup (setupInference),
sandbox creation (createSandbox), policy application
(setupPoliciesWithSelection), agent setup (agentOnboard.handleAgentSetup) and
post-deploy verification (verifyDeploymentModule.verifyDeployment); rerun the
full E2E suites that exercise resume, sandbox lifecycle, agent/Hermes
integrations and gateway upgrades: specifically run cloud-e2e,
sandbox-operations-e2e, rebuild-openclaw-e2e, channels-stop-start-e2e,
messaging-compatible-endpoint-e2e, hermes-discord-e2e, hermes-slack-e2e and
openshell-gateway-upgrade-e2e to validate resume/inference/sandbox
recreation/policy application paths end-to-end and report any failures so we can
iterate on fixes.
🪄 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: 3176aa9c-40bd-4065-bf45-d0cd42fe0ff9

📥 Commits

Reviewing files that changed from the base of the PR and between d7bae57 and 3f767ee.

📒 Files selected for processing (39)
  • agents/hermes/Dockerfile
  • agents/hermes/config/build-env.ts
  • agents/hermes/config/hermes-config.ts
  • agents/hermes/config/managed-tool-gateway.ts
  • agents/hermes/config/messaging-config.ts
  • agents/hermes/generate-config.ts
  • agents/hermes/host/managed-tool-gateway-matrix.json
  • agents/hermes/host/tool-gateway-broker.ts
  • agents/hermes/plugin/__init__.py
  • agents/hermes/policy-additions.yaml
  • docs/reference/commands.md
  • nemoclaw-blueprint/policies/presets/nous-audio.yaml
  • nemoclaw-blueprint/policies/presets/nous-browser.yaml
  • nemoclaw-blueprint/policies/presets/nous-code.yaml
  • nemoclaw-blueprint/policies/presets/nous-image.yaml
  • nemoclaw-blueprint/policies/presets/nous-web.yaml
  • src/lib/actions/inference-set.test.ts
  • src/lib/actions/sandbox/connect.ts
  • src/lib/actions/sandbox/rebuild.ts
  • src/lib/actions/sandbox/status.ts
  • src/lib/hermes-provider-auth.test.ts
  • src/lib/hermes-provider-auth.ts
  • src/lib/hermes-tool-gateway-broker.ts
  • src/lib/oauth-device-code.test.ts
  • src/lib/oauth-device-code.ts
  • src/lib/onboard.ts
  • src/lib/onboard/dockerfile-patch.ts
  • src/lib/onboard/hermes-managed-tools.ts
  • src/lib/onboard/initial-policy.test.ts
  • src/lib/onboard/initial-policy.ts
  • src/lib/onboard/policy-selection.ts
  • src/lib/onboard/summary.ts
  • src/lib/state/onboard-session.ts
  • src/lib/state/registry.ts
  • test/generate-hermes-config.test.ts
  • test/hermes-plugin-handlers.test.ts
  • test/hermes-tool-gateway-broker.test.ts
  • test/onboard.test.ts
  • test/policies.test.ts

Comment thread agents/hermes/config/messaging-config.ts
Comment thread agents/hermes/Dockerfile Outdated
Comment thread agents/hermes/host/tool-gateway-broker.ts
Comment thread src/lib/onboard.ts Outdated
Comment thread src/lib/onboard.ts
Comment thread test/onboard.test.ts
@ericksoa ericksoa force-pushed the aerickson/pr-3556-hermes-resume-fix branch from 3f767ee to a9b00c4 Compare May 18, 2026 16:26
@github-actions
Copy link
Copy Markdown
Contributor

Selective E2E Results — ✅ All requested jobs passed

Run: 26045638329
Target ref: 3f767eeff503a1d36827022033ad3aa075b0b7e3
Workflow ref: main
Requested jobs: hermes-e2e,rebuild-hermes-e2e,network-policy-e2e,onboard-resume-e2e,sandbox-operations-e2e,credential-sanitization-e2e,hermes-inference-switch-e2e
Summary: 5 passed, 0 failed, 0 skipped

Job Result
credential-sanitization-e2e ✅ success
hermes-e2e ✅ success
hermes-inference-switch-e2e ✅ success
network-policy-e2e ⚠️ cancelled
onboard-resume-e2e ✅ success
rebuild-hermes-e2e ✅ success
sandbox-operations-e2e ⚠️ cancelled

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

♻️ Duplicate comments (2)
agents/hermes/plugin/__init__.py (1)

625-629: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Prune stale Browser Use CDP tunnel cache entries.

Line 625 only terminates live subprocesses; it never removes dead/live entries from _BROWSER_USE_CDP_TUNNELS. Over time, unique CDP URLs accumulate stale entries.

Proposed fix
 def _cleanup_browser_use_cdp_tunnels():
-    for proc, _url in list(_BROWSER_USE_CDP_TUNNELS.values()):
+    for remote_url, (proc, _url) in list(_BROWSER_USE_CDP_TUNNELS.items()):
         if proc.poll() is None:
             proc.terminate()
+        _BROWSER_USE_CDP_TUNNELS.pop(remote_url, None)
@@
 def _start_browser_use_cdp_tunnel(cdp_url):
+    for remote_url, (proc, _url) in list(_BROWSER_USE_CDP_TUNNELS.items()):
+        if proc.poll() is not None:
+            _BROWSER_USE_CDP_TUNNELS.pop(remote_url, None)
+
     parsed = urlparse(str(cdp_url or ""))

Also applies to: 640-663

🤖 Prompt for 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.

In `@agents/hermes/plugin/__init__.py` around lines 625 - 629, The cleanup
currently only calls proc.terminate() and never removes entries from the
_BROWSER_USE_CDP_TUNNELS cache, so stale CDP URLs accumulate; update the
_cleanup_browser_use_cdp_tunnels function to iterate over
_BROWSER_USE_CDP_TUNNELS.items(), check each proc.poll(): if proc is alive,
terminate it and then remove its key from the dict, and if proc is dead simply
remove its key (or use a new dict/comprehension to rebuild only live entries),
ensuring the cache no longer retains dead or terminated entries; apply the same
fix to the other similar cleanup loop that also operates on
_BROWSER_USE_CDP_TUNNELS in this module.
agents/hermes/Dockerfile (1)

92-94: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Do not bake NEMOCLAW_HERMES_TOOL_BROKER_TOKEN into build args/env.

Line 94 and Line 110 make the broker token part of image build metadata/layers. Keep this token runtime-injected only (container env/secret mount at start), not Dockerfile ARG→ENV propagated.

Suggested minimal Dockerfile change
-ARG NEMOCLAW_HERMES_TOOL_BROKER_TOKEN=
@@
-    NEMOCLAW_HERMES_TOOL_GATEWAY_PRESETS_B64=${NEMOCLAW_HERMES_TOOL_GATEWAY_PRESETS_B64} \
-    NEMOCLAW_HERMES_TOOL_BROKER_TOKEN=${NEMOCLAW_HERMES_TOOL_BROKER_TOKEN}
+    NEMOCLAW_HERMES_TOOL_GATEWAY_PRESETS_B64=${NEMOCLAW_HERMES_TOOL_GATEWAY_PRESETS_B64}
+# NOTE: NEMOCLAW_HERMES_TOOL_BROKER_TOKEN must be injected at runtime only.

Also applies to: 107-110

🤖 Prompt for 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.

In `@agents/hermes/Dockerfile` around lines 92 - 94, Remove any Dockerfile ARG or
ENV that bakes NEMOCLAW_HERMES_TOOL_BROKER_TOKEN into the image (the ARG
NEMOCLAW_HERMES_TOOL_BROKER_TOKEN declaration and any ENV propagation around
lines where NEMOCLAW_HERMES_TOOL_BROKER_TOKEN is used, including the similar
block at 107-110). Stop passing that secret as a build ARG or embedding it into
labels/layers; instead delete the ARG/ENV lines and rely on runtime injection
(container environment variable, Kubernetes secret, or secret mount) so the
broker token is provided only at container start, not during docker build.
Ensure no other Dockerfile instructions (e.g., LABEL, RUN echo, or ENV)
reference that token so it cannot end up in image metadata.
🤖 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.

Duplicate comments:
In `@agents/hermes/Dockerfile`:
- Around line 92-94: Remove any Dockerfile ARG or ENV that bakes
NEMOCLAW_HERMES_TOOL_BROKER_TOKEN into the image (the ARG
NEMOCLAW_HERMES_TOOL_BROKER_TOKEN declaration and any ENV propagation around
lines where NEMOCLAW_HERMES_TOOL_BROKER_TOKEN is used, including the similar
block at 107-110). Stop passing that secret as a build ARG or embedding it into
labels/layers; instead delete the ARG/ENV lines and rely on runtime injection
(container environment variable, Kubernetes secret, or secret mount) so the
broker token is provided only at container start, not during docker build.
Ensure no other Dockerfile instructions (e.g., LABEL, RUN echo, or ENV)
reference that token so it cannot end up in image metadata.

In `@agents/hermes/plugin/__init__.py`:
- Around line 625-629: The cleanup currently only calls proc.terminate() and
never removes entries from the _BROWSER_USE_CDP_TUNNELS cache, so stale CDP URLs
accumulate; update the _cleanup_browser_use_cdp_tunnels function to iterate over
_BROWSER_USE_CDP_TUNNELS.items(), check each proc.poll(): if proc is alive,
terminate it and then remove its key from the dict, and if proc is dead simply
remove its key (or use a new dict/comprehension to rebuild only live entries),
ensuring the cache no longer retains dead or terminated entries; apply the same
fix to the other similar cleanup loop that also operates on
_BROWSER_USE_CDP_TUNNELS in this module.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 5983c064-4eb5-414e-aa1b-7e15ad7a9cf4

📥 Commits

Reviewing files that changed from the base of the PR and between 3f767ee and a9b00c4.

📒 Files selected for processing (39)
  • agents/hermes/Dockerfile
  • agents/hermes/config/build-env.ts
  • agents/hermes/config/hermes-config.ts
  • agents/hermes/config/managed-tool-gateway.ts
  • agents/hermes/config/messaging-config.ts
  • agents/hermes/generate-config.ts
  • agents/hermes/host/managed-tool-gateway-matrix.json
  • agents/hermes/host/tool-gateway-broker.ts
  • agents/hermes/plugin/__init__.py
  • agents/hermes/policy-additions.yaml
  • docs/reference/commands.md
  • nemoclaw-blueprint/policies/presets/nous-audio.yaml
  • nemoclaw-blueprint/policies/presets/nous-browser.yaml
  • nemoclaw-blueprint/policies/presets/nous-code.yaml
  • nemoclaw-blueprint/policies/presets/nous-image.yaml
  • nemoclaw-blueprint/policies/presets/nous-web.yaml
  • src/lib/actions/inference-set.test.ts
  • src/lib/actions/sandbox/connect.ts
  • src/lib/actions/sandbox/rebuild.ts
  • src/lib/actions/sandbox/status.ts
  • src/lib/hermes-provider-auth.test.ts
  • src/lib/hermes-provider-auth.ts
  • src/lib/hermes-tool-gateway-broker.ts
  • src/lib/oauth-device-code.test.ts
  • src/lib/oauth-device-code.ts
  • src/lib/onboard.ts
  • src/lib/onboard/dockerfile-patch.ts
  • src/lib/onboard/hermes-managed-tools.ts
  • src/lib/onboard/initial-policy.test.ts
  • src/lib/onboard/initial-policy.ts
  • src/lib/onboard/policy-selection.ts
  • src/lib/onboard/summary.ts
  • src/lib/state/onboard-session.ts
  • src/lib/state/registry.ts
  • test/generate-hermes-config.test.ts
  • test/hermes-plugin-handlers.test.ts
  • test/hermes-tool-gateway-broker.test.ts
  • test/onboard.test.ts
  • test/policies.test.ts
✅ Files skipped from review due to trivial changes (2)
  • docs/reference/commands.md
  • src/lib/actions/inference-set.test.ts
🚧 Files skipped from review as they are similar to previous changes (34)
  • nemoclaw-blueprint/policies/presets/nous-audio.yaml
  • src/lib/onboard/initial-policy.ts
  • src/lib/state/registry.ts
  • agents/hermes/config/build-env.ts
  • agents/hermes/host/managed-tool-gateway-matrix.json
  • agents/hermes/generate-config.ts
  • test/onboard.test.ts
  • nemoclaw-blueprint/policies/presets/nous-image.yaml
  • nemoclaw-blueprint/policies/presets/nous-browser.yaml
  • test/generate-hermes-config.test.ts
  • src/lib/actions/sandbox/status.ts
  • src/lib/onboard/summary.ts
  • src/lib/oauth-device-code.ts
  • src/lib/onboard/initial-policy.test.ts
  • src/lib/actions/sandbox/connect.ts
  • src/lib/actions/sandbox/rebuild.ts
  • agents/hermes/config/hermes-config.ts
  • src/lib/onboard/dockerfile-patch.ts
  • nemoclaw-blueprint/policies/presets/nous-code.yaml
  • test/hermes-plugin-handlers.test.ts
  • agents/hermes/policy-additions.yaml
  • nemoclaw-blueprint/policies/presets/nous-web.yaml
  • agents/hermes/config/messaging-config.ts
  • agents/hermes/config/managed-tool-gateway.ts
  • src/lib/hermes-provider-auth.ts
  • src/lib/hermes-tool-gateway-broker.ts
  • src/lib/hermes-provider-auth.test.ts
  • test/hermes-tool-gateway-broker.test.ts
  • src/lib/state/onboard-session.ts
  • src/lib/onboard/hermes-managed-tools.ts
  • src/lib/onboard/policy-selection.ts
  • agents/hermes/host/tool-gateway-broker.ts
  • src/lib/oauth-device-code.test.ts
  • src/lib/onboard.ts

@github-actions
Copy link
Copy Markdown
Contributor

Selective E2E Results — ❌ Some jobs failed

Run: 26046368765
Target ref: a9b00c40027b5f6d7bde5a4fee0d4cd9d1e01755
Workflow ref: main
Requested jobs: hermes-e2e,rebuild-hermes-e2e,network-policy-e2e,credential-sanitization-e2e,onboard-resume-e2e,hermes-inference-switch-e2e
Summary: 5 passed, 1 failed, 0 skipped

Job Result
credential-sanitization-e2e ✅ success
hermes-e2e ✅ success
hermes-inference-switch-e2e ❌ failure
network-policy-e2e ✅ success
onboard-resume-e2e ✅ success
rebuild-hermes-e2e ✅ success

Failed jobs: hermes-inference-switch-e2e. Check run artifacts for logs.

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

♻️ Duplicate comments (1)
src/lib/onboard.ts (1)

7480-7492: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Reconcile Hermes managed-tool preset drift, not just provider existence.

toolGatewayProviderRegistered only checks whether the broker provider exists for this sandbox name. On a recreate/resume of the same sandbox, that provider can still hold the old preset set, so shouldPrepareHermesCredentials goes false and the new hermesToolGateways never get pushed before createSandbox() consumes them. Compare the provider’s registered preset set against hermesToolGateways here and force reconciliation on drift.

🤖 Prompt for 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.

In `@src/lib/onboard.ts` around lines 7480 - 7492, The current
toolGatewayProviderRegistered check only ensures a provider exists but not that
its registered preset set matches the desired hermesToolGateways, which can miss
recreate/resume drift; update the logic around toolGatewayProviderRegistered and
shouldPrepareHermesCredentials to fetch the existing provider's preset set from
getHermesToolGatewayBroker().getHermesToolGatewayProviderName(targetSandbox) (or
a new broker helper like getProviderPresets/getRegisteredPresets) and compare it
to the local hermesToolGateways (compare by preset IDs/names as sets), and if
they differ force reconciliation by treating toolGatewayProviderRegistered as
false (or add a new boolean like presetsDrift) so shouldPrepareHermesCredentials
becomes true and pushes the new hermesToolGateways before createSandbox() runs.
🤖 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 `@agents/hermes/plugin/__init__.py`:
- Around line 633-638: The cleanup function _cleanup_browser_use_cdp_tunnels
currently terminates tunnel subprocesses but never reaps them, causing zombie
processes; update the function (and the similar blocks around the other
occurrences noted) to wait() on each subprocess after terminating (or if already
exited) to reap the child—i.e., after checking proc.poll() and calling
proc.terminate(), call proc.wait() (with a short timeout or handle exceptions)
or if proc.poll() is not None call proc.wait() to ensure the process is reaped
and then remove the entry from _BROWSER_USE_CDP_TUNNELS; apply the same pattern
to the other cleanup spots referenced.

---

Duplicate comments:
In `@src/lib/onboard.ts`:
- Around line 7480-7492: The current toolGatewayProviderRegistered check only
ensures a provider exists but not that its registered preset set matches the
desired hermesToolGateways, which can miss recreate/resume drift; update the
logic around toolGatewayProviderRegistered and shouldPrepareHermesCredentials to
fetch the existing provider's preset set from
getHermesToolGatewayBroker().getHermesToolGatewayProviderName(targetSandbox) (or
a new broker helper like getProviderPresets/getRegisteredPresets) and compare it
to the local hermesToolGateways (compare by preset IDs/names as sets), and if
they differ force reconciliation by treating toolGatewayProviderRegistered as
false (or add a new boolean like presetsDrift) so shouldPrepareHermesCredentials
becomes true and pushes the new hermesToolGateways before createSandbox() runs.
🪄 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: 6ab2f68e-0f3a-40ea-ac2d-074049a9d10a

📥 Commits

Reviewing files that changed from the base of the PR and between a9b00c4 and e2be564.

📒 Files selected for processing (15)
  • agents/hermes/Dockerfile
  • agents/hermes/config/build-env.ts
  • agents/hermes/config/hermes-config.ts
  • agents/hermes/config/messaging-config.ts
  • agents/hermes/generate-config.ts
  • agents/hermes/host/tool-gateway-broker.ts
  • agents/hermes/plugin/__init__.py
  • src/lib/hermes-provider-auth.test.ts
  • src/lib/hermes-provider-auth.ts
  • src/lib/hermes-tool-gateway-broker.ts
  • src/lib/onboard.ts
  • src/lib/onboard/dockerfile-patch.ts
  • test/generate-hermes-config.test.ts
  • test/hermes-tool-gateway-broker.test.ts
  • test/onboard.test.ts
🚧 Files skipped from review as they are similar to previous changes (7)
  • test/onboard.test.ts
  • agents/hermes/config/hermes-config.ts
  • agents/hermes/config/build-env.ts
  • src/lib/hermes-provider-auth.test.ts
  • test/hermes-tool-gateway-broker.test.ts
  • agents/hermes/host/tool-gateway-broker.ts
  • src/lib/hermes-tool-gateway-broker.ts

Comment thread agents/hermes/plugin/__init__.py
Signed-off-by: Aaron Erickson <aerickson@nvidia.com>
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 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 `@agents/hermes/plugin/__init__.py`:
- Around line 683-688: When port validation fails and you call proc.terminate(),
the child is not reaped; update the failure branch to properly reap the process:
after proc.terminate() call proc.wait() (with a short timeout) and on timeout
call proc.kill() and wait again, catching exceptions as needed; do this in the
same block where proc is validated (referencing the proc local and the
surrounding code that returns cdp_url) so the terminated process is never left
running and does not rely on _BROWSER_USE_CDP_TUNNELS for cleanup.
🪄 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: 417a0c3a-2c98-41f4-b4e9-7089c27074fa

📥 Commits

Reviewing files that changed from the base of the PR and between e2be564 and 6dd143d.

📒 Files selected for processing (1)
  • agents/hermes/plugin/__init__.py

Comment thread agents/hermes/plugin/__init__.py
@github-actions
Copy link
Copy Markdown
Contributor

Selective E2E Results — ✅ All requested jobs passed

Run: 26047443720
Target ref: e2be564f4f7f8f68901c26834e4cbe2cfcafec0f
Workflow ref: main
Requested jobs: hermes-e2e,rebuild-hermes-e2e,network-policy-e2e,credential-sanitization-e2e,onboard-resume-e2e,hermes-inference-switch-e2e,sandbox-operations-e2e
Summary: 4 passed, 0 failed, 0 skipped

Job Result
credential-sanitization-e2e ✅ success
hermes-e2e ✅ success
hermes-inference-switch-e2e ✅ success
network-policy-e2e ⚠️ cancelled
onboard-resume-e2e ⚠️ cancelled
rebuild-hermes-e2e ✅ success
sandbox-operations-e2e ⚠️ cancelled

@cv cv added v0.0.45 Release target v0.0.46 Release target and removed v0.0.46 Release target v0.0.45 Release target labels May 18, 2026
@github-actions
Copy link
Copy Markdown
Contributor

Selective E2E Results — ✅ All requested jobs passed

Run: 26048024149
Target ref: 6dd143d1fdb10f90f41ea213c1f2ec44b83e280e
Workflow ref: main
Requested jobs: hermes-e2e,hermes-inference-switch-e2e,rebuild-hermes-e2e,network-policy-e2e,sandbox-operations-e2e,onboard-resume-e2e,hermes-discord-e2e
Summary: 5 passed, 0 failed, 0 skipped

Job Result
hermes-discord-e2e ✅ success
hermes-e2e ✅ success
hermes-inference-switch-e2e ✅ success
network-policy-e2e ⚠️ cancelled
onboard-resume-e2e ✅ success
rebuild-hermes-e2e ✅ success
sandbox-operations-e2e ⚠️ cancelled

@ericksoa ericksoa added Integration: Hermes Sandbox Use this label to identify issues related to the NemoClaw isolated environment based on OpenShell. enhancement: integration PRs or issues proposing integration of a third-party product or service into NemoClaw. status: rfr Ready for review — no conflicts, awaiting maintainer review labels May 18, 2026
@github-actions
Copy link
Copy Markdown
Contributor

Selective E2E Results — ✅ All requested jobs passed

Run: 26048616718
Target ref: ac5378f5f39100d276faf6efa6ab7f9cfe81b5d6
Workflow ref: main
Requested jobs: hermes-e2e,rebuild-hermes-e2e,network-policy-e2e,onboard-resume-e2e,hermes-inference-switch-e2e,sandbox-operations-e2e,hermes-discord-e2e,hermes-slack-e2e
Summary: 8 passed, 0 failed, 0 skipped

Job Result
hermes-discord-e2e ✅ success
hermes-e2e ✅ success
hermes-inference-switch-e2e ✅ success
hermes-slack-e2e ✅ success
network-policy-e2e ✅ success
onboard-resume-e2e ✅ success
rebuild-hermes-e2e ✅ success
sandbox-operations-e2e ✅ success

@github-actions
Copy link
Copy Markdown
Contributor

ericksoa added 2 commits May 18, 2026 15:44
Signed-off-by: Aaron Erickson <aerickson@nvidia.com>
Signed-off-by: Aaron Erickson <aerickson@nvidia.com>
@github-actions
Copy link
Copy Markdown
Contributor

Selective E2E Results — ✅ All requested jobs passed

Run: 26064745453
Target ref: a114998657c5dcd4a212c8b936b4a6cd78a701ee
Workflow ref: main
Requested jobs: hermes-e2e,rebuild-hermes-e2e,hermes-inference-switch-e2e,network-policy-e2e,onboard-resume-e2e,sandbox-operations-e2e,inference-routing-e2e
Summary: 7 passed, 0 failed, 0 skipped

Job Result
hermes-e2e ✅ success
hermes-inference-switch-e2e ✅ success
inference-routing-e2e ✅ success
network-policy-e2e ✅ success
onboard-resume-e2e ✅ success
rebuild-hermes-e2e ✅ success
sandbox-operations-e2e ✅ success

@ericksoa ericksoa requested a review from cv May 19, 2026 02:08
…mes-resume-fix

Signed-off-by: Aaron Erickson <aerickson@nvidia.com>

# Conflicts:
#	src/lib/onboard.ts
#	test/policies.test.ts
Comment thread src/lib/onboard.ts Fixed
@github-actions
Copy link
Copy Markdown
Contributor

Selective E2E Results — ✅ All requested jobs passed

Run: 26079802117
Target ref: 91f356e4c6bb93d8dee1a7b647029828166842ef
Workflow ref: main
Requested jobs: hermes-e2e,hermes-inference-switch-e2e,rebuild-hermes-e2e,network-policy-e2e,sandbox-operations-e2e,channels-stop-start-e2e
Summary: 6 passed, 0 failed, 0 skipped

Job Result
channels-stop-start-e2e ✅ success
hermes-e2e ✅ success
hermes-inference-switch-e2e ✅ success
network-policy-e2e ✅ success
rebuild-hermes-e2e ✅ success
sandbox-operations-e2e ✅ success

ericksoa added 2 commits May 19, 2026 07:33
Signed-off-by: Aaron Erickson <aerickson@nvidia.com>
Signed-off-by: Aaron Erickson <aerickson@nvidia.com>
@github-actions
Copy link
Copy Markdown
Contributor

Selective E2E Results — ✅ All requested jobs passed

Run: 26104889073
Target ref: 889163383500eeda73876105e4c98036f87dff16
Workflow ref: main
Requested jobs: hermes-e2e,hermes-inference-switch-e2e,rebuild-hermes-e2e,network-policy-e2e,sandbox-operations-e2e,credential-sanitization-e2e
Summary: 6 passed, 0 failed, 0 skipped

Job Result
credential-sanitization-e2e ✅ success
hermes-e2e ✅ success
hermes-inference-switch-e2e ✅ success
network-policy-e2e ✅ success
rebuild-hermes-e2e ✅ success
sandbox-operations-e2e ✅ success

Signed-off-by: Aaron Erickson <aerickson@nvidia.com>
@github-actions
Copy link
Copy Markdown
Contributor

Selective E2E Results — ✅ All requested jobs passed

Run: 26115988321
Target ref: d75c8c46646b03de1bce89180ed1897bfaf71995
Workflow ref: main
Requested jobs: hermes-e2e,hermes-inference-switch-e2e,rebuild-hermes-e2e,sandbox-operations-e2e,network-policy-e2e,credential-sanitization-e2e
Summary: 6 passed, 0 failed, 0 skipped

Job Result
credential-sanitization-e2e ✅ success
hermes-e2e ✅ success
hermes-inference-switch-e2e ✅ success
network-policy-e2e ✅ success
rebuild-hermes-e2e ✅ success
sandbox-operations-e2e ✅ success

@cv cv merged commit 9929ac3 into main May 19, 2026
27 checks passed
@miyoungc miyoungc mentioned this pull request May 20, 2026
12 tasks
miyoungc added a commit that referenced this pull request May 20, 2026
## Summary
Refreshes the NemoClaw docs for v0.0.46 by updating version metadata,
release notes, and generated user skills. The refresh also keeps public
docs aligned with the docs skip list by removing non-public experimental
references from the generated output.

## Related Issue
None.

## Changes
- #3744 and #3824 -> `docs/about/release-notes.mdx`: Added Windows
bootstrap and WSL express install coverage for v0.0.46.
- #3392 -> `docs/manage-sandboxes/messaging-channels.mdx`,
`docs/reference/commands.mdx`, `docs/reference/network-policies.mdx`,
and policy examples: Refreshed public messaging channel docs around
WhatsApp and matching policy presets.
- #3742, #3767, #3732, #3786, #3777, and #3808 ->
`docs/about/release-notes.mdx`: Added release-note coverage for Hermes
managed tools, Bedrock Runtime endpoint detection, WSL Ollama proxying,
Model Router Python fallback, plugin command registration, and
tool-catalog latency improvements.
- #3124 -> `docs/about/release-notes.mdx`: Added release-note coverage
for hosted uninstall flag guidance.
- Generated `nemoclaw-user-*` skills from the updated MDX docs for the
v0.0.46 release.

## Type of Change
- [ ] Code change (feature, bug fix, or refactor)
- [ ] Code change with doc updates
- [x] Doc only (prose changes, no code sample modifications)
- [ ] Doc only (includes code sample changes)

## Verification
- [ ] `npx prek run --all-files` passes
- [ ] `npm test` passes
- [ ] Tests added or updated for new or changed behavior
- [x] No secrets, API keys, or credentials committed
- [x] Docs updated for user-facing behavior changes
- [ ] `make docs` builds without warnings (doc changes only)
- [x] Doc pages follow the [style
guide](https://github.com/NVIDIA/NemoClaw/blob/main/docs/CONTRIBUTING.md)
(doc changes only)
- [ ] New doc pages include SPDX header and frontmatter (new pages only)

Verification notes:
- Commit hooks passed, including markdownlint, gitleaks, docs-to-skills
verification, env-var docs, and skills YAML checks.
- `python3 scripts/docs-to-skills.py docs/ .agents/skills/ --prefix
nemoclaw-user --doc-platform fern-mdx` passed.
- `bash test/e2e/e2e-cloud-experimental/check-docs.sh --only-links
--local-only --with-skills` passed.
- `git diff --check` passed.
- `make docs` was attempted but blocked before MDX validation because
`npx` received HTTP 403 fetching `fern-api` from npm.

---
Signed-off-by: Miyoung Choi <miyoungc@nvidia.com>

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
* Released v0.0.46: improved Windows setup, WhatsApp messaging support,
Hermes sandbox/tool routing, Anthropic endpoint compatibility, Ollama
proxy routing, model-router fallback, OpenClaw plugin/backup
compatibility, sandbox build tooling fixes, and updated uninstall flag
behavior.

* **Documentation**
* Removed WeChat from messaging flows and presets across guides and CLI
docs; clarified onboarding and channel setup for WhatsApp. Clarified
runtime mutability and filesystem (Landlock) behavior — some changes
require sandbox rebuilds; prefer host-side commands for durable config.

<!-- review_stack_entry_start -->

[![Review Change
Stack](https://storage.googleapis.com/coderabbit_public_assets/review-stack-in-coderabbit-ui.svg)](https://app.coderabbit.ai/change-stack/NVIDIA/NemoClaw/pull/3911?utm_source=github_walkthrough&utm_medium=github&utm_campaign=change_stack)

<!-- review_stack_entry_end -->
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement: integration PRs or issues proposing integration of a third-party product or service into NemoClaw. Integration: Hermes Sandbox Use this label to identify issues related to the NemoClaw isolated environment based on OpenShell. status: rfr Ready for review — no conflicts, awaiting maintainer review v0.0.46 Release target

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants