@computesdk/archil 0.4.29 → 0.4.31

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
@@ -241,8 +241,8 @@ function toSandboxRequest(options) {
241
241
  name: options?.name,
242
242
  baseImage: options?.baseImage ?? options?.image ?? options?.templateId,
243
243
  env: options?.env ?? options?.envs,
244
- vcpuCount: options?.vcpus ?? options?.cpu ?? options?.cpus,
245
- memSizeMiB: options?.memoryMiB ?? options?.memory
244
+ vcpuCount: options?.vcpuCount ?? options?.vcpu_count ?? options?.vcpus ?? options?.cpu ?? options?.cpus ?? options?.sandbox?.vcpuCount,
245
+ memSizeMiB: options?.memSizeMiB ?? options?.mem_size_mib ?? options?.memoryMiB ?? options?.memory ?? options?.memoryMb ?? options?.memMiB ?? options?.sandbox?.memSizeMiB
246
246
  };
247
247
  if (options?.maxTtlSeconds !== void 0) {
248
248
  request.maxTtlSeconds = options.maxTtlSeconds;
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["/**\n * Archil Provider\n *\n * Archil sandboxes are persistent Linux VMs (Firecracker, durable root\n * filesystem), and that is what this provider creates by default. Commands,\n * streaming and background processes run through Archil's native process API\n * (a WebSocket fetched fresh per process via POST\n * /api/sandboxes/{id}/connections); files move through its native file\n * transfer API; snapshots are paused forks restored with create({ snapshotId }).\n *\n * The older disk exec surface — each command runs in a fresh Archil-managed\n * container with a disk mounted at /mnt/archil — is opt-in with\n * `execution: \"exec\"` (or ARCHIL_EXECUTION=exec) plus a disk id.\n */\n\nimport { defineProvider, InstanceSizeError } from '@computesdk/provider';\nimport { Archil as ArchilClient, ArchilError } from 'disk';\nimport type {\n CreateSandboxRequest as ArchilSandboxRequest,\n Sandbox as ArchilVm,\n SandboxProcessResult,\n} from 'disk';\nimport { randomUUID } from 'node:crypto';\nimport { posix } from 'node:path';\nimport type {\n CommandResult,\n InstanceInfo,\n CreateInstanceOptions,\n FileEntry,\n ProcessHandle,\n RunCommandOptions,\n StartProcessOptions,\n} from 'computesdk';\n\nconst ARCHIL_MOUNT_ROOT = '/mnt/archil';\nconst ARCHIL_MAX_EXEC_COMMAND_BYTES = 102_400;\n// Base64 expands the file data and adds line wrapping. Keep the raw chunk\n// comfortably below Archil's roughly 4 MiB response cap.\nconst ARCHIL_MAX_READ_CHUNK_BYTES = 2 * 1024 * 1024;\n\n// Per-region color overrides. Default is \"green\" for any region not listed here.\nconst REGION_COLORS: Record<string, string> = {\n 'gcp-us-central1': 'blue',\n};\n\nfunction regionToBaseUrl(region: string): string {\n const dash = region.indexOf('-');\n if (dash <= 0 || dash === region.length - 1) {\n throw new Error(\n `Invalid Archil region \"${region}\". Expected \"{cloud}-{suffix}\", e.g. \"aws-us-east-1\".`,\n );\n }\n const cloud = region.slice(0, dash);\n const suffix = region.slice(dash + 1);\n const color = REGION_COLORS[region] ?? 'green';\n return `https://control.${color}.${suffix}.${cloud}.prod.archil.com`;\n}\n\n/**\n * Archil execution mode:\n * - \"persistent\" (default): a persistent sandbox VM run through the process API.\n * - \"exec\": serverless per-command containers on an existing disk (opt-in).\n */\nexport type ArchilExecutionMode = 'exec' | 'persistent';\n\nexport interface ArchilConfig {\n /** Archil API key. Falls back to ARCHIL_API_KEY env var. */\n apiKey?: string;\n /** Archil region (e.g. \"aws-us-east-1\"). Falls back to ARCHIL_REGION env var. */\n region?: string;\n /** Override the control-plane base URL (useful for testing). */\n baseUrl?: string;\n /**\n * Which Archil compute surface to use. Falls back to ARCHIL_EXECUTION, then\n * \"persistent\": create() provisions a persistent sandbox VM. \"exec\"\n * resolves create({ diskId }) to a disk exec handle instead. Per-sandbox\n * override: `ephemeral` on create() options (true -> exec handle, false ->\n * persistent VM).\n */\n execution?: ArchilExecutionMode;\n}\n\ninterface DiskResponse {\n id: string;\n name: string;\n organization: string;\n status: string;\n provider: string;\n region: string;\n createdAt: string;\n}\n\ntype DiskHandle = Pick<DiskResponse, 'id'>;\n\ninterface ExecTiming {\n totalMs: number;\n queueMs: number;\n executeMs: number;\n}\n\ninterface ExecResponse {\n exitCode: number;\n stdout: string;\n stderr: string;\n timing: ExecTiming;\n}\n\ninterface ResolvedConfig {\n apiKey: string;\n baseUrl: string;\n execution: ArchilExecutionMode;\n}\n\ninterface ArchilSandbox {\n client: ArchilClient;\n disk: DiskHandle | DiskResponse;\n /** Set only in \"persistent\" execution mode. */\n vm?: ArchilVm;\n resolved: ResolvedConfig;\n createdAt: Date;\n /** persistent mode: pause the VM, preserving CPU and memory state. */\n pause?: () => Promise<void>;\n /** persistent mode: resume the paused VM under the same sandbox id. */\n resume?: () => Promise<void>;\n}\n\nfunction vmInstance(\n client: ArchilClient,\n vm: ArchilVm,\n resolved: ResolvedConfig,\n): ArchilSandbox {\n return {\n client,\n disk: { id: vm.id },\n vm,\n resolved,\n createdAt: new Date(),\n pause: async () => {\n await vm.pause();\n },\n resume: async () => {\n await vm.resume();\n },\n };\n}\n\ninterface ArchilCreateOptions extends CreateInstanceOptions {\n /**\n * exec mode: id of the existing disk to run commands against. Required in\n * \"exec\" mode; ignored in \"persistent\" mode.\n */\n diskId?: string;\n /** persistent mode: OCI base image (e.g. \"node:24-bookworm\"). */\n baseImage?: string;\n /** persistent mode: environment variables baked into the sandbox. */\n env?: Record<string, string>;\n /** persistent mode: lifetime budget per powered-on session, in seconds. */\n maxTtlSeconds?: number;\n /** persistent mode: extra Archil sandbox fields (network policy, etc.). */\n sandbox?: Omit<\n ArchilSandboxRequest,\n 'name' | 'vcpuCount' | 'memSizeMiB' | 'baseImage' | 'env' | 'maxTtlSeconds'\n >;\n}\n\nfunction resolveConfig(config: ArchilConfig): ResolvedConfig {\n const apiKey = config.apiKey ?? process.env.ARCHIL_API_KEY;\n const region = config.region ?? process.env.ARCHIL_REGION;\n\n if (!apiKey) {\n throw new Error(\n 'Missing API key for Archil.\\n\\n' +\n 'Pass it: archil({ apiKey: \"...\" })\\n' +\n 'Or set ARCHIL_API_KEY in your environment.',\n );\n }\n\n let baseUrl = config.baseUrl;\n if (!baseUrl) {\n if (!region) {\n throw new Error(\n 'Missing region for Archil.\\n\\n' +\n 'Pass it: archil({ region: \"...\" })\\n' +\n 'Or set ARCHIL_REGION in your environment.\\n' +\n 'Examples: \"aws-us-east-1\", \"aws-eu-west-1\", \"gcp-us-central1\".',\n );\n }\n baseUrl = regionToBaseUrl(region);\n }\n\n return { apiKey, baseUrl, execution: resolveExecution(config) };\n}\n\nfunction resolveExecution(config: ArchilConfig): ArchilExecutionMode {\n if (config.execution) return config.execution;\n const fromEnv = process.env.ARCHIL_EXECUTION?.trim().toLowerCase();\n if (!fromEnv) return 'persistent';\n if (fromEnv === 'exec' || fromEnv === 'persistent') return fromEnv;\n throw new Error(\n `Invalid ARCHIL_EXECUTION \"${process.env.ARCHIL_EXECUTION}\". Expected \"persistent\" (default) or \"exec\".`,\n );\n}\n\nfunction createClient(config: ArchilConfig, resolved: ResolvedConfig): ArchilClient {\n const region = config.region ?? process.env.ARCHIL_REGION ?? 'aws-us-east-1';\n return new ArchilClient({ ...resolved, region });\n}\n\nfunction resolveCreateDiskId(options?: ArchilCreateOptions): string {\n // `sandboxId` is accepted as an alias: exec-mode sandboxes are addressed by\n // their disk id.\n const diskId = options?.diskId ?? options?.sandboxId;\n\n if (!diskId) {\n throw new Error(\n 'Archil create() requires an existing disk id on the top-level options.\\n\\n' +\n 'Example:\\n' +\n ' provider.sandbox.create({ diskId: \"disk_abc123\" })',\n );\n }\n\n return diskId;\n}\n\n\nfunction shellEscape(value: string): string {\n return `'${value.replace(/'/g, `'\\\\''`)}'`;\n}\n\nfunction mapFilesystemPath(sandbox: ArchilSandbox, path: string): string {\n const normalized = posix.normalize(path.startsWith('/') ? path : `/${path}`);\n\n // In persistent mode the filesystem is the VM's own filesystem.\n if (sandbox.vm) {\n return normalized;\n }\n\n if (normalized === '/') {\n return ARCHIL_MOUNT_ROOT;\n }\n\n if (\n normalized === ARCHIL_MOUNT_ROOT ||\n normalized.startsWith(`${ARCHIL_MOUNT_ROOT}/`)\n ) {\n return normalized;\n }\n\n return `${ARCHIL_MOUNT_ROOT}${normalized}`;\n}\n\nfunction withDiskWriteLockCommand(command: string): string {\n const mountRoot = shellEscape(ARCHIL_MOUNT_ROOT);\n return [\n `archil checkout --force --yes ${mountRoot}`,\n `{ ${command}; status=$?; archil checkin ${mountRoot}; checkin_status=$?; ` +\n `if [ $status -ne 0 ]; then exit $status; fi; exit $checkin_status; }`,\n ].join(' && ');\n}\n\nfunction withDiskWriteLock(sandbox: ArchilSandbox, command: string): string {\n // Sandbox VMs have a dedicated disk — no shared-mode checkout needed.\n if (sandbox.vm) return command;\n return withDiskWriteLockCommand(command);\n}\n\nfunction execCommandBytes(command: string): number {\n return Buffer.byteLength(wrapCommand(command), 'utf8');\n}\n\nfunction buildWriteChunkCommand(\n parent: string,\n tempPath: string,\n diskPath: string,\n encodedChunk: string,\n isFirst: boolean,\n isFinal: boolean,\n): string {\n const writeCommand =\n `printf %s ${shellEscape(encodedChunk)} | base64 -d ` +\n `${isFirst ? '>' : '>>'} ${shellEscape(tempPath)}`;\n return [\n ...(isFirst ? [`mkdir -p ${shellEscape(parent)}`] : []),\n writeCommand,\n ...(isFinal\n ? [finalizeStagedFileCommand(tempPath, diskPath)]\n : []),\n ].join(' && ');\n}\n\nfunction finalizeStagedFileCommand(tempPath: string, diskPath: string): string {\n const quotedDestination = shellEscape(diskPath);\n return [\n `if [ -d ${quotedDestination} ]; then`,\n `printf '%s\\\\n' ${shellEscape(`Refusing to overwrite directory ${diskPath}`)} >&2;`,\n 'exit 1;',\n 'fi;',\n `mv ${shellEscape(tempPath)} ${quotedDestination}`,\n ].join(' ');\n}\n\nfunction maxWriteChunkSize(\n parent: string,\n tempPath: string,\n diskPath: string,\n): number {\n let low = 0;\n let high = ARCHIL_MAX_EXEC_COMMAND_BYTES;\n\n while (low < high) {\n const candidate = Math.ceil((low + high) / 2);\n const command = withDiskWriteLockCommand(\n buildWriteChunkCommand(\n parent,\n tempPath,\n diskPath,\n 'A'.repeat(candidate),\n true,\n true,\n ),\n );\n\n if (execCommandBytes(command) <= ARCHIL_MAX_EXEC_COMMAND_BYTES) {\n low = candidate;\n } else {\n high = candidate - 1;\n }\n }\n\n const chunkSize = low - (low % 4);\n if (chunkSize < 4) {\n throw new Error(\n `Archil filesystem path is too long to write within the ${ARCHIL_MAX_EXEC_COMMAND_BYTES}-byte exec command limit.`,\n );\n }\n return chunkSize;\n}\n\nfunction wrapCommand(command: string, options?: RunCommandOptions): string {\n let wrapped = command;\n\n if (options?.cwd) {\n wrapped = `cd ${shellEscape(options.cwd)} && ${wrapped}`;\n }\n\n const envEntries = Object.entries(options?.env ?? {});\n if (!envEntries.some(([key]) => key === 'HOME')) {\n envEntries.unshift(['HOME', process.env.HOME || '/tmp']);\n }\n // `export` instead of a `K=v cmd` prefix: an assignment prefix only binds a\n // simple command, so `K=v (a; b)` or `K=v { a; }` is a shell syntax error.\n const exports = envEntries\n .map(([k, v]) => `${k}=${shellEscape(String(v))}`)\n .join(' ');\n wrapped = `export ${exports}; ${wrapped}`;\n\n if (options?.background) {\n wrapped = `nohup sh -c ${shellEscape(wrapped)} > /dev/null 2>&1 &`;\n }\n\n return wrapped;\n}\n\nasync function execOnDisk(sandbox: ArchilSandbox, command: string): Promise<ExecResponse> {\n return sandbox.client.disks.exec(sandbox.disk.id, command);\n}\n\n// Runs the command from `cwd` without regrouping it: Archil hands the command\n// string to `/bin/sh -c`, and the newline keeps every part of a compound\n// command (`a; b`, `a || b`, pipelines) inside the new working directory. env\n// is passed natively to the process, so it reaches every part as well.\nfunction withCwd(command: string, cwd?: string): string {\n return cwd ? `cd ${shellEscape(cwd)} || exit 1\\n${command}` : command;\n}\n\nasync function ensureVmRunning(vm: ArchilVm): Promise<void> {\n // Refresh first: status on this handle is a local snapshot and goes stale\n // when the sandbox is paused/stopped remotely or hits its TTL.\n await vm.refresh();\n if (vm.status === 'running') return;\n if (vm.status === 'paused') {\n await vm.resume();\n } else if (vm.status === 'stopped' || vm.status === 'exited') {\n await vm.start();\n }\n}\n\nfunction requireVm(sandbox: ArchilSandbox, action: 'pause' | 'resume'): ArchilVm {\n if (!sandbox.vm) {\n throw new Error(\n `Archil disk exec handles cannot ${action}; create a persistent VM (ephemeral: false) instead.`,\n );\n }\n return sandbox.vm;\n}\n\n// Archil rejects deleting a live sandbox, so stop it first. A sandbox with\n// live forks returns 409: forks (snapshots) must be deleted before their parent.\nasync function stopAndDeleteVm(vm: ArchilVm): Promise<void> {\n if (vm.status === 'deleting' || vm.status === 'deleted') return;\n try {\n if (vm.status !== 'stopped' && vm.status !== 'exited' && vm.status !== 'failed') {\n await vm.stop();\n }\n await vm.delete();\n } catch (error) {\n if (error instanceof ArchilError && error.status === 404) return;\n if (error instanceof ArchilError && error.status === 409) {\n throw new Error(\n `Archil refused to delete sandbox ${vm.id} (409): ${error.message}. ` +\n 'Delete its forks and snapshots first; Archil deletes forks before their parent.',\n );\n }\n throw error;\n }\n}\n\nfunction toSandboxRequest(options?: ArchilCreateOptions): ArchilSandboxRequest {\n const request: ArchilSandboxRequest = {\n ...options?.sandbox,\n name: options?.name,\n baseImage: options?.baseImage ?? options?.image ?? options?.templateId,\n env: options?.env ?? options?.envs,\n vcpuCount: options?.vcpus ?? options?.cpu ?? options?.cpus,\n memSizeMiB: options?.memoryMiB ?? options?.memory,\n };\n if (options?.maxTtlSeconds !== undefined) {\n request.maxTtlSeconds = options.maxTtlSeconds;\n } else if (options?.timeout !== undefined) {\n // CreateInstanceOptions.timeout is milliseconds; Archil's TTL is seconds.\n request.maxTtlSeconds = Math.ceil(options.timeout / 1000);\n }\n return request;\n}\n\n// Snapshots are paused forks named with this prefix, which is how\n// snapshot.list() finds them and instances.list() leaves them out.\nconst SNAPSHOT_NAME_PREFIX = 'csdk-snap-';\n\nfunction snapshotName(name?: string): string {\n const suffix = randomUUID().slice(0, 8);\n const slug = (name ?? '')\n .toLowerCase()\n .replace(/[^a-z0-9-]+/g, '-')\n .replace(/^-+|-+$/g, '')\n .slice(0, 63 - SNAPSHOT_NAME_PREFIX.length - suffix.length - 1)\n .replace(/-+$/g, '');\n return `${SNAPSHOT_NAME_PREFIX}${slug ? `${slug}-` : ''}${suffix}`;\n}\n\nfunction isSnapshotVm(vm: ArchilVm): boolean {\n return vm.name?.startsWith(SNAPSHOT_NAME_PREFIX) ?? false;\n}\n\n// Archil disk ids look like `dsk-…`; sandbox ids are UUIDs.\nfunction isDiskId(id: string): boolean {\n return id.startsWith('dsk-');\n}\n\n// Records each handle's effective mode so `destroy` — which only receives an\n// id — treats it correctly even when the mode came from a per-sandbox\n// `ephemeral` override rather than the provider config.\nconst sandboxModes = new Map<string, ArchilExecutionMode>();\n\nfunction modeForId(id: string, resolved: ResolvedConfig): ArchilExecutionMode {\n return sandboxModes.get(id) ?? (isDiskId(id) ? 'exec' : resolved.execution);\n}\n\nfunction diskInstance(\n client: ArchilClient,\n disk: DiskHandle | DiskResponse,\n resolved: ResolvedConfig,\n): ArchilSandbox {\n return { client, disk, resolved, createdAt: new Date() };\n}\n\nconst TIMEOUT_EXIT_CODE = 124;\nconst KILLED_EXIT_CODE = 137;\n\ninterface VmProcessOutcome {\n exitCode: number;\n signal: string | null;\n stderrSuffix: string;\n}\n\nfunction mapProcessResult(\n result: SandboxProcessResult,\n timedOut: boolean,\n killSignal: string | null,\n): VmProcessOutcome {\n if (timedOut || result.status === 'timed_out') {\n return { exitCode: TIMEOUT_EXIT_CODE, signal: 'SIGKILL', stderrSuffix: '' };\n }\n if (result.status === 'cancelled') {\n return { exitCode: KILLED_EXIT_CODE, signal: killSignal ?? 'SIGKILL', stderrSuffix: '' };\n }\n if (result.status === 'failed') {\n return {\n exitCode: result.exitCode ?? 1,\n signal: null,\n stderrSuffix: result.exitReason ?? '',\n };\n }\n // Archil reports a process that died from a signal as exit code -1.\n return { exitCode: result.exitCode ?? 0, signal: null, stderrSuffix: '' };\n}\n\n/**\n * Starts a process through Archil's native process API with incremental\n * output decoding. The returned `done` promise settles with the mapped result.\n */\nasync function startVmProcess(\n vm: ArchilVm,\n command: string,\n options: {\n cwd?: string;\n env?: Record<string, string>;\n timeout?: number;\n onStdout?: (chunk: string) => void;\n onStderr?: (chunk: string) => void;\n },\n) {\n await ensureVmRunning(vm);\n const decoders = { stdout: new TextDecoder(), stderr: new TextDecoder() };\n const output = { stdout: '', stderr: '' };\n const emit = (stream: 'stdout' | 'stderr', text: string) => {\n if (!text) return;\n output[stream] += text;\n (stream === 'stdout' ? options.onStdout : options.onStderr)?.(text);\n };\n const proc = await vm.processes.start(withCwd(command, options.cwd), {\n env: options.env,\n collectOutput: false,\n timeoutSeconds:\n options.timeout !== undefined ? Math.max(1, Math.ceil(options.timeout / 1000)) : undefined,\n onOutput: (chunk) => emit(chunk.stream, decoders[chunk.stream].decode(chunk.data, { stream: true })),\n });\n\n const state = { timedOut: false, killSignal: null as string | null };\n let timer: ReturnType<typeof setTimeout> | undefined;\n if (options.timeout !== undefined) {\n // The server-side deadline has one-second granularity; kill at the exact\n // millisecond deadline as well.\n timer = setTimeout(() => {\n state.timedOut = true;\n proc.kill().catch(() => {});\n }, options.timeout);\n }\n\n const done = proc\n .wait()\n .then((result) => {\n emit('stdout', decoders.stdout.decode());\n emit('stderr', decoders.stderr.decode());\n const mapped = mapProcessResult(result, state.timedOut, state.killSignal);\n return {\n stdout: output.stdout,\n stderr: mapped.stderrSuffix\n ? `${output.stderr}${output.stderr && !output.stderr.endsWith('\\n') ? '\\n' : ''}${mapped.stderrSuffix}`\n : output.stderr,\n exitCode: mapped.exitCode,\n signal: mapped.signal,\n };\n })\n .catch((error: unknown) => ({\n stdout: output.stdout,\n stderr: `${output.stderr}${error instanceof Error ? error.message : String(error)}`,\n exitCode: 1,\n signal: null as string | null,\n }))\n .finally(() => {\n if (timer) clearTimeout(timer);\n });\n\n return { proc, done, state, output };\n}\n\nasync function runVmCommand(\n vm: ArchilVm,\n command: string,\n options?: RunCommandOptions,\n): Promise<CommandResult> {\n const startTime = Date.now();\n if (options?.background) {\n // A process started over the native API keeps running after the client\n // disconnects.\n await ensureVmRunning(vm);\n const proc = await vm.processes.start(withCwd(command, options.cwd), {\n env: options.env,\n collectOutput: false,\n });\n await proc.disconnect();\n return { stdout: '', stderr: '', exitCode: 0, durationMs: Date.now() - startTime };\n }\n const { done } = await startVmProcess(vm, command, {\n cwd: options?.cwd,\n env: options?.env,\n timeout: options?.timeout,\n onStdout: options?.onStdout,\n onStderr: options?.onStderr,\n });\n const result = await done;\n return {\n stdout: result.stdout,\n stderr: result.stderr,\n exitCode: result.exitCode,\n durationMs: Date.now() - startTime,\n };\n}\n\nfunction commandError(error: unknown, startTime: number): CommandResult {\n return {\n stdout: '',\n stderr: error instanceof Error ? error.message : String(error),\n exitCode: 1,\n durationMs: Date.now() - startTime,\n };\n}\n\nfunction resolveSizingExecution(\n config: ArchilConfig,\n options?: { ephemeral?: boolean },\n): ArchilExecutionMode {\n if (options?.ephemeral !== undefined) return options.ephemeral ? 'exec' : 'persistent';\n return resolveExecution(config);\n}\n\nconst _provider = defineProvider<ArchilSandbox, ArchilConfig>({\n name: 'archil',\n sizes: (config, profile, options) => {\n if (options?.sandbox !== undefined && (options.sandbox === null || typeof options.sandbox !== 'object' || Array.isArray(options.sandbox))) {\n throw new InstanceSizeError('invalid', 'sandbox must be an object when requesting sizeClass');\n }\n if (options?.vcpuCount !== undefined || options?.memSizeMiB !== undefined ||\n options?.vcpu_count !== undefined || options?.mem_size_mib !== undefined ||\n options?.sandbox?.vcpu_count !== undefined || options?.sandbox?.mem_size_mib !== undefined ||\n options?.sandbox?.vcpuCount !== undefined || options?.sandbox?.memSizeMiB !== undefined) {\n throw new InstanceSizeError('conflict', 'cannot combine sizeClass with native Archil CPU/memory fields');\n }\n if (options?.snapshotId !== undefined || options?.sandboxId !== undefined || options?.instanceId !== undefined) {\n return { status: 'unsupported', reason: 'Archil attach/fork does not apply CPU/RAM overrides; create a new persistent VM to request a standard size.' };\n }\n if (resolveSizingExecution(config, options) !== 'persistent') {\n return { status: 'unavailable', reason: 'Archil exec containers do not expose VM sizing. Drop execution: \"exec\" (persistent VMs are the default) or set ephemeral: false.' };\n }\n if (profile.sizeClass === 'xs' || profile.sizeClass === '2xl') {\n return { status: 'unknown', reason: 'This adapter has not verified this standard shape.' };\n }\n return { status: 'supported', nativeOptions: { vcpus: profile.vcpus, memoryMiB: profile.memoryMiB } };\n },\n methods: {\n instances: {\n create: async (config: ArchilConfig, options?: ArchilCreateOptions) => {\n const resolved = resolveConfig(config);\n const client = createClient(config, resolved);\n\n // `ephemeral` on create() overrides the configured mode for this\n // sandbox: true -> disk exec handle, false -> persistent VM.\n const execution =\n options?.ephemeral !== undefined\n ? options.ephemeral\n ? 'exec'\n : 'persistent'\n : resolved.execution;\n\n if (options?.snapshotId && execution === 'exec') {\n throw new Error(\n 'Archil snapshots fork persistent VMs and cannot be restored in exec mode. Drop execution: \"exec\" / ephemeral: true.',\n );\n }\n\n if (execution === 'exec') {\n const diskId = resolveCreateDiskId(options);\n sandboxModes.set(diskId, 'exec');\n return { instance: diskInstance(client, { id: diskId }, resolved), instanceId: diskId };\n }\n\n if (options?.diskId) {\n throw new Error(\n 'Archil create({ diskId }) attaches a disk exec handle, which is opt-in now that persistent VMs are the default.\\n\\n' +\n 'Opt in with archil({ execution: \"exec\" }) (or ARCHIL_EXECUTION=exec), or pass ephemeral: true.',\n );\n }\n\n let vm: ArchilVm;\n if (options?.snapshotId) {\n // A snapshot is a paused fork; forking it again yields an independent\n // writable VM resumed from the snapshot's memory and disk state.\n const source = await client.sandboxes.get(options.snapshotId);\n vm = await source.fork({ name: options?.name });\n } else if (options?.sandboxId) {\n // Attach to a live sandbox. Refuse an abort signal here: the\n // sandbox manager destroys a resolved sandbox after an abort,\n // which would delete a sandbox this call did not create.\n if (options?.signal) {\n throw new Error(\n 'create({ sandboxId }) attaches to an existing sandbox and cannot be combined with an abort signal',\n );\n }\n vm = await client.sandboxes.get(options.sandboxId);\n await ensureVmRunning(vm);\n } else {\n vm = await client.sandboxes.create(toSandboxRequest(options), {\n wait: true,\n });\n }\n if (vm.status === 'failed') {\n throw new Error(`Archil sandbox ${vm.id} failed to start${vm.exitReason ? `: ${vm.exitReason}` : ''}`);\n }\n sandboxModes.set(vm.id, 'persistent');\n return { instance: vmInstance(client, vm, resolved), instanceId: vm.id };\n },\n\n getById: async (config: ArchilConfig, sandboxId: string) => {\n const resolved = resolveConfig(config);\n const client = createClient(config, resolved);\n try {\n if (modeForId(sandboxId, resolved) === 'exec') {\n const disk = await client.disks.get(sandboxId);\n return { instance: diskInstance(client, disk, resolved), instanceId: disk.id };\n }\n const vm = await client.sandboxes.get(sandboxId);\n await ensureVmRunning(vm);\n return { instance: vmInstance(client, vm, resolved), instanceId: vm.id };\n } catch {\n return null;\n }\n },\n\n // Archil's list endpoints return every sandbox (and the SDK follows disk\n // pagination), so a single call yields the full account listing.\n list: async (config: ArchilConfig) => {\n const resolved = resolveConfig(config);\n const client = createClient(config, resolved);\n if (resolved.execution === 'exec') {\n const disks = await client.disks.list();\n return disks.map((disk) => ({ instance: diskInstance(client, disk, resolved), instanceId: disk.id }));\n }\n const vms = await client.sandboxes.list();\n return vms\n .filter((vm) => !isSnapshotVm(vm) && vm.status !== 'deleting' && vm.status !== 'deleted')\n .map((vm) => ({ instance: vmInstance(client, vm, resolved), instanceId: vm.id }));\n },\n\n destroy: async (config: ArchilConfig, sandboxId: string) => {\n const resolved = resolveConfig(config);\n // exec handles are disk references — Archil disks have an independent\n // lifecycle, so destroying them is a no-op.\n const mode = modeForId(sandboxId, resolved);\n sandboxModes.delete(sandboxId);\n if (mode === 'exec') return;\n const client = createClient(config, resolved);\n let vm: ArchilVm;\n try {\n vm = await client.sandboxes.get(sandboxId);\n } catch (error) {\n if (error instanceof ArchilError && (error.status === 404 || error.status === 400)) return;\n throw error;\n }\n await stopAndDeleteVm(vm);\n },\n\n runCommand: async (\n sandbox: ArchilSandbox,\n command: string,\n options?: RunCommandOptions,\n ): Promise<CommandResult> => {\n const startTime = Date.now();\n try {\n if (sandbox.vm) {\n const { onStdout: _out, onStderr: _err, ...rest } = options ?? {};\n return await runVmCommand(sandbox.vm, command, rest);\n }\n const result = await execOnDisk(sandbox, wrapCommand(command, options));\n return {\n stdout: result.stdout ?? '',\n stderr: result.stderr ?? '',\n exitCode: result.exitCode,\n durationMs: Date.now() - startTime,\n };\n } catch (error) {\n return commandError(error, startTime);\n }\n },\n\n // Persistent VMs stream through the process WebSocket. Disk exec only\n // returns output once the command exits, so it is delivered at the end.\n streamCommand: async (\n sandbox: ArchilSandbox,\n command: string,\n options: RunCommandOptions,\n ): Promise<CommandResult> => {\n const startTime = Date.now();\n try {\n if (sandbox.vm) return await runVmCommand(sandbox.vm, command, options);\n const result = await execOnDisk(sandbox, wrapCommand(command, options));\n if (result.stdout) options.onStdout?.(result.stdout);\n if (result.stderr) options.onStderr?.(result.stderr);\n return {\n stdout: result.stdout ?? '',\n stderr: result.stderr ?? '',\n exitCode: result.exitCode,\n durationMs: Date.now() - startTime,\n };\n } catch (error) {\n return commandError(error, startTime);\n }\n },\n\n startProcess: async (\n sandbox: ArchilSandbox,\n command: string,\n options: StartProcessOptions,\n ): Promise<ProcessHandle> => {\n if (!sandbox.vm) {\n throw new Error(\n 'Archil exec mode runs each command in a fresh container, so it cannot host background processes. Use a persistent VM (the default).',\n );\n }\n const startTime = Date.now();\n const { proc, done, state, output } = await startVmProcess(sandbox.vm, command, {\n cwd: options.cwd,\n env: options.env,\n onStdout: options.onStdout,\n onStderr: options.onStderr,\n });\n // Without stdin: true the process sees EOF, as with `< /dev/null`.\n if (!options.stdin) await proc.closeStdin().catch(() => {});\n\n let exited: (typeof done extends Promise<infer R> ? R : never) | undefined;\n const finished = done.then((result) => {\n exited = result;\n options.onExit?.({ exitCode: result.exitCode, signal: result.signal });\n return result;\n });\n const toResult = (result: Awaited<typeof done>) => ({\n stdout: result.stdout,\n stderr: result.stderr,\n exitCode: result.exitCode,\n signal: result.signal,\n durationMs: Date.now() - startTime,\n });\n\n return {\n pid: null,\n jobId: proc.id,\n runtime: 'native',\n write: async (data) => {\n if (!options.stdin) {\n throw new Error('Process was started without stdin: true');\n }\n await proc.sendInput(data);\n },\n closeStdin: async () => {\n if (options.stdin && !exited) await proc.closeStdin();\n },\n status: async () =>\n exited\n ? { status: 'exited', exitCode: exited.exitCode, signal: exited.signal, stdout: exited.stdout, stderr: exited.stderr }\n : { status: 'running', exitCode: null, signal: null, stdout: output.stdout, stderr: output.stderr },\n wait: async (waitOptions) => {\n if (waitOptions?.timeout === undefined) return toResult(await finished);\n let timer: ReturnType<typeof setTimeout> | undefined;\n const timeout = new Promise<never>((_, reject) => {\n timer = setTimeout(\n () => reject(new Error(`Process ${proc.id} did not exit within ${waitOptions.timeout}ms`)),\n waitOptions.timeout,\n );\n });\n try {\n return toResult(await Promise.race([finished, timeout]));\n } finally {\n clearTimeout(timer);\n }\n },\n // Archil's process control only cancels (SIGKILL semantics); the\n // requested signal name is what the result reports.\n kill: async (signal) => {\n if (exited) return;\n state.killSignal = signal ?? 'SIGKILL';\n await proc.kill();\n },\n };\n },\n\n getInfo: async (sandbox: ArchilSandbox): Promise<InstanceInfo> => {\n if (sandbox.vm) {\n const vm = sandbox.vm;\n return {\n id: vm.id,\n provider: 'archil',\n status:\n vm.status === 'running'\n ? 'running'\n : vm.status === 'failed'\n ? 'error'\n : 'stopped',\n createdAt: vm.createdAt,\n timeout: vm.maxTtlSeconds * 1000,\n metadata: {\n name: vm.name,\n archilStatus: vm.status,\n vcpuCount: vm.vcpuCount,\n memSizeMiB: vm.memSizeMiB,\n baseImage: vm.baseImage,\n platform: vm.platform,\n },\n };\n }\n const diskInfo = 'status' in sandbox.disk ? sandbox.disk : undefined;\n return {\n id: sandbox.disk.id,\n provider: 'archil',\n status: !diskInfo || diskInfo.status === 'ready' ? 'running' : 'stopped',\n createdAt: diskInfo ? new Date(diskInfo.createdAt) : sandbox.createdAt,\n timeout: 0,\n metadata: diskInfo\n ? {\n name: diskInfo.name,\n organization: diskInfo.organization,\n region: diskInfo.region,\n provider: diskInfo.provider,\n }\n : {},\n };\n },\n\n getUrl: async (\n sandbox: ArchilSandbox,\n options: { port: number; protocol?: string },\n ): Promise<string> => {\n if (sandbox.vm) {\n await sandbox.vm.refresh();\n const endpoint = sandbox.vm.endpoints?.find(\n (e) => e.port === options.port,\n );\n if (!endpoint) {\n throw new Error(\n `No endpoint exposed on port ${options.port} for Archil sandbox ${sandbox.vm.id}.`,\n );\n }\n return `${options.protocol ?? 'https'}://${endpoint.hostname}`;\n }\n throw new Error(\n `Archil exec runs each command in a fresh ephemeral container that exits when the command returns, ` +\n `so there is no long-lived process to expose port ${options.port} on. ` +\n `getUrl is not supported.`,\n );\n },\n\n filesystem: {\n readFile: async (sandbox, path, runCommand) => {\n if (sandbox.vm) {\n const chunks: Buffer[] = [];\n try {\n await sandbox.vm.files.downloadFile(path, (chunk) => {\n chunks.push(Buffer.from(chunk));\n });\n } catch (error) {\n throw new Error(\n `Failed to read ${path}: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n return Buffer.concat(chunks).toString('utf8');\n }\n const diskPath = mapFilesystemPath(sandbox, path);\n const sizeResult = await runCommand(\n sandbox,\n `wc -c < ${shellEscape(diskPath)}`,\n );\n if (sizeResult.exitCode !== 0) {\n throw new Error(`Failed to read ${path}: ${sizeResult.stderr}`);\n }\n\n const sizeText = sizeResult.stdout.trim();\n if (!/^\\d+$/.test(sizeText)) {\n throw new Error(\n `Failed to read ${path}: Archil returned an invalid file size.`,\n );\n }\n\n const size = Number(sizeText);\n if (!Number.isSafeInteger(size)) {\n throw new Error(\n `Failed to read ${path}: file size exceeds JavaScript's safe integer range.`,\n );\n }\n if (size === 0) return '';\n\n const chunks: Buffer[] = [];\n for (\n let offset = 0;\n offset < size;\n offset += ARCHIL_MAX_READ_CHUNK_BYTES\n ) {\n const expectedBytes = Math.min(\n ARCHIL_MAX_READ_CHUNK_BYTES,\n size - offset,\n );\n const result = await runCommand(\n sandbox,\n `dd if=${shellEscape(diskPath)} bs=1 skip=${offset} count=${expectedBytes} 2>/dev/null | base64`,\n );\n if (result.exitCode !== 0) {\n throw new Error(`Failed to read ${path}: ${result.stderr}`);\n }\n\n const encoded = result.stdout.replace(/\\s/g, '');\n if (\n encoded.length === 0 ||\n encoded.length % 4 !== 0 ||\n !/^[A-Za-z0-9+/]*={0,2}$/.test(encoded)\n ) {\n throw new Error(\n `Failed to read ${path}: Archil returned an incomplete file chunk at byte ${offset}.`,\n );\n }\n\n const chunk = Buffer.from(encoded, 'base64');\n if (chunk.length !== expectedBytes) {\n throw new Error(\n `Failed to read ${path}: Archil returned an incomplete file chunk at byte ${offset}.`,\n );\n }\n chunks.push(chunk);\n }\n\n return Buffer.concat(chunks).toString('utf8');\n },\n\n writeFile: async (sandbox, path, content, runCommand) => {\n if (sandbox.vm) {\n try {\n await sandbox.vm.files.uploadFile(\n Buffer.from(content, 'utf8'),\n path,\n );\n } catch (error) {\n throw new Error(\n `Failed to write ${path}: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n return;\n }\n const diskPath = mapFilesystemPath(sandbox, path);\n const parent = posix.dirname(diskPath);\n const encoded = Buffer.from(content, 'utf8').toString('base64');\n const tempPath = `${diskPath}.computesdk-write-${randomUUID()}`;\n let started = false;\n\n try {\n if (encoded.length === 0) {\n started = true;\n const result = await runCommand(\n sandbox,\n withDiskWriteLock(\n sandbox,\n [\n `mkdir -p ${shellEscape(parent)}`,\n `: > ${shellEscape(tempPath)}`,\n finalizeStagedFileCommand(tempPath, diskPath),\n ].join(' && '),\n ),\n );\n if (result.exitCode !== 0) {\n throw new Error(result.stderr);\n }\n return;\n }\n\n const chunkSize = maxWriteChunkSize(parent, tempPath, diskPath);\n for (let offset = 0; offset < encoded.length; offset += chunkSize) {\n const isFirst = offset === 0;\n const isFinal = offset + chunkSize >= encoded.length;\n started = true;\n const result = await runCommand(\n sandbox,\n withDiskWriteLock(\n sandbox,\n buildWriteChunkCommand(\n parent,\n tempPath,\n diskPath,\n encoded.slice(offset, offset + chunkSize),\n isFirst,\n isFinal,\n ),\n ),\n );\n if (result.exitCode !== 0) {\n throw new Error(result.stderr);\n }\n }\n } catch (error) {\n if (started) {\n try {\n await runCommand(\n sandbox,\n withDiskWriteLock(sandbox, `rm -f ${shellEscape(tempPath)}`),\n );\n } catch {\n // Preserve the original write error if cleanup fails.\n }\n }\n throw new Error(\n `Failed to write ${path}: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n },\n\n mkdir: async (sandbox, path, runCommand) => {\n const diskPath = mapFilesystemPath(sandbox, path);\n const result = await runCommand(\n sandbox,\n withDiskWriteLock(sandbox, `mkdir -p ${shellEscape(diskPath)}`),\n );\n if (result.exitCode !== 0) {\n throw new Error(`Failed to create directory ${path}: ${result.stderr}`);\n }\n },\n\n readdir: async (sandbox, path, runCommand) => {\n const diskPath = mapFilesystemPath(sandbox, path);\n // Tab-separated: type<TAB>size<TAB>mtime-iso<TAB>name. Robust to spaces in names.\n const result = await runCommand(\n sandbox,\n `find ${shellEscape(diskPath)} -mindepth 1 -maxdepth 1 -printf '%y\\t%s\\t%T@\\t%f\\n'`,\n );\n if (result.exitCode !== 0) {\n throw new Error(`Failed to list directory ${path}: ${result.stderr}`);\n }\n const entries: FileEntry[] = [];\n for (const line of result.stdout.split('\\n')) {\n if (!line) continue;\n const [typeChar, sizeStr, mtimeStr, ...nameParts] = line.split('\\t');\n const name = nameParts.join('\\t');\n entries.push({\n name,\n type: typeChar === 'd' ? 'directory' : 'file',\n size: parseInt(sizeStr, 10) || 0,\n modified: new Date(parseFloat(mtimeStr) * 1000),\n });\n }\n return entries;\n },\n\n exists: async (sandbox, path, runCommand) => {\n const diskPath = mapFilesystemPath(sandbox, path);\n const result = await runCommand(sandbox, `test -e ${shellEscape(diskPath)}`);\n return result.exitCode === 0;\n },\n\n remove: async (sandbox, path, runCommand) => {\n const diskPath = mapFilesystemPath(sandbox, path);\n if (!sandbox.vm && diskPath === ARCHIL_MOUNT_ROOT) {\n throw new Error('Refusing to remove the Archil disk mount root.');\n }\n const result = await runCommand(\n sandbox,\n withDiskWriteLock(sandbox, `rm -rf ${shellEscape(diskPath)}`),\n );\n if (result.exitCode !== 0) {\n throw new Error(`Failed to remove ${path}: ${result.stderr}`);\n }\n },\n },\n\n // Native pause keeps CPU and memory: files anywhere (including /tmp)\n // and running processes survive. Processes must outlive the command\n // that started them (startProcess, or setsid): Archil reaps a command's\n // process group when it exits. Disk exec handles have no VM to pause.\n pause: async (sandbox: ArchilSandbox) => {\n await requireVm(sandbox, 'pause').pause();\n },\n\n resume: async (sandbox: ArchilSandbox) => {\n await requireVm(sandbox, 'resume').resume();\n },\n\n pauseCapabilities: { memory: true, createOptions: { ephemeral: false } },\n\n getInstance: (sandbox: ArchilSandbox): ArchilSandbox => sandbox,\n },\n\n // Archil has no separate snapshot resource. A snapshot is a fork of the\n // source VM (memory and disk), paused so it holds state without running,\n // and named with SNAPSHOT_NAME_PREFIX so it can be listed. create({\n // snapshotId }) forks it again. Forks must be deleted before their parent.\n snapshot: {\n // A fork copies the VM's memory and whole disk, so restores keep the\n // rootfs (including /tmp) and running processes; the source keeps running.\n capabilities: {\n scope: 'rootfs',\n memory: true,\n destroysSource: false,\n createOptions: { ephemeral: false },\n },\n\n create: async (\n config: ArchilConfig,\n sandboxId: string,\n options?: { name?: string },\n ) => {\n const resolved = resolveConfig(config);\n const client = createClient(config, resolved);\n let fork: ArchilVm | undefined;\n try {\n const source = await client.sandboxes.get(sandboxId);\n fork = await source.fork({ name: snapshotName(options?.name) });\n if (fork.status === 'running') await fork.pause();\n return {\n id: fork.id,\n provider: 'archil',\n createdAt: fork.createdAt ?? new Date(),\n metadata: { name: options?.name, archilName: fork.name, sourceId: sandboxId },\n };\n } catch (error) {\n if (fork) await stopAndDeleteVm(fork).catch(() => {});\n throw new Error(\n `Failed to create Archil snapshot: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n },\n\n list: async (config: ArchilConfig) => {\n const resolved = resolveConfig(config);\n const client = createClient(config, resolved);\n const vms = await client.sandboxes.list();\n return vms\n .filter((vm) => isSnapshotVm(vm) && vm.status !== 'deleting' && vm.status !== 'deleted')\n .map((vm) => ({\n id: vm.id,\n provider: 'archil',\n createdAt: vm.createdAt,\n metadata: { archilName: vm.name, archilStatus: vm.status },\n }));\n },\n\n delete: async (config: ArchilConfig, snapshotId: string) => {\n const resolved = resolveConfig(config);\n const client = createClient(config, resolved);\n let vm: ArchilVm;\n try {\n vm = await client.sandboxes.get(snapshotId);\n } catch (error) {\n if (error instanceof ArchilError && error.status === 404) return;\n throw error;\n }\n await stopAndDeleteVm(vm);\n },\n },\n },\n});\n\nexport const archil = (config: ArchilConfig = {}) => _provider(config);\n\nexport type { ArchilSandbox };\n"],"mappings":"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","names":["ArchilClient","exports","chunks"]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["/**\n * Archil Provider\n *\n * Archil sandboxes are persistent Linux VMs (Firecracker, durable root\n * filesystem), and that is what this provider creates by default. Commands,\n * streaming and background processes run through Archil's native process API\n * (a WebSocket fetched fresh per process via POST\n * /api/sandboxes/{id}/connections); files move through its native file\n * transfer API; snapshots are paused forks restored with create({ snapshotId }).\n *\n * The older disk exec surface — each command runs in a fresh Archil-managed\n * container with a disk mounted at /mnt/archil — is opt-in with\n * `execution: \"exec\"` (or ARCHIL_EXECUTION=exec) plus a disk id.\n */\n\nimport { defineProvider, InstanceSizeError } from '@computesdk/provider';\nimport { Archil as ArchilClient, ArchilError } from 'disk';\nimport type {\n CreateSandboxRequest as ArchilSandboxRequest,\n Sandbox as ArchilVm,\n SandboxProcessResult,\n} from 'disk';\nimport { randomUUID } from 'node:crypto';\nimport { posix } from 'node:path';\nimport type {\n CommandResult,\n InstanceInfo,\n CreateInstanceOptions,\n FileEntry,\n ProcessHandle,\n RunCommandOptions,\n StartProcessOptions,\n} from 'computesdk';\n\nconst ARCHIL_MOUNT_ROOT = '/mnt/archil';\nconst ARCHIL_MAX_EXEC_COMMAND_BYTES = 102_400;\n// Base64 expands the file data and adds line wrapping. Keep the raw chunk\n// comfortably below Archil's roughly 4 MiB response cap.\nconst ARCHIL_MAX_READ_CHUNK_BYTES = 2 * 1024 * 1024;\n\n// Per-region color overrides. Default is \"green\" for any region not listed here.\nconst REGION_COLORS: Record<string, string> = {\n 'gcp-us-central1': 'blue',\n};\n\nfunction regionToBaseUrl(region: string): string {\n const dash = region.indexOf('-');\n if (dash <= 0 || dash === region.length - 1) {\n throw new Error(\n `Invalid Archil region \"${region}\". Expected \"{cloud}-{suffix}\", e.g. \"aws-us-east-1\".`,\n );\n }\n const cloud = region.slice(0, dash);\n const suffix = region.slice(dash + 1);\n const color = REGION_COLORS[region] ?? 'green';\n return `https://control.${color}.${suffix}.${cloud}.prod.archil.com`;\n}\n\n/**\n * Archil execution mode:\n * - \"persistent\" (default): a persistent sandbox VM run through the process API.\n * - \"exec\": serverless per-command containers on an existing disk (opt-in).\n */\nexport type ArchilExecutionMode = 'exec' | 'persistent';\n\nexport interface ArchilConfig {\n /** Archil API key. Falls back to ARCHIL_API_KEY env var. */\n apiKey?: string;\n /** Archil region (e.g. \"aws-us-east-1\"). Falls back to ARCHIL_REGION env var. */\n region?: string;\n /** Override the control-plane base URL (useful for testing). */\n baseUrl?: string;\n /**\n * Which Archil compute surface to use. Falls back to ARCHIL_EXECUTION, then\n * \"persistent\": create() provisions a persistent sandbox VM. \"exec\"\n * resolves create({ diskId }) to a disk exec handle instead. Per-sandbox\n * override: `ephemeral` on create() options (true -> exec handle, false ->\n * persistent VM).\n */\n execution?: ArchilExecutionMode;\n}\n\ninterface DiskResponse {\n id: string;\n name: string;\n organization: string;\n status: string;\n provider: string;\n region: string;\n createdAt: string;\n}\n\ntype DiskHandle = Pick<DiskResponse, 'id'>;\n\ninterface ExecTiming {\n totalMs: number;\n queueMs: number;\n executeMs: number;\n}\n\ninterface ExecResponse {\n exitCode: number;\n stdout: string;\n stderr: string;\n timing: ExecTiming;\n}\n\ninterface ResolvedConfig {\n apiKey: string;\n baseUrl: string;\n execution: ArchilExecutionMode;\n}\n\ninterface ArchilSandbox {\n client: ArchilClient;\n disk: DiskHandle | DiskResponse;\n /** Set only in \"persistent\" execution mode. */\n vm?: ArchilVm;\n resolved: ResolvedConfig;\n createdAt: Date;\n /** persistent mode: pause the VM, preserving CPU and memory state. */\n pause?: () => Promise<void>;\n /** persistent mode: resume the paused VM under the same sandbox id. */\n resume?: () => Promise<void>;\n}\n\nfunction vmInstance(\n client: ArchilClient,\n vm: ArchilVm,\n resolved: ResolvedConfig,\n): ArchilSandbox {\n return {\n client,\n disk: { id: vm.id },\n vm,\n resolved,\n createdAt: new Date(),\n pause: async () => {\n await vm.pause();\n },\n resume: async () => {\n await vm.resume();\n },\n };\n}\n\ninterface ArchilCreateOptions extends CreateInstanceOptions {\n /**\n * exec mode: id of the existing disk to run commands against. Required in\n * \"exec\" mode; ignored in \"persistent\" mode.\n */\n diskId?: string;\n /** persistent mode: OCI base image (e.g. \"node:24-bookworm\"). */\n baseImage?: string;\n /** persistent mode: environment variables baked into the sandbox. */\n env?: Record<string, string>;\n /** persistent mode: lifetime budget per powered-on session, in seconds. */\n maxTtlSeconds?: number;\n /** persistent mode: Archil SDK-native CPU and memory fields. */\n vcpuCount?: number;\n memSizeMiB?: number;\n /** persistent mode: extra Archil sandbox fields (network policy, etc.). */\n sandbox?: Omit<\n ArchilSandboxRequest,\n 'name' | 'baseImage' | 'env' | 'maxTtlSeconds'\n >;\n}\n\nfunction resolveConfig(config: ArchilConfig): ResolvedConfig {\n const apiKey = config.apiKey ?? process.env.ARCHIL_API_KEY;\n const region = config.region ?? process.env.ARCHIL_REGION;\n\n if (!apiKey) {\n throw new Error(\n 'Missing API key for Archil.\\n\\n' +\n 'Pass it: archil({ apiKey: \"...\" })\\n' +\n 'Or set ARCHIL_API_KEY in your environment.',\n );\n }\n\n let baseUrl = config.baseUrl;\n if (!baseUrl) {\n if (!region) {\n throw new Error(\n 'Missing region for Archil.\\n\\n' +\n 'Pass it: archil({ region: \"...\" })\\n' +\n 'Or set ARCHIL_REGION in your environment.\\n' +\n 'Examples: \"aws-us-east-1\", \"aws-eu-west-1\", \"gcp-us-central1\".',\n );\n }\n baseUrl = regionToBaseUrl(region);\n }\n\n return { apiKey, baseUrl, execution: resolveExecution(config) };\n}\n\nfunction resolveExecution(config: ArchilConfig): ArchilExecutionMode {\n if (config.execution) return config.execution;\n const fromEnv = process.env.ARCHIL_EXECUTION?.trim().toLowerCase();\n if (!fromEnv) return 'persistent';\n if (fromEnv === 'exec' || fromEnv === 'persistent') return fromEnv;\n throw new Error(\n `Invalid ARCHIL_EXECUTION \"${process.env.ARCHIL_EXECUTION}\". Expected \"persistent\" (default) or \"exec\".`,\n );\n}\n\nfunction createClient(config: ArchilConfig, resolved: ResolvedConfig): ArchilClient {\n const region = config.region ?? process.env.ARCHIL_REGION ?? 'aws-us-east-1';\n return new ArchilClient({ ...resolved, region });\n}\n\nfunction resolveCreateDiskId(options?: ArchilCreateOptions): string {\n // `sandboxId` is accepted as an alias: exec-mode sandboxes are addressed by\n // their disk id.\n const diskId = options?.diskId ?? options?.sandboxId;\n\n if (!diskId) {\n throw new Error(\n 'Archil create() requires an existing disk id on the top-level options.\\n\\n' +\n 'Example:\\n' +\n ' provider.sandbox.create({ diskId: \"disk_abc123\" })',\n );\n }\n\n return diskId;\n}\n\n\nfunction shellEscape(value: string): string {\n return `'${value.replace(/'/g, `'\\\\''`)}'`;\n}\n\nfunction mapFilesystemPath(sandbox: ArchilSandbox, path: string): string {\n const normalized = posix.normalize(path.startsWith('/') ? path : `/${path}`);\n\n // In persistent mode the filesystem is the VM's own filesystem.\n if (sandbox.vm) {\n return normalized;\n }\n\n if (normalized === '/') {\n return ARCHIL_MOUNT_ROOT;\n }\n\n if (\n normalized === ARCHIL_MOUNT_ROOT ||\n normalized.startsWith(`${ARCHIL_MOUNT_ROOT}/`)\n ) {\n return normalized;\n }\n\n return `${ARCHIL_MOUNT_ROOT}${normalized}`;\n}\n\nfunction withDiskWriteLockCommand(command: string): string {\n const mountRoot = shellEscape(ARCHIL_MOUNT_ROOT);\n return [\n `archil checkout --force --yes ${mountRoot}`,\n `{ ${command}; status=$?; archil checkin ${mountRoot}; checkin_status=$?; ` +\n `if [ $status -ne 0 ]; then exit $status; fi; exit $checkin_status; }`,\n ].join(' && ');\n}\n\nfunction withDiskWriteLock(sandbox: ArchilSandbox, command: string): string {\n // Sandbox VMs have a dedicated disk — no shared-mode checkout needed.\n if (sandbox.vm) return command;\n return withDiskWriteLockCommand(command);\n}\n\nfunction execCommandBytes(command: string): number {\n return Buffer.byteLength(wrapCommand(command), 'utf8');\n}\n\nfunction buildWriteChunkCommand(\n parent: string,\n tempPath: string,\n diskPath: string,\n encodedChunk: string,\n isFirst: boolean,\n isFinal: boolean,\n): string {\n const writeCommand =\n `printf %s ${shellEscape(encodedChunk)} | base64 -d ` +\n `${isFirst ? '>' : '>>'} ${shellEscape(tempPath)}`;\n return [\n ...(isFirst ? [`mkdir -p ${shellEscape(parent)}`] : []),\n writeCommand,\n ...(isFinal\n ? [finalizeStagedFileCommand(tempPath, diskPath)]\n : []),\n ].join(' && ');\n}\n\nfunction finalizeStagedFileCommand(tempPath: string, diskPath: string): string {\n const quotedDestination = shellEscape(diskPath);\n return [\n `if [ -d ${quotedDestination} ]; then`,\n `printf '%s\\\\n' ${shellEscape(`Refusing to overwrite directory ${diskPath}`)} >&2;`,\n 'exit 1;',\n 'fi;',\n `mv ${shellEscape(tempPath)} ${quotedDestination}`,\n ].join(' ');\n}\n\nfunction maxWriteChunkSize(\n parent: string,\n tempPath: string,\n diskPath: string,\n): number {\n let low = 0;\n let high = ARCHIL_MAX_EXEC_COMMAND_BYTES;\n\n while (low < high) {\n const candidate = Math.ceil((low + high) / 2);\n const command = withDiskWriteLockCommand(\n buildWriteChunkCommand(\n parent,\n tempPath,\n diskPath,\n 'A'.repeat(candidate),\n true,\n true,\n ),\n );\n\n if (execCommandBytes(command) <= ARCHIL_MAX_EXEC_COMMAND_BYTES) {\n low = candidate;\n } else {\n high = candidate - 1;\n }\n }\n\n const chunkSize = low - (low % 4);\n if (chunkSize < 4) {\n throw new Error(\n `Archil filesystem path is too long to write within the ${ARCHIL_MAX_EXEC_COMMAND_BYTES}-byte exec command limit.`,\n );\n }\n return chunkSize;\n}\n\nfunction wrapCommand(command: string, options?: RunCommandOptions): string {\n let wrapped = command;\n\n if (options?.cwd) {\n wrapped = `cd ${shellEscape(options.cwd)} && ${wrapped}`;\n }\n\n const envEntries = Object.entries(options?.env ?? {});\n if (!envEntries.some(([key]) => key === 'HOME')) {\n envEntries.unshift(['HOME', process.env.HOME || '/tmp']);\n }\n // `export` instead of a `K=v cmd` prefix: an assignment prefix only binds a\n // simple command, so `K=v (a; b)` or `K=v { a; }` is a shell syntax error.\n const exports = envEntries\n .map(([k, v]) => `${k}=${shellEscape(String(v))}`)\n .join(' ');\n wrapped = `export ${exports}; ${wrapped}`;\n\n if (options?.background) {\n wrapped = `nohup sh -c ${shellEscape(wrapped)} > /dev/null 2>&1 &`;\n }\n\n return wrapped;\n}\n\nasync function execOnDisk(sandbox: ArchilSandbox, command: string): Promise<ExecResponse> {\n return sandbox.client.disks.exec(sandbox.disk.id, command);\n}\n\n// Runs the command from `cwd` without regrouping it: Archil hands the command\n// string to `/bin/sh -c`, and the newline keeps every part of a compound\n// command (`a; b`, `a || b`, pipelines) inside the new working directory. env\n// is passed natively to the process, so it reaches every part as well.\nfunction withCwd(command: string, cwd?: string): string {\n return cwd ? `cd ${shellEscape(cwd)} || exit 1\\n${command}` : command;\n}\n\nasync function ensureVmRunning(vm: ArchilVm): Promise<void> {\n // Refresh first: status on this handle is a local snapshot and goes stale\n // when the sandbox is paused/stopped remotely or hits its TTL.\n await vm.refresh();\n if (vm.status === 'running') return;\n if (vm.status === 'paused') {\n await vm.resume();\n } else if (vm.status === 'stopped' || vm.status === 'exited') {\n await vm.start();\n }\n}\n\nfunction requireVm(sandbox: ArchilSandbox, action: 'pause' | 'resume'): ArchilVm {\n if (!sandbox.vm) {\n throw new Error(\n `Archil disk exec handles cannot ${action}; create a persistent VM (ephemeral: false) instead.`,\n );\n }\n return sandbox.vm;\n}\n\n// Archil rejects deleting a live sandbox, so stop it first. A sandbox with\n// live forks returns 409: forks (snapshots) must be deleted before their parent.\nasync function stopAndDeleteVm(vm: ArchilVm): Promise<void> {\n if (vm.status === 'deleting' || vm.status === 'deleted') return;\n try {\n if (vm.status !== 'stopped' && vm.status !== 'exited' && vm.status !== 'failed') {\n await vm.stop();\n }\n await vm.delete();\n } catch (error) {\n if (error instanceof ArchilError && error.status === 404) return;\n if (error instanceof ArchilError && error.status === 409) {\n throw new Error(\n `Archil refused to delete sandbox ${vm.id} (409): ${error.message}. ` +\n 'Delete its forks and snapshots first; Archil deletes forks before their parent.',\n );\n }\n throw error;\n }\n}\n\nfunction toSandboxRequest(options?: ArchilCreateOptions): ArchilSandboxRequest {\n const request: ArchilSandboxRequest = {\n ...options?.sandbox,\n name: options?.name,\n baseImage: options?.baseImage ?? options?.image ?? options?.templateId,\n env: options?.env ?? options?.envs,\n vcpuCount: options?.vcpuCount ?? options?.vcpu_count ??\n options?.vcpus ?? options?.cpu ?? options?.cpus ?? options?.sandbox?.vcpuCount,\n memSizeMiB: options?.memSizeMiB ?? options?.mem_size_mib ??\n options?.memoryMiB ?? options?.memory ?? options?.memoryMb ?? options?.memMiB ??\n options?.sandbox?.memSizeMiB,\n };\n if (options?.maxTtlSeconds !== undefined) {\n request.maxTtlSeconds = options.maxTtlSeconds;\n } else if (options?.timeout !== undefined) {\n // CreateInstanceOptions.timeout is milliseconds; Archil's TTL is seconds.\n request.maxTtlSeconds = Math.ceil(options.timeout / 1000);\n }\n return request;\n}\n\n// Snapshots are paused forks named with this prefix, which is how\n// snapshot.list() finds them and instances.list() leaves them out.\nconst SNAPSHOT_NAME_PREFIX = 'csdk-snap-';\n\nfunction snapshotName(name?: string): string {\n const suffix = randomUUID().slice(0, 8);\n const slug = (name ?? '')\n .toLowerCase()\n .replace(/[^a-z0-9-]+/g, '-')\n .replace(/^-+|-+$/g, '')\n .slice(0, 63 - SNAPSHOT_NAME_PREFIX.length - suffix.length - 1)\n .replace(/-+$/g, '');\n return `${SNAPSHOT_NAME_PREFIX}${slug ? `${slug}-` : ''}${suffix}`;\n}\n\nfunction isSnapshotVm(vm: ArchilVm): boolean {\n return vm.name?.startsWith(SNAPSHOT_NAME_PREFIX) ?? false;\n}\n\n// Archil disk ids look like `dsk-…`; sandbox ids are UUIDs.\nfunction isDiskId(id: string): boolean {\n return id.startsWith('dsk-');\n}\n\n// Records each handle's effective mode so `destroy` — which only receives an\n// id — treats it correctly even when the mode came from a per-sandbox\n// `ephemeral` override rather than the provider config.\nconst sandboxModes = new Map<string, ArchilExecutionMode>();\n\nfunction modeForId(id: string, resolved: ResolvedConfig): ArchilExecutionMode {\n return sandboxModes.get(id) ?? (isDiskId(id) ? 'exec' : resolved.execution);\n}\n\nfunction diskInstance(\n client: ArchilClient,\n disk: DiskHandle | DiskResponse,\n resolved: ResolvedConfig,\n): ArchilSandbox {\n return { client, disk, resolved, createdAt: new Date() };\n}\n\nconst TIMEOUT_EXIT_CODE = 124;\nconst KILLED_EXIT_CODE = 137;\n\ninterface VmProcessOutcome {\n exitCode: number;\n signal: string | null;\n stderrSuffix: string;\n}\n\nfunction mapProcessResult(\n result: SandboxProcessResult,\n timedOut: boolean,\n killSignal: string | null,\n): VmProcessOutcome {\n if (timedOut || result.status === 'timed_out') {\n return { exitCode: TIMEOUT_EXIT_CODE, signal: 'SIGKILL', stderrSuffix: '' };\n }\n if (result.status === 'cancelled') {\n return { exitCode: KILLED_EXIT_CODE, signal: killSignal ?? 'SIGKILL', stderrSuffix: '' };\n }\n if (result.status === 'failed') {\n return {\n exitCode: result.exitCode ?? 1,\n signal: null,\n stderrSuffix: result.exitReason ?? '',\n };\n }\n // Archil reports a process that died from a signal as exit code -1.\n return { exitCode: result.exitCode ?? 0, signal: null, stderrSuffix: '' };\n}\n\n/**\n * Starts a process through Archil's native process API with incremental\n * output decoding. The returned `done` promise settles with the mapped result.\n */\nasync function startVmProcess(\n vm: ArchilVm,\n command: string,\n options: {\n cwd?: string;\n env?: Record<string, string>;\n timeout?: number;\n onStdout?: (chunk: string) => void;\n onStderr?: (chunk: string) => void;\n },\n) {\n await ensureVmRunning(vm);\n const decoders = { stdout: new TextDecoder(), stderr: new TextDecoder() };\n const output = { stdout: '', stderr: '' };\n const emit = (stream: 'stdout' | 'stderr', text: string) => {\n if (!text) return;\n output[stream] += text;\n (stream === 'stdout' ? options.onStdout : options.onStderr)?.(text);\n };\n const proc = await vm.processes.start(withCwd(command, options.cwd), {\n env: options.env,\n collectOutput: false,\n timeoutSeconds:\n options.timeout !== undefined ? Math.max(1, Math.ceil(options.timeout / 1000)) : undefined,\n onOutput: (chunk) => emit(chunk.stream, decoders[chunk.stream].decode(chunk.data, { stream: true })),\n });\n\n const state = { timedOut: false, killSignal: null as string | null };\n let timer: ReturnType<typeof setTimeout> | undefined;\n if (options.timeout !== undefined) {\n // The server-side deadline has one-second granularity; kill at the exact\n // millisecond deadline as well.\n timer = setTimeout(() => {\n state.timedOut = true;\n proc.kill().catch(() => {});\n }, options.timeout);\n }\n\n const done = proc\n .wait()\n .then((result) => {\n emit('stdout', decoders.stdout.decode());\n emit('stderr', decoders.stderr.decode());\n const mapped = mapProcessResult(result, state.timedOut, state.killSignal);\n return {\n stdout: output.stdout,\n stderr: mapped.stderrSuffix\n ? `${output.stderr}${output.stderr && !output.stderr.endsWith('\\n') ? '\\n' : ''}${mapped.stderrSuffix}`\n : output.stderr,\n exitCode: mapped.exitCode,\n signal: mapped.signal,\n };\n })\n .catch((error: unknown) => ({\n stdout: output.stdout,\n stderr: `${output.stderr}${error instanceof Error ? error.message : String(error)}`,\n exitCode: 1,\n signal: null as string | null,\n }))\n .finally(() => {\n if (timer) clearTimeout(timer);\n });\n\n return { proc, done, state, output };\n}\n\nasync function runVmCommand(\n vm: ArchilVm,\n command: string,\n options?: RunCommandOptions,\n): Promise<CommandResult> {\n const startTime = Date.now();\n if (options?.background) {\n // A process started over the native API keeps running after the client\n // disconnects.\n await ensureVmRunning(vm);\n const proc = await vm.processes.start(withCwd(command, options.cwd), {\n env: options.env,\n collectOutput: false,\n });\n await proc.disconnect();\n return { stdout: '', stderr: '', exitCode: 0, durationMs: Date.now() - startTime };\n }\n const { done } = await startVmProcess(vm, command, {\n cwd: options?.cwd,\n env: options?.env,\n timeout: options?.timeout,\n onStdout: options?.onStdout,\n onStderr: options?.onStderr,\n });\n const result = await done;\n return {\n stdout: result.stdout,\n stderr: result.stderr,\n exitCode: result.exitCode,\n durationMs: Date.now() - startTime,\n };\n}\n\nfunction commandError(error: unknown, startTime: number): CommandResult {\n return {\n stdout: '',\n stderr: error instanceof Error ? error.message : String(error),\n exitCode: 1,\n durationMs: Date.now() - startTime,\n };\n}\n\nfunction resolveSizingExecution(\n config: ArchilConfig,\n options?: { ephemeral?: boolean },\n): ArchilExecutionMode {\n if (options?.ephemeral !== undefined) return options.ephemeral ? 'exec' : 'persistent';\n return resolveExecution(config);\n}\n\nconst _provider = defineProvider<ArchilSandbox, ArchilConfig>({\n name: 'archil',\n sizes: (config, profile, options) => {\n if (options?.sandbox !== undefined && (options.sandbox === null || typeof options.sandbox !== 'object' || Array.isArray(options.sandbox))) {\n throw new InstanceSizeError('invalid', 'sandbox must be an object when requesting sizeClass');\n }\n if (options?.vcpuCount !== undefined || options?.memSizeMiB !== undefined ||\n options?.vcpu_count !== undefined || options?.mem_size_mib !== undefined ||\n options?.sandbox?.vcpu_count !== undefined || options?.sandbox?.mem_size_mib !== undefined ||\n options?.sandbox?.vcpuCount !== undefined || options?.sandbox?.memSizeMiB !== undefined) {\n throw new InstanceSizeError('conflict', 'cannot combine sizeClass with native Archil CPU/memory fields');\n }\n if (options?.snapshotId !== undefined || options?.sandboxId !== undefined || options?.instanceId !== undefined) {\n return { status: 'unsupported', reason: 'Archil attach/fork does not apply CPU/RAM overrides; create a new persistent VM to request a standard size.' };\n }\n if (resolveSizingExecution(config, options) !== 'persistent') {\n return { status: 'unavailable', reason: 'Archil exec containers do not expose VM sizing. Drop execution: \"exec\" (persistent VMs are the default) or set ephemeral: false.' };\n }\n if (profile.sizeClass === 'xs' || profile.sizeClass === '2xl') {\n return { status: 'unknown', reason: 'This adapter has not verified this standard shape.' };\n }\n return { status: 'supported', nativeOptions: { vcpus: profile.vcpus, memoryMiB: profile.memoryMiB } };\n },\n methods: {\n instances: {\n create: async (config: ArchilConfig, options?: ArchilCreateOptions) => {\n const resolved = resolveConfig(config);\n const client = createClient(config, resolved);\n\n // `ephemeral` on create() overrides the configured mode for this\n // sandbox: true -> disk exec handle, false -> persistent VM.\n const execution =\n options?.ephemeral !== undefined\n ? options.ephemeral\n ? 'exec'\n : 'persistent'\n : resolved.execution;\n\n if (options?.snapshotId && execution === 'exec') {\n throw new Error(\n 'Archil snapshots fork persistent VMs and cannot be restored in exec mode. Drop execution: \"exec\" / ephemeral: true.',\n );\n }\n\n if (execution === 'exec') {\n const diskId = resolveCreateDiskId(options);\n sandboxModes.set(diskId, 'exec');\n return { instance: diskInstance(client, { id: diskId }, resolved), instanceId: diskId };\n }\n\n if (options?.diskId) {\n throw new Error(\n 'Archil create({ diskId }) attaches a disk exec handle, which is opt-in now that persistent VMs are the default.\\n\\n' +\n 'Opt in with archil({ execution: \"exec\" }) (or ARCHIL_EXECUTION=exec), or pass ephemeral: true.',\n );\n }\n\n let vm: ArchilVm;\n if (options?.snapshotId) {\n // A snapshot is a paused fork; forking it again yields an independent\n // writable VM resumed from the snapshot's memory and disk state.\n const source = await client.sandboxes.get(options.snapshotId);\n vm = await source.fork({ name: options?.name });\n } else if (options?.sandboxId) {\n // Attach to a live sandbox. Refuse an abort signal here: the\n // sandbox manager destroys a resolved sandbox after an abort,\n // which would delete a sandbox this call did not create.\n if (options?.signal) {\n throw new Error(\n 'create({ sandboxId }) attaches to an existing sandbox and cannot be combined with an abort signal',\n );\n }\n vm = await client.sandboxes.get(options.sandboxId);\n await ensureVmRunning(vm);\n } else {\n vm = await client.sandboxes.create(toSandboxRequest(options), {\n wait: true,\n });\n }\n if (vm.status === 'failed') {\n throw new Error(`Archil sandbox ${vm.id} failed to start${vm.exitReason ? `: ${vm.exitReason}` : ''}`);\n }\n sandboxModes.set(vm.id, 'persistent');\n return { instance: vmInstance(client, vm, resolved), instanceId: vm.id };\n },\n\n getById: async (config: ArchilConfig, sandboxId: string) => {\n const resolved = resolveConfig(config);\n const client = createClient(config, resolved);\n try {\n if (modeForId(sandboxId, resolved) === 'exec') {\n const disk = await client.disks.get(sandboxId);\n return { instance: diskInstance(client, disk, resolved), instanceId: disk.id };\n }\n const vm = await client.sandboxes.get(sandboxId);\n await ensureVmRunning(vm);\n return { instance: vmInstance(client, vm, resolved), instanceId: vm.id };\n } catch {\n return null;\n }\n },\n\n // Archil's list endpoints return every sandbox (and the SDK follows disk\n // pagination), so a single call yields the full account listing.\n list: async (config: ArchilConfig) => {\n const resolved = resolveConfig(config);\n const client = createClient(config, resolved);\n if (resolved.execution === 'exec') {\n const disks = await client.disks.list();\n return disks.map((disk) => ({ instance: diskInstance(client, disk, resolved), instanceId: disk.id }));\n }\n const vms = await client.sandboxes.list();\n return vms\n .filter((vm) => !isSnapshotVm(vm) && vm.status !== 'deleting' && vm.status !== 'deleted')\n .map((vm) => ({ instance: vmInstance(client, vm, resolved), instanceId: vm.id }));\n },\n\n destroy: async (config: ArchilConfig, sandboxId: string) => {\n const resolved = resolveConfig(config);\n // exec handles are disk references — Archil disks have an independent\n // lifecycle, so destroying them is a no-op.\n const mode = modeForId(sandboxId, resolved);\n sandboxModes.delete(sandboxId);\n if (mode === 'exec') return;\n const client = createClient(config, resolved);\n let vm: ArchilVm;\n try {\n vm = await client.sandboxes.get(sandboxId);\n } catch (error) {\n if (error instanceof ArchilError && (error.status === 404 || error.status === 400)) return;\n throw error;\n }\n await stopAndDeleteVm(vm);\n },\n\n runCommand: async (\n sandbox: ArchilSandbox,\n command: string,\n options?: RunCommandOptions,\n ): Promise<CommandResult> => {\n const startTime = Date.now();\n try {\n if (sandbox.vm) {\n const { onStdout: _out, onStderr: _err, ...rest } = options ?? {};\n return await runVmCommand(sandbox.vm, command, rest);\n }\n const result = await execOnDisk(sandbox, wrapCommand(command, options));\n return {\n stdout: result.stdout ?? '',\n stderr: result.stderr ?? '',\n exitCode: result.exitCode,\n durationMs: Date.now() - startTime,\n };\n } catch (error) {\n return commandError(error, startTime);\n }\n },\n\n // Persistent VMs stream through the process WebSocket. Disk exec only\n // returns output once the command exits, so it is delivered at the end.\n streamCommand: async (\n sandbox: ArchilSandbox,\n command: string,\n options: RunCommandOptions,\n ): Promise<CommandResult> => {\n const startTime = Date.now();\n try {\n if (sandbox.vm) return await runVmCommand(sandbox.vm, command, options);\n const result = await execOnDisk(sandbox, wrapCommand(command, options));\n if (result.stdout) options.onStdout?.(result.stdout);\n if (result.stderr) options.onStderr?.(result.stderr);\n return {\n stdout: result.stdout ?? '',\n stderr: result.stderr ?? '',\n exitCode: result.exitCode,\n durationMs: Date.now() - startTime,\n };\n } catch (error) {\n return commandError(error, startTime);\n }\n },\n\n startProcess: async (\n sandbox: ArchilSandbox,\n command: string,\n options: StartProcessOptions,\n ): Promise<ProcessHandle> => {\n if (!sandbox.vm) {\n throw new Error(\n 'Archil exec mode runs each command in a fresh container, so it cannot host background processes. Use a persistent VM (the default).',\n );\n }\n const startTime = Date.now();\n const { proc, done, state, output } = await startVmProcess(sandbox.vm, command, {\n cwd: options.cwd,\n env: options.env,\n onStdout: options.onStdout,\n onStderr: options.onStderr,\n });\n // Without stdin: true the process sees EOF, as with `< /dev/null`.\n if (!options.stdin) await proc.closeStdin().catch(() => {});\n\n let exited: (typeof done extends Promise<infer R> ? R : never) | undefined;\n const finished = done.then((result) => {\n exited = result;\n options.onExit?.({ exitCode: result.exitCode, signal: result.signal });\n return result;\n });\n const toResult = (result: Awaited<typeof done>) => ({\n stdout: result.stdout,\n stderr: result.stderr,\n exitCode: result.exitCode,\n signal: result.signal,\n durationMs: Date.now() - startTime,\n });\n\n return {\n pid: null,\n jobId: proc.id,\n runtime: 'native',\n write: async (data) => {\n if (!options.stdin) {\n throw new Error('Process was started without stdin: true');\n }\n await proc.sendInput(data);\n },\n closeStdin: async () => {\n if (options.stdin && !exited) await proc.closeStdin();\n },\n status: async () =>\n exited\n ? { status: 'exited', exitCode: exited.exitCode, signal: exited.signal, stdout: exited.stdout, stderr: exited.stderr }\n : { status: 'running', exitCode: null, signal: null, stdout: output.stdout, stderr: output.stderr },\n wait: async (waitOptions) => {\n if (waitOptions?.timeout === undefined) return toResult(await finished);\n let timer: ReturnType<typeof setTimeout> | undefined;\n const timeout = new Promise<never>((_, reject) => {\n timer = setTimeout(\n () => reject(new Error(`Process ${proc.id} did not exit within ${waitOptions.timeout}ms`)),\n waitOptions.timeout,\n );\n });\n try {\n return toResult(await Promise.race([finished, timeout]));\n } finally {\n clearTimeout(timer);\n }\n },\n // Archil's process control only cancels (SIGKILL semantics); the\n // requested signal name is what the result reports.\n kill: async (signal) => {\n if (exited) return;\n state.killSignal = signal ?? 'SIGKILL';\n await proc.kill();\n },\n };\n },\n\n getInfo: async (sandbox: ArchilSandbox): Promise<InstanceInfo> => {\n if (sandbox.vm) {\n const vm = sandbox.vm;\n return {\n id: vm.id,\n provider: 'archil',\n status:\n vm.status === 'running'\n ? 'running'\n : vm.status === 'failed'\n ? 'error'\n : 'stopped',\n createdAt: vm.createdAt,\n timeout: vm.maxTtlSeconds * 1000,\n metadata: {\n name: vm.name,\n archilStatus: vm.status,\n vcpuCount: vm.vcpuCount,\n memSizeMiB: vm.memSizeMiB,\n baseImage: vm.baseImage,\n platform: vm.platform,\n },\n };\n }\n const diskInfo = 'status' in sandbox.disk ? sandbox.disk : undefined;\n return {\n id: sandbox.disk.id,\n provider: 'archil',\n status: !diskInfo || diskInfo.status === 'ready' ? 'running' : 'stopped',\n createdAt: diskInfo ? new Date(diskInfo.createdAt) : sandbox.createdAt,\n timeout: 0,\n metadata: diskInfo\n ? {\n name: diskInfo.name,\n organization: diskInfo.organization,\n region: diskInfo.region,\n provider: diskInfo.provider,\n }\n : {},\n };\n },\n\n getUrl: async (\n sandbox: ArchilSandbox,\n options: { port: number; protocol?: string },\n ): Promise<string> => {\n if (sandbox.vm) {\n await sandbox.vm.refresh();\n const endpoint = sandbox.vm.endpoints?.find(\n (e) => e.port === options.port,\n );\n if (!endpoint) {\n throw new Error(\n `No endpoint exposed on port ${options.port} for Archil sandbox ${sandbox.vm.id}.`,\n );\n }\n return `${options.protocol ?? 'https'}://${endpoint.hostname}`;\n }\n throw new Error(\n `Archil exec runs each command in a fresh ephemeral container that exits when the command returns, ` +\n `so there is no long-lived process to expose port ${options.port} on. ` +\n `getUrl is not supported.`,\n );\n },\n\n filesystem: {\n readFile: async (sandbox, path, runCommand) => {\n if (sandbox.vm) {\n const chunks: Buffer[] = [];\n try {\n await sandbox.vm.files.downloadFile(path, (chunk) => {\n chunks.push(Buffer.from(chunk));\n });\n } catch (error) {\n throw new Error(\n `Failed to read ${path}: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n return Buffer.concat(chunks).toString('utf8');\n }\n const diskPath = mapFilesystemPath(sandbox, path);\n const sizeResult = await runCommand(\n sandbox,\n `wc -c < ${shellEscape(diskPath)}`,\n );\n if (sizeResult.exitCode !== 0) {\n throw new Error(`Failed to read ${path}: ${sizeResult.stderr}`);\n }\n\n const sizeText = sizeResult.stdout.trim();\n if (!/^\\d+$/.test(sizeText)) {\n throw new Error(\n `Failed to read ${path}: Archil returned an invalid file size.`,\n );\n }\n\n const size = Number(sizeText);\n if (!Number.isSafeInteger(size)) {\n throw new Error(\n `Failed to read ${path}: file size exceeds JavaScript's safe integer range.`,\n );\n }\n if (size === 0) return '';\n\n const chunks: Buffer[] = [];\n for (\n let offset = 0;\n offset < size;\n offset += ARCHIL_MAX_READ_CHUNK_BYTES\n ) {\n const expectedBytes = Math.min(\n ARCHIL_MAX_READ_CHUNK_BYTES,\n size - offset,\n );\n const result = await runCommand(\n sandbox,\n `dd if=${shellEscape(diskPath)} bs=1 skip=${offset} count=${expectedBytes} 2>/dev/null | base64`,\n );\n if (result.exitCode !== 0) {\n throw new Error(`Failed to read ${path}: ${result.stderr}`);\n }\n\n const encoded = result.stdout.replace(/\\s/g, '');\n if (\n encoded.length === 0 ||\n encoded.length % 4 !== 0 ||\n !/^[A-Za-z0-9+/]*={0,2}$/.test(encoded)\n ) {\n throw new Error(\n `Failed to read ${path}: Archil returned an incomplete file chunk at byte ${offset}.`,\n );\n }\n\n const chunk = Buffer.from(encoded, 'base64');\n if (chunk.length !== expectedBytes) {\n throw new Error(\n `Failed to read ${path}: Archil returned an incomplete file chunk at byte ${offset}.`,\n );\n }\n chunks.push(chunk);\n }\n\n return Buffer.concat(chunks).toString('utf8');\n },\n\n writeFile: async (sandbox, path, content, runCommand) => {\n if (sandbox.vm) {\n try {\n await sandbox.vm.files.uploadFile(\n Buffer.from(content, 'utf8'),\n path,\n );\n } catch (error) {\n throw new Error(\n `Failed to write ${path}: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n return;\n }\n const diskPath = mapFilesystemPath(sandbox, path);\n const parent = posix.dirname(diskPath);\n const encoded = Buffer.from(content, 'utf8').toString('base64');\n const tempPath = `${diskPath}.computesdk-write-${randomUUID()}`;\n let started = false;\n\n try {\n if (encoded.length === 0) {\n started = true;\n const result = await runCommand(\n sandbox,\n withDiskWriteLock(\n sandbox,\n [\n `mkdir -p ${shellEscape(parent)}`,\n `: > ${shellEscape(tempPath)}`,\n finalizeStagedFileCommand(tempPath, diskPath),\n ].join(' && '),\n ),\n );\n if (result.exitCode !== 0) {\n throw new Error(result.stderr);\n }\n return;\n }\n\n const chunkSize = maxWriteChunkSize(parent, tempPath, diskPath);\n for (let offset = 0; offset < encoded.length; offset += chunkSize) {\n const isFirst = offset === 0;\n const isFinal = offset + chunkSize >= encoded.length;\n started = true;\n const result = await runCommand(\n sandbox,\n withDiskWriteLock(\n sandbox,\n buildWriteChunkCommand(\n parent,\n tempPath,\n diskPath,\n encoded.slice(offset, offset + chunkSize),\n isFirst,\n isFinal,\n ),\n ),\n );\n if (result.exitCode !== 0) {\n throw new Error(result.stderr);\n }\n }\n } catch (error) {\n if (started) {\n try {\n await runCommand(\n sandbox,\n withDiskWriteLock(sandbox, `rm -f ${shellEscape(tempPath)}`),\n );\n } catch {\n // Preserve the original write error if cleanup fails.\n }\n }\n throw new Error(\n `Failed to write ${path}: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n },\n\n mkdir: async (sandbox, path, runCommand) => {\n const diskPath = mapFilesystemPath(sandbox, path);\n const result = await runCommand(\n sandbox,\n withDiskWriteLock(sandbox, `mkdir -p ${shellEscape(diskPath)}`),\n );\n if (result.exitCode !== 0) {\n throw new Error(`Failed to create directory ${path}: ${result.stderr}`);\n }\n },\n\n readdir: async (sandbox, path, runCommand) => {\n const diskPath = mapFilesystemPath(sandbox, path);\n // Tab-separated: type<TAB>size<TAB>mtime-iso<TAB>name. Robust to spaces in names.\n const result = await runCommand(\n sandbox,\n `find ${shellEscape(diskPath)} -mindepth 1 -maxdepth 1 -printf '%y\\t%s\\t%T@\\t%f\\n'`,\n );\n if (result.exitCode !== 0) {\n throw new Error(`Failed to list directory ${path}: ${result.stderr}`);\n }\n const entries: FileEntry[] = [];\n for (const line of result.stdout.split('\\n')) {\n if (!line) continue;\n const [typeChar, sizeStr, mtimeStr, ...nameParts] = line.split('\\t');\n const name = nameParts.join('\\t');\n entries.push({\n name,\n type: typeChar === 'd' ? 'directory' : 'file',\n size: parseInt(sizeStr, 10) || 0,\n modified: new Date(parseFloat(mtimeStr) * 1000),\n });\n }\n return entries;\n },\n\n exists: async (sandbox, path, runCommand) => {\n const diskPath = mapFilesystemPath(sandbox, path);\n const result = await runCommand(sandbox, `test -e ${shellEscape(diskPath)}`);\n return result.exitCode === 0;\n },\n\n remove: async (sandbox, path, runCommand) => {\n const diskPath = mapFilesystemPath(sandbox, path);\n if (!sandbox.vm && diskPath === ARCHIL_MOUNT_ROOT) {\n throw new Error('Refusing to remove the Archil disk mount root.');\n }\n const result = await runCommand(\n sandbox,\n withDiskWriteLock(sandbox, `rm -rf ${shellEscape(diskPath)}`),\n );\n if (result.exitCode !== 0) {\n throw new Error(`Failed to remove ${path}: ${result.stderr}`);\n }\n },\n },\n\n // Native pause keeps CPU and memory: files anywhere (including /tmp)\n // and running processes survive. Processes must outlive the command\n // that started them (startProcess, or setsid): Archil reaps a command's\n // process group when it exits. Disk exec handles have no VM to pause.\n pause: async (sandbox: ArchilSandbox) => {\n await requireVm(sandbox, 'pause').pause();\n },\n\n resume: async (sandbox: ArchilSandbox) => {\n await requireVm(sandbox, 'resume').resume();\n },\n\n pauseCapabilities: { memory: true, createOptions: { ephemeral: false } },\n\n getInstance: (sandbox: ArchilSandbox): ArchilSandbox => sandbox,\n },\n\n // Archil has no separate snapshot resource. A snapshot is a fork of the\n // source VM (memory and disk), paused so it holds state without running,\n // and named with SNAPSHOT_NAME_PREFIX so it can be listed. create({\n // snapshotId }) forks it again. Forks must be deleted before their parent.\n snapshot: {\n // A fork copies the VM's memory and whole disk, so restores keep the\n // rootfs (including /tmp) and running processes; the source keeps running.\n capabilities: {\n scope: 'rootfs',\n memory: true,\n destroysSource: false,\n createOptions: { ephemeral: false },\n },\n\n create: async (\n config: ArchilConfig,\n sandboxId: string,\n options?: { name?: string },\n ) => {\n const resolved = resolveConfig(config);\n const client = createClient(config, resolved);\n let fork: ArchilVm | undefined;\n try {\n const source = await client.sandboxes.get(sandboxId);\n fork = await source.fork({ name: snapshotName(options?.name) });\n if (fork.status === 'running') await fork.pause();\n return {\n id: fork.id,\n provider: 'archil',\n createdAt: fork.createdAt ?? new Date(),\n metadata: { name: options?.name, archilName: fork.name, sourceId: sandboxId },\n };\n } catch (error) {\n if (fork) await stopAndDeleteVm(fork).catch(() => {});\n throw new Error(\n `Failed to create Archil snapshot: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n },\n\n list: async (config: ArchilConfig) => {\n const resolved = resolveConfig(config);\n const client = createClient(config, resolved);\n const vms = await client.sandboxes.list();\n return vms\n .filter((vm) => isSnapshotVm(vm) && vm.status !== 'deleting' && vm.status !== 'deleted')\n .map((vm) => ({\n id: vm.id,\n provider: 'archil',\n createdAt: vm.createdAt,\n metadata: { archilName: vm.name, archilStatus: vm.status },\n }));\n },\n\n delete: async (config: ArchilConfig, snapshotId: string) => {\n const resolved = resolveConfig(config);\n const client = createClient(config, resolved);\n let vm: ArchilVm;\n try {\n vm = await client.sandboxes.get(snapshotId);\n } catch (error) {\n if (error instanceof ArchilError && error.status === 404) return;\n throw error;\n }\n await stopAndDeleteVm(vm);\n },\n },\n },\n});\n\nexport const archil = (config: ArchilConfig = {}) => _provider(config);\n\nexport type { ArchilSandbox };\n"],"mappings":"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","names":["ArchilClient","exports","chunks"]}
package/dist/index.mjs CHANGED
@@ -217,8 +217,8 @@ function toSandboxRequest(options) {
217
217
  name: options?.name,
218
218
  baseImage: options?.baseImage ?? options?.image ?? options?.templateId,
219
219
  env: options?.env ?? options?.envs,
220
- vcpuCount: options?.vcpus ?? options?.cpu ?? options?.cpus,
221
- memSizeMiB: options?.memoryMiB ?? options?.memory
220
+ vcpuCount: options?.vcpuCount ?? options?.vcpu_count ?? options?.vcpus ?? options?.cpu ?? options?.cpus ?? options?.sandbox?.vcpuCount,
221
+ memSizeMiB: options?.memSizeMiB ?? options?.mem_size_mib ?? options?.memoryMiB ?? options?.memory ?? options?.memoryMb ?? options?.memMiB ?? options?.sandbox?.memSizeMiB
222
222
  };
223
223
  if (options?.maxTtlSeconds !== void 0) {
224
224
  request.maxTtlSeconds = options.maxTtlSeconds;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["/**\n * Archil Provider\n *\n * Archil sandboxes are persistent Linux VMs (Firecracker, durable root\n * filesystem), and that is what this provider creates by default. Commands,\n * streaming and background processes run through Archil's native process API\n * (a WebSocket fetched fresh per process via POST\n * /api/sandboxes/{id}/connections); files move through its native file\n * transfer API; snapshots are paused forks restored with create({ snapshotId }).\n *\n * The older disk exec surface — each command runs in a fresh Archil-managed\n * container with a disk mounted at /mnt/archil — is opt-in with\n * `execution: \"exec\"` (or ARCHIL_EXECUTION=exec) plus a disk id.\n */\n\nimport { defineProvider, InstanceSizeError } from '@computesdk/provider';\nimport { Archil as ArchilClient, ArchilError } from 'disk';\nimport type {\n CreateSandboxRequest as ArchilSandboxRequest,\n Sandbox as ArchilVm,\n SandboxProcessResult,\n} from 'disk';\nimport { randomUUID } from 'node:crypto';\nimport { posix } from 'node:path';\nimport type {\n CommandResult,\n InstanceInfo,\n CreateInstanceOptions,\n FileEntry,\n ProcessHandle,\n RunCommandOptions,\n StartProcessOptions,\n} from 'computesdk';\n\nconst ARCHIL_MOUNT_ROOT = '/mnt/archil';\nconst ARCHIL_MAX_EXEC_COMMAND_BYTES = 102_400;\n// Base64 expands the file data and adds line wrapping. Keep the raw chunk\n// comfortably below Archil's roughly 4 MiB response cap.\nconst ARCHIL_MAX_READ_CHUNK_BYTES = 2 * 1024 * 1024;\n\n// Per-region color overrides. Default is \"green\" for any region not listed here.\nconst REGION_COLORS: Record<string, string> = {\n 'gcp-us-central1': 'blue',\n};\n\nfunction regionToBaseUrl(region: string): string {\n const dash = region.indexOf('-');\n if (dash <= 0 || dash === region.length - 1) {\n throw new Error(\n `Invalid Archil region \"${region}\". Expected \"{cloud}-{suffix}\", e.g. \"aws-us-east-1\".`,\n );\n }\n const cloud = region.slice(0, dash);\n const suffix = region.slice(dash + 1);\n const color = REGION_COLORS[region] ?? 'green';\n return `https://control.${color}.${suffix}.${cloud}.prod.archil.com`;\n}\n\n/**\n * Archil execution mode:\n * - \"persistent\" (default): a persistent sandbox VM run through the process API.\n * - \"exec\": serverless per-command containers on an existing disk (opt-in).\n */\nexport type ArchilExecutionMode = 'exec' | 'persistent';\n\nexport interface ArchilConfig {\n /** Archil API key. Falls back to ARCHIL_API_KEY env var. */\n apiKey?: string;\n /** Archil region (e.g. \"aws-us-east-1\"). Falls back to ARCHIL_REGION env var. */\n region?: string;\n /** Override the control-plane base URL (useful for testing). */\n baseUrl?: string;\n /**\n * Which Archil compute surface to use. Falls back to ARCHIL_EXECUTION, then\n * \"persistent\": create() provisions a persistent sandbox VM. \"exec\"\n * resolves create({ diskId }) to a disk exec handle instead. Per-sandbox\n * override: `ephemeral` on create() options (true -> exec handle, false ->\n * persistent VM).\n */\n execution?: ArchilExecutionMode;\n}\n\ninterface DiskResponse {\n id: string;\n name: string;\n organization: string;\n status: string;\n provider: string;\n region: string;\n createdAt: string;\n}\n\ntype DiskHandle = Pick<DiskResponse, 'id'>;\n\ninterface ExecTiming {\n totalMs: number;\n queueMs: number;\n executeMs: number;\n}\n\ninterface ExecResponse {\n exitCode: number;\n stdout: string;\n stderr: string;\n timing: ExecTiming;\n}\n\ninterface ResolvedConfig {\n apiKey: string;\n baseUrl: string;\n execution: ArchilExecutionMode;\n}\n\ninterface ArchilSandbox {\n client: ArchilClient;\n disk: DiskHandle | DiskResponse;\n /** Set only in \"persistent\" execution mode. */\n vm?: ArchilVm;\n resolved: ResolvedConfig;\n createdAt: Date;\n /** persistent mode: pause the VM, preserving CPU and memory state. */\n pause?: () => Promise<void>;\n /** persistent mode: resume the paused VM under the same sandbox id. */\n resume?: () => Promise<void>;\n}\n\nfunction vmInstance(\n client: ArchilClient,\n vm: ArchilVm,\n resolved: ResolvedConfig,\n): ArchilSandbox {\n return {\n client,\n disk: { id: vm.id },\n vm,\n resolved,\n createdAt: new Date(),\n pause: async () => {\n await vm.pause();\n },\n resume: async () => {\n await vm.resume();\n },\n };\n}\n\ninterface ArchilCreateOptions extends CreateInstanceOptions {\n /**\n * exec mode: id of the existing disk to run commands against. Required in\n * \"exec\" mode; ignored in \"persistent\" mode.\n */\n diskId?: string;\n /** persistent mode: OCI base image (e.g. \"node:24-bookworm\"). */\n baseImage?: string;\n /** persistent mode: environment variables baked into the sandbox. */\n env?: Record<string, string>;\n /** persistent mode: lifetime budget per powered-on session, in seconds. */\n maxTtlSeconds?: number;\n /** persistent mode: extra Archil sandbox fields (network policy, etc.). */\n sandbox?: Omit<\n ArchilSandboxRequest,\n 'name' | 'vcpuCount' | 'memSizeMiB' | 'baseImage' | 'env' | 'maxTtlSeconds'\n >;\n}\n\nfunction resolveConfig(config: ArchilConfig): ResolvedConfig {\n const apiKey = config.apiKey ?? process.env.ARCHIL_API_KEY;\n const region = config.region ?? process.env.ARCHIL_REGION;\n\n if (!apiKey) {\n throw new Error(\n 'Missing API key for Archil.\\n\\n' +\n 'Pass it: archil({ apiKey: \"...\" })\\n' +\n 'Or set ARCHIL_API_KEY in your environment.',\n );\n }\n\n let baseUrl = config.baseUrl;\n if (!baseUrl) {\n if (!region) {\n throw new Error(\n 'Missing region for Archil.\\n\\n' +\n 'Pass it: archil({ region: \"...\" })\\n' +\n 'Or set ARCHIL_REGION in your environment.\\n' +\n 'Examples: \"aws-us-east-1\", \"aws-eu-west-1\", \"gcp-us-central1\".',\n );\n }\n baseUrl = regionToBaseUrl(region);\n }\n\n return { apiKey, baseUrl, execution: resolveExecution(config) };\n}\n\nfunction resolveExecution(config: ArchilConfig): ArchilExecutionMode {\n if (config.execution) return config.execution;\n const fromEnv = process.env.ARCHIL_EXECUTION?.trim().toLowerCase();\n if (!fromEnv) return 'persistent';\n if (fromEnv === 'exec' || fromEnv === 'persistent') return fromEnv;\n throw new Error(\n `Invalid ARCHIL_EXECUTION \"${process.env.ARCHIL_EXECUTION}\". Expected \"persistent\" (default) or \"exec\".`,\n );\n}\n\nfunction createClient(config: ArchilConfig, resolved: ResolvedConfig): ArchilClient {\n const region = config.region ?? process.env.ARCHIL_REGION ?? 'aws-us-east-1';\n return new ArchilClient({ ...resolved, region });\n}\n\nfunction resolveCreateDiskId(options?: ArchilCreateOptions): string {\n // `sandboxId` is accepted as an alias: exec-mode sandboxes are addressed by\n // their disk id.\n const diskId = options?.diskId ?? options?.sandboxId;\n\n if (!diskId) {\n throw new Error(\n 'Archil create() requires an existing disk id on the top-level options.\\n\\n' +\n 'Example:\\n' +\n ' provider.sandbox.create({ diskId: \"disk_abc123\" })',\n );\n }\n\n return diskId;\n}\n\n\nfunction shellEscape(value: string): string {\n return `'${value.replace(/'/g, `'\\\\''`)}'`;\n}\n\nfunction mapFilesystemPath(sandbox: ArchilSandbox, path: string): string {\n const normalized = posix.normalize(path.startsWith('/') ? path : `/${path}`);\n\n // In persistent mode the filesystem is the VM's own filesystem.\n if (sandbox.vm) {\n return normalized;\n }\n\n if (normalized === '/') {\n return ARCHIL_MOUNT_ROOT;\n }\n\n if (\n normalized === ARCHIL_MOUNT_ROOT ||\n normalized.startsWith(`${ARCHIL_MOUNT_ROOT}/`)\n ) {\n return normalized;\n }\n\n return `${ARCHIL_MOUNT_ROOT}${normalized}`;\n}\n\nfunction withDiskWriteLockCommand(command: string): string {\n const mountRoot = shellEscape(ARCHIL_MOUNT_ROOT);\n return [\n `archil checkout --force --yes ${mountRoot}`,\n `{ ${command}; status=$?; archil checkin ${mountRoot}; checkin_status=$?; ` +\n `if [ $status -ne 0 ]; then exit $status; fi; exit $checkin_status; }`,\n ].join(' && ');\n}\n\nfunction withDiskWriteLock(sandbox: ArchilSandbox, command: string): string {\n // Sandbox VMs have a dedicated disk — no shared-mode checkout needed.\n if (sandbox.vm) return command;\n return withDiskWriteLockCommand(command);\n}\n\nfunction execCommandBytes(command: string): number {\n return Buffer.byteLength(wrapCommand(command), 'utf8');\n}\n\nfunction buildWriteChunkCommand(\n parent: string,\n tempPath: string,\n diskPath: string,\n encodedChunk: string,\n isFirst: boolean,\n isFinal: boolean,\n): string {\n const writeCommand =\n `printf %s ${shellEscape(encodedChunk)} | base64 -d ` +\n `${isFirst ? '>' : '>>'} ${shellEscape(tempPath)}`;\n return [\n ...(isFirst ? [`mkdir -p ${shellEscape(parent)}`] : []),\n writeCommand,\n ...(isFinal\n ? [finalizeStagedFileCommand(tempPath, diskPath)]\n : []),\n ].join(' && ');\n}\n\nfunction finalizeStagedFileCommand(tempPath: string, diskPath: string): string {\n const quotedDestination = shellEscape(diskPath);\n return [\n `if [ -d ${quotedDestination} ]; then`,\n `printf '%s\\\\n' ${shellEscape(`Refusing to overwrite directory ${diskPath}`)} >&2;`,\n 'exit 1;',\n 'fi;',\n `mv ${shellEscape(tempPath)} ${quotedDestination}`,\n ].join(' ');\n}\n\nfunction maxWriteChunkSize(\n parent: string,\n tempPath: string,\n diskPath: string,\n): number {\n let low = 0;\n let high = ARCHIL_MAX_EXEC_COMMAND_BYTES;\n\n while (low < high) {\n const candidate = Math.ceil((low + high) / 2);\n const command = withDiskWriteLockCommand(\n buildWriteChunkCommand(\n parent,\n tempPath,\n diskPath,\n 'A'.repeat(candidate),\n true,\n true,\n ),\n );\n\n if (execCommandBytes(command) <= ARCHIL_MAX_EXEC_COMMAND_BYTES) {\n low = candidate;\n } else {\n high = candidate - 1;\n }\n }\n\n const chunkSize = low - (low % 4);\n if (chunkSize < 4) {\n throw new Error(\n `Archil filesystem path is too long to write within the ${ARCHIL_MAX_EXEC_COMMAND_BYTES}-byte exec command limit.`,\n );\n }\n return chunkSize;\n}\n\nfunction wrapCommand(command: string, options?: RunCommandOptions): string {\n let wrapped = command;\n\n if (options?.cwd) {\n wrapped = `cd ${shellEscape(options.cwd)} && ${wrapped}`;\n }\n\n const envEntries = Object.entries(options?.env ?? {});\n if (!envEntries.some(([key]) => key === 'HOME')) {\n envEntries.unshift(['HOME', process.env.HOME || '/tmp']);\n }\n // `export` instead of a `K=v cmd` prefix: an assignment prefix only binds a\n // simple command, so `K=v (a; b)` or `K=v { a; }` is a shell syntax error.\n const exports = envEntries\n .map(([k, v]) => `${k}=${shellEscape(String(v))}`)\n .join(' ');\n wrapped = `export ${exports}; ${wrapped}`;\n\n if (options?.background) {\n wrapped = `nohup sh -c ${shellEscape(wrapped)} > /dev/null 2>&1 &`;\n }\n\n return wrapped;\n}\n\nasync function execOnDisk(sandbox: ArchilSandbox, command: string): Promise<ExecResponse> {\n return sandbox.client.disks.exec(sandbox.disk.id, command);\n}\n\n// Runs the command from `cwd` without regrouping it: Archil hands the command\n// string to `/bin/sh -c`, and the newline keeps every part of a compound\n// command (`a; b`, `a || b`, pipelines) inside the new working directory. env\n// is passed natively to the process, so it reaches every part as well.\nfunction withCwd(command: string, cwd?: string): string {\n return cwd ? `cd ${shellEscape(cwd)} || exit 1\\n${command}` : command;\n}\n\nasync function ensureVmRunning(vm: ArchilVm): Promise<void> {\n // Refresh first: status on this handle is a local snapshot and goes stale\n // when the sandbox is paused/stopped remotely or hits its TTL.\n await vm.refresh();\n if (vm.status === 'running') return;\n if (vm.status === 'paused') {\n await vm.resume();\n } else if (vm.status === 'stopped' || vm.status === 'exited') {\n await vm.start();\n }\n}\n\nfunction requireVm(sandbox: ArchilSandbox, action: 'pause' | 'resume'): ArchilVm {\n if (!sandbox.vm) {\n throw new Error(\n `Archil disk exec handles cannot ${action}; create a persistent VM (ephemeral: false) instead.`,\n );\n }\n return sandbox.vm;\n}\n\n// Archil rejects deleting a live sandbox, so stop it first. A sandbox with\n// live forks returns 409: forks (snapshots) must be deleted before their parent.\nasync function stopAndDeleteVm(vm: ArchilVm): Promise<void> {\n if (vm.status === 'deleting' || vm.status === 'deleted') return;\n try {\n if (vm.status !== 'stopped' && vm.status !== 'exited' && vm.status !== 'failed') {\n await vm.stop();\n }\n await vm.delete();\n } catch (error) {\n if (error instanceof ArchilError && error.status === 404) return;\n if (error instanceof ArchilError && error.status === 409) {\n throw new Error(\n `Archil refused to delete sandbox ${vm.id} (409): ${error.message}. ` +\n 'Delete its forks and snapshots first; Archil deletes forks before their parent.',\n );\n }\n throw error;\n }\n}\n\nfunction toSandboxRequest(options?: ArchilCreateOptions): ArchilSandboxRequest {\n const request: ArchilSandboxRequest = {\n ...options?.sandbox,\n name: options?.name,\n baseImage: options?.baseImage ?? options?.image ?? options?.templateId,\n env: options?.env ?? options?.envs,\n vcpuCount: options?.vcpus ?? options?.cpu ?? options?.cpus,\n memSizeMiB: options?.memoryMiB ?? options?.memory,\n };\n if (options?.maxTtlSeconds !== undefined) {\n request.maxTtlSeconds = options.maxTtlSeconds;\n } else if (options?.timeout !== undefined) {\n // CreateInstanceOptions.timeout is milliseconds; Archil's TTL is seconds.\n request.maxTtlSeconds = Math.ceil(options.timeout / 1000);\n }\n return request;\n}\n\n// Snapshots are paused forks named with this prefix, which is how\n// snapshot.list() finds them and instances.list() leaves them out.\nconst SNAPSHOT_NAME_PREFIX = 'csdk-snap-';\n\nfunction snapshotName(name?: string): string {\n const suffix = randomUUID().slice(0, 8);\n const slug = (name ?? '')\n .toLowerCase()\n .replace(/[^a-z0-9-]+/g, '-')\n .replace(/^-+|-+$/g, '')\n .slice(0, 63 - SNAPSHOT_NAME_PREFIX.length - suffix.length - 1)\n .replace(/-+$/g, '');\n return `${SNAPSHOT_NAME_PREFIX}${slug ? `${slug}-` : ''}${suffix}`;\n}\n\nfunction isSnapshotVm(vm: ArchilVm): boolean {\n return vm.name?.startsWith(SNAPSHOT_NAME_PREFIX) ?? false;\n}\n\n// Archil disk ids look like `dsk-…`; sandbox ids are UUIDs.\nfunction isDiskId(id: string): boolean {\n return id.startsWith('dsk-');\n}\n\n// Records each handle's effective mode so `destroy` — which only receives an\n// id — treats it correctly even when the mode came from a per-sandbox\n// `ephemeral` override rather than the provider config.\nconst sandboxModes = new Map<string, ArchilExecutionMode>();\n\nfunction modeForId(id: string, resolved: ResolvedConfig): ArchilExecutionMode {\n return sandboxModes.get(id) ?? (isDiskId(id) ? 'exec' : resolved.execution);\n}\n\nfunction diskInstance(\n client: ArchilClient,\n disk: DiskHandle | DiskResponse,\n resolved: ResolvedConfig,\n): ArchilSandbox {\n return { client, disk, resolved, createdAt: new Date() };\n}\n\nconst TIMEOUT_EXIT_CODE = 124;\nconst KILLED_EXIT_CODE = 137;\n\ninterface VmProcessOutcome {\n exitCode: number;\n signal: string | null;\n stderrSuffix: string;\n}\n\nfunction mapProcessResult(\n result: SandboxProcessResult,\n timedOut: boolean,\n killSignal: string | null,\n): VmProcessOutcome {\n if (timedOut || result.status === 'timed_out') {\n return { exitCode: TIMEOUT_EXIT_CODE, signal: 'SIGKILL', stderrSuffix: '' };\n }\n if (result.status === 'cancelled') {\n return { exitCode: KILLED_EXIT_CODE, signal: killSignal ?? 'SIGKILL', stderrSuffix: '' };\n }\n if (result.status === 'failed') {\n return {\n exitCode: result.exitCode ?? 1,\n signal: null,\n stderrSuffix: result.exitReason ?? '',\n };\n }\n // Archil reports a process that died from a signal as exit code -1.\n return { exitCode: result.exitCode ?? 0, signal: null, stderrSuffix: '' };\n}\n\n/**\n * Starts a process through Archil's native process API with incremental\n * output decoding. The returned `done` promise settles with the mapped result.\n */\nasync function startVmProcess(\n vm: ArchilVm,\n command: string,\n options: {\n cwd?: string;\n env?: Record<string, string>;\n timeout?: number;\n onStdout?: (chunk: string) => void;\n onStderr?: (chunk: string) => void;\n },\n) {\n await ensureVmRunning(vm);\n const decoders = { stdout: new TextDecoder(), stderr: new TextDecoder() };\n const output = { stdout: '', stderr: '' };\n const emit = (stream: 'stdout' | 'stderr', text: string) => {\n if (!text) return;\n output[stream] += text;\n (stream === 'stdout' ? options.onStdout : options.onStderr)?.(text);\n };\n const proc = await vm.processes.start(withCwd(command, options.cwd), {\n env: options.env,\n collectOutput: false,\n timeoutSeconds:\n options.timeout !== undefined ? Math.max(1, Math.ceil(options.timeout / 1000)) : undefined,\n onOutput: (chunk) => emit(chunk.stream, decoders[chunk.stream].decode(chunk.data, { stream: true })),\n });\n\n const state = { timedOut: false, killSignal: null as string | null };\n let timer: ReturnType<typeof setTimeout> | undefined;\n if (options.timeout !== undefined) {\n // The server-side deadline has one-second granularity; kill at the exact\n // millisecond deadline as well.\n timer = setTimeout(() => {\n state.timedOut = true;\n proc.kill().catch(() => {});\n }, options.timeout);\n }\n\n const done = proc\n .wait()\n .then((result) => {\n emit('stdout', decoders.stdout.decode());\n emit('stderr', decoders.stderr.decode());\n const mapped = mapProcessResult(result, state.timedOut, state.killSignal);\n return {\n stdout: output.stdout,\n stderr: mapped.stderrSuffix\n ? `${output.stderr}${output.stderr && !output.stderr.endsWith('\\n') ? '\\n' : ''}${mapped.stderrSuffix}`\n : output.stderr,\n exitCode: mapped.exitCode,\n signal: mapped.signal,\n };\n })\n .catch((error: unknown) => ({\n stdout: output.stdout,\n stderr: `${output.stderr}${error instanceof Error ? error.message : String(error)}`,\n exitCode: 1,\n signal: null as string | null,\n }))\n .finally(() => {\n if (timer) clearTimeout(timer);\n });\n\n return { proc, done, state, output };\n}\n\nasync function runVmCommand(\n vm: ArchilVm,\n command: string,\n options?: RunCommandOptions,\n): Promise<CommandResult> {\n const startTime = Date.now();\n if (options?.background) {\n // A process started over the native API keeps running after the client\n // disconnects.\n await ensureVmRunning(vm);\n const proc = await vm.processes.start(withCwd(command, options.cwd), {\n env: options.env,\n collectOutput: false,\n });\n await proc.disconnect();\n return { stdout: '', stderr: '', exitCode: 0, durationMs: Date.now() - startTime };\n }\n const { done } = await startVmProcess(vm, command, {\n cwd: options?.cwd,\n env: options?.env,\n timeout: options?.timeout,\n onStdout: options?.onStdout,\n onStderr: options?.onStderr,\n });\n const result = await done;\n return {\n stdout: result.stdout,\n stderr: result.stderr,\n exitCode: result.exitCode,\n durationMs: Date.now() - startTime,\n };\n}\n\nfunction commandError(error: unknown, startTime: number): CommandResult {\n return {\n stdout: '',\n stderr: error instanceof Error ? error.message : String(error),\n exitCode: 1,\n durationMs: Date.now() - startTime,\n };\n}\n\nfunction resolveSizingExecution(\n config: ArchilConfig,\n options?: { ephemeral?: boolean },\n): ArchilExecutionMode {\n if (options?.ephemeral !== undefined) return options.ephemeral ? 'exec' : 'persistent';\n return resolveExecution(config);\n}\n\nconst _provider = defineProvider<ArchilSandbox, ArchilConfig>({\n name: 'archil',\n sizes: (config, profile, options) => {\n if (options?.sandbox !== undefined && (options.sandbox === null || typeof options.sandbox !== 'object' || Array.isArray(options.sandbox))) {\n throw new InstanceSizeError('invalid', 'sandbox must be an object when requesting sizeClass');\n }\n if (options?.vcpuCount !== undefined || options?.memSizeMiB !== undefined ||\n options?.vcpu_count !== undefined || options?.mem_size_mib !== undefined ||\n options?.sandbox?.vcpu_count !== undefined || options?.sandbox?.mem_size_mib !== undefined ||\n options?.sandbox?.vcpuCount !== undefined || options?.sandbox?.memSizeMiB !== undefined) {\n throw new InstanceSizeError('conflict', 'cannot combine sizeClass with native Archil CPU/memory fields');\n }\n if (options?.snapshotId !== undefined || options?.sandboxId !== undefined || options?.instanceId !== undefined) {\n return { status: 'unsupported', reason: 'Archil attach/fork does not apply CPU/RAM overrides; create a new persistent VM to request a standard size.' };\n }\n if (resolveSizingExecution(config, options) !== 'persistent') {\n return { status: 'unavailable', reason: 'Archil exec containers do not expose VM sizing. Drop execution: \"exec\" (persistent VMs are the default) or set ephemeral: false.' };\n }\n if (profile.sizeClass === 'xs' || profile.sizeClass === '2xl') {\n return { status: 'unknown', reason: 'This adapter has not verified this standard shape.' };\n }\n return { status: 'supported', nativeOptions: { vcpus: profile.vcpus, memoryMiB: profile.memoryMiB } };\n },\n methods: {\n instances: {\n create: async (config: ArchilConfig, options?: ArchilCreateOptions) => {\n const resolved = resolveConfig(config);\n const client = createClient(config, resolved);\n\n // `ephemeral` on create() overrides the configured mode for this\n // sandbox: true -> disk exec handle, false -> persistent VM.\n const execution =\n options?.ephemeral !== undefined\n ? options.ephemeral\n ? 'exec'\n : 'persistent'\n : resolved.execution;\n\n if (options?.snapshotId && execution === 'exec') {\n throw new Error(\n 'Archil snapshots fork persistent VMs and cannot be restored in exec mode. Drop execution: \"exec\" / ephemeral: true.',\n );\n }\n\n if (execution === 'exec') {\n const diskId = resolveCreateDiskId(options);\n sandboxModes.set(diskId, 'exec');\n return { instance: diskInstance(client, { id: diskId }, resolved), instanceId: diskId };\n }\n\n if (options?.diskId) {\n throw new Error(\n 'Archil create({ diskId }) attaches a disk exec handle, which is opt-in now that persistent VMs are the default.\\n\\n' +\n 'Opt in with archil({ execution: \"exec\" }) (or ARCHIL_EXECUTION=exec), or pass ephemeral: true.',\n );\n }\n\n let vm: ArchilVm;\n if (options?.snapshotId) {\n // A snapshot is a paused fork; forking it again yields an independent\n // writable VM resumed from the snapshot's memory and disk state.\n const source = await client.sandboxes.get(options.snapshotId);\n vm = await source.fork({ name: options?.name });\n } else if (options?.sandboxId) {\n // Attach to a live sandbox. Refuse an abort signal here: the\n // sandbox manager destroys a resolved sandbox after an abort,\n // which would delete a sandbox this call did not create.\n if (options?.signal) {\n throw new Error(\n 'create({ sandboxId }) attaches to an existing sandbox and cannot be combined with an abort signal',\n );\n }\n vm = await client.sandboxes.get(options.sandboxId);\n await ensureVmRunning(vm);\n } else {\n vm = await client.sandboxes.create(toSandboxRequest(options), {\n wait: true,\n });\n }\n if (vm.status === 'failed') {\n throw new Error(`Archil sandbox ${vm.id} failed to start${vm.exitReason ? `: ${vm.exitReason}` : ''}`);\n }\n sandboxModes.set(vm.id, 'persistent');\n return { instance: vmInstance(client, vm, resolved), instanceId: vm.id };\n },\n\n getById: async (config: ArchilConfig, sandboxId: string) => {\n const resolved = resolveConfig(config);\n const client = createClient(config, resolved);\n try {\n if (modeForId(sandboxId, resolved) === 'exec') {\n const disk = await client.disks.get(sandboxId);\n return { instance: diskInstance(client, disk, resolved), instanceId: disk.id };\n }\n const vm = await client.sandboxes.get(sandboxId);\n await ensureVmRunning(vm);\n return { instance: vmInstance(client, vm, resolved), instanceId: vm.id };\n } catch {\n return null;\n }\n },\n\n // Archil's list endpoints return every sandbox (and the SDK follows disk\n // pagination), so a single call yields the full account listing.\n list: async (config: ArchilConfig) => {\n const resolved = resolveConfig(config);\n const client = createClient(config, resolved);\n if (resolved.execution === 'exec') {\n const disks = await client.disks.list();\n return disks.map((disk) => ({ instance: diskInstance(client, disk, resolved), instanceId: disk.id }));\n }\n const vms = await client.sandboxes.list();\n return vms\n .filter((vm) => !isSnapshotVm(vm) && vm.status !== 'deleting' && vm.status !== 'deleted')\n .map((vm) => ({ instance: vmInstance(client, vm, resolved), instanceId: vm.id }));\n },\n\n destroy: async (config: ArchilConfig, sandboxId: string) => {\n const resolved = resolveConfig(config);\n // exec handles are disk references — Archil disks have an independent\n // lifecycle, so destroying them is a no-op.\n const mode = modeForId(sandboxId, resolved);\n sandboxModes.delete(sandboxId);\n if (mode === 'exec') return;\n const client = createClient(config, resolved);\n let vm: ArchilVm;\n try {\n vm = await client.sandboxes.get(sandboxId);\n } catch (error) {\n if (error instanceof ArchilError && (error.status === 404 || error.status === 400)) return;\n throw error;\n }\n await stopAndDeleteVm(vm);\n },\n\n runCommand: async (\n sandbox: ArchilSandbox,\n command: string,\n options?: RunCommandOptions,\n ): Promise<CommandResult> => {\n const startTime = Date.now();\n try {\n if (sandbox.vm) {\n const { onStdout: _out, onStderr: _err, ...rest } = options ?? {};\n return await runVmCommand(sandbox.vm, command, rest);\n }\n const result = await execOnDisk(sandbox, wrapCommand(command, options));\n return {\n stdout: result.stdout ?? '',\n stderr: result.stderr ?? '',\n exitCode: result.exitCode,\n durationMs: Date.now() - startTime,\n };\n } catch (error) {\n return commandError(error, startTime);\n }\n },\n\n // Persistent VMs stream through the process WebSocket. Disk exec only\n // returns output once the command exits, so it is delivered at the end.\n streamCommand: async (\n sandbox: ArchilSandbox,\n command: string,\n options: RunCommandOptions,\n ): Promise<CommandResult> => {\n const startTime = Date.now();\n try {\n if (sandbox.vm) return await runVmCommand(sandbox.vm, command, options);\n const result = await execOnDisk(sandbox, wrapCommand(command, options));\n if (result.stdout) options.onStdout?.(result.stdout);\n if (result.stderr) options.onStderr?.(result.stderr);\n return {\n stdout: result.stdout ?? '',\n stderr: result.stderr ?? '',\n exitCode: result.exitCode,\n durationMs: Date.now() - startTime,\n };\n } catch (error) {\n return commandError(error, startTime);\n }\n },\n\n startProcess: async (\n sandbox: ArchilSandbox,\n command: string,\n options: StartProcessOptions,\n ): Promise<ProcessHandle> => {\n if (!sandbox.vm) {\n throw new Error(\n 'Archil exec mode runs each command in a fresh container, so it cannot host background processes. Use a persistent VM (the default).',\n );\n }\n const startTime = Date.now();\n const { proc, done, state, output } = await startVmProcess(sandbox.vm, command, {\n cwd: options.cwd,\n env: options.env,\n onStdout: options.onStdout,\n onStderr: options.onStderr,\n });\n // Without stdin: true the process sees EOF, as with `< /dev/null`.\n if (!options.stdin) await proc.closeStdin().catch(() => {});\n\n let exited: (typeof done extends Promise<infer R> ? R : never) | undefined;\n const finished = done.then((result) => {\n exited = result;\n options.onExit?.({ exitCode: result.exitCode, signal: result.signal });\n return result;\n });\n const toResult = (result: Awaited<typeof done>) => ({\n stdout: result.stdout,\n stderr: result.stderr,\n exitCode: result.exitCode,\n signal: result.signal,\n durationMs: Date.now() - startTime,\n });\n\n return {\n pid: null,\n jobId: proc.id,\n runtime: 'native',\n write: async (data) => {\n if (!options.stdin) {\n throw new Error('Process was started without stdin: true');\n }\n await proc.sendInput(data);\n },\n closeStdin: async () => {\n if (options.stdin && !exited) await proc.closeStdin();\n },\n status: async () =>\n exited\n ? { status: 'exited', exitCode: exited.exitCode, signal: exited.signal, stdout: exited.stdout, stderr: exited.stderr }\n : { status: 'running', exitCode: null, signal: null, stdout: output.stdout, stderr: output.stderr },\n wait: async (waitOptions) => {\n if (waitOptions?.timeout === undefined) return toResult(await finished);\n let timer: ReturnType<typeof setTimeout> | undefined;\n const timeout = new Promise<never>((_, reject) => {\n timer = setTimeout(\n () => reject(new Error(`Process ${proc.id} did not exit within ${waitOptions.timeout}ms`)),\n waitOptions.timeout,\n );\n });\n try {\n return toResult(await Promise.race([finished, timeout]));\n } finally {\n clearTimeout(timer);\n }\n },\n // Archil's process control only cancels (SIGKILL semantics); the\n // requested signal name is what the result reports.\n kill: async (signal) => {\n if (exited) return;\n state.killSignal = signal ?? 'SIGKILL';\n await proc.kill();\n },\n };\n },\n\n getInfo: async (sandbox: ArchilSandbox): Promise<InstanceInfo> => {\n if (sandbox.vm) {\n const vm = sandbox.vm;\n return {\n id: vm.id,\n provider: 'archil',\n status:\n vm.status === 'running'\n ? 'running'\n : vm.status === 'failed'\n ? 'error'\n : 'stopped',\n createdAt: vm.createdAt,\n timeout: vm.maxTtlSeconds * 1000,\n metadata: {\n name: vm.name,\n archilStatus: vm.status,\n vcpuCount: vm.vcpuCount,\n memSizeMiB: vm.memSizeMiB,\n baseImage: vm.baseImage,\n platform: vm.platform,\n },\n };\n }\n const diskInfo = 'status' in sandbox.disk ? sandbox.disk : undefined;\n return {\n id: sandbox.disk.id,\n provider: 'archil',\n status: !diskInfo || diskInfo.status === 'ready' ? 'running' : 'stopped',\n createdAt: diskInfo ? new Date(diskInfo.createdAt) : sandbox.createdAt,\n timeout: 0,\n metadata: diskInfo\n ? {\n name: diskInfo.name,\n organization: diskInfo.organization,\n region: diskInfo.region,\n provider: diskInfo.provider,\n }\n : {},\n };\n },\n\n getUrl: async (\n sandbox: ArchilSandbox,\n options: { port: number; protocol?: string },\n ): Promise<string> => {\n if (sandbox.vm) {\n await sandbox.vm.refresh();\n const endpoint = sandbox.vm.endpoints?.find(\n (e) => e.port === options.port,\n );\n if (!endpoint) {\n throw new Error(\n `No endpoint exposed on port ${options.port} for Archil sandbox ${sandbox.vm.id}.`,\n );\n }\n return `${options.protocol ?? 'https'}://${endpoint.hostname}`;\n }\n throw new Error(\n `Archil exec runs each command in a fresh ephemeral container that exits when the command returns, ` +\n `so there is no long-lived process to expose port ${options.port} on. ` +\n `getUrl is not supported.`,\n );\n },\n\n filesystem: {\n readFile: async (sandbox, path, runCommand) => {\n if (sandbox.vm) {\n const chunks: Buffer[] = [];\n try {\n await sandbox.vm.files.downloadFile(path, (chunk) => {\n chunks.push(Buffer.from(chunk));\n });\n } catch (error) {\n throw new Error(\n `Failed to read ${path}: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n return Buffer.concat(chunks).toString('utf8');\n }\n const diskPath = mapFilesystemPath(sandbox, path);\n const sizeResult = await runCommand(\n sandbox,\n `wc -c < ${shellEscape(diskPath)}`,\n );\n if (sizeResult.exitCode !== 0) {\n throw new Error(`Failed to read ${path}: ${sizeResult.stderr}`);\n }\n\n const sizeText = sizeResult.stdout.trim();\n if (!/^\\d+$/.test(sizeText)) {\n throw new Error(\n `Failed to read ${path}: Archil returned an invalid file size.`,\n );\n }\n\n const size = Number(sizeText);\n if (!Number.isSafeInteger(size)) {\n throw new Error(\n `Failed to read ${path}: file size exceeds JavaScript's safe integer range.`,\n );\n }\n if (size === 0) return '';\n\n const chunks: Buffer[] = [];\n for (\n let offset = 0;\n offset < size;\n offset += ARCHIL_MAX_READ_CHUNK_BYTES\n ) {\n const expectedBytes = Math.min(\n ARCHIL_MAX_READ_CHUNK_BYTES,\n size - offset,\n );\n const result = await runCommand(\n sandbox,\n `dd if=${shellEscape(diskPath)} bs=1 skip=${offset} count=${expectedBytes} 2>/dev/null | base64`,\n );\n if (result.exitCode !== 0) {\n throw new Error(`Failed to read ${path}: ${result.stderr}`);\n }\n\n const encoded = result.stdout.replace(/\\s/g, '');\n if (\n encoded.length === 0 ||\n encoded.length % 4 !== 0 ||\n !/^[A-Za-z0-9+/]*={0,2}$/.test(encoded)\n ) {\n throw new Error(\n `Failed to read ${path}: Archil returned an incomplete file chunk at byte ${offset}.`,\n );\n }\n\n const chunk = Buffer.from(encoded, 'base64');\n if (chunk.length !== expectedBytes) {\n throw new Error(\n `Failed to read ${path}: Archil returned an incomplete file chunk at byte ${offset}.`,\n );\n }\n chunks.push(chunk);\n }\n\n return Buffer.concat(chunks).toString('utf8');\n },\n\n writeFile: async (sandbox, path, content, runCommand) => {\n if (sandbox.vm) {\n try {\n await sandbox.vm.files.uploadFile(\n Buffer.from(content, 'utf8'),\n path,\n );\n } catch (error) {\n throw new Error(\n `Failed to write ${path}: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n return;\n }\n const diskPath = mapFilesystemPath(sandbox, path);\n const parent = posix.dirname(diskPath);\n const encoded = Buffer.from(content, 'utf8').toString('base64');\n const tempPath = `${diskPath}.computesdk-write-${randomUUID()}`;\n let started = false;\n\n try {\n if (encoded.length === 0) {\n started = true;\n const result = await runCommand(\n sandbox,\n withDiskWriteLock(\n sandbox,\n [\n `mkdir -p ${shellEscape(parent)}`,\n `: > ${shellEscape(tempPath)}`,\n finalizeStagedFileCommand(tempPath, diskPath),\n ].join(' && '),\n ),\n );\n if (result.exitCode !== 0) {\n throw new Error(result.stderr);\n }\n return;\n }\n\n const chunkSize = maxWriteChunkSize(parent, tempPath, diskPath);\n for (let offset = 0; offset < encoded.length; offset += chunkSize) {\n const isFirst = offset === 0;\n const isFinal = offset + chunkSize >= encoded.length;\n started = true;\n const result = await runCommand(\n sandbox,\n withDiskWriteLock(\n sandbox,\n buildWriteChunkCommand(\n parent,\n tempPath,\n diskPath,\n encoded.slice(offset, offset + chunkSize),\n isFirst,\n isFinal,\n ),\n ),\n );\n if (result.exitCode !== 0) {\n throw new Error(result.stderr);\n }\n }\n } catch (error) {\n if (started) {\n try {\n await runCommand(\n sandbox,\n withDiskWriteLock(sandbox, `rm -f ${shellEscape(tempPath)}`),\n );\n } catch {\n // Preserve the original write error if cleanup fails.\n }\n }\n throw new Error(\n `Failed to write ${path}: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n },\n\n mkdir: async (sandbox, path, runCommand) => {\n const diskPath = mapFilesystemPath(sandbox, path);\n const result = await runCommand(\n sandbox,\n withDiskWriteLock(sandbox, `mkdir -p ${shellEscape(diskPath)}`),\n );\n if (result.exitCode !== 0) {\n throw new Error(`Failed to create directory ${path}: ${result.stderr}`);\n }\n },\n\n readdir: async (sandbox, path, runCommand) => {\n const diskPath = mapFilesystemPath(sandbox, path);\n // Tab-separated: type<TAB>size<TAB>mtime-iso<TAB>name. Robust to spaces in names.\n const result = await runCommand(\n sandbox,\n `find ${shellEscape(diskPath)} -mindepth 1 -maxdepth 1 -printf '%y\\t%s\\t%T@\\t%f\\n'`,\n );\n if (result.exitCode !== 0) {\n throw new Error(`Failed to list directory ${path}: ${result.stderr}`);\n }\n const entries: FileEntry[] = [];\n for (const line of result.stdout.split('\\n')) {\n if (!line) continue;\n const [typeChar, sizeStr, mtimeStr, ...nameParts] = line.split('\\t');\n const name = nameParts.join('\\t');\n entries.push({\n name,\n type: typeChar === 'd' ? 'directory' : 'file',\n size: parseInt(sizeStr, 10) || 0,\n modified: new Date(parseFloat(mtimeStr) * 1000),\n });\n }\n return entries;\n },\n\n exists: async (sandbox, path, runCommand) => {\n const diskPath = mapFilesystemPath(sandbox, path);\n const result = await runCommand(sandbox, `test -e ${shellEscape(diskPath)}`);\n return result.exitCode === 0;\n },\n\n remove: async (sandbox, path, runCommand) => {\n const diskPath = mapFilesystemPath(sandbox, path);\n if (!sandbox.vm && diskPath === ARCHIL_MOUNT_ROOT) {\n throw new Error('Refusing to remove the Archil disk mount root.');\n }\n const result = await runCommand(\n sandbox,\n withDiskWriteLock(sandbox, `rm -rf ${shellEscape(diskPath)}`),\n );\n if (result.exitCode !== 0) {\n throw new Error(`Failed to remove ${path}: ${result.stderr}`);\n }\n },\n },\n\n // Native pause keeps CPU and memory: files anywhere (including /tmp)\n // and running processes survive. Processes must outlive the command\n // that started them (startProcess, or setsid): Archil reaps a command's\n // process group when it exits. Disk exec handles have no VM to pause.\n pause: async (sandbox: ArchilSandbox) => {\n await requireVm(sandbox, 'pause').pause();\n },\n\n resume: async (sandbox: ArchilSandbox) => {\n await requireVm(sandbox, 'resume').resume();\n },\n\n pauseCapabilities: { memory: true, createOptions: { ephemeral: false } },\n\n getInstance: (sandbox: ArchilSandbox): ArchilSandbox => sandbox,\n },\n\n // Archil has no separate snapshot resource. A snapshot is a fork of the\n // source VM (memory and disk), paused so it holds state without running,\n // and named with SNAPSHOT_NAME_PREFIX so it can be listed. create({\n // snapshotId }) forks it again. Forks must be deleted before their parent.\n snapshot: {\n // A fork copies the VM's memory and whole disk, so restores keep the\n // rootfs (including /tmp) and running processes; the source keeps running.\n capabilities: {\n scope: 'rootfs',\n memory: true,\n destroysSource: false,\n createOptions: { ephemeral: false },\n },\n\n create: async (\n config: ArchilConfig,\n sandboxId: string,\n options?: { name?: string },\n ) => {\n const resolved = resolveConfig(config);\n const client = createClient(config, resolved);\n let fork: ArchilVm | undefined;\n try {\n const source = await client.sandboxes.get(sandboxId);\n fork = await source.fork({ name: snapshotName(options?.name) });\n if (fork.status === 'running') await fork.pause();\n return {\n id: fork.id,\n provider: 'archil',\n createdAt: fork.createdAt ?? new Date(),\n metadata: { name: options?.name, archilName: fork.name, sourceId: sandboxId },\n };\n } catch (error) {\n if (fork) await stopAndDeleteVm(fork).catch(() => {});\n throw new Error(\n `Failed to create Archil snapshot: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n },\n\n list: async (config: ArchilConfig) => {\n const resolved = resolveConfig(config);\n const client = createClient(config, resolved);\n const vms = await client.sandboxes.list();\n return vms\n .filter((vm) => isSnapshotVm(vm) && vm.status !== 'deleting' && vm.status !== 'deleted')\n .map((vm) => ({\n id: vm.id,\n provider: 'archil',\n createdAt: vm.createdAt,\n metadata: { archilName: vm.name, archilStatus: vm.status },\n }));\n },\n\n delete: async (config: ArchilConfig, snapshotId: string) => {\n const resolved = resolveConfig(config);\n const client = createClient(config, resolved);\n let vm: ArchilVm;\n try {\n vm = await client.sandboxes.get(snapshotId);\n } catch (error) {\n if (error instanceof ArchilError && error.status === 404) return;\n throw error;\n }\n await stopAndDeleteVm(vm);\n },\n },\n },\n});\n\nexport const archil = (config: ArchilConfig = {}) => _provider(config);\n\nexport type { ArchilSandbox };\n"],"mappings":";AAeA,SAAS,gBAAgB,yBAAyB;AAClD,SAAS,UAAU,cAAc,mBAAmB;AAMpD,SAAS,kBAAkB;AAC3B,SAAS,aAAa;AAWtB,IAAM,oBAAoB;AAC1B,IAAM,gCAAgC;AAGtC,IAAM,8BAA8B,IAAI,OAAO;AAG/C,IAAM,gBAAwC;AAAA,EAC5C,mBAAmB;AACrB;AAEA,SAAS,gBAAgB,QAAwB;AAC/C,QAAM,OAAO,OAAO,QAAQ,GAAG;AAC/B,MAAI,QAAQ,KAAK,SAAS,OAAO,SAAS,GAAG;AAC3C,UAAM,IAAI;AAAA,MACR,0BAA0B,MAAM;AAAA,IAClC;AAAA,EACF;AACA,QAAM,QAAQ,OAAO,MAAM,GAAG,IAAI;AAClC,QAAM,SAAS,OAAO,MAAM,OAAO,CAAC;AACpC,QAAM,QAAQ,cAAc,MAAM,KAAK;AACvC,SAAO,mBAAmB,KAAK,IAAI,MAAM,IAAI,KAAK;AACpD;AAsEA,SAAS,WACP,QACA,IACA,UACe;AACf,SAAO;AAAA,IACL;AAAA,IACA,MAAM,EAAE,IAAI,GAAG,GAAG;AAAA,IAClB;AAAA,IACA;AAAA,IACA,WAAW,oBAAI,KAAK;AAAA,IACpB,OAAO,YAAY;AACjB,YAAM,GAAG,MAAM;AAAA,IACjB;AAAA,IACA,QAAQ,YAAY;AAClB,YAAM,GAAG,OAAO;AAAA,IAClB;AAAA,EACF;AACF;AAqBA,SAAS,cAAc,QAAsC;AAC3D,QAAM,SAAS,OAAO,UAAU,QAAQ,IAAI;AAC5C,QAAM,SAAS,OAAO,UAAU,QAAQ,IAAI;AAE5C,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI;AAAA,MACR;AAAA,IAGF;AAAA,EACF;AAEA,MAAI,UAAU,OAAO;AACrB,MAAI,CAAC,SAAS;AACZ,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI;AAAA,QACR;AAAA,MAIF;AAAA,IACF;AACA,cAAU,gBAAgB,MAAM;AAAA,EAClC;AAEA,SAAO,EAAE,QAAQ,SAAS,WAAW,iBAAiB,MAAM,EAAE;AAChE;AAEA,SAAS,iBAAiB,QAA2C;AACnE,MAAI,OAAO,UAAW,QAAO,OAAO;AACpC,QAAM,UAAU,QAAQ,IAAI,kBAAkB,KAAK,EAAE,YAAY;AACjE,MAAI,CAAC,QAAS,QAAO;AACrB,MAAI,YAAY,UAAU,YAAY,aAAc,QAAO;AAC3D,QAAM,IAAI;AAAA,IACR,6BAA6B,QAAQ,IAAI,gBAAgB;AAAA,EAC3D;AACF;AAEA,SAAS,aAAa,QAAsB,UAAwC;AAClF,QAAM,SAAS,OAAO,UAAU,QAAQ,IAAI,iBAAiB;AAC7D,SAAO,IAAI,aAAa,EAAE,GAAG,UAAU,OAAO,CAAC;AACjD;AAEA,SAAS,oBAAoB,SAAuC;AAGlE,QAAM,SAAS,SAAS,UAAU,SAAS;AAE3C,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI;AAAA,MACR;AAAA,IAGF;AAAA,EACF;AAEA,SAAO;AACT;AAGA,SAAS,YAAY,OAAuB;AAC1C,SAAO,IAAI,MAAM,QAAQ,MAAM,OAAO,CAAC;AACzC;AAEA,SAAS,kBAAkB,SAAwB,MAAsB;AACvE,QAAM,aAAa,MAAM,UAAU,KAAK,WAAW,GAAG,IAAI,OAAO,IAAI,IAAI,EAAE;AAG3E,MAAI,QAAQ,IAAI;AACd,WAAO;AAAA,EACT;AAEA,MAAI,eAAe,KAAK;AACtB,WAAO;AAAA,EACT;AAEA,MACE,eAAe,qBACf,WAAW,WAAW,GAAG,iBAAiB,GAAG,GAC7C;AACA,WAAO;AAAA,EACT;AAEA,SAAO,GAAG,iBAAiB,GAAG,UAAU;AAC1C;AAEA,SAAS,yBAAyB,SAAyB;AACzD,QAAM,YAAY,YAAY,iBAAiB;AAC/C,SAAO;AAAA,IACL,iCAAiC,SAAS;AAAA,IAC1C,KAAK,OAAO,+BAA+B,SAAS;AAAA,EAEtD,EAAE,KAAK,MAAM;AACf;AAEA,SAAS,kBAAkB,SAAwB,SAAyB;AAE1E,MAAI,QAAQ,GAAI,QAAO;AACvB,SAAO,yBAAyB,OAAO;AACzC;AAEA,SAAS,iBAAiB,SAAyB;AACjD,SAAO,OAAO,WAAW,YAAY,OAAO,GAAG,MAAM;AACvD;AAEA,SAAS,uBACP,QACA,UACA,UACA,cACA,SACA,SACQ;AACR,QAAM,eACJ,aAAa,YAAY,YAAY,CAAC,gBACnC,UAAU,MAAM,IAAI,IAAI,YAAY,QAAQ,CAAC;AAClD,SAAO;AAAA,IACL,GAAI,UAAU,CAAC,YAAY,YAAY,MAAM,CAAC,EAAE,IAAI,CAAC;AAAA,IACrD;AAAA,IACA,GAAI,UACA,CAAC,0BAA0B,UAAU,QAAQ,CAAC,IAC9C,CAAC;AAAA,EACP,EAAE,KAAK,MAAM;AACf;AAEA,SAAS,0BAA0B,UAAkB,UAA0B;AAC7E,QAAM,oBAAoB,YAAY,QAAQ;AAC9C,SAAO;AAAA,IACL,WAAW,iBAAiB;AAAA,IAC5B,kBAAkB,YAAY,mCAAmC,QAAQ,EAAE,CAAC;AAAA,IAC5E;AAAA,IACA;AAAA,IACA,MAAM,YAAY,QAAQ,CAAC,IAAI,iBAAiB;AAAA,EAClD,EAAE,KAAK,GAAG;AACZ;AAEA,SAAS,kBACP,QACA,UACA,UACQ;AACR,MAAI,MAAM;AACV,MAAI,OAAO;AAEX,SAAO,MAAM,MAAM;AACjB,UAAM,YAAY,KAAK,MAAM,MAAM,QAAQ,CAAC;AAC5C,UAAM,UAAU;AAAA,MACd;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA,IAAI,OAAO,SAAS;AAAA,QACpB;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,QAAI,iBAAiB,OAAO,KAAK,+BAA+B;AAC9D,YAAM;AAAA,IACR,OAAO;AACL,aAAO,YAAY;AAAA,IACrB;AAAA,EACF;AAEA,QAAM,YAAY,MAAO,MAAM;AAC/B,MAAI,YAAY,GAAG;AACjB,UAAM,IAAI;AAAA,MACR,0DAA0D,6BAA6B;AAAA,IACzF;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,YAAY,SAAiB,SAAqC;AACzE,MAAI,UAAU;AAEd,MAAI,SAAS,KAAK;AAChB,cAAU,MAAM,YAAY,QAAQ,GAAG,CAAC,OAAO,OAAO;AAAA,EACxD;AAEA,QAAM,aAAa,OAAO,QAAQ,SAAS,OAAO,CAAC,CAAC;AACpD,MAAI,CAAC,WAAW,KAAK,CAAC,CAAC,GAAG,MAAM,QAAQ,MAAM,GAAG;AAC/C,eAAW,QAAQ,CAAC,QAAQ,QAAQ,IAAI,QAAQ,MAAM,CAAC;AAAA,EACzD;AAGA,QAAM,UAAU,WACb,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,YAAY,OAAO,CAAC,CAAC,CAAC,EAAE,EAChD,KAAK,GAAG;AACX,YAAU,UAAU,OAAO,KAAK,OAAO;AAEvC,MAAI,SAAS,YAAY;AACvB,cAAU,eAAe,YAAY,OAAO,CAAC;AAAA,EAC/C;AAEA,SAAO;AACT;AAEA,eAAe,WAAW,SAAwB,SAAwC;AACxF,SAAO,QAAQ,OAAO,MAAM,KAAK,QAAQ,KAAK,IAAI,OAAO;AAC3D;AAMA,SAAS,QAAQ,SAAiB,KAAsB;AACtD,SAAO,MAAM,MAAM,YAAY,GAAG,CAAC;AAAA,EAAe,OAAO,KAAK;AAChE;AAEA,eAAe,gBAAgB,IAA6B;AAG1D,QAAM,GAAG,QAAQ;AACjB,MAAI,GAAG,WAAW,UAAW;AAC7B,MAAI,GAAG,WAAW,UAAU;AAC1B,UAAM,GAAG,OAAO;AAAA,EAClB,WAAW,GAAG,WAAW,aAAa,GAAG,WAAW,UAAU;AAC5D,UAAM,GAAG,MAAM;AAAA,EACjB;AACF;AAEA,SAAS,UAAU,SAAwB,QAAsC;AAC/E,MAAI,CAAC,QAAQ,IAAI;AACf,UAAM,IAAI;AAAA,MACR,mCAAmC,MAAM;AAAA,IAC3C;AAAA,EACF;AACA,SAAO,QAAQ;AACjB;AAIA,eAAe,gBAAgB,IAA6B;AAC1D,MAAI,GAAG,WAAW,cAAc,GAAG,WAAW,UAAW;AACzD,MAAI;AACF,QAAI,GAAG,WAAW,aAAa,GAAG,WAAW,YAAY,GAAG,WAAW,UAAU;AAC/E,YAAM,GAAG,KAAK;AAAA,IAChB;AACA,UAAM,GAAG,OAAO;AAAA,EAClB,SAAS,OAAO;AACd,QAAI,iBAAiB,eAAe,MAAM,WAAW,IAAK;AAC1D,QAAI,iBAAiB,eAAe,MAAM,WAAW,KAAK;AACxD,YAAM,IAAI;AAAA,QACR,oCAAoC,GAAG,EAAE,WAAW,MAAM,OAAO;AAAA,MAEnE;AAAA,IACF;AACA,UAAM;AAAA,EACR;AACF;AAEA,SAAS,iBAAiB,SAAqD;AAC7E,QAAM,UAAgC;AAAA,IACpC,GAAG,SAAS;AAAA,IACZ,MAAM,SAAS;AAAA,IACf,WAAW,SAAS,aAAa,SAAS,SAAS,SAAS;AAAA,IAC5D,KAAK,SAAS,OAAO,SAAS;AAAA,IAC9B,WAAW,SAAS,SAAS,SAAS,OAAO,SAAS;AAAA,IACtD,YAAY,SAAS,aAAa,SAAS;AAAA,EAC7C;AACA,MAAI,SAAS,kBAAkB,QAAW;AACxC,YAAQ,gBAAgB,QAAQ;AAAA,EAClC,WAAW,SAAS,YAAY,QAAW;AAEzC,YAAQ,gBAAgB,KAAK,KAAK,QAAQ,UAAU,GAAI;AAAA,EAC1D;AACA,SAAO;AACT;AAIA,IAAM,uBAAuB;AAE7B,SAAS,aAAa,MAAuB;AAC3C,QAAM,SAAS,WAAW,EAAE,MAAM,GAAG,CAAC;AACtC,QAAM,QAAQ,QAAQ,IACnB,YAAY,EACZ,QAAQ,gBAAgB,GAAG,EAC3B,QAAQ,YAAY,EAAE,EACtB,MAAM,GAAG,KAAK,qBAAqB,SAAS,OAAO,SAAS,CAAC,EAC7D,QAAQ,QAAQ,EAAE;AACrB,SAAO,GAAG,oBAAoB,GAAG,OAAO,GAAG,IAAI,MAAM,EAAE,GAAG,MAAM;AAClE;AAEA,SAAS,aAAa,IAAuB;AAC3C,SAAO,GAAG,MAAM,WAAW,oBAAoB,KAAK;AACtD;AAGA,SAAS,SAAS,IAAqB;AACrC,SAAO,GAAG,WAAW,MAAM;AAC7B;AAKA,IAAM,eAAe,oBAAI,IAAiC;AAE1D,SAAS,UAAU,IAAY,UAA+C;AAC5E,SAAO,aAAa,IAAI,EAAE,MAAM,SAAS,EAAE,IAAI,SAAS,SAAS;AACnE;AAEA,SAAS,aACP,QACA,MACA,UACe;AACf,SAAO,EAAE,QAAQ,MAAM,UAAU,WAAW,oBAAI,KAAK,EAAE;AACzD;AAEA,IAAM,oBAAoB;AAC1B,IAAM,mBAAmB;AAQzB,SAAS,iBACP,QACA,UACA,YACkB;AAClB,MAAI,YAAY,OAAO,WAAW,aAAa;AAC7C,WAAO,EAAE,UAAU,mBAAmB,QAAQ,WAAW,cAAc,GAAG;AAAA,EAC5E;AACA,MAAI,OAAO,WAAW,aAAa;AACjC,WAAO,EAAE,UAAU,kBAAkB,QAAQ,cAAc,WAAW,cAAc,GAAG;AAAA,EACzF;AACA,MAAI,OAAO,WAAW,UAAU;AAC9B,WAAO;AAAA,MACL,UAAU,OAAO,YAAY;AAAA,MAC7B,QAAQ;AAAA,MACR,cAAc,OAAO,cAAc;AAAA,IACrC;AAAA,EACF;AAEA,SAAO,EAAE,UAAU,OAAO,YAAY,GAAG,QAAQ,MAAM,cAAc,GAAG;AAC1E;AAMA,eAAe,eACb,IACA,SACA,SAOA;AACA,QAAM,gBAAgB,EAAE;AACxB,QAAM,WAAW,EAAE,QAAQ,IAAI,YAAY,GAAG,QAAQ,IAAI,YAAY,EAAE;AACxE,QAAM,SAAS,EAAE,QAAQ,IAAI,QAAQ,GAAG;AACxC,QAAM,OAAO,CAAC,QAA6B,SAAiB;AAC1D,QAAI,CAAC,KAAM;AACX,WAAO,MAAM,KAAK;AAClB,KAAC,WAAW,WAAW,QAAQ,WAAW,QAAQ,YAAY,IAAI;AAAA,EACpE;AACA,QAAM,OAAO,MAAM,GAAG,UAAU,MAAM,QAAQ,SAAS,QAAQ,GAAG,GAAG;AAAA,IACnE,KAAK,QAAQ;AAAA,IACb,eAAe;AAAA,IACf,gBACE,QAAQ,YAAY,SAAY,KAAK,IAAI,GAAG,KAAK,KAAK,QAAQ,UAAU,GAAI,CAAC,IAAI;AAAA,IACnF,UAAU,CAAC,UAAU,KAAK,MAAM,QAAQ,SAAS,MAAM,MAAM,EAAE,OAAO,MAAM,MAAM,EAAE,QAAQ,KAAK,CAAC,CAAC;AAAA,EACrG,CAAC;AAED,QAAM,QAAQ,EAAE,UAAU,OAAO,YAAY,KAAsB;AACnE,MAAI;AACJ,MAAI,QAAQ,YAAY,QAAW;AAGjC,YAAQ,WAAW,MAAM;AACvB,YAAM,WAAW;AACjB,WAAK,KAAK,EAAE,MAAM,MAAM;AAAA,MAAC,CAAC;AAAA,IAC5B,GAAG,QAAQ,OAAO;AAAA,EACpB;AAEA,QAAM,OAAO,KACV,KAAK,EACL,KAAK,CAAC,WAAW;AAChB,SAAK,UAAU,SAAS,OAAO,OAAO,CAAC;AACvC,SAAK,UAAU,SAAS,OAAO,OAAO,CAAC;AACvC,UAAM,SAAS,iBAAiB,QAAQ,MAAM,UAAU,MAAM,UAAU;AACxE,WAAO;AAAA,MACL,QAAQ,OAAO;AAAA,MACf,QAAQ,OAAO,eACX,GAAG,OAAO,MAAM,GAAG,OAAO,UAAU,CAAC,OAAO,OAAO,SAAS,IAAI,IAAI,OAAO,EAAE,GAAG,OAAO,YAAY,KACnG,OAAO;AAAA,MACX,UAAU,OAAO;AAAA,MACjB,QAAQ,OAAO;AAAA,IACjB;AAAA,EACF,CAAC,EACA,MAAM,CAAC,WAAoB;AAAA,IAC1B,QAAQ,OAAO;AAAA,IACf,QAAQ,GAAG,OAAO,MAAM,GAAG,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,IACjF,UAAU;AAAA,IACV,QAAQ;AAAA,EACV,EAAE,EACD,QAAQ,MAAM;AACb,QAAI,MAAO,cAAa,KAAK;AAAA,EAC/B,CAAC;AAEH,SAAO,EAAE,MAAM,MAAM,OAAO,OAAO;AACrC;AAEA,eAAe,aACb,IACA,SACA,SACwB;AACxB,QAAM,YAAY,KAAK,IAAI;AAC3B,MAAI,SAAS,YAAY;AAGvB,UAAM,gBAAgB,EAAE;AACxB,UAAM,OAAO,MAAM,GAAG,UAAU,MAAM,QAAQ,SAAS,QAAQ,GAAG,GAAG;AAAA,MACnE,KAAK,QAAQ;AAAA,MACb,eAAe;AAAA,IACjB,CAAC;AACD,UAAM,KAAK,WAAW;AACtB,WAAO,EAAE,QAAQ,IAAI,QAAQ,IAAI,UAAU,GAAG,YAAY,KAAK,IAAI,IAAI,UAAU;AAAA,EACnF;AACA,QAAM,EAAE,KAAK,IAAI,MAAM,eAAe,IAAI,SAAS;AAAA,IACjD,KAAK,SAAS;AAAA,IACd,KAAK,SAAS;AAAA,IACd,SAAS,SAAS;AAAA,IAClB,UAAU,SAAS;AAAA,IACnB,UAAU,SAAS;AAAA,EACrB,CAAC;AACD,QAAM,SAAS,MAAM;AACrB,SAAO;AAAA,IACL,QAAQ,OAAO;AAAA,IACf,QAAQ,OAAO;AAAA,IACf,UAAU,OAAO;AAAA,IACjB,YAAY,KAAK,IAAI,IAAI;AAAA,EAC3B;AACF;AAEA,SAAS,aAAa,OAAgB,WAAkC;AACtE,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,QAAQ,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,IAC7D,UAAU;AAAA,IACV,YAAY,KAAK,IAAI,IAAI;AAAA,EAC3B;AACF;AAEA,SAAS,uBACP,QACA,SACqB;AACrB,MAAI,SAAS,cAAc,OAAW,QAAO,QAAQ,YAAY,SAAS;AAC1E,SAAO,iBAAiB,MAAM;AAChC;AAEA,IAAM,YAAY,eAA4C;AAAA,EAC5D,MAAM;AAAA,EACN,OAAO,CAAC,QAAQ,SAAS,YAAY;AACnC,QAAI,SAAS,YAAY,WAAc,QAAQ,YAAY,QAAQ,OAAO,QAAQ,YAAY,YAAY,MAAM,QAAQ,QAAQ,OAAO,IAAI;AACzI,YAAM,IAAI,kBAAkB,WAAW,qDAAqD;AAAA,IAC9F;AACA,QAAI,SAAS,cAAc,UAAa,SAAS,eAAe,UAC5D,SAAS,eAAe,UAAa,SAAS,iBAAiB,UAC/D,SAAS,SAAS,eAAe,UAAa,SAAS,SAAS,iBAAiB,UACjF,SAAS,SAAS,cAAc,UAAa,SAAS,SAAS,eAAe,QAAW;AAC3F,YAAM,IAAI,kBAAkB,YAAY,+DAA+D;AAAA,IACzG;AACA,QAAI,SAAS,eAAe,UAAa,SAAS,cAAc,UAAa,SAAS,eAAe,QAAW;AAC9G,aAAO,EAAE,QAAQ,eAAe,QAAQ,8GAA8G;AAAA,IACxJ;AACA,QAAI,uBAAuB,QAAQ,OAAO,MAAM,cAAc;AAC5D,aAAO,EAAE,QAAQ,eAAe,QAAQ,mIAAmI;AAAA,IAC7K;AACA,QAAI,QAAQ,cAAc,QAAQ,QAAQ,cAAc,OAAO;AAC7D,aAAO,EAAE,QAAQ,WAAW,QAAQ,qDAAqD;AAAA,IAC3F;AACA,WAAO,EAAE,QAAQ,aAAa,eAAe,EAAE,OAAO,QAAQ,OAAO,WAAW,QAAQ,UAAU,EAAE;AAAA,EACtG;AAAA,EACA,SAAS;AAAA,IACP,WAAW;AAAA,MACT,QAAQ,OAAO,QAAsB,YAAkC;AACrE,cAAM,WAAW,cAAc,MAAM;AACrC,cAAM,SAAS,aAAa,QAAQ,QAAQ;AAI5C,cAAM,YACJ,SAAS,cAAc,SACnB,QAAQ,YACN,SACA,eACF,SAAS;AAEf,YAAI,SAAS,cAAc,cAAc,QAAQ;AAC/C,gBAAM,IAAI;AAAA,YACR;AAAA,UACF;AAAA,QACF;AAEA,YAAI,cAAc,QAAQ;AACxB,gBAAM,SAAS,oBAAoB,OAAO;AAC1C,uBAAa,IAAI,QAAQ,MAAM;AAC/B,iBAAO,EAAE,UAAU,aAAa,QAAQ,EAAE,IAAI,OAAO,GAAG,QAAQ,GAAG,YAAY,OAAO;AAAA,QACxF;AAEA,YAAI,SAAS,QAAQ;AACnB,gBAAM,IAAI;AAAA,YACR;AAAA,UAEF;AAAA,QACF;AAEA,YAAI;AACJ,YAAI,SAAS,YAAY;AAGvB,gBAAM,SAAS,MAAM,OAAO,UAAU,IAAI,QAAQ,UAAU;AAC5D,eAAK,MAAM,OAAO,KAAK,EAAE,MAAM,SAAS,KAAK,CAAC;AAAA,QAChD,WAAW,SAAS,WAAW;AAI7B,cAAI,SAAS,QAAQ;AACnB,kBAAM,IAAI;AAAA,cACR;AAAA,YACF;AAAA,UACF;AACA,eAAK,MAAM,OAAO,UAAU,IAAI,QAAQ,SAAS;AACjD,gBAAM,gBAAgB,EAAE;AAAA,QAC1B,OAAO;AACL,eAAK,MAAM,OAAO,UAAU,OAAO,iBAAiB,OAAO,GAAG;AAAA,YAC5D,MAAM;AAAA,UACR,CAAC;AAAA,QACH;AACA,YAAI,GAAG,WAAW,UAAU;AAC1B,gBAAM,IAAI,MAAM,kBAAkB,GAAG,EAAE,mBAAmB,GAAG,aAAa,KAAK,GAAG,UAAU,KAAK,EAAE,EAAE;AAAA,QACvG;AACA,qBAAa,IAAI,GAAG,IAAI,YAAY;AACpC,eAAO,EAAE,UAAU,WAAW,QAAQ,IAAI,QAAQ,GAAG,YAAY,GAAG,GAAG;AAAA,MACzE;AAAA,MAEA,SAAS,OAAO,QAAsB,cAAsB;AAC1D,cAAM,WAAW,cAAc,MAAM;AACrC,cAAM,SAAS,aAAa,QAAQ,QAAQ;AAC5C,YAAI;AACF,cAAI,UAAU,WAAW,QAAQ,MAAM,QAAQ;AAC7C,kBAAM,OAAO,MAAM,OAAO,MAAM,IAAI,SAAS;AAC7C,mBAAO,EAAE,UAAU,aAAa,QAAQ,MAAM,QAAQ,GAAG,YAAY,KAAK,GAAG;AAAA,UAC/E;AACA,gBAAM,KAAK,MAAM,OAAO,UAAU,IAAI,SAAS;AAC/C,gBAAM,gBAAgB,EAAE;AACxB,iBAAO,EAAE,UAAU,WAAW,QAAQ,IAAI,QAAQ,GAAG,YAAY,GAAG,GAAG;AAAA,QACzE,QAAQ;AACN,iBAAO;AAAA,QACT;AAAA,MACF;AAAA;AAAA;AAAA,MAIA,MAAM,OAAO,WAAyB;AACpC,cAAM,WAAW,cAAc,MAAM;AACrC,cAAM,SAAS,aAAa,QAAQ,QAAQ;AAC5C,YAAI,SAAS,cAAc,QAAQ;AACjC,gBAAM,QAAQ,MAAM,OAAO,MAAM,KAAK;AACtC,iBAAO,MAAM,IAAI,CAAC,UAAU,EAAE,UAAU,aAAa,QAAQ,MAAM,QAAQ,GAAG,YAAY,KAAK,GAAG,EAAE;AAAA,QACtG;AACA,cAAM,MAAM,MAAM,OAAO,UAAU,KAAK;AACxC,eAAO,IACJ,OAAO,CAAC,OAAO,CAAC,aAAa,EAAE,KAAK,GAAG,WAAW,cAAc,GAAG,WAAW,SAAS,EACvF,IAAI,CAAC,QAAQ,EAAE,UAAU,WAAW,QAAQ,IAAI,QAAQ,GAAG,YAAY,GAAG,GAAG,EAAE;AAAA,MACpF;AAAA,MAEA,SAAS,OAAO,QAAsB,cAAsB;AAC1D,cAAM,WAAW,cAAc,MAAM;AAGrC,cAAM,OAAO,UAAU,WAAW,QAAQ;AAC1C,qBAAa,OAAO,SAAS;AAC7B,YAAI,SAAS,OAAQ;AACrB,cAAM,SAAS,aAAa,QAAQ,QAAQ;AAC5C,YAAI;AACJ,YAAI;AACF,eAAK,MAAM,OAAO,UAAU,IAAI,SAAS;AAAA,QAC3C,SAAS,OAAO;AACd,cAAI,iBAAiB,gBAAgB,MAAM,WAAW,OAAO,MAAM,WAAW,KAAM;AACpF,gBAAM;AAAA,QACR;AACA,cAAM,gBAAgB,EAAE;AAAA,MAC1B;AAAA,MAEA,YAAY,OACV,SACA,SACA,YAC2B;AAC3B,cAAM,YAAY,KAAK,IAAI;AAC3B,YAAI;AACF,cAAI,QAAQ,IAAI;AACd,kBAAM,EAAE,UAAU,MAAM,UAAU,MAAM,GAAG,KAAK,IAAI,WAAW,CAAC;AAChE,mBAAO,MAAM,aAAa,QAAQ,IAAI,SAAS,IAAI;AAAA,UACrD;AACA,gBAAM,SAAS,MAAM,WAAW,SAAS,YAAY,SAAS,OAAO,CAAC;AACtE,iBAAO;AAAA,YACL,QAAQ,OAAO,UAAU;AAAA,YACzB,QAAQ,OAAO,UAAU;AAAA,YACzB,UAAU,OAAO;AAAA,YACjB,YAAY,KAAK,IAAI,IAAI;AAAA,UAC3B;AAAA,QACF,SAAS,OAAO;AACd,iBAAO,aAAa,OAAO,SAAS;AAAA,QACtC;AAAA,MACF;AAAA;AAAA;AAAA,MAIA,eAAe,OACb,SACA,SACA,YAC2B;AAC3B,cAAM,YAAY,KAAK,IAAI;AAC3B,YAAI;AACF,cAAI,QAAQ,GAAI,QAAO,MAAM,aAAa,QAAQ,IAAI,SAAS,OAAO;AACtE,gBAAM,SAAS,MAAM,WAAW,SAAS,YAAY,SAAS,OAAO,CAAC;AACtE,cAAI,OAAO,OAAQ,SAAQ,WAAW,OAAO,MAAM;AACnD,cAAI,OAAO,OAAQ,SAAQ,WAAW,OAAO,MAAM;AACnD,iBAAO;AAAA,YACL,QAAQ,OAAO,UAAU;AAAA,YACzB,QAAQ,OAAO,UAAU;AAAA,YACzB,UAAU,OAAO;AAAA,YACjB,YAAY,KAAK,IAAI,IAAI;AAAA,UAC3B;AAAA,QACF,SAAS,OAAO;AACd,iBAAO,aAAa,OAAO,SAAS;AAAA,QACtC;AAAA,MACF;AAAA,MAEA,cAAc,OACZ,SACA,SACA,YAC2B;AAC3B,YAAI,CAAC,QAAQ,IAAI;AACf,gBAAM,IAAI;AAAA,YACR;AAAA,UACF;AAAA,QACF;AACA,cAAM,YAAY,KAAK,IAAI;AAC3B,cAAM,EAAE,MAAM,MAAM,OAAO,OAAO,IAAI,MAAM,eAAe,QAAQ,IAAI,SAAS;AAAA,UAC9E,KAAK,QAAQ;AAAA,UACb,KAAK,QAAQ;AAAA,UACb,UAAU,QAAQ;AAAA,UAClB,UAAU,QAAQ;AAAA,QACpB,CAAC;AAED,YAAI,CAAC,QAAQ,MAAO,OAAM,KAAK,WAAW,EAAE,MAAM,MAAM;AAAA,QAAC,CAAC;AAE1D,YAAI;AACJ,cAAM,WAAW,KAAK,KAAK,CAAC,WAAW;AACrC,mBAAS;AACT,kBAAQ,SAAS,EAAE,UAAU,OAAO,UAAU,QAAQ,OAAO,OAAO,CAAC;AACrE,iBAAO;AAAA,QACT,CAAC;AACD,cAAM,WAAW,CAAC,YAAkC;AAAA,UAClD,QAAQ,OAAO;AAAA,UACf,QAAQ,OAAO;AAAA,UACf,UAAU,OAAO;AAAA,UACjB,QAAQ,OAAO;AAAA,UACf,YAAY,KAAK,IAAI,IAAI;AAAA,QAC3B;AAEA,eAAO;AAAA,UACL,KAAK;AAAA,UACL,OAAO,KAAK;AAAA,UACZ,SAAS;AAAA,UACT,OAAO,OAAO,SAAS;AACrB,gBAAI,CAAC,QAAQ,OAAO;AAClB,oBAAM,IAAI,MAAM,yCAAyC;AAAA,YAC3D;AACA,kBAAM,KAAK,UAAU,IAAI;AAAA,UAC3B;AAAA,UACA,YAAY,YAAY;AACtB,gBAAI,QAAQ,SAAS,CAAC,OAAQ,OAAM,KAAK,WAAW;AAAA,UACtD;AAAA,UACA,QAAQ,YACN,SACI,EAAE,QAAQ,UAAU,UAAU,OAAO,UAAU,QAAQ,OAAO,QAAQ,QAAQ,OAAO,QAAQ,QAAQ,OAAO,OAAO,IACnH,EAAE,QAAQ,WAAW,UAAU,MAAM,QAAQ,MAAM,QAAQ,OAAO,QAAQ,QAAQ,OAAO,OAAO;AAAA,UACtG,MAAM,OAAO,gBAAgB;AAC3B,gBAAI,aAAa,YAAY,OAAW,QAAO,SAAS,MAAM,QAAQ;AACtE,gBAAI;AACJ,kBAAM,UAAU,IAAI,QAAe,CAAC,GAAG,WAAW;AAChD,sBAAQ;AAAA,gBACN,MAAM,OAAO,IAAI,MAAM,WAAW,KAAK,EAAE,wBAAwB,YAAY,OAAO,IAAI,CAAC;AAAA,gBACzF,YAAY;AAAA,cACd;AAAA,YACF,CAAC;AACD,gBAAI;AACF,qBAAO,SAAS,MAAM,QAAQ,KAAK,CAAC,UAAU,OAAO,CAAC,CAAC;AAAA,YACzD,UAAE;AACA,2BAAa,KAAK;AAAA,YACpB;AAAA,UACF;AAAA;AAAA;AAAA,UAGA,MAAM,OAAO,WAAW;AACtB,gBAAI,OAAQ;AACZ,kBAAM,aAAa,UAAU;AAC7B,kBAAM,KAAK,KAAK;AAAA,UAClB;AAAA,QACF;AAAA,MACF;AAAA,MAEA,SAAS,OAAO,YAAkD;AAChE,YAAI,QAAQ,IAAI;AACd,gBAAM,KAAK,QAAQ;AACnB,iBAAO;AAAA,YACL,IAAI,GAAG;AAAA,YACP,UAAU;AAAA,YACV,QACE,GAAG,WAAW,YACV,YACA,GAAG,WAAW,WACZ,UACA;AAAA,YACR,WAAW,GAAG;AAAA,YACd,SAAS,GAAG,gBAAgB;AAAA,YAC5B,UAAU;AAAA,cACR,MAAM,GAAG;AAAA,cACT,cAAc,GAAG;AAAA,cACjB,WAAW,GAAG;AAAA,cACd,YAAY,GAAG;AAAA,cACf,WAAW,GAAG;AAAA,cACd,UAAU,GAAG;AAAA,YACf;AAAA,UACF;AAAA,QACF;AACA,cAAM,WAAW,YAAY,QAAQ,OAAO,QAAQ,OAAO;AAC3D,eAAO;AAAA,UACL,IAAI,QAAQ,KAAK;AAAA,UACjB,UAAU;AAAA,UACV,QAAQ,CAAC,YAAY,SAAS,WAAW,UAAU,YAAY;AAAA,UAC/D,WAAW,WAAW,IAAI,KAAK,SAAS,SAAS,IAAI,QAAQ;AAAA,UAC7D,SAAS;AAAA,UACT,UAAU,WACN;AAAA,YACE,MAAM,SAAS;AAAA,YACf,cAAc,SAAS;AAAA,YACvB,QAAQ,SAAS;AAAA,YACjB,UAAU,SAAS;AAAA,UACrB,IACA,CAAC;AAAA,QACP;AAAA,MACF;AAAA,MAEA,QAAQ,OACN,SACA,YACoB;AACpB,YAAI,QAAQ,IAAI;AACd,gBAAM,QAAQ,GAAG,QAAQ;AACzB,gBAAM,WAAW,QAAQ,GAAG,WAAW;AAAA,YACrC,CAAC,MAAM,EAAE,SAAS,QAAQ;AAAA,UAC5B;AACA,cAAI,CAAC,UAAU;AACb,kBAAM,IAAI;AAAA,cACR,+BAA+B,QAAQ,IAAI,uBAAuB,QAAQ,GAAG,EAAE;AAAA,YACjF;AAAA,UACF;AACA,iBAAO,GAAG,QAAQ,YAAY,OAAO,MAAM,SAAS,QAAQ;AAAA,QAC9D;AACA,cAAM,IAAI;AAAA,UACR,sJACsD,QAAQ,IAAI;AAAA,QAEpE;AAAA,MACF;AAAA,MAEA,YAAY;AAAA,QACV,UAAU,OAAO,SAAS,MAAM,eAAe;AAC7C,cAAI,QAAQ,IAAI;AACd,kBAAMA,UAAmB,CAAC;AAC1B,gBAAI;AACF,oBAAM,QAAQ,GAAG,MAAM,aAAa,MAAM,CAAC,UAAU;AACnD,gBAAAA,QAAO,KAAK,OAAO,KAAK,KAAK,CAAC;AAAA,cAChC,CAAC;AAAA,YACH,SAAS,OAAO;AACd,oBAAM,IAAI;AAAA,gBACR,kBAAkB,IAAI,KACpB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CACvD;AAAA,cACF;AAAA,YACF;AACA,mBAAO,OAAO,OAAOA,OAAM,EAAE,SAAS,MAAM;AAAA,UAC9C;AACA,gBAAM,WAAW,kBAAkB,SAAS,IAAI;AAChD,gBAAM,aAAa,MAAM;AAAA,YACvB;AAAA,YACA,WAAW,YAAY,QAAQ,CAAC;AAAA,UAClC;AACA,cAAI,WAAW,aAAa,GAAG;AAC7B,kBAAM,IAAI,MAAM,kBAAkB,IAAI,KAAK,WAAW,MAAM,EAAE;AAAA,UAChE;AAEA,gBAAM,WAAW,WAAW,OAAO,KAAK;AACxC,cAAI,CAAC,QAAQ,KAAK,QAAQ,GAAG;AAC3B,kBAAM,IAAI;AAAA,cACR,kBAAkB,IAAI;AAAA,YACxB;AAAA,UACF;AAEA,gBAAM,OAAO,OAAO,QAAQ;AAC5B,cAAI,CAAC,OAAO,cAAc,IAAI,GAAG;AAC/B,kBAAM,IAAI;AAAA,cACR,kBAAkB,IAAI;AAAA,YACxB;AAAA,UACF;AACA,cAAI,SAAS,EAAG,QAAO;AAEvB,gBAAM,SAAmB,CAAC;AAC1B,mBACM,SAAS,GACb,SAAS,MACT,UAAU,6BACV;AACA,kBAAM,gBAAgB,KAAK;AAAA,cACzB;AAAA,cACA,OAAO;AAAA,YACT;AACA,kBAAM,SAAS,MAAM;AAAA,cACnB;AAAA,cACA,SAAS,YAAY,QAAQ,CAAC,cAAc,MAAM,UAAU,aAAa;AAAA,YAC3E;AACA,gBAAI,OAAO,aAAa,GAAG;AACzB,oBAAM,IAAI,MAAM,kBAAkB,IAAI,KAAK,OAAO,MAAM,EAAE;AAAA,YAC5D;AAEA,kBAAM,UAAU,OAAO,OAAO,QAAQ,OAAO,EAAE;AAC/C,gBACE,QAAQ,WAAW,KACnB,QAAQ,SAAS,MAAM,KACvB,CAAC,yBAAyB,KAAK,OAAO,GACtC;AACA,oBAAM,IAAI;AAAA,gBACR,kBAAkB,IAAI,sDAAsD,MAAM;AAAA,cACpF;AAAA,YACF;AAEA,kBAAM,QAAQ,OAAO,KAAK,SAAS,QAAQ;AAC3C,gBAAI,MAAM,WAAW,eAAe;AAClC,oBAAM,IAAI;AAAA,gBACR,kBAAkB,IAAI,sDAAsD,MAAM;AAAA,cACpF;AAAA,YACF;AACA,mBAAO,KAAK,KAAK;AAAA,UACnB;AAEA,iBAAO,OAAO,OAAO,MAAM,EAAE,SAAS,MAAM;AAAA,QAC9C;AAAA,QAEA,WAAW,OAAO,SAAS,MAAM,SAAS,eAAe;AACvD,cAAI,QAAQ,IAAI;AACd,gBAAI;AACF,oBAAM,QAAQ,GAAG,MAAM;AAAA,gBACrB,OAAO,KAAK,SAAS,MAAM;AAAA,gBAC3B;AAAA,cACF;AAAA,YACF,SAAS,OAAO;AACd,oBAAM,IAAI;AAAA,gBACR,mBAAmB,IAAI,KACrB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CACvD;AAAA,cACF;AAAA,YACF;AACA;AAAA,UACF;AACA,gBAAM,WAAW,kBAAkB,SAAS,IAAI;AAChD,gBAAM,SAAS,MAAM,QAAQ,QAAQ;AACrC,gBAAM,UAAU,OAAO,KAAK,SAAS,MAAM,EAAE,SAAS,QAAQ;AAC9D,gBAAM,WAAW,GAAG,QAAQ,qBAAqB,WAAW,CAAC;AAC7D,cAAI,UAAU;AAEd,cAAI;AACF,gBAAI,QAAQ,WAAW,GAAG;AACxB,wBAAU;AACV,oBAAM,SAAS,MAAM;AAAA,gBACnB;AAAA,gBACA;AAAA,kBACE;AAAA,kBACA;AAAA,oBACE,YAAY,YAAY,MAAM,CAAC;AAAA,oBAC/B,OAAO,YAAY,QAAQ,CAAC;AAAA,oBAC5B,0BAA0B,UAAU,QAAQ;AAAA,kBAC9C,EAAE,KAAK,MAAM;AAAA,gBACf;AAAA,cACF;AACA,kBAAI,OAAO,aAAa,GAAG;AACzB,sBAAM,IAAI,MAAM,OAAO,MAAM;AAAA,cAC/B;AACA;AAAA,YACF;AAEA,kBAAM,YAAY,kBAAkB,QAAQ,UAAU,QAAQ;AAC9D,qBAAS,SAAS,GAAG,SAAS,QAAQ,QAAQ,UAAU,WAAW;AACjE,oBAAM,UAAU,WAAW;AAC3B,oBAAM,UAAU,SAAS,aAAa,QAAQ;AAC9C,wBAAU;AACV,oBAAM,SAAS,MAAM;AAAA,gBACnB;AAAA,gBACA;AAAA,kBACE;AAAA,kBACA;AAAA,oBACE;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA,QAAQ,MAAM,QAAQ,SAAS,SAAS;AAAA,oBACxC;AAAA,oBACA;AAAA,kBACF;AAAA,gBACF;AAAA,cACF;AACA,kBAAI,OAAO,aAAa,GAAG;AACzB,sBAAM,IAAI,MAAM,OAAO,MAAM;AAAA,cAC/B;AAAA,YACF;AAAA,UACF,SAAS,OAAO;AACd,gBAAI,SAAS;AACX,kBAAI;AACF,sBAAM;AAAA,kBACJ;AAAA,kBACA,kBAAkB,SAAS,SAAS,YAAY,QAAQ,CAAC,EAAE;AAAA,gBAC7D;AAAA,cACF,QAAQ;AAAA,cAER;AAAA,YACF;AACA,kBAAM,IAAI;AAAA,cACR,mBAAmB,IAAI,KACrB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CACvD;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,QAEA,OAAO,OAAO,SAAS,MAAM,eAAe;AAC1C,gBAAM,WAAW,kBAAkB,SAAS,IAAI;AAChD,gBAAM,SAAS,MAAM;AAAA,YACnB;AAAA,YACA,kBAAkB,SAAS,YAAY,YAAY,QAAQ,CAAC,EAAE;AAAA,UAChE;AACA,cAAI,OAAO,aAAa,GAAG;AACzB,kBAAM,IAAI,MAAM,8BAA8B,IAAI,KAAK,OAAO,MAAM,EAAE;AAAA,UACxE;AAAA,QACF;AAAA,QAEA,SAAS,OAAO,SAAS,MAAM,eAAe;AAC5C,gBAAM,WAAW,kBAAkB,SAAS,IAAI;AAEhD,gBAAM,SAAS,MAAM;AAAA,YACnB;AAAA,YACA,QAAQ,YAAY,QAAQ,CAAC;AAAA;AAAA,UAC/B;AACA,cAAI,OAAO,aAAa,GAAG;AACzB,kBAAM,IAAI,MAAM,4BAA4B,IAAI,KAAK,OAAO,MAAM,EAAE;AAAA,UACtE;AACA,gBAAM,UAAuB,CAAC;AAC9B,qBAAW,QAAQ,OAAO,OAAO,MAAM,IAAI,GAAG;AAC5C,gBAAI,CAAC,KAAM;AACX,kBAAM,CAAC,UAAU,SAAS,UAAU,GAAG,SAAS,IAAI,KAAK,MAAM,GAAI;AACnE,kBAAM,OAAO,UAAU,KAAK,GAAI;AAChC,oBAAQ,KAAK;AAAA,cACX;AAAA,cACA,MAAM,aAAa,MAAM,cAAc;AAAA,cACvC,MAAM,SAAS,SAAS,EAAE,KAAK;AAAA,cAC/B,UAAU,IAAI,KAAK,WAAW,QAAQ,IAAI,GAAI;AAAA,YAChD,CAAC;AAAA,UACH;AACA,iBAAO;AAAA,QACT;AAAA,QAEA,QAAQ,OAAO,SAAS,MAAM,eAAe;AAC3C,gBAAM,WAAW,kBAAkB,SAAS,IAAI;AAChD,gBAAM,SAAS,MAAM,WAAW,SAAS,WAAW,YAAY,QAAQ,CAAC,EAAE;AAC3E,iBAAO,OAAO,aAAa;AAAA,QAC7B;AAAA,QAEA,QAAQ,OAAO,SAAS,MAAM,eAAe;AAC3C,gBAAM,WAAW,kBAAkB,SAAS,IAAI;AAChD,cAAI,CAAC,QAAQ,MAAM,aAAa,mBAAmB;AACjD,kBAAM,IAAI,MAAM,gDAAgD;AAAA,UAClE;AACA,gBAAM,SAAS,MAAM;AAAA,YACnB;AAAA,YACA,kBAAkB,SAAS,UAAU,YAAY,QAAQ,CAAC,EAAE;AAAA,UAC9D;AACA,cAAI,OAAO,aAAa,GAAG;AACzB,kBAAM,IAAI,MAAM,oBAAoB,IAAI,KAAK,OAAO,MAAM,EAAE;AAAA,UAC9D;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA,MAMA,OAAO,OAAO,YAA2B;AACvC,cAAM,UAAU,SAAS,OAAO,EAAE,MAAM;AAAA,MAC1C;AAAA,MAEA,QAAQ,OAAO,YAA2B;AACxC,cAAM,UAAU,SAAS,QAAQ,EAAE,OAAO;AAAA,MAC5C;AAAA,MAEA,mBAAmB,EAAE,QAAQ,MAAM,eAAe,EAAE,WAAW,MAAM,EAAE;AAAA,MAEvE,aAAa,CAAC,YAA0C;AAAA,IAC1D;AAAA;AAAA;AAAA;AAAA;AAAA,IAMA,UAAU;AAAA;AAAA;AAAA,MAGR,cAAc;AAAA,QACZ,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,gBAAgB;AAAA,QAChB,eAAe,EAAE,WAAW,MAAM;AAAA,MACpC;AAAA,MAEA,QAAQ,OACN,QACA,WACA,YACG;AACH,cAAM,WAAW,cAAc,MAAM;AACrC,cAAM,SAAS,aAAa,QAAQ,QAAQ;AAC5C,YAAI;AACJ,YAAI;AACF,gBAAM,SAAS,MAAM,OAAO,UAAU,IAAI,SAAS;AACnD,iBAAO,MAAM,OAAO,KAAK,EAAE,MAAM,aAAa,SAAS,IAAI,EAAE,CAAC;AAC9D,cAAI,KAAK,WAAW,UAAW,OAAM,KAAK,MAAM;AAChD,iBAAO;AAAA,YACL,IAAI,KAAK;AAAA,YACT,UAAU;AAAA,YACV,WAAW,KAAK,aAAa,oBAAI,KAAK;AAAA,YACtC,UAAU,EAAE,MAAM,SAAS,MAAM,YAAY,KAAK,MAAM,UAAU,UAAU;AAAA,UAC9E;AAAA,QACF,SAAS,OAAO;AACd,cAAI,KAAM,OAAM,gBAAgB,IAAI,EAAE,MAAM,MAAM;AAAA,UAAC,CAAC;AACpD,gBAAM,IAAI;AAAA,YACR,qCACE,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CACvD;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,MAEA,MAAM,OAAO,WAAyB;AACpC,cAAM,WAAW,cAAc,MAAM;AACrC,cAAM,SAAS,aAAa,QAAQ,QAAQ;AAC5C,cAAM,MAAM,MAAM,OAAO,UAAU,KAAK;AACxC,eAAO,IACJ,OAAO,CAAC,OAAO,aAAa,EAAE,KAAK,GAAG,WAAW,cAAc,GAAG,WAAW,SAAS,EACtF,IAAI,CAAC,QAAQ;AAAA,UACZ,IAAI,GAAG;AAAA,UACP,UAAU;AAAA,UACV,WAAW,GAAG;AAAA,UACd,UAAU,EAAE,YAAY,GAAG,MAAM,cAAc,GAAG,OAAO;AAAA,QAC3D,EAAE;AAAA,MACN;AAAA,MAEA,QAAQ,OAAO,QAAsB,eAAuB;AAC1D,cAAM,WAAW,cAAc,MAAM;AACrC,cAAM,SAAS,aAAa,QAAQ,QAAQ;AAC5C,YAAI;AACJ,YAAI;AACF,eAAK,MAAM,OAAO,UAAU,IAAI,UAAU;AAAA,QAC5C,SAAS,OAAO;AACd,cAAI,iBAAiB,eAAe,MAAM,WAAW,IAAK;AAC1D,gBAAM;AAAA,QACR;AACA,cAAM,gBAAgB,EAAE;AAAA,MAC1B;AAAA,IACF;AAAA,EACF;AACF,CAAC;AAEM,IAAM,SAAS,CAAC,SAAuB,CAAC,MAAM,UAAU,MAAM;","names":["chunks"]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["/**\n * Archil Provider\n *\n * Archil sandboxes are persistent Linux VMs (Firecracker, durable root\n * filesystem), and that is what this provider creates by default. Commands,\n * streaming and background processes run through Archil's native process API\n * (a WebSocket fetched fresh per process via POST\n * /api/sandboxes/{id}/connections); files move through its native file\n * transfer API; snapshots are paused forks restored with create({ snapshotId }).\n *\n * The older disk exec surface — each command runs in a fresh Archil-managed\n * container with a disk mounted at /mnt/archil — is opt-in with\n * `execution: \"exec\"` (or ARCHIL_EXECUTION=exec) plus a disk id.\n */\n\nimport { defineProvider, InstanceSizeError } from '@computesdk/provider';\nimport { Archil as ArchilClient, ArchilError } from 'disk';\nimport type {\n CreateSandboxRequest as ArchilSandboxRequest,\n Sandbox as ArchilVm,\n SandboxProcessResult,\n} from 'disk';\nimport { randomUUID } from 'node:crypto';\nimport { posix } from 'node:path';\nimport type {\n CommandResult,\n InstanceInfo,\n CreateInstanceOptions,\n FileEntry,\n ProcessHandle,\n RunCommandOptions,\n StartProcessOptions,\n} from 'computesdk';\n\nconst ARCHIL_MOUNT_ROOT = '/mnt/archil';\nconst ARCHIL_MAX_EXEC_COMMAND_BYTES = 102_400;\n// Base64 expands the file data and adds line wrapping. Keep the raw chunk\n// comfortably below Archil's roughly 4 MiB response cap.\nconst ARCHIL_MAX_READ_CHUNK_BYTES = 2 * 1024 * 1024;\n\n// Per-region color overrides. Default is \"green\" for any region not listed here.\nconst REGION_COLORS: Record<string, string> = {\n 'gcp-us-central1': 'blue',\n};\n\nfunction regionToBaseUrl(region: string): string {\n const dash = region.indexOf('-');\n if (dash <= 0 || dash === region.length - 1) {\n throw new Error(\n `Invalid Archil region \"${region}\". Expected \"{cloud}-{suffix}\", e.g. \"aws-us-east-1\".`,\n );\n }\n const cloud = region.slice(0, dash);\n const suffix = region.slice(dash + 1);\n const color = REGION_COLORS[region] ?? 'green';\n return `https://control.${color}.${suffix}.${cloud}.prod.archil.com`;\n}\n\n/**\n * Archil execution mode:\n * - \"persistent\" (default): a persistent sandbox VM run through the process API.\n * - \"exec\": serverless per-command containers on an existing disk (opt-in).\n */\nexport type ArchilExecutionMode = 'exec' | 'persistent';\n\nexport interface ArchilConfig {\n /** Archil API key. Falls back to ARCHIL_API_KEY env var. */\n apiKey?: string;\n /** Archil region (e.g. \"aws-us-east-1\"). Falls back to ARCHIL_REGION env var. */\n region?: string;\n /** Override the control-plane base URL (useful for testing). */\n baseUrl?: string;\n /**\n * Which Archil compute surface to use. Falls back to ARCHIL_EXECUTION, then\n * \"persistent\": create() provisions a persistent sandbox VM. \"exec\"\n * resolves create({ diskId }) to a disk exec handle instead. Per-sandbox\n * override: `ephemeral` on create() options (true -> exec handle, false ->\n * persistent VM).\n */\n execution?: ArchilExecutionMode;\n}\n\ninterface DiskResponse {\n id: string;\n name: string;\n organization: string;\n status: string;\n provider: string;\n region: string;\n createdAt: string;\n}\n\ntype DiskHandle = Pick<DiskResponse, 'id'>;\n\ninterface ExecTiming {\n totalMs: number;\n queueMs: number;\n executeMs: number;\n}\n\ninterface ExecResponse {\n exitCode: number;\n stdout: string;\n stderr: string;\n timing: ExecTiming;\n}\n\ninterface ResolvedConfig {\n apiKey: string;\n baseUrl: string;\n execution: ArchilExecutionMode;\n}\n\ninterface ArchilSandbox {\n client: ArchilClient;\n disk: DiskHandle | DiskResponse;\n /** Set only in \"persistent\" execution mode. */\n vm?: ArchilVm;\n resolved: ResolvedConfig;\n createdAt: Date;\n /** persistent mode: pause the VM, preserving CPU and memory state. */\n pause?: () => Promise<void>;\n /** persistent mode: resume the paused VM under the same sandbox id. */\n resume?: () => Promise<void>;\n}\n\nfunction vmInstance(\n client: ArchilClient,\n vm: ArchilVm,\n resolved: ResolvedConfig,\n): ArchilSandbox {\n return {\n client,\n disk: { id: vm.id },\n vm,\n resolved,\n createdAt: new Date(),\n pause: async () => {\n await vm.pause();\n },\n resume: async () => {\n await vm.resume();\n },\n };\n}\n\ninterface ArchilCreateOptions extends CreateInstanceOptions {\n /**\n * exec mode: id of the existing disk to run commands against. Required in\n * \"exec\" mode; ignored in \"persistent\" mode.\n */\n diskId?: string;\n /** persistent mode: OCI base image (e.g. \"node:24-bookworm\"). */\n baseImage?: string;\n /** persistent mode: environment variables baked into the sandbox. */\n env?: Record<string, string>;\n /** persistent mode: lifetime budget per powered-on session, in seconds. */\n maxTtlSeconds?: number;\n /** persistent mode: Archil SDK-native CPU and memory fields. */\n vcpuCount?: number;\n memSizeMiB?: number;\n /** persistent mode: extra Archil sandbox fields (network policy, etc.). */\n sandbox?: Omit<\n ArchilSandboxRequest,\n 'name' | 'baseImage' | 'env' | 'maxTtlSeconds'\n >;\n}\n\nfunction resolveConfig(config: ArchilConfig): ResolvedConfig {\n const apiKey = config.apiKey ?? process.env.ARCHIL_API_KEY;\n const region = config.region ?? process.env.ARCHIL_REGION;\n\n if (!apiKey) {\n throw new Error(\n 'Missing API key for Archil.\\n\\n' +\n 'Pass it: archil({ apiKey: \"...\" })\\n' +\n 'Or set ARCHIL_API_KEY in your environment.',\n );\n }\n\n let baseUrl = config.baseUrl;\n if (!baseUrl) {\n if (!region) {\n throw new Error(\n 'Missing region for Archil.\\n\\n' +\n 'Pass it: archil({ region: \"...\" })\\n' +\n 'Or set ARCHIL_REGION in your environment.\\n' +\n 'Examples: \"aws-us-east-1\", \"aws-eu-west-1\", \"gcp-us-central1\".',\n );\n }\n baseUrl = regionToBaseUrl(region);\n }\n\n return { apiKey, baseUrl, execution: resolveExecution(config) };\n}\n\nfunction resolveExecution(config: ArchilConfig): ArchilExecutionMode {\n if (config.execution) return config.execution;\n const fromEnv = process.env.ARCHIL_EXECUTION?.trim().toLowerCase();\n if (!fromEnv) return 'persistent';\n if (fromEnv === 'exec' || fromEnv === 'persistent') return fromEnv;\n throw new Error(\n `Invalid ARCHIL_EXECUTION \"${process.env.ARCHIL_EXECUTION}\". Expected \"persistent\" (default) or \"exec\".`,\n );\n}\n\nfunction createClient(config: ArchilConfig, resolved: ResolvedConfig): ArchilClient {\n const region = config.region ?? process.env.ARCHIL_REGION ?? 'aws-us-east-1';\n return new ArchilClient({ ...resolved, region });\n}\n\nfunction resolveCreateDiskId(options?: ArchilCreateOptions): string {\n // `sandboxId` is accepted as an alias: exec-mode sandboxes are addressed by\n // their disk id.\n const diskId = options?.diskId ?? options?.sandboxId;\n\n if (!diskId) {\n throw new Error(\n 'Archil create() requires an existing disk id on the top-level options.\\n\\n' +\n 'Example:\\n' +\n ' provider.sandbox.create({ diskId: \"disk_abc123\" })',\n );\n }\n\n return diskId;\n}\n\n\nfunction shellEscape(value: string): string {\n return `'${value.replace(/'/g, `'\\\\''`)}'`;\n}\n\nfunction mapFilesystemPath(sandbox: ArchilSandbox, path: string): string {\n const normalized = posix.normalize(path.startsWith('/') ? path : `/${path}`);\n\n // In persistent mode the filesystem is the VM's own filesystem.\n if (sandbox.vm) {\n return normalized;\n }\n\n if (normalized === '/') {\n return ARCHIL_MOUNT_ROOT;\n }\n\n if (\n normalized === ARCHIL_MOUNT_ROOT ||\n normalized.startsWith(`${ARCHIL_MOUNT_ROOT}/`)\n ) {\n return normalized;\n }\n\n return `${ARCHIL_MOUNT_ROOT}${normalized}`;\n}\n\nfunction withDiskWriteLockCommand(command: string): string {\n const mountRoot = shellEscape(ARCHIL_MOUNT_ROOT);\n return [\n `archil checkout --force --yes ${mountRoot}`,\n `{ ${command}; status=$?; archil checkin ${mountRoot}; checkin_status=$?; ` +\n `if [ $status -ne 0 ]; then exit $status; fi; exit $checkin_status; }`,\n ].join(' && ');\n}\n\nfunction withDiskWriteLock(sandbox: ArchilSandbox, command: string): string {\n // Sandbox VMs have a dedicated disk — no shared-mode checkout needed.\n if (sandbox.vm) return command;\n return withDiskWriteLockCommand(command);\n}\n\nfunction execCommandBytes(command: string): number {\n return Buffer.byteLength(wrapCommand(command), 'utf8');\n}\n\nfunction buildWriteChunkCommand(\n parent: string,\n tempPath: string,\n diskPath: string,\n encodedChunk: string,\n isFirst: boolean,\n isFinal: boolean,\n): string {\n const writeCommand =\n `printf %s ${shellEscape(encodedChunk)} | base64 -d ` +\n `${isFirst ? '>' : '>>'} ${shellEscape(tempPath)}`;\n return [\n ...(isFirst ? [`mkdir -p ${shellEscape(parent)}`] : []),\n writeCommand,\n ...(isFinal\n ? [finalizeStagedFileCommand(tempPath, diskPath)]\n : []),\n ].join(' && ');\n}\n\nfunction finalizeStagedFileCommand(tempPath: string, diskPath: string): string {\n const quotedDestination = shellEscape(diskPath);\n return [\n `if [ -d ${quotedDestination} ]; then`,\n `printf '%s\\\\n' ${shellEscape(`Refusing to overwrite directory ${diskPath}`)} >&2;`,\n 'exit 1;',\n 'fi;',\n `mv ${shellEscape(tempPath)} ${quotedDestination}`,\n ].join(' ');\n}\n\nfunction maxWriteChunkSize(\n parent: string,\n tempPath: string,\n diskPath: string,\n): number {\n let low = 0;\n let high = ARCHIL_MAX_EXEC_COMMAND_BYTES;\n\n while (low < high) {\n const candidate = Math.ceil((low + high) / 2);\n const command = withDiskWriteLockCommand(\n buildWriteChunkCommand(\n parent,\n tempPath,\n diskPath,\n 'A'.repeat(candidate),\n true,\n true,\n ),\n );\n\n if (execCommandBytes(command) <= ARCHIL_MAX_EXEC_COMMAND_BYTES) {\n low = candidate;\n } else {\n high = candidate - 1;\n }\n }\n\n const chunkSize = low - (low % 4);\n if (chunkSize < 4) {\n throw new Error(\n `Archil filesystem path is too long to write within the ${ARCHIL_MAX_EXEC_COMMAND_BYTES}-byte exec command limit.`,\n );\n }\n return chunkSize;\n}\n\nfunction wrapCommand(command: string, options?: RunCommandOptions): string {\n let wrapped = command;\n\n if (options?.cwd) {\n wrapped = `cd ${shellEscape(options.cwd)} && ${wrapped}`;\n }\n\n const envEntries = Object.entries(options?.env ?? {});\n if (!envEntries.some(([key]) => key === 'HOME')) {\n envEntries.unshift(['HOME', process.env.HOME || '/tmp']);\n }\n // `export` instead of a `K=v cmd` prefix: an assignment prefix only binds a\n // simple command, so `K=v (a; b)` or `K=v { a; }` is a shell syntax error.\n const exports = envEntries\n .map(([k, v]) => `${k}=${shellEscape(String(v))}`)\n .join(' ');\n wrapped = `export ${exports}; ${wrapped}`;\n\n if (options?.background) {\n wrapped = `nohup sh -c ${shellEscape(wrapped)} > /dev/null 2>&1 &`;\n }\n\n return wrapped;\n}\n\nasync function execOnDisk(sandbox: ArchilSandbox, command: string): Promise<ExecResponse> {\n return sandbox.client.disks.exec(sandbox.disk.id, command);\n}\n\n// Runs the command from `cwd` without regrouping it: Archil hands the command\n// string to `/bin/sh -c`, and the newline keeps every part of a compound\n// command (`a; b`, `a || b`, pipelines) inside the new working directory. env\n// is passed natively to the process, so it reaches every part as well.\nfunction withCwd(command: string, cwd?: string): string {\n return cwd ? `cd ${shellEscape(cwd)} || exit 1\\n${command}` : command;\n}\n\nasync function ensureVmRunning(vm: ArchilVm): Promise<void> {\n // Refresh first: status on this handle is a local snapshot and goes stale\n // when the sandbox is paused/stopped remotely or hits its TTL.\n await vm.refresh();\n if (vm.status === 'running') return;\n if (vm.status === 'paused') {\n await vm.resume();\n } else if (vm.status === 'stopped' || vm.status === 'exited') {\n await vm.start();\n }\n}\n\nfunction requireVm(sandbox: ArchilSandbox, action: 'pause' | 'resume'): ArchilVm {\n if (!sandbox.vm) {\n throw new Error(\n `Archil disk exec handles cannot ${action}; create a persistent VM (ephemeral: false) instead.`,\n );\n }\n return sandbox.vm;\n}\n\n// Archil rejects deleting a live sandbox, so stop it first. A sandbox with\n// live forks returns 409: forks (snapshots) must be deleted before their parent.\nasync function stopAndDeleteVm(vm: ArchilVm): Promise<void> {\n if (vm.status === 'deleting' || vm.status === 'deleted') return;\n try {\n if (vm.status !== 'stopped' && vm.status !== 'exited' && vm.status !== 'failed') {\n await vm.stop();\n }\n await vm.delete();\n } catch (error) {\n if (error instanceof ArchilError && error.status === 404) return;\n if (error instanceof ArchilError && error.status === 409) {\n throw new Error(\n `Archil refused to delete sandbox ${vm.id} (409): ${error.message}. ` +\n 'Delete its forks and snapshots first; Archil deletes forks before their parent.',\n );\n }\n throw error;\n }\n}\n\nfunction toSandboxRequest(options?: ArchilCreateOptions): ArchilSandboxRequest {\n const request: ArchilSandboxRequest = {\n ...options?.sandbox,\n name: options?.name,\n baseImage: options?.baseImage ?? options?.image ?? options?.templateId,\n env: options?.env ?? options?.envs,\n vcpuCount: options?.vcpuCount ?? options?.vcpu_count ??\n options?.vcpus ?? options?.cpu ?? options?.cpus ?? options?.sandbox?.vcpuCount,\n memSizeMiB: options?.memSizeMiB ?? options?.mem_size_mib ??\n options?.memoryMiB ?? options?.memory ?? options?.memoryMb ?? options?.memMiB ??\n options?.sandbox?.memSizeMiB,\n };\n if (options?.maxTtlSeconds !== undefined) {\n request.maxTtlSeconds = options.maxTtlSeconds;\n } else if (options?.timeout !== undefined) {\n // CreateInstanceOptions.timeout is milliseconds; Archil's TTL is seconds.\n request.maxTtlSeconds = Math.ceil(options.timeout / 1000);\n }\n return request;\n}\n\n// Snapshots are paused forks named with this prefix, which is how\n// snapshot.list() finds them and instances.list() leaves them out.\nconst SNAPSHOT_NAME_PREFIX = 'csdk-snap-';\n\nfunction snapshotName(name?: string): string {\n const suffix = randomUUID().slice(0, 8);\n const slug = (name ?? '')\n .toLowerCase()\n .replace(/[^a-z0-9-]+/g, '-')\n .replace(/^-+|-+$/g, '')\n .slice(0, 63 - SNAPSHOT_NAME_PREFIX.length - suffix.length - 1)\n .replace(/-+$/g, '');\n return `${SNAPSHOT_NAME_PREFIX}${slug ? `${slug}-` : ''}${suffix}`;\n}\n\nfunction isSnapshotVm(vm: ArchilVm): boolean {\n return vm.name?.startsWith(SNAPSHOT_NAME_PREFIX) ?? false;\n}\n\n// Archil disk ids look like `dsk-…`; sandbox ids are UUIDs.\nfunction isDiskId(id: string): boolean {\n return id.startsWith('dsk-');\n}\n\n// Records each handle's effective mode so `destroy` — which only receives an\n// id — treats it correctly even when the mode came from a per-sandbox\n// `ephemeral` override rather than the provider config.\nconst sandboxModes = new Map<string, ArchilExecutionMode>();\n\nfunction modeForId(id: string, resolved: ResolvedConfig): ArchilExecutionMode {\n return sandboxModes.get(id) ?? (isDiskId(id) ? 'exec' : resolved.execution);\n}\n\nfunction diskInstance(\n client: ArchilClient,\n disk: DiskHandle | DiskResponse,\n resolved: ResolvedConfig,\n): ArchilSandbox {\n return { client, disk, resolved, createdAt: new Date() };\n}\n\nconst TIMEOUT_EXIT_CODE = 124;\nconst KILLED_EXIT_CODE = 137;\n\ninterface VmProcessOutcome {\n exitCode: number;\n signal: string | null;\n stderrSuffix: string;\n}\n\nfunction mapProcessResult(\n result: SandboxProcessResult,\n timedOut: boolean,\n killSignal: string | null,\n): VmProcessOutcome {\n if (timedOut || result.status === 'timed_out') {\n return { exitCode: TIMEOUT_EXIT_CODE, signal: 'SIGKILL', stderrSuffix: '' };\n }\n if (result.status === 'cancelled') {\n return { exitCode: KILLED_EXIT_CODE, signal: killSignal ?? 'SIGKILL', stderrSuffix: '' };\n }\n if (result.status === 'failed') {\n return {\n exitCode: result.exitCode ?? 1,\n signal: null,\n stderrSuffix: result.exitReason ?? '',\n };\n }\n // Archil reports a process that died from a signal as exit code -1.\n return { exitCode: result.exitCode ?? 0, signal: null, stderrSuffix: '' };\n}\n\n/**\n * Starts a process through Archil's native process API with incremental\n * output decoding. The returned `done` promise settles with the mapped result.\n */\nasync function startVmProcess(\n vm: ArchilVm,\n command: string,\n options: {\n cwd?: string;\n env?: Record<string, string>;\n timeout?: number;\n onStdout?: (chunk: string) => void;\n onStderr?: (chunk: string) => void;\n },\n) {\n await ensureVmRunning(vm);\n const decoders = { stdout: new TextDecoder(), stderr: new TextDecoder() };\n const output = { stdout: '', stderr: '' };\n const emit = (stream: 'stdout' | 'stderr', text: string) => {\n if (!text) return;\n output[stream] += text;\n (stream === 'stdout' ? options.onStdout : options.onStderr)?.(text);\n };\n const proc = await vm.processes.start(withCwd(command, options.cwd), {\n env: options.env,\n collectOutput: false,\n timeoutSeconds:\n options.timeout !== undefined ? Math.max(1, Math.ceil(options.timeout / 1000)) : undefined,\n onOutput: (chunk) => emit(chunk.stream, decoders[chunk.stream].decode(chunk.data, { stream: true })),\n });\n\n const state = { timedOut: false, killSignal: null as string | null };\n let timer: ReturnType<typeof setTimeout> | undefined;\n if (options.timeout !== undefined) {\n // The server-side deadline has one-second granularity; kill at the exact\n // millisecond deadline as well.\n timer = setTimeout(() => {\n state.timedOut = true;\n proc.kill().catch(() => {});\n }, options.timeout);\n }\n\n const done = proc\n .wait()\n .then((result) => {\n emit('stdout', decoders.stdout.decode());\n emit('stderr', decoders.stderr.decode());\n const mapped = mapProcessResult(result, state.timedOut, state.killSignal);\n return {\n stdout: output.stdout,\n stderr: mapped.stderrSuffix\n ? `${output.stderr}${output.stderr && !output.stderr.endsWith('\\n') ? '\\n' : ''}${mapped.stderrSuffix}`\n : output.stderr,\n exitCode: mapped.exitCode,\n signal: mapped.signal,\n };\n })\n .catch((error: unknown) => ({\n stdout: output.stdout,\n stderr: `${output.stderr}${error instanceof Error ? error.message : String(error)}`,\n exitCode: 1,\n signal: null as string | null,\n }))\n .finally(() => {\n if (timer) clearTimeout(timer);\n });\n\n return { proc, done, state, output };\n}\n\nasync function runVmCommand(\n vm: ArchilVm,\n command: string,\n options?: RunCommandOptions,\n): Promise<CommandResult> {\n const startTime = Date.now();\n if (options?.background) {\n // A process started over the native API keeps running after the client\n // disconnects.\n await ensureVmRunning(vm);\n const proc = await vm.processes.start(withCwd(command, options.cwd), {\n env: options.env,\n collectOutput: false,\n });\n await proc.disconnect();\n return { stdout: '', stderr: '', exitCode: 0, durationMs: Date.now() - startTime };\n }\n const { done } = await startVmProcess(vm, command, {\n cwd: options?.cwd,\n env: options?.env,\n timeout: options?.timeout,\n onStdout: options?.onStdout,\n onStderr: options?.onStderr,\n });\n const result = await done;\n return {\n stdout: result.stdout,\n stderr: result.stderr,\n exitCode: result.exitCode,\n durationMs: Date.now() - startTime,\n };\n}\n\nfunction commandError(error: unknown, startTime: number): CommandResult {\n return {\n stdout: '',\n stderr: error instanceof Error ? error.message : String(error),\n exitCode: 1,\n durationMs: Date.now() - startTime,\n };\n}\n\nfunction resolveSizingExecution(\n config: ArchilConfig,\n options?: { ephemeral?: boolean },\n): ArchilExecutionMode {\n if (options?.ephemeral !== undefined) return options.ephemeral ? 'exec' : 'persistent';\n return resolveExecution(config);\n}\n\nconst _provider = defineProvider<ArchilSandbox, ArchilConfig>({\n name: 'archil',\n sizes: (config, profile, options) => {\n if (options?.sandbox !== undefined && (options.sandbox === null || typeof options.sandbox !== 'object' || Array.isArray(options.sandbox))) {\n throw new InstanceSizeError('invalid', 'sandbox must be an object when requesting sizeClass');\n }\n if (options?.vcpuCount !== undefined || options?.memSizeMiB !== undefined ||\n options?.vcpu_count !== undefined || options?.mem_size_mib !== undefined ||\n options?.sandbox?.vcpu_count !== undefined || options?.sandbox?.mem_size_mib !== undefined ||\n options?.sandbox?.vcpuCount !== undefined || options?.sandbox?.memSizeMiB !== undefined) {\n throw new InstanceSizeError('conflict', 'cannot combine sizeClass with native Archil CPU/memory fields');\n }\n if (options?.snapshotId !== undefined || options?.sandboxId !== undefined || options?.instanceId !== undefined) {\n return { status: 'unsupported', reason: 'Archil attach/fork does not apply CPU/RAM overrides; create a new persistent VM to request a standard size.' };\n }\n if (resolveSizingExecution(config, options) !== 'persistent') {\n return { status: 'unavailable', reason: 'Archil exec containers do not expose VM sizing. Drop execution: \"exec\" (persistent VMs are the default) or set ephemeral: false.' };\n }\n if (profile.sizeClass === 'xs' || profile.sizeClass === '2xl') {\n return { status: 'unknown', reason: 'This adapter has not verified this standard shape.' };\n }\n return { status: 'supported', nativeOptions: { vcpus: profile.vcpus, memoryMiB: profile.memoryMiB } };\n },\n methods: {\n instances: {\n create: async (config: ArchilConfig, options?: ArchilCreateOptions) => {\n const resolved = resolveConfig(config);\n const client = createClient(config, resolved);\n\n // `ephemeral` on create() overrides the configured mode for this\n // sandbox: true -> disk exec handle, false -> persistent VM.\n const execution =\n options?.ephemeral !== undefined\n ? options.ephemeral\n ? 'exec'\n : 'persistent'\n : resolved.execution;\n\n if (options?.snapshotId && execution === 'exec') {\n throw new Error(\n 'Archil snapshots fork persistent VMs and cannot be restored in exec mode. Drop execution: \"exec\" / ephemeral: true.',\n );\n }\n\n if (execution === 'exec') {\n const diskId = resolveCreateDiskId(options);\n sandboxModes.set(diskId, 'exec');\n return { instance: diskInstance(client, { id: diskId }, resolved), instanceId: diskId };\n }\n\n if (options?.diskId) {\n throw new Error(\n 'Archil create({ diskId }) attaches a disk exec handle, which is opt-in now that persistent VMs are the default.\\n\\n' +\n 'Opt in with archil({ execution: \"exec\" }) (or ARCHIL_EXECUTION=exec), or pass ephemeral: true.',\n );\n }\n\n let vm: ArchilVm;\n if (options?.snapshotId) {\n // A snapshot is a paused fork; forking it again yields an independent\n // writable VM resumed from the snapshot's memory and disk state.\n const source = await client.sandboxes.get(options.snapshotId);\n vm = await source.fork({ name: options?.name });\n } else if (options?.sandboxId) {\n // Attach to a live sandbox. Refuse an abort signal here: the\n // sandbox manager destroys a resolved sandbox after an abort,\n // which would delete a sandbox this call did not create.\n if (options?.signal) {\n throw new Error(\n 'create({ sandboxId }) attaches to an existing sandbox and cannot be combined with an abort signal',\n );\n }\n vm = await client.sandboxes.get(options.sandboxId);\n await ensureVmRunning(vm);\n } else {\n vm = await client.sandboxes.create(toSandboxRequest(options), {\n wait: true,\n });\n }\n if (vm.status === 'failed') {\n throw new Error(`Archil sandbox ${vm.id} failed to start${vm.exitReason ? `: ${vm.exitReason}` : ''}`);\n }\n sandboxModes.set(vm.id, 'persistent');\n return { instance: vmInstance(client, vm, resolved), instanceId: vm.id };\n },\n\n getById: async (config: ArchilConfig, sandboxId: string) => {\n const resolved = resolveConfig(config);\n const client = createClient(config, resolved);\n try {\n if (modeForId(sandboxId, resolved) === 'exec') {\n const disk = await client.disks.get(sandboxId);\n return { instance: diskInstance(client, disk, resolved), instanceId: disk.id };\n }\n const vm = await client.sandboxes.get(sandboxId);\n await ensureVmRunning(vm);\n return { instance: vmInstance(client, vm, resolved), instanceId: vm.id };\n } catch {\n return null;\n }\n },\n\n // Archil's list endpoints return every sandbox (and the SDK follows disk\n // pagination), so a single call yields the full account listing.\n list: async (config: ArchilConfig) => {\n const resolved = resolveConfig(config);\n const client = createClient(config, resolved);\n if (resolved.execution === 'exec') {\n const disks = await client.disks.list();\n return disks.map((disk) => ({ instance: diskInstance(client, disk, resolved), instanceId: disk.id }));\n }\n const vms = await client.sandboxes.list();\n return vms\n .filter((vm) => !isSnapshotVm(vm) && vm.status !== 'deleting' && vm.status !== 'deleted')\n .map((vm) => ({ instance: vmInstance(client, vm, resolved), instanceId: vm.id }));\n },\n\n destroy: async (config: ArchilConfig, sandboxId: string) => {\n const resolved = resolveConfig(config);\n // exec handles are disk references — Archil disks have an independent\n // lifecycle, so destroying them is a no-op.\n const mode = modeForId(sandboxId, resolved);\n sandboxModes.delete(sandboxId);\n if (mode === 'exec') return;\n const client = createClient(config, resolved);\n let vm: ArchilVm;\n try {\n vm = await client.sandboxes.get(sandboxId);\n } catch (error) {\n if (error instanceof ArchilError && (error.status === 404 || error.status === 400)) return;\n throw error;\n }\n await stopAndDeleteVm(vm);\n },\n\n runCommand: async (\n sandbox: ArchilSandbox,\n command: string,\n options?: RunCommandOptions,\n ): Promise<CommandResult> => {\n const startTime = Date.now();\n try {\n if (sandbox.vm) {\n const { onStdout: _out, onStderr: _err, ...rest } = options ?? {};\n return await runVmCommand(sandbox.vm, command, rest);\n }\n const result = await execOnDisk(sandbox, wrapCommand(command, options));\n return {\n stdout: result.stdout ?? '',\n stderr: result.stderr ?? '',\n exitCode: result.exitCode,\n durationMs: Date.now() - startTime,\n };\n } catch (error) {\n return commandError(error, startTime);\n }\n },\n\n // Persistent VMs stream through the process WebSocket. Disk exec only\n // returns output once the command exits, so it is delivered at the end.\n streamCommand: async (\n sandbox: ArchilSandbox,\n command: string,\n options: RunCommandOptions,\n ): Promise<CommandResult> => {\n const startTime = Date.now();\n try {\n if (sandbox.vm) return await runVmCommand(sandbox.vm, command, options);\n const result = await execOnDisk(sandbox, wrapCommand(command, options));\n if (result.stdout) options.onStdout?.(result.stdout);\n if (result.stderr) options.onStderr?.(result.stderr);\n return {\n stdout: result.stdout ?? '',\n stderr: result.stderr ?? '',\n exitCode: result.exitCode,\n durationMs: Date.now() - startTime,\n };\n } catch (error) {\n return commandError(error, startTime);\n }\n },\n\n startProcess: async (\n sandbox: ArchilSandbox,\n command: string,\n options: StartProcessOptions,\n ): Promise<ProcessHandle> => {\n if (!sandbox.vm) {\n throw new Error(\n 'Archil exec mode runs each command in a fresh container, so it cannot host background processes. Use a persistent VM (the default).',\n );\n }\n const startTime = Date.now();\n const { proc, done, state, output } = await startVmProcess(sandbox.vm, command, {\n cwd: options.cwd,\n env: options.env,\n onStdout: options.onStdout,\n onStderr: options.onStderr,\n });\n // Without stdin: true the process sees EOF, as with `< /dev/null`.\n if (!options.stdin) await proc.closeStdin().catch(() => {});\n\n let exited: (typeof done extends Promise<infer R> ? R : never) | undefined;\n const finished = done.then((result) => {\n exited = result;\n options.onExit?.({ exitCode: result.exitCode, signal: result.signal });\n return result;\n });\n const toResult = (result: Awaited<typeof done>) => ({\n stdout: result.stdout,\n stderr: result.stderr,\n exitCode: result.exitCode,\n signal: result.signal,\n durationMs: Date.now() - startTime,\n });\n\n return {\n pid: null,\n jobId: proc.id,\n runtime: 'native',\n write: async (data) => {\n if (!options.stdin) {\n throw new Error('Process was started without stdin: true');\n }\n await proc.sendInput(data);\n },\n closeStdin: async () => {\n if (options.stdin && !exited) await proc.closeStdin();\n },\n status: async () =>\n exited\n ? { status: 'exited', exitCode: exited.exitCode, signal: exited.signal, stdout: exited.stdout, stderr: exited.stderr }\n : { status: 'running', exitCode: null, signal: null, stdout: output.stdout, stderr: output.stderr },\n wait: async (waitOptions) => {\n if (waitOptions?.timeout === undefined) return toResult(await finished);\n let timer: ReturnType<typeof setTimeout> | undefined;\n const timeout = new Promise<never>((_, reject) => {\n timer = setTimeout(\n () => reject(new Error(`Process ${proc.id} did not exit within ${waitOptions.timeout}ms`)),\n waitOptions.timeout,\n );\n });\n try {\n return toResult(await Promise.race([finished, timeout]));\n } finally {\n clearTimeout(timer);\n }\n },\n // Archil's process control only cancels (SIGKILL semantics); the\n // requested signal name is what the result reports.\n kill: async (signal) => {\n if (exited) return;\n state.killSignal = signal ?? 'SIGKILL';\n await proc.kill();\n },\n };\n },\n\n getInfo: async (sandbox: ArchilSandbox): Promise<InstanceInfo> => {\n if (sandbox.vm) {\n const vm = sandbox.vm;\n return {\n id: vm.id,\n provider: 'archil',\n status:\n vm.status === 'running'\n ? 'running'\n : vm.status === 'failed'\n ? 'error'\n : 'stopped',\n createdAt: vm.createdAt,\n timeout: vm.maxTtlSeconds * 1000,\n metadata: {\n name: vm.name,\n archilStatus: vm.status,\n vcpuCount: vm.vcpuCount,\n memSizeMiB: vm.memSizeMiB,\n baseImage: vm.baseImage,\n platform: vm.platform,\n },\n };\n }\n const diskInfo = 'status' in sandbox.disk ? sandbox.disk : undefined;\n return {\n id: sandbox.disk.id,\n provider: 'archil',\n status: !diskInfo || diskInfo.status === 'ready' ? 'running' : 'stopped',\n createdAt: diskInfo ? new Date(diskInfo.createdAt) : sandbox.createdAt,\n timeout: 0,\n metadata: diskInfo\n ? {\n name: diskInfo.name,\n organization: diskInfo.organization,\n region: diskInfo.region,\n provider: diskInfo.provider,\n }\n : {},\n };\n },\n\n getUrl: async (\n sandbox: ArchilSandbox,\n options: { port: number; protocol?: string },\n ): Promise<string> => {\n if (sandbox.vm) {\n await sandbox.vm.refresh();\n const endpoint = sandbox.vm.endpoints?.find(\n (e) => e.port === options.port,\n );\n if (!endpoint) {\n throw new Error(\n `No endpoint exposed on port ${options.port} for Archil sandbox ${sandbox.vm.id}.`,\n );\n }\n return `${options.protocol ?? 'https'}://${endpoint.hostname}`;\n }\n throw new Error(\n `Archil exec runs each command in a fresh ephemeral container that exits when the command returns, ` +\n `so there is no long-lived process to expose port ${options.port} on. ` +\n `getUrl is not supported.`,\n );\n },\n\n filesystem: {\n readFile: async (sandbox, path, runCommand) => {\n if (sandbox.vm) {\n const chunks: Buffer[] = [];\n try {\n await sandbox.vm.files.downloadFile(path, (chunk) => {\n chunks.push(Buffer.from(chunk));\n });\n } catch (error) {\n throw new Error(\n `Failed to read ${path}: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n return Buffer.concat(chunks).toString('utf8');\n }\n const diskPath = mapFilesystemPath(sandbox, path);\n const sizeResult = await runCommand(\n sandbox,\n `wc -c < ${shellEscape(diskPath)}`,\n );\n if (sizeResult.exitCode !== 0) {\n throw new Error(`Failed to read ${path}: ${sizeResult.stderr}`);\n }\n\n const sizeText = sizeResult.stdout.trim();\n if (!/^\\d+$/.test(sizeText)) {\n throw new Error(\n `Failed to read ${path}: Archil returned an invalid file size.`,\n );\n }\n\n const size = Number(sizeText);\n if (!Number.isSafeInteger(size)) {\n throw new Error(\n `Failed to read ${path}: file size exceeds JavaScript's safe integer range.`,\n );\n }\n if (size === 0) return '';\n\n const chunks: Buffer[] = [];\n for (\n let offset = 0;\n offset < size;\n offset += ARCHIL_MAX_READ_CHUNK_BYTES\n ) {\n const expectedBytes = Math.min(\n ARCHIL_MAX_READ_CHUNK_BYTES,\n size - offset,\n );\n const result = await runCommand(\n sandbox,\n `dd if=${shellEscape(diskPath)} bs=1 skip=${offset} count=${expectedBytes} 2>/dev/null | base64`,\n );\n if (result.exitCode !== 0) {\n throw new Error(`Failed to read ${path}: ${result.stderr}`);\n }\n\n const encoded = result.stdout.replace(/\\s/g, '');\n if (\n encoded.length === 0 ||\n encoded.length % 4 !== 0 ||\n !/^[A-Za-z0-9+/]*={0,2}$/.test(encoded)\n ) {\n throw new Error(\n `Failed to read ${path}: Archil returned an incomplete file chunk at byte ${offset}.`,\n );\n }\n\n const chunk = Buffer.from(encoded, 'base64');\n if (chunk.length !== expectedBytes) {\n throw new Error(\n `Failed to read ${path}: Archil returned an incomplete file chunk at byte ${offset}.`,\n );\n }\n chunks.push(chunk);\n }\n\n return Buffer.concat(chunks).toString('utf8');\n },\n\n writeFile: async (sandbox, path, content, runCommand) => {\n if (sandbox.vm) {\n try {\n await sandbox.vm.files.uploadFile(\n Buffer.from(content, 'utf8'),\n path,\n );\n } catch (error) {\n throw new Error(\n `Failed to write ${path}: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n return;\n }\n const diskPath = mapFilesystemPath(sandbox, path);\n const parent = posix.dirname(diskPath);\n const encoded = Buffer.from(content, 'utf8').toString('base64');\n const tempPath = `${diskPath}.computesdk-write-${randomUUID()}`;\n let started = false;\n\n try {\n if (encoded.length === 0) {\n started = true;\n const result = await runCommand(\n sandbox,\n withDiskWriteLock(\n sandbox,\n [\n `mkdir -p ${shellEscape(parent)}`,\n `: > ${shellEscape(tempPath)}`,\n finalizeStagedFileCommand(tempPath, diskPath),\n ].join(' && '),\n ),\n );\n if (result.exitCode !== 0) {\n throw new Error(result.stderr);\n }\n return;\n }\n\n const chunkSize = maxWriteChunkSize(parent, tempPath, diskPath);\n for (let offset = 0; offset < encoded.length; offset += chunkSize) {\n const isFirst = offset === 0;\n const isFinal = offset + chunkSize >= encoded.length;\n started = true;\n const result = await runCommand(\n sandbox,\n withDiskWriteLock(\n sandbox,\n buildWriteChunkCommand(\n parent,\n tempPath,\n diskPath,\n encoded.slice(offset, offset + chunkSize),\n isFirst,\n isFinal,\n ),\n ),\n );\n if (result.exitCode !== 0) {\n throw new Error(result.stderr);\n }\n }\n } catch (error) {\n if (started) {\n try {\n await runCommand(\n sandbox,\n withDiskWriteLock(sandbox, `rm -f ${shellEscape(tempPath)}`),\n );\n } catch {\n // Preserve the original write error if cleanup fails.\n }\n }\n throw new Error(\n `Failed to write ${path}: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n },\n\n mkdir: async (sandbox, path, runCommand) => {\n const diskPath = mapFilesystemPath(sandbox, path);\n const result = await runCommand(\n sandbox,\n withDiskWriteLock(sandbox, `mkdir -p ${shellEscape(diskPath)}`),\n );\n if (result.exitCode !== 0) {\n throw new Error(`Failed to create directory ${path}: ${result.stderr}`);\n }\n },\n\n readdir: async (sandbox, path, runCommand) => {\n const diskPath = mapFilesystemPath(sandbox, path);\n // Tab-separated: type<TAB>size<TAB>mtime-iso<TAB>name. Robust to spaces in names.\n const result = await runCommand(\n sandbox,\n `find ${shellEscape(diskPath)} -mindepth 1 -maxdepth 1 -printf '%y\\t%s\\t%T@\\t%f\\n'`,\n );\n if (result.exitCode !== 0) {\n throw new Error(`Failed to list directory ${path}: ${result.stderr}`);\n }\n const entries: FileEntry[] = [];\n for (const line of result.stdout.split('\\n')) {\n if (!line) continue;\n const [typeChar, sizeStr, mtimeStr, ...nameParts] = line.split('\\t');\n const name = nameParts.join('\\t');\n entries.push({\n name,\n type: typeChar === 'd' ? 'directory' : 'file',\n size: parseInt(sizeStr, 10) || 0,\n modified: new Date(parseFloat(mtimeStr) * 1000),\n });\n }\n return entries;\n },\n\n exists: async (sandbox, path, runCommand) => {\n const diskPath = mapFilesystemPath(sandbox, path);\n const result = await runCommand(sandbox, `test -e ${shellEscape(diskPath)}`);\n return result.exitCode === 0;\n },\n\n remove: async (sandbox, path, runCommand) => {\n const diskPath = mapFilesystemPath(sandbox, path);\n if (!sandbox.vm && diskPath === ARCHIL_MOUNT_ROOT) {\n throw new Error('Refusing to remove the Archil disk mount root.');\n }\n const result = await runCommand(\n sandbox,\n withDiskWriteLock(sandbox, `rm -rf ${shellEscape(diskPath)}`),\n );\n if (result.exitCode !== 0) {\n throw new Error(`Failed to remove ${path}: ${result.stderr}`);\n }\n },\n },\n\n // Native pause keeps CPU and memory: files anywhere (including /tmp)\n // and running processes survive. Processes must outlive the command\n // that started them (startProcess, or setsid): Archil reaps a command's\n // process group when it exits. Disk exec handles have no VM to pause.\n pause: async (sandbox: ArchilSandbox) => {\n await requireVm(sandbox, 'pause').pause();\n },\n\n resume: async (sandbox: ArchilSandbox) => {\n await requireVm(sandbox, 'resume').resume();\n },\n\n pauseCapabilities: { memory: true, createOptions: { ephemeral: false } },\n\n getInstance: (sandbox: ArchilSandbox): ArchilSandbox => sandbox,\n },\n\n // Archil has no separate snapshot resource. A snapshot is a fork of the\n // source VM (memory and disk), paused so it holds state without running,\n // and named with SNAPSHOT_NAME_PREFIX so it can be listed. create({\n // snapshotId }) forks it again. Forks must be deleted before their parent.\n snapshot: {\n // A fork copies the VM's memory and whole disk, so restores keep the\n // rootfs (including /tmp) and running processes; the source keeps running.\n capabilities: {\n scope: 'rootfs',\n memory: true,\n destroysSource: false,\n createOptions: { ephemeral: false },\n },\n\n create: async (\n config: ArchilConfig,\n sandboxId: string,\n options?: { name?: string },\n ) => {\n const resolved = resolveConfig(config);\n const client = createClient(config, resolved);\n let fork: ArchilVm | undefined;\n try {\n const source = await client.sandboxes.get(sandboxId);\n fork = await source.fork({ name: snapshotName(options?.name) });\n if (fork.status === 'running') await fork.pause();\n return {\n id: fork.id,\n provider: 'archil',\n createdAt: fork.createdAt ?? new Date(),\n metadata: { name: options?.name, archilName: fork.name, sourceId: sandboxId },\n };\n } catch (error) {\n if (fork) await stopAndDeleteVm(fork).catch(() => {});\n throw new Error(\n `Failed to create Archil snapshot: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n },\n\n list: async (config: ArchilConfig) => {\n const resolved = resolveConfig(config);\n const client = createClient(config, resolved);\n const vms = await client.sandboxes.list();\n return vms\n .filter((vm) => isSnapshotVm(vm) && vm.status !== 'deleting' && vm.status !== 'deleted')\n .map((vm) => ({\n id: vm.id,\n provider: 'archil',\n createdAt: vm.createdAt,\n metadata: { archilName: vm.name, archilStatus: vm.status },\n }));\n },\n\n delete: async (config: ArchilConfig, snapshotId: string) => {\n const resolved = resolveConfig(config);\n const client = createClient(config, resolved);\n let vm: ArchilVm;\n try {\n vm = await client.sandboxes.get(snapshotId);\n } catch (error) {\n if (error instanceof ArchilError && error.status === 404) return;\n throw error;\n }\n await stopAndDeleteVm(vm);\n },\n },\n },\n});\n\nexport const archil = (config: ArchilConfig = {}) => _provider(config);\n\nexport type { ArchilSandbox };\n"],"mappings":";AAeA,SAAS,gBAAgB,yBAAyB;AAClD,SAAS,UAAU,cAAc,mBAAmB;AAMpD,SAAS,kBAAkB;AAC3B,SAAS,aAAa;AAWtB,IAAM,oBAAoB;AAC1B,IAAM,gCAAgC;AAGtC,IAAM,8BAA8B,IAAI,OAAO;AAG/C,IAAM,gBAAwC;AAAA,EAC5C,mBAAmB;AACrB;AAEA,SAAS,gBAAgB,QAAwB;AAC/C,QAAM,OAAO,OAAO,QAAQ,GAAG;AAC/B,MAAI,QAAQ,KAAK,SAAS,OAAO,SAAS,GAAG;AAC3C,UAAM,IAAI;AAAA,MACR,0BAA0B,MAAM;AAAA,IAClC;AAAA,EACF;AACA,QAAM,QAAQ,OAAO,MAAM,GAAG,IAAI;AAClC,QAAM,SAAS,OAAO,MAAM,OAAO,CAAC;AACpC,QAAM,QAAQ,cAAc,MAAM,KAAK;AACvC,SAAO,mBAAmB,KAAK,IAAI,MAAM,IAAI,KAAK;AACpD;AAsEA,SAAS,WACP,QACA,IACA,UACe;AACf,SAAO;AAAA,IACL;AAAA,IACA,MAAM,EAAE,IAAI,GAAG,GAAG;AAAA,IAClB;AAAA,IACA;AAAA,IACA,WAAW,oBAAI,KAAK;AAAA,IACpB,OAAO,YAAY;AACjB,YAAM,GAAG,MAAM;AAAA,IACjB;AAAA,IACA,QAAQ,YAAY;AAClB,YAAM,GAAG,OAAO;AAAA,IAClB;AAAA,EACF;AACF;AAwBA,SAAS,cAAc,QAAsC;AAC3D,QAAM,SAAS,OAAO,UAAU,QAAQ,IAAI;AAC5C,QAAM,SAAS,OAAO,UAAU,QAAQ,IAAI;AAE5C,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI;AAAA,MACR;AAAA,IAGF;AAAA,EACF;AAEA,MAAI,UAAU,OAAO;AACrB,MAAI,CAAC,SAAS;AACZ,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI;AAAA,QACR;AAAA,MAIF;AAAA,IACF;AACA,cAAU,gBAAgB,MAAM;AAAA,EAClC;AAEA,SAAO,EAAE,QAAQ,SAAS,WAAW,iBAAiB,MAAM,EAAE;AAChE;AAEA,SAAS,iBAAiB,QAA2C;AACnE,MAAI,OAAO,UAAW,QAAO,OAAO;AACpC,QAAM,UAAU,QAAQ,IAAI,kBAAkB,KAAK,EAAE,YAAY;AACjE,MAAI,CAAC,QAAS,QAAO;AACrB,MAAI,YAAY,UAAU,YAAY,aAAc,QAAO;AAC3D,QAAM,IAAI;AAAA,IACR,6BAA6B,QAAQ,IAAI,gBAAgB;AAAA,EAC3D;AACF;AAEA,SAAS,aAAa,QAAsB,UAAwC;AAClF,QAAM,SAAS,OAAO,UAAU,QAAQ,IAAI,iBAAiB;AAC7D,SAAO,IAAI,aAAa,EAAE,GAAG,UAAU,OAAO,CAAC;AACjD;AAEA,SAAS,oBAAoB,SAAuC;AAGlE,QAAM,SAAS,SAAS,UAAU,SAAS;AAE3C,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI;AAAA,MACR;AAAA,IAGF;AAAA,EACF;AAEA,SAAO;AACT;AAGA,SAAS,YAAY,OAAuB;AAC1C,SAAO,IAAI,MAAM,QAAQ,MAAM,OAAO,CAAC;AACzC;AAEA,SAAS,kBAAkB,SAAwB,MAAsB;AACvE,QAAM,aAAa,MAAM,UAAU,KAAK,WAAW,GAAG,IAAI,OAAO,IAAI,IAAI,EAAE;AAG3E,MAAI,QAAQ,IAAI;AACd,WAAO;AAAA,EACT;AAEA,MAAI,eAAe,KAAK;AACtB,WAAO;AAAA,EACT;AAEA,MACE,eAAe,qBACf,WAAW,WAAW,GAAG,iBAAiB,GAAG,GAC7C;AACA,WAAO;AAAA,EACT;AAEA,SAAO,GAAG,iBAAiB,GAAG,UAAU;AAC1C;AAEA,SAAS,yBAAyB,SAAyB;AACzD,QAAM,YAAY,YAAY,iBAAiB;AAC/C,SAAO;AAAA,IACL,iCAAiC,SAAS;AAAA,IAC1C,KAAK,OAAO,+BAA+B,SAAS;AAAA,EAEtD,EAAE,KAAK,MAAM;AACf;AAEA,SAAS,kBAAkB,SAAwB,SAAyB;AAE1E,MAAI,QAAQ,GAAI,QAAO;AACvB,SAAO,yBAAyB,OAAO;AACzC;AAEA,SAAS,iBAAiB,SAAyB;AACjD,SAAO,OAAO,WAAW,YAAY,OAAO,GAAG,MAAM;AACvD;AAEA,SAAS,uBACP,QACA,UACA,UACA,cACA,SACA,SACQ;AACR,QAAM,eACJ,aAAa,YAAY,YAAY,CAAC,gBACnC,UAAU,MAAM,IAAI,IAAI,YAAY,QAAQ,CAAC;AAClD,SAAO;AAAA,IACL,GAAI,UAAU,CAAC,YAAY,YAAY,MAAM,CAAC,EAAE,IAAI,CAAC;AAAA,IACrD;AAAA,IACA,GAAI,UACA,CAAC,0BAA0B,UAAU,QAAQ,CAAC,IAC9C,CAAC;AAAA,EACP,EAAE,KAAK,MAAM;AACf;AAEA,SAAS,0BAA0B,UAAkB,UAA0B;AAC7E,QAAM,oBAAoB,YAAY,QAAQ;AAC9C,SAAO;AAAA,IACL,WAAW,iBAAiB;AAAA,IAC5B,kBAAkB,YAAY,mCAAmC,QAAQ,EAAE,CAAC;AAAA,IAC5E;AAAA,IACA;AAAA,IACA,MAAM,YAAY,QAAQ,CAAC,IAAI,iBAAiB;AAAA,EAClD,EAAE,KAAK,GAAG;AACZ;AAEA,SAAS,kBACP,QACA,UACA,UACQ;AACR,MAAI,MAAM;AACV,MAAI,OAAO;AAEX,SAAO,MAAM,MAAM;AACjB,UAAM,YAAY,KAAK,MAAM,MAAM,QAAQ,CAAC;AAC5C,UAAM,UAAU;AAAA,MACd;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA,IAAI,OAAO,SAAS;AAAA,QACpB;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,QAAI,iBAAiB,OAAO,KAAK,+BAA+B;AAC9D,YAAM;AAAA,IACR,OAAO;AACL,aAAO,YAAY;AAAA,IACrB;AAAA,EACF;AAEA,QAAM,YAAY,MAAO,MAAM;AAC/B,MAAI,YAAY,GAAG;AACjB,UAAM,IAAI;AAAA,MACR,0DAA0D,6BAA6B;AAAA,IACzF;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,YAAY,SAAiB,SAAqC;AACzE,MAAI,UAAU;AAEd,MAAI,SAAS,KAAK;AAChB,cAAU,MAAM,YAAY,QAAQ,GAAG,CAAC,OAAO,OAAO;AAAA,EACxD;AAEA,QAAM,aAAa,OAAO,QAAQ,SAAS,OAAO,CAAC,CAAC;AACpD,MAAI,CAAC,WAAW,KAAK,CAAC,CAAC,GAAG,MAAM,QAAQ,MAAM,GAAG;AAC/C,eAAW,QAAQ,CAAC,QAAQ,QAAQ,IAAI,QAAQ,MAAM,CAAC;AAAA,EACzD;AAGA,QAAM,UAAU,WACb,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,YAAY,OAAO,CAAC,CAAC,CAAC,EAAE,EAChD,KAAK,GAAG;AACX,YAAU,UAAU,OAAO,KAAK,OAAO;AAEvC,MAAI,SAAS,YAAY;AACvB,cAAU,eAAe,YAAY,OAAO,CAAC;AAAA,EAC/C;AAEA,SAAO;AACT;AAEA,eAAe,WAAW,SAAwB,SAAwC;AACxF,SAAO,QAAQ,OAAO,MAAM,KAAK,QAAQ,KAAK,IAAI,OAAO;AAC3D;AAMA,SAAS,QAAQ,SAAiB,KAAsB;AACtD,SAAO,MAAM,MAAM,YAAY,GAAG,CAAC;AAAA,EAAe,OAAO,KAAK;AAChE;AAEA,eAAe,gBAAgB,IAA6B;AAG1D,QAAM,GAAG,QAAQ;AACjB,MAAI,GAAG,WAAW,UAAW;AAC7B,MAAI,GAAG,WAAW,UAAU;AAC1B,UAAM,GAAG,OAAO;AAAA,EAClB,WAAW,GAAG,WAAW,aAAa,GAAG,WAAW,UAAU;AAC5D,UAAM,GAAG,MAAM;AAAA,EACjB;AACF;AAEA,SAAS,UAAU,SAAwB,QAAsC;AAC/E,MAAI,CAAC,QAAQ,IAAI;AACf,UAAM,IAAI;AAAA,MACR,mCAAmC,MAAM;AAAA,IAC3C;AAAA,EACF;AACA,SAAO,QAAQ;AACjB;AAIA,eAAe,gBAAgB,IAA6B;AAC1D,MAAI,GAAG,WAAW,cAAc,GAAG,WAAW,UAAW;AACzD,MAAI;AACF,QAAI,GAAG,WAAW,aAAa,GAAG,WAAW,YAAY,GAAG,WAAW,UAAU;AAC/E,YAAM,GAAG,KAAK;AAAA,IAChB;AACA,UAAM,GAAG,OAAO;AAAA,EAClB,SAAS,OAAO;AACd,QAAI,iBAAiB,eAAe,MAAM,WAAW,IAAK;AAC1D,QAAI,iBAAiB,eAAe,MAAM,WAAW,KAAK;AACxD,YAAM,IAAI;AAAA,QACR,oCAAoC,GAAG,EAAE,WAAW,MAAM,OAAO;AAAA,MAEnE;AAAA,IACF;AACA,UAAM;AAAA,EACR;AACF;AAEA,SAAS,iBAAiB,SAAqD;AAC7E,QAAM,UAAgC;AAAA,IACpC,GAAG,SAAS;AAAA,IACZ,MAAM,SAAS;AAAA,IACf,WAAW,SAAS,aAAa,SAAS,SAAS,SAAS;AAAA,IAC5D,KAAK,SAAS,OAAO,SAAS;AAAA,IAC9B,WAAW,SAAS,aAAa,SAAS,cACxC,SAAS,SAAS,SAAS,OAAO,SAAS,QAAQ,SAAS,SAAS;AAAA,IACvE,YAAY,SAAS,cAAc,SAAS,gBAC1C,SAAS,aAAa,SAAS,UAAU,SAAS,YAAY,SAAS,UACvE,SAAS,SAAS;AAAA,EACtB;AACA,MAAI,SAAS,kBAAkB,QAAW;AACxC,YAAQ,gBAAgB,QAAQ;AAAA,EAClC,WAAW,SAAS,YAAY,QAAW;AAEzC,YAAQ,gBAAgB,KAAK,KAAK,QAAQ,UAAU,GAAI;AAAA,EAC1D;AACA,SAAO;AACT;AAIA,IAAM,uBAAuB;AAE7B,SAAS,aAAa,MAAuB;AAC3C,QAAM,SAAS,WAAW,EAAE,MAAM,GAAG,CAAC;AACtC,QAAM,QAAQ,QAAQ,IACnB,YAAY,EACZ,QAAQ,gBAAgB,GAAG,EAC3B,QAAQ,YAAY,EAAE,EACtB,MAAM,GAAG,KAAK,qBAAqB,SAAS,OAAO,SAAS,CAAC,EAC7D,QAAQ,QAAQ,EAAE;AACrB,SAAO,GAAG,oBAAoB,GAAG,OAAO,GAAG,IAAI,MAAM,EAAE,GAAG,MAAM;AAClE;AAEA,SAAS,aAAa,IAAuB;AAC3C,SAAO,GAAG,MAAM,WAAW,oBAAoB,KAAK;AACtD;AAGA,SAAS,SAAS,IAAqB;AACrC,SAAO,GAAG,WAAW,MAAM;AAC7B;AAKA,IAAM,eAAe,oBAAI,IAAiC;AAE1D,SAAS,UAAU,IAAY,UAA+C;AAC5E,SAAO,aAAa,IAAI,EAAE,MAAM,SAAS,EAAE,IAAI,SAAS,SAAS;AACnE;AAEA,SAAS,aACP,QACA,MACA,UACe;AACf,SAAO,EAAE,QAAQ,MAAM,UAAU,WAAW,oBAAI,KAAK,EAAE;AACzD;AAEA,IAAM,oBAAoB;AAC1B,IAAM,mBAAmB;AAQzB,SAAS,iBACP,QACA,UACA,YACkB;AAClB,MAAI,YAAY,OAAO,WAAW,aAAa;AAC7C,WAAO,EAAE,UAAU,mBAAmB,QAAQ,WAAW,cAAc,GAAG;AAAA,EAC5E;AACA,MAAI,OAAO,WAAW,aAAa;AACjC,WAAO,EAAE,UAAU,kBAAkB,QAAQ,cAAc,WAAW,cAAc,GAAG;AAAA,EACzF;AACA,MAAI,OAAO,WAAW,UAAU;AAC9B,WAAO;AAAA,MACL,UAAU,OAAO,YAAY;AAAA,MAC7B,QAAQ;AAAA,MACR,cAAc,OAAO,cAAc;AAAA,IACrC;AAAA,EACF;AAEA,SAAO,EAAE,UAAU,OAAO,YAAY,GAAG,QAAQ,MAAM,cAAc,GAAG;AAC1E;AAMA,eAAe,eACb,IACA,SACA,SAOA;AACA,QAAM,gBAAgB,EAAE;AACxB,QAAM,WAAW,EAAE,QAAQ,IAAI,YAAY,GAAG,QAAQ,IAAI,YAAY,EAAE;AACxE,QAAM,SAAS,EAAE,QAAQ,IAAI,QAAQ,GAAG;AACxC,QAAM,OAAO,CAAC,QAA6B,SAAiB;AAC1D,QAAI,CAAC,KAAM;AACX,WAAO,MAAM,KAAK;AAClB,KAAC,WAAW,WAAW,QAAQ,WAAW,QAAQ,YAAY,IAAI;AAAA,EACpE;AACA,QAAM,OAAO,MAAM,GAAG,UAAU,MAAM,QAAQ,SAAS,QAAQ,GAAG,GAAG;AAAA,IACnE,KAAK,QAAQ;AAAA,IACb,eAAe;AAAA,IACf,gBACE,QAAQ,YAAY,SAAY,KAAK,IAAI,GAAG,KAAK,KAAK,QAAQ,UAAU,GAAI,CAAC,IAAI;AAAA,IACnF,UAAU,CAAC,UAAU,KAAK,MAAM,QAAQ,SAAS,MAAM,MAAM,EAAE,OAAO,MAAM,MAAM,EAAE,QAAQ,KAAK,CAAC,CAAC;AAAA,EACrG,CAAC;AAED,QAAM,QAAQ,EAAE,UAAU,OAAO,YAAY,KAAsB;AACnE,MAAI;AACJ,MAAI,QAAQ,YAAY,QAAW;AAGjC,YAAQ,WAAW,MAAM;AACvB,YAAM,WAAW;AACjB,WAAK,KAAK,EAAE,MAAM,MAAM;AAAA,MAAC,CAAC;AAAA,IAC5B,GAAG,QAAQ,OAAO;AAAA,EACpB;AAEA,QAAM,OAAO,KACV,KAAK,EACL,KAAK,CAAC,WAAW;AAChB,SAAK,UAAU,SAAS,OAAO,OAAO,CAAC;AACvC,SAAK,UAAU,SAAS,OAAO,OAAO,CAAC;AACvC,UAAM,SAAS,iBAAiB,QAAQ,MAAM,UAAU,MAAM,UAAU;AACxE,WAAO;AAAA,MACL,QAAQ,OAAO;AAAA,MACf,QAAQ,OAAO,eACX,GAAG,OAAO,MAAM,GAAG,OAAO,UAAU,CAAC,OAAO,OAAO,SAAS,IAAI,IAAI,OAAO,EAAE,GAAG,OAAO,YAAY,KACnG,OAAO;AAAA,MACX,UAAU,OAAO;AAAA,MACjB,QAAQ,OAAO;AAAA,IACjB;AAAA,EACF,CAAC,EACA,MAAM,CAAC,WAAoB;AAAA,IAC1B,QAAQ,OAAO;AAAA,IACf,QAAQ,GAAG,OAAO,MAAM,GAAG,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,IACjF,UAAU;AAAA,IACV,QAAQ;AAAA,EACV,EAAE,EACD,QAAQ,MAAM;AACb,QAAI,MAAO,cAAa,KAAK;AAAA,EAC/B,CAAC;AAEH,SAAO,EAAE,MAAM,MAAM,OAAO,OAAO;AACrC;AAEA,eAAe,aACb,IACA,SACA,SACwB;AACxB,QAAM,YAAY,KAAK,IAAI;AAC3B,MAAI,SAAS,YAAY;AAGvB,UAAM,gBAAgB,EAAE;AACxB,UAAM,OAAO,MAAM,GAAG,UAAU,MAAM,QAAQ,SAAS,QAAQ,GAAG,GAAG;AAAA,MACnE,KAAK,QAAQ;AAAA,MACb,eAAe;AAAA,IACjB,CAAC;AACD,UAAM,KAAK,WAAW;AACtB,WAAO,EAAE,QAAQ,IAAI,QAAQ,IAAI,UAAU,GAAG,YAAY,KAAK,IAAI,IAAI,UAAU;AAAA,EACnF;AACA,QAAM,EAAE,KAAK,IAAI,MAAM,eAAe,IAAI,SAAS;AAAA,IACjD,KAAK,SAAS;AAAA,IACd,KAAK,SAAS;AAAA,IACd,SAAS,SAAS;AAAA,IAClB,UAAU,SAAS;AAAA,IACnB,UAAU,SAAS;AAAA,EACrB,CAAC;AACD,QAAM,SAAS,MAAM;AACrB,SAAO;AAAA,IACL,QAAQ,OAAO;AAAA,IACf,QAAQ,OAAO;AAAA,IACf,UAAU,OAAO;AAAA,IACjB,YAAY,KAAK,IAAI,IAAI;AAAA,EAC3B;AACF;AAEA,SAAS,aAAa,OAAgB,WAAkC;AACtE,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,QAAQ,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,IAC7D,UAAU;AAAA,IACV,YAAY,KAAK,IAAI,IAAI;AAAA,EAC3B;AACF;AAEA,SAAS,uBACP,QACA,SACqB;AACrB,MAAI,SAAS,cAAc,OAAW,QAAO,QAAQ,YAAY,SAAS;AAC1E,SAAO,iBAAiB,MAAM;AAChC;AAEA,IAAM,YAAY,eAA4C;AAAA,EAC5D,MAAM;AAAA,EACN,OAAO,CAAC,QAAQ,SAAS,YAAY;AACnC,QAAI,SAAS,YAAY,WAAc,QAAQ,YAAY,QAAQ,OAAO,QAAQ,YAAY,YAAY,MAAM,QAAQ,QAAQ,OAAO,IAAI;AACzI,YAAM,IAAI,kBAAkB,WAAW,qDAAqD;AAAA,IAC9F;AACA,QAAI,SAAS,cAAc,UAAa,SAAS,eAAe,UAC5D,SAAS,eAAe,UAAa,SAAS,iBAAiB,UAC/D,SAAS,SAAS,eAAe,UAAa,SAAS,SAAS,iBAAiB,UACjF,SAAS,SAAS,cAAc,UAAa,SAAS,SAAS,eAAe,QAAW;AAC3F,YAAM,IAAI,kBAAkB,YAAY,+DAA+D;AAAA,IACzG;AACA,QAAI,SAAS,eAAe,UAAa,SAAS,cAAc,UAAa,SAAS,eAAe,QAAW;AAC9G,aAAO,EAAE,QAAQ,eAAe,QAAQ,8GAA8G;AAAA,IACxJ;AACA,QAAI,uBAAuB,QAAQ,OAAO,MAAM,cAAc;AAC5D,aAAO,EAAE,QAAQ,eAAe,QAAQ,mIAAmI;AAAA,IAC7K;AACA,QAAI,QAAQ,cAAc,QAAQ,QAAQ,cAAc,OAAO;AAC7D,aAAO,EAAE,QAAQ,WAAW,QAAQ,qDAAqD;AAAA,IAC3F;AACA,WAAO,EAAE,QAAQ,aAAa,eAAe,EAAE,OAAO,QAAQ,OAAO,WAAW,QAAQ,UAAU,EAAE;AAAA,EACtG;AAAA,EACA,SAAS;AAAA,IACP,WAAW;AAAA,MACT,QAAQ,OAAO,QAAsB,YAAkC;AACrE,cAAM,WAAW,cAAc,MAAM;AACrC,cAAM,SAAS,aAAa,QAAQ,QAAQ;AAI5C,cAAM,YACJ,SAAS,cAAc,SACnB,QAAQ,YACN,SACA,eACF,SAAS;AAEf,YAAI,SAAS,cAAc,cAAc,QAAQ;AAC/C,gBAAM,IAAI;AAAA,YACR;AAAA,UACF;AAAA,QACF;AAEA,YAAI,cAAc,QAAQ;AACxB,gBAAM,SAAS,oBAAoB,OAAO;AAC1C,uBAAa,IAAI,QAAQ,MAAM;AAC/B,iBAAO,EAAE,UAAU,aAAa,QAAQ,EAAE,IAAI,OAAO,GAAG,QAAQ,GAAG,YAAY,OAAO;AAAA,QACxF;AAEA,YAAI,SAAS,QAAQ;AACnB,gBAAM,IAAI;AAAA,YACR;AAAA,UAEF;AAAA,QACF;AAEA,YAAI;AACJ,YAAI,SAAS,YAAY;AAGvB,gBAAM,SAAS,MAAM,OAAO,UAAU,IAAI,QAAQ,UAAU;AAC5D,eAAK,MAAM,OAAO,KAAK,EAAE,MAAM,SAAS,KAAK,CAAC;AAAA,QAChD,WAAW,SAAS,WAAW;AAI7B,cAAI,SAAS,QAAQ;AACnB,kBAAM,IAAI;AAAA,cACR;AAAA,YACF;AAAA,UACF;AACA,eAAK,MAAM,OAAO,UAAU,IAAI,QAAQ,SAAS;AACjD,gBAAM,gBAAgB,EAAE;AAAA,QAC1B,OAAO;AACL,eAAK,MAAM,OAAO,UAAU,OAAO,iBAAiB,OAAO,GAAG;AAAA,YAC5D,MAAM;AAAA,UACR,CAAC;AAAA,QACH;AACA,YAAI,GAAG,WAAW,UAAU;AAC1B,gBAAM,IAAI,MAAM,kBAAkB,GAAG,EAAE,mBAAmB,GAAG,aAAa,KAAK,GAAG,UAAU,KAAK,EAAE,EAAE;AAAA,QACvG;AACA,qBAAa,IAAI,GAAG,IAAI,YAAY;AACpC,eAAO,EAAE,UAAU,WAAW,QAAQ,IAAI,QAAQ,GAAG,YAAY,GAAG,GAAG;AAAA,MACzE;AAAA,MAEA,SAAS,OAAO,QAAsB,cAAsB;AAC1D,cAAM,WAAW,cAAc,MAAM;AACrC,cAAM,SAAS,aAAa,QAAQ,QAAQ;AAC5C,YAAI;AACF,cAAI,UAAU,WAAW,QAAQ,MAAM,QAAQ;AAC7C,kBAAM,OAAO,MAAM,OAAO,MAAM,IAAI,SAAS;AAC7C,mBAAO,EAAE,UAAU,aAAa,QAAQ,MAAM,QAAQ,GAAG,YAAY,KAAK,GAAG;AAAA,UAC/E;AACA,gBAAM,KAAK,MAAM,OAAO,UAAU,IAAI,SAAS;AAC/C,gBAAM,gBAAgB,EAAE;AACxB,iBAAO,EAAE,UAAU,WAAW,QAAQ,IAAI,QAAQ,GAAG,YAAY,GAAG,GAAG;AAAA,QACzE,QAAQ;AACN,iBAAO;AAAA,QACT;AAAA,MACF;AAAA;AAAA;AAAA,MAIA,MAAM,OAAO,WAAyB;AACpC,cAAM,WAAW,cAAc,MAAM;AACrC,cAAM,SAAS,aAAa,QAAQ,QAAQ;AAC5C,YAAI,SAAS,cAAc,QAAQ;AACjC,gBAAM,QAAQ,MAAM,OAAO,MAAM,KAAK;AACtC,iBAAO,MAAM,IAAI,CAAC,UAAU,EAAE,UAAU,aAAa,QAAQ,MAAM,QAAQ,GAAG,YAAY,KAAK,GAAG,EAAE;AAAA,QACtG;AACA,cAAM,MAAM,MAAM,OAAO,UAAU,KAAK;AACxC,eAAO,IACJ,OAAO,CAAC,OAAO,CAAC,aAAa,EAAE,KAAK,GAAG,WAAW,cAAc,GAAG,WAAW,SAAS,EACvF,IAAI,CAAC,QAAQ,EAAE,UAAU,WAAW,QAAQ,IAAI,QAAQ,GAAG,YAAY,GAAG,GAAG,EAAE;AAAA,MACpF;AAAA,MAEA,SAAS,OAAO,QAAsB,cAAsB;AAC1D,cAAM,WAAW,cAAc,MAAM;AAGrC,cAAM,OAAO,UAAU,WAAW,QAAQ;AAC1C,qBAAa,OAAO,SAAS;AAC7B,YAAI,SAAS,OAAQ;AACrB,cAAM,SAAS,aAAa,QAAQ,QAAQ;AAC5C,YAAI;AACJ,YAAI;AACF,eAAK,MAAM,OAAO,UAAU,IAAI,SAAS;AAAA,QAC3C,SAAS,OAAO;AACd,cAAI,iBAAiB,gBAAgB,MAAM,WAAW,OAAO,MAAM,WAAW,KAAM;AACpF,gBAAM;AAAA,QACR;AACA,cAAM,gBAAgB,EAAE;AAAA,MAC1B;AAAA,MAEA,YAAY,OACV,SACA,SACA,YAC2B;AAC3B,cAAM,YAAY,KAAK,IAAI;AAC3B,YAAI;AACF,cAAI,QAAQ,IAAI;AACd,kBAAM,EAAE,UAAU,MAAM,UAAU,MAAM,GAAG,KAAK,IAAI,WAAW,CAAC;AAChE,mBAAO,MAAM,aAAa,QAAQ,IAAI,SAAS,IAAI;AAAA,UACrD;AACA,gBAAM,SAAS,MAAM,WAAW,SAAS,YAAY,SAAS,OAAO,CAAC;AACtE,iBAAO;AAAA,YACL,QAAQ,OAAO,UAAU;AAAA,YACzB,QAAQ,OAAO,UAAU;AAAA,YACzB,UAAU,OAAO;AAAA,YACjB,YAAY,KAAK,IAAI,IAAI;AAAA,UAC3B;AAAA,QACF,SAAS,OAAO;AACd,iBAAO,aAAa,OAAO,SAAS;AAAA,QACtC;AAAA,MACF;AAAA;AAAA;AAAA,MAIA,eAAe,OACb,SACA,SACA,YAC2B;AAC3B,cAAM,YAAY,KAAK,IAAI;AAC3B,YAAI;AACF,cAAI,QAAQ,GAAI,QAAO,MAAM,aAAa,QAAQ,IAAI,SAAS,OAAO;AACtE,gBAAM,SAAS,MAAM,WAAW,SAAS,YAAY,SAAS,OAAO,CAAC;AACtE,cAAI,OAAO,OAAQ,SAAQ,WAAW,OAAO,MAAM;AACnD,cAAI,OAAO,OAAQ,SAAQ,WAAW,OAAO,MAAM;AACnD,iBAAO;AAAA,YACL,QAAQ,OAAO,UAAU;AAAA,YACzB,QAAQ,OAAO,UAAU;AAAA,YACzB,UAAU,OAAO;AAAA,YACjB,YAAY,KAAK,IAAI,IAAI;AAAA,UAC3B;AAAA,QACF,SAAS,OAAO;AACd,iBAAO,aAAa,OAAO,SAAS;AAAA,QACtC;AAAA,MACF;AAAA,MAEA,cAAc,OACZ,SACA,SACA,YAC2B;AAC3B,YAAI,CAAC,QAAQ,IAAI;AACf,gBAAM,IAAI;AAAA,YACR;AAAA,UACF;AAAA,QACF;AACA,cAAM,YAAY,KAAK,IAAI;AAC3B,cAAM,EAAE,MAAM,MAAM,OAAO,OAAO,IAAI,MAAM,eAAe,QAAQ,IAAI,SAAS;AAAA,UAC9E,KAAK,QAAQ;AAAA,UACb,KAAK,QAAQ;AAAA,UACb,UAAU,QAAQ;AAAA,UAClB,UAAU,QAAQ;AAAA,QACpB,CAAC;AAED,YAAI,CAAC,QAAQ,MAAO,OAAM,KAAK,WAAW,EAAE,MAAM,MAAM;AAAA,QAAC,CAAC;AAE1D,YAAI;AACJ,cAAM,WAAW,KAAK,KAAK,CAAC,WAAW;AACrC,mBAAS;AACT,kBAAQ,SAAS,EAAE,UAAU,OAAO,UAAU,QAAQ,OAAO,OAAO,CAAC;AACrE,iBAAO;AAAA,QACT,CAAC;AACD,cAAM,WAAW,CAAC,YAAkC;AAAA,UAClD,QAAQ,OAAO;AAAA,UACf,QAAQ,OAAO;AAAA,UACf,UAAU,OAAO;AAAA,UACjB,QAAQ,OAAO;AAAA,UACf,YAAY,KAAK,IAAI,IAAI;AAAA,QAC3B;AAEA,eAAO;AAAA,UACL,KAAK;AAAA,UACL,OAAO,KAAK;AAAA,UACZ,SAAS;AAAA,UACT,OAAO,OAAO,SAAS;AACrB,gBAAI,CAAC,QAAQ,OAAO;AAClB,oBAAM,IAAI,MAAM,yCAAyC;AAAA,YAC3D;AACA,kBAAM,KAAK,UAAU,IAAI;AAAA,UAC3B;AAAA,UACA,YAAY,YAAY;AACtB,gBAAI,QAAQ,SAAS,CAAC,OAAQ,OAAM,KAAK,WAAW;AAAA,UACtD;AAAA,UACA,QAAQ,YACN,SACI,EAAE,QAAQ,UAAU,UAAU,OAAO,UAAU,QAAQ,OAAO,QAAQ,QAAQ,OAAO,QAAQ,QAAQ,OAAO,OAAO,IACnH,EAAE,QAAQ,WAAW,UAAU,MAAM,QAAQ,MAAM,QAAQ,OAAO,QAAQ,QAAQ,OAAO,OAAO;AAAA,UACtG,MAAM,OAAO,gBAAgB;AAC3B,gBAAI,aAAa,YAAY,OAAW,QAAO,SAAS,MAAM,QAAQ;AACtE,gBAAI;AACJ,kBAAM,UAAU,IAAI,QAAe,CAAC,GAAG,WAAW;AAChD,sBAAQ;AAAA,gBACN,MAAM,OAAO,IAAI,MAAM,WAAW,KAAK,EAAE,wBAAwB,YAAY,OAAO,IAAI,CAAC;AAAA,gBACzF,YAAY;AAAA,cACd;AAAA,YACF,CAAC;AACD,gBAAI;AACF,qBAAO,SAAS,MAAM,QAAQ,KAAK,CAAC,UAAU,OAAO,CAAC,CAAC;AAAA,YACzD,UAAE;AACA,2BAAa,KAAK;AAAA,YACpB;AAAA,UACF;AAAA;AAAA;AAAA,UAGA,MAAM,OAAO,WAAW;AACtB,gBAAI,OAAQ;AACZ,kBAAM,aAAa,UAAU;AAC7B,kBAAM,KAAK,KAAK;AAAA,UAClB;AAAA,QACF;AAAA,MACF;AAAA,MAEA,SAAS,OAAO,YAAkD;AAChE,YAAI,QAAQ,IAAI;AACd,gBAAM,KAAK,QAAQ;AACnB,iBAAO;AAAA,YACL,IAAI,GAAG;AAAA,YACP,UAAU;AAAA,YACV,QACE,GAAG,WAAW,YACV,YACA,GAAG,WAAW,WACZ,UACA;AAAA,YACR,WAAW,GAAG;AAAA,YACd,SAAS,GAAG,gBAAgB;AAAA,YAC5B,UAAU;AAAA,cACR,MAAM,GAAG;AAAA,cACT,cAAc,GAAG;AAAA,cACjB,WAAW,GAAG;AAAA,cACd,YAAY,GAAG;AAAA,cACf,WAAW,GAAG;AAAA,cACd,UAAU,GAAG;AAAA,YACf;AAAA,UACF;AAAA,QACF;AACA,cAAM,WAAW,YAAY,QAAQ,OAAO,QAAQ,OAAO;AAC3D,eAAO;AAAA,UACL,IAAI,QAAQ,KAAK;AAAA,UACjB,UAAU;AAAA,UACV,QAAQ,CAAC,YAAY,SAAS,WAAW,UAAU,YAAY;AAAA,UAC/D,WAAW,WAAW,IAAI,KAAK,SAAS,SAAS,IAAI,QAAQ;AAAA,UAC7D,SAAS;AAAA,UACT,UAAU,WACN;AAAA,YACE,MAAM,SAAS;AAAA,YACf,cAAc,SAAS;AAAA,YACvB,QAAQ,SAAS;AAAA,YACjB,UAAU,SAAS;AAAA,UACrB,IACA,CAAC;AAAA,QACP;AAAA,MACF;AAAA,MAEA,QAAQ,OACN,SACA,YACoB;AACpB,YAAI,QAAQ,IAAI;AACd,gBAAM,QAAQ,GAAG,QAAQ;AACzB,gBAAM,WAAW,QAAQ,GAAG,WAAW;AAAA,YACrC,CAAC,MAAM,EAAE,SAAS,QAAQ;AAAA,UAC5B;AACA,cAAI,CAAC,UAAU;AACb,kBAAM,IAAI;AAAA,cACR,+BAA+B,QAAQ,IAAI,uBAAuB,QAAQ,GAAG,EAAE;AAAA,YACjF;AAAA,UACF;AACA,iBAAO,GAAG,QAAQ,YAAY,OAAO,MAAM,SAAS,QAAQ;AAAA,QAC9D;AACA,cAAM,IAAI;AAAA,UACR,sJACsD,QAAQ,IAAI;AAAA,QAEpE;AAAA,MACF;AAAA,MAEA,YAAY;AAAA,QACV,UAAU,OAAO,SAAS,MAAM,eAAe;AAC7C,cAAI,QAAQ,IAAI;AACd,kBAAMA,UAAmB,CAAC;AAC1B,gBAAI;AACF,oBAAM,QAAQ,GAAG,MAAM,aAAa,MAAM,CAAC,UAAU;AACnD,gBAAAA,QAAO,KAAK,OAAO,KAAK,KAAK,CAAC;AAAA,cAChC,CAAC;AAAA,YACH,SAAS,OAAO;AACd,oBAAM,IAAI;AAAA,gBACR,kBAAkB,IAAI,KACpB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CACvD;AAAA,cACF;AAAA,YACF;AACA,mBAAO,OAAO,OAAOA,OAAM,EAAE,SAAS,MAAM;AAAA,UAC9C;AACA,gBAAM,WAAW,kBAAkB,SAAS,IAAI;AAChD,gBAAM,aAAa,MAAM;AAAA,YACvB;AAAA,YACA,WAAW,YAAY,QAAQ,CAAC;AAAA,UAClC;AACA,cAAI,WAAW,aAAa,GAAG;AAC7B,kBAAM,IAAI,MAAM,kBAAkB,IAAI,KAAK,WAAW,MAAM,EAAE;AAAA,UAChE;AAEA,gBAAM,WAAW,WAAW,OAAO,KAAK;AACxC,cAAI,CAAC,QAAQ,KAAK,QAAQ,GAAG;AAC3B,kBAAM,IAAI;AAAA,cACR,kBAAkB,IAAI;AAAA,YACxB;AAAA,UACF;AAEA,gBAAM,OAAO,OAAO,QAAQ;AAC5B,cAAI,CAAC,OAAO,cAAc,IAAI,GAAG;AAC/B,kBAAM,IAAI;AAAA,cACR,kBAAkB,IAAI;AAAA,YACxB;AAAA,UACF;AACA,cAAI,SAAS,EAAG,QAAO;AAEvB,gBAAM,SAAmB,CAAC;AAC1B,mBACM,SAAS,GACb,SAAS,MACT,UAAU,6BACV;AACA,kBAAM,gBAAgB,KAAK;AAAA,cACzB;AAAA,cACA,OAAO;AAAA,YACT;AACA,kBAAM,SAAS,MAAM;AAAA,cACnB;AAAA,cACA,SAAS,YAAY,QAAQ,CAAC,cAAc,MAAM,UAAU,aAAa;AAAA,YAC3E;AACA,gBAAI,OAAO,aAAa,GAAG;AACzB,oBAAM,IAAI,MAAM,kBAAkB,IAAI,KAAK,OAAO,MAAM,EAAE;AAAA,YAC5D;AAEA,kBAAM,UAAU,OAAO,OAAO,QAAQ,OAAO,EAAE;AAC/C,gBACE,QAAQ,WAAW,KACnB,QAAQ,SAAS,MAAM,KACvB,CAAC,yBAAyB,KAAK,OAAO,GACtC;AACA,oBAAM,IAAI;AAAA,gBACR,kBAAkB,IAAI,sDAAsD,MAAM;AAAA,cACpF;AAAA,YACF;AAEA,kBAAM,QAAQ,OAAO,KAAK,SAAS,QAAQ;AAC3C,gBAAI,MAAM,WAAW,eAAe;AAClC,oBAAM,IAAI;AAAA,gBACR,kBAAkB,IAAI,sDAAsD,MAAM;AAAA,cACpF;AAAA,YACF;AACA,mBAAO,KAAK,KAAK;AAAA,UACnB;AAEA,iBAAO,OAAO,OAAO,MAAM,EAAE,SAAS,MAAM;AAAA,QAC9C;AAAA,QAEA,WAAW,OAAO,SAAS,MAAM,SAAS,eAAe;AACvD,cAAI,QAAQ,IAAI;AACd,gBAAI;AACF,oBAAM,QAAQ,GAAG,MAAM;AAAA,gBACrB,OAAO,KAAK,SAAS,MAAM;AAAA,gBAC3B;AAAA,cACF;AAAA,YACF,SAAS,OAAO;AACd,oBAAM,IAAI;AAAA,gBACR,mBAAmB,IAAI,KACrB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CACvD;AAAA,cACF;AAAA,YACF;AACA;AAAA,UACF;AACA,gBAAM,WAAW,kBAAkB,SAAS,IAAI;AAChD,gBAAM,SAAS,MAAM,QAAQ,QAAQ;AACrC,gBAAM,UAAU,OAAO,KAAK,SAAS,MAAM,EAAE,SAAS,QAAQ;AAC9D,gBAAM,WAAW,GAAG,QAAQ,qBAAqB,WAAW,CAAC;AAC7D,cAAI,UAAU;AAEd,cAAI;AACF,gBAAI,QAAQ,WAAW,GAAG;AACxB,wBAAU;AACV,oBAAM,SAAS,MAAM;AAAA,gBACnB;AAAA,gBACA;AAAA,kBACE;AAAA,kBACA;AAAA,oBACE,YAAY,YAAY,MAAM,CAAC;AAAA,oBAC/B,OAAO,YAAY,QAAQ,CAAC;AAAA,oBAC5B,0BAA0B,UAAU,QAAQ;AAAA,kBAC9C,EAAE,KAAK,MAAM;AAAA,gBACf;AAAA,cACF;AACA,kBAAI,OAAO,aAAa,GAAG;AACzB,sBAAM,IAAI,MAAM,OAAO,MAAM;AAAA,cAC/B;AACA;AAAA,YACF;AAEA,kBAAM,YAAY,kBAAkB,QAAQ,UAAU,QAAQ;AAC9D,qBAAS,SAAS,GAAG,SAAS,QAAQ,QAAQ,UAAU,WAAW;AACjE,oBAAM,UAAU,WAAW;AAC3B,oBAAM,UAAU,SAAS,aAAa,QAAQ;AAC9C,wBAAU;AACV,oBAAM,SAAS,MAAM;AAAA,gBACnB;AAAA,gBACA;AAAA,kBACE;AAAA,kBACA;AAAA,oBACE;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA,QAAQ,MAAM,QAAQ,SAAS,SAAS;AAAA,oBACxC;AAAA,oBACA;AAAA,kBACF;AAAA,gBACF;AAAA,cACF;AACA,kBAAI,OAAO,aAAa,GAAG;AACzB,sBAAM,IAAI,MAAM,OAAO,MAAM;AAAA,cAC/B;AAAA,YACF;AAAA,UACF,SAAS,OAAO;AACd,gBAAI,SAAS;AACX,kBAAI;AACF,sBAAM;AAAA,kBACJ;AAAA,kBACA,kBAAkB,SAAS,SAAS,YAAY,QAAQ,CAAC,EAAE;AAAA,gBAC7D;AAAA,cACF,QAAQ;AAAA,cAER;AAAA,YACF;AACA,kBAAM,IAAI;AAAA,cACR,mBAAmB,IAAI,KACrB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CACvD;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,QAEA,OAAO,OAAO,SAAS,MAAM,eAAe;AAC1C,gBAAM,WAAW,kBAAkB,SAAS,IAAI;AAChD,gBAAM,SAAS,MAAM;AAAA,YACnB;AAAA,YACA,kBAAkB,SAAS,YAAY,YAAY,QAAQ,CAAC,EAAE;AAAA,UAChE;AACA,cAAI,OAAO,aAAa,GAAG;AACzB,kBAAM,IAAI,MAAM,8BAA8B,IAAI,KAAK,OAAO,MAAM,EAAE;AAAA,UACxE;AAAA,QACF;AAAA,QAEA,SAAS,OAAO,SAAS,MAAM,eAAe;AAC5C,gBAAM,WAAW,kBAAkB,SAAS,IAAI;AAEhD,gBAAM,SAAS,MAAM;AAAA,YACnB;AAAA,YACA,QAAQ,YAAY,QAAQ,CAAC;AAAA;AAAA,UAC/B;AACA,cAAI,OAAO,aAAa,GAAG;AACzB,kBAAM,IAAI,MAAM,4BAA4B,IAAI,KAAK,OAAO,MAAM,EAAE;AAAA,UACtE;AACA,gBAAM,UAAuB,CAAC;AAC9B,qBAAW,QAAQ,OAAO,OAAO,MAAM,IAAI,GAAG;AAC5C,gBAAI,CAAC,KAAM;AACX,kBAAM,CAAC,UAAU,SAAS,UAAU,GAAG,SAAS,IAAI,KAAK,MAAM,GAAI;AACnE,kBAAM,OAAO,UAAU,KAAK,GAAI;AAChC,oBAAQ,KAAK;AAAA,cACX;AAAA,cACA,MAAM,aAAa,MAAM,cAAc;AAAA,cACvC,MAAM,SAAS,SAAS,EAAE,KAAK;AAAA,cAC/B,UAAU,IAAI,KAAK,WAAW,QAAQ,IAAI,GAAI;AAAA,YAChD,CAAC;AAAA,UACH;AACA,iBAAO;AAAA,QACT;AAAA,QAEA,QAAQ,OAAO,SAAS,MAAM,eAAe;AAC3C,gBAAM,WAAW,kBAAkB,SAAS,IAAI;AAChD,gBAAM,SAAS,MAAM,WAAW,SAAS,WAAW,YAAY,QAAQ,CAAC,EAAE;AAC3E,iBAAO,OAAO,aAAa;AAAA,QAC7B;AAAA,QAEA,QAAQ,OAAO,SAAS,MAAM,eAAe;AAC3C,gBAAM,WAAW,kBAAkB,SAAS,IAAI;AAChD,cAAI,CAAC,QAAQ,MAAM,aAAa,mBAAmB;AACjD,kBAAM,IAAI,MAAM,gDAAgD;AAAA,UAClE;AACA,gBAAM,SAAS,MAAM;AAAA,YACnB;AAAA,YACA,kBAAkB,SAAS,UAAU,YAAY,QAAQ,CAAC,EAAE;AAAA,UAC9D;AACA,cAAI,OAAO,aAAa,GAAG;AACzB,kBAAM,IAAI,MAAM,oBAAoB,IAAI,KAAK,OAAO,MAAM,EAAE;AAAA,UAC9D;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA,MAMA,OAAO,OAAO,YAA2B;AACvC,cAAM,UAAU,SAAS,OAAO,EAAE,MAAM;AAAA,MAC1C;AAAA,MAEA,QAAQ,OAAO,YAA2B;AACxC,cAAM,UAAU,SAAS,QAAQ,EAAE,OAAO;AAAA,MAC5C;AAAA,MAEA,mBAAmB,EAAE,QAAQ,MAAM,eAAe,EAAE,WAAW,MAAM,EAAE;AAAA,MAEvE,aAAa,CAAC,YAA0C;AAAA,IAC1D;AAAA;AAAA;AAAA;AAAA;AAAA,IAMA,UAAU;AAAA;AAAA;AAAA,MAGR,cAAc;AAAA,QACZ,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,gBAAgB;AAAA,QAChB,eAAe,EAAE,WAAW,MAAM;AAAA,MACpC;AAAA,MAEA,QAAQ,OACN,QACA,WACA,YACG;AACH,cAAM,WAAW,cAAc,MAAM;AACrC,cAAM,SAAS,aAAa,QAAQ,QAAQ;AAC5C,YAAI;AACJ,YAAI;AACF,gBAAM,SAAS,MAAM,OAAO,UAAU,IAAI,SAAS;AACnD,iBAAO,MAAM,OAAO,KAAK,EAAE,MAAM,aAAa,SAAS,IAAI,EAAE,CAAC;AAC9D,cAAI,KAAK,WAAW,UAAW,OAAM,KAAK,MAAM;AAChD,iBAAO;AAAA,YACL,IAAI,KAAK;AAAA,YACT,UAAU;AAAA,YACV,WAAW,KAAK,aAAa,oBAAI,KAAK;AAAA,YACtC,UAAU,EAAE,MAAM,SAAS,MAAM,YAAY,KAAK,MAAM,UAAU,UAAU;AAAA,UAC9E;AAAA,QACF,SAAS,OAAO;AACd,cAAI,KAAM,OAAM,gBAAgB,IAAI,EAAE,MAAM,MAAM;AAAA,UAAC,CAAC;AACpD,gBAAM,IAAI;AAAA,YACR,qCACE,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CACvD;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,MAEA,MAAM,OAAO,WAAyB;AACpC,cAAM,WAAW,cAAc,MAAM;AACrC,cAAM,SAAS,aAAa,QAAQ,QAAQ;AAC5C,cAAM,MAAM,MAAM,OAAO,UAAU,KAAK;AACxC,eAAO,IACJ,OAAO,CAAC,OAAO,aAAa,EAAE,KAAK,GAAG,WAAW,cAAc,GAAG,WAAW,SAAS,EACtF,IAAI,CAAC,QAAQ;AAAA,UACZ,IAAI,GAAG;AAAA,UACP,UAAU;AAAA,UACV,WAAW,GAAG;AAAA,UACd,UAAU,EAAE,YAAY,GAAG,MAAM,cAAc,GAAG,OAAO;AAAA,QAC3D,EAAE;AAAA,MACN;AAAA,MAEA,QAAQ,OAAO,QAAsB,eAAuB;AAC1D,cAAM,WAAW,cAAc,MAAM;AACrC,cAAM,SAAS,aAAa,QAAQ,QAAQ;AAC5C,YAAI;AACJ,YAAI;AACF,eAAK,MAAM,OAAO,UAAU,IAAI,UAAU;AAAA,QAC5C,SAAS,OAAO;AACd,cAAI,iBAAiB,eAAe,MAAM,WAAW,IAAK;AAC1D,gBAAM;AAAA,QACR;AACA,cAAM,gBAAgB,EAAE;AAAA,MAC1B;AAAA,IACF;AAAA,EACF;AACF,CAAC;AAEM,IAAM,SAAS,CAAC,SAAuB,CAAC,MAAM,UAAU,MAAM;","names":["chunks"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@computesdk/archil",
3
- "version": "0.4.29",
3
+ "version": "0.4.31",
4
4
  "description": "Archil provider for ComputeSDK - exec commands against an Archil disk",
5
5
  "author": "ComputeSDK",
6
6
  "license": "MIT",
@@ -19,8 +19,8 @@
19
19
  ],
20
20
  "dependencies": {
21
21
  "disk": "^1.1.2",
22
- "computesdk": "4.1.16",
23
- "@computesdk/provider": "2.1.22"
22
+ "@computesdk/provider": "2.1.23",
23
+ "computesdk": "4.1.17"
24
24
  },
25
25
  "devDependencies": {
26
26
  "@types/node": "^20.0.0",