@computesdk/archil 0.4.15 → 0.4.16
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 +66 -5
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +67 -6
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -69,7 +69,7 @@ function createClient(config, resolved) {
|
|
|
69
69
|
return new import_disk.Archil({ ...resolved, region });
|
|
70
70
|
}
|
|
71
71
|
function resolveCreateDiskId(options) {
|
|
72
|
-
const diskId = options?.diskId;
|
|
72
|
+
const diskId = options?.diskId ?? options?.sandboxId;
|
|
73
73
|
if (!diskId) {
|
|
74
74
|
throw new Error(
|
|
75
75
|
'Archil create() requires an existing disk id on the top-level options.\n\nExample:\n provider.sandbox.create({ diskId: "disk_abc123" })'
|
|
@@ -77,6 +77,10 @@ function resolveCreateDiskId(options) {
|
|
|
77
77
|
}
|
|
78
78
|
return diskId;
|
|
79
79
|
}
|
|
80
|
+
async function forkSandboxVm(client, sourceId, name) {
|
|
81
|
+
const source = await client.sandboxes.get(sourceId);
|
|
82
|
+
return source.fork({ name });
|
|
83
|
+
}
|
|
80
84
|
function shellEscape(value) {
|
|
81
85
|
return `'${value.replace(/'/g, `'\\''`)}'`;
|
|
82
86
|
}
|
|
@@ -217,10 +221,28 @@ var _provider = (0, import_provider.defineProvider)({
|
|
|
217
221
|
const resolved = resolveConfig(config);
|
|
218
222
|
const client = createClient(config, resolved);
|
|
219
223
|
const execution = options?.ephemeral !== void 0 ? options.ephemeral ? "exec" : "persistent" : resolved.execution;
|
|
220
|
-
if (
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
+
if (options?.snapshotId && options?.ephemeral === true) {
|
|
225
|
+
throw new Error(
|
|
226
|
+
"Archil cannot combine ephemeral: true with snapshotId \u2014 snapshots fork persistent VMs. Drop ephemeral or set it to false."
|
|
227
|
+
);
|
|
228
|
+
}
|
|
229
|
+
if (execution === "persistent" || options?.snapshotId) {
|
|
230
|
+
let vm;
|
|
231
|
+
if (options?.snapshotId) {
|
|
232
|
+
vm = await forkSandboxVm(client, options.snapshotId, options?.name);
|
|
233
|
+
} else if (options?.sandboxId) {
|
|
234
|
+
if (options?.signal) {
|
|
235
|
+
throw new Error(
|
|
236
|
+
"create({ sandboxId }) attaches to an existing sandbox and cannot be combined with an abort signal"
|
|
237
|
+
);
|
|
238
|
+
}
|
|
239
|
+
vm = await client.sandboxes.get(options.sandboxId);
|
|
240
|
+
await ensureVmRunning(vm);
|
|
241
|
+
} else {
|
|
242
|
+
vm = await client.sandboxes.create(toSandboxRequest(options), {
|
|
243
|
+
wait: true
|
|
244
|
+
});
|
|
245
|
+
}
|
|
224
246
|
sandboxModes.set(vm.id, "persistent");
|
|
225
247
|
return {
|
|
226
248
|
sandbox: {
|
|
@@ -595,6 +617,45 @@ var _provider = (0, import_provider.defineProvider)({
|
|
|
595
617
|
}
|
|
596
618
|
},
|
|
597
619
|
getInstance: (sandbox) => sandbox
|
|
620
|
+
},
|
|
621
|
+
// Archil has no separate snapshot resource: a "snapshot" is a sandbox
|
|
622
|
+
// fork (an isolated writable branch of the source sandbox's state), so
|
|
623
|
+
// snapshot ids are ordinary sandbox ids that create() forks again.
|
|
624
|
+
snapshot: {
|
|
625
|
+
create: async (config, sandboxId, options) => {
|
|
626
|
+
const resolved = resolveConfig(config);
|
|
627
|
+
const client = createClient(config, resolved);
|
|
628
|
+
try {
|
|
629
|
+
const fork = await forkSandboxVm(client, sandboxId, options?.name);
|
|
630
|
+
return {
|
|
631
|
+
id: fork.id,
|
|
632
|
+
provider: "archil",
|
|
633
|
+
createdAt: fork.createdAt ?? /* @__PURE__ */ new Date(),
|
|
634
|
+
metadata: { name: fork.name }
|
|
635
|
+
};
|
|
636
|
+
} catch (error) {
|
|
637
|
+
throw new Error(
|
|
638
|
+
`Failed to create Archil snapshot: ${error instanceof Error ? error.message : String(error)}`
|
|
639
|
+
);
|
|
640
|
+
}
|
|
641
|
+
},
|
|
642
|
+
list: async (_config) => {
|
|
643
|
+
throw new Error(
|
|
644
|
+
"Archil provider does not support listing snapshots."
|
|
645
|
+
);
|
|
646
|
+
},
|
|
647
|
+
delete: async (config, snapshotId) => {
|
|
648
|
+
const resolved = resolveConfig(config);
|
|
649
|
+
const client = createClient(config, resolved);
|
|
650
|
+
let vm;
|
|
651
|
+
try {
|
|
652
|
+
vm = await client.sandboxes.get(snapshotId);
|
|
653
|
+
} catch (error) {
|
|
654
|
+
if (error instanceof import_disk.ArchilError && error.status === 404) return;
|
|
655
|
+
throw error;
|
|
656
|
+
}
|
|
657
|
+
await vm.delete();
|
|
658
|
+
}
|
|
598
659
|
}
|
|
599
660
|
}
|
|
600
661
|
});
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["/**\n * Archil Provider\n *\n * Supports Archil's two compute surfaces, selected by `execution`:\n *\n * - \"exec\" (default): each command runs in an Archil-managed ephemeral\n * container with the configured disk mounted, then returns stdout, stderr,\n * and exit code. \"create\" resolves a handle to an existing disk id; env,\n * cwd, and installs do not persist between commands.\n * - \"persistent\": `create` provisions an Archil sandbox — a persistent Linux\n * VM with a dedicated disk. `runCommand` uses the sandbox's interactive\n * process API (a short-lived WebSocket connection fetched fresh per command\n * via POST /api/sandboxes/{id}/connections), so filesystem state, installed\n * tools, and background processes persist across commands.\n */\n\nimport { defineProvider } from '@computesdk/provider';\nimport { Archil as ArchilClient } from 'disk';\nimport type {\n CreateSandboxRequest as ArchilSandboxRequest,\n Sandbox as ArchilVm,\n} from 'disk';\nimport { randomUUID } from 'node:crypto';\nimport { posix } from 'node:path';\nimport type {\n CommandResult,\n SandboxInfo,\n CreateSandboxOptions,\n FileEntry,\n RunCommandOptions,\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 * - \"exec\": serverless per-command containers on a disk (default).\n * - \"persistent\": a persistent sandbox VM run through the process API.\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. Defaults to \"exec\". In\n * \"persistent\" mode create() provisions a persistent sandbox VM instead of\n * resolving a disk handle. Per-sandbox override: `ephemeral` on\n * create() options (true -> exec handle, false -> 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}\n\ninterface ArchilCreateOptions extends CreateSandboxOptions {\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: config.execution ?? 'exec' };\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 const diskId = options?.diskId;\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\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 const envEntries = Object.entries(options?.env ?? {});\n if (!envEntries.some(([key]) => key === 'HOME')) {\n envEntries.unshift(['HOME', process.env.HOME || '/tmp']);\n }\n const envPrefix = envEntries\n .map(([k, v]) => `${k}=${shellEscape(String(v))}`)\n .join(' ');\n wrapped = `${envPrefix} ${wrapped}`;\n\n if (options?.cwd) {\n wrapped = `cd ${shellEscape(options.cwd)} && ${wrapped}`;\n }\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\nfunction wrapSandboxCommand(command: string, options?: RunCommandOptions): string {\n let wrapped = command;\n if (options?.cwd) {\n wrapped = `cd ${shellEscape(options.cwd)} && ${wrapped}`;\n }\n if (options?.background) {\n wrapped = `nohup sh -c ${shellEscape(wrapped)} > /dev/null 2>&1 &`;\n }\n return wrapped;\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 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 // CreateSandboxOptions.timeout is milliseconds; Archil's TTL is seconds.\n request.maxTtlSeconds = Math.ceil(options.timeout / 1000);\n }\n return request;\n}\n\n// Records each sandbox's effective execution mode so `destroy` — which only\n// receives an id — deletes persistent VMs even when the mode came from a\n// per-sandbox `ephemeral` override rather than the provider config.\nconst sandboxModes = new Map<string, ArchilExecutionMode>();\n\nconst _provider = defineProvider<ArchilSandbox, ArchilConfig>({\n name: 'archil',\n methods: {\n sandbox: {\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 default for this\n // sandbox: true -> serverless 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 (execution === 'persistent') {\n const vm = await client.sandboxes.create(toSandboxRequest(options), {\n wait: true,\n });\n sandboxModes.set(vm.id, 'persistent');\n return {\n sandbox: {\n client,\n disk: { id: vm.id },\n vm,\n resolved,\n createdAt: new Date(),\n },\n sandboxId: vm.id,\n };\n }\n\n const diskId = resolveCreateDiskId(options);\n sandboxModes.set(diskId, 'exec');\n return {\n sandbox: {\n client,\n disk: { id: diskId },\n resolved,\n createdAt: new Date(),\n },\n sandboxId: diskId,\n };\n },\n\n getById: async (config: ArchilConfig, sandboxId: string) => {\n const resolved = resolveConfig(config);\n const client = createClient(config, resolved);\n try {\n if (resolved.execution === 'persistent') {\n const vm = await client.sandboxes.get(sandboxId);\n await ensureVmRunning(vm);\n return {\n sandbox: {\n client,\n disk: { id: vm.id },\n vm,\n resolved,\n createdAt: new Date(),\n },\n sandboxId: vm.id,\n };\n }\n const disk = await client.disks.get(sandboxId);\n return {\n sandbox: { client, disk, resolved, createdAt: new Date() },\n sandboxId: disk.id,\n };\n } catch {\n return null;\n }\n },\n\n list: async (config: ArchilConfig) => {\n const resolved = resolveConfig(config);\n const client = createClient(config, resolved);\n if (resolved.execution === 'persistent') {\n const vms = await client.sandboxes.list();\n return vms.map((vm) => ({\n sandbox: {\n client,\n disk: { id: vm.id },\n vm,\n resolved,\n createdAt: new Date(),\n },\n sandboxId: vm.id,\n }));\n }\n const disks = await client.disks.list();\n return disks.map((disk) => ({\n sandbox: { client, disk, resolved, createdAt: new Date() },\n sandboxId: disk.id,\n }));\n },\n\n destroy: async (config: ArchilConfig, sandboxId: string) => {\n const resolved = resolveConfig(config);\n const mode = sandboxModes.get(sandboxId) ?? resolved.execution;\n if (mode === 'persistent') {\n const client = createClient(config, resolved);\n const vm = await client.sandboxes.get(sandboxId);\n await vm.delete();\n }\n // exec handles are disk references — Archil disks have an independent\n // lifecycle, so destroying them is a no-op. Unknown ids fall back to\n // the configured mode.\n sandboxModes.delete(sandboxId);\n },\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 // The process API fetches a fresh short-lived WebSocket\n // connection URL per process start, so expiry is handled by the\n // underlying client.\n await ensureVmRunning(sandbox.vm);\n const wrapped = wrapSandboxCommand(command, options);\n if (options?.background) {\n const proc = await sandbox.vm.processes.start(wrapped, {\n env: options?.env,\n });\n await proc.disconnect();\n return {\n stdout: '',\n stderr: '',\n exitCode: 0,\n durationMs: Date.now() - startTime,\n };\n }\n const result = await sandbox.vm.exec(wrapped, {\n env: options?.env,\n timeoutSeconds:\n options?.timeout !== undefined\n ? Math.ceil(options.timeout / 1000)\n : undefined,\n });\n return {\n stdout: result.stdout,\n stderr: result.stderr,\n exitCode:\n result.exitCode ?? (result.status === 'completed' ? 0 : 1),\n durationMs: Date.now() - startTime,\n };\n }\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 {\n stdout: '',\n stderr: error instanceof Error ? error.message : String(error),\n exitCode: 1,\n durationMs: Date.now() - startTime,\n };\n }\n },\n\n getInfo: async (sandbox: ArchilSandbox): Promise<SandboxInfo> => {\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 getInstance: (sandbox: ArchilSandbox): ArchilSandbox => sandbox,\n },\n },\n});\n\nexport const archil = (config: ArchilConfig = {}) => _provider(config);\n\nexport type { ArchilSandbox };\n"],"mappings":"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","names":["ArchilClient","result","chunks"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["/**\n * Archil Provider\n *\n * Supports Archil's two compute surfaces, selected by `execution`:\n *\n * - \"exec\" (default): each command runs in an Archil-managed ephemeral\n * container with the configured disk mounted, then returns stdout, stderr,\n * and exit code. \"create\" resolves a handle to an existing disk id; env,\n * cwd, and installs do not persist between commands.\n * - \"persistent\": `create` provisions an Archil sandbox — a persistent Linux\n * VM with a dedicated disk. `runCommand` uses the sandbox's interactive\n * process API (a short-lived WebSocket connection fetched fresh per command\n * via POST /api/sandboxes/{id}/connections), so filesystem state, installed\n * tools, and background processes persist across commands.\n */\n\nimport { defineProvider } from '@computesdk/provider';\nimport { Archil as ArchilClient, ArchilError } from 'disk';\nimport type {\n CreateSandboxRequest as ArchilSandboxRequest,\n Sandbox as ArchilVm,\n} from 'disk';\nimport { randomUUID } from 'node:crypto';\nimport { posix } from 'node:path';\nimport type {\n CommandResult,\n SandboxInfo,\n CreateSandboxOptions,\n FileEntry,\n RunCommandOptions,\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 * - \"exec\": serverless per-command containers on a disk (default).\n * - \"persistent\": a persistent sandbox VM run through the process API.\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. Defaults to \"exec\". In\n * \"persistent\" mode create() provisions a persistent sandbox VM instead of\n * resolving a disk handle. Per-sandbox override: `ephemeral` on\n * create() options (true -> exec handle, false -> 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}\n\ninterface ArchilCreateOptions extends CreateSandboxOptions {\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: config.execution ?? 'exec' };\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\nasync function forkSandboxVm(\n client: ArchilClient,\n sourceId: string,\n name?: string,\n): Promise<ArchilVm> {\n const source = await client.sandboxes.get(sourceId);\n return source.fork({ name });\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 const envEntries = Object.entries(options?.env ?? {});\n if (!envEntries.some(([key]) => key === 'HOME')) {\n envEntries.unshift(['HOME', process.env.HOME || '/tmp']);\n }\n const envPrefix = envEntries\n .map(([k, v]) => `${k}=${shellEscape(String(v))}`)\n .join(' ');\n wrapped = `${envPrefix} ${wrapped}`;\n\n if (options?.cwd) {\n wrapped = `cd ${shellEscape(options.cwd)} && ${wrapped}`;\n }\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\nfunction wrapSandboxCommand(command: string, options?: RunCommandOptions): string {\n let wrapped = command;\n if (options?.cwd) {\n wrapped = `cd ${shellEscape(options.cwd)} && ${wrapped}`;\n }\n if (options?.background) {\n wrapped = `nohup sh -c ${shellEscape(wrapped)} > /dev/null 2>&1 &`;\n }\n return wrapped;\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 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 // CreateSandboxOptions.timeout is milliseconds; Archil's TTL is seconds.\n request.maxTtlSeconds = Math.ceil(options.timeout / 1000);\n }\n return request;\n}\n\n// Records each sandbox's effective execution mode so `destroy` — which only\n// receives an id — deletes persistent VMs even when the mode came from a\n// per-sandbox `ephemeral` override rather than the provider config.\nconst sandboxModes = new Map<string, ArchilExecutionMode>();\n\nconst _provider = defineProvider<ArchilSandbox, ArchilConfig>({\n name: 'archil',\n methods: {\n sandbox: {\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 default for this\n // sandbox: true -> serverless 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 && options?.ephemeral === true) {\n throw new Error(\n 'Archil cannot combine ephemeral: true with snapshotId — snapshots fork persistent VMs. Drop ephemeral or set it to false.',\n );\n }\n\n // snapshotId forks a new VM from that snapshot's state — Archil\n // models snapshots as isolated writable branches of a source\n // sandbox — so it always takes the VM path regardless of the\n // configured execution mode.\n if (execution === 'persistent' || options?.snapshotId) {\n let vm: ArchilVm;\n if (options?.snapshotId) {\n vm = await forkSandboxVm(client, options.snapshotId, 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 sandboxModes.set(vm.id, 'persistent');\n return {\n sandbox: {\n client,\n disk: { id: vm.id },\n vm,\n resolved,\n createdAt: new Date(),\n },\n sandboxId: vm.id,\n };\n }\n\n const diskId = resolveCreateDiskId(options);\n sandboxModes.set(diskId, 'exec');\n return {\n sandbox: {\n client,\n disk: { id: diskId },\n resolved,\n createdAt: new Date(),\n },\n sandboxId: diskId,\n };\n },\n\n getById: async (config: ArchilConfig, sandboxId: string) => {\n const resolved = resolveConfig(config);\n const client = createClient(config, resolved);\n try {\n if (resolved.execution === 'persistent') {\n const vm = await client.sandboxes.get(sandboxId);\n await ensureVmRunning(vm);\n return {\n sandbox: {\n client,\n disk: { id: vm.id },\n vm,\n resolved,\n createdAt: new Date(),\n },\n sandboxId: vm.id,\n };\n }\n const disk = await client.disks.get(sandboxId);\n return {\n sandbox: { client, disk, resolved, createdAt: new Date() },\n sandboxId: disk.id,\n };\n } catch {\n return null;\n }\n },\n\n list: async (config: ArchilConfig) => {\n const resolved = resolveConfig(config);\n const client = createClient(config, resolved);\n if (resolved.execution === 'persistent') {\n const vms = await client.sandboxes.list();\n return vms.map((vm) => ({\n sandbox: {\n client,\n disk: { id: vm.id },\n vm,\n resolved,\n createdAt: new Date(),\n },\n sandboxId: vm.id,\n }));\n }\n const disks = await client.disks.list();\n return disks.map((disk) => ({\n sandbox: { client, disk, resolved, createdAt: new Date() },\n sandboxId: disk.id,\n }));\n },\n\n destroy: async (config: ArchilConfig, sandboxId: string) => {\n const resolved = resolveConfig(config);\n const mode = sandboxModes.get(sandboxId) ?? resolved.execution;\n if (mode === 'persistent') {\n const client = createClient(config, resolved);\n const vm = await client.sandboxes.get(sandboxId);\n await vm.delete();\n }\n // exec handles are disk references — Archil disks have an independent\n // lifecycle, so destroying them is a no-op. Unknown ids fall back to\n // the configured mode.\n sandboxModes.delete(sandboxId);\n },\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 // The process API fetches a fresh short-lived WebSocket\n // connection URL per process start, so expiry is handled by the\n // underlying client.\n await ensureVmRunning(sandbox.vm);\n const wrapped = wrapSandboxCommand(command, options);\n if (options?.background) {\n const proc = await sandbox.vm.processes.start(wrapped, {\n env: options?.env,\n });\n await proc.disconnect();\n return {\n stdout: '',\n stderr: '',\n exitCode: 0,\n durationMs: Date.now() - startTime,\n };\n }\n const result = await sandbox.vm.exec(wrapped, {\n env: options?.env,\n timeoutSeconds:\n options?.timeout !== undefined\n ? Math.ceil(options.timeout / 1000)\n : undefined,\n });\n return {\n stdout: result.stdout,\n stderr: result.stderr,\n exitCode:\n result.exitCode ?? (result.status === 'completed' ? 0 : 1),\n durationMs: Date.now() - startTime,\n };\n }\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 {\n stdout: '',\n stderr: error instanceof Error ? error.message : String(error),\n exitCode: 1,\n durationMs: Date.now() - startTime,\n };\n }\n },\n\n getInfo: async (sandbox: ArchilSandbox): Promise<SandboxInfo> => {\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 getInstance: (sandbox: ArchilSandbox): ArchilSandbox => sandbox,\n },\n\n // Archil has no separate snapshot resource: a \"snapshot\" is a sandbox\n // fork (an isolated writable branch of the source sandbox's state), so\n // snapshot ids are ordinary sandbox ids that create() forks again.\n snapshot: {\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 try {\n const fork = await forkSandboxVm(client, sandboxId, options?.name);\n return {\n id: fork.id,\n provider: 'archil',\n createdAt: fork.createdAt ?? new Date(),\n metadata: { name: fork.name },\n };\n } catch (error) {\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 throw new Error(\n 'Archil provider does not support listing snapshots.',\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 vm.delete();\n },\n },\n },\n});\n\nexport const archil = (config: ArchilConfig = {}) => _provider(config);\n\nexport type { ArchilSandbox };\n"],"mappings":"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","names":["ArchilClient","result","chunks"]}
|
package/dist/index.mjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// src/index.ts
|
|
2
2
|
import { defineProvider } from "@computesdk/provider";
|
|
3
|
-
import { Archil as ArchilClient } from "disk";
|
|
3
|
+
import { Archil as ArchilClient, ArchilError } from "disk";
|
|
4
4
|
import { randomUUID } from "crypto";
|
|
5
5
|
import { posix } from "path";
|
|
6
6
|
var ARCHIL_MOUNT_ROOT = "/mnt/archil";
|
|
@@ -45,7 +45,7 @@ function createClient(config, resolved) {
|
|
|
45
45
|
return new ArchilClient({ ...resolved, region });
|
|
46
46
|
}
|
|
47
47
|
function resolveCreateDiskId(options) {
|
|
48
|
-
const diskId = options?.diskId;
|
|
48
|
+
const diskId = options?.diskId ?? options?.sandboxId;
|
|
49
49
|
if (!diskId) {
|
|
50
50
|
throw new Error(
|
|
51
51
|
'Archil create() requires an existing disk id on the top-level options.\n\nExample:\n provider.sandbox.create({ diskId: "disk_abc123" })'
|
|
@@ -53,6 +53,10 @@ function resolveCreateDiskId(options) {
|
|
|
53
53
|
}
|
|
54
54
|
return diskId;
|
|
55
55
|
}
|
|
56
|
+
async function forkSandboxVm(client, sourceId, name) {
|
|
57
|
+
const source = await client.sandboxes.get(sourceId);
|
|
58
|
+
return source.fork({ name });
|
|
59
|
+
}
|
|
56
60
|
function shellEscape(value) {
|
|
57
61
|
return `'${value.replace(/'/g, `'\\''`)}'`;
|
|
58
62
|
}
|
|
@@ -193,10 +197,28 @@ var _provider = defineProvider({
|
|
|
193
197
|
const resolved = resolveConfig(config);
|
|
194
198
|
const client = createClient(config, resolved);
|
|
195
199
|
const execution = options?.ephemeral !== void 0 ? options.ephemeral ? "exec" : "persistent" : resolved.execution;
|
|
196
|
-
if (
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
+
if (options?.snapshotId && options?.ephemeral === true) {
|
|
201
|
+
throw new Error(
|
|
202
|
+
"Archil cannot combine ephemeral: true with snapshotId \u2014 snapshots fork persistent VMs. Drop ephemeral or set it to false."
|
|
203
|
+
);
|
|
204
|
+
}
|
|
205
|
+
if (execution === "persistent" || options?.snapshotId) {
|
|
206
|
+
let vm;
|
|
207
|
+
if (options?.snapshotId) {
|
|
208
|
+
vm = await forkSandboxVm(client, options.snapshotId, options?.name);
|
|
209
|
+
} else if (options?.sandboxId) {
|
|
210
|
+
if (options?.signal) {
|
|
211
|
+
throw new Error(
|
|
212
|
+
"create({ sandboxId }) attaches to an existing sandbox and cannot be combined with an abort signal"
|
|
213
|
+
);
|
|
214
|
+
}
|
|
215
|
+
vm = await client.sandboxes.get(options.sandboxId);
|
|
216
|
+
await ensureVmRunning(vm);
|
|
217
|
+
} else {
|
|
218
|
+
vm = await client.sandboxes.create(toSandboxRequest(options), {
|
|
219
|
+
wait: true
|
|
220
|
+
});
|
|
221
|
+
}
|
|
200
222
|
sandboxModes.set(vm.id, "persistent");
|
|
201
223
|
return {
|
|
202
224
|
sandbox: {
|
|
@@ -571,6 +593,45 @@ var _provider = defineProvider({
|
|
|
571
593
|
}
|
|
572
594
|
},
|
|
573
595
|
getInstance: (sandbox) => sandbox
|
|
596
|
+
},
|
|
597
|
+
// Archil has no separate snapshot resource: a "snapshot" is a sandbox
|
|
598
|
+
// fork (an isolated writable branch of the source sandbox's state), so
|
|
599
|
+
// snapshot ids are ordinary sandbox ids that create() forks again.
|
|
600
|
+
snapshot: {
|
|
601
|
+
create: async (config, sandboxId, options) => {
|
|
602
|
+
const resolved = resolveConfig(config);
|
|
603
|
+
const client = createClient(config, resolved);
|
|
604
|
+
try {
|
|
605
|
+
const fork = await forkSandboxVm(client, sandboxId, options?.name);
|
|
606
|
+
return {
|
|
607
|
+
id: fork.id,
|
|
608
|
+
provider: "archil",
|
|
609
|
+
createdAt: fork.createdAt ?? /* @__PURE__ */ new Date(),
|
|
610
|
+
metadata: { name: fork.name }
|
|
611
|
+
};
|
|
612
|
+
} catch (error) {
|
|
613
|
+
throw new Error(
|
|
614
|
+
`Failed to create Archil snapshot: ${error instanceof Error ? error.message : String(error)}`
|
|
615
|
+
);
|
|
616
|
+
}
|
|
617
|
+
},
|
|
618
|
+
list: async (_config) => {
|
|
619
|
+
throw new Error(
|
|
620
|
+
"Archil provider does not support listing snapshots."
|
|
621
|
+
);
|
|
622
|
+
},
|
|
623
|
+
delete: async (config, snapshotId) => {
|
|
624
|
+
const resolved = resolveConfig(config);
|
|
625
|
+
const client = createClient(config, resolved);
|
|
626
|
+
let vm;
|
|
627
|
+
try {
|
|
628
|
+
vm = await client.sandboxes.get(snapshotId);
|
|
629
|
+
} catch (error) {
|
|
630
|
+
if (error instanceof ArchilError && error.status === 404) return;
|
|
631
|
+
throw error;
|
|
632
|
+
}
|
|
633
|
+
await vm.delete();
|
|
634
|
+
}
|
|
574
635
|
}
|
|
575
636
|
}
|
|
576
637
|
});
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["/**\n * Archil Provider\n *\n * Supports Archil's two compute surfaces, selected by `execution`:\n *\n * - \"exec\" (default): each command runs in an Archil-managed ephemeral\n * container with the configured disk mounted, then returns stdout, stderr,\n * and exit code. \"create\" resolves a handle to an existing disk id; env,\n * cwd, and installs do not persist between commands.\n * - \"persistent\": `create` provisions an Archil sandbox — a persistent Linux\n * VM with a dedicated disk. `runCommand` uses the sandbox's interactive\n * process API (a short-lived WebSocket connection fetched fresh per command\n * via POST /api/sandboxes/{id}/connections), so filesystem state, installed\n * tools, and background processes persist across commands.\n */\n\nimport { defineProvider } from '@computesdk/provider';\nimport { Archil as ArchilClient } from 'disk';\nimport type {\n CreateSandboxRequest as ArchilSandboxRequest,\n Sandbox as ArchilVm,\n} from 'disk';\nimport { randomUUID } from 'node:crypto';\nimport { posix } from 'node:path';\nimport type {\n CommandResult,\n SandboxInfo,\n CreateSandboxOptions,\n FileEntry,\n RunCommandOptions,\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 * - \"exec\": serverless per-command containers on a disk (default).\n * - \"persistent\": a persistent sandbox VM run through the process API.\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. Defaults to \"exec\". In\n * \"persistent\" mode create() provisions a persistent sandbox VM instead of\n * resolving a disk handle. Per-sandbox override: `ephemeral` on\n * create() options (true -> exec handle, false -> 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}\n\ninterface ArchilCreateOptions extends CreateSandboxOptions {\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: config.execution ?? 'exec' };\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 const diskId = options?.diskId;\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\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 const envEntries = Object.entries(options?.env ?? {});\n if (!envEntries.some(([key]) => key === 'HOME')) {\n envEntries.unshift(['HOME', process.env.HOME || '/tmp']);\n }\n const envPrefix = envEntries\n .map(([k, v]) => `${k}=${shellEscape(String(v))}`)\n .join(' ');\n wrapped = `${envPrefix} ${wrapped}`;\n\n if (options?.cwd) {\n wrapped = `cd ${shellEscape(options.cwd)} && ${wrapped}`;\n }\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\nfunction wrapSandboxCommand(command: string, options?: RunCommandOptions): string {\n let wrapped = command;\n if (options?.cwd) {\n wrapped = `cd ${shellEscape(options.cwd)} && ${wrapped}`;\n }\n if (options?.background) {\n wrapped = `nohup sh -c ${shellEscape(wrapped)} > /dev/null 2>&1 &`;\n }\n return wrapped;\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 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 // CreateSandboxOptions.timeout is milliseconds; Archil's TTL is seconds.\n request.maxTtlSeconds = Math.ceil(options.timeout / 1000);\n }\n return request;\n}\n\n// Records each sandbox's effective execution mode so `destroy` — which only\n// receives an id — deletes persistent VMs even when the mode came from a\n// per-sandbox `ephemeral` override rather than the provider config.\nconst sandboxModes = new Map<string, ArchilExecutionMode>();\n\nconst _provider = defineProvider<ArchilSandbox, ArchilConfig>({\n name: 'archil',\n methods: {\n sandbox: {\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 default for this\n // sandbox: true -> serverless 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 (execution === 'persistent') {\n const vm = await client.sandboxes.create(toSandboxRequest(options), {\n wait: true,\n });\n sandboxModes.set(vm.id, 'persistent');\n return {\n sandbox: {\n client,\n disk: { id: vm.id },\n vm,\n resolved,\n createdAt: new Date(),\n },\n sandboxId: vm.id,\n };\n }\n\n const diskId = resolveCreateDiskId(options);\n sandboxModes.set(diskId, 'exec');\n return {\n sandbox: {\n client,\n disk: { id: diskId },\n resolved,\n createdAt: new Date(),\n },\n sandboxId: diskId,\n };\n },\n\n getById: async (config: ArchilConfig, sandboxId: string) => {\n const resolved = resolveConfig(config);\n const client = createClient(config, resolved);\n try {\n if (resolved.execution === 'persistent') {\n const vm = await client.sandboxes.get(sandboxId);\n await ensureVmRunning(vm);\n return {\n sandbox: {\n client,\n disk: { id: vm.id },\n vm,\n resolved,\n createdAt: new Date(),\n },\n sandboxId: vm.id,\n };\n }\n const disk = await client.disks.get(sandboxId);\n return {\n sandbox: { client, disk, resolved, createdAt: new Date() },\n sandboxId: disk.id,\n };\n } catch {\n return null;\n }\n },\n\n list: async (config: ArchilConfig) => {\n const resolved = resolveConfig(config);\n const client = createClient(config, resolved);\n if (resolved.execution === 'persistent') {\n const vms = await client.sandboxes.list();\n return vms.map((vm) => ({\n sandbox: {\n client,\n disk: { id: vm.id },\n vm,\n resolved,\n createdAt: new Date(),\n },\n sandboxId: vm.id,\n }));\n }\n const disks = await client.disks.list();\n return disks.map((disk) => ({\n sandbox: { client, disk, resolved, createdAt: new Date() },\n sandboxId: disk.id,\n }));\n },\n\n destroy: async (config: ArchilConfig, sandboxId: string) => {\n const resolved = resolveConfig(config);\n const mode = sandboxModes.get(sandboxId) ?? resolved.execution;\n if (mode === 'persistent') {\n const client = createClient(config, resolved);\n const vm = await client.sandboxes.get(sandboxId);\n await vm.delete();\n }\n // exec handles are disk references — Archil disks have an independent\n // lifecycle, so destroying them is a no-op. Unknown ids fall back to\n // the configured mode.\n sandboxModes.delete(sandboxId);\n },\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 // The process API fetches a fresh short-lived WebSocket\n // connection URL per process start, so expiry is handled by the\n // underlying client.\n await ensureVmRunning(sandbox.vm);\n const wrapped = wrapSandboxCommand(command, options);\n if (options?.background) {\n const proc = await sandbox.vm.processes.start(wrapped, {\n env: options?.env,\n });\n await proc.disconnect();\n return {\n stdout: '',\n stderr: '',\n exitCode: 0,\n durationMs: Date.now() - startTime,\n };\n }\n const result = await sandbox.vm.exec(wrapped, {\n env: options?.env,\n timeoutSeconds:\n options?.timeout !== undefined\n ? Math.ceil(options.timeout / 1000)\n : undefined,\n });\n return {\n stdout: result.stdout,\n stderr: result.stderr,\n exitCode:\n result.exitCode ?? (result.status === 'completed' ? 0 : 1),\n durationMs: Date.now() - startTime,\n };\n }\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 {\n stdout: '',\n stderr: error instanceof Error ? error.message : String(error),\n exitCode: 1,\n durationMs: Date.now() - startTime,\n };\n }\n },\n\n getInfo: async (sandbox: ArchilSandbox): Promise<SandboxInfo> => {\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 getInstance: (sandbox: ArchilSandbox): ArchilSandbox => sandbox,\n },\n },\n});\n\nexport const archil = (config: ArchilConfig = {}) => _provider(config);\n\nexport type { ArchilSandbox };\n"],"mappings":"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","names":["result","chunks"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["/**\n * Archil Provider\n *\n * Supports Archil's two compute surfaces, selected by `execution`:\n *\n * - \"exec\" (default): each command runs in an Archil-managed ephemeral\n * container with the configured disk mounted, then returns stdout, stderr,\n * and exit code. \"create\" resolves a handle to an existing disk id; env,\n * cwd, and installs do not persist between commands.\n * - \"persistent\": `create` provisions an Archil sandbox — a persistent Linux\n * VM with a dedicated disk. `runCommand` uses the sandbox's interactive\n * process API (a short-lived WebSocket connection fetched fresh per command\n * via POST /api/sandboxes/{id}/connections), so filesystem state, installed\n * tools, and background processes persist across commands.\n */\n\nimport { defineProvider } from '@computesdk/provider';\nimport { Archil as ArchilClient, ArchilError } from 'disk';\nimport type {\n CreateSandboxRequest as ArchilSandboxRequest,\n Sandbox as ArchilVm,\n} from 'disk';\nimport { randomUUID } from 'node:crypto';\nimport { posix } from 'node:path';\nimport type {\n CommandResult,\n SandboxInfo,\n CreateSandboxOptions,\n FileEntry,\n RunCommandOptions,\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 * - \"exec\": serverless per-command containers on a disk (default).\n * - \"persistent\": a persistent sandbox VM run through the process API.\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. Defaults to \"exec\". In\n * \"persistent\" mode create() provisions a persistent sandbox VM instead of\n * resolving a disk handle. Per-sandbox override: `ephemeral` on\n * create() options (true -> exec handle, false -> 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}\n\ninterface ArchilCreateOptions extends CreateSandboxOptions {\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: config.execution ?? 'exec' };\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\nasync function forkSandboxVm(\n client: ArchilClient,\n sourceId: string,\n name?: string,\n): Promise<ArchilVm> {\n const source = await client.sandboxes.get(sourceId);\n return source.fork({ name });\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 const envEntries = Object.entries(options?.env ?? {});\n if (!envEntries.some(([key]) => key === 'HOME')) {\n envEntries.unshift(['HOME', process.env.HOME || '/tmp']);\n }\n const envPrefix = envEntries\n .map(([k, v]) => `${k}=${shellEscape(String(v))}`)\n .join(' ');\n wrapped = `${envPrefix} ${wrapped}`;\n\n if (options?.cwd) {\n wrapped = `cd ${shellEscape(options.cwd)} && ${wrapped}`;\n }\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\nfunction wrapSandboxCommand(command: string, options?: RunCommandOptions): string {\n let wrapped = command;\n if (options?.cwd) {\n wrapped = `cd ${shellEscape(options.cwd)} && ${wrapped}`;\n }\n if (options?.background) {\n wrapped = `nohup sh -c ${shellEscape(wrapped)} > /dev/null 2>&1 &`;\n }\n return wrapped;\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 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 // CreateSandboxOptions.timeout is milliseconds; Archil's TTL is seconds.\n request.maxTtlSeconds = Math.ceil(options.timeout / 1000);\n }\n return request;\n}\n\n// Records each sandbox's effective execution mode so `destroy` — which only\n// receives an id — deletes persistent VMs even when the mode came from a\n// per-sandbox `ephemeral` override rather than the provider config.\nconst sandboxModes = new Map<string, ArchilExecutionMode>();\n\nconst _provider = defineProvider<ArchilSandbox, ArchilConfig>({\n name: 'archil',\n methods: {\n sandbox: {\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 default for this\n // sandbox: true -> serverless 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 && options?.ephemeral === true) {\n throw new Error(\n 'Archil cannot combine ephemeral: true with snapshotId — snapshots fork persistent VMs. Drop ephemeral or set it to false.',\n );\n }\n\n // snapshotId forks a new VM from that snapshot's state — Archil\n // models snapshots as isolated writable branches of a source\n // sandbox — so it always takes the VM path regardless of the\n // configured execution mode.\n if (execution === 'persistent' || options?.snapshotId) {\n let vm: ArchilVm;\n if (options?.snapshotId) {\n vm = await forkSandboxVm(client, options.snapshotId, 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 sandboxModes.set(vm.id, 'persistent');\n return {\n sandbox: {\n client,\n disk: { id: vm.id },\n vm,\n resolved,\n createdAt: new Date(),\n },\n sandboxId: vm.id,\n };\n }\n\n const diskId = resolveCreateDiskId(options);\n sandboxModes.set(diskId, 'exec');\n return {\n sandbox: {\n client,\n disk: { id: diskId },\n resolved,\n createdAt: new Date(),\n },\n sandboxId: diskId,\n };\n },\n\n getById: async (config: ArchilConfig, sandboxId: string) => {\n const resolved = resolveConfig(config);\n const client = createClient(config, resolved);\n try {\n if (resolved.execution === 'persistent') {\n const vm = await client.sandboxes.get(sandboxId);\n await ensureVmRunning(vm);\n return {\n sandbox: {\n client,\n disk: { id: vm.id },\n vm,\n resolved,\n createdAt: new Date(),\n },\n sandboxId: vm.id,\n };\n }\n const disk = await client.disks.get(sandboxId);\n return {\n sandbox: { client, disk, resolved, createdAt: new Date() },\n sandboxId: disk.id,\n };\n } catch {\n return null;\n }\n },\n\n list: async (config: ArchilConfig) => {\n const resolved = resolveConfig(config);\n const client = createClient(config, resolved);\n if (resolved.execution === 'persistent') {\n const vms = await client.sandboxes.list();\n return vms.map((vm) => ({\n sandbox: {\n client,\n disk: { id: vm.id },\n vm,\n resolved,\n createdAt: new Date(),\n },\n sandboxId: vm.id,\n }));\n }\n const disks = await client.disks.list();\n return disks.map((disk) => ({\n sandbox: { client, disk, resolved, createdAt: new Date() },\n sandboxId: disk.id,\n }));\n },\n\n destroy: async (config: ArchilConfig, sandboxId: string) => {\n const resolved = resolveConfig(config);\n const mode = sandboxModes.get(sandboxId) ?? resolved.execution;\n if (mode === 'persistent') {\n const client = createClient(config, resolved);\n const vm = await client.sandboxes.get(sandboxId);\n await vm.delete();\n }\n // exec handles are disk references — Archil disks have an independent\n // lifecycle, so destroying them is a no-op. Unknown ids fall back to\n // the configured mode.\n sandboxModes.delete(sandboxId);\n },\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 // The process API fetches a fresh short-lived WebSocket\n // connection URL per process start, so expiry is handled by the\n // underlying client.\n await ensureVmRunning(sandbox.vm);\n const wrapped = wrapSandboxCommand(command, options);\n if (options?.background) {\n const proc = await sandbox.vm.processes.start(wrapped, {\n env: options?.env,\n });\n await proc.disconnect();\n return {\n stdout: '',\n stderr: '',\n exitCode: 0,\n durationMs: Date.now() - startTime,\n };\n }\n const result = await sandbox.vm.exec(wrapped, {\n env: options?.env,\n timeoutSeconds:\n options?.timeout !== undefined\n ? Math.ceil(options.timeout / 1000)\n : undefined,\n });\n return {\n stdout: result.stdout,\n stderr: result.stderr,\n exitCode:\n result.exitCode ?? (result.status === 'completed' ? 0 : 1),\n durationMs: Date.now() - startTime,\n };\n }\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 {\n stdout: '',\n stderr: error instanceof Error ? error.message : String(error),\n exitCode: 1,\n durationMs: Date.now() - startTime,\n };\n }\n },\n\n getInfo: async (sandbox: ArchilSandbox): Promise<SandboxInfo> => {\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 getInstance: (sandbox: ArchilSandbox): ArchilSandbox => sandbox,\n },\n\n // Archil has no separate snapshot resource: a \"snapshot\" is a sandbox\n // fork (an isolated writable branch of the source sandbox's state), so\n // snapshot ids are ordinary sandbox ids that create() forks again.\n snapshot: {\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 try {\n const fork = await forkSandboxVm(client, sandboxId, options?.name);\n return {\n id: fork.id,\n provider: 'archil',\n createdAt: fork.createdAt ?? new Date(),\n metadata: { name: fork.name },\n };\n } catch (error) {\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 throw new Error(\n 'Archil provider does not support listing snapshots.',\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 vm.delete();\n },\n },\n },\n});\n\nexport const archil = (config: ArchilConfig = {}) => _provider(config);\n\nexport type { ArchilSandbox };\n"],"mappings":"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","names":["result","chunks"]}
|