agent_workspace_contract/
workspace_policy.rs1use 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";