Commit Graph
211 Commits
Author SHA1 Message Date
Piotr Mlocek 09705669c9 fix(cli): add gateway selector headers 2026-03-11 15:21:46 -07:00
Piotr Mlocek d8e8941cf9 fix(cli): reduce gateway selector output noise 2026-03-11 15:13:06 -07:00
Piotr Mlocek 39fe170a55 fix(cli): include gateway names in selector 2026-03-11 15:06:14 -07:00
Piotr Mlocek 1022a7b64a fix(cli): show gateway details in selector 2026-03-11 15:04:05 -07:00
Piotr Mlocek f99bf485e8 docs(cli): align completion help headings 2026-03-11 14:58:10 -07:00
Piotr Mlocek 96befce1d3 fix(cli): normalize completion command names 2026-03-11 14:54:31 -07:00
Piotr Mlocek def7aa63ec fix(cli): document root help and completion visibility 2026-03-11 14:30:37 -07:00
Piotr Mlocek e9d2dbad6b fix(cli): improve completion coverage and gateway selection
Closes #232

Add typed completion metadata for gateway, sandbox, and path arguments, make gateway selection interactive on TTYs, and expose root subcommands in completions while keeping non-interactive behavior stable.
2026-03-11 14:11:13 -07:00
John T. Myers 1ad45b4af0 fix(policy): enforce run_as_user/run_as_group must be 'sandbox' (#230)
Replace the clear_process_identity + maybe_infer_sandbox_user workaround
with strict enforcement: run_as_user and run_as_group must always be
'sandbox'. If omitted from YAML, they are defaulted server-side via
ensure_sandbox_process_identity(). Any other value is rejected.

This fixes 'policy set' failing with 'process policy cannot be changed
on a live sandbox' for custom-image sandboxes, where the CLI was
clearing identity fields but the YAML had 'sandbox' explicitly set.

- Remove clear_process_identity() from CLI and TUI
- Add ensure_sandbox_process_identity() to default missing fields
- Rename RootProcessIdentity -> InvalidProcessIdentity
- Replace maybe_infer_sandbox_user with validate_sandbox_user (fail-fast)
- Update OPA test policies to use run_as_user: sandbox
2026-03-11 12:46:59 -07:00
Kirit Thadaka 71684e0598 Update tutorial prereqs (#235) 2026-03-11 11:43:13 -07:00
Drew Newberry 1d33d4c2a7 fix(cluster): skip DNS probe for IP-literal registry hosts (#229) 2026-03-11 09:20:56 -07:00
Drew Newberry 53b3cb76a2 feat(cli): detect port conflicts before gateway start, add sandbox delete --all, and improve spinner spacing (#225) 2026-03-11 01:06:23 -07:00
Drew Newberry 9099014115 fix(cli): improve sandbox provisioning progress indicator (#221) 2026-03-10 23:34:04 -07:00
Kirit Thadaka 47c4dad0d9 Updated tutorial name (#224) 2026-03-10 23:10:32 -07:00
Kirit Thadaka 564c6a9cc7 docs: Updated tutorial (#223)
* Updated tutorial

* Updated tutorial formatting
2026-03-10 22:50:21 -07:00
Drew Newberry 756950140c refactor(python): rename navigator module to openshell and migrate config to gateway paths (#220) 2026-03-10 22:24:04 -07:00
Drew Newberry 36e8241293 fix: switch community sandbox registry to GHCR and align TLS paths (#218) 2026-03-10 19:38:22 -07:00
Piotr Mlocek 63a07bf167 feat(cli): group help flags and make help for commands consistent with groups (#216) 2026-03-10 18:29:40 -07:00
Miyoung Choi bc25c9b6fe docs: add frontmatter, add json output and search extensions, for improving SEO (#217)
* add frontmatter

* add custom extensions
2026-03-10 18:04:25 -07:00
Miyoung Choi a666b895e5 docs: improve the new revision (#215)
* improve the new revision

* update the animated commands

* more improvements and unifying text

* more fixes
2026-03-10 17:40:17 -07:00
Drew Newberry f4af0ee848 chore: replace all nemoclaw references with openshell (#214)
- Update registry URLs from ghcr.io/nvidia/nemoclaw to ghcr.io/nvidia/openshell
- Rename NEMOCLAW_* environment variables to OPENSHELL_*
- Update CLI command references in documentation
- Update PyPI package name references
- Update GitHub repository URLs
- Rename .agents/skills/nemoclaw-cli directory to openshell-cli
2026-03-10 16:10:57 -07:00
John T. MyersandJohn Myers e373f7c056 feat(inference): add sandbox-system inference route for platform-level inference (#209)
* feat(inference): add sandbox-system inference route for platform-level inference

Add a separate system-level inference route that the sandbox supervisor
can use in-process for platform functions (e.g., embedded agent harness
for policy analysis), distinct from the user-facing inference.local
endpoint. The system route is accessed via an in-process API on the
supervisor, ensuring userland code in the sandbox netns cannot reach it.

- Extend proto with route_name fields on Set/Get inference messages
- Add ResolvedRoute.name field to the router for route segregation
- Server resolves both user and sandbox-system routes in bundles
- Sandbox partitions routes into user/system caches on refresh
- Expose InferenceContext::system_inference() in-process API
- CLI --sandbox flag targets the system route on set/get/update
- Integration tests using mock:// routes for the full in-process path

Closes #207

* refactor(cli): rename --sandbox flag to --system for inference commands

The --sandbox flag could be misread as targeting a user-level sandbox
operation. Rename to --system to clearly indicate it configures the
platform-level system inference route.

* style(cli): collapse short if-else per rustfmt 1.94

---------

Co-authored-by: John Myers <johntmyers@users.noreply.github.com>
2026-03-10 15:30:07 -07:00
Drew Newberry cd6bdd0cb8 fix(bootstrap): update hardcoded navigator namespace refs to openshell (#212)
The previous rename commit missed hardcoded namespace and workload
references in the bootstrap code. The Helm chart deploys to the
'openshell' namespace with 'openshell' workload names, but the
bootstrap code was still looking for 'navigator' namespace and
workloads, causing cluster startup to hang waiting for TLS secrets
that were never found.

Changes:
- lib.rs: Update secret fetch to use -n openshell
- runtime.rs: Rename functions and update all kubectl commands
  to reference openshell namespace and workloads
2026-03-10 15:18:55 -07:00
Drew Newberry d6c6e97679 chore: remove navigator references from codebase (#208) 2026-03-10 14:46:11 -07:00
John T. MyersandJohn Myers ddfe38b1c3 feat(tui): add OpenShell splash screen and rebrand title bar (#210)
* wip: feat(tui): OpenShell splash screen and branding

* chore(tui): fix rustfmt import ordering

---------

Co-authored-by: John Myers <johntmyers@users.noreply.github.com>
2026-03-10 14:36:27 -07:00
Kirit ThadakaandPiotr Mlocek e57c247bc8 docs: Structural and content updates (#195)
* Removed network access docs

* Simplified docs for sandboxes and inference

* Fixed build

* docs(inference): clarify local inference routing

* docs(inference): update provider and model examples

* docs: add Docker prerequisite warning for connection-refused error

Made-with: Cursor

* Minor edits to quickstart safety and privacy

* Doc restructured

* removed tutorials

* Added tutorial

* Inference section reformatting

* Updated CLI ref

* removed troubleshooting

* Updated inference

* Updated pip install command for bug bash

* Updated arch diagram

* Updated tutorial

* Updated install commands

* Updated getting started

* Updated brev link

---------

Co-authored-by: Piotr Mlocek <pmlocek@nvidia.com>
2026-03-10 12:15:02 -07:00
Drew Newberry 984d1a6e5c chore: rename project from NemoClaw to OpenShell (#198) 2026-03-10 11:49:09 -07:00
John T. MyersandJohn Myers a3af9af2fe fix(server): merge provider credentials/config on update instead of replacing (#202)
UpdateProvider RPC was doing full replacement of credentials and config
maps, silently destroying data on partial updates. This changes the
semantics so empty maps preserve existing values, non-empty maps merge
(upsert), and empty-string values delete individual keys. Also makes
provider type immutable after creation and adds field validation on
update.

Closes #199

Co-authored-by: John Myers <johntmyers@users.noreply.github.com>
2026-03-10 08:42:55 -07:00
Drew Newberry 01fe62c459 feat: CLI improvements and fixes (#201)
* feat(cli): reorganize help output like gh CLI

- Add custom help template with grouped command sections (SANDBOX, GATEWAY, ADDITIONAL)
- Add bold headers using ANSI escape codes
- Add USAGE section showing command/subcommand pattern
- Add consistent help template for subcommands with COMMANDS section
- Add examples for all subcommands (sandbox, gateway, forward, logs, policy, provider, inference)
- Show help when running a command without a subcommand
- Add ALIAS section to subcommand help for aliased commands
- Remove less useful aliases (prov, inf, st, t, comp), keep core ones (sb, gw, lg, fwd, pol)
- Add RequestingCompute provisioning step with elapsed time display

* fix(server): replay platform events for late WatchSandbox subscribers

The CLI was stuck on 'Requesting compute...' even when the pod was
already pulling the container image. This happened because Kubernetes
events (Scheduled, Pulling, etc.) that fired before the CLI subscribed
to WatchSandbox were lost.

Add a tail buffer to PlatformEventBus (mirroring TracingLogBus) so
platform events are buffered and replayed to late subscribers. This
ensures the CLI shows accurate provisioning status regardless of when
it connects.
2026-03-10 07:58:29 -07:00
John T. MyersandJohn Myers bffda60e92 feat(tui): auto-refresh sandbox policy view when new versions are detected (#200)
Closes #196

Piggyback on the existing 2-second sandbox list refresh to detect policy
version changes. When the user is on the sandbox screen and the listed
current_policy_version differs from the displayed version, fetch the
updated policy via GetSandboxPolicy. Scroll position is preserved across
auto-refreshes so the user is not disrupted.

Co-authored-by: John Myers <johntmyers@users.noreply.github.com>
2026-03-10 00:02:32 -07:00
Drew Newberry 1cf54ca055 feat(bootstrap): switch container registry from CloudFront CDN to GHCR with token auth (#167) 2026-03-09 23:46:23 -07:00
Miyoung Choi 066c2f80fe ci(docs): finish setting up PR doc preview workflow (#160) 2026-03-09 22:58:27 -07:00
Drew Newberry c355ad3696 fix(docker): remove unsupported npm dedupe -g command (#194)
npm 11 does not support `npm dedupe -g` in global mode, causing the
sandbox container build to fail with error code EDEDUPEGLOBAL.

The dedupe was intended to remove nested copies of vulnerable
dependencies, but npm 11 already handles global package installation
differently. The force-upgrade of tar and @hono/node-server already
ensures the patched versions are installed.
2026-03-09 22:12:34 -07:00
John T. MyersandJohn Myers c5b4ed4506 fix(tui): use correct ssh-proxy CLI args in shell connect and exec (#193)
The ProxyCommand in handle_shell_connect and handle_exec_command was
using --gateway for the URL, but after the #175 rename --gateway means
cluster name and --gateway-endpoint is the URL flag. The ssh-proxy
subprocess could not match token mode (no --gateway-endpoint) or name
mode (no --name), so it exited immediately — causing a screen flash
and eventual terminal corruption from rapid suspend/resume cycles.

Use --gateway-endpoint for the URL and --gateway for the cluster name,
matching the format already used by start_port_forwards and the CLI.

Fixes #188

Co-authored-by: John Myers <johntmyers@users.noreply.github.com>
2026-03-09 21:57:29 -07:00
Drew Newberry a83109c359 fix(containers): remediate high-severity container vulnerabilities and remove openclaw (#191) 2026-03-09 21:39:14 -07:00
Piotr MlocekandMiyoung Choi 107c85d1d7 docs(inference): clarify local inference routing (#190)
* docs(inference): clarify local inference routing

* docs(inference): update provider and model examples

* fix doc build

---------

Co-authored-by: Miyoung Choi <miyoungc@nvidia.com>
2026-03-09 21:34:14 -07:00
Miyoung Choi 95410a065f docs: restructure and polish safety and policy section (#189)
* restructure safty and policy section

* put the table autogeneration back

* enhance generate policy ref doc

* typo
2026-03-09 21:26:35 -07:00
Piotr Mlocek 74ed3aff7c fix(sandbox): improve inference route refresh with conditional fetch and configurable interval (#185) 2026-03-09 19:16:46 -07:00
Drew Newberry a2de1f24e5 feat: add Cloudflare tunnel auth support (#178) 2026-03-09 18:39:42 -07:00
Kirit Thadaka f8d2d824ce docs: Simplified the sandbox docs (#186)
* Removed network access docs

* Simplified docs for sandboxes and inference

* Fixed build
2026-03-09 16:52:30 -07:00
Drew Newberry 1e4faf7b7a feat(cli): auto-create providers for explicit --provider names that match a known type (#183)
When --provider <name> is passed and no provider with that name exists on
the server, the CLI now checks if the name is a recognized provider type
(e.g. claude, nvidia, github). If it is, the provider is auto-created
from local credentials using the same discovery flow as inferred providers.

If the name is not a recognized type, the CLI returns a clear error
instead of deferring validation to the server.

This eliminates the FailedPrecondition error that occurred when passing
--provider nvidia on a fresh cluster where no providers had been created
yet.
2026-03-09 14:36:01 -07:00
Piotr Mlocek 2a3bc18174 fix(sandbox): treat IPv6 ULA addresses as internal (#173) 2026-03-09 13:38:40 -07:00
John T. MyersandJohn Myers 3d0c4d17e1 fix(security): add SSH session token expiry, connection limits, and lifecycle cleanup (#182)
* fix(security): add SSH session token expiry, connection limits, and lifecycle cleanup

Closes #22

SSH session tokens previously had no TTL and remained valid indefinitely.
This adds configurable token expiry (default 24h), per-token (10) and
per-sandbox (20) concurrent connection limits, session cleanup on sandbox
deletion, and a background reaper for expired/revoked sessions.

* fix(security): lower per-token concurrent connection limit from 10 to 3

---------

Co-authored-by: John Myers <johntmyers@users.noreply.github.com>
2026-03-09 11:39:23 -07:00
Miyoung Choi 574ef18dfc docs: consolidate information architecture and author content (#124)
* initial doc filling

* improvements

* stage provided get started, and add clean tutorials

* pull in Kirit's content and polish

* improve observability

* moving pieces

* move TOC around

* drop support matrix from concepts

* fix links

* minor fixes and fix badges

* minor fixes

* incorporate missed content

* minor improvements

* clean up

* run dori style guide review

* clean up

* updates impacting docs

* incorporate feedback

* minor fix

* some edits

* enterprise structure

* update cards

* improve

* add some emojis

* improve landing page with animated getting started code

* fix the animated code

* small improvements

* refresh content based on PR 156 and 158

* README as the source of truth for quickstart

* update README

* run edits

* change to the new prod name, text only, code swipe later

* add Home

* incorporate dev feedback on README

* krit's edits

* edit and improve index pages

* fix build

* revert README

* revert quickstart to not pull from README
2026-03-09 11:33:56 -07:00
Drew Newberry ed53c35d2b feat(cli): improve sandbox provisioning status messages and UX (#175) 2026-03-08 16:36:50 -07:00
Drew Newberry ffeaf0dd59 fix(sandbox): fix create ordering race, dual-registry credentials, and policy identity clearing (#176) 2026-03-08 15:57:00 -07:00
Drew Newberry ba78e278a8 feat(cli): switch community sandbox registry to CloudFront CDN (#170) 2026-03-07 19:52:27 -08:00
Piotr Mlocek 5177acca36 fix(cli): scope git-aware sandbox uploads to requested path (#171) 2026-03-07 19:08:30 -08:00
Piotr Mlocek ec89fec74d fix(ci): use docker-safe publish image tags (#169) 2026-03-07 06:03:21 -08:00
John T. MyersandJohn Myers b8d873f68f feat(proxy): support plain HTTP forward proxy for private IP endpoints (#158)
* feat(proxy): support plain HTTP forward proxy for private IP endpoints

Add forward proxy mode to the sandbox proxy so that standard HTTP
libraries (httpx, requests, etc.) work with HTTP_PROXY for plain HTTP
calls to private IP endpoints. Previously, non-CONNECT methods were
unconditionally rejected with 403.

The forward proxy path requires all three conditions to be met:
- OPA policy explicitly allows the destination
- The matched endpoint has allowed_ips configured
- All resolved IPs are RFC 1918 private

This ensures plain HTTP never reaches the public internet while enabling
seamless access to internal services without custom CONNECT tunnel code.

Implementation:
- parse_proxy_uri(): parses absolute-form URIs into components
- rewrite_forward_request(): rewrites to origin-form, strips hop-by-hop
  headers, adds Via and Connection: close
- handle_forward_proxy(): full handler with OPA eval, SSRF checks,
  private-IP gate, upstream connect, and bidirectional relay
- Updated dispatch in handle_tcp_connection to route non-CONNECT methods

Includes 14 unit tests and 6 E2E tests (FWD-1 through FWD-6).
CONNECT path remains completely untouched.

Closes #155

* fix(proxy): remove InspectForInference match arm removed by #146

The inference routing simplification in #146 reduced NetworkAction to
Allow/Deny, removing InspectForInference. Drop the dead match arm from
handle_forward_proxy.

* fix(sandbox): restore BestEffort as default Landlock compatibility

The Landlock V2 upgrade in #151 changed the default from BestEffort to
HardRequirement. This causes all proxy-mode sandboxes to crash with
Permission denied when the policy omits the landlock field, because the
child process gets locked to only /etc/navigator-tls and /sandbox.

Restore BestEffort as the default so policies without an explicit
landlock field degrade gracefully.

Fixes #161

* fix(sandbox): inject baseline filesystem paths for proxy-mode sandboxes

Proxy-mode sandboxes need baseline filesystem paths (/usr, /lib, /etc,
/app, /var/log read-only; /sandbox, /tmp read-write) for the child
process to function under Landlock. Without these, the child can't exec
binaries, resolve DNS, or load shared libraries.

The supervisor now enriches the policy with these baseline paths at
startup, covering both standalone (file) and gateway (gRPC) modes. For
gateway mode, the enriched policy is synced back so users see the
effective policy via 'nemoclaw sandbox get'.

The gateway validation is relaxed to allow additive filesystem changes
(new paths can be added, existing paths cannot be removed) to support
the supervisor's enrichment sync-back.

Includes 2 E2E tests: BFS-1 (missing filesystem_policy) and BFS-2
(incomplete filesystem_policy).

Fixes #161

* fix(e2e): update assertion for relaxed filesystem validation message

---------

Co-authored-by: John Myers <johntmyers@users.noreply.github.com>
2026-03-06 19:31:46 -08:00