@vercel/sandbox
Advanced tools
@@ -38,3 +38,3 @@ import { BaseClient, Parsed, RequestParams } from "./base-client.cjs"; | ||
| timeout: number; | ||
| status: "failed" | "aborted" | "pending" | "running" | "stopping" | "stopped" | "snapshotting"; | ||
| status: "pending" | "running" | "stopping" | "stopped" | "failed" | "aborted" | "snapshotting"; | ||
| requestedAt: number; | ||
@@ -192,3 +192,3 @@ createdAt: number; | ||
| currentSessionId: string; | ||
| status: "failed" | "aborted" | "pending" | "running" | "stopping" | "stopped" | "snapshotting"; | ||
| status: "pending" | "running" | "stopping" | "stopped" | "failed" | "aborted" | "snapshotting"; | ||
| region?: string | undefined; | ||
@@ -309,3 +309,3 @@ vcpus?: number | undefined; | ||
| timeout: number; | ||
| status: "failed" | "aborted" | "pending" | "running" | "stopping" | "stopped" | "snapshotting"; | ||
| status: "pending" | "running" | "stopping" | "stopped" | "failed" | "aborted" | "snapshotting"; | ||
| requestedAt: number; | ||
@@ -512,3 +512,3 @@ createdAt: number; | ||
| timeout: number; | ||
| status: "failed" | "aborted" | "pending" | "running" | "stopping" | "stopped" | "snapshotting"; | ||
| status: "pending" | "running" | "stopping" | "stopped" | "failed" | "aborted" | "snapshotting"; | ||
| requestedAt: number; | ||
@@ -652,3 +652,3 @@ createdAt: number; | ||
| region: string; | ||
| status: "created" | "deleted" | "failed"; | ||
| status: "failed" | "created" | "deleted"; | ||
| sizeBytes: number; | ||
@@ -691,3 +691,3 @@ createdAt: number; | ||
| region: string; | ||
| status: "created" | "deleted" | "failed"; | ||
| status: "failed" | "created" | "deleted"; | ||
| sizeBytes: number; | ||
@@ -705,3 +705,3 @@ createdAt: number; | ||
| region: string; | ||
| status: "created" | "deleted" | "failed"; | ||
| status: "failed" | "created" | "deleted"; | ||
| sizeBytes: number; | ||
@@ -726,3 +726,3 @@ createdAt: number; | ||
| region: string; | ||
| status: "created" | "deleted" | "failed"; | ||
| status: "failed" | "created" | "deleted"; | ||
| sizeBytes: number; | ||
@@ -740,3 +740,3 @@ createdAt: number; | ||
| region: string; | ||
| status: "created" | "deleted" | "failed"; | ||
| status: "failed" | "created" | "deleted"; | ||
| sizeBytes: number; | ||
@@ -784,2 +784,3 @@ createdAt: number; | ||
| startedAt: number; | ||
| durationMs?: number | undefined; | ||
| }; | ||
@@ -833,3 +834,3 @@ }>>; | ||
| currentSessionId: string; | ||
| status: "failed" | "aborted" | "pending" | "running" | "stopping" | "stopped" | "snapshotting"; | ||
| status: "pending" | "running" | "stopping" | "stopped" | "failed" | "aborted" | "snapshotting"; | ||
| region?: string | undefined; | ||
@@ -950,3 +951,3 @@ vcpus?: number | undefined; | ||
| timeout: number; | ||
| status: "failed" | "aborted" | "pending" | "running" | "stopping" | "stopped" | "snapshotting"; | ||
| status: "pending" | "running" | "stopping" | "stopped" | "failed" | "aborted" | "snapshotting"; | ||
| requestedAt: number; | ||
@@ -1079,3 +1080,3 @@ createdAt: number; | ||
| currentSessionId: string; | ||
| status: "failed" | "aborted" | "pending" | "running" | "stopping" | "stopped" | "snapshotting"; | ||
| status: "pending" | "running" | "stopping" | "stopped" | "failed" | "aborted" | "snapshotting"; | ||
| region?: string | undefined; | ||
@@ -1221,3 +1222,3 @@ vcpus?: number | undefined; | ||
| currentSessionId: string; | ||
| status: "failed" | "aborted" | "pending" | "running" | "stopping" | "stopped" | "snapshotting"; | ||
| status: "pending" | "running" | "stopping" | "stopped" | "failed" | "aborted" | "snapshotting"; | ||
| region?: string | undefined; | ||
@@ -1347,3 +1348,3 @@ vcpus?: number | undefined; | ||
| currentSessionId: string; | ||
| status: "failed" | "aborted" | "pending" | "running" | "stopping" | "stopped" | "snapshotting"; | ||
| status: "pending" | "running" | "stopping" | "stopped" | "failed" | "aborted" | "snapshotting"; | ||
| region?: string | undefined; | ||
@@ -1350,0 +1351,0 @@ vcpus?: number | undefined; |
@@ -38,3 +38,3 @@ import { BaseClient, Parsed, RequestParams } from "./base-client.js"; | ||
| timeout: number; | ||
| status: "failed" | "aborted" | "pending" | "running" | "stopping" | "stopped" | "snapshotting"; | ||
| status: "pending" | "running" | "stopping" | "stopped" | "failed" | "aborted" | "snapshotting"; | ||
| requestedAt: number; | ||
@@ -192,3 +192,3 @@ createdAt: number; | ||
| currentSessionId: string; | ||
| status: "failed" | "aborted" | "pending" | "running" | "stopping" | "stopped" | "snapshotting"; | ||
| status: "pending" | "running" | "stopping" | "stopped" | "failed" | "aborted" | "snapshotting"; | ||
| region?: string | undefined; | ||
@@ -309,3 +309,3 @@ vcpus?: number | undefined; | ||
| timeout: number; | ||
| status: "failed" | "aborted" | "pending" | "running" | "stopping" | "stopped" | "snapshotting"; | ||
| status: "pending" | "running" | "stopping" | "stopped" | "failed" | "aborted" | "snapshotting"; | ||
| requestedAt: number; | ||
@@ -512,3 +512,3 @@ createdAt: number; | ||
| timeout: number; | ||
| status: "failed" | "aborted" | "pending" | "running" | "stopping" | "stopped" | "snapshotting"; | ||
| status: "pending" | "running" | "stopping" | "stopped" | "failed" | "aborted" | "snapshotting"; | ||
| requestedAt: number; | ||
@@ -652,3 +652,3 @@ createdAt: number; | ||
| region: string; | ||
| status: "created" | "deleted" | "failed"; | ||
| status: "failed" | "created" | "deleted"; | ||
| sizeBytes: number; | ||
@@ -691,3 +691,3 @@ createdAt: number; | ||
| region: string; | ||
| status: "created" | "deleted" | "failed"; | ||
| status: "failed" | "created" | "deleted"; | ||
| sizeBytes: number; | ||
@@ -705,3 +705,3 @@ createdAt: number; | ||
| region: string; | ||
| status: "created" | "deleted" | "failed"; | ||
| status: "failed" | "created" | "deleted"; | ||
| sizeBytes: number; | ||
@@ -726,3 +726,3 @@ createdAt: number; | ||
| region: string; | ||
| status: "created" | "deleted" | "failed"; | ||
| status: "failed" | "created" | "deleted"; | ||
| sizeBytes: number; | ||
@@ -740,3 +740,3 @@ createdAt: number; | ||
| region: string; | ||
| status: "created" | "deleted" | "failed"; | ||
| status: "failed" | "created" | "deleted"; | ||
| sizeBytes: number; | ||
@@ -784,2 +784,3 @@ createdAt: number; | ||
| startedAt: number; | ||
| durationMs?: number | undefined; | ||
| }; | ||
@@ -833,3 +834,3 @@ }>>; | ||
| currentSessionId: string; | ||
| status: "failed" | "aborted" | "pending" | "running" | "stopping" | "stopped" | "snapshotting"; | ||
| status: "pending" | "running" | "stopping" | "stopped" | "failed" | "aborted" | "snapshotting"; | ||
| region?: string | undefined; | ||
@@ -950,3 +951,3 @@ vcpus?: number | undefined; | ||
| timeout: number; | ||
| status: "failed" | "aborted" | "pending" | "running" | "stopping" | "stopped" | "snapshotting"; | ||
| status: "pending" | "running" | "stopping" | "stopped" | "failed" | "aborted" | "snapshotting"; | ||
| requestedAt: number; | ||
@@ -1079,3 +1080,3 @@ createdAt: number; | ||
| currentSessionId: string; | ||
| status: "failed" | "aborted" | "pending" | "running" | "stopping" | "stopped" | "snapshotting"; | ||
| status: "pending" | "running" | "stopping" | "stopped" | "failed" | "aborted" | "snapshotting"; | ||
| region?: string | undefined; | ||
@@ -1221,3 +1222,3 @@ vcpus?: number | undefined; | ||
| currentSessionId: string; | ||
| status: "failed" | "aborted" | "pending" | "running" | "stopping" | "stopped" | "snapshotting"; | ||
| status: "pending" | "running" | "stopping" | "stopped" | "failed" | "aborted" | "snapshotting"; | ||
| region?: string | undefined; | ||
@@ -1347,3 +1348,3 @@ vcpus?: number | undefined; | ||
| currentSessionId: string; | ||
| status: "failed" | "aborted" | "pending" | "running" | "stopping" | "stopped" | "snapshotting"; | ||
| status: "pending" | "running" | "stopping" | "stopped" | "failed" | "aborted" | "snapshotting"; | ||
| region?: string | undefined; | ||
@@ -1350,0 +1351,0 @@ vcpus?: number | undefined; |
@@ -123,2 +123,3 @@ const require_rolldown_runtime = require('../_virtual/rolldown_runtime.cjs'); | ||
| exitCode: zod.z.number().nullable(), | ||
| durationMs: zod.z.number().optional(), | ||
| startedAt: zod.z.number() | ||
@@ -125,0 +126,0 @@ }); |
@@ -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\nconst RuleMatcherValidator = z.object({\n exact: z.string().optional(),\n startsWith: z.string().optional(),\n regex: z.string().optional(),\n});\n\nconst KeyValueMatcherValidator = z.object({\n key: RuleMatcherValidator.optional(),\n value: RuleMatcherValidator.optional(),\n});\n\nconst RuleMatchValidator = z.object({\n path: RuleMatcherValidator.optional(),\n method: z.array(z.string()).optional(),\n queryString: z.array(KeyValueMatcherValidator).optional(),\n headers: z.array(KeyValueMatcherValidator).optional(),\n});\n\nexport const InjectionRuleValidator = z.object({\n domain: z.string(),\n // headers are only sent in requests\n headers: z.record(z.string(), z.string()).optional(),\n // headerNames are returned in responses\n headerNames: z.array(z.string()).optional(),\n match: RuleMatchValidator.optional(),\n});\n\nexport const ForwardRuleValidator = z.object({\n domain: z.string(),\n forwardURL: z.string(),\n match: RuleMatchValidator.optional(),\n});\n\nexport const NetworkPolicyTransformValidator = z.object({\n headers: z.record(z.string(), z.string()).optional(),\n});\n\nexport const NetworkPolicyRuleValidator = z.object({\n match: RuleMatchValidator.optional(),\n transform: z.array(NetworkPolicyTransformValidator).optional(),\n forwardURL: z.string().optional(),\n});\n\nexport const V2NetworkPolicyObjectValidator = z.object({\n allow: z\n .union([\n z.array(z.string()),\n z.record(z.string(), z.array(NetworkPolicyRuleValidator)),\n ])\n .optional(),\n subnets: z\n .object({\n allow: z.array(z.string()).optional(),\n deny: z.array(z.string()).optional(),\n })\n .optional(),\n});\n\nconst NetworkPolicyModeValidator = z.union([\n z.object({ mode: z.literal(\"allow-all\") }).passthrough(),\n z.object({ mode: z.literal(\"deny-all\") }).passthrough(),\n]);\n\nconst LegacyCustomNetworkPolicyValidator = 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 forwardRules: z.array(ForwardRuleValidator).optional(),\n })\n .passthrough();\n\nexport const NetworkPolicyRequestValidator = z.union([\n NetworkPolicyModeValidator,\n V2NetworkPolicyObjectValidator.passthrough(),\n]);\n\nexport const NetworkPolicyResponseValidator = z.union([\n NetworkPolicyModeValidator,\n LegacyCustomNetworkPolicyValidator,\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: NetworkPolicyResponseValidator.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 lastUsedAt: z.number().optional(),\n creationMethod: z.string().optional(),\n parentId: z.string().optional(),\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 type InteractiveSessionData = z.infer<typeof InteractiveSessionResponse>;\n\nexport const InteractiveSessionResponse = z.object({\n url: z.string(),\n token: z.string(),\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]);\nexport type LogLineData = z.infer<typeof LogLine>;\nexport type LogOutputLine = Exclude<LogLineData, z.infer<typeof LogError>>;\n\nexport const SnapshotsResponse = z.object({\n snapshots: z.array(Snapshot),\n pagination: CursorPagination,\n});\n\nexport const SnapshotTreeNode = z.object({\n snapshot: Snapshot,\n siblings: z.array(Snapshot),\n count: z.string(),\n});\n\nexport type SnapshotTreeNodeData = z.infer<typeof SnapshotTreeNode>;\n\nexport const SnapshotTreeResponse = z.object({\n snapshots: z.array(SnapshotTreeNode),\n anchor: SnapshotTreeNode.optional(),\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: NetworkPolicyResponseValidator.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 expiresAt: z.number().optional(),\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(), z.string()).optional(),\n snapshotExpiration: z.number().optional(),\n keepLastSnapshots: z\n .object({\n count: z.number(),\n expiration: z.number().optional(),\n deleteEvicted: z.boolean().optional(),\n })\n .optional(),\n});\n\nexport type SandboxMetaData = z.infer<typeof Sandbox>;\n\nexport const StopSessionResponse = z.object({\n session: Session.passthrough(),\n sandbox: Sandbox.optional(),\n snapshot: Snapshot.optional(),\n});\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 routes: z.array(SandboxRoute).optional(),\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\nconst RuleMatcherValidator = z.object({\n exact: z.string().optional(),\n startsWith: z.string().optional(),\n regex: z.string().optional(),\n});\n\nconst KeyValueMatcherValidator = z.object({\n key: RuleMatcherValidator.optional(),\n value: RuleMatcherValidator.optional(),\n});\n\nconst RuleMatchValidator = z.object({\n path: RuleMatcherValidator.optional(),\n method: z.array(z.string()).optional(),\n queryString: z.array(KeyValueMatcherValidator).optional(),\n headers: z.array(KeyValueMatcherValidator).optional(),\n});\n\nexport const InjectionRuleValidator = z.object({\n domain: z.string(),\n // headers are only sent in requests\n headers: z.record(z.string(), z.string()).optional(),\n // headerNames are returned in responses\n headerNames: z.array(z.string()).optional(),\n match: RuleMatchValidator.optional(),\n});\n\nexport const ForwardRuleValidator = z.object({\n domain: z.string(),\n forwardURL: z.string(),\n match: RuleMatchValidator.optional(),\n});\n\nexport const NetworkPolicyTransformValidator = z.object({\n headers: z.record(z.string(), z.string()).optional(),\n});\n\nexport const NetworkPolicyRuleValidator = z.object({\n match: RuleMatchValidator.optional(),\n transform: z.array(NetworkPolicyTransformValidator).optional(),\n forwardURL: z.string().optional(),\n});\n\nexport const V2NetworkPolicyObjectValidator = z.object({\n allow: z\n .union([\n z.array(z.string()),\n z.record(z.string(), z.array(NetworkPolicyRuleValidator)),\n ])\n .optional(),\n subnets: z\n .object({\n allow: z.array(z.string()).optional(),\n deny: z.array(z.string()).optional(),\n })\n .optional(),\n});\n\nconst NetworkPolicyModeValidator = z.union([\n z.object({ mode: z.literal(\"allow-all\") }).passthrough(),\n z.object({ mode: z.literal(\"deny-all\") }).passthrough(),\n]);\n\nconst LegacyCustomNetworkPolicyValidator = 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 forwardRules: z.array(ForwardRuleValidator).optional(),\n })\n .passthrough();\n\nexport const NetworkPolicyRequestValidator = z.union([\n NetworkPolicyModeValidator,\n V2NetworkPolicyObjectValidator.passthrough(),\n]);\n\nexport const NetworkPolicyResponseValidator = z.union([\n NetworkPolicyModeValidator,\n LegacyCustomNetworkPolicyValidator,\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: NetworkPolicyResponseValidator.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 lastUsedAt: z.number().optional(),\n creationMethod: z.string().optional(),\n parentId: z.string().optional(),\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 // optional because the duration was not preserved for older commands\n durationMs: z.number().optional(),\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 type InteractiveSessionData = z.infer<typeof InteractiveSessionResponse>;\n\nexport const InteractiveSessionResponse = z.object({\n url: z.string(),\n token: z.string(),\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]);\nexport type LogLineData = z.infer<typeof LogLine>;\nexport type LogOutputLine = Exclude<LogLineData, z.infer<typeof LogError>>;\n\nexport const SnapshotsResponse = z.object({\n snapshots: z.array(Snapshot),\n pagination: CursorPagination,\n});\n\nexport const SnapshotTreeNode = z.object({\n snapshot: Snapshot,\n siblings: z.array(Snapshot),\n count: z.string(),\n});\n\nexport type SnapshotTreeNodeData = z.infer<typeof SnapshotTreeNode>;\n\nexport const SnapshotTreeResponse = z.object({\n snapshots: z.array(SnapshotTreeNode),\n anchor: SnapshotTreeNode.optional(),\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: NetworkPolicyResponseValidator.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 expiresAt: z.number().optional(),\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(), z.string()).optional(),\n snapshotExpiration: z.number().optional(),\n keepLastSnapshots: z\n .object({\n count: z.number(),\n expiration: z.number().optional(),\n deleteEvicted: z.boolean().optional(),\n })\n .optional(),\n});\n\nexport type SandboxMetaData = z.infer<typeof Sandbox>;\n\nexport const StopSessionResponse = z.object({\n session: Session.passthrough(),\n sandbox: Sandbox.optional(),\n snapshot: Snapshot.optional(),\n});\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 routes: z.array(SandboxRoute).optional(),\n});\n"],"mappings":";;;;AAIA,MAAM,uBAAuBA,MAAE,OAAO;CACpC,OAAOA,MAAE,QAAQ,CAAC,UAAU;CAC5B,YAAYA,MAAE,QAAQ,CAAC,UAAU;CACjC,OAAOA,MAAE,QAAQ,CAAC,UAAU;CAC7B,CAAC;AAEF,MAAM,2BAA2BA,MAAE,OAAO;CACxC,KAAK,qBAAqB,UAAU;CACpC,OAAO,qBAAqB,UAAU;CACvC,CAAC;AAEF,MAAM,qBAAqBA,MAAE,OAAO;CAClC,MAAM,qBAAqB,UAAU;CACrC,QAAQA,MAAE,MAAMA,MAAE,QAAQ,CAAC,CAAC,UAAU;CACtC,aAAaA,MAAE,MAAM,yBAAyB,CAAC,UAAU;CACzD,SAASA,MAAE,MAAM,yBAAyB,CAAC,UAAU;CACtD,CAAC;AAEF,MAAa,yBAAyBA,MAAE,OAAO;CAC7C,QAAQA,MAAE,QAAQ;CAElB,SAASA,MAAE,OAAOA,MAAE,QAAQ,EAAEA,MAAE,QAAQ,CAAC,CAAC,UAAU;CAEpD,aAAaA,MAAE,MAAMA,MAAE,QAAQ,CAAC,CAAC,UAAU;CAC3C,OAAO,mBAAmB,UAAU;CACrC,CAAC;AAEF,MAAa,uBAAuBA,MAAE,OAAO;CAC3C,QAAQA,MAAE,QAAQ;CAClB,YAAYA,MAAE,QAAQ;CACtB,OAAO,mBAAmB,UAAU;CACrC,CAAC;AAEF,MAAa,kCAAkCA,MAAE,OAAO,EACtD,SAASA,MAAE,OAAOA,MAAE,QAAQ,EAAEA,MAAE,QAAQ,CAAC,CAAC,UAAU,EACrD,CAAC;AAEF,MAAa,6BAA6BA,MAAE,OAAO;CACjD,OAAO,mBAAmB,UAAU;CACpC,WAAWA,MAAE,MAAM,gCAAgC,CAAC,UAAU;CAC9D,YAAYA,MAAE,QAAQ,CAAC,UAAU;CAClC,CAAC;AAEF,MAAa,iCAAiCA,MAAE,OAAO;CACrD,OAAOA,MACJ,MAAM,CACLA,MAAE,MAAMA,MAAE,QAAQ,CAAC,EACnBA,MAAE,OAAOA,MAAE,QAAQ,EAAEA,MAAE,MAAM,2BAA2B,CAAC,CAC1D,CAAC,CACD,UAAU;CACb,SAASA,MACN,OAAO;EACN,OAAOA,MAAE,MAAMA,MAAE,QAAQ,CAAC,CAAC,UAAU;EACrC,MAAMA,MAAE,MAAMA,MAAE,QAAQ,CAAC,CAAC,UAAU;EACrC,CAAC,CACD,UAAU;CACd,CAAC;AAEF,MAAM,6BAA6BA,MAAE,MAAM,CACzCA,MAAE,OAAO,EAAE,MAAMA,MAAE,QAAQ,YAAY,EAAE,CAAC,CAAC,aAAa,EACxDA,MAAE,OAAO,EAAE,MAAMA,MAAE,QAAQ,WAAW,EAAE,CAAC,CAAC,aAAa,CACxD,CAAC;AAEF,MAAM,qCAAqCA,MACxC,OAAO;CACN,MAAMA,MAAE,QAAQ,SAAS;CACzB,gBAAgBA,MAAE,MAAMA,MAAE,QAAQ,CAAC,CAAC,UAAU;CAC9C,cAAcA,MAAE,MAAMA,MAAE,QAAQ,CAAC,CAAC,UAAU;CAC5C,aAAaA,MAAE,MAAMA,MAAE,QAAQ,CAAC,CAAC,UAAU;CAC3C,gBAAgBA,MAAE,MAAM,uBAAuB,CAAC,UAAU;CAC1D,cAAcA,MAAE,MAAM,qBAAqB,CAAC,UAAU;CACvD,CAAC,CACD,aAAa;AAEhB,MAAa,gCAAgCA,MAAE,MAAM,CACnD,4BACA,+BAA+B,aAAa,CAC7C,CAAC;AAEF,MAAa,iCAAiCA,MAAE,MAAM,CACpD,4BACA,mCACD,CAAC;AAEF,MAAa,UAAUA,MAAE,OAAO;CAC9B,IAAIA,MAAE,QAAQ;CACd,QAAQA,MAAE,QAAQ;CAClB,OAAOA,MAAE,QAAQ;CACjB,QAAQA,MAAE,QAAQ;CAClB,SAASA,MAAE,QAAQ;CACnB,SAASA,MAAE,QAAQ;CACnB,QAAQA,MAAE,KAAK;EACb;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CAAC;CACF,aAAaA,MAAE,QAAQ;CACvB,WAAWA,MAAE,QAAQ,CAAC,UAAU;CAChC,iBAAiBA,MAAE,QAAQ,CAAC,UAAU;CACtC,WAAWA,MAAE,QAAQ,CAAC,UAAU;CAChC,WAAWA,MAAE,QAAQ,CAAC,UAAU;CAChC,UAAUA,MAAE,QAAQ,CAAC,UAAU;CAC/B,kBAAkBA,MAAE,QAAQ,CAAC,UAAU;CACvC,eAAeA,MAAE,QAAQ,CAAC,UAAU;CACpC,WAAWA,MAAE,QAAQ;CACrB,KAAKA,MAAE,QAAQ;CACf,WAAWA,MAAE,QAAQ;CACrB,iBAAiBA,MAAE,QAAQ,CAAC,UAAU;CACtC,eAAe,+BAA+B,UAAU;CACxD,qBAAqBA,MAAE,QAAQ,CAAC,UAAU;CAC1C,iBAAiBA,MAAE,OAAO;EACxB,SAASA,MAAE,QAAQ;EACnB,QAAQA,MAAE,QAAQ;EACnB,CAAC,CAAC,UAAU;CACd,CAAC;AAIF,MAAa,eAAeA,MAAE,OAAO;CACnC,KAAKA,MAAE,QAAQ;CACf,WAAWA,MAAE,QAAQ;CACrB,MAAMA,MAAE,QAAQ;CACjB,CAAC;AAIF,MAAa,WAAWA,MAAE,OAAO;CAC/B,IAAIA,MAAE,QAAQ;CACd,iBAAiBA,MAAE,QAAQ;CAC3B,QAAQA,MAAE,QAAQ;CAClB,QAAQA,MAAE,KAAK;EAAC;EAAW;EAAW;EAAS,CAAC;CAChD,WAAWA,MAAE,QAAQ;CACrB,WAAWA,MAAE,QAAQ,CAAC,UAAU;CAChC,WAAWA,MAAE,QAAQ;CACrB,WAAWA,MAAE,QAAQ;CACrB,YAAYA,MAAE,QAAQ,CAAC,UAAU;CACjC,gBAAgBA,MAAE,QAAQ,CAAC,UAAU;CACrC,UAAUA,MAAE,QAAQ,CAAC,UAAU;CAChC,CAAC;AAEF,MAAa,mBAAmBA,MAAE,OAAO;CACvC,OAAOA,MAAE,QAAQ;CACjB,MAAMA,MAAE,QAAQ,CAAC,UAAU;CAC5B,CAAC;AAIF,MAAa,UAAUA,MAAE,OAAO;CAC9B,IAAIA,MAAE,QAAQ;CACd,MAAMA,MAAE,QAAQ;CAChB,MAAMA,MAAE,MAAMA,MAAE,QAAQ,CAAC;CACzB,KAAKA,MAAE,QAAQ;CACf,WAAWA,MAAE,QAAQ;CACrB,UAAUA,MAAE,QAAQ,CAAC,UAAU;CAE/B,YAAYA,MAAE,QAAQ,CAAC,UAAU;CACjC,WAAWA,MAAE,QAAQ;CACtB,CAAC;AAEF,MAAM,kBAAkB,QAAQ,OAAO,EACrC,UAAUA,MAAE,QAAQ,EACrB,CAAC;AAEF,MAAa,kBAAkBA,MAAE,OAAO,EACtC,SAAS,QAAQ,aAAa,EAC/B,CAAC;AAEF,MAAa,2BAA2B,gBAAgB,OAAO,EAC7D,QAAQA,MAAE,MAAM,aAAa,EAC9B,CAAC;AAIF,MAAa,6BAA6BA,MAAE,OAAO;CACjD,KAAKA,MAAE,QAAQ;CACf,OAAOA,MAAE,QAAQ;CAClB,CAAC;AAEF,MAAa,mBAAmBA,MAAE,OAAO;CACvC,UAAUA,MAAE,MAAM,QAAQ,aAAa,CAAC;CACxC,YAAY;CACb,CAAC;AAEF,MAAa,kBAAkBA,MAAE,OAAO,EACtC,SAAS,SACV,CAAC;AAIF,MAAa,0BAA0BA,MAAE,OAAO,EAC9C,SAAS,iBACV,CAAC;AAEF,MAAa,gBAAgBA,MAAE,OAAO,EAAE,CAAC;AAEzC,MAAM,cAAcA,MAAE,OAAO,EAAE,MAAMA,MAAE,QAAQ,EAAE,CAAC;AAClD,MAAa,gBAAgB,YAAY,OAAO,EAC9C,QAAQA,MAAE,QAAQ,SAAS,EAC5B,CAAC;AACF,MAAa,gBAAgB,YAAY,OAAO,EAC9C,QAAQA,MAAE,QAAQ,SAAS,EAC5B,CAAC;AAEF,MAAa,WAAWA,MAAE,OAAO;CAC/B,QAAQA,MAAE,QAAQ,QAAQ;CAC1B,MAAMA,MAAE,OAAO;EACb,MAAMA,MAAE,QAAQ;EAChB,SAASA,MAAE,QAAQ;EACpB,CAAC;CACH,CAAC;AAEF,MAAa,UAAUA,MAAE,mBAAmB,UAAU;CACpD;CACA;CACA;CACD,CAAC;AAIF,MAAa,oBAAoBA,MAAE,OAAO;CACxC,WAAWA,MAAE,MAAM,SAAS;CAC5B,YAAY;CACb,CAAC;AAEF,MAAa,mBAAmBA,MAAE,OAAO;CACvC,UAAU;CACV,UAAUA,MAAE,MAAM,SAAS;CAC3B,OAAOA,MAAE,QAAQ;CAClB,CAAC;AAIF,MAAa,uBAAuBA,MAAE,OAAO;CAC3C,WAAWA,MAAE,MAAM,iBAAiB;CACpC,QAAQ,iBAAiB,UAAU;CACnC,YAAY;CACb,CAAC;AAEF,MAAa,yBAAyBA,MAAE,OAAO;CAC7C,UAAU;CACV,SAAS,QAAQ,aAAa;CAC/B,CAAC;AAEF,MAAa,mBAAmBA,MAAE,OAAO,EACvC,UAAU,UACX,CAAC;AAEF,MAAa,UAAUA,MAAE,OAAO;CAC9B,MAAMA,MAAE,QAAQ;CAChB,YAAYA,MAAE,SAAS;CACvB,QAAQA,MAAE,QAAQ,CAAC,UAAU;CAC7B,OAAOA,MAAE,QAAQ,CAAC,UAAU;CAC5B,QAAQA,MAAE,QAAQ,CAAC,UAAU;CAC7B,SAASA,MAAE,QAAQ,CAAC,UAAU;CAC9B,SAASA,MAAE,QAAQ,CAAC,UAAU;CAC9B,eAAe,+BAA+B,UAAU;CACxD,kBAAkBA,MAAE,QAAQ,CAAC,UAAU;CACvC,mBAAmBA,MAAE,QAAQ,CAAC,UAAU;CACxC,0BAA0BA,MAAE,QAAQ,CAAC,UAAU;CAC/C,iBAAiBA,MAAE,QAAQ,CAAC,UAAU;CACtC,WAAWA,MAAE,QAAQ;CACrB,WAAWA,MAAE,QAAQ;CACrB,WAAWA,MAAE,QAAQ,CAAC,UAAU;CAChC,kBAAkBA,MAAE,QAAQ;CAC5B,mBAAmBA,MAAE,QAAQ,CAAC,UAAU;CACxC,QAAQ,QAAQ,MAAM;CACtB,iBAAiBA,MAAE,QAAQ,CAAC,UAAU;CACtC,KAAKA,MAAE,QAAQ,CAAC,UAAU;CAC1B,MAAMA,MAAE,OAAOA,MAAE,QAAQ,EAAEA,MAAE,QAAQ,CAAC,CAAC,UAAU;CACjD,oBAAoBA,MAAE,QAAQ,CAAC,UAAU;CACzC,mBAAmBA,MAChB,OAAO;EACN,OAAOA,MAAE,QAAQ;EACjB,YAAYA,MAAE,QAAQ,CAAC,UAAU;EACjC,eAAeA,MAAE,SAAS,CAAC,UAAU;EACtC,CAAC,CACD,UAAU;CACd,CAAC;AAIF,MAAa,sBAAsBA,MAAE,OAAO;CAC1C,SAAS,QAAQ,aAAa;CAC9B,SAAS,QAAQ,UAAU;CAC3B,UAAU,SAAS,UAAU;CAC9B,CAAC;AAEF,MAAa,4BAA4BA,MAAE,OAAO;CAChD,SAAS;CACT,SAAS,QAAQ,aAAa;CAC9B,QAAQA,MAAE,MAAM,aAAa;CAC7B,SAASA,MAAE,SAAS,CAAC,UAAU;CAChC,CAAC;AAEF,MAAa,8BAA8BA,MAAE,OAAO;CAClD,WAAWA,MAAE,MAAM,QAAQ;CAC3B,YAAY;CACb,CAAC;AAEF,MAAa,wBAAwBA,MAAE,OAAO;CAC5C,SAAS;CACT,QAAQA,MAAE,MAAM,aAAa,CAAC,UAAU;CACzC,CAAC"} |
@@ -13,4 +13,2 @@ import { z } from "zod"; | ||
| status: z.ZodEnum<{ | ||
| failed: "failed"; | ||
| aborted: "aborted"; | ||
| pending: "pending"; | ||
@@ -20,2 +18,4 @@ running: "running"; | ||
| stopped: "stopped"; | ||
| failed: "failed"; | ||
| aborted: "aborted"; | ||
| snapshotting: "snapshotting"; | ||
@@ -136,5 +136,5 @@ }>; | ||
| status: z.ZodEnum<{ | ||
| failed: "failed"; | ||
| created: "created"; | ||
| deleted: "deleted"; | ||
| failed: "failed"; | ||
| }>; | ||
@@ -157,2 +157,3 @@ sizeBytes: z.ZodNumber; | ||
| exitCode: z.ZodNullable<z.ZodNumber>; | ||
| durationMs: z.ZodOptional<z.ZodNumber>; | ||
| startedAt: z.ZodNumber; | ||
@@ -169,4 +170,2 @@ }, z.core.$strip>; | ||
| status: z.ZodEnum<{ | ||
| failed: "failed"; | ||
| aborted: "aborted"; | ||
| pending: "pending"; | ||
@@ -176,2 +175,4 @@ running: "running"; | ||
| stopped: "stopped"; | ||
| failed: "failed"; | ||
| aborted: "aborted"; | ||
| snapshotting: "snapshotting"; | ||
@@ -293,2 +294,3 @@ }>; | ||
| exitCode: z.ZodNullable<z.ZodNumber>; | ||
| durationMs: z.ZodOptional<z.ZodNumber>; | ||
| startedAt: z.ZodNumber; | ||
@@ -305,2 +307,3 @@ }, z.core.$strip>; | ||
| sessionId: z.ZodString; | ||
| durationMs: z.ZodOptional<z.ZodNumber>; | ||
| startedAt: z.ZodNumber; | ||
@@ -338,5 +341,5 @@ exitCode: z.ZodNumber; | ||
| status: z.ZodEnum<{ | ||
| failed: "failed"; | ||
| created: "created"; | ||
| deleted: "deleted"; | ||
| failed: "failed"; | ||
| }>; | ||
@@ -356,5 +359,5 @@ sizeBytes: z.ZodNumber; | ||
| status: z.ZodEnum<{ | ||
| failed: "failed"; | ||
| created: "created"; | ||
| deleted: "deleted"; | ||
| failed: "failed"; | ||
| }>; | ||
@@ -378,5 +381,5 @@ sizeBytes: z.ZodNumber; | ||
| status: z.ZodEnum<{ | ||
| failed: "failed"; | ||
| created: "created"; | ||
| deleted: "deleted"; | ||
| failed: "failed"; | ||
| }>; | ||
@@ -399,4 +402,2 @@ sizeBytes: z.ZodNumber; | ||
| status: z.ZodEnum<{ | ||
| failed: "failed"; | ||
| aborted: "aborted"; | ||
| pending: "pending"; | ||
@@ -406,2 +407,4 @@ running: "running"; | ||
| stopped: "stopped"; | ||
| failed: "failed"; | ||
| aborted: "aborted"; | ||
| snapshotting: "snapshotting"; | ||
@@ -517,5 +520,5 @@ }>; | ||
| status: z.ZodEnum<{ | ||
| failed: "failed"; | ||
| created: "created"; | ||
| deleted: "deleted"; | ||
| failed: "failed"; | ||
| }>; | ||
@@ -632,4 +635,2 @@ sizeBytes: z.ZodNumber; | ||
| status: z.ZodEnum<{ | ||
| failed: "failed"; | ||
| aborted: "aborted"; | ||
| pending: "pending"; | ||
@@ -639,2 +640,4 @@ running: "running"; | ||
| stopped: "stopped"; | ||
| failed: "failed"; | ||
| aborted: "aborted"; | ||
| snapshotting: "snapshotting"; | ||
@@ -662,4 +665,2 @@ }>; | ||
| status: z.ZodEnum<{ | ||
| failed: "failed"; | ||
| aborted: "aborted"; | ||
| pending: "pending"; | ||
@@ -669,2 +670,4 @@ running: "running"; | ||
| stopped: "stopped"; | ||
| failed: "failed"; | ||
| aborted: "aborted"; | ||
| snapshotting: "snapshotting"; | ||
@@ -874,4 +877,2 @@ }>; | ||
| status: z.ZodEnum<{ | ||
| failed: "failed"; | ||
| aborted: "aborted"; | ||
| pending: "pending"; | ||
@@ -881,2 +882,4 @@ running: "running"; | ||
| stopped: "stopped"; | ||
| failed: "failed"; | ||
| aborted: "aborted"; | ||
| snapshotting: "snapshotting"; | ||
@@ -899,5 +902,5 @@ }>; | ||
| status: z.ZodEnum<{ | ||
| failed: "failed"; | ||
| created: "created"; | ||
| deleted: "deleted"; | ||
| failed: "failed"; | ||
| }>; | ||
@@ -904,0 +907,0 @@ sizeBytes: z.ZodNumber; |
@@ -13,4 +13,2 @@ import { z } from "zod"; | ||
| status: z.ZodEnum<{ | ||
| failed: "failed"; | ||
| aborted: "aborted"; | ||
| pending: "pending"; | ||
@@ -20,2 +18,4 @@ running: "running"; | ||
| stopped: "stopped"; | ||
| failed: "failed"; | ||
| aborted: "aborted"; | ||
| snapshotting: "snapshotting"; | ||
@@ -136,5 +136,5 @@ }>; | ||
| status: z.ZodEnum<{ | ||
| failed: "failed"; | ||
| created: "created"; | ||
| deleted: "deleted"; | ||
| failed: "failed"; | ||
| }>; | ||
@@ -157,2 +157,3 @@ sizeBytes: z.ZodNumber; | ||
| exitCode: z.ZodNullable<z.ZodNumber>; | ||
| durationMs: z.ZodOptional<z.ZodNumber>; | ||
| startedAt: z.ZodNumber; | ||
@@ -169,4 +170,2 @@ }, z.core.$strip>; | ||
| status: z.ZodEnum<{ | ||
| failed: "failed"; | ||
| aborted: "aborted"; | ||
| pending: "pending"; | ||
@@ -176,2 +175,4 @@ running: "running"; | ||
| stopped: "stopped"; | ||
| failed: "failed"; | ||
| aborted: "aborted"; | ||
| snapshotting: "snapshotting"; | ||
@@ -293,2 +294,3 @@ }>; | ||
| exitCode: z.ZodNullable<z.ZodNumber>; | ||
| durationMs: z.ZodOptional<z.ZodNumber>; | ||
| startedAt: z.ZodNumber; | ||
@@ -305,2 +307,3 @@ }, z.core.$strip>; | ||
| sessionId: z.ZodString; | ||
| durationMs: z.ZodOptional<z.ZodNumber>; | ||
| startedAt: z.ZodNumber; | ||
@@ -338,5 +341,5 @@ exitCode: z.ZodNumber; | ||
| status: z.ZodEnum<{ | ||
| failed: "failed"; | ||
| created: "created"; | ||
| deleted: "deleted"; | ||
| failed: "failed"; | ||
| }>; | ||
@@ -356,5 +359,5 @@ sizeBytes: z.ZodNumber; | ||
| status: z.ZodEnum<{ | ||
| failed: "failed"; | ||
| created: "created"; | ||
| deleted: "deleted"; | ||
| failed: "failed"; | ||
| }>; | ||
@@ -378,5 +381,5 @@ sizeBytes: z.ZodNumber; | ||
| status: z.ZodEnum<{ | ||
| failed: "failed"; | ||
| created: "created"; | ||
| deleted: "deleted"; | ||
| failed: "failed"; | ||
| }>; | ||
@@ -399,4 +402,2 @@ sizeBytes: z.ZodNumber; | ||
| status: z.ZodEnum<{ | ||
| failed: "failed"; | ||
| aborted: "aborted"; | ||
| pending: "pending"; | ||
@@ -406,2 +407,4 @@ running: "running"; | ||
| stopped: "stopped"; | ||
| failed: "failed"; | ||
| aborted: "aborted"; | ||
| snapshotting: "snapshotting"; | ||
@@ -517,5 +520,5 @@ }>; | ||
| status: z.ZodEnum<{ | ||
| failed: "failed"; | ||
| created: "created"; | ||
| deleted: "deleted"; | ||
| failed: "failed"; | ||
| }>; | ||
@@ -632,4 +635,2 @@ sizeBytes: z.ZodNumber; | ||
| status: z.ZodEnum<{ | ||
| failed: "failed"; | ||
| aborted: "aborted"; | ||
| pending: "pending"; | ||
@@ -639,2 +640,4 @@ running: "running"; | ||
| stopped: "stopped"; | ||
| failed: "failed"; | ||
| aborted: "aborted"; | ||
| snapshotting: "snapshotting"; | ||
@@ -662,4 +665,2 @@ }>; | ||
| status: z.ZodEnum<{ | ||
| failed: "failed"; | ||
| aborted: "aborted"; | ||
| pending: "pending"; | ||
@@ -669,2 +670,4 @@ running: "running"; | ||
| stopped: "stopped"; | ||
| failed: "failed"; | ||
| aborted: "aborted"; | ||
| snapshotting: "snapshotting"; | ||
@@ -874,4 +877,2 @@ }>; | ||
| status: z.ZodEnum<{ | ||
| failed: "failed"; | ||
| aborted: "aborted"; | ||
| pending: "pending"; | ||
@@ -881,2 +882,4 @@ running: "running"; | ||
| stopped: "stopped"; | ||
| failed: "failed"; | ||
| aborted: "aborted"; | ||
| snapshotting: "snapshotting"; | ||
@@ -899,5 +902,5 @@ }>; | ||
| status: z.ZodEnum<{ | ||
| failed: "failed"; | ||
| created: "created"; | ||
| deleted: "deleted"; | ||
| failed: "failed"; | ||
| }>; | ||
@@ -904,0 +907,0 @@ sizeBytes: z.ZodNumber; |
@@ -122,2 +122,3 @@ import { z } from "zod"; | ||
| exitCode: z.number().nullable(), | ||
| durationMs: z.number().optional(), | ||
| startedAt: z.number() | ||
@@ -124,0 +125,0 @@ }); |
@@ -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\nconst RuleMatcherValidator = z.object({\n exact: z.string().optional(),\n startsWith: z.string().optional(),\n regex: z.string().optional(),\n});\n\nconst KeyValueMatcherValidator = z.object({\n key: RuleMatcherValidator.optional(),\n value: RuleMatcherValidator.optional(),\n});\n\nconst RuleMatchValidator = z.object({\n path: RuleMatcherValidator.optional(),\n method: z.array(z.string()).optional(),\n queryString: z.array(KeyValueMatcherValidator).optional(),\n headers: z.array(KeyValueMatcherValidator).optional(),\n});\n\nexport const InjectionRuleValidator = z.object({\n domain: z.string(),\n // headers are only sent in requests\n headers: z.record(z.string(), z.string()).optional(),\n // headerNames are returned in responses\n headerNames: z.array(z.string()).optional(),\n match: RuleMatchValidator.optional(),\n});\n\nexport const ForwardRuleValidator = z.object({\n domain: z.string(),\n forwardURL: z.string(),\n match: RuleMatchValidator.optional(),\n});\n\nexport const NetworkPolicyTransformValidator = z.object({\n headers: z.record(z.string(), z.string()).optional(),\n});\n\nexport const NetworkPolicyRuleValidator = z.object({\n match: RuleMatchValidator.optional(),\n transform: z.array(NetworkPolicyTransformValidator).optional(),\n forwardURL: z.string().optional(),\n});\n\nexport const V2NetworkPolicyObjectValidator = z.object({\n allow: z\n .union([\n z.array(z.string()),\n z.record(z.string(), z.array(NetworkPolicyRuleValidator)),\n ])\n .optional(),\n subnets: z\n .object({\n allow: z.array(z.string()).optional(),\n deny: z.array(z.string()).optional(),\n })\n .optional(),\n});\n\nconst NetworkPolicyModeValidator = z.union([\n z.object({ mode: z.literal(\"allow-all\") }).passthrough(),\n z.object({ mode: z.literal(\"deny-all\") }).passthrough(),\n]);\n\nconst LegacyCustomNetworkPolicyValidator = 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 forwardRules: z.array(ForwardRuleValidator).optional(),\n })\n .passthrough();\n\nexport const NetworkPolicyRequestValidator = z.union([\n NetworkPolicyModeValidator,\n V2NetworkPolicyObjectValidator.passthrough(),\n]);\n\nexport const NetworkPolicyResponseValidator = z.union([\n NetworkPolicyModeValidator,\n LegacyCustomNetworkPolicyValidator,\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: NetworkPolicyResponseValidator.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 lastUsedAt: z.number().optional(),\n creationMethod: z.string().optional(),\n parentId: z.string().optional(),\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 type InteractiveSessionData = z.infer<typeof InteractiveSessionResponse>;\n\nexport const InteractiveSessionResponse = z.object({\n url: z.string(),\n token: z.string(),\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]);\nexport type LogLineData = z.infer<typeof LogLine>;\nexport type LogOutputLine = Exclude<LogLineData, z.infer<typeof LogError>>;\n\nexport const SnapshotsResponse = z.object({\n snapshots: z.array(Snapshot),\n pagination: CursorPagination,\n});\n\nexport const SnapshotTreeNode = z.object({\n snapshot: Snapshot,\n siblings: z.array(Snapshot),\n count: z.string(),\n});\n\nexport type SnapshotTreeNodeData = z.infer<typeof SnapshotTreeNode>;\n\nexport const SnapshotTreeResponse = z.object({\n snapshots: z.array(SnapshotTreeNode),\n anchor: SnapshotTreeNode.optional(),\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: NetworkPolicyResponseValidator.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 expiresAt: z.number().optional(),\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(), z.string()).optional(),\n snapshotExpiration: z.number().optional(),\n keepLastSnapshots: z\n .object({\n count: z.number(),\n expiration: z.number().optional(),\n deleteEvicted: z.boolean().optional(),\n })\n .optional(),\n});\n\nexport type SandboxMetaData = z.infer<typeof Sandbox>;\n\nexport const StopSessionResponse = z.object({\n session: Session.passthrough(),\n sandbox: Sandbox.optional(),\n snapshot: Snapshot.optional(),\n});\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 routes: z.array(SandboxRoute).optional(),\n});\n"],"mappings":"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"} | ||
| {"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\nconst RuleMatcherValidator = z.object({\n exact: z.string().optional(),\n startsWith: z.string().optional(),\n regex: z.string().optional(),\n});\n\nconst KeyValueMatcherValidator = z.object({\n key: RuleMatcherValidator.optional(),\n value: RuleMatcherValidator.optional(),\n});\n\nconst RuleMatchValidator = z.object({\n path: RuleMatcherValidator.optional(),\n method: z.array(z.string()).optional(),\n queryString: z.array(KeyValueMatcherValidator).optional(),\n headers: z.array(KeyValueMatcherValidator).optional(),\n});\n\nexport const InjectionRuleValidator = z.object({\n domain: z.string(),\n // headers are only sent in requests\n headers: z.record(z.string(), z.string()).optional(),\n // headerNames are returned in responses\n headerNames: z.array(z.string()).optional(),\n match: RuleMatchValidator.optional(),\n});\n\nexport const ForwardRuleValidator = z.object({\n domain: z.string(),\n forwardURL: z.string(),\n match: RuleMatchValidator.optional(),\n});\n\nexport const NetworkPolicyTransformValidator = z.object({\n headers: z.record(z.string(), z.string()).optional(),\n});\n\nexport const NetworkPolicyRuleValidator = z.object({\n match: RuleMatchValidator.optional(),\n transform: z.array(NetworkPolicyTransformValidator).optional(),\n forwardURL: z.string().optional(),\n});\n\nexport const V2NetworkPolicyObjectValidator = z.object({\n allow: z\n .union([\n z.array(z.string()),\n z.record(z.string(), z.array(NetworkPolicyRuleValidator)),\n ])\n .optional(),\n subnets: z\n .object({\n allow: z.array(z.string()).optional(),\n deny: z.array(z.string()).optional(),\n })\n .optional(),\n});\n\nconst NetworkPolicyModeValidator = z.union([\n z.object({ mode: z.literal(\"allow-all\") }).passthrough(),\n z.object({ mode: z.literal(\"deny-all\") }).passthrough(),\n]);\n\nconst LegacyCustomNetworkPolicyValidator = 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 forwardRules: z.array(ForwardRuleValidator).optional(),\n })\n .passthrough();\n\nexport const NetworkPolicyRequestValidator = z.union([\n NetworkPolicyModeValidator,\n V2NetworkPolicyObjectValidator.passthrough(),\n]);\n\nexport const NetworkPolicyResponseValidator = z.union([\n NetworkPolicyModeValidator,\n LegacyCustomNetworkPolicyValidator,\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: NetworkPolicyResponseValidator.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 lastUsedAt: z.number().optional(),\n creationMethod: z.string().optional(),\n parentId: z.string().optional(),\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 // optional because the duration was not preserved for older commands\n durationMs: z.number().optional(),\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 type InteractiveSessionData = z.infer<typeof InteractiveSessionResponse>;\n\nexport const InteractiveSessionResponse = z.object({\n url: z.string(),\n token: z.string(),\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]);\nexport type LogLineData = z.infer<typeof LogLine>;\nexport type LogOutputLine = Exclude<LogLineData, z.infer<typeof LogError>>;\n\nexport const SnapshotsResponse = z.object({\n snapshots: z.array(Snapshot),\n pagination: CursorPagination,\n});\n\nexport const SnapshotTreeNode = z.object({\n snapshot: Snapshot,\n siblings: z.array(Snapshot),\n count: z.string(),\n});\n\nexport type SnapshotTreeNodeData = z.infer<typeof SnapshotTreeNode>;\n\nexport const SnapshotTreeResponse = z.object({\n snapshots: z.array(SnapshotTreeNode),\n anchor: SnapshotTreeNode.optional(),\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: NetworkPolicyResponseValidator.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 expiresAt: z.number().optional(),\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(), z.string()).optional(),\n snapshotExpiration: z.number().optional(),\n keepLastSnapshots: z\n .object({\n count: z.number(),\n expiration: z.number().optional(),\n deleteEvicted: z.boolean().optional(),\n })\n .optional(),\n});\n\nexport type SandboxMetaData = z.infer<typeof Sandbox>;\n\nexport const StopSessionResponse = z.object({\n session: Session.passthrough(),\n sandbox: Sandbox.optional(),\n snapshot: Snapshot.optional(),\n});\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 routes: z.array(SandboxRoute).optional(),\n});\n"],"mappings":"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"} |
+8
-2
@@ -64,2 +64,3 @@ const require_rolldown_runtime = require('./_virtual/rolldown_runtime.cjs'); | ||
| this.exitCode = cmd.exitCode ?? null; | ||
| this.durationMs = cmd.durationMs; | ||
| if (output) { | ||
@@ -165,3 +166,4 @@ this._resolvedOutput = output; | ||
| cmd: command.json.command, | ||
| exitCode: command.json.command.exitCode | ||
| exitCode: command.json.command.exitCode, | ||
| durationMs: command.json.command.durationMs | ||
| }); | ||
@@ -279,2 +281,3 @@ } | ||
| * @param params.exitCode - The exit code of the completed command. | ||
| * @param params.durationMs - Optional duration of the command execution in milliseconds. | ||
| * @param params.output - Optional cached output to restore (used during deserialization). | ||
@@ -285,2 +288,3 @@ */ | ||
| this.exitCode = params.exitCode; | ||
| this.durationMs = params.durationMs ?? params.cmd.durationMs; | ||
| } | ||
@@ -296,3 +300,4 @@ /** | ||
| ...Command[__workflow_serde.WORKFLOW_SERIALIZE](instance), | ||
| exitCode: instance.exitCode | ||
| exitCode: instance.exitCode, | ||
| durationMs: instance.durationMs | ||
| }; | ||
@@ -314,2 +319,3 @@ } | ||
| exitCode: data.exitCode, | ||
| durationMs: data.durationMs, | ||
| output: data.output | ||
@@ -316,0 +322,0 @@ }); |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"command.cjs","names":["getCredentials","APIClient","WORKFLOW_SERIALIZE","serialized: SerializedCommand","WORKFLOW_DESERIALIZE","resolveSignal"],"sources":["../src/command.ts"],"sourcesContent":["import { WORKFLOW_DESERIALIZE, WORKFLOW_SERIALIZE } from \"@workflow/serde\";\nimport { APIClient, type CommandData } from \"./api-client/index.js\";\nimport { getCredentials } from \"./utils/get-credentials.js\";\nimport { resolveSignal, type Signal } from \"./utils/resolveSignal.js\";\n\n/**\n * Cached output from a command execution.\n */\nexport interface CommandOutput {\n stdout: string;\n stderr: string;\n}\n\n/**\n * Serialized representation of a Command for @workflow/serde.\n */\nexport interface SerializedCommand {\n sandboxId: string;\n cmd: CommandData;\n /** Cached output, included if output was fetched before serialization */\n output?: CommandOutput;\n}\n\n/**\n * Serialized representation of a CommandFinished for @workflow/serde.\n */\nexport interface SerializedCommandFinished extends SerializedCommand {\n exitCode: number;\n}\n\n/**\n * A command executed in a Sandbox.\n *\n * For detached commands, you can {@link wait} to get a {@link CommandFinished} instance\n * with the populated exit code. For non-detached commands, {@link Sandbox.runCommand}\n * automatically waits and returns a {@link CommandFinished} instance.\n *\n * You can iterate over command output with {@link logs}.\n *\n * @see {@link Sandbox.runCommand} to start a command.\n *\n * @hideconstructor\n */\nexport class Command {\n /**\n * Cached API client instance.\n * @internal\n */\n protected _client: APIClient | null = null;\n\n /**\n * Lazily resolve credentials and construct an API client.\n * @internal\n */\n protected 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 * ID of the session this command is running in.\n */\n protected sessionId: string;\n\n /**\n * Data for the command execution.\n */\n protected cmd: CommandData;\n\n public exitCode: number | null;\n\n protected outputCache: Promise<{\n stdout: string;\n stderr: string;\n both: string;\n }> | null = null;\n\n /**\n * Synchronously accessible resolved output, populated after output is fetched.\n * Used for serialization.\n * @internal\n */\n protected _resolvedOutput: CommandOutput | null = null;\n\n /**\n * ID of the command execution.\n */\n get cmdId() {\n return this.cmd.id;\n }\n\n get cwd() {\n return this.cmd.cwd;\n }\n\n get startedAt() {\n return this.cmd.startedAt;\n }\n\n /**\n * @param params - Object containing the client, sandbox ID, and command data.\n * @param params.client - Optional API client. If not provided, will be lazily created using global credentials.\n * @param params.sessionId - The ID of the session where the command is running.\n * @param params.cmd - The command data.\n * @param params.output - Optional cached output to restore (used during deserialization).\n */\n constructor({\n client,\n sessionId,\n cmd,\n output,\n }: {\n client?: APIClient;\n sessionId: string;\n cmd: CommandData;\n output?: CommandOutput;\n }) {\n this._client = client ?? null;\n this.sessionId = sessionId;\n this.cmd = cmd;\n this.exitCode = cmd.exitCode ?? null;\n if (output) {\n this._resolvedOutput = output;\n // Note: `both` is reconstructed as stdout + stderr concatenation,\n // which loses the original interleaved order of the streams.\n this.outputCache = Promise.resolve({\n stdout: output.stdout,\n stderr: output.stderr,\n both: output.stdout + output.stderr,\n });\n }\n }\n\n /**\n * Serialize a Command instance to plain data for @workflow/serde.\n *\n * @param instance - The Command instance to serialize\n * @returns A plain object containing the sandbox ID, command data, and output if fetched\n */\n static [WORKFLOW_SERIALIZE](instance: Command): SerializedCommand {\n const serialized: SerializedCommand = {\n sandboxId: instance.sessionId,\n cmd: instance.cmd,\n };\n if (instance._resolvedOutput) {\n serialized.output = instance._resolvedOutput;\n }\n return serialized;\n }\n\n /**\n * Deserialize plain data back into a Command instance for @workflow/serde.\n *\n * The deserialized instance will lazily create an API client using\n * OIDC or environment credentials when needed.\n *\n * @param data - The serialized command data\n * @returns The reconstructed Command instance\n */\n static [WORKFLOW_DESERIALIZE](data: SerializedCommand): Command {\n return new Command({\n sessionId: data.sandboxId,\n cmd: data.cmd,\n output: data.output,\n });\n }\n\n /**\n * Iterate over the output of this command.\n *\n * ```\n * for await (const log of cmd.logs()) {\n * if (log.stream === \"stdout\") {\n * process.stdout.write(log.data);\n * } else {\n * process.stderr.write(log.data);\n * }\n * }\n * ```\n *\n * @param opts - Optional parameters.\n * @param opts.signal - An AbortSignal to cancel log streaming.\n * @returns An async iterable of log entries from the command output.\n *\n * @see {@link Command.stdout}, {@link Command.stderr}, and {@link Command.output}\n * to access output as a string.\n */\n logs(opts?: { signal?: AbortSignal }) {\n if (!this._client) {\n throw new Error(\n \"logs() requires an API client. Call an async method first to initialize the client.\",\n );\n }\n return this._client.getLogs({\n sessionId: this.sessionId,\n cmdId: this.cmd.id,\n signal: opts?.signal,\n });\n }\n\n /**\n * Wait for a command to exit and populate its exit code.\n *\n * This method is useful for detached commands where you need to wait\n * for completion. For non-detached commands, {@link Sandbox.runCommand}\n * automatically waits and returns a {@link CommandFinished} instance.\n *\n * ```\n * const detachedCmd = await sandbox.runCommand({ cmd: 'sleep', args: ['5'], detached: true });\n * const result = await detachedCmd.wait();\n * if (result.exitCode !== 0) {\n * console.error(\"Something went wrong...\")\n * }\n * ```\n *\n * @param params - Optional parameters.\n * @param params.signal - An AbortSignal to cancel waiting.\n * @returns A {@link CommandFinished} instance with populated exit code.\n */\n async wait(params?: { signal?: AbortSignal }) {\n \"use step\";\n const client = await this.ensureClient();\n params?.signal?.throwIfAborted();\n\n const command = await client.getCommand({\n sessionId: this.sessionId,\n cmdId: this.cmd.id,\n wait: true,\n signal: params?.signal,\n });\n\n return new CommandFinished({\n client,\n sessionId: this.sessionId,\n cmd: command.json.command,\n exitCode: command.json.command.exitCode,\n });\n }\n\n /**\n * Get cached output, fetching logs only once and reusing for concurrent calls.\n * This prevents race conditions when stdout() and stderr() are called in parallel.\n */\n protected async getCachedOutput(opts?: { signal?: AbortSignal }): Promise<{\n stdout: string;\n stderr: string;\n both: string;\n }> {\n if (!this.outputCache) {\n this.outputCache = (async () => {\n try {\n opts?.signal?.throwIfAborted();\n // Ensure the API client is initialized before calling logs(),\n // since logs() is synchronous and requires _client to be set.\n await this.ensureClient();\n let stdout = \"\";\n let stderr = \"\";\n let both = \"\";\n for await (const log of this.logs({ signal: opts?.signal })) {\n both += log.data;\n if (log.stream === \"stdout\") {\n stdout += log.data;\n } else {\n stderr += log.data;\n }\n }\n // Store resolved output for serialization\n this._resolvedOutput = { stdout, stderr };\n return { stdout, stderr, both };\n } catch (err) {\n // Clear the promise so future calls can retry\n this.outputCache = null;\n throw err;\n }\n })();\n }\n\n return this.outputCache;\n }\n\n /**\n * Get the output of `stdout`, `stderr`, or both as a string.\n *\n * NOTE: This may throw string conversion errors if the command does\n * not output valid Unicode.\n *\n * @param stream - The output stream to read: \"stdout\", \"stderr\", or \"both\".\n * @param opts - Optional parameters.\n * @param opts.signal - An AbortSignal to cancel output streaming.\n * @returns The output of the specified stream(s) as a string.\n */\n async output(\n stream: \"stdout\" | \"stderr\" | \"both\" = \"both\",\n opts?: { signal?: AbortSignal },\n ) {\n \"use step\";\n const cached = await this.getCachedOutput(opts);\n return cached[stream];\n }\n\n /**\n * Get the output of `stdout` as a string.\n *\n * NOTE: This may throw string conversion errors if the command does\n * not output valid Unicode.\n *\n * @param opts - Optional parameters.\n * @param opts.signal - An AbortSignal to cancel output streaming.\n * @returns The standard output of the command.\n */\n async stdout(opts?: { signal?: AbortSignal }) {\n \"use step\";\n return this.output(\"stdout\", opts);\n }\n\n /**\n * Get the output of `stderr` as a string.\n *\n * NOTE: This may throw string conversion errors if the command does\n * not output valid Unicode.\n *\n * @param opts - Optional parameters.\n * @param opts.signal - An AbortSignal to cancel output streaming.\n * @returns The standard error output of the command.\n */\n async stderr(opts?: { signal?: AbortSignal }) {\n \"use step\";\n return this.output(\"stderr\", opts);\n }\n\n /**\n * Kill a running command in a sandbox.\n *\n * @param signal - The signal to send the running process. Defaults to SIGTERM.\n * @param opts - Optional parameters.\n * @param opts.abortSignal - An AbortSignal to cancel the kill operation.\n * @returns Promise<void>.\n */\n async kill(signal?: Signal, opts?: { abortSignal?: AbortSignal }) {\n \"use step\";\n const client = await this.ensureClient();\n await client.killCommand({\n sessionId: this.sessionId,\n commandId: this.cmd.id,\n signal: resolveSignal(signal ?? \"SIGTERM\"),\n abortSignal: opts?.abortSignal,\n });\n }\n}\n\n/**\n * A command that has finished executing.\n *\n * The exit code is immediately available and populated upon creation.\n * Unlike {@link Command}, you don't need to call wait() - the command\n * has already completed execution.\n *\n * @hideconstructor\n */\nexport class CommandFinished extends Command {\n /**\n * The exit code of the command. This is always populated for\n * CommandFinished instances.\n */\n public exitCode: number;\n\n /**\n * @param params - Object containing client, sandbox ID, command data, and exit code.\n * @param params.client - Optional API client. If not provided, will be lazily created using global credentials.\n * @param params.sessionId - The ID of the session where the command ran.\n * @param params.cmd - The command data.\n * @param params.exitCode - The exit code of the completed command.\n * @param params.output - Optional cached output to restore (used during deserialization).\n */\n constructor(params: {\n client?: APIClient;\n sessionId: string;\n cmd: CommandData;\n exitCode: number;\n output?: CommandOutput;\n }) {\n super({ ...params });\n this.exitCode = params.exitCode;\n }\n\n /**\n * Serialize a CommandFinished instance to plain data for @workflow/serde.\n *\n * @param instance - The CommandFinished instance to serialize\n * @returns A plain object containing the sandbox ID, command data, exit code, and output if fetched\n */\n static [WORKFLOW_SERIALIZE](\n instance: CommandFinished,\n ): SerializedCommandFinished {\n return {\n ...Command[WORKFLOW_SERIALIZE](instance),\n exitCode: instance.exitCode,\n };\n }\n\n /**\n * Deserialize plain data back into a CommandFinished instance for @workflow/serde.\n *\n * The deserialized instance will lazily create an API client using\n * OIDC or environment credentials when needed.\n *\n * @param data - The serialized command finished data\n * @returns The reconstructed CommandFinished instance\n */\n static [WORKFLOW_DESERIALIZE](\n data: SerializedCommandFinished,\n ): CommandFinished {\n return new CommandFinished({\n sessionId: data.sandboxId,\n cmd: data.cmd,\n exitCode: data.exitCode,\n output: data.output,\n });\n }\n\n /**\n * The wait method is not needed for CommandFinished instances since\n * the command has already completed and exitCode is populated.\n *\n * @deprecated This method is redundant for CommandFinished instances.\n * The exitCode is already available.\n * @returns This CommandFinished instance.\n */\n async wait(): Promise<CommandFinished> {\n return this;\n }\n}\n"],"mappings":"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"} | ||
| {"version":3,"file":"command.cjs","names":["getCredentials","APIClient","WORKFLOW_SERIALIZE","serialized: SerializedCommand","WORKFLOW_DESERIALIZE","resolveSignal"],"sources":["../src/command.ts"],"sourcesContent":["import { WORKFLOW_DESERIALIZE, WORKFLOW_SERIALIZE } from \"@workflow/serde\";\nimport {\n APIClient,\n type CommandData,\n} from \"./api-client/index.js\";\nimport { getCredentials } from \"./utils/get-credentials.js\";\nimport { resolveSignal, type Signal } from \"./utils/resolveSignal.js\";\n\n/**\n * Cached output from a command execution.\n */\nexport interface CommandOutput {\n stdout: string;\n stderr: string;\n}\n\n/**\n * Serialized representation of a Command for @workflow/serde.\n */\nexport interface SerializedCommand {\n sandboxId: string;\n cmd: CommandData;\n /** Cached output, included if output was fetched before serialization */\n output?: CommandOutput;\n}\n\n/**\n * Serialized representation of a CommandFinished for @workflow/serde.\n */\nexport interface SerializedCommandFinished extends SerializedCommand {\n exitCode: number;\n durationMs?: number;\n}\n\n/**\n * A command executed in a Sandbox.\n *\n * For detached commands, you can {@link wait} to get a {@link CommandFinished} instance\n * with the populated exit code. For non-detached commands, {@link Sandbox.runCommand}\n * automatically waits and returns a {@link CommandFinished} instance.\n *\n * You can iterate over command output with {@link logs}.\n *\n * @see {@link Sandbox.runCommand} to start a command.\n *\n * @hideconstructor\n */\nexport class Command {\n /**\n * Cached API client instance.\n * @internal\n */\n protected _client: APIClient | null = null;\n\n /**\n * Lazily resolve credentials and construct an API client.\n * @internal\n */\n protected 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 * ID of the session this command is running in.\n */\n protected sessionId: string;\n\n /**\n * Data for the command execution.\n */\n protected cmd: CommandData;\n\n public exitCode: number | null;\n\n public durationMs?: number;\n\n protected outputCache: Promise<{\n stdout: string;\n stderr: string;\n both: string;\n }> | null = null;\n\n /**\n * Synchronously accessible resolved output, populated after output is fetched.\n * Used for serialization.\n * @internal\n */\n protected _resolvedOutput: CommandOutput | null = null;\n\n /**\n * ID of the command execution.\n */\n get cmdId() {\n return this.cmd.id;\n }\n\n get cwd() {\n return this.cmd.cwd;\n }\n\n get startedAt() {\n return this.cmd.startedAt;\n }\n\n /**\n * @param params - Object containing the client, sandbox ID, and command data.\n * @param params.client - Optional API client. If not provided, will be lazily created using global credentials.\n * @param params.sessionId - The ID of the session where the command is running.\n * @param params.cmd - The command data.\n * @param params.output - Optional cached output to restore (used during deserialization).\n */\n constructor({\n client,\n sessionId,\n cmd,\n output,\n }: {\n client?: APIClient;\n sessionId: string;\n cmd: CommandData;\n output?: CommandOutput;\n }) {\n this._client = client ?? null;\n this.sessionId = sessionId;\n this.cmd = cmd;\n this.exitCode = cmd.exitCode ?? null;\n this.durationMs = cmd.durationMs;\n if (output) {\n this._resolvedOutput = output;\n // Note: `both` is reconstructed as stdout + stderr concatenation,\n // which loses the original interleaved order of the streams.\n this.outputCache = Promise.resolve({\n stdout: output.stdout,\n stderr: output.stderr,\n both: output.stdout + output.stderr,\n });\n }\n }\n\n /**\n * Serialize a Command instance to plain data for @workflow/serde.\n *\n * @param instance - The Command instance to serialize\n * @returns A plain object containing the sandbox ID, command data, and output if fetched\n */\n static [WORKFLOW_SERIALIZE](instance: Command): SerializedCommand {\n const serialized: SerializedCommand = {\n sandboxId: instance.sessionId,\n cmd: instance.cmd,\n };\n if (instance._resolvedOutput) {\n serialized.output = instance._resolvedOutput;\n }\n return serialized;\n }\n\n /**\n * Deserialize plain data back into a Command instance for @workflow/serde.\n *\n * The deserialized instance will lazily create an API client using\n * OIDC or environment credentials when needed.\n *\n * @param data - The serialized command data\n * @returns The reconstructed Command instance\n */\n static [WORKFLOW_DESERIALIZE](data: SerializedCommand): Command {\n return new Command({\n sessionId: data.sandboxId,\n cmd: data.cmd,\n output: data.output,\n });\n }\n\n /**\n * Iterate over the output of this command.\n *\n * ```\n * for await (const log of cmd.logs()) {\n * if (log.stream === \"stdout\") {\n * process.stdout.write(log.data);\n * } else {\n * process.stderr.write(log.data);\n * }\n * }\n * ```\n *\n * @param opts - Optional parameters.\n * @param opts.signal - An AbortSignal to cancel log streaming.\n * @returns An async iterable of log entries from the command output.\n *\n * @see {@link Command.stdout}, {@link Command.stderr}, and {@link Command.output}\n * to access output as a string.\n */\n logs(opts?: { signal?: AbortSignal }) {\n if (!this._client) {\n throw new Error(\n \"logs() requires an API client. Call an async method first to initialize the client.\",\n );\n }\n return this._client.getLogs({\n sessionId: this.sessionId,\n cmdId: this.cmd.id,\n signal: opts?.signal,\n });\n }\n\n /**\n * Wait for a command to exit and populate its exit code.\n *\n * This method is useful for detached commands where you need to wait\n * for completion. For non-detached commands, {@link Sandbox.runCommand}\n * automatically waits and returns a {@link CommandFinished} instance.\n *\n * ```\n * const detachedCmd = await sandbox.runCommand({ cmd: 'sleep', args: ['5'], detached: true });\n * const result = await detachedCmd.wait();\n * if (result.exitCode !== 0) {\n * console.error(\"Something went wrong...\")\n * }\n * ```\n *\n * @param params - Optional parameters.\n * @param params.signal - An AbortSignal to cancel waiting.\n * @returns A {@link CommandFinished} instance with populated exit code.\n */\n async wait(params?: { signal?: AbortSignal }) {\n \"use step\";\n const client = await this.ensureClient();\n params?.signal?.throwIfAborted();\n\n const command = await client.getCommand({\n sessionId: this.sessionId,\n cmdId: this.cmd.id,\n wait: true,\n signal: params?.signal,\n });\n\n return new CommandFinished({\n client,\n sessionId: this.sessionId,\n cmd: command.json.command,\n exitCode: command.json.command.exitCode,\n durationMs: command.json.command.durationMs,\n });\n }\n\n /**\n * Get cached output, fetching logs only once and reusing for concurrent calls.\n * This prevents race conditions when stdout() and stderr() are called in parallel.\n */\n protected async getCachedOutput(opts?: { signal?: AbortSignal }): Promise<{\n stdout: string;\n stderr: string;\n both: string;\n }> {\n if (!this.outputCache) {\n this.outputCache = (async () => {\n try {\n opts?.signal?.throwIfAborted();\n // Ensure the API client is initialized before calling logs(),\n // since logs() is synchronous and requires _client to be set.\n await this.ensureClient();\n let stdout = \"\";\n let stderr = \"\";\n let both = \"\";\n for await (const log of this.logs({ signal: opts?.signal })) {\n both += log.data;\n if (log.stream === \"stdout\") {\n stdout += log.data;\n } else {\n stderr += log.data;\n }\n }\n // Store resolved output for serialization\n this._resolvedOutput = { stdout, stderr };\n return { stdout, stderr, both };\n } catch (err) {\n // Clear the promise so future calls can retry\n this.outputCache = null;\n throw err;\n }\n })();\n }\n\n return this.outputCache;\n }\n\n /**\n * Get the output of `stdout`, `stderr`, or both as a string.\n *\n * NOTE: This may throw string conversion errors if the command does\n * not output valid Unicode.\n *\n * @param stream - The output stream to read: \"stdout\", \"stderr\", or \"both\".\n * @param opts - Optional parameters.\n * @param opts.signal - An AbortSignal to cancel output streaming.\n * @returns The output of the specified stream(s) as a string.\n */\n async output(\n stream: \"stdout\" | \"stderr\" | \"both\" = \"both\",\n opts?: { signal?: AbortSignal },\n ) {\n \"use step\";\n const cached = await this.getCachedOutput(opts);\n return cached[stream];\n }\n\n /**\n * Get the output of `stdout` as a string.\n *\n * NOTE: This may throw string conversion errors if the command does\n * not output valid Unicode.\n *\n * @param opts - Optional parameters.\n * @param opts.signal - An AbortSignal to cancel output streaming.\n * @returns The standard output of the command.\n */\n async stdout(opts?: { signal?: AbortSignal }) {\n \"use step\";\n return this.output(\"stdout\", opts);\n }\n\n /**\n * Get the output of `stderr` as a string.\n *\n * NOTE: This may throw string conversion errors if the command does\n * not output valid Unicode.\n *\n * @param opts - Optional parameters.\n * @param opts.signal - An AbortSignal to cancel output streaming.\n * @returns The standard error output of the command.\n */\n async stderr(opts?: { signal?: AbortSignal }) {\n \"use step\";\n return this.output(\"stderr\", opts);\n }\n\n /**\n * Kill a running command in a sandbox.\n *\n * @param signal - The signal to send the running process. Defaults to SIGTERM.\n * @param opts - Optional parameters.\n * @param opts.abortSignal - An AbortSignal to cancel the kill operation.\n * @returns Promise<void>.\n */\n async kill(signal?: Signal, opts?: { abortSignal?: AbortSignal }) {\n \"use step\";\n const client = await this.ensureClient();\n await client.killCommand({\n sessionId: this.sessionId,\n commandId: this.cmd.id,\n signal: resolveSignal(signal ?? \"SIGTERM\"),\n abortSignal: opts?.abortSignal,\n });\n }\n}\n\n/**\n * A command that has finished executing.\n *\n * The exit code is immediately available and populated upon creation.\n * Unlike {@link Command}, you don't need to call wait() - the command\n * has already completed execution.\n *\n * @hideconstructor\n */\nexport class CommandFinished extends Command {\n /**\n * The exit code of the command. This is always populated for\n * CommandFinished instances.\n */\n public exitCode: number;\n\n /**\n * The duration of the command execution in milliseconds.\n */\n public durationMs?: number;\n\n /**\n * @param params - Object containing client, sandbox ID, command data, and exit code.\n * @param params.client - Optional API client. If not provided, will be lazily created using global credentials.\n * @param params.sessionId - The ID of the session where the command ran.\n * @param params.cmd - The command data.\n * @param params.exitCode - The exit code of the completed command.\n * @param params.durationMs - Optional duration of the command execution in milliseconds.\n * @param params.output - Optional cached output to restore (used during deserialization).\n */\n constructor(params: {\n client?: APIClient;\n sessionId: string;\n cmd: CommandData;\n exitCode: number;\n durationMs?: number;\n output?: CommandOutput;\n }) {\n super({ ...params });\n this.exitCode = params.exitCode;\n this.durationMs = params.durationMs ?? params.cmd.durationMs;\n }\n\n /**\n * Serialize a CommandFinished instance to plain data for @workflow/serde.\n *\n * @param instance - The CommandFinished instance to serialize\n * @returns A plain object containing the sandbox ID, command data, exit code, and output if fetched\n */\n static [WORKFLOW_SERIALIZE](\n instance: CommandFinished,\n ): SerializedCommandFinished {\n return {\n ...Command[WORKFLOW_SERIALIZE](instance),\n exitCode: instance.exitCode,\n durationMs: instance.durationMs,\n };\n }\n\n /**\n * Deserialize plain data back into a CommandFinished instance for @workflow/serde.\n *\n * The deserialized instance will lazily create an API client using\n * OIDC or environment credentials when needed.\n *\n * @param data - The serialized command finished data\n * @returns The reconstructed CommandFinished instance\n */\n static [WORKFLOW_DESERIALIZE](\n data: SerializedCommandFinished,\n ): CommandFinished {\n return new CommandFinished({\n sessionId: data.sandboxId,\n cmd: data.cmd,\n exitCode: data.exitCode,\n durationMs: data.durationMs,\n output: data.output,\n });\n }\n\n /**\n * The wait method is not needed for CommandFinished instances since\n * the command has already completed and exitCode is populated.\n *\n * @deprecated This method is redundant for CommandFinished instances.\n * The exitCode is already available.\n * @returns This CommandFinished instance.\n */\n async wait(): Promise<CommandFinished> {\n return this;\n }\n}\n"],"mappings":"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"} |
@@ -28,2 +28,3 @@ import { CommandData, LogOutputLine } from "./api-client/validators.cjs"; | ||
| exitCode: number; | ||
| durationMs?: number; | ||
| } | ||
@@ -63,2 +64,3 @@ /** | ||
| exitCode: number | null; | ||
| durationMs?: number; | ||
| protected outputCache: Promise<{ | ||
@@ -242,2 +244,6 @@ stdout: string; | ||
| /** | ||
| * The duration of the command execution in milliseconds. | ||
| */ | ||
| durationMs?: number; | ||
| /** | ||
| * @param params - Object containing client, sandbox ID, command data, and exit code. | ||
@@ -248,2 +254,3 @@ * @param params.client - Optional API client. If not provided, will be lazily created using global credentials. | ||
| * @param params.exitCode - The exit code of the completed command. | ||
| * @param params.durationMs - Optional duration of the command execution in milliseconds. | ||
| * @param params.output - Optional cached output to restore (used during deserialization). | ||
@@ -256,2 +263,3 @@ */ | ||
| exitCode: number; | ||
| durationMs?: number; | ||
| output?: CommandOutput; | ||
@@ -258,0 +266,0 @@ }); |
@@ -29,2 +29,3 @@ import { CommandData, LogOutputLine } from "./api-client/validators.js"; | ||
| exitCode: number; | ||
| durationMs?: number; | ||
| } | ||
@@ -64,2 +65,3 @@ /** | ||
| exitCode: number | null; | ||
| durationMs?: number; | ||
| protected outputCache: Promise<{ | ||
@@ -243,2 +245,6 @@ stdout: string; | ||
| /** | ||
| * The duration of the command execution in milliseconds. | ||
| */ | ||
| durationMs?: number; | ||
| /** | ||
| * @param params - Object containing client, sandbox ID, command data, and exit code. | ||
@@ -249,2 +255,3 @@ * @param params.client - Optional API client. If not provided, will be lazily created using global credentials. | ||
| * @param params.exitCode - The exit code of the completed command. | ||
| * @param params.durationMs - Optional duration of the command execution in milliseconds. | ||
| * @param params.output - Optional cached output to restore (used during deserialization). | ||
@@ -257,2 +264,3 @@ */ | ||
| exitCode: number; | ||
| durationMs?: number; | ||
| output?: CommandOutput; | ||
@@ -259,0 +267,0 @@ }); |
+8
-2
@@ -63,2 +63,3 @@ import { APIClient } from "./api-client/api-client.js"; | ||
| this.exitCode = cmd.exitCode ?? null; | ||
| this.durationMs = cmd.durationMs; | ||
| if (output) { | ||
@@ -164,3 +165,4 @@ this._resolvedOutput = output; | ||
| cmd: command.json.command, | ||
| exitCode: command.json.command.exitCode | ||
| exitCode: command.json.command.exitCode, | ||
| durationMs: command.json.command.durationMs | ||
| }); | ||
@@ -278,2 +280,3 @@ } | ||
| * @param params.exitCode - The exit code of the completed command. | ||
| * @param params.durationMs - Optional duration of the command execution in milliseconds. | ||
| * @param params.output - Optional cached output to restore (used during deserialization). | ||
@@ -284,2 +287,3 @@ */ | ||
| this.exitCode = params.exitCode; | ||
| this.durationMs = params.durationMs ?? params.cmd.durationMs; | ||
| } | ||
@@ -295,3 +299,4 @@ /** | ||
| ...Command[WORKFLOW_SERIALIZE](instance), | ||
| exitCode: instance.exitCode | ||
| exitCode: instance.exitCode, | ||
| durationMs: instance.durationMs | ||
| }; | ||
@@ -313,2 +318,3 @@ } | ||
| exitCode: data.exitCode, | ||
| durationMs: data.durationMs, | ||
| output: data.output | ||
@@ -315,0 +321,0 @@ }); |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"command.js","names":["serialized: SerializedCommand"],"sources":["../src/command.ts"],"sourcesContent":["import { WORKFLOW_DESERIALIZE, WORKFLOW_SERIALIZE } from \"@workflow/serde\";\nimport { APIClient, type CommandData } from \"./api-client/index.js\";\nimport { getCredentials } from \"./utils/get-credentials.js\";\nimport { resolveSignal, type Signal } from \"./utils/resolveSignal.js\";\n\n/**\n * Cached output from a command execution.\n */\nexport interface CommandOutput {\n stdout: string;\n stderr: string;\n}\n\n/**\n * Serialized representation of a Command for @workflow/serde.\n */\nexport interface SerializedCommand {\n sandboxId: string;\n cmd: CommandData;\n /** Cached output, included if output was fetched before serialization */\n output?: CommandOutput;\n}\n\n/**\n * Serialized representation of a CommandFinished for @workflow/serde.\n */\nexport interface SerializedCommandFinished extends SerializedCommand {\n exitCode: number;\n}\n\n/**\n * A command executed in a Sandbox.\n *\n * For detached commands, you can {@link wait} to get a {@link CommandFinished} instance\n * with the populated exit code. For non-detached commands, {@link Sandbox.runCommand}\n * automatically waits and returns a {@link CommandFinished} instance.\n *\n * You can iterate over command output with {@link logs}.\n *\n * @see {@link Sandbox.runCommand} to start a command.\n *\n * @hideconstructor\n */\nexport class Command {\n /**\n * Cached API client instance.\n * @internal\n */\n protected _client: APIClient | null = null;\n\n /**\n * Lazily resolve credentials and construct an API client.\n * @internal\n */\n protected 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 * ID of the session this command is running in.\n */\n protected sessionId: string;\n\n /**\n * Data for the command execution.\n */\n protected cmd: CommandData;\n\n public exitCode: number | null;\n\n protected outputCache: Promise<{\n stdout: string;\n stderr: string;\n both: string;\n }> | null = null;\n\n /**\n * Synchronously accessible resolved output, populated after output is fetched.\n * Used for serialization.\n * @internal\n */\n protected _resolvedOutput: CommandOutput | null = null;\n\n /**\n * ID of the command execution.\n */\n get cmdId() {\n return this.cmd.id;\n }\n\n get cwd() {\n return this.cmd.cwd;\n }\n\n get startedAt() {\n return this.cmd.startedAt;\n }\n\n /**\n * @param params - Object containing the client, sandbox ID, and command data.\n * @param params.client - Optional API client. If not provided, will be lazily created using global credentials.\n * @param params.sessionId - The ID of the session where the command is running.\n * @param params.cmd - The command data.\n * @param params.output - Optional cached output to restore (used during deserialization).\n */\n constructor({\n client,\n sessionId,\n cmd,\n output,\n }: {\n client?: APIClient;\n sessionId: string;\n cmd: CommandData;\n output?: CommandOutput;\n }) {\n this._client = client ?? null;\n this.sessionId = sessionId;\n this.cmd = cmd;\n this.exitCode = cmd.exitCode ?? null;\n if (output) {\n this._resolvedOutput = output;\n // Note: `both` is reconstructed as stdout + stderr concatenation,\n // which loses the original interleaved order of the streams.\n this.outputCache = Promise.resolve({\n stdout: output.stdout,\n stderr: output.stderr,\n both: output.stdout + output.stderr,\n });\n }\n }\n\n /**\n * Serialize a Command instance to plain data for @workflow/serde.\n *\n * @param instance - The Command instance to serialize\n * @returns A plain object containing the sandbox ID, command data, and output if fetched\n */\n static [WORKFLOW_SERIALIZE](instance: Command): SerializedCommand {\n const serialized: SerializedCommand = {\n sandboxId: instance.sessionId,\n cmd: instance.cmd,\n };\n if (instance._resolvedOutput) {\n serialized.output = instance._resolvedOutput;\n }\n return serialized;\n }\n\n /**\n * Deserialize plain data back into a Command instance for @workflow/serde.\n *\n * The deserialized instance will lazily create an API client using\n * OIDC or environment credentials when needed.\n *\n * @param data - The serialized command data\n * @returns The reconstructed Command instance\n */\n static [WORKFLOW_DESERIALIZE](data: SerializedCommand): Command {\n return new Command({\n sessionId: data.sandboxId,\n cmd: data.cmd,\n output: data.output,\n });\n }\n\n /**\n * Iterate over the output of this command.\n *\n * ```\n * for await (const log of cmd.logs()) {\n * if (log.stream === \"stdout\") {\n * process.stdout.write(log.data);\n * } else {\n * process.stderr.write(log.data);\n * }\n * }\n * ```\n *\n * @param opts - Optional parameters.\n * @param opts.signal - An AbortSignal to cancel log streaming.\n * @returns An async iterable of log entries from the command output.\n *\n * @see {@link Command.stdout}, {@link Command.stderr}, and {@link Command.output}\n * to access output as a string.\n */\n logs(opts?: { signal?: AbortSignal }) {\n if (!this._client) {\n throw new Error(\n \"logs() requires an API client. Call an async method first to initialize the client.\",\n );\n }\n return this._client.getLogs({\n sessionId: this.sessionId,\n cmdId: this.cmd.id,\n signal: opts?.signal,\n });\n }\n\n /**\n * Wait for a command to exit and populate its exit code.\n *\n * This method is useful for detached commands where you need to wait\n * for completion. For non-detached commands, {@link Sandbox.runCommand}\n * automatically waits and returns a {@link CommandFinished} instance.\n *\n * ```\n * const detachedCmd = await sandbox.runCommand({ cmd: 'sleep', args: ['5'], detached: true });\n * const result = await detachedCmd.wait();\n * if (result.exitCode !== 0) {\n * console.error(\"Something went wrong...\")\n * }\n * ```\n *\n * @param params - Optional parameters.\n * @param params.signal - An AbortSignal to cancel waiting.\n * @returns A {@link CommandFinished} instance with populated exit code.\n */\n async wait(params?: { signal?: AbortSignal }) {\n \"use step\";\n const client = await this.ensureClient();\n params?.signal?.throwIfAborted();\n\n const command = await client.getCommand({\n sessionId: this.sessionId,\n cmdId: this.cmd.id,\n wait: true,\n signal: params?.signal,\n });\n\n return new CommandFinished({\n client,\n sessionId: this.sessionId,\n cmd: command.json.command,\n exitCode: command.json.command.exitCode,\n });\n }\n\n /**\n * Get cached output, fetching logs only once and reusing for concurrent calls.\n * This prevents race conditions when stdout() and stderr() are called in parallel.\n */\n protected async getCachedOutput(opts?: { signal?: AbortSignal }): Promise<{\n stdout: string;\n stderr: string;\n both: string;\n }> {\n if (!this.outputCache) {\n this.outputCache = (async () => {\n try {\n opts?.signal?.throwIfAborted();\n // Ensure the API client is initialized before calling logs(),\n // since logs() is synchronous and requires _client to be set.\n await this.ensureClient();\n let stdout = \"\";\n let stderr = \"\";\n let both = \"\";\n for await (const log of this.logs({ signal: opts?.signal })) {\n both += log.data;\n if (log.stream === \"stdout\") {\n stdout += log.data;\n } else {\n stderr += log.data;\n }\n }\n // Store resolved output for serialization\n this._resolvedOutput = { stdout, stderr };\n return { stdout, stderr, both };\n } catch (err) {\n // Clear the promise so future calls can retry\n this.outputCache = null;\n throw err;\n }\n })();\n }\n\n return this.outputCache;\n }\n\n /**\n * Get the output of `stdout`, `stderr`, or both as a string.\n *\n * NOTE: This may throw string conversion errors if the command does\n * not output valid Unicode.\n *\n * @param stream - The output stream to read: \"stdout\", \"stderr\", or \"both\".\n * @param opts - Optional parameters.\n * @param opts.signal - An AbortSignal to cancel output streaming.\n * @returns The output of the specified stream(s) as a string.\n */\n async output(\n stream: \"stdout\" | \"stderr\" | \"both\" = \"both\",\n opts?: { signal?: AbortSignal },\n ) {\n \"use step\";\n const cached = await this.getCachedOutput(opts);\n return cached[stream];\n }\n\n /**\n * Get the output of `stdout` as a string.\n *\n * NOTE: This may throw string conversion errors if the command does\n * not output valid Unicode.\n *\n * @param opts - Optional parameters.\n * @param opts.signal - An AbortSignal to cancel output streaming.\n * @returns The standard output of the command.\n */\n async stdout(opts?: { signal?: AbortSignal }) {\n \"use step\";\n return this.output(\"stdout\", opts);\n }\n\n /**\n * Get the output of `stderr` as a string.\n *\n * NOTE: This may throw string conversion errors if the command does\n * not output valid Unicode.\n *\n * @param opts - Optional parameters.\n * @param opts.signal - An AbortSignal to cancel output streaming.\n * @returns The standard error output of the command.\n */\n async stderr(opts?: { signal?: AbortSignal }) {\n \"use step\";\n return this.output(\"stderr\", opts);\n }\n\n /**\n * Kill a running command in a sandbox.\n *\n * @param signal - The signal to send the running process. Defaults to SIGTERM.\n * @param opts - Optional parameters.\n * @param opts.abortSignal - An AbortSignal to cancel the kill operation.\n * @returns Promise<void>.\n */\n async kill(signal?: Signal, opts?: { abortSignal?: AbortSignal }) {\n \"use step\";\n const client = await this.ensureClient();\n await client.killCommand({\n sessionId: this.sessionId,\n commandId: this.cmd.id,\n signal: resolveSignal(signal ?? \"SIGTERM\"),\n abortSignal: opts?.abortSignal,\n });\n }\n}\n\n/**\n * A command that has finished executing.\n *\n * The exit code is immediately available and populated upon creation.\n * Unlike {@link Command}, you don't need to call wait() - the command\n * has already completed execution.\n *\n * @hideconstructor\n */\nexport class CommandFinished extends Command {\n /**\n * The exit code of the command. This is always populated for\n * CommandFinished instances.\n */\n public exitCode: number;\n\n /**\n * @param params - Object containing client, sandbox ID, command data, and exit code.\n * @param params.client - Optional API client. If not provided, will be lazily created using global credentials.\n * @param params.sessionId - The ID of the session where the command ran.\n * @param params.cmd - The command data.\n * @param params.exitCode - The exit code of the completed command.\n * @param params.output - Optional cached output to restore (used during deserialization).\n */\n constructor(params: {\n client?: APIClient;\n sessionId: string;\n cmd: CommandData;\n exitCode: number;\n output?: CommandOutput;\n }) {\n super({ ...params });\n this.exitCode = params.exitCode;\n }\n\n /**\n * Serialize a CommandFinished instance to plain data for @workflow/serde.\n *\n * @param instance - The CommandFinished instance to serialize\n * @returns A plain object containing the sandbox ID, command data, exit code, and output if fetched\n */\n static [WORKFLOW_SERIALIZE](\n instance: CommandFinished,\n ): SerializedCommandFinished {\n return {\n ...Command[WORKFLOW_SERIALIZE](instance),\n exitCode: instance.exitCode,\n };\n }\n\n /**\n * Deserialize plain data back into a CommandFinished instance for @workflow/serde.\n *\n * The deserialized instance will lazily create an API client using\n * OIDC or environment credentials when needed.\n *\n * @param data - The serialized command finished data\n * @returns The reconstructed CommandFinished instance\n */\n static [WORKFLOW_DESERIALIZE](\n data: SerializedCommandFinished,\n ): CommandFinished {\n return new CommandFinished({\n sessionId: data.sandboxId,\n cmd: data.cmd,\n exitCode: data.exitCode,\n output: data.output,\n });\n }\n\n /**\n * The wait method is not needed for CommandFinished instances since\n * the command has already completed and exitCode is populated.\n *\n * @deprecated This method is redundant for CommandFinished instances.\n * The exitCode is already available.\n * @returns This CommandFinished instance.\n */\n async wait(): Promise<CommandFinished> {\n return this;\n }\n}\n"],"mappings":"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"} | ||
| {"version":3,"file":"command.js","names":["serialized: SerializedCommand"],"sources":["../src/command.ts"],"sourcesContent":["import { WORKFLOW_DESERIALIZE, WORKFLOW_SERIALIZE } from \"@workflow/serde\";\nimport {\n APIClient,\n type CommandData,\n} from \"./api-client/index.js\";\nimport { getCredentials } from \"./utils/get-credentials.js\";\nimport { resolveSignal, type Signal } from \"./utils/resolveSignal.js\";\n\n/**\n * Cached output from a command execution.\n */\nexport interface CommandOutput {\n stdout: string;\n stderr: string;\n}\n\n/**\n * Serialized representation of a Command for @workflow/serde.\n */\nexport interface SerializedCommand {\n sandboxId: string;\n cmd: CommandData;\n /** Cached output, included if output was fetched before serialization */\n output?: CommandOutput;\n}\n\n/**\n * Serialized representation of a CommandFinished for @workflow/serde.\n */\nexport interface SerializedCommandFinished extends SerializedCommand {\n exitCode: number;\n durationMs?: number;\n}\n\n/**\n * A command executed in a Sandbox.\n *\n * For detached commands, you can {@link wait} to get a {@link CommandFinished} instance\n * with the populated exit code. For non-detached commands, {@link Sandbox.runCommand}\n * automatically waits and returns a {@link CommandFinished} instance.\n *\n * You can iterate over command output with {@link logs}.\n *\n * @see {@link Sandbox.runCommand} to start a command.\n *\n * @hideconstructor\n */\nexport class Command {\n /**\n * Cached API client instance.\n * @internal\n */\n protected _client: APIClient | null = null;\n\n /**\n * Lazily resolve credentials and construct an API client.\n * @internal\n */\n protected 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 * ID of the session this command is running in.\n */\n protected sessionId: string;\n\n /**\n * Data for the command execution.\n */\n protected cmd: CommandData;\n\n public exitCode: number | null;\n\n public durationMs?: number;\n\n protected outputCache: Promise<{\n stdout: string;\n stderr: string;\n both: string;\n }> | null = null;\n\n /**\n * Synchronously accessible resolved output, populated after output is fetched.\n * Used for serialization.\n * @internal\n */\n protected _resolvedOutput: CommandOutput | null = null;\n\n /**\n * ID of the command execution.\n */\n get cmdId() {\n return this.cmd.id;\n }\n\n get cwd() {\n return this.cmd.cwd;\n }\n\n get startedAt() {\n return this.cmd.startedAt;\n }\n\n /**\n * @param params - Object containing the client, sandbox ID, and command data.\n * @param params.client - Optional API client. If not provided, will be lazily created using global credentials.\n * @param params.sessionId - The ID of the session where the command is running.\n * @param params.cmd - The command data.\n * @param params.output - Optional cached output to restore (used during deserialization).\n */\n constructor({\n client,\n sessionId,\n cmd,\n output,\n }: {\n client?: APIClient;\n sessionId: string;\n cmd: CommandData;\n output?: CommandOutput;\n }) {\n this._client = client ?? null;\n this.sessionId = sessionId;\n this.cmd = cmd;\n this.exitCode = cmd.exitCode ?? null;\n this.durationMs = cmd.durationMs;\n if (output) {\n this._resolvedOutput = output;\n // Note: `both` is reconstructed as stdout + stderr concatenation,\n // which loses the original interleaved order of the streams.\n this.outputCache = Promise.resolve({\n stdout: output.stdout,\n stderr: output.stderr,\n both: output.stdout + output.stderr,\n });\n }\n }\n\n /**\n * Serialize a Command instance to plain data for @workflow/serde.\n *\n * @param instance - The Command instance to serialize\n * @returns A plain object containing the sandbox ID, command data, and output if fetched\n */\n static [WORKFLOW_SERIALIZE](instance: Command): SerializedCommand {\n const serialized: SerializedCommand = {\n sandboxId: instance.sessionId,\n cmd: instance.cmd,\n };\n if (instance._resolvedOutput) {\n serialized.output = instance._resolvedOutput;\n }\n return serialized;\n }\n\n /**\n * Deserialize plain data back into a Command instance for @workflow/serde.\n *\n * The deserialized instance will lazily create an API client using\n * OIDC or environment credentials when needed.\n *\n * @param data - The serialized command data\n * @returns The reconstructed Command instance\n */\n static [WORKFLOW_DESERIALIZE](data: SerializedCommand): Command {\n return new Command({\n sessionId: data.sandboxId,\n cmd: data.cmd,\n output: data.output,\n });\n }\n\n /**\n * Iterate over the output of this command.\n *\n * ```\n * for await (const log of cmd.logs()) {\n * if (log.stream === \"stdout\") {\n * process.stdout.write(log.data);\n * } else {\n * process.stderr.write(log.data);\n * }\n * }\n * ```\n *\n * @param opts - Optional parameters.\n * @param opts.signal - An AbortSignal to cancel log streaming.\n * @returns An async iterable of log entries from the command output.\n *\n * @see {@link Command.stdout}, {@link Command.stderr}, and {@link Command.output}\n * to access output as a string.\n */\n logs(opts?: { signal?: AbortSignal }) {\n if (!this._client) {\n throw new Error(\n \"logs() requires an API client. Call an async method first to initialize the client.\",\n );\n }\n return this._client.getLogs({\n sessionId: this.sessionId,\n cmdId: this.cmd.id,\n signal: opts?.signal,\n });\n }\n\n /**\n * Wait for a command to exit and populate its exit code.\n *\n * This method is useful for detached commands where you need to wait\n * for completion. For non-detached commands, {@link Sandbox.runCommand}\n * automatically waits and returns a {@link CommandFinished} instance.\n *\n * ```\n * const detachedCmd = await sandbox.runCommand({ cmd: 'sleep', args: ['5'], detached: true });\n * const result = await detachedCmd.wait();\n * if (result.exitCode !== 0) {\n * console.error(\"Something went wrong...\")\n * }\n * ```\n *\n * @param params - Optional parameters.\n * @param params.signal - An AbortSignal to cancel waiting.\n * @returns A {@link CommandFinished} instance with populated exit code.\n */\n async wait(params?: { signal?: AbortSignal }) {\n \"use step\";\n const client = await this.ensureClient();\n params?.signal?.throwIfAborted();\n\n const command = await client.getCommand({\n sessionId: this.sessionId,\n cmdId: this.cmd.id,\n wait: true,\n signal: params?.signal,\n });\n\n return new CommandFinished({\n client,\n sessionId: this.sessionId,\n cmd: command.json.command,\n exitCode: command.json.command.exitCode,\n durationMs: command.json.command.durationMs,\n });\n }\n\n /**\n * Get cached output, fetching logs only once and reusing for concurrent calls.\n * This prevents race conditions when stdout() and stderr() are called in parallel.\n */\n protected async getCachedOutput(opts?: { signal?: AbortSignal }): Promise<{\n stdout: string;\n stderr: string;\n both: string;\n }> {\n if (!this.outputCache) {\n this.outputCache = (async () => {\n try {\n opts?.signal?.throwIfAborted();\n // Ensure the API client is initialized before calling logs(),\n // since logs() is synchronous and requires _client to be set.\n await this.ensureClient();\n let stdout = \"\";\n let stderr = \"\";\n let both = \"\";\n for await (const log of this.logs({ signal: opts?.signal })) {\n both += log.data;\n if (log.stream === \"stdout\") {\n stdout += log.data;\n } else {\n stderr += log.data;\n }\n }\n // Store resolved output for serialization\n this._resolvedOutput = { stdout, stderr };\n return { stdout, stderr, both };\n } catch (err) {\n // Clear the promise so future calls can retry\n this.outputCache = null;\n throw err;\n }\n })();\n }\n\n return this.outputCache;\n }\n\n /**\n * Get the output of `stdout`, `stderr`, or both as a string.\n *\n * NOTE: This may throw string conversion errors if the command does\n * not output valid Unicode.\n *\n * @param stream - The output stream to read: \"stdout\", \"stderr\", or \"both\".\n * @param opts - Optional parameters.\n * @param opts.signal - An AbortSignal to cancel output streaming.\n * @returns The output of the specified stream(s) as a string.\n */\n async output(\n stream: \"stdout\" | \"stderr\" | \"both\" = \"both\",\n opts?: { signal?: AbortSignal },\n ) {\n \"use step\";\n const cached = await this.getCachedOutput(opts);\n return cached[stream];\n }\n\n /**\n * Get the output of `stdout` as a string.\n *\n * NOTE: This may throw string conversion errors if the command does\n * not output valid Unicode.\n *\n * @param opts - Optional parameters.\n * @param opts.signal - An AbortSignal to cancel output streaming.\n * @returns The standard output of the command.\n */\n async stdout(opts?: { signal?: AbortSignal }) {\n \"use step\";\n return this.output(\"stdout\", opts);\n }\n\n /**\n * Get the output of `stderr` as a string.\n *\n * NOTE: This may throw string conversion errors if the command does\n * not output valid Unicode.\n *\n * @param opts - Optional parameters.\n * @param opts.signal - An AbortSignal to cancel output streaming.\n * @returns The standard error output of the command.\n */\n async stderr(opts?: { signal?: AbortSignal }) {\n \"use step\";\n return this.output(\"stderr\", opts);\n }\n\n /**\n * Kill a running command in a sandbox.\n *\n * @param signal - The signal to send the running process. Defaults to SIGTERM.\n * @param opts - Optional parameters.\n * @param opts.abortSignal - An AbortSignal to cancel the kill operation.\n * @returns Promise<void>.\n */\n async kill(signal?: Signal, opts?: { abortSignal?: AbortSignal }) {\n \"use step\";\n const client = await this.ensureClient();\n await client.killCommand({\n sessionId: this.sessionId,\n commandId: this.cmd.id,\n signal: resolveSignal(signal ?? \"SIGTERM\"),\n abortSignal: opts?.abortSignal,\n });\n }\n}\n\n/**\n * A command that has finished executing.\n *\n * The exit code is immediately available and populated upon creation.\n * Unlike {@link Command}, you don't need to call wait() - the command\n * has already completed execution.\n *\n * @hideconstructor\n */\nexport class CommandFinished extends Command {\n /**\n * The exit code of the command. This is always populated for\n * CommandFinished instances.\n */\n public exitCode: number;\n\n /**\n * The duration of the command execution in milliseconds.\n */\n public durationMs?: number;\n\n /**\n * @param params - Object containing client, sandbox ID, command data, and exit code.\n * @param params.client - Optional API client. If not provided, will be lazily created using global credentials.\n * @param params.sessionId - The ID of the session where the command ran.\n * @param params.cmd - The command data.\n * @param params.exitCode - The exit code of the completed command.\n * @param params.durationMs - Optional duration of the command execution in milliseconds.\n * @param params.output - Optional cached output to restore (used during deserialization).\n */\n constructor(params: {\n client?: APIClient;\n sessionId: string;\n cmd: CommandData;\n exitCode: number;\n durationMs?: number;\n output?: CommandOutput;\n }) {\n super({ ...params });\n this.exitCode = params.exitCode;\n this.durationMs = params.durationMs ?? params.cmd.durationMs;\n }\n\n /**\n * Serialize a CommandFinished instance to plain data for @workflow/serde.\n *\n * @param instance - The CommandFinished instance to serialize\n * @returns A plain object containing the sandbox ID, command data, exit code, and output if fetched\n */\n static [WORKFLOW_SERIALIZE](\n instance: CommandFinished,\n ): SerializedCommandFinished {\n return {\n ...Command[WORKFLOW_SERIALIZE](instance),\n exitCode: instance.exitCode,\n durationMs: instance.durationMs,\n };\n }\n\n /**\n * Deserialize plain data back into a CommandFinished instance for @workflow/serde.\n *\n * The deserialized instance will lazily create an API client using\n * OIDC or environment credentials when needed.\n *\n * @param data - The serialized command finished data\n * @returns The reconstructed CommandFinished instance\n */\n static [WORKFLOW_DESERIALIZE](\n data: SerializedCommandFinished,\n ): CommandFinished {\n return new CommandFinished({\n sessionId: data.sandboxId,\n cmd: data.cmd,\n exitCode: data.exitCode,\n durationMs: data.durationMs,\n output: data.output,\n });\n }\n\n /**\n * The wait method is not needed for CommandFinished instances since\n * the command has already completed and exitCode is populated.\n *\n * @deprecated This method is redundant for CommandFinished instances.\n * The exitCode is already available.\n * @returns This CommandFinished instance.\n */\n async wait(): Promise<CommandFinished> {\n return this;\n }\n}\n"],"mappings":"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"} |
@@ -409,3 +409,3 @@ import { Paginator } from "./utils/paginator.cjs"; | ||
| currentSessionId: string; | ||
| status: "failed" | "aborted" | "pending" | "running" | "stopping" | "stopped" | "snapshotting"; | ||
| status: "pending" | "running" | "stopping" | "stopped" | "failed" | "aborted" | "snapshotting"; | ||
| region?: string | undefined; | ||
@@ -950,3 +950,3 @@ vcpus?: number | undefined; | ||
| timeout: number; | ||
| status: "failed" | "aborted" | "pending" | "running" | "stopping" | "stopped" | "snapshotting"; | ||
| status: "pending" | "running" | "stopping" | "stopped" | "failed" | "aborted" | "snapshotting"; | ||
| requestedAt: number; | ||
@@ -1077,3 +1077,3 @@ createdAt: number; | ||
| region: string; | ||
| status: "created" | "deleted" | "failed"; | ||
| status: "failed" | "created" | "deleted"; | ||
| sizeBytes: number; | ||
@@ -1080,0 +1080,0 @@ createdAt: number; |
@@ -410,3 +410,3 @@ import { Paginator } from "./utils/paginator.js"; | ||
| currentSessionId: string; | ||
| status: "failed" | "aborted" | "pending" | "running" | "stopping" | "stopped" | "snapshotting"; | ||
| status: "pending" | "running" | "stopping" | "stopped" | "failed" | "aborted" | "snapshotting"; | ||
| region?: string | undefined; | ||
@@ -951,3 +951,3 @@ vcpus?: number | undefined; | ||
| timeout: number; | ||
| status: "failed" | "aborted" | "pending" | "running" | "stopping" | "stopped" | "snapshotting"; | ||
| status: "pending" | "running" | "stopping" | "stopped" | "failed" | "aborted" | "snapshotting"; | ||
| requestedAt: number; | ||
@@ -1078,3 +1078,3 @@ createdAt: number; | ||
| region: string; | ||
| status: "created" | "deleted" | "failed"; | ||
| status: "failed" | "created" | "deleted"; | ||
| sizeBytes: number; | ||
@@ -1081,0 +1081,0 @@ createdAt: number; |
+1
-0
@@ -272,2 +272,3 @@ const require_rolldown_runtime = require('./_virtual/rolldown_runtime.cjs'); | ||
| exitCode: finished.exitCode ?? 0, | ||
| durationMs: finished.durationMs, | ||
| output: { | ||
@@ -274,0 +275,0 @@ stdout, |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"session.cjs","names":["getCredentials","APIClient","WORKFLOW_SERIALIZE","WORKFLOW_DESERIALIZE","toSandboxSnapshot","Command","params: RunCommandParams","CommandFinished","path","consumeReadable","Snapshot"],"sources":["../src/session.ts"],"sourcesContent":["import { WORKFLOW_DESERIALIZE, WORKFLOW_SERIALIZE } from \"@workflow/serde\";\nimport { type SessionMetaData, type SandboxRouteData, type SandboxMetaData, type SnapshotMetadata, APIClient } from \"./api-client/index.js\";\nimport type { Writable } from \"stream\";\nimport { pipeline } from \"stream/promises\";\nimport { createWriteStream } from \"fs\";\nimport { mkdir } from \"fs/promises\";\nimport { dirname, resolve } from \"path\";\nimport { Command, CommandFinished } from \"./command.js\";\nimport { Snapshot } from \"./snapshot.js\";\nimport { consumeReadable } from \"./utils/consume-readable.js\";\nimport type {\n NetworkPolicy,\n NetworkPolicyRule,\n NetworkTransformer,\n} from \"./network-policy.js\";\nimport { toSandboxSnapshot, type SandboxSnapshot } from \"./utils/sandbox-snapshot.js\";\nimport { getCredentials } from \"./utils/get-credentials.js\";\n\nexport type { NetworkPolicy, NetworkPolicyRule, NetworkTransformer };\n\n/**\n * Serialized representation of a Session for @workflow/serde.\n */\nexport interface SerializedSession {\n session: SandboxSnapshot;\n routes: SandboxRouteData[];\n}\n\n/** @inline */\nexport interface RunCommandParams {\n /**\n * The command to execute\n */\n cmd: string;\n /**\n * Arguments to pass to the command\n */\n args?: string[];\n /**\n * Working directory to execute the command in\n */\n cwd?: string;\n /**\n * Environment variables to set for this command\n */\n env?: Record<string, string>;\n /**\n * If true, execute this command with root privileges. Defaults to false.\n */\n sudo?: boolean;\n /**\n * If true, the command will return without waiting for `exitCode`\n */\n detached?: boolean;\n /**\n * A `Writable` stream where `stdout` from the command will be piped\n */\n stdout?: Writable;\n /**\n * A `Writable` stream where `stderr` from the command will be piped\n */\n stderr?: Writable;\n /**\n * An AbortSignal to cancel the command execution\n */\n signal?: AbortSignal;\n /**\n * Maximum time in milliseconds the command may run before it is killed with\n * SIGKILL. The timeout is enforced by the sandbox at exec time, so it applies\n * whether or not the command is awaited (including `detached: true`).\n */\n timeoutMs?: number;\n}\n\n/**\n * A Session represents a running VM instance within a {@link Sandbox}.\n *\n * Obtain a session via {@link Sandbox.currentSession}.\n */\nexport class Session {\n private _client: APIClient | null = null;\n\n /**\n * Lazily resolve credentials and construct an API client.\n * This is used in step contexts where the Sandbox was deserialized\n * without a client (e.g. when crossing workflow/step boundaries).\n * Uses getCredentials() which resolves from OIDC or env vars.\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 * Routes from ports to subdomains.\n * @hidden\n */\n public readonly routes: SandboxRouteData[];\n\n /**\n * Internal metadata about the current session.\n */\n private session: SandboxSnapshot;\n\n private get client(): APIClient {\n if (!this._client) throw new Error(\"API client not initialized\");\n return this._client;\n }\n\n /** @internal */\n get _sessionSnapshot(): SandboxSnapshot {\n return this.session;\n }\n\n /**\n * Unique ID of this session.\n */\n public get sessionId(): string {\n return this.session.id;\n }\n\n public get interactivePort(): number | undefined {\n return this.session.interactivePort ?? undefined;\n }\n\n /**\n * The status of this session.\n */\n public get status(): SessionMetaData[\"status\"] {\n return this.session.status;\n }\n\n /**\n * The creation date of this session.\n */\n public get createdAt(): Date {\n return new Date(this.session.createdAt);\n }\n\n /**\n * The timeout of this session in milliseconds.\n */\n public get timeout(): number {\n return this.session.timeout;\n }\n\n /**\n * The network policy of this session.\n */\n public get networkPolicy(): NetworkPolicy | undefined {\n return this.session.networkPolicy;\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.session.sourceSnapshotId;\n }\n\n /**\n * Memory allocated to this session in MB.\n */\n public get memory(): number {\n return this.session.memory;\n }\n\n /**\n * Number of vCPUs allocated to this session.\n */\n public get vcpus(): number {\n return this.session.vcpus;\n }\n\n /**\n * The region where this session is hosted.\n */\n public get region(): string {\n return this.session.region;\n }\n\n /**\n * Runtime identifier (e.g. \"node24\", \"python3.13\").\n */\n public get runtime(): string {\n return this.session.runtime;\n }\n\n /**\n * The working directory of this session.\n */\n public get cwd(): string {\n return this.session.cwd;\n }\n\n /**\n * When this session was requested.\n */\n public get requestedAt(): Date {\n return new Date(this.session.requestedAt);\n }\n\n /**\n * When this session started running.\n */\n public get startedAt(): Date | undefined {\n return this.session.startedAt != null\n ? new Date(this.session.startedAt)\n : undefined;\n }\n\n /**\n * When this session was requested to stop.\n */\n public get requestedStopAt(): Date | undefined {\n return this.session.requestedStopAt != null\n ? new Date(this.session.requestedStopAt)\n : undefined;\n }\n\n /**\n * When this session was stopped.\n */\n public get stoppedAt(): Date | undefined {\n return this.session.stoppedAt != null\n ? new Date(this.session.stoppedAt)\n : undefined;\n }\n\n /**\n * When this session was aborted.\n */\n public get abortedAt(): Date | undefined {\n return this.session.abortedAt != null\n ? new Date(this.session.abortedAt)\n : undefined;\n }\n\n /**\n * The wall-clock duration of this session in milliseconds.\n */\n public get duration(): number | undefined {\n return this.session.duration;\n }\n\n /**\n * When a snapshot was requested for this session.\n */\n public get snapshottedAt(): Date | undefined {\n return this.session.snapshottedAt != null\n ? new Date(this.session.snapshottedAt)\n : undefined;\n }\n\n /**\n * When this session was last updated.\n */\n public get updatedAt(): Date {\n return new Date(this.session.updatedAt);\n }\n\n /**\n * The amount of active CPU used by the session. Only reported once the VM is\n * stopped.\n */\n public get activeCpuUsageMs(): number | undefined {\n return this.session.activeCpuDurationMs;\n }\n\n /**\n * The amount of network data used by the session. Only reported once the VM\n * is stopped.\n */\n public get networkTransfer():\n | { ingress: number; egress: number }\n | undefined {\n return this.session.networkTransfer;\n }\n\n /**\n * Serialize a Session instance to plain data for @workflow/serde.\n *\n * Although Sandbox handles top-level serialization, Session needs these\n * methods so the Workflow SWC compiler can resolve the class by name.\n * The `new Session(...)` self-reference in WORKFLOW_DESERIALIZE forces\n * rolldown to preserve the class name in the compiled output.\n */\n static [WORKFLOW_SERIALIZE](instance: Session): SerializedSession {\n return {\n session: instance.session,\n routes: instance.routes,\n };\n }\n\n static [WORKFLOW_DESERIALIZE](data: SerializedSession): Session {\n return new Session({ routes: data.routes, snapshot: data.session });\n }\n\n constructor(params: {\n client: APIClient;\n routes: SandboxRouteData[];\n session: SessionMetaData;\n } | {\n /** @internal – used during deserialization with an already-converted snapshot */\n routes: SandboxRouteData[];\n snapshot: SandboxSnapshot;\n }) {\n this.routes = params.routes;\n if (\"snapshot\" in params) {\n this.session = params.snapshot;\n } else {\n this._client = params.client;\n this.session = toSandboxSnapshot(params.session);\n }\n }\n\n /** @internal */\n updateRoutes(routes: SandboxRouteData[]): void {\n (this as { routes: SandboxRouteData[] }).routes = routes;\n }\n\n /**\n * Get a previously run command by its ID.\n *\n * @param cmdId - ID of the command to retrieve\n * @param opts - Optional parameters.\n * @param opts.signal - An AbortSignal to cancel the operation.\n * @returns A {@link Command} instance representing the command\n */\n async getCommand(\n cmdId: string,\n opts?: { signal?: AbortSignal },\n ): Promise<Command> {\n \"use step\";\n const client = await this.ensureClient();\n const command = await client.getCommand({\n sessionId: this.session.id,\n cmdId,\n signal: opts?.signal,\n });\n\n return new Command({\n client,\n sessionId: this.session.id,\n cmd: command.json.command,\n });\n }\n\n /**\n * Start executing a command in this session.\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 * @param opts.timeoutMs - Maximum time in milliseconds to wait for the\n * command to complete. On expiry the process is killed with SIGKILL.\n * @returns A {@link CommandFinished} result once execution is done.\n */\n async runCommand(\n command: string,\n args?: string[],\n opts?: { signal?: AbortSignal; timeoutMs?: number },\n ): Promise<CommandFinished>;\n\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 session.\n *\n * @param params - The command parameters.\n * @returns A {@link CommandFinished} result once execution is done.\n */\n async runCommand(params: RunCommandParams): Promise<CommandFinished>;\n\n async runCommand(\n commandOrParams: string | RunCommandParams,\n args?: string[],\n opts?: { signal?: AbortSignal; timeoutMs?: number },\n ): Promise<Command | CommandFinished> {\n \"use step\";\n const client = await this.ensureClient();\n const params: RunCommandParams =\n typeof commandOrParams === \"string\"\n ? {\n cmd: commandOrParams,\n args,\n signal: opts?.signal,\n timeoutMs: opts?.timeoutMs,\n }\n : commandOrParams;\n const wait = params.detached ? false : true;\n const shouldPipeLogs = Boolean(params.stdout || params.stderr);\n\n if (wait) {\n let stdout = \"\", stderr = \"\";\n const commandStream = await client.runCommand({\n sessionId: this.session.id,\n command: params.cmd,\n args: params.args ?? [],\n cwd: params.cwd,\n env: params.env ?? {},\n sudo: params.sudo ?? false,\n wait: true,\n logs: true,\n onLog: (log) => {\n if (log.stream === \"stdout\") {\n stdout += log.data;\n params.stdout?.write(log.data);\n } else {\n stderr += log.data;\n params.stderr?.write(log.data);\n }\n },\n timeout: params.timeoutMs,\n signal: params.signal,\n });\n\n const finished = await commandStream.finished;\n\n return new CommandFinished({\n client,\n sessionId: this.session.id,\n cmd: finished,\n exitCode: finished.exitCode ?? 0,\n output: { stdout, stderr },\n });\n }\n\n const commandResponse = await client.runCommand({\n sessionId: this.session.id,\n command: params.cmd,\n args: params.args ?? [],\n cwd: params.cwd,\n env: params.env ?? {},\n sudo: params.sudo ?? false,\n timeout: params.timeoutMs,\n signal: params.signal,\n });\n\n const command = new Command({\n client,\n sessionId: this.session.id,\n cmd: commandResponse.json.command,\n });\n\n if (shouldPipeLogs) {\n (async () => {\n try {\n for await (const log of command.logs({ signal: params.signal })) {\n if (log.stream === \"stdout\") {\n params.stdout?.write(log.data);\n } else if (log.stream === \"stderr\") {\n params.stderr?.write(log.data);\n }\n }\n } catch (err) {\n if (params.signal?.aborted) {\n return;\n }\n (params.stderr ?? params.stdout)?.emit(\"error\", err);\n }\n })();\n }\n\n return command;\n }\n\n /**\n * Create a directory in the filesystem of this session.\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 const client = await this.ensureClient();\n await client.mkDir({\n sessionId: this.session.id,\n path: path,\n signal: opts?.signal,\n });\n }\n\n /**\n * Open an interactive shell session. Returns the WebSocket URL and token the\n * client uses to connect to the controller-hosted PTY.\n *\n * @param opts - Optional parameters.\n * @param opts.signal - An AbortSignal to cancel the operation.\n */\n async openInteractive(opts?: {\n signal?: AbortSignal;\n }): Promise<{ url: string; token: string }> {\n \"use step\";\n const client = await this.ensureClient();\n const { json } = await client.openInteractive({\n sessionId: this.session.id,\n signal: opts?.signal,\n });\n return { url: json.url, token: json.token };\n }\n\n /**\n * Read a file from the filesystem of this session 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 const client = await this.ensureClient();\n return client.readFile({\n sessionId: this.session.id,\n path: file.path,\n cwd: file.cwd,\n signal: opts?.signal,\n });\n }\n\n /**\n * Read a file from the filesystem of this session 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 const client = await this.ensureClient();\n const stream = await client.readFile({\n sessionId: this.session.id,\n path: file.path,\n cwd: file.cwd,\n signal: opts?.signal,\n });\n\n if (stream === null) {\n return null;\n }\n\n return consumeReadable(stream);\n }\n\n /**\n * Download a file from the session to the local filesystem.\n *\n * @param src - Source file on the session, 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 const client = await this.ensureClient();\n if (!src?.path) {\n throw new Error(\"downloadFile: source path is required\");\n }\n\n if (!dst?.path) {\n throw new Error(\"downloadFile: destination path is required\");\n }\n\n const stream = await client.readFile({\n sessionId: this.session.id,\n path: src.path,\n cwd: src.cwd,\n signal: opts?.signal,\n });\n\n if (stream === null) {\n return null;\n }\n\n try {\n const dstPath = resolve(dst.cwd ?? \"\", dst.path);\n if (opts?.mkdirRecursive) {\n await mkdir(dirname(dstPath), { recursive: true });\n }\n await pipeline(stream, createWriteStream(dstPath), {\n signal: opts?.signal,\n });\n return dstPath;\n } finally {\n stream.destroy();\n }\n }\n\n /**\n * Write files to the filesystem of this session.\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 and stream/buffer contents\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 async writeFiles(\n files: { path: string; content: string | Uint8Array; mode?: number }[],\n opts?: { signal?: AbortSignal },\n ) {\n \"use step\";\n const client = await this.ensureClient();\n return client.writeFiles({\n sessionId: this.session.id,\n cwd: this.session.cwd,\n extractDir: \"/\",\n files: files,\n signal: opts?.signal,\n });\n }\n\n /**\n * Get the public domain of a port of this session.\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 const route = this.routes.find(({ port }) => port == p);\n if (route) {\n return `https://${route.subdomain}.vercel.run`;\n } else {\n throw new Error(`No route for port ${p}`);\n }\n }\n\n /**\n * Stop this session.\n *\n * @param opts - Optional parameters.\n * @param opts.signal - An AbortSignal to cancel the operation.\n * @returns The final session state and optional sandbox metadata.\n */\n async stop(opts?: {\n signal?: AbortSignal;\n }): Promise<{ session: SandboxSnapshot; sandbox?: SandboxMetaData; snapshot?: SnapshotMetadata }> {\n \"use step\";\n const client = await this.ensureClient();\n const response = await client.stopSession({\n sessionId: this.session.id,\n signal: opts?.signal,\n });\n this.session = toSandboxSnapshot(response.json.session);\n return { session: this.session, sandbox: response.json.sandbox, snapshot: response.json.snapshot };\n }\n\n /**\n * Update the current session's settings.\n *\n * @param params - Fields to update.\n * @param params.networkPolicy - The new network policy to apply.\n * @param opts - Optional parameters.\n * @param opts.signal - An AbortSignal to cancel the operation.\n *\n * @example\n * // Restrict to specific domains\n * await session.update({\n * networkPolicy: {\n * allow: [\"*.npmjs.org\", \"github.com\"],\n * }\n * });\n *\n * @example\n * // Inject credentials with per-domain transformers\n * await session.update({\n * networkPolicy: {\n * allow: {\n * \"ai-gateway.vercel.sh\": [{\n * transform: [{\n * headers: { authorization: \"Bearer ...\" }\n * }]\n * }],\n * \"*\": []\n * }\n * }\n * });\n *\n * @example\n * // Deny all network access\n * await session.update({ networkPolicy: \"deny-all\" });\n */\n async update(\n params: {\n networkPolicy?: NetworkPolicy;\n },\n opts?: { signal?: AbortSignal },\n ): Promise<void> {\n \"use step\";\n if (params.networkPolicy !== undefined) {\n const client = await this.ensureClient();\n const response = await client.updateNetworkPolicy({\n sessionId: this.session.id,\n networkPolicy: params.networkPolicy,\n signal: opts?.signal,\n });\n\n // Update the internal session with the new network policy\n this.session = toSandboxSnapshot(response.json.session);\n }\n }\n\n /**\n * Extend the timeout of the session by the specified duration.\n *\n * This allows you to extend the lifetime of a session 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 * const session = sandbox.currentSession();\n * // Extends timeout by 5 minutes, to a total of 15 minutes.\n * await session.extendTimeout(ms('5m'));\n */\n async extendTimeout(\n duration: number,\n opts?: { signal?: AbortSignal },\n ): Promise<void> {\n \"use step\";\n const client = await this.ensureClient();\n const response = await client.extendTimeout({\n sessionId: this.session.id,\n duration,\n signal: opts?.signal,\n });\n\n // Update the internal sandbox metadata with the new timeout value\n this.session = toSandboxSnapshot(response.json.session);\n }\n\n /**\n * Create a snapshot from this currently running session. New sandboxes can\n * then be created from this snapshot using {@link Sandbox.create}.\n *\n * Note: this session 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 const client = await this.ensureClient();\n const response = await client.createSnapshot({\n sessionId: this.session.id,\n expiration: opts?.expiration,\n signal: opts?.signal,\n });\n\n this.session = toSandboxSnapshot(response.json.session);\n\n return new Snapshot({\n client,\n snapshot: response.json.snapshot,\n });\n }\n}\n"],"mappings":"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"} | ||
| {"version":3,"file":"session.cjs","names":["getCredentials","APIClient","WORKFLOW_SERIALIZE","WORKFLOW_DESERIALIZE","toSandboxSnapshot","Command","params: RunCommandParams","CommandFinished","path","consumeReadable","Snapshot"],"sources":["../src/session.ts"],"sourcesContent":["import { WORKFLOW_DESERIALIZE, WORKFLOW_SERIALIZE } from \"@workflow/serde\";\nimport { type SessionMetaData, type SandboxRouteData, type SandboxMetaData, type SnapshotMetadata, APIClient } from \"./api-client/index.js\";\nimport type { Writable } from \"stream\";\nimport { pipeline } from \"stream/promises\";\nimport { createWriteStream } from \"fs\";\nimport { mkdir } from \"fs/promises\";\nimport { dirname, resolve } from \"path\";\nimport { Command, CommandFinished } from \"./command.js\";\nimport { Snapshot } from \"./snapshot.js\";\nimport { consumeReadable } from \"./utils/consume-readable.js\";\nimport type {\n NetworkPolicy,\n NetworkPolicyRule,\n NetworkTransformer,\n} from \"./network-policy.js\";\nimport { toSandboxSnapshot, type SandboxSnapshot } from \"./utils/sandbox-snapshot.js\";\nimport { getCredentials } from \"./utils/get-credentials.js\";\n\nexport type { NetworkPolicy, NetworkPolicyRule, NetworkTransformer };\n\n/**\n * Serialized representation of a Session for @workflow/serde.\n */\nexport interface SerializedSession {\n session: SandboxSnapshot;\n routes: SandboxRouteData[];\n}\n\n/** @inline */\nexport interface RunCommandParams {\n /**\n * The command to execute\n */\n cmd: string;\n /**\n * Arguments to pass to the command\n */\n args?: string[];\n /**\n * Working directory to execute the command in\n */\n cwd?: string;\n /**\n * Environment variables to set for this command\n */\n env?: Record<string, string>;\n /**\n * If true, execute this command with root privileges. Defaults to false.\n */\n sudo?: boolean;\n /**\n * If true, the command will return without waiting for `exitCode`\n */\n detached?: boolean;\n /**\n * A `Writable` stream where `stdout` from the command will be piped\n */\n stdout?: Writable;\n /**\n * A `Writable` stream where `stderr` from the command will be piped\n */\n stderr?: Writable;\n /**\n * An AbortSignal to cancel the command execution\n */\n signal?: AbortSignal;\n /**\n * Maximum time in milliseconds the command may run before it is killed with\n * SIGKILL. The timeout is enforced by the sandbox at exec time, so it applies\n * whether or not the command is awaited (including `detached: true`).\n */\n timeoutMs?: number;\n}\n\n/**\n * A Session represents a running VM instance within a {@link Sandbox}.\n *\n * Obtain a session via {@link Sandbox.currentSession}.\n */\nexport class Session {\n private _client: APIClient | null = null;\n\n /**\n * Lazily resolve credentials and construct an API client.\n * This is used in step contexts where the Sandbox was deserialized\n * without a client (e.g. when crossing workflow/step boundaries).\n * Uses getCredentials() which resolves from OIDC or env vars.\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 * Routes from ports to subdomains.\n * @hidden\n */\n public readonly routes: SandboxRouteData[];\n\n /**\n * Internal metadata about the current session.\n */\n private session: SandboxSnapshot;\n\n private get client(): APIClient {\n if (!this._client) throw new Error(\"API client not initialized\");\n return this._client;\n }\n\n /** @internal */\n get _sessionSnapshot(): SandboxSnapshot {\n return this.session;\n }\n\n /**\n * Unique ID of this session.\n */\n public get sessionId(): string {\n return this.session.id;\n }\n\n public get interactivePort(): number | undefined {\n return this.session.interactivePort ?? undefined;\n }\n\n /**\n * The status of this session.\n */\n public get status(): SessionMetaData[\"status\"] {\n return this.session.status;\n }\n\n /**\n * The creation date of this session.\n */\n public get createdAt(): Date {\n return new Date(this.session.createdAt);\n }\n\n /**\n * The timeout of this session in milliseconds.\n */\n public get timeout(): number {\n return this.session.timeout;\n }\n\n /**\n * The network policy of this session.\n */\n public get networkPolicy(): NetworkPolicy | undefined {\n return this.session.networkPolicy;\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.session.sourceSnapshotId;\n }\n\n /**\n * Memory allocated to this session in MB.\n */\n public get memory(): number {\n return this.session.memory;\n }\n\n /**\n * Number of vCPUs allocated to this session.\n */\n public get vcpus(): number {\n return this.session.vcpus;\n }\n\n /**\n * The region where this session is hosted.\n */\n public get region(): string {\n return this.session.region;\n }\n\n /**\n * Runtime identifier (e.g. \"node24\", \"python3.13\").\n */\n public get runtime(): string {\n return this.session.runtime;\n }\n\n /**\n * The working directory of this session.\n */\n public get cwd(): string {\n return this.session.cwd;\n }\n\n /**\n * When this session was requested.\n */\n public get requestedAt(): Date {\n return new Date(this.session.requestedAt);\n }\n\n /**\n * When this session started running.\n */\n public get startedAt(): Date | undefined {\n return this.session.startedAt != null\n ? new Date(this.session.startedAt)\n : undefined;\n }\n\n /**\n * When this session was requested to stop.\n */\n public get requestedStopAt(): Date | undefined {\n return this.session.requestedStopAt != null\n ? new Date(this.session.requestedStopAt)\n : undefined;\n }\n\n /**\n * When this session was stopped.\n */\n public get stoppedAt(): Date | undefined {\n return this.session.stoppedAt != null\n ? new Date(this.session.stoppedAt)\n : undefined;\n }\n\n /**\n * When this session was aborted.\n */\n public get abortedAt(): Date | undefined {\n return this.session.abortedAt != null\n ? new Date(this.session.abortedAt)\n : undefined;\n }\n\n /**\n * The wall-clock duration of this session in milliseconds.\n */\n public get duration(): number | undefined {\n return this.session.duration;\n }\n\n /**\n * When a snapshot was requested for this session.\n */\n public get snapshottedAt(): Date | undefined {\n return this.session.snapshottedAt != null\n ? new Date(this.session.snapshottedAt)\n : undefined;\n }\n\n /**\n * When this session was last updated.\n */\n public get updatedAt(): Date {\n return new Date(this.session.updatedAt);\n }\n\n /**\n * The amount of active CPU used by the session. Only reported once the VM is\n * stopped.\n */\n public get activeCpuUsageMs(): number | undefined {\n return this.session.activeCpuDurationMs;\n }\n\n /**\n * The amount of network data used by the session. Only reported once the VM\n * is stopped.\n */\n public get networkTransfer():\n | { ingress: number; egress: number }\n | undefined {\n return this.session.networkTransfer;\n }\n\n /**\n * Serialize a Session instance to plain data for @workflow/serde.\n *\n * Although Sandbox handles top-level serialization, Session needs these\n * methods so the Workflow SWC compiler can resolve the class by name.\n * The `new Session(...)` self-reference in WORKFLOW_DESERIALIZE forces\n * rolldown to preserve the class name in the compiled output.\n */\n static [WORKFLOW_SERIALIZE](instance: Session): SerializedSession {\n return {\n session: instance.session,\n routes: instance.routes,\n };\n }\n\n static [WORKFLOW_DESERIALIZE](data: SerializedSession): Session {\n return new Session({ routes: data.routes, snapshot: data.session });\n }\n\n constructor(params: {\n client: APIClient;\n routes: SandboxRouteData[];\n session: SessionMetaData;\n } | {\n /** @internal – used during deserialization with an already-converted snapshot */\n routes: SandboxRouteData[];\n snapshot: SandboxSnapshot;\n }) {\n this.routes = params.routes;\n if (\"snapshot\" in params) {\n this.session = params.snapshot;\n } else {\n this._client = params.client;\n this.session = toSandboxSnapshot(params.session);\n }\n }\n\n /** @internal */\n updateRoutes(routes: SandboxRouteData[]): void {\n (this as { routes: SandboxRouteData[] }).routes = routes;\n }\n\n /**\n * Get a previously run command by its ID.\n *\n * @param cmdId - ID of the command to retrieve\n * @param opts - Optional parameters.\n * @param opts.signal - An AbortSignal to cancel the operation.\n * @returns A {@link Command} instance representing the command\n */\n async getCommand(\n cmdId: string,\n opts?: { signal?: AbortSignal },\n ): Promise<Command> {\n \"use step\";\n const client = await this.ensureClient();\n const command = await client.getCommand({\n sessionId: this.session.id,\n cmdId,\n signal: opts?.signal,\n });\n\n return new Command({\n client,\n sessionId: this.session.id,\n cmd: command.json.command,\n });\n }\n\n /**\n * Start executing a command in this session.\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 * @param opts.timeoutMs - Maximum time in milliseconds to wait for the\n * command to complete. On expiry the process is killed with SIGKILL.\n * @returns A {@link CommandFinished} result once execution is done.\n */\n async runCommand(\n command: string,\n args?: string[],\n opts?: { signal?: AbortSignal; timeoutMs?: number },\n ): Promise<CommandFinished>;\n\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 session.\n *\n * @param params - The command parameters.\n * @returns A {@link CommandFinished} result once execution is done.\n */\n async runCommand(params: RunCommandParams): Promise<CommandFinished>;\n\n async runCommand(\n commandOrParams: string | RunCommandParams,\n args?: string[],\n opts?: { signal?: AbortSignal; timeoutMs?: number },\n ): Promise<Command | CommandFinished> {\n \"use step\";\n const client = await this.ensureClient();\n const params: RunCommandParams =\n typeof commandOrParams === \"string\"\n ? {\n cmd: commandOrParams,\n args,\n signal: opts?.signal,\n timeoutMs: opts?.timeoutMs,\n }\n : commandOrParams;\n const wait = params.detached ? false : true;\n const shouldPipeLogs = Boolean(params.stdout || params.stderr);\n\n if (wait) {\n let stdout = \"\", stderr = \"\";\n const commandStream = await client.runCommand({\n sessionId: this.session.id,\n command: params.cmd,\n args: params.args ?? [],\n cwd: params.cwd,\n env: params.env ?? {},\n sudo: params.sudo ?? false,\n wait: true,\n logs: true,\n onLog: (log) => {\n if (log.stream === \"stdout\") {\n stdout += log.data;\n params.stdout?.write(log.data);\n } else {\n stderr += log.data;\n params.stderr?.write(log.data);\n }\n },\n timeout: params.timeoutMs,\n signal: params.signal,\n });\n\n const finished = await commandStream.finished;\n\n return new CommandFinished({\n client,\n sessionId: this.session.id,\n cmd: finished,\n exitCode: finished.exitCode ?? 0,\n durationMs: finished.durationMs,\n output: { stdout, stderr },\n });\n }\n\n const commandResponse = await client.runCommand({\n sessionId: this.session.id,\n command: params.cmd,\n args: params.args ?? [],\n cwd: params.cwd,\n env: params.env ?? {},\n sudo: params.sudo ?? false,\n timeout: params.timeoutMs,\n signal: params.signal,\n });\n\n const command = new Command({\n client,\n sessionId: this.session.id,\n cmd: commandResponse.json.command,\n });\n\n if (shouldPipeLogs) {\n (async () => {\n try {\n for await (const log of command.logs({ signal: params.signal })) {\n if (log.stream === \"stdout\") {\n params.stdout?.write(log.data);\n } else if (log.stream === \"stderr\") {\n params.stderr?.write(log.data);\n }\n }\n } catch (err) {\n if (params.signal?.aborted) {\n return;\n }\n (params.stderr ?? params.stdout)?.emit(\"error\", err);\n }\n })();\n }\n\n return command;\n }\n\n /**\n * Create a directory in the filesystem of this session.\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 const client = await this.ensureClient();\n await client.mkDir({\n sessionId: this.session.id,\n path: path,\n signal: opts?.signal,\n });\n }\n\n /**\n * Open an interactive shell session. Returns the WebSocket URL and token the\n * client uses to connect to the controller-hosted PTY.\n *\n * @param opts - Optional parameters.\n * @param opts.signal - An AbortSignal to cancel the operation.\n */\n async openInteractive(opts?: {\n signal?: AbortSignal;\n }): Promise<{ url: string; token: string }> {\n \"use step\";\n const client = await this.ensureClient();\n const { json } = await client.openInteractive({\n sessionId: this.session.id,\n signal: opts?.signal,\n });\n return { url: json.url, token: json.token };\n }\n\n /**\n * Read a file from the filesystem of this session 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 const client = await this.ensureClient();\n return client.readFile({\n sessionId: this.session.id,\n path: file.path,\n cwd: file.cwd,\n signal: opts?.signal,\n });\n }\n\n /**\n * Read a file from the filesystem of this session 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 const client = await this.ensureClient();\n const stream = await client.readFile({\n sessionId: this.session.id,\n path: file.path,\n cwd: file.cwd,\n signal: opts?.signal,\n });\n\n if (stream === null) {\n return null;\n }\n\n return consumeReadable(stream);\n }\n\n /**\n * Download a file from the session to the local filesystem.\n *\n * @param src - Source file on the session, 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 const client = await this.ensureClient();\n if (!src?.path) {\n throw new Error(\"downloadFile: source path is required\");\n }\n\n if (!dst?.path) {\n throw new Error(\"downloadFile: destination path is required\");\n }\n\n const stream = await client.readFile({\n sessionId: this.session.id,\n path: src.path,\n cwd: src.cwd,\n signal: opts?.signal,\n });\n\n if (stream === null) {\n return null;\n }\n\n try {\n const dstPath = resolve(dst.cwd ?? \"\", dst.path);\n if (opts?.mkdirRecursive) {\n await mkdir(dirname(dstPath), { recursive: true });\n }\n await pipeline(stream, createWriteStream(dstPath), {\n signal: opts?.signal,\n });\n return dstPath;\n } finally {\n stream.destroy();\n }\n }\n\n /**\n * Write files to the filesystem of this session.\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 and stream/buffer contents\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 async writeFiles(\n files: { path: string; content: string | Uint8Array; mode?: number }[],\n opts?: { signal?: AbortSignal },\n ) {\n \"use step\";\n const client = await this.ensureClient();\n return client.writeFiles({\n sessionId: this.session.id,\n cwd: this.session.cwd,\n extractDir: \"/\",\n files: files,\n signal: opts?.signal,\n });\n }\n\n /**\n * Get the public domain of a port of this session.\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 const route = this.routes.find(({ port }) => port == p);\n if (route) {\n return `https://${route.subdomain}.vercel.run`;\n } else {\n throw new Error(`No route for port ${p}`);\n }\n }\n\n /**\n * Stop this session.\n *\n * @param opts - Optional parameters.\n * @param opts.signal - An AbortSignal to cancel the operation.\n * @returns The final session state and optional sandbox metadata.\n */\n async stop(opts?: {\n signal?: AbortSignal;\n }): Promise<{ session: SandboxSnapshot; sandbox?: SandboxMetaData; snapshot?: SnapshotMetadata }> {\n \"use step\";\n const client = await this.ensureClient();\n const response = await client.stopSession({\n sessionId: this.session.id,\n signal: opts?.signal,\n });\n this.session = toSandboxSnapshot(response.json.session);\n return { session: this.session, sandbox: response.json.sandbox, snapshot: response.json.snapshot };\n }\n\n /**\n * Update the current session's settings.\n *\n * @param params - Fields to update.\n * @param params.networkPolicy - The new network policy to apply.\n * @param opts - Optional parameters.\n * @param opts.signal - An AbortSignal to cancel the operation.\n *\n * @example\n * // Restrict to specific domains\n * await session.update({\n * networkPolicy: {\n * allow: [\"*.npmjs.org\", \"github.com\"],\n * }\n * });\n *\n * @example\n * // Inject credentials with per-domain transformers\n * await session.update({\n * networkPolicy: {\n * allow: {\n * \"ai-gateway.vercel.sh\": [{\n * transform: [{\n * headers: { authorization: \"Bearer ...\" }\n * }]\n * }],\n * \"*\": []\n * }\n * }\n * });\n *\n * @example\n * // Deny all network access\n * await session.update({ networkPolicy: \"deny-all\" });\n */\n async update(\n params: {\n networkPolicy?: NetworkPolicy;\n },\n opts?: { signal?: AbortSignal },\n ): Promise<void> {\n \"use step\";\n if (params.networkPolicy !== undefined) {\n const client = await this.ensureClient();\n const response = await client.updateNetworkPolicy({\n sessionId: this.session.id,\n networkPolicy: params.networkPolicy,\n signal: opts?.signal,\n });\n\n // Update the internal session with the new network policy\n this.session = toSandboxSnapshot(response.json.session);\n }\n }\n\n /**\n * Extend the timeout of the session by the specified duration.\n *\n * This allows you to extend the lifetime of a session 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 * const session = sandbox.currentSession();\n * // Extends timeout by 5 minutes, to a total of 15 minutes.\n * await session.extendTimeout(ms('5m'));\n */\n async extendTimeout(\n duration: number,\n opts?: { signal?: AbortSignal },\n ): Promise<void> {\n \"use step\";\n const client = await this.ensureClient();\n const response = await client.extendTimeout({\n sessionId: this.session.id,\n duration,\n signal: opts?.signal,\n });\n\n // Update the internal sandbox metadata with the new timeout value\n this.session = toSandboxSnapshot(response.json.session);\n }\n\n /**\n * Create a snapshot from this currently running session. New sandboxes can\n * then be created from this snapshot using {@link Sandbox.create}.\n *\n * Note: this session 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 const client = await this.ensureClient();\n const response = await client.createSnapshot({\n sessionId: this.session.id,\n expiration: opts?.expiration,\n signal: opts?.signal,\n });\n\n this.session = toSandboxSnapshot(response.json.session);\n\n return new Snapshot({\n client,\n snapshot: response.json.snapshot,\n });\n }\n}\n"],"mappings":"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"} |
+1
-0
@@ -271,2 +271,3 @@ import { consumeReadable } from "./utils/consume-readable.js"; | ||
| exitCode: finished.exitCode ?? 0, | ||
| durationMs: finished.durationMs, | ||
| output: { | ||
@@ -273,0 +274,0 @@ stdout, |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"session.js","names":["params: RunCommandParams","path"],"sources":["../src/session.ts"],"sourcesContent":["import { WORKFLOW_DESERIALIZE, WORKFLOW_SERIALIZE } from \"@workflow/serde\";\nimport { type SessionMetaData, type SandboxRouteData, type SandboxMetaData, type SnapshotMetadata, APIClient } from \"./api-client/index.js\";\nimport type { Writable } from \"stream\";\nimport { pipeline } from \"stream/promises\";\nimport { createWriteStream } from \"fs\";\nimport { mkdir } from \"fs/promises\";\nimport { dirname, resolve } from \"path\";\nimport { Command, CommandFinished } from \"./command.js\";\nimport { Snapshot } from \"./snapshot.js\";\nimport { consumeReadable } from \"./utils/consume-readable.js\";\nimport type {\n NetworkPolicy,\n NetworkPolicyRule,\n NetworkTransformer,\n} from \"./network-policy.js\";\nimport { toSandboxSnapshot, type SandboxSnapshot } from \"./utils/sandbox-snapshot.js\";\nimport { getCredentials } from \"./utils/get-credentials.js\";\n\nexport type { NetworkPolicy, NetworkPolicyRule, NetworkTransformer };\n\n/**\n * Serialized representation of a Session for @workflow/serde.\n */\nexport interface SerializedSession {\n session: SandboxSnapshot;\n routes: SandboxRouteData[];\n}\n\n/** @inline */\nexport interface RunCommandParams {\n /**\n * The command to execute\n */\n cmd: string;\n /**\n * Arguments to pass to the command\n */\n args?: string[];\n /**\n * Working directory to execute the command in\n */\n cwd?: string;\n /**\n * Environment variables to set for this command\n */\n env?: Record<string, string>;\n /**\n * If true, execute this command with root privileges. Defaults to false.\n */\n sudo?: boolean;\n /**\n * If true, the command will return without waiting for `exitCode`\n */\n detached?: boolean;\n /**\n * A `Writable` stream where `stdout` from the command will be piped\n */\n stdout?: Writable;\n /**\n * A `Writable` stream where `stderr` from the command will be piped\n */\n stderr?: Writable;\n /**\n * An AbortSignal to cancel the command execution\n */\n signal?: AbortSignal;\n /**\n * Maximum time in milliseconds the command may run before it is killed with\n * SIGKILL. The timeout is enforced by the sandbox at exec time, so it applies\n * whether or not the command is awaited (including `detached: true`).\n */\n timeoutMs?: number;\n}\n\n/**\n * A Session represents a running VM instance within a {@link Sandbox}.\n *\n * Obtain a session via {@link Sandbox.currentSession}.\n */\nexport class Session {\n private _client: APIClient | null = null;\n\n /**\n * Lazily resolve credentials and construct an API client.\n * This is used in step contexts where the Sandbox was deserialized\n * without a client (e.g. when crossing workflow/step boundaries).\n * Uses getCredentials() which resolves from OIDC or env vars.\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 * Routes from ports to subdomains.\n * @hidden\n */\n public readonly routes: SandboxRouteData[];\n\n /**\n * Internal metadata about the current session.\n */\n private session: SandboxSnapshot;\n\n private get client(): APIClient {\n if (!this._client) throw new Error(\"API client not initialized\");\n return this._client;\n }\n\n /** @internal */\n get _sessionSnapshot(): SandboxSnapshot {\n return this.session;\n }\n\n /**\n * Unique ID of this session.\n */\n public get sessionId(): string {\n return this.session.id;\n }\n\n public get interactivePort(): number | undefined {\n return this.session.interactivePort ?? undefined;\n }\n\n /**\n * The status of this session.\n */\n public get status(): SessionMetaData[\"status\"] {\n return this.session.status;\n }\n\n /**\n * The creation date of this session.\n */\n public get createdAt(): Date {\n return new Date(this.session.createdAt);\n }\n\n /**\n * The timeout of this session in milliseconds.\n */\n public get timeout(): number {\n return this.session.timeout;\n }\n\n /**\n * The network policy of this session.\n */\n public get networkPolicy(): NetworkPolicy | undefined {\n return this.session.networkPolicy;\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.session.sourceSnapshotId;\n }\n\n /**\n * Memory allocated to this session in MB.\n */\n public get memory(): number {\n return this.session.memory;\n }\n\n /**\n * Number of vCPUs allocated to this session.\n */\n public get vcpus(): number {\n return this.session.vcpus;\n }\n\n /**\n * The region where this session is hosted.\n */\n public get region(): string {\n return this.session.region;\n }\n\n /**\n * Runtime identifier (e.g. \"node24\", \"python3.13\").\n */\n public get runtime(): string {\n return this.session.runtime;\n }\n\n /**\n * The working directory of this session.\n */\n public get cwd(): string {\n return this.session.cwd;\n }\n\n /**\n * When this session was requested.\n */\n public get requestedAt(): Date {\n return new Date(this.session.requestedAt);\n }\n\n /**\n * When this session started running.\n */\n public get startedAt(): Date | undefined {\n return this.session.startedAt != null\n ? new Date(this.session.startedAt)\n : undefined;\n }\n\n /**\n * When this session was requested to stop.\n */\n public get requestedStopAt(): Date | undefined {\n return this.session.requestedStopAt != null\n ? new Date(this.session.requestedStopAt)\n : undefined;\n }\n\n /**\n * When this session was stopped.\n */\n public get stoppedAt(): Date | undefined {\n return this.session.stoppedAt != null\n ? new Date(this.session.stoppedAt)\n : undefined;\n }\n\n /**\n * When this session was aborted.\n */\n public get abortedAt(): Date | undefined {\n return this.session.abortedAt != null\n ? new Date(this.session.abortedAt)\n : undefined;\n }\n\n /**\n * The wall-clock duration of this session in milliseconds.\n */\n public get duration(): number | undefined {\n return this.session.duration;\n }\n\n /**\n * When a snapshot was requested for this session.\n */\n public get snapshottedAt(): Date | undefined {\n return this.session.snapshottedAt != null\n ? new Date(this.session.snapshottedAt)\n : undefined;\n }\n\n /**\n * When this session was last updated.\n */\n public get updatedAt(): Date {\n return new Date(this.session.updatedAt);\n }\n\n /**\n * The amount of active CPU used by the session. Only reported once the VM is\n * stopped.\n */\n public get activeCpuUsageMs(): number | undefined {\n return this.session.activeCpuDurationMs;\n }\n\n /**\n * The amount of network data used by the session. Only reported once the VM\n * is stopped.\n */\n public get networkTransfer():\n | { ingress: number; egress: number }\n | undefined {\n return this.session.networkTransfer;\n }\n\n /**\n * Serialize a Session instance to plain data for @workflow/serde.\n *\n * Although Sandbox handles top-level serialization, Session needs these\n * methods so the Workflow SWC compiler can resolve the class by name.\n * The `new Session(...)` self-reference in WORKFLOW_DESERIALIZE forces\n * rolldown to preserve the class name in the compiled output.\n */\n static [WORKFLOW_SERIALIZE](instance: Session): SerializedSession {\n return {\n session: instance.session,\n routes: instance.routes,\n };\n }\n\n static [WORKFLOW_DESERIALIZE](data: SerializedSession): Session {\n return new Session({ routes: data.routes, snapshot: data.session });\n }\n\n constructor(params: {\n client: APIClient;\n routes: SandboxRouteData[];\n session: SessionMetaData;\n } | {\n /** @internal – used during deserialization with an already-converted snapshot */\n routes: SandboxRouteData[];\n snapshot: SandboxSnapshot;\n }) {\n this.routes = params.routes;\n if (\"snapshot\" in params) {\n this.session = params.snapshot;\n } else {\n this._client = params.client;\n this.session = toSandboxSnapshot(params.session);\n }\n }\n\n /** @internal */\n updateRoutes(routes: SandboxRouteData[]): void {\n (this as { routes: SandboxRouteData[] }).routes = routes;\n }\n\n /**\n * Get a previously run command by its ID.\n *\n * @param cmdId - ID of the command to retrieve\n * @param opts - Optional parameters.\n * @param opts.signal - An AbortSignal to cancel the operation.\n * @returns A {@link Command} instance representing the command\n */\n async getCommand(\n cmdId: string,\n opts?: { signal?: AbortSignal },\n ): Promise<Command> {\n \"use step\";\n const client = await this.ensureClient();\n const command = await client.getCommand({\n sessionId: this.session.id,\n cmdId,\n signal: opts?.signal,\n });\n\n return new Command({\n client,\n sessionId: this.session.id,\n cmd: command.json.command,\n });\n }\n\n /**\n * Start executing a command in this session.\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 * @param opts.timeoutMs - Maximum time in milliseconds to wait for the\n * command to complete. On expiry the process is killed with SIGKILL.\n * @returns A {@link CommandFinished} result once execution is done.\n */\n async runCommand(\n command: string,\n args?: string[],\n opts?: { signal?: AbortSignal; timeoutMs?: number },\n ): Promise<CommandFinished>;\n\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 session.\n *\n * @param params - The command parameters.\n * @returns A {@link CommandFinished} result once execution is done.\n */\n async runCommand(params: RunCommandParams): Promise<CommandFinished>;\n\n async runCommand(\n commandOrParams: string | RunCommandParams,\n args?: string[],\n opts?: { signal?: AbortSignal; timeoutMs?: number },\n ): Promise<Command | CommandFinished> {\n \"use step\";\n const client = await this.ensureClient();\n const params: RunCommandParams =\n typeof commandOrParams === \"string\"\n ? {\n cmd: commandOrParams,\n args,\n signal: opts?.signal,\n timeoutMs: opts?.timeoutMs,\n }\n : commandOrParams;\n const wait = params.detached ? false : true;\n const shouldPipeLogs = Boolean(params.stdout || params.stderr);\n\n if (wait) {\n let stdout = \"\", stderr = \"\";\n const commandStream = await client.runCommand({\n sessionId: this.session.id,\n command: params.cmd,\n args: params.args ?? [],\n cwd: params.cwd,\n env: params.env ?? {},\n sudo: params.sudo ?? false,\n wait: true,\n logs: true,\n onLog: (log) => {\n if (log.stream === \"stdout\") {\n stdout += log.data;\n params.stdout?.write(log.data);\n } else {\n stderr += log.data;\n params.stderr?.write(log.data);\n }\n },\n timeout: params.timeoutMs,\n signal: params.signal,\n });\n\n const finished = await commandStream.finished;\n\n return new CommandFinished({\n client,\n sessionId: this.session.id,\n cmd: finished,\n exitCode: finished.exitCode ?? 0,\n output: { stdout, stderr },\n });\n }\n\n const commandResponse = await client.runCommand({\n sessionId: this.session.id,\n command: params.cmd,\n args: params.args ?? [],\n cwd: params.cwd,\n env: params.env ?? {},\n sudo: params.sudo ?? false,\n timeout: params.timeoutMs,\n signal: params.signal,\n });\n\n const command = new Command({\n client,\n sessionId: this.session.id,\n cmd: commandResponse.json.command,\n });\n\n if (shouldPipeLogs) {\n (async () => {\n try {\n for await (const log of command.logs({ signal: params.signal })) {\n if (log.stream === \"stdout\") {\n params.stdout?.write(log.data);\n } else if (log.stream === \"stderr\") {\n params.stderr?.write(log.data);\n }\n }\n } catch (err) {\n if (params.signal?.aborted) {\n return;\n }\n (params.stderr ?? params.stdout)?.emit(\"error\", err);\n }\n })();\n }\n\n return command;\n }\n\n /**\n * Create a directory in the filesystem of this session.\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 const client = await this.ensureClient();\n await client.mkDir({\n sessionId: this.session.id,\n path: path,\n signal: opts?.signal,\n });\n }\n\n /**\n * Open an interactive shell session. Returns the WebSocket URL and token the\n * client uses to connect to the controller-hosted PTY.\n *\n * @param opts - Optional parameters.\n * @param opts.signal - An AbortSignal to cancel the operation.\n */\n async openInteractive(opts?: {\n signal?: AbortSignal;\n }): Promise<{ url: string; token: string }> {\n \"use step\";\n const client = await this.ensureClient();\n const { json } = await client.openInteractive({\n sessionId: this.session.id,\n signal: opts?.signal,\n });\n return { url: json.url, token: json.token };\n }\n\n /**\n * Read a file from the filesystem of this session 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 const client = await this.ensureClient();\n return client.readFile({\n sessionId: this.session.id,\n path: file.path,\n cwd: file.cwd,\n signal: opts?.signal,\n });\n }\n\n /**\n * Read a file from the filesystem of this session 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 const client = await this.ensureClient();\n const stream = await client.readFile({\n sessionId: this.session.id,\n path: file.path,\n cwd: file.cwd,\n signal: opts?.signal,\n });\n\n if (stream === null) {\n return null;\n }\n\n return consumeReadable(stream);\n }\n\n /**\n * Download a file from the session to the local filesystem.\n *\n * @param src - Source file on the session, 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 const client = await this.ensureClient();\n if (!src?.path) {\n throw new Error(\"downloadFile: source path is required\");\n }\n\n if (!dst?.path) {\n throw new Error(\"downloadFile: destination path is required\");\n }\n\n const stream = await client.readFile({\n sessionId: this.session.id,\n path: src.path,\n cwd: src.cwd,\n signal: opts?.signal,\n });\n\n if (stream === null) {\n return null;\n }\n\n try {\n const dstPath = resolve(dst.cwd ?? \"\", dst.path);\n if (opts?.mkdirRecursive) {\n await mkdir(dirname(dstPath), { recursive: true });\n }\n await pipeline(stream, createWriteStream(dstPath), {\n signal: opts?.signal,\n });\n return dstPath;\n } finally {\n stream.destroy();\n }\n }\n\n /**\n * Write files to the filesystem of this session.\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 and stream/buffer contents\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 async writeFiles(\n files: { path: string; content: string | Uint8Array; mode?: number }[],\n opts?: { signal?: AbortSignal },\n ) {\n \"use step\";\n const client = await this.ensureClient();\n return client.writeFiles({\n sessionId: this.session.id,\n cwd: this.session.cwd,\n extractDir: \"/\",\n files: files,\n signal: opts?.signal,\n });\n }\n\n /**\n * Get the public domain of a port of this session.\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 const route = this.routes.find(({ port }) => port == p);\n if (route) {\n return `https://${route.subdomain}.vercel.run`;\n } else {\n throw new Error(`No route for port ${p}`);\n }\n }\n\n /**\n * Stop this session.\n *\n * @param opts - Optional parameters.\n * @param opts.signal - An AbortSignal to cancel the operation.\n * @returns The final session state and optional sandbox metadata.\n */\n async stop(opts?: {\n signal?: AbortSignal;\n }): Promise<{ session: SandboxSnapshot; sandbox?: SandboxMetaData; snapshot?: SnapshotMetadata }> {\n \"use step\";\n const client = await this.ensureClient();\n const response = await client.stopSession({\n sessionId: this.session.id,\n signal: opts?.signal,\n });\n this.session = toSandboxSnapshot(response.json.session);\n return { session: this.session, sandbox: response.json.sandbox, snapshot: response.json.snapshot };\n }\n\n /**\n * Update the current session's settings.\n *\n * @param params - Fields to update.\n * @param params.networkPolicy - The new network policy to apply.\n * @param opts - Optional parameters.\n * @param opts.signal - An AbortSignal to cancel the operation.\n *\n * @example\n * // Restrict to specific domains\n * await session.update({\n * networkPolicy: {\n * allow: [\"*.npmjs.org\", \"github.com\"],\n * }\n * });\n *\n * @example\n * // Inject credentials with per-domain transformers\n * await session.update({\n * networkPolicy: {\n * allow: {\n * \"ai-gateway.vercel.sh\": [{\n * transform: [{\n * headers: { authorization: \"Bearer ...\" }\n * }]\n * }],\n * \"*\": []\n * }\n * }\n * });\n *\n * @example\n * // Deny all network access\n * await session.update({ networkPolicy: \"deny-all\" });\n */\n async update(\n params: {\n networkPolicy?: NetworkPolicy;\n },\n opts?: { signal?: AbortSignal },\n ): Promise<void> {\n \"use step\";\n if (params.networkPolicy !== undefined) {\n const client = await this.ensureClient();\n const response = await client.updateNetworkPolicy({\n sessionId: this.session.id,\n networkPolicy: params.networkPolicy,\n signal: opts?.signal,\n });\n\n // Update the internal session with the new network policy\n this.session = toSandboxSnapshot(response.json.session);\n }\n }\n\n /**\n * Extend the timeout of the session by the specified duration.\n *\n * This allows you to extend the lifetime of a session 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 * const session = sandbox.currentSession();\n * // Extends timeout by 5 minutes, to a total of 15 minutes.\n * await session.extendTimeout(ms('5m'));\n */\n async extendTimeout(\n duration: number,\n opts?: { signal?: AbortSignal },\n ): Promise<void> {\n \"use step\";\n const client = await this.ensureClient();\n const response = await client.extendTimeout({\n sessionId: this.session.id,\n duration,\n signal: opts?.signal,\n });\n\n // Update the internal sandbox metadata with the new timeout value\n this.session = toSandboxSnapshot(response.json.session);\n }\n\n /**\n * Create a snapshot from this currently running session. New sandboxes can\n * then be created from this snapshot using {@link Sandbox.create}.\n *\n * Note: this session 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 const client = await this.ensureClient();\n const response = await client.createSnapshot({\n sessionId: this.session.id,\n expiration: opts?.expiration,\n signal: opts?.signal,\n });\n\n this.session = toSandboxSnapshot(response.json.session);\n\n return new Snapshot({\n client,\n snapshot: response.json.snapshot,\n });\n }\n}\n"],"mappings":"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"} | ||
| {"version":3,"file":"session.js","names":["params: RunCommandParams","path"],"sources":["../src/session.ts"],"sourcesContent":["import { WORKFLOW_DESERIALIZE, WORKFLOW_SERIALIZE } from \"@workflow/serde\";\nimport { type SessionMetaData, type SandboxRouteData, type SandboxMetaData, type SnapshotMetadata, APIClient } from \"./api-client/index.js\";\nimport type { Writable } from \"stream\";\nimport { pipeline } from \"stream/promises\";\nimport { createWriteStream } from \"fs\";\nimport { mkdir } from \"fs/promises\";\nimport { dirname, resolve } from \"path\";\nimport { Command, CommandFinished } from \"./command.js\";\nimport { Snapshot } from \"./snapshot.js\";\nimport { consumeReadable } from \"./utils/consume-readable.js\";\nimport type {\n NetworkPolicy,\n NetworkPolicyRule,\n NetworkTransformer,\n} from \"./network-policy.js\";\nimport { toSandboxSnapshot, type SandboxSnapshot } from \"./utils/sandbox-snapshot.js\";\nimport { getCredentials } from \"./utils/get-credentials.js\";\n\nexport type { NetworkPolicy, NetworkPolicyRule, NetworkTransformer };\n\n/**\n * Serialized representation of a Session for @workflow/serde.\n */\nexport interface SerializedSession {\n session: SandboxSnapshot;\n routes: SandboxRouteData[];\n}\n\n/** @inline */\nexport interface RunCommandParams {\n /**\n * The command to execute\n */\n cmd: string;\n /**\n * Arguments to pass to the command\n */\n args?: string[];\n /**\n * Working directory to execute the command in\n */\n cwd?: string;\n /**\n * Environment variables to set for this command\n */\n env?: Record<string, string>;\n /**\n * If true, execute this command with root privileges. Defaults to false.\n */\n sudo?: boolean;\n /**\n * If true, the command will return without waiting for `exitCode`\n */\n detached?: boolean;\n /**\n * A `Writable` stream where `stdout` from the command will be piped\n */\n stdout?: Writable;\n /**\n * A `Writable` stream where `stderr` from the command will be piped\n */\n stderr?: Writable;\n /**\n * An AbortSignal to cancel the command execution\n */\n signal?: AbortSignal;\n /**\n * Maximum time in milliseconds the command may run before it is killed with\n * SIGKILL. The timeout is enforced by the sandbox at exec time, so it applies\n * whether or not the command is awaited (including `detached: true`).\n */\n timeoutMs?: number;\n}\n\n/**\n * A Session represents a running VM instance within a {@link Sandbox}.\n *\n * Obtain a session via {@link Sandbox.currentSession}.\n */\nexport class Session {\n private _client: APIClient | null = null;\n\n /**\n * Lazily resolve credentials and construct an API client.\n * This is used in step contexts where the Sandbox was deserialized\n * without a client (e.g. when crossing workflow/step boundaries).\n * Uses getCredentials() which resolves from OIDC or env vars.\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 * Routes from ports to subdomains.\n * @hidden\n */\n public readonly routes: SandboxRouteData[];\n\n /**\n * Internal metadata about the current session.\n */\n private session: SandboxSnapshot;\n\n private get client(): APIClient {\n if (!this._client) throw new Error(\"API client not initialized\");\n return this._client;\n }\n\n /** @internal */\n get _sessionSnapshot(): SandboxSnapshot {\n return this.session;\n }\n\n /**\n * Unique ID of this session.\n */\n public get sessionId(): string {\n return this.session.id;\n }\n\n public get interactivePort(): number | undefined {\n return this.session.interactivePort ?? undefined;\n }\n\n /**\n * The status of this session.\n */\n public get status(): SessionMetaData[\"status\"] {\n return this.session.status;\n }\n\n /**\n * The creation date of this session.\n */\n public get createdAt(): Date {\n return new Date(this.session.createdAt);\n }\n\n /**\n * The timeout of this session in milliseconds.\n */\n public get timeout(): number {\n return this.session.timeout;\n }\n\n /**\n * The network policy of this session.\n */\n public get networkPolicy(): NetworkPolicy | undefined {\n return this.session.networkPolicy;\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.session.sourceSnapshotId;\n }\n\n /**\n * Memory allocated to this session in MB.\n */\n public get memory(): number {\n return this.session.memory;\n }\n\n /**\n * Number of vCPUs allocated to this session.\n */\n public get vcpus(): number {\n return this.session.vcpus;\n }\n\n /**\n * The region where this session is hosted.\n */\n public get region(): string {\n return this.session.region;\n }\n\n /**\n * Runtime identifier (e.g. \"node24\", \"python3.13\").\n */\n public get runtime(): string {\n return this.session.runtime;\n }\n\n /**\n * The working directory of this session.\n */\n public get cwd(): string {\n return this.session.cwd;\n }\n\n /**\n * When this session was requested.\n */\n public get requestedAt(): Date {\n return new Date(this.session.requestedAt);\n }\n\n /**\n * When this session started running.\n */\n public get startedAt(): Date | undefined {\n return this.session.startedAt != null\n ? new Date(this.session.startedAt)\n : undefined;\n }\n\n /**\n * When this session was requested to stop.\n */\n public get requestedStopAt(): Date | undefined {\n return this.session.requestedStopAt != null\n ? new Date(this.session.requestedStopAt)\n : undefined;\n }\n\n /**\n * When this session was stopped.\n */\n public get stoppedAt(): Date | undefined {\n return this.session.stoppedAt != null\n ? new Date(this.session.stoppedAt)\n : undefined;\n }\n\n /**\n * When this session was aborted.\n */\n public get abortedAt(): Date | undefined {\n return this.session.abortedAt != null\n ? new Date(this.session.abortedAt)\n : undefined;\n }\n\n /**\n * The wall-clock duration of this session in milliseconds.\n */\n public get duration(): number | undefined {\n return this.session.duration;\n }\n\n /**\n * When a snapshot was requested for this session.\n */\n public get snapshottedAt(): Date | undefined {\n return this.session.snapshottedAt != null\n ? new Date(this.session.snapshottedAt)\n : undefined;\n }\n\n /**\n * When this session was last updated.\n */\n public get updatedAt(): Date {\n return new Date(this.session.updatedAt);\n }\n\n /**\n * The amount of active CPU used by the session. Only reported once the VM is\n * stopped.\n */\n public get activeCpuUsageMs(): number | undefined {\n return this.session.activeCpuDurationMs;\n }\n\n /**\n * The amount of network data used by the session. Only reported once the VM\n * is stopped.\n */\n public get networkTransfer():\n | { ingress: number; egress: number }\n | undefined {\n return this.session.networkTransfer;\n }\n\n /**\n * Serialize a Session instance to plain data for @workflow/serde.\n *\n * Although Sandbox handles top-level serialization, Session needs these\n * methods so the Workflow SWC compiler can resolve the class by name.\n * The `new Session(...)` self-reference in WORKFLOW_DESERIALIZE forces\n * rolldown to preserve the class name in the compiled output.\n */\n static [WORKFLOW_SERIALIZE](instance: Session): SerializedSession {\n return {\n session: instance.session,\n routes: instance.routes,\n };\n }\n\n static [WORKFLOW_DESERIALIZE](data: SerializedSession): Session {\n return new Session({ routes: data.routes, snapshot: data.session });\n }\n\n constructor(params: {\n client: APIClient;\n routes: SandboxRouteData[];\n session: SessionMetaData;\n } | {\n /** @internal – used during deserialization with an already-converted snapshot */\n routes: SandboxRouteData[];\n snapshot: SandboxSnapshot;\n }) {\n this.routes = params.routes;\n if (\"snapshot\" in params) {\n this.session = params.snapshot;\n } else {\n this._client = params.client;\n this.session = toSandboxSnapshot(params.session);\n }\n }\n\n /** @internal */\n updateRoutes(routes: SandboxRouteData[]): void {\n (this as { routes: SandboxRouteData[] }).routes = routes;\n }\n\n /**\n * Get a previously run command by its ID.\n *\n * @param cmdId - ID of the command to retrieve\n * @param opts - Optional parameters.\n * @param opts.signal - An AbortSignal to cancel the operation.\n * @returns A {@link Command} instance representing the command\n */\n async getCommand(\n cmdId: string,\n opts?: { signal?: AbortSignal },\n ): Promise<Command> {\n \"use step\";\n const client = await this.ensureClient();\n const command = await client.getCommand({\n sessionId: this.session.id,\n cmdId,\n signal: opts?.signal,\n });\n\n return new Command({\n client,\n sessionId: this.session.id,\n cmd: command.json.command,\n });\n }\n\n /**\n * Start executing a command in this session.\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 * @param opts.timeoutMs - Maximum time in milliseconds to wait for the\n * command to complete. On expiry the process is killed with SIGKILL.\n * @returns A {@link CommandFinished} result once execution is done.\n */\n async runCommand(\n command: string,\n args?: string[],\n opts?: { signal?: AbortSignal; timeoutMs?: number },\n ): Promise<CommandFinished>;\n\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 session.\n *\n * @param params - The command parameters.\n * @returns A {@link CommandFinished} result once execution is done.\n */\n async runCommand(params: RunCommandParams): Promise<CommandFinished>;\n\n async runCommand(\n commandOrParams: string | RunCommandParams,\n args?: string[],\n opts?: { signal?: AbortSignal; timeoutMs?: number },\n ): Promise<Command | CommandFinished> {\n \"use step\";\n const client = await this.ensureClient();\n const params: RunCommandParams =\n typeof commandOrParams === \"string\"\n ? {\n cmd: commandOrParams,\n args,\n signal: opts?.signal,\n timeoutMs: opts?.timeoutMs,\n }\n : commandOrParams;\n const wait = params.detached ? false : true;\n const shouldPipeLogs = Boolean(params.stdout || params.stderr);\n\n if (wait) {\n let stdout = \"\", stderr = \"\";\n const commandStream = await client.runCommand({\n sessionId: this.session.id,\n command: params.cmd,\n args: params.args ?? [],\n cwd: params.cwd,\n env: params.env ?? {},\n sudo: params.sudo ?? false,\n wait: true,\n logs: true,\n onLog: (log) => {\n if (log.stream === \"stdout\") {\n stdout += log.data;\n params.stdout?.write(log.data);\n } else {\n stderr += log.data;\n params.stderr?.write(log.data);\n }\n },\n timeout: params.timeoutMs,\n signal: params.signal,\n });\n\n const finished = await commandStream.finished;\n\n return new CommandFinished({\n client,\n sessionId: this.session.id,\n cmd: finished,\n exitCode: finished.exitCode ?? 0,\n durationMs: finished.durationMs,\n output: { stdout, stderr },\n });\n }\n\n const commandResponse = await client.runCommand({\n sessionId: this.session.id,\n command: params.cmd,\n args: params.args ?? [],\n cwd: params.cwd,\n env: params.env ?? {},\n sudo: params.sudo ?? false,\n timeout: params.timeoutMs,\n signal: params.signal,\n });\n\n const command = new Command({\n client,\n sessionId: this.session.id,\n cmd: commandResponse.json.command,\n });\n\n if (shouldPipeLogs) {\n (async () => {\n try {\n for await (const log of command.logs({ signal: params.signal })) {\n if (log.stream === \"stdout\") {\n params.stdout?.write(log.data);\n } else if (log.stream === \"stderr\") {\n params.stderr?.write(log.data);\n }\n }\n } catch (err) {\n if (params.signal?.aborted) {\n return;\n }\n (params.stderr ?? params.stdout)?.emit(\"error\", err);\n }\n })();\n }\n\n return command;\n }\n\n /**\n * Create a directory in the filesystem of this session.\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 const client = await this.ensureClient();\n await client.mkDir({\n sessionId: this.session.id,\n path: path,\n signal: opts?.signal,\n });\n }\n\n /**\n * Open an interactive shell session. Returns the WebSocket URL and token the\n * client uses to connect to the controller-hosted PTY.\n *\n * @param opts - Optional parameters.\n * @param opts.signal - An AbortSignal to cancel the operation.\n */\n async openInteractive(opts?: {\n signal?: AbortSignal;\n }): Promise<{ url: string; token: string }> {\n \"use step\";\n const client = await this.ensureClient();\n const { json } = await client.openInteractive({\n sessionId: this.session.id,\n signal: opts?.signal,\n });\n return { url: json.url, token: json.token };\n }\n\n /**\n * Read a file from the filesystem of this session 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 const client = await this.ensureClient();\n return client.readFile({\n sessionId: this.session.id,\n path: file.path,\n cwd: file.cwd,\n signal: opts?.signal,\n });\n }\n\n /**\n * Read a file from the filesystem of this session 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 const client = await this.ensureClient();\n const stream = await client.readFile({\n sessionId: this.session.id,\n path: file.path,\n cwd: file.cwd,\n signal: opts?.signal,\n });\n\n if (stream === null) {\n return null;\n }\n\n return consumeReadable(stream);\n }\n\n /**\n * Download a file from the session to the local filesystem.\n *\n * @param src - Source file on the session, 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 const client = await this.ensureClient();\n if (!src?.path) {\n throw new Error(\"downloadFile: source path is required\");\n }\n\n if (!dst?.path) {\n throw new Error(\"downloadFile: destination path is required\");\n }\n\n const stream = await client.readFile({\n sessionId: this.session.id,\n path: src.path,\n cwd: src.cwd,\n signal: opts?.signal,\n });\n\n if (stream === null) {\n return null;\n }\n\n try {\n const dstPath = resolve(dst.cwd ?? \"\", dst.path);\n if (opts?.mkdirRecursive) {\n await mkdir(dirname(dstPath), { recursive: true });\n }\n await pipeline(stream, createWriteStream(dstPath), {\n signal: opts?.signal,\n });\n return dstPath;\n } finally {\n stream.destroy();\n }\n }\n\n /**\n * Write files to the filesystem of this session.\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 and stream/buffer contents\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 async writeFiles(\n files: { path: string; content: string | Uint8Array; mode?: number }[],\n opts?: { signal?: AbortSignal },\n ) {\n \"use step\";\n const client = await this.ensureClient();\n return client.writeFiles({\n sessionId: this.session.id,\n cwd: this.session.cwd,\n extractDir: \"/\",\n files: files,\n signal: opts?.signal,\n });\n }\n\n /**\n * Get the public domain of a port of this session.\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 const route = this.routes.find(({ port }) => port == p);\n if (route) {\n return `https://${route.subdomain}.vercel.run`;\n } else {\n throw new Error(`No route for port ${p}`);\n }\n }\n\n /**\n * Stop this session.\n *\n * @param opts - Optional parameters.\n * @param opts.signal - An AbortSignal to cancel the operation.\n * @returns The final session state and optional sandbox metadata.\n */\n async stop(opts?: {\n signal?: AbortSignal;\n }): Promise<{ session: SandboxSnapshot; sandbox?: SandboxMetaData; snapshot?: SnapshotMetadata }> {\n \"use step\";\n const client = await this.ensureClient();\n const response = await client.stopSession({\n sessionId: this.session.id,\n signal: opts?.signal,\n });\n this.session = toSandboxSnapshot(response.json.session);\n return { session: this.session, sandbox: response.json.sandbox, snapshot: response.json.snapshot };\n }\n\n /**\n * Update the current session's settings.\n *\n * @param params - Fields to update.\n * @param params.networkPolicy - The new network policy to apply.\n * @param opts - Optional parameters.\n * @param opts.signal - An AbortSignal to cancel the operation.\n *\n * @example\n * // Restrict to specific domains\n * await session.update({\n * networkPolicy: {\n * allow: [\"*.npmjs.org\", \"github.com\"],\n * }\n * });\n *\n * @example\n * // Inject credentials with per-domain transformers\n * await session.update({\n * networkPolicy: {\n * allow: {\n * \"ai-gateway.vercel.sh\": [{\n * transform: [{\n * headers: { authorization: \"Bearer ...\" }\n * }]\n * }],\n * \"*\": []\n * }\n * }\n * });\n *\n * @example\n * // Deny all network access\n * await session.update({ networkPolicy: \"deny-all\" });\n */\n async update(\n params: {\n networkPolicy?: NetworkPolicy;\n },\n opts?: { signal?: AbortSignal },\n ): Promise<void> {\n \"use step\";\n if (params.networkPolicy !== undefined) {\n const client = await this.ensureClient();\n const response = await client.updateNetworkPolicy({\n sessionId: this.session.id,\n networkPolicy: params.networkPolicy,\n signal: opts?.signal,\n });\n\n // Update the internal session with the new network policy\n this.session = toSandboxSnapshot(response.json.session);\n }\n }\n\n /**\n * Extend the timeout of the session by the specified duration.\n *\n * This allows you to extend the lifetime of a session 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 * const session = sandbox.currentSession();\n * // Extends timeout by 5 minutes, to a total of 15 minutes.\n * await session.extendTimeout(ms('5m'));\n */\n async extendTimeout(\n duration: number,\n opts?: { signal?: AbortSignal },\n ): Promise<void> {\n \"use step\";\n const client = await this.ensureClient();\n const response = await client.extendTimeout({\n sessionId: this.session.id,\n duration,\n signal: opts?.signal,\n });\n\n // Update the internal sandbox metadata with the new timeout value\n this.session = toSandboxSnapshot(response.json.session);\n }\n\n /**\n * Create a snapshot from this currently running session. New sandboxes can\n * then be created from this snapshot using {@link Sandbox.create}.\n *\n * Note: this session 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 const client = await this.ensureClient();\n const response = await client.createSnapshot({\n sessionId: this.session.id,\n expiration: opts?.expiration,\n signal: opts?.signal,\n });\n\n this.session = toSandboxSnapshot(response.json.session);\n\n return new Snapshot({\n client,\n snapshot: response.json.snapshot,\n });\n }\n}\n"],"mappings":"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"} |
@@ -112,3 +112,3 @@ import { Paginator } from "./utils/paginator.cjs"; | ||
| region: string; | ||
| status: "created" | "deleted" | "failed"; | ||
| status: "failed" | "created" | "deleted"; | ||
| sizeBytes: number; | ||
@@ -151,3 +151,3 @@ createdAt: number; | ||
| region: string; | ||
| status: "created" | "deleted" | "failed"; | ||
| status: "failed" | "created" | "deleted"; | ||
| sizeBytes: number; | ||
@@ -165,3 +165,3 @@ createdAt: number; | ||
| region: string; | ||
| status: "created" | "deleted" | "failed"; | ||
| status: "failed" | "created" | "deleted"; | ||
| sizeBytes: number; | ||
@@ -186,3 +186,3 @@ createdAt: number; | ||
| region: string; | ||
| status: "created" | "deleted" | "failed"; | ||
| status: "failed" | "created" | "deleted"; | ||
| sizeBytes: number; | ||
@@ -200,3 +200,3 @@ createdAt: number; | ||
| region: string; | ||
| status: "created" | "deleted" | "failed"; | ||
| status: "failed" | "created" | "deleted"; | ||
| sizeBytes: number; | ||
@@ -203,0 +203,0 @@ createdAt: number; |
@@ -113,3 +113,3 @@ import { Paginator } from "./utils/paginator.js"; | ||
| region: string; | ||
| status: "created" | "deleted" | "failed"; | ||
| status: "failed" | "created" | "deleted"; | ||
| sizeBytes: number; | ||
@@ -152,3 +152,3 @@ createdAt: number; | ||
| region: string; | ||
| status: "created" | "deleted" | "failed"; | ||
| status: "failed" | "created" | "deleted"; | ||
| sizeBytes: number; | ||
@@ -166,3 +166,3 @@ createdAt: number; | ||
| region: string; | ||
| status: "created" | "deleted" | "failed"; | ||
| status: "failed" | "created" | "deleted"; | ||
| sizeBytes: number; | ||
@@ -187,3 +187,3 @@ createdAt: number; | ||
| region: string; | ||
| status: "created" | "deleted" | "failed"; | ||
| status: "failed" | "created" | "deleted"; | ||
| sizeBytes: number; | ||
@@ -201,3 +201,3 @@ createdAt: number; | ||
| region: string; | ||
| status: "created" | "deleted" | "failed"; | ||
| status: "failed" | "created" | "deleted"; | ||
| sizeBytes: number; | ||
@@ -204,0 +204,0 @@ createdAt: number; |
+1
-1
| //#region src/version.ts | ||
| const VERSION = "2.4.0"; | ||
| const VERSION = "2.5.0"; | ||
@@ -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.4.0\";\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.5.0\";\n"],"mappings":";;AACA,MAAa,UAAU"} |
+1
-1
| //#region src/version.ts | ||
| const VERSION = "2.4.0"; | ||
| const VERSION = "2.5.0"; | ||
@@ -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.4.0\";\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.5.0\";\n"],"mappings":";AACA,MAAa,UAAU"} |
+1
-1
| { | ||
| "name": "@vercel/sandbox", | ||
| "version": "2.4.0", | ||
| "version": "2.5.0", | ||
| "description": "Software Development Kit for Vercel Sandbox", | ||
@@ -5,0 +5,0 @@ "type": "module", |
1275911
0.26%14828
0.19%