@codeworksh/harness 0.0.1-canary.10.1.g65d5c167

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.
@@ -0,0 +1,356 @@
1
+ import { i as errors_exports, n as shell_exports, o as instance_exports, r as filesystem_exports, s as posix, t as resource_exports } from "./resource-DFZh0e-s.mjs";
2
+ import { SandboxDriver, SandboxProvider } from "./sandbox.mjs";
3
+ import { Context, Effect, Layer, Option, Schema, Stream } from "effect";
4
+ import { Buffer } from "node:buffer";
5
+ //#region src/sandboxes/vercel/fs.ts
6
+ const resolvePath = (path, options) => {
7
+ const normalized = posix.normalize(path);
8
+ if (options?.cwd === void 0 || posix.isAbsolute(normalized)) return normalized;
9
+ return posix.normalize(posix.join(options.cwd, normalized));
10
+ };
11
+ /**
12
+ * Wrap a remote provider into the runtime filesystem surface: resolve relative
13
+ * paths against `cwd`, and nothing else. Parent creation and `rm` option
14
+ * validation are the runtime's job and live in `SandboxFileSystem.fromProvider`,
15
+ * which every backend passes through — putting them here would cover only the
16
+ * backends that happen to use this wrapper.
17
+ */
18
+ const make$1 = (provider, options) => {
19
+ const resolve = (path) => resolvePath(path, options);
20
+ return {
21
+ readFile: (path) => provider.readFile(resolve(path)),
22
+ readFileBuffer: (path) => provider.readFileBuffer(resolve(path)),
23
+ writeFile: (path, content) => provider.writeFile(resolve(path), content),
24
+ stat: (path) => provider.stat(resolve(path)),
25
+ ...provider.lstat === void 0 ? {} : { lstat: (path) => provider.lstat(resolve(path)) },
26
+ readdir: (path) => provider.readdir(resolve(path)),
27
+ exists: (path) => provider.exists(resolve(path)),
28
+ mkdir: (path, mkdirOptions) => provider.mkdir(resolve(path), mkdirOptions),
29
+ rm: (path, rmOptions) => provider.rm(resolve(path), rmOptions),
30
+ realpath: (path) => provider.realpath(resolve(path))
31
+ };
32
+ };
33
+ //#endregion
34
+ //#region src/sandboxes/vercel/provider.ts
35
+ const utf8 = new TextEncoder();
36
+ Schema.TaggedError()("VercelError", { sanitized: instance_exports.SandboxInstance.PersistedError });
37
+ const ApiFailure = Schema.Struct({ json: Schema.Struct({ error: Schema.Struct({
38
+ message: Schema.optional(Schema.String),
39
+ code: Schema.optional(Schema.String)
40
+ }) }) });
41
+ const isApiFailure = Schema.is(ApiFailure);
42
+ /** Prefer Vercel's structured API failure while retaining the shared redaction boundary. */
43
+ const sanitizeProviderError = (cause, redact = (0, errors_exports.makeRedactor)()) => {
44
+ const fallback = (0, errors_exports.sanitizeError)(cause, redact);
45
+ if (!isApiFailure(cause)) return fallback;
46
+ const message = cause.json.error.message?.trim();
47
+ const code = cause.json.error.code?.trim();
48
+ return {
49
+ ...fallback,
50
+ ...message === void 0 || message.length === 0 ? {} : { message: redact(message) },
51
+ ...code === void 0 || code.length === 0 ? {} : { code: redact(code) }
52
+ };
53
+ };
54
+ var Remote = class extends Context.Service()("@codeworksh/harness/sandboxes/vercel/provider/Remote") {};
55
+ const credentialsFrom = (options) => options.token !== void 0 && options.teamId !== void 0 && options.projectId !== void 0 ? {
56
+ token: options.token,
57
+ teamId: options.teamId,
58
+ projectId: options.projectId
59
+ } : void 0;
60
+ const createSandbox = async (options, creds = credentialsFrom(options)) => {
61
+ const { Sandbox } = await import("@vercel/sandbox");
62
+ const withCreds = (params) => creds ? {
63
+ ...params,
64
+ ...creds
65
+ } : params;
66
+ const source = options.source?.type === "git" ? {
67
+ type: "git",
68
+ url: options.source.url,
69
+ ...options.source.revision === void 0 ? {} : { revision: options.source.revision },
70
+ ...options.source.depth === void 0 ? {} : { depth: options.source.depth }
71
+ } : options.source;
72
+ const base = {
73
+ ...options.name === void 0 ? {} : { name: options.name },
74
+ ...options.tags === void 0 ? {} : { tags: options.tags },
75
+ ...options.envVars === void 0 ? {} : { env: options.envVars },
76
+ ...options.ports === void 0 ? {} : { ports: options.ports },
77
+ ...options.timeout === void 0 ? {} : { timeout: options.timeout },
78
+ ...options.vcpus === void 0 ? {} : { resources: { vcpus: options.vcpus } }
79
+ };
80
+ return options.snapshot !== void 0 ? Sandbox.create(withCreds({
81
+ ...base,
82
+ source: {
83
+ type: "snapshot",
84
+ snapshotId: options.snapshot
85
+ }
86
+ })) : Sandbox.create(withCreds({
87
+ ...base,
88
+ ...options.runtime === void 0 ? {} : { runtime: options.runtime },
89
+ ...source === void 0 ? {} : { source }
90
+ }));
91
+ };
92
+ const statsFrom = (stats) => {
93
+ const mtime = stats.mtime;
94
+ return {
95
+ isFile: stats.isFile(),
96
+ isDirectory: stats.isDirectory(),
97
+ isSymbolicLink: stats.isSymbolicLink(),
98
+ ...Number.isFinite(stats.size) ? { size: stats.size } : {},
99
+ ...mtime instanceof Date && !Number.isNaN(mtime.getTime()) ? { mtime } : {}
100
+ };
101
+ };
102
+ const providerFrom = (sandbox, options) => {
103
+ return {
104
+ readFile: (path) => sandbox.fs.readFile(path, "utf8"),
105
+ readFileBuffer: async (path) => new Uint8Array(await sandbox.fs.readFile(path)),
106
+ writeFile: (path, content) => sandbox.fs.writeFile(path, typeof content === "string" ? Buffer.from(content, "utf8") : Buffer.from(content)),
107
+ stat: async (path) => statsFrom(await sandbox.fs.stat(path)),
108
+ lstat: async (path) => statsFrom(await sandbox.fs.lstat(path)),
109
+ readdir: async (path) => (await sandbox.fs.readdir(path, { withFileTypes: true })).map((e) => e.name),
110
+ exists: async (path) => {
111
+ try {
112
+ await sandbox.fs.stat(path);
113
+ return true;
114
+ } catch (cause) {
115
+ if (filesystem_exports.SandboxFileSystem.isNotFoundError(cause)) return false;
116
+ throw cause;
117
+ }
118
+ },
119
+ mkdir: async (path, mkdirOptions) => {
120
+ await sandbox.fs.mkdir(path, mkdirOptions?.recursive === void 0 ? {} : { recursive: mkdirOptions.recursive });
121
+ },
122
+ rm: (path, rmOptions) => sandbox.fs.rm(path, {
123
+ ...rmOptions?.recursive === void 0 ? {} : { recursive: rmOptions.recursive },
124
+ ...rmOptions?.force === void 0 ? {} : { force: rmOptions.force }
125
+ }),
126
+ realpath: async (path) => {
127
+ for (const script of filesystem_exports.SandboxFileSystem.realpathScripts) {
128
+ const result = await (await spawnArgv(sandbox, options, [
129
+ "sh",
130
+ "-c",
131
+ script,
132
+ "_",
133
+ path
134
+ ])).wait();
135
+ if (result.exitCode === 0) return (await result.stdout()).trimEnd();
136
+ }
137
+ throw Object.assign(/* @__PURE__ */ new Error(`ENOENT: no such file or directory, realpath '${path}'`), { code: "ENOENT" });
138
+ }
139
+ };
140
+ };
141
+ const spawn = (sandbox, options, command, env, cwd) => spawnArgv(sandbox, options, [
142
+ "sh",
143
+ "-c",
144
+ command
145
+ ], env, cwd);
146
+ const spawnArgv = (sandbox, options, argv, env, cwd) => {
147
+ const resolvedCwd = (0, shell_exports.resolveCwd)(options.cwd, cwd);
148
+ return sandbox.runCommand({
149
+ cmd: argv[0],
150
+ args: argv.slice(1),
151
+ ...resolvedCwd === void 0 ? {} : { cwd: resolvedCwd },
152
+ ...env === void 0 ? {} : { env },
153
+ detached: true,
154
+ ...options.execTimeout === void 0 ? {} : { timeoutMs: options.execTimeout }
155
+ });
156
+ };
157
+ const acquireWith = (command, run) => Effect.acquireRelease(Effect.tryPromise({
158
+ try: run,
159
+ catch: (cause) => new shell_exports.ShellError({
160
+ command,
161
+ cause
162
+ })
163
+ }), (cmd) => Effect.promise(() => cmd.kill("SIGKILL").catch(() => {})));
164
+ const collect = (command) => (cmd) => Effect.tryPromise({
165
+ try: async () => {
166
+ const result = await cmd.wait();
167
+ const [stdout, stderr] = await Promise.all([result.stdout(), result.stderr()]);
168
+ return {
169
+ stdout,
170
+ stderr,
171
+ exitCode: result.exitCode
172
+ };
173
+ },
174
+ catch: (cause) => new shell_exports.ShellError({
175
+ command,
176
+ cause
177
+ })
178
+ });
179
+ const acquireCommand = (sandbox, options, command, env, cwd) => acquireWith(command, () => spawn(sandbox, options, command, env, cwd));
180
+ const exec = (sandbox, options) => (command, opts) => acquireCommand(sandbox, options, command, opts?.env, opts?.cwd).pipe(Effect.flatMap(collect(command)), Effect.scoped);
181
+ const execArgv = (sandbox, options) => (argv, opts) => {
182
+ const command = (0, shell_exports.quoteArgv)(argv);
183
+ return acquireWith(command, () => spawnArgv(sandbox, options, argv, opts?.env, opts?.cwd)).pipe(Effect.flatMap(collect(command)), Effect.scoped);
184
+ };
185
+ const stream = (sandbox, options) => (command, opts) => Stream.unwrap(acquireCommand(sandbox, options, command, opts?.env, opts?.cwd).pipe(Effect.map((cmd) => {
186
+ const logs = Stream.fromAsyncIterable(cmd.logs(), (cause) => new shell_exports.ShellError({
187
+ command,
188
+ cause
189
+ })).pipe(Stream.map((log) => ({
190
+ _tag: log.stream,
191
+ bytes: utf8.encode(log.data)
192
+ })));
193
+ const exit = Stream.fromEffect(Effect.tryPromise({
194
+ try: () => cmd.wait(),
195
+ catch: (cause) => new shell_exports.ShellError({
196
+ command,
197
+ cause
198
+ })
199
+ })).pipe(Stream.map((finished) => ({
200
+ _tag: "exit",
201
+ exitCode: finished.exitCode
202
+ })));
203
+ return Stream.concat(logs, exit);
204
+ })));
205
+ /**
206
+ * Cwd-neutral IO attachment for a lifecycle driver.
207
+ *
208
+ * The controller binds a cwd per mount, so neither filesystem nor shell stores
209
+ * one here. The returned layer owns no provider resource and has no deletion
210
+ * finalizer.
211
+ */
212
+ const transport = (sandbox, options = {}) => Layer.merge(Layer.succeed(filesystem_exports.SandboxFileSystem.Service, filesystem_exports.SandboxFileSystem.fromProvider(make$1(providerFrom(sandbox, options)))), Layer.succeed(shell_exports.Shell, shell_exports.Shell.of({
213
+ exec: exec(sandbox, options),
214
+ execArgv: execArgv(sandbox, options),
215
+ stream: stream(sandbox, options)
216
+ })));
217
+ Layer.effect(resource_exports.SandboxResource.Service, Effect.map(Remote, ({ sandbox }) => ({ providerResourceId: sandbox.name })));
218
+ //#endregion
219
+ //#region src/sandboxes/vercel/index.ts
220
+ const Options = Schema.Struct({
221
+ token: Schema.optional(Schema.String),
222
+ teamId: Schema.optional(Schema.String),
223
+ projectId: Schema.optional(Schema.String)
224
+ });
225
+ const ClientOptions = Options;
226
+ const Source = Schema.Union([Schema.Struct({
227
+ type: Schema.Literal("git"),
228
+ url: Schema.String,
229
+ revision: Schema.optional(Schema.String),
230
+ depth: Schema.optional(Schema.Finite)
231
+ }), Schema.Struct({
232
+ type: Schema.Literal("tarball"),
233
+ url: Schema.String
234
+ })]);
235
+ const CreateConfig = Schema.Struct({
236
+ snapshot: Schema.optional(Schema.String),
237
+ source: Schema.optional(Source),
238
+ runtime: Schema.optional(Schema.String),
239
+ ports: Schema.optional(Schema.Array(Schema.Finite)),
240
+ envVars: Schema.optional(Schema.Record(Schema.String, Schema.String)),
241
+ vcpus: Schema.optional(Schema.Finite),
242
+ timeout: Schema.optional(Schema.Finite),
243
+ execTimeout: Schema.optional(Schema.Finite)
244
+ });
245
+ const RuntimeConfig = Schema.Struct({
246
+ defaultCwd: SandboxDriver.AbsolutePath,
247
+ execTimeout: Schema.optional(Schema.Finite)
248
+ });
249
+ const name = SandboxDriver.Name.make("vercel");
250
+ const statusFrom = (status) => ({
251
+ status: status === "stopped" ? "offline" : status === "stopping" || status === "snapshotting" ? "suspending" : status === "failed" || status === "aborted" ? "faulted" : "online",
252
+ providerStatus: status
253
+ });
254
+ const isNotFound = (cause) => {
255
+ if (typeof cause !== "object" || cause === null) return false;
256
+ const response = "response" in cause && cause.response instanceof Response ? cause.response : void 0;
257
+ const code = "code" in cause && typeof cause.code === "string" ? cause.code : "json" in cause && typeof cause.json === "object" && cause.json !== null && "error" in cause.json && typeof cause.json.error === "object" && cause.json.error !== null && "code" in cause.json.error && typeof cause.json.error.code === "string" ? cause.json.error.code : void 0;
258
+ return response?.status === 404 || code === "not_found" || code === "sandbox_not_found";
259
+ };
260
+ const make = (client = {}) => {
261
+ const credentials = credentialsFrom(client);
262
+ const redact = SandboxProvider.makeRedactor([client.token ?? ""]);
263
+ const attempt = (operation, run) => Effect.tryPromise({
264
+ try: run,
265
+ catch: (cause) => SandboxProvider.providerError({
266
+ driver: name,
267
+ operation,
268
+ cause,
269
+ redact,
270
+ sanitize: sanitizeProviderError,
271
+ notFound: isNotFound(cause)
272
+ })
273
+ });
274
+ const get = (providerResourceId, resume, operation) => attempt(operation, () => import("@vercel/sandbox").then(({ Sandbox }) => Sandbox.get(credentials === void 0 ? {
275
+ name: providerResourceId,
276
+ resume
277
+ } : {
278
+ ...credentials,
279
+ name: providerResourceId,
280
+ resume
281
+ })));
282
+ const observed = (sandbox) => ({
283
+ ...statusFrom(sandbox.status),
284
+ metadata: { cwd: sandbox.cwd }
285
+ });
286
+ return SandboxDriver.driver({
287
+ name,
288
+ kind: "remote",
289
+ capabilities: {
290
+ inspect: true,
291
+ reattach: true,
292
+ wake: true,
293
+ stop: true,
294
+ destroy: true,
295
+ cancels: true
296
+ },
297
+ createConfigCodec: CreateConfig,
298
+ runtimeConfigCodec: RuntimeConfig,
299
+ create: ({ instanceId, config }) => Effect.gen(function* () {
300
+ const source = config.source?.type === "git" ? {
301
+ type: "git",
302
+ url: config.source.url,
303
+ ...config.source.revision === void 0 ? {} : { revision: config.source.revision },
304
+ ...config.source.depth === void 0 ? {} : { depth: config.source.depth }
305
+ } : config.source;
306
+ const sandbox = yield* attempt("create", () => createSandbox({
307
+ ...client,
308
+ ...config.snapshot === void 0 ? {} : { snapshot: config.snapshot },
309
+ ...source === void 0 ? {} : { source },
310
+ ...config.runtime === void 0 ? {} : { runtime: config.runtime },
311
+ ...config.ports === void 0 ? {} : { ports: [...config.ports] },
312
+ ...config.envVars === void 0 ? {} : { envVars: config.envVars },
313
+ ...config.vcpus === void 0 ? {} : { vcpus: config.vcpus },
314
+ ...config.timeout === void 0 ? {} : { timeout: config.timeout },
315
+ ...config.execTimeout === void 0 ? {} : { execTimeout: config.execTimeout },
316
+ tags: {
317
+ "codework-instance": instanceId,
318
+ "codework-managed": "true"
319
+ }
320
+ }, credentials));
321
+ const state = statusFrom(sandbox.status);
322
+ return {
323
+ providerResourceId: sandbox.name,
324
+ providerStatus: state.providerStatus,
325
+ runtimeConfig: {
326
+ defaultCwd: SandboxDriver.AbsolutePath.make(sandbox.cwd || "/vercel/sandbox"),
327
+ ...config.execTimeout === void 0 ? {} : { execTimeout: config.execTimeout }
328
+ },
329
+ metadata: { cwd: sandbox.cwd }
330
+ };
331
+ }),
332
+ runtimeConfigFor: ({ providerResourceId, overrides }) => Effect.map(get(providerResourceId, false, "runtimeConfigFor"), (sandbox) => ({
333
+ defaultCwd: overrides?.defaultCwd ?? SandboxDriver.AbsolutePath.make(sandbox.cwd || "/vercel/sandbox"),
334
+ ...overrides?.execTimeout === void 0 ? {} : { execTimeout: overrides.execTimeout }
335
+ })),
336
+ attach: (input) => Layer.unwrap(Effect.map(get(Option.getOrElse(input.providerResourceId, () => input.id), true, "attach"), (sandbox) => transport(sandbox, input.runtimeConfig.execTimeout === void 0 ? void 0 : { execTimeout: input.runtimeConfig.execTimeout }))),
337
+ inspect: (input) => Effect.map(get(Option.getOrElse(input.providerResourceId, () => input.id), false, "inspect"), observed),
338
+ wake: (input) => Effect.map(get(Option.getOrElse(input.providerResourceId, () => input.id), true, "wake"), observed),
339
+ stop: (input) => Effect.flatMap(get(Option.getOrElse(input.providerResourceId, () => input.id), false, "stop"), (sandbox) => attempt("stop", () => sandbox.stop()).pipe(Effect.map(() => observed(sandbox)))),
340
+ destroy: (input) => Effect.flatMap(get(Option.getOrElse(input.providerResourceId, () => input.id), false, "destroy"), (sandbox) => attempt("destroy", () => sandbox.delete()))
341
+ });
342
+ };
343
+ const sandbox = SandboxDriver.module({
344
+ apiVersion: SandboxDriver.apiVersion,
345
+ name,
346
+ options: Options,
347
+ make
348
+ });
349
+ const config = (value) => ({
350
+ driver: "vercel",
351
+ config: value
352
+ });
353
+ //#endregion
354
+ export { Source as a, sandbox as c, RuntimeConfig as i, CreateConfig as n, config as o, Options as r, make as s, ClientOptions as t };
355
+
356
+ //# sourceMappingURL=vercel-C0v5nh20.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vercel-C0v5nh20.mjs","names":["make","SandboxInstance","makeRedactor","sanitizeSandboxError","SandboxFileSystem","resolveCwd","ShellError","quoteArgv","RemoteFileSystem.make","Shell","SandboxResource","EnvVercel.credentialsFrom","EnvVercel.sanitizeProviderError","EnvVercel.createSandbox","EnvVercel.transport"],"sources":["../../src/sandboxes/vercel/fs.ts","../../src/sandboxes/vercel/provider.ts","../../src/sandboxes/vercel/index.ts"],"sourcesContent":["import { posix } from \"../../util/posix.ts\";\nimport { SandboxFileSystem } from \"../../sandbox/fs/filesystem.ts\";\n\n// The provider contract and FileStat live in `filesystem.ts` (the single source of truth, VFS-free).\n// A remote provider implements this Interface; `make` wraps\n// it into the same runtime surface the local vfs backend exposes.\nexport type FileStat = SandboxFileSystem.FileStat;\n\n// Remote-aware callers can opt into metadata that is not part of the generic\n// SandboxFileSystem surface. In particular, `stat` keeps the familiar\n// provider-level meaning, while `lstat` explicitly asks for the directory entry\n// itself so symlink identity is not inferred from a method with mixed provider\n// semantics.\nexport interface Interface extends SandboxFileSystem.Provider {\n\treadonly lstat?: (path: string) => Promise<FileStat>;\n}\n\nexport interface Options {\n\t/**\n\t * Optional remote working directory for relative paths. When omitted, relative\n\t * paths are passed through so the remote provider can use its own default cwd.\n\t */\n\treadonly cwd?: string;\n}\n\nconst resolvePath = (path: string, options?: Options) => {\n\tconst normalized = posix.normalize(path);\n\tif (options?.cwd === undefined || posix.isAbsolute(normalized)) return normalized;\n\treturn posix.normalize(posix.join(options.cwd, normalized));\n};\n\n/**\n * Wrap a remote provider into the runtime filesystem surface: resolve relative\n * paths against `cwd`, and nothing else. Parent creation and `rm` option\n * validation are the runtime's job and live in `SandboxFileSystem.fromProvider`,\n * which every backend passes through — putting them here would cover only the\n * backends that happen to use this wrapper.\n */\nexport const make = (provider: Interface, options?: Options): SandboxFileSystem.Provider => {\n\tconst resolve = (path: string) => resolvePath(path, options);\n\n\treturn {\n\t\treadFile: (path) => provider.readFile(resolve(path)),\n\t\treadFileBuffer: (path) => provider.readFileBuffer(resolve(path)),\n\t\twriteFile: (path, content) => provider.writeFile(resolve(path), content),\n\t\tstat: (path) => provider.stat(resolve(path)),\n\t\t...(provider.lstat === undefined ? {} : { lstat: (path: string) => provider.lstat!(resolve(path)) }),\n\t\treaddir: (path) => provider.readdir(resolve(path)),\n\t\texists: (path) => provider.exists(resolve(path)),\n\t\tmkdir: (path, mkdirOptions) => provider.mkdir(resolve(path), mkdirOptions),\n\t\t// option validation happens in `fromProvider`, before any mutation\n\t\trm: (path, rmOptions) => provider.rm(resolve(path), rmOptions),\n\t\trealpath: (path) => provider.realpath(resolve(path)),\n\t};\n};\n\nexport const withProvider = make;\n","/* oxlint-disable effecttsgo/async-function -- Vercel's sandbox SDK boundary is Promise-based. */\nimport { Context, Effect, Layer, Schema, Stream } from \"effect\";\nimport { Buffer } from \"node:buffer\";\nimport { makeRedactor, type Redactor, sanitizeError as sanitizeSandboxError } from \"../../sandbox/errors.ts\";\nimport { SandboxFileSystem } from \"../../sandbox/fs/filesystem.ts\";\nimport { SandboxInstance } from \"../../sandbox/instance.ts\";\nimport { SandboxIO } from \"../../sandbox/io.ts\";\nimport { SandboxResource } from \"../../sandbox/resource.ts\";\nimport {\n\ttype ExecChunk,\n\ttype ExecResult,\n\ttype ISandboxExe,\n\tquoteArgv,\n\tresolveCwd,\n\tShell,\n\tShellError,\n} from \"../../sandbox/shell/shell.ts\";\nimport * as RemoteFileSystem from \"./fs.ts\";\n\nconst utf8 = new TextEncoder();\ntype Command = import(\"@vercel/sandbox\").Command;\ntype RemoteSandbox = import(\"@vercel/sandbox\").Sandbox;\n\n/** Vercel's namespace-intrinsic working directory. */\nexport const DEFAULT_CWD = \"/vercel/sandbox\";\n\nexport class VercelError extends Schema.TaggedError<VercelError>()(\"VercelError\", {\n\tsanitized: SandboxInstance.PersistedError,\n}) {}\n\nconst ApiFailure = Schema.Struct({\n\tjson: Schema.Struct({\n\t\terror: Schema.Struct({\n\t\t\tmessage: Schema.optional(Schema.String),\n\t\t\tcode: Schema.optional(Schema.String),\n\t\t}),\n\t}),\n});\nconst isApiFailure = Schema.is(ApiFailure);\n\n/** Prefer Vercel's structured API failure while retaining the shared redaction boundary. */\nexport const sanitizeProviderError = (\n\tcause: unknown,\n\tredact: Redactor = makeRedactor(),\n): SandboxInstance.PersistedError => {\n\tconst fallback = sanitizeSandboxError(cause, redact);\n\tif (!isApiFailure(cause)) return fallback;\n\tconst message = cause.json.error.message?.trim();\n\tconst code = cause.json.error.code?.trim();\n\treturn {\n\t\t...fallback,\n\t\t...(message === undefined || message.length === 0 ? {} : { message: redact(message) }),\n\t\t...(code === undefined || code.length === 0 ? {} : { code: redact(code) }),\n\t};\n};\n\n/**\n * Vercel API credentials. Either all three are provided together or none are:\n * when omitted, the SDK resolves them from the `VERCEL_OIDC_TOKEN` env var\n * (the token's payload carries the project and team ids).\n */\nexport interface Credentials {\n\treadonly token: string;\n\treadonly teamId: string;\n\treadonly projectId: string;\n}\n\nexport interface Options {\n\t/** Auth token (OIDC or access token). Falls back to `VERCEL_OIDC_TOKEN`. */\n\treadonly token?: string | undefined;\n\t/** Team id. Derived from the OIDC token when omitted. */\n\treadonly teamId?: string | undefined;\n\t/** Project id. Derived from the OIDC token when omitted. */\n\treadonly projectId?: string | undefined;\n\t/** Reuse an existing sandbox by name instead of creating one. */\n\treadonly sandboxName?: string | undefined;\n\t/** Explicit name for a newly created sandbox. */\n\treadonly name?: string | undefined;\n\t/** Provider-side diagnostic labels (maximum five). */\n\treadonly tags?: Record<string, string> | undefined;\n\t/** Durable instance identity for this namespace. Supplied by the Controller. */\n\treadonly instanceId?: SandboxInstance.ID | undefined;\n\t/** Snapshot id to create the sandbox from. */\n\treadonly snapshot?: string | undefined;\n\t/** Source to seed the sandbox filesystem from (git or tarball). */\n\treadonly source?:\n\t\t| {\n\t\t\t\treadonly type: \"git\";\n\t\t\t\treadonly url: string;\n\t\t\t\treadonly revision?: string | undefined;\n\t\t\t\treadonly depth?: number | undefined;\n\t\t }\n\t\t| { readonly type: \"tarball\"; readonly url: string };\n\t/** Runtime used by the sandbox. Defaults to the SDK default (`node24`). */\n\treadonly runtime?: string | undefined;\n\t/** Ports to expose from the sandbox (max 4). */\n\treadonly ports?: number[] | undefined;\n\t/** Environment variables baked into the sandbox. */\n\treadonly envVars?: Record<string, string> | undefined;\n\t/** vCPU allocation (memory scales at 2048 MB per vCPU). */\n\treadonly vcpus?: number | undefined;\n\t/**\n\t * Mount working directory. Relative values resolve against `/vercel/sandbox`;\n\t * omitted values use that namespace default.\n\t */\n\treadonly cwd?: string | undefined;\n\t/** Milliseconds before the sandbox auto-terminates. */\n\treadonly timeout?: number | undefined;\n\t/** Per-command timeout in milliseconds. Omit for no timeout. */\n\treadonly execTimeout?: number | undefined;\n}\n\ninterface RemoteState {\n\treadonly sandbox: RemoteSandbox;\n}\n\nclass Remote extends Context.Service<Remote, RemoteState>()(\"@codeworksh/harness/sandboxes/vercel/provider/Remote\") {}\n\n// Vercel requires all three credential fields together or none — partial\n// credentials are rejected by the SDK — so only forward them when complete.\nexport const credentialsFrom = (options: Options): Credentials | undefined =>\n\toptions.token !== undefined && options.teamId !== undefined && options.projectId !== undefined\n\t\t? { token: options.token, teamId: options.teamId, projectId: options.projectId }\n\t\t: undefined;\n\nexport const createSandbox = async (options: Options, creds: Credentials | undefined = credentialsFrom(options)) => {\n\tconst { Sandbox } = await import(\"@vercel/sandbox\");\n\tconst withCreds = <T extends object>(params: T) => (creds ? { ...params, ...creds } : params);\n\tconst source =\n\t\toptions.source?.type === \"git\"\n\t\t\t? {\n\t\t\t\t\ttype: \"git\" as const,\n\t\t\t\t\turl: options.source.url,\n\t\t\t\t\t...(options.source.revision === undefined ? {} : { revision: options.source.revision }),\n\t\t\t\t\t...(options.source.depth === undefined ? {} : { depth: options.source.depth }),\n\t\t\t\t}\n\t\t\t: options.source;\n\tconst base = {\n\t\t...(options.name === undefined ? {} : { name: options.name }),\n\t\t...(options.tags === undefined ? {} : { tags: options.tags }),\n\t\t...(options.envVars === undefined ? {} : { env: options.envVars }),\n\t\t...(options.ports === undefined ? {} : { ports: options.ports }),\n\t\t...(options.timeout === undefined ? {} : { timeout: options.timeout }),\n\t\t...(options.vcpus === undefined ? {} : { resources: { vcpus: options.vcpus } }),\n\t};\n\treturn options.snapshot !== undefined\n\t\t? Sandbox.create(withCreds({ ...base, source: { type: \"snapshot\" as const, snapshotId: options.snapshot } }))\n\t\t: Sandbox.create(\n\t\t\t\twithCreds({\n\t\t\t\t\t...base,\n\t\t\t\t\t...(options.runtime === undefined ? {} : { runtime: options.runtime }),\n\t\t\t\t\t...(source === undefined ? {} : { source }),\n\t\t\t\t}),\n\t\t\t);\n};\n\nconst remote = (options: Options) =>\n\tLayer.effect(\n\t\tRemote,\n\t\tEffect.tryPromise({\n\t\t\ttry: async (): Promise<RemoteState> => {\n\t\t\t\tconst { Sandbox } = await import(\"@vercel/sandbox\");\n\t\t\t\tconst creds = credentialsFrom(options);\n\t\t\t\tconst sandbox = options.sandboxName\n\t\t\t\t\t? await Sandbox.get(creds ? { ...creds, name: options.sandboxName } : { name: options.sandboxName })\n\t\t\t\t\t: await createSandbox(options, creds);\n\t\t\t\treturn { sandbox };\n\t\t\t},\n\t\t\tcatch: (cause) => new VercelError({ sanitized: sanitizeProviderError(cause) }),\n\t\t}),\n\t);\n\ninterface Stats {\n\treadonly size: number;\n\treadonly mtime: Date;\n\treadonly isFile: () => boolean;\n\treadonly isDirectory: () => boolean;\n\treadonly isSymbolicLink: () => boolean;\n}\n\nexport const statsFrom = (stats: Stats): RemoteFileSystem.FileStat => {\n\tconst mtime = stats.mtime;\n\n\t// omit size/mtime the stat could not report — never fabricate\n\treturn {\n\t\tisFile: stats.isFile(),\n\t\tisDirectory: stats.isDirectory(),\n\t\tisSymbolicLink: stats.isSymbolicLink(),\n\t\t...(Number.isFinite(stats.size) ? { size: stats.size } : {}),\n\t\t...(mtime instanceof Date && !Number.isNaN(mtime.getTime()) ? { mtime } : {}),\n\t};\n};\n\ntype RemoteFilesystemProvider = Pick<\n\tRemoteFileSystem.Interface,\n\t\"readFile\" | \"readFileBuffer\" | \"writeFile\" | \"stat\" | \"lstat\" | \"readdir\" | \"exists\" | \"mkdir\" | \"rm\" | \"realpath\"\n>;\n\n// The Vercel `fs` surface is `node:fs/promises`-compatible, so the provider\n// maps almost directly. The `RemoteFileSystem.make` wrapper resolves relative\n// paths against `cwd` and guarantees parent creation on `writeFile`. Only\n// `realpath` has no fs counterpart and shells out.\nconst providerFrom = (sandbox: RemoteSandbox, options: Options): RemoteFilesystemProvider => {\n\tconst filesystem: RemoteFilesystemProvider = {\n\t\treadFile: (path: string) => sandbox.fs.readFile(path, \"utf8\"),\n\t\treadFileBuffer: async (path: string) => new Uint8Array(await sandbox.fs.readFile(path)),\n\t\twriteFile: (path: string, content: string | Uint8Array) =>\n\t\t\tsandbox.fs.writeFile(path, typeof content === \"string\" ? Buffer.from(content, \"utf8\") : Buffer.from(content)),\n\t\tstat: async (path: string) => statsFrom(await sandbox.fs.stat(path)),\n\t\t// Keep symlink identity explicit: Vercel's `stat` follows symlinks\n\t\t// (`stat -L`), so remote-aware callers must ask for `lstat` when they\n\t\t// need the entry itself instead of the target's metadata.\n\t\tlstat: async (path: string) => statsFrom(await sandbox.fs.lstat(path)),\n\t\t// `withFileTypes` lists via `find`, which includes dotfiles (`.git` …);\n\t\t// the bare `readdir` shells out to `ls -1` and would drop them.\n\t\treaddir: async (path: string) => (await sandbox.fs.readdir(path, { withFileTypes: true })).map((e) => e.name),\n\t\texists: async (path: string) => {\n\t\t\ttry {\n\t\t\t\tawait sandbox.fs.stat(path);\n\t\t\t\treturn true;\n\t\t\t} catch (cause) {\n\t\t\t\tif (SandboxFileSystem.isNotFoundError(cause)) return false;\n\t\t\t\tthrow cause;\n\t\t\t}\n\t\t},\n\t\tmkdir: async (path: string, mkdirOptions?: { recursive?: boolean }) => {\n\t\t\tawait sandbox.fs.mkdir(\n\t\t\t\tpath,\n\t\t\t\tmkdirOptions?.recursive === undefined ? {} : { recursive: mkdirOptions.recursive },\n\t\t\t);\n\t\t},\n\t\t// `rm -f` is native, so force/recursive delegate straight through; the\n\t\t// wrapper has already rejected any unsupported option before we get here.\n\t\trm: (path: string, rmOptions?: { recursive?: boolean; force?: boolean }) =>\n\t\t\tsandbox.fs.rm(path, {\n\t\t\t\t...(rmOptions?.recursive === undefined ? {} : { recursive: rmOptions.recursive }),\n\t\t\t\t...(rmOptions?.force === undefined ? {} : { force: rmOptions.force }),\n\t\t\t}),\n\t\trealpath: async (path: string) => {\n\t\t\tfor (const script of SandboxFileSystem.realpathScripts) {\n\t\t\t\tconst result = await (await spawnArgv(sandbox, options, [\"sh\", \"-c\", script, \"_\", path])).wait();\n\t\t\t\tif (result.exitCode === 0) return (await result.stdout()).trimEnd();\n\t\t\t}\n\t\t\t// same shape `fs.stat` rejects with, so `isNotFoundError` recognises it\n\t\t\tthrow Object.assign(new Error(`ENOENT: no such file or directory, realpath '${path}'`), { code: \"ENOENT\" });\n\t\t},\n\t};\n\n\treturn filesystem;\n};\n\n// Arbitrary command strings run through `sh -c` to match the single-string\n// contract the rest of the harness expects. Commands run **detached** so the\n// returned `Command` exposes `kill`/`logs`/`wait`: a `cwd`/`env` is threaded in,\n// and the per-command `execTimeout` is a server-side SIGKILL deadline.\nconst spawn = (\n\tsandbox: RemoteSandbox,\n\toptions: Options,\n\tcommand: string,\n\tenv?: Record<string, string>,\n\tcwd?: string,\n): Promise<Command> => spawnArgv(sandbox, options, [\"sh\", \"-c\", command], env, cwd);\n\n// Vercel spawns a program with a real argument vector, so `execArgv` needs no\n// quoting at all — the args never pass through a shell.\nconst spawnArgv = (\n\tsandbox: RemoteSandbox,\n\toptions: Options,\n\targv: ReadonlyArray<string>,\n\tenv?: Record<string, string>,\n\tcwd?: string,\n): Promise<Command> => {\n\tconst resolvedCwd = resolveCwd(options.cwd, cwd);\n\treturn sandbox.runCommand({\n\t\tcmd: argv[0]!,\n\t\targs: argv.slice(1),\n\t\t...(resolvedCwd === undefined ? {} : { cwd: resolvedCwd }),\n\t\t...(env === undefined ? {} : { env }),\n\t\tdetached: true,\n\t\t...(options.execTimeout === undefined ? {} : { timeoutMs: options.execTimeout }),\n\t});\n};\n\n// Acquire a detached command and register its kill as a scope finalizer, so an\n// interrupt / timeout from the consumer actually terminates the remote process\n// (best-effort SIGKILL) instead of leaving it running server-side.\n// `command` labels failures only; the spawn itself is supplied by the caller so\n// string and argv execution share one kill finalizer.\nconst acquireWith = (command: string, run: () => Promise<Command>) =>\n\tEffect.acquireRelease(Effect.tryPromise({ try: run, catch: (cause) => new ShellError({ command, cause }) }), (cmd) =>\n\t\tEffect.promise(() => cmd.kill(\"SIGKILL\").catch(() => {})),\n\t);\n\n// Vercel reports stdout and stderr separately with a distinct exit code, so the\n// shell surfaces both streams faithfully.\nconst collect = (command: string) => (cmd: Command) =>\n\tEffect.tryPromise({\n\t\ttry: async (): Promise<ExecResult> => {\n\t\t\tconst result = await cmd.wait();\n\t\t\tconst [stdout, stderr] = await Promise.all([result.stdout(), result.stderr()]);\n\t\t\treturn { stdout, stderr, exitCode: result.exitCode };\n\t\t},\n\t\tcatch: (cause) => new ShellError({ command, cause }),\n\t});\n\nconst acquireCommand = (\n\tsandbox: RemoteSandbox,\n\toptions: Options,\n\tcommand: string,\n\tenv?: Record<string, string>,\n\tcwd?: string,\n) => acquireWith(command, () => spawn(sandbox, options, command, env, cwd));\n\nconst exec =\n\t(sandbox: RemoteSandbox, options: Options): ISandboxExe[\"exec\"] =>\n\t(command, opts) =>\n\t\tacquireCommand(sandbox, options, command, opts?.env, opts?.cwd).pipe(\n\t\t\tEffect.flatMap(collect(command)),\n\t\t\tEffect.scoped,\n\t\t);\n\nconst execArgv =\n\t(sandbox: RemoteSandbox, options: Options): ISandboxExe[\"execArgv\"] =>\n\t(argv, opts) => {\n\t\t// quoted for the error label only — the spawn passes argv through untouched\n\t\tconst command = quoteArgv(argv);\n\t\treturn acquireWith(command, () => spawnArgv(sandbox, options, argv, opts?.env, opts?.cwd)).pipe(\n\t\t\tEffect.flatMap(collect(command)),\n\t\t\tEffect.scoped,\n\t\t);\n\t};\n\n// Streaming output via `Command.logs` (an async generator of stdout/stderr\n// entries), followed by the exit code from `wait`. The kill finalizer fires when\n// the consuming scope closes (interrupt / timeout).\nconst stream =\n\t(sandbox: RemoteSandbox, options: Options): NonNullable<ISandboxExe[\"stream\"]> =>\n\t(command, opts) =>\n\t\tStream.unwrap(\n\t\t\tacquireCommand(sandbox, options, command, opts?.env, opts?.cwd).pipe(\n\t\t\t\tEffect.map((cmd) => {\n\t\t\t\t\tconst logs = Stream.fromAsyncIterable(cmd.logs(), (cause) => new ShellError({ command, cause })).pipe(\n\t\t\t\t\t\tStream.map((log): ExecChunk => ({ _tag: log.stream, bytes: utf8.encode(log.data) })),\n\t\t\t\t\t);\n\t\t\t\t\tconst exit = Stream.fromEffect(\n\t\t\t\t\t\tEffect.tryPromise({ try: () => cmd.wait(), catch: (cause) => new ShellError({ command, cause }) }),\n\t\t\t\t\t).pipe(Stream.map((finished): ExecChunk => ({ _tag: \"exit\", exitCode: finished.exitCode })));\n\t\t\t\t\treturn Stream.concat(logs, exit);\n\t\t\t\t}),\n\t\t\t),\n\t\t);\n\nconst filesystemLayer = (options: Options) =>\n\tLayer.effect(\n\t\tSandboxFileSystem.Service,\n\t\tEffect.map(Remote, ({ sandbox }) =>\n\t\t\tSandboxFileSystem.fromProvider(\n\t\t\t\tRemoteFileSystem.make(\n\t\t\t\t\tproviderFrom(sandbox, options),\n\t\t\t\t\toptions.cwd === undefined ? undefined : { cwd: options.cwd },\n\t\t\t\t),\n\t\t\t),\n\t\t),\n\t);\n\nconst shellLayer = (options: Options) =>\n\tLayer.effect(\n\t\tShell,\n\t\tEffect.map(Remote, ({ sandbox }) =>\n\t\t\tShell.of({\n\t\t\t\texec: exec(sandbox, options),\n\t\t\t\texecArgv: execArgv(sandbox, options),\n\t\t\t\tstream: stream(sandbox, options),\n\t\t\t}),\n\t\t),\n\t);\n\n/**\n * Cwd-neutral IO attachment for a lifecycle driver.\n *\n * The controller binds a cwd per mount, so neither filesystem nor shell stores\n * one here. The returned layer owns no provider resource and has no deletion\n * finalizer.\n */\nexport const transport = (\n\tsandbox: RemoteSandbox,\n\toptions: Pick<Options, \"execTimeout\"> = {},\n): Layer.Layer<SandboxFileSystem.Service | Shell> =>\n\tLayer.merge(\n\t\tLayer.succeed(\n\t\t\tSandboxFileSystem.Service,\n\t\t\tSandboxFileSystem.fromProvider(RemoteFileSystem.make(providerFrom(sandbox, options))),\n\t\t),\n\t\tLayer.succeed(\n\t\t\tShell,\n\t\t\tShell.of({\n\t\t\t\texec: exec(sandbox, options),\n\t\t\t\texecArgv: execArgv(sandbox, options),\n\t\t\t\tstream: stream(sandbox, options),\n\t\t\t}),\n\t\t),\n\t);\n\n// Vercel's locator is the sandbox name. See `SandboxResource` for why this is a\n// shared tag rather than a Vercel-specific one.\nconst resourceLayer = Layer.effect(\n\tSandboxResource.Service,\n\tEffect.map(Remote, ({ sandbox }) => ({ providerResourceId: sandbox.name })),\n);\n\n// Identity is per remote sandbox, not per provider: two sandboxes both rooted at\n// the same directory must not share persisted directory records.\n//\n// The id is minted here only when the caller names none. A durable id is the\n// control plane's to mint and record — deriving one from the provider's own\n// locator is what §6.1 forbids — so a caller that needs the namespace to survive\n// a restart passes `instanceId` rather than relying on this.\nconst identityLayer = (options: Options) =>\n\tLayer.effect(\n\t\tSandboxIO.Current,\n\t\tEffect.map(Remote, () =>\n\t\t\tSandboxIO.remote({\n\t\t\t\tdriver: \"vercel\",\n\t\t\t\tid: options.instanceId ?? SandboxInstance.ID.create(),\n\t\t\t\tdefaultCwd: DEFAULT_CWD,\n\t\t\t\t...(options.cwd === undefined ? {} : { cwd: options.cwd }),\n\t\t\t}),\n\t\t),\n\t);\n\n/**\n * A Vercel sandbox provides the runtime filesystem service directly plus the\n * sandbox's native remote shell. It intentionally does not provide VFS: remote\n * filesystems have no synchronous filesystem surface.\n */\nexport const layer = (\n\toptions: Options = {},\n): Layer.Layer<SandboxIO.Provides | SandboxResource.Service, VercelError> => {\n\tconst mounted = { ...options, cwd: SandboxIO.resolveMountCwd(DEFAULT_CWD, options.cwd) };\n\treturn Layer.mergeAll(filesystemLayer(mounted), shellLayer(mounted), identityLayer(mounted), resourceLayer).pipe(\n\t\tLayer.provide(remote(mounted)),\n\t);\n};\n\nexport const services = layer;\n","import { Effect, Layer, Option, Schema } from \"effect\";\nimport { SandboxDriver, SandboxInstance, SandboxProvider } from \"../../sandbox.ts\";\nimport * as EnvVercel from \"./provider.ts\";\n\nexport const Options = Schema.Struct({\n\ttoken: Schema.optional(Schema.String),\n\tteamId: Schema.optional(Schema.String),\n\tprojectId: Schema.optional(Schema.String),\n});\nexport type Options = typeof Options.Type;\nexport const ClientOptions = Options;\nexport type ClientOptions = Options;\n\nexport const Source = Schema.Union([\n\tSchema.Struct({\n\t\ttype: Schema.Literal(\"git\"),\n\t\turl: Schema.String,\n\t\trevision: Schema.optional(Schema.String),\n\t\tdepth: Schema.optional(Schema.Finite),\n\t}),\n\tSchema.Struct({\n\t\ttype: Schema.Literal(\"tarball\"),\n\t\turl: Schema.String,\n\t}),\n]);\nexport type Source = typeof Source.Type;\n\nexport const CreateConfig = Schema.Struct({\n\tsnapshot: Schema.optional(Schema.String),\n\tsource: Schema.optional(Source),\n\truntime: Schema.optional(Schema.String),\n\tports: Schema.optional(Schema.Array(Schema.Finite)),\n\tenvVars: Schema.optional(Schema.Record(Schema.String, Schema.String)),\n\tvcpus: Schema.optional(Schema.Finite),\n\ttimeout: Schema.optional(Schema.Finite),\n\texecTimeout: Schema.optional(Schema.Finite),\n});\nexport type CreateConfig = typeof CreateConfig.Type;\n\nexport const RuntimeConfig = Schema.Struct({\n\tdefaultCwd: SandboxDriver.AbsolutePath,\n\texecTimeout: Schema.optional(Schema.Finite),\n});\nexport type RuntimeConfig = typeof RuntimeConfig.Type;\n\nconst name = SandboxDriver.Name.make(\"vercel\");\ntype RemoteSandbox = import(\"@vercel/sandbox\").Sandbox;\n\nconst statusFrom = (\n\tstatus: RemoteSandbox[\"status\"],\n): {\n\treadonly status: SandboxInstance.Status;\n\treadonly providerStatus: string;\n} => ({\n\tstatus:\n\t\tstatus === \"stopped\"\n\t\t\t? \"offline\"\n\t\t\t: status === \"stopping\" || status === \"snapshotting\"\n\t\t\t\t? \"suspending\"\n\t\t\t\t: status === \"failed\" || status === \"aborted\"\n\t\t\t\t\t? \"faulted\"\n\t\t\t\t\t: \"online\",\n\tproviderStatus: status,\n});\n\nconst isNotFound = (cause: unknown): boolean => {\n\tif (typeof cause !== \"object\" || cause === null) return false;\n\tconst response = \"response\" in cause && cause.response instanceof Response ? cause.response : undefined;\n\tconst code =\n\t\t\"code\" in cause && typeof cause.code === \"string\"\n\t\t\t? cause.code\n\t\t\t: \"json\" in cause &&\n\t\t\t\t typeof cause.json === \"object\" &&\n\t\t\t\t cause.json !== null &&\n\t\t\t\t \"error\" in cause.json &&\n\t\t\t\t typeof cause.json.error === \"object\" &&\n\t\t\t\t cause.json.error !== null &&\n\t\t\t\t \"code\" in cause.json.error &&\n\t\t\t\t typeof cause.json.error.code === \"string\"\n\t\t\t\t? cause.json.error.code\n\t\t\t\t: undefined;\n\treturn response?.status === 404 || code === \"not_found\" || code === \"sandbox_not_found\";\n};\n\nexport const make = (\n\tclient: ClientOptions = {},\n): SandboxDriver.Driver<CreateConfig, RuntimeConfig> & SandboxDriver.Registration => {\n\tconst credentials = EnvVercel.credentialsFrom(client);\n\tconst redact = SandboxProvider.makeRedactor([client.token ?? \"\"]);\n\n\tconst attempt = <A>(\n\t\toperation: string,\n\t\trun: () => Promise<A>,\n\t): Effect.Effect<A, SandboxProvider.SandboxProviderError> =>\n\t\tEffect.tryPromise({\n\t\t\ttry: run,\n\t\t\tcatch: (cause) =>\n\t\t\t\tSandboxProvider.providerError({\n\t\t\t\t\tdriver: name,\n\t\t\t\t\toperation,\n\t\t\t\t\tcause,\n\t\t\t\t\tredact,\n\t\t\t\t\tsanitize: EnvVercel.sanitizeProviderError,\n\t\t\t\t\tnotFound: isNotFound(cause),\n\t\t\t\t}),\n\t\t});\n\n\tconst get = (providerResourceId: string, resume: boolean, operation: string) =>\n\t\tattempt(operation, () =>\n\t\t\timport(\"@vercel/sandbox\").then(({ Sandbox }) =>\n\t\t\t\tSandbox.get(\n\t\t\t\t\tcredentials === undefined\n\t\t\t\t\t\t? { name: providerResourceId, resume }\n\t\t\t\t\t\t: { ...credentials, name: providerResourceId, resume },\n\t\t\t\t),\n\t\t\t),\n\t\t);\n\n\tconst observed = (sandbox: RemoteSandbox): SandboxDriver.Observed => ({\n\t\t...statusFrom(sandbox.status),\n\t\tmetadata: {\n\t\t\tcwd: sandbox.cwd,\n\t\t},\n\t});\n\n\treturn SandboxDriver.driver({\n\t\tname,\n\t\tkind: \"remote\",\n\t\tcapabilities: {\n\t\t\tinspect: true,\n\t\t\treattach: true,\n\t\t\twake: true,\n\t\t\tstop: true,\n\t\t\tdestroy: true,\n\t\t\tcancels: true,\n\t\t},\n\t\tcreateConfigCodec: CreateConfig,\n\t\truntimeConfigCodec: RuntimeConfig,\n\t\tcreate: ({ instanceId, config }) =>\n\t\t\tEffect.gen(function* () {\n\t\t\t\tconst source =\n\t\t\t\t\tconfig.source?.type === \"git\"\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\ttype: \"git\" as const,\n\t\t\t\t\t\t\t\turl: config.source.url,\n\t\t\t\t\t\t\t\t...(config.source.revision === undefined ? {} : { revision: config.source.revision }),\n\t\t\t\t\t\t\t\t...(config.source.depth === undefined ? {} : { depth: config.source.depth }),\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t: config.source;\n\t\t\t\tconst sandbox = yield* attempt(\"create\", () =>\n\t\t\t\t\tEnvVercel.createSandbox(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t...client,\n\t\t\t\t\t\t\t...(config.snapshot === undefined ? {} : { snapshot: config.snapshot }),\n\t\t\t\t\t\t\t...(source === undefined ? {} : { source }),\n\t\t\t\t\t\t\t...(config.runtime === undefined ? {} : { runtime: config.runtime }),\n\t\t\t\t\t\t\t...(config.ports === undefined ? {} : { ports: [...config.ports] }),\n\t\t\t\t\t\t\t...(config.envVars === undefined ? {} : { envVars: config.envVars }),\n\t\t\t\t\t\t\t...(config.vcpus === undefined ? {} : { vcpus: config.vcpus }),\n\t\t\t\t\t\t\t...(config.timeout === undefined ? {} : { timeout: config.timeout }),\n\t\t\t\t\t\t\t...(config.execTimeout === undefined ? {} : { execTimeout: config.execTimeout }),\n\t\t\t\t\t\t\ttags: {\n\t\t\t\t\t\t\t\t\"codework-instance\": instanceId,\n\t\t\t\t\t\t\t\t\"codework-managed\": \"true\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tcredentials,\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t\tconst state = statusFrom(sandbox.status);\n\t\t\t\treturn {\n\t\t\t\t\tproviderResourceId: sandbox.name,\n\t\t\t\t\tproviderStatus: state.providerStatus,\n\t\t\t\t\truntimeConfig: {\n\t\t\t\t\t\tdefaultCwd: SandboxDriver.AbsolutePath.make(sandbox.cwd || EnvVercel.DEFAULT_CWD),\n\t\t\t\t\t\t...(config.execTimeout === undefined ? {} : { execTimeout: config.execTimeout }),\n\t\t\t\t\t},\n\t\t\t\t\tmetadata: {\n\t\t\t\t\t\tcwd: sandbox.cwd,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t}),\n\t\truntimeConfigFor: ({ providerResourceId, overrides }) =>\n\t\t\tEffect.map(get(providerResourceId, false, \"runtimeConfigFor\"), (sandbox) => ({\n\t\t\t\tdefaultCwd: overrides?.defaultCwd ?? SandboxDriver.AbsolutePath.make(sandbox.cwd || EnvVercel.DEFAULT_CWD),\n\t\t\t\t...(overrides?.execTimeout === undefined ? {} : { execTimeout: overrides.execTimeout }),\n\t\t\t})),\n\t\tattach: (input) =>\n\t\t\tLayer.unwrap(\n\t\t\t\tEffect.map(\n\t\t\t\t\tget(\n\t\t\t\t\t\tOption.getOrElse(input.providerResourceId, () => input.id),\n\t\t\t\t\t\ttrue,\n\t\t\t\t\t\t\"attach\",\n\t\t\t\t\t),\n\t\t\t\t\t(sandbox) =>\n\t\t\t\t\t\tEnvVercel.transport(\n\t\t\t\t\t\t\tsandbox,\n\t\t\t\t\t\t\tinput.runtimeConfig.execTimeout === undefined\n\t\t\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t\t\t: { execTimeout: input.runtimeConfig.execTimeout },\n\t\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t),\n\t\tinspect: (input) =>\n\t\t\tEffect.map(\n\t\t\t\tget(\n\t\t\t\t\tOption.getOrElse(input.providerResourceId, () => input.id),\n\t\t\t\t\tfalse,\n\t\t\t\t\t\"inspect\",\n\t\t\t\t),\n\t\t\t\tobserved,\n\t\t\t),\n\t\twake: (input) =>\n\t\t\tEffect.map(\n\t\t\t\tget(\n\t\t\t\t\tOption.getOrElse(input.providerResourceId, () => input.id),\n\t\t\t\t\ttrue,\n\t\t\t\t\t\"wake\",\n\t\t\t\t),\n\t\t\t\tobserved,\n\t\t\t),\n\t\tstop: (input) =>\n\t\t\tEffect.flatMap(\n\t\t\t\tget(\n\t\t\t\t\tOption.getOrElse(input.providerResourceId, () => input.id),\n\t\t\t\t\tfalse,\n\t\t\t\t\t\"stop\",\n\t\t\t\t),\n\t\t\t\t(sandbox) => attempt(\"stop\", () => sandbox.stop()).pipe(Effect.map(() => observed(sandbox))),\n\t\t\t),\n\t\tdestroy: (input) =>\n\t\t\tEffect.flatMap(\n\t\t\t\tget(\n\t\t\t\t\tOption.getOrElse(input.providerResourceId, () => input.id),\n\t\t\t\t\tfalse,\n\t\t\t\t\t\"destroy\",\n\t\t\t\t),\n\t\t\t\t(sandbox) => attempt(\"destroy\", () => sandbox.delete()),\n\t\t\t),\n\t});\n};\n\nconst sandbox = SandboxDriver.module({\n\tapiVersion: SandboxDriver.apiVersion,\n\tname,\n\toptions: Options,\n\tmake,\n});\n\nexport const config = (value: CreateConfig) => ({ driver: \"vercel\" as const, config: value });\n\nexport default sandbox;\n"],"mappings":"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"}