@computesdk/archil 0.4.19 → 0.4.21
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/README.md +5 -5
- package/dist/index.js +13 -13
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +13 -13
- package/dist/index.mjs.map +1 -1
- package/package.json +4 -4
package/README.md
CHANGED
|
@@ -49,9 +49,9 @@ const result = await provider.sandbox.runCommand(sandbox, 'echo hello > /mnt/not
|
|
|
49
49
|
console.log(result.stdout); // "hello"
|
|
50
50
|
|
|
51
51
|
// Look up later by disk id:
|
|
52
|
-
const byId = await provider.sandbox.getById(sandbox.
|
|
52
|
+
const byId = await provider.sandbox.getById(sandbox.instanceId);
|
|
53
53
|
|
|
54
|
-
await provider.sandbox.destroy(sandbox.
|
|
54
|
+
await provider.sandbox.destroy(sandbox.instanceId);
|
|
55
55
|
```
|
|
56
56
|
|
|
57
57
|
`create()` requires top-level `diskId` as the target disk id.
|
|
@@ -76,12 +76,12 @@ await sandbox.runCommand('npm ci', { cwd: '/repo' });
|
|
|
76
76
|
await sandbox.runCommand('npm test', { cwd: '/repo' });
|
|
77
77
|
|
|
78
78
|
// Paused sandboxes are resumed automatically on getById/runCommand.
|
|
79
|
-
const resumed = await provider.sandbox.getById(sandbox.
|
|
79
|
+
const resumed = await provider.sandbox.getById(sandbox.instanceId);
|
|
80
80
|
|
|
81
|
-
await provider.sandbox.destroy(sandbox.
|
|
81
|
+
await provider.sandbox.destroy(sandbox.instanceId); // deletes the sandbox
|
|
82
82
|
```
|
|
83
83
|
|
|
84
|
-
Sandbox `create` accepts generic `
|
|
84
|
+
Sandbox `create` accepts generic `CreateInstanceOptions` fields (`vcpus`/`cpu`/`cpus`,
|
|
85
85
|
`memory`/`memoryMiB`, `image`/`templateId`, `envs`, `timeout` (ms → `maxTtlSeconds`))
|
|
86
86
|
plus the Archil-specific keys shown above.
|
|
87
87
|
|
package/dist/index.js
CHANGED
|
@@ -223,7 +223,7 @@ var sandboxModes = /* @__PURE__ */ new Map();
|
|
|
223
223
|
var _provider = (0, import_provider.defineProvider)({
|
|
224
224
|
name: "archil",
|
|
225
225
|
methods: {
|
|
226
|
-
|
|
226
|
+
instances: {
|
|
227
227
|
create: async (config, options) => {
|
|
228
228
|
const resolved = resolveConfig(config);
|
|
229
229
|
const client = createClient(config, resolved);
|
|
@@ -252,26 +252,26 @@ var _provider = (0, import_provider.defineProvider)({
|
|
|
252
252
|
}
|
|
253
253
|
sandboxModes.set(vm.id, "persistent");
|
|
254
254
|
return {
|
|
255
|
-
|
|
255
|
+
instance: {
|
|
256
256
|
client,
|
|
257
257
|
disk: { id: vm.id },
|
|
258
258
|
vm,
|
|
259
259
|
resolved,
|
|
260
260
|
createdAt: /* @__PURE__ */ new Date()
|
|
261
261
|
},
|
|
262
|
-
|
|
262
|
+
instanceId: vm.id
|
|
263
263
|
};
|
|
264
264
|
}
|
|
265
265
|
const diskId = resolveCreateDiskId(options);
|
|
266
266
|
sandboxModes.set(diskId, "exec");
|
|
267
267
|
return {
|
|
268
|
-
|
|
268
|
+
instance: {
|
|
269
269
|
client,
|
|
270
270
|
disk: { id: diskId },
|
|
271
271
|
resolved,
|
|
272
272
|
createdAt: /* @__PURE__ */ new Date()
|
|
273
273
|
},
|
|
274
|
-
|
|
274
|
+
instanceId: diskId
|
|
275
275
|
};
|
|
276
276
|
},
|
|
277
277
|
getById: async (config, sandboxId) => {
|
|
@@ -282,20 +282,20 @@ var _provider = (0, import_provider.defineProvider)({
|
|
|
282
282
|
const vm = await client.sandboxes.get(sandboxId);
|
|
283
283
|
await ensureVmRunning(vm);
|
|
284
284
|
return {
|
|
285
|
-
|
|
285
|
+
instance: {
|
|
286
286
|
client,
|
|
287
287
|
disk: { id: vm.id },
|
|
288
288
|
vm,
|
|
289
289
|
resolved,
|
|
290
290
|
createdAt: /* @__PURE__ */ new Date()
|
|
291
291
|
},
|
|
292
|
-
|
|
292
|
+
instanceId: vm.id
|
|
293
293
|
};
|
|
294
294
|
}
|
|
295
295
|
const disk = await client.disks.get(sandboxId);
|
|
296
296
|
return {
|
|
297
|
-
|
|
298
|
-
|
|
297
|
+
instance: { client, disk, resolved, createdAt: /* @__PURE__ */ new Date() },
|
|
298
|
+
instanceId: disk.id
|
|
299
299
|
};
|
|
300
300
|
} catch {
|
|
301
301
|
return null;
|
|
@@ -307,20 +307,20 @@ var _provider = (0, import_provider.defineProvider)({
|
|
|
307
307
|
if (resolved.execution === "persistent") {
|
|
308
308
|
const vms = await client.sandboxes.list();
|
|
309
309
|
return vms.map((vm) => ({
|
|
310
|
-
|
|
310
|
+
instance: {
|
|
311
311
|
client,
|
|
312
312
|
disk: { id: vm.id },
|
|
313
313
|
vm,
|
|
314
314
|
resolved,
|
|
315
315
|
createdAt: /* @__PURE__ */ new Date()
|
|
316
316
|
},
|
|
317
|
-
|
|
317
|
+
instanceId: vm.id
|
|
318
318
|
}));
|
|
319
319
|
}
|
|
320
320
|
const disks = await client.disks.list();
|
|
321
321
|
return disks.map((disk) => ({
|
|
322
|
-
|
|
323
|
-
|
|
322
|
+
instance: { client, disk, resolved, createdAt: /* @__PURE__ */ new Date() },
|
|
323
|
+
instanceId: disk.id
|
|
324
324
|
}));
|
|
325
325
|
},
|
|
326
326
|
destroy: async (config, sandboxId) => {
|
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, 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\n// Archil rejects deleting a live sandbox, so stop it first.\nasync function stopAndDeleteVm(vm: ArchilVm): Promise<void> {\n if (vm.status === 'deleting' || vm.status === 'deleted') return;\n if (vm.status !== 'stopped' && vm.status !== 'exited' && vm.status !== 'failed') {\n await vm.stop();\n }\n await vm.delete();\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 stopAndDeleteVm(vm);\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 stopAndDeleteVm(vm);\n },\n },\n },\n});\n\nexport const archil = (config: ArchilConfig = {}) => _provider(config);\n\nexport type { ArchilSandbox };\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAgBA,sBAA+B;AAC/B,kBAAoD;AAKpD,yBAA2B;AAC3B,uBAAsB;AAStB,IAAM,oBAAoB;AAC1B,IAAM,gCAAgC;AAGtC,IAAM,8BAA8B,IAAI,OAAO;AAG/C,IAAM,gBAAwC;AAAA,EAC5C,mBAAmB;AACrB;AAEA,SAAS,gBAAgB,QAAwB;AAC/C,QAAM,OAAO,OAAO,QAAQ,GAAG;AAC/B,MAAI,QAAQ,KAAK,SAAS,OAAO,SAAS,GAAG;AAC3C,UAAM,IAAI;AAAA,MACR,0BAA0B,MAAM;AAAA,IAClC;AAAA,EACF;AACA,QAAM,QAAQ,OAAO,MAAM,GAAG,IAAI;AAClC,QAAM,SAAS,OAAO,MAAM,OAAO,CAAC;AACpC,QAAM,QAAQ,cAAc,MAAM,KAAK;AACvC,SAAO,mBAAmB,KAAK,IAAI,MAAM,IAAI,KAAK;AACpD;AAoFA,SAAS,cAAc,QAAsC;AAC3D,QAAM,SAAS,OAAO,UAAU,QAAQ,IAAI;AAC5C,QAAM,SAAS,OAAO,UAAU,QAAQ,IAAI;AAE5C,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI;AAAA,MACR;AAAA,IAGF;AAAA,EACF;AAEA,MAAI,UAAU,OAAO;AACrB,MAAI,CAAC,SAAS;AACZ,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI;AAAA,QACR;AAAA,MAIF;AAAA,IACF;AACA,cAAU,gBAAgB,MAAM;AAAA,EAClC;AAEA,SAAO,EAAE,QAAQ,SAAS,WAAW,OAAO,aAAa,OAAO;AAClE;AAEA,SAAS,aAAa,QAAsB,UAAwC;AAClF,QAAM,SAAS,OAAO,UAAU,QAAQ,IAAI,iBAAiB;AAC7D,SAAO,IAAI,YAAAA,OAAa,EAAE,GAAG,UAAU,OAAO,CAAC;AACjD;AAEA,SAAS,oBAAoB,SAAuC;AAGlE,QAAM,SAAS,SAAS,UAAU,SAAS;AAE3C,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI;AAAA,MACR;AAAA,IAGF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,eAAe,cACb,QACA,UACA,MACmB;AACnB,QAAM,SAAS,MAAM,OAAO,UAAU,IAAI,QAAQ;AAClD,SAAO,OAAO,KAAK,EAAE,KAAK,CAAC;AAC7B;AAEA,SAAS,YAAY,OAAuB;AAC1C,SAAO,IAAI,MAAM,QAAQ,MAAM,OAAO,CAAC;AACzC;AAEA,SAAS,kBAAkB,SAAwB,MAAsB;AACvE,QAAM,aAAa,uBAAM,UAAU,KAAK,WAAW,GAAG,IAAI,OAAO,IAAI,IAAI,EAAE;AAG3E,MAAI,QAAQ,IAAI;AACd,WAAO;AAAA,EACT;AAEA,MAAI,eAAe,KAAK;AACtB,WAAO;AAAA,EACT;AAEA,MACE,eAAe,qBACf,WAAW,WAAW,GAAG,iBAAiB,GAAG,GAC7C;AACA,WAAO;AAAA,EACT;AAEA,SAAO,GAAG,iBAAiB,GAAG,UAAU;AAC1C;AAEA,SAAS,yBAAyB,SAAyB;AACzD,QAAM,YAAY,YAAY,iBAAiB;AAC/C,SAAO;AAAA,IACL,iCAAiC,SAAS;AAAA,IAC1C,KAAK,OAAO,+BAA+B,SAAS;AAAA,EAEtD,EAAE,KAAK,MAAM;AACf;AAEA,SAAS,kBAAkB,SAAwB,SAAyB;AAE1E,MAAI,QAAQ,GAAI,QAAO;AACvB,SAAO,yBAAyB,OAAO;AACzC;AAEA,SAAS,iBAAiB,SAAyB;AACjD,SAAO,OAAO,WAAW,YAAY,OAAO,GAAG,MAAM;AACvD;AAEA,SAAS,uBACP,QACA,UACA,UACA,cACA,SACA,SACQ;AACR,QAAM,eACJ,aAAa,YAAY,YAAY,CAAC,gBACnC,UAAU,MAAM,IAAI,IAAI,YAAY,QAAQ,CAAC;AAClD,SAAO;AAAA,IACL,GAAI,UAAU,CAAC,YAAY,YAAY,MAAM,CAAC,EAAE,IAAI,CAAC;AAAA,IACrD;AAAA,IACA,GAAI,UACA,CAAC,0BAA0B,UAAU,QAAQ,CAAC,IAC9C,CAAC;AAAA,EACP,EAAE,KAAK,MAAM;AACf;AAEA,SAAS,0BAA0B,UAAkB,UAA0B;AAC7E,QAAM,oBAAoB,YAAY,QAAQ;AAC9C,SAAO;AAAA,IACL,WAAW,iBAAiB;AAAA,IAC5B,kBAAkB,YAAY,mCAAmC,QAAQ,EAAE,CAAC;AAAA,IAC5E;AAAA,IACA;AAAA,IACA,MAAM,YAAY,QAAQ,CAAC,IAAI,iBAAiB;AAAA,EAClD,EAAE,KAAK,GAAG;AACZ;AAEA,SAAS,kBACP,QACA,UACA,UACQ;AACR,MAAI,MAAM;AACV,MAAI,OAAO;AAEX,SAAO,MAAM,MAAM;AACjB,UAAM,YAAY,KAAK,MAAM,MAAM,QAAQ,CAAC;AAC5C,UAAM,UAAU;AAAA,MACd;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA,IAAI,OAAO,SAAS;AAAA,QACpB;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,QAAI,iBAAiB,OAAO,KAAK,+BAA+B;AAC9D,YAAM;AAAA,IACR,OAAO;AACL,aAAO,YAAY;AAAA,IACrB;AAAA,EACF;AAEA,QAAM,YAAY,MAAO,MAAM;AAC/B,MAAI,YAAY,GAAG;AACjB,UAAM,IAAI;AAAA,MACR,0DAA0D,6BAA6B;AAAA,IACzF;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,YAAY,SAAiB,SAAqC;AACzE,MAAI,UAAU;AAEd,QAAM,aAAa,OAAO,QAAQ,SAAS,OAAO,CAAC,CAAC;AACpD,MAAI,CAAC,WAAW,KAAK,CAAC,CAAC,GAAG,MAAM,QAAQ,MAAM,GAAG;AAC/C,eAAW,QAAQ,CAAC,QAAQ,QAAQ,IAAI,QAAQ,MAAM,CAAC;AAAA,EACzD;AACA,QAAM,YAAY,WACf,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,YAAY,OAAO,CAAC,CAAC,CAAC,EAAE,EAChD,KAAK,GAAG;AACX,YAAU,GAAG,SAAS,IAAI,OAAO;AAEjC,MAAI,SAAS,KAAK;AAChB,cAAU,MAAM,YAAY,QAAQ,GAAG,CAAC,OAAO,OAAO;AAAA,EACxD;AAEA,MAAI,SAAS,YAAY;AACvB,cAAU,eAAe,YAAY,OAAO,CAAC;AAAA,EAC/C;AAEA,SAAO;AACT;AAEA,eAAe,WAAW,SAAwB,SAAwC;AACxF,SAAO,QAAQ,OAAO,MAAM,KAAK,QAAQ,KAAK,IAAI,OAAO;AAC3D;AAEA,SAAS,mBAAmB,SAAiB,SAAqC;AAChF,MAAI,UAAU;AACd,MAAI,SAAS,KAAK;AAChB,cAAU,MAAM,YAAY,QAAQ,GAAG,CAAC,OAAO,OAAO;AAAA,EACxD;AACA,MAAI,SAAS,YAAY;AACvB,cAAU,eAAe,YAAY,OAAO,CAAC;AAAA,EAC/C;AACA,SAAO;AACT;AAEA,eAAe,gBAAgB,IAA6B;AAG1D,QAAM,GAAG,QAAQ;AACjB,MAAI,GAAG,WAAW,UAAW;AAC7B,MAAI,GAAG,WAAW,UAAU;AAC1B,UAAM,GAAG,OAAO;AAAA,EAClB,WAAW,GAAG,WAAW,aAAa,GAAG,WAAW,UAAU;AAC5D,UAAM,GAAG,MAAM;AAAA,EACjB;AACF;AAGA,eAAe,gBAAgB,IAA6B;AAC1D,MAAI,GAAG,WAAW,cAAc,GAAG,WAAW,UAAW;AACzD,MAAI,GAAG,WAAW,aAAa,GAAG,WAAW,YAAY,GAAG,WAAW,UAAU;AAC/E,UAAM,GAAG,KAAK;AAAA,EAChB;AACA,QAAM,GAAG,OAAO;AAClB;AAEA,SAAS,iBAAiB,SAAqD;AAC7E,QAAM,UAAgC;AAAA,IACpC,GAAG,SAAS;AAAA,IACZ,MAAM,SAAS;AAAA,IACf,WAAW,SAAS,aAAa,SAAS,SAAS,SAAS;AAAA,IAC5D,KAAK,SAAS,OAAO,SAAS;AAAA,IAC9B,WAAW,SAAS,SAAS,SAAS,OAAO,SAAS;AAAA,IACtD,YAAY,SAAS,aAAa,SAAS;AAAA,EAC7C;AACA,MAAI,SAAS,kBAAkB,QAAW;AACxC,YAAQ,gBAAgB,QAAQ;AAAA,EAClC,WAAW,SAAS,YAAY,QAAW;AAEzC,YAAQ,gBAAgB,KAAK,KAAK,QAAQ,UAAU,GAAI;AAAA,EAC1D;AACA,SAAO;AACT;AAKA,IAAM,eAAe,oBAAI,IAAiC;AAE1D,IAAM,gBAAY,gCAA4C;AAAA,EAC5D,MAAM;AAAA,EACN,SAAS;AAAA,IACP,SAAS;AAAA,MACP,QAAQ,OAAO,QAAsB,YAAkC;AACrE,cAAM,WAAW,cAAc,MAAM;AACrC,cAAM,SAAS,aAAa,QAAQ,QAAQ;AAI5C,cAAM,YACJ,SAAS,cAAc,SACnB,QAAQ,YACN,SACA,eACF,SAAS;AAEf,YAAI,SAAS,cAAc,SAAS,cAAc,MAAM;AACtD,gBAAM,IAAI;AAAA,YACR;AAAA,UACF;AAAA,QACF;AAMA,YAAI,cAAc,gBAAgB,SAAS,YAAY;AACrD,cAAI;AACJ,cAAI,SAAS,YAAY;AACvB,iBAAK,MAAM,cAAc,QAAQ,QAAQ,YAAY,SAAS,IAAI;AAAA,UACpE,WAAW,SAAS,WAAW;AAI7B,gBAAI,SAAS,QAAQ;AACnB,oBAAM,IAAI;AAAA,gBACR;AAAA,cACF;AAAA,YACF;AACA,iBAAK,MAAM,OAAO,UAAU,IAAI,QAAQ,SAAS;AACjD,kBAAM,gBAAgB,EAAE;AAAA,UAC1B,OAAO;AACL,iBAAK,MAAM,OAAO,UAAU,OAAO,iBAAiB,OAAO,GAAG;AAAA,cAC5D,MAAM;AAAA,YACR,CAAC;AAAA,UACH;AACA,uBAAa,IAAI,GAAG,IAAI,YAAY;AACpC,iBAAO;AAAA,YACL,SAAS;AAAA,cACP;AAAA,cACA,MAAM,EAAE,IAAI,GAAG,GAAG;AAAA,cAClB;AAAA,cACA;AAAA,cACA,WAAW,oBAAI,KAAK;AAAA,YACtB;AAAA,YACA,WAAW,GAAG;AAAA,UAChB;AAAA,QACF;AAEA,cAAM,SAAS,oBAAoB,OAAO;AAC1C,qBAAa,IAAI,QAAQ,MAAM;AAC/B,eAAO;AAAA,UACL,SAAS;AAAA,YACP;AAAA,YACA,MAAM,EAAE,IAAI,OAAO;AAAA,YACnB;AAAA,YACA,WAAW,oBAAI,KAAK;AAAA,UACtB;AAAA,UACA,WAAW;AAAA,QACb;AAAA,MACF;AAAA,MAEA,SAAS,OAAO,QAAsB,cAAsB;AAC1D,cAAM,WAAW,cAAc,MAAM;AACrC,cAAM,SAAS,aAAa,QAAQ,QAAQ;AAC5C,YAAI;AACF,cAAI,SAAS,cAAc,cAAc;AACvC,kBAAM,KAAK,MAAM,OAAO,UAAU,IAAI,SAAS;AAC/C,kBAAM,gBAAgB,EAAE;AACxB,mBAAO;AAAA,cACL,SAAS;AAAA,gBACP;AAAA,gBACA,MAAM,EAAE,IAAI,GAAG,GAAG;AAAA,gBAClB;AAAA,gBACA;AAAA,gBACA,WAAW,oBAAI,KAAK;AAAA,cACtB;AAAA,cACA,WAAW,GAAG;AAAA,YAChB;AAAA,UACF;AACA,gBAAM,OAAO,MAAM,OAAO,MAAM,IAAI,SAAS;AAC7C,iBAAO;AAAA,YACL,SAAS,EAAE,QAAQ,MAAM,UAAU,WAAW,oBAAI,KAAK,EAAE;AAAA,YACzD,WAAW,KAAK;AAAA,UAClB;AAAA,QACF,QAAQ;AACN,iBAAO;AAAA,QACT;AAAA,MACF;AAAA,MAEA,MAAM,OAAO,WAAyB;AACpC,cAAM,WAAW,cAAc,MAAM;AACrC,cAAM,SAAS,aAAa,QAAQ,QAAQ;AAC5C,YAAI,SAAS,cAAc,cAAc;AACvC,gBAAM,MAAM,MAAM,OAAO,UAAU,KAAK;AACxC,iBAAO,IAAI,IAAI,CAAC,QAAQ;AAAA,YACtB,SAAS;AAAA,cACP;AAAA,cACA,MAAM,EAAE,IAAI,GAAG,GAAG;AAAA,cAClB;AAAA,cACA;AAAA,cACA,WAAW,oBAAI,KAAK;AAAA,YACtB;AAAA,YACA,WAAW,GAAG;AAAA,UAChB,EAAE;AAAA,QACJ;AACA,cAAM,QAAQ,MAAM,OAAO,MAAM,KAAK;AACtC,eAAO,MAAM,IAAI,CAAC,UAAU;AAAA,UAC1B,SAAS,EAAE,QAAQ,MAAM,UAAU,WAAW,oBAAI,KAAK,EAAE;AAAA,UACzD,WAAW,KAAK;AAAA,QAClB,EAAE;AAAA,MACJ;AAAA,MAEA,SAAS,OAAO,QAAsB,cAAsB;AAC1D,cAAM,WAAW,cAAc,MAAM;AACrC,cAAM,OAAO,aAAa,IAAI,SAAS,KAAK,SAAS;AACrD,YAAI,SAAS,cAAc;AACzB,gBAAM,SAAS,aAAa,QAAQ,QAAQ;AAC5C,gBAAM,KAAK,MAAM,OAAO,UAAU,IAAI,SAAS;AAC/C,gBAAM,gBAAgB,EAAE;AAAA,QAC1B;AAIA,qBAAa,OAAO,SAAS;AAAA,MAC/B;AAAA,MAGA,YAAY,OACV,SACA,SACA,YAC2B;AAC3B,cAAM,YAAY,KAAK,IAAI;AAC3B,YAAI;AACF,cAAI,QAAQ,IAAI;AAId,kBAAM,gBAAgB,QAAQ,EAAE;AAChC,kBAAM,UAAU,mBAAmB,SAAS,OAAO;AACnD,gBAAI,SAAS,YAAY;AACvB,oBAAM,OAAO,MAAM,QAAQ,GAAG,UAAU,MAAM,SAAS;AAAA,gBACrD,KAAK,SAAS;AAAA,cAChB,CAAC;AACD,oBAAM,KAAK,WAAW;AACtB,qBAAO;AAAA,gBACL,QAAQ;AAAA,gBACR,QAAQ;AAAA,gBACR,UAAU;AAAA,gBACV,YAAY,KAAK,IAAI,IAAI;AAAA,cAC3B;AAAA,YACF;AACA,kBAAMC,UAAS,MAAM,QAAQ,GAAG,KAAK,SAAS;AAAA,cAC5C,KAAK,SAAS;AAAA,cACd,gBACE,SAAS,YAAY,SACjB,KAAK,KAAK,QAAQ,UAAU,GAAI,IAChC;AAAA,YACR,CAAC;AACD,mBAAO;AAAA,cACL,QAAQA,QAAO;AAAA,cACf,QAAQA,QAAO;AAAA,cACf,UACEA,QAAO,aAAaA,QAAO,WAAW,cAAc,IAAI;AAAA,cAC1D,YAAY,KAAK,IAAI,IAAI;AAAA,YAC3B;AAAA,UACF;AAEA,gBAAM,SAAS,MAAM,WAAW,SAAS,YAAY,SAAS,OAAO,CAAC;AACtE,iBAAO;AAAA,YACL,QAAQ,OAAO,UAAU;AAAA,YACzB,QAAQ,OAAO,UAAU;AAAA,YACzB,UAAU,OAAO;AAAA,YACjB,YAAY,KAAK,IAAI,IAAI;AAAA,UAC3B;AAAA,QACF,SAAS,OAAO;AACd,iBAAO;AAAA,YACL,QAAQ;AAAA,YACR,QAAQ,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,YAC7D,UAAU;AAAA,YACV,YAAY,KAAK,IAAI,IAAI;AAAA,UAC3B;AAAA,QACF;AAAA,MACF;AAAA,MAEA,SAAS,OAAO,YAAiD;AAC/D,YAAI,QAAQ,IAAI;AACd,gBAAM,KAAK,QAAQ;AACnB,iBAAO;AAAA,YACL,IAAI,GAAG;AAAA,YACP,UAAU;AAAA,YACV,QACE,GAAG,WAAW,YACV,YACA,GAAG,WAAW,WACZ,UACA;AAAA,YACR,WAAW,GAAG;AAAA,YACd,SAAS,GAAG,gBAAgB;AAAA,YAC5B,UAAU;AAAA,cACR,MAAM,GAAG;AAAA,cACT,cAAc,GAAG;AAAA,cACjB,WAAW,GAAG;AAAA,cACd,YAAY,GAAG;AAAA,cACf,WAAW,GAAG;AAAA,cACd,UAAU,GAAG;AAAA,YACf;AAAA,UACF;AAAA,QACF;AACA,cAAM,WAAW,YAAY,QAAQ,OAAO,QAAQ,OAAO;AAC3D,eAAO;AAAA,UACL,IAAI,QAAQ,KAAK;AAAA,UACjB,UAAU;AAAA,UACV,QAAQ,CAAC,YAAY,SAAS,WAAW,UAAU,YAAY;AAAA,UAC/D,WAAW,WAAW,IAAI,KAAK,SAAS,SAAS,IAAI,QAAQ;AAAA,UAC7D,SAAS;AAAA,UACT,UAAU,WACN;AAAA,YACE,MAAM,SAAS;AAAA,YACf,cAAc,SAAS;AAAA,YACvB,QAAQ,SAAS;AAAA,YACjB,UAAU,SAAS;AAAA,UACrB,IACA,CAAC;AAAA,QACP;AAAA,MACF;AAAA,MAEA,QAAQ,OACN,SACA,YACoB;AACpB,YAAI,QAAQ,IAAI;AACd,gBAAM,QAAQ,GAAG,QAAQ;AACzB,gBAAM,WAAW,QAAQ,GAAG,WAAW;AAAA,YACrC,CAAC,MAAM,EAAE,SAAS,QAAQ;AAAA,UAC5B;AACA,cAAI,CAAC,UAAU;AACb,kBAAM,IAAI;AAAA,cACR,+BAA+B,QAAQ,IAAI,uBAAuB,QAAQ,GAAG,EAAE;AAAA,YACjF;AAAA,UACF;AACA,iBAAO,GAAG,QAAQ,YAAY,OAAO,MAAM,SAAS,QAAQ;AAAA,QAC9D;AACA,cAAM,IAAI;AAAA,UACR,sJACsD,QAAQ,IAAI;AAAA,QAEpE;AAAA,MACF;AAAA,MAEA,YAAY;AAAA,QACV,UAAU,OAAO,SAAS,MAAM,eAAe;AAC7C,cAAI,QAAQ,IAAI;AACd,kBAAMC,UAAmB,CAAC;AAC1B,gBAAI;AACF,oBAAM,QAAQ,GAAG,MAAM,aAAa,MAAM,CAAC,UAAU;AACnD,gBAAAA,QAAO,KAAK,OAAO,KAAK,KAAK,CAAC;AAAA,cAChC,CAAC;AAAA,YACH,SAAS,OAAO;AACd,oBAAM,IAAI;AAAA,gBACR,kBAAkB,IAAI,KACpB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CACvD;AAAA,cACF;AAAA,YACF;AACA,mBAAO,OAAO,OAAOA,OAAM,EAAE,SAAS,MAAM;AAAA,UAC9C;AACA,gBAAM,WAAW,kBAAkB,SAAS,IAAI;AAChD,gBAAM,aAAa,MAAM;AAAA,YACvB;AAAA,YACA,WAAW,YAAY,QAAQ,CAAC;AAAA,UAClC;AACA,cAAI,WAAW,aAAa,GAAG;AAC7B,kBAAM,IAAI,MAAM,kBAAkB,IAAI,KAAK,WAAW,MAAM,EAAE;AAAA,UAChE;AAEA,gBAAM,WAAW,WAAW,OAAO,KAAK;AACxC,cAAI,CAAC,QAAQ,KAAK,QAAQ,GAAG;AAC3B,kBAAM,IAAI;AAAA,cACR,kBAAkB,IAAI;AAAA,YACxB;AAAA,UACF;AAEA,gBAAM,OAAO,OAAO,QAAQ;AAC5B,cAAI,CAAC,OAAO,cAAc,IAAI,GAAG;AAC/B,kBAAM,IAAI;AAAA,cACR,kBAAkB,IAAI;AAAA,YACxB;AAAA,UACF;AACA,cAAI,SAAS,EAAG,QAAO;AAEvB,gBAAM,SAAmB,CAAC;AAC1B,mBACM,SAAS,GACb,SAAS,MACT,UAAU,6BACV;AACA,kBAAM,gBAAgB,KAAK;AAAA,cACzB;AAAA,cACA,OAAO;AAAA,YACT;AACA,kBAAM,SAAS,MAAM;AAAA,cACnB;AAAA,cACA,SAAS,YAAY,QAAQ,CAAC,cAAc,MAAM,UAAU,aAAa;AAAA,YAC3E;AACA,gBAAI,OAAO,aAAa,GAAG;AACzB,oBAAM,IAAI,MAAM,kBAAkB,IAAI,KAAK,OAAO,MAAM,EAAE;AAAA,YAC5D;AAEA,kBAAM,UAAU,OAAO,OAAO,QAAQ,OAAO,EAAE;AAC/C,gBACE,QAAQ,WAAW,KACnB,QAAQ,SAAS,MAAM,KACvB,CAAC,yBAAyB,KAAK,OAAO,GACtC;AACA,oBAAM,IAAI;AAAA,gBACR,kBAAkB,IAAI,sDAAsD,MAAM;AAAA,cACpF;AAAA,YACF;AAEA,kBAAM,QAAQ,OAAO,KAAK,SAAS,QAAQ;AAC3C,gBAAI,MAAM,WAAW,eAAe;AAClC,oBAAM,IAAI;AAAA,gBACR,kBAAkB,IAAI,sDAAsD,MAAM;AAAA,cACpF;AAAA,YACF;AACA,mBAAO,KAAK,KAAK;AAAA,UACnB;AAEA,iBAAO,OAAO,OAAO,MAAM,EAAE,SAAS,MAAM;AAAA,QAC9C;AAAA,QAEA,WAAW,OAAO,SAAS,MAAM,SAAS,eAAe;AACvD,cAAI,QAAQ,IAAI;AACd,gBAAI;AACF,oBAAM,QAAQ,GAAG,MAAM;AAAA,gBACrB,OAAO,KAAK,SAAS,MAAM;AAAA,gBAC3B;AAAA,cACF;AAAA,YACF,SAAS,OAAO;AACd,oBAAM,IAAI;AAAA,gBACR,mBAAmB,IAAI,KACrB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CACvD;AAAA,cACF;AAAA,YACF;AACA;AAAA,UACF;AACA,gBAAM,WAAW,kBAAkB,SAAS,IAAI;AAChD,gBAAM,SAAS,uBAAM,QAAQ,QAAQ;AACrC,gBAAM,UAAU,OAAO,KAAK,SAAS,MAAM,EAAE,SAAS,QAAQ;AAC9D,gBAAM,WAAW,GAAG,QAAQ,yBAAqB,+BAAW,CAAC;AAC7D,cAAI,UAAU;AAEd,cAAI;AACF,gBAAI,QAAQ,WAAW,GAAG;AACxB,wBAAU;AACV,oBAAM,SAAS,MAAM;AAAA,gBACnB;AAAA,gBACA;AAAA,kBACE;AAAA,kBACA;AAAA,oBACE,YAAY,YAAY,MAAM,CAAC;AAAA,oBAC/B,OAAO,YAAY,QAAQ,CAAC;AAAA,oBAC5B,0BAA0B,UAAU,QAAQ;AAAA,kBAC9C,EAAE,KAAK,MAAM;AAAA,gBACf;AAAA,cACF;AACA,kBAAI,OAAO,aAAa,GAAG;AACzB,sBAAM,IAAI,MAAM,OAAO,MAAM;AAAA,cAC/B;AACA;AAAA,YACF;AAEA,kBAAM,YAAY,kBAAkB,QAAQ,UAAU,QAAQ;AAC9D,qBAAS,SAAS,GAAG,SAAS,QAAQ,QAAQ,UAAU,WAAW;AACjE,oBAAM,UAAU,WAAW;AAC3B,oBAAM,UAAU,SAAS,aAAa,QAAQ;AAC9C,wBAAU;AACV,oBAAM,SAAS,MAAM;AAAA,gBACnB;AAAA,gBACA;AAAA,kBACE;AAAA,kBACA;AAAA,oBACE;AAAA,oBACA;AAAA,oBACA;AAAA,oBACA,QAAQ,MAAM,QAAQ,SAAS,SAAS;AAAA,oBACxC;AAAA,oBACA;AAAA,kBACF;AAAA,gBACF;AAAA,cACF;AACA,kBAAI,OAAO,aAAa,GAAG;AACzB,sBAAM,IAAI,MAAM,OAAO,MAAM;AAAA,cAC/B;AAAA,YACF;AAAA,UACF,SAAS,OAAO;AACd,gBAAI,SAAS;AACX,kBAAI;AACF,sBAAM;AAAA,kBACJ;AAAA,kBACA,kBAAkB,SAAS,SAAS,YAAY,QAAQ,CAAC,EAAE;AAAA,gBAC7D;AAAA,cACF,QAAQ;AAAA,cAER;AAAA,YACF;AACA,kBAAM,IAAI;AAAA,cACR,mBAAmB,IAAI,KACrB,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CACvD;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,QAEA,OAAO,OAAO,SAAS,MAAM,eAAe;AAC1C,gBAAM,WAAW,kBAAkB,SAAS,IAAI;AAChD,gBAAM,SAAS,MAAM;AAAA,YACnB;AAAA,YACA,kBAAkB,SAAS,YAAY,YAAY,QAAQ,CAAC,EAAE;AAAA,UAChE;AACA,cAAI,OAAO,aAAa,GAAG;AACzB,kBAAM,IAAI,MAAM,8BAA8B,IAAI,KAAK,OAAO,MAAM,EAAE;AAAA,UACxE;AAAA,QACF;AAAA,QAEA,SAAS,OAAO,SAAS,MAAM,eAAe;AAC5C,gBAAM,WAAW,kBAAkB,SAAS,IAAI;AAEhD,gBAAM,SAAS,MAAM;AAAA,YACnB;AAAA,YACA,QAAQ,YAAY,QAAQ,CAAC;AAAA;AAAA,UAC/B;AACA,cAAI,OAAO,aAAa,GAAG;AACzB,kBAAM,IAAI,MAAM,4BAA4B,IAAI,KAAK,OAAO,MAAM,EAAE;AAAA,UACtE;AACA,gBAAM,UAAuB,CAAC;AAC9B,qBAAW,QAAQ,OAAO,OAAO,MAAM,IAAI,GAAG;AAC5C,gBAAI,CAAC,KAAM;AACX,kBAAM,CAAC,UAAU,SAAS,UAAU,GAAG,SAAS,IAAI,KAAK,MAAM,GAAI;AACnE,kBAAM,OAAO,UAAU,KAAK,GAAI;AAChC,oBAAQ,KAAK;AAAA,cACX;AAAA,cACA,MAAM,aAAa,MAAM,cAAc;AAAA,cACvC,MAAM,SAAS,SAAS,EAAE,KAAK;AAAA,cAC/B,UAAU,IAAI,KAAK,WAAW,QAAQ,IAAI,GAAI;AAAA,YAChD,CAAC;AAAA,UACH;AACA,iBAAO;AAAA,QACT;AAAA,QAEA,QAAQ,OAAO,SAAS,MAAM,eAAe;AAC3C,gBAAM,WAAW,kBAAkB,SAAS,IAAI;AAChD,gBAAM,SAAS,MAAM,WAAW,SAAS,WAAW,YAAY,QAAQ,CAAC,EAAE;AAC3E,iBAAO,OAAO,aAAa;AAAA,QAC7B;AAAA,QAEA,QAAQ,OAAO,SAAS,MAAM,eAAe;AAC3C,gBAAM,WAAW,kBAAkB,SAAS,IAAI;AAChD,cAAI,CAAC,QAAQ,MAAM,aAAa,mBAAmB;AACjD,kBAAM,IAAI,MAAM,gDAAgD;AAAA,UAClE;AACA,gBAAM,SAAS,MAAM;AAAA,YACnB;AAAA,YACA,kBAAkB,SAAS,UAAU,YAAY,QAAQ,CAAC,EAAE;AAAA,UAC9D;AACA,cAAI,OAAO,aAAa,GAAG;AACzB,kBAAM,IAAI,MAAM,oBAAoB,IAAI,KAAK,OAAO,MAAM,EAAE;AAAA,UAC9D;AAAA,QACF;AAAA,MACF;AAAA,MAEA,aAAa,CAAC,YAA0C;AAAA,IAC1D;AAAA;AAAA;AAAA;AAAA,IAKA,UAAU;AAAA,MACR,QAAQ,OACN,QACA,WACA,YACG;AACH,cAAM,WAAW,cAAc,MAAM;AACrC,cAAM,SAAS,aAAa,QAAQ,QAAQ;AAC5C,YAAI;AACF,gBAAM,OAAO,MAAM,cAAc,QAAQ,WAAW,SAAS,IAAI;AACjE,iBAAO;AAAA,YACL,IAAI,KAAK;AAAA,YACT,UAAU;AAAA,YACV,WAAW,KAAK,aAAa,oBAAI,KAAK;AAAA,YACtC,UAAU,EAAE,MAAM,KAAK,KAAK;AAAA,UAC9B;AAAA,QACF,SAAS,OAAO;AACd,gBAAM,IAAI;AAAA,YACR,qCACE,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CACvD;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,MAEA,MAAM,OAAO,YAA0B;AACrC,cAAM,IAAI;AAAA,UACR;AAAA,QACF;AAAA,MACF;AAAA,MAEA,QAAQ,OAAO,QAAsB,eAAuB;AAC1D,cAAM,WAAW,cAAc,MAAM;AACrC,cAAM,SAAS,aAAa,QAAQ,QAAQ;AAC5C,YAAI;AACJ,YAAI;AACF,eAAK,MAAM,OAAO,UAAU,IAAI,UAAU;AAAA,QAC5C,SAAS,OAAO;AACd,cAAI,iBAAiB,2BAAe,MAAM,WAAW,IAAK;AAC1D,gBAAM;AAAA,QACR;AACA,cAAM,gBAAgB,EAAE;AAAA,MAC1B;AAAA,IACF;AAAA,EACF;AACF,CAAC;AAEM,IAAM,SAAS,CAAC,SAAuB,CAAC,MAAM,UAAU,MAAM;","names":["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 InstanceInfo,\n CreateInstanceOptions,\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 CreateInstanceOptions {\n /**\n * exec mode: id of the existing disk to run commands against. Required in\n * \"exec\" mode; ignored in \"persistent\" mode.\n */\n diskId?: string;\n /** persistent mode: OCI base image (e.g. \"node:24-bookworm\"). */\n baseImage?: string;\n /** persistent mode: environment variables baked into the sandbox. */\n env?: Record<string, string>;\n /** persistent mode: lifetime budget per powered-on session, in seconds. */\n maxTtlSeconds?: number;\n /** persistent mode: extra Archil sandbox fields (network policy, etc.). */\n sandbox?: Omit<\n ArchilSandboxRequest,\n 'name' | 'vcpuCount' | 'memSizeMiB' | 'baseImage' | 'env' | 'maxTtlSeconds'\n >;\n}\n\nfunction resolveConfig(config: ArchilConfig): ResolvedConfig {\n const apiKey = config.apiKey ?? process.env.ARCHIL_API_KEY;\n const region = config.region ?? process.env.ARCHIL_REGION;\n\n if (!apiKey) {\n throw new Error(\n 'Missing API key for Archil.\\n\\n' +\n 'Pass it: archil({ apiKey: \"...\" })\\n' +\n 'Or set ARCHIL_API_KEY in your environment.',\n );\n }\n\n let baseUrl = config.baseUrl;\n if (!baseUrl) {\n if (!region) {\n throw new Error(\n 'Missing region for Archil.\\n\\n' +\n 'Pass it: archil({ region: \"...\" })\\n' +\n 'Or set ARCHIL_REGION in your environment.\\n' +\n 'Examples: \"aws-us-east-1\", \"aws-eu-west-1\", \"gcp-us-central1\".',\n );\n }\n baseUrl = regionToBaseUrl(region);\n }\n\n return { apiKey, baseUrl, execution: 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\n// Archil rejects deleting a live sandbox, so stop it first.\nasync function stopAndDeleteVm(vm: ArchilVm): Promise<void> {\n if (vm.status === 'deleting' || vm.status === 'deleted') return;\n if (vm.status !== 'stopped' && vm.status !== 'exited' && vm.status !== 'failed') {\n await vm.stop();\n }\n await vm.delete();\n}\n\nfunction toSandboxRequest(options?: ArchilCreateOptions): ArchilSandboxRequest {\n const request: ArchilSandboxRequest = {\n ...options?.sandbox,\n name: options?.name,\n baseImage: options?.baseImage ?? options?.image ?? options?.templateId,\n env: options?.env ?? options?.envs,\n vcpuCount: options?.vcpus ?? options?.cpu ?? options?.cpus,\n memSizeMiB: options?.memoryMiB ?? options?.memory,\n };\n if (options?.maxTtlSeconds !== undefined) {\n request.maxTtlSeconds = options.maxTtlSeconds;\n } else if (options?.timeout !== undefined) {\n // CreateInstanceOptions.timeout is milliseconds; Archil's TTL is seconds.\n request.maxTtlSeconds = Math.ceil(options.timeout / 1000);\n }\n return request;\n}\n\n// 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 instances: {\n create: async (config: ArchilConfig, options?: ArchilCreateOptions) => {\n const resolved = resolveConfig(config);\n const client = createClient(config, resolved);\n\n // `ephemeral` on create() overrides the configured 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 { instance: {\n client,\n disk: { id: vm.id },\n vm,\n resolved,\n createdAt: new Date(),\n }, instanceId: vm.id,\n };\n }\n\n const diskId = resolveCreateDiskId(options);\n sandboxModes.set(diskId, 'exec');\n return { instance: {\n client,\n disk: { id: diskId },\n resolved,\n createdAt: new Date(),\n }, instanceId: 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 { instance: {\n client,\n disk: { id: vm.id },\n vm,\n resolved,\n createdAt: new Date(),\n }, instanceId: vm.id,\n };\n }\n const disk = await client.disks.get(sandboxId);\n return { instance: { client, disk, resolved, createdAt: new Date() }, instanceId: 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) => ({ instance: {\n client,\n disk: { id: vm.id },\n vm,\n resolved,\n createdAt: new Date(),\n }, instanceId: vm.id,\n }));\n }\n const disks = await client.disks.list();\n return disks.map((disk) => ({ instance: { client, disk, resolved, createdAt: new Date() }, instanceId: 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 stopAndDeleteVm(vm);\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<InstanceInfo> => {\n if (sandbox.vm) {\n const vm = sandbox.vm;\n return {\n id: vm.id,\n provider: 'archil',\n status:\n vm.status === 'running'\n ? 'running'\n : vm.status === 'failed'\n ? 'error'\n : 'stopped',\n createdAt: vm.createdAt,\n timeout: vm.maxTtlSeconds * 1000,\n metadata: {\n name: vm.name,\n archilStatus: vm.status,\n vcpuCount: vm.vcpuCount,\n memSizeMiB: vm.memSizeMiB,\n baseImage: vm.baseImage,\n platform: vm.platform,\n },\n };\n }\n const diskInfo = 'status' in sandbox.disk ? sandbox.disk : undefined;\n return {\n id: sandbox.disk.id,\n provider: 'archil',\n status: !diskInfo || diskInfo.status === 'ready' ? 'running' : 'stopped',\n createdAt: diskInfo ? new Date(diskInfo.createdAt) : sandbox.createdAt,\n timeout: 0,\n metadata: diskInfo\n ? {\n name: diskInfo.name,\n organization: diskInfo.organization,\n region: diskInfo.region,\n provider: diskInfo.provider,\n }\n : {},\n };\n },\n\n getUrl: async (\n sandbox: ArchilSandbox,\n options: { port: number; protocol?: string },\n ): Promise<string> => {\n if (sandbox.vm) {\n await sandbox.vm.refresh();\n const endpoint = sandbox.vm.endpoints?.find(\n (e) => e.port === options.port,\n );\n if (!endpoint) {\n throw new Error(\n `No endpoint exposed on port ${options.port} for Archil sandbox ${sandbox.vm.id}.`,\n );\n }\n return `${options.protocol ?? 'https'}://${endpoint.hostname}`;\n }\n throw new Error(\n `Archil exec runs each command in a fresh ephemeral container that exits when the command returns, ` +\n `so there is no long-lived process to expose port ${options.port} on. ` +\n `getUrl is not supported.`,\n );\n },\n\n filesystem: {\n readFile: async (sandbox, path, runCommand) => {\n if (sandbox.vm) {\n const chunks: Buffer[] = [];\n try {\n await sandbox.vm.files.downloadFile(path, (chunk) => {\n chunks.push(Buffer.from(chunk));\n });\n } catch (error) {\n throw new Error(\n `Failed to read ${path}: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n return Buffer.concat(chunks).toString('utf8');\n }\n const diskPath = mapFilesystemPath(sandbox, path);\n const sizeResult = await runCommand(\n sandbox,\n `wc -c < ${shellEscape(diskPath)}`,\n );\n if (sizeResult.exitCode !== 0) {\n throw new Error(`Failed to read ${path}: ${sizeResult.stderr}`);\n }\n\n const sizeText = sizeResult.stdout.trim();\n if (!/^\\d+$/.test(sizeText)) {\n throw new Error(\n `Failed to read ${path}: Archil returned an invalid file size.`,\n );\n }\n\n const size = Number(sizeText);\n if (!Number.isSafeInteger(size)) {\n throw new Error(\n `Failed to read ${path}: file size exceeds JavaScript's safe integer range.`,\n );\n }\n if (size === 0) return '';\n\n const chunks: Buffer[] = [];\n for (\n let offset = 0;\n offset < size;\n offset += ARCHIL_MAX_READ_CHUNK_BYTES\n ) {\n const expectedBytes = Math.min(\n ARCHIL_MAX_READ_CHUNK_BYTES,\n size - offset,\n );\n const result = await runCommand(\n sandbox,\n `dd if=${shellEscape(diskPath)} bs=1 skip=${offset} count=${expectedBytes} 2>/dev/null | base64`,\n );\n if (result.exitCode !== 0) {\n throw new Error(`Failed to read ${path}: ${result.stderr}`);\n }\n\n const encoded = result.stdout.replace(/\\s/g, '');\n if (\n encoded.length === 0 ||\n encoded.length % 4 !== 0 ||\n !/^[A-Za-z0-9+/]*={0,2}$/.test(encoded)\n ) {\n throw new Error(\n `Failed to read ${path}: Archil returned an incomplete file chunk at byte ${offset}.`,\n );\n }\n\n const chunk = Buffer.from(encoded, 'base64');\n if (chunk.length !== expectedBytes) {\n throw new Error(\n `Failed to read ${path}: Archil returned an incomplete file chunk at byte ${offset}.`,\n );\n }\n chunks.push(chunk);\n }\n\n return Buffer.concat(chunks).toString('utf8');\n },\n\n writeFile: async (sandbox, path, content, runCommand) => {\n if (sandbox.vm) {\n try {\n await sandbox.vm.files.uploadFile(\n Buffer.from(content, 'utf8'),\n path,\n );\n } catch (error) {\n throw new Error(\n `Failed to write ${path}: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n return;\n }\n const diskPath = mapFilesystemPath(sandbox, path);\n const parent = posix.dirname(diskPath);\n const encoded = Buffer.from(content, 'utf8').toString('base64');\n const tempPath = `${diskPath}.computesdk-write-${randomUUID()}`;\n let started = false;\n\n try {\n if (encoded.length === 0) {\n started = true;\n const result = await runCommand(\n sandbox,\n withDiskWriteLock(\n sandbox,\n [\n `mkdir -p ${shellEscape(parent)}`,\n `: > ${shellEscape(tempPath)}`,\n finalizeStagedFileCommand(tempPath, diskPath),\n ].join(' && '),\n ),\n );\n if (result.exitCode !== 0) {\n throw new Error(result.stderr);\n }\n return;\n }\n\n const chunkSize = maxWriteChunkSize(parent, tempPath, diskPath);\n for (let offset = 0; offset < encoded.length; offset += chunkSize) {\n const isFirst = offset === 0;\n const isFinal = offset + chunkSize >= encoded.length;\n started = true;\n const result = await runCommand(\n sandbox,\n withDiskWriteLock(\n sandbox,\n buildWriteChunkCommand(\n parent,\n tempPath,\n diskPath,\n encoded.slice(offset, offset + chunkSize),\n isFirst,\n isFinal,\n ),\n ),\n );\n if (result.exitCode !== 0) {\n throw new Error(result.stderr);\n }\n }\n } catch (error) {\n if (started) {\n try {\n await runCommand(\n sandbox,\n withDiskWriteLock(sandbox, `rm -f ${shellEscape(tempPath)}`),\n );\n } catch {\n // Preserve the original write error if cleanup fails.\n }\n }\n throw new Error(\n `Failed to write ${path}: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n },\n\n mkdir: async (sandbox, path, runCommand) => {\n const diskPath = mapFilesystemPath(sandbox, path);\n const result = await runCommand(\n sandbox,\n withDiskWriteLock(sandbox, `mkdir -p ${shellEscape(diskPath)}`),\n );\n if (result.exitCode !== 0) {\n throw new Error(`Failed to create directory ${path}: ${result.stderr}`);\n }\n },\n\n readdir: async (sandbox, path, runCommand) => {\n const diskPath = mapFilesystemPath(sandbox, path);\n // Tab-separated: type<TAB>size<TAB>mtime-iso<TAB>name. Robust to spaces in names.\n const result = await runCommand(\n sandbox,\n `find ${shellEscape(diskPath)} -mindepth 1 -maxdepth 1 -printf '%y\\t%s\\t%T@\\t%f\\n'`,\n );\n if (result.exitCode !== 0) {\n throw new Error(`Failed to list directory ${path}: ${result.stderr}`);\n }\n const entries: FileEntry[] = [];\n for (const line of result.stdout.split('\\n')) {\n if (!line) continue;\n const [typeChar, sizeStr, mtimeStr, ...nameParts] = line.split('\\t');\n const name = nameParts.join('\\t');\n entries.push({\n name,\n type: typeChar === 'd' ? 'directory' : 'file',\n size: parseInt(sizeStr, 10) || 0,\n modified: new Date(parseFloat(mtimeStr) * 1000),\n });\n }\n return entries;\n },\n\n exists: async (sandbox, path, runCommand) => {\n const diskPath = mapFilesystemPath(sandbox, path);\n const result = await runCommand(sandbox, `test -e ${shellEscape(diskPath)}`);\n return result.exitCode === 0;\n },\n\n remove: async (sandbox, path, runCommand) => {\n const diskPath = mapFilesystemPath(sandbox, path);\n if (!sandbox.vm && diskPath === ARCHIL_MOUNT_ROOT) {\n throw new Error('Refusing to remove the Archil disk mount root.');\n }\n const result = await runCommand(\n sandbox,\n withDiskWriteLock(sandbox, `rm -rf ${shellEscape(diskPath)}`),\n );\n if (result.exitCode !== 0) {\n throw new Error(`Failed to remove ${path}: ${result.stderr}`);\n }\n },\n },\n\n 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 stopAndDeleteVm(vm);\n },\n },\n },\n});\n\nexport const archil = (config: ArchilConfig = {}) => _provider(config);\n\nexport type { ArchilSandbox };\n"],"mappings":"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","names":["ArchilClient","result","chunks"]}
|
package/dist/index.mjs
CHANGED
|
@@ -199,7 +199,7 @@ var sandboxModes = /* @__PURE__ */ new Map();
|
|
|
199
199
|
var _provider = defineProvider({
|
|
200
200
|
name: "archil",
|
|
201
201
|
methods: {
|
|
202
|
-
|
|
202
|
+
instances: {
|
|
203
203
|
create: async (config, options) => {
|
|
204
204
|
const resolved = resolveConfig(config);
|
|
205
205
|
const client = createClient(config, resolved);
|
|
@@ -228,26 +228,26 @@ var _provider = defineProvider({
|
|
|
228
228
|
}
|
|
229
229
|
sandboxModes.set(vm.id, "persistent");
|
|
230
230
|
return {
|
|
231
|
-
|
|
231
|
+
instance: {
|
|
232
232
|
client,
|
|
233
233
|
disk: { id: vm.id },
|
|
234
234
|
vm,
|
|
235
235
|
resolved,
|
|
236
236
|
createdAt: /* @__PURE__ */ new Date()
|
|
237
237
|
},
|
|
238
|
-
|
|
238
|
+
instanceId: vm.id
|
|
239
239
|
};
|
|
240
240
|
}
|
|
241
241
|
const diskId = resolveCreateDiskId(options);
|
|
242
242
|
sandboxModes.set(diskId, "exec");
|
|
243
243
|
return {
|
|
244
|
-
|
|
244
|
+
instance: {
|
|
245
245
|
client,
|
|
246
246
|
disk: { id: diskId },
|
|
247
247
|
resolved,
|
|
248
248
|
createdAt: /* @__PURE__ */ new Date()
|
|
249
249
|
},
|
|
250
|
-
|
|
250
|
+
instanceId: diskId
|
|
251
251
|
};
|
|
252
252
|
},
|
|
253
253
|
getById: async (config, sandboxId) => {
|
|
@@ -258,20 +258,20 @@ var _provider = defineProvider({
|
|
|
258
258
|
const vm = await client.sandboxes.get(sandboxId);
|
|
259
259
|
await ensureVmRunning(vm);
|
|
260
260
|
return {
|
|
261
|
-
|
|
261
|
+
instance: {
|
|
262
262
|
client,
|
|
263
263
|
disk: { id: vm.id },
|
|
264
264
|
vm,
|
|
265
265
|
resolved,
|
|
266
266
|
createdAt: /* @__PURE__ */ new Date()
|
|
267
267
|
},
|
|
268
|
-
|
|
268
|
+
instanceId: vm.id
|
|
269
269
|
};
|
|
270
270
|
}
|
|
271
271
|
const disk = await client.disks.get(sandboxId);
|
|
272
272
|
return {
|
|
273
|
-
|
|
274
|
-
|
|
273
|
+
instance: { client, disk, resolved, createdAt: /* @__PURE__ */ new Date() },
|
|
274
|
+
instanceId: disk.id
|
|
275
275
|
};
|
|
276
276
|
} catch {
|
|
277
277
|
return null;
|
|
@@ -283,20 +283,20 @@ var _provider = defineProvider({
|
|
|
283
283
|
if (resolved.execution === "persistent") {
|
|
284
284
|
const vms = await client.sandboxes.list();
|
|
285
285
|
return vms.map((vm) => ({
|
|
286
|
-
|
|
286
|
+
instance: {
|
|
287
287
|
client,
|
|
288
288
|
disk: { id: vm.id },
|
|
289
289
|
vm,
|
|
290
290
|
resolved,
|
|
291
291
|
createdAt: /* @__PURE__ */ new Date()
|
|
292
292
|
},
|
|
293
|
-
|
|
293
|
+
instanceId: vm.id
|
|
294
294
|
}));
|
|
295
295
|
}
|
|
296
296
|
const disks = await client.disks.list();
|
|
297
297
|
return disks.map((disk) => ({
|
|
298
|
-
|
|
299
|
-
|
|
298
|
+
instance: { client, disk, resolved, createdAt: /* @__PURE__ */ new Date() },
|
|
299
|
+
instanceId: disk.id
|
|
300
300
|
}));
|
|
301
301
|
},
|
|
302
302
|
destroy: async (config, sandboxId) => {
|
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, 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\n// Archil rejects deleting a live sandbox, so stop it first.\nasync function stopAndDeleteVm(vm: ArchilVm): Promise<void> {\n if (vm.status === 'deleting' || vm.status === 'deleted') return;\n if (vm.status !== 'stopped' && vm.status !== 'exited' && vm.status !== 'failed') {\n await vm.stop();\n }\n await vm.delete();\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 stopAndDeleteVm(vm);\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 stopAndDeleteVm(vm);\n },\n },\n },\n});\n\nexport const archil = (config: ArchilConfig = {}) => _provider(config);\n\nexport type { ArchilSandbox };\n"],"mappings":"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","names":["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 InstanceInfo,\n CreateInstanceOptions,\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 CreateInstanceOptions {\n /**\n * exec mode: id of the existing disk to run commands against. Required in\n * \"exec\" mode; ignored in \"persistent\" mode.\n */\n diskId?: string;\n /** persistent mode: OCI base image (e.g. \"node:24-bookworm\"). */\n baseImage?: string;\n /** persistent mode: environment variables baked into the sandbox. */\n env?: Record<string, string>;\n /** persistent mode: lifetime budget per powered-on session, in seconds. */\n maxTtlSeconds?: number;\n /** persistent mode: extra Archil sandbox fields (network policy, etc.). */\n sandbox?: Omit<\n ArchilSandboxRequest,\n 'name' | 'vcpuCount' | 'memSizeMiB' | 'baseImage' | 'env' | 'maxTtlSeconds'\n >;\n}\n\nfunction resolveConfig(config: ArchilConfig): ResolvedConfig {\n const apiKey = config.apiKey ?? process.env.ARCHIL_API_KEY;\n const region = config.region ?? process.env.ARCHIL_REGION;\n\n if (!apiKey) {\n throw new Error(\n 'Missing API key for Archil.\\n\\n' +\n 'Pass it: archil({ apiKey: \"...\" })\\n' +\n 'Or set ARCHIL_API_KEY in your environment.',\n );\n }\n\n let baseUrl = config.baseUrl;\n if (!baseUrl) {\n if (!region) {\n throw new Error(\n 'Missing region for Archil.\\n\\n' +\n 'Pass it: archil({ region: \"...\" })\\n' +\n 'Or set ARCHIL_REGION in your environment.\\n' +\n 'Examples: \"aws-us-east-1\", \"aws-eu-west-1\", \"gcp-us-central1\".',\n );\n }\n baseUrl = regionToBaseUrl(region);\n }\n\n return { apiKey, baseUrl, execution: 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\n// Archil rejects deleting a live sandbox, so stop it first.\nasync function stopAndDeleteVm(vm: ArchilVm): Promise<void> {\n if (vm.status === 'deleting' || vm.status === 'deleted') return;\n if (vm.status !== 'stopped' && vm.status !== 'exited' && vm.status !== 'failed') {\n await vm.stop();\n }\n await vm.delete();\n}\n\nfunction toSandboxRequest(options?: ArchilCreateOptions): ArchilSandboxRequest {\n const request: ArchilSandboxRequest = {\n ...options?.sandbox,\n name: options?.name,\n baseImage: options?.baseImage ?? options?.image ?? options?.templateId,\n env: options?.env ?? options?.envs,\n vcpuCount: options?.vcpus ?? options?.cpu ?? options?.cpus,\n memSizeMiB: options?.memoryMiB ?? options?.memory,\n };\n if (options?.maxTtlSeconds !== undefined) {\n request.maxTtlSeconds = options.maxTtlSeconds;\n } else if (options?.timeout !== undefined) {\n // CreateInstanceOptions.timeout is milliseconds; Archil's TTL is seconds.\n request.maxTtlSeconds = Math.ceil(options.timeout / 1000);\n }\n return request;\n}\n\n// 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 instances: {\n create: async (config: ArchilConfig, options?: ArchilCreateOptions) => {\n const resolved = resolveConfig(config);\n const client = createClient(config, resolved);\n\n // `ephemeral` on create() overrides the configured 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 { instance: {\n client,\n disk: { id: vm.id },\n vm,\n resolved,\n createdAt: new Date(),\n }, instanceId: vm.id,\n };\n }\n\n const diskId = resolveCreateDiskId(options);\n sandboxModes.set(diskId, 'exec');\n return { instance: {\n client,\n disk: { id: diskId },\n resolved,\n createdAt: new Date(),\n }, instanceId: 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 { instance: {\n client,\n disk: { id: vm.id },\n vm,\n resolved,\n createdAt: new Date(),\n }, instanceId: vm.id,\n };\n }\n const disk = await client.disks.get(sandboxId);\n return { instance: { client, disk, resolved, createdAt: new Date() }, instanceId: 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) => ({ instance: {\n client,\n disk: { id: vm.id },\n vm,\n resolved,\n createdAt: new Date(),\n }, instanceId: vm.id,\n }));\n }\n const disks = await client.disks.list();\n return disks.map((disk) => ({ instance: { client, disk, resolved, createdAt: new Date() }, instanceId: 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 stopAndDeleteVm(vm);\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<InstanceInfo> => {\n if (sandbox.vm) {\n const vm = sandbox.vm;\n return {\n id: vm.id,\n provider: 'archil',\n status:\n vm.status === 'running'\n ? 'running'\n : vm.status === 'failed'\n ? 'error'\n : 'stopped',\n createdAt: vm.createdAt,\n timeout: vm.maxTtlSeconds * 1000,\n metadata: {\n name: vm.name,\n archilStatus: vm.status,\n vcpuCount: vm.vcpuCount,\n memSizeMiB: vm.memSizeMiB,\n baseImage: vm.baseImage,\n platform: vm.platform,\n },\n };\n }\n const diskInfo = 'status' in sandbox.disk ? sandbox.disk : undefined;\n return {\n id: sandbox.disk.id,\n provider: 'archil',\n status: !diskInfo || diskInfo.status === 'ready' ? 'running' : 'stopped',\n createdAt: diskInfo ? new Date(diskInfo.createdAt) : sandbox.createdAt,\n timeout: 0,\n metadata: diskInfo\n ? {\n name: diskInfo.name,\n organization: diskInfo.organization,\n region: diskInfo.region,\n provider: diskInfo.provider,\n }\n : {},\n };\n },\n\n getUrl: async (\n sandbox: ArchilSandbox,\n options: { port: number; protocol?: string },\n ): Promise<string> => {\n if (sandbox.vm) {\n await sandbox.vm.refresh();\n const endpoint = sandbox.vm.endpoints?.find(\n (e) => e.port === options.port,\n );\n if (!endpoint) {\n throw new Error(\n `No endpoint exposed on port ${options.port} for Archil sandbox ${sandbox.vm.id}.`,\n );\n }\n return `${options.protocol ?? 'https'}://${endpoint.hostname}`;\n }\n throw new Error(\n `Archil exec runs each command in a fresh ephemeral container that exits when the command returns, ` +\n `so there is no long-lived process to expose port ${options.port} on. ` +\n `getUrl is not supported.`,\n );\n },\n\n filesystem: {\n readFile: async (sandbox, path, runCommand) => {\n if (sandbox.vm) {\n const chunks: Buffer[] = [];\n try {\n await sandbox.vm.files.downloadFile(path, (chunk) => {\n chunks.push(Buffer.from(chunk));\n });\n } catch (error) {\n throw new Error(\n `Failed to read ${path}: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n return Buffer.concat(chunks).toString('utf8');\n }\n const diskPath = mapFilesystemPath(sandbox, path);\n const sizeResult = await runCommand(\n sandbox,\n `wc -c < ${shellEscape(diskPath)}`,\n );\n if (sizeResult.exitCode !== 0) {\n throw new Error(`Failed to read ${path}: ${sizeResult.stderr}`);\n }\n\n const sizeText = sizeResult.stdout.trim();\n if (!/^\\d+$/.test(sizeText)) {\n throw new Error(\n `Failed to read ${path}: Archil returned an invalid file size.`,\n );\n }\n\n const size = Number(sizeText);\n if (!Number.isSafeInteger(size)) {\n throw new Error(\n `Failed to read ${path}: file size exceeds JavaScript's safe integer range.`,\n );\n }\n if (size === 0) return '';\n\n const chunks: Buffer[] = [];\n for (\n let offset = 0;\n offset < size;\n offset += ARCHIL_MAX_READ_CHUNK_BYTES\n ) {\n const expectedBytes = Math.min(\n ARCHIL_MAX_READ_CHUNK_BYTES,\n size - offset,\n );\n const result = await runCommand(\n sandbox,\n `dd if=${shellEscape(diskPath)} bs=1 skip=${offset} count=${expectedBytes} 2>/dev/null | base64`,\n );\n if (result.exitCode !== 0) {\n throw new Error(`Failed to read ${path}: ${result.stderr}`);\n }\n\n const encoded = result.stdout.replace(/\\s/g, '');\n if (\n encoded.length === 0 ||\n encoded.length % 4 !== 0 ||\n !/^[A-Za-z0-9+/]*={0,2}$/.test(encoded)\n ) {\n throw new Error(\n `Failed to read ${path}: Archil returned an incomplete file chunk at byte ${offset}.`,\n );\n }\n\n const chunk = Buffer.from(encoded, 'base64');\n if (chunk.length !== expectedBytes) {\n throw new Error(\n `Failed to read ${path}: Archil returned an incomplete file chunk at byte ${offset}.`,\n );\n }\n chunks.push(chunk);\n }\n\n return Buffer.concat(chunks).toString('utf8');\n },\n\n writeFile: async (sandbox, path, content, runCommand) => {\n if (sandbox.vm) {\n try {\n await sandbox.vm.files.uploadFile(\n Buffer.from(content, 'utf8'),\n path,\n );\n } catch (error) {\n throw new Error(\n `Failed to write ${path}: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n return;\n }\n const diskPath = mapFilesystemPath(sandbox, path);\n const parent = posix.dirname(diskPath);\n const encoded = Buffer.from(content, 'utf8').toString('base64');\n const tempPath = `${diskPath}.computesdk-write-${randomUUID()}`;\n let started = false;\n\n try {\n if (encoded.length === 0) {\n started = true;\n const result = await runCommand(\n sandbox,\n withDiskWriteLock(\n sandbox,\n [\n `mkdir -p ${shellEscape(parent)}`,\n `: > ${shellEscape(tempPath)}`,\n finalizeStagedFileCommand(tempPath, diskPath),\n ].join(' && '),\n ),\n );\n if (result.exitCode !== 0) {\n throw new Error(result.stderr);\n }\n return;\n }\n\n const chunkSize = maxWriteChunkSize(parent, tempPath, diskPath);\n for (let offset = 0; offset < encoded.length; offset += chunkSize) {\n const isFirst = offset === 0;\n const isFinal = offset + chunkSize >= encoded.length;\n started = true;\n const result = await runCommand(\n sandbox,\n withDiskWriteLock(\n sandbox,\n buildWriteChunkCommand(\n parent,\n tempPath,\n diskPath,\n encoded.slice(offset, offset + chunkSize),\n isFirst,\n isFinal,\n ),\n ),\n );\n if (result.exitCode !== 0) {\n throw new Error(result.stderr);\n }\n }\n } catch (error) {\n if (started) {\n try {\n await runCommand(\n sandbox,\n withDiskWriteLock(sandbox, `rm -f ${shellEscape(tempPath)}`),\n );\n } catch {\n // Preserve the original write error if cleanup fails.\n }\n }\n throw new Error(\n `Failed to write ${path}: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n },\n\n mkdir: async (sandbox, path, runCommand) => {\n const diskPath = mapFilesystemPath(sandbox, path);\n const result = await runCommand(\n sandbox,\n withDiskWriteLock(sandbox, `mkdir -p ${shellEscape(diskPath)}`),\n );\n if (result.exitCode !== 0) {\n throw new Error(`Failed to create directory ${path}: ${result.stderr}`);\n }\n },\n\n readdir: async (sandbox, path, runCommand) => {\n const diskPath = mapFilesystemPath(sandbox, path);\n // Tab-separated: type<TAB>size<TAB>mtime-iso<TAB>name. Robust to spaces in names.\n const result = await runCommand(\n sandbox,\n `find ${shellEscape(diskPath)} -mindepth 1 -maxdepth 1 -printf '%y\\t%s\\t%T@\\t%f\\n'`,\n );\n if (result.exitCode !== 0) {\n throw new Error(`Failed to list directory ${path}: ${result.stderr}`);\n }\n const entries: FileEntry[] = [];\n for (const line of result.stdout.split('\\n')) {\n if (!line) continue;\n const [typeChar, sizeStr, mtimeStr, ...nameParts] = line.split('\\t');\n const name = nameParts.join('\\t');\n entries.push({\n name,\n type: typeChar === 'd' ? 'directory' : 'file',\n size: parseInt(sizeStr, 10) || 0,\n modified: new Date(parseFloat(mtimeStr) * 1000),\n });\n }\n return entries;\n },\n\n exists: async (sandbox, path, runCommand) => {\n const diskPath = mapFilesystemPath(sandbox, path);\n const result = await runCommand(sandbox, `test -e ${shellEscape(diskPath)}`);\n return result.exitCode === 0;\n },\n\n remove: async (sandbox, path, runCommand) => {\n const diskPath = mapFilesystemPath(sandbox, path);\n if (!sandbox.vm && diskPath === ARCHIL_MOUNT_ROOT) {\n throw new Error('Refusing to remove the Archil disk mount root.');\n }\n const result = await runCommand(\n sandbox,\n withDiskWriteLock(sandbox, `rm -rf ${shellEscape(diskPath)}`),\n );\n if (result.exitCode !== 0) {\n throw new Error(`Failed to remove ${path}: ${result.stderr}`);\n }\n },\n },\n\n 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 stopAndDeleteVm(vm);\n },\n },\n },\n});\n\nexport const archil = (config: ArchilConfig = {}) => _provider(config);\n\nexport type { ArchilSandbox };\n"],"mappings":"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","names":["result","chunks"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@computesdk/archil",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.21",
|
|
4
4
|
"description": "Archil provider for ComputeSDK - exec commands against an Archil disk",
|
|
5
5
|
"author": "ComputeSDK",
|
|
6
6
|
"license": "MIT",
|
|
@@ -19,8 +19,8 @@
|
|
|
19
19
|
],
|
|
20
20
|
"dependencies": {
|
|
21
21
|
"disk": "^1.1.2",
|
|
22
|
-
"computesdk": "4.1.
|
|
23
|
-
"@computesdk/provider": "2.1.
|
|
22
|
+
"computesdk": "4.1.12",
|
|
23
|
+
"@computesdk/provider": "2.1.14"
|
|
24
24
|
},
|
|
25
25
|
"devDependencies": {
|
|
26
26
|
"@types/node": "^20.0.0",
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
"tsup": "^8.0.0",
|
|
31
31
|
"typescript": "^5.0.0",
|
|
32
32
|
"vitest": "^1.0.0",
|
|
33
|
-
"@computesdk/test-utils": "2.0.
|
|
33
|
+
"@computesdk/test-utils": "2.0.4"
|
|
34
34
|
},
|
|
35
35
|
"keywords": [
|
|
36
36
|
"computesdk",
|