Skip to main content

agent_workspace_contract/environment/
execution_operation.rs

1//! Run-scoped Workspace application operation contracts.
2
3use super::*;
4
5pub const EXECUTION_OPERATIONS_PATH: &str =
6    "/internal/v1/workspace/execution-environment-operations";
7pub const EXECUTION_OPERATION_CLEANUP_PATH: &str =
8    "/internal/v1/workspace/execution-environment-operations/{operationId}/cleanup";
9
10#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, ts_rs::TS)]
11#[serde(tag = "kind", rename_all = "snake_case")]
12pub enum ExecutionEnvironmentSource {
13    Default,
14    Snapshot { snapshot_id: String },
15    Build { build: SnapshotBuildSpec },
16}
17
18#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, ts_rs::TS)]
19#[serde(deny_unknown_fields, rename_all = "camelCase")]
20pub struct ProvisionExecutionEnvironmentRequest {
21    pub execution_id: String,
22    pub provider: String,
23    pub source: ExecutionEnvironmentSource,
24    pub persistence: SpacePersistence,
25    pub access_mode: SpaceAccessMode,
26    pub ttl_ms: u64,
27    #[serde(default = "default_poll_interval_ms")]
28    pub poll_interval_ms: u64,
29    #[serde(default = "default_poll_attempts")]
30    pub max_poll_attempts: usize,
31}
32
33fn default_poll_interval_ms() -> u64 {
34    1_000
35}
36
37fn default_poll_attempts() -> usize {
38    600
39}
40
41#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, ts_rs::TS)]
42#[serde(deny_unknown_fields, rename_all = "camelCase")]
43pub struct ExecutionEnvironmentOperation {
44    pub id: String,
45    pub execution_id: String,
46    pub provider: String,
47    #[serde(default, skip_serializing_if = "Option::is_none")]
48    pub snapshot_id: Option<String>,
49    pub built_snapshot: bool,
50    pub computer_id: String,
51    pub space_id: String,
52    pub space_revision: u64,
53    pub session_id: String,
54    #[serde(default, skip_serializing_if = "Option::is_none")]
55    pub lease_id: Option<String>,
56    #[serde(default, skip_serializing_if = "Option::is_none")]
57    pub fencing_token: Option<u64>,
58    pub created_at_ms: u64,
59}
60
61#[derive(Clone, PartialEq, Eq, Serialize, Deserialize, ts_rs::TS)]
62#[serde(deny_unknown_fields, rename_all = "camelCase")]
63pub struct IssuedExecutionEnvironmentOperation {
64    pub operation: ExecutionEnvironmentOperation,
65    pub access_ticket_token: String,
66}
67
68impl std::fmt::Debug for IssuedExecutionEnvironmentOperation {
69    fn fmt(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
70        formatter
71            .debug_struct("IssuedExecutionEnvironmentOperation")
72            .field("operation", &self.operation)
73            .field("access_ticket_token", &"[REDACTED]")
74            .finish()
75    }
76}
77
78#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, ts_rs::TS)]
79#[serde(deny_unknown_fields, rename_all = "camelCase")]
80pub struct CleanupExecutionEnvironmentRequest {
81    pub operation: ExecutionEnvironmentOperation,
82}
83
84#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize, ts_rs::TS)]
85#[serde(deny_unknown_fields, rename_all = "camelCase")]
86pub struct ExecutionEnvironmentCleanup {
87    pub lease_released: bool,
88    pub session_closed: bool,
89    pub space_deleted: bool,
90    pub computer_deleted: bool,
91    pub snapshot_deleted: bool,
92}