agent-workspace-contract 0.5.0

Transport-neutral contracts for Agent Infra workspace APIs
Documentation
use serde::{Deserialize, Serialize};

use crate::CommandSpec;

pub const COMPUTER_COMMANDS_PATH: &str = "/internal/v1/workspace/computers/{computerId}/commands";
pub const COMPUTER_COMMAND_PATH: &str =
    "/internal/v1/workspace/computers/{computerId}/commands/{commandId}";
pub const COMPUTER_COMMAND_OUTPUT_PATH: &str =
    "/internal/v1/workspace/computers/{computerId}/commands/{commandId}/output";
pub const COMPUTER_COMMAND_CANCEL_PATH: &str =
    "/internal/v1/workspace/computers/{computerId}/commands/{commandId}/cancel";
pub const COMPUTER_OWNERS_PATH: &str = "/internal/v1/workspace/computers/{computerId}/owners";
pub const SPACE_OWNERS_PATH: &str = "/internal/v1/workspace/spaces/{spaceId}/owners";

#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum ComputerCommandState {
    Queued,
    Running,
    Succeeded,
    Failed,
    Canceling,
    Canceled,
}

#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(deny_unknown_fields, rename_all = "camelCase")]
pub struct CreateComputerCommandRequest {
    pub space_id: String,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub id: Option<String>,
    pub command: CommandSpec,
}

#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(deny_unknown_fields, rename_all = "camelCase")]
pub struct ComputerCommandResource {
    pub id: String,
    pub computer_id: String,
    pub space_id: String,
    pub spec: CommandSpec,
    pub state: ComputerCommandState,
    pub output_end_cursor: u64,
    pub output_truncated: bool,
    pub version: u64,
    pub created_at_ms: u64,
    pub updated_at_ms: u64,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub exit_code: Option<i32>,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub error_code: Option<String>,
}

#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ComputerCommandOutputPage {
    pub chunks: Vec<ComputerCommandOutputChunk>,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub next_cursor: Option<u64>,
    pub truncated: bool,
}

#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ComputerCommandOutputChunk {
    pub stream: ComputerCommandOutputStream,
    pub content: String,
    pub cursor: u64,
}

#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum ComputerCommandOutputStream {
    Stdout,
    Stderr,
}

/// Synchronous provider command result. The control plane may persist chunks.
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ProviderCommandOutput {
    pub exit_code: Option<i32>,
    pub stdout: String,
    pub stderr: String,
    pub truncated: bool,
}