@vercel/sandbox
Advanced tools
@@ -218,2 +218,3 @@ import { BaseClient, Parsed, RequestParams } from "./base-client.cjs"; | ||
| }; | ||
| resumed?: boolean | undefined; | ||
| }>>; | ||
@@ -613,2 +614,3 @@ runCommand(params: { | ||
| }; | ||
| resumed?: boolean | undefined; | ||
| }>>; | ||
@@ -615,0 +617,0 @@ listSandboxes(params: { |
@@ -218,2 +218,3 @@ import { BaseClient, Parsed, RequestParams } from "./base-client.js"; | ||
| }; | ||
| resumed?: boolean | undefined; | ||
| }>>; | ||
@@ -613,2 +614,3 @@ runCommand(params: { | ||
| }; | ||
| resumed?: boolean | undefined; | ||
| }>>; | ||
@@ -615,0 +617,0 @@ listSandboxes(params: { |
@@ -148,3 +148,4 @@ const require_rolldown_runtime = require('../_virtual/rolldown_runtime.cjs'); | ||
| session: Session.passthrough(), | ||
| routes: zod.z.array(SandboxRoute) | ||
| routes: zod.z.array(SandboxRoute), | ||
| resumed: zod.z.boolean().optional() | ||
| }); | ||
@@ -151,0 +152,0 @@ const SandboxesPaginationResponse = zod.z.object({ |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"validators.cjs","names":["z"],"sources":["../../src/api-client/validators.ts"],"sourcesContent":["import { z } from \"zod\";\n\nexport type SessionMetaData = z.infer<typeof Session>;\n\nexport const InjectionRuleValidator = z.object({\n domain: z.string(),\n // headers are only sent in requests\n headers: z.record(z.string()).optional(),\n // headerNames are returned in responses\n headerNames: z.array(z.string()).optional(),\n});\n\nexport const NetworkPolicyValidator = z.union([\n z.object({ mode: z.literal(\"allow-all\") }).passthrough(),\n z.object({ mode: z.literal(\"deny-all\") }).passthrough(),\n z\n .object({\n mode: z.literal(\"custom\"),\n allowedDomains: z.array(z.string()).optional(),\n allowedCIDRs: z.array(z.string()).optional(),\n deniedCIDRs: z.array(z.string()).optional(),\n injectionRules: z.array(InjectionRuleValidator).optional(),\n })\n .passthrough(),\n]);\n\nexport const Session = z.object({\n id: z.string(),\n memory: z.number(),\n vcpus: z.number(),\n region: z.string(),\n runtime: z.string(),\n timeout: z.number(),\n status: z.enum([\n \"pending\",\n \"running\",\n \"stopping\",\n \"stopped\",\n \"failed\",\n \"aborted\",\n \"snapshotting\",\n ]),\n requestedAt: z.number(),\n startedAt: z.number().optional(),\n requestedStopAt: z.number().optional(),\n stoppedAt: z.number().optional(),\n abortedAt: z.number().optional(),\n duration: z.number().optional(),\n sourceSnapshotId: z.string().optional(),\n snapshottedAt: z.number().optional(),\n createdAt: z.number(),\n cwd: z.string(),\n updatedAt: z.number(),\n interactivePort: z.number().optional(),\n networkPolicy: NetworkPolicyValidator.optional(),\n activeCpuDurationMs: z.number().optional(),\n networkTransfer: z.object({\n ingress: z.number(),\n egress: z.number(),\n }).optional(),\n});\n\nexport type SandboxRouteData = z.infer<typeof SandboxRoute>;\n\nexport const SandboxRoute = z.object({\n url: z.string(),\n subdomain: z.string(),\n port: z.number(),\n});\n\nexport type SnapshotMetadata = z.infer<typeof Snapshot>;\n\nexport const Snapshot = z.object({\n id: z.string(),\n sourceSessionId: z.string(),\n region: z.string(),\n status: z.enum([\"created\", \"deleted\", \"failed\"]),\n sizeBytes: z.number(),\n expiresAt: z.number().optional(),\n createdAt: z.number(),\n updatedAt: z.number(),\n});\n\nexport const CursorPagination = z.object({\n count: z.number(),\n next: z.string().nullable(),\n});\n\nexport type CommandData = z.infer<typeof Command>;\n\nexport const Command = z.object({\n id: z.string(),\n name: z.string(),\n args: z.array(z.string()),\n cwd: z.string(),\n sessionId: z.string(),\n exitCode: z.number().nullable(),\n startedAt: z.number(),\n});\n\nconst CommandFinished = Command.extend({\n exitCode: z.number(),\n});\n\nexport const SessionResponse = z.object({\n session: Session.passthrough(),\n});\n\nexport const SessionAndRoutesResponse = SessionResponse.extend({\n routes: z.array(SandboxRoute),\n});\n\nexport const SessionsResponse = z.object({\n sessions: z.array(Session.passthrough()),\n pagination: CursorPagination,\n});\n\nexport const CommandResponse = z.object({\n command: Command,\n});\n\nexport type CommandFinishedData = z.infer<typeof CommandFinishedResponse>[\"command\"];\n\nexport const CommandFinishedResponse = z.object({\n command: CommandFinished,\n});\n\nexport const EmptyResponse = z.object({});\n\nconst LogLineBase = z.object({ data: z.string() });\nexport const LogLineStdout = LogLineBase.extend({\n stream: z.literal(\"stdout\"),\n});\nexport const LogLineStderr = LogLineBase.extend({\n stream: z.literal(\"stderr\"),\n});\n\nexport const LogError = z.object({\n stream: z.literal(\"error\"),\n data: z.object({\n code: z.string(),\n message: z.string(),\n }),\n});\n\nexport const LogLine = z.discriminatedUnion(\"stream\", [\n LogLineStdout,\n LogLineStderr,\n LogError,\n]);\n\nexport const SnapshotsResponse = z.object({\n snapshots: z.array(Snapshot),\n pagination: CursorPagination,\n});\n\nexport const CreateSnapshotResponse = z.object({\n snapshot: Snapshot,\n session: Session.passthrough(),\n});\n\nexport const SnapshotResponse = z.object({\n snapshot: Snapshot,\n});\n\nexport const Sandbox = z.object({\n name: z.string(),\n persistent: z.boolean(),\n region: z.string().optional(),\n vcpus: z.number().optional(),\n memory: z.number().optional(),\n runtime: z.string().optional(),\n timeout: z.number().optional(),\n networkPolicy: NetworkPolicyValidator.optional(),\n totalEgressBytes: z.number().optional(),\n totalIngressBytes: z.number().optional(),\n totalActiveCpuDurationMs: z.number().optional(),\n totalDurationMs: z.number().optional(),\n createdAt: z.number(),\n updatedAt: z.number(),\n currentSessionId: z.string(),\n currentSnapshotId: z.string().optional(),\n status: Session.shape.status,\n statusUpdatedAt: z.number().optional(),\n cwd: z.string().optional(),\n tags: z.record(z.string()).optional(),\n snapshotExpiration: z.number().optional(),\n});\n\nexport type SandboxMetaData = z.infer<typeof Sandbox>;\n\nexport const SandboxAndSessionResponse = z.object({\n sandbox: Sandbox,\n session: Session.passthrough(),\n routes: z.array(SandboxRoute),\n});\n\nexport const SandboxesPaginationResponse = z.object({\n sandboxes: z.array(Sandbox),\n pagination: CursorPagination,\n});\n\nexport const UpdateSandboxResponse = z.object({\n sandbox: Sandbox,\n});\n"],"mappings":"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"} | ||
| {"version":3,"file":"validators.cjs","names":["z"],"sources":["../../src/api-client/validators.ts"],"sourcesContent":["import { z } from \"zod\";\n\nexport type SessionMetaData = z.infer<typeof Session>;\n\nexport const InjectionRuleValidator = z.object({\n domain: z.string(),\n // headers are only sent in requests\n headers: z.record(z.string()).optional(),\n // headerNames are returned in responses\n headerNames: z.array(z.string()).optional(),\n});\n\nexport const NetworkPolicyValidator = z.union([\n z.object({ mode: z.literal(\"allow-all\") }).passthrough(),\n z.object({ mode: z.literal(\"deny-all\") }).passthrough(),\n z\n .object({\n mode: z.literal(\"custom\"),\n allowedDomains: z.array(z.string()).optional(),\n allowedCIDRs: z.array(z.string()).optional(),\n deniedCIDRs: z.array(z.string()).optional(),\n injectionRules: z.array(InjectionRuleValidator).optional(),\n })\n .passthrough(),\n]);\n\nexport const Session = z.object({\n id: z.string(),\n memory: z.number(),\n vcpus: z.number(),\n region: z.string(),\n runtime: z.string(),\n timeout: z.number(),\n status: z.enum([\n \"pending\",\n \"running\",\n \"stopping\",\n \"stopped\",\n \"failed\",\n \"aborted\",\n \"snapshotting\",\n ]),\n requestedAt: z.number(),\n startedAt: z.number().optional(),\n requestedStopAt: z.number().optional(),\n stoppedAt: z.number().optional(),\n abortedAt: z.number().optional(),\n duration: z.number().optional(),\n sourceSnapshotId: z.string().optional(),\n snapshottedAt: z.number().optional(),\n createdAt: z.number(),\n cwd: z.string(),\n updatedAt: z.number(),\n interactivePort: z.number().optional(),\n networkPolicy: NetworkPolicyValidator.optional(),\n activeCpuDurationMs: z.number().optional(),\n networkTransfer: z.object({\n ingress: z.number(),\n egress: z.number(),\n }).optional(),\n});\n\nexport type SandboxRouteData = z.infer<typeof SandboxRoute>;\n\nexport const SandboxRoute = z.object({\n url: z.string(),\n subdomain: z.string(),\n port: z.number(),\n});\n\nexport type SnapshotMetadata = z.infer<typeof Snapshot>;\n\nexport const Snapshot = z.object({\n id: z.string(),\n sourceSessionId: z.string(),\n region: z.string(),\n status: z.enum([\"created\", \"deleted\", \"failed\"]),\n sizeBytes: z.number(),\n expiresAt: z.number().optional(),\n createdAt: z.number(),\n updatedAt: z.number(),\n});\n\nexport const CursorPagination = z.object({\n count: z.number(),\n next: z.string().nullable(),\n});\n\nexport type CommandData = z.infer<typeof Command>;\n\nexport const Command = z.object({\n id: z.string(),\n name: z.string(),\n args: z.array(z.string()),\n cwd: z.string(),\n sessionId: z.string(),\n exitCode: z.number().nullable(),\n startedAt: z.number(),\n});\n\nconst CommandFinished = Command.extend({\n exitCode: z.number(),\n});\n\nexport const SessionResponse = z.object({\n session: Session.passthrough(),\n});\n\nexport const SessionAndRoutesResponse = SessionResponse.extend({\n routes: z.array(SandboxRoute),\n});\n\nexport const SessionsResponse = z.object({\n sessions: z.array(Session.passthrough()),\n pagination: CursorPagination,\n});\n\nexport const CommandResponse = z.object({\n command: Command,\n});\n\nexport type CommandFinishedData = z.infer<typeof CommandFinishedResponse>[\"command\"];\n\nexport const CommandFinishedResponse = z.object({\n command: CommandFinished,\n});\n\nexport const EmptyResponse = z.object({});\n\nconst LogLineBase = z.object({ data: z.string() });\nexport const LogLineStdout = LogLineBase.extend({\n stream: z.literal(\"stdout\"),\n});\nexport const LogLineStderr = LogLineBase.extend({\n stream: z.literal(\"stderr\"),\n});\n\nexport const LogError = z.object({\n stream: z.literal(\"error\"),\n data: z.object({\n code: z.string(),\n message: z.string(),\n }),\n});\n\nexport const LogLine = z.discriminatedUnion(\"stream\", [\n LogLineStdout,\n LogLineStderr,\n LogError,\n]);\n\nexport const SnapshotsResponse = z.object({\n snapshots: z.array(Snapshot),\n pagination: CursorPagination,\n});\n\nexport const CreateSnapshotResponse = z.object({\n snapshot: Snapshot,\n session: Session.passthrough(),\n});\n\nexport const SnapshotResponse = z.object({\n snapshot: Snapshot,\n});\n\nexport const Sandbox = z.object({\n name: z.string(),\n persistent: z.boolean(),\n region: z.string().optional(),\n vcpus: z.number().optional(),\n memory: z.number().optional(),\n runtime: z.string().optional(),\n timeout: z.number().optional(),\n networkPolicy: NetworkPolicyValidator.optional(),\n totalEgressBytes: z.number().optional(),\n totalIngressBytes: z.number().optional(),\n totalActiveCpuDurationMs: z.number().optional(),\n totalDurationMs: z.number().optional(),\n createdAt: z.number(),\n updatedAt: z.number(),\n currentSessionId: z.string(),\n currentSnapshotId: z.string().optional(),\n status: Session.shape.status,\n statusUpdatedAt: z.number().optional(),\n cwd: z.string().optional(),\n tags: z.record(z.string()).optional(),\n snapshotExpiration: z.number().optional(),\n});\n\nexport type SandboxMetaData = z.infer<typeof Sandbox>;\n\nexport const SandboxAndSessionResponse = z.object({\n sandbox: Sandbox,\n session: Session.passthrough(),\n routes: z.array(SandboxRoute),\n resumed: z.boolean().optional(),\n});\n\nexport const SandboxesPaginationResponse = z.object({\n sandboxes: z.array(Sandbox),\n pagination: CursorPagination,\n});\n\nexport const UpdateSandboxResponse = z.object({\n sandbox: Sandbox,\n});\n"],"mappings":"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"} |
@@ -147,3 +147,4 @@ import { z } from "zod"; | ||
| session: Session.passthrough(), | ||
| routes: z.array(SandboxRoute) | ||
| routes: z.array(SandboxRoute), | ||
| resumed: z.boolean().optional() | ||
| }); | ||
@@ -150,0 +151,0 @@ const SandboxesPaginationResponse = z.object({ |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"validators.js","names":[],"sources":["../../src/api-client/validators.ts"],"sourcesContent":["import { z } from \"zod\";\n\nexport type SessionMetaData = z.infer<typeof Session>;\n\nexport const InjectionRuleValidator = z.object({\n domain: z.string(),\n // headers are only sent in requests\n headers: z.record(z.string()).optional(),\n // headerNames are returned in responses\n headerNames: z.array(z.string()).optional(),\n});\n\nexport const NetworkPolicyValidator = z.union([\n z.object({ mode: z.literal(\"allow-all\") }).passthrough(),\n z.object({ mode: z.literal(\"deny-all\") }).passthrough(),\n z\n .object({\n mode: z.literal(\"custom\"),\n allowedDomains: z.array(z.string()).optional(),\n allowedCIDRs: z.array(z.string()).optional(),\n deniedCIDRs: z.array(z.string()).optional(),\n injectionRules: z.array(InjectionRuleValidator).optional(),\n })\n .passthrough(),\n]);\n\nexport const Session = z.object({\n id: z.string(),\n memory: z.number(),\n vcpus: z.number(),\n region: z.string(),\n runtime: z.string(),\n timeout: z.number(),\n status: z.enum([\n \"pending\",\n \"running\",\n \"stopping\",\n \"stopped\",\n \"failed\",\n \"aborted\",\n \"snapshotting\",\n ]),\n requestedAt: z.number(),\n startedAt: z.number().optional(),\n requestedStopAt: z.number().optional(),\n stoppedAt: z.number().optional(),\n abortedAt: z.number().optional(),\n duration: z.number().optional(),\n sourceSnapshotId: z.string().optional(),\n snapshottedAt: z.number().optional(),\n createdAt: z.number(),\n cwd: z.string(),\n updatedAt: z.number(),\n interactivePort: z.number().optional(),\n networkPolicy: NetworkPolicyValidator.optional(),\n activeCpuDurationMs: z.number().optional(),\n networkTransfer: z.object({\n ingress: z.number(),\n egress: z.number(),\n }).optional(),\n});\n\nexport type SandboxRouteData = z.infer<typeof SandboxRoute>;\n\nexport const SandboxRoute = z.object({\n url: z.string(),\n subdomain: z.string(),\n port: z.number(),\n});\n\nexport type SnapshotMetadata = z.infer<typeof Snapshot>;\n\nexport const Snapshot = z.object({\n id: z.string(),\n sourceSessionId: z.string(),\n region: z.string(),\n status: z.enum([\"created\", \"deleted\", \"failed\"]),\n sizeBytes: z.number(),\n expiresAt: z.number().optional(),\n createdAt: z.number(),\n updatedAt: z.number(),\n});\n\nexport const CursorPagination = z.object({\n count: z.number(),\n next: z.string().nullable(),\n});\n\nexport type CommandData = z.infer<typeof Command>;\n\nexport const Command = z.object({\n id: z.string(),\n name: z.string(),\n args: z.array(z.string()),\n cwd: z.string(),\n sessionId: z.string(),\n exitCode: z.number().nullable(),\n startedAt: z.number(),\n});\n\nconst CommandFinished = Command.extend({\n exitCode: z.number(),\n});\n\nexport const SessionResponse = z.object({\n session: Session.passthrough(),\n});\n\nexport const SessionAndRoutesResponse = SessionResponse.extend({\n routes: z.array(SandboxRoute),\n});\n\nexport const SessionsResponse = z.object({\n sessions: z.array(Session.passthrough()),\n pagination: CursorPagination,\n});\n\nexport const CommandResponse = z.object({\n command: Command,\n});\n\nexport type CommandFinishedData = z.infer<typeof CommandFinishedResponse>[\"command\"];\n\nexport const CommandFinishedResponse = z.object({\n command: CommandFinished,\n});\n\nexport const EmptyResponse = z.object({});\n\nconst LogLineBase = z.object({ data: z.string() });\nexport const LogLineStdout = LogLineBase.extend({\n stream: z.literal(\"stdout\"),\n});\nexport const LogLineStderr = LogLineBase.extend({\n stream: z.literal(\"stderr\"),\n});\n\nexport const LogError = z.object({\n stream: z.literal(\"error\"),\n data: z.object({\n code: z.string(),\n message: z.string(),\n }),\n});\n\nexport const LogLine = z.discriminatedUnion(\"stream\", [\n LogLineStdout,\n LogLineStderr,\n LogError,\n]);\n\nexport const SnapshotsResponse = z.object({\n snapshots: z.array(Snapshot),\n pagination: CursorPagination,\n});\n\nexport const CreateSnapshotResponse = z.object({\n snapshot: Snapshot,\n session: Session.passthrough(),\n});\n\nexport const SnapshotResponse = z.object({\n snapshot: Snapshot,\n});\n\nexport const Sandbox = z.object({\n name: z.string(),\n persistent: z.boolean(),\n region: z.string().optional(),\n vcpus: z.number().optional(),\n memory: z.number().optional(),\n runtime: z.string().optional(),\n timeout: z.number().optional(),\n networkPolicy: NetworkPolicyValidator.optional(),\n totalEgressBytes: z.number().optional(),\n totalIngressBytes: z.number().optional(),\n totalActiveCpuDurationMs: z.number().optional(),\n totalDurationMs: z.number().optional(),\n createdAt: z.number(),\n updatedAt: z.number(),\n currentSessionId: z.string(),\n currentSnapshotId: z.string().optional(),\n status: Session.shape.status,\n statusUpdatedAt: z.number().optional(),\n cwd: z.string().optional(),\n tags: z.record(z.string()).optional(),\n snapshotExpiration: z.number().optional(),\n});\n\nexport type SandboxMetaData = z.infer<typeof Sandbox>;\n\nexport const SandboxAndSessionResponse = z.object({\n sandbox: Sandbox,\n session: Session.passthrough(),\n routes: z.array(SandboxRoute),\n});\n\nexport const SandboxesPaginationResponse = z.object({\n sandboxes: z.array(Sandbox),\n pagination: CursorPagination,\n});\n\nexport const UpdateSandboxResponse = z.object({\n sandbox: Sandbox,\n});\n"],"mappings":";;;AAIA,MAAa,yBAAyB,EAAE,OAAO;CAC7C,QAAQ,EAAE,QAAQ;CAElB,SAAS,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,UAAU;CAExC,aAAa,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,UAAU;CAC5C,CAAC;AAEF,MAAa,yBAAyB,EAAE,MAAM;CAC5C,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,YAAY,EAAE,CAAC,CAAC,aAAa;CACxD,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,WAAW,EAAE,CAAC,CAAC,aAAa;CACvD,EACG,OAAO;EACN,MAAM,EAAE,QAAQ,SAAS;EACzB,gBAAgB,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,UAAU;EAC9C,cAAc,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,UAAU;EAC5C,aAAa,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,UAAU;EAC3C,gBAAgB,EAAE,MAAM,uBAAuB,CAAC,UAAU;EAC3D,CAAC,CACD,aAAa;CACjB,CAAC;AAEF,MAAa,UAAU,EAAE,OAAO;CAC9B,IAAI,EAAE,QAAQ;CACd,QAAQ,EAAE,QAAQ;CAClB,OAAO,EAAE,QAAQ;CACjB,QAAQ,EAAE,QAAQ;CAClB,SAAS,EAAE,QAAQ;CACnB,SAAS,EAAE,QAAQ;CACnB,QAAQ,EAAE,KAAK;EACb;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CAAC;CACF,aAAa,EAAE,QAAQ;CACvB,WAAW,EAAE,QAAQ,CAAC,UAAU;CAChC,iBAAiB,EAAE,QAAQ,CAAC,UAAU;CACtC,WAAW,EAAE,QAAQ,CAAC,UAAU;CAChC,WAAW,EAAE,QAAQ,CAAC,UAAU;CAChC,UAAU,EAAE,QAAQ,CAAC,UAAU;CAC/B,kBAAkB,EAAE,QAAQ,CAAC,UAAU;CACvC,eAAe,EAAE,QAAQ,CAAC,UAAU;CACpC,WAAW,EAAE,QAAQ;CACrB,KAAK,EAAE,QAAQ;CACf,WAAW,EAAE,QAAQ;CACrB,iBAAiB,EAAE,QAAQ,CAAC,UAAU;CACtC,eAAe,uBAAuB,UAAU;CAChD,qBAAqB,EAAE,QAAQ,CAAC,UAAU;CAC1C,iBAAiB,EAAE,OAAO;EACxB,SAAS,EAAE,QAAQ;EACnB,QAAQ,EAAE,QAAQ;EACnB,CAAC,CAAC,UAAU;CACd,CAAC;AAIF,MAAa,eAAe,EAAE,OAAO;CACnC,KAAK,EAAE,QAAQ;CACf,WAAW,EAAE,QAAQ;CACrB,MAAM,EAAE,QAAQ;CACjB,CAAC;AAIF,MAAa,WAAW,EAAE,OAAO;CAC/B,IAAI,EAAE,QAAQ;CACd,iBAAiB,EAAE,QAAQ;CAC3B,QAAQ,EAAE,QAAQ;CAClB,QAAQ,EAAE,KAAK;EAAC;EAAW;EAAW;EAAS,CAAC;CAChD,WAAW,EAAE,QAAQ;CACrB,WAAW,EAAE,QAAQ,CAAC,UAAU;CAChC,WAAW,EAAE,QAAQ;CACrB,WAAW,EAAE,QAAQ;CACtB,CAAC;AAEF,MAAa,mBAAmB,EAAE,OAAO;CACvC,OAAO,EAAE,QAAQ;CACjB,MAAM,EAAE,QAAQ,CAAC,UAAU;CAC5B,CAAC;AAIF,MAAa,UAAU,EAAE,OAAO;CAC9B,IAAI,EAAE,QAAQ;CACd,MAAM,EAAE,QAAQ;CAChB,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC;CACzB,KAAK,EAAE,QAAQ;CACf,WAAW,EAAE,QAAQ;CACrB,UAAU,EAAE,QAAQ,CAAC,UAAU;CAC/B,WAAW,EAAE,QAAQ;CACtB,CAAC;AAEF,MAAM,kBAAkB,QAAQ,OAAO,EACrC,UAAU,EAAE,QAAQ,EACrB,CAAC;AAEF,MAAa,kBAAkB,EAAE,OAAO,EACtC,SAAS,QAAQ,aAAa,EAC/B,CAAC;AAEF,MAAa,2BAA2B,gBAAgB,OAAO,EAC7D,QAAQ,EAAE,MAAM,aAAa,EAC9B,CAAC;AAEF,MAAa,mBAAmB,EAAE,OAAO;CACvC,UAAU,EAAE,MAAM,QAAQ,aAAa,CAAC;CACxC,YAAY;CACb,CAAC;AAEF,MAAa,kBAAkB,EAAE,OAAO,EACtC,SAAS,SACV,CAAC;AAIF,MAAa,0BAA0B,EAAE,OAAO,EAC9C,SAAS,iBACV,CAAC;AAEF,MAAa,gBAAgB,EAAE,OAAO,EAAE,CAAC;AAEzC,MAAM,cAAc,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;AAClD,MAAa,gBAAgB,YAAY,OAAO,EAC9C,QAAQ,EAAE,QAAQ,SAAS,EAC5B,CAAC;AACF,MAAa,gBAAgB,YAAY,OAAO,EAC9C,QAAQ,EAAE,QAAQ,SAAS,EAC5B,CAAC;AAEF,MAAa,WAAW,EAAE,OAAO;CAC/B,QAAQ,EAAE,QAAQ,QAAQ;CAC1B,MAAM,EAAE,OAAO;EACb,MAAM,EAAE,QAAQ;EAChB,SAAS,EAAE,QAAQ;EACpB,CAAC;CACH,CAAC;AAEF,MAAa,UAAU,EAAE,mBAAmB,UAAU;CACpD;CACA;CACA;CACD,CAAC;AAEF,MAAa,oBAAoB,EAAE,OAAO;CACxC,WAAW,EAAE,MAAM,SAAS;CAC5B,YAAY;CACb,CAAC;AAEF,MAAa,yBAAyB,EAAE,OAAO;CAC7C,UAAU;CACV,SAAS,QAAQ,aAAa;CAC/B,CAAC;AAEF,MAAa,mBAAmB,EAAE,OAAO,EACvC,UAAU,UACX,CAAC;AAEF,MAAa,UAAU,EAAE,OAAO;CAC9B,MAAM,EAAE,QAAQ;CAChB,YAAY,EAAE,SAAS;CACvB,QAAQ,EAAE,QAAQ,CAAC,UAAU;CAC7B,OAAO,EAAE,QAAQ,CAAC,UAAU;CAC5B,QAAQ,EAAE,QAAQ,CAAC,UAAU;CAC7B,SAAS,EAAE,QAAQ,CAAC,UAAU;CAC9B,SAAS,EAAE,QAAQ,CAAC,UAAU;CAC9B,eAAe,uBAAuB,UAAU;CAChD,kBAAkB,EAAE,QAAQ,CAAC,UAAU;CACvC,mBAAmB,EAAE,QAAQ,CAAC,UAAU;CACxC,0BAA0B,EAAE,QAAQ,CAAC,UAAU;CAC/C,iBAAiB,EAAE,QAAQ,CAAC,UAAU;CACtC,WAAW,EAAE,QAAQ;CACrB,WAAW,EAAE,QAAQ;CACrB,kBAAkB,EAAE,QAAQ;CAC5B,mBAAmB,EAAE,QAAQ,CAAC,UAAU;CACxC,QAAQ,QAAQ,MAAM;CACtB,iBAAiB,EAAE,QAAQ,CAAC,UAAU;CACtC,KAAK,EAAE,QAAQ,CAAC,UAAU;CAC1B,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,UAAU;CACrC,oBAAoB,EAAE,QAAQ,CAAC,UAAU;CAC1C,CAAC;AAIF,MAAa,4BAA4B,EAAE,OAAO;CAChD,SAAS;CACT,SAAS,QAAQ,aAAa;CAC9B,QAAQ,EAAE,MAAM,aAAa;CAC9B,CAAC;AAEF,MAAa,8BAA8B,EAAE,OAAO;CAClD,WAAW,EAAE,MAAM,QAAQ;CAC3B,YAAY;CACb,CAAC;AAEF,MAAa,wBAAwB,EAAE,OAAO,EAC5C,SAAS,SACV,CAAC"} | ||
| {"version":3,"file":"validators.js","names":[],"sources":["../../src/api-client/validators.ts"],"sourcesContent":["import { z } from \"zod\";\n\nexport type SessionMetaData = z.infer<typeof Session>;\n\nexport const InjectionRuleValidator = z.object({\n domain: z.string(),\n // headers are only sent in requests\n headers: z.record(z.string()).optional(),\n // headerNames are returned in responses\n headerNames: z.array(z.string()).optional(),\n});\n\nexport const NetworkPolicyValidator = z.union([\n z.object({ mode: z.literal(\"allow-all\") }).passthrough(),\n z.object({ mode: z.literal(\"deny-all\") }).passthrough(),\n z\n .object({\n mode: z.literal(\"custom\"),\n allowedDomains: z.array(z.string()).optional(),\n allowedCIDRs: z.array(z.string()).optional(),\n deniedCIDRs: z.array(z.string()).optional(),\n injectionRules: z.array(InjectionRuleValidator).optional(),\n })\n .passthrough(),\n]);\n\nexport const Session = z.object({\n id: z.string(),\n memory: z.number(),\n vcpus: z.number(),\n region: z.string(),\n runtime: z.string(),\n timeout: z.number(),\n status: z.enum([\n \"pending\",\n \"running\",\n \"stopping\",\n \"stopped\",\n \"failed\",\n \"aborted\",\n \"snapshotting\",\n ]),\n requestedAt: z.number(),\n startedAt: z.number().optional(),\n requestedStopAt: z.number().optional(),\n stoppedAt: z.number().optional(),\n abortedAt: z.number().optional(),\n duration: z.number().optional(),\n sourceSnapshotId: z.string().optional(),\n snapshottedAt: z.number().optional(),\n createdAt: z.number(),\n cwd: z.string(),\n updatedAt: z.number(),\n interactivePort: z.number().optional(),\n networkPolicy: NetworkPolicyValidator.optional(),\n activeCpuDurationMs: z.number().optional(),\n networkTransfer: z.object({\n ingress: z.number(),\n egress: z.number(),\n }).optional(),\n});\n\nexport type SandboxRouteData = z.infer<typeof SandboxRoute>;\n\nexport const SandboxRoute = z.object({\n url: z.string(),\n subdomain: z.string(),\n port: z.number(),\n});\n\nexport type SnapshotMetadata = z.infer<typeof Snapshot>;\n\nexport const Snapshot = z.object({\n id: z.string(),\n sourceSessionId: z.string(),\n region: z.string(),\n status: z.enum([\"created\", \"deleted\", \"failed\"]),\n sizeBytes: z.number(),\n expiresAt: z.number().optional(),\n createdAt: z.number(),\n updatedAt: z.number(),\n});\n\nexport const CursorPagination = z.object({\n count: z.number(),\n next: z.string().nullable(),\n});\n\nexport type CommandData = z.infer<typeof Command>;\n\nexport const Command = z.object({\n id: z.string(),\n name: z.string(),\n args: z.array(z.string()),\n cwd: z.string(),\n sessionId: z.string(),\n exitCode: z.number().nullable(),\n startedAt: z.number(),\n});\n\nconst CommandFinished = Command.extend({\n exitCode: z.number(),\n});\n\nexport const SessionResponse = z.object({\n session: Session.passthrough(),\n});\n\nexport const SessionAndRoutesResponse = SessionResponse.extend({\n routes: z.array(SandboxRoute),\n});\n\nexport const SessionsResponse = z.object({\n sessions: z.array(Session.passthrough()),\n pagination: CursorPagination,\n});\n\nexport const CommandResponse = z.object({\n command: Command,\n});\n\nexport type CommandFinishedData = z.infer<typeof CommandFinishedResponse>[\"command\"];\n\nexport const CommandFinishedResponse = z.object({\n command: CommandFinished,\n});\n\nexport const EmptyResponse = z.object({});\n\nconst LogLineBase = z.object({ data: z.string() });\nexport const LogLineStdout = LogLineBase.extend({\n stream: z.literal(\"stdout\"),\n});\nexport const LogLineStderr = LogLineBase.extend({\n stream: z.literal(\"stderr\"),\n});\n\nexport const LogError = z.object({\n stream: z.literal(\"error\"),\n data: z.object({\n code: z.string(),\n message: z.string(),\n }),\n});\n\nexport const LogLine = z.discriminatedUnion(\"stream\", [\n LogLineStdout,\n LogLineStderr,\n LogError,\n]);\n\nexport const SnapshotsResponse = z.object({\n snapshots: z.array(Snapshot),\n pagination: CursorPagination,\n});\n\nexport const CreateSnapshotResponse = z.object({\n snapshot: Snapshot,\n session: Session.passthrough(),\n});\n\nexport const SnapshotResponse = z.object({\n snapshot: Snapshot,\n});\n\nexport const Sandbox = z.object({\n name: z.string(),\n persistent: z.boolean(),\n region: z.string().optional(),\n vcpus: z.number().optional(),\n memory: z.number().optional(),\n runtime: z.string().optional(),\n timeout: z.number().optional(),\n networkPolicy: NetworkPolicyValidator.optional(),\n totalEgressBytes: z.number().optional(),\n totalIngressBytes: z.number().optional(),\n totalActiveCpuDurationMs: z.number().optional(),\n totalDurationMs: z.number().optional(),\n createdAt: z.number(),\n updatedAt: z.number(),\n currentSessionId: z.string(),\n currentSnapshotId: z.string().optional(),\n status: Session.shape.status,\n statusUpdatedAt: z.number().optional(),\n cwd: z.string().optional(),\n tags: z.record(z.string()).optional(),\n snapshotExpiration: z.number().optional(),\n});\n\nexport type SandboxMetaData = z.infer<typeof Sandbox>;\n\nexport const SandboxAndSessionResponse = z.object({\n sandbox: Sandbox,\n session: Session.passthrough(),\n routes: z.array(SandboxRoute),\n resumed: z.boolean().optional(),\n});\n\nexport const SandboxesPaginationResponse = z.object({\n sandboxes: z.array(Sandbox),\n pagination: CursorPagination,\n});\n\nexport const UpdateSandboxResponse = z.object({\n sandbox: Sandbox,\n});\n"],"mappings":"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"} |
@@ -10,8 +10,8 @@ import { z } from "zod"; | ||
| token?: string | undefined; | ||
| expiresAt?: Date | undefined; | ||
| refreshToken?: string | undefined; | ||
| expiresAt?: Date | undefined; | ||
| }, { | ||
| token?: string | undefined; | ||
| expiresAt?: number | undefined; | ||
| refreshToken?: string | undefined; | ||
| expiresAt?: number | undefined; | ||
| }>; | ||
@@ -21,4 +21,4 @@ type AuthFile = z.infer<typeof AuthFile>; | ||
| token?: string | undefined; | ||
| expiresAt?: Date | undefined; | ||
| refreshToken?: string | undefined; | ||
| expiresAt?: Date | undefined; | ||
| } | null; | ||
@@ -25,0 +25,0 @@ declare function updateAuthConfig(config: AuthFile): void; |
@@ -10,8 +10,8 @@ import { z } from "zod"; | ||
| token?: string | undefined; | ||
| expiresAt?: Date | undefined; | ||
| refreshToken?: string | undefined; | ||
| expiresAt?: Date | undefined; | ||
| }, { | ||
| token?: string | undefined; | ||
| expiresAt?: number | undefined; | ||
| refreshToken?: string | undefined; | ||
| expiresAt?: number | undefined; | ||
| }>; | ||
@@ -21,4 +21,4 @@ type AuthFile = z.infer<typeof AuthFile>; | ||
| token?: string | undefined; | ||
| expiresAt?: Date | undefined; | ||
| refreshToken?: string | undefined; | ||
| expiresAt?: Date | undefined; | ||
| } | null; | ||
@@ -25,0 +25,0 @@ declare function updateAuthConfig(config: AuthFile): void; |
+10
-4
@@ -283,3 +283,4 @@ const require_rolldown_runtime = require('./_virtual/rolldown_runtime.cjs'); | ||
| routes: response.json.routes, | ||
| projectId: credentials.projectId | ||
| projectId: credentials.projectId, | ||
| onResume: params?.onResume | ||
| }); | ||
@@ -309,3 +310,3 @@ } | ||
| }); | ||
| return new Sandbox({ | ||
| const sandbox = new Sandbox({ | ||
| client, | ||
@@ -315,4 +316,7 @@ session: response.json.session, | ||
| routes: response.json.routes, | ||
| projectId: credentials.projectId | ||
| projectId: credentials.projectId, | ||
| onResume: params.onResume | ||
| }); | ||
| if (response.json.resumed && params.onResume) await params.onResume(sandbox); | ||
| return sandbox; | ||
| } | ||
@@ -326,3 +330,3 @@ /** | ||
| */ | ||
| constructor({ client, routes, session, sandbox, projectId }) { | ||
| constructor({ client, routes, session, sandbox, projectId, onResume }) { | ||
| this._client = null; | ||
@@ -338,2 +342,3 @@ this.resumePromise = null; | ||
| this.projectId = projectId ?? ""; | ||
| this.onResume = onResume; | ||
| } | ||
@@ -371,2 +376,3 @@ /** | ||
| }); | ||
| if (this.onResume && response.json.resumed) await this.onResume(this); | ||
| } | ||
@@ -373,0 +379,0 @@ /** |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"sandbox.cjs","names":["APIError","getCredentials","APIClient","fromAPINetworkPolicy","WORKFLOW_SERIALIZE","WORKFLOW_DESERIALIZE","Session","getPrivateParams","resources: { vcpus: number; memory: number } | undefined"],"sources":["../src/sandbox.ts"],"sourcesContent":["import { WORKFLOW_DESERIALIZE, WORKFLOW_SERIALIZE } from \"@workflow/serde\";\nimport type {\n SessionMetaData,\n SandboxRouteData,\n SandboxMetaData,\n} from \"./api-client/index.js\";\nimport { APIClient } from \"./api-client/index.js\";\nimport { APIError } from \"./api-client/api-error.js\";\nimport { type Credentials, getCredentials } from \"./utils/get-credentials.js\";\nimport { getPrivateParams, type WithPrivate } from \"./utils/types.js\";\nimport type { WithFetchOptions } from \"./api-client/api-client.js\";\nimport type { RUNTIMES } from \"./constants.js\";\nimport { Session, type RunCommandParams } from \"./session.js\";\nimport type { Command, CommandFinished } from \"./command.js\";\nimport type { Snapshot } from \"./snapshot.js\";\nimport type { SandboxSnapshot } from \"./utils/sandbox-snapshot.js\";\nimport type { NetworkPolicy } from \"./network-policy.js\";\nimport { fromAPINetworkPolicy } from \"./utils/network-policy.js\";\nimport { setTimeout } from \"node:timers/promises\";\n\nexport type { NetworkPolicy };\n\n/** @inline */\nexport interface BaseCreateSandboxParams {\n /**\n * The name of the sandbox. If omitted, a random name will be generated.\n */\n name?: string;\n /**\n * The source of the sandbox.\n *\n * Omit this parameter start a sandbox without a source.\n *\n * For git sources:\n * - `depth`: Creates shallow clones with limited commit history (minimum: 1)\n * - `revision`: Clones and checks out a specific commit, branch, or tag\n */\n source?:\n | {\n type: \"git\";\n url: string;\n depth?: number;\n revision?: string;\n }\n | {\n type: \"git\";\n url: string;\n username: string;\n password: string;\n depth?: number;\n revision?: string;\n }\n | { type: \"tarball\"; url: string };\n /**\n * Array of port numbers to expose from the sandbox. Sandboxes can\n * expose up to 4 ports.\n */\n ports?: number[];\n /**\n * Timeout in milliseconds before the sandbox auto-terminates.\n */\n timeout?: number;\n /**\n * Resources to allocate to the sandbox.\n *\n * Your sandbox will get the amount of vCPUs you specify here and\n * 2048 MB of memory per vCPU.\n */\n resources?: { vcpus: number };\n /**\n * The runtime of the sandbox, currently only `node24`, `node22` and `python3.13` are supported.\n * If not specified, the default runtime `node24` will be used.\n */\n runtime?: RUNTIMES | (string & {});\n /**\n * Network policy to define network restrictions for the sandbox.\n * Defaults to full internet access if not specified.\n */\n networkPolicy?: NetworkPolicy;\n /**\n * Default environment variables for the sandbox.\n * These are inherited by all commands unless overridden with\n * the `env` option in `runCommand`.\n *\n * @example\n * const sandbox = await Sandbox.create({\n * env: { NODE_ENV: \"production\", API_KEY: \"secret\" },\n * });\n * // All commands will have NODE_ENV and API_KEY set\n * await sandbox.runCommand(\"node\", [\"app.js\"]);\n */\n env?: Record<string, string>;\n /**\n * Key-value tags to associate with the sandbox. Maximum 5 tags.\n * @example { env: \"staging\", team: \"infra\" }\n */\n tags?: Record<string, string>;\n\n /**\n * An AbortSignal to cancel sandbox creation.\n */\n signal?: AbortSignal;\n /**\n * Enable or disable automatic restore of the filesystem between sessions.\n */\n persistent?: boolean;\n /**\n * Default snapshot expiration in milliseconds.\n * When set, snapshots created for this sandbox will expire after this duration.\n * Use `0` for no expiration.\n */\n snapshotExpiration?: number;\n}\n\nexport type CreateSandboxParams =\n | BaseCreateSandboxParams\n | (Omit<BaseCreateSandboxParams, \"runtime\" | \"source\"> & {\n source: { type: \"snapshot\"; snapshotId: string };\n });\n\n/** @inline */\ninterface GetSandboxParams {\n /**\n * The name of the sandbox.\n */\n name: string;\n /**\n * Whether to resume an existing session. Defaults to true.\n */\n resume?: boolean;\n /**\n * An AbortSignal to cancel the operation.\n */\n signal?: AbortSignal;\n}\n\nfunction isSandboxStoppedError(err: unknown): boolean {\n return err instanceof APIError && err.response.status === 410;\n}\n\nfunction isSandboxStoppingError(err: unknown): boolean {\n return (\n err instanceof APIError &&\n err.response.status === 422 &&\n (err.json as any)?.error?.code === \"sandbox_stopping\"\n );\n}\n\nfunction isSandboxSnapshottingError(err: unknown): boolean {\n return (\n err instanceof APIError &&\n err.response.status === 422 &&\n (err.json as any)?.error?.code === \"sandbox_snapshotting\"\n );\n}\n\n/**\n * Serialized representation of a Sandbox for @workflow/serde.\n * Fields `metadata` and `routes` are the original wire format from main.\n * Fields `sandboxMetadata` and `projectId` are added for named-sandboxes.\n */\nexport interface SerializedSandbox {\n metadata: SandboxSnapshot;\n routes: SandboxRouteData[];\n sandboxMetadata?: SandboxMetaData;\n projectId?: string;\n}\n\n// ============================================================================\n// Sandbox class\n// ============================================================================\n\n/**\n * A Sandbox is a persistent, isolated Linux MicroVMs to run commands in.\n * Use {@link Sandbox.create} or {@link Sandbox.get} to construct.\n * @hideconstructor\n */\nexport class Sandbox {\n private _client: APIClient | null = null;\n private readonly projectId: string;\n\n /**\n * In-flight resume promise, used to deduplicate concurrent resume calls.\n */\n private resumePromise: Promise<void> | null = null;\n\n /**\n * Internal Session instance for the current VM.\n */\n private session: Session | undefined;\n\n /**\n * Internal metadata about the sandbox.\n */\n private sandbox: SandboxMetaData;\n\n /**\n * Lazily resolve credentials and construct an API client.\n * @internal\n */\n private async ensureClient(): Promise<APIClient> {\n \"use step\";\n if (this._client) return this._client;\n const credentials = await getCredentials();\n this._client = new APIClient({\n teamId: credentials.teamId,\n token: credentials.token,\n });\n return this._client;\n }\n\n /**\n * The name of this sandbox.\n */\n public get name(): string {\n return this.sandbox.name;\n }\n\n /**\n * Routes from ports to subdomains.\n * @hidden\n */\n public get routes(): SandboxRouteData[] {\n return this.currentSession().routes;\n }\n\n /**\n * Whether the sandbox persists the state.\n */\n public get persistent(): boolean {\n return this.sandbox.persistent;\n }\n\n /**\n * The region this sandbox runs in.\n */\n public get region(): string | undefined {\n return this.sandbox.region;\n }\n\n /**\n * Number of virtual CPUs allocated.\n */\n public get vcpus(): number | undefined {\n return this.sandbox.vcpus;\n }\n\n /**\n * Memory allocated in MB.\n */\n public get memory(): number | undefined {\n return this.sandbox.memory;\n }\n\n /** Runtime identifier (e.g. \"node24\", \"python3.13\"). */\n public get runtime(): string | undefined {\n return this.sandbox.runtime;\n }\n\n /**\n * Cumulative egress bytes across all sessions.\n */\n public get totalEgressBytes(): number | undefined {\n return this.sandbox.totalEgressBytes;\n }\n\n /**\n * Cumulative ingress bytes across all sessions.\n */\n public get totalIngressBytes(): number | undefined {\n return this.sandbox.totalIngressBytes;\n }\n\n /**\n * Cumulative active CPU duration in milliseconds across all sessions.\n */\n public get totalActiveCpuDurationMs(): number | undefined {\n return this.sandbox.totalActiveCpuDurationMs;\n }\n\n /**\n * Cumulative wall-clock duration in milliseconds across all sessions.\n */\n public get totalDurationMs(): number | undefined {\n return this.sandbox.totalDurationMs;\n }\n\n /**\n * When this sandbox was last updated.\n */\n public get updatedAt(): Date {\n return new Date(this.sandbox.updatedAt);\n }\n\n /**\n * When the sandbox status was last updated.\n */\n public get statusUpdatedAt(): Date | undefined {\n return this.sandbox.statusUpdatedAt\n ? new Date(this.sandbox.statusUpdatedAt)\n : undefined;\n }\n\n /**\n * When this sandbox was created.\n */\n public get createdAt(): Date {\n return new Date(this.sandbox.createdAt);\n }\n\n /**\n * Interactive port.\n */\n public get interactivePort(): number | undefined {\n return this.currentSession().interactivePort;\n }\n\n /**\n * The status of the current session.\n */\n public get status(): SessionMetaData[\"status\"] {\n return this.currentSession().status;\n }\n\n /**\n * The default timeout of this sandbox in milliseconds.\n */\n public get timeout(): number | undefined {\n return this.sandbox.timeout;\n }\n\n /**\n * Key-value tags attached to the sandbox.\n */\n public get tags(): Record<string, string> | undefined {\n return this.sandbox.tags;\n }\n\n /**\n * The default network policy of this sandbox.\n */\n public get networkPolicy(): NetworkPolicy | undefined {\n return this.sandbox.networkPolicy\n ? fromAPINetworkPolicy(this.sandbox.networkPolicy)\n : undefined;\n }\n\n /**\n * If the session was created from a snapshot, the ID of that snapshot.\n */\n public get sourceSnapshotId(): string | undefined {\n return this.currentSession().sourceSnapshotId;\n }\n\n /**\n * The current snapshot ID of this sandbox, if any.\n */\n public get currentSnapshotId(): string | undefined {\n return this.sandbox.currentSnapshotId;\n }\n\n /**\n * The default snapshot expiration in milliseconds, if set.\n */\n public get snapshotExpiration(): number | undefined {\n return this.sandbox.snapshotExpiration;\n }\n\n /**\n * The amount of CPU used by the session. Only reported once the VM is stopped.\n */\n public get activeCpuUsageMs(): number | undefined {\n return this.currentSession().activeCpuUsageMs;\n }\n\n /**\n * The amount of network data used by the session. Only reported once the VM is stopped.\n */\n public get networkTransfer():\n | { ingress: number; egress: number }\n | undefined {\n return this.currentSession().networkTransfer;\n }\n\n /**\n * Allow to get a list of sandboxes for a team narrowed to the given params.\n * It returns both the sandboxes and the pagination metadata to allow getting\n * the next page of results.\n */\n static async list(\n params?: Partial<Parameters<APIClient[\"listSandboxes\"]>[0]> &\n Partial<Credentials> &\n WithFetchOptions,\n ) {\n \"use step\";\n const credentials = await getCredentials(params);\n const client = new APIClient({\n teamId: credentials.teamId,\n token: credentials.token,\n fetch: params?.fetch,\n });\n const response = await client.listSandboxes({\n ...credentials,\n ...params,\n });\n return response.json;\n }\n\n /**\n * Serialize a Sandbox instance to plain data for @workflow/serde.\n *\n * @param instance - The Sandbox instance to serialize\n * @returns A plain object containing sandbox metadata and routes\n */\n static [WORKFLOW_SERIALIZE](instance: Sandbox): SerializedSandbox {\n return {\n metadata: instance.session?._sessionSnapshot!,\n routes: instance.session?.routes ?? [],\n sandboxMetadata: instance.sandbox,\n projectId: instance.projectId,\n };\n }\n\n /**\n * Deserialize a Sandbox from serialized snapshot data.\n *\n * The deserialized instance uses the serialized metadata synchronously and\n * lazily creates an API client only when methods perform API requests.\n *\n * @param data - The serialized sandbox data\n * @returns The reconstructed Sandbox instance\n */\n static [WORKFLOW_DESERIALIZE](data: SerializedSandbox): Sandbox {\n const sandbox = new Sandbox({\n sandbox: data.sandboxMetadata!,\n routes: data.routes,\n projectId: data.projectId,\n });\n if (data.metadata) {\n sandbox.session = new Session({ routes: data.routes, snapshot: data.metadata });\n }\n return sandbox;\n }\n\n /**\n * Create a new sandbox.\n *\n * @param params - Creation parameters and optional credentials.\n * @returns A promise resolving to the created {@link Sandbox}.\n * @example\n * <caption>Create a sandbox with default options</caption>\n * const sandbox = await Sandbox.create();\n *\n * @example\n * <caption>Create a sandbox and drop it in the end of the block</caption>\n * async function fn() {\n * await using const sandbox = await Sandbox.create();\n * // Sandbox automatically stopped at the end of the lexical scope\n * }\n */\n static async create(\n params?: WithPrivate<\n CreateSandboxParams | (CreateSandboxParams & Credentials)\n > &\n WithFetchOptions,\n ): Promise<Sandbox & AsyncDisposable> {\n \"use step\";\n const credentials = await getCredentials(params);\n const client = new APIClient({\n teamId: credentials.teamId,\n token: credentials.token,\n fetch: params?.fetch,\n });\n\n const privateParams = getPrivateParams(params);\n const response = await client.createSandbox({\n source: params?.source,\n projectId: credentials.projectId,\n ports: params?.ports ?? [],\n timeout: params?.timeout,\n resources: params?.resources,\n runtime: params && \"runtime\" in params ? params?.runtime : undefined,\n networkPolicy: params?.networkPolicy,\n env: params?.env,\n tags: params?.tags,\n snapshotExpiration: params?.snapshotExpiration,\n signal: params?.signal,\n name: params?.name,\n persistent: params?.persistent,\n ...privateParams,\n });\n\n return new DisposableSandbox({\n client,\n session: response.json.session,\n sandbox: response.json.sandbox,\n routes: response.json.routes,\n projectId: credentials.projectId,\n });\n }\n\n /**\n * Retrieve an existing sandbox and resume its session.\n *\n * @param params - Get parameters and optional credentials.\n * @returns A promise resolving to the {@link Sandbox}.\n */\n static async get(\n params: WithPrivate<GetSandboxParams | (GetSandboxParams & Credentials)> &\n WithFetchOptions,\n ): Promise<Sandbox> {\n \"use step\";\n const credentials = await getCredentials(params);\n const client = new APIClient({\n teamId: credentials.teamId,\n token: credentials.token,\n fetch: params.fetch,\n });\n\n const privateParams = getPrivateParams(params);\n const response = await client.getSandbox({\n name: params.name,\n projectId: credentials.projectId,\n resume: params.resume,\n signal: params.signal,\n ...privateParams,\n });\n\n return new Sandbox({\n client,\n session: response.json.session,\n sandbox: response.json.sandbox,\n routes: response.json.routes,\n projectId: credentials.projectId,\n });\n }\n\n /**\n * Create a new Sandbox instance.\n *\n * @param params.client - Optional API client. If not provided, will be lazily created using global credentials.\n * @param params.routes - Port-to-subdomain mappings for exposed ports\n * @param params.sandbox - Sandbox snapshot metadata\n */\n constructor({\n client,\n routes,\n session,\n sandbox,\n projectId,\n }: {\n client?: APIClient;\n routes: SandboxRouteData[];\n session?: SessionMetaData;\n sandbox: SandboxMetaData;\n projectId?: string;\n }) {\n this._client = client ?? null;\n if (session) {\n this.session = new Session({ client: client!, routes, session });\n }\n this.sandbox = sandbox;\n this.projectId = projectId ?? \"\";\n }\n\n /**\n * Get the current session (the running VM) for this sandbox.\n *\n * @returns The {@link Session} instance.\n */\n currentSession(): Session {\n if (!this.session) {\n throw new Error(\"No active session. Run a command or call resume first.\");\n }\n return this.session;\n }\n\n /**\n * Resume this sandbox by creating a new session via `getSandbox`.\n */\n private async resume(signal?: AbortSignal): Promise<void> {\n if (!this.resumePromise) {\n this.resumePromise = this.doResume(signal).finally(() => {\n this.resumePromise = null;\n });\n }\n return this.resumePromise;\n }\n\n private async doResume(signal?: AbortSignal): Promise<void> {\n const client = await this.ensureClient();\n const response = await client.getSandbox({\n name: this.sandbox.name,\n projectId: this.projectId,\n resume: true,\n signal,\n });\n this.session = new Session({\n client,\n routes: response.json.routes,\n session: response.json.session,\n });\n }\n\n /**\n * Poll until the current session reaches a terminal state, then resume.\n */\n private async waitForStopAndResume(signal?: AbortSignal): Promise<void> {\n \"use step\";\n const client = await this.ensureClient();\n const pollingInterval = 500;\n let status = this.session!.status;\n\n while (status === \"stopping\" || status === \"snapshotting\") {\n await setTimeout(pollingInterval, undefined, { signal });\n const poll = await client.getSession({\n sessionId: this.session!.sessionId,\n signal,\n });\n this.session = new Session({\n client,\n routes: poll.json.routes,\n session: poll.json.session,\n });\n status = poll.json.session.status;\n }\n await this.resume(signal);\n }\n\n /**\n * Execute `fn`, and if the session is stopped/stopping/snapshotting, resume and retry.\n */\n private async withResume<T>(\n fn: () => Promise<T>,\n signal?: AbortSignal,\n ): Promise<T> {\n if (!this.session) {\n await this.resume(signal);\n }\n try {\n return await fn();\n } catch (err) {\n if (isSandboxStoppedError(err)) {\n await this.resume(signal);\n return fn();\n }\n if (isSandboxStoppingError(err) || isSandboxSnapshottingError(err)) {\n await this.waitForStopAndResume(signal);\n return fn();\n }\n throw err;\n }\n }\n\n /**\n * Start executing a command in this sandbox.\n *\n * @param command - The command to execute.\n * @param args - Arguments to pass to the command.\n * @param opts - Optional parameters.\n * @param opts.signal - An AbortSignal to cancel the command execution.\n * @returns A {@link CommandFinished} result once execution is done.\n */\n async runCommand(\n command: string,\n args?: string[],\n opts?: { signal?: AbortSignal },\n ): Promise<CommandFinished>;\n /**\n * Start executing a command in detached mode.\n *\n * @param params - The command parameters.\n * @returns A {@link Command} instance for the running command.\n */\n async runCommand(\n params: RunCommandParams & { detached: true },\n ): Promise<Command>;\n\n /**\n * Start executing a command in this sandbox.\n *\n * @param params - The command parameters.\n * @returns A {@link CommandFinished} result once execution is done.\n */\n\n async runCommand(params: RunCommandParams): Promise<CommandFinished>;\n\n async runCommand(\n commandOrParams: string | RunCommandParams,\n args?: string[],\n opts?: { signal?: AbortSignal },\n ): Promise<Command | CommandFinished> {\n \"use step\";\n const signal =\n typeof commandOrParams === \"string\"\n ? opts?.signal\n : commandOrParams.signal;\n return this.withResume(\n () => this.session!.runCommand(commandOrParams as any, args, opts),\n signal,\n );\n }\n\n /**\n * Internal helper to start a command in the sandbox.\n *\n * @param params - Command execution parameters.\n * @returns A {@link Command} or {@link CommandFinished}, depending on `detached`.\n * @internal\n */\n async getCommand(\n cmdId: string,\n opts?: { signal?: AbortSignal },\n ): Promise<Command> {\n \"use step\";\n return this.withResume(\n () => this.session!.getCommand(cmdId, opts),\n opts?.signal,\n );\n }\n\n /**\n * Create a directory in the filesystem of this sandbox.\n *\n * @param path - Path of the directory to create\n * @param opts - Optional parameters.\n * @param opts.signal - An AbortSignal to cancel the operation.\n */\n async mkDir(path: string, opts?: { signal?: AbortSignal }): Promise<void> {\n \"use step\";\n return this.withResume(\n () => this.session!.mkDir(path, opts),\n opts?.signal,\n );\n }\n\n /**\n * Read a file from the filesystem of this sandbox as a stream.\n *\n * @param file - File to read, with path and optional cwd\n * @param opts - Optional parameters.\n * @param opts.signal - An AbortSignal to cancel the operation.\n * @returns A promise that resolves to a ReadableStream containing the file contents, or null if file not found\n */\n async readFile(\n file: { path: string; cwd?: string },\n opts?: { signal?: AbortSignal },\n ): Promise<NodeJS.ReadableStream | null> {\n \"use step\";\n return this.withResume(\n () => this.session!.readFile(file, opts),\n opts?.signal,\n );\n }\n\n /**\n * Read a file from the filesystem of this sandbox as a Buffer.\n *\n * @param file - File to read, with path and optional cwd\n * @param opts - Optional parameters.\n * @param opts.signal - An AbortSignal to cancel the operation.\n * @returns A promise that resolves to the file contents as a Buffer, or null if file not found\n */\n async readFileToBuffer(\n file: { path: string; cwd?: string },\n opts?: { signal?: AbortSignal },\n ): Promise<Buffer | null> {\n \"use step\";\n return this.withResume(\n () => this.session!.readFileToBuffer(file, opts),\n opts?.signal,\n );\n }\n\n /**\n * Download a file from the sandbox to the local filesystem.\n *\n * @param src - Source file on the sandbox, with path and optional cwd\n * @param dst - Destination file on the local machine, with path and optional cwd\n * @param opts - Optional parameters.\n * @param opts.mkdirRecursive - If true, create parent directories for the destination if they don't exist.\n * @param opts.signal - An AbortSignal to cancel the operation.\n * @returns The absolute path to the written file, or null if the source file was not found\n */\n async downloadFile(\n src: { path: string; cwd?: string },\n dst: { path: string; cwd?: string },\n opts?: { mkdirRecursive?: boolean; signal?: AbortSignal },\n ): Promise<string | null> {\n \"use step\";\n return this.withResume(\n () => this.session!.downloadFile(src, dst, opts),\n opts?.signal,\n );\n }\n\n /**\n * Write files to the filesystem of this sandbox.\n * Defaults to writing to /vercel/sandbox unless an absolute path is specified.\n * Writes files using the `vercel-sandbox` user.\n *\n * @param files - Array of files with path, content, and optional mode (permissions)\n * @param opts - Optional parameters.\n * @param opts.signal - An AbortSignal to cancel the operation.\n * @returns A promise that resolves when the files are written\n *\n * @example\n * // Write an executable script\n * await sandbox.writeFiles([\n * { path: \"/usr/local/bin/myscript\", content: \"#!/bin/bash\\necho hello\", mode: 0o755 }\n * ]);\n */\n async writeFiles(\n files: {\n path: string;\n content: string | Uint8Array;\n mode?: number;\n }[],\n opts?: { signal?: AbortSignal },\n ) {\n \"use step\";\n return this.withResume(\n () => this.session!.writeFiles(files, opts),\n opts?.signal,\n );\n }\n\n /**\n * Get the public domain of a port of this sandbox.\n *\n * @param p - Port number to resolve\n * @returns A full domain (e.g. `https://subdomain.vercel.run`)\n * @throws If the port has no associated route\n */\n domain(p: number): string {\n return this.currentSession().domain(p);\n }\n\n /**\n * Stop the sandbox.\n *\n * @param opts - Optional parameters.\n * @param opts.signal - An AbortSignal to cancel the operation.\n * @param opts.blocking - If true, poll until the sandbox has fully stopped and return the final state.\n * @returns The sandbox at the time the stop was acknowledged, or after fully stopped if `blocking` is true.\n */\n async stop(opts?: {\n signal?: AbortSignal;\n blocking?: boolean;\n }): Promise<SandboxSnapshot> {\n \"use step\";\n if (!this.session) {\n throw new Error(\"No active session to stop.\");\n }\n return this.session.stop(opts);\n }\n\n /**\n * Update the network policy for this sandbox.\n *\n * @deprecated Use {@link Sandbox.update} instead.\n *\n * @param networkPolicy - The new network policy to apply.\n * @param opts - Optional parameters.\n * @param opts.signal - An AbortSignal to cancel the operation.\n * @returns A promise that resolves when the network policy is updated.\n *\n * @example\n * // Restrict to specific domains\n * await sandbox.updateNetworkPolicy({\n * allow: [\"*.npmjs.org\", \"github.com\"],\n * });\n *\n * @example\n * // Inject credentials with per-domain transformers\n * await sandbox.updateNetworkPolicy({\n * allow: {\n * \"ai-gateway.vercel.sh\": [{\n * transform: [{\n * headers: { authorization: \"Bearer ...\" }\n * }]\n * }],\n * \"*\": []\n * }\n * });\n *\n * @example\n * // Deny all network access\n * await sandbox.updateNetworkPolicy(\"deny-all\");\n */\n async updateNetworkPolicy(\n networkPolicy: NetworkPolicy,\n opts?: { signal?: AbortSignal },\n ): Promise<NetworkPolicy> {\n \"use step\";\n await this.withResume(\n () => this.session!.update({ networkPolicy: networkPolicy }, opts),\n opts?.signal,\n );\n\n return this.session!.networkPolicy!;\n }\n\n /**\n * Extend the timeout of the sandbox by the specified duration.\n *\n * This allows you to extend the lifetime of a sandbox up until the maximum\n * execution timeout for your plan.\n *\n * @param duration - The duration in milliseconds to extend the timeout by\n * @param opts - Optional parameters.\n * @param opts.signal - An AbortSignal to cancel the operation.\n * @returns A promise that resolves when the timeout is extended\n *\n * @example\n * const sandbox = await Sandbox.create({ timeout: ms('10m') });\n * // Extends timeout by 5 minutes, to a total of 15 minutes.\n * await sandbox.extendTimeout(ms('5m'));\n */\n async extendTimeout(\n duration: number,\n opts?: { signal?: AbortSignal },\n ): Promise<void> {\n \"use step\";\n return this.withResume(\n () => this.session!.extendTimeout(duration, opts),\n opts?.signal,\n );\n }\n\n /**\n * Create a snapshot from this currently running sandbox. New sandboxes can\n * then be created from this snapshot using {@link Sandbox.createFromSnapshot}.\n *\n * Note: this sandbox will be stopped as part of the snapshot creation process.\n *\n * @param opts - Optional parameters.\n * @param opts.expiration - Optional expiration time in milliseconds. Use 0 for no expiration at all.\n * @param opts.signal - An AbortSignal to cancel the operation.\n * @returns A promise that resolves to the Snapshot instance\n */\n async snapshot(opts?: {\n expiration?: number;\n signal?: AbortSignal;\n }): Promise<Snapshot> {\n \"use step\";\n return this.withResume(\n () => this.session!.snapshot(opts),\n opts?.signal,\n );\n }\n\n /**\n * Update the sandbox configuration.\n *\n * @param params - Fields to update.\n * @param opts - Optional abort signal.\n */\n async update(\n params: {\n persistent?: boolean;\n resources?: { vcpus?: number };\n timeout?: number;\n networkPolicy?: NetworkPolicy;\n tags?: Record<string, string>;\n snapshotExpiration?: number;\n },\n opts?: { signal?: AbortSignal },\n ): Promise<void> {\n \"use step\";\n const client = await this.ensureClient();\n let resources: { vcpus: number; memory: number } | undefined;\n if (params.resources?.vcpus) {\n resources = {\n vcpus: params.resources.vcpus,\n memory: params.resources.vcpus * 2048,\n };\n }\n\n // Update the sandbox config. This config will be used on the next session.\n const response = await client.updateSandbox({\n name: this.sandbox.name,\n projectId: this.projectId,\n persistent: params.persistent,\n resources,\n timeout: params.timeout,\n networkPolicy: params.networkPolicy,\n tags: params.tags,\n snapshotExpiration: params.snapshotExpiration,\n signal: opts?.signal,\n });\n this.sandbox = response.json.sandbox;\n\n // Update the current session config. This only applies to network policy.\n if (params.networkPolicy) {\n try {\n return await this.session?.update(\n { networkPolicy: params.networkPolicy },\n opts,\n );\n } catch (err) {\n if (isSandboxStoppedError(err) || isSandboxStoppingError(err)) {\n return;\n }\n throw err;\n }\n }\n }\n\n /**\n * Delete this sandbox.\n *\n * After deletion the instance becomes inert — all further API calls will\n * throw immediately.\n */\n async delete(opts?: { signal?: AbortSignal }): Promise<void> {\n \"use step\";\n const client = await this.ensureClient();\n await client.deleteSandbox({\n name: this.sandbox.name,\n projectId: this.projectId,\n signal: opts?.signal,\n });\n }\n\n /**\n * List sessions (VMs) that have been created for this sandbox.\n *\n * @param params - Optional pagination parameters.\n * @returns The list of sessions and pagination metadata.\n */\n async listSessions(params?: {\n limit?: number;\n cursor?: string;\n sortOrder?: \"asc\" | \"desc\";\n signal?: AbortSignal;\n }) {\n \"use step\";\n const client = await this.ensureClient();\n const response = await client.listSessions({\n projectId: this.projectId,\n name: this.sandbox.name,\n limit: params?.limit,\n cursor: params?.cursor,\n sortOrder: params?.sortOrder,\n signal: params?.signal,\n });\n return response.json;\n }\n\n /**\n * List snapshots that belong to this sandbox.\n *\n * @param params - Optional pagination parameters.\n * @returns The list of snapshots and pagination metadata.\n */\n async listSnapshots(params?: {\n limit?: number;\n cursor?: string;\n sortOrder?: \"asc\" | \"desc\";\n signal?: AbortSignal;\n }) {\n \"use step\";\n const client = await this.ensureClient();\n const response = await client.listSnapshots({\n projectId: this.projectId,\n name: this.sandbox.name,\n limit: params?.limit,\n cursor: params?.cursor,\n sortOrder: params?.sortOrder,\n signal: params?.signal,\n });\n return response.json;\n }\n}\n\n/**\n * A {@link Sandbox} that can automatically be disposed using a `await using` statement.\n *\n * @example\n * {\n * await using const sandbox = await Sandbox.create();\n * }\n * // Sandbox is automatically stopped here\n */\nclass DisposableSandbox extends Sandbox implements AsyncDisposable {\n async [Symbol.asyncDispose]() {\n await this.stop();\n }\n}\n"],"mappings":"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"} | ||
| {"version":3,"file":"sandbox.cjs","names":["APIError","getCredentials","APIClient","fromAPINetworkPolicy","WORKFLOW_SERIALIZE","WORKFLOW_DESERIALIZE","Session","getPrivateParams","resources: { vcpus: number; memory: number } | undefined"],"sources":["../src/sandbox.ts"],"sourcesContent":["import { WORKFLOW_DESERIALIZE, WORKFLOW_SERIALIZE } from \"@workflow/serde\";\nimport type {\n SessionMetaData,\n SandboxRouteData,\n SandboxMetaData,\n} from \"./api-client/index.js\";\nimport { APIClient } from \"./api-client/index.js\";\nimport { APIError } from \"./api-client/api-error.js\";\nimport { type Credentials, getCredentials } from \"./utils/get-credentials.js\";\nimport { getPrivateParams, type WithPrivate } from \"./utils/types.js\";\nimport type { WithFetchOptions } from \"./api-client/api-client.js\";\nimport type { RUNTIMES } from \"./constants.js\";\nimport { Session, type RunCommandParams } from \"./session.js\";\nimport type { Command, CommandFinished } from \"./command.js\";\nimport type { Snapshot } from \"./snapshot.js\";\nimport type { SandboxSnapshot } from \"./utils/sandbox-snapshot.js\";\nimport type { NetworkPolicy } from \"./network-policy.js\";\nimport { fromAPINetworkPolicy } from \"./utils/network-policy.js\";\nimport { setTimeout } from \"node:timers/promises\";\n\nexport type { NetworkPolicy };\n\n/** @inline */\nexport interface BaseCreateSandboxParams {\n /**\n * The name of the sandbox. If omitted, a random name will be generated.\n */\n name?: string;\n /**\n * The source of the sandbox.\n *\n * Omit this parameter start a sandbox without a source.\n *\n * For git sources:\n * - `depth`: Creates shallow clones with limited commit history (minimum: 1)\n * - `revision`: Clones and checks out a specific commit, branch, or tag\n */\n source?:\n | {\n type: \"git\";\n url: string;\n depth?: number;\n revision?: string;\n }\n | {\n type: \"git\";\n url: string;\n username: string;\n password: string;\n depth?: number;\n revision?: string;\n }\n | { type: \"tarball\"; url: string };\n /**\n * Array of port numbers to expose from the sandbox. Sandboxes can\n * expose up to 4 ports.\n */\n ports?: number[];\n /**\n * Timeout in milliseconds before the sandbox auto-terminates.\n */\n timeout?: number;\n /**\n * Resources to allocate to the sandbox.\n *\n * Your sandbox will get the amount of vCPUs you specify here and\n * 2048 MB of memory per vCPU.\n */\n resources?: { vcpus: number };\n /**\n * The runtime of the sandbox, currently only `node24`, `node22` and `python3.13` are supported.\n * If not specified, the default runtime `node24` will be used.\n */\n runtime?: RUNTIMES | (string & {});\n /**\n * Network policy to define network restrictions for the sandbox.\n * Defaults to full internet access if not specified.\n */\n networkPolicy?: NetworkPolicy;\n /**\n * Default environment variables for the sandbox.\n * These are inherited by all commands unless overridden with\n * the `env` option in `runCommand`.\n *\n * @example\n * const sandbox = await Sandbox.create({\n * env: { NODE_ENV: \"production\", API_KEY: \"secret\" },\n * });\n * // All commands will have NODE_ENV and API_KEY set\n * await sandbox.runCommand(\"node\", [\"app.js\"]);\n */\n env?: Record<string, string>;\n /**\n * Key-value tags to associate with the sandbox. Maximum 5 tags.\n * @example { env: \"staging\", team: \"infra\" }\n */\n tags?: Record<string, string>;\n\n /**\n * An AbortSignal to cancel sandbox creation.\n */\n signal?: AbortSignal;\n /**\n * Enable or disable automatic restore of the filesystem between sessions.\n */\n persistent?: boolean;\n /**\n * Default snapshot expiration in milliseconds.\n * When set, snapshots created for this sandbox will expire after this duration.\n * Use `0` for no expiration.\n */\n snapshotExpiration?: number;\n /**\n * Called when the sandbox session is resumed (e.g., after a snapshot restore).\n * Use this to re-warm caches, restore transient state, or run other setup logic.\n */\n onResume?: (sandbox: Sandbox) => Promise<void>;\n}\n\nexport type CreateSandboxParams =\n | BaseCreateSandboxParams\n | (Omit<BaseCreateSandboxParams, \"runtime\" | \"source\"> & {\n source: { type: \"snapshot\"; snapshotId: string };\n });\n\n/** @inline */\ninterface GetSandboxParams {\n /**\n * The name of the sandbox.\n */\n name: string;\n /**\n * Whether to resume an existing session. Defaults to true.\n */\n resume?: boolean;\n /**\n * An AbortSignal to cancel the operation.\n */\n signal?: AbortSignal;\n /**\n * Called when the sandbox session is resumed (e.g., after a snapshot restore).\n * Use this to re-warm caches, restore transient state, or run other setup logic.\n */\n onResume?: (sandbox: Sandbox) => Promise<void>;\n}\n\nfunction isSandboxStoppedError(err: unknown): boolean {\n return err instanceof APIError && err.response.status === 410;\n}\n\nfunction isSandboxStoppingError(err: unknown): boolean {\n return (\n err instanceof APIError &&\n err.response.status === 422 &&\n (err.json as any)?.error?.code === \"sandbox_stopping\"\n );\n}\n\nfunction isSandboxSnapshottingError(err: unknown): boolean {\n return (\n err instanceof APIError &&\n err.response.status === 422 &&\n (err.json as any)?.error?.code === \"sandbox_snapshotting\"\n );\n}\n\n/**\n * Serialized representation of a Sandbox for @workflow/serde.\n * Fields `metadata` and `routes` are the original wire format from main.\n * Fields `sandboxMetadata` and `projectId` are added for named-sandboxes.\n */\nexport interface SerializedSandbox {\n metadata: SandboxSnapshot;\n routes: SandboxRouteData[];\n sandboxMetadata?: SandboxMetaData;\n projectId?: string;\n}\n\n// ============================================================================\n// Sandbox class\n// ============================================================================\n\n/**\n * A Sandbox is a persistent, isolated Linux MicroVMs to run commands in.\n * Use {@link Sandbox.create} or {@link Sandbox.get} to construct.\n * @hideconstructor\n */\nexport class Sandbox {\n private _client: APIClient | null = null;\n private readonly projectId: string;\n\n /**\n * In-flight resume promise, used to deduplicate concurrent resume calls.\n */\n private resumePromise: Promise<void> | null = null;\n\n /**\n * Internal Session instance for the current VM.\n */\n private session: Session | undefined;\n\n /**\n * Internal metadata about the sandbox.\n */\n private sandbox: SandboxMetaData;\n\n /**\n * Hook that will be executed when a new session is created during resume.\n */\n private readonly onResume?: (sandbox: Sandbox) => Promise<void>;\n\n /**\n * Lazily resolve credentials and construct an API client.\n * @internal\n */\n private async ensureClient(): Promise<APIClient> {\n \"use step\";\n if (this._client) return this._client;\n const credentials = await getCredentials();\n this._client = new APIClient({\n teamId: credentials.teamId,\n token: credentials.token,\n });\n return this._client;\n }\n\n /**\n * The name of this sandbox.\n */\n public get name(): string {\n return this.sandbox.name;\n }\n\n /**\n * Routes from ports to subdomains.\n * @hidden\n */\n public get routes(): SandboxRouteData[] {\n return this.currentSession().routes;\n }\n\n /**\n * Whether the sandbox persists the state.\n */\n public get persistent(): boolean {\n return this.sandbox.persistent;\n }\n\n /**\n * The region this sandbox runs in.\n */\n public get region(): string | undefined {\n return this.sandbox.region;\n }\n\n /**\n * Number of virtual CPUs allocated.\n */\n public get vcpus(): number | undefined {\n return this.sandbox.vcpus;\n }\n\n /**\n * Memory allocated in MB.\n */\n public get memory(): number | undefined {\n return this.sandbox.memory;\n }\n\n /** Runtime identifier (e.g. \"node24\", \"python3.13\"). */\n public get runtime(): string | undefined {\n return this.sandbox.runtime;\n }\n\n /**\n * Cumulative egress bytes across all sessions.\n */\n public get totalEgressBytes(): number | undefined {\n return this.sandbox.totalEgressBytes;\n }\n\n /**\n * Cumulative ingress bytes across all sessions.\n */\n public get totalIngressBytes(): number | undefined {\n return this.sandbox.totalIngressBytes;\n }\n\n /**\n * Cumulative active CPU duration in milliseconds across all sessions.\n */\n public get totalActiveCpuDurationMs(): number | undefined {\n return this.sandbox.totalActiveCpuDurationMs;\n }\n\n /**\n * Cumulative wall-clock duration in milliseconds across all sessions.\n */\n public get totalDurationMs(): number | undefined {\n return this.sandbox.totalDurationMs;\n }\n\n /**\n * When this sandbox was last updated.\n */\n public get updatedAt(): Date {\n return new Date(this.sandbox.updatedAt);\n }\n\n /**\n * When the sandbox status was last updated.\n */\n public get statusUpdatedAt(): Date | undefined {\n return this.sandbox.statusUpdatedAt\n ? new Date(this.sandbox.statusUpdatedAt)\n : undefined;\n }\n\n /**\n * When this sandbox was created.\n */\n public get createdAt(): Date {\n return new Date(this.sandbox.createdAt);\n }\n\n /**\n * Interactive port.\n */\n public get interactivePort(): number | undefined {\n return this.currentSession().interactivePort;\n }\n\n /**\n * The status of the current session.\n */\n public get status(): SessionMetaData[\"status\"] {\n return this.currentSession().status;\n }\n\n /**\n * The default timeout of this sandbox in milliseconds.\n */\n public get timeout(): number | undefined {\n return this.sandbox.timeout;\n }\n\n /**\n * Key-value tags attached to the sandbox.\n */\n public get tags(): Record<string, string> | undefined {\n return this.sandbox.tags;\n }\n\n /**\n * The default network policy of this sandbox.\n */\n public get networkPolicy(): NetworkPolicy | undefined {\n return this.sandbox.networkPolicy\n ? fromAPINetworkPolicy(this.sandbox.networkPolicy)\n : undefined;\n }\n\n /**\n * If the session was created from a snapshot, the ID of that snapshot.\n */\n public get sourceSnapshotId(): string | undefined {\n return this.currentSession().sourceSnapshotId;\n }\n\n /**\n * The current snapshot ID of this sandbox, if any.\n */\n public get currentSnapshotId(): string | undefined {\n return this.sandbox.currentSnapshotId;\n }\n\n /**\n * The default snapshot expiration in milliseconds, if set.\n */\n public get snapshotExpiration(): number | undefined {\n return this.sandbox.snapshotExpiration;\n }\n\n /**\n * The amount of CPU used by the session. Only reported once the VM is stopped.\n */\n public get activeCpuUsageMs(): number | undefined {\n return this.currentSession().activeCpuUsageMs;\n }\n\n /**\n * The amount of network data used by the session. Only reported once the VM is stopped.\n */\n public get networkTransfer():\n | { ingress: number; egress: number }\n | undefined {\n return this.currentSession().networkTransfer;\n }\n\n /**\n * Allow to get a list of sandboxes for a team narrowed to the given params.\n * It returns both the sandboxes and the pagination metadata to allow getting\n * the next page of results.\n */\n static async list(\n params?: Partial<Parameters<APIClient[\"listSandboxes\"]>[0]> &\n Partial<Credentials> &\n WithFetchOptions,\n ) {\n \"use step\";\n const credentials = await getCredentials(params);\n const client = new APIClient({\n teamId: credentials.teamId,\n token: credentials.token,\n fetch: params?.fetch,\n });\n const response = await client.listSandboxes({\n ...credentials,\n ...params,\n });\n return response.json;\n }\n\n /**\n * Serialize a Sandbox instance to plain data for @workflow/serde.\n *\n * @param instance - The Sandbox instance to serialize\n * @returns A plain object containing sandbox metadata and routes\n */\n static [WORKFLOW_SERIALIZE](instance: Sandbox): SerializedSandbox {\n return {\n metadata: instance.session?._sessionSnapshot!,\n routes: instance.session?.routes ?? [],\n sandboxMetadata: instance.sandbox,\n projectId: instance.projectId,\n };\n }\n\n /**\n * Deserialize a Sandbox from serialized snapshot data.\n *\n * The deserialized instance uses the serialized metadata synchronously and\n * lazily creates an API client only when methods perform API requests.\n *\n * @param data - The serialized sandbox data\n * @returns The reconstructed Sandbox instance\n */\n static [WORKFLOW_DESERIALIZE](data: SerializedSandbox): Sandbox {\n const sandbox = new Sandbox({\n sandbox: data.sandboxMetadata!,\n routes: data.routes,\n projectId: data.projectId,\n });\n if (data.metadata) {\n sandbox.session = new Session({ routes: data.routes, snapshot: data.metadata });\n }\n return sandbox;\n }\n\n /**\n * Create a new sandbox.\n *\n * @param params - Creation parameters and optional credentials.\n * @returns A promise resolving to the created {@link Sandbox}.\n * @example\n * <caption>Create a sandbox with default options</caption>\n * const sandbox = await Sandbox.create();\n *\n * @example\n * <caption>Create a sandbox and drop it in the end of the block</caption>\n * async function fn() {\n * await using const sandbox = await Sandbox.create();\n * // Sandbox automatically stopped at the end of the lexical scope\n * }\n */\n static async create(\n params?: WithPrivate<\n CreateSandboxParams | (CreateSandboxParams & Credentials)\n > &\n WithFetchOptions,\n ): Promise<Sandbox & AsyncDisposable> {\n \"use step\";\n const credentials = await getCredentials(params);\n const client = new APIClient({\n teamId: credentials.teamId,\n token: credentials.token,\n fetch: params?.fetch,\n });\n\n const privateParams = getPrivateParams(params);\n const response = await client.createSandbox({\n source: params?.source,\n projectId: credentials.projectId,\n ports: params?.ports ?? [],\n timeout: params?.timeout,\n resources: params?.resources,\n runtime: params && \"runtime\" in params ? params?.runtime : undefined,\n networkPolicy: params?.networkPolicy,\n env: params?.env,\n tags: params?.tags,\n snapshotExpiration: params?.snapshotExpiration,\n signal: params?.signal,\n name: params?.name,\n persistent: params?.persistent,\n ...privateParams,\n });\n\n return new DisposableSandbox({\n client,\n session: response.json.session,\n sandbox: response.json.sandbox,\n routes: response.json.routes,\n projectId: credentials.projectId,\n onResume: params?.onResume,\n });\n }\n\n /**\n * Retrieve an existing sandbox and resume its session.\n *\n * @param params - Get parameters and optional credentials.\n * @returns A promise resolving to the {@link Sandbox}.\n */\n static async get(\n params: WithPrivate<GetSandboxParams | (GetSandboxParams & Credentials)> &\n WithFetchOptions,\n ): Promise<Sandbox> {\n \"use step\";\n const credentials = await getCredentials(params);\n const client = new APIClient({\n teamId: credentials.teamId,\n token: credentials.token,\n fetch: params.fetch,\n });\n\n const privateParams = getPrivateParams(params);\n const response = await client.getSandbox({\n name: params.name,\n projectId: credentials.projectId,\n resume: params.resume,\n signal: params.signal,\n ...privateParams,\n });\n\n const sandbox = new Sandbox({\n client,\n session: response.json.session,\n sandbox: response.json.sandbox,\n routes: response.json.routes,\n projectId: credentials.projectId,\n onResume: params.onResume,\n });\n\n if (response.json.resumed && params.onResume) {\n await params.onResume(sandbox);\n }\n\n return sandbox;\n }\n\n /**\n * Create a new Sandbox instance.\n *\n * @param params.client - Optional API client. If not provided, will be lazily created using global credentials.\n * @param params.routes - Port-to-subdomain mappings for exposed ports\n * @param params.sandbox - Sandbox snapshot metadata\n */\n constructor({\n client,\n routes,\n session,\n sandbox,\n projectId,\n onResume,\n }: {\n client?: APIClient;\n routes: SandboxRouteData[];\n session?: SessionMetaData;\n sandbox: SandboxMetaData;\n projectId?: string;\n onResume?: (sandbox: Sandbox) => Promise<void>;\n }) {\n this._client = client ?? null;\n if (session) {\n this.session = new Session({ client: client!, routes, session });\n }\n this.sandbox = sandbox;\n this.projectId = projectId ?? \"\";\n this.onResume = onResume;\n }\n\n /**\n * Get the current session (the running VM) for this sandbox.\n *\n * @returns The {@link Session} instance.\n */\n currentSession(): Session {\n if (!this.session) {\n throw new Error(\"No active session. Run a command or call resume first.\");\n }\n return this.session;\n }\n\n /**\n * Resume this sandbox by creating a new session via `getSandbox`.\n */\n private async resume(signal?: AbortSignal): Promise<void> {\n if (!this.resumePromise) {\n this.resumePromise = this.doResume(signal).finally(() => {\n this.resumePromise = null;\n });\n }\n return this.resumePromise;\n }\n\n private async doResume(signal?: AbortSignal): Promise<void> {\n const client = await this.ensureClient();\n const response = await client.getSandbox({\n name: this.sandbox.name,\n projectId: this.projectId,\n resume: true,\n signal,\n });\n this.session = new Session({\n client,\n routes: response.json.routes,\n session: response.json.session,\n });\n if (this.onResume && response.json.resumed) {\n await this.onResume(this);\n }\n }\n\n /**\n * Poll until the current session reaches a terminal state, then resume.\n */\n private async waitForStopAndResume(signal?: AbortSignal): Promise<void> {\n \"use step\";\n const client = await this.ensureClient();\n const pollingInterval = 500;\n let status = this.session!.status;\n\n while (status === \"stopping\" || status === \"snapshotting\") {\n await setTimeout(pollingInterval, undefined, { signal });\n const poll = await client.getSession({\n sessionId: this.session!.sessionId,\n signal,\n });\n this.session = new Session({\n client,\n routes: poll.json.routes,\n session: poll.json.session,\n });\n status = poll.json.session.status;\n }\n await this.resume(signal);\n }\n\n /**\n * Execute `fn`, and if the session is stopped/stopping/snapshotting, resume and retry.\n */\n private async withResume<T>(\n fn: () => Promise<T>,\n signal?: AbortSignal,\n ): Promise<T> {\n if (!this.session) {\n await this.resume(signal);\n }\n try {\n return await fn();\n } catch (err) {\n if (isSandboxStoppedError(err)) {\n await this.resume(signal);\n return fn();\n }\n if (isSandboxStoppingError(err) || isSandboxSnapshottingError(err)) {\n await this.waitForStopAndResume(signal);\n return fn();\n }\n throw err;\n }\n }\n\n /**\n * Start executing a command in this sandbox.\n *\n * @param command - The command to execute.\n * @param args - Arguments to pass to the command.\n * @param opts - Optional parameters.\n * @param opts.signal - An AbortSignal to cancel the command execution.\n * @returns A {@link CommandFinished} result once execution is done.\n */\n async runCommand(\n command: string,\n args?: string[],\n opts?: { signal?: AbortSignal },\n ): Promise<CommandFinished>;\n /**\n * Start executing a command in detached mode.\n *\n * @param params - The command parameters.\n * @returns A {@link Command} instance for the running command.\n */\n async runCommand(\n params: RunCommandParams & { detached: true },\n ): Promise<Command>;\n\n /**\n * Start executing a command in this sandbox.\n *\n * @param params - The command parameters.\n * @returns A {@link CommandFinished} result once execution is done.\n */\n\n async runCommand(params: RunCommandParams): Promise<CommandFinished>;\n\n async runCommand(\n commandOrParams: string | RunCommandParams,\n args?: string[],\n opts?: { signal?: AbortSignal },\n ): Promise<Command | CommandFinished> {\n \"use step\";\n const signal =\n typeof commandOrParams === \"string\"\n ? opts?.signal\n : commandOrParams.signal;\n return this.withResume(\n () => this.session!.runCommand(commandOrParams as any, args, opts),\n signal,\n );\n }\n\n /**\n * Internal helper to start a command in the sandbox.\n *\n * @param params - Command execution parameters.\n * @returns A {@link Command} or {@link CommandFinished}, depending on `detached`.\n * @internal\n */\n async getCommand(\n cmdId: string,\n opts?: { signal?: AbortSignal },\n ): Promise<Command> {\n \"use step\";\n return this.withResume(\n () => this.session!.getCommand(cmdId, opts),\n opts?.signal,\n );\n }\n\n /**\n * Create a directory in the filesystem of this sandbox.\n *\n * @param path - Path of the directory to create\n * @param opts - Optional parameters.\n * @param opts.signal - An AbortSignal to cancel the operation.\n */\n async mkDir(path: string, opts?: { signal?: AbortSignal }): Promise<void> {\n \"use step\";\n return this.withResume(\n () => this.session!.mkDir(path, opts),\n opts?.signal,\n );\n }\n\n /**\n * Read a file from the filesystem of this sandbox as a stream.\n *\n * @param file - File to read, with path and optional cwd\n * @param opts - Optional parameters.\n * @param opts.signal - An AbortSignal to cancel the operation.\n * @returns A promise that resolves to a ReadableStream containing the file contents, or null if file not found\n */\n async readFile(\n file: { path: string; cwd?: string },\n opts?: { signal?: AbortSignal },\n ): Promise<NodeJS.ReadableStream | null> {\n \"use step\";\n return this.withResume(\n () => this.session!.readFile(file, opts),\n opts?.signal,\n );\n }\n\n /**\n * Read a file from the filesystem of this sandbox as a Buffer.\n *\n * @param file - File to read, with path and optional cwd\n * @param opts - Optional parameters.\n * @param opts.signal - An AbortSignal to cancel the operation.\n * @returns A promise that resolves to the file contents as a Buffer, or null if file not found\n */\n async readFileToBuffer(\n file: { path: string; cwd?: string },\n opts?: { signal?: AbortSignal },\n ): Promise<Buffer | null> {\n \"use step\";\n return this.withResume(\n () => this.session!.readFileToBuffer(file, opts),\n opts?.signal,\n );\n }\n\n /**\n * Download a file from the sandbox to the local filesystem.\n *\n * @param src - Source file on the sandbox, with path and optional cwd\n * @param dst - Destination file on the local machine, with path and optional cwd\n * @param opts - Optional parameters.\n * @param opts.mkdirRecursive - If true, create parent directories for the destination if they don't exist.\n * @param opts.signal - An AbortSignal to cancel the operation.\n * @returns The absolute path to the written file, or null if the source file was not found\n */\n async downloadFile(\n src: { path: string; cwd?: string },\n dst: { path: string; cwd?: string },\n opts?: { mkdirRecursive?: boolean; signal?: AbortSignal },\n ): Promise<string | null> {\n \"use step\";\n return this.withResume(\n () => this.session!.downloadFile(src, dst, opts),\n opts?.signal,\n );\n }\n\n /**\n * Write files to the filesystem of this sandbox.\n * Defaults to writing to /vercel/sandbox unless an absolute path is specified.\n * Writes files using the `vercel-sandbox` user.\n *\n * @param files - Array of files with path, content, and optional mode (permissions)\n * @param opts - Optional parameters.\n * @param opts.signal - An AbortSignal to cancel the operation.\n * @returns A promise that resolves when the files are written\n *\n * @example\n * // Write an executable script\n * await sandbox.writeFiles([\n * { path: \"/usr/local/bin/myscript\", content: \"#!/bin/bash\\necho hello\", mode: 0o755 }\n * ]);\n */\n async writeFiles(\n files: {\n path: string;\n content: string | Uint8Array;\n mode?: number;\n }[],\n opts?: { signal?: AbortSignal },\n ) {\n \"use step\";\n return this.withResume(\n () => this.session!.writeFiles(files, opts),\n opts?.signal,\n );\n }\n\n /**\n * Get the public domain of a port of this sandbox.\n *\n * @param p - Port number to resolve\n * @returns A full domain (e.g. `https://subdomain.vercel.run`)\n * @throws If the port has no associated route\n */\n domain(p: number): string {\n return this.currentSession().domain(p);\n }\n\n /**\n * Stop the sandbox.\n *\n * @param opts - Optional parameters.\n * @param opts.signal - An AbortSignal to cancel the operation.\n * @param opts.blocking - If true, poll until the sandbox has fully stopped and return the final state.\n * @returns The sandbox at the time the stop was acknowledged, or after fully stopped if `blocking` is true.\n */\n async stop(opts?: {\n signal?: AbortSignal;\n blocking?: boolean;\n }): Promise<SandboxSnapshot> {\n \"use step\";\n if (!this.session) {\n throw new Error(\"No active session to stop.\");\n }\n return this.session.stop(opts);\n }\n\n /**\n * Update the network policy for this sandbox.\n *\n * @deprecated Use {@link Sandbox.update} instead.\n *\n * @param networkPolicy - The new network policy to apply.\n * @param opts - Optional parameters.\n * @param opts.signal - An AbortSignal to cancel the operation.\n * @returns A promise that resolves when the network policy is updated.\n *\n * @example\n * // Restrict to specific domains\n * await sandbox.updateNetworkPolicy({\n * allow: [\"*.npmjs.org\", \"github.com\"],\n * });\n *\n * @example\n * // Inject credentials with per-domain transformers\n * await sandbox.updateNetworkPolicy({\n * allow: {\n * \"ai-gateway.vercel.sh\": [{\n * transform: [{\n * headers: { authorization: \"Bearer ...\" }\n * }]\n * }],\n * \"*\": []\n * }\n * });\n *\n * @example\n * // Deny all network access\n * await sandbox.updateNetworkPolicy(\"deny-all\");\n */\n async updateNetworkPolicy(\n networkPolicy: NetworkPolicy,\n opts?: { signal?: AbortSignal },\n ): Promise<NetworkPolicy> {\n \"use step\";\n await this.withResume(\n () => this.session!.update({ networkPolicy: networkPolicy }, opts),\n opts?.signal,\n );\n\n return this.session!.networkPolicy!;\n }\n\n /**\n * Extend the timeout of the sandbox by the specified duration.\n *\n * This allows you to extend the lifetime of a sandbox up until the maximum\n * execution timeout for your plan.\n *\n * @param duration - The duration in milliseconds to extend the timeout by\n * @param opts - Optional parameters.\n * @param opts.signal - An AbortSignal to cancel the operation.\n * @returns A promise that resolves when the timeout is extended\n *\n * @example\n * const sandbox = await Sandbox.create({ timeout: ms('10m') });\n * // Extends timeout by 5 minutes, to a total of 15 minutes.\n * await sandbox.extendTimeout(ms('5m'));\n */\n async extendTimeout(\n duration: number,\n opts?: { signal?: AbortSignal },\n ): Promise<void> {\n \"use step\";\n return this.withResume(\n () => this.session!.extendTimeout(duration, opts),\n opts?.signal,\n );\n }\n\n /**\n * Create a snapshot from this currently running sandbox. New sandboxes can\n * then be created from this snapshot using {@link Sandbox.createFromSnapshot}.\n *\n * Note: this sandbox will be stopped as part of the snapshot creation process.\n *\n * @param opts - Optional parameters.\n * @param opts.expiration - Optional expiration time in milliseconds. Use 0 for no expiration at all.\n * @param opts.signal - An AbortSignal to cancel the operation.\n * @returns A promise that resolves to the Snapshot instance\n */\n async snapshot(opts?: {\n expiration?: number;\n signal?: AbortSignal;\n }): Promise<Snapshot> {\n \"use step\";\n return this.withResume(\n () => this.session!.snapshot(opts),\n opts?.signal,\n );\n }\n\n /**\n * Update the sandbox configuration.\n *\n * @param params - Fields to update.\n * @param opts - Optional abort signal.\n */\n async update(\n params: {\n persistent?: boolean;\n resources?: { vcpus?: number };\n timeout?: number;\n networkPolicy?: NetworkPolicy;\n tags?: Record<string, string>;\n snapshotExpiration?: number;\n },\n opts?: { signal?: AbortSignal },\n ): Promise<void> {\n \"use step\";\n const client = await this.ensureClient();\n let resources: { vcpus: number; memory: number } | undefined;\n if (params.resources?.vcpus) {\n resources = {\n vcpus: params.resources.vcpus,\n memory: params.resources.vcpus * 2048,\n };\n }\n\n // Update the sandbox config. This config will be used on the next session.\n const response = await client.updateSandbox({\n name: this.sandbox.name,\n projectId: this.projectId,\n persistent: params.persistent,\n resources,\n timeout: params.timeout,\n networkPolicy: params.networkPolicy,\n tags: params.tags,\n snapshotExpiration: params.snapshotExpiration,\n signal: opts?.signal,\n });\n this.sandbox = response.json.sandbox;\n\n // Update the current session config. This only applies to network policy.\n if (params.networkPolicy) {\n try {\n return await this.session?.update(\n { networkPolicy: params.networkPolicy },\n opts,\n );\n } catch (err) {\n if (isSandboxStoppedError(err) || isSandboxStoppingError(err)) {\n return;\n }\n throw err;\n }\n }\n }\n\n /**\n * Delete this sandbox.\n *\n * After deletion the instance becomes inert — all further API calls will\n * throw immediately.\n */\n async delete(opts?: { signal?: AbortSignal }): Promise<void> {\n \"use step\";\n const client = await this.ensureClient();\n await client.deleteSandbox({\n name: this.sandbox.name,\n projectId: this.projectId,\n signal: opts?.signal,\n });\n }\n\n /**\n * List sessions (VMs) that have been created for this sandbox.\n *\n * @param params - Optional pagination parameters.\n * @returns The list of sessions and pagination metadata.\n */\n async listSessions(params?: {\n limit?: number;\n cursor?: string;\n sortOrder?: \"asc\" | \"desc\";\n signal?: AbortSignal;\n }) {\n \"use step\";\n const client = await this.ensureClient();\n const response = await client.listSessions({\n projectId: this.projectId,\n name: this.sandbox.name,\n limit: params?.limit,\n cursor: params?.cursor,\n sortOrder: params?.sortOrder,\n signal: params?.signal,\n });\n return response.json;\n }\n\n /**\n * List snapshots that belong to this sandbox.\n *\n * @param params - Optional pagination parameters.\n * @returns The list of snapshots and pagination metadata.\n */\n async listSnapshots(params?: {\n limit?: number;\n cursor?: string;\n sortOrder?: \"asc\" | \"desc\";\n signal?: AbortSignal;\n }) {\n \"use step\";\n const client = await this.ensureClient();\n const response = await client.listSnapshots({\n projectId: this.projectId,\n name: this.sandbox.name,\n limit: params?.limit,\n cursor: params?.cursor,\n sortOrder: params?.sortOrder,\n signal: params?.signal,\n });\n return response.json;\n }\n}\n\n/**\n * A {@link Sandbox} that can automatically be disposed using a `await using` statement.\n *\n * @example\n * {\n * await using const sandbox = await Sandbox.create();\n * }\n * // Sandbox is automatically stopped here\n */\nclass DisposableSandbox extends Sandbox implements AsyncDisposable {\n async [Symbol.asyncDispose]() {\n await this.stop();\n }\n}\n"],"mappings":"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"} |
+17
-1
@@ -106,2 +106,7 @@ import { SandboxMetaData, SandboxRouteData, SessionMetaData } from "./api-client/validators.cjs"; | ||
| snapshotExpiration?: number; | ||
| /** | ||
| * Called when the sandbox session is resumed (e.g., after a snapshot restore). | ||
| * Use this to re-warm caches, restore transient state, or run other setup logic. | ||
| */ | ||
| onResume?: (sandbox: Sandbox) => Promise<void>; | ||
| } | ||
@@ -128,2 +133,7 @@ type CreateSandboxParams = BaseCreateSandboxParams | (Omit<BaseCreateSandboxParams, "runtime" | "source"> & { | ||
| signal?: AbortSignal; | ||
| /** | ||
| * Called when the sandbox session is resumed (e.g., after a snapshot restore). | ||
| * Use this to re-warm caches, restore transient state, or run other setup logic. | ||
| */ | ||
| onResume?: (sandbox: Sandbox) => Promise<void>; | ||
| } | ||
@@ -162,2 +172,6 @@ /** | ||
| /** | ||
| * Hook that will be executed when a new session is created during resume. | ||
| */ | ||
| private readonly onResume?; | ||
| /** | ||
| * Lazily resolve credentials and construct an API client. | ||
@@ -374,3 +388,4 @@ * @internal | ||
| sandbox, | ||
| projectId | ||
| projectId, | ||
| onResume | ||
| }: { | ||
@@ -382,2 +397,3 @@ client?: APIClient; | ||
| projectId?: string; | ||
| onResume?: (sandbox: Sandbox) => Promise<void>; | ||
| }); | ||
@@ -384,0 +400,0 @@ /** |
+17
-1
@@ -107,2 +107,7 @@ import { SandboxMetaData, SandboxRouteData, SessionMetaData } from "./api-client/validators.js"; | ||
| snapshotExpiration?: number; | ||
| /** | ||
| * Called when the sandbox session is resumed (e.g., after a snapshot restore). | ||
| * Use this to re-warm caches, restore transient state, or run other setup logic. | ||
| */ | ||
| onResume?: (sandbox: Sandbox) => Promise<void>; | ||
| } | ||
@@ -129,2 +134,7 @@ type CreateSandboxParams = BaseCreateSandboxParams | (Omit<BaseCreateSandboxParams, "runtime" | "source"> & { | ||
| signal?: AbortSignal; | ||
| /** | ||
| * Called when the sandbox session is resumed (e.g., after a snapshot restore). | ||
| * Use this to re-warm caches, restore transient state, or run other setup logic. | ||
| */ | ||
| onResume?: (sandbox: Sandbox) => Promise<void>; | ||
| } | ||
@@ -163,2 +173,6 @@ /** | ||
| /** | ||
| * Hook that will be executed when a new session is created during resume. | ||
| */ | ||
| private readonly onResume?; | ||
| /** | ||
| * Lazily resolve credentials and construct an API client. | ||
@@ -375,3 +389,4 @@ * @internal | ||
| sandbox, | ||
| projectId | ||
| projectId, | ||
| onResume | ||
| }: { | ||
@@ -383,2 +398,3 @@ client?: APIClient; | ||
| projectId?: string; | ||
| onResume?: (sandbox: Sandbox) => Promise<void>; | ||
| }); | ||
@@ -385,0 +401,0 @@ /** |
+10
-4
@@ -282,3 +282,4 @@ import { APIError } from "./api-client/api-error.js"; | ||
| routes: response.json.routes, | ||
| projectId: credentials.projectId | ||
| projectId: credentials.projectId, | ||
| onResume: params?.onResume | ||
| }); | ||
@@ -308,3 +309,3 @@ } | ||
| }); | ||
| return new Sandbox({ | ||
| const sandbox = new Sandbox({ | ||
| client, | ||
@@ -314,4 +315,7 @@ session: response.json.session, | ||
| routes: response.json.routes, | ||
| projectId: credentials.projectId | ||
| projectId: credentials.projectId, | ||
| onResume: params.onResume | ||
| }); | ||
| if (response.json.resumed && params.onResume) await params.onResume(sandbox); | ||
| return sandbox; | ||
| } | ||
@@ -325,3 +329,3 @@ /** | ||
| */ | ||
| constructor({ client, routes, session, sandbox, projectId }) { | ||
| constructor({ client, routes, session, sandbox, projectId, onResume }) { | ||
| this._client = null; | ||
@@ -337,2 +341,3 @@ this.resumePromise = null; | ||
| this.projectId = projectId ?? ""; | ||
| this.onResume = onResume; | ||
| } | ||
@@ -370,2 +375,3 @@ /** | ||
| }); | ||
| if (this.onResume && response.json.resumed) await this.onResume(this); | ||
| } | ||
@@ -372,0 +378,0 @@ /** |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"sandbox.js","names":["resources: { vcpus: number; memory: number } | undefined"],"sources":["../src/sandbox.ts"],"sourcesContent":["import { WORKFLOW_DESERIALIZE, WORKFLOW_SERIALIZE } from \"@workflow/serde\";\nimport type {\n SessionMetaData,\n SandboxRouteData,\n SandboxMetaData,\n} from \"./api-client/index.js\";\nimport { APIClient } from \"./api-client/index.js\";\nimport { APIError } from \"./api-client/api-error.js\";\nimport { type Credentials, getCredentials } from \"./utils/get-credentials.js\";\nimport { getPrivateParams, type WithPrivate } from \"./utils/types.js\";\nimport type { WithFetchOptions } from \"./api-client/api-client.js\";\nimport type { RUNTIMES } from \"./constants.js\";\nimport { Session, type RunCommandParams } from \"./session.js\";\nimport type { Command, CommandFinished } from \"./command.js\";\nimport type { Snapshot } from \"./snapshot.js\";\nimport type { SandboxSnapshot } from \"./utils/sandbox-snapshot.js\";\nimport type { NetworkPolicy } from \"./network-policy.js\";\nimport { fromAPINetworkPolicy } from \"./utils/network-policy.js\";\nimport { setTimeout } from \"node:timers/promises\";\n\nexport type { NetworkPolicy };\n\n/** @inline */\nexport interface BaseCreateSandboxParams {\n /**\n * The name of the sandbox. If omitted, a random name will be generated.\n */\n name?: string;\n /**\n * The source of the sandbox.\n *\n * Omit this parameter start a sandbox without a source.\n *\n * For git sources:\n * - `depth`: Creates shallow clones with limited commit history (minimum: 1)\n * - `revision`: Clones and checks out a specific commit, branch, or tag\n */\n source?:\n | {\n type: \"git\";\n url: string;\n depth?: number;\n revision?: string;\n }\n | {\n type: \"git\";\n url: string;\n username: string;\n password: string;\n depth?: number;\n revision?: string;\n }\n | { type: \"tarball\"; url: string };\n /**\n * Array of port numbers to expose from the sandbox. Sandboxes can\n * expose up to 4 ports.\n */\n ports?: number[];\n /**\n * Timeout in milliseconds before the sandbox auto-terminates.\n */\n timeout?: number;\n /**\n * Resources to allocate to the sandbox.\n *\n * Your sandbox will get the amount of vCPUs you specify here and\n * 2048 MB of memory per vCPU.\n */\n resources?: { vcpus: number };\n /**\n * The runtime of the sandbox, currently only `node24`, `node22` and `python3.13` are supported.\n * If not specified, the default runtime `node24` will be used.\n */\n runtime?: RUNTIMES | (string & {});\n /**\n * Network policy to define network restrictions for the sandbox.\n * Defaults to full internet access if not specified.\n */\n networkPolicy?: NetworkPolicy;\n /**\n * Default environment variables for the sandbox.\n * These are inherited by all commands unless overridden with\n * the `env` option in `runCommand`.\n *\n * @example\n * const sandbox = await Sandbox.create({\n * env: { NODE_ENV: \"production\", API_KEY: \"secret\" },\n * });\n * // All commands will have NODE_ENV and API_KEY set\n * await sandbox.runCommand(\"node\", [\"app.js\"]);\n */\n env?: Record<string, string>;\n /**\n * Key-value tags to associate with the sandbox. Maximum 5 tags.\n * @example { env: \"staging\", team: \"infra\" }\n */\n tags?: Record<string, string>;\n\n /**\n * An AbortSignal to cancel sandbox creation.\n */\n signal?: AbortSignal;\n /**\n * Enable or disable automatic restore of the filesystem between sessions.\n */\n persistent?: boolean;\n /**\n * Default snapshot expiration in milliseconds.\n * When set, snapshots created for this sandbox will expire after this duration.\n * Use `0` for no expiration.\n */\n snapshotExpiration?: number;\n}\n\nexport type CreateSandboxParams =\n | BaseCreateSandboxParams\n | (Omit<BaseCreateSandboxParams, \"runtime\" | \"source\"> & {\n source: { type: \"snapshot\"; snapshotId: string };\n });\n\n/** @inline */\ninterface GetSandboxParams {\n /**\n * The name of the sandbox.\n */\n name: string;\n /**\n * Whether to resume an existing session. Defaults to true.\n */\n resume?: boolean;\n /**\n * An AbortSignal to cancel the operation.\n */\n signal?: AbortSignal;\n}\n\nfunction isSandboxStoppedError(err: unknown): boolean {\n return err instanceof APIError && err.response.status === 410;\n}\n\nfunction isSandboxStoppingError(err: unknown): boolean {\n return (\n err instanceof APIError &&\n err.response.status === 422 &&\n (err.json as any)?.error?.code === \"sandbox_stopping\"\n );\n}\n\nfunction isSandboxSnapshottingError(err: unknown): boolean {\n return (\n err instanceof APIError &&\n err.response.status === 422 &&\n (err.json as any)?.error?.code === \"sandbox_snapshotting\"\n );\n}\n\n/**\n * Serialized representation of a Sandbox for @workflow/serde.\n * Fields `metadata` and `routes` are the original wire format from main.\n * Fields `sandboxMetadata` and `projectId` are added for named-sandboxes.\n */\nexport interface SerializedSandbox {\n metadata: SandboxSnapshot;\n routes: SandboxRouteData[];\n sandboxMetadata?: SandboxMetaData;\n projectId?: string;\n}\n\n// ============================================================================\n// Sandbox class\n// ============================================================================\n\n/**\n * A Sandbox is a persistent, isolated Linux MicroVMs to run commands in.\n * Use {@link Sandbox.create} or {@link Sandbox.get} to construct.\n * @hideconstructor\n */\nexport class Sandbox {\n private _client: APIClient | null = null;\n private readonly projectId: string;\n\n /**\n * In-flight resume promise, used to deduplicate concurrent resume calls.\n */\n private resumePromise: Promise<void> | null = null;\n\n /**\n * Internal Session instance for the current VM.\n */\n private session: Session | undefined;\n\n /**\n * Internal metadata about the sandbox.\n */\n private sandbox: SandboxMetaData;\n\n /**\n * Lazily resolve credentials and construct an API client.\n * @internal\n */\n private async ensureClient(): Promise<APIClient> {\n \"use step\";\n if (this._client) return this._client;\n const credentials = await getCredentials();\n this._client = new APIClient({\n teamId: credentials.teamId,\n token: credentials.token,\n });\n return this._client;\n }\n\n /**\n * The name of this sandbox.\n */\n public get name(): string {\n return this.sandbox.name;\n }\n\n /**\n * Routes from ports to subdomains.\n * @hidden\n */\n public get routes(): SandboxRouteData[] {\n return this.currentSession().routes;\n }\n\n /**\n * Whether the sandbox persists the state.\n */\n public get persistent(): boolean {\n return this.sandbox.persistent;\n }\n\n /**\n * The region this sandbox runs in.\n */\n public get region(): string | undefined {\n return this.sandbox.region;\n }\n\n /**\n * Number of virtual CPUs allocated.\n */\n public get vcpus(): number | undefined {\n return this.sandbox.vcpus;\n }\n\n /**\n * Memory allocated in MB.\n */\n public get memory(): number | undefined {\n return this.sandbox.memory;\n }\n\n /** Runtime identifier (e.g. \"node24\", \"python3.13\"). */\n public get runtime(): string | undefined {\n return this.sandbox.runtime;\n }\n\n /**\n * Cumulative egress bytes across all sessions.\n */\n public get totalEgressBytes(): number | undefined {\n return this.sandbox.totalEgressBytes;\n }\n\n /**\n * Cumulative ingress bytes across all sessions.\n */\n public get totalIngressBytes(): number | undefined {\n return this.sandbox.totalIngressBytes;\n }\n\n /**\n * Cumulative active CPU duration in milliseconds across all sessions.\n */\n public get totalActiveCpuDurationMs(): number | undefined {\n return this.sandbox.totalActiveCpuDurationMs;\n }\n\n /**\n * Cumulative wall-clock duration in milliseconds across all sessions.\n */\n public get totalDurationMs(): number | undefined {\n return this.sandbox.totalDurationMs;\n }\n\n /**\n * When this sandbox was last updated.\n */\n public get updatedAt(): Date {\n return new Date(this.sandbox.updatedAt);\n }\n\n /**\n * When the sandbox status was last updated.\n */\n public get statusUpdatedAt(): Date | undefined {\n return this.sandbox.statusUpdatedAt\n ? new Date(this.sandbox.statusUpdatedAt)\n : undefined;\n }\n\n /**\n * When this sandbox was created.\n */\n public get createdAt(): Date {\n return new Date(this.sandbox.createdAt);\n }\n\n /**\n * Interactive port.\n */\n public get interactivePort(): number | undefined {\n return this.currentSession().interactivePort;\n }\n\n /**\n * The status of the current session.\n */\n public get status(): SessionMetaData[\"status\"] {\n return this.currentSession().status;\n }\n\n /**\n * The default timeout of this sandbox in milliseconds.\n */\n public get timeout(): number | undefined {\n return this.sandbox.timeout;\n }\n\n /**\n * Key-value tags attached to the sandbox.\n */\n public get tags(): Record<string, string> | undefined {\n return this.sandbox.tags;\n }\n\n /**\n * The default network policy of this sandbox.\n */\n public get networkPolicy(): NetworkPolicy | undefined {\n return this.sandbox.networkPolicy\n ? fromAPINetworkPolicy(this.sandbox.networkPolicy)\n : undefined;\n }\n\n /**\n * If the session was created from a snapshot, the ID of that snapshot.\n */\n public get sourceSnapshotId(): string | undefined {\n return this.currentSession().sourceSnapshotId;\n }\n\n /**\n * The current snapshot ID of this sandbox, if any.\n */\n public get currentSnapshotId(): string | undefined {\n return this.sandbox.currentSnapshotId;\n }\n\n /**\n * The default snapshot expiration in milliseconds, if set.\n */\n public get snapshotExpiration(): number | undefined {\n return this.sandbox.snapshotExpiration;\n }\n\n /**\n * The amount of CPU used by the session. Only reported once the VM is stopped.\n */\n public get activeCpuUsageMs(): number | undefined {\n return this.currentSession().activeCpuUsageMs;\n }\n\n /**\n * The amount of network data used by the session. Only reported once the VM is stopped.\n */\n public get networkTransfer():\n | { ingress: number; egress: number }\n | undefined {\n return this.currentSession().networkTransfer;\n }\n\n /**\n * Allow to get a list of sandboxes for a team narrowed to the given params.\n * It returns both the sandboxes and the pagination metadata to allow getting\n * the next page of results.\n */\n static async list(\n params?: Partial<Parameters<APIClient[\"listSandboxes\"]>[0]> &\n Partial<Credentials> &\n WithFetchOptions,\n ) {\n \"use step\";\n const credentials = await getCredentials(params);\n const client = new APIClient({\n teamId: credentials.teamId,\n token: credentials.token,\n fetch: params?.fetch,\n });\n const response = await client.listSandboxes({\n ...credentials,\n ...params,\n });\n return response.json;\n }\n\n /**\n * Serialize a Sandbox instance to plain data for @workflow/serde.\n *\n * @param instance - The Sandbox instance to serialize\n * @returns A plain object containing sandbox metadata and routes\n */\n static [WORKFLOW_SERIALIZE](instance: Sandbox): SerializedSandbox {\n return {\n metadata: instance.session?._sessionSnapshot!,\n routes: instance.session?.routes ?? [],\n sandboxMetadata: instance.sandbox,\n projectId: instance.projectId,\n };\n }\n\n /**\n * Deserialize a Sandbox from serialized snapshot data.\n *\n * The deserialized instance uses the serialized metadata synchronously and\n * lazily creates an API client only when methods perform API requests.\n *\n * @param data - The serialized sandbox data\n * @returns The reconstructed Sandbox instance\n */\n static [WORKFLOW_DESERIALIZE](data: SerializedSandbox): Sandbox {\n const sandbox = new Sandbox({\n sandbox: data.sandboxMetadata!,\n routes: data.routes,\n projectId: data.projectId,\n });\n if (data.metadata) {\n sandbox.session = new Session({ routes: data.routes, snapshot: data.metadata });\n }\n return sandbox;\n }\n\n /**\n * Create a new sandbox.\n *\n * @param params - Creation parameters and optional credentials.\n * @returns A promise resolving to the created {@link Sandbox}.\n * @example\n * <caption>Create a sandbox with default options</caption>\n * const sandbox = await Sandbox.create();\n *\n * @example\n * <caption>Create a sandbox and drop it in the end of the block</caption>\n * async function fn() {\n * await using const sandbox = await Sandbox.create();\n * // Sandbox automatically stopped at the end of the lexical scope\n * }\n */\n static async create(\n params?: WithPrivate<\n CreateSandboxParams | (CreateSandboxParams & Credentials)\n > &\n WithFetchOptions,\n ): Promise<Sandbox & AsyncDisposable> {\n \"use step\";\n const credentials = await getCredentials(params);\n const client = new APIClient({\n teamId: credentials.teamId,\n token: credentials.token,\n fetch: params?.fetch,\n });\n\n const privateParams = getPrivateParams(params);\n const response = await client.createSandbox({\n source: params?.source,\n projectId: credentials.projectId,\n ports: params?.ports ?? [],\n timeout: params?.timeout,\n resources: params?.resources,\n runtime: params && \"runtime\" in params ? params?.runtime : undefined,\n networkPolicy: params?.networkPolicy,\n env: params?.env,\n tags: params?.tags,\n snapshotExpiration: params?.snapshotExpiration,\n signal: params?.signal,\n name: params?.name,\n persistent: params?.persistent,\n ...privateParams,\n });\n\n return new DisposableSandbox({\n client,\n session: response.json.session,\n sandbox: response.json.sandbox,\n routes: response.json.routes,\n projectId: credentials.projectId,\n });\n }\n\n /**\n * Retrieve an existing sandbox and resume its session.\n *\n * @param params - Get parameters and optional credentials.\n * @returns A promise resolving to the {@link Sandbox}.\n */\n static async get(\n params: WithPrivate<GetSandboxParams | (GetSandboxParams & Credentials)> &\n WithFetchOptions,\n ): Promise<Sandbox> {\n \"use step\";\n const credentials = await getCredentials(params);\n const client = new APIClient({\n teamId: credentials.teamId,\n token: credentials.token,\n fetch: params.fetch,\n });\n\n const privateParams = getPrivateParams(params);\n const response = await client.getSandbox({\n name: params.name,\n projectId: credentials.projectId,\n resume: params.resume,\n signal: params.signal,\n ...privateParams,\n });\n\n return new Sandbox({\n client,\n session: response.json.session,\n sandbox: response.json.sandbox,\n routes: response.json.routes,\n projectId: credentials.projectId,\n });\n }\n\n /**\n * Create a new Sandbox instance.\n *\n * @param params.client - Optional API client. If not provided, will be lazily created using global credentials.\n * @param params.routes - Port-to-subdomain mappings for exposed ports\n * @param params.sandbox - Sandbox snapshot metadata\n */\n constructor({\n client,\n routes,\n session,\n sandbox,\n projectId,\n }: {\n client?: APIClient;\n routes: SandboxRouteData[];\n session?: SessionMetaData;\n sandbox: SandboxMetaData;\n projectId?: string;\n }) {\n this._client = client ?? null;\n if (session) {\n this.session = new Session({ client: client!, routes, session });\n }\n this.sandbox = sandbox;\n this.projectId = projectId ?? \"\";\n }\n\n /**\n * Get the current session (the running VM) for this sandbox.\n *\n * @returns The {@link Session} instance.\n */\n currentSession(): Session {\n if (!this.session) {\n throw new Error(\"No active session. Run a command or call resume first.\");\n }\n return this.session;\n }\n\n /**\n * Resume this sandbox by creating a new session via `getSandbox`.\n */\n private async resume(signal?: AbortSignal): Promise<void> {\n if (!this.resumePromise) {\n this.resumePromise = this.doResume(signal).finally(() => {\n this.resumePromise = null;\n });\n }\n return this.resumePromise;\n }\n\n private async doResume(signal?: AbortSignal): Promise<void> {\n const client = await this.ensureClient();\n const response = await client.getSandbox({\n name: this.sandbox.name,\n projectId: this.projectId,\n resume: true,\n signal,\n });\n this.session = new Session({\n client,\n routes: response.json.routes,\n session: response.json.session,\n });\n }\n\n /**\n * Poll until the current session reaches a terminal state, then resume.\n */\n private async waitForStopAndResume(signal?: AbortSignal): Promise<void> {\n \"use step\";\n const client = await this.ensureClient();\n const pollingInterval = 500;\n let status = this.session!.status;\n\n while (status === \"stopping\" || status === \"snapshotting\") {\n await setTimeout(pollingInterval, undefined, { signal });\n const poll = await client.getSession({\n sessionId: this.session!.sessionId,\n signal,\n });\n this.session = new Session({\n client,\n routes: poll.json.routes,\n session: poll.json.session,\n });\n status = poll.json.session.status;\n }\n await this.resume(signal);\n }\n\n /**\n * Execute `fn`, and if the session is stopped/stopping/snapshotting, resume and retry.\n */\n private async withResume<T>(\n fn: () => Promise<T>,\n signal?: AbortSignal,\n ): Promise<T> {\n if (!this.session) {\n await this.resume(signal);\n }\n try {\n return await fn();\n } catch (err) {\n if (isSandboxStoppedError(err)) {\n await this.resume(signal);\n return fn();\n }\n if (isSandboxStoppingError(err) || isSandboxSnapshottingError(err)) {\n await this.waitForStopAndResume(signal);\n return fn();\n }\n throw err;\n }\n }\n\n /**\n * Start executing a command in this sandbox.\n *\n * @param command - The command to execute.\n * @param args - Arguments to pass to the command.\n * @param opts - Optional parameters.\n * @param opts.signal - An AbortSignal to cancel the command execution.\n * @returns A {@link CommandFinished} result once execution is done.\n */\n async runCommand(\n command: string,\n args?: string[],\n opts?: { signal?: AbortSignal },\n ): Promise<CommandFinished>;\n /**\n * Start executing a command in detached mode.\n *\n * @param params - The command parameters.\n * @returns A {@link Command} instance for the running command.\n */\n async runCommand(\n params: RunCommandParams & { detached: true },\n ): Promise<Command>;\n\n /**\n * Start executing a command in this sandbox.\n *\n * @param params - The command parameters.\n * @returns A {@link CommandFinished} result once execution is done.\n */\n\n async runCommand(params: RunCommandParams): Promise<CommandFinished>;\n\n async runCommand(\n commandOrParams: string | RunCommandParams,\n args?: string[],\n opts?: { signal?: AbortSignal },\n ): Promise<Command | CommandFinished> {\n \"use step\";\n const signal =\n typeof commandOrParams === \"string\"\n ? opts?.signal\n : commandOrParams.signal;\n return this.withResume(\n () => this.session!.runCommand(commandOrParams as any, args, opts),\n signal,\n );\n }\n\n /**\n * Internal helper to start a command in the sandbox.\n *\n * @param params - Command execution parameters.\n * @returns A {@link Command} or {@link CommandFinished}, depending on `detached`.\n * @internal\n */\n async getCommand(\n cmdId: string,\n opts?: { signal?: AbortSignal },\n ): Promise<Command> {\n \"use step\";\n return this.withResume(\n () => this.session!.getCommand(cmdId, opts),\n opts?.signal,\n );\n }\n\n /**\n * Create a directory in the filesystem of this sandbox.\n *\n * @param path - Path of the directory to create\n * @param opts - Optional parameters.\n * @param opts.signal - An AbortSignal to cancel the operation.\n */\n async mkDir(path: string, opts?: { signal?: AbortSignal }): Promise<void> {\n \"use step\";\n return this.withResume(\n () => this.session!.mkDir(path, opts),\n opts?.signal,\n );\n }\n\n /**\n * Read a file from the filesystem of this sandbox as a stream.\n *\n * @param file - File to read, with path and optional cwd\n * @param opts - Optional parameters.\n * @param opts.signal - An AbortSignal to cancel the operation.\n * @returns A promise that resolves to a ReadableStream containing the file contents, or null if file not found\n */\n async readFile(\n file: { path: string; cwd?: string },\n opts?: { signal?: AbortSignal },\n ): Promise<NodeJS.ReadableStream | null> {\n \"use step\";\n return this.withResume(\n () => this.session!.readFile(file, opts),\n opts?.signal,\n );\n }\n\n /**\n * Read a file from the filesystem of this sandbox as a Buffer.\n *\n * @param file - File to read, with path and optional cwd\n * @param opts - Optional parameters.\n * @param opts.signal - An AbortSignal to cancel the operation.\n * @returns A promise that resolves to the file contents as a Buffer, or null if file not found\n */\n async readFileToBuffer(\n file: { path: string; cwd?: string },\n opts?: { signal?: AbortSignal },\n ): Promise<Buffer | null> {\n \"use step\";\n return this.withResume(\n () => this.session!.readFileToBuffer(file, opts),\n opts?.signal,\n );\n }\n\n /**\n * Download a file from the sandbox to the local filesystem.\n *\n * @param src - Source file on the sandbox, with path and optional cwd\n * @param dst - Destination file on the local machine, with path and optional cwd\n * @param opts - Optional parameters.\n * @param opts.mkdirRecursive - If true, create parent directories for the destination if they don't exist.\n * @param opts.signal - An AbortSignal to cancel the operation.\n * @returns The absolute path to the written file, or null if the source file was not found\n */\n async downloadFile(\n src: { path: string; cwd?: string },\n dst: { path: string; cwd?: string },\n opts?: { mkdirRecursive?: boolean; signal?: AbortSignal },\n ): Promise<string | null> {\n \"use step\";\n return this.withResume(\n () => this.session!.downloadFile(src, dst, opts),\n opts?.signal,\n );\n }\n\n /**\n * Write files to the filesystem of this sandbox.\n * Defaults to writing to /vercel/sandbox unless an absolute path is specified.\n * Writes files using the `vercel-sandbox` user.\n *\n * @param files - Array of files with path, content, and optional mode (permissions)\n * @param opts - Optional parameters.\n * @param opts.signal - An AbortSignal to cancel the operation.\n * @returns A promise that resolves when the files are written\n *\n * @example\n * // Write an executable script\n * await sandbox.writeFiles([\n * { path: \"/usr/local/bin/myscript\", content: \"#!/bin/bash\\necho hello\", mode: 0o755 }\n * ]);\n */\n async writeFiles(\n files: {\n path: string;\n content: string | Uint8Array;\n mode?: number;\n }[],\n opts?: { signal?: AbortSignal },\n ) {\n \"use step\";\n return this.withResume(\n () => this.session!.writeFiles(files, opts),\n opts?.signal,\n );\n }\n\n /**\n * Get the public domain of a port of this sandbox.\n *\n * @param p - Port number to resolve\n * @returns A full domain (e.g. `https://subdomain.vercel.run`)\n * @throws If the port has no associated route\n */\n domain(p: number): string {\n return this.currentSession().domain(p);\n }\n\n /**\n * Stop the sandbox.\n *\n * @param opts - Optional parameters.\n * @param opts.signal - An AbortSignal to cancel the operation.\n * @param opts.blocking - If true, poll until the sandbox has fully stopped and return the final state.\n * @returns The sandbox at the time the stop was acknowledged, or after fully stopped if `blocking` is true.\n */\n async stop(opts?: {\n signal?: AbortSignal;\n blocking?: boolean;\n }): Promise<SandboxSnapshot> {\n \"use step\";\n if (!this.session) {\n throw new Error(\"No active session to stop.\");\n }\n return this.session.stop(opts);\n }\n\n /**\n * Update the network policy for this sandbox.\n *\n * @deprecated Use {@link Sandbox.update} instead.\n *\n * @param networkPolicy - The new network policy to apply.\n * @param opts - Optional parameters.\n * @param opts.signal - An AbortSignal to cancel the operation.\n * @returns A promise that resolves when the network policy is updated.\n *\n * @example\n * // Restrict to specific domains\n * await sandbox.updateNetworkPolicy({\n * allow: [\"*.npmjs.org\", \"github.com\"],\n * });\n *\n * @example\n * // Inject credentials with per-domain transformers\n * await sandbox.updateNetworkPolicy({\n * allow: {\n * \"ai-gateway.vercel.sh\": [{\n * transform: [{\n * headers: { authorization: \"Bearer ...\" }\n * }]\n * }],\n * \"*\": []\n * }\n * });\n *\n * @example\n * // Deny all network access\n * await sandbox.updateNetworkPolicy(\"deny-all\");\n */\n async updateNetworkPolicy(\n networkPolicy: NetworkPolicy,\n opts?: { signal?: AbortSignal },\n ): Promise<NetworkPolicy> {\n \"use step\";\n await this.withResume(\n () => this.session!.update({ networkPolicy: networkPolicy }, opts),\n opts?.signal,\n );\n\n return this.session!.networkPolicy!;\n }\n\n /**\n * Extend the timeout of the sandbox by the specified duration.\n *\n * This allows you to extend the lifetime of a sandbox up until the maximum\n * execution timeout for your plan.\n *\n * @param duration - The duration in milliseconds to extend the timeout by\n * @param opts - Optional parameters.\n * @param opts.signal - An AbortSignal to cancel the operation.\n * @returns A promise that resolves when the timeout is extended\n *\n * @example\n * const sandbox = await Sandbox.create({ timeout: ms('10m') });\n * // Extends timeout by 5 minutes, to a total of 15 minutes.\n * await sandbox.extendTimeout(ms('5m'));\n */\n async extendTimeout(\n duration: number,\n opts?: { signal?: AbortSignal },\n ): Promise<void> {\n \"use step\";\n return this.withResume(\n () => this.session!.extendTimeout(duration, opts),\n opts?.signal,\n );\n }\n\n /**\n * Create a snapshot from this currently running sandbox. New sandboxes can\n * then be created from this snapshot using {@link Sandbox.createFromSnapshot}.\n *\n * Note: this sandbox will be stopped as part of the snapshot creation process.\n *\n * @param opts - Optional parameters.\n * @param opts.expiration - Optional expiration time in milliseconds. Use 0 for no expiration at all.\n * @param opts.signal - An AbortSignal to cancel the operation.\n * @returns A promise that resolves to the Snapshot instance\n */\n async snapshot(opts?: {\n expiration?: number;\n signal?: AbortSignal;\n }): Promise<Snapshot> {\n \"use step\";\n return this.withResume(\n () => this.session!.snapshot(opts),\n opts?.signal,\n );\n }\n\n /**\n * Update the sandbox configuration.\n *\n * @param params - Fields to update.\n * @param opts - Optional abort signal.\n */\n async update(\n params: {\n persistent?: boolean;\n resources?: { vcpus?: number };\n timeout?: number;\n networkPolicy?: NetworkPolicy;\n tags?: Record<string, string>;\n snapshotExpiration?: number;\n },\n opts?: { signal?: AbortSignal },\n ): Promise<void> {\n \"use step\";\n const client = await this.ensureClient();\n let resources: { vcpus: number; memory: number } | undefined;\n if (params.resources?.vcpus) {\n resources = {\n vcpus: params.resources.vcpus,\n memory: params.resources.vcpus * 2048,\n };\n }\n\n // Update the sandbox config. This config will be used on the next session.\n const response = await client.updateSandbox({\n name: this.sandbox.name,\n projectId: this.projectId,\n persistent: params.persistent,\n resources,\n timeout: params.timeout,\n networkPolicy: params.networkPolicy,\n tags: params.tags,\n snapshotExpiration: params.snapshotExpiration,\n signal: opts?.signal,\n });\n this.sandbox = response.json.sandbox;\n\n // Update the current session config. This only applies to network policy.\n if (params.networkPolicy) {\n try {\n return await this.session?.update(\n { networkPolicy: params.networkPolicy },\n opts,\n );\n } catch (err) {\n if (isSandboxStoppedError(err) || isSandboxStoppingError(err)) {\n return;\n }\n throw err;\n }\n }\n }\n\n /**\n * Delete this sandbox.\n *\n * After deletion the instance becomes inert — all further API calls will\n * throw immediately.\n */\n async delete(opts?: { signal?: AbortSignal }): Promise<void> {\n \"use step\";\n const client = await this.ensureClient();\n await client.deleteSandbox({\n name: this.sandbox.name,\n projectId: this.projectId,\n signal: opts?.signal,\n });\n }\n\n /**\n * List sessions (VMs) that have been created for this sandbox.\n *\n * @param params - Optional pagination parameters.\n * @returns The list of sessions and pagination metadata.\n */\n async listSessions(params?: {\n limit?: number;\n cursor?: string;\n sortOrder?: \"asc\" | \"desc\";\n signal?: AbortSignal;\n }) {\n \"use step\";\n const client = await this.ensureClient();\n const response = await client.listSessions({\n projectId: this.projectId,\n name: this.sandbox.name,\n limit: params?.limit,\n cursor: params?.cursor,\n sortOrder: params?.sortOrder,\n signal: params?.signal,\n });\n return response.json;\n }\n\n /**\n * List snapshots that belong to this sandbox.\n *\n * @param params - Optional pagination parameters.\n * @returns The list of snapshots and pagination metadata.\n */\n async listSnapshots(params?: {\n limit?: number;\n cursor?: string;\n sortOrder?: \"asc\" | \"desc\";\n signal?: AbortSignal;\n }) {\n \"use step\";\n const client = await this.ensureClient();\n const response = await client.listSnapshots({\n projectId: this.projectId,\n name: this.sandbox.name,\n limit: params?.limit,\n cursor: params?.cursor,\n sortOrder: params?.sortOrder,\n signal: params?.signal,\n });\n return response.json;\n }\n}\n\n/**\n * A {@link Sandbox} that can automatically be disposed using a `await using` statement.\n *\n * @example\n * {\n * await using const sandbox = await Sandbox.create();\n * }\n * // Sandbox is automatically stopped here\n */\nclass DisposableSandbox extends Sandbox implements AsyncDisposable {\n async [Symbol.asyncDispose]() {\n await this.stop();\n }\n}\n"],"mappings":"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"} | ||
| {"version":3,"file":"sandbox.js","names":["resources: { vcpus: number; memory: number } | undefined"],"sources":["../src/sandbox.ts"],"sourcesContent":["import { WORKFLOW_DESERIALIZE, WORKFLOW_SERIALIZE } from \"@workflow/serde\";\nimport type {\n SessionMetaData,\n SandboxRouteData,\n SandboxMetaData,\n} from \"./api-client/index.js\";\nimport { APIClient } from \"./api-client/index.js\";\nimport { APIError } from \"./api-client/api-error.js\";\nimport { type Credentials, getCredentials } from \"./utils/get-credentials.js\";\nimport { getPrivateParams, type WithPrivate } from \"./utils/types.js\";\nimport type { WithFetchOptions } from \"./api-client/api-client.js\";\nimport type { RUNTIMES } from \"./constants.js\";\nimport { Session, type RunCommandParams } from \"./session.js\";\nimport type { Command, CommandFinished } from \"./command.js\";\nimport type { Snapshot } from \"./snapshot.js\";\nimport type { SandboxSnapshot } from \"./utils/sandbox-snapshot.js\";\nimport type { NetworkPolicy } from \"./network-policy.js\";\nimport { fromAPINetworkPolicy } from \"./utils/network-policy.js\";\nimport { setTimeout } from \"node:timers/promises\";\n\nexport type { NetworkPolicy };\n\n/** @inline */\nexport interface BaseCreateSandboxParams {\n /**\n * The name of the sandbox. If omitted, a random name will be generated.\n */\n name?: string;\n /**\n * The source of the sandbox.\n *\n * Omit this parameter start a sandbox without a source.\n *\n * For git sources:\n * - `depth`: Creates shallow clones with limited commit history (minimum: 1)\n * - `revision`: Clones and checks out a specific commit, branch, or tag\n */\n source?:\n | {\n type: \"git\";\n url: string;\n depth?: number;\n revision?: string;\n }\n | {\n type: \"git\";\n url: string;\n username: string;\n password: string;\n depth?: number;\n revision?: string;\n }\n | { type: \"tarball\"; url: string };\n /**\n * Array of port numbers to expose from the sandbox. Sandboxes can\n * expose up to 4 ports.\n */\n ports?: number[];\n /**\n * Timeout in milliseconds before the sandbox auto-terminates.\n */\n timeout?: number;\n /**\n * Resources to allocate to the sandbox.\n *\n * Your sandbox will get the amount of vCPUs you specify here and\n * 2048 MB of memory per vCPU.\n */\n resources?: { vcpus: number };\n /**\n * The runtime of the sandbox, currently only `node24`, `node22` and `python3.13` are supported.\n * If not specified, the default runtime `node24` will be used.\n */\n runtime?: RUNTIMES | (string & {});\n /**\n * Network policy to define network restrictions for the sandbox.\n * Defaults to full internet access if not specified.\n */\n networkPolicy?: NetworkPolicy;\n /**\n * Default environment variables for the sandbox.\n * These are inherited by all commands unless overridden with\n * the `env` option in `runCommand`.\n *\n * @example\n * const sandbox = await Sandbox.create({\n * env: { NODE_ENV: \"production\", API_KEY: \"secret\" },\n * });\n * // All commands will have NODE_ENV and API_KEY set\n * await sandbox.runCommand(\"node\", [\"app.js\"]);\n */\n env?: Record<string, string>;\n /**\n * Key-value tags to associate with the sandbox. Maximum 5 tags.\n * @example { env: \"staging\", team: \"infra\" }\n */\n tags?: Record<string, string>;\n\n /**\n * An AbortSignal to cancel sandbox creation.\n */\n signal?: AbortSignal;\n /**\n * Enable or disable automatic restore of the filesystem between sessions.\n */\n persistent?: boolean;\n /**\n * Default snapshot expiration in milliseconds.\n * When set, snapshots created for this sandbox will expire after this duration.\n * Use `0` for no expiration.\n */\n snapshotExpiration?: number;\n /**\n * Called when the sandbox session is resumed (e.g., after a snapshot restore).\n * Use this to re-warm caches, restore transient state, or run other setup logic.\n */\n onResume?: (sandbox: Sandbox) => Promise<void>;\n}\n\nexport type CreateSandboxParams =\n | BaseCreateSandboxParams\n | (Omit<BaseCreateSandboxParams, \"runtime\" | \"source\"> & {\n source: { type: \"snapshot\"; snapshotId: string };\n });\n\n/** @inline */\ninterface GetSandboxParams {\n /**\n * The name of the sandbox.\n */\n name: string;\n /**\n * Whether to resume an existing session. Defaults to true.\n */\n resume?: boolean;\n /**\n * An AbortSignal to cancel the operation.\n */\n signal?: AbortSignal;\n /**\n * Called when the sandbox session is resumed (e.g., after a snapshot restore).\n * Use this to re-warm caches, restore transient state, or run other setup logic.\n */\n onResume?: (sandbox: Sandbox) => Promise<void>;\n}\n\nfunction isSandboxStoppedError(err: unknown): boolean {\n return err instanceof APIError && err.response.status === 410;\n}\n\nfunction isSandboxStoppingError(err: unknown): boolean {\n return (\n err instanceof APIError &&\n err.response.status === 422 &&\n (err.json as any)?.error?.code === \"sandbox_stopping\"\n );\n}\n\nfunction isSandboxSnapshottingError(err: unknown): boolean {\n return (\n err instanceof APIError &&\n err.response.status === 422 &&\n (err.json as any)?.error?.code === \"sandbox_snapshotting\"\n );\n}\n\n/**\n * Serialized representation of a Sandbox for @workflow/serde.\n * Fields `metadata` and `routes` are the original wire format from main.\n * Fields `sandboxMetadata` and `projectId` are added for named-sandboxes.\n */\nexport interface SerializedSandbox {\n metadata: SandboxSnapshot;\n routes: SandboxRouteData[];\n sandboxMetadata?: SandboxMetaData;\n projectId?: string;\n}\n\n// ============================================================================\n// Sandbox class\n// ============================================================================\n\n/**\n * A Sandbox is a persistent, isolated Linux MicroVMs to run commands in.\n * Use {@link Sandbox.create} or {@link Sandbox.get} to construct.\n * @hideconstructor\n */\nexport class Sandbox {\n private _client: APIClient | null = null;\n private readonly projectId: string;\n\n /**\n * In-flight resume promise, used to deduplicate concurrent resume calls.\n */\n private resumePromise: Promise<void> | null = null;\n\n /**\n * Internal Session instance for the current VM.\n */\n private session: Session | undefined;\n\n /**\n * Internal metadata about the sandbox.\n */\n private sandbox: SandboxMetaData;\n\n /**\n * Hook that will be executed when a new session is created during resume.\n */\n private readonly onResume?: (sandbox: Sandbox) => Promise<void>;\n\n /**\n * Lazily resolve credentials and construct an API client.\n * @internal\n */\n private async ensureClient(): Promise<APIClient> {\n \"use step\";\n if (this._client) return this._client;\n const credentials = await getCredentials();\n this._client = new APIClient({\n teamId: credentials.teamId,\n token: credentials.token,\n });\n return this._client;\n }\n\n /**\n * The name of this sandbox.\n */\n public get name(): string {\n return this.sandbox.name;\n }\n\n /**\n * Routes from ports to subdomains.\n * @hidden\n */\n public get routes(): SandboxRouteData[] {\n return this.currentSession().routes;\n }\n\n /**\n * Whether the sandbox persists the state.\n */\n public get persistent(): boolean {\n return this.sandbox.persistent;\n }\n\n /**\n * The region this sandbox runs in.\n */\n public get region(): string | undefined {\n return this.sandbox.region;\n }\n\n /**\n * Number of virtual CPUs allocated.\n */\n public get vcpus(): number | undefined {\n return this.sandbox.vcpus;\n }\n\n /**\n * Memory allocated in MB.\n */\n public get memory(): number | undefined {\n return this.sandbox.memory;\n }\n\n /** Runtime identifier (e.g. \"node24\", \"python3.13\"). */\n public get runtime(): string | undefined {\n return this.sandbox.runtime;\n }\n\n /**\n * Cumulative egress bytes across all sessions.\n */\n public get totalEgressBytes(): number | undefined {\n return this.sandbox.totalEgressBytes;\n }\n\n /**\n * Cumulative ingress bytes across all sessions.\n */\n public get totalIngressBytes(): number | undefined {\n return this.sandbox.totalIngressBytes;\n }\n\n /**\n * Cumulative active CPU duration in milliseconds across all sessions.\n */\n public get totalActiveCpuDurationMs(): number | undefined {\n return this.sandbox.totalActiveCpuDurationMs;\n }\n\n /**\n * Cumulative wall-clock duration in milliseconds across all sessions.\n */\n public get totalDurationMs(): number | undefined {\n return this.sandbox.totalDurationMs;\n }\n\n /**\n * When this sandbox was last updated.\n */\n public get updatedAt(): Date {\n return new Date(this.sandbox.updatedAt);\n }\n\n /**\n * When the sandbox status was last updated.\n */\n public get statusUpdatedAt(): Date | undefined {\n return this.sandbox.statusUpdatedAt\n ? new Date(this.sandbox.statusUpdatedAt)\n : undefined;\n }\n\n /**\n * When this sandbox was created.\n */\n public get createdAt(): Date {\n return new Date(this.sandbox.createdAt);\n }\n\n /**\n * Interactive port.\n */\n public get interactivePort(): number | undefined {\n return this.currentSession().interactivePort;\n }\n\n /**\n * The status of the current session.\n */\n public get status(): SessionMetaData[\"status\"] {\n return this.currentSession().status;\n }\n\n /**\n * The default timeout of this sandbox in milliseconds.\n */\n public get timeout(): number | undefined {\n return this.sandbox.timeout;\n }\n\n /**\n * Key-value tags attached to the sandbox.\n */\n public get tags(): Record<string, string> | undefined {\n return this.sandbox.tags;\n }\n\n /**\n * The default network policy of this sandbox.\n */\n public get networkPolicy(): NetworkPolicy | undefined {\n return this.sandbox.networkPolicy\n ? fromAPINetworkPolicy(this.sandbox.networkPolicy)\n : undefined;\n }\n\n /**\n * If the session was created from a snapshot, the ID of that snapshot.\n */\n public get sourceSnapshotId(): string | undefined {\n return this.currentSession().sourceSnapshotId;\n }\n\n /**\n * The current snapshot ID of this sandbox, if any.\n */\n public get currentSnapshotId(): string | undefined {\n return this.sandbox.currentSnapshotId;\n }\n\n /**\n * The default snapshot expiration in milliseconds, if set.\n */\n public get snapshotExpiration(): number | undefined {\n return this.sandbox.snapshotExpiration;\n }\n\n /**\n * The amount of CPU used by the session. Only reported once the VM is stopped.\n */\n public get activeCpuUsageMs(): number | undefined {\n return this.currentSession().activeCpuUsageMs;\n }\n\n /**\n * The amount of network data used by the session. Only reported once the VM is stopped.\n */\n public get networkTransfer():\n | { ingress: number; egress: number }\n | undefined {\n return this.currentSession().networkTransfer;\n }\n\n /**\n * Allow to get a list of sandboxes for a team narrowed to the given params.\n * It returns both the sandboxes and the pagination metadata to allow getting\n * the next page of results.\n */\n static async list(\n params?: Partial<Parameters<APIClient[\"listSandboxes\"]>[0]> &\n Partial<Credentials> &\n WithFetchOptions,\n ) {\n \"use step\";\n const credentials = await getCredentials(params);\n const client = new APIClient({\n teamId: credentials.teamId,\n token: credentials.token,\n fetch: params?.fetch,\n });\n const response = await client.listSandboxes({\n ...credentials,\n ...params,\n });\n return response.json;\n }\n\n /**\n * Serialize a Sandbox instance to plain data for @workflow/serde.\n *\n * @param instance - The Sandbox instance to serialize\n * @returns A plain object containing sandbox metadata and routes\n */\n static [WORKFLOW_SERIALIZE](instance: Sandbox): SerializedSandbox {\n return {\n metadata: instance.session?._sessionSnapshot!,\n routes: instance.session?.routes ?? [],\n sandboxMetadata: instance.sandbox,\n projectId: instance.projectId,\n };\n }\n\n /**\n * Deserialize a Sandbox from serialized snapshot data.\n *\n * The deserialized instance uses the serialized metadata synchronously and\n * lazily creates an API client only when methods perform API requests.\n *\n * @param data - The serialized sandbox data\n * @returns The reconstructed Sandbox instance\n */\n static [WORKFLOW_DESERIALIZE](data: SerializedSandbox): Sandbox {\n const sandbox = new Sandbox({\n sandbox: data.sandboxMetadata!,\n routes: data.routes,\n projectId: data.projectId,\n });\n if (data.metadata) {\n sandbox.session = new Session({ routes: data.routes, snapshot: data.metadata });\n }\n return sandbox;\n }\n\n /**\n * Create a new sandbox.\n *\n * @param params - Creation parameters and optional credentials.\n * @returns A promise resolving to the created {@link Sandbox}.\n * @example\n * <caption>Create a sandbox with default options</caption>\n * const sandbox = await Sandbox.create();\n *\n * @example\n * <caption>Create a sandbox and drop it in the end of the block</caption>\n * async function fn() {\n * await using const sandbox = await Sandbox.create();\n * // Sandbox automatically stopped at the end of the lexical scope\n * }\n */\n static async create(\n params?: WithPrivate<\n CreateSandboxParams | (CreateSandboxParams & Credentials)\n > &\n WithFetchOptions,\n ): Promise<Sandbox & AsyncDisposable> {\n \"use step\";\n const credentials = await getCredentials(params);\n const client = new APIClient({\n teamId: credentials.teamId,\n token: credentials.token,\n fetch: params?.fetch,\n });\n\n const privateParams = getPrivateParams(params);\n const response = await client.createSandbox({\n source: params?.source,\n projectId: credentials.projectId,\n ports: params?.ports ?? [],\n timeout: params?.timeout,\n resources: params?.resources,\n runtime: params && \"runtime\" in params ? params?.runtime : undefined,\n networkPolicy: params?.networkPolicy,\n env: params?.env,\n tags: params?.tags,\n snapshotExpiration: params?.snapshotExpiration,\n signal: params?.signal,\n name: params?.name,\n persistent: params?.persistent,\n ...privateParams,\n });\n\n return new DisposableSandbox({\n client,\n session: response.json.session,\n sandbox: response.json.sandbox,\n routes: response.json.routes,\n projectId: credentials.projectId,\n onResume: params?.onResume,\n });\n }\n\n /**\n * Retrieve an existing sandbox and resume its session.\n *\n * @param params - Get parameters and optional credentials.\n * @returns A promise resolving to the {@link Sandbox}.\n */\n static async get(\n params: WithPrivate<GetSandboxParams | (GetSandboxParams & Credentials)> &\n WithFetchOptions,\n ): Promise<Sandbox> {\n \"use step\";\n const credentials = await getCredentials(params);\n const client = new APIClient({\n teamId: credentials.teamId,\n token: credentials.token,\n fetch: params.fetch,\n });\n\n const privateParams = getPrivateParams(params);\n const response = await client.getSandbox({\n name: params.name,\n projectId: credentials.projectId,\n resume: params.resume,\n signal: params.signal,\n ...privateParams,\n });\n\n const sandbox = new Sandbox({\n client,\n session: response.json.session,\n sandbox: response.json.sandbox,\n routes: response.json.routes,\n projectId: credentials.projectId,\n onResume: params.onResume,\n });\n\n if (response.json.resumed && params.onResume) {\n await params.onResume(sandbox);\n }\n\n return sandbox;\n }\n\n /**\n * Create a new Sandbox instance.\n *\n * @param params.client - Optional API client. If not provided, will be lazily created using global credentials.\n * @param params.routes - Port-to-subdomain mappings for exposed ports\n * @param params.sandbox - Sandbox snapshot metadata\n */\n constructor({\n client,\n routes,\n session,\n sandbox,\n projectId,\n onResume,\n }: {\n client?: APIClient;\n routes: SandboxRouteData[];\n session?: SessionMetaData;\n sandbox: SandboxMetaData;\n projectId?: string;\n onResume?: (sandbox: Sandbox) => Promise<void>;\n }) {\n this._client = client ?? null;\n if (session) {\n this.session = new Session({ client: client!, routes, session });\n }\n this.sandbox = sandbox;\n this.projectId = projectId ?? \"\";\n this.onResume = onResume;\n }\n\n /**\n * Get the current session (the running VM) for this sandbox.\n *\n * @returns The {@link Session} instance.\n */\n currentSession(): Session {\n if (!this.session) {\n throw new Error(\"No active session. Run a command or call resume first.\");\n }\n return this.session;\n }\n\n /**\n * Resume this sandbox by creating a new session via `getSandbox`.\n */\n private async resume(signal?: AbortSignal): Promise<void> {\n if (!this.resumePromise) {\n this.resumePromise = this.doResume(signal).finally(() => {\n this.resumePromise = null;\n });\n }\n return this.resumePromise;\n }\n\n private async doResume(signal?: AbortSignal): Promise<void> {\n const client = await this.ensureClient();\n const response = await client.getSandbox({\n name: this.sandbox.name,\n projectId: this.projectId,\n resume: true,\n signal,\n });\n this.session = new Session({\n client,\n routes: response.json.routes,\n session: response.json.session,\n });\n if (this.onResume && response.json.resumed) {\n await this.onResume(this);\n }\n }\n\n /**\n * Poll until the current session reaches a terminal state, then resume.\n */\n private async waitForStopAndResume(signal?: AbortSignal): Promise<void> {\n \"use step\";\n const client = await this.ensureClient();\n const pollingInterval = 500;\n let status = this.session!.status;\n\n while (status === \"stopping\" || status === \"snapshotting\") {\n await setTimeout(pollingInterval, undefined, { signal });\n const poll = await client.getSession({\n sessionId: this.session!.sessionId,\n signal,\n });\n this.session = new Session({\n client,\n routes: poll.json.routes,\n session: poll.json.session,\n });\n status = poll.json.session.status;\n }\n await this.resume(signal);\n }\n\n /**\n * Execute `fn`, and if the session is stopped/stopping/snapshotting, resume and retry.\n */\n private async withResume<T>(\n fn: () => Promise<T>,\n signal?: AbortSignal,\n ): Promise<T> {\n if (!this.session) {\n await this.resume(signal);\n }\n try {\n return await fn();\n } catch (err) {\n if (isSandboxStoppedError(err)) {\n await this.resume(signal);\n return fn();\n }\n if (isSandboxStoppingError(err) || isSandboxSnapshottingError(err)) {\n await this.waitForStopAndResume(signal);\n return fn();\n }\n throw err;\n }\n }\n\n /**\n * Start executing a command in this sandbox.\n *\n * @param command - The command to execute.\n * @param args - Arguments to pass to the command.\n * @param opts - Optional parameters.\n * @param opts.signal - An AbortSignal to cancel the command execution.\n * @returns A {@link CommandFinished} result once execution is done.\n */\n async runCommand(\n command: string,\n args?: string[],\n opts?: { signal?: AbortSignal },\n ): Promise<CommandFinished>;\n /**\n * Start executing a command in detached mode.\n *\n * @param params - The command parameters.\n * @returns A {@link Command} instance for the running command.\n */\n async runCommand(\n params: RunCommandParams & { detached: true },\n ): Promise<Command>;\n\n /**\n * Start executing a command in this sandbox.\n *\n * @param params - The command parameters.\n * @returns A {@link CommandFinished} result once execution is done.\n */\n\n async runCommand(params: RunCommandParams): Promise<CommandFinished>;\n\n async runCommand(\n commandOrParams: string | RunCommandParams,\n args?: string[],\n opts?: { signal?: AbortSignal },\n ): Promise<Command | CommandFinished> {\n \"use step\";\n const signal =\n typeof commandOrParams === \"string\"\n ? opts?.signal\n : commandOrParams.signal;\n return this.withResume(\n () => this.session!.runCommand(commandOrParams as any, args, opts),\n signal,\n );\n }\n\n /**\n * Internal helper to start a command in the sandbox.\n *\n * @param params - Command execution parameters.\n * @returns A {@link Command} or {@link CommandFinished}, depending on `detached`.\n * @internal\n */\n async getCommand(\n cmdId: string,\n opts?: { signal?: AbortSignal },\n ): Promise<Command> {\n \"use step\";\n return this.withResume(\n () => this.session!.getCommand(cmdId, opts),\n opts?.signal,\n );\n }\n\n /**\n * Create a directory in the filesystem of this sandbox.\n *\n * @param path - Path of the directory to create\n * @param opts - Optional parameters.\n * @param opts.signal - An AbortSignal to cancel the operation.\n */\n async mkDir(path: string, opts?: { signal?: AbortSignal }): Promise<void> {\n \"use step\";\n return this.withResume(\n () => this.session!.mkDir(path, opts),\n opts?.signal,\n );\n }\n\n /**\n * Read a file from the filesystem of this sandbox as a stream.\n *\n * @param file - File to read, with path and optional cwd\n * @param opts - Optional parameters.\n * @param opts.signal - An AbortSignal to cancel the operation.\n * @returns A promise that resolves to a ReadableStream containing the file contents, or null if file not found\n */\n async readFile(\n file: { path: string; cwd?: string },\n opts?: { signal?: AbortSignal },\n ): Promise<NodeJS.ReadableStream | null> {\n \"use step\";\n return this.withResume(\n () => this.session!.readFile(file, opts),\n opts?.signal,\n );\n }\n\n /**\n * Read a file from the filesystem of this sandbox as a Buffer.\n *\n * @param file - File to read, with path and optional cwd\n * @param opts - Optional parameters.\n * @param opts.signal - An AbortSignal to cancel the operation.\n * @returns A promise that resolves to the file contents as a Buffer, or null if file not found\n */\n async readFileToBuffer(\n file: { path: string; cwd?: string },\n opts?: { signal?: AbortSignal },\n ): Promise<Buffer | null> {\n \"use step\";\n return this.withResume(\n () => this.session!.readFileToBuffer(file, opts),\n opts?.signal,\n );\n }\n\n /**\n * Download a file from the sandbox to the local filesystem.\n *\n * @param src - Source file on the sandbox, with path and optional cwd\n * @param dst - Destination file on the local machine, with path and optional cwd\n * @param opts - Optional parameters.\n * @param opts.mkdirRecursive - If true, create parent directories for the destination if they don't exist.\n * @param opts.signal - An AbortSignal to cancel the operation.\n * @returns The absolute path to the written file, or null if the source file was not found\n */\n async downloadFile(\n src: { path: string; cwd?: string },\n dst: { path: string; cwd?: string },\n opts?: { mkdirRecursive?: boolean; signal?: AbortSignal },\n ): Promise<string | null> {\n \"use step\";\n return this.withResume(\n () => this.session!.downloadFile(src, dst, opts),\n opts?.signal,\n );\n }\n\n /**\n * Write files to the filesystem of this sandbox.\n * Defaults to writing to /vercel/sandbox unless an absolute path is specified.\n * Writes files using the `vercel-sandbox` user.\n *\n * @param files - Array of files with path, content, and optional mode (permissions)\n * @param opts - Optional parameters.\n * @param opts.signal - An AbortSignal to cancel the operation.\n * @returns A promise that resolves when the files are written\n *\n * @example\n * // Write an executable script\n * await sandbox.writeFiles([\n * { path: \"/usr/local/bin/myscript\", content: \"#!/bin/bash\\necho hello\", mode: 0o755 }\n * ]);\n */\n async writeFiles(\n files: {\n path: string;\n content: string | Uint8Array;\n mode?: number;\n }[],\n opts?: { signal?: AbortSignal },\n ) {\n \"use step\";\n return this.withResume(\n () => this.session!.writeFiles(files, opts),\n opts?.signal,\n );\n }\n\n /**\n * Get the public domain of a port of this sandbox.\n *\n * @param p - Port number to resolve\n * @returns A full domain (e.g. `https://subdomain.vercel.run`)\n * @throws If the port has no associated route\n */\n domain(p: number): string {\n return this.currentSession().domain(p);\n }\n\n /**\n * Stop the sandbox.\n *\n * @param opts - Optional parameters.\n * @param opts.signal - An AbortSignal to cancel the operation.\n * @param opts.blocking - If true, poll until the sandbox has fully stopped and return the final state.\n * @returns The sandbox at the time the stop was acknowledged, or after fully stopped if `blocking` is true.\n */\n async stop(opts?: {\n signal?: AbortSignal;\n blocking?: boolean;\n }): Promise<SandboxSnapshot> {\n \"use step\";\n if (!this.session) {\n throw new Error(\"No active session to stop.\");\n }\n return this.session.stop(opts);\n }\n\n /**\n * Update the network policy for this sandbox.\n *\n * @deprecated Use {@link Sandbox.update} instead.\n *\n * @param networkPolicy - The new network policy to apply.\n * @param opts - Optional parameters.\n * @param opts.signal - An AbortSignal to cancel the operation.\n * @returns A promise that resolves when the network policy is updated.\n *\n * @example\n * // Restrict to specific domains\n * await sandbox.updateNetworkPolicy({\n * allow: [\"*.npmjs.org\", \"github.com\"],\n * });\n *\n * @example\n * // Inject credentials with per-domain transformers\n * await sandbox.updateNetworkPolicy({\n * allow: {\n * \"ai-gateway.vercel.sh\": [{\n * transform: [{\n * headers: { authorization: \"Bearer ...\" }\n * }]\n * }],\n * \"*\": []\n * }\n * });\n *\n * @example\n * // Deny all network access\n * await sandbox.updateNetworkPolicy(\"deny-all\");\n */\n async updateNetworkPolicy(\n networkPolicy: NetworkPolicy,\n opts?: { signal?: AbortSignal },\n ): Promise<NetworkPolicy> {\n \"use step\";\n await this.withResume(\n () => this.session!.update({ networkPolicy: networkPolicy }, opts),\n opts?.signal,\n );\n\n return this.session!.networkPolicy!;\n }\n\n /**\n * Extend the timeout of the sandbox by the specified duration.\n *\n * This allows you to extend the lifetime of a sandbox up until the maximum\n * execution timeout for your plan.\n *\n * @param duration - The duration in milliseconds to extend the timeout by\n * @param opts - Optional parameters.\n * @param opts.signal - An AbortSignal to cancel the operation.\n * @returns A promise that resolves when the timeout is extended\n *\n * @example\n * const sandbox = await Sandbox.create({ timeout: ms('10m') });\n * // Extends timeout by 5 minutes, to a total of 15 minutes.\n * await sandbox.extendTimeout(ms('5m'));\n */\n async extendTimeout(\n duration: number,\n opts?: { signal?: AbortSignal },\n ): Promise<void> {\n \"use step\";\n return this.withResume(\n () => this.session!.extendTimeout(duration, opts),\n opts?.signal,\n );\n }\n\n /**\n * Create a snapshot from this currently running sandbox. New sandboxes can\n * then be created from this snapshot using {@link Sandbox.createFromSnapshot}.\n *\n * Note: this sandbox will be stopped as part of the snapshot creation process.\n *\n * @param opts - Optional parameters.\n * @param opts.expiration - Optional expiration time in milliseconds. Use 0 for no expiration at all.\n * @param opts.signal - An AbortSignal to cancel the operation.\n * @returns A promise that resolves to the Snapshot instance\n */\n async snapshot(opts?: {\n expiration?: number;\n signal?: AbortSignal;\n }): Promise<Snapshot> {\n \"use step\";\n return this.withResume(\n () => this.session!.snapshot(opts),\n opts?.signal,\n );\n }\n\n /**\n * Update the sandbox configuration.\n *\n * @param params - Fields to update.\n * @param opts - Optional abort signal.\n */\n async update(\n params: {\n persistent?: boolean;\n resources?: { vcpus?: number };\n timeout?: number;\n networkPolicy?: NetworkPolicy;\n tags?: Record<string, string>;\n snapshotExpiration?: number;\n },\n opts?: { signal?: AbortSignal },\n ): Promise<void> {\n \"use step\";\n const client = await this.ensureClient();\n let resources: { vcpus: number; memory: number } | undefined;\n if (params.resources?.vcpus) {\n resources = {\n vcpus: params.resources.vcpus,\n memory: params.resources.vcpus * 2048,\n };\n }\n\n // Update the sandbox config. This config will be used on the next session.\n const response = await client.updateSandbox({\n name: this.sandbox.name,\n projectId: this.projectId,\n persistent: params.persistent,\n resources,\n timeout: params.timeout,\n networkPolicy: params.networkPolicy,\n tags: params.tags,\n snapshotExpiration: params.snapshotExpiration,\n signal: opts?.signal,\n });\n this.sandbox = response.json.sandbox;\n\n // Update the current session config. This only applies to network policy.\n if (params.networkPolicy) {\n try {\n return await this.session?.update(\n { networkPolicy: params.networkPolicy },\n opts,\n );\n } catch (err) {\n if (isSandboxStoppedError(err) || isSandboxStoppingError(err)) {\n return;\n }\n throw err;\n }\n }\n }\n\n /**\n * Delete this sandbox.\n *\n * After deletion the instance becomes inert — all further API calls will\n * throw immediately.\n */\n async delete(opts?: { signal?: AbortSignal }): Promise<void> {\n \"use step\";\n const client = await this.ensureClient();\n await client.deleteSandbox({\n name: this.sandbox.name,\n projectId: this.projectId,\n signal: opts?.signal,\n });\n }\n\n /**\n * List sessions (VMs) that have been created for this sandbox.\n *\n * @param params - Optional pagination parameters.\n * @returns The list of sessions and pagination metadata.\n */\n async listSessions(params?: {\n limit?: number;\n cursor?: string;\n sortOrder?: \"asc\" | \"desc\";\n signal?: AbortSignal;\n }) {\n \"use step\";\n const client = await this.ensureClient();\n const response = await client.listSessions({\n projectId: this.projectId,\n name: this.sandbox.name,\n limit: params?.limit,\n cursor: params?.cursor,\n sortOrder: params?.sortOrder,\n signal: params?.signal,\n });\n return response.json;\n }\n\n /**\n * List snapshots that belong to this sandbox.\n *\n * @param params - Optional pagination parameters.\n * @returns The list of snapshots and pagination metadata.\n */\n async listSnapshots(params?: {\n limit?: number;\n cursor?: string;\n sortOrder?: \"asc\" | \"desc\";\n signal?: AbortSignal;\n }) {\n \"use step\";\n const client = await this.ensureClient();\n const response = await client.listSnapshots({\n projectId: this.projectId,\n name: this.sandbox.name,\n limit: params?.limit,\n cursor: params?.cursor,\n sortOrder: params?.sortOrder,\n signal: params?.signal,\n });\n return response.json;\n }\n}\n\n/**\n * A {@link Sandbox} that can automatically be disposed using a `await using` statement.\n *\n * @example\n * {\n * await using const sandbox = await Sandbox.create();\n * }\n * // Sandbox is automatically stopped here\n */\nclass DisposableSandbox extends Sandbox implements AsyncDisposable {\n async [Symbol.asyncDispose]() {\n await this.stop();\n }\n}\n"],"mappings":"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"} |
+1
-1
| //#region src/version.ts | ||
| const VERSION = "2.0.0-beta.12"; | ||
| const VERSION = "2.0.0-beta.13"; | ||
@@ -5,0 +5,0 @@ //#endregion |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"version.cjs","names":[],"sources":["../src/version.ts"],"sourcesContent":["// Autogenerated by inject-version.ts\nexport const VERSION = \"2.0.0-beta.12\";\n"],"mappings":";;AACA,MAAa,UAAU"} | ||
| {"version":3,"file":"version.cjs","names":[],"sources":["../src/version.ts"],"sourcesContent":["// Autogenerated by inject-version.ts\nexport const VERSION = \"2.0.0-beta.13\";\n"],"mappings":";;AACA,MAAa,UAAU"} |
+1
-1
| //#region src/version.ts | ||
| const VERSION = "2.0.0-beta.12"; | ||
| const VERSION = "2.0.0-beta.13"; | ||
@@ -4,0 +4,0 @@ //#endregion |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"version.js","names":[],"sources":["../src/version.ts"],"sourcesContent":["// Autogenerated by inject-version.ts\nexport const VERSION = \"2.0.0-beta.12\";\n"],"mappings":";AACA,MAAa,UAAU"} | ||
| {"version":3,"file":"version.js","names":[],"sources":["../src/version.ts"],"sourcesContent":["// Autogenerated by inject-version.ts\nexport const VERSION = \"2.0.0-beta.13\";\n"],"mappings":";AACA,MAAa,UAAU"} |
+1
-1
| { | ||
| "name": "@vercel/sandbox", | ||
| "version": "2.0.0-beta.12", | ||
| "version": "2.0.0-beta.13", | ||
| "description": "Software Development Kit for Vercel Sandbox", | ||
@@ -5,0 +5,0 @@ "type": "module", |
Network access
Supply chain riskThis module accesses the network.
Found 1 instance in 1 package
Environment variable access
Supply chain riskPackage accesses environment variables, which may be a sign of credential stuffing or data theft.
Found 5 instances in 1 package
Filesystem access
Supply chain riskAccesses the file system, and could potentially read sensitive data.
Found 2 instances in 1 package
Long strings
Supply chain riskContains long string literals, which may be a sign of obfuscated or packed code.
Found 1 instance in 1 package
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
Found 1 instance in 1 package
Network access
Supply chain riskThis module accesses the network.
Found 1 instance in 1 package
Environment variable access
Supply chain riskPackage accesses environment variables, which may be a sign of credential stuffing or data theft.
Found 5 instances in 1 package
Filesystem access
Supply chain riskAccesses the file system, and could potentially read sensitive data.
Found 2 instances in 1 package
Long strings
Supply chain riskContains long string literals, which may be a sign of obfuscated or packed code.
Found 1 instance in 1 package
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
Found 1 instance in 1 package
973357
0.47%11443
0.28%