@computesdk/archil 0.4.19 → 0.4.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -49,9 +49,9 @@ const result = await provider.sandbox.runCommand(sandbox, 'echo hello > /mnt/not
49
49
  console.log(result.stdout); // "hello"
50
50
 
51
51
  // Look up later by disk id:
52
- const byId = await provider.sandbox.getById(sandbox.sandboxId);
52
+ const byId = await provider.sandbox.getById(sandbox.instanceId);
53
53
 
54
- await provider.sandbox.destroy(sandbox.sandboxId);
54
+ await provider.sandbox.destroy(sandbox.instanceId);
55
55
  ```
56
56
 
57
57
  `create()` requires top-level `diskId` as the target disk id.
@@ -76,12 +76,12 @@ await sandbox.runCommand('npm ci', { cwd: '/repo' });
76
76
  await sandbox.runCommand('npm test', { cwd: '/repo' });
77
77
 
78
78
  // Paused sandboxes are resumed automatically on getById/runCommand.
79
- const resumed = await provider.sandbox.getById(sandbox.sandboxId);
79
+ const resumed = await provider.sandbox.getById(sandbox.instanceId);
80
80
 
81
- await provider.sandbox.destroy(sandbox.sandboxId); // deletes the sandbox
81
+ await provider.sandbox.destroy(sandbox.instanceId); // deletes the sandbox
82
82
  ```
83
83
 
84
- Sandbox `create` accepts generic `CreateSandboxOptions` fields (`vcpus`/`cpu`/`cpus`,
84
+ Sandbox `create` accepts generic `CreateInstanceOptions` fields (`vcpus`/`cpu`/`cpus`,
85
85
  `memory`/`memoryMiB`, `image`/`templateId`, `envs`, `timeout` (ms → `maxTtlSeconds`))
86
86
  plus the Archil-specific keys shown above.
87
87
 
package/dist/index.js CHANGED
@@ -223,7 +223,7 @@ var sandboxModes = /* @__PURE__ */ new Map();
223
223
  var _provider = (0, import_provider.defineProvider)({
224
224
  name: "archil",
225
225
  methods: {
226
- sandbox: {
226
+ instances: {
227
227
  create: async (config, options) => {
228
228
  const resolved = resolveConfig(config);
229
229
  const client = createClient(config, resolved);
@@ -252,26 +252,26 @@ var _provider = (0, import_provider.defineProvider)({
252
252
  }
253
253
  sandboxModes.set(vm.id, "persistent");
254
254
  return {
255
- sandbox: {
255
+ instance: {
256
256
  client,
257
257
  disk: { id: vm.id },
258
258
  vm,
259
259
  resolved,
260
260
  createdAt: /* @__PURE__ */ new Date()
261
261
  },
262
- sandboxId: vm.id
262
+ instanceId: vm.id
263
263
  };
264
264
  }
265
265
  const diskId = resolveCreateDiskId(options);
266
266
  sandboxModes.set(diskId, "exec");
267
267
  return {
268
- sandbox: {
268
+ instance: {
269
269
  client,
270
270
  disk: { id: diskId },
271
271
  resolved,
272
272
  createdAt: /* @__PURE__ */ new Date()
273
273
  },
274
- sandboxId: diskId
274
+ instanceId: diskId
275
275
  };
276
276
  },
277
277
  getById: async (config, sandboxId) => {
@@ -282,20 +282,20 @@ var _provider = (0, import_provider.defineProvider)({
282
282
  const vm = await client.sandboxes.get(sandboxId);
283
283
  await ensureVmRunning(vm);
284
284
  return {
285
- sandbox: {
285
+ instance: {
286
286
  client,
287
287
  disk: { id: vm.id },
288
288
  vm,
289
289
  resolved,
290
290
  createdAt: /* @__PURE__ */ new Date()
291
291
  },
292
- sandboxId: vm.id
292
+ instanceId: vm.id
293
293
  };
294
294
  }
295
295
  const disk = await client.disks.get(sandboxId);
296
296
  return {
297
- sandbox: { client, disk, resolved, createdAt: /* @__PURE__ */ new Date() },
298
- sandboxId: disk.id
297
+ instance: { client, disk, resolved, createdAt: /* @__PURE__ */ new Date() },
298
+ instanceId: disk.id
299
299
  };
300
300
  } catch {
301
301
  return null;
@@ -307,20 +307,20 @@ var _provider = (0, import_provider.defineProvider)({
307
307
  if (resolved.execution === "persistent") {
308
308
  const vms = await client.sandboxes.list();
309
309
  return vms.map((vm) => ({
310
- sandbox: {
310
+ instance: {
311
311
  client,
312
312
  disk: { id: vm.id },
313
313
  vm,
314
314
  resolved,
315
315
  createdAt: /* @__PURE__ */ new Date()
316
316
  },
317
- sandboxId: vm.id
317
+ instanceId: vm.id
318
318
  }));
319
319
  }
320
320
  const disks = await client.disks.list();
321
321
  return disks.map((disk) => ({
322
- sandbox: { client, disk, resolved, createdAt: /* @__PURE__ */ new Date() },
323
- sandboxId: disk.id
322
+ instance: { client, disk, resolved, createdAt: /* @__PURE__ */ new Date() },
323
+ instanceId: disk.id
324
324
  }));
325
325
  },
326
326
  destroy: async (config, sandboxId) => {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["/**\n * Archil Provider\n *\n * Supports Archil's two compute surfaces, selected by `execution`:\n *\n * - \"exec\" (default): each command runs in an Archil-managed ephemeral\n * container with the configured disk mounted, then returns stdout, stderr,\n * and exit code. \"create\" resolves a handle to an existing disk id; env,\n * cwd, and installs do not persist between commands.\n * - \"persistent\": `create` provisions an Archil sandbox — a persistent Linux\n * VM with a dedicated disk. `runCommand` uses the sandbox's interactive\n * process API (a short-lived WebSocket connection fetched fresh per command\n * via POST /api/sandboxes/{id}/connections), so filesystem state, installed\n * tools, and background processes persist across commands.\n */\n\nimport { defineProvider } from '@computesdk/provider';\nimport { Archil as ArchilClient, ArchilError } from 'disk';\nimport type {\n CreateSandboxRequest as ArchilSandboxRequest,\n Sandbox as ArchilVm,\n} from 'disk';\nimport { randomUUID } from 'node:crypto';\nimport { posix } from 'node:path';\nimport type {\n CommandResult,\n SandboxInfo,\n CreateSandboxOptions,\n FileEntry,\n RunCommandOptions,\n} from 'computesdk';\n\nconst ARCHIL_MOUNT_ROOT = '/mnt/archil';\nconst ARCHIL_MAX_EXEC_COMMAND_BYTES = 102_400;\n// Base64 expands the file data and adds line wrapping. Keep the raw chunk\n// comfortably below Archil's roughly 4 MiB response cap.\nconst ARCHIL_MAX_READ_CHUNK_BYTES = 2 * 1024 * 1024;\n\n// Per-region color overrides. Default is \"green\" for any region not listed here.\nconst REGION_COLORS: Record<string, string> = {\n 'gcp-us-central1': 'blue',\n};\n\nfunction regionToBaseUrl(region: string): string {\n const dash = region.indexOf('-');\n if (dash <= 0 || dash === region.length - 1) {\n throw new Error(\n `Invalid Archil region \"${region}\". Expected \"{cloud}-{suffix}\", e.g. \"aws-us-east-1\".`,\n );\n }\n const cloud = region.slice(0, dash);\n const suffix = region.slice(dash + 1);\n const color = REGION_COLORS[region] ?? 'green';\n return `https://control.${color}.${suffix}.${cloud}.prod.archil.com`;\n}\n\n/**\n * Archil execution mode:\n * - \"exec\": serverless per-command containers on a disk (default).\n * - \"persistent\": a persistent sandbox VM run through the process API.\n */\nexport type ArchilExecutionMode = 'exec' | 'persistent';\n\nexport interface ArchilConfig {\n /** Archil API key. Falls back to ARCHIL_API_KEY env var. */\n apiKey?: string;\n /** Archil region (e.g. \"aws-us-east-1\"). Falls back to ARCHIL_REGION env var. */\n region?: string;\n /** Override the control-plane base URL (useful for testing). */\n baseUrl?: string;\n /**\n * Which Archil compute surface to use. Defaults to \"exec\". In\n * \"persistent\" mode create() provisions a persistent sandbox VM instead of\n * resolving a disk handle. Per-sandbox override: `ephemeral` on\n * create() options (true -> exec handle, false -> persistent VM).\n */\n execution?: ArchilExecutionMode;\n}\n\ninterface DiskResponse {\n id: string;\n name: string;\n organization: string;\n status: string;\n provider: string;\n region: string;\n createdAt: string;\n}\n\ntype DiskHandle = Pick<DiskResponse, 'id'>;\n\ninterface ExecTiming {\n totalMs: number;\n queueMs: number;\n executeMs: number;\n}\n\ninterface ExecResponse {\n exitCode: number;\n stdout: string;\n stderr: string;\n timing: ExecTiming;\n}\n\ninterface ResolvedConfig {\n apiKey: string;\n baseUrl: string;\n execution: ArchilExecutionMode;\n}\n\ninterface ArchilSandbox {\n client: ArchilClient;\n disk: DiskHandle | DiskResponse;\n /** Set only in \"persistent\" execution mode. */\n vm?: ArchilVm;\n resolved: ResolvedConfig;\n createdAt: Date;\n}\n\ninterface ArchilCreateOptions extends CreateSandboxOptions {\n /**\n * exec mode: id of the existing disk to run commands against. Required in\n * \"exec\" mode; ignored in \"persistent\" mode.\n */\n diskId?: string;\n /** persistent mode: OCI base image (e.g. \"node:24-bookworm\"). */\n baseImage?: string;\n /** persistent mode: environment variables baked into the sandbox. */\n env?: Record<string, string>;\n /** persistent mode: lifetime budget per powered-on session, in seconds. */\n maxTtlSeconds?: number;\n /** persistent mode: extra Archil sandbox fields (network policy, etc.). */\n sandbox?: Omit<\n ArchilSandboxRequest,\n 'name' | 'vcpuCount' | 'memSizeMiB' | 'baseImage' | 'env' | 'maxTtlSeconds'\n >;\n}\n\nfunction resolveConfig(config: ArchilConfig): ResolvedConfig {\n const apiKey = config.apiKey ?? process.env.ARCHIL_API_KEY;\n const region = config.region ?? process.env.ARCHIL_REGION;\n\n if (!apiKey) {\n throw new Error(\n 'Missing API key for Archil.\\n\\n' +\n 'Pass it: archil({ apiKey: \"...\" })\\n' +\n 'Or set ARCHIL_API_KEY in your environment.',\n );\n }\n\n let baseUrl = config.baseUrl;\n if (!baseUrl) {\n if (!region) {\n throw new Error(\n 'Missing region for Archil.\\n\\n' +\n 'Pass it: archil({ region: \"...\" })\\n' +\n 'Or set ARCHIL_REGION in your environment.\\n' +\n 'Examples: \"aws-us-east-1\", \"aws-eu-west-1\", \"gcp-us-central1\".',\n );\n }\n baseUrl = regionToBaseUrl(region);\n }\n\n return { apiKey, baseUrl, execution: config.execution ?? 'exec' };\n}\n\nfunction createClient(config: ArchilConfig, resolved: ResolvedConfig): ArchilClient {\n const region = config.region ?? process.env.ARCHIL_REGION ?? 'aws-us-east-1';\n return new ArchilClient({ ...resolved, region });\n}\n\nfunction resolveCreateDiskId(options?: ArchilCreateOptions): string {\n // `sandboxId` is accepted as an alias: exec-mode sandboxes are addressed by\n // their disk id.\n const diskId = options?.diskId ?? options?.sandboxId;\n\n if (!diskId) {\n throw new Error(\n 'Archil create() requires an existing disk id on the top-level options.\\n\\n' +\n 'Example:\\n' +\n ' provider.sandbox.create({ diskId: \"disk_abc123\" })',\n );\n }\n\n return diskId;\n}\n\nasync function forkSandboxVm(\n client: ArchilClient,\n sourceId: string,\n name?: string,\n): Promise<ArchilVm> {\n const source = await client.sandboxes.get(sourceId);\n return source.fork({ name });\n}\n\nfunction shellEscape(value: string): string {\n return `'${value.replace(/'/g, `'\\\\''`)}'`;\n}\n\nfunction mapFilesystemPath(sandbox: ArchilSandbox, path: string): string {\n const normalized = posix.normalize(path.startsWith('/') ? path : `/${path}`);\n\n // In persistent mode the filesystem is the VM's own filesystem.\n if (sandbox.vm) {\n return normalized;\n }\n\n if (normalized === '/') {\n return ARCHIL_MOUNT_ROOT;\n }\n\n if (\n normalized === ARCHIL_MOUNT_ROOT ||\n normalized.startsWith(`${ARCHIL_MOUNT_ROOT}/`)\n ) {\n return normalized;\n }\n\n return `${ARCHIL_MOUNT_ROOT}${normalized}`;\n}\n\nfunction withDiskWriteLockCommand(command: string): string {\n const mountRoot = shellEscape(ARCHIL_MOUNT_ROOT);\n return [\n `archil checkout --force --yes ${mountRoot}`,\n `{ ${command}; status=$?; archil checkin ${mountRoot}; checkin_status=$?; ` +\n `if [ $status -ne 0 ]; then exit $status; fi; exit $checkin_status; }`,\n ].join(' && ');\n}\n\nfunction withDiskWriteLock(sandbox: ArchilSandbox, command: string): string {\n // Sandbox VMs have a dedicated disk — no shared-mode checkout needed.\n if (sandbox.vm) return command;\n return withDiskWriteLockCommand(command);\n}\n\nfunction execCommandBytes(command: string): number {\n return Buffer.byteLength(wrapCommand(command), 'utf8');\n}\n\nfunction buildWriteChunkCommand(\n parent: string,\n tempPath: string,\n diskPath: string,\n encodedChunk: string,\n isFirst: boolean,\n isFinal: boolean,\n): string {\n const writeCommand =\n `printf %s ${shellEscape(encodedChunk)} | base64 -d ` +\n `${isFirst ? '>' : '>>'} ${shellEscape(tempPath)}`;\n return [\n ...(isFirst ? [`mkdir -p ${shellEscape(parent)}`] : []),\n writeCommand,\n ...(isFinal\n ? [finalizeStagedFileCommand(tempPath, diskPath)]\n : []),\n ].join(' && ');\n}\n\nfunction finalizeStagedFileCommand(tempPath: string, diskPath: string): string {\n const quotedDestination = shellEscape(diskPath);\n return [\n `if [ -d ${quotedDestination} ]; then`,\n `printf '%s\\\\n' ${shellEscape(`Refusing to overwrite directory ${diskPath}`)} >&2;`,\n 'exit 1;',\n 'fi;',\n `mv ${shellEscape(tempPath)} ${quotedDestination}`,\n ].join(' ');\n}\n\nfunction maxWriteChunkSize(\n parent: string,\n tempPath: string,\n diskPath: string,\n): number {\n let low = 0;\n let high = ARCHIL_MAX_EXEC_COMMAND_BYTES;\n\n while (low < high) {\n const candidate = Math.ceil((low + high) / 2);\n const command = withDiskWriteLockCommand(\n buildWriteChunkCommand(\n parent,\n tempPath,\n diskPath,\n 'A'.repeat(candidate),\n true,\n true,\n ),\n );\n\n if (execCommandBytes(command) <= ARCHIL_MAX_EXEC_COMMAND_BYTES) {\n low = candidate;\n } else {\n high = candidate - 1;\n }\n }\n\n const chunkSize = low - (low % 4);\n if (chunkSize < 4) {\n throw new Error(\n `Archil filesystem path is too long to write within the ${ARCHIL_MAX_EXEC_COMMAND_BYTES}-byte exec command limit.`,\n );\n }\n return chunkSize;\n}\n\nfunction wrapCommand(command: string, options?: RunCommandOptions): string {\n let wrapped = command;\n\n const envEntries = Object.entries(options?.env ?? {});\n if (!envEntries.some(([key]) => key === 'HOME')) {\n envEntries.unshift(['HOME', process.env.HOME || '/tmp']);\n }\n const envPrefix = envEntries\n .map(([k, v]) => `${k}=${shellEscape(String(v))}`)\n .join(' ');\n wrapped = `${envPrefix} ${wrapped}`;\n\n if (options?.cwd) {\n wrapped = `cd ${shellEscape(options.cwd)} && ${wrapped}`;\n }\n\n if (options?.background) {\n wrapped = `nohup sh -c ${shellEscape(wrapped)} > /dev/null 2>&1 &`;\n }\n\n return wrapped;\n}\n\nasync function execOnDisk(sandbox: ArchilSandbox, command: string): Promise<ExecResponse> {\n return sandbox.client.disks.exec(sandbox.disk.id, command);\n}\n\nfunction wrapSandboxCommand(command: string, options?: RunCommandOptions): string {\n let wrapped = command;\n if (options?.cwd) {\n wrapped = `cd ${shellEscape(options.cwd)} && ${wrapped}`;\n }\n if (options?.background) {\n wrapped = `nohup sh -c ${shellEscape(wrapped)} > /dev/null 2>&1 &`;\n }\n return wrapped;\n}\n\nasync function ensureVmRunning(vm: ArchilVm): Promise<void> {\n // Refresh first: status on this handle is a local snapshot and goes stale\n // when the sandbox is paused/stopped remotely or hits its TTL.\n await vm.refresh();\n if (vm.status === 'running') return;\n if (vm.status === 'paused') {\n await vm.resume();\n } else if (vm.status === 'stopped' || vm.status === 'exited') {\n await vm.start();\n }\n}\n\n// Archil rejects deleting a live sandbox, so stop it first.\nasync function stopAndDeleteVm(vm: ArchilVm): Promise<void> {\n if (vm.status === 'deleting' || vm.status === 'deleted') return;\n if (vm.status !== 'stopped' && vm.status !== 'exited' && vm.status !== 'failed') {\n await vm.stop();\n }\n await vm.delete();\n}\n\nfunction toSandboxRequest(options?: ArchilCreateOptions): ArchilSandboxRequest {\n const request: ArchilSandboxRequest = {\n ...options?.sandbox,\n name: options?.name,\n baseImage: options?.baseImage ?? options?.image ?? options?.templateId,\n env: options?.env ?? options?.envs,\n vcpuCount: options?.vcpus ?? options?.cpu ?? options?.cpus,\n memSizeMiB: options?.memoryMiB ?? options?.memory,\n };\n if (options?.maxTtlSeconds !== undefined) {\n request.maxTtlSeconds = options.maxTtlSeconds;\n } else if (options?.timeout !== undefined) {\n // CreateSandboxOptions.timeout is milliseconds; Archil's TTL is seconds.\n request.maxTtlSeconds = Math.ceil(options.timeout / 1000);\n }\n return request;\n}\n\n// Records each sandbox's effective execution mode so `destroy` — which only\n// receives an id — deletes persistent VMs even when the mode came from a\n// per-sandbox `ephemeral` override rather than the provider config.\nconst sandboxModes = new Map<string, ArchilExecutionMode>();\n\nconst _provider = defineProvider<ArchilSandbox, ArchilConfig>({\n name: 'archil',\n methods: {\n sandbox: {\n create: async (config: ArchilConfig, options?: ArchilCreateOptions) => {\n const resolved = resolveConfig(config);\n const client = createClient(config, resolved);\n\n // `ephemeral` on create() overrides the configured default for this\n // sandbox: true -> serverless exec handle, false -> persistent VM.\n const execution =\n options?.ephemeral !== undefined\n ? options.ephemeral\n ? 'exec'\n : 'persistent'\n : resolved.execution;\n\n if (options?.snapshotId && options?.ephemeral === true) {\n throw new Error(\n 'Archil cannot combine ephemeral: true with snapshotId — snapshots fork persistent VMs. Drop ephemeral or set it to false.',\n );\n }\n\n // snapshotId forks a new VM from that snapshot's state — Archil\n // models snapshots as isolated writable branches of a source\n // sandbox — so it always takes the VM path regardless of the\n // configured execution mode.\n if (execution === 'persistent' || options?.snapshotId) {\n let vm: ArchilVm;\n if (options?.snapshotId) {\n vm = await forkSandboxVm(client, options.snapshotId, options?.name);\n } else if (options?.sandboxId) {\n // Attach to a live sandbox. Refuse an abort signal here: the\n // sandbox manager destroys a resolved sandbox after an abort,\n // which would delete a sandbox this call did not create.\n if (options?.signal) {\n throw new Error(\n 'create({ sandboxId }) attaches to an existing sandbox and cannot be combined with an abort signal',\n );\n }\n vm = await client.sandboxes.get(options.sandboxId);\n await ensureVmRunning(vm);\n } else {\n vm = await client.sandboxes.create(toSandboxRequest(options), {\n wait: true,\n });\n }\n sandboxModes.set(vm.id, 'persistent');\n return {\n sandbox: {\n client,\n disk: { id: vm.id },\n vm,\n resolved,\n createdAt: new Date(),\n },\n sandboxId: vm.id,\n };\n }\n\n const diskId = resolveCreateDiskId(options);\n sandboxModes.set(diskId, 'exec');\n return {\n sandbox: {\n client,\n disk: { id: diskId },\n resolved,\n createdAt: new Date(),\n },\n sandboxId: diskId,\n };\n },\n\n getById: async (config: ArchilConfig, sandboxId: string) => {\n const resolved = resolveConfig(config);\n const client = createClient(config, resolved);\n try {\n if (resolved.execution === 'persistent') {\n const vm = await client.sandboxes.get(sandboxId);\n await ensureVmRunning(vm);\n return {\n sandbox: {\n client,\n disk: { id: vm.id },\n vm,\n resolved,\n createdAt: new Date(),\n },\n sandboxId: vm.id,\n };\n }\n const disk = await client.disks.get(sandboxId);\n return {\n sandbox: { client, disk, resolved, createdAt: new Date() },\n sandboxId: disk.id,\n };\n } catch {\n return null;\n }\n },\n\n list: async (config: ArchilConfig) => {\n const resolved = resolveConfig(config);\n const client = createClient(config, resolved);\n if (resolved.execution === 'persistent') {\n const vms = await client.sandboxes.list();\n return vms.map((vm) => ({\n sandbox: {\n client,\n disk: { id: vm.id },\n vm,\n resolved,\n createdAt: new Date(),\n },\n sandboxId: vm.id,\n }));\n }\n const disks = await client.disks.list();\n return disks.map((disk) => ({\n sandbox: { client, disk, resolved, createdAt: new Date() },\n sandboxId: disk.id,\n }));\n },\n\n destroy: async (config: ArchilConfig, sandboxId: string) => {\n const resolved = resolveConfig(config);\n const mode = sandboxModes.get(sandboxId) ?? resolved.execution;\n if (mode === 'persistent') {\n const client = createClient(config, resolved);\n const vm = await client.sandboxes.get(sandboxId);\n await stopAndDeleteVm(vm);\n }\n // exec handles are disk references — Archil disks have an independent\n // lifecycle, so destroying them is a no-op. Unknown ids fall back to\n // the configured mode.\n sandboxModes.delete(sandboxId);\n },\n\n\n runCommand: async (\n sandbox: ArchilSandbox,\n command: string,\n options?: RunCommandOptions,\n ): Promise<CommandResult> => {\n const startTime = Date.now();\n try {\n if (sandbox.vm) {\n // The process API fetches a fresh short-lived WebSocket\n // connection URL per process start, so expiry is handled by the\n // underlying client.\n await ensureVmRunning(sandbox.vm);\n const wrapped = wrapSandboxCommand(command, options);\n if (options?.background) {\n const proc = await sandbox.vm.processes.start(wrapped, {\n env: options?.env,\n });\n await proc.disconnect();\n return {\n stdout: '',\n stderr: '',\n exitCode: 0,\n durationMs: Date.now() - startTime,\n };\n }\n const result = await sandbox.vm.exec(wrapped, {\n env: options?.env,\n timeoutSeconds:\n options?.timeout !== undefined\n ? Math.ceil(options.timeout / 1000)\n : undefined,\n });\n return {\n stdout: result.stdout,\n stderr: result.stderr,\n exitCode:\n result.exitCode ?? (result.status === 'completed' ? 0 : 1),\n durationMs: Date.now() - startTime,\n };\n }\n\n const result = await execOnDisk(sandbox, wrapCommand(command, options));\n return {\n stdout: result.stdout ?? '',\n stderr: result.stderr ?? '',\n exitCode: result.exitCode,\n durationMs: Date.now() - startTime,\n };\n } catch (error) {\n return {\n stdout: '',\n stderr: error instanceof Error ? error.message : String(error),\n exitCode: 1,\n durationMs: Date.now() - startTime,\n };\n }\n },\n\n getInfo: async (sandbox: ArchilSandbox): Promise<SandboxInfo> => {\n if (sandbox.vm) {\n const vm = sandbox.vm;\n return {\n id: vm.id,\n provider: 'archil',\n status:\n vm.status === 'running'\n ? 'running'\n : vm.status === 'failed'\n ? 'error'\n : 'stopped',\n createdAt: vm.createdAt,\n timeout: vm.maxTtlSeconds * 1000,\n metadata: {\n name: vm.name,\n archilStatus: vm.status,\n vcpuCount: vm.vcpuCount,\n memSizeMiB: vm.memSizeMiB,\n baseImage: vm.baseImage,\n platform: vm.platform,\n },\n };\n }\n const diskInfo = 'status' in sandbox.disk ? sandbox.disk : undefined;\n return {\n id: sandbox.disk.id,\n provider: 'archil',\n status: !diskInfo || diskInfo.status === 'ready' ? 'running' : 'stopped',\n createdAt: diskInfo ? new Date(diskInfo.createdAt) : sandbox.createdAt,\n timeout: 0,\n metadata: diskInfo\n ? {\n name: diskInfo.name,\n organization: diskInfo.organization,\n region: diskInfo.region,\n provider: diskInfo.provider,\n }\n : {},\n };\n },\n\n getUrl: async (\n sandbox: ArchilSandbox,\n options: { port: number; protocol?: string },\n ): Promise<string> => {\n if (sandbox.vm) {\n await sandbox.vm.refresh();\n const endpoint = sandbox.vm.endpoints?.find(\n (e) => e.port === options.port,\n );\n if (!endpoint) {\n throw new Error(\n `No endpoint exposed on port ${options.port} for Archil sandbox ${sandbox.vm.id}.`,\n );\n }\n return `${options.protocol ?? 'https'}://${endpoint.hostname}`;\n }\n throw new Error(\n `Archil exec runs each command in a fresh ephemeral container that exits when the command returns, ` +\n `so there is no long-lived process to expose port ${options.port} on. ` +\n `getUrl is not supported.`,\n );\n },\n\n filesystem: {\n readFile: async (sandbox, path, runCommand) => {\n if (sandbox.vm) {\n const chunks: Buffer[] = [];\n try {\n await sandbox.vm.files.downloadFile(path, (chunk) => {\n chunks.push(Buffer.from(chunk));\n });\n } catch (error) {\n throw new Error(\n `Failed to read ${path}: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n return Buffer.concat(chunks).toString('utf8');\n }\n const diskPath = mapFilesystemPath(sandbox, path);\n const sizeResult = await runCommand(\n sandbox,\n `wc -c < ${shellEscape(diskPath)}`,\n );\n if (sizeResult.exitCode !== 0) {\n throw new Error(`Failed to read ${path}: ${sizeResult.stderr}`);\n }\n\n const sizeText = sizeResult.stdout.trim();\n if (!/^\\d+$/.test(sizeText)) {\n throw new Error(\n `Failed to read ${path}: Archil returned an invalid file size.`,\n );\n }\n\n const size = Number(sizeText);\n if (!Number.isSafeInteger(size)) {\n throw new Error(\n `Failed to read ${path}: file size exceeds JavaScript's safe integer range.`,\n );\n }\n if (size === 0) return '';\n\n const chunks: Buffer[] = [];\n for (\n let offset = 0;\n offset < size;\n offset += ARCHIL_MAX_READ_CHUNK_BYTES\n ) {\n const expectedBytes = Math.min(\n ARCHIL_MAX_READ_CHUNK_BYTES,\n size - offset,\n );\n const result = await runCommand(\n sandbox,\n `dd if=${shellEscape(diskPath)} bs=1 skip=${offset} count=${expectedBytes} 2>/dev/null | base64`,\n );\n if (result.exitCode !== 0) {\n throw new Error(`Failed to read ${path}: ${result.stderr}`);\n }\n\n const encoded = result.stdout.replace(/\\s/g, '');\n if (\n encoded.length === 0 ||\n encoded.length % 4 !== 0 ||\n !/^[A-Za-z0-9+/]*={0,2}$/.test(encoded)\n ) {\n throw new Error(\n `Failed to read ${path}: Archil returned an incomplete file chunk at byte ${offset}.`,\n );\n }\n\n const chunk = Buffer.from(encoded, 'base64');\n if (chunk.length !== expectedBytes) {\n throw new Error(\n `Failed to read ${path}: Archil returned an incomplete file chunk at byte ${offset}.`,\n );\n }\n chunks.push(chunk);\n }\n\n return Buffer.concat(chunks).toString('utf8');\n },\n\n writeFile: async (sandbox, path, content, runCommand) => {\n if (sandbox.vm) {\n try {\n await sandbox.vm.files.uploadFile(\n Buffer.from(content, 'utf8'),\n path,\n );\n } catch (error) {\n throw new Error(\n `Failed to write ${path}: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n return;\n }\n const diskPath = mapFilesystemPath(sandbox, path);\n const parent = posix.dirname(diskPath);\n const encoded = Buffer.from(content, 'utf8').toString('base64');\n const tempPath = `${diskPath}.computesdk-write-${randomUUID()}`;\n let started = false;\n\n try {\n if (encoded.length === 0) {\n started = true;\n const result = await runCommand(\n sandbox,\n withDiskWriteLock(\n sandbox,\n [\n `mkdir -p ${shellEscape(parent)}`,\n `: > ${shellEscape(tempPath)}`,\n finalizeStagedFileCommand(tempPath, diskPath),\n ].join(' && '),\n ),\n );\n if (result.exitCode !== 0) {\n throw new Error(result.stderr);\n }\n return;\n }\n\n const chunkSize = maxWriteChunkSize(parent, tempPath, diskPath);\n for (let offset = 0; offset < encoded.length; offset += chunkSize) {\n const isFirst = offset === 0;\n const isFinal = offset + chunkSize >= encoded.length;\n started = true;\n const result = await runCommand(\n sandbox,\n withDiskWriteLock(\n sandbox,\n buildWriteChunkCommand(\n parent,\n tempPath,\n diskPath,\n encoded.slice(offset, offset + chunkSize),\n isFirst,\n isFinal,\n ),\n ),\n );\n if (result.exitCode !== 0) {\n throw new Error(result.stderr);\n }\n }\n } catch (error) {\n if (started) {\n try {\n await runCommand(\n sandbox,\n withDiskWriteLock(sandbox, `rm -f ${shellEscape(tempPath)}`),\n );\n } catch {\n // Preserve the original write error if cleanup fails.\n }\n }\n throw new Error(\n `Failed to write ${path}: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n },\n\n mkdir: async (sandbox, path, runCommand) => {\n const diskPath = mapFilesystemPath(sandbox, path);\n const result = await runCommand(\n sandbox,\n withDiskWriteLock(sandbox, `mkdir -p ${shellEscape(diskPath)}`),\n );\n if (result.exitCode !== 0) {\n throw new Error(`Failed to create directory ${path}: ${result.stderr}`);\n }\n },\n\n readdir: async (sandbox, path, runCommand) => {\n const diskPath = mapFilesystemPath(sandbox, path);\n // Tab-separated: type<TAB>size<TAB>mtime-iso<TAB>name. Robust to spaces in names.\n const result = await runCommand(\n sandbox,\n `find ${shellEscape(diskPath)} -mindepth 1 -maxdepth 1 -printf '%y\\t%s\\t%T@\\t%f\\n'`,\n );\n if (result.exitCode !== 0) {\n throw new Error(`Failed to list directory ${path}: ${result.stderr}`);\n }\n const entries: FileEntry[] = [];\n for (const line of result.stdout.split('\\n')) {\n if (!line) continue;\n const [typeChar, sizeStr, mtimeStr, ...nameParts] = line.split('\\t');\n const name = nameParts.join('\\t');\n entries.push({\n name,\n type: typeChar === 'd' ? 'directory' : 'file',\n size: parseInt(sizeStr, 10) || 0,\n modified: new Date(parseFloat(mtimeStr) * 1000),\n });\n }\n return entries;\n },\n\n exists: async (sandbox, path, runCommand) => {\n const diskPath = mapFilesystemPath(sandbox, path);\n const result = await runCommand(sandbox, `test -e ${shellEscape(diskPath)}`);\n return result.exitCode === 0;\n },\n\n remove: async (sandbox, path, runCommand) => {\n const diskPath = mapFilesystemPath(sandbox, path);\n if (!sandbox.vm && diskPath === ARCHIL_MOUNT_ROOT) {\n throw new Error('Refusing to remove the Archil disk mount root.');\n }\n const result = await runCommand(\n sandbox,\n withDiskWriteLock(sandbox, `rm -rf ${shellEscape(diskPath)}`),\n );\n if (result.exitCode !== 0) {\n throw new Error(`Failed to remove ${path}: ${result.stderr}`);\n }\n },\n },\n\n getInstance: (sandbox: ArchilSandbox): ArchilSandbox => sandbox,\n },\n\n // Archil has no separate snapshot resource: a \"snapshot\" is a sandbox\n // fork (an isolated writable branch of the source sandbox's state), so\n // snapshot ids are ordinary sandbox ids that create() forks again.\n snapshot: {\n create: async (\n config: ArchilConfig,\n sandboxId: string,\n options?: { name?: string },\n ) => {\n const resolved = resolveConfig(config);\n const client = createClient(config, resolved);\n try {\n const fork = await forkSandboxVm(client, sandboxId, options?.name);\n return {\n id: fork.id,\n provider: 'archil',\n createdAt: fork.createdAt ?? new Date(),\n metadata: { name: fork.name },\n };\n } catch (error) {\n throw new Error(\n `Failed to create Archil snapshot: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n },\n\n list: async (_config: ArchilConfig) => {\n throw new Error(\n 'Archil provider does not support listing snapshots.',\n );\n },\n\n delete: async (config: ArchilConfig, snapshotId: string) => {\n const resolved = resolveConfig(config);\n const client = createClient(config, resolved);\n let vm: ArchilVm;\n try {\n vm = await client.sandboxes.get(snapshotId);\n } catch (error) {\n if (error instanceof ArchilError && error.status === 404) return;\n throw error;\n }\n await stopAndDeleteVm(vm);\n },\n },\n },\n});\n\nexport const archil = (config: ArchilConfig = {}) => _provider(config);\n\nexport type { ArchilSandbox };\n"],"mappings":"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","names":["ArchilClient","result","chunks"]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["/**\n * Archil Provider\n *\n * Supports Archil's two compute surfaces, selected by `execution`:\n *\n * - \"exec\" (default): each command runs in an Archil-managed ephemeral\n * container with the configured disk mounted, then returns stdout, stderr,\n * and exit code. \"create\" resolves a handle to an existing disk id; env,\n * cwd, and installs do not persist between commands.\n * - \"persistent\": `create` provisions an Archil sandbox — a persistent Linux\n * VM with a dedicated disk. `runCommand` uses the sandbox's interactive\n * process API (a short-lived WebSocket connection fetched fresh per command\n * via POST /api/sandboxes/{id}/connections), so filesystem state, installed\n * tools, and background processes persist across commands.\n */\n\nimport { defineProvider } from '@computesdk/provider';\nimport { Archil as ArchilClient, ArchilError } from 'disk';\nimport type {\n CreateSandboxRequest as ArchilSandboxRequest,\n Sandbox as ArchilVm,\n} from 'disk';\nimport { randomUUID } from 'node:crypto';\nimport { posix } from 'node:path';\nimport type {\n CommandResult,\n InstanceInfo,\n CreateInstanceOptions,\n FileEntry,\n RunCommandOptions,\n} from 'computesdk';\n\nconst ARCHIL_MOUNT_ROOT = '/mnt/archil';\nconst ARCHIL_MAX_EXEC_COMMAND_BYTES = 102_400;\n// Base64 expands the file data and adds line wrapping. Keep the raw chunk\n// comfortably below Archil's roughly 4 MiB response cap.\nconst ARCHIL_MAX_READ_CHUNK_BYTES = 2 * 1024 * 1024;\n\n// Per-region color overrides. Default is \"green\" for any region not listed here.\nconst REGION_COLORS: Record<string, string> = {\n 'gcp-us-central1': 'blue',\n};\n\nfunction regionToBaseUrl(region: string): string {\n const dash = region.indexOf('-');\n if (dash <= 0 || dash === region.length - 1) {\n throw new Error(\n `Invalid Archil region \"${region}\". Expected \"{cloud}-{suffix}\", e.g. \"aws-us-east-1\".`,\n );\n }\n const cloud = region.slice(0, dash);\n const suffix = region.slice(dash + 1);\n const color = REGION_COLORS[region] ?? 'green';\n return `https://control.${color}.${suffix}.${cloud}.prod.archil.com`;\n}\n\n/**\n * Archil execution mode:\n * - \"exec\": serverless per-command containers on a disk (default).\n * - \"persistent\": a persistent sandbox VM run through the process API.\n */\nexport type ArchilExecutionMode = 'exec' | 'persistent';\n\nexport interface ArchilConfig {\n /** Archil API key. Falls back to ARCHIL_API_KEY env var. */\n apiKey?: string;\n /** Archil region (e.g. \"aws-us-east-1\"). Falls back to ARCHIL_REGION env var. */\n region?: string;\n /** Override the control-plane base URL (useful for testing). */\n baseUrl?: string;\n /**\n * Which Archil compute surface to use. Defaults to \"exec\". In\n * \"persistent\" mode create() provisions a persistent sandbox VM instead of\n * resolving a disk handle. Per-sandbox override: `ephemeral` on\n * create() options (true -> exec handle, false -> persistent VM).\n */\n execution?: ArchilExecutionMode;\n}\n\ninterface DiskResponse {\n id: string;\n name: string;\n organization: string;\n status: string;\n provider: string;\n region: string;\n createdAt: string;\n}\n\ntype DiskHandle = Pick<DiskResponse, 'id'>;\n\ninterface ExecTiming {\n totalMs: number;\n queueMs: number;\n executeMs: number;\n}\n\ninterface ExecResponse {\n exitCode: number;\n stdout: string;\n stderr: string;\n timing: ExecTiming;\n}\n\ninterface ResolvedConfig {\n apiKey: string;\n baseUrl: string;\n execution: ArchilExecutionMode;\n}\n\ninterface ArchilSandbox {\n client: ArchilClient;\n disk: DiskHandle | DiskResponse;\n /** Set only in \"persistent\" execution mode. */\n vm?: ArchilVm;\n resolved: ResolvedConfig;\n createdAt: Date;\n}\n\ninterface ArchilCreateOptions extends CreateInstanceOptions {\n /**\n * exec mode: id of the existing disk to run commands against. Required in\n * \"exec\" mode; ignored in \"persistent\" mode.\n */\n diskId?: string;\n /** persistent mode: OCI base image (e.g. \"node:24-bookworm\"). */\n baseImage?: string;\n /** persistent mode: environment variables baked into the sandbox. */\n env?: Record<string, string>;\n /** persistent mode: lifetime budget per powered-on session, in seconds. */\n maxTtlSeconds?: number;\n /** persistent mode: extra Archil sandbox fields (network policy, etc.). */\n sandbox?: Omit<\n ArchilSandboxRequest,\n 'name' | 'vcpuCount' | 'memSizeMiB' | 'baseImage' | 'env' | 'maxTtlSeconds'\n >;\n}\n\nfunction resolveConfig(config: ArchilConfig): ResolvedConfig {\n const apiKey = config.apiKey ?? process.env.ARCHIL_API_KEY;\n const region = config.region ?? process.env.ARCHIL_REGION;\n\n if (!apiKey) {\n throw new Error(\n 'Missing API key for Archil.\\n\\n' +\n 'Pass it: archil({ apiKey: \"...\" })\\n' +\n 'Or set ARCHIL_API_KEY in your environment.',\n );\n }\n\n let baseUrl = config.baseUrl;\n if (!baseUrl) {\n if (!region) {\n throw new Error(\n 'Missing region for Archil.\\n\\n' +\n 'Pass it: archil({ region: \"...\" })\\n' +\n 'Or set ARCHIL_REGION in your environment.\\n' +\n 'Examples: \"aws-us-east-1\", \"aws-eu-west-1\", \"gcp-us-central1\".',\n );\n }\n baseUrl = regionToBaseUrl(region);\n }\n\n return { apiKey, baseUrl, execution: config.execution ?? 'exec' };\n}\n\nfunction createClient(config: ArchilConfig, resolved: ResolvedConfig): ArchilClient {\n const region = config.region ?? process.env.ARCHIL_REGION ?? 'aws-us-east-1';\n return new ArchilClient({ ...resolved, region });\n}\n\nfunction resolveCreateDiskId(options?: ArchilCreateOptions): string {\n // `sandboxId` is accepted as an alias: exec-mode sandboxes are addressed by\n // their disk id.\n const diskId = options?.diskId ?? options?.sandboxId;\n\n if (!diskId) {\n throw new Error(\n 'Archil create() requires an existing disk id on the top-level options.\\n\\n' +\n 'Example:\\n' +\n ' provider.sandbox.create({ diskId: \"disk_abc123\" })',\n );\n }\n\n return diskId;\n}\n\nasync function forkSandboxVm(\n client: ArchilClient,\n sourceId: string,\n name?: string,\n): Promise<ArchilVm> {\n const source = await client.sandboxes.get(sourceId);\n return source.fork({ name });\n}\n\nfunction shellEscape(value: string): string {\n return `'${value.replace(/'/g, `'\\\\''`)}'`;\n}\n\nfunction mapFilesystemPath(sandbox: ArchilSandbox, path: string): string {\n const normalized = posix.normalize(path.startsWith('/') ? path : `/${path}`);\n\n // In persistent mode the filesystem is the VM's own filesystem.\n if (sandbox.vm) {\n return normalized;\n }\n\n if (normalized === '/') {\n return ARCHIL_MOUNT_ROOT;\n }\n\n if (\n normalized === ARCHIL_MOUNT_ROOT ||\n normalized.startsWith(`${ARCHIL_MOUNT_ROOT}/`)\n ) {\n return normalized;\n }\n\n return `${ARCHIL_MOUNT_ROOT}${normalized}`;\n}\n\nfunction withDiskWriteLockCommand(command: string): string {\n const mountRoot = shellEscape(ARCHIL_MOUNT_ROOT);\n return [\n `archil checkout --force --yes ${mountRoot}`,\n `{ ${command}; status=$?; archil checkin ${mountRoot}; checkin_status=$?; ` +\n `if [ $status -ne 0 ]; then exit $status; fi; exit $checkin_status; }`,\n ].join(' && ');\n}\n\nfunction withDiskWriteLock(sandbox: ArchilSandbox, command: string): string {\n // Sandbox VMs have a dedicated disk — no shared-mode checkout needed.\n if (sandbox.vm) return command;\n return withDiskWriteLockCommand(command);\n}\n\nfunction execCommandBytes(command: string): number {\n return Buffer.byteLength(wrapCommand(command), 'utf8');\n}\n\nfunction buildWriteChunkCommand(\n parent: string,\n tempPath: string,\n diskPath: string,\n encodedChunk: string,\n isFirst: boolean,\n isFinal: boolean,\n): string {\n const writeCommand =\n `printf %s ${shellEscape(encodedChunk)} | base64 -d ` +\n `${isFirst ? '>' : '>>'} ${shellEscape(tempPath)}`;\n return [\n ...(isFirst ? [`mkdir -p ${shellEscape(parent)}`] : []),\n writeCommand,\n ...(isFinal\n ? [finalizeStagedFileCommand(tempPath, diskPath)]\n : []),\n ].join(' && ');\n}\n\nfunction finalizeStagedFileCommand(tempPath: string, diskPath: string): string {\n const quotedDestination = shellEscape(diskPath);\n return [\n `if [ -d ${quotedDestination} ]; then`,\n `printf '%s\\\\n' ${shellEscape(`Refusing to overwrite directory ${diskPath}`)} >&2;`,\n 'exit 1;',\n 'fi;',\n `mv ${shellEscape(tempPath)} ${quotedDestination}`,\n ].join(' ');\n}\n\nfunction maxWriteChunkSize(\n parent: string,\n tempPath: string,\n diskPath: string,\n): number {\n let low = 0;\n let high = ARCHIL_MAX_EXEC_COMMAND_BYTES;\n\n while (low < high) {\n const candidate = Math.ceil((low + high) / 2);\n const command = withDiskWriteLockCommand(\n buildWriteChunkCommand(\n parent,\n tempPath,\n diskPath,\n 'A'.repeat(candidate),\n true,\n true,\n ),\n );\n\n if (execCommandBytes(command) <= ARCHIL_MAX_EXEC_COMMAND_BYTES) {\n low = candidate;\n } else {\n high = candidate - 1;\n }\n }\n\n const chunkSize = low - (low % 4);\n if (chunkSize < 4) {\n throw new Error(\n `Archil filesystem path is too long to write within the ${ARCHIL_MAX_EXEC_COMMAND_BYTES}-byte exec command limit.`,\n );\n }\n return chunkSize;\n}\n\nfunction wrapCommand(command: string, options?: RunCommandOptions): string {\n let wrapped = command;\n\n const envEntries = Object.entries(options?.env ?? {});\n if (!envEntries.some(([key]) => key === 'HOME')) {\n envEntries.unshift(['HOME', process.env.HOME || '/tmp']);\n }\n const envPrefix = envEntries\n .map(([k, v]) => `${k}=${shellEscape(String(v))}`)\n .join(' ');\n wrapped = `${envPrefix} ${wrapped}`;\n\n if (options?.cwd) {\n wrapped = `cd ${shellEscape(options.cwd)} && ${wrapped}`;\n }\n\n if (options?.background) {\n wrapped = `nohup sh -c ${shellEscape(wrapped)} > /dev/null 2>&1 &`;\n }\n\n return wrapped;\n}\n\nasync function execOnDisk(sandbox: ArchilSandbox, command: string): Promise<ExecResponse> {\n return sandbox.client.disks.exec(sandbox.disk.id, command);\n}\n\nfunction wrapSandboxCommand(command: string, options?: RunCommandOptions): string {\n let wrapped = command;\n if (options?.cwd) {\n wrapped = `cd ${shellEscape(options.cwd)} && ${wrapped}`;\n }\n if (options?.background) {\n wrapped = `nohup sh -c ${shellEscape(wrapped)} > /dev/null 2>&1 &`;\n }\n return wrapped;\n}\n\nasync function ensureVmRunning(vm: ArchilVm): Promise<void> {\n // Refresh first: status on this handle is a local snapshot and goes stale\n // when the sandbox is paused/stopped remotely or hits its TTL.\n await vm.refresh();\n if (vm.status === 'running') return;\n if (vm.status === 'paused') {\n await vm.resume();\n } else if (vm.status === 'stopped' || vm.status === 'exited') {\n await vm.start();\n }\n}\n\n// Archil rejects deleting a live sandbox, so stop it first.\nasync function stopAndDeleteVm(vm: ArchilVm): Promise<void> {\n if (vm.status === 'deleting' || vm.status === 'deleted') return;\n if (vm.status !== 'stopped' && vm.status !== 'exited' && vm.status !== 'failed') {\n await vm.stop();\n }\n await vm.delete();\n}\n\nfunction toSandboxRequest(options?: ArchilCreateOptions): ArchilSandboxRequest {\n const request: ArchilSandboxRequest = {\n ...options?.sandbox,\n name: options?.name,\n baseImage: options?.baseImage ?? options?.image ?? options?.templateId,\n env: options?.env ?? options?.envs,\n vcpuCount: options?.vcpus ?? options?.cpu ?? options?.cpus,\n memSizeMiB: options?.memoryMiB ?? options?.memory,\n };\n if (options?.maxTtlSeconds !== undefined) {\n request.maxTtlSeconds = options.maxTtlSeconds;\n } else if (options?.timeout !== undefined) {\n // CreateInstanceOptions.timeout is milliseconds; Archil's TTL is seconds.\n request.maxTtlSeconds = Math.ceil(options.timeout / 1000);\n }\n return request;\n}\n\n// Records each sandbox's effective execution mode so `destroy` — which only\n// receives an id — deletes persistent VMs even when the mode came from a\n// per-sandbox `ephemeral` override rather than the provider config.\nconst sandboxModes = new Map<string, ArchilExecutionMode>();\n\nconst _provider = defineProvider<ArchilSandbox, ArchilConfig>({\n name: 'archil',\n methods: {\n instances: {\n create: async (config: ArchilConfig, options?: ArchilCreateOptions) => {\n const resolved = resolveConfig(config);\n const client = createClient(config, resolved);\n\n // `ephemeral` on create() overrides the configured default for this\n // sandbox: true -> serverless exec handle, false -> persistent VM.\n const execution =\n options?.ephemeral !== undefined\n ? options.ephemeral\n ? 'exec'\n : 'persistent'\n : resolved.execution;\n\n if (options?.snapshotId && options?.ephemeral === true) {\n throw new Error(\n 'Archil cannot combine ephemeral: true with snapshotId — snapshots fork persistent VMs. Drop ephemeral or set it to false.',\n );\n }\n\n // snapshotId forks a new VM from that snapshot's state — Archil\n // models snapshots as isolated writable branches of a source\n // sandbox — so it always takes the VM path regardless of the\n // configured execution mode.\n if (execution === 'persistent' || options?.snapshotId) {\n let vm: ArchilVm;\n if (options?.snapshotId) {\n vm = await forkSandboxVm(client, options.snapshotId, options?.name);\n } else if (options?.sandboxId) {\n // Attach to a live sandbox. Refuse an abort signal here: the\n // sandbox manager destroys a resolved sandbox after an abort,\n // which would delete a sandbox this call did not create.\n if (options?.signal) {\n throw new Error(\n 'create({ sandboxId }) attaches to an existing sandbox and cannot be combined with an abort signal',\n );\n }\n vm = await client.sandboxes.get(options.sandboxId);\n await ensureVmRunning(vm);\n } else {\n vm = await client.sandboxes.create(toSandboxRequest(options), {\n wait: true,\n });\n }\n sandboxModes.set(vm.id, 'persistent');\n return { instance: {\n client,\n disk: { id: vm.id },\n vm,\n resolved,\n createdAt: new Date(),\n }, instanceId: vm.id,\n };\n }\n\n const diskId = resolveCreateDiskId(options);\n sandboxModes.set(diskId, 'exec');\n return { instance: {\n client,\n disk: { id: diskId },\n resolved,\n createdAt: new Date(),\n }, instanceId: diskId,\n };\n },\n\n getById: async (config: ArchilConfig, sandboxId: string) => {\n const resolved = resolveConfig(config);\n const client = createClient(config, resolved);\n try {\n if (resolved.execution === 'persistent') {\n const vm = await client.sandboxes.get(sandboxId);\n await ensureVmRunning(vm);\n return { instance: {\n client,\n disk: { id: vm.id },\n vm,\n resolved,\n createdAt: new Date(),\n }, instanceId: vm.id,\n };\n }\n const disk = await client.disks.get(sandboxId);\n return { instance: { client, disk, resolved, createdAt: new Date() }, instanceId: disk.id,\n };\n } catch {\n return null;\n }\n },\n\n list: async (config: ArchilConfig) => {\n const resolved = resolveConfig(config);\n const client = createClient(config, resolved);\n if (resolved.execution === 'persistent') {\n const vms = await client.sandboxes.list();\n return vms.map((vm) => ({ instance: {\n client,\n disk: { id: vm.id },\n vm,\n resolved,\n createdAt: new Date(),\n }, instanceId: vm.id,\n }));\n }\n const disks = await client.disks.list();\n return disks.map((disk) => ({ instance: { client, disk, resolved, createdAt: new Date() }, instanceId: disk.id,\n }));\n },\n\n destroy: async (config: ArchilConfig, sandboxId: string) => {\n const resolved = resolveConfig(config);\n const mode = sandboxModes.get(sandboxId) ?? resolved.execution;\n if (mode === 'persistent') {\n const client = createClient(config, resolved);\n const vm = await client.sandboxes.get(sandboxId);\n await stopAndDeleteVm(vm);\n }\n // exec handles are disk references — Archil disks have an independent\n // lifecycle, so destroying them is a no-op. Unknown ids fall back to\n // the configured mode.\n sandboxModes.delete(sandboxId);\n },\n\n\n runCommand: async (\n sandbox: ArchilSandbox,\n command: string,\n options?: RunCommandOptions,\n ): Promise<CommandResult> => {\n const startTime = Date.now();\n try {\n if (sandbox.vm) {\n // The process API fetches a fresh short-lived WebSocket\n // connection URL per process start, so expiry is handled by the\n // underlying client.\n await ensureVmRunning(sandbox.vm);\n const wrapped = wrapSandboxCommand(command, options);\n if (options?.background) {\n const proc = await sandbox.vm.processes.start(wrapped, {\n env: options?.env,\n });\n await proc.disconnect();\n return {\n stdout: '',\n stderr: '',\n exitCode: 0,\n durationMs: Date.now() - startTime,\n };\n }\n const result = await sandbox.vm.exec(wrapped, {\n env: options?.env,\n timeoutSeconds:\n options?.timeout !== undefined\n ? Math.ceil(options.timeout / 1000)\n : undefined,\n });\n return {\n stdout: result.stdout,\n stderr: result.stderr,\n exitCode:\n result.exitCode ?? (result.status === 'completed' ? 0 : 1),\n durationMs: Date.now() - startTime,\n };\n }\n\n const result = await execOnDisk(sandbox, wrapCommand(command, options));\n return {\n stdout: result.stdout ?? '',\n stderr: result.stderr ?? '',\n exitCode: result.exitCode,\n durationMs: Date.now() - startTime,\n };\n } catch (error) {\n return {\n stdout: '',\n stderr: error instanceof Error ? error.message : String(error),\n exitCode: 1,\n durationMs: Date.now() - startTime,\n };\n }\n },\n\n getInfo: async (sandbox: ArchilSandbox): Promise<InstanceInfo> => {\n if (sandbox.vm) {\n const vm = sandbox.vm;\n return {\n id: vm.id,\n provider: 'archil',\n status:\n vm.status === 'running'\n ? 'running'\n : vm.status === 'failed'\n ? 'error'\n : 'stopped',\n createdAt: vm.createdAt,\n timeout: vm.maxTtlSeconds * 1000,\n metadata: {\n name: vm.name,\n archilStatus: vm.status,\n vcpuCount: vm.vcpuCount,\n memSizeMiB: vm.memSizeMiB,\n baseImage: vm.baseImage,\n platform: vm.platform,\n },\n };\n }\n const diskInfo = 'status' in sandbox.disk ? sandbox.disk : undefined;\n return {\n id: sandbox.disk.id,\n provider: 'archil',\n status: !diskInfo || diskInfo.status === 'ready' ? 'running' : 'stopped',\n createdAt: diskInfo ? new Date(diskInfo.createdAt) : sandbox.createdAt,\n timeout: 0,\n metadata: diskInfo\n ? {\n name: diskInfo.name,\n organization: diskInfo.organization,\n region: diskInfo.region,\n provider: diskInfo.provider,\n }\n : {},\n };\n },\n\n getUrl: async (\n sandbox: ArchilSandbox,\n options: { port: number; protocol?: string },\n ): Promise<string> => {\n if (sandbox.vm) {\n await sandbox.vm.refresh();\n const endpoint = sandbox.vm.endpoints?.find(\n (e) => e.port === options.port,\n );\n if (!endpoint) {\n throw new Error(\n `No endpoint exposed on port ${options.port} for Archil sandbox ${sandbox.vm.id}.`,\n );\n }\n return `${options.protocol ?? 'https'}://${endpoint.hostname}`;\n }\n throw new Error(\n `Archil exec runs each command in a fresh ephemeral container that exits when the command returns, ` +\n `so there is no long-lived process to expose port ${options.port} on. ` +\n `getUrl is not supported.`,\n );\n },\n\n filesystem: {\n readFile: async (sandbox, path, runCommand) => {\n if (sandbox.vm) {\n const chunks: Buffer[] = [];\n try {\n await sandbox.vm.files.downloadFile(path, (chunk) => {\n chunks.push(Buffer.from(chunk));\n });\n } catch (error) {\n throw new Error(\n `Failed to read ${path}: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n return Buffer.concat(chunks).toString('utf8');\n }\n const diskPath = mapFilesystemPath(sandbox, path);\n const sizeResult = await runCommand(\n sandbox,\n `wc -c < ${shellEscape(diskPath)}`,\n );\n if (sizeResult.exitCode !== 0) {\n throw new Error(`Failed to read ${path}: ${sizeResult.stderr}`);\n }\n\n const sizeText = sizeResult.stdout.trim();\n if (!/^\\d+$/.test(sizeText)) {\n throw new Error(\n `Failed to read ${path}: Archil returned an invalid file size.`,\n );\n }\n\n const size = Number(sizeText);\n if (!Number.isSafeInteger(size)) {\n throw new Error(\n `Failed to read ${path}: file size exceeds JavaScript's safe integer range.`,\n );\n }\n if (size === 0) return '';\n\n const chunks: Buffer[] = [];\n for (\n let offset = 0;\n offset < size;\n offset += ARCHIL_MAX_READ_CHUNK_BYTES\n ) {\n const expectedBytes = Math.min(\n ARCHIL_MAX_READ_CHUNK_BYTES,\n size - offset,\n );\n const result = await runCommand(\n sandbox,\n `dd if=${shellEscape(diskPath)} bs=1 skip=${offset} count=${expectedBytes} 2>/dev/null | base64`,\n );\n if (result.exitCode !== 0) {\n throw new Error(`Failed to read ${path}: ${result.stderr}`);\n }\n\n const encoded = result.stdout.replace(/\\s/g, '');\n if (\n encoded.length === 0 ||\n encoded.length % 4 !== 0 ||\n !/^[A-Za-z0-9+/]*={0,2}$/.test(encoded)\n ) {\n throw new Error(\n `Failed to read ${path}: Archil returned an incomplete file chunk at byte ${offset}.`,\n );\n }\n\n const chunk = Buffer.from(encoded, 'base64');\n if (chunk.length !== expectedBytes) {\n throw new Error(\n `Failed to read ${path}: Archil returned an incomplete file chunk at byte ${offset}.`,\n );\n }\n chunks.push(chunk);\n }\n\n return Buffer.concat(chunks).toString('utf8');\n },\n\n writeFile: async (sandbox, path, content, runCommand) => {\n if (sandbox.vm) {\n try {\n await sandbox.vm.files.uploadFile(\n Buffer.from(content, 'utf8'),\n path,\n );\n } catch (error) {\n throw new Error(\n `Failed to write ${path}: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n return;\n }\n const diskPath = mapFilesystemPath(sandbox, path);\n const parent = posix.dirname(diskPath);\n const encoded = Buffer.from(content, 'utf8').toString('base64');\n const tempPath = `${diskPath}.computesdk-write-${randomUUID()}`;\n let started = false;\n\n try {\n if (encoded.length === 0) {\n started = true;\n const result = await runCommand(\n sandbox,\n withDiskWriteLock(\n sandbox,\n [\n `mkdir -p ${shellEscape(parent)}`,\n `: > ${shellEscape(tempPath)}`,\n finalizeStagedFileCommand(tempPath, diskPath),\n ].join(' && '),\n ),\n );\n if (result.exitCode !== 0) {\n throw new Error(result.stderr);\n }\n return;\n }\n\n const chunkSize = maxWriteChunkSize(parent, tempPath, diskPath);\n for (let offset = 0; offset < encoded.length; offset += chunkSize) {\n const isFirst = offset === 0;\n const isFinal = offset + chunkSize >= encoded.length;\n started = true;\n const result = await runCommand(\n sandbox,\n withDiskWriteLock(\n sandbox,\n buildWriteChunkCommand(\n parent,\n tempPath,\n diskPath,\n encoded.slice(offset, offset + chunkSize),\n isFirst,\n isFinal,\n ),\n ),\n );\n if (result.exitCode !== 0) {\n throw new Error(result.stderr);\n }\n }\n } catch (error) {\n if (started) {\n try {\n await runCommand(\n sandbox,\n withDiskWriteLock(sandbox, `rm -f ${shellEscape(tempPath)}`),\n );\n } catch {\n // Preserve the original write error if cleanup fails.\n }\n }\n throw new Error(\n `Failed to write ${path}: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n },\n\n mkdir: async (sandbox, path, runCommand) => {\n const diskPath = mapFilesystemPath(sandbox, path);\n const result = await runCommand(\n sandbox,\n withDiskWriteLock(sandbox, `mkdir -p ${shellEscape(diskPath)}`),\n );\n if (result.exitCode !== 0) {\n throw new Error(`Failed to create directory ${path}: ${result.stderr}`);\n }\n },\n\n readdir: async (sandbox, path, runCommand) => {\n const diskPath = mapFilesystemPath(sandbox, path);\n // Tab-separated: type<TAB>size<TAB>mtime-iso<TAB>name. Robust to spaces in names.\n const result = await runCommand(\n sandbox,\n `find ${shellEscape(diskPath)} -mindepth 1 -maxdepth 1 -printf '%y\\t%s\\t%T@\\t%f\\n'`,\n );\n if (result.exitCode !== 0) {\n throw new Error(`Failed to list directory ${path}: ${result.stderr}`);\n }\n const entries: FileEntry[] = [];\n for (const line of result.stdout.split('\\n')) {\n if (!line) continue;\n const [typeChar, sizeStr, mtimeStr, ...nameParts] = line.split('\\t');\n const name = nameParts.join('\\t');\n entries.push({\n name,\n type: typeChar === 'd' ? 'directory' : 'file',\n size: parseInt(sizeStr, 10) || 0,\n modified: new Date(parseFloat(mtimeStr) * 1000),\n });\n }\n return entries;\n },\n\n exists: async (sandbox, path, runCommand) => {\n const diskPath = mapFilesystemPath(sandbox, path);\n const result = await runCommand(sandbox, `test -e ${shellEscape(diskPath)}`);\n return result.exitCode === 0;\n },\n\n remove: async (sandbox, path, runCommand) => {\n const diskPath = mapFilesystemPath(sandbox, path);\n if (!sandbox.vm && diskPath === ARCHIL_MOUNT_ROOT) {\n throw new Error('Refusing to remove the Archil disk mount root.');\n }\n const result = await runCommand(\n sandbox,\n withDiskWriteLock(sandbox, `rm -rf ${shellEscape(diskPath)}`),\n );\n if (result.exitCode !== 0) {\n throw new Error(`Failed to remove ${path}: ${result.stderr}`);\n }\n },\n },\n\n getInstance: (sandbox: ArchilSandbox): ArchilSandbox => sandbox,\n },\n\n // Archil has no separate snapshot resource: a \"snapshot\" is a sandbox\n // fork (an isolated writable branch of the source sandbox's state), so\n // snapshot ids are ordinary sandbox ids that create() forks again.\n snapshot: {\n create: async (\n config: ArchilConfig,\n sandboxId: string,\n options?: { name?: string },\n ) => {\n const resolved = resolveConfig(config);\n const client = createClient(config, resolved);\n try {\n const fork = await forkSandboxVm(client, sandboxId, options?.name);\n return {\n id: fork.id,\n provider: 'archil',\n createdAt: fork.createdAt ?? new Date(),\n metadata: { name: fork.name },\n };\n } catch (error) {\n throw new Error(\n `Failed to create Archil snapshot: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n },\n\n list: async (_config: ArchilConfig) => {\n throw new Error(\n 'Archil provider does not support listing snapshots.',\n );\n },\n\n delete: async (config: ArchilConfig, snapshotId: string) => {\n const resolved = resolveConfig(config);\n const client = createClient(config, resolved);\n let vm: ArchilVm;\n try {\n vm = await client.sandboxes.get(snapshotId);\n } catch (error) {\n if (error instanceof ArchilError && error.status === 404) return;\n throw error;\n }\n await stopAndDeleteVm(vm);\n },\n },\n },\n});\n\nexport const archil = (config: ArchilConfig = {}) => _provider(config);\n\nexport type { ArchilSandbox };\n"],"mappings":"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","names":["ArchilClient","result","chunks"]}
package/dist/index.mjs CHANGED
@@ -199,7 +199,7 @@ var sandboxModes = /* @__PURE__ */ new Map();
199
199
  var _provider = defineProvider({
200
200
  name: "archil",
201
201
  methods: {
202
- sandbox: {
202
+ instances: {
203
203
  create: async (config, options) => {
204
204
  const resolved = resolveConfig(config);
205
205
  const client = createClient(config, resolved);
@@ -228,26 +228,26 @@ var _provider = defineProvider({
228
228
  }
229
229
  sandboxModes.set(vm.id, "persistent");
230
230
  return {
231
- sandbox: {
231
+ instance: {
232
232
  client,
233
233
  disk: { id: vm.id },
234
234
  vm,
235
235
  resolved,
236
236
  createdAt: /* @__PURE__ */ new Date()
237
237
  },
238
- sandboxId: vm.id
238
+ instanceId: vm.id
239
239
  };
240
240
  }
241
241
  const diskId = resolveCreateDiskId(options);
242
242
  sandboxModes.set(diskId, "exec");
243
243
  return {
244
- sandbox: {
244
+ instance: {
245
245
  client,
246
246
  disk: { id: diskId },
247
247
  resolved,
248
248
  createdAt: /* @__PURE__ */ new Date()
249
249
  },
250
- sandboxId: diskId
250
+ instanceId: diskId
251
251
  };
252
252
  },
253
253
  getById: async (config, sandboxId) => {
@@ -258,20 +258,20 @@ var _provider = defineProvider({
258
258
  const vm = await client.sandboxes.get(sandboxId);
259
259
  await ensureVmRunning(vm);
260
260
  return {
261
- sandbox: {
261
+ instance: {
262
262
  client,
263
263
  disk: { id: vm.id },
264
264
  vm,
265
265
  resolved,
266
266
  createdAt: /* @__PURE__ */ new Date()
267
267
  },
268
- sandboxId: vm.id
268
+ instanceId: vm.id
269
269
  };
270
270
  }
271
271
  const disk = await client.disks.get(sandboxId);
272
272
  return {
273
- sandbox: { client, disk, resolved, createdAt: /* @__PURE__ */ new Date() },
274
- sandboxId: disk.id
273
+ instance: { client, disk, resolved, createdAt: /* @__PURE__ */ new Date() },
274
+ instanceId: disk.id
275
275
  };
276
276
  } catch {
277
277
  return null;
@@ -283,20 +283,20 @@ var _provider = defineProvider({
283
283
  if (resolved.execution === "persistent") {
284
284
  const vms = await client.sandboxes.list();
285
285
  return vms.map((vm) => ({
286
- sandbox: {
286
+ instance: {
287
287
  client,
288
288
  disk: { id: vm.id },
289
289
  vm,
290
290
  resolved,
291
291
  createdAt: /* @__PURE__ */ new Date()
292
292
  },
293
- sandboxId: vm.id
293
+ instanceId: vm.id
294
294
  }));
295
295
  }
296
296
  const disks = await client.disks.list();
297
297
  return disks.map((disk) => ({
298
- sandbox: { client, disk, resolved, createdAt: /* @__PURE__ */ new Date() },
299
- sandboxId: disk.id
298
+ instance: { client, disk, resolved, createdAt: /* @__PURE__ */ new Date() },
299
+ instanceId: disk.id
300
300
  }));
301
301
  },
302
302
  destroy: async (config, sandboxId) => {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["/**\n * Archil Provider\n *\n * Supports Archil's two compute surfaces, selected by `execution`:\n *\n * - \"exec\" (default): each command runs in an Archil-managed ephemeral\n * container with the configured disk mounted, then returns stdout, stderr,\n * and exit code. \"create\" resolves a handle to an existing disk id; env,\n * cwd, and installs do not persist between commands.\n * - \"persistent\": `create` provisions an Archil sandbox — a persistent Linux\n * VM with a dedicated disk. `runCommand` uses the sandbox's interactive\n * process API (a short-lived WebSocket connection fetched fresh per command\n * via POST /api/sandboxes/{id}/connections), so filesystem state, installed\n * tools, and background processes persist across commands.\n */\n\nimport { defineProvider } from '@computesdk/provider';\nimport { Archil as ArchilClient, ArchilError } from 'disk';\nimport type {\n CreateSandboxRequest as ArchilSandboxRequest,\n Sandbox as ArchilVm,\n} from 'disk';\nimport { randomUUID } from 'node:crypto';\nimport { posix } from 'node:path';\nimport type {\n CommandResult,\n SandboxInfo,\n CreateSandboxOptions,\n FileEntry,\n RunCommandOptions,\n} from 'computesdk';\n\nconst ARCHIL_MOUNT_ROOT = '/mnt/archil';\nconst ARCHIL_MAX_EXEC_COMMAND_BYTES = 102_400;\n// Base64 expands the file data and adds line wrapping. Keep the raw chunk\n// comfortably below Archil's roughly 4 MiB response cap.\nconst ARCHIL_MAX_READ_CHUNK_BYTES = 2 * 1024 * 1024;\n\n// Per-region color overrides. Default is \"green\" for any region not listed here.\nconst REGION_COLORS: Record<string, string> = {\n 'gcp-us-central1': 'blue',\n};\n\nfunction regionToBaseUrl(region: string): string {\n const dash = region.indexOf('-');\n if (dash <= 0 || dash === region.length - 1) {\n throw new Error(\n `Invalid Archil region \"${region}\". Expected \"{cloud}-{suffix}\", e.g. \"aws-us-east-1\".`,\n );\n }\n const cloud = region.slice(0, dash);\n const suffix = region.slice(dash + 1);\n const color = REGION_COLORS[region] ?? 'green';\n return `https://control.${color}.${suffix}.${cloud}.prod.archil.com`;\n}\n\n/**\n * Archil execution mode:\n * - \"exec\": serverless per-command containers on a disk (default).\n * - \"persistent\": a persistent sandbox VM run through the process API.\n */\nexport type ArchilExecutionMode = 'exec' | 'persistent';\n\nexport interface ArchilConfig {\n /** Archil API key. Falls back to ARCHIL_API_KEY env var. */\n apiKey?: string;\n /** Archil region (e.g. \"aws-us-east-1\"). Falls back to ARCHIL_REGION env var. */\n region?: string;\n /** Override the control-plane base URL (useful for testing). */\n baseUrl?: string;\n /**\n * Which Archil compute surface to use. Defaults to \"exec\". In\n * \"persistent\" mode create() provisions a persistent sandbox VM instead of\n * resolving a disk handle. Per-sandbox override: `ephemeral` on\n * create() options (true -> exec handle, false -> persistent VM).\n */\n execution?: ArchilExecutionMode;\n}\n\ninterface DiskResponse {\n id: string;\n name: string;\n organization: string;\n status: string;\n provider: string;\n region: string;\n createdAt: string;\n}\n\ntype DiskHandle = Pick<DiskResponse, 'id'>;\n\ninterface ExecTiming {\n totalMs: number;\n queueMs: number;\n executeMs: number;\n}\n\ninterface ExecResponse {\n exitCode: number;\n stdout: string;\n stderr: string;\n timing: ExecTiming;\n}\n\ninterface ResolvedConfig {\n apiKey: string;\n baseUrl: string;\n execution: ArchilExecutionMode;\n}\n\ninterface ArchilSandbox {\n client: ArchilClient;\n disk: DiskHandle | DiskResponse;\n /** Set only in \"persistent\" execution mode. */\n vm?: ArchilVm;\n resolved: ResolvedConfig;\n createdAt: Date;\n}\n\ninterface ArchilCreateOptions extends CreateSandboxOptions {\n /**\n * exec mode: id of the existing disk to run commands against. Required in\n * \"exec\" mode; ignored in \"persistent\" mode.\n */\n diskId?: string;\n /** persistent mode: OCI base image (e.g. \"node:24-bookworm\"). */\n baseImage?: string;\n /** persistent mode: environment variables baked into the sandbox. */\n env?: Record<string, string>;\n /** persistent mode: lifetime budget per powered-on session, in seconds. */\n maxTtlSeconds?: number;\n /** persistent mode: extra Archil sandbox fields (network policy, etc.). */\n sandbox?: Omit<\n ArchilSandboxRequest,\n 'name' | 'vcpuCount' | 'memSizeMiB' | 'baseImage' | 'env' | 'maxTtlSeconds'\n >;\n}\n\nfunction resolveConfig(config: ArchilConfig): ResolvedConfig {\n const apiKey = config.apiKey ?? process.env.ARCHIL_API_KEY;\n const region = config.region ?? process.env.ARCHIL_REGION;\n\n if (!apiKey) {\n throw new Error(\n 'Missing API key for Archil.\\n\\n' +\n 'Pass it: archil({ apiKey: \"...\" })\\n' +\n 'Or set ARCHIL_API_KEY in your environment.',\n );\n }\n\n let baseUrl = config.baseUrl;\n if (!baseUrl) {\n if (!region) {\n throw new Error(\n 'Missing region for Archil.\\n\\n' +\n 'Pass it: archil({ region: \"...\" })\\n' +\n 'Or set ARCHIL_REGION in your environment.\\n' +\n 'Examples: \"aws-us-east-1\", \"aws-eu-west-1\", \"gcp-us-central1\".',\n );\n }\n baseUrl = regionToBaseUrl(region);\n }\n\n return { apiKey, baseUrl, execution: config.execution ?? 'exec' };\n}\n\nfunction createClient(config: ArchilConfig, resolved: ResolvedConfig): ArchilClient {\n const region = config.region ?? process.env.ARCHIL_REGION ?? 'aws-us-east-1';\n return new ArchilClient({ ...resolved, region });\n}\n\nfunction resolveCreateDiskId(options?: ArchilCreateOptions): string {\n // `sandboxId` is accepted as an alias: exec-mode sandboxes are addressed by\n // their disk id.\n const diskId = options?.diskId ?? options?.sandboxId;\n\n if (!diskId) {\n throw new Error(\n 'Archil create() requires an existing disk id on the top-level options.\\n\\n' +\n 'Example:\\n' +\n ' provider.sandbox.create({ diskId: \"disk_abc123\" })',\n );\n }\n\n return diskId;\n}\n\nasync function forkSandboxVm(\n client: ArchilClient,\n sourceId: string,\n name?: string,\n): Promise<ArchilVm> {\n const source = await client.sandboxes.get(sourceId);\n return source.fork({ name });\n}\n\nfunction shellEscape(value: string): string {\n return `'${value.replace(/'/g, `'\\\\''`)}'`;\n}\n\nfunction mapFilesystemPath(sandbox: ArchilSandbox, path: string): string {\n const normalized = posix.normalize(path.startsWith('/') ? path : `/${path}`);\n\n // In persistent mode the filesystem is the VM's own filesystem.\n if (sandbox.vm) {\n return normalized;\n }\n\n if (normalized === '/') {\n return ARCHIL_MOUNT_ROOT;\n }\n\n if (\n normalized === ARCHIL_MOUNT_ROOT ||\n normalized.startsWith(`${ARCHIL_MOUNT_ROOT}/`)\n ) {\n return normalized;\n }\n\n return `${ARCHIL_MOUNT_ROOT}${normalized}`;\n}\n\nfunction withDiskWriteLockCommand(command: string): string {\n const mountRoot = shellEscape(ARCHIL_MOUNT_ROOT);\n return [\n `archil checkout --force --yes ${mountRoot}`,\n `{ ${command}; status=$?; archil checkin ${mountRoot}; checkin_status=$?; ` +\n `if [ $status -ne 0 ]; then exit $status; fi; exit $checkin_status; }`,\n ].join(' && ');\n}\n\nfunction withDiskWriteLock(sandbox: ArchilSandbox, command: string): string {\n // Sandbox VMs have a dedicated disk — no shared-mode checkout needed.\n if (sandbox.vm) return command;\n return withDiskWriteLockCommand(command);\n}\n\nfunction execCommandBytes(command: string): number {\n return Buffer.byteLength(wrapCommand(command), 'utf8');\n}\n\nfunction buildWriteChunkCommand(\n parent: string,\n tempPath: string,\n diskPath: string,\n encodedChunk: string,\n isFirst: boolean,\n isFinal: boolean,\n): string {\n const writeCommand =\n `printf %s ${shellEscape(encodedChunk)} | base64 -d ` +\n `${isFirst ? '>' : '>>'} ${shellEscape(tempPath)}`;\n return [\n ...(isFirst ? [`mkdir -p ${shellEscape(parent)}`] : []),\n writeCommand,\n ...(isFinal\n ? [finalizeStagedFileCommand(tempPath, diskPath)]\n : []),\n ].join(' && ');\n}\n\nfunction finalizeStagedFileCommand(tempPath: string, diskPath: string): string {\n const quotedDestination = shellEscape(diskPath);\n return [\n `if [ -d ${quotedDestination} ]; then`,\n `printf '%s\\\\n' ${shellEscape(`Refusing to overwrite directory ${diskPath}`)} >&2;`,\n 'exit 1;',\n 'fi;',\n `mv ${shellEscape(tempPath)} ${quotedDestination}`,\n ].join(' ');\n}\n\nfunction maxWriteChunkSize(\n parent: string,\n tempPath: string,\n diskPath: string,\n): number {\n let low = 0;\n let high = ARCHIL_MAX_EXEC_COMMAND_BYTES;\n\n while (low < high) {\n const candidate = Math.ceil((low + high) / 2);\n const command = withDiskWriteLockCommand(\n buildWriteChunkCommand(\n parent,\n tempPath,\n diskPath,\n 'A'.repeat(candidate),\n true,\n true,\n ),\n );\n\n if (execCommandBytes(command) <= ARCHIL_MAX_EXEC_COMMAND_BYTES) {\n low = candidate;\n } else {\n high = candidate - 1;\n }\n }\n\n const chunkSize = low - (low % 4);\n if (chunkSize < 4) {\n throw new Error(\n `Archil filesystem path is too long to write within the ${ARCHIL_MAX_EXEC_COMMAND_BYTES}-byte exec command limit.`,\n );\n }\n return chunkSize;\n}\n\nfunction wrapCommand(command: string, options?: RunCommandOptions): string {\n let wrapped = command;\n\n const envEntries = Object.entries(options?.env ?? {});\n if (!envEntries.some(([key]) => key === 'HOME')) {\n envEntries.unshift(['HOME', process.env.HOME || '/tmp']);\n }\n const envPrefix = envEntries\n .map(([k, v]) => `${k}=${shellEscape(String(v))}`)\n .join(' ');\n wrapped = `${envPrefix} ${wrapped}`;\n\n if (options?.cwd) {\n wrapped = `cd ${shellEscape(options.cwd)} && ${wrapped}`;\n }\n\n if (options?.background) {\n wrapped = `nohup sh -c ${shellEscape(wrapped)} > /dev/null 2>&1 &`;\n }\n\n return wrapped;\n}\n\nasync function execOnDisk(sandbox: ArchilSandbox, command: string): Promise<ExecResponse> {\n return sandbox.client.disks.exec(sandbox.disk.id, command);\n}\n\nfunction wrapSandboxCommand(command: string, options?: RunCommandOptions): string {\n let wrapped = command;\n if (options?.cwd) {\n wrapped = `cd ${shellEscape(options.cwd)} && ${wrapped}`;\n }\n if (options?.background) {\n wrapped = `nohup sh -c ${shellEscape(wrapped)} > /dev/null 2>&1 &`;\n }\n return wrapped;\n}\n\nasync function ensureVmRunning(vm: ArchilVm): Promise<void> {\n // Refresh first: status on this handle is a local snapshot and goes stale\n // when the sandbox is paused/stopped remotely or hits its TTL.\n await vm.refresh();\n if (vm.status === 'running') return;\n if (vm.status === 'paused') {\n await vm.resume();\n } else if (vm.status === 'stopped' || vm.status === 'exited') {\n await vm.start();\n }\n}\n\n// Archil rejects deleting a live sandbox, so stop it first.\nasync function stopAndDeleteVm(vm: ArchilVm): Promise<void> {\n if (vm.status === 'deleting' || vm.status === 'deleted') return;\n if (vm.status !== 'stopped' && vm.status !== 'exited' && vm.status !== 'failed') {\n await vm.stop();\n }\n await vm.delete();\n}\n\nfunction toSandboxRequest(options?: ArchilCreateOptions): ArchilSandboxRequest {\n const request: ArchilSandboxRequest = {\n ...options?.sandbox,\n name: options?.name,\n baseImage: options?.baseImage ?? options?.image ?? options?.templateId,\n env: options?.env ?? options?.envs,\n vcpuCount: options?.vcpus ?? options?.cpu ?? options?.cpus,\n memSizeMiB: options?.memoryMiB ?? options?.memory,\n };\n if (options?.maxTtlSeconds !== undefined) {\n request.maxTtlSeconds = options.maxTtlSeconds;\n } else if (options?.timeout !== undefined) {\n // CreateSandboxOptions.timeout is milliseconds; Archil's TTL is seconds.\n request.maxTtlSeconds = Math.ceil(options.timeout / 1000);\n }\n return request;\n}\n\n// Records each sandbox's effective execution mode so `destroy` — which only\n// receives an id — deletes persistent VMs even when the mode came from a\n// per-sandbox `ephemeral` override rather than the provider config.\nconst sandboxModes = new Map<string, ArchilExecutionMode>();\n\nconst _provider = defineProvider<ArchilSandbox, ArchilConfig>({\n name: 'archil',\n methods: {\n sandbox: {\n create: async (config: ArchilConfig, options?: ArchilCreateOptions) => {\n const resolved = resolveConfig(config);\n const client = createClient(config, resolved);\n\n // `ephemeral` on create() overrides the configured default for this\n // sandbox: true -> serverless exec handle, false -> persistent VM.\n const execution =\n options?.ephemeral !== undefined\n ? options.ephemeral\n ? 'exec'\n : 'persistent'\n : resolved.execution;\n\n if (options?.snapshotId && options?.ephemeral === true) {\n throw new Error(\n 'Archil cannot combine ephemeral: true with snapshotId — snapshots fork persistent VMs. Drop ephemeral or set it to false.',\n );\n }\n\n // snapshotId forks a new VM from that snapshot's state — Archil\n // models snapshots as isolated writable branches of a source\n // sandbox — so it always takes the VM path regardless of the\n // configured execution mode.\n if (execution === 'persistent' || options?.snapshotId) {\n let vm: ArchilVm;\n if (options?.snapshotId) {\n vm = await forkSandboxVm(client, options.snapshotId, options?.name);\n } else if (options?.sandboxId) {\n // Attach to a live sandbox. Refuse an abort signal here: the\n // sandbox manager destroys a resolved sandbox after an abort,\n // which would delete a sandbox this call did not create.\n if (options?.signal) {\n throw new Error(\n 'create({ sandboxId }) attaches to an existing sandbox and cannot be combined with an abort signal',\n );\n }\n vm = await client.sandboxes.get(options.sandboxId);\n await ensureVmRunning(vm);\n } else {\n vm = await client.sandboxes.create(toSandboxRequest(options), {\n wait: true,\n });\n }\n sandboxModes.set(vm.id, 'persistent');\n return {\n sandbox: {\n client,\n disk: { id: vm.id },\n vm,\n resolved,\n createdAt: new Date(),\n },\n sandboxId: vm.id,\n };\n }\n\n const diskId = resolveCreateDiskId(options);\n sandboxModes.set(diskId, 'exec');\n return {\n sandbox: {\n client,\n disk: { id: diskId },\n resolved,\n createdAt: new Date(),\n },\n sandboxId: diskId,\n };\n },\n\n getById: async (config: ArchilConfig, sandboxId: string) => {\n const resolved = resolveConfig(config);\n const client = createClient(config, resolved);\n try {\n if (resolved.execution === 'persistent') {\n const vm = await client.sandboxes.get(sandboxId);\n await ensureVmRunning(vm);\n return {\n sandbox: {\n client,\n disk: { id: vm.id },\n vm,\n resolved,\n createdAt: new Date(),\n },\n sandboxId: vm.id,\n };\n }\n const disk = await client.disks.get(sandboxId);\n return {\n sandbox: { client, disk, resolved, createdAt: new Date() },\n sandboxId: disk.id,\n };\n } catch {\n return null;\n }\n },\n\n list: async (config: ArchilConfig) => {\n const resolved = resolveConfig(config);\n const client = createClient(config, resolved);\n if (resolved.execution === 'persistent') {\n const vms = await client.sandboxes.list();\n return vms.map((vm) => ({\n sandbox: {\n client,\n disk: { id: vm.id },\n vm,\n resolved,\n createdAt: new Date(),\n },\n sandboxId: vm.id,\n }));\n }\n const disks = await client.disks.list();\n return disks.map((disk) => ({\n sandbox: { client, disk, resolved, createdAt: new Date() },\n sandboxId: disk.id,\n }));\n },\n\n destroy: async (config: ArchilConfig, sandboxId: string) => {\n const resolved = resolveConfig(config);\n const mode = sandboxModes.get(sandboxId) ?? resolved.execution;\n if (mode === 'persistent') {\n const client = createClient(config, resolved);\n const vm = await client.sandboxes.get(sandboxId);\n await stopAndDeleteVm(vm);\n }\n // exec handles are disk references — Archil disks have an independent\n // lifecycle, so destroying them is a no-op. Unknown ids fall back to\n // the configured mode.\n sandboxModes.delete(sandboxId);\n },\n\n\n runCommand: async (\n sandbox: ArchilSandbox,\n command: string,\n options?: RunCommandOptions,\n ): Promise<CommandResult> => {\n const startTime = Date.now();\n try {\n if (sandbox.vm) {\n // The process API fetches a fresh short-lived WebSocket\n // connection URL per process start, so expiry is handled by the\n // underlying client.\n await ensureVmRunning(sandbox.vm);\n const wrapped = wrapSandboxCommand(command, options);\n if (options?.background) {\n const proc = await sandbox.vm.processes.start(wrapped, {\n env: options?.env,\n });\n await proc.disconnect();\n return {\n stdout: '',\n stderr: '',\n exitCode: 0,\n durationMs: Date.now() - startTime,\n };\n }\n const result = await sandbox.vm.exec(wrapped, {\n env: options?.env,\n timeoutSeconds:\n options?.timeout !== undefined\n ? Math.ceil(options.timeout / 1000)\n : undefined,\n });\n return {\n stdout: result.stdout,\n stderr: result.stderr,\n exitCode:\n result.exitCode ?? (result.status === 'completed' ? 0 : 1),\n durationMs: Date.now() - startTime,\n };\n }\n\n const result = await execOnDisk(sandbox, wrapCommand(command, options));\n return {\n stdout: result.stdout ?? '',\n stderr: result.stderr ?? '',\n exitCode: result.exitCode,\n durationMs: Date.now() - startTime,\n };\n } catch (error) {\n return {\n stdout: '',\n stderr: error instanceof Error ? error.message : String(error),\n exitCode: 1,\n durationMs: Date.now() - startTime,\n };\n }\n },\n\n getInfo: async (sandbox: ArchilSandbox): Promise<SandboxInfo> => {\n if (sandbox.vm) {\n const vm = sandbox.vm;\n return {\n id: vm.id,\n provider: 'archil',\n status:\n vm.status === 'running'\n ? 'running'\n : vm.status === 'failed'\n ? 'error'\n : 'stopped',\n createdAt: vm.createdAt,\n timeout: vm.maxTtlSeconds * 1000,\n metadata: {\n name: vm.name,\n archilStatus: vm.status,\n vcpuCount: vm.vcpuCount,\n memSizeMiB: vm.memSizeMiB,\n baseImage: vm.baseImage,\n platform: vm.platform,\n },\n };\n }\n const diskInfo = 'status' in sandbox.disk ? sandbox.disk : undefined;\n return {\n id: sandbox.disk.id,\n provider: 'archil',\n status: !diskInfo || diskInfo.status === 'ready' ? 'running' : 'stopped',\n createdAt: diskInfo ? new Date(diskInfo.createdAt) : sandbox.createdAt,\n timeout: 0,\n metadata: diskInfo\n ? {\n name: diskInfo.name,\n organization: diskInfo.organization,\n region: diskInfo.region,\n provider: diskInfo.provider,\n }\n : {},\n };\n },\n\n getUrl: async (\n sandbox: ArchilSandbox,\n options: { port: number; protocol?: string },\n ): Promise<string> => {\n if (sandbox.vm) {\n await sandbox.vm.refresh();\n const endpoint = sandbox.vm.endpoints?.find(\n (e) => e.port === options.port,\n );\n if (!endpoint) {\n throw new Error(\n `No endpoint exposed on port ${options.port} for Archil sandbox ${sandbox.vm.id}.`,\n );\n }\n return `${options.protocol ?? 'https'}://${endpoint.hostname}`;\n }\n throw new Error(\n `Archil exec runs each command in a fresh ephemeral container that exits when the command returns, ` +\n `so there is no long-lived process to expose port ${options.port} on. ` +\n `getUrl is not supported.`,\n );\n },\n\n filesystem: {\n readFile: async (sandbox, path, runCommand) => {\n if (sandbox.vm) {\n const chunks: Buffer[] = [];\n try {\n await sandbox.vm.files.downloadFile(path, (chunk) => {\n chunks.push(Buffer.from(chunk));\n });\n } catch (error) {\n throw new Error(\n `Failed to read ${path}: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n return Buffer.concat(chunks).toString('utf8');\n }\n const diskPath = mapFilesystemPath(sandbox, path);\n const sizeResult = await runCommand(\n sandbox,\n `wc -c < ${shellEscape(diskPath)}`,\n );\n if (sizeResult.exitCode !== 0) {\n throw new Error(`Failed to read ${path}: ${sizeResult.stderr}`);\n }\n\n const sizeText = sizeResult.stdout.trim();\n if (!/^\\d+$/.test(sizeText)) {\n throw new Error(\n `Failed to read ${path}: Archil returned an invalid file size.`,\n );\n }\n\n const size = Number(sizeText);\n if (!Number.isSafeInteger(size)) {\n throw new Error(\n `Failed to read ${path}: file size exceeds JavaScript's safe integer range.`,\n );\n }\n if (size === 0) return '';\n\n const chunks: Buffer[] = [];\n for (\n let offset = 0;\n offset < size;\n offset += ARCHIL_MAX_READ_CHUNK_BYTES\n ) {\n const expectedBytes = Math.min(\n ARCHIL_MAX_READ_CHUNK_BYTES,\n size - offset,\n );\n const result = await runCommand(\n sandbox,\n `dd if=${shellEscape(diskPath)} bs=1 skip=${offset} count=${expectedBytes} 2>/dev/null | base64`,\n );\n if (result.exitCode !== 0) {\n throw new Error(`Failed to read ${path}: ${result.stderr}`);\n }\n\n const encoded = result.stdout.replace(/\\s/g, '');\n if (\n encoded.length === 0 ||\n encoded.length % 4 !== 0 ||\n !/^[A-Za-z0-9+/]*={0,2}$/.test(encoded)\n ) {\n throw new Error(\n `Failed to read ${path}: Archil returned an incomplete file chunk at byte ${offset}.`,\n );\n }\n\n const chunk = Buffer.from(encoded, 'base64');\n if (chunk.length !== expectedBytes) {\n throw new Error(\n `Failed to read ${path}: Archil returned an incomplete file chunk at byte ${offset}.`,\n );\n }\n chunks.push(chunk);\n }\n\n return Buffer.concat(chunks).toString('utf8');\n },\n\n writeFile: async (sandbox, path, content, runCommand) => {\n if (sandbox.vm) {\n try {\n await sandbox.vm.files.uploadFile(\n Buffer.from(content, 'utf8'),\n path,\n );\n } catch (error) {\n throw new Error(\n `Failed to write ${path}: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n return;\n }\n const diskPath = mapFilesystemPath(sandbox, path);\n const parent = posix.dirname(diskPath);\n const encoded = Buffer.from(content, 'utf8').toString('base64');\n const tempPath = `${diskPath}.computesdk-write-${randomUUID()}`;\n let started = false;\n\n try {\n if (encoded.length === 0) {\n started = true;\n const result = await runCommand(\n sandbox,\n withDiskWriteLock(\n sandbox,\n [\n `mkdir -p ${shellEscape(parent)}`,\n `: > ${shellEscape(tempPath)}`,\n finalizeStagedFileCommand(tempPath, diskPath),\n ].join(' && '),\n ),\n );\n if (result.exitCode !== 0) {\n throw new Error(result.stderr);\n }\n return;\n }\n\n const chunkSize = maxWriteChunkSize(parent, tempPath, diskPath);\n for (let offset = 0; offset < encoded.length; offset += chunkSize) {\n const isFirst = offset === 0;\n const isFinal = offset + chunkSize >= encoded.length;\n started = true;\n const result = await runCommand(\n sandbox,\n withDiskWriteLock(\n sandbox,\n buildWriteChunkCommand(\n parent,\n tempPath,\n diskPath,\n encoded.slice(offset, offset + chunkSize),\n isFirst,\n isFinal,\n ),\n ),\n );\n if (result.exitCode !== 0) {\n throw new Error(result.stderr);\n }\n }\n } catch (error) {\n if (started) {\n try {\n await runCommand(\n sandbox,\n withDiskWriteLock(sandbox, `rm -f ${shellEscape(tempPath)}`),\n );\n } catch {\n // Preserve the original write error if cleanup fails.\n }\n }\n throw new Error(\n `Failed to write ${path}: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n },\n\n mkdir: async (sandbox, path, runCommand) => {\n const diskPath = mapFilesystemPath(sandbox, path);\n const result = await runCommand(\n sandbox,\n withDiskWriteLock(sandbox, `mkdir -p ${shellEscape(diskPath)}`),\n );\n if (result.exitCode !== 0) {\n throw new Error(`Failed to create directory ${path}: ${result.stderr}`);\n }\n },\n\n readdir: async (sandbox, path, runCommand) => {\n const diskPath = mapFilesystemPath(sandbox, path);\n // Tab-separated: type<TAB>size<TAB>mtime-iso<TAB>name. Robust to spaces in names.\n const result = await runCommand(\n sandbox,\n `find ${shellEscape(diskPath)} -mindepth 1 -maxdepth 1 -printf '%y\\t%s\\t%T@\\t%f\\n'`,\n );\n if (result.exitCode !== 0) {\n throw new Error(`Failed to list directory ${path}: ${result.stderr}`);\n }\n const entries: FileEntry[] = [];\n for (const line of result.stdout.split('\\n')) {\n if (!line) continue;\n const [typeChar, sizeStr, mtimeStr, ...nameParts] = line.split('\\t');\n const name = nameParts.join('\\t');\n entries.push({\n name,\n type: typeChar === 'd' ? 'directory' : 'file',\n size: parseInt(sizeStr, 10) || 0,\n modified: new Date(parseFloat(mtimeStr) * 1000),\n });\n }\n return entries;\n },\n\n exists: async (sandbox, path, runCommand) => {\n const diskPath = mapFilesystemPath(sandbox, path);\n const result = await runCommand(sandbox, `test -e ${shellEscape(diskPath)}`);\n return result.exitCode === 0;\n },\n\n remove: async (sandbox, path, runCommand) => {\n const diskPath = mapFilesystemPath(sandbox, path);\n if (!sandbox.vm && diskPath === ARCHIL_MOUNT_ROOT) {\n throw new Error('Refusing to remove the Archil disk mount root.');\n }\n const result = await runCommand(\n sandbox,\n withDiskWriteLock(sandbox, `rm -rf ${shellEscape(diskPath)}`),\n );\n if (result.exitCode !== 0) {\n throw new Error(`Failed to remove ${path}: ${result.stderr}`);\n }\n },\n },\n\n getInstance: (sandbox: ArchilSandbox): ArchilSandbox => sandbox,\n },\n\n // Archil has no separate snapshot resource: a \"snapshot\" is a sandbox\n // fork (an isolated writable branch of the source sandbox's state), so\n // snapshot ids are ordinary sandbox ids that create() forks again.\n snapshot: {\n create: async (\n config: ArchilConfig,\n sandboxId: string,\n options?: { name?: string },\n ) => {\n const resolved = resolveConfig(config);\n const client = createClient(config, resolved);\n try {\n const fork = await forkSandboxVm(client, sandboxId, options?.name);\n return {\n id: fork.id,\n provider: 'archil',\n createdAt: fork.createdAt ?? new Date(),\n metadata: { name: fork.name },\n };\n } catch (error) {\n throw new Error(\n `Failed to create Archil snapshot: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n },\n\n list: async (_config: ArchilConfig) => {\n throw new Error(\n 'Archil provider does not support listing snapshots.',\n );\n },\n\n delete: async (config: ArchilConfig, snapshotId: string) => {\n const resolved = resolveConfig(config);\n const client = createClient(config, resolved);\n let vm: ArchilVm;\n try {\n vm = await client.sandboxes.get(snapshotId);\n } catch (error) {\n if (error instanceof ArchilError && error.status === 404) return;\n throw error;\n }\n await stopAndDeleteVm(vm);\n },\n },\n },\n});\n\nexport const archil = (config: ArchilConfig = {}) => _provider(config);\n\nexport type { ArchilSandbox };\n"],"mappings":"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","names":["result","chunks"]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["/**\n * Archil Provider\n *\n * Supports Archil's two compute surfaces, selected by `execution`:\n *\n * - \"exec\" (default): each command runs in an Archil-managed ephemeral\n * container with the configured disk mounted, then returns stdout, stderr,\n * and exit code. \"create\" resolves a handle to an existing disk id; env,\n * cwd, and installs do not persist between commands.\n * - \"persistent\": `create` provisions an Archil sandbox — a persistent Linux\n * VM with a dedicated disk. `runCommand` uses the sandbox's interactive\n * process API (a short-lived WebSocket connection fetched fresh per command\n * via POST /api/sandboxes/{id}/connections), so filesystem state, installed\n * tools, and background processes persist across commands.\n */\n\nimport { defineProvider } from '@computesdk/provider';\nimport { Archil as ArchilClient, ArchilError } from 'disk';\nimport type {\n CreateSandboxRequest as ArchilSandboxRequest,\n Sandbox as ArchilVm,\n} from 'disk';\nimport { randomUUID } from 'node:crypto';\nimport { posix } from 'node:path';\nimport type {\n CommandResult,\n InstanceInfo,\n CreateInstanceOptions,\n FileEntry,\n RunCommandOptions,\n} from 'computesdk';\n\nconst ARCHIL_MOUNT_ROOT = '/mnt/archil';\nconst ARCHIL_MAX_EXEC_COMMAND_BYTES = 102_400;\n// Base64 expands the file data and adds line wrapping. Keep the raw chunk\n// comfortably below Archil's roughly 4 MiB response cap.\nconst ARCHIL_MAX_READ_CHUNK_BYTES = 2 * 1024 * 1024;\n\n// Per-region color overrides. Default is \"green\" for any region not listed here.\nconst REGION_COLORS: Record<string, string> = {\n 'gcp-us-central1': 'blue',\n};\n\nfunction regionToBaseUrl(region: string): string {\n const dash = region.indexOf('-');\n if (dash <= 0 || dash === region.length - 1) {\n throw new Error(\n `Invalid Archil region \"${region}\". Expected \"{cloud}-{suffix}\", e.g. \"aws-us-east-1\".`,\n );\n }\n const cloud = region.slice(0, dash);\n const suffix = region.slice(dash + 1);\n const color = REGION_COLORS[region] ?? 'green';\n return `https://control.${color}.${suffix}.${cloud}.prod.archil.com`;\n}\n\n/**\n * Archil execution mode:\n * - \"exec\": serverless per-command containers on a disk (default).\n * - \"persistent\": a persistent sandbox VM run through the process API.\n */\nexport type ArchilExecutionMode = 'exec' | 'persistent';\n\nexport interface ArchilConfig {\n /** Archil API key. Falls back to ARCHIL_API_KEY env var. */\n apiKey?: string;\n /** Archil region (e.g. \"aws-us-east-1\"). Falls back to ARCHIL_REGION env var. */\n region?: string;\n /** Override the control-plane base URL (useful for testing). */\n baseUrl?: string;\n /**\n * Which Archil compute surface to use. Defaults to \"exec\". In\n * \"persistent\" mode create() provisions a persistent sandbox VM instead of\n * resolving a disk handle. Per-sandbox override: `ephemeral` on\n * create() options (true -> exec handle, false -> persistent VM).\n */\n execution?: ArchilExecutionMode;\n}\n\ninterface DiskResponse {\n id: string;\n name: string;\n organization: string;\n status: string;\n provider: string;\n region: string;\n createdAt: string;\n}\n\ntype DiskHandle = Pick<DiskResponse, 'id'>;\n\ninterface ExecTiming {\n totalMs: number;\n queueMs: number;\n executeMs: number;\n}\n\ninterface ExecResponse {\n exitCode: number;\n stdout: string;\n stderr: string;\n timing: ExecTiming;\n}\n\ninterface ResolvedConfig {\n apiKey: string;\n baseUrl: string;\n execution: ArchilExecutionMode;\n}\n\ninterface ArchilSandbox {\n client: ArchilClient;\n disk: DiskHandle | DiskResponse;\n /** Set only in \"persistent\" execution mode. */\n vm?: ArchilVm;\n resolved: ResolvedConfig;\n createdAt: Date;\n}\n\ninterface ArchilCreateOptions extends CreateInstanceOptions {\n /**\n * exec mode: id of the existing disk to run commands against. Required in\n * \"exec\" mode; ignored in \"persistent\" mode.\n */\n diskId?: string;\n /** persistent mode: OCI base image (e.g. \"node:24-bookworm\"). */\n baseImage?: string;\n /** persistent mode: environment variables baked into the sandbox. */\n env?: Record<string, string>;\n /** persistent mode: lifetime budget per powered-on session, in seconds. */\n maxTtlSeconds?: number;\n /** persistent mode: extra Archil sandbox fields (network policy, etc.). */\n sandbox?: Omit<\n ArchilSandboxRequest,\n 'name' | 'vcpuCount' | 'memSizeMiB' | 'baseImage' | 'env' | 'maxTtlSeconds'\n >;\n}\n\nfunction resolveConfig(config: ArchilConfig): ResolvedConfig {\n const apiKey = config.apiKey ?? process.env.ARCHIL_API_KEY;\n const region = config.region ?? process.env.ARCHIL_REGION;\n\n if (!apiKey) {\n throw new Error(\n 'Missing API key for Archil.\\n\\n' +\n 'Pass it: archil({ apiKey: \"...\" })\\n' +\n 'Or set ARCHIL_API_KEY in your environment.',\n );\n }\n\n let baseUrl = config.baseUrl;\n if (!baseUrl) {\n if (!region) {\n throw new Error(\n 'Missing region for Archil.\\n\\n' +\n 'Pass it: archil({ region: \"...\" })\\n' +\n 'Or set ARCHIL_REGION in your environment.\\n' +\n 'Examples: \"aws-us-east-1\", \"aws-eu-west-1\", \"gcp-us-central1\".',\n );\n }\n baseUrl = regionToBaseUrl(region);\n }\n\n return { apiKey, baseUrl, execution: config.execution ?? 'exec' };\n}\n\nfunction createClient(config: ArchilConfig, resolved: ResolvedConfig): ArchilClient {\n const region = config.region ?? process.env.ARCHIL_REGION ?? 'aws-us-east-1';\n return new ArchilClient({ ...resolved, region });\n}\n\nfunction resolveCreateDiskId(options?: ArchilCreateOptions): string {\n // `sandboxId` is accepted as an alias: exec-mode sandboxes are addressed by\n // their disk id.\n const diskId = options?.diskId ?? options?.sandboxId;\n\n if (!diskId) {\n throw new Error(\n 'Archil create() requires an existing disk id on the top-level options.\\n\\n' +\n 'Example:\\n' +\n ' provider.sandbox.create({ diskId: \"disk_abc123\" })',\n );\n }\n\n return diskId;\n}\n\nasync function forkSandboxVm(\n client: ArchilClient,\n sourceId: string,\n name?: string,\n): Promise<ArchilVm> {\n const source = await client.sandboxes.get(sourceId);\n return source.fork({ name });\n}\n\nfunction shellEscape(value: string): string {\n return `'${value.replace(/'/g, `'\\\\''`)}'`;\n}\n\nfunction mapFilesystemPath(sandbox: ArchilSandbox, path: string): string {\n const normalized = posix.normalize(path.startsWith('/') ? path : `/${path}`);\n\n // In persistent mode the filesystem is the VM's own filesystem.\n if (sandbox.vm) {\n return normalized;\n }\n\n if (normalized === '/') {\n return ARCHIL_MOUNT_ROOT;\n }\n\n if (\n normalized === ARCHIL_MOUNT_ROOT ||\n normalized.startsWith(`${ARCHIL_MOUNT_ROOT}/`)\n ) {\n return normalized;\n }\n\n return `${ARCHIL_MOUNT_ROOT}${normalized}`;\n}\n\nfunction withDiskWriteLockCommand(command: string): string {\n const mountRoot = shellEscape(ARCHIL_MOUNT_ROOT);\n return [\n `archil checkout --force --yes ${mountRoot}`,\n `{ ${command}; status=$?; archil checkin ${mountRoot}; checkin_status=$?; ` +\n `if [ $status -ne 0 ]; then exit $status; fi; exit $checkin_status; }`,\n ].join(' && ');\n}\n\nfunction withDiskWriteLock(sandbox: ArchilSandbox, command: string): string {\n // Sandbox VMs have a dedicated disk — no shared-mode checkout needed.\n if (sandbox.vm) return command;\n return withDiskWriteLockCommand(command);\n}\n\nfunction execCommandBytes(command: string): number {\n return Buffer.byteLength(wrapCommand(command), 'utf8');\n}\n\nfunction buildWriteChunkCommand(\n parent: string,\n tempPath: string,\n diskPath: string,\n encodedChunk: string,\n isFirst: boolean,\n isFinal: boolean,\n): string {\n const writeCommand =\n `printf %s ${shellEscape(encodedChunk)} | base64 -d ` +\n `${isFirst ? '>' : '>>'} ${shellEscape(tempPath)}`;\n return [\n ...(isFirst ? [`mkdir -p ${shellEscape(parent)}`] : []),\n writeCommand,\n ...(isFinal\n ? [finalizeStagedFileCommand(tempPath, diskPath)]\n : []),\n ].join(' && ');\n}\n\nfunction finalizeStagedFileCommand(tempPath: string, diskPath: string): string {\n const quotedDestination = shellEscape(diskPath);\n return [\n `if [ -d ${quotedDestination} ]; then`,\n `printf '%s\\\\n' ${shellEscape(`Refusing to overwrite directory ${diskPath}`)} >&2;`,\n 'exit 1;',\n 'fi;',\n `mv ${shellEscape(tempPath)} ${quotedDestination}`,\n ].join(' ');\n}\n\nfunction maxWriteChunkSize(\n parent: string,\n tempPath: string,\n diskPath: string,\n): number {\n let low = 0;\n let high = ARCHIL_MAX_EXEC_COMMAND_BYTES;\n\n while (low < high) {\n const candidate = Math.ceil((low + high) / 2);\n const command = withDiskWriteLockCommand(\n buildWriteChunkCommand(\n parent,\n tempPath,\n diskPath,\n 'A'.repeat(candidate),\n true,\n true,\n ),\n );\n\n if (execCommandBytes(command) <= ARCHIL_MAX_EXEC_COMMAND_BYTES) {\n low = candidate;\n } else {\n high = candidate - 1;\n }\n }\n\n const chunkSize = low - (low % 4);\n if (chunkSize < 4) {\n throw new Error(\n `Archil filesystem path is too long to write within the ${ARCHIL_MAX_EXEC_COMMAND_BYTES}-byte exec command limit.`,\n );\n }\n return chunkSize;\n}\n\nfunction wrapCommand(command: string, options?: RunCommandOptions): string {\n let wrapped = command;\n\n const envEntries = Object.entries(options?.env ?? {});\n if (!envEntries.some(([key]) => key === 'HOME')) {\n envEntries.unshift(['HOME', process.env.HOME || '/tmp']);\n }\n const envPrefix = envEntries\n .map(([k, v]) => `${k}=${shellEscape(String(v))}`)\n .join(' ');\n wrapped = `${envPrefix} ${wrapped}`;\n\n if (options?.cwd) {\n wrapped = `cd ${shellEscape(options.cwd)} && ${wrapped}`;\n }\n\n if (options?.background) {\n wrapped = `nohup sh -c ${shellEscape(wrapped)} > /dev/null 2>&1 &`;\n }\n\n return wrapped;\n}\n\nasync function execOnDisk(sandbox: ArchilSandbox, command: string): Promise<ExecResponse> {\n return sandbox.client.disks.exec(sandbox.disk.id, command);\n}\n\nfunction wrapSandboxCommand(command: string, options?: RunCommandOptions): string {\n let wrapped = command;\n if (options?.cwd) {\n wrapped = `cd ${shellEscape(options.cwd)} && ${wrapped}`;\n }\n if (options?.background) {\n wrapped = `nohup sh -c ${shellEscape(wrapped)} > /dev/null 2>&1 &`;\n }\n return wrapped;\n}\n\nasync function ensureVmRunning(vm: ArchilVm): Promise<void> {\n // Refresh first: status on this handle is a local snapshot and goes stale\n // when the sandbox is paused/stopped remotely or hits its TTL.\n await vm.refresh();\n if (vm.status === 'running') return;\n if (vm.status === 'paused') {\n await vm.resume();\n } else if (vm.status === 'stopped' || vm.status === 'exited') {\n await vm.start();\n }\n}\n\n// Archil rejects deleting a live sandbox, so stop it first.\nasync function stopAndDeleteVm(vm: ArchilVm): Promise<void> {\n if (vm.status === 'deleting' || vm.status === 'deleted') return;\n if (vm.status !== 'stopped' && vm.status !== 'exited' && vm.status !== 'failed') {\n await vm.stop();\n }\n await vm.delete();\n}\n\nfunction toSandboxRequest(options?: ArchilCreateOptions): ArchilSandboxRequest {\n const request: ArchilSandboxRequest = {\n ...options?.sandbox,\n name: options?.name,\n baseImage: options?.baseImage ?? options?.image ?? options?.templateId,\n env: options?.env ?? options?.envs,\n vcpuCount: options?.vcpus ?? options?.cpu ?? options?.cpus,\n memSizeMiB: options?.memoryMiB ?? options?.memory,\n };\n if (options?.maxTtlSeconds !== undefined) {\n request.maxTtlSeconds = options.maxTtlSeconds;\n } else if (options?.timeout !== undefined) {\n // CreateInstanceOptions.timeout is milliseconds; Archil's TTL is seconds.\n request.maxTtlSeconds = Math.ceil(options.timeout / 1000);\n }\n return request;\n}\n\n// Records each sandbox's effective execution mode so `destroy` — which only\n// receives an id — deletes persistent VMs even when the mode came from a\n// per-sandbox `ephemeral` override rather than the provider config.\nconst sandboxModes = new Map<string, ArchilExecutionMode>();\n\nconst _provider = defineProvider<ArchilSandbox, ArchilConfig>({\n name: 'archil',\n methods: {\n instances: {\n create: async (config: ArchilConfig, options?: ArchilCreateOptions) => {\n const resolved = resolveConfig(config);\n const client = createClient(config, resolved);\n\n // `ephemeral` on create() overrides the configured default for this\n // sandbox: true -> serverless exec handle, false -> persistent VM.\n const execution =\n options?.ephemeral !== undefined\n ? options.ephemeral\n ? 'exec'\n : 'persistent'\n : resolved.execution;\n\n if (options?.snapshotId && options?.ephemeral === true) {\n throw new Error(\n 'Archil cannot combine ephemeral: true with snapshotId — snapshots fork persistent VMs. Drop ephemeral or set it to false.',\n );\n }\n\n // snapshotId forks a new VM from that snapshot's state — Archil\n // models snapshots as isolated writable branches of a source\n // sandbox — so it always takes the VM path regardless of the\n // configured execution mode.\n if (execution === 'persistent' || options?.snapshotId) {\n let vm: ArchilVm;\n if (options?.snapshotId) {\n vm = await forkSandboxVm(client, options.snapshotId, options?.name);\n } else if (options?.sandboxId) {\n // Attach to a live sandbox. Refuse an abort signal here: the\n // sandbox manager destroys a resolved sandbox after an abort,\n // which would delete a sandbox this call did not create.\n if (options?.signal) {\n throw new Error(\n 'create({ sandboxId }) attaches to an existing sandbox and cannot be combined with an abort signal',\n );\n }\n vm = await client.sandboxes.get(options.sandboxId);\n await ensureVmRunning(vm);\n } else {\n vm = await client.sandboxes.create(toSandboxRequest(options), {\n wait: true,\n });\n }\n sandboxModes.set(vm.id, 'persistent');\n return { instance: {\n client,\n disk: { id: vm.id },\n vm,\n resolved,\n createdAt: new Date(),\n }, instanceId: vm.id,\n };\n }\n\n const diskId = resolveCreateDiskId(options);\n sandboxModes.set(diskId, 'exec');\n return { instance: {\n client,\n disk: { id: diskId },\n resolved,\n createdAt: new Date(),\n }, instanceId: diskId,\n };\n },\n\n getById: async (config: ArchilConfig, sandboxId: string) => {\n const resolved = resolveConfig(config);\n const client = createClient(config, resolved);\n try {\n if (resolved.execution === 'persistent') {\n const vm = await client.sandboxes.get(sandboxId);\n await ensureVmRunning(vm);\n return { instance: {\n client,\n disk: { id: vm.id },\n vm,\n resolved,\n createdAt: new Date(),\n }, instanceId: vm.id,\n };\n }\n const disk = await client.disks.get(sandboxId);\n return { instance: { client, disk, resolved, createdAt: new Date() }, instanceId: disk.id,\n };\n } catch {\n return null;\n }\n },\n\n list: async (config: ArchilConfig) => {\n const resolved = resolveConfig(config);\n const client = createClient(config, resolved);\n if (resolved.execution === 'persistent') {\n const vms = await client.sandboxes.list();\n return vms.map((vm) => ({ instance: {\n client,\n disk: { id: vm.id },\n vm,\n resolved,\n createdAt: new Date(),\n }, instanceId: vm.id,\n }));\n }\n const disks = await client.disks.list();\n return disks.map((disk) => ({ instance: { client, disk, resolved, createdAt: new Date() }, instanceId: disk.id,\n }));\n },\n\n destroy: async (config: ArchilConfig, sandboxId: string) => {\n const resolved = resolveConfig(config);\n const mode = sandboxModes.get(sandboxId) ?? resolved.execution;\n if (mode === 'persistent') {\n const client = createClient(config, resolved);\n const vm = await client.sandboxes.get(sandboxId);\n await stopAndDeleteVm(vm);\n }\n // exec handles are disk references — Archil disks have an independent\n // lifecycle, so destroying them is a no-op. Unknown ids fall back to\n // the configured mode.\n sandboxModes.delete(sandboxId);\n },\n\n\n runCommand: async (\n sandbox: ArchilSandbox,\n command: string,\n options?: RunCommandOptions,\n ): Promise<CommandResult> => {\n const startTime = Date.now();\n try {\n if (sandbox.vm) {\n // The process API fetches a fresh short-lived WebSocket\n // connection URL per process start, so expiry is handled by the\n // underlying client.\n await ensureVmRunning(sandbox.vm);\n const wrapped = wrapSandboxCommand(command, options);\n if (options?.background) {\n const proc = await sandbox.vm.processes.start(wrapped, {\n env: options?.env,\n });\n await proc.disconnect();\n return {\n stdout: '',\n stderr: '',\n exitCode: 0,\n durationMs: Date.now() - startTime,\n };\n }\n const result = await sandbox.vm.exec(wrapped, {\n env: options?.env,\n timeoutSeconds:\n options?.timeout !== undefined\n ? Math.ceil(options.timeout / 1000)\n : undefined,\n });\n return {\n stdout: result.stdout,\n stderr: result.stderr,\n exitCode:\n result.exitCode ?? (result.status === 'completed' ? 0 : 1),\n durationMs: Date.now() - startTime,\n };\n }\n\n const result = await execOnDisk(sandbox, wrapCommand(command, options));\n return {\n stdout: result.stdout ?? '',\n stderr: result.stderr ?? '',\n exitCode: result.exitCode,\n durationMs: Date.now() - startTime,\n };\n } catch (error) {\n return {\n stdout: '',\n stderr: error instanceof Error ? error.message : String(error),\n exitCode: 1,\n durationMs: Date.now() - startTime,\n };\n }\n },\n\n getInfo: async (sandbox: ArchilSandbox): Promise<InstanceInfo> => {\n if (sandbox.vm) {\n const vm = sandbox.vm;\n return {\n id: vm.id,\n provider: 'archil',\n status:\n vm.status === 'running'\n ? 'running'\n : vm.status === 'failed'\n ? 'error'\n : 'stopped',\n createdAt: vm.createdAt,\n timeout: vm.maxTtlSeconds * 1000,\n metadata: {\n name: vm.name,\n archilStatus: vm.status,\n vcpuCount: vm.vcpuCount,\n memSizeMiB: vm.memSizeMiB,\n baseImage: vm.baseImage,\n platform: vm.platform,\n },\n };\n }\n const diskInfo = 'status' in sandbox.disk ? sandbox.disk : undefined;\n return {\n id: sandbox.disk.id,\n provider: 'archil',\n status: !diskInfo || diskInfo.status === 'ready' ? 'running' : 'stopped',\n createdAt: diskInfo ? new Date(diskInfo.createdAt) : sandbox.createdAt,\n timeout: 0,\n metadata: diskInfo\n ? {\n name: diskInfo.name,\n organization: diskInfo.organization,\n region: diskInfo.region,\n provider: diskInfo.provider,\n }\n : {},\n };\n },\n\n getUrl: async (\n sandbox: ArchilSandbox,\n options: { port: number; protocol?: string },\n ): Promise<string> => {\n if (sandbox.vm) {\n await sandbox.vm.refresh();\n const endpoint = sandbox.vm.endpoints?.find(\n (e) => e.port === options.port,\n );\n if (!endpoint) {\n throw new Error(\n `No endpoint exposed on port ${options.port} for Archil sandbox ${sandbox.vm.id}.`,\n );\n }\n return `${options.protocol ?? 'https'}://${endpoint.hostname}`;\n }\n throw new Error(\n `Archil exec runs each command in a fresh ephemeral container that exits when the command returns, ` +\n `so there is no long-lived process to expose port ${options.port} on. ` +\n `getUrl is not supported.`,\n );\n },\n\n filesystem: {\n readFile: async (sandbox, path, runCommand) => {\n if (sandbox.vm) {\n const chunks: Buffer[] = [];\n try {\n await sandbox.vm.files.downloadFile(path, (chunk) => {\n chunks.push(Buffer.from(chunk));\n });\n } catch (error) {\n throw new Error(\n `Failed to read ${path}: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n return Buffer.concat(chunks).toString('utf8');\n }\n const diskPath = mapFilesystemPath(sandbox, path);\n const sizeResult = await runCommand(\n sandbox,\n `wc -c < ${shellEscape(diskPath)}`,\n );\n if (sizeResult.exitCode !== 0) {\n throw new Error(`Failed to read ${path}: ${sizeResult.stderr}`);\n }\n\n const sizeText = sizeResult.stdout.trim();\n if (!/^\\d+$/.test(sizeText)) {\n throw new Error(\n `Failed to read ${path}: Archil returned an invalid file size.`,\n );\n }\n\n const size = Number(sizeText);\n if (!Number.isSafeInteger(size)) {\n throw new Error(\n `Failed to read ${path}: file size exceeds JavaScript's safe integer range.`,\n );\n }\n if (size === 0) return '';\n\n const chunks: Buffer[] = [];\n for (\n let offset = 0;\n offset < size;\n offset += ARCHIL_MAX_READ_CHUNK_BYTES\n ) {\n const expectedBytes = Math.min(\n ARCHIL_MAX_READ_CHUNK_BYTES,\n size - offset,\n );\n const result = await runCommand(\n sandbox,\n `dd if=${shellEscape(diskPath)} bs=1 skip=${offset} count=${expectedBytes} 2>/dev/null | base64`,\n );\n if (result.exitCode !== 0) {\n throw new Error(`Failed to read ${path}: ${result.stderr}`);\n }\n\n const encoded = result.stdout.replace(/\\s/g, '');\n if (\n encoded.length === 0 ||\n encoded.length % 4 !== 0 ||\n !/^[A-Za-z0-9+/]*={0,2}$/.test(encoded)\n ) {\n throw new Error(\n `Failed to read ${path}: Archil returned an incomplete file chunk at byte ${offset}.`,\n );\n }\n\n const chunk = Buffer.from(encoded, 'base64');\n if (chunk.length !== expectedBytes) {\n throw new Error(\n `Failed to read ${path}: Archil returned an incomplete file chunk at byte ${offset}.`,\n );\n }\n chunks.push(chunk);\n }\n\n return Buffer.concat(chunks).toString('utf8');\n },\n\n writeFile: async (sandbox, path, content, runCommand) => {\n if (sandbox.vm) {\n try {\n await sandbox.vm.files.uploadFile(\n Buffer.from(content, 'utf8'),\n path,\n );\n } catch (error) {\n throw new Error(\n `Failed to write ${path}: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n return;\n }\n const diskPath = mapFilesystemPath(sandbox, path);\n const parent = posix.dirname(diskPath);\n const encoded = Buffer.from(content, 'utf8').toString('base64');\n const tempPath = `${diskPath}.computesdk-write-${randomUUID()}`;\n let started = false;\n\n try {\n if (encoded.length === 0) {\n started = true;\n const result = await runCommand(\n sandbox,\n withDiskWriteLock(\n sandbox,\n [\n `mkdir -p ${shellEscape(parent)}`,\n `: > ${shellEscape(tempPath)}`,\n finalizeStagedFileCommand(tempPath, diskPath),\n ].join(' && '),\n ),\n );\n if (result.exitCode !== 0) {\n throw new Error(result.stderr);\n }\n return;\n }\n\n const chunkSize = maxWriteChunkSize(parent, tempPath, diskPath);\n for (let offset = 0; offset < encoded.length; offset += chunkSize) {\n const isFirst = offset === 0;\n const isFinal = offset + chunkSize >= encoded.length;\n started = true;\n const result = await runCommand(\n sandbox,\n withDiskWriteLock(\n sandbox,\n buildWriteChunkCommand(\n parent,\n tempPath,\n diskPath,\n encoded.slice(offset, offset + chunkSize),\n isFirst,\n isFinal,\n ),\n ),\n );\n if (result.exitCode !== 0) {\n throw new Error(result.stderr);\n }\n }\n } catch (error) {\n if (started) {\n try {\n await runCommand(\n sandbox,\n withDiskWriteLock(sandbox, `rm -f ${shellEscape(tempPath)}`),\n );\n } catch {\n // Preserve the original write error if cleanup fails.\n }\n }\n throw new Error(\n `Failed to write ${path}: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n },\n\n mkdir: async (sandbox, path, runCommand) => {\n const diskPath = mapFilesystemPath(sandbox, path);\n const result = await runCommand(\n sandbox,\n withDiskWriteLock(sandbox, `mkdir -p ${shellEscape(diskPath)}`),\n );\n if (result.exitCode !== 0) {\n throw new Error(`Failed to create directory ${path}: ${result.stderr}`);\n }\n },\n\n readdir: async (sandbox, path, runCommand) => {\n const diskPath = mapFilesystemPath(sandbox, path);\n // Tab-separated: type<TAB>size<TAB>mtime-iso<TAB>name. Robust to spaces in names.\n const result = await runCommand(\n sandbox,\n `find ${shellEscape(diskPath)} -mindepth 1 -maxdepth 1 -printf '%y\\t%s\\t%T@\\t%f\\n'`,\n );\n if (result.exitCode !== 0) {\n throw new Error(`Failed to list directory ${path}: ${result.stderr}`);\n }\n const entries: FileEntry[] = [];\n for (const line of result.stdout.split('\\n')) {\n if (!line) continue;\n const [typeChar, sizeStr, mtimeStr, ...nameParts] = line.split('\\t');\n const name = nameParts.join('\\t');\n entries.push({\n name,\n type: typeChar === 'd' ? 'directory' : 'file',\n size: parseInt(sizeStr, 10) || 0,\n modified: new Date(parseFloat(mtimeStr) * 1000),\n });\n }\n return entries;\n },\n\n exists: async (sandbox, path, runCommand) => {\n const diskPath = mapFilesystemPath(sandbox, path);\n const result = await runCommand(sandbox, `test -e ${shellEscape(diskPath)}`);\n return result.exitCode === 0;\n },\n\n remove: async (sandbox, path, runCommand) => {\n const diskPath = mapFilesystemPath(sandbox, path);\n if (!sandbox.vm && diskPath === ARCHIL_MOUNT_ROOT) {\n throw new Error('Refusing to remove the Archil disk mount root.');\n }\n const result = await runCommand(\n sandbox,\n withDiskWriteLock(sandbox, `rm -rf ${shellEscape(diskPath)}`),\n );\n if (result.exitCode !== 0) {\n throw new Error(`Failed to remove ${path}: ${result.stderr}`);\n }\n },\n },\n\n getInstance: (sandbox: ArchilSandbox): ArchilSandbox => sandbox,\n },\n\n // Archil has no separate snapshot resource: a \"snapshot\" is a sandbox\n // fork (an isolated writable branch of the source sandbox's state), so\n // snapshot ids are ordinary sandbox ids that create() forks again.\n snapshot: {\n create: async (\n config: ArchilConfig,\n sandboxId: string,\n options?: { name?: string },\n ) => {\n const resolved = resolveConfig(config);\n const client = createClient(config, resolved);\n try {\n const fork = await forkSandboxVm(client, sandboxId, options?.name);\n return {\n id: fork.id,\n provider: 'archil',\n createdAt: fork.createdAt ?? new Date(),\n metadata: { name: fork.name },\n };\n } catch (error) {\n throw new Error(\n `Failed to create Archil snapshot: ${\n error instanceof Error ? error.message : String(error)\n }`,\n );\n }\n },\n\n list: async (_config: ArchilConfig) => {\n throw new Error(\n 'Archil provider does not support listing snapshots.',\n );\n },\n\n delete: async (config: ArchilConfig, snapshotId: string) => {\n const resolved = resolveConfig(config);\n const client = createClient(config, resolved);\n let vm: ArchilVm;\n try {\n vm = await client.sandboxes.get(snapshotId);\n } catch (error) {\n if (error instanceof ArchilError && error.status === 404) return;\n throw error;\n }\n await stopAndDeleteVm(vm);\n },\n },\n },\n});\n\nexport const archil = (config: ArchilConfig = {}) => _provider(config);\n\nexport type { ArchilSandbox };\n"],"mappings":"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","names":["result","chunks"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@computesdk/archil",
3
- "version": "0.4.19",
3
+ "version": "0.4.21",
4
4
  "description": "Archil provider for ComputeSDK - exec commands against an Archil disk",
5
5
  "author": "ComputeSDK",
6
6
  "license": "MIT",
@@ -19,8 +19,8 @@
19
19
  ],
20
20
  "dependencies": {
21
21
  "disk": "^1.1.2",
22
- "computesdk": "4.1.10",
23
- "@computesdk/provider": "2.1.12"
22
+ "computesdk": "4.1.12",
23
+ "@computesdk/provider": "2.1.14"
24
24
  },
25
25
  "devDependencies": {
26
26
  "@types/node": "^20.0.0",
@@ -30,7 +30,7 @@
30
30
  "tsup": "^8.0.0",
31
31
  "typescript": "^5.0.0",
32
32
  "vitest": "^1.0.0",
33
- "@computesdk/test-utils": "2.0.3"
33
+ "@computesdk/test-utils": "2.0.4"
34
34
  },
35
35
  "keywords": [
36
36
  "computesdk",