Skip to content

chore: sync main with NVIDIA/OpenShell upstream - #2

Merged
mattj-monad merged 51 commits into
mainfrom
sync/upstream-main-2026-08-21
Aug 22, 2026
Merged

chore: sync main with NVIDIA/OpenShell upstream#2
mattj-monad merged 51 commits into
mainfrom
sync/upstream-main-2026-08-21

Conversation

@mattj-monad

Copy link
Copy Markdown

Fast-forward sync of monad-inc main up to NVIDIA/OpenShell main (2f7fb65).

Our main was 51 commits behind upstream and 0 ahead (no divergence), so this carries only upstream commits — no Monad-specific changes are altered. Routed through a PR because the main ruleset blocks direct pushes (which is also why the GitHub 'Sync fork' button was failing).

Merge with a merge commit to keep upstream/main as a direct ancestor for clean future syncs.

krishicksand others added 30 commits August 14, 2026 15:50
Use the same compact persona, workflow, impact, reproduction, and
environment prompts for bug reports and feature requests. Keep logs
optional and specific to bug reports.
Remove filing-time agent diagnostics so maintainers can evaluate user needs
apart from investigation output, which becomes stale over time. Require
contributors to investigate current behavior after humans accept the work, and
treat state:accepted or roadmap placement as that signal.
Signed-off-by: Kris Hicks <khicks@nvidia.com>
Bumps [actions/checkout](https://github.com/actions/checkout) from 7.0.0 to 7.0.1.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](actions/checkout@v7...3d3c42e)
---
updated-dependencies:
- dependency-name: actions/checkout
dependency-version: 7.0.1
dependency-type: direct:production
update-type: version-update:semver-patch
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* feat(kubernetes): support corporate upstream proxy
Signed-off-by: loveRhythm1990 <qiuweimin@126.com>
* fix(kubernetes): reject proxy_auth_secret_key values Kubernetes cannot create
Gateway validation accepted proxy_auth_secret_key values that Kubernetes
rejects when creating the Secret (keys longer than 253 bytes, or the
reserved "."/".." names), turning an invalid deployment setting into
repeated sandbox Pod-provisioning failures instead of a startup error.
Reject them in validate_upstream_proxy_config so they fail closed at
gateway startup.
Signed-off-by: loveRhythm1990 <qiuweimin@126.com>
* docs(skill): add corporate upstream proxy checks to debug-openshell-cluster
Add a Kubernetes corporate upstream proxy troubleshooting section covering
rendered [openshell.drivers.kubernetes] configuration, credential Secret
volume events, supervisor arguments and mounts confined to the network-
supervising container, and proxy reachability.
Signed-off-by: loveRhythm1990 <qiuweimin@126.com>
---------
Signed-off-by: loveRhythm1990 <qiuweimin@126.com>
Bumps [astral-sh/setup-uv](https://github.com/astral-sh/setup-uv) from 9.0.0 to 10.0.0.
- [Release notes](https://github.com/astral-sh/setup-uv/releases)
- [Commits](astral-sh/setup-uv@c771a70...ae62891)
---
updated-dependencies:
- dependency-name: astral-sh/setup-uv
dependency-version: 10.0.0
dependency-type: direct:production
update-type: version-update:semver-major
...
Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
* fix(macos): restore Docker gateway callbacks
Signed-off-by: Drew Newberry <anewberry@nvidia.com>
* fix(gateway): reuse reachable primary callback listener
Signed-off-by: Drew Newberry <anewberry@nvidia.com>
---------
Signed-off-by: Drew Newberry <anewberry@nvidia.com>
* fix(security): authenticate extension services
Signed-off-by: Piotr Mlocek <pmlocek@nvidia.com>
* feat(extension-core): verify gateway JWTs
Signed-off-by: Piotr Mlocek <pmlocek@nvidia.com>
* refactor(extension-core): keep inbound verification external
This should become an extension SDK package.
Signed-off-by: Piotr Mlocek <pmlocek@nvidia.com>
* fix(security): harden the extension authentication contract
Follow-up hardening on the alpha extension authentication mechanism.
Claim contract:
- Extension tokens carry an explicit `typ` of `openshell-ext+jwt`. They
share a signing key with sandbox-to-gateway admission tokens and were
otherwise separated by audience alone, so a verifier that neglects to
check `aud` could accept a gateway credential. The header is a second,
independent discriminator.
- Publish OIDC-shaped discovery at `/.well-known/openid-configuration`
so a service configured with only the gateway URL can learn the exact
expected issuer and the JWKS location. It is shaped, not compliant:
`issuer` is the gateway identity, not the serving URL.
Audience agreement:
- `MiddlewareManifest` and `InterceptorManifest` gain `expected_audience`.
The audience is otherwise configured independently on each side of the
boundary, where a mismatch surfaces only as an opaque authentication
failure on every call. OpenShell now compares the two and fails at
startup. An empty field keeps the check off for existing services.
Compatibility:
- Add `allow_insecure_transport` per registration. Enabling gateway JWT
signing previously made any plaintext endpoint a hard startup failure,
including the endpoint form used in our own documentation. The opt-out
attaches no credential, is refused by the gateway if a supervisor asks
for one, and warns at every startup.
- Make the transport requirement kind-aware. A middleware endpoint must
be reachable from every sandbox supervisor, so only interceptors may
use a gateway-local Unix socket.
Credential lifecycle:
- Replace the process-global slot map with a supervisor-owned
`ExtensionCredentialStore` shared explicitly across the gateway
connections the supervisor opens, removing test-order coupling.
- Rotate only when a credential is missing or has passed four fifths of
its lifetime. Configuration polling ran every ten seconds against
fifteen-minute credentials, so each poll re-ran gateway effective-policy
resolution and re-minted the gateway token.
- Bound credential minting per sandbox, since each request resolves the
caller's effective policy.
Signed-off-by: Piotr Mlocek <pmlocek@nvidia.com>
* docs: record alpha extension authentication in RFC appendices
Restore the RFC 0009 and 0010 bodies to their accepted text and move
every extension-authentication update into appendices instead. An RFC
records a decision at a point in time; superseding detail belongs
alongside it rather than rewritten into it.
RFC 0009's appendix carries the shared contract: claims, authorization,
key distribution, the `allow_insecure_transport` replacement for the
body's `allow_insecure`, and residual risks. RFC 0010's records only
what differs for interceptors and links to it. The existing
protocol-extensions appendix, which parked the phase 2 transport
question, now points forward to what was built.
Also document the audience handshake, the discovery endpoint, the
`typ` requirement, and `jti` replay guidance in the extensibility and
gateway configuration pages, and correct the middleware transport
guidance: middleware endpoints must be reachable from sandbox
supervisors, so Unix sockets are not an option there.
Signed-off-by: Piotr Mlocek <pmlocek@nvidia.com>
* refactor(extension-core): abstract extension server trust
Signed-off-by: Piotr Mlocek <pmlocek@nvidia.com>
* docs(core): update middleware manifest example
Signed-off-by: Piotr Mlocek <pmlocek@nvidia.com>
* fix(extension-auth): preserve unsigned gateway compatibility
Signed-off-by: Piotr Mlocek <pmlocek@nvidia.com>
* fix(extension-auth): reject cross-domain token replay
Signed-off-by: Piotr Mlocek <pmlocek@nvidia.com>
---------
Signed-off-by: Piotr Mlocek <pmlocek@nvidia.com>
This is convenient when you want to run a local gateway pointed at a remote
compute driver so that the supervisor can reach across the network to the
gateway which is listening on 0.0.0.0.
Signed-off-by: Kris Hicks <khicks@nvidia.com>
…IDIA#2656)
* feat(k8s): add namespace-per-workspace support (RFC 0011 Phase 3)
Implement three workspace namespace modes for the Kubernetes compute
driver: shared (default, preserves current single-namespace behavior),
managed (auto-creates/deletes namespaces per workspace), and operator
(pre-provisioned namespaces with dynamic discovery via label selector
or drop-in allowlist file).
Key changes:
- WorkspaceMode enum and namespace resolution in driver config
- Managed namespace lifecycle with ServiceAccount and OpenShift SCC
annotation propagation
- Cluster-wide sandbox CR watchers for managed/operator modes
- NamespaceValidator (Exact/Prefix/Allowlist) for SA token auth
- Workspace-aware credential secret storage
- Helm ClusterRole for multi-namespace RBAC
- Gateway config, architecture, and reference docs
Signed-off-by: Derek Carr <decarr@redhat.com>
* test(k8s): add e2e tests for workspace namespace modes
Add end-to-end tests for managed and operator workspace modes
introduced in RFC 0011 Phase 3. The managed mode tests verify
namespace creation with correct labels, ServiceAccount provisioning,
sandbox CR placement, and namespace survival with remaining sandboxes.
The operator mode tests verify rejection of unlabeled and nonexistent
namespaces. The positive operator path (sandbox in labeled namespace)
is known to fail due to an RBAC gap and will be addressed separately.
Also fixes Helm 4 compatibility: move SPDX license headers inside
conditional guards in 8 chart templates to prevent empty comment-only
documents, and fix a trailing whitespace trimmer in clusterrole.yaml
that concatenated the license header with apiVersion.
Adds cleanup sweep in with-kube-gateway.sh to remove managed and
operator namespaces before Helm uninstall, and mise tasks for running
each mode independently.
Signed-off-by: Derek Carr <decarr@redhat.com>
* feat(k8s): add operator namespace label watcher
Spawn a background kube::runtime::watcher in the K8s driver that
watches namespaces matching the configured label selector and populates
the OperatorNamespaceAllowlist at runtime. The driver owns the
allowlist and exposes its Arc so the server can share the same set with
the SA token authenticator.
create_sandbox now gates pod creation on the allowlist in operator
mode — workspaces whose namespace is not yet labeled are rejected at
resource render time rather than silently proceeding. Workspace
lifecycle itself is unaffected; only sandbox (resource) creation is
gated.
Signed-off-by: Derek Carr <decarr@redhat.com>
* fix(k8s): harden operator mode and address review findings
Close the fail-open gap in operator mode when only
operator_namespace_file is configured: the allowlist is now created
unconditionally in operator mode (fail-closed from startup).
Implement the namespace file watcher using the notify crate, following
the TLS hot-reload pattern (parent-directory watch, 1s debounce,
ConfigMap symlink-swap safe). The file format is a JSON array of
namespace name strings.
Additional fixes from the 10-reviewer audit:
- Change allowlist rejection from InvalidArgument to FailedPrecondition
so callers know the request may succeed later once the namespace is
provisioned.
- NamespaceValidator::Allowlist now holds the OperatorNamespaceAllowlist
newtype instead of a raw Arc<RwLock<BTreeSet>>, eliminating silent
denial on RwLock poison.
- Verify LABEL_MANAGED_BY and LABEL_GATEWAY_ID ownership before
deleting a managed namespace.
- Replace fixed 5s sleep in operator e2e test with a 30s poll loop.
- Add Helm validation for workspaceMode values.
- Fix Helm README type column and description for operator fields.
- Add insert/remove methods to OperatorNamespaceAllowlist; label
watcher now uses them instead of reaching through shared().
- Reject configs with both operator_namespace_label and
operator_namespace_file set.
Signed-off-by: Derek Carr <decarr@redhat.com>
* feat(k8s): add workspace-level compute driver RPCs and harden RBAC
Decouple namespace lifecycle from sandbox lifecycle by adding
EnsureWorkspace/DeleteWorkspace RPCs to the ComputeDriver service.
Namespace creation now happens before credential storage and namespace
deletion happens on workspace delete, fixing credential storage in
managed workspace mode.
- Add EnsureWorkspace and DeleteWorkspace proto RPCs with
implementations across all compute drivers (K8s managed delegates to
ensure_namespace/delete_namespace_if_empty; others no-op)
- Wire ensure_workspace into provider create/update/refresh paths so
the namespace exists before the credential driver writes secrets
- Wire delete_workspace into workspace deletion for cleanup
- Remove delete_namespace_if_empty from sandbox deletion path
- Scope ClusterRole secrets access to non-shared workspace modes
- Add TODO for TLS cert hot-reload in sandbox gRPC client
- Harden e2e tests with control-plane sandbox resolution assertions
- Fix docker image save --platform flag for OCI index manifests
Signed-off-by: Derek Carr <decarr@redhat.com>
* fix(k8s): address re-review findings and add test coverage
- Use server-side apply for TLS secret sync (fixes second sandbox
creation failure when TLS is enabled)
- Scope gateway-ID label selector unconditionally across all workspace
modes (fixes operator reads/watches/deletes seeing foreign sandboxes)
- Validate operator allowlist in EnsureWorkspace and DeleteWorkspace
RPCs (prevents credential writes to namespaces outside the allowlist)
- Extend ClusterRole secrets patch+delete to all non-shared modes with
credential driver enabled (fixes operator credential storage RBAC)
- Validate namespace ownership on 409 conflict in ensure_namespace
(prevents adopting unowned namespaces in managed mode)
- Replace delete_namespace_if_empty with unconditional delete_namespace
letting Kubernetes cascade cleanup (fixes stuck terminating CRs)
- Strengthen NetworkPolicy TODO to cover both managed and operator modes
- Extract selector and ownership logic into testable free functions
- Add unit tests for gateway-ID selectors and namespace ownership
- Add Helm ClusterRole RBAC tests for operator credential driver
Signed-off-by: Derek Carr <decarr@redhat.com>
* ci(k8s): add workspace managed and operator mode e2e to CI
Wire the existing e2e:kubernetes:workspace-managed and
e2e:kubernetes:workspace-operator mise tasks into the branch-e2e
workflow so they run alongside the other core Kubernetes e2e suites.
Both are gated by run_core_e2e and included in the Core E2E result
gate.
Signed-off-by: Derek Carr <decarr@redhat.com>
* test(k8s): add e2e tests for workspace namespace modes
Add 7 new e2e tests covering workspace namespace lifecycle, TLS secret
copying, ownership conflict detection, DNS-1123 validation, operator
namespace preservation, and dynamic label watcher behavior. Fix async
sandbox deletion race condition in existing tests by polling sandbox
list instead of asserting immediately after delete.
Signed-off-by: Derek Carr <decarr@redhat.com>
* fix(k8s): grant secrets/patch unconditionally and backfill gateway-id labels
Address two review findings:
1. RBAC: server-side apply (PATCH) is used for TLS secret sync in
multi-namespace modes, but the ClusterRole only granted patch when
the kubernetes-secrets credential driver was enabled. Grant patch
unconditionally for non-shared modes since TLS sync always needs it;
keep delete gated on the credential driver.
2. Upgrade safety: the new gateway-id label selector would orphan
legacy Sandbox CRs that predate its introduction. Add a startup
backfill in shared mode that patches any managed Sandbox CR missing
the gateway-id label before the driver begins serving requests.
Signed-off-by: Derek Carr <decarr@redhat.com>
* fix(k8s): address workspace namespace review findings
Signed-off-by: Derek Carr <decarr@redhat.com>
* fix(k8s): address follow-up review findings
Signed-off-by: Derek Carr <decarr@redhat.com>
* fix(k8s): preserve workspace lookup after rebase
Signed-off-by: Derek Carr <decarr@redhat.com>
* fix(helm): allow managed secret creation
Signed-off-by: Derek Carr <decarr@redhat.com>
* fix(k8s): stop pods in workspace namespace
Signed-off-by: Derek Carr <decarr@redhat.com>
* test(k8s): scope pod deletion check to v1alpha1
Signed-off-by: Derek Carr <decarr@redhat.com>
* fix(k8s): address workspace namespace review findings
Signed-off-by: Derek Carr <decarr@redhat.com>
---------
Signed-off-by: Derek Carr <decarr@redhat.com>
* feat(middleware): inspect websocket text messages
Signed-off-by: Piotr Mlocek <pmlocek@nvidia.com>
* fix(middleware): address websocket review feedback
Signed-off-by: Piotr Mlocek <pmlocek@nvidia.com>
* fix(network): bound websocket message assembly
Signed-off-by: Piotr Mlocek <pmlocek@nvidia.com>
* fix(network): harden websocket upgrade lifecycle
Signed-off-by: Piotr Mlocek <pmlocek@nvidia.com>
* refactor(middleware): unify in-process and remote transports
Signed-off-by: Piotr Mlocek <pmlocek@nvidia.com>
* feat(middleware): support regex websocket redaction
Signed-off-by: Piotr Mlocek <pmlocek@nvidia.com>
* fix(middleware): bound persistent streaming sessions
Signed-off-by: Piotr Mlocek <pmlocek@nvidia.com>
* fix(middleware): accept websocket sequence gaps
Signed-off-by: Piotr Mlocek <pmlocek@nvidia.com>
* refactor(middleware): refine websocket introspection contract
Signed-off-by: Piotr Mlocek <pmlocek@nvidia.com>
* fix(middleware): clarify websocket preflight lifecycle
Signed-off-by: Piotr Mlocek <pmlocek@nvidia.com>
* fix(middleware): clarify websocket coverage semantics
Signed-off-by: Piotr Mlocek <pmlocek@nvidia.com>
* fix(network): type websocket frame failures
Signed-off-by: Piotr Mlocek <pmlocek@nvidia.com>
* fix(network): return 503 when middleware admission is exhausted
Signed-off-by: Piotr Mlocek <pmlocek@nvidia.com>
* fix(middleware): align streaming API contract
Signed-off-by: Piotr Mlocek <pmlocek@nvidia.com>
* fix(middleware): clarify WebSocket event result scope
Signed-off-by: Piotr Mlocek <pmlocek@nvidia.com>
* docs(rfc): simplify middleware revision history
Signed-off-by: Piotr Mlocek <pmlocek@nvidia.com>
* feat(examples): add WebSocket content guard support
Signed-off-by: Piotr Mlocek <pmlocek@nvidia.com>
* fix(middleware): unify binding payload limits
Signed-off-by: Piotr Mlocek <pmlocek@nvidia.com>
* refactor(middleware): align payload limit terminology
Signed-off-by: Piotr Mlocek <pmlocek@nvidia.com>
* fix(middleware): address websocket review feedback
Signed-off-by: Piotr Mlocek <pmlocek@nvidia.com>
* fix(network): address websocket review findings
Signed-off-by: Piotr Mlocek <pmlocek@nvidia.com>
* test(network): allow Linux handler setup in preflight regression
Signed-off-by: Piotr Mlocek <pmlocek@nvidia.com>
* fix(network): harden websocket relay finalization
Signed-off-by: Piotr Mlocek <pmlocek@nvidia.com>
* fix(network): inspect compressed websocket messages
Signed-off-by: Piotr Mlocek <pmlocek@nvidia.com>
* test(network): stabilize compressed websocket regressions
Signed-off-by: Piotr Mlocek <pmlocek@nvidia.com>
* fix(go-sdk): regenerate middleware protobuf binding
Signed-off-by: Piotr Mlocek <pmlocek@nvidia.com>
* fix(middleware): clarify websocket skip lifecycle
Signed-off-by: Piotr Mlocek <pmlocek@nvidia.com>
* fix(middleware): address WebSocket review feedback
Signed-off-by: Piotr Mlocek <pmlocek@nvidia.com>
---------
Signed-off-by: Piotr Mlocek <pmlocek@nvidia.com>
* refactor(driver): extract shared supervisor binary helpers
Move supervisor binary extraction, caching, and validation helpers from
the Docker driver into openshell-core::driver_utils so both Docker and
Podman drivers can reuse them.
Moved helpers: extract_first_tar_entry, write_cache_binary_atomic,
supervisor_cache_path, temp_extract_container_name, and
validate_linux_elf_binary.
The shared extract_first_tar_entry gains entry-type and empty-payload
checks that the Docker-local version lacked. supervisor_cache_path
takes a driver_subdir parameter so each driver caches under its own
namespace (docker-supervisor vs podman-supervisor).
Signed-off-by: Giuseppe Scrivano <gscrivan@redhat.com>
* feat(driver-podman): add userns config
Add a `userns` option to the Podman compute driver that maps to
Podman's user namespace modes. The mode string is split on the first
colon into the API's `nsmode` and `value` fields so parameterized
values like `auto:size=65536` and `keep-id:uid=1000,gid=1000` are
forwarded correctly. When the mode is `auto`, the container spec
also sets `idmappings.AutoUserNs = true` as required by the API.
An allowlist validates the mode at startup: `auto` and `keep-id`
accept optional parameters; `host`, `private`, and `nomap` reject
them; everything else is an error.
Podman image volumes use overlay mounts internally and the kernel
does not support idmapped mounts on overlay (`mount_setattr` returns
EINVAL). When userns is configured (any mode except `host`), the
driver extracts the supervisor binary from the image to a host-side
cache and bind-mounts it instead of using an image volume.
Configurable via TOML `userns = "auto"`, CLI `--userns`, or
environment variable `OPENSHELL_PODMAN_USERNS`.
Signed-off-by: Giuseppe Scrivano <gscrivan@redhat.com>
---------
Signed-off-by: Giuseppe Scrivano <gscrivan@redhat.com>
Signed-off-by: Simon Scatton <sscatton@nvidia.com>
Signed-off-by: Adrien Langou <alangou@nvidia.com>
…els (NVIDIA#2735)
* fix(inference): prepend publisher prefix for Vertex non-Anthropic models
Vertex AI's OpenAI-compatible endpoint requires the request body's model
field to carry a publisher prefix (e.g. google/gemini-2.5-flash), but
validate_vertex_model_id rejects slash as a path-traversal guard. This
created a deadlock: bare model IDs pass validation but are rejected by
Vertex with HTTP 400 "Malformed publisher model"; prefixed IDs are
rejected at configuration time.
Fix: in resolve_vertex_ai_route, compute body_model_id for non-Anthropic
routes by prepending the publisher from infer_vertex_publisher() or the
explicit VERTEX_AI_PUBLISHER config value. The bare model_id still goes
through the path-traversal validator unchanged. Anthropic rawPredict routes
encode the model in the URL path, not the body, and are unaffected. Both
the project/region path and the base-URL-override path apply the prefix.
For unrecognised models with no explicit publisher the bare ID is forwarded
unchanged; Vertex's 400 is the correct observable signal in that case.
Add an integration test in openshell-router that spins up a mock Vertex
endpoint accepting only the publisher-prefixed form and rejecting the bare
model name, verifying the body rewrite produces the required format.
ClosesNVIDIA#2351
Signed-off-by: politerealism <burdcat17@gmail.com>
* fix(inference): propagate publisher-prefixed model_id through inference bundle
resolve_route_by_name_with_credentials built the ResolvedRoute with
config.model_id (the bare stored value) rather than resolved.route.model
(the publisher-prefixed value computed by resolve_vertex_ai_route). As a
result, the bundle delivered to sandboxes carried e.g. "gemini-2.5-flash"
instead of "google/gemini-2.5-flash", so live sandbox requests still hit
Vertex AI with the bare model name and received HTTP 400 "Malformed
publisher model".
Fix: use resolved.route.model in the bundle construction so the
publisher prefix survives the bundle boundary and the router sends the
correct body to Vertex AI.
Update the existing gemini bundle test to assert the prefixed model_id
and add a dedicated regression test that verifies the bundle carries the
publisher prefix for non-Anthropic Vertex routes.
Signed-off-by: politerealism <burdcat17@gmail.com>
* style(inference): apply rustfmt to new regression test
Signed-off-by: politerealism <burdcat17@gmail.com>
* fix(inference): address clippy lints in build_vertex_route
- Invert if !is_anthropic to satisfy clippy::if_not_else
- Replace match on Option with map_or_else to satisfy clippy::option_if_let_else
Signed-off-by: politerealism <burdcat17@gmail.com>
---------
Signed-off-by: politerealism <burdcat17@gmail.com>
* docs(rfc): add RFC 0013 native Windows support via MXC
Propose native Windows 11 support through a build-only MSVC lane and a new
in-process, supervisor-free MXC compute driver, with host-side governed egress
and an OpenShell to MXC policy-translation seam.
Refs: NVIDIA#2050
Signed-off-by: Shailendra Singh <shailendras@nvidia.com>
* docs(rfc): address native Windows MXC review feedback
Signed-off-by: Shailendra Singh <shailendras@nvidia.com>
* docs(rfc): update governed egress proxy topology
Signed-off-by: Shailendra Singh <shailendras@nvidia.com>
* docs(rfc): clarify Windows proxy and gateway topology
Signed-off-by: Shailendra Singh <shailendras@nvidia.com>
---------
Signed-off-by: Shailendra Singh <shailendras@nvidia.com>
* Update docs.yml
Remove warning banner from docs page.
* Update README.md
…uation (NVIDIA#2699)
* fix(supervisor-network): strip path parameters before dot-segment resolution
Signed-off-by: Adrien Langou <alangou@nvidia.com>
* fix(supervisor-network): scope allow_encoded_slash to the matched L7 endpoint
Signed-off-by: Adrien Langou <alangou@nvidia.com>
* fix(supervisor-network): check the canonical target for encoded slashes
Signed-off-by: Adrien Langou <alangou@nvidia.com>
---------
Signed-off-by: Adrien Langou <alangou@nvidia.com>
* ci(drivers): lint portable drivers on macOS
Signed-off-by: Evan Lezar <elezar@nvidia.com>
* fix(driver-podman): compile container spec on macOS
Signed-off-by: Evan Lezar <elezar@nvidia.com>
---------
Signed-off-by: Evan Lezar <elezar@nvidia.com>
Test coverage artifact was accidentally committed. Already in .gitignore.
Signed-off-by: Roland Huß <rhuss@redhat.com>
…ctivity (NVIDIA#2664)
Apply the official OCSF ai_operation profile (introduced in v1.8.0) to
ApiActivity [6003] events when the inference proxy routes a model call
through inference.local. Attaches an ai_model object (name, ai_provider)
and puts token counts and latency in unmapped fields.
ApiActivity [6003] is the schema-correct class for the ai_operation
profile in v1.8.0 (HttpActivity only gets it in v1.9.0). In Splunk CIM,
ApiActivity maps to the "Change" data model, naturally separating
inference events from regular HTTP proxy traffic.
Changes:
- Add AiModel object and ai_model field on BaseEventData
- Add ApiActivityEvent struct and ApiActivityBuilder
- Add emit_ai_inference in proxy.rs using ApiActivity with ai_operation
- Vendor OCSF v1.8.0 schemas including api_activity class, ai_model
object, and ai_operation profile definitions
- Bump OCSF_VERSION to 1.8.0
- Update schema validation to skip profile-gated required fields
Shorthand: API:INFERENCE [INFO] claude-3-haiku via anthropic 701ms [POST /v1/messages]
Splunk/SIEM backward compatibility (v1.1/v1.3 CIM mapping) is tracked
separately in NVIDIA#2662 as a configurable serialization concern.
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* fix(providers): keep refresh credential handles stable
Signed-off-by: Mrunal Patel <mrunalp@gmail.com>
* fix(providers): protect refresh-owned credentials
Signed-off-by: Mrunal Patel <mrunalp@gmail.com>
---------
Signed-off-by: Mrunal Patel <mrunalp@gmail.com>
* fix(policy): gate uninspected credentialed endpoints
Signed-off-by: Adrien Langou <alangou@nvidia.com>
* refactor(cli): extract allowed-ip option parsing
Signed-off-by: Adrien Langou <alangou@nvidia.com>
* fix(policy): gate endpointless credential bindings
Signed-off-by: Adrien Langou <alangou@nvidia.com>
---------
Signed-off-by: Adrien Langou <alangou@nvidia.com>
Signed-off-by: Gordon Sim <gsim@redhat.com>
…NVIDIA#2795)
* feat(cli): support OIDC device authorization grant for headless login
ClosesNVIDIA#2793
Add OAuth 2.0 Device Authorization Grant (RFC 8628) support to the OpenShell CLI's OIDC login flow. When running in a headless environment (OPENSHELL_NO_BROWSER=1) without a client secret configured, the CLI now uses the device code flow instead of the browser-based PKCE flow.
The device code flow:
- Requests a device code and user code from the IdP's device authorization endpoint
- Displays a verification URL and user code to the user
- Polls the token endpoint until the user completes authorization or the code expires
- Supports slow_down responses per RFC 8628 by increasing the polling interval
This implementation:
- Extends OidcDiscovery to optionally capture device_authorization_endpoint
- Adds oidc_device_code_flow function with proper error handling for all RFC 8628 error codes
- Updates gateway add and gateway login to dispatch to device flow when browser is suppressed
- Adds comprehensive unit tests for device flow structs and response parsing
- Updates gateway authentication documentation to describe the device code fallback
Signed-off-by: Jesse Jaggars <jjaggars@redhat.com>
* fix(cli): validate OIDC device token responses
Signed-off-by: Jesse Jaggars <jjaggars@redhat.com>
* fix(cli): add PKCE to OIDC device flow
Signed-off-by: Jesse Jaggars <jjaggars@redhat.com>
* docs(cli): document PKCE device flow
Signed-off-by: Jesse Jaggars <jjaggars@redhat.com>
---------
Signed-off-by: Jesse Jaggars <jjaggars@redhat.com>
Signed-off-by: Drew Newberry <anewberry@nvidia.com>
…DIA#2801)
* feat(providers): store refresh credentials in credential drivers
Signed-off-by: Mrunal Patel <mrunalp@gmail.com>
* fix(providers): harden refresh credential lifecycle
Signed-off-by: Mrunal Patel <mrunalp@gmail.com>
* fix(providers): migrate legacy refresh secrets before skip
Signed-off-by: Mrunal Patel <mrunalp@gmail.com>
* refactor(providers): defer credential migration
Signed-off-by: Mrunal Patel <mrunalp@gmail.com>
* fix(providers): make refresh configuration atomic
Signed-off-by: Mrunal Patel <mrunalp@gmail.com>
---------
Signed-off-by: Mrunal Patel <mrunalp@gmail.com>
And collect the other agent-related entries together.
Signed-off-by: Kris Hicks <khicks@nvidia.com>
Signed-off-by: Seth Jennings <sjenning@redhat.com>
* fix(podman): wait for container stop completion
Signed-off-by: Piotr Mlocek <pmlocek@nvidia.com>
* docs(podman): clarify stop restart race
Signed-off-by: Piotr Mlocek <pmlocek@nvidia.com>
---------
Signed-off-by: Piotr Mlocek <pmlocek@nvidia.com>
* refactor(compute): unify gateway restart reconciliation
Remove the Docker-specific gateway shutdown cleanup and reconcile persisted running intent through ComputeDriver::StartSandbox for Docker, Podman, and VM drivers. Explicitly stopped sandboxes remain stopped.
Refs NVIDIA#2417
Signed-off-by: Drew Newberry <anewberry@nvidia.com>
* refactor(compute): stop local sandboxes on shutdown
Signed-off-by: Drew Newberry <anewberry@nvidia.com>
* test(e2e): match managed Podman containers
Signed-off-by: Drew Newberry <anewberry@nvidia.com>
* fix(compute): synchronize lifecycle sweeps
Signed-off-by: Drew Newberry <anewberry@nvidia.com>
---------
Signed-off-by: Drew Newberry <anewberry@nvidia.com>
SDAChessand others added 21 commits August 20, 2026 15:08
Signed-off-by: Simon Scatton <sscatton@nvidia.com>
* refactor(compute): negotiate external driver behavior
Signed-off-by: Drew Newberry <anewberry@nvidia.com>
* docs(compute): revert external driver documentation
Signed-off-by: Drew Newberry <anewberry@nvidia.com>
* refactor(compute): negotiate gateway-managed lifecycle
Signed-off-by: Drew Newberry <anewberry@nvidia.com>
* refactor(compute): remove driver feature negotiation
Signed-off-by: Drew Newberry <anewberry@nvidia.com>
* feat(compute): let drivers declare gateway lifecycle
Signed-off-by: Drew Newberry <anewberry@nvidia.com>
* refactor(compute): clarify lifecycle ownership
Signed-off-by: Drew Newberry <anewberry@nvidia.com>
---------
Signed-off-by: Drew Newberry <anewberry@nvidia.com>
* feat(policy): accept explicit tcp endpoint protocol
Signed-off-by: John Myers <9696606+johntmyers@users.noreply.github.com>
* refactor(network): snapshot authoritative egress decisions
Signed-off-by: John Myers <9696606+johntmyers@users.noreply.github.com>
* docs(policy): document explicit tcp protocol
Signed-off-by: John Myers <9696606+johntmyers@users.noreply.github.com>
* docs(policy): defer transparent TCP release guidance
Signed-off-by: John Myers <9696606+johntmyers@users.noreply.github.com>
* chore(go): regenerate sandbox protobuf bindings
Signed-off-by: John Myers <9696606+johntmyers@users.noreply.github.com>
* fix(network): complete tcp egress foundation
Signed-off-by: John Myers <9696606+johntmyers@users.noreply.github.com>
* docs(policy): document explicit tcp contract
Signed-off-by: John Myers <9696606+johntmyers@users.noreply.github.com>
* fix(network): fail closed on authorization errors
Signed-off-by: John Myers <9696606+johntmyers@users.noreply.github.com>
* fix(podman): fence delayed exit events before restart
Signed-off-by: John Myers <9696606+johntmyers@users.noreply.github.com>
* fix(policy): validate network endpoint destinations
Signed-off-by: John Myers <9696606+johntmyers@users.noreply.github.com>
* test(providers): opt in tcp credential fixture
Signed-off-by: John Myers <9696606+johntmyers@users.noreply.github.com>
* fix(policy): require dns host for transparent tcp
Signed-off-by: John Myers <9696606+johntmyers@users.noreply.github.com>
---------
Signed-off-by: John Myers <9696606+johntmyers@users.noreply.github.com>
* feat(network): add policy DNS correlation foundation
Signed-off-by: John Myers <9696606+johntmyers@users.noreply.github.com>
* docs(network): describe dormant policy DNS boundary
Signed-off-by: John Myers <9696606+johntmyers@users.noreply.github.com>
* fix(network): harden policy DNS publication
Signed-off-by: John Myers <9696606+johntmyers@users.noreply.github.com>
* fix(network): audit policy DNS failures
Signed-off-by: John Myers <9696606+johntmyers@users.noreply.github.com>
* fix(network): preserve DNS answer order
Signed-off-by: John Myers <9696606+johntmyers@users.noreply.github.com>
---------
Signed-off-by: John Myers <9696606+johntmyers@users.noreply.github.com>
Mirror the VM driver tracing setup for Podman. Export standalone driver
spans through OTLP/gRPC as the distinct openshell-driver-podman service,
propagate W3C context across ComputeDriver RPCs, record bounded RPC names
and failures, and flush buffered spans during graceful shutdown.
Podman still runs in-process when selected as a built-in gateway driver.
Add a temporary tracing shim that partitions gateway and Podman spans by
target into separate tracer providers while preserving their shared trace
and parentage. The shim also emits the same ComputeDriver server boundary
that the tonic layer emits out of process, keeping the observable trace
shape stable when Podman is eventually extracted.
Trace container create preparation, image and storage setup, lifecycle
operations, and cleanup. Document the service boundary and cover it with
isolated and repeated tracing tests.
Signed-off-by: Kris Hicks <khicks@nvidia.com>
NVIDIA#2723)
* feat(network): enable Docker transparent TCP egress
Signed-off-by: John Myers <9696606+johntmyers@users.noreply.github.com>
* test(e2e): cover Docker transparent TCP egress
Signed-off-by: John Myers <9696606+johntmyers@users.noreply.github.com>
* feat(network): correlate transparent TCP audit events
Signed-off-by: John Myers <9696606+johntmyers@users.noreply.github.com>
* docs(examples): add transparent TCP Redis demo
Signed-off-by: John Myers <9696606+johntmyers@users.noreply.github.com>
* docs(examples): demonstrate blocked TCP connections
Signed-off-by: John Myers <9696606+johntmyers@users.noreply.github.com>
* docs(examples): focus Redis demo audit output
Signed-off-by: John Myers <9696606+johntmyers@users.noreply.github.com>
* fix(network): close transparent TCP policy bypasses
Signed-off-by: John Myers <9696606+johntmyers@users.noreply.github.com>
* fix(sandbox): reject unsupported TCP policy reloads
Signed-off-by: John Myers <9696606+johntmyers@users.noreply.github.com>
* fix(ci): satisfy Linux transparent TCP lints
Signed-off-by: John Myers <9696606+johntmyers@users.noreply.github.com>
* feat(podman): enable transparent TCP egress
Signed-off-by: John Myers <9696606+johntmyers@users.noreply.github.com>
* fix(podman): permit policy DNS port binding
Signed-off-by: John Myers <9696606+johntmyers@users.noreply.github.com>
* test(e2e): use qualified transparent TCP hostname
Signed-off-by: John Myers <9696606+johntmyers@users.noreply.github.com>
* fix(podman): preserve exact policy DNS names
Signed-off-by: John Myers <9696606+johntmyers@users.noreply.github.com>
* fix(podman): route policy DNS over TCP
Signed-off-by: John Myers <9696606+johntmyers@users.noreply.github.com>
* fix(dns): serve multiple TCP queries per connection
Signed-off-by: John Myers <9696606+johntmyers@users.noreply.github.com>
* docs(network): explain native DNS and TCP egress
Signed-off-by: John Myers <9696606+johntmyers@users.noreply.github.com>
* fix(sandbox): reconcile runtime reload with upstream
Signed-off-by: John Myers <9696606+johntmyers@users.noreply.github.com>
* fix(network): harden transparent DNS capture
Signed-off-by: John Myers <9696606+johntmyers@users.noreply.github.com>
* fix(podman): preserve resolver behavior for native tcp
Signed-off-by: John Myers <9696606+johntmyers@users.noreply.github.com>
* docs(network): clarify native tcp runtime constraints
Signed-off-by: John Myers <9696606+johntmyers@users.noreply.github.com>
* fix(network): remove unused transparent tcp pin
Signed-off-by: John Myers <9696606+johntmyers@users.noreply.github.com>
* fix(network): admit redirected transparent tcp
Signed-off-by: John Myers <9696606+johntmyers@users.noreply.github.com>
* fix(network): restore podman transparent networking
Signed-off-by: John Myers <9696606+johntmyers@users.noreply.github.com>
* test(podman): permit alpine busybox binaries
Signed-off-by: John Myers <9696606+johntmyers@users.noreply.github.com>
* test(podman): use portable alpine keepalive
Signed-off-by: John Myers <9696606+johntmyers@users.noreply.github.com>
* test(podman): build musl networking fixture
Signed-off-by: John Myers <9696606+johntmyers@users.noreply.github.com>
* test(podman): isolate musl DNS probe
Signed-off-by: John Myers <9696606+johntmyers@users.noreply.github.com>
* fix(podman): keep privileged port capability dropped
Signed-off-by: John Myers <9696606+johntmyers@users.noreply.github.com>
* fix(network): preserve transparent TCP port 53
Signed-off-by: John Myers <9696606+johntmyers@users.noreply.github.com>
* fix(network): report synthetic pool pressure by family
Signed-off-by: John Myers <9696606+johntmyers@users.noreply.github.com>
* test(podman): bind tcp fixtures before readiness
Signed-off-by: John Myers <9696606+johntmyers@users.noreply.github.com>
* test(podman): grant fixture low-port bind
Signed-off-by: John Myers <9696606+johntmyers@users.noreply.github.com>
---------
Signed-off-by: John Myers <9696606+johntmyers@users.noreply.github.com>
Signed-off-by: Drew Newberry <anewberry@nvidia.com>
* feat(sandbox): add canonical main process
ClosesNVIDIA#2710
Persist and supervise one canonical workload per sandbox, attach sandbox connect to its retained session, and make every unexpected main-process exit terminal.
Signed-off-by: Drew Newberry <anewberry@nvidia.com>
* feat(sandbox): simplify canonical main process contract
Signed-off-by: Drew Newberry <anewberry@nvidia.com>
* fix(sandbox): preserve legacy VM main compatibility
Signed-off-by: Drew Newberry <anewberry@nvidia.com>
* fix(sandbox): preserve main status across driver updates
Signed-off-by: Drew Newberry <anewberry@nvidia.com>
* fix(sandbox): satisfy macOS process lint
Signed-off-by: Drew Newberry <anewberry@nvidia.com>
* fix(sandbox): gate Linux exit acknowledgement publisher
Signed-off-by: Drew Newberry <anewberry@nvidia.com>
* refactor(sandbox): simplify main process plumbing
Signed-off-by: Drew Newberry <anewberry@nvidia.com>
* fix(supervisor): make controlling tty ioctl portable
Signed-off-by: Drew Newberry <anewberry@nvidia.com>
* fix(supervisor): initialize canonical process environment
Signed-off-by: Drew Newberry <anewberry@nvidia.com>
* perf(supervisor): optimize retained main session
Signed-off-by: Drew Newberry <anewberry@nvidia.com>
* feat(sandbox): detach main session on ctrl-c
Signed-off-by: Drew Newberry <anewberry@nvidia.com>
* fix(sandbox): use explicit main detach keys
Signed-off-by: Drew Newberry <anewberry@nvidia.com>
* fix(dev): atomically stage Docker supervisor
Signed-off-by: Drew Newberry <anewberry@nvidia.com>
* fix(test): align Docker main environment assertion
Signed-off-by: Drew Newberry <anewberry@nvidia.com>
* feat(sdk): expose canonical main process fields
Signed-off-by: Drew Newberry <anewberry@nvidia.com>
---------
Signed-off-by: Drew Newberry <anewberry@nvidia.com>
Signed-off-by: Drew Newberry <anewberry@nvidia.com>
ClosesNVIDIA#2847
Separate sidecar delivery ordering from opaque provider environment fingerprints and cover live bind/unbind convergence.
Signed-off-by: John Myers <9696606+johntmyers@users.noreply.github.com>
Signed-off-by: Drew Newberry <anewberry@nvidia.com>
* feat(compute): add standalone first-party drivers
Build Docker, Podman, Kubernetes, and VM drivers as external binaries and
exercise each through the public compute-driver API. Keep the external E2E
setup complete at introduction, including VM image selection, Kubernetes
post-renderer isolation, supervisor reuse, and scoped Podman coverage.
External Kubernetes endpoints support shared and managed workspace modes.
Operator mode remains restricted to the in-process driver because gateway
authentication and the driver must share a dynamic namespace allowlist.
Signed-off-by: Drew Newberry <anewberry@nvidia.com>
* ci(e2e): run managed and external drivers independently
Signed-off-by: Drew Newberry <anewberry@nvidia.com>
* test(compute): cover external driver socket contract
Signed-off-by: Evan Lezar <elezar@nvidia.com>
* ci(e2e): install bundled Z3 build dependency
Signed-off-by: Drew Newberry <anewberry@nvidia.com>
* fix(server): gate in-tree driver tracing
Signed-off-by: Drew Newberry <anewberry@nvidia.com>
---------
Signed-off-by: Drew Newberry <anewberry@nvidia.com>
Signed-off-by: Evan Lezar <elezar@nvidia.com>
Co-authored-by: Evan Lezar <elezar@nvidia.com>
* docs(rfc): define stable release policy
Signed-off-by: Drew Newberry <anewberry@nvidia.com>
* docs(rfc): link review pull request
Signed-off-by: Drew Newberry <anewberry@nvidia.com>
* docs(rfc): summarize release proposal
Signed-off-by: Drew Newberry <anewberry@nvidia.com>
* docs(rfc): replace nightlies with release candidates
Signed-off-by: Drew Newberry <anewberry@nvidia.com>
* docs(rfc): add breaking change examples
Signed-off-by: Drew Newberry <anewberry@nvidia.com>
* docs(rfc): simplify compatibility proposal
Signed-off-by: Drew Newberry <anewberry@nvidia.com>
* docs(rfc): add SELinux Podman coverage
Signed-off-by: Drew Newberry <anewberry@nvidia.com>
* docs(rfc): simplify capability release rules
Signed-off-by: Drew Newberry <anewberry@nvidia.com>
* docs(rfc): streamline release stability proposal
Signed-off-by: Drew Newberry <anewberry@nvidia.com>
* docs(rfc): simplify release qualification criteria
Signed-off-by: Drew Newberry <anewberry@nvidia.com>
* docs(rfc): clarify alpha exit motivation
Signed-off-by: Drew Newberry <anewberry@nvidia.com>
* docs(rfc): refine release qualification policy
Signed-off-by: Drew Newberry <anewberry@nvidia.com>
* docs(rfc): define API maturity and conformance opt-outs
Signed-off-by: Drew Newberry <anewberry@nvidia.com>
* docs(rfc): adopt Preview and Stable API maturity
Signed-off-by: Drew Newberry <anewberry@nvidia.com>
* docs(rfc): define Stable and Experimental APIs
Signed-off-by: Drew Newberry <anewberry@nvidia.com>
* docs(rfc): allow feature-driven minor releases
Signed-off-by: Drew Newberry <anewberry@nvidia.com>
* docs(rfc): clarify release build audiences
Signed-off-by: Drew Newberry <anewberry@nvidia.com>
* docs(rfc): define pre-release train semantics
Signed-off-by: Drew Newberry <anewberry@nvidia.com>
---------
Signed-off-by: Drew Newberry <anewberry@nvidia.com>
Signed-off-by: Drew Newberry <anewberry@nvidia.com>
* fix(helm): preflight Agent Sandbox APIs
Signed-off-by: Evan Lezar <elezar@nvidia.com>
* test(kubernetes): share Agent Sandbox setup
Signed-off-by: Evan Lezar <elezar@nvidia.com>
* fix(e2e): wait for Agent Sandbox CRD status
Signed-off-by: Evan Lezar <elezar@nvidia.com>
* ci(canary): sparse-checkout sandbox helper
Signed-off-by: Evan Lezar <elezar@nvidia.com>
---------
Signed-off-by: Evan Lezar <elezar@nvidia.com>
* fix(test-guest): support RPM installs with DNF5
Signed-off-by: Evan Lezar <elezar@nvidia.com>
* fix(test-guest): clarify RPM install arguments
Signed-off-by: Evan Lezar <elezar@nvidia.com>
---------
Signed-off-by: Evan Lezar <elezar@nvidia.com>
…#2878)
ClosesNVIDIA#2877
Use the gateway's configured provider profile catalog for sandbox creation and provider attachment validation.
Signed-off-by: Drew Newberry <anewberry@nvidia.com>
…VIDIA#2771)
* feat(supervisor): expose sandbox name to middleware request context
Signed-off-by: Artem Lytvyn <alytvyn@redhat.com>
* feat(supervisor): add workspace to middleware request context
Signed-off-by: Artem Lytvyn <alytvyn@redhat.com>
---------
Signed-off-by: Artem Lytvyn <alytvyn@redhat.com>
* fix(policy): bind reviews to applicable candidates
Build and validate the exact effective-policy candidate before approval, bind review to live policy/provider/credential inputs, and preserve inspected endpoint contracts during mechanistic expansion.
ClosesNVIDIA#2821
Signed-off-by: John Myers <johntmyers@users.noreply.github.com>
* fix(policy): canonicalize advisor review inputs
Serialize nested protobuf maps in stable key order for proposal review tokens and effective-policy hashes. Narrow reused multi-port endpoint contracts to the denied port so advisor proposals cannot widen binary access. Add regressions for both cases.
Signed-off-by: John Myers <johntmyers@users.noreply.github.com>
* test(e2e): keep advisor sandbox running
Create the issue 2821 regression sandbox detached with a durable canonical main process so policy denial, approval, and hot-reload checks run before lifecycle exit.
Signed-off-by: John Myers <johntmyers@users.noreply.github.com>
* fix(policy): apply reviewed draft batches atomically
Signed-off-by: John Myers <johntmyers@users.noreply.github.com>
---------
Signed-off-by: John Myers <johntmyers@users.noreply.github.com>
Co-authored-by: John Myers <johntmyers@users.noreply.github.com>
Previously, Podman could be selected through automatic driver detection or with
`mise run gateway -- --driver podman`, but it did not have a dedicated task
like the Docker and VM drivers.
This adds a gateway:podman task and moves the Podman-specific setup into its
own script. The generic gateway task now delegates Podman launches to that
script.
Additionally:
Unlike Docker, which rebuilds and bind-mounts the supervisor binary, Podman
uses a dev-tagged supervisor image that can become stale. The default Podman
supervisor image is therefore rebuilt on each launch.
Signed-off-by: Kris Hicks <khicks@nvidia.com>
Signed-off-by: Drew Newberry <anewberry@nvidia.com>
@mattj-monad
mattj-monad merged commit b39b605 into mainAug 22, 2026
6 of 8 checks passed
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

20 participants

@mattj-monad@krishicks@loveRhythm1990@drew@pimlock@sjenning@derekwaynecarr@giuseppe@SDAChess@alangou@politerealism@shailendra-nv@kirit93@elezar@rhuss@zanetworker@mrunalp@grs@jhjaggars@johntmyers