@computesdk/archil 0.4.18 → 0.4.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -196,6 +196,13 @@ async function ensureVmRunning(vm) {
196
196
  await vm.start();
197
197
  }
198
198
  }
199
+ async function stopAndDeleteVm(vm) {
200
+ if (vm.status === "deleting" || vm.status === "deleted") return;
201
+ if (vm.status !== "stopped" && vm.status !== "exited" && vm.status !== "failed") {
202
+ await vm.stop();
203
+ }
204
+ await vm.delete();
205
+ }
199
206
  function toSandboxRequest(options) {
200
207
  const request = {
201
208
  ...options?.sandbox,
@@ -216,7 +223,7 @@ var sandboxModes = /* @__PURE__ */ new Map();
216
223
  var _provider = (0, import_provider.defineProvider)({
217
224
  name: "archil",
218
225
  methods: {
219
- sandbox: {
226
+ instances: {
220
227
  create: async (config, options) => {
221
228
  const resolved = resolveConfig(config);
222
229
  const client = createClient(config, resolved);
@@ -245,26 +252,26 @@ var _provider = (0, import_provider.defineProvider)({
245
252
  }
246
253
  sandboxModes.set(vm.id, "persistent");
247
254
  return {
248
- sandbox: {
255
+ instance: {
249
256
  client,
250
257
  disk: { id: vm.id },
251
258
  vm,
252
259
  resolved,
253
260
  createdAt: /* @__PURE__ */ new Date()
254
261
  },
255
- sandboxId: vm.id
262
+ instanceId: vm.id
256
263
  };
257
264
  }
258
265
  const diskId = resolveCreateDiskId(options);
259
266
  sandboxModes.set(diskId, "exec");
260
267
  return {
261
- sandbox: {
268
+ instance: {
262
269
  client,
263
270
  disk: { id: diskId },
264
271
  resolved,
265
272
  createdAt: /* @__PURE__ */ new Date()
266
273
  },
267
- sandboxId: diskId
274
+ instanceId: diskId
268
275
  };
269
276
  },
270
277
  getById: async (config, sandboxId) => {
@@ -275,20 +282,20 @@ var _provider = (0, import_provider.defineProvider)({
275
282
  const vm = await client.sandboxes.get(sandboxId);
276
283
  await ensureVmRunning(vm);
277
284
  return {
278
- sandbox: {
285
+ instance: {
279
286
  client,
280
287
  disk: { id: vm.id },
281
288
  vm,
282
289
  resolved,
283
290
  createdAt: /* @__PURE__ */ new Date()
284
291
  },
285
- sandboxId: vm.id
292
+ instanceId: vm.id
286
293
  };
287
294
  }
288
295
  const disk = await client.disks.get(sandboxId);
289
296
  return {
290
- sandbox: { client, disk, resolved, createdAt: /* @__PURE__ */ new Date() },
291
- sandboxId: disk.id
297
+ instance: { client, disk, resolved, createdAt: /* @__PURE__ */ new Date() },
298
+ instanceId: disk.id
292
299
  };
293
300
  } catch {
294
301
  return null;
@@ -300,20 +307,20 @@ var _provider = (0, import_provider.defineProvider)({
300
307
  if (resolved.execution === "persistent") {
301
308
  const vms = await client.sandboxes.list();
302
309
  return vms.map((vm) => ({
303
- sandbox: {
310
+ instance: {
304
311
  client,
305
312
  disk: { id: vm.id },
306
313
  vm,
307
314
  resolved,
308
315
  createdAt: /* @__PURE__ */ new Date()
309
316
  },
310
- sandboxId: vm.id
317
+ instanceId: vm.id
311
318
  }));
312
319
  }
313
320
  const disks = await client.disks.list();
314
321
  return disks.map((disk) => ({
315
- sandbox: { client, disk, resolved, createdAt: /* @__PURE__ */ new Date() },
316
- sandboxId: disk.id
322
+ instance: { client, disk, resolved, createdAt: /* @__PURE__ */ new Date() },
323
+ instanceId: disk.id
317
324
  }));
318
325
  },
319
326
  destroy: async (config, sandboxId) => {
@@ -322,7 +329,7 @@ var _provider = (0, import_provider.defineProvider)({
322
329
  if (mode === "persistent") {
323
330
  const client = createClient(config, resolved);
324
331
  const vm = await client.sandboxes.get(sandboxId);
325
- await vm.delete();
332
+ await stopAndDeleteVm(vm);
326
333
  }
327
334
  sandboxModes.delete(sandboxId);
328
335
  },
@@ -654,7 +661,7 @@ var _provider = (0, import_provider.defineProvider)({
654
661
  if (error instanceof import_disk.ArchilError && error.status === 404) return;
655
662
  throw error;
656
663
  }
657
- await vm.delete();
664
+ await stopAndDeleteVm(vm);
658
665
  }
659
666
  }
660
667
  }
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\nfunction toSandboxRequest(options?: ArchilCreateOptions): ArchilSandboxRequest {\n const request: ArchilSandboxRequest = {\n ...options?.sandbox,\n name: options?.name,\n baseImage: options?.baseImage ?? options?.image ?? options?.templateId,\n env: options?.env ?? options?.envs,\n vcpuCount: options?.vcpus ?? options?.cpu ?? options?.cpus,\n memSizeMiB: options?.memoryMiB ?? options?.memory,\n };\n if (options?.maxTtlSeconds !== undefined) {\n request.maxTtlSeconds = options.maxTtlSeconds;\n } else if (options?.timeout !== undefined) {\n // CreateSandboxOptions.timeout is milliseconds; Archil's TTL is seconds.\n request.maxTtlSeconds = Math.ceil(options.timeout / 1000);\n }\n return request;\n}\n\n// Records each sandbox's effective execution mode so `destroy` — which only\n// receives an id — deletes persistent VMs even when the mode came from a\n// per-sandbox `ephemeral` override rather than the provider config.\nconst sandboxModes = new Map<string, ArchilExecutionMode>();\n\nconst _provider = defineProvider<ArchilSandbox, ArchilConfig>({\n name: 'archil',\n methods: {\n sandbox: {\n create: async (config: ArchilConfig, options?: ArchilCreateOptions) => {\n const resolved = resolveConfig(config);\n const client = createClient(config, resolved);\n\n // `ephemeral` on create() overrides the configured default for this\n // sandbox: true -> serverless exec handle, false -> persistent VM.\n const execution =\n options?.ephemeral !== undefined\n ? options.ephemeral\n ? 'exec'\n : 'persistent'\n : resolved.execution;\n\n if (options?.snapshotId && options?.ephemeral === true) {\n throw new Error(\n 'Archil cannot combine ephemeral: true with snapshotId — snapshots fork persistent VMs. Drop ephemeral or set it to false.',\n );\n }\n\n // snapshotId forks a new VM from that snapshot's state — Archil\n // models snapshots as isolated writable branches of a source\n // sandbox — so it always takes the VM path regardless of the\n // configured execution mode.\n if (execution === 'persistent' || options?.snapshotId) {\n let vm: ArchilVm;\n if (options?.snapshotId) {\n vm = await forkSandboxVm(client, options.snapshotId, options?.name);\n } else if (options?.sandboxId) {\n // Attach to a live sandbox. Refuse an abort signal here: the\n // sandbox manager destroys a resolved sandbox after an abort,\n // which would delete a sandbox this call did not create.\n if (options?.signal) {\n throw new Error(\n 'create({ sandboxId }) attaches to an existing sandbox and cannot be combined with an abort signal',\n );\n }\n vm = await client.sandboxes.get(options.sandboxId);\n await ensureVmRunning(vm);\n } else {\n vm = await client.sandboxes.create(toSandboxRequest(options), {\n wait: true,\n });\n }\n sandboxModes.set(vm.id, 'persistent');\n return {\n sandbox: {\n client,\n disk: { id: vm.id },\n vm,\n resolved,\n createdAt: new Date(),\n },\n sandboxId: vm.id,\n };\n }\n\n const diskId = resolveCreateDiskId(options);\n sandboxModes.set(diskId, 'exec');\n return {\n sandbox: {\n client,\n disk: { id: diskId },\n resolved,\n createdAt: new Date(),\n },\n sandboxId: diskId,\n };\n },\n\n getById: async (config: ArchilConfig, sandboxId: string) => {\n const resolved = resolveConfig(config);\n const client = createClient(config, resolved);\n try {\n if (resolved.execution === 'persistent') {\n const vm = await client.sandboxes.get(sandboxId);\n await ensureVmRunning(vm);\n return {\n sandbox: {\n client,\n disk: { id: vm.id },\n vm,\n resolved,\n createdAt: new Date(),\n },\n sandboxId: vm.id,\n };\n }\n const disk = await client.disks.get(sandboxId);\n return {\n sandbox: { client, disk, resolved, createdAt: new Date() },\n sandboxId: disk.id,\n };\n } catch {\n return null;\n }\n },\n\n list: async (config: ArchilConfig) => {\n const resolved = resolveConfig(config);\n const client = createClient(config, resolved);\n if (resolved.execution === 'persistent') {\n const vms = await client.sandboxes.list();\n return vms.map((vm) => ({\n sandbox: {\n client,\n disk: { id: vm.id },\n vm,\n resolved,\n createdAt: new Date(),\n },\n sandboxId: vm.id,\n }));\n }\n const disks = await client.disks.list();\n return disks.map((disk) => ({\n sandbox: { client, disk, resolved, createdAt: new Date() },\n sandboxId: disk.id,\n }));\n },\n\n destroy: async (config: ArchilConfig, sandboxId: string) => {\n const resolved = resolveConfig(config);\n const mode = sandboxModes.get(sandboxId) ?? resolved.execution;\n if (mode === 'persistent') {\n const client = createClient(config, resolved);\n const vm = await client.sandboxes.get(sandboxId);\n await vm.delete();\n }\n // exec handles are disk references — Archil disks have an independent\n // lifecycle, so destroying them is a no-op. Unknown ids fall back to\n // the configured mode.\n sandboxModes.delete(sandboxId);\n },\n\n\n runCommand: async (\n sandbox: ArchilSandbox,\n command: string,\n options?: RunCommandOptions,\n ): Promise<CommandResult> => {\n const startTime = Date.now();\n try {\n if (sandbox.vm) {\n // The process API fetches a fresh short-lived WebSocket\n // connection URL per process start, so expiry is handled by the\n // underlying client.\n await ensureVmRunning(sandbox.vm);\n const wrapped = wrapSandboxCommand(command, options);\n if (options?.background) {\n const proc = await sandbox.vm.processes.start(wrapped, {\n env: options?.env,\n });\n await proc.disconnect();\n return {\n stdout: '',\n stderr: '',\n exitCode: 0,\n durationMs: Date.now() - startTime,\n };\n }\n const result = await sandbox.vm.exec(wrapped, {\n env: options?.env,\n timeoutSeconds:\n options?.timeout !== undefined\n ? Math.ceil(options.timeout / 1000)\n : undefined,\n });\n return {\n stdout: result.stdout,\n stderr: result.stderr,\n exitCode:\n result.exitCode ?? (result.status === 'completed' ? 0 : 1),\n durationMs: Date.now() - startTime,\n };\n }\n\n const result = await execOnDisk(sandbox, wrapCommand(command, options));\n return {\n stdout: result.stdout ?? '',\n stderr: result.stderr ?? '',\n exitCode: result.exitCode,\n durationMs: Date.now() - startTime,\n };\n } catch (error) {\n return {\n stdout: '',\n stderr: error instanceof Error ? error.message : String(error),\n exitCode: 1,\n durationMs: Date.now() - startTime,\n };\n }\n },\n\n getInfo: async (sandbox: ArchilSandbox): Promise<SandboxInfo> => {\n if (sandbox.vm) {\n const vm = sandbox.vm;\n return {\n id: vm.id,\n provider: 'archil',\n status:\n vm.status === 'running'\n ? 'running'\n : vm.status === 'failed'\n ? 'error'\n : 'stopped',\n createdAt: vm.createdAt,\n timeout: vm.maxTtlSeconds * 1000,\n metadata: {\n name: vm.name,\n archilStatus: vm.status,\n vcpuCount: vm.vcpuCount,\n memSizeMiB: vm.memSizeMiB,\n baseImage: vm.baseImage,\n platform: vm.platform,\n },\n };\n }\n const diskInfo = 'status' in sandbox.disk ? sandbox.disk : undefined;\n return {\n id: sandbox.disk.id,\n provider: 'archil',\n status: !diskInfo || diskInfo.status === 'ready' ? 'running' : 'stopped',\n createdAt: diskInfo ? new Date(diskInfo.createdAt) : sandbox.createdAt,\n timeout: 0,\n metadata: diskInfo\n ? {\n name: diskInfo.name,\n organization: diskInfo.organization,\n region: diskInfo.region,\n provider: diskInfo.provider,\n }\n : {},\n };\n },\n\n getUrl: async (\n sandbox: ArchilSandbox,\n options: { port: number; protocol?: string },\n ): Promise<string> => {\n if (sandbox.vm) {\n await sandbox.vm.refresh();\n const endpoint = sandbox.vm.endpoints?.find(\n (e) => e.port === options.port,\n );\n if (!endpoint) {\n throw new Error(\n `No endpoint exposed on port ${options.port} for Archil sandbox ${sandbox.vm.id}.`,\n );\n }\n return `${options.protocol ?? 'https'}://${endpoint.hostname}`;\n }\n throw new Error(\n `Archil exec runs each command in a fresh ephemeral container that exits when the command returns, ` +\n `so there is no long-lived process to expose port ${options.port} on. ` +\n `getUrl is not supported.`,\n );\n },\n\n filesystem: {\n readFile: async (sandbox, path, runCommand) => {\n if (sandbox.vm) {\n const chunks: Buffer[] = [];\n try {\n await sandbox.vm.files.downloadFile(path, (chunk) => {\n chunks.push(Buffer.from(chunk));\n });\n } catch (error) {\n throw new Error(\n `Failed to read ${path}: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n return Buffer.concat(chunks).toString('utf8');\n }\n const diskPath = mapFilesystemPath(sandbox, path);\n const sizeResult = await runCommand(\n sandbox,\n `wc -c < ${shellEscape(diskPath)}`,\n );\n if (sizeResult.exitCode !== 0) {\n throw new Error(`Failed to read ${path}: ${sizeResult.stderr}`);\n }\n\n const sizeText = sizeResult.stdout.trim();\n if (!/^\\d+$/.test(sizeText)) {\n throw new Error(\n `Failed to read ${path}: Archil returned an invalid file size.`,\n );\n }\n\n const size = Number(sizeText);\n if (!Number.isSafeInteger(size)) {\n throw new Error(\n `Failed to read ${path}: file size exceeds JavaScript's safe integer range.`,\n );\n }\n if (size === 0) return '';\n\n const chunks: Buffer[] = [];\n for (\n let offset = 0;\n offset < size;\n offset += ARCHIL_MAX_READ_CHUNK_BYTES\n ) {\n const expectedBytes = Math.min(\n ARCHIL_MAX_READ_CHUNK_BYTES,\n size - offset,\n );\n const result = await runCommand(\n sandbox,\n `dd if=${shellEscape(diskPath)} bs=1 skip=${offset} count=${expectedBytes} 2>/dev/null | base64`,\n );\n if (result.exitCode !== 0) {\n throw new Error(`Failed to read ${path}: ${result.stderr}`);\n }\n\n const encoded = result.stdout.replace(/\\s/g, '');\n if (\n encoded.length === 0 ||\n encoded.length % 4 !== 0 ||\n !/^[A-Za-z0-9+/]*={0,2}$/.test(encoded)\n ) {\n throw new Error(\n `Failed to read ${path}: Archil returned an incomplete file chunk at byte ${offset}.`,\n );\n }\n\n const chunk = Buffer.from(encoded, 'base64');\n if (chunk.length !== expectedBytes) {\n throw new Error(\n `Failed to read ${path}: Archil returned an incomplete file chunk at byte ${offset}.`,\n );\n }\n chunks.push(chunk);\n }\n\n return Buffer.concat(chunks).toString('utf8');\n },\n\n writeFile: async (sandbox, path, content, runCommand) => {\n if (sandbox.vm) {\n try {\n await sandbox.vm.files.uploadFile(\n Buffer.from(content, 'utf8'),\n path,\n );\n } catch (error) {\n throw new Error(\n `Failed to write ${path}: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n return;\n }\n const diskPath = mapFilesystemPath(sandbox, path);\n const parent = posix.dirname(diskPath);\n const encoded = Buffer.from(content, 'utf8').toString('base64');\n const tempPath = `${diskPath}.computesdk-write-${randomUUID()}`;\n let started = false;\n\n try {\n if (encoded.length === 0) {\n started = true;\n const result = await runCommand(\n sandbox,\n withDiskWriteLock(\n sandbox,\n [\n `mkdir -p ${shellEscape(parent)}`,\n `: > ${shellEscape(tempPath)}`,\n finalizeStagedFileCommand(tempPath, diskPath),\n ].join(' && '),\n ),\n );\n if (result.exitCode !== 0) {\n throw new Error(result.stderr);\n }\n return;\n }\n\n const chunkSize = maxWriteChunkSize(parent, tempPath, diskPath);\n for (let offset = 0; offset < encoded.length; offset += chunkSize) {\n const isFirst = offset === 0;\n const isFinal = offset + chunkSize >= encoded.length;\n started = true;\n const result = await runCommand(\n sandbox,\n withDiskWriteLock(\n sandbox,\n buildWriteChunkCommand(\n parent,\n tempPath,\n diskPath,\n encoded.slice(offset, offset + chunkSize),\n isFirst,\n isFinal,\n ),\n ),\n );\n if (result.exitCode !== 0) {\n throw new Error(result.stderr);\n }\n }\n } catch (error) {\n if (started) {\n try {\n await runCommand(\n sandbox,\n withDiskWriteLock(sandbox, `rm -f ${shellEscape(tempPath)}`),\n );\n } catch {\n // Preserve the original write error if cleanup fails.\n }\n }\n throw new Error(\n `Failed to write ${path}: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n },\n\n mkdir: async (sandbox, path, runCommand) => {\n const diskPath = mapFilesystemPath(sandbox, path);\n const result = await runCommand(\n sandbox,\n withDiskWriteLock(sandbox, `mkdir -p ${shellEscape(diskPath)}`),\n );\n if (result.exitCode !== 0) {\n throw new Error(`Failed to create directory ${path}: ${result.stderr}`);\n }\n },\n\n readdir: async (sandbox, path, runCommand) => {\n const diskPath = mapFilesystemPath(sandbox, path);\n // Tab-separated: type<TAB>size<TAB>mtime-iso<TAB>name. Robust to spaces in names.\n const result = await runCommand(\n sandbox,\n `find ${shellEscape(diskPath)} -mindepth 1 -maxdepth 1 -printf '%y\\t%s\\t%T@\\t%f\\n'`,\n );\n if (result.exitCode !== 0) {\n throw new Error(`Failed to list directory ${path}: ${result.stderr}`);\n }\n const entries: FileEntry[] = [];\n for (const line of result.stdout.split('\\n')) {\n if (!line) continue;\n const [typeChar, sizeStr, mtimeStr, ...nameParts] = line.split('\\t');\n const name = nameParts.join('\\t');\n entries.push({\n name,\n type: typeChar === 'd' ? 'directory' : 'file',\n size: parseInt(sizeStr, 10) || 0,\n modified: new Date(parseFloat(mtimeStr) * 1000),\n });\n }\n return entries;\n },\n\n exists: async (sandbox, path, runCommand) => {\n const diskPath = mapFilesystemPath(sandbox, path);\n const result = await runCommand(sandbox, `test -e ${shellEscape(diskPath)}`);\n return result.exitCode === 0;\n },\n\n remove: async (sandbox, path, runCommand) => {\n const diskPath = mapFilesystemPath(sandbox, path);\n if (!sandbox.vm && diskPath === ARCHIL_MOUNT_ROOT) {\n throw new Error('Refusing to remove the Archil disk mount root.');\n }\n const result = await runCommand(\n sandbox,\n withDiskWriteLock(sandbox, `rm -rf ${shellEscape(diskPath)}`),\n );\n if (result.exitCode !== 0) {\n throw new Error(`Failed to remove ${path}: ${result.stderr}`);\n }\n },\n },\n\n getInstance: (sandbox: ArchilSandbox): ArchilSandbox => sandbox,\n },\n\n // Archil has no separate snapshot resource: a \"snapshot\" is a sandbox\n // fork (an isolated writable branch of the source sandbox's state), so\n // snapshot ids are ordinary sandbox ids that create() forks again.\n snapshot: {\n create: async (\n config: ArchilConfig,\n sandboxId: string,\n options?: { name?: string },\n ) => {\n const resolved = resolveConfig(config);\n const client = createClient(config, resolved);\n try {\n const fork = await forkSandboxVm(client, sandboxId, options?.name);\n return {\n id: fork.id,\n provider: 'archil',\n createdAt: fork.createdAt ?? new Date(),\n metadata: { name: fork.name },\n };\n } catch (error) {\n throw new Error(\n `Failed to create Archil snapshot: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n },\n\n list: async (_config: ArchilConfig) => {\n throw new Error(\n 'Archil provider does not support listing snapshots.',\n );\n },\n\n delete: async (config: ArchilConfig, snapshotId: string) => {\n const resolved = resolveConfig(config);\n const client = createClient(config, resolved);\n let vm: ArchilVm;\n try {\n vm = await client.sandboxes.get(snapshotId);\n } catch (error) {\n if (error instanceof ArchilError && error.status === 404) return;\n throw error;\n }\n await vm.delete();\n },\n },\n },\n});\n\nexport const archil = (config: ArchilConfig = {}) => _provider(config);\n\nexport type { ArchilSandbox };\n"],"mappings":";;;;;;;;;;;;;;;;;;;;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;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,GAAG,OAAO;AAAA,QAClB;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,GAAG,OAAO;AAAA,MAClB;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
@@ -172,6 +172,13 @@ async function ensureVmRunning(vm) {
172
172
  await vm.start();
173
173
  }
174
174
  }
175
+ async function stopAndDeleteVm(vm) {
176
+ if (vm.status === "deleting" || vm.status === "deleted") return;
177
+ if (vm.status !== "stopped" && vm.status !== "exited" && vm.status !== "failed") {
178
+ await vm.stop();
179
+ }
180
+ await vm.delete();
181
+ }
175
182
  function toSandboxRequest(options) {
176
183
  const request = {
177
184
  ...options?.sandbox,
@@ -192,7 +199,7 @@ var sandboxModes = /* @__PURE__ */ new Map();
192
199
  var _provider = defineProvider({
193
200
  name: "archil",
194
201
  methods: {
195
- sandbox: {
202
+ instances: {
196
203
  create: async (config, options) => {
197
204
  const resolved = resolveConfig(config);
198
205
  const client = createClient(config, resolved);
@@ -221,26 +228,26 @@ var _provider = defineProvider({
221
228
  }
222
229
  sandboxModes.set(vm.id, "persistent");
223
230
  return {
224
- sandbox: {
231
+ instance: {
225
232
  client,
226
233
  disk: { id: vm.id },
227
234
  vm,
228
235
  resolved,
229
236
  createdAt: /* @__PURE__ */ new Date()
230
237
  },
231
- sandboxId: vm.id
238
+ instanceId: vm.id
232
239
  };
233
240
  }
234
241
  const diskId = resolveCreateDiskId(options);
235
242
  sandboxModes.set(diskId, "exec");
236
243
  return {
237
- sandbox: {
244
+ instance: {
238
245
  client,
239
246
  disk: { id: diskId },
240
247
  resolved,
241
248
  createdAt: /* @__PURE__ */ new Date()
242
249
  },
243
- sandboxId: diskId
250
+ instanceId: diskId
244
251
  };
245
252
  },
246
253
  getById: async (config, sandboxId) => {
@@ -251,20 +258,20 @@ var _provider = defineProvider({
251
258
  const vm = await client.sandboxes.get(sandboxId);
252
259
  await ensureVmRunning(vm);
253
260
  return {
254
- sandbox: {
261
+ instance: {
255
262
  client,
256
263
  disk: { id: vm.id },
257
264
  vm,
258
265
  resolved,
259
266
  createdAt: /* @__PURE__ */ new Date()
260
267
  },
261
- sandboxId: vm.id
268
+ instanceId: vm.id
262
269
  };
263
270
  }
264
271
  const disk = await client.disks.get(sandboxId);
265
272
  return {
266
- sandbox: { client, disk, resolved, createdAt: /* @__PURE__ */ new Date() },
267
- sandboxId: disk.id
273
+ instance: { client, disk, resolved, createdAt: /* @__PURE__ */ new Date() },
274
+ instanceId: disk.id
268
275
  };
269
276
  } catch {
270
277
  return null;
@@ -276,20 +283,20 @@ var _provider = defineProvider({
276
283
  if (resolved.execution === "persistent") {
277
284
  const vms = await client.sandboxes.list();
278
285
  return vms.map((vm) => ({
279
- sandbox: {
286
+ instance: {
280
287
  client,
281
288
  disk: { id: vm.id },
282
289
  vm,
283
290
  resolved,
284
291
  createdAt: /* @__PURE__ */ new Date()
285
292
  },
286
- sandboxId: vm.id
293
+ instanceId: vm.id
287
294
  }));
288
295
  }
289
296
  const disks = await client.disks.list();
290
297
  return disks.map((disk) => ({
291
- sandbox: { client, disk, resolved, createdAt: /* @__PURE__ */ new Date() },
292
- sandboxId: disk.id
298
+ instance: { client, disk, resolved, createdAt: /* @__PURE__ */ new Date() },
299
+ instanceId: disk.id
293
300
  }));
294
301
  },
295
302
  destroy: async (config, sandboxId) => {
@@ -298,7 +305,7 @@ var _provider = defineProvider({
298
305
  if (mode === "persistent") {
299
306
  const client = createClient(config, resolved);
300
307
  const vm = await client.sandboxes.get(sandboxId);
301
- await vm.delete();
308
+ await stopAndDeleteVm(vm);
302
309
  }
303
310
  sandboxModes.delete(sandboxId);
304
311
  },
@@ -630,7 +637,7 @@ var _provider = defineProvider({
630
637
  if (error instanceof ArchilError && error.status === 404) return;
631
638
  throw error;
632
639
  }
633
- await vm.delete();
640
+ await stopAndDeleteVm(vm);
634
641
  }
635
642
  }
636
643
  }
@@ -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\nfunction toSandboxRequest(options?: ArchilCreateOptions): ArchilSandboxRequest {\n const request: ArchilSandboxRequest = {\n ...options?.sandbox,\n name: options?.name,\n baseImage: options?.baseImage ?? options?.image ?? options?.templateId,\n env: options?.env ?? options?.envs,\n vcpuCount: options?.vcpus ?? options?.cpu ?? options?.cpus,\n memSizeMiB: options?.memoryMiB ?? options?.memory,\n };\n if (options?.maxTtlSeconds !== undefined) {\n request.maxTtlSeconds = options.maxTtlSeconds;\n } else if (options?.timeout !== undefined) {\n // CreateSandboxOptions.timeout is milliseconds; Archil's TTL is seconds.\n request.maxTtlSeconds = Math.ceil(options.timeout / 1000);\n }\n return request;\n}\n\n// Records each sandbox's effective execution mode so `destroy` — which only\n// receives an id — deletes persistent VMs even when the mode came from a\n// per-sandbox `ephemeral` override rather than the provider config.\nconst sandboxModes = new Map<string, ArchilExecutionMode>();\n\nconst _provider = defineProvider<ArchilSandbox, ArchilConfig>({\n name: 'archil',\n methods: {\n sandbox: {\n create: async (config: ArchilConfig, options?: ArchilCreateOptions) => {\n const resolved = resolveConfig(config);\n const client = createClient(config, resolved);\n\n // `ephemeral` on create() overrides the configured default for this\n // sandbox: true -> serverless exec handle, false -> persistent VM.\n const execution =\n options?.ephemeral !== undefined\n ? options.ephemeral\n ? 'exec'\n : 'persistent'\n : resolved.execution;\n\n if (options?.snapshotId && options?.ephemeral === true) {\n throw new Error(\n 'Archil cannot combine ephemeral: true with snapshotId — snapshots fork persistent VMs. Drop ephemeral or set it to false.',\n );\n }\n\n // snapshotId forks a new VM from that snapshot's state — Archil\n // models snapshots as isolated writable branches of a source\n // sandbox — so it always takes the VM path regardless of the\n // configured execution mode.\n if (execution === 'persistent' || options?.snapshotId) {\n let vm: ArchilVm;\n if (options?.snapshotId) {\n vm = await forkSandboxVm(client, options.snapshotId, options?.name);\n } else if (options?.sandboxId) {\n // Attach to a live sandbox. Refuse an abort signal here: the\n // sandbox manager destroys a resolved sandbox after an abort,\n // which would delete a sandbox this call did not create.\n if (options?.signal) {\n throw new Error(\n 'create({ sandboxId }) attaches to an existing sandbox and cannot be combined with an abort signal',\n );\n }\n vm = await client.sandboxes.get(options.sandboxId);\n await ensureVmRunning(vm);\n } else {\n vm = await client.sandboxes.create(toSandboxRequest(options), {\n wait: true,\n });\n }\n sandboxModes.set(vm.id, 'persistent');\n return {\n sandbox: {\n client,\n disk: { id: vm.id },\n vm,\n resolved,\n createdAt: new Date(),\n },\n sandboxId: vm.id,\n };\n }\n\n const diskId = resolveCreateDiskId(options);\n sandboxModes.set(diskId, 'exec');\n return {\n sandbox: {\n client,\n disk: { id: diskId },\n resolved,\n createdAt: new Date(),\n },\n sandboxId: diskId,\n };\n },\n\n getById: async (config: ArchilConfig, sandboxId: string) => {\n const resolved = resolveConfig(config);\n const client = createClient(config, resolved);\n try {\n if (resolved.execution === 'persistent') {\n const vm = await client.sandboxes.get(sandboxId);\n await ensureVmRunning(vm);\n return {\n sandbox: {\n client,\n disk: { id: vm.id },\n vm,\n resolved,\n createdAt: new Date(),\n },\n sandboxId: vm.id,\n };\n }\n const disk = await client.disks.get(sandboxId);\n return {\n sandbox: { client, disk, resolved, createdAt: new Date() },\n sandboxId: disk.id,\n };\n } catch {\n return null;\n }\n },\n\n list: async (config: ArchilConfig) => {\n const resolved = resolveConfig(config);\n const client = createClient(config, resolved);\n if (resolved.execution === 'persistent') {\n const vms = await client.sandboxes.list();\n return vms.map((vm) => ({\n sandbox: {\n client,\n disk: { id: vm.id },\n vm,\n resolved,\n createdAt: new Date(),\n },\n sandboxId: vm.id,\n }));\n }\n const disks = await client.disks.list();\n return disks.map((disk) => ({\n sandbox: { client, disk, resolved, createdAt: new Date() },\n sandboxId: disk.id,\n }));\n },\n\n destroy: async (config: ArchilConfig, sandboxId: string) => {\n const resolved = resolveConfig(config);\n const mode = sandboxModes.get(sandboxId) ?? resolved.execution;\n if (mode === 'persistent') {\n const client = createClient(config, resolved);\n const vm = await client.sandboxes.get(sandboxId);\n await vm.delete();\n }\n // exec handles are disk references — Archil disks have an independent\n // lifecycle, so destroying them is a no-op. Unknown ids fall back to\n // the configured mode.\n sandboxModes.delete(sandboxId);\n },\n\n\n runCommand: async (\n sandbox: ArchilSandbox,\n command: string,\n options?: RunCommandOptions,\n ): Promise<CommandResult> => {\n const startTime = Date.now();\n try {\n if (sandbox.vm) {\n // The process API fetches a fresh short-lived WebSocket\n // connection URL per process start, so expiry is handled by the\n // underlying client.\n await ensureVmRunning(sandbox.vm);\n const wrapped = wrapSandboxCommand(command, options);\n if (options?.background) {\n const proc = await sandbox.vm.processes.start(wrapped, {\n env: options?.env,\n });\n await proc.disconnect();\n return {\n stdout: '',\n stderr: '',\n exitCode: 0,\n durationMs: Date.now() - startTime,\n };\n }\n const result = await sandbox.vm.exec(wrapped, {\n env: options?.env,\n timeoutSeconds:\n options?.timeout !== undefined\n ? Math.ceil(options.timeout / 1000)\n : undefined,\n });\n return {\n stdout: result.stdout,\n stderr: result.stderr,\n exitCode:\n result.exitCode ?? (result.status === 'completed' ? 0 : 1),\n durationMs: Date.now() - startTime,\n };\n }\n\n const result = await execOnDisk(sandbox, wrapCommand(command, options));\n return {\n stdout: result.stdout ?? '',\n stderr: result.stderr ?? '',\n exitCode: result.exitCode,\n durationMs: Date.now() - startTime,\n };\n } catch (error) {\n return {\n stdout: '',\n stderr: error instanceof Error ? error.message : String(error),\n exitCode: 1,\n durationMs: Date.now() - startTime,\n };\n }\n },\n\n getInfo: async (sandbox: ArchilSandbox): Promise<SandboxInfo> => {\n if (sandbox.vm) {\n const vm = sandbox.vm;\n return {\n id: vm.id,\n provider: 'archil',\n status:\n vm.status === 'running'\n ? 'running'\n : vm.status === 'failed'\n ? 'error'\n : 'stopped',\n createdAt: vm.createdAt,\n timeout: vm.maxTtlSeconds * 1000,\n metadata: {\n name: vm.name,\n archilStatus: vm.status,\n vcpuCount: vm.vcpuCount,\n memSizeMiB: vm.memSizeMiB,\n baseImage: vm.baseImage,\n platform: vm.platform,\n },\n };\n }\n const diskInfo = 'status' in sandbox.disk ? sandbox.disk : undefined;\n return {\n id: sandbox.disk.id,\n provider: 'archil',\n status: !diskInfo || diskInfo.status === 'ready' ? 'running' : 'stopped',\n createdAt: diskInfo ? new Date(diskInfo.createdAt) : sandbox.createdAt,\n timeout: 0,\n metadata: diskInfo\n ? {\n name: diskInfo.name,\n organization: diskInfo.organization,\n region: diskInfo.region,\n provider: diskInfo.provider,\n }\n : {},\n };\n },\n\n getUrl: async (\n sandbox: ArchilSandbox,\n options: { port: number; protocol?: string },\n ): Promise<string> => {\n if (sandbox.vm) {\n await sandbox.vm.refresh();\n const endpoint = sandbox.vm.endpoints?.find(\n (e) => e.port === options.port,\n );\n if (!endpoint) {\n throw new Error(\n `No endpoint exposed on port ${options.port} for Archil sandbox ${sandbox.vm.id}.`,\n );\n }\n return `${options.protocol ?? 'https'}://${endpoint.hostname}`;\n }\n throw new Error(\n `Archil exec runs each command in a fresh ephemeral container that exits when the command returns, ` +\n `so there is no long-lived process to expose port ${options.port} on. ` +\n `getUrl is not supported.`,\n );\n },\n\n filesystem: {\n readFile: async (sandbox, path, runCommand) => {\n if (sandbox.vm) {\n const chunks: Buffer[] = [];\n try {\n await sandbox.vm.files.downloadFile(path, (chunk) => {\n chunks.push(Buffer.from(chunk));\n });\n } catch (error) {\n throw new Error(\n `Failed to read ${path}: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n return Buffer.concat(chunks).toString('utf8');\n }\n const diskPath = mapFilesystemPath(sandbox, path);\n const sizeResult = await runCommand(\n sandbox,\n `wc -c < ${shellEscape(diskPath)}`,\n );\n if (sizeResult.exitCode !== 0) {\n throw new Error(`Failed to read ${path}: ${sizeResult.stderr}`);\n }\n\n const sizeText = sizeResult.stdout.trim();\n if (!/^\\d+$/.test(sizeText)) {\n throw new Error(\n `Failed to read ${path}: Archil returned an invalid file size.`,\n );\n }\n\n const size = Number(sizeText);\n if (!Number.isSafeInteger(size)) {\n throw new Error(\n `Failed to read ${path}: file size exceeds JavaScript's safe integer range.`,\n );\n }\n if (size === 0) return '';\n\n const chunks: Buffer[] = [];\n for (\n let offset = 0;\n offset < size;\n offset += ARCHIL_MAX_READ_CHUNK_BYTES\n ) {\n const expectedBytes = Math.min(\n ARCHIL_MAX_READ_CHUNK_BYTES,\n size - offset,\n );\n const result = await runCommand(\n sandbox,\n `dd if=${shellEscape(diskPath)} bs=1 skip=${offset} count=${expectedBytes} 2>/dev/null | base64`,\n );\n if (result.exitCode !== 0) {\n throw new Error(`Failed to read ${path}: ${result.stderr}`);\n }\n\n const encoded = result.stdout.replace(/\\s/g, '');\n if (\n encoded.length === 0 ||\n encoded.length % 4 !== 0 ||\n !/^[A-Za-z0-9+/]*={0,2}$/.test(encoded)\n ) {\n throw new Error(\n `Failed to read ${path}: Archil returned an incomplete file chunk at byte ${offset}.`,\n );\n }\n\n const chunk = Buffer.from(encoded, 'base64');\n if (chunk.length !== expectedBytes) {\n throw new Error(\n `Failed to read ${path}: Archil returned an incomplete file chunk at byte ${offset}.`,\n );\n }\n chunks.push(chunk);\n }\n\n return Buffer.concat(chunks).toString('utf8');\n },\n\n writeFile: async (sandbox, path, content, runCommand) => {\n if (sandbox.vm) {\n try {\n await sandbox.vm.files.uploadFile(\n Buffer.from(content, 'utf8'),\n path,\n );\n } catch (error) {\n throw new Error(\n `Failed to write ${path}: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n return;\n }\n const diskPath = mapFilesystemPath(sandbox, path);\n const parent = posix.dirname(diskPath);\n const encoded = Buffer.from(content, 'utf8').toString('base64');\n const tempPath = `${diskPath}.computesdk-write-${randomUUID()}`;\n let started = false;\n\n try {\n if (encoded.length === 0) {\n started = true;\n const result = await runCommand(\n sandbox,\n withDiskWriteLock(\n sandbox,\n [\n `mkdir -p ${shellEscape(parent)}`,\n `: > ${shellEscape(tempPath)}`,\n finalizeStagedFileCommand(tempPath, diskPath),\n ].join(' && '),\n ),\n );\n if (result.exitCode !== 0) {\n throw new Error(result.stderr);\n }\n return;\n }\n\n const chunkSize = maxWriteChunkSize(parent, tempPath, diskPath);\n for (let offset = 0; offset < encoded.length; offset += chunkSize) {\n const isFirst = offset === 0;\n const isFinal = offset + chunkSize >= encoded.length;\n started = true;\n const result = await runCommand(\n sandbox,\n withDiskWriteLock(\n sandbox,\n buildWriteChunkCommand(\n parent,\n tempPath,\n diskPath,\n encoded.slice(offset, offset + chunkSize),\n isFirst,\n isFinal,\n ),\n ),\n );\n if (result.exitCode !== 0) {\n throw new Error(result.stderr);\n }\n }\n } catch (error) {\n if (started) {\n try {\n await runCommand(\n sandbox,\n withDiskWriteLock(sandbox, `rm -f ${shellEscape(tempPath)}`),\n );\n } catch {\n // Preserve the original write error if cleanup fails.\n }\n }\n throw new Error(\n `Failed to write ${path}: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n },\n\n mkdir: async (sandbox, path, runCommand) => {\n const diskPath = mapFilesystemPath(sandbox, path);\n const result = await runCommand(\n sandbox,\n withDiskWriteLock(sandbox, `mkdir -p ${shellEscape(diskPath)}`),\n );\n if (result.exitCode !== 0) {\n throw new Error(`Failed to create directory ${path}: ${result.stderr}`);\n }\n },\n\n readdir: async (sandbox, path, runCommand) => {\n const diskPath = mapFilesystemPath(sandbox, path);\n // Tab-separated: type<TAB>size<TAB>mtime-iso<TAB>name. Robust to spaces in names.\n const result = await runCommand(\n sandbox,\n `find ${shellEscape(diskPath)} -mindepth 1 -maxdepth 1 -printf '%y\\t%s\\t%T@\\t%f\\n'`,\n );\n if (result.exitCode !== 0) {\n throw new Error(`Failed to list directory ${path}: ${result.stderr}`);\n }\n const entries: FileEntry[] = [];\n for (const line of result.stdout.split('\\n')) {\n if (!line) continue;\n const [typeChar, sizeStr, mtimeStr, ...nameParts] = line.split('\\t');\n const name = nameParts.join('\\t');\n entries.push({\n name,\n type: typeChar === 'd' ? 'directory' : 'file',\n size: parseInt(sizeStr, 10) || 0,\n modified: new Date(parseFloat(mtimeStr) * 1000),\n });\n }\n return entries;\n },\n\n exists: async (sandbox, path, runCommand) => {\n const diskPath = mapFilesystemPath(sandbox, path);\n const result = await runCommand(sandbox, `test -e ${shellEscape(diskPath)}`);\n return result.exitCode === 0;\n },\n\n remove: async (sandbox, path, runCommand) => {\n const diskPath = mapFilesystemPath(sandbox, path);\n if (!sandbox.vm && diskPath === ARCHIL_MOUNT_ROOT) {\n throw new Error('Refusing to remove the Archil disk mount root.');\n }\n const result = await runCommand(\n sandbox,\n withDiskWriteLock(sandbox, `rm -rf ${shellEscape(diskPath)}`),\n );\n if (result.exitCode !== 0) {\n throw new Error(`Failed to remove ${path}: ${result.stderr}`);\n }\n },\n },\n\n getInstance: (sandbox: ArchilSandbox): ArchilSandbox => sandbox,\n },\n\n // Archil has no separate snapshot resource: a \"snapshot\" is a sandbox\n // fork (an isolated writable branch of the source sandbox's state), so\n // snapshot ids are ordinary sandbox ids that create() forks again.\n snapshot: {\n create: async (\n config: ArchilConfig,\n sandboxId: string,\n options?: { name?: string },\n ) => {\n const resolved = resolveConfig(config);\n const client = createClient(config, resolved);\n try {\n const fork = await forkSandboxVm(client, sandboxId, options?.name);\n return {\n id: fork.id,\n provider: 'archil',\n createdAt: fork.createdAt ?? new Date(),\n metadata: { name: fork.name },\n };\n } catch (error) {\n throw new Error(\n `Failed to create Archil snapshot: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n },\n\n list: async (_config: ArchilConfig) => {\n throw new Error(\n 'Archil provider does not support listing snapshots.',\n );\n },\n\n delete: async (config: ArchilConfig, snapshotId: string) => {\n const resolved = resolveConfig(config);\n const client = createClient(config, resolved);\n let vm: ArchilVm;\n try {\n vm = await client.sandboxes.get(snapshotId);\n } catch (error) {\n if (error instanceof ArchilError && error.status === 404) return;\n throw error;\n }\n await vm.delete();\n },\n },\n },\n});\n\nexport const archil = (config: ArchilConfig = {}) => _provider(config);\n\nexport type { ArchilSandbox };\n"],"mappings":"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","names":["result","chunks"]}
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.18",
3
+ "version": "0.4.20",
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.10",
23
- "@computesdk/provider": "2.1.11"
22
+ "computesdk": "4.1.11",
23
+ "@computesdk/provider": "2.1.13"
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.3"
33
+ "@computesdk/test-utils": "2.0.4"
34
34
  },
35
35
  "keywords": [
36
36
  "computesdk",