Skip to main content

agent_workspace_contract/environment/
catalog.rs

1use super::*;
2
3#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default)]
4#[serde(rename_all = "snake_case")]
5pub enum SnapshotVisibility {
6    #[default]
7    Private,
8    Public,
9}
10
11#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
12#[serde(tag = "kind", rename_all = "snake_case")]
13pub enum SnapshotBuildSpec {
14    Dockerfile {
15        dockerfile: String,
16    },
17    Template {
18        pip_packages: String,
19    },
20    Git {
21        #[serde(rename = "gitUrl", alias = "git_url")]
22        git_url: String,
23        #[serde(default, rename = "gitRef", alias = "git_ref")]
24        git_ref: String,
25    },
26}
27
28/// Product-facing snapshot recipe size limits. The build adapters impose
29/// additional limits on fetched repository contents and generated archives.
30pub const SNAPSHOT_DOCKERFILE_MAX_BYTES: usize = 1024 * 1024;
31pub const SNAPSHOT_TEMPLATE_PACKAGES_MAX_BYTES: usize = 64 * 1024;
32
33#[derive(Debug, Clone, Default, PartialEq, Eq)]
34pub struct EnvironmentCatalogConfig {
35    pub default_provider: Option<String>,
36    pub default_snapshot_id: Option<String>,
37    pub default_builds: BTreeMap<String, SnapshotBuildSpec>,
38}
39
40#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
41#[serde(deny_unknown_fields, rename_all = "camelCase")]
42pub struct CreateSnapshotResourceRequest {
43    #[serde(default, skip_serializing_if = "Option::is_none")]
44    pub provider: Option<String>,
45    #[serde(default)]
46    pub visibility: SnapshotVisibility,
47    #[serde(default)]
48    pub owners: Vec<OwnerRef>,
49    #[serde(default)]
50    pub builtin: bool,
51    #[serde(default, skip_serializing_if = "Option::is_none")]
52    pub build: Option<SnapshotBuildSpec>,
53}
54
55#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
56#[serde(deny_unknown_fields, rename_all = "camelCase")]
57pub struct BuildBuiltinSnapshotRequest {
58    pub provider: String,
59    #[serde(default)]
60    pub set_default: bool,
61    #[serde(default, skip_serializing_if = "Option::is_none")]
62    pub git_url: Option<String>,
63    #[serde(default, skip_serializing_if = "Option::is_none")]
64    pub git_ref: Option<String>,
65    #[serde(default, skip_serializing_if = "Option::is_none")]
66    pub dockerfile: Option<String>,
67}
68
69pub const ADMIN_BUILD_BUILTIN_SNAPSHOTS_PATH: &str = "/admin/api/workspace-snapshots:build-builtin";
70pub const ADMIN_SNAPSHOTS_PATH: &str = "/admin/api/workspace-snapshots";
71
72/// Build-only port. Implementations must not create Computer or Sandbox instances.
73#[async_trait]
74pub trait EnvironmentBuildPort: Send + Sync + Debug {
75    async fn build_environment_image(
76        &self,
77        provider: &str,
78        spec: &SnapshotBuildSpec,
79        idempotency_key: &str,
80    ) -> Result<ProviderResourceRef>;
81}