Skip to content

Commit 320ea31

Browse files
committed
chore: merge main into docs announcement branch
Signed-off-by: Piotr Mlocek <pmlocek@nvidia.com>
2 parents 26dd9c4 + 8b77925 commit 320ea31

158 files changed

Lines changed: 12906 additions & 3457 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.

‎.agents/skills/sync-agent-infra/SKILL.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ Use this map when product behavior, commands, or development workflows change. I
4545
| Sandbox policy schema, presets, or enforcement behavior | `generate-sandbox-policy`, `openshell-cli` |
4646
| Supervisor middleware policy, registrations, runtime, or failure behavior | `generate-sandbox-policy`, `openshell-cli`, `debug-openshell-cluster` |
4747
| Gateway deployment, Helm, runtime drivers, or health checks | `debug-openshell-cluster`, `helm-dev-environment` |
48-
| Inference providers, native model endpoints, or migration from `inference.local` | `debug-inference`, `openshell-cli`, `generate-sandbox-policy` |
48+
| Inference providers, native model endpoints, or migration from the retired managed endpoint | `debug-inference`, `openshell-cli`, `generate-sandbox-policy` |
4949
| TUI architecture, navigation, data fetching, or UX | `tui-development` |
5050
| Release artifacts or post-publish smoke coverage | `test-release-canary` |
5151
| GitHub Actions workflows, required checks, or CI diagnostics | `watch-github-actions`; also `test-release-canary` for release smoke coverage |

‎.agents/skills/tui-development/SKILL.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,7 @@ Phase 1: GetSandboxLogs → 500 initial lines → send via Event::LogLines
170170
Phase 2: WatchSandbox(follow_logs: true) → live tail → send via Event::LogLines
171171
```
172172

173-
**Sandboxes**: Fetched via `ListSandboxes` in a background collection-refresh task scheduled from the 2-second tick, scoped to the current workspace (or all workspaces). Follow `next_page_token` until empty so the dashboard reflects the complete collection.
173+
**Sandboxes**: Fetched via `ListSandboxes` in a background collection-refresh task scheduled from the 2-second tick, scoped to the current workspace (or all workspaces). Follow `next_page_token` until empty so the dashboard reflects the complete collection. The NOTES column summarizes active `ConfigurationInvalid` readiness conditions as `Invalid config` before port forwards and clears the note on refresh after repair. Full diagnostics remain available through `openshell sandbox get <name> -o json`. Timed-out provisioning attempts show `Provisioning timed out` with cleanup pending or compute reclaimed, preserving port forwards. The sandbox detail pane wraps the full configuration error in its Notes field.
174174

175175
**Providers**: Fetched via `ListProviders` in the background collection-refresh task. Provider profiles are fetched per-workspace via `ListProviderProfiles` and cached in a `ProviderProfileCache` keyed by `(workspace, profile_id)`. Follow each list RPC's `next_page_token` until empty.
176176

‎.claude/agent-memory/arch-doc-writer/MEMORY.md‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@
117117
- Proto message field `filesystem` maps to YAML key `filesystem_policy` (different names!)
118118
- IMPORTANT: Sandbox always runs in Proxy mode. NetworkMode::Block exists as enum variant but is NEVER set.
119119
- Both file mode and gRPC mode set NetworkMode::Proxy unconditionally (see load_policy() in lib.rs and TryFrom in policy.rs)
120-
- Reason: proxy always needed so inference.local is addressable + all egress evaluated by OPA
120+
- Reason: proxy always needed so all egress is evaluated by OPA
121121
- OPA two-action model: Allow, Deny (NetworkAction in opa.rs). InspectForInference was REMOVED.
122122
- Rego network_action rule: "allow" or "deny" only (no "inspect_for_inference")
123123
- Behavioral trigger: endpoint `protocol` field -> L7 inspection; absent -> L4 raw copy_bidirectional
@@ -152,9 +152,9 @@
152152
- Route sources: `--inference-routes` YAML file (standalone) > cluster bundle via gRPC; empty routes gracefully disable
153153
- Cluster bundle refreshed every ROUTE_REFRESH_INTERVAL_SECS (30s)
154154
- Patterns: POST /v1/chat/completions, /v1/completions, /v1/responses, /v1/messages; GET /v1/models, /v1/models/*
155-
- inference.local CONNECT intercepted BEFORE OPA evaluation in proxy
155+
- Managed inference CONNECT traffic was intercepted before OPA evaluation in the proxy
156156
- InferenceProviderProfile in openshell-core/src/inference.rs: centralized provider metadata
157-
- proxy.rs: ONLY CONNECT to inference.local is handled; non-CONNECT requests get 403 for ALL hosts
157+
- proxy.rs: only managed inference CONNECT traffic was handled; non-CONNECT requests received 403 for all hosts
158158
- Buffer: INITIAL_INFERENCE_BUF=64KiB, MAX_INFERENCE_BUF=10MiB; grows by doubling
159159
- Dev sandbox: `mise run sandbox -e VAR_NAME` forwards host env vars; NVIDIA_API_KEY always passed
160160

‎.github/workflows/release-tag.yml‎

Lines changed: 55 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -407,7 +407,6 @@ jobs:
407407
cat openshell-supervisor-checksums-sha256.txt
408408
409409
- name: Generate Homebrew formula
410-
if: needs.compute-versions.outputs.is_prerelease != 'true'
411410
run: |
412411
set -euo pipefail
413412
python3 tasks/scripts/release.py generate-homebrew-formula \
@@ -493,12 +492,64 @@ jobs:
493492
release/openshell-supervisor-checksums-sha256.txt
494493
release/openshell-prover-checksums-sha256.txt
495494
496-
- name: Upload pre-release artifacts
495+
- name: Upload amd64 Debian prerelease package
497496
if: needs.compute-versions.outputs.is_prerelease == 'true'
498497
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
499498
with:
500-
name: openshell-${{ env.RELEASE_TAG }}
501-
path: release/
499+
name: openshell-${{ env.RELEASE_TAG }}-linux-amd64-deb
500+
path: |
501+
release/openshell_*_amd64.deb
502+
release/openshell-checksums-sha256.txt
503+
retention-days: 90
504+
if-no-files-found: error
505+
506+
- name: Upload arm64 Debian prerelease package
507+
if: needs.compute-versions.outputs.is_prerelease == 'true'
508+
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
509+
with:
510+
name: openshell-${{ env.RELEASE_TAG }}-linux-arm64-deb
511+
path: |
512+
release/openshell_*_arm64.deb
513+
release/openshell-checksums-sha256.txt
514+
retention-days: 90
515+
if-no-files-found: error
516+
517+
- name: Upload x86_64 RPM prerelease packages
518+
if: needs.compute-versions.outputs.is_prerelease == 'true'
519+
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
520+
with:
521+
name: openshell-${{ env.RELEASE_TAG }}-linux-x86_64-rpm
522+
path: |
523+
release/openshell-*.x86_64.rpm
524+
release/openshell-checksums-sha256.txt
525+
retention-days: 90
526+
if-no-files-found: error
527+
528+
- name: Upload aarch64 RPM prerelease packages
529+
if: needs.compute-versions.outputs.is_prerelease == 'true'
530+
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
531+
with:
532+
name: openshell-${{ env.RELEASE_TAG }}-linux-aarch64-rpm
533+
path: |
534+
release/openshell-*.aarch64.rpm
535+
release/openshell-checksums-sha256.txt
536+
retention-days: 90
537+
if-no-files-found: error
538+
539+
- name: Upload macOS prerelease packages
540+
if: needs.compute-versions.outputs.is_prerelease == 'true'
541+
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
542+
with:
543+
name: openshell-${{ env.RELEASE_TAG }}-macos-arm64
544+
path: |
545+
release/openshell-aarch64-apple-darwin.tar.gz
546+
release/openshell-gateway-aarch64-apple-darwin.tar.gz
547+
release/openshell-driver-vm-aarch64-apple-darwin.tar.gz
548+
release/openshell-prover-aarch64-apple-darwin.tar.gz
549+
release/openshell.rb
550+
release/openshell-checksums-sha256.txt
551+
release/openshell-gateway-checksums-sha256.txt
552+
release/openshell-prover-checksums-sha256.txt
502553
retention-days: 90
503554
if-no-files-found: error
504555

‎CONTRIBUTING.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ Public skills live in `skills/` and work without an OpenShell source checkout. I
8080
| --- | --- |
8181
| `openshell-cli` | CLI usage, sandbox lifecycle, provider management, and BYOC workflows |
8282
| `debug-openshell-cluster` | Diagnose gateway deployment and health issues |
83-
| `debug-inference` | Diagnose attached-provider inference, native endpoints, and migration from `inference.local` |
83+
| `debug-inference` | Diagnose attached-provider inference, native endpoints, and migration from the retired managed endpoint |
8484
| `generate-sandbox-policy` | Generate YAML sandbox policies from requirements or API documentation |
8585

8686
Public skills use `openshell --help` for installed command syntax and published OpenShell documentation for product concepts and configuration. They must not depend on repository-relative source or documentation files.

‎README.md‎

Lines changed: 84 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@
1414
[![Documentation](https://img.shields.io/badge/docs-latest-brightgreen)](https://docs.nvidia.com/openshell/latest/index.html)
1515
[![Project Status](https://img.shields.io/badge/status-alpha-orange)](https://docs.nvidia.com/openshell/latest/about/release-notes.html)
1616

17+
> [!IMPORTANT]
18+
> **OpenShell 0.1.0 is coming soon.** [Track progress in the 0.1.0 milestone](https://github.com/NVIDIA/OpenShell/milestone/10), [read the prerelease documentation](https://docs.nvidia.com/openshell/dev/index.html), or [install a prerelease](#prerelease-and-development-builds).
19+
1720
OpenShell is the safe, private runtime for autonomous AI agents. It provides sandboxed execution environments that protect your data, credentials, and infrastructure — governed by declarative YAML policies that prevent unauthorized file access, data exfiltration, and uncontrolled network activity.
1821

1922
OpenShell is built agent-first. It ships public agent skills for using and operating OpenShell, plus separate repository-aware workflows for contributors and maintainers.
@@ -27,21 +30,15 @@ OpenShell is built agent-first. It ships public agent skills for using and opera
2730

2831
### Install
2932

30-
**Binary (recommended):**
33+
**Local installation:**
3134

3235
```bash
3336
curl -LsSf https://raw.githubusercontent.com/NVIDIA/OpenShell/main/install.sh | sh
3437
```
3538

36-
The installer installs the latest stable release by default. To install a specific version, set `OPENSHELL_VERSION`. A [`dev` release](https://github.com/NVIDIA/OpenShell/releases/tag/dev) is also available that tracks the latest commit on `main`.
37-
38-
The `openshell` package on PyPI provides the Python SDK only. It does not install the `openshell` CLI. Add the SDK to a Python project with [uv](https://docs.astral.sh/uv/):
39-
40-
```bash
41-
uv add openshell
42-
```
39+
The installer installs the latest stable release by default. See [Prerelease and development builds](#prerelease-and-development-builds) to install an upcoming release or the latest commit on `main`.
4340

44-
**Helm chart:**
41+
**Kubernetes installation:**
4542

4643
> **Experimental** — the Kubernetes deployment path is under active development. Expect rough edges and breaking changes.
4744
@@ -104,6 +101,44 @@ See the [full walkthrough](examples/sandbox-policy-quickstart/) or run the autom
104101
bash examples/sandbox-policy-quickstart/demo.sh
105102
```
106103

104+
## SDKs
105+
106+
OpenShell provides client SDKs for Python, TypeScript, Go, and Rust. SDK packages connect applications to an OpenShell gateway; they do not install the `openshell` CLI. Use the SDK and gateway from the same OpenShell release when possible.
107+
108+
### Python
109+
110+
The [Python SDK](python/openshell/) is published to [PyPI](https://pypi.org/project/openshell/):
111+
112+
```shell
113+
uv add openshell
114+
```
115+
116+
### TypeScript
117+
118+
The [TypeScript SDK](sdk/typescript/README.md) is published to GitHub Packages as `@nvidia/openshell-sdk`. Configure the `@nvidia` npm scope for `https://npm.pkg.github.com`, authenticate with a token that has `read:packages`, and install it:
119+
120+
```shell
121+
npm install @nvidia/openshell-sdk
122+
```
123+
124+
### Go
125+
126+
Add the [Go SDK](sdk/go/README.md) to a Go module:
127+
128+
```shell
129+
go get github.com/NVIDIA/OpenShell/sdk/go@latest
130+
```
131+
132+
### Rust
133+
134+
The [Rust SDK](crates/openshell-sdk/README.md) is currently consumed from source. Pin the Git dependency to the same OpenShell release as the gateway:
135+
136+
```shell
137+
cargo add openshell-sdk \
138+
--git https://github.com/NVIDIA/OpenShell \
139+
--tag <release-tag>
140+
```
141+
107142
## How It Works
108143

109144
OpenShell isolates each sandbox in its own container with policy-enforced egress routing. A lightweight gateway coordinates sandbox lifecycle, and every outbound connection is intercepted by the policy engine, which does one of three things:
@@ -136,7 +171,9 @@ Policies are declarative YAML files. Static sections (filesystem, process) are l
136171

137172
## Providers
138173

139-
Agents need credentials — API keys, tokens, service accounts. OpenShell manages these as **providers**: named credential bundles that are injected into sandboxes at creation. The CLI auto-discovers credentials for recognized agents (Claude, Codex, OpenCode, Copilot) from your shell environment, or you can create providers explicitly with `openshell provider create`. Credentials never leak into the sandbox filesystem; they are injected as environment variables at runtime.
174+
Agents need credentials — API keys, tokens, service accounts. OpenShell manages these as **providers**: named credential bundles that are injected into sandboxes at creation. Credentials never leak into the sandbox filesystem; they are injected as environment variables at runtime.
175+
176+
A provider is created from a **provider profile**, which declares the credentials, endpoints, and client binaries the provider needs. Profiles are import-only: a gateway serves exactly the profiles you imported with `openshell provider profile import`, and ships none of its own. The [`providers/`](providers/) directory holds reviewable examples to copy and adapt. Once a profile is imported, the CLI can auto-discover credentials for its provider from your shell environment, or you can create providers explicitly with `openshell provider create`.
140177

141178
Inference access uses the same provider workflow. Attach an inference-capable provider to a sandbox, call the provider's native endpoint, and select the model in the client. Provider profiles contribute the endpoint policy and bind credential placeholders to the authorized destination.
142179

@@ -255,6 +292,43 @@ Agent implementation is human-directed: a user may request a phase directly, or
255292
- [Brev Launchable](https://brev.nvidia.com/launchable/deploy/now?launchableID=env-3Ap3tL55zq4a8kew1AuW0FpSLsg) — try OpenShell on cloud compute without local setup
256293
- [Agent Instructions](AGENTS.md) — system prompt and workflow documentation for agent contributors
257294

295+
## Prerelease and development builds
296+
297+
Use a prerelease candidate to evaluate an upcoming release, or use the rolling development build to test the latest commit on `main`. These builds may change before the next stable release. The matching documentation is published in the [development channel](https://docs.nvidia.com/openshell/dev/index.html).
298+
299+
Prerelease packages are retained as GitHub Actions artifacts for 90 days and require an authenticated [GitHub CLI](https://cli.github.com/) session. The `pre` alias installs the latest prerelease:
300+
301+
```shell
302+
gh auth login
303+
curl -LsSf https://raw.githubusercontent.com/NVIDIA/OpenShell/main/install.sh | \
304+
OPENSHELL_VERSION=pre sh
305+
```
306+
307+
The installer downloads only the artifact for the current platform and rejects expired candidates during discovery. Installed packages retain the candidate's exact version, such as `0.1.0-pre.3`. Prerelease tags do not create entries on the GitHub Releases page.
308+
309+
The rolling [`dev` release](https://github.com/NVIDIA/OpenShell/releases/tag/dev) does not require GitHub authentication:
310+
311+
```shell
312+
curl -LsSf https://raw.githubusercontent.com/NVIDIA/OpenShell/main/install.sh | \
313+
OPENSHELL_VERSION=dev sh
314+
```
315+
316+
For Kubernetes, select the corresponding Helm chart version. Helm chart versions omit the leading `v` from release tags:
317+
318+
```shell
319+
# Pin an exact candidate
320+
helm upgrade --install openshell \
321+
oci://ghcr.io/nvidia/openshell/helm-chart \
322+
--version 0.1.0-pre.3
323+
324+
# Rolling development build
325+
helm upgrade --install openshell \
326+
oci://ghcr.io/nvidia/openshell/helm-chart \
327+
--version 0.0.0-dev
328+
```
329+
330+
Prerelease charts use exact `<version>-pre.N` versions. Development charts are also published as immutable `0.0.0-dev.<commit-sha>` versions when you need to pin a specific commit. See the [Helm chart documentation](deploy/helm/openshell/README.md#available-versions) for version and configuration details.
331+
258332
## Contributing
259333

260334
OpenShell is built agent-first. Issues should include a user story, problem statement, impact, and acceptance criteria. The impact should explain the consequences of the current behavior and why existing workarounds are insufficient. Feature requests also require a workflow-level proposed design and alternatives; bug reports add reproduction steps, environment details, and relevant logs. Once work is authorized through the project workflow or a direct request, contributors should use the skills in `.agents/skills/` to investigate the current code and behavior, implement the change, and verify it. If an issue contains earlier diagnostics, verify them rather than relying on them. See [CONTRIBUTING.md](CONTRIBUTING.md) for the full agent skills table, contribution workflow, and development setup.

‎architecture/compute-runtimes.md‎

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,15 @@ A driver stop operation does not complete while its backend still reports an
186186
in-progress stop. This prevents an immediate start from racing the previous
187187
run's delayed exit event and regressing the new run to `Error`.
188188

189+
The Kubernetes driver records stop as a durable two-phase transition. The
190+
`releasing` phase releases the sandbox's runtime-control relationship while the
191+
workload boundary remains reachable. The `suspending` phase then suspends the
192+
Agent Sandbox workload and cleans generation bootstrap material. The current
193+
dedicated-supervisor implementation releases control by deleting the supervisor
194+
Pod. Periodic reconciliation resumes either phase after a gateway restart. Pod
195+
deletion waits include the configured termination grace period plus Kubernetes
196+
API observation headroom.
197+
189198
Persisted `Stopping` and `Starting` rows are retried at startup. Stable
190199
`Stopped` rows remain stopped. Docker and Podman retain the stopped container
191200
and attached storage, Kubernetes retains the Sandbox CR and PVC while scaling

0 commit comments

Comments
 (0)