@slicervm/sdk 0.1.2 → 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -161,9 +161,9 @@ var TransportClient = class {
161
161
  });
162
162
  }
163
163
  /** Streaming request producing a Node Readable of the response body. */
164
- requestStreamRaw(method, reqPath, body, contentType = "application/octet-stream") {
164
+ requestStreamRaw(method, reqPath, body, contentType = "application/octet-stream", extraHeaders = {}) {
165
165
  return new Promise((resolve, reject) => {
166
- const headers = {};
166
+ const headers = { ...extraHeaders };
167
167
  if (body instanceof Buffer) {
168
168
  headers["Content-Type"] = contentType;
169
169
  headers["Content-Length"] = String(body.length);
@@ -650,6 +650,85 @@ var VMFileSystem = class {
650
650
  );
651
651
  for await (const _ of res) void _;
652
652
  }
653
+ /**
654
+ * Open a Server-Sent Events stream of filesystem events from the VM.
655
+ * Yields one `FSWatchEvent` per agent-side event. The stream stays open
656
+ * until the supplied request's `timeout` / `maxEvents` is hit, the daemon
657
+ * tears it down, or the caller breaks out of the loop.
658
+ *
659
+ * Heartbeat SSE comments and named `event:` lines are silently dropped.
660
+ *
661
+ * Example:
662
+ * ```ts
663
+ * for await (const e of vm.fs.watch({ paths: ['/tmp'], recursive: true })) {
664
+ * console.log(e.type, e.path);
665
+ * }
666
+ * ```
667
+ */
668
+ async *watch(req) {
669
+ if (!req.paths || req.paths.length === 0) {
670
+ throw new Error("vm.fs.watch: paths is required");
671
+ }
672
+ const q = new URLSearchParams();
673
+ for (const p of req.paths) if (p) q.append("paths", p);
674
+ for (const p of req.patterns ?? []) if (p) q.append("patterns", p);
675
+ for (const e of req.events ?? []) if (e) q.append("events", e);
676
+ if (req.uid !== void 0 && req.uid !== 0) q.set("uid", String(req.uid));
677
+ if (req.recursive) q.set("recursive", "true");
678
+ if (req.oneShot) q.set("one_shot", "true");
679
+ if (req.debounce) q.set("debounce", req.debounce);
680
+ if (req.timeout) q.set("timeout", req.timeout);
681
+ if (req.maxEvents !== void 0 && req.maxEvents > 0) {
682
+ q.set("max_events", String(req.maxEvents));
683
+ }
684
+ const extraHeaders = { Accept: "text/event-stream" };
685
+ if (req.lastEventId) extraHeaders["Last-Event-ID"] = req.lastEventId;
686
+ const res = await this.transport.requestStreamRaw(
687
+ "GET",
688
+ `/vm/${encodeURIComponent(this.hostname)}/fs/watch?${q.toString()}`,
689
+ void 0,
690
+ void 0,
691
+ extraHeaders
692
+ );
693
+ res.setEncoding("utf8");
694
+ let buffer = "";
695
+ let dataLines = [];
696
+ let pendingId = 0;
697
+ for await (const chunk of res) {
698
+ buffer += chunk;
699
+ let nl;
700
+ while ((nl = buffer.indexOf("\n")) >= 0) {
701
+ const raw = buffer.slice(0, nl);
702
+ buffer = buffer.slice(nl + 1);
703
+ const line = raw.endsWith("\r") ? raw.slice(0, -1) : raw;
704
+ if (line === "") {
705
+ if (dataLines.length > 0) {
706
+ const payload = dataLines.join("\n");
707
+ dataLines = [];
708
+ try {
709
+ const parsed = JSON.parse(payload);
710
+ const evt = {
711
+ id: typeof parsed.id === "number" && parsed.id !== 0 ? parsed.id : pendingId,
712
+ type: parsed.type ?? "",
713
+ path: parsed.path ?? "",
714
+ timestamp: parsed.timestamp ?? "",
715
+ size: parsed.size ?? 0,
716
+ isDir: parsed.isDir ?? false,
717
+ ...parsed.message !== void 0 && { message: parsed.message }
718
+ };
719
+ yield evt;
720
+ } catch {
721
+ }
722
+ }
723
+ } else if (line.startsWith(":")) ; else if (line.startsWith("data:")) {
724
+ dataLines.push(line.slice(5).replace(/^ /, ""));
725
+ } else if (line.startsWith("id:")) {
726
+ const v = parseInt(line.slice(3).trim(), 10);
727
+ if (!Number.isNaN(v)) pendingId = v;
728
+ }
729
+ }
730
+ }
731
+ }
653
732
  /** Download `path` from the VM as a tar archive. */
654
733
  async tarFrom(path3) {
655
734
  const q = new URLSearchParams({ path: path3, mode: "tar" });
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/types.ts","../src/transport.ts","../src/wire.ts","../src/forward.ts","../src/vm.ts","../src/namespaces.ts","../src/client.ts"],"names":["path","os","URL","https","http","createNetServer","ws","createWebSocketStream","fs","WebSocket","net"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Slicer API types. Wire shapes mirror the Go SDK at github.com/slicervm/sdk\n * (which calls these \"Node\" / \"SlicerNode\"); the TS SDK renames to \"VM\" for\n * clarity, since Slicer's primary primitive is a VM.\n */\n\nexport interface HostGroup {\n name: string;\n count: number;\n ramBytes: number;\n cpus: number;\n arch: string;\n gpuCount?: number;\n}\n\nexport interface VMInfo {\n hostname: string;\n hostGroup?: string;\n ip: string;\n ramBytes?: number;\n cpus?: number;\n createdAt: string;\n arch?: string;\n tags?: string[];\n status?: string;\n persistent?: boolean;\n}\n\nexport interface CreateVMRequest {\n ramBytes?: number;\n cpus?: number;\n gpuCount?: number;\n persistent?: boolean;\n diskImage?: string;\n importUser?: string;\n sshKeys?: string[];\n userdata?: string;\n ip?: string;\n tags?: string[];\n secrets?: string[];\n}\n\nexport interface CreateVMResponse {\n hostname: string;\n hostGroup?: string;\n ip: string;\n createdAt: string;\n arch?: string;\n}\n\nexport interface AgentHealth {\n hostname?: string;\n agentUptime?: number;\n agentVersion?: string;\n systemUptime?: number;\n userdataRan?: boolean;\n}\n\nexport interface VMLogs {\n hostname: string;\n lines: number;\n content: string;\n}\n\nexport interface DeleteResponse {\n message?: string;\n diskRemoved?: string;\n error?: string;\n}\n\n/** Wire encoding of exec stdout/stderr. Defaults to `\"text\"`. */\nexport type ExecStdio = 'text' | 'base64';\nexport const ExecStdioText: ExecStdio = 'text';\nexport const ExecStdioBase64: ExecStdio = 'base64';\n\nexport interface ExecRequest {\n command?: string;\n args?: string[];\n env?: string[];\n uid?: number;\n gid?: number;\n stdin?: Buffer | string;\n shell?: string;\n cwd?: string;\n permissions?: string;\n /**\n * Wire encoding for stdout/stderr.\n * - `\"text\"` (default): frames carry UTF-8 strings. Safe for text output only —\n * arbitrary binary will be mangled by JSON string escaping.\n * - `\"base64\"`: frames carry base64-encoded bytes. Required for binary output\n * (video, compressed archives, raw protocol streams). The SDK decodes\n * automatically — callers get `Buffer` on `execBuffered({ stdio: 'base64' })`\n * and `{stdoutBytes, stderrBytes, dataBytes}` on streamed frames.\n */\n stdio?: ExecStdio;\n}\n\nexport interface ExecFrame {\n timestamp?: string;\n type?: string;\n pid?: number;\n encoding?: ExecStdio;\n /** Raw wire value — string under text mode, base64 string under base64 mode. */\n data?: string;\n startedAt?: string;\n endedAt?: string;\n signal?: string;\n stdout?: string;\n stderr?: string;\n /** Decoded bytes when `encoding === 'base64'`. SDK-populated convenience field. */\n dataBytes?: Buffer;\n stdoutBytes?: Buffer;\n stderrBytes?: Buffer;\n exitCode?: number;\n error?: string;\n}\n\nexport interface ExecResult {\n stdout: string;\n stderr: string;\n encoding?: ExecStdio;\n pid?: number;\n startedAt?: string;\n endedAt?: string;\n signal?: string;\n exitCode: number;\n error?: string;\n}\n\n/** Returned by `execBuffered` when `stdio === 'base64'`. stdout/stderr are decoded Buffers. */\nexport interface ExecResultBinary {\n stdout: Buffer;\n stderr: Buffer;\n encoding: 'base64';\n pid?: number;\n startedAt?: string;\n endedAt?: string;\n signal?: string;\n exitCode: number;\n error?: string;\n}\n\nexport interface FSEntry {\n name: string;\n type: 'file' | 'directory' | 'symlink' | string;\n size: number;\n mtime: string;\n mode: string;\n}\n\nexport interface FSMkdirRequest {\n path: string;\n recursive?: boolean;\n mode?: string;\n}\n\nexport interface ShutdownRequest {\n action?: 'shutdown' | 'reboot';\n}\n\nexport interface VMStat {\n hostname: string;\n ip: string;\n createdAt: string;\n snapshot?: VMSnapshot | null;\n error?: string;\n}\n\nexport interface VMSnapshot {\n hostname: string;\n arch: string;\n timestamp: string;\n uptime: string;\n totalCpus: number;\n totalMemory: number;\n memoryUsed: number;\n memoryAvailable: number;\n memoryUsedPercent: number;\n loadAvg1: number;\n loadAvg5: number;\n loadAvg15: number;\n diskReadTotal: number;\n diskWriteTotal: number;\n networkReadTotal: number;\n networkWriteTotal: number;\n diskIOInflight: number;\n openConnections: number;\n openFiles: number;\n entropy: number;\n diskSpaceTotal: number;\n diskSpaceUsed: number;\n diskSpaceFree: number;\n diskSpaceUsedPercent: number;\n}\n\nexport interface SlicerInfo {\n version?: string;\n gitCommit?: string;\n platform?: string;\n arch?: string;\n}\n\nexport interface ListOptions {\n tag?: string;\n tagPrefix?: string;\n}\n\nexport interface WaitOptions {\n timeoutMs?: number;\n intervalMs?: number;\n}\n\nexport interface CreateVMOptions {\n /**\n * Server-side wait: `\"agent\"` waits for the in-guest agent to be ready,\n * `\"userdata\"` additionally waits for userdata to run. If unset the daemon\n * returns immediately once the VM is scheduled.\n */\n wait?: 'agent' | 'userdata';\n /** Server-side wait timeout, in seconds. Forwarded as a Go duration. */\n waitTimeoutSec?: number;\n}\n\nexport interface Secret {\n name: string;\n size: number;\n permissions: string;\n uid?: number;\n gid?: number;\n modifiedAt?: string;\n}\n\nexport interface CreateSecretRequest {\n name: string;\n data: string;\n permissions?: string;\n uid?: number;\n gid?: number;\n}\n\nexport interface UpdateSecretRequest {\n data: string;\n permissions?: string;\n uid?: number;\n gid?: number;\n}\n\nexport class SecretExistsError extends Error {\n constructor(name: string) {\n super(`secret already exists: ${name}`);\n this.name = 'SecretExistsError';\n }\n}\n\nexport class SlicerAPIError extends Error {\n readonly status: number;\n readonly method: string;\n readonly path: string;\n readonly body: string;\n constructor(method: string, path: string, status: number, body: string) {\n super(`slicer ${method} ${path} failed: ${status} ${body}`);\n this.name = 'SlicerAPIError';\n this.method = method;\n this.path = path;\n this.status = status;\n this.body = body;\n }\n}\n\nexport const MiB = (n: number): number => n * 1024 * 1024;\nexport const GiB = (n: number): number => n * 1024 * 1024 * 1024;\nexport const NonRootUser = 0xffffffff;\n","/**\n * HTTP transport for the Slicer API. Supports two modes:\n * - Unix socket: absolute path (`/...`), `unix://...`, `./...`, `../...`, `~/...`, or any `*.sock`.\n * - Network URL: `http://host[:port]` or `https://host`.\n *\n * Mirrors the detection rules in the Go SDK's `normalizeUnixSocketPath`.\n */\n\nimport http, { IncomingMessage, RequestOptions } from 'node:http';\nimport https from 'node:https';\nimport { Readable } from 'node:stream';\nimport { URL } from 'node:url';\nimport os from 'node:os';\nimport path from 'node:path';\n\nimport { SlicerAPIError } from './types.js';\n\nexport type Transport =\n | { kind: 'socket'; socketPath: string }\n | { kind: 'net'; url: URL };\n\nexport function resolveTransport(baseURL: string): Transport {\n const trimmed = baseURL.trim();\n if (!trimmed) throw new Error('Slicer baseURL is required');\n\n let candidate = trimmed;\n if (candidate.startsWith('unix://')) candidate = candidate.slice('unix://'.length);\n if (candidate.startsWith('~/')) candidate = path.join(os.homedir(), candidate.slice(2));\n\n const socketLike =\n candidate.startsWith('/') ||\n candidate.startsWith('./') ||\n candidate.startsWith('../') ||\n candidate.endsWith('.sock');\n if (socketLike) return { kind: 'socket', socketPath: candidate };\n\n return { kind: 'net', url: new URL(trimmed) };\n}\n\nexport interface TransportClientOptions {\n baseURL: string;\n token?: string;\n userAgent?: string;\n}\n\nexport class TransportClient {\n readonly transport: Transport;\n readonly token?: string;\n readonly userAgent: string;\n\n constructor(opts: TransportClientOptions) {\n this.transport = resolveTransport(opts.baseURL);\n this.token = opts.token;\n this.userAgent = opts.userAgent ?? 'slicer-sdk-ts/0.1.0';\n }\n\n private agent() {\n return this.transport.kind === 'net' && this.transport.url.protocol === 'https:'\n ? https\n : http;\n }\n\n private buildRequestOptions(\n method: string,\n reqPath: string,\n extraHeaders: Record<string, string> = {},\n ): RequestOptions {\n const headers: Record<string, string> = {\n 'User-Agent': this.userAgent,\n ...extraHeaders,\n };\n if (this.token) headers['Authorization'] = `Bearer ${this.token}`;\n\n if (this.transport.kind === 'socket') {\n return {\n socketPath: this.transport.socketPath,\n method,\n path: reqPath,\n headers,\n setHost: true,\n };\n }\n const u = this.transport.url;\n return {\n protocol: u.protocol,\n hostname: u.hostname,\n port: u.port || (u.protocol === 'https:' ? 443 : 80),\n method,\n path: reqPath,\n headers,\n };\n }\n\n /** Buffered JSON request. Rejects on non-2xx via SlicerAPIError. */\n request<T = unknown>(method: string, reqPath: string, body?: unknown): Promise<T> {\n return new Promise((resolve, reject) => {\n const payload = body === undefined ? undefined : Buffer.from(JSON.stringify(body));\n const headers: Record<string, string> = {};\n if (payload) {\n headers['Content-Type'] = 'application/json';\n headers['Content-Length'] = String(payload.length);\n }\n const req = this.agent().request(\n this.buildRequestOptions(method, reqPath, headers),\n (res: IncomingMessage) => {\n const chunks: Buffer[] = [];\n res.on('data', (c) => chunks.push(c));\n res.on('end', () => {\n const raw = Buffer.concat(chunks).toString('utf8');\n const status = res.statusCode ?? 0;\n if (status < 200 || status >= 300) {\n reject(new SlicerAPIError(method, reqPath, status, raw));\n return;\n }\n if (!raw) {\n resolve(undefined as unknown as T);\n return;\n }\n try {\n resolve(JSON.parse(raw) as T);\n } catch {\n resolve(raw as unknown as T);\n }\n });\n res.on('error', reject);\n },\n );\n req.on('error', reject);\n if (payload) req.write(payload);\n req.end();\n });\n }\n\n /** Raw-bytes request (for binary cp endpoints). */\n requestRaw(\n method: string,\n reqPath: string,\n body?: Buffer,\n contentType = 'application/octet-stream',\n ): Promise<Buffer> {\n return new Promise((resolve, reject) => {\n const headers: Record<string, string> = {};\n if (body) {\n headers['Content-Type'] = contentType;\n headers['Content-Length'] = String(body.length);\n }\n const req = this.agent().request(\n this.buildRequestOptions(method, reqPath, headers),\n (res) => {\n const chunks: Buffer[] = [];\n res.on('data', (c) => chunks.push(c));\n res.on('end', () => {\n const out = Buffer.concat(chunks);\n const status = res.statusCode ?? 0;\n if (status < 200 || status >= 300) {\n reject(new SlicerAPIError(method, reqPath, status, out.toString('utf8')));\n return;\n }\n resolve(out);\n });\n res.on('error', reject);\n },\n );\n req.on('error', reject);\n if (body) req.write(body);\n req.end();\n });\n }\n\n /** Streaming request producing a Node Readable of the response body. */\n requestStreamRaw(\n method: string,\n reqPath: string,\n body?: Buffer | Readable,\n contentType = 'application/octet-stream',\n ): Promise<IncomingMessage> {\n return new Promise((resolve, reject) => {\n const headers: Record<string, string> = {};\n if (body instanceof Buffer) {\n headers['Content-Type'] = contentType;\n headers['Content-Length'] = String(body.length);\n } else if (body) {\n headers['Content-Type'] = contentType;\n headers['Transfer-Encoding'] = 'chunked';\n }\n const req = this.agent().request(\n this.buildRequestOptions(method, reqPath, headers),\n (res) => {\n const status = res.statusCode ?? 0;\n if (status < 200 || status >= 300) {\n const chunks: Buffer[] = [];\n res.on('data', (c) => chunks.push(c));\n res.on('end', () =>\n reject(\n new SlicerAPIError(method, reqPath, status, Buffer.concat(chunks).toString('utf8')),\n ),\n );\n return;\n }\n resolve(res);\n },\n );\n req.on('error', reject);\n if (body instanceof Buffer) {\n req.write(body);\n req.end();\n } else if (body) {\n (body as Readable).pipe(req);\n } else {\n req.end();\n }\n });\n }\n\n /** Yields decoded JSON frames from an NDJSON response (one JSON object per line). */\n async *requestNDJSON<Frame = unknown>(\n method: string,\n reqPath: string,\n body?: Buffer | Readable,\n ): AsyncGenerator<Frame, void, void> {\n const res = await this.requestStreamRaw(method, reqPath, body);\n res.setEncoding('utf8');\n let buffer = '';\n for await (const chunk of res as AsyncIterable<string>) {\n buffer += chunk;\n let nl: number;\n while ((nl = buffer.indexOf('\\n')) >= 0) {\n const line = buffer.slice(0, nl).trim();\n buffer = buffer.slice(nl + 1);\n if (!line) continue;\n try {\n yield JSON.parse(line) as Frame;\n } catch {\n /* skip keep-alives / unparseable lines */\n }\n }\n }\n const trailing = buffer.trim();\n if (trailing) {\n try {\n yield JSON.parse(trailing) as Frame;\n } catch {\n /* ignore */\n }\n }\n }\n}\n","/**\n * Wire-format converters. The only place camelCase ↔ snake_case bridging\n * should live. All outbound request bodies and inbound response bodies are\n * shaped exactly as the daemon emits; model types above are idiomatic TS.\n */\n\nimport type {\n AgentHealth,\n CreateVMRequest,\n CreateVMResponse,\n FSEntry,\n HostGroup,\n Secret,\n VMInfo,\n VMStat,\n} from './types.js';\n\nexport interface WireHostGroup {\n name?: string;\n count?: number;\n ram_bytes?: number;\n cpus?: number;\n arch?: string;\n gpu_count?: number;\n}\n\nexport interface WireVM {\n hostname: string;\n hostgroup?: string;\n ip: string;\n ram_bytes?: number;\n cpus?: number;\n created_at: string;\n arch?: string;\n tags?: string[];\n status?: string;\n persistent?: boolean;\n}\n\nexport interface WireCreateVMRequest {\n ram_bytes?: number;\n cpus?: number;\n gpu_count?: number;\n persistent?: boolean;\n disk_image?: string;\n import_user?: string;\n ssh_keys?: string[];\n userdata?: string;\n ip?: string;\n tags?: string[];\n secrets?: string[];\n}\n\nexport interface WireCreateVMResponse {\n hostname: string;\n hostgroup?: string;\n ip: string;\n created_at: string;\n arch?: string;\n}\n\nexport interface WireAgentHealth {\n hostname?: string;\n agent_uptime?: number;\n agent_version?: string;\n system_uptime?: number;\n userdata_ran?: boolean;\n}\n\nexport interface WireFSInfo {\n name: string;\n type: string;\n size: number;\n mtime: string;\n mode: string;\n}\n\nexport interface WireVMStat {\n hostname: string;\n ip: string;\n created_at: string;\n snapshot?: unknown;\n error?: string;\n}\n\nexport interface WireSecret {\n name: string;\n size: number;\n permissions: string;\n uid?: number;\n gid?: number;\n modified_at?: string;\n}\n\nexport function hostGroupFromWire(w: WireHostGroup): HostGroup {\n return {\n name: w.name ?? '',\n count: w.count ?? 0,\n ramBytes: w.ram_bytes ?? 0,\n cpus: w.cpus ?? 0,\n arch: w.arch ?? '',\n ...(w.gpu_count !== undefined && { gpuCount: w.gpu_count }),\n };\n}\n\nexport function vmFromWire(w: WireVM): VMInfo {\n return {\n hostname: w.hostname,\n ip: w.ip,\n createdAt: w.created_at,\n ...(w.hostgroup !== undefined && { hostGroup: w.hostgroup }),\n ...(w.ram_bytes !== undefined && { ramBytes: w.ram_bytes }),\n ...(w.cpus !== undefined && { cpus: w.cpus }),\n ...(w.arch !== undefined && { arch: w.arch }),\n ...(w.tags !== undefined && { tags: w.tags }),\n ...(w.status !== undefined && { status: w.status }),\n ...(w.persistent !== undefined && { persistent: w.persistent }),\n };\n}\n\nexport function createVMReqToWire(r: CreateVMRequest): WireCreateVMRequest {\n const o: WireCreateVMRequest = {};\n if (r.ramBytes !== undefined) o.ram_bytes = r.ramBytes;\n if (r.cpus !== undefined) o.cpus = r.cpus;\n if (r.gpuCount !== undefined) o.gpu_count = r.gpuCount;\n if (r.persistent !== undefined) o.persistent = r.persistent;\n if (r.diskImage !== undefined) o.disk_image = r.diskImage;\n if (r.importUser !== undefined) o.import_user = r.importUser;\n if (r.sshKeys !== undefined) o.ssh_keys = r.sshKeys;\n if (r.userdata !== undefined) o.userdata = r.userdata;\n if (r.ip !== undefined) o.ip = r.ip;\n if (r.tags !== undefined) o.tags = r.tags;\n if (r.secrets !== undefined) o.secrets = r.secrets;\n return o;\n}\n\nexport function createVMResFromWire(w: WireCreateVMResponse): CreateVMResponse {\n return {\n hostname: w.hostname,\n ip: w.ip,\n createdAt: w.created_at,\n ...(w.hostgroup !== undefined && { hostGroup: w.hostgroup }),\n ...(w.arch !== undefined && { arch: w.arch }),\n };\n}\n\nexport function agentHealthFromWire(w: WireAgentHealth): AgentHealth {\n return {\n ...(w.hostname !== undefined && { hostname: w.hostname }),\n ...(w.agent_uptime !== undefined && { agentUptime: w.agent_uptime }),\n ...(w.agent_version !== undefined && { agentVersion: w.agent_version }),\n ...(w.system_uptime !== undefined && { systemUptime: w.system_uptime }),\n ...(w.userdata_ran !== undefined && { userdataRan: w.userdata_ran }),\n };\n}\n\nexport function fsEntryFromWire(w: WireFSInfo): FSEntry {\n return { name: w.name, type: w.type, size: w.size, mtime: w.mtime, mode: w.mode };\n}\n\nexport function vmStatFromWire(w: WireVMStat): VMStat {\n return {\n hostname: w.hostname,\n ip: w.ip,\n createdAt: w.created_at,\n ...(w.snapshot !== undefined && { snapshot: w.snapshot as VMStat['snapshot'] }),\n ...(w.error !== undefined && { error: w.error }),\n };\n}\n\nexport function secretFromWire(w: WireSecret): Secret {\n return {\n name: w.name,\n size: w.size,\n permissions: w.permissions,\n ...(w.uid !== undefined && { uid: w.uid }),\n ...(w.gid !== undefined && { gid: w.gid }),\n ...(w.modified_at !== undefined && { modifiedAt: w.modified_at }),\n };\n}\n","/**\n * Port forwarding for Slicer VMs.\n *\n * Per-connection WebSocket model: each accepted local TCP/Unix connection\n * opens a fresh WebSocket to /vm/{hostname}/forward on the daemon. The\n * WebSocket carries raw bytes both directions (binary frames, no framing\n * subprotocol). The daemon uses the `X-Inlets-Upstream` header on the\n * upgrade request to decide where to dial inside the VM.\n */\n\nimport net, { createServer as createNetServer, type Server as TcpServer, type Socket } from 'node:net';\nimport os from 'node:os';\nimport path from 'node:path';\nimport fs from 'node:fs';\nimport http, { type Agent as HttpAgent } from 'node:http';\nimport { WebSocket, type ClientOptions as WSClientOptions, createWebSocketStream } from 'ws';\nimport type { Transport } from './transport.js';\n\n// --- address-mapping parser ----------------------------------------------\n\nexport interface AddressMapping {\n rawSpec: string;\n /** TCP listen address, or undefined when listening on a Unix socket. */\n listenAddr?: string;\n /** TCP listen port, or undefined when listening on a Unix socket. */\n listenPort?: number;\n /** Listen Unix socket path, or undefined when listening on TCP. */\n listenUnixPath?: string;\n /** Remote host inside the VM, or undefined when targeting a Unix socket. */\n remoteHost?: string;\n /** Remote port inside the VM, or undefined when targeting a Unix socket. */\n remotePort?: number;\n /** Remote Unix socket path inside the VM, or undefined when targeting TCP. */\n remoteUnixPath?: string;\n}\n\nfunction looksLikeUnixSocketPath(s: string): boolean {\n if (!s) return false;\n return s.startsWith('/') || s.startsWith('./') || s.startsWith('../') || s.includes('/');\n}\n\n/**\n * Parse a `-L`-style spec into an {@link AddressMapping}. Supported formats\n * mirror the Go SDK's `slicer vm forward` CLI:\n *\n * - `127.0.0.1:9000` — listen and forward on the same TCP host:port\n * - `9001:127.0.0.1:9000` — listen on `0.0.0.0:9001`, forward to `127.0.0.1:9000`\n * - `0:127.0.0.1:9000` — listen on a random TCP port, forward as above\n * - `0.0.0.0:9000:127.0.0.1:9000` — listen and forward, fully explicit\n * - `127.0.0.1:9000:/var/run/docker.sock` — TCP listen, Unix socket forward\n * - `9000:/var/run/docker.sock` — `0.0.0.0:9000` listen, Unix socket forward\n * - `/tmp/docker.sock:/var/run/docker.sock` — Unix-to-Unix forward\n * - `./docker.sock:/var/run/docker.sock` — Unix-to-Unix with relative local\n */\nexport function parseAddressMapping(spec: string): AddressMapping {\n // Unix-to-Unix: both sides look like paths.\n const lastColon = spec.lastIndexOf(':');\n if (lastColon !== -1) {\n const localPart = spec.slice(0, lastColon);\n const remotePart = spec.slice(lastColon + 1);\n if (looksLikeUnixSocketPath(localPart) && looksLikeUnixSocketPath(remotePart)) {\n const localAbs = path.isAbsolute(localPart) ? localPart : path.resolve(localPart);\n return { rawSpec: spec, listenUnixPath: localAbs, remoteUnixPath: remotePart };\n }\n }\n\n // TCP-to-Unix: the substring `:/` marks the boundary.\n const tcpToUnix = spec.indexOf(':/');\n if (tcpToUnix !== -1) {\n const listenPart = spec.slice(0, tcpToUnix);\n const socketPath = spec.slice(tcpToUnix + 1); // keep leading slash\n const innerColon = listenPart.lastIndexOf(':');\n if (innerColon === -1) {\n return {\n rawSpec: spec,\n listenAddr: '0.0.0.0',\n listenPort: parsePort(listenPart, spec),\n remoteUnixPath: socketPath,\n };\n }\n return {\n rawSpec: spec,\n listenAddr: listenPart.slice(0, innerColon),\n listenPort: parsePort(listenPart.slice(innerColon + 1), spec),\n remoteUnixPath: socketPath,\n };\n }\n\n const parts = spec.split(':');\n switch (parts.length) {\n case 2:\n return {\n rawSpec: spec,\n listenAddr: parts[0]!,\n listenPort: parsePort(parts[1]!, spec),\n remoteHost: parts[0]!,\n remotePort: parsePort(parts[1]!, spec),\n };\n case 3:\n return {\n rawSpec: spec,\n listenAddr: parts[1]!,\n listenPort: parsePort(parts[0]!, spec),\n remoteHost: parts[1]!,\n remotePort: parsePort(parts[2]!, spec),\n };\n case 4:\n return {\n rawSpec: spec,\n listenAddr: parts[0]!,\n listenPort: parsePort(parts[1]!, spec),\n remoteHost: parts[2]!,\n remotePort: parsePort(parts[3]!, spec),\n };\n default:\n throw new Error(`invalid forward spec ${JSON.stringify(spec)}: expected 2-4 colon-separated parts`);\n }\n}\n\nfunction parsePort(s: string, spec: string): number {\n const n = Number(s);\n if (!Number.isInteger(n) || n < 0 || n > 65535) {\n throw new Error(`invalid port ${JSON.stringify(s)} in forward spec ${JSON.stringify(spec)}`);\n }\n return n;\n}\n\nfunction isListenUnix(m: AddressMapping): boolean {\n return m.listenUnixPath !== undefined;\n}\n\nfunction remoteTargetHeader(m: AddressMapping): string {\n if (m.remoteUnixPath) return `unix:${m.remoteUnixPath}`;\n return `${m.remoteHost}:${m.remotePort}`;\n}\n\nfunction listenAddressDescription(m: AddressMapping): string {\n if (isListenUnix(m)) return m.listenUnixPath!;\n return `${m.listenAddr}:${m.listenPort}`;\n}\n\n// --- forwarder ------------------------------------------------------------\n\nexport interface ForwarderListener {\n /** The original spec string that produced this listener. */\n spec: string;\n /** Human-readable local address (`127.0.0.1:8080`, `/tmp/docker.sock`, etc). */\n local: string;\n /** Human-readable upstream target inside the VM. */\n remote: string;\n /** Resolved port for TCP listeners (useful when caller asked for `0`). */\n port?: number;\n}\n\nexport interface ForwarderOptions {\n /** Identifies this client to the daemon. Defaults to `os.hostname()`. */\n clientId?: string;\n /** WebSocket dial timeout (ms). Default 10_000. */\n dialTimeoutMs?: number;\n /**\n * Optional logger for connection events. Receives short strings. Default: silent.\n */\n log?: (msg: string) => void;\n}\n\nexport interface ForwarderInit {\n hostname: string;\n transport: Transport;\n token?: string;\n userAgent: string;\n specs: string[];\n options?: ForwarderOptions;\n}\n\n/**\n * A live set of port forwards for one VM. Returned by `vm.forward(...)`.\n * Closing the forwarder tears down all local listeners and any in-flight\n * tunnel WebSockets.\n */\nexport class Forwarder {\n readonly listeners: ForwarderListener[] = [];\n private readonly servers: TcpServer[] = [];\n private readonly liveSockets = new Set<{ close: () => void }>();\n private closed = false;\n\n private constructor(\n private readonly init: ForwarderInit,\n private readonly mappings: AddressMapping[],\n ) {}\n\n static async start(init: ForwarderInit): Promise<Forwarder> {\n if (init.specs.length === 0) {\n throw new Error('Forwarder requires at least one forward spec');\n }\n const mappings = init.specs.map(parseAddressMapping);\n const fwd = new Forwarder(init, mappings);\n try {\n await fwd.bindAll();\n } catch (err) {\n await fwd.close();\n throw err;\n }\n return fwd;\n }\n\n private async bindAll(): Promise<void> {\n for (const m of this.mappings) {\n const server = createNetServer((socket) => this.handleAccept(m, socket));\n const { local, port } = await listen(server, m);\n this.servers.push(server);\n this.listeners.push({\n spec: m.rawSpec,\n local,\n remote: remoteTargetHeader(m),\n ...(port !== undefined && { port }),\n });\n this.log(`listen ${local} → ${remoteTargetHeader(m)}`);\n }\n }\n\n private handleAccept(mapping: AddressMapping, socket: Socket): void {\n if (this.closed) {\n socket.destroy();\n return;\n }\n socket.on('error', () => {\n /* connection-level errors are surfaced via close */\n });\n\n const ws = openWebSocket(this.init, mapping);\n let closed = false;\n\n const cleanup = () => {\n if (closed) return;\n closed = true;\n try { socket.destroy(); } catch { /* ignore */ }\n try { ws.close(); } catch { /* ignore */ }\n this.liveSockets.delete(handle);\n };\n const handle = { close: cleanup };\n this.liveSockets.add(handle);\n\n ws.binaryType = 'nodebuffer';\n ws.on('open', () => {\n const wsStream = createWebSocketStream(ws);\n wsStream.on('error', cleanup);\n socket.pipe(wsStream);\n wsStream.pipe(socket);\n });\n ws.on('close', cleanup);\n ws.on('error', (err) => {\n this.log(`tunnel error: ${err.message}`);\n cleanup();\n });\n socket.on('close', cleanup);\n }\n\n /** Tear down all listeners and any in-flight tunnel sockets. */\n async close(): Promise<void> {\n this.closed = true;\n for (const handle of [...this.liveSockets]) handle.close();\n this.liveSockets.clear();\n\n await Promise.all(\n this.servers.map(\n (s) =>\n new Promise<void>((resolve) => {\n s.close(() => resolve());\n }),\n ),\n );\n\n // Clean up Unix socket files we created.\n for (const m of this.mappings) {\n if (isListenUnix(m) && m.listenUnixPath) {\n try {\n fs.rmSync(m.listenUnixPath, { force: true });\n } catch {\n /* ignore */\n }\n }\n }\n }\n\n private log(msg: string): void {\n this.init.options?.log?.(msg);\n }\n}\n\n// --- helpers --------------------------------------------------------------\n\nfunction listen(\n server: TcpServer,\n mapping: AddressMapping,\n): Promise<{ local: string; port?: number }> {\n return new Promise((resolve, reject) => {\n server.once('error', reject);\n if (isListenUnix(mapping)) {\n const p = mapping.listenUnixPath!;\n // Remove any stale socket file first.\n try {\n fs.rmSync(p, { force: true });\n } catch {\n /* ignore */\n }\n server.listen(p, () => {\n try {\n fs.chmodSync(p, 0o660);\n } catch {\n /* best-effort */\n }\n resolve({ local: p });\n });\n return;\n }\n\n server.listen({ host: mapping.listenAddr, port: mapping.listenPort }, () => {\n const addr = server.address();\n if (addr && typeof addr === 'object') {\n const local = `${mapping.listenAddr}:${addr.port}`;\n resolve({ local, port: addr.port });\n } else {\n resolve({ local: listenAddressDescription(mapping) });\n }\n });\n });\n}\n\nfunction openWebSocket(init: ForwarderInit, mapping: AddressMapping): WebSocket {\n const url = wsURLForVM(init.transport, init.hostname);\n const headers: Record<string, string> = {\n 'X-Inlets-Client-ID': init.options?.clientId ?? os.hostname(),\n 'X-Inlets-Mode': 'local',\n 'X-Inlets-Upstream': remoteTargetHeader(mapping),\n 'User-Agent': init.userAgent,\n };\n if (init.token) headers['Authorization'] = `Bearer ${init.token}`;\n\n const opts: WSClientOptions = {\n headers,\n handshakeTimeout: init.options?.dialTimeoutMs ?? 10_000,\n };\n if (init.transport.kind === 'socket') {\n opts.agent = unixAgent(init.transport.socketPath);\n }\n return new WebSocket(url, opts);\n}\n\nfunction wsURLForVM(transport: Transport, hostname: string): string {\n if (transport.kind === 'socket') {\n // Host part is irrelevant; the unix-socket agent overrides the dial.\n return `ws://localhost/vm/${encodeURIComponent(hostname)}/forward`;\n }\n const u = transport.url;\n const scheme = u.protocol === 'https:' ? 'wss' : 'ws';\n const port = u.port ? `:${u.port}` : '';\n return `${scheme}://${u.hostname}${port}/vm/${encodeURIComponent(hostname)}/forward`;\n}\n\nfunction unixAgent(socketPath: string): HttpAgent {\n const agent = new http.Agent({ keepAlive: false });\n // ws's HTTP upgrade goes through `agent.createConnection`. Override it to\n // dial the daemon's unix socket instead of opening a TCP connection.\n (agent as unknown as { createConnection: typeof agent.createConnection }).createConnection = ((\n _opts: unknown,\n cb?: (err: Error | null, sock?: net.Socket) => void,\n ) => {\n const conn = net.createConnection({ path: socketPath });\n if (cb) {\n conn.once('connect', () => cb(null, conn));\n conn.once('error', (err: Error) => cb(err));\n }\n return conn;\n }) as typeof agent.createConnection;\n return agent;\n}\n","/**\n * VM handle — returned from `client.vms.create()` / `client.vms.get()`.\n * Exposes per-VM operations (exec, fs, power, lifecycle).\n */\n\nimport { Readable } from 'node:stream';\nimport type { TransportClient } from './transport.js';\nimport { Forwarder, type ForwarderOptions } from './forward.js';\nimport {\n type AgentHealth,\n type ExecFrame,\n type ExecRequest,\n type ExecResult,\n type ExecResultBinary,\n type FSEntry,\n type FSMkdirRequest,\n type ShutdownRequest,\n SlicerAPIError,\n type VMLogs,\n type WaitOptions,\n} from './types.js';\nimport {\n agentHealthFromWire,\n fsEntryFromWire,\n type WireAgentHealth,\n type WireFSInfo,\n} from './wire.js';\n\n/** Per-VM filesystem operations. */\nexport class VMFileSystem {\n constructor(\n private readonly transport: TransportClient,\n private readonly hostname: string,\n ) {}\n\n async readDir(path: string): Promise<FSEntry[]> {\n const q = new URLSearchParams({ path });\n const wire = await this.transport.request<WireFSInfo[]>(\n 'GET',\n `/vm/${encodeURIComponent(this.hostname)}/fs/readdir?${q.toString()}`,\n );\n return (wire ?? []).map(fsEntryFromWire);\n }\n\n async stat(path: string): Promise<FSEntry | null> {\n const q = new URLSearchParams({ path });\n try {\n const wire = await this.transport.request<WireFSInfo>(\n 'GET',\n `/vm/${encodeURIComponent(this.hostname)}/fs/stat?${q.toString()}`,\n );\n return fsEntryFromWire(wire);\n } catch (err) {\n if (err instanceof SlicerAPIError && err.status === 404) return null;\n throw err;\n }\n }\n\n async exists(path: string): Promise<boolean> {\n return (await this.stat(path)) !== null;\n }\n\n async mkdir(req: FSMkdirRequest): Promise<void> {\n await this.transport.request(\n 'POST',\n `/vm/${encodeURIComponent(this.hostname)}/fs/mkdir`,\n {\n path: req.path,\n ...(req.recursive !== undefined && { recursive: req.recursive }),\n ...(req.mode !== undefined && { mode: req.mode }),\n },\n );\n }\n\n async remove(path: string, recursive = false): Promise<void> {\n const q = new URLSearchParams({ path, recursive: String(recursive) });\n await this.transport.request(\n 'DELETE',\n `/vm/${encodeURIComponent(this.hostname)}/fs/remove?${q.toString()}`,\n );\n }\n\n async readFile(path: string): Promise<Buffer> {\n const q = new URLSearchParams({ path, mode: 'binary' });\n return this.transport.requestRaw(\n 'GET',\n `/vm/${encodeURIComponent(this.hostname)}/cp?${q.toString()}`,\n );\n }\n\n async writeFile(\n path: string,\n content: Buffer | string,\n opts: { uid?: number; gid?: number; permissions?: string } = {},\n ): Promise<void> {\n const q = new URLSearchParams({ path, mode: 'binary' });\n if (opts.uid !== undefined) q.set('uid', String(opts.uid));\n if (opts.gid !== undefined) q.set('gid', String(opts.gid));\n if (opts.permissions) q.set('permissions', opts.permissions);\n const body = typeof content === 'string' ? Buffer.from(content) : content;\n await this.transport.requestRaw(\n 'POST',\n `/vm/${encodeURIComponent(this.hostname)}/cp?${q.toString()}`,\n body,\n );\n }\n\n /** Upload a tar archive, expanded into the VM at `path`. */\n async tarTo(path: string, tar: Buffer | Readable): Promise<void> {\n const q = new URLSearchParams({ path, mode: 'tar' });\n if (tar instanceof Buffer) {\n await this.transport.requestRaw(\n 'POST',\n `/vm/${encodeURIComponent(this.hostname)}/cp?${q.toString()}`,\n tar,\n 'application/x-tar',\n );\n return;\n }\n const res = await this.transport.requestStreamRaw(\n 'POST',\n `/vm/${encodeURIComponent(this.hostname)}/cp?${q.toString()}`,\n tar,\n 'application/x-tar',\n );\n for await (const _ of res as AsyncIterable<Buffer>) void _;\n }\n\n /** Download `path` from the VM as a tar archive. */\n async tarFrom(path: string): Promise<Buffer> {\n const q = new URLSearchParams({ path, mode: 'tar' });\n return this.transport.requestRaw(\n 'GET',\n `/vm/${encodeURIComponent(this.hostname)}/cp?${q.toString()}`,\n );\n }\n}\n\nexport interface VMInit {\n hostname: string;\n hostGroup: string;\n ip?: string;\n createdAt?: string;\n arch?: string;\n}\n\nexport class VM {\n readonly hostname: string;\n readonly hostGroup: string;\n readonly ip?: string;\n readonly createdAt?: string;\n readonly arch?: string;\n readonly fs: VMFileSystem;\n\n private readonly transport: TransportClient;\n\n constructor(transport: TransportClient, init: VMInit) {\n this.transport = transport;\n this.hostname = init.hostname;\n this.hostGroup = init.hostGroup;\n if (init.ip !== undefined) this.ip = init.ip;\n if (init.createdAt !== undefined) this.createdAt = init.createdAt;\n if (init.arch !== undefined) this.arch = init.arch;\n this.fs = new VMFileSystem(transport, this.hostname);\n }\n\n // --- lifecycle --------------------------------------------------------\n\n async delete(): Promise<void> {\n await this.transport.request(\n 'DELETE',\n `/hostgroup/${encodeURIComponent(this.hostGroup)}/nodes/${encodeURIComponent(\n this.hostname,\n )}`,\n );\n }\n\n // --- health / logs ----------------------------------------------------\n\n async health(): Promise<AgentHealth> {\n const wire = await this.transport.request<WireAgentHealth>(\n 'GET',\n `/vm/${encodeURIComponent(this.hostname)}/health`,\n );\n return agentHealthFromWire(wire);\n }\n\n async logs(): Promise<VMLogs> {\n return this.transport.request<VMLogs>('GET', `/vm/${encodeURIComponent(this.hostname)}/logs`);\n }\n\n async waitForAgent(opts: WaitOptions = {}): Promise<AgentHealth> {\n const timeoutMs = opts.timeoutMs ?? 120_000;\n const intervalMs = opts.intervalMs ?? 500;\n const deadline = Date.now() + timeoutMs;\n let lastErr: unknown;\n while (Date.now() < deadline) {\n try {\n return await this.health();\n } catch (err) {\n lastErr = err;\n await sleep(intervalMs);\n }\n }\n throw new Error(\n `agent for ${this.hostname} did not become ready within ${timeoutMs}ms: ${errMsg(lastErr)}`,\n );\n }\n\n async waitForUserdata(opts: WaitOptions = {}): Promise<AgentHealth> {\n const timeoutMs = opts.timeoutMs ?? 120_000;\n const intervalMs = opts.intervalMs ?? 500;\n const deadline = Date.now() + timeoutMs;\n let last: AgentHealth | undefined;\n let lastErr: unknown;\n while (Date.now() < deadline) {\n try {\n last = await this.health();\n if (last.userdataRan) return last;\n } catch (err) {\n lastErr = err;\n }\n await sleep(intervalMs);\n }\n throw new Error(\n `userdata for ${this.hostname} did not complete within ${timeoutMs}ms${\n lastErr ? `: ${errMsg(lastErr)}` : ''\n }`,\n );\n }\n\n // --- power ------------------------------------------------------------\n\n async shutdown(req: ShutdownRequest = {}): Promise<void> {\n await this.transport.request(\n 'POST',\n `/vm/${encodeURIComponent(this.hostname)}/shutdown`,\n req,\n );\n }\n\n async pause(): Promise<void> {\n await this.transport.request('POST', `/vm/${encodeURIComponent(this.hostname)}/pause`);\n }\n\n async resume(): Promise<void> {\n await this.transport.request('POST', `/vm/${encodeURIComponent(this.hostname)}/resume`);\n }\n\n async relaunch(): Promise<void> {\n await this.transport.request('POST', `/vm/${encodeURIComponent(this.hostname)}/relaunch`);\n }\n\n /** Mac-only on current daemons. Throws `SlicerAPIError 404` on Linux. */\n async suspend(): Promise<void> {\n await this.transport.request('POST', `/vm/${encodeURIComponent(this.hostname)}/suspend`);\n }\n\n /** Mac-only on current daemons. Throws `SlicerAPIError 404` on Linux. */\n async restore(): Promise<void> {\n await this.transport.request('POST', `/vm/${encodeURIComponent(this.hostname)}/restore`);\n }\n\n // --- port forwarding ---------------------------------------------------\n\n /**\n * Open one or more port forwards from the host to this VM. Each spec follows\n * the same syntax as `slicer vm forward -L`:\n *\n * `127.0.0.1:9000` — listen and forward on the same TCP port\n * `8081:127.0.0.1:8080` — listen on `0.0.0.0:8081`, forward to `127.0.0.1:8080`\n * `0.0.0.0:8080:127.0.0.1:8080` — fully explicit\n * `9000:/var/run/docker.sock` — TCP listen, Unix socket forward\n * `/tmp/docker.sock:/var/run/docker.sock` — Unix-to-Unix\n *\n * Returns a {@link Forwarder} handle. Call `forwarder.close()` to tear down\n * all listeners and any in-flight tunnel sockets.\n */\n async forward(specs: string | string[], options?: ForwarderOptions): Promise<Forwarder> {\n return Forwarder.start({\n hostname: this.hostname,\n transport: this.transport.transport,\n ...(this.transport.token !== undefined && { token: this.transport.token }),\n userAgent: this.transport.userAgent,\n specs: typeof specs === 'string' ? [specs] : specs,\n ...(options !== undefined && { options }),\n });\n }\n\n // --- exec -------------------------------------------------------------\n\n /**\n * Streaming exec — yields NDJSON frames (`started`, `stdout`, `stderr`, `exit`).\n * When `req.stdio === 'base64'`, each frame's `data`/`stdout`/`stderr` string\n * fields are preserved as-is (base64-encoded) and the SDK populates decoded\n * `dataBytes`/`stdoutBytes`/`stderrBytes` Buffers alongside for convenience.\n */\n async *exec(req: ExecRequest): AsyncGenerator<ExecFrame, void, void> {\n const { path, body } = buildExecPath(this.hostname, req, false);\n for await (const frame of this.transport.requestNDJSON<ExecFrame>('POST', path, body)) {\n if (frame.encoding === 'base64') {\n if (frame.data) frame.dataBytes = Buffer.from(frame.data, 'base64');\n if (frame.stdout) frame.stdoutBytes = Buffer.from(frame.stdout, 'base64');\n if (frame.stderr) frame.stderrBytes = Buffer.from(frame.stderr, 'base64');\n }\n yield frame;\n }\n }\n\n /**\n * Buffered exec via `?buffered=true`. stdin is intentionally unsupported\n * (matches Go SDK `ExecBuffered`); use `exec()` for stdin cases.\n *\n * When `req.stdio === 'base64'`, stdout/stderr are decoded from base64 and\n * returned as `Buffer` — use this for binary output. Otherwise the result\n * carries UTF-8 strings.\n */\n execBuffered(req: ExecRequest & { stdio: 'base64' }): Promise<ExecResultBinary>;\n execBuffered(req: ExecRequest): Promise<ExecResult>;\n async execBuffered(req: ExecRequest): Promise<ExecResult | ExecResultBinary> {\n if (req.stdin !== undefined) {\n throw new Error('stdin is not supported by execBuffered; use exec() instead');\n }\n const { path, body } = buildExecPath(this.hostname, req, true);\n const raw = await this.transport.requestRaw('POST', path, body);\n const text = raw.toString('utf8');\n const parsed = text\n ? (JSON.parse(text) as {\n stdout?: string;\n stderr?: string;\n encoding?: 'text' | 'base64';\n pid?: number;\n started_at?: string;\n ended_at?: string;\n signal?: string;\n exit_code?: number;\n error?: string;\n })\n : {};\n\n const common = {\n exitCode: parsed.exit_code ?? 0,\n ...(parsed.pid !== undefined && { pid: parsed.pid }),\n ...(parsed.started_at !== undefined && { startedAt: parsed.started_at }),\n ...(parsed.ended_at !== undefined && { endedAt: parsed.ended_at }),\n ...(parsed.signal !== undefined && { signal: parsed.signal }),\n ...(parsed.error !== undefined && { error: parsed.error }),\n };\n\n if (req.stdio === 'base64' || parsed.encoding === 'base64') {\n return {\n stdout: Buffer.from(parsed.stdout ?? '', 'base64'),\n stderr: Buffer.from(parsed.stderr ?? '', 'base64'),\n encoding: 'base64',\n ...common,\n } satisfies ExecResultBinary;\n }\n return {\n stdout: parsed.stdout ?? '',\n stderr: parsed.stderr ?? '',\n ...(parsed.encoding !== undefined && { encoding: parsed.encoding }),\n ...common,\n } satisfies ExecResult;\n }\n}\n\nfunction buildExecPath(\n hostname: string,\n req: ExecRequest,\n buffered: boolean,\n): { path: string; body: Buffer | undefined } {\n const q = new URLSearchParams();\n if (req.command) q.set('cmd', req.command);\n for (const a of req.args ?? []) q.append('args', a);\n for (const e of req.env ?? []) q.append('env', e);\n if (req.uid !== undefined) q.set('uid', String(req.uid));\n if (req.gid !== undefined) q.set('gid', String(req.gid));\n if (req.cwd) q.set('cwd', req.cwd);\n if (req.shell) q.set('shell', req.shell);\n if (req.permissions) q.set('permissions', req.permissions);\n if (req.stdio) q.set('stdio', req.stdio);\n if (buffered) q.set('buffered', 'true');\n let body: Buffer | undefined;\n if (req.stdin !== undefined) {\n q.set('stdin', 'true');\n body = typeof req.stdin === 'string' ? Buffer.from(req.stdin) : req.stdin;\n }\n return {\n path: `/vm/${encodeURIComponent(hostname)}/exec?${q.toString()}`,\n body,\n };\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((r) => setTimeout(r, ms));\n}\n\nfunction errMsg(e: unknown): string {\n return e instanceof Error ? e.message : String(e);\n}\n","/**\n * Top-level namespaces on SlicerClient: hostGroups, vms, secrets.\n * Keep control-plane operations here; per-VM operations live on the VM handle.\n */\n\nimport type { TransportClient } from './transport.js';\nimport {\n type CreateSecretRequest,\n type CreateVMOptions,\n type CreateVMRequest,\n type CreateVMResponse,\n type HostGroup,\n type ListOptions,\n type Secret,\n SecretExistsError,\n SlicerAPIError,\n type UpdateSecretRequest,\n type VMInfo,\n type VMStat,\n} from './types.js';\nimport {\n createVMReqToWire,\n createVMResFromWire,\n hostGroupFromWire,\n secretFromWire,\n vmFromWire,\n vmStatFromWire,\n type WireCreateVMResponse,\n type WireHostGroup,\n type WireSecret,\n type WireVM,\n type WireVMStat,\n} from './wire.js';\nimport { VM } from './vm.js';\n\nexport class HostGroupsAPI {\n constructor(private readonly transport: TransportClient) {}\n\n async list(): Promise<HostGroup[]> {\n const wire = await this.transport.request<WireHostGroup[]>('GET', '/hostgroup');\n return (wire ?? []).map(hostGroupFromWire);\n }\n\n /** Convenience lookup (no single-group endpoint exists on the daemon). */\n async find(name: string): Promise<HostGroup | undefined> {\n return (await this.list()).find((g) => g.name === name);\n }\n\n async listVMs(name: string, opts: ListOptions = {}): Promise<VMInfo[]> {\n const q = buildListQuery(opts);\n const wire = await this.transport.request<WireVM[]>(\n 'GET',\n `/hostgroup/${encodeURIComponent(name)}/nodes${q}`,\n );\n return (wire ?? []).map(vmFromWire);\n }\n}\n\nexport class VMsAPI {\n constructor(private readonly transport: TransportClient) {}\n\n async create(\n hostGroup: string,\n req: CreateVMRequest = {},\n opts: CreateVMOptions = {},\n ): Promise<VM> {\n const qs = new URLSearchParams();\n if (opts.wait) qs.set('wait', opts.wait);\n if (opts.waitTimeoutSec !== undefined) qs.set('timeout', `${opts.waitTimeoutSec}s`);\n const query = qs.toString() ? `?${qs.toString()}` : '';\n const wire = await this.transport.request<WireCreateVMResponse>(\n 'POST',\n `/hostgroup/${encodeURIComponent(hostGroup)}/nodes${query}`,\n createVMReqToWire(req),\n );\n const res = createVMResFromWire(wire);\n return new VM(this.transport, {\n hostname: res.hostname,\n hostGroup: res.hostGroup ?? hostGroup,\n ...(res.ip !== undefined && { ip: res.ip }),\n ...(res.createdAt !== undefined && { createdAt: res.createdAt }),\n ...(res.arch !== undefined && { arch: res.arch }),\n });\n }\n\n /**\n * Build a VM handle for an existing VM given its hostgroup + hostname. No\n * request is issued — use `health()` or `getInfo()` to verify reachability.\n */\n attach(hostGroup: string, hostname: string): VM {\n return new VM(this.transport, { hostname, hostGroup });\n }\n\n /** Look up a VM by hostname across all host groups. Returns `undefined` if not found. */\n async get(hostname: string): Promise<VM | undefined> {\n const all = await this.list();\n const found = all.find((v) => v.hostname === hostname);\n if (!found) return undefined;\n return new VM(this.transport, {\n hostname: found.hostname,\n hostGroup: found.hostGroup ?? '',\n ...(found.ip !== undefined && { ip: found.ip }),\n ...(found.createdAt !== undefined && { createdAt: found.createdAt }),\n ...(found.arch !== undefined && { arch: found.arch }),\n });\n }\n\n /** Return raw VM metadata across all host groups. */\n async list(opts: ListOptions = {}): Promise<VMInfo[]> {\n const q = buildListQuery(opts);\n const wire = await this.transport.request<WireVM[]>('GET', `/nodes${q}`);\n return (wire ?? []).map(vmFromWire);\n }\n\n async stats(): Promise<VMStat[]> {\n const raw = await this.transport.request<WireVMStat[]>('GET', '/nodes/stats');\n return (raw ?? []).map(vmStatFromWire);\n }\n\n /**\n * Raw response accessor — bypasses the VM handle. Useful when you only\n * want the create metadata without a handle.\n */\n async createRaw(\n hostGroup: string,\n req: CreateVMRequest = {},\n opts: CreateVMOptions = {},\n ): Promise<CreateVMResponse> {\n const qs = new URLSearchParams();\n if (opts.wait) qs.set('wait', opts.wait);\n if (opts.waitTimeoutSec !== undefined) qs.set('timeout', `${opts.waitTimeoutSec}s`);\n const query = qs.toString() ? `?${qs.toString()}` : '';\n const wire = await this.transport.request<WireCreateVMResponse>(\n 'POST',\n `/hostgroup/${encodeURIComponent(hostGroup)}/nodes${query}`,\n createVMReqToWire(req),\n );\n return createVMResFromWire(wire);\n }\n}\n\nexport class SecretsAPI {\n constructor(private readonly transport: TransportClient) {}\n\n async list(): Promise<Secret[]> {\n const wire = await this.transport.request<WireSecret[]>('GET', '/secrets');\n return (wire ?? []).map(secretFromWire);\n }\n\n async create(req: CreateSecretRequest): Promise<void> {\n const body = {\n name: req.name,\n data: Buffer.from(req.data).toString('base64'),\n ...(req.permissions !== undefined && { permissions: req.permissions }),\n ...(req.uid !== undefined && { uid: req.uid }),\n ...(req.gid !== undefined && { gid: req.gid }),\n };\n try {\n await this.transport.request('POST', '/secrets', body);\n } catch (err) {\n if (err instanceof SlicerAPIError && err.status === 409) {\n throw new SecretExistsError(req.name);\n }\n throw err;\n }\n }\n\n async patch(name: string, req: UpdateSecretRequest): Promise<void> {\n const body = {\n data: Buffer.from(req.data).toString('base64'),\n ...(req.permissions !== undefined && { permissions: req.permissions }),\n ...(req.uid !== undefined && { uid: req.uid }),\n ...(req.gid !== undefined && { gid: req.gid }),\n };\n await this.transport.request('PATCH', `/secrets/${encodeURIComponent(name)}`, body);\n }\n\n async delete(name: string): Promise<void> {\n await this.transport.request('DELETE', `/secrets/${encodeURIComponent(name)}`);\n }\n}\n\nfunction buildListQuery(opts: ListOptions): string {\n const qs = new URLSearchParams();\n if (opts.tag) qs.set('tag', opts.tag);\n if (opts.tagPrefix) qs.set('tag_prefix', opts.tagPrefix);\n const s = qs.toString();\n return s ? `?${s}` : '';\n}\n","/**\n * SlicerClient — grouped TypeScript client for the Slicer VM API.\n *\n * Shape:\n * client.hostGroups.list() / find(name) / listVMs(name)\n * client.vms.create(group, req, opts) → VM / get(name) / list() / stats() / attach(group, name)\n * client.secrets.list / create / patch / delete\n * client.getInfo()\n *\n * Per-VM operations live on the `VM` handle returned from `client.vms.create`\n * or `client.vms.attach`: `vm.exec`, `vm.execBuffered`, `vm.fs.*`,\n * `vm.pause/resume/suspend/restore/shutdown/relaunch`, `vm.health/logs`,\n * `vm.waitForAgent/waitForUserdata`, `vm.delete`.\n */\n\nimport { TransportClient, type TransportClientOptions } from './transport.js';\nimport { HostGroupsAPI, SecretsAPI, VMsAPI } from './namespaces.js';\nimport type { SlicerInfo } from './types.js';\n\nexport interface SlicerClientOptions extends TransportClientOptions {}\n\nexport class SlicerClient {\n readonly transport: TransportClient;\n readonly hostGroups: HostGroupsAPI;\n readonly vms: VMsAPI;\n readonly secrets: SecretsAPI;\n\n constructor(opts: SlicerClientOptions) {\n this.transport = new TransportClient(opts);\n this.hostGroups = new HostGroupsAPI(this.transport);\n this.vms = new VMsAPI(this.transport);\n this.secrets = new SecretsAPI(this.transport);\n }\n\n static fromEnv(overrides: Partial<SlicerClientOptions> = {}): SlicerClient {\n const baseURL = overrides.baseURL ?? process.env.SLICER_URL;\n if (!baseURL) throw new Error('SLICER_URL is required (or pass baseURL)');\n const token = overrides.token ?? process.env.SLICER_TOKEN ?? undefined;\n return new SlicerClient({\n baseURL,\n ...(token !== undefined && { token }),\n ...(overrides.userAgent !== undefined && { userAgent: overrides.userAgent }),\n });\n }\n\n async getInfo(): Promise<SlicerInfo> {\n return this.transport.request<SlicerInfo>('GET', '/info');\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/types.ts","../src/transport.ts","../src/wire.ts","../src/forward.ts","../src/vm.ts","../src/namespaces.ts","../src/client.ts"],"names":["path","os","URL","https","http","createNetServer","ws","createWebSocketStream","fs","WebSocket","net"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Slicer API types. Wire shapes mirror the Go SDK at github.com/slicervm/sdk\n * (which calls these \"Node\" / \"SlicerNode\"); the TS SDK renames to \"VM\" for\n * clarity, since Slicer's primary primitive is a VM.\n */\n\nexport interface HostGroup {\n name: string;\n count: number;\n ramBytes: number;\n cpus: number;\n arch: string;\n gpuCount?: number;\n}\n\nexport interface VMInfo {\n hostname: string;\n hostGroup?: string;\n ip: string;\n ramBytes?: number;\n cpus?: number;\n createdAt: string;\n arch?: string;\n tags?: string[];\n status?: string;\n persistent?: boolean;\n}\n\nexport interface CreateVMRequest {\n ramBytes?: number;\n cpus?: number;\n gpuCount?: number;\n persistent?: boolean;\n diskImage?: string;\n importUser?: string;\n sshKeys?: string[];\n userdata?: string;\n ip?: string;\n tags?: string[];\n secrets?: string[];\n}\n\nexport interface CreateVMResponse {\n hostname: string;\n hostGroup?: string;\n ip: string;\n createdAt: string;\n arch?: string;\n}\n\nexport interface AgentHealth {\n hostname?: string;\n agentUptime?: number;\n agentVersion?: string;\n systemUptime?: number;\n userdataRan?: boolean;\n}\n\nexport interface VMLogs {\n hostname: string;\n lines: number;\n content: string;\n}\n\nexport interface DeleteResponse {\n message?: string;\n diskRemoved?: string;\n error?: string;\n}\n\n/** Wire encoding of exec stdout/stderr. Defaults to `\"text\"`. */\nexport type ExecStdio = 'text' | 'base64';\nexport const ExecStdioText: ExecStdio = 'text';\nexport const ExecStdioBase64: ExecStdio = 'base64';\n\nexport interface ExecRequest {\n command?: string;\n args?: string[];\n env?: string[];\n uid?: number;\n gid?: number;\n stdin?: Buffer | string;\n shell?: string;\n cwd?: string;\n permissions?: string;\n /**\n * Wire encoding for stdout/stderr.\n * - `\"text\"` (default): frames carry UTF-8 strings. Safe for text output only —\n * arbitrary binary will be mangled by JSON string escaping.\n * - `\"base64\"`: frames carry base64-encoded bytes. Required for binary output\n * (video, compressed archives, raw protocol streams). The SDK decodes\n * automatically — callers get `Buffer` on `execBuffered({ stdio: 'base64' })`\n * and `{stdoutBytes, stderrBytes, dataBytes}` on streamed frames.\n */\n stdio?: ExecStdio;\n}\n\nexport interface ExecFrame {\n timestamp?: string;\n type?: string;\n pid?: number;\n encoding?: ExecStdio;\n /** Raw wire value — string under text mode, base64 string under base64 mode. */\n data?: string;\n startedAt?: string;\n endedAt?: string;\n signal?: string;\n stdout?: string;\n stderr?: string;\n /** Decoded bytes when `encoding === 'base64'`. SDK-populated convenience field. */\n dataBytes?: Buffer;\n stdoutBytes?: Buffer;\n stderrBytes?: Buffer;\n exitCode?: number;\n error?: string;\n}\n\nexport interface ExecResult {\n stdout: string;\n stderr: string;\n encoding?: ExecStdio;\n pid?: number;\n startedAt?: string;\n endedAt?: string;\n signal?: string;\n exitCode: number;\n error?: string;\n}\n\n/** Returned by `execBuffered` when `stdio === 'base64'`. stdout/stderr are decoded Buffers. */\nexport interface ExecResultBinary {\n stdout: Buffer;\n stderr: Buffer;\n encoding: 'base64';\n pid?: number;\n startedAt?: string;\n endedAt?: string;\n signal?: string;\n exitCode: number;\n error?: string;\n}\n\nexport interface FSEntry {\n name: string;\n type: 'file' | 'directory' | 'symlink' | string;\n size: number;\n mtime: string;\n mode: string;\n}\n\nexport interface FSMkdirRequest {\n path: string;\n recursive?: boolean;\n mode?: string;\n}\n\nexport type FSWatchEventType = 'create' | 'write' | 'remove' | 'rename' | 'chmod';\n\nexport interface FSWatchRequest {\n /** Absolute paths inside the VM to watch. At least one is required. */\n paths: string[];\n /** Optional glob patterns to filter event paths (e.g. `[\"*.go\", \"bin/*\"]`). */\n patterns?: string[];\n /**\n * Restrict to a subset of event types. When omitted, all types are delivered.\n */\n events?: FSWatchEventType[];\n /** UID used by the agent to resolve `~` in paths. Default: 0 (root). */\n uid?: number;\n /** Watch directories recursively. */\n recursive?: boolean;\n /** Stop the stream after the first matching event. */\n oneShot?: boolean;\n /** Coalesce events arriving within this window. Go-duration string e.g. `\"100ms\"`. */\n debounce?: string;\n /** Server-side wall-clock cap on the stream. Go-duration string e.g. `\"5m\"`. */\n timeout?: string;\n /** Stop after delivering this many events. */\n maxEvents?: number;\n /** Forwarded as the SSE `Last-Event-ID` header for cross-connection resume. */\n lastEventId?: string;\n}\n\nexport interface FSWatchEvent {\n /** Monotonic per-stream ID (from the SSE `id:` line). */\n id: number;\n type: FSWatchEventType | string;\n path: string;\n /** RFC3339Nano string (when present). */\n timestamp: string;\n size: number;\n isDir: boolean;\n message?: string;\n}\n\nexport interface ShutdownRequest {\n action?: 'shutdown' | 'reboot';\n}\n\nexport interface VMStat {\n hostname: string;\n ip: string;\n createdAt: string;\n snapshot?: VMSnapshot | null;\n error?: string;\n}\n\nexport interface VMSnapshot {\n hostname: string;\n arch: string;\n timestamp: string;\n uptime: string;\n totalCpus: number;\n totalMemory: number;\n memoryUsed: number;\n memoryAvailable: number;\n memoryUsedPercent: number;\n loadAvg1: number;\n loadAvg5: number;\n loadAvg15: number;\n diskReadTotal: number;\n diskWriteTotal: number;\n networkReadTotal: number;\n networkWriteTotal: number;\n diskIOInflight: number;\n openConnections: number;\n openFiles: number;\n entropy: number;\n diskSpaceTotal: number;\n diskSpaceUsed: number;\n diskSpaceFree: number;\n diskSpaceUsedPercent: number;\n}\n\nexport interface SlicerInfo {\n version?: string;\n gitCommit?: string;\n platform?: string;\n arch?: string;\n}\n\nexport interface ListOptions {\n tag?: string;\n tagPrefix?: string;\n}\n\nexport interface WaitOptions {\n timeoutMs?: number;\n intervalMs?: number;\n}\n\nexport interface CreateVMOptions {\n /**\n * Server-side wait: `\"agent\"` waits for the in-guest agent to be ready,\n * `\"userdata\"` additionally waits for userdata to run. If unset the daemon\n * returns immediately once the VM is scheduled.\n */\n wait?: 'agent' | 'userdata';\n /** Server-side wait timeout, in seconds. Forwarded as a Go duration. */\n waitTimeoutSec?: number;\n}\n\nexport interface Secret {\n name: string;\n size: number;\n permissions: string;\n uid?: number;\n gid?: number;\n modifiedAt?: string;\n}\n\nexport interface CreateSecretRequest {\n name: string;\n data: string;\n permissions?: string;\n uid?: number;\n gid?: number;\n}\n\nexport interface UpdateSecretRequest {\n data: string;\n permissions?: string;\n uid?: number;\n gid?: number;\n}\n\nexport class SecretExistsError extends Error {\n constructor(name: string) {\n super(`secret already exists: ${name}`);\n this.name = 'SecretExistsError';\n }\n}\n\nexport class SlicerAPIError extends Error {\n readonly status: number;\n readonly method: string;\n readonly path: string;\n readonly body: string;\n constructor(method: string, path: string, status: number, body: string) {\n super(`slicer ${method} ${path} failed: ${status} ${body}`);\n this.name = 'SlicerAPIError';\n this.method = method;\n this.path = path;\n this.status = status;\n this.body = body;\n }\n}\n\nexport const MiB = (n: number): number => n * 1024 * 1024;\nexport const GiB = (n: number): number => n * 1024 * 1024 * 1024;\nexport const NonRootUser = 0xffffffff;\n","/**\n * HTTP transport for the Slicer API. Supports two modes:\n * - Unix socket: absolute path (`/...`), `unix://...`, `./...`, `../...`, `~/...`, or any `*.sock`.\n * - Network URL: `http://host[:port]` or `https://host`.\n *\n * Mirrors the detection rules in the Go SDK's `normalizeUnixSocketPath`.\n */\n\nimport http, { IncomingMessage, RequestOptions } from 'node:http';\nimport https from 'node:https';\nimport { Readable } from 'node:stream';\nimport { URL } from 'node:url';\nimport os from 'node:os';\nimport path from 'node:path';\n\nimport { SlicerAPIError } from './types.js';\n\nexport type Transport =\n | { kind: 'socket'; socketPath: string }\n | { kind: 'net'; url: URL };\n\nexport function resolveTransport(baseURL: string): Transport {\n const trimmed = baseURL.trim();\n if (!trimmed) throw new Error('Slicer baseURL is required');\n\n let candidate = trimmed;\n if (candidate.startsWith('unix://')) candidate = candidate.slice('unix://'.length);\n if (candidate.startsWith('~/')) candidate = path.join(os.homedir(), candidate.slice(2));\n\n const socketLike =\n candidate.startsWith('/') ||\n candidate.startsWith('./') ||\n candidate.startsWith('../') ||\n candidate.endsWith('.sock');\n if (socketLike) return { kind: 'socket', socketPath: candidate };\n\n return { kind: 'net', url: new URL(trimmed) };\n}\n\nexport interface TransportClientOptions {\n baseURL: string;\n token?: string;\n userAgent?: string;\n}\n\nexport class TransportClient {\n readonly transport: Transport;\n readonly token?: string;\n readonly userAgent: string;\n\n constructor(opts: TransportClientOptions) {\n this.transport = resolveTransport(opts.baseURL);\n this.token = opts.token;\n this.userAgent = opts.userAgent ?? 'slicer-sdk-ts/0.1.0';\n }\n\n private agent() {\n return this.transport.kind === 'net' && this.transport.url.protocol === 'https:'\n ? https\n : http;\n }\n\n private buildRequestOptions(\n method: string,\n reqPath: string,\n extraHeaders: Record<string, string> = {},\n ): RequestOptions {\n const headers: Record<string, string> = {\n 'User-Agent': this.userAgent,\n ...extraHeaders,\n };\n if (this.token) headers['Authorization'] = `Bearer ${this.token}`;\n\n if (this.transport.kind === 'socket') {\n return {\n socketPath: this.transport.socketPath,\n method,\n path: reqPath,\n headers,\n setHost: true,\n };\n }\n const u = this.transport.url;\n return {\n protocol: u.protocol,\n hostname: u.hostname,\n port: u.port || (u.protocol === 'https:' ? 443 : 80),\n method,\n path: reqPath,\n headers,\n };\n }\n\n /** Buffered JSON request. Rejects on non-2xx via SlicerAPIError. */\n request<T = unknown>(method: string, reqPath: string, body?: unknown): Promise<T> {\n return new Promise((resolve, reject) => {\n const payload = body === undefined ? undefined : Buffer.from(JSON.stringify(body));\n const headers: Record<string, string> = {};\n if (payload) {\n headers['Content-Type'] = 'application/json';\n headers['Content-Length'] = String(payload.length);\n }\n const req = this.agent().request(\n this.buildRequestOptions(method, reqPath, headers),\n (res: IncomingMessage) => {\n const chunks: Buffer[] = [];\n res.on('data', (c) => chunks.push(c));\n res.on('end', () => {\n const raw = Buffer.concat(chunks).toString('utf8');\n const status = res.statusCode ?? 0;\n if (status < 200 || status >= 300) {\n reject(new SlicerAPIError(method, reqPath, status, raw));\n return;\n }\n if (!raw) {\n resolve(undefined as unknown as T);\n return;\n }\n try {\n resolve(JSON.parse(raw) as T);\n } catch {\n resolve(raw as unknown as T);\n }\n });\n res.on('error', reject);\n },\n );\n req.on('error', reject);\n if (payload) req.write(payload);\n req.end();\n });\n }\n\n /** Raw-bytes request (for binary cp endpoints). */\n requestRaw(\n method: string,\n reqPath: string,\n body?: Buffer,\n contentType = 'application/octet-stream',\n ): Promise<Buffer> {\n return new Promise((resolve, reject) => {\n const headers: Record<string, string> = {};\n if (body) {\n headers['Content-Type'] = contentType;\n headers['Content-Length'] = String(body.length);\n }\n const req = this.agent().request(\n this.buildRequestOptions(method, reqPath, headers),\n (res) => {\n const chunks: Buffer[] = [];\n res.on('data', (c) => chunks.push(c));\n res.on('end', () => {\n const out = Buffer.concat(chunks);\n const status = res.statusCode ?? 0;\n if (status < 200 || status >= 300) {\n reject(new SlicerAPIError(method, reqPath, status, out.toString('utf8')));\n return;\n }\n resolve(out);\n });\n res.on('error', reject);\n },\n );\n req.on('error', reject);\n if (body) req.write(body);\n req.end();\n });\n }\n\n /** Streaming request producing a Node Readable of the response body. */\n requestStreamRaw(\n method: string,\n reqPath: string,\n body?: Buffer | Readable,\n contentType = 'application/octet-stream',\n extraHeaders: Record<string, string> = {},\n ): Promise<IncomingMessage> {\n return new Promise((resolve, reject) => {\n const headers: Record<string, string> = { ...extraHeaders };\n if (body instanceof Buffer) {\n headers['Content-Type'] = contentType;\n headers['Content-Length'] = String(body.length);\n } else if (body) {\n headers['Content-Type'] = contentType;\n headers['Transfer-Encoding'] = 'chunked';\n }\n const req = this.agent().request(\n this.buildRequestOptions(method, reqPath, headers),\n (res) => {\n const status = res.statusCode ?? 0;\n if (status < 200 || status >= 300) {\n const chunks: Buffer[] = [];\n res.on('data', (c) => chunks.push(c));\n res.on('end', () =>\n reject(\n new SlicerAPIError(method, reqPath, status, Buffer.concat(chunks).toString('utf8')),\n ),\n );\n return;\n }\n resolve(res);\n },\n );\n req.on('error', reject);\n if (body instanceof Buffer) {\n req.write(body);\n req.end();\n } else if (body) {\n (body as Readable).pipe(req);\n } else {\n req.end();\n }\n });\n }\n\n /** Yields decoded JSON frames from an NDJSON response (one JSON object per line). */\n async *requestNDJSON<Frame = unknown>(\n method: string,\n reqPath: string,\n body?: Buffer | Readable,\n ): AsyncGenerator<Frame, void, void> {\n const res = await this.requestStreamRaw(method, reqPath, body);\n res.setEncoding('utf8');\n let buffer = '';\n for await (const chunk of res as AsyncIterable<string>) {\n buffer += chunk;\n let nl: number;\n while ((nl = buffer.indexOf('\\n')) >= 0) {\n const line = buffer.slice(0, nl).trim();\n buffer = buffer.slice(nl + 1);\n if (!line) continue;\n try {\n yield JSON.parse(line) as Frame;\n } catch {\n /* skip keep-alives / unparseable lines */\n }\n }\n }\n const trailing = buffer.trim();\n if (trailing) {\n try {\n yield JSON.parse(trailing) as Frame;\n } catch {\n /* ignore */\n }\n }\n }\n}\n","/**\n * Wire-format converters. The only place camelCase ↔ snake_case bridging\n * should live. All outbound request bodies and inbound response bodies are\n * shaped exactly as the daemon emits; model types above are idiomatic TS.\n */\n\nimport type {\n AgentHealth,\n CreateVMRequest,\n CreateVMResponse,\n FSEntry,\n HostGroup,\n Secret,\n VMInfo,\n VMStat,\n} from './types.js';\n\nexport interface WireHostGroup {\n name?: string;\n count?: number;\n ram_bytes?: number;\n cpus?: number;\n arch?: string;\n gpu_count?: number;\n}\n\nexport interface WireVM {\n hostname: string;\n hostgroup?: string;\n ip: string;\n ram_bytes?: number;\n cpus?: number;\n created_at: string;\n arch?: string;\n tags?: string[];\n status?: string;\n persistent?: boolean;\n}\n\nexport interface WireCreateVMRequest {\n ram_bytes?: number;\n cpus?: number;\n gpu_count?: number;\n persistent?: boolean;\n disk_image?: string;\n import_user?: string;\n ssh_keys?: string[];\n userdata?: string;\n ip?: string;\n tags?: string[];\n secrets?: string[];\n}\n\nexport interface WireCreateVMResponse {\n hostname: string;\n hostgroup?: string;\n ip: string;\n created_at: string;\n arch?: string;\n}\n\nexport interface WireAgentHealth {\n hostname?: string;\n agent_uptime?: number;\n agent_version?: string;\n system_uptime?: number;\n userdata_ran?: boolean;\n}\n\nexport interface WireFSInfo {\n name: string;\n type: string;\n size: number;\n mtime: string;\n mode: string;\n}\n\nexport interface WireVMStat {\n hostname: string;\n ip: string;\n created_at: string;\n snapshot?: unknown;\n error?: string;\n}\n\nexport interface WireSecret {\n name: string;\n size: number;\n permissions: string;\n uid?: number;\n gid?: number;\n modified_at?: string;\n}\n\nexport function hostGroupFromWire(w: WireHostGroup): HostGroup {\n return {\n name: w.name ?? '',\n count: w.count ?? 0,\n ramBytes: w.ram_bytes ?? 0,\n cpus: w.cpus ?? 0,\n arch: w.arch ?? '',\n ...(w.gpu_count !== undefined && { gpuCount: w.gpu_count }),\n };\n}\n\nexport function vmFromWire(w: WireVM): VMInfo {\n return {\n hostname: w.hostname,\n ip: w.ip,\n createdAt: w.created_at,\n ...(w.hostgroup !== undefined && { hostGroup: w.hostgroup }),\n ...(w.ram_bytes !== undefined && { ramBytes: w.ram_bytes }),\n ...(w.cpus !== undefined && { cpus: w.cpus }),\n ...(w.arch !== undefined && { arch: w.arch }),\n ...(w.tags !== undefined && { tags: w.tags }),\n ...(w.status !== undefined && { status: w.status }),\n ...(w.persistent !== undefined && { persistent: w.persistent }),\n };\n}\n\nexport function createVMReqToWire(r: CreateVMRequest): WireCreateVMRequest {\n const o: WireCreateVMRequest = {};\n if (r.ramBytes !== undefined) o.ram_bytes = r.ramBytes;\n if (r.cpus !== undefined) o.cpus = r.cpus;\n if (r.gpuCount !== undefined) o.gpu_count = r.gpuCount;\n if (r.persistent !== undefined) o.persistent = r.persistent;\n if (r.diskImage !== undefined) o.disk_image = r.diskImage;\n if (r.importUser !== undefined) o.import_user = r.importUser;\n if (r.sshKeys !== undefined) o.ssh_keys = r.sshKeys;\n if (r.userdata !== undefined) o.userdata = r.userdata;\n if (r.ip !== undefined) o.ip = r.ip;\n if (r.tags !== undefined) o.tags = r.tags;\n if (r.secrets !== undefined) o.secrets = r.secrets;\n return o;\n}\n\nexport function createVMResFromWire(w: WireCreateVMResponse): CreateVMResponse {\n return {\n hostname: w.hostname,\n ip: w.ip,\n createdAt: w.created_at,\n ...(w.hostgroup !== undefined && { hostGroup: w.hostgroup }),\n ...(w.arch !== undefined && { arch: w.arch }),\n };\n}\n\nexport function agentHealthFromWire(w: WireAgentHealth): AgentHealth {\n return {\n ...(w.hostname !== undefined && { hostname: w.hostname }),\n ...(w.agent_uptime !== undefined && { agentUptime: w.agent_uptime }),\n ...(w.agent_version !== undefined && { agentVersion: w.agent_version }),\n ...(w.system_uptime !== undefined && { systemUptime: w.system_uptime }),\n ...(w.userdata_ran !== undefined && { userdataRan: w.userdata_ran }),\n };\n}\n\nexport function fsEntryFromWire(w: WireFSInfo): FSEntry {\n return { name: w.name, type: w.type, size: w.size, mtime: w.mtime, mode: w.mode };\n}\n\nexport function vmStatFromWire(w: WireVMStat): VMStat {\n return {\n hostname: w.hostname,\n ip: w.ip,\n createdAt: w.created_at,\n ...(w.snapshot !== undefined && { snapshot: w.snapshot as VMStat['snapshot'] }),\n ...(w.error !== undefined && { error: w.error }),\n };\n}\n\nexport function secretFromWire(w: WireSecret): Secret {\n return {\n name: w.name,\n size: w.size,\n permissions: w.permissions,\n ...(w.uid !== undefined && { uid: w.uid }),\n ...(w.gid !== undefined && { gid: w.gid }),\n ...(w.modified_at !== undefined && { modifiedAt: w.modified_at }),\n };\n}\n","/**\n * Port forwarding for Slicer VMs.\n *\n * Per-connection WebSocket model: each accepted local TCP/Unix connection\n * opens a fresh WebSocket to /vm/{hostname}/forward on the daemon. The\n * WebSocket carries raw bytes both directions (binary frames, no framing\n * subprotocol). The daemon uses the `X-Inlets-Upstream` header on the\n * upgrade request to decide where to dial inside the VM.\n */\n\nimport net, { createServer as createNetServer, type Server as TcpServer, type Socket } from 'node:net';\nimport os from 'node:os';\nimport path from 'node:path';\nimport fs from 'node:fs';\nimport http, { type Agent as HttpAgent } from 'node:http';\nimport { WebSocket, type ClientOptions as WSClientOptions, createWebSocketStream } from 'ws';\nimport type { Transport } from './transport.js';\n\n// --- address-mapping parser ----------------------------------------------\n\nexport interface AddressMapping {\n rawSpec: string;\n /** TCP listen address, or undefined when listening on a Unix socket. */\n listenAddr?: string;\n /** TCP listen port, or undefined when listening on a Unix socket. */\n listenPort?: number;\n /** Listen Unix socket path, or undefined when listening on TCP. */\n listenUnixPath?: string;\n /** Remote host inside the VM, or undefined when targeting a Unix socket. */\n remoteHost?: string;\n /** Remote port inside the VM, or undefined when targeting a Unix socket. */\n remotePort?: number;\n /** Remote Unix socket path inside the VM, or undefined when targeting TCP. */\n remoteUnixPath?: string;\n}\n\nfunction looksLikeUnixSocketPath(s: string): boolean {\n if (!s) return false;\n return s.startsWith('/') || s.startsWith('./') || s.startsWith('../') || s.includes('/');\n}\n\n/**\n * Parse a `-L`-style spec into an {@link AddressMapping}. Supported formats\n * mirror the Go SDK's `slicer vm forward` CLI:\n *\n * - `127.0.0.1:9000` — listen and forward on the same TCP host:port\n * - `9001:127.0.0.1:9000` — listen on `0.0.0.0:9001`, forward to `127.0.0.1:9000`\n * - `0:127.0.0.1:9000` — listen on a random TCP port, forward as above\n * - `0.0.0.0:9000:127.0.0.1:9000` — listen and forward, fully explicit\n * - `127.0.0.1:9000:/var/run/docker.sock` — TCP listen, Unix socket forward\n * - `9000:/var/run/docker.sock` — `0.0.0.0:9000` listen, Unix socket forward\n * - `/tmp/docker.sock:/var/run/docker.sock` — Unix-to-Unix forward\n * - `./docker.sock:/var/run/docker.sock` — Unix-to-Unix with relative local\n */\nexport function parseAddressMapping(spec: string): AddressMapping {\n // Unix-to-Unix: both sides look like paths.\n const lastColon = spec.lastIndexOf(':');\n if (lastColon !== -1) {\n const localPart = spec.slice(0, lastColon);\n const remotePart = spec.slice(lastColon + 1);\n if (looksLikeUnixSocketPath(localPart) && looksLikeUnixSocketPath(remotePart)) {\n const localAbs = path.isAbsolute(localPart) ? localPart : path.resolve(localPart);\n return { rawSpec: spec, listenUnixPath: localAbs, remoteUnixPath: remotePart };\n }\n }\n\n // TCP-to-Unix: the substring `:/` marks the boundary.\n const tcpToUnix = spec.indexOf(':/');\n if (tcpToUnix !== -1) {\n const listenPart = spec.slice(0, tcpToUnix);\n const socketPath = spec.slice(tcpToUnix + 1); // keep leading slash\n const innerColon = listenPart.lastIndexOf(':');\n if (innerColon === -1) {\n return {\n rawSpec: spec,\n listenAddr: '0.0.0.0',\n listenPort: parsePort(listenPart, spec),\n remoteUnixPath: socketPath,\n };\n }\n return {\n rawSpec: spec,\n listenAddr: listenPart.slice(0, innerColon),\n listenPort: parsePort(listenPart.slice(innerColon + 1), spec),\n remoteUnixPath: socketPath,\n };\n }\n\n const parts = spec.split(':');\n switch (parts.length) {\n case 2:\n return {\n rawSpec: spec,\n listenAddr: parts[0]!,\n listenPort: parsePort(parts[1]!, spec),\n remoteHost: parts[0]!,\n remotePort: parsePort(parts[1]!, spec),\n };\n case 3:\n return {\n rawSpec: spec,\n listenAddr: parts[1]!,\n listenPort: parsePort(parts[0]!, spec),\n remoteHost: parts[1]!,\n remotePort: parsePort(parts[2]!, spec),\n };\n case 4:\n return {\n rawSpec: spec,\n listenAddr: parts[0]!,\n listenPort: parsePort(parts[1]!, spec),\n remoteHost: parts[2]!,\n remotePort: parsePort(parts[3]!, spec),\n };\n default:\n throw new Error(`invalid forward spec ${JSON.stringify(spec)}: expected 2-4 colon-separated parts`);\n }\n}\n\nfunction parsePort(s: string, spec: string): number {\n const n = Number(s);\n if (!Number.isInteger(n) || n < 0 || n > 65535) {\n throw new Error(`invalid port ${JSON.stringify(s)} in forward spec ${JSON.stringify(spec)}`);\n }\n return n;\n}\n\nfunction isListenUnix(m: AddressMapping): boolean {\n return m.listenUnixPath !== undefined;\n}\n\nfunction remoteTargetHeader(m: AddressMapping): string {\n if (m.remoteUnixPath) return `unix:${m.remoteUnixPath}`;\n return `${m.remoteHost}:${m.remotePort}`;\n}\n\nfunction listenAddressDescription(m: AddressMapping): string {\n if (isListenUnix(m)) return m.listenUnixPath!;\n return `${m.listenAddr}:${m.listenPort}`;\n}\n\n// --- forwarder ------------------------------------------------------------\n\nexport interface ForwarderListener {\n /** The original spec string that produced this listener. */\n spec: string;\n /** Human-readable local address (`127.0.0.1:8080`, `/tmp/docker.sock`, etc). */\n local: string;\n /** Human-readable upstream target inside the VM. */\n remote: string;\n /** Resolved port for TCP listeners (useful when caller asked for `0`). */\n port?: number;\n}\n\nexport interface ForwarderOptions {\n /** Identifies this client to the daemon. Defaults to `os.hostname()`. */\n clientId?: string;\n /** WebSocket dial timeout (ms). Default 10_000. */\n dialTimeoutMs?: number;\n /**\n * Optional logger for connection events. Receives short strings. Default: silent.\n */\n log?: (msg: string) => void;\n}\n\nexport interface ForwarderInit {\n hostname: string;\n transport: Transport;\n token?: string;\n userAgent: string;\n specs: string[];\n options?: ForwarderOptions;\n}\n\n/**\n * A live set of port forwards for one VM. Returned by `vm.forward(...)`.\n * Closing the forwarder tears down all local listeners and any in-flight\n * tunnel WebSockets.\n */\nexport class Forwarder {\n readonly listeners: ForwarderListener[] = [];\n private readonly servers: TcpServer[] = [];\n private readonly liveSockets = new Set<{ close: () => void }>();\n private closed = false;\n\n private constructor(\n private readonly init: ForwarderInit,\n private readonly mappings: AddressMapping[],\n ) {}\n\n static async start(init: ForwarderInit): Promise<Forwarder> {\n if (init.specs.length === 0) {\n throw new Error('Forwarder requires at least one forward spec');\n }\n const mappings = init.specs.map(parseAddressMapping);\n const fwd = new Forwarder(init, mappings);\n try {\n await fwd.bindAll();\n } catch (err) {\n await fwd.close();\n throw err;\n }\n return fwd;\n }\n\n private async bindAll(): Promise<void> {\n for (const m of this.mappings) {\n const server = createNetServer((socket) => this.handleAccept(m, socket));\n const { local, port } = await listen(server, m);\n this.servers.push(server);\n this.listeners.push({\n spec: m.rawSpec,\n local,\n remote: remoteTargetHeader(m),\n ...(port !== undefined && { port }),\n });\n this.log(`listen ${local} → ${remoteTargetHeader(m)}`);\n }\n }\n\n private handleAccept(mapping: AddressMapping, socket: Socket): void {\n if (this.closed) {\n socket.destroy();\n return;\n }\n socket.on('error', () => {\n /* connection-level errors are surfaced via close */\n });\n\n const ws = openWebSocket(this.init, mapping);\n let closed = false;\n\n const cleanup = () => {\n if (closed) return;\n closed = true;\n try { socket.destroy(); } catch { /* ignore */ }\n try { ws.close(); } catch { /* ignore */ }\n this.liveSockets.delete(handle);\n };\n const handle = { close: cleanup };\n this.liveSockets.add(handle);\n\n ws.binaryType = 'nodebuffer';\n ws.on('open', () => {\n const wsStream = createWebSocketStream(ws);\n wsStream.on('error', cleanup);\n socket.pipe(wsStream);\n wsStream.pipe(socket);\n });\n ws.on('close', cleanup);\n ws.on('error', (err) => {\n this.log(`tunnel error: ${err.message}`);\n cleanup();\n });\n socket.on('close', cleanup);\n }\n\n /** Tear down all listeners and any in-flight tunnel sockets. */\n async close(): Promise<void> {\n this.closed = true;\n for (const handle of [...this.liveSockets]) handle.close();\n this.liveSockets.clear();\n\n await Promise.all(\n this.servers.map(\n (s) =>\n new Promise<void>((resolve) => {\n s.close(() => resolve());\n }),\n ),\n );\n\n // Clean up Unix socket files we created.\n for (const m of this.mappings) {\n if (isListenUnix(m) && m.listenUnixPath) {\n try {\n fs.rmSync(m.listenUnixPath, { force: true });\n } catch {\n /* ignore */\n }\n }\n }\n }\n\n private log(msg: string): void {\n this.init.options?.log?.(msg);\n }\n}\n\n// --- helpers --------------------------------------------------------------\n\nfunction listen(\n server: TcpServer,\n mapping: AddressMapping,\n): Promise<{ local: string; port?: number }> {\n return new Promise((resolve, reject) => {\n server.once('error', reject);\n if (isListenUnix(mapping)) {\n const p = mapping.listenUnixPath!;\n // Remove any stale socket file first.\n try {\n fs.rmSync(p, { force: true });\n } catch {\n /* ignore */\n }\n server.listen(p, () => {\n try {\n fs.chmodSync(p, 0o660);\n } catch {\n /* best-effort */\n }\n resolve({ local: p });\n });\n return;\n }\n\n server.listen({ host: mapping.listenAddr, port: mapping.listenPort }, () => {\n const addr = server.address();\n if (addr && typeof addr === 'object') {\n const local = `${mapping.listenAddr}:${addr.port}`;\n resolve({ local, port: addr.port });\n } else {\n resolve({ local: listenAddressDescription(mapping) });\n }\n });\n });\n}\n\nfunction openWebSocket(init: ForwarderInit, mapping: AddressMapping): WebSocket {\n const url = wsURLForVM(init.transport, init.hostname);\n const headers: Record<string, string> = {\n 'X-Inlets-Client-ID': init.options?.clientId ?? os.hostname(),\n 'X-Inlets-Mode': 'local',\n 'X-Inlets-Upstream': remoteTargetHeader(mapping),\n 'User-Agent': init.userAgent,\n };\n if (init.token) headers['Authorization'] = `Bearer ${init.token}`;\n\n const opts: WSClientOptions = {\n headers,\n handshakeTimeout: init.options?.dialTimeoutMs ?? 10_000,\n };\n if (init.transport.kind === 'socket') {\n opts.agent = unixAgent(init.transport.socketPath);\n }\n return new WebSocket(url, opts);\n}\n\nfunction wsURLForVM(transport: Transport, hostname: string): string {\n if (transport.kind === 'socket') {\n // Host part is irrelevant; the unix-socket agent overrides the dial.\n return `ws://localhost/vm/${encodeURIComponent(hostname)}/forward`;\n }\n const u = transport.url;\n const scheme = u.protocol === 'https:' ? 'wss' : 'ws';\n const port = u.port ? `:${u.port}` : '';\n return `${scheme}://${u.hostname}${port}/vm/${encodeURIComponent(hostname)}/forward`;\n}\n\nfunction unixAgent(socketPath: string): HttpAgent {\n const agent = new http.Agent({ keepAlive: false });\n // ws's HTTP upgrade goes through `agent.createConnection`. Override it to\n // dial the daemon's unix socket instead of opening a TCP connection.\n (agent as unknown as { createConnection: typeof agent.createConnection }).createConnection = ((\n _opts: unknown,\n cb?: (err: Error | null, sock?: net.Socket) => void,\n ) => {\n const conn = net.createConnection({ path: socketPath });\n if (cb) {\n conn.once('connect', () => cb(null, conn));\n conn.once('error', (err: Error) => cb(err));\n }\n return conn;\n }) as typeof agent.createConnection;\n return agent;\n}\n","/**\n * VM handle — returned from `client.vms.create()` / `client.vms.get()`.\n * Exposes per-VM operations (exec, fs, power, lifecycle).\n */\n\nimport { Readable } from 'node:stream';\nimport type { TransportClient } from './transport.js';\nimport { Forwarder, type ForwarderOptions } from './forward.js';\nimport {\n type AgentHealth,\n type ExecFrame,\n type ExecRequest,\n type ExecResult,\n type ExecResultBinary,\n type FSEntry,\n type FSMkdirRequest,\n type FSWatchEvent,\n type FSWatchRequest,\n type ShutdownRequest,\n SlicerAPIError,\n type VMLogs,\n type WaitOptions,\n} from './types.js';\nimport {\n agentHealthFromWire,\n fsEntryFromWire,\n type WireAgentHealth,\n type WireFSInfo,\n} from './wire.js';\n\n/** Per-VM filesystem operations. */\nexport class VMFileSystem {\n constructor(\n private readonly transport: TransportClient,\n private readonly hostname: string,\n ) {}\n\n async readDir(path: string): Promise<FSEntry[]> {\n const q = new URLSearchParams({ path });\n const wire = await this.transport.request<WireFSInfo[]>(\n 'GET',\n `/vm/${encodeURIComponent(this.hostname)}/fs/readdir?${q.toString()}`,\n );\n return (wire ?? []).map(fsEntryFromWire);\n }\n\n async stat(path: string): Promise<FSEntry | null> {\n const q = new URLSearchParams({ path });\n try {\n const wire = await this.transport.request<WireFSInfo>(\n 'GET',\n `/vm/${encodeURIComponent(this.hostname)}/fs/stat?${q.toString()}`,\n );\n return fsEntryFromWire(wire);\n } catch (err) {\n if (err instanceof SlicerAPIError && err.status === 404) return null;\n throw err;\n }\n }\n\n async exists(path: string): Promise<boolean> {\n return (await this.stat(path)) !== null;\n }\n\n async mkdir(req: FSMkdirRequest): Promise<void> {\n await this.transport.request(\n 'POST',\n `/vm/${encodeURIComponent(this.hostname)}/fs/mkdir`,\n {\n path: req.path,\n ...(req.recursive !== undefined && { recursive: req.recursive }),\n ...(req.mode !== undefined && { mode: req.mode }),\n },\n );\n }\n\n async remove(path: string, recursive = false): Promise<void> {\n const q = new URLSearchParams({ path, recursive: String(recursive) });\n await this.transport.request(\n 'DELETE',\n `/vm/${encodeURIComponent(this.hostname)}/fs/remove?${q.toString()}`,\n );\n }\n\n async readFile(path: string): Promise<Buffer> {\n const q = new URLSearchParams({ path, mode: 'binary' });\n return this.transport.requestRaw(\n 'GET',\n `/vm/${encodeURIComponent(this.hostname)}/cp?${q.toString()}`,\n );\n }\n\n async writeFile(\n path: string,\n content: Buffer | string,\n opts: { uid?: number; gid?: number; permissions?: string } = {},\n ): Promise<void> {\n const q = new URLSearchParams({ path, mode: 'binary' });\n if (opts.uid !== undefined) q.set('uid', String(opts.uid));\n if (opts.gid !== undefined) q.set('gid', String(opts.gid));\n if (opts.permissions) q.set('permissions', opts.permissions);\n const body = typeof content === 'string' ? Buffer.from(content) : content;\n await this.transport.requestRaw(\n 'POST',\n `/vm/${encodeURIComponent(this.hostname)}/cp?${q.toString()}`,\n body,\n );\n }\n\n /** Upload a tar archive, expanded into the VM at `path`. */\n async tarTo(path: string, tar: Buffer | Readable): Promise<void> {\n const q = new URLSearchParams({ path, mode: 'tar' });\n if (tar instanceof Buffer) {\n await this.transport.requestRaw(\n 'POST',\n `/vm/${encodeURIComponent(this.hostname)}/cp?${q.toString()}`,\n tar,\n 'application/x-tar',\n );\n return;\n }\n const res = await this.transport.requestStreamRaw(\n 'POST',\n `/vm/${encodeURIComponent(this.hostname)}/cp?${q.toString()}`,\n tar,\n 'application/x-tar',\n );\n for await (const _ of res as AsyncIterable<Buffer>) void _;\n }\n\n /**\n * Open a Server-Sent Events stream of filesystem events from the VM.\n * Yields one `FSWatchEvent` per agent-side event. The stream stays open\n * until the supplied request's `timeout` / `maxEvents` is hit, the daemon\n * tears it down, or the caller breaks out of the loop.\n *\n * Heartbeat SSE comments and named `event:` lines are silently dropped.\n *\n * Example:\n * ```ts\n * for await (const e of vm.fs.watch({ paths: ['/tmp'], recursive: true })) {\n * console.log(e.type, e.path);\n * }\n * ```\n */\n async *watch(req: FSWatchRequest): AsyncGenerator<FSWatchEvent, void, void> {\n if (!req.paths || req.paths.length === 0) {\n throw new Error('vm.fs.watch: paths is required');\n }\n const q = new URLSearchParams();\n for (const p of req.paths) if (p) q.append('paths', p);\n for (const p of req.patterns ?? []) if (p) q.append('patterns', p);\n for (const e of req.events ?? []) if (e) q.append('events', e);\n if (req.uid !== undefined && req.uid !== 0) q.set('uid', String(req.uid));\n if (req.recursive) q.set('recursive', 'true');\n if (req.oneShot) q.set('one_shot', 'true');\n if (req.debounce) q.set('debounce', req.debounce);\n if (req.timeout) q.set('timeout', req.timeout);\n if (req.maxEvents !== undefined && req.maxEvents > 0) {\n q.set('max_events', String(req.maxEvents));\n }\n\n const extraHeaders: Record<string, string> = { Accept: 'text/event-stream' };\n if (req.lastEventId) extraHeaders['Last-Event-ID'] = req.lastEventId;\n\n const res = await this.transport.requestStreamRaw(\n 'GET',\n `/vm/${encodeURIComponent(this.hostname)}/fs/watch?${q.toString()}`,\n undefined,\n undefined,\n extraHeaders,\n );\n\n res.setEncoding('utf8');\n let buffer = '';\n let dataLines: string[] = [];\n let pendingId = 0;\n\n for await (const chunk of res as AsyncIterable<string>) {\n buffer += chunk;\n let nl: number;\n while ((nl = buffer.indexOf('\\n')) >= 0) {\n const raw = buffer.slice(0, nl);\n buffer = buffer.slice(nl + 1);\n const line = raw.endsWith('\\r') ? raw.slice(0, -1) : raw;\n if (line === '') {\n if (dataLines.length > 0) {\n const payload = dataLines.join('\\n');\n dataLines = [];\n try {\n const parsed = JSON.parse(payload) as Partial<FSWatchEvent>;\n const evt: FSWatchEvent = {\n id: typeof parsed.id === 'number' && parsed.id !== 0 ? parsed.id : pendingId,\n type: parsed.type ?? '',\n path: parsed.path ?? '',\n timestamp: parsed.timestamp ?? '',\n size: parsed.size ?? 0,\n isDir: parsed.isDir ?? false,\n ...(parsed.message !== undefined && { message: parsed.message }),\n };\n yield evt;\n } catch {\n /* skip malformed payload */\n }\n }\n } else if (line.startsWith(':')) {\n /* heartbeat comment, ignore */\n } else if (line.startsWith('data:')) {\n dataLines.push(line.slice(5).replace(/^ /, ''));\n } else if (line.startsWith('id:')) {\n const v = parseInt(line.slice(3).trim(), 10);\n if (!Number.isNaN(v)) pendingId = v;\n }\n /* `event:` lines ignored — the server only uses one event type. */\n }\n }\n }\n\n /** Download `path` from the VM as a tar archive. */\n async tarFrom(path: string): Promise<Buffer> {\n const q = new URLSearchParams({ path, mode: 'tar' });\n return this.transport.requestRaw(\n 'GET',\n `/vm/${encodeURIComponent(this.hostname)}/cp?${q.toString()}`,\n );\n }\n}\n\nexport interface VMInit {\n hostname: string;\n hostGroup: string;\n ip?: string;\n createdAt?: string;\n arch?: string;\n}\n\nexport class VM {\n readonly hostname: string;\n readonly hostGroup: string;\n readonly ip?: string;\n readonly createdAt?: string;\n readonly arch?: string;\n readonly fs: VMFileSystem;\n\n private readonly transport: TransportClient;\n\n constructor(transport: TransportClient, init: VMInit) {\n this.transport = transport;\n this.hostname = init.hostname;\n this.hostGroup = init.hostGroup;\n if (init.ip !== undefined) this.ip = init.ip;\n if (init.createdAt !== undefined) this.createdAt = init.createdAt;\n if (init.arch !== undefined) this.arch = init.arch;\n this.fs = new VMFileSystem(transport, this.hostname);\n }\n\n // --- lifecycle --------------------------------------------------------\n\n async delete(): Promise<void> {\n await this.transport.request(\n 'DELETE',\n `/hostgroup/${encodeURIComponent(this.hostGroup)}/nodes/${encodeURIComponent(\n this.hostname,\n )}`,\n );\n }\n\n // --- health / logs ----------------------------------------------------\n\n async health(): Promise<AgentHealth> {\n const wire = await this.transport.request<WireAgentHealth>(\n 'GET',\n `/vm/${encodeURIComponent(this.hostname)}/health`,\n );\n return agentHealthFromWire(wire);\n }\n\n async logs(): Promise<VMLogs> {\n return this.transport.request<VMLogs>('GET', `/vm/${encodeURIComponent(this.hostname)}/logs`);\n }\n\n async waitForAgent(opts: WaitOptions = {}): Promise<AgentHealth> {\n const timeoutMs = opts.timeoutMs ?? 120_000;\n const intervalMs = opts.intervalMs ?? 500;\n const deadline = Date.now() + timeoutMs;\n let lastErr: unknown;\n while (Date.now() < deadline) {\n try {\n return await this.health();\n } catch (err) {\n lastErr = err;\n await sleep(intervalMs);\n }\n }\n throw new Error(\n `agent for ${this.hostname} did not become ready within ${timeoutMs}ms: ${errMsg(lastErr)}`,\n );\n }\n\n async waitForUserdata(opts: WaitOptions = {}): Promise<AgentHealth> {\n const timeoutMs = opts.timeoutMs ?? 120_000;\n const intervalMs = opts.intervalMs ?? 500;\n const deadline = Date.now() + timeoutMs;\n let last: AgentHealth | undefined;\n let lastErr: unknown;\n while (Date.now() < deadline) {\n try {\n last = await this.health();\n if (last.userdataRan) return last;\n } catch (err) {\n lastErr = err;\n }\n await sleep(intervalMs);\n }\n throw new Error(\n `userdata for ${this.hostname} did not complete within ${timeoutMs}ms${\n lastErr ? `: ${errMsg(lastErr)}` : ''\n }`,\n );\n }\n\n // --- power ------------------------------------------------------------\n\n async shutdown(req: ShutdownRequest = {}): Promise<void> {\n await this.transport.request(\n 'POST',\n `/vm/${encodeURIComponent(this.hostname)}/shutdown`,\n req,\n );\n }\n\n async pause(): Promise<void> {\n await this.transport.request('POST', `/vm/${encodeURIComponent(this.hostname)}/pause`);\n }\n\n async resume(): Promise<void> {\n await this.transport.request('POST', `/vm/${encodeURIComponent(this.hostname)}/resume`);\n }\n\n async relaunch(): Promise<void> {\n await this.transport.request('POST', `/vm/${encodeURIComponent(this.hostname)}/relaunch`);\n }\n\n /** Mac-only on current daemons. Throws `SlicerAPIError 404` on Linux. */\n async suspend(): Promise<void> {\n await this.transport.request('POST', `/vm/${encodeURIComponent(this.hostname)}/suspend`);\n }\n\n /** Mac-only on current daemons. Throws `SlicerAPIError 404` on Linux. */\n async restore(): Promise<void> {\n await this.transport.request('POST', `/vm/${encodeURIComponent(this.hostname)}/restore`);\n }\n\n // --- port forwarding ---------------------------------------------------\n\n /**\n * Open one or more port forwards from the host to this VM. Each spec follows\n * the same syntax as `slicer vm forward -L`:\n *\n * `127.0.0.1:9000` — listen and forward on the same TCP port\n * `8081:127.0.0.1:8080` — listen on `0.0.0.0:8081`, forward to `127.0.0.1:8080`\n * `0.0.0.0:8080:127.0.0.1:8080` — fully explicit\n * `9000:/var/run/docker.sock` — TCP listen, Unix socket forward\n * `/tmp/docker.sock:/var/run/docker.sock` — Unix-to-Unix\n *\n * Returns a {@link Forwarder} handle. Call `forwarder.close()` to tear down\n * all listeners and any in-flight tunnel sockets.\n */\n async forward(specs: string | string[], options?: ForwarderOptions): Promise<Forwarder> {\n return Forwarder.start({\n hostname: this.hostname,\n transport: this.transport.transport,\n ...(this.transport.token !== undefined && { token: this.transport.token }),\n userAgent: this.transport.userAgent,\n specs: typeof specs === 'string' ? [specs] : specs,\n ...(options !== undefined && { options }),\n });\n }\n\n // --- exec -------------------------------------------------------------\n\n /**\n * Streaming exec — yields NDJSON frames (`started`, `stdout`, `stderr`, `exit`).\n * When `req.stdio === 'base64'`, each frame's `data`/`stdout`/`stderr` string\n * fields are preserved as-is (base64-encoded) and the SDK populates decoded\n * `dataBytes`/`stdoutBytes`/`stderrBytes` Buffers alongside for convenience.\n */\n async *exec(req: ExecRequest): AsyncGenerator<ExecFrame, void, void> {\n const { path, body } = buildExecPath(this.hostname, req, false);\n for await (const frame of this.transport.requestNDJSON<ExecFrame>('POST', path, body)) {\n if (frame.encoding === 'base64') {\n if (frame.data) frame.dataBytes = Buffer.from(frame.data, 'base64');\n if (frame.stdout) frame.stdoutBytes = Buffer.from(frame.stdout, 'base64');\n if (frame.stderr) frame.stderrBytes = Buffer.from(frame.stderr, 'base64');\n }\n yield frame;\n }\n }\n\n /**\n * Buffered exec via `?buffered=true`. stdin is intentionally unsupported\n * (matches Go SDK `ExecBuffered`); use `exec()` for stdin cases.\n *\n * When `req.stdio === 'base64'`, stdout/stderr are decoded from base64 and\n * returned as `Buffer` — use this for binary output. Otherwise the result\n * carries UTF-8 strings.\n */\n execBuffered(req: ExecRequest & { stdio: 'base64' }): Promise<ExecResultBinary>;\n execBuffered(req: ExecRequest): Promise<ExecResult>;\n async execBuffered(req: ExecRequest): Promise<ExecResult | ExecResultBinary> {\n if (req.stdin !== undefined) {\n throw new Error('stdin is not supported by execBuffered; use exec() instead');\n }\n const { path, body } = buildExecPath(this.hostname, req, true);\n const raw = await this.transport.requestRaw('POST', path, body);\n const text = raw.toString('utf8');\n const parsed = text\n ? (JSON.parse(text) as {\n stdout?: string;\n stderr?: string;\n encoding?: 'text' | 'base64';\n pid?: number;\n started_at?: string;\n ended_at?: string;\n signal?: string;\n exit_code?: number;\n error?: string;\n })\n : {};\n\n const common = {\n exitCode: parsed.exit_code ?? 0,\n ...(parsed.pid !== undefined && { pid: parsed.pid }),\n ...(parsed.started_at !== undefined && { startedAt: parsed.started_at }),\n ...(parsed.ended_at !== undefined && { endedAt: parsed.ended_at }),\n ...(parsed.signal !== undefined && { signal: parsed.signal }),\n ...(parsed.error !== undefined && { error: parsed.error }),\n };\n\n if (req.stdio === 'base64' || parsed.encoding === 'base64') {\n return {\n stdout: Buffer.from(parsed.stdout ?? '', 'base64'),\n stderr: Buffer.from(parsed.stderr ?? '', 'base64'),\n encoding: 'base64',\n ...common,\n } satisfies ExecResultBinary;\n }\n return {\n stdout: parsed.stdout ?? '',\n stderr: parsed.stderr ?? '',\n ...(parsed.encoding !== undefined && { encoding: parsed.encoding }),\n ...common,\n } satisfies ExecResult;\n }\n}\n\nfunction buildExecPath(\n hostname: string,\n req: ExecRequest,\n buffered: boolean,\n): { path: string; body: Buffer | undefined } {\n const q = new URLSearchParams();\n if (req.command) q.set('cmd', req.command);\n for (const a of req.args ?? []) q.append('args', a);\n for (const e of req.env ?? []) q.append('env', e);\n if (req.uid !== undefined) q.set('uid', String(req.uid));\n if (req.gid !== undefined) q.set('gid', String(req.gid));\n if (req.cwd) q.set('cwd', req.cwd);\n if (req.shell) q.set('shell', req.shell);\n if (req.permissions) q.set('permissions', req.permissions);\n if (req.stdio) q.set('stdio', req.stdio);\n if (buffered) q.set('buffered', 'true');\n let body: Buffer | undefined;\n if (req.stdin !== undefined) {\n q.set('stdin', 'true');\n body = typeof req.stdin === 'string' ? Buffer.from(req.stdin) : req.stdin;\n }\n return {\n path: `/vm/${encodeURIComponent(hostname)}/exec?${q.toString()}`,\n body,\n };\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((r) => setTimeout(r, ms));\n}\n\nfunction errMsg(e: unknown): string {\n return e instanceof Error ? e.message : String(e);\n}\n","/**\n * Top-level namespaces on SlicerClient: hostGroups, vms, secrets.\n * Keep control-plane operations here; per-VM operations live on the VM handle.\n */\n\nimport type { TransportClient } from './transport.js';\nimport {\n type CreateSecretRequest,\n type CreateVMOptions,\n type CreateVMRequest,\n type CreateVMResponse,\n type HostGroup,\n type ListOptions,\n type Secret,\n SecretExistsError,\n SlicerAPIError,\n type UpdateSecretRequest,\n type VMInfo,\n type VMStat,\n} from './types.js';\nimport {\n createVMReqToWire,\n createVMResFromWire,\n hostGroupFromWire,\n secretFromWire,\n vmFromWire,\n vmStatFromWire,\n type WireCreateVMResponse,\n type WireHostGroup,\n type WireSecret,\n type WireVM,\n type WireVMStat,\n} from './wire.js';\nimport { VM } from './vm.js';\n\nexport class HostGroupsAPI {\n constructor(private readonly transport: TransportClient) {}\n\n async list(): Promise<HostGroup[]> {\n const wire = await this.transport.request<WireHostGroup[]>('GET', '/hostgroup');\n return (wire ?? []).map(hostGroupFromWire);\n }\n\n /** Convenience lookup (no single-group endpoint exists on the daemon). */\n async find(name: string): Promise<HostGroup | undefined> {\n return (await this.list()).find((g) => g.name === name);\n }\n\n async listVMs(name: string, opts: ListOptions = {}): Promise<VMInfo[]> {\n const q = buildListQuery(opts);\n const wire = await this.transport.request<WireVM[]>(\n 'GET',\n `/hostgroup/${encodeURIComponent(name)}/nodes${q}`,\n );\n return (wire ?? []).map(vmFromWire);\n }\n}\n\nexport class VMsAPI {\n constructor(private readonly transport: TransportClient) {}\n\n async create(\n hostGroup: string,\n req: CreateVMRequest = {},\n opts: CreateVMOptions = {},\n ): Promise<VM> {\n const qs = new URLSearchParams();\n if (opts.wait) qs.set('wait', opts.wait);\n if (opts.waitTimeoutSec !== undefined) qs.set('timeout', `${opts.waitTimeoutSec}s`);\n const query = qs.toString() ? `?${qs.toString()}` : '';\n const wire = await this.transport.request<WireCreateVMResponse>(\n 'POST',\n `/hostgroup/${encodeURIComponent(hostGroup)}/nodes${query}`,\n createVMReqToWire(req),\n );\n const res = createVMResFromWire(wire);\n return new VM(this.transport, {\n hostname: res.hostname,\n hostGroup: res.hostGroup ?? hostGroup,\n ...(res.ip !== undefined && { ip: res.ip }),\n ...(res.createdAt !== undefined && { createdAt: res.createdAt }),\n ...(res.arch !== undefined && { arch: res.arch }),\n });\n }\n\n /**\n * Build a VM handle for an existing VM given its hostgroup + hostname. No\n * request is issued — use `health()` or `getInfo()` to verify reachability.\n */\n attach(hostGroup: string, hostname: string): VM {\n return new VM(this.transport, { hostname, hostGroup });\n }\n\n /** Look up a VM by hostname across all host groups. Returns `undefined` if not found. */\n async get(hostname: string): Promise<VM | undefined> {\n const all = await this.list();\n const found = all.find((v) => v.hostname === hostname);\n if (!found) return undefined;\n return new VM(this.transport, {\n hostname: found.hostname,\n hostGroup: found.hostGroup ?? '',\n ...(found.ip !== undefined && { ip: found.ip }),\n ...(found.createdAt !== undefined && { createdAt: found.createdAt }),\n ...(found.arch !== undefined && { arch: found.arch }),\n });\n }\n\n /** Return raw VM metadata across all host groups. */\n async list(opts: ListOptions = {}): Promise<VMInfo[]> {\n const q = buildListQuery(opts);\n const wire = await this.transport.request<WireVM[]>('GET', `/nodes${q}`);\n return (wire ?? []).map(vmFromWire);\n }\n\n async stats(): Promise<VMStat[]> {\n const raw = await this.transport.request<WireVMStat[]>('GET', '/nodes/stats');\n return (raw ?? []).map(vmStatFromWire);\n }\n\n /**\n * Raw response accessor — bypasses the VM handle. Useful when you only\n * want the create metadata without a handle.\n */\n async createRaw(\n hostGroup: string,\n req: CreateVMRequest = {},\n opts: CreateVMOptions = {},\n ): Promise<CreateVMResponse> {\n const qs = new URLSearchParams();\n if (opts.wait) qs.set('wait', opts.wait);\n if (opts.waitTimeoutSec !== undefined) qs.set('timeout', `${opts.waitTimeoutSec}s`);\n const query = qs.toString() ? `?${qs.toString()}` : '';\n const wire = await this.transport.request<WireCreateVMResponse>(\n 'POST',\n `/hostgroup/${encodeURIComponent(hostGroup)}/nodes${query}`,\n createVMReqToWire(req),\n );\n return createVMResFromWire(wire);\n }\n}\n\nexport class SecretsAPI {\n constructor(private readonly transport: TransportClient) {}\n\n async list(): Promise<Secret[]> {\n const wire = await this.transport.request<WireSecret[]>('GET', '/secrets');\n return (wire ?? []).map(secretFromWire);\n }\n\n async create(req: CreateSecretRequest): Promise<void> {\n const body = {\n name: req.name,\n data: Buffer.from(req.data).toString('base64'),\n ...(req.permissions !== undefined && { permissions: req.permissions }),\n ...(req.uid !== undefined && { uid: req.uid }),\n ...(req.gid !== undefined && { gid: req.gid }),\n };\n try {\n await this.transport.request('POST', '/secrets', body);\n } catch (err) {\n if (err instanceof SlicerAPIError && err.status === 409) {\n throw new SecretExistsError(req.name);\n }\n throw err;\n }\n }\n\n async patch(name: string, req: UpdateSecretRequest): Promise<void> {\n const body = {\n data: Buffer.from(req.data).toString('base64'),\n ...(req.permissions !== undefined && { permissions: req.permissions }),\n ...(req.uid !== undefined && { uid: req.uid }),\n ...(req.gid !== undefined && { gid: req.gid }),\n };\n await this.transport.request('PATCH', `/secrets/${encodeURIComponent(name)}`, body);\n }\n\n async delete(name: string): Promise<void> {\n await this.transport.request('DELETE', `/secrets/${encodeURIComponent(name)}`);\n }\n}\n\nfunction buildListQuery(opts: ListOptions): string {\n const qs = new URLSearchParams();\n if (opts.tag) qs.set('tag', opts.tag);\n if (opts.tagPrefix) qs.set('tag_prefix', opts.tagPrefix);\n const s = qs.toString();\n return s ? `?${s}` : '';\n}\n","/**\n * SlicerClient — grouped TypeScript client for the Slicer VM API.\n *\n * Shape:\n * client.hostGroups.list() / find(name) / listVMs(name)\n * client.vms.create(group, req, opts) → VM / get(name) / list() / stats() / attach(group, name)\n * client.secrets.list / create / patch / delete\n * client.getInfo()\n *\n * Per-VM operations live on the `VM` handle returned from `client.vms.create`\n * or `client.vms.attach`: `vm.exec`, `vm.execBuffered`, `vm.fs.*`,\n * `vm.pause/resume/suspend/restore/shutdown/relaunch`, `vm.health/logs`,\n * `vm.waitForAgent/waitForUserdata`, `vm.delete`.\n */\n\nimport { TransportClient, type TransportClientOptions } from './transport.js';\nimport { HostGroupsAPI, SecretsAPI, VMsAPI } from './namespaces.js';\nimport type { SlicerInfo } from './types.js';\n\nexport interface SlicerClientOptions extends TransportClientOptions {}\n\nexport class SlicerClient {\n readonly transport: TransportClient;\n readonly hostGroups: HostGroupsAPI;\n readonly vms: VMsAPI;\n readonly secrets: SecretsAPI;\n\n constructor(opts: SlicerClientOptions) {\n this.transport = new TransportClient(opts);\n this.hostGroups = new HostGroupsAPI(this.transport);\n this.vms = new VMsAPI(this.transport);\n this.secrets = new SecretsAPI(this.transport);\n }\n\n static fromEnv(overrides: Partial<SlicerClientOptions> = {}): SlicerClient {\n const baseURL = overrides.baseURL ?? process.env.SLICER_URL;\n if (!baseURL) throw new Error('SLICER_URL is required (or pass baseURL)');\n const token = overrides.token ?? process.env.SLICER_TOKEN ?? undefined;\n return new SlicerClient({\n baseURL,\n ...(token !== undefined && { token }),\n ...(overrides.userAgent !== undefined && { userAgent: overrides.userAgent }),\n });\n }\n\n async getInfo(): Promise<SlicerInfo> {\n return this.transport.request<SlicerInfo>('GET', '/info');\n }\n}\n"]}