You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Commit e6eb9f7
Browse filesBrowse the repository at this point in the historyBrowse files
fix(providers): reconcile stable placeholders with endpoint diagnostics
Merge upstream main into feat/stable-placeholders. Preserve stable-placeholder
credential installation and endpoint status invalidation on provider refresh.
Retain both stored-data compatibility fixtures and update the combined schema
fingerprints.
Signed-off-by: Shiju <shiju@nvidia.com>
Public RPC contracts and durable protobuf formats have separate ownership. The `openshell.v1.OpenShell` service's request and response roots, streaming flags, and transitive message closure come from the public descriptor set generated by `openshell-core`. The `public_and_durable_schema_inventories_are_complete` test in `openshell-server` owns the counts and fingerprints and requires this inventory to be reviewed whenever it changes. Compute-driver, credential-driver, gateway-interceptor, and supervisor-middleware services are compiled contracts for internal extension boundaries.
338
+
339
+
`ReportEndpointStatus` is a sandbox-authenticated public gateway RPC. Its request, response, and `EndpointObservation` messages belong only to the public closure. `EndpointStatus` and `EndpointResult` also belong to the durable closure because `Sandbox.status.endpoint_statuses` persists them. The repeated status field uses a new wire tag; stored sandboxes without it decode with an empty endpoint list and retain their lifecycle fields. A fixed payload encoded with the earlier sandbox schema verifies that no database rewrite is required.
340
+
347
341
The removed `NetworkBinary.harness` field remains reserved by number and name,
348
342
so protobuf implementations cannot reuse its wire slot or source identifier.
349
343
The durable-policy compatibility decoder reads the former boolean before Prost
@@ -367,12 +361,7 @@ Go, Python, and TypeScript client generation inputs do not advertise them.
367
361
| Public messages used directly as encoded storage roots |`Sandbox`, `SandboxWorkloadTemplate`, `Provider`, `Workspace`, `WorkspaceMember`, `SshSession`, `ServiceEndpoint`| The generated public type is also the persisted payload. `SshSession` is not in the current public RPC message closure. |
368
362
| Embedded encoded root |`SandboxPolicy`| Stored in policy rows and inside the JSON settings envelope. |
369
363
370
-
The 12 encoded durable roots above have a closure of 81 messages and eight
The descriptor-derived test owns these full inventories; the tables here record
375
-
the reviewed roots and classifications.
364
+
The descriptor-derived test inventories the complete message and enum closure of the encoded durable roots and its intersection with the public RPC closure. The tables here record the reviewed roots and classifications.
Copy file name to clipboardExpand all lines: architecture/sandbox.md
+20Lines changed: 20 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -361,6 +361,26 @@ auth file without the acknowledgement, and the acknowledgement without an
361
361
auth file, so credentials are never sent in cleartext without an explicit
362
362
operator decision.
363
363
364
+
## Tool server connection status
365
+
366
+
A sandbox can be `Ready` while a call to an external tool server fails. For configured endpoints that use MCP over HTTP, OpenShell records the last observed network result beside the endpoint's address. Users can identify the server and distinguish policy denial, unavailable credentials, TLS or network failure, and an upstream HTTP rejection without combining client and supervisor logs. These observations do not affect sandbox lifecycle readiness.
367
+
368
+
```mermaid
369
+
flowchart LR
370
+
Traffic[Calls to configured tool servers] --> Observer[Observe network result]
371
+
Observer --> Reporter[Background reporter]
372
+
Reporter --> Gateway[Validate and store results]
373
+
Gateway --> Status[Endpoint address, last result, report time]
374
+
```
375
+
376
+
The gateway exposes one record per configured endpoint in `Sandbox.status.endpoint_statuses`. Each record contains its address, an opaque identifier, a typed result, and the time the gateway accepted that result. The address remains available when evidence resets to `NoObservedExchange`. Ordinary sandbox conditions continue to describe lifecycle and platform state.
377
+
378
+
Network observers send only the endpoint identifier and a fixed result classification, without credentials, payloads, or raw upstream errors. Requests capture observation authority before selecting policy or credentials, then bind the selected policy hash and provider revision to that capture. Observation handles also identify the installed endpoint inventory and supervisor authority, so a concurrent update cannot attribute an old request to a new configuration, and reinstalling the same configuration cannot revive an obsolete request. The sandbox reporter coalesces observations and retries an immutable snapshot through `ReportEndpointStatus`. Bounded delivery can drop observations, so endpoint status is not a complete request history.
379
+
380
+
The gateway validates the reporting supervisor's session, configuration revisions, and report sequence before atomically storing results. Global policy writes share the report's synchronization boundary. An effective policy change resets all endpoint evidence; repeated acknowledgements and metadata-only policy revisions preserve it. A provider environment change resets evidence for endpoints that depend on those credentials. Supervisor disconnection or replacement and gateway restart also invalidate observation authority. Identical report retries leave timestamps unchanged. After an inventory reset, still-valid pending evidence can be accepted again if an acknowledgement was lost, advancing the report time without another exchange.
381
+
382
+
These are passive observations with no expiry. `HttpResponseReceived` means the server returned a final HTTP status below 400, including a protocol upgrade; that response can still contain an MCP error. Informational responses alone do not establish success. MCP protocol-version and request-body policy rejections produce `PolicyDenied`. A failure before the HTTP path is known updates status only when the host and port identify one distinct endpoint. Ambiguous failures remain in structured events and logs. Results combine callers and effective ports for an endpoint. Consumers that need current tool availability must verify an actual operation. The sandbox management guide explains the public fields and results.
383
+
364
384
## Credentials
365
385
366
386
Provider credentials are stored at the gateway and fetched by the supervisor at
0 commit comments