inngest 4.18.1 → 4.19.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 (58) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/api/api.cjs +22 -3
  3. package/api/api.cjs.map +1 -1
  4. package/api/api.js +22 -3
  5. package/api/api.js.map +1 -1
  6. package/components/Inngest.cjs +1 -0
  7. package/components/Inngest.cjs.map +1 -1
  8. package/components/Inngest.d.cts.map +1 -1
  9. package/components/Inngest.d.ts.map +1 -1
  10. package/components/Inngest.js +1 -0
  11. package/components/Inngest.js.map +1 -1
  12. package/components/execution/engine.cjs +7 -7
  13. package/components/execution/engine.cjs.map +1 -1
  14. package/components/execution/engine.d.cts.map +1 -1
  15. package/components/execution/engine.d.ts.map +1 -1
  16. package/components/execution/engine.js +8 -8
  17. package/components/execution/engine.js.map +1 -1
  18. package/components/sandbox/client.cjs +35 -17
  19. package/components/sandbox/client.cjs.map +1 -1
  20. package/components/sandbox/client.js +36 -19
  21. package/components/sandbox/client.js.map +1 -1
  22. package/components/sandbox/durable.cjs +6 -6
  23. package/components/sandbox/durable.cjs.map +1 -1
  24. package/components/sandbox/durable.js +8 -8
  25. package/components/sandbox/durable.js.map +1 -1
  26. package/components/sandbox/protocol.cjs +1 -1
  27. package/components/sandbox/protocol.cjs.map +1 -1
  28. package/components/sandbox/protocol.js +1 -1
  29. package/components/sandbox/protocol.js.map +1 -1
  30. package/components/sandbox/types.cjs.map +1 -1
  31. package/components/sandbox/types.d.cts +47 -11
  32. package/components/sandbox/types.d.cts.map +1 -1
  33. package/components/sandbox/types.d.ts +47 -11
  34. package/components/sandbox/types.d.ts.map +1 -1
  35. package/components/sandbox/types.js.map +1 -1
  36. package/components/sandbox/validation.cjs +26 -11
  37. package/components/sandbox/validation.cjs.map +1 -1
  38. package/components/sandbox/validation.js +26 -12
  39. package/components/sandbox/validation.js.map +1 -1
  40. package/experimental.d.cts +2 -2
  41. package/experimental.d.ts +2 -2
  42. package/helpers/sessions.cjs +10 -2
  43. package/helpers/sessions.cjs.map +1 -1
  44. package/helpers/sessions.js +10 -3
  45. package/helpers/sessions.js.map +1 -1
  46. package/package.json +1 -1
  47. package/react.d.cts +1 -1
  48. package/react.d.ts +1 -1
  49. package/types.d.cts +15 -15
  50. package/types.d.cts.map +1 -1
  51. package/types.d.ts +15 -15
  52. package/types.d.ts.map +1 -1
  53. package/version.cjs +1 -1
  54. package/version.cjs.map +1 -1
  55. package/version.d.cts +1 -1
  56. package/version.d.ts +1 -1
  57. package/version.js +1 -1
  58. package/version.js.map +1 -1
@@ -25,8 +25,8 @@ const sandboxPageSchema = zod_v3.z.object({
25
25
  limit: zod_v3.z.number().int().min(1).max(250)
26
26
  }).strip();
27
27
  const wireCommandResultSchema = zod_v3.z.object({
28
- stdout: zod_v3.z.string(),
29
- stderr: zod_v3.z.string(),
28
+ stdout: zod_v3.z.string().optional(),
29
+ stderr: zod_v3.z.string().optional(),
30
30
  encoding: zod_v3.z.literal("base64"),
31
31
  exitCode: zod_v3.z.number().int().min(-2147483648).max(2147483647)
32
32
  }).strip();
@@ -313,28 +313,44 @@ const createDirectProcessFacade = (rawRef, transport) => {
313
313
  };
314
314
  return Object.freeze(facade);
315
315
  };
316
+ const directSandboxCommandRunners = /* @__PURE__ */ new WeakMap();
317
+ /** Internal byte-preserving command execution used by the durable adapter. */
318
+ const runSandboxCommandForOperation = (sandbox, command, options) => {
319
+ const run = directSandboxCommandRunners.get(sandbox);
320
+ if (!run) throw new require_types.SandboxValidationError("Sandbox commands can only run on an SDK sandbox resource");
321
+ return run(command, options);
322
+ };
316
323
  const createDirectSandboxFacade = (rawRef, transport) => {
317
324
  const ref = require_validation.parseWithSchema(require_validation.sandboxRefSchema, rawRef, "sandbox reference");
318
325
  const basePath = `/v2/sandboxes/${encodeURIComponent(ref.id)}`;
326
+ const runCommand = async (command, options = {}) => {
327
+ const { timeout: _timeout, timeoutMs, ...spec } = require_validation.normalizeSandboxCommandOptions(command, options);
328
+ const { envelope } = await transport.json("exec", "POST", `${basePath}/exec`, {
329
+ body: {
330
+ ...spec,
331
+ timeout: `${timeoutMs}ms`
332
+ },
333
+ statuses: [200],
334
+ sandboxId: ref.id
335
+ });
336
+ const result = require_validation.parseWithSchema(wireCommandResultSchema, envelope?.data, "sandbox exec result");
337
+ return {
338
+ stdout: require_validation.decodeBase64(result.stdout ?? "", "sandbox exec stdout"),
339
+ stderr: require_validation.decodeBase64(result.stderr ?? "", "sandbox exec stderr"),
340
+ exitCode: result.exitCode,
341
+ output: { truncated: false }
342
+ };
343
+ };
319
344
  const facade = {
320
345
  ...ref,
321
346
  resources: Object.freeze({ ...ref.resources }),
322
- commands: Object.freeze({ run: async (options) => {
323
- const { timeout: _timeout, timeoutMs, ...spec } = require_validation.normalizeSandboxCommandOptions(options);
324
- const { envelope } = await transport.json("exec", "POST", `${basePath}/exec`, {
325
- body: {
326
- ...spec,
327
- timeout: `${timeoutMs}ms`
328
- },
329
- statuses: [200],
330
- sandboxId: ref.id
331
- });
332
- const result = require_validation.parseWithSchema(wireCommandResultSchema, envelope?.data, "sandbox exec result");
347
+ commands: Object.freeze({ run: async (command, options) => {
348
+ const result = await runCommand(command, options);
333
349
  return {
334
- stdout: require_validation.decodeBase64(result.stdout, "sandbox exec stdout"),
335
- stderr: require_validation.decodeBase64(result.stderr, "sandbox exec stderr"),
350
+ stdout: require_validation.decodeUtf8(result.stdout),
351
+ stderr: require_validation.decodeUtf8(result.stderr),
336
352
  exitCode: result.exitCode,
337
- output: { truncated: false }
353
+ output: result.output
338
354
  };
339
355
  } }),
340
356
  logs: Object.freeze({ stream: async (options = {}) => {
@@ -426,6 +442,7 @@ const createDirectSandboxFacade = (rawRef, transport) => {
426
442
  };
427
443
  }
428
444
  };
445
+ directSandboxCommandRunners.set(facade, runCommand);
429
446
  return Object.freeze(facade);
430
447
  };
431
448
  const waitUntilSandboxRunning = async (initialSandbox, timeoutMs, transport, action) => {
@@ -479,7 +496,7 @@ const createSandboxClient = (config) => {
479
496
  });
480
497
  const sandbox = require_validation.sandboxRefFromResource(envelope?.data);
481
498
  if (status === 201 && sandbox.status !== "RUNNING" || status === 202 && sandbox.status !== "STARTING") throw new require_types.SandboxValidationError(`Sandbox Create returned HTTP ${status} with status ${sandbox.status}`);
482
- return runningTimeoutMs === void 0 ? createDirectSandboxFacade(sandbox, transport) : waitUntilSandboxRunning(sandbox, runningTimeoutMs, transport, "create");
499
+ return runningTimeoutMs === false ? createDirectSandboxFacade(sandbox, transport) : waitUntilSandboxRunning(sandbox, runningTimeoutMs, transport, "create");
483
500
  },
484
501
  list: async (options) => {
485
502
  const normalized = require_validation.normalizeSandboxListOptions(options);
@@ -519,6 +536,7 @@ const createSandboxClient = (config) => {
519
536
 
520
537
  //#endregion
521
538
  exports.createSandboxClient = createSandboxClient;
539
+ exports.runSandboxCommandForOperation = runSandboxCommandForOperation;
522
540
  exports.sandboxForOperation = sandboxForOperation;
523
541
  exports.sandboxProcessForOperation = sandboxProcessForOperation;
524
542
  //# sourceMappingURL=client.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"client.cjs","names":["z","restOutputChunkSchema","canonicalUuidSchema","config: SandboxClientConfig","parseWithSchema","SandboxValidationError","decodeOutputChunk","requestInit: RequestInit & { duplex?: \"half\" }","SandboxError","sandboxProcessRefSchema","facade: SandboxProcess","normalizeSandboxProcessSignalOptions","normalizeSandboxProcessWaitOptions","normalizeSandboxProcessOutputOptions","sandboxRefSchema","facade: Sandbox","normalizeSandboxCommandOptions","decodeBase64","normalizeFileUploadOptions","normalizeFileDownloadOptions","normalizeSandboxProcessStartOptions","sandboxProcessRefFromResource","normalizeSandboxProcessListOptions","normalizeSandboxWaitUntilRunningOptions","sandboxRefFromResource","client: SandboxClient","normalizeSandboxCreateOptions","normalizeSandboxListOptions"],"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 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 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(),\n stderr: z.string(),\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\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 facade: Sandbox = {\n ...ref,\n resources: Object.freeze({ ...ref.resources }),\n commands: Object.freeze({\n run: async (options) => {\n const normalized = normalizeSandboxCommandOptions(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 }),\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 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 === undefined\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.cjs","names":["z","restOutputChunkSchema","canonicalUuidSchema","config: SandboxClientConfig","parseWithSchema","SandboxValidationError","decodeOutputChunk","requestInit: RequestInit & { duplex?: \"half\" }","SandboxError","sandboxProcessRefSchema","facade: SandboxProcess","normalizeSandboxProcessSignalOptions","normalizeSandboxProcessWaitOptions","normalizeSandboxProcessOutputOptions","sandboxRefSchema","normalizeSandboxCommandOptions","decodeBase64","facade: Sandbox","decodeUtf8","normalizeFileUploadOptions","normalizeFileDownloadOptions","normalizeSandboxProcessStartOptions","sandboxProcessRefFromResource","normalizeSandboxProcessListOptions","normalizeSandboxWaitUntilRunningOptions","sandboxRefFromResource","client: SandboxClient","normalizeSandboxCreateOptions","normalizeSandboxListOptions"],"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,5 +1,5 @@
1
1
  import { SandboxError, SandboxValidationError } from "./types.js";
2
- import { canonicalUuidSchema, decodeBase64, decodeOutputChunk, normalizeFileDownloadOptions, normalizeFileUploadOptions, normalizeSandboxCommandOptions, normalizeSandboxCreateOptions, normalizeSandboxListOptions, normalizeSandboxProcessListOptions, normalizeSandboxProcessOutputOptions, normalizeSandboxProcessSignalOptions, normalizeSandboxProcessStartOptions, normalizeSandboxProcessWaitOptions, normalizeSandboxWaitUntilRunningOptions, parseWithSchema, restOutputChunkSchema, sandboxProcessRefFromResource, sandboxProcessRefSchema, sandboxRefFromResource, sandboxRefSchema } from "./validation.js";
2
+ import { canonicalUuidSchema, decodeBase64, decodeOutputChunk, decodeUtf8, normalizeFileDownloadOptions, normalizeFileUploadOptions, normalizeSandboxCommandOptions, normalizeSandboxCreateOptions, normalizeSandboxListOptions, normalizeSandboxProcessListOptions, normalizeSandboxProcessOutputOptions, normalizeSandboxProcessSignalOptions, normalizeSandboxProcessStartOptions, normalizeSandboxProcessWaitOptions, normalizeSandboxWaitUntilRunningOptions, parseWithSchema, restOutputChunkSchema, sandboxProcessRefFromResource, sandboxProcessRefSchema, sandboxRefFromResource, sandboxRefSchema } from "./validation.js";
3
3
  import { z } from "zod/v3";
4
4
 
5
5
  //#region src/components/sandbox/client.ts
@@ -24,8 +24,8 @@ const sandboxPageSchema = z.object({
24
24
  limit: z.number().int().min(1).max(250)
25
25
  }).strip();
26
26
  const wireCommandResultSchema = z.object({
27
- stdout: z.string(),
28
- stderr: z.string(),
27
+ stdout: z.string().optional(),
28
+ stderr: z.string().optional(),
29
29
  encoding: z.literal("base64"),
30
30
  exitCode: z.number().int().min(-2147483648).max(2147483647)
31
31
  }).strip();
@@ -312,28 +312,44 @@ const createDirectProcessFacade = (rawRef, transport) => {
312
312
  };
313
313
  return Object.freeze(facade);
314
314
  };
315
+ const directSandboxCommandRunners = /* @__PURE__ */ new WeakMap();
316
+ /** Internal byte-preserving command execution used by the durable adapter. */
317
+ const runSandboxCommandForOperation = (sandbox, command, options) => {
318
+ const run = directSandboxCommandRunners.get(sandbox);
319
+ if (!run) throw new SandboxValidationError("Sandbox commands can only run on an SDK sandbox resource");
320
+ return run(command, options);
321
+ };
315
322
  const createDirectSandboxFacade = (rawRef, transport) => {
316
323
  const ref = parseWithSchema(sandboxRefSchema, rawRef, "sandbox reference");
317
324
  const basePath = `/v2/sandboxes/${encodeURIComponent(ref.id)}`;
325
+ const runCommand = async (command, options = {}) => {
326
+ const { timeout: _timeout, timeoutMs, ...spec } = normalizeSandboxCommandOptions(command, options);
327
+ const { envelope } = await transport.json("exec", "POST", `${basePath}/exec`, {
328
+ body: {
329
+ ...spec,
330
+ timeout: `${timeoutMs}ms`
331
+ },
332
+ statuses: [200],
333
+ sandboxId: ref.id
334
+ });
335
+ const result = parseWithSchema(wireCommandResultSchema, envelope?.data, "sandbox exec result");
336
+ return {
337
+ stdout: decodeBase64(result.stdout ?? "", "sandbox exec stdout"),
338
+ stderr: decodeBase64(result.stderr ?? "", "sandbox exec stderr"),
339
+ exitCode: result.exitCode,
340
+ output: { truncated: false }
341
+ };
342
+ };
318
343
  const facade = {
319
344
  ...ref,
320
345
  resources: Object.freeze({ ...ref.resources }),
321
- commands: Object.freeze({ run: async (options) => {
322
- const { timeout: _timeout, timeoutMs, ...spec } = normalizeSandboxCommandOptions(options);
323
- const { envelope } = await transport.json("exec", "POST", `${basePath}/exec`, {
324
- body: {
325
- ...spec,
326
- timeout: `${timeoutMs}ms`
327
- },
328
- statuses: [200],
329
- sandboxId: ref.id
330
- });
331
- const result = parseWithSchema(wireCommandResultSchema, envelope?.data, "sandbox exec result");
346
+ commands: Object.freeze({ run: async (command, options) => {
347
+ const result = await runCommand(command, options);
332
348
  return {
333
- stdout: decodeBase64(result.stdout, "sandbox exec stdout"),
334
- stderr: decodeBase64(result.stderr, "sandbox exec stderr"),
349
+ stdout: decodeUtf8(result.stdout),
350
+ stderr: decodeUtf8(result.stderr),
335
351
  exitCode: result.exitCode,
336
- output: { truncated: false }
352
+ output: result.output
337
353
  };
338
354
  } }),
339
355
  logs: Object.freeze({ stream: async (options = {}) => {
@@ -425,6 +441,7 @@ const createDirectSandboxFacade = (rawRef, transport) => {
425
441
  };
426
442
  }
427
443
  };
444
+ directSandboxCommandRunners.set(facade, runCommand);
428
445
  return Object.freeze(facade);
429
446
  };
430
447
  const waitUntilSandboxRunning = async (initialSandbox, timeoutMs, transport, action) => {
@@ -478,7 +495,7 @@ const createSandboxClient = (config) => {
478
495
  });
479
496
  const sandbox = sandboxRefFromResource(envelope?.data);
480
497
  if (status === 201 && sandbox.status !== "RUNNING" || status === 202 && sandbox.status !== "STARTING") throw new SandboxValidationError(`Sandbox Create returned HTTP ${status} with status ${sandbox.status}`);
481
- return runningTimeoutMs === void 0 ? createDirectSandboxFacade(sandbox, transport) : waitUntilSandboxRunning(sandbox, runningTimeoutMs, transport, "create");
498
+ return runningTimeoutMs === false ? createDirectSandboxFacade(sandbox, transport) : waitUntilSandboxRunning(sandbox, runningTimeoutMs, transport, "create");
482
499
  },
483
500
  list: async (options) => {
484
501
  const normalized = normalizeSandboxListOptions(options);
@@ -517,5 +534,5 @@ const createSandboxClient = (config) => {
517
534
  };
518
535
 
519
536
  //#endregion
520
- export { createSandboxClient, sandboxForOperation, sandboxProcessForOperation };
537
+ export { createSandboxClient, runSandboxCommandForOperation, sandboxForOperation, sandboxProcessForOperation };
521
538
  //# sourceMappingURL=client.js.map