{"version":3,"file":"index.mjs","names":["VercelSandbox","events: ProcessOutputEvent[]","VercelSnapshot"],"sources":["../../../src/providers/vercel/index.ts"],"sourcesContent":["import { Sandbox as VercelSandbox, Snapshot as VercelSnapshot } from \"@vercel/sandbox\";\nimport { normalizeError, SandboxError } from \"../../core/errors\";\nimport type { SandboxProvider } from \"../../core/provider\";\nimport type {\n  CommandInput,\n  ProcessOutputEvent,\n  SandboxProcess,\n  SandboxSnapshot,\n} from \"../../core/types\";\nimport { portResult, toUint8Array, unsupported } from \"../../internal/provider-utils\";\nimport { vercelCapabilities } from \"../capabilities\";\nimport { withManagedSessions } from \"../../internal/managed-provider\";\n\ninterface VercelBaseOptions {\n  runtime?: \"node24\" | \"node22\" | \"node26\" | \"python3.13\" | (string & {});\n  name?: string;\n  ports?: number[];\n  /** Whether the sandbox persists across sessions. Defaults to true. */\n  persistent?: boolean;\n}\n\nexport type VercelOptions = VercelBaseOptions &\n  (\n    | { token: string; teamId: string; projectId: string }\n    | { token?: never; teamId?: never; projectId?: never }\n  );\n\nexport { vercelCapabilities } from \"../capabilities\";\n\nexport function vercel(options: VercelOptions = {}): SandboxProvider<VercelSandbox> {\n  return withManagedSessions(\n    {\n      id: \"vercel\",\n      capabilities: vercelCapabilities,\n      async create(createOptions) {\n        const credentials =\n          options.token && options.teamId && options.projectId\n            ? {\n                token: options.token,\n                teamId: options.teamId,\n                projectId: options.projectId,\n              }\n            : {};\n        const exposed = new Set(options.ports ?? []);\n        const raw = await VercelSandbox.create({\n          ...credentials,\n          runtime: options.runtime ?? \"node24\",\n          name: options.name,\n          ports: [...exposed],\n          persistent: options.persistent,\n          timeout: createOptions.timeout,\n          env: { ...createOptions.env },\n          signal: createOptions.signal,\n        });\n        const snapshots = new Map<string, VercelSnapshot>();\n        await raw.fs.mkdir(createOptions.cwd, { recursive: true });\n        return {\n          id: raw.name,\n          raw,\n          capabilities: vercelCapabilities,\n          files: {\n            async write(path, value) {\n              await raw.fs.writeFile(path, await toUint8Array(value));\n            },\n            async read(path) {\n              return new Uint8Array(await raw.fs.readFile(path));\n            },\n            async list(path) {\n              const entries = await raw.fs.readdir(path, {\n                withFileTypes: true,\n              });\n              return Promise.all(\n                entries.map(async (entry) => {\n                  const entryPath = `${path.replace(/\\/$/, \"\")}/${entry.name}`;\n                  const info = await raw.fs.lstat(entryPath);\n                  return {\n                    name: entry.name,\n                    path: entryPath,\n                    type: entry.isFile()\n                      ? (\"file\" as const)\n                      : entry.isDirectory()\n                        ? (\"directory\" as const)\n                        : entry.isSymbolicLink()\n                          ? (\"symlink\" as const)\n                          : (\"unknown\" as const),\n                    size: entry.isFile() ? info.size : undefined,\n                  };\n                }),\n              );\n            },\n            async mkdir(path) {\n              await raw.fs.mkdir(path, { recursive: true });\n            },\n            async remove(path) {\n              await raw.fs.rm(path, { recursive: true, force: true });\n            },\n            exists: (path) => raw.fs.exists(path),\n          },\n          async run(command, runOptions) {\n            try {\n              const result = await runCommand(raw, command, runOptions, false);\n              const [stdout, stderr] = await Promise.all([\n                result.stdout({ signal: runOptions.signal }),\n                result.stderr({ signal: runOptions.signal }),\n              ]);\n              if (\n                runOptions.timeout !== undefined &&\n                result.exitCode === 137 &&\n                result.durationMs !== undefined &&\n                result.durationMs >= runOptions.timeout\n              ) {\n                throw new SandboxError({\n                  code: \"timeout\",\n                  provider: \"vercel\",\n                  operation: \"process.run\",\n                  message: `Command timed out after ${runOptions.timeout}ms`,\n                });\n              }\n              return {\n                stdout,\n                stderr,\n                exitCode: result.exitCode,\n                success: result.exitCode === 0,\n                durationMs: result.durationMs,\n              };\n            } catch (error) {\n              throw normalizeError(\"vercel\", \"process.run\", error);\n            }\n          },\n          async start(command, runOptions) {\n            const handle = await runCommand(raw, command, runOptions, true);\n            const events: ProcessOutputEvent[] = [];\n            let running = true;\n            const stream = handle.logs({ signal: runOptions.signal });\n            const completed = handle.wait().then((result) => ({ exitCode: result.exitCode }));\n            const process: SandboxProcess = {\n              id: handle.cmdId,\n              async status() {\n                return running ? \"running\" : \"exited\";\n              },\n              async *output() {\n                try {\n                  for await (const event of stream) {\n                    const normalized = {\n                      stream: event.stream,\n                      data: event.data,\n                      timestamp: new Date(),\n                    } satisfies ProcessOutputEvent;\n                    events.push(normalized);\n                    yield normalized;\n                  }\n                } finally {\n                  running = false;\n                }\n              },\n              async write() {\n                unsupported(\"vercel\", \"process.stdin\");\n              },\n              wait: () => completed,\n              async kill(signal = \"SIGTERM\") {\n                await handle.kill(signal as Parameters<typeof handle.kill>[0]);\n                running = false;\n              },\n            };\n            return process;\n          },\n          async expose(port) {\n            if (!exposed.has(port)) {\n              exposed.add(port);\n              await raw.update({ ports: [...exposed] });\n            }\n            const url = raw.domain(port);\n            return portResult(port, url, true, false);\n          },\n          snapshots: {\n            async create() {\n              const snapshot = await raw.snapshot();\n              snapshots.set(snapshot.snapshotId, snapshot);\n              return {\n                id: snapshot.snapshotId,\n                mode: \"filesystem\",\n                createdAt: snapshot.createdAt,\n              } satisfies SandboxSnapshot;\n            },\n            async delete(snapshot) {\n              const id = typeof snapshot === \"string\" ? snapshot : snapshot.id;\n              const native =\n                snapshots.get(id) ?? (await VercelSnapshot.get({ snapshotId: id, ...credentials }));\n              await native.delete();\n              snapshots.delete(id);\n            },\n            async restore() {\n              unsupported(\"vercel\", \"snapshot.restore\");\n            },\n          },\n          async stop() {\n            if (raw.status !== \"stopped\") await raw.stop();\n          },\n        };\n      },\n    },\n    options.ports,\n    {\n      stop: async (sandbox) => {\n        await sandbox.raw.stop();\n      },\n      destroy: (sandbox) => sandbox.raw.delete(),\n      setPorts: (sandbox, ports, signal) => sandbox.raw.update({ ports: [...ports] }, { signal }),\n      setNetworkPolicy: (sandbox, policy) =>\n        sandbox.raw.update({\n          networkPolicy:\n            policy.mode === \"allow-all\" || policy.mode === \"deny-all\"\n              ? policy.mode\n              : policy.mode === \"native\"\n                ? (policy.value as import(\"@vercel/sandbox\").NetworkPolicy)\n                : { allow: [...(policy.allowedHosts ?? [])] },\n        }),\n    },\n  );\n}\n\nasync function runCommand(\n  raw: VercelSandbox,\n  input: CommandInput,\n  options: import(\"../../core/types\").RunOptions,\n  detached: false,\n): Promise<import(\"@vercel/sandbox\").CommandFinished>;\nasync function runCommand(\n  raw: VercelSandbox,\n  input: CommandInput,\n  options: import(\"../../core/types\").RunOptions,\n  detached: true,\n): Promise<import(\"@vercel/sandbox\").Command>;\nasync function runCommand(\n  raw: VercelSandbox,\n  input: CommandInput,\n  options: import(\"../../core/types\").RunOptions,\n  detached: boolean,\n) {\n  const command = typeof input === \"string\" ? { command: \"/bin/sh\", args: [\"-lc\", input] } : input;\n  return raw.runCommand({\n    cmd: command.command,\n    args: [...(command.args ?? [])],\n    cwd: options.cwd,\n    env: { ...options.env },\n    signal: options.signal,\n    timeoutMs: options.timeout,\n    detached,\n  });\n}\n\nexport type { VercelSandbox };\n"],"mappings":"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"}