@claxedo/sandbox-manager 0.6.0 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +60 -15
- package/dist/checkpoint-manager.d.ts +47 -0
- package/dist/checkpoint-manager.mjs +116 -0
- package/dist/daytona-allow-list.d.ts +11 -0
- package/dist/daytona-allow-list.mjs +5 -1
- package/dist/driver-catalog.d.ts +5 -52
- package/dist/driver-catalog.mjs +263 -121
- package/dist/drivers/box.mjs +309 -39
- package/dist/drivers/cloudflare.d.ts +18 -7
- package/dist/drivers/cloudflare.mjs +423 -34
- package/dist/drivers/daytona.d.ts +82 -13
- package/dist/drivers/daytona.mjs +495 -45
- package/dist/drivers/docker.mjs +284 -38
- package/dist/drivers/exe.d.ts +26 -0
- package/dist/drivers/exe.mjs +492 -0
- package/dist/drivers/fetch-bridge.mjs +29 -5
- package/dist/drivers/modal.d.ts +2 -5
- package/dist/drivers/modal.mjs +296 -46
- package/dist/drivers/transient-error.d.ts +11 -0
- package/dist/drivers/vercel.d.ts +27 -11
- package/dist/drivers/vercel.mjs +339 -59
- package/dist/hosted-network-policy.d.ts +87 -0
- package/dist/hosted-network-policy.mjs +61 -0
- package/dist/image-name.mjs +34 -0
- package/dist/image.d.ts +18 -3
- package/dist/image.mjs +47 -32
- package/dist/index.d.ts +281 -17
- package/dist/index.mjs +393 -26
- package/dist/json.d.ts +13 -0
- package/dist/lease-policy.d.ts +6 -3
- package/dist/lease-policy.mjs +213 -54
- package/dist/lease-types.d.ts +17 -3
- package/dist/runtime-env.d.ts +12 -1
- package/dist/runtime-env.mjs +14 -0
- package/dist/runtime-version.mjs +1 -9
- package/dist/service-url-exposure.d.ts +1 -2
- package/dist/service-url-exposure.mjs +1 -17
- package/dist/stores/memory.mjs +39 -4
- package/package.json +67 -51
- package/dist/drivers/cloudflare-egress.d.ts +0 -40
- package/dist/drivers/cloudflare-egress.mjs +0 -113
package/dist/driver-catalog.mjs
CHANGED
|
@@ -1,15 +1,53 @@
|
|
|
1
|
+
// src/hosted-network-policy.ts
|
|
2
|
+
var SANDBOX_MODEL_PROVIDER_HOSTS = [
|
|
3
|
+
"api.anthropic.com",
|
|
4
|
+
"api.openai.com",
|
|
5
|
+
"generativelanguage.googleapis.com",
|
|
6
|
+
"openrouter.ai",
|
|
7
|
+
// Model catalog + engine config, fetched on runner startup.
|
|
8
|
+
"models.dev",
|
|
9
|
+
"opencode.ai"
|
|
10
|
+
];
|
|
11
|
+
var SANDBOX_PACKAGE_REGISTRY_HOSTS = [
|
|
12
|
+
"registry.npmjs.org",
|
|
13
|
+
"nodejs.org",
|
|
14
|
+
"pypi.org",
|
|
15
|
+
"files.pythonhosted.org",
|
|
16
|
+
"crates.io",
|
|
17
|
+
"static.crates.io",
|
|
18
|
+
"index.crates.io",
|
|
19
|
+
"proxy.golang.org",
|
|
20
|
+
"sum.golang.org"
|
|
21
|
+
];
|
|
22
|
+
var SANDBOX_BASELINE_EGRESS_HOSTS = [
|
|
23
|
+
...SANDBOX_MODEL_PROVIDER_HOSTS,
|
|
24
|
+
...SANDBOX_PACKAGE_REGISTRY_HOSTS
|
|
25
|
+
];
|
|
26
|
+
|
|
27
|
+
// src/index.ts
|
|
28
|
+
function validateSandboxPersistenceCapabilities(input) {
|
|
29
|
+
if (input.resume === "replacement-restore" && input.capture === "none") {
|
|
30
|
+
return { valid: false, reason: "replacement restore requires a capture source" };
|
|
31
|
+
}
|
|
32
|
+
if (input.capture === "none" && input.captureSource !== "not-applicable") {
|
|
33
|
+
return { valid: false, reason: "capture source behavior requires capture support" };
|
|
34
|
+
}
|
|
35
|
+
if (input.capture !== "none" && input.captureSource === "not-applicable") {
|
|
36
|
+
return { valid: false, reason: "capture support requires source behavior" };
|
|
37
|
+
}
|
|
38
|
+
if (input.capture === "same-resource" && input.restoreMount !== "same-resource") {
|
|
39
|
+
return { valid: false, reason: "same-resource capture requires same-resource restore" };
|
|
40
|
+
}
|
|
41
|
+
if (input.restoreMount === "copy-on-write" && input.capture !== "directories") {
|
|
42
|
+
return { valid: false, reason: "copy-on-write restore requires directory capture" };
|
|
43
|
+
}
|
|
44
|
+
return { valid: true };
|
|
45
|
+
}
|
|
46
|
+
|
|
1
47
|
// src/runtime-version.ts
|
|
2
48
|
var DEFAULT_WORKSPACE_RUNTIME_VERSION = "0.5.2";
|
|
3
|
-
var versionCache;
|
|
4
49
|
function workspaceRuntimeVersion() {
|
|
5
|
-
|
|
6
|
-
const envVersion = process.env.WORKSPACE_RUNTIME_VERSION;
|
|
7
|
-
if (envVersion) {
|
|
8
|
-
versionCache = envVersion;
|
|
9
|
-
return versionCache;
|
|
10
|
-
}
|
|
11
|
-
versionCache = DEFAULT_WORKSPACE_RUNTIME_VERSION;
|
|
12
|
-
return versionCache;
|
|
50
|
+
return process.env.WORKSPACE_RUNTIME_VERSION || DEFAULT_WORKSPACE_RUNTIME_VERSION;
|
|
13
51
|
}
|
|
14
52
|
|
|
15
53
|
// src/image-name.ts
|
|
@@ -30,186 +68,290 @@ function defaultSandboxImage(version = workspaceRuntimeVersion(), buildId, env =
|
|
|
30
68
|
return `${sandboxImageRepository(env)}:workspace-runtime-${snapshotVersion(version)}${buildIdSuffix(buildId, env)}-v${SNAPSHOT_SCHEMA_VERSION}`;
|
|
31
69
|
}
|
|
32
70
|
|
|
71
|
+
// ../sandbox-contract/dist/index.mjs
|
|
72
|
+
function isString(value) {
|
|
73
|
+
return typeof value === "string";
|
|
74
|
+
}
|
|
75
|
+
function trimToUndefined(value) {
|
|
76
|
+
if (!isString(value))
|
|
77
|
+
return;
|
|
78
|
+
const trimmed = value.trim();
|
|
79
|
+
return trimmed.length > 0 ? trimmed : void 0;
|
|
80
|
+
}
|
|
81
|
+
var sandboxDriverIds = ["exe", "daytona", "modal", "vercel", "cloudflare", "box", "docker"];
|
|
82
|
+
var sandboxDriverCredentialFields = {
|
|
83
|
+
exe: [{ key: "api_token", label: "API Token", secret: true }],
|
|
84
|
+
daytona: [{ key: "api_key", label: "API Key", secret: true }],
|
|
85
|
+
modal: [
|
|
86
|
+
{ key: "token_id", label: "Token ID", secret: true },
|
|
87
|
+
{ key: "token_secret", label: "Token Secret", secret: true }
|
|
88
|
+
],
|
|
89
|
+
vercel: [
|
|
90
|
+
{ key: "access_token", label: "Access Token", secret: true },
|
|
91
|
+
{ key: "team_id", label: "Team ID" },
|
|
92
|
+
{ key: "project_id", label: "Project ID" }
|
|
93
|
+
],
|
|
94
|
+
cloudflare: [
|
|
95
|
+
{ key: "api_token", label: "API Token", secret: true },
|
|
96
|
+
{ key: "worker_url", label: "Worker URL" }
|
|
97
|
+
],
|
|
98
|
+
box: [{ key: "api_key", label: "API Key", secret: true }],
|
|
99
|
+
docker: [{ key: "image", label: "Image" }]
|
|
100
|
+
};
|
|
101
|
+
var sandboxDriverLabels = {
|
|
102
|
+
exe: "exe.dev",
|
|
103
|
+
daytona: "Daytona",
|
|
104
|
+
modal: "Modal",
|
|
105
|
+
vercel: "Vercel",
|
|
106
|
+
cloudflare: "Cloudflare",
|
|
107
|
+
box: "Box",
|
|
108
|
+
docker: "Docker"
|
|
109
|
+
};
|
|
110
|
+
function isSandboxDriverID(input) {
|
|
111
|
+
return !!input && sandboxDriverIds.includes(input);
|
|
112
|
+
}
|
|
113
|
+
function enabled(input) {
|
|
114
|
+
return ["1", "true", "yes", "on"].includes(input?.trim().toLowerCase() ?? "");
|
|
115
|
+
}
|
|
116
|
+
function dockerSandboxDriverEnabled(env = process.env) {
|
|
117
|
+
return enabled(env.CLAXEDO_ENABLE_DOCKER_SANDBOX) || enabled(env.CLAXEDO_DEV_DOCKER_SANDBOX);
|
|
118
|
+
}
|
|
119
|
+
function sandboxDriverAuthValues(cfg, id, env = process.env) {
|
|
120
|
+
if (id === "daytona") {
|
|
121
|
+
const api_key = trimToUndefined(cfg?.auth?.daytona?.api_key);
|
|
122
|
+
return api_key ? { api_key } : void 0;
|
|
123
|
+
}
|
|
124
|
+
if (id === "exe") {
|
|
125
|
+
const api_token = trimToUndefined(cfg?.auth?.exe?.api_token) ?? trimToUndefined(env.EXE_DEV_API_TOKEN);
|
|
126
|
+
return api_token ? { api_token } : void 0;
|
|
127
|
+
}
|
|
128
|
+
if (id === "modal") {
|
|
129
|
+
const token_id = trimToUndefined(cfg?.auth?.modal?.token_id) ?? trimToUndefined(env.MODAL_TOKEN_ID);
|
|
130
|
+
const token_secret = trimToUndefined(cfg?.auth?.modal?.token_secret) ?? trimToUndefined(env.MODAL_TOKEN_SECRET);
|
|
131
|
+
return token_id && token_secret ? { token_id, token_secret } : void 0;
|
|
132
|
+
}
|
|
133
|
+
if (id === "vercel") {
|
|
134
|
+
const access_token = trimToUndefined(cfg?.auth?.vercel?.access_token) ?? trimToUndefined(env.VERCEL_TOKEN);
|
|
135
|
+
const team_id = trimToUndefined(cfg?.auth?.vercel?.team_id) ?? trimToUndefined(env.VERCEL_TEAM_ID);
|
|
136
|
+
const project_id = trimToUndefined(cfg?.auth?.vercel?.project_id) ?? trimToUndefined(env.VERCEL_PROJECT_ID);
|
|
137
|
+
return access_token && team_id && project_id ? { access_token, team_id, project_id } : void 0;
|
|
138
|
+
}
|
|
139
|
+
if (id === "cloudflare") {
|
|
140
|
+
const api_token = trimToUndefined(cfg?.auth?.cloudflare?.api_token) ?? trimToUndefined(env.CLOUDFLARE_API_TOKEN);
|
|
141
|
+
const worker_url = trimToUndefined(cfg?.auth?.cloudflare?.worker_url) ?? trimToUndefined(env.CLOUDFLARE_SANDBOX_WORKER_URL);
|
|
142
|
+
return api_token && worker_url ? { api_token, worker_url } : void 0;
|
|
143
|
+
}
|
|
144
|
+
if (id === "box") {
|
|
145
|
+
const api_key = trimToUndefined(cfg?.auth?.box?.api_key) ?? trimToUndefined(env.BOX_API_KEY);
|
|
146
|
+
return api_key ? { api_key } : void 0;
|
|
147
|
+
}
|
|
148
|
+
if (!dockerSandboxDriverEnabled(env)) return void 0;
|
|
149
|
+
const image = trimToUndefined(cfg?.auth?.docker?.image) ?? trimToUndefined(env.CLAXEDO_DOCKER_SANDBOX_IMAGE) ?? trimToUndefined(env.CLAXEDO_SANDBOX_IMAGE);
|
|
150
|
+
return image ? { image } : {};
|
|
151
|
+
}
|
|
152
|
+
function sandboxDriverId(input, cfg, env = process.env) {
|
|
153
|
+
if (!isSandboxDriverID(input)) return void 0;
|
|
154
|
+
if (input === "docker" && !sandboxDriverAuthValues(cfg, input, env)) return void 0;
|
|
155
|
+
return input;
|
|
156
|
+
}
|
|
157
|
+
function defaultSandboxDriverID(cfg, env = process.env) {
|
|
158
|
+
return sandboxDriverId(cfg?.default_driver, cfg, env) ?? (enabled(env.CLAXEDO_DOCKER_SANDBOX_DEFAULT) && sandboxDriverAuthValues(cfg, "docker", env) ? "docker" : "daytona");
|
|
159
|
+
}
|
|
160
|
+
function listSandboxDrivers(cfg, env = process.env, managedDriverIds = /* @__PURE__ */ new Set()) {
|
|
161
|
+
const defaultDriver = defaultSandboxDriverID(cfg, env);
|
|
162
|
+
return {
|
|
163
|
+
default_driver: defaultDriver,
|
|
164
|
+
drivers: sandboxDriverIds.filter((id) => id !== "docker" || !!sandboxDriverAuthValues(cfg, "docker", env)).map((id) => {
|
|
165
|
+
const configuredFromConfigOrEnv = !!sandboxDriverAuthValues(cfg, id, env);
|
|
166
|
+
const configured = id === "docker" ? configuredFromConfigOrEnv : configuredFromConfigOrEnv || managedDriverIds.has(id);
|
|
167
|
+
return {
|
|
168
|
+
id,
|
|
169
|
+
label: sandboxDriverLabels[id],
|
|
170
|
+
fields: sandboxDriverCredentialFields[id],
|
|
171
|
+
configured,
|
|
172
|
+
source: configuredFromConfigOrEnv ? "config" : configured ? "managed" : "none",
|
|
173
|
+
default: id === defaultDriver
|
|
174
|
+
};
|
|
175
|
+
})
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
|
|
33
179
|
// src/driver-catalog.ts
|
|
34
|
-
var sandboxDriverIds = ["daytona", "modal", "vercel", "cloudflare", "box", "docker"];
|
|
35
180
|
var sandboxDriverCatalog = {
|
|
181
|
+
exe: {
|
|
182
|
+
id: "exe",
|
|
183
|
+
label: sandboxDriverLabels.exe,
|
|
184
|
+
credentialFields: sandboxDriverCredentialFields.exe,
|
|
185
|
+
metadata: {
|
|
186
|
+
driverRunsIn: ["worker", "node"],
|
|
187
|
+
hostStopBehavior: "not-supported",
|
|
188
|
+
hostResumeBehavior: "same-host",
|
|
189
|
+
targetAccess: "relay",
|
|
190
|
+
secretBrokering: "none",
|
|
191
|
+
egressControl: "none",
|
|
192
|
+
persistence: {
|
|
193
|
+
resume: "same-sandbox",
|
|
194
|
+
capture: "none",
|
|
195
|
+
clone: true,
|
|
196
|
+
captureSource: "not-applicable",
|
|
197
|
+
retention: "provider-managed",
|
|
198
|
+
restoreMount: "same-resource"
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
},
|
|
36
202
|
daytona: {
|
|
37
203
|
id: "daytona",
|
|
38
|
-
label:
|
|
39
|
-
credentialFields:
|
|
204
|
+
label: sandboxDriverLabels.daytona,
|
|
205
|
+
credentialFields: sandboxDriverCredentialFields.daytona,
|
|
40
206
|
metadata: {
|
|
41
207
|
driverRunsIn: ["worker", "node"],
|
|
42
208
|
hostStopBehavior: "suspends-host",
|
|
43
209
|
hostResumeBehavior: "same-host",
|
|
44
210
|
targetAccess: "relay",
|
|
45
|
-
secretBrokering: "native"
|
|
211
|
+
secretBrokering: "native",
|
|
212
|
+
// The driver translates names to domainAllowList, or addresses to networkAllowList.
|
|
213
|
+
egressControl: "hosts-and-cidrs",
|
|
214
|
+
persistence: {
|
|
215
|
+
resume: "same-sandbox",
|
|
216
|
+
capture: "filesystem",
|
|
217
|
+
clone: false,
|
|
218
|
+
captureSource: "preserved",
|
|
219
|
+
retention: "provider-managed",
|
|
220
|
+
restoreMount: "new-resource"
|
|
221
|
+
}
|
|
46
222
|
}
|
|
47
223
|
},
|
|
48
224
|
modal: {
|
|
49
225
|
id: "modal",
|
|
50
|
-
label:
|
|
51
|
-
credentialFields:
|
|
52
|
-
{ key: "token_id", label: "Token ID", secret: true },
|
|
53
|
-
{ key: "token_secret", label: "Token Secret", secret: true }
|
|
54
|
-
],
|
|
226
|
+
label: sandboxDriverLabels.modal,
|
|
227
|
+
credentialFields: sandboxDriverCredentialFields.modal,
|
|
55
228
|
metadata: {
|
|
56
229
|
driverRunsIn: ["node"],
|
|
57
230
|
hostStopBehavior: "terminates-host",
|
|
58
231
|
hostResumeBehavior: "replacement-host",
|
|
59
232
|
targetAccess: "relay",
|
|
60
|
-
secretBrokering: "none"
|
|
233
|
+
secretBrokering: "none",
|
|
234
|
+
// The driver does not install Modal's domain allowlist or alpha sidecar.
|
|
235
|
+
egressControl: "none",
|
|
236
|
+
persistence: {
|
|
237
|
+
resume: "replacement-restore",
|
|
238
|
+
capture: "filesystem",
|
|
239
|
+
clone: false,
|
|
240
|
+
captureSource: "preserved",
|
|
241
|
+
retention: "provider-managed",
|
|
242
|
+
restoreMount: "new-resource"
|
|
243
|
+
}
|
|
61
244
|
}
|
|
62
245
|
},
|
|
63
246
|
vercel: {
|
|
64
247
|
id: "vercel",
|
|
65
|
-
label:
|
|
66
|
-
credentialFields:
|
|
67
|
-
{ key: "access_token", label: "Access Token", secret: true },
|
|
68
|
-
{ key: "team_id", label: "Team ID" },
|
|
69
|
-
{ key: "project_id", label: "Project ID" }
|
|
70
|
-
],
|
|
248
|
+
label: sandboxDriverLabels.vercel,
|
|
249
|
+
credentialFields: sandboxDriverCredentialFields.vercel,
|
|
71
250
|
metadata: {
|
|
72
251
|
driverRunsIn: ["node"],
|
|
73
252
|
hostStopBehavior: "terminates-host",
|
|
74
253
|
hostResumeBehavior: "replacement-host",
|
|
75
254
|
targetAccess: "relay",
|
|
76
|
-
secretBrokering: "native"
|
|
255
|
+
secretBrokering: "native",
|
|
256
|
+
// The driver translates hosts only; the SDK's subnet rules are not wired to net.cidrs.
|
|
257
|
+
egressControl: "hosts",
|
|
258
|
+
persistence: {
|
|
259
|
+
resume: "replacement-restore",
|
|
260
|
+
capture: "filesystem",
|
|
261
|
+
clone: false,
|
|
262
|
+
captureSource: "stopped",
|
|
263
|
+
retention: "explicit",
|
|
264
|
+
restoreMount: "new-resource"
|
|
265
|
+
}
|
|
77
266
|
}
|
|
78
267
|
},
|
|
79
268
|
cloudflare: {
|
|
80
269
|
id: "cloudflare",
|
|
81
|
-
label:
|
|
82
|
-
credentialFields:
|
|
83
|
-
{ key: "api_token", label: "API Token", secret: true },
|
|
84
|
-
{ key: "worker_url", label: "Worker URL" }
|
|
85
|
-
],
|
|
270
|
+
label: sandboxDriverLabels.cloudflare,
|
|
271
|
+
credentialFields: sandboxDriverCredentialFields.cloudflare,
|
|
86
272
|
metadata: {
|
|
87
273
|
driverRunsIn: ["worker"],
|
|
88
274
|
hostStopBehavior: "not-supported",
|
|
89
275
|
hostResumeBehavior: "same-host",
|
|
90
276
|
targetAccess: "relay",
|
|
91
|
-
secretBrokering: "
|
|
277
|
+
secretBrokering: "native",
|
|
278
|
+
// Credential handlers do not restrict unrelated destinations.
|
|
279
|
+
egressControl: "none",
|
|
280
|
+
persistence: {
|
|
281
|
+
resume: "replacement-restore",
|
|
282
|
+
capture: "directories",
|
|
283
|
+
clone: false,
|
|
284
|
+
captureSource: "preserved",
|
|
285
|
+
retention: "provider-managed",
|
|
286
|
+
restoreMount: "copy-on-write"
|
|
287
|
+
}
|
|
92
288
|
}
|
|
93
289
|
},
|
|
94
290
|
box: {
|
|
95
291
|
id: "box",
|
|
96
|
-
label:
|
|
97
|
-
credentialFields:
|
|
292
|
+
label: sandboxDriverLabels.box,
|
|
293
|
+
credentialFields: sandboxDriverCredentialFields.box,
|
|
98
294
|
metadata: {
|
|
99
295
|
driverRunsIn: ["node"],
|
|
100
296
|
hostStopBehavior: "suspends-host",
|
|
101
297
|
hostResumeBehavior: "same-host",
|
|
102
298
|
targetAccess: "relay",
|
|
103
|
-
secretBrokering: "none"
|
|
299
|
+
secretBrokering: "none",
|
|
300
|
+
egressControl: "none",
|
|
301
|
+
persistence: {
|
|
302
|
+
resume: "same-sandbox",
|
|
303
|
+
capture: "none",
|
|
304
|
+
clone: false,
|
|
305
|
+
captureSource: "not-applicable",
|
|
306
|
+
retention: "provider-managed",
|
|
307
|
+
restoreMount: "same-resource"
|
|
308
|
+
}
|
|
104
309
|
}
|
|
105
310
|
},
|
|
106
311
|
docker: {
|
|
107
312
|
id: "docker",
|
|
108
|
-
label:
|
|
109
|
-
credentialFields:
|
|
313
|
+
label: sandboxDriverLabels.docker,
|
|
314
|
+
credentialFields: sandboxDriverCredentialFields.docker,
|
|
110
315
|
metadata: {
|
|
111
316
|
driverRunsIn: ["local"],
|
|
112
317
|
hostStopBehavior: "terminates-host",
|
|
113
318
|
hostResumeBehavior: "same-host",
|
|
114
319
|
targetAccess: "loopback",
|
|
115
|
-
secretBrokering: "none"
|
|
320
|
+
secretBrokering: "none",
|
|
321
|
+
egressControl: "none",
|
|
322
|
+
persistence: {
|
|
323
|
+
resume: "replacement-restore",
|
|
324
|
+
capture: "same-resource",
|
|
325
|
+
clone: false,
|
|
326
|
+
captureSource: "preserved",
|
|
327
|
+
retention: "provider-managed",
|
|
328
|
+
restoreMount: "same-resource"
|
|
329
|
+
}
|
|
116
330
|
}
|
|
117
331
|
}
|
|
118
332
|
};
|
|
119
|
-
function isSandboxDriverID(input) {
|
|
120
|
-
return !!input && sandboxDriverIds.includes(input);
|
|
121
|
-
}
|
|
122
|
-
function sandboxDriverId(input, cfg, env = process.env) {
|
|
123
|
-
if (!isSandboxDriverID(input)) return;
|
|
124
|
-
if (input === "docker" && !sandboxDriverAuth(cfg, input, env)) return;
|
|
125
|
-
return input;
|
|
126
|
-
}
|
|
127
|
-
function defaultSandboxDriverID(cfg, env = process.env) {
|
|
128
|
-
return sandboxDriverId(cfg?.default_driver, cfg, env) ?? (dockerSandboxDefault(env) && sandboxDriverAuth(cfg, "docker", env) ? "docker" : "daytona");
|
|
129
|
-
}
|
|
130
333
|
function sandboxDriverAuth(cfg, id, env = process.env) {
|
|
131
|
-
if (id === "
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
334
|
+
if (id === "docker") {
|
|
335
|
+
const configured = sandboxDriverAuthValues(cfg, "docker", env);
|
|
336
|
+
if (!configured) return void 0;
|
|
337
|
+
const image = configured.image ?? defaultSandboxImage(workspaceRuntimeVersion(), void 0, env);
|
|
338
|
+
return { image };
|
|
339
|
+
}
|
|
340
|
+
return sandboxDriverAuthValues(cfg, id, env);
|
|
137
341
|
}
|
|
138
342
|
function hasSandboxDriverAuth(cfg, id, env = process.env) {
|
|
139
343
|
return !!sandboxDriverAuth(cfg, id, env);
|
|
140
344
|
}
|
|
141
|
-
function
|
|
142
|
-
return
|
|
143
|
-
}
|
|
144
|
-
function listSandboxDrivers(cfg, env = process.env, managedDriverIds = /* @__PURE__ */ new Set()) {
|
|
145
|
-
const def = defaultSandboxDriverID(cfg, env);
|
|
146
|
-
return {
|
|
147
|
-
default_driver: def,
|
|
148
|
-
drivers: sandboxDriverIds.filter((id) => id !== "docker" || !!sandboxDriverAuth(cfg, "docker", env)).map((id) => {
|
|
149
|
-
const configuredFromConfigOrEnv = !!sandboxDriverAuth(cfg, id, env);
|
|
150
|
-
const configured = id === "docker" ? configuredFromConfigOrEnv : configuredFromConfigOrEnv || managedDriverIds.has(id);
|
|
151
|
-
return {
|
|
152
|
-
id,
|
|
153
|
-
label: sandboxDriverCatalog[id].label,
|
|
154
|
-
fields: sandboxDriverCatalog[id].credentialFields,
|
|
155
|
-
configured,
|
|
156
|
-
source: configuredFromConfigOrEnv ? "config" : configured ? "managed" : "none",
|
|
157
|
-
default: id === def
|
|
158
|
-
};
|
|
159
|
-
})
|
|
160
|
-
};
|
|
161
|
-
}
|
|
162
|
-
function clean(input) {
|
|
163
|
-
const txt = input?.trim();
|
|
164
|
-
return txt ? txt : void 0;
|
|
165
|
-
}
|
|
166
|
-
function enabled(input) {
|
|
167
|
-
return ["1", "true", "yes", "on"].includes(input?.trim().toLowerCase() ?? "");
|
|
168
|
-
}
|
|
169
|
-
function dockerSandboxEnabled(env) {
|
|
170
|
-
return enabled(env.CLAXEDO_ENABLE_DOCKER_SANDBOX) || enabled(env.CLAXEDO_DEV_DOCKER_SANDBOX);
|
|
171
|
-
}
|
|
172
|
-
function dockerSandboxDefault(env) {
|
|
173
|
-
return enabled(env.CLAXEDO_DOCKER_SANDBOX_DEFAULT);
|
|
174
|
-
}
|
|
175
|
-
function authDaytona(cfg) {
|
|
176
|
-
const api_key = clean(cfg?.auth?.daytona?.api_key);
|
|
177
|
-
return api_key ? { api_key } : void 0;
|
|
178
|
-
}
|
|
179
|
-
function authModal(cfg, env) {
|
|
180
|
-
const token_id = clean(cfg?.auth?.modal?.token_id) ?? clean(env.MODAL_TOKEN_ID);
|
|
181
|
-
const token_secret = clean(cfg?.auth?.modal?.token_secret) ?? clean(env.MODAL_TOKEN_SECRET);
|
|
182
|
-
return token_id && token_secret ? { token_id, token_secret } : void 0;
|
|
183
|
-
}
|
|
184
|
-
function authVercel(cfg, env) {
|
|
185
|
-
const access_token = clean(cfg?.auth?.vercel?.access_token) ?? clean(env.VERCEL_TOKEN);
|
|
186
|
-
const team_id = clean(cfg?.auth?.vercel?.team_id) ?? clean(env.VERCEL_TEAM_ID);
|
|
187
|
-
const project_id = clean(cfg?.auth?.vercel?.project_id) ?? clean(env.VERCEL_PROJECT_ID);
|
|
188
|
-
return access_token && team_id && project_id ? { access_token, team_id, project_id } : void 0;
|
|
189
|
-
}
|
|
190
|
-
function authCloudflare(cfg, env) {
|
|
191
|
-
const api_token = clean(cfg?.auth?.cloudflare?.api_token) ?? clean(env.CLOUDFLARE_API_TOKEN);
|
|
192
|
-
const worker_url = clean(cfg?.auth?.cloudflare?.worker_url) ?? clean(env.CLOUDFLARE_SANDBOX_WORKER_URL);
|
|
193
|
-
return api_token && worker_url ? { api_token, worker_url } : void 0;
|
|
194
|
-
}
|
|
195
|
-
function authBox(cfg, env) {
|
|
196
|
-
const api_key = clean(cfg?.auth?.box?.api_key) ?? clean(env.BOX_API_KEY);
|
|
197
|
-
return api_key ? { api_key } : void 0;
|
|
198
|
-
}
|
|
199
|
-
function authDocker(cfg, env) {
|
|
200
|
-
if (!dockerSandboxEnabled(env)) return;
|
|
201
|
-
return {
|
|
202
|
-
image: clean(cfg?.auth?.docker?.image) ?? clean(env.CLAXEDO_DOCKER_SANDBOX_IMAGE) ?? clean(env.CLAXEDO_SANDBOX_IMAGE) ?? defaultSandboxImage(workspaceRuntimeVersion(), void 0, env)
|
|
203
|
-
};
|
|
345
|
+
function dockerSandboxDriverEnabled2(env = process.env) {
|
|
346
|
+
return dockerSandboxDriverEnabled(env);
|
|
204
347
|
}
|
|
205
348
|
export {
|
|
206
349
|
defaultSandboxDriverID,
|
|
207
|
-
dockerSandboxDriverEnabled,
|
|
350
|
+
dockerSandboxDriverEnabled2 as dockerSandboxDriverEnabled,
|
|
208
351
|
hasSandboxDriverAuth,
|
|
209
|
-
isSandboxDriverID,
|
|
210
352
|
listSandboxDrivers,
|
|
211
353
|
sandboxDriverAuth,
|
|
212
354
|
sandboxDriverCatalog,
|
|
213
355
|
sandboxDriverId,
|
|
214
|
-
|
|
356
|
+
validateSandboxPersistenceCapabilities
|
|
215
357
|
};
|