@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.
Files changed (41) hide show
  1. package/README.md +60 -15
  2. package/dist/checkpoint-manager.d.ts +47 -0
  3. package/dist/checkpoint-manager.mjs +116 -0
  4. package/dist/daytona-allow-list.d.ts +11 -0
  5. package/dist/daytona-allow-list.mjs +5 -1
  6. package/dist/driver-catalog.d.ts +5 -52
  7. package/dist/driver-catalog.mjs +263 -121
  8. package/dist/drivers/box.mjs +309 -39
  9. package/dist/drivers/cloudflare.d.ts +18 -7
  10. package/dist/drivers/cloudflare.mjs +423 -34
  11. package/dist/drivers/daytona.d.ts +82 -13
  12. package/dist/drivers/daytona.mjs +495 -45
  13. package/dist/drivers/docker.mjs +284 -38
  14. package/dist/drivers/exe.d.ts +26 -0
  15. package/dist/drivers/exe.mjs +492 -0
  16. package/dist/drivers/fetch-bridge.mjs +29 -5
  17. package/dist/drivers/modal.d.ts +2 -5
  18. package/dist/drivers/modal.mjs +296 -46
  19. package/dist/drivers/transient-error.d.ts +11 -0
  20. package/dist/drivers/vercel.d.ts +27 -11
  21. package/dist/drivers/vercel.mjs +339 -59
  22. package/dist/hosted-network-policy.d.ts +87 -0
  23. package/dist/hosted-network-policy.mjs +61 -0
  24. package/dist/image-name.mjs +34 -0
  25. package/dist/image.d.ts +18 -3
  26. package/dist/image.mjs +47 -32
  27. package/dist/index.d.ts +281 -17
  28. package/dist/index.mjs +393 -26
  29. package/dist/json.d.ts +13 -0
  30. package/dist/lease-policy.d.ts +6 -3
  31. package/dist/lease-policy.mjs +213 -54
  32. package/dist/lease-types.d.ts +17 -3
  33. package/dist/runtime-env.d.ts +12 -1
  34. package/dist/runtime-env.mjs +14 -0
  35. package/dist/runtime-version.mjs +1 -9
  36. package/dist/service-url-exposure.d.ts +1 -2
  37. package/dist/service-url-exposure.mjs +1 -17
  38. package/dist/stores/memory.mjs +39 -4
  39. package/package.json +67 -51
  40. package/dist/drivers/cloudflare-egress.d.ts +0 -40
  41. package/dist/drivers/cloudflare-egress.mjs +0 -113
@@ -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
- if (versionCache) return versionCache;
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: "Daytona",
39
- credentialFields: [{ key: "api_key", label: "API Key", secret: true }],
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: "Modal",
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: "Vercel",
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: "Cloudflare",
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: "proxy"
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: "Box",
97
- credentialFields: [{ key: "api_key", label: "API Key", secret: true }],
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: "Docker",
109
- credentialFields: [{ key: "image", label: "Image" }],
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 === "daytona") return authDaytona(cfg);
132
- if (id === "modal") return authModal(cfg, env);
133
- if (id === "vercel") return authVercel(cfg, env);
134
- if (id === "cloudflare") return authCloudflare(cfg, env);
135
- if (id === "box") return authBox(cfg, env);
136
- return authDocker(cfg, env);
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 dockerSandboxDriverEnabled(env = process.env) {
142
- return dockerSandboxEnabled(env);
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
- sandboxDriverIds
356
+ validateSandboxPersistenceCapabilities
215
357
  };