@computesdk/quilt 1.0.9 → 1.0.11

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.
package/dist/index.js CHANGED
@@ -289,7 +289,7 @@ async function createPublishedService(handle, port, protocol) {
289
289
  var quilt = (0, import_provider.defineProvider)({
290
290
  name: PROVIDER,
291
291
  methods: {
292
- sandbox: {
292
+ instances: {
293
293
  create: async (config, options) => {
294
294
  const resolved = resolveConfig(config);
295
295
  const {
@@ -342,12 +342,12 @@ var quilt = (0, import_provider.defineProvider)({
342
342
  throw new Error(`Quilt cloned container ${containerId} was not found after creation.`);
343
343
  }
344
344
  return {
345
- sandbox: {
345
+ instance: {
346
346
  config: resolved,
347
347
  sandboxId: containerId,
348
348
  container: container2
349
349
  },
350
- sandboxId: containerId
350
+ instanceId: containerId
351
351
  };
352
352
  }
353
353
  const createBody = {
@@ -369,12 +369,12 @@ var quilt = (0, import_provider.defineProvider)({
369
369
  throw new Error("Quilt container create did not return a container_id.");
370
370
  }
371
371
  return {
372
- sandbox: {
372
+ instance: {
373
373
  config: resolved,
374
374
  sandboxId: container.container_id,
375
375
  container
376
376
  },
377
- sandboxId: container.container_id
377
+ instanceId: container.container_id
378
378
  };
379
379
  },
380
380
  getById: async (config, sandboxId) => {
@@ -382,12 +382,12 @@ var quilt = (0, import_provider.defineProvider)({
382
382
  const container = await getContainerById(resolved, sandboxId);
383
383
  if (!container) return null;
384
384
  return {
385
- sandbox: {
385
+ instance: {
386
386
  config: resolved,
387
387
  sandboxId,
388
388
  container
389
389
  },
390
- sandboxId
390
+ instanceId: sandboxId
391
391
  };
392
392
  },
393
393
  list: async (config) => {
@@ -401,12 +401,12 @@ var quilt = (0, import_provider.defineProvider)({
401
401
  for (const container of response?.containers ?? []) {
402
402
  if (!container.container_id) continue;
403
403
  sandboxes.push({
404
- sandbox: {
404
+ instance: {
405
405
  config: resolved,
406
406
  sandboxId: container.container_id,
407
407
  container
408
408
  },
409
- sandboxId: container.container_id
409
+ instanceId: container.container_id
410
410
  });
411
411
  }
412
412
  if (!response?.pagination?.has_next || !response.pagination.next_cursor) {
package/dist/index.js.map CHANGED
@@ -1 +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"]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { defineProvider, escapeShellArg } from '@computesdk/provider';\n\nimport type {\n CommandResult,\n CreateInstanceOptions,\n CreateSnapshotOptions,\n FileEntry,\n ListSnapshotsOptions,\n RunCommandOptions,\n InstanceInfo,\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): InstanceInfo['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 instances: {\n create: async (config: QuiltConfig, options?: CreateInstanceOptions) => {\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 { instance: {\n config: resolved,\n sandboxId: containerId,\n container,\n }, instanceId: 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 { instance: {\n config: resolved,\n sandboxId: container.container_id,\n container,\n }, instanceId: 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 { instance: {\n config: resolved,\n sandboxId,\n container,\n },\n instanceId: sandboxId,\n };\n },\n\n list: async (config: QuiltConfig) => {\n const resolved = resolveConfig(config);\n const sandboxes: Array<{ instance: QuiltSandboxHandle; instanceId: 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 instance: {\n config: resolved, sandboxId: container.container_id,\n container,\n },\n instanceId: 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<InstanceInfo> => {\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"]}
package/dist/index.mjs CHANGED
@@ -265,7 +265,7 @@ async function createPublishedService(handle, port, protocol) {
265
265
  var quilt = defineProvider({
266
266
  name: PROVIDER,
267
267
  methods: {
268
- sandbox: {
268
+ instances: {
269
269
  create: async (config, options) => {
270
270
  const resolved = resolveConfig(config);
271
271
  const {
@@ -318,12 +318,12 @@ var quilt = defineProvider({
318
318
  throw new Error(`Quilt cloned container ${containerId} was not found after creation.`);
319
319
  }
320
320
  return {
321
- sandbox: {
321
+ instance: {
322
322
  config: resolved,
323
323
  sandboxId: containerId,
324
324
  container: container2
325
325
  },
326
- sandboxId: containerId
326
+ instanceId: containerId
327
327
  };
328
328
  }
329
329
  const createBody = {
@@ -345,12 +345,12 @@ var quilt = defineProvider({
345
345
  throw new Error("Quilt container create did not return a container_id.");
346
346
  }
347
347
  return {
348
- sandbox: {
348
+ instance: {
349
349
  config: resolved,
350
350
  sandboxId: container.container_id,
351
351
  container
352
352
  },
353
- sandboxId: container.container_id
353
+ instanceId: container.container_id
354
354
  };
355
355
  },
356
356
  getById: async (config, sandboxId) => {
@@ -358,12 +358,12 @@ var quilt = defineProvider({
358
358
  const container = await getContainerById(resolved, sandboxId);
359
359
  if (!container) return null;
360
360
  return {
361
- sandbox: {
361
+ instance: {
362
362
  config: resolved,
363
363
  sandboxId,
364
364
  container
365
365
  },
366
- sandboxId
366
+ instanceId: sandboxId
367
367
  };
368
368
  },
369
369
  list: async (config) => {
@@ -377,12 +377,12 @@ var quilt = defineProvider({
377
377
  for (const container of response?.containers ?? []) {
378
378
  if (!container.container_id) continue;
379
379
  sandboxes.push({
380
- sandbox: {
380
+ instance: {
381
381
  config: resolved,
382
382
  sandboxId: container.container_id,
383
383
  container
384
384
  },
385
- sandboxId: container.container_id
385
+ instanceId: container.container_id
386
386
  });
387
387
  }
388
388
  if (!response?.pagination?.has_next || !response.pagination.next_cursor) {
@@ -1 +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":";AAAA,SAAS,gBAAgB,sBAAsB;AAa/C,IAAM,WAAW;AACjB,IAAM,gBAAgB;AACtB,IAAM,qBAAqB;AAC3B,IAAM,2BAA2B;AA0FjC,SAAS,OAAO,MAAkC;AAChD,SAAO,OAAO,YAAY,cAAc,QAAQ,MAAM,IAAI,IAAI;AAChE;AAEA,SAAS,cAAc,QAA0C;AAC/D,QAAM,UAAU,OAAO,WAAW,OAAO,gBAAgB,KAAK,OAAO,oBAAoB;AACzF,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI;AAAA,MACR;AAAA,IAGF;AAAA,EACF;AAEA,QAAM,SAAS,OAAO,UAAU,OAAO,eAAe;AACtD,QAAM,cAAc,OAAO,eAAe,OAAO,oBAAoB;AAErE,MAAI,CAAC,UAAU,CAAC,aAAa;AAC3B,UAAM,IAAI;AAAA,MACR;AAAA,IAIF;AAAA,EACF;AAEA,QAAM,WAAW,OAAO,YAAY,OAAO,iBAAiB;AAC5D,QAAM,iBAAiB,OAAO,kBAAkB;AAChD,QAAM,cAAc,OAAO,wBAAwB;AACnD,QAAM,aAAa,OAAO,kCAAkC;AAC5D,QAAM,kBAAkB,OAAO,mCAAmC;AAElE,SAAO;AAAA,IACL,SAAS,QAAQ,QAAQ,QAAQ,EAAE;AAAA,IACnC,UAAU,SAAS,WAAW;AAAA,IAC9B,WAAW,UAAU,eAAe;AAAA,IACpC;AAAA,IACA,OAAO,OAAO,SAAS,OAAO,aAAa,KAAK;AAAA,IAChD,SAAS,OAAO,WAAW,iBAAiB,cAAc,KAAK;AAAA,IAC/D,0BACE,OAAO,6BACN,oBAAoB,WAAW,WAAW;AAAA,IAC7C,yBACE,OAAO,2BAA2B,iBAAiB,UAAU,KAAK;AAAA,IACpE,gBAAgB,OAAO,kBAAkB,iBAAiB,WAAW,KAAK;AAAA,EAC5E;AACF;AAEA,SAAS,iBAAiB,OAA+C;AACvE,MAAI,CAAC,MAAO,QAAO;AACnB,QAAM,SAAS,OAAO,SAAS,OAAO,EAAE;AACxC,SAAO,OAAO,SAAS,MAAM,IAAI,SAAS;AAC5C;AAEA,SAAS,aAAa,QAA6B,sBAAsB,OAAoB;AAC3F,QAAM,UAAkC;AAAA,IACtC,QAAQ;AAAA,EACV;AAEA,MAAI,OAAO,aAAa,UAAU;AAChC,YAAQ,WAAW,IAAI,OAAO;AAAA,EAChC,OAAO;AACL,YAAQ,gBAAgB,UAAU,OAAO,SAAS;AAAA,EACpD;AAEA,MAAI,qBAAqB;AACvB,QAAI,CAAC,OAAO,UAAU;AACpB,YAAM,IAAI;AAAA,QACR;AAAA,MAGF;AAAA,IACF;AACA,YAAQ,aAAa,IAAI,OAAO;AAAA,EAClC;AAEA,SAAO;AACT;AAEA,eAAe,YACb,QACA,MACA,OAAoB,CAAC,GACrB,UAAiE,CAAC,GAC/C;AACnB,QAAM,UAAU;AAAA,IACd,GAAG,aAAa,QAAQ,QAAQ,mBAAmB;AAAA,IACnD,GAAI,KAAK,WAAW,CAAC;AAAA,EACvB;AAEA,QAAM,WAAW,MAAM,MAAM,GAAG,OAAO,OAAO,GAAG,IAAI,IAAI;AAAA,IACvD,GAAG;AAAA,IACH;AAAA,EACF,CAAC;AAED,MAAI,QAAQ,YAAY,SAAS,WAAW,KAAK;AAC/C,WAAO;AAAA,EACT;AAEA,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,MAAM,eAAe,UAAU,IAAI;AAAA,EAC3C;AAEA,MAAI,SAAS,WAAW,KAAK;AAC3B,WAAO;AAAA,EACT;AAEA,SAAQ,MAAM,SAAS,KAAK;AAC9B;AAEA,eAAe,iBACb,QACA,MACA,OAAoB,CAAC,GACrB,UAAiE,CAAC,GACnD;AACf,QAAM,UAAU;AAAA,IACd,GAAG,aAAa,QAAQ,QAAQ,mBAAmB;AAAA,IACnD,GAAI,KAAK,WAAW,CAAC;AAAA,EACvB;AAEA,QAAM,WAAW,MAAM,MAAM,GAAG,OAAO,OAAO,GAAG,IAAI,IAAI;AAAA,IACvD,GAAG;AAAA,IACH;AAAA,EACF,CAAC;AAED,MAAI,QAAQ,YAAY,SAAS,WAAW,KAAK;AAC/C;AAAA,EACF;AAEA,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,MAAM,eAAe,UAAU,IAAI;AAAA,EAC3C;AACF;AAEA,eAAe,eAAe,UAAoB,MAA8B;AAC9E,MAAI,SAAS,GAAG,SAAS,MAAM,IAAI,SAAS,UAAU;AACtD,MAAI;AACF,UAAM,OAAO,MAAM,SAAS,KAAK;AACjC,QAAI,QAAQ,OAAO,SAAS,UAAU;AACpC,YAAM,SAAS;AACf,eACG,OAAO,OAAO,UAAU,YAAY,OAAO,SAC3C,OAAO,OAAO,YAAY,YAAY,OAAO,WAC9C;AAAA,IACJ;AAAA,EACF,QAAQ;AACN,QAAI;AACF,YAAM,OAAO,MAAM,SAAS,KAAK;AACjC,UAAI,KAAM,UAAS;AAAA,IACrB,QAAQ;AAAA,IAER;AAAA,EACF;AACA,SAAO,IAAI,MAAM,gCAAgC,IAAI,KAAK,MAAM,EAAE;AACpE;AAEA,SAAS,iBAAiB,SAAiB,SAAqC;AAC9E,MAAI,cAAc;AAElB,MAAI,SAAS,OAAO,OAAO,KAAK,QAAQ,GAAG,EAAE,SAAS,GAAG;AACvD,UAAM,YAAY,OAAO,QAAQ,QAAQ,GAAG,EACzC,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM;AACrB,UAAI,CAAC,2BAA2B,KAAK,GAAG,GAAG;AACzC,cAAM,IAAI,MAAM,sCAAsC,GAAG,IAAI;AAAA,MAC/D;AACA,aAAO,GAAG,GAAG,KAAK,eAAe,OAAO,KAAK,CAAC,CAAC;AAAA,IACjD,CAAC,EACA,KAAK,GAAG;AACX,kBAAc,GAAG,SAAS,IAAI,WAAW;AAAA,EAC3C;AAEA,MAAI,SAAS,YAAY;AACvB,kBAAc,SAAS,WAAW;AAAA,EACpC;AAEA,SAAO;AACT;AAEA,SAAS,UAAU,OAA+D;AAChF,UAAQ,OAAO;AAAA,IACb,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL;AACE,aAAO;AAAA,EACX;AACF;AAEA,SAAS,UAAU,OAAiD;AAClE,MAAI,OAAO,UAAU,SAAU,QAAO,IAAI,KAAK,QAAQ,GAAI;AAC3D,MAAI,OAAO,UAAU,SAAU,QAAO,IAAI,KAAK,KAAK;AACpD,SAAO,oBAAI,KAAK;AAClB;AAEA,SAAS,qBAAqB,QAA6B;AACzD,SAAO,OACJ,MAAM,IAAI,EACV,IAAI,UAAQ,KAAK,KAAK,CAAC,EACvB,OAAO,UAAQ,QAAQ,CAAC,KAAK,WAAW,QAAQ,CAAC,EACjD,QAAQ,UAAQ;AACf,UAAM,QAAQ,KAAK,MAAM,KAAK;AAC9B,QAAI,MAAM,SAAS,EAAG,QAAO,CAAC;AAC9B,UAAM,OAAO,MAAM,MAAM,CAAC,EAAE,KAAK,GAAG;AACpC,QAAI,SAAS,OAAO,SAAS,KAAM,QAAO,CAAC;AAC3C,WAAO;AAAA,MACL;AAAA,QACE;AAAA,QACA,MAAM,MAAM,CAAC,GAAG,WAAW,GAAG,IAAI,cAAc;AAAA,QAChD,MAAM,OAAO,SAAS,MAAM,CAAC,KAAK,KAAK,EAAE,KAAK;AAAA,QAC9C,UAAU,oBAAI,KAAK;AAAA,MACrB;AAAA,IACF;AAAA,EACF,CAAC;AACL;AAEA,eAAe,cACb,QACA,aACA,WAC+B;AAC/B,QAAM,WAAW,KAAK,IAAI,IAAI;AAE9B,SAAO,KAAK,IAAI,KAAK,UAAU;AAC7B,UAAM,YAAY,MAAM;AAAA,MACtB;AAAA,MACA,mBAAmB,mBAAmB,WAAW,CAAC;AAAA,IACpD;AAEA,QAAI,CAAC,WAAW;AACd,YAAM,IAAI,MAAM,mBAAmB,WAAW,6BAA6B;AAAA,IAC7E;AAEA,UAAM,SAAS,UAAU,UAAU;AACnC,QAAI,WAAW,YAAa,QAAO;AACnC,QAAI,WAAW,YAAY,WAAW,WAAW,WAAW,aAAa;AACvE,YAAM,IAAI;AAAA,QACR,mBAAmB,WAAW,YAAY,UAAU,iBAAiB,UAAU,SAAS,UAAU,WAAW,MAAM;AAAA,MACrH;AAAA,IACF;AAEA,UAAM,IAAI,QAAQ,aAAW,WAAW,SAAS,OAAO,cAAc,CAAC;AAAA,EACzE;AAEA,QAAM,IAAI,MAAM,yCAAyC,WAAW,GAAG;AACzE;AAEA,SAAS,mBACP,UACA,SACQ;AACR,QAAM,cAAc,UAAU;AAC9B,MAAI,CAAC,aAAa;AAChB,UAAM,IAAI,MAAM,SAAS,OAAO,kCAAkC;AAAA,EACpE;AACA,SAAO;AACT;AAEA,eAAe,iBACb,QACA,WACgC;AAChC,SAAO;AAAA,IACL;AAAA,IACA,mBAAmB,mBAAmB,SAAS,CAAC;AAAA,IAChD;AAAA,IACA,EAAE,UAAU,KAAK;AAAA,EACnB;AACF;AAEA,SAAS,wBAAwB,WAAgD;AAC/E,MAAI,UAAU,YAAa,QAAO,UAAU;AAC5C,MAAI,UAAU,yBAAyB,cAAc,UAAU,oBAAoB;AACjF,WAAO,UAAU;AAAA,EACnB;AACA,QAAM,SAAS,UAAU,UAAU,CAAC;AACpC,QAAM,aAAa,OAAO,aAAa;AACvC,SAAO,OAAO,eAAe,WAAW,aAAa;AACvD;AAEA,SAAS,yBAAyB,WAAgD;AAChF,MAAI,UAAU,aAAc,QAAO,UAAU;AAC7C,MAAI,UAAU,yBAAyB,eAAe,UAAU,oBAAoB;AAClF,WAAO,UAAU;AAAA,EACnB;AACA,QAAM,SAAS,UAAU,UAAU,CAAC;AACpC,QAAM,WAAW,OAAO,cAAc;AACtC,MAAI,OAAO,aAAa,SAAU,QAAO;AACzC,QAAM,UAAU,OAAO,SAAS;AAChC,MAAI,MAAM,QAAQ,OAAO,KAAK,QAAQ,SAAS,GAAG;AAChD,UAAM,QAAQ,QAAQ,CAAC;AACvB,QAAI,SAAS,OAAO,UAAU,YAAY,OAAQ,MAAkC,iBAAiB,UAAU;AAC7G,aAAQ,MAAiC;AAAA,IAC3C;AAAA,EACF;AACA,SAAO;AACT;AAEA,eAAe,uBACb,QACA,MACA,UACuB;AACvB,QAAM,iBAAiB,aAAa,QAAQ,aAAa;AACzD,QAAM,WAAW,MAAM;AAAA,IACrB,OAAO;AAAA,IACP,mBAAmB,mBAAmB,OAAO,SAAS,CAAC;AAAA,EACzD;AAEA,QAAM,QAAQ,UAAU,UAAU,KAAK,aAAW;AAChD,QAAI,QAAQ,gBAAgB,KAAM,QAAO;AACzC,QAAI,kBAAkB,CAAC,QAAQ,kBAAmB,QAAO;AACzD,WAAO;AAAA,EACT,CAAC;AAED,MAAI,MAAO,QAAO;AAElB,QAAM,UAAU,MAAM;AAAA,IACpB,OAAO;AAAA,IACP,mBAAmB,mBAAmB,OAAO,SAAS,CAAC;AAAA,IACvD;AAAA,MACE,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,gBAAgB;AAAA,MAClB;AAAA,MACA,MAAM,KAAK,UAAU;AAAA,QACnB,MAAM,cAAc,IAAI;AAAA,QACxB,aAAa;AAAA,QACb,UAAU;AAAA,QACV,mBAAmB;AAAA,QACnB,WAAW,OAAO,OAAO;AAAA,QACzB,GAAI,OAAO,OAAO,0BACd,EAAE,UAAU,OAAO,OAAO,wBAAwB,IAClD,CAAC;AAAA,MACP,CAAC;AAAA,IACH;AAAA,EACF;AAEA,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,qDAAqD,IAAI,GAAG;AAAA,EAC9E;AAEA,SAAO;AACT;AAEO,IAAM,QAAQ,eAAiE;AAAA,EACpF,MAAM;AAAA,EACN,SAAS;AAAA,IACP,SAAS;AAAA,MACP,QAAQ,OAAO,QAAqB,YAAmC;AACrE,cAAM,WAAW,cAAc,MAAM;AACrC,cAAM;AAAA,UACJ,SAAS;AAAA,UACT;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,WAAW;AAAA,UACX,WAAW;AAAA,UACX;AAAA,UACA,QAAQ;AAAA,UACR,GAAG;AAAA,QACL,IAAI,WAAW,CAAC;AAEhB,YAAI,YAAY;AACd,gBAAM,kBAAkB,CAAC,QAAQ,cAAc,WAAW;AAC1D,cAAI,QAAQ,cAAc,WAAW;AACnC,kBAAM,IAAI;AAAA,cACR,yCAAyC,gBAAgB,KAAK,IAAI,CAAC;AAAA,YACrE;AAAA,UACF;AAEA,gBAAM,gBAAgB,MAAM;AAAA,YAC1B;AAAA,YACA,kBAAkB,mBAAmB,UAAU,CAAC;AAAA,YAChD;AAAA,cACE,QAAQ;AAAA,cACR,SAAS;AAAA,gBACP,gBAAgB;AAAA,cAClB;AAAA,cACA,MAAM,KAAK,UAAU;AAAA,gBACnB,eAAe;AAAA,gBACf,GAAI,OAAO,EAAE,KAAK,IAAI,CAAC;AAAA,gBACvB,GAAI,WAAW,EAAE,QAAQ,gBAAgB,QAAQ,EAAE,IAAI,CAAC;AAAA,cAC1D,CAAC;AAAA,YACH;AAAA,YACA,EAAE,qBAAqB,KAAK;AAAA,UAC9B;AAEA,gBAAM,YAAY,MAAM;AAAA,YACtB;AAAA,YACA,mBAAmB,eAAe,gBAAgB;AAAA,YAClD,oBAAoB,SAAS;AAAA,UAC/B;AACA,gBAAM,cAAc,yBAAyB,SAAS;AACtD,cAAI,CAAC,aAAa;AAChB,kBAAM,IAAI,MAAM,wDAAwD;AAAA,UAC1E;AACA,gBAAMA,aAAY,MAAM,iBAAiB,UAAU,WAAW;AAC9D,cAAI,CAACA,YAAW;AACd,kBAAM,IAAI,MAAM,0BAA0B,WAAW,gCAAgC;AAAA,UACvF;AACA,iBAAO;AAAA,YACL,SAAS;AAAA,cACP,QAAQ;AAAA,cACR,WAAW;AAAA,cACX,WAAAA;AAAA,YACF;AAAA,YACA,WAAW;AAAA,UACb;AAAA,QACF;AAEA,cAAM,aAAa;AAAA,UACjB,MAAM,QAAQ,cAAc,OAAO,WAAW,EAAE,MAAM,GAAG,CAAC,CAAC;AAAA,UAC3D,OACE,OAAO,gBAAgB,UAAU,WAC7B,gBAAgB,QAChB,OAAO,eAAe,WACpB,aACA,SAAS;AAAA,UACjB,GAAI,QAAQ,OAAO,KAAK,IAAI,EAAE,SAAS,IAAI,EAAE,aAAa,KAAK,IAAI,CAAC;AAAA,UACpE,GAAI,WAAW,EAAE,QAAQ,gBAAgB,QAAQ,EAAE,IAAI,CAAC;AAAA,UACxD,GAAI,YAAY,EAAE,mBAAmB,UAAU,IAAI,CAAC;AAAA,UACpD,GAAG;AAAA,QACL;AAEA,cAAM,YAAY,MAAM,YAA4B,UAAU,mBAAmB;AAAA,UAC/E,QAAQ;AAAA,UACR,SAAS;AAAA,YACP,gBAAgB;AAAA,UAClB;AAAA,UACA,MAAM,KAAK,UAAU,UAAU;AAAA,QACjC,CAAC;AAED,YAAI,CAAC,WAAW,cAAc;AAC5B,gBAAM,IAAI,MAAM,uDAAuD;AAAA,QACzE;AAEA,eAAO;AAAA,UACL,SAAS;AAAA,YACP,QAAQ;AAAA,YACR,WAAW,UAAU;AAAA,YACrB;AAAA,UACF;AAAA,UACA,WAAW,UAAU;AAAA,QACvB;AAAA,MACF;AAAA,MAEA,SAAS,OAAO,QAAqB,cAAsB;AACzD,cAAM,WAAW,cAAc,MAAM;AACrC,cAAM,YAAY,MAAM,iBAAiB,UAAU,SAAS;AAC5D,YAAI,CAAC,UAAW,QAAO;AACvB,eAAO;AAAA,UACL,SAAS;AAAA,YACP,QAAQ;AAAA,YACR;AAAA,YACA;AAAA,UACF;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,MAEA,MAAM,OAAO,WAAwB;AACnC,cAAM,WAAW,cAAc,MAAM;AACrC,cAAM,YAAuE,CAAC;AAC9E,YAAI,SAAoC;AAExC,eAAO,MAAM;AACX,gBAAM,QAAQ,IAAI,gBAAgB;AAClC,cAAI,OAAQ,OAAM,IAAI,UAAU,MAAM;AACtC,gBAAM,WAAW,MAAM,YAGpB,UAAU,kBAAkB,MAAM,SAAS,IAAI,IAAI,MAAM,SAAS,CAAC,KAAK,EAAE,EAAE;AAE/E,qBAAW,aAAa,UAAU,cAAc,CAAC,GAAG;AAClD,gBAAI,CAAC,UAAU,aAAc;AAC7B,sBAAU,KAAK;AAAA,cACb,SAAS;AAAA,gBACP,QAAQ;AAAA,gBACR,WAAW,UAAU;AAAA,gBACrB;AAAA,cACF;AAAA,cACA,WAAW,UAAU;AAAA,YACvB,CAAC;AAAA,UACH;AAEA,cAAI,CAAC,UAAU,YAAY,YAAY,CAAC,SAAS,WAAW,aAAa;AACvE;AAAA,UACF;AAEA,mBAAS,SAAS,WAAW;AAAA,QAC/B;AAEA,eAAO;AAAA,MACT;AAAA,MAEA,SAAS,OAAO,QAAqB,cAAsB;AACzD,cAAM,WAAW,cAAc,MAAM;AACrC,cAAM;AAAA,UACJ;AAAA,UACA,mBAAmB,mBAAmB,SAAS,CAAC;AAAA,UAChD,EAAE,QAAQ,SAAS;AAAA,UACnB,EAAE,UAAU,KAAK;AAAA,QACnB;AAAA,MACF;AAAA,MAEA,YAAY,OACV,QACA,SACA,YAC2B;AAC3B,cAAM,YAAY,KAAK,IAAI;AAC3B,cAAM,cAAc,iBAAiB,SAAS,OAAO;AAErD,cAAM,WAAW,MAAM,YAKpB,OAAO,QAAQ,mBAAmB,mBAAmB,OAAO,SAAS,CAAC,SAAS;AAAA,UAChF,QAAQ;AAAA,UACR,SAAS;AAAA,YACP,gBAAgB;AAAA,UAClB;AAAA,UACA,MAAM,KAAK,UAAU;AAAA,YACnB,SAAS,CAAC,WAAW,OAAO,WAAW;AAAA,YACvC,GAAI,SAAS,MAAM,EAAE,SAAS,QAAQ,IAAI,IAAI,CAAC;AAAA,YAC/C,GAAI,SAAS,UAAU,EAAE,YAAY,QAAQ,QAAQ,IAAI,CAAC;AAAA,UAC5D,CAAC;AAAA,QACH,CAAC;AAED,cAAM,SAAS,UAAU,UAAU;AACnC,cAAM,SAAS,UAAU,UAAU;AACnC,YAAI,SAAS,YAAY,OAAQ,SAAQ,SAAS,MAAM;AACxD,YAAI,SAAS,YAAY,OAAQ,SAAQ,SAAS,MAAM;AAExD,eAAO;AAAA,UACL;AAAA,UACA;AAAA,UACA,UAAU,UAAU,YAAY,MAAM,UAAU,aAAa;AAAA,UAC7D,YAAY,KAAK,IAAI,IAAI;AAAA,QAC3B;AAAA,MACF;AAAA,MAEA,SAAS,OAAO,WAAqD;AACnE,cAAM,YACH,MAAM,iBAAiB,OAAO,QAAQ,OAAO,SAAS,KAAM,OAAO;AAEtE,eAAO;AAAA,UACL,IAAI,OAAO;AAAA,UACX,UAAU;AAAA,UACV,QAAQ,UAAU,UAAU,KAAK;AAAA,UACjC,WAAW,UAAU,UAAU,UAAU;AAAA,UACzC,SAAS,OAAO,OAAO;AAAA,UACvB,UAAU;AAAA,YACR,MAAM,UAAU;AAAA,YAChB,UAAU,UAAU;AAAA,YACpB,WAAW,UAAU;AAAA,YACrB,WAAW,UAAU;AAAA,YACrB,cAAc,UAAU;AAAA,YACxB,OAAO,UAAU;AAAA,UACnB;AAAA,QACF;AAAA,MACF;AAAA,MAEA,QAAQ,OACN,QACA,YACoB;AACpB,cAAM,UAAU,MAAM,uBAAuB,QAAQ,QAAQ,MAAM,QAAQ,QAAQ;AACnF,YAAI,QAAQ,aAAa,QAAQ,QAAQ,aAAa,OAAO;AAC3D,gBAAMC,OAAM,QAAQ;AACpB,cAAI,CAACA,MAAK;AACR,kBAAM,IAAI,MAAM,iBAAiB,QAAQ,UAAU,mCAAmC;AAAA,UACxF;AACA,cAAI,QAAQ,aAAa,MAAM;AAC7B,kBAAM,SAAS,IAAI,IAAIA,IAAG;AAC1B,mBAAO,WAAW;AAClB,mBAAO,OAAO,SAAS;AAAA,UACzB;AACA,iBAAOA;AAAA,QACT;AAEA,cAAM,MAAM,QAAQ;AACpB,YAAI,CAAC,KAAK;AACR,gBAAM,IAAI,MAAM,iBAAiB,QAAQ,UAAU,+BAA+B;AAAA,QACpF;AAEA,YAAI,QAAQ,aAAa,QAAQ;AAC/B,gBAAM,SAAS,IAAI,IAAI,GAAG;AAC1B,iBAAO,WAAW;AAClB,iBAAO,OAAO,SAAS;AAAA,QACzB;AAEA,eAAO;AAAA,MACT;AAAA,MAEA,YAAY;AAAA,QACV,UAAU,OACR,QACA,MACA,eACoB;AACpB,gBAAM,SAAS,MAAM;AAAA,YACnB;AAAA,YACA,YAAY,eAAe,IAAI,CAAC,kBAAkB,eAAe,IAAI,CAAC;AAAA,UACxE;AACA,cAAI,OAAO,aAAa,GAAG;AACzB,kBAAM,IAAI,MAAM,iCAAiC,IAAI,EAAE;AAAA,UACzD;AACA,iBAAO,OAAO,KAAK,OAAO,QAAQ,QAAQ,EAAE,SAAS,MAAM;AAAA,QAC7D;AAAA,QAEA,WAAW,OACT,QACA,MACA,SACA,eACkB;AAClB,gBAAM,YAAY,KAAK,SAAS,GAAG,IAAI,KAAK,MAAM,GAAG,KAAK,YAAY,GAAG,CAAC,KAAK,MAAM;AACrF,gBAAM,UAAU,OAAO,KAAK,OAAO,EAAE,SAAS,QAAQ;AACtD,gBAAM,SAAS,MAAM;AAAA,YACnB;AAAA,YACA,aAAa,eAAe,SAAS,CAAC,cAAc,OAAO,oBAAoB,eAAe,IAAI,CAAC;AAAA,UACrG;AACA,cAAI,OAAO,aAAa,GAAG;AACzB,kBAAM,IAAI,MAAM,wBAAwB,IAAI,KAAK,OAAO,MAAM,EAAE;AAAA,UAClE;AAAA,QACF;AAAA,QAEA,OAAO,OACL,QACA,MACA,eACkB;AAClB,gBAAM,SAAS,MAAM,WAAW,QAAQ,aAAa,eAAe,IAAI,CAAC,GAAG;AAC5E,cAAI,OAAO,aAAa,GAAG;AACzB,kBAAM,IAAI,MAAM,8BAA8B,IAAI,KAAK,OAAO,MAAM,EAAE;AAAA,UACxE;AAAA,QACF;AAAA,QAEA,SAAS,OACP,QACA,MACA,eACyB;AACzB,gBAAM,SAAS,MAAM,WAAW,QAAQ,WAAW,eAAe,IAAI,CAAC,GAAG;AAC1E,cAAI,OAAO,aAAa,GAAG;AACzB,kBAAM,IAAI,MAAM,4BAA4B,IAAI,KAAK,OAAO,MAAM,EAAE;AAAA,UACtE;AACA,iBAAO,qBAAqB,OAAO,MAAM;AAAA,QAC3C;AAAA,QAEA,QAAQ,OACN,QACA,MACA,eACqB;AACrB,gBAAM,SAAS,MAAM,WAAW,QAAQ,YAAY,eAAe,IAAI,CAAC,GAAG;AAC3E,iBAAO,OAAO,aAAa;AAAA,QAC7B;AAAA,QAEA,QAAQ,OACN,QACA,MACA,eACkB;AAClB,gBAAM,SAAS,MAAM,WAAW,QAAQ,WAAW,eAAe,IAAI,CAAC,GAAG;AAC1E,cAAI,OAAO,aAAa,GAAG;AACzB,kBAAM,IAAI,MAAM,oBAAoB,IAAI,KAAK,OAAO,MAAM,EAAE;AAAA,UAC9D;AAAA,QACF;AAAA,MACF;AAAA,MAEA,aAAa,CAAC,WAAmD;AAAA,IACnE;AAAA,IAEA,UAAU;AAAA,MACR,QAAQ,OACN,QACA,WACA,YACsB;AACtB,cAAM,WAAW,cAAc,MAAM;AACrC,cAAM,WAAW,MAAM;AAAA,UACrB;AAAA,UACA,mBAAmB,mBAAmB,SAAS,CAAC;AAAA,UAChD;AAAA,YACE,QAAQ;AAAA,YACR,SAAS;AAAA,cACP,gBAAgB;AAAA,YAClB;AAAA,YACA,MAAM,KAAK,UAAU;AAAA,cACnB,kBAAkB;AAAA,cAClB,cAAc;AAAA,cACd,aAAa;AAAA,cACb,QAAQ;AAAA,gBACN,GAAI,SAAS,WAAW,gBAAgB,QAAQ,QAAQ,IAAI,CAAC;AAAA,gBAC7D,GAAI,SAAS,OAAO,EAAE,mBAAmB,QAAQ,KAAK,IAAI,CAAC;AAAA,cAC7D;AAAA,YACF,CAAC;AAAA,UACH;AAAA,UACA,EAAE,qBAAqB,KAAK;AAAA,QAC9B;AAEA,cAAM,YAAY,MAAM;AAAA,UACtB;AAAA,UACA,mBAAmB,UAAU,iBAAiB;AAAA,UAC9C,SAAS;AAAA,QACX;AACA,cAAM,aAAa,wBAAwB,SAAS;AACpD,YAAI,CAAC,YAAY;AACf,gBAAM,IAAI,MAAM,wDAAwD;AAAA,QAC1E;AACA,cAAM,WAAW,MAAM;AAAA,UACrB;AAAA,UACA,kBAAkB,mBAAmB,UAAU,CAAC;AAAA,UAChD;AAAA,UACA,EAAE,qBAAqB,KAAK;AAAA,QAC9B;AAEA,YAAI,CAAC,UAAU;AACb,gBAAM,IAAI,MAAM,kBAAkB,UAAU,gCAAgC;AAAA,QAC9E;AAEA,eAAO,YAAY,QAAQ;AAAA,MAC7B;AAAA,MAEA,MAAM,OAAO,QAAqB,YAAwD;AACxF,cAAM,WAAW,cAAc,MAAM;AACrC,cAAM,QAAQ,IAAI,gBAAgB;AAClC,YAAI,SAAS,WAAW;AACtB,gBAAM,IAAI,gBAAgB,QAAQ,SAAS;AAAA,QAC7C;AACA,cAAM,WAAW,MAAM;AAAA,UACrB;AAAA,UACA,iBAAiB,MAAM,SAAS,IAAI,IAAI,MAAM,SAAS,CAAC,KAAK,EAAE;AAAA,UAC/D;AAAA,UACA,EAAE,qBAAqB,KAAK;AAAA,QAC9B;AACA,gBAAQ,UAAU,aAAa,CAAC,GAAG,IAAI,WAAW;AAAA,MACpD;AAAA,MAEA,QAAQ,OAAO,QAAqB,eAAsC;AACxE,cAAM,WAAW,cAAc,MAAM;AACrC,cAAM;AAAA,UACJ;AAAA,UACA,kBAAkB,mBAAmB,UAAU,CAAC;AAAA,UAChD,EAAE,QAAQ,SAAS;AAAA,UACnB,EAAE,qBAAqB,MAAM,UAAU,KAAK;AAAA,QAC9C;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF,CAAC;AAED,SAAS,gBAAgB,OAAwD;AAC/E,SAAO,OAAO;AAAA,IACZ,OAAO,QAAQ,KAAK,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,OAAO,UAAU,WAAW,QAAQ,KAAK,UAAU,KAAK,CAAC,CAAC;AAAA,EAC9G;AACF;AAEA,SAAS,YAAY,UAAyC;AAC5D,SAAO;AAAA,IACL,IAAI,SAAS;AAAA,IACb,UAAU;AAAA,IACV,WAAW,UAAU,SAAS,UAAU;AAAA,IACxC,UAAU;AAAA,MACR,mBAAmB,SAAS;AAAA,MAC5B,QAAQ,SAAS,UAAU;AAAA,MAC3B,QAAQ,SAAS,UAAU,CAAC;AAAA,MAC5B,WAAW,SAAS,cAAc;AAAA,IACpC;AAAA,EACF;AACF;","names":["container","url"]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { defineProvider, escapeShellArg } from '@computesdk/provider';\n\nimport type {\n CommandResult,\n CreateInstanceOptions,\n CreateSnapshotOptions,\n FileEntry,\n ListSnapshotsOptions,\n RunCommandOptions,\n InstanceInfo,\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): InstanceInfo['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 instances: {\n create: async (config: QuiltConfig, options?: CreateInstanceOptions) => {\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 { instance: {\n config: resolved,\n sandboxId: containerId,\n container,\n }, instanceId: 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 { instance: {\n config: resolved,\n sandboxId: container.container_id,\n container,\n }, instanceId: 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 { instance: {\n config: resolved,\n sandboxId,\n container,\n },\n instanceId: sandboxId,\n };\n },\n\n list: async (config: QuiltConfig) => {\n const resolved = resolveConfig(config);\n const sandboxes: Array<{ instance: QuiltSandboxHandle; instanceId: 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 instance: {\n config: resolved, sandboxId: container.container_id,\n container,\n },\n instanceId: 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<InstanceInfo> => {\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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@computesdk/quilt",
3
- "version": "1.0.9",
3
+ "version": "1.0.11",
4
4
  "description": "Quilt provider for ComputeSDK - tenant-scoped Linux sandboxes with exec, published services, and snapshots",
5
5
  "author": "ComputeSDK",
6
6
  "license": "MIT",
@@ -21,8 +21,8 @@
21
21
  "dist"
22
22
  ],
23
23
  "dependencies": {
24
- "computesdk": "4.1.10",
25
- "@computesdk/provider": "2.1.11"
24
+ "@computesdk/provider": "2.1.13",
25
+ "computesdk": "4.1.11"
26
26
  },
27
27
  "keywords": [
28
28
  "computesdk",
@@ -50,7 +50,7 @@
50
50
  "tsup": "^8.0.0",
51
51
  "typescript": "^5.0.0",
52
52
  "vitest": "^1.0.0",
53
- "@computesdk/test-utils": "2.0.3"
53
+ "@computesdk/test-utils": "2.0.4"
54
54
  },
55
55
  "scripts": {
56
56
  "build": "tsup && tsc --emitDeclarationOnly --project tsconfig.json --outDir dist",