@kosa8/sdk 0.1.0 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/checkpoints.ts","../src/errors.ts","../src/transport.ts","../src/client.ts"],"sourcesContent":["export { Kosa8Client, SandboxHandle } from './client.js';\nexport type {\n CallOptions,\n Kosa8ClientOptions,\n CreateSandboxOptions,\n RunOptions,\n ExecOptions,\n ForkOptions,\n ExploreOptions,\n CheckpointOptions,\n CheckpointResult,\n RewindOptions,\n RewindResult,\n RestoreOptions,\n} from './client.js';\nexport {\n Transport,\n resolveEndpoint,\n defaultSocketPath,\n APPROVAL_HEADER,\n ACTOR_HEADER,\n AGENT_TOKEN_HEADER,\n} from './transport.js';\nexport type { Actor, TransportOptions, RequestOptions } from './transport.js';\nexport {\n CheckpointBook,\n FileCheckpointStore,\n MemoryCheckpointStore,\n MAX_CHECKPOINTS_PER_SANDBOX,\n validateSandboxName,\n} from './checkpoints.js';\nexport type { CheckpointStore } from './checkpoints.js';\nexport {\n Kosa8Error,\n Kosa8ConnectionError,\n Kosa8ApiError,\n Kosa8BadRequestError,\n Kosa8AuthError,\n Kosa8PolicyError,\n Kosa8ApprovalRequiredError,\n Kosa8NotFoundError,\n Kosa8ConflictError,\n Kosa8UnsupportedError,\n Kosa8StreamError,\n Kosa8CheckpointError,\n errorFromResponse,\n} from './errors.js';\nexport type { ApprovalRefusal, ApprovalRequirement, ApprovalAction, ApprovalRule } from './errors.js';\nexport type * from './types.js';\n","import { promises as fs } from 'node:fs';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\nimport { Kosa8CheckpointError } from './errors.js';\nimport type { Checkpoint } from './types.js';\n\n/**\n * Checkpoints are client-side bookkeeping over daemon snapshots, exactly as\n * in the kosa8 CLI and MCP server (pkg/checkpoint): a checkpoint is a\n * snapshot with the id `<sandbox>-ckpt-<n>`, and an ordered stack of them per\n * sandbox records labels and order. The daemon itself has no checkpoint\n * endpoint.\n */\n\n/** How many checkpoints are kept per sandbox; the oldest is evicted (pkg/checkpoint MaxPerSandbox). */\nexport const MAX_CHECKPOINTS_PER_SANDBOX = 10;\n\ntype StoreData = Record<string, Checkpoint[]>;\n\n/** Where checkpoint stacks are kept. */\nexport interface CheckpointStore {\n /** Read every stack. */\n load(): Promise<StoreData>;\n /** Run `fn` on the stacks and save what it leaves, serialised against other updates. */\n update<T>(fn: (data: StoreData) => T | Promise<T>): Promise<T>;\n}\n\n/** Reject a name that could escape the store (pkg/checkpoint validSandbox). */\nexport function validateSandboxName(name: string): void {\n if (name === '' || name === '.' || name === '..' || /[/\\\\]/.test(name) || name.startsWith('.')) {\n throw new Kosa8CheckpointError(`invalid sandbox name ${JSON.stringify(name)}`);\n }\n}\n\n/** Keeps stacks in memory only; nothing is shared with the kosa8 CLI. */\nexport class MemoryCheckpointStore implements CheckpointStore {\n private data: StoreData = {};\n private queue: Promise<unknown> = Promise.resolve();\n\n async load(): Promise<StoreData> {\n return structuredClone(this.data);\n }\n\n update<T>(fn: (data: StoreData) => T | Promise<T>): Promise<T> {\n const run = this.queue.then(async () => {\n const copy = structuredClone(this.data);\n const out = await fn(copy);\n this.data = copy;\n return out;\n });\n this.queue = run.catch(() => undefined);\n return run;\n }\n}\n\n/**\n * The store the kosa8 CLI, MCP server and desk use: `~/.kosa8/checkpoints.json`\n * (mode 0600, rewritten atomically). Checkpoints taken through the SDK are\n * therefore visible to `kosa8 rewind` and the other way round.\n *\n * Updates are serialised within this process and between Node processes\n * using this store (an exclusive lock file beside it). The Go tools lock the\n * same file with flock(2), which Node cannot take, so an SDK update that\n * lands in the same instant as a CLI update could lose one record; the\n * snapshots themselves are unaffected.\n */\nexport class FileCheckpointStore implements CheckpointStore {\n readonly path: string;\n private queue: Promise<unknown> = Promise.resolve();\n\n constructor(filePath?: string) {\n this.path = filePath ?? path.join(os.homedir(), '.kosa8', 'checkpoints.json');\n }\n\n async load(): Promise<StoreData> {\n let buf: string;\n try {\n buf = await fs.readFile(this.path, 'utf8');\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') return {};\n throw err;\n }\n try {\n const parsed = JSON.parse(buf) as unknown;\n // A corrupt store must not make the sandbox unusable (as in pkg/checkpoint).\n return parsed && typeof parsed === 'object' ? (parsed as StoreData) : {};\n } catch {\n return {};\n }\n }\n\n update<T>(fn: (data: StoreData) => T | Promise<T>): Promise<T> {\n const run = this.queue.then(() => this.locked(fn));\n this.queue = run.catch(() => undefined);\n return run;\n }\n\n private async locked<T>(fn: (data: StoreData) => T | Promise<T>): Promise<T> {\n await fs.mkdir(path.dirname(this.path), { recursive: true, mode: 0o700 });\n const lock = this.path + '.node.lock';\n const deadline = Date.now() + 10_000;\n for (;;) {\n try {\n const h = await fs.open(lock, 'wx', 0o600);\n await h.close();\n break;\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== 'EEXIST') throw err;\n // A lock older than 30s belongs to a process that died holding it.\n try {\n const st = await fs.stat(lock);\n if (Date.now() - st.mtimeMs > 30_000) {\n await fs.rm(lock, { force: true });\n continue;\n }\n } catch {\n continue;\n }\n if (Date.now() > deadline) throw new Kosa8CheckpointError(`timed out waiting for the checkpoint store lock ${lock}`);\n await new Promise((r) => setTimeout(r, 25));\n }\n }\n try {\n const data = await this.load();\n const out = await fn(data);\n const tmp = this.path + '.tmp';\n await fs.writeFile(tmp, JSON.stringify(data, null, 2), { mode: 0o600 });\n await fs.rename(tmp, this.path);\n return out;\n } finally {\n await fs.rm(lock, { force: true });\n }\n }\n}\n\nfunction seqOf(id: string, sandbox: string): number {\n const pre = sandbox + '-ckpt-';\n if (!id.startsWith(pre)) return 0;\n const m = /^(\\d+)/.exec(id.slice(pre.length));\n return m ? Number(m[1]) : 0;\n}\n\nfunction sorted(list: Checkpoint[]): Checkpoint[] {\n return list\n .map((c, i) => ({ c, i, t: Date.parse(c.created) || 0 }))\n .sort((a, b) => a.t - b.t || a.i - b.i)\n .map((x) => x.c);\n}\n\n/** The stack logic of pkg/checkpoint, over any store. */\nexport class CheckpointBook {\n constructor(readonly store: CheckpointStore) {}\n\n /** The snapshot id the next checkpoint should use, and ids to evict to stay under the cap. */\n async nextId(sandbox: string): Promise<{ id: string; evict: string[] }> {\n validateSandboxName(sandbox);\n const list = (await this.store.load())[sandbox] ?? [];\n let n = list.length + 1;\n for (const c of list) {\n const v = seqOf(c.id, sandbox);\n if (v >= n) n = v + 1;\n }\n const evict: string[] = [];\n const over = list.length + 1 - MAX_CHECKPOINTS_PER_SANDBOX;\n if (over > 0) for (const c of list.slice(0, over)) evict.push(c.id);\n return { id: `${sandbox}-ckpt-${n}`, evict };\n }\n\n async record(c: Omit<Checkpoint, 'created'> & { created?: string }, evicted: string[] = []): Promise<Checkpoint> {\n validateSandboxName(c.sandbox);\n const rec: Checkpoint = {\n id: c.id,\n sandbox: c.sandbox,\n label: c.label ?? '',\n ...(c.auto ? { auto: true } : {}),\n created: c.created ?? new Date().toISOString(),\n };\n await this.store.update((s) => {\n const drop = new Set(evicted);\n s[c.sandbox] = [...(s[c.sandbox] ?? []).filter((e) => !drop.has(e.id)), rec];\n });\n return rec;\n }\n\n async list(sandbox: string): Promise<Checkpoint[]> {\n return sorted([...((await this.store.load())[sandbox] ?? [])]);\n }\n\n async latest(sandbox: string): Promise<Checkpoint> {\n const list = await this.list(sandbox);\n if (list.length === 0) {\n throw new Kosa8CheckpointError(\n `no checkpoints for ${JSON.stringify(sandbox)} — take one with checkpoint() or \\`kosa8 checkpoint ${sandbox}\\``,\n );\n }\n return list[list.length - 1]!;\n }\n\n /** Find by id or (case-insensitive) label, newest match first. */\n async resolve(sandbox: string, ref: string): Promise<Checkpoint> {\n const list = await this.list(sandbox);\n for (let i = list.length - 1; i >= 0; i--) {\n const c = list[i]!;\n if (c.id === ref || c.label.toLowerCase() === ref.toLowerCase()) return c;\n }\n throw new Kosa8CheckpointError(`no checkpoint ${JSON.stringify(ref)} for sandbox ${JSON.stringify(sandbox)}`);\n }\n\n /** Keep `id` as the top of the stack; return the ids taken after it (now meaningless). */\n async pop(sandbox: string, id: string): Promise<string[]> {\n return this.store.update((s) => {\n const list = s[sandbox] ?? [];\n const idx = list.findIndex((c) => c.id === id);\n if (idx < 0) throw new Kosa8CheckpointError(`no checkpoint ${JSON.stringify(id)} for sandbox ${JSON.stringify(sandbox)}`);\n const orphaned = list.slice(idx + 1).map((c) => c.id);\n s[sandbox] = list.slice(0, idx + 1);\n return orphaned;\n });\n }\n\n /** Drop every checkpoint of a sandbox; return the snapshot ids to delete. */\n async forget(sandbox: string): Promise<string[]> {\n return this.store.update((s) => {\n const ids = (s[sandbox] ?? []).map((c) => c.id);\n delete s[sandbox];\n return ids;\n });\n }\n}\n","/**\n * Typed errors. Every error the daemon answers with carries its own words:\n * `daemonMessage` is the daemon's `error` field verbatim, and `remediation`\n * is its `remediation` field (what to do about it). A refusal because the\n * org policy wants signed approvals also carries the refusal itself, under\n * `approval`, exactly as the daemon sent it.\n */\n\n/** An approval rule from the org policy, as the daemon reports it. */\nexport interface ApprovalRule {\n [key: string]: unknown;\n}\n\n/** What the policy requires before an action may run. */\nexport interface ApprovalRequirement {\n policy: string;\n rules: ApprovalRule[];\n}\n\n/** The action a refusal is about. */\nexport interface ApprovalAction {\n kind: string;\n target?: string;\n command?: string[];\n sandbox?: string;\n [key: string]: unknown;\n}\n\n/**\n * The daemon's answer to a call the org policy wants signed approvals for\n * and that did not bring a usable one (pkg/approve Refusal).\n */\nexport interface ApprovalRefusal {\n route: string;\n action: ApprovalAction;\n description: string;\n /** read-only | contained | destructive | escalating */\n class: string;\n policy: string;\n policy_digest: string;\n requirement: ApprovalRequirement;\n /** The approval id the call presented, if any. */\n request_id?: string;\n /** What was wrong: nothing presented, not recorded, used, expired, ... */\n why: string;\n /** People the policy lets approve this action. */\n signers?: string[];\n /** The CLI command that opens a request for exactly this action. */\n request_command: string;\n}\n\nexport interface Kosa8ErrorOptions {\n status?: number;\n daemonMessage?: string;\n remediation?: string;\n method?: string;\n path?: string;\n body?: unknown;\n cause?: unknown;\n}\n\n/** Base class of every error this SDK throws. */\nexport class Kosa8Error extends Error {\n /** HTTP status the daemon answered with, when there was an answer. */\n readonly status?: number;\n /** The daemon's `error` text, verbatim. */\n readonly daemonMessage?: string;\n /** The daemon's `remediation` text: what to do about it. */\n readonly remediation?: string;\n readonly method?: string;\n readonly path?: string;\n /** The decoded response body, when there was one. */\n readonly body?: unknown;\n\n constructor(message: string, options: Kosa8ErrorOptions = {}) {\n super(message, options.cause !== undefined ? { cause: options.cause } : undefined);\n this.name = new.target.name;\n this.status = options.status;\n this.daemonMessage = options.daemonMessage;\n this.remediation = options.remediation;\n this.method = options.method;\n this.path = options.path;\n this.body = options.body;\n }\n}\n\n/** The daemon could not be reached (no socket, connection refused, ...). */\nexport class Kosa8ConnectionError extends Kosa8Error {}\n\n/** The daemon answered with an HTTP error. */\nexport class Kosa8ApiError extends Kosa8Error {}\n\n/** 400: the request was malformed or a value was refused (an egress policy, say). */\nexport class Kosa8BadRequestError extends Kosa8ApiError {}\n\n/** 401: a bearer token (remote worker) or agent token was missing or refused. */\nexport class Kosa8AuthError extends Kosa8ApiError {}\n\n/** 403: refused by policy (org policy, registry allow-list, labels, ...). */\nexport class Kosa8PolicyError extends Kosa8ApiError {}\n\n/**\n * 403 with a signed-approval refusal: the org policy wants people other than\n * the caller to approve this exact action. Get the approval id from a human\n * and repeat the call with `{ approval: id }`.\n */\nexport class Kosa8ApprovalRequiredError extends Kosa8PolicyError {\n readonly approval: ApprovalRefusal;\n constructor(message: string, approval: ApprovalRefusal, options: Kosa8ErrorOptions = {}) {\n super(message, options);\n this.approval = approval;\n }\n}\n\n/** 404: no such sandbox, snapshot, container, ... */\nexport class Kosa8NotFoundError extends Kosa8ApiError {}\n\n/** 409: a conflict, e.g. the sandbox exists but is not running, or a snapshot id is taken. */\nexport class Kosa8ConflictError extends Kosa8ApiError {}\n\n/** 501: the platform cannot do this (sandboxes need macOS on Apple silicon or Linux with KVM). */\nexport class Kosa8UnsupportedError extends Kosa8ApiError {}\n\n/**\n * A streamed operation (run, exec, attach) ended with an error frame rather\n * than an exit code. Output produced before the error is kept.\n */\nexport class Kosa8StreamError extends Kosa8Error {\n readonly stdout: string;\n readonly stderr: string;\n constructor(message: string, out: { stdout: string; stderr: string }, options: Kosa8ErrorOptions = {}) {\n super(message, options);\n this.stdout = out.stdout;\n this.stderr = out.stderr;\n }\n}\n\n/** A client-side checkpoint operation failed (no checkpoint, bad name, ...). */\nexport class Kosa8CheckpointError extends Kosa8Error {}\n\nfunction isRefusal(v: unknown): v is ApprovalRefusal {\n return typeof v === 'object' && v !== null && typeof (v as { why?: unknown }).why === 'string';\n}\n\n/**\n * Build the typed error for an HTTP error answer. The message is the daemon's\n * own, with its remediation in parentheses, the way the kosa8 CLI and MCP\n * server print it.\n */\nexport function errorFromResponse(\n status: number,\n body: unknown,\n ctx: { method?: string; path?: string } = {},\n): Kosa8ApiError {\n let daemonMessage: string | undefined;\n let remediation: string | undefined;\n let approval: unknown;\n if (typeof body === 'object' && body !== null) {\n const b = body as Record<string, unknown>;\n if (typeof b.error === 'string' && b.error !== '') daemonMessage = b.error;\n else if (typeof b.message === 'string' && b.message !== '') daemonMessage = b.message;\n if (typeof b.remediation === 'string' && b.remediation !== '') remediation = b.remediation;\n approval = b.approval;\n } else if (typeof body === 'string' && body.trim() !== '') {\n daemonMessage = body.trim();\n }\n const base = daemonMessage ?? `request failed with HTTP ${status}`;\n const message = remediation ? `${base} (${remediation})` : base;\n const opts: Kosa8ErrorOptions = { status, daemonMessage, remediation, body, ...ctx };\n if (status === 403 && isRefusal(approval)) {\n return new Kosa8ApprovalRequiredError(message, approval, opts);\n }\n switch (status) {\n case 400:\n return new Kosa8BadRequestError(message, opts);\n case 401:\n return new Kosa8AuthError(message, opts);\n case 403:\n return new Kosa8PolicyError(message, opts);\n case 404:\n return new Kosa8NotFoundError(message, opts);\n case 409:\n return new Kosa8ConflictError(message, opts);\n case 501:\n return new Kosa8UnsupportedError(message, opts);\n default:\n return new Kosa8ApiError(message, opts);\n }\n}\n","import * as http from 'node:http';\nimport * as https from 'node:https';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\nimport { Kosa8ConnectionError, Kosa8Error, errorFromResponse } from './errors.js';\nimport type { Frame } from './types.js';\n\n/** Who the audit log should file a request under (pkg/policyd Actor). */\nexport type Actor = 'human' | 'agent' | 'tool';\n\nexport interface TransportOptions {\n /**\n * Unix socket of the daemon. Default: `$HOME/.kosa8/run/kosa8.sock`.\n * Ignored when `host` (or KOSA8_HOST) is set.\n */\n socketPath?: string;\n /**\n * A remote kosa8 worker: `https://host`, `http://host:port`, `tcp://host:port`\n * or a bare `host:port`, the same spellings the kosa8 CLI accepts in\n * KOSA8_HOST. `unix:///path/to.sock` selects a socket. Defaults to the\n * KOSA8_HOST environment variable.\n */\n host?: string;\n /** Bearer token for a remote worker. Defaults to KOSA8_TOKEN when KOSA8_HOST is in use. */\n token?: string;\n /**\n * Allow plain http to a non-loopback host. Off by default, as in the CLI,\n * because the token and every request would cross the network unencrypted.\n * KOSA8_INSECURE=1 also allows it.\n */\n insecure?: boolean;\n /** Sent as X-Kosa8-Actor so the audit log files requests correctly. Default `tool`. */\n actor?: Actor;\n /** Agent identity token (X-Kosa8-Agent-Token). Defaults to KOSA8_AGENT_TOKEN. */\n agentToken?: string;\n /** Extra headers on every request. */\n headers?: Record<string, string>;\n /** Environment to read KOSA8_* variables from. Default `process.env`. */\n env?: Record<string, string | undefined>;\n}\n\nexport interface RequestOptions {\n query?: Record<string, string | number | boolean | undefined>;\n body?: unknown;\n /** A raw (non-JSON) request body, sent as-is; an async iterable is streamed chunked. */\n rawBody?: Uint8Array | string | AsyncIterable<Uint8Array | string>;\n /** Signed-approval id, sent as X-Kosa8-Approval. */\n approval?: string;\n signal?: AbortSignal;\n headers?: Record<string, string>;\n}\n\ntype Endpoint =\n | { kind: 'unix'; socketPath: string }\n | { kind: 'tcp'; url: URL; token?: string };\n\nexport const APPROVAL_HEADER = 'X-Kosa8-Approval';\nexport const ACTOR_HEADER = 'X-Kosa8-Actor';\nexport const AGENT_TOKEN_HEADER = 'X-Kosa8-Agent-Token';\n\n/** The daemon's default socket: $HOME/.kosa8/run/kosa8.sock (pkg/paths). */\nexport function defaultSocketPath(): string {\n return path.join(os.homedir(), '.kosa8', 'run', 'kosa8.sock');\n}\n\nfunction isLoopback(hostname: string): boolean {\n const h = hostname.replace(/^\\[|\\]$/g, '');\n return h === 'localhost' || h === '::1' || /^127\\./.test(h);\n}\n\n/** Resolve where to connect, following the CLI's KOSA8_HOST rules. */\nexport function resolveEndpoint(opts: TransportOptions): Endpoint {\n const env = opts.env ?? process.env;\n const fromEnv = (env.KOSA8_HOST ?? '').trim();\n const raw = (opts.host ?? fromEnv).trim().replace(/\\/+$/, '');\n if (raw === '') {\n return { kind: 'unix', socketPath: opts.socketPath ?? defaultSocketPath() };\n }\n let h = raw;\n const i = h.indexOf('://');\n if (i > 0) h = h.slice(0, i).toLowerCase() + h.slice(i);\n if (h.startsWith('unix://')) {\n return { kind: 'unix', socketPath: h.slice('unix://'.length) };\n }\n if (h.startsWith('tcp://')) h = 'http://' + h.slice('tcp://'.length);\n else if (!h.startsWith('http://') && !h.startsWith('https://')) {\n if (h.includes('://')) {\n throw new Kosa8Error(\n `KOSA8_HOST scheme \"${h.slice(0, h.indexOf('://'))}\" is not supported; use http://, https://, tcp:// or unix://`,\n );\n }\n h = 'http://' + h;\n }\n const url = new URL(h);\n const insecure = opts.insecure === true || env.KOSA8_INSECURE === '1';\n if (url.protocol === 'http:' && !insecure && !isLoopback(url.hostname)) {\n throw new Kosa8Error(\n `refusing to talk to ${url.host} over plain http: the token and every request would cross the network unencrypted. ` +\n `Use https://${url.host} (a worker behind a TLS-terminating tunnel or proxy), or set insecure: true / KOSA8_INSECURE=1 if this link is already private and trusted`,\n );\n }\n const token = opts.token ?? (opts.host === undefined && fromEnv !== '' ? env.KOSA8_TOKEN : undefined);\n return { kind: 'tcp', url, token: token || undefined };\n}\n\nexport interface RawResponse {\n status: number;\n headers: http.IncomingHttpHeaders;\n stream: http.IncomingMessage;\n}\n\n/** HTTP over the daemon's unix socket (or a remote worker). No dependencies. */\nexport class Transport {\n private readonly endpoint: Endpoint;\n private readonly actor: Actor;\n private readonly agentToken?: string;\n private readonly extraHeaders: Record<string, string>;\n\n constructor(opts: TransportOptions = {}) {\n this.endpoint = resolveEndpoint(opts);\n this.actor = opts.actor ?? 'tool';\n const env = opts.env ?? process.env;\n this.agentToken = opts.agentToken ?? (env.KOSA8_AGENT_TOKEN || undefined);\n this.extraHeaders = { ...(opts.headers ?? {}) };\n }\n\n /** Human-readable description of where requests go. */\n get target(): string {\n return this.endpoint.kind === 'unix' ? `unix://${this.endpoint.socketPath}` : this.endpoint.url.origin;\n }\n\n private buildPath(p: string, query?: RequestOptions['query']): string {\n const base = this.endpoint.kind === 'tcp' ? this.endpoint.url.pathname.replace(/\\/+$/, '') : '';\n let out = base + p;\n if (query) {\n const qs = new URLSearchParams();\n for (const [k, v] of Object.entries(query)) {\n if (v === undefined || v === false) continue;\n qs.set(k, v === true ? '1' : String(v));\n }\n const s = qs.toString();\n if (s) out += '?' + s;\n }\n return out;\n }\n\n /** Send a request and return the raw response once headers arrive. */\n raw(method: string, p: string, opts: RequestOptions = {}): Promise<RawResponse> {\n const headers: Record<string, string> = {\n Accept: 'application/json',\n [ACTOR_HEADER]: this.actor,\n ...this.extraHeaders,\n ...(opts.headers ?? {}),\n };\n if (opts.approval && opts.approval.trim() !== '') headers[APPROVAL_HEADER] = opts.approval.trim();\n if (this.agentToken) headers[AGENT_TOKEN_HEADER] = this.agentToken;\n let payload: Buffer | undefined;\n let streamBody: AsyncIterable<Uint8Array | string> | undefined;\n if (opts.rawBody !== undefined) {\n headers['Content-Type'] = 'application/octet-stream';\n if (typeof opts.rawBody === 'string' || opts.rawBody instanceof Uint8Array) {\n payload = Buffer.from(opts.rawBody as Uint8Array);\n headers['Content-Length'] = String(payload.length);\n } else {\n streamBody = opts.rawBody;\n }\n } else if (opts.body !== undefined) {\n payload = Buffer.from(JSON.stringify(opts.body));\n headers['Content-Type'] = 'application/json';\n headers['Content-Length'] = String(payload.length);\n } else if (method !== 'GET' && method !== 'HEAD') {\n headers['Content-Length'] = '0';\n }\n const reqPath = this.buildPath(p, opts.query);\n let reqOpts: http.RequestOptions;\n let mod: typeof http | typeof https = http;\n if (this.endpoint.kind === 'unix') {\n reqOpts = { socketPath: this.endpoint.socketPath, path: reqPath, method, headers: { Host: 'kosa8', ...headers } };\n } else {\n const u = this.endpoint.url;\n if (this.endpoint.token) headers.Authorization = `Bearer ${this.endpoint.token}`;\n mod = u.protocol === 'https:' ? https : http;\n reqOpts = { protocol: u.protocol, hostname: u.hostname, port: u.port || undefined, path: reqPath, method, headers };\n }\n\n return new Promise<RawResponse>((resolve, reject) => {\n const signal = opts.signal;\n if (signal?.aborted) {\n reject(signal.reason ?? new DOMException('Aborted', 'AbortError'));\n return;\n }\n const req = mod.request(reqOpts, (res) => {\n resolve({ status: res.statusCode ?? 0, headers: res.headers, stream: res });\n });\n const onAbort = () => {\n req.destroy(signal?.reason instanceof Error ? signal.reason : new DOMException('Aborted', 'AbortError'));\n };\n signal?.addEventListener('abort', onAbort, { once: true });\n req.on('close', () => signal?.removeEventListener('abort', onAbort));\n req.on('error', (err: NodeJS.ErrnoException) => {\n if (signal?.aborted) {\n reject(signal.reason ?? err);\n return;\n }\n reject(\n new Kosa8ConnectionError(\n `kosa8 daemon unreachable at ${this.target}: ${err.message}` +\n (err.code === 'ENOENT' || err.code === 'ECONNREFUSED'\n ? ' (is kosa8 installed and its daemon running? start it with `kosa8 daemon start`)'\n : ''),\n { method, path: p, cause: err },\n ),\n );\n });\n if (streamBody) {\n const src = streamBody;\n void (async () => {\n try {\n for await (const chunk of src) {\n if (!req.write(chunk)) await new Promise((r) => req.once('drain', r));\n }\n req.end();\n } catch (err) {\n req.destroy(err as Error);\n }\n })();\n return;\n }\n if (payload) req.write(payload);\n req.end();\n });\n }\n\n /** Send a request and decode a JSON answer; HTTP errors become typed errors. */\n async json<T>(method: string, p: string, opts: RequestOptions = {}): Promise<T> {\n const res = await this.raw(method, p, opts);\n const text = (await readAll(res.stream, opts.signal)).toString('utf8');\n let body: unknown = undefined;\n if (text.trim() !== '') {\n try {\n body = JSON.parse(text);\n } catch {\n body = text;\n }\n }\n if (res.status >= 400) throw errorFromResponse(res.status, body, { method, path: p });\n return body as T;\n }\n\n /**\n * Send a request whose answer is a stream of NDJSON frames (run, exec,\n * attach). HTTP errors (a refusal before streaming began) become typed\n * errors; each frame's base64 `data` is decoded to a Buffer.\n */\n async *frames(method: string, p: string, opts: RequestOptions = {}): AsyncGenerator<Frame> {\n const res = await this.raw(method, p, opts);\n if (res.status >= 400) {\n const text = (await readAll(res.stream, opts.signal)).toString('utf8');\n let body: unknown = text;\n try {\n body = JSON.parse(text);\n } catch {\n /* keep text */\n }\n throw errorFromResponse(res.status, body, { method, path: p });\n }\n let buf = '';\n try {\n for await (const chunk of res.stream) {\n buf += (chunk as Buffer).toString('utf8');\n let nl: number;\n while ((nl = buf.indexOf('\\n')) >= 0) {\n const line = buf.slice(0, nl).trim();\n buf = buf.slice(nl + 1);\n if (line !== '') yield decodeFrame(line);\n }\n }\n } catch (err) {\n if (opts.signal?.aborted) throw opts.signal.reason ?? err;\n throw err;\n } finally {\n res.stream.destroy();\n }\n const rest = buf.trim();\n if (rest !== '') yield decodeFrame(rest);\n }\n}\n\nfunction decodeFrame(line: string): Frame {\n const f = JSON.parse(line) as Record<string, unknown>;\n const out: Frame = { ...f } as Frame;\n if (typeof f.data === 'string') out.data = Buffer.from(f.data, 'base64');\n return out;\n}\n\nasync function readAll(stream: http.IncomingMessage, signal?: AbortSignal): Promise<Buffer> {\n const chunks: Buffer[] = [];\n try {\n for await (const c of stream) chunks.push(c as Buffer);\n } catch (err) {\n if (signal?.aborted) throw signal.reason ?? err;\n throw err;\n }\n return Buffer.concat(chunks);\n}\n","import { CheckpointBook, FileCheckpointStore, type CheckpointStore } from './checkpoints.js';\nimport { Kosa8Error, Kosa8StreamError } from './errors.js';\nimport { Transport, type TransportOptions } from './transport.js';\nimport type {\n BrokerSpec,\n CaptureSpec,\n Checkpoint,\n Container,\n CreateSandboxResult,\n DeleteSandboxResult,\n DeleteSnapshotResult,\n EgressPolicy,\n EgressStatus,\n ExecResult,\n ExploreBranch,\n ExploreResult,\n ForkResult,\n Frame,\n Health,\n Mount,\n RestoreResult,\n Sandbox,\n Snapshot,\n SnapshotSandboxResult,\n StartSandboxResult,\n StopSandboxResult,\n} from './types.js';\n\n/** Options every call accepts. */\nexport interface CallOptions {\n /**\n * Id of a recorded signed approval for this exact action, sent as\n * X-Kosa8-Approval. Needed only when the org policy requires one; a\n * refusal (Kosa8ApprovalRequiredError) says how a human gets it.\n */\n approval?: string;\n signal?: AbortSignal;\n}\n\nexport interface Kosa8ClientOptions extends TransportOptions {\n /**\n * Where checkpoint stacks are kept. Default: the kosa8 CLI's own store,\n * `~/.kosa8/checkpoints.json`, so `kosa8 rewind` sees SDK checkpoints.\n */\n checkpointStore?: CheckpointStore;\n}\n\nexport interface CreateSandboxOptions extends CallOptions {\n /** Sandbox name; the daemon generates one when omitted. */\n name?: string;\n cpus?: number;\n memMb?: number;\n /** Data disk in GB (holds images and everything written inside). 0 = daemon default. */\n diskGb?: number;\n mounts?: Mount[];\n /**\n * Network policy: `'deny'`, `'any'`, `'fakenet'`, `'allow:a.com,b.com'` or\n * `{ allow: ['a.com', '*.b.com', '10.0.0.0/8'] }`. When omitted the daemon\n * applies the org policy's default egress, else `any`.\n */\n egress?: EgressPolicy;\n /** Shorthand for `egress: { allow: [...] }`. */\n egressAllow?: readonly string[];\n /** Start a packet capture from the first frame. */\n capture?: CaptureSpec;\n labels?: Record<string, string>;\n /** Put the sandbox behind an egress broker that adds credentials it never holds. */\n broker?: BrokerSpec;\n}\n\nexport interface RunOptions extends CallOptions {\n env?: Record<string, string> | string[];\n onStdout?: (chunk: Buffer) => void;\n onStderr?: (chunk: Buffer) => void;\n /** Progress lines the daemon emits (e.g. \"pulling alpine\"). */\n onStatus?: (chunk: Buffer) => void;\n}\n\nexport interface ExecOptions extends CallOptions {\n onStdout?: (chunk: Buffer) => void;\n onStderr?: (chunk: Buffer) => void;\n}\n\nexport interface ForkOptions extends CallOptions {\n /** Number of copies (default 1). */\n n?: number;\n /** Name prefix; copies are named `<prefix>1`, `<prefix>2`, ... (default `<sandbox>-fork`). */\n prefix?: string;\n /** Raise the copies' classification label above the parent's. */\n label?: string;\n}\n\nexport interface ExploreOptions extends CallOptions {\n /** Shell commands, one per branch (at least two). */\n variants: string[];\n /** Image the variants run in (default `alpine:latest`). */\n image?: string;\n /** Keep every branch instead of only the winner. */\n keepAll?: boolean;\n /** Keep this branch (by id) instead of the winner. */\n keep?: string;\n /** Per-branch time limit in ms (default 120000). */\n timeoutMs?: number;\n /** Branch name prefix (default `<sandbox>-explore-<n>`). */\n prefix?: string;\n /**\n * Pull `image` into the parent sandbox before forking so every branch has\n * it (a sandbox's engine does not pull on run). Default true.\n */\n pull?: boolean;\n}\n\nexport interface CheckpointOptions extends CallOptions {\n /** Why it is being taken, e.g. \"before the migration\". */\n label?: string;\n}\n\nexport interface CheckpointResult {\n checkpoint: Checkpoint;\n /** Older checkpoints dropped to stay under the cap of 10. */\n evicted: string[];\n snapshot: SnapshotSandboxResult;\n}\n\nexport interface RewindOptions extends CallOptions {\n /** Checkpoint id or label (default: the most recent). */\n to?: string;\n}\n\nexport interface RewindResult {\n sandbox: Sandbox;\n checkpoint: Checkpoint;\n /** Checkpoints taken after the one returned to, now deleted. */\n dropped: string[];\n restore_ms: number;\n}\n\nexport interface RestoreOptions extends CallOptions {\n /** Name for the restored sandbox. */\n name?: string;\n /** Raise the restored sandbox's classification label. */\n label?: string;\n /** Restore a sealed snapshot whose seal does not verify (recorded in the audit log). */\n allowTampered?: boolean;\n}\n\nfunction egressString(egress?: EgressPolicy, allow?: readonly string[]): string | undefined {\n if (allow && allow.length > 0) {\n if (egress !== undefined && egress !== 'deny') {\n throw new Kosa8Error('egressAllow already limits the network to the hosts it lists; do not also set egress');\n }\n return 'allow:' + allow.map((h) => h.trim()).join(',');\n }\n if (egress === undefined) return undefined;\n if (typeof egress === 'string') return egress;\n if (egress.allow.length === 0) {\n throw new Kosa8Error('an egress allow-list needs at least one host; use egress: \"deny\" for no network');\n }\n return 'allow:' + egress.allow.map((h) => h.trim()).join(',');\n}\n\nfunction envList(env?: Record<string, string> | string[]): string[] | undefined {\n if (!env) return undefined;\n if (Array.isArray(env)) return env;\n return Object.entries(env).map(([k, v]) => `${k}=${v}`);\n}\n\nconst enc = encodeURIComponent;\n\n/**\n * Typed client for the kosa8 native API over the daemon's unix socket.\n *\n * ```ts\n * const kosa8 = new Kosa8Client();\n * const { sandbox } = await kosa8.createSandbox({ name: 'demo', egress: 'deny' });\n * ```\n */\nexport class Kosa8Client {\n readonly transport: Transport;\n readonly checkpoints: CheckpointBook;\n\n constructor(options: Kosa8ClientOptions = {}) {\n this.transport = new Transport(options);\n this.checkpoints = new CheckpointBook(options.checkpointStore ?? new FileCheckpointStore());\n }\n\n // --- status ---------------------------------------------------------------\n\n /** GET /kosa8/v1/health: daemon status and version. */\n health(opts: CallOptions = {}): Promise<Health> {\n return this.transport.json<Health>('GET', '/kosa8/v1/health', opts);\n }\n\n /** The daemon's version string. */\n async version(opts: CallOptions = {}): Promise<string> {\n return (await this.health(opts)).version;\n }\n\n // --- host engine ------------------------------------------------------------\n\n /** POST /kosa8/v1/pull: pull an image into the host engine (checked against the registry allow-list). */\n pull(ref: string, opts: CallOptions = {}): Promise<{ ok: boolean; image: string }> {\n return this.transport.json('POST', '/kosa8/v1/pull', { ...opts, body: { ref } });\n }\n\n // --- sandboxes ---------------------------------------------------------------\n\n /** GET /kosa8/v1/sandboxes */\n listSandboxes(opts: CallOptions = {}): Promise<Sandbox[]> {\n return this.transport.json<Sandbox[]>('GET', '/kosa8/v1/sandboxes', opts);\n }\n\n /** Find one sandbox by id or name (from the list; there is no single-sandbox GET). */\n async getSandbox(idOrName: string, opts: CallOptions = {}): Promise<Sandbox | undefined> {\n const list = await this.listSandboxes(opts);\n return list.find((s) => s.id === idOrName) ?? list.find((s) => s.name === idOrName);\n }\n\n /** POST /kosa8/v1/sandboxes: boot a microVM sandbox. */\n async createSandbox(options: CreateSandboxOptions = {}): Promise<CreateSandboxResult> {\n const body: Record<string, unknown> = {};\n if (options.name) body.name = options.name;\n if (options.cpus) body.cpus = options.cpus;\n if (options.memMb) body.mem_mb = options.memMb;\n if (options.diskGb) body.disk_gb = options.diskGb;\n if (options.mounts) body.mounts = options.mounts;\n const egress = egressString(options.egress, options.egressAllow);\n if (egress !== undefined) body.egress = egress;\n if (options.capture) body.capture = options.capture;\n if (options.labels) body.labels = options.labels;\n if (options.broker) body.broker = options.broker;\n return this.transport.json('POST', '/kosa8/v1/sandboxes', {\n body,\n approval: options.approval,\n signal: options.signal,\n });\n }\n\n /** POST /kosa8/v1/sandboxes/{id}/up: boot a stopped sandbox from its own disk. */\n startSandbox(id: string, opts: CallOptions = {}): Promise<StartSandboxResult> {\n return this.transport.json('POST', `/kosa8/v1/sandboxes/${enc(id)}/up`, opts);\n }\n\n /** POST /kosa8/v1/sandboxes/{id}/down: stop without deleting (disk kept). */\n stopSandbox(id: string, opts: CallOptions = {}): Promise<StopSandboxResult> {\n return this.transport.json('POST', `/kosa8/v1/sandboxes/${enc(id)}/down`, opts);\n }\n\n /**\n * DELETE /kosa8/v1/sandboxes/{id}. Like `kosa8 sandbox rm`, the sandbox's\n * checkpoints and their snapshots are dropped too unless\n * `keepCheckpoints` is set.\n */\n async deleteSandbox(\n id: string,\n opts: CallOptions & { wipe?: boolean; keepCheckpoints?: boolean } = {},\n ): Promise<DeleteSandboxResult & { checkpoints_dropped: number }> {\n const out = await this.transport.json<DeleteSandboxResult>('DELETE', `/kosa8/v1/sandboxes/${enc(id)}`, {\n query: { wipe: opts.wipe },\n approval: opts.approval,\n signal: opts.signal,\n });\n let dropped = 0;\n if (!opts.keepCheckpoints) {\n try {\n const ids = await this.checkpoints.forget(id);\n for (const sid of ids) {\n await this.deleteSnapshot(sid, { wipe: opts.wipe, approval: opts.approval }).catch(() => undefined);\n }\n dropped = ids.length;\n } catch {\n /* bookkeeping debris, not a failed delete */\n }\n }\n return { ...out, checkpoints_dropped: dropped };\n }\n\n /** POST /kosa8/v1/sandboxes/{id}/pull: pull an image into the sandbox's private engine (fetched on the host). */\n pullIntoSandbox(id: string, ref: string, opts: CallOptions = {}): Promise<{ ok: boolean; image: string }> {\n return this.transport.json('POST', `/kosa8/v1/sandboxes/${enc(id)}/pull`, { ...opts, body: { ref } });\n }\n\n /** GET /kosa8/v1/sandboxes/{id}/images */\n sandboxImages(id: string, opts: CallOptions = {}): Promise<string[]> {\n return this.transport.json('GET', `/kosa8/v1/sandboxes/${enc(id)}/images`, opts);\n }\n\n /** GET /kosa8/v1/sandboxes/{id}/containers */\n sandboxContainers(id: string, opts: CallOptions = {}): Promise<Container[]> {\n return this.transport.json('GET', `/kosa8/v1/sandboxes/${enc(id)}/containers`, opts);\n }\n\n /** GET /kosa8/v1/sandboxes/{id}/egress: the policy the host enforces and what it decided. */\n sandboxEgress(id: string, opts: CallOptions = {}): Promise<EgressStatus> {\n return this.transport.json('GET', `/kosa8/v1/sandboxes/${enc(id)}/egress`, opts);\n }\n\n /**\n * POST /kosa8/v1/sandboxes/{id}/run: run a container to completion inside\n * the sandbox's engine. The image must already be in the sandbox\n * (`pullIntoSandbox`). Resolves with the exit code; a non-zero exit is not\n * an error.\n */\n run(id: string, image: string, args: string[] = [], opts: RunOptions = {}): Promise<ExecResult> {\n return this.collect(\n this.transport.frames('POST', `/kosa8/v1/sandboxes/${enc(id)}/run`, {\n body: { image, args, env: envList(opts.env) },\n approval: opts.approval,\n signal: opts.signal,\n }),\n opts,\n );\n }\n\n /** POST /kosa8/v1/sandboxes/{id}/start: start a detached container; resolves with its id. */\n async startContainer(id: string, image: string, args: string[] = [], opts: CallOptions = {}): Promise<string> {\n const out = await this.transport.json<{ ok: boolean; id: string }>('POST', `/kosa8/v1/sandboxes/${enc(id)}/start`, {\n ...opts,\n body: { image, args },\n });\n return out.id;\n }\n\n /** POST /kosa8/v1/sandboxes/{id}/exec: run a command in a running container of the sandbox. */\n exec(id: string, container: string, args: string[], opts: ExecOptions = {}): Promise<ExecResult> {\n return this.collect(this.execFrames(id, container, args, opts), opts);\n }\n\n /** The raw frame stream of an exec, for callers that want to process output as it arrives. */\n execFrames(id: string, container: string, args: string[], opts: CallOptions = {}): AsyncGenerator<Frame> {\n return this.transport.frames('POST', `/kosa8/v1/sandboxes/${enc(id)}/exec`, {\n body: { container, args },\n approval: opts.approval,\n signal: opts.signal,\n });\n }\n\n /** POST /kosa8/v1/sandboxes/{id}/start-interactive: start a container with stdin held open. */\n async startInteractive(\n id: string,\n image: string,\n args: string[] = [],\n opts: CallOptions & { env?: Record<string, string> | string[]; tty?: boolean } = {},\n ): Promise<string> {\n const out = await this.transport.json<{ ok: boolean; id: string }>(\n 'POST',\n `/kosa8/v1/sandboxes/${enc(id)}/start-interactive`,\n { body: { image, args, env: envList(opts.env), tty: opts.tty ?? false }, approval: opts.approval, signal: opts.signal },\n );\n return out.id;\n }\n\n /** POST /kosa8/v1/sandboxes/{id}/containers/{cid}/stdin: stream bytes into an interactive container's stdin. */\n writeStdin(\n id: string,\n container: string,\n data: Uint8Array | string | AsyncIterable<Uint8Array | string>,\n opts: CallOptions = {},\n ): Promise<{ ok: boolean }> {\n return this.transport.json('POST', `/kosa8/v1/sandboxes/${enc(id)}/containers/${enc(container)}/stdin`, {\n ...opts,\n rawBody: data,\n });\n }\n\n /** POST /kosa8/v1/sandboxes/{id}/containers/{cid}/attach: follow a container's output until it exits. */\n attach(id: string, container: string, opts: ExecOptions = {}): Promise<ExecResult> {\n return this.collect(\n this.transport.frames('POST', `/kosa8/v1/sandboxes/${enc(id)}/containers/${enc(container)}/attach`, {\n approval: opts.approval,\n signal: opts.signal,\n }),\n opts,\n );\n }\n\n // --- snapshots, fork, explore -------------------------------------------------\n\n /** POST /kosa8/v1/sandboxes/{id}/snapshot: capture memory, processes and disks. */\n snapshot(id: string, opts: CallOptions & { id?: string; encrypt?: boolean } = {}): Promise<SnapshotSandboxResult> {\n const body: Record<string, unknown> = {};\n if (opts.id) body.id = opts.id;\n if (opts.encrypt) body.encrypt = true;\n return this.transport.json('POST', `/kosa8/v1/sandboxes/${enc(id)}/snapshot`, {\n body,\n approval: opts.approval,\n signal: opts.signal,\n });\n }\n\n /** GET /kosa8/v1/snapshots */\n listSnapshots(opts: CallOptions = {}): Promise<Snapshot[]> {\n return this.transport.json('GET', '/kosa8/v1/snapshots', opts);\n }\n\n /** POST /kosa8/v1/snapshots/{id}/restore: boot a sandbox from a snapshot, processes resumed. */\n restoreSnapshot(snapshotId: string, opts: RestoreOptions = {}): Promise<RestoreResult> {\n const body: Record<string, unknown> = {};\n if (opts.name) body.name = opts.name;\n if (opts.label) body.label = opts.label;\n if (opts.allowTampered) body.allow_tampered = true;\n return this.transport.json('POST', `/kosa8/v1/snapshots/${enc(snapshotId)}/restore`, {\n body,\n approval: opts.approval,\n signal: opts.signal,\n });\n }\n\n /** DELETE /kosa8/v1/snapshots/{id} */\n deleteSnapshot(\n snapshotId: string,\n opts: CallOptions & { wipe?: boolean; force?: boolean } = {},\n ): Promise<DeleteSnapshotResult> {\n return this.transport.json('DELETE', `/kosa8/v1/snapshots/${enc(snapshotId)}`, {\n query: { wipe: opts.wipe, force: opts.force },\n approval: opts.approval,\n signal: opts.signal,\n });\n }\n\n /** POST /kosa8/v1/sandboxes/{id}/fork: N live copies of a running sandbox. */\n fork(id: string, opts: ForkOptions = {}): Promise<ForkResult> {\n const body: Record<string, unknown> = { n: opts.n ?? 1 };\n if (opts.prefix) body.prefix = opts.prefix;\n if (opts.label) body.label = opts.label;\n return this.transport.json('POST', `/kosa8/v1/sandboxes/${enc(id)}/fork`, {\n body,\n approval: opts.approval,\n signal: opts.signal,\n });\n }\n\n /**\n * Best-of-N, as `kosa8 explore`: fork the sandbox once per variant, run\n * each variant (`sh -c VARIANT` in `image`) in its own branch\n * concurrently, keep the fastest successful branch and delete the rest.\n */\n async explore(id: string, opts: ExploreOptions): Promise<ExploreResult> {\n const variants = opts.variants ?? [];\n if (variants.length < 2) {\n throw new Kosa8Error('give at least two variants; with one there is nothing to compare');\n }\n const image = opts.image ?? 'alpine:latest';\n const call = { approval: opts.approval, signal: opts.signal };\n if (opts.pull !== false) await this.pullIntoSandbox(id, image, call);\n const prefix = opts.prefix ?? `${id}-explore-${Math.floor(Date.now() / 1000) % 100000}`;\n const forked = await this.fork(id, { n: variants.length, prefix, ...call });\n const names = forked.forks.map((f) => f.id).filter((x): x is string => typeof x === 'string');\n if (names.length < variants.length) {\n throw new Kosa8Error(`forked ${names.length} branches for ${variants.length} variants; see listSandboxes() for what was created`);\n }\n const timeoutMs = opts.timeoutMs ?? 120_000;\n const branches = await Promise.all(\n variants.map((v, i) => this.runBranch(names[i]!, image, v, timeoutMs, opts)),\n );\n let winner = '';\n let best = Infinity;\n for (const b of branches) {\n if (!b.error && b.exit === 0 && b.duration_ms < best) {\n winner = b.name;\n best = b.duration_ms;\n }\n }\n if (opts.keep !== undefined) {\n if (!names.includes(opts.keep)) {\n throw new Kosa8Error(`keep ${opts.keep} is not one of the branches (${names.join(', ')}); all of them were kept`);\n }\n winner = opts.keep;\n }\n let removed = 0;\n if (!opts.keepAll) {\n for (const b of branches) {\n if (b.name !== winner) {\n try {\n await this.transport.json('DELETE', `/kosa8/v1/sandboxes/${enc(b.name)}`, { approval: opts.approval });\n removed++;\n } catch {\n /* reported by the count */\n }\n }\n }\n }\n return { parent: id, branches, winner, removed };\n }\n\n private async runBranch(\n name: string,\n image: string,\n variant: string,\n timeoutMs: number,\n opts: CallOptions,\n ): Promise<ExploreBranch> {\n const start = Date.now();\n const r: ExploreBranch = { name, variant, exit: 0, output: '', duration_ms: 0 };\n // A freshly restored branch can refuse the first connection while its\n // engine settles; retry connection-level failures briefly, as the CLI does.\n for (let attempt = 0; attempt < 4; attempt++) {\n const ctl = new AbortController();\n const timer = setTimeout(() => ctl.abort(new Error(`branch timed out after ${timeoutMs}ms`)), timeoutMs);\n const onAbort = () => ctl.abort(opts.signal?.reason);\n opts.signal?.addEventListener('abort', onAbort, { once: true });\n try {\n let out = '';\n const res = await this.run(name, image, ['sh', '-c', variant], {\n approval: opts.approval,\n signal: ctl.signal,\n onStdout: (c) => (out += c.toString('utf8')),\n onStderr: (c) => (out += c.toString('utf8')),\n });\n r.exit = res.exitCode;\n r.output = out.replace(/\\n+$/, '');\n delete r.error;\n break;\n } catch (err) {\n r.error = err instanceof Error ? err.message : String(err);\n if (err instanceof Kosa8StreamError) r.output = (err.stdout + err.stderr).replace(/\\n+$/, '');\n const transient = /connection refused|EOF|connection reset|broken pipe|no such file or directory|stream ended|ECONNREFUSED|ECONNRESET|socket hang up/i.test(\n r.error,\n );\n if (!transient || ctl.signal.aborted) break;\n await new Promise((res) => setTimeout(res, (attempt + 1) * 500));\n } finally {\n clearTimeout(timer);\n opts.signal?.removeEventListener('abort', onAbort);\n }\n }\n r.duration_ms = Date.now() - start;\n return r;\n }\n\n // --- checkpoints (client-side over snapshots, as pkg/checkpoint) ---------------\n\n /**\n * Save a restore point: a snapshot with id `<sandbox>-ckpt-<n>`, recorded on\n * the sandbox's checkpoint stack (the same store `kosa8 checkpoint` uses).\n * The oldest is evicted past 10.\n */\n async checkpoint(sandbox: string, opts: CheckpointOptions = {}): Promise<CheckpointResult> {\n const { id, evict } = await this.checkpoints.nextId(sandbox);\n const snap = await this.snapshot(sandbox, { id, approval: opts.approval, signal: opts.signal });\n // Evict only once the replacement exists.\n for (const old of evict) {\n await this.deleteSnapshot(old, { approval: opts.approval }).catch(() => undefined);\n }\n const checkpoint = await this.checkpoints.record({ id, sandbox, label: opts.label ?? '' }, evict);\n return { checkpoint, evicted: evict, snapshot: snap };\n }\n\n /** A sandbox's restore points, oldest first. */\n listCheckpoints(sandbox: string): Promise<Checkpoint[]> {\n return this.checkpoints.list(sandbox);\n }\n\n /**\n * Undo: put the sandbox back to a checkpoint under the same name, processes\n * resumed. Deletes the sandbox, then restores the snapshot with its name;\n * checkpoints taken after the target are discarded. Current state is lost.\n */\n async rewind(sandbox: string, opts: RewindOptions = {}): Promise<RewindResult> {\n const target = opts.to ? await this.checkpoints.resolve(sandbox, opts.to) : await this.checkpoints.latest(sandbox);\n const call = { approval: opts.approval, signal: opts.signal };\n // The sandbox must go first: the restored VM takes its name. A refusal\n // here (policy, approval) leaves everything as it was, and is thrown as is.\n await this.transport.json('DELETE', `/kosa8/v1/sandboxes/${enc(sandbox)}`, call);\n let restored: RestoreResult;\n try {\n restored = await this.restoreSnapshot(target.id, { name: sandbox, ...call });\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n throw new Kosa8Error(\n `restore failed and ${sandbox} is now stopped: ${msg} — recover with restoreSnapshot(${JSON.stringify(target.id)}, { name: ${JSON.stringify(sandbox)} })`,\n { cause: err },\n );\n }\n let dropped: string[] = [];\n try {\n dropped = await this.checkpoints.pop(sandbox, target.id);\n for (const sid of dropped) await this.deleteSnapshot(sid, { approval: opts.approval }).catch(() => undefined);\n } catch {\n /* bookkeeping */\n }\n return { sandbox: restored.sandbox, checkpoint: target, dropped, restore_ms: restored.restore_ms };\n }\n\n // --- helpers -------------------------------------------------------------------\n\n /** A handle bound to one sandbox. */\n sandbox(id: string): SandboxHandle {\n return new SandboxHandle(this, id);\n }\n\n private async collect(\n frames: AsyncGenerator<Frame>,\n opts: { onStdout?: (c: Buffer) => void; onStderr?: (c: Buffer) => void; onStatus?: (c: Buffer) => void },\n ): Promise<ExecResult> {\n const out: Buffer[] = [];\n const err: Buffer[] = [];\n for await (const f of frames) {\n if (f.done) {\n const stdoutBytes = Buffer.concat(out);\n const stderrBytes = Buffer.concat(err);\n if (f.error) {\n throw new Kosa8StreamError(f.error, {\n stdout: stdoutBytes.toString('utf8'),\n stderr: stderrBytes.toString('utf8'),\n }, { daemonMessage: f.error });\n }\n return {\n exitCode: typeof f.exit === 'number' ? f.exit : 0,\n stdout: stdoutBytes.toString('utf8'),\n stderr: stderrBytes.toString('utf8'),\n stdoutBytes,\n stderrBytes,\n };\n }\n if (!f.data) continue;\n if (f.stream === 'stderr') {\n err.push(f.data);\n opts.onStderr?.(f.data);\n } else if (f.stream === 'status') {\n opts.onStatus?.(f.data);\n } else {\n out.push(f.data);\n opts.onStdout?.(f.data);\n }\n }\n throw new Kosa8StreamError('stream ended unexpectedly (no final frame)', {\n stdout: Buffer.concat(out).toString('utf8'),\n stderr: Buffer.concat(err).toString('utf8'),\n });\n }\n}\n\n/** Convenience wrapper: the client's sandbox methods bound to one sandbox id. */\nexport class SandboxHandle {\n constructor(\n readonly client: Kosa8Client,\n readonly id: string,\n ) {}\n\n info(opts?: CallOptions) {\n return this.client.getSandbox(this.id, opts);\n }\n start(opts?: CallOptions) {\n return this.client.startSandbox(this.id, opts);\n }\n stop(opts?: CallOptions) {\n return this.client.stopSandbox(this.id, opts);\n }\n delete(opts?: CallOptions & { wipe?: boolean; keepCheckpoints?: boolean }) {\n return this.client.deleteSandbox(this.id, opts);\n }\n pull(ref: string, opts?: CallOptions) {\n return this.client.pullIntoSandbox(this.id, ref, opts);\n }\n run(image: string, args?: string[], opts?: RunOptions) {\n return this.client.run(this.id, image, args, opts);\n }\n startContainer(image: string, args?: string[], opts?: CallOptions) {\n return this.client.startContainer(this.id, image, args, opts);\n }\n exec(container: string, args: string[], opts?: ExecOptions) {\n return this.client.exec(this.id, container, args, opts);\n }\n containers(opts?: CallOptions) {\n return this.client.sandboxContainers(this.id, opts);\n }\n images(opts?: CallOptions) {\n return this.client.sandboxImages(this.id, opts);\n }\n egress(opts?: CallOptions) {\n return this.client.sandboxEgress(this.id, opts);\n }\n snapshot(opts?: CallOptions & { id?: string; encrypt?: boolean }) {\n return this.client.snapshot(this.id, opts);\n }\n fork(opts?: ForkOptions) {\n return this.client.fork(this.id, opts);\n }\n explore(opts: ExploreOptions) {\n return this.client.explore(this.id, opts);\n }\n checkpoint(opts?: CheckpointOptions) {\n return this.client.checkpoint(this.id, opts);\n }\n checkpoints() {\n return this.client.listCheckpoints(this.id);\n }\n rewind(opts?: RewindOptions) {\n return this.client.rewind(this.id, opts);\n }\n}\n"],"mappings":"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","names":["fs","os","path"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/checkpoints.ts","../src/errors.ts","../src/tar.ts","../src/transport.ts","../src/client.ts","../src/cloud.ts"],"sourcesContent":["export { Kosa8Client, SandboxHandle } from './client.js';\nexport type {\n CallOptions,\n Kosa8ClientOptions,\n CreateSandboxOptions,\n RunOptions,\n ExecOptions,\n ForkOptions,\n ExploreOptions,\n CheckpointOptions,\n CheckpointResult,\n RewindOptions,\n RewindResult,\n RestoreOptions,\n RunCodeOptions,\n WriteFileOptions,\n GitOptions,\n GitCommitOptions,\n CreateSessionOptions,\n SessionExecOptions,\n ShellOptions,\n StartPtyOptions,\n CreatePreviewOptions,\n SetLifecycleOptions,\n BuildTemplateOptions,\n} from './client.js';\nexport { tarContext } from './tar.js';\nexport {\n Transport,\n resolveEndpoint,\n defaultSocketPath,\n defaultWorkerFile,\n APPROVAL_HEADER,\n ACTOR_HEADER,\n AGENT_TOKEN_HEADER,\n} from './transport.js';\nexport type { Actor, TransportOptions, RequestOptions } from './transport.js';\nexport {\n CheckpointBook,\n FileCheckpointStore,\n MemoryCheckpointStore,\n MAX_CHECKPOINTS_PER_SANDBOX,\n validateSandboxName,\n} from './checkpoints.js';\nexport type { CheckpointStore } from './checkpoints.js';\nexport {\n Kosa8Error,\n Kosa8ConnectionError,\n Kosa8TimeoutError,\n Kosa8ApiError,\n Kosa8BadRequestError,\n Kosa8AuthError,\n Kosa8PolicyError,\n Kosa8ApprovalRequiredError,\n Kosa8NotFoundError,\n Kosa8ConflictError,\n Kosa8UnsupportedError,\n Kosa8StreamError,\n Kosa8CheckpointError,\n Kosa8PaymentRequiredError,\n Kosa8RateLimitError,\n errorFromResponse,\n} from './errors.js';\nexport type { ApprovalRefusal, ApprovalRequirement, ApprovalAction, ApprovalRule } from './errors.js';\nexport type * from './types.js';\nexport { Kosa8Cloud, CloudSandbox, CloudSandboxes, CloudFunctions, DEFAULT_CLOUD_URL, CLOUD_KEY_PREFIX } from './cloud.js';\nexport type {\n Kosa8CloudOptions,\n CloudSandboxInfo,\n CloudCreateOptions,\n CloudExecOptions,\n CloudExecResult,\n CloudInvokeResult,\n CloudInvocation,\n CloudFunctionSpec,\n} from './cloud.js';\n","import { promises as fs } from 'node:fs';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\nimport { Kosa8CheckpointError } from './errors.js';\nimport type { Checkpoint } from './types.js';\n\n/**\n * Checkpoints are client-side bookkeeping over daemon snapshots, exactly as\n * in the kosa8 CLI and MCP server (pkg/checkpoint): a checkpoint is a\n * snapshot with the id `<sandbox>-ckpt-<n>`, and an ordered stack of them per\n * sandbox records labels and order. The daemon itself has no checkpoint\n * endpoint.\n */\n\n/** How many checkpoints are kept per sandbox; the oldest is evicted (pkg/checkpoint MaxPerSandbox). */\nexport const MAX_CHECKPOINTS_PER_SANDBOX = 10;\n\ntype StoreData = Record<string, Checkpoint[]>;\n\n/** Where checkpoint stacks are kept. */\nexport interface CheckpointStore {\n /** Read every stack. */\n load(): Promise<StoreData>;\n /** Run `fn` on the stacks and save what it leaves, serialised against other updates. */\n update<T>(fn: (data: StoreData) => T | Promise<T>): Promise<T>;\n}\n\n/** Reject a name that could escape the store (pkg/checkpoint validSandbox). */\nexport function validateSandboxName(name: string): void {\n if (name === '' || name === '.' || name === '..' || /[/\\\\]/.test(name) || name.startsWith('.')) {\n throw new Kosa8CheckpointError(`invalid sandbox name ${JSON.stringify(name)}`);\n }\n}\n\n/** Keeps stacks in memory only; nothing is shared with the kosa8 CLI. */\nexport class MemoryCheckpointStore implements CheckpointStore {\n private data: StoreData = {};\n private queue: Promise<unknown> = Promise.resolve();\n\n async load(): Promise<StoreData> {\n return structuredClone(this.data);\n }\n\n update<T>(fn: (data: StoreData) => T | Promise<T>): Promise<T> {\n const run = this.queue.then(async () => {\n const copy = structuredClone(this.data);\n const out = await fn(copy);\n this.data = copy;\n return out;\n });\n this.queue = run.catch(() => undefined);\n return run;\n }\n}\n\n/**\n * The store the kosa8 CLI, MCP server and desk use: `~/.kosa8/checkpoints.json`\n * (mode 0600, rewritten atomically). Checkpoints taken through the SDK are\n * therefore visible to `kosa8 rewind` and the other way round.\n *\n * Updates are serialised within this process and between Node processes\n * using this store (an exclusive lock file beside it). The Go tools lock the\n * same file with flock(2), which Node cannot take, so an SDK update that\n * lands in the same instant as a CLI update could lose one record; the\n * snapshots themselves are unaffected.\n */\nexport class FileCheckpointStore implements CheckpointStore {\n readonly path: string;\n private queue: Promise<unknown> = Promise.resolve();\n\n constructor(filePath?: string) {\n this.path = filePath ?? path.join(os.homedir(), '.kosa8', 'checkpoints.json');\n }\n\n async load(): Promise<StoreData> {\n let buf: string;\n try {\n buf = await fs.readFile(this.path, 'utf8');\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') return {};\n throw err;\n }\n try {\n const parsed = JSON.parse(buf) as unknown;\n // A corrupt store must not make the sandbox unusable (as in pkg/checkpoint).\n return parsed && typeof parsed === 'object' ? (parsed as StoreData) : {};\n } catch {\n return {};\n }\n }\n\n update<T>(fn: (data: StoreData) => T | Promise<T>): Promise<T> {\n const run = this.queue.then(() => this.locked(fn));\n this.queue = run.catch(() => undefined);\n return run;\n }\n\n private async locked<T>(fn: (data: StoreData) => T | Promise<T>): Promise<T> {\n await fs.mkdir(path.dirname(this.path), { recursive: true, mode: 0o700 });\n const lock = this.path + '.node.lock';\n const deadline = Date.now() + 10_000;\n for (;;) {\n try {\n const h = await fs.open(lock, 'wx', 0o600);\n await h.close();\n break;\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code !== 'EEXIST') throw err;\n // A lock older than 30s belongs to a process that died holding it.\n try {\n const st = await fs.stat(lock);\n if (Date.now() - st.mtimeMs > 30_000) {\n await fs.rm(lock, { force: true });\n continue;\n }\n } catch {\n continue;\n }\n if (Date.now() > deadline) throw new Kosa8CheckpointError(`timed out waiting for the checkpoint store lock ${lock}`);\n await new Promise((r) => setTimeout(r, 25));\n }\n }\n try {\n const data = await this.load();\n const out = await fn(data);\n const tmp = this.path + '.tmp';\n await fs.writeFile(tmp, JSON.stringify(data, null, 2), { mode: 0o600 });\n await fs.rename(tmp, this.path);\n return out;\n } finally {\n await fs.rm(lock, { force: true });\n }\n }\n}\n\nfunction seqOf(id: string, sandbox: string): number {\n const pre = sandbox + '-ckpt-';\n if (!id.startsWith(pre)) return 0;\n const m = /^(\\d+)/.exec(id.slice(pre.length));\n return m ? Number(m[1]) : 0;\n}\n\nfunction sorted(list: Checkpoint[]): Checkpoint[] {\n return list\n .map((c, i) => ({ c, i, t: Date.parse(c.created) || 0 }))\n .sort((a, b) => a.t - b.t || a.i - b.i)\n .map((x) => x.c);\n}\n\n/** The stack logic of pkg/checkpoint, over any store. */\nexport class CheckpointBook {\n constructor(readonly store: CheckpointStore) {}\n\n /** The snapshot id the next checkpoint should use, and ids to evict to stay under the cap. */\n async nextId(sandbox: string): Promise<{ id: string; evict: string[] }> {\n validateSandboxName(sandbox);\n const list = (await this.store.load())[sandbox] ?? [];\n let n = list.length + 1;\n for (const c of list) {\n const v = seqOf(c.id, sandbox);\n if (v >= n) n = v + 1;\n }\n const evict: string[] = [];\n const over = list.length + 1 - MAX_CHECKPOINTS_PER_SANDBOX;\n if (over > 0) for (const c of list.slice(0, over)) evict.push(c.id);\n return { id: `${sandbox}-ckpt-${n}`, evict };\n }\n\n async record(c: Omit<Checkpoint, 'created'> & { created?: string }, evicted: string[] = []): Promise<Checkpoint> {\n validateSandboxName(c.sandbox);\n const rec: Checkpoint = {\n id: c.id,\n sandbox: c.sandbox,\n label: c.label ?? '',\n ...(c.auto ? { auto: true } : {}),\n created: c.created ?? new Date().toISOString(),\n };\n await this.store.update((s) => {\n const drop = new Set(evicted);\n s[c.sandbox] = [...(s[c.sandbox] ?? []).filter((e) => !drop.has(e.id)), rec];\n });\n return rec;\n }\n\n async list(sandbox: string): Promise<Checkpoint[]> {\n return sorted([...((await this.store.load())[sandbox] ?? [])]);\n }\n\n async latest(sandbox: string): Promise<Checkpoint> {\n const list = await this.list(sandbox);\n if (list.length === 0) {\n throw new Kosa8CheckpointError(\n `no checkpoints for ${JSON.stringify(sandbox)} — take one with checkpoint() or \\`kosa8 checkpoint ${sandbox}\\``,\n );\n }\n return list[list.length - 1]!;\n }\n\n /** Find by id or (case-insensitive) label, newest match first. */\n async resolve(sandbox: string, ref: string): Promise<Checkpoint> {\n const list = await this.list(sandbox);\n for (let i = list.length - 1; i >= 0; i--) {\n const c = list[i]!;\n if (c.id === ref || c.label.toLowerCase() === ref.toLowerCase()) return c;\n }\n throw new Kosa8CheckpointError(`no checkpoint ${JSON.stringify(ref)} for sandbox ${JSON.stringify(sandbox)}`);\n }\n\n /** Keep `id` as the top of the stack; return the ids taken after it (now meaningless). */\n async pop(sandbox: string, id: string): Promise<string[]> {\n return this.store.update((s) => {\n const list = s[sandbox] ?? [];\n const idx = list.findIndex((c) => c.id === id);\n if (idx < 0) throw new Kosa8CheckpointError(`no checkpoint ${JSON.stringify(id)} for sandbox ${JSON.stringify(sandbox)}`);\n const orphaned = list.slice(idx + 1).map((c) => c.id);\n s[sandbox] = list.slice(0, idx + 1);\n return orphaned;\n });\n }\n\n /** Drop every checkpoint of a sandbox; return the snapshot ids to delete. */\n async forget(sandbox: string): Promise<string[]> {\n return this.store.update((s) => {\n const ids = (s[sandbox] ?? []).map((c) => c.id);\n delete s[sandbox];\n return ids;\n });\n }\n}\n","/**\n * Typed errors. Every error the daemon answers with carries its own words:\n * `daemonMessage` is the daemon's `error` field verbatim, and `remediation`\n * is its `remediation` field (what to do about it). A refusal because the\n * org policy wants signed approvals also carries the refusal itself, under\n * `approval`, exactly as the daemon sent it.\n */\n\n/** An approval rule from the org policy, as the daemon reports it. */\nexport interface ApprovalRule {\n [key: string]: unknown;\n}\n\n/** What the policy requires before an action may run. */\nexport interface ApprovalRequirement {\n policy: string;\n rules: ApprovalRule[];\n}\n\n/** The action a refusal is about. */\nexport interface ApprovalAction {\n kind: string;\n target?: string;\n command?: string[];\n sandbox?: string;\n [key: string]: unknown;\n}\n\n/**\n * The daemon's answer to a call the org policy wants signed approvals for\n * and that did not bring a usable one (pkg/approve Refusal).\n */\nexport interface ApprovalRefusal {\n route: string;\n action: ApprovalAction;\n description: string;\n /** read-only | contained | destructive | escalating */\n class: string;\n policy: string;\n policy_digest: string;\n requirement: ApprovalRequirement;\n /** The approval id the call presented, if any. */\n request_id?: string;\n /** What was wrong: nothing presented, not recorded, used, expired, ... */\n why: string;\n /** People the policy lets approve this action. */\n signers?: string[];\n /** The CLI command that opens a request for exactly this action. */\n request_command: string;\n}\n\nexport interface Kosa8ErrorOptions {\n status?: number;\n daemonMessage?: string;\n remediation?: string;\n method?: string;\n path?: string;\n body?: unknown;\n cause?: unknown;\n /** kosa8 Cloud's stable error code, such as payment_required. */\n code?: string;\n}\n\n/** Base class of every error this SDK throws. */\nexport class Kosa8Error extends Error {\n /** HTTP status the daemon answered with, when there was an answer. */\n readonly status?: number;\n /** The daemon's `error` text, verbatim. */\n readonly daemonMessage?: string;\n /** The daemon's `remediation` text: what to do about it. */\n readonly remediation?: string;\n readonly method?: string;\n readonly path?: string;\n /** The decoded response body, when there was one. */\n readonly body?: unknown;\n /** kosa8 Cloud's stable error code (payment_required, quota_exceeded, ...). */\n readonly code?: string;\n\n constructor(message: string, options: Kosa8ErrorOptions = {}) {\n super(message, options.cause !== undefined ? { cause: options.cause } : undefined);\n this.name = new.target.name;\n this.status = options.status;\n this.daemonMessage = options.daemonMessage;\n this.remediation = options.remediation;\n this.method = options.method;\n this.path = options.path;\n this.body = options.body;\n this.code = options.code;\n }\n}\n\n/** The daemon could not be reached (no socket, connection refused, ...). */\nexport class Kosa8ConnectionError extends Kosa8Error {}\n\n/**\n * A call took longer than its timeout. A connection error too, so code that\n * catches Kosa8ConnectionError keeps catching it.\n */\nexport class Kosa8TimeoutError extends Kosa8ConnectionError {}\n\n/** The daemon answered with an HTTP error. */\nexport class Kosa8ApiError extends Kosa8Error {}\n\n/** 400: the request was malformed or a value was refused (an egress policy, say). */\nexport class Kosa8BadRequestError extends Kosa8ApiError {}\n\n/** 401: a bearer token (remote worker) or agent token was missing or refused. */\nexport class Kosa8AuthError extends Kosa8ApiError {}\n\n/** 403: refused by policy (org policy, registry allow-list, labels, ...). */\nexport class Kosa8PolicyError extends Kosa8ApiError {}\n\n/**\n * 403 with a signed-approval refusal: the org policy wants people other than\n * the caller to approve this exact action. Get the approval id from a human\n * and repeat the call with `{ approval: id }`.\n */\nexport class Kosa8ApprovalRequiredError extends Kosa8PolicyError {\n readonly approval: ApprovalRefusal;\n constructor(message: string, approval: ApprovalRefusal, options: Kosa8ErrorOptions = {}) {\n super(message, options);\n this.approval = approval;\n }\n}\n\n/** 404: no such sandbox, snapshot, container, ... */\nexport class Kosa8NotFoundError extends Kosa8ApiError {}\n\n/** 409: a conflict, e.g. the sandbox exists but is not running, or a snapshot id is taken. */\nexport class Kosa8ConflictError extends Kosa8ApiError {}\n\n/** 501: the platform cannot do this (sandboxes need macOS on Apple silicon or Linux with KVM). */\nexport class Kosa8UnsupportedError extends Kosa8ApiError {}\n\n/**\n * A streamed operation (run, exec, attach) ended with an error frame rather\n * than an exit code. Output produced before the error is kept.\n */\nexport class Kosa8StreamError extends Kosa8Error {\n readonly stdout: string;\n readonly stderr: string;\n constructor(message: string, out: { stdout: string; stderr: string }, options: Kosa8ErrorOptions = {}) {\n super(message, options);\n this.stdout = out.stdout;\n this.stderr = out.stderr;\n }\n}\n\n/** kosa8 Cloud refused new work until a payment method is on file (402). */\nexport class Kosa8PaymentRequiredError extends Kosa8ApiError {}\n\n/** Too many requests or a quota reached (429). */\nexport class Kosa8RateLimitError extends Kosa8ApiError {}\n\n/** A client-side checkpoint operation failed (no checkpoint, bad name, ...). */\nexport class Kosa8CheckpointError extends Kosa8Error {}\n\nfunction isRefusal(v: unknown): v is ApprovalRefusal {\n return typeof v === 'object' && v !== null && typeof (v as { why?: unknown }).why === 'string';\n}\n\n/**\n * Build the typed error for an HTTP error answer. The message is the daemon's\n * own, with its remediation in parentheses, the way the kosa8 CLI and MCP\n * server print it.\n */\nexport function errorFromResponse(\n status: number,\n body: unknown,\n ctx: { method?: string; path?: string; code?: string } = {},\n): Kosa8ApiError {\n let daemonMessage: string | undefined;\n let remediation: string | undefined;\n let approval: unknown;\n if (typeof body === 'object' && body !== null) {\n const b = body as Record<string, unknown>;\n if (typeof b.error === 'string' && b.error !== '') daemonMessage = b.error;\n else if (typeof b.message === 'string' && b.message !== '') daemonMessage = b.message;\n if (typeof b.remediation === 'string' && b.remediation !== '') remediation = b.remediation;\n approval = b.approval;\n } else if (typeof body === 'string' && body.trim() !== '') {\n daemonMessage = body.trim();\n }\n const base = daemonMessage ?? `request failed with HTTP ${status}`;\n const message = remediation ? `${base} (${remediation})` : base;\n const opts: Kosa8ErrorOptions = { status, daemonMessage, remediation, body, ...ctx };\n if (status === 403 && isRefusal(approval)) {\n return new Kosa8ApprovalRequiredError(message, approval, opts);\n }\n switch (status) {\n case 400:\n return new Kosa8BadRequestError(message, opts);\n case 401:\n return new Kosa8AuthError(message, opts);\n case 403:\n return new Kosa8PolicyError(message, opts);\n case 404:\n return new Kosa8NotFoundError(message, opts);\n case 402:\n return new Kosa8PaymentRequiredError(message, opts);\n case 409:\n return new Kosa8ConflictError(message, opts);\n case 429:\n return new Kosa8RateLimitError(message, opts);\n case 501:\n return new Kosa8UnsupportedError(message, opts);\n default:\n return new Kosa8ApiError(message, opts);\n }\n}\n","/**\n * A build context as a tar stream, the way `kosa8 build` packs one: every\n * folder, file and symlink under the context, minus what `.dockerignore`\n * names (a path, or a prefix of one). No dependencies: plain ustar, with a\n * PAX header for a name or link target too long for it.\n */\nimport { promises as fsp } from 'node:fs';\nimport * as path from 'node:path';\nimport { Kosa8Error } from './errors.js';\n\nconst BLOCK = 512;\n\nfunction octal(buf: Buffer, off: number, len: number, n: number): void {\n buf.write(n.toString(8).padStart(len - 1, '0') + '\\0', off, len, 'ascii');\n}\n\nfunction header(name: string, type: string, size: number, mode: number, mtime: number, link = ''): Buffer {\n const h = Buffer.alloc(BLOCK);\n h.write(name, 0, 100, 'utf8');\n octal(h, 100, 8, mode & 0o7777);\n octal(h, 108, 8, 0);\n octal(h, 116, 8, 0);\n octal(h, 124, 12, size);\n octal(h, 136, 12, mtime);\n h.fill(' ', 148, 156);\n h.write(type, 156, 1, 'ascii');\n h.write(link, 157, 100, 'utf8');\n h.write('ustar\\0', 257, 6, 'ascii');\n h.write('00', 263, 2, 'ascii');\n let sum = 0;\n for (const b of h) sum += b;\n h.write(sum.toString(8).padStart(6, '0') + '\\0 ', 148, 8, 'ascii');\n return h;\n}\n\nfunction paxRecord(key: string, value: string): string {\n const body = ` ${key}=${value}\\n`;\n let n = Buffer.byteLength(body);\n let len = n + String(n).length;\n if (String(len).length !== String(n).length) len = n + String(len).length;\n return `${len}${body}`;\n}\n\nfunction pad(n: number): Buffer {\n const r = n % BLOCK;\n return Buffer.alloc(r === 0 ? 0 : BLOCK - r);\n}\n\nfunction entry(out: Buffer[], name: string, type: string, mode: number, mtime: number, data?: Buffer, link = ''): void {\n let pax = '';\n if (Buffer.byteLength(name) > 100) pax += paxRecord('path', name);\n if (Buffer.byteLength(link) > 100) pax += paxRecord('linkpath', link);\n if (pax !== '') {\n const p = Buffer.from(pax, 'utf8');\n out.push(header('PaxHeader', 'x', p.length, 0o644, mtime), p, pad(p.length));\n }\n const size = data?.length ?? 0;\n out.push(header(name.slice(0, 100), type, size, mode, mtime, link.slice(0, 100)));\n if (data) out.push(data, pad(size));\n}\n\n/** The `.dockerignore` entries: paths, normalised, comments and blanks dropped. */\nasync function readIgnore(dir: string): Promise<string[]> {\n let text: string;\n try {\n text = await fsp.readFile(path.join(dir, '.dockerignore'), 'utf8');\n } catch {\n return [];\n }\n const out: string[] = [];\n for (const line of text.split(/\\r?\\n/)) {\n const l = line.trim();\n if (l === '' || line.startsWith('#')) continue;\n out.push(path.posix.normalize(l.replace(/\\\\/g, '/')).replace(/\\/+$/, '') || '.');\n }\n return out;\n}\n\n/**\n * Pack `dir` as a tar archive for POST /kosa8/v1/templates. Throws when the\n * Dockerfile is missing, so a bad path fails before anything is sent.\n */\nexport async function tarContext(dir: string, dockerfile = 'Dockerfile'): Promise<Buffer> {\n try {\n await fsp.access(path.join(dir, dockerfile));\n } catch {\n throw new Kosa8Error(`no ${dockerfile} in ${dir}`);\n }\n const ignore = await readIgnore(dir);\n const skip = (rel: string) => ignore.some((p) => rel === p || rel.startsWith(p + '/'));\n const out: Buffer[] = [];\n const walk = async (rel: string): Promise<void> => {\n const ents = await fsp.readdir(path.join(dir, rel), { withFileTypes: true });\n ents.sort((a, b) => (a.name < b.name ? -1 : a.name > b.name ? 1 : 0));\n const subdirs: string[] = [];\n for (const e of ents) {\n const r = rel === '' ? e.name : `${rel}/${e.name}`;\n if (skip(r)) continue;\n const full = path.join(dir, r);\n const st = await fsp.lstat(full);\n const mtime = Math.floor(st.mtimeMs / 1000);\n if (st.isSymbolicLink()) {\n entry(out, r, '2', st.mode, mtime, undefined, await fsp.readlink(full));\n } else if (st.isDirectory()) {\n entry(out, r + '/', '5', st.mode, mtime);\n subdirs.push(r);\n } else if (st.isFile()) {\n entry(out, r, '0', st.mode, mtime, await fsp.readFile(full));\n }\n }\n for (const s of subdirs) await walk(s);\n };\n await walk('');\n out.push(Buffer.alloc(BLOCK * 2));\n return Buffer.concat(out);\n}\n","import * as fs from 'node:fs';\nimport * as http from 'node:http';\nimport * as https from 'node:https';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\nimport { Kosa8ConnectionError, Kosa8Error, errorFromResponse } from './errors.js';\nimport type { Frame } from './types.js';\n\n/** Who the audit log should file a request under (pkg/policyd Actor). */\nexport type Actor = 'human' | 'agent' | 'tool';\n\nexport interface TransportOptions {\n /**\n * Unix socket of the daemon. Default: `$HOME/.kosa8/run/kosa8.sock`.\n * Ignored when `host` (or KOSA8_HOST) is set.\n */\n socketPath?: string;\n /**\n * A remote kosa8 worker: `https://host`, `http://host:port`, `tcp://host:port`\n * or a bare `host:port`, the same spellings the kosa8 CLI accepts in\n * KOSA8_HOST. `unix:///path/to.sock` selects a socket. Defaults to the\n * KOSA8_HOST environment variable.\n */\n host?: string;\n /** Bearer token for a remote worker. Defaults to KOSA8_TOKEN when KOSA8_HOST is in use. */\n token?: string;\n /**\n * Allow plain http to a non-loopback host. Off by default, as in the CLI,\n * because the token and every request would cross the network unencrypted.\n * KOSA8_INSECURE=1 also allows it.\n */\n insecure?: boolean;\n /** Sent as X-Kosa8-Actor so the audit log files requests correctly. Default `tool`. */\n actor?: Actor;\n /** Agent identity token (X-Kosa8-Agent-Token). Defaults to KOSA8_AGENT_TOKEN. */\n agentToken?: string;\n /** Extra headers on every request. */\n headers?: Record<string, string>;\n /** Environment to read KOSA8_* variables from. Default `process.env`. */\n env?: Record<string, string | undefined>;\n /**\n * The CLI's saved worker connection, used when neither `host` nor KOSA8_HOST\n * is set (and no `socketPath` is given): what `kosa8 wsl setup` writes on\n * Windows, and `kosa8 worker join` anywhere. Default\n * `$HOME/.kosa8/worker.json`; `null` reads none.\n */\n workerFile?: string | null;\n}\n\nexport interface RequestOptions {\n query?: Record<string, string | number | boolean | undefined>;\n body?: unknown;\n /** A raw (non-JSON) request body, sent as-is; an async iterable is streamed chunked. */\n rawBody?: Uint8Array | string | AsyncIterable<Uint8Array | string>;\n /** Signed-approval id, sent as X-Kosa8-Approval. */\n approval?: string;\n signal?: AbortSignal;\n headers?: Record<string, string>;\n}\n\ntype Endpoint =\n | { kind: 'unix'; socketPath: string }\n | { kind: 'tcp'; url: URL; token?: string };\n\nexport const APPROVAL_HEADER = 'X-Kosa8-Approval';\nexport const ACTOR_HEADER = 'X-Kosa8-Actor';\nexport const AGENT_TOKEN_HEADER = 'X-Kosa8-Agent-Token';\n\n/** The daemon's default socket: $HOME/.kosa8/run/kosa8.sock (pkg/paths). */\nexport function defaultSocketPath(): string {\n return path.join(os.homedir(), '.kosa8', 'run', 'kosa8.sock');\n}\n\n/** The CLI's saved worker connection: $HOME/.kosa8/worker.json (internal/cli/worker.go). */\nexport function defaultWorkerFile(): string {\n return path.join(os.homedir(), '.kosa8', 'worker.json');\n}\n\ninterface SavedWorker {\n host: string;\n token?: string;\n insecure: boolean;\n}\n\n/** The saved connection, or undefined when there is none or it cannot be read. */\nfunction loadSavedWorker(file: string): SavedWorker | undefined {\n let w: unknown;\n try {\n w = JSON.parse(fs.readFileSync(file, 'utf8'));\n } catch {\n return undefined;\n }\n if (!w || typeof w !== 'object') return undefined;\n const o = w as Record<string, unknown>;\n const host = typeof o.host === 'string' ? o.host.trim() : '';\n if (host === '') return undefined;\n return {\n host,\n token: typeof o.token === 'string' && o.token !== '' ? o.token : undefined,\n insecure: o.insecure === true,\n };\n}\n\nfunction isLoopback(hostname: string): boolean {\n const h = hostname.replace(/^\\[|\\]$/g, '');\n return h === 'localhost' || h === '::1' || /^127\\./.test(h);\n}\n\n/** Resolve where to connect, following the CLI's KOSA8_HOST rules. */\nexport function resolveEndpoint(opts: TransportOptions): Endpoint {\n const env = opts.env ?? process.env;\n const fromEnv = (env.KOSA8_HOST ?? '').trim();\n const raw = (opts.host ?? fromEnv).trim();\n const envInsecure = opts.insecure === true || env.KOSA8_INSECURE === '1';\n if (raw !== '') {\n // A saved token is never sent to a host named here.\n const token = opts.token ?? (opts.host === undefined && fromEnv !== '' ? env.KOSA8_TOKEN : undefined);\n return parseHost(raw, envInsecure, token);\n }\n if (opts.socketPath === undefined && opts.workerFile !== null) {\n const saved = loadSavedWorker(opts.workerFile ?? defaultWorkerFile());\n if (saved) return parseHost(saved.host, envInsecure || saved.insecure, opts.token ?? saved.token);\n }\n return { kind: 'unix', socketPath: opts.socketPath ?? defaultSocketPath() };\n}\n\nfunction parseHost(raw: string, insecure: boolean, token: string | undefined): Endpoint {\n let h = raw.replace(/\\/+$/, '');\n const i = h.indexOf('://');\n if (i > 0) h = h.slice(0, i).toLowerCase() + h.slice(i);\n if (h.startsWith('unix://')) {\n return { kind: 'unix', socketPath: h.slice('unix://'.length) };\n }\n if (h.startsWith('tcp://')) h = 'http://' + h.slice('tcp://'.length);\n else if (!h.startsWith('http://') && !h.startsWith('https://')) {\n if (h.includes('://')) {\n throw new Kosa8Error(\n `KOSA8_HOST scheme \"${h.slice(0, h.indexOf('://'))}\" is not supported; use http://, https://, tcp:// or unix://`,\n );\n }\n h = 'http://' + h;\n }\n const url = new URL(h);\n if (url.protocol === 'http:' && !insecure && !isLoopback(url.hostname)) {\n throw new Kosa8Error(\n `refusing to talk to ${url.host} over plain http: the token and every request would cross the network unencrypted. ` +\n `Use https://${url.host} (a worker behind a TLS-terminating tunnel or proxy), or set insecure: true / KOSA8_INSECURE=1 if this link is already private and trusted`,\n );\n }\n return { kind: 'tcp', url, token: token || undefined };\n}\n\nexport interface RawResponse {\n status: number;\n headers: http.IncomingHttpHeaders;\n stream: http.IncomingMessage;\n}\n\n/** HTTP over the daemon's unix socket (or a remote worker). No dependencies. */\nexport class Transport {\n private readonly endpoint: Endpoint;\n private readonly actor: Actor;\n private readonly agentToken?: string;\n private readonly extraHeaders: Record<string, string>;\n\n constructor(opts: TransportOptions = {}) {\n this.endpoint = resolveEndpoint(opts);\n this.actor = opts.actor ?? 'tool';\n const env = opts.env ?? process.env;\n this.agentToken = opts.agentToken ?? (env.KOSA8_AGENT_TOKEN || undefined);\n this.extraHeaders = { ...(opts.headers ?? {}) };\n }\n\n /** Human-readable description of where requests go. */\n get target(): string {\n return this.endpoint.kind === 'unix' ? `unix://${this.endpoint.socketPath}` : this.endpoint.url.origin;\n }\n\n private buildPath(p: string, query?: RequestOptions['query']): string {\n const base = this.endpoint.kind === 'tcp' ? this.endpoint.url.pathname.replace(/\\/+$/, '') : '';\n let out = base + p;\n if (query) {\n const qs = new URLSearchParams();\n for (const [k, v] of Object.entries(query)) {\n if (v === undefined || v === false) continue;\n qs.set(k, v === true ? '1' : String(v));\n }\n const s = qs.toString();\n if (s) out += '?' + s;\n }\n return out;\n }\n\n /** Send a request and return the raw response once headers arrive. */\n raw(method: string, p: string, opts: RequestOptions = {}): Promise<RawResponse> {\n const headers: Record<string, string> = {\n Accept: 'application/json',\n [ACTOR_HEADER]: this.actor,\n ...this.extraHeaders,\n ...(opts.headers ?? {}),\n };\n if (opts.approval && opts.approval.trim() !== '') headers[APPROVAL_HEADER] = opts.approval.trim();\n if (this.agentToken) headers[AGENT_TOKEN_HEADER] = this.agentToken;\n let payload: Buffer | undefined;\n let streamBody: AsyncIterable<Uint8Array | string> | undefined;\n if (opts.rawBody !== undefined) {\n headers['Content-Type'] = 'application/octet-stream';\n if (typeof opts.rawBody === 'string' || opts.rawBody instanceof Uint8Array) {\n payload = Buffer.from(opts.rawBody as Uint8Array);\n headers['Content-Length'] = String(payload.length);\n } else {\n streamBody = opts.rawBody;\n }\n } else if (opts.body !== undefined) {\n payload = Buffer.from(JSON.stringify(opts.body));\n headers['Content-Type'] = 'application/json';\n headers['Content-Length'] = String(payload.length);\n } else if (method !== 'GET' && method !== 'HEAD') {\n headers['Content-Length'] = '0';\n }\n const reqPath = this.buildPath(p, opts.query);\n let reqOpts: http.RequestOptions;\n let mod: typeof http | typeof https = http;\n if (this.endpoint.kind === 'unix') {\n reqOpts = { socketPath: this.endpoint.socketPath, path: reqPath, method, headers: { Host: 'kosa8', ...headers } };\n } else {\n const u = this.endpoint.url;\n if (this.endpoint.token) headers.Authorization = `Bearer ${this.endpoint.token}`;\n mod = u.protocol === 'https:' ? https : http;\n reqOpts = { protocol: u.protocol, hostname: u.hostname, port: u.port || undefined, path: reqPath, method, headers };\n }\n\n return new Promise<RawResponse>((resolve, reject) => {\n const signal = opts.signal;\n if (signal?.aborted) {\n reject(signal.reason ?? new DOMException('Aborted', 'AbortError'));\n return;\n }\n const req = mod.request(reqOpts, (res) => {\n resolve({ status: res.statusCode ?? 0, headers: res.headers, stream: res });\n });\n const onAbort = () => {\n req.destroy(signal?.reason instanceof Error ? signal.reason : new DOMException('Aborted', 'AbortError'));\n };\n signal?.addEventListener('abort', onAbort, { once: true });\n req.on('close', () => signal?.removeEventListener('abort', onAbort));\n req.on('error', (err: NodeJS.ErrnoException) => {\n if (signal?.aborted) {\n reject(signal.reason ?? err);\n return;\n }\n reject(\n new Kosa8ConnectionError(\n `kosa8 daemon unreachable at ${this.target}: ${err.message}` +\n (err.code === 'ENOENT' || err.code === 'ECONNREFUSED'\n ? this.endpoint.kind === 'unix' && process.platform === 'win32'\n ? ' (on Windows the engine runs in WSL2: run `kosa8 wsl setup`, or set KOSA8_HOST)'\n : ' (is kosa8 installed and its daemon running? start it with `kosa8 daemon start`)'\n : ''),\n { method, path: p, cause: err },\n ),\n );\n });\n if (streamBody) {\n const src = streamBody;\n void (async () => {\n try {\n for await (const chunk of src) {\n if (!req.write(chunk)) await new Promise((r) => req.once('drain', r));\n }\n req.end();\n } catch (err) {\n req.destroy(err as Error);\n }\n })();\n return;\n }\n if (payload) req.write(payload);\n req.end();\n });\n }\n\n /** Send a request and decode a JSON answer; HTTP errors become typed errors. */\n async json<T>(method: string, p: string, opts: RequestOptions = {}): Promise<T> {\n const res = await this.raw(method, p, opts);\n const text = (await readAll(res.stream, opts.signal)).toString('utf8');\n let body: unknown = undefined;\n if (text.trim() !== '') {\n try {\n body = JSON.parse(text);\n } catch {\n body = text;\n }\n }\n if (res.status >= 400) throw errorFromResponse(res.status, body, { method, path: p });\n return body as T;\n }\n\n /**\n * Send a request whose answer is a stream of NDJSON frames (run, exec,\n * attach). HTTP errors (a refusal before streaming began) become typed\n * errors; each frame's base64 `data` is decoded to a Buffer.\n */\n async *frames(method: string, p: string, opts: RequestOptions = {}): AsyncGenerator<Frame> {\n const res = await this.raw(method, p, opts);\n if (res.status >= 400) {\n const text = (await readAll(res.stream, opts.signal)).toString('utf8');\n let body: unknown = text;\n try {\n body = JSON.parse(text);\n } catch {\n /* keep text */\n }\n throw errorFromResponse(res.status, body, { method, path: p });\n }\n let buf = '';\n try {\n for await (const chunk of res.stream) {\n buf += (chunk as Buffer).toString('utf8');\n let nl: number;\n while ((nl = buf.indexOf('\\n')) >= 0) {\n const line = buf.slice(0, nl).trim();\n buf = buf.slice(nl + 1);\n if (line !== '') yield decodeFrame(line);\n }\n }\n } catch (err) {\n if (opts.signal?.aborted) throw opts.signal.reason ?? err;\n throw err;\n } finally {\n res.stream.destroy();\n }\n const rest = buf.trim();\n if (rest !== '') yield decodeFrame(rest);\n }\n}\n\nfunction decodeFrame(line: string): Frame {\n const f = JSON.parse(line) as Record<string, unknown>;\n const out: Frame = { ...f } as Frame;\n if (typeof f.data === 'string') out.data = Buffer.from(f.data, 'base64');\n return out;\n}\n\nexport async function readAll(stream: http.IncomingMessage, signal?: AbortSignal): Promise<Buffer> {\n const chunks: Buffer[] = [];\n try {\n for await (const c of stream) chunks.push(c as Buffer);\n } catch (err) {\n if (signal?.aborted) throw signal.reason ?? err;\n throw err;\n }\n return Buffer.concat(chunks);\n}\n","import { CheckpointBook, FileCheckpointStore, type CheckpointStore } from './checkpoints.js';\nimport { Kosa8Error, Kosa8NotFoundError, Kosa8StreamError, errorFromResponse } from './errors.js';\nimport { tarContext } from './tar.js';\nimport { Transport, readAll, type TransportOptions } from './transport.js';\nimport type {\n CodeResult,\n FileInfo,\n GitOp,\n GitResult,\n Lifecycle,\n Preview,\n SessionInfo,\n ShellResult,\n Template,\n BrokerSpec,\n CaptureSpec,\n Checkpoint,\n Container,\n CreateSandboxResult,\n DeleteSandboxResult,\n DeleteSnapshotResult,\n EgressPolicy,\n EgressStatus,\n ExecResult,\n ExploreBranch,\n ExploreResult,\n ForkResult,\n Frame,\n Health,\n Mount,\n RestoreResult,\n Sandbox,\n Snapshot,\n SnapshotSandboxResult,\n StartSandboxResult,\n StopSandboxResult,\n} from './types.js';\n\n/** Options every call accepts. */\nexport interface CallOptions {\n /**\n * Id of a recorded signed approval for this exact action, sent as\n * X-Kosa8-Approval. Needed only when the org policy requires one; a\n * refusal (Kosa8ApprovalRequiredError) says how a human gets it.\n */\n approval?: string;\n signal?: AbortSignal;\n}\n\nexport interface Kosa8ClientOptions extends TransportOptions {\n /**\n * Where checkpoint stacks are kept. Default: the kosa8 CLI's own store,\n * `~/.kosa8/checkpoints.json`, so `kosa8 rewind` sees SDK checkpoints.\n */\n checkpointStore?: CheckpointStore;\n}\n\nexport interface CreateSandboxOptions extends CallOptions {\n /** Sandbox name; the daemon generates one when omitted. */\n name?: string;\n cpus?: number;\n memMb?: number;\n /** Data disk in GB (holds images and everything written inside). 0 = daemon default. */\n diskGb?: number;\n mounts?: Mount[];\n /**\n * Network policy: `'deny'`, `'any'`, `'fakenet'`, `'allow:a.com,b.com'` or\n * `{ allow: ['a.com', '*.b.com', '10.0.0.0/8'] }`. When omitted the daemon\n * applies the org policy's default egress, else `any`.\n */\n egress?: EgressPolicy;\n /** Shorthand for `egress: { allow: [...] }`. */\n egressAllow?: readonly string[];\n /** Start a packet capture from the first frame. */\n capture?: CaptureSpec;\n labels?: Record<string, string>;\n /** Put the sandbox behind an egress broker that adds credentials it never holds. */\n broker?: BrokerSpec;\n /** Stop it after this many idle minutes. */\n autoStopMin?: number;\n /** Stop it this many minutes after creation, in use or not. */\n ttlMin?: number;\n /** Delete it once it has been stopped this many minutes. */\n autoDeleteMin?: number;\n /** Delete it (disk and all) whenever it stops. */\n ephemeral?: boolean;\n /** Start it with a template's image (see `buildTemplate`). */\n template?: string;\n}\n\nexport interface RunCodeOptions extends CallOptions {\n /** `python` (default), `javascript` or `typescript`. */\n language?: string;\n /** Image to run in; the daemon picks one per language (or the sandbox template's). */\n image?: string;\n env?: Record<string, string>;\n /** Time limit in seconds; past it the run is killed and `timedOut` set. */\n timeoutS?: number;\n}\n\nexport interface WriteFileOptions extends CallOptions {\n /** Permission bits as octal text, e.g. `0755`. */\n mode?: string;\n}\n\n/** The fields of a git op; which ones matter depends on the op. */\nexport interface GitOptions extends CallOptions {\n /** The repository, in the workspace. */\n path?: string;\n /** clone */\n url?: string;\n branch?: string;\n /** clone --depth */\n depth?: number;\n /** push | pull; default origin */\n remote?: string;\n /** checkout -b */\n create?: boolean;\n /** add: these paths (default everything) */\n files?: string[];\n /** commit */\n message?: string;\n authorName?: string;\n authorEmail?: string;\n /** log: how many (default 20) */\n n?: number;\n /** diff --cached */\n staged?: boolean;\n /** For an https remote that needs credentials. */\n username?: string;\n token?: string;\n /** Image git runs in. */\n image?: string;\n}\n\nexport interface GitCommitOptions extends Omit<GitOptions, 'path' | 'message'> {\n /** Stage everything first (default true). */\n addAll?: boolean;\n}\n\nexport interface CreateSessionOptions extends CallOptions {\n image?: string;\n env?: Record<string, string>;\n}\n\nexport interface SessionExecOptions extends CallOptions {\n /** Time limit in seconds for this command. */\n timeoutS?: number;\n}\n\nexport interface ShellOptions extends SessionExecOptions {\n /** Session to run in; made on first use. Default `main`. */\n session?: string;\n}\n\nexport interface StartPtyOptions extends CallOptions {\n image?: string;\n command?: string[];\n cols?: number;\n rows?: number;\n env?: Record<string, string>;\n}\n\nexport interface CreatePreviewOptions extends CallOptions {\n /** Which session's container serves the port. */\n session?: string;\n /** Or which container. */\n container?: string;\n /** How long the link lives, in seconds. */\n expiresInS?: number;\n}\n\nexport interface SetLifecycleOptions extends CallOptions {\n autoStopMin?: number;\n autoDeleteMin?: number;\n ttlMin?: number;\n ephemeral?: boolean;\n}\n\nexport interface BuildTemplateOptions extends CallOptions {\n /** Dockerfile name inside the context (default `Dockerfile`). */\n dockerfile?: string;\n buildArgs?: Record<string, string>;\n /** Network the build sandbox gets (daemon default `any`). */\n egress?: EgressPolicy;\n /** Build again over an existing template of the same name. */\n replace?: boolean;\n /** Build output as it arrives. */\n onOutput?: (chunk: Buffer, stream: string) => void;\n}\n\nexport interface RunOptions extends CallOptions {\n env?: Record<string, string> | string[];\n onStdout?: (chunk: Buffer) => void;\n onStderr?: (chunk: Buffer) => void;\n /** Progress lines the daemon emits (e.g. \"pulling alpine\"). */\n onStatus?: (chunk: Buffer) => void;\n}\n\nexport interface ExecOptions extends CallOptions {\n onStdout?: (chunk: Buffer) => void;\n onStderr?: (chunk: Buffer) => void;\n}\n\nexport interface ForkOptions extends CallOptions {\n /** Number of copies (default 1). */\n n?: number;\n /** Name prefix; copies are named `<prefix>1`, `<prefix>2`, ... (default `<sandbox>-fork`). */\n prefix?: string;\n /** Raise the copies' classification label above the parent's. */\n label?: string;\n}\n\nexport interface ExploreOptions extends CallOptions {\n /** Shell commands, one per branch (at least two). */\n variants: string[];\n /** Image the variants run in (default `alpine:latest`). */\n image?: string;\n /** Keep every branch instead of only the winner. */\n keepAll?: boolean;\n /** Keep this branch (by id) instead of the winner. */\n keep?: string;\n /** Per-branch time limit in ms (default 120000). */\n timeoutMs?: number;\n /** Branch name prefix (default `<sandbox>-explore-<n>`). */\n prefix?: string;\n /**\n * Pull `image` into the parent sandbox before forking so every branch has\n * it (a sandbox's engine does not pull on run). Default true.\n */\n pull?: boolean;\n}\n\nexport interface CheckpointOptions extends CallOptions {\n /** Why it is being taken, e.g. \"before the migration\". */\n label?: string;\n}\n\nexport interface CheckpointResult {\n checkpoint: Checkpoint;\n /** Older checkpoints dropped to stay under the cap of 10. */\n evicted: string[];\n snapshot: SnapshotSandboxResult;\n}\n\nexport interface RewindOptions extends CallOptions {\n /** Checkpoint id or label (default: the most recent). */\n to?: string;\n}\n\nexport interface RewindResult {\n sandbox: Sandbox;\n checkpoint: Checkpoint;\n /** Checkpoints taken after the one returned to, now deleted. */\n dropped: string[];\n restore_ms: number;\n}\n\nexport interface RestoreOptions extends CallOptions {\n /** Name for the restored sandbox. */\n name?: string;\n /** Raise the restored sandbox's classification label. */\n label?: string;\n /** Restore a sealed snapshot whose seal does not verify (recorded in the audit log). */\n allowTampered?: boolean;\n}\n\nfunction egressString(egress?: EgressPolicy, allow?: readonly string[]): string | undefined {\n if (allow && allow.length > 0) {\n if (egress !== undefined && egress !== 'deny') {\n throw new Kosa8Error('egressAllow already limits the network to the hosts it lists; do not also set egress');\n }\n return 'allow:' + allow.map((h) => h.trim()).join(',');\n }\n if (egress === undefined) return undefined;\n if (typeof egress === 'string') return egress;\n if (egress.allow.length === 0) {\n throw new Kosa8Error('an egress allow-list needs at least one host; use egress: \"deny\" for no network');\n }\n return 'allow:' + egress.allow.map((h) => h.trim()).join(',');\n}\n\nfunction envList(env?: Record<string, string> | string[]): string[] | undefined {\n if (!env) return undefined;\n if (Array.isArray(env)) return env;\n return Object.entries(env).map(([k, v]) => `${k}=${v}`);\n}\n\nconst enc = encodeURIComponent;\n\nfunction str(v: unknown): string {\n return typeof v === 'string' ? v : '';\n}\n\nfunction num(v: unknown): number {\n return typeof v === 'number' && Number.isFinite(v) ? v : 0;\n}\n\n/**\n * Typed client for the kosa8 native API over the daemon's unix socket.\n *\n * ```ts\n * const kosa8 = new Kosa8Client();\n * const { sandbox } = await kosa8.createSandbox({ name: 'demo', egress: 'deny' });\n * ```\n */\nexport class Kosa8Client {\n readonly transport: Transport;\n readonly checkpoints: CheckpointBook;\n\n constructor(options: Kosa8ClientOptions = {}) {\n this.transport = new Transport(options);\n this.checkpoints = new CheckpointBook(options.checkpointStore ?? new FileCheckpointStore());\n }\n\n // --- status ---------------------------------------------------------------\n\n /** GET /kosa8/v1/health: daemon status and version. */\n health(opts: CallOptions = {}): Promise<Health> {\n return this.transport.json<Health>('GET', '/kosa8/v1/health', opts);\n }\n\n /** The daemon's version string. */\n async version(opts: CallOptions = {}): Promise<string> {\n return (await this.health(opts)).version;\n }\n\n // --- host engine ------------------------------------------------------------\n\n /** POST /kosa8/v1/pull: pull an image into the host engine (checked against the registry allow-list). */\n pull(ref: string, opts: CallOptions = {}): Promise<{ ok: boolean; image: string }> {\n return this.transport.json('POST', '/kosa8/v1/pull', { ...opts, body: { ref } });\n }\n\n // --- sandboxes ---------------------------------------------------------------\n\n /** GET /kosa8/v1/sandboxes */\n listSandboxes(opts: CallOptions = {}): Promise<Sandbox[]> {\n return this.transport.json<Sandbox[]>('GET', '/kosa8/v1/sandboxes', opts);\n }\n\n /** Find one sandbox by id or name (from the list; there is no single-sandbox GET). */\n async getSandbox(idOrName: string, opts: CallOptions = {}): Promise<Sandbox | undefined> {\n const list = await this.listSandboxes(opts);\n return list.find((s) => s.id === idOrName) ?? list.find((s) => s.name === idOrName);\n }\n\n /** POST /kosa8/v1/sandboxes: boot a microVM sandbox. */\n async createSandbox(options: CreateSandboxOptions = {}): Promise<CreateSandboxResult> {\n const body: Record<string, unknown> = {};\n if (options.name) body.name = options.name;\n if (options.cpus) body.cpus = options.cpus;\n if (options.memMb) body.mem_mb = options.memMb;\n if (options.diskGb) body.disk_gb = options.diskGb;\n if (options.mounts) body.mounts = options.mounts;\n const egress = egressString(options.egress, options.egressAllow);\n if (egress !== undefined) body.egress = egress;\n if (options.capture) body.capture = options.capture;\n if (options.labels) body.labels = options.labels;\n if (options.broker) body.broker = options.broker;\n if (options.autoStopMin) body.auto_stop_min = options.autoStopMin;\n if (options.autoDeleteMin) body.auto_delete_min = options.autoDeleteMin;\n if (options.ttlMin) body.ttl_min = options.ttlMin;\n if (options.ephemeral) body.ephemeral = true;\n if (options.template) body.template = options.template;\n return this.transport.json('POST', '/kosa8/v1/sandboxes', {\n body,\n approval: options.approval,\n signal: options.signal,\n });\n }\n\n /** POST /kosa8/v1/sandboxes/{id}/up: boot a stopped sandbox from its own disk. */\n startSandbox(id: string, opts: CallOptions = {}): Promise<StartSandboxResult> {\n return this.transport.json('POST', `/kosa8/v1/sandboxes/${enc(id)}/up`, opts);\n }\n\n /** POST /kosa8/v1/sandboxes/{id}/down: stop without deleting (disk kept). */\n stopSandbox(id: string, opts: CallOptions = {}): Promise<StopSandboxResult> {\n return this.transport.json('POST', `/kosa8/v1/sandboxes/${enc(id)}/down`, opts);\n }\n\n /**\n * DELETE /kosa8/v1/sandboxes/{id}. Like `kosa8 sandbox rm`, the sandbox's\n * checkpoints and their snapshots are dropped too unless\n * `keepCheckpoints` is set.\n */\n async deleteSandbox(\n id: string,\n opts: CallOptions & { wipe?: boolean; keepCheckpoints?: boolean } = {},\n ): Promise<DeleteSandboxResult & { checkpoints_dropped: number }> {\n const out = await this.transport.json<DeleteSandboxResult>('DELETE', `/kosa8/v1/sandboxes/${enc(id)}`, {\n query: { wipe: opts.wipe },\n approval: opts.approval,\n signal: opts.signal,\n });\n let dropped = 0;\n if (!opts.keepCheckpoints) {\n try {\n const ids = await this.checkpoints.forget(id);\n for (const sid of ids) {\n await this.deleteSnapshot(sid, { wipe: opts.wipe, approval: opts.approval }).catch(() => undefined);\n }\n dropped = ids.length;\n } catch {\n /* bookkeeping debris, not a failed delete */\n }\n }\n return { ...out, checkpoints_dropped: dropped };\n }\n\n /** POST /kosa8/v1/sandboxes/{id}/pull: pull an image into the sandbox's private engine (fetched on the host). */\n pullIntoSandbox(id: string, ref: string, opts: CallOptions = {}): Promise<{ ok: boolean; image: string }> {\n return this.transport.json('POST', `/kosa8/v1/sandboxes/${enc(id)}/pull`, { ...opts, body: { ref } });\n }\n\n /** GET /kosa8/v1/sandboxes/{id}/images */\n sandboxImages(id: string, opts: CallOptions = {}): Promise<string[]> {\n return this.transport.json('GET', `/kosa8/v1/sandboxes/${enc(id)}/images`, opts);\n }\n\n /** GET /kosa8/v1/sandboxes/{id}/containers */\n sandboxContainers(id: string, opts: CallOptions = {}): Promise<Container[]> {\n return this.transport.json('GET', `/kosa8/v1/sandboxes/${enc(id)}/containers`, opts);\n }\n\n /** GET /kosa8/v1/sandboxes/{id}/egress: the policy the host enforces and what it decided. */\n sandboxEgress(id: string, opts: CallOptions = {}): Promise<EgressStatus> {\n return this.transport.json('GET', `/kosa8/v1/sandboxes/${enc(id)}/egress`, opts);\n }\n\n /**\n * POST /kosa8/v1/sandboxes/{id}/run: run a container to completion inside\n * the sandbox's engine. The image must already be in the sandbox\n * (`pullIntoSandbox`). Resolves with the exit code; a non-zero exit is not\n * an error.\n */\n run(id: string, image: string, args: string[] = [], opts: RunOptions = {}): Promise<ExecResult> {\n return this.collect(\n this.transport.frames('POST', `/kosa8/v1/sandboxes/${enc(id)}/run`, {\n body: { image, args, env: envList(opts.env) },\n approval: opts.approval,\n signal: opts.signal,\n }),\n opts,\n );\n }\n\n /** POST /kosa8/v1/sandboxes/{id}/start: start a detached container; resolves with its id. */\n async startContainer(id: string, image: string, args: string[] = [], opts: CallOptions = {}): Promise<string> {\n const out = await this.transport.json<{ ok: boolean; id: string }>('POST', `/kosa8/v1/sandboxes/${enc(id)}/start`, {\n ...opts,\n body: { image, args },\n });\n return out.id;\n }\n\n /** POST /kosa8/v1/sandboxes/{id}/exec: run a command in a running container of the sandbox. */\n exec(id: string, container: string, args: string[], opts: ExecOptions = {}): Promise<ExecResult> {\n return this.collect(this.execFrames(id, container, args, opts), opts);\n }\n\n /** The raw frame stream of an exec, for callers that want to process output as it arrives. */\n execFrames(id: string, container: string, args: string[], opts: CallOptions = {}): AsyncGenerator<Frame> {\n return this.transport.frames('POST', `/kosa8/v1/sandboxes/${enc(id)}/exec`, {\n body: { container, args },\n approval: opts.approval,\n signal: opts.signal,\n });\n }\n\n /** POST /kosa8/v1/sandboxes/{id}/start-interactive: start a container with stdin held open. */\n async startInteractive(\n id: string,\n image: string,\n args: string[] = [],\n opts: CallOptions & { env?: Record<string, string> | string[]; tty?: boolean } = {},\n ): Promise<string> {\n const out = await this.transport.json<{ ok: boolean; id: string }>(\n 'POST',\n `/kosa8/v1/sandboxes/${enc(id)}/start-interactive`,\n { body: { image, args, env: envList(opts.env), tty: opts.tty ?? false }, approval: opts.approval, signal: opts.signal },\n );\n return out.id;\n }\n\n /** POST /kosa8/v1/sandboxes/{id}/containers/{cid}/stdin: stream bytes into an interactive container's stdin. */\n writeStdin(\n id: string,\n container: string,\n data: Uint8Array | string | AsyncIterable<Uint8Array | string>,\n opts: CallOptions = {},\n ): Promise<{ ok: boolean }> {\n return this.transport.json('POST', `/kosa8/v1/sandboxes/${enc(id)}/containers/${enc(container)}/stdin`, {\n ...opts,\n rawBody: data,\n });\n }\n\n /** POST /kosa8/v1/sandboxes/{id}/containers/{cid}/attach: follow a container's output until it exits. */\n attach(id: string, container: string, opts: ExecOptions = {}): Promise<ExecResult> {\n return this.collect(\n this.transport.frames('POST', `/kosa8/v1/sandboxes/${enc(id)}/containers/${enc(container)}/attach`, {\n approval: opts.approval,\n signal: opts.signal,\n }),\n opts,\n );\n }\n\n // --- snapshots, fork, explore -------------------------------------------------\n\n /** POST /kosa8/v1/sandboxes/{id}/snapshot: capture memory, processes and disks. */\n snapshot(id: string, opts: CallOptions & { id?: string; encrypt?: boolean } = {}): Promise<SnapshotSandboxResult> {\n const body: Record<string, unknown> = {};\n if (opts.id) body.id = opts.id;\n if (opts.encrypt) body.encrypt = true;\n return this.transport.json('POST', `/kosa8/v1/sandboxes/${enc(id)}/snapshot`, {\n body,\n approval: opts.approval,\n signal: opts.signal,\n });\n }\n\n /** GET /kosa8/v1/snapshots */\n listSnapshots(opts: CallOptions = {}): Promise<Snapshot[]> {\n return this.transport.json('GET', '/kosa8/v1/snapshots', opts);\n }\n\n /** POST /kosa8/v1/snapshots/{id}/restore: boot a sandbox from a snapshot, processes resumed. */\n restoreSnapshot(snapshotId: string, opts: RestoreOptions = {}): Promise<RestoreResult> {\n const body: Record<string, unknown> = {};\n if (opts.name) body.name = opts.name;\n if (opts.label) body.label = opts.label;\n if (opts.allowTampered) body.allow_tampered = true;\n return this.transport.json('POST', `/kosa8/v1/snapshots/${enc(snapshotId)}/restore`, {\n body,\n approval: opts.approval,\n signal: opts.signal,\n });\n }\n\n /** DELETE /kosa8/v1/snapshots/{id} */\n deleteSnapshot(\n snapshotId: string,\n opts: CallOptions & { wipe?: boolean; force?: boolean } = {},\n ): Promise<DeleteSnapshotResult> {\n return this.transport.json('DELETE', `/kosa8/v1/snapshots/${enc(snapshotId)}`, {\n query: { wipe: opts.wipe, force: opts.force },\n approval: opts.approval,\n signal: opts.signal,\n });\n }\n\n /** POST /kosa8/v1/sandboxes/{id}/fork: N live copies of a running sandbox. */\n fork(id: string, opts: ForkOptions = {}): Promise<ForkResult> {\n const body: Record<string, unknown> = { n: opts.n ?? 1 };\n if (opts.prefix) body.prefix = opts.prefix;\n if (opts.label) body.label = opts.label;\n return this.transport.json('POST', `/kosa8/v1/sandboxes/${enc(id)}/fork`, {\n body,\n approval: opts.approval,\n signal: opts.signal,\n });\n }\n\n /**\n * Best-of-N, as `kosa8 explore`: fork the sandbox once per variant, run\n * each variant (`sh -c VARIANT` in `image`) in its own branch\n * concurrently, keep the fastest successful branch and delete the rest.\n */\n async explore(id: string, opts: ExploreOptions): Promise<ExploreResult> {\n const variants = opts.variants ?? [];\n if (variants.length < 2) {\n throw new Kosa8Error('give at least two variants; with one there is nothing to compare');\n }\n const image = opts.image ?? 'alpine:latest';\n const call = { approval: opts.approval, signal: opts.signal };\n if (opts.pull !== false) await this.pullIntoSandbox(id, image, call);\n const prefix = opts.prefix ?? `${id}-explore-${Math.floor(Date.now() / 1000) % 100000}`;\n const forked = await this.fork(id, { n: variants.length, prefix, ...call });\n const names = forked.forks.map((f) => f.id).filter((x): x is string => typeof x === 'string');\n if (names.length < variants.length) {\n throw new Kosa8Error(`forked ${names.length} branches for ${variants.length} variants; see listSandboxes() for what was created`);\n }\n const timeoutMs = opts.timeoutMs ?? 120_000;\n const branches = await Promise.all(\n variants.map((v, i) => this.runBranch(names[i]!, image, v, timeoutMs, opts)),\n );\n let winner = '';\n let best = Infinity;\n for (const b of branches) {\n if (!b.error && b.exit === 0 && b.duration_ms < best) {\n winner = b.name;\n best = b.duration_ms;\n }\n }\n if (opts.keep !== undefined) {\n if (!names.includes(opts.keep)) {\n throw new Kosa8Error(`keep ${opts.keep} is not one of the branches (${names.join(', ')}); all of them were kept`);\n }\n winner = opts.keep;\n }\n let removed = 0;\n if (!opts.keepAll) {\n for (const b of branches) {\n if (b.name !== winner) {\n try {\n await this.transport.json('DELETE', `/kosa8/v1/sandboxes/${enc(b.name)}`, { approval: opts.approval });\n removed++;\n } catch {\n /* reported by the count */\n }\n }\n }\n }\n return { parent: id, branches, winner, removed };\n }\n\n private async runBranch(\n name: string,\n image: string,\n variant: string,\n timeoutMs: number,\n opts: CallOptions,\n ): Promise<ExploreBranch> {\n const start = Date.now();\n const r: ExploreBranch = { name, variant, exit: 0, output: '', duration_ms: 0 };\n // A freshly restored branch can refuse the first connection while its\n // engine settles; retry connection-level failures briefly, as the CLI does.\n for (let attempt = 0; attempt < 4; attempt++) {\n const ctl = new AbortController();\n const timer = setTimeout(() => ctl.abort(new Error(`branch timed out after ${timeoutMs}ms`)), timeoutMs);\n const onAbort = () => ctl.abort(opts.signal?.reason);\n opts.signal?.addEventListener('abort', onAbort, { once: true });\n try {\n let out = '';\n const res = await this.run(name, image, ['sh', '-c', variant], {\n approval: opts.approval,\n signal: ctl.signal,\n onStdout: (c) => (out += c.toString('utf8')),\n onStderr: (c) => (out += c.toString('utf8')),\n });\n r.exit = res.exitCode;\n r.output = out.replace(/\\n+$/, '');\n delete r.error;\n break;\n } catch (err) {\n r.error = err instanceof Error ? err.message : String(err);\n if (err instanceof Kosa8StreamError) r.output = (err.stdout + err.stderr).replace(/\\n+$/, '');\n const transient = /connection refused|EOF|connection reset|broken pipe|no such file or directory|stream ended|ECONNREFUSED|ECONNRESET|socket hang up/i.test(\n r.error,\n );\n if (!transient || ctl.signal.aborted) break;\n await new Promise((res) => setTimeout(res, (attempt + 1) * 500));\n } finally {\n clearTimeout(timer);\n opts.signal?.removeEventListener('abort', onAbort);\n }\n }\n r.duration_ms = Date.now() - start;\n return r;\n }\n\n // --- checkpoints (client-side over snapshots, as pkg/checkpoint) ---------------\n\n /**\n * Save a restore point: a snapshot with id `<sandbox>-ckpt-<n>`, recorded on\n * the sandbox's checkpoint stack (the same store `kosa8 checkpoint` uses).\n * The oldest is evicted past 10.\n */\n async checkpoint(sandbox: string, opts: CheckpointOptions = {}): Promise<CheckpointResult> {\n const { id, evict } = await this.checkpoints.nextId(sandbox);\n const snap = await this.snapshot(sandbox, { id, approval: opts.approval, signal: opts.signal });\n // Evict only once the replacement exists.\n for (const old of evict) {\n await this.deleteSnapshot(old, { approval: opts.approval }).catch(() => undefined);\n }\n const checkpoint = await this.checkpoints.record({ id, sandbox, label: opts.label ?? '' }, evict);\n return { checkpoint, evicted: evict, snapshot: snap };\n }\n\n /** A sandbox's restore points, oldest first. */\n listCheckpoints(sandbox: string): Promise<Checkpoint[]> {\n return this.checkpoints.list(sandbox);\n }\n\n /**\n * Undo: put the sandbox back to a checkpoint under the same name, processes\n * resumed. Deletes the sandbox, then restores the snapshot with its name;\n * checkpoints taken after the target are discarded. Current state is lost.\n */\n async rewind(sandbox: string, opts: RewindOptions = {}): Promise<RewindResult> {\n const target = opts.to ? await this.checkpoints.resolve(sandbox, opts.to) : await this.checkpoints.latest(sandbox);\n const call = { approval: opts.approval, signal: opts.signal };\n // The sandbox must go first: the restored VM takes its name. A refusal\n // here (policy, approval) leaves everything as it was, and is thrown as is.\n await this.transport.json('DELETE', `/kosa8/v1/sandboxes/${enc(sandbox)}`, call);\n let restored: RestoreResult;\n try {\n restored = await this.restoreSnapshot(target.id, { name: sandbox, ...call });\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n throw new Kosa8Error(\n `restore failed and ${sandbox} is now stopped: ${msg} — recover with restoreSnapshot(${JSON.stringify(target.id)}, { name: ${JSON.stringify(sandbox)} })`,\n { cause: err },\n );\n }\n let dropped: string[] = [];\n try {\n dropped = await this.checkpoints.pop(sandbox, target.id);\n for (const sid of dropped) await this.deleteSnapshot(sid, { approval: opts.approval }).catch(() => undefined);\n } catch {\n /* bookkeeping */\n }\n return { sandbox: restored.sandbox, checkpoint: target, dropped, restore_ms: restored.restore_ms };\n }\n\n // --- toolbox: code -------------------------------------------------------------\n\n /**\n * POST /kosa8/v1/sandboxes/{id}/code: run a Python, JavaScript or\n * TypeScript snippet. It starts in `/workspace`. Charts a Python snippet\n * draws with matplotlib come back in `artifacts` as PNG bytes.\n */\n async runCode(id: string, code: string, opts: RunCodeOptions = {}): Promise<CodeResult> {\n const body: Record<string, unknown> = { language: opts.language ?? 'python', code };\n if (opts.image) body.image = opts.image;\n if (opts.env && Object.keys(opts.env).length > 0) body.env = opts.env;\n if (opts.timeoutS) body.timeout_s = opts.timeoutS;\n const d = await this.transport.json<Record<string, unknown>>('POST', `/kosa8/v1/sandboxes/${enc(id)}/code`, {\n body,\n approval: opts.approval,\n signal: opts.signal,\n });\n const exitCode = num(d.exit);\n const timedOut = d.timed_out === true;\n const arts = Array.isArray(d.artifacts) ? (d.artifacts as Record<string, unknown>[]) : [];\n return {\n ok: exitCode === 0 && !timedOut,\n exitCode,\n stdout: str(d.stdout),\n stderr: str(d.stderr),\n language: str(d.language),\n image: str(d.image),\n artifacts: arts.map((a) => ({ type: str(a.type), name: str(a.name), data: Buffer.from(str(a.data), 'base64') })),\n durationMs: num(d.duration_ms),\n timedOut,\n truncated: d.truncated === true,\n };\n }\n\n // --- toolbox: files ------------------------------------------------------------\n\n /** GET …/files: a folder in the workspace (default `/workspace`), or one entry. */\n async listFiles(id: string, path = '/workspace', opts: CallOptions = {}): Promise<FileInfo[]> {\n const d = await this.transport.json<{ files?: FileInfo[] }>('GET', `/kosa8/v1/sandboxes/${enc(id)}/files`, {\n ...opts,\n query: { path },\n });\n return d?.files ?? [];\n }\n\n /** GET …/files/stat: one entry, not following a symlink. */\n statFile(id: string, path: string, opts: CallOptions = {}): Promise<FileInfo> {\n return this.transport.json('GET', `/kosa8/v1/sandboxes/${enc(id)}/files/stat`, { ...opts, query: { path } });\n }\n\n /** GET …/files/content: a file's bytes. A body cut short is a Kosa8StreamError. */\n async readFile(id: string, path: string, opts: CallOptions = {}): Promise<Buffer> {\n const p = `/kosa8/v1/sandboxes/${enc(id)}/files/content`;\n const res = await this.transport.raw('GET', p, { query: { path }, signal: opts.signal, approval: opts.approval });\n let data: Buffer;\n try {\n data = await readAll(res.stream, opts.signal);\n } catch (err) {\n if (opts.signal?.aborted) throw err;\n throw new Kosa8StreamError(`${path}: read cut short: ${err instanceof Error ? err.message : String(err)}`,\n { stdout: '', stderr: '' }, { method: 'GET', path: p, cause: err });\n }\n if (res.status >= 400) {\n const text = data.toString('utf8');\n let body: unknown = text;\n try {\n body = JSON.parse(text);\n } catch {\n /* keep text */\n }\n throw errorFromResponse(res.status, body, { method: 'GET', path: p });\n }\n const want = res.headers['content-length'];\n if (want !== undefined && Number(want) !== data.length) {\n throw new Kosa8StreamError(`${path}: got ${data.length} of ${want} bytes`, { stdout: '', stderr: '' }, { method: 'GET', path: p });\n }\n return data;\n }\n\n /** A file's contents as text (UTF-8 by default). */\n async readText(id: string, path: string, opts: CallOptions & { encoding?: BufferEncoding } = {}): Promise<string> {\n return (await this.readFile(id, path, opts)).toString(opts.encoding ?? 'utf8');\n }\n\n /** PUT …/files/content: replace a file, making its folders. Answers the new entry. */\n writeFile(\n id: string,\n path: string,\n data: Uint8Array | string | AsyncIterable<Uint8Array | string>,\n opts: WriteFileOptions = {},\n ): Promise<FileInfo> {\n return this.transport.json('PUT', `/kosa8/v1/sandboxes/${enc(id)}/files/content`, {\n query: { path, mode: opts.mode },\n rawBody: data,\n approval: opts.approval,\n signal: opts.signal,\n });\n }\n\n /** DELETE …/files: a file, or with `recursive` a folder and everything in it. */\n deleteFile(id: string, path: string, opts: CallOptions & { recursive?: boolean } = {}): Promise<{ removed: string }> {\n return this.transport.json('DELETE', `/kosa8/v1/sandboxes/${enc(id)}/files`, {\n query: { path, recursive: opts.recursive },\n approval: opts.approval,\n signal: opts.signal,\n });\n }\n\n /** POST …/files/mkdir: a folder, with its parents. */\n makeDir(id: string, path: string, opts: CallOptions = {}): Promise<FileInfo> {\n return this.transport.json('POST', `/kosa8/v1/sandboxes/${enc(id)}/files/mkdir`, { ...opts, body: { path } });\n }\n\n /** POST …/files/move: rename or move a file or folder. Answers the entry at `to`. */\n moveFile(id: string, from: string, to: string, opts: CallOptions = {}): Promise<FileInfo> {\n return this.transport.json('POST', `/kosa8/v1/sandboxes/${enc(id)}/files/move`, { ...opts, body: { from, to } });\n }\n\n // --- toolbox: git ----------------------------------------------------------------\n\n /**\n * POST …/git: one git operation in the workspace. A git failure resolves\n * with `ok: false`; only a refusal (bad op, no sandbox, policy) throws.\n */\n async git(id: string, op: GitOp | (string & {}), opts: GitOptions = {}): Promise<GitResult> {\n const { approval, signal, authorName, authorEmail, ...fields } = opts;\n const body: Record<string, unknown> = { op };\n for (const [k, v] of Object.entries(fields)) if (v !== undefined) body[k] = v;\n if (authorName !== undefined) body.author_name = authorName;\n if (authorEmail !== undefined) body.author_email = authorEmail;\n const d = await this.transport.json<Record<string, unknown>>('POST', `/kosa8/v1/sandboxes/${enc(id)}/git`, {\n body,\n approval,\n signal,\n });\n const out: GitResult = {\n op: str(d.op) || op,\n ok: d.ok === true,\n exitCode: num(d.exit),\n stdout: str(d.stdout),\n stderr: str(d.stderr),\n path: str(d.path),\n };\n if (d.status) out.status = d.status as GitResult['status'];\n if (d.log) out.log = d.log as GitResult['log'];\n if (d.branches) out.branches = d.branches as GitResult['branches'];\n return out;\n }\n\n /** Clone `url` into the workspace (into `path`, else a folder named after the repo). */\n gitClone(id: string, url: string, opts: GitOptions = {}): Promise<GitResult> {\n return this.git(id, 'clone', { ...opts, url });\n }\n\n /** `git status` of the repository at `path`, parsed into `status`. */\n gitStatus(id: string, path: string, opts: GitOptions = {}): Promise<GitResult> {\n return this.git(id, 'status', { ...opts, path });\n }\n\n /** Stage everything (unless `addAll: false`) and commit. A failed add is returned as is. */\n async gitCommit(id: string, path: string, message: string, opts: GitCommitOptions = {}): Promise<GitResult> {\n const { addAll = true, ...rest } = opts;\n if (addAll) {\n const r = await this.git(id, 'add', { path, image: rest.image, approval: rest.approval, signal: rest.signal });\n if (!r.ok) return r;\n }\n return this.git(id, 'commit', { ...rest, path, message });\n }\n\n // --- toolbox: shell sessions -------------------------------------------------------\n\n /** POST …/sessions: a shell that keeps `cd` and `export` between commands. */\n createSession(id: string, name?: string, opts: CreateSessionOptions = {}): Promise<SessionInfo> {\n const body: Record<string, unknown> = {};\n if (name) body.name = name;\n if (opts.image) body.image = opts.image;\n if (opts.env && Object.keys(opts.env).length > 0) body.env = opts.env;\n return this.transport.json('POST', `/kosa8/v1/sandboxes/${enc(id)}/sessions`, {\n body,\n approval: opts.approval,\n signal: opts.signal,\n });\n }\n\n /** GET …/sessions */\n async listSessions(id: string, opts: CallOptions = {}): Promise<SessionInfo[]> {\n return (await this.transport.json<SessionInfo[] | null>('GET', `/kosa8/v1/sandboxes/${enc(id)}/sessions`, opts)) ?? [];\n }\n\n /** POST …/sessions/{name}/exec: run one command line in the session. */\n async sessionExec(id: string, session: string, command: string, opts: SessionExecOptions = {}): Promise<ShellResult> {\n const body: Record<string, unknown> = { command };\n if (opts.timeoutS) body.timeout_s = opts.timeoutS;\n const d = await this.transport.json<Record<string, unknown>>(\n 'POST',\n `/kosa8/v1/sandboxes/${enc(id)}/sessions/${enc(session)}/exec`,\n { body, approval: opts.approval, signal: opts.signal },\n );\n const exitCode = num(d.exit);\n const timedOut = d.timed_out === true;\n return {\n ok: exitCode === 0 && !timedOut,\n exitCode,\n stdout: str(d.stdout),\n stderr: str(d.stderr),\n cwd: str(d.cwd),\n durationMs: num(d.duration_ms),\n timedOut,\n truncated: d.truncated === true,\n };\n }\n\n /** Run a command in a session (default `main`), making the session on first use. */\n async shell(id: string, command: string, opts: ShellOptions = {}): Promise<ShellResult> {\n const { session = 'main', ...rest } = opts;\n try {\n return await this.sessionExec(id, session, command, rest);\n } catch (err) {\n if (!(err instanceof Kosa8NotFoundError) || !err.message.includes('no such session')) throw err;\n }\n await this.createSession(id, session, { approval: rest.approval, signal: rest.signal });\n return this.sessionExec(id, session, command, rest);\n }\n\n /** DELETE …/sessions/{name} */\n deleteSession(id: string, session: string, opts: CallOptions = {}): Promise<{ deleted: string }> {\n return this.transport.json('DELETE', `/kosa8/v1/sandboxes/${enc(id)}/sessions/${enc(session)}`, opts);\n }\n\n // --- toolbox: terminals ----------------------------------------------------------\n\n /**\n * POST …/pty: a container with a terminal; resolves with its id. Connect\n * to `/kosa8/v1/sandboxes/{id}/containers/{cid}/tty` with any WebSocket\n * client: binary messages are the terminal, text messages JSON control.\n */\n async startPty(id: string, opts: StartPtyOptions = {}): Promise<string> {\n const body: Record<string, unknown> = {};\n if (opts.image) body.image = opts.image;\n if (opts.command && opts.command.length > 0) body.command = opts.command;\n if (opts.cols && opts.rows) {\n body.cols = opts.cols;\n body.rows = opts.rows;\n }\n if (opts.env && Object.keys(opts.env).length > 0) body.env = opts.env;\n const out = await this.transport.json<{ id: string }>('POST', `/kosa8/v1/sandboxes/${enc(id)}/pty`, {\n body,\n approval: opts.approval,\n signal: opts.signal,\n });\n return out.id;\n }\n\n /** POST …/containers/{cid}/resize: set a terminal's size. */\n resizePty(id: string, container: string, cols: number, rows: number, opts: CallOptions = {}): Promise<{ ok: boolean }> {\n return this.transport.json('POST', `/kosa8/v1/sandboxes/${enc(id)}/containers/${enc(container)}/resize`, {\n ...opts,\n body: { cols, rows },\n });\n }\n\n // --- toolbox: previews -----------------------------------------------------------\n\n /** POST …/previews: a signed link, which expires, to a web server in the sandbox. */\n createPreview(id: string, port: number, opts: CreatePreviewOptions = {}): Promise<Preview> {\n const body: Record<string, unknown> = { port };\n if (opts.session) body.session = opts.session;\n if (opts.container) body.container = opts.container;\n if (opts.expiresInS) body.expires_in_s = opts.expiresInS;\n return this.transport.json('POST', `/kosa8/v1/sandboxes/${enc(id)}/previews`, {\n body,\n approval: opts.approval,\n signal: opts.signal,\n });\n }\n\n /** POST /kosa8/v1/previews/rotate: end every preview link at once. */\n revokePreviews(opts: CallOptions = {}): Promise<{ ok: boolean; revoked: string }> {\n return this.transport.json('POST', '/kosa8/v1/previews/rotate', opts);\n }\n\n // --- toolbox: lifecycle ----------------------------------------------------------\n\n /**\n * POST …/lifecycle: change auto-stop, auto-delete, TTL or ephemeral.\n * Options left out keep their value; 0 (or `false`) turns one off.\n */\n setLifecycle(id: string, opts: SetLifecycleOptions = {}): Promise<Sandbox> {\n const body: Lifecycle = {};\n if (opts.autoStopMin !== undefined) body.auto_stop_min = opts.autoStopMin;\n if (opts.autoDeleteMin !== undefined) body.auto_delete_min = opts.autoDeleteMin;\n if (opts.ttlMin !== undefined) body.ttl_min = opts.ttlMin;\n if (opts.ephemeral !== undefined) body.ephemeral = opts.ephemeral;\n return this.transport.json('POST', `/kosa8/v1/sandboxes/${enc(id)}/lifecycle`, {\n body,\n approval: opts.approval,\n signal: opts.signal,\n });\n }\n\n // --- toolbox: templates ----------------------------------------------------------\n\n /** GET /kosa8/v1/templates */\n async listTemplates(opts: CallOptions = {}): Promise<Template[]> {\n return (await this.transport.json<Template[] | null>('GET', '/kosa8/v1/templates', opts)) ?? [];\n }\n\n /** DELETE /kosa8/v1/templates/{name}. Sandboxes made from it keep their copy. */\n deleteTemplate(name: string, opts: CallOptions = {}): Promise<{ deleted: string }> {\n return this.transport.json('DELETE', `/kosa8/v1/templates/${enc(name)}`, opts);\n }\n\n /**\n * POST /kosa8/v1/templates: build `contextDir`'s Dockerfile in a throwaway\n * sandbox and keep the image as a template, for `createSandbox({ template })`.\n * The context is packed honouring `.dockerignore`. Resolves with the final\n * frame (`{ done, ok, image }`); a failed build throws Kosa8StreamError.\n */\n async buildTemplate(name: string, contextDir = '.', opts: BuildTemplateOptions = {}): Promise<Frame> {\n const dockerfile = opts.dockerfile ?? 'Dockerfile';\n const q = new URLSearchParams();\n q.append('name', name);\n q.append('dockerfile', dockerfile);\n for (const [k, v] of Object.entries(opts.buildArgs ?? {})) q.append('buildarg', `${k}=${v}`);\n const egress = egressString(opts.egress);\n if (egress) q.append('egress', egress);\n if (opts.replace) q.append('replace', '1');\n const ctx = await tarContext(contextDir, dockerfile);\n let out = '';\n for await (const f of this.transport.frames('POST', `/kosa8/v1/templates?${q.toString()}`, {\n rawBody: ctx,\n approval: opts.approval,\n signal: opts.signal,\n })) {\n if (f.done) {\n if (f.error) throw new Kosa8StreamError(f.error, { stdout: out, stderr: '' }, { daemonMessage: f.error });\n return f;\n }\n if (f.data) {\n out += f.data.toString('utf8');\n opts.onOutput?.(f.data, f.stream ?? 'stdout');\n }\n }\n throw new Kosa8StreamError('template build stream ended without a final frame', { stdout: out, stderr: '' });\n }\n\n // --- helpers -------------------------------------------------------------------\n\n /** A handle bound to one sandbox. */\n sandbox(id: string): SandboxHandle {\n return new SandboxHandle(this, id);\n }\n\n private async collect(\n frames: AsyncGenerator<Frame>,\n opts: { onStdout?: (c: Buffer) => void; onStderr?: (c: Buffer) => void; onStatus?: (c: Buffer) => void },\n ): Promise<ExecResult> {\n const out: Buffer[] = [];\n const err: Buffer[] = [];\n for await (const f of frames) {\n if (f.done) {\n const stdoutBytes = Buffer.concat(out);\n const stderrBytes = Buffer.concat(err);\n if (f.error) {\n throw new Kosa8StreamError(f.error, {\n stdout: stdoutBytes.toString('utf8'),\n stderr: stderrBytes.toString('utf8'),\n }, { daemonMessage: f.error });\n }\n return {\n exitCode: typeof f.exit === 'number' ? f.exit : 0,\n stdout: stdoutBytes.toString('utf8'),\n stderr: stderrBytes.toString('utf8'),\n stdoutBytes,\n stderrBytes,\n };\n }\n if (!f.data) continue;\n if (f.stream === 'stderr') {\n err.push(f.data);\n opts.onStderr?.(f.data);\n } else if (f.stream === 'status') {\n opts.onStatus?.(f.data);\n } else {\n out.push(f.data);\n opts.onStdout?.(f.data);\n }\n }\n throw new Kosa8StreamError('stream ended unexpectedly (no final frame)', {\n stdout: Buffer.concat(out).toString('utf8'),\n stderr: Buffer.concat(err).toString('utf8'),\n });\n }\n}\n\n/** Convenience wrapper: the client's sandbox methods bound to one sandbox id. */\nexport class SandboxHandle {\n constructor(\n readonly client: Kosa8Client,\n readonly id: string,\n ) {}\n\n info(opts?: CallOptions) {\n return this.client.getSandbox(this.id, opts);\n }\n start(opts?: CallOptions) {\n return this.client.startSandbox(this.id, opts);\n }\n stop(opts?: CallOptions) {\n return this.client.stopSandbox(this.id, opts);\n }\n delete(opts?: CallOptions & { wipe?: boolean; keepCheckpoints?: boolean }) {\n return this.client.deleteSandbox(this.id, opts);\n }\n pull(ref: string, opts?: CallOptions) {\n return this.client.pullIntoSandbox(this.id, ref, opts);\n }\n run(image: string, args?: string[], opts?: RunOptions) {\n return this.client.run(this.id, image, args, opts);\n }\n startContainer(image: string, args?: string[], opts?: CallOptions) {\n return this.client.startContainer(this.id, image, args, opts);\n }\n exec(container: string, args: string[], opts?: ExecOptions) {\n return this.client.exec(this.id, container, args, opts);\n }\n containers(opts?: CallOptions) {\n return this.client.sandboxContainers(this.id, opts);\n }\n images(opts?: CallOptions) {\n return this.client.sandboxImages(this.id, opts);\n }\n egress(opts?: CallOptions) {\n return this.client.sandboxEgress(this.id, opts);\n }\n snapshot(opts?: CallOptions & { id?: string; encrypt?: boolean }) {\n return this.client.snapshot(this.id, opts);\n }\n fork(opts?: ForkOptions) {\n return this.client.fork(this.id, opts);\n }\n explore(opts: ExploreOptions) {\n return this.client.explore(this.id, opts);\n }\n checkpoint(opts?: CheckpointOptions) {\n return this.client.checkpoint(this.id, opts);\n }\n checkpoints() {\n return this.client.listCheckpoints(this.id);\n }\n rewind(opts?: RewindOptions) {\n return this.client.rewind(this.id, opts);\n }\n runCode(code: string, opts?: RunCodeOptions) {\n return this.client.runCode(this.id, code, opts);\n }\n listFiles(path?: string, opts?: CallOptions) {\n return this.client.listFiles(this.id, path, opts);\n }\n statFile(path: string, opts?: CallOptions) {\n return this.client.statFile(this.id, path, opts);\n }\n readFile(path: string, opts?: CallOptions) {\n return this.client.readFile(this.id, path, opts);\n }\n readText(path: string, opts?: CallOptions & { encoding?: BufferEncoding }) {\n return this.client.readText(this.id, path, opts);\n }\n writeFile(path: string, data: Uint8Array | string | AsyncIterable<Uint8Array | string>, opts?: WriteFileOptions) {\n return this.client.writeFile(this.id, path, data, opts);\n }\n deleteFile(path: string, opts?: CallOptions & { recursive?: boolean }) {\n return this.client.deleteFile(this.id, path, opts);\n }\n makeDir(path: string, opts?: CallOptions) {\n return this.client.makeDir(this.id, path, opts);\n }\n moveFile(from: string, to: string, opts?: CallOptions) {\n return this.client.moveFile(this.id, from, to, opts);\n }\n git(op: GitOp | (string & {}), opts?: GitOptions) {\n return this.client.git(this.id, op, opts);\n }\n gitClone(url: string, opts?: GitOptions) {\n return this.client.gitClone(this.id, url, opts);\n }\n gitStatus(path: string, opts?: GitOptions) {\n return this.client.gitStatus(this.id, path, opts);\n }\n gitCommit(path: string, message: string, opts?: GitCommitOptions) {\n return this.client.gitCommit(this.id, path, message, opts);\n }\n createSession(name?: string, opts?: CreateSessionOptions) {\n return this.client.createSession(this.id, name, opts);\n }\n sessions(opts?: CallOptions) {\n return this.client.listSessions(this.id, opts);\n }\n sessionExec(session: string, command: string, opts?: SessionExecOptions) {\n return this.client.sessionExec(this.id, session, command, opts);\n }\n shell(command: string, opts?: ShellOptions) {\n return this.client.shell(this.id, command, opts);\n }\n deleteSession(session: string, opts?: CallOptions) {\n return this.client.deleteSession(this.id, session, opts);\n }\n startPty(opts?: StartPtyOptions) {\n return this.client.startPty(this.id, opts);\n }\n resizePty(container: string, cols: number, rows: number, opts?: CallOptions) {\n return this.client.resizePty(this.id, container, cols, rows, opts);\n }\n createPreview(port: number, opts?: CreatePreviewOptions) {\n return this.client.createPreview(this.id, port, opts);\n }\n setLifecycle(opts: SetLifecycleOptions) {\n return this.client.setLifecycle(this.id, opts);\n }\n}\n","// Copyright (c) 2026 kosa8. Licensed under the MIT License; see LICENSE.\n\n/**\n * kosa8 Cloud: the same sandboxes, run on kosa8's hosts (or your own, with\n * bring-your-own-cloud) instead of the local daemon.\n *\n * ```ts\n * import { Kosa8Cloud } from '@kosa8/sdk';\n *\n * const cloud = new Kosa8Cloud(); // KOSA8_API_KEY from the environment\n * const sbx = await cloud.sandboxes.create({ template: 'python' });\n * const r = await sbx.exec(['python3', '-c', 'print(6 * 7)']);\n * console.log(r.stdout); // \"42\\n\"\n * await sbx.delete();\n * ```\n *\n * Authentication is an API key (`k8c_live_…`) made in the cloud dashboard.\n * Errors are the SDK's usual typed errors; each carries the cloud's stable\n * `code` (for example `payment_required`, `quota_exceeded`).\n */\n\nimport { Kosa8ConnectionError, Kosa8Error, Kosa8TimeoutError, errorFromResponse } from './errors.js';\n\nexport const DEFAULT_CLOUD_URL = 'https://api.kosa8.com';\nexport const CLOUD_KEY_PREFIX = 'k8c_live_';\n\nexport interface Kosa8CloudOptions {\n /** API key. Defaults to the KOSA8_API_KEY environment variable. */\n apiKey?: string;\n /** Control-plane address. Defaults to KOSA8_CLOUD_URL, then https://api.kosa8.com. */\n baseUrl?: string;\n /** Where to read KOSA8_API_KEY and KOSA8_CLOUD_URL from. Defaults to process.env. */\n env?: Record<string, string | undefined>;\n /** A fetch to use instead of the global one (tests, proxies). */\n fetch?: typeof fetch;\n /** Per-request timeout. Default 120 s. */\n timeoutMs?: number;\n}\n\nexport interface CloudSandboxInfo {\n id: string;\n state: 'creating' | 'running' | 'sleeping' | 'stopped' | 'deleted' | 'error' | string;\n template: string;\n cpus: number;\n mem_mb: number;\n source: 'pool' | 'restore' | 'cold' | null;\n region: string | null;\n own_host: boolean;\n created_at: number;\n started_at: number | null;\n stopped_at: number | null;\n deleted_at: number | null;\n last_error: string | null;\n running_s: number;\n asleep_s: number;\n sleep_bytes: number;\n cost_usd: number;\n}\n\nexport interface CloudCreateOptions {\n /** Template key, such as base, python or node. Defaults to the org's setting. */\n template?: string;\n /** Region id, such as eu-hel1. Defaults to the org's setting (any region). */\n region?: string;\n /** Idle seconds before the sandbox sleeps; 0 never. Defaults to the org's setting. */\n sleepAfterS?: number;\n}\n\nexport interface CloudExecOptions {\n /** Image to run the command in. Defaults to the template's own image. */\n image?: string;\n /** Environment variables for the command. */\n env?: Record<string, string>;\n}\n\nexport interface CloudExecResult {\n exitCode: number | null;\n stdout: string;\n stderr: string;\n /** Set when the sandbox was asleep and woke for this command. */\n wokeMs?: number;\n}\n\nexport interface CloudInvocation {\n id: string;\n function: string;\n function_id: string;\n version: number;\n trigger: 'api' | 'web' | 'map' | 'cron' | string;\n}\n\nexport interface CloudInvokeResult<T = unknown> {\n invocation: CloudInvocation | null;\n /** False when the handler raised; `error` then says what. */\n ok: boolean;\n result?: T;\n error?: { type: string; message: string };\n logs?: string;\n source?: 'pool' | 'restore' | null;\n timings_ms?: { start: number | null; run: number | null; host_total: number | null; total: number };\n}\n\nexport interface CloudFunctionSpec {\n runtime: 'python3.12' | 'node22' | string;\n code: string;\n env?: Record<string, string>;\n timeout_s?: number;\n web?: 'off' | 'public' | 'key' | string;\n schedule?: string | null;\n [k: string]: unknown;\n}\n\ntype Json = Record<string, unknown>;\n\nfunction trimSlash(s: string): string {\n return s.replace(/\\/+$/, '');\n}\n\nfunction checkBase(url: string): string {\n let u: URL;\n try {\n u = new URL(url);\n } catch {\n throw new Kosa8Error(`kosa8 Cloud address is not a URL: ${url}`);\n }\n const local = u.hostname === 'localhost' || u.hostname === '127.0.0.1' || u.hostname === '[::1]';\n if (u.protocol !== 'https:' && !(u.protocol === 'http:' && local)) {\n // The API key travels in every request.\n throw new Kosa8Error(`kosa8 Cloud address must use https: ${url}`);\n }\n return trimSlash(u.toString());\n}\n\n/** A client for the kosa8 Cloud control plane. */\nexport class Kosa8Cloud {\n readonly baseUrl: string;\n readonly sandboxes: CloudSandboxes;\n readonly functions: CloudFunctions;\n private readonly apiKey: string;\n private readonly fetchImpl: typeof fetch;\n private readonly timeoutMs: number;\n\n constructor(options: Kosa8CloudOptions = {}) {\n const env = options.env ?? (typeof process !== 'undefined' ? process.env : {});\n const key = (options.apiKey ?? env.KOSA8_API_KEY ?? '').trim();\n if (!key) throw new Kosa8Error('no kosa8 Cloud API key: pass apiKey or set KOSA8_API_KEY');\n if (!key.startsWith(CLOUD_KEY_PREFIX)) throw new Kosa8Error(`a kosa8 Cloud API key starts with ${CLOUD_KEY_PREFIX}`);\n this.apiKey = key;\n this.baseUrl = checkBase(options.baseUrl ?? env.KOSA8_CLOUD_URL ?? DEFAULT_CLOUD_URL);\n const f = options.fetch ?? globalThis.fetch;\n if (typeof f !== 'function') throw new Kosa8Error('no fetch available; pass options.fetch');\n this.fetchImpl = f;\n this.timeoutMs = options.timeoutMs ?? 120_000;\n this.sandboxes = new CloudSandboxes(this);\n this.functions = new CloudFunctions(this);\n }\n\n /** The org, the key in use and, for a member's key, the member. */\n me(): Promise<Json> {\n return this.request('GET', '/v1/me');\n }\n\n /** This month's usage, bill estimate and whether work is paused for payment. */\n usage(): Promise<Json> {\n return this.request('GET', '/v1/usage');\n }\n\n /** @internal */\n async request<T = Json>(method: string, path: string, body?: unknown): Promise<T> {\n const ctl = new AbortController();\n const timer = setTimeout(() => ctl.abort(), this.timeoutMs);\n let resp: Response;\n try {\n resp = await this.fetchImpl(`${this.baseUrl}${path}`, {\n method,\n headers: {\n Authorization: `Bearer ${this.apiKey}`,\n Accept: 'application/json',\n ...(body !== undefined ? { 'Content-Type': 'application/json' } : {}),\n },\n body: body !== undefined ? JSON.stringify(body) : undefined,\n signal: ctl.signal,\n });\n } catch (e) {\n if (ctl.signal.aborted) {\n throw new Kosa8TimeoutError(`kosa8 Cloud did not answer within ${this.timeoutMs} ms`, { method, path, cause: e });\n }\n throw new Kosa8ConnectionError(`could not reach kosa8 Cloud at ${this.baseUrl}: ${String((e as Error)?.message ?? e)}`, { method, path, cause: e });\n } finally {\n clearTimeout(timer);\n }\n const text = await resp.text();\n let data: unknown = text;\n try {\n data = text === '' ? null : JSON.parse(text);\n } catch {\n // not JSON; kept as text\n }\n if (!resp.ok) throw cloudError(resp.status, data, { method, path });\n return data as T;\n }\n}\n\n/**\n * The cloud answers {error: code, message}. The SDK's errors read the\n * sentence as their message and keep the code.\n */\nfunction cloudError(status: number, body: unknown, ctx: { method: string; path: string }): Kosa8Error {\n let code: string | undefined;\n let msgBody: unknown = body;\n if (typeof body === 'object' && body !== null) {\n const b = body as Json;\n if (typeof b.error === 'string') code = b.error;\n msgBody = { error: typeof b.message === 'string' && b.message ? b.message : b.error };\n }\n return errorFromResponse(status, msgBody, { ...ctx, code });\n}\n\nexport class CloudSandboxes {\n constructor(private readonly cloud: Kosa8Cloud) {}\n\n /** Start a sandbox; resolves once it is running. */\n async create(opts: CloudCreateOptions = {}): Promise<CloudSandbox> {\n const body: Json = {};\n if (opts.template !== undefined) body.template = opts.template;\n if (opts.region !== undefined) body.region = opts.region;\n if (opts.sleepAfterS !== undefined) body.sleep_after_s = opts.sleepAfterS;\n const r = await this.cloud.request<{ sandbox: CloudSandboxInfo }>('POST', '/v1/sandboxes', body);\n return new CloudSandbox(this.cloud, r.sandbox);\n }\n\n /** The org's sandboxes; with all, deleted ones too. */\n async list(opts: { all?: boolean } = {}): Promise<CloudSandbox[]> {\n const r = await this.cloud.request<{ sandboxes: CloudSandboxInfo[] }>('GET', `/v1/sandboxes${opts.all ? '?all=1' : ''}`);\n return r.sandboxes.map((s) => new CloudSandbox(this.cloud, s));\n }\n\n async get(id: string): Promise<CloudSandbox> {\n const r = await this.cloud.request<{ sandbox: CloudSandboxInfo }>('GET', `/v1/sandboxes/${encodeURIComponent(id)}`);\n return new CloudSandbox(this.cloud, r.sandbox);\n }\n}\n\n/** One cloud sandbox. `info` is its state as of the last call. */\nexport class CloudSandbox {\n constructor(private readonly cloud: Kosa8Cloud, public info: CloudSandboxInfo) {}\n\n get id(): string {\n return this.info.id;\n }\n\n private path(suffix = ''): string {\n return `/v1/sandboxes/${encodeURIComponent(this.info.id)}${suffix}`;\n }\n\n /**\n * Run a command and wait for it. A string runs through `sh -c`. A\n * sleeping sandbox wakes for it.\n */\n async exec(cmd: string | string[], opts: CloudExecOptions = {}): Promise<CloudExecResult> {\n const argv = typeof cmd === 'string' ? ['sh', '-c', cmd] : cmd;\n const body: Json = { cmd: argv };\n if (opts.image !== undefined) body.image = opts.image;\n if (opts.env) body.env = Object.entries(opts.env).map(([k, v]) => `${k}=${v}`);\n const r = await this.cloud.request<{ exit: number | null; stdout: string; stderr: string; woke_ms?: number }>(\n 'POST', this.path('/exec'), body,\n );\n const out: CloudExecResult = { exitCode: r.exit, stdout: r.stdout ?? '', stderr: r.stderr ?? '' };\n if (typeof r.woke_ms === 'number') out.wokeMs = r.woke_ms;\n return out;\n }\n\n /** Snapshot it and free its VM; it then costs only snapshot storage. */\n async sleep(): Promise<this> {\n this.info = (await this.cloud.request<{ sandbox: CloudSandboxInfo }>('POST', this.path('/sleep'))).sandbox;\n return this;\n }\n\n /** Restore a sleeping sandbox, files and all. */\n async wake(): Promise<this> {\n this.info = (await this.cloud.request<{ sandbox: CloudSandboxInfo }>('POST', this.path('/wake'))).sandbox;\n return this;\n }\n\n async refresh(): Promise<this> {\n this.info = (await this.cloud.request<{ sandbox: CloudSandboxInfo }>('GET', this.path())).sandbox;\n return this;\n }\n\n async delete(): Promise<void> {\n await this.cloud.request('DELETE', this.path());\n }\n}\n\nexport class CloudFunctions {\n constructor(private readonly cloud: Kosa8Cloud) {}\n\n /** Deploy (create or replace) a function; every deploy bumps its version. */\n deploy(name: string, spec: CloudFunctionSpec): Promise<Json> {\n return this.cloud.request('PUT', `/v1/functions/${encodeURIComponent(name)}`, spec);\n }\n\n async list(): Promise<Json[]> {\n return (await this.cloud.request<{ functions: Json[] }>('GET', '/v1/functions')).functions;\n }\n\n get(name: string): Promise<Json> {\n return this.cloud.request('GET', `/v1/functions/${encodeURIComponent(name)}`);\n }\n\n async delete(name: string): Promise<void> {\n await this.cloud.request('DELETE', `/v1/functions/${encodeURIComponent(name)}`);\n }\n\n /** Call it once. A handler that raises resolves with ok: false, not a throw. */\n invoke<T = unknown>(name: string, event: unknown = null): Promise<CloudInvokeResult<T>> {\n return this.cloud.request('POST', `/v1/functions/${encodeURIComponent(name)}/invoke`, { event });\n }\n\n /** One call per event, results in input order. */\n map<T = unknown>(name: string, events: unknown[], opts: { concurrency?: number } = {}): Promise<{\n function: string; version: number; count: number; succeeded: number; failed: number; total_ms: number;\n results: CloudInvokeResult<T>[];\n }> {\n const body: Json = { events };\n if (opts.concurrency !== undefined) body.concurrency = opts.concurrency;\n return this.cloud.request('POST', `/v1/functions/${encodeURIComponent(name)}/map`, body);\n }\n}\n"],"mappings":"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","names":["fs","import_node_fs","path","fsp","fs","os","path","path","path"]}