agent-workspace-contract 0.7.0

Transport-neutral contracts for Agent Infra workspace APIs
Documentation
//! Run-scoped Workspace application operation contracts.

use super::*;

pub const EXECUTION_OPERATIONS_PATH: &str =
    "/internal/v1/workspace/execution-environment-operations";
pub const EXECUTION_OPERATION_CLEANUP_PATH: &str =
    "/internal/v1/workspace/execution-environment-operations/{operationId}/cleanup";

#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, ts_rs::TS)]
#[serde(tag = "kind", rename_all = "snake_case")]
pub enum ExecutionEnvironmentSource {
    Default,
    Snapshot { snapshot_id: String },
    Build { build: SnapshotBuildSpec },
}

#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, ts_rs::TS)]
#[serde(deny_unknown_fields, rename_all = "camelCase")]
pub struct ProvisionExecutionEnvironmentRequest {
    pub execution_id: String,
    pub provider: String,
    pub source: ExecutionEnvironmentSource,
    pub persistence: SpacePersistence,
    pub access_mode: SpaceAccessMode,
    pub ttl_ms: u64,
    #[serde(default = "default_poll_interval_ms")]
    pub poll_interval_ms: u64,
    #[serde(default = "default_poll_attempts")]
    pub max_poll_attempts: usize,
}

fn default_poll_interval_ms() -> u64 {
    1_000
}

fn default_poll_attempts() -> usize {
    600
}

#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, ts_rs::TS)]
#[serde(deny_unknown_fields, rename_all = "camelCase")]
pub struct ExecutionEnvironmentOperation {
    pub id: String,
    pub execution_id: String,
    pub provider: String,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub snapshot_id: Option<String>,
    pub built_snapshot: bool,
    pub computer_id: String,
    pub space_id: String,
    pub space_revision: u64,
    pub session_id: String,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub lease_id: Option<String>,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub fencing_token: Option<u64>,
    pub created_at_ms: u64,
}

#[derive(Clone, PartialEq, Eq, Serialize, Deserialize, ts_rs::TS)]
#[serde(deny_unknown_fields, rename_all = "camelCase")]
pub struct IssuedExecutionEnvironmentOperation {
    pub operation: ExecutionEnvironmentOperation,
    pub access_ticket_token: String,
}

impl std::fmt::Debug for IssuedExecutionEnvironmentOperation {
    fn fmt(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        formatter
            .debug_struct("IssuedExecutionEnvironmentOperation")
            .field("operation", &self.operation)
            .field("access_ticket_token", &"[REDACTED]")
            .finish()
    }
}

#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, ts_rs::TS)]
#[serde(deny_unknown_fields, rename_all = "camelCase")]
pub struct CleanupExecutionEnvironmentRequest {
    pub operation: ExecutionEnvironmentOperation,
}

#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize, ts_rs::TS)]
#[serde(deny_unknown_fields, rename_all = "camelCase")]
pub struct ExecutionEnvironmentCleanup {
    pub lease_released: bool,
    pub session_closed: bool,
    pub space_deleted: bool,
    pub computer_deleted: bool,
    pub snapshot_deleted: bool,
}