agent-workspace-contract 0.7.0

Transport-neutral contracts for Agent Infra workspace APIs
Documentation
//! Durable Workspace allocation policies and execution bindings; provider identities stay internal.
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";