@@ -5,10 +5,13 @@ syntax = "proto3";
55
66package openshell.datamodel.v1 ;
77
8+ import "options.proto" ;
9+
810// Kubernetes-style metadata shared by all top-level OpenShell domain objects.
911//
10- // This structure provides consistent metadata (identity, labels, timestamps,
11- // resource versioning) across Sandbox, Provider, SshSession, and other resources.
12+ // This structure provides consistent metadata (identity, labels, annotations,
13+ // timestamps, resource versioning) across Sandbox, Provider, SshSession, and
14+ // other resources.
1215message ObjectMeta {
1316 // Stable object ID generated by the gateway.
1417 string id = 1 ;
@@ -26,6 +29,43 @@ message ObjectMeta {
2629 // Optimistic concurrency control version.
2730 // Incremented by the gateway on each update. Clients can use this for compare-and-swap operations.
2831 uint64 resource_version = 5 ;
32+
33+ // Opaque key-value metadata that is not used for selectors.
34+ // Annotation keys use the same qualified-key shape as labels, but values may be longer.
35+ map <string , string > annotations = 6 ;
36+
37+ // Workspace that owns this resource. Empty is normalized to "default" by the
38+ // gateway. Immutable after creation.
39+ string workspace = 7 ;
40+
41+ // Milliseconds since Unix epoch when graceful deletion was initiated.
42+ // Zero means the object is not being deleted. Once set, this field is
43+ // immutable — the only path forward is completing deletion.
44+ int64 deletion_timestamp_ms = 8 ;
45+ }
46+
47+ // Phase of a workspace's lifecycle.
48+ enum WorkspacePhase {
49+ WORKSPACE_PHASE_UNSPECIFIED = 0 ;
50+ WORKSPACE_PHASE_ACTIVE = 1 ;
51+ WORKSPACE_PHASE_TERMINATING = 2 ;
52+ }
53+
54+ // Status of a workspace.
55+ message WorkspaceStatus {
56+ WorkspacePhase phase = 1 ;
57+ }
58+
59+ // Workspace resource. A hard isolation boundary for sandboxes, providers, and
60+ // other workspace-scoped resources.
61+ message Workspace {
62+ // Kubernetes-style metadata (id, name, labels, timestamps, resource version).
63+ // The workspace field in this ObjectMeta is unused (a workspace does not
64+ // belong to another workspace).
65+ ObjectMeta metadata = 1 ;
66+
67+ // Current lifecycle status.
68+ WorkspaceStatus status = 2 ;
2969}
3070
3171// Provider model stored by OpenShell.
@@ -35,10 +75,14 @@ message Provider {
3575 // Canonical provider type slug (for example: "claude", "gitlab").
3676 string type = 2 ;
3777 // Secret values used for authentication.
38- map <string , string > credentials = 3 ;
78+ map <string , string > credentials = 3 [ (openshell.options.v1 .secret ) = true ] ;
3979 // Non-secret provider configuration.
4080 map <string , string > config = 4 ;
4181 // Expiration timestamps for credential values, keyed by credential/env var
4282 // name. A zero or missing value means the credential does not expire.
4383 map <string , int64 > credential_expires_at_ms = 5 ;
84+ // Workspace where this provider's type profile is stored.
85+ // Empty string = platform/global scope. Must be empty or match
86+ // metadata.workspace; cross-workspace references are rejected.
87+ string profile_workspace = 6 ;
4488}
0 commit comments