@computesdk/quilt 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { defineProvider, escapeShellArg } from '@computesdk/provider';\n\nimport type {\n CommandResult,\n CreateSandboxOptions,\n CreateSnapshotOptions,\n FileEntry,\n ListSnapshotsOptions,\n RunCommandOptions,\n SandboxInfo,\n} from '@computesdk/provider';\nimport type { Snapshot } from 'computesdk';\n\nconst PROVIDER = 'quilt' as const;\nconst DEFAULT_IMAGE = 'prod';\nconst DEFAULT_TIMEOUT_MS = 300000;\nconst DEFAULT_POLL_INTERVAL_MS = 1000;\n\ntype QuiltAuthMode = 'apiKey' | 'accessToken';\ntype QuiltServiceAuthMode = 'service_token' | 'public';\ntype QuiltContainerState = 'created' | 'starting' | 'running' | 'exited' | 'error';\ntype QuiltCommandRunner = (\n sandbox: QuiltSandboxHandle,\n command: string,\n options?: RunCommandOptions\n) => Promise<CommandResult>;\n\nexport interface QuiltConfig {\n baseUrl?: string;\n apiKey?: string;\n accessToken?: string;\n tenantId?: string;\n image?: string;\n timeout?: number;\n publishedServiceAuthMode?: QuiltServiceAuthMode;\n publishedServiceTtlSecs?: number;\n pollIntervalMs?: number;\n}\n\ninterface QuiltResolvedConfig {\n baseUrl: string;\n authMode: QuiltAuthMode;\n authToken: string;\n tenantId?: string;\n image: string;\n timeout: number;\n publishedServiceAuthMode: QuiltServiceAuthMode;\n publishedServiceTtlSecs?: number;\n pollIntervalMs: number;\n}\n\ninterface QuiltContainer {\n container_id: string;\n tenant_id?: string;\n name?: string;\n state?: QuiltContainerState;\n created_at?: string;\n started_at?: string | null;\n exited_at?: string | null;\n ip_address?: string | null;\n exec_ready?: boolean;\n network_ready?: boolean;\n labels?: Record<string, string>;\n [key: string]: unknown;\n}\n\ninterface QuiltOperationRecord {\n operation_id: string;\n operation_type?: string;\n status?: string;\n target_resource_type?: string | null;\n target_resource_id?: string | null;\n result?: Record<string, unknown> | null;\n snapshot_id?: string | null;\n container_id?: string | null;\n error?: string;\n error_message?: string;\n message?: string;\n}\n\ninterface QuiltService {\n service_id: string;\n target_port: number;\n protocol: string;\n enable_websockets?: boolean;\n auth_mode?: QuiltServiceAuthMode;\n public_url?: string;\n websocket_url?: string;\n status?: string;\n}\n\ninterface QuiltSnapshotRecord {\n snapshot_id: string;\n source_container_id?: string | null;\n labels?: Record<string, string>;\n created_at?: number | string;\n expires_at?: number | string | null;\n pinned?: boolean;\n}\n\ninterface QuiltSandboxHandle {\n config: QuiltResolvedConfig;\n sandboxId: string;\n container: QuiltContainer;\n}\n\nfunction getEnv(name: string): string | undefined {\n return typeof process !== 'undefined' ? process.env?.[name] : undefined;\n}\n\nfunction resolveConfig(config: QuiltConfig): QuiltResolvedConfig {\n const baseUrl = config.baseUrl ?? getEnv('QUILT_BASE_URL') ?? getEnv('QUILT_API_BASE_URL');\n if (!baseUrl) {\n throw new Error(\n 'Missing Quilt base URL.\\n\\n' +\n \"Pass it: quilt({ baseUrl: 'https://backend.example.com' })\\n\" +\n 'Or set QUILT_BASE_URL in your environment.'\n );\n }\n\n const apiKey = config.apiKey ?? getEnv('QUILT_API_KEY');\n const accessToken = config.accessToken ?? getEnv('QUILT_ACCESS_TOKEN');\n\n if (!apiKey && !accessToken) {\n throw new Error(\n 'Missing Quilt credentials.\\n\\n' +\n 'Provide apiKey or accessToken in config:\\n' +\n \" quilt({ baseUrl: 'https://backend.example.com', apiKey: 'xxx' })\\n\" +\n 'Or set QUILT_API_KEY or QUILT_ACCESS_TOKEN in your environment.'\n );\n }\n\n const tenantId = config.tenantId ?? getEnv('QUILT_TENANT_ID');\n const timeoutFromEnv = getEnv('QUILT_TIMEOUT_MS');\n const pollFromEnv = getEnv('QUILT_POLL_INTERVAL_MS');\n const ttlFromEnv = getEnv('QUILT_PUBLISHED_SERVICE_TTL_SECS');\n const authModeFromEnv = getEnv('QUILT_PUBLISHED_SERVICE_AUTH_MODE');\n\n return {\n baseUrl: baseUrl.replace(/\\/+$/, ''),\n authMode: apiKey ? 'apiKey' : 'accessToken',\n authToken: apiKey ?? accessToken ?? '',\n tenantId,\n image: config.image ?? getEnv('QUILT_IMAGE') ?? DEFAULT_IMAGE,\n timeout: config.timeout ?? parseOptionalInt(timeoutFromEnv) ?? DEFAULT_TIMEOUT_MS,\n publishedServiceAuthMode:\n config.publishedServiceAuthMode ??\n (authModeFromEnv === 'public' ? 'public' : 'service_token'),\n publishedServiceTtlSecs:\n config.publishedServiceTtlSecs ?? parseOptionalInt(ttlFromEnv) ?? undefined,\n pollIntervalMs: config.pollIntervalMs ?? parseOptionalInt(pollFromEnv) ?? DEFAULT_POLL_INTERVAL_MS,\n };\n}\n\nfunction parseOptionalInt(value: string | undefined): number | undefined {\n if (!value) return undefined;\n const parsed = Number.parseInt(value, 10);\n return Number.isFinite(parsed) ? parsed : undefined;\n}\n\nfunction buildHeaders(config: QuiltResolvedConfig, includeTenantHeader = false): HeadersInit {\n const headers: Record<string, string> = {\n Accept: 'application/json',\n };\n\n if (config.authMode === 'apiKey') {\n headers['X-Api-Key'] = config.authToken;\n } else {\n headers.Authorization = `Bearer ${config.authToken}`;\n }\n\n if (includeTenantHeader) {\n if (!config.tenantId) {\n throw new Error(\n 'Quilt snapshot operations require tenantId.\\n\\n' +\n \"Pass it: quilt({ tenantId: 'tenant_123', ... })\\n\" +\n 'Or set QUILT_TENANT_ID in your environment.'\n );\n }\n headers['X-Tenant-Id'] = config.tenantId;\n }\n\n return headers;\n}\n\nasync function requestJson<T>(\n config: QuiltResolvedConfig,\n path: string,\n init: RequestInit = {},\n options: { includeTenantHeader?: boolean; allow404?: boolean } = {}\n): Promise<T | null> {\n const headers = {\n ...buildHeaders(config, options.includeTenantHeader),\n ...(init.headers || {}),\n };\n\n const response = await fetch(`${config.baseUrl}${path}`, {\n ...init,\n headers,\n });\n\n if (options.allow404 && response.status === 404) {\n return null;\n }\n\n if (!response.ok) {\n throw await buildHttpError(response, path);\n }\n\n if (response.status === 204) {\n return null;\n }\n\n return (await response.json()) as T;\n}\n\nasync function requestNoContent(\n config: QuiltResolvedConfig,\n path: string,\n init: RequestInit = {},\n options: { includeTenantHeader?: boolean; allow404?: boolean } = {}\n): Promise<void> {\n const headers = {\n ...buildHeaders(config, options.includeTenantHeader),\n ...(init.headers || {}),\n };\n\n const response = await fetch(`${config.baseUrl}${path}`, {\n ...init,\n headers,\n });\n\n if (options.allow404 && response.status === 404) {\n return;\n }\n\n if (!response.ok) {\n throw await buildHttpError(response, path);\n }\n}\n\nasync function buildHttpError(response: Response, path: string): Promise<Error> {\n let detail = `${response.status} ${response.statusText}`;\n try {\n const body = await response.json();\n if (body && typeof body === 'object') {\n const record = body as Record<string, unknown>;\n detail =\n (typeof record.error === 'string' && record.error) ||\n (typeof record.message === 'string' && record.message) ||\n detail;\n }\n } catch {\n try {\n const text = await response.text();\n if (text) detail = text;\n } catch {\n // noop\n }\n }\n return new Error(`Quilt API request failed for ${path}: ${detail}`);\n}\n\nfunction buildExecCommand(command: string, options?: RunCommandOptions): string {\n let fullCommand = command;\n\n if (options?.env && Object.keys(options.env).length > 0) {\n const envPrefix = Object.entries(options.env)\n .map(([key, value]) => {\n if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(key)) {\n throw new Error(`Invalid environment variable name \"${key}\".`);\n }\n return `${key}=\"${escapeShellArg(String(value))}\"`;\n })\n .join(' ');\n fullCommand = `${envPrefix} ${fullCommand}`;\n }\n\n if (options?.background) {\n fullCommand = `nohup ${fullCommand} > /dev/null 2>&1 &`;\n }\n\n return fullCommand;\n}\n\nfunction mapStatus(state: QuiltContainerState | undefined): SandboxInfo['status'] {\n switch (state) {\n case 'error':\n return 'error';\n case 'created':\n case 'starting':\n case 'running':\n return 'running';\n case 'exited':\n default:\n return 'stopped';\n }\n}\n\nfunction parseDate(value: string | number | null | undefined): Date {\n if (typeof value === 'number') return new Date(value * 1000);\n if (typeof value === 'string') return new Date(value);\n return new Date();\n}\n\nfunction normalizeFileEntries(stdout: string): FileEntry[] {\n return stdout\n .split('\\n')\n .map(line => line.trim())\n .filter(line => line && !line.startsWith('total '))\n .flatMap(line => {\n const parts = line.split(/\\s+/);\n if (parts.length < 9) return [];\n const name = parts.slice(8).join(' ');\n if (name === '.' || name === '..') return [];\n return [\n {\n name,\n type: parts[0]?.startsWith('d') ? 'directory' : 'file',\n size: Number.parseInt(parts[4] ?? '0', 10) || 0,\n modified: new Date(),\n } satisfies FileEntry,\n ];\n });\n}\n\nasync function pollOperation(\n config: QuiltResolvedConfig,\n operationId: string,\n timeoutMs: number\n): Promise<QuiltOperationRecord> {\n const deadline = Date.now() + timeoutMs;\n\n while (Date.now() <= deadline) {\n const operation = await requestJson<QuiltOperationRecord>(\n config,\n `/api/operations/${encodeURIComponent(operationId)}`\n );\n\n if (!operation) {\n throw new Error(`Quilt operation ${operationId} disappeared while polling.`);\n }\n\n const status = operation.status ?? '';\n if (status === 'succeeded') return operation;\n if (status === 'failed' || status === 'error' || status === 'cancelled') {\n throw new Error(\n `Quilt operation ${operationId} failed: ${operation.error_message ?? operation.error ?? operation.message ?? status}`\n );\n }\n\n await new Promise(resolve => setTimeout(resolve, config.pollIntervalMs));\n }\n\n throw new Error(`Timed out waiting for Quilt operation ${operationId}.`);\n}\n\nfunction requireOperationId(\n envelope: { operation_id?: string } | null,\n context: string\n): string {\n const operationId = envelope?.operation_id;\n if (!operationId) {\n throw new Error(`Quilt ${context} did not return an operation_id.`);\n }\n return operationId;\n}\n\nasync function getContainerById(\n config: QuiltResolvedConfig,\n sandboxId: string\n): Promise<QuiltContainer | null> {\n return requestJson<QuiltContainer>(\n config,\n `/api/containers/${encodeURIComponent(sandboxId)}`,\n undefined,\n { allow404: true }\n );\n}\n\nfunction resolveSnapshotResultId(operation: QuiltOperationRecord): string | null {\n if (operation.snapshot_id) return operation.snapshot_id;\n if (operation.target_resource_type === 'snapshot' && operation.target_resource_id) {\n return operation.target_resource_id;\n }\n const result = operation.result ?? {};\n const snapshotId = result['snapshot_id'];\n return typeof snapshotId === 'string' ? snapshotId : null;\n}\n\nfunction resolveContainerResultId(operation: QuiltOperationRecord): string | null {\n if (operation.container_id) return operation.container_id;\n if (operation.target_resource_type === 'container' && operation.target_resource_id) {\n return operation.target_resource_id;\n }\n const result = operation.result ?? {};\n const directId = result['container_id'];\n if (typeof directId === 'string') return directId;\n const results = result['results'];\n if (Array.isArray(results) && results.length > 0) {\n const first = results[0];\n if (first && typeof first === 'object' && typeof (first as Record<string, unknown>).container_id === 'string') {\n return (first as Record<string, string>).container_id;\n }\n }\n return null;\n}\n\nasync function createPublishedService(\n handle: QuiltSandboxHandle,\n port: number,\n protocol?: string\n): Promise<QuiltService> {\n const wantsWebSocket = protocol === 'ws' || protocol === 'wss';\n const existing = await requestJson<{ services: QuiltService[] }>(\n handle.config,\n `/api/containers/${encodeURIComponent(handle.sandboxId)}/services`\n );\n\n const match = existing?.services?.find(service => {\n if (service.target_port !== port) return false;\n if (wantsWebSocket && !service.enable_websockets) return false;\n return true;\n });\n\n if (match) return match;\n\n const created = await requestJson<QuiltService>(\n handle.config,\n `/api/containers/${encodeURIComponent(handle.sandboxId)}/services`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n name: `computesdk-${port}`,\n target_port: port,\n protocol: 'http',\n enable_websockets: wantsWebSocket,\n auth_mode: handle.config.publishedServiceAuthMode,\n ...(handle.config.publishedServiceTtlSecs\n ? { ttl_secs: handle.config.publishedServiceTtlSecs }\n : {}),\n }),\n }\n );\n\n if (!created) {\n throw new Error(`Failed to create Quilt published service for port ${port}.`);\n }\n\n return created;\n}\n\nexport const quilt = defineProvider<QuiltSandboxHandle, QuiltConfig, never, Snapshot>({\n name: PROVIDER,\n methods: {\n sandbox: {\n create: async (config: QuiltConfig, options?: CreateSandboxOptions) => {\n const resolved = resolveConfig(config);\n const {\n timeout: requestedTimeout,\n envs,\n metadata,\n templateId,\n snapshotId,\n name,\n namespace: _namespace,\n sandboxId: _sandboxId,\n directory,\n signal: _signal,\n ...providerOptions\n } = options || {};\n\n if (snapshotId) {\n const unsupportedKeys = ['envs', 'templateId', 'directory'];\n if (envs || templateId || directory) {\n throw new Error(\n `Quilt snapshot clone does not support ${unsupportedKeys.join(', ')} create options in one request.`\n );\n }\n\n const cloneEnvelope = await requestJson<{ operation_id: string }>(\n resolved,\n `/api/snapshots/${encodeURIComponent(snapshotId)}/clone`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n resume_policy: 'immediate',\n ...(name ? { name } : {}),\n ...(metadata ? { labels: stringifyRecord(metadata) } : {}),\n }),\n },\n { includeTenantHeader: true }\n );\n\n const operation = await pollOperation(\n resolved,\n requireOperationId(cloneEnvelope, 'snapshot clone'),\n requestedTimeout ?? resolved.timeout\n );\n const containerId = resolveContainerResultId(operation);\n if (!containerId) {\n throw new Error(`Quilt snapshot clone completed without a container ID.`);\n }\n const container = await getContainerById(resolved, containerId);\n if (!container) {\n throw new Error(`Quilt cloned container ${containerId} was not found after creation.`);\n }\n return {\n sandbox: {\n config: resolved,\n sandboxId: containerId,\n container,\n },\n sandboxId: containerId,\n };\n }\n\n const createBody = {\n name: name ?? `computesdk-${crypto.randomUUID().slice(0, 8)}`,\n image:\n typeof providerOptions.image === 'string'\n ? providerOptions.image\n : typeof templateId === 'string'\n ? templateId\n : resolved.image,\n ...(envs && Object.keys(envs).length > 0 ? { environment: envs } : {}),\n ...(metadata ? { labels: stringifyRecord(metadata) } : {}),\n ...(directory ? { working_directory: directory } : {}),\n ...providerOptions,\n };\n\n const container = await requestJson<QuiltContainer>(resolved, '/api/containers', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(createBody),\n });\n\n if (!container?.container_id) {\n throw new Error('Quilt container create did not return a container_id.');\n }\n\n return {\n sandbox: {\n config: resolved,\n sandboxId: container.container_id,\n container,\n },\n sandboxId: container.container_id,\n };\n },\n\n getById: async (config: QuiltConfig, sandboxId: string) => {\n const resolved = resolveConfig(config);\n const container = await getContainerById(resolved, sandboxId);\n if (!container) return null;\n return {\n sandbox: {\n config: resolved,\n sandboxId,\n container,\n },\n sandboxId,\n };\n },\n\n list: async (config: QuiltConfig) => {\n const resolved = resolveConfig(config);\n const sandboxes: Array<{ sandbox: QuiltSandboxHandle; sandboxId: string }> = [];\n let cursor: string | null | undefined = undefined;\n\n while (true) {\n const query = new URLSearchParams();\n if (cursor) query.set('cursor', cursor);\n const response = await requestJson<{\n containers: QuiltContainer[];\n pagination?: { has_next?: boolean; next_cursor?: string | null };\n }>(resolved, `/api/containers${query.toString() ? `?${query.toString()}` : ''}`);\n\n for (const container of response?.containers ?? []) {\n if (!container.container_id) continue;\n sandboxes.push({\n sandbox: {\n config: resolved,\n sandboxId: container.container_id,\n container,\n },\n sandboxId: container.container_id,\n });\n }\n\n if (!response?.pagination?.has_next || !response.pagination.next_cursor) {\n break;\n }\n\n cursor = response.pagination.next_cursor;\n }\n\n return sandboxes;\n },\n\n destroy: async (config: QuiltConfig, sandboxId: string) => {\n const resolved = resolveConfig(config);\n await requestNoContent(\n resolved,\n `/api/containers/${encodeURIComponent(sandboxId)}`,\n { method: 'DELETE' },\n { allow404: true }\n );\n },\n\n runCommand: async (\n handle: QuiltSandboxHandle,\n command: string,\n options?: RunCommandOptions\n ): Promise<CommandResult> => {\n const startTime = Date.now();\n const fullCommand = buildExecCommand(command, options);\n\n const response = await requestJson<{\n stdout?: string;\n stderr?: string;\n exit_code?: number;\n timed_out?: boolean;\n }>(handle.config, `/api/containers/${encodeURIComponent(handle.sandboxId)}/exec`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n command: ['/bin/sh', '-lc', fullCommand],\n ...(options?.cwd ? { workdir: options.cwd } : {}),\n ...(options?.timeout ? { timeout_ms: options.timeout } : {}),\n }),\n });\n\n const stdout = response?.stdout ?? '';\n const stderr = response?.stderr ?? '';\n if (options?.onStdout && stdout) options.onStdout(stdout);\n if (options?.onStderr && stderr) options.onStderr(stderr);\n\n return {\n stdout,\n stderr,\n exitCode: response?.timed_out ? 124 : response?.exit_code ?? 0,\n durationMs: Date.now() - startTime,\n };\n },\n\n getInfo: async (handle: QuiltSandboxHandle): Promise<SandboxInfo> => {\n const container =\n (await getContainerById(handle.config, handle.sandboxId)) ?? handle.container;\n\n return {\n id: handle.sandboxId,\n provider: PROVIDER,\n status: mapStatus(container.state),\n createdAt: parseDate(container.created_at),\n timeout: handle.config.timeout,\n metadata: {\n name: container.name,\n tenantId: container.tenant_id,\n ipAddress: container.ip_address,\n execReady: container.exec_ready,\n networkReady: container.network_ready,\n state: container.state,\n },\n };\n },\n\n getUrl: async (\n handle: QuiltSandboxHandle,\n options: { port: number; protocol?: string }\n ): Promise<string> => {\n const service = await createPublishedService(handle, options.port, options.protocol);\n if (options.protocol === 'ws' || options.protocol === 'wss') {\n const url = service.websocket_url;\n if (!url) {\n throw new Error(`Quilt service ${service.service_id} does not expose a websocket URL.`);\n }\n if (options.protocol === 'ws') {\n const parsed = new URL(url);\n parsed.protocol = 'ws:';\n return parsed.toString();\n }\n return url;\n }\n\n const url = service.public_url;\n if (!url) {\n throw new Error(`Quilt service ${service.service_id} did not return a public URL.`);\n }\n\n if (options.protocol === 'http') {\n const parsed = new URL(url);\n parsed.protocol = 'http:';\n return parsed.toString();\n }\n\n return url;\n },\n\n filesystem: {\n readFile: async (\n handle: QuiltSandboxHandle,\n path: string,\n runCommand: QuiltCommandRunner\n ): Promise<string> => {\n const result = await runCommand(\n handle,\n `test -f \"${escapeShellArg(path)}\" && base64 < \"${escapeShellArg(path)}\" | tr -d '\\\\n'`\n );\n if (result.exitCode !== 0) {\n throw new Error(`File not found or unreadable: ${path}`);\n }\n return Buffer.from(result.stdout, 'base64').toString('utf8');\n },\n\n writeFile: async (\n handle: QuiltSandboxHandle,\n path: string,\n content: string,\n runCommand: QuiltCommandRunner\n ): Promise<void> => {\n const parentDir = path.includes('/') ? path.slice(0, path.lastIndexOf('/')) || '/' : '.';\n const encoded = Buffer.from(content).toString('base64');\n const result = await runCommand(\n handle,\n `mkdir -p \"${escapeShellArg(parentDir)}\" && echo \"${encoded}\" | base64 -d > \"${escapeShellArg(path)}\"`\n );\n if (result.exitCode !== 0) {\n throw new Error(`Failed to write file ${path}: ${result.stderr}`);\n }\n },\n\n mkdir: async (\n handle: QuiltSandboxHandle,\n path: string,\n runCommand: QuiltCommandRunner\n ): Promise<void> => {\n const result = await runCommand(handle, `mkdir -p \"${escapeShellArg(path)}\"`);\n if (result.exitCode !== 0) {\n throw new Error(`Failed to create directory ${path}: ${result.stderr}`);\n }\n },\n\n readdir: async (\n handle: QuiltSandboxHandle,\n path: string,\n runCommand: QuiltCommandRunner\n ): Promise<FileEntry[]> => {\n const result = await runCommand(handle, `ls -la \"${escapeShellArg(path)}\"`);\n if (result.exitCode !== 0) {\n throw new Error(`Failed to list directory ${path}: ${result.stderr}`);\n }\n return normalizeFileEntries(result.stdout);\n },\n\n exists: async (\n handle: QuiltSandboxHandle,\n path: string,\n runCommand: QuiltCommandRunner\n ): Promise<boolean> => {\n const result = await runCommand(handle, `test -e \"${escapeShellArg(path)}\"`);\n return result.exitCode === 0;\n },\n\n remove: async (\n handle: QuiltSandboxHandle,\n path: string,\n runCommand: QuiltCommandRunner\n ): Promise<void> => {\n const result = await runCommand(handle, `rm -rf \"${escapeShellArg(path)}\"`);\n if (result.exitCode !== 0) {\n throw new Error(`Failed to remove ${path}: ${result.stderr}`);\n }\n },\n },\n\n getInstance: (handle: QuiltSandboxHandle): QuiltSandboxHandle => handle,\n },\n\n snapshot: {\n create: async (\n config: QuiltConfig,\n sandboxId: string,\n options?: CreateSnapshotOptions\n ): Promise<Snapshot> => {\n const resolved = resolveConfig(config);\n const envelope = await requestJson<{ operation_id: string }>(\n resolved,\n `/api/containers/${encodeURIComponent(sandboxId)}/snapshot`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n consistency_mode: 'crash-consistent',\n network_mode: 'reset',\n volume_mode: 'exclude',\n labels: {\n ...(options?.metadata ? stringifyRecord(options.metadata) : {}),\n ...(options?.name ? { 'computesdk:name': options.name } : {}),\n },\n }),\n },\n { includeTenantHeader: true }\n );\n\n const operation = await pollOperation(\n resolved,\n requireOperationId(envelope, 'snapshot create'),\n resolved.timeout\n );\n const snapshotId = resolveSnapshotResultId(operation);\n if (!snapshotId) {\n throw new Error(`Quilt snapshot create completed without a snapshot ID.`);\n }\n const snapshot = await requestJson<QuiltSnapshotRecord>(\n resolved,\n `/api/snapshots/${encodeURIComponent(snapshotId)}`,\n undefined,\n { includeTenantHeader: true }\n );\n\n if (!snapshot) {\n throw new Error(`Quilt snapshot ${snapshotId} was not found after creation.`);\n }\n\n return mapSnapshot(snapshot);\n },\n\n list: async (config: QuiltConfig, options?: ListSnapshotsOptions): Promise<Snapshot[]> => {\n const resolved = resolveConfig(config);\n const query = new URLSearchParams();\n if (options?.sandboxId) {\n query.set('container_id', options.sandboxId);\n }\n const response = await requestJson<{ snapshots: QuiltSnapshotRecord[] }>(\n resolved,\n `/api/snapshots${query.toString() ? `?${query.toString()}` : ''}`,\n undefined,\n { includeTenantHeader: true }\n );\n return (response?.snapshots ?? []).map(mapSnapshot);\n },\n\n delete: async (config: QuiltConfig, snapshotId: string): Promise<void> => {\n const resolved = resolveConfig(config);\n await requestNoContent(\n resolved,\n `/api/snapshots/${encodeURIComponent(snapshotId)}`,\n { method: 'DELETE' },\n { includeTenantHeader: true, allow404: true }\n );\n },\n },\n },\n});\n\nfunction stringifyRecord(input: Record<string, unknown>): Record<string, string> {\n return Object.fromEntries(\n Object.entries(input).map(([key, value]) => [key, typeof value === 'string' ? value : JSON.stringify(value)])\n );\n}\n\nfunction mapSnapshot(snapshot: QuiltSnapshotRecord): Snapshot {\n return {\n id: snapshot.snapshot_id,\n provider: PROVIDER,\n createdAt: parseDate(snapshot.created_at),\n metadata: {\n sourceContainerId: snapshot.source_container_id,\n pinned: snapshot.pinned ?? false,\n labels: snapshot.labels ?? {},\n expiresAt: snapshot.expires_at ?? null,\n },\n };\n}\n"],"mappings":"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","names":["container","url"]}