1use serde::{Deserialize, Serialize};
2
3#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
5#[serde(rename_all = "lowercase")]
6pub enum SecurityProfile {
7 Permissive,
8 Moderate,
9 Restrictive,
10}
11
12#[derive(Debug, Default, Serialize)]
14pub struct RunOptions {
15 #[serde(skip_serializing_if = "Option::is_none")]
16 pub image: Option<String>,
17 #[serde(skip_serializing_if = "Option::is_none")]
18 pub profile: Option<SecurityProfile>,
19 #[serde(skip_serializing_if = "Option::is_none")]
20 pub fast: Option<bool>,
21}
22
23#[derive(Debug, Deserialize)]
25pub struct RunOutput {
26 pub output: String,
27}
28
29#[derive(Debug, Deserialize)]
31pub struct SandboxInfo {
32 pub name: String,
33 pub status: String,
34 pub backend: String,
35 pub image: Option<String>,
36 pub vcpus: Option<u32>,
37 pub memory_mb: Option<u64>,
38 pub created_at: Option<String>,
39}
40
41#[derive(Debug)]
43pub struct StreamEvent {
44 pub event_type: String,
45 pub data: serde_json::Value,
46}
47
48#[derive(Debug, Deserialize)]
50pub(crate) struct ApiResponse<T> {
51 pub success: bool,
52 pub data: Option<T>,
53 pub error: Option<String>,
54}
55
56#[derive(Serialize)]
58pub(crate) struct RunRequest {
59 pub command: Vec<String>,
60 #[serde(skip_serializing_if = "Option::is_none")]
61 pub image: Option<String>,
62 #[serde(skip_serializing_if = "Option::is_none")]
63 pub profile: Option<SecurityProfile>,
64 pub fast: bool,
65}
66
67#[derive(Debug, Default, Serialize)]
69pub struct CreateSandboxOptions {
70 #[serde(skip_serializing_if = "Option::is_none")]
72 pub image: Option<String>,
73 #[serde(skip_serializing_if = "Option::is_none")]
74 pub vcpus: Option<u32>,
75 #[serde(skip_serializing_if = "Option::is_none")]
76 pub memory_mb: Option<u64>,
77 #[serde(skip_serializing_if = "Option::is_none")]
78 pub profile: Option<SecurityProfile>,
79 #[serde(skip_serializing_if = "Option::is_none")]
81 pub source_url: Option<String>,
82 #[serde(skip_serializing_if = "Option::is_none")]
84 pub source_ref: Option<String>,
85 #[serde(skip_serializing_if = "Vec::is_empty")]
87 #[serde(default)]
88 pub volumes: Vec<String>,
89 #[serde(skip_serializing_if = "Vec::is_empty")]
93 #[serde(default)]
94 pub secrets: Vec<String>,
95 #[serde(skip_serializing_if = "Vec::is_empty")]
98 #[serde(default)]
99 pub secret_files: Vec<String>,
100}
101
102#[derive(Serialize)]
104pub(crate) struct CreateRequest {
105 pub name: String,
106 #[serde(skip_serializing_if = "Option::is_none")]
107 pub image: Option<String>,
108 #[serde(skip_serializing_if = "Option::is_none")]
109 pub vcpus: Option<u32>,
110 #[serde(skip_serializing_if = "Option::is_none")]
111 pub memory_mb: Option<u64>,
112 #[serde(skip_serializing_if = "Option::is_none")]
113 pub profile: Option<SecurityProfile>,
114 #[serde(skip_serializing_if = "Option::is_none")]
115 pub source_url: Option<String>,
116 #[serde(skip_serializing_if = "Option::is_none")]
117 pub source_ref: Option<String>,
118 #[serde(skip_serializing_if = "Vec::is_empty")]
119 #[serde(default)]
120 pub volumes: Vec<String>,
121 #[serde(skip_serializing_if = "Vec::is_empty")]
122 #[serde(default)]
123 pub secrets: Vec<String>,
124 #[serde(skip_serializing_if = "Vec::is_empty")]
125 #[serde(default)]
126 pub secret_files: Vec<String>,
127}
128
129#[derive(Debug, Default, Serialize)]
131pub struct ExecOptions {
132 #[serde(skip_serializing_if = "Vec::is_empty")]
134 pub env: Vec<String>,
135 #[serde(skip_serializing_if = "Option::is_none")]
137 pub workdir: Option<String>,
138 #[serde(skip_serializing_if = "Option::is_none")]
140 pub sudo: Option<bool>,
141}
142
143#[derive(Serialize)]
145pub(crate) struct ExecRequest {
146 pub command: Vec<String>,
147 #[serde(skip_serializing_if = "Vec::is_empty")]
148 pub env: Vec<String>,
149 #[serde(skip_serializing_if = "Option::is_none")]
150 pub workdir: Option<String>,
151 #[serde(skip_serializing_if = "Option::is_none")]
152 pub sudo: Option<bool>,
153}
154
155#[derive(Serialize)]
157pub(crate) struct FileWriteRequest {
158 pub content: String,
159 #[serde(skip_serializing_if = "Option::is_none")]
160 pub encoding: Option<String>,
161}
162
163#[derive(Debug, Deserialize)]
165pub struct FileReadResponse {
166 pub content: String,
167 pub encoding: String,
168 pub size: usize,
169}
170
171#[derive(Serialize)]
173pub(crate) struct BatchRunRequest {
174 pub commands: Vec<BatchCommand>,
175}
176
177#[derive(Debug, Serialize)]
179pub struct BatchCommand {
180 pub command: Vec<String>,
181}
182
183#[derive(Debug, Deserialize)]
185pub struct BatchResult {
186 pub output: Option<String>,
187 pub error: Option<String>,
188}
189
190#[derive(Debug, Deserialize)]
192pub struct BatchRunResponse {
193 pub results: Vec<BatchResult>,
194}
195
196#[derive(Serialize)]
198pub(crate) struct BatchFileWriteRequest {
199 pub files: std::collections::HashMap<String, String>,
200}
201
202#[derive(Debug, Deserialize)]
204pub struct BatchFileWriteResponse {
205 pub written: usize,
206}
207
208#[derive(Debug, Deserialize)]
210pub struct ExtendTtlResponse {
211 pub expires_at: Option<String>,
212}
213
214#[derive(Serialize)]
216pub(crate) struct ExtendTtlRequest {
217 pub by: String,
218}
219
220#[derive(Debug, Deserialize)]
222pub struct SnapshotMeta {
223 pub name: String,
224 pub sandbox: String,
225 pub image_tag: String,
226 pub backend: String,
227 pub base_image: Option<String>,
228 pub vcpus: Option<u32>,
229 pub memory_mb: Option<u64>,
230 pub created_at: String,
231}
232
233#[derive(Debug, Default, Serialize)]
235pub struct TakeSnapshotOptions {
236 pub sandbox: String,
237 #[serde(skip_serializing_if = "Option::is_none")]
238 pub name: Option<String>,
239}
240
241#[derive(Debug, Clone, PartialEq, Eq, Deserialize)]
243#[serde(rename_all = "lowercase")]
244pub enum DetachedStatus {
245 Running,
246 Completed,
247 Failed,
248}
249
250#[derive(Debug, Deserialize)]
252pub struct DetachedCommand {
253 pub id: String,
254 pub sandbox: String,
255 pub command: Vec<String>,
256 pub pid: u32,
257 pub status: DetachedStatus,
258 pub exit_code: Option<i32>,
259 pub started_at: String,
260}
261
262#[derive(Debug, Deserialize)]
264pub struct DetachedLogsResponse {
265 pub stdout: Option<String>,
266 pub stderr: Option<String>,
267}
268
269#[derive(Debug, Clone, Serialize, Deserialize)]
273pub struct PageLink {
274 pub text: String,
275 pub href: String,
276}
277
278#[derive(Debug, Clone, Serialize, Deserialize)]
280pub struct PageResult {
281 pub title: String,
282 pub url: String,
283 pub text: String,
284 pub links: Vec<PageLink>,
285}
286
287#[derive(Debug, Clone, Serialize, Deserialize)]
289pub struct AriaSnapshot {
290 pub snapshot: String,
292 pub url: String,
294 pub title: String,
296 #[serde(default)]
298 pub refs: Vec<String>,
299}
300
301#[derive(Debug, Clone, Serialize, Deserialize)]
303pub struct BrowserEvent {
304 pub seq: u64,
306 #[serde(rename = "type")]
308 pub event_type: String,
309 pub page: String,
311 pub ts: String,
313}