Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
72 changes: 72 additions & 0 deletions docs/reference/nemoclaw-openshell-integration.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
# NemoClaw OpenShell Integration

Comment on lines +1 to +2

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Add required docs frontmatter and SPDX header placement.

This new docs page is missing required frontmatter fields, and the SPDX markdown header is also missing.

Proposed structure
+---
+title:
+  page: NemoClaw OpenShell Integration
+description: <add description>
+keywords: [<add keywords>]
+topics: [<add topics>]
+tags: [<add tags>]
+content_type: reference
+difficulty: <add difficulty>
+audience: <add audience>
+status: <add status>
+---
+
+<!-- SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -->
+<!-- SPDX-License-Identifier: Apache-2.0 -->
+
 # NemoClaw OpenShell Integration

As per coding guidelines, “SPDX license header is present after frontmatter” and frontmatter must include “title, description, keywords, topics, tags, content type, difficulty, audience, and status fields.”

📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
# NemoClaw OpenShell Integration
---
title:
page: NemoClaw OpenShell Integration
description: <add description>
keywords: [<add keywords>]
topics: [<add topics>]
tags: [<add tags>]
content_type: reference
difficulty: <add difficulty>
audience: <add audience>
status: <add status>
---
<!-- SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -->
<!-- SPDX-License-Identifier: Apache-2.0 -->
# NemoClaw OpenShell Integration
🤖 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/nemoclaw-openshell-integration.md` around lines 1 - 2, The new
docs page "NemoClaw OpenShell Integration" is missing required frontmatter and
the SPDX header; add YAML frontmatter at the top containing title, description,
keywords, topics, tags, content type, difficulty, audience, and status fields,
then place the SPDX license header immediately after that frontmatter block (as
specified by the guidelines) so the file begins with a YAML frontmatter block
followed by the SPDX markdown header.

```mermaid
flowchart LR
user["User"] --> agent["Agent runtime"]
agent --> adapter["NemoClaw agent adapter"]

subgraph adapters["Current adapters"]
openclaw["OpenClaw plugin"]
hermes["Hermes plugin"]
end

subgraph plugin_tools["NemoClaw access tools"]
list["list_resource_access_presets"]
request["request_resource_access"]
check["check_resource_access"]
end

adapter --> adapters
adapters --> plugin_tools
onboard["nemoclaw onboard"] --> profile_import["Import NemoClaw provider profiles"]
profile_import --> profiles["OpenShell provider profiles"]
list --> profiles
profiles --> presets["Provider-backed access presets"]
presets --> request

request --> policy_local["policy.local HTTP API"]
check --> policy_local

subgraph sandbox["OpenShell sandbox"]
policy_local
proxy["Sandbox HTTP proxy"]
policy_runtime["Sandbox policy runtime"]
end

policy_local --> proposals["OpenShell policy proposals"]
proposals --> review["Operator review"]
review --> approve["Approve or reject"]
approve --> merge["Policy merge and reload"]
merge --> policy_runtime
policy_runtime --> check

agent --> workload["Requested agent work"]
workload --> proxy
proxy --> policy_runtime
policy_runtime --> external["Approved external resources"]
```

## Flow

1. The agent asks NemoClaw for allowed resource presets with `list_resource_access_presets`.
2. During onboarding, NemoClaw imports its provider profiles into OpenShell for package registries, messaging platforms, Brave Search, Jira, Hugging Face, and local inference.
3. NemoClaw builds the agent-visible preset list from OpenShell provider profiles, with built-in presets as fallback coverage for older OpenShell versions.
4. The agent calls `request_resource_access` with a preset, access mode, reason, and optional wait timeout.
5. NemoClaw submits a least-privilege proposal to `policy.local`.
6. OpenShell surfaces the proposal for operator review.
7. After approval, OpenShell merges and reloads the sandbox policy.
8. The agent calls `check_resource_access`; NemoClaw reports `applied` only after OpenShell reports the policy reload is complete.

## Agent Tools

- `list_resource_access_presets`: discovers provider-backed preset ids.
- `request_resource_access`: submits a network access proposal through OpenShell.
- `check_resource_access`: polls an existing proposal until it is pending, denied, failed, or applied.

## Adapter Contract

Each agent adapter exposes the same tool names and response shape through the harness-native mechanism. OpenClaw uses its plugin API. Hermes uses its Python plugin API. Additional harnesses can implement the same contract without changing the OpenShell policy proposal flow.

## Provider Profiles

NemoClaw imports OpenShell provider profiles for its policy presets during onboarding. Existing OpenShell profiles are left untouched, and already-imported NemoClaw profiles are skipped so repeated onboarding remains idempotent. If the OpenShell gateway does not support provider-profile import, NemoClaw continues with local fallback presets.
19 changes: 19 additions & 0 deletions nemoclaw-blueprint/provider-profiles/brave.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0

id: brave
display_name: Brave Search
description: Brave Search API access
category: knowledge
endpoints:
- host: api.search.brave.com
port: 443
protocol: rest
enforcement: enforce
rules:
- allow: { method: GET, path: "/**" }
- allow: { method: POST, path: "/**" }
binaries:
- /usr/local/bin/node
- /usr/bin/node
- /usr/bin/curl
38 changes: 38 additions & 0 deletions nemoclaw-blueprint/provider-profiles/brew.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0

id: brew
display_name: Homebrew
description: Homebrew (Linuxbrew) package manager access
category: data
endpoints:
- host: formulae.brew.sh
port: 443
access: full
tls: skip
- host: github.com
port: 443
access: full
tls: skip
- host: ghcr.io
port: 443
access: full
tls: skip
- host: pkg-containers.githubusercontent.com
port: 443
access: full
tls: skip
- host: objects.githubusercontent.com
port: 443
access: full
tls: skip
- host: raw.githubusercontent.com
port: 443
access: full
tls: skip
binaries:
- /usr/bin/curl
- /usr/bin/git
- /home/linuxbrew/.linuxbrew/bin/brew
- /home/linuxbrew/.linuxbrew/bin/*
- /home/linuxbrew/.linuxbrew/Homebrew/bin/*
42 changes: 42 additions & 0 deletions nemoclaw-blueprint/provider-profiles/discord.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0

id: discord
display_name: Discord
description: Discord API, gateway, and CDN access
category: messaging
endpoints:
- host: discord.com
port: 443
protocol: rest
enforcement: enforce
rules:
- allow: { method: GET, path: "/**" }
- allow: { method: POST, path: "/**" }
- allow: { method: PUT, path: "/**" }
- allow: { method: PATCH, path: "/**" }
- allow: { method: DELETE, path: "/api/v*/channels/*/messages/*" }
- allow: { method: DELETE, path: "/api/v*/channels/*/messages/*/reactions/*/*" }
- host: gateway.discord.gg
port: 443
protocol: websocket
enforcement: enforce
websocket_credential_rewrite: true
rules:
- allow: { method: GET, path: "/**" }
- allow: { method: WEBSOCKET_TEXT, path: "/**" }
- host: cdn.discordapp.com
port: 443
protocol: rest
enforcement: enforce
rules:
- allow: { method: GET, path: "/**" }
- host: media.discordapp.net
port: 443
protocol: rest
enforcement: enforce
rules:
- allow: { method: GET, path: "/**" }
binaries:
- /usr/local/bin/node
- /usr/bin/node
30 changes: 30 additions & 0 deletions nemoclaw-blueprint/provider-profiles/huggingface.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0

id: huggingface
display_name: Hugging Face
description: Hugging Face Hub, LFS, and Inference API access
category: knowledge
endpoints:
- host: huggingface.co
port: 443
protocol: rest
enforcement: enforce
rules:
- allow: { method: GET, path: "/**" }
- host: cdn-lfs.huggingface.co
port: 443
protocol: rest
enforcement: enforce
rules:
- allow: { method: GET, path: "/**" }
- host: router.huggingface.co
port: 443
protocol: rest
enforcement: enforce
rules:
- allow: { method: GET, path: "/**" }
- allow: { method: POST, path: "/**" }
binaries:
- /usr/local/bin/python3
- /usr/local/bin/node
31 changes: 31 additions & 0 deletions nemoclaw-blueprint/provider-profiles/jira.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0

id: jira
display_name: Jira
description: Jira and Atlassian Cloud access
category: data
endpoints:
- host: "*.atlassian.net"
port: 443
protocol: rest
enforcement: enforce
rules:
- allow: { method: GET, path: "/**" }
- allow: { method: POST, path: "/**" }
- host: auth.atlassian.com
port: 443
protocol: rest
enforcement: enforce
rules:
- allow: { method: GET, path: "/**" }
- allow: { method: POST, path: "/**" }
- host: api.atlassian.com
port: 443
protocol: rest
enforcement: enforce
rules:
- allow: { method: GET, path: "/**" }
- allow: { method: POST, path: "/**" }
binaries:
- /usr/local/bin/node
47 changes: 47 additions & 0 deletions nemoclaw-blueprint/provider-profiles/local-inference.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0

id: local-inference
display_name: Local Inference
description: Local inference access (Ollama, vLLM) via host gateway
category: inference
endpoints:
- host: host.openshell.internal
port: 11434
protocol: rest
enforcement: enforce
allowed_ips:
- 10.0.0.0/8
- 172.16.0.0/12
- 192.168.0.0/16
rules:
- allow: { method: GET, path: "/**" }
- allow: { method: POST, path: "/**" }
- host: host.openshell.internal
port: 11435
protocol: rest
enforcement: enforce
allowed_ips:
- 10.0.0.0/8
- 172.16.0.0/12
- 192.168.0.0/16
rules:
- allow: { method: GET, path: "/**" }
- allow: { method: POST, path: "/**" }
- host: host.openshell.internal
port: 8000
protocol: rest
enforcement: enforce
allowed_ips:
- 10.0.0.0/8
- 172.16.0.0/12
- 192.168.0.0/16
rules:
- allow: { method: GET, path: "/**" }
- allow: { method: POST, path: "/**" }
binaries:
- /usr/local/bin/openclaw
- /usr/local/bin/node
- /usr/bin/node
- /usr/bin/curl
- /usr/bin/python3
23 changes: 23 additions & 0 deletions nemoclaw-blueprint/provider-profiles/npm.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0

id: npm
display_name: npm
description: npm and Yarn registry access
category: data
endpoints:
- host: registry.npmjs.org
port: 443
access: full
tls: skip
- host: registry.yarnpkg.com
port: 443
access: full
tls: skip
binaries:
- /usr/local/bin/npm*
- /usr/local/bin/npx*
- /usr/local/bin/node*
- /usr/local/bin/yarn*
- /usr/bin/npm*
- /usr/bin/node*
31 changes: 31 additions & 0 deletions nemoclaw-blueprint/provider-profiles/pypi.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0

id: pypi
display_name: PyPI
description: Python Package Index (PyPI) access
category: data
endpoints:
- host: pypi.org
port: 443
protocol: rest
enforcement: enforce
rules:
- allow: { method: GET, path: "/**" }
- allow: { method: HEAD, path: "/**" }
- host: files.pythonhosted.org
port: 443
protocol: rest
enforcement: enforce
rules:
- allow: { method: GET, path: "/**" }
- allow: { method: HEAD, path: "/**" }
binaries:
- /usr/bin/python3*
- /usr/bin/pip*
- /usr/local/bin/python3*
- /usr/local/bin/pip*
- /sandbox/.venv/bin/python*
- /sandbox/.venv/bin/pip*
- /sandbox/.uv/python/**/python*
- /sandbox/.local/bin/pip*
51 changes: 51 additions & 0 deletions nemoclaw-blueprint/provider-profiles/slack.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0

id: slack
display_name: Slack
description: Slack API, Socket Mode, and webhooks access
category: messaging
endpoints:
- host: slack.com
port: 443
protocol: rest
enforcement: enforce
request_body_credential_rewrite: true
rules:
- allow: { method: GET, path: "/**" }
- allow: { method: POST, path: "/**" }
- host: api.slack.com
port: 443
protocol: rest
enforcement: enforce
request_body_credential_rewrite: true
rules:
- allow: { method: GET, path: "/**" }
- allow: { method: POST, path: "/**" }
- host: hooks.slack.com
port: 443
protocol: rest
enforcement: enforce
request_body_credential_rewrite: true
rules:
- allow: { method: GET, path: "/**" }
- allow: { method: POST, path: "/**" }
- host: wss-primary.slack.com
port: 443
protocol: websocket
enforcement: enforce
websocket_credential_rewrite: true
rules:
- allow: { method: GET, path: "/**" }
- allow: { method: WEBSOCKET_TEXT, path: "/**" }
- host: wss-backup.slack.com
port: 443
protocol: websocket
enforcement: enforce
websocket_credential_rewrite: true
rules:
- allow: { method: GET, path: "/**" }
- allow: { method: WEBSOCKET_TEXT, path: "/**" }
binaries:
- /usr/local/bin/node
- /usr/bin/node
Loading
Loading