@computesdk/archil 0.4.0 → 0.4.1

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
@@ -55,8 +55,7 @@ await provider.sandbox.destroy(sandbox.sandboxId);
55
55
  | `getById` | ✅ | Requires the disk id. |
56
56
  | `list` | ✅ | Lists all disks visible to the API key. |
57
57
  | `destroy` | no-op | Disk lifecycle is managed by Archil. |
58
- | `runCommand` | ✅ | Calls Archil's HTTP `exec` endpoint and waits for completion. |
59
- | `runCode` | ✅ | Wraps code in `node -e` or `python3 -c`. Requires explicit `runtime`. |
58
+ | `runCommand` | ✅ | Executes shell commands through Archil's HTTP `exec` endpoint. |
60
59
  | `getInfo` | ✅ | |
61
60
  | `getUrl` | ❌ | Each exec runs in a fresh ephemeral container — no port to expose. |
62
61
  | `filesystem` | ✅ | Implemented via shell commands (`cat`, `find`, `mkdir`, etc.). |
package/dist/index.js CHANGED
@@ -180,36 +180,6 @@ var _provider = (0, import_provider.defineProvider)({
180
180
  };
181
181
  }
182
182
  },
183
- runCode: async (sandbox, code, runtime, _config) => {
184
- if (!runtime) {
185
- throw new Error(
186
- 'Archil runCode requires an explicit runtime. Pass runtime: "node" or runtime: "python".'
187
- );
188
- }
189
- if (runtime !== "node" && runtime !== "python") {
190
- throw new Error(
191
- `Archil runCode does not support runtime "${runtime}". Supported runtimes: "node", "python".`
192
- );
193
- }
194
- const interpreter = runtime === "python" ? "python3" : "node";
195
- const flag = runtime === "python" ? "-c" : "-e";
196
- const command = `${interpreter} ${flag} ${shellEscape(code)}`;
197
- const result = await execOnDisk(sandbox, command);
198
- const stdout = result.stdout ?? "";
199
- const stderr = result.stderr ?? "";
200
- const output = stderr ? `${stdout}${stdout && stderr ? "\n" : ""}${stderr}` : stdout;
201
- if (result.exitCode !== 0) {
202
- const syntaxErrorPattern = runtime === "python" ? /\bSyntaxError\b|invalid syntax/i : /\bSyntaxError\b|Unexpected token|Unexpected identifier/i;
203
- if (syntaxErrorPattern.test(output)) {
204
- throw new Error(output || `${runtime} syntax error`);
205
- }
206
- }
207
- return {
208
- output,
209
- exitCode: result.exitCode,
210
- language: runtime
211
- };
212
- },
213
183
  getInfo: async (sandbox) => {
214
184
  return {
215
185
  id: sandbox.disk.id,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["/**\n * Archil Provider\n *\n * Executes commands against an Archil disk via the Archil control-plane HTTP\n * API. Archil is exec-only — each command runs in an Archil-managed container\n * with the configured disk mounted, then returns stdout, stderr, and exit code.\n * There is no sandbox lifecycle to manage; \"create\" resolves a handle to an\n * existing disk id.\n */\n\nimport { defineProvider } from '@computesdk/provider';\nimport type {\n CodeResult,\n CommandResult,\n SandboxInfo,\n Runtime,\n CreateSandboxOptions,\n FileEntry,\n RunCommandOptions,\n} from 'computesdk';\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\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\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\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}\n\ninterface ArchilSandbox {\n disk: DiskResponse;\n resolved: ResolvedConfig;\n createdAt: Date;\n}\n\ninterface ArchilCreateOptions extends CreateSandboxOptions {\n diskId?: string;\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 };\n}\n\nfunction authHeader(apiKey: string): string {\n return `key-${apiKey.replace(/^key-/, '')}`;\n}\n\nasync function callApi<T>(\n resolved: ResolvedConfig,\n method: 'GET' | 'POST' | 'DELETE',\n path: string,\n body?: unknown,\n): Promise<T> {\n const response = await fetch(`${resolved.baseUrl}${path}`, {\n method,\n headers: {\n Authorization: authHeader(resolved.apiKey),\n ...(body ? { 'Content-Type': 'application/json' } : {}),\n },\n body: body ? JSON.stringify(body) : undefined,\n });\n\n type Envelope = { success?: boolean; data?: T; error?: string };\n let payload: Envelope | null = null;\n try {\n payload = (await response.json()) as Envelope;\n } catch {\n payload = null;\n }\n\n if (!response.ok || !payload || payload.success === false) {\n const message =\n (payload && payload.error) ||\n `Archil API ${method} ${path} failed with status ${response.status}`;\n throw new Error(message);\n }\n\n return payload.data as T;\n}\n\nfunction resolveCreateDiskId(options?: ArchilCreateOptions): string {\n const diskId = options?.diskId;\n\n if (!diskId) {\n throw new Error(\n 'Archil create() requires an existing disk id on the top-level options.\\n\\n' +\n 'Example:\\n' +\n ' provider.sandbox.create({ diskId: \"disk_abc123\" })',\n );\n }\n\n return diskId;\n}\n\nfunction shellEscape(value: string): string {\n return `'${value.replace(/'/g, `'\\\\''`)}'`;\n}\n\nfunction 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 callApi<ExecResponse>(\n sandbox.resolved,\n 'POST',\n `/api/disks/${encodeURIComponent(sandbox.disk.id)}/exec`,\n { command },\n );\n}\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 diskId = resolveCreateDiskId(options);\n const disk = await callApi<DiskResponse>(\n resolved,\n 'GET',\n `/api/disks/${encodeURIComponent(diskId)}`,\n );\n return {\n sandbox: { disk, resolved, createdAt: new Date() },\n sandboxId: disk.id,\n };\n },\n\n getById: async (config: ArchilConfig, sandboxId: string) => {\n const resolved = resolveConfig(config);\n try {\n const disk = await callApi<DiskResponse>(\n resolved,\n 'GET',\n `/api/disks/${encodeURIComponent(sandboxId)}`,\n );\n return {\n sandbox: { 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 disks = await callApi<DiskResponse[]>(resolved, 'GET', '/api/disks');\n return disks.map((disk) => ({\n sandbox: { disk, resolved, createdAt: new Date() },\n sandboxId: disk.id,\n }));\n },\n\n destroy: async (_config: ArchilConfig, _sandboxId: string) => {\n // No-op: Archil disks have an independent lifecycle.\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 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 runCode: async (\n sandbox: ArchilSandbox,\n code: string,\n runtime?: Runtime,\n _config?: ArchilConfig,\n ): Promise<CodeResult> => {\n if (!runtime) {\n throw new Error(\n 'Archil runCode requires an explicit runtime. Pass runtime: \"node\" or runtime: \"python\".',\n );\n }\n if (runtime !== 'node' && runtime !== 'python') {\n throw new Error(\n `Archil runCode does not support runtime \"${runtime}\". Supported runtimes: \"node\", \"python\".`,\n );\n }\n const interpreter = runtime === 'python' ? 'python3' : 'node';\n const flag = runtime === 'python' ? '-c' : '-e';\n const command = `${interpreter} ${flag} ${shellEscape(code)}`;\n\n const result = await execOnDisk(sandbox, command);\n const stdout = result.stdout ?? '';\n const stderr = result.stderr ?? '';\n const output = stderr ? `${stdout}${stdout && stderr ? '\\n' : ''}${stderr}` : stdout;\n\n if (result.exitCode !== 0) {\n const syntaxErrorPattern =\n runtime === 'python'\n ? /\\bSyntaxError\\b|invalid syntax/i\n : /\\bSyntaxError\\b|Unexpected token|Unexpected identifier/i;\n if (syntaxErrorPattern.test(output)) {\n throw new Error(output || `${runtime} syntax error`);\n }\n }\n\n return {\n output,\n exitCode: result.exitCode,\n language: runtime,\n };\n },\n\n getInfo: async (sandbox: ArchilSandbox): Promise<SandboxInfo> => {\n return {\n id: sandbox.disk.id,\n provider: 'archil',\n runtime: 'node',\n status: sandbox.disk.status === 'ready' ? 'running' : 'stopped',\n createdAt: new Date(sandbox.disk.createdAt),\n timeout: 0,\n metadata: {\n name: sandbox.disk.name,\n organization: sandbox.disk.organization,\n region: sandbox.disk.region,\n provider: sandbox.disk.provider,\n },\n };\n },\n\n getUrl: async (\n _sandbox: ArchilSandbox,\n options: { port: number; protocol?: string },\n ): Promise<string> => {\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 const result = await runCommand(sandbox, `cat ${shellEscape(path)}`);\n if (result.exitCode !== 0) {\n throw new Error(`Failed to read ${path}: ${result.stderr}`);\n }\n return result.stdout;\n },\n\n writeFile: async (sandbox, path, content, runCommand) => {\n const parent = path.substring(0, path.lastIndexOf('/'));\n if (parent) {\n await runCommand(sandbox, `mkdir -p ${shellEscape(parent)}`);\n }\n // base64-pipe to avoid heredoc/quoting hazards on arbitrary content.\n const encoded = Buffer.from(content, 'utf8').toString('base64');\n const result = await runCommand(\n sandbox,\n `printf %s ${shellEscape(encoded)} | base64 -d > ${shellEscape(path)}`,\n );\n if (result.exitCode !== 0) {\n throw new Error(`Failed to write ${path}: ${result.stderr}`);\n }\n },\n\n mkdir: async (sandbox, path, runCommand) => {\n const result = await runCommand(sandbox, `mkdir -p ${shellEscape(path)}`);\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 // 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(path)} -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 result = await runCommand(sandbox, `test -e ${shellEscape(path)}`);\n return result.exitCode === 0;\n },\n\n remove: async (sandbox, path, runCommand) => {\n const result = await runCommand(sandbox, `rm -rf ${shellEscape(path)}`);\n if (result.exitCode !== 0) {\n throw new Error(`Failed to remove ${path}: ${result.stderr}`);\n }\n },\n },\n\n getInstance: (sandbox: ArchilSandbox): ArchilSandbox => sandbox,\n },\n },\n});\n\nexport const archil = (config: ArchilConfig = {}) => _provider(config);\n\nexport type { ArchilSandbox };\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAUA,sBAA+B;AAY/B,IAAM,gBAAwC;AAAA,EAC5C,mBAAmB;AACrB;AAEA,SAAS,gBAAgB,QAAwB;AAC/C,QAAM,OAAO,OAAO,QAAQ,GAAG;AAC/B,MAAI,QAAQ,KAAK,SAAS,OAAO,SAAS,GAAG;AAC3C,UAAM,IAAI;AAAA,MACR,0BAA0B,MAAM;AAAA,IAClC;AAAA,EACF;AACA,QAAM,QAAQ,OAAO,MAAM,GAAG,IAAI;AAClC,QAAM,SAAS,OAAO,MAAM,OAAO,CAAC;AACpC,QAAM,QAAQ,cAAc,MAAM,KAAK;AACvC,SAAO,mBAAmB,KAAK,IAAI,MAAM,IAAI,KAAK;AACpD;AAiDA,SAAS,cAAc,QAAsC;AAC3D,QAAM,SAAS,OAAO,UAAU,QAAQ,IAAI;AAC5C,QAAM,SAAS,OAAO,UAAU,QAAQ,IAAI;AAE5C,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI;AAAA,MACR;AAAA,IAGF;AAAA,EACF;AAEA,MAAI,UAAU,OAAO;AACrB,MAAI,CAAC,SAAS;AACZ,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI;AAAA,QACR;AAAA,MAIF;AAAA,IACF;AACA,cAAU,gBAAgB,MAAM;AAAA,EAClC;AAEA,SAAO,EAAE,QAAQ,QAAQ;AAC3B;AAEA,SAAS,WAAW,QAAwB;AAC1C,SAAO,OAAO,OAAO,QAAQ,SAAS,EAAE,CAAC;AAC3C;AAEA,eAAe,QACb,UACA,QACA,MACA,MACY;AACZ,QAAM,WAAW,MAAM,MAAM,GAAG,SAAS,OAAO,GAAG,IAAI,IAAI;AAAA,IACzD;AAAA,IACA,SAAS;AAAA,MACP,eAAe,WAAW,SAAS,MAAM;AAAA,MACzC,GAAI,OAAO,EAAE,gBAAgB,mBAAmB,IAAI,CAAC;AAAA,IACvD;AAAA,IACA,MAAM,OAAO,KAAK,UAAU,IAAI,IAAI;AAAA,EACtC,CAAC;AAGD,MAAI,UAA2B;AAC/B,MAAI;AACF,cAAW,MAAM,SAAS,KAAK;AAAA,EACjC,QAAQ;AACN,cAAU;AAAA,EACZ;AAEA,MAAI,CAAC,SAAS,MAAM,CAAC,WAAW,QAAQ,YAAY,OAAO;AACzD,UAAM,UACH,WAAW,QAAQ,SACpB,cAAc,MAAM,IAAI,IAAI,uBAAuB,SAAS,MAAM;AACpE,UAAM,IAAI,MAAM,OAAO;AAAA,EACzB;AAEA,SAAO,QAAQ;AACjB;AAEA,SAAS,oBAAoB,SAAuC;AAClE,QAAM,SAAS,SAAS;AAExB,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI;AAAA,MACR;AAAA,IAGF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,YAAY,OAAuB;AAC1C,SAAO,IAAI,MAAM,QAAQ,MAAM,OAAO,CAAC;AACzC;AAEA,SAAS,YAAY,SAAiB,SAAqC;AACzE,MAAI,UAAU;AAEd,QAAM,aAAa,OAAO,QAAQ,SAAS,OAAO,CAAC,CAAC;AACpD,MAAI,CAAC,WAAW,KAAK,CAAC,CAAC,GAAG,MAAM,QAAQ,MAAM,GAAG;AAC/C,eAAW,QAAQ,CAAC,QAAQ,QAAQ,IAAI,QAAQ,MAAM,CAAC;AAAA,EACzD;AACA,QAAM,YAAY,WACf,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,YAAY,OAAO,CAAC,CAAC,CAAC,EAAE,EAChD,KAAK,GAAG;AACX,YAAU,GAAG,SAAS,IAAI,OAAO;AAEjC,MAAI,SAAS,KAAK;AAChB,cAAU,MAAM,YAAY,QAAQ,GAAG,CAAC,OAAO,OAAO;AAAA,EACxD;AAEA,MAAI,SAAS,YAAY;AACvB,cAAU,eAAe,YAAY,OAAO,CAAC;AAAA,EAC/C;AAEA,SAAO;AACT;AAEA,eAAe,WAAW,SAAwB,SAAwC;AACxF,SAAO;AAAA,IACL,QAAQ;AAAA,IACR;AAAA,IACA,cAAc,mBAAmB,QAAQ,KAAK,EAAE,CAAC;AAAA,IACjD,EAAE,QAAQ;AAAA,EACZ;AACF;AAEA,IAAM,gBAAY,gCAA4C;AAAA,EAC5D,MAAM;AAAA,EACN,SAAS;AAAA,IACP,SAAS;AAAA,MACP,QAAQ,OAAO,QAAsB,YAAkC;AACrE,cAAM,WAAW,cAAc,MAAM;AACrC,cAAM,SAAS,oBAAoB,OAAO;AAC1C,cAAM,OAAO,MAAM;AAAA,UACjB;AAAA,UACA;AAAA,UACA,cAAc,mBAAmB,MAAM,CAAC;AAAA,QAC1C;AACA,eAAO;AAAA,UACL,SAAS,EAAE,MAAM,UAAU,WAAW,oBAAI,KAAK,EAAE;AAAA,UACjD,WAAW,KAAK;AAAA,QAClB;AAAA,MACF;AAAA,MAEA,SAAS,OAAO,QAAsB,cAAsB;AAC1D,cAAM,WAAW,cAAc,MAAM;AACrC,YAAI;AACF,gBAAM,OAAO,MAAM;AAAA,YACjB;AAAA,YACA;AAAA,YACA,cAAc,mBAAmB,SAAS,CAAC;AAAA,UAC7C;AACA,iBAAO;AAAA,YACL,SAAS,EAAE,MAAM,UAAU,WAAW,oBAAI,KAAK,EAAE;AAAA,YACjD,WAAW,KAAK;AAAA,UAClB;AAAA,QACF,QAAQ;AACN,iBAAO;AAAA,QACT;AAAA,MACF;AAAA,MAEA,MAAM,OAAO,WAAyB;AACpC,cAAM,WAAW,cAAc,MAAM;AACrC,cAAM,QAAQ,MAAM,QAAwB,UAAU,OAAO,YAAY;AACzE,eAAO,MAAM,IAAI,CAAC,UAAU;AAAA,UAC1B,SAAS,EAAE,MAAM,UAAU,WAAW,oBAAI,KAAK,EAAE;AAAA,UACjD,WAAW,KAAK;AAAA,QAClB,EAAE;AAAA,MACJ;AAAA,MAEA,SAAS,OAAO,SAAuB,eAAuB;AAAA,MAE9D;AAAA,MAEA,YAAY,OACV,SACA,SACA,YAC2B;AAC3B,cAAM,YAAY,KAAK,IAAI;AAC3B,YAAI;AACF,gBAAM,SAAS,MAAM,WAAW,SAAS,YAAY,SAAS,OAAO,CAAC;AACtE,iBAAO;AAAA,YACL,QAAQ,OAAO,UAAU;AAAA,YACzB,QAAQ,OAAO,UAAU;AAAA,YACzB,UAAU,OAAO;AAAA,YACjB,YAAY,KAAK,IAAI,IAAI;AAAA,UAC3B;AAAA,QACF,SAAS,OAAO;AACd,iBAAO;AAAA,YACL,QAAQ;AAAA,YACR,QAAQ,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,YAC7D,UAAU;AAAA,YACV,YAAY,KAAK,IAAI,IAAI;AAAA,UAC3B;AAAA,QACF;AAAA,MACF;AAAA,MAEA,SAAS,OACP,SACA,MACA,SACA,YACwB;AACxB,YAAI,CAAC,SAAS;AACZ,gBAAM,IAAI;AAAA,YACR;AAAA,UACF;AAAA,QACF;AACA,YAAI,YAAY,UAAU,YAAY,UAAU;AAC9C,gBAAM,IAAI;AAAA,YACR,4CAA4C,OAAO;AAAA,UACrD;AAAA,QACF;AACA,cAAM,cAAc,YAAY,WAAW,YAAY;AACvD,cAAM,OAAO,YAAY,WAAW,OAAO;AAC3C,cAAM,UAAU,GAAG,WAAW,IAAI,IAAI,IAAI,YAAY,IAAI,CAAC;AAE3D,cAAM,SAAS,MAAM,WAAW,SAAS,OAAO;AAChD,cAAM,SAAS,OAAO,UAAU;AAChC,cAAM,SAAS,OAAO,UAAU;AAChC,cAAM,SAAS,SAAS,GAAG,MAAM,GAAG,UAAU,SAAS,OAAO,EAAE,GAAG,MAAM,KAAK;AAE9E,YAAI,OAAO,aAAa,GAAG;AACzB,gBAAM,qBACJ,YAAY,WACR,oCACA;AACN,cAAI,mBAAmB,KAAK,MAAM,GAAG;AACnC,kBAAM,IAAI,MAAM,UAAU,GAAG,OAAO,eAAe;AAAA,UACrD;AAAA,QACF;AAEA,eAAO;AAAA,UACL;AAAA,UACA,UAAU,OAAO;AAAA,UACjB,UAAU;AAAA,QACZ;AAAA,MACF;AAAA,MAEA,SAAS,OAAO,YAAiD;AAC/D,eAAO;AAAA,UACL,IAAI,QAAQ,KAAK;AAAA,UACjB,UAAU;AAAA,UACV,SAAS;AAAA,UACT,QAAQ,QAAQ,KAAK,WAAW,UAAU,YAAY;AAAA,UACtD,WAAW,IAAI,KAAK,QAAQ,KAAK,SAAS;AAAA,UAC1C,SAAS;AAAA,UACT,UAAU;AAAA,YACR,MAAM,QAAQ,KAAK;AAAA,YACnB,cAAc,QAAQ,KAAK;AAAA,YAC3B,QAAQ,QAAQ,KAAK;AAAA,YACrB,UAAU,QAAQ,KAAK;AAAA,UACzB;AAAA,QACF;AAAA,MACF;AAAA,MAEA,QAAQ,OACN,UACA,YACoB;AACpB,cAAM,IAAI;AAAA,UACR,sJACsD,QAAQ,IAAI;AAAA,QAEpE;AAAA,MACF;AAAA,MAEA,YAAY;AAAA,QACV,UAAU,OAAO,SAAS,MAAM,eAAe;AAC7C,gBAAM,SAAS,MAAM,WAAW,SAAS,OAAO,YAAY,IAAI,CAAC,EAAE;AACnE,cAAI,OAAO,aAAa,GAAG;AACzB,kBAAM,IAAI,MAAM,kBAAkB,IAAI,KAAK,OAAO,MAAM,EAAE;AAAA,UAC5D;AACA,iBAAO,OAAO;AAAA,QAChB;AAAA,QAEA,WAAW,OAAO,SAAS,MAAM,SAAS,eAAe;AACvD,gBAAM,SAAS,KAAK,UAAU,GAAG,KAAK,YAAY,GAAG,CAAC;AACtD,cAAI,QAAQ;AACV,kBAAM,WAAW,SAAS,YAAY,YAAY,MAAM,CAAC,EAAE;AAAA,UAC7D;AAEA,gBAAM,UAAU,OAAO,KAAK,SAAS,MAAM,EAAE,SAAS,QAAQ;AAC9D,gBAAM,SAAS,MAAM;AAAA,YACnB;AAAA,YACA,aAAa,YAAY,OAAO,CAAC,kBAAkB,YAAY,IAAI,CAAC;AAAA,UACtE;AACA,cAAI,OAAO,aAAa,GAAG;AACzB,kBAAM,IAAI,MAAM,mBAAmB,IAAI,KAAK,OAAO,MAAM,EAAE;AAAA,UAC7D;AAAA,QACF;AAAA,QAEA,OAAO,OAAO,SAAS,MAAM,eAAe;AAC1C,gBAAM,SAAS,MAAM,WAAW,SAAS,YAAY,YAAY,IAAI,CAAC,EAAE;AACxE,cAAI,OAAO,aAAa,GAAG;AACzB,kBAAM,IAAI,MAAM,8BAA8B,IAAI,KAAK,OAAO,MAAM,EAAE;AAAA,UACxE;AAAA,QACF;AAAA,QAEA,SAAS,OAAO,SAAS,MAAM,eAAe;AAE5C,gBAAM,SAAS,MAAM;AAAA,YACnB;AAAA,YACA,QAAQ,YAAY,IAAI,CAAC;AAAA,UAC3B;AACA,cAAI,OAAO,aAAa,GAAG;AACzB,kBAAM,IAAI,MAAM,4BAA4B,IAAI,KAAK,OAAO,MAAM,EAAE;AAAA,UACtE;AACA,gBAAM,UAAuB,CAAC;AAC9B,qBAAW,QAAQ,OAAO,OAAO,MAAM,IAAI,GAAG;AAC5C,gBAAI,CAAC,KAAM;AACX,kBAAM,CAAC,UAAU,SAAS,UAAU,GAAG,SAAS,IAAI,KAAK,MAAM,GAAI;AACnE,kBAAM,OAAO,UAAU,KAAK,GAAI;AAChC,oBAAQ,KAAK;AAAA,cACX;AAAA,cACA,MAAM,aAAa,MAAM,cAAc;AAAA,cACvC,MAAM,SAAS,SAAS,EAAE,KAAK;AAAA,cAC/B,UAAU,IAAI,KAAK,WAAW,QAAQ,IAAI,GAAI;AAAA,YAChD,CAAC;AAAA,UACH;AACA,iBAAO;AAAA,QACT;AAAA,QAEA,QAAQ,OAAO,SAAS,MAAM,eAAe;AAC3C,gBAAM,SAAS,MAAM,WAAW,SAAS,WAAW,YAAY,IAAI,CAAC,EAAE;AACvE,iBAAO,OAAO,aAAa;AAAA,QAC7B;AAAA,QAEA,QAAQ,OAAO,SAAS,MAAM,eAAe;AAC3C,gBAAM,SAAS,MAAM,WAAW,SAAS,UAAU,YAAY,IAAI,CAAC,EAAE;AACtE,cAAI,OAAO,aAAa,GAAG;AACzB,kBAAM,IAAI,MAAM,oBAAoB,IAAI,KAAK,OAAO,MAAM,EAAE;AAAA,UAC9D;AAAA,QACF;AAAA,MACF;AAAA,MAEA,aAAa,CAAC,YAA0C;AAAA,IAC1D;AAAA,EACF;AACF,CAAC;AAEM,IAAM,SAAS,CAAC,SAAuB,CAAC,MAAM,UAAU,MAAM;","names":[]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["/**\n * Archil Provider\n *\n * Executes commands against an Archil disk via the Archil control-plane HTTP\n * API. Archil is exec-only — each command runs in an Archil-managed container\n * with the configured disk mounted, then returns stdout, stderr, and exit code.\n * There is no sandbox lifecycle to manage; \"create\" resolves a handle to an\n * existing disk id.\n */\n\nimport { defineProvider } from '@computesdk/provider';\nimport type {\n CodeResult,\n CommandResult,\n SandboxInfo,\n Runtime,\n CreateSandboxOptions,\n FileEntry,\n RunCommandOptions,\n} from 'computesdk';\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\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\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\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}\n\ninterface ArchilSandbox {\n disk: DiskResponse;\n resolved: ResolvedConfig;\n createdAt: Date;\n}\n\ninterface ArchilCreateOptions extends CreateSandboxOptions {\n diskId?: string;\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 };\n}\n\nfunction authHeader(apiKey: string): string {\n return `key-${apiKey.replace(/^key-/, '')}`;\n}\n\nasync function callApi<T>(\n resolved: ResolvedConfig,\n method: 'GET' | 'POST' | 'DELETE',\n path: string,\n body?: unknown,\n): Promise<T> {\n const response = await fetch(`${resolved.baseUrl}${path}`, {\n method,\n headers: {\n Authorization: authHeader(resolved.apiKey),\n ...(body ? { 'Content-Type': 'application/json' } : {}),\n },\n body: body ? JSON.stringify(body) : undefined,\n });\n\n type Envelope = { success?: boolean; data?: T; error?: string };\n let payload: Envelope | null = null;\n try {\n payload = (await response.json()) as Envelope;\n } catch {\n payload = null;\n }\n\n if (!response.ok || !payload || payload.success === false) {\n const message =\n (payload && payload.error) ||\n `Archil API ${method} ${path} failed with status ${response.status}`;\n throw new Error(message);\n }\n\n return payload.data as T;\n}\n\nfunction resolveCreateDiskId(options?: ArchilCreateOptions): string {\n const diskId = options?.diskId;\n\n if (!diskId) {\n throw new Error(\n 'Archil create() requires an existing disk id on the top-level options.\\n\\n' +\n 'Example:\\n' +\n ' provider.sandbox.create({ diskId: \"disk_abc123\" })',\n );\n }\n\n return diskId;\n}\n\nfunction shellEscape(value: string): string {\n return `'${value.replace(/'/g, `'\\\\''`)}'`;\n}\n\nfunction 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 callApi<ExecResponse>(\n sandbox.resolved,\n 'POST',\n `/api/disks/${encodeURIComponent(sandbox.disk.id)}/exec`,\n { command },\n );\n}\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 diskId = resolveCreateDiskId(options);\n const disk = await callApi<DiskResponse>(\n resolved,\n 'GET',\n `/api/disks/${encodeURIComponent(diskId)}`,\n );\n return {\n sandbox: { disk, resolved, createdAt: new Date() },\n sandboxId: disk.id,\n };\n },\n\n getById: async (config: ArchilConfig, sandboxId: string) => {\n const resolved = resolveConfig(config);\n try {\n const disk = await callApi<DiskResponse>(\n resolved,\n 'GET',\n `/api/disks/${encodeURIComponent(sandboxId)}`,\n );\n return {\n sandbox: { 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 disks = await callApi<DiskResponse[]>(resolved, 'GET', '/api/disks');\n return disks.map((disk) => ({\n sandbox: { disk, resolved, createdAt: new Date() },\n sandboxId: disk.id,\n }));\n },\n\n destroy: async (_config: ArchilConfig, _sandboxId: string) => {\n // No-op: Archil disks have an independent lifecycle.\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 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 return {\n id: sandbox.disk.id,\n provider: 'archil',\n runtime: 'node',\n status: sandbox.disk.status === 'ready' ? 'running' : 'stopped',\n createdAt: new Date(sandbox.disk.createdAt),\n timeout: 0,\n metadata: {\n name: sandbox.disk.name,\n organization: sandbox.disk.organization,\n region: sandbox.disk.region,\n provider: sandbox.disk.provider,\n },\n };\n },\n\n getUrl: async (\n _sandbox: ArchilSandbox,\n options: { port: number; protocol?: string },\n ): Promise<string> => {\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 const result = await runCommand(sandbox, `cat ${shellEscape(path)}`);\n if (result.exitCode !== 0) {\n throw new Error(`Failed to read ${path}: ${result.stderr}`);\n }\n return result.stdout;\n },\n\n writeFile: async (sandbox, path, content, runCommand) => {\n const parent = path.substring(0, path.lastIndexOf('/'));\n if (parent) {\n await runCommand(sandbox, `mkdir -p ${shellEscape(parent)}`);\n }\n // base64-pipe to avoid heredoc/quoting hazards on arbitrary content.\n const encoded = Buffer.from(content, 'utf8').toString('base64');\n const result = await runCommand(\n sandbox,\n `printf %s ${shellEscape(encoded)} | base64 -d > ${shellEscape(path)}`,\n );\n if (result.exitCode !== 0) {\n throw new Error(`Failed to write ${path}: ${result.stderr}`);\n }\n },\n\n mkdir: async (sandbox, path, runCommand) => {\n const result = await runCommand(sandbox, `mkdir -p ${shellEscape(path)}`);\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 // 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(path)} -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 result = await runCommand(sandbox, `test -e ${shellEscape(path)}`);\n return result.exitCode === 0;\n },\n\n remove: async (sandbox, path, runCommand) => {\n const result = await runCommand(sandbox, `rm -rf ${shellEscape(path)}`);\n if (result.exitCode !== 0) {\n throw new Error(`Failed to remove ${path}: ${result.stderr}`);\n }\n },\n },\n\n getInstance: (sandbox: ArchilSandbox): ArchilSandbox => sandbox,\n },\n },\n});\n\nexport const archil = (config: ArchilConfig = {}) => _provider(config);\n\nexport type { ArchilSandbox };\n"],"mappings":"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","names":[]}
package/dist/index.mjs CHANGED
@@ -156,36 +156,6 @@ var _provider = defineProvider({
156
156
  };
157
157
  }
158
158
  },
159
- runCode: async (sandbox, code, runtime, _config) => {
160
- if (!runtime) {
161
- throw new Error(
162
- 'Archil runCode requires an explicit runtime. Pass runtime: "node" or runtime: "python".'
163
- );
164
- }
165
- if (runtime !== "node" && runtime !== "python") {
166
- throw new Error(
167
- `Archil runCode does not support runtime "${runtime}". Supported runtimes: "node", "python".`
168
- );
169
- }
170
- const interpreter = runtime === "python" ? "python3" : "node";
171
- const flag = runtime === "python" ? "-c" : "-e";
172
- const command = `${interpreter} ${flag} ${shellEscape(code)}`;
173
- const result = await execOnDisk(sandbox, command);
174
- const stdout = result.stdout ?? "";
175
- const stderr = result.stderr ?? "";
176
- const output = stderr ? `${stdout}${stdout && stderr ? "\n" : ""}${stderr}` : stdout;
177
- if (result.exitCode !== 0) {
178
- const syntaxErrorPattern = runtime === "python" ? /\bSyntaxError\b|invalid syntax/i : /\bSyntaxError\b|Unexpected token|Unexpected identifier/i;
179
- if (syntaxErrorPattern.test(output)) {
180
- throw new Error(output || `${runtime} syntax error`);
181
- }
182
- }
183
- return {
184
- output,
185
- exitCode: result.exitCode,
186
- language: runtime
187
- };
188
- },
189
159
  getInfo: async (sandbox) => {
190
160
  return {
191
161
  id: sandbox.disk.id,
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["/**\n * Archil Provider\n *\n * Executes commands against an Archil disk via the Archil control-plane HTTP\n * API. Archil is exec-only — each command runs in an Archil-managed container\n * with the configured disk mounted, then returns stdout, stderr, and exit code.\n * There is no sandbox lifecycle to manage; \"create\" resolves a handle to an\n * existing disk id.\n */\n\nimport { defineProvider } from '@computesdk/provider';\nimport type {\n CodeResult,\n CommandResult,\n SandboxInfo,\n Runtime,\n CreateSandboxOptions,\n FileEntry,\n RunCommandOptions,\n} from 'computesdk';\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\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\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\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}\n\ninterface ArchilSandbox {\n disk: DiskResponse;\n resolved: ResolvedConfig;\n createdAt: Date;\n}\n\ninterface ArchilCreateOptions extends CreateSandboxOptions {\n diskId?: string;\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 };\n}\n\nfunction authHeader(apiKey: string): string {\n return `key-${apiKey.replace(/^key-/, '')}`;\n}\n\nasync function callApi<T>(\n resolved: ResolvedConfig,\n method: 'GET' | 'POST' | 'DELETE',\n path: string,\n body?: unknown,\n): Promise<T> {\n const response = await fetch(`${resolved.baseUrl}${path}`, {\n method,\n headers: {\n Authorization: authHeader(resolved.apiKey),\n ...(body ? { 'Content-Type': 'application/json' } : {}),\n },\n body: body ? JSON.stringify(body) : undefined,\n });\n\n type Envelope = { success?: boolean; data?: T; error?: string };\n let payload: Envelope | null = null;\n try {\n payload = (await response.json()) as Envelope;\n } catch {\n payload = null;\n }\n\n if (!response.ok || !payload || payload.success === false) {\n const message =\n (payload && payload.error) ||\n `Archil API ${method} ${path} failed with status ${response.status}`;\n throw new Error(message);\n }\n\n return payload.data as T;\n}\n\nfunction resolveCreateDiskId(options?: ArchilCreateOptions): string {\n const diskId = options?.diskId;\n\n if (!diskId) {\n throw new Error(\n 'Archil create() requires an existing disk id on the top-level options.\\n\\n' +\n 'Example:\\n' +\n ' provider.sandbox.create({ diskId: \"disk_abc123\" })',\n );\n }\n\n return diskId;\n}\n\nfunction shellEscape(value: string): string {\n return `'${value.replace(/'/g, `'\\\\''`)}'`;\n}\n\nfunction 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 callApi<ExecResponse>(\n sandbox.resolved,\n 'POST',\n `/api/disks/${encodeURIComponent(sandbox.disk.id)}/exec`,\n { command },\n );\n}\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 diskId = resolveCreateDiskId(options);\n const disk = await callApi<DiskResponse>(\n resolved,\n 'GET',\n `/api/disks/${encodeURIComponent(diskId)}`,\n );\n return {\n sandbox: { disk, resolved, createdAt: new Date() },\n sandboxId: disk.id,\n };\n },\n\n getById: async (config: ArchilConfig, sandboxId: string) => {\n const resolved = resolveConfig(config);\n try {\n const disk = await callApi<DiskResponse>(\n resolved,\n 'GET',\n `/api/disks/${encodeURIComponent(sandboxId)}`,\n );\n return {\n sandbox: { 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 disks = await callApi<DiskResponse[]>(resolved, 'GET', '/api/disks');\n return disks.map((disk) => ({\n sandbox: { disk, resolved, createdAt: new Date() },\n sandboxId: disk.id,\n }));\n },\n\n destroy: async (_config: ArchilConfig, _sandboxId: string) => {\n // No-op: Archil disks have an independent lifecycle.\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 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 runCode: async (\n sandbox: ArchilSandbox,\n code: string,\n runtime?: Runtime,\n _config?: ArchilConfig,\n ): Promise<CodeResult> => {\n if (!runtime) {\n throw new Error(\n 'Archil runCode requires an explicit runtime. Pass runtime: \"node\" or runtime: \"python\".',\n );\n }\n if (runtime !== 'node' && runtime !== 'python') {\n throw new Error(\n `Archil runCode does not support runtime \"${runtime}\". Supported runtimes: \"node\", \"python\".`,\n );\n }\n const interpreter = runtime === 'python' ? 'python3' : 'node';\n const flag = runtime === 'python' ? '-c' : '-e';\n const command = `${interpreter} ${flag} ${shellEscape(code)}`;\n\n const result = await execOnDisk(sandbox, command);\n const stdout = result.stdout ?? '';\n const stderr = result.stderr ?? '';\n const output = stderr ? `${stdout}${stdout && stderr ? '\\n' : ''}${stderr}` : stdout;\n\n if (result.exitCode !== 0) {\n const syntaxErrorPattern =\n runtime === 'python'\n ? /\\bSyntaxError\\b|invalid syntax/i\n : /\\bSyntaxError\\b|Unexpected token|Unexpected identifier/i;\n if (syntaxErrorPattern.test(output)) {\n throw new Error(output || `${runtime} syntax error`);\n }\n }\n\n return {\n output,\n exitCode: result.exitCode,\n language: runtime,\n };\n },\n\n getInfo: async (sandbox: ArchilSandbox): Promise<SandboxInfo> => {\n return {\n id: sandbox.disk.id,\n provider: 'archil',\n runtime: 'node',\n status: sandbox.disk.status === 'ready' ? 'running' : 'stopped',\n createdAt: new Date(sandbox.disk.createdAt),\n timeout: 0,\n metadata: {\n name: sandbox.disk.name,\n organization: sandbox.disk.organization,\n region: sandbox.disk.region,\n provider: sandbox.disk.provider,\n },\n };\n },\n\n getUrl: async (\n _sandbox: ArchilSandbox,\n options: { port: number; protocol?: string },\n ): Promise<string> => {\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 const result = await runCommand(sandbox, `cat ${shellEscape(path)}`);\n if (result.exitCode !== 0) {\n throw new Error(`Failed to read ${path}: ${result.stderr}`);\n }\n return result.stdout;\n },\n\n writeFile: async (sandbox, path, content, runCommand) => {\n const parent = path.substring(0, path.lastIndexOf('/'));\n if (parent) {\n await runCommand(sandbox, `mkdir -p ${shellEscape(parent)}`);\n }\n // base64-pipe to avoid heredoc/quoting hazards on arbitrary content.\n const encoded = Buffer.from(content, 'utf8').toString('base64');\n const result = await runCommand(\n sandbox,\n `printf %s ${shellEscape(encoded)} | base64 -d > ${shellEscape(path)}`,\n );\n if (result.exitCode !== 0) {\n throw new Error(`Failed to write ${path}: ${result.stderr}`);\n }\n },\n\n mkdir: async (sandbox, path, runCommand) => {\n const result = await runCommand(sandbox, `mkdir -p ${shellEscape(path)}`);\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 // 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(path)} -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 result = await runCommand(sandbox, `test -e ${shellEscape(path)}`);\n return result.exitCode === 0;\n },\n\n remove: async (sandbox, path, runCommand) => {\n const result = await runCommand(sandbox, `rm -rf ${shellEscape(path)}`);\n if (result.exitCode !== 0) {\n throw new Error(`Failed to remove ${path}: ${result.stderr}`);\n }\n },\n },\n\n getInstance: (sandbox: ArchilSandbox): ArchilSandbox => sandbox,\n },\n },\n});\n\nexport const archil = (config: ArchilConfig = {}) => _provider(config);\n\nexport type { ArchilSandbox };\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["/**\n * Archil Provider\n *\n * Executes commands against an Archil disk via the Archil control-plane HTTP\n * API. Archil is exec-only — each command runs in an Archil-managed container\n * with the configured disk mounted, then returns stdout, stderr, and exit code.\n * There is no sandbox lifecycle to manage; \"create\" resolves a handle to an\n * existing disk id.\n */\n\nimport { defineProvider } from '@computesdk/provider';\nimport type {\n CodeResult,\n CommandResult,\n SandboxInfo,\n Runtime,\n CreateSandboxOptions,\n FileEntry,\n RunCommandOptions,\n} from 'computesdk';\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\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\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\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}\n\ninterface ArchilSandbox {\n disk: DiskResponse;\n resolved: ResolvedConfig;\n createdAt: Date;\n}\n\ninterface ArchilCreateOptions extends CreateSandboxOptions {\n diskId?: string;\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 };\n}\n\nfunction authHeader(apiKey: string): string {\n return `key-${apiKey.replace(/^key-/, '')}`;\n}\n\nasync function callApi<T>(\n resolved: ResolvedConfig,\n method: 'GET' | 'POST' | 'DELETE',\n path: string,\n body?: unknown,\n): Promise<T> {\n const response = await fetch(`${resolved.baseUrl}${path}`, {\n method,\n headers: {\n Authorization: authHeader(resolved.apiKey),\n ...(body ? { 'Content-Type': 'application/json' } : {}),\n },\n body: body ? JSON.stringify(body) : undefined,\n });\n\n type Envelope = { success?: boolean; data?: T; error?: string };\n let payload: Envelope | null = null;\n try {\n payload = (await response.json()) as Envelope;\n } catch {\n payload = null;\n }\n\n if (!response.ok || !payload || payload.success === false) {\n const message =\n (payload && payload.error) ||\n `Archil API ${method} ${path} failed with status ${response.status}`;\n throw new Error(message);\n }\n\n return payload.data as T;\n}\n\nfunction resolveCreateDiskId(options?: ArchilCreateOptions): string {\n const diskId = options?.diskId;\n\n if (!diskId) {\n throw new Error(\n 'Archil create() requires an existing disk id on the top-level options.\\n\\n' +\n 'Example:\\n' +\n ' provider.sandbox.create({ diskId: \"disk_abc123\" })',\n );\n }\n\n return diskId;\n}\n\nfunction shellEscape(value: string): string {\n return `'${value.replace(/'/g, `'\\\\''`)}'`;\n}\n\nfunction 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 callApi<ExecResponse>(\n sandbox.resolved,\n 'POST',\n `/api/disks/${encodeURIComponent(sandbox.disk.id)}/exec`,\n { command },\n );\n}\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 diskId = resolveCreateDiskId(options);\n const disk = await callApi<DiskResponse>(\n resolved,\n 'GET',\n `/api/disks/${encodeURIComponent(diskId)}`,\n );\n return {\n sandbox: { disk, resolved, createdAt: new Date() },\n sandboxId: disk.id,\n };\n },\n\n getById: async (config: ArchilConfig, sandboxId: string) => {\n const resolved = resolveConfig(config);\n try {\n const disk = await callApi<DiskResponse>(\n resolved,\n 'GET',\n `/api/disks/${encodeURIComponent(sandboxId)}`,\n );\n return {\n sandbox: { 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 disks = await callApi<DiskResponse[]>(resolved, 'GET', '/api/disks');\n return disks.map((disk) => ({\n sandbox: { disk, resolved, createdAt: new Date() },\n sandboxId: disk.id,\n }));\n },\n\n destroy: async (_config: ArchilConfig, _sandboxId: string) => {\n // No-op: Archil disks have an independent lifecycle.\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 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 return {\n id: sandbox.disk.id,\n provider: 'archil',\n runtime: 'node',\n status: sandbox.disk.status === 'ready' ? 'running' : 'stopped',\n createdAt: new Date(sandbox.disk.createdAt),\n timeout: 0,\n metadata: {\n name: sandbox.disk.name,\n organization: sandbox.disk.organization,\n region: sandbox.disk.region,\n provider: sandbox.disk.provider,\n },\n };\n },\n\n getUrl: async (\n _sandbox: ArchilSandbox,\n options: { port: number; protocol?: string },\n ): Promise<string> => {\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 const result = await runCommand(sandbox, `cat ${shellEscape(path)}`);\n if (result.exitCode !== 0) {\n throw new Error(`Failed to read ${path}: ${result.stderr}`);\n }\n return result.stdout;\n },\n\n writeFile: async (sandbox, path, content, runCommand) => {\n const parent = path.substring(0, path.lastIndexOf('/'));\n if (parent) {\n await runCommand(sandbox, `mkdir -p ${shellEscape(parent)}`);\n }\n // base64-pipe to avoid heredoc/quoting hazards on arbitrary content.\n const encoded = Buffer.from(content, 'utf8').toString('base64');\n const result = await runCommand(\n sandbox,\n `printf %s ${shellEscape(encoded)} | base64 -d > ${shellEscape(path)}`,\n );\n if (result.exitCode !== 0) {\n throw new Error(`Failed to write ${path}: ${result.stderr}`);\n }\n },\n\n mkdir: async (sandbox, path, runCommand) => {\n const result = await runCommand(sandbox, `mkdir -p ${shellEscape(path)}`);\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 // 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(path)} -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 result = await runCommand(sandbox, `test -e ${shellEscape(path)}`);\n return result.exitCode === 0;\n },\n\n remove: async (sandbox, path, runCommand) => {\n const result = await runCommand(sandbox, `rm -rf ${shellEscape(path)}`);\n if (result.exitCode !== 0) {\n throw new Error(`Failed to remove ${path}: ${result.stderr}`);\n }\n },\n },\n\n getInstance: (sandbox: ArchilSandbox): ArchilSandbox => sandbox,\n },\n },\n});\n\nexport const archil = (config: ArchilConfig = {}) => _provider(config);\n\nexport type { ArchilSandbox };\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@computesdk/archil",
3
- "version": "0.4.0",
3
+ "version": "0.4.1",
4
4
  "description": "Archil provider for ComputeSDK - exec commands against an Archil disk",
5
5
  "author": "ComputeSDK",
6
6
  "license": "MIT",
@@ -18,8 +18,8 @@
18
18
  "dist"
19
19
  ],
20
20
  "dependencies": {
21
- "@computesdk/provider": "1.3.0",
22
- "computesdk": "2.6.0"
21
+ "computesdk": "3.0.0",
22
+ "@computesdk/provider": "1.4.0"
23
23
  },
24
24
  "devDependencies": {
25
25
  "@types/node": "^20.0.0",