Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
cbfbe2f
feat(sandbox-backend): route runtime connections to shared supervisor…
drew Oct 19, 2026
5591b1e
feat(supervisor): host gateway-registered sessions in one process
drew Oct 19, 2026
1e096eb
feat(server): issue a TLS-only private PKI from generate-certs
drew Oct 19, 2026
217d598
feat(kubernetes): supervise gateway-topology generations as shared se…
drew Oct 19, 2026
f4400e0
feat(helm): deploy and wire the shared supervisor
drew Oct 19, 2026
76d5b4a
refactor(ocsf): attribute events to session-bound contexts
drew Oct 19, 2026
3ae600f
test(e2e): run two sandboxes on one shared Kubernetes supervisor
drew Oct 19, 2026
0e7666d
refactor(supervisor): scope gateway credentials and network state to …
drew Oct 19, 2026
1c53942
docs: describe the experimental shared supervisor
drew Oct 19, 2026
bce3e09
feat(supervisor): host concurrent sessions on session-bound runtimes
drew Oct 19, 2026
718885f
fix: tighten shared supervisor naming, removal deadlines, and route p…
drew Oct 19, 2026
a0eb29e
refactor(supervisor): route shared supervisor crypto through openshel…
drew Oct 20, 2026
a666a77
feat(supervisor): report shared supervisor health over TCP
drew Oct 20, 2026
db914eb
refactor(supervisor): probe shared supervisor health on session control
drew Oct 20, 2026
404b460
refactor(supervisor): use shared mode flags for the session host
drew Oct 20, 2026
da1a5fd
refactor(supervisor): describe the shared host module by its mode
drew Oct 21, 2026
cdedef6
fix(test): preserve shared supervisor workspace overlays
drew Oct 21, 2026
ccfdfbb
refactor(supervisor): name hosted lifetimes sandbox instances
drew Oct 21, 2026
915ecc9
refactor(supervisor): name shared-host registrations sandbox instances
drew Oct 21, 2026
d430052
refactor(supervisor): own hosted instance lifecycles in one registry
drew Oct 21, 2026
e1be7e9
refactor(supervisor): launch sandbox instances from one config and pr…
drew Oct 21, 2026
0aafe59
refactor(supervisor): use session-control wire types for instance sta…
drew Oct 21, 2026
34d2ee0
fix(supervisor): update Windows host proxy test config
drew Oct 22, 2026
b169159
chore(stack): incorporate Windows host proxy test fix
drew Oct 22, 2026
58c4c16
refactor(supervisor): assign shared sandbox instances over a supervis…
drew Oct 22, 2026
d954404
refactor(supervisor): authenticate the shared supervisor stream with …
drew Oct 22, 2026
7754896
refactor(helm): remove redundant certgen condition
drew Oct 22, 2026
a6cf581
refactor(supervisor): extract gateway-owned shared supervision into o…
drew Oct 22, 2026
57a99e1
chore(stack): merge main with the squashed instance-state foundation …
drew Oct 22, 2026
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
36 changes: 27 additions & 9 deletions .agents/skills/helm-dev-environment/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -68,15 +68,33 @@ gatewayConfig:
supervisor_topology: gateway
```

The gateway chart creates a separate, single-replica shared-host placeholder Deployment
in the release namespace, regardless of shared/managed/operator workspace mode.
Use a supervisor image built from this branch: `--mode=shared` is new.
The chart sets `--gateway-endpoint` from the gateway's gRPC endpoint and
`--address` to `0.0.0.0:5501`. Check its rollout and TCP health probes on this
listener (container port `supervisor`, 5501). The outbound gateway connection and
session RPCs are not implemented yet; sandboxes
still use dedicated supervisors. `workspace` is reserved and rejected. Omit the
field to disable it.
The gateway chart creates a single-replica shared supervisor Deployment,
Service, NetworkPolicy, and an empty `<release>-supervisor-token` Secret in
the release namespace, regardless of shared/managed/operator workspace mode.
The gateway mints a supervisor token from its sandbox-JWT signing key, writes
it into that Secret (the gateway Role may `get`/`patch` only that Secret), and
renews it at half its lifetime; the supervisor mounts the Secret and presents
the token on the private `openshell.supervisor.host.v1` assignment stream,
which accepts nothing else. The topology requires gateway TLS and the signing
key (`server.disableTls` is rejected; the gateway refuses to start without
`gateway_jwt`). New sandbox generations run as sandbox instances in that
process. The chart starts `--mode=shared`, sets `--gateway-endpoint` to the
gateway gRPC URL, mounts the token at `--token-file`, and binds `--address`
(5501) to a plain TCP health listener for the `tcpSocket` probes; nothing
dials the supervisor but sandbox runtimes (5500) and the kubelet. Build the gateway, supervisor, and sandbox
images from the same branch: all three must support the routed runtime
connection and the assignment stream. `workspace` is reserved and rejected.
Omit the field to disable it. `mise run
e2e:kubernetes:shared-supervisor` runs the focused e2e
(`ci/values-supervisor.yaml`). The task prepends that overlay to any
colon-separated `OPENSHELL_E2E_KUBE_EXTRA_VALUES` list, so layer a
workspace-mode overlay to cover managed namespaces:

```bash
OPENSHELL_E2E_KUBE_EXTRA_VALUES=deploy/helm/openshell/ci/values-workspace-managed.yaml \
OPENSHELL_E2E_KUBE_IMAGE_PULL_SECRET=e2e-regcred \
mise run e2e:kubernetes:shared-supervisor
```

### 2. Deploy OpenShell

Expand Down
1 change: 1 addition & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ Do not rely on this file for a full inventory. The detailed public and contribut
| `crates/openshell-server/` | Gateway server | Control-plane API, sandbox lifecycle, auth boundary |
| `crates/openshell-sandbox/` | Sandbox runtime | Capability-free workload launcher, process identity, and seccomp-mediated I/O |
| `crates/openshell-supervisor/` | Supervisor runtime | Gateway session, policy evaluation, credentials, and upstream networking |
| `crates/openshell-supervisor-control/` | Shared supervisor control | Gateway-owned assignment controller, launch registrations, recovery coordination, and host observations for a supervisor shared by many sandboxes |
| `crates/openshell-binary-identity/` | Binary identity | Shared trusted procfs executable identity resolution for isolation backends |
| `crates/openshell-isolation-interface/` | Isolation backend interface | Shared data and validation for the Isolation Backend RPC contracts |
| `crates/openshell-sandbox-backend/` | OpenShell sandbox backend | Concrete Isolation Backend RPC client and authenticated Sandbox Protocol shared with `openshell-sandbox` |
Expand Down
24 changes: 24 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

9 changes: 9 additions & 0 deletions crates/openshell-core/src/grpc_client.rs
Original file line number Diff line number Diff line change
Expand Up @@ -564,6 +564,15 @@ pub async fn connect_channel_pub(gateway: &GatewayEndpoint) -> Result<AuthedChan
connect_channel(gateway).await
}

/// Build a credential-free gateway channel for callers that attach their own bearer.
///
/// Uses the supervisor-side transport settings: server-authenticated TLS from
/// `OPENSHELL_TLS_CA` and `OPENSHELL_GATEWAY_TLS_SERVER_NAME` for `https`
/// endpoints, plaintext for `http` ones.
pub async fn connect_gateway_channel(endpoint: &str) -> Result<Channel> {
build_plain_channel(endpoint).await
}

/// Report installed provider state for the current authenticated supervisor session.
///
/// The observation must carry the session ID returned by `ConnectSupervisor`.
Expand Down
Loading
Loading