supercode_interchange/orchestration/
worker.rs1use std::collections::BTreeMap;
4
5use schemars::JsonSchema;
6use serde::{Deserialize, Serialize};
7
8use crate::ontology::{HarnessId, SecretRef};
9
10#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
12#[serde(untagged)]
13pub enum EnvValue {
14 Literal(String),
16 Secret(SecretRef),
18}
19
20#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema, Default)]
22#[serde(rename_all = "snake_case")]
23pub enum PermissionDefault {
24 #[default]
26 Deny,
27 Allow,
29}
30
31#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema, Default)]
34#[serde(rename_all = "snake_case")]
35pub enum PermissionUnattended {
36 #[default]
38 Deny,
39 Approve,
41}
42
43impl PermissionUnattended {
44 fn is_deny(&self) -> bool {
45 *self == Self::Deny
46 }
47}
48
49#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
51pub struct PermissionPolicy {
52 #[serde(default = "default_permission_timeout")]
54 pub timeout_seconds: u32,
55 #[serde(default)]
57 pub default: PermissionDefault,
58 #[serde(default, skip_serializing_if = "PermissionUnattended::is_deny")]
60 pub unattended: PermissionUnattended,
61}
62
63fn default_permission_timeout() -> u32 {
64 300
65}
66
67impl Default for PermissionPolicy {
68 fn default() -> Self {
69 Self {
70 timeout_seconds: 300,
71 default: PermissionDefault::Deny,
72 unattended: PermissionUnattended::Deny,
73 }
74 }
75}
76
77#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
79pub struct WorkerSpec {
80 pub harness: HarnessId,
82 #[serde(default)]
84 pub model: Option<String>,
85 #[serde(default)]
87 pub preset: Option<String>,
88 #[serde(default = "default_cwd")]
90 pub cwd: String,
91 #[serde(default)]
93 pub env: BTreeMap<String, EnvValue>,
94 #[serde(default)]
96 pub permission: PermissionPolicy,
97}
98
99fn default_cwd() -> String {
100 ".".to_string()
101}