agent-workspace-contract 0.7.0

Transport-neutral contracts for Agent Infra workspace APIs
Documentation
//! Long-lived Harness workload contracts owned by Workspace Environment.

use serde::{Deserialize, Serialize};

use crate::{CommandSpec, ResourceScope};

pub const MANAGED_WORKLOADS_PATH: &str = "/internal/v1/workspace/managed-workloads";
pub const MANAGED_WORKLOAD_PATH: &str = "/internal/v1/workspace/managed-workloads/{workloadId}";
pub const MANAGED_WORKLOAD_STOP_PATH: &str =
    "/internal/v1/workspace/managed-workloads/{workloadId}/stop";

#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum ManagedWorkloadIsolation {
    Direct,
    Sandbox,
}

#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum ManagedWorkloadState {
    Running,
    Ready,
    Succeeded,
    Failed,
    Stopping,
    Stopped,
}

#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(deny_unknown_fields, rename_all = "camelCase")]
pub struct CreateManagedWorkloadRequest {
    pub runtime_id: String,
    pub computer_id: String,
    pub space_id: String,
    pub isolation: ManagedWorkloadIsolation,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub template_id: Option<String>,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub template_version: Option<String>,
    pub bundle_digest: String,
    #[serde(with = "super::base64_bytes")]
    pub bundle_content: Vec<u8>,
    pub readiness_path: String,
    /// Ports whose provider authorities must be trusted by the workload's HTTP server.
    #[serde(default, skip_serializing_if = "Vec::is_empty")]
    pub preview_ports: Vec<u16>,
    pub command: CommandSpec,
}

#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(deny_unknown_fields, rename_all = "camelCase")]
pub struct ManagedWorkload {
    pub id: String,
    pub scope: ResourceScope,
    pub runtime_id: String,
    pub computer_id: String,
    pub space_id: String,
    pub isolation: ManagedWorkloadIsolation,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub template_id: Option<String>,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub template_version: Option<String>,
    pub bundle_digest: String,
    pub bundle_path: String,
    pub readiness_path: String,
    pub command_id: String,
    pub command: CommandSpec,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub sandbox_id: Option<String>,
    pub state: ManagedWorkloadState,
    pub revision: u64,
    pub created_at_ms: u64,
    pub updated_at_ms: u64,
}

#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(deny_unknown_fields, rename_all = "camelCase")]
pub struct ManagedWorkloadResource {
    pub id: String,
    pub runtime_id: String,
    pub computer_id: String,
    pub space_id: String,
    pub isolation: ManagedWorkloadIsolation,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub template_id: Option<String>,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub template_version: Option<String>,
    pub bundle_digest: String,
    pub bundle_path: String,
    pub readiness_path: String,
    pub command_id: String,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub sandbox_id: Option<String>,
    pub state: ManagedWorkloadState,
    pub revision: u64,
    pub created_at_ms: u64,
    pub updated_at_ms: u64,
}

impl From<ManagedWorkload> for ManagedWorkloadResource {
    fn from(record: ManagedWorkload) -> Self {
        Self {
            id: record.id,
            runtime_id: record.runtime_id,
            computer_id: record.computer_id,
            space_id: record.space_id,
            isolation: record.isolation,
            template_id: record.template_id,
            template_version: record.template_version,
            bundle_digest: record.bundle_digest,
            bundle_path: record.bundle_path,
            readiness_path: record.readiness_path,
            command_id: record.command_id,
            sandbox_id: record.sandbox_id,
            state: record.state,
            revision: record.revision,
            created_at_ms: record.created_at_ms,
            updated_at_ms: record.updated_at_ms,
        }
    }
}