inngest 4.23.0 → 4.24.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 (68) hide show
  1. package/CHANGELOG.md +34 -0
  2. package/components/Inngest.cjs.map +1 -1
  3. package/components/Inngest.d.cts +5 -1
  4. package/components/Inngest.d.cts.map +1 -1
  5. package/components/Inngest.d.ts +5 -1
  6. package/components/Inngest.d.ts.map +1 -1
  7. package/components/Inngest.js.map +1 -1
  8. package/components/realtime/types.d.cts +4 -4
  9. package/components/realtime/types.d.cts.map +1 -1
  10. package/components/realtime/types.d.ts +4 -4
  11. package/components/realtime/types.d.ts.map +1 -1
  12. package/components/sandbox/durable.cjs +27 -5
  13. package/components/sandbox/durable.cjs.map +1 -1
  14. package/components/sandbox/durable.js +27 -5
  15. package/components/sandbox/durable.js.map +1 -1
  16. package/components/sandbox/group.cjs +56 -0
  17. package/components/sandbox/group.cjs.map +1 -0
  18. package/components/sandbox/group.d.cts +16 -0
  19. package/components/sandbox/group.d.cts.map +1 -0
  20. package/components/sandbox/group.d.ts +16 -0
  21. package/components/sandbox/group.d.ts.map +1 -0
  22. package/components/sandbox/group.js +56 -0
  23. package/components/sandbox/group.js.map +1 -0
  24. package/components/sandbox/middleware.cjs +10 -2
  25. package/components/sandbox/middleware.cjs.map +1 -1
  26. package/components/sandbox/middleware.d.cts +5 -0
  27. package/components/sandbox/middleware.d.cts.map +1 -1
  28. package/components/sandbox/middleware.d.ts +5 -0
  29. package/components/sandbox/middleware.d.ts.map +1 -1
  30. package/components/sandbox/middleware.js +11 -3
  31. package/components/sandbox/middleware.js.map +1 -1
  32. package/components/sandbox/types.cjs.map +1 -1
  33. package/components/sandbox/types.d.cts +8 -1
  34. package/components/sandbox/types.d.cts.map +1 -1
  35. package/components/sandbox/types.d.ts +8 -1
  36. package/components/sandbox/types.d.ts.map +1 -1
  37. package/components/sandbox/types.js.map +1 -1
  38. package/components/sandbox/validation.cjs +5 -9
  39. package/components/sandbox/validation.cjs.map +1 -1
  40. package/components/sandbox/validation.js +5 -8
  41. package/components/sandbox/validation.js.map +1 -1
  42. package/experimental.d.cts +2 -1
  43. package/experimental.d.ts +2 -1
  44. package/helpers/duration.cjs +46 -0
  45. package/helpers/duration.cjs.map +1 -0
  46. package/helpers/duration.d.cts +25 -0
  47. package/helpers/duration.d.cts.map +1 -0
  48. package/helpers/duration.d.ts +25 -0
  49. package/helpers/duration.d.ts.map +1 -0
  50. package/helpers/duration.js +44 -0
  51. package/helpers/duration.js.map +1 -0
  52. package/index.cjs +2 -0
  53. package/index.d.cts +2 -1
  54. package/index.d.ts +2 -1
  55. package/index.js +2 -1
  56. package/package.json +1 -1
  57. package/types.cjs.map +1 -1
  58. package/types.d.cts +16 -13
  59. package/types.d.cts.map +1 -1
  60. package/types.d.ts +16 -13
  61. package/types.d.ts.map +1 -1
  62. package/types.js.map +1 -1
  63. package/version.cjs +1 -1
  64. package/version.cjs.map +1 -1
  65. package/version.d.cts +1 -1
  66. package/version.d.ts +1 -1
  67. package/version.js +1 -1
  68. package/version.js.map +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","names":[],"sources":["../../../src/components/sandbox/types.ts"],"sourcesContent":["import type { DurationLike } from \"../../helpers/temporal.ts\";\nimport type { StepOptionsOrId } from \"../../types.ts\";\n\nexport const sandboxProtocolVersion = 1 as const;\n\nexport type SandboxDuration = number | string | DurationLike;\n\nexport type SandboxStatus =\n | \"PENDING\"\n | \"STARTING\"\n | \"PAUSING\"\n | \"RUNNING\"\n | \"PAUSED\"\n | \"RESUMING\"\n | \"TERMINATING\"\n | \"TERMINATED\"\n | \"FAILED\";\n\nexport interface SandboxResources {\n readonly vcpu: number;\n readonly memoryMb: number;\n}\n\nexport interface SandboxResource {\n id: string;\n name: string;\n status: SandboxStatus;\n vpcId: string;\n imageRef: string;\n resources: SandboxResources;\n createdAt: string;\n startedAt?: string;\n endedAt?: string;\n error?: string;\n}\n\nexport interface SandboxRef extends SandboxResource {\n kind: \"inngest/sandbox\";\n version: 1;\n}\n\ninterface SandboxCreateBaseOptions {\n /**\n * Stable identity for an active sandbox. Creating the same name again with\n * the same configuration returns the existing sandbox. Names are\n * case-sensitive and may contain up to 255 characters.\n */\n name: string;\n\n /**\n * How long to wait for the sandbox to reach RUNNING after Create succeeds.\n *\n * Defaults to 120 seconds. Set this to `false` to return as soon as Create is\n * accepted, with either STARTING or RUNNING status.\n *\n * @example\n * ```ts\n * const sandbox = await inngest.sandboxes.create({\n * ...options,\n * runningTimeout: \"30s\",\n * });\n * ```\n *\n * @example Return immediately without waiting\n * ```ts\n * const sandbox = await inngest.sandboxes.create({\n * ...options,\n * runningTimeout: false,\n * });\n * ```\n */\n runningTimeout?: SandboxDuration | false;\n}\n\nexport interface SandboxCreateFreshOptions extends SandboxCreateBaseOptions {\n vcpu: number;\n memoryMb: number;\n\n /**\n * Literal environment inherited by commands and managed processes. Values\n * are persisted as sandbox configuration. Use `secrets` for workspace secret\n * references. Guest defaults are retained, and operation-specific values\n * override matching keys.\n */\n environment?: Record<string, string>;\n\n /**\n * Exact workspace secret names, each injected under that same environment\n * variable name, e.g. `[\"OPENAI_API_KEY\"]`. Save the secret as OPENAI_API_KEY\n * to make it available under that name. Names are resolved once when\n * creating the sandbox; create retries keep the original secret identities.\n * Archiving and recreating a name affects only new sandboxes. Selected\n * values are fetched at launch with short-lived authorization and inherited\n * by commands and managed processes. Delivered values remain in snapshots.\n * Names must be unique, valid environment keys, and must not overlap with\n * environment. Selection order does not affect sandbox identity.\n */\n secrets?: string[];\n\n snapshotId?: never;\n}\n\nexport interface SandboxCreateFromSnapshotOptions\n extends SandboxCreateBaseOptions {\n snapshotId: string;\n vcpu?: never;\n memoryMb?: never;\n environment?: never;\n secrets?: never;\n}\n\nexport type SandboxCreateOptions =\n | SandboxCreateFreshOptions\n | SandboxCreateFromSnapshotOptions;\n\nexport interface SandboxWaitUntilRunningOptions {\n timeout: SandboxDuration;\n}\n\nexport interface SandboxListOptions {\n cursor?: string;\n limit?: number;\n}\n\nexport interface SandboxPageInfo {\n cursor?: string;\n hasMore: boolean;\n limit: number;\n}\n\nexport interface SandboxListResult<TSandbox = SandboxRef> {\n items: TSandbox[];\n page: SandboxPageInfo;\n fetchedAt: string;\n}\n\n/**\n * A shell command string or an argv array for direct execution.\n *\n * Strings run as `[\"/bin/sh\", \"-c\", command]`. They are passed to the shell\n * unchanged, so normal shell quoting, variables, pipes, redirects, and\n * chaining apply. Arrays bypass the shell and must begin with an absolute\n * executable path.\n */\nexport type SandboxCommand = string | readonly string[];\n\nexport interface SandboxCommandOptions {\n /**\n * Overrides matching sandbox environment values for this command.\n * Omitted or empty inherits the sandbox environment unchanged.\n */\n environment?: Record<string, string>;\n cwd?: string;\n timeout?: SandboxDuration;\n}\n\nexport type SandboxCommandOutputMetadata =\n | {\n truncated: false;\n }\n | {\n truncated: true;\n strategy: \"tail\";\n originalBytes: {\n stdout: number;\n stderr: number;\n };\n retainedBytes: {\n stdout: number;\n stderr: number;\n };\n };\n\nexport interface SandboxCommandResult {\n /**\n * Captured stdout decoded as UTF-8. Invalid or truncated byte sequences are\n * represented by the Unicode replacement character.\n */\n stdout: string;\n /**\n * Captured stderr decoded as UTF-8. Invalid or truncated byte sequences are\n * represented by the Unicode replacement character.\n */\n stderr: string;\n exitCode: number;\n output: SandboxCommandOutputMetadata;\n}\n\nexport type SandboxDestroyResult =\n | {\n status: \"TERMINATING\";\n sandbox: SandboxRef;\n }\n | {\n status: \"TERMINATED\";\n sandbox: null;\n };\n\nexport type SandboxProcessState =\n | \"STARTING\"\n | \"RUNNING\"\n | \"EXITED\"\n | \"KILLED\"\n | \"FAILED\"\n | \"LOST\";\n\nexport interface SandboxProcessResource {\n id: string;\n command: readonly string[];\n pid?: number;\n state: SandboxProcessState;\n exitCode?: number;\n terminationSignal?: number;\n startedAt?: string;\n endedAt?: string;\n}\n\nexport interface SandboxProcessRef extends SandboxProcessResource {\n kind: \"inngest/sandbox.process\";\n version: 1;\n sandboxId: string;\n}\n\nexport interface SandboxProcessStartOptions {\n command: SandboxCommand;\n\n /**\n * Overrides matching sandbox environment values for this process.\n * Omitted or empty inherits the sandbox environment unchanged.\n */\n environment?: Record<string, string>;\n cwd?: string;\n}\n\nexport interface SandboxProcessSignalOptions {\n signal: number;\n /**\n * Also signal the process's descendants. Defaults to `true` so shell-backed\n * commands do not leave their child processes running.\n */\n includeChildren?: boolean;\n}\n\nexport interface SandboxProcessWaitOptions {\n timeout?: SandboxDuration;\n}\n\nexport interface SandboxProcessOutputOptions {\n tailBytes?: number;\n}\n\nexport type SandboxProcessListOptions = SandboxListOptions;\nexport type SandboxProcessListResult<TProcess = SandboxProcessRef> =\n SandboxListResult<TProcess>;\n\nexport interface SandboxOutputChunk {\n stream: \"STDOUT\" | \"STDERR\";\n data: Uint8Array;\n at?: string;\n}\n\nexport interface SandboxProcessOutput {\n chunks: SandboxOutputChunk[];\n}\n\nexport interface SandboxLogStreamOptions {\n follow?: boolean;\n}\n\nexport interface SandboxFileUploadOptions {\n path: string;\n data: BodyInit;\n mode?: number;\n}\n\nexport interface SandboxFileUploadResult {\n path: string;\n bytesWritten: number;\n}\n\nexport interface SandboxFileDownloadOptions {\n path: string;\n}\n\nexport type SandboxSnapshotStatus =\n | \"CREATING\"\n | \"READY\"\n | \"DELETING\"\n | \"DELETED\"\n | \"FAILED\"\n | \"LOST\";\n\nexport interface SandboxSnapshotResource {\n id: string;\n /**\n * The name given when the snapshot was created, if any.\n */\n name?: string;\n sourceImageId: string;\n status: SandboxSnapshotStatus;\n compatibilityId?: string;\n resources: SandboxResources;\n memoryPackCount: number;\n diskPackCount: number;\n storedBytes: number;\n createdAt: string;\n updatedAt: string;\n expiresAt: string;\n error?: string;\n}\n\nexport interface SandboxSnapshotRef extends SandboxSnapshotResource {\n kind: \"inngest/sandbox.snapshot\";\n version: 1;\n}\n\nexport interface SandboxSnapshotWaitOptions {\n timeout: SandboxDuration;\n}\n\nexport interface SandboxLifecycleOptions {\n timeout?: SandboxDuration;\n signal?: AbortSignal;\n}\n\nexport interface SandboxSnapshotCreateOptions {\n /**\n * Optional name for the snapshot. A name is held by at most one CREATING or\n * unexpired READY snapshot at a time; creating another snapshot with a held\n * name fails with `sandbox_snapshot_name_taken`. Names follow the same rules\n * as sandbox names: case-sensitive, up to 255 characters, no control\n * characters, and no leading or trailing whitespace.\n */\n name?: string;\n}\n\nexport interface SandboxSnapshotCloneOptions {\n name: string;\n runningTimeout?: SandboxDuration;\n}\n\nexport interface SandboxSnapshotListOptions extends SandboxListOptions {\n /**\n * Only return snapshots with exactly this name, newest first.\n */\n name?: string;\n}\nexport type SandboxSnapshotListResult<TSnapshot = SandboxSnapshotRef> =\n SandboxListResult<TSnapshot>;\n\nexport type SandboxAction =\n | \"create\"\n | \"list\"\n | \"get\"\n | \"waitUntilRunning\"\n | \"exec\"\n | \"destroy\"\n | \"pause\"\n | \"resume\"\n | \"process.start\"\n | \"process.list\"\n | \"process.get\"\n | \"process.signal\"\n | \"process.wait\"\n | \"process.output\"\n | \"process.stream\"\n | \"logs.stream\"\n | \"file.upload\"\n | \"file.download\"\n | \"snapshot.create\"\n | \"snapshot.list\"\n | \"snapshot.get\"\n | \"snapshot.waitUntilReady\"\n | \"snapshot.delete\";\n\nexport type SandboxErrorCode =\n | \"access_denied\"\n | \"compute_unavailable\"\n | \"internal_error\"\n | \"invalid_field_format\"\n | \"invalid_request\"\n | \"missing_field\"\n | \"operation_ambiguous\"\n | \"rate_limited\"\n | \"sandbox_exec_output_too_large\"\n | \"sandbox_exec_timed_out\"\n | \"sandbox_name_taken\"\n | \"sandbox_not_found\"\n | \"sandbox_start_failed\"\n | \"sandbox_start_timed_out\"\n | \"sandbox_process_not_found\"\n | \"sandbox_process_output_not_retained\"\n | \"sandbox_process_wait_timed_out\"\n | \"sandbox_snapshot_limit_exceeded\"\n | \"sandbox_snapshot_name_taken\"\n | \"sandbox_snapshot_not_found\"\n | \"sandbox_snapshot_not_ready\"\n | \"sandbox_snapshot_wait_timed_out\"\n | (string & {});\n\nexport type SandboxErrorDetail = Record<string, unknown>;\n\nexport interface SandboxErrorOptions {\n action: SandboxAction;\n code: SandboxErrorCode;\n message: string;\n status?: number;\n sandboxId?: string;\n processId?: string;\n snapshotId?: string;\n ambiguous?: boolean;\n retryable?: boolean;\n requestId?: string;\n details?: readonly SandboxErrorDetail[];\n cause?: unknown;\n}\n\nexport class SandboxValidationError extends Error {\n public override readonly cause?: unknown;\n\n constructor(message: string, options?: { cause?: unknown }) {\n super(message);\n this.name = \"SandboxValidationError\";\n this.cause = options?.cause;\n }\n}\n\nexport class SandboxError extends Error {\n public readonly protocolVersion = sandboxProtocolVersion;\n public readonly action: SandboxAction;\n public readonly code: SandboxErrorCode;\n public readonly status?: number;\n public readonly sandboxId?: string;\n public readonly processId?: string;\n public readonly snapshotId?: string;\n public readonly ambiguous: boolean;\n public readonly retryable: boolean;\n public readonly requestId?: string;\n public readonly details: readonly SandboxErrorDetail[];\n public override readonly cause?: unknown;\n\n constructor(options: SandboxErrorOptions) {\n super(options.message);\n this.name = \"SandboxError\";\n this.action = options.action;\n this.code = options.code;\n this.status = options.status;\n this.sandboxId = options.sandboxId;\n this.processId = options.processId;\n this.snapshotId = options.snapshotId;\n this.ambiguous =\n options.ambiguous ?? options.code === \"operation_ambiguous\";\n this.retryable = options.retryable ?? false;\n this.requestId = options.requestId;\n this.details = options.details ?? [];\n this.cause = options.cause;\n }\n}\n\nexport interface Sandbox {\n readonly kind: \"inngest/sandbox\";\n readonly version: 1;\n readonly id: string;\n readonly name: string;\n readonly status: SandboxStatus;\n readonly vpcId: string;\n readonly imageRef: string;\n readonly resources: SandboxResources;\n readonly createdAt: string;\n readonly startedAt?: string;\n readonly endedAt?: string;\n readonly error?: string;\n readonly commands: {\n run(\n command: SandboxCommand,\n options?: SandboxCommandOptions,\n ): Promise<SandboxCommandResult>;\n };\n readonly logs: {\n stream(\n options?: SandboxLogStreamOptions,\n ): Promise<ReadableStream<SandboxOutputChunk>>;\n };\n readonly files: {\n upload(options: SandboxFileUploadOptions): Promise<SandboxFileUploadResult>;\n download(options: SandboxFileDownloadOptions): Promise<Response>;\n };\n readonly processes: {\n start(options: SandboxProcessStartOptions): Promise<SandboxProcess>;\n list(\n options?: SandboxProcessListOptions,\n ): Promise<SandboxProcessListResult<SandboxProcess>>;\n get(processId: string): Promise<SandboxProcess | null>;\n };\n waitUntilRunning(options: SandboxWaitUntilRunningOptions): Promise<Sandbox>;\n pause(options?: SandboxLifecycleOptions): Promise<Sandbox>;\n resume(options?: SandboxLifecycleOptions): Promise<Sandbox>;\n snapshot(\n options?: SandboxSnapshotCreateOptions,\n waitOptions?: SandboxLifecycleOptions,\n ): Promise<SandboxSnapshot>;\n destroy(): Promise<SandboxDestroyResult>;\n}\n\nexport interface SandboxProcess {\n readonly kind: \"inngest/sandbox.process\";\n readonly version: 1;\n readonly sandboxId: string;\n readonly id: string;\n readonly command: readonly string[];\n readonly pid?: number;\n readonly state: SandboxProcessState;\n readonly exitCode?: number;\n readonly terminationSignal?: number;\n readonly startedAt?: string;\n readonly endedAt?: string;\n signal(options: SandboxProcessSignalOptions): Promise<void>;\n wait(options?: SandboxProcessWaitOptions): Promise<SandboxProcess>;\n getOutput(\n options?: SandboxProcessOutputOptions,\n ): Promise<SandboxProcessOutput>;\n streamOutput(\n options?: SandboxProcessOutputOptions,\n ): Promise<ReadableStream<SandboxOutputChunk>>;\n}\n\nexport interface SandboxSnapshot extends Readonly<SandboxSnapshotRef> {\n clone(\n options: SandboxSnapshotCloneOptions,\n waitOptions?: SandboxLifecycleOptions,\n ): Promise<Sandbox>;\n delete(): Promise<void>;\n}\n\nexport interface SandboxClient {\n create(options: SandboxCreateFreshOptions): Promise<Sandbox>;\n list(options?: SandboxListOptions): Promise<SandboxListResult<Sandbox>>;\n get(sandboxId: string): Promise<Sandbox | null>;\n readonly snapshots: {\n list(\n options?: SandboxSnapshotListOptions,\n ): Promise<SandboxSnapshotListResult<SandboxSnapshot>>;\n get(snapshotId: string): Promise<SandboxSnapshot | null>;\n };\n}\n\nexport interface DurableSandbox {\n readonly kind: \"inngest/sandbox\";\n readonly version: 1;\n readonly id: string;\n readonly name: string;\n readonly status: SandboxStatus;\n readonly vpcId: string;\n readonly imageRef: string;\n readonly resources: SandboxResources;\n readonly createdAt: string;\n readonly startedAt?: string;\n readonly endedAt?: string;\n readonly error?: string;\n readonly commands: {\n run(\n idOrOptions: StepOptionsOrId,\n command: SandboxCommand,\n options?: SandboxCommandOptions,\n ): Promise<SandboxCommandResult>;\n };\n readonly processes: {\n start(\n idOrOptions: StepOptionsOrId,\n options: SandboxProcessStartOptions,\n ): Promise<DurableSandboxProcess>;\n list(\n idOrOptions: StepOptionsOrId,\n options?: SandboxProcessListOptions,\n ): Promise<SandboxProcessListResult<DurableSandboxProcess>>;\n get(\n idOrOptions: StepOptionsOrId,\n processId: string,\n ): Promise<DurableSandboxProcess | null>;\n };\n readonly snapshots: {\n create(\n idOrOptions: StepOptionsOrId,\n options?: SandboxSnapshotCreateOptions,\n waitOptions?: SandboxLifecycleOptions,\n ): Promise<DurableSandboxSnapshot>;\n };\n snapshot(\n idOrOptions: StepOptionsOrId,\n options?: SandboxSnapshotCreateOptions,\n waitOptions?: SandboxLifecycleOptions,\n ): Promise<DurableSandboxSnapshot>;\n pause(\n idOrOptions: StepOptionsOrId,\n options?: SandboxLifecycleOptions,\n ): Promise<DurableSandbox>;\n resume(\n idOrOptions: StepOptionsOrId,\n options?: SandboxLifecycleOptions,\n ): Promise<DurableSandbox>;\n waitUntilRunning(\n idOrOptions: StepOptionsOrId,\n options: SandboxWaitUntilRunningOptions,\n ): Promise<DurableSandbox>;\n destroy(idOrOptions: StepOptionsOrId): Promise<SandboxDestroyResult>;\n}\n\nexport interface DurableSandboxSnapshot {\n readonly kind: \"inngest/sandbox.snapshot\";\n readonly version: 1;\n readonly id: string;\n readonly name?: string;\n readonly sourceImageId: string;\n readonly status: SandboxSnapshotStatus;\n readonly compatibilityId?: string;\n readonly resources: SandboxResources;\n readonly memoryPackCount: number;\n readonly diskPackCount: number;\n readonly storedBytes: number;\n readonly createdAt: string;\n readonly updatedAt: string;\n readonly expiresAt: string;\n readonly error?: string;\n waitUntilReady(\n idOrOptions: StepOptionsOrId,\n options: SandboxSnapshotWaitOptions,\n ): Promise<DurableSandboxSnapshot>;\n delete(idOrOptions: StepOptionsOrId): Promise<void>;\n clone(\n idOrOptions: StepOptionsOrId,\n options: SandboxSnapshotCloneOptions,\n waitOptions?: SandboxLifecycleOptions,\n ): Promise<DurableSandbox>;\n}\n\nexport interface DurableSandboxProcess {\n readonly kind: \"inngest/sandbox.process\";\n readonly version: 1;\n readonly sandboxId: string;\n readonly id: string;\n readonly command: readonly string[];\n readonly pid?: number;\n readonly state: SandboxProcessState;\n readonly exitCode?: number;\n readonly terminationSignal?: number;\n readonly startedAt?: string;\n readonly endedAt?: string;\n signal(\n idOrOptions: StepOptionsOrId,\n options: SandboxProcessSignalOptions,\n ): Promise<void>;\n wait(\n idOrOptions: StepOptionsOrId,\n options?: SandboxProcessWaitOptions,\n ): Promise<DurableSandboxProcess>;\n getOutput(\n idOrOptions: StepOptionsOrId,\n options?: SandboxProcessOutputOptions,\n ): Promise<SandboxProcessOutput>;\n}\n\nexport interface DurableSandboxTools {\n create(\n idOrOptions: StepOptionsOrId,\n options: SandboxCreateOptions,\n ): Promise<DurableSandbox>;\n list(\n idOrOptions: StepOptionsOrId,\n options?: SandboxListOptions,\n ): Promise<SandboxListResult<DurableSandbox>>;\n get(\n idOrOptions: StepOptionsOrId,\n sandboxId: string,\n ): Promise<DurableSandbox | null>;\n readonly snapshots: {\n list(\n idOrOptions: StepOptionsOrId,\n options?: SandboxSnapshotListOptions,\n ): Promise<SandboxSnapshotListResult<DurableSandboxSnapshot>>;\n get(\n idOrOptions: StepOptionsOrId,\n snapshotId: string,\n ): Promise<DurableSandboxSnapshot | null>;\n };\n}\n"],"mappings":";AAGA,MAAa,yBAAyB;AA8ZtC,IAAa,yBAAb,cAA4C,MAAM;CAChD,AAAyB;CAEzB,YAAY,SAAiB,SAA+B;AAC1D,QAAM,QAAQ;AACd,OAAK,OAAO;AACZ,OAAK,QAAQ,SAAS;;;AAI1B,IAAa,eAAb,cAAkC,MAAM;CACtC,AAAgB,kBAAkB;CAClC,AAAgB;CAChB,AAAgB;CAChB,AAAgB;CAChB,AAAgB;CAChB,AAAgB;CAChB,AAAgB;CAChB,AAAgB;CAChB,AAAgB;CAChB,AAAgB;CAChB,AAAgB;CAChB,AAAyB;CAEzB,YAAY,SAA8B;AACxC,QAAM,QAAQ,QAAQ;AACtB,OAAK,OAAO;AACZ,OAAK,SAAS,QAAQ;AACtB,OAAK,OAAO,QAAQ;AACpB,OAAK,SAAS,QAAQ;AACtB,OAAK,YAAY,QAAQ;AACzB,OAAK,YAAY,QAAQ;AACzB,OAAK,aAAa,QAAQ;AAC1B,OAAK,YACH,QAAQ,aAAa,QAAQ,SAAS;AACxC,OAAK,YAAY,QAAQ,aAAa;AACtC,OAAK,YAAY,QAAQ;AACzB,OAAK,UAAU,QAAQ,WAAW,EAAE;AACpC,OAAK,QAAQ,QAAQ"}
1
+ {"version":3,"file":"types.js","names":[],"sources":["../../../src/components/sandbox/types.ts"],"sourcesContent":["import type { DurationLike } from \"../../helpers/temporal.ts\";\nimport type { StepOptionsOrId } from \"../../types.ts\";\n\nexport const sandboxProtocolVersion = 1 as const;\n\nexport type SandboxDuration = number | string | DurationLike;\n\nexport type SandboxStatus =\n | \"PENDING\"\n | \"STARTING\"\n | \"PAUSING\"\n | \"RUNNING\"\n | \"PAUSED\"\n | \"RESUMING\"\n | \"TERMINATING\"\n | \"TERMINATED\"\n | \"FAILED\";\n\nexport interface SandboxResources {\n readonly vcpu: number;\n readonly memoryMb: number;\n}\n\nexport interface SandboxResource {\n id: string;\n name: string;\n status: SandboxStatus;\n vpcId: string;\n imageRef: string;\n resources: SandboxResources;\n createdAt: string;\n startedAt?: string;\n endedAt?: string;\n error?: string;\n}\n\nexport interface SandboxRef extends SandboxResource {\n kind: \"inngest/sandbox\";\n version: 1;\n}\n\ninterface SandboxCreateBaseOptions {\n /**\n * Stable identity for an active sandbox. Creating the same name again with\n * the same configuration returns the existing sandbox. Names are\n * case-sensitive and may contain up to 255 characters.\n */\n name: string;\n\n /**\n * How long to wait for the sandbox to reach RUNNING after Create succeeds.\n *\n * Defaults to 120 seconds. Set this to `false` to return as soon as Create is\n * accepted, with either STARTING or RUNNING status.\n *\n * @example\n * ```ts\n * const sandbox = await inngest.sandboxes.create({\n * ...options,\n * runningTimeout: \"30s\",\n * });\n * ```\n *\n * @example Return immediately without waiting\n * ```ts\n * const sandbox = await inngest.sandboxes.create({\n * ...options,\n * runningTimeout: false,\n * });\n * ```\n */\n runningTimeout?: SandboxDuration | false;\n}\n\nexport interface SandboxCreateFreshOptions extends SandboxCreateBaseOptions {\n vcpu: number;\n memoryMb: number;\n\n /**\n * Literal environment inherited by commands and managed processes. Values\n * are persisted as sandbox configuration. Use `secrets` for workspace secret\n * references. Guest defaults are retained, and operation-specific values\n * override matching keys.\n */\n environment?: Record<string, string>;\n\n /**\n * Exact workspace secret names, each injected under that same environment\n * variable name, e.g. `[\"OPENAI_API_KEY\"]`. Save the secret as OPENAI_API_KEY\n * to make it available under that name. Names are resolved once when\n * creating the sandbox; create retries keep the original secret identities.\n * Archiving and recreating a name affects only new sandboxes. Selected\n * values are fetched at launch with short-lived authorization and inherited\n * by commands and managed processes. Delivered values remain in snapshots.\n * Names must be unique, valid environment keys, and must not overlap with\n * environment. Selection order does not affect sandbox identity.\n */\n secrets?: string[];\n\n snapshotId?: never;\n}\n\nexport interface SandboxCreateFromSnapshotOptions\n extends SandboxCreateBaseOptions {\n snapshotId: string;\n vcpu?: never;\n memoryMb?: never;\n environment?: never;\n secrets?: never;\n}\n\nexport type SandboxCreateOptions =\n | SandboxCreateFreshOptions\n | SandboxCreateFromSnapshotOptions;\n\nexport interface SandboxWaitUntilRunningOptions {\n timeout: SandboxDuration;\n}\n\nexport interface SandboxListOptions {\n cursor?: string;\n limit?: number;\n}\n\nexport interface SandboxPageInfo {\n cursor?: string;\n hasMore: boolean;\n limit: number;\n}\n\nexport interface SandboxListResult<TSandbox = SandboxRef> {\n items: TSandbox[];\n page: SandboxPageInfo;\n fetchedAt: string;\n}\n\n/**\n * A shell command string or an argv array for direct execution.\n *\n * Strings run as `[\"/bin/sh\", \"-c\", command]`. They are passed to the shell\n * unchanged, so normal shell quoting, variables, pipes, redirects, and\n * chaining apply. Arrays bypass the shell and must begin with an absolute\n * executable path.\n */\nexport type SandboxCommand = string | readonly string[];\n\nexport interface SandboxCommandOptions {\n /**\n * Overrides matching sandbox environment values for this command.\n * Omitted or empty inherits the sandbox environment unchanged.\n */\n environment?: Record<string, string>;\n cwd?: string;\n timeout?: SandboxDuration;\n}\n\nexport type SandboxCommandOutputMetadata =\n | {\n truncated: false;\n }\n | {\n truncated: true;\n strategy: \"tail\";\n originalBytes: {\n stdout: number;\n stderr: number;\n };\n retainedBytes: {\n stdout: number;\n stderr: number;\n };\n };\n\nexport interface SandboxCommandResult {\n /**\n * Captured stdout decoded as UTF-8. Invalid or truncated byte sequences are\n * represented by the Unicode replacement character.\n */\n stdout: string;\n /**\n * Captured stderr decoded as UTF-8. Invalid or truncated byte sequences are\n * represented by the Unicode replacement character.\n */\n stderr: string;\n exitCode: number;\n output: SandboxCommandOutputMetadata;\n}\n\nexport type SandboxDestroyResult =\n | {\n status: \"TERMINATING\";\n sandbox: SandboxRef;\n }\n | {\n status: \"TERMINATED\";\n sandbox: null;\n };\n\nexport type SandboxProcessState =\n | \"STARTING\"\n | \"RUNNING\"\n | \"EXITED\"\n | \"KILLED\"\n | \"FAILED\"\n | \"LOST\";\n\nexport interface SandboxProcessResource {\n id: string;\n command: readonly string[];\n pid?: number;\n state: SandboxProcessState;\n exitCode?: number;\n terminationSignal?: number;\n startedAt?: string;\n endedAt?: string;\n}\n\nexport interface SandboxProcessRef extends SandboxProcessResource {\n kind: \"inngest/sandbox.process\";\n version: 1;\n sandboxId: string;\n}\n\nexport interface SandboxProcessStartOptions {\n command: SandboxCommand;\n\n /**\n * Overrides matching sandbox environment values for this process.\n * Omitted or empty inherits the sandbox environment unchanged.\n */\n environment?: Record<string, string>;\n cwd?: string;\n}\n\nexport interface SandboxProcessSignalOptions {\n signal: number;\n /**\n * Also signal the process's descendants. Defaults to `true` so shell-backed\n * commands do not leave their child processes running.\n */\n includeChildren?: boolean;\n}\n\nexport interface SandboxProcessWaitOptions {\n timeout?: SandboxDuration;\n}\n\nexport interface SandboxProcessOutputOptions {\n tailBytes?: number;\n}\n\nexport type SandboxProcessListOptions = SandboxListOptions;\nexport type SandboxProcessListResult<TProcess = SandboxProcessRef> =\n SandboxListResult<TProcess>;\n\nexport interface SandboxOutputChunk {\n stream: \"STDOUT\" | \"STDERR\";\n data: Uint8Array;\n at?: string;\n}\n\nexport interface SandboxProcessOutput {\n chunks: SandboxOutputChunk[];\n}\n\nexport interface SandboxLogStreamOptions {\n follow?: boolean;\n}\n\nexport interface SandboxFileUploadOptions {\n path: string;\n data: BodyInit;\n mode?: number;\n}\n\nexport interface SandboxFileUploadResult {\n path: string;\n bytesWritten: number;\n}\n\nexport interface SandboxFileDownloadOptions {\n path: string;\n}\n\nexport type SandboxSnapshotStatus =\n | \"CREATING\"\n | \"READY\"\n | \"DELETING\"\n | \"DELETED\"\n | \"FAILED\"\n | \"LOST\";\n\nexport interface SandboxSnapshotResource {\n id: string;\n /**\n * The name given when the snapshot was created, if any.\n */\n name?: string;\n sourceImageId: string;\n status: SandboxSnapshotStatus;\n compatibilityId?: string;\n resources: SandboxResources;\n memoryPackCount: number;\n diskPackCount: number;\n storedBytes: number;\n createdAt: string;\n updatedAt: string;\n expiresAt: string;\n error?: string;\n}\n\nexport interface SandboxSnapshotRef extends SandboxSnapshotResource {\n kind: \"inngest/sandbox.snapshot\";\n version: 1;\n}\n\nexport interface SandboxSnapshotWaitOptions {\n timeout: SandboxDuration;\n}\n\nexport interface SandboxLifecycleOptions {\n timeout?: SandboxDuration;\n signal?: AbortSignal;\n}\n\nexport interface SandboxSnapshotCreateOptions {\n /**\n * Optional name for the snapshot. A name is held by at most one CREATING or\n * unexpired READY snapshot at a time; creating another snapshot with a held\n * name fails with `sandbox_snapshot_name_taken`. Names follow the same rules\n * as sandbox names: case-sensitive, up to 255 characters, no control\n * characters, and no leading or trailing whitespace.\n */\n name?: string;\n}\n\nexport interface SandboxSnapshotCloneOptions {\n name: string;\n runningTimeout?: SandboxDuration;\n}\n\nexport interface SandboxSnapshotListOptions extends SandboxListOptions {\n /**\n * Only return snapshots with exactly this name, newest first.\n */\n name?: string;\n}\nexport type SandboxSnapshotListResult<TSnapshot = SandboxSnapshotRef> =\n SandboxListResult<TSnapshot>;\n\nexport type SandboxAction =\n | \"create\"\n | \"list\"\n | \"get\"\n | \"waitUntilRunning\"\n | \"exec\"\n | \"destroy\"\n | \"pause\"\n | \"resume\"\n | \"process.start\"\n | \"process.list\"\n | \"process.get\"\n | \"process.signal\"\n | \"process.wait\"\n | \"process.output\"\n | \"process.stream\"\n | \"logs.stream\"\n | \"file.upload\"\n | \"file.download\"\n | \"snapshot.create\"\n | \"snapshot.list\"\n | \"snapshot.get\"\n | \"snapshot.waitUntilReady\"\n | \"snapshot.delete\";\n\nexport type SandboxErrorCode =\n | \"access_denied\"\n | \"compute_unavailable\"\n | \"internal_error\"\n | \"invalid_field_format\"\n | \"invalid_request\"\n | \"missing_field\"\n | \"operation_ambiguous\"\n | \"rate_limited\"\n | \"sandbox_exec_output_too_large\"\n | \"sandbox_exec_timed_out\"\n | \"sandbox_name_taken\"\n | \"sandbox_not_found\"\n | \"sandbox_start_failed\"\n | \"sandbox_start_timed_out\"\n | \"sandbox_process_not_found\"\n | \"sandbox_process_output_not_retained\"\n | \"sandbox_process_wait_timed_out\"\n | \"sandbox_snapshot_limit_exceeded\"\n | \"sandbox_snapshot_name_taken\"\n | \"sandbox_snapshot_not_found\"\n | \"sandbox_snapshot_not_ready\"\n | \"sandbox_snapshot_wait_timed_out\"\n | (string & {});\n\nexport type SandboxErrorDetail = Record<string, unknown>;\n\nexport interface SandboxErrorOptions {\n action: SandboxAction;\n code: SandboxErrorCode;\n message: string;\n status?: number;\n sandboxId?: string;\n processId?: string;\n snapshotId?: string;\n ambiguous?: boolean;\n retryable?: boolean;\n requestId?: string;\n details?: readonly SandboxErrorDetail[];\n cause?: unknown;\n}\n\nexport class SandboxValidationError extends Error {\n public override readonly cause?: unknown;\n\n constructor(message: string, options?: { cause?: unknown }) {\n super(message);\n this.name = \"SandboxValidationError\";\n this.cause = options?.cause;\n }\n}\n\nexport class SandboxError extends Error {\n public readonly protocolVersion = sandboxProtocolVersion;\n public readonly action: SandboxAction;\n public readonly code: SandboxErrorCode;\n public readonly status?: number;\n public readonly sandboxId?: string;\n public readonly processId?: string;\n public readonly snapshotId?: string;\n public readonly ambiguous: boolean;\n public readonly retryable: boolean;\n public readonly requestId?: string;\n public readonly details: readonly SandboxErrorDetail[];\n public override readonly cause?: unknown;\n\n constructor(options: SandboxErrorOptions) {\n super(options.message);\n this.name = \"SandboxError\";\n this.action = options.action;\n this.code = options.code;\n this.status = options.status;\n this.sandboxId = options.sandboxId;\n this.processId = options.processId;\n this.snapshotId = options.snapshotId;\n this.ambiguous =\n options.ambiguous ?? options.code === \"operation_ambiguous\";\n this.retryable = options.retryable ?? false;\n this.requestId = options.requestId;\n this.details = options.details ?? [];\n this.cause = options.cause;\n }\n}\n\nexport interface Sandbox {\n readonly kind: \"inngest/sandbox\";\n readonly version: 1;\n readonly id: string;\n readonly name: string;\n readonly status: SandboxStatus;\n readonly vpcId: string;\n readonly imageRef: string;\n readonly resources: SandboxResources;\n readonly createdAt: string;\n readonly startedAt?: string;\n readonly endedAt?: string;\n readonly error?: string;\n readonly commands: {\n run(\n command: SandboxCommand,\n options?: SandboxCommandOptions,\n ): Promise<SandboxCommandResult>;\n };\n readonly logs: {\n stream(\n options?: SandboxLogStreamOptions,\n ): Promise<ReadableStream<SandboxOutputChunk>>;\n };\n readonly files: {\n upload(options: SandboxFileUploadOptions): Promise<SandboxFileUploadResult>;\n download(options: SandboxFileDownloadOptions): Promise<Response>;\n };\n readonly processes: {\n start(options: SandboxProcessStartOptions): Promise<SandboxProcess>;\n list(\n options?: SandboxProcessListOptions,\n ): Promise<SandboxProcessListResult<SandboxProcess>>;\n get(processId: string): Promise<SandboxProcess | null>;\n };\n waitUntilRunning(options: SandboxWaitUntilRunningOptions): Promise<Sandbox>;\n pause(options?: SandboxLifecycleOptions): Promise<Sandbox>;\n resume(options?: SandboxLifecycleOptions): Promise<Sandbox>;\n snapshot(\n options?: SandboxSnapshotCreateOptions,\n waitOptions?: SandboxLifecycleOptions,\n ): Promise<SandboxSnapshot>;\n destroy(): Promise<SandboxDestroyResult>;\n}\n\nexport interface SandboxProcess {\n readonly kind: \"inngest/sandbox.process\";\n readonly version: 1;\n readonly sandboxId: string;\n readonly id: string;\n readonly command: readonly string[];\n readonly pid?: number;\n readonly state: SandboxProcessState;\n readonly exitCode?: number;\n readonly terminationSignal?: number;\n readonly startedAt?: string;\n readonly endedAt?: string;\n signal(options: SandboxProcessSignalOptions): Promise<void>;\n wait(options?: SandboxProcessWaitOptions): Promise<SandboxProcess>;\n getOutput(\n options?: SandboxProcessOutputOptions,\n ): Promise<SandboxProcessOutput>;\n streamOutput(\n options?: SandboxProcessOutputOptions,\n ): Promise<ReadableStream<SandboxOutputChunk>>;\n}\n\nexport interface SandboxSnapshot extends Readonly<SandboxSnapshotRef> {\n clone(\n options: SandboxSnapshotCloneOptions,\n waitOptions?: SandboxLifecycleOptions,\n ): Promise<Sandbox>;\n delete(): Promise<void>;\n}\n\nexport interface SandboxClient {\n create(options: SandboxCreateFreshOptions): Promise<Sandbox>;\n list(options?: SandboxListOptions): Promise<SandboxListResult<Sandbox>>;\n get(sandboxId: string): Promise<Sandbox | null>;\n readonly snapshots: {\n list(\n options?: SandboxSnapshotListOptions,\n ): Promise<SandboxSnapshotListResult<SandboxSnapshot>>;\n get(snapshotId: string): Promise<SandboxSnapshot | null>;\n };\n}\n\nexport interface DurableSandbox {\n readonly kind: \"inngest/sandbox\";\n readonly version: 1;\n readonly id: string;\n readonly name: string;\n readonly status: SandboxStatus;\n readonly vpcId: string;\n readonly imageRef: string;\n readonly resources: SandboxResources;\n readonly createdAt: string;\n readonly startedAt?: string;\n readonly endedAt?: string;\n readonly error?: string;\n readonly commands: {\n run(\n idOrOptions: StepOptionsOrId,\n command: SandboxCommand,\n options?: SandboxCommandOptions,\n ): Promise<SandboxCommandResult>;\n };\n readonly processes: {\n start(\n idOrOptions: StepOptionsOrId,\n options: SandboxProcessStartOptions,\n ): Promise<DurableSandboxProcess>;\n list(\n idOrOptions: StepOptionsOrId,\n options?: SandboxProcessListOptions,\n ): Promise<SandboxProcessListResult<DurableSandboxProcess>>;\n get(\n idOrOptions: StepOptionsOrId,\n processId: string,\n ): Promise<DurableSandboxProcess | null>;\n };\n readonly snapshots: {\n create(\n idOrOptions: StepOptionsOrId,\n options?: SandboxSnapshotCreateOptions,\n waitOptions?: SandboxLifecycleOptions,\n ): Promise<DurableSandboxSnapshot>;\n };\n snapshot(\n idOrOptions: StepOptionsOrId,\n options?: SandboxSnapshotCreateOptions,\n waitOptions?: SandboxLifecycleOptions,\n ): Promise<DurableSandboxSnapshot>;\n pause(\n idOrOptions: StepOptionsOrId,\n options?: SandboxLifecycleOptions,\n ): Promise<DurableSandbox>;\n resume(\n idOrOptions: StepOptionsOrId,\n options?: SandboxLifecycleOptions,\n ): Promise<DurableSandbox>;\n waitUntilRunning(\n idOrOptions: StepOptionsOrId,\n options: SandboxWaitUntilRunningOptions,\n ): Promise<DurableSandbox>;\n destroy(idOrOptions: StepOptionsOrId): Promise<SandboxDestroyResult>;\n}\n\nexport interface DurableSandboxSnapshot {\n readonly kind: \"inngest/sandbox.snapshot\";\n readonly version: 1;\n readonly id: string;\n readonly name?: string;\n readonly sourceImageId: string;\n readonly status: SandboxSnapshotStatus;\n readonly compatibilityId?: string;\n readonly resources: SandboxResources;\n readonly memoryPackCount: number;\n readonly diskPackCount: number;\n readonly storedBytes: number;\n readonly createdAt: string;\n readonly updatedAt: string;\n readonly expiresAt: string;\n readonly error?: string;\n waitUntilReady(\n idOrOptions: StepOptionsOrId,\n options: SandboxSnapshotWaitOptions,\n ): Promise<DurableSandboxSnapshot>;\n delete(idOrOptions: StepOptionsOrId): Promise<void>;\n clone(\n idOrOptions: StepOptionsOrId,\n options: SandboxSnapshotCloneOptions,\n waitOptions?: SandboxLifecycleOptions,\n ): Promise<DurableSandbox>;\n}\n\nexport interface DurableSandboxProcess {\n readonly kind: \"inngest/sandbox.process\";\n readonly version: 1;\n readonly sandboxId: string;\n readonly id: string;\n readonly command: readonly string[];\n readonly pid?: number;\n readonly state: SandboxProcessState;\n readonly exitCode?: number;\n readonly terminationSignal?: number;\n readonly startedAt?: string;\n readonly endedAt?: string;\n signal(\n idOrOptions: StepOptionsOrId,\n options: SandboxProcessSignalOptions,\n ): Promise<void>;\n wait(\n idOrOptions: StepOptionsOrId,\n options?: SandboxProcessWaitOptions,\n ): Promise<DurableSandboxProcess>;\n getOutput(\n idOrOptions: StepOptionsOrId,\n options?: SandboxProcessOutputOptions,\n ): Promise<SandboxProcessOutput>;\n}\n\nexport interface DurableSandboxTools {\n /**\n * Create a sandbox. With `await using`, the sandbox is destroyed when the\n * scope ends, in a memoized `<id>:destroy` step.\n *\n * Disposing can't see why the scope ended, so it also destroys before a retry.\n */\n create(\n idOrOptions: StepOptionsOrId,\n options: SandboxCreateOptions,\n ): Promise<DurableSandbox & AsyncDisposable>;\n list(\n idOrOptions: StepOptionsOrId,\n options?: SandboxListOptions,\n ): Promise<SandboxListResult<DurableSandbox>>;\n get(\n idOrOptions: StepOptionsOrId,\n sandboxId: string,\n ): Promise<DurableSandbox | null>;\n readonly snapshots: {\n list(\n idOrOptions: StepOptionsOrId,\n options?: SandboxSnapshotListOptions,\n ): Promise<SandboxSnapshotListResult<DurableSandboxSnapshot>>;\n get(\n idOrOptions: StepOptionsOrId,\n snapshotId: string,\n ): Promise<DurableSandboxSnapshot | null>;\n };\n}\n"],"mappings":";AAGA,MAAa,yBAAyB;AA8ZtC,IAAa,yBAAb,cAA4C,MAAM;CAChD,AAAyB;CAEzB,YAAY,SAAiB,SAA+B;AAC1D,QAAM,QAAQ;AACd,OAAK,OAAO;AACZ,OAAK,QAAQ,SAAS;;;AAI1B,IAAa,eAAb,cAAkC,MAAM;CACtC,AAAgB,kBAAkB;CAClC,AAAgB;CAChB,AAAgB;CAChB,AAAgB;CAChB,AAAgB;CAChB,AAAgB;CAChB,AAAgB;CAChB,AAAgB;CAChB,AAAgB;CAChB,AAAgB;CAChB,AAAgB;CAChB,AAAyB;CAEzB,YAAY,SAA8B;AACxC,QAAM,QAAQ,QAAQ;AACtB,OAAK,OAAO;AACZ,OAAK,SAAS,QAAQ;AACtB,OAAK,OAAO,QAAQ;AACpB,OAAK,SAAS,QAAQ;AACtB,OAAK,YAAY,QAAQ;AACzB,OAAK,YAAY,QAAQ;AACzB,OAAK,aAAa,QAAQ;AAC1B,OAAK,YACH,QAAQ,aAAa,QAAQ,SAAS;AACxC,OAAK,YAAY,QAAQ,aAAa;AACtC,OAAK,YAAY,QAAQ;AACzB,OAAK,UAAU,QAAQ,WAAW,EAAE;AACpC,OAAK,QAAQ,QAAQ"}
@@ -1,9 +1,7 @@
1
1
  const require_rolldown_runtime = require('../../_virtual/rolldown_runtime.cjs');
2
- const require_temporal = require('../../helpers/temporal.cjs');
3
2
  const require_types = require('./types.cjs');
3
+ const require_duration = require('../../helpers/duration.cjs');
4
4
  let zod_v3 = require("zod/v3");
5
- let ms = require("ms");
6
- ms = require_rolldown_runtime.__toESM(ms);
7
5
 
8
6
  //#region src/components/sandbox/validation.ts
9
7
  const maxSandboxProcessTimeoutMs = 300 * 1e3;
@@ -412,13 +410,11 @@ const normalizeSandboxProcessOutputOptions = (options = {}) => {
412
410
  };
413
411
  const normalizeDurationMs = (duration, maximumMs, context) => {
414
412
  let milliseconds;
415
- if (typeof duration === "number") milliseconds = duration;
416
- else if (typeof duration === "string") milliseconds = (0, ms.default)(duration);
417
- else if (require_temporal.isTemporalDuration(duration)) {
418
- if (duration.years || duration.months || duration.weeks) throw new require_types.SandboxValidationError(`${context} cannot contain calendar years, months, or weeks`);
419
- milliseconds = duration.total({ unit: "milliseconds" });
413
+ try {
414
+ milliseconds = require_duration.durationToMs(duration, { name: context });
415
+ } catch (error) {
416
+ throw new require_types.SandboxValidationError(error instanceof Error ? error.message : String(error), { cause: error });
420
417
  }
421
- if (typeof milliseconds !== "number" || !Number.isFinite(milliseconds) || !Number.isSafeInteger(milliseconds) || milliseconds <= 0) throw new require_types.SandboxValidationError(`${context} must be a positive, whole number of milliseconds`);
422
418
  if (milliseconds > maximumMs) throw new require_types.SandboxValidationError(`${context} must not exceed ${maximumMs} milliseconds`);
423
419
  return milliseconds;
424
420
  };
@@ -1 +1 @@
1
- {"version":3,"file":"validation.cjs","names":["z","SandboxValidationError","milliseconds: number | undefined","isTemporalDuration"],"sources":["../../../src/components/sandbox/validation.ts"],"sourcesContent":["import ms, { type StringValue } from \"ms\";\nimport { z } from \"zod/v3\";\n\nimport { isTemporalDuration } from \"../../helpers/temporal.ts\";\nimport {\n type SandboxCommand,\n type SandboxCommandOptions,\n type SandboxCreateOptions,\n type SandboxDuration,\n type SandboxFileDownloadOptions,\n type SandboxFileUploadOptions,\n type SandboxListOptions,\n type SandboxOutputChunk,\n type SandboxProcessOutputOptions,\n type SandboxProcessRef,\n type SandboxProcessSignalOptions,\n type SandboxProcessStartOptions,\n type SandboxProcessWaitOptions,\n type SandboxRef,\n type SandboxSnapshotCreateOptions,\n type SandboxSnapshotListOptions,\n type SandboxSnapshotRef,\n type SandboxSnapshotWaitOptions,\n SandboxValidationError,\n type SandboxWaitUntilRunningOptions,\n} from \"./types.ts\";\n\nexport const maxSandboxProcessTimeoutMs = 5 * 60 * 1_000;\nexport const defaultSandboxProcessTimeoutMs = 30 * 1_000;\nexport const maxSandboxRunningTimeoutMs = 5 * 60 * 1_000;\nexport const defaultSandboxRunningTimeoutMs = 120 * 1_000;\nexport const maxSandboxSnapshotWaitTimeoutMs = 5 * 60 * 1_000;\nexport const maxSandboxProcessTailBytes = 512 * 1_024;\n\nconst maxProcessArgvCount = 128;\nconst maxProcessArgvBytes = 32 * 1_024;\nconst maxProcessEnvCount = 256;\nconst maxProcessEnvBytes = 64 * 1_024;\nconst maxProcessCwdBytes = 4_096;\nconst maxProcessWireBytes = 96 * 1_024;\nconst maxSandboxNameCharacters = 255;\nconst sandboxNameControlCharacterPattern = /\\p{Cc}/u;\nconst sandboxNameEdgeWhitespacePattern = /^\\p{White_Space}|\\p{White_Space}$/u;\nconst textEncoder = new TextEncoder();\n\nexport const sandboxSecretNameSchema = z.string().superRefine((name, ctx) => {\n if (\n name.length === 0 ||\n textEncoder.encode(name).byteLength > 256 ||\n sandboxNameEdgeWhitespacePattern.test(name) ||\n /[\\r\\n\\0]/u.test(name)\n ) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message:\n \"must be a nonempty workspace secret name of at most 256 bytes without leading/trailing whitespace, CR, LF, or NUL\",\n });\n }\n});\n\nexport const sandboxNameSchema = z.string().superRefine((name, ctx) => {\n if (name.length === 0) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"must not be empty\",\n });\n } else if ([...name].length > maxSandboxNameCharacters) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `must not exceed ${maxSandboxNameCharacters} characters`,\n });\n }\n if (sandboxNameEdgeWhitespacePattern.test(name)) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"must not contain leading or trailing whitespace\",\n });\n }\n if (sandboxNameControlCharacterPattern.test(name)) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"must not contain control characters\",\n });\n }\n});\n\nconst goJSONBytes = (value: unknown): number => {\n // encoding/json escapes these runes by default. Simcity measures the\n // marshalled ProcessSpec, so mirror Go rather than JSON.stringify exactly.\n const encoded = JSON.stringify(value).replace(\n /[<>&\\u2028\\u2029]/g,\n (character) =>\n `\\\\u${character.charCodeAt(0).toString(16).padStart(4, \"0\")}`,\n );\n return textEncoder.encode(encoded).byteLength;\n};\n\nconst assertNoNul = (value: string, context: string): void => {\n if (value.includes(\"\\0\")) {\n throw new SandboxValidationError(`${context} must not contain NUL`);\n }\n};\n\nconst assertValidUnicode = (value: string, context: string): void => {\n for (let index = 0; index < value.length; index++) {\n const codeUnit = value.charCodeAt(index);\n if (codeUnit >= 0xd800 && codeUnit <= 0xdbff) {\n const next = value.charCodeAt(index + 1);\n if (next < 0xdc00 || next > 0xdfff) {\n throw new SandboxValidationError(\n `${context} must not contain an unpaired surrogate`,\n );\n }\n index++;\n } else if (codeUnit >= 0xdc00 && codeUnit <= 0xdfff) {\n throw new SandboxValidationError(\n `${context} must not contain an unpaired surrogate`,\n );\n }\n }\n};\n\nconst validateSandboxEnvironment = (\n environment: Record<string, string> | undefined,\n): Array<[string, string]> => {\n const entries = Object.entries(environment ?? {});\n if (entries.length > maxProcessEnvCount) {\n throw new SandboxValidationError(\n `environment must not contain more than ${maxProcessEnvCount} entries`,\n );\n }\n let environmentBytes = 0;\n for (const [key, value] of entries) {\n if (!key || key.includes(\"=\")) {\n throw new SandboxValidationError(\n \"environment keys must be nonempty and must not contain '='\",\n );\n }\n assertNoNul(key, `environment key ${key}`);\n assertNoNul(value, `environment.${key}`);\n assertValidUnicode(key, `environment key ${key}`);\n assertValidUnicode(value, `environment.${key}`);\n environmentBytes +=\n textEncoder.encode(key).byteLength +\n 1 +\n textEncoder.encode(value).byteLength;\n }\n if (environmentBytes > maxProcessEnvBytes) {\n throw new SandboxValidationError(\n `environment must not exceed ${maxProcessEnvBytes} bytes`,\n );\n }\n return entries;\n};\n\nexport const canonicalUuidSchema = z\n .string()\n .regex(\n /^[0-9a-f]{8}(?:-[0-9a-f]{4}){3}-[0-9a-f]{12}$/,\n \"must be a canonical lowercase UUID\",\n )\n .refine((value) => value !== \"00000000-0000-0000-0000-000000000000\", {\n message: \"must not be the nil UUID\",\n });\n\nconst timestampSchema = z\n .string()\n .regex(\n /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d{1,9})?(?:Z|[+-]\\d{2}:\\d{2})$/,\n \"must be an RFC3339 timestamp\",\n )\n .refine((value) => Number.isFinite(Date.parse(value)), {\n message: \"must be an RFC3339 timestamp\",\n });\n\n// Sandbox REST responses may use proto3 JSON, which omits zero values and\n// encodes 64-bit integers as decimal strings.\nconst wireUint32Schema = z\n .number()\n .int()\n .nonnegative()\n .max(0xffffffff)\n .default(0);\nconst wireUint64Schema = z\n .union([z.number(), z.string().regex(/^\\d+$/).transform(Number)])\n .pipe(z.number().int().nonnegative().safe())\n .default(0);\n\nexport const sandboxStatusSchema = z.enum([\n \"PENDING\",\n \"STARTING\",\n \"PAUSING\",\n \"RUNNING\",\n \"PAUSED\",\n \"RESUMING\",\n \"TERMINATING\",\n \"TERMINATED\",\n \"FAILED\",\n]);\n\nconst sandboxResourcesSchema = z\n .object({\n vcpu: z.number().int().positive().max(0xffffffff),\n memoryMb: z.number().int().positive().max(0xffffffff),\n })\n .strict();\n\nexport const sandboxResourceSchema = z\n .object({\n id: canonicalUuidSchema,\n name: sandboxNameSchema,\n status: sandboxStatusSchema,\n vpcId: canonicalUuidSchema,\n imageRef: z.string().min(1),\n resources: sandboxResourcesSchema,\n createdAt: timestampSchema,\n startedAt: timestampSchema.optional(),\n endedAt: timestampSchema.optional(),\n error: z.string().min(1).optional(),\n })\n .strict();\n\nconst wireSandboxResourceSchema = sandboxResourceSchema\n .omit({ resources: true, startedAt: true, endedAt: true, error: true })\n .extend({\n resources: sandboxResourcesSchema.strip(),\n startedAt: timestampSchema.nullish(),\n endedAt: timestampSchema.nullish(),\n error: z.string().min(1).nullish(),\n })\n .strip();\n\nexport const sandboxRefSchema = sandboxResourceSchema\n .extend({\n kind: z.literal(\"inngest/sandbox\"),\n version: z.literal(1),\n })\n .strict();\n\nexport const sandboxSnapshotStatusSchema = z.enum([\n \"CREATING\",\n \"READY\",\n \"DELETING\",\n \"DELETED\",\n \"FAILED\",\n \"LOST\",\n]);\n\nconst sandboxSnapshotResourceBaseSchema = z\n .object({\n id: canonicalUuidSchema,\n name: sandboxNameSchema.optional(),\n sourceImageId: z.string().min(1),\n status: sandboxSnapshotStatusSchema,\n compatibilityId: z.string().min(1).optional(),\n resources: sandboxResourcesSchema,\n memoryPackCount: z.number().int().nonnegative().max(0xffffffff),\n diskPackCount: z.number().int().nonnegative().max(0xffffffff),\n storedBytes: z.number().int().nonnegative().safe(),\n createdAt: timestampSchema,\n updatedAt: timestampSchema,\n expiresAt: timestampSchema,\n error: z.string().min(1).optional(),\n })\n .strict();\n\nconst validateSandboxSnapshotResource = (\n snapshot: {\n status: z.infer<typeof sandboxSnapshotStatusSchema>;\n compatibilityId?: string;\n sourceImageId: string;\n },\n ctx: z.RefinementCtx,\n): void => {\n if (snapshot.status === \"READY\" && snapshot.compatibilityId === undefined) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"compatibilityId is required for READY snapshots\",\n path: [\"compatibilityId\"],\n });\n }\n if (\n snapshot.status === \"READY\" &&\n !/^[a-f0-9]{64}$/.test(snapshot.sourceImageId)\n ) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message:\n \"Source image ID must be a lowercase SHA-256 for READY snapshots\",\n path: [\"sourceImageId\"],\n });\n }\n};\n\nexport const sandboxSnapshotResourceSchema =\n sandboxSnapshotResourceBaseSchema.superRefine(\n validateSandboxSnapshotResource,\n );\n\nconst wireSandboxSnapshotResourceSchema = sandboxSnapshotResourceBaseSchema\n .omit({ name: true, resources: true, error: true })\n .extend({\n // Unnamed snapshots may omit the name, send null, or send \"\".\n name: z.union([z.literal(\"\"), sandboxNameSchema]).nullish(),\n resources: sandboxResourcesSchema.strip(),\n memoryPackCount: wireUint32Schema,\n diskPackCount: wireUint32Schema,\n storedBytes: wireUint64Schema,\n error: z.string().min(1).nullish(),\n })\n .strip()\n .superRefine(validateSandboxSnapshotResource);\n\nexport const sandboxSnapshotRefSchema = sandboxSnapshotResourceBaseSchema\n .extend({\n kind: z.literal(\"inngest/sandbox.snapshot\"),\n version: z.literal(1),\n })\n .strict()\n .superRefine(validateSandboxSnapshotResource);\n\nexport const sandboxProcessStateSchema = z.enum([\n \"STARTING\",\n \"RUNNING\",\n \"EXITED\",\n \"KILLED\",\n \"FAILED\",\n \"LOST\",\n]);\n\nconst sandboxProcessResourceShape = {\n id: canonicalUuidSchema,\n command: z.array(z.string()).min(1).max(maxProcessArgvCount),\n pid: z.number().int().positive().max(0x7fffffff).optional(),\n state: sandboxProcessStateSchema,\n exitCode: z.number().int().min(-0x80000000).max(0x7fffffff).optional(),\n terminationSignal: z.number().int().min(1).max(64).optional(),\n startedAt: timestampSchema.optional(),\n endedAt: timestampSchema.optional(),\n};\n\nconst validateSandboxProcessResource = (\n process: z.infer<z.ZodObject<typeof sandboxProcessResourceShape>>,\n ctx: z.RefinementCtx,\n): void => {\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 path: [\"exitCode\"],\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 path: [\"terminationSignal\"],\n });\n }\n};\n\nexport const sandboxProcessResourceSchema = z\n .object(sandboxProcessResourceShape)\n .strict()\n .superRefine(validateSandboxProcessResource);\n\nconst wireSandboxProcessResourceSchema = z\n .object(sandboxProcessResourceShape)\n .strip()\n .superRefine(validateSandboxProcessResource);\n\nexport const sandboxProcessRefSchema = z\n .object({\n kind: z.literal(\"inngest/sandbox.process\"),\n version: z.literal(1),\n sandboxId: canonicalUuidSchema,\n id: canonicalUuidSchema,\n command: z.array(z.string()).min(1).max(maxProcessArgvCount),\n pid: z.number().int().positive().max(0x7fffffff).optional(),\n state: sandboxProcessStateSchema,\n exitCode: z.number().int().min(-0x80000000).max(0x7fffffff).optional(),\n terminationSignal: z.number().int().min(1).max(64).optional(),\n startedAt: timestampSchema.optional(),\n endedAt: timestampSchema.optional(),\n })\n .strict()\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 path: [\"exitCode\"],\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 path: [\"terminationSignal\"],\n });\n }\n });\n\nconst outputChunkShape = {\n stream: z.enum([\"STDOUT\", \"STDERR\"]),\n data: z.string(),\n encoding: z.literal(\"base64\"),\n at: timestampSchema.optional(),\n};\n\nexport const wireOutputChunkSchema = z.object(outputChunkShape).strict();\nexport const restOutputChunkSchema = z\n .object({ ...outputChunkShape, data: z.string().default(\"\") })\n .strip();\n\nconst formatValidationError = (context: string, error: z.ZodError): string => {\n const issue = error.issues[0];\n const path = issue?.path.length ? ` at ${issue.path.join(\".\")}` : \"\";\n return `Invalid ${context}${path}: ${issue?.message ?? \"validation failed\"}`;\n};\n\nexport const parseWithSchema = <T, Input = T>(\n schema: z.ZodType<T, z.ZodTypeDef, Input>,\n value: unknown,\n context: string,\n): T => {\n const parsed = schema.safeParse(value);\n if (!parsed.success) {\n throw new SandboxValidationError(\n formatValidationError(context, parsed.error),\n { cause: parsed.error },\n );\n }\n return parsed.data;\n};\n\nexport const sandboxRefFromResource = (value: unknown): SandboxRef => {\n const resource = parseWithSchema(\n wireSandboxResourceSchema,\n value,\n \"sandbox resource\",\n );\n return {\n kind: \"inngest/sandbox\",\n version: 1,\n id: resource.id,\n name: resource.name,\n status: resource.status,\n vpcId: resource.vpcId,\n imageRef: resource.imageRef,\n resources: resource.resources,\n createdAt: resource.createdAt,\n ...(resource.startedAt != null && { startedAt: resource.startedAt }),\n ...(resource.endedAt != null && { endedAt: resource.endedAt }),\n ...(resource.error != null && { error: resource.error }),\n };\n};\n\nexport const sandboxProcessRefFromResource = (\n sandboxId: string,\n value: unknown,\n): SandboxProcessRef =>\n parseWithSchema(\n sandboxProcessRefSchema,\n {\n kind: \"inngest/sandbox.process\",\n version: 1,\n sandboxId,\n ...parseWithSchema(\n wireSandboxProcessResourceSchema,\n value,\n \"sandbox process resource\",\n ),\n },\n \"sandbox process reference\",\n );\n\nexport const sandboxSnapshotRefFromResource = (\n value: unknown,\n): SandboxSnapshotRef => {\n const resource = parseWithSchema(\n wireSandboxSnapshotResourceSchema,\n value,\n \"sandbox snapshot resource\",\n );\n const { name, error, ...base } = resource;\n return {\n kind: \"inngest/sandbox.snapshot\",\n version: 1,\n ...base,\n ...(name && { name }),\n ...(error != null && { error }),\n };\n};\n\nexport const normalizeSandboxCreateOptions = (\n options: SandboxCreateOptions,\n): Omit<SandboxCreateOptions, \"runningTimeout\"> & {\n runningTimeoutMs: number | false;\n} => {\n const parsed = parseWithSchema(\n z.union([\n z\n .object({\n name: sandboxNameSchema,\n vcpu: z.number().int().positive().max(0xffffffff),\n memoryMb: z.number().int().positive().max(0xffffffff),\n environment: z.record(z.string()).optional(),\n secrets: z.array(sandboxSecretNameSchema).optional(),\n runningTimeout: z.unknown().optional(),\n })\n .strict(),\n z\n .object({\n name: sandboxNameSchema,\n snapshotId: canonicalUuidSchema,\n runningTimeout: z.unknown().optional(),\n })\n .strict(),\n ]),\n options,\n \"sandbox create options\",\n );\n if (\"vcpu\" in parsed) {\n const environment = { ...parsed.environment };\n const selected = new Set<string>();\n for (const name of parsed.secrets ?? []) {\n if (Object.hasOwn(parsed.environment ?? {}, name)) {\n throw new SandboxValidationError(\n \"secrets must not overlap with environment\",\n );\n }\n if (selected.has(name)) {\n throw new SandboxValidationError(\n \"secrets must not contain duplicate names\",\n );\n }\n selected.add(name);\n Object.defineProperty(environment, name, { value: \"\", enumerable: true });\n }\n validateSandboxEnvironment(environment);\n }\n const { runningTimeout, ...create } = parsed;\n return {\n ...create,\n runningTimeoutMs:\n runningTimeout === false\n ? false\n : normalizeDurationMs(\n runningTimeout ?? defaultSandboxRunningTimeoutMs,\n maxSandboxRunningTimeoutMs,\n \"runningTimeout\",\n ),\n };\n};\n\nexport const normalizeSandboxWaitUntilRunningOptions = (\n options: SandboxWaitUntilRunningOptions,\n): { timeoutMs: number } => {\n const parsed = parseWithSchema(\n z.object({ timeout: z.unknown() }).strict(),\n options,\n \"sandbox waitUntilRunning options\",\n );\n return {\n timeoutMs: normalizeDurationMs(\n parsed.timeout,\n maxSandboxRunningTimeoutMs,\n \"timeout\",\n ),\n };\n};\n\nconst sandboxListOptionsSchema = z\n .object({\n cursor: z.string().min(1).optional(),\n limit: z.number().int().min(1).max(250).optional(),\n })\n .strict();\n\nexport const normalizeSandboxListOptions = (\n options: SandboxListOptions = {},\n): Required<Pick<SandboxListOptions, \"limit\">> &\n Pick<SandboxListOptions, \"cursor\"> => {\n const parsed = parseWithSchema(\n sandboxListOptionsSchema,\n options,\n \"sandbox list options\",\n );\n return { ...parsed, limit: parsed.limit ?? 50 };\n};\n\nexport const normalizeSandboxProcessListOptions = normalizeSandboxListOptions;\n\ntype SandboxProcessSpecOptions = SandboxCommandOptions & {\n command: SandboxCommand;\n};\n\nexport const sandboxSnapshotCreateOptionsSchema = z\n .object({ name: sandboxNameSchema.optional() })\n .strict();\n\nexport const normalizeSandboxSnapshotListOptions = (\n options: SandboxSnapshotListOptions = {},\n): Required<Pick<SandboxSnapshotListOptions, \"limit\">> &\n Pick<SandboxSnapshotListOptions, \"cursor\" | \"name\"> => {\n const { name, ...list } = parseWithSchema(\n sandboxListOptionsSchema\n .extend({ name: sandboxNameSchema.optional() })\n .strict(),\n options,\n \"sandbox snapshot list options\",\n );\n\n return {\n ...normalizeSandboxListOptions(list),\n ...(name !== undefined && { name }),\n };\n};\n\nexport const normalizeSandboxSnapshotCreateOptions = (\n options: SandboxSnapshotCreateOptions = {},\n): SandboxSnapshotCreateOptions =>\n parseWithSchema(\n sandboxSnapshotCreateOptionsSchema,\n options,\n \"sandbox snapshot create options\",\n );\n\nexport const normalizeSandboxSnapshotWaitOptions = (\n options: SandboxSnapshotWaitOptions,\n): { timeoutMs: number } => {\n const parsed = parseWithSchema(\n z.object({ timeout: z.unknown() }).strict(),\n options,\n \"sandbox snapshot waitUntilReady options\",\n );\n return {\n timeoutMs: normalizeDurationMs(\n parsed.timeout as SandboxDuration,\n maxSandboxSnapshotWaitTimeoutMs,\n \"timeout\",\n ),\n };\n};\n\nconst normalizeProcessSpec = <\n T extends SandboxProcessSpecOptions | SandboxProcessStartOptions,\n>(\n options: T,\n includeTimeout: boolean,\n): Omit<T, \"command\"> & { command: string[] } => {\n const parsed = parseWithSchema(\n z\n .object({\n command: z.union([\n z.string().min(1, \"command must not be empty\"),\n z.array(z.string()).min(1).max(maxProcessArgvCount),\n ]),\n environment: z.record(z.string()).optional(),\n cwd: z.string().optional(),\n ...(includeTimeout && { timeout: z.unknown().optional() }),\n })\n .strict(),\n options,\n \"sandbox command options\",\n ) as unknown as T;\n\n if (Array.isArray(parsed.command) && !parsed.command[0]) {\n throw new SandboxValidationError(\"command[0] must not be empty\");\n }\n const argv =\n typeof parsed.command === \"string\"\n ? [\"/bin/sh\", \"-c\", parsed.command]\n : parsed.command;\n let argvBytes = 0;\n argv.forEach((argument, index) => {\n const context =\n typeof parsed.command === \"string\" ? \"command\" : `command[${index}]`;\n assertNoNul(argument, context);\n assertValidUnicode(argument, context);\n argvBytes += textEncoder.encode(argument).byteLength;\n });\n if (argvBytes > maxProcessArgvBytes) {\n throw new SandboxValidationError(\n `command must not exceed ${maxProcessArgvBytes} bytes`,\n );\n }\n\n const entries = validateSandboxEnvironment(parsed.environment);\n\n if (parsed.cwd !== undefined) {\n assertNoNul(parsed.cwd, \"cwd\");\n assertValidUnicode(parsed.cwd, \"cwd\");\n if (textEncoder.encode(parsed.cwd).byteLength > maxProcessCwdBytes) {\n throw new SandboxValidationError(\n `cwd must not exceed ${maxProcessCwdBytes} bytes`,\n );\n }\n }\n\n const wireBytes = goJSONBytes({\n argv,\n ...(entries.length > 0 && { env: parsed.environment }),\n ...(parsed.cwd !== undefined && parsed.cwd !== \"\" && { cwd: parsed.cwd }),\n });\n if (wireBytes > maxProcessWireBytes) {\n throw new SandboxValidationError(\n `command, environment, and cwd must not exceed ${maxProcessWireBytes} encoded bytes`,\n );\n }\n return {\n ...parsed,\n command: [...argv],\n } as Omit<T, \"command\"> & { command: string[] };\n};\n\nexport const normalizeSandboxCommandOptions = (\n command: SandboxCommand,\n options: SandboxCommandOptions = {},\n): SandboxCommandOptions & { command: string[]; timeoutMs: number } => {\n const parsed = normalizeProcessSpec({ ...options, command }, true);\n return {\n ...parsed,\n timeoutMs:\n parsed.timeout === undefined\n ? defaultSandboxProcessTimeoutMs\n : normalizeDurationMs(\n parsed.timeout,\n maxSandboxProcessTimeoutMs,\n \"timeout\",\n ),\n };\n};\n\nexport const normalizeSandboxProcessStartOptions = (\n options: SandboxProcessStartOptions,\n): Omit<SandboxProcessStartOptions, \"command\"> & { command: string[] } =>\n normalizeProcessSpec(options, false);\n\nexport const normalizeSandboxProcessSignalOptions = (\n options: SandboxProcessSignalOptions,\n): Required<SandboxProcessSignalOptions> => {\n const parsed = parseWithSchema(\n z\n .object({\n signal: z.number().int().min(1).max(64),\n includeChildren: z.boolean().optional(),\n })\n .strict(),\n options,\n \"sandbox process signal options\",\n );\n return {\n signal: parsed.signal,\n includeChildren: parsed.includeChildren ?? true,\n };\n};\n\nexport const normalizeSandboxProcessWaitOptions = (\n options: SandboxProcessWaitOptions = {},\n): { timeoutMs: number } => {\n const parsed = parseWithSchema(\n z.object({ timeout: z.unknown().optional() }).strict(),\n options,\n \"sandbox process wait options\",\n );\n return {\n timeoutMs:\n parsed.timeout === undefined\n ? defaultSandboxProcessTimeoutMs\n : normalizeDurationMs(\n parsed.timeout,\n maxSandboxProcessTimeoutMs,\n \"timeout\",\n ),\n };\n};\n\nexport const normalizeSandboxProcessOutputOptions = (\n options: SandboxProcessOutputOptions = {},\n): { tailBytes: number } => {\n const parsed = parseWithSchema(\n z\n .object({\n tailBytes: z\n .number()\n .int()\n .min(0)\n .max(maxSandboxProcessTailBytes)\n .optional(),\n })\n .strict(),\n options,\n \"sandbox process output options\",\n );\n return { tailBytes: parsed.tailBytes ?? 0 };\n};\n\nexport const normalizeDurationMs = (\n duration: unknown,\n maximumMs: number,\n context: string,\n): number => {\n let milliseconds: number | undefined;\n if (typeof duration === \"number\") {\n milliseconds = duration;\n } else if (typeof duration === \"string\") {\n milliseconds = ms(duration as StringValue);\n } else if (isTemporalDuration(duration)) {\n if (duration.years || duration.months || duration.weeks) {\n throw new SandboxValidationError(\n `${context} cannot contain calendar years, months, or weeks`,\n );\n }\n milliseconds = duration.total({ unit: \"milliseconds\" });\n }\n if (\n typeof milliseconds !== \"number\" ||\n !Number.isFinite(milliseconds) ||\n !Number.isSafeInteger(milliseconds) ||\n milliseconds <= 0\n ) {\n throw new SandboxValidationError(\n `${context} must be a positive, whole number of milliseconds`,\n );\n }\n if (milliseconds > maximumMs) {\n throw new SandboxValidationError(\n `${context} must not exceed ${maximumMs} milliseconds`,\n );\n }\n return milliseconds;\n};\n\nexport const normalizeFileUploadOptions = (\n options: SandboxFileUploadOptions,\n): SandboxFileUploadOptions => {\n const parsed = parseWithSchema(\n z\n .object({\n path: z.string().min(1),\n data: z.unknown(),\n mode: z.number().int().min(1).max(0o777).optional(),\n })\n .strict(),\n options,\n \"sandbox file upload options\",\n );\n validateFilePath(parsed.path);\n return parsed as SandboxFileUploadOptions;\n};\n\nexport const normalizeFileDownloadOptions = (\n options: SandboxFileDownloadOptions,\n): SandboxFileDownloadOptions => {\n const parsed = parseWithSchema(\n z.object({ path: z.string().min(1) }).strict(),\n options,\n \"sandbox file download options\",\n );\n validateFilePath(parsed.path);\n return parsed;\n};\n\nconst validateFilePath = (path: string): void => {\n assertNoNul(path, \"path\");\n if (!path.startsWith(\"/\")) {\n throw new SandboxValidationError(\"path must be absolute\");\n }\n if (textEncoder.encode(path).byteLength > maxProcessCwdBytes) {\n throw new SandboxValidationError(\n `path must not exceed ${maxProcessCwdBytes} bytes`,\n );\n }\n};\n\nexport const decodeBase64 = (value: string, context: string): Uint8Array => {\n if (\n !/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(\n value,\n )\n ) {\n throw new SandboxValidationError(`${context} is not valid base64`);\n }\n try {\n const binary = globalThis.atob(value);\n const bytes = new Uint8Array(binary.length);\n for (let index = 0; index < binary.length; index++) {\n bytes[index] = binary.charCodeAt(index);\n }\n return bytes;\n } catch (error) {\n throw new SandboxValidationError(`${context} is not valid base64`, {\n cause: error,\n });\n }\n};\n\nexport const decodeUtf8 = (value: Uint8Array): string =>\n new TextDecoder(\"utf-8\", { fatal: false }).decode(value);\n\nexport const encodeBase64 = (value: Uint8Array): string => {\n let binary = \"\";\n const chunkSize = 0x8000;\n for (let offset = 0; offset < value.length; offset += chunkSize) {\n binary += String.fromCharCode(\n ...value.subarray(offset, offset + chunkSize),\n );\n }\n return globalThis.btoa(binary);\n};\n\nexport const decodeOutputChunk = (value: unknown): SandboxOutputChunk => {\n const chunk = parseWithSchema(\n restOutputChunkSchema,\n value,\n \"sandbox output chunk\",\n );\n return {\n stream: chunk.stream,\n data: decodeBase64(chunk.data, \"sandbox output data\"),\n ...(chunk.at !== undefined && { at: chunk.at }),\n };\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"validation.cjs","names":["z","SandboxValidationError","milliseconds: number","durationToMs"],"sources":["../../../src/components/sandbox/validation.ts"],"sourcesContent":["import { z } from \"zod/v3\";\n\nimport { durationToMs } from \"../../helpers/duration.ts\";\nimport {\n type SandboxCommand,\n type SandboxCommandOptions,\n type SandboxCreateOptions,\n type SandboxDuration,\n type SandboxFileDownloadOptions,\n type SandboxFileUploadOptions,\n type SandboxListOptions,\n type SandboxOutputChunk,\n type SandboxProcessOutputOptions,\n type SandboxProcessRef,\n type SandboxProcessSignalOptions,\n type SandboxProcessStartOptions,\n type SandboxProcessWaitOptions,\n type SandboxRef,\n type SandboxSnapshotCreateOptions,\n type SandboxSnapshotListOptions,\n type SandboxSnapshotRef,\n type SandboxSnapshotWaitOptions,\n SandboxValidationError,\n type SandboxWaitUntilRunningOptions,\n} from \"./types.ts\";\n\nexport const maxSandboxProcessTimeoutMs = 5 * 60 * 1_000;\nexport const defaultSandboxProcessTimeoutMs = 30 * 1_000;\nexport const maxSandboxRunningTimeoutMs = 5 * 60 * 1_000;\nexport const defaultSandboxRunningTimeoutMs = 120 * 1_000;\nexport const maxSandboxSnapshotWaitTimeoutMs = 5 * 60 * 1_000;\nexport const maxSandboxProcessTailBytes = 512 * 1_024;\n\nconst maxProcessArgvCount = 128;\nconst maxProcessArgvBytes = 32 * 1_024;\nconst maxProcessEnvCount = 256;\nconst maxProcessEnvBytes = 64 * 1_024;\nconst maxProcessCwdBytes = 4_096;\nconst maxProcessWireBytes = 96 * 1_024;\nconst maxSandboxNameCharacters = 255;\nconst sandboxNameControlCharacterPattern = /\\p{Cc}/u;\nconst sandboxNameEdgeWhitespacePattern = /^\\p{White_Space}|\\p{White_Space}$/u;\nconst textEncoder = new TextEncoder();\n\nexport const sandboxSecretNameSchema = z.string().superRefine((name, ctx) => {\n if (\n name.length === 0 ||\n textEncoder.encode(name).byteLength > 256 ||\n sandboxNameEdgeWhitespacePattern.test(name) ||\n /[\\r\\n\\0]/u.test(name)\n ) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message:\n \"must be a nonempty workspace secret name of at most 256 bytes without leading/trailing whitespace, CR, LF, or NUL\",\n });\n }\n});\n\nexport const sandboxNameSchema = z.string().superRefine((name, ctx) => {\n if (name.length === 0) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"must not be empty\",\n });\n } else if ([...name].length > maxSandboxNameCharacters) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `must not exceed ${maxSandboxNameCharacters} characters`,\n });\n }\n if (sandboxNameEdgeWhitespacePattern.test(name)) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"must not contain leading or trailing whitespace\",\n });\n }\n if (sandboxNameControlCharacterPattern.test(name)) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"must not contain control characters\",\n });\n }\n});\n\nconst goJSONBytes = (value: unknown): number => {\n // encoding/json escapes these runes by default. Simcity measures the\n // marshalled ProcessSpec, so mirror Go rather than JSON.stringify exactly.\n const encoded = JSON.stringify(value).replace(\n /[<>&\\u2028\\u2029]/g,\n (character) =>\n `\\\\u${character.charCodeAt(0).toString(16).padStart(4, \"0\")}`,\n );\n return textEncoder.encode(encoded).byteLength;\n};\n\nconst assertNoNul = (value: string, context: string): void => {\n if (value.includes(\"\\0\")) {\n throw new SandboxValidationError(`${context} must not contain NUL`);\n }\n};\n\nconst assertValidUnicode = (value: string, context: string): void => {\n for (let index = 0; index < value.length; index++) {\n const codeUnit = value.charCodeAt(index);\n if (codeUnit >= 0xd800 && codeUnit <= 0xdbff) {\n const next = value.charCodeAt(index + 1);\n if (next < 0xdc00 || next > 0xdfff) {\n throw new SandboxValidationError(\n `${context} must not contain an unpaired surrogate`,\n );\n }\n index++;\n } else if (codeUnit >= 0xdc00 && codeUnit <= 0xdfff) {\n throw new SandboxValidationError(\n `${context} must not contain an unpaired surrogate`,\n );\n }\n }\n};\n\nconst validateSandboxEnvironment = (\n environment: Record<string, string> | undefined,\n): Array<[string, string]> => {\n const entries = Object.entries(environment ?? {});\n if (entries.length > maxProcessEnvCount) {\n throw new SandboxValidationError(\n `environment must not contain more than ${maxProcessEnvCount} entries`,\n );\n }\n let environmentBytes = 0;\n for (const [key, value] of entries) {\n if (!key || key.includes(\"=\")) {\n throw new SandboxValidationError(\n \"environment keys must be nonempty and must not contain '='\",\n );\n }\n assertNoNul(key, `environment key ${key}`);\n assertNoNul(value, `environment.${key}`);\n assertValidUnicode(key, `environment key ${key}`);\n assertValidUnicode(value, `environment.${key}`);\n environmentBytes +=\n textEncoder.encode(key).byteLength +\n 1 +\n textEncoder.encode(value).byteLength;\n }\n if (environmentBytes > maxProcessEnvBytes) {\n throw new SandboxValidationError(\n `environment must not exceed ${maxProcessEnvBytes} bytes`,\n );\n }\n return entries;\n};\n\nexport const canonicalUuidSchema = z\n .string()\n .regex(\n /^[0-9a-f]{8}(?:-[0-9a-f]{4}){3}-[0-9a-f]{12}$/,\n \"must be a canonical lowercase UUID\",\n )\n .refine((value) => value !== \"00000000-0000-0000-0000-000000000000\", {\n message: \"must not be the nil UUID\",\n });\n\nconst timestampSchema = z\n .string()\n .regex(\n /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d{1,9})?(?:Z|[+-]\\d{2}:\\d{2})$/,\n \"must be an RFC3339 timestamp\",\n )\n .refine((value) => Number.isFinite(Date.parse(value)), {\n message: \"must be an RFC3339 timestamp\",\n });\n\n// Sandbox REST responses may use proto3 JSON, which omits zero values and\n// encodes 64-bit integers as decimal strings.\nconst wireUint32Schema = z\n .number()\n .int()\n .nonnegative()\n .max(0xffffffff)\n .default(0);\nconst wireUint64Schema = z\n .union([z.number(), z.string().regex(/^\\d+$/).transform(Number)])\n .pipe(z.number().int().nonnegative().safe())\n .default(0);\n\nexport const sandboxStatusSchema = z.enum([\n \"PENDING\",\n \"STARTING\",\n \"PAUSING\",\n \"RUNNING\",\n \"PAUSED\",\n \"RESUMING\",\n \"TERMINATING\",\n \"TERMINATED\",\n \"FAILED\",\n]);\n\nconst sandboxResourcesSchema = z\n .object({\n vcpu: z.number().int().positive().max(0xffffffff),\n memoryMb: z.number().int().positive().max(0xffffffff),\n })\n .strict();\n\nexport const sandboxResourceSchema = z\n .object({\n id: canonicalUuidSchema,\n name: sandboxNameSchema,\n status: sandboxStatusSchema,\n vpcId: canonicalUuidSchema,\n imageRef: z.string().min(1),\n resources: sandboxResourcesSchema,\n createdAt: timestampSchema,\n startedAt: timestampSchema.optional(),\n endedAt: timestampSchema.optional(),\n error: z.string().min(1).optional(),\n })\n .strict();\n\nconst wireSandboxResourceSchema = sandboxResourceSchema\n .omit({ resources: true, startedAt: true, endedAt: true, error: true })\n .extend({\n resources: sandboxResourcesSchema.strip(),\n startedAt: timestampSchema.nullish(),\n endedAt: timestampSchema.nullish(),\n error: z.string().min(1).nullish(),\n })\n .strip();\n\nexport const sandboxRefSchema = sandboxResourceSchema\n .extend({\n kind: z.literal(\"inngest/sandbox\"),\n version: z.literal(1),\n })\n .strict();\n\nexport const sandboxSnapshotStatusSchema = z.enum([\n \"CREATING\",\n \"READY\",\n \"DELETING\",\n \"DELETED\",\n \"FAILED\",\n \"LOST\",\n]);\n\nconst sandboxSnapshotResourceBaseSchema = z\n .object({\n id: canonicalUuidSchema,\n name: sandboxNameSchema.optional(),\n sourceImageId: z.string().min(1),\n status: sandboxSnapshotStatusSchema,\n compatibilityId: z.string().min(1).optional(),\n resources: sandboxResourcesSchema,\n memoryPackCount: z.number().int().nonnegative().max(0xffffffff),\n diskPackCount: z.number().int().nonnegative().max(0xffffffff),\n storedBytes: z.number().int().nonnegative().safe(),\n createdAt: timestampSchema,\n updatedAt: timestampSchema,\n expiresAt: timestampSchema,\n error: z.string().min(1).optional(),\n })\n .strict();\n\nconst validateSandboxSnapshotResource = (\n snapshot: {\n status: z.infer<typeof sandboxSnapshotStatusSchema>;\n compatibilityId?: string;\n sourceImageId: string;\n },\n ctx: z.RefinementCtx,\n): void => {\n if (snapshot.status === \"READY\" && snapshot.compatibilityId === undefined) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"compatibilityId is required for READY snapshots\",\n path: [\"compatibilityId\"],\n });\n }\n if (\n snapshot.status === \"READY\" &&\n !/^[a-f0-9]{64}$/.test(snapshot.sourceImageId)\n ) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message:\n \"Source image ID must be a lowercase SHA-256 for READY snapshots\",\n path: [\"sourceImageId\"],\n });\n }\n};\n\nexport const sandboxSnapshotResourceSchema =\n sandboxSnapshotResourceBaseSchema.superRefine(\n validateSandboxSnapshotResource,\n );\n\nconst wireSandboxSnapshotResourceSchema = sandboxSnapshotResourceBaseSchema\n .omit({ name: true, resources: true, error: true })\n .extend({\n // Unnamed snapshots may omit the name, send null, or send \"\".\n name: z.union([z.literal(\"\"), sandboxNameSchema]).nullish(),\n resources: sandboxResourcesSchema.strip(),\n memoryPackCount: wireUint32Schema,\n diskPackCount: wireUint32Schema,\n storedBytes: wireUint64Schema,\n error: z.string().min(1).nullish(),\n })\n .strip()\n .superRefine(validateSandboxSnapshotResource);\n\nexport const sandboxSnapshotRefSchema = sandboxSnapshotResourceBaseSchema\n .extend({\n kind: z.literal(\"inngest/sandbox.snapshot\"),\n version: z.literal(1),\n })\n .strict()\n .superRefine(validateSandboxSnapshotResource);\n\nexport const sandboxProcessStateSchema = z.enum([\n \"STARTING\",\n \"RUNNING\",\n \"EXITED\",\n \"KILLED\",\n \"FAILED\",\n \"LOST\",\n]);\n\nconst sandboxProcessResourceShape = {\n id: canonicalUuidSchema,\n command: z.array(z.string()).min(1).max(maxProcessArgvCount),\n pid: z.number().int().positive().max(0x7fffffff).optional(),\n state: sandboxProcessStateSchema,\n exitCode: z.number().int().min(-0x80000000).max(0x7fffffff).optional(),\n terminationSignal: z.number().int().min(1).max(64).optional(),\n startedAt: timestampSchema.optional(),\n endedAt: timestampSchema.optional(),\n};\n\nconst validateSandboxProcessResource = (\n process: z.infer<z.ZodObject<typeof sandboxProcessResourceShape>>,\n ctx: z.RefinementCtx,\n): void => {\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 path: [\"exitCode\"],\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 path: [\"terminationSignal\"],\n });\n }\n};\n\nexport const sandboxProcessResourceSchema = z\n .object(sandboxProcessResourceShape)\n .strict()\n .superRefine(validateSandboxProcessResource);\n\nconst wireSandboxProcessResourceSchema = z\n .object(sandboxProcessResourceShape)\n .strip()\n .superRefine(validateSandboxProcessResource);\n\nexport const sandboxProcessRefSchema = z\n .object({\n kind: z.literal(\"inngest/sandbox.process\"),\n version: z.literal(1),\n sandboxId: canonicalUuidSchema,\n id: canonicalUuidSchema,\n command: z.array(z.string()).min(1).max(maxProcessArgvCount),\n pid: z.number().int().positive().max(0x7fffffff).optional(),\n state: sandboxProcessStateSchema,\n exitCode: z.number().int().min(-0x80000000).max(0x7fffffff).optional(),\n terminationSignal: z.number().int().min(1).max(64).optional(),\n startedAt: timestampSchema.optional(),\n endedAt: timestampSchema.optional(),\n })\n .strict()\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 path: [\"exitCode\"],\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 path: [\"terminationSignal\"],\n });\n }\n });\n\nconst outputChunkShape = {\n stream: z.enum([\"STDOUT\", \"STDERR\"]),\n data: z.string(),\n encoding: z.literal(\"base64\"),\n at: timestampSchema.optional(),\n};\n\nexport const wireOutputChunkSchema = z.object(outputChunkShape).strict();\nexport const restOutputChunkSchema = z\n .object({ ...outputChunkShape, data: z.string().default(\"\") })\n .strip();\n\nconst formatValidationError = (context: string, error: z.ZodError): string => {\n const issue = error.issues[0];\n const path = issue?.path.length ? ` at ${issue.path.join(\".\")}` : \"\";\n return `Invalid ${context}${path}: ${issue?.message ?? \"validation failed\"}`;\n};\n\nexport const parseWithSchema = <T, Input = T>(\n schema: z.ZodType<T, z.ZodTypeDef, Input>,\n value: unknown,\n context: string,\n): T => {\n const parsed = schema.safeParse(value);\n if (!parsed.success) {\n throw new SandboxValidationError(\n formatValidationError(context, parsed.error),\n { cause: parsed.error },\n );\n }\n return parsed.data;\n};\n\nexport const sandboxRefFromResource = (value: unknown): SandboxRef => {\n const resource = parseWithSchema(\n wireSandboxResourceSchema,\n value,\n \"sandbox resource\",\n );\n return {\n kind: \"inngest/sandbox\",\n version: 1,\n id: resource.id,\n name: resource.name,\n status: resource.status,\n vpcId: resource.vpcId,\n imageRef: resource.imageRef,\n resources: resource.resources,\n createdAt: resource.createdAt,\n ...(resource.startedAt != null && { startedAt: resource.startedAt }),\n ...(resource.endedAt != null && { endedAt: resource.endedAt }),\n ...(resource.error != null && { error: resource.error }),\n };\n};\n\nexport const sandboxProcessRefFromResource = (\n sandboxId: string,\n value: unknown,\n): SandboxProcessRef =>\n parseWithSchema(\n sandboxProcessRefSchema,\n {\n kind: \"inngest/sandbox.process\",\n version: 1,\n sandboxId,\n ...parseWithSchema(\n wireSandboxProcessResourceSchema,\n value,\n \"sandbox process resource\",\n ),\n },\n \"sandbox process reference\",\n );\n\nexport const sandboxSnapshotRefFromResource = (\n value: unknown,\n): SandboxSnapshotRef => {\n const resource = parseWithSchema(\n wireSandboxSnapshotResourceSchema,\n value,\n \"sandbox snapshot resource\",\n );\n const { name, error, ...base } = resource;\n return {\n kind: \"inngest/sandbox.snapshot\",\n version: 1,\n ...base,\n ...(name && { name }),\n ...(error != null && { error }),\n };\n};\n\nexport const normalizeSandboxCreateOptions = (\n options: SandboxCreateOptions,\n): Omit<SandboxCreateOptions, \"runningTimeout\"> & {\n runningTimeoutMs: number | false;\n} => {\n const parsed = parseWithSchema(\n z.union([\n z\n .object({\n name: sandboxNameSchema,\n vcpu: z.number().int().positive().max(0xffffffff),\n memoryMb: z.number().int().positive().max(0xffffffff),\n environment: z.record(z.string()).optional(),\n secrets: z.array(sandboxSecretNameSchema).optional(),\n runningTimeout: z.unknown().optional(),\n })\n .strict(),\n z\n .object({\n name: sandboxNameSchema,\n snapshotId: canonicalUuidSchema,\n runningTimeout: z.unknown().optional(),\n })\n .strict(),\n ]),\n options,\n \"sandbox create options\",\n );\n if (\"vcpu\" in parsed) {\n const environment = { ...parsed.environment };\n const selected = new Set<string>();\n for (const name of parsed.secrets ?? []) {\n if (Object.hasOwn(parsed.environment ?? {}, name)) {\n throw new SandboxValidationError(\n \"secrets must not overlap with environment\",\n );\n }\n if (selected.has(name)) {\n throw new SandboxValidationError(\n \"secrets must not contain duplicate names\",\n );\n }\n selected.add(name);\n Object.defineProperty(environment, name, { value: \"\", enumerable: true });\n }\n validateSandboxEnvironment(environment);\n }\n const { runningTimeout, ...create } = parsed;\n return {\n ...create,\n runningTimeoutMs:\n runningTimeout === false\n ? false\n : normalizeDurationMs(\n runningTimeout ?? defaultSandboxRunningTimeoutMs,\n maxSandboxRunningTimeoutMs,\n \"runningTimeout\",\n ),\n };\n};\n\nexport const normalizeSandboxWaitUntilRunningOptions = (\n options: SandboxWaitUntilRunningOptions,\n): { timeoutMs: number } => {\n const parsed = parseWithSchema(\n z.object({ timeout: z.unknown() }).strict(),\n options,\n \"sandbox waitUntilRunning options\",\n );\n return {\n timeoutMs: normalizeDurationMs(\n parsed.timeout,\n maxSandboxRunningTimeoutMs,\n \"timeout\",\n ),\n };\n};\n\nconst sandboxListOptionsSchema = z\n .object({\n cursor: z.string().min(1).optional(),\n limit: z.number().int().min(1).max(250).optional(),\n })\n .strict();\n\nexport const normalizeSandboxListOptions = (\n options: SandboxListOptions = {},\n): Required<Pick<SandboxListOptions, \"limit\">> &\n Pick<SandboxListOptions, \"cursor\"> => {\n const parsed = parseWithSchema(\n sandboxListOptionsSchema,\n options,\n \"sandbox list options\",\n );\n return { ...parsed, limit: parsed.limit ?? 50 };\n};\n\nexport const normalizeSandboxProcessListOptions = normalizeSandboxListOptions;\n\ntype SandboxProcessSpecOptions = SandboxCommandOptions & {\n command: SandboxCommand;\n};\n\nexport const sandboxSnapshotCreateOptionsSchema = z\n .object({ name: sandboxNameSchema.optional() })\n .strict();\n\nexport const normalizeSandboxSnapshotListOptions = (\n options: SandboxSnapshotListOptions = {},\n): Required<Pick<SandboxSnapshotListOptions, \"limit\">> &\n Pick<SandboxSnapshotListOptions, \"cursor\" | \"name\"> => {\n const { name, ...list } = parseWithSchema(\n sandboxListOptionsSchema\n .extend({ name: sandboxNameSchema.optional() })\n .strict(),\n options,\n \"sandbox snapshot list options\",\n );\n\n return {\n ...normalizeSandboxListOptions(list),\n ...(name !== undefined && { name }),\n };\n};\n\nexport const normalizeSandboxSnapshotCreateOptions = (\n options: SandboxSnapshotCreateOptions = {},\n): SandboxSnapshotCreateOptions =>\n parseWithSchema(\n sandboxSnapshotCreateOptionsSchema,\n options,\n \"sandbox snapshot create options\",\n );\n\nexport const normalizeSandboxSnapshotWaitOptions = (\n options: SandboxSnapshotWaitOptions,\n): { timeoutMs: number } => {\n const parsed = parseWithSchema(\n z.object({ timeout: z.unknown() }).strict(),\n options,\n \"sandbox snapshot waitUntilReady options\",\n );\n return {\n timeoutMs: normalizeDurationMs(\n parsed.timeout as SandboxDuration,\n maxSandboxSnapshotWaitTimeoutMs,\n \"timeout\",\n ),\n };\n};\n\nconst normalizeProcessSpec = <\n T extends SandboxProcessSpecOptions | SandboxProcessStartOptions,\n>(\n options: T,\n includeTimeout: boolean,\n): Omit<T, \"command\"> & { command: string[] } => {\n const parsed = parseWithSchema(\n z\n .object({\n command: z.union([\n z.string().min(1, \"command must not be empty\"),\n z.array(z.string()).min(1).max(maxProcessArgvCount),\n ]),\n environment: z.record(z.string()).optional(),\n cwd: z.string().optional(),\n ...(includeTimeout && { timeout: z.unknown().optional() }),\n })\n .strict(),\n options,\n \"sandbox command options\",\n ) as unknown as T;\n\n if (Array.isArray(parsed.command) && !parsed.command[0]) {\n throw new SandboxValidationError(\"command[0] must not be empty\");\n }\n const argv =\n typeof parsed.command === \"string\"\n ? [\"/bin/sh\", \"-c\", parsed.command]\n : parsed.command;\n let argvBytes = 0;\n argv.forEach((argument, index) => {\n const context =\n typeof parsed.command === \"string\" ? \"command\" : `command[${index}]`;\n assertNoNul(argument, context);\n assertValidUnicode(argument, context);\n argvBytes += textEncoder.encode(argument).byteLength;\n });\n if (argvBytes > maxProcessArgvBytes) {\n throw new SandboxValidationError(\n `command must not exceed ${maxProcessArgvBytes} bytes`,\n );\n }\n\n const entries = validateSandboxEnvironment(parsed.environment);\n\n if (parsed.cwd !== undefined) {\n assertNoNul(parsed.cwd, \"cwd\");\n assertValidUnicode(parsed.cwd, \"cwd\");\n if (textEncoder.encode(parsed.cwd).byteLength > maxProcessCwdBytes) {\n throw new SandboxValidationError(\n `cwd must not exceed ${maxProcessCwdBytes} bytes`,\n );\n }\n }\n\n const wireBytes = goJSONBytes({\n argv,\n ...(entries.length > 0 && { env: parsed.environment }),\n ...(parsed.cwd !== undefined && parsed.cwd !== \"\" && { cwd: parsed.cwd }),\n });\n if (wireBytes > maxProcessWireBytes) {\n throw new SandboxValidationError(\n `command, environment, and cwd must not exceed ${maxProcessWireBytes} encoded bytes`,\n );\n }\n return {\n ...parsed,\n command: [...argv],\n } as Omit<T, \"command\"> & { command: string[] };\n};\n\nexport const normalizeSandboxCommandOptions = (\n command: SandboxCommand,\n options: SandboxCommandOptions = {},\n): SandboxCommandOptions & { command: string[]; timeoutMs: number } => {\n const parsed = normalizeProcessSpec({ ...options, command }, true);\n return {\n ...parsed,\n timeoutMs:\n parsed.timeout === undefined\n ? defaultSandboxProcessTimeoutMs\n : normalizeDurationMs(\n parsed.timeout,\n maxSandboxProcessTimeoutMs,\n \"timeout\",\n ),\n };\n};\n\nexport const normalizeSandboxProcessStartOptions = (\n options: SandboxProcessStartOptions,\n): Omit<SandboxProcessStartOptions, \"command\"> & { command: string[] } =>\n normalizeProcessSpec(options, false);\n\nexport const normalizeSandboxProcessSignalOptions = (\n options: SandboxProcessSignalOptions,\n): Required<SandboxProcessSignalOptions> => {\n const parsed = parseWithSchema(\n z\n .object({\n signal: z.number().int().min(1).max(64),\n includeChildren: z.boolean().optional(),\n })\n .strict(),\n options,\n \"sandbox process signal options\",\n );\n return {\n signal: parsed.signal,\n includeChildren: parsed.includeChildren ?? true,\n };\n};\n\nexport const normalizeSandboxProcessWaitOptions = (\n options: SandboxProcessWaitOptions = {},\n): { timeoutMs: number } => {\n const parsed = parseWithSchema(\n z.object({ timeout: z.unknown().optional() }).strict(),\n options,\n \"sandbox process wait options\",\n );\n return {\n timeoutMs:\n parsed.timeout === undefined\n ? defaultSandboxProcessTimeoutMs\n : normalizeDurationMs(\n parsed.timeout,\n maxSandboxProcessTimeoutMs,\n \"timeout\",\n ),\n };\n};\n\nexport const normalizeSandboxProcessOutputOptions = (\n options: SandboxProcessOutputOptions = {},\n): { tailBytes: number } => {\n const parsed = parseWithSchema(\n z\n .object({\n tailBytes: z\n .number()\n .int()\n .min(0)\n .max(maxSandboxProcessTailBytes)\n .optional(),\n })\n .strict(),\n options,\n \"sandbox process output options\",\n );\n return { tailBytes: parsed.tailBytes ?? 0 };\n};\n\nexport const normalizeDurationMs = (\n duration: unknown,\n maximumMs: number,\n context: string,\n): number => {\n let milliseconds: number;\n try {\n milliseconds = durationToMs(duration, { name: context });\n } catch (error) {\n throw new SandboxValidationError(\n error instanceof Error ? error.message : String(error),\n { cause: error },\n );\n }\n if (milliseconds > maximumMs) {\n throw new SandboxValidationError(\n `${context} must not exceed ${maximumMs} milliseconds`,\n );\n }\n return milliseconds;\n};\n\nexport const normalizeFileUploadOptions = (\n options: SandboxFileUploadOptions,\n): SandboxFileUploadOptions => {\n const parsed = parseWithSchema(\n z\n .object({\n path: z.string().min(1),\n data: z.unknown(),\n mode: z.number().int().min(1).max(0o777).optional(),\n })\n .strict(),\n options,\n \"sandbox file upload options\",\n );\n validateFilePath(parsed.path);\n return parsed as SandboxFileUploadOptions;\n};\n\nexport const normalizeFileDownloadOptions = (\n options: SandboxFileDownloadOptions,\n): SandboxFileDownloadOptions => {\n const parsed = parseWithSchema(\n z.object({ path: z.string().min(1) }).strict(),\n options,\n \"sandbox file download options\",\n );\n validateFilePath(parsed.path);\n return parsed;\n};\n\nconst validateFilePath = (path: string): void => {\n assertNoNul(path, \"path\");\n if (!path.startsWith(\"/\")) {\n throw new SandboxValidationError(\"path must be absolute\");\n }\n if (textEncoder.encode(path).byteLength > maxProcessCwdBytes) {\n throw new SandboxValidationError(\n `path must not exceed ${maxProcessCwdBytes} bytes`,\n );\n }\n};\n\nexport const decodeBase64 = (value: string, context: string): Uint8Array => {\n if (\n !/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(\n value,\n )\n ) {\n throw new SandboxValidationError(`${context} is not valid base64`);\n }\n try {\n const binary = globalThis.atob(value);\n const bytes = new Uint8Array(binary.length);\n for (let index = 0; index < binary.length; index++) {\n bytes[index] = binary.charCodeAt(index);\n }\n return bytes;\n } catch (error) {\n throw new SandboxValidationError(`${context} is not valid base64`, {\n cause: error,\n });\n }\n};\n\nexport const decodeUtf8 = (value: Uint8Array): string =>\n new TextDecoder(\"utf-8\", { fatal: false }).decode(value);\n\nexport const encodeBase64 = (value: Uint8Array): string => {\n let binary = \"\";\n const chunkSize = 0x8000;\n for (let offset = 0; offset < value.length; offset += chunkSize) {\n binary += String.fromCharCode(\n ...value.subarray(offset, offset + chunkSize),\n );\n }\n return globalThis.btoa(binary);\n};\n\nexport const decodeOutputChunk = (value: unknown): SandboxOutputChunk => {\n const chunk = parseWithSchema(\n restOutputChunkSchema,\n value,\n \"sandbox output chunk\",\n );\n return {\n stream: chunk.stream,\n data: decodeBase64(chunk.data, \"sandbox output data\"),\n ...(chunk.at !== undefined && { at: chunk.at }),\n };\n};\n"],"mappings":"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"}
@@ -1,7 +1,6 @@
1
- import { isTemporalDuration } from "../../helpers/temporal.js";
2
1
  import { SandboxValidationError } from "./types.js";
2
+ import { durationToMs } from "../../helpers/duration.js";
3
3
  import { z } from "zod/v3";
4
- import ms from "ms";
5
4
 
6
5
  //#region src/components/sandbox/validation.ts
7
6
  const maxSandboxProcessTimeoutMs = 300 * 1e3;
@@ -410,13 +409,11 @@ const normalizeSandboxProcessOutputOptions = (options = {}) => {
410
409
  };
411
410
  const normalizeDurationMs = (duration, maximumMs, context) => {
412
411
  let milliseconds;
413
- if (typeof duration === "number") milliseconds = duration;
414
- else if (typeof duration === "string") milliseconds = ms(duration);
415
- else if (isTemporalDuration(duration)) {
416
- if (duration.years || duration.months || duration.weeks) throw new SandboxValidationError(`${context} cannot contain calendar years, months, or weeks`);
417
- milliseconds = duration.total({ unit: "milliseconds" });
412
+ try {
413
+ milliseconds = durationToMs(duration, { name: context });
414
+ } catch (error) {
415
+ throw new SandboxValidationError(error instanceof Error ? error.message : String(error), { cause: error });
418
416
  }
419
- if (typeof milliseconds !== "number" || !Number.isFinite(milliseconds) || !Number.isSafeInteger(milliseconds) || milliseconds <= 0) throw new SandboxValidationError(`${context} must be a positive, whole number of milliseconds`);
420
417
  if (milliseconds > maximumMs) throw new SandboxValidationError(`${context} must not exceed ${maximumMs} milliseconds`);
421
418
  return milliseconds;
422
419
  };
@@ -1 +1 @@
1
- {"version":3,"file":"validation.js","names":["milliseconds: number | undefined"],"sources":["../../../src/components/sandbox/validation.ts"],"sourcesContent":["import ms, { type StringValue } from \"ms\";\nimport { z } from \"zod/v3\";\n\nimport { isTemporalDuration } from \"../../helpers/temporal.ts\";\nimport {\n type SandboxCommand,\n type SandboxCommandOptions,\n type SandboxCreateOptions,\n type SandboxDuration,\n type SandboxFileDownloadOptions,\n type SandboxFileUploadOptions,\n type SandboxListOptions,\n type SandboxOutputChunk,\n type SandboxProcessOutputOptions,\n type SandboxProcessRef,\n type SandboxProcessSignalOptions,\n type SandboxProcessStartOptions,\n type SandboxProcessWaitOptions,\n type SandboxRef,\n type SandboxSnapshotCreateOptions,\n type SandboxSnapshotListOptions,\n type SandboxSnapshotRef,\n type SandboxSnapshotWaitOptions,\n SandboxValidationError,\n type SandboxWaitUntilRunningOptions,\n} from \"./types.ts\";\n\nexport const maxSandboxProcessTimeoutMs = 5 * 60 * 1_000;\nexport const defaultSandboxProcessTimeoutMs = 30 * 1_000;\nexport const maxSandboxRunningTimeoutMs = 5 * 60 * 1_000;\nexport const defaultSandboxRunningTimeoutMs = 120 * 1_000;\nexport const maxSandboxSnapshotWaitTimeoutMs = 5 * 60 * 1_000;\nexport const maxSandboxProcessTailBytes = 512 * 1_024;\n\nconst maxProcessArgvCount = 128;\nconst maxProcessArgvBytes = 32 * 1_024;\nconst maxProcessEnvCount = 256;\nconst maxProcessEnvBytes = 64 * 1_024;\nconst maxProcessCwdBytes = 4_096;\nconst maxProcessWireBytes = 96 * 1_024;\nconst maxSandboxNameCharacters = 255;\nconst sandboxNameControlCharacterPattern = /\\p{Cc}/u;\nconst sandboxNameEdgeWhitespacePattern = /^\\p{White_Space}|\\p{White_Space}$/u;\nconst textEncoder = new TextEncoder();\n\nexport const sandboxSecretNameSchema = z.string().superRefine((name, ctx) => {\n if (\n name.length === 0 ||\n textEncoder.encode(name).byteLength > 256 ||\n sandboxNameEdgeWhitespacePattern.test(name) ||\n /[\\r\\n\\0]/u.test(name)\n ) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message:\n \"must be a nonempty workspace secret name of at most 256 bytes without leading/trailing whitespace, CR, LF, or NUL\",\n });\n }\n});\n\nexport const sandboxNameSchema = z.string().superRefine((name, ctx) => {\n if (name.length === 0) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"must not be empty\",\n });\n } else if ([...name].length > maxSandboxNameCharacters) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `must not exceed ${maxSandboxNameCharacters} characters`,\n });\n }\n if (sandboxNameEdgeWhitespacePattern.test(name)) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"must not contain leading or trailing whitespace\",\n });\n }\n if (sandboxNameControlCharacterPattern.test(name)) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"must not contain control characters\",\n });\n }\n});\n\nconst goJSONBytes = (value: unknown): number => {\n // encoding/json escapes these runes by default. Simcity measures the\n // marshalled ProcessSpec, so mirror Go rather than JSON.stringify exactly.\n const encoded = JSON.stringify(value).replace(\n /[<>&\\u2028\\u2029]/g,\n (character) =>\n `\\\\u${character.charCodeAt(0).toString(16).padStart(4, \"0\")}`,\n );\n return textEncoder.encode(encoded).byteLength;\n};\n\nconst assertNoNul = (value: string, context: string): void => {\n if (value.includes(\"\\0\")) {\n throw new SandboxValidationError(`${context} must not contain NUL`);\n }\n};\n\nconst assertValidUnicode = (value: string, context: string): void => {\n for (let index = 0; index < value.length; index++) {\n const codeUnit = value.charCodeAt(index);\n if (codeUnit >= 0xd800 && codeUnit <= 0xdbff) {\n const next = value.charCodeAt(index + 1);\n if (next < 0xdc00 || next > 0xdfff) {\n throw new SandboxValidationError(\n `${context} must not contain an unpaired surrogate`,\n );\n }\n index++;\n } else if (codeUnit >= 0xdc00 && codeUnit <= 0xdfff) {\n throw new SandboxValidationError(\n `${context} must not contain an unpaired surrogate`,\n );\n }\n }\n};\n\nconst validateSandboxEnvironment = (\n environment: Record<string, string> | undefined,\n): Array<[string, string]> => {\n const entries = Object.entries(environment ?? {});\n if (entries.length > maxProcessEnvCount) {\n throw new SandboxValidationError(\n `environment must not contain more than ${maxProcessEnvCount} entries`,\n );\n }\n let environmentBytes = 0;\n for (const [key, value] of entries) {\n if (!key || key.includes(\"=\")) {\n throw new SandboxValidationError(\n \"environment keys must be nonempty and must not contain '='\",\n );\n }\n assertNoNul(key, `environment key ${key}`);\n assertNoNul(value, `environment.${key}`);\n assertValidUnicode(key, `environment key ${key}`);\n assertValidUnicode(value, `environment.${key}`);\n environmentBytes +=\n textEncoder.encode(key).byteLength +\n 1 +\n textEncoder.encode(value).byteLength;\n }\n if (environmentBytes > maxProcessEnvBytes) {\n throw new SandboxValidationError(\n `environment must not exceed ${maxProcessEnvBytes} bytes`,\n );\n }\n return entries;\n};\n\nexport const canonicalUuidSchema = z\n .string()\n .regex(\n /^[0-9a-f]{8}(?:-[0-9a-f]{4}){3}-[0-9a-f]{12}$/,\n \"must be a canonical lowercase UUID\",\n )\n .refine((value) => value !== \"00000000-0000-0000-0000-000000000000\", {\n message: \"must not be the nil UUID\",\n });\n\nconst timestampSchema = z\n .string()\n .regex(\n /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d{1,9})?(?:Z|[+-]\\d{2}:\\d{2})$/,\n \"must be an RFC3339 timestamp\",\n )\n .refine((value) => Number.isFinite(Date.parse(value)), {\n message: \"must be an RFC3339 timestamp\",\n });\n\n// Sandbox REST responses may use proto3 JSON, which omits zero values and\n// encodes 64-bit integers as decimal strings.\nconst wireUint32Schema = z\n .number()\n .int()\n .nonnegative()\n .max(0xffffffff)\n .default(0);\nconst wireUint64Schema = z\n .union([z.number(), z.string().regex(/^\\d+$/).transform(Number)])\n .pipe(z.number().int().nonnegative().safe())\n .default(0);\n\nexport const sandboxStatusSchema = z.enum([\n \"PENDING\",\n \"STARTING\",\n \"PAUSING\",\n \"RUNNING\",\n \"PAUSED\",\n \"RESUMING\",\n \"TERMINATING\",\n \"TERMINATED\",\n \"FAILED\",\n]);\n\nconst sandboxResourcesSchema = z\n .object({\n vcpu: z.number().int().positive().max(0xffffffff),\n memoryMb: z.number().int().positive().max(0xffffffff),\n })\n .strict();\n\nexport const sandboxResourceSchema = z\n .object({\n id: canonicalUuidSchema,\n name: sandboxNameSchema,\n status: sandboxStatusSchema,\n vpcId: canonicalUuidSchema,\n imageRef: z.string().min(1),\n resources: sandboxResourcesSchema,\n createdAt: timestampSchema,\n startedAt: timestampSchema.optional(),\n endedAt: timestampSchema.optional(),\n error: z.string().min(1).optional(),\n })\n .strict();\n\nconst wireSandboxResourceSchema = sandboxResourceSchema\n .omit({ resources: true, startedAt: true, endedAt: true, error: true })\n .extend({\n resources: sandboxResourcesSchema.strip(),\n startedAt: timestampSchema.nullish(),\n endedAt: timestampSchema.nullish(),\n error: z.string().min(1).nullish(),\n })\n .strip();\n\nexport const sandboxRefSchema = sandboxResourceSchema\n .extend({\n kind: z.literal(\"inngest/sandbox\"),\n version: z.literal(1),\n })\n .strict();\n\nexport const sandboxSnapshotStatusSchema = z.enum([\n \"CREATING\",\n \"READY\",\n \"DELETING\",\n \"DELETED\",\n \"FAILED\",\n \"LOST\",\n]);\n\nconst sandboxSnapshotResourceBaseSchema = z\n .object({\n id: canonicalUuidSchema,\n name: sandboxNameSchema.optional(),\n sourceImageId: z.string().min(1),\n status: sandboxSnapshotStatusSchema,\n compatibilityId: z.string().min(1).optional(),\n resources: sandboxResourcesSchema,\n memoryPackCount: z.number().int().nonnegative().max(0xffffffff),\n diskPackCount: z.number().int().nonnegative().max(0xffffffff),\n storedBytes: z.number().int().nonnegative().safe(),\n createdAt: timestampSchema,\n updatedAt: timestampSchema,\n expiresAt: timestampSchema,\n error: z.string().min(1).optional(),\n })\n .strict();\n\nconst validateSandboxSnapshotResource = (\n snapshot: {\n status: z.infer<typeof sandboxSnapshotStatusSchema>;\n compatibilityId?: string;\n sourceImageId: string;\n },\n ctx: z.RefinementCtx,\n): void => {\n if (snapshot.status === \"READY\" && snapshot.compatibilityId === undefined) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"compatibilityId is required for READY snapshots\",\n path: [\"compatibilityId\"],\n });\n }\n if (\n snapshot.status === \"READY\" &&\n !/^[a-f0-9]{64}$/.test(snapshot.sourceImageId)\n ) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message:\n \"Source image ID must be a lowercase SHA-256 for READY snapshots\",\n path: [\"sourceImageId\"],\n });\n }\n};\n\nexport const sandboxSnapshotResourceSchema =\n sandboxSnapshotResourceBaseSchema.superRefine(\n validateSandboxSnapshotResource,\n );\n\nconst wireSandboxSnapshotResourceSchema = sandboxSnapshotResourceBaseSchema\n .omit({ name: true, resources: true, error: true })\n .extend({\n // Unnamed snapshots may omit the name, send null, or send \"\".\n name: z.union([z.literal(\"\"), sandboxNameSchema]).nullish(),\n resources: sandboxResourcesSchema.strip(),\n memoryPackCount: wireUint32Schema,\n diskPackCount: wireUint32Schema,\n storedBytes: wireUint64Schema,\n error: z.string().min(1).nullish(),\n })\n .strip()\n .superRefine(validateSandboxSnapshotResource);\n\nexport const sandboxSnapshotRefSchema = sandboxSnapshotResourceBaseSchema\n .extend({\n kind: z.literal(\"inngest/sandbox.snapshot\"),\n version: z.literal(1),\n })\n .strict()\n .superRefine(validateSandboxSnapshotResource);\n\nexport const sandboxProcessStateSchema = z.enum([\n \"STARTING\",\n \"RUNNING\",\n \"EXITED\",\n \"KILLED\",\n \"FAILED\",\n \"LOST\",\n]);\n\nconst sandboxProcessResourceShape = {\n id: canonicalUuidSchema,\n command: z.array(z.string()).min(1).max(maxProcessArgvCount),\n pid: z.number().int().positive().max(0x7fffffff).optional(),\n state: sandboxProcessStateSchema,\n exitCode: z.number().int().min(-0x80000000).max(0x7fffffff).optional(),\n terminationSignal: z.number().int().min(1).max(64).optional(),\n startedAt: timestampSchema.optional(),\n endedAt: timestampSchema.optional(),\n};\n\nconst validateSandboxProcessResource = (\n process: z.infer<z.ZodObject<typeof sandboxProcessResourceShape>>,\n ctx: z.RefinementCtx,\n): void => {\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 path: [\"exitCode\"],\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 path: [\"terminationSignal\"],\n });\n }\n};\n\nexport const sandboxProcessResourceSchema = z\n .object(sandboxProcessResourceShape)\n .strict()\n .superRefine(validateSandboxProcessResource);\n\nconst wireSandboxProcessResourceSchema = z\n .object(sandboxProcessResourceShape)\n .strip()\n .superRefine(validateSandboxProcessResource);\n\nexport const sandboxProcessRefSchema = z\n .object({\n kind: z.literal(\"inngest/sandbox.process\"),\n version: z.literal(1),\n sandboxId: canonicalUuidSchema,\n id: canonicalUuidSchema,\n command: z.array(z.string()).min(1).max(maxProcessArgvCount),\n pid: z.number().int().positive().max(0x7fffffff).optional(),\n state: sandboxProcessStateSchema,\n exitCode: z.number().int().min(-0x80000000).max(0x7fffffff).optional(),\n terminationSignal: z.number().int().min(1).max(64).optional(),\n startedAt: timestampSchema.optional(),\n endedAt: timestampSchema.optional(),\n })\n .strict()\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 path: [\"exitCode\"],\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 path: [\"terminationSignal\"],\n });\n }\n });\n\nconst outputChunkShape = {\n stream: z.enum([\"STDOUT\", \"STDERR\"]),\n data: z.string(),\n encoding: z.literal(\"base64\"),\n at: timestampSchema.optional(),\n};\n\nexport const wireOutputChunkSchema = z.object(outputChunkShape).strict();\nexport const restOutputChunkSchema = z\n .object({ ...outputChunkShape, data: z.string().default(\"\") })\n .strip();\n\nconst formatValidationError = (context: string, error: z.ZodError): string => {\n const issue = error.issues[0];\n const path = issue?.path.length ? ` at ${issue.path.join(\".\")}` : \"\";\n return `Invalid ${context}${path}: ${issue?.message ?? \"validation failed\"}`;\n};\n\nexport const parseWithSchema = <T, Input = T>(\n schema: z.ZodType<T, z.ZodTypeDef, Input>,\n value: unknown,\n context: string,\n): T => {\n const parsed = schema.safeParse(value);\n if (!parsed.success) {\n throw new SandboxValidationError(\n formatValidationError(context, parsed.error),\n { cause: parsed.error },\n );\n }\n return parsed.data;\n};\n\nexport const sandboxRefFromResource = (value: unknown): SandboxRef => {\n const resource = parseWithSchema(\n wireSandboxResourceSchema,\n value,\n \"sandbox resource\",\n );\n return {\n kind: \"inngest/sandbox\",\n version: 1,\n id: resource.id,\n name: resource.name,\n status: resource.status,\n vpcId: resource.vpcId,\n imageRef: resource.imageRef,\n resources: resource.resources,\n createdAt: resource.createdAt,\n ...(resource.startedAt != null && { startedAt: resource.startedAt }),\n ...(resource.endedAt != null && { endedAt: resource.endedAt }),\n ...(resource.error != null && { error: resource.error }),\n };\n};\n\nexport const sandboxProcessRefFromResource = (\n sandboxId: string,\n value: unknown,\n): SandboxProcessRef =>\n parseWithSchema(\n sandboxProcessRefSchema,\n {\n kind: \"inngest/sandbox.process\",\n version: 1,\n sandboxId,\n ...parseWithSchema(\n wireSandboxProcessResourceSchema,\n value,\n \"sandbox process resource\",\n ),\n },\n \"sandbox process reference\",\n );\n\nexport const sandboxSnapshotRefFromResource = (\n value: unknown,\n): SandboxSnapshotRef => {\n const resource = parseWithSchema(\n wireSandboxSnapshotResourceSchema,\n value,\n \"sandbox snapshot resource\",\n );\n const { name, error, ...base } = resource;\n return {\n kind: \"inngest/sandbox.snapshot\",\n version: 1,\n ...base,\n ...(name && { name }),\n ...(error != null && { error }),\n };\n};\n\nexport const normalizeSandboxCreateOptions = (\n options: SandboxCreateOptions,\n): Omit<SandboxCreateOptions, \"runningTimeout\"> & {\n runningTimeoutMs: number | false;\n} => {\n const parsed = parseWithSchema(\n z.union([\n z\n .object({\n name: sandboxNameSchema,\n vcpu: z.number().int().positive().max(0xffffffff),\n memoryMb: z.number().int().positive().max(0xffffffff),\n environment: z.record(z.string()).optional(),\n secrets: z.array(sandboxSecretNameSchema).optional(),\n runningTimeout: z.unknown().optional(),\n })\n .strict(),\n z\n .object({\n name: sandboxNameSchema,\n snapshotId: canonicalUuidSchema,\n runningTimeout: z.unknown().optional(),\n })\n .strict(),\n ]),\n options,\n \"sandbox create options\",\n );\n if (\"vcpu\" in parsed) {\n const environment = { ...parsed.environment };\n const selected = new Set<string>();\n for (const name of parsed.secrets ?? []) {\n if (Object.hasOwn(parsed.environment ?? {}, name)) {\n throw new SandboxValidationError(\n \"secrets must not overlap with environment\",\n );\n }\n if (selected.has(name)) {\n throw new SandboxValidationError(\n \"secrets must not contain duplicate names\",\n );\n }\n selected.add(name);\n Object.defineProperty(environment, name, { value: \"\", enumerable: true });\n }\n validateSandboxEnvironment(environment);\n }\n const { runningTimeout, ...create } = parsed;\n return {\n ...create,\n runningTimeoutMs:\n runningTimeout === false\n ? false\n : normalizeDurationMs(\n runningTimeout ?? defaultSandboxRunningTimeoutMs,\n maxSandboxRunningTimeoutMs,\n \"runningTimeout\",\n ),\n };\n};\n\nexport const normalizeSandboxWaitUntilRunningOptions = (\n options: SandboxWaitUntilRunningOptions,\n): { timeoutMs: number } => {\n const parsed = parseWithSchema(\n z.object({ timeout: z.unknown() }).strict(),\n options,\n \"sandbox waitUntilRunning options\",\n );\n return {\n timeoutMs: normalizeDurationMs(\n parsed.timeout,\n maxSandboxRunningTimeoutMs,\n \"timeout\",\n ),\n };\n};\n\nconst sandboxListOptionsSchema = z\n .object({\n cursor: z.string().min(1).optional(),\n limit: z.number().int().min(1).max(250).optional(),\n })\n .strict();\n\nexport const normalizeSandboxListOptions = (\n options: SandboxListOptions = {},\n): Required<Pick<SandboxListOptions, \"limit\">> &\n Pick<SandboxListOptions, \"cursor\"> => {\n const parsed = parseWithSchema(\n sandboxListOptionsSchema,\n options,\n \"sandbox list options\",\n );\n return { ...parsed, limit: parsed.limit ?? 50 };\n};\n\nexport const normalizeSandboxProcessListOptions = normalizeSandboxListOptions;\n\ntype SandboxProcessSpecOptions = SandboxCommandOptions & {\n command: SandboxCommand;\n};\n\nexport const sandboxSnapshotCreateOptionsSchema = z\n .object({ name: sandboxNameSchema.optional() })\n .strict();\n\nexport const normalizeSandboxSnapshotListOptions = (\n options: SandboxSnapshotListOptions = {},\n): Required<Pick<SandboxSnapshotListOptions, \"limit\">> &\n Pick<SandboxSnapshotListOptions, \"cursor\" | \"name\"> => {\n const { name, ...list } = parseWithSchema(\n sandboxListOptionsSchema\n .extend({ name: sandboxNameSchema.optional() })\n .strict(),\n options,\n \"sandbox snapshot list options\",\n );\n\n return {\n ...normalizeSandboxListOptions(list),\n ...(name !== undefined && { name }),\n };\n};\n\nexport const normalizeSandboxSnapshotCreateOptions = (\n options: SandboxSnapshotCreateOptions = {},\n): SandboxSnapshotCreateOptions =>\n parseWithSchema(\n sandboxSnapshotCreateOptionsSchema,\n options,\n \"sandbox snapshot create options\",\n );\n\nexport const normalizeSandboxSnapshotWaitOptions = (\n options: SandboxSnapshotWaitOptions,\n): { timeoutMs: number } => {\n const parsed = parseWithSchema(\n z.object({ timeout: z.unknown() }).strict(),\n options,\n \"sandbox snapshot waitUntilReady options\",\n );\n return {\n timeoutMs: normalizeDurationMs(\n parsed.timeout as SandboxDuration,\n maxSandboxSnapshotWaitTimeoutMs,\n \"timeout\",\n ),\n };\n};\n\nconst normalizeProcessSpec = <\n T extends SandboxProcessSpecOptions | SandboxProcessStartOptions,\n>(\n options: T,\n includeTimeout: boolean,\n): Omit<T, \"command\"> & { command: string[] } => {\n const parsed = parseWithSchema(\n z\n .object({\n command: z.union([\n z.string().min(1, \"command must not be empty\"),\n z.array(z.string()).min(1).max(maxProcessArgvCount),\n ]),\n environment: z.record(z.string()).optional(),\n cwd: z.string().optional(),\n ...(includeTimeout && { timeout: z.unknown().optional() }),\n })\n .strict(),\n options,\n \"sandbox command options\",\n ) as unknown as T;\n\n if (Array.isArray(parsed.command) && !parsed.command[0]) {\n throw new SandboxValidationError(\"command[0] must not be empty\");\n }\n const argv =\n typeof parsed.command === \"string\"\n ? [\"/bin/sh\", \"-c\", parsed.command]\n : parsed.command;\n let argvBytes = 0;\n argv.forEach((argument, index) => {\n const context =\n typeof parsed.command === \"string\" ? \"command\" : `command[${index}]`;\n assertNoNul(argument, context);\n assertValidUnicode(argument, context);\n argvBytes += textEncoder.encode(argument).byteLength;\n });\n if (argvBytes > maxProcessArgvBytes) {\n throw new SandboxValidationError(\n `command must not exceed ${maxProcessArgvBytes} bytes`,\n );\n }\n\n const entries = validateSandboxEnvironment(parsed.environment);\n\n if (parsed.cwd !== undefined) {\n assertNoNul(parsed.cwd, \"cwd\");\n assertValidUnicode(parsed.cwd, \"cwd\");\n if (textEncoder.encode(parsed.cwd).byteLength > maxProcessCwdBytes) {\n throw new SandboxValidationError(\n `cwd must not exceed ${maxProcessCwdBytes} bytes`,\n );\n }\n }\n\n const wireBytes = goJSONBytes({\n argv,\n ...(entries.length > 0 && { env: parsed.environment }),\n ...(parsed.cwd !== undefined && parsed.cwd !== \"\" && { cwd: parsed.cwd }),\n });\n if (wireBytes > maxProcessWireBytes) {\n throw new SandboxValidationError(\n `command, environment, and cwd must not exceed ${maxProcessWireBytes} encoded bytes`,\n );\n }\n return {\n ...parsed,\n command: [...argv],\n } as Omit<T, \"command\"> & { command: string[] };\n};\n\nexport const normalizeSandboxCommandOptions = (\n command: SandboxCommand,\n options: SandboxCommandOptions = {},\n): SandboxCommandOptions & { command: string[]; timeoutMs: number } => {\n const parsed = normalizeProcessSpec({ ...options, command }, true);\n return {\n ...parsed,\n timeoutMs:\n parsed.timeout === undefined\n ? defaultSandboxProcessTimeoutMs\n : normalizeDurationMs(\n parsed.timeout,\n maxSandboxProcessTimeoutMs,\n \"timeout\",\n ),\n };\n};\n\nexport const normalizeSandboxProcessStartOptions = (\n options: SandboxProcessStartOptions,\n): Omit<SandboxProcessStartOptions, \"command\"> & { command: string[] } =>\n normalizeProcessSpec(options, false);\n\nexport const normalizeSandboxProcessSignalOptions = (\n options: SandboxProcessSignalOptions,\n): Required<SandboxProcessSignalOptions> => {\n const parsed = parseWithSchema(\n z\n .object({\n signal: z.number().int().min(1).max(64),\n includeChildren: z.boolean().optional(),\n })\n .strict(),\n options,\n \"sandbox process signal options\",\n );\n return {\n signal: parsed.signal,\n includeChildren: parsed.includeChildren ?? true,\n };\n};\n\nexport const normalizeSandboxProcessWaitOptions = (\n options: SandboxProcessWaitOptions = {},\n): { timeoutMs: number } => {\n const parsed = parseWithSchema(\n z.object({ timeout: z.unknown().optional() }).strict(),\n options,\n \"sandbox process wait options\",\n );\n return {\n timeoutMs:\n parsed.timeout === undefined\n ? defaultSandboxProcessTimeoutMs\n : normalizeDurationMs(\n parsed.timeout,\n maxSandboxProcessTimeoutMs,\n \"timeout\",\n ),\n };\n};\n\nexport const normalizeSandboxProcessOutputOptions = (\n options: SandboxProcessOutputOptions = {},\n): { tailBytes: number } => {\n const parsed = parseWithSchema(\n z\n .object({\n tailBytes: z\n .number()\n .int()\n .min(0)\n .max(maxSandboxProcessTailBytes)\n .optional(),\n })\n .strict(),\n options,\n \"sandbox process output options\",\n );\n return { tailBytes: parsed.tailBytes ?? 0 };\n};\n\nexport const normalizeDurationMs = (\n duration: unknown,\n maximumMs: number,\n context: string,\n): number => {\n let milliseconds: number | undefined;\n if (typeof duration === \"number\") {\n milliseconds = duration;\n } else if (typeof duration === \"string\") {\n milliseconds = ms(duration as StringValue);\n } else if (isTemporalDuration(duration)) {\n if (duration.years || duration.months || duration.weeks) {\n throw new SandboxValidationError(\n `${context} cannot contain calendar years, months, or weeks`,\n );\n }\n milliseconds = duration.total({ unit: \"milliseconds\" });\n }\n if (\n typeof milliseconds !== \"number\" ||\n !Number.isFinite(milliseconds) ||\n !Number.isSafeInteger(milliseconds) ||\n milliseconds <= 0\n ) {\n throw new SandboxValidationError(\n `${context} must be a positive, whole number of milliseconds`,\n );\n }\n if (milliseconds > maximumMs) {\n throw new SandboxValidationError(\n `${context} must not exceed ${maximumMs} milliseconds`,\n );\n }\n return milliseconds;\n};\n\nexport const normalizeFileUploadOptions = (\n options: SandboxFileUploadOptions,\n): SandboxFileUploadOptions => {\n const parsed = parseWithSchema(\n z\n .object({\n path: z.string().min(1),\n data: z.unknown(),\n mode: z.number().int().min(1).max(0o777).optional(),\n })\n .strict(),\n options,\n \"sandbox file upload options\",\n );\n validateFilePath(parsed.path);\n return parsed as SandboxFileUploadOptions;\n};\n\nexport const normalizeFileDownloadOptions = (\n options: SandboxFileDownloadOptions,\n): SandboxFileDownloadOptions => {\n const parsed = parseWithSchema(\n z.object({ path: z.string().min(1) }).strict(),\n options,\n \"sandbox file download options\",\n );\n validateFilePath(parsed.path);\n return parsed;\n};\n\nconst validateFilePath = (path: string): void => {\n assertNoNul(path, \"path\");\n if (!path.startsWith(\"/\")) {\n throw new SandboxValidationError(\"path must be absolute\");\n }\n if (textEncoder.encode(path).byteLength > maxProcessCwdBytes) {\n throw new SandboxValidationError(\n `path must not exceed ${maxProcessCwdBytes} bytes`,\n );\n }\n};\n\nexport const decodeBase64 = (value: string, context: string): Uint8Array => {\n if (\n !/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(\n value,\n )\n ) {\n throw new SandboxValidationError(`${context} is not valid base64`);\n }\n try {\n const binary = globalThis.atob(value);\n const bytes = new Uint8Array(binary.length);\n for (let index = 0; index < binary.length; index++) {\n bytes[index] = binary.charCodeAt(index);\n }\n return bytes;\n } catch (error) {\n throw new SandboxValidationError(`${context} is not valid base64`, {\n cause: error,\n });\n }\n};\n\nexport const decodeUtf8 = (value: Uint8Array): string =>\n new TextDecoder(\"utf-8\", { fatal: false }).decode(value);\n\nexport const encodeBase64 = (value: Uint8Array): string => {\n let binary = \"\";\n const chunkSize = 0x8000;\n for (let offset = 0; offset < value.length; offset += chunkSize) {\n binary += String.fromCharCode(\n ...value.subarray(offset, offset + chunkSize),\n );\n }\n return globalThis.btoa(binary);\n};\n\nexport const decodeOutputChunk = (value: unknown): SandboxOutputChunk => {\n const chunk = parseWithSchema(\n restOutputChunkSchema,\n value,\n \"sandbox output chunk\",\n );\n return {\n stream: chunk.stream,\n data: decodeBase64(chunk.data, \"sandbox output data\"),\n ...(chunk.at !== undefined && { at: chunk.at }),\n };\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"validation.js","names":["milliseconds: number"],"sources":["../../../src/components/sandbox/validation.ts"],"sourcesContent":["import { z } from \"zod/v3\";\n\nimport { durationToMs } from \"../../helpers/duration.ts\";\nimport {\n type SandboxCommand,\n type SandboxCommandOptions,\n type SandboxCreateOptions,\n type SandboxDuration,\n type SandboxFileDownloadOptions,\n type SandboxFileUploadOptions,\n type SandboxListOptions,\n type SandboxOutputChunk,\n type SandboxProcessOutputOptions,\n type SandboxProcessRef,\n type SandboxProcessSignalOptions,\n type SandboxProcessStartOptions,\n type SandboxProcessWaitOptions,\n type SandboxRef,\n type SandboxSnapshotCreateOptions,\n type SandboxSnapshotListOptions,\n type SandboxSnapshotRef,\n type SandboxSnapshotWaitOptions,\n SandboxValidationError,\n type SandboxWaitUntilRunningOptions,\n} from \"./types.ts\";\n\nexport const maxSandboxProcessTimeoutMs = 5 * 60 * 1_000;\nexport const defaultSandboxProcessTimeoutMs = 30 * 1_000;\nexport const maxSandboxRunningTimeoutMs = 5 * 60 * 1_000;\nexport const defaultSandboxRunningTimeoutMs = 120 * 1_000;\nexport const maxSandboxSnapshotWaitTimeoutMs = 5 * 60 * 1_000;\nexport const maxSandboxProcessTailBytes = 512 * 1_024;\n\nconst maxProcessArgvCount = 128;\nconst maxProcessArgvBytes = 32 * 1_024;\nconst maxProcessEnvCount = 256;\nconst maxProcessEnvBytes = 64 * 1_024;\nconst maxProcessCwdBytes = 4_096;\nconst maxProcessWireBytes = 96 * 1_024;\nconst maxSandboxNameCharacters = 255;\nconst sandboxNameControlCharacterPattern = /\\p{Cc}/u;\nconst sandboxNameEdgeWhitespacePattern = /^\\p{White_Space}|\\p{White_Space}$/u;\nconst textEncoder = new TextEncoder();\n\nexport const sandboxSecretNameSchema = z.string().superRefine((name, ctx) => {\n if (\n name.length === 0 ||\n textEncoder.encode(name).byteLength > 256 ||\n sandboxNameEdgeWhitespacePattern.test(name) ||\n /[\\r\\n\\0]/u.test(name)\n ) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message:\n \"must be a nonempty workspace secret name of at most 256 bytes without leading/trailing whitespace, CR, LF, or NUL\",\n });\n }\n});\n\nexport const sandboxNameSchema = z.string().superRefine((name, ctx) => {\n if (name.length === 0) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"must not be empty\",\n });\n } else if ([...name].length > maxSandboxNameCharacters) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `must not exceed ${maxSandboxNameCharacters} characters`,\n });\n }\n if (sandboxNameEdgeWhitespacePattern.test(name)) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"must not contain leading or trailing whitespace\",\n });\n }\n if (sandboxNameControlCharacterPattern.test(name)) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"must not contain control characters\",\n });\n }\n});\n\nconst goJSONBytes = (value: unknown): number => {\n // encoding/json escapes these runes by default. Simcity measures the\n // marshalled ProcessSpec, so mirror Go rather than JSON.stringify exactly.\n const encoded = JSON.stringify(value).replace(\n /[<>&\\u2028\\u2029]/g,\n (character) =>\n `\\\\u${character.charCodeAt(0).toString(16).padStart(4, \"0\")}`,\n );\n return textEncoder.encode(encoded).byteLength;\n};\n\nconst assertNoNul = (value: string, context: string): void => {\n if (value.includes(\"\\0\")) {\n throw new SandboxValidationError(`${context} must not contain NUL`);\n }\n};\n\nconst assertValidUnicode = (value: string, context: string): void => {\n for (let index = 0; index < value.length; index++) {\n const codeUnit = value.charCodeAt(index);\n if (codeUnit >= 0xd800 && codeUnit <= 0xdbff) {\n const next = value.charCodeAt(index + 1);\n if (next < 0xdc00 || next > 0xdfff) {\n throw new SandboxValidationError(\n `${context} must not contain an unpaired surrogate`,\n );\n }\n index++;\n } else if (codeUnit >= 0xdc00 && codeUnit <= 0xdfff) {\n throw new SandboxValidationError(\n `${context} must not contain an unpaired surrogate`,\n );\n }\n }\n};\n\nconst validateSandboxEnvironment = (\n environment: Record<string, string> | undefined,\n): Array<[string, string]> => {\n const entries = Object.entries(environment ?? {});\n if (entries.length > maxProcessEnvCount) {\n throw new SandboxValidationError(\n `environment must not contain more than ${maxProcessEnvCount} entries`,\n );\n }\n let environmentBytes = 0;\n for (const [key, value] of entries) {\n if (!key || key.includes(\"=\")) {\n throw new SandboxValidationError(\n \"environment keys must be nonempty and must not contain '='\",\n );\n }\n assertNoNul(key, `environment key ${key}`);\n assertNoNul(value, `environment.${key}`);\n assertValidUnicode(key, `environment key ${key}`);\n assertValidUnicode(value, `environment.${key}`);\n environmentBytes +=\n textEncoder.encode(key).byteLength +\n 1 +\n textEncoder.encode(value).byteLength;\n }\n if (environmentBytes > maxProcessEnvBytes) {\n throw new SandboxValidationError(\n `environment must not exceed ${maxProcessEnvBytes} bytes`,\n );\n }\n return entries;\n};\n\nexport const canonicalUuidSchema = z\n .string()\n .regex(\n /^[0-9a-f]{8}(?:-[0-9a-f]{4}){3}-[0-9a-f]{12}$/,\n \"must be a canonical lowercase UUID\",\n )\n .refine((value) => value !== \"00000000-0000-0000-0000-000000000000\", {\n message: \"must not be the nil UUID\",\n });\n\nconst timestampSchema = z\n .string()\n .regex(\n /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d{1,9})?(?:Z|[+-]\\d{2}:\\d{2})$/,\n \"must be an RFC3339 timestamp\",\n )\n .refine((value) => Number.isFinite(Date.parse(value)), {\n message: \"must be an RFC3339 timestamp\",\n });\n\n// Sandbox REST responses may use proto3 JSON, which omits zero values and\n// encodes 64-bit integers as decimal strings.\nconst wireUint32Schema = z\n .number()\n .int()\n .nonnegative()\n .max(0xffffffff)\n .default(0);\nconst wireUint64Schema = z\n .union([z.number(), z.string().regex(/^\\d+$/).transform(Number)])\n .pipe(z.number().int().nonnegative().safe())\n .default(0);\n\nexport const sandboxStatusSchema = z.enum([\n \"PENDING\",\n \"STARTING\",\n \"PAUSING\",\n \"RUNNING\",\n \"PAUSED\",\n \"RESUMING\",\n \"TERMINATING\",\n \"TERMINATED\",\n \"FAILED\",\n]);\n\nconst sandboxResourcesSchema = z\n .object({\n vcpu: z.number().int().positive().max(0xffffffff),\n memoryMb: z.number().int().positive().max(0xffffffff),\n })\n .strict();\n\nexport const sandboxResourceSchema = z\n .object({\n id: canonicalUuidSchema,\n name: sandboxNameSchema,\n status: sandboxStatusSchema,\n vpcId: canonicalUuidSchema,\n imageRef: z.string().min(1),\n resources: sandboxResourcesSchema,\n createdAt: timestampSchema,\n startedAt: timestampSchema.optional(),\n endedAt: timestampSchema.optional(),\n error: z.string().min(1).optional(),\n })\n .strict();\n\nconst wireSandboxResourceSchema = sandboxResourceSchema\n .omit({ resources: true, startedAt: true, endedAt: true, error: true })\n .extend({\n resources: sandboxResourcesSchema.strip(),\n startedAt: timestampSchema.nullish(),\n endedAt: timestampSchema.nullish(),\n error: z.string().min(1).nullish(),\n })\n .strip();\n\nexport const sandboxRefSchema = sandboxResourceSchema\n .extend({\n kind: z.literal(\"inngest/sandbox\"),\n version: z.literal(1),\n })\n .strict();\n\nexport const sandboxSnapshotStatusSchema = z.enum([\n \"CREATING\",\n \"READY\",\n \"DELETING\",\n \"DELETED\",\n \"FAILED\",\n \"LOST\",\n]);\n\nconst sandboxSnapshotResourceBaseSchema = z\n .object({\n id: canonicalUuidSchema,\n name: sandboxNameSchema.optional(),\n sourceImageId: z.string().min(1),\n status: sandboxSnapshotStatusSchema,\n compatibilityId: z.string().min(1).optional(),\n resources: sandboxResourcesSchema,\n memoryPackCount: z.number().int().nonnegative().max(0xffffffff),\n diskPackCount: z.number().int().nonnegative().max(0xffffffff),\n storedBytes: z.number().int().nonnegative().safe(),\n createdAt: timestampSchema,\n updatedAt: timestampSchema,\n expiresAt: timestampSchema,\n error: z.string().min(1).optional(),\n })\n .strict();\n\nconst validateSandboxSnapshotResource = (\n snapshot: {\n status: z.infer<typeof sandboxSnapshotStatusSchema>;\n compatibilityId?: string;\n sourceImageId: string;\n },\n ctx: z.RefinementCtx,\n): void => {\n if (snapshot.status === \"READY\" && snapshot.compatibilityId === undefined) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"compatibilityId is required for READY snapshots\",\n path: [\"compatibilityId\"],\n });\n }\n if (\n snapshot.status === \"READY\" &&\n !/^[a-f0-9]{64}$/.test(snapshot.sourceImageId)\n ) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message:\n \"Source image ID must be a lowercase SHA-256 for READY snapshots\",\n path: [\"sourceImageId\"],\n });\n }\n};\n\nexport const sandboxSnapshotResourceSchema =\n sandboxSnapshotResourceBaseSchema.superRefine(\n validateSandboxSnapshotResource,\n );\n\nconst wireSandboxSnapshotResourceSchema = sandboxSnapshotResourceBaseSchema\n .omit({ name: true, resources: true, error: true })\n .extend({\n // Unnamed snapshots may omit the name, send null, or send \"\".\n name: z.union([z.literal(\"\"), sandboxNameSchema]).nullish(),\n resources: sandboxResourcesSchema.strip(),\n memoryPackCount: wireUint32Schema,\n diskPackCount: wireUint32Schema,\n storedBytes: wireUint64Schema,\n error: z.string().min(1).nullish(),\n })\n .strip()\n .superRefine(validateSandboxSnapshotResource);\n\nexport const sandboxSnapshotRefSchema = sandboxSnapshotResourceBaseSchema\n .extend({\n kind: z.literal(\"inngest/sandbox.snapshot\"),\n version: z.literal(1),\n })\n .strict()\n .superRefine(validateSandboxSnapshotResource);\n\nexport const sandboxProcessStateSchema = z.enum([\n \"STARTING\",\n \"RUNNING\",\n \"EXITED\",\n \"KILLED\",\n \"FAILED\",\n \"LOST\",\n]);\n\nconst sandboxProcessResourceShape = {\n id: canonicalUuidSchema,\n command: z.array(z.string()).min(1).max(maxProcessArgvCount),\n pid: z.number().int().positive().max(0x7fffffff).optional(),\n state: sandboxProcessStateSchema,\n exitCode: z.number().int().min(-0x80000000).max(0x7fffffff).optional(),\n terminationSignal: z.number().int().min(1).max(64).optional(),\n startedAt: timestampSchema.optional(),\n endedAt: timestampSchema.optional(),\n};\n\nconst validateSandboxProcessResource = (\n process: z.infer<z.ZodObject<typeof sandboxProcessResourceShape>>,\n ctx: z.RefinementCtx,\n): void => {\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 path: [\"exitCode\"],\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 path: [\"terminationSignal\"],\n });\n }\n};\n\nexport const sandboxProcessResourceSchema = z\n .object(sandboxProcessResourceShape)\n .strict()\n .superRefine(validateSandboxProcessResource);\n\nconst wireSandboxProcessResourceSchema = z\n .object(sandboxProcessResourceShape)\n .strip()\n .superRefine(validateSandboxProcessResource);\n\nexport const sandboxProcessRefSchema = z\n .object({\n kind: z.literal(\"inngest/sandbox.process\"),\n version: z.literal(1),\n sandboxId: canonicalUuidSchema,\n id: canonicalUuidSchema,\n command: z.array(z.string()).min(1).max(maxProcessArgvCount),\n pid: z.number().int().positive().max(0x7fffffff).optional(),\n state: sandboxProcessStateSchema,\n exitCode: z.number().int().min(-0x80000000).max(0x7fffffff).optional(),\n terminationSignal: z.number().int().min(1).max(64).optional(),\n startedAt: timestampSchema.optional(),\n endedAt: timestampSchema.optional(),\n })\n .strict()\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 path: [\"exitCode\"],\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 path: [\"terminationSignal\"],\n });\n }\n });\n\nconst outputChunkShape = {\n stream: z.enum([\"STDOUT\", \"STDERR\"]),\n data: z.string(),\n encoding: z.literal(\"base64\"),\n at: timestampSchema.optional(),\n};\n\nexport const wireOutputChunkSchema = z.object(outputChunkShape).strict();\nexport const restOutputChunkSchema = z\n .object({ ...outputChunkShape, data: z.string().default(\"\") })\n .strip();\n\nconst formatValidationError = (context: string, error: z.ZodError): string => {\n const issue = error.issues[0];\n const path = issue?.path.length ? ` at ${issue.path.join(\".\")}` : \"\";\n return `Invalid ${context}${path}: ${issue?.message ?? \"validation failed\"}`;\n};\n\nexport const parseWithSchema = <T, Input = T>(\n schema: z.ZodType<T, z.ZodTypeDef, Input>,\n value: unknown,\n context: string,\n): T => {\n const parsed = schema.safeParse(value);\n if (!parsed.success) {\n throw new SandboxValidationError(\n formatValidationError(context, parsed.error),\n { cause: parsed.error },\n );\n }\n return parsed.data;\n};\n\nexport const sandboxRefFromResource = (value: unknown): SandboxRef => {\n const resource = parseWithSchema(\n wireSandboxResourceSchema,\n value,\n \"sandbox resource\",\n );\n return {\n kind: \"inngest/sandbox\",\n version: 1,\n id: resource.id,\n name: resource.name,\n status: resource.status,\n vpcId: resource.vpcId,\n imageRef: resource.imageRef,\n resources: resource.resources,\n createdAt: resource.createdAt,\n ...(resource.startedAt != null && { startedAt: resource.startedAt }),\n ...(resource.endedAt != null && { endedAt: resource.endedAt }),\n ...(resource.error != null && { error: resource.error }),\n };\n};\n\nexport const sandboxProcessRefFromResource = (\n sandboxId: string,\n value: unknown,\n): SandboxProcessRef =>\n parseWithSchema(\n sandboxProcessRefSchema,\n {\n kind: \"inngest/sandbox.process\",\n version: 1,\n sandboxId,\n ...parseWithSchema(\n wireSandboxProcessResourceSchema,\n value,\n \"sandbox process resource\",\n ),\n },\n \"sandbox process reference\",\n );\n\nexport const sandboxSnapshotRefFromResource = (\n value: unknown,\n): SandboxSnapshotRef => {\n const resource = parseWithSchema(\n wireSandboxSnapshotResourceSchema,\n value,\n \"sandbox snapshot resource\",\n );\n const { name, error, ...base } = resource;\n return {\n kind: \"inngest/sandbox.snapshot\",\n version: 1,\n ...base,\n ...(name && { name }),\n ...(error != null && { error }),\n };\n};\n\nexport const normalizeSandboxCreateOptions = (\n options: SandboxCreateOptions,\n): Omit<SandboxCreateOptions, \"runningTimeout\"> & {\n runningTimeoutMs: number | false;\n} => {\n const parsed = parseWithSchema(\n z.union([\n z\n .object({\n name: sandboxNameSchema,\n vcpu: z.number().int().positive().max(0xffffffff),\n memoryMb: z.number().int().positive().max(0xffffffff),\n environment: z.record(z.string()).optional(),\n secrets: z.array(sandboxSecretNameSchema).optional(),\n runningTimeout: z.unknown().optional(),\n })\n .strict(),\n z\n .object({\n name: sandboxNameSchema,\n snapshotId: canonicalUuidSchema,\n runningTimeout: z.unknown().optional(),\n })\n .strict(),\n ]),\n options,\n \"sandbox create options\",\n );\n if (\"vcpu\" in parsed) {\n const environment = { ...parsed.environment };\n const selected = new Set<string>();\n for (const name of parsed.secrets ?? []) {\n if (Object.hasOwn(parsed.environment ?? {}, name)) {\n throw new SandboxValidationError(\n \"secrets must not overlap with environment\",\n );\n }\n if (selected.has(name)) {\n throw new SandboxValidationError(\n \"secrets must not contain duplicate names\",\n );\n }\n selected.add(name);\n Object.defineProperty(environment, name, { value: \"\", enumerable: true });\n }\n validateSandboxEnvironment(environment);\n }\n const { runningTimeout, ...create } = parsed;\n return {\n ...create,\n runningTimeoutMs:\n runningTimeout === false\n ? false\n : normalizeDurationMs(\n runningTimeout ?? defaultSandboxRunningTimeoutMs,\n maxSandboxRunningTimeoutMs,\n \"runningTimeout\",\n ),\n };\n};\n\nexport const normalizeSandboxWaitUntilRunningOptions = (\n options: SandboxWaitUntilRunningOptions,\n): { timeoutMs: number } => {\n const parsed = parseWithSchema(\n z.object({ timeout: z.unknown() }).strict(),\n options,\n \"sandbox waitUntilRunning options\",\n );\n return {\n timeoutMs: normalizeDurationMs(\n parsed.timeout,\n maxSandboxRunningTimeoutMs,\n \"timeout\",\n ),\n };\n};\n\nconst sandboxListOptionsSchema = z\n .object({\n cursor: z.string().min(1).optional(),\n limit: z.number().int().min(1).max(250).optional(),\n })\n .strict();\n\nexport const normalizeSandboxListOptions = (\n options: SandboxListOptions = {},\n): Required<Pick<SandboxListOptions, \"limit\">> &\n Pick<SandboxListOptions, \"cursor\"> => {\n const parsed = parseWithSchema(\n sandboxListOptionsSchema,\n options,\n \"sandbox list options\",\n );\n return { ...parsed, limit: parsed.limit ?? 50 };\n};\n\nexport const normalizeSandboxProcessListOptions = normalizeSandboxListOptions;\n\ntype SandboxProcessSpecOptions = SandboxCommandOptions & {\n command: SandboxCommand;\n};\n\nexport const sandboxSnapshotCreateOptionsSchema = z\n .object({ name: sandboxNameSchema.optional() })\n .strict();\n\nexport const normalizeSandboxSnapshotListOptions = (\n options: SandboxSnapshotListOptions = {},\n): Required<Pick<SandboxSnapshotListOptions, \"limit\">> &\n Pick<SandboxSnapshotListOptions, \"cursor\" | \"name\"> => {\n const { name, ...list } = parseWithSchema(\n sandboxListOptionsSchema\n .extend({ name: sandboxNameSchema.optional() })\n .strict(),\n options,\n \"sandbox snapshot list options\",\n );\n\n return {\n ...normalizeSandboxListOptions(list),\n ...(name !== undefined && { name }),\n };\n};\n\nexport const normalizeSandboxSnapshotCreateOptions = (\n options: SandboxSnapshotCreateOptions = {},\n): SandboxSnapshotCreateOptions =>\n parseWithSchema(\n sandboxSnapshotCreateOptionsSchema,\n options,\n \"sandbox snapshot create options\",\n );\n\nexport const normalizeSandboxSnapshotWaitOptions = (\n options: SandboxSnapshotWaitOptions,\n): { timeoutMs: number } => {\n const parsed = parseWithSchema(\n z.object({ timeout: z.unknown() }).strict(),\n options,\n \"sandbox snapshot waitUntilReady options\",\n );\n return {\n timeoutMs: normalizeDurationMs(\n parsed.timeout as SandboxDuration,\n maxSandboxSnapshotWaitTimeoutMs,\n \"timeout\",\n ),\n };\n};\n\nconst normalizeProcessSpec = <\n T extends SandboxProcessSpecOptions | SandboxProcessStartOptions,\n>(\n options: T,\n includeTimeout: boolean,\n): Omit<T, \"command\"> & { command: string[] } => {\n const parsed = parseWithSchema(\n z\n .object({\n command: z.union([\n z.string().min(1, \"command must not be empty\"),\n z.array(z.string()).min(1).max(maxProcessArgvCount),\n ]),\n environment: z.record(z.string()).optional(),\n cwd: z.string().optional(),\n ...(includeTimeout && { timeout: z.unknown().optional() }),\n })\n .strict(),\n options,\n \"sandbox command options\",\n ) as unknown as T;\n\n if (Array.isArray(parsed.command) && !parsed.command[0]) {\n throw new SandboxValidationError(\"command[0] must not be empty\");\n }\n const argv =\n typeof parsed.command === \"string\"\n ? [\"/bin/sh\", \"-c\", parsed.command]\n : parsed.command;\n let argvBytes = 0;\n argv.forEach((argument, index) => {\n const context =\n typeof parsed.command === \"string\" ? \"command\" : `command[${index}]`;\n assertNoNul(argument, context);\n assertValidUnicode(argument, context);\n argvBytes += textEncoder.encode(argument).byteLength;\n });\n if (argvBytes > maxProcessArgvBytes) {\n throw new SandboxValidationError(\n `command must not exceed ${maxProcessArgvBytes} bytes`,\n );\n }\n\n const entries = validateSandboxEnvironment(parsed.environment);\n\n if (parsed.cwd !== undefined) {\n assertNoNul(parsed.cwd, \"cwd\");\n assertValidUnicode(parsed.cwd, \"cwd\");\n if (textEncoder.encode(parsed.cwd).byteLength > maxProcessCwdBytes) {\n throw new SandboxValidationError(\n `cwd must not exceed ${maxProcessCwdBytes} bytes`,\n );\n }\n }\n\n const wireBytes = goJSONBytes({\n argv,\n ...(entries.length > 0 && { env: parsed.environment }),\n ...(parsed.cwd !== undefined && parsed.cwd !== \"\" && { cwd: parsed.cwd }),\n });\n if (wireBytes > maxProcessWireBytes) {\n throw new SandboxValidationError(\n `command, environment, and cwd must not exceed ${maxProcessWireBytes} encoded bytes`,\n );\n }\n return {\n ...parsed,\n command: [...argv],\n } as Omit<T, \"command\"> & { command: string[] };\n};\n\nexport const normalizeSandboxCommandOptions = (\n command: SandboxCommand,\n options: SandboxCommandOptions = {},\n): SandboxCommandOptions & { command: string[]; timeoutMs: number } => {\n const parsed = normalizeProcessSpec({ ...options, command }, true);\n return {\n ...parsed,\n timeoutMs:\n parsed.timeout === undefined\n ? defaultSandboxProcessTimeoutMs\n : normalizeDurationMs(\n parsed.timeout,\n maxSandboxProcessTimeoutMs,\n \"timeout\",\n ),\n };\n};\n\nexport const normalizeSandboxProcessStartOptions = (\n options: SandboxProcessStartOptions,\n): Omit<SandboxProcessStartOptions, \"command\"> & { command: string[] } =>\n normalizeProcessSpec(options, false);\n\nexport const normalizeSandboxProcessSignalOptions = (\n options: SandboxProcessSignalOptions,\n): Required<SandboxProcessSignalOptions> => {\n const parsed = parseWithSchema(\n z\n .object({\n signal: z.number().int().min(1).max(64),\n includeChildren: z.boolean().optional(),\n })\n .strict(),\n options,\n \"sandbox process signal options\",\n );\n return {\n signal: parsed.signal,\n includeChildren: parsed.includeChildren ?? true,\n };\n};\n\nexport const normalizeSandboxProcessWaitOptions = (\n options: SandboxProcessWaitOptions = {},\n): { timeoutMs: number } => {\n const parsed = parseWithSchema(\n z.object({ timeout: z.unknown().optional() }).strict(),\n options,\n \"sandbox process wait options\",\n );\n return {\n timeoutMs:\n parsed.timeout === undefined\n ? defaultSandboxProcessTimeoutMs\n : normalizeDurationMs(\n parsed.timeout,\n maxSandboxProcessTimeoutMs,\n \"timeout\",\n ),\n };\n};\n\nexport const normalizeSandboxProcessOutputOptions = (\n options: SandboxProcessOutputOptions = {},\n): { tailBytes: number } => {\n const parsed = parseWithSchema(\n z\n .object({\n tailBytes: z\n .number()\n .int()\n .min(0)\n .max(maxSandboxProcessTailBytes)\n .optional(),\n })\n .strict(),\n options,\n \"sandbox process output options\",\n );\n return { tailBytes: parsed.tailBytes ?? 0 };\n};\n\nexport const normalizeDurationMs = (\n duration: unknown,\n maximumMs: number,\n context: string,\n): number => {\n let milliseconds: number;\n try {\n milliseconds = durationToMs(duration, { name: context });\n } catch (error) {\n throw new SandboxValidationError(\n error instanceof Error ? error.message : String(error),\n { cause: error },\n );\n }\n if (milliseconds > maximumMs) {\n throw new SandboxValidationError(\n `${context} must not exceed ${maximumMs} milliseconds`,\n );\n }\n return milliseconds;\n};\n\nexport const normalizeFileUploadOptions = (\n options: SandboxFileUploadOptions,\n): SandboxFileUploadOptions => {\n const parsed = parseWithSchema(\n z\n .object({\n path: z.string().min(1),\n data: z.unknown(),\n mode: z.number().int().min(1).max(0o777).optional(),\n })\n .strict(),\n options,\n \"sandbox file upload options\",\n );\n validateFilePath(parsed.path);\n return parsed as SandboxFileUploadOptions;\n};\n\nexport const normalizeFileDownloadOptions = (\n options: SandboxFileDownloadOptions,\n): SandboxFileDownloadOptions => {\n const parsed = parseWithSchema(\n z.object({ path: z.string().min(1) }).strict(),\n options,\n \"sandbox file download options\",\n );\n validateFilePath(parsed.path);\n return parsed;\n};\n\nconst validateFilePath = (path: string): void => {\n assertNoNul(path, \"path\");\n if (!path.startsWith(\"/\")) {\n throw new SandboxValidationError(\"path must be absolute\");\n }\n if (textEncoder.encode(path).byteLength > maxProcessCwdBytes) {\n throw new SandboxValidationError(\n `path must not exceed ${maxProcessCwdBytes} bytes`,\n );\n }\n};\n\nexport const decodeBase64 = (value: string, context: string): Uint8Array => {\n if (\n !/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(\n value,\n )\n ) {\n throw new SandboxValidationError(`${context} is not valid base64`);\n }\n try {\n const binary = globalThis.atob(value);\n const bytes = new Uint8Array(binary.length);\n for (let index = 0; index < binary.length; index++) {\n bytes[index] = binary.charCodeAt(index);\n }\n return bytes;\n } catch (error) {\n throw new SandboxValidationError(`${context} is not valid base64`, {\n cause: error,\n });\n }\n};\n\nexport const decodeUtf8 = (value: Uint8Array): string =>\n new TextDecoder(\"utf-8\", { fatal: false }).decode(value);\n\nexport const encodeBase64 = (value: Uint8Array): string => {\n let binary = \"\";\n const chunkSize = 0x8000;\n for (let offset = 0; offset < value.length; offset += chunkSize) {\n binary += String.fromCharCode(\n ...value.subarray(offset, offset + chunkSize),\n );\n }\n return globalThis.btoa(binary);\n};\n\nexport const decodeOutputChunk = (value: unknown): SandboxOutputChunk => {\n const chunk = parseWithSchema(\n restOutputChunkSchema,\n value,\n \"sandbox output chunk\",\n );\n return {\n stream: chunk.stream,\n data: decodeBase64(chunk.data, \"sandbox output data\"),\n ...(chunk.at !== undefined && { at: chunk.at }),\n };\n};\n"],"mappings":"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"}
@@ -5,8 +5,9 @@ import { DeferredFunction, createDefer } from "./components/DeferredFunction.cjs
5
5
  import { ExperimentRef } from "./types.cjs";
6
6
  import { DurableSandbox, DurableSandboxProcess, DurableSandboxSnapshot, DurableSandboxTools, Sandbox, SandboxAction, SandboxClient, SandboxCommand, SandboxCommandOptions, SandboxCommandOutputMetadata, SandboxCommandResult, SandboxCreateFreshOptions, SandboxCreateFromSnapshotOptions, SandboxCreateOptions, SandboxDestroyResult, SandboxDuration, SandboxError, SandboxErrorCode, SandboxErrorDetail, SandboxFileDownloadOptions, SandboxFileUploadOptions, SandboxFileUploadResult, SandboxLifecycleOptions, SandboxListOptions, SandboxListResult, SandboxLogStreamOptions, SandboxOutputChunk, SandboxPageInfo, SandboxProcess, SandboxProcessListOptions, SandboxProcessListResult, SandboxProcessOutput, SandboxProcessOutputOptions, SandboxProcessRef, SandboxProcessResource, SandboxProcessSignalOptions, SandboxProcessStartOptions, SandboxProcessState, SandboxProcessWaitOptions, SandboxRef, SandboxResource, SandboxResources, SandboxSnapshot, SandboxSnapshotCloneOptions, SandboxSnapshotCreateOptions, SandboxSnapshotListOptions, SandboxSnapshotListResult, SandboxSnapshotRef, SandboxSnapshotResource, SandboxSnapshotStatus, SandboxSnapshotWaitOptions, SandboxStatus, SandboxValidationError, SandboxWaitUntilRunningOptions } from "./components/sandbox/types.cjs";
7
7
  import { getSandboxError } from "./components/sandbox/protocol.cjs";
8
+ import { GroupSandbox, GroupSandboxOptions, GroupSandboxOptionsOrId } from "./components/sandbox/group.cjs";
8
9
  import { sandboxMiddleware } from "./components/sandbox/middleware.cjs";
9
10
  import { PublicInngestSpanProcessor } from "./components/execution/otel/processor.cjs";
10
11
  import { ExtendedTracesMiddlewareOptions, extendedTracesMiddleware } from "./components/execution/otel/middleware.cjs";
11
12
  import { createScorer } from "./components/ScoreFunction.cjs";
12
- export { type AsyncContext, DeferredFunction, type DurableSandbox, type DurableSandboxProcess, type DurableSandboxSnapshot, type DurableSandboxTools, type ExperimentRef, type ExtendedTracesMiddlewareOptions, PublicInngestSpanProcessor as InngestSpanProcessor, type Sandbox, type SandboxAction, type SandboxClient, type SandboxCommand, type SandboxCommandOptions, type SandboxCommandOutputMetadata, type SandboxCommandResult, type SandboxCreateFreshOptions, type SandboxCreateFromSnapshotOptions, type SandboxCreateOptions, type SandboxDestroyResult, type SandboxDuration, SandboxError, type SandboxErrorCode, type SandboxErrorDetail, type SandboxFileDownloadOptions, type SandboxFileUploadOptions, type SandboxFileUploadResult, type SandboxLifecycleOptions, type SandboxListOptions, type SandboxListResult, type SandboxLogStreamOptions, type SandboxOutputChunk, type SandboxPageInfo, type SandboxProcess, type SandboxProcessListOptions, type SandboxProcessListResult, type SandboxProcessOutput, type SandboxProcessOutputOptions, type SandboxProcessRef, type SandboxProcessResource, type SandboxProcessSignalOptions, type SandboxProcessStartOptions, type SandboxProcessState, type SandboxProcessWaitOptions, type SandboxRef, type SandboxResource, type SandboxResources, type SandboxSnapshot, type SandboxSnapshotCloneOptions, type SandboxSnapshotCreateOptions, type SandboxSnapshotListOptions, type SandboxSnapshotListResult, type SandboxSnapshotRef, type SandboxSnapshotResource, type SandboxSnapshotStatus, type SandboxSnapshotWaitOptions, type SandboxStatus, SandboxValidationError, type SandboxWaitUntilRunningOptions, createDefer, createScorer, extendedTracesMiddleware, getAsyncCtx, getSandboxError, metadataMiddleware, runWithAsyncCtx, sandboxMiddleware, scoreMiddleware };
13
+ export { type AsyncContext, DeferredFunction, type DurableSandbox, type DurableSandboxProcess, type DurableSandboxSnapshot, type DurableSandboxTools, type ExperimentRef, type ExtendedTracesMiddlewareOptions, type GroupSandbox, type GroupSandboxOptions, type GroupSandboxOptionsOrId, PublicInngestSpanProcessor as InngestSpanProcessor, type Sandbox, type SandboxAction, type SandboxClient, type SandboxCommand, type SandboxCommandOptions, type SandboxCommandOutputMetadata, type SandboxCommandResult, type SandboxCreateFreshOptions, type SandboxCreateFromSnapshotOptions, type SandboxCreateOptions, type SandboxDestroyResult, type SandboxDuration, SandboxError, type SandboxErrorCode, type SandboxErrorDetail, type SandboxFileDownloadOptions, type SandboxFileUploadOptions, type SandboxFileUploadResult, type SandboxLifecycleOptions, type SandboxListOptions, type SandboxListResult, type SandboxLogStreamOptions, type SandboxOutputChunk, type SandboxPageInfo, type SandboxProcess, type SandboxProcessListOptions, type SandboxProcessListResult, type SandboxProcessOutput, type SandboxProcessOutputOptions, type SandboxProcessRef, type SandboxProcessResource, type SandboxProcessSignalOptions, type SandboxProcessStartOptions, type SandboxProcessState, type SandboxProcessWaitOptions, type SandboxRef, type SandboxResource, type SandboxResources, type SandboxSnapshot, type SandboxSnapshotCloneOptions, type SandboxSnapshotCreateOptions, type SandboxSnapshotListOptions, type SandboxSnapshotListResult, type SandboxSnapshotRef, type SandboxSnapshotResource, type SandboxSnapshotStatus, type SandboxSnapshotWaitOptions, type SandboxStatus, SandboxValidationError, type SandboxWaitUntilRunningOptions, createDefer, createScorer, extendedTracesMiddleware, getAsyncCtx, getSandboxError, metadataMiddleware, runWithAsyncCtx, sandboxMiddleware, scoreMiddleware };