inngest 4.19.0 → 4.20.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 (48) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/components/realtime/types.d.cts +3 -3
  3. package/components/realtime/types.d.cts.map +1 -1
  4. package/components/realtime/types.d.ts +3 -3
  5. package/components/realtime/types.d.ts.map +1 -1
  6. package/components/sandbox/client.cjs +243 -29
  7. package/components/sandbox/client.cjs.map +1 -1
  8. package/components/sandbox/client.js +239 -31
  9. package/components/sandbox/client.js.map +1 -1
  10. package/components/sandbox/durable.cjs +158 -1
  11. package/components/sandbox/durable.cjs.map +1 -1
  12. package/components/sandbox/durable.js +160 -3
  13. package/components/sandbox/durable.js.map +1 -1
  14. package/components/sandbox/middleware.cjs +1 -0
  15. package/components/sandbox/middleware.cjs.map +1 -1
  16. package/components/sandbox/middleware.d.cts.map +1 -1
  17. package/components/sandbox/middleware.d.ts.map +1 -1
  18. package/components/sandbox/middleware.js +1 -0
  19. package/components/sandbox/middleware.js.map +1 -1
  20. package/components/sandbox/protocol.cjs +100 -4
  21. package/components/sandbox/protocol.cjs.map +1 -1
  22. package/components/sandbox/protocol.js +101 -5
  23. package/components/sandbox/protocol.js.map +1 -1
  24. package/components/sandbox/types.cjs +2 -0
  25. package/components/sandbox/types.cjs.map +1 -1
  26. package/components/sandbox/types.d.cts +100 -15
  27. package/components/sandbox/types.d.cts.map +1 -1
  28. package/components/sandbox/types.d.ts +100 -15
  29. package/components/sandbox/types.d.ts.map +1 -1
  30. package/components/sandbox/types.js +2 -0
  31. package/components/sandbox/types.js.map +1 -1
  32. package/components/sandbox/validation.cjs +75 -3
  33. package/components/sandbox/validation.cjs.map +1 -1
  34. package/components/sandbox/validation.js +71 -4
  35. package/components/sandbox/validation.js.map +1 -1
  36. package/experimental.d.cts +2 -2
  37. package/experimental.d.ts +2 -2
  38. package/package.json +1 -1
  39. package/react.d.cts +1 -1
  40. package/react.d.ts +1 -1
  41. package/types.d.cts +8 -8
  42. package/types.d.ts +8 -8
  43. package/version.cjs +1 -1
  44. package/version.cjs.map +1 -1
  45. package/version.d.cts +1 -1
  46. package/version.d.ts +1 -1
  47. package/version.js +1 -1
  48. package/version.js.map +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","names":["config: SandboxClientConfig","requestInit: RequestInit & { duplex?: \"half\" }","facade: SandboxProcess","facade: Sandbox","client: SandboxClient"],"sources":["../../../src/components/sandbox/client.ts"],"sourcesContent":["import { z } from \"zod/v3\";\n\nimport {\n type Sandbox,\n type SandboxAction,\n type SandboxClient,\n type SandboxCommand,\n type SandboxCommandOptions,\n type SandboxCommandOutputMetadata,\n type SandboxDestroyResult,\n SandboxError,\n type SandboxErrorCode,\n type SandboxErrorDetail,\n type SandboxFileUploadResult,\n type SandboxOutputChunk,\n type SandboxProcess,\n type SandboxRef,\n type SandboxStatus,\n SandboxValidationError,\n} from \"./types.ts\";\nimport {\n canonicalUuidSchema,\n decodeBase64,\n decodeOutputChunk,\n decodeUtf8,\n normalizeFileDownloadOptions,\n normalizeFileUploadOptions,\n normalizeSandboxCommandOptions,\n normalizeSandboxCreateOptions,\n normalizeSandboxListOptions,\n normalizeSandboxProcessListOptions,\n normalizeSandboxProcessOutputOptions,\n normalizeSandboxProcessSignalOptions,\n normalizeSandboxProcessStartOptions,\n normalizeSandboxProcessWaitOptions,\n normalizeSandboxWaitUntilRunningOptions,\n parseWithSchema,\n restOutputChunkSchema,\n sandboxProcessRefFromResource,\n sandboxProcessRefSchema,\n sandboxRefFromResource,\n sandboxRefSchema,\n} from \"./validation.ts\";\n\ntype FetchT = typeof fetch;\n\nexport interface SandboxClientConfig {\n baseUrl: () => string;\n apiKey: () => string | undefined;\n headers: () => Record<string, string>;\n fetch: () => FetchT;\n}\n\nconst metadataSchema = z.object({ fetchedAt: z.string().min(1) }).passthrough();\nconst errorItemSchema = z\n .object({\n code: z.string().min(1),\n message: z.string().min(1),\n })\n .passthrough();\nconst errorEnvelopeSchema = z\n .object({ errors: z.array(errorItemSchema).min(1) })\n .passthrough();\nconst streamErrorFrameSchema = z\n .object({\n type: z.literal(\"error\"),\n error: errorItemSchema,\n })\n .passthrough();\nconst responseEnvelopeSchema = z\n .object({\n data: z.unknown(),\n metadata: metadataSchema.optional(),\n page: z.unknown().optional(),\n })\n .passthrough();\n\nconst sandboxPageSchema = z\n .object({\n cursor: z.string().min(1).nullish(),\n hasMore: z.boolean(),\n limit: z.number().int().min(1).max(250),\n })\n .strip();\n\nconst wireCommandResultSchema = z\n .object({\n stdout: z.string().optional(),\n stderr: z.string().optional(),\n encoding: z.literal(\"base64\"),\n exitCode: z.number().int().min(-0x80000000).max(0x7fffffff),\n })\n .strip();\n\nconst outputResponseSchema = z\n .object({ chunks: z.array(restOutputChunkSchema) })\n .passthrough();\n\nconst fileUploadResultSchema = z\n .object({\n path: z.string(),\n bytesWritten: z.number().int().nonnegative().safe(),\n })\n .strip();\n\nconst waitProcessSchema = z\n .object({\n id: canonicalUuidSchema,\n state: z.enum([\"EXITED\", \"KILLED\", \"FAILED\", \"LOST\"]),\n exitCode: z.number().int().optional(),\n terminationSignal: z.number().int().min(1).max(64).optional(),\n })\n .strip()\n .superRefine((process, ctx) => {\n if ((process.state === \"EXITED\") !== (process.exitCode !== undefined)) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"exitCode must be present only for EXITED processes\",\n });\n }\n if (\n (process.state === \"KILLED\") !==\n (process.terminationSignal !== undefined)\n ) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"terminationSignal must be present only for KILLED processes\",\n });\n }\n });\n\nconst safeRepeatActions = new Set<SandboxAction>([\n \"create\",\n \"destroy\",\n \"file.upload\",\n \"list\",\n \"get\",\n \"waitUntilRunning\",\n \"process.list\",\n \"process.get\",\n \"process.wait\",\n \"process.output\",\n \"process.stream\",\n \"logs.stream\",\n \"file.download\",\n]);\n\nconst sandboxTransportFailureMessage = (action: SandboxAction): string => {\n switch (action) {\n case \"create\":\n return \"The Sandbox Create response was not confirmed. Repeating the same Create request is safe\";\n case \"destroy\":\n return \"Sandbox teardown may have been accepted. Get the sandbox; repeating Destroy is safe\";\n case \"file.upload\":\n return \"The sandbox file may have been replaced. Repeating the same upload is safe\";\n case \"exec\":\n return \"The sandbox command may have run. Inspect its external effects before running it again\";\n case \"process.start\":\n return \"A sandbox process may be running. List processes and reconcile before starting another\";\n case \"process.signal\":\n return \"The sandbox process signal may have been delivered. Get or wait for the process before sending another\";\n default:\n return \"Compute is temporarily unavailable. Retry this operation\";\n }\n};\n\nconst sandboxAmbiguousResponseMessage = (action: SandboxAction): string => {\n if (action === \"create\") {\n return \"A sandbox was created, but its current resource could not be loaded. List sandboxes and reconcile by name before creating another\";\n }\n return sandboxTransportFailureMessage(action);\n};\n\nclass SandboxRestTransport {\n constructor(private readonly config: SandboxClientConfig) {}\n\n async json(\n action: SandboxAction,\n method: string,\n path: string,\n options: {\n body?: unknown;\n statuses: readonly number[];\n sandboxId?: string;\n processId?: string;\n },\n ): Promise<{\n status: number;\n envelope?: z.infer<typeof responseEnvelopeSchema>;\n }> {\n const response = await this.send(action, method, path, {\n body:\n options.body === undefined ? undefined : JSON.stringify(options.body),\n headers:\n options.body === undefined\n ? undefined\n : { \"Content-Type\": \"application/json\" },\n sandboxId: options.sandboxId,\n processId: options.processId,\n });\n if (!options.statuses.includes(response.status)) {\n await this.throwResponseError(\n action,\n response,\n options.sandboxId,\n options.processId,\n );\n }\n if (response.status === 204) {\n return { status: response.status };\n }\n const raw = await this.readResponseJSON(\n action,\n response,\n options.sandboxId,\n options.processId,\n );\n return {\n status: response.status,\n envelope: parseWithSchema(\n responseEnvelopeSchema,\n raw,\n \"sandbox API response\",\n ),\n };\n }\n\n async raw(\n action: SandboxAction,\n method: string,\n path: string,\n options: {\n body?: BodyInit;\n headers?: Record<string, string>;\n sandboxId?: string;\n processId?: string;\n },\n ): Promise<Response> {\n const response = await this.send(action, method, path, options);\n if (!response.ok) {\n await this.throwResponseError(\n action,\n response,\n options.sandboxId,\n options.processId,\n );\n }\n return response;\n }\n\n async readResponseEnvelope(\n action: SandboxAction,\n response: Response,\n sandboxId?: string,\n processId?: string,\n ): Promise<z.infer<typeof responseEnvelopeSchema>> {\n return parseWithSchema(\n responseEnvelopeSchema,\n await this.readResponseJSON(action, response, sandboxId, processId),\n \"sandbox API response\",\n );\n }\n\n async stream(\n action: SandboxAction,\n path: string,\n sandboxId: string,\n processId?: string,\n ): Promise<ReadableStream<SandboxOutputChunk>> {\n const abortController = new AbortController();\n const response = await this.send(action, \"GET\", path, {\n sandboxId,\n processId,\n signal: abortController.signal,\n });\n if (!response.ok) {\n await this.throwResponseError(action, response, sandboxId, processId);\n }\n if (!response.body) {\n throw new SandboxValidationError(\n \"Sandbox API returned a stream without a body\",\n );\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n let ended = false;\n\n const nextLine = async (): Promise<string | undefined> => {\n for (;;) {\n const newline = buffer.indexOf(\"\\n\");\n if (newline >= 0) {\n const line = buffer.slice(0, newline).trim();\n buffer = buffer.slice(newline + 1);\n if (line) {\n return line;\n }\n continue;\n }\n if (ended) {\n const line = buffer.trim();\n buffer = \"\";\n return line || undefined;\n }\n const result = await reader.read();\n ended = result.done;\n buffer += decoder.decode(result.value, { stream: !result.done });\n }\n };\n\n return new ReadableStream<SandboxOutputChunk>({\n pull: async (controller) => {\n try {\n const line = await nextLine();\n if (line === undefined) {\n controller.close();\n return;\n }\n const frame = JSON.parse(line) as unknown;\n if (\n typeof frame === \"object\" &&\n frame !== null &&\n \"type\" in frame &&\n frame.type === \"error\"\n ) {\n const errorFrame = parseWithSchema(\n streamErrorFrameSchema,\n frame,\n \"sandbox stream error\",\n );\n throw this.errorFromItem(\n action,\n response.status,\n errorFrame.error,\n sandboxId,\n processId,\n response.headers.get(\"x-request-id\") ?? undefined,\n );\n }\n if (\n typeof frame !== \"object\" ||\n frame === null ||\n !(\"type\" in frame) ||\n frame.type !== \"log\"\n ) {\n throw new SandboxValidationError(\n \"Sandbox API returned an invalid stream frame\",\n );\n }\n const { type: _type, ...chunk } = frame as Record<string, unknown>;\n controller.enqueue(decodeOutputChunk(chunk));\n } catch (error) {\n abortController.abort();\n controller.error(error);\n }\n },\n cancel: async () => {\n abortController.abort();\n await reader.cancel().catch(() => undefined);\n },\n });\n }\n\n private async send(\n action: SandboxAction,\n method: string,\n path: string,\n options: {\n body?: BodyInit;\n headers?: Record<string, string>;\n sandboxId?: string;\n processId?: string;\n signal?: AbortSignal;\n },\n ): Promise<Response> {\n const apiKey = this.config.apiKey()?.trim();\n if (!apiKey) {\n throw new SandboxValidationError(\n \"A signing or API key is required to use inngest.sandboxes\",\n );\n }\n const requestInit: RequestInit & { duplex?: \"half\" } = {\n method,\n headers: {\n ...this.config.headers(),\n Authorization: `Bearer ${apiKey}`,\n ...options.headers,\n },\n body: options.body,\n signal: options.signal,\n };\n if (options.body instanceof ReadableStream) {\n requestInit.duplex = \"half\";\n }\n try {\n return await this.config.fetch()(\n new URL(path, this.config.baseUrl()),\n requestInit,\n );\n } catch (error) {\n throw this.transportFailure(\n action,\n error,\n options.sandboxId,\n options.processId,\n );\n }\n }\n\n private async readResponseJSON(\n action: SandboxAction,\n response: Response,\n sandboxId?: string,\n processId?: string,\n ): Promise<unknown> {\n try {\n return await response.json();\n } catch (error) {\n throw this.transportFailure(action, error, sandboxId, processId);\n }\n }\n\n private transportFailure(\n action: SandboxAction,\n cause: unknown,\n sandboxId?: string,\n processId?: string,\n ): SandboxError {\n const safeToRepeat = safeRepeatActions.has(action);\n return new SandboxError({\n action,\n code: safeToRepeat ? \"compute_unavailable\" : \"operation_ambiguous\",\n message: sandboxTransportFailureMessage(action),\n sandboxId,\n processId,\n ambiguous: !safeToRepeat,\n retryable: safeToRepeat,\n details: [],\n cause,\n });\n }\n\n private async throwResponseError(\n action: SandboxAction,\n response: Response,\n sandboxId?: string,\n processId?: string,\n ): Promise<never> {\n const raw = await response.json().catch(() => undefined);\n const parsed = errorEnvelopeSchema.safeParse(raw);\n const item = parsed.success\n ? parsed.data.errors[0]!\n : {\n code: \"internal_error\",\n message: `Sandbox API returned HTTP ${response.status}`,\n };\n throw this.errorFromItem(\n action,\n response.status,\n item,\n sandboxId,\n processId,\n response.headers.get(\"x-request-id\") ?? undefined,\n parsed.success ? (parsed.data.errors as SandboxErrorDetail[]) : [],\n );\n }\n\n private errorFromItem(\n action: SandboxAction,\n status: number,\n item: { code: string; message: string },\n sandboxId?: string,\n processId?: string,\n requestId?: string,\n details: readonly SandboxErrorDetail[] = [],\n ): SandboxError {\n const ambiguous =\n item.code === \"operation_ambiguous\" ||\n item.code === \"sandbox_exec_output_too_large\" ||\n item.code === \"sandbox_exec_timed_out\";\n const availability =\n item.code === \"compute_unavailable\" ||\n item.code === \"rate_limited\" ||\n status === 429 ||\n status === 503;\n return new SandboxError({\n action,\n code: item.code as SandboxErrorCode,\n message:\n item.code === \"operation_ambiguous\"\n ? sandboxAmbiguousResponseMessage(action)\n : item.message,\n status,\n sandboxId,\n processId,\n ambiguous,\n retryable: !ambiguous && availability,\n requestId,\n details,\n });\n }\n}\n\nconst processPath = (sandboxId: string, processId: string): string =>\n `/v2/sandboxes/${encodeURIComponent(sandboxId)}/processes/${encodeURIComponent(processId)}`;\n\nconst sandboxStartingStatuses = new Set<SandboxStatus>([\"PENDING\", \"STARTING\"]);\nconst sandboxRunningPollIntervalMs = 1_000;\n\nconst delay = async (milliseconds: number): Promise<void> =>\n new Promise((resolve) => setTimeout(resolve, milliseconds));\n\nconst sandboxStartFailedError = (\n action: \"create\" | \"waitUntilRunning\",\n sandbox: SandboxRef,\n): SandboxError =>\n new SandboxError({\n action,\n code: \"sandbox_start_failed\",\n message: `Sandbox entered ${sandbox.status} before reaching RUNNING`,\n sandboxId: sandbox.id,\n retryable: false,\n details: [\n {\n status: sandbox.status,\n ...(sandbox.error !== undefined && { error: sandbox.error }),\n },\n ],\n });\n\nconst sandboxStartTimedOutError = (\n action: \"create\" | \"waitUntilRunning\",\n sandbox: SandboxRef,\n timeoutMs: number,\n): SandboxError =>\n new SandboxError({\n action,\n code: \"sandbox_start_timed_out\",\n message: `Sandbox did not reach RUNNING within ${timeoutMs} milliseconds`,\n sandboxId: sandbox.id,\n retryable: false,\n details: [{ status: sandbox.status, timeoutMs }],\n });\n\nconst createDirectProcessFacade = (\n rawRef: unknown,\n transport: SandboxRestTransport,\n): SandboxProcess => {\n const ref = parseWithSchema(\n sandboxProcessRefSchema,\n rawRef,\n \"sandbox process reference\",\n );\n const basePath = processPath(ref.sandboxId, ref.id);\n const facade: SandboxProcess = {\n ...ref,\n command: Object.freeze([...ref.command]),\n signal: async (options) => {\n await transport.json(\"process.signal\", \"POST\", `${basePath}/signals`, {\n body: normalizeSandboxProcessSignalOptions(options),\n statuses: [204],\n sandboxId: ref.sandboxId,\n processId: ref.id,\n });\n },\n wait: async (options) => {\n const normalized = normalizeSandboxProcessWaitOptions(options);\n const query = new URLSearchParams({\n timeout: `${normalized.timeoutMs}ms`,\n });\n const { envelope } = await transport.json(\n \"process.wait\",\n \"POST\",\n `${basePath}/wait?${query}`,\n {\n statuses: [200],\n sandboxId: ref.sandboxId,\n processId: ref.id,\n },\n );\n const terminal = parseWithSchema(\n waitProcessSchema,\n envelope?.data,\n \"sandbox process wait result\",\n );\n const {\n exitCode: _previousExitCode,\n terminationSignal: _previousTerminationSignal,\n ...baseRef\n } = ref;\n return createDirectProcessFacade(\n parseWithSchema(\n sandboxProcessRefSchema,\n {\n ...baseRef,\n state: terminal.state,\n ...(terminal.exitCode !== undefined && {\n exitCode: terminal.exitCode,\n }),\n ...(terminal.terminationSignal !== undefined && {\n terminationSignal: terminal.terminationSignal,\n }),\n },\n \"sandbox process reference\",\n ),\n transport,\n );\n },\n getOutput: async (options) => {\n const { tailBytes } = normalizeSandboxProcessOutputOptions(options);\n const query = new URLSearchParams({ tailBytes: `${tailBytes}` });\n const { envelope } = await transport.json(\n \"process.output\",\n \"GET\",\n `${basePath}/output?${query}`,\n {\n statuses: [200],\n sandboxId: ref.sandboxId,\n processId: ref.id,\n },\n );\n const output = parseWithSchema(\n outputResponseSchema,\n envelope?.data,\n \"sandbox process output\",\n );\n return { chunks: output.chunks.map(decodeOutputChunk) };\n },\n streamOutput: async (options) => {\n const { tailBytes } = normalizeSandboxProcessOutputOptions(options);\n const query = new URLSearchParams({ tailBytes: `${tailBytes}` });\n return transport.stream(\n \"process.stream\",\n `${basePath}/output/stream?${query}`,\n ref.sandboxId,\n ref.id,\n );\n },\n };\n return Object.freeze(facade);\n};\n\ninterface SandboxCommandByteResult {\n stdout: Uint8Array;\n stderr: Uint8Array;\n exitCode: number;\n output: SandboxCommandOutputMetadata;\n}\n\ntype DirectSandboxCommandRunner = (\n command: SandboxCommand,\n options?: SandboxCommandOptions,\n) => Promise<SandboxCommandByteResult>;\n\nconst directSandboxCommandRunners = new WeakMap<\n Sandbox,\n DirectSandboxCommandRunner\n>();\n\n/** Internal byte-preserving command execution used by the durable adapter. */\nexport const runSandboxCommandForOperation = (\n sandbox: Sandbox,\n command: SandboxCommand,\n options?: SandboxCommandOptions,\n): Promise<SandboxCommandByteResult> => {\n const run = directSandboxCommandRunners.get(sandbox);\n if (!run) {\n throw new SandboxValidationError(\n \"Sandbox commands can only run on an SDK sandbox resource\",\n );\n }\n return run(command, options);\n};\n\nconst createDirectSandboxFacade = (\n rawRef: unknown,\n transport: SandboxRestTransport,\n): Sandbox => {\n const ref = parseWithSchema(sandboxRefSchema, rawRef, \"sandbox reference\");\n const basePath = `/v2/sandboxes/${encodeURIComponent(ref.id)}`;\n const runCommand = async (\n command: SandboxCommand,\n options: SandboxCommandOptions = {},\n ): Promise<SandboxCommandByteResult> => {\n const normalized = normalizeSandboxCommandOptions(command, options);\n const { timeout: _timeout, timeoutMs, ...spec } = normalized;\n const { envelope } = await transport.json(\n \"exec\",\n \"POST\",\n `${basePath}/exec`,\n {\n body: {\n ...spec,\n timeout: `${timeoutMs}ms`,\n },\n statuses: [200],\n sandboxId: ref.id,\n },\n );\n const result = parseWithSchema(\n wireCommandResultSchema,\n envelope?.data,\n \"sandbox exec result\",\n );\n return {\n stdout: decodeBase64(result.stdout ?? \"\", \"sandbox exec stdout\"),\n stderr: decodeBase64(result.stderr ?? \"\", \"sandbox exec stderr\"),\n exitCode: result.exitCode,\n output: { truncated: false },\n };\n };\n const facade: Sandbox = {\n ...ref,\n resources: Object.freeze({ ...ref.resources }),\n commands: Object.freeze({\n run: async (command, options) => {\n const result = await runCommand(command, options);\n return {\n stdout: decodeUtf8(result.stdout),\n stderr: decodeUtf8(result.stderr),\n exitCode: result.exitCode,\n output: result.output,\n };\n },\n }),\n logs: Object.freeze({\n stream: async (options = {}) => {\n const parsed = parseWithSchema(\n z.object({ follow: z.boolean().optional() }).strict(),\n options,\n \"sandbox log stream options\",\n );\n const query = new URLSearchParams({\n follow: `${parsed.follow ?? false}`,\n });\n return transport.stream(\n \"logs.stream\",\n `${basePath}/logs?${query}`,\n ref.id,\n );\n },\n }),\n files: Object.freeze({\n upload: async (options): Promise<SandboxFileUploadResult> => {\n const normalized = normalizeFileUploadOptions(options);\n const query = new URLSearchParams({ path: normalized.path });\n if (normalized.mode !== undefined) {\n query.set(\"mode\", normalized.mode.toString(8).padStart(4, \"0\"));\n }\n const response = await transport.raw(\n \"file.upload\",\n \"PUT\",\n `${basePath}/files?${query}`,\n {\n body: normalized.data,\n headers: {\n \"Content-Type\": \"application/octet-stream\",\n },\n sandboxId: ref.id,\n },\n );\n const envelope = await transport.readResponseEnvelope(\n \"file.upload\",\n response,\n ref.id,\n );\n return parseWithSchema(\n fileUploadResultSchema,\n envelope.data,\n \"sandbox file upload result\",\n );\n },\n download: async (options) => {\n const normalized = normalizeFileDownloadOptions(options);\n const query = new URLSearchParams({ path: normalized.path });\n return transport.raw(\n \"file.download\",\n \"GET\",\n `${basePath}/files?${query}`,\n { sandboxId: ref.id },\n );\n },\n }),\n processes: Object.freeze({\n start: async (options) => {\n const body = normalizeSandboxProcessStartOptions(options);\n const { envelope } = await transport.json(\n \"process.start\",\n \"POST\",\n `${basePath}/processes`,\n {\n body,\n statuses: [201],\n sandboxId: ref.id,\n },\n );\n const process = sandboxProcessRefFromResource(ref.id, envelope?.data);\n if (process.state !== \"RUNNING\" || process.pid === undefined) {\n throw new SandboxValidationError(\n \"Sandbox process Start returned a process that is not RUNNING\",\n );\n }\n return createDirectProcessFacade(process, transport);\n },\n list: async (options) => {\n const normalized = normalizeSandboxProcessListOptions(options);\n const query = new URLSearchParams({ limit: `${normalized.limit}` });\n if (normalized.cursor !== undefined) {\n query.set(\"cursor\", normalized.cursor);\n }\n const { envelope } = await transport.json(\n \"process.list\",\n \"GET\",\n `${basePath}/processes?${query}`,\n { statuses: [200], sandboxId: ref.id },\n );\n const processes = parseWithSchema(\n z.array(z.unknown()),\n envelope?.data,\n \"sandbox process list\",\n );\n const metadata = parseWithSchema(\n metadataSchema,\n envelope?.metadata,\n \"sandbox process list metadata\",\n );\n const page = parseWithSchema(\n sandboxPageSchema,\n envelope?.page,\n \"sandbox process list page\",\n );\n const items = processes\n .map((process) =>\n createDirectProcessFacade(\n sandboxProcessRefFromResource(ref.id, process),\n transport,\n ),\n )\n .sort((left, right) => left.id.localeCompare(right.id));\n return {\n items,\n page: {\n hasMore: page.hasMore,\n limit: page.limit,\n ...(page.cursor != null && { cursor: page.cursor }),\n },\n fetchedAt: metadata.fetchedAt,\n };\n },\n get: async (processId) => {\n const parsedProcessId = parseWithSchema(\n canonicalUuidSchema,\n processId,\n \"sandbox process ID\",\n );\n try {\n const { envelope } = await transport.json(\n \"process.get\",\n \"GET\",\n processPath(ref.id, parsedProcessId),\n {\n statuses: [200],\n sandboxId: ref.id,\n processId: parsedProcessId,\n },\n );\n return createDirectProcessFacade(\n sandboxProcessRefFromResource(ref.id, envelope?.data),\n transport,\n );\n } catch (error) {\n if (\n error instanceof SandboxError &&\n error.code === \"sandbox_process_not_found\"\n ) {\n return null;\n }\n throw error;\n }\n },\n }),\n waitUntilRunning: async (options) =>\n waitUntilSandboxRunning(\n ref,\n normalizeSandboxWaitUntilRunningOptions(options).timeoutMs,\n transport,\n \"waitUntilRunning\",\n ),\n destroy: async (): Promise<SandboxDestroyResult> => {\n const { status, envelope } = await transport.json(\n \"destroy\",\n \"DELETE\",\n basePath,\n { statuses: [202, 204], sandboxId: ref.id },\n );\n if (status === 204) {\n return { status: \"TERMINATED\", sandbox: null };\n }\n const sandbox = sandboxRefFromResource(envelope?.data);\n if (sandbox.status !== \"TERMINATING\") {\n throw new SandboxValidationError(\n \"Sandbox Destroy returned a resource that is not TERMINATING\",\n );\n }\n return {\n status: \"TERMINATING\",\n sandbox,\n };\n },\n };\n directSandboxCommandRunners.set(facade, runCommand);\n return Object.freeze(facade);\n};\n\nconst waitUntilSandboxRunning = async (\n initialSandbox: SandboxRef,\n timeoutMs: number,\n transport: SandboxRestTransport,\n action: \"create\" | \"waitUntilRunning\",\n): Promise<Sandbox> => {\n let sandbox = initialSandbox;\n if (sandbox.status === \"RUNNING\") {\n return createDirectSandboxFacade(sandbox, transport);\n }\n if (!sandboxStartingStatuses.has(sandbox.status)) {\n throw sandboxStartFailedError(action, sandbox);\n }\n\n const deadline = Date.now() + timeoutMs;\n const path = `/v2/sandboxes/${encodeURIComponent(sandbox.id)}`;\n for (;;) {\n if (deadline - Date.now() <= 0) {\n throw sandboxStartTimedOutError(action, sandbox, timeoutMs);\n }\n\n try {\n const { envelope } = await transport.json(action, \"GET\", path, {\n statuses: [200],\n sandboxId: sandbox.id,\n });\n sandbox = sandboxRefFromResource(envelope?.data);\n } catch (error) {\n if (!(error instanceof SandboxError && error.retryable)) {\n throw error;\n }\n }\n\n if (sandbox.status === \"RUNNING\") {\n return createDirectSandboxFacade(sandbox, transport);\n }\n if (!sandboxStartingStatuses.has(sandbox.status)) {\n throw sandboxStartFailedError(action, sandbox);\n }\n\n const remainingMs = deadline - Date.now();\n if (remainingMs <= 0) {\n throw sandboxStartTimedOutError(action, sandbox, timeoutMs);\n }\n await delay(Math.min(sandboxRunningPollIntervalMs, remainingMs));\n }\n};\n\nconst sandboxClientTransports = new WeakMap<\n SandboxClient,\n SandboxRestTransport\n>();\n\nconst transportForClient = (client: SandboxClient): SandboxRestTransport => {\n const transport = sandboxClientTransports.get(client);\n if (!transport) {\n throw new SandboxValidationError(\n \"Sandbox resources can only be reconstructed for an SDK sandbox client\",\n );\n }\n return transport;\n};\n\n/**\n * Internal reconstruction used by the durable adapter. Public callers reload\n * resources with Get so they receive current state.\n */\nexport const sandboxForOperation = (\n client: SandboxClient,\n ref: unknown,\n): Sandbox => createDirectSandboxFacade(ref, transportForClient(client));\n\nexport const sandboxProcessForOperation = (\n client: SandboxClient,\n ref: unknown,\n): SandboxProcess => createDirectProcessFacade(ref, transportForClient(client));\n\nexport const createSandboxClient = (\n config: SandboxClientConfig,\n): SandboxClient => {\n const transport = new SandboxRestTransport(config);\n const client: SandboxClient = {\n create: async (options) => {\n const { runningTimeoutMs, ...body } =\n normalizeSandboxCreateOptions(options);\n const { status, envelope } = await transport.json(\n \"create\",\n \"POST\",\n \"/v2/sandboxes\",\n { body, statuses: [200, 201, 202] },\n );\n const sandbox = sandboxRefFromResource(envelope?.data);\n if (\n (status === 201 && sandbox.status !== \"RUNNING\") ||\n (status === 202 && sandbox.status !== \"STARTING\")\n ) {\n throw new SandboxValidationError(\n `Sandbox Create returned HTTP ${status} with status ${sandbox.status}`,\n );\n }\n return runningTimeoutMs === false\n ? createDirectSandboxFacade(sandbox, transport)\n : waitUntilSandboxRunning(\n sandbox,\n runningTimeoutMs,\n transport,\n \"create\",\n );\n },\n list: async (options) => {\n const normalized = normalizeSandboxListOptions(options);\n const query = new URLSearchParams({ limit: `${normalized.limit}` });\n if (normalized.cursor !== undefined) {\n query.set(\"cursor\", normalized.cursor);\n }\n const { envelope } = await transport.json(\n \"list\",\n \"GET\",\n `/v2/sandboxes?${query}`,\n { statuses: [200] },\n );\n const resources = parseWithSchema(\n z.array(z.unknown()),\n envelope?.data,\n \"sandbox list\",\n );\n const page = parseWithSchema(\n sandboxPageSchema,\n envelope?.page,\n \"sandbox list page\",\n );\n const metadata = parseWithSchema(\n metadataSchema,\n envelope?.metadata,\n \"sandbox list metadata\",\n );\n return {\n items: resources.map((resource) =>\n createDirectSandboxFacade(\n sandboxRefFromResource(resource),\n transport,\n ),\n ),\n page: {\n hasMore: page.hasMore,\n limit: page.limit,\n ...(page.cursor != null && { cursor: page.cursor }),\n },\n fetchedAt: metadata.fetchedAt,\n };\n },\n get: async (sandboxId) => {\n const parsedSandboxId = parseWithSchema(\n canonicalUuidSchema,\n sandboxId,\n \"sandbox ID\",\n );\n try {\n const { envelope } = await transport.json(\n \"get\",\n \"GET\",\n `/v2/sandboxes/${encodeURIComponent(parsedSandboxId)}`,\n { statuses: [200], sandboxId: parsedSandboxId },\n );\n return createDirectSandboxFacade(\n sandboxRefFromResource(envelope?.data),\n transport,\n );\n } catch (error) {\n if (\n error instanceof SandboxError &&\n error.code === \"sandbox_not_found\"\n ) {\n return null;\n }\n throw error;\n }\n },\n };\n sandboxClientTransports.set(client, transport);\n return client;\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"client.js","names":["config: SandboxClientConfig","requestInit: RequestInit & { duplex?: \"half\" }","facade: SandboxProcess","facade: Sandbox","client: SandboxClient"],"sources":["../../../src/components/sandbox/client.ts"],"sourcesContent":["import { z } from \"zod/v3\";\n\nimport {\n type Sandbox,\n type SandboxAction,\n type SandboxClient,\n type SandboxCommand,\n type SandboxCommandOptions,\n type SandboxCommandOutputMetadata,\n type SandboxCreateOptions,\n type SandboxDestroyResult,\n SandboxError,\n type SandboxErrorCode,\n type SandboxErrorDetail,\n type SandboxFileUploadResult,\n type SandboxLifecycleOptions,\n type SandboxOutputChunk,\n type SandboxProcess,\n type SandboxRef,\n type SandboxSnapshot,\n type SandboxSnapshotCloneOptions,\n type SandboxSnapshotListResult,\n type SandboxSnapshotRef,\n type SandboxStatus,\n SandboxValidationError,\n} from \"./types.ts\";\nimport {\n canonicalUuidSchema,\n decodeBase64,\n decodeOutputChunk,\n decodeUtf8,\n normalizeFileDownloadOptions,\n normalizeFileUploadOptions,\n normalizeSandboxCommandOptions,\n normalizeSandboxCreateOptions,\n normalizeSandboxListOptions,\n normalizeSandboxProcessListOptions,\n normalizeSandboxProcessOutputOptions,\n normalizeSandboxProcessSignalOptions,\n normalizeSandboxProcessStartOptions,\n normalizeSandboxProcessWaitOptions,\n normalizeSandboxSnapshotCreateOptions,\n normalizeSandboxSnapshotListOptions,\n normalizeSandboxWaitUntilRunningOptions,\n parseWithSchema,\n restOutputChunkSchema,\n sandboxProcessRefFromResource,\n sandboxProcessRefSchema,\n sandboxRefFromResource,\n sandboxRefSchema,\n sandboxSnapshotRefFromResource,\n sandboxSnapshotRefSchema,\n} from \"./validation.ts\";\n\ntype FetchT = typeof fetch;\n\nexport interface SandboxClientConfig {\n baseUrl: () => string;\n apiKey: () => string | undefined;\n headers: () => Record<string, string>;\n fetch: () => FetchT;\n}\n\nconst metadataSchema = z.object({ fetchedAt: z.string().min(1) }).passthrough();\nconst errorItemSchema = z\n .object({\n code: z.string().min(1),\n message: z.string().min(1),\n })\n .passthrough();\nconst errorEnvelopeSchema = z\n .object({ errors: z.array(errorItemSchema).min(1) })\n .passthrough();\nconst streamErrorFrameSchema = z\n .object({\n type: z.literal(\"error\"),\n error: errorItemSchema,\n })\n .passthrough();\nconst responseEnvelopeSchema = z\n .object({\n data: z.unknown(),\n metadata: metadataSchema.optional(),\n page: z.unknown().optional(),\n })\n .passthrough();\n\nconst sandboxPageSchema = z\n .object({\n cursor: z.string().min(1).nullish(),\n hasMore: z.boolean(),\n limit: z.number().int().min(1).max(250),\n })\n .strip();\n\nconst wireCommandResultSchema = z\n .object({\n stdout: z.string().optional(),\n stderr: z.string().optional(),\n encoding: z.literal(\"base64\"),\n exitCode: z.number().int().min(-0x80000000).max(0x7fffffff),\n })\n .strip();\n\nconst outputResponseSchema = z\n .object({ chunks: z.array(restOutputChunkSchema) })\n .passthrough();\n\nconst fileUploadResultSchema = z\n .object({\n path: z.string(),\n bytesWritten: z.number().int().nonnegative().safe(),\n })\n .strip();\n\nconst waitProcessSchema = z\n .object({\n id: canonicalUuidSchema,\n state: z.enum([\"EXITED\", \"KILLED\", \"FAILED\", \"LOST\"]),\n exitCode: z.number().int().optional(),\n terminationSignal: z.number().int().min(1).max(64).optional(),\n })\n .strip()\n .superRefine((process, ctx) => {\n if ((process.state === \"EXITED\") !== (process.exitCode !== undefined)) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"exitCode must be present only for EXITED processes\",\n });\n }\n if (\n (process.state === \"KILLED\") !==\n (process.terminationSignal !== undefined)\n ) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"terminationSignal must be present only for KILLED processes\",\n });\n }\n });\n\nconst safeRepeatActions = new Set<SandboxAction>([\n \"create\",\n \"destroy\",\n \"pause\",\n \"resume\",\n \"file.upload\",\n \"list\",\n \"get\",\n \"waitUntilRunning\",\n \"process.list\",\n \"process.get\",\n \"process.wait\",\n \"process.output\",\n \"process.stream\",\n \"logs.stream\",\n \"file.download\",\n \"snapshot.list\",\n \"snapshot.get\",\n \"snapshot.waitUntilReady\",\n \"snapshot.delete\",\n]);\n\nconst sandboxTransportFailureMessage = (action: SandboxAction): string => {\n switch (action) {\n case \"create\":\n return \"The Sandbox Create response was not confirmed. Repeating the same Create request is safe\";\n case \"destroy\":\n return \"Sandbox teardown may have been accepted. Get the sandbox; repeating Destroy is safe\";\n case \"file.upload\":\n return \"The sandbox file may have been replaced. Repeating the same upload is safe\";\n case \"exec\":\n return \"The sandbox command may have run. Inspect its external effects before running it again\";\n case \"process.start\":\n return \"A sandbox process may be running. List processes and reconcile before starting another\";\n case \"process.signal\":\n return \"The sandbox process signal may have been delivered. Get or wait for the process before sending another\";\n case \"snapshot.create\":\n return \"Snapshot creation may have started and a retry may create a second snapshot. Check snapshots.list() before creating another\";\n case \"snapshot.delete\":\n return \"Snapshot deletion may have started. Repeating Delete is safe\";\n default:\n return \"Compute is temporarily unavailable. Retry this operation\";\n }\n};\n\nconst sandboxAmbiguousResponseMessage = (action: SandboxAction): string => {\n if (action === \"create\") {\n return \"A sandbox was created, but its current resource could not be loaded. List sandboxes and reconcile by name before creating another\";\n }\n return sandboxTransportFailureMessage(action);\n};\n\nclass SandboxRestTransport {\n constructor(private readonly config: SandboxClientConfig) {}\n\n async json(\n action: SandboxAction,\n method: string,\n path: string,\n options: {\n body?: unknown;\n statuses: readonly number[];\n sandboxId?: string;\n processId?: string;\n snapshotId?: string;\n signal?: AbortSignal;\n },\n ): Promise<{\n status: number;\n envelope?: z.infer<typeof responseEnvelopeSchema>;\n }> {\n const response = await this.send(action, method, path, {\n body:\n options.body === undefined ? undefined : JSON.stringify(options.body),\n headers:\n options.body === undefined\n ? undefined\n : { \"Content-Type\": \"application/json\" },\n sandboxId: options.sandboxId,\n processId: options.processId,\n snapshotId: options.snapshotId,\n signal: options.signal,\n });\n if (!options.statuses.includes(response.status)) {\n await this.throwResponseError(\n action,\n response,\n options.sandboxId,\n options.processId,\n options.snapshotId,\n );\n }\n if (response.status === 204) {\n return { status: response.status };\n }\n const raw = await this.readResponseJSON(\n action,\n response,\n options.sandboxId,\n options.processId,\n options.snapshotId,\n );\n return {\n status: response.status,\n envelope: parseWithSchema(\n responseEnvelopeSchema,\n raw,\n \"sandbox API response\",\n ),\n };\n }\n\n async raw(\n action: SandboxAction,\n method: string,\n path: string,\n options: {\n body?: BodyInit;\n headers?: Record<string, string>;\n sandboxId?: string;\n processId?: string;\n snapshotId?: string;\n },\n ): Promise<Response> {\n const response = await this.send(action, method, path, options);\n if (!response.ok) {\n await this.throwResponseError(\n action,\n response,\n options.sandboxId,\n options.processId,\n options.snapshotId,\n );\n }\n return response;\n }\n\n async readResponseEnvelope(\n action: SandboxAction,\n response: Response,\n sandboxId?: string,\n processId?: string,\n snapshotId?: string,\n ): Promise<z.infer<typeof responseEnvelopeSchema>> {\n return parseWithSchema(\n responseEnvelopeSchema,\n await this.readResponseJSON(\n action,\n response,\n sandboxId,\n processId,\n snapshotId,\n ),\n \"sandbox API response\",\n );\n }\n\n async stream(\n action: SandboxAction,\n path: string,\n sandboxId: string,\n processId?: string,\n ): Promise<ReadableStream<SandboxOutputChunk>> {\n const abortController = new AbortController();\n const response = await this.send(action, \"GET\", path, {\n sandboxId,\n processId,\n signal: abortController.signal,\n });\n if (!response.ok) {\n await this.throwResponseError(action, response, sandboxId, processId);\n }\n if (!response.body) {\n throw new SandboxValidationError(\n \"Sandbox API returned a stream without a body\",\n );\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n let ended = false;\n\n const nextLine = async (): Promise<string | undefined> => {\n for (;;) {\n const newline = buffer.indexOf(\"\\n\");\n if (newline >= 0) {\n const line = buffer.slice(0, newline).trim();\n buffer = buffer.slice(newline + 1);\n if (line) {\n return line;\n }\n continue;\n }\n if (ended) {\n const line = buffer.trim();\n buffer = \"\";\n return line || undefined;\n }\n const result = await reader.read();\n ended = result.done;\n buffer += decoder.decode(result.value, { stream: !result.done });\n }\n };\n\n return new ReadableStream<SandboxOutputChunk>({\n pull: async (controller) => {\n try {\n const line = await nextLine();\n if (line === undefined) {\n controller.close();\n return;\n }\n const frame = JSON.parse(line) as unknown;\n if (\n typeof frame === \"object\" &&\n frame !== null &&\n \"type\" in frame &&\n frame.type === \"error\"\n ) {\n const errorFrame = parseWithSchema(\n streamErrorFrameSchema,\n frame,\n \"sandbox stream error\",\n );\n throw this.errorFromItem(\n action,\n response.status,\n errorFrame.error,\n sandboxId,\n processId,\n response.headers.get(\"x-request-id\") ?? undefined,\n );\n }\n if (\n typeof frame !== \"object\" ||\n frame === null ||\n !(\"type\" in frame) ||\n frame.type !== \"log\"\n ) {\n throw new SandboxValidationError(\n \"Sandbox API returned an invalid stream frame\",\n );\n }\n const { type: _type, ...chunk } = frame as Record<string, unknown>;\n controller.enqueue(decodeOutputChunk(chunk));\n } catch (error) {\n abortController.abort();\n controller.error(error);\n }\n },\n cancel: async () => {\n abortController.abort();\n await reader.cancel().catch(() => undefined);\n },\n });\n }\n\n private async send(\n action: SandboxAction,\n method: string,\n path: string,\n options: {\n body?: BodyInit;\n headers?: Record<string, string>;\n sandboxId?: string;\n processId?: string;\n snapshotId?: string;\n signal?: AbortSignal;\n },\n ): Promise<Response> {\n const apiKey = this.config.apiKey()?.trim();\n if (!apiKey) {\n throw new SandboxValidationError(\n \"A signing or API key is required to use inngest.sandboxes\",\n );\n }\n const requestInit: RequestInit & { duplex?: \"half\" } = {\n method,\n headers: {\n ...this.config.headers(),\n Authorization: `Bearer ${apiKey}`,\n ...options.headers,\n },\n body: options.body,\n signal: options.signal,\n };\n if (options.body instanceof ReadableStream) {\n requestInit.duplex = \"half\";\n }\n try {\n return await this.config.fetch()(\n new URL(path, this.config.baseUrl()),\n requestInit,\n );\n } catch (error) {\n throw this.transportFailure(\n action,\n error,\n options.sandboxId,\n options.processId,\n options.snapshotId,\n );\n }\n }\n\n private async readResponseJSON(\n action: SandboxAction,\n response: Response,\n sandboxId?: string,\n processId?: string,\n snapshotId?: string,\n ): Promise<unknown> {\n try {\n return await response.json();\n } catch (error) {\n throw this.transportFailure(\n action,\n error,\n sandboxId,\n processId,\n snapshotId,\n );\n }\n }\n\n private transportFailure(\n action: SandboxAction,\n cause: unknown,\n sandboxId?: string,\n processId?: string,\n snapshotId?: string,\n ): SandboxError {\n const safeToRepeat = safeRepeatActions.has(action);\n return new SandboxError({\n action,\n code: safeToRepeat ? \"compute_unavailable\" : \"operation_ambiguous\",\n message: sandboxTransportFailureMessage(action),\n sandboxId,\n processId,\n snapshotId,\n ambiguous: !safeToRepeat,\n retryable: safeToRepeat,\n details: [],\n cause,\n });\n }\n\n private async throwResponseError(\n action: SandboxAction,\n response: Response,\n sandboxId?: string,\n processId?: string,\n snapshotId?: string,\n ): Promise<never> {\n const raw = await response.json().catch(() => undefined);\n const parsed = errorEnvelopeSchema.safeParse(raw);\n const item = parsed.success\n ? parsed.data.errors[0]!\n : {\n code: \"internal_error\",\n message: `Sandbox API returned HTTP ${response.status}`,\n };\n throw this.errorFromItem(\n action,\n response.status,\n item,\n sandboxId,\n processId,\n snapshotId,\n response.headers.get(\"x-request-id\") ?? undefined,\n parsed.success ? (parsed.data.errors as SandboxErrorDetail[]) : [],\n );\n }\n\n private errorFromItem(\n action: SandboxAction,\n status: number,\n item: { code: string; message: string },\n sandboxId?: string,\n processId?: string,\n snapshotId?: string,\n requestId?: string,\n details: readonly SandboxErrorDetail[] = [],\n ): SandboxError {\n const ambiguous =\n item.code === \"operation_ambiguous\" ||\n item.code === \"sandbox_exec_output_too_large\" ||\n item.code === \"sandbox_exec_timed_out\";\n const availability =\n item.code === \"compute_unavailable\" ||\n item.code === \"rate_limited\" ||\n status === 429 ||\n status === 503;\n return new SandboxError({\n action,\n code: item.code as SandboxErrorCode,\n message:\n item.code === \"operation_ambiguous\"\n ? sandboxAmbiguousResponseMessage(action)\n : item.message,\n status,\n sandboxId,\n processId,\n snapshotId,\n ambiguous,\n retryable: !ambiguous && availability,\n requestId,\n details,\n });\n }\n}\n\nconst processPath = (sandboxId: string, processId: string): string =>\n `/v2/sandboxes/${encodeURIComponent(sandboxId)}/processes/${encodeURIComponent(processId)}`;\n\nconst sandboxStartingStatuses = new Set<SandboxStatus>([\"PENDING\", \"STARTING\"]);\nconst sandboxRunningPollIntervalMs = 1_000;\n\nconst delay = async (milliseconds: number): Promise<void> =>\n new Promise((resolve) => setTimeout(resolve, milliseconds));\n\nconst lifecycleTimeout = (options?: SandboxLifecycleOptions): number =>\n normalizeSandboxWaitUntilRunningOptions({\n timeout: options?.timeout ?? 5 * 60_000,\n }).timeoutMs;\n\nconst abortableDelay = (milliseconds: number, signal?: AbortSignal) =>\n new Promise<void>((resolve, reject) => {\n if (signal?.aborted) {\n reject(signal.reason ?? new DOMException(\"Aborted\", \"AbortError\"));\n return;\n }\n const timer = setTimeout(resolve, milliseconds);\n signal?.addEventListener(\n \"abort\",\n () => {\n clearTimeout(timer);\n reject(signal.reason ?? new DOMException(\"Aborted\", \"AbortError\"));\n },\n { once: true },\n );\n });\nconst sandboxStartFailedError = (\n action: \"create\" | \"waitUntilRunning\",\n sandbox: SandboxRef,\n): SandboxError =>\n new SandboxError({\n action,\n code: \"sandbox_start_failed\",\n message: `Sandbox entered ${sandbox.status} before reaching RUNNING`,\n sandboxId: sandbox.id,\n retryable: false,\n details: [\n {\n status: sandbox.status,\n ...(sandbox.error !== undefined && { error: sandbox.error }),\n },\n ],\n });\n\nconst sandboxStartTimedOutError = (\n action: \"create\" | \"waitUntilRunning\",\n sandbox: SandboxRef,\n timeoutMs: number,\n): SandboxError =>\n new SandboxError({\n action,\n code: \"sandbox_start_timed_out\",\n message: `Sandbox did not reach RUNNING within ${timeoutMs} milliseconds`,\n sandboxId: sandbox.id,\n retryable: false,\n details: [{ status: sandbox.status, timeoutMs }],\n });\n\nconst createDirectProcessFacade = (\n rawRef: unknown,\n transport: SandboxRestTransport,\n): SandboxProcess => {\n const ref = parseWithSchema(\n sandboxProcessRefSchema,\n rawRef,\n \"sandbox process reference\",\n );\n const basePath = processPath(ref.sandboxId, ref.id);\n const facade: SandboxProcess = {\n ...ref,\n command: Object.freeze([...ref.command]),\n signal: async (options) => {\n await transport.json(\"process.signal\", \"POST\", `${basePath}/signals`, {\n body: normalizeSandboxProcessSignalOptions(options),\n statuses: [204],\n sandboxId: ref.sandboxId,\n processId: ref.id,\n });\n },\n wait: async (options) => {\n const normalized = normalizeSandboxProcessWaitOptions(options);\n const query = new URLSearchParams({\n timeout: `${normalized.timeoutMs}ms`,\n });\n const { envelope } = await transport.json(\n \"process.wait\",\n \"POST\",\n `${basePath}/wait?${query}`,\n {\n statuses: [200],\n sandboxId: ref.sandboxId,\n processId: ref.id,\n },\n );\n const terminal = parseWithSchema(\n waitProcessSchema,\n envelope?.data,\n \"sandbox process wait result\",\n );\n const {\n exitCode: _previousExitCode,\n terminationSignal: _previousTerminationSignal,\n ...baseRef\n } = ref;\n return createDirectProcessFacade(\n parseWithSchema(\n sandboxProcessRefSchema,\n {\n ...baseRef,\n state: terminal.state,\n ...(terminal.exitCode !== undefined && {\n exitCode: terminal.exitCode,\n }),\n ...(terminal.terminationSignal !== undefined && {\n terminationSignal: terminal.terminationSignal,\n }),\n },\n \"sandbox process reference\",\n ),\n transport,\n );\n },\n getOutput: async (options) => {\n const { tailBytes } = normalizeSandboxProcessOutputOptions(options);\n const query = new URLSearchParams({ tailBytes: `${tailBytes}` });\n const { envelope } = await transport.json(\n \"process.output\",\n \"GET\",\n `${basePath}/output?${query}`,\n {\n statuses: [200],\n sandboxId: ref.sandboxId,\n processId: ref.id,\n },\n );\n const output = parseWithSchema(\n outputResponseSchema,\n envelope?.data,\n \"sandbox process output\",\n );\n return { chunks: output.chunks.map(decodeOutputChunk) };\n },\n streamOutput: async (options) => {\n const { tailBytes } = normalizeSandboxProcessOutputOptions(options);\n const query = new URLSearchParams({ tailBytes: `${tailBytes}` });\n return transport.stream(\n \"process.stream\",\n `${basePath}/output/stream?${query}`,\n ref.sandboxId,\n ref.id,\n );\n },\n };\n return Object.freeze(facade);\n};\n\ninterface SandboxCommandByteResult {\n stdout: Uint8Array;\n stderr: Uint8Array;\n exitCode: number;\n output: SandboxCommandOutputMetadata;\n}\n\ntype DirectSandboxCommandRunner = (\n command: SandboxCommand,\n options?: SandboxCommandOptions,\n) => Promise<SandboxCommandByteResult>;\n\nconst directSandboxCommandRunners = new WeakMap<\n Sandbox,\n DirectSandboxCommandRunner\n>();\n\n/** Internal byte-preserving command execution used by the durable adapter. */\nexport const runSandboxCommandForOperation = (\n sandbox: Sandbox,\n command: SandboxCommand,\n options?: SandboxCommandOptions,\n): Promise<SandboxCommandByteResult> => {\n const run = directSandboxCommandRunners.get(sandbox);\n if (!run) {\n throw new SandboxValidationError(\n \"Sandbox commands can only run on an SDK sandbox resource\",\n );\n }\n return run(command, options);\n};\n\nconst pollSandboxStatus = async (\n initial: SandboxRef,\n target: SandboxStatus,\n action: \"pause\" | \"resume\",\n transport: SandboxRestTransport,\n options?: SandboxLifecycleOptions,\n): Promise<Sandbox> => {\n const timeoutMs = lifecycleTimeout(options);\n const deadline = Date.now() + timeoutMs;\n let current = initial;\n while (current.status !== target) {\n if ([\"FAILED\", \"TERMINATED\"].includes(current.status)) {\n throw new SandboxError({\n action,\n code: \"invalid_request\",\n message: `Sandbox entered ${current.status} before reaching ${target}`,\n sandboxId: current.id,\n });\n }\n const remaining = deadline - Date.now();\n if (remaining <= 0) {\n throw new SandboxError({\n action,\n code: \"sandbox_start_timed_out\",\n message: `Sandbox did not reach ${target} within ${timeoutMs} milliseconds`,\n sandboxId: current.id,\n });\n }\n await abortableDelay(Math.min(1_000, remaining), options?.signal);\n const { envelope } = await transport.json(\n action,\n \"GET\",\n `/v2/sandboxes/${encodeURIComponent(current.id)}`,\n { statuses: [200], sandboxId: current.id, signal: options?.signal },\n );\n current = sandboxRefFromResource(envelope?.data);\n if (current.id !== initial.id || current.name !== initial.name) {\n throw new SandboxValidationError(\n \"Sandbox lifecycle operation returned an unrelated sandbox\",\n );\n }\n }\n return createDirectSandboxFacade(current, transport);\n};\n\nconst createDirectSnapshotFacade = (\n rawRef: unknown,\n transport: SandboxRestTransport,\n): SandboxSnapshot => {\n const ref = sandboxSnapshotRefFromResource(rawRef);\n return Object.freeze({\n ...ref,\n resources: Object.freeze({ ...ref.resources }),\n clone: async (\n options: SandboxSnapshotCloneOptions,\n waitOptions?: SandboxLifecycleOptions,\n ) =>\n createSandbox(transport, {\n name: options.name,\n snapshotId: ref.id,\n runningTimeout: options.runningTimeout ?? waitOptions?.timeout,\n }),\n delete: async () => deleteSandboxSnapshot(transport, ref.id),\n });\n};\nconst createDirectSandboxFacade = (\n rawRef: unknown,\n transport: SandboxRestTransport,\n): Sandbox => {\n const ref = parseWithSchema(sandboxRefSchema, rawRef, \"sandbox reference\");\n const basePath = `/v2/sandboxes/${encodeURIComponent(ref.id)}`;\n const runCommand = async (\n command: SandboxCommand,\n options: SandboxCommandOptions = {},\n ): Promise<SandboxCommandByteResult> => {\n const normalized = normalizeSandboxCommandOptions(command, options);\n const { timeout: _timeout, timeoutMs, ...spec } = normalized;\n const { envelope } = await transport.json(\n \"exec\",\n \"POST\",\n `${basePath}/exec`,\n {\n body: {\n ...spec,\n timeout: `${timeoutMs}ms`,\n },\n statuses: [200],\n sandboxId: ref.id,\n },\n );\n const result = parseWithSchema(\n wireCommandResultSchema,\n envelope?.data,\n \"sandbox exec result\",\n );\n return {\n stdout: decodeBase64(result.stdout ?? \"\", \"sandbox exec stdout\"),\n stderr: decodeBase64(result.stderr ?? \"\", \"sandbox exec stderr\"),\n exitCode: result.exitCode,\n output: { truncated: false },\n };\n };\n const facade: Sandbox = {\n ...ref,\n resources: Object.freeze({ ...ref.resources }),\n commands: Object.freeze({\n run: async (command, options) => {\n const result = await runCommand(command, options);\n return {\n stdout: decodeUtf8(result.stdout),\n stderr: decodeUtf8(result.stderr),\n exitCode: result.exitCode,\n output: result.output,\n };\n },\n }),\n logs: Object.freeze({\n stream: async (options = {}) => {\n const parsed = parseWithSchema(\n z.object({ follow: z.boolean().optional() }).strict(),\n options,\n \"sandbox log stream options\",\n );\n const query = new URLSearchParams({\n follow: `${parsed.follow ?? false}`,\n });\n return transport.stream(\n \"logs.stream\",\n `${basePath}/logs?${query}`,\n ref.id,\n );\n },\n }),\n files: Object.freeze({\n upload: async (options): Promise<SandboxFileUploadResult> => {\n const normalized = normalizeFileUploadOptions(options);\n const query = new URLSearchParams({ path: normalized.path });\n if (normalized.mode !== undefined) {\n query.set(\"mode\", normalized.mode.toString(8).padStart(4, \"0\"));\n }\n const response = await transport.raw(\n \"file.upload\",\n \"PUT\",\n `${basePath}/files?${query}`,\n {\n body: normalized.data,\n headers: {\n \"Content-Type\": \"application/octet-stream\",\n },\n sandboxId: ref.id,\n },\n );\n const envelope = await transport.readResponseEnvelope(\n \"file.upload\",\n response,\n ref.id,\n );\n return parseWithSchema(\n fileUploadResultSchema,\n envelope.data,\n \"sandbox file upload result\",\n );\n },\n download: async (options) => {\n const normalized = normalizeFileDownloadOptions(options);\n const query = new URLSearchParams({ path: normalized.path });\n return transport.raw(\n \"file.download\",\n \"GET\",\n `${basePath}/files?${query}`,\n { sandboxId: ref.id },\n );\n },\n }),\n processes: Object.freeze({\n start: async (options) => {\n const body = normalizeSandboxProcessStartOptions(options);\n const { envelope } = await transport.json(\n \"process.start\",\n \"POST\",\n `${basePath}/processes`,\n {\n body,\n statuses: [201],\n sandboxId: ref.id,\n },\n );\n const process = sandboxProcessRefFromResource(ref.id, envelope?.data);\n if (process.state !== \"RUNNING\" || process.pid === undefined) {\n throw new SandboxValidationError(\n \"Sandbox process Start returned a process that is not RUNNING\",\n );\n }\n return createDirectProcessFacade(process, transport);\n },\n list: async (options) => {\n const normalized = normalizeSandboxProcessListOptions(options);\n const query = new URLSearchParams({ limit: `${normalized.limit}` });\n if (normalized.cursor !== undefined) {\n query.set(\"cursor\", normalized.cursor);\n }\n const { envelope } = await transport.json(\n \"process.list\",\n \"GET\",\n `${basePath}/processes?${query}`,\n { statuses: [200], sandboxId: ref.id },\n );\n const processes = parseWithSchema(\n z.array(z.unknown()),\n envelope?.data,\n \"sandbox process list\",\n );\n const metadata = parseWithSchema(\n metadataSchema,\n envelope?.metadata,\n \"sandbox process list metadata\",\n );\n const page = parseWithSchema(\n sandboxPageSchema,\n envelope?.page,\n \"sandbox process list page\",\n );\n const items = processes\n .map((process) =>\n createDirectProcessFacade(\n sandboxProcessRefFromResource(ref.id, process),\n transport,\n ),\n )\n .sort((left, right) => left.id.localeCompare(right.id));\n return {\n items,\n page: {\n hasMore: page.hasMore,\n limit: page.limit,\n ...(page.cursor != null && { cursor: page.cursor }),\n },\n fetchedAt: metadata.fetchedAt,\n };\n },\n get: async (processId) => {\n const parsedProcessId = parseWithSchema(\n canonicalUuidSchema,\n processId,\n \"sandbox process ID\",\n );\n try {\n const { envelope } = await transport.json(\n \"process.get\",\n \"GET\",\n processPath(ref.id, parsedProcessId),\n {\n statuses: [200],\n sandboxId: ref.id,\n processId: parsedProcessId,\n },\n );\n return createDirectProcessFacade(\n sandboxProcessRefFromResource(ref.id, envelope?.data),\n transport,\n );\n } catch (error) {\n if (\n error instanceof SandboxError &&\n error.code === \"sandbox_process_not_found\"\n ) {\n return null;\n }\n throw error;\n }\n },\n }),\n waitUntilRunning: async (options) =>\n waitUntilSandboxRunning(\n ref,\n normalizeSandboxWaitUntilRunningOptions(options).timeoutMs,\n transport,\n \"waitUntilRunning\",\n ),\n pause: async (options) => {\n const { envelope } = await transport.json(\n \"pause\",\n \"POST\",\n `${basePath}/pause`,\n {\n statuses: [200, 201, 202],\n sandboxId: ref.id,\n signal: options?.signal,\n },\n );\n const accepted =\n envelope?.data === undefined\n ? ref\n : sandboxRefFromResource(envelope.data);\n return pollSandboxStatus(accepted, \"PAUSED\", \"pause\", transport, options);\n },\n resume: async (options) => {\n const { envelope } = await transport.json(\n \"resume\",\n \"POST\",\n `${basePath}/resume`,\n {\n statuses: [200, 201, 202],\n sandboxId: ref.id,\n signal: options?.signal,\n },\n );\n const accepted =\n envelope?.data === undefined\n ? ref\n : sandboxRefFromResource(envelope.data);\n return pollSandboxStatus(\n accepted,\n \"RUNNING\",\n \"resume\",\n transport,\n options,\n );\n },\n snapshot: async (options = {}, waitOptions) => {\n normalizeSandboxSnapshotCreateOptions(options);\n const initial = await createSandboxSnapshot(\n transport,\n ref.id,\n waitOptions?.signal,\n );\n const ready = await waitUntilSandboxSnapshotReady(\n transport,\n initial,\n lifecycleTimeout(waitOptions),\n waitOptions?.signal,\n );\n return createDirectSnapshotFacade(ready, transport);\n },\n destroy: async (): Promise<SandboxDestroyResult> => {\n const { status, envelope } = await transport.json(\n \"destroy\",\n \"DELETE\",\n basePath,\n { statuses: [202, 204], sandboxId: ref.id },\n );\n if (status === 204) {\n return { status: \"TERMINATED\", sandbox: null };\n }\n const sandbox = sandboxRefFromResource(envelope?.data);\n if (sandbox.status !== \"TERMINATING\") {\n throw new SandboxValidationError(\n \"Sandbox Destroy returned a resource that is not TERMINATING\",\n );\n }\n return {\n status: \"TERMINATING\",\n sandbox,\n };\n },\n };\n directSandboxCommandRunners.set(facade, runCommand);\n return Object.freeze(facade);\n};\n\nconst waitUntilSandboxRunning = async (\n initialSandbox: SandboxRef,\n timeoutMs: number,\n transport: SandboxRestTransport,\n action: \"create\" | \"waitUntilRunning\",\n): Promise<Sandbox> => {\n let sandbox = initialSandbox;\n if (sandbox.status === \"RUNNING\") {\n return createDirectSandboxFacade(sandbox, transport);\n }\n if (!sandboxStartingStatuses.has(sandbox.status)) {\n throw sandboxStartFailedError(action, sandbox);\n }\n\n const deadline = Date.now() + timeoutMs;\n const path = `/v2/sandboxes/${encodeURIComponent(sandbox.id)}`;\n for (;;) {\n if (deadline - Date.now() <= 0) {\n throw sandboxStartTimedOutError(action, sandbox, timeoutMs);\n }\n\n try {\n const { envelope } = await transport.json(action, \"GET\", path, {\n statuses: [200],\n sandboxId: sandbox.id,\n });\n sandbox = sandboxRefFromResource(envelope?.data);\n } catch (error) {\n if (!(error instanceof SandboxError && error.retryable)) {\n throw error;\n }\n }\n\n if (sandbox.status === \"RUNNING\") {\n return createDirectSandboxFacade(sandbox, transport);\n }\n if (!sandboxStartingStatuses.has(sandbox.status)) {\n throw sandboxStartFailedError(action, sandbox);\n }\n\n const remainingMs = deadline - Date.now();\n if (remainingMs <= 0) {\n throw sandboxStartTimedOutError(action, sandbox, timeoutMs);\n }\n await delay(Math.min(sandboxRunningPollIntervalMs, remainingMs));\n }\n};\n\nconst sandboxClientTransports = new WeakMap<\n SandboxClient,\n SandboxRestTransport\n>();\n\nconst transportForClient = (client: SandboxClient): SandboxRestTransport => {\n const transport = sandboxClientTransports.get(client);\n if (!transport) {\n throw new SandboxValidationError(\n \"Sandbox resources can only be reconstructed for an SDK sandbox client\",\n );\n }\n return transport;\n};\n\n/**\n * Internal reconstruction used by the durable adapter. Public callers reload\n * resources with Get so they receive current state.\n */\nexport const sandboxForOperation = (\n client: SandboxClient,\n ref: unknown,\n): Sandbox => createDirectSandboxFacade(ref, transportForClient(client));\n\nexport const sandboxProcessForOperation = (\n client: SandboxClient,\n ref: unknown,\n): SandboxProcess => createDirectProcessFacade(ref, transportForClient(client));\n\nconst getSnapshotForOperation = async (\n transport: SandboxRestTransport,\n snapshotId: string,\n action: \"snapshot.get\" | \"snapshot.waitUntilReady\",\n): Promise<SandboxSnapshotRef | null> => {\n try {\n const { envelope } = await transport.json(\n action,\n \"GET\",\n `/v2/snapshots/${encodeURIComponent(snapshotId)}`,\n { statuses: [200], snapshotId },\n );\n return sandboxSnapshotRefFromResource(envelope?.data);\n } catch (error) {\n if (\n error instanceof SandboxError &&\n error.code === \"sandbox_snapshot_not_found\"\n ) {\n return null;\n }\n throw error;\n }\n};\n\nconst createSandboxSnapshot = async (\n transport: SandboxRestTransport,\n sandboxId: string,\n signal?: AbortSignal,\n): Promise<SandboxSnapshotRef> => {\n const { status, envelope } = await transport.json(\n \"snapshot.create\",\n \"POST\",\n `/v2/sandboxes/${encodeURIComponent(sandboxId)}/snapshots`,\n {\n body: {},\n statuses: [201, 202],\n sandboxId,\n signal,\n },\n );\n const snapshot = sandboxSnapshotRefFromResource(envelope?.data);\n if (\n (status === 201 && snapshot.status !== \"READY\") ||\n (status === 202 && snapshot.status !== \"CREATING\")\n ) {\n throw new SandboxValidationError(\n `Sandbox snapshot Create returned HTTP ${status} with status ${snapshot.status}`,\n );\n }\n return snapshot;\n};\n\nconst listSandboxSnapshots = async (\n transport: SandboxRestTransport,\n options: Parameters<typeof normalizeSandboxSnapshotListOptions>[0],\n): Promise<SandboxSnapshotListResult> => {\n const normalized = normalizeSandboxSnapshotListOptions(options);\n const query = new URLSearchParams({ limit: `${normalized.limit}` });\n if (normalized.cursor !== undefined) {\n query.set(\"cursor\", normalized.cursor);\n }\n const { envelope } = await transport.json(\n \"snapshot.list\",\n \"GET\",\n `/v2/snapshots?${query}`,\n { statuses: [200] },\n );\n const resources = parseWithSchema(\n z.array(z.unknown()),\n envelope?.data,\n \"sandbox snapshot list\",\n );\n const page = parseWithSchema(\n sandboxPageSchema,\n envelope?.page,\n \"sandbox snapshot list page\",\n );\n const metadata = parseWithSchema(\n metadataSchema,\n envelope?.metadata,\n \"sandbox snapshot list metadata\",\n );\n return {\n items: resources.map(sandboxSnapshotRefFromResource),\n page: {\n hasMore: page.hasMore,\n limit: page.limit,\n ...(page.cursor != null && { cursor: page.cursor }),\n },\n fetchedAt: metadata.fetchedAt,\n };\n};\n\nexport const createSandboxSnapshotForOperation = async (\n client: SandboxClient,\n sandboxId: string,\n): Promise<SandboxSnapshotRef> =>\n createSandboxSnapshot(transportForClient(client), sandboxId);\n\nexport const listSandboxSnapshotsForOperation = async (\n client: SandboxClient,\n options: Parameters<typeof normalizeSandboxSnapshotListOptions>[0],\n): Promise<SandboxSnapshotListResult> =>\n listSandboxSnapshots(transportForClient(client), options);\n\nexport const getSandboxSnapshotForOperation = async (\n client: SandboxClient,\n snapshotId: string,\n): Promise<SandboxSnapshotRef | null> =>\n getSnapshotForOperation(\n transportForClient(client),\n snapshotId,\n \"snapshot.get\",\n );\n\nconst snapshotNotReadyError = (snapshot: SandboxSnapshotRef): SandboxError =>\n new SandboxError({\n action: \"snapshot.waitUntilReady\",\n code: \"sandbox_snapshot_not_ready\",\n message: `Snapshot entered ${snapshot.status} before reaching READY`,\n snapshotId: snapshot.id,\n retryable: false,\n details: [{ status: snapshot.status }],\n });\n\nconst snapshotWaitTimedOutError = (\n snapshot: SandboxSnapshotRef,\n timeoutMs: number,\n): SandboxError =>\n new SandboxError({\n action: \"snapshot.waitUntilReady\",\n code: \"sandbox_snapshot_wait_timed_out\",\n message: `Snapshot did not reach READY within ${timeoutMs} milliseconds`,\n snapshotId: snapshot.id,\n retryable: false,\n details: [{ status: snapshot.status, timeoutMs }],\n });\n\nconst waitUntilSandboxSnapshotReady = async (\n transport: SandboxRestTransport,\n initialSnapshot: SandboxSnapshotRef,\n timeoutMs: number,\n signal?: AbortSignal,\n): Promise<SandboxSnapshotRef> => {\n let snapshot = parseWithSchema(\n sandboxSnapshotRefSchema,\n initialSnapshot,\n \"sandbox snapshot reference\",\n );\n if (snapshot.status === \"READY\") {\n return snapshot;\n }\n if (snapshot.status !== \"CREATING\") {\n throw snapshotNotReadyError(snapshot);\n }\n\n const deadline = Date.now() + timeoutMs;\n for (;;) {\n if (deadline - Date.now() <= 0) {\n throw snapshotWaitTimedOutError(snapshot, timeoutMs);\n }\n try {\n const current = await getSnapshotForOperation(\n transport,\n snapshot.id,\n \"snapshot.waitUntilReady\",\n );\n if (!current) {\n throw new SandboxError({\n action: \"snapshot.waitUntilReady\",\n code: \"sandbox_snapshot_not_found\",\n message: \"Snapshot not found\",\n snapshotId: snapshot.id,\n retryable: false,\n });\n }\n snapshot = current;\n } catch (error) {\n // Transient transport failures must not abort the wait; keep polling\n // until the deadline, matching waitUntilSandboxRunning.\n if (!(error instanceof SandboxError && error.retryable)) {\n throw error;\n }\n }\n\n if (snapshot.status === \"READY\") {\n return snapshot;\n }\n if (snapshot.status !== \"CREATING\") {\n throw snapshotNotReadyError(snapshot);\n }\n\n const remainingMs = deadline - Date.now();\n if (remainingMs <= 0) {\n throw snapshotWaitTimedOutError(snapshot, timeoutMs);\n }\n await abortableDelay(\n Math.min(sandboxRunningPollIntervalMs, remainingMs),\n signal,\n );\n }\n};\n\nexport const waitUntilSandboxSnapshotReadyForOperation = async (\n client: SandboxClient,\n initialSnapshot: SandboxSnapshotRef,\n timeoutMs: number,\n): Promise<SandboxSnapshotRef> =>\n waitUntilSandboxSnapshotReady(\n transportForClient(client),\n initialSnapshot,\n timeoutMs,\n );\n\nconst deleteSandboxSnapshot = async (\n transport: SandboxRestTransport,\n snapshotId: string,\n): Promise<void> => {\n await transport.json(\n \"snapshot.delete\",\n \"DELETE\",\n `/v2/snapshots/${encodeURIComponent(snapshotId)}`,\n { statuses: [204], snapshotId },\n );\n};\n\nexport const deleteSandboxSnapshotForOperation = async (\n client: SandboxClient,\n snapshotId: string,\n): Promise<void> =>\n deleteSandboxSnapshot(transportForClient(client), snapshotId);\n\nconst createSandbox = async (\n transport: SandboxRestTransport,\n options: SandboxCreateOptions,\n): Promise<Sandbox> => {\n const { runningTimeoutMs, ...body } = normalizeSandboxCreateOptions(options);\n const { status, envelope } = await transport.json(\n \"create\",\n \"POST\",\n \"/v2/sandboxes\",\n { body, statuses: [200, 201, 202] },\n );\n const sandbox = sandboxRefFromResource(envelope?.data);\n if (\n (status === 201 && sandbox.status !== \"RUNNING\") ||\n (status === 202 && sandbox.status !== \"STARTING\")\n ) {\n throw new SandboxValidationError(\n `Sandbox Create returned HTTP ${status} with status ${sandbox.status}`,\n );\n }\n return runningTimeoutMs === false\n ? createDirectSandboxFacade(sandbox, transport)\n : waitUntilSandboxRunning(sandbox, runningTimeoutMs, transport, \"create\");\n};\n\nexport const createSandboxForOperation = async (\n client: SandboxClient,\n options: SandboxCreateOptions,\n): Promise<Sandbox> => createSandbox(transportForClient(client), options);\n\nexport const createSandboxClient = (\n config: SandboxClientConfig,\n): SandboxClient => {\n const transport = new SandboxRestTransport(config);\n const client: SandboxClient = {\n create: async (options) => createSandbox(transport, options),\n list: async (options) => {\n const normalized = normalizeSandboxListOptions(options);\n const query = new URLSearchParams({ limit: `${normalized.limit}` });\n if (normalized.cursor !== undefined) {\n query.set(\"cursor\", normalized.cursor);\n }\n const { envelope } = await transport.json(\n \"list\",\n \"GET\",\n `/v2/sandboxes?${query}`,\n { statuses: [200] },\n );\n const resources = parseWithSchema(\n z.array(z.unknown()),\n envelope?.data,\n \"sandbox list\",\n );\n const page = parseWithSchema(\n sandboxPageSchema,\n envelope?.page,\n \"sandbox list page\",\n );\n const metadata = parseWithSchema(\n metadataSchema,\n envelope?.metadata,\n \"sandbox list metadata\",\n );\n return {\n items: resources.map((resource) =>\n createDirectSandboxFacade(\n sandboxRefFromResource(resource),\n transport,\n ),\n ),\n page: {\n hasMore: page.hasMore,\n limit: page.limit,\n ...(page.cursor != null && { cursor: page.cursor }),\n },\n fetchedAt: metadata.fetchedAt,\n };\n },\n get: async (sandboxId) => {\n const parsedSandboxId = parseWithSchema(\n canonicalUuidSchema,\n sandboxId,\n \"sandbox ID\",\n );\n try {\n const { envelope } = await transport.json(\n \"get\",\n \"GET\",\n `/v2/sandboxes/${encodeURIComponent(parsedSandboxId)}`,\n { statuses: [200], sandboxId: parsedSandboxId },\n );\n return createDirectSandboxFacade(\n sandboxRefFromResource(envelope?.data),\n transport,\n );\n } catch (error) {\n if (\n error instanceof SandboxError &&\n error.code === \"sandbox_not_found\"\n ) {\n return null;\n }\n throw error;\n }\n },\n snapshots: Object.freeze({\n list: async (options) => {\n const result = await listSandboxSnapshots(transport, options);\n return {\n items: result.items.map((snapshot) =>\n createDirectSnapshotFacade(snapshot, transport),\n ),\n page: { ...result.page },\n fetchedAt: result.fetchedAt,\n };\n },\n get: async (snapshotId) => {\n const parsedSnapshotId = parseWithSchema(\n canonicalUuidSchema,\n snapshotId,\n \"sandbox snapshot ID\",\n );\n const snapshot = await getSnapshotForOperation(\n transport,\n parsedSnapshotId,\n \"snapshot.get\",\n );\n return snapshot\n ? createDirectSnapshotFacade(snapshot, transport)\n : null;\n },\n }),\n };\n sandboxClientTransports.set(client, transport);\n return client;\n};\n"],"mappings":"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"}
@@ -70,6 +70,10 @@ const processRefForWire = (process) => ({
70
70
  ...process.startedAt !== void 0 && { startedAt: process.startedAt },
71
71
  ...process.endedAt !== void 0 && { endedAt: process.endedAt }
72
72
  });
73
+ const snapshotRefForWire = (snapshot) => ({
74
+ ...snapshot,
75
+ resources: { ...snapshot.resources }
76
+ });
73
77
  /**
74
78
  * Execute a durable sandbox operation through the public REST client and
75
79
  * reduce its result to JSON-safe data suitable for normal step memoization.
@@ -79,7 +83,7 @@ const executeSandboxOperation = async (client, rawOperation) => {
79
83
  switch (operation.action) {
80
84
  case "create": {
81
85
  const { runningTimeoutMs, ...options } = operation.input[0];
82
- const sandbox = await client.create({
86
+ const sandbox = await require_client.createSandboxForOperation(client, {
83
87
  ...options,
84
88
  ...runningTimeoutMs !== void 0 && { runningTimeout: runningTimeoutMs }
85
89
  });
@@ -142,6 +146,15 @@ const executeSandboxOperation = async (client, rawOperation) => {
142
146
  result
143
147
  };
144
148
  }
149
+ case "pause":
150
+ case "resume": {
151
+ const sandbox = await require_client.sandboxForOperation(client, operation.target.sandbox)[operation.action]({ timeout: operation.input[0].timeoutMs });
152
+ return {
153
+ protocolVersion: require_types.sandboxProtocolVersion,
154
+ action: operation.action,
155
+ sandbox: sandboxRefForWire(sandbox)
156
+ };
157
+ }
145
158
  case "process.start": {
146
159
  const process = await require_client.sandboxForOperation(client, operation.target.sandbox).processes.start(operation.input[0]);
147
160
  return {
@@ -199,6 +212,47 @@ const executeSandboxOperation = async (client, rawOperation) => {
199
212
  result: { chunks: result.chunks.map(encodeOutputChunk) }
200
213
  };
201
214
  }
215
+ case "snapshot.create": {
216
+ const snapshot = await require_client.createSandboxSnapshotForOperation(client, operation.target.sandbox.id);
217
+ return {
218
+ protocolVersion: require_types.sandboxProtocolVersion,
219
+ action: operation.action,
220
+ snapshot: snapshotRefForWire(snapshot)
221
+ };
222
+ }
223
+ case "snapshot.list": {
224
+ const result = await require_client.listSandboxSnapshotsForOperation(client, operation.input[0]);
225
+ return {
226
+ protocolVersion: require_types.sandboxProtocolVersion,
227
+ action: operation.action,
228
+ snapshots: result.items.map(snapshotRefForWire),
229
+ page: { ...result.page },
230
+ fetchedAt: result.fetchedAt
231
+ };
232
+ }
233
+ case "snapshot.get": {
234
+ const snapshot = await require_client.getSandboxSnapshotForOperation(client, operation.target.snapshotId);
235
+ return {
236
+ protocolVersion: require_types.sandboxProtocolVersion,
237
+ action: operation.action,
238
+ snapshot: snapshot ? snapshotRefForWire(snapshot) : null
239
+ };
240
+ }
241
+ case "snapshot.waitUntilReady": {
242
+ const snapshot = await require_client.waitUntilSandboxSnapshotReadyForOperation(client, operation.target.snapshot, operation.input[0].timeoutMs);
243
+ return {
244
+ protocolVersion: require_types.sandboxProtocolVersion,
245
+ action: operation.action,
246
+ snapshot: snapshotRefForWire(snapshot)
247
+ };
248
+ }
249
+ case "snapshot.delete":
250
+ await require_client.deleteSandboxSnapshotForOperation(client, operation.target.snapshot.id);
251
+ return {
252
+ protocolVersion: require_types.sandboxProtocolVersion,
253
+ action: operation.action,
254
+ result: null
255
+ };
202
256
  }
203
257
  };
204
258
  const callRawTool = async (rawToolResolver, idOrOptions, operation) => {
@@ -216,11 +270,55 @@ const callRawTool = async (rawToolResolver, idOrOptions, operation) => {
216
270
  throw error;
217
271
  }
218
272
  };
273
+ const snapshotWaitStepOptions = (idOrOptions) => {
274
+ if (typeof idOrOptions === "string") return `${idOrOptions}:wait-until-ready`;
275
+ return {
276
+ ...idOrOptions,
277
+ id: `${idOrOptions.id}:wait-until-ready`,
278
+ ...idOrOptions.name && { name: `${idOrOptions.name} (wait until ready)` }
279
+ };
280
+ };
219
281
  const sandboxTarget = (ref) => ({ sandbox: ref });
220
282
  const processTarget = (sandbox, process) => ({
221
283
  sandbox,
222
284
  process
223
285
  });
286
+ const snapshotTarget = (snapshot) => ({ snapshot });
287
+ const createDurableSandboxSnapshotFacade = (rawRef, rawToolResolver) => {
288
+ const ref = require_validation.parseWithSchema(require_validation.sandboxSnapshotRefSchema, rawRef, "sandbox snapshot reference");
289
+ const facade = {
290
+ ...ref,
291
+ resources: Object.freeze({ ...ref.resources }),
292
+ waitUntilReady: async (idOrOptions, options) => {
293
+ return createDurableSandboxSnapshotFacade((await callRawTool(rawToolResolver, idOrOptions, require_protocol.parseSandboxOperationForAction("snapshot.waitUntilReady", {
294
+ protocolVersion: require_types.sandboxProtocolVersion,
295
+ action: "snapshot.waitUntilReady",
296
+ target: snapshotTarget(ref),
297
+ input: [require_validation.normalizeSandboxSnapshotWaitOptions(options)]
298
+ }))).snapshot, rawToolResolver);
299
+ },
300
+ delete: async (idOrOptions) => {
301
+ await callRawTool(rawToolResolver, idOrOptions, require_protocol.parseSandboxOperationForAction("snapshot.delete", {
302
+ protocolVersion: require_types.sandboxProtocolVersion,
303
+ action: "snapshot.delete",
304
+ target: snapshotTarget(ref),
305
+ input: []
306
+ }));
307
+ },
308
+ clone: async (idOrOptions, options, waitOptions) => {
309
+ return createDurableSandboxFacade((await callRawTool(rawToolResolver, idOrOptions, require_protocol.parseSandboxOperationForAction("create", {
310
+ protocolVersion: require_types.sandboxProtocolVersion,
311
+ action: "create",
312
+ input: [require_validation.normalizeSandboxCreateOptions({
313
+ name: options.name,
314
+ snapshotId: ref.id,
315
+ runningTimeout: options.runningTimeout ?? waitOptions?.timeout
316
+ })]
317
+ }))).sandbox, rawToolResolver);
318
+ }
319
+ };
320
+ return Object.freeze(facade);
321
+ };
224
322
  const createDurableSandboxProcessFacade = (rawRef, sandboxRef, rawToolResolver) => {
225
323
  const ref = require_validation.parseWithSchema(require_validation.sandboxProcessRefSchema, rawRef, "sandbox process reference");
226
324
  if (ref.sandboxId !== sandboxRef.id) throw new require_types.SandboxValidationError("Sandbox process reference belongs to another sandbox");
@@ -263,6 +361,22 @@ const createDurableSandboxProcessFacade = (rawRef, sandboxRef, rawToolResolver)
263
361
  };
264
362
  const createDurableSandboxFacade = (rawRef, rawToolResolver) => {
265
363
  const ref = require_validation.parseWithSchema(require_validation.sandboxRefSchema, rawRef, "sandbox reference");
364
+ const createSnapshot = async (idOrOptions, options, waitOptions) => {
365
+ const createOptions = require_validation.normalizeSandboxSnapshotCreateOptions(options);
366
+ const wait = require_validation.normalizeSandboxSnapshotWaitOptions({ timeout: waitOptions?.timeout ?? 5 * 6e4 });
367
+ const waitOperation = require_protocol.parseSandboxOperationForAction("snapshot.waitUntilReady", {
368
+ protocolVersion: require_types.sandboxProtocolVersion,
369
+ action: "snapshot.waitUntilReady",
370
+ target: snapshotTarget((await callRawTool(rawToolResolver, idOrOptions, require_protocol.parseSandboxOperationForAction("snapshot.create", {
371
+ protocolVersion: require_types.sandboxProtocolVersion,
372
+ action: "snapshot.create",
373
+ target: sandboxTarget(ref),
374
+ input: [createOptions]
375
+ }))).snapshot),
376
+ input: [wait]
377
+ });
378
+ return createDurableSandboxSnapshotFacade((await callRawTool(rawToolResolver, snapshotWaitStepOptions(idOrOptions), waitOperation)).snapshot, rawToolResolver);
379
+ };
266
380
  const facade = {
267
381
  ...ref,
268
382
  resources: Object.freeze({ ...ref.resources }),
@@ -316,6 +430,8 @@ const createDurableSandboxFacade = (rawRef, rawToolResolver) => {
316
430
  return result.process ? createDurableSandboxProcessFacade(result.process, ref, rawToolResolver) : null;
317
431
  }
318
432
  }),
433
+ snapshots: Object.freeze({ create: createSnapshot }),
434
+ snapshot: createSnapshot,
319
435
  waitUntilRunning: async (idOrOptions, options) => {
320
436
  return createDurableSandboxFacade((await callRawTool(rawToolResolver, idOrOptions, require_protocol.parseSandboxOperationForAction("waitUntilRunning", {
321
437
  protocolVersion: require_types.sandboxProtocolVersion,
@@ -324,6 +440,24 @@ const createDurableSandboxFacade = (rawRef, rawToolResolver) => {
324
440
  input: [require_validation.normalizeSandboxWaitUntilRunningOptions(options)]
325
441
  }))).sandbox, rawToolResolver);
326
442
  },
443
+ pause: async (idOrOptions, options) => {
444
+ const input = require_validation.normalizeSandboxWaitUntilRunningOptions({ timeout: options?.timeout ?? 5 * 6e4 });
445
+ return createDurableSandboxFacade((await callRawTool(rawToolResolver, idOrOptions, require_protocol.parseSandboxOperationForAction("pause", {
446
+ protocolVersion: require_types.sandboxProtocolVersion,
447
+ action: "pause",
448
+ target: sandboxTarget(ref),
449
+ input: [input]
450
+ }))).sandbox, rawToolResolver);
451
+ },
452
+ resume: async (idOrOptions, options) => {
453
+ const input = require_validation.normalizeSandboxWaitUntilRunningOptions({ timeout: options?.timeout ?? 5 * 6e4 });
454
+ return createDurableSandboxFacade((await callRawTool(rawToolResolver, idOrOptions, require_protocol.parseSandboxOperationForAction("resume", {
455
+ protocolVersion: require_types.sandboxProtocolVersion,
456
+ action: "resume",
457
+ target: sandboxTarget(ref),
458
+ input: [input]
459
+ }))).sandbox, rawToolResolver);
460
+ },
327
461
  destroy: async (idOrOptions) => {
328
462
  return (await callRawTool(rawToolResolver, idOrOptions, require_protocol.parseSandboxOperationForAction("destroy", {
329
463
  protocolVersion: require_types.sandboxProtocolVersion,
@@ -362,6 +496,29 @@ const createSandboxTools = (rawToolResolver) => ({
362
496
  input: [{ sandboxId: require_validation.parseWithSchema(require_validation.canonicalUuidSchema, sandboxId, "sandbox ID") }]
363
497
  }));
364
498
  return result.sandbox ? createDurableSandboxFacade(result.sandbox, rawToolResolver) : null;
499
+ },
500
+ snapshots: {
501
+ list: async (idOrOptions, options) => {
502
+ const result = await callRawTool(rawToolResolver, idOrOptions, require_protocol.parseSandboxOperationForAction("snapshot.list", {
503
+ protocolVersion: require_types.sandboxProtocolVersion,
504
+ action: "snapshot.list",
505
+ input: [require_validation.normalizeSandboxSnapshotListOptions(options)]
506
+ }));
507
+ return {
508
+ items: result.snapshots.map((snapshot) => createDurableSandboxSnapshotFacade(snapshot, rawToolResolver)),
509
+ page: { ...result.page },
510
+ fetchedAt: result.fetchedAt
511
+ };
512
+ },
513
+ get: async (idOrOptions, snapshotId) => {
514
+ const result = await callRawTool(rawToolResolver, idOrOptions, require_protocol.parseSandboxOperationForAction("snapshot.get", {
515
+ protocolVersion: require_types.sandboxProtocolVersion,
516
+ action: "snapshot.get",
517
+ target: { snapshotId: require_validation.parseWithSchema(require_validation.canonicalUuidSchema, snapshotId, "sandbox snapshot ID") },
518
+ input: []
519
+ }));
520
+ return result.snapshot ? createDurableSandboxSnapshotFacade(result.snapshot, rawToolResolver) : null;
521
+ }
365
522
  }
366
523
  });
367
524