@slicervm/sdk 0.1.0
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/LICENSE +21 -0
- package/README.md +31 -0
- package/dist/index.cjs +765 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +424 -0
- package/dist/index.d.ts +424 -0
- package/dist/index.js +743 -0
- package/dist/index.js.map +1 -0
- package/package.json +68 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/types.ts","../src/transport.ts","../src/wire.ts","../src/vm.ts","../src/namespaces.ts","../src/client.ts"],"names":["path","os","URL","https","http"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Slicer API types. Wire shapes mirror the Go SDK at github.com/slicervm/sdk\n * (which calls these \"Node\" / \"SlicerNode\"); the TS SDK renames to \"VM\" for\n * clarity, since Slicer's primary primitive is a VM.\n */\n\nexport interface HostGroup {\n name: string;\n count: number;\n ramBytes: number;\n cpus: number;\n arch: string;\n gpuCount?: number;\n}\n\nexport interface VMInfo {\n hostname: string;\n hostGroup?: string;\n ip: string;\n ramBytes?: number;\n cpus?: number;\n createdAt: string;\n arch?: string;\n tags?: string[];\n status?: string;\n persistent?: boolean;\n}\n\nexport interface CreateVMRequest {\n ramBytes?: number;\n cpus?: number;\n gpuCount?: number;\n persistent?: boolean;\n diskImage?: string;\n importUser?: string;\n sshKeys?: string[];\n userdata?: string;\n ip?: string;\n tags?: string[];\n secrets?: string[];\n}\n\nexport interface CreateVMResponse {\n hostname: string;\n hostGroup?: string;\n ip: string;\n createdAt: string;\n arch?: string;\n}\n\nexport interface AgentHealth {\n hostname?: string;\n agentUptime?: number;\n agentVersion?: string;\n systemUptime?: number;\n userdataRan?: boolean;\n}\n\nexport interface VMLogs {\n hostname: string;\n lines: number;\n content: string;\n}\n\nexport interface DeleteResponse {\n message?: string;\n diskRemoved?: string;\n error?: string;\n}\n\n/** Wire encoding of exec stdout/stderr. Defaults to `\"text\"`. */\nexport type ExecStdio = 'text' | 'base64';\nexport const ExecStdioText: ExecStdio = 'text';\nexport const ExecStdioBase64: ExecStdio = 'base64';\n\nexport interface ExecRequest {\n command?: string;\n args?: string[];\n env?: string[];\n uid?: number;\n gid?: number;\n stdin?: Buffer | string;\n shell?: string;\n cwd?: string;\n permissions?: string;\n /**\n * Wire encoding for stdout/stderr.\n * - `\"text\"` (default): frames carry UTF-8 strings. Safe for text output only —\n * arbitrary binary will be mangled by JSON string escaping.\n * - `\"base64\"`: frames carry base64-encoded bytes. Required for binary output\n * (video, compressed archives, raw protocol streams). The SDK decodes\n * automatically — callers get `Buffer` on `execBuffered({ stdio: 'base64' })`\n * and `{stdoutBytes, stderrBytes, dataBytes}` on streamed frames.\n */\n stdio?: ExecStdio;\n}\n\nexport interface ExecFrame {\n timestamp?: string;\n type?: string;\n pid?: number;\n encoding?: ExecStdio;\n /** Raw wire value — string under text mode, base64 string under base64 mode. */\n data?: string;\n startedAt?: string;\n endedAt?: string;\n signal?: string;\n stdout?: string;\n stderr?: string;\n /** Decoded bytes when `encoding === 'base64'`. SDK-populated convenience field. */\n dataBytes?: Buffer;\n stdoutBytes?: Buffer;\n stderrBytes?: Buffer;\n exitCode?: number;\n error?: string;\n}\n\nexport interface ExecResult {\n stdout: string;\n stderr: string;\n encoding?: ExecStdio;\n pid?: number;\n startedAt?: string;\n endedAt?: string;\n signal?: string;\n exitCode: number;\n error?: string;\n}\n\n/** Returned by `execBuffered` when `stdio === 'base64'`. stdout/stderr are decoded Buffers. */\nexport interface ExecResultBinary {\n stdout: Buffer;\n stderr: Buffer;\n encoding: 'base64';\n pid?: number;\n startedAt?: string;\n endedAt?: string;\n signal?: string;\n exitCode: number;\n error?: string;\n}\n\nexport interface FSEntry {\n name: string;\n type: 'file' | 'directory' | 'symlink' | string;\n size: number;\n mtime: string;\n mode: string;\n}\n\nexport interface FSMkdirRequest {\n path: string;\n recursive?: boolean;\n mode?: string;\n}\n\nexport interface ShutdownRequest {\n action?: 'shutdown' | 'reboot';\n}\n\nexport interface VMStat {\n hostname: string;\n ip: string;\n createdAt: string;\n snapshot?: VMSnapshot | null;\n error?: string;\n}\n\nexport interface VMSnapshot {\n hostname: string;\n arch: string;\n timestamp: string;\n uptime: string;\n totalCpus: number;\n totalMemory: number;\n memoryUsed: number;\n memoryAvailable: number;\n memoryUsedPercent: number;\n loadAvg1: number;\n loadAvg5: number;\n loadAvg15: number;\n diskReadTotal: number;\n diskWriteTotal: number;\n networkReadTotal: number;\n networkWriteTotal: number;\n diskIOInflight: number;\n openConnections: number;\n openFiles: number;\n entropy: number;\n diskSpaceTotal: number;\n diskSpaceUsed: number;\n diskSpaceFree: number;\n diskSpaceUsedPercent: number;\n}\n\nexport interface SlicerInfo {\n version?: string;\n gitCommit?: string;\n platform?: string;\n arch?: string;\n}\n\nexport interface ListOptions {\n tag?: string;\n tagPrefix?: string;\n}\n\nexport interface WaitOptions {\n timeoutMs?: number;\n intervalMs?: number;\n}\n\nexport interface CreateVMOptions {\n /**\n * Server-side wait: `\"agent\"` waits for the in-guest agent to be ready,\n * `\"userdata\"` additionally waits for userdata to run. If unset the daemon\n * returns immediately once the VM is scheduled.\n */\n wait?: 'agent' | 'userdata';\n /** Server-side wait timeout, in seconds. Forwarded as a Go duration. */\n waitTimeoutSec?: number;\n}\n\nexport interface Secret {\n name: string;\n size: number;\n permissions: string;\n uid?: number;\n gid?: number;\n modifiedAt?: string;\n}\n\nexport interface CreateSecretRequest {\n name: string;\n data: string;\n permissions?: string;\n uid?: number;\n gid?: number;\n}\n\nexport interface UpdateSecretRequest {\n data: string;\n permissions?: string;\n uid?: number;\n gid?: number;\n}\n\nexport class SecretExistsError extends Error {\n constructor(name: string) {\n super(`secret already exists: ${name}`);\n this.name = 'SecretExistsError';\n }\n}\n\nexport class SlicerAPIError extends Error {\n readonly status: number;\n readonly method: string;\n readonly path: string;\n readonly body: string;\n constructor(method: string, path: string, status: number, body: string) {\n super(`slicer ${method} ${path} failed: ${status} ${body}`);\n this.name = 'SlicerAPIError';\n this.method = method;\n this.path = path;\n this.status = status;\n this.body = body;\n }\n}\n\nexport const MiB = (n: number): number => n * 1024 * 1024;\nexport const GiB = (n: number): number => n * 1024 * 1024 * 1024;\nexport const NonRootUser = 0xffffffff;\n","/**\n * HTTP transport for the Slicer API. Supports two modes:\n * - Unix socket: absolute path (`/...`), `unix://...`, `./...`, `../...`, `~/...`, or any `*.sock`.\n * - Network URL: `http://host[:port]` or `https://host`.\n *\n * Mirrors the detection rules in the Go SDK's `normalizeUnixSocketPath`.\n */\n\nimport http, { IncomingMessage, RequestOptions } from 'node:http';\nimport https from 'node:https';\nimport { Readable } from 'node:stream';\nimport { URL } from 'node:url';\nimport os from 'node:os';\nimport path from 'node:path';\n\nimport { SlicerAPIError } from './types.js';\n\nexport type Transport =\n | { kind: 'socket'; socketPath: string }\n | { kind: 'net'; url: URL };\n\nexport function resolveTransport(baseURL: string): Transport {\n const trimmed = baseURL.trim();\n if (!trimmed) throw new Error('Slicer baseURL is required');\n\n let candidate = trimmed;\n if (candidate.startsWith('unix://')) candidate = candidate.slice('unix://'.length);\n if (candidate.startsWith('~/')) candidate = path.join(os.homedir(), candidate.slice(2));\n\n const socketLike =\n candidate.startsWith('/') ||\n candidate.startsWith('./') ||\n candidate.startsWith('../') ||\n candidate.endsWith('.sock');\n if (socketLike) return { kind: 'socket', socketPath: candidate };\n\n return { kind: 'net', url: new URL(trimmed) };\n}\n\nexport interface TransportClientOptions {\n baseURL: string;\n token?: string;\n userAgent?: string;\n}\n\nexport class TransportClient {\n readonly transport: Transport;\n private readonly token?: string;\n private readonly userAgent: string;\n\n constructor(opts: TransportClientOptions) {\n this.transport = resolveTransport(opts.baseURL);\n this.token = opts.token;\n this.userAgent = opts.userAgent ?? 'slicer-sdk-ts/0.1.0';\n }\n\n private agent() {\n return this.transport.kind === 'net' && this.transport.url.protocol === 'https:'\n ? https\n : http;\n }\n\n private buildRequestOptions(\n method: string,\n reqPath: string,\n extraHeaders: Record<string, string> = {},\n ): RequestOptions {\n const headers: Record<string, string> = {\n 'User-Agent': this.userAgent,\n ...extraHeaders,\n };\n if (this.token) headers['Authorization'] = `Bearer ${this.token}`;\n\n if (this.transport.kind === 'socket') {\n return {\n socketPath: this.transport.socketPath,\n method,\n path: reqPath,\n headers,\n setHost: true,\n };\n }\n const u = this.transport.url;\n return {\n protocol: u.protocol,\n hostname: u.hostname,\n port: u.port || (u.protocol === 'https:' ? 443 : 80),\n method,\n path: reqPath,\n headers,\n };\n }\n\n /** Buffered JSON request. Rejects on non-2xx via SlicerAPIError. */\n request<T = unknown>(method: string, reqPath: string, body?: unknown): Promise<T> {\n return new Promise((resolve, reject) => {\n const payload = body === undefined ? undefined : Buffer.from(JSON.stringify(body));\n const headers: Record<string, string> = {};\n if (payload) {\n headers['Content-Type'] = 'application/json';\n headers['Content-Length'] = String(payload.length);\n }\n const req = this.agent().request(\n this.buildRequestOptions(method, reqPath, headers),\n (res: IncomingMessage) => {\n const chunks: Buffer[] = [];\n res.on('data', (c) => chunks.push(c));\n res.on('end', () => {\n const raw = Buffer.concat(chunks).toString('utf8');\n const status = res.statusCode ?? 0;\n if (status < 200 || status >= 300) {\n reject(new SlicerAPIError(method, reqPath, status, raw));\n return;\n }\n if (!raw) {\n resolve(undefined as unknown as T);\n return;\n }\n try {\n resolve(JSON.parse(raw) as T);\n } catch {\n resolve(raw as unknown as T);\n }\n });\n res.on('error', reject);\n },\n );\n req.on('error', reject);\n if (payload) req.write(payload);\n req.end();\n });\n }\n\n /** Raw-bytes request (for binary cp endpoints). */\n requestRaw(\n method: string,\n reqPath: string,\n body?: Buffer,\n contentType = 'application/octet-stream',\n ): Promise<Buffer> {\n return new Promise((resolve, reject) => {\n const headers: Record<string, string> = {};\n if (body) {\n headers['Content-Type'] = contentType;\n headers['Content-Length'] = String(body.length);\n }\n const req = this.agent().request(\n this.buildRequestOptions(method, reqPath, headers),\n (res) => {\n const chunks: Buffer[] = [];\n res.on('data', (c) => chunks.push(c));\n res.on('end', () => {\n const out = Buffer.concat(chunks);\n const status = res.statusCode ?? 0;\n if (status < 200 || status >= 300) {\n reject(new SlicerAPIError(method, reqPath, status, out.toString('utf8')));\n return;\n }\n resolve(out);\n });\n res.on('error', reject);\n },\n );\n req.on('error', reject);\n if (body) req.write(body);\n req.end();\n });\n }\n\n /** Streaming request producing a Node Readable of the response body. */\n requestStreamRaw(\n method: string,\n reqPath: string,\n body?: Buffer | Readable,\n contentType = 'application/octet-stream',\n ): Promise<IncomingMessage> {\n return new Promise((resolve, reject) => {\n const headers: Record<string, string> = {};\n if (body instanceof Buffer) {\n headers['Content-Type'] = contentType;\n headers['Content-Length'] = String(body.length);\n } else if (body) {\n headers['Content-Type'] = contentType;\n headers['Transfer-Encoding'] = 'chunked';\n }\n const req = this.agent().request(\n this.buildRequestOptions(method, reqPath, headers),\n (res) => {\n const status = res.statusCode ?? 0;\n if (status < 200 || status >= 300) {\n const chunks: Buffer[] = [];\n res.on('data', (c) => chunks.push(c));\n res.on('end', () =>\n reject(\n new SlicerAPIError(method, reqPath, status, Buffer.concat(chunks).toString('utf8')),\n ),\n );\n return;\n }\n resolve(res);\n },\n );\n req.on('error', reject);\n if (body instanceof Buffer) {\n req.write(body);\n req.end();\n } else if (body) {\n (body as Readable).pipe(req);\n } else {\n req.end();\n }\n });\n }\n\n /** Yields decoded JSON frames from an NDJSON response (one JSON object per line). */\n async *requestNDJSON<Frame = unknown>(\n method: string,\n reqPath: string,\n body?: Buffer | Readable,\n ): AsyncGenerator<Frame, void, void> {\n const res = await this.requestStreamRaw(method, reqPath, body);\n res.setEncoding('utf8');\n let buffer = '';\n for await (const chunk of res as AsyncIterable<string>) {\n buffer += chunk;\n let nl: number;\n while ((nl = buffer.indexOf('\\n')) >= 0) {\n const line = buffer.slice(0, nl).trim();\n buffer = buffer.slice(nl + 1);\n if (!line) continue;\n try {\n yield JSON.parse(line) as Frame;\n } catch {\n /* skip keep-alives / unparseable lines */\n }\n }\n }\n const trailing = buffer.trim();\n if (trailing) {\n try {\n yield JSON.parse(trailing) as Frame;\n } catch {\n /* ignore */\n }\n }\n }\n}\n","/**\n * Wire-format converters. The only place camelCase ↔ snake_case bridging\n * should live. All outbound request bodies and inbound response bodies are\n * shaped exactly as the daemon emits; model types above are idiomatic TS.\n */\n\nimport type {\n AgentHealth,\n CreateVMRequest,\n CreateVMResponse,\n FSEntry,\n HostGroup,\n Secret,\n VMInfo,\n VMStat,\n} from './types.js';\n\nexport interface WireHostGroup {\n name?: string;\n count?: number;\n ram_bytes?: number;\n cpus?: number;\n arch?: string;\n gpu_count?: number;\n}\n\nexport interface WireVM {\n hostname: string;\n hostgroup?: string;\n ip: string;\n ram_bytes?: number;\n cpus?: number;\n created_at: string;\n arch?: string;\n tags?: string[];\n status?: string;\n persistent?: boolean;\n}\n\nexport interface WireCreateVMRequest {\n ram_bytes?: number;\n cpus?: number;\n gpu_count?: number;\n persistent?: boolean;\n disk_image?: string;\n import_user?: string;\n ssh_keys?: string[];\n userdata?: string;\n ip?: string;\n tags?: string[];\n secrets?: string[];\n}\n\nexport interface WireCreateVMResponse {\n hostname: string;\n hostgroup?: string;\n ip: string;\n created_at: string;\n arch?: string;\n}\n\nexport interface WireAgentHealth {\n hostname?: string;\n agent_uptime?: number;\n agent_version?: string;\n system_uptime?: number;\n userdata_ran?: boolean;\n}\n\nexport interface WireFSInfo {\n name: string;\n type: string;\n size: number;\n mtime: string;\n mode: string;\n}\n\nexport interface WireVMStat {\n hostname: string;\n ip: string;\n created_at: string;\n snapshot?: unknown;\n error?: string;\n}\n\nexport interface WireSecret {\n name: string;\n size: number;\n permissions: string;\n uid?: number;\n gid?: number;\n modified_at?: string;\n}\n\nexport function hostGroupFromWire(w: WireHostGroup): HostGroup {\n return {\n name: w.name ?? '',\n count: w.count ?? 0,\n ramBytes: w.ram_bytes ?? 0,\n cpus: w.cpus ?? 0,\n arch: w.arch ?? '',\n ...(w.gpu_count !== undefined && { gpuCount: w.gpu_count }),\n };\n}\n\nexport function vmFromWire(w: WireVM): VMInfo {\n return {\n hostname: w.hostname,\n ip: w.ip,\n createdAt: w.created_at,\n ...(w.hostgroup !== undefined && { hostGroup: w.hostgroup }),\n ...(w.ram_bytes !== undefined && { ramBytes: w.ram_bytes }),\n ...(w.cpus !== undefined && { cpus: w.cpus }),\n ...(w.arch !== undefined && { arch: w.arch }),\n ...(w.tags !== undefined && { tags: w.tags }),\n ...(w.status !== undefined && { status: w.status }),\n ...(w.persistent !== undefined && { persistent: w.persistent }),\n };\n}\n\nexport function createVMReqToWire(r: CreateVMRequest): WireCreateVMRequest {\n const o: WireCreateVMRequest = {};\n if (r.ramBytes !== undefined) o.ram_bytes = r.ramBytes;\n if (r.cpus !== undefined) o.cpus = r.cpus;\n if (r.gpuCount !== undefined) o.gpu_count = r.gpuCount;\n if (r.persistent !== undefined) o.persistent = r.persistent;\n if (r.diskImage !== undefined) o.disk_image = r.diskImage;\n if (r.importUser !== undefined) o.import_user = r.importUser;\n if (r.sshKeys !== undefined) o.ssh_keys = r.sshKeys;\n if (r.userdata !== undefined) o.userdata = r.userdata;\n if (r.ip !== undefined) o.ip = r.ip;\n if (r.tags !== undefined) o.tags = r.tags;\n if (r.secrets !== undefined) o.secrets = r.secrets;\n return o;\n}\n\nexport function createVMResFromWire(w: WireCreateVMResponse): CreateVMResponse {\n return {\n hostname: w.hostname,\n ip: w.ip,\n createdAt: w.created_at,\n ...(w.hostgroup !== undefined && { hostGroup: w.hostgroup }),\n ...(w.arch !== undefined && { arch: w.arch }),\n };\n}\n\nexport function agentHealthFromWire(w: WireAgentHealth): AgentHealth {\n return {\n ...(w.hostname !== undefined && { hostname: w.hostname }),\n ...(w.agent_uptime !== undefined && { agentUptime: w.agent_uptime }),\n ...(w.agent_version !== undefined && { agentVersion: w.agent_version }),\n ...(w.system_uptime !== undefined && { systemUptime: w.system_uptime }),\n ...(w.userdata_ran !== undefined && { userdataRan: w.userdata_ran }),\n };\n}\n\nexport function fsEntryFromWire(w: WireFSInfo): FSEntry {\n return { name: w.name, type: w.type, size: w.size, mtime: w.mtime, mode: w.mode };\n}\n\nexport function vmStatFromWire(w: WireVMStat): VMStat {\n return {\n hostname: w.hostname,\n ip: w.ip,\n createdAt: w.created_at,\n ...(w.snapshot !== undefined && { snapshot: w.snapshot as VMStat['snapshot'] }),\n ...(w.error !== undefined && { error: w.error }),\n };\n}\n\nexport function secretFromWire(w: WireSecret): Secret {\n return {\n name: w.name,\n size: w.size,\n permissions: w.permissions,\n ...(w.uid !== undefined && { uid: w.uid }),\n ...(w.gid !== undefined && { gid: w.gid }),\n ...(w.modified_at !== undefined && { modifiedAt: w.modified_at }),\n };\n}\n","/**\n * 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 {\n type AgentHealth,\n type ExecFrame,\n type ExecRequest,\n type ExecResult,\n type ExecResultBinary,\n type FSEntry,\n type FSMkdirRequest,\n type ShutdownRequest,\n SlicerAPIError,\n type VMLogs,\n type WaitOptions,\n} from './types.js';\nimport {\n agentHealthFromWire,\n fsEntryFromWire,\n type WireAgentHealth,\n type WireFSInfo,\n} from './wire.js';\n\n/** Per-VM filesystem operations. */\nexport class VMFileSystem {\n constructor(\n private readonly transport: TransportClient,\n private readonly hostname: string,\n ) {}\n\n async readDir(path: string): Promise<FSEntry[]> {\n const q = new URLSearchParams({ path });\n const wire = await this.transport.request<WireFSInfo[]>(\n 'GET',\n `/vm/${encodeURIComponent(this.hostname)}/fs/readdir?${q.toString()}`,\n );\n return (wire ?? []).map(fsEntryFromWire);\n }\n\n async stat(path: string): Promise<FSEntry | null> {\n const q = new URLSearchParams({ path });\n try {\n const wire = await this.transport.request<WireFSInfo>(\n 'GET',\n `/vm/${encodeURIComponent(this.hostname)}/fs/stat?${q.toString()}`,\n );\n return fsEntryFromWire(wire);\n } catch (err) {\n if (err instanceof SlicerAPIError && err.status === 404) return null;\n throw err;\n }\n }\n\n async exists(path: string): Promise<boolean> {\n return (await this.stat(path)) !== null;\n }\n\n async mkdir(req: FSMkdirRequest): Promise<void> {\n await this.transport.request(\n 'POST',\n `/vm/${encodeURIComponent(this.hostname)}/fs/mkdir`,\n {\n path: req.path,\n ...(req.recursive !== undefined && { recursive: req.recursive }),\n ...(req.mode !== undefined && { mode: req.mode }),\n },\n );\n }\n\n async remove(path: string, recursive = false): Promise<void> {\n const q = new URLSearchParams({ path, recursive: String(recursive) });\n await this.transport.request(\n 'DELETE',\n `/vm/${encodeURIComponent(this.hostname)}/fs/remove?${q.toString()}`,\n );\n }\n\n async readFile(path: string): Promise<Buffer> {\n const q = new URLSearchParams({ path, mode: 'binary' });\n return this.transport.requestRaw(\n 'GET',\n `/vm/${encodeURIComponent(this.hostname)}/cp?${q.toString()}`,\n );\n }\n\n async writeFile(\n path: string,\n content: Buffer | string,\n opts: { uid?: number; gid?: number; permissions?: string } = {},\n ): Promise<void> {\n const q = new URLSearchParams({ path, mode: 'binary' });\n if (opts.uid !== undefined) q.set('uid', String(opts.uid));\n if (opts.gid !== undefined) q.set('gid', String(opts.gid));\n if (opts.permissions) q.set('permissions', opts.permissions);\n const body = typeof content === 'string' ? Buffer.from(content) : content;\n await this.transport.requestRaw(\n 'POST',\n `/vm/${encodeURIComponent(this.hostname)}/cp?${q.toString()}`,\n body,\n );\n }\n\n /** Upload a tar archive, expanded into the VM at `path`. */\n async tarTo(path: string, tar: Buffer | Readable): Promise<void> {\n const q = new URLSearchParams({ path, mode: 'tar' });\n if (tar instanceof Buffer) {\n await this.transport.requestRaw(\n 'POST',\n `/vm/${encodeURIComponent(this.hostname)}/cp?${q.toString()}`,\n tar,\n 'application/x-tar',\n );\n return;\n }\n const res = await this.transport.requestStreamRaw(\n 'POST',\n `/vm/${encodeURIComponent(this.hostname)}/cp?${q.toString()}`,\n tar,\n 'application/x-tar',\n );\n for await (const _ of res as AsyncIterable<Buffer>) void _;\n }\n\n /** Download `path` from the VM as a tar archive. */\n async tarFrom(path: string): Promise<Buffer> {\n const q = new URLSearchParams({ path, mode: 'tar' });\n return this.transport.requestRaw(\n 'GET',\n `/vm/${encodeURIComponent(this.hostname)}/cp?${q.toString()}`,\n );\n }\n}\n\nexport interface VMInit {\n hostname: string;\n hostGroup: string;\n ip?: string;\n createdAt?: string;\n arch?: string;\n}\n\nexport class VM {\n readonly hostname: string;\n readonly hostGroup: string;\n readonly ip?: string;\n readonly createdAt?: string;\n readonly arch?: string;\n readonly fs: VMFileSystem;\n\n private readonly transport: TransportClient;\n\n constructor(transport: TransportClient, init: VMInit) {\n this.transport = transport;\n this.hostname = init.hostname;\n this.hostGroup = init.hostGroup;\n if (init.ip !== undefined) this.ip = init.ip;\n if (init.createdAt !== undefined) this.createdAt = init.createdAt;\n if (init.arch !== undefined) this.arch = init.arch;\n this.fs = new VMFileSystem(transport, this.hostname);\n }\n\n // --- lifecycle --------------------------------------------------------\n\n async delete(): Promise<void> {\n await this.transport.request(\n 'DELETE',\n `/hostgroup/${encodeURIComponent(this.hostGroup)}/nodes/${encodeURIComponent(\n this.hostname,\n )}`,\n );\n }\n\n // --- health / logs ----------------------------------------------------\n\n async health(): Promise<AgentHealth> {\n const wire = await this.transport.request<WireAgentHealth>(\n 'GET',\n `/vm/${encodeURIComponent(this.hostname)}/health`,\n );\n return agentHealthFromWire(wire);\n }\n\n async logs(): Promise<VMLogs> {\n return this.transport.request<VMLogs>('GET', `/vm/${encodeURIComponent(this.hostname)}/logs`);\n }\n\n async waitForAgent(opts: WaitOptions = {}): Promise<AgentHealth> {\n const timeoutMs = opts.timeoutMs ?? 120_000;\n const intervalMs = opts.intervalMs ?? 500;\n const deadline = Date.now() + timeoutMs;\n let lastErr: unknown;\n while (Date.now() < deadline) {\n try {\n return await this.health();\n } catch (err) {\n lastErr = err;\n await sleep(intervalMs);\n }\n }\n throw new Error(\n `agent for ${this.hostname} did not become ready within ${timeoutMs}ms: ${errMsg(lastErr)}`,\n );\n }\n\n async waitForUserdata(opts: WaitOptions = {}): Promise<AgentHealth> {\n const timeoutMs = opts.timeoutMs ?? 120_000;\n const intervalMs = opts.intervalMs ?? 500;\n const deadline = Date.now() + timeoutMs;\n let last: AgentHealth | undefined;\n let lastErr: unknown;\n while (Date.now() < deadline) {\n try {\n last = await this.health();\n if (last.userdataRan) return last;\n } catch (err) {\n lastErr = err;\n }\n await sleep(intervalMs);\n }\n throw new Error(\n `userdata for ${this.hostname} did not complete within ${timeoutMs}ms${\n lastErr ? `: ${errMsg(lastErr)}` : ''\n }`,\n );\n }\n\n // --- power ------------------------------------------------------------\n\n async shutdown(req: ShutdownRequest = {}): Promise<void> {\n await this.transport.request(\n 'POST',\n `/vm/${encodeURIComponent(this.hostname)}/shutdown`,\n req,\n );\n }\n\n async pause(): Promise<void> {\n await this.transport.request('POST', `/vm/${encodeURIComponent(this.hostname)}/pause`);\n }\n\n async resume(): Promise<void> {\n await this.transport.request('POST', `/vm/${encodeURIComponent(this.hostname)}/resume`);\n }\n\n async relaunch(): Promise<void> {\n await this.transport.request('POST', `/vm/${encodeURIComponent(this.hostname)}/relaunch`);\n }\n\n /** Mac-only on current daemons. Throws `SlicerAPIError 404` on Linux. */\n async suspend(): Promise<void> {\n await this.transport.request('POST', `/vm/${encodeURIComponent(this.hostname)}/suspend`);\n }\n\n /** Mac-only on current daemons. Throws `SlicerAPIError 404` on Linux. */\n async restore(): Promise<void> {\n await this.transport.request('POST', `/vm/${encodeURIComponent(this.hostname)}/restore`);\n }\n\n // --- exec -------------------------------------------------------------\n\n /**\n * Streaming exec — yields NDJSON frames (`started`, `stdout`, `stderr`, `exit`).\n * When `req.stdio === 'base64'`, each frame's `data`/`stdout`/`stderr` string\n * fields are preserved as-is (base64-encoded) and the SDK populates decoded\n * `dataBytes`/`stdoutBytes`/`stderrBytes` Buffers alongside for convenience.\n */\n async *exec(req: ExecRequest): AsyncGenerator<ExecFrame, void, void> {\n const { path, body } = buildExecPath(this.hostname, req, false);\n for await (const frame of this.transport.requestNDJSON<ExecFrame>('POST', path, body)) {\n if (frame.encoding === 'base64') {\n if (frame.data) frame.dataBytes = Buffer.from(frame.data, 'base64');\n if (frame.stdout) frame.stdoutBytes = Buffer.from(frame.stdout, 'base64');\n if (frame.stderr) frame.stderrBytes = Buffer.from(frame.stderr, 'base64');\n }\n yield frame;\n }\n }\n\n /**\n * Buffered exec via `?buffered=true`. stdin is intentionally unsupported\n * (matches Go SDK `ExecBuffered`); use `exec()` for stdin cases.\n *\n * When `req.stdio === 'base64'`, stdout/stderr are decoded from base64 and\n * returned as `Buffer` — use this for binary output. Otherwise the result\n * carries UTF-8 strings.\n */\n execBuffered(req: ExecRequest & { stdio: 'base64' }): Promise<ExecResultBinary>;\n execBuffered(req: ExecRequest): Promise<ExecResult>;\n async execBuffered(req: ExecRequest): Promise<ExecResult | ExecResultBinary> {\n if (req.stdin !== undefined) {\n throw new Error('stdin is not supported by execBuffered; use exec() instead');\n }\n const { path, body } = buildExecPath(this.hostname, req, true);\n const raw = await this.transport.requestRaw('POST', path, body);\n const text = raw.toString('utf8');\n const parsed = text\n ? (JSON.parse(text) as {\n stdout?: string;\n stderr?: string;\n encoding?: 'text' | 'base64';\n pid?: number;\n started_at?: string;\n ended_at?: string;\n signal?: string;\n exit_code?: number;\n error?: string;\n })\n : {};\n\n const common = {\n exitCode: parsed.exit_code ?? 0,\n ...(parsed.pid !== undefined && { pid: parsed.pid }),\n ...(parsed.started_at !== undefined && { startedAt: parsed.started_at }),\n ...(parsed.ended_at !== undefined && { endedAt: parsed.ended_at }),\n ...(parsed.signal !== undefined && { signal: parsed.signal }),\n ...(parsed.error !== undefined && { error: parsed.error }),\n };\n\n if (req.stdio === 'base64' || parsed.encoding === 'base64') {\n return {\n stdout: Buffer.from(parsed.stdout ?? '', 'base64'),\n stderr: Buffer.from(parsed.stderr ?? '', 'base64'),\n encoding: 'base64',\n ...common,\n } satisfies ExecResultBinary;\n }\n return {\n stdout: parsed.stdout ?? '',\n stderr: parsed.stderr ?? '',\n ...(parsed.encoding !== undefined && { encoding: parsed.encoding }),\n ...common,\n } satisfies ExecResult;\n }\n}\n\nfunction buildExecPath(\n hostname: string,\n req: ExecRequest,\n buffered: boolean,\n): { path: string; body: Buffer | undefined } {\n const q = new URLSearchParams();\n if (req.command) q.set('cmd', req.command);\n for (const a of req.args ?? []) q.append('args', a);\n for (const e of req.env ?? []) q.append('env', e);\n if (req.uid !== undefined) q.set('uid', String(req.uid));\n if (req.gid !== undefined) q.set('gid', String(req.gid));\n if (req.cwd) q.set('cwd', req.cwd);\n if (req.shell) q.set('shell', req.shell);\n if (req.permissions) q.set('permissions', req.permissions);\n if (req.stdio) q.set('stdio', req.stdio);\n if (buffered) q.set('buffered', 'true');\n let body: Buffer | undefined;\n if (req.stdin !== undefined) {\n q.set('stdin', 'true');\n body = typeof req.stdin === 'string' ? Buffer.from(req.stdin) : req.stdin;\n }\n return {\n path: `/vm/${encodeURIComponent(hostname)}/exec?${q.toString()}`,\n body,\n };\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((r) => setTimeout(r, ms));\n}\n\nfunction errMsg(e: unknown): string {\n return e instanceof Error ? e.message : String(e);\n}\n","/**\n * Top-level namespaces on SlicerClient: hostGroups, vms, secrets.\n * Keep control-plane operations here; per-VM operations live on the VM handle.\n */\n\nimport type { TransportClient } from './transport.js';\nimport {\n type CreateSecretRequest,\n type CreateVMOptions,\n type CreateVMRequest,\n type CreateVMResponse,\n type HostGroup,\n type ListOptions,\n type Secret,\n SecretExistsError,\n SlicerAPIError,\n type UpdateSecretRequest,\n type VMInfo,\n type VMStat,\n} from './types.js';\nimport {\n createVMReqToWire,\n createVMResFromWire,\n hostGroupFromWire,\n secretFromWire,\n vmFromWire,\n vmStatFromWire,\n type WireCreateVMResponse,\n type WireHostGroup,\n type WireSecret,\n type WireVM,\n type WireVMStat,\n} from './wire.js';\nimport { VM } from './vm.js';\n\nexport class HostGroupsAPI {\n constructor(private readonly transport: TransportClient) {}\n\n async list(): Promise<HostGroup[]> {\n const wire = await this.transport.request<WireHostGroup[]>('GET', '/hostgroup');\n return (wire ?? []).map(hostGroupFromWire);\n }\n\n /** Convenience lookup (no single-group endpoint exists on the daemon). */\n async find(name: string): Promise<HostGroup | undefined> {\n return (await this.list()).find((g) => g.name === name);\n }\n\n async listVMs(name: string, opts: ListOptions = {}): Promise<VMInfo[]> {\n const q = buildListQuery(opts);\n const wire = await this.transport.request<WireVM[]>(\n 'GET',\n `/hostgroup/${encodeURIComponent(name)}/nodes${q}`,\n );\n return (wire ?? []).map(vmFromWire);\n }\n}\n\nexport class VMsAPI {\n constructor(private readonly transport: TransportClient) {}\n\n async create(\n hostGroup: string,\n req: CreateVMRequest = {},\n opts: CreateVMOptions = {},\n ): Promise<VM> {\n const qs = new URLSearchParams();\n if (opts.wait) qs.set('wait', opts.wait);\n if (opts.waitTimeoutSec !== undefined) qs.set('timeout', `${opts.waitTimeoutSec}s`);\n const query = qs.toString() ? `?${qs.toString()}` : '';\n const wire = await this.transport.request<WireCreateVMResponse>(\n 'POST',\n `/hostgroup/${encodeURIComponent(hostGroup)}/nodes${query}`,\n createVMReqToWire(req),\n );\n const res = createVMResFromWire(wire);\n return new VM(this.transport, {\n hostname: res.hostname,\n hostGroup: res.hostGroup ?? hostGroup,\n ...(res.ip !== undefined && { ip: res.ip }),\n ...(res.createdAt !== undefined && { createdAt: res.createdAt }),\n ...(res.arch !== undefined && { arch: res.arch }),\n });\n }\n\n /**\n * Build a VM handle for an existing VM given its hostgroup + hostname. No\n * request is issued — use `health()` or `getInfo()` to verify reachability.\n */\n attach(hostGroup: string, hostname: string): VM {\n return new VM(this.transport, { hostname, hostGroup });\n }\n\n /** Look up a VM by hostname across all host groups. Returns `undefined` if not found. */\n async get(hostname: string): Promise<VM | undefined> {\n const all = await this.list();\n const found = all.find((v) => v.hostname === hostname);\n if (!found) return undefined;\n return new VM(this.transport, {\n hostname: found.hostname,\n hostGroup: found.hostGroup ?? '',\n ...(found.ip !== undefined && { ip: found.ip }),\n ...(found.createdAt !== undefined && { createdAt: found.createdAt }),\n ...(found.arch !== undefined && { arch: found.arch }),\n });\n }\n\n /** Return raw VM metadata across all host groups. */\n async list(opts: ListOptions = {}): Promise<VMInfo[]> {\n const q = buildListQuery(opts);\n const wire = await this.transport.request<WireVM[]>('GET', `/nodes${q}`);\n return (wire ?? []).map(vmFromWire);\n }\n\n async stats(): Promise<VMStat[]> {\n const raw = await this.transport.request<WireVMStat[]>('GET', '/nodes/stats');\n return (raw ?? []).map(vmStatFromWire);\n }\n\n /**\n * Raw response accessor — bypasses the VM handle. Useful when you only\n * want the create metadata without a handle.\n */\n async createRaw(\n hostGroup: string,\n req: CreateVMRequest = {},\n opts: CreateVMOptions = {},\n ): Promise<CreateVMResponse> {\n const qs = new URLSearchParams();\n if (opts.wait) qs.set('wait', opts.wait);\n if (opts.waitTimeoutSec !== undefined) qs.set('timeout', `${opts.waitTimeoutSec}s`);\n const query = qs.toString() ? `?${qs.toString()}` : '';\n const wire = await this.transport.request<WireCreateVMResponse>(\n 'POST',\n `/hostgroup/${encodeURIComponent(hostGroup)}/nodes${query}`,\n createVMReqToWire(req),\n );\n return createVMResFromWire(wire);\n }\n}\n\nexport class SecretsAPI {\n constructor(private readonly transport: TransportClient) {}\n\n async list(): Promise<Secret[]> {\n const wire = await this.transport.request<WireSecret[]>('GET', '/secrets');\n return (wire ?? []).map(secretFromWire);\n }\n\n async create(req: CreateSecretRequest): Promise<void> {\n const body = {\n name: req.name,\n data: Buffer.from(req.data).toString('base64'),\n ...(req.permissions !== undefined && { permissions: req.permissions }),\n ...(req.uid !== undefined && { uid: req.uid }),\n ...(req.gid !== undefined && { gid: req.gid }),\n };\n try {\n await this.transport.request('POST', '/secrets', body);\n } catch (err) {\n if (err instanceof SlicerAPIError && err.status === 409) {\n throw new SecretExistsError(req.name);\n }\n throw err;\n }\n }\n\n async patch(name: string, req: UpdateSecretRequest): Promise<void> {\n const body = {\n data: Buffer.from(req.data).toString('base64'),\n ...(req.permissions !== undefined && { permissions: req.permissions }),\n ...(req.uid !== undefined && { uid: req.uid }),\n ...(req.gid !== undefined && { gid: req.gid }),\n };\n await this.transport.request('PATCH', `/secrets/${encodeURIComponent(name)}`, body);\n }\n\n async delete(name: string): Promise<void> {\n await this.transport.request('DELETE', `/secrets/${encodeURIComponent(name)}`);\n }\n}\n\nfunction buildListQuery(opts: ListOptions): string {\n const qs = new URLSearchParams();\n if (opts.tag) qs.set('tag', opts.tag);\n if (opts.tagPrefix) qs.set('tag_prefix', opts.tagPrefix);\n const s = qs.toString();\n return s ? `?${s}` : '';\n}\n","/**\n * SlicerClient — grouped TypeScript client for the Slicer VM API.\n *\n * Shape:\n * client.hostGroups.list() / find(name) / listVMs(name)\n * client.vms.create(group, req, opts) → VM / get(name) / list() / stats() / attach(group, name)\n * client.secrets.list / create / patch / delete\n * client.getInfo()\n *\n * Per-VM operations live on the `VM` handle returned from `client.vms.create`\n * or `client.vms.attach`: `vm.exec`, `vm.execBuffered`, `vm.fs.*`,\n * `vm.pause/resume/suspend/restore/shutdown/relaunch`, `vm.health/logs`,\n * `vm.waitForAgent/waitForUserdata`, `vm.delete`.\n */\n\nimport { TransportClient, type TransportClientOptions } from './transport.js';\nimport { HostGroupsAPI, SecretsAPI, VMsAPI } from './namespaces.js';\nimport type { SlicerInfo } from './types.js';\n\nexport interface SlicerClientOptions extends TransportClientOptions {}\n\nexport class SlicerClient {\n readonly transport: TransportClient;\n readonly hostGroups: HostGroupsAPI;\n readonly vms: VMsAPI;\n readonly secrets: SecretsAPI;\n\n constructor(opts: SlicerClientOptions) {\n this.transport = new TransportClient(opts);\n this.hostGroups = new HostGroupsAPI(this.transport);\n this.vms = new VMsAPI(this.transport);\n this.secrets = new SecretsAPI(this.transport);\n }\n\n static fromEnv(overrides: Partial<SlicerClientOptions> = {}): SlicerClient {\n const baseURL = overrides.baseURL ?? process.env.SLICER_URL;\n if (!baseURL) throw new Error('SLICER_URL is required (or pass baseURL)');\n const token = overrides.token ?? process.env.SLICER_TOKEN ?? undefined;\n return new SlicerClient({\n baseURL,\n ...(token !== undefined && { token }),\n ...(overrides.userAgent !== undefined && { userAgent: overrides.userAgent }),\n });\n }\n\n async getInfo(): Promise<SlicerInfo> {\n return this.transport.request<SlicerInfo>('GET', '/info');\n }\n}\n"]}
|
package/dist/index.d.cts
ADDED
|
@@ -0,0 +1,424 @@
|
|
|
1
|
+
import { IncomingMessage } from 'node:http';
|
|
2
|
+
import { Readable } from 'node:stream';
|
|
3
|
+
import { URL } from 'node:url';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Slicer API types. Wire shapes mirror the Go SDK at github.com/slicervm/sdk
|
|
7
|
+
* (which calls these "Node" / "SlicerNode"); the TS SDK renames to "VM" for
|
|
8
|
+
* clarity, since Slicer's primary primitive is a VM.
|
|
9
|
+
*/
|
|
10
|
+
interface HostGroup {
|
|
11
|
+
name: string;
|
|
12
|
+
count: number;
|
|
13
|
+
ramBytes: number;
|
|
14
|
+
cpus: number;
|
|
15
|
+
arch: string;
|
|
16
|
+
gpuCount?: number;
|
|
17
|
+
}
|
|
18
|
+
interface VMInfo {
|
|
19
|
+
hostname: string;
|
|
20
|
+
hostGroup?: string;
|
|
21
|
+
ip: string;
|
|
22
|
+
ramBytes?: number;
|
|
23
|
+
cpus?: number;
|
|
24
|
+
createdAt: string;
|
|
25
|
+
arch?: string;
|
|
26
|
+
tags?: string[];
|
|
27
|
+
status?: string;
|
|
28
|
+
persistent?: boolean;
|
|
29
|
+
}
|
|
30
|
+
interface CreateVMRequest {
|
|
31
|
+
ramBytes?: number;
|
|
32
|
+
cpus?: number;
|
|
33
|
+
gpuCount?: number;
|
|
34
|
+
persistent?: boolean;
|
|
35
|
+
diskImage?: string;
|
|
36
|
+
importUser?: string;
|
|
37
|
+
sshKeys?: string[];
|
|
38
|
+
userdata?: string;
|
|
39
|
+
ip?: string;
|
|
40
|
+
tags?: string[];
|
|
41
|
+
secrets?: string[];
|
|
42
|
+
}
|
|
43
|
+
interface CreateVMResponse {
|
|
44
|
+
hostname: string;
|
|
45
|
+
hostGroup?: string;
|
|
46
|
+
ip: string;
|
|
47
|
+
createdAt: string;
|
|
48
|
+
arch?: string;
|
|
49
|
+
}
|
|
50
|
+
interface AgentHealth {
|
|
51
|
+
hostname?: string;
|
|
52
|
+
agentUptime?: number;
|
|
53
|
+
agentVersion?: string;
|
|
54
|
+
systemUptime?: number;
|
|
55
|
+
userdataRan?: boolean;
|
|
56
|
+
}
|
|
57
|
+
interface VMLogs {
|
|
58
|
+
hostname: string;
|
|
59
|
+
lines: number;
|
|
60
|
+
content: string;
|
|
61
|
+
}
|
|
62
|
+
interface DeleteResponse {
|
|
63
|
+
message?: string;
|
|
64
|
+
diskRemoved?: string;
|
|
65
|
+
error?: string;
|
|
66
|
+
}
|
|
67
|
+
/** Wire encoding of exec stdout/stderr. Defaults to `"text"`. */
|
|
68
|
+
type ExecStdio = 'text' | 'base64';
|
|
69
|
+
declare const ExecStdioText: ExecStdio;
|
|
70
|
+
declare const ExecStdioBase64: ExecStdio;
|
|
71
|
+
interface ExecRequest {
|
|
72
|
+
command?: string;
|
|
73
|
+
args?: string[];
|
|
74
|
+
env?: string[];
|
|
75
|
+
uid?: number;
|
|
76
|
+
gid?: number;
|
|
77
|
+
stdin?: Buffer | string;
|
|
78
|
+
shell?: string;
|
|
79
|
+
cwd?: string;
|
|
80
|
+
permissions?: string;
|
|
81
|
+
/**
|
|
82
|
+
* Wire encoding for stdout/stderr.
|
|
83
|
+
* - `"text"` (default): frames carry UTF-8 strings. Safe for text output only —
|
|
84
|
+
* arbitrary binary will be mangled by JSON string escaping.
|
|
85
|
+
* - `"base64"`: frames carry base64-encoded bytes. Required for binary output
|
|
86
|
+
* (video, compressed archives, raw protocol streams). The SDK decodes
|
|
87
|
+
* automatically — callers get `Buffer` on `execBuffered({ stdio: 'base64' })`
|
|
88
|
+
* and `{stdoutBytes, stderrBytes, dataBytes}` on streamed frames.
|
|
89
|
+
*/
|
|
90
|
+
stdio?: ExecStdio;
|
|
91
|
+
}
|
|
92
|
+
interface ExecFrame {
|
|
93
|
+
timestamp?: string;
|
|
94
|
+
type?: string;
|
|
95
|
+
pid?: number;
|
|
96
|
+
encoding?: ExecStdio;
|
|
97
|
+
/** Raw wire value — string under text mode, base64 string under base64 mode. */
|
|
98
|
+
data?: string;
|
|
99
|
+
startedAt?: string;
|
|
100
|
+
endedAt?: string;
|
|
101
|
+
signal?: string;
|
|
102
|
+
stdout?: string;
|
|
103
|
+
stderr?: string;
|
|
104
|
+
/** Decoded bytes when `encoding === 'base64'`. SDK-populated convenience field. */
|
|
105
|
+
dataBytes?: Buffer;
|
|
106
|
+
stdoutBytes?: Buffer;
|
|
107
|
+
stderrBytes?: Buffer;
|
|
108
|
+
exitCode?: number;
|
|
109
|
+
error?: string;
|
|
110
|
+
}
|
|
111
|
+
interface ExecResult {
|
|
112
|
+
stdout: string;
|
|
113
|
+
stderr: string;
|
|
114
|
+
encoding?: ExecStdio;
|
|
115
|
+
pid?: number;
|
|
116
|
+
startedAt?: string;
|
|
117
|
+
endedAt?: string;
|
|
118
|
+
signal?: string;
|
|
119
|
+
exitCode: number;
|
|
120
|
+
error?: string;
|
|
121
|
+
}
|
|
122
|
+
/** Returned by `execBuffered` when `stdio === 'base64'`. stdout/stderr are decoded Buffers. */
|
|
123
|
+
interface ExecResultBinary {
|
|
124
|
+
stdout: Buffer;
|
|
125
|
+
stderr: Buffer;
|
|
126
|
+
encoding: 'base64';
|
|
127
|
+
pid?: number;
|
|
128
|
+
startedAt?: string;
|
|
129
|
+
endedAt?: string;
|
|
130
|
+
signal?: string;
|
|
131
|
+
exitCode: number;
|
|
132
|
+
error?: string;
|
|
133
|
+
}
|
|
134
|
+
interface FSEntry {
|
|
135
|
+
name: string;
|
|
136
|
+
type: 'file' | 'directory' | 'symlink' | string;
|
|
137
|
+
size: number;
|
|
138
|
+
mtime: string;
|
|
139
|
+
mode: string;
|
|
140
|
+
}
|
|
141
|
+
interface FSMkdirRequest {
|
|
142
|
+
path: string;
|
|
143
|
+
recursive?: boolean;
|
|
144
|
+
mode?: string;
|
|
145
|
+
}
|
|
146
|
+
interface ShutdownRequest {
|
|
147
|
+
action?: 'shutdown' | 'reboot';
|
|
148
|
+
}
|
|
149
|
+
interface VMStat {
|
|
150
|
+
hostname: string;
|
|
151
|
+
ip: string;
|
|
152
|
+
createdAt: string;
|
|
153
|
+
snapshot?: VMSnapshot | null;
|
|
154
|
+
error?: string;
|
|
155
|
+
}
|
|
156
|
+
interface VMSnapshot {
|
|
157
|
+
hostname: string;
|
|
158
|
+
arch: string;
|
|
159
|
+
timestamp: string;
|
|
160
|
+
uptime: string;
|
|
161
|
+
totalCpus: number;
|
|
162
|
+
totalMemory: number;
|
|
163
|
+
memoryUsed: number;
|
|
164
|
+
memoryAvailable: number;
|
|
165
|
+
memoryUsedPercent: number;
|
|
166
|
+
loadAvg1: number;
|
|
167
|
+
loadAvg5: number;
|
|
168
|
+
loadAvg15: number;
|
|
169
|
+
diskReadTotal: number;
|
|
170
|
+
diskWriteTotal: number;
|
|
171
|
+
networkReadTotal: number;
|
|
172
|
+
networkWriteTotal: number;
|
|
173
|
+
diskIOInflight: number;
|
|
174
|
+
openConnections: number;
|
|
175
|
+
openFiles: number;
|
|
176
|
+
entropy: number;
|
|
177
|
+
diskSpaceTotal: number;
|
|
178
|
+
diskSpaceUsed: number;
|
|
179
|
+
diskSpaceFree: number;
|
|
180
|
+
diskSpaceUsedPercent: number;
|
|
181
|
+
}
|
|
182
|
+
interface SlicerInfo {
|
|
183
|
+
version?: string;
|
|
184
|
+
gitCommit?: string;
|
|
185
|
+
platform?: string;
|
|
186
|
+
arch?: string;
|
|
187
|
+
}
|
|
188
|
+
interface ListOptions {
|
|
189
|
+
tag?: string;
|
|
190
|
+
tagPrefix?: string;
|
|
191
|
+
}
|
|
192
|
+
interface WaitOptions {
|
|
193
|
+
timeoutMs?: number;
|
|
194
|
+
intervalMs?: number;
|
|
195
|
+
}
|
|
196
|
+
interface CreateVMOptions {
|
|
197
|
+
/**
|
|
198
|
+
* Server-side wait: `"agent"` waits for the in-guest agent to be ready,
|
|
199
|
+
* `"userdata"` additionally waits for userdata to run. If unset the daemon
|
|
200
|
+
* returns immediately once the VM is scheduled.
|
|
201
|
+
*/
|
|
202
|
+
wait?: 'agent' | 'userdata';
|
|
203
|
+
/** Server-side wait timeout, in seconds. Forwarded as a Go duration. */
|
|
204
|
+
waitTimeoutSec?: number;
|
|
205
|
+
}
|
|
206
|
+
interface Secret {
|
|
207
|
+
name: string;
|
|
208
|
+
size: number;
|
|
209
|
+
permissions: string;
|
|
210
|
+
uid?: number;
|
|
211
|
+
gid?: number;
|
|
212
|
+
modifiedAt?: string;
|
|
213
|
+
}
|
|
214
|
+
interface CreateSecretRequest {
|
|
215
|
+
name: string;
|
|
216
|
+
data: string;
|
|
217
|
+
permissions?: string;
|
|
218
|
+
uid?: number;
|
|
219
|
+
gid?: number;
|
|
220
|
+
}
|
|
221
|
+
interface UpdateSecretRequest {
|
|
222
|
+
data: string;
|
|
223
|
+
permissions?: string;
|
|
224
|
+
uid?: number;
|
|
225
|
+
gid?: number;
|
|
226
|
+
}
|
|
227
|
+
declare class SecretExistsError extends Error {
|
|
228
|
+
constructor(name: string);
|
|
229
|
+
}
|
|
230
|
+
declare class SlicerAPIError extends Error {
|
|
231
|
+
readonly status: number;
|
|
232
|
+
readonly method: string;
|
|
233
|
+
readonly path: string;
|
|
234
|
+
readonly body: string;
|
|
235
|
+
constructor(method: string, path: string, status: number, body: string);
|
|
236
|
+
}
|
|
237
|
+
declare const MiB: (n: number) => number;
|
|
238
|
+
declare const GiB: (n: number) => number;
|
|
239
|
+
declare const NonRootUser = 4294967295;
|
|
240
|
+
|
|
241
|
+
/**
|
|
242
|
+
* HTTP transport for the Slicer API. Supports two modes:
|
|
243
|
+
* - Unix socket: absolute path (`/...`), `unix://...`, `./...`, `../...`, `~/...`, or any `*.sock`.
|
|
244
|
+
* - Network URL: `http://host[:port]` or `https://host`.
|
|
245
|
+
*
|
|
246
|
+
* Mirrors the detection rules in the Go SDK's `normalizeUnixSocketPath`.
|
|
247
|
+
*/
|
|
248
|
+
|
|
249
|
+
type Transport = {
|
|
250
|
+
kind: 'socket';
|
|
251
|
+
socketPath: string;
|
|
252
|
+
} | {
|
|
253
|
+
kind: 'net';
|
|
254
|
+
url: URL;
|
|
255
|
+
};
|
|
256
|
+
declare function resolveTransport(baseURL: string): Transport;
|
|
257
|
+
interface TransportClientOptions {
|
|
258
|
+
baseURL: string;
|
|
259
|
+
token?: string;
|
|
260
|
+
userAgent?: string;
|
|
261
|
+
}
|
|
262
|
+
declare class TransportClient {
|
|
263
|
+
readonly transport: Transport;
|
|
264
|
+
private readonly token?;
|
|
265
|
+
private readonly userAgent;
|
|
266
|
+
constructor(opts: TransportClientOptions);
|
|
267
|
+
private agent;
|
|
268
|
+
private buildRequestOptions;
|
|
269
|
+
/** Buffered JSON request. Rejects on non-2xx via SlicerAPIError. */
|
|
270
|
+
request<T = unknown>(method: string, reqPath: string, body?: unknown): Promise<T>;
|
|
271
|
+
/** Raw-bytes request (for binary cp endpoints). */
|
|
272
|
+
requestRaw(method: string, reqPath: string, body?: Buffer, contentType?: string): Promise<Buffer>;
|
|
273
|
+
/** Streaming request producing a Node Readable of the response body. */
|
|
274
|
+
requestStreamRaw(method: string, reqPath: string, body?: Buffer | Readable, contentType?: string): Promise<IncomingMessage>;
|
|
275
|
+
/** Yields decoded JSON frames from an NDJSON response (one JSON object per line). */
|
|
276
|
+
requestNDJSON<Frame = unknown>(method: string, reqPath: string, body?: Buffer | Readable): AsyncGenerator<Frame, void, void>;
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
/**
|
|
280
|
+
* VM handle — returned from `client.vms.create()` / `client.vms.get()`.
|
|
281
|
+
* Exposes per-VM operations (exec, fs, power, lifecycle).
|
|
282
|
+
*/
|
|
283
|
+
|
|
284
|
+
/** Per-VM filesystem operations. */
|
|
285
|
+
declare class VMFileSystem {
|
|
286
|
+
private readonly transport;
|
|
287
|
+
private readonly hostname;
|
|
288
|
+
constructor(transport: TransportClient, hostname: string);
|
|
289
|
+
readDir(path: string): Promise<FSEntry[]>;
|
|
290
|
+
stat(path: string): Promise<FSEntry | null>;
|
|
291
|
+
exists(path: string): Promise<boolean>;
|
|
292
|
+
mkdir(req: FSMkdirRequest): Promise<void>;
|
|
293
|
+
remove(path: string, recursive?: boolean): Promise<void>;
|
|
294
|
+
readFile(path: string): Promise<Buffer>;
|
|
295
|
+
writeFile(path: string, content: Buffer | string, opts?: {
|
|
296
|
+
uid?: number;
|
|
297
|
+
gid?: number;
|
|
298
|
+
permissions?: string;
|
|
299
|
+
}): Promise<void>;
|
|
300
|
+
/** Upload a tar archive, expanded into the VM at `path`. */
|
|
301
|
+
tarTo(path: string, tar: Buffer | Readable): Promise<void>;
|
|
302
|
+
/** Download `path` from the VM as a tar archive. */
|
|
303
|
+
tarFrom(path: string): Promise<Buffer>;
|
|
304
|
+
}
|
|
305
|
+
interface VMInit {
|
|
306
|
+
hostname: string;
|
|
307
|
+
hostGroup: string;
|
|
308
|
+
ip?: string;
|
|
309
|
+
createdAt?: string;
|
|
310
|
+
arch?: string;
|
|
311
|
+
}
|
|
312
|
+
declare class VM {
|
|
313
|
+
readonly hostname: string;
|
|
314
|
+
readonly hostGroup: string;
|
|
315
|
+
readonly ip?: string;
|
|
316
|
+
readonly createdAt?: string;
|
|
317
|
+
readonly arch?: string;
|
|
318
|
+
readonly fs: VMFileSystem;
|
|
319
|
+
private readonly transport;
|
|
320
|
+
constructor(transport: TransportClient, init: VMInit);
|
|
321
|
+
delete(): Promise<void>;
|
|
322
|
+
health(): Promise<AgentHealth>;
|
|
323
|
+
logs(): Promise<VMLogs>;
|
|
324
|
+
waitForAgent(opts?: WaitOptions): Promise<AgentHealth>;
|
|
325
|
+
waitForUserdata(opts?: WaitOptions): Promise<AgentHealth>;
|
|
326
|
+
shutdown(req?: ShutdownRequest): Promise<void>;
|
|
327
|
+
pause(): Promise<void>;
|
|
328
|
+
resume(): Promise<void>;
|
|
329
|
+
relaunch(): Promise<void>;
|
|
330
|
+
/** Mac-only on current daemons. Throws `SlicerAPIError 404` on Linux. */
|
|
331
|
+
suspend(): Promise<void>;
|
|
332
|
+
/** Mac-only on current daemons. Throws `SlicerAPIError 404` on Linux. */
|
|
333
|
+
restore(): Promise<void>;
|
|
334
|
+
/**
|
|
335
|
+
* Streaming exec — yields NDJSON frames (`started`, `stdout`, `stderr`, `exit`).
|
|
336
|
+
* When `req.stdio === 'base64'`, each frame's `data`/`stdout`/`stderr` string
|
|
337
|
+
* fields are preserved as-is (base64-encoded) and the SDK populates decoded
|
|
338
|
+
* `dataBytes`/`stdoutBytes`/`stderrBytes` Buffers alongside for convenience.
|
|
339
|
+
*/
|
|
340
|
+
exec(req: ExecRequest): AsyncGenerator<ExecFrame, void, void>;
|
|
341
|
+
/**
|
|
342
|
+
* Buffered exec via `?buffered=true`. stdin is intentionally unsupported
|
|
343
|
+
* (matches Go SDK `ExecBuffered`); use `exec()` for stdin cases.
|
|
344
|
+
*
|
|
345
|
+
* When `req.stdio === 'base64'`, stdout/stderr are decoded from base64 and
|
|
346
|
+
* returned as `Buffer` — use this for binary output. Otherwise the result
|
|
347
|
+
* carries UTF-8 strings.
|
|
348
|
+
*/
|
|
349
|
+
execBuffered(req: ExecRequest & {
|
|
350
|
+
stdio: 'base64';
|
|
351
|
+
}): Promise<ExecResultBinary>;
|
|
352
|
+
execBuffered(req: ExecRequest): Promise<ExecResult>;
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
/**
|
|
356
|
+
* Top-level namespaces on SlicerClient: hostGroups, vms, secrets.
|
|
357
|
+
* Keep control-plane operations here; per-VM operations live on the VM handle.
|
|
358
|
+
*/
|
|
359
|
+
|
|
360
|
+
declare class HostGroupsAPI {
|
|
361
|
+
private readonly transport;
|
|
362
|
+
constructor(transport: TransportClient);
|
|
363
|
+
list(): Promise<HostGroup[]>;
|
|
364
|
+
/** Convenience lookup (no single-group endpoint exists on the daemon). */
|
|
365
|
+
find(name: string): Promise<HostGroup | undefined>;
|
|
366
|
+
listVMs(name: string, opts?: ListOptions): Promise<VMInfo[]>;
|
|
367
|
+
}
|
|
368
|
+
declare class VMsAPI {
|
|
369
|
+
private readonly transport;
|
|
370
|
+
constructor(transport: TransportClient);
|
|
371
|
+
create(hostGroup: string, req?: CreateVMRequest, opts?: CreateVMOptions): Promise<VM>;
|
|
372
|
+
/**
|
|
373
|
+
* Build a VM handle for an existing VM given its hostgroup + hostname. No
|
|
374
|
+
* request is issued — use `health()` or `getInfo()` to verify reachability.
|
|
375
|
+
*/
|
|
376
|
+
attach(hostGroup: string, hostname: string): VM;
|
|
377
|
+
/** Look up a VM by hostname across all host groups. Returns `undefined` if not found. */
|
|
378
|
+
get(hostname: string): Promise<VM | undefined>;
|
|
379
|
+
/** Return raw VM metadata across all host groups. */
|
|
380
|
+
list(opts?: ListOptions): Promise<VMInfo[]>;
|
|
381
|
+
stats(): Promise<VMStat[]>;
|
|
382
|
+
/**
|
|
383
|
+
* Raw response accessor — bypasses the VM handle. Useful when you only
|
|
384
|
+
* want the create metadata without a handle.
|
|
385
|
+
*/
|
|
386
|
+
createRaw(hostGroup: string, req?: CreateVMRequest, opts?: CreateVMOptions): Promise<CreateVMResponse>;
|
|
387
|
+
}
|
|
388
|
+
declare class SecretsAPI {
|
|
389
|
+
private readonly transport;
|
|
390
|
+
constructor(transport: TransportClient);
|
|
391
|
+
list(): Promise<Secret[]>;
|
|
392
|
+
create(req: CreateSecretRequest): Promise<void>;
|
|
393
|
+
patch(name: string, req: UpdateSecretRequest): Promise<void>;
|
|
394
|
+
delete(name: string): Promise<void>;
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
/**
|
|
398
|
+
* SlicerClient — grouped TypeScript client for the Slicer VM API.
|
|
399
|
+
*
|
|
400
|
+
* Shape:
|
|
401
|
+
* client.hostGroups.list() / find(name) / listVMs(name)
|
|
402
|
+
* client.vms.create(group, req, opts) → VM / get(name) / list() / stats() / attach(group, name)
|
|
403
|
+
* client.secrets.list / create / patch / delete
|
|
404
|
+
* client.getInfo()
|
|
405
|
+
*
|
|
406
|
+
* Per-VM operations live on the `VM` handle returned from `client.vms.create`
|
|
407
|
+
* or `client.vms.attach`: `vm.exec`, `vm.execBuffered`, `vm.fs.*`,
|
|
408
|
+
* `vm.pause/resume/suspend/restore/shutdown/relaunch`, `vm.health/logs`,
|
|
409
|
+
* `vm.waitForAgent/waitForUserdata`, `vm.delete`.
|
|
410
|
+
*/
|
|
411
|
+
|
|
412
|
+
interface SlicerClientOptions extends TransportClientOptions {
|
|
413
|
+
}
|
|
414
|
+
declare class SlicerClient {
|
|
415
|
+
readonly transport: TransportClient;
|
|
416
|
+
readonly hostGroups: HostGroupsAPI;
|
|
417
|
+
readonly vms: VMsAPI;
|
|
418
|
+
readonly secrets: SecretsAPI;
|
|
419
|
+
constructor(opts: SlicerClientOptions);
|
|
420
|
+
static fromEnv(overrides?: Partial<SlicerClientOptions>): SlicerClient;
|
|
421
|
+
getInfo(): Promise<SlicerInfo>;
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
export { type AgentHealth, type CreateSecretRequest, type CreateVMOptions, type CreateVMRequest, type CreateVMResponse, type DeleteResponse, type ExecFrame, type ExecRequest, type ExecResult, type ExecResultBinary, type ExecStdio, ExecStdioBase64, ExecStdioText, type FSEntry, type FSMkdirRequest, GiB, type HostGroup, HostGroupsAPI, type ListOptions, MiB, NonRootUser, type Secret, SecretExistsError, SecretsAPI, type ShutdownRequest, SlicerAPIError, SlicerClient, type SlicerClientOptions, type SlicerInfo, type UpdateSecretRequest, VM, VMFileSystem, type VMInfo, type VMInit, type VMLogs, type VMSnapshot, type VMStat, VMsAPI, type WaitOptions, resolveTransport };
|