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

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions crates/right-openshell/proto/UPSTREAM.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
tag: v0.0.62
fetched: 2026-06-13T07:00:33Z
tag: v0.0.72
fetched: 2026-06-30T06:59:42Z
upstream: https://github.com/NVIDIA/OpenShell
44 changes: 42 additions & 2 deletions crates/right-openshell/proto/openshell/openshell.proto
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,10 @@ service OpenShell {
rpc ImportProviderProfiles(ImportProviderProfilesRequest)
returns (ImportProviderProfilesResponse);

// Update an existing custom provider type profile.
rpc UpdateProviderProfiles(UpdateProviderProfilesRequest)
returns (UpdateProviderProfilesResponse);

// Validate provider type profiles without registering them.
rpc LintProviderProfiles(LintProviderProfilesRequest)
returns (LintProviderProfilesResponse);
Expand Down Expand Up @@ -317,8 +321,9 @@ message SandboxSpec {
openshell.sandbox.v1.SandboxPolicy policy = 7;
// Provider names to attach to this sandbox.
repeated string providers = 8;
// Request NVIDIA GPU resources for this sandbox.
bool gpu = 9;
// Portable resource requirements used by the gateway for driver selection
// and by drivers for provisioning.
ResourceRequirements resource_requirements = 9;
Comment on lines 321 to +326
reserved 10;
reserved "gpu_device";
// Field 11 was `proposal_approval_mode`. The approval mode is now a
Expand All @@ -329,6 +334,18 @@ message SandboxSpec {
reserved "proposal_approval_mode";
}

message ResourceRequirements {
// GPU requirements for the sandbox. Presence indicates a GPU request.
GpuResourceRequirements gpu = 1;
}

// Public GPU resource requirements.
message GpuResourceRequirements {
// Optional number of GPUs requested. When omitted, the request is for one
// GPU using the selected driver's default assignment behavior.
optional uint32 count = 1;
}

// Public sandbox template mapped onto compute-driver template inputs.
message SandboxTemplate {
// Fully-qualified OCI image reference used to boot the sandbox.
Expand Down Expand Up @@ -1075,6 +1092,10 @@ message ProviderProfile {
repeated openshell.sandbox.v1.NetworkBinary binaries = 7;
bool inference_capable = 8;
ProviderProfileDiscovery discovery = 9;
// Storage resource version for custom profiles. Built-in profiles and new
// profile files use 0. Gateway responses set this for stored custom profiles.
// Update calls use this for optimistic concurrency.
uint64 resource_version = 10;
}
Comment on lines 1094 to 1099

// Stored custom provider profile object.
Expand Down Expand Up @@ -1105,6 +1126,25 @@ message ImportProviderProfilesResponse {
bool imported = 3;
}

// Update one custom provider profile request.
message UpdateProviderProfilesRequest {
ProviderProfileImportItem profile = 1;
// Expected storage resource version for optimistic concurrency control.
// If 0, the server uses the resource_version embedded in profile.profile.
// Updates without a non-zero version are rejected to prevent stale files from
// silently overwriting newer profile definitions.
uint64 expected_resource_version = 2;
// Existing custom provider profile ID to update. The payload ID must match.
string id = 3;
}

// Update one custom provider profile response.
message UpdateProviderProfilesResponse {
repeated ProviderProfileDiagnostic diagnostics = 1;
ProviderProfile profile = 2;
bool updated = 3;
}

// Lint provider profiles request.
message LintProviderProfilesRequest {
repeated ProviderProfileImportItem profiles = 1;
Expand Down
61 changes: 59 additions & 2 deletions crates/right-openshell/proto/openshell/sandbox.proto
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,53 @@ message NetworkEndpoint {
// Advisor-proposed endpoints must not satisfy exact-host SSRF trust unless
// they are converted through an explicit user-authored policy path.
bool advisor_proposed = 18;
// Proxy-side credential signing mode: "sigv4" for AWS SigV4 re-signing.
// When set, the proxy strips the client's Authorization header and computes
// a fresh SigV4 signature using real credentials from the provider.
string credential_signing = 19;
// AWS signing service name override. Required when credential_signing is
// "sigv4" — e.g. "bedrock" for bedrock-runtime endpoints.
string signing_service = 20;
// AWS region override for SigV4 signing. When set, takes precedence over
// hostname-based region extraction. Required for non-standard endpoints.
string signing_region = 21;
// Maximum JSON-RPC-over-HTTP request body bytes to buffer for inspection.
// Defaults to 65536 when unset.
uint32 json_rpc_max_body_bytes = 22;
// MCP-only policy and inspection options. Only used when protocol is "mcp".
McpOptions mcp = 23;
}

// MCP options are grouped so MCP-specific policy can grow without adding more
// top-level NetworkEndpoint fields. Current enforcement targets the active
// 2025-11-25 Streamable HTTP/tools behavior, while preserving space for
// version-profile policy if OpenShell adopts 2026-07-28 draft behavior later.
//
// Planned policy extensions should use OpenShell-owned static definitions for
// MCP method/version profiles rather than treating dependency enums as the
// policy contract. Candidate profile checks include request metadata/header
// validation, response/SSE introspection, trusted annotation handling,
// resultType/cache metadata validation, x-mcp-header tool-definition checks,
// and subscriptions/listen handling.
//
// Sources:
// - https://modelcontextprotocol.io/specification/2025-11-25/server/tools
// - https://modelcontextprotocol.io/specification/draft/changelog
// - https://modelcontextprotocol.io/specification/draft/basic/transports/streamable-http
// - https://modelcontextprotocol.io/specification/draft/server/tools
message McpOptions {
// Hardening boundary for tools/call params.name. When unset or true, the
// supervisor enforces the MCP recommended tool-name syntax
// ^[A-Za-z0-9_.-]{1,128}$ before policy evaluation. Set false only for
// compatibility with servers that intentionally use non-recommended names.
//
// Source:
// - https://modelcontextprotocol.io/specification/2025-11-25/server/tools#tool-names
optional bool strict_tool_names = 1;
// Method-layer default for MCP endpoints. When true, OpenShell allows parsed
// MCP-family methods at the method layer unless a tool-name policy narrows
// tools/call. When unset or false, explicit method rules are required.
optional bool allow_all_known_mcp_methods = 2;
}

// Trusted GraphQL operation classification.
Expand All @@ -144,7 +191,8 @@ message GraphqlOperation {
// Mirrors L7Allow — same fields, same matching semantics, inverted effect.
// Deny rules are evaluated after allow rules and take precedence.
message L7DenyRule {
// HTTP method (REST): GET, POST, etc. or "*" for any.
// Protocol method: HTTP method (REST/WebSocket), JSON-RPC method name, or
// "*" for any when supported by the protocol.
string method = 1;
// URL path glob pattern (REST): "/repos/*/pulls/*/reviews", "**" for any.
string path = 2;
Expand All @@ -160,6 +208,10 @@ message L7DenyRule {
// GraphQL root field globs. Deny rules match when any selected root field
// matches any configured glob.
repeated string fields = 7;
reserved 8;
// MCP params matcher map. Currently only params.name is supported for
// tools/call filtering. Generic protocol "json-rpc" rejects params matchers.
map<string, L7QueryMatcher> params = 9;
}

// An L7 policy rule (allow-only).
Expand All @@ -169,7 +221,8 @@ message L7Rule {

// Allowed action definition for L7 rules.
message L7Allow {
// HTTP method (REST): GET, POST, etc. or "*" for any.
// Protocol method: HTTP method (REST/WebSocket), JSON-RPC method name, or
// "*" for any when supported by the protocol.
string method = 1;
// URL path glob pattern (REST): "/repos/**", "**" for any.
string path = 2;
Expand All @@ -186,6 +239,10 @@ message L7Allow {
// GraphQL root field globs. Allow rules match only when every selected root
// field matches one of the configured globs. Omit to match all fields.
repeated string fields = 7;
reserved 8;
// MCP params matcher map. Currently only params.name is supported for
// tools/call filtering. Generic protocol "json-rpc" rejects params matchers.
map<string, L7QueryMatcher> params = 9;
}

// Query value matcher for one query parameter key.
Expand Down
Loading