use crate::{OwnerRef, PrincipalRef, ResourceScope, SpacePersistence};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum WorkspacePolicyScope {
Agent,
AgentUser,
Session,
Request,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(
tag = "type",
rename_all = "snake_case",
rename_all_fields = "camelCase",
deny_unknown_fields
)]
pub enum WorkspacePolicySource {
Snapshot {
snapshot_id: String,
provider: String,
},
ExistingSpace {
workspace_id: String,
},
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase", deny_unknown_fields)]
pub struct WorkspacePolicyDefinition {
pub scope: WorkspacePolicyScope,
pub source: WorkspacePolicySource,
pub persistence: SpacePersistence,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase", deny_unknown_fields)]
pub struct CreateWorkspacePolicyRequest {
pub name: String,
pub definition: WorkspacePolicyDefinition,
#[serde(default)]
pub owners: Vec<OwnerRef>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase", deny_unknown_fields)]
pub struct UpdateWorkspacePolicyRequest {
pub expected_revision: u64,
pub name: String,
pub definition: WorkspacePolicyDefinition,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase", deny_unknown_fields)]
pub struct WorkspacePolicyRecord {
pub id: String,
pub scope: ResourceScope,
pub name: String,
pub revision: u64,
pub definition: WorkspacePolicyDefinition,
pub owners: Vec<OwnerRef>,
pub creator: PrincipalRef,
pub created_at_ms: u64,
pub updated_at_ms: u64,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase", deny_unknown_fields)]
pub struct ResolveWorkspacePolicyRequest {
pub agent_id: String,
pub runtime_id: String,
#[serde(default)]
pub user_id: Option<String>,
#[serde(default)]
pub conversation_id: Option<String>,
pub execution_id: String,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum WorkspaceBindingState {
Provisioning,
Ready,
Releasing,
Released,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase", deny_unknown_fields)]
pub struct WorkspacePolicyBinding {
pub id: String,
pub scope: ResourceScope,
pub policy_id: String,
pub policy_revision: u64,
pub definition: WorkspacePolicyDefinition,
pub subject: ResolveWorkspacePolicyRequest,
pub creator: PrincipalRef,
pub owners: Vec<OwnerRef>,
pub state: WorkspaceBindingState,
pub workspace_id: Option<String>,
pub computer_id: Option<String>,
pub created_at_ms: u64,
pub updated_at_ms: u64,
}
pub const WORKSPACE_POLICIES_PATH: &str = "/internal/v1/workspace/policies";
pub const WORKSPACE_POLICY_PATH: &str = "/internal/v1/workspace/policies/{policyId}";
pub const WORKSPACE_POLICY_RESOLVE_PATH: &str =
"/internal/v1/workspace/policies/{policyId}/resolve";
pub const WORKSPACE_POLICY_BINDING_PATH: &str =
"/internal/v1/workspace/policy-bindings/{bindingId}";
pub const WORKSPACE_POLICY_BINDING_RELEASE_PATH: &str =
"/internal/v1/workspace/policy-bindings/{bindingId}/release";