Skip to main content

agent_workspace_contract/environment/
commands.rs

1use serde::{Deserialize, Serialize};
2
3use crate::CommandSpec;
4
5pub const COMPUTER_COMMANDS_PATH: &str = "/internal/v1/workspace/computers/{computerId}/commands";
6pub const COMPUTER_COMMAND_PATH: &str =
7    "/internal/v1/workspace/computers/{computerId}/commands/{commandId}";
8pub const COMPUTER_COMMAND_OUTPUT_PATH: &str =
9    "/internal/v1/workspace/computers/{computerId}/commands/{commandId}/output";
10pub const COMPUTER_COMMAND_CANCEL_PATH: &str =
11    "/internal/v1/workspace/computers/{computerId}/commands/{commandId}/cancel";
12pub const COMPUTER_OWNERS_PATH: &str = "/internal/v1/workspace/computers/{computerId}/owners";
13pub const SPACE_OWNERS_PATH: &str = "/internal/v1/workspace/spaces/{spaceId}/owners";
14
15#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
16#[serde(rename_all = "snake_case")]
17pub enum ComputerCommandState {
18    Queued,
19    Running,
20    Succeeded,
21    Failed,
22    Canceling,
23    Canceled,
24}
25
26#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
27#[serde(deny_unknown_fields, rename_all = "camelCase")]
28pub struct CreateComputerCommandRequest {
29    pub space_id: String,
30    #[serde(default, skip_serializing_if = "Option::is_none")]
31    pub id: Option<String>,
32    pub command: CommandSpec,
33}
34
35#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
36#[serde(deny_unknown_fields, rename_all = "camelCase")]
37pub struct ComputerCommandResource {
38    pub id: String,
39    pub computer_id: String,
40    pub space_id: String,
41    pub spec: CommandSpec,
42    pub state: ComputerCommandState,
43    pub output_end_cursor: u64,
44    pub output_truncated: bool,
45    pub version: u64,
46    pub created_at_ms: u64,
47    pub updated_at_ms: u64,
48    #[serde(default, skip_serializing_if = "Option::is_none")]
49    pub exit_code: Option<i32>,
50    #[serde(default, skip_serializing_if = "Option::is_none")]
51    pub error_code: Option<String>,
52}
53
54#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
55#[serde(rename_all = "camelCase")]
56pub struct ComputerCommandOutputPage {
57    pub chunks: Vec<ComputerCommandOutputChunk>,
58    #[serde(default, skip_serializing_if = "Option::is_none")]
59    pub next_cursor: Option<u64>,
60    pub truncated: bool,
61}
62
63#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
64#[serde(rename_all = "camelCase")]
65pub struct ComputerCommandOutputChunk {
66    pub stream: ComputerCommandOutputStream,
67    pub content: String,
68    pub cursor: u64,
69}
70
71#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
72#[serde(rename_all = "snake_case")]
73pub enum ComputerCommandOutputStream {
74    Stdout,
75    Stderr,
76}
77
78/// Synchronous provider command result. The control plane may persist chunks.
79#[derive(Debug, Clone, PartialEq, Eq)]
80pub struct ProviderCommandOutput {
81    pub exit_code: Option<i32>,
82    pub stdout: String,
83    pub stderr: String,
84    pub truncated: bool,
85}