Skip to main content

agent_workspace_contract/
workspace_policy.rs

1//! Durable Workspace allocation policies and execution bindings; provider identities stay internal.
2use crate::{OwnerRef, PrincipalRef, ResourceScope, SpacePersistence};
3use serde::{Deserialize, Serialize};
4
5#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
6#[serde(rename_all = "snake_case")]
7pub enum WorkspacePolicyScope {
8    Agent,
9    AgentUser,
10    Session,
11    Request,
12}
13
14#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
15#[serde(
16    tag = "type",
17    rename_all = "snake_case",
18    rename_all_fields = "camelCase",
19    deny_unknown_fields
20)]
21pub enum WorkspacePolicySource {
22    Snapshot {
23        snapshot_id: String,
24        provider: String,
25    },
26    ExistingSpace {
27        workspace_id: String,
28    },
29}
30
31#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
32#[serde(rename_all = "camelCase", deny_unknown_fields)]
33pub struct WorkspacePolicyDefinition {
34    pub scope: WorkspacePolicyScope,
35    pub source: WorkspacePolicySource,
36    pub persistence: SpacePersistence,
37}
38
39#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
40#[serde(rename_all = "camelCase", deny_unknown_fields)]
41pub struct CreateWorkspacePolicyRequest {
42    pub name: String,
43    pub definition: WorkspacePolicyDefinition,
44    #[serde(default)]
45    pub owners: Vec<OwnerRef>,
46}
47
48#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
49#[serde(rename_all = "camelCase", deny_unknown_fields)]
50pub struct UpdateWorkspacePolicyRequest {
51    pub expected_revision: u64,
52    pub name: String,
53    pub definition: WorkspacePolicyDefinition,
54}
55
56#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
57#[serde(rename_all = "camelCase", deny_unknown_fields)]
58pub struct WorkspacePolicyRecord {
59    pub id: String,
60    pub scope: ResourceScope,
61    pub name: String,
62    pub revision: u64,
63    pub definition: WorkspacePolicyDefinition,
64    pub owners: Vec<OwnerRef>,
65    pub creator: PrincipalRef,
66    pub created_at_ms: u64,
67    pub updated_at_ms: u64,
68}
69
70#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
71#[serde(rename_all = "camelCase", deny_unknown_fields)]
72pub struct ResolveWorkspacePolicyRequest {
73    pub agent_id: String,
74    pub runtime_id: String,
75    #[serde(default)]
76    pub user_id: Option<String>,
77    #[serde(default)]
78    pub conversation_id: Option<String>,
79    pub execution_id: String,
80}
81
82#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
83#[serde(rename_all = "snake_case")]
84pub enum WorkspaceBindingState {
85    Provisioning,
86    Ready,
87    Releasing,
88    Released,
89}
90
91#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
92#[serde(rename_all = "camelCase", deny_unknown_fields)]
93pub struct WorkspacePolicyBinding {
94    pub id: String,
95    pub scope: ResourceScope,
96    pub policy_id: String,
97    pub policy_revision: u64,
98    pub definition: WorkspacePolicyDefinition,
99    pub subject: ResolveWorkspacePolicyRequest,
100    pub creator: PrincipalRef,
101    pub owners: Vec<OwnerRef>,
102    pub state: WorkspaceBindingState,
103    pub workspace_id: Option<String>,
104    pub computer_id: Option<String>,
105    pub created_at_ms: u64,
106    pub updated_at_ms: u64,
107}
108
109pub const WORKSPACE_POLICIES_PATH: &str = "/internal/v1/workspace/policies";
110pub const WORKSPACE_POLICY_PATH: &str = "/internal/v1/workspace/policies/{policyId}";
111pub const WORKSPACE_POLICY_RESOLVE_PATH: &str =
112    "/internal/v1/workspace/policies/{policyId}/resolve";
113pub const WORKSPACE_POLICY_BINDING_PATH: &str =
114    "/internal/v1/workspace/policy-bindings/{bindingId}";
115pub const WORKSPACE_POLICY_BINDING_RELEASE_PATH: &str =
116    "/internal/v1/workspace/policy-bindings/{bindingId}/release";