@slicervm/sdk 0.1.7 → 0.1.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +29 -1
- package/dist/index.cjs +227 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +125 -5
- package/dist/index.d.ts +125 -5
- package/dist/index.js +225 -3
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
package/dist/index.cjs.map
CHANGED
|
@@ -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/proxy.ts","../src/client.ts","../src/shell.ts"],"names":["path","os","URL","https","http","createNetServer","ws","createWebSocketStream","fs","WebSocket","net","secretFromWire"],"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\n/**\n * Per-launch network policy override for isolated host groups.\n * Omitted lists inherit the host group's policy. Empty lists intentionally\n * clear that list for this VM launch.\n */\nexport interface CreateVMNetworkPolicy {\n allow?: string[];\n drop?: string[];\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 network?: CreateVMNetworkPolicy;\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\n// ----- background exec --------------------------------------------------\n\n/**\n * Launch parameters for a background exec. Mirrors the Go SDK's\n * `ExecBackgroundRequest`. The child is detached at launch and survives\n * client disconnect; manage it via `vm.bg.list/info/logs/kill/wait/remove`.\n *\n * `command` + `args` is the always-correct deterministic form (matches the\n * `--cmd` / `--arg` CLI flags). For `$VAR` expansion or shell operators set\n * `shell` to a shell path (e.g. `/bin/bash`) and pass the script as\n * `command`; the agent runs `<shell> -lc \"<command>\"` in that case.\n */\nexport interface BgExecRequest {\n command: string;\n args?: string[];\n env?: string[];\n uid?: number;\n gid?: number;\n cwd?: string;\n /**\n * Empty (default): direct exec. Set to a shell path (e.g. `/bin/bash`) for\n * `$VAR` expansion, globs, and shell operators. With a shell, bash auto-\n * `exec`s the last simple command in `-c` scripts so the daemon is the\n * tracked PID for typical cases. Multi-statement scripts that need clean\n * tree should write `exec` themselves.\n */\n shell?: string;\n /** Per-process ring buffer cap in bytes. Zero means server default (1 MiB). */\n ringBytes?: number;\n}\n\n/** Returned by `vm.bg.exec` on success. */\nexport interface BgExecResponse {\n execId: string;\n pid: number;\n startedAt: string;\n ringBytes: number;\n}\n\n/** Status of one background exec — returned by `vm.bg.list` and `vm.bg.info`. */\nexport interface BgExecInfo {\n execId: string;\n pid: number;\n command: string;\n args?: string[];\n cwd?: string;\n uid?: number;\n startedAt: string;\n running: boolean;\n /** Present once the child has exited. */\n exitCode?: number;\n signal?: string;\n endedAt?: string;\n bytesWritten: number;\n bytesDropped: number;\n /** Next frame id the agent will emit on this exec's log ring. */\n nextId: number;\n ringBytes: number;\n}\n\nexport interface BgKillOptions {\n /** Signal name (e.g. `TERM`, `KILL`, `HUP`). Default: `TERM`. */\n signal?: string;\n /** Grace period before the agent escalates to `SIGKILL`. Server default 5000ms. */\n graceMs?: number;\n}\n\nexport interface BgKillResponse {\n execId: string;\n pid: number;\n running: boolean;\n signalSent: string;\n}\n\nexport interface BgWaitExitResponse {\n execId: string;\n running: boolean;\n exitCode?: number;\n signal?: string;\n endedAt?: string;\n timedOut: boolean;\n}\n\nexport interface BgDeleteResponse {\n execId: string;\n reaped: boolean;\n}\n\nexport interface BgLogOptions {\n /** Stream live frames after replaying ring contents. */\n follow?: boolean;\n /** Start cursor at frame N. Lower than the live cursor replays history; higher waits (when `follow`). */\n fromId?: number;\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 network?: WireCreateVMNetworkPolicy;\n}\n\nexport interface WireCreateVMNetworkPolicy {\n allow?: string[];\n drop?: 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 if (r.network !== undefined) o.network = r.network;\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 BgDeleteResponse,\n type BgExecInfo,\n type BgExecRequest,\n type BgExecResponse,\n type BgKillOptions,\n type BgKillResponse,\n type BgLogOptions,\n type BgWaitExitResponse,\n type ExecFrame,\n type ExecRequest,\n type ExecStdio,\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 readonly bg: VMBg;\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 this.bg = new VMBg(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 raw of this.transport.requestNDJSON<WireExecFrame>('POST', path, body)) {\n const frame = normalizeExecFrame(raw);\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\n/**\n * WireExecFrame mirrors the JSON shape the server emits on the NDJSON exec\n * stream. Field names are snake_case to match the wire; `normalizeExecFrame`\n * maps them to the camelCase `ExecFrame` public type.\n */\ninterface WireExecFrame {\n timestamp?: string;\n type?: string;\n pid?: number;\n encoding?: ExecStdio;\n data?: string;\n started_at?: string;\n ended_at?: string;\n signal?: string;\n stdout?: string;\n stderr?: string;\n exit_code?: number;\n error?: string;\n}\n\nfunction normalizeExecFrame(raw: WireExecFrame): ExecFrame {\n const frame: ExecFrame = {};\n if (raw.timestamp !== undefined) frame.timestamp = raw.timestamp;\n if (raw.type !== undefined) frame.type = raw.type;\n if (raw.pid !== undefined) frame.pid = raw.pid;\n if (raw.encoding !== undefined) frame.encoding = raw.encoding;\n if (raw.data !== undefined) frame.data = raw.data;\n if (raw.started_at !== undefined) frame.startedAt = raw.started_at;\n if (raw.ended_at !== undefined) frame.endedAt = raw.ended_at;\n if (raw.signal !== undefined) frame.signal = raw.signal;\n if (raw.stdout !== undefined) frame.stdout = raw.stdout;\n if (raw.stderr !== undefined) frame.stderr = raw.stderr;\n if (raw.exit_code !== undefined) frame.exitCode = raw.exit_code;\n if (raw.error !== undefined) frame.error = raw.error;\n return frame;\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// ---------------------------------------------------------------------------\n// Background exec — `vm.bg.*`\n// ---------------------------------------------------------------------------\n\n/**\n * Per-VM background-exec operations. A bg exec is detached at launch (its own\n * session leader), survives client disconnect, and writes stdout/stderr into a\n * per-process ring buffer on the agent. Manage one with the `execId` returned\n * from `exec()` plus `info`, `logs`, `kill`, `wait`, `remove`. The ring stays\n * allocated after the child exits — call `remove()` to free its budget.\n */\nexport class VMBg {\n constructor(\n private readonly transport: TransportClient,\n private readonly hostname: string,\n ) {}\n\n /**\n * Launch a long-running process. `command` + `args` is the deterministic\n * exec form (no shell). Set `shell: '/bin/bash'` (or similar) to opt in\n * to shell semantics — `$VAR` expansion, globs, `&&`/`||`, etc.\n */\n async exec(req: BgExecRequest): Promise<BgExecResponse> {\n if (!req.command) throw new Error('vm.bg.exec: command is required');\n const q = new URLSearchParams();\n q.set('background', 'true');\n 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 // Serialize uid/gid whenever the caller provided them — including 0.\n // Omitting 0 would collide with the agent's \"auto-detect non-root\" path\n // (see resolveUIDGID in slicer-agent), silently demoting requests for\n // root to ubuntu. Leave the field off only when the caller didn't set it.\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.shell) q.set('shell', req.shell);\n if (req.cwd) q.set('cwd', req.cwd);\n if (req.ringBytes !== undefined && req.ringBytes > 0) {\n q.set('ring_bytes', String(req.ringBytes));\n }\n q.set('stdio', 'base64');\n const path = `/vm/${encodeURIComponent(this.hostname)}/exec?${q.toString()}`;\n const wire = await this.transport.request<WireBgExecResponse>('POST', path);\n return bgExecResponseFromWire(wire);\n }\n\n /** All background execs the agent currently tracks (running + exited-not-reaped). */\n async list(): Promise<BgExecInfo[]> {\n const wire = await this.transport.request<WireBgExecInfo[]>(\n 'GET',\n `/vm/${encodeURIComponent(this.hostname)}/exec`,\n );\n return (wire ?? []).map(bgExecInfoFromWire);\n }\n\n /** Latest status snapshot for one bg exec. Throws 404 if reaped or never existed. */\n async info(execId: string): Promise<BgExecInfo> {\n const wire = await this.transport.request<WireBgExecInfo>(\n 'GET',\n `/vm/${encodeURIComponent(this.hostname)}/exec/${encodeURIComponent(execId)}`,\n );\n return bgExecInfoFromWire(wire);\n }\n\n /**\n * NDJSON log stream. Yields one frame per log line — `started`, `stdout`,\n * `stderr`, `exit`, plus optional `gap` frames if the ring evicted history\n * before the requested cursor. Frames carry `data` base64-encoded; the SDK\n * also populates `dataBytes` / `stdoutBytes` / `stderrBytes` Buffers.\n *\n * `follow: false` (default) replays from the cursor and ends when the ring\n * is drained. `follow: true` keeps the stream open until the child exits or\n * the caller breaks out.\n */\n async *logs(execId: string, opts: BgLogOptions = {}): AsyncGenerator<ExecFrame, void, void> {\n const q = new URLSearchParams();\n if (opts.follow) q.set('follow', 'true');\n if (opts.fromId !== undefined && opts.fromId > 0) q.set('from_id', String(opts.fromId));\n const path =\n `/vm/${encodeURIComponent(this.hostname)}/exec/${encodeURIComponent(execId)}/logs` +\n (q.toString() ? `?${q.toString()}` : '');\n for await (const raw of this.transport.requestNDJSON<WireExecFrame>('GET', path)) {\n const frame = normalizeExecFrame(raw);\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 * Signal a running bg exec. Default: SIGTERM with a 5 s grace period before\n * the agent escalates to SIGKILL. No-op (running=false) if the child has\n * already exited.\n */\n async kill(execId: string, opts: BgKillOptions = {}): Promise<BgKillResponse> {\n const body: Record<string, unknown> = {};\n if (opts.signal) body.signal = opts.signal;\n if (opts.graceMs !== undefined) body.grace_ms = opts.graceMs;\n const wire = await this.transport.request<WireBgKillResponse>(\n 'POST',\n `/vm/${encodeURIComponent(this.hostname)}/exec/${encodeURIComponent(execId)}/kill`,\n body,\n );\n return bgKillResponseFromWire(wire);\n }\n\n /**\n * Long-poll until the child exits or `timeoutSec` elapses. Returns\n * `timedOut: true` if the deadline hit. Server default for `timeoutSec=0`\n * is 30 s.\n */\n async wait(execId: string, timeoutSec = 0): Promise<BgWaitExitResponse> {\n const q = new URLSearchParams();\n if (timeoutSec > 0) q.set('timeout', String(timeoutSec));\n const path =\n `/vm/${encodeURIComponent(this.hostname)}/exec/${encodeURIComponent(execId)}/wait-exit` +\n (q.toString() ? `?${q.toString()}` : '');\n const wire = await this.transport.request<WireBgWaitExitResponse>('GET', path);\n return bgWaitExitFromWire(wire);\n }\n\n /**\n * Reap a bg exec's ring buffer + registry entry. Does NOT kill a running\n * process — pair with `kill()` for \"stop and clean up\". After remove,\n * info/logs/kill/wait return 410 Gone.\n */\n async remove(execId: string): Promise<BgDeleteResponse> {\n const wire = await this.transport.request<WireBgDeleteResponse>(\n 'DELETE',\n `/vm/${encodeURIComponent(this.hostname)}/exec/${encodeURIComponent(execId)}`,\n );\n return bgDeleteFromWire(wire);\n }\n}\n\n// ----- bg wire mapping -----------------------------------------------------\n\ninterface WireBgExecResponse {\n exec_id: string;\n pid: number;\n started_at: string;\n ring_bytes: number;\n}\ninterface WireBgExecInfo {\n exec_id: string;\n pid: number;\n command: string;\n args?: string[];\n cwd?: string;\n uid?: number;\n started_at: string;\n running: boolean;\n exit_code?: number;\n signal?: string;\n ended_at?: string;\n bytes_written: number;\n bytes_dropped: number;\n next_id: number;\n ring_bytes: number;\n}\ninterface WireBgKillResponse {\n exec_id: string;\n pid: number;\n running: boolean;\n signal_sent: string;\n}\ninterface WireBgWaitExitResponse {\n exec_id: string;\n running: boolean;\n exit_code?: number;\n signal?: string;\n ended_at?: string;\n timed_out: boolean;\n}\ninterface WireBgDeleteResponse {\n exec_id: string;\n reaped: boolean;\n}\n\nfunction bgExecResponseFromWire(w: WireBgExecResponse): BgExecResponse {\n return {\n execId: w.exec_id,\n pid: w.pid,\n startedAt: w.started_at,\n ringBytes: w.ring_bytes,\n };\n}\n\nfunction bgExecInfoFromWire(w: WireBgExecInfo): BgExecInfo {\n const out: BgExecInfo = {\n execId: w.exec_id,\n pid: w.pid,\n command: w.command,\n startedAt: w.started_at,\n running: w.running,\n bytesWritten: w.bytes_written,\n bytesDropped: w.bytes_dropped,\n nextId: w.next_id,\n ringBytes: w.ring_bytes,\n };\n if (w.args !== undefined) out.args = w.args;\n if (w.cwd !== undefined) out.cwd = w.cwd;\n if (w.uid !== undefined) out.uid = w.uid;\n if (w.exit_code !== undefined) out.exitCode = w.exit_code;\n if (w.signal !== undefined) out.signal = w.signal;\n if (w.ended_at !== undefined) out.endedAt = w.ended_at;\n return out;\n}\n\nfunction bgKillResponseFromWire(w: WireBgKillResponse): BgKillResponse {\n return {\n execId: w.exec_id,\n pid: w.pid,\n running: w.running,\n signalSent: w.signal_sent,\n };\n}\n\nfunction bgWaitExitFromWire(w: WireBgWaitExitResponse): BgWaitExitResponse {\n const out: BgWaitExitResponse = {\n execId: w.exec_id,\n running: w.running,\n timedOut: w.timed_out,\n };\n if (w.exit_code !== undefined) out.exitCode = w.exit_code;\n if (w.signal !== undefined) out.signal = w.signal;\n if (w.ended_at !== undefined) out.endedAt = w.ended_at;\n return out;\n}\n\nfunction bgDeleteFromWire(w: WireBgDeleteResponse): BgDeleteResponse {\n return { execId: w.exec_id, reaped: w.reaped };\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 * Slicer egress-proxy admin API.\n *\n * Three resources:\n * - clients: opaque token holders. Each VM (or other consumer) presents\n * the token via HTTPS_PROXY; the proxy resolves it to the client and\n * walks the client's allow rules.\n * - secrets: upstream credentials (bearer or basic). When an allow rule\n * references a secret, the proxy strips the client's Authorization on\n * the inner request and substitutes the secret's value.\n * - allow rules: per-client. host (exact, *.suffix wildcard, or \"*\"),\n * optional method/path filters, optional secret reference, optional\n * TTL, optional `passthrough` (TCP-splice CONNECT, no MITM).\n *\n * Calls go through slicerd's `/proxy/v1/*` broker (the same transport\n * SlicerClient already uses for every other API), so no extra\n * configuration is needed beyond a working SlicerClient.\n *\n * Wire shapes mirror the Go SDK at github.com/slicervm/sdk/proxy.go.\n * Field-name conversion (snake_case ↔ camelCase) is handled in the\n * `*FromWire` / `*ToWire` helpers; user-facing types are camelCase.\n */\n\nimport type { TransportClient } from './transport.js';\n\n/** Credential type for upstream injection. */\nexport type ProxySecretType = 'bearer' | 'basic';\nexport const ProxySecretBearer: ProxySecretType = 'bearer';\n/** For basic auth, the secret value must be in `user:pass` form. */\nexport const ProxySecretBasic: ProxySecretType = 'basic';\n\n/** A registered proxy client. Tokens are never returned by list/get. */\nexport interface ProxyClient {\n name: string;\n /** RFC 3339 timestamp. */\n createdAt: string;\n}\n\n/**\n * Returned only by `clients.create`. The token is shown once and never\n * surfaced by any other endpoint — store it now or rotate the client.\n */\nexport interface ProxyClientCreated {\n name: string;\n token: string;\n createdAt: string;\n}\n\n/**\n * Optional input to `clients.create`. Pass `token` to bring your own\n * literal (handy for demos and reproducible tests); omit for a\n * server-minted high-entropy `spt_…` token (recommended).\n */\nexport interface CreateProxyClientOptions {\n token?: string;\n}\n\n/** A registered upstream credential. `value` is never returned. */\nexport interface ProxySecret {\n name: string;\n host: string;\n /** Defaults to `bearer` when empty in older state files. */\n type?: ProxySecretType;\n createdAt: string;\n}\n\nexport interface CreateProxySecretRequest {\n name: string;\n host: string;\n /** Defaults to `bearer` when omitted. */\n type?: ProxySecretType;\n /**\n * Plaintext credential. For `bearer`, the raw token. For `basic`,\n * must be in `user:pass` form (the proxy base64-encodes it on the\n * inner request).\n */\n value: string;\n}\n\n/**\n * Per-client allow entry. First-match-wins by declaration order.\n *\n * - When `secret` is set, the proxy strips the client's Authorization\n * on the inner request and substitutes the secret's value.\n * - `methods`/`paths` are optional filters (any-of within each list,\n * all-of across lists). Empty list = any.\n * - When `passthrough` is true, the proxy splices TCP both ways at\n * CONNECT without terminating TLS. Cert-pinned clients work\n * unchanged. Mutually exclusive with `secret`, `methods`, `paths`;\n * the admin API rejects rules that combine them.\n */\nexport interface ProxyAllowRule {\n host: string;\n secret?: string;\n methods?: string[];\n paths?: string[];\n /** RFC 3339 timestamp; absent / zero-value when no expiry. */\n expires?: string;\n passthrough?: boolean;\n}\n\n/** Input to `allows.add`. */\nexport interface AddProxyAllowRequest {\n client: string;\n host: string;\n secret?: string;\n methods?: string[];\n paths?: string[];\n /**\n * Time-to-live in seconds. 0 / omitted = never expires. Resolved to\n * an absolute `expires` timestamp on the returned rule.\n */\n ttlSeconds?: number;\n /** See ProxyAllowRule.passthrough. Mutually exclusive with secret/methods/paths. */\n passthrough?: boolean;\n}\n\n/**\n * Input to `allows.removeByTuple`. Mirrors the create payload minus\n * `ttlSeconds` (TTL is mutable lifetime, not part of identity). The\n * proxy matches the rule by (host, methods, paths, passthrough) and\n * removes the single matching rule. Use when several rules share a\n * host and you want surgical removal of one — pass exactly the same\n * fields you used at create time.\n */\nexport interface RemoveProxyAllowByTupleRequest {\n client: string;\n host: string;\n secret?: string;\n methods?: string[];\n paths?: string[];\n passthrough?: boolean;\n}\n\n// ───── wire types (snake_case JSON shapes from the daemon) ─────\n\ninterface WireProxyClient {\n name: string;\n created_at: string;\n}\n\ninterface WireProxyClientCreated {\n name: string;\n token: string;\n created_at: string;\n}\n\ninterface WireProxySecret {\n name: string;\n host: string;\n type?: string;\n created_at: string;\n}\n\ninterface WireProxyAllowRule {\n host: string;\n secret?: string;\n methods?: string[];\n paths?: string[];\n expires?: string;\n passthrough?: boolean;\n}\n\nfunction clientFromWire(w: WireProxyClient): ProxyClient {\n return { name: w.name, createdAt: w.created_at };\n}\n\nfunction clientCreatedFromWire(w: WireProxyClientCreated): ProxyClientCreated {\n return { name: w.name, token: w.token, createdAt: w.created_at };\n}\n\nfunction secretFromWire(w: WireProxySecret): ProxySecret {\n const out: ProxySecret = { name: w.name, host: w.host, createdAt: w.created_at };\n if (w.type) out.type = w.type as ProxySecretType;\n return out;\n}\n\nfunction ruleFromWire(w: WireProxyAllowRule): ProxyAllowRule {\n const out: ProxyAllowRule = { host: w.host };\n if (w.secret) out.secret = w.secret;\n if (w.methods && w.methods.length > 0) out.methods = w.methods;\n if (w.paths && w.paths.length > 0) out.paths = w.paths;\n if (w.expires && w.expires !== '0001-01-01T00:00:00Z') out.expires = w.expires;\n if (w.passthrough) out.passthrough = w.passthrough;\n return out;\n}\n\n// ───── API class ─────\n\nexport class ProxyAPI {\n readonly clients: ProxyClientsAPI;\n readonly secrets: ProxySecretsAPI;\n readonly allows: ProxyAllowsAPI;\n\n constructor(private readonly transport: TransportClient) {\n this.clients = new ProxyClientsAPI(transport);\n this.secrets = new ProxySecretsAPI(transport);\n this.allows = new ProxyAllowsAPI(transport);\n }\n}\n\nexport class ProxyClientsAPI {\n constructor(private readonly transport: TransportClient) {}\n\n /** Mint a new proxy client. The returned token is shown once. */\n async create(name: string, opts: CreateProxyClientOptions = {}): Promise<ProxyClientCreated> {\n const body: Record<string, unknown> = { name };\n if (opts.token) body.token = opts.token;\n const wire = await this.transport.request<WireProxyClientCreated>(\n 'POST',\n '/proxy/v1/clients',\n body,\n );\n return clientCreatedFromWire(wire);\n }\n\n async list(): Promise<ProxyClient[]> {\n const wire = await this.transport.request<WireProxyClient[]>('GET', '/proxy/v1/clients');\n return (wire ?? []).map(clientFromWire);\n }\n\n /**\n * Revoke the token, drop every allow rule the client owned, and\n * remove the client.\n */\n async delete(name: string): Promise<void> {\n await this.transport.request('DELETE', `/proxy/v1/clients/${encodeURIComponent(name)}`);\n }\n\n /** List a client's allow rules in declaration order (first-match-wins). */\n async rules(name: string): Promise<ProxyAllowRule[]> {\n const wire = await this.transport.request<WireProxyAllowRule[]>(\n 'GET',\n `/proxy/v1/clients/${encodeURIComponent(name)}`,\n );\n return (wire ?? []).map(ruleFromWire);\n }\n}\n\nexport class ProxySecretsAPI {\n constructor(private readonly transport: TransportClient) {}\n\n async create(req: CreateProxySecretRequest): Promise<void> {\n const body: Record<string, unknown> = {\n name: req.name,\n host: req.host,\n value: req.value,\n };\n if (req.type) body.type = req.type;\n await this.transport.request('POST', '/proxy/v1/secrets', body);\n }\n\n async list(): Promise<ProxySecret[]> {\n const wire = await this.transport.request<WireProxySecret[]>('GET', '/proxy/v1/secrets');\n return (wire ?? []).map(secretFromWire);\n }\n\n /**\n * Remove a secret. Allow rules that reference it stop matching until\n * the secret is recreated or the rule is rewritten.\n */\n async delete(name: string): Promise<void> {\n await this.transport.request('DELETE', `/proxy/v1/secrets/${encodeURIComponent(name)}`);\n }\n}\n\nexport class ProxyAllowsAPI {\n constructor(private readonly transport: TransportClient) {}\n\n /** Add an allow rule. Returns the resolved rule with absolute `expires`. */\n async add(req: AddProxyAllowRequest): Promise<ProxyAllowRule> {\n const body: Record<string, unknown> = {\n client: req.client,\n host: req.host,\n };\n if (req.secret) body.secret = req.secret;\n if (req.methods && req.methods.length > 0) body.methods = req.methods;\n if (req.paths && req.paths.length > 0) body.paths = req.paths;\n if (req.ttlSeconds && req.ttlSeconds > 0) body.ttl_seconds = req.ttlSeconds;\n if (req.passthrough) body.passthrough = true;\n const wire = await this.transport.request<WireProxyAllowRule>(\n 'POST',\n '/proxy/v1/allows',\n body,\n );\n return ruleFromWire(wire);\n }\n\n /**\n * Host-bulk revoke: removes **every** rule on the client whose host\n * matches. For surgical removal of one rule among siblings on the\n * same host (e.g. several path-scoped rules on `github.com`), use\n * `removeByTuple` instead.\n */\n async remove(client: string, host: string): Promise<void> {\n await this.transport.request(\n 'DELETE',\n `/proxy/v1/allows/${encodeURIComponent(client)}/${encodeURIComponent(host)}`,\n );\n }\n\n /**\n * Surgical revoke: removes the single rule whose\n * (host, methods, paths, passthrough) tuple matches the request.\n * Pass exactly the same fields you used at create time. Method and\n * host casing are normalised server-side, so `\"GET\"` / `\"get\"` and\n * `\"github.com\"` / `\"GITHUB.COM\"` all match the same stored rule.\n *\n * Returns 404 (surfaced as a SlicerAPIError) when no rule matches.\n */\n async removeByTuple(req: RemoveProxyAllowByTupleRequest): Promise<void> {\n const body: Record<string, unknown> = {\n client: req.client,\n host: req.host,\n };\n if (req.secret) body.secret = req.secret;\n if (req.methods && req.methods.length > 0) body.methods = req.methods;\n if (req.paths && req.paths.length > 0) body.paths = req.paths;\n if (req.passthrough) body.passthrough = true;\n await this.transport.request('POST', '/proxy/v1/allows/revoke', body);\n }\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 { ProxyAPI } from './proxy.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 readonly proxy: ProxyAPI;\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 this.proxy = new ProxyAPI(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","/**\n * Browser-compatible shell adapter for Slicer VMs.\n *\n * Provides frame encode/decode helpers and a `SlicerShellSession` class that\n * wires a standard browser WebSocket to an xterm.js Terminal instance using\n * the Slicer binary shell protocol.\n *\n * This module intentionally avoids Node-only imports so it can be used in\n * browser bundles.\n */\n\n// --- frame type constants ----------------------------------------------------\n\nexport const FRAME_TYPE_DATA = 0x01;\nexport const FRAME_TYPE_WINDOW_SIZE = 0x02;\nexport const FRAME_TYPE_SHUTDOWN = 0x03;\nexport const FRAME_TYPE_HEARTBEAT = 0x04;\nexport const FRAME_TYPE_SESSION_CLOSE = 0x05;\n\n// --- frame helpers -----------------------------------------------------------\n\nconst HEADER_SIZE = 5;\n\n/** Encode a frame into the 5-byte-header binary protocol. */\nexport function encodeFrame(frameType: number, payload?: Uint8Array): Uint8Array {\n const payloadLen = payload ? payload.byteLength : 0;\n const buf = new Uint8Array(HEADER_SIZE + payloadLen);\n const view = new DataView(buf.buffer);\n view.setUint8(0, frameType);\n view.setUint32(1, payloadLen, false); // big-endian\n if (payload) buf.set(payload, HEADER_SIZE);\n return buf;\n}\n\n/** Parse a binary frame. Returns null if the data is malformed. */\nexport function parseFrame(data: ArrayBuffer): { frameType: number; payload: Uint8Array } | null {\n if (data.byteLength < HEADER_SIZE) return null;\n const view = new DataView(data);\n const frameType = view.getUint8(0);\n const payloadLen = view.getUint32(1, false); // big-endian\n if (data.byteLength < HEADER_SIZE + payloadLen) return null;\n const payload = new Uint8Array(data, HEADER_SIZE, payloadLen);\n return { frameType, payload };\n}\n\n// --- types -------------------------------------------------------------------\n\nexport interface ShellSessionOptions {\n /** WebSocket URL for the shell endpoint (ws:// or wss://). */\n url: string;\n /** Heartbeat interval in ms. Default 30000. */\n heartbeatIntervalMs?: number;\n /** Called when connection state changes. */\n onStateChange?: (state: 'connecting' | 'connected' | 'disconnected') => void;\n /** Called on error. */\n onError?: (error: string) => void;\n}\n\n/**\n * Minimal xterm.js Terminal interface — only the methods SlicerShellSession\n * actually calls. Avoids requiring @xterm/xterm as a dependency.\n */\nexport interface XTermLike {\n onData: (cb: (data: string) => void) => { dispose: () => void };\n write: (data: string) => void;\n reset: () => void;\n cols: number;\n rows: number;\n}\n\n// --- minimal browser type stubs ----------------------------------------------\n// The SDK targets Node (lib: ES2022, no DOM). Declare the subset of browser\n// APIs the class actually uses so this file compiles without adding \"DOM\" to\n// the project-wide tsconfig.\n\ninterface BrowserWebSocket {\n binaryType: string;\n readyState: number;\n onopen: ((ev: unknown) => void) | null;\n onmessage: ((ev: { data: unknown }) => void) | null;\n onclose: ((ev: unknown) => void) | null;\n onerror: ((ev: unknown) => void) | null;\n send(data: ArrayBufferLike | Uint8Array | string): void;\n close(code?: number, reason?: string): void;\n}\n\ninterface BrowserWebSocketConstructor {\n new (url: string): BrowserWebSocket;\n readonly OPEN: number;\n}\n\ndeclare const WebSocket: BrowserWebSocketConstructor;\n\n// --- class -------------------------------------------------------------------\n\nconst encoder = new TextEncoder();\nconst decoder = new TextDecoder();\n\nexport class SlicerShellSession {\n private ws: BrowserWebSocket | null = null;\n private heartbeatTimer: ReturnType<typeof setInterval> | null = null;\n private dataDisposable: { dispose: () => void } | null = null;\n\n constructor(\n private readonly terminal: XTermLike,\n private readonly options: ShellSessionOptions,\n ) {}\n\n /** True when the WebSocket is open and relaying. */\n get connected(): boolean {\n return this.ws !== null && this.ws.readyState === WebSocket.OPEN;\n }\n\n /** Open the WebSocket and begin relaying. */\n connect(): void {\n if (this.ws) return;\n this.options.onStateChange?.('connecting');\n\n const ws = new WebSocket(this.options.url);\n ws.binaryType = 'arraybuffer';\n this.ws = ws;\n\n ws.onopen = () => {\n this.options.onStateChange?.('connected');\n this.terminal.reset();\n this.sendResize(this.terminal.cols, this.terminal.rows);\n this.startHeartbeat();\n };\n\n ws.onmessage = (ev: { data: unknown }) => {\n if (!(ev.data instanceof ArrayBuffer)) return;\n const frame = parseFrame(ev.data);\n if (!frame) return;\n\n switch (frame.frameType) {\n case FRAME_TYPE_DATA:\n this.terminal.write(decoder.decode(frame.payload));\n break;\n case FRAME_TYPE_SHUTDOWN:\n case FRAME_TYPE_SESSION_CLOSE:\n this.teardown();\n break;\n }\n };\n\n ws.onclose = () => {\n this.teardown();\n };\n\n ws.onerror = () => {\n this.options.onError?.('WebSocket error');\n this.teardown();\n };\n\n this.dataDisposable = this.terminal.onData((data: string) => {\n if (!this.connected) return;\n const payload = encoder.encode(data);\n this.ws!.send(encodeFrame(FRAME_TYPE_DATA, payload));\n });\n }\n\n /** Send a graceful shutdown frame and close. */\n disconnect(): void {\n if (this.ws) {\n try {\n this.ws.send(encodeFrame(FRAME_TYPE_SHUTDOWN));\n } catch {\n /* ws may already be closed */\n }\n }\n this.teardown();\n }\n\n /** Send a window resize. Call this from FitAddon's onResize or a ResizeObserver. */\n resize(cols: number, rows: number): void {\n if (!this.connected) return;\n this.sendResize(cols, rows);\n }\n\n // --- internals -------------------------------------------------------------\n\n private sendResize(cols: number, rows: number): void {\n const payload = new Uint8Array(8);\n const view = new DataView(payload.buffer);\n view.setUint32(0, cols, false); // big-endian\n view.setUint32(4, rows, false);\n this.ws!.send(encodeFrame(FRAME_TYPE_WINDOW_SIZE, payload));\n }\n\n private startHeartbeat(): void {\n this.stopHeartbeat();\n const intervalMs = this.options.heartbeatIntervalMs ?? 30_000;\n this.heartbeatTimer = setInterval(() => {\n if (!this.connected) return;\n this.ws!.send(encodeFrame(FRAME_TYPE_HEARTBEAT));\n }, intervalMs);\n }\n\n private stopHeartbeat(): void {\n if (this.heartbeatTimer !== null) {\n clearInterval(this.heartbeatTimer);\n this.heartbeatTimer = null;\n }\n }\n\n private teardown(): void {\n this.stopHeartbeat();\n if (this.dataDisposable) {\n this.dataDisposable.dispose();\n this.dataDisposable = null;\n }\n if (this.ws) {\n const ws = this.ws;\n this.ws = null;\n ws.onopen = null;\n ws.onmessage = null;\n ws.onclose = null;\n ws.onerror = null;\n try {\n ws.close();\n } catch {\n /* ignore */\n }\n }\n this.options.onStateChange?.('disconnected');\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/proxy.ts","../src/client.ts","../src/shell.ts"],"names":["path","os","URL","https","http","createNetServer","ws","createWebSocketStream","fs","WebSocket","net","validateCommitId","secretFromWire"],"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\n/**\n * Per-launch network policy override for isolated host groups.\n * Omitted lists inherit the host group's policy. Empty lists intentionally\n * clear that list for this VM launch.\n */\nexport interface CreateVMNetworkPolicy {\n allow?: string[];\n drop?: string[];\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 network?: CreateVMNetworkPolicy;\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 userdataExitCode?: number;\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\n// ----- background exec --------------------------------------------------\n\n/**\n * Launch parameters for a background exec. Mirrors the Go SDK's\n * `ExecBackgroundRequest`. The child is detached at launch and survives\n * client disconnect; manage it via `vm.bg.list/info/logs/kill/wait/remove`.\n *\n * `command` + `args` is the always-correct deterministic form (matches the\n * `--cmd` / `--arg` CLI flags). For `$VAR` expansion or shell operators set\n * `shell` to a shell path (e.g. `/bin/bash`) and pass the script as\n * `command`; the agent runs `<shell> -lc \"<command>\"` in that case.\n */\nexport interface BgExecRequest {\n command: string;\n args?: string[];\n env?: string[];\n uid?: number;\n gid?: number;\n cwd?: string;\n /**\n * Empty (default): direct exec. Set to a shell path (e.g. `/bin/bash`) for\n * `$VAR` expansion, globs, and shell operators. With a shell, bash auto-\n * `exec`s the last simple command in `-c` scripts so the daemon is the\n * tracked PID for typical cases. Multi-statement scripts that need clean\n * tree should write `exec` themselves.\n */\n shell?: string;\n /** Per-process ring buffer cap in bytes. Zero means server default (1 MiB). */\n ringBytes?: number;\n}\n\n/** Returned by `vm.bg.exec` on success. */\nexport interface BgExecResponse {\n execId: string;\n pid: number;\n startedAt: string;\n ringBytes: number;\n}\n\n/** Status of one background exec — returned by `vm.bg.list` and `vm.bg.info`. */\nexport interface BgExecInfo {\n execId: string;\n pid: number;\n command: string;\n args?: string[];\n cwd?: string;\n uid?: number;\n startedAt: string;\n running: boolean;\n /** Present once the child has exited. */\n exitCode?: number;\n signal?: string;\n endedAt?: string;\n bytesWritten: number;\n bytesDropped: number;\n /** Next frame id the agent will emit on this exec's log ring. */\n nextId: number;\n ringBytes: number;\n}\n\nexport interface BgKillOptions {\n /** Signal name (e.g. `TERM`, `KILL`, `HUP`). Default: `TERM`. */\n signal?: string;\n /** Grace period before the agent escalates to `SIGKILL`. Server default 5000ms. */\n graceMs?: number;\n}\n\nexport interface BgKillResponse {\n execId: string;\n pid: number;\n running: boolean;\n signalSent: string;\n}\n\nexport interface BgWaitExitResponse {\n execId: string;\n running: boolean;\n exitCode?: number;\n signal?: string;\n endedAt?: string;\n timedOut: boolean;\n}\n\nexport interface BgDeleteResponse {\n execId: string;\n reaped: boolean;\n}\n\nexport interface BgLogOptions {\n /** Stream live frames after replaying ring contents. */\n follow?: boolean;\n /** Start cursor at frame N. Lower than the live cursor replays history; higher waits (when `follow`). */\n fromId?: number;\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 VMCommitOptions {\n tags?: string[];\n labels?: Record<string, string>;\n cacheKey?: string;\n}\n\nexport interface VMCommitResponse {\n hostname: string;\n commitId: string;\n status: string;\n parentStatus?: string;\n mode: string;\n tags?: string[];\n labels?: Record<string, string>;\n cacheKey?: string;\n}\n\nexport interface VMCommitListOptions {\n tags?: string[];\n cacheKey?: string;\n source?: string;\n mode?: string;\n}\n\nexport interface VMCommitInfo {\n commitId: string;\n sourceHostname: string;\n sourceHostGroup: string;\n createdAt: string;\n mode: string;\n tags?: string[];\n labels?: Record<string, string>;\n cacheKey?: string;\n}\n\nexport interface VMCommitDeleteResponse {\n commitId: string;\n status: string;\n}\n\n/** Isolated-network policy override for a forked VM. */\nexport interface VMForkNetworkPolicy {\n /** Omit to inherit; pass an empty array to clear the allow list. */\n allow?: string[];\n /** Omit to inherit; pass an empty array to clear the drop list. */\n drop?: string[];\n}\n\nexport interface VMForkOptions {\n /** Agent-readiness timeout in seconds. Forks always wait for the child agent. */\n waitTimeoutSec?: number;\n network?: VMForkNetworkPolicy;\n tags?: string[];\n}\n\nexport interface VMForkResponse {\n hostname: string;\n sourceHostname: string;\n commitId?: string;\n status: string;\n parentStatus?: string;\n childStatus?: string;\n mode: string;\n}\n\nexport interface VMNetworkPolicy {\n allow: string[];\n drop: string[];\n}\n\nexport interface VMNetworkDescription {\n mode?: string;\n policySource?: string;\n hostGroup: VMNetworkPolicy;\n override?: CreateVMNetworkPolicy;\n effective: VMNetworkPolicy;\n}\n\nexport interface VMDescription {\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 storage?: string;\n image?: string;\n commitId?: string;\n parentCommitId?: string;\n network: VMNetworkDescription;\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 VMCommitDeleteResponse,\n VMCommitInfo,\n VMCommitResponse,\n VMDescription,\n VMForkResponse,\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 network?: WireCreateVMNetworkPolicy;\n}\n\nexport interface WireCreateVMNetworkPolicy {\n allow?: string[];\n drop?: 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 userdata_exit_code?: number;\n}\n\nexport interface WireVMCommitResponse {\n hostname: string;\n commit_id: string;\n status: string;\n parent_status?: string;\n mode?: string;\n tags?: string[];\n labels?: Record<string, string>;\n cache_key?: string;\n}\n\nexport interface WireVMCommitInfo {\n commit_id: string;\n source_hostname: string;\n source_host_group: string;\n created_at: string;\n mode: string;\n tags?: string[];\n labels?: Record<string, string>;\n cache_key?: string;\n}\n\nexport interface WireVMCommitDeleteResponse {\n commit_id: string;\n status: string;\n}\n\nexport interface WireVMForkResponse {\n hostname: string;\n source_hostname: string;\n commit_id?: string;\n status: string;\n parent_status?: string;\n child_status?: string;\n mode?: string;\n}\n\nexport interface WireVMDescription extends WireVM {\n storage?: string;\n image?: string;\n commit_id?: string;\n parent_commit_id?: string;\n network: {\n mode?: string;\n policy_source?: string;\n host_group: { allow: string[]; drop: string[] };\n override?: WireCreateVMNetworkPolicy;\n effective: { allow: string[]; drop: string[] };\n };\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 if (r.network !== undefined) o.network = r.network;\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 ...(w.userdata_exit_code !== undefined && { userdataExitCode: w.userdata_exit_code }),\n };\n}\n\nexport function vmCommitFromWire(w: WireVMCommitResponse): VMCommitResponse {\n return {\n hostname: w.hostname,\n commitId: w.commit_id,\n status: w.status,\n ...(w.parent_status !== undefined && { parentStatus: w.parent_status }),\n mode: w.mode ?? '',\n ...(w.tags !== undefined && { tags: w.tags }),\n ...(w.labels !== undefined && { labels: w.labels }),\n ...(w.cache_key !== undefined && { cacheKey: w.cache_key }),\n };\n}\n\nexport function vmCommitInfoFromWire(w: WireVMCommitInfo): VMCommitInfo {\n return {\n commitId: w.commit_id,\n sourceHostname: w.source_hostname,\n sourceHostGroup: w.source_host_group,\n createdAt: w.created_at,\n mode: w.mode,\n ...(w.tags !== undefined && { tags: w.tags }),\n ...(w.labels !== undefined && { labels: w.labels }),\n ...(w.cache_key !== undefined && { cacheKey: w.cache_key }),\n };\n}\n\nexport function vmCommitDeleteFromWire(w: WireVMCommitDeleteResponse): VMCommitDeleteResponse {\n return { commitId: w.commit_id, status: w.status };\n}\n\nexport function vmForkFromWire(w: WireVMForkResponse): VMForkResponse {\n return {\n hostname: w.hostname,\n sourceHostname: w.source_hostname,\n ...(w.commit_id !== undefined && { commitId: w.commit_id }),\n status: w.status,\n ...(w.parent_status !== undefined && { parentStatus: w.parent_status }),\n ...(w.child_status !== undefined && { childStatus: w.child_status }),\n mode: w.mode ?? '',\n };\n}\n\nexport function vmDescriptionFromWire(w: WireVMDescription): VMDescription {\n return {\n hostname: w.hostname,\n ...(w.hostgroup !== undefined && { hostGroup: w.hostgroup }),\n ...(w.ip !== undefined && { ip: w.ip }),\n ...(w.ram_bytes !== undefined && { ramBytes: w.ram_bytes }),\n ...(w.cpus !== undefined && { cpus: w.cpus }),\n ...(w.created_at !== undefined && { createdAt: w.created_at }),\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 ...(w.storage !== undefined && { storage: w.storage }),\n ...(w.image !== undefined && { image: w.image }),\n ...(w.commit_id !== undefined && { commitId: w.commit_id }),\n ...(w.parent_commit_id !== undefined && { parentCommitId: w.parent_commit_id }),\n network: {\n ...(w.network.mode !== undefined && { mode: w.network.mode }),\n ...(w.network.policy_source !== undefined && { policySource: w.network.policy_source }),\n hostGroup: w.network.host_group,\n ...(w.network.override !== undefined && { override: w.network.override }),\n effective: w.network.effective,\n },\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 BgDeleteResponse,\n type BgExecInfo,\n type BgExecRequest,\n type BgExecResponse,\n type BgKillOptions,\n type BgKillResponse,\n type BgLogOptions,\n type BgWaitExitResponse,\n type ExecFrame,\n type ExecRequest,\n type ExecStdio,\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 VMCommitOptions,\n type VMCommitResponse,\n type VMDescription,\n type VMForkOptions,\n type VMForkResponse,\n type VMLogs,\n type WaitOptions,\n} from './types.js';\nimport {\n agentHealthFromWire,\n fsEntryFromWire,\n vmCommitFromWire,\n vmDescriptionFromWire,\n vmForkFromWire,\n type WireAgentHealth,\n type WireFSInfo,\n type WireVMCommitResponse,\n type WireVMDescription,\n type WireVMForkResponse,\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 CommittedVM {\n readonly hostname: string;\n readonly hostGroup: string;\n readonly commitId: string;\n readonly status: string;\n readonly parentStatus?: string;\n readonly mode: VMCommitResponse['mode'];\n readonly tags?: string[];\n readonly labels?: Record<string, string>;\n readonly cacheKey?: string;\n\n constructor(\n private readonly transport: TransportClient,\n hostGroup: string,\n response: VMCommitResponse,\n ) {\n this.hostname = response.hostname;\n this.hostGroup = hostGroup;\n this.commitId = response.commitId;\n this.status = response.status;\n if (response.parentStatus !== undefined) this.parentStatus = response.parentStatus;\n this.mode = response.mode;\n if (response.tags !== undefined) this.tags = response.tags;\n if (response.labels !== undefined) this.labels = response.labels;\n if (response.cacheKey !== undefined) this.cacheKey = response.cacheKey;\n }\n\n async fork(opts: VMForkOptions = {}): Promise<VM> {\n const res = await forkPath(\n this.transport,\n this.commitId,\n opts,\n );\n return new VM(this.transport, {\n hostname: res.hostname,\n hostGroup: this.hostGroup,\n });\n }\n\n async forkRaw(opts: VMForkOptions = {}): Promise<VMForkResponse> {\n return forkPath(\n this.transport,\n this.commitId,\n opts,\n );\n }\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 readonly bg: VMBg;\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 this.bg = new VMBg(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 /** Return configuration, fork lineage, and effective network policy. */\n async describe(): Promise<VMDescription> {\n const wire = await this.transport.request<WireVMDescription>(\n 'GET',\n `/vm/${encodeURIComponent(this.hostname)}`,\n );\n return vmDescriptionFromWire(wire);\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 } catch (err) {\n lastErr = err;\n }\n if (last?.userdataRan) {\n if (last.userdataExitCode !== undefined && last.userdataExitCode !== 0) {\n throw new Error(`userdata failed with exit code ${last.userdataExitCode}`);\n }\n return last;\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 /**\n * Commit a stopped persistent VM disk into an immutable parent.\n */\n async commit(opts: VMCommitOptions = {}): Promise<CommittedVM> {\n const cacheKey = opts.cacheKey?.trim();\n const tags = opts.tags && opts.tags.length > 0 ? opts.tags : undefined;\n const labels =\n opts.labels && Object.keys(opts.labels).length > 0 ? opts.labels : undefined;\n const body =\n tags !== undefined || labels !== undefined || cacheKey\n ? {\n ...(tags !== undefined && { tags }),\n ...(labels !== undefined && { labels }),\n ...(cacheKey && { cache_key: cacheKey }),\n }\n : undefined;\n const wire = await this.transport.request<WireVMCommitResponse>(\n 'POST',\n `/vm/${encodeURIComponent(this.hostname)}/commit`,\n body,\n );\n return new CommittedVM(this.transport, this.hostGroup, vmCommitFromWire(wire));\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 raw of this.transport.requestNDJSON<WireExecFrame>('POST', path, body)) {\n const frame = normalizeExecFrame(raw);\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\n/**\n * WireExecFrame mirrors the JSON shape the server emits on the NDJSON exec\n * stream. Field names are snake_case to match the wire; `normalizeExecFrame`\n * maps them to the camelCase `ExecFrame` public type.\n */\ninterface WireExecFrame {\n timestamp?: string;\n type?: string;\n pid?: number;\n encoding?: ExecStdio;\n data?: string;\n started_at?: string;\n ended_at?: string;\n signal?: string;\n stdout?: string;\n stderr?: string;\n exit_code?: number;\n error?: string;\n}\n\nfunction normalizeExecFrame(raw: WireExecFrame): ExecFrame {\n const frame: ExecFrame = {};\n if (raw.timestamp !== undefined) frame.timestamp = raw.timestamp;\n if (raw.type !== undefined) frame.type = raw.type;\n if (raw.pid !== undefined) frame.pid = raw.pid;\n if (raw.encoding !== undefined) frame.encoding = raw.encoding;\n if (raw.data !== undefined) frame.data = raw.data;\n if (raw.started_at !== undefined) frame.startedAt = raw.started_at;\n if (raw.ended_at !== undefined) frame.endedAt = raw.ended_at;\n if (raw.signal !== undefined) frame.signal = raw.signal;\n if (raw.stdout !== undefined) frame.stdout = raw.stdout;\n if (raw.stderr !== undefined) frame.stderr = raw.stderr;\n if (raw.exit_code !== undefined) frame.exitCode = raw.exit_code;\n if (raw.error !== undefined) frame.error = raw.error;\n return frame;\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\nasync function forkPath(\n transport: TransportClient,\n commitId: string,\n opts: VMForkOptions,\n): Promise<VMForkResponse> {\n const id = validateCommitId(commitId);\n const q = new URLSearchParams();\n q.set('wait', 'agent');\n if (opts.waitTimeoutSec !== undefined && opts.waitTimeoutSec > 0) {\n q.set('timeout', `${opts.waitTimeoutSec}s`);\n }\n const query = q.toString() ? `?${q.toString()}` : '';\n const body =\n opts.network !== undefined || (opts.tags?.length ?? 0) > 0\n ? {\n ...(opts.network !== undefined && { network: opts.network }),\n ...((opts.tags?.length ?? 0) > 0 && { tags: opts.tags }),\n }\n : undefined;\n const wire = await transport.request<WireVMForkResponse>(\n 'POST',\n `/vm/commits/${encodeURIComponent(id)}/fork${query}`,\n body,\n );\n return vmForkFromWire(wire);\n}\n\nfunction validateCommitId(commitId: string): string {\n const value = commitId.trim();\n if (\n !value ||\n value === '.' ||\n value === '..' ||\n value.includes('..') ||\n value.includes('/') ||\n value.includes('\\\\') ||\n value.includes('\\0')\n ) {\n throw new Error(`invalid commit ID ${JSON.stringify(value)}`);\n }\n return value;\n}\n\n// ---------------------------------------------------------------------------\n// Background exec — `vm.bg.*`\n// ---------------------------------------------------------------------------\n\n/**\n * Per-VM background-exec operations. A bg exec is detached at launch (its own\n * session leader), survives client disconnect, and writes stdout/stderr into a\n * per-process ring buffer on the agent. Manage one with the `execId` returned\n * from `exec()` plus `info`, `logs`, `kill`, `wait`, `remove`. The ring stays\n * allocated after the child exits — call `remove()` to free its budget.\n */\nexport class VMBg {\n constructor(\n private readonly transport: TransportClient,\n private readonly hostname: string,\n ) {}\n\n /**\n * Launch a long-running process. `command` + `args` is the deterministic\n * exec form (no shell). Set `shell: '/bin/bash'` (or similar) to opt in\n * to shell semantics — `$VAR` expansion, globs, `&&`/`||`, etc.\n */\n async exec(req: BgExecRequest): Promise<BgExecResponse> {\n if (!req.command) throw new Error('vm.bg.exec: command is required');\n const q = new URLSearchParams();\n q.set('background', 'true');\n 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 // Serialize uid/gid whenever the caller provided them — including 0.\n // Omitting 0 would collide with the agent's \"auto-detect non-root\" path\n // (see resolveUIDGID in slicer-agent), silently demoting requests for\n // root to ubuntu. Leave the field off only when the caller didn't set it.\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.shell) q.set('shell', req.shell);\n if (req.cwd) q.set('cwd', req.cwd);\n if (req.ringBytes !== undefined && req.ringBytes > 0) {\n q.set('ring_bytes', String(req.ringBytes));\n }\n q.set('stdio', 'base64');\n const path = `/vm/${encodeURIComponent(this.hostname)}/exec?${q.toString()}`;\n const wire = await this.transport.request<WireBgExecResponse>('POST', path);\n return bgExecResponseFromWire(wire);\n }\n\n /** All background execs the agent currently tracks (running + exited-not-reaped). */\n async list(): Promise<BgExecInfo[]> {\n const wire = await this.transport.request<WireBgExecInfo[]>(\n 'GET',\n `/vm/${encodeURIComponent(this.hostname)}/exec`,\n );\n return (wire ?? []).map(bgExecInfoFromWire);\n }\n\n /** Latest status snapshot for one bg exec. Throws 404 if reaped or never existed. */\n async info(execId: string): Promise<BgExecInfo> {\n const wire = await this.transport.request<WireBgExecInfo>(\n 'GET',\n `/vm/${encodeURIComponent(this.hostname)}/exec/${encodeURIComponent(execId)}`,\n );\n return bgExecInfoFromWire(wire);\n }\n\n /**\n * NDJSON log stream. Yields one frame per log line — `started`, `stdout`,\n * `stderr`, `exit`, plus optional `gap` frames if the ring evicted history\n * before the requested cursor. Frames carry `data` base64-encoded; the SDK\n * also populates `dataBytes` / `stdoutBytes` / `stderrBytes` Buffers.\n *\n * `follow: false` (default) replays from the cursor and ends when the ring\n * is drained. `follow: true` keeps the stream open until the child exits or\n * the caller breaks out.\n */\n async *logs(execId: string, opts: BgLogOptions = {}): AsyncGenerator<ExecFrame, void, void> {\n const q = new URLSearchParams();\n if (opts.follow) q.set('follow', 'true');\n if (opts.fromId !== undefined && opts.fromId > 0) q.set('from_id', String(opts.fromId));\n const path =\n `/vm/${encodeURIComponent(this.hostname)}/exec/${encodeURIComponent(execId)}/logs` +\n (q.toString() ? `?${q.toString()}` : '');\n for await (const raw of this.transport.requestNDJSON<WireExecFrame>('GET', path)) {\n const frame = normalizeExecFrame(raw);\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 * Signal a running bg exec. Default: SIGTERM with a 5 s grace period before\n * the agent escalates to SIGKILL. No-op (running=false) if the child has\n * already exited.\n */\n async kill(execId: string, opts: BgKillOptions = {}): Promise<BgKillResponse> {\n const body: Record<string, unknown> = {};\n if (opts.signal) body.signal = opts.signal;\n if (opts.graceMs !== undefined) body.grace_ms = opts.graceMs;\n const wire = await this.transport.request<WireBgKillResponse>(\n 'POST',\n `/vm/${encodeURIComponent(this.hostname)}/exec/${encodeURIComponent(execId)}/kill`,\n body,\n );\n return bgKillResponseFromWire(wire);\n }\n\n /**\n * Long-poll until the child exits or `timeoutSec` elapses. Returns\n * `timedOut: true` if the deadline hit. Server default for `timeoutSec=0`\n * is 30 s.\n */\n async wait(execId: string, timeoutSec = 0): Promise<BgWaitExitResponse> {\n const q = new URLSearchParams();\n if (timeoutSec > 0) q.set('timeout', String(timeoutSec));\n const path =\n `/vm/${encodeURIComponent(this.hostname)}/exec/${encodeURIComponent(execId)}/wait-exit` +\n (q.toString() ? `?${q.toString()}` : '');\n const wire = await this.transport.request<WireBgWaitExitResponse>('GET', path);\n return bgWaitExitFromWire(wire);\n }\n\n /**\n * Reap a bg exec's ring buffer + registry entry. Does NOT kill a running\n * process — pair with `kill()` for \"stop and clean up\". After remove,\n * info/logs/kill/wait return 410 Gone.\n */\n async remove(execId: string): Promise<BgDeleteResponse> {\n const wire = await this.transport.request<WireBgDeleteResponse>(\n 'DELETE',\n `/vm/${encodeURIComponent(this.hostname)}/exec/${encodeURIComponent(execId)}`,\n );\n return bgDeleteFromWire(wire);\n }\n}\n\n// ----- bg wire mapping -----------------------------------------------------\n\ninterface WireBgExecResponse {\n exec_id: string;\n pid: number;\n started_at: string;\n ring_bytes: number;\n}\ninterface WireBgExecInfo {\n exec_id: string;\n pid: number;\n command: string;\n args?: string[];\n cwd?: string;\n uid?: number;\n started_at: string;\n running: boolean;\n exit_code?: number;\n signal?: string;\n ended_at?: string;\n bytes_written: number;\n bytes_dropped: number;\n next_id: number;\n ring_bytes: number;\n}\ninterface WireBgKillResponse {\n exec_id: string;\n pid: number;\n running: boolean;\n signal_sent: string;\n}\ninterface WireBgWaitExitResponse {\n exec_id: string;\n running: boolean;\n exit_code?: number;\n signal?: string;\n ended_at?: string;\n timed_out: boolean;\n}\ninterface WireBgDeleteResponse {\n exec_id: string;\n reaped: boolean;\n}\n\nfunction bgExecResponseFromWire(w: WireBgExecResponse): BgExecResponse {\n return {\n execId: w.exec_id,\n pid: w.pid,\n startedAt: w.started_at,\n ringBytes: w.ring_bytes,\n };\n}\n\nfunction bgExecInfoFromWire(w: WireBgExecInfo): BgExecInfo {\n const out: BgExecInfo = {\n execId: w.exec_id,\n pid: w.pid,\n command: w.command,\n startedAt: w.started_at,\n running: w.running,\n bytesWritten: w.bytes_written,\n bytesDropped: w.bytes_dropped,\n nextId: w.next_id,\n ringBytes: w.ring_bytes,\n };\n if (w.args !== undefined) out.args = w.args;\n if (w.cwd !== undefined) out.cwd = w.cwd;\n if (w.uid !== undefined) out.uid = w.uid;\n if (w.exit_code !== undefined) out.exitCode = w.exit_code;\n if (w.signal !== undefined) out.signal = w.signal;\n if (w.ended_at !== undefined) out.endedAt = w.ended_at;\n return out;\n}\n\nfunction bgKillResponseFromWire(w: WireBgKillResponse): BgKillResponse {\n return {\n execId: w.exec_id,\n pid: w.pid,\n running: w.running,\n signalSent: w.signal_sent,\n };\n}\n\nfunction bgWaitExitFromWire(w: WireBgWaitExitResponse): BgWaitExitResponse {\n const out: BgWaitExitResponse = {\n execId: w.exec_id,\n running: w.running,\n timedOut: w.timed_out,\n };\n if (w.exit_code !== undefined) out.exitCode = w.exit_code;\n if (w.signal !== undefined) out.signal = w.signal;\n if (w.ended_at !== undefined) out.endedAt = w.ended_at;\n return out;\n}\n\nfunction bgDeleteFromWire(w: WireBgDeleteResponse): BgDeleteResponse {\n return { execId: w.exec_id, reaped: w.reaped };\n}\n","/**\n * Top-level namespaces on SlicerClient: hostGroups, vms, commits, 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 VMCommitDeleteResponse,\n type VMCommitInfo,\n type VMCommitListOptions,\n type VMForkOptions,\n type VMForkResponse,\n type VMStat,\n} from './types.js';\nimport {\n createVMReqToWire,\n createVMResFromWire,\n hostGroupFromWire,\n secretFromWire,\n vmCommitDeleteFromWire,\n vmCommitInfoFromWire,\n vmForkFromWire,\n vmFromWire,\n vmStatFromWire,\n type WireCreateVMResponse,\n type WireHostGroup,\n type WireSecret,\n type WireVMCommitDeleteResponse,\n type WireVMCommitInfo,\n type WireVMForkResponse,\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 CommitsAPI {\n constructor(private readonly transport: TransportClient) {}\n\n async list(opts: VMCommitListOptions = {}): Promise<VMCommitInfo[]> {\n const qs = new URLSearchParams();\n for (const tag of opts.tags ?? []) {\n const value = tag.trim();\n if (value) qs.append('tag', value);\n }\n const cacheKey = opts.cacheKey?.trim();\n const source = opts.source?.trim();\n const mode = opts.mode?.trim();\n if (cacheKey) qs.set('cache_key', cacheKey);\n if (source) qs.set('source', source);\n if (mode) qs.set('mode', mode);\n const encoded = qs.toString();\n const query = encoded ? `?${encoded}` : '';\n const wire = await this.transport.request<WireVMCommitInfo[]>('GET', `/vm/commits${query}`);\n return (wire ?? []).map(vmCommitInfoFromWire);\n }\n\n async delete(commitId: string): Promise<VMCommitDeleteResponse> {\n const id = validateCommitId(commitId);\n const wire = await this.transport.request<WireVMCommitDeleteResponse>(\n 'DELETE',\n `/vm/commits/${encodeURIComponent(id)}`,\n );\n return vmCommitDeleteFromWire(wire);\n }\n\n async fork(\n commitId: string,\n opts: VMForkOptions = {},\n ): Promise<VMForkResponse> {\n const id = validateCommitId(commitId);\n const qs = new URLSearchParams({ wait: 'agent' });\n if (opts.waitTimeoutSec !== undefined && opts.waitTimeoutSec > 0) {\n qs.set('timeout', `${opts.waitTimeoutSec}s`);\n }\n const body =\n opts.network !== undefined || (opts.tags?.length ?? 0) > 0\n ? {\n ...(opts.network !== undefined && { network: opts.network }),\n ...((opts.tags?.length ?? 0) > 0 && { tags: opts.tags }),\n }\n : undefined;\n const wire = await this.transport.request<WireVMForkResponse>(\n 'POST',\n `/vm/commits/${encodeURIComponent(id)}/fork?${qs.toString()}`,\n body,\n );\n return vmForkFromWire(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\nfunction validateCommitId(commitId: string): string {\n const value = commitId.trim();\n if (\n !value ||\n value === '.' ||\n value === '..' ||\n value.includes('..') ||\n value.includes('/') ||\n value.includes('\\\\') ||\n value.includes('\\0')\n ) {\n throw new Error(`invalid commit ID ${JSON.stringify(value)}`);\n }\n return value;\n}\n","/**\n * Slicer egress-proxy admin API.\n *\n * Three resources:\n * - clients: opaque token holders. Each VM (or other consumer) presents\n * the token via HTTPS_PROXY; the proxy resolves it to the client and\n * walks the client's allow rules.\n * - secrets: upstream credentials (bearer or basic). When an allow rule\n * references a secret, the proxy strips the client's Authorization on\n * the inner request and substitutes the secret's value.\n * - allow rules: per-client. host (exact, *.suffix wildcard, or \"*\"),\n * optional method/path filters, optional secret reference, optional\n * TTL, optional `passthrough` (TCP-splice CONNECT, no MITM).\n *\n * Calls go through slicerd's `/proxy/v1/*` broker (the same transport\n * SlicerClient already uses for every other API), so no extra\n * configuration is needed beyond a working SlicerClient.\n *\n * Wire shapes mirror the Go SDK at github.com/slicervm/sdk/proxy.go.\n * Field-name conversion (snake_case ↔ camelCase) is handled in the\n * `*FromWire` / `*ToWire` helpers; user-facing types are camelCase.\n */\n\nimport type { TransportClient } from './transport.js';\n\n/** Credential type for upstream injection. */\nexport type ProxySecretType = 'bearer' | 'basic' | 'oauth-client-creds';\nexport const ProxySecretBearer: ProxySecretType = 'bearer';\n/** For basic auth, the secret value must be in `user:pass` form. */\nexport const ProxySecretBasic: ProxySecretType = 'basic';\n/** OAuth 2.0 client credentials exchanged and renewed by the proxy host. */\nexport const ProxySecretOAuthClientCredentials: ProxySecretType = 'oauth-client-creds';\n\n/** A registered proxy client. Tokens are never returned by list/get. */\nexport interface ProxyClient {\n name: string;\n /** RFC 3339 timestamp. */\n createdAt: string;\n}\n\n/**\n * Returned only by `clients.create`. The token is shown once and never\n * surfaced by any other endpoint — store it now or rotate the client.\n */\nexport interface ProxyClientCreated {\n name: string;\n token: string;\n createdAt: string;\n}\n\n/**\n * Optional input to `clients.create`. Pass `token` to bring your own\n * literal (handy for demos and reproducible tests); omit for a\n * server-minted high-entropy `spt_…` token (recommended).\n */\nexport interface CreateProxyClientOptions {\n token?: string;\n}\n\n/** A registered upstream credential. `value` is never returned. */\nexport interface ProxySecret {\n name: string;\n host: string;\n /** Defaults to `bearer` when empty in older state files. */\n type?: ProxySecretType;\n createdAt: string;\n}\n\nexport interface CreateProxySecretRequest {\n name: string;\n host: string;\n /** Defaults to `bearer` when omitted. */\n type?: ProxySecretType;\n /**\n * Plaintext credential. For `bearer`, the raw token. For `basic`,\n * must be in `user:pass` form (the proxy base64-encodes it on the\n * inner request). For `oauth-client-creds`, pass top-level JSON containing\n * `token_endpoint`, `client_id`, and `client_secret`; optional `scope` is\n * supported. The proxy obtains, caches, and renews the bearer host-side.\n */\n value: string;\n}\n\n/**\n * Per-client allow entry. First-match-wins by declaration order.\n *\n * - When `secret` is set, the proxy strips the client's Authorization\n * on the inner request and substitutes the secret's value.\n * - `methods`/`paths` are optional filters (any-of within each list,\n * all-of across lists). Empty list = any.\n * - When `passthrough` is true, the proxy splices TCP both ways at\n * CONNECT without terminating TLS. Cert-pinned clients work\n * unchanged. Mutually exclusive with `secret`, `methods`, `paths`;\n * the admin API rejects rules that combine them.\n */\nexport interface ProxyAllowRule {\n host: string;\n secret?: string;\n methods?: string[];\n paths?: string[];\n /** RFC 3339 timestamp; absent / zero-value when no expiry. */\n expires?: string;\n passthrough?: boolean;\n}\n\n/** Input to `allows.add`. */\nexport interface AddProxyAllowRequest {\n client: string;\n host: string;\n secret?: string;\n methods?: string[];\n paths?: string[];\n /**\n * Time-to-live in seconds. 0 / omitted = never expires. Resolved to\n * an absolute `expires` timestamp on the returned rule.\n */\n ttlSeconds?: number;\n /** See ProxyAllowRule.passthrough. Mutually exclusive with secret/methods/paths. */\n passthrough?: boolean;\n}\n\n/**\n * Input to `allows.removeByTuple`. Mirrors the create payload minus\n * `ttlSeconds` (TTL is mutable lifetime, not part of identity). The\n * proxy matches the rule by (host, methods, paths, passthrough) and\n * removes the single matching rule. Use when several rules share a\n * host and you want surgical removal of one — pass exactly the same\n * fields you used at create time.\n */\nexport interface RemoveProxyAllowByTupleRequest {\n client: string;\n host: string;\n secret?: string;\n methods?: string[];\n paths?: string[];\n passthrough?: boolean;\n}\n\n// ───── wire types (snake_case JSON shapes from the daemon) ─────\n\ninterface WireProxyClient {\n name: string;\n created_at: string;\n}\n\ninterface WireProxyClientCreated {\n name: string;\n token: string;\n created_at: string;\n}\n\ninterface WireProxySecret {\n name: string;\n host: string;\n type?: string;\n created_at: string;\n}\n\ninterface WireProxyAllowRule {\n host: string;\n secret?: string;\n methods?: string[];\n paths?: string[];\n expires?: string;\n passthrough?: boolean;\n}\n\nfunction clientFromWire(w: WireProxyClient): ProxyClient {\n return { name: w.name, createdAt: w.created_at };\n}\n\nfunction clientCreatedFromWire(w: WireProxyClientCreated): ProxyClientCreated {\n return { name: w.name, token: w.token, createdAt: w.created_at };\n}\n\nfunction secretFromWire(w: WireProxySecret): ProxySecret {\n const out: ProxySecret = { name: w.name, host: w.host, createdAt: w.created_at };\n if (w.type) out.type = w.type as ProxySecretType;\n return out;\n}\n\nfunction ruleFromWire(w: WireProxyAllowRule): ProxyAllowRule {\n const out: ProxyAllowRule = { host: w.host };\n if (w.secret) out.secret = w.secret;\n if (w.methods && w.methods.length > 0) out.methods = w.methods;\n if (w.paths && w.paths.length > 0) out.paths = w.paths;\n if (w.expires && w.expires !== '0001-01-01T00:00:00Z') out.expires = w.expires;\n if (w.passthrough) out.passthrough = w.passthrough;\n return out;\n}\n\n// ───── API class ─────\n\nexport class ProxyAPI {\n readonly clients: ProxyClientsAPI;\n readonly secrets: ProxySecretsAPI;\n readonly allows: ProxyAllowsAPI;\n\n constructor(private readonly transport: TransportClient) {\n this.clients = new ProxyClientsAPI(transport);\n this.secrets = new ProxySecretsAPI(transport);\n this.allows = new ProxyAllowsAPI(transport);\n }\n}\n\nexport class ProxyClientsAPI {\n constructor(private readonly transport: TransportClient) {}\n\n /** Mint a new proxy client. The returned token is shown once. */\n async create(name: string, opts: CreateProxyClientOptions = {}): Promise<ProxyClientCreated> {\n const body: Record<string, unknown> = { name };\n if (opts.token) body.token = opts.token;\n const wire = await this.transport.request<WireProxyClientCreated>(\n 'POST',\n '/proxy/v1/clients',\n body,\n );\n return clientCreatedFromWire(wire);\n }\n\n async list(): Promise<ProxyClient[]> {\n const wire = await this.transport.request<WireProxyClient[]>('GET', '/proxy/v1/clients');\n return (wire ?? []).map(clientFromWire);\n }\n\n /**\n * Revoke the token, drop every allow rule the client owned, and\n * remove the client.\n */\n async delete(name: string): Promise<void> {\n await this.transport.request('DELETE', `/proxy/v1/clients/${encodeURIComponent(name)}`);\n }\n\n /** List a client's allow rules in declaration order (first-match-wins). */\n async rules(name: string): Promise<ProxyAllowRule[]> {\n const wire = await this.transport.request<WireProxyAllowRule[]>(\n 'GET',\n `/proxy/v1/clients/${encodeURIComponent(name)}`,\n );\n return (wire ?? []).map(ruleFromWire);\n }\n}\n\nexport class ProxySecretsAPI {\n constructor(private readonly transport: TransportClient) {}\n\n async create(req: CreateProxySecretRequest): Promise<void> {\n const body: Record<string, unknown> = {\n name: req.name,\n host: req.host,\n value: req.value,\n };\n if (req.type) body.type = req.type;\n await this.transport.request('POST', '/proxy/v1/secrets', body);\n }\n\n async list(): Promise<ProxySecret[]> {\n const wire = await this.transport.request<WireProxySecret[]>('GET', '/proxy/v1/secrets');\n return (wire ?? []).map(secretFromWire);\n }\n\n /**\n * Remove a secret. Allow rules that reference it stop matching until\n * the secret is recreated or the rule is rewritten.\n */\n async delete(name: string): Promise<void> {\n await this.transport.request('DELETE', `/proxy/v1/secrets/${encodeURIComponent(name)}`);\n }\n}\n\nexport class ProxyAllowsAPI {\n constructor(private readonly transport: TransportClient) {}\n\n /** Add an allow rule. Returns the resolved rule with absolute `expires`. */\n async add(req: AddProxyAllowRequest): Promise<ProxyAllowRule> {\n const body: Record<string, unknown> = {\n client: req.client,\n host: req.host,\n };\n if (req.secret) body.secret = req.secret;\n if (req.methods && req.methods.length > 0) body.methods = req.methods;\n if (req.paths && req.paths.length > 0) body.paths = req.paths;\n if (req.ttlSeconds && req.ttlSeconds > 0) body.ttl_seconds = req.ttlSeconds;\n if (req.passthrough) body.passthrough = true;\n const wire = await this.transport.request<WireProxyAllowRule>(\n 'POST',\n '/proxy/v1/allows',\n body,\n );\n return ruleFromWire(wire);\n }\n\n /**\n * Host-bulk revoke: removes **every** rule on the client whose host\n * matches. For surgical removal of one rule among siblings on the\n * same host (e.g. several path-scoped rules on `github.com`), use\n * `removeByTuple` instead.\n */\n async remove(client: string, host: string): Promise<void> {\n await this.transport.request(\n 'DELETE',\n `/proxy/v1/allows/${encodeURIComponent(client)}/${encodeURIComponent(host)}`,\n );\n }\n\n /**\n * Surgical revoke: removes the single rule whose\n * (host, methods, paths, passthrough) tuple matches the request.\n * Pass exactly the same fields you used at create time. Method and\n * host casing are normalised server-side, so `\"GET\"` / `\"get\"` and\n * `\"github.com\"` / `\"GITHUB.COM\"` all match the same stored rule.\n *\n * Returns 404 (surfaced as a SlicerAPIError) when no rule matches.\n */\n async removeByTuple(req: RemoveProxyAllowByTupleRequest): Promise<void> {\n const body: Record<string, unknown> = {\n client: req.client,\n host: req.host,\n };\n if (req.secret) body.secret = req.secret;\n if (req.methods && req.methods.length > 0) body.methods = req.methods;\n if (req.paths && req.paths.length > 0) body.paths = req.paths;\n if (req.passthrough) body.passthrough = true;\n await this.transport.request('POST', '/proxy/v1/allows/revoke', body);\n }\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.commits.list() / fork(id) / delete(id)\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.commit/describe`, `vm.health/logs`,\n * `vm.waitForAgent/waitForUserdata`, `vm.delete`.\n */\n\nimport { TransportClient, type TransportClientOptions } from './transport.js';\nimport { CommitsAPI, HostGroupsAPI, SecretsAPI, VMsAPI } from './namespaces.js';\nimport { ProxyAPI } from './proxy.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 commits: CommitsAPI;\n readonly secrets: SecretsAPI;\n readonly proxy: ProxyAPI;\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.commits = new CommitsAPI(this.transport);\n this.secrets = new SecretsAPI(this.transport);\n this.proxy = new ProxyAPI(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","/**\n * Browser-compatible shell adapter for Slicer VMs.\n *\n * Provides frame encode/decode helpers and a `SlicerShellSession` class that\n * wires a standard browser WebSocket to an xterm.js Terminal instance using\n * the Slicer binary shell protocol.\n *\n * This module intentionally avoids Node-only imports so it can be used in\n * browser bundles.\n */\n\n// --- frame type constants ----------------------------------------------------\n\nexport const FRAME_TYPE_DATA = 0x01;\nexport const FRAME_TYPE_WINDOW_SIZE = 0x02;\nexport const FRAME_TYPE_SHUTDOWN = 0x03;\nexport const FRAME_TYPE_HEARTBEAT = 0x04;\nexport const FRAME_TYPE_SESSION_CLOSE = 0x05;\n\n// --- frame helpers -----------------------------------------------------------\n\nconst HEADER_SIZE = 5;\n\n/** Encode a frame into the 5-byte-header binary protocol. */\nexport function encodeFrame(frameType: number, payload?: Uint8Array): Uint8Array {\n const payloadLen = payload ? payload.byteLength : 0;\n const buf = new Uint8Array(HEADER_SIZE + payloadLen);\n const view = new DataView(buf.buffer);\n view.setUint8(0, frameType);\n view.setUint32(1, payloadLen, false); // big-endian\n if (payload) buf.set(payload, HEADER_SIZE);\n return buf;\n}\n\n/** Parse a binary frame. Returns null if the data is malformed. */\nexport function parseFrame(data: ArrayBuffer): { frameType: number; payload: Uint8Array } | null {\n if (data.byteLength < HEADER_SIZE) return null;\n const view = new DataView(data);\n const frameType = view.getUint8(0);\n const payloadLen = view.getUint32(1, false); // big-endian\n if (data.byteLength < HEADER_SIZE + payloadLen) return null;\n const payload = new Uint8Array(data, HEADER_SIZE, payloadLen);\n return { frameType, payload };\n}\n\n// --- types -------------------------------------------------------------------\n\nexport interface ShellSessionOptions {\n /** WebSocket URL for the shell endpoint (ws:// or wss://). */\n url: string;\n /** Heartbeat interval in ms. Default 30000. */\n heartbeatIntervalMs?: number;\n /** Called when connection state changes. */\n onStateChange?: (state: 'connecting' | 'connected' | 'disconnected') => void;\n /** Called on error. */\n onError?: (error: string) => void;\n}\n\n/**\n * Minimal xterm.js Terminal interface — only the methods SlicerShellSession\n * actually calls. Avoids requiring @xterm/xterm as a dependency.\n */\nexport interface XTermLike {\n onData: (cb: (data: string) => void) => { dispose: () => void };\n write: (data: string) => void;\n reset: () => void;\n cols: number;\n rows: number;\n}\n\n// --- minimal browser type stubs ----------------------------------------------\n// The SDK targets Node (lib: ES2022, no DOM). Declare the subset of browser\n// APIs the class actually uses so this file compiles without adding \"DOM\" to\n// the project-wide tsconfig.\n\ninterface BrowserWebSocket {\n binaryType: string;\n readyState: number;\n onopen: ((ev: unknown) => void) | null;\n onmessage: ((ev: { data: unknown }) => void) | null;\n onclose: ((ev: unknown) => void) | null;\n onerror: ((ev: unknown) => void) | null;\n send(data: ArrayBufferLike | Uint8Array | string): void;\n close(code?: number, reason?: string): void;\n}\n\ninterface BrowserWebSocketConstructor {\n new (url: string): BrowserWebSocket;\n readonly OPEN: number;\n}\n\ndeclare const WebSocket: BrowserWebSocketConstructor;\n\n// --- class -------------------------------------------------------------------\n\nconst encoder = new TextEncoder();\nconst decoder = new TextDecoder();\n\nexport class SlicerShellSession {\n private ws: BrowserWebSocket | null = null;\n private heartbeatTimer: ReturnType<typeof setInterval> | null = null;\n private dataDisposable: { dispose: () => void } | null = null;\n\n constructor(\n private readonly terminal: XTermLike,\n private readonly options: ShellSessionOptions,\n ) {}\n\n /** True when the WebSocket is open and relaying. */\n get connected(): boolean {\n return this.ws !== null && this.ws.readyState === WebSocket.OPEN;\n }\n\n /** Open the WebSocket and begin relaying. */\n connect(): void {\n if (this.ws) return;\n this.options.onStateChange?.('connecting');\n\n const ws = new WebSocket(this.options.url);\n ws.binaryType = 'arraybuffer';\n this.ws = ws;\n\n ws.onopen = () => {\n this.options.onStateChange?.('connected');\n this.terminal.reset();\n this.sendResize(this.terminal.cols, this.terminal.rows);\n this.startHeartbeat();\n };\n\n ws.onmessage = (ev: { data: unknown }) => {\n if (!(ev.data instanceof ArrayBuffer)) return;\n const frame = parseFrame(ev.data);\n if (!frame) return;\n\n switch (frame.frameType) {\n case FRAME_TYPE_DATA:\n this.terminal.write(decoder.decode(frame.payload));\n break;\n case FRAME_TYPE_SHUTDOWN:\n case FRAME_TYPE_SESSION_CLOSE:\n this.teardown();\n break;\n }\n };\n\n ws.onclose = () => {\n this.teardown();\n };\n\n ws.onerror = () => {\n this.options.onError?.('WebSocket error');\n this.teardown();\n };\n\n this.dataDisposable = this.terminal.onData((data: string) => {\n if (!this.connected) return;\n const payload = encoder.encode(data);\n this.ws!.send(encodeFrame(FRAME_TYPE_DATA, payload));\n });\n }\n\n /** Send a graceful shutdown frame and close. */\n disconnect(): void {\n if (this.ws) {\n try {\n this.ws.send(encodeFrame(FRAME_TYPE_SHUTDOWN));\n } catch {\n /* ws may already be closed */\n }\n }\n this.teardown();\n }\n\n /** Send a window resize. Call this from FitAddon's onResize or a ResizeObserver. */\n resize(cols: number, rows: number): void {\n if (!this.connected) return;\n this.sendResize(cols, rows);\n }\n\n // --- internals -------------------------------------------------------------\n\n private sendResize(cols: number, rows: number): void {\n const payload = new Uint8Array(8);\n const view = new DataView(payload.buffer);\n view.setUint32(0, cols, false); // big-endian\n view.setUint32(4, rows, false);\n this.ws!.send(encodeFrame(FRAME_TYPE_WINDOW_SIZE, payload));\n }\n\n private startHeartbeat(): void {\n this.stopHeartbeat();\n const intervalMs = this.options.heartbeatIntervalMs ?? 30_000;\n this.heartbeatTimer = setInterval(() => {\n if (!this.connected) return;\n this.ws!.send(encodeFrame(FRAME_TYPE_HEARTBEAT));\n }, intervalMs);\n }\n\n private stopHeartbeat(): void {\n if (this.heartbeatTimer !== null) {\n clearInterval(this.heartbeatTimer);\n this.heartbeatTimer = null;\n }\n }\n\n private teardown(): void {\n this.stopHeartbeat();\n if (this.dataDisposable) {\n this.dataDisposable.dispose();\n this.dataDisposable = null;\n }\n if (this.ws) {\n const ws = this.ws;\n this.ws = null;\n ws.onopen = null;\n ws.onmessage = null;\n ws.onclose = null;\n ws.onerror = null;\n try {\n ws.close();\n } catch {\n /* ignore */\n }\n }\n this.options.onStateChange?.('disconnected');\n }\n}\n"]}
|