mindwire 0.1.24 → 0.1.25
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +12 -1
- package/dist/cli.js.map +1 -1
- package/dist/computer.d.ts +16 -0
- package/dist/index.cjs +12 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +12 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/errors.ts","../src/binary-cache.ts","../src/http.ts","../src/sse.ts","../src/run.ts","../src/workspace.ts","../src/surfaces.ts","../src/service.ts","../src/execution.ts","../src/computer.ts","../src/embedded.ts","../src/daemon-binary.ts","../src/version.ts","../src/target/index.ts","../src/client.ts","../src/target/ssh.ts","../src/target/host.ts","../src/target/container.ts","../src/target/docker.ts","../src/target/oblien.ts","../src/catalog/index.ts","../src/index.ts"],"names":["MindwireError","ApiError","RunFailedError","TimeoutError","payload","binaryCacheDirectory","cachedExecutable","cacheExecutable","emit","hostPort","shared","DEFAULT_PORT","DEFAULT_AGENT","DEFAULT_AGENT_CWD","docker","env"],"mappings":"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","file":"index.cjs","sourcesContent":["/** Base class for every error thrown by the SDK. */\nexport class MindwireError extends Error {\n constructor(message: string, options?: { cause?: unknown }) {\n super(message, options);\n this.name = \"MindwireError\";\n }\n}\n\n/**\n * A non-2xx HTTP response from the daemon. `body` is the parsed JSON error payload when the\n * daemon returned one (it uses `{ \"error\": \"...\" }`), otherwise the raw text.\n */\nexport class ApiError extends MindwireError {\n readonly status: number;\n readonly url: string;\n readonly method: string;\n readonly body: unknown;\n\n constructor(args: { status: number; url: string; method: string; body: unknown }) {\n super(ApiError.messageFor(args));\n this.name = \"ApiError\";\n this.status = args.status;\n this.url = args.url;\n this.method = args.method;\n this.body = args.body;\n }\n\n private static messageFor({\n status,\n method,\n url,\n body,\n }: {\n status: number;\n method: string;\n url: string;\n body: unknown;\n }): string {\n const detail =\n body && typeof body === \"object\" && \"error\" in body && typeof body.error === \"string\"\n ? body.error\n : typeof body === \"string\" && body.trim() !== \"\"\n ? body.trim()\n : \"\";\n const base = `${method} ${url} failed with ${status}`;\n return detail ? `${base}: ${detail}` : base;\n }\n}\n\n/**\n * Thrown by {@link import(\"./run.js\").Run.wait} when a run ends in a non-success terminal state\n * (`error`/`cancelled`), or when the event stream ends before the run reaches any terminal state —\n * a dropped/truncated stream. The `status` is whatever the run was in when `wait()` gave up, so a\n * truncated stream surfaces as e.g. `run <id> running: event stream ended …` rather than silently\n * returning a success-shaped result.\n */\nexport class RunFailedError extends MindwireError {\n readonly status: string;\n readonly runId: string;\n\n constructor(runId: string, status: string, detail?: string) {\n super(detail ? `run ${runId} ${status}: ${detail}` : `run ${runId} ${status}`);\n this.name = \"RunFailedError\";\n this.runId = runId;\n this.status = status;\n }\n}\n\n/**\n * Thrown when a unary request exceeds the client's `requestTimeoutMs` deadline. A hung daemon or a\n * dead tunnel would otherwise block the caller forever; this bounds every non-streaming call. SSE\n * streams are long-lived and are never subject to this timeout.\n */\nexport class TimeoutError extends MindwireError {\n readonly method: string;\n readonly path: string;\n readonly timeoutMs: number;\n\n constructor(method: string, path: string, timeoutMs: number) {\n super(`mindwire: ${method} ${path} timed out after ${timeoutMs}ms`);\n this.name = \"TimeoutError\";\n this.method = method;\n this.path = path;\n this.timeoutMs = timeoutMs;\n }\n}\n","// Shared verified executable cache for the daemon and optional connection helpers.\n// Node modules stay lazy so importing the SDK in a browser remains supported.\nimport { MindwireError } from \"./errors.js\";\n\nexport async function binaryCacheDirectory(platform = process.platform): Promise<string> {\n const path = await import(\"node:path\");\n const { homedir } = await import(\"node:os\");\n const homeDirectory = homedir();\n return platform === \"darwin\" ? path.join(homeDirectory, \"Library\", \"Caches\", \"mindwire\")\n : platform === \"win32\" ? path.join(process.env.LOCALAPPDATA ?? homeDirectory, \"mindwire\", \"Cache\")\n : path.join(process.env.XDG_CACHE_HOME ?? path.join(homeDirectory, \".cache\"), \"mindwire\");\n}\n\nexport async function executableChecksum(bytes: Uint8Array): Promise<string> {\n const { createHash } = await import(\"node:crypto\");\n return createHash(\"sha256\").update(bytes).digest(\"hex\");\n}\n\nexport async function verifyReleaseBytes(bytes: Uint8Array, expected: string, name: string): Promise<void> {\n if (!/^[a-f0-9]{64}$/i.test(expected) || await executableChecksum(bytes) !== expected.toLowerCase()) {\n throw new MindwireError(`mindwire: checksum verification failed for ${name}`);\n }\n}\n\nexport async function cachedExecutable(bin: string): Promise<string | undefined> {\n const fs = await import(\"node:fs/promises\");\n try {\n const [bytes, checksum] = await Promise.all([fs.readFile(bin), fs.readFile(`${bin}.sha256`, \"utf8\")]);\n await verifyReleaseBytes(bytes, checksum.trim(), bin);\n return bin;\n } catch { return undefined; }\n}\n\nexport async function cacheExecutable(bin: string, bytes: Uint8Array, expected: string): Promise<string> {\n await verifyReleaseBytes(bytes, expected, bin);\n const fs = await import(\"node:fs/promises\");\n const { dirname } = await import(\"node:path\");\n const { randomUUID } = await import(\"node:crypto\");\n await fs.mkdir(dirname(bin), { recursive: true, mode: 0o700 });\n // Unique temporary names also cover concurrent acquisitions in the same process.\n const temp = `${bin}.${randomUUID()}.tmp`;\n try {\n await fs.writeFile(temp, bytes, { mode: 0o755, flag: \"wx\" });\n await fs.writeFile(`${temp}.sha256`, `${expected.toLowerCase()}\\n`, { mode: 0o600, flag: \"wx\" });\n await fs.rename(temp, bin);\n await fs.rename(`${temp}.sha256`, `${bin}.sha256`);\n return bin;\n } finally {\n await fs.rm(temp, { force: true });\n await fs.rm(`${temp}.sha256`, { force: true });\n }\n}\n","import { ApiError, MindwireError, TimeoutError } from \"./errors.js\";\n\n/** A `fetch` implementation. Defaults to the global `fetch` (Node 18+, Bun, Deno, browsers). */\nexport type FetchLike = (input: string, init?: RequestInit) => Promise<Response>;\n\n/** Default deadline for a single unary request. Long enough to cover a cold daemon, short enough\n * that a wedged connection surfaces as an error instead of an indefinite hang. */\nconst DEFAULT_TIMEOUT_MS = 120_000;\n\n/** True for a fetch rejection caused by an `AbortSignal` firing (user cancel or our own timeout). */\nfunction isAbortError(e: unknown): boolean {\n return typeof e === \"object\" && e !== null && (e as { name?: unknown }).name === \"AbortError\";\n}\n\n/**\n * Fetches the current bearer token for a transport whose credential rotates (e.g. the Oblien\n * gateway JWT). Called per request — implementations should cache and only mint on `{force:true}`\n * or expiry. `request()`/`open()` call it with `{force:true}` once on a `401`, then retry.\n */\nexport type TokenGetter = (opts?: { force?: boolean }) => Promise<string | undefined>;\n\n/**\n * Resolves the daemon's base URL, plus an optional static token, an optional dynamic `getToken`\n * (for rotating credentials), and optional per-transport `headers` merged into every request\n * (e.g. the Oblien proxy target). Called once, lazily, and memoized.\n */\nexport type BaseResolver = () => Promise<{\n baseUrl: string;\n token?: string;\n getToken?: TokenGetter;\n headers?: Record<string, string>;\n /**\n * A transport-specific `fetch` for this base — used for both unary requests and SSE streams. A\n * sandbox adapter supplies it to route every call through its runtime (e.g. Oblien's `rt.proxy`);\n * when omitted the client's default fetch is used, so embedded/remote transports are unchanged.\n */\n fetch?: FetchLike;\n}>;\n\nexport interface HttpOptions {\n /** Base URL of a running daemon, e.g. `http://127.0.0.1:8790`. */\n baseUrl?: string;\n /** Per-sandbox bearer token. */\n token?: string;\n /** Lazily resolve the base URL (used by the embedded transport to spawn on first call). */\n resolveBase?: BaseResolver;\n /** Custom fetch. Defaults to global `fetch`. */\n fetch?: FetchLike;\n /** Extra headers merged into every request. */\n headers?: Record<string, string>;\n /**\n * Deadline in milliseconds for a single unary request. Does NOT apply to SSE streams (`open()`),\n * which are long-lived by design. Defaults to {@link DEFAULT_TIMEOUT_MS}; pass `0` to disable.\n */\n timeoutMs?: number;\n}\n\nexport interface RequestInitLike {\n query?: Record<string, string | number | boolean | undefined>;\n body?: unknown;\n signal?: AbortSignal;\n headers?: Record<string, string>;\n}\n\ninterface Base {\n baseUrl: string;\n token?: string;\n getToken?: TokenGetter;\n headers?: Record<string, string>;\n fetch?: FetchLike;\n}\n\n/**\n * The low-level transport: URL/auth/JSON/error plumbing shared by every high-level method.\n * The base URL is resolved lazily and memoized — a fixed `baseUrl` resolves instantly; the\n * embedded transport spawns the daemon on the first request.\n */\nexport class Http {\n private readonly fetchImpl: FetchLike;\n private readonly baseHeaders: Record<string, string>;\n private readonly resolver: BaseResolver;\n private readonly timeoutMs: number;\n private cached: Base | null = null;\n private pending: Promise<Base> | null = null;\n\n constructor(opts: HttpOptions) {\n const f = opts.fetch ?? (globalThis.fetch as FetchLike | undefined);\n if (!f) {\n throw new MindwireError(\n \"mindwire: no global fetch found — pass a `fetch` implementation in the client options\",\n );\n }\n this.fetchImpl = f;\n this.baseHeaders = { ...opts.headers };\n this.timeoutMs = opts.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n if (opts.baseUrl) {\n const base: Base = { baseUrl: opts.baseUrl.replace(/\\/+$/, \"\"), token: opts.token };\n this.resolver = async () => base;\n } else if (opts.resolveBase) {\n const rb = opts.resolveBase;\n this.resolver = async () => {\n const r = await rb();\n return {\n baseUrl: r.baseUrl.replace(/\\/+$/, \"\"),\n token: r.token ?? opts.token,\n getToken: r.getToken,\n headers: r.headers,\n fetch: r.fetch,\n };\n };\n } else {\n throw new MindwireError(\"mindwire: Http requires a baseUrl or a resolveBase\");\n }\n }\n\n /**\n * One fetch, with raw network failures wrapped as {@link MindwireError} so callers see a typed\n * SDK error instead of a bare `TypeError: fetch failed`. An abort (the request's own signal, or\n * our timeout controller) is re-thrown untouched — `fetchWithTimeout` classifies it.\n */\n private async fetchOnce(\n f: FetchLike,\n url: string,\n init: RequestInit,\n method: string,\n path: string,\n ): Promise<Response> {\n try {\n return await f(url, init);\n } catch (e) {\n const aborted = init.signal?.aborted ?? false;\n if (aborted || isAbortError(e)) throw e; // an abort, not a network fault — leave it for the caller\n throw new MindwireError(`mindwire: ${method} ${path} — network request failed`, { cause: e });\n }\n }\n\n /**\n * `fetchOnce` plus a timeout that composes with the caller's `signal`. A hand-rolled controller\n * (not `AbortSignal.timeout`/`AbortSignal.any`, which need Node 20.3+/18.17+) fires after\n * `timeoutMs`; whichever aborts first wins. Timeout → {@link TimeoutError}; the caller's own abort\n * propagates as-is (its `reason`). `timeoutMs<=0` disables the deadline entirely.\n */\n private async fetchWithTimeout(\n f: FetchLike,\n url: string,\n init: RequestInit,\n userSignal: AbortSignal | undefined,\n method: string,\n path: string,\n ): Promise<Response> {\n if (!this.timeoutMs || this.timeoutMs <= 0) {\n return this.fetchOnce(f, url, { ...init, ...(userSignal ? { signal: userSignal } : {}) }, method, path);\n }\n const ctrl = new AbortController();\n const onAbort = () => ctrl.abort(userSignal?.reason);\n if (userSignal) {\n if (userSignal.aborted) ctrl.abort(userSignal.reason);\n else userSignal.addEventListener(\"abort\", onAbort, { once: true });\n }\n let timedOut = false;\n const timer = setTimeout(() => {\n timedOut = true;\n ctrl.abort();\n }, this.timeoutMs);\n try {\n return await this.fetchOnce(f, url, { ...init, signal: ctrl.signal }, method, path);\n } catch (e) {\n if (timedOut) throw new TimeoutError(method, path, this.timeoutMs);\n if (userSignal?.aborted) throw userSignal.reason ?? e; // caller cancelled — surface their reason\n throw e;\n } finally {\n clearTimeout(timer);\n if (userSignal) userSignal.removeEventListener(\"abort\", onAbort);\n }\n }\n\n /**\n * The bearer token for the next request. Prefers the transport's dynamic `getToken` (which\n * caches and mints on demand); falls back to the static token resolved at base time. `force`\n * asks the getter to re-mint — used once on a 401 before retrying.\n */\n private async authToken(base: Base, force: boolean): Promise<string | undefined> {\n if (base.getToken) {\n const t = await base.getToken(force ? { force: true } : undefined);\n return t ?? base.token;\n }\n return base.token;\n }\n\n private base(): Promise<Base> {\n if (this.cached) return Promise.resolve(this.cached);\n if (!this.pending) {\n // Memoize the in-flight provision, but drop it on failure so a cold-start error (e.g. a fresh\n // SSH box that wasn't ready) can be retried by the next `ensure()`/request instead of latching.\n this.pending = this.resolver()\n .then((b) => (this.cached = b))\n .catch((err) => {\n this.pending = null;\n throw err;\n });\n }\n return this.pending;\n }\n\n /**\n * Resolve the base eagerly and memoize it — provisions the transport (spawns the embedded daemon,\n * connects the sandbox/SSH/Docker target, …) now instead of on the first request. Idempotent: this\n * awaits the *same* memoized promise the first `request()`/`open()` awaits, so the target's\n * `connect()` fires exactly once. Backs {@link import(\"./client.js\").Mindwire.ensure}.\n */\n async ready(): Promise<void> {\n await this.base();\n }\n\n private url(baseUrl: string, path: string, query?: RequestInitLike[\"query\"]): string {\n const u = new URL(baseUrl + (path.startsWith(\"/\") ? path : `/${path}`));\n if (query) {\n for (const [k, v] of Object.entries(query)) {\n if (v !== undefined) u.searchParams.set(k, String(v));\n }\n }\n return u.toString();\n }\n\n private headers(token: string | undefined, extra?: Record<string, string>, hasBody = false): Record<string, string> {\n const h: Record<string, string> = { Accept: \"application/json\", ...this.baseHeaders, ...extra };\n if (token) h[\"Authorization\"] = `Bearer ${token}`;\n if (hasBody) h[\"Content-Type\"] = \"application/json\";\n return h;\n }\n\n async request<T>(method: string, path: string, init: RequestInitLike = {}): Promise<T> {\n const base = await this.base();\n const hasBody = init.body !== undefined;\n const url = this.url(base.baseUrl, path, init.query);\n const extra = { ...base.headers, ...init.headers };\n const f = base.fetch ?? this.fetchImpl;\n const send = async (force: boolean) =>\n this.fetchWithTimeout(\n f,\n url,\n {\n method,\n headers: this.headers(await this.authToken(base, force), extra, hasBody),\n body: hasBody ? JSON.stringify(init.body) : undefined,\n },\n init.signal,\n method,\n path,\n );\n\n let res = await send(false);\n // One-shot re-mint + retry for rotating credentials (e.g. an expired gateway JWT).\n if (res.status === 401 && base.getToken) res = await send(true);\n\n if (!res.ok) throw await this.toApiError(method, res);\n if (res.status === 204) return undefined as T;\n\n const text = await res.text();\n if (text === \"\") return undefined as T;\n try {\n return JSON.parse(text) as T;\n } catch (e) {\n throw new MindwireError(`mindwire: ${method} ${path} returned a non-JSON body`, { cause: e });\n }\n }\n\n /** Open a streaming response (SSE). Caller owns the body. */\n async open(method: string, path: string, init: RequestInitLike = {}): Promise<Response> {\n const base = await this.base();\n const url = this.url(base.baseUrl, path, init.query);\n const extra = { Accept: \"text/event-stream\", ...base.headers, ...init.headers };\n const f = base.fetch ?? this.fetchImpl;\n // No timeout: SSE streams are long-lived. We still wrap network faults (via fetchOnce) so a\n // connection refused surfaces as a MindwireError rather than a bare `TypeError: fetch failed`.\n const send = async (force: boolean) =>\n this.fetchOnce(\n f,\n url,\n {\n method,\n headers: this.headers(await this.authToken(base, force), extra, init.body !== undefined),\n ...(init.body !== undefined ? { body: JSON.stringify(init.body) } : {}),\n ...(init.signal ? { signal: init.signal } : {}),\n },\n method,\n path,\n );\n\n let res = await send(false);\n if (res.status === 401 && base.getToken) res = await send(true);\n\n if (!res.ok) throw await this.toApiError(method, res);\n if (!res.body)\n throw new MindwireError(`mindwire: ${method} ${path} returned no response body to stream`);\n return res;\n }\n\n private async toApiError(method: string, res: Response): Promise<ApiError> {\n let body: unknown = \"\";\n try {\n const text = await res.text();\n try {\n body = text ? JSON.parse(text) : \"\";\n } catch {\n body = text;\n }\n } catch {\n /* ignore body read failures */\n }\n return new ApiError({ status: res.status, url: res.url, method, body });\n }\n}\n","/**\n * A minimal, dependency-free Server-Sent Events reader.\n *\n * The daemon streams `data: <json>\\n\\n` frames (one JSON object per event) plus `: ping`\n * comment keepalives and an initial `{ \"type\": \"status\", \"meta\": { \"stream\": \"open\" } }`\n * sentinel. This parser handles multi-line `data:` fields and `\\r\\n`/`\\n` line endings, and\n * yields the JSON-parsed payload of each event.\n *\n * We read via `ReadableStream.getReader()` rather than `for await` so it works on every\n * runtime with WHATWG streams (Node 18+ undici, Deno, Bun, browsers), not only those that\n * made the stream async-iterable.\n */\nexport async function* readSSE<T>(\n body: ReadableStream<Uint8Array>,\n signal?: AbortSignal,\n): AsyncGenerator<T, void, unknown> {\n const reader = body.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n const onAbort = () => void reader.cancel().catch(() => {});\n if (signal) {\n if (signal.aborted) {\n await reader.cancel().catch(() => {});\n return;\n }\n signal.addEventListener(\"abort\", onAbort, { once: true });\n }\n\n try {\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n buffer += decoder.decode(value, { stream: true });\n\n // Events are separated by a blank line. Normalize CRLF first.\n let sep: number;\n while ((sep = indexOfBlankLine(buffer)) !== -1) {\n const rawEvent = buffer.slice(0, sep);\n buffer = buffer.slice(sepEnd(buffer, sep));\n const payload = parseEvent(rawEvent);\n if (payload !== undefined) yield JSON.parse(payload) as T;\n }\n }\n // Flush any trailing event that wasn't terminated by a blank line.\n const payload = parseEvent(buffer);\n if (payload !== undefined) yield JSON.parse(payload) as T;\n } finally {\n if (signal) signal.removeEventListener(\"abort\", onAbort);\n // Breaking a consumer loop must release the HTTP stream as well as its reader.\n await reader.cancel().catch(() => {});\n reader.releaseLock();\n }\n}\n\n/** Index of the start of the blank-line separator (`\\n\\n` or `\\r\\n\\r\\n`), or -1. */\nfunction indexOfBlankLine(s: string): number {\n const a = s.indexOf(\"\\n\\n\");\n const b = s.indexOf(\"\\r\\n\\r\\n\");\n if (a === -1) return b;\n if (b === -1) return a;\n return Math.min(a, b);\n}\n\n/** Length of the separator that starts at `idx`, so the next event begins after it. */\nfunction sepEnd(s: string, idx: number): number {\n return s.startsWith(\"\\r\\n\\r\\n\", idx) ? idx + 4 : idx + 2;\n}\n\n/**\n * Extract the concatenated `data:` payload of one raw SSE event block. Comment lines\n * (starting with `:`) and non-data fields are ignored. Returns `undefined` for an event\n * with no data lines (e.g. a lone keepalive comment).\n */\nfunction parseEvent(block: string): string | undefined {\n const lines = block.split(/\\r\\n|\\n/);\n const data: string[] = [];\n for (const line of lines) {\n if (line === \"\" || line.startsWith(\":\")) continue;\n const colon = line.indexOf(\":\");\n const field = colon === -1 ? line : line.slice(0, colon);\n if (field !== \"data\") continue;\n let value = colon === -1 ? \"\" : line.slice(colon + 1);\n if (value.startsWith(\" \")) value = value.slice(1); // SSE strips one leading space\n data.push(value);\n }\n if (data.length === 0) return undefined;\n return data.join(\"\\n\");\n}\n","import type { Http } from \"./http.js\";\nimport { readSSE } from \"./sse.js\";\nimport { RunFailedError } from \"./errors.js\";\nimport type { Event, ResultInfo, RespondInput, RunSnapshot, Run as RunData } from \"./types.js\";\n\nexport interface StreamOptions {\n signal?: AbortSignal;\n /** Resume after a snapshot/event cursor without replaying earlier output. */\n after?: number;\n /**\n * Include the daemon's `{ type: \"status\", meta: { stream: \"open\" } }` sentinel that is\n * flushed the instant the stream opens (used to detect a live vs. buffered transport).\n * Off by default — most consumers only care about model output.\n */\n includeOpenSentinel?: boolean;\n}\n\nexport interface WaitResult {\n run: RunData;\n result?: ResultInfo;\n}\n\nconst TERMINAL = new Set([\"done\", \"error\", \"cancelled\"]);\n\n/**\n * A handle to one turn's run. Wraps the durable `Run` record returned by `POST /turns` and\n * exposes the unified event stream, cancellation, and status polling.\n *\n * Stream it directly:\n *\n * ```ts\n * const run = await mw.turn({ chatId, message: \"refactor foo\" });\n * for await (const ev of run) {\n * if (ev.type === \"text\") process.stdout.write(ev.text ?? \"\");\n * }\n * ```\n */\nexport class Run {\n private data: RunData;\n private readonly http: Http;\n\n constructor(http: Http, data: RunData) {\n this.http = http;\n this.data = data;\n }\n\n get id(): string {\n return this.data.id;\n }\n get chatId(): string {\n return this.data.chatId;\n }\n get agent(): string | undefined {\n return this.data.agent;\n }\n get status(): RunData[\"status\"] {\n return this.data.status;\n }\n /** `\"resolve\"` on the parent of a global-resolve run; `undefined` for an ordinary turn. */\n get kind(): RunData[\"kind\"] {\n return this.data.kind;\n }\n /** On a child iteration of a resolve run, the id of its parent resolve run; else `undefined`. */\n get parentId(): string | undefined {\n return this.data.parentId;\n }\n /** Parent of a resolve run only: why the loop ended (`\"done\"` | `\"capped\"` | `\"error\"` | …). */\n get stopReason(): RunData[\"stopReason\"] {\n return this.data.stopReason;\n }\n /** Parent of a resolve run only: how many child turns the loop ran. */\n get iterations(): number | undefined {\n return this.data.iterations;\n }\n /** The latest known run record. */\n get value(): RunData {\n return this.data;\n }\n\n /** Unified SSE event stream: replay buffer, then live events, then close. */\n async *stream(opts: StreamOptions = {}): AsyncGenerator<Event, void, unknown> {\n const cursor = opts.after === undefined ? \"\" : `?after=${encodeURIComponent(opts.after)}`;\n const res = await this.http.open(\"GET\", `/runs/${encodeURIComponent(this.id)}/stream${cursor}`, {\n ...(opts.signal ? { signal: opts.signal } : {}),\n });\n for await (const ev of readSSE<Event>(res.body!, opts.signal)) {\n if (!opts.includeOpenSentinel && ev.type === \"status\" && ev.meta?.[\"stream\"] === \"open\") {\n continue;\n }\n yield ev;\n }\n }\n\n /** `for await (const ev of run)` — sugar for `run.stream()`. */\n [Symbol.asyncIterator](): AsyncGenerator<Event, void, unknown> {\n return this.stream();\n }\n\n /** Cancel the in-flight turn (kills the underlying agent process). */\n async cancel(): Promise<void> {\n await this.http.request<void>(\"POST\", `/runs/${encodeURIComponent(this.id)}/cancel`);\n }\n\n /**\n * Answer a pending permission, question or plan. Message-mode questions remain answerable\n * after completion; the daemon steers or resumes the conversation. Read the chat's latest\n * run after replying to a completed run. Requires the agent's `respond` capability.\n */\n async respond(input: RespondInput & { gitAuth?: import(\"./workspace.js\").ProjectAuth } = {}): Promise<void> {\n await this.http.request<void>(\"POST\", `/runs/${encodeURIComponent(this.id)}/respond`, { body: input });\n }\n\n /**\n * Steer a follow-up message into the running turn without cancelling it. Requires the agent's\n * `input` capability.\n */\n async sendInput(text: string): Promise<void> {\n await this.http.request<void>(\"POST\", `/runs/${encodeURIComponent(this.id)}/input`, { body: { text } });\n }\n\n /**\n * Soft-stop the running turn (ask the agent to halt current work) without the hard process kill\n * {@link Run.cancel} does — the turn stays open for a follow-up via {@link Run.sendInput}.\n * Requires the agent's `interrupt` capability.\n */\n async interrupt(): Promise<void> {\n await this.http.request<void>(\"POST\", `/runs/${encodeURIComponent(this.id)}/interrupt`);\n }\n\n /**\n * Switch the model of the live turn. An empty/omitted `model` resets the turn to the agent/CLI\n * default. Only meaningful on a persistent (non-bypass) turn; on a one-shot turn it is a\n * best-effort no-op. Requires the agent's `setModel` capability.\n */\n async setModel(model?: string): Promise<void> {\n await this.http.request<void>(\"POST\", `/runs/${encodeURIComponent(this.id)}/set-model`, {\n body: { model: model ?? \"\" },\n });\n }\n\n /**\n * Switch the live permission mode using a value from the agent's settings schema.\n * Resolves after the harness acknowledges the change; rejects if it cannot apply it.\n * Requires `setPermissionMode`. Codex settings apply on the next turn instead.\n */\n async setPermissionMode(mode: string): Promise<void> {\n await this.http.request<void>(\"POST\", `/runs/${encodeURIComponent(this.id)}/set-permission-mode`, {\n body: { mode },\n });\n }\n\n /**\n * `GET /runs/{id}/children` — the child iterations of a global-resolve run, oldest→newest, each as\n * its own {@link Run} handle. An ordinary turn (or a resolve that ran a single iteration) returns an\n * empty array. Use it to inspect the run tree a {@link Mindwire.resolve} produced.\n */\n async children(): Promise<Run[]> {\n const data = await this.http.request<RunData[]>(\n \"GET\",\n `/runs/${encodeURIComponent(this.id)}/children`,\n );\n return data.map((d) => new Run(this.http, d));\n }\n\n /** Re-fetch the run record from the daemon and update this handle. */\n async refresh(): Promise<RunData> {\n this.data = await this.http.request<RunData>(\"GET\", `/runs/${encodeURIComponent(this.id)}`);\n return this.data;\n }\n\n /** Restore current output once, then follow with `stream({ after: snapshot.sequence })`. */\n async snapshot(): Promise<RunSnapshot> {\n const snapshot = await this.http.request<RunSnapshot>(\"GET\", `/runs/${encodeURIComponent(this.id)}/snapshot`);\n this.data = snapshot.run;\n return snapshot;\n }\n\n /**\n * Consume the event stream to completion. Returns the final run record and the `result`\n * event's summary (if any). Throws {@link RunFailedError} on an `error`/`cancelled` outcome\n * unless `throwOnError` is set to `false`.\n */\n async wait(opts: StreamOptions & { throwOnError?: boolean } = {}): Promise<WaitResult> {\n let result: ResultInfo | undefined;\n let streamError: string | undefined;\n for await (const ev of this.stream(opts)) {\n if (ev.type === \"result\") result = ev.result;\n else if (ev.type === \"error\") streamError = ev.error;\n }\n const run = await this.refresh();\n if (opts.throwOnError !== false) {\n if (TERMINAL.has(run.status)) {\n if (run.status !== \"done\") {\n throw new RunFailedError(run.id, run.status, run.error ?? streamError);\n }\n } else {\n // The stream ended but the run never reached a terminal state — the transport dropped\n // mid-run (the daemon keeps a replay buffer, but this client does not yet reconnect).\n // Report it rather than returning a success-shaped result on a truncated stream.\n throw new RunFailedError(\n run.id,\n run.status,\n streamError ?? \"event stream ended before the run reached a terminal state\",\n );\n }\n }\n return result !== undefined ? { run, result } : { run };\n }\n}\n","import type { Mindwire } from \"./client.js\";\nimport { readSSE } from \"./sse.js\";\n\n/** Write-only credentials. Never persisted in operation snapshots or conversation state. */\nexport type ProjectAuth = (\n | { kind: \"token\"; token: string; username?: string }\n | { kind: \"ssh\"; privateKey: string }\n | { kind: \"gh\" }\n) & { connectionId?: string; expiresAt?: string; readOnly?: boolean };\n\nexport interface GitConnection {\n id: string;\n login: string;\n mode: \"token\" | \"oblienApp\" | \"sshKey\" | \"ghCli\" | \"native\";\n lifetime: \"run\" | \"workspace\";\n}\n\nexport interface GitAccessState {\n default?: GitConnection;\n storedConnectionIds: string[];\n storedConnections: GitConnection[];\n activeOperations: number;\n}\n\nexport interface ProjectGitState {\n connection?: GitConnection;\n inherited: boolean;\n stored: boolean;\n repoUrl?: string;\n}\n\nexport type GitAction = \"stage\" | \"unstage\" | \"discard\" | \"commit\" | \"fetch\" | \"pull\" | \"push\"\n | \"switch_branch\" | \"create_branch\" | \"restore_commit\";\n\nexport interface GitIdentity { name: string; email: string }\n\nexport type GitIdentityScope = \"repository\" | \"workspace\" | \"all_workspaces\";\n\nexport interface GitIdentitySettings {\n effective: GitIdentity;\n repository: GitIdentity | null;\n workspace: GitIdentity | null;\n allWorkspaces: GitIdentity | null;\n defaultRevision: string;\n}\n\nexport interface GitIdentityUpdate {\n scope: GitIdentityScope;\n /** null removes this override, allowing a broader default to apply. */\n identity: GitIdentity | null;\n /** Required for all_workspaces; keep this ID and expectedRevision until acknowledged. */\n requestId?: string;\n expectedRevision?: string;\n}\n\nexport interface GitOperationRequest {\n /** Stable ID. Reuse this exact intent after a lost acknowledgement. */\n id: string;\n action: GitAction;\n /** Literal repository-relative paths, required for stage/unstage/discard. */\n paths?: string[];\n /** Required for commit. Uses the existing author unless identity is explicitly supplied. */\n message?: string;\n /** Literal branch name for switch_branch/create_branch; requires gitOperationsVersion >= 2. */\n branch?: string;\n /** switch_branch only: branch is a remote tracking name, e.g. origin/feature. */\n remote?: boolean;\n /** Commit only; requires gitOperationsVersion >= 3. Saves attribution in this repository,\n * then commits under the same durable lock. Never changes global Git configuration. */\n identity?: GitIdentity;\n /** restore_commit only; requires gitOperationsVersion >= 4. Full source commit object ID. */\n commitId?: string;\n /** restore_commit only: full HEAD object ID observed before confirmation. */\n expectedHead?: string;\n /** restore_commit only: observed local branch name; omit for detached HEAD. */\n expectedBranch?: string;\n /** Write-only, for network operations only. Never part of an operation snapshot. */\n auth?: ProjectAuth;\n}\n\nexport interface GitOperation extends Omit<GitOperationRequest, \"auth\"> {\n projectId: string;\n /** Canonical repository root resolved by the daemon. */\n path: string;\n status: \"queued\" | \"running\" | \"cancelling\" | \"succeeded\" | \"failed\" | \"cancelled\" | \"interrupted\";\n output?: string;\n error?: string;\n /** git_identity_required asks the client to collect a name/email before a new commit intent. */\n errorCode?: \"git_identity_required\" | \"git_restore_dirty\" | \"git_restore_changed\"\n | \"git_restore_in_progress\" | \"git_restore_commit_unavailable\" | \"git_restore_local_files\" | (string & {});\n createdAt: string;\n updatedAt: string;\n sequence: number;\n}\n\nexport interface ProjectRequest {\n /** Stable idempotency key. Keep the same ID if the acknowledgement is lost. */\n id: string;\n source: \"folder\" | \"create\" | \"clone\";\n name: string;\n /** Absolute directory, or ~/... on the workspace. Clone/create require an absent destination. */\n path: string;\n repoUrl?: string;\n branch?: string;\n auth?: ProjectAuth;\n gitConnection?: GitConnection;\n}\n\nexport interface ProjectRemoveRequest {\n /** Stable idempotency key for this confirmed removal. */\n operationId: string;\n expectedRevision: number;\n}\n\nexport interface ProjectOperation extends Omit<ProjectRequest, \"auth\" | \"source\"> {\n source: ProjectRequest[\"source\"] | \"delete\";\n expectedRevision?: number;\n authKind?: ProjectAuth[\"kind\"];\n status: \"queued\" | \"running\" | \"cancelling\" | \"succeeded\" | \"failed\" | \"cancelled\" | \"interrupted\";\n phase: string;\n progress?: number;\n /** Bounded, redacted output tail. */\n log?: string;\n error?: string;\n projectId?: string;\n createdAt: string;\n updatedAt: string;\n sequence: number;\n attempt: number;\n}\n\nexport class ProjectOperationsApi {\n constructor(private readonly mw: Mindwire) {}\n async list(activeOnly = false): Promise<ProjectOperation[]> {\n const response = await this.mw.http.request<{ operations: ProjectOperation[] }>(\"GET\", \"/workspace/operations\", {\n query: { active: activeOnly },\n });\n return response.operations;\n }\n get(id: string): Promise<ProjectOperation> {\n return this.mw.http.request(\"GET\", `/workspace/operations/${encodeURIComponent(id)}`);\n }\n cancel(id: string): Promise<ProjectOperation> {\n return this.mw.http.request(\"POST\", `/workspace/operations/${encodeURIComponent(id)}/cancel`);\n }\n retry(id: string, auth?: ProjectAuth): Promise<ProjectOperation> {\n return this.mw.http.request(\"POST\", `/workspace/operations/${encodeURIComponent(id)}/retry`, { body: { auth } });\n }\n /** The first event is the current snapshot, then live changes. Reconnecting never replays old\n * progress. Breaking the loop/aborting detaches the observer; cancel(id) explicitly stops work.\n */\n async *watch(id: string, opts: { signal?: AbortSignal } = {}): AsyncGenerator<ProjectOperation> {\n const controller = new AbortController();\n const abort = () => controller.abort();\n opts.signal?.addEventListener(\"abort\", abort, { once: true });\n if (opts.signal?.aborted) controller.abort();\n try {\n const response = await this.mw.http.open(\"GET\", `/workspace/operations/${encodeURIComponent(id)}/stream`, {\n signal: controller.signal,\n });\n let sequence = -1;\n for await (const operation of readSSE<ProjectOperation>(response.body!, controller.signal)) {\n if (operation.sequence > sequence) { sequence = operation.sequence; yield operation; }\n }\n } finally {\n controller.abort();\n opts.signal?.removeEventListener(\"abort\", abort);\n }\n }\n}\n\n/** Stable identity and version of a record in one workspace's SQLite registry. */\nexport interface WorkspaceRecord {\n id: string;\n /** Registry identity, independent of the cloud provider's workspace ID. */\n workspaceId: string;\n createdAt: string;\n revision: number;\n}\n\n/** A saved agent profile. Profiles using one harness share that workspace's native configuration. */\nexport interface WorkspaceAgent extends WorkspaceRecord {\n name: string;\n agentType: string;\n agentTypeName?: string;\n /** Mutes this profile's current and future chats across notification channels. Omit to preserve; false to clear. */\n notificationsMuted?: boolean;\n}\n\nexport interface WorkspaceProject extends WorkspaceRecord {\n name: string;\n path: string;\n repoUrl?: string;\n /** Omit on edits to preserve; explicitly null restores the workspace default. */\n gitConnection?: GitConnection | null;\n}\n\n/** Chat membership; transcript content continues to come from /chats/:id/messages. */\nexport interface WorkspaceChat extends WorkspaceRecord {\n agentId: string;\n projectId: string;\n title: string;\n titleIsUserSet?: boolean;\n sessionId?: string;\n /** Mutes this chat. False clears its own mute but never overrides a muted parent profile. Omit to preserve. */\n notificationsMuted?: boolean;\n}\n\nexport type WorkspaceKind = \"agents\" | \"projects\" | \"chats\";\nexport type WorkspaceInput<T extends WorkspaceRecord> = Omit<T, \"id\" | \"workspaceId\" | \"revision\" | \"createdAt\"> & {\n createdAt?: string;\n};\n\n/** Additive migration. Existing records and deletion tombstones always win over these values. */\nexport interface WorkspaceImport {\n agents?: (WorkspaceInput<WorkspaceAgent> & { id: string })[];\n projects?: (WorkspaceInput<WorkspaceProject> & { id: string })[];\n chats?: (WorkspaceInput<WorkspaceChat> & { id: string })[];\n}\n\nexport interface WorkspaceSnapshot {\n version: number;\n workspaceId: string;\n revision: number;\n /** true replaces the cache for this workspace; false applies changed rows and deletions. */\n full: boolean;\n agents: WorkspaceAgent[];\n projects: WorkspaceProject[];\n chats: WorkspaceChat[];\n deleted: { kind: WorkspaceKind; id: string; revision: number }[];\n}\n\nexport class WorkspaceCollection<T extends WorkspaceRecord> {\n constructor(private readonly mw: Mindwire, private readonly kind: WorkspaceKind) {}\n\n /** Create with a stable client-generated ID. For updates, supply the record's last revision. */\n put(id: string, record: WorkspaceInput<T>, expectedRevision?: number): Promise<WorkspaceSnapshot> {\n return this.mw.http.request(\"PUT\", `/workspace/${this.kind}/${encodeURIComponent(id)}`, {\n body: { record, expectedRevision },\n });\n }\n\n /** Remove membership and dependent chat links. Files and native transcripts are retained.\n * Use deleteChat() for an explicit transcript purge. Running chats reject removal with 409.\n */\n delete(id: string, revision: number): Promise<WorkspaceSnapshot> {\n return this.mw.http.request(\"DELETE\", `/workspace/${this.kind}/${encodeURIComponent(id)}`, {\n query: { revision },\n });\n }\n}\n\n/** Workspace metadata is shared by all harnesses; withAgent() never scopes these requests. */\nexport class WorkspaceApi {\n readonly git: GitAccessApi;\n readonly operations: ProjectOperationsApi;\n readonly agents: WorkspaceCollection<WorkspaceAgent>;\n readonly projects: WorkspaceCollection<WorkspaceProject>;\n readonly chats: WorkspaceCollection<WorkspaceChat>;\n\n constructor(private readonly mw: Mindwire) {\n this.git = new GitAccessApi(mw);\n this.operations = new ProjectOperationsApi(mw);\n this.agents = new WorkspaceCollection(mw, \"agents\");\n this.projects = new WorkspaceCollection(mw, \"projects\");\n this.chats = new WorkspaceCollection(mw, \"chats\");\n }\n\n snapshot(): Promise<WorkspaceSnapshot> { return this.mw.http.request(\"GET\", \"/workspace\"); }\n\n /** Start an operation owned by the daemon. The same ID/payload returns the existing operation. */\n createProject(request: ProjectRequest): Promise<ProjectOperation> {\n return this.mw.http.request(\"POST\", \"/workspace/projects\", { body: request });\n }\n\n /** Permanently remove the confirmed project's directory and membership.\n * projects.delete() retains files. Native harness transcripts are not purged.\n */\n removeProjectFiles(id: string, request: ProjectRemoveRequest): Promise<ProjectOperation> {\n return this.mw.http.request(\"POST\", `/workspace/projects/${encodeURIComponent(id)}/remove`, { body: request });\n }\n\n /** Incremental reconciliation. Pass the previous identity to detect a replaced/restored workspace.\n * A 409 requires fetching snapshot() again; never apply a delta to a different registry.\n */\n changes(since: number, workspaceId: string): Promise<WorkspaceSnapshot> {\n return this.mw.http.request(\"GET\", \"/workspace/changes\", { query: { since, workspaceId } });\n }\n\n /** Import legacy metadata before replacing a local cache. Safe to repeat after interruption. */\n import(records: WorkspaceImport): Promise<WorkspaceSnapshot> {\n return this.mw.http.request(\"POST\", \"/workspace/import\", { body: records });\n }\n}\n\n/** Account preferences and authenticated Git on the daemon hosting each repository. */\nexport class GitAccessApi {\n constructor(private readonly mw: Mindwire) {}\n /** Reads attribution independently of GitHub authentication. Requires gitIdentityVersion >= 1. */\n identity(context: { projectId?: string; path?: string } = {}): Promise<GitIdentitySettings> {\n return this.mw.http.request(\"GET\", \"/workspace/git/identity\", { query: context });\n }\n /** Saves settings only; never stages or commits. all_workspaces installs this\n * workspace's copy of a client-managed default; the client handles fan-out. */\n setIdentity(update: GitIdentityUpdate, context: { projectId?: string; path?: string } = {}): Promise<GitIdentitySettings> {\n return this.mw.http.request(\"PUT\", \"/workspace/git/identity\", { query: context, body: update });\n }\n state(): Promise<GitAccessState> {\n return this.mw.http.request(\"GET\", \"/workspace/git\");\n }\n setDefault(connection: GitConnection | null, auth?: ProjectAuth): Promise<GitAccessState> {\n return this.mw.http.request(\"PUT\", \"/workspace/git\", { body: { connection, auth } });\n }\n forget(connectionId: string): Promise<GitAccessState> {\n return this.mw.http.request(\"DELETE\", `/workspace/git/connections/${encodeURIComponent(connectionId)}`);\n }\n project(projectId: string): Promise<ProjectGitState> {\n return this.mw.http.request(\"GET\", `/workspace/projects/${encodeURIComponent(projectId)}/git`);\n }\n setProject(projectId: string, connection: GitConnection | null, expectedRevision: number, auth?: ProjectAuth): Promise<WorkspaceSnapshot> {\n return this.mw.http.request(\"PUT\", `/workspace/projects/${encodeURIComponent(projectId)}/git`, {\n body: { connection, expectedRevision, auth },\n });\n }\n /** Compatibility call. Prefer start() and operation()/watch() for reconnectable writes. */\n run(projectId: string, operation: \"fetch\" | \"pull\" | \"push\", auth?: ProjectAuth): Promise<{ output: string }> {\n return this.mw.http.request(\"POST\", `/workspace/projects/${encodeURIComponent(projectId)}/git/${operation}`, { body: { auth } });\n }\n\n /** Requires health.gitOperationsVersion >= 1 (>= 2 for branches, >= 4 for restore_commit). Acceptance persists before Git runs;\n * disconnecting only detaches the client. The same ID/intent never runs twice.\n */\n start(projectId: string, request: GitOperationRequest): Promise<GitOperation> {\n return this.mw.http.request(\"POST\", `/workspace/projects/${encodeURIComponent(projectId)}/git/operations`, { body: request });\n }\n async operations(projectId: string, activeOnly = false): Promise<GitOperation[]> {\n const result = await this.mw.http.request<{ operations: GitOperation[] }>(\"GET\",\n `/workspace/projects/${encodeURIComponent(projectId)}/git/operations`, { query: { active: activeOnly, actionsVersion: 4 } });\n return result.operations;\n }\n operation(id: string): Promise<GitOperation> {\n return this.mw.http.request(\"GET\", `/workspace/git/operations/${encodeURIComponent(id)}`);\n }\n cancel(id: string): Promise<GitOperation> {\n return this.mw.http.request(\"POST\", `/workspace/git/operations/${encodeURIComponent(id)}/cancel`);\n }\n /** Current snapshot followed by state changes. Aborting observation never cancels the operation. */\n async *watch(id: string, opts: { signal?: AbortSignal } = {}): AsyncGenerator<GitOperation> {\n const controller = new AbortController();\n const abort = () => controller.abort();\n opts.signal?.addEventListener(\"abort\", abort, { once: true });\n if (opts.signal?.aborted) controller.abort();\n try {\n const response = await this.mw.http.open(\"GET\", `/workspace/git/operations/${encodeURIComponent(id)}/stream`, {\n signal: controller.signal,\n });\n let sequence = -1;\n for await (const operation of readSSE<GitOperation>(response.body!, controller.signal)) {\n if (operation.sequence > sequence) { sequence = operation.sequence; yield operation; }\n }\n } finally {\n controller.abort();\n opts.signal?.removeEventListener(\"abort\", abort);\n }\n }\n}\n","import type { Mindwire } from \"./client.js\";\nimport { readSSE } from \"./sse.js\";\n\nexport interface SurfaceGeometry { width: number; height: number; revision: number }\nexport interface SurfaceProblem { code: string; message: string }\nexport interface SurfaceCapabilities {\n view: boolean; capture: boolean; pointer: boolean; keyboard: boolean; text: boolean;\n clipboardRead: boolean; clipboardWrite: boolean;\n keyboardText?: boolean; extendedKeys?: boolean;\n}\nexport interface SurfaceController {\n sessionId: string; actor: \"user\" | \"agent\"; name: string; runId?: string; chatId?: string;\n generation: number; expiresAt: string;\n}\nexport interface SurfaceSnapshot {\n id: string; workspaceId: string; kind: \"desktop\"; provider: \"oblien\";\n version: number; revision: number; instanceId: string;\n state: string; observedAt?: string; supported: boolean; enabled: boolean; available: boolean;\n credentials: boolean; os?: string; capabilities: SurfaceCapabilities;\n geometry?: SurfaceGeometry; controller?: SurfaceController;\n authorizationExpiresAt?: string; error?: SurfaceProblem;\n}\n/** Write-only, desktop-only, expiring provider grant. Never pass a user's session JWT. */\nexport interface SurfaceBinding {\n registryId: string; workspaceId: string; gatewayToken?: string;\n connection: {\n expires_at: string;\n ssh: { host: string; port: number; username: string; password: string; host_key_fingerprint: string };\n vnc: { host: string; port: number; authentication: \"none\" };\n };\n}\nexport interface SurfaceSession {\n id: string; surfaceId: string; actor: \"user\" | \"agent\"; name: string;\n chatId?: string; runId?: string; mode: \"view\" | \"control\"; createdAt: string;\n controller?: SurfaceController;\n}\nexport interface SurfaceOpenRequest { requestId: string; name?: string; mode: \"view\" | \"control\" }\nexport interface SurfaceControlRequest { action: \"acquire\" | \"takeover\" | \"release\" | \"renew\"; generation?: number }\nexport interface SurfaceAction {\n kind: \"pointer\" | \"click\" | \"drag\" | \"scroll\" | \"key\" | \"text\" | \"clipboard_read\" | \"clipboard_write\" | \"release\";\n x?: number; y?: number; toX?: number; toY?: number; buttons?: number;\n button?: \"left\" | \"middle\" | \"right\"; count?: number; deltaX?: number; deltaY?: number;\n keys?: string[]; text?: string;\n /** Physical US keyboard text (printable ASCII, up to 4096 bytes), preserving the clipboard. */\n textMode?: \"keyboard\";\n}\nexport interface SurfaceActionRequest {\n /** Reuse this ID to inspect/recover an uncertain acknowledgement. Do not replay with a new ID. */\n requestId: string; sessionId: string; controlGeneration: number; frameId?: string;\n geometryRevision?: number; action: SurfaceAction;\n}\nexport interface SurfaceReceipt {\n id: string; sessionId: string; surfaceId: string; kind: string;\n status: \"dispatching\" | \"dispatched\" | \"outcome_unknown\"; createdAt: string; error?: SurfaceProblem;\n /** Transient clipboard output, not stored in the receipt. */\n text?: string;\n}\nexport interface SurfaceCapture {\n id: string; surfaceId: string; artifactId: string; mime: string; geometry: SurfaceGeometry; createdAt: string;\n}\nexport interface ArtifactContent {\n id: string; chatId?: string; mime: string; bytes: number; width: number; height: number; createdAt: string;\n /** Base64 bytes, compatible with every existing daemon transport. */\n data: string;\n}\nexport interface SurfaceToolAction {\n surfaceId: string; operation: string; sessionId?: string; receiptId?: string; status?: string;\n capture?: { id: string; artifactId: string; width: number; height: number };\n}\n\n/** Workspace-scoped API. One controller is shared by every harness and app client. */\nexport class SurfacesApi {\n constructor(private readonly mw: Mindwire) {}\n list(): Promise<SurfaceSnapshot[]> { return this.mw.http.request(\"GET\", \"/surfaces\"); }\n status(refresh = false): Promise<SurfaceSnapshot> {\n return this.mw.http.request(\"GET\", \"/surfaces/desktop\", { query: { refresh } });\n }\n bind(binding: SurfaceBinding): Promise<SurfaceSnapshot> {\n return this.mw.http.request(\"PUT\", \"/surfaces/desktop/binding\", { body: binding });\n }\n open(request: SurfaceOpenRequest): Promise<SurfaceSession> {\n return this.mw.http.request(\"POST\", \"/surfaces/desktop/sessions\", { body: request });\n }\n control(id: string, request: SurfaceControlRequest): Promise<SurfaceSession> {\n return this.mw.http.request(\"POST\", `/surfaces/desktop/sessions/${encodeURIComponent(id)}/control`, { body: request });\n }\n close(id: string): Promise<{ closed: boolean }> {\n return this.mw.http.request(\"DELETE\", `/surfaces/desktop/sessions/${encodeURIComponent(id)}`);\n }\n capture(id: string): Promise<SurfaceCapture> {\n return this.mw.http.request(\"POST\", `/surfaces/desktop/sessions/${encodeURIComponent(id)}/captures`);\n }\n action(request: SurfaceActionRequest): Promise<SurfaceReceipt> {\n return this.mw.http.request(\"POST\", \"/surfaces/desktop/actions\", { body: request });\n }\n receipt(id: string): Promise<SurfaceReceipt> {\n return this.mw.http.request(\"GET\", `/surfaces/desktop/actions/${encodeURIComponent(id)}`);\n }\n artifact(id: string): Promise<ArtifactContent> {\n return this.mw.http.request(\"GET\", `/artifacts/${encodeURIComponent(id)}`);\n }\n /** Every connection starts with the current snapshot, then revisions. Never replays input. */\n async *watch(opts: { signal?: AbortSignal } = {}): AsyncGenerator<SurfaceSnapshot> {\n const controller = new AbortController();\n const abort = () => controller.abort();\n opts.signal?.addEventListener(\"abort\", abort, { once: true });\n if (opts.signal?.aborted) controller.abort();\n try {\n const response = await this.mw.http.open(\"GET\", \"/surfaces/desktop/events\", { signal: controller.signal });\n let instance: string | undefined;\n let revision = -1;\n for await (const snapshot of readSSE<SurfaceSnapshot>(response.body!, controller.signal)) {\n if (instance !== snapshot.instanceId || snapshot.revision > revision) {\n instance = snapshot.instanceId; revision = snapshot.revision; yield snapshot;\n }\n }\n } finally {\n controller.abort(); opts.signal?.removeEventListener(\"abort\", abort);\n }\n }\n}\n","import type { Mindwire } from \"./client.js\";\n\nexport interface ServiceUpdateState {\n idle: boolean;\n updating: boolean;\n activeOperations: number;\n}\n\nexport interface ServiceUpdateLease {\n id: string;\n /** Terminate only this leased process, not every mindwired process on the host. */\n pid: number;\n expiresAt: string;\n}\n\n/** Installer coordination; requires health.serviceUpdateVersion >= 1. */\nexport class ServiceApi {\n constructor(private readonly client: Mindwire) {}\n\n updateStatus(): Promise<ServiceUpdateState> {\n return this.client.http.request(\"GET\", \"/service/update\");\n }\n\n /** Download first. Acquire immediately before replacement; busy work returns 409.\n * Admission stays closed until release, process exit, or the one-minute expiry. */\n acquireUpdate(): Promise<ServiceUpdateLease> {\n return this.client.http.request(\"POST\", \"/service/update\");\n }\n\n releaseUpdate(id: string): Promise<{ ok: boolean }> {\n return this.client.http.request(\"DELETE\", `/service/update/${encodeURIComponent(id)}`);\n }\n}\n","import type { Mindwire } from \"./client.js\";\nimport { readSSE } from \"./sse.js\";\n\n/** Native workspace execution; the same contract on macOS, Linux and Windows. */\nexport interface WorkspaceHost {\n hostname: string; os: \"darwin\" | \"linux\" | \"windows\" | string; arch: string;\n home: string; directory: string; pid: number;\n}\nexport interface HostResources { cpus: number; memoryMb: number; diskMb: number }\nexport interface WorkspaceFile {\n name: string; path: string; type: \"file\" | \"dir\"; size: number; modifiedAt: string; isIgnored: boolean;\n}\nexport interface WorkspaceFileContent { path: string; content: string; size: number }\nexport interface WorkspaceExecRequest { argv: string[]; directory?: string; input?: string; timeoutMs?: number }\nexport interface WorkspaceExecResult { stdout: string; stderr: string; exitCode: number; truncated?: boolean }\nexport type WorkspaceExecEvent =\n | { kind: \"output\"; channel: \"stdout\" | \"stderr\"; data: string }\n | { kind: \"exit\"; exitCode: number }\n | { kind: \"error\"; error: string };\nexport interface TerminalRequest { id: string; directory?: string; columns: number; rows: number }\nexport interface TerminalState extends TerminalRequest { title: string; running: boolean; exitCode?: number; createdAt: string }\nexport interface TerminalEvent { sequence: number; kind: \"output\" | \"reset\" | \"exit\"; data?: string; state?: TerminalState }\n/** Retry the exact same writer/sequence/data after a lost acknowledgement, never a new sequence. */\nexport interface TerminalInput { writer: string; sequence: number; data: string }\n\nexport class ExecutionApi {\n readonly terminals: TerminalsApi;\n constructor(private readonly client: Mindwire) { this.terminals = new TerminalsApi(client); }\n host(): Promise<WorkspaceHost> { return this.client.http.request(\"GET\", \"/workspace/host\"); }\n resources(): Promise<HostResources> { return this.client.http.request(\"GET\", \"/workspace/resources\"); }\n files(path = \"\", query?: string): Promise<WorkspaceFile[]> {\n return this.client.http.request(\"GET\", \"/workspace/files\", { query: { path, query } });\n }\n read(path: string): Promise<WorkspaceFileContent> { return this.client.http.request(\"GET\", \"/workspace/file\", { query: { path } }); }\n write(path: string, content: string): Promise<{ ok: boolean }> {\n return this.client.http.request(\"PUT\", \"/workspace/file\", { body: { path, content } });\n }\n remove(path: string): Promise<{ ok: boolean }> { return this.client.http.request(\"DELETE\", \"/workspace/file\", { query: { path } }); }\n exec(command: WorkspaceExecRequest, signal?: AbortSignal): Promise<WorkspaceExecResult> {\n return this.client.http.request(\"POST\", \"/workspace/exec\", { body: command, signal });\n }\n /** Output data is base64, preserving partial UTF-8 chunks. Cancelling stops this command. */\n async *stream(command: WorkspaceExecRequest, signal?: AbortSignal): AsyncGenerator<WorkspaceExecEvent> {\n const response = await this.client.http.open(\"POST\", \"/workspace/exec/stream\", { body: command, signal });\n yield* readSSE<WorkspaceExecEvent>(response.body!, signal);\n }\n}\nexport class TerminalsApi {\n constructor(private readonly client: Mindwire) {}\n list(directory?: string): Promise<TerminalState[]> { return this.client.http.request(\"GET\", \"/workspace/terminals\", { query: { directory } }); }\n open(request: TerminalRequest): Promise<TerminalState> { return this.client.http.request(\"POST\", \"/workspace/terminals\", { body: request }); }\n get(id: string): Promise<TerminalState> { return this.client.http.request(\"GET\", this.path(id)); }\n close(id: string): Promise<{ ok: boolean }> { return this.client.http.request(\"DELETE\", this.path(id)); }\n input(id: string, input: TerminalInput): Promise<{ ok: boolean; sequence: number }> {\n return this.client.http.request(\"POST\", `${this.path(id)}/input`, { body: input });\n }\n resize(id: string, columns: number, rows: number): Promise<TerminalState> {\n return this.client.http.request(\"PUT\", `${this.path(id)}/size`, { body: { columns, rows } });\n }\n /** Detaching only closes the subscription. Resume from the last sequence; reset replaces the screen. */\n async *events(id: string, after = 0, signal?: AbortSignal): AsyncGenerator<TerminalEvent> {\n const response = await this.client.http.open(\"GET\", `${this.path(id)}/events`, { query: { after }, signal });\n yield* readSSE<TerminalEvent>(response.body!, signal);\n }\n private path(id: string): string { return `/workspace/terminals/${encodeURIComponent(id)}`; }\n}\n","import type { Mindwire } from \"./client.js\";\n\nexport type ComputerRoute = { kind: \"ssh\"; host: string; port: number } | { kind: \"websocket\"; url: string };\nexport interface ComputerInvitation {\n version: 1; computerId: string; name: string; fingerprint: string; routes: ComputerRoute[];\n pairingId: string; secret: string; expiresAt: string;\n}\nexport interface ComputerDevice { id: string; name: string; publicKey: string; createdAt: string; revoked: boolean }\nexport interface ComputerPairRequest { id: string; name: string; publicKey: string }\nexport interface ComputerPairing {\n id: string; expiresAt: string; status: \"waiting\" | \"pending\" | \"approved\" | \"rejected\";\n request?: ComputerPairRequest;\n completed?: boolean;\n}\nexport interface ComputerUpdate {\n id: string; version: string; updatedAt: string; error?: string;\n status: \"idle\" | \"queued\" | \"downloading\" | \"waiting\" | \"restarting\" | \"complete\" | \"failed\";\n}\nexport interface ComputerInfo {\n version: number; computerId: string; registryId: string; fingerprint: string; routes: ComputerRoute[];\n pid: number; apiAddress: string; sshPort: number; websocketPort: number;\n}\n/** Available only in computer mode. All calls use the existing authenticated transport. */\nexport class ComputerApi {\n constructor(private readonly client: Mindwire) {}\n info(): Promise<ComputerInfo> { return this.client.http.request(\"GET\", \"/computer\"); }\n setRoutes(routes: ComputerRoute[]): Promise<ComputerInfo> {\n return this.client.http.request(\"PUT\", \"/computer/routes\", { body: { routes } });\n }\n updateStatus(): Promise<ComputerUpdate> { return this.client.http.request(\"GET\", \"/computer/update\"); }\n requestUpdate(version: string): Promise<ComputerUpdate> {\n return this.client.http.request(\"POST\", \"/computer/update\", { body: { version } });\n }\n invite(routes: ComputerRoute[]): Promise<ComputerInvitation> {\n return this.client.http.request(\"POST\", \"/computer/pairings\", { body: { routes } });\n }\n pairing(id: string): Promise<ComputerPairing> { return this.client.http.request(\"GET\", `/computer/pairings/${encodeURIComponent(id)}`); }\n completePairing(id: string, requestId: string): Promise<{ ok: boolean }> {\n return this.client.http.request(\"POST\", `/computer/pairings/${encodeURIComponent(id)}/complete`, { body: { requestId } });\n }\n decide(id: string, requestId: string, approve: boolean): Promise<{ ok: boolean; device: ComputerDevice }> {\n return this.client.http.request(\"POST\", `/computer/pairings/${encodeURIComponent(id)}/decision`, { body: { requestId, approve } });\n }\n devices(): Promise<ComputerDevice[]> { return this.client.http.request(\"GET\", \"/computer/devices\"); }\n revoke(id: string): Promise<{ ok: boolean }> { return this.client.http.request(\"DELETE\", `/computer/devices/${encodeURIComponent(id)}`); }\n}\n\n/** A URI carries an invitation, not permanent credentials. Never log it to shared service logs. */\nexport function computerPairingURI(invitation: ComputerInvitation): string {\n // UTF-8/base64url works in browsers too; no Node-only dependency in the protocol layer.\n const bytes = new TextEncoder().encode(JSON.stringify(invitation));\n let binary = \"\";\n for (const byte of bytes) binary += String.fromCharCode(byte);\n const encoded = btoa(binary).replace(/\\+/g, \"-\").replace(/\\//g, \"_\").replace(/=+$/, \"\");\n return `mindwire://pair?v=1#${encoded}`;\n}\n","// Embedded daemon: the default transport. On a server runtime (Node/Bun/Deno) it auto-spawns\n// the bundled `mindwired` binary on a loopback port and hands the SDK its base URL — so\n// `new Mindwire({ agent })` \"just works\" with no server to run. Browsers/edge can't spawn a\n// process, so they must pass `{ baseUrl }` to reach a daemon over HTTP.\nimport { MindwireError } from \"./errors.js\";\nimport { ensureDaemonBinary } from \"./daemon-binary.js\";\n\nexport interface EmbeddedOptions {\n /** Working directory the daemon runs agents in. Defaults to the process cwd. */\n cwd?: string;\n /** Local state file for the embedded daemon. */\n statePath?: string;\n /** Explicit path to the `mindwired` binary (overrides discovery). */\n bin?: string;\n}\n\nexport interface EmbeddedDaemon {\n baseUrl: string;\n token?: string;\n stop(): void;\n}\n\n// Embedded daemons, memoized by config so distinct environments get distinct daemons while identical\n// configs share one. Two zero-config `local()` clients collapse to a single loopback daemon (avoids a\n// double-spawn and a `statePath` collision); a client with its own `cwd`/`statePath`/`bin` gets its\n// own daemon — the mechanism behind \"one instance = one environment; isolate → a new target\".\nconst shared = new Map<string, Promise<EmbeddedDaemon>>();\n\n/** Distinct config ⇒ distinct daemon. `cwd`/`statePath` are the state-affecting knobs; `bin` too. */\nfunction configKey(opts: EmbeddedOptions): string {\n return JSON.stringify([opts.cwd ?? \"\", opts.statePath ?? \"\", opts.bin ?? \"\"]);\n}\n\nexport function startEmbedded(opts: EmbeddedOptions = {}): Promise<EmbeddedDaemon> {\n const key = configKey(opts);\n let daemon = shared.get(key);\n if (!daemon) {\n daemon = spawnDaemon(opts).catch((err) => {\n shared.delete(key); // allow a retry on next call\n throw err;\n });\n shared.set(key, daemon);\n }\n return daemon;\n}\n\nfunction serverRuntime(): typeof globalThis & { process?: any; Bun?: any; Deno?: any } {\n return globalThis as never;\n}\n\nfunction isServerRuntime(): boolean {\n const g = serverRuntime();\n return (\n (typeof g.process !== \"undefined\" && !!g.process.versions?.node) ||\n typeof g.Bun !== \"undefined\" ||\n typeof g.Deno !== \"undefined\"\n );\n}\n\nasync function spawnDaemon(opts: EmbeddedOptions): Promise<EmbeddedDaemon> {\n if (!isServerRuntime()) {\n throw new MindwireError(\n \"MindWire embedded mode needs a server runtime (Node/Bun/Deno). In the browser or an edge runtime, pass { baseUrl } to connect to a running daemon.\",\n );\n }\n\n const { spawn } = await import(\"node:child_process\");\n const net = await import(\"node:net\");\n const proc = serverRuntime().process;\n const { randomBytes } = await import(\"node:crypto\");\n\n const resolved = await resolveBinary(opts.bin);\n const bin = resolved.bin;\n const port = await freePort(net);\n const baseUrl = `http://127.0.0.1:${port}`;\n const token = randomBytes(32).toString(\"hex\");\n\n const child = spawn(bin, [], {\n env: {\n ...proc.env,\n ADDR: `127.0.0.1:${port}`,\n AGENT_CWD: opts.cwd ?? proc.cwd(),\n STATE_PATH: opts.statePath ?? \".mindwire-state.json\",\n DAEMON_TOKEN: token,\n },\n stdio: \"ignore\",\n });\n\n let spawnError: Error | null = null;\n child.on(\"error\", (e: Error) => {\n spawnError = e;\n });\n\n const stop = () => {\n try {\n child.kill();\n } catch {}\n };\n // Best-effort: don't leave the daemon running after the host exits.\n proc.once?.(\"exit\", stop);\n proc.once?.(\"SIGINT\", () => {\n stop();\n proc.exit?.(130);\n });\n\n await waitHealthy(baseUrl, token, () => spawnError, resolved);\n return { baseUrl, token, stop };\n}\n\ninterface ResolvedBinary {\n /** The path (or bare name) we'll hand to spawn(). */\n bin: string;\n /** True if we found the binary on disk; false means we fell back to a bare PATH lookup. */\n found: boolean;\n /** Human-readable list of every location we checked, for a useful not-found error. */\n checked: string[];\n}\n\nasync function resolveBinary(explicit?: string): Promise<ResolvedBinary> {\n const fs = await import(\"node:fs\");\n const path = await import(\"node:path\");\n const proc = serverRuntime().process;\n const ext = proc.platform === \"win32\" ? \".exe\" : \"\";\n const binName = `mindwired${ext}`;\n\n const candidates: string[] = [];\n if (explicit) candidates.push(explicit);\n if (proc.env?.MINDWIRE_DAEMON) candidates.push(proc.env.MINDWIRE_DAEMON);\n\n // Dev / direct bundling: a binary dropped next to the SDK at bin/mindwired-<platform>[.exe].\n try {\n const url = await import(\"node:url\");\n const here = path.dirname(url.fileURLToPath(import.meta.url));\n const named = `mindwired-${proc.platform}-${proc.arch}${ext}`;\n candidates.push(path.join(here, \"bin\", named), path.join(here, \"..\", \"bin\", named));\n } catch {\n // import.meta.url unavailable (e.g. CJS) — skip bundled discovery.\n }\n\n for (const c of candidates) {\n try {\n if (fs.existsSync(c)) return { bin: c, found: true, checked: candidates };\n } catch {}\n }\n const downloaded = await ensureDaemonBinary({ platform: proc.platform, arch: proc.arch });\n return { bin: downloaded, found: true, checked: [...candidates, downloaded] };\n}\n\n// Build the daemon-couldn't-start error. When the binary was never found on disk, enumerate every\n// remedy, including an explicit locally built binary for monorepo development.\nfunction daemonStartError(resolved: ResolvedBinary, cause: Error): string {\n if (!resolved.found) {\n return [\n \"Couldn't start the mindwire daemon: the `mindwired` binary was not found.\",\n `Looked in: ${resolved.checked.join(\", \")}.`,\n \"Fixes:\",\n \" • check GitHub Release access so the SDK can download its matching daemon binary; or\",\n \" • set MINDWIRE_DAEMON to a `mindwired` binary; or\",\n \" • pass { baseUrl } to connect to a daemon you run yourself.\",\n \" • Working inside the mindwire monorepo? Run `go build -o /tmp/mindwired ./daemon/cmd/daemon` and set MINDWIRE_DAEMON.\",\n `(underlying error: ${cause.message})`,\n ].join(\"\\n\");\n }\n return (\n `Couldn't start the mindwire daemon (${resolved.bin}): ${cause.message}. ` +\n \"Set MINDWIRE_DAEMON to the binary path, or pass { baseUrl } to use a running daemon.\"\n );\n}\n\nfunction freePort(net: typeof import(\"node:net\")): Promise<number> {\n return new Promise((resolve, reject) => {\n const srv = net.createServer();\n srv.on(\"error\", reject);\n srv.listen(0, \"127.0.0.1\", () => {\n const addr = srv.address();\n const port = addr && typeof addr === \"object\" ? addr.port : 0;\n srv.close(() => resolve(port));\n });\n });\n}\n\nasync function waitHealthy(\n baseUrl: string,\n token: string,\n getError: () => Error | null,\n resolved: ResolvedBinary,\n timeoutMs = 15000,\n): Promise<void> {\n const deadline = Date.now() + timeoutMs;\n while (Date.now() < deadline) {\n const err = getError();\n if (err) {\n throw new MindwireError(daemonStartError(resolved, err), { cause: err });\n }\n try {\n const res = await fetch(`${baseUrl}/healthz`, { headers: { Authorization: `Bearer ${token}` } });\n if (res.ok) return;\n } catch {\n // not up yet\n }\n await new Promise((r) => setTimeout(r, 150));\n }\n throw new MindwireError(\"mindwire embedded daemon did not become healthy in time.\");\n}\n","// Version-pinned daemon acquisition. The npm package stays TypeScript-only: when a server-side target\n// needs a daemon, it downloads the binary matching this SDK's version from the GitHub Release, verifies\n// the published SHA-256, and caches it outside node_modules for later offline use.\nimport { MindwireError } from \"./errors.js\";\nimport { SDK_VERSION } from \"./version.js\";\n\nexport type DaemonPlatform = \"darwin\" | \"linux\" | \"win32\";\nexport type DaemonArch = \"x64\" | \"arm64\";\n\nexport interface EnsureDaemonBinaryOptions {\n version?: string;\n platform?: DaemonPlatform;\n arch?: DaemonArch;\n cacheDir?: string;\n /** Override for tests or a private GitHub Releases mirror. */\n releaseBaseUrl?: string;\n fetch?: typeof fetch;\n}\n\nfunction supported(platform: string, arch: string): asserts platform is DaemonPlatform & string {\n if (!([\"darwin\", \"linux\", \"win32\"] as string[]).includes(platform) || !([\"x64\", \"arm64\"] as string[]).includes(arch)) {\n throw new MindwireError(`mindwire: no daemon release for ${platform}-${arch}`);\n }\n}\n\nfunction assetName(version: string, platform: DaemonPlatform, arch: DaemonArch): string {\n const releasePlatform = platform === \"win32\" ? \"windows\" : platform;\n const releaseArch = arch === \"x64\" ? \"amd64\" : arch;\n return `mindwired-v${version}-${releasePlatform}-${releaseArch}${platform === \"win32\" ? \".exe\" : \"\"}`;\n}\n\nfunction checksumFor(text: string, asset: string): string | undefined {\n const line = text.split(\"\\n\").find((l) => l.trim().endsWith(` ${asset}`) || l.trim().endsWith(` ${asset}`));\n const hash = line?.trim().split(/\\s+/)[0];\n return hash && /^[a-f0-9]{64}$/i.test(hash) ? hash.toLowerCase() : undefined;\n}\n\n/** Ensure the SDK-matched daemon binary is present locally and return its executable path. */\nexport async function ensureDaemonBinary(opts: EnsureDaemonBinaryOptions = {}): Promise<string> {\n const proc = globalThis as typeof globalThis & { process?: { platform?: string; arch?: string; env?: Record<string, string | undefined> } };\n const platform = opts.platform ?? proc.process?.platform;\n const arch = opts.arch ?? proc.process?.arch;\n supported(platform ?? \"unknown\", arch ?? \"unknown\");\n const daemonPlatform = platform as DaemonPlatform;\n const daemonArch = arch as DaemonArch;\n const version = opts.version ?? SDK_VERSION;\n if (!/^[0-9]+\\.[0-9]+\\.[0-9]+(?:-[0-9A-Za-z.-]+)?$/.test(version)) {\n throw new MindwireError(`mindwire: cannot download daemon for non-release SDK version ${version}`);\n }\n\n const path = await import(\"node:path\");\n const { binaryCacheDirectory, cachedExecutable, cacheExecutable } = await import(\"./binary-cache.js\");\n const dir = path.join(opts.cacheDir ?? await binaryCacheDirectory(daemonPlatform), version, `${daemonPlatform}-${daemonArch}`);\n const asset = assetName(version, daemonPlatform, daemonArch);\n const bin = path.join(dir, asset);\n const cached = await cachedExecutable(bin);\n if (cached) return cached;\n\n const base = (opts.releaseBaseUrl ?? proc.process?.env?.MINDWIRE_RELEASE_BASE_URL ?? \"https://github.com/oblien/mindwire/releases/download\").replace(/\\/$/, \"\");\n const release = `${base}/v${version}`;\n const request = opts.fetch ?? globalThis.fetch;\n if (!request) throw new MindwireError(\"mindwire: fetch is unavailable; set daemonBin or MINDWIRE_DAEMON\");\n const [checksums, binary] = await Promise.all([request(`${release}/checksums.txt`), request(`${release}/${asset}`)]);\n if (!checksums.ok || !binary.ok) {\n // A just-published SDK can briefly precede its matching Release asset. For the public release\n // endpoint only, recover to GitHub's latest stable release; mirrors must be explicit and exact.\n if (!opts.releaseBaseUrl && !proc.process?.env?.MINDWIRE_RELEASE_BASE_URL) {\n const latest = await request(\"https://api.github.com/repos/oblien/mindwire/releases/latest\");\n if (latest.ok) {\n const tag = (await latest.json() as { tag_name?: unknown }).tag_name;\n const fallback = typeof tag === \"string\" ? tag.replace(/^v/, \"\") : \"\";\n if (/^[0-9]+\\.[0-9]+\\.[0-9]+(?:-[0-9A-Za-z.-]+)?$/.test(fallback) && fallback !== version) {\n return ensureDaemonBinary({ ...opts, version: fallback });\n }\n }\n }\n throw new MindwireError(`mindwire: failed to download daemon v${version} for ${daemonPlatform}-${daemonArch}`);\n }\n const expected = checksumFor(await checksums.text(), asset);\n if (!expected) throw new MindwireError(`mindwire: release v${version} has no checksum for ${asset}`);\n const bytes = new Uint8Array(await binary.arrayBuffer());\n return cacheExecutable(bin, bytes, expected);\n}\n","// The SDK's own version, replaced at build time by tsup's `define` (see tsup.config.ts) with the\n// literal from package.json. This is also the version of the bundled Linux daemon binary\n// (build-daemon.mjs stamps the per-arch daemon packages to the same version), so a sandbox adapter\n// can compare it against a running daemon's `/healthz` version to decide whether to (re)deploy.\n//\n// The `typeof` guard keeps this importable in dev/test where the define isn't applied (raw `tsc`,\n// `bun test`) — it falls back to a sentinel instead of throwing on an undefined identifier.\ndeclare const __MINDWIRE_VERSION__: string;\n\nexport const SDK_VERSION: string =\n typeof __MINDWIRE_VERSION__ !== \"undefined\" ? __MINDWIRE_VERSION__ : \"0.0.0-dev\";\n","// The unified destination seam. A **target** is *where the mindwire daemon runs and how the SDK\n// reaches it* — the single axis that used to be three unrelated constructor branches (embedded /\n// remote / sandbox). Every destination is a {@link Target} factory: `local()` (the zero-config\n// default), `remote()`, `ssh()`, `docker()`, `oblien()`, or your own object implementing {@link Target}.\n//\n// A `Target`'s `connect()` does two things: **ensure the daemon** at the destination and return\n// **how to contact it** as a {@link TargetHandle}. The `Http` layer consumes exactly that: a resolved\n// base that may carry a transport-specific `fetch` (used for both unary and SSE), a rotating\n// `getToken`, and per-request `headers` (see http.ts). Nothing in `http.ts` changes to add a backend.\nimport type { FetchLike, TokenGetter } from \"../http.js\";\nimport { startEmbedded, type EmbeddedOptions } from \"../embedded.js\";\nimport type { EnsureEvent } from \"./host.js\";\n\n/**\n * What `connect()` is told about the turn's context. Provisioning knobs (image, port, credentials, …)\n * live on each factory's own config — this is only the client-level context every target shares.\n */\nexport interface ConnectSpec {\n /** The client's default agent, used as the in-daemon `AGENT_TYPE` when the target provisions one. */\n agent?: string;\n /** Receives an {@link EnsureEvent} at each provisioning phase (wired from the client `logger`). */\n onLog?: (e: EnsureEvent) => void;\n}\n\n/**\n * A live transport descriptor a target returns from {@link Target.connect} — everything the SDK's\n * `Http` layer needs to reach the daemon at this destination.\n */\nexport interface TargetHandle {\n /** Stable id of the destination this handle drives (for logging / reuse). */\n id: string;\n /** Base URL for the daemon. With a custom `fetch`, this may be a sentinel the fetch strips. */\n baseUrl: string;\n /**\n * A transport-specific `fetch` for this destination — used for both unary requests and SSE streams.\n * A target supplies it to route every call through its runtime (e.g. Oblien's `rt.proxy`); a\n * direct-HTTP destination (loopback, a published Docker port, an SSH tunnel) omits it and the\n * client's default fetch is used.\n */\n fetch?: FetchLike;\n /** Per-request headers this transport must send (e.g. a proxy-target port). */\n headers?: Record<string, string>;\n /** A static bearer token, if the destination uses one. */\n token?: string;\n /** Fetch the current bearer for a rotating credential; re-mints on `{force:true}`. */\n getToken?: TokenGetter;\n /** Release destination-owned resources (per the factory's `stopOnExit`). Idempotent. */\n stop(): Promise<void>;\n}\n\n/**\n * A destination for the mindwire daemon. Given a {@link ConnectSpec}, provision (or reuse) the\n * environment, ensure a reachable daemon, and return a {@link TargetHandle}. The built-ins are\n * {@link local} / {@link remote} (here) and {@link import(\"./ssh.js\").ssh} /\n * {@link import(\"./docker.js\").docker} / {@link import(\"./oblien.js\").oblien}; a custom backend is\n * just another object with this shape.\n */\nexport interface Target {\n /** Destination id, e.g. `\"local\"` / `\"remote\"` / `\"ssh\"` / `\"docker\"` / `\"oblien\"`. */\n readonly name: string;\n connect(spec: ConnectSpec): Promise<TargetHandle>;\n}\n\n/** Emit one {@link EnsureEvent}, tolerating a throwing logger (see host.ts Risk 8). */\nfunction emit(spec: ConnectSpec, e: EnsureEvent): void {\n if (!spec.onLog) return;\n try {\n spec.onLog(e);\n } catch {\n // A user logger must not be able to break connect().\n }\n}\n\n/**\n * The default destination: an **embedded** daemon on loopback. On a server runtime (Node/Bun/Deno)\n * `connect()` auto-spawns the bundled `mindwired` on a free `127.0.0.1` port and points the SDK at it,\n * so `new Mindwire()` \"just works\" with nothing to deploy.\n *\n * Embedded daemons are memoized by config (see embedded.ts): two zero-config `local()` clients share\n * one loopback daemon (one environment), while `local({ cwd })` / `local({ statePath })` isolate into\n * their own. `stop()` is a **no-op** — the shared daemon is reaped on process exit (Risk 5).\n */\nexport function local(opts: EmbeddedOptions = {}): Target {\n return {\n name: \"local\",\n async connect(spec) {\n const d = await startEmbedded(opts);\n emit(spec, { target: \"local\", phase: \"ready\", message: `embedded daemon on ${d.baseUrl}` });\n return {\n id: d.baseUrl,\n baseUrl: d.baseUrl,\n ...(d.token !== undefined ? { token: d.token } : {}),\n // No-op: the embedded daemon is shared (keyed memoization) and reaped on process exit.\n stop: async () => {},\n };\n },\n };\n}\n\n/** Options for {@link remote}. */\nexport interface RemoteOptions {\n /** Bearer token for the daemon, if it requires one. */\n token?: string;\n /** Extra headers merged into every request. */\n headers?: Record<string, string>;\n /** Custom fetch for this destination (else the client default / global fetch). */\n fetch?: FetchLike;\n}\n\n/**\n * A **remote** daemon you already run, reached over plain HTTP at `baseUrl`. `connect()` returns the\n * transport immediately without a network round-trip — there is no ensure/probe here; `mw.health()`\n * is the real liveness check (Risk 6). Required in the browser / edge runtimes, where a daemon can't\n * be spawned. `stop()` is a no-op (mindwire doesn't own a daemon it didn't start).\n */\nexport function remote(baseUrl: string, opts: RemoteOptions = {}): Target {\n return {\n name: \"remote\",\n async connect(spec) {\n emit(spec, { target: \"remote\", phase: \"skip\", message: `using remote daemon at ${baseUrl}` });\n return {\n id: baseUrl,\n baseUrl,\n ...(opts.token !== undefined ? { token: opts.token } : {}),\n ...(opts.headers !== undefined ? { headers: opts.headers } : {}),\n ...(opts.fetch !== undefined ? { fetch: opts.fetch } : {}),\n stop: async () => {},\n };\n },\n };\n}\n","import { Http, type FetchLike } from \"./http.js\";\nimport { readSSE } from \"./sse.js\";\nimport { Run } from \"./run.js\";\nimport { WorkspaceApi, type ProjectAuth } from \"./workspace.js\";\nimport { SurfacesApi } from \"./surfaces.js\";\nimport { ServiceApi } from \"./service.js\";\nimport { ExecutionApi } from \"./execution.js\";\nimport { ComputerApi } from \"./computer.js\";\nimport { local, type Target, type TargetHandle, type ConnectSpec } from \"./target/index.js\";\nimport type { EnsureEvent } from \"./target/host.js\";\nimport type {\n AgentInfo,\n AuthMethod,\n AuthState,\n AuthStatus,\n Catalog,\n ChatSummary,\n CustomProvider,\n DeleteResult,\n DoctorReport,\n Health,\n MCPServer,\n MemoryDoc,\n MemoryScope,\n Message,\n ModelInfo,\n Notification,\n NotifyChannel,\n NotifyChannelInput,\n NotifyChannelTestResult,\n NotifyConfigInput,\n NotifyConfigStatus,\n NotifyRule,\n NotifyRuleInput,\n ProcessFrame,\n PromptTemplate,\n ResolveOptions,\n Run as RunData,\n SetupStatus,\n HarnessSoftware,\n Stats,\n Subagent,\n TurnOptions,\n} from \"./types.js\";\n\nexport interface MindwireOptions {\n /**\n * Default agent type for agent-scoped calls (e.g. `\"claude-code\"`). When omitted, the daemon\n * uses its own default. Override per call with the `agent` option, or scope a whole client\n * with {@link Mindwire.withAgent}.\n */\n agent?: string;\n /**\n * **Where the daemon runs and how the SDK reaches it.** A {@link Target} factory: {@link local}\n * (the default — an embedded loopback daemon, auto-spawned on a server runtime), {@link remote}\n * (a daemon you already run, required in the browser), or {@link import(\"./target/ssh.js\").ssh} /\n * {@link import(\"./target/docker.js\").docker} / {@link import(\"./target/oblien.js\").oblien} — or any\n * object implementing `Target`. One `new Mindwire` = one target = one daemon = one environment; to\n * isolate agents, create another `Mindwire` with its own target. Omit for the zero-config default.\n */\n target?: Target;\n /**\n * Receives a step {@link EnsureEvent} while a target provisions (connect → probe → upload → launch →\n * ready, or skip). Handy to surface the seconds-long \"upload the daemon + launch + health-poll\" of a\n * fresh SSH/Docker/Oblien box. A throwing callback can't abort provisioning.\n */\n logger?: (e: EnsureEvent) => void;\n /** Custom fetch. Defaults to the global `fetch` (Node 18+, Bun, Deno, browsers). */\n fetch?: FetchLike;\n /** Extra headers merged into every request. */\n headers?: Record<string, string>;\n /**\n * Deadline in milliseconds for a single unary request (health, config, `turn` creation, memory,\n * …). Guards against a hung daemon or a dead tunnel blocking a call forever — on expiry the call\n * rejects with {@link import(\"./errors.js\").TimeoutError}. Does **not** apply to the event stream,\n * which is long-lived. Defaults to 120000; pass `0` to disable.\n */\n requestTimeoutMs?: number;\n}\n\n// Reaps the destination behind a transport exactly once, keyed by the shared Http so any\n// `withAgent()` clone can `close()` it. `local`/`remote` handles have no-op `stop()`.\nconst handleByTransport = new WeakMap<Http, Promise<TargetHandle>>();\n\n/** Options accepted by any agent-scoped method to override the client's default agent. */\nexport interface AgentScoped {\n agent?: string;\n}\n\n/**\n * The mindwire client — one typed surface over the daemon, regardless of which coding-agent\n * harness runs behind `?agent=<type>`.\n *\n * **Where** it runs is one option — `target`. By default it's an **embedded** daemon\n * ({@link local}): on a server runtime it auto-spawns the bundled `mindwired` on loopback, so there's\n * nothing to deploy. Point elsewhere with {@link remote} (a daemon you run; also required in the\n * browser), {@link import(\"./target/ssh.js\").ssh}, {@link import(\"./target/docker.js\").docker}, or\n * {@link import(\"./target/oblien.js\").oblien}. One client = one target = one daemon = one environment.\n *\n * ```ts\n * // Local embedded (default) — Node/Bun/Deno:\n * const mw = new Mindwire({ agent: \"claude-code\" });\n *\n * // Remote — or in the browser:\n * const mw = new Mindwire({ target: remote(\"https://mindwire.yourco.com\", { token }) });\n *\n * // A fresh box over SSH, watching it provision:\n * const mw = new Mindwire({ target: ssh({ host, username: \"root\" }), logger: (e) => console.log(e.phase, e.message) });\n * await mw.ensure();\n *\n * const run = await mw.turn({ chatId: \"c1\", message: \"add a health check\" });\n * for await (const ev of run) console.log(ev.type, ev.text ?? \"\");\n * ```\n */\nexport class Mindwire {\n /** Workspace registry: saved agent profiles, projects and chat relationships. */\n readonly workspace: WorkspaceApi;\n readonly surfaces: SurfacesApi;\n readonly service: ServiceApi;\n readonly execution: ExecutionApi;\n readonly computer: ComputerApi;\n readonly http: Http;\n /** The default agent type applied to agent-scoped calls, if set. */\n readonly defaultAgent: string | undefined;\n /** Step-flow auth, scoped to this client's default agent (override per call). */\n readonly auth: AuthApi;\n /** Persistent memory files + saved prompt templates, scoped to this client's default agent. */\n readonly prompts: PromptsApi;\n /** Persistent MCP-server config (the config an agent loads every run), scoped to this client's default agent. */\n readonly mcp: McpApi;\n /** Custom LLM-provider registration (opencode/Codex native config), scoped to this client's default agent. */\n readonly providers: ProvidersApi;\n /** Daemon-driven notification channels + routing rules (webhook/slack/discord/telegram; per-agent/session/global). */\n readonly notify: NotifyApi;\n\n constructor(opts: MindwireOptions = {}) {\n // One path for every destination. The target's `connect()` — called once, memoized by `Http` —\n // provisions the daemon (spawn embedded / connect SSH+Docker+Oblien / nothing for remote) and\n // returns how to reach it: a base URL plus an optional transport `fetch`, rotating `getToken`, and\n // per-request `headers`. The handle is stashed so `close()` can reap it once across `withAgent()`.\n const target = opts.target ?? local();\n const spec: ConnectSpec = { agent: opts.agent, onLog: opts.logger };\n this.http = new Http({\n fetch: opts.fetch,\n headers: opts.headers,\n timeoutMs: opts.requestTimeoutMs,\n resolveBase: () => {\n const h = target.connect(spec);\n handleByTransport.set(this.http, h);\n return h.then((x) => ({\n baseUrl: x.baseUrl,\n token: x.token,\n getToken: x.getToken,\n headers: x.headers,\n fetch: x.fetch,\n }));\n },\n });\n this.defaultAgent = opts.agent;\n this.workspace = new WorkspaceApi(this);\n this.surfaces = new SurfacesApi(this);\n this.service = new ServiceApi(this);\n this.execution = new ExecutionApi(this);\n this.computer = new ComputerApi(this);\n this.auth = new AuthApi(this);\n this.prompts = new PromptsApi(this);\n this.mcp = new McpApi(this);\n this.providers = new ProvidersApi(this);\n this.notify = new NotifyApi(this);\n }\n\n /**\n * Provision the destination and await readiness **now**, rather than lazily on the first request —\n * useful to front-load a fresh SSH/Docker/Oblien box (and to stream its {@link EnsureEvent}s to the\n * `logger`) before the first `turn()`. Idempotent and memoized: repeated `ensure()` calls, and the\n * first real request, all await the same provisioning, so the target connects exactly once.\n */\n async ensure(): Promise<void> {\n await this.http.ready();\n }\n\n /** Return a new client bound to a different default agent (shares the same transport config). */\n withAgent(agent: string): Mindwire {\n const clone = Object.create(Mindwire.prototype) as Mutable<Mindwire>;\n clone.http = this.http;\n clone.defaultAgent = agent;\n clone.workspace = new WorkspaceApi(clone as Mindwire);\n clone.surfaces = new SurfacesApi(clone as Mindwire);\n clone.service = new ServiceApi(clone as Mindwire);\n clone.execution = new ExecutionApi(clone as Mindwire);\n clone.computer = new ComputerApi(clone as Mindwire);\n clone.auth = new AuthApi(clone as Mindwire);\n clone.prompts = new PromptsApi(clone as Mindwire);\n clone.mcp = new McpApi(clone as Mindwire);\n clone.providers = new ProvidersApi(clone as Mindwire);\n clone.notify = new NotifyApi(clone as Mindwire);\n return clone as Mindwire;\n }\n\n /** The `?agent=` value to send for a scoped call: explicit override → client default → none. */\n agentParam(scoped?: AgentScoped): { agent: string } | undefined {\n const a = scoped?.agent ?? this.defaultAgent;\n return a ? { agent: a } : undefined;\n }\n\n /**\n * Release target-owned resources by calling the {@link TargetHandle}'s `stop()` — once, even across\n * {@link withAgent} clones that share the transport. For an `ssh`/`docker`/`oblien` target this reaps\n * the box (tear down the tunnel, stop or delete the container/workspace, per `stopOnExit`); a no-op\n * for `local`/`remote` (embedded self-cleans on process exit; remote is not ours to stop). Safe to\n * call before the target has connected (nothing to reap yet).\n */\n async close(): Promise<void> {\n const handle = handleByTransport.get(this.http);\n if (!handle) return;\n handleByTransport.delete(this.http);\n const h = await handle.catch(() => null);\n if (h) await h.stop();\n }\n\n // ---- health & catalog ----------------------------------------------------\n\n /** `GET /healthz` — authenticated liveness check. Resolves with the daemon's health payload when it is up. */\n health(): Promise<Health> {\n return this.http.request<Health>(\"GET\", \"/healthz\");\n }\n\n /**\n * `GET /stats` — the daemon **process's** resource snapshot (heap in use, memory reserved from the\n * OS, goroutines, GC cycles, cores, platform, uptime). Cheap enough to call on demand — the daemon\n * reads its own Go runtime, not the machine — so a UI can fetch it when a user opens a daemon's page\n * without any background polling. See {@link Stats} for what each field means and doesn't.\n */\n stats(): Promise<Stats> {\n return this.http.request<Stats>(\"GET\", \"/stats\");\n }\n\n /** `GET /catalog` — every agent this daemon binary supports. */\n catalog(): Promise<Catalog> {\n return this.http.request<Catalog>(\"GET\", \"/catalog\");\n }\n\n /** `GET /agent` — capabilities + settings schema + auth methods/status for the selected agent. */\n agent(scoped?: AgentScoped): Promise<AgentInfo> {\n return this.http.request<AgentInfo>(\"GET\", \"/agent\", { query: this.agentParam(scoped) });\n }\n\n /** `GET /agent/software` — installed version, compatibility and approved update target. */\n software(opts: AgentScoped & { refresh?: boolean } = {}): Promise<HarnessSoftware> {\n return this.http.request<HarnessSoftware>(\"GET\", \"/agent/software\", {\n query: { ...this.agentParam(opts), ...(opts.refresh ? { refresh: \"true\" } : {}) },\n });\n }\n\n /**\n * `GET /models` — the models the selected agent can run for the configured account. An empty array\n * is valid (no credentials yet / offline). Throws a 400 {@link ApiError} for an agent whose model is\n * free text (check `capabilities.models` first).\n */\n models(scoped?: AgentScoped): Promise<ModelInfo[]> {\n return this.http.request<ModelInfo[]>(\"GET\", \"/models\", { query: this.agentParam(scoped) });\n }\n\n /** `GET /doctor` — daemon-level health plus the selected agent's own checks. */\n doctor(scoped?: AgentScoped): Promise<DoctorReport> {\n return this.http.request<DoctorReport>(\"GET\", \"/doctor\", { query: this.agentParam(scoped) });\n }\n\n // ---- toolchain setup -----------------------------------------------------\n\n /** `POST /setup` — start the agent's install toolchain (background; poll {@link setupStatus}). */\n setup(scoped?: AgentScoped): Promise<SetupStatus> {\n return this.http.request<SetupStatus>(\"POST\", \"/setup\", { query: this.agentParam(scoped) });\n }\n\n /** `POST /update` — install the catalog's newest tested version compatible with this daemon. */\n update(scoped?: AgentScoped): Promise<SetupStatus> {\n return this.http.request<SetupStatus>(\"POST\", \"/update\", { query: this.agentParam(scoped) });\n }\n\n /** `GET /setup` — current toolchain install progress. */\n setupStatus(scoped?: AgentScoped): Promise<SetupStatus> {\n return this.http.request<SetupStatus>(\"GET\", \"/setup\", { query: this.agentParam(scoped) });\n }\n\n // ---- config --------------------------------------------------------------\n\n /** `GET /config` — the declared, non-secret settings for the agent. */\n getConfig(scoped?: AgentScoped): Promise<Record<string, string>> {\n return this.http.request<Record<string, string>>(\"GET\", \"/config\", {\n query: this.agentParam(scoped),\n });\n }\n\n /** `PUT /config` — merge recognized (non-secret) setting keys. Unknown keys are ignored server-side. */\n async setConfig(values: Record<string, string>, scoped?: AgentScoped): Promise<void> {\n await this.http.request<void>(\"PUT\", \"/config\", {\n query: this.agentParam(scoped),\n body: values,\n });\n }\n\n // ---- chats & history -----------------------------------------------------\n\n /** `GET /chats` — recorded chats (newest first), shared across agents. */\n chats(): Promise<ChatSummary[]> {\n return this.http.request<ChatSummary[]>(\"GET\", \"/chats\");\n }\n\n /**\n * `PUT /chats/{id}` — rename a chat. The user title wins over the agent's native auto-title in\n * every listing; an empty title clears the rename (reverting to the native/derived title).\n * Returns the updated summary.\n */\n renameChat(chatId: string, title: string): Promise<ChatSummary> {\n return this.http.request<ChatSummary>(\"PUT\", `/chats/${encodeURIComponent(chatId)}`, {\n body: { title },\n });\n }\n\n /**\n * `DELETE /chats/{id}` — a true, irreversible delete: purges ALL of the chat's mindwire\n * bookkeeping and, for every session the chat mapped to, removes that agent's native transcript\n * (the source of truth). Rejects with a 409 error if a turn is live. Native deletion is\n * best-effort per agent; the result reports what was purged vs. failed.\n */\n deleteChat(chatId: string): Promise<DeleteResult> {\n return this.http.request<DeleteResult>(\"DELETE\", `/chats/${encodeURIComponent(chatId)}`);\n }\n\n /**\n * `POST /chats/{id}/fork` — clone a chat into a new id (generated when `newChatId` is omitted).\n * The fork shares the source's native session until its first turn, which branches it (natively\n * on Claude via `--fork-session`; a fresh session on agents without native fork). Rejects with a\n * 409 if the source has a live turn, 404 if the source is unknown, 400 if the target id is in\n * use. Returns the new chat's summary.\n */\n forkChat(chatId: string, opts: { newChatId?: string } = {}): Promise<ChatSummary> {\n return this.http.request<ChatSummary>(\"POST\", `/chats/${encodeURIComponent(chatId)}/fork`, {\n body: opts.newChatId ? { newChatId: opts.newChatId } : {},\n });\n }\n\n /**\n * `GET /chats/{id}/messages` — a chat's transcript (native when the agent supports it, else\n * the recorded fallback). `limit` caps to the newest N; `before` pages older history.\n */\n messages(\n chatId: string,\n opts: AgentScoped & { limit?: number; before?: string } = {},\n ): Promise<Message[]> {\n const query: Record<string, string | number | undefined> = { ...this.agentParam(opts) };\n if (opts.limit !== undefined) query[\"limit\"] = opts.limit;\n if (opts.before !== undefined) query[\"before\"] = opts.before;\n return this.http.request<Message[]>(\"GET\", `/chats/${encodeURIComponent(chatId)}/messages`, {\n query,\n });\n }\n\n /** `GET /chats/{id}/run` — the latest run for a chat (reattach anchor), or `null` if none yet. */\n async latestRun(chatId: string): Promise<Run | null> {\n const data = await this.http.request<RunData | undefined>(\n \"GET\",\n `/chats/${encodeURIComponent(chatId)}/run`,\n );\n return data ? new Run(this.http, data) : null;\n }\n\n // ---- turns & runs --------------------------------------------------------\n\n /**\n * `POST /turns` — start a turn. Returns a {@link Run} handle you can stream, cancel, or await.\n * Rejects with an {@link ApiError} (409) if a turn is already running for the chat.\n *\n * `mode` defaults to `\"turn\"` — one agent turn that ends when the CLI settles. Pass\n * `mode: \"resolve\"` (with optional {@link ResolveOptions} `resolve` caps) for a global-resolve run\n * that auto-continues the agent's multi-step work until it's done; {@link Mindwire.resolve} is the\n * clearer entry point for that. The returned {@link Run} is then the parent of the run tree.\n */\n async turn(\n input: {\n chatId: string;\n message: string;\n cwd?: string;\n options?: TurnOptions;\n mode?: \"turn\" | \"resolve\";\n resolve?: ResolveOptions;\n gitAuth?: ProjectAuth;\n } & AgentScoped,\n ): Promise<Run> {\n const body: {\n chatId: string;\n message: string;\n cwd?: string;\n options?: TurnOptions;\n mode?: \"turn\" | \"resolve\";\n resolve?: ResolveOptions;\n gitAuth?: ProjectAuth;\n } = {\n chatId: input.chatId,\n message: input.message,\n };\n if (input.cwd !== undefined) body.cwd = input.cwd;\n if (input.options !== undefined) body.options = input.options;\n if (input.mode !== undefined) body.mode = input.mode;\n if (input.resolve !== undefined) body.resolve = input.resolve;\n if (input.gitAuth !== undefined) body.gitAuth = input.gitAuth;\n const data = await this.http.request<RunData>(\"POST\", \"/turns\", {\n query: this.agentParam(input),\n body,\n });\n return new Run(this.http, data);\n }\n\n /**\n * `POST /turns {mode:\"resolve\"}` — start a **global-resolve** run: instead of returning after one\n * turn, the daemon holds the task open and auto-continues the agent (resuming on continuable stops\n * and probing for completion) until the work is globally resolved, then aggregates one final result.\n *\n * The returned {@link Run} is the **parent** of a run tree: each auto-continued iteration is a child\n * turn ({@link Run.children}) whose events stream onto the parent's topic, delimited by `continuation`\n * boundary events. `run.wait()` resolves once with the aggregated result; `run.stopReason` /\n * `run.iterations` report how the loop ended. Resolve turns run unattended (no mid-turn approvals)\n * and are bounded by {@link ResolveOptions} caps — see the resolve guide. Rejects with an\n * {@link ApiError} (409) if a turn is already running for the chat.\n */\n async resolve(\n input: {\n chatId: string;\n message: string;\n cwd?: string;\n options?: TurnOptions;\n resolve?: ResolveOptions;\n gitAuth?: ProjectAuth;\n } & AgentScoped,\n ): Promise<Run> {\n return this.turn({ ...input, mode: \"resolve\" });\n }\n\n /** `GET /runs/{id}` — fetch an existing run as a {@link Run} handle. */\n async run(id: string): Promise<Run> {\n const data = await this.http.request<RunData>(\"GET\", `/runs/${encodeURIComponent(id)}`);\n return new Run(this.http, data);\n }\n\n /**\n * `POST /chats/{id}/compact` — run an on-demand conversation compaction as a first-class {@link Run}\n * you can stream or await. The agent folds prior context into a summary it carries forward, emitting\n * a `compaction` event on the stream and recording the boundary in history exactly like an\n * auto-compaction. Optional `instructions` focus the continuation summary (Claude's\n * `/compact <instructions>`; agents that don't honor focus still compact). Rejects with an\n * {@link ApiError}: 400 if the agent doesn't support compaction (`capabilities.compactNow`) or the\n * chat has no conversation yet, 409 if a turn is already running for the chat.\n */\n async compact(chatId: string, opts: { instructions?: string } & AgentScoped = {}): Promise<Run> {\n const data = await this.http.request<RunData>(\n \"POST\",\n `/chats/${encodeURIComponent(chatId)}/compact`,\n {\n query: this.agentParam(opts),\n body: opts.instructions ? { instructions: opts.instructions } : {},\n },\n );\n return new Run(this.http, data);\n }\n\n // ---- notifications -------------------------------------------------------\n\n /** `GET /notify/config` — whether a notification channel is wired (token never returned). */\n getNotifyConfig(): Promise<NotifyConfigStatus> {\n return this.http.request<NotifyConfigStatus>(\"GET\", \"/notify/config\");\n }\n\n /** `PUT /notify/config` — store the provisioned notification channel (daemon-wide). */\n async setNotifyConfig(input: NotifyConfigInput): Promise<void> {\n await this.http.request<void>(\"PUT\", \"/notify/config\", { body: input });\n }\n\n /** `GET /notify/stream` — SSE feed of the daemon's notifications (replay, then live). */\n async *notifications(opts: { signal?: AbortSignal } = {}): AsyncGenerator<Notification> {\n const res = await this.http.open(\"GET\", \"/notify/stream\", {\n ...(opts.signal ? { signal: opts.signal } : {}),\n });\n yield* readSSE<Notification>(res.body!, opts.signal);\n }\n\n // ---- live resources ------------------------------------------------------\n\n /**\n * `GET /processes/stream` — SSE feed of live per-turn CPU/memory, one {@link ProcessFrame} per tick.\n * Sampling is **on demand**: the daemon starts measuring only while a client is connected and stops\n * the instant the last one disconnects, so aborting the `signal` (or ending the loop) tells the\n * daemon to stop — no background work, no leak. Pass `agent` to filter each frame's samples to one\n * agent type. Frames are live snapshots (no replay); an empty `samples` array is a valid keep-alive.\n */\n async *processes(\n opts: { agent?: string; signal?: AbortSignal } = {},\n ): AsyncGenerator<ProcessFrame> {\n const path =\n \"/processes/stream\" +\n (opts.agent ? `?agent=${encodeURIComponent(opts.agent)}` : \"\");\n const res = await this.http.open(\"GET\", path, {\n ...(opts.signal ? { signal: opts.signal } : {}),\n });\n yield* readSSE<ProcessFrame>(res.body!, opts.signal);\n }\n}\n\n/** Step-flow auth (`methods → begin → step → status`) for a scoped agent. */\nexport class AuthApi {\n constructor(private readonly mw: Mindwire) {}\n\n /** `GET /auth/methods` — the options list to present. */\n methods(scoped?: AgentScoped): Promise<AuthMethod[]> {\n return this.mw.http.request<AuthMethod[]>(\"GET\", \"/auth/methods\", {\n query: this.mw.agentParam(scoped),\n });\n }\n\n /** `POST /auth/begin` — start one method (may return `{ url, code, fields, pending }`). */\n begin(method: string, scoped?: AgentScoped): Promise<AuthState> {\n return this.mw.http.request<AuthState>(\"POST\", \"/auth/begin\", {\n query: this.mw.agentParam(scoped),\n body: { method },\n });\n }\n\n /** `POST /auth/step` — submit fields, or poll an interactive login to completion. */\n step(input: Record<string, string>, scoped?: AgentScoped): Promise<AuthState> {\n return this.mw.http.request<AuthState>(\"POST\", \"/auth/step\", {\n query: this.mw.agentParam(scoped),\n body: input,\n });\n }\n\n /** Read one interactive attempt, scoped by the returned AuthState.flowId. */\n poll(flowId: string, scoped?: AgentScoped): Promise<AuthState> {\n return this.step({ _flowId: flowId }, scoped);\n }\n\n /** Cancel this native login without affecting a newer sign-in attempt. */\n cancel(flowId: string, scoped?: AgentScoped): Promise<AuthState> {\n return this.step({ _flowId: flowId, _action: \"cancel\" }, scoped);\n }\n\n /** `GET /auth/status` — is the agent authenticated, and via which method. */\n status(scoped?: AgentScoped): Promise<AuthStatus> {\n return this.mw.http.request<AuthStatus>(\"GET\", \"/auth/status\", {\n query: this.mw.agentParam(scoped),\n });\n }\n\n /** `POST /auth/logout` — disconnect this harness once its running chats finish. */\n logout(scoped?: AgentScoped): Promise<AuthStatus> {\n return this.mw.http.request<AuthStatus>(\"POST\", \"/auth/logout\", {\n query: this.mw.agentParam(scoped),\n });\n }\n}\n\n/**\n * The persistent prompt/memory surface for a scoped agent — the three layers beneath a turn's\n * per-turn `systemPrompt`: the agent's **memory file** (`CLAUDE.md` / `AGENTS.md`) and its saved\n * **prompt templates** (slash-commands / saved prompts). One shape regardless of which agent runs;\n * a call 400s if the selected agent doesn't support the layer.\n *\n * `dir` selects the project-scope working directory (defaults to the daemon cwd); `scope` picks\n * `project` vs `user` (the agent's home config dir). Only agents whose `Capabilities.memory` /\n * `Capabilities.promptTemplates` is set expose these — read that first to decide what to render.\n */\nexport class PromptsApi {\n constructor(private readonly mw: Mindwire) {}\n\n private query(scoped: AgentScoped | undefined, extra?: Record<string, string | undefined>) {\n return { ...this.mw.agentParam(scoped), ...extra };\n }\n\n /**\n * `GET /memory` — the agent's memory file at every supported scope (project + user for both\n * Claude and Codex). Each entry carries the resolved `path` and `exists`; `content` is `\"\"` for\n * an absent file.\n */\n memory(opts: AgentScoped & { dir?: string } = {}): Promise<MemoryDoc[]> {\n return this.mw.http.request<MemoryDoc[]>(\"GET\", \"/memory\", {\n query: this.query(opts, { dir: opts.dir }),\n });\n }\n\n /** `PUT /memory` — write the memory file at `scope`. Returns the resulting {@link MemoryDoc}. */\n setMemory(\n input: { scope: MemoryScope; content: string },\n opts: AgentScoped & { dir?: string } = {},\n ): Promise<MemoryDoc> {\n return this.mw.http.request<MemoryDoc>(\"PUT\", \"/memory\", {\n query: this.query(opts, { dir: opts.dir }),\n body: input,\n });\n }\n\n /**\n * `DELETE /memory` — remove the memory file at `scope` (defaults to `user`). Returns the resulting\n * {@link MemoryDoc} (`exists: false` at the resolved path). Idempotent: deleting an absent file still\n * succeeds.\n */\n deleteMemory(opts: AgentScoped & { scope?: MemoryScope; dir?: string } = {}): Promise<MemoryDoc> {\n return this.mw.http.request<MemoryDoc>(\"DELETE\", \"/memory\", {\n query: this.query(opts, { scope: opts.scope, dir: opts.dir }),\n });\n }\n\n /**\n * `GET /prompts` — saved prompt templates across every supported scope (Claude: project + user;\n * Codex: user only). `content` is omitted here; fetch it with {@link get}. A missing project\n * directory yields an empty list for that scope rather than an error.\n */\n list(opts: AgentScoped & { dir?: string } = {}): Promise<PromptTemplate[]> {\n return this.mw.http.request<PromptTemplate[]>(\"GET\", \"/prompts\", {\n query: this.query(opts, { dir: opts.dir }),\n });\n }\n\n /** `GET /prompts/{name}` — one template's full body. Rejects with a 404 `ApiError` if absent. */\n get(name: string, opts: AgentScoped & { scope?: MemoryScope; dir?: string } = {}): Promise<PromptTemplate> {\n return this.mw.http.request<PromptTemplate>(\"GET\", `/prompts/${encodeURIComponent(name)}`, {\n query: this.query(opts, { scope: opts.scope, dir: opts.dir }),\n });\n }\n\n /** `PUT /prompts/{name}` — create or overwrite a template. Returns the resulting {@link PromptTemplate}. */\n set(\n name: string,\n content: string,\n opts: AgentScoped & { scope?: MemoryScope; dir?: string } = {},\n ): Promise<PromptTemplate> {\n return this.mw.http.request<PromptTemplate>(\"PUT\", `/prompts/${encodeURIComponent(name)}`, {\n query: this.query(opts, { scope: opts.scope, dir: opts.dir }),\n body: { content },\n });\n }\n\n /**\n * `DELETE /prompts/{name}` — remove one template at `scope` (defaults to `user`). Idempotent:\n * deleting an absent template still succeeds. A traversal name rejects with a 400 `ApiError`.\n */\n async delete(name: string, opts: AgentScoped & { scope?: MemoryScope; dir?: string } = {}): Promise<void> {\n await this.mw.http.request<{ deleted: boolean }>(\"DELETE\", `/prompts/${encodeURIComponent(name)}`, {\n query: this.query(opts, { scope: opts.scope, dir: opts.dir }),\n });\n }\n\n /**\n * `GET /subagents` — persistent subagent definitions (Claude `.claude/agents/*.md`) across every\n * supported scope. `content` is omitted here (fetch it with {@link subagent}); `meta` is the parsed\n * frontmatter view. Rejects with a 400 `ApiError` on an agent without the subagent-definition module.\n * Distinct from a turn's per-turn `subagents` passthrough — this is the on-disk definition store.\n */\n subagents(opts: AgentScoped & { dir?: string } = {}): Promise<Subagent[]> {\n return this.mw.http.request<Subagent[]>(\"GET\", \"/subagents\", {\n query: this.query(opts, { dir: opts.dir }),\n });\n }\n\n /** `GET /subagents/{name}` — one definition's raw body + parsed meta. 404 `ApiError` if absent. */\n subagent(name: string, opts: AgentScoped & { scope?: MemoryScope; dir?: string } = {}): Promise<Subagent> {\n return this.mw.http.request<Subagent>(\"GET\", `/subagents/${encodeURIComponent(name)}`, {\n query: this.query(opts, { scope: opts.scope, dir: opts.dir }),\n });\n }\n\n /** `PUT /subagents/{name}` — create or overwrite a definition (raw content is canonical). Returns it. */\n setSubagent(\n name: string,\n content: string,\n opts: AgentScoped & { scope?: MemoryScope; dir?: string } = {},\n ): Promise<Subagent> {\n return this.mw.http.request<Subagent>(\"PUT\", `/subagents/${encodeURIComponent(name)}`, {\n query: this.query(opts, { scope: opts.scope, dir: opts.dir }),\n body: { content },\n });\n }\n\n /**\n * `DELETE /subagents/{name}` — remove one definition at `scope` (defaults to `user`). Idempotent:\n * deleting an absent definition still succeeds. A traversal name rejects with a 400 `ApiError`.\n */\n async deleteSubagent(\n name: string,\n opts: AgentScoped & { scope?: MemoryScope; dir?: string } = {},\n ): Promise<void> {\n await this.mw.http.request<{ deleted: boolean }>(\"DELETE\", `/subagents/${encodeURIComponent(name)}`, {\n query: this.query(opts, { scope: opts.scope, dir: opts.dir }),\n });\n }\n}\n\n/**\n * The persistent MCP-server surface for a scoped agent — the servers an agent loads on **every run**\n * from its own on-disk config (Claude's project `.mcp.json` + user `.claude.json`, Codex's\n * `config.toml`), as opposed to a turn's per-turn {@link TurnOptions.mcpServers} overlay. One shape\n * regardless of which agent runs; a call 400s if the selected agent doesn't expose the config\n * (check `capabilities.mcpConfig` first).\n *\n * `scope` picks `project` vs `user` (defaults to `user` — the scope every supporting agent has;\n * Codex is user-only); `dir` selects the project-scope working directory (defaults to the daemon cwd).\n * No secret ever crosses this surface — HTTP auth travels as `bearerTokenEnvVar` (an env-var name).\n */\nexport class McpApi {\n constructor(private readonly mw: Mindwire) {}\n\n private query(scoped: AgentScoped | undefined, extra?: Record<string, string | undefined>) {\n return { ...this.mw.agentParam(scoped), ...extra };\n }\n\n /**\n * `GET /mcp` — every persistent MCP server across the agent's supported scopes, keyed\n * `scope → name → server` (Claude: project + user; Codex: user only). A missing config file yields\n * an empty object for that scope rather than an error.\n */\n list(\n opts: AgentScoped & { dir?: string } = {},\n ): Promise<Partial<Record<MemoryScope, Record<string, MCPServer>>>> {\n return this.mw.http.request<Partial<Record<MemoryScope, Record<string, MCPServer>>>>(\"GET\", \"/mcp\", {\n query: this.query(opts, { dir: opts.dir }),\n });\n }\n\n /** `GET /mcp/{name}` — one server's definition. Rejects with a 404 `ApiError` if it isn't configured. */\n get(name: string, opts: AgentScoped & { scope?: MemoryScope; dir?: string } = {}): Promise<MCPServer> {\n return this.mw.http.request<MCPServer>(\"GET\", `/mcp/${encodeURIComponent(name)}`, {\n query: this.query(opts, { scope: opts.scope, dir: opts.dir }),\n });\n }\n\n /** `PUT /mcp/{name}` — create or overwrite one server. Returns the stored definition. */\n set(\n name: string,\n server: MCPServer,\n opts: AgentScoped & { scope?: MemoryScope; dir?: string } = {},\n ): Promise<MCPServer> {\n return this.mw.http.request<MCPServer>(\"PUT\", `/mcp/${encodeURIComponent(name)}`, {\n query: this.query(opts, { scope: opts.scope, dir: opts.dir }),\n body: server,\n });\n }\n\n /** `DELETE /mcp/{name}` — remove one server. Idempotent: deleting an absent server still succeeds. */\n async delete(name: string, opts: AgentScoped & { scope?: MemoryScope; dir?: string } = {}): Promise<void> {\n await this.mw.http.request<{ deleted: boolean }>(\"DELETE\", `/mcp/${encodeURIComponent(name)}`, {\n query: this.query(opts, { scope: opts.scope, dir: opts.dir }),\n });\n }\n}\n\n/**\n * The custom LLM-provider surface for a scoped agent — the OpenAI-compatible endpoints an agent loads on\n * **every run** from its own native config (opencode's `opencode.json` `provider.<id>`, Codex's\n * `config.toml` `[model_providers.<id>]`). One shape regardless of agent; a call 400s if the selected\n * agent can't materialize one (check `capabilities.customProviders` — Claude uses its gateway auth lane\n * instead). Registered models then appear in {@link Mindwire.models} with `custom:true`.\n *\n * `scope` picks `project` vs `user` (defaults to `user`; opencode/Codex are user-only); `dir` selects the\n * project-scope working directory (defaults to the daemon cwd).\n *\n * SECURITY: secrets are passed write-only via {@link set}'s `apiKey` / `secrets` options and reported only\n * as `hasKey` (plus the stored `envVars` NAMES). They never cross this surface on the way back and are never\n * written literally into any config file — the harness references them through env-var placeholders and the\n * daemon exports them at run time.\n */\nexport class ProvidersApi {\n constructor(private readonly mw: Mindwire) {}\n\n private query(scoped: AgentScoped | undefined, extra?: Record<string, string | undefined>) {\n return { ...this.mw.agentParam(scoped), ...extra };\n }\n\n /**\n * `GET /providers` — every registered custom provider across the agent's supported scopes, keyed\n * `scope → id → provider` (opencode/Codex: user only). A missing config file yields an empty object for\n * that scope rather than an error. `hasKey` reports whether a secret is stored; the key is never returned.\n */\n list(\n opts: AgentScoped & { dir?: string } = {},\n ): Promise<Partial<Record<MemoryScope, Record<string, CustomProvider>>>> {\n return this.mw.http.request<Partial<Record<MemoryScope, Record<string, CustomProvider>>>>(\"GET\", \"/providers\", {\n query: this.query(opts, { dir: opts.dir }),\n });\n }\n\n /** `GET /providers/{id}` — one provider's definition. Rejects with a 404 `ApiError` if it isn't configured. */\n get(id: string, opts: AgentScoped & { scope?: MemoryScope; dir?: string } = {}): Promise<CustomProvider> {\n return this.mw.http.request<CustomProvider>(\"GET\", `/providers/${encodeURIComponent(id)}`, {\n query: this.query(opts, { scope: opts.scope, dir: opts.dir }),\n });\n }\n\n /**\n * `PUT /providers/{id}` — create or overwrite one provider, returning the stored definition (with\n * `hasKey` and the stored `envVars`). Two write-only secret channels, both optional: `opts.apiKey` is a\n * single key (custom endpoints, single-key catalog brands); `opts.secrets` is a NAME→VALUE map for a\n * catalog provider whose entry declares MULTIPLE env vars (e.g. AWS Bedrock). Omitting both leaves any\n * previously stored secret intact. The path `id` wins over any `id` on the provider value.\n */\n set(\n id: string,\n provider: Omit<CustomProvider, \"id\" | \"hasKey\"> & Partial<Pick<CustomProvider, \"hasKey\">>,\n opts: AgentScoped & { scope?: MemoryScope; dir?: string; apiKey?: string; secrets?: Record<string, string> } = {},\n ): Promise<CustomProvider> {\n return this.mw.http.request<CustomProvider>(\"PUT\", `/providers/${encodeURIComponent(id)}`, {\n query: this.query(opts, { scope: opts.scope, dir: opts.dir }),\n body: { ...provider, id, apiKey: opts.apiKey, secrets: opts.secrets },\n });\n }\n\n /** `DELETE /providers/{id}` — remove one provider and clear its stored key. Idempotent. */\n async delete(id: string, opts: AgentScoped & { scope?: MemoryScope; dir?: string } = {}): Promise<void> {\n await this.mw.http.request<{ deleted: boolean }>(\"DELETE\", `/providers/${encodeURIComponent(id)}`, {\n query: this.query(opts, { scope: opts.scope, dir: opts.dir }),\n });\n }\n}\n\n/**\n * Daemon-driven notification fan-out: named **channels** (a webhook URL shaped for\n * webhook/Slack/Discord/Telegram, with optional headers, a bearer token, and — for the raw webhook\n * type — an HMAC signing secret) and the **rules** that route matching notifications to them\n * (`global` / per-`agent` / per-`session`, with optional event selection). This is daemon-wide\n * config (NOT agent-scoped): the daemon evaluates every rule against each notification it emits and\n * POSTs to the union of the matched channels — additive over the single {@link Mindwire.setNotifyConfig}\n * webhook.\n *\n * Secrets are **write-only**: a channel read back via {@link channels} never carries the URL, token,\n * secret, or header values — only their presence (and the URL host). On {@link setChannel}, omitting\n * `url`/`token`/`secret` preserves the stored value; send a new value to rotate it.\n */\nexport class NotifyApi {\n constructor(private readonly mw: Mindwire) {}\n\n /** `GET /notify/channels` — every channel, masked (no secrets). */\n channels(): Promise<NotifyChannel[]> {\n return this.mw.http.request<NotifyChannel[]>(\"GET\", \"/notify/channels\");\n }\n\n /** `POST /notify/channels` — create a channel (server-assigns the id). Returns it masked. */\n createChannel(input: NotifyChannelInput): Promise<NotifyChannel> {\n return this.mw.http.request<NotifyChannel>(\"POST\", \"/notify/channels\", { body: input });\n }\n\n /**\n * `PUT /notify/channels/{id}` — update a channel, merge-preserving any omitted secret\n * (`url`/`token`/`secret`). Returns the updated masked channel. 404 `ApiError` if unknown.\n */\n setChannel(id: string, input: NotifyChannelInput): Promise<NotifyChannel> {\n return this.mw.http.request<NotifyChannel>(\"PUT\", `/notify/channels/${encodeURIComponent(id)}`, {\n body: input,\n });\n }\n\n /** `DELETE /notify/channels/{id}` — remove a channel. Idempotent. */\n async deleteChannel(id: string): Promise<void> {\n await this.mw.http.request<{ deleted: boolean }>(\"DELETE\", `/notify/channels/${encodeURIComponent(id)}`);\n }\n\n /**\n * `POST /notify/channels/{id}/test` — deliver a synthetic notification to a channel. A failed\n * delivery is DATA (`{ ok: false, error }`), not a thrown error; only an unknown id rejects (404).\n */\n testChannel(id: string): Promise<NotifyChannelTestResult> {\n return this.mw.http.request<NotifyChannelTestResult>(\n \"POST\",\n `/notify/channels/${encodeURIComponent(id)}/test`,\n );\n }\n\n /** `GET /notify/rules` — every routing rule. */\n rules(): Promise<NotifyRule[]> {\n return this.mw.http.request<NotifyRule[]>(\"GET\", \"/notify/rules\");\n }\n\n /** `POST /notify/rules` — create a rule (server-assigns the id). Returns it. */\n createRule(input: NotifyRuleInput): Promise<NotifyRule> {\n return this.mw.http.request<NotifyRule>(\"POST\", \"/notify/rules\", { body: input });\n }\n\n /** `PUT /notify/rules/{id}` — replace a rule. Returns it. 404 `ApiError` if unknown. */\n setRule(id: string, input: NotifyRuleInput): Promise<NotifyRule> {\n return this.mw.http.request<NotifyRule>(\"PUT\", `/notify/rules/${encodeURIComponent(id)}`, {\n body: input,\n });\n }\n\n /** `DELETE /notify/rules/{id}` — remove a rule. Idempotent. */\n async deleteRule(id: string): Promise<void> {\n await this.mw.http.request<{ deleted: boolean }>(\"DELETE\", `/notify/rules/${encodeURIComponent(id)}`);\n }\n}\n\ntype Mutable<T> = { -readonly [K in keyof T]: T[K] };\n","// The SSH target. mindwire connects to a box over SSH, **ensures the daemon** there exactly like any\n// other backend (deploy the matching `mindwired`, launch it detached, health-poll on the remote loopback),\n// then reaches it over a **local port-forward tunnel**: a `127.0.0.1` listener whose every inbound TCP\n// connection is forwarded — over the one SSH connection — to the daemon's loopback port on the remote.\n// So the SDK's `baseUrl` is a real `http://127.0.0.1:<localPort>` and plain **global fetch** carries\n// both unary requests and SSE (no custom fetch, works on Node/Bun/Deno). A fresh, bare box becomes a\n// first-class destination.\n//\n// `ssh2` is an OPTIONAL peer dependency, lazily `import()`-ed only in `connect()` (as are `node:net`\n// and `node:fs/promises`) — so importing mindwire, or calling `ssh()` (which just stores options),\n// never loads it. Structural `Ssh2*` types below let the SDK typecheck and build with neither `ssh2`\n// nor `@types/ssh2` installed.\nimport { MindwireError } from \"../errors.js\";\nimport { ensureDaemon, type SandboxHost, type ExecResult, type EnsureEvent } from \"./host.js\";\nimport { provisionContainer } from \"./container.js\";\nimport type { Target, TargetHandle, ConnectSpec } from \"./index.js\";\n\n/** Options for the {@link ssh} target. */\nexport interface SshOptions {\n /** Host to connect to. */\n host: string;\n /** SSH port. Defaults to 22. */\n port?: number;\n /** SSH username. */\n username: string;\n /** Private key material (PEM). Highest-precedence auth. */\n privateKey?: string | Buffer;\n /** Path to a private key file (read at connect time). */\n privateKeyPath?: string;\n /** Passphrase for an encrypted private key. */\n passphrase?: string;\n /** Password auth. */\n password?: string;\n /** ssh-agent socket path. Defaults to `$SSH_AUTH_SOCK`. Used when no key/password is given. */\n agent?: string;\n /** Handshake timeout (ms). Defaults to 20000. */\n readyTimeoutMs?: number;\n /** Port the daemon listens on, on the REMOTE loopback. Defaults to 8790. */\n daemonPort?: number;\n /** `AGENT_TYPE` for the remote daemon. Defaults to the client's agent, then `claude-code`. */\n agentType?: string;\n /** `AGENT_CWD` — working directory agents run in, on the remote. Defaults to `/root`. */\n agentCwd?: string;\n /** Explicit local `mindwired` to deploy; `{os}`/`{arch}` expand to the destination platform. Otherwise downloaded from GitHub Releases. */\n daemonBin?: string;\n /** Upgrade an older daemon when idle; requires its service update capability. */\n autoUpdate?: boolean;\n /** On `close()`, tear the tunnel down and end the SSH connection. Defaults to `true`. */\n stopOnExit?: boolean;\n /**\n * Run the daemon **inside a Docker container** on the remote host instead of natively — a clean,\n * reproducible, isolated environment per instance. mindwire ensures Docker is present, spins the\n * container, deploys `mindwired` into it, and tunnels to its published loopback port. Docker is\n * detected, never installed, unless you opt in with `install: \"ifMissing\"`.\n */\n docker?: {\n /** Create + own a container from this image. */\n image?: string;\n /** Attach to an existing container (id or name) instead of creating one. */\n container?: string;\n /** Name for a container we create. */\n name?: string;\n /** Docker-on-host policy. `\"never\"` (default) detects and fails; `\"ifMissing\"` installs + starts it. */\n install?: \"never\" | \"ifMissing\";\n /** Extra args spliced into `docker run` (before the image), e.g. `[\"-e\", \"FOO=bar\"]`. */\n createArgs?: string[];\n };\n}\n\n/**\n * The SSH target. Returns a {@link Target} whose `connect()` opens an SSH connection, ensures\n * `mindwired` runs on the remote, and points the SDK at a local tunnel to it.\n *\n * ```ts\n * const mw = new Mindwire({ target: ssh({ host: \"box.example.com\", username: \"root\" }) });\n * ```\n */\nexport function ssh(opts: SshOptions): Target {\n return { name: \"ssh\", connect: (spec) => connectSsh(opts, spec) };\n}\n\nconst DEFAULT_PORT = 8790;\nconst DEFAULT_AGENT = \"claude-code\";\nconst DEFAULT_AGENT_CWD = \"/root\";\n\n// ---- minimal structural view of the `ssh2` package -------------------------\n// Declared locally so the SDK typechecks and builds WITHOUT `ssh2`/`@types/ssh2` installed.\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\ninterface Ssh2Stream {\n on(event: string, listener: (...args: any[]) => void): Ssh2Stream;\n stderr?: { on(event: string, listener: (...args: any[]) => void): unknown };\n pipe(dest: any): any;\n write?(chunk: unknown): unknown;\n end?(chunk?: unknown): unknown;\n close?(): unknown;\n destroy?(): unknown;\n}\n\ninterface Ssh2Sftp {\n createWriteStream(path: string, opts?: { mode?: number }): Ssh2Stream;\n}\n\ninterface Ssh2Client {\n on(event: string, listener: (...args: any[]) => void): Ssh2Client;\n connect(cfg: Record<string, unknown>): void;\n exec(command: string, cb: (err: Error | undefined, channel: Ssh2Stream) => void): void;\n forwardOut(\n srcIP: string,\n srcPort: number,\n dstIP: string,\n dstPort: number,\n cb: (err: Error | undefined, channel: Ssh2Stream) => void,\n ): void;\n sftp(cb: (err: Error | undefined, sftp: Ssh2Sftp) => void): void;\n end(): void;\n}\n\ninterface Ssh2Module {\n Client: new () => Ssh2Client;\n}\n/* eslint-enable @typescript-eslint/no-explicit-any */\n\n// A local tunnel to the remote daemon: a real loopback base URL, closed on teardown.\ninterface SshTunnel {\n baseUrl: string;\n close(): Promise<void>;\n}\ntype MakeTunnel = (client: Ssh2Client, daemonPort: number) => Promise<SshTunnel>;\n\n// ---- SandboxHost over an SSH connection ------------------------------------\n\n/**\n * Bridges the backend-agnostic {@link SandboxHost} onto an SSH connection: `exec` runs a command over\n * an ssh2 exec channel (the remote login shell parses the reassembled, faithfully-quoted command line),\n * and `putFile` `mkdir -p`s the parent then streams the bytes over SFTP with the requested mode. The\n * shared {@link ensureDaemon} cycle only ever sees these two primitives.\n */\nclass SshHost implements SandboxHost {\n constructor(private readonly client: Ssh2Client) {}\n\n exec(argv: string[]): Promise<ExecResult> {\n const command = toCommandLine(argv);\n return new Promise<ExecResult>((resolve, reject) => {\n this.client.exec(command, (err, channel) => {\n if (err) {\n reject(err);\n return;\n }\n const out: Buffer[] = [];\n const errb: Buffer[] = [];\n let code: number | undefined;\n channel.on(\"data\", (chunk: Buffer) => out.push(Buffer.from(chunk)));\n channel.stderr?.on(\"data\", (chunk: Buffer) => errb.push(Buffer.from(chunk)));\n channel.on(\"close\", (c?: number) => {\n code = typeof c === \"number\" ? c : undefined;\n resolve({\n exitCode: code,\n stdout: Buffer.concat(out).toString(\"utf8\"),\n stderr: Buffer.concat(errb).toString(\"utf8\"),\n });\n });\n channel.on(\"error\", (e: Error) => reject(e));\n });\n });\n }\n\n async putFile(path: string, data: Uint8Array, opts?: { mode?: string }): Promise<void> {\n // SFTP writes require the parent directory to exist (Risk 7).\n const slash = path.lastIndexOf(\"/\");\n const dir = slash > 0 ? path.slice(0, slash) : \"/\";\n await this.exec([\"mkdir\", \"-p\", dir]);\n\n const sftp = await this.sftp();\n const mode = parseInt(opts?.mode ?? \"0644\", 8) || 0o644;\n await new Promise<void>((resolve, reject) => {\n const ws = sftp.createWriteStream(path, { mode });\n let done = false;\n const finish = () => {\n if (!done) {\n done = true;\n resolve();\n }\n };\n ws.on(\"error\", (e: Error) => reject(e));\n ws.on(\"close\", finish);\n ws.on(\"finish\", finish);\n ws.end?.(Buffer.from(data));\n });\n }\n\n private sftp(): Promise<Ssh2Sftp> {\n return new Promise<Ssh2Sftp>((resolve, reject) => {\n this.client.sftp((err, sftp) => (err ? reject(err) : resolve(sftp)));\n });\n }\n}\n\n// ---- target entry points ---------------------------------------------------\n\nasync function connectSsh(opts: SshOptions, spec: ConnectSpec): Promise<TargetHandle> {\n const mod = await importSsh2();\n const net = await import(\"node:net\");\n const client = await openConnection(mod, opts);\n const daemonPort = opts.daemonPort ?? DEFAULT_PORT;\n const makeTunnel: MakeTunnel = (c, port) => createTunnel(net, c, port);\n\n const shared = {\n daemonPort,\n agent: opts.agentType ?? spec.agent ?? DEFAULT_AGENT,\n agentCwd: opts.agentCwd ?? DEFAULT_AGENT_CWD,\n daemonBin: opts.daemonBin,\n autoUpdate: opts.autoUpdate,\n stopOnExit: opts.stopOnExit ?? true,\n onLog: spec.onLog,\n };\n\n // With `docker`, the daemon runs inside a container on the remote (isolated, reproducible); the\n // tunnel points at the container's published loopback port, not the native daemon port.\n if (opts.docker) {\n return provisionSshContainer(client, makeTunnel, {\n ...shared,\n id: `${opts.username}@${opts.host}/docker`,\n docker: opts.docker,\n });\n }\n\n return provisionSsh(client, makeTunnel, {\n ...shared,\n id: `${opts.username}@${opts.host}:${daemonPort}`,\n });\n}\n\n/** The resolved inputs {@link provisionSsh} needs — decoupled from `SshOptions` and the lazy import. */\nexport interface SshProvisionConfig {\n /** Stable id for the handle (for logging). */\n id: string;\n /** Daemon port on the remote loopback. */\n daemonPort: number;\n /** `AGENT_TYPE` for the remote daemon. */\n agent: string;\n /** `AGENT_CWD` on the remote. */\n agentCwd: string;\n daemonBin?: string;\n autoUpdate?: boolean;\n /** Close the tunnel + end the SSH connection on `stop()`. */\n stopOnExit?: boolean;\n onLog?: (e: EnsureEvent) => void;\n}\n\n/**\n * The provisioning flow, decoupled from the `ssh2` import and the tunnel implementation so it can be\n * driven by an injected fake client + `makeTunnel` in tests. Ensures the daemon over the SSH\n * connection, brings up the tunnel, and returns a handle pointed at `http://127.0.0.1:<localPort>`.\n */\nexport async function provisionSsh(\n client: Ssh2Client,\n makeTunnel: MakeTunnel,\n cfg: SshProvisionConfig,\n): Promise<TargetHandle> {\n const token = await ensureDaemon(new SshHost(client), {\n port: cfg.daemonPort,\n agent: cfg.agent,\n agentCwd: cfg.agentCwd,\n daemonBin: cfg.daemonBin,\n autoUpdate: cfg.autoUpdate,\n target: \"ssh\",\n onLog: cfg.onLog,\n });\n\n const tunnel = await makeTunnel(client, cfg.daemonPort);\n\n let stopped = false;\n const stop = async (): Promise<void> => {\n if (stopped) return;\n stopped = true;\n // Always release the local listener + in-flight sockets we own; end the SSH connection per opt-in.\n await tunnel.close().catch(() => {});\n if (cfg.stopOnExit ?? true) {\n try {\n client.end();\n } catch {\n // best-effort\n }\n }\n };\n\n // Plain direct HTTP over the tunnel — no custom fetch; the client's default (global) fetch is used.\n return { id: cfg.id, baseUrl: tunnel.baseUrl, token, stop };\n}\n\n/** The resolved inputs {@link provisionSshContainer} needs — the shared daemon knobs plus `docker`. */\nexport interface SshContainerProvisionConfig {\n /** Stable id for the handle (for logging). */\n id: string;\n /** Port the daemon binds *inside* the container. */\n daemonPort: number;\n /** `AGENT_TYPE` for the in-container daemon. */\n agent: string;\n /** `AGENT_CWD` inside the container. */\n agentCwd: string;\n daemonBin?: string;\n autoUpdate?: boolean;\n /** Close the tunnel, `docker rm -f` a created container, and end the SSH connection on `stop()`. */\n stopOnExit?: boolean;\n onLog?: (e: EnsureEvent) => void;\n /** Container knobs (image/attach/name/install/createArgs). */\n docker: NonNullable<SshOptions[\"docker\"]>;\n}\n\n/**\n * Provision the daemon **in a container** on the remote host over SSH: bridge the SSH connection into a\n * {@link SandboxHost}, hand it to the generic {@link provisionContainer} (ensure Docker → run container\n * → deploy the daemon inside), then tunnel to the container's published loopback host port. Decoupled\n * from the `ssh2` import + tunnel like {@link provisionSsh}, so tests drive it with a fake client.\n */\nexport async function provisionSshContainer(\n client: Ssh2Client,\n makeTunnel: MakeTunnel,\n cfg: SshContainerProvisionConfig,\n): Promise<TargetHandle> {\n const container = await provisionContainer(\n new SshHost(client),\n {\n image: cfg.docker.image,\n container: cfg.docker.container,\n name: cfg.docker.name,\n install: cfg.docker.install,\n createArgs: cfg.docker.createArgs,\n daemonPort: cfg.daemonPort,\n agent: cfg.agent,\n agentCwd: cfg.agentCwd,\n daemonBin: cfg.daemonBin,\n autoUpdate: cfg.autoUpdate,\n stopOnExit: cfg.stopOnExit ?? true,\n target: \"ssh\",\n },\n cfg.onLog,\n );\n\n // The tunnel targets the container's ephemeral REMOTE host port, not the in-container daemon port.\n const tunnel = await makeTunnel(client, container.hostPort);\n\n let stopped = false;\n const stop = async (): Promise<void> => {\n if (stopped) return;\n stopped = true;\n await tunnel.close().catch(() => {});\n await container.stop().catch(() => {}); // rm the container we created, per stopOnExit\n if (cfg.stopOnExit ?? true) {\n try {\n client.end();\n } catch {\n // best-effort\n }\n }\n };\n\n return { id: cfg.id, baseUrl: tunnel.baseUrl, token: container.token, stop };\n}\n\n// ---- connection + tunnel ---------------------------------------------------\n\nasync function openConnection(mod: Ssh2Module, opts: SshOptions): Promise<Ssh2Client> {\n const auth = await buildAuth(opts);\n return new Promise<Ssh2Client>((resolve, reject) => {\n const client = new mod.Client();\n let settled = false;\n client.on(\"ready\", () => {\n if (settled) return;\n settled = true;\n resolve(client);\n });\n client.on(\"error\", (err: Error) => {\n if (settled) return;\n settled = true;\n reject(\n new MindwireError(\n `mindwire: SSH connection to ${opts.username}@${opts.host}:${opts.port ?? 22} failed: ${err.message}`,\n { cause: err },\n ),\n );\n });\n client.connect({\n host: opts.host,\n port: opts.port ?? 22,\n username: opts.username,\n readyTimeout: opts.readyTimeoutMs ?? 20000,\n ...auth,\n });\n });\n}\n\n/** Auth precedence: `privateKey` → `privateKeyPath` → `password` → ssh-agent (+ its default keys). */\nasync function buildAuth(opts: SshOptions): Promise<Record<string, unknown>> {\n if (opts.privateKey !== undefined) {\n return { privateKey: opts.privateKey, ...(opts.passphrase ? { passphrase: opts.passphrase } : {}) };\n }\n if (opts.privateKeyPath !== undefined) {\n const fs = await import(\"node:fs/promises\");\n const key = await fs.readFile(opts.privateKeyPath);\n return { privateKey: key, ...(opts.passphrase ? { passphrase: opts.passphrase } : {}) };\n }\n if (opts.password !== undefined) {\n return { password: opts.password };\n }\n const sock = opts.agent ?? env(\"SSH_AUTH_SOCK\");\n return sock ? { agent: sock } : {};\n}\n\n/**\n * A local `127.0.0.1` listener that forwards every inbound connection, over the one SSH connection, to\n * `127.0.0.1:<daemonPort>` on the remote. Pre-flights a single `forwardOut` so a host with TCP\n * forwarding disabled fails fast with a clear message (exec channels used by ensure don't need it).\n */\nasync function createTunnel(\n net: typeof import(\"node:net\"),\n client: Ssh2Client,\n daemonPort: number,\n): Promise<SshTunnel> {\n // Pre-flight: confirm the server permits direct-tcpip forwarding (Risk 1).\n await new Promise<void>((resolve, reject) => {\n client.forwardOut(\"127.0.0.1\", 0, \"127.0.0.1\", daemonPort, (err, stream) => {\n if (err) {\n reject(\n new MindwireError(\n `mindwire: the SSH server refused a port-forward to 127.0.0.1:${daemonPort} (direct-tcpip). ` +\n \"Enable `AllowTcpForwarding yes` in the remote sshd_config — mindwire tunnels the daemon's \" +\n \"HTTP/SSE over the SSH connection.\",\n { cause: err },\n ),\n );\n return;\n }\n try {\n (stream.destroy ?? stream.end)?.call(stream);\n } catch {\n // best-effort close of the probe channel\n }\n resolve();\n });\n });\n\n const sockets = new Set<import(\"node:net\").Socket>();\n const server = net.createServer((socket) => {\n sockets.add(socket);\n socket.on(\"close\", () => sockets.delete(socket));\n socket.on(\"error\", () => {});\n client.forwardOut(\"127.0.0.1\", 0, \"127.0.0.1\", daemonPort, (err, stream) => {\n if (err) {\n socket.destroy();\n return;\n }\n stream.on(\"error\", () => socket.destroy());\n // Bidirectional pipe carries backpressure both ways. The ssh2 channel is a Node duplex stream;\n // our local structural `Ssh2Stream` type doesn't model that, so bridge it for `.pipe`.\n const duplex = stream as unknown as NodeJS.ReadWriteStream;\n socket.pipe(duplex).pipe(socket);\n });\n });\n\n const localPort = await new Promise<number>((resolve, reject) => {\n server.on(\"error\", reject);\n server.listen(0, \"127.0.0.1\", () => {\n const addr = server.address();\n resolve(addr && typeof addr === \"object\" ? addr.port : 0);\n });\n });\n\n const close = async (): Promise<void> => {\n for (const s of sockets) {\n try {\n s.destroy();\n } catch {\n // best-effort\n }\n }\n sockets.clear();\n await new Promise<void>((resolve) => server.close(() => resolve()));\n };\n\n return { baseUrl: `http://127.0.0.1:${localPort}`, close };\n}\n\n// ---- reassembly + lazy import ----------------------------------------------\n\n/** Wrap one argv element in single quotes, escaping embedded `'` as `'\\''` (POSIX-safe). */\nfunction shQuote(s: string): string {\n return `'${s.replace(/'/g, `'\\\\''`)}'`;\n}\n\n/** Reassemble an argv into a shell-safe command line for the remote login shell. */\nfunction toCommandLine(argv: string[]): string {\n return argv.map(shQuote).join(\" \");\n}\n\nasync function importSsh2(): Promise<Ssh2Module> {\n // A variable specifier keeps `tsc` from statically resolving (and erroring on) the optional peer,\n // and keeps bundlers from inlining it — it stays a runtime dynamic import. `@vite-ignore` silences\n // Vite/Rollup's \"dynamic import cannot be analyzed\" warning for browser consumers that pull the\n // barrel in for `remote()` only (this code path is never reached in a browser).\n const spec = \"ssh2\";\n try {\n const mod = (await import(/* @vite-ignore */ spec)) as unknown as { default?: Ssh2Module } & Ssh2Module;\n return mod.default && (mod.default as Ssh2Module).Client ? mod.default : mod;\n } catch (err) {\n throw new MindwireError(\n \"mindwire: the SSH target needs the optional `ssh2` package. Install it (`npm i ssh2`). \" +\n \"It's an optional peer dependency, so the core SDK stays dependency-free.\",\n { cause: err },\n );\n }\n}\n\nfunction env(key: string): string | undefined {\n const proc = (globalThis as { process?: { env?: Record<string, string | undefined> } }).process;\n return proc?.env?.[key];\n}\n","// The backend-agnostic daemon-ensure cycle. Every sandbox adapter (Oblien, Docker, bring-your-own)\n// concerns itself with only two things: *ensuring the daemon* and *how to contact it*. This module is\n// the first half, factored out so no adapter re-implements it. An adapter supplies a tiny\n// {@link SandboxHost} — two primitives, `exec` and `putFile` — and {@link ensureDaemon} does the rest:\n// wait for the runtime, probe `/healthz`, reconcile the running version against the SDK's bundled\n// binary, and deploy (or redeploy, when `autoUpdate` is on) the matching `mindwired` when needed.\n//\n// The daemon wire protocol is untouched — this only changes *where* the daemon runs and how its bytes\n// get there. The launch is byte-for-byte the loopback daemon, just inside the sandbox.\nimport { MindwireError } from \"../errors.js\";\nimport { SDK_VERSION } from \"../version.js\";\nimport { ensureDaemonBinary } from \"../daemon-binary.js\";\n\nfunction versionAtLeast(actual: string | undefined, desired: string): boolean {\n if (actual === desired) return true;\n if (!actual || !/^\\d+\\.\\d+\\.\\d+$/.test(actual) || !/^\\d+\\.\\d+\\.\\d+$/.test(desired)) return false;\n const a = actual.split(\".\").map(Number), b = desired.split(\".\").map(Number);\n for (let i = 0; i < 3; i++) { if (a[i] !== b[i]) return a[i]! > b[i]!; }\n return true;\n}\n\nconst versionCheckScript = String.raw`version_at_least() {\n [ \"$1\" != \"$2\" ] || return 0\n [[ \"$1\" =~ ^[0-9]+\\.[0-9]+\\.[0-9]+$ ]] && [[ \"$2\" =~ ^[0-9]+\\.[0-9]+\\.[0-9]+$ ]] || return 1\n local a b c x y z\n IFS=. read -r a b c <<< \"$1\"\n IFS=. read -r x y z <<< \"$2\"\n (( 10#$a > 10#$x || (10#$a == 10#$x && 10#$b > 10#$y) || (10#$a == 10#$x && 10#$b == 10#$y && 10#$c >= 10#$z) ))\n}`;\n\n/** Result of running a command in a sandbox — normalized (camelCase) across backends. */\nexport interface ExecResult {\n exitCode?: number;\n stdout?: string;\n stderr?: string;\n error?: string;\n}\n\n/**\n * The minimal surface an adapter exposes so the shared {@link ensureDaemon} cycle can drive any\n * backend. Two primitives only — running a command to completion, and landing raw bytes at a path.\n * How they're implemented (Oblien's runtime exec + base64 files API, Docker's exec + tar putArchive,\n * …) is the adapter's business; the cycle never sees it.\n */\nexport interface SandboxHost {\n /** Run a command to completion (foreground) inside the sandbox and return its buffered result. */\n exec(argv: string[], opts?: { timeoutSeconds?: number }): Promise<ExecResult>;\n /** Land raw bytes at an absolute path inside the sandbox (made executable via `opts.mode`). */\n putFile(path: string, data: Uint8Array, opts?: { mode?: string }): Promise<void>;\n}\n\n/** What {@link ensureDaemon} needs: the daemon knobs plus the reconcile inputs. */\nexport interface EnsureDaemonConfig {\n /** Port the in-sandbox daemon binds (on `0.0.0.0`, so a published port can route in). */\n port: number;\n /** `AGENT_TYPE` for the in-sandbox daemon. */\n agent: string;\n /** `AGENT_CWD` — working directory agents run in, inside the sandbox. */\n agentCwd: string;\n /**\n * Explicit path to a `mindwired` to deploy (else downloaded from the matching GitHub Release).\n * `{os}` and `{arch}` expand to the destination (`linux`/`darwin` and `amd64`/`arm64`), allowing a\n * development launcher to build artifacts without guessing the sandbox platform in advance.\n */\n daemonBin?: string;\n /** Upgrade an older service when idle. Requires serviceUpdateVersion >= 1. Off by default. */\n autoUpdate?: boolean;\n /** Redeploy even when the reported version matches. Intended only for a locally built development daemon. */\n forceDeploy?: boolean;\n /** Version to reconcile against. Defaults to {@link SDK_VERSION} (the bundled binary's version). */\n desiredVersion?: string;\n /** Destination label carried on every {@link EnsureEvent} (e.g. `\"ssh\"`/`\"docker\"`/`\"oblien\"`). */\n target?: string;\n /** Receives a step {@link EnsureEvent} at each phase. A throwing callback can't abort provisioning. */\n onLog?: (e: EnsureEvent) => void;\n token?: string;\n}\n\n/**\n * A progress event emitted at each phase of the ensure cycle (and, one-shot, by the `local`/`remote`\n * targets). Surfaced to the caller through the client `logger` callback; the same steps `mw.ensure()`\n * awaits. Normal order: `connect` (runtime reachable) → `probe` (health checked) → either `skip`\n * (a healthy current daemon is kept) or `upload` → `launch` → `ready` (a daemon is deployed). `error`\n * is emitted if any phase throws.\n *\n * Two extra phases prefix the cycle when a container is provisioned first (e.g. `ssh({ docker })`):\n * `install` (Docker on the host detected — and, opt-in, installed/started) and `provision` (the\n * container created/started and its published port resolved). Those are emitted by the container layer\n * before it hands the in-container host to the ensure cycle, so the full order is\n * `connect → install → provision → probe → (skip | upload → launch → ready)`.\n */\nexport interface EnsureEvent {\n phase: \"connect\" | \"install\" | \"provision\" | \"pull\" | \"probe\" | \"download\" | \"upload\" | \"launch\" | \"ready\" | \"skip\" | \"error\";\n /** Destination label, e.g. `\"ssh\"` / `\"docker\"` / `\"oblien\"` / `\"local\"` / `\"remote\"`. */\n target: string;\n /** Human-readable one-line status. */\n message: string;\n /** The daemon's reported version, when known (on `probe` / `skip`). */\n version?: string;\n /** Target architecture the daemon was resolved for (on `upload`). */\n arch?: \"amd64\" | \"arm64\";\n /** Destination operating system (on `download` / `upload`). */\n platform?: \"linux\" | \"darwin\";\n /** Size of the uploaded daemon binary in bytes (on `upload`). */\n bytes?: number;\n /** Error message (on `error`). */\n error?: string;\n}\n\n/** Wrap `cfg.onLog` so a throwing callback can never abort provisioning (see Risk 8). */\nfunction makeEmit(cfg: EnsureDaemonConfig): (e: Omit<EnsureEvent, \"target\">) => void {\n const target = cfg.target ?? \"sandbox\";\n return (e) => {\n if (!cfg.onLog) return;\n try {\n cfg.onLog({ target, ...e });\n } catch {\n // A user logger must not be able to break the ensure cycle.\n }\n };\n}\n\n// Match the app's ~/.mindwire for the runtime user; images and SSH hosts may run without root.\nasync function daemonDirectory(host: SandboxHost): Promise<string> {\n const result = await host.exec([\"sh\", \"-lc\", 'printf \"<<MW_HOME>>%s<<MW_HOME>>\" \"$HOME\"'], { timeoutSeconds: 15 });\n const runtimeHome = result.stdout?.match(/<<MW_HOME>>([\\s\\S]*?)<<MW_HOME>>/)?.[1];\n if (!runtimeHome?.startsWith(\"/\") || runtimeHome.length > 4096 || /[\\x00-\\x1f\\x7f]/.test(runtimeHome)) {\n throw new MindwireError(\"mindwire: cannot resolve the runtime user's home directory\");\n }\n return runtimeHome.replace(/\\/+$/, \"\") + \"/.mindwire\";\n}\n\n/**\n * Make sure a healthy `mindwired` of the desired version is reachable at `127.0.0.1:<port>` inside the\n * sandbox, deploying it if absent (or redeploying if stale and `autoUpdate` is set). `forceDeploy`\n * deliberately replaces even a version match for local source development. Otherwise a healthy,\n * current daemon (e.g. an image that autostarts it, or a reused sandbox) is a no-op.\n */\nexport async function ensureDaemon(host: SandboxHost, cfg: EnsureDaemonConfig): Promise<string> {\n const emit = makeEmit(cfg);\n let token = cfg.token ?? (await import(\"node:crypto\")).randomBytes(32).toString(\"hex\");\n try {\n await waitHostReady(host);\n emit({ phase: \"connect\", message: \"runtime ready\" });\n const directory = await daemonDirectory(host);\n if (!cfg.token) {\n // Reconnecting a second client must reuse the workspace credential rather than replacing\n // the daemon with a new random token. This read uses the owner's SSH/runtime connection.\n token = (await readWorkspaceToken(host, directory)) ?? token;\n }\n\n const desired = cfg.desiredVersion ?? SDK_VERSION;\n const health = await probeHealth(host, cfg.port, token);\n if (health.reachable) {\n emit({\n phase: \"probe\",\n message: health.version ? `daemon reachable (v${health.version})` : \"daemon reachable (version unknown)\",\n version: health.version,\n });\n const upToDate = versionAtLeast(health.version, desired);\n // Keep a healthy daemon that's current, or one whose version we can't/shouldn't force-replace.\n // Only a stale-or-unknown version *with* autoUpdate, or an explicit development forceDeploy,\n // triggers a redeploy.\n if (!cfg.forceDeploy && (upToDate || !cfg.autoUpdate)) {\n emit({\n phase: \"skip\",\n message: upToDate ? `daemon already at v${health.version}` : \"keeping the running daemon\",\n version: health.version,\n });\n return token;\n }\n if ((health.serviceUpdateVersion ?? 0) < 1) {\n if (cfg.forceDeploy) throw new MindwireError(\"This legacy service cannot reserve an idle update. Upgrade it explicitly or stop it after its work finishes before deploying.\");\n emit({ phase: \"skip\", message: \"automatic update deferred: upgrade this legacy service explicitly to enable idle updates\", version: health.version });\n return token;\n }\n } else {\n emit({ phase: \"probe\", message: \"no daemon reachable; deploying\" });\n }\n\n await deploy(host, cfg, emit, token, directory, health.reachable);\n // A concurrent installer may have won the workspace lock and chosen its credential first.\n if (!cfg.token) token = (await readWorkspaceToken(host, directory)) ?? token;\n return token;\n } catch (err) {\n emit({ phase: \"error\", message: \"ensure failed\", error: err instanceof Error ? err.message : String(err) });\n throw err;\n }\n}\n\nasync function readWorkspaceToken(host: SandboxHost, directory: string): Promise<string | undefined> {\n const saved = await host.exec([\"sh\", \"-lc\", `cat ${shellQuote(directory + \"/daemon.token\")} 2>/dev/null || true`], { timeoutSeconds: 15 });\n const candidate = saved.stdout?.trim();\n return candidate && candidate.length <= 4096 && /^[\\x21-\\x7e]+$/.test(candidate) ? candidate : undefined;\n}\n\n/** Resolve the destination's daemon, then launch it detached and health-poll from inside the VM. */\nasync function deploy(\n host: SandboxHost,\n cfg: EnsureDaemonConfig,\n emit: (e: Omit<EnsureEvent, \"target\">) => void,\n token: string,\n directory: string,\n requireLease: boolean,\n): Promise<void> {\n const newPath = directory + \"/mindwired.new\";\n const BIN = shellQuote(directory + \"/mindwired\"), BIN_NEW = shellQuote(newPath);\n const STATE = shellQuote(directory + \"/agent-state.json\"), LOG = shellQuote(directory + \"/daemon.log\");\n const TOKEN = shellQuote(directory + \"/daemon.token\");\n const { platform, arch } = await probePlatform(host);\n const desired = cfg.desiredVersion ?? SDK_VERSION;\n let acquire = \"\";\n let stagedUpload: string | undefined;\n if (cfg.daemonBin) {\n const binPath = await resolveHostDaemon(cfg.daemonBin, platform, arch);\n const bytes = await readBytes(binPath);\n emit({ phase: \"upload\", message: `uploading daemon (${platform}-${arch}, ${formatMiB(bytes.length)})`, platform, arch, bytes: bytes.length });\n // An explicit local binary is the one intentional upload path (air-gapped destinations).\n stagedUpload = `${newPath}-${(await import(\"node:crypto\")).randomUUID()}`;\n await host.exec([\"sh\", \"-lc\", `mkdir -p ${shellQuote(directory)}`], { timeoutSeconds: 15 });\n await host.putFile(stagedUpload, bytes, { mode: \"0755\" });\n acquire = `mv -f ${shellQuote(stagedUpload)} ${BIN_NEW}`;\n } else {\n if (!/^[0-9]+\\.[0-9]+\\.[0-9]+(?:-[0-9A-Za-z.-]+)?$/.test(desired)) {\n throw new MindwireError(`mindwire: cannot download daemon for non-release SDK version ${desired}`);\n }\n const asset = `mindwired-v${desired}-${platform}-${arch}`;\n const release = `https://github.com/oblien/mindwire/releases/download/v${desired}`;\n emit({ phase: \"download\", message: `downloading daemon v${desired} on the destination (${platform}-${arch})`, platform, arch });\n // Download and verify *inside* the destination. This avoids an SDK-host upload and works for every\n // remote target that can execute commands. BIN_NEW is only renamed into place after verification.\n acquire = [\n `release=${shellQuote(release)}`,\n `asset=${shellQuote(asset)}`,\n 'if command -v sha256sum >/dev/null 2>&1; then mw_sha256=(sha256sum);',\n 'elif command -v shasum >/dev/null 2>&1; then mw_sha256=(shasum -a 256);',\n 'else echo \"MINDWIRE_FAIL SHA-256 verification requires sha256sum or shasum\"; exit 1; fi',\n \"download() {\",\n ' expected=$(curl -fsSL \"$release/checksums.txt\" | awk -v asset=\"$asset\" \\'$2 == asset { print $1; exit }\\') || return 1',\n ' [ -n \"$expected\" ] || return 1',\n ` curl -fsSL \"$release/$asset\" -o ${BIN_NEW} || return 1`,\n ` actual=$(\"\\${mw_sha256[@]}\" ${BIN_NEW} | awk '{print $1}') || return 1`,\n ' [ \"$actual\" = \"$expected\" ] || return 2',\n \"}\",\n \"if download; then :; else\",\n ' status=$?; [ \"$status\" -ne 2 ] || { echo \"MINDWIRE_FAIL checksum mismatch for $asset\"; exit 1; }',\n ' latest=$(curl -fsSL https://api.github.com/repos/oblien/mindwire/releases/latest | sed -n \\'s/.*\"tag_name\"[[:space:]]*:[[:space:]]*\"\\\\([^\"]*\\\\)\".*/\\\\1/p\\')',\n ' case \"$latest\" in v[0-9]*.[0-9]*.[0-9]*) ;; *) echo \"MINDWIRE_FAIL no matching or latest release\"; exit 1 ;; esac',\n ' release=\"https://github.com/oblien/mindwire/releases/download/$latest\"',\n ' mw_expected_version=\"${latest#v}\"',\n ` asset=\"mindwired-$latest-${platform}-${arch}\"`,\n ' download || { echo \"MINDWIRE_FAIL latest release download failed\"; exit 1; }',\n \"fi\",\n `chmod +x ${BIN_NEW}`,\n ].join(\"\\n\");\n }\n\n const script = [\n \"set -eo pipefail\",\n `mkdir -p ${shellQuote(directory)}`,\n // iOS takes this same workspace lock. Unique staging also protects concurrent local uploads.\n stagedUpload ? `trap ${shellQuote(`rm -f ${shellQuote(stagedUpload)}`)} EXIT` : \"\",\n `exec 9>${shellQuote(directory + \"/daemon-install.lock\")}`,\n 'if command -v flock >/dev/null 2>&1; then',\n ' flock -w 360 9 || { echo \"MINDWIRE_FAIL another daemon update is still running\"; exit 1; }',\n 'elif command -v lockf >/dev/null 2>&1; then',\n ' lockf -s -t 360 9 || { echo \"MINDWIRE_FAIL another daemon update is still running\"; exit 1; }',\n 'else echo \"MINDWIRE_FAIL No supported update lock is available (flock on Linux, lockf on macOS).\"; exit 1; fi',\n `mw_token=${shellQuote(token)}`,\n !cfg.token ? `if [ -s ${TOKEN} ]; then mw_token=$(cat ${TOKEN}); fi` : \"\",\n 'mw_lease=\"\"',\n `mw_lease_file=${shellQuote(directory)}/update-lease-$$.json`,\n 'cleanup_update() {',\n ` if [ -n \"$mw_lease\" ]; then curl -s --connect-timeout 2 --max-time 3 -X DELETE -H \"Authorization: Bearer $mw_token\" \"http://127.0.0.1:${cfg.port}/service/update/$mw_lease\" >/dev/null 2>&1 || true; fi`,\n ` rm -f ${BIN_NEW} \"$mw_lease_file\"${stagedUpload ? \" \" + shellQuote(stagedUpload) : \"\"}`,\n '}',\n // Shared staging is only removed while this process owns the workspace lock.\n 'trap cleanup_update EXIT',\n versionCheckScript,\n `mw_desired=${shellQuote(desired)}`,\n 'mw_expected_version=\"$mw_desired\"',\n `mw_health=$(curl -fsS --max-time 3 -H \"Authorization: Bearer $mw_token\" http://127.0.0.1:${cfg.port}/healthz 2>/dev/null || true)`,\n !cfg.forceDeploy ? [\n `mw_version=$(printf '%s' \"$mw_health\" | sed -n 's/.*\"version\"[[:space:]]*:[[:space:]]*\"\\\\([^\" ]*\\\\)\".*/\\\\1/p')`,\n `if [ -n \"$mw_health\" ] && ${cfg.autoUpdate ? 'version_at_least \"$mw_version\" \"$mw_desired\"' : \"true\"}; then echo MINDWIRE_READY; exit 0; fi`,\n ].join(\"\\n\") : \"\",\n // macOS ships POSIX setsid in Perl, but does not include Linux's setsid executable.\n 'if command -v setsid >/dev/null 2>&1; then mw_detach=(setsid);',\n `elif command -v perl >/dev/null 2>&1; then mw_detach=(perl -MPOSIX -e 'defined(my $sid = POSIX::setsid()) && $sid >= 0 or die \"setsid: $!\"; exec @ARGV; die \"exec: $!\";');`,\n 'else echo \"MINDWIRE_FAIL Cannot start the Mindwire service: setsid or Perl is required.\"; exit 1; fi',\n acquire,\n // The service decides idleness after transfer. Never stop arbitrary processes\n // or interrupt a chat that began while the SDK was downloading its binary.\n `mw_health=$(curl -fsS --max-time 3 -H \"Authorization: Bearer $mw_token\" http://127.0.0.1:${cfg.port}/healthz 2>/dev/null || true)`,\n 'if [ -n \"$mw_health\" ]; then',\n ` mw_status=$(curl -s --connect-timeout 2 --max-time 5 -X POST -H \"Authorization: Bearer $mw_token\" -o \"$mw_lease_file\" -w '%{http_code}' http://127.0.0.1:${cfg.port}/service/update) || mw_status=000`,\n ' case \"$mw_status\" in',\n ' 201)',\n ` mw_lease=$(sed -n 's/.*\"id\"[[:space:]]*:[[:space:]]*\"\\\\([[:alnum:]]*\\\\)\".*/\\\\1/p' \"$mw_lease_file\")`,\n ` mw_service_pid=$(sed -n 's/.*\"pid\"[[:space:]]*:[[:space:]]*\\\\([0-9][0-9]*\\\\).*/\\\\1/p' \"$mw_lease_file\")`,\n ' [ -n \"$mw_lease\" ] && [[ \"$mw_service_pid\" =~ ^[0-9]+$ ]] && [ \"$mw_service_pid\" -gt 1 ] || { echo \"MINDWIRE_FAIL invalid service update lease\"; exit 1; }',\n ' kill \"$mw_service_pid\" ;;',\n ' 409) echo MINDWIRE_UPDATE_DEFERRED; exit 0 ;;',\n ' 404) echo \"MINDWIRE_FAIL this legacy service requires an explicit upgrade before idle updates\"; exit 1 ;;',\n ' *) echo \"MINDWIRE_FAIL could not reserve an idle service update\"; exit 1 ;;',\n ' esac',\n requireLease ? 'else echo \"MINDWIRE_FAIL the service went offline before its idle update could be reserved\"; exit 1' : '',\n 'fi',\n \"sleep 0.3\",\n `mv -f ${BIN_NEW} ${BIN}`,\n `chmod +x ${BIN}`,\n // Detach so the daemon survives this exec's shell exiting. ADDR=\":<port>\" binds 0.0.0.0.\n // Ignore HUP directly: macOS nohup can fail after setsid in a headless workspace.\n `\"\\${mw_detach[@]}\" /bin/sh -c 'trap \"\" HUP; exec \"$@\"' mindwire-service env ADDR=\":${cfg.port}\" AGENT_TYPE=${shellQuote(cfg.agent)} AGENT_CWD=${shellQuote(cfg.agentCwd)} ` +\n `STATE_PATH=${STATE} DAEMON_TOKEN=\"$mw_token\" ${BIN} > ${LOG} 2>&1 < /dev/null 9>&- &`,\n // Health-poll from inside the VM (loopback) and emit a marker — exit codes are unreliable here.\n 'mw_pid=$!; mw_exit=\"\"; mw_deadline=$((SECONDS + 30))',\n 'while (( SECONDS < mw_deadline )); do',\n ` mw_health=$(curl -fsS --connect-timeout 2 --max-time 3 -H \"Authorization: Bearer $mw_token\" http://127.0.0.1:${cfg.port}/healthz 2>/dev/null || true)`,\n ` mw_version=$(printf '%s' \"$mw_health\" | sed -n 's/.*\"version\"[[:space:]]*:[[:space:]]*\"\\\\([^\" ]*\\\\)\".*/\\\\1/p')`,\n ' if version_at_least \"$mw_version\" \"$mw_expected_version\"; then echo MINDWIRE_READY; exit 0; fi',\n ' if [ -z \"$mw_exit\" ] && ! kill -0 \"$mw_pid\" 2>/dev/null; then',\n ' mw_exit=0; wait \"$mw_pid\" || mw_exit=$?; [ \"$mw_exit\" = 0 ] || break',\n ' fi',\n ' sleep 0.25',\n 'done',\n `mw_tail=$(tail -n 40 ${LOG} 2>/dev/null || true)`,\n 'if [ -n \"$mw_exit\" ] && [ \"$mw_exit\" != 0 ]; then mw_reason=\"Mindwire exited during startup (status $mw_exit).\";',\n 'else mw_reason=\"The Mindwire service did not become ready at v$mw_expected_version (reported: $mw_version).\"; fi',\n '[ -z \"$mw_tail\" ] || mw_reason=\"$mw_reason $mw_tail\"',\n 'printf \"MINDWIRE_FAIL %s\\\\n\" \"$mw_reason\"',\n ].join(\"\\n\");\n\n emit({ phase: \"launch\", message: \"launching daemon\" });\n const res = await host.exec([\"bash\", \"-lc\", script], { timeoutSeconds: 420 });\n const out = res.stdout ?? \"\";\n if (out.includes(\"MINDWIRE_UPDATE_DEFERRED\")) {\n if (cfg.forceDeploy) throw new MindwireError(\"The workspace is busy. Wait for its operations to finish before deploying the service.\");\n emit({ phase: \"skip\", message: \"service update deferred while workspace operations are running\" });\n return;\n }\n if (!out.includes(\"MINDWIRE_READY\")) {\n throw new MindwireError(\n \"mindwire: the in-sandbox daemon did not become healthy after deploy.\\n\" +\n (out || res.stderr || res.error || \"(no output)\").trim(),\n );\n }\n emit({ phase: \"ready\", message: \"daemon deployed and healthy\" });\n}\n\n/** Probe `127.0.0.1:<port>/healthz` from inside the sandbox. Returns reachability + reported version. */\nasync function probeHealth(host: SandboxHost, port: number, token: string): Promise<{ reachable: boolean; version?: string; serviceUpdateVersion?: number }> {\n const script =\n `out=$(curl -fsS --max-time 3 -H ${shellQuote(`Authorization: Bearer ${token}`)} http://127.0.0.1:${port}/healthz 2>/dev/null) ` +\n `&& printf '<<MW_H>>%s<<MW_H>>' \"$out\" || printf '<<MW_H>><<MW_H>>'`;\n const res = await host.exec([\"bash\", \"-lc\", script], { timeoutSeconds: 15 });\n const body = ((res.stdout ?? \"\").match(/<<MW_H>>([\\s\\S]*?)<<MW_H>>/)?.[1] ?? \"\").trim();\n if (!body) return { reachable: false };\n try {\n const j = JSON.parse(body) as { version?: unknown; serviceUpdateVersion?: unknown };\n return { reachable: true, version: typeof j.version === \"string\" ? j.version : undefined,\n serviceUpdateVersion: typeof j.serviceUpdateVersion === \"number\" ? j.serviceUpdateVersion : undefined };\n } catch {\n // Something answered but it isn't our JSON — treat as reachable/unknown so we don't clobber it.\n return { reachable: true };\n }\n}\n\nasync function probePlatform(host: SandboxHost): Promise<{ platform: \"linux\" | \"darwin\"; arch: \"amd64\" | \"arm64\" }> {\n const res = await host.exec([\"bash\", \"-lc\", `printf '<<OS:%s>><<ARCH:%s>>' \"$(uname -s)\" \"$(uname -m)\"`], { timeoutSeconds: 15 });\n const os = ((res.stdout ?? \"\").match(/<<OS:([^>]*)>>/)?.[1] ?? \"\").trim().toLowerCase();\n const rawArch = ((res.stdout ?? \"\").match(/<<ARCH:([^>]*)>>/)?.[1] ?? \"\").trim();\n const arch = rawArch === \"aarch64\" || rawArch === \"arm64\" ? \"arm64\"\n : rawArch === \"x86_64\" || rawArch === \"amd64\" ? \"amd64\" : undefined;\n if ((os !== \"linux\" && os !== \"darwin\") || !arch) {\n throw new MindwireError(`mindwire: unsupported workspace platform ${os || \"unknown\"}/${rawArch || \"unknown\"}; expected Linux or macOS on amd64 or arm64`);\n }\n return { platform: os, arch };\n}\n\n/** Wait until the sandbox can execute commands (covers VM/container cold-start). */\nasync function waitHostReady(host: SandboxHost, timeoutMs = 60000): Promise<void> {\n const deadline = Date.now() + timeoutMs;\n let lastErr: unknown = null;\n while (Date.now() < deadline) {\n try {\n const r = await host.exec([\"bash\", \"-lc\", \"echo mw_ready\"], { timeoutSeconds: 10 });\n if ((r.stdout ?? \"\").includes(\"mw_ready\")) return;\n } catch (e) {\n lastErr = e;\n }\n await sleep(1000);\n }\n throw new MindwireError(\n \"mindwire: the sandbox runtime did not become ready in time.\",\n lastErr ? { cause: lastErr } : undefined,\n );\n}\n\n/**\n * Resolve a Linux `mindwired` on the host running the SDK: an explicit `daemonBin`, else download the\n * SDK-matched release binary, verify its checksum, and return its local cache path for upload.\n */\nexport async function resolveLinuxDaemon(\n explicit: string | undefined,\n arch: \"amd64\" | \"arm64\",\n): Promise<string> {\n return resolveHostDaemon(explicit, \"linux\", arch);\n}\n\nasync function resolveHostDaemon(\n explicit: string | undefined,\n platform: \"linux\" | \"darwin\",\n arch: \"amd64\" | \"arm64\",\n): Promise<string> {\n const fs = await import(\"node:fs\");\n if (explicit) {\n const resolved = explicit.replaceAll(\"{os}\", platform).replaceAll(\"{arch}\", arch);\n if (!fs.existsSync(resolved)) {\n throw new MindwireError(`mindwire: sandbox daemonBin not found at ${resolved}`);\n }\n return resolved;\n }\n return ensureDaemonBinary({ platform, arch: arch === \"arm64\" ? \"arm64\" : \"x64\" });\n}\n\nasync function readBytes(p: string): Promise<Uint8Array> {\n const fs = await import(\"node:fs/promises\");\n return fs.readFile(p);\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((r) => setTimeout(r, ms));\n}\n\nfunction shellQuote(value: string): string {\n return `'${value.replace(/'/g, \"'\\\\''\")}'`;\n}\n\nfunction formatMiB(bytes: number): string {\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n","// A backend-agnostic container layer. Given any {@link SandboxHost} — a shell on *some* machine, over\n// SSH, a local socket, whatever — this ensures Docker is present on that machine, spins (or attaches\n// to) a container, and runs `mindwired` **inside** it via the shared {@link ensureDaemon} cycle. The\n// isolation model becomes \"one container = one daemon = one environment\".\n//\n// It touches Docker only through the two `SandboxHost` primitives (`exec` + `putFile`): every Docker\n// operation is a `docker …` command line, and files land via `putFile` to a host temp path + `docker\n// cp`. So there is **no** new dependency — no `dockerode`, no engine socket forwarding — and the exact\n// same layer composes over any exec-capable backend. `ssh({ docker })` is its first consumer.\n//\n// Installing Docker is a privileged, mutating action, so it never happens implicitly: the default\n// `install: \"never\"` detects Docker and fails with a clear message; `install: \"ifMissing\"` opts in to\n// running the official `get.docker.com` script and enabling the service.\nimport { MindwireError } from \"../errors.js\";\nimport { ensureDaemon, type SandboxHost, type ExecResult, type EnsureEvent } from \"./host.js\";\n\n/** What {@link provisionContainer} needs to bring up a daemon-in-a-container over a base host. */\nexport interface ContainerConfig {\n /** Create + own a container from this image. */\n image?: string;\n /** Attach to an existing container (id or name) instead of creating one. */\n container?: string;\n /** Name for a container we create. */\n name?: string;\n /** Docker-on-host policy. `\"never\"` (default) detects and fails; `\"ifMissing\"` installs + starts it. */\n install?: \"never\" | \"ifMissing\";\n /** Extra args spliced into `docker run` (before the image), e.g. `[\"-e\", \"FOO=bar\", \"--gpus\", \"all\"]`. */\n createArgs?: string[];\n /** Port the in-container daemon binds (published to an ephemeral loopback host port). */\n daemonPort: number;\n /** `AGENT_TYPE` for the in-container daemon. */\n agent: string;\n /** `AGENT_CWD` — working directory agents run in, inside the container. */\n agentCwd: string;\n /** Explicit path to a Linux `mindwired` to deploy (else resolved from the platform package). */\n daemonBin?: string;\n /** Redeploy when the running daemon's version differs from the SDK's bundled binary. */\n autoUpdate?: boolean;\n /** On `stop()`, `docker rm -f` a container we created (attached containers are left running). */\n stopOnExit?: boolean;\n /** Destination label carried on every {@link EnsureEvent}. Defaults to `\"container\"`. */\n target?: string;\n}\n\n/** What {@link provisionContainer} resolves: the container it ensured and how to reach + tear it down. */\nexport interface ContainerHandle {\n /** The full container id (created) or the id/name we attached to. */\n containerId: string;\n /** The ephemeral host port the in-container daemon is published to, on the base machine's loopback. */\n hostPort: number;\n /** Bearer token generated for the daemon in this container. */\n token: string;\n /** Tear down: `docker rm -f` the container if we created it and `stopOnExit` is set. Idempotent. */\n stop(): Promise<void>;\n}\n\n/**\n * Ensure Docker on the base host, bring up a container, and deploy `mindwired` inside it. Decoupled and\n * injectable (like `provisionSsh`/`provisionDocker`): tests drive it with a fake {@link SandboxHost}.\n * The `install`/`provision` phases stream through `onLog`; the daemon cycle then streams its own phases.\n */\nexport async function provisionContainer(\n host: SandboxHost,\n cfg: ContainerConfig,\n onLog?: (e: EnsureEvent) => void,\n): Promise<ContainerHandle> {\n const target = cfg.target ?? \"container\";\n // Wrap onLog so a throwing user callback can never abort provisioning (mirrors host.ts makeEmit).\n const emit = (e: Omit<EnsureEvent, \"target\">): void => {\n if (!onLog) return;\n try {\n onLog({ target, ...e });\n } catch {\n // best-effort\n }\n };\n\n // 1. Docker on the base host (detect; install/start only when opted in).\n await ensureDockerReady(host, cfg.install ?? \"never\", emit);\n\n // 2. The container (create or attach) + its published host port.\n const { containerId, hostPort, created } = await runContainer(host, cfg, emit);\n\n // 3. The daemon *inside* the container — the shared cycle, unchanged, over a ContainerHost.\n const token = await ensureDaemon(new ContainerHost(host, containerId), {\n port: cfg.daemonPort,\n agent: cfg.agent,\n agentCwd: cfg.agentCwd,\n daemonBin: cfg.daemonBin,\n autoUpdate: cfg.autoUpdate,\n target,\n onLog,\n });\n\n let stopped = false;\n const stop = async (): Promise<void> => {\n if (stopped) return;\n stopped = true;\n if (!created || !(cfg.stopOnExit ?? true)) return; // attached container ⇒ leave it running\n try {\n await host.exec([\"docker\", \"rm\", \"-f\", containerId]);\n } catch {\n // best-effort teardown\n }\n };\n\n return { containerId, hostPort, token, stop };\n}\n\n// ---- SandboxHost over a container, via a base host -------------------------\n\n/**\n * Wraps a base {@link SandboxHost} so every command runs *inside* a container and every file lands\n * inside it — nothing more than `docker exec` / `docker cp` layered on the base's own `exec`/`putFile`.\n * This is the crux of the reuse: the shared {@link ensureDaemon} cycle sees an ordinary `SandboxHost`\n * and never learns there's a container (or an SSH hop) underneath.\n */\nexport class ContainerHost implements SandboxHost {\n constructor(\n private readonly base: SandboxHost,\n private readonly containerId: string,\n ) {}\n\n exec(argv: string[], opts?: { timeoutSeconds?: number }): Promise<ExecResult> {\n // Pass a real argv to the base and let *it* do the single quoting — never pre-join (Risk 3).\n return this.base.exec([\"docker\", \"exec\", \"--env\", \"MINDWIRE_ISOLATION=container\", this.containerId, ...argv], opts);\n }\n\n async putFile(path: string, data: Uint8Array, opts?: { mode?: string }): Promise<void> {\n const slash = path.lastIndexOf(\"/\");\n const dir = slash > 0 ? path.slice(0, slash) : \"/\";\n const base = path.slice(slash + 1);\n const mode = opts?.mode ?? \"0644\";\n // A staging path on the *base* machine's filesystem, scoped by container id to avoid collisions.\n const tmp = `/tmp/.mw-${this.containerId.slice(0, 12)}-${base}`;\n\n await this.base.exec([\"docker\", \"exec\", this.containerId, \"mkdir\", \"-p\", dir]); // docker cp needs the dir (Risk 1)\n await this.base.putFile(tmp, data, opts); // the base host's own upload (e.g. SFTP over SSH)\n await this.base.exec([\"docker\", \"cp\", tmp, `${this.containerId}:${path}`]);\n await this.base.exec([\"docker\", \"exec\", this.containerId, \"chmod\", mode, path]);\n await this.base.exec([\"rm\", \"-f\", tmp]);\n }\n}\n\n// ---- Docker on the base host -----------------------------------------------\n\ntype DockerStatus = \"running\" | \"stopped\" | \"denied\" | \"absent\";\n\n/** Detect Docker on the base host and, per policy, install/start it. Emits `install` phase events. */\nasync function ensureDockerReady(\n host: SandboxHost,\n install: \"never\" | \"ifMissing\",\n emit: (e: Omit<EnsureEvent, \"target\">) => void,\n): Promise<void> {\n let state = await detectDocker(host);\n\n if (state.status === \"running\") {\n emit({ phase: \"install\", message: `docker present (v${state.version ?? \"?\"})`, version: state.version });\n return;\n }\n\n if (state.status === \"denied\") {\n throw new MindwireError(\n \"mindwire: connected to the host, but this user can't reach the Docker daemon socket \" +\n \"(permission denied). Connect as root, or add the SSH user to the `docker` group.\",\n );\n }\n\n if (state.status === \"stopped\") {\n emit({ phase: \"install\", message: \"docker installed but not running; starting it\" });\n await startDocker(host);\n state = await detectDocker(host);\n if (state.status === \"running\") {\n emit({ phase: \"install\", message: `docker started (v${state.version ?? \"?\"})`, version: state.version });\n return;\n }\n throw new MindwireError(\"mindwire: Docker is installed on the host but could not be started.\");\n }\n\n // absent\n if (install !== \"ifMissing\") {\n throw new MindwireError(\n \"mindwire: Docker is not installed on the remote host, and mindwire won't install system \" +\n 'packages unless you opt in. Pass docker: { install: \"ifMissing\" } to have it run the ' +\n \"official get.docker.com script (`curl -fsSL https://get.docker.com | sh`) and enable the \" +\n \"service — or install Docker on the host yourself.\",\n );\n }\n\n emit({ phase: \"install\", message: \"docker not found; installing via get.docker.com\" });\n await installDocker(host);\n await startDocker(host);\n state = await detectDocker(host);\n if (state.status !== \"running\") {\n throw new MindwireError(\n \"mindwire: ran the get.docker.com install script, but the Docker daemon did not come up.\",\n );\n }\n emit({ phase: \"install\", message: `docker installed and started (v${state.version ?? \"?\"})`, version: state.version });\n}\n\n/** Distinguish running / stopped / permission-denied / absent, and read the server version. */\nasync function detectDocker(host: SandboxHost): Promise<{ status: DockerStatus; version?: string }> {\n const script = [\n 'if ! command -v docker >/dev/null 2>&1; then echo \"MW_DOCKER=absent\"; exit 0; fi',\n 'if v=$(docker info --format \"{{.ServerVersion}}\" 2>/dev/null); then echo \"MW_DOCKER=running:$v\"; exit 0; fi',\n \"err=$(docker info 2>&1 >/dev/null || true)\",\n 'case \"$err\" in',\n ' *ermission*denied*) echo \"MW_DOCKER=denied\" ;;',\n ' *) echo \"MW_DOCKER=stopped\" ;;',\n \"esac\",\n ].join(\"\\n\");\n const res = await host.exec([\"bash\", \"-lc\", script], { timeoutSeconds: 30 });\n const m = (res.stdout ?? \"\").match(/MW_DOCKER=([a-z]+)(?::([^\\n]*))?/);\n const status = (m?.[1] as DockerStatus) ?? \"absent\";\n const version = m?.[2]?.trim() || undefined;\n return { status, version };\n}\n\n/** Run the official Docker install script. Only ever reached on explicit `install: \"ifMissing\"`. */\nasync function installDocker(host: SandboxHost): Promise<void> {\n const res = await host.exec([\"bash\", \"-lc\", \"curl -fsSL https://get.docker.com | sh\"], {\n timeoutSeconds: 600,\n });\n if ((res.exitCode ?? 0) !== 0) {\n throw new MindwireError(\n \"mindwire: the Docker install script (get.docker.com) failed.\\n\" +\n (res.stderr || res.stdout || \"(no output)\").trim(),\n );\n }\n}\n\n/** Enable + start the Docker service (systemd, then SysV as a fallback). Best-effort; re-detected after. */\nasync function startDocker(host: SandboxHost): Promise<void> {\n await host.exec(\n [\"bash\", \"-lc\", \"systemctl enable --now docker 2>/dev/null || service docker start 2>/dev/null || true\"],\n { timeoutSeconds: 60 },\n );\n}\n\n// ---- the container ---------------------------------------------------------\n\n/** Create (from `image`) or attach to (`container`) a container, and resolve its published host port. */\nasync function runContainer(\n host: SandboxHost,\n cfg: ContainerConfig,\n emit: (e: Omit<EnsureEvent, \"target\">) => void,\n): Promise<{ containerId: string; hostPort: number; created: boolean }> {\n const port = cfg.daemonPort;\n\n if (cfg.container !== undefined) {\n // Attach: make sure it's running (idempotent), then resolve its published port.\n await host.exec([\"docker\", \"start\", cfg.container]);\n const hostPort = await resolveHostPort(host, cfg.container, port);\n emit({\n phase: \"provision\",\n message: `attached to container ${cfg.container}; daemon published on host port ${hostPort}`,\n });\n return { containerId: cfg.container, hostPort, created: false };\n }\n\n if (!cfg.image) {\n throw new MindwireError(\n \"mindwire: running the daemon in a container needs an image (docker.image) to create one, \" +\n \"or an existing container (docker.container) to attach to.\",\n );\n }\n\n // Publish to the base machine's LOOPBACK only (Risk 2) — the SSH forward reaches it; the box doesn't.\n const runArgs = [\"docker\", \"run\", \"-d\", \"--env\", \"MINDWIRE_ISOLATION=container\"];\n if (cfg.name) runArgs.push(\"--name\", cfg.name);\n runArgs.push(\"-p\", `127.0.0.1:0:${port}`);\n if (cfg.createArgs?.length) runArgs.push(...cfg.createArgs);\n runArgs.push(cfg.image, \"sleep\", \"infinity\");\n\n const res = await host.exec(runArgs, { timeoutSeconds: 120 });\n const containerId = (res.stdout ?? \"\").trim().split(/\\s+/).pop() ?? \"\";\n if (!containerId || (res.exitCode ?? 0) !== 0) {\n throw new MindwireError(\n \"mindwire: `docker run` did not start a container.\\n\" +\n (res.stderr || res.stdout || \"(no output)\").trim(),\n );\n }\n\n const hostPort = await resolveHostPort(host, containerId, port);\n emit({\n phase: \"provision\",\n message: `container ${containerId.slice(0, 12)} up; daemon published on host port ${hostPort}`,\n });\n return { containerId, hostPort, created: true };\n}\n\n/** Parse `docker port <cid> <port>/tcp` (e.g. `127.0.0.1:49153`) into the ephemeral host port. */\nasync function resolveHostPort(host: SandboxHost, containerId: string, port: number): Promise<number> {\n const res = await host.exec([\"docker\", \"port\", containerId, `${port}/tcp`]);\n const line = (res.stdout ?? \"\")\n .split(\"\\n\")\n .map((s) => s.trim())\n .find(Boolean);\n const hostPort = line ? Number.parseInt(line.match(/:(\\d+)\\s*$/)?.[1] ?? \"\", 10) : NaN;\n if (!Number.isFinite(hostPort) || hostPort <= 0) {\n throw new MindwireError(\n `mindwire: could not resolve the published host port for ${port}/tcp on container ` +\n `${containerId.slice(0, 12)}. ` +\n (cfgHint(res)) +\n `docker port output: ${JSON.stringify((res.stdout ?? \"\").trim())}`,\n );\n }\n return hostPort;\n}\n\n/** A hint for the common \"attached to a container that doesn't publish the daemon port\" mistake. */\nfunction cfgHint(res: ExecResult): string {\n return (res.stdout ?? \"\").trim() === \"\"\n ? \"Attach to a container started with that port published (e.g. `-p 127.0.0.1:0:<port>`). \"\n : \"\";\n}\n","// The Docker sandbox adapter. The mindwire daemon runs *inside a Docker container* — created from an\n// image, or attached to a container you already run (pass your own `dockerode` instance, e.g. one\n// pointed at a remote engine) — and the SDK reaches it over a plain published port on loopback. The\n// daemon binds `0.0.0.0`, Docker publishes it to an ephemeral host port, and the transport is just the\n// global `fetch` against `http://127.0.0.1:<hostPort>` — no proxy, no token.\n//\n// `dockerode` is an OPTIONAL peer dependency, lazily `import()`-ed only in `connect()` — so importing\n// mindwire (or calling `docker()`, which just stores config) never loads it. The bootstrap\n// (`SandboxHost.exec` via `container.exec`, `putFile` via an in-memory tar `putArchive`) hides behind\n// the same {@link SandboxHost} the Oblien adapter uses, so the shared {@link ensureDaemon} cycle runs\n// unchanged.\nimport { MindwireError } from \"../errors.js\";\nimport { ensureDaemon, type SandboxHost, type EnsureEvent } from \"./host.js\";\nimport { SDK_VERSION } from \"../version.js\";\nimport type { Target, TargetHandle, ConnectSpec } from \"./index.js\";\n\n/**\n * How to reach the Docker **engine**. Passed straight to `new Docker(engine)` (the `dockerode`\n * constructor) — a local socket or a TCP/TLS endpoint. Nested (not flattened) so its `port` (the\n * engine's TCP port) never collides with {@link DockerConfig.port} (the in-container daemon's port).\n * Omit it entirely for the ambient local engine.\n *\n * To reach a **remote host over SSH**, prefer `ssh({ docker })` — mindwire's exec-based container layer\n * that needs only SSH credentials (no engine socket forwarding, no extra deps) — rather than routing\n * `dockerode` over SSH here.\n */\nexport interface DockerEngineOptions {\n /** Remote engine host (TCP). */\n host?: string;\n /** Engine TCP port (e.g. 2375 / 2376). */\n port?: number;\n /** Local engine socket path (e.g. `/var/run/docker.sock`). */\n socketPath?: string;\n /** Transport to the engine. */\n protocol?: \"http\" | \"https\";\n /** TLS material for a `https` engine. */\n ca?: string | Buffer;\n /** TLS material for a `https` engine. */\n cert?: string | Buffer;\n /** TLS material for a `https` engine. */\n key?: string | Buffer;\n}\n\n/**\n * Config for the Docker target. Supply `image` to create+own a container, or `container` to attach to\n * an existing one (which must already publish `port`). Point at a remote engine with `engine` (or pass\n * your own `docker` instance). `agent` falls back to the client's default agent.\n */\nexport interface DockerConfig {\n /** A `dockerode` instance to use. Takes precedence over `engine`. Defaults to `new Docker(engine)`. */\n docker?: DockerodeLike;\n /** How to reach the Docker engine (remote host / socket / TLS). Ignored when `docker` is passed. */\n engine?: DockerEngineOptions;\n /** Create + own a container from this image. Defaults to the SDK-matched MindWire runtime image. */\n image?: string;\n /** Image acquisition policy for a container MindWire creates. Defaults to pulling only when absent. */\n pull?: \"missing\" | \"always\" | \"never\";\n /** Attach to an existing container (id or name) instead of creating one. */\n container?: string;\n /** Extra options merged into `createContainer` (native dockerode/Docker API fields). */\n createOptions?: Record<string, unknown>;\n /** Port the in-container daemon binds (published to an ephemeral host port). */\n port?: number;\n /** `AGENT_TYPE` for the in-container daemon. Defaults to the client's agent, then `claude-code`. */\n agent?: string;\n /** `AGENT_CWD` — working directory agents run in, inside the container. */\n agentCwd?: string;\n /** Explicit path to a Linux `mindwired` to deploy (else resolved from the platform package). */\n daemonBin?: string;\n /** Upgrade an older daemon when idle; requires its service update capability. */\n autoUpdate?: boolean;\n /** On `close()`, stop + remove a container we created (attached containers are left running). */\n stopOnExit?: boolean;\n}\n\n/**\n * The Docker target. Returns a {@link Target} whose `connect()` creates (or attaches to) a container,\n * ensures `mindwired` runs inside it, and points the SDK at the published port.\n *\n * ```ts\n * new Mindwire({ agent: \"claude-code\", target: docker({ image: \"my/agent-image\" }) });\n * new Mindwire({ agent: \"claude-code\", target: docker({ container: \"my-running-box\" }) });\n * new Mindwire({ agent: \"claude-code\", target: docker({ image: \"x\", engine: { host: \"10.0.0.5\", port: 2375 } }) });\n * ```\n */\nexport function docker(config: DockerConfig = {}): Target {\n return { name: \"docker\", connect: (spec) => connectDocker(config, spec) };\n}\n\nconst DEFAULT_PORT = 8790;\nconst DEFAULT_AGENT = \"claude-code\";\nconst DEFAULT_AGENT_CWD = \"/root\";\nconst DEFAULT_RUNTIME_IMAGE = `ghcr.io/oblien/mindwire-runtime:${SDK_VERSION}`;\n\n// ---- minimal structural view of the `dockerode` package --------------------\n// Declared locally so the SDK typechecks and builds WITHOUT `dockerode` installed (optional peer).\n\ninterface DuplexLike {\n on(event: string, listener: (...args: unknown[]) => void): DuplexLike;\n}\n\ninterface ExecLike {\n start(opts: Record<string, unknown>): Promise<DuplexLike>;\n inspect(): Promise<{ ExitCode?: number; Running?: boolean }>;\n}\n\ninterface ContainerInspect {\n State?: { Running?: boolean };\n NetworkSettings?: { Ports?: Record<string, Array<{ HostIp?: string; HostPort?: string }> | null> };\n}\n\ninterface ContainerLike {\n readonly id: string;\n start(): Promise<unknown>;\n stop(): Promise<unknown>;\n remove(opts?: Record<string, unknown>): Promise<unknown>;\n inspect(): Promise<ContainerInspect>;\n exec(opts: Record<string, unknown>): Promise<ExecLike>;\n putArchive(file: Uint8Array, opts: { path: string }): Promise<unknown>;\n modem: { demuxStream(stream: DuplexLike, stdout: unknown, stderr: unknown): void };\n}\n\nexport interface DockerodeLike {\n getContainer(id: string): ContainerLike;\n getImage(name: string): { inspect(): Promise<unknown> };\n pull(name: string): Promise<DuplexLike>;\n createContainer(opts: Record<string, unknown>): Promise<ContainerLike>;\n}\n\ntype DockerodeCtor = new (opts?: unknown) => DockerodeLike;\n\n// ---- SandboxHost over a Docker container -----------------------------------\n\n/**\n * Bridges the backend-agnostic {@link SandboxHost} onto a Docker container: `exec` runs a command via\n * the exec API (demultiplexing the framed stdout/stderr stream), and `putFile` lands bytes via an\n * in-memory tar `putArchive`. The shared {@link ensureDaemon} cycle only ever sees these two.\n */\nclass DockerHost implements SandboxHost {\n constructor(private readonly container: ContainerLike) {}\n\n async exec(argv: string[]): Promise<{ exitCode?: number; stdout?: string; stderr?: string }> {\n const { Writable } = await import(\"node:stream\");\n const exec = await this.container.exec({ Cmd: argv, Env: [\"MINDWIRE_ISOLATION=container\"], AttachStdout: true, AttachStderr: true });\n const stream = await exec.start({ hijack: true, stdin: false });\n\n const out: Buffer[] = [];\n const err: Buffer[] = [];\n const sink = (arr: Buffer[]) =>\n new Writable({\n write(chunk: Buffer, _enc: unknown, cb: () => void) {\n arr.push(Buffer.from(chunk));\n cb();\n },\n });\n this.container.modem.demuxStream(stream, sink(out), sink(err));\n\n await new Promise<void>((resolve, reject) => {\n stream.on(\"end\", () => resolve());\n stream.on(\"close\", () => resolve());\n stream.on(\"error\", (e: unknown) => reject(e instanceof Error ? e : new Error(String(e))));\n });\n\n const info = await exec.inspect();\n return {\n exitCode: info.ExitCode,\n stdout: Buffer.concat(out).toString(\"utf8\"),\n stderr: Buffer.concat(err).toString(\"utf8\"),\n };\n }\n\n async putFile(path: string, data: Uint8Array, opts?: { mode?: string }): Promise<void> {\n const slash = path.lastIndexOf(\"/\");\n const dir = slash > 0 ? path.slice(0, slash) : \"/\";\n const base = path.slice(slash + 1);\n await this.exec([\"mkdir\", \"-p\", dir]); // putArchive extracts into an existing directory\n const tar = tarSingleFile(base, data, opts?.mode ?? \"0644\");\n await this.container.putArchive(tar, { path: dir });\n }\n}\n\n// ---- adapter entry points --------------------------------------------------\n\nasync function connectDocker(config: DockerConfig, spec: ConnectSpec): Promise<TargetHandle> {\n const Docker = await importDockerode();\n const instance = config.docker ?? new Docker(config.engine);\n // The in-container daemon's agent defaults to the client's default agent (config.agent wins).\n const merged: DockerConfig = { ...config, agent: config.agent ?? spec.agent };\n return provisionDocker(instance, merged, spec.onLog);\n}\n\n/**\n * The provisioning flow, decoupled from the `dockerode` import so it can be driven by an injected fake\n * in tests. Creates (or attaches to) a container, resolves its published host port, ensures the\n * daemon, and returns a handle pointed at `http://127.0.0.1:<hostPort>`.\n */\nexport async function provisionDocker(\n docker: DockerodeLike,\n config: DockerConfig = {},\n onLog?: (e: EnsureEvent) => void,\n): Promise<TargetHandle> {\n const port = config.port ?? DEFAULT_PORT;\n const agent = config.agent ?? DEFAULT_AGENT;\n const agentCwd = config.agentCwd ?? DEFAULT_AGENT_CWD;\n const created = config.container === undefined;\n\n // 1. Create or attach.\n let container: ContainerLike;\n if (config.container !== undefined) {\n container = docker.getContainer(config.container);\n } else {\n const image = config.image ?? DEFAULT_RUNTIME_IMAGE;\n await ensureImage(docker, image, config.pull ?? \"missing\", onLog);\n const portKey = `${port}/tcp`;\n container = await docker.createContainer({\n // The runtime image starts mindwired itself. Do not replace its command: doing so turns the\n // image ENTRYPOINT into `mindwired sleep infinity` and prevents the runtime from starting.\n Image: image,\n Env: [`ADDR=:${port}`, `AGENT_TYPE=${agent}`, `AGENT_CWD=${agentCwd}`, \"MINDWIRE_ISOLATION=container\"],\n Tty: false,\n ExposedPorts: { [portKey]: {} },\n HostConfig: { PortBindings: { [portKey]: [{ HostPort: \"0\" }] } },\n ...(config.createOptions ?? {}),\n });\n }\n\n // 2. Start (idempotent — tolerate an already-running container).\n await container.start().catch(() => {});\n\n // 3. Resolve the published ephemeral host port.\n const info = await container.inspect();\n const binding = info.NetworkSettings?.Ports?.[`${port}/tcp`];\n const hostPort = binding?.[0]?.HostPort;\n if (!hostPort) {\n throw new MindwireError(\n `mindwire: the Docker container does not publish a host port for ${port}/tcp. ` +\n (created\n ? \"This is unexpected for a container mindwire created.\"\n : \"Attach to a container started with that port published (e.g. `-p 0:\" + port + \"`).\"),\n );\n }\n\n // 4. Ensure the daemon inside the container.\n const token = await ensureDaemon(new DockerHost(container), {\n port,\n agent,\n agentCwd,\n daemonBin: config.daemonBin,\n autoUpdate: config.autoUpdate,\n target: \"docker\",\n onLog,\n });\n\n const stop = async (): Promise<void> => {\n if (!config.stopOnExit) return;\n if (!created) return; // attached container — leave it running\n try {\n await container.stop().catch(() => {});\n await container.remove({ force: true });\n } catch {\n // best-effort teardown\n }\n };\n\n // Plain direct HTTP — no proxy, no token; the client's default fetch is used.\n return { id: container.id, baseUrl: `http://127.0.0.1:${hostPort}`, token, stop };\n}\n\n/** Ensure a created-container image exists locally. Docker does not pull automatically on create. */\nasync function ensureImage(\n docker: DockerodeLike,\n image: string,\n policy: NonNullable<DockerConfig[\"pull\"]>,\n onLog?: (e: EnsureEvent) => void,\n): Promise<void> {\n const emit = (message: string, error?: string) => {\n try {\n onLog?.({ phase: \"pull\", target: \"docker\", message, ...(error ? { error } : {}) });\n } catch {\n // Provisioning logs must never affect the provisioning path.\n }\n };\n if (policy === \"never\") return;\n if (policy === \"missing\") {\n try {\n await docker.getImage(image).inspect();\n return;\n } catch {\n // Docker's 404 is expected here: pull before create rather than surfacing an opaque create error.\n }\n }\n emit(`pulling runtime image ${image}`);\n try {\n const stream = await docker.pull(image);\n await new Promise<void>((resolve, reject) => {\n stream.on(\"end\", () => resolve());\n stream.on(\"close\", () => resolve());\n stream.on(\"error\", (error: unknown) => reject(error));\n });\n emit(`runtime image ready: ${image}`);\n } catch (error) {\n const detail = error instanceof Error ? error.message : String(error);\n emit(`failed to pull runtime image ${image}`, detail);\n throw new MindwireError(`mindwire: failed to pull Docker image ${image}: ${detail}`, { cause: error });\n }\n}\n\n// ---- in-memory tar (single file) -------------------------------------------\n\n/** Build a minimal POSIX ustar archive holding one regular file, ready for `container.putArchive`. */\nfunction tarSingleFile(name: string, data: Uint8Array, mode: string): Uint8Array {\n const header = Buffer.alloc(512, 0);\n header.write(name.slice(0, 100), 0, \"utf8\");\n header.write(octal(parseInt(mode, 8) || 0o644, 8), 100, \"utf8\"); // mode\n header.write(octal(0, 8), 108, \"utf8\"); // uid\n header.write(octal(0, 8), 116, \"utf8\"); // gid\n header.write(octal(data.length, 12), 124, \"utf8\"); // size\n header.write(octal(0, 12), 136, \"utf8\"); // mtime (epoch — deterministic)\n header.write(\" \", 148, \"utf8\"); // checksum placeholder: 8 spaces\n header.write(\"0\", 156, \"utf8\"); // typeflag: regular file\n header.write(\"ustar\\0\", 257, \"latin1\"); // magic\n header.write(\"00\", 263, \"utf8\"); // version\n\n let sum = 0;\n for (const b of header) sum += b;\n header.write(sum.toString(8).padStart(6, \"0\") + \"\\0 \", 148, \"latin1\"); // computed checksum\n\n const body = Buffer.from(data);\n const pad = (512 - (body.length % 512)) % 512;\n // header + body (padded to 512) + two zero blocks (end-of-archive marker)\n return Buffer.concat([header, body, Buffer.alloc(pad), Buffer.alloc(1024)]);\n}\n\n/** Right-justified, zero-padded octal in a `len`-byte field: `len-1` digits + a NUL terminator. */\nfunction octal(n: number, len: number): string {\n return n\n .toString(8)\n .padStart(len - 1, \"0\")\n .slice(-(len - 1)) + \"\\0\";\n}\n\n// ---- lazy import -----------------------------------------------------------\n\nasync function importDockerode(): Promise<DockerodeCtor> {\n // `@vite-ignore` silences Vite/Rollup's \"dynamic import cannot be analyzed\" warning for browser\n // consumers that pull the barrel in for `remote()` only (this path is never reached in a browser).\n const spec = \"dockerode\";\n try {\n const mod = (await import(/* @vite-ignore */ spec)) as unknown as { default?: DockerodeCtor } & DockerodeCtor;\n return (mod.default ?? mod) as DockerodeCtor;\n } catch (err) {\n throw new MindwireError(\n \"mindwire: the Docker sandbox adapter needs the optional `dockerode` package. Install it \" +\n \"(`npm i dockerode`). It's an optional peer dependency, so the core SDK stays dependency-free.\",\n { cause: err },\n );\n }\n}\n","// The Oblien sandbox adapter — the default {@link SandboxAdapter}. The mindwire daemon runs *inside an\n// Oblien workspace* (a microVM) and the SDK reaches it through the `oblien` package's runtime proxy\n// (`rt.proxy(port).fetch`) instead of loopback — the same path pocket-agent uses to reach its in-VM\n// daemon, and it carries SSE unchanged. The `oblien` SDK owns the proxy URL and gateway JWT. Because\n// that proxy reserves `Authorization` for its own JWT, the daemon credential is forwarded separately\n// as `X-Mindwire-Token`; on a `401` this adapter re-acquires the runtime (`{force:true}`) and retries\n// once. Every existing SDK method works unchanged — only the transport swaps.\n//\n// The `oblien` package is an OPTIONAL peer dependency, lazily `import()`-ed only in `connect()` — so\n// merely importing mindwire (or calling the `oblien()` factory, which just stores config) never loads\n// it. This mirrors embedded.ts's lazy `import(\"node:child_process\")`.\nimport { MindwireError } from \"../errors.js\";\nimport type { FetchLike } from \"../http.js\";\nimport { ensureDaemon, type SandboxHost, type EnsureEvent } from \"./host.js\";\nimport type { Target, TargetHandle, ConnectSpec } from \"./index.js\";\n\n/**\n * Config for the Oblien target — auth + endpoint plus the workspace/daemon provisioning knobs. Only\n * `clientId`/`clientSecret`/`baseUrl` are about reaching Oblien; everything else describes the\n * workspace to provision and the daemon to run in it. Credentials fall back to the environment (see\n * {@link connectOblien}); the daemon's `agent` falls back to the client's default agent.\n */\nexport interface OblienConfig {\n /** Sandbox client id. Falls back to `MINDWIRE_SANDBOX_CLIENT_ID`, then `OBLIEN_CLIENT_ID`. */\n clientId?: string;\n /** Sandbox client secret. Falls back to `MINDWIRE_SANDBOX_CLIENT_SECRET`, then `OBLIEN_CLIENT_SECRET`. */\n clientSecret?: string;\n /** Management-API base. Defaults to the `oblien` SDK default. */\n baseUrl?: string;\n /** `AGENT_TYPE` for the in-workspace daemon. Defaults to the client's agent, then `claude-code`. */\n agent?: string;\n /** `AGENT_CWD` — working directory agents run in, inside the workspace. */\n agentCwd?: string;\n /** Loopback port the in-workspace daemon listens on. */\n port?: number;\n /** Explicit local `mindwired` to deploy. `{os}`/`{arch}` expand to the workspace platform. */\n daemonBin?: string;\n /** Upgrade an older daemon when idle; requires its service update capability. Off by default. */\n autoUpdate?: boolean;\n /** Replace even a healthy version match while idle. Use only with a local development binary. */\n forceDeploy?: boolean;\n /** On `close()`, tear the workspace down (delete one we created / stop one we reused). */\n stopOnExit?: boolean;\n /** Image for a new workspace. Ideally one that already runs `mindwired` and ships the target agent CLI. */\n image?: string;\n /** Name for a new workspace. */\n name?: string;\n /** Reuse an existing workspace instead of creating one (skips the cold-start provision). */\n workspaceId?: string;\n /** vCPUs for a new workspace. */\n cpus?: number;\n /** Memory (MB) for a new workspace. */\n memoryMb?: number;\n /** Disk (MB) for a new workspace. */\n diskMb?: number;\n /** Existing MindWire daemon bearer token for this workspace. Reuse it to probe without redeploying. */\n daemonToken?: string;\n /** Called as soon as the workspace identity is known, before daemon installation begins. */\n onWorkspace?: (workspaceId: string) => void | Promise<void>;\n /** Lifecycle: `temporary` (auto-reaped) or `permanent`. */\n mode?: \"temporary\" | \"permanent\";\n}\n\n/**\n * The Oblien target. Returns a {@link Target} whose `connect()` provisions (or reuses) an Oblien\n * workspace, ensures `mindwired` runs inside it, and points the SDK at the runtime proxy. The\n * `oblien` npm peer is only touched inside `connect()`.\n *\n * ```ts\n * new Mindwire({ agent: \"claude-code\", target: oblien({ clientId, clientSecret }) });\n * ```\n */\nexport function oblien(config: OblienConfig = {}): Target {\n return { name: \"oblien\", connect: (spec) => connectOblien(config, spec) };\n}\n\nconst DEFAULT_PORT = 8790;\nconst DEFAULT_IMAGE = \"node-22\";\nconst DEFAULT_AGENT = \"claude-code\";\nconst DEFAULT_AGENT_CWD = \"/root\";\n// The `Http` layer builds `<baseUrl><path>`; this sentinel host is stripped back to `path + search`\n// by the fetch shim before it hands the request to `rt.proxy`. It never hits the network directly.\nconst SENTINEL_BASE = \"http://mindwire-sandbox.local\";\n\n// ---- minimal structural view of the `oblien` package -----------------------\n// Declared locally so the SDK typechecks and builds WITHOUT `oblien` installed (it's an optional\n// peer). Only the members this adapter calls are modeled; everything else is ignored.\n\ninterface OblienExecResult {\n exit_code?: number;\n stdout?: string;\n stderr?: string;\n error?: string;\n status?: string;\n}\n\ninterface OblienExecParams {\n execMode?: \"auto\" | \"shell\" | \"direct\";\n timeoutSeconds?: number;\n keepLogs?: boolean;\n}\n\ninterface RuntimeProxyLike {\n /** Reverse-proxy a request to `127.0.0.1:<port>` inside the workspace. SSE/streaming passes through. */\n fetch(input: string, init?: RequestInit): Promise<Response>;\n}\n\ninterface RuntimeLike {\n exec: { run(cmd: string[], params?: OblienExecParams): Promise<OblienExecResult> };\n files: {\n write(params: {\n fullPath: string;\n content: string;\n createDirs?: boolean;\n append?: boolean;\n mode?: string;\n }): Promise<unknown>;\n };\n proxy(port: number, host?: string): RuntimeProxyLike;\n}\n\ninterface WorkspaceHandleLike {\n id: string;\n start(params?: { force?: boolean }): Promise<unknown>;\n stop(): Promise<unknown>;\n delete(): Promise<unknown>;\n runtime(options?: { force?: boolean }): Promise<RuntimeLike>;\n}\n\ninterface OblienClientLike {\n workspaces: { create(params: Record<string, unknown>): Promise<{ id: string }> };\n workspace(id: string): WorkspaceHandleLike;\n}\n\ninterface OblienModule {\n default: new (opts: Record<string, unknown>) => OblienClientLike;\n}\n\n// ---- SandboxHost over the Oblien runtime -----------------------------------\n\n/**\n * Bridges the backend-agnostic {@link SandboxHost} onto the Oblien runtime: `exec` runs a command via\n * the runtime exec API (normalizing its snake_case result), and `putFile` lands bytes by writing them\n * base64-encoded through the files API and decoding in-VM (the runtime exec has no inbound binary\n * channel). The shared {@link ensureDaemon} cycle only ever sees these two primitives.\n */\nclass OblienHost implements SandboxHost {\n constructor(private readonly rt: RuntimeLike) {}\n\n async exec(argv: string[], opts?: { timeoutSeconds?: number }): Promise<{\n exitCode?: number;\n stdout?: string;\n stderr?: string;\n error?: string;\n }> {\n const r = await this.rt.exec.run(argv, {\n execMode: \"direct\",\n timeoutSeconds: opts?.timeoutSeconds,\n keepLogs: true,\n });\n return { exitCode: r.exit_code, stdout: r.stdout, stderr: r.stderr, error: r.error };\n }\n\n async putFile(path: string, data: Uint8Array, opts?: { mode?: string }): Promise<void> {\n const b64 = Buffer.from(data).toString(\"base64\");\n const b64Path = `${path}.b64`;\n await this.rt.files.write({ fullPath: b64Path, content: b64, createDirs: true });\n const mode = opts?.mode ?? \"0644\";\n await this.rt.exec.run(\n [\"bash\", \"-lc\", `base64 -d ${b64Path} > ${path} && chmod ${mode} ${path} && rm -f ${b64Path}`],\n { execMode: \"direct\", timeoutSeconds: 30, keepLogs: true },\n );\n }\n}\n\n// ---- adapter entry points --------------------------------------------------\n\n/**\n * Resolve credentials (config → `MINDWIRE_SANDBOX_*` → `OBLIEN_*`), lazily import the optional\n * `oblien` peer, construct the client, and provision. Split out so {@link provisionOblien} can be\n * driven by an injected client in tests without importing `oblien`.\n */\nasync function connectOblien(config: OblienConfig, spec: ConnectSpec): Promise<TargetHandle> {\n const clientId = config.clientId ?? env(\"MINDWIRE_SANDBOX_CLIENT_ID\") ?? env(\"OBLIEN_CLIENT_ID\");\n const clientSecret =\n config.clientSecret ?? env(\"MINDWIRE_SANDBOX_CLIENT_SECRET\") ?? env(\"OBLIEN_CLIENT_SECRET\");\n if (!clientId || !clientSecret) {\n throw new MindwireError(\n \"mindwire: the Oblien target needs credentials — pass oblien({ clientId, clientSecret }) \" +\n \"or set MINDWIRE_SANDBOX_CLIENT_ID / MINDWIRE_SANDBOX_CLIENT_SECRET (OBLIEN_CLIENT_ID / \" +\n \"OBLIEN_CLIENT_SECRET are also accepted).\",\n );\n }\n const mod = await importOblien();\n const client = new mod.default({\n clientId,\n clientSecret,\n ...(config.baseUrl ? { baseUrl: config.baseUrl } : {}),\n });\n // The daemon's agent defaults to the client's default agent (an explicit config.agent wins).\n return provisionOblien(client, { ...config, agent: config.agent ?? spec.agent }, spec.onLog);\n}\n\n/**\n * The provisioning flow, decoupled from the `oblien` import so it can be driven by an injected client\n * (used by the unit tests, and available for advanced embedding). Provisions/reuses a workspace,\n * ensures the daemon, and returns a handle whose `fetch` routes every request through the runtime\n * proxy (re-acquiring the runtime and retrying once on a `401`).\n */\nexport async function provisionOblien(\n client: OblienClientLike,\n config: OblienConfig = {},\n onLog?: (e: EnsureEvent) => void,\n): Promise<TargetHandle & { workspaceId: string }> {\n const port = config.port ?? DEFAULT_PORT;\n const agent = config.agent ?? DEFAULT_AGENT;\n const agentCwd = config.agentCwd ?? DEFAULT_AGENT_CWD;\n const created = config.workspaceId === undefined;\n\n // 1. Provision (or reuse) the workspace.\n let workspaceId = config.workspaceId;\n if (workspaceId === undefined) {\n const params: Record<string, unknown> = {\n image: config.image ?? DEFAULT_IMAGE,\n mode: config.mode ?? \"temporary\",\n };\n if (config.name !== undefined) params[\"name\"] = config.name;\n if (config.cpus !== undefined) params[\"cpus\"] = config.cpus;\n if (config.memoryMb !== undefined) params[\"memory_mb\"] = config.memoryMb;\n if (config.diskMb !== undefined) params[\"disk_size_mb\"] = config.diskMb;\n const ws = await client.workspaces.create(params);\n workspaceId = ws.id;\n }\n // Persist/capture the workspace before any install happens. If a browser disconnects or the\n // control plane restarts mid-ensure, a later ensure can safely resume this exact workspace instead\n // of creating an orphaned second one.\n await config.onWorkspace?.(workspaceId);\n const handle = client.workspace(workspaceId);\n\n // 2. Start it (idempotent — tolerate an already-running workspace).\n await handle.start().catch(() => {});\n\n // 3. Ensure the daemon is running inside the VM.\n let rt = await handle.runtime();\n const token = await ensureDaemon(new OblienHost(rt), {\n port,\n agent,\n agentCwd,\n daemonBin: config.daemonBin,\n autoUpdate: config.autoUpdate,\n forceDeploy: config.forceDeploy,\n target: \"oblien\",\n onLog,\n token: config.daemonToken,\n });\n\n // 4. Transport: route both unary and SSE through the runtime proxy. Oblien reserves Authorization\n // for its gateway JWT and strips it before forwarding, so carry the daemon's credential in the\n // dedicated forwarded header instead. On a 401 (expired gateway JWT) re-acquire the runtime and\n // retry once.\n const fetchImpl: FetchLike = async (url, init) => {\n const { pathname, search } = new URL(url);\n const path = pathname + search;\n const headers = new Headers(init?.headers);\n headers.set(\"X-Mindwire-Token\", token);\n // RuntimeProxy owns Authorization and replaces it with the workspace gateway JWT. Removing the\n // daemon token here avoids relying on a header that cannot reach mindwired.\n headers.delete(\"Authorization\");\n let res = await rt.proxy(port).fetch(path, { ...init, headers });\n if (res.status === 401) {\n rt = await handle.runtime({ force: true });\n res = await rt.proxy(port).fetch(path, { ...init, headers });\n }\n return res;\n };\n\n const stop = async (): Promise<void> => {\n if (!config.stopOnExit) return;\n try {\n // We created it → delete; reusing a caller's workspace → only stop it.\n await (created ? handle.delete() : handle.stop());\n } catch {\n // best-effort teardown\n }\n };\n\n return { id: workspaceId, workspaceId, baseUrl: SENTINEL_BASE, token, fetch: fetchImpl, stop };\n}\n\n// ---- lazy import + small helpers -------------------------------------------\n\nasync function importOblien(): Promise<OblienModule> {\n // A variable specifier keeps `tsc` from statically resolving (and erroring on) the optional peer,\n // and keeps bundlers from trying to inline it — it stays a runtime dynamic import. `@vite-ignore`\n // silences Vite/Rollup's \"dynamic import cannot be analyzed\" warning for browser consumers.\n const spec = \"oblien\";\n try {\n return (await import(/* @vite-ignore */ spec)) as unknown as OblienModule;\n } catch (err) {\n throw new MindwireError(\n \"mindwire: sandbox mode with the default (Oblien) adapter needs the optional `oblien` package. \" +\n \"Install it (`npm i oblien`). It's an optional peer dependency, so the core SDK stays \" +\n \"dependency-free.\",\n { cause: err },\n );\n }\n}\n\nfunction env(key: string): string | undefined {\n const proc = (globalThis as { process?: { env?: Record<string, string | undefined> } }).process;\n return proc?.env?.[key];\n}\n","/**\n * The models.dev catalog — the reference list of which providers and models exist.\n *\n * This is deliberately NOT bundled: models.dev is a hosted JSON API and staying its client (rather than\n * embedding a snapshot) is the whole point — the list is always current, and the SDK stays a thin catalog\n * client with no committed multi-megabyte blob. The raw feed (`https://models.dev/api.json`, ~2 MB across\n * ~190 providers) is fetched once per process, projected to {@link CatalogProvider}/{@link ModelInfo}, and\n * memoized with a soft TTL. Uses `globalThis.fetch`, so it works in Node and the browser.\n *\n * This is pure catalog data — \"which models exist\" — and knows nothing about the daemon, a selected agent,\n * or which providers are configured/authenticated. The daemon's job is only to relay a chosen provider's\n * settings to the harness; the catalog lives here.\n */\nimport type { CatalogProvider, ModelInfo, ModelCost } from \"../types.js\";\n\n/** The canonical models.dev catalog endpoint. */\nexport const MODELS_DEV_URL = \"https://models.dev/api.json\";\n\n/** How long a fetched catalog is reused before the next call re-fetches. */\nconst TTL_MS = 6 * 60 * 60 * 1000; // 6h — models.dev changes rarely; this just bounds staleness.\n\n/** Options accepted by every catalog function. All optional; defaults hit models.dev via global fetch. */\nexport interface CatalogOptions {\n /** Override the endpoint (e.g. a mirror or a pinned snapshot). Defaults to {@link MODELS_DEV_URL}. */\n url?: string;\n /** Override the fetch implementation (tests, a proxy transport). Defaults to `globalThis.fetch`. */\n fetch?: typeof globalThis.fetch;\n /** Abort signal for the underlying request. */\n signal?: AbortSignal;\n}\n\n// ---- raw models.dev shape (only the fields we read) --------------------------------------------------\n\ninterface RawModel {\n id?: string;\n name?: string;\n reasoning?: boolean;\n tool_call?: boolean;\n attachment?: boolean;\n limit?: { context?: number; output?: number };\n modalities?: { input?: string[]; output?: string[] };\n cost?: { input?: number; output?: number; cache_read?: number; cache_write?: number };\n}\ninterface RawProvider {\n id?: string;\n name?: string;\n env?: string[];\n npm?: string;\n api?: string;\n doc?: string;\n models?: Record<string, RawModel>;\n}\ntype RawFeed = Record<string, RawProvider>;\n\n// ---- projection ---------------------------------------------------------------------------------------\n\nfunction toCost(c: RawModel[\"cost\"]): ModelCost | undefined {\n if (!c) return undefined;\n const cost: ModelCost = {};\n if (typeof c.input === \"number\") cost.input = c.input;\n if (typeof c.output === \"number\") cost.output = c.output;\n if (typeof c.cache_read === \"number\") cost.cacheRead = c.cache_read;\n if (typeof c.cache_write === \"number\") cost.cacheWrite = c.cache_write;\n return Object.keys(cost).length ? cost : undefined;\n}\n\nfunction toModel(providerId: string, id: string, m: RawModel): ModelInfo {\n const info: ModelInfo = { id: m.id ?? id, label: m.name || (m.id ?? id), provider: providerId };\n if (m.limit?.context) info.contextWindow = m.limit.context;\n if (m.limit?.output) info.maxOutput = m.limit.output;\n if (m.modalities?.input?.length) info.inputModalities = m.modalities.input;\n if (m.modalities?.output?.length) info.outputModalities = m.modalities.output;\n if (m.reasoning) info.reasoning = true;\n if (m.tool_call) info.toolCall = true;\n if (m.attachment) info.attachment = true;\n const cost = toCost(m.cost);\n if (cost) info.cost = cost;\n return info;\n}\n\nfunction project(feed: RawFeed): CatalogProvider[] {\n const providers: CatalogProvider[] = [];\n for (const [pid, prov] of Object.entries(feed ?? {})) {\n if (!prov || typeof prov !== \"object\") continue;\n const id = prov.id ?? pid;\n const models = Object.entries(prov.models ?? {})\n .map(([mid, m]) => toModel(id, mid, m))\n .sort((a, b) => a.label.localeCompare(b.label) || a.id.localeCompare(b.id));\n providers.push({\n id,\n name: prov.name || id,\n env: Array.isArray(prov.env) ? prov.env.filter((v): v is string => typeof v === \"string\" && !!v) : [],\n ...(prov.npm ? { npm: prov.npm } : {}),\n ...(prov.api ? { api: prov.api } : {}),\n ...(prov.doc ? { doc: prov.doc } : {}),\n models,\n });\n }\n return providers.sort((a, b) => a.name.localeCompare(b.name));\n}\n\n// ---- fetch + memoize ----------------------------------------------------------------------------------\n\nlet cache: { url: string; at: number; data: CatalogProvider[] } | null = null;\nlet inflight: Promise<CatalogProvider[]> | null = null;\n\n/**\n * Load (and memoize) the full models.dev catalog, projected to {@link CatalogProvider}[] sorted by name.\n * Cached in-process for {@link TTL_MS}; concurrent calls share one in-flight request. Throws if the fetch\n * fails or returns a non-2xx — callers (and the console) surface that as an error state.\n */\nexport async function loadCatalog(opts: CatalogOptions = {}): Promise<CatalogProvider[]> {\n const url = opts.url ?? MODELS_DEV_URL;\n if (cache && cache.url === url && Date.now() - cache.at < TTL_MS) return cache.data;\n if (inflight) return inflight;\n\n const doFetch = opts.fetch ?? globalThis.fetch;\n if (typeof doFetch !== \"function\") {\n throw new Error(\"no fetch implementation available — pass CatalogOptions.fetch\");\n }\n\n inflight = (async () => {\n const res = await doFetch(url, { headers: { accept: \"application/json\" }, signal: opts.signal });\n if (!res.ok) throw new Error(`models.dev catalog fetch failed: ${res.status} ${res.statusText}`);\n const data = project((await res.json()) as RawFeed);\n cache = { url, at: Date.now(), data };\n return data;\n })();\n try {\n return await inflight;\n } finally {\n inflight = null;\n }\n}\n\n/** Every provider in the models.dev catalog, each with its models, sorted by provider name. */\nexport function catalogProviders(opts?: CatalogOptions): Promise<CatalogProvider[]> {\n return loadCatalog(opts);\n}\n\n/** One provider by id (e.g. `\"openai\"`), or `undefined` if the catalog has no such provider. */\nexport async function catalogProvider(id: string, opts?: CatalogOptions): Promise<CatalogProvider | undefined> {\n return (await loadCatalog(opts)).find((p) => p.id === id);\n}\n\n/** Flat list of models — all providers, or just one when `provider` is given. */\nexport async function catalogModels(provider?: string, opts?: CatalogOptions): Promise<ModelInfo[]> {\n const providers = await loadCatalog(opts);\n if (provider) return providers.find((p) => p.id === provider)?.models ?? [];\n return providers.flatMap((p) => p.models);\n}\n\n/** A single model by (provider, id), or `undefined` if absent. */\nexport async function lookupModel(\n provider: string,\n id: string,\n opts?: CatalogOptions,\n): Promise<ModelInfo | undefined> {\n return (await catalogProvider(provider, opts))?.models.find((m) => m.id === id);\n}\n\n/** Drop the in-process cache so the next call re-fetches. Mainly for tests and manual refresh. */\nexport function clearCatalogCache(): void {\n cache = null;\n inflight = null;\n}\n","/**\n * mindwire — a typed TypeScript client for the mindwire daemon.\n *\n * One SDK for every coding-agent harness (Claude Code, Codex, Grok Build, opencode). The\n * daemon normalizes each agent to a single protocol; this package is a thin, dependency-free\n * client over its REST + SSE surface.\n */\n\nexport { Mindwire, AuthApi, PromptsApi, McpApi, ProvidersApi, NotifyApi } from \"./client.js\";\nexport type { MindwireOptions, AgentScoped } from \"./client.js\";\n\nexport { Run } from \"./run.js\";\nexport type { StreamOptions, WaitResult } from \"./run.js\";\n\nexport { Http } from \"./http.js\";\nexport type { HttpOptions, FetchLike, RequestInitLike, BaseResolver, TokenGetter } from \"./http.js\";\n\nexport { startEmbedded } from \"./embedded.js\";\nexport type { EmbeddedOptions, EmbeddedDaemon } from \"./embedded.js\";\n\n// Destinations — where the daemon runs and how the SDK reaches it. `local`/`remote` are the\n// dependency-free built-ins; `ssh`/`docker`/`oblien` each ensure a daemon on a box/container/workspace\n// (their provider peers `ssh2`/`dockerode`/`oblien` load lazily, only when you call the factory).\nexport { local, remote } from \"./target/index.js\";\nexport type { Target, TargetHandle, ConnectSpec, RemoteOptions } from \"./target/index.js\";\nexport { ssh, provisionSsh, provisionSshContainer } from \"./target/ssh.js\";\nexport type { SshOptions, SshProvisionConfig, SshContainerProvisionConfig } from \"./target/ssh.js\";\nexport { docker, provisionDocker } from \"./target/docker.js\";\nexport type { DockerConfig, DockerEngineOptions, DockerodeLike } from \"./target/docker.js\";\nexport { oblien, provisionOblien } from \"./target/oblien.js\";\nexport type { OblienConfig } from \"./target/oblien.js\";\nexport { provisionContainer, ContainerHost } from \"./target/container.js\";\nexport type { ContainerConfig, ContainerHandle } from \"./target/container.js\";\nexport { ensureDaemon, resolveLinuxDaemon } from \"./target/host.js\";\nexport type { SandboxHost, ExecResult, EnsureDaemonConfig, EnsureEvent } from \"./target/host.js\";\nexport { SDK_VERSION } from \"./version.js\";\nexport { ensureDaemonBinary } from \"./daemon-binary.js\";\nexport type { EnsureDaemonBinaryOptions, DaemonPlatform, DaemonArch } from \"./daemon-binary.js\";\n\n// The models.dev catalog — fetched live, never bundled. Pure \"which providers/models exist\" reference\n// data; knows nothing about the daemon or a selected agent.\nexport {\n catalogProviders,\n catalogProvider,\n catalogModels,\n lookupModel,\n loadCatalog,\n clearCatalogCache,\n MODELS_DEV_URL,\n} from \"./catalog/index.js\";\nexport type { CatalogOptions } from \"./catalog/index.js\";\n\nexport { MindwireError, ApiError, RunFailedError, TimeoutError } from \"./errors.js\";\n\nexport * from \"./types.js\";\nexport { ServiceApi } from \"./service.js\";\nexport type { ServiceUpdateState, ServiceUpdateLease } from \"./service.js\";\nexport { WorkspaceApi, WorkspaceCollection, ProjectOperationsApi, GitAccessApi } from \"./workspace.js\";\nexport type { ProjectRequest, ProjectAuth, ProjectOperation, ProjectRemoveRequest,\n GitConnection, GitAccessState, ProjectGitState, GitAction, GitIdentity, GitIdentityScope, GitIdentitySettings,\n GitIdentityUpdate, GitOperationRequest, GitOperation } from \"./workspace.js\";\nexport type { WorkspaceRecord, WorkspaceAgent, WorkspaceProject, WorkspaceChat, WorkspaceKind,\n WorkspaceInput, WorkspaceImport, WorkspaceSnapshot } from \"./workspace.js\";\n\nexport * from \"./surfaces.js\";\nexport * from \"./execution.js\";\nexport * from \"./computer.js\";\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/errors.ts","../src/binary-cache.ts","../src/http.ts","../src/sse.ts","../src/run.ts","../src/workspace.ts","../src/surfaces.ts","../src/service.ts","../src/execution.ts","../src/computer.ts","../src/embedded.ts","../src/daemon-binary.ts","../src/version.ts","../src/target/index.ts","../src/client.ts","../src/target/ssh.ts","../src/target/host.ts","../src/target/container.ts","../src/target/docker.ts","../src/target/oblien.ts","../src/catalog/index.ts","../src/index.ts"],"names":["MindwireError","ApiError","RunFailedError","TimeoutError","payload","binaryCacheDirectory","cachedExecutable","cacheExecutable","emit","hostPort","shared","DEFAULT_PORT","DEFAULT_AGENT","DEFAULT_AGENT_CWD","docker","env"],"mappings":";;;;;;;;;;;;;;AACaA,8BAAA,CAAA,CAWAC,2BA4CAC,+BAAA,CAAA,CAiBAC;AAzEb,IAAA,WAAA,GAAA,KAAA,CAAA;AAAA,EAAA,eAAA,GAAA;AACO,IAAMH,qBAAA,GAAN,cAA4B,KAAA,CAAM;AAAA,MACvC,WAAA,CAAY,SAAiB,OAAA,EAA+B;AAC1D,QAAA,KAAA,CAAM,SAAS,OAAO,CAAA;AACtB,QAAA,IAAA,CAAK,IAAA,GAAO,eAAA;AAAA,MACd;AAAA,KACF;AAMO,IAAMC,gBAAA,GAAN,MAAM,SAAA,SAAiBD,qBAAA,CAAc;AAAA,MACjC,MAAA;AAAA,MACA,GAAA;AAAA,MACA,MAAA;AAAA,MACA,IAAA;AAAA,MAET,YAAY,IAAA,EAAsE;AAChF,QAAA,KAAA,CAAM,SAAA,CAAS,UAAA,CAAW,IAAI,CAAC,CAAA;AAC/B,QAAA,IAAA,CAAK,IAAA,GAAO,UAAA;AACZ,QAAA,IAAA,CAAK,SAAS,IAAA,CAAK,MAAA;AACnB,QAAA,IAAA,CAAK,MAAM,IAAA,CAAK,GAAA;AAChB,QAAA,IAAA,CAAK,SAAS,IAAA,CAAK,MAAA;AACnB,QAAA,IAAA,CAAK,OAAO,IAAA,CAAK,IAAA;AAAA,MACnB;AAAA,MAEA,OAAe,UAAA,CAAW;AAAA,QACxB,MAAA;AAAA,QACA,MAAA;AAAA,QACA,GAAA;AAAA,QACA;AAAA,OACF,EAKW;AACT,QAAA,MAAM,MAAA,GACJ,QAAQ,OAAO,IAAA,KAAS,YAAY,OAAA,IAAW,IAAA,IAAQ,OAAO,IAAA,CAAK,KAAA,KAAU,QAAA,GACzE,KAAK,KAAA,GACL,OAAO,SAAS,QAAA,IAAY,IAAA,CAAK,MAAK,KAAM,EAAA,GAC1C,IAAA,CAAK,IAAA,EAAK,GACV,EAAA;AACR,QAAA,MAAM,OAAO,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,GAAG,gBAAgB,MAAM,CAAA,CAAA;AACnD,QAAA,OAAO,MAAA,GAAS,CAAA,EAAG,IAAI,CAAA,EAAA,EAAK,MAAM,CAAA,CAAA,GAAK,IAAA;AAAA,MACzC;AAAA,KACF;AASO,IAAME,sBAAA,GAAN,cAA6BF,qBAAA,CAAc;AAAA,MACvC,MAAA;AAAA,MACA,KAAA;AAAA,MAET,WAAA,CAAY,KAAA,EAAe,MAAA,EAAgB,MAAA,EAAiB;AAC1D,QAAA,KAAA,CAAM,MAAA,GAAS,CAAA,IAAA,EAAO,KAAK,CAAA,CAAA,EAAI,MAAM,CAAA,EAAA,EAAK,MAAM,CAAA,CAAA,GAAK,CAAA,IAAA,EAAO,KAAK,CAAA,CAAA,EAAI,MAAM,CAAA,CAAE,CAAA;AAC7E,QAAA,IAAA,CAAK,IAAA,GAAO,gBAAA;AACZ,QAAA,IAAA,CAAK,KAAA,GAAQ,KAAA;AACb,QAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,MAChB;AAAA,KACF;AAOO,IAAMG,oBAAA,GAAN,cAA2BH,qBAAA,CAAc;AAAA,MACrC,MAAA;AAAA,MACA,IAAA;AAAA,MACA,SAAA;AAAA,MAET,WAAA,CAAY,MAAA,EAAgB,IAAA,EAAc,SAAA,EAAmB;AAC3D,QAAA,KAAA,CAAM,aAAa,MAAM,CAAA,CAAA,EAAI,IAAI,CAAA,iBAAA,EAAoB,SAAS,CAAA,EAAA,CAAI,CAAA;AAClE,QAAA,IAAA,CAAK,IAAA,GAAO,cAAA;AACZ,QAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,QAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,QAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AAAA,MACnB;AAAA,KACF;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACrFA,IAAA,oBAAA,GAAA,EAAA;AAAA,QAAA,CAAA,oBAAA,EAAA;AAAA,EAAA,oBAAA,EAAA,MAAA,oBAAA;AAAA,EAAA,eAAA,EAAA,MAAA,eAAA;AAAA,EAAA,gBAAA,EAAA,MAAA,gBAAA;AAAA,EAAA,kBAAA,EAAA,MAAA,kBAAA;AAAA,EAAA,kBAAA,EAAA,MAAA;AAAA,CAAA,CAAA;AAIA,eAAsB,oBAAA,CAAqB,QAAA,GAAW,OAAA,CAAQ,QAAA,EAA2B;AACvF,EAAA,MAAM,IAAA,GAAO,MAAM,OAAO,MAAW,CAAA;AACrC,EAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,MAAM,OAAO,IAAS,CAAA;AAC1C,EAAA,MAAM,gBAAgB,OAAA,EAAQ;AAC9B,EAAA,OAAO,QAAA,KAAa,QAAA,GAAW,IAAA,CAAK,IAAA,CAAK,aAAA,EAAe,SAAA,EAAW,QAAA,EAAU,UAAU,CAAA,GACnF,QAAA,KAAa,OAAA,GAAU,IAAA,CAAK,KAAK,OAAA,CAAQ,GAAA,CAAI,YAAA,IAAgB,aAAA,EAAe,UAAA,EAAY,OAAO,CAAA,GAC/F,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,cAAA,IAAkB,IAAA,CAAK,IAAA,CAAK,aAAA,EAAe,QAAQ,GAAG,UAAU,CAAA;AAC5F;AAEA,eAAsB,mBAAmB,KAAA,EAAoC;AAC3E,EAAA,MAAM,EAAE,UAAA,EAAW,GAAI,MAAM,OAAO,QAAa,CAAA;AACjD,EAAA,OAAO,WAAW,QAAQ,CAAA,CAAE,OAAO,KAAK,CAAA,CAAE,OAAO,KAAK,CAAA;AACxD;AAEA,eAAsB,kBAAA,CAAmB,KAAA,EAAmB,QAAA,EAAkB,IAAA,EAA6B;AACzG,EAAA,IAAI,CAAC,iBAAA,CAAkB,IAAA,CAAK,QAAQ,CAAA,IAAK,MAAM,kBAAA,CAAmB,KAAK,CAAA,KAAM,QAAA,CAAS,WAAA,EAAY,EAAG;AACnG,IAAA,MAAM,IAAIA,qBAAA,CAAc,CAAA,2CAAA,EAA8C,IAAI,CAAA,CAAE,CAAA;AAAA,EAC9E;AACF;AAEA,eAAsB,iBAAiB,GAAA,EAA0C;AAC/E,EAAA,MAAM,EAAA,GAAK,MAAM,OAAO,aAAkB,CAAA;AAC1C,EAAA,IAAI;AACF,IAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,IAAI,MAAM,OAAA,CAAQ,IAAI,CAAC,EAAA,CAAG,SAAS,GAAG,CAAA,EAAG,GAAG,QAAA,CAAS,CAAA,EAAG,GAAG,CAAA,OAAA,CAAA,EAAW,MAAM,CAAC,CAAC,CAAA;AACpG,IAAA,MAAM,kBAAA,CAAmB,KAAA,EAAO,QAAA,CAAS,IAAA,IAAQ,GAAG,CAAA;AACpD,IAAA,OAAO,GAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AAAE,IAAA,OAAO,MAAA;AAAA,EAAW;AAC9B;AAEA,eAAsB,eAAA,CAAgB,GAAA,EAAa,KAAA,EAAmB,QAAA,EAAmC;AACvG,EAAA,MAAM,kBAAA,CAAmB,KAAA,EAAO,QAAA,EAAU,GAAG,CAAA;AAC7C,EAAA,MAAM,EAAA,GAAK,MAAM,OAAO,aAAkB,CAAA;AAC1C,EAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,MAAM,OAAO,MAAW,CAAA;AAC5C,EAAA,MAAM,EAAE,UAAA,EAAW,GAAI,MAAM,OAAO,QAAa,CAAA;AACjD,EAAA,MAAM,EAAA,CAAG,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,EAAG,EAAE,SAAA,EAAW,IAAA,EAAM,IAAA,EAAM,GAAA,EAAO,CAAA;AAE7D,EAAA,MAAM,IAAA,GAAO,CAAA,EAAG,GAAG,CAAA,CAAA,EAAI,YAAY,CAAA,IAAA,CAAA;AACnC,EAAA,IAAI;AACF,IAAA,MAAM,EAAA,CAAG,UAAU,IAAA,EAAM,KAAA,EAAO,EAAE,IAAA,EAAM,GAAA,EAAO,IAAA,EAAM,IAAA,EAAM,CAAA;AAC3D,IAAA,MAAM,EAAA,CAAG,UAAU,CAAA,EAAG,IAAI,WAAW,CAAA,EAAG,QAAA,CAAS,aAAa;AAAA,CAAA,EAAM,EAAE,IAAA,EAAM,GAAA,EAAO,IAAA,EAAM,MAAM,CAAA;AAC/F,IAAA,MAAM,EAAA,CAAG,MAAA,CAAO,IAAA,EAAM,GAAG,CAAA;AACzB,IAAA,MAAM,GAAG,MAAA,CAAO,CAAA,EAAG,IAAI,CAAA,OAAA,CAAA,EAAW,CAAA,EAAG,GAAG,CAAA,OAAA,CAAS,CAAA;AACjD,IAAA,OAAO,GAAA;AAAA,EACT,CAAA,SAAE;AACA,IAAA,MAAM,GAAG,EAAA,CAAG,IAAA,EAAM,EAAE,KAAA,EAAO,MAAM,CAAA;AACjC,IAAA,MAAM,EAAA,CAAG,GAAG,CAAA,EAAG,IAAI,WAAW,EAAE,KAAA,EAAO,MAAM,CAAA;AAAA,EAC/C;AACF;AAnDA,IAAA,iBAAA,GAAA,KAAA,CAAA;AAAA,EAAA,qBAAA,GAAA;AAEA,IAAA,WAAA,EAAA;AAAA,EAAA;AAAA,CAAA,CAAA;;;ACFA,WAAA,EAAA;AAOA,IAAM,kBAAA,GAAqB,IAAA;AAG3B,SAAS,aAAa,CAAA,EAAqB;AACzC,EAAA,OAAO,OAAO,CAAA,KAAM,QAAA,IAAY,CAAA,KAAM,IAAA,IAAS,EAAyB,IAAA,KAAS,YAAA;AACnF;AAiEO,IAAM,OAAN,MAAW;AAAA,EACC,SAAA;AAAA,EACA,WAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACT,MAAA,GAAsB,IAAA;AAAA,EACtB,OAAA,GAAgC,IAAA;AAAA,EAExC,YAAY,IAAA,EAAmB;AAC7B,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,IAAU,UAAA,CAAW,KAAA;AACpC,IAAA,IAAI,CAAC,CAAA,EAAG;AACN,MAAA,MAAM,IAAIA,qBAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AACA,IAAA,IAAA,CAAK,SAAA,GAAY,CAAA;AACjB,IAAA,IAAA,CAAK,WAAA,GAAc,EAAE,GAAG,IAAA,CAAK,OAAA,EAAQ;AACrC,IAAA,IAAA,CAAK,SAAA,GAAY,KAAK,SAAA,IAAa,kBAAA;AAEnC,IAAA,IAAI,KAAK,OAAA,EAAS;AAChB,MAAA,MAAM,IAAA,GAAa,EAAE,OAAA,EAAS,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAA,EAAG,KAAA,EAAO,IAAA,CAAK,KAAA,EAAM;AAClF,MAAA,IAAA,CAAK,WAAW,YAAY,IAAA;AAAA,IAC9B,CAAA,MAAA,IAAW,KAAK,WAAA,EAAa;AAC3B,MAAA,MAAM,KAAK,IAAA,CAAK,WAAA;AAChB,MAAA,IAAA,CAAK,WAAW,YAAY;AAC1B,QAAA,MAAM,CAAA,GAAI,MAAM,EAAA,EAAG;AACnB,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,CAAA,CAAE,OAAA,CAAQ,OAAA,CAAQ,QAAQ,EAAE,CAAA;AAAA,UACrC,KAAA,EAAO,CAAA,CAAE,KAAA,IAAS,IAAA,CAAK,KAAA;AAAA,UACvB,UAAU,CAAA,CAAE,QAAA;AAAA,UACZ,SAAS,CAAA,CAAE,OAAA;AAAA,UACX,OAAO,CAAA,CAAE;AAAA,SACX;AAAA,MACF,CAAA;AAAA,IACF,CAAA,MAAO;AACL,MAAA,MAAM,IAAIA,sBAAc,oDAAoD,CAAA;AAAA,IAC9E;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAc,SAAA,CACZ,CAAA,EACA,GAAA,EACA,IAAA,EACA,QACA,IAAA,EACmB;AACnB,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,CAAA,CAAE,GAAA,EAAK,IAAI,CAAA;AAAA,IAC1B,SAAS,CAAA,EAAG;AACV,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,MAAA,EAAQ,OAAA,IAAW,KAAA;AACxC,MAAA,IAAI,OAAA,IAAW,YAAA,CAAa,CAAC,CAAA,EAAG,MAAM,CAAA;AACtC,MAAA,MAAM,IAAIA,qBAAA,CAAc,CAAA,UAAA,EAAa,MAAM,CAAA,CAAA,EAAI,IAAI,CAAA,8BAAA,CAAA,EAA6B,EAAE,KAAA,EAAO,CAAA,EAAG,CAAA;AAAA,IAC9F;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAc,gBAAA,CACZ,CAAA,EACA,KACA,IAAA,EACA,UAAA,EACA,QACA,IAAA,EACmB;AACnB,IAAA,IAAI,CAAC,IAAA,CAAK,SAAA,IAAa,IAAA,CAAK,aAAa,CAAA,EAAG;AAC1C,MAAA,OAAO,KAAK,SAAA,CAAU,CAAA,EAAG,GAAA,EAAK,EAAE,GAAG,IAAA,EAAM,GAAI,UAAA,GAAa,EAAE,QAAQ,UAAA,EAAW,GAAI,EAAC,EAAG,EAAG,QAAQ,IAAI,CAAA;AAAA,IACxG;AACA,IAAA,MAAM,IAAA,GAAO,IAAI,eAAA,EAAgB;AACjC,IAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,KAAA,CAAM,YAAY,MAAM,CAAA;AACnD,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,IAAI,UAAA,CAAW,OAAA,EAAS,IAAA,CAAK,KAAA,CAAM,WAAW,MAAM,CAAA;AAAA,sBACpC,gBAAA,CAAiB,OAAA,EAAS,SAAS,EAAE,IAAA,EAAM,MAAM,CAAA;AAAA,IACnE;AACA,IAAA,IAAI,QAAA,GAAW,KAAA;AACf,IAAA,MAAM,KAAA,GAAQ,WAAW,MAAM;AAC7B,MAAA,QAAA,GAAW,IAAA;AACX,MAAA,IAAA,CAAK,KAAA,EAAM;AAAA,IACb,CAAA,EAAG,KAAK,SAAS,CAAA;AACjB,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,IAAA,CAAK,SAAA,CAAU,CAAA,EAAG,GAAA,EAAK,EAAE,GAAG,IAAA,EAAM,MAAA,EAAQ,IAAA,CAAK,MAAA,EAAO,EAAG,QAAQ,IAAI,CAAA;AAAA,IACpF,SAAS,CAAA,EAAG;AACV,MAAA,IAAI,UAAU,MAAM,IAAIG,qBAAa,MAAA,EAAQ,IAAA,EAAM,KAAK,SAAS,CAAA;AACjE,MAAA,IAAI,UAAA,EAAY,OAAA,EAAS,MAAM,UAAA,CAAW,MAAA,IAAU,CAAA;AACpD,MAAA,MAAM,CAAA;AAAA,IACR,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,KAAK,CAAA;AAClB,MAAA,IAAI,UAAA,EAAY,UAAA,CAAW,mBAAA,CAAoB,OAAA,EAAS,OAAO,CAAA;AAAA,IACjE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAc,SAAA,CAAU,IAAA,EAAY,KAAA,EAA6C;AAC/E,IAAA,IAAI,KAAK,QAAA,EAAU;AACjB,MAAA,MAAM,CAAA,GAAI,MAAM,IAAA,CAAK,QAAA,CAAS,QAAQ,EAAE,KAAA,EAAO,IAAA,EAAK,GAAI,MAAS,CAAA;AACjE,MAAA,OAAO,KAAK,IAAA,CAAK,KAAA;AAAA,IACnB;AACA,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EACd;AAAA,EAEQ,IAAA,GAAsB;AAC5B,IAAA,IAAI,KAAK,MAAA,EAAQ,OAAO,OAAA,CAAQ,OAAA,CAAQ,KAAK,MAAM,CAAA;AACnD,IAAA,IAAI,CAAC,KAAK,OAAA,EAAS;AAGjB,MAAA,IAAA,CAAK,OAAA,GAAU,IAAA,CAAK,QAAA,EAAS,CAC1B,IAAA,CAAK,CAAC,CAAA,KAAO,IAAA,CAAK,MAAA,GAAS,CAAE,CAAA,CAC7B,KAAA,CAAM,CAAC,GAAA,KAAQ;AACd,QAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AACf,QAAA,MAAM,GAAA;AAAA,MACR,CAAC,CAAA;AAAA,IACL;AACA,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,KAAA,GAAuB;AAC3B,IAAA,MAAM,KAAK,IAAA,EAAK;AAAA,EAClB;AAAA,EAEQ,GAAA,CAAI,OAAA,EAAiB,IAAA,EAAc,KAAA,EAA0C;AACnF,IAAA,MAAM,CAAA,GAAI,IAAI,GAAA,CAAI,OAAA,IAAW,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,GAAI,IAAA,GAAO,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,CAAG,CAAA;AACtE,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AAC1C,QAAA,IAAI,CAAA,KAAM,QAAW,CAAA,CAAE,YAAA,CAAa,IAAI,CAAA,EAAG,MAAA,CAAO,CAAC,CAAC,CAAA;AAAA,MACtD;AAAA,IACF;AACA,IAAA,OAAO,EAAE,QAAA,EAAS;AAAA,EACpB;AAAA,EAEQ,OAAA,CAAQ,KAAA,EAA2B,KAAA,EAAgC,OAAA,GAAU,KAAA,EAA+B;AAClH,IAAA,MAAM,CAAA,GAA4B,EAAE,MAAA,EAAQ,kBAAA,EAAoB,GAAG,IAAA,CAAK,WAAA,EAAa,GAAG,KAAA,EAAM;AAC9F,IAAA,IAAI,KAAA,EAAO,CAAA,CAAE,eAAe,CAAA,GAAI,UAAU,KAAK,CAAA,CAAA;AAC/C,IAAA,IAAI,OAAA,EAAS,CAAA,CAAE,cAAc,CAAA,GAAI,kBAAA;AACjC,IAAA,OAAO,CAAA;AAAA,EACT;AAAA,EAEA,MAAM,OAAA,CAAW,MAAA,EAAgB,IAAA,EAAc,IAAA,GAAwB,EAAC,EAAe;AACrF,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,IAAA,EAAK;AAC7B,IAAA,MAAM,OAAA,GAAU,KAAK,IAAA,KAAS,MAAA;AAC9B,IAAA,MAAM,MAAM,IAAA,CAAK,GAAA,CAAI,KAAK,OAAA,EAAS,IAAA,EAAM,KAAK,KAAK,CAAA;AACnD,IAAA,MAAM,QAAQ,EAAE,GAAG,KAAK,OAAA,EAAS,GAAG,KAAK,OAAA,EAAQ;AACjD,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,IAAS,IAAA,CAAK,SAAA;AAC7B,IAAA,MAAM,IAAA,GAAO,OAAO,KAAA,KAClB,IAAA,CAAK,gBAAA;AAAA,MACH,CAAA;AAAA,MACA,GAAA;AAAA,MACA;AAAA,QACE,MAAA;AAAA,QACA,OAAA,EAAS,IAAA,CAAK,OAAA,CAAQ,MAAM,IAAA,CAAK,UAAU,IAAA,EAAM,KAAK,CAAA,EAAG,KAAA,EAAO,OAAO,CAAA;AAAA,QACvE,MAAM,OAAA,GAAU,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,IAAI,CAAA,GAAI;AAAA,OAC9C;AAAA,MACA,IAAA,CAAK,MAAA;AAAA,MACL,MAAA;AAAA,MACA;AAAA,KACF;AAEF,IAAA,IAAI,GAAA,GAAM,MAAM,IAAA,CAAK,KAAK,CAAA;AAE1B,IAAA,IAAI,GAAA,CAAI,WAAW,GAAA,IAAO,IAAA,CAAK,UAAU,GAAA,GAAM,MAAM,KAAK,IAAI,CAAA;AAE9D,IAAA,IAAI,CAAC,IAAI,EAAA,EAAI,MAAM,MAAM,IAAA,CAAK,UAAA,CAAW,QAAQ,GAAG,CAAA;AACpD,IAAA,IAAI,GAAA,CAAI,MAAA,KAAW,GAAA,EAAK,OAAO,MAAA;AAE/B,IAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,IAAA,EAAK;AAC5B,IAAA,IAAI,IAAA,KAAS,IAAI,OAAO,MAAA;AACxB,IAAA,IAAI;AACF,MAAA,OAAO,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,IACxB,SAAS,CAAA,EAAG;AACV,MAAA,MAAM,IAAIH,qBAAA,CAAc,CAAA,UAAA,EAAa,MAAM,CAAA,CAAA,EAAI,IAAI,CAAA,yBAAA,CAAA,EAA6B,EAAE,KAAA,EAAO,CAAA,EAAG,CAAA;AAAA,IAC9F;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,IAAA,CAAK,MAAA,EAAgB,IAAA,EAAc,IAAA,GAAwB,EAAC,EAAsB;AACtF,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,IAAA,EAAK;AAC7B,IAAA,MAAM,MAAM,IAAA,CAAK,GAAA,CAAI,KAAK,OAAA,EAAS,IAAA,EAAM,KAAK,KAAK,CAAA;AACnD,IAAA,MAAM,KAAA,GAAQ,EAAE,MAAA,EAAQ,mBAAA,EAAqB,GAAG,IAAA,CAAK,OAAA,EAAS,GAAG,IAAA,CAAK,OAAA,EAAQ;AAC9E,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,IAAS,IAAA,CAAK,SAAA;AAG7B,IAAA,MAAM,IAAA,GAAO,OAAO,KAAA,KAClB,IAAA,CAAK,SAAA;AAAA,MACH,CAAA;AAAA,MACA,GAAA;AAAA,MACA;AAAA,QACE,MAAA;AAAA,QACA,OAAA,EAAS,IAAA,CAAK,OAAA,CAAQ,MAAM,IAAA,CAAK,SAAA,CAAU,IAAA,EAAM,KAAK,CAAA,EAAG,KAAA,EAAO,IAAA,CAAK,IAAA,KAAS,MAAS,CAAA;AAAA,QACvF,GAAI,IAAA,CAAK,IAAA,KAAS,MAAA,GAAY,EAAE,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,IAAI,CAAA,EAAE,GAAI,EAAC;AAAA,QACrE,GAAI,KAAK,MAAA,GAAS,EAAE,QAAQ,IAAA,CAAK,MAAA,KAAW;AAAC,OAC/C;AAAA,MACA,MAAA;AAAA,MACA;AAAA,KACF;AAEF,IAAA,IAAI,GAAA,GAAM,MAAM,IAAA,CAAK,KAAK,CAAA;AAC1B,IAAA,IAAI,GAAA,CAAI,WAAW,GAAA,IAAO,IAAA,CAAK,UAAU,GAAA,GAAM,MAAM,KAAK,IAAI,CAAA;AAE9D,IAAA,IAAI,CAAC,IAAI,EAAA,EAAI,MAAM,MAAM,IAAA,CAAK,UAAA,CAAW,QAAQ,GAAG,CAAA;AACpD,IAAA,IAAI,CAAC,GAAA,CAAI,IAAA;AACP,MAAA,MAAM,IAAIA,qBAAA,CAAc,CAAA,UAAA,EAAa,MAAM,CAAA,CAAA,EAAI,IAAI,CAAA,oCAAA,CAAsC,CAAA;AAC3F,IAAA,OAAO,GAAA;AAAA,EACT;AAAA,EAEA,MAAc,UAAA,CAAW,MAAA,EAAgB,GAAA,EAAkC;AACzE,IAAA,IAAI,IAAA,GAAgB,EAAA;AACpB,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,IAAA,EAAK;AAC5B,MAAA,IAAI;AACF,QAAA,IAAA,GAAO,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA,GAAI,EAAA;AAAA,MACnC,CAAA,CAAA,MAAQ;AACN,QAAA,IAAA,GAAO,IAAA;AAAA,MACT;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AACA,IAAA,OAAO,IAAIC,gBAAA,CAAS,EAAE,MAAA,EAAQ,GAAA,CAAI,MAAA,EAAQ,GAAA,EAAK,GAAA,CAAI,GAAA,EAAK,MAAA,EAAQ,IAAA,EAAM,CAAA;AAAA,EACxE;AACF;;;AC7SA,gBAAuB,OAAA,CACrB,MACA,MAAA,EACkC;AAClC,EAAA,MAAM,MAAA,GAAS,KAAK,SAAA,EAAU;AAC9B,EAAA,MAAM,OAAA,GAAU,IAAI,WAAA,EAAY;AAChC,EAAA,IAAI,MAAA,GAAS,EAAA;AAEb,EAAA,MAAM,UAAU,MAAM,KAAK,OAAO,MAAA,EAAO,CAAE,MAAM,MAAM;AAAA,EAAC,CAAC,CAAA;AACzD,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,IAAI,OAAO,OAAA,EAAS;AAClB,MAAA,MAAM,MAAA,CAAO,MAAA,EAAO,CAAE,KAAA,CAAM,MAAM;AAAA,MAAC,CAAC,CAAA;AACpC,MAAA;AAAA,IACF;AACA,IAAA,MAAA,CAAO,iBAAiB,OAAA,EAAS,OAAA,EAAS,EAAE,IAAA,EAAM,MAAM,CAAA;AAAA,EAC1D;AAEA,EAAA,IAAI;AACF,IAAA,WAAS;AACP,MAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAM,GAAI,MAAM,OAAO,IAAA,EAAK;AAC1C,MAAA,IAAI,IAAA,EAAM;AACV,MAAA,MAAA,IAAU,QAAQ,MAAA,CAAO,KAAA,EAAO,EAAE,MAAA,EAAQ,MAAM,CAAA;AAGhD,MAAA,IAAI,GAAA;AACJ,MAAA,OAAA,CAAQ,GAAA,GAAM,gBAAA,CAAiB,MAAM,CAAA,MAAO,CAAA,CAAA,EAAI;AAC9C,QAAA,MAAM,QAAA,GAAW,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,GAAG,CAAA;AACpC,QAAA,MAAA,GAAS,MAAA,CAAO,KAAA,CAAM,MAAA,CAAO,MAAA,EAAQ,GAAG,CAAC,CAAA;AACzC,QAAA,MAAMG,QAAAA,GAAU,WAAW,QAAQ,CAAA;AACnC,QAAA,IAAIA,QAAAA,KAAY,KAAA,CAAA,EAAW,MAAM,IAAA,CAAK,MAAMA,QAAO,CAAA;AAAA,MACrD;AAAA,IACF;AAEA,IAAA,MAAM,OAAA,GAAU,WAAW,MAAM,CAAA;AACjC,IAAA,IAAI,OAAA,KAAY,KAAA,CAAA,EAAW,MAAM,IAAA,CAAK,MAAM,OAAO,CAAA;AAAA,EACrD,CAAA,SAAE;AACA,IAAA,IAAI,MAAA,EAAQ,MAAA,CAAO,mBAAA,CAAoB,OAAA,EAAS,OAAO,CAAA;AAEvD,IAAA,MAAM,MAAA,CAAO,MAAA,EAAO,CAAE,KAAA,CAAM,MAAM;AAAA,IAAC,CAAC,CAAA;AACpC,IAAA,MAAA,CAAO,WAAA,EAAY;AAAA,EACrB;AACF;AAGA,SAAS,iBAAiB,CAAA,EAAmB;AAC3C,EAAA,MAAM,CAAA,GAAI,CAAA,CAAE,OAAA,CAAQ,MAAM,CAAA;AAC1B,EAAA,MAAM,CAAA,GAAI,CAAA,CAAE,OAAA,CAAQ,UAAU,CAAA;AAC9B,EAAA,IAAI,CAAA,KAAM,IAAI,OAAO,CAAA;AACrB,EAAA,IAAI,CAAA,KAAM,IAAI,OAAO,CAAA;AACrB,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAC,CAAA;AACtB;AAGA,SAAS,MAAA,CAAO,GAAW,GAAA,EAAqB;AAC9C,EAAA,OAAO,EAAE,UAAA,CAAW,UAAA,EAAY,GAAG,CAAA,GAAI,GAAA,GAAM,IAAI,GAAA,GAAM,CAAA;AACzD;AAOA,SAAS,WAAW,KAAA,EAAmC;AACrD,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,SAAS,CAAA;AACnC,EAAA,MAAM,OAAiB,EAAC;AACxB,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,IAAI,IAAA,KAAS,EAAA,IAAM,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,EAAG;AACzC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,OAAA,CAAQ,GAAG,CAAA;AAC9B,IAAA,MAAM,QAAQ,KAAA,KAAU,EAAA,GAAK,OAAO,IAAA,CAAK,KAAA,CAAM,GAAG,KAAK,CAAA;AACvD,IAAA,IAAI,UAAU,MAAA,EAAQ;AACtB,IAAA,IAAI,QAAQ,KAAA,KAAU,EAAA,GAAK,KAAK,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAC,CAAA;AACpD,IAAA,IAAI,MAAM,UAAA,CAAW,GAAG,GAAG,KAAA,GAAQ,KAAA,CAAM,MAAM,CAAC,CAAA;AAChD,IAAA,IAAA,CAAK,KAAK,KAAK,CAAA;AAAA,EACjB;AACA,EAAA,IAAI,IAAA,CAAK,MAAA,KAAW,CAAA,EAAG,OAAO,MAAA;AAC9B,EAAA,OAAO,IAAA,CAAK,KAAK,IAAI,CAAA;AACvB;;;ACtFA,WAAA,EAAA;AAoBA,IAAM,2BAAW,IAAI,GAAA,CAAI,CAAC,MAAA,EAAQ,OAAA,EAAS,WAAW,CAAC,CAAA;AAehD,IAAM,GAAA,GAAN,MAAM,IAAA,CAAI;AAAA,EACP,IAAA;AAAA,EACS,IAAA;AAAA,EAEjB,WAAA,CAAY,MAAY,IAAA,EAAe;AACrC,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AAAA,EACd;AAAA,EAEA,IAAI,EAAA,GAAa;AACf,IAAA,OAAO,KAAK,IAAA,CAAK,EAAA;AAAA,EACnB;AAAA,EACA,IAAI,MAAA,GAAiB;AACnB,IAAA,OAAO,KAAK,IAAA,CAAK,MAAA;AAAA,EACnB;AAAA,EACA,IAAI,KAAA,GAA4B;AAC9B,IAAA,OAAO,KAAK,IAAA,CAAK,KAAA;AAAA,EACnB;AAAA,EACA,IAAI,MAAA,GAA4B;AAC9B,IAAA,OAAO,KAAK,IAAA,CAAK,MAAA;AAAA,EACnB;AAAA;AAAA,EAEA,IAAI,IAAA,GAAwB;AAC1B,IAAA,OAAO,KAAK,IAAA,CAAK,IAAA;AAAA,EACnB;AAAA;AAAA,EAEA,IAAI,QAAA,GAA+B;AACjC,IAAA,OAAO,KAAK,IAAA,CAAK,QAAA;AAAA,EACnB;AAAA;AAAA,EAEA,IAAI,UAAA,GAAoC;AACtC,IAAA,OAAO,KAAK,IAAA,CAAK,UAAA;AAAA,EACnB;AAAA;AAAA,EAEA,IAAI,UAAA,GAAiC;AACnC,IAAA,OAAO,KAAK,IAAA,CAAK,UAAA;AAAA,EACnB;AAAA;AAAA,EAEA,IAAI,KAAA,GAAiB;AACnB,IAAA,OAAO,IAAA,CAAK,IAAA;AAAA,EACd;AAAA;AAAA,EAGA,OAAO,MAAA,CAAO,IAAA,GAAsB,EAAC,EAAyC;AAC5E,IAAA,MAAM,MAAA,GAAS,KAAK,KAAA,KAAU,MAAA,GAAY,KAAK,CAAA,OAAA,EAAU,kBAAA,CAAmB,IAAA,CAAK,KAAK,CAAC,CAAA,CAAA;AACvF,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,KAAA,EAAO,CAAA,MAAA,EAAS,kBAAA,CAAmB,IAAA,CAAK,EAAE,CAAC,CAAA,OAAA,EAAU,MAAM,CAAA,CAAA,EAAI;AAAA,MAC9F,GAAI,KAAK,MAAA,GAAS,EAAE,QAAQ,IAAA,CAAK,MAAA,KAAW;AAAC,KAC9C,CAAA;AACD,IAAA,WAAA,MAAiB,MAAM,OAAA,CAAe,GAAA,CAAI,IAAA,EAAO,IAAA,CAAK,MAAM,CAAA,EAAG;AAC7D,MAAA,IAAI,CAAC,IAAA,CAAK,mBAAA,IAAuB,EAAA,CAAG,IAAA,KAAS,YAAY,EAAA,CAAG,IAAA,GAAO,QAAQ,CAAA,KAAM,MAAA,EAAQ;AACvF,QAAA;AAAA,MACF;AACA,MAAA,MAAM,EAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA,EAGA,CAAC,MAAA,CAAO,aAAa,CAAA,GAA0C;AAC7D,IAAA,OAAO,KAAK,MAAA,EAAO;AAAA,EACrB;AAAA;AAAA,EAGA,MAAM,MAAA,GAAwB;AAC5B,IAAA,MAAM,IAAA,CAAK,KAAK,OAAA,CAAc,MAAA,EAAQ,SAAS,kBAAA,CAAmB,IAAA,CAAK,EAAE,CAAC,CAAA,OAAA,CAAS,CAAA;AAAA,EACrF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,OAAA,CAAQ,KAAA,GAA2E,EAAC,EAAkB;AAC1G,IAAA,MAAM,IAAA,CAAK,IAAA,CAAK,OAAA,CAAc,MAAA,EAAQ,CAAA,MAAA,EAAS,kBAAA,CAAmB,IAAA,CAAK,EAAE,CAAC,CAAA,QAAA,CAAA,EAAY,EAAE,IAAA,EAAM,OAAO,CAAA;AAAA,EACvG;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,UAAU,IAAA,EAA6B;AAC3C,IAAA,MAAM,IAAA,CAAK,IAAA,CAAK,OAAA,CAAc,MAAA,EAAQ,SAAS,kBAAA,CAAmB,IAAA,CAAK,EAAE,CAAC,UAAU,EAAE,IAAA,EAAM,EAAE,IAAA,IAAQ,CAAA;AAAA,EACxG;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,SAAA,GAA2B;AAC/B,IAAA,MAAM,IAAA,CAAK,KAAK,OAAA,CAAc,MAAA,EAAQ,SAAS,kBAAA,CAAmB,IAAA,CAAK,EAAE,CAAC,CAAA,UAAA,CAAY,CAAA;AAAA,EACxF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,SAAS,KAAA,EAA+B;AAC5C,IAAA,MAAM,IAAA,CAAK,KAAK,OAAA,CAAc,MAAA,EAAQ,SAAS,kBAAA,CAAmB,IAAA,CAAK,EAAE,CAAC,CAAA,UAAA,CAAA,EAAc;AAAA,MACtF,IAAA,EAAM,EAAE,KAAA,EAAO,KAAA,IAAS,EAAA;AAAG,KAC5B,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,kBAAkB,IAAA,EAA6B;AACnD,IAAA,MAAM,IAAA,CAAK,KAAK,OAAA,CAAc,MAAA,EAAQ,SAAS,kBAAA,CAAmB,IAAA,CAAK,EAAE,CAAC,CAAA,oBAAA,CAAA,EAAwB;AAAA,MAChG,IAAA,EAAM,EAAE,IAAA;AAAK,KACd,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,QAAA,GAA2B;AAC/B,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,IAAA,CAAK,OAAA;AAAA,MAC3B,KAAA;AAAA,MACA,CAAA,MAAA,EAAS,kBAAA,CAAmB,IAAA,CAAK,EAAE,CAAC,CAAA,SAAA;AAAA,KACtC;AACA,IAAA,OAAO,IAAA,CAAK,IAAI,CAAC,CAAA,KAAM,IAAI,IAAA,CAAI,IAAA,CAAK,IAAA,EAAM,CAAC,CAAC,CAAA;AAAA,EAC9C;AAAA;AAAA,EAGA,MAAM,OAAA,GAA4B;AAChC,IAAA,IAAA,CAAK,IAAA,GAAO,MAAM,IAAA,CAAK,IAAA,CAAK,OAAA,CAAiB,KAAA,EAAO,CAAA,MAAA,EAAS,kBAAA,CAAmB,IAAA,CAAK,EAAE,CAAC,CAAA,CAAE,CAAA;AAC1F,IAAA,OAAO,IAAA,CAAK,IAAA;AAAA,EACd;AAAA;AAAA,EAGA,MAAM,QAAA,GAAiC;AACrC,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,OAAA,CAAqB,KAAA,EAAO,CAAA,MAAA,EAAS,kBAAA,CAAmB,IAAA,CAAK,EAAE,CAAC,CAAA,SAAA,CAAW,CAAA;AAC5G,IAAA,IAAA,CAAK,OAAO,QAAA,CAAS,GAAA;AACrB,IAAA,OAAO,QAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,IAAA,CAAK,IAAA,GAAmD,EAAC,EAAwB;AACrF,IAAA,IAAI,MAAA;AACJ,IAAA,IAAI,WAAA;AACJ,IAAA,WAAA,MAAiB,EAAA,IAAM,IAAA,CAAK,MAAA,CAAO,IAAI,CAAA,EAAG;AACxC,MAAA,IAAI,EAAA,CAAG,IAAA,KAAS,QAAA,EAAU,MAAA,GAAS,EAAA,CAAG,MAAA;AAAA,WAAA,IAC7B,EAAA,CAAG,IAAA,KAAS,OAAA,EAAS,WAAA,GAAc,EAAA,CAAG,KAAA;AAAA,IACjD;AACA,IAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,OAAA,EAAQ;AAC/B,IAAA,IAAI,IAAA,CAAK,iBAAiB,KAAA,EAAO;AAC/B,MAAA,IAAI,QAAA,CAAS,GAAA,CAAI,GAAA,CAAI,MAAM,CAAA,EAAG;AAC5B,QAAA,IAAI,GAAA,CAAI,WAAW,MAAA,EAAQ;AACzB,UAAA,MAAM,IAAIF,uBAAe,GAAA,CAAI,EAAA,EAAI,IAAI,MAAA,EAAQ,GAAA,CAAI,SAAS,WAAW,CAAA;AAAA,QACvE;AAAA,MACF,CAAA,MAAO;AAIL,QAAA,MAAM,IAAIA,sBAAA;AAAA,UACR,GAAA,CAAI,EAAA;AAAA,UACJ,GAAA,CAAI,MAAA;AAAA,UACJ,WAAA,IAAe;AAAA,SACjB;AAAA,MACF;AAAA,IACF;AACA,IAAA,OAAO,WAAW,MAAA,GAAY,EAAE,KAAK,MAAA,EAAO,GAAI,EAAE,GAAA,EAAI;AAAA,EACxD;AACF;;;AC7EO,IAAM,uBAAN,MAA2B;AAAA,EAChC,YAA6B,EAAA,EAAc;AAAd,IAAA,IAAA,CAAA,EAAA,GAAA,EAAA;AAAA,EAAe;AAAA,EAAf,EAAA;AAAA,EAC7B,MAAM,IAAA,CAAK,UAAA,GAAa,KAAA,EAAoC;AAC1D,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,GAAG,IAAA,CAAK,OAAA,CAA4C,OAAO,uBAAA,EAAyB;AAAA,MAC9G,KAAA,EAAO,EAAE,MAAA,EAAQ,UAAA;AAAW,KAC7B,CAAA;AACD,IAAA,OAAO,QAAA,CAAS,UAAA;AAAA,EAClB;AAAA,EACA,IAAI,EAAA,EAAuC;AACzC,IAAA,OAAO,IAAA,CAAK,GAAG,IAAA,CAAK,OAAA,CAAQ,OAAO,CAAA,sBAAA,EAAyB,kBAAA,CAAmB,EAAE,CAAC,CAAA,CAAE,CAAA;AAAA,EACtF;AAAA,EACA,OAAO,EAAA,EAAuC;AAC5C,IAAA,OAAO,IAAA,CAAK,GAAG,IAAA,CAAK,OAAA,CAAQ,QAAQ,CAAA,sBAAA,EAAyB,kBAAA,CAAmB,EAAE,CAAC,CAAA,OAAA,CAAS,CAAA;AAAA,EAC9F;AAAA,EACA,KAAA,CAAM,IAAY,IAAA,EAA+C;AAC/D,IAAA,OAAO,IAAA,CAAK,EAAA,CAAG,IAAA,CAAK,OAAA,CAAQ,QAAQ,CAAA,sBAAA,EAAyB,kBAAA,CAAmB,EAAE,CAAC,UAAU,EAAE,IAAA,EAAM,EAAE,IAAA,IAAQ,CAAA;AAAA,EACjH;AAAA;AAAA;AAAA;AAAA,EAIA,OAAO,KAAA,CAAM,EAAA,EAAY,IAAA,GAAiC,EAAC,EAAqC;AAC9F,IAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,IAAA,MAAM,KAAA,GAAQ,MAAM,UAAA,CAAW,KAAA,EAAM;AACrC,IAAA,IAAA,CAAK,QAAQ,gBAAA,CAAiB,OAAA,EAAS,OAAO,EAAE,IAAA,EAAM,MAAM,CAAA;AAC5D,IAAA,IAAI,IAAA,CAAK,MAAA,EAAQ,OAAA,EAAS,UAAA,CAAW,KAAA,EAAM;AAC3C,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,EAAA,CAAG,IAAA,CAAK,IAAA,CAAK,KAAA,EAAO,CAAA,sBAAA,EAAyB,kBAAA,CAAmB,EAAE,CAAC,CAAA,OAAA,CAAA,EAAW;AAAA,QACxG,QAAQ,UAAA,CAAW;AAAA,OACpB,CAAA;AACD,MAAA,IAAI,QAAA,GAAW,CAAA,CAAA;AACf,MAAA,WAAA,MAAiB,aAAa,OAAA,CAA0B,QAAA,CAAS,IAAA,EAAO,UAAA,CAAW,MAAM,CAAA,EAAG;AAC1F,QAAA,IAAI,SAAA,CAAU,WAAW,QAAA,EAAU;AAAE,UAAA,QAAA,GAAW,SAAA,CAAU,QAAA;AAAU,UAAA,MAAM,SAAA;AAAA,QAAW;AAAA,MACvF;AAAA,IACF,CAAA,SAAE;AACA,MAAA,UAAA,CAAW,KAAA,EAAM;AACjB,MAAA,IAAA,CAAK,MAAA,EAAQ,mBAAA,CAAoB,OAAA,EAAS,KAAK,CAAA;AAAA,IACjD;AAAA,EACF;AACF;AA+DO,IAAM,sBAAN,MAAqD;AAAA,EAC1D,WAAA,CAA6B,IAA+B,IAAA,EAAqB;AAApD,IAAA,IAAA,CAAA,EAAA,GAAA,EAAA;AAA+B,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAsB;AAAA,EAArD,EAAA;AAAA,EAA+B,IAAA;AAAA;AAAA,EAG5D,GAAA,CAAI,EAAA,EAAY,MAAA,EAA2B,gBAAA,EAAuD;AAChG,IAAA,OAAO,IAAA,CAAK,EAAA,CAAG,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAO,CAAA,WAAA,EAAc,IAAA,CAAK,IAAI,CAAA,CAAA,EAAI,kBAAA,CAAmB,EAAE,CAAC,CAAA,CAAA,EAAI;AAAA,MACtF,IAAA,EAAM,EAAE,MAAA,EAAQ,gBAAA;AAAiB,KAClC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAA,CAAO,IAAY,QAAA,EAA8C;AAC/D,IAAA,OAAO,IAAA,CAAK,EAAA,CAAG,IAAA,CAAK,OAAA,CAAQ,QAAA,EAAU,CAAA,WAAA,EAAc,IAAA,CAAK,IAAI,CAAA,CAAA,EAAI,kBAAA,CAAmB,EAAE,CAAC,CAAA,CAAA,EAAI;AAAA,MACzF,KAAA,EAAO,EAAE,QAAA;AAAS,KACnB,CAAA;AAAA,EACH;AACF;AAGO,IAAM,eAAN,MAAmB;AAAA,EAOxB,YAA6B,EAAA,EAAc;AAAd,IAAA,IAAA,CAAA,EAAA,GAAA,EAAA;AAC3B,IAAA,IAAA,CAAK,GAAA,GAAM,IAAI,YAAA,CAAa,EAAE,CAAA;AAC9B,IAAA,IAAA,CAAK,UAAA,GAAa,IAAI,oBAAA,CAAqB,EAAE,CAAA;AAC7C,IAAA,IAAA,CAAK,MAAA,GAAS,IAAI,mBAAA,CAAoB,EAAA,EAAI,QAAQ,CAAA;AAClD,IAAA,IAAA,CAAK,QAAA,GAAW,IAAI,mBAAA,CAAoB,EAAA,EAAI,UAAU,CAAA;AACtD,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAI,mBAAA,CAAoB,EAAA,EAAI,OAAO,CAAA;AAAA,EAClD;AAAA,EAN6B,EAAA;AAAA,EANpB,GAAA;AAAA,EACA,UAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA;AAAA,EAUT,QAAA,GAAuC;AAAE,IAAA,OAAO,IAAA,CAAK,EAAA,CAAG,IAAA,CAAK,OAAA,CAAQ,OAAO,YAAY,CAAA;AAAA,EAAG;AAAA;AAAA,EAG3F,cAAc,OAAA,EAAoD;AAChE,IAAA,OAAO,IAAA,CAAK,GAAG,IAAA,CAAK,OAAA,CAAQ,QAAQ,qBAAA,EAAuB,EAAE,IAAA,EAAM,OAAA,EAAS,CAAA;AAAA,EAC9E;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAA,CAAmB,IAAY,OAAA,EAA0D;AACvF,IAAA,OAAO,IAAA,CAAK,EAAA,CAAG,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,CAAA,oBAAA,EAAuB,kBAAA,CAAmB,EAAE,CAAC,CAAA,OAAA,CAAA,EAAW,EAAE,IAAA,EAAM,SAAS,CAAA;AAAA,EAC/G;AAAA;AAAA;AAAA;AAAA,EAKA,OAAA,CAAQ,OAAe,WAAA,EAAiD;AACtE,IAAA,OAAO,IAAA,CAAK,EAAA,CAAG,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAO,oBAAA,EAAsB,EAAE,KAAA,EAAO,EAAE,KAAA,EAAO,WAAA,EAAY,EAAG,CAAA;AAAA,EAC5F;AAAA;AAAA,EAGA,OAAO,OAAA,EAAsD;AAC3D,IAAA,OAAO,IAAA,CAAK,GAAG,IAAA,CAAK,OAAA,CAAQ,QAAQ,mBAAA,EAAqB,EAAE,IAAA,EAAM,OAAA,EAAS,CAAA;AAAA,EAC5E;AACF;AAGO,IAAM,eAAN,MAAmB;AAAA,EACxB,YAA6B,EAAA,EAAc;AAAd,IAAA,IAAA,CAAA,EAAA,GAAA,EAAA;AAAA,EAAe;AAAA,EAAf,EAAA;AAAA;AAAA,EAE7B,QAAA,CAAS,OAAA,GAAiD,EAAC,EAAiC;AAC1F,IAAA,OAAO,IAAA,CAAK,GAAG,IAAA,CAAK,OAAA,CAAQ,OAAO,yBAAA,EAA2B,EAAE,KAAA,EAAO,OAAA,EAAS,CAAA;AAAA,EAClF;AAAA;AAAA;AAAA,EAGA,WAAA,CAAY,MAAA,EAA2B,OAAA,GAAiD,EAAC,EAAiC;AACxH,IAAA,OAAO,IAAA,CAAK,EAAA,CAAG,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAO,yBAAA,EAA2B,EAAE,KAAA,EAAO,OAAA,EAAS,IAAA,EAAM,MAAA,EAAQ,CAAA;AAAA,EAChG;AAAA,EACA,KAAA,GAAiC;AAC/B,IAAA,OAAO,IAAA,CAAK,EAAA,CAAG,IAAA,CAAK,OAAA,CAAQ,OAAO,gBAAgB,CAAA;AAAA,EACrD;AAAA,EACA,UAAA,CAAW,YAAkC,IAAA,EAA6C;AACxF,IAAA,OAAO,IAAA,CAAK,EAAA,CAAG,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAO,gBAAA,EAAkB,EAAE,IAAA,EAAM,EAAE,UAAA,EAAY,IAAA,EAAK,EAAG,CAAA;AAAA,EACrF;AAAA,EACA,OAAO,YAAA,EAA+C;AACpD,IAAA,OAAO,IAAA,CAAK,GAAG,IAAA,CAAK,OAAA,CAAQ,UAAU,CAAA,2BAAA,EAA8B,kBAAA,CAAmB,YAAY,CAAC,CAAA,CAAE,CAAA;AAAA,EACxG;AAAA,EACA,QAAQ,SAAA,EAA6C;AACnD,IAAA,OAAO,IAAA,CAAK,GAAG,IAAA,CAAK,OAAA,CAAQ,OAAO,CAAA,oBAAA,EAAuB,kBAAA,CAAmB,SAAS,CAAC,CAAA,IAAA,CAAM,CAAA;AAAA,EAC/F;AAAA,EACA,UAAA,CAAW,SAAA,EAAmB,UAAA,EAAkC,gBAAA,EAA0B,IAAA,EAAgD;AACxI,IAAA,OAAO,IAAA,CAAK,GAAG,IAAA,CAAK,OAAA,CAAQ,OAAO,CAAA,oBAAA,EAAuB,kBAAA,CAAmB,SAAS,CAAC,CAAA,IAAA,CAAA,EAAQ;AAAA,MAC7F,IAAA,EAAM,EAAE,UAAA,EAAY,gBAAA,EAAkB,IAAA;AAAK,KAC5C,CAAA;AAAA,EACH;AAAA;AAAA,EAEA,GAAA,CAAI,SAAA,EAAmB,SAAA,EAAsC,IAAA,EAAiD;AAC5G,IAAA,OAAO,KAAK,EAAA,CAAG,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,uBAAuB,kBAAA,CAAmB,SAAS,CAAC,CAAA,KAAA,EAAQ,SAAS,CAAA,CAAA,EAAI,EAAE,MAAM,EAAE,IAAA,IAAQ,CAAA;AAAA,EACjI;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,CAAM,WAAmB,OAAA,EAAqD;AAC5E,IAAA,OAAO,IAAA,CAAK,EAAA,CAAG,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,CAAA,oBAAA,EAAuB,kBAAA,CAAmB,SAAS,CAAC,CAAA,eAAA,CAAA,EAAmB,EAAE,IAAA,EAAM,SAAS,CAAA;AAAA,EAC9H;AAAA,EACA,MAAM,UAAA,CAAW,SAAA,EAAmB,UAAA,GAAa,KAAA,EAAgC;AAC/E,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,EAAA,CAAG,IAAA,CAAK,OAAA;AAAA,MAAwC,KAAA;AAAA,MACxE,CAAA,oBAAA,EAAuB,kBAAA,CAAmB,SAAS,CAAC,CAAA,eAAA,CAAA;AAAA,MAAmB,EAAE,KAAA,EAAO,EAAE,QAAQ,UAAA,EAAY,cAAA,EAAgB,GAAE;AAAE,KAAC;AAC7H,IAAA,OAAO,MAAA,CAAO,UAAA;AAAA,EAChB;AAAA,EACA,UAAU,EAAA,EAAmC;AAC3C,IAAA,OAAO,IAAA,CAAK,GAAG,IAAA,CAAK,OAAA,CAAQ,OAAO,CAAA,0BAAA,EAA6B,kBAAA,CAAmB,EAAE,CAAC,CAAA,CAAE,CAAA;AAAA,EAC1F;AAAA,EACA,OAAO,EAAA,EAAmC;AACxC,IAAA,OAAO,IAAA,CAAK,GAAG,IAAA,CAAK,OAAA,CAAQ,QAAQ,CAAA,0BAAA,EAA6B,kBAAA,CAAmB,EAAE,CAAC,CAAA,OAAA,CAAS,CAAA;AAAA,EAClG;AAAA;AAAA,EAEA,OAAO,KAAA,CAAM,EAAA,EAAY,IAAA,GAAiC,EAAC,EAAiC;AAC1F,IAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,IAAA,MAAM,KAAA,GAAQ,MAAM,UAAA,CAAW,KAAA,EAAM;AACrC,IAAA,IAAA,CAAK,QAAQ,gBAAA,CAAiB,OAAA,EAAS,OAAO,EAAE,IAAA,EAAM,MAAM,CAAA;AAC5D,IAAA,IAAI,IAAA,CAAK,MAAA,EAAQ,OAAA,EAAS,UAAA,CAAW,KAAA,EAAM;AAC3C,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,EAAA,CAAG,IAAA,CAAK,IAAA,CAAK,KAAA,EAAO,CAAA,0BAAA,EAA6B,kBAAA,CAAmB,EAAE,CAAC,CAAA,OAAA,CAAA,EAAW;AAAA,QAC5G,QAAQ,UAAA,CAAW;AAAA,OACpB,CAAA;AACD,MAAA,IAAI,QAAA,GAAW,CAAA,CAAA;AACf,MAAA,WAAA,MAAiB,aAAa,OAAA,CAAsB,QAAA,CAAS,IAAA,EAAO,UAAA,CAAW,MAAM,CAAA,EAAG;AACtF,QAAA,IAAI,SAAA,CAAU,WAAW,QAAA,EAAU;AAAE,UAAA,QAAA,GAAW,SAAA,CAAU,QAAA;AAAU,UAAA,MAAM,SAAA;AAAA,QAAW;AAAA,MACvF;AAAA,IACF,CAAA,SAAE;AACA,MAAA,UAAA,CAAW,KAAA,EAAM;AACjB,MAAA,IAAA,CAAK,MAAA,EAAQ,mBAAA,CAAoB,OAAA,EAAS,KAAK,CAAA;AAAA,IACjD;AAAA,EACF;AACF;;;ACtSO,IAAM,cAAN,MAAkB;AAAA,EACvB,YAA6B,EAAA,EAAc;AAAd,IAAA,IAAA,CAAA,EAAA,GAAA,EAAA;AAAA,EAAe;AAAA,EAAf,EAAA;AAAA,EAC7B,IAAA,GAAmC;AAAE,IAAA,OAAO,IAAA,CAAK,EAAA,CAAG,IAAA,CAAK,OAAA,CAAQ,OAAO,WAAW,CAAA;AAAA,EAAG;AAAA,EACtF,MAAA,CAAO,UAAU,KAAA,EAAiC;AAChD,IAAA,OAAO,IAAA,CAAK,EAAA,CAAG,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAO,mBAAA,EAAqB,EAAE,KAAA,EAAO,EAAE,OAAA,EAAQ,EAAG,CAAA;AAAA,EAChF;AAAA,EACA,KAAK,OAAA,EAAmD;AACtD,IAAA,OAAO,IAAA,CAAK,GAAG,IAAA,CAAK,OAAA,CAAQ,OAAO,2BAAA,EAA6B,EAAE,IAAA,EAAM,OAAA,EAAS,CAAA;AAAA,EACnF;AAAA,EACA,KAAK,OAAA,EAAsD;AACzD,IAAA,OAAO,IAAA,CAAK,GAAG,IAAA,CAAK,OAAA,CAAQ,QAAQ,4BAAA,EAA8B,EAAE,IAAA,EAAM,OAAA,EAAS,CAAA;AAAA,EACrF;AAAA,EACA,OAAA,CAAQ,IAAY,OAAA,EAAyD;AAC3E,IAAA,OAAO,IAAA,CAAK,EAAA,CAAG,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,CAAA,2BAAA,EAA8B,kBAAA,CAAmB,EAAE,CAAC,CAAA,QAAA,CAAA,EAAY,EAAE,IAAA,EAAM,SAAS,CAAA;AAAA,EACvH;AAAA,EACA,MAAM,EAAA,EAA0C;AAC9C,IAAA,OAAO,IAAA,CAAK,GAAG,IAAA,CAAK,OAAA,CAAQ,UAAU,CAAA,2BAAA,EAA8B,kBAAA,CAAmB,EAAE,CAAC,CAAA,CAAE,CAAA;AAAA,EAC9F;AAAA,EACA,QAAQ,EAAA,EAAqC;AAC3C,IAAA,OAAO,IAAA,CAAK,GAAG,IAAA,CAAK,OAAA,CAAQ,QAAQ,CAAA,2BAAA,EAA8B,kBAAA,CAAmB,EAAE,CAAC,CAAA,SAAA,CAAW,CAAA;AAAA,EACrG;AAAA,EACA,OAAO,OAAA,EAAwD;AAC7D,IAAA,OAAO,IAAA,CAAK,GAAG,IAAA,CAAK,OAAA,CAAQ,QAAQ,2BAAA,EAA6B,EAAE,IAAA,EAAM,OAAA,EAAS,CAAA;AAAA,EACpF;AAAA,EACA,QAAQ,EAAA,EAAqC;AAC3C,IAAA,OAAO,IAAA,CAAK,GAAG,IAAA,CAAK,OAAA,CAAQ,OAAO,CAAA,0BAAA,EAA6B,kBAAA,CAAmB,EAAE,CAAC,CAAA,CAAE,CAAA;AAAA,EAC1F;AAAA,EACA,SAAS,EAAA,EAAsC;AAC7C,IAAA,OAAO,IAAA,CAAK,GAAG,IAAA,CAAK,OAAA,CAAQ,OAAO,CAAA,WAAA,EAAc,kBAAA,CAAmB,EAAE,CAAC,CAAA,CAAE,CAAA;AAAA,EAC3E;AAAA;AAAA,EAEA,OAAO,KAAA,CAAM,IAAA,GAAiC,EAAC,EAAoC;AACjF,IAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,IAAA,MAAM,KAAA,GAAQ,MAAM,UAAA,CAAW,KAAA,EAAM;AACrC,IAAA,IAAA,CAAK,QAAQ,gBAAA,CAAiB,OAAA,EAAS,OAAO,EAAE,IAAA,EAAM,MAAM,CAAA;AAC5D,IAAA,IAAI,IAAA,CAAK,MAAA,EAAQ,OAAA,EAAS,UAAA,CAAW,KAAA,EAAM;AAC3C,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,EAAA,CAAG,IAAA,CAAK,IAAA,CAAK,KAAA,EAAO,0BAAA,EAA4B,EAAE,MAAA,EAAQ,UAAA,CAAW,MAAA,EAAQ,CAAA;AACzG,MAAA,IAAI,QAAA;AACJ,MAAA,IAAI,QAAA,GAAW,CAAA,CAAA;AACf,MAAA,WAAA,MAAiB,YAAY,OAAA,CAAyB,QAAA,CAAS,IAAA,EAAO,UAAA,CAAW,MAAM,CAAA,EAAG;AACxF,QAAA,IAAI,QAAA,KAAa,QAAA,CAAS,UAAA,IAAc,QAAA,CAAS,WAAW,QAAA,EAAU;AACpE,UAAA,QAAA,GAAW,QAAA,CAAS,UAAA;AAAY,UAAA,QAAA,GAAW,QAAA,CAAS,QAAA;AAAU,UAAA,MAAM,QAAA;AAAA,QACtE;AAAA,MACF;AAAA,IACF,CAAA,SAAE;AACA,MAAA,UAAA,CAAW,KAAA,EAAM;AAAG,MAAA,IAAA,CAAK,MAAA,EAAQ,mBAAA,CAAoB,OAAA,EAAS,KAAK,CAAA;AAAA,IACrE;AAAA,EACF;AACF;;;ACxGO,IAAM,aAAN,MAAiB;AAAA,EACtB,YAA6B,MAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAAA,EAAmB;AAAA,EAAnB,MAAA;AAAA,EAE7B,YAAA,GAA4C;AAC1C,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,OAAA,CAAQ,OAAO,iBAAiB,CAAA;AAAA,EAC1D;AAAA;AAAA;AAAA,EAIA,aAAA,GAA6C;AAC3C,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,OAAA,CAAQ,QAAQ,iBAAiB,CAAA;AAAA,EAC3D;AAAA,EAEA,cAAc,EAAA,EAAsC;AAClD,IAAA,OAAO,IAAA,CAAK,OAAO,IAAA,CAAK,OAAA,CAAQ,UAAU,CAAA,gBAAA,EAAmB,kBAAA,CAAmB,EAAE,CAAC,CAAA,CAAE,CAAA;AAAA,EACvF;AACF;;;ACPO,IAAM,eAAN,MAAmB;AAAA,EAExB,YAA6B,MAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAAoB,IAAA,IAAA,CAAK,SAAA,GAAY,IAAI,YAAA,CAAa,MAAM,CAAA;AAAA,EAAG;AAAA,EAA/D,MAAA;AAAA,EADpB,SAAA;AAAA,EAET,IAAA,GAA+B;AAAE,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,OAAA,CAAQ,OAAO,iBAAiB,CAAA;AAAA,EAAG;AAAA,EAC5F,SAAA,GAAoC;AAAE,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,OAAA,CAAQ,OAAO,sBAAsB,CAAA;AAAA,EAAG;AAAA,EACtG,KAAA,CAAM,IAAA,GAAO,EAAA,EAAI,KAAA,EAA0C;AACzD,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAO,kBAAA,EAAoB,EAAE,KAAA,EAAO,EAAE,IAAA,EAAM,KAAA,EAAM,EAAG,CAAA;AAAA,EACvF;AAAA,EACA,KAAK,IAAA,EAA6C;AAAE,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAO,iBAAA,EAAmB,EAAE,KAAA,EAAO,EAAE,IAAA,EAAK,EAAG,CAAA;AAAA,EAAG;AAAA,EACpI,KAAA,CAAM,MAAc,OAAA,EAA2C;AAC7D,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAO,iBAAA,EAAmB,EAAE,IAAA,EAAM,EAAE,IAAA,EAAM,OAAA,EAAQ,EAAG,CAAA;AAAA,EACvF;AAAA,EACA,OAAO,IAAA,EAAwC;AAAE,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,OAAA,CAAQ,QAAA,EAAU,iBAAA,EAAmB,EAAE,KAAA,EAAO,EAAE,IAAA,EAAK,EAAG,CAAA;AAAA,EAAG;AAAA,EACpI,IAAA,CAAK,SAA+B,MAAA,EAAoD;AACtF,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,mBAAmB,EAAE,IAAA,EAAM,OAAA,EAAS,MAAA,EAAQ,CAAA;AAAA,EACtF;AAAA;AAAA,EAEA,OAAO,MAAA,CAAO,OAAA,EAA+B,MAAA,EAA0D;AACrG,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,MAAA,EAAQ,wBAAA,EAA0B,EAAE,IAAA,EAAM,OAAA,EAAS,MAAA,EAAQ,CAAA;AACxG,IAAA,OAAO,OAAA,CAA4B,QAAA,CAAS,IAAA,EAAO,MAAM,CAAA;AAAA,EAC3D;AACF;AACO,IAAM,eAAN,MAAmB;AAAA,EACxB,YAA6B,MAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAAA,EAAmB;AAAA,EAAnB,MAAA;AAAA,EAC7B,KAAK,SAAA,EAA8C;AAAE,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAO,sBAAA,EAAwB,EAAE,KAAA,EAAO,EAAE,SAAA,EAAU,EAAG,CAAA;AAAA,EAAG;AAAA,EAC/I,KAAK,OAAA,EAAkD;AAAE,IAAA,OAAO,IAAA,CAAK,OAAO,IAAA,CAAK,OAAA,CAAQ,QAAQ,sBAAA,EAAwB,EAAE,IAAA,EAAM,OAAA,EAAS,CAAA;AAAA,EAAG;AAAA,EAC7I,IAAI,EAAA,EAAoC;AAAE,IAAA,OAAO,IAAA,CAAK,OAAO,IAAA,CAAK,OAAA,CAAQ,OAAO,IAAA,CAAK,IAAA,CAAK,EAAE,CAAC,CAAA;AAAA,EAAG;AAAA,EACjG,MAAM,EAAA,EAAsC;AAAE,IAAA,OAAO,IAAA,CAAK,OAAO,IAAA,CAAK,OAAA,CAAQ,UAAU,IAAA,CAAK,IAAA,CAAK,EAAE,CAAC,CAAA;AAAA,EAAG;AAAA,EACxG,KAAA,CAAM,IAAY,KAAA,EAAkE;AAClF,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,OAAA,CAAQ,QAAQ,CAAA,EAAG,IAAA,CAAK,IAAA,CAAK,EAAE,CAAC,CAAA,MAAA,CAAA,EAAU,EAAE,IAAA,EAAM,OAAO,CAAA;AAAA,EACnF;AAAA,EACA,MAAA,CAAO,EAAA,EAAY,OAAA,EAAiB,IAAA,EAAsC;AACxE,IAAA,OAAO,KAAK,MAAA,CAAO,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAO,GAAG,IAAA,CAAK,IAAA,CAAK,EAAE,CAAC,SAAS,EAAE,IAAA,EAAM,EAAE,OAAA,EAAS,IAAA,IAAQ,CAAA;AAAA,EAC7F;AAAA;AAAA,EAEA,OAAO,MAAA,CAAO,EAAA,EAAY,KAAA,GAAQ,GAAG,MAAA,EAAqD;AACxF,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,OAAO,IAAA,CAAK,IAAA,CAAK,OAAO,CAAA,EAAG,IAAA,CAAK,KAAK,EAAE,CAAC,WAAW,EAAE,KAAA,EAAO,EAAE,KAAA,EAAM,EAAG,QAAQ,CAAA;AAC3G,IAAA,OAAO,OAAA,CAAuB,QAAA,CAAS,IAAA,EAAO,MAAM,CAAA;AAAA,EACtD;AAAA,EACQ,KAAK,EAAA,EAAoB;AAAE,IAAA,OAAO,CAAA,qBAAA,EAAwB,kBAAA,CAAmB,EAAE,CAAC,CAAA,CAAA;AAAA,EAAI;AAC9F;;;ACvCO,IAAM,cAAN,MAAkB;AAAA,EACvB,YAA6B,MAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAAA,EAAmB;AAAA,EAAnB,MAAA;AAAA,EAC7B,IAAA,GAA8B;AAAE,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,OAAA,CAAQ,OAAO,WAAW,CAAA;AAAA,EAAG;AAAA,EACrF,UAAU,MAAA,EAAgD;AACxD,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAO,kBAAA,EAAoB,EAAE,IAAA,EAAM,EAAE,MAAA,EAAO,EAAG,CAAA;AAAA,EACjF;AAAA,EACA,YAAA,GAAwC;AAAE,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,OAAA,CAAQ,OAAO,kBAAkB,CAAA;AAAA,EAAG;AAAA,EACtG,cAAc,OAAA,EAA0C;AACtD,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,kBAAA,EAAoB,EAAE,IAAA,EAAM,EAAE,OAAA,EAAQ,EAAG,CAAA;AAAA,EACnF;AAAA,EACA,OAAO,MAAA,EAAsD;AAC3D,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,oBAAA,EAAsB,EAAE,IAAA,EAAM,EAAE,MAAA,EAAO,EAAG,CAAA;AAAA,EACpF;AAAA,EACA,QAAQ,EAAA,EAAsC;AAAE,IAAA,OAAO,IAAA,CAAK,OAAO,IAAA,CAAK,OAAA,CAAQ,OAAO,CAAA,mBAAA,EAAsB,kBAAA,CAAmB,EAAE,CAAC,CAAA,CAAE,CAAA;AAAA,EAAG;AAAA,EACxI,eAAA,CAAgB,IAAY,SAAA,EAA6C;AACvE,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,OAAA,CAAQ,QAAQ,CAAA,mBAAA,EAAsB,kBAAA,CAAmB,EAAE,CAAC,aAAa,EAAE,IAAA,EAAM,EAAE,SAAA,IAAa,CAAA;AAAA,EAC1H;AAAA,EACA,MAAA,CAAO,EAAA,EAAY,SAAA,EAAmB,OAAA,EAAoE;AACxG,IAAA,OAAO,KAAK,MAAA,CAAO,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,sBAAsB,kBAAA,CAAmB,EAAE,CAAC,CAAA,SAAA,CAAA,EAAa,EAAE,IAAA,EAAM,EAAE,SAAA,EAAW,OAAA,IAAW,CAAA;AAAA,EACnI;AAAA,EACA,OAAA,GAAqC;AAAE,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,OAAA,CAAQ,OAAO,mBAAmB,CAAA;AAAA,EAAG;AAAA,EACpG,OAAO,EAAA,EAAsC;AAAE,IAAA,OAAO,IAAA,CAAK,OAAO,IAAA,CAAK,OAAA,CAAQ,UAAU,CAAA,kBAAA,EAAqB,kBAAA,CAAmB,EAAE,CAAC,CAAA,CAAE,CAAA;AAAA,EAAG;AAAA,EACzI,QAAA,GAAuC;AAAE,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,OAAA,CAAQ,OAAO,oBAAoB,CAAA;AAAA,EAAG;AAAA;AAAA;AAAA,EAGvG,QAAQ,OAAA,EAA2D;AACjE,IAAA,OAAO,IAAA,CAAK,OAAO,IAAA,CAAK,OAAA,CAAQ,QAAQ,oBAAA,EAAsB,EAAE,IAAA,EAAM,OAAA,EAAS,CAAA;AAAA,EACjF;AAAA,EACA,aAAa,EAAA,EAAsC;AACjD,IAAA,OAAO,IAAA,CAAK,OAAO,IAAA,CAAK,OAAA,CAAQ,UAAU,CAAA,mBAAA,EAAsB,kBAAA,CAAmB,EAAE,CAAC,CAAA,CAAE,CAAA;AAAA,EAC1F;AACF;AAGO,SAAS,mBAAmB,UAAA,EAAwC;AAEzE,EAAA,MAAM,KAAA,GAAQ,IAAI,WAAA,EAAY,CAAE,OAAO,IAAA,CAAK,SAAA,CAAU,UAAU,CAAC,CAAA;AACjE,EAAA,IAAI,MAAA,GAAS,EAAA;AACb,EAAA,KAAA,MAAW,IAAA,IAAQ,KAAA,EAAO,MAAA,IAAU,MAAA,CAAO,aAAa,IAAI,CAAA;AAC5D,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,MAAM,CAAA,CAAE,QAAQ,KAAA,EAAO,GAAG,CAAA,CAAE,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAA,CAAE,OAAA,CAAQ,OAAO,EAAE,CAAA;AACtF,EAAA,OAAO,uBAAuB,OAAO,CAAA,CAAA;AACvC;;;AC/DA,WAAA,EAAA;;;ACDA,WAAA,EAAA;;;ACMO,IAAM,WAAA,GACmC,QAAA;;;ADShD,SAAS,SAAA,CAAU,UAAkB,IAAA,EAA2D;AAC9F,EAAA,IAAI,CAAE,CAAC,QAAA,EAAU,OAAA,EAAS,OAAO,EAAe,QAAA,CAAS,QAAQ,CAAA,IAAK,CAAE,CAAC,KAAA,EAAO,OAAO,CAAA,CAAe,QAAA,CAAS,IAAI,CAAA,EAAG;AACpH,IAAA,MAAM,IAAIF,qBAAA,CAAc,CAAA,gCAAA,EAAmC,QAAQ,CAAA,CAAA,EAAI,IAAI,CAAA,CAAE,CAAA;AAAA,EAC/E;AACF;AAEA,SAAS,SAAA,CAAU,OAAA,EAAiB,QAAA,EAA0B,IAAA,EAA0B;AACtF,EAAA,MAAM,eAAA,GAAkB,QAAA,KAAa,OAAA,GAAU,SAAA,GAAY,QAAA;AAC3D,EAAA,MAAM,WAAA,GAAc,IAAA,KAAS,KAAA,GAAQ,OAAA,GAAU,IAAA;AAC/C,EAAA,OAAO,CAAA,WAAA,EAAc,OAAO,CAAA,CAAA,EAAI,eAAe,CAAA,CAAA,EAAI,WAAW,CAAA,EAAG,QAAA,KAAa,OAAA,GAAU,MAAA,GAAS,EAAE,CAAA,CAAA;AACrG;AAEA,SAAS,WAAA,CAAY,MAAc,KAAA,EAAmC;AACpE,EAAA,MAAM,IAAA,GAAO,KAAK,KAAA,CAAM,IAAI,EAAE,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,EAAK,CAAE,SAAS,CAAA,CAAA,EAAI,KAAK,CAAA,CAAE,CAAA,IAAK,CAAA,CAAE,IAAA,GAAO,QAAA,CAAS,CAAA,EAAA,EAAK,KAAK,CAAA,CAAE,CAAC,CAAA;AAC3G,EAAA,MAAM,OAAO,IAAA,EAAM,IAAA,GAAO,KAAA,CAAM,KAAK,EAAE,CAAC,CAAA;AACxC,EAAA,OAAO,QAAQ,iBAAA,CAAkB,IAAA,CAAK,IAAI,CAAA,GAAI,IAAA,CAAK,aAAY,GAAI,MAAA;AACrE;AAGA,eAAsB,kBAAA,CAAmB,IAAA,GAAkC,EAAC,EAAoB;AAC9F,EAAA,MAAM,IAAA,GAAO,UAAA;AACb,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,OAAA,EAAS,QAAA;AAChD,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,IAAA,IAAQ,IAAA,CAAK,OAAA,EAAS,IAAA;AACxC,EAAA,SAAA,CAAU,QAAA,IAAY,SAAA,EAAW,IAAA,IAAQ,SAAS,CAAA;AAClD,EAAA,MAAM,cAAA,GAAiB,QAAA;AACvB,EAAA,MAAM,UAAA,GAAa,IAAA;AACnB,EAAA,MAAM,OAAA,GAAU,KAAK,OAAA,IAAW,WAAA;AAChC,EAAA,IAAI,CAAC,8CAAA,CAA+C,IAAA,CAAK,OAAO,CAAA,EAAG;AACjE,IAAA,MAAM,IAAIA,qBAAA,CAAc,CAAA,6DAAA,EAAgE,OAAO,CAAA,CAAE,CAAA;AAAA,EACnG;AAEA,EAAA,MAAM,IAAA,GAAO,MAAM,OAAO,MAAW,CAAA;AACrC,EAAA,MAAM,EAAE,sBAAAK,qBAAAA,EAAsB,gBAAA,EAAAC,mBAAkB,eAAA,EAAAC,gBAAAA,KAAoB,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,iBAAA,EAAA,EAAA,oBAAA,CAAA,CAAA;AAC1E,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,YAAY,MAAMF,qBAAAA,CAAqB,cAAc,CAAA,EAAG,OAAA,EAAS,CAAA,EAAG,cAAc,CAAA,CAAA,EAAI,UAAU,CAAA,CAAE,CAAA;AAC7H,EAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,OAAA,EAAS,cAAA,EAAgB,UAAU,CAAA;AAC3D,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,IAAA,CAAK,GAAA,EAAK,KAAK,CAAA;AAChC,EAAA,MAAM,MAAA,GAAS,MAAMC,iBAAAA,CAAiB,GAAG,CAAA;AACzC,EAAA,IAAI,QAAQ,OAAO,MAAA;AAEnB,EAAA,MAAM,IAAA,GAAA,CAAQ,IAAA,CAAK,cAAA,IAAkB,IAAA,CAAK,OAAA,EAAS,KAAK,yBAAA,IAA6B,sDAAA,EAAwD,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AAC9J,EAAA,MAAM,OAAA,GAAU,CAAA,EAAG,IAAI,CAAA,EAAA,EAAK,OAAO,CAAA,CAAA;AACnC,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,IAAS,UAAA,CAAW,KAAA;AACzC,EAAA,IAAI,CAAC,OAAA,EAAS,MAAM,IAAIN,sBAAc,kEAAkE,CAAA;AACxG,EAAA,MAAM,CAAC,WAAW,MAAM,CAAA,GAAI,MAAM,OAAA,CAAQ,GAAA,CAAI,CAAC,OAAA,CAAQ,CAAA,EAAG,OAAO,CAAA,cAAA,CAAgB,CAAA,EAAG,QAAQ,CAAA,EAAG,OAAO,IAAI,KAAK,CAAA,CAAE,CAAC,CAAC,CAAA;AACnH,EAAA,IAAI,CAAC,SAAA,CAAU,EAAA,IAAM,CAAC,OAAO,EAAA,EAAI;AAG/B,IAAA,IAAI,CAAC,IAAA,CAAK,cAAA,IAAkB,CAAC,IAAA,CAAK,OAAA,EAAS,KAAK,yBAAA,EAA2B;AACzE,MAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,8DAA8D,CAAA;AAC3F,MAAA,IAAI,OAAO,EAAA,EAAI;AACb,QAAA,MAAM,GAAA,GAAA,CAAO,MAAM,MAAA,CAAO,IAAA,EAAK,EAA6B,QAAA;AAC5D,QAAA,MAAM,QAAA,GAAW,OAAO,GAAA,KAAQ,QAAA,GAAW,IAAI,OAAA,CAAQ,IAAA,EAAM,EAAE,CAAA,GAAI,EAAA;AACnE,QAAA,IAAI,8CAAA,CAA+C,IAAA,CAAK,QAAQ,CAAA,IAAK,aAAa,OAAA,EAAS;AACzF,UAAA,OAAO,mBAAmB,EAAE,GAAG,IAAA,EAAM,OAAA,EAAS,UAAU,CAAA;AAAA,QAC1D;AAAA,MACF;AAAA,IACF;AACA,IAAA,MAAM,IAAIA,sBAAc,CAAA,qCAAA,EAAwC,OAAO,QAAQ,cAAc,CAAA,CAAA,EAAI,UAAU,CAAA,CAAE,CAAA;AAAA,EAC/G;AACA,EAAA,MAAM,WAAW,WAAA,CAAY,MAAM,SAAA,CAAU,IAAA,IAAQ,KAAK,CAAA;AAC1D,EAAA,IAAI,CAAC,UAAU,MAAM,IAAIA,sBAAc,CAAA,mBAAA,EAAsB,OAAO,CAAA,qBAAA,EAAwB,KAAK,CAAA,CAAE,CAAA;AACnG,EAAA,MAAM,QAAQ,IAAI,UAAA,CAAW,MAAM,MAAA,CAAO,aAAa,CAAA;AACvD,EAAA,OAAOO,gBAAAA,CAAgB,GAAA,EAAK,KAAA,EAAO,QAAQ,CAAA;AAC7C;;;ADxDA,IAAM,MAAA,uBAAa,GAAA,EAAqC;AAGxD,SAAS,UAAU,IAAA,EAA+B;AAChD,EAAA,OAAO,IAAA,CAAK,SAAA,CAAU,CAAC,IAAA,CAAK,GAAA,IAAO,EAAA,EAAI,IAAA,CAAK,SAAA,IAAa,EAAA,EAAI,IAAA,CAAK,GAAA,IAAO,EAAE,CAAC,CAAA;AAC9E;AAEO,SAAS,aAAA,CAAc,IAAA,GAAwB,EAAC,EAA4B;AACjF,EAAA,MAAM,GAAA,GAAM,UAAU,IAAI,CAAA;AAC1B,EAAA,IAAI,MAAA,GAAS,MAAA,CAAO,GAAA,CAAI,GAAG,CAAA;AAC3B,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,MAAA,GAAS,WAAA,CAAY,IAAI,CAAA,CAAE,KAAA,CAAM,CAAC,GAAA,KAAQ;AACxC,MAAA,MAAA,CAAO,OAAO,GAAG,CAAA;AACjB,MAAA,MAAM,GAAA;AAAA,IACR,CAAC,CAAA;AACD,IAAA,MAAA,CAAO,GAAA,CAAI,KAAK,MAAM,CAAA;AAAA,EACxB;AACA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,aAAA,GAA8E;AACrF,EAAA,OAAO,UAAA;AACT;AAEA,SAAS,eAAA,GAA2B;AAClC,EAAA,MAAM,IAAI,aAAA,EAAc;AACxB,EAAA,OACG,OAAO,CAAA,CAAE,OAAA,KAAY,WAAA,IAAe,CAAC,CAAC,CAAA,CAAE,OAAA,CAAQ,QAAA,EAAU,IAAA,IAC3D,OAAO,CAAA,CAAE,GAAA,KAAQ,WAAA,IACjB,OAAO,EAAE,IAAA,KAAS,WAAA;AAEtB;AAEA,eAAe,YAAY,IAAA,EAAgD;AACzE,EAAA,IAAI,CAAC,iBAAgB,EAAG;AACtB,IAAA,MAAM,IAAIP,qBAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AAEA,EAAA,MAAM,EAAE,KAAA,EAAM,GAAI,MAAM,OAAO,eAAoB,CAAA;AACnD,EAAA,MAAM,GAAA,GAAM,MAAM,OAAO,KAAU,CAAA;AACnC,EAAA,MAAM,IAAA,GAAO,eAAc,CAAE,OAAA;AAC7B,EAAA,MAAM,EAAE,WAAA,EAAY,GAAI,MAAM,OAAO,QAAa,CAAA;AAElD,EAAA,MAAM,QAAA,GAAW,MAAM,aAAA,CAAc,IAAA,CAAK,GAAG,CAAA;AAC7C,EAAA,MAAM,MAAM,QAAA,CAAS,GAAA;AACrB,EAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,GAAG,CAAA;AAC/B,EAAA,MAAM,OAAA,GAAU,oBAAoB,IAAI,CAAA,CAAA;AACxC,EAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,EAAE,CAAA,CAAE,SAAS,KAAK,CAAA;AAE5C,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,GAAA,EAAK,EAAC,EAAG;AAAA,IAC3B,GAAA,EAAK;AAAA,MACH,GAAG,IAAA,CAAK,GAAA;AAAA,MACR,IAAA,EAAM,aAAa,IAAI,CAAA,CAAA;AAAA,MACvB,SAAA,EAAW,IAAA,CAAK,GAAA,IAAO,IAAA,CAAK,GAAA,EAAI;AAAA,MAChC,UAAA,EAAY,KAAK,SAAA,IAAa,sBAAA;AAAA,MAC9B,YAAA,EAAc;AAAA,KAChB;AAAA,IACA,KAAA,EAAO;AAAA,GACR,CAAA;AAED,EAAA,IAAI,UAAA,GAA2B,IAAA;AAC/B,EAAA,KAAA,CAAM,EAAA,CAAG,OAAA,EAAS,CAAC,CAAA,KAAa;AAC9B,IAAA,UAAA,GAAa,CAAA;AAAA,EACf,CAAC,CAAA;AAED,EAAA,MAAM,OAAO,MAAM;AACjB,IAAA,IAAI;AACF,MAAA,KAAA,CAAM,IAAA,EAAK;AAAA,IACb,CAAA,CAAA,MAAQ;AAAA,IAAC;AAAA,EACX,CAAA;AAEA,EAAA,IAAA,CAAK,IAAA,GAAO,QAAQ,IAAI,CAAA;AACxB,EAAA,IAAA,CAAK,IAAA,GAAO,UAAU,MAAM;AAC1B,IAAA,IAAA,EAAK;AACL,IAAA,IAAA,CAAK,OAAO,GAAG,CAAA;AAAA,EACjB,CAAC,CAAA;AAED,EAAA,MAAM,WAAA,CAAY,OAAA,EAAS,KAAA,EAAO,MAAM,YAAY,QAAQ,CAAA;AAC5D,EAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,IAAA,EAAK;AAChC;AAWA,eAAe,cAAc,QAAA,EAA4C;AACvE,EAAA,MAAM,EAAA,GAAK,MAAM,OAAO,IAAS,CAAA;AACjC,EAAA,MAAM,IAAA,GAAO,MAAM,OAAO,MAAW,CAAA;AACrC,EAAA,MAAM,IAAA,GAAO,eAAc,CAAE,OAAA;AAC7B,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,QAAA,KAAa,OAAA,GAAU,MAAA,GAAS,EAAA;AAGjD,EAAA,MAAM,aAAuB,EAAC;AAC9B,EAAA,IAAI,QAAA,EAAU,UAAA,CAAW,IAAA,CAAK,QAAQ,CAAA;AACtC,EAAA,IAAI,KAAK,GAAA,EAAK,eAAA,aAA4B,IAAA,CAAK,IAAA,CAAK,IAAI,eAAe,CAAA;AAGvE,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,MAAM,OAAO,KAAU,CAAA;AACnC,IAAA,MAAM,OAAO,IAAA,CAAK,OAAA,CAAQ,IAAI,aAAA,CAAc,2PAAe,CAAC,CAAA;AAC5D,IAAA,MAAM,KAAA,GAAQ,aAAa,IAAA,CAAK,QAAQ,IAAI,IAAA,CAAK,IAAI,GAAG,GAAG,CAAA,CAAA;AAC3D,IAAA,UAAA,CAAW,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,IAAA,EAAM,KAAA,EAAO,KAAK,CAAA,EAAG,IAAA,CAAK,IAAA,CAAK,IAAA,EAAM,IAAA,EAAM,KAAA,EAAO,KAAK,CAAC,CAAA;AAAA,EACpF,CAAA,CAAA,MAAQ;AAAA,EAER;AAEA,EAAA,KAAA,MAAW,KAAK,UAAA,EAAY;AAC1B,IAAA,IAAI;AACF,MAAA,IAAI,EAAA,CAAG,UAAA,CAAW,CAAC,CAAA,EAAG,OAAO,EAAE,GAAA,EAAK,CAAA,EAAG,KAAA,EAAO,IAAA,EAAM,OAAA,EAAS,UAAA,EAAW;AAAA,IAC1E,CAAA,CAAA,MAAQ;AAAA,IAAC;AAAA,EACX;AACA,EAAA,MAAM,UAAA,GAAa,MAAM,kBAAA,CAAmB,EAAE,QAAA,EAAU,KAAK,QAAA,EAAU,IAAA,EAAM,IAAA,CAAK,IAAA,EAAM,CAAA;AACxF,EAAA,OAAO,EAAE,GAAA,EAAK,UAAA,EAAY,KAAA,EAAO,IAAA,EAAM,SAAS,CAAC,GAAG,UAAA,EAAY,UAAU,CAAA,EAAE;AAC9E;AAIA,SAAS,gBAAA,CAAiB,UAA0B,KAAA,EAAsB;AACxE,EAAA,IAAI,CAAC,SAAS,KAAA,EAAO;AACnB,IAAA,OAAO;AAAA,MACL,2EAAA;AAAA,MACA,CAAA,WAAA,EAAc,QAAA,CAAS,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAA;AAAA,MACzC,QAAA;AAAA,MACA,6FAAA;AAAA,MACA,0DAAA;AAAA,MACA,oEAAA;AAAA,MACA,8HAAA;AAAA,MACA,CAAA,mBAAA,EAAsB,MAAM,OAAO,CAAA,CAAA;AAAA,KACrC,CAAE,KAAK,IAAI,CAAA;AAAA,EACb;AACA,EAAA,OACE,CAAA,oCAAA,EAAuC,QAAA,CAAS,GAAG,CAAA,GAAA,EAAM,MAAM,OAAO,CAAA,sFAAA,CAAA;AAG1E;AAEA,SAAS,SAAS,GAAA,EAAiD;AACjE,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACtC,IAAA,MAAM,GAAA,GAAM,IAAI,YAAA,EAAa;AAC7B,IAAA,GAAA,CAAI,EAAA,CAAG,SAAS,MAAM,CAAA;AACtB,IAAA,GAAA,CAAI,MAAA,CAAO,CAAA,EAAG,WAAA,EAAa,MAAM;AAC/B,MAAA,MAAM,IAAA,GAAO,IAAI,OAAA,EAAQ;AACzB,MAAA,MAAM,OAAO,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,GAAW,KAAK,IAAA,GAAO,CAAA;AAC5D,MAAA,GAAA,CAAI,KAAA,CAAM,MAAM,OAAA,CAAQ,IAAI,CAAC,CAAA;AAAA,IAC/B,CAAC,CAAA;AAAA,EACH,CAAC,CAAA;AACH;AAEA,eAAe,YACb,OAAA,EACA,KAAA,EACA,QAAA,EACA,QAAA,EACA,YAAY,IAAA,EACG;AACf,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAC9B,EAAA,OAAO,IAAA,CAAK,GAAA,EAAI,GAAI,QAAA,EAAU;AAC5B,IAAA,MAAM,MAAM,QAAA,EAAS;AACrB,IAAA,IAAI,GAAA,EAAK;AACP,MAAA,MAAM,IAAIA,sBAAc,gBAAA,CAAiB,QAAA,EAAU,GAAG,CAAA,EAAG,EAAE,KAAA,EAAO,GAAA,EAAK,CAAA;AAAA,IACzE;AACA,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,CAAA,EAAG,OAAO,CAAA,QAAA,CAAA,EAAY,EAAE,OAAA,EAAS,EAAE,aAAA,EAAe,CAAA,OAAA,EAAU,KAAK,CAAA,CAAA,IAAM,CAAA;AAC/F,MAAA,IAAI,IAAI,EAAA,EAAI;AAAA,IACd,CAAA,CAAA,MAAQ;AAAA,IAER;AACA,IAAA,MAAM,IAAI,OAAA,CAAQ,CAAC,MAAM,UAAA,CAAW,CAAA,EAAG,GAAG,CAAC,CAAA;AAAA,EAC7C;AACA,EAAA,MAAM,IAAIA,sBAAc,0DAA0D,CAAA;AACpF;;;AG3IA,SAAS,IAAA,CAAK,MAAmB,CAAA,EAAsB;AACrD,EAAA,IAAI,CAAC,KAAK,KAAA,EAAO;AACjB,EAAA,IAAI;AACF,IAAA,IAAA,CAAK,MAAM,CAAC,CAAA;AAAA,EACd,CAAA,CAAA,MAAQ;AAAA,EAER;AACF;AAWO,SAAS,KAAA,CAAM,IAAA,GAAwB,EAAC,EAAW;AACxD,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,OAAA;AAAA,IACN,MAAM,QAAQ,IAAA,EAAM;AAClB,MAAA,MAAM,CAAA,GAAI,MAAM,aAAA,CAAc,IAAI,CAAA;AAClC,MAAA,IAAA,CAAK,IAAA,EAAM,EAAE,MAAA,EAAQ,OAAA,EAAS,KAAA,EAAO,OAAA,EAAS,OAAA,EAAS,CAAA,mBAAA,EAAsB,CAAA,CAAE,OAAO,CAAA,CAAA,EAAI,CAAA;AAC1F,MAAA,OAAO;AAAA,QACL,IAAI,CAAA,CAAE,OAAA;AAAA,QACN,SAAS,CAAA,CAAE,OAAA;AAAA,QACX,GAAI,EAAE,KAAA,KAAU,MAAA,GAAY,EAAE,KAAA,EAAO,CAAA,CAAE,KAAA,EAAM,GAAI,EAAC;AAAA;AAAA,QAElD,MAAM,YAAY;AAAA,QAAC;AAAA,OACrB;AAAA,IACF;AAAA,GACF;AACF;AAkBO,SAAS,MAAA,CAAO,OAAA,EAAiB,IAAA,GAAsB,EAAC,EAAW;AACxE,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,QAAA;AAAA,IACN,MAAM,QAAQ,IAAA,EAAM;AAClB,MAAA,IAAA,CAAK,IAAA,EAAM,EAAE,MAAA,EAAQ,QAAA,EAAU,KAAA,EAAO,QAAQ,OAAA,EAAS,CAAA,uBAAA,EAA0B,OAAO,CAAA,CAAA,EAAI,CAAA;AAC5F,MAAA,OAAO;AAAA,QACL,EAAA,EAAI,OAAA;AAAA,QACJ,OAAA;AAAA,QACA,GAAI,KAAK,KAAA,KAAU,MAAA,GAAY,EAAE,KAAA,EAAO,IAAA,CAAK,KAAA,EAAM,GAAI,EAAC;AAAA,QACxD,GAAI,KAAK,OAAA,KAAY,MAAA,GAAY,EAAE,OAAA,EAAS,IAAA,CAAK,OAAA,EAAQ,GAAI,EAAC;AAAA,QAC9D,GAAI,KAAK,KAAA,KAAU,MAAA,GAAY,EAAE,KAAA,EAAO,IAAA,CAAK,KAAA,EAAM,GAAI,EAAC;AAAA,QACxD,MAAM,YAAY;AAAA,QAAC;AAAA,OACrB;AAAA,IACF;AAAA,GACF;AACF;;;AChDA,IAAM,iBAAA,uBAAwB,OAAA,EAAqC;AAgC5D,IAAM,QAAA,GAAN,MAAM,SAAA,CAAS;AAAA;AAAA,EAEX,SAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,IAAA;AAAA;AAAA,EAEA,YAAA;AAAA;AAAA,EAEA,IAAA;AAAA;AAAA,EAEA,OAAA;AAAA;AAAA,EAEA,GAAA;AAAA;AAAA,EAEA,SAAA;AAAA;AAAA,EAEA,MAAA;AAAA,EAET,WAAA,CAAY,IAAA,GAAwB,EAAC,EAAG;AAKtC,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,IAAU,KAAA,EAAM;AACpC,IAAA,MAAM,OAAoB,EAAE,KAAA,EAAO,KAAK,KAAA,EAAO,KAAA,EAAO,KAAK,MAAA,EAAO;AAClE,IAAA,IAAA,CAAK,IAAA,GAAO,IAAI,IAAA,CAAK;AAAA,MACnB,OAAO,IAAA,CAAK,KAAA;AAAA,MACZ,SAAS,IAAA,CAAK,OAAA;AAAA,MACd,WAAW,IAAA,CAAK,gBAAA;AAAA,MAChB,aAAa,MAAM;AACjB,QAAA,MAAM,CAAA,GAAI,MAAA,CAAO,OAAA,CAAQ,IAAI,CAAA;AAC7B,QAAA,iBAAA,CAAkB,GAAA,CAAI,IAAA,CAAK,IAAA,EAAM,CAAC,CAAA;AAClC,QAAA,OAAO,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,MAAO;AAAA,UACpB,SAAS,CAAA,CAAE,OAAA;AAAA,UACX,OAAO,CAAA,CAAE,KAAA;AAAA,UACT,UAAU,CAAA,CAAE,QAAA;AAAA,UACZ,SAAS,CAAA,CAAE,OAAA;AAAA,UACX,OAAO,CAAA,CAAE;AAAA,SACX,CAAE,CAAA;AAAA,MACJ;AAAA,KACD,CAAA;AACD,IAAA,IAAA,CAAK,eAAe,IAAA,CAAK,KAAA;AACzB,IAAA,IAAA,CAAK,SAAA,GAAY,IAAI,YAAA,CAAa,IAAI,CAAA;AACtC,IAAA,IAAA,CAAK,QAAA,GAAW,IAAI,WAAA,CAAY,IAAI,CAAA;AACpC,IAAA,IAAA,CAAK,OAAA,GAAU,IAAI,UAAA,CAAW,IAAI,CAAA;AAClC,IAAA,IAAA,CAAK,SAAA,GAAY,IAAI,YAAA,CAAa,IAAI,CAAA;AACtC,IAAA,IAAA,CAAK,QAAA,GAAW,IAAI,WAAA,CAAY,IAAI,CAAA;AACpC,IAAA,IAAA,CAAK,IAAA,GAAO,IAAI,OAAA,CAAQ,IAAI,CAAA;AAC5B,IAAA,IAAA,CAAK,OAAA,GAAU,IAAI,UAAA,CAAW,IAAI,CAAA;AAClC,IAAA,IAAA,CAAK,GAAA,GAAM,IAAI,MAAA,CAAO,IAAI,CAAA;AAC1B,IAAA,IAAA,CAAK,SAAA,GAAY,IAAI,YAAA,CAAa,IAAI,CAAA;AACtC,IAAA,IAAA,CAAK,MAAA,GAAS,IAAI,SAAA,CAAU,IAAI,CAAA;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,MAAA,GAAwB;AAC5B,IAAA,MAAM,IAAA,CAAK,KAAK,KAAA,EAAM;AAAA,EACxB;AAAA;AAAA,EAGA,UAAU,KAAA,EAAyB;AACjC,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,MAAA,CAAO,SAAA,CAAS,SAAS,CAAA;AAC9C,IAAA,KAAA,CAAM,OAAO,IAAA,CAAK,IAAA;AAClB,IAAA,KAAA,CAAM,YAAA,GAAe,KAAA;AACrB,IAAA,KAAA,CAAM,SAAA,GAAY,IAAI,YAAA,CAAa,KAAiB,CAAA;AACpD,IAAA,KAAA,CAAM,QAAA,GAAW,IAAI,WAAA,CAAY,KAAiB,CAAA;AAClD,IAAA,KAAA,CAAM,OAAA,GAAU,IAAI,UAAA,CAAW,KAAiB,CAAA;AAChD,IAAA,KAAA,CAAM,SAAA,GAAY,IAAI,YAAA,CAAa,KAAiB,CAAA;AACpD,IAAA,KAAA,CAAM,QAAA,GAAW,IAAI,WAAA,CAAY,KAAiB,CAAA;AAClD,IAAA,KAAA,CAAM,IAAA,GAAO,IAAI,OAAA,CAAQ,KAAiB,CAAA;AAC1C,IAAA,KAAA,CAAM,OAAA,GAAU,IAAI,UAAA,CAAW,KAAiB,CAAA;AAChD,IAAA,KAAA,CAAM,GAAA,GAAM,IAAI,MAAA,CAAO,KAAiB,CAAA;AACxC,IAAA,KAAA,CAAM,SAAA,GAAY,IAAI,YAAA,CAAa,KAAiB,CAAA;AACpD,IAAA,KAAA,CAAM,MAAA,GAAS,IAAI,SAAA,CAAU,KAAiB,CAAA;AAC9C,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA,EAGA,WAAW,MAAA,EAAqD;AAC9D,IAAA,MAAM,CAAA,GAAI,MAAA,EAAQ,KAAA,IAAS,IAAA,CAAK,YAAA;AAChC,IAAA,OAAO,CAAA,GAAI,EAAE,KAAA,EAAO,CAAA,EAAE,GAAI,MAAA;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,KAAA,GAAuB;AAC3B,IAAA,MAAM,MAAA,GAAS,iBAAA,CAAkB,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA;AAC9C,IAAA,IAAI,CAAC,MAAA,EAAQ;AACb,IAAA,iBAAA,CAAkB,MAAA,CAAO,KAAK,IAAI,CAAA;AAClC,IAAA,MAAM,CAAA,GAAI,MAAM,MAAA,CAAO,KAAA,CAAM,MAAM,IAAI,CAAA;AACvC,IAAA,IAAI,CAAA,EAAG,MAAM,CAAA,CAAE,IAAA,EAAK;AAAA,EACtB;AAAA;AAAA;AAAA,EAKA,MAAA,GAA0B;AACxB,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,OAAA,CAAgB,KAAA,EAAO,UAAU,CAAA;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,KAAA,GAAwB;AACtB,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,OAAA,CAAe,KAAA,EAAO,QAAQ,CAAA;AAAA,EACjD;AAAA;AAAA,EAGA,OAAA,GAA4B;AAC1B,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,OAAA,CAAiB,KAAA,EAAO,UAAU,CAAA;AAAA,EACrD;AAAA;AAAA,EAGA,MAAM,MAAA,EAA0C;AAC9C,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,OAAA,CAAmB,KAAA,EAAO,QAAA,EAAU,EAAE,KAAA,EAAO,IAAA,CAAK,UAAA,CAAW,MAAM,CAAA,EAAG,CAAA;AAAA,EACzF;AAAA;AAAA,EAGA,QAAA,CAAS,IAAA,GAA4C,EAAC,EAA6B;AACjF,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,OAAA,CAAyB,KAAA,EAAO,iBAAA,EAAmB;AAAA,MAClE,KAAA,EAAO,EAAE,GAAG,IAAA,CAAK,WAAW,IAAI,CAAA,EAAG,GAAI,IAAA,CAAK,UAAU,EAAE,OAAA,EAAS,MAAA,EAAO,GAAI,EAAC;AAAG,KACjF,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,MAAA,EAA4C;AACjD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,OAAA,CAAqB,KAAA,EAAO,SAAA,EAAW,EAAE,KAAA,EAAO,IAAA,CAAK,UAAA,CAAW,MAAM,CAAA,EAAG,CAAA;AAAA,EAC5F;AAAA;AAAA,EAGA,OAAO,MAAA,EAA6C;AAClD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,OAAA,CAAsB,KAAA,EAAO,SAAA,EAAW,EAAE,KAAA,EAAO,IAAA,CAAK,UAAA,CAAW,MAAM,CAAA,EAAG,CAAA;AAAA,EAC7F;AAAA;AAAA;AAAA,EAKA,MAAM,MAAA,EAA4C;AAChD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,OAAA,CAAqB,MAAA,EAAQ,QAAA,EAAU,EAAE,KAAA,EAAO,IAAA,CAAK,UAAA,CAAW,MAAM,CAAA,EAAG,CAAA;AAAA,EAC5F;AAAA;AAAA,EAGA,OAAO,MAAA,EAA4C;AACjD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,OAAA,CAAqB,MAAA,EAAQ,SAAA,EAAW,EAAE,KAAA,EAAO,IAAA,CAAK,UAAA,CAAW,MAAM,CAAA,EAAG,CAAA;AAAA,EAC7F;AAAA;AAAA,EAGA,YAAY,MAAA,EAA4C;AACtD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,OAAA,CAAqB,KAAA,EAAO,QAAA,EAAU,EAAE,KAAA,EAAO,IAAA,CAAK,UAAA,CAAW,MAAM,CAAA,EAAG,CAAA;AAAA,EAC3F;AAAA;AAAA;AAAA,EAKA,UAAU,MAAA,EAAuD;AAC/D,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,OAAA,CAAgC,KAAA,EAAO,SAAA,EAAW;AAAA,MACjE,KAAA,EAAO,IAAA,CAAK,UAAA,CAAW,MAAM;AAAA,KAC9B,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,SAAA,CAAU,MAAA,EAAgC,MAAA,EAAqC;AACnF,IAAA,MAAM,IAAA,CAAK,IAAA,CAAK,OAAA,CAAc,KAAA,EAAO,SAAA,EAAW;AAAA,MAC9C,KAAA,EAAO,IAAA,CAAK,UAAA,CAAW,MAAM,CAAA;AAAA,MAC7B,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH;AAAA;AAAA;AAAA,EAKA,KAAA,GAAgC;AAC9B,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,OAAA,CAAuB,KAAA,EAAO,QAAQ,CAAA;AAAA,EACzD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,UAAA,CAAW,QAAgB,KAAA,EAAqC;AAC9D,IAAA,OAAO,IAAA,CAAK,KAAK,OAAA,CAAqB,KAAA,EAAO,UAAU,kBAAA,CAAmB,MAAM,CAAC,CAAA,CAAA,EAAI;AAAA,MACnF,IAAA,EAAM,EAAE,KAAA;AAAM,KACf,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,WAAW,MAAA,EAAuC;AAChD,IAAA,OAAO,IAAA,CAAK,KAAK,OAAA,CAAsB,QAAA,EAAU,UAAU,kBAAA,CAAmB,MAAM,CAAC,CAAA,CAAE,CAAA;AAAA,EACzF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,QAAA,CAAS,MAAA,EAAgB,IAAA,GAA+B,EAAC,EAAyB;AAChF,IAAA,OAAO,IAAA,CAAK,KAAK,OAAA,CAAqB,MAAA,EAAQ,UAAU,kBAAA,CAAmB,MAAM,CAAC,CAAA,KAAA,CAAA,EAAS;AAAA,MACzF,IAAA,EAAM,KAAK,SAAA,GAAY,EAAE,WAAW,IAAA,CAAK,SAAA,KAAc;AAAC,KACzD,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,QAAA,CACE,MAAA,EACA,IAAA,GAA0D,EAAC,EACvC;AACpB,IAAA,MAAM,QAAqD,EAAE,GAAG,IAAA,CAAK,UAAA,CAAW,IAAI,CAAA,EAAE;AACtF,IAAA,IAAI,KAAK,KAAA,KAAU,MAAA,EAAW,KAAA,CAAM,OAAO,IAAI,IAAA,CAAK,KAAA;AACpD,IAAA,IAAI,KAAK,MAAA,KAAW,MAAA,EAAW,KAAA,CAAM,QAAQ,IAAI,IAAA,CAAK,MAAA;AACtD,IAAA,OAAO,IAAA,CAAK,KAAK,OAAA,CAAmB,KAAA,EAAO,UAAU,kBAAA,CAAmB,MAAM,CAAC,CAAA,SAAA,CAAA,EAAa;AAAA,MAC1F;AAAA,KACD,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,UAAU,MAAA,EAAqC;AACnD,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,IAAA,CAAK,OAAA;AAAA,MAC3B,KAAA;AAAA,MACA,CAAA,OAAA,EAAU,kBAAA,CAAmB,MAAM,CAAC,CAAA,IAAA;AAAA,KACtC;AACA,IAAA,OAAO,OAAO,IAAI,GAAA,CAAI,IAAA,CAAK,IAAA,EAAM,IAAI,CAAA,GAAI,IAAA;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,MAAM,KACJ,KAAA,EASc;AACd,IAAA,MAAM,IAAA,GAQF;AAAA,MACF,QAAQ,KAAA,CAAM,MAAA;AAAA,MACd,SAAS,KAAA,CAAM;AAAA,KACjB;AACA,IAAA,IAAI,KAAA,CAAM,GAAA,KAAQ,MAAA,EAAW,IAAA,CAAK,MAAM,KAAA,CAAM,GAAA;AAC9C,IAAA,IAAI,KAAA,CAAM,OAAA,KAAY,MAAA,EAAW,IAAA,CAAK,UAAU,KAAA,CAAM,OAAA;AACtD,IAAA,IAAI,KAAA,CAAM,IAAA,KAAS,MAAA,EAAW,IAAA,CAAK,OAAO,KAAA,CAAM,IAAA;AAChD,IAAA,IAAI,KAAA,CAAM,OAAA,KAAY,MAAA,EAAW,IAAA,CAAK,UAAU,KAAA,CAAM,OAAA;AACtD,IAAA,IAAI,KAAA,CAAM,OAAA,KAAY,MAAA,EAAW,IAAA,CAAK,UAAU,KAAA,CAAM,OAAA;AACtD,IAAA,MAAM,OAAO,MAAM,IAAA,CAAK,IAAA,CAAK,OAAA,CAAiB,QAAQ,QAAA,EAAU;AAAA,MAC9D,KAAA,EAAO,IAAA,CAAK,UAAA,CAAW,KAAK,CAAA;AAAA,MAC5B;AAAA,KACD,CAAA;AACD,IAAA,OAAO,IAAI,GAAA,CAAI,IAAA,CAAK,IAAA,EAAM,IAAI,CAAA;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,MAAM,QACJ,KAAA,EAQc;AACd,IAAA,OAAO,KAAK,IAAA,CAAK,EAAE,GAAG,KAAA,EAAO,IAAA,EAAM,WAAW,CAAA;AAAA,EAChD;AAAA;AAAA,EAGA,MAAM,IAAI,EAAA,EAA0B;AAClC,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,IAAA,CAAK,OAAA,CAAiB,OAAO,CAAA,MAAA,EAAS,kBAAA,CAAmB,EAAE,CAAC,CAAA,CAAE,CAAA;AACtF,IAAA,OAAO,IAAI,GAAA,CAAI,IAAA,CAAK,IAAA,EAAM,IAAI,CAAA;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAM,OAAA,CAAQ,MAAA,EAAgB,IAAA,GAAgD,EAAC,EAAiB;AAC9F,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,IAAA,CAAK,OAAA;AAAA,MAC3B,MAAA;AAAA,MACA,CAAA,OAAA,EAAU,kBAAA,CAAmB,MAAM,CAAC,CAAA,QAAA,CAAA;AAAA,MACpC;AAAA,QACE,KAAA,EAAO,IAAA,CAAK,UAAA,CAAW,IAAI,CAAA;AAAA,QAC3B,IAAA,EAAM,KAAK,YAAA,GAAe,EAAE,cAAc,IAAA,CAAK,YAAA,KAAiB;AAAC;AACnE,KACF;AACA,IAAA,OAAO,IAAI,GAAA,CAAI,IAAA,CAAK,IAAA,EAAM,IAAI,CAAA;AAAA,EAChC;AAAA;AAAA;AAAA,EAKA,eAAA,GAA+C;AAC7C,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,OAAA,CAA4B,KAAA,EAAO,gBAAgB,CAAA;AAAA,EACtE;AAAA;AAAA,EAGA,MAAM,gBAAgB,KAAA,EAAyC;AAC7D,IAAA,MAAM,IAAA,CAAK,KAAK,OAAA,CAAc,KAAA,EAAO,kBAAkB,EAAE,IAAA,EAAM,OAAO,CAAA;AAAA,EACxE;AAAA;AAAA,EAGA,OAAO,aAAA,CAAc,IAAA,GAAiC,EAAC,EAAiC;AACtF,IAAA,MAAM,MAAM,MAAM,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,OAAO,gBAAA,EAAkB;AAAA,MACxD,GAAI,KAAK,MAAA,GAAS,EAAE,QAAQ,IAAA,CAAK,MAAA,KAAW;AAAC,KAC9C,CAAA;AACD,IAAA,OAAO,OAAA,CAAsB,GAAA,CAAI,IAAA,EAAO,IAAA,CAAK,MAAM,CAAA;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,OAAO,SAAA,CACL,IAAA,GAAiD,EAAC,EACpB;AAC9B,IAAA,MAAM,IAAA,GACJ,uBACC,IAAA,CAAK,KAAA,GAAQ,UAAU,kBAAA,CAAmB,IAAA,CAAK,KAAK,CAAC,CAAA,CAAA,GAAK,EAAA,CAAA;AAC7D,IAAA,MAAM,MAAM,MAAM,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,OAAO,IAAA,EAAM;AAAA,MAC5C,GAAI,KAAK,MAAA,GAAS,EAAE,QAAQ,IAAA,CAAK,MAAA,KAAW;AAAC,KAC9C,CAAA;AACD,IAAA,OAAO,OAAA,CAAsB,GAAA,CAAI,IAAA,EAAO,IAAA,CAAK,MAAM,CAAA;AAAA,EACrD;AACF;AAGO,IAAM,UAAN,MAAc;AAAA,EACnB,YAA6B,EAAA,EAAc;AAAd,IAAA,IAAA,CAAA,EAAA,GAAA,EAAA;AAAA,EAAe;AAAA,EAAf,EAAA;AAAA;AAAA,EAG7B,QAAQ,MAAA,EAA6C;AACnD,IAAA,OAAO,IAAA,CAAK,EAAA,CAAG,IAAA,CAAK,OAAA,CAAsB,OAAO,eAAA,EAAiB;AAAA,MAChE,KAAA,EAAO,IAAA,CAAK,EAAA,CAAG,UAAA,CAAW,MAAM;AAAA,KACjC,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,KAAA,CAAM,QAAgB,MAAA,EAA0C;AAC9D,IAAA,OAAO,IAAA,CAAK,EAAA,CAAG,IAAA,CAAK,OAAA,CAAmB,QAAQ,aAAA,EAAe;AAAA,MAC5D,KAAA,EAAO,IAAA,CAAK,EAAA,CAAG,UAAA,CAAW,MAAM,CAAA;AAAA,MAChC,IAAA,EAAM,EAAE,MAAA;AAAO,KAChB,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,IAAA,CAAK,OAA+B,MAAA,EAA0C;AAC5E,IAAA,OAAO,IAAA,CAAK,EAAA,CAAG,IAAA,CAAK,OAAA,CAAmB,QAAQ,YAAA,EAAc;AAAA,MAC3D,KAAA,EAAO,IAAA,CAAK,EAAA,CAAG,UAAA,CAAW,MAAM,CAAA;AAAA,MAChC,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,IAAA,CAAK,QAAgB,MAAA,EAA0C;AAC7D,IAAA,OAAO,KAAK,IAAA,CAAK,EAAE,OAAA,EAAS,MAAA,IAAU,MAAM,CAAA;AAAA,EAC9C;AAAA;AAAA,EAGA,MAAA,CAAO,QAAgB,MAAA,EAA0C;AAC/D,IAAA,OAAO,IAAA,CAAK,KAAK,EAAE,OAAA,EAAS,QAAQ,OAAA,EAAS,QAAA,IAAY,MAAM,CAAA;AAAA,EACjE;AAAA;AAAA,EAGA,OAAO,MAAA,EAA2C;AAChD,IAAA,OAAO,IAAA,CAAK,EAAA,CAAG,IAAA,CAAK,OAAA,CAAoB,OAAO,cAAA,EAAgB;AAAA,MAC7D,KAAA,EAAO,IAAA,CAAK,EAAA,CAAG,UAAA,CAAW,MAAM;AAAA,KACjC,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,OAAO,MAAA,EAA2C;AAChD,IAAA,OAAO,IAAA,CAAK,EAAA,CAAG,IAAA,CAAK,OAAA,CAAoB,QAAQ,cAAA,EAAgB;AAAA,MAC9D,KAAA,EAAO,IAAA,CAAK,EAAA,CAAG,UAAA,CAAW,MAAM;AAAA,KACjC,CAAA;AAAA,EACH;AACF;AAYO,IAAM,aAAN,MAAiB;AAAA,EACtB,YAA6B,EAAA,EAAc;AAAd,IAAA,IAAA,CAAA,EAAA,GAAA,EAAA;AAAA,EAAe;AAAA,EAAf,EAAA;AAAA,EAErB,KAAA,CAAM,QAAiC,KAAA,EAA4C;AACzF,IAAA,OAAO,EAAE,GAAG,IAAA,CAAK,EAAA,CAAG,WAAW,MAAM,CAAA,EAAG,GAAG,KAAA,EAAM;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAA,CAAO,IAAA,GAAuC,EAAC,EAAyB;AACtE,IAAA,OAAO,IAAA,CAAK,EAAA,CAAG,IAAA,CAAK,OAAA,CAAqB,OAAO,SAAA,EAAW;AAAA,MACzD,KAAA,EAAO,KAAK,KAAA,CAAM,IAAA,EAAM,EAAE,GAAA,EAAK,IAAA,CAAK,KAAK;AAAA,KAC1C,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,SAAA,CACE,KAAA,EACA,IAAA,GAAuC,EAAC,EACpB;AACpB,IAAA,OAAO,IAAA,CAAK,EAAA,CAAG,IAAA,CAAK,OAAA,CAAmB,OAAO,SAAA,EAAW;AAAA,MACvD,KAAA,EAAO,KAAK,KAAA,CAAM,IAAA,EAAM,EAAE,GAAA,EAAK,IAAA,CAAK,KAAK,CAAA;AAAA,MACzC,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,YAAA,CAAa,IAAA,GAA4D,EAAC,EAAuB;AAC/F,IAAA,OAAO,IAAA,CAAK,EAAA,CAAG,IAAA,CAAK,OAAA,CAAmB,UAAU,SAAA,EAAW;AAAA,MAC1D,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,IAAA,EAAM,EAAE,KAAA,EAAO,IAAA,CAAK,KAAA,EAAO,GAAA,EAAK,IAAA,CAAK,GAAA,EAAK;AAAA,KAC7D,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAA,CAAK,IAAA,GAAuC,EAAC,EAA8B;AACzE,IAAA,OAAO,IAAA,CAAK,EAAA,CAAG,IAAA,CAAK,OAAA,CAA0B,OAAO,UAAA,EAAY;AAAA,MAC/D,KAAA,EAAO,KAAK,KAAA,CAAM,IAAA,EAAM,EAAE,GAAA,EAAK,IAAA,CAAK,KAAK;AAAA,KAC1C,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,GAAA,CAAI,IAAA,EAAc,IAAA,GAA4D,EAAC,EAA4B;AACzG,IAAA,OAAO,IAAA,CAAK,GAAG,IAAA,CAAK,OAAA,CAAwB,OAAO,CAAA,SAAA,EAAY,kBAAA,CAAmB,IAAI,CAAC,CAAA,CAAA,EAAI;AAAA,MACzF,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,IAAA,EAAM,EAAE,KAAA,EAAO,IAAA,CAAK,KAAA,EAAO,GAAA,EAAK,IAAA,CAAK,GAAA,EAAK;AAAA,KAC7D,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,GAAA,CACE,IAAA,EACA,OAAA,EACA,IAAA,GAA4D,EAAC,EACpC;AACzB,IAAA,OAAO,IAAA,CAAK,GAAG,IAAA,CAAK,OAAA,CAAwB,OAAO,CAAA,SAAA,EAAY,kBAAA,CAAmB,IAAI,CAAC,CAAA,CAAA,EAAI;AAAA,MACzF,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,IAAA,EAAM,EAAE,KAAA,EAAO,IAAA,CAAK,KAAA,EAAO,GAAA,EAAK,IAAA,CAAK,GAAA,EAAK,CAAA;AAAA,MAC5D,IAAA,EAAM,EAAE,OAAA;AAAQ,KACjB,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,MAAA,CAAO,IAAA,EAAc,IAAA,GAA4D,EAAC,EAAkB;AACxG,IAAA,MAAM,IAAA,CAAK,GAAG,IAAA,CAAK,OAAA,CAA8B,UAAU,CAAA,SAAA,EAAY,kBAAA,CAAmB,IAAI,CAAC,CAAA,CAAA,EAAI;AAAA,MACjG,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,IAAA,EAAM,EAAE,KAAA,EAAO,IAAA,CAAK,KAAA,EAAO,GAAA,EAAK,IAAA,CAAK,GAAA,EAAK;AAAA,KAC7D,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,SAAA,CAAU,IAAA,GAAuC,EAAC,EAAwB;AACxE,IAAA,OAAO,IAAA,CAAK,EAAA,CAAG,IAAA,CAAK,OAAA,CAAoB,OAAO,YAAA,EAAc;AAAA,MAC3D,KAAA,EAAO,KAAK,KAAA,CAAM,IAAA,EAAM,EAAE,GAAA,EAAK,IAAA,CAAK,KAAK;AAAA,KAC1C,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,QAAA,CAAS,IAAA,EAAc,IAAA,GAA4D,EAAC,EAAsB;AACxG,IAAA,OAAO,IAAA,CAAK,GAAG,IAAA,CAAK,OAAA,CAAkB,OAAO,CAAA,WAAA,EAAc,kBAAA,CAAmB,IAAI,CAAC,CAAA,CAAA,EAAI;AAAA,MACrF,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,IAAA,EAAM,EAAE,KAAA,EAAO,IAAA,CAAK,KAAA,EAAO,GAAA,EAAK,IAAA,CAAK,GAAA,EAAK;AAAA,KAC7D,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,WAAA,CACE,IAAA,EACA,OAAA,EACA,IAAA,GAA4D,EAAC,EAC1C;AACnB,IAAA,OAAO,IAAA,CAAK,GAAG,IAAA,CAAK,OAAA,CAAkB,OAAO,CAAA,WAAA,EAAc,kBAAA,CAAmB,IAAI,CAAC,CAAA,CAAA,EAAI;AAAA,MACrF,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,IAAA,EAAM,EAAE,KAAA,EAAO,IAAA,CAAK,KAAA,EAAO,GAAA,EAAK,IAAA,CAAK,GAAA,EAAK,CAAA;AAAA,MAC5D,IAAA,EAAM,EAAE,OAAA;AAAQ,KACjB,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,cAAA,CACJ,IAAA,EACA,IAAA,GAA4D,EAAC,EAC9C;AACf,IAAA,MAAM,IAAA,CAAK,GAAG,IAAA,CAAK,OAAA,CAA8B,UAAU,CAAA,WAAA,EAAc,kBAAA,CAAmB,IAAI,CAAC,CAAA,CAAA,EAAI;AAAA,MACnG,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,IAAA,EAAM,EAAE,KAAA,EAAO,IAAA,CAAK,KAAA,EAAO,GAAA,EAAK,IAAA,CAAK,GAAA,EAAK;AAAA,KAC7D,CAAA;AAAA,EACH;AACF;AAaO,IAAM,SAAN,MAAa;AAAA,EAClB,YAA6B,EAAA,EAAc;AAAd,IAAA,IAAA,CAAA,EAAA,GAAA,EAAA;AAAA,EAAe;AAAA,EAAf,EAAA;AAAA,EAErB,KAAA,CAAM,QAAiC,KAAA,EAA4C;AACzF,IAAA,OAAO,EAAE,GAAG,IAAA,CAAK,EAAA,CAAG,WAAW,MAAM,CAAA,EAAG,GAAG,KAAA,EAAM;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAA,CACE,IAAA,GAAuC,EAAC,EAC0B;AAClE,IAAA,OAAO,IAAA,CAAK,EAAA,CAAG,IAAA,CAAK,OAAA,CAAiE,OAAO,MAAA,EAAQ;AAAA,MAClG,KAAA,EAAO,KAAK,KAAA,CAAM,IAAA,EAAM,EAAE,GAAA,EAAK,IAAA,CAAK,KAAK;AAAA,KAC1C,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,GAAA,CAAI,IAAA,EAAc,IAAA,GAA4D,EAAC,EAAuB;AACpG,IAAA,OAAO,IAAA,CAAK,GAAG,IAAA,CAAK,OAAA,CAAmB,OAAO,CAAA,KAAA,EAAQ,kBAAA,CAAmB,IAAI,CAAC,CAAA,CAAA,EAAI;AAAA,MAChF,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,IAAA,EAAM,EAAE,KAAA,EAAO,IAAA,CAAK,KAAA,EAAO,GAAA,EAAK,IAAA,CAAK,GAAA,EAAK;AAAA,KAC7D,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,GAAA,CACE,IAAA,EACA,MAAA,EACA,IAAA,GAA4D,EAAC,EACzC;AACpB,IAAA,OAAO,IAAA,CAAK,GAAG,IAAA,CAAK,OAAA,CAAmB,OAAO,CAAA,KAAA,EAAQ,kBAAA,CAAmB,IAAI,CAAC,CAAA,CAAA,EAAI;AAAA,MAChF,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,IAAA,EAAM,EAAE,KAAA,EAAO,IAAA,CAAK,KAAA,EAAO,GAAA,EAAK,IAAA,CAAK,GAAA,EAAK,CAAA;AAAA,MAC5D,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,MAAA,CAAO,IAAA,EAAc,IAAA,GAA4D,EAAC,EAAkB;AACxG,IAAA,MAAM,IAAA,CAAK,GAAG,IAAA,CAAK,OAAA,CAA8B,UAAU,CAAA,KAAA,EAAQ,kBAAA,CAAmB,IAAI,CAAC,CAAA,CAAA,EAAI;AAAA,MAC7F,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,IAAA,EAAM,EAAE,KAAA,EAAO,IAAA,CAAK,KAAA,EAAO,GAAA,EAAK,IAAA,CAAK,GAAA,EAAK;AAAA,KAC7D,CAAA;AAAA,EACH;AACF;AAiBO,IAAM,eAAN,MAAmB;AAAA,EACxB,YAA6B,EAAA,EAAc;AAAd,IAAA,IAAA,CAAA,EAAA,GAAA,EAAA;AAAA,EAAe;AAAA,EAAf,EAAA;AAAA,EAErB,KAAA,CAAM,QAAiC,KAAA,EAA4C;AACzF,IAAA,OAAO,EAAE,GAAG,IAAA,CAAK,EAAA,CAAG,WAAW,MAAM,CAAA,EAAG,GAAG,KAAA,EAAM;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAA,CACE,IAAA,GAAuC,EAAC,EAC+B;AACvE,IAAA,OAAO,IAAA,CAAK,EAAA,CAAG,IAAA,CAAK,OAAA,CAAsE,OAAO,YAAA,EAAc;AAAA,MAC7G,KAAA,EAAO,KAAK,KAAA,CAAM,IAAA,EAAM,EAAE,GAAA,EAAK,IAAA,CAAK,KAAK;AAAA,KAC1C,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,GAAA,CAAI,EAAA,EAAY,IAAA,GAA4D,EAAC,EAA4B;AACvG,IAAA,OAAO,IAAA,CAAK,GAAG,IAAA,CAAK,OAAA,CAAwB,OAAO,CAAA,WAAA,EAAc,kBAAA,CAAmB,EAAE,CAAC,CAAA,CAAA,EAAI;AAAA,MACzF,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,IAAA,EAAM,EAAE,KAAA,EAAO,IAAA,CAAK,KAAA,EAAO,GAAA,EAAK,IAAA,CAAK,GAAA,EAAK;AAAA,KAC7D,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,GAAA,CACE,EAAA,EACA,QAAA,EACA,IAAA,GAA+G,EAAC,EACvF;AACzB,IAAA,OAAO,IAAA,CAAK,GAAG,IAAA,CAAK,OAAA,CAAwB,OAAO,CAAA,WAAA,EAAc,kBAAA,CAAmB,EAAE,CAAC,CAAA,CAAA,EAAI;AAAA,MACzF,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,IAAA,EAAM,EAAE,KAAA,EAAO,IAAA,CAAK,KAAA,EAAO,GAAA,EAAK,IAAA,CAAK,GAAA,EAAK,CAAA;AAAA,MAC5D,IAAA,EAAM,EAAE,GAAG,QAAA,EAAU,EAAA,EAAI,QAAQ,IAAA,CAAK,MAAA,EAAQ,OAAA,EAAS,IAAA,CAAK,OAAA;AAAQ,KACrE,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,MAAA,CAAO,EAAA,EAAY,IAAA,GAA4D,EAAC,EAAkB;AACtG,IAAA,MAAM,IAAA,CAAK,GAAG,IAAA,CAAK,OAAA,CAA8B,UAAU,CAAA,WAAA,EAAc,kBAAA,CAAmB,EAAE,CAAC,CAAA,CAAA,EAAI;AAAA,MACjG,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,IAAA,EAAM,EAAE,KAAA,EAAO,IAAA,CAAK,KAAA,EAAO,GAAA,EAAK,IAAA,CAAK,GAAA,EAAK;AAAA,KAC7D,CAAA;AAAA,EACH;AACF;AAeO,IAAM,YAAN,MAAgB;AAAA,EACrB,YAA6B,EAAA,EAAc;AAAd,IAAA,IAAA,CAAA,EAAA,GAAA,EAAA;AAAA,EAAe;AAAA,EAAf,EAAA;AAAA;AAAA,EAG7B,QAAA,GAAqC;AACnC,IAAA,OAAO,IAAA,CAAK,EAAA,CAAG,IAAA,CAAK,OAAA,CAAyB,OAAO,kBAAkB,CAAA;AAAA,EACxE;AAAA;AAAA,EAGA,cAAc,KAAA,EAAmD;AAC/D,IAAA,OAAO,IAAA,CAAK,GAAG,IAAA,CAAK,OAAA,CAAuB,QAAQ,kBAAA,EAAoB,EAAE,IAAA,EAAM,KAAA,EAAO,CAAA;AAAA,EACxF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,UAAA,CAAW,IAAY,KAAA,EAAmD;AACxE,IAAA,OAAO,IAAA,CAAK,GAAG,IAAA,CAAK,OAAA,CAAuB,OAAO,CAAA,iBAAA,EAAoB,kBAAA,CAAmB,EAAE,CAAC,CAAA,CAAA,EAAI;AAAA,MAC9F,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,cAAc,EAAA,EAA2B;AAC7C,IAAA,MAAM,IAAA,CAAK,GAAG,IAAA,CAAK,OAAA,CAA8B,UAAU,CAAA,iBAAA,EAAoB,kBAAA,CAAmB,EAAE,CAAC,CAAA,CAAE,CAAA;AAAA,EACzG;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YAAY,EAAA,EAA8C;AACxD,IAAA,OAAO,IAAA,CAAK,GAAG,IAAA,CAAK,OAAA;AAAA,MAClB,MAAA;AAAA,MACA,CAAA,iBAAA,EAAoB,kBAAA,CAAmB,EAAE,CAAC,CAAA,KAAA;AAAA,KAC5C;AAAA,EACF;AAAA;AAAA,EAGA,KAAA,GAA+B;AAC7B,IAAA,OAAO,IAAA,CAAK,EAAA,CAAG,IAAA,CAAK,OAAA,CAAsB,OAAO,eAAe,CAAA;AAAA,EAClE;AAAA;AAAA,EAGA,WAAW,KAAA,EAA6C;AACtD,IAAA,OAAO,IAAA,CAAK,GAAG,IAAA,CAAK,OAAA,CAAoB,QAAQ,eAAA,EAAiB,EAAE,IAAA,EAAM,KAAA,EAAO,CAAA;AAAA,EAClF;AAAA;AAAA,EAGA,OAAA,CAAQ,IAAY,KAAA,EAA6C;AAC/D,IAAA,OAAO,IAAA,CAAK,GAAG,IAAA,CAAK,OAAA,CAAoB,OAAO,CAAA,cAAA,EAAiB,kBAAA,CAAmB,EAAE,CAAC,CAAA,CAAA,EAAI;AAAA,MACxF,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH;AAAA;AAAA,EAGA,MAAM,WAAW,EAAA,EAA2B;AAC1C,IAAA,MAAM,IAAA,CAAK,GAAG,IAAA,CAAK,OAAA,CAA8B,UAAU,CAAA,cAAA,EAAiB,kBAAA,CAAmB,EAAE,CAAC,CAAA,CAAE,CAAA;AAAA,EACtG;AACF;;;ACl3BA,WAAA,EAAA;;;ACHA,WAAA,EAAA;AAIA,SAAS,cAAA,CAAe,QAA4B,OAAA,EAA0B;AAC5E,EAAA,IAAI,MAAA,KAAW,SAAS,OAAO,IAAA;AAC/B,EAAA,IAAI,CAAC,MAAA,IAAU,CAAC,iBAAA,CAAkB,IAAA,CAAK,MAAM,CAAA,IAAK,CAAC,iBAAA,CAAkB,IAAA,CAAK,OAAO,CAAA,EAAG,OAAO,KAAA;AAC3F,EAAA,MAAM,CAAA,GAAI,MAAA,CAAO,KAAA,CAAM,GAAG,EAAE,GAAA,CAAI,MAAM,CAAA,EAAG,CAAA,GAAI,OAAA,CAAQ,KAAA,CAAM,GAAG,CAAA,CAAE,IAAI,MAAM,CAAA;AAC1E,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAAE,IAAA,IAAI,CAAA,CAAE,CAAC,CAAA,KAAM,CAAA,CAAE,CAAC,CAAA,EAAG,OAAO,CAAA,CAAE,CAAC,CAAA,GAAK,CAAA,CAAE,CAAC,CAAA;AAAA,EAAI;AACvE,EAAA,OAAO,IAAA;AACT;AAEA,IAAM,qBAAqB,MAAA,CAAO,GAAA,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA,CAAA;AAyFlC,SAAS,SAAS,GAAA,EAAmE;AACnF,EAAA,MAAM,MAAA,GAAS,IAAI,MAAA,IAAU,SAAA;AAC7B,EAAA,OAAO,CAAC,CAAA,KAAM;AACZ,IAAA,IAAI,CAAC,IAAI,KAAA,EAAO;AAChB,IAAA,IAAI;AACF,MAAA,GAAA,CAAI,KAAA,CAAM,EAAE,MAAA,EAAQ,GAAG,GAAG,CAAA;AAAA,IAC5B,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF,CAAA;AACF;AAGA,eAAe,gBAAgB,IAAA,EAAoC;AACjE,EAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,IAAA,CAAK,CAAC,IAAA,EAAM,KAAA,EAAO,2CAA2C,CAAA,EAAG,EAAE,cAAA,EAAgB,EAAA,EAAI,CAAA;AACjH,EAAA,MAAM,cAAc,MAAA,CAAO,MAAA,EAAQ,KAAA,CAAM,kCAAkC,IAAI,CAAC,CAAA;AAChF,EAAA,IAAI,CAAC,WAAA,EAAa,UAAA,CAAW,GAAG,CAAA,IAAK,WAAA,CAAY,MAAA,GAAS,IAAA,IAAQ,iBAAA,CAAkB,IAAA,CAAK,WAAW,CAAA,EAAG;AACrG,IAAA,MAAM,IAAIA,sBAAc,4DAA4D,CAAA;AAAA,EACtF;AACA,EAAA,OAAO,WAAA,CAAY,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAA,GAAI,YAAA;AAC3C;AAQA,eAAsB,YAAA,CAAa,MAAmB,GAAA,EAA0C;AAC9F,EAAA,MAAMQ,KAAAA,GAAO,SAAS,GAAG,CAAA;AACzB,EAAA,IAAI,KAAA,GAAQ,GAAA,CAAI,KAAA,IAAA,CAAU,MAAM,OAAO,QAAa,CAAA,EAAG,WAAA,CAAY,EAAE,CAAA,CAAE,QAAA,CAAS,KAAK,CAAA;AACrF,EAAA,IAAI;AACF,IAAA,MAAM,cAAc,IAAI,CAAA;AACxB,IAAAA,MAAK,EAAE,KAAA,EAAO,SAAA,EAAW,OAAA,EAAS,iBAAiB,CAAA;AACnD,IAAA,MAAM,SAAA,GAAY,MAAM,eAAA,CAAgB,IAAI,CAAA;AAC5C,IAAA,IAAI,CAAC,IAAI,KAAA,EAAO;AAGd,MAAA,KAAA,GAAS,MAAM,kBAAA,CAAmB,IAAA,EAAM,SAAS,CAAA,IAAM,KAAA;AAAA,IACzD;AAEA,IAAA,MAAM,OAAA,GAAU,IAAI,cAAA,IAAkB,WAAA;AACtC,IAAA,MAAM,SAAS,MAAM,WAAA,CAAY,IAAA,EAAM,GAAA,CAAI,MAAM,KAAK,CAAA;AACtD,IAAA,IAAI,OAAO,SAAA,EAAW;AACpB,MAAAA,KAAAA,CAAK;AAAA,QACH,KAAA,EAAO,OAAA;AAAA,QACP,SAAS,MAAA,CAAO,OAAA,GAAU,CAAA,mBAAA,EAAsB,MAAA,CAAO,OAAO,CAAA,CAAA,CAAA,GAAM,oCAAA;AAAA,QACpE,SAAS,MAAA,CAAO;AAAA,OACjB,CAAA;AACD,MAAA,MAAM,QAAA,GAAW,cAAA,CAAe,MAAA,CAAO,OAAA,EAAS,OAAO,CAAA;AAIvD,MAAA,IAAI,CAAC,GAAA,CAAI,WAAA,KAAgB,QAAA,IAAY,CAAC,IAAI,UAAA,CAAA,EAAa;AACrD,QAAAA,KAAAA,CAAK;AAAA,UACH,KAAA,EAAO,MAAA;AAAA,UACP,OAAA,EAAS,QAAA,GAAW,CAAA,mBAAA,EAAsB,MAAA,CAAO,OAAO,CAAA,CAAA,GAAK,4BAAA;AAAA,UAC7D,SAAS,MAAA,CAAO;AAAA,SACjB,CAAA;AACD,QAAA,OAAO,KAAA;AAAA,MACT;AACA,MAAA,IAAA,CAAK,MAAA,CAAO,oBAAA,IAAwB,CAAA,IAAK,CAAA,EAAG;AAC1C,QAAA,IAAI,GAAA,CAAI,WAAA,EAAa,MAAM,IAAIR,sBAAc,+HAA+H,CAAA;AAC5K,QAAAQ,KAAAA,CAAK,EAAE,KAAA,EAAO,MAAA,EAAQ,SAAS,0FAAA,EAA4F,OAAA,EAAS,MAAA,CAAO,OAAA,EAAS,CAAA;AACpJ,QAAA,OAAO,KAAA;AAAA,MACT;AAAA,IACF,CAAA,MAAO;AACL,MAAAA,MAAK,EAAE,KAAA,EAAO,OAAA,EAAS,OAAA,EAAS,kCAAkC,CAAA;AAAA,IACpE;AAEA,IAAA,MAAM,OAAO,IAAA,EAAM,GAAA,EAAKA,OAAM,KAAA,EAAO,SAAA,EAAW,OAAO,SAAS,CAAA;AAEhE,IAAA,IAAI,CAAC,IAAI,KAAA,EAAO,KAAA,GAAS,MAAM,kBAAA,CAAmB,IAAA,EAAM,SAAS,CAAA,IAAM,KAAA;AACvE,IAAA,OAAO,KAAA;AAAA,EACT,SAAS,GAAA,EAAK;AACZ,IAAAA,KAAAA,CAAK,EAAE,KAAA,EAAO,OAAA,EAAS,SAAS,eAAA,EAAiB,KAAA,EAAO,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,MAAA,CAAO,GAAG,GAAG,CAAA;AAC1G,IAAA,MAAM,GAAA;AAAA,EACR;AACF;AAEA,eAAe,kBAAA,CAAmB,MAAmB,SAAA,EAAgD;AACnG,EAAA,MAAM,QAAQ,MAAM,IAAA,CAAK,IAAA,CAAK,CAAC,MAAM,KAAA,EAAO,CAAA,IAAA,EAAO,UAAA,CAAW,SAAA,GAAY,eAAe,CAAC,CAAA,oBAAA,CAAsB,GAAG,EAAE,cAAA,EAAgB,IAAI,CAAA;AACzI,EAAA,MAAM,SAAA,GAAY,KAAA,CAAM,MAAA,EAAQ,IAAA,EAAK;AACrC,EAAA,OAAO,SAAA,IAAa,UAAU,MAAA,IAAU,IAAA,IAAQ,iBAAiB,IAAA,CAAK,SAAS,IAAI,SAAA,GAAY,MAAA;AACjG;AAGA,eAAe,OACb,IAAA,EACA,GAAA,EACAA,KAAAA,EACA,KAAA,EACA,WACA,YAAA,EACe;AACf,EAAA,MAAM,UAAU,SAAA,GAAY,gBAAA;AAC5B,EAAA,MAAM,MAAM,UAAA,CAAW,SAAA,GAAY,YAAY,CAAA,EAAG,OAAA,GAAU,WAAW,OAAO,CAAA;AAC9E,EAAA,MAAM,KAAA,GAAQ,WAAW,SAAA,GAAY,mBAAmB,GAAG,GAAA,GAAM,UAAA,CAAW,YAAY,aAAa,CAAA;AACrG,EAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,SAAA,GAAY,eAAe,CAAA;AACpD,EAAA,MAAM,EAAE,QAAA,EAAU,IAAA,EAAK,GAAI,MAAM,cAAc,IAAI,CAAA;AACnD,EAAA,MAAM,OAAA,GAAU,IAAI,cAAA,IAAkB,WAAA;AACtC,EAAA,IAAI,OAAA,GAAU,EAAA;AACd,EAAA,IAAI,YAAA;AACJ,EAAA,IAAI,IAAI,SAAA,EAAW;AACjB,IAAA,MAAM,UAAU,MAAM,iBAAA,CAAkB,GAAA,CAAI,SAAA,EAAW,UAAU,IAAI,CAAA;AACrE,IAAA,MAAM,KAAA,GAAQ,MAAM,SAAA,CAAU,OAAO,CAAA;AACrC,IAAAA,KAAAA,CAAK,EAAE,KAAA,EAAO,QAAA,EAAU,SAAS,CAAA,kBAAA,EAAqB,QAAQ,IAAI,IAAI,CAAA,EAAA,EAAK,UAAU,KAAA,CAAM,MAAM,CAAC,CAAA,CAAA,CAAA,EAAK,QAAA,EAAU,MAAM,KAAA,EAAO,KAAA,CAAM,QAAQ,CAAA;AAE5I,IAAA,YAAA,GAAe,CAAA,EAAG,OAAO,CAAA,CAAA,EAAA,CAAK,MAAM,OAAO,QAAa,CAAA,EAAG,YAAY,CAAA,CAAA;AACvE,IAAA,MAAM,IAAA,CAAK,IAAA,CAAK,CAAC,IAAA,EAAM,OAAO,CAAA,SAAA,EAAY,UAAA,CAAW,SAAS,CAAC,CAAA,CAAE,CAAA,EAAG,EAAE,cAAA,EAAgB,IAAI,CAAA;AAC1F,IAAA,MAAM,KAAK,OAAA,CAAQ,YAAA,EAAc,OAAO,EAAE,IAAA,EAAM,QAAQ,CAAA;AACxD,IAAA,OAAA,GAAU,CAAA,MAAA,EAAS,UAAA,CAAW,YAAY,CAAC,IAAI,OAAO,CAAA,CAAA;AAAA,EACxD,CAAA,MAAO;AACL,IAAA,IAAI,CAAC,8CAAA,CAA+C,IAAA,CAAK,OAAO,CAAA,EAAG;AACjE,MAAA,MAAM,IAAIR,qBAAA,CAAc,CAAA,6DAAA,EAAgE,OAAO,CAAA,CAAE,CAAA;AAAA,IACnG;AACA,IAAA,MAAM,QAAQ,CAAA,WAAA,EAAc,OAAO,CAAA,CAAA,EAAI,QAAQ,IAAI,IAAI,CAAA,CAAA;AACvD,IAAA,MAAM,OAAA,GAAU,yDAAyD,OAAO,CAAA,CAAA;AAChF,IAAAQ,KAAAA,CAAK,EAAE,KAAA,EAAO,UAAA,EAAY,SAAS,CAAA,oBAAA,EAAuB,OAAO,CAAA,qBAAA,EAAwB,QAAQ,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,CAAA,EAAK,QAAA,EAAU,MAAM,CAAA;AAG9H,IAAA,OAAA,GAAU;AAAA,MACR,CAAA,QAAA,EAAW,UAAA,CAAW,OAAO,CAAC,CAAA,CAAA;AAAA,MAC9B,CAAA,MAAA,EAAS,UAAA,CAAW,KAAK,CAAC,CAAA,CAAA;AAAA,MAC1B,sEAAA;AAAA,MACA,yEAAA;AAAA,MACA,yFAAA;AAAA,MACA,cAAA;AAAA,MACA,CAAA,sHAAA,CAAA;AAAA,MACA,kCAAA;AAAA,MACA,qCAAqC,OAAO,CAAA,YAAA,CAAA;AAAA,MAC5C,iCAAiC,OAAO,CAAA,gCAAA,CAAA;AAAA,MACxC,2CAAA;AAAA,MACA,GAAA;AAAA,MACA,2BAAA;AAAA,MACA,oGAAA;AAAA,MACA,CAAA,2JAAA,CAAA;AAAA,MACA,qHAAA;AAAA,MACA,0EAAA;AAAA,MACA,qCAAA;AAAA,MACA,CAAA,2BAAA,EAA8B,QAAQ,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,CAAA;AAAA,MAC9C,gFAAA;AAAA,MACA,IAAA;AAAA,MACA,YAAY,OAAO,CAAA;AAAA,KACrB,CAAE,KAAK,IAAI,CAAA;AAAA,EACb;AAEA,EAAA,MAAM,MAAA,GAAS;AAAA,IACb,kBAAA;AAAA,IACA,CAAA,SAAA,EAAY,UAAA,CAAW,SAAS,CAAC,CAAA,CAAA;AAAA;AAAA,IAEjC,YAAA,GAAe,QAAQ,UAAA,CAAW,CAAA,MAAA,EAAS,WAAW,YAAY,CAAC,CAAA,CAAE,CAAC,CAAA,KAAA,CAAA,GAAU,EAAA;AAAA,IAChF,CAAA,OAAA,EAAU,UAAA,CAAW,SAAA,GAAY,sBAAsB,CAAC,CAAA,CAAA;AAAA,IACxD,2CAAA;AAAA,IACA,8FAAA;AAAA,IACA,6CAAA;AAAA,IACA,iGAAA;AAAA,IACA,+GAAA;AAAA,IACA,CAAA,SAAA,EAAY,UAAA,CAAW,KAAK,CAAC,CAAA,CAAA;AAAA,IAC7B,CAAC,GAAA,CAAI,KAAA,GAAQ,WAAW,KAAK,CAAA,wBAAA,EAA2B,KAAK,CAAA,KAAA,CAAA,GAAU,EAAA;AAAA,IACvE,aAAA;AAAA,IACA,CAAA,cAAA,EAAiB,UAAA,CAAW,SAAS,CAAC,CAAA,qBAAA,CAAA;AAAA,IACtC,oBAAA;AAAA,IACA,CAAA,wIAAA,EAA2I,IAAI,IAAI,CAAA,sDAAA,CAAA;AAAA,IACnJ,CAAA,QAAA,EAAW,OAAO,CAAA,iBAAA,EAAoB,YAAA,GAAe,MAAM,UAAA,CAAW,YAAY,IAAI,EAAE,CAAA,CAAA;AAAA,IACxF,GAAA;AAAA;AAAA,IAEA,0BAAA;AAAA,IACA,kBAAA;AAAA,IACA,CAAA,WAAA,EAAc,UAAA,CAAW,OAAO,CAAC,CAAA,CAAA;AAAA,IACjC,mCAAA;AAAA,IACA,CAAA,yFAAA,EAA4F,IAAI,IAAI,CAAA,6BAAA,CAAA;AAAA,IACpG,CAAC,IAAI,WAAA,GAAc;AAAA,MACjB,CAAA,8GAAA,CAAA;AAAA,MACA,CAAA,0BAAA,EAA6B,GAAA,CAAI,UAAA,GAAa,8CAAA,GAAiD,MAAM,CAAA,sCAAA;AAAA,KACvG,CAAE,IAAA,CAAK,IAAI,CAAA,GAAI,EAAA;AAAA;AAAA,IAEf,gEAAA;AAAA,IACA,CAAA,0KAAA,CAAA;AAAA,IACA,sGAAA;AAAA,IACA,OAAA;AAAA;AAAA;AAAA,IAGA,CAAA,yFAAA,EAA4F,IAAI,IAAI,CAAA,6BAAA,CAAA;AAAA,IACpG,8BAAA;AAAA,IACA,CAAA,2JAAA,EAA8J,IAAI,IAAI,CAAA,iCAAA,CAAA;AAAA,IACtK,wBAAA;AAAA,IACA,UAAA;AAAA,IACA,CAAA,yGAAA,CAAA;AAAA,IACA,CAAA,6GAAA,CAAA;AAAA,IACA,kKAAA;AAAA,IACA,iCAAA;AAAA,IACA,mDAAA;AAAA,IACA,+GAAA;AAAA,IACA,iFAAA;AAAA,IACA,QAAA;AAAA,IACA,eAAe,qGAAA,GAAwG,EAAA;AAAA,IACvH,IAAA;AAAA,IACA,WAAA;AAAA,IACA,CAAA,MAAA,EAAS,OAAO,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA;AAAA,IACvB,YAAY,GAAG,CAAA,CAAA;AAAA;AAAA;AAAA,IAGf,sFAAsF,GAAA,CAAI,IAAI,gBAAgB,UAAA,CAAW,GAAA,CAAI,KAAK,CAAC,CAAA,WAAA,EAAc,UAAA,CAAW,GAAA,CAAI,QAAQ,CAAC,CAAA,YAAA,EACzJ,KAAK,CAAA,0BAAA,EAA6B,GAAG,MAAM,GAAG,CAAA,wBAAA,CAAA;AAAA;AAAA,IAE9D,sDAAA;AAAA,IACA,uCAAA;AAAA,IACA,CAAA,+GAAA,EAAkH,IAAI,IAAI,CAAA,6BAAA,CAAA;AAAA,IAC1H,CAAA,gHAAA,CAAA;AAAA,IACA,kGAAA;AAAA,IACA,iEAAA;AAAA,IACA,0EAAA;AAAA,IACA,MAAA;AAAA,IACA,cAAA;AAAA,IACA,MAAA;AAAA,IACA,wBAAwB,GAAG,CAAA,qBAAA,CAAA;AAAA,IAC3B,kHAAA;AAAA,IACA,kHAAA;AAAA,IACA,sDAAA;AAAA,IACA;AAAA,GACF,CAAE,KAAK,IAAI,CAAA;AAEX,EAAAA,MAAK,EAAE,KAAA,EAAO,QAAA,EAAU,OAAA,EAAS,oBAAoB,CAAA;AACrD,EAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,IAAA,CAAK,CAAC,MAAA,EAAQ,KAAA,EAAO,MAAM,CAAA,EAAG,EAAE,cAAA,EAAgB,GAAA,EAAK,CAAA;AAC5E,EAAA,MAAM,GAAA,GAAM,IAAI,MAAA,IAAU,EAAA;AAC1B,EAAA,IAAI,GAAA,CAAI,QAAA,CAAS,0BAA0B,CAAA,EAAG;AAC5C,IAAA,IAAI,GAAA,CAAI,WAAA,EAAa,MAAM,IAAIR,sBAAc,wFAAwF,CAAA;AACrI,IAAAQ,MAAK,EAAE,KAAA,EAAO,MAAA,EAAQ,OAAA,EAAS,kEAAkE,CAAA;AACjG,IAAA;AAAA,EACF;AACA,EAAA,IAAI,CAAC,GAAA,CAAI,QAAA,CAAS,gBAAgB,CAAA,EAAG;AACnC,IAAA,MAAM,IAAIR,qBAAA;AAAA,MACR,4EACG,GAAA,IAAO,GAAA,CAAI,UAAU,GAAA,CAAI,KAAA,IAAS,eAAe,IAAA;AAAK,KAC3D;AAAA,EACF;AACA,EAAAQ,MAAK,EAAE,KAAA,EAAO,OAAA,EAAS,OAAA,EAAS,+BAA+B,CAAA;AACjE;AAGA,eAAe,WAAA,CAAY,IAAA,EAAmB,IAAA,EAAc,KAAA,EAAiG;AAC3J,EAAA,MAAM,MAAA,GACJ,mCAAmC,UAAA,CAAW,CAAA,sBAAA,EAAyB,KAAK,CAAA,CAAE,CAAC,qBAAqB,IAAI,CAAA,wFAAA,CAAA;AAE1G,EAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,IAAA,CAAK,CAAC,MAAA,EAAQ,KAAA,EAAO,MAAM,CAAA,EAAG,EAAE,cAAA,EAAgB,EAAA,EAAI,CAAA;AAC3E,EAAA,MAAM,IAAA,GAAA,CAAA,CAAS,GAAA,CAAI,MAAA,IAAU,EAAA,EAAI,KAAA,CAAM,4BAA4B,CAAA,GAAI,CAAC,CAAA,IAAK,EAAA,EAAI,IAAA,EAAK;AACtF,EAAA,IAAI,CAAC,IAAA,EAAM,OAAO,EAAE,WAAW,KAAA,EAAM;AACrC,EAAA,IAAI;AACF,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AACzB,IAAA,OAAO;AAAA,MAAE,SAAA,EAAW,IAAA;AAAA,MAAM,SAAS,OAAO,CAAA,CAAE,OAAA,KAAY,QAAA,GAAW,EAAE,OAAA,GAAU,KAAA,CAAA;AAAA,MAC7E,sBAAsB,OAAO,CAAA,CAAE,oBAAA,KAAyB,QAAA,GAAW,EAAE,oBAAA,GAAuB,KAAA;AAAA,KAAU;AAAA,EAC1G,CAAA,CAAA,MAAQ;AAEN,IAAA,OAAO,EAAE,WAAW,IAAA,EAAK;AAAA,EAC3B;AACF;AAEA,eAAe,cAAc,IAAA,EAAuF;AAClH,EAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,IAAA,CAAK,CAAC,MAAA,EAAQ,KAAA,EAAO,CAAA,yDAAA,CAA2D,CAAA,EAAG,EAAE,cAAA,EAAgB,EAAA,EAAI,CAAA;AAChI,EAAA,MAAM,EAAA,GAAA,CAAA,CAAO,GAAA,CAAI,MAAA,IAAU,EAAA,EAAI,KAAA,CAAM,gBAAgB,CAAA,GAAI,CAAC,CAAA,IAAK,EAAA,EAAI,IAAA,EAAK,CAAE,WAAA,EAAY;AACtF,EAAA,MAAM,OAAA,GAAA,CAAA,CAAY,GAAA,CAAI,MAAA,IAAU,EAAA,EAAI,KAAA,CAAM,kBAAkB,CAAA,GAAI,CAAC,CAAA,IAAK,EAAA,EAAI,IAAA,EAAK;AAC/E,EAAA,MAAM,IAAA,GAAO,OAAA,KAAY,SAAA,IAAa,OAAA,KAAY,OAAA,GAAU,UACxD,OAAA,KAAY,QAAA,IAAY,OAAA,KAAY,OAAA,GAAU,OAAA,GAAU,MAAA;AAC5D,EAAA,IAAK,EAAA,KAAO,OAAA,IAAW,EAAA,KAAO,QAAA,IAAa,CAAC,IAAA,EAAM;AAChD,IAAA,MAAM,IAAIR,sBAAc,CAAA,yCAAA,EAA4C,EAAA,IAAM,SAAS,CAAA,CAAA,EAAI,OAAA,IAAW,SAAS,CAAA,2CAAA,CAA6C,CAAA;AAAA,EAC1J;AACA,EAAA,OAAO,EAAE,QAAA,EAAU,EAAA,EAAI,IAAA,EAAK;AAC9B;AAGA,eAAe,aAAA,CAAc,IAAA,EAAmB,SAAA,GAAY,GAAA,EAAsB;AAChF,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA;AAC9B,EAAA,IAAI,OAAA,GAAmB,IAAA;AACvB,EAAA,OAAO,IAAA,CAAK,GAAA,EAAI,GAAI,QAAA,EAAU;AAC5B,IAAA,IAAI;AACF,MAAA,MAAM,CAAA,GAAI,MAAM,IAAA,CAAK,IAAA,CAAK,CAAC,MAAA,EAAQ,KAAA,EAAO,eAAe,CAAA,EAAG,EAAE,cAAA,EAAgB,EAAA,EAAI,CAAA;AAClF,MAAA,IAAA,CAAK,CAAA,CAAE,MAAA,IAAU,EAAA,EAAI,QAAA,CAAS,UAAU,CAAA,EAAG;AAAA,IAC7C,SAAS,CAAA,EAAG;AACV,MAAA,OAAA,GAAU,CAAA;AAAA,IACZ;AACA,IAAA,MAAM,MAAM,GAAI,CAAA;AAAA,EAClB;AACA,EAAA,MAAM,IAAIA,qBAAA;AAAA,IACR,6DAAA;AAAA,IACA,OAAA,GAAU,EAAE,KAAA,EAAO,OAAA,EAAQ,GAAI;AAAA,GACjC;AACF;AAMA,eAAsB,kBAAA,CACpB,UACA,IAAA,EACiB;AACjB,EAAA,OAAO,iBAAA,CAAkB,QAAA,EAAU,OAAA,EAAS,IAAI,CAAA;AAClD;AAEA,eAAe,iBAAA,CACb,QAAA,EACA,QAAA,EACA,IAAA,EACiB;AACjB,EAAA,MAAM,EAAA,GAAK,MAAM,OAAO,IAAS,CAAA;AACjC,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,MAAM,QAAA,GAAW,SAAS,UAAA,CAAW,MAAA,EAAQ,QAAQ,CAAA,CAAE,UAAA,CAAW,UAAU,IAAI,CAAA;AAChF,IAAA,IAAI,CAAC,EAAA,CAAG,UAAA,CAAW,QAAQ,CAAA,EAAG;AAC5B,MAAA,MAAM,IAAIA,qBAAA,CAAc,CAAA,yCAAA,EAA4C,QAAQ,CAAA,CAAE,CAAA;AAAA,IAChF;AACA,IAAA,OAAO,QAAA;AAAA,EACT;AACA,EAAA,OAAO,kBAAA,CAAmB,EAAE,QAAA,EAAU,IAAA,EAAM,SAAS,OAAA,GAAU,OAAA,GAAU,OAAO,CAAA;AAClF;AAEA,eAAe,UAAU,CAAA,EAAgC;AACvD,EAAA,MAAM,EAAA,GAAK,MAAM,OAAO,aAAkB,CAAA;AAC1C,EAAA,OAAO,EAAA,CAAG,SAAS,CAAC,CAAA;AACtB;AAEA,SAAS,MAAM,EAAA,EAA2B;AACxC,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,MAAM,UAAA,CAAW,CAAA,EAAG,EAAE,CAAC,CAAA;AAC7C;AAEA,SAAS,WAAW,KAAA,EAAuB;AACzC,EAAA,OAAO,CAAA,CAAA,EAAI,KAAA,CAAM,OAAA,CAAQ,IAAA,EAAM,OAAO,CAAC,CAAA,CAAA,CAAA;AACzC;AAEA,SAAS,UAAU,KAAA,EAAuB;AACxC,EAAA,OAAO,IAAI,KAAA,IAAS,IAAA,GAAO,IAAA,CAAA,EAAO,OAAA,CAAQ,CAAC,CAAC,CAAA,GAAA,CAAA;AAC9C;;;AC5aA,WAAA,EAAA;AAgDA,eAAsB,kBAAA,CACpB,IAAA,EACA,GAAA,EACA,KAAA,EAC0B;AAC1B,EAAA,MAAM,MAAA,GAAS,IAAI,MAAA,IAAU,WAAA;AAE7B,EAAA,MAAMQ,KAAAA,GAAO,CAAC,CAAA,KAAyC;AACrD,IAAA,IAAI,CAAC,KAAA,EAAO;AACZ,IAAA,IAAI;AACF,MAAA,KAAA,CAAM,EAAE,MAAA,EAAQ,GAAG,CAAA,EAAG,CAAA;AAAA,IACxB,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF,CAAA;AAGA,EAAA,MAAM,iBAAA,CAAkB,IAAA,EAAM,GAAA,CAAI,OAAA,IAAW,SAASA,KAAI,CAAA;AAG1D,EAAA,MAAM,EAAE,aAAa,QAAA,EAAU,OAAA,KAAY,MAAM,YAAA,CAAa,IAAA,EAAM,GAAA,EAAKA,KAAI,CAAA;AAG7E,EAAA,MAAM,QAAQ,MAAM,YAAA,CAAa,IAAI,aAAA,CAAc,IAAA,EAAM,WAAW,CAAA,EAAG;AAAA,IACrE,MAAM,GAAA,CAAI,UAAA;AAAA,IACV,OAAO,GAAA,CAAI,KAAA;AAAA,IACX,UAAU,GAAA,CAAI,QAAA;AAAA,IACd,WAAW,GAAA,CAAI,SAAA;AAAA,IACf,YAAY,GAAA,CAAI,UAAA;AAAA,IAChB,MAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAA,IAAI,OAAA,GAAU,KAAA;AACd,EAAA,MAAM,OAAO,YAA2B;AACtC,IAAA,IAAI,OAAA,EAAS;AACb,IAAA,OAAA,GAAU,IAAA;AACV,IAAA,IAAI,CAAC,OAAA,IAAW,EAAE,GAAA,CAAI,cAAc,IAAA,CAAA,EAAO;AAC3C,IAAA,IAAI;AACF,MAAA,MAAM,KAAK,IAAA,CAAK,CAAC,UAAU,IAAA,EAAM,IAAA,EAAM,WAAW,CAAC,CAAA;AAAA,IACrD,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF,CAAA;AAEA,EAAA,OAAO,EAAE,WAAA,EAAa,QAAA,EAAU,KAAA,EAAO,IAAA,EAAK;AAC9C;AAUO,IAAM,gBAAN,MAA2C;AAAA,EAChD,WAAA,CACmB,MACA,WAAA,EACjB;AAFiB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,WAAA,GAAA,WAAA;AAAA,EAChB;AAAA,EAFgB,IAAA;AAAA,EACA,WAAA;AAAA,EAGnB,IAAA,CAAK,MAAgB,IAAA,EAAyD;AAE5E,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,CAAC,QAAA,EAAU,MAAA,EAAQ,OAAA,EAAS,8BAAA,EAAgC,IAAA,CAAK,WAAA,EAAa,GAAG,IAAI,GAAG,IAAI,CAAA;AAAA,EACpH;AAAA,EAEA,MAAM,OAAA,CAAQ,IAAA,EAAc,IAAA,EAAkB,IAAA,EAAyC;AACrF,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,WAAA,CAAY,GAAG,CAAA;AAClC,IAAA,MAAM,MAAM,KAAA,GAAQ,CAAA,GAAI,KAAK,KAAA,CAAM,CAAA,EAAG,KAAK,CAAA,GAAI,GAAA;AAC/C,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,CAAC,CAAA;AACjC,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,IAAQ,MAAA;AAE3B,IAAA,MAAM,GAAA,GAAM,YAAY,IAAA,CAAK,WAAA,CAAY,MAAM,CAAA,EAAG,EAAE,CAAC,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA;AAE7D,IAAA,MAAM,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,CAAC,QAAA,EAAU,MAAA,EAAQ,IAAA,CAAK,WAAA,EAAa,OAAA,EAAS,IAAA,EAAM,GAAG,CAAC,CAAA;AAC7E,IAAA,MAAM,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,GAAA,EAAK,MAAM,IAAI,CAAA;AACvC,IAAA,MAAM,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,CAAC,QAAA,EAAU,IAAA,EAAM,GAAA,EAAK,CAAA,EAAG,IAAA,CAAK,WAAW,CAAA,CAAA,EAAI,IAAI,EAAE,CAAC,CAAA;AACzE,IAAA,MAAM,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,CAAC,QAAA,EAAU,MAAA,EAAQ,IAAA,CAAK,WAAA,EAAa,OAAA,EAAS,IAAA,EAAM,IAAI,CAAC,CAAA;AAC9E,IAAA,MAAM,KAAK,IAAA,CAAK,IAAA,CAAK,CAAC,IAAA,EAAM,IAAA,EAAM,GAAG,CAAC,CAAA;AAAA,EACxC;AACF;AAOA,eAAe,iBAAA,CACb,IAAA,EACA,OAAA,EACAA,KAAAA,EACe;AACf,EAAA,IAAI,KAAA,GAAQ,MAAM,YAAA,CAAa,IAAI,CAAA;AAEnC,EAAA,IAAI,KAAA,CAAM,WAAW,SAAA,EAAW;AAC9B,IAAAA,KAAAA,CAAK,EAAE,KAAA,EAAO,SAAA,EAAW,OAAA,EAAS,CAAA,iBAAA,EAAoB,KAAA,CAAM,OAAA,IAAW,GAAG,CAAA,CAAA,CAAA,EAAK,OAAA,EAAS,KAAA,CAAM,SAAS,CAAA;AACvG,IAAA;AAAA,EACF;AAEA,EAAA,IAAI,KAAA,CAAM,WAAW,QAAA,EAAU;AAC7B,IAAA,MAAM,IAAIR,qBAAA;AAAA,MACR;AAAA,KAEF;AAAA,EACF;AAEA,EAAA,IAAI,KAAA,CAAM,WAAW,SAAA,EAAW;AAC9B,IAAAQ,MAAK,EAAE,KAAA,EAAO,SAAA,EAAW,OAAA,EAAS,iDAAiD,CAAA;AACnF,IAAA,MAAM,YAAY,IAAI,CAAA;AACtB,IAAA,KAAA,GAAQ,MAAM,aAAa,IAAI,CAAA;AAC/B,IAAA,IAAI,KAAA,CAAM,WAAW,SAAA,EAAW;AAC9B,MAAAA,KAAAA,CAAK,EAAE,KAAA,EAAO,SAAA,EAAW,OAAA,EAAS,CAAA,iBAAA,EAAoB,KAAA,CAAM,OAAA,IAAW,GAAG,CAAA,CAAA,CAAA,EAAK,OAAA,EAAS,KAAA,CAAM,SAAS,CAAA;AACvG,MAAA;AAAA,IACF;AACA,IAAA,MAAM,IAAIR,sBAAc,qEAAqE,CAAA;AAAA,EAC/F;AAGA,EAAA,IAAI,YAAY,WAAA,EAAa;AAC3B,IAAA,MAAM,IAAIA,qBAAA;AAAA,MACR;AAAA,KAIF;AAAA,EACF;AAEA,EAAAQ,MAAK,EAAE,KAAA,EAAO,SAAA,EAAW,OAAA,EAAS,mDAAmD,CAAA;AACrF,EAAA,MAAM,cAAc,IAAI,CAAA;AACxB,EAAA,MAAM,YAAY,IAAI,CAAA;AACtB,EAAA,KAAA,GAAQ,MAAM,aAAa,IAAI,CAAA;AAC/B,EAAA,IAAI,KAAA,CAAM,WAAW,SAAA,EAAW;AAC9B,IAAA,MAAM,IAAIR,qBAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AACA,EAAAQ,KAAAA,CAAK,EAAE,KAAA,EAAO,SAAA,EAAW,OAAA,EAAS,CAAA,+BAAA,EAAkC,KAAA,CAAM,OAAA,IAAW,GAAG,CAAA,CAAA,CAAA,EAAK,OAAA,EAAS,KAAA,CAAM,SAAS,CAAA;AACvH;AAGA,eAAe,aAAa,IAAA,EAAwE;AAClG,EAAA,MAAM,MAAA,GAAS;AAAA,IACb,kFAAA;AAAA,IACA,6GAAA;AAAA,IACA,4CAAA;AAAA,IACA,gBAAA;AAAA,IACA,kDAAA;AAAA,IACA,kCAAA;AAAA,IACA;AAAA,GACF,CAAE,KAAK,IAAI,CAAA;AACX,EAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,IAAA,CAAK,CAAC,MAAA,EAAQ,KAAA,EAAO,MAAM,CAAA,EAAG,EAAE,cAAA,EAAgB,EAAA,EAAI,CAAA;AAC3E,EAAA,MAAM,CAAA,GAAA,CAAK,GAAA,CAAI,MAAA,IAAU,EAAA,EAAI,MAAM,kCAAkC,CAAA;AACrE,EAAA,MAAM,MAAA,GAAU,CAAA,GAAI,CAAC,CAAA,IAAsB,QAAA;AAC3C,EAAA,MAAM,OAAA,GAAU,CAAA,GAAI,CAAC,CAAA,EAAG,MAAK,IAAK,MAAA;AAClC,EAAA,OAAO,EAAE,QAAQ,OAAA,EAAQ;AAC3B;AAGA,eAAe,cAAc,IAAA,EAAkC;AAC7D,EAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,IAAA,CAAK,CAAC,MAAA,EAAQ,KAAA,EAAO,wCAAwC,CAAA,EAAG;AAAA,IACrF,cAAA,EAAgB;AAAA,GACjB,CAAA;AACD,EAAA,IAAA,CAAK,GAAA,CAAI,QAAA,IAAY,CAAA,MAAO,CAAA,EAAG;AAC7B,IAAA,MAAM,IAAIR,qBAAA;AAAA,MACR,oEACG,GAAA,CAAI,MAAA,IAAU,GAAA,CAAI,MAAA,IAAU,eAAe,IAAA;AAAK,KACrD;AAAA,EACF;AACF;AAGA,eAAe,YAAY,IAAA,EAAkC;AAC3D,EAAA,MAAM,IAAA,CAAK,IAAA;AAAA,IACT,CAAC,MAAA,EAAQ,KAAA,EAAO,uFAAuF,CAAA;AAAA,IACvG,EAAE,gBAAgB,EAAA;AAAG,GACvB;AACF;AAKA,eAAe,YAAA,CACb,IAAA,EACA,GAAA,EACAQ,KAAAA,EACsE;AACtE,EAAA,MAAM,OAAO,GAAA,CAAI,UAAA;AAEjB,EAAA,IAAI,GAAA,CAAI,cAAc,MAAA,EAAW;AAE/B,IAAA,MAAM,KAAK,IAAA,CAAK,CAAC,UAAU,OAAA,EAAS,GAAA,CAAI,SAAS,CAAC,CAAA;AAClD,IAAA,MAAMC,YAAW,MAAM,eAAA,CAAgB,IAAA,EAAM,GAAA,CAAI,WAAW,IAAI,CAAA;AAChE,IAAAD,KAAAA,CAAK;AAAA,MACH,KAAA,EAAO,WAAA;AAAA,MACP,OAAA,EAAS,CAAA,sBAAA,EAAyB,GAAA,CAAI,SAAS,mCAAmCC,SAAQ,CAAA;AAAA,KAC3F,CAAA;AACD,IAAA,OAAO,EAAE,WAAA,EAAa,GAAA,CAAI,WAAW,QAAA,EAAAA,SAAAA,EAAU,SAAS,KAAA,EAAM;AAAA,EAChE;AAEA,EAAA,IAAI,CAAC,IAAI,KAAA,EAAO;AACd,IAAA,MAAM,IAAIT,qBAAA;AAAA,MACR;AAAA,KAEF;AAAA,EACF;AAGA,EAAA,MAAM,UAAU,CAAC,QAAA,EAAU,KAAA,EAAO,IAAA,EAAM,SAAS,8BAA8B,CAAA;AAC/E,EAAA,IAAI,IAAI,IAAA,EAAM,OAAA,CAAQ,IAAA,CAAK,QAAA,EAAU,IAAI,IAAI,CAAA;AAC7C,EAAA,OAAA,CAAQ,IAAA,CAAK,IAAA,EAAM,CAAA,YAAA,EAAe,IAAI,CAAA,CAAE,CAAA;AACxC,EAAA,IAAI,IAAI,UAAA,EAAY,MAAA,UAAgB,IAAA,CAAK,GAAG,IAAI,UAAU,CAAA;AAC1D,EAAA,OAAA,CAAQ,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,OAAA,EAAS,UAAU,CAAA;AAE3C,EAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,IAAA,CAAK,SAAS,EAAE,cAAA,EAAgB,KAAK,CAAA;AAC5D,EAAA,MAAM,WAAA,GAAA,CAAe,GAAA,CAAI,MAAA,IAAU,EAAA,EAAI,IAAA,GAAO,KAAA,CAAM,KAAK,CAAA,CAAE,GAAA,EAAI,IAAK,EAAA;AACpE,EAAA,IAAI,CAAC,WAAA,IAAA,CAAgB,GAAA,CAAI,QAAA,IAAY,OAAO,CAAA,EAAG;AAC7C,IAAA,MAAM,IAAIA,qBAAA;AAAA,MACR,yDACG,GAAA,CAAI,MAAA,IAAU,GAAA,CAAI,MAAA,IAAU,eAAe,IAAA;AAAK,KACrD;AAAA,EACF;AAEA,EAAA,MAAM,QAAA,GAAW,MAAM,eAAA,CAAgB,IAAA,EAAM,aAAa,IAAI,CAAA;AAC9D,EAAAQ,KAAAA,CAAK;AAAA,IACH,KAAA,EAAO,WAAA;AAAA,IACP,OAAA,EAAS,aAAa,WAAA,CAAY,KAAA,CAAM,GAAG,EAAE,CAAC,sCAAsC,QAAQ,CAAA;AAAA,GAC7F,CAAA;AACD,EAAA,OAAO,EAAE,WAAA,EAAa,QAAA,EAAU,OAAA,EAAS,IAAA,EAAK;AAChD;AAGA,eAAe,eAAA,CAAgB,IAAA,EAAmB,WAAA,EAAqB,IAAA,EAA+B;AACpG,EAAA,MAAM,GAAA,GAAM,MAAM,IAAA,CAAK,IAAA,CAAK,CAAC,QAAA,EAAU,MAAA,EAAQ,WAAA,EAAa,CAAA,EAAG,IAAI,CAAA,IAAA,CAAM,CAAC,CAAA;AAC1E,EAAA,MAAM,IAAA,GAAA,CAAQ,GAAA,CAAI,MAAA,IAAU,EAAA,EACzB,MAAM,IAAI,CAAA,CACV,GAAA,CAAI,CAAC,MAAM,CAAA,CAAE,IAAA,EAAM,CAAA,CACnB,KAAK,OAAO,CAAA;AACf,EAAA,MAAM,QAAA,GAAW,IAAA,GAAO,MAAA,CAAO,QAAA,CAAS,IAAA,CAAK,KAAA,CAAM,YAAY,CAAA,GAAI,CAAC,CAAA,IAAK,EAAA,EAAI,EAAE,CAAA,GAAI,GAAA;AACnF,EAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,QAAQ,CAAA,IAAK,YAAY,CAAA,EAAG;AAC/C,IAAA,MAAM,IAAIR,qBAAA;AAAA,MACR,CAAA,wDAAA,EAA2D,IAAI,CAAA,kBAAA,EAC1D,WAAA,CAAY,MAAM,CAAA,EAAG,EAAE,CAAC,CAAA,EAAA,CAAA,GAC1B,OAAA,CAAQ,GAAG,CAAA,GACZ,CAAA,oBAAA,EAAuB,KAAK,SAAA,CAAA,CAAW,GAAA,CAAI,UAAU,EAAA,EAAI,IAAA,EAAM,CAAC,CAAA;AAAA,KACpE;AAAA,EACF;AACA,EAAA,OAAO,QAAA;AACT;AAGA,SAAS,QAAQ,GAAA,EAAyB;AACxC,EAAA,OAAA,CAAQ,IAAI,MAAA,IAAU,EAAA,EAAI,IAAA,EAAK,KAAM,KACjC,yFAAA,GACA,EAAA;AACN;;;AF/OO,SAAS,IAAI,IAAA,EAA0B;AAC5C,EAAA,OAAO,EAAE,MAAM,KAAA,EAAO,OAAA,EAAS,CAAC,IAAA,KAAS,UAAA,CAAW,IAAA,EAAM,IAAI,CAAA,EAAE;AAClE;AAEA,IAAM,YAAA,GAAe,IAAA;AACrB,IAAM,aAAA,GAAgB,aAAA;AACtB,IAAM,iBAAA,GAAoB,OAAA;AAuD1B,IAAM,UAAN,MAAqC;AAAA,EACnC,YAA6B,MAAA,EAAoB;AAApB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAAA,EAAqB;AAAA,EAArB,MAAA;AAAA,EAE7B,KAAK,IAAA,EAAqC;AACxC,IAAA,MAAM,OAAA,GAAU,cAAc,IAAI,CAAA;AAClC,IAAA,OAAO,IAAI,OAAA,CAAoB,CAAC,OAAA,EAAS,MAAA,KAAW;AAClD,MAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,OAAA,EAAS,CAAC,KAAK,OAAA,KAAY;AAC1C,QAAA,IAAI,GAAA,EAAK;AACP,UAAA,MAAA,CAAO,GAAG,CAAA;AACV,UAAA;AAAA,QACF;AACA,QAAA,MAAM,MAAgB,EAAC;AACvB,QAAA,MAAM,OAAiB,EAAC;AACxB,QAAA,IAAI,IAAA;AACJ,QAAA,OAAA,CAAQ,EAAA,CAAG,MAAA,EAAQ,CAAC,KAAA,KAAkB,GAAA,CAAI,KAAK,MAAA,CAAO,IAAA,CAAK,KAAK,CAAC,CAAC,CAAA;AAClE,QAAA,OAAA,CAAQ,MAAA,EAAQ,EAAA,CAAG,MAAA,EAAQ,CAAC,KAAA,KAAkB,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,KAAK,CAAC,CAAC,CAAA;AAC3E,QAAA,OAAA,CAAQ,EAAA,CAAG,OAAA,EAAS,CAAC,CAAA,KAAe;AAClC,UAAA,IAAA,GAAO,OAAO,CAAA,KAAM,QAAA,GAAW,CAAA,GAAI,MAAA;AACnC,UAAA,OAAA,CAAQ;AAAA,YACN,QAAA,EAAU,IAAA;AAAA,YACV,QAAQ,MAAA,CAAO,MAAA,CAAO,GAAG,CAAA,CAAE,SAAS,MAAM,CAAA;AAAA,YAC1C,QAAQ,MAAA,CAAO,MAAA,CAAO,IAAI,CAAA,CAAE,SAAS,MAAM;AAAA,WAC5C,CAAA;AAAA,QACH,CAAC,CAAA;AACD,QAAA,OAAA,CAAQ,GAAG,OAAA,EAAS,CAAC,CAAA,KAAa,MAAA,CAAO,CAAC,CAAC,CAAA;AAAA,MAC7C,CAAC,CAAA;AAAA,IACH,CAAC,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,OAAA,CAAQ,IAAA,EAAc,IAAA,EAAkB,IAAA,EAAyC;AAErF,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,WAAA,CAAY,GAAG,CAAA;AAClC,IAAA,MAAM,MAAM,KAAA,GAAQ,CAAA,GAAI,KAAK,KAAA,CAAM,CAAA,EAAG,KAAK,CAAA,GAAI,GAAA;AAC/C,IAAA,MAAM,KAAK,IAAA,CAAK,CAAC,OAAA,EAAS,IAAA,EAAM,GAAG,CAAC,CAAA;AAEpC,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,IAAA,EAAK;AAC7B,IAAA,MAAM,OAAO,QAAA,CAAS,IAAA,EAAM,IAAA,IAAQ,MAAA,EAAQ,CAAC,CAAA,IAAK,GAAA;AAClD,IAAA,MAAM,IAAI,OAAA,CAAc,CAAC,OAAA,EAAS,MAAA,KAAW;AAC3C,MAAA,MAAM,KAAK,IAAA,CAAK,iBAAA,CAAkB,IAAA,EAAM,EAAE,MAAM,CAAA;AAChD,MAAA,IAAI,IAAA,GAAO,KAAA;AACX,MAAA,MAAM,SAAS,MAAM;AACnB,QAAA,IAAI,CAAC,IAAA,EAAM;AACT,UAAA,IAAA,GAAO,IAAA;AACP,UAAA,OAAA,EAAQ;AAAA,QACV;AAAA,MACF,CAAA;AACA,MAAA,EAAA,CAAG,GAAG,OAAA,EAAS,CAAC,CAAA,KAAa,MAAA,CAAO,CAAC,CAAC,CAAA;AACtC,MAAA,EAAA,CAAG,EAAA,CAAG,SAAS,MAAM,CAAA;AACrB,MAAA,EAAA,CAAG,EAAA,CAAG,UAAU,MAAM,CAAA;AACtB,MAAA,EAAA,CAAG,GAAA,GAAM,MAAA,CAAO,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,IAC5B,CAAC,CAAA;AAAA,EACH;AAAA,EAEQ,IAAA,GAA0B;AAChC,IAAA,OAAO,IAAI,OAAA,CAAkB,CAAC,OAAA,EAAS,MAAA,KAAW;AAChD,MAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,CAAC,GAAA,EAAK,IAAA,KAAU,GAAA,GAAM,MAAA,CAAO,GAAG,CAAA,GAAI,OAAA,CAAQ,IAAI,CAAE,CAAA;AAAA,IACrE,CAAC,CAAA;AAAA,EACH;AACF,CAAA;AAIA,eAAe,UAAA,CAAW,MAAkB,IAAA,EAA0C;AACpF,EAAA,MAAM,GAAA,GAAM,MAAM,UAAA,EAAW;AAC7B,EAAA,MAAM,GAAA,GAAM,MAAM,OAAO,KAAU,CAAA;AACnC,EAAA,MAAM,MAAA,GAAS,MAAM,cAAA,CAAe,GAAA,EAAK,IAAI,CAAA;AAC7C,EAAA,MAAM,UAAA,GAAa,KAAK,UAAA,IAAc,YAAA;AACtC,EAAA,MAAM,aAAyB,CAAC,CAAA,EAAG,SAAS,YAAA,CAAa,GAAA,EAAK,GAAG,IAAI,CAAA;AAErE,EAAA,MAAMU,OAAAA,GAAS;AAAA,IACb,UAAA;AAAA,IACA,KAAA,EAAO,IAAA,CAAK,SAAA,IAAa,IAAA,CAAK,KAAA,IAAS,aAAA;AAAA,IACvC,QAAA,EAAU,KAAK,QAAA,IAAY,iBAAA;AAAA,IAC3B,WAAW,IAAA,CAAK,SAAA;AAAA,IAChB,YAAY,IAAA,CAAK,UAAA;AAAA,IACjB,UAAA,EAAY,KAAK,UAAA,IAAc,IAAA;AAAA,IAC/B,OAAO,IAAA,CAAK;AAAA,GACd;AAIA,EAAA,IAAI,KAAK,MAAA,EAAQ;AACf,IAAA,OAAO,qBAAA,CAAsB,QAAQ,UAAA,EAAY;AAAA,MAC/C,GAAGA,OAAAA;AAAA,MACH,IAAI,CAAA,EAAG,IAAA,CAAK,QAAQ,CAAA,CAAA,EAAI,KAAK,IAAI,CAAA,OAAA,CAAA;AAAA,MACjC,QAAQ,IAAA,CAAK;AAAA,KACd,CAAA;AAAA,EACH;AAEA,EAAA,OAAO,YAAA,CAAa,QAAQ,UAAA,EAAY;AAAA,IACtC,GAAGA,OAAAA;AAAA,IACH,EAAA,EAAI,GAAG,IAAA,CAAK,QAAQ,IAAI,IAAA,CAAK,IAAI,IAAI,UAAU,CAAA;AAAA,GAChD,CAAA;AACH;AAwBA,eAAsB,YAAA,CACpB,MAAA,EACA,UAAA,EACA,GAAA,EACuB;AACvB,EAAA,MAAM,QAAQ,MAAM,YAAA,CAAa,IAAI,OAAA,CAAQ,MAAM,CAAA,EAAG;AAAA,IACpD,MAAM,GAAA,CAAI,UAAA;AAAA,IACV,OAAO,GAAA,CAAI,KAAA;AAAA,IACX,UAAU,GAAA,CAAI,QAAA;AAAA,IACd,WAAW,GAAA,CAAI,SAAA;AAAA,IACf,YAAY,GAAA,CAAI,UAAA;AAAA,IAChB,MAAA,EAAQ,KAAA;AAAA,IACR,OAAO,GAAA,CAAI;AAAA,GACZ,CAAA;AAED,EAAA,MAAM,MAAA,GAAS,MAAM,UAAA,CAAW,MAAA,EAAQ,IAAI,UAAU,CAAA;AAEtD,EAAA,IAAI,OAAA,GAAU,KAAA;AACd,EAAA,MAAM,OAAO,YAA2B;AACtC,IAAA,IAAI,OAAA,EAAS;AACb,IAAA,OAAA,GAAU,IAAA;AAEV,IAAA,MAAM,MAAA,CAAO,KAAA,EAAM,CAAE,KAAA,CAAM,MAAM;AAAA,IAAC,CAAC,CAAA;AACnC,IAAA,IAAI,GAAA,CAAI,cAAc,IAAA,EAAM;AAC1B,MAAA,IAAI;AACF,QAAA,MAAA,CAAO,GAAA,EAAI;AAAA,MACb,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF,CAAA;AAGA,EAAA,OAAO,EAAE,IAAI,GAAA,CAAI,EAAA,EAAI,SAAS,MAAA,CAAO,OAAA,EAAS,OAAO,IAAA,EAAK;AAC5D;AA2BA,eAAsB,qBAAA,CACpB,MAAA,EACA,UAAA,EACA,GAAA,EACuB;AACvB,EAAA,MAAM,YAAY,MAAM,kBAAA;AAAA,IACtB,IAAI,QAAQ,MAAM,CAAA;AAAA,IAClB;AAAA,MACE,KAAA,EAAO,IAAI,MAAA,CAAO,KAAA;AAAA,MAClB,SAAA,EAAW,IAAI,MAAA,CAAO,SAAA;AAAA,MACtB,IAAA,EAAM,IAAI,MAAA,CAAO,IAAA;AAAA,MACjB,OAAA,EAAS,IAAI,MAAA,CAAO,OAAA;AAAA,MACpB,UAAA,EAAY,IAAI,MAAA,CAAO,UAAA;AAAA,MACvB,YAAY,GAAA,CAAI,UAAA;AAAA,MAChB,OAAO,GAAA,CAAI,KAAA;AAAA,MACX,UAAU,GAAA,CAAI,QAAA;AAAA,MACd,WAAW,GAAA,CAAI,SAAA;AAAA,MACf,YAAY,GAAA,CAAI,UAAA;AAAA,MAChB,UAAA,EAAY,IAAI,UAAA,IAAc,IAAA;AAAA,MAC9B,MAAA,EAAQ;AAAA,KACV;AAAA,IACA,GAAA,CAAI;AAAA,GACN;AAGA,EAAA,MAAM,MAAA,GAAS,MAAM,UAAA,CAAW,MAAA,EAAQ,UAAU,QAAQ,CAAA;AAE1D,EAAA,IAAI,OAAA,GAAU,KAAA;AACd,EAAA,MAAM,OAAO,YAA2B;AACtC,IAAA,IAAI,OAAA,EAAS;AACb,IAAA,OAAA,GAAU,IAAA;AACV,IAAA,MAAM,MAAA,CAAO,KAAA,EAAM,CAAE,KAAA,CAAM,MAAM;AAAA,IAAC,CAAC,CAAA;AACnC,IAAA,MAAM,SAAA,CAAU,IAAA,EAAK,CAAE,KAAA,CAAM,MAAM;AAAA,IAAC,CAAC,CAAA;AACrC,IAAA,IAAI,GAAA,CAAI,cAAc,IAAA,EAAM;AAC1B,MAAA,IAAI;AACF,QAAA,MAAA,CAAO,GAAA,EAAI;AAAA,MACb,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF,CAAA;AAEA,EAAA,OAAO,EAAE,EAAA,EAAI,GAAA,CAAI,EAAA,EAAI,OAAA,EAAS,OAAO,OAAA,EAAS,KAAA,EAAO,SAAA,CAAU,KAAA,EAAO,IAAA,EAAK;AAC7E;AAIA,eAAe,cAAA,CAAe,KAAiB,IAAA,EAAuC;AACpF,EAAA,MAAM,IAAA,GAAO,MAAM,SAAA,CAAU,IAAI,CAAA;AACjC,EAAA,OAAO,IAAI,OAAA,CAAoB,CAAC,OAAA,EAAS,MAAA,KAAW;AAClD,IAAA,MAAM,MAAA,GAAS,IAAI,GAAA,CAAI,MAAA,EAAO;AAC9B,IAAA,IAAI,OAAA,GAAU,KAAA;AACd,IAAA,MAAA,CAAO,EAAA,CAAG,SAAS,MAAM;AACvB,MAAA,IAAI,OAAA,EAAS;AACb,MAAA,OAAA,GAAU,IAAA;AACV,MAAA,OAAA,CAAQ,MAAM,CAAA;AAAA,IAChB,CAAC,CAAA;AACD,IAAA,MAAA,CAAO,EAAA,CAAG,OAAA,EAAS,CAAC,GAAA,KAAe;AACjC,MAAA,IAAI,OAAA,EAAS;AACb,MAAA,OAAA,GAAU,IAAA;AACV,MAAA,MAAA;AAAA,QACE,IAAIV,qBAAA;AAAA,UACF,CAAA,4BAAA,EAA+B,IAAA,CAAK,QAAQ,CAAA,CAAA,EAAI,IAAA,CAAK,IAAI,CAAA,CAAA,EAAI,IAAA,CAAK,IAAA,IAAQ,EAAE,CAAA,SAAA,EAAY,GAAA,CAAI,OAAO,CAAA,CAAA;AAAA,UACnG,EAAE,OAAO,GAAA;AAAI;AACf,OACF;AAAA,IACF,CAAC,CAAA;AACD,IAAA,MAAA,CAAO,OAAA,CAAQ;AAAA,MACb,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,IAAA,EAAM,KAAK,IAAA,IAAQ,EAAA;AAAA,MACnB,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,YAAA,EAAc,KAAK,cAAA,IAAkB,GAAA;AAAA,MACrC,GAAG;AAAA,KACJ,CAAA;AAAA,EACH,CAAC,CAAA;AACH;AAGA,eAAe,UAAU,IAAA,EAAoD;AAC3E,EAAA,IAAI,IAAA,CAAK,eAAe,MAAA,EAAW;AACjC,IAAA,OAAO,EAAE,UAAA,EAAY,IAAA,CAAK,UAAA,EAAY,GAAI,IAAA,CAAK,UAAA,GAAa,EAAE,UAAA,EAAY,IAAA,CAAK,UAAA,EAAW,GAAI,EAAC,EAAG;AAAA,EACpG;AACA,EAAA,IAAI,IAAA,CAAK,mBAAmB,MAAA,EAAW;AACrC,IAAA,MAAM,EAAA,GAAK,MAAM,OAAO,aAAkB,CAAA;AAC1C,IAAA,MAAM,GAAA,GAAM,MAAM,EAAA,CAAG,QAAA,CAAS,KAAK,cAAc,CAAA;AACjD,IAAA,OAAO,EAAE,UAAA,EAAY,GAAA,EAAK,GAAI,IAAA,CAAK,UAAA,GAAa,EAAE,UAAA,EAAY,IAAA,CAAK,UAAA,EAAW,GAAI,EAAC,EAAG;AAAA,EACxF;AACA,EAAA,IAAI,IAAA,CAAK,aAAa,MAAA,EAAW;AAC/B,IAAA,OAAO,EAAE,QAAA,EAAU,IAAA,CAAK,QAAA,EAAS;AAAA,EACnC;AACA,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,IAAS,GAAA,CAAI,eAAe,CAAA;AAC9C,EAAA,OAAO,IAAA,GAAO,EAAE,KAAA,EAAO,IAAA,KAAS,EAAC;AACnC;AAOA,eAAe,YAAA,CACb,GAAA,EACA,MAAA,EACA,UAAA,EACoB;AAEpB,EAAA,MAAM,IAAI,OAAA,CAAc,CAAC,OAAA,EAAS,MAAA,KAAW;AAC3C,IAAA,MAAA,CAAO,WAAW,WAAA,EAAa,CAAA,EAAG,aAAa,UAAA,EAAY,CAAC,KAAK,MAAA,KAAW;AAC1E,MAAA,IAAI,GAAA,EAAK;AACP,QAAA,MAAA;AAAA,UACE,IAAIA,qBAAA;AAAA,YACF,gEAAgE,UAAU,CAAA,mJAAA,CAAA;AAAA,YAG1E,EAAE,OAAO,GAAA;AAAI;AACf,SACF;AACA,QAAA;AAAA,MACF;AACA,MAAA,IAAI;AACF,QAAA,CAAC,MAAA,CAAO,OAAA,IAAW,MAAA,CAAO,GAAA,GAAM,KAAK,MAAM,CAAA;AAAA,MAC7C,CAAA,CAAA,MAAQ;AAAA,MAER;AACA,MAAA,OAAA,EAAQ;AAAA,IACV,CAAC,CAAA;AAAA,EACH,CAAC,CAAA;AAED,EAAA,MAAM,OAAA,uBAAc,GAAA,EAA+B;AACnD,EAAA,MAAM,MAAA,GAAS,GAAA,CAAI,YAAA,CAAa,CAAC,MAAA,KAAW;AAC1C,IAAA,OAAA,CAAQ,IAAI,MAAM,CAAA;AAClB,IAAA,MAAA,CAAO,GAAG,OAAA,EAAS,MAAM,OAAA,CAAQ,MAAA,CAAO,MAAM,CAAC,CAAA;AAC/C,IAAA,MAAA,CAAO,EAAA,CAAG,SAAS,MAAM;AAAA,IAAC,CAAC,CAAA;AAC3B,IAAA,MAAA,CAAO,WAAW,WAAA,EAAa,CAAA,EAAG,aAAa,UAAA,EAAY,CAAC,KAAK,MAAA,KAAW;AAC1E,MAAA,IAAI,GAAA,EAAK;AACP,QAAA,MAAA,CAAO,OAAA,EAAQ;AACf,QAAA;AAAA,MACF;AACA,MAAA,MAAA,CAAO,EAAA,CAAG,OAAA,EAAS,MAAM,MAAA,CAAO,SAAS,CAAA;AAGzC,MAAA,MAAM,MAAA,GAAS,MAAA;AACf,MAAA,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,CAAE,IAAA,CAAK,MAAM,CAAA;AAAA,IACjC,CAAC,CAAA;AAAA,EACH,CAAC,CAAA;AAED,EAAA,MAAM,YAAY,MAAM,IAAI,OAAA,CAAgB,CAAC,SAAS,MAAA,KAAW;AAC/D,IAAA,MAAA,CAAO,EAAA,CAAG,SAAS,MAAM,CAAA;AACzB,IAAA,MAAA,CAAO,MAAA,CAAO,CAAA,EAAG,WAAA,EAAa,MAAM;AAClC,MAAA,MAAM,IAAA,GAAO,OAAO,OAAA,EAAQ;AAC5B,MAAA,OAAA,CAAQ,QAAQ,OAAO,IAAA,KAAS,QAAA,GAAW,IAAA,CAAK,OAAO,CAAC,CAAA;AAAA,IAC1D,CAAC,CAAA;AAAA,EACH,CAAC,CAAA;AAED,EAAA,MAAM,QAAQ,YAA2B;AACvC,IAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,MAAA,IAAI;AACF,QAAA,CAAA,CAAE,OAAA,EAAQ;AAAA,MACZ,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AACA,IAAA,OAAA,CAAQ,KAAA,EAAM;AACd,IAAA,MAAM,IAAI,QAAc,CAAC,OAAA,KAAY,OAAO,KAAA,CAAM,MAAM,OAAA,EAAS,CAAC,CAAA;AAAA,EACpE,CAAA;AAEA,EAAA,OAAO,EAAE,OAAA,EAAS,CAAA,iBAAA,EAAoB,SAAS,IAAI,KAAA,EAAM;AAC3D;AAKA,SAAS,QAAQ,CAAA,EAAmB;AAClC,EAAA,OAAO,CAAA,CAAA,EAAI,CAAA,CAAE,OAAA,CAAQ,IAAA,EAAM,OAAO,CAAC,CAAA,CAAA,CAAA;AACrC;AAGA,SAAS,cAAc,IAAA,EAAwB;AAC7C,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,OAAO,CAAA,CAAE,KAAK,GAAG,CAAA;AACnC;AAEA,eAAe,UAAA,GAAkC;AAK/C,EAAA,MAAM,IAAA,GAAO,MAAA;AACb,EAAA,IAAI;AACF,IAAA,MAAM,MAAO,MAAM;AAAA;AAAA,MAA0B;AAAA,KAAA;AAC7C,IAAA,OAAO,IAAI,OAAA,IAAY,GAAA,CAAI,OAAA,CAAuB,MAAA,GAAS,IAAI,OAAA,GAAU,GAAA;AAAA,EAC3E,SAAS,GAAA,EAAK;AACZ,IAAA,MAAM,IAAIA,qBAAA;AAAA,MACR,iKAAA;AAAA,MAEA,EAAE,OAAO,GAAA;AAAI,KACf;AAAA,EACF;AACF;AAEA,SAAS,IAAI,GAAA,EAAiC;AAC5C,EAAA,MAAM,OAAQ,UAAA,CAA0E,OAAA;AACxF,EAAA,OAAO,IAAA,EAAM,MAAM,GAAG,CAAA;AACxB;;;AG1fA,WAAA,EAAA;AA0EO,SAAS,MAAA,CAAO,MAAA,GAAuB,EAAC,EAAW;AACxD,EAAA,OAAO,EAAE,MAAM,QAAA,EAAU,OAAA,EAAS,CAAC,IAAA,KAAS,aAAA,CAAc,MAAA,EAAQ,IAAI,CAAA,EAAE;AAC1E;AAEA,IAAMW,aAAAA,GAAe,IAAA;AACrB,IAAMC,cAAAA,GAAgB,aAAA;AACtB,IAAMC,kBAAAA,GAAoB,OAAA;AAC1B,IAAM,qBAAA,GAAwB,mCAAmC,WAAW,CAAA,CAAA;AA8C5E,IAAM,aAAN,MAAwC;AAAA,EACtC,YAA6B,SAAA,EAA0B;AAA1B,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AAAA,EAA2B;AAAA,EAA3B,SAAA;AAAA,EAE7B,MAAM,KAAK,IAAA,EAAkF;AAC3F,IAAA,MAAM,EAAE,QAAA,EAAS,GAAI,MAAM,OAAO,QAAa,CAAA;AAC/C,IAAA,MAAM,OAAO,MAAM,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,EAAE,GAAA,EAAK,IAAA,EAAM,GAAA,EAAK,CAAC,8BAA8B,CAAA,EAAG,YAAA,EAAc,IAAA,EAAM,YAAA,EAAc,MAAM,CAAA;AACnI,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,KAAA,CAAM,EAAE,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAO,KAAA,EAAO,CAAA;AAE9D,IAAA,MAAM,MAAgB,EAAC;AACvB,IAAA,MAAM,MAAgB,EAAC;AACvB,IAAA,MAAM,IAAA,GAAO,CAAC,GAAA,KACZ,IAAI,QAAA,CAAS;AAAA,MACX,KAAA,CAAM,KAAA,EAAe,IAAA,EAAe,EAAA,EAAgB;AAClD,QAAA,GAAA,CAAI,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,KAAK,CAAC,CAAA;AAC3B,QAAA,EAAA,EAAG;AAAA,MACL;AAAA,KACD,CAAA;AACH,IAAA,IAAA,CAAK,SAAA,CAAU,MAAM,WAAA,CAAY,MAAA,EAAQ,KAAK,GAAG,CAAA,EAAG,IAAA,CAAK,GAAG,CAAC,CAAA;AAE7D,IAAA,MAAM,IAAI,OAAA,CAAc,CAAC,OAAA,EAAS,MAAA,KAAW;AAC3C,MAAA,MAAA,CAAO,EAAA,CAAG,KAAA,EAAO,MAAM,OAAA,EAAS,CAAA;AAChC,MAAA,MAAA,CAAO,EAAA,CAAG,OAAA,EAAS,MAAM,OAAA,EAAS,CAAA;AAClC,MAAA,MAAA,CAAO,EAAA,CAAG,OAAA,EAAS,CAAC,CAAA,KAAe,OAAO,CAAA,YAAa,KAAA,GAAQ,CAAA,GAAI,IAAI,KAAA,CAAM,MAAA,CAAO,CAAC,CAAC,CAAC,CAAC,CAAA;AAAA,IAC1F,CAAC,CAAA;AAED,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,OAAA,EAAQ;AAChC,IAAA,OAAO;AAAA,MACL,UAAU,IAAA,CAAK,QAAA;AAAA,MACf,QAAQ,MAAA,CAAO,MAAA,CAAO,GAAG,CAAA,CAAE,SAAS,MAAM,CAAA;AAAA,MAC1C,QAAQ,MAAA,CAAO,MAAA,CAAO,GAAG,CAAA,CAAE,SAAS,MAAM;AAAA,KAC5C;AAAA,EACF;AAAA,EAEA,MAAM,OAAA,CAAQ,IAAA,EAAc,IAAA,EAAkB,IAAA,EAAyC;AACrF,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,WAAA,CAAY,GAAG,CAAA;AAClC,IAAA,MAAM,MAAM,KAAA,GAAQ,CAAA,GAAI,KAAK,KAAA,CAAM,CAAA,EAAG,KAAK,CAAA,GAAI,GAAA;AAC/C,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,CAAC,CAAA;AACjC,IAAA,MAAM,KAAK,IAAA,CAAK,CAAC,OAAA,EAAS,IAAA,EAAM,GAAG,CAAC,CAAA;AACpC,IAAA,MAAM,MAAM,aAAA,CAAc,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,QAAQ,MAAM,CAAA;AAC1D,IAAA,MAAM,KAAK,SAAA,CAAU,UAAA,CAAW,KAAK,EAAE,IAAA,EAAM,KAAK,CAAA;AAAA,EACpD;AACF,CAAA;AAIA,eAAe,aAAA,CAAc,QAAsB,IAAA,EAA0C;AAC3F,EAAA,MAAM,MAAA,GAAS,MAAM,eAAA,EAAgB;AACrC,EAAA,MAAM,WAAW,MAAA,CAAO,MAAA,IAAU,IAAI,MAAA,CAAO,OAAO,MAAM,CAAA;AAE1D,EAAA,MAAM,MAAA,GAAuB,EAAE,GAAG,MAAA,EAAQ,OAAO,MAAA,CAAO,KAAA,IAAS,KAAK,KAAA,EAAM;AAC5E,EAAA,OAAO,eAAA,CAAgB,QAAA,EAAU,MAAA,EAAQ,IAAA,CAAK,KAAK,CAAA;AACrD;AAOA,eAAsB,eAAA,CACpBC,OAAAA,EACA,MAAA,GAAuB,IACvB,KAAA,EACuB;AACvB,EAAA,MAAM,IAAA,GAAO,OAAO,IAAA,IAAQH,aAAAA;AAC5B,EAAA,MAAM,KAAA,GAAQ,OAAO,KAAA,IAASC,cAAAA;AAC9B,EAAA,MAAM,QAAA,GAAW,OAAO,QAAA,IAAYC,kBAAAA;AACpC,EAAA,MAAM,OAAA,GAAU,OAAO,SAAA,KAAc,MAAA;AAGrC,EAAA,IAAI,SAAA;AACJ,EAAA,IAAI,MAAA,CAAO,cAAc,MAAA,EAAW;AAClC,IAAA,SAAA,GAAYC,OAAAA,CAAO,YAAA,CAAa,MAAA,CAAO,SAAS,CAAA;AAAA,EAClD,CAAA,MAAO;AACL,IAAA,MAAM,KAAA,GAAQ,OAAO,KAAA,IAAS,qBAAA;AAC9B,IAAA,MAAM,YAAYA,OAAAA,EAAQ,KAAA,EAAO,MAAA,CAAO,IAAA,IAAQ,WAAW,KAAK,CAAA;AAChE,IAAA,MAAM,OAAA,GAAU,GAAG,IAAI,CAAA,IAAA,CAAA;AACvB,IAAA,SAAA,GAAY,MAAMA,QAAO,eAAA,CAAgB;AAAA;AAAA;AAAA,MAGvC,KAAA,EAAO,KAAA;AAAA,MACP,GAAA,EAAK,CAAC,CAAA,MAAA,EAAS,IAAI,CAAA,CAAA,EAAI,CAAA,WAAA,EAAc,KAAK,CAAA,CAAA,EAAI,CAAA,UAAA,EAAa,QAAQ,CAAA,CAAA,EAAI,8BAA8B,CAAA;AAAA,MACrG,GAAA,EAAK,KAAA;AAAA,MACL,cAAc,EAAE,CAAC,OAAO,GAAG,EAAC,EAAE;AAAA,MAC9B,UAAA,EAAY,EAAE,YAAA,EAAc,EAAE,CAAC,OAAO,GAAG,CAAC,EAAE,QAAA,EAAU,GAAA,EAAK,GAAE,EAAE;AAAA,MAC/D,GAAI,MAAA,CAAO,aAAA,IAAiB;AAAC,KAC9B,CAAA;AAAA,EACH;AAGA,EAAA,MAAM,SAAA,CAAU,KAAA,EAAM,CAAE,KAAA,CAAM,MAAM;AAAA,EAAC,CAAC,CAAA;AAGtC,EAAA,MAAM,IAAA,GAAO,MAAM,SAAA,CAAU,OAAA,EAAQ;AACrC,EAAA,MAAM,UAAU,IAAA,CAAK,eAAA,EAAiB,KAAA,GAAQ,CAAA,EAAG,IAAI,CAAA,IAAA,CAAM,CAAA;AAC3D,EAAA,MAAM,QAAA,GAAW,OAAA,GAAU,CAAC,CAAA,EAAG,QAAA;AAC/B,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,MAAM,IAAId,qBAAA;AAAA,MACR,mEAAmE,IAAI,CAAA,MAAA,CAAA,IACpE,OAAA,GACG,sDAAA,GACA,wEAAwE,IAAA,GAAO,KAAA;AAAA,KACvF;AAAA,EACF;AAGA,EAAA,MAAM,QAAQ,MAAM,YAAA,CAAa,IAAI,UAAA,CAAW,SAAS,CAAA,EAAG;AAAA,IAC1D,IAAA;AAAA,IACA,KAAA;AAAA,IACA,QAAA;AAAA,IACA,WAAW,MAAA,CAAO,SAAA;AAAA,IAClB,YAAY,MAAA,CAAO,UAAA;AAAA,IACnB,MAAA,EAAQ,QAAA;AAAA,IACR;AAAA,GACD,CAAA;AAED,EAAA,MAAM,OAAO,YAA2B;AACtC,IAAA,IAAI,CAAC,OAAO,UAAA,EAAY;AACxB,IAAA,IAAI,CAAC,OAAA,EAAS;AACd,IAAA,IAAI;AACF,MAAA,MAAM,SAAA,CAAU,IAAA,EAAK,CAAE,KAAA,CAAM,MAAM;AAAA,MAAC,CAAC,CAAA;AACrC,MAAA,MAAM,SAAA,CAAU,MAAA,CAAO,EAAE,KAAA,EAAO,MAAM,CAAA;AAAA,IACxC,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF,CAAA;AAGA,EAAA,OAAO,EAAE,IAAI,SAAA,CAAU,EAAA,EAAI,SAAS,CAAA,iBAAA,EAAoB,QAAQ,CAAA,CAAA,EAAI,KAAA,EAAO,IAAA,EAAK;AAClF;AAGA,eAAe,WAAA,CACbc,OAAAA,EACA,KAAA,EACA,MAAA,EACA,KAAA,EACe;AACf,EAAA,MAAMN,KAAAA,GAAO,CAAC,OAAA,EAAiB,KAAA,KAAmB;AAChD,IAAA,IAAI;AACF,MAAA,KAAA,GAAQ,EAAE,KAAA,EAAO,MAAA,EAAQ,MAAA,EAAQ,QAAA,EAAU,OAAA,EAAS,GAAI,KAAA,GAAQ,EAAE,KAAA,EAAM,GAAI,IAAK,CAAA;AAAA,IACnF,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF,CAAA;AACA,EAAA,IAAI,WAAW,OAAA,EAAS;AACxB,EAAA,IAAI,WAAW,SAAA,EAAW;AACxB,IAAA,IAAI;AACF,MAAA,MAAMM,OAAAA,CAAO,QAAA,CAAS,KAAK,CAAA,CAAE,OAAA,EAAQ;AACrC,MAAA;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AACA,EAAAN,KAAAA,CAAK,CAAA,sBAAA,EAAyB,KAAK,CAAA,CAAE,CAAA;AACrC,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,MAAMM,OAAAA,CAAO,IAAA,CAAK,KAAK,CAAA;AACtC,IAAA,MAAM,IAAI,OAAA,CAAc,CAAC,OAAA,EAAS,MAAA,KAAW;AAC3C,MAAA,MAAA,CAAO,EAAA,CAAG,KAAA,EAAO,MAAM,OAAA,EAAS,CAAA;AAChC,MAAA,MAAA,CAAO,EAAA,CAAG,OAAA,EAAS,MAAM,OAAA,EAAS,CAAA;AAClC,MAAA,MAAA,CAAO,GAAG,OAAA,EAAS,CAAC,KAAA,KAAmB,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,IACtD,CAAC,CAAA;AACD,IAAAN,KAAAA,CAAK,CAAA,qBAAA,EAAwB,KAAK,CAAA,CAAE,CAAA;AAAA,EACtC,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,SAAS,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AACpE,IAAAA,KAAAA,CAAK,CAAA,6BAAA,EAAgC,KAAK,CAAA,CAAA,EAAI,MAAM,CAAA;AACpD,IAAA,MAAM,IAAIR,qBAAA,CAAc,CAAA,sCAAA,EAAyC,KAAK,CAAA,EAAA,EAAK,MAAM,CAAA,CAAA,EAAI,EAAE,KAAA,EAAO,KAAA,EAAO,CAAA;AAAA,EACvG;AACF;AAKA,SAAS,aAAA,CAAc,IAAA,EAAc,IAAA,EAAkB,IAAA,EAA0B;AAC/E,EAAA,MAAM,MAAA,GAAS,MAAA,CAAO,KAAA,CAAM,GAAA,EAAK,CAAC,CAAA;AAClC,EAAA,MAAA,CAAO,MAAM,IAAA,CAAK,KAAA,CAAM,GAAG,GAAG,CAAA,EAAG,GAAG,MAAM,CAAA;AAC1C,EAAA,MAAA,CAAO,KAAA,CAAM,KAAA,CAAM,QAAA,CAAS,IAAA,EAAM,CAAC,KAAK,GAAA,EAAO,CAAC,CAAA,EAAG,GAAA,EAAK,MAAM,CAAA;AAC9D,EAAA,MAAA,CAAO,MAAM,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,EAAG,KAAK,MAAM,CAAA;AACrC,EAAA,MAAA,CAAO,MAAM,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,EAAG,KAAK,MAAM,CAAA;AACrC,EAAA,MAAA,CAAO,MAAM,KAAA,CAAM,IAAA,CAAK,QAAQ,EAAE,CAAA,EAAG,KAAK,MAAM,CAAA;AAChD,EAAA,MAAA,CAAO,MAAM,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,EAAG,KAAK,MAAM,CAAA;AACtC,EAAA,MAAA,CAAO,KAAA,CAAM,UAAA,EAAY,GAAA,EAAK,MAAM,CAAA;AACpC,EAAA,MAAA,CAAO,KAAA,CAAM,GAAA,EAAK,GAAA,EAAK,MAAM,CAAA;AAC7B,EAAA,MAAA,CAAO,KAAA,CAAM,SAAA,EAAW,GAAA,EAAK,QAAQ,CAAA;AACrC,EAAA,MAAA,CAAO,KAAA,CAAM,IAAA,EAAM,GAAA,EAAK,MAAM,CAAA;AAE9B,EAAA,IAAI,GAAA,GAAM,CAAA;AACV,EAAA,KAAA,MAAW,CAAA,IAAK,QAAQ,GAAA,IAAO,CAAA;AAC/B,EAAA,MAAA,CAAO,KAAA,CAAM,GAAA,CAAI,QAAA,CAAS,CAAC,CAAA,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAA,GAAI,KAAA,EAAO,GAAA,EAAK,QAAQ,CAAA;AAEpE,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA;AAC7B,EAAA,MAAM,GAAA,GAAA,CAAO,GAAA,GAAO,IAAA,CAAK,MAAA,GAAS,GAAA,IAAQ,GAAA;AAE1C,EAAA,OAAO,MAAA,CAAO,MAAA,CAAO,CAAC,MAAA,EAAQ,IAAA,EAAM,MAAA,CAAO,KAAA,CAAM,GAAG,CAAA,EAAG,MAAA,CAAO,KAAA,CAAM,IAAI,CAAC,CAAC,CAAA;AAC5E;AAGA,SAAS,KAAA,CAAM,GAAW,GAAA,EAAqB;AAC7C,EAAA,OAAO,CAAA,CACJ,QAAA,CAAS,CAAC,CAAA,CACV,QAAA,CAAS,GAAA,GAAM,CAAA,EAAG,GAAG,CAAA,CACrB,KAAA,CAAM,EAAE,GAAA,GAAM,EAAE,CAAA,GAAI,IAAA;AACzB;AAIA,eAAe,eAAA,GAA0C;AAGvD,EAAA,MAAM,IAAA,GAAO,WAAA;AACb,EAAA,IAAI;AACF,IAAA,MAAM,MAAO,MAAM;AAAA;AAAA,MAA0B;AAAA,KAAA;AAC7C,IAAA,OAAQ,IAAI,OAAA,IAAW,GAAA;AAAA,EACzB,SAAS,GAAA,EAAK;AACZ,IAAA,MAAM,IAAIA,qBAAA;AAAA,MACR,uLAAA;AAAA,MAEA,EAAE,OAAO,GAAA;AAAI,KACf;AAAA,EACF;AACF;;;AC1VA,WAAA,EAAA;AA6DO,SAAS,MAAA,CAAO,MAAA,GAAuB,EAAC,EAAW;AACxD,EAAA,OAAO,EAAE,MAAM,QAAA,EAAU,OAAA,EAAS,CAAC,IAAA,KAAS,aAAA,CAAc,MAAA,EAAQ,IAAI,CAAA,EAAE;AAC1E;AAEA,IAAMW,aAAAA,GAAe,IAAA;AACrB,IAAM,aAAA,GAAgB,SAAA;AACtB,IAAMC,cAAAA,GAAgB,aAAA;AACtB,IAAMC,kBAAAA,GAAoB,OAAA;AAG1B,IAAM,aAAA,GAAgB,+BAAA;AAgEtB,IAAM,aAAN,MAAwC;AAAA,EACtC,YAA6B,EAAA,EAAiB;AAAjB,IAAA,IAAA,CAAA,EAAA,GAAA,EAAA;AAAA,EAAkB;AAAA,EAAlB,EAAA;AAAA,EAE7B,MAAM,IAAA,CAAK,IAAA,EAAgB,IAAA,EAKxB;AACD,IAAA,MAAM,IAAI,MAAM,IAAA,CAAK,EAAA,CAAG,IAAA,CAAK,IAAI,IAAA,EAAM;AAAA,MACrC,QAAA,EAAU,QAAA;AAAA,MACV,gBAAgB,IAAA,EAAM,cAAA;AAAA,MACtB,QAAA,EAAU;AAAA,KACX,CAAA;AACD,IAAA,OAAO,EAAE,QAAA,EAAU,CAAA,CAAE,SAAA,EAAW,MAAA,EAAQ,CAAA,CAAE,MAAA,EAAQ,MAAA,EAAQ,CAAA,CAAE,MAAA,EAAQ,KAAA,EAAO,CAAA,CAAE,KAAA,EAAM;AAAA,EACrF;AAAA,EAEA,MAAM,OAAA,CAAQ,IAAA,EAAc,IAAA,EAAkB,IAAA,EAAyC;AACrF,IAAA,MAAM,MAAM,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,CAAE,SAAS,QAAQ,CAAA;AAC/C,IAAA,MAAM,OAAA,GAAU,GAAG,IAAI,CAAA,IAAA,CAAA;AACvB,IAAA,MAAM,IAAA,CAAK,EAAA,CAAG,KAAA,CAAM,KAAA,CAAM,EAAE,QAAA,EAAU,OAAA,EAAS,OAAA,EAAS,GAAA,EAAK,UAAA,EAAY,IAAA,EAAM,CAAA;AAC/E,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,IAAQ,MAAA;AAC3B,IAAA,MAAM,IAAA,CAAK,GAAG,IAAA,CAAK,GAAA;AAAA,MACjB,CAAC,MAAA,EAAQ,KAAA,EAAO,CAAA,UAAA,EAAa,OAAO,CAAA,GAAA,EAAM,IAAI,CAAA,UAAA,EAAa,IAAI,CAAA,CAAA,EAAI,IAAI,CAAA,UAAA,EAAa,OAAO,CAAA,CAAE,CAAA;AAAA,MAC7F,EAAE,QAAA,EAAU,QAAA,EAAU,cAAA,EAAgB,EAAA,EAAI,UAAU,IAAA;AAAK,KAC3D;AAAA,EACF;AACF,CAAA;AASA,eAAe,aAAA,CAAc,QAAsB,IAAA,EAA0C;AAC3F,EAAA,MAAM,WAAW,MAAA,CAAO,QAAA,IAAYE,KAAI,4BAA4B,CAAA,IAAKA,KAAI,kBAAkB,CAAA;AAC/F,EAAA,MAAM,eACJ,MAAA,CAAO,YAAA,IAAgBA,KAAI,gCAAgC,CAAA,IAAKA,KAAI,sBAAsB,CAAA;AAC5F,EAAA,IAAI,CAAC,QAAA,IAAY,CAAC,YAAA,EAAc;AAC9B,IAAA,MAAM,IAAIf,qBAAA;AAAA,MACR;AAAA,KAGF;AAAA,EACF;AACA,EAAA,MAAM,GAAA,GAAM,MAAM,YAAA,EAAa;AAC/B,EAAA,MAAM,MAAA,GAAS,IAAI,GAAA,CAAI,OAAA,CAAQ;AAAA,IAC7B,QAAA;AAAA,IACA,YAAA;AAAA,IACA,GAAI,OAAO,OAAA,GAAU,EAAE,SAAS,MAAA,CAAO,OAAA,KAAY;AAAC,GACrD,CAAA;AAED,EAAA,OAAO,eAAA,CAAgB,MAAA,EAAQ,EAAE,GAAG,MAAA,EAAQ,KAAA,EAAO,MAAA,CAAO,KAAA,IAAS,IAAA,CAAK,KAAA,EAAM,EAAG,IAAA,CAAK,KAAK,CAAA;AAC7F;AAQA,eAAsB,eAAA,CACpB,MAAA,EACA,MAAA,GAAuB,IACvB,KAAA,EACiD;AACjD,EAAA,MAAM,IAAA,GAAO,OAAO,IAAA,IAAQW,aAAAA;AAC5B,EAAA,MAAM,KAAA,GAAQ,OAAO,KAAA,IAASC,cAAAA;AAC9B,EAAA,MAAM,QAAA,GAAW,OAAO,QAAA,IAAYC,kBAAAA;AACpC,EAAA,MAAM,OAAA,GAAU,OAAO,WAAA,KAAgB,MAAA;AAGvC,EAAA,IAAI,cAAc,MAAA,CAAO,WAAA;AACzB,EAAA,IAAI,gBAAgB,MAAA,EAAW;AAC7B,IAAA,MAAM,MAAA,GAAkC;AAAA,MACtC,KAAA,EAAO,OAAO,KAAA,IAAS,aAAA;AAAA,MACvB,IAAA,EAAM,OAAO,IAAA,IAAQ;AAAA,KACvB;AACA,IAAA,IAAI,OAAO,IAAA,KAAS,MAAA,EAAW,MAAA,CAAO,MAAM,IAAI,MAAA,CAAO,IAAA;AACvD,IAAA,IAAI,OAAO,IAAA,KAAS,MAAA,EAAW,MAAA,CAAO,MAAM,IAAI,MAAA,CAAO,IAAA;AACvD,IAAA,IAAI,OAAO,QAAA,KAAa,MAAA,EAAW,MAAA,CAAO,WAAW,IAAI,MAAA,CAAO,QAAA;AAChE,IAAA,IAAI,OAAO,MAAA,KAAW,MAAA,EAAW,MAAA,CAAO,cAAc,IAAI,MAAA,CAAO,MAAA;AACjE,IAAA,MAAM,EAAA,GAAK,MAAM,MAAA,CAAO,UAAA,CAAW,OAAO,MAAM,CAAA;AAChD,IAAA,WAAA,GAAc,EAAA,CAAG,EAAA;AAAA,EACnB;AAIA,EAAA,MAAM,MAAA,CAAO,cAAc,WAAW,CAAA;AACtC,EAAA,MAAM,MAAA,GAAS,MAAA,CAAO,SAAA,CAAU,WAAW,CAAA;AAG3C,EAAA,MAAM,MAAA,CAAO,KAAA,EAAM,CAAE,KAAA,CAAM,MAAM;AAAA,EAAC,CAAC,CAAA;AAGnC,EAAA,IAAI,EAAA,GAAK,MAAM,MAAA,CAAO,OAAA,EAAQ;AAC9B,EAAA,MAAM,QAAQ,MAAM,YAAA,CAAa,IAAI,UAAA,CAAW,EAAE,CAAA,EAAG;AAAA,IACnD,IAAA;AAAA,IACA,KAAA;AAAA,IACA,QAAA;AAAA,IACA,WAAW,MAAA,CAAO,SAAA;AAAA,IAClB,YAAY,MAAA,CAAO,UAAA;AAAA,IACnB,aAAa,MAAA,CAAO,WAAA;AAAA,IACpB,MAAA,EAAQ,QAAA;AAAA,IACR,KAAA;AAAA,IACA,OAAO,MAAA,CAAO;AAAA,GACf,CAAA;AAMD,EAAA,MAAM,SAAA,GAAuB,OAAO,GAAA,EAAK,IAAA,KAAS;AAChD,IAAA,MAAM,EAAE,QAAA,EAAU,MAAA,EAAO,GAAI,IAAI,IAAI,GAAG,CAAA;AACxC,IAAA,MAAM,OAAO,QAAA,GAAW,MAAA;AACxB,IAAA,MAAM,OAAA,GAAU,IAAI,OAAA,CAAQ,IAAA,EAAM,OAAO,CAAA;AACzC,IAAA,OAAA,CAAQ,GAAA,CAAI,oBAAoB,KAAK,CAAA;AAGrC,IAAA,OAAA,CAAQ,OAAO,eAAe,CAAA;AAC9B,IAAA,IAAI,GAAA,GAAM,MAAM,EAAA,CAAG,KAAA,CAAM,IAAI,CAAA,CAAE,KAAA,CAAM,IAAA,EAAM,EAAE,GAAG,IAAA,EAAM,OAAA,EAAS,CAAA;AAC/D,IAAA,IAAI,GAAA,CAAI,WAAW,GAAA,EAAK;AACtB,MAAA,EAAA,GAAK,MAAM,MAAA,CAAO,OAAA,CAAQ,EAAE,KAAA,EAAO,MAAM,CAAA;AACzC,MAAA,GAAA,GAAM,MAAM,EAAA,CAAG,KAAA,CAAM,IAAI,CAAA,CAAE,KAAA,CAAM,IAAA,EAAM,EAAE,GAAG,IAAA,EAAM,OAAA,EAAS,CAAA;AAAA,IAC7D;AACA,IAAA,OAAO,GAAA;AAAA,EACT,CAAA;AAEA,EAAA,MAAM,OAAO,YAA2B;AACtC,IAAA,IAAI,CAAC,OAAO,UAAA,EAAY;AACxB,IAAA,IAAI;AAEF,MAAA,OAAO,OAAA,GAAU,MAAA,CAAO,MAAA,EAAO,GAAI,OAAO,IAAA,EAAK,CAAA;AAAA,IACjD,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF,CAAA;AAEA,EAAA,OAAO,EAAE,IAAI,WAAA,EAAa,WAAA,EAAa,SAAS,aAAA,EAAe,KAAA,EAAO,KAAA,EAAO,SAAA,EAAW,IAAA,EAAK;AAC/F;AAIA,eAAe,YAAA,GAAsC;AAInD,EAAA,MAAM,IAAA,GAAO,QAAA;AACb,EAAA,IAAI;AACF,IAAA,OAAQ,MAAM;AAAA;AAAA,MAA0B;AAAA,KAAA;AAAA,EAC1C,SAAS,GAAA,EAAK;AACZ,IAAA,MAAM,IAAIb,qBAAA;AAAA,MACR,qMAAA;AAAA,MAGA,EAAE,OAAO,GAAA;AAAI,KACf;AAAA,EACF;AACF;AAEA,SAASe,KAAI,GAAA,EAAiC;AAC5C,EAAA,MAAM,OAAQ,UAAA,CAA0E,OAAA;AACxF,EAAA,OAAO,IAAA,EAAM,MAAM,GAAG,CAAA;AACxB;;;ACvSO,IAAM,cAAA,GAAiB;AAG9B,IAAM,MAAA,GAAS,CAAA,GAAI,EAAA,GAAK,EAAA,GAAK,GAAA;AAqC7B,SAAS,OAAO,CAAA,EAA4C;AAC1D,EAAA,IAAI,CAAC,GAAG,OAAO,MAAA;AACf,EAAA,MAAM,OAAkB,EAAC;AACzB,EAAA,IAAI,OAAO,CAAA,CAAE,KAAA,KAAU,QAAA,EAAU,IAAA,CAAK,QAAQ,CAAA,CAAE,KAAA;AAChD,EAAA,IAAI,OAAO,CAAA,CAAE,MAAA,KAAW,QAAA,EAAU,IAAA,CAAK,SAAS,CAAA,CAAE,MAAA;AAClD,EAAA,IAAI,OAAO,CAAA,CAAE,UAAA,KAAe,QAAA,EAAU,IAAA,CAAK,YAAY,CAAA,CAAE,UAAA;AACzD,EAAA,IAAI,OAAO,CAAA,CAAE,WAAA,KAAgB,QAAA,EAAU,IAAA,CAAK,aAAa,CAAA,CAAE,WAAA;AAC3D,EAAA,OAAO,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,CAAE,SAAS,IAAA,GAAO,MAAA;AAC3C;AAEA,SAAS,OAAA,CAAQ,UAAA,EAAoB,EAAA,EAAY,CAAA,EAAwB;AACvE,EAAA,MAAM,IAAA,GAAkB,EAAE,EAAA,EAAI,CAAA,CAAE,EAAA,IAAM,EAAA,EAAI,KAAA,EAAO,CAAA,CAAE,IAAA,KAAS,CAAA,CAAE,EAAA,IAAM,EAAA,CAAA,EAAK,UAAU,UAAA,EAAW;AAC9F,EAAA,IAAI,EAAE,KAAA,EAAO,OAAA,EAAS,IAAA,CAAK,aAAA,GAAgB,EAAE,KAAA,CAAM,OAAA;AACnD,EAAA,IAAI,EAAE,KAAA,EAAO,MAAA,EAAQ,IAAA,CAAK,SAAA,GAAY,EAAE,KAAA,CAAM,MAAA;AAC9C,EAAA,IAAI,EAAE,UAAA,EAAY,KAAA,EAAO,QAAQ,IAAA,CAAK,eAAA,GAAkB,EAAE,UAAA,CAAW,KAAA;AACrE,EAAA,IAAI,EAAE,UAAA,EAAY,MAAA,EAAQ,QAAQ,IAAA,CAAK,gBAAA,GAAmB,EAAE,UAAA,CAAW,MAAA;AACvE,EAAA,IAAI,CAAA,CAAE,SAAA,EAAW,IAAA,CAAK,SAAA,GAAY,IAAA;AAClC,EAAA,IAAI,CAAA,CAAE,SAAA,EAAW,IAAA,CAAK,QAAA,GAAW,IAAA;AACjC,EAAA,IAAI,CAAA,CAAE,UAAA,EAAY,IAAA,CAAK,UAAA,GAAa,IAAA;AACpC,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,CAAA,CAAE,IAAI,CAAA;AAC1B,EAAA,IAAI,IAAA,OAAW,IAAA,GAAO,IAAA;AACtB,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,QAAQ,IAAA,EAAkC;AACjD,EAAA,MAAM,YAA+B,EAAC;AACtC,EAAA,KAAA,MAAW,CAAC,KAAK,IAAI,CAAA,IAAK,OAAO,OAAA,CAAQ,IAAA,IAAQ,EAAE,CAAA,EAAG;AACpD,IAAA,IAAI,CAAC,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,EAAU;AACvC,IAAA,MAAM,EAAA,GAAK,KAAK,EAAA,IAAM,GAAA;AACtB,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQ,IAAA,CAAK,UAAU,EAAE,CAAA,CAC5C,GAAA,CAAI,CAAC,CAAC,GAAA,EAAK,CAAC,CAAA,KAAM,QAAQ,EAAA,EAAI,GAAA,EAAK,CAAC,CAAC,EACrC,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,EAAE,KAAA,CAAM,aAAA,CAAc,CAAA,CAAE,KAAK,KAAK,CAAA,CAAE,EAAA,CAAG,aAAA,CAAc,CAAA,CAAE,EAAE,CAAC,CAAA;AAC5E,IAAA,SAAA,CAAU,IAAA,CAAK;AAAA,MACb,EAAA;AAAA,MACA,IAAA,EAAM,KAAK,IAAA,IAAQ,EAAA;AAAA,MACnB,KAAK,KAAA,CAAM,OAAA,CAAQ,KAAK,GAAG,CAAA,GAAI,KAAK,GAAA,CAAI,MAAA,CAAO,CAAC,CAAA,KAAmB,OAAO,CAAA,KAAM,QAAA,IAAY,CAAC,CAAC,CAAC,IAAI,EAAC;AAAA,MACpG,GAAI,KAAK,GAAA,GAAM,EAAE,KAAK,IAAA,CAAK,GAAA,KAAQ,EAAC;AAAA,MACpC,GAAI,KAAK,GAAA,GAAM,EAAE,KAAK,IAAA,CAAK,GAAA,KAAQ,EAAC;AAAA,MACpC,GAAI,KAAK,GAAA,GAAM,EAAE,KAAK,IAAA,CAAK,GAAA,KAAQ,EAAC;AAAA,MACpC;AAAA,KACD,CAAA;AAAA,EACH;AACA,EAAA,OAAO,SAAA,CAAU,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,EAAE,IAAA,CAAK,aAAA,CAAc,CAAA,CAAE,IAAI,CAAC,CAAA;AAC9D;AAIA,IAAI,KAAA,GAAqE,IAAA;AACzE,IAAI,QAAA,GAA8C,IAAA;AAOlD,eAAsB,WAAA,CAAY,IAAA,GAAuB,EAAC,EAA+B;AACvF,EAAA,MAAM,GAAA,GAAM,KAAK,GAAA,IAAO,cAAA;AACxB,EAAA,IAAI,KAAA,IAAS,KAAA,CAAM,GAAA,KAAQ,GAAA,IAAO,IAAA,CAAK,GAAA,EAAI,GAAI,KAAA,CAAM,EAAA,GAAK,MAAA,EAAQ,OAAO,KAAA,CAAM,IAAA;AAC/E,EAAA,IAAI,UAAU,OAAO,QAAA;AAErB,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,IAAS,UAAA,CAAW,KAAA;AACzC,EAAA,IAAI,OAAO,YAAY,UAAA,EAAY;AACjC,IAAA,MAAM,IAAI,MAAM,oEAA+D,CAAA;AAAA,EACjF;AAEA,EAAA,QAAA,GAAA,CAAY,YAAY;AACtB,IAAA,MAAM,GAAA,GAAM,MAAM,OAAA,CAAQ,GAAA,EAAK,EAAE,OAAA,EAAS,EAAE,MAAA,EAAQ,kBAAA,EAAmB,EAAG,MAAA,EAAQ,IAAA,CAAK,QAAQ,CAAA;AAC/F,IAAA,IAAI,CAAC,GAAA,CAAI,EAAA,EAAI,MAAM,IAAI,KAAA,CAAM,CAAA,iCAAA,EAAoC,GAAA,CAAI,MAAM,CAAA,CAAA,EAAI,GAAA,CAAI,UAAU,CAAA,CAAE,CAAA;AAC/F,IAAA,MAAM,IAAA,GAAO,OAAA,CAAS,MAAM,GAAA,CAAI,MAAkB,CAAA;AAClD,IAAA,KAAA,GAAQ,EAAE,GAAA,EAAK,EAAA,EAAI,IAAA,CAAK,GAAA,IAAO,IAAA,EAAK;AACpC,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,GAAG;AACH,EAAA,IAAI;AACF,IAAA,OAAO,MAAM,QAAA;AAAA,EACf,CAAA,SAAE;AACA,IAAA,QAAA,GAAW,IAAA;AAAA,EACb;AACF;AAGO,SAAS,iBAAiB,IAAA,EAAmD;AAClF,EAAA,OAAO,YAAY,IAAI,CAAA;AACzB;AAGA,eAAsB,eAAA,CAAgB,IAAY,IAAA,EAA6D;AAC7G,EAAA,OAAA,CAAQ,MAAM,YAAY,IAAI,CAAA,EAAG,KAAK,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,EAAE,CAAA;AAC1D;AAGA,eAAsB,aAAA,CAAc,UAAmB,IAAA,EAA6C;AAClG,EAAA,MAAM,SAAA,GAAY,MAAM,WAAA,CAAY,IAAI,CAAA;AACxC,EAAA,IAAI,QAAA,EAAU,OAAO,SAAA,CAAU,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,QAAQ,CAAA,EAAG,MAAA,IAAU,EAAC;AAC1E,EAAA,OAAO,SAAA,CAAU,OAAA,CAAQ,CAAC,CAAA,KAAM,EAAE,MAAM,CAAA;AAC1C;AAGA,eAAsB,WAAA,CACpB,QAAA,EACA,EAAA,EACA,IAAA,EACgC;AAChC,EAAA,OAAA,CAAQ,MAAM,eAAA,CAAgB,QAAA,EAAU,IAAI,CAAA,GAAI,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,EAAA,KAAO,EAAE,CAAA;AAChF;AAGO,SAAS,iBAAA,GAA0B;AACxC,EAAA,KAAA,GAAQ,IAAA;AACR,EAAA,QAAA,GAAW,IAAA;AACb;;;ACjHA,WAAA,EAAA","file":"index.cjs","sourcesContent":["/** Base class for every error thrown by the SDK. */\nexport class MindwireError extends Error {\n constructor(message: string, options?: { cause?: unknown }) {\n super(message, options);\n this.name = \"MindwireError\";\n }\n}\n\n/**\n * A non-2xx HTTP response from the daemon. `body` is the parsed JSON error payload when the\n * daemon returned one (it uses `{ \"error\": \"...\" }`), otherwise the raw text.\n */\nexport class ApiError extends MindwireError {\n readonly status: number;\n readonly url: string;\n readonly method: string;\n readonly body: unknown;\n\n constructor(args: { status: number; url: string; method: string; body: unknown }) {\n super(ApiError.messageFor(args));\n this.name = \"ApiError\";\n this.status = args.status;\n this.url = args.url;\n this.method = args.method;\n this.body = args.body;\n }\n\n private static messageFor({\n status,\n method,\n url,\n body,\n }: {\n status: number;\n method: string;\n url: string;\n body: unknown;\n }): string {\n const detail =\n body && typeof body === \"object\" && \"error\" in body && typeof body.error === \"string\"\n ? body.error\n : typeof body === \"string\" && body.trim() !== \"\"\n ? body.trim()\n : \"\";\n const base = `${method} ${url} failed with ${status}`;\n return detail ? `${base}: ${detail}` : base;\n }\n}\n\n/**\n * Thrown by {@link import(\"./run.js\").Run.wait} when a run ends in a non-success terminal state\n * (`error`/`cancelled`), or when the event stream ends before the run reaches any terminal state —\n * a dropped/truncated stream. The `status` is whatever the run was in when `wait()` gave up, so a\n * truncated stream surfaces as e.g. `run <id> running: event stream ended …` rather than silently\n * returning a success-shaped result.\n */\nexport class RunFailedError extends MindwireError {\n readonly status: string;\n readonly runId: string;\n\n constructor(runId: string, status: string, detail?: string) {\n super(detail ? `run ${runId} ${status}: ${detail}` : `run ${runId} ${status}`);\n this.name = \"RunFailedError\";\n this.runId = runId;\n this.status = status;\n }\n}\n\n/**\n * Thrown when a unary request exceeds the client's `requestTimeoutMs` deadline. A hung daemon or a\n * dead tunnel would otherwise block the caller forever; this bounds every non-streaming call. SSE\n * streams are long-lived and are never subject to this timeout.\n */\nexport class TimeoutError extends MindwireError {\n readonly method: string;\n readonly path: string;\n readonly timeoutMs: number;\n\n constructor(method: string, path: string, timeoutMs: number) {\n super(`mindwire: ${method} ${path} timed out after ${timeoutMs}ms`);\n this.name = \"TimeoutError\";\n this.method = method;\n this.path = path;\n this.timeoutMs = timeoutMs;\n }\n}\n","// Shared verified executable cache for the daemon and optional connection helpers.\n// Node modules stay lazy so importing the SDK in a browser remains supported.\nimport { MindwireError } from \"./errors.js\";\n\nexport async function binaryCacheDirectory(platform = process.platform): Promise<string> {\n const path = await import(\"node:path\");\n const { homedir } = await import(\"node:os\");\n const homeDirectory = homedir();\n return platform === \"darwin\" ? path.join(homeDirectory, \"Library\", \"Caches\", \"mindwire\")\n : platform === \"win32\" ? path.join(process.env.LOCALAPPDATA ?? homeDirectory, \"mindwire\", \"Cache\")\n : path.join(process.env.XDG_CACHE_HOME ?? path.join(homeDirectory, \".cache\"), \"mindwire\");\n}\n\nexport async function executableChecksum(bytes: Uint8Array): Promise<string> {\n const { createHash } = await import(\"node:crypto\");\n return createHash(\"sha256\").update(bytes).digest(\"hex\");\n}\n\nexport async function verifyReleaseBytes(bytes: Uint8Array, expected: string, name: string): Promise<void> {\n if (!/^[a-f0-9]{64}$/i.test(expected) || await executableChecksum(bytes) !== expected.toLowerCase()) {\n throw new MindwireError(`mindwire: checksum verification failed for ${name}`);\n }\n}\n\nexport async function cachedExecutable(bin: string): Promise<string | undefined> {\n const fs = await import(\"node:fs/promises\");\n try {\n const [bytes, checksum] = await Promise.all([fs.readFile(bin), fs.readFile(`${bin}.sha256`, \"utf8\")]);\n await verifyReleaseBytes(bytes, checksum.trim(), bin);\n return bin;\n } catch { return undefined; }\n}\n\nexport async function cacheExecutable(bin: string, bytes: Uint8Array, expected: string): Promise<string> {\n await verifyReleaseBytes(bytes, expected, bin);\n const fs = await import(\"node:fs/promises\");\n const { dirname } = await import(\"node:path\");\n const { randomUUID } = await import(\"node:crypto\");\n await fs.mkdir(dirname(bin), { recursive: true, mode: 0o700 });\n // Unique temporary names also cover concurrent acquisitions in the same process.\n const temp = `${bin}.${randomUUID()}.tmp`;\n try {\n await fs.writeFile(temp, bytes, { mode: 0o755, flag: \"wx\" });\n await fs.writeFile(`${temp}.sha256`, `${expected.toLowerCase()}\\n`, { mode: 0o600, flag: \"wx\" });\n await fs.rename(temp, bin);\n await fs.rename(`${temp}.sha256`, `${bin}.sha256`);\n return bin;\n } finally {\n await fs.rm(temp, { force: true });\n await fs.rm(`${temp}.sha256`, { force: true });\n }\n}\n","import { ApiError, MindwireError, TimeoutError } from \"./errors.js\";\n\n/** A `fetch` implementation. Defaults to the global `fetch` (Node 18+, Bun, Deno, browsers). */\nexport type FetchLike = (input: string, init?: RequestInit) => Promise<Response>;\n\n/** Default deadline for a single unary request. Long enough to cover a cold daemon, short enough\n * that a wedged connection surfaces as an error instead of an indefinite hang. */\nconst DEFAULT_TIMEOUT_MS = 120_000;\n\n/** True for a fetch rejection caused by an `AbortSignal` firing (user cancel or our own timeout). */\nfunction isAbortError(e: unknown): boolean {\n return typeof e === \"object\" && e !== null && (e as { name?: unknown }).name === \"AbortError\";\n}\n\n/**\n * Fetches the current bearer token for a transport whose credential rotates (e.g. the Oblien\n * gateway JWT). Called per request — implementations should cache and only mint on `{force:true}`\n * or expiry. `request()`/`open()` call it with `{force:true}` once on a `401`, then retry.\n */\nexport type TokenGetter = (opts?: { force?: boolean }) => Promise<string | undefined>;\n\n/**\n * Resolves the daemon's base URL, plus an optional static token, an optional dynamic `getToken`\n * (for rotating credentials), and optional per-transport `headers` merged into every request\n * (e.g. the Oblien proxy target). Called once, lazily, and memoized.\n */\nexport type BaseResolver = () => Promise<{\n baseUrl: string;\n token?: string;\n getToken?: TokenGetter;\n headers?: Record<string, string>;\n /**\n * A transport-specific `fetch` for this base — used for both unary requests and SSE streams. A\n * sandbox adapter supplies it to route every call through its runtime (e.g. Oblien's `rt.proxy`);\n * when omitted the client's default fetch is used, so embedded/remote transports are unchanged.\n */\n fetch?: FetchLike;\n}>;\n\nexport interface HttpOptions {\n /** Base URL of a running daemon, e.g. `http://127.0.0.1:8790`. */\n baseUrl?: string;\n /** Per-sandbox bearer token. */\n token?: string;\n /** Lazily resolve the base URL (used by the embedded transport to spawn on first call). */\n resolveBase?: BaseResolver;\n /** Custom fetch. Defaults to global `fetch`. */\n fetch?: FetchLike;\n /** Extra headers merged into every request. */\n headers?: Record<string, string>;\n /**\n * Deadline in milliseconds for a single unary request. Does NOT apply to SSE streams (`open()`),\n * which are long-lived by design. Defaults to {@link DEFAULT_TIMEOUT_MS}; pass `0` to disable.\n */\n timeoutMs?: number;\n}\n\nexport interface RequestInitLike {\n query?: Record<string, string | number | boolean | undefined>;\n body?: unknown;\n signal?: AbortSignal;\n headers?: Record<string, string>;\n}\n\ninterface Base {\n baseUrl: string;\n token?: string;\n getToken?: TokenGetter;\n headers?: Record<string, string>;\n fetch?: FetchLike;\n}\n\n/**\n * The low-level transport: URL/auth/JSON/error plumbing shared by every high-level method.\n * The base URL is resolved lazily and memoized — a fixed `baseUrl` resolves instantly; the\n * embedded transport spawns the daemon on the first request.\n */\nexport class Http {\n private readonly fetchImpl: FetchLike;\n private readonly baseHeaders: Record<string, string>;\n private readonly resolver: BaseResolver;\n private readonly timeoutMs: number;\n private cached: Base | null = null;\n private pending: Promise<Base> | null = null;\n\n constructor(opts: HttpOptions) {\n const f = opts.fetch ?? (globalThis.fetch as FetchLike | undefined);\n if (!f) {\n throw new MindwireError(\n \"mindwire: no global fetch found — pass a `fetch` implementation in the client options\",\n );\n }\n this.fetchImpl = f;\n this.baseHeaders = { ...opts.headers };\n this.timeoutMs = opts.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n if (opts.baseUrl) {\n const base: Base = { baseUrl: opts.baseUrl.replace(/\\/+$/, \"\"), token: opts.token };\n this.resolver = async () => base;\n } else if (opts.resolveBase) {\n const rb = opts.resolveBase;\n this.resolver = async () => {\n const r = await rb();\n return {\n baseUrl: r.baseUrl.replace(/\\/+$/, \"\"),\n token: r.token ?? opts.token,\n getToken: r.getToken,\n headers: r.headers,\n fetch: r.fetch,\n };\n };\n } else {\n throw new MindwireError(\"mindwire: Http requires a baseUrl or a resolveBase\");\n }\n }\n\n /**\n * One fetch, with raw network failures wrapped as {@link MindwireError} so callers see a typed\n * SDK error instead of a bare `TypeError: fetch failed`. An abort (the request's own signal, or\n * our timeout controller) is re-thrown untouched — `fetchWithTimeout` classifies it.\n */\n private async fetchOnce(\n f: FetchLike,\n url: string,\n init: RequestInit,\n method: string,\n path: string,\n ): Promise<Response> {\n try {\n return await f(url, init);\n } catch (e) {\n const aborted = init.signal?.aborted ?? false;\n if (aborted || isAbortError(e)) throw e; // an abort, not a network fault — leave it for the caller\n throw new MindwireError(`mindwire: ${method} ${path} — network request failed`, { cause: e });\n }\n }\n\n /**\n * `fetchOnce` plus a timeout that composes with the caller's `signal`. A hand-rolled controller\n * (not `AbortSignal.timeout`/`AbortSignal.any`, which need Node 20.3+/18.17+) fires after\n * `timeoutMs`; whichever aborts first wins. Timeout → {@link TimeoutError}; the caller's own abort\n * propagates as-is (its `reason`). `timeoutMs<=0` disables the deadline entirely.\n */\n private async fetchWithTimeout(\n f: FetchLike,\n url: string,\n init: RequestInit,\n userSignal: AbortSignal | undefined,\n method: string,\n path: string,\n ): Promise<Response> {\n if (!this.timeoutMs || this.timeoutMs <= 0) {\n return this.fetchOnce(f, url, { ...init, ...(userSignal ? { signal: userSignal } : {}) }, method, path);\n }\n const ctrl = new AbortController();\n const onAbort = () => ctrl.abort(userSignal?.reason);\n if (userSignal) {\n if (userSignal.aborted) ctrl.abort(userSignal.reason);\n else userSignal.addEventListener(\"abort\", onAbort, { once: true });\n }\n let timedOut = false;\n const timer = setTimeout(() => {\n timedOut = true;\n ctrl.abort();\n }, this.timeoutMs);\n try {\n return await this.fetchOnce(f, url, { ...init, signal: ctrl.signal }, method, path);\n } catch (e) {\n if (timedOut) throw new TimeoutError(method, path, this.timeoutMs);\n if (userSignal?.aborted) throw userSignal.reason ?? e; // caller cancelled — surface their reason\n throw e;\n } finally {\n clearTimeout(timer);\n if (userSignal) userSignal.removeEventListener(\"abort\", onAbort);\n }\n }\n\n /**\n * The bearer token for the next request. Prefers the transport's dynamic `getToken` (which\n * caches and mints on demand); falls back to the static token resolved at base time. `force`\n * asks the getter to re-mint — used once on a 401 before retrying.\n */\n private async authToken(base: Base, force: boolean): Promise<string | undefined> {\n if (base.getToken) {\n const t = await base.getToken(force ? { force: true } : undefined);\n return t ?? base.token;\n }\n return base.token;\n }\n\n private base(): Promise<Base> {\n if (this.cached) return Promise.resolve(this.cached);\n if (!this.pending) {\n // Memoize the in-flight provision, but drop it on failure so a cold-start error (e.g. a fresh\n // SSH box that wasn't ready) can be retried by the next `ensure()`/request instead of latching.\n this.pending = this.resolver()\n .then((b) => (this.cached = b))\n .catch((err) => {\n this.pending = null;\n throw err;\n });\n }\n return this.pending;\n }\n\n /**\n * Resolve the base eagerly and memoize it — provisions the transport (spawns the embedded daemon,\n * connects the sandbox/SSH/Docker target, …) now instead of on the first request. Idempotent: this\n * awaits the *same* memoized promise the first `request()`/`open()` awaits, so the target's\n * `connect()` fires exactly once. Backs {@link import(\"./client.js\").Mindwire.ensure}.\n */\n async ready(): Promise<void> {\n await this.base();\n }\n\n private url(baseUrl: string, path: string, query?: RequestInitLike[\"query\"]): string {\n const u = new URL(baseUrl + (path.startsWith(\"/\") ? path : `/${path}`));\n if (query) {\n for (const [k, v] of Object.entries(query)) {\n if (v !== undefined) u.searchParams.set(k, String(v));\n }\n }\n return u.toString();\n }\n\n private headers(token: string | undefined, extra?: Record<string, string>, hasBody = false): Record<string, string> {\n const h: Record<string, string> = { Accept: \"application/json\", ...this.baseHeaders, ...extra };\n if (token) h[\"Authorization\"] = `Bearer ${token}`;\n if (hasBody) h[\"Content-Type\"] = \"application/json\";\n return h;\n }\n\n async request<T>(method: string, path: string, init: RequestInitLike = {}): Promise<T> {\n const base = await this.base();\n const hasBody = init.body !== undefined;\n const url = this.url(base.baseUrl, path, init.query);\n const extra = { ...base.headers, ...init.headers };\n const f = base.fetch ?? this.fetchImpl;\n const send = async (force: boolean) =>\n this.fetchWithTimeout(\n f,\n url,\n {\n method,\n headers: this.headers(await this.authToken(base, force), extra, hasBody),\n body: hasBody ? JSON.stringify(init.body) : undefined,\n },\n init.signal,\n method,\n path,\n );\n\n let res = await send(false);\n // One-shot re-mint + retry for rotating credentials (e.g. an expired gateway JWT).\n if (res.status === 401 && base.getToken) res = await send(true);\n\n if (!res.ok) throw await this.toApiError(method, res);\n if (res.status === 204) return undefined as T;\n\n const text = await res.text();\n if (text === \"\") return undefined as T;\n try {\n return JSON.parse(text) as T;\n } catch (e) {\n throw new MindwireError(`mindwire: ${method} ${path} returned a non-JSON body`, { cause: e });\n }\n }\n\n /** Open a streaming response (SSE). Caller owns the body. */\n async open(method: string, path: string, init: RequestInitLike = {}): Promise<Response> {\n const base = await this.base();\n const url = this.url(base.baseUrl, path, init.query);\n const extra = { Accept: \"text/event-stream\", ...base.headers, ...init.headers };\n const f = base.fetch ?? this.fetchImpl;\n // No timeout: SSE streams are long-lived. We still wrap network faults (via fetchOnce) so a\n // connection refused surfaces as a MindwireError rather than a bare `TypeError: fetch failed`.\n const send = async (force: boolean) =>\n this.fetchOnce(\n f,\n url,\n {\n method,\n headers: this.headers(await this.authToken(base, force), extra, init.body !== undefined),\n ...(init.body !== undefined ? { body: JSON.stringify(init.body) } : {}),\n ...(init.signal ? { signal: init.signal } : {}),\n },\n method,\n path,\n );\n\n let res = await send(false);\n if (res.status === 401 && base.getToken) res = await send(true);\n\n if (!res.ok) throw await this.toApiError(method, res);\n if (!res.body)\n throw new MindwireError(`mindwire: ${method} ${path} returned no response body to stream`);\n return res;\n }\n\n private async toApiError(method: string, res: Response): Promise<ApiError> {\n let body: unknown = \"\";\n try {\n const text = await res.text();\n try {\n body = text ? JSON.parse(text) : \"\";\n } catch {\n body = text;\n }\n } catch {\n /* ignore body read failures */\n }\n return new ApiError({ status: res.status, url: res.url, method, body });\n }\n}\n","/**\n * A minimal, dependency-free Server-Sent Events reader.\n *\n * The daemon streams `data: <json>\\n\\n` frames (one JSON object per event) plus `: ping`\n * comment keepalives and an initial `{ \"type\": \"status\", \"meta\": { \"stream\": \"open\" } }`\n * sentinel. This parser handles multi-line `data:` fields and `\\r\\n`/`\\n` line endings, and\n * yields the JSON-parsed payload of each event.\n *\n * We read via `ReadableStream.getReader()` rather than `for await` so it works on every\n * runtime with WHATWG streams (Node 18+ undici, Deno, Bun, browsers), not only those that\n * made the stream async-iterable.\n */\nexport async function* readSSE<T>(\n body: ReadableStream<Uint8Array>,\n signal?: AbortSignal,\n): AsyncGenerator<T, void, unknown> {\n const reader = body.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n const onAbort = () => void reader.cancel().catch(() => {});\n if (signal) {\n if (signal.aborted) {\n await reader.cancel().catch(() => {});\n return;\n }\n signal.addEventListener(\"abort\", onAbort, { once: true });\n }\n\n try {\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n buffer += decoder.decode(value, { stream: true });\n\n // Events are separated by a blank line. Normalize CRLF first.\n let sep: number;\n while ((sep = indexOfBlankLine(buffer)) !== -1) {\n const rawEvent = buffer.slice(0, sep);\n buffer = buffer.slice(sepEnd(buffer, sep));\n const payload = parseEvent(rawEvent);\n if (payload !== undefined) yield JSON.parse(payload) as T;\n }\n }\n // Flush any trailing event that wasn't terminated by a blank line.\n const payload = parseEvent(buffer);\n if (payload !== undefined) yield JSON.parse(payload) as T;\n } finally {\n if (signal) signal.removeEventListener(\"abort\", onAbort);\n // Breaking a consumer loop must release the HTTP stream as well as its reader.\n await reader.cancel().catch(() => {});\n reader.releaseLock();\n }\n}\n\n/** Index of the start of the blank-line separator (`\\n\\n` or `\\r\\n\\r\\n`), or -1. */\nfunction indexOfBlankLine(s: string): number {\n const a = s.indexOf(\"\\n\\n\");\n const b = s.indexOf(\"\\r\\n\\r\\n\");\n if (a === -1) return b;\n if (b === -1) return a;\n return Math.min(a, b);\n}\n\n/** Length of the separator that starts at `idx`, so the next event begins after it. */\nfunction sepEnd(s: string, idx: number): number {\n return s.startsWith(\"\\r\\n\\r\\n\", idx) ? idx + 4 : idx + 2;\n}\n\n/**\n * Extract the concatenated `data:` payload of one raw SSE event block. Comment lines\n * (starting with `:`) and non-data fields are ignored. Returns `undefined` for an event\n * with no data lines (e.g. a lone keepalive comment).\n */\nfunction parseEvent(block: string): string | undefined {\n const lines = block.split(/\\r\\n|\\n/);\n const data: string[] = [];\n for (const line of lines) {\n if (line === \"\" || line.startsWith(\":\")) continue;\n const colon = line.indexOf(\":\");\n const field = colon === -1 ? line : line.slice(0, colon);\n if (field !== \"data\") continue;\n let value = colon === -1 ? \"\" : line.slice(colon + 1);\n if (value.startsWith(\" \")) value = value.slice(1); // SSE strips one leading space\n data.push(value);\n }\n if (data.length === 0) return undefined;\n return data.join(\"\\n\");\n}\n","import type { Http } from \"./http.js\";\nimport { readSSE } from \"./sse.js\";\nimport { RunFailedError } from \"./errors.js\";\nimport type { Event, ResultInfo, RespondInput, RunSnapshot, Run as RunData } from \"./types.js\";\n\nexport interface StreamOptions {\n signal?: AbortSignal;\n /** Resume after a snapshot/event cursor without replaying earlier output. */\n after?: number;\n /**\n * Include the daemon's `{ type: \"status\", meta: { stream: \"open\" } }` sentinel that is\n * flushed the instant the stream opens (used to detect a live vs. buffered transport).\n * Off by default — most consumers only care about model output.\n */\n includeOpenSentinel?: boolean;\n}\n\nexport interface WaitResult {\n run: RunData;\n result?: ResultInfo;\n}\n\nconst TERMINAL = new Set([\"done\", \"error\", \"cancelled\"]);\n\n/**\n * A handle to one turn's run. Wraps the durable `Run` record returned by `POST /turns` and\n * exposes the unified event stream, cancellation, and status polling.\n *\n * Stream it directly:\n *\n * ```ts\n * const run = await mw.turn({ chatId, message: \"refactor foo\" });\n * for await (const ev of run) {\n * if (ev.type === \"text\") process.stdout.write(ev.text ?? \"\");\n * }\n * ```\n */\nexport class Run {\n private data: RunData;\n private readonly http: Http;\n\n constructor(http: Http, data: RunData) {\n this.http = http;\n this.data = data;\n }\n\n get id(): string {\n return this.data.id;\n }\n get chatId(): string {\n return this.data.chatId;\n }\n get agent(): string | undefined {\n return this.data.agent;\n }\n get status(): RunData[\"status\"] {\n return this.data.status;\n }\n /** `\"resolve\"` on the parent of a global-resolve run; `undefined` for an ordinary turn. */\n get kind(): RunData[\"kind\"] {\n return this.data.kind;\n }\n /** On a child iteration of a resolve run, the id of its parent resolve run; else `undefined`. */\n get parentId(): string | undefined {\n return this.data.parentId;\n }\n /** Parent of a resolve run only: why the loop ended (`\"done\"` | `\"capped\"` | `\"error\"` | …). */\n get stopReason(): RunData[\"stopReason\"] {\n return this.data.stopReason;\n }\n /** Parent of a resolve run only: how many child turns the loop ran. */\n get iterations(): number | undefined {\n return this.data.iterations;\n }\n /** The latest known run record. */\n get value(): RunData {\n return this.data;\n }\n\n /** Unified SSE event stream: replay buffer, then live events, then close. */\n async *stream(opts: StreamOptions = {}): AsyncGenerator<Event, void, unknown> {\n const cursor = opts.after === undefined ? \"\" : `?after=${encodeURIComponent(opts.after)}`;\n const res = await this.http.open(\"GET\", `/runs/${encodeURIComponent(this.id)}/stream${cursor}`, {\n ...(opts.signal ? { signal: opts.signal } : {}),\n });\n for await (const ev of readSSE<Event>(res.body!, opts.signal)) {\n if (!opts.includeOpenSentinel && ev.type === \"status\" && ev.meta?.[\"stream\"] === \"open\") {\n continue;\n }\n yield ev;\n }\n }\n\n /** `for await (const ev of run)` — sugar for `run.stream()`. */\n [Symbol.asyncIterator](): AsyncGenerator<Event, void, unknown> {\n return this.stream();\n }\n\n /** Cancel the in-flight turn (kills the underlying agent process). */\n async cancel(): Promise<void> {\n await this.http.request<void>(\"POST\", `/runs/${encodeURIComponent(this.id)}/cancel`);\n }\n\n /**\n * Answer a pending permission, question or plan. Message-mode questions remain answerable\n * after completion; the daemon steers or resumes the conversation. Read the chat's latest\n * run after replying to a completed run. Requires the agent's `respond` capability.\n */\n async respond(input: RespondInput & { gitAuth?: import(\"./workspace.js\").ProjectAuth } = {}): Promise<void> {\n await this.http.request<void>(\"POST\", `/runs/${encodeURIComponent(this.id)}/respond`, { body: input });\n }\n\n /**\n * Steer a follow-up message into the running turn without cancelling it. Requires the agent's\n * `input` capability.\n */\n async sendInput(text: string): Promise<void> {\n await this.http.request<void>(\"POST\", `/runs/${encodeURIComponent(this.id)}/input`, { body: { text } });\n }\n\n /**\n * Soft-stop the running turn (ask the agent to halt current work) without the hard process kill\n * {@link Run.cancel} does — the turn stays open for a follow-up via {@link Run.sendInput}.\n * Requires the agent's `interrupt` capability.\n */\n async interrupt(): Promise<void> {\n await this.http.request<void>(\"POST\", `/runs/${encodeURIComponent(this.id)}/interrupt`);\n }\n\n /**\n * Switch the model of the live turn. An empty/omitted `model` resets the turn to the agent/CLI\n * default. Only meaningful on a persistent (non-bypass) turn; on a one-shot turn it is a\n * best-effort no-op. Requires the agent's `setModel` capability.\n */\n async setModel(model?: string): Promise<void> {\n await this.http.request<void>(\"POST\", `/runs/${encodeURIComponent(this.id)}/set-model`, {\n body: { model: model ?? \"\" },\n });\n }\n\n /**\n * Switch the live permission mode using a value from the agent's settings schema.\n * Resolves after the harness acknowledges the change; rejects if it cannot apply it.\n * Requires `setPermissionMode`. Codex settings apply on the next turn instead.\n */\n async setPermissionMode(mode: string): Promise<void> {\n await this.http.request<void>(\"POST\", `/runs/${encodeURIComponent(this.id)}/set-permission-mode`, {\n body: { mode },\n });\n }\n\n /**\n * `GET /runs/{id}/children` — the child iterations of a global-resolve run, oldest→newest, each as\n * its own {@link Run} handle. An ordinary turn (or a resolve that ran a single iteration) returns an\n * empty array. Use it to inspect the run tree a {@link Mindwire.resolve} produced.\n */\n async children(): Promise<Run[]> {\n const data = await this.http.request<RunData[]>(\n \"GET\",\n `/runs/${encodeURIComponent(this.id)}/children`,\n );\n return data.map((d) => new Run(this.http, d));\n }\n\n /** Re-fetch the run record from the daemon and update this handle. */\n async refresh(): Promise<RunData> {\n this.data = await this.http.request<RunData>(\"GET\", `/runs/${encodeURIComponent(this.id)}`);\n return this.data;\n }\n\n /** Restore current output once, then follow with `stream({ after: snapshot.sequence })`. */\n async snapshot(): Promise<RunSnapshot> {\n const snapshot = await this.http.request<RunSnapshot>(\"GET\", `/runs/${encodeURIComponent(this.id)}/snapshot`);\n this.data = snapshot.run;\n return snapshot;\n }\n\n /**\n * Consume the event stream to completion. Returns the final run record and the `result`\n * event's summary (if any). Throws {@link RunFailedError} on an `error`/`cancelled` outcome\n * unless `throwOnError` is set to `false`.\n */\n async wait(opts: StreamOptions & { throwOnError?: boolean } = {}): Promise<WaitResult> {\n let result: ResultInfo | undefined;\n let streamError: string | undefined;\n for await (const ev of this.stream(opts)) {\n if (ev.type === \"result\") result = ev.result;\n else if (ev.type === \"error\") streamError = ev.error;\n }\n const run = await this.refresh();\n if (opts.throwOnError !== false) {\n if (TERMINAL.has(run.status)) {\n if (run.status !== \"done\") {\n throw new RunFailedError(run.id, run.status, run.error ?? streamError);\n }\n } else {\n // The stream ended but the run never reached a terminal state — the transport dropped\n // mid-run (the daemon keeps a replay buffer, but this client does not yet reconnect).\n // Report it rather than returning a success-shaped result on a truncated stream.\n throw new RunFailedError(\n run.id,\n run.status,\n streamError ?? \"event stream ended before the run reached a terminal state\",\n );\n }\n }\n return result !== undefined ? { run, result } : { run };\n }\n}\n","import type { Mindwire } from \"./client.js\";\nimport { readSSE } from \"./sse.js\";\n\n/** Write-only credentials. Never persisted in operation snapshots or conversation state. */\nexport type ProjectAuth = (\n | { kind: \"token\"; token: string; username?: string }\n | { kind: \"ssh\"; privateKey: string }\n | { kind: \"gh\" }\n) & { connectionId?: string; expiresAt?: string; readOnly?: boolean };\n\nexport interface GitConnection {\n id: string;\n login: string;\n mode: \"token\" | \"oblienApp\" | \"sshKey\" | \"ghCli\" | \"native\";\n lifetime: \"run\" | \"workspace\";\n}\n\nexport interface GitAccessState {\n default?: GitConnection;\n storedConnectionIds: string[];\n storedConnections: GitConnection[];\n activeOperations: number;\n}\n\nexport interface ProjectGitState {\n connection?: GitConnection;\n inherited: boolean;\n stored: boolean;\n repoUrl?: string;\n}\n\nexport type GitAction = \"stage\" | \"unstage\" | \"discard\" | \"commit\" | \"fetch\" | \"pull\" | \"push\"\n | \"switch_branch\" | \"create_branch\" | \"restore_commit\";\n\nexport interface GitIdentity { name: string; email: string }\n\nexport type GitIdentityScope = \"repository\" | \"workspace\" | \"all_workspaces\";\n\nexport interface GitIdentitySettings {\n effective: GitIdentity;\n repository: GitIdentity | null;\n workspace: GitIdentity | null;\n allWorkspaces: GitIdentity | null;\n defaultRevision: string;\n}\n\nexport interface GitIdentityUpdate {\n scope: GitIdentityScope;\n /** null removes this override, allowing a broader default to apply. */\n identity: GitIdentity | null;\n /** Required for all_workspaces; keep this ID and expectedRevision until acknowledged. */\n requestId?: string;\n expectedRevision?: string;\n}\n\nexport interface GitOperationRequest {\n /** Stable ID. Reuse this exact intent after a lost acknowledgement. */\n id: string;\n action: GitAction;\n /** Literal repository-relative paths, required for stage/unstage/discard. */\n paths?: string[];\n /** Required for commit. Uses the existing author unless identity is explicitly supplied. */\n message?: string;\n /** Literal branch name for switch_branch/create_branch; requires gitOperationsVersion >= 2. */\n branch?: string;\n /** switch_branch only: branch is a remote tracking name, e.g. origin/feature. */\n remote?: boolean;\n /** Commit only; requires gitOperationsVersion >= 3. Saves attribution in this repository,\n * then commits under the same durable lock. Never changes global Git configuration. */\n identity?: GitIdentity;\n /** restore_commit only; requires gitOperationsVersion >= 4. Full source commit object ID. */\n commitId?: string;\n /** restore_commit only: full HEAD object ID observed before confirmation. */\n expectedHead?: string;\n /** restore_commit only: observed local branch name; omit for detached HEAD. */\n expectedBranch?: string;\n /** Write-only, for network operations only. Never part of an operation snapshot. */\n auth?: ProjectAuth;\n}\n\nexport interface GitOperation extends Omit<GitOperationRequest, \"auth\"> {\n projectId: string;\n /** Canonical repository root resolved by the daemon. */\n path: string;\n status: \"queued\" | \"running\" | \"cancelling\" | \"succeeded\" | \"failed\" | \"cancelled\" | \"interrupted\";\n output?: string;\n error?: string;\n /** git_identity_required asks the client to collect a name/email before a new commit intent. */\n errorCode?: \"git_identity_required\" | \"git_restore_dirty\" | \"git_restore_changed\"\n | \"git_restore_in_progress\" | \"git_restore_commit_unavailable\" | \"git_restore_local_files\" | (string & {});\n createdAt: string;\n updatedAt: string;\n sequence: number;\n}\n\nexport interface ProjectRequest {\n /** Stable idempotency key. Keep the same ID if the acknowledgement is lost. */\n id: string;\n source: \"folder\" | \"create\" | \"clone\";\n name: string;\n /** Absolute directory, or ~/... on the workspace. Clone/create require an absent destination. */\n path: string;\n repoUrl?: string;\n branch?: string;\n auth?: ProjectAuth;\n gitConnection?: GitConnection;\n}\n\nexport interface ProjectRemoveRequest {\n /** Stable idempotency key for this confirmed removal. */\n operationId: string;\n expectedRevision: number;\n}\n\nexport interface ProjectOperation extends Omit<ProjectRequest, \"auth\" | \"source\"> {\n source: ProjectRequest[\"source\"] | \"delete\";\n expectedRevision?: number;\n authKind?: ProjectAuth[\"kind\"];\n status: \"queued\" | \"running\" | \"cancelling\" | \"succeeded\" | \"failed\" | \"cancelled\" | \"interrupted\";\n phase: string;\n progress?: number;\n /** Bounded, redacted output tail. */\n log?: string;\n error?: string;\n projectId?: string;\n createdAt: string;\n updatedAt: string;\n sequence: number;\n attempt: number;\n}\n\nexport class ProjectOperationsApi {\n constructor(private readonly mw: Mindwire) {}\n async list(activeOnly = false): Promise<ProjectOperation[]> {\n const response = await this.mw.http.request<{ operations: ProjectOperation[] }>(\"GET\", \"/workspace/operations\", {\n query: { active: activeOnly },\n });\n return response.operations;\n }\n get(id: string): Promise<ProjectOperation> {\n return this.mw.http.request(\"GET\", `/workspace/operations/${encodeURIComponent(id)}`);\n }\n cancel(id: string): Promise<ProjectOperation> {\n return this.mw.http.request(\"POST\", `/workspace/operations/${encodeURIComponent(id)}/cancel`);\n }\n retry(id: string, auth?: ProjectAuth): Promise<ProjectOperation> {\n return this.mw.http.request(\"POST\", `/workspace/operations/${encodeURIComponent(id)}/retry`, { body: { auth } });\n }\n /** The first event is the current snapshot, then live changes. Reconnecting never replays old\n * progress. Breaking the loop/aborting detaches the observer; cancel(id) explicitly stops work.\n */\n async *watch(id: string, opts: { signal?: AbortSignal } = {}): AsyncGenerator<ProjectOperation> {\n const controller = new AbortController();\n const abort = () => controller.abort();\n opts.signal?.addEventListener(\"abort\", abort, { once: true });\n if (opts.signal?.aborted) controller.abort();\n try {\n const response = await this.mw.http.open(\"GET\", `/workspace/operations/${encodeURIComponent(id)}/stream`, {\n signal: controller.signal,\n });\n let sequence = -1;\n for await (const operation of readSSE<ProjectOperation>(response.body!, controller.signal)) {\n if (operation.sequence > sequence) { sequence = operation.sequence; yield operation; }\n }\n } finally {\n controller.abort();\n opts.signal?.removeEventListener(\"abort\", abort);\n }\n }\n}\n\n/** Stable identity and version of a record in one workspace's SQLite registry. */\nexport interface WorkspaceRecord {\n id: string;\n /** Registry identity, independent of the cloud provider's workspace ID. */\n workspaceId: string;\n createdAt: string;\n revision: number;\n}\n\n/** A saved agent profile. Profiles using one harness share that workspace's native configuration. */\nexport interface WorkspaceAgent extends WorkspaceRecord {\n name: string;\n agentType: string;\n agentTypeName?: string;\n /** Mutes this profile's current and future chats across notification channels. Omit to preserve; false to clear. */\n notificationsMuted?: boolean;\n}\n\nexport interface WorkspaceProject extends WorkspaceRecord {\n name: string;\n path: string;\n repoUrl?: string;\n /** Omit on edits to preserve; explicitly null restores the workspace default. */\n gitConnection?: GitConnection | null;\n}\n\n/** Chat membership; transcript content continues to come from /chats/:id/messages. */\nexport interface WorkspaceChat extends WorkspaceRecord {\n agentId: string;\n projectId: string;\n title: string;\n titleIsUserSet?: boolean;\n sessionId?: string;\n /** Mutes this chat. False clears its own mute but never overrides a muted parent profile. Omit to preserve. */\n notificationsMuted?: boolean;\n}\n\nexport type WorkspaceKind = \"agents\" | \"projects\" | \"chats\";\nexport type WorkspaceInput<T extends WorkspaceRecord> = Omit<T, \"id\" | \"workspaceId\" | \"revision\" | \"createdAt\"> & {\n createdAt?: string;\n};\n\n/** Additive migration. Existing records and deletion tombstones always win over these values. */\nexport interface WorkspaceImport {\n agents?: (WorkspaceInput<WorkspaceAgent> & { id: string })[];\n projects?: (WorkspaceInput<WorkspaceProject> & { id: string })[];\n chats?: (WorkspaceInput<WorkspaceChat> & { id: string })[];\n}\n\nexport interface WorkspaceSnapshot {\n version: number;\n workspaceId: string;\n revision: number;\n /** true replaces the cache for this workspace; false applies changed rows and deletions. */\n full: boolean;\n agents: WorkspaceAgent[];\n projects: WorkspaceProject[];\n chats: WorkspaceChat[];\n deleted: { kind: WorkspaceKind; id: string; revision: number }[];\n}\n\nexport class WorkspaceCollection<T extends WorkspaceRecord> {\n constructor(private readonly mw: Mindwire, private readonly kind: WorkspaceKind) {}\n\n /** Create with a stable client-generated ID. For updates, supply the record's last revision. */\n put(id: string, record: WorkspaceInput<T>, expectedRevision?: number): Promise<WorkspaceSnapshot> {\n return this.mw.http.request(\"PUT\", `/workspace/${this.kind}/${encodeURIComponent(id)}`, {\n body: { record, expectedRevision },\n });\n }\n\n /** Remove membership and dependent chat links. Files and native transcripts are retained.\n * Use deleteChat() for an explicit transcript purge. Running chats reject removal with 409.\n */\n delete(id: string, revision: number): Promise<WorkspaceSnapshot> {\n return this.mw.http.request(\"DELETE\", `/workspace/${this.kind}/${encodeURIComponent(id)}`, {\n query: { revision },\n });\n }\n}\n\n/** Workspace metadata is shared by all harnesses; withAgent() never scopes these requests. */\nexport class WorkspaceApi {\n readonly git: GitAccessApi;\n readonly operations: ProjectOperationsApi;\n readonly agents: WorkspaceCollection<WorkspaceAgent>;\n readonly projects: WorkspaceCollection<WorkspaceProject>;\n readonly chats: WorkspaceCollection<WorkspaceChat>;\n\n constructor(private readonly mw: Mindwire) {\n this.git = new GitAccessApi(mw);\n this.operations = new ProjectOperationsApi(mw);\n this.agents = new WorkspaceCollection(mw, \"agents\");\n this.projects = new WorkspaceCollection(mw, \"projects\");\n this.chats = new WorkspaceCollection(mw, \"chats\");\n }\n\n snapshot(): Promise<WorkspaceSnapshot> { return this.mw.http.request(\"GET\", \"/workspace\"); }\n\n /** Start an operation owned by the daemon. The same ID/payload returns the existing operation. */\n createProject(request: ProjectRequest): Promise<ProjectOperation> {\n return this.mw.http.request(\"POST\", \"/workspace/projects\", { body: request });\n }\n\n /** Permanently remove the confirmed project's directory and membership.\n * projects.delete() retains files. Native harness transcripts are not purged.\n */\n removeProjectFiles(id: string, request: ProjectRemoveRequest): Promise<ProjectOperation> {\n return this.mw.http.request(\"POST\", `/workspace/projects/${encodeURIComponent(id)}/remove`, { body: request });\n }\n\n /** Incremental reconciliation. Pass the previous identity to detect a replaced/restored workspace.\n * A 409 requires fetching snapshot() again; never apply a delta to a different registry.\n */\n changes(since: number, workspaceId: string): Promise<WorkspaceSnapshot> {\n return this.mw.http.request(\"GET\", \"/workspace/changes\", { query: { since, workspaceId } });\n }\n\n /** Import legacy metadata before replacing a local cache. Safe to repeat after interruption. */\n import(records: WorkspaceImport): Promise<WorkspaceSnapshot> {\n return this.mw.http.request(\"POST\", \"/workspace/import\", { body: records });\n }\n}\n\n/** Account preferences and authenticated Git on the daemon hosting each repository. */\nexport class GitAccessApi {\n constructor(private readonly mw: Mindwire) {}\n /** Reads attribution independently of GitHub authentication. Requires gitIdentityVersion >= 1. */\n identity(context: { projectId?: string; path?: string } = {}): Promise<GitIdentitySettings> {\n return this.mw.http.request(\"GET\", \"/workspace/git/identity\", { query: context });\n }\n /** Saves settings only; never stages or commits. all_workspaces installs this\n * workspace's copy of a client-managed default; the client handles fan-out. */\n setIdentity(update: GitIdentityUpdate, context: { projectId?: string; path?: string } = {}): Promise<GitIdentitySettings> {\n return this.mw.http.request(\"PUT\", \"/workspace/git/identity\", { query: context, body: update });\n }\n state(): Promise<GitAccessState> {\n return this.mw.http.request(\"GET\", \"/workspace/git\");\n }\n setDefault(connection: GitConnection | null, auth?: ProjectAuth): Promise<GitAccessState> {\n return this.mw.http.request(\"PUT\", \"/workspace/git\", { body: { connection, auth } });\n }\n forget(connectionId: string): Promise<GitAccessState> {\n return this.mw.http.request(\"DELETE\", `/workspace/git/connections/${encodeURIComponent(connectionId)}`);\n }\n project(projectId: string): Promise<ProjectGitState> {\n return this.mw.http.request(\"GET\", `/workspace/projects/${encodeURIComponent(projectId)}/git`);\n }\n setProject(projectId: string, connection: GitConnection | null, expectedRevision: number, auth?: ProjectAuth): Promise<WorkspaceSnapshot> {\n return this.mw.http.request(\"PUT\", `/workspace/projects/${encodeURIComponent(projectId)}/git`, {\n body: { connection, expectedRevision, auth },\n });\n }\n /** Compatibility call. Prefer start() and operation()/watch() for reconnectable writes. */\n run(projectId: string, operation: \"fetch\" | \"pull\" | \"push\", auth?: ProjectAuth): Promise<{ output: string }> {\n return this.mw.http.request(\"POST\", `/workspace/projects/${encodeURIComponent(projectId)}/git/${operation}`, { body: { auth } });\n }\n\n /** Requires health.gitOperationsVersion >= 1 (>= 2 for branches, >= 4 for restore_commit). Acceptance persists before Git runs;\n * disconnecting only detaches the client. The same ID/intent never runs twice.\n */\n start(projectId: string, request: GitOperationRequest): Promise<GitOperation> {\n return this.mw.http.request(\"POST\", `/workspace/projects/${encodeURIComponent(projectId)}/git/operations`, { body: request });\n }\n async operations(projectId: string, activeOnly = false): Promise<GitOperation[]> {\n const result = await this.mw.http.request<{ operations: GitOperation[] }>(\"GET\",\n `/workspace/projects/${encodeURIComponent(projectId)}/git/operations`, { query: { active: activeOnly, actionsVersion: 4 } });\n return result.operations;\n }\n operation(id: string): Promise<GitOperation> {\n return this.mw.http.request(\"GET\", `/workspace/git/operations/${encodeURIComponent(id)}`);\n }\n cancel(id: string): Promise<GitOperation> {\n return this.mw.http.request(\"POST\", `/workspace/git/operations/${encodeURIComponent(id)}/cancel`);\n }\n /** Current snapshot followed by state changes. Aborting observation never cancels the operation. */\n async *watch(id: string, opts: { signal?: AbortSignal } = {}): AsyncGenerator<GitOperation> {\n const controller = new AbortController();\n const abort = () => controller.abort();\n opts.signal?.addEventListener(\"abort\", abort, { once: true });\n if (opts.signal?.aborted) controller.abort();\n try {\n const response = await this.mw.http.open(\"GET\", `/workspace/git/operations/${encodeURIComponent(id)}/stream`, {\n signal: controller.signal,\n });\n let sequence = -1;\n for await (const operation of readSSE<GitOperation>(response.body!, controller.signal)) {\n if (operation.sequence > sequence) { sequence = operation.sequence; yield operation; }\n }\n } finally {\n controller.abort();\n opts.signal?.removeEventListener(\"abort\", abort);\n }\n }\n}\n","import type { Mindwire } from \"./client.js\";\nimport { readSSE } from \"./sse.js\";\n\nexport interface SurfaceGeometry { width: number; height: number; revision: number }\nexport interface SurfaceProblem { code: string; message: string }\nexport interface SurfaceCapabilities {\n view: boolean; capture: boolean; pointer: boolean; keyboard: boolean; text: boolean;\n clipboardRead: boolean; clipboardWrite: boolean;\n keyboardText?: boolean; extendedKeys?: boolean;\n}\nexport interface SurfaceController {\n sessionId: string; actor: \"user\" | \"agent\"; name: string; runId?: string; chatId?: string;\n generation: number; expiresAt: string;\n}\nexport interface SurfaceSnapshot {\n id: string; workspaceId: string; kind: \"desktop\"; provider: \"oblien\";\n version: number; revision: number; instanceId: string;\n state: string; observedAt?: string; supported: boolean; enabled: boolean; available: boolean;\n credentials: boolean; os?: string; capabilities: SurfaceCapabilities;\n geometry?: SurfaceGeometry; controller?: SurfaceController;\n authorizationExpiresAt?: string; error?: SurfaceProblem;\n}\n/** Write-only, desktop-only, expiring provider grant. Never pass a user's session JWT. */\nexport interface SurfaceBinding {\n registryId: string; workspaceId: string; gatewayToken?: string;\n connection: {\n expires_at: string;\n ssh: { host: string; port: number; username: string; password: string; host_key_fingerprint: string };\n vnc: { host: string; port: number; authentication: \"none\" };\n };\n}\nexport interface SurfaceSession {\n id: string; surfaceId: string; actor: \"user\" | \"agent\"; name: string;\n chatId?: string; runId?: string; mode: \"view\" | \"control\"; createdAt: string;\n controller?: SurfaceController;\n}\nexport interface SurfaceOpenRequest { requestId: string; name?: string; mode: \"view\" | \"control\" }\nexport interface SurfaceControlRequest { action: \"acquire\" | \"takeover\" | \"release\" | \"renew\"; generation?: number }\nexport interface SurfaceAction {\n kind: \"pointer\" | \"click\" | \"drag\" | \"scroll\" | \"key\" | \"text\" | \"clipboard_read\" | \"clipboard_write\" | \"release\";\n x?: number; y?: number; toX?: number; toY?: number; buttons?: number;\n button?: \"left\" | \"middle\" | \"right\"; count?: number; deltaX?: number; deltaY?: number;\n keys?: string[]; text?: string;\n /** Physical US keyboard text (printable ASCII, up to 4096 bytes), preserving the clipboard. */\n textMode?: \"keyboard\";\n}\nexport interface SurfaceActionRequest {\n /** Reuse this ID to inspect/recover an uncertain acknowledgement. Do not replay with a new ID. */\n requestId: string; sessionId: string; controlGeneration: number; frameId?: string;\n geometryRevision?: number; action: SurfaceAction;\n}\nexport interface SurfaceReceipt {\n id: string; sessionId: string; surfaceId: string; kind: string;\n status: \"dispatching\" | \"dispatched\" | \"outcome_unknown\"; createdAt: string; error?: SurfaceProblem;\n /** Transient clipboard output, not stored in the receipt. */\n text?: string;\n}\nexport interface SurfaceCapture {\n id: string; surfaceId: string; artifactId: string; mime: string; geometry: SurfaceGeometry; createdAt: string;\n}\nexport interface ArtifactContent {\n id: string; chatId?: string; mime: string; bytes: number; width: number; height: number; createdAt: string;\n /** Base64 bytes, compatible with every existing daemon transport. */\n data: string;\n}\nexport interface SurfaceToolAction {\n surfaceId: string; operation: string; sessionId?: string; receiptId?: string; status?: string;\n capture?: { id: string; artifactId: string; width: number; height: number };\n}\n\n/** Workspace-scoped API. One controller is shared by every harness and app client. */\nexport class SurfacesApi {\n constructor(private readonly mw: Mindwire) {}\n list(): Promise<SurfaceSnapshot[]> { return this.mw.http.request(\"GET\", \"/surfaces\"); }\n status(refresh = false): Promise<SurfaceSnapshot> {\n return this.mw.http.request(\"GET\", \"/surfaces/desktop\", { query: { refresh } });\n }\n bind(binding: SurfaceBinding): Promise<SurfaceSnapshot> {\n return this.mw.http.request(\"PUT\", \"/surfaces/desktop/binding\", { body: binding });\n }\n open(request: SurfaceOpenRequest): Promise<SurfaceSession> {\n return this.mw.http.request(\"POST\", \"/surfaces/desktop/sessions\", { body: request });\n }\n control(id: string, request: SurfaceControlRequest): Promise<SurfaceSession> {\n return this.mw.http.request(\"POST\", `/surfaces/desktop/sessions/${encodeURIComponent(id)}/control`, { body: request });\n }\n close(id: string): Promise<{ closed: boolean }> {\n return this.mw.http.request(\"DELETE\", `/surfaces/desktop/sessions/${encodeURIComponent(id)}`);\n }\n capture(id: string): Promise<SurfaceCapture> {\n return this.mw.http.request(\"POST\", `/surfaces/desktop/sessions/${encodeURIComponent(id)}/captures`);\n }\n action(request: SurfaceActionRequest): Promise<SurfaceReceipt> {\n return this.mw.http.request(\"POST\", \"/surfaces/desktop/actions\", { body: request });\n }\n receipt(id: string): Promise<SurfaceReceipt> {\n return this.mw.http.request(\"GET\", `/surfaces/desktop/actions/${encodeURIComponent(id)}`);\n }\n artifact(id: string): Promise<ArtifactContent> {\n return this.mw.http.request(\"GET\", `/artifacts/${encodeURIComponent(id)}`);\n }\n /** Every connection starts with the current snapshot, then revisions. Never replays input. */\n async *watch(opts: { signal?: AbortSignal } = {}): AsyncGenerator<SurfaceSnapshot> {\n const controller = new AbortController();\n const abort = () => controller.abort();\n opts.signal?.addEventListener(\"abort\", abort, { once: true });\n if (opts.signal?.aborted) controller.abort();\n try {\n const response = await this.mw.http.open(\"GET\", \"/surfaces/desktop/events\", { signal: controller.signal });\n let instance: string | undefined;\n let revision = -1;\n for await (const snapshot of readSSE<SurfaceSnapshot>(response.body!, controller.signal)) {\n if (instance !== snapshot.instanceId || snapshot.revision > revision) {\n instance = snapshot.instanceId; revision = snapshot.revision; yield snapshot;\n }\n }\n } finally {\n controller.abort(); opts.signal?.removeEventListener(\"abort\", abort);\n }\n }\n}\n","import type { Mindwire } from \"./client.js\";\n\nexport interface ServiceUpdateState {\n idle: boolean;\n updating: boolean;\n activeOperations: number;\n}\n\nexport interface ServiceUpdateLease {\n id: string;\n /** Terminate only this leased process, not every mindwired process on the host. */\n pid: number;\n expiresAt: string;\n}\n\n/** Installer coordination; requires health.serviceUpdateVersion >= 1. */\nexport class ServiceApi {\n constructor(private readonly client: Mindwire) {}\n\n updateStatus(): Promise<ServiceUpdateState> {\n return this.client.http.request(\"GET\", \"/service/update\");\n }\n\n /** Download first. Acquire immediately before replacement; busy work returns 409.\n * Admission stays closed until release, process exit, or the one-minute expiry. */\n acquireUpdate(): Promise<ServiceUpdateLease> {\n return this.client.http.request(\"POST\", \"/service/update\");\n }\n\n releaseUpdate(id: string): Promise<{ ok: boolean }> {\n return this.client.http.request(\"DELETE\", `/service/update/${encodeURIComponent(id)}`);\n }\n}\n","import type { Mindwire } from \"./client.js\";\nimport { readSSE } from \"./sse.js\";\n\n/** Native workspace execution; the same contract on macOS, Linux and Windows. */\nexport interface WorkspaceHost {\n hostname: string; os: \"darwin\" | \"linux\" | \"windows\" | string; arch: string;\n home: string; directory: string; pid: number;\n}\nexport interface HostResources { cpus: number; memoryMb: number; diskMb: number }\nexport interface WorkspaceFile {\n name: string; path: string; type: \"file\" | \"dir\"; size: number; modifiedAt: string; isIgnored: boolean;\n}\nexport interface WorkspaceFileContent { path: string; content: string; size: number }\nexport interface WorkspaceExecRequest { argv: string[]; directory?: string; input?: string; timeoutMs?: number }\nexport interface WorkspaceExecResult { stdout: string; stderr: string; exitCode: number; truncated?: boolean }\nexport type WorkspaceExecEvent =\n | { kind: \"output\"; channel: \"stdout\" | \"stderr\"; data: string }\n | { kind: \"exit\"; exitCode: number }\n | { kind: \"error\"; error: string };\nexport interface TerminalRequest { id: string; directory?: string; columns: number; rows: number }\nexport interface TerminalState extends TerminalRequest { title: string; running: boolean; exitCode?: number; createdAt: string }\nexport interface TerminalEvent { sequence: number; kind: \"output\" | \"reset\" | \"exit\"; data?: string; state?: TerminalState }\n/** Retry the exact same writer/sequence/data after a lost acknowledgement, never a new sequence. */\nexport interface TerminalInput { writer: string; sequence: number; data: string }\n\nexport class ExecutionApi {\n readonly terminals: TerminalsApi;\n constructor(private readonly client: Mindwire) { this.terminals = new TerminalsApi(client); }\n host(): Promise<WorkspaceHost> { return this.client.http.request(\"GET\", \"/workspace/host\"); }\n resources(): Promise<HostResources> { return this.client.http.request(\"GET\", \"/workspace/resources\"); }\n files(path = \"\", query?: string): Promise<WorkspaceFile[]> {\n return this.client.http.request(\"GET\", \"/workspace/files\", { query: { path, query } });\n }\n read(path: string): Promise<WorkspaceFileContent> { return this.client.http.request(\"GET\", \"/workspace/file\", { query: { path } }); }\n write(path: string, content: string): Promise<{ ok: boolean }> {\n return this.client.http.request(\"PUT\", \"/workspace/file\", { body: { path, content } });\n }\n remove(path: string): Promise<{ ok: boolean }> { return this.client.http.request(\"DELETE\", \"/workspace/file\", { query: { path } }); }\n exec(command: WorkspaceExecRequest, signal?: AbortSignal): Promise<WorkspaceExecResult> {\n return this.client.http.request(\"POST\", \"/workspace/exec\", { body: command, signal });\n }\n /** Output data is base64, preserving partial UTF-8 chunks. Cancelling stops this command. */\n async *stream(command: WorkspaceExecRequest, signal?: AbortSignal): AsyncGenerator<WorkspaceExecEvent> {\n const response = await this.client.http.open(\"POST\", \"/workspace/exec/stream\", { body: command, signal });\n yield* readSSE<WorkspaceExecEvent>(response.body!, signal);\n }\n}\nexport class TerminalsApi {\n constructor(private readonly client: Mindwire) {}\n list(directory?: string): Promise<TerminalState[]> { return this.client.http.request(\"GET\", \"/workspace/terminals\", { query: { directory } }); }\n open(request: TerminalRequest): Promise<TerminalState> { return this.client.http.request(\"POST\", \"/workspace/terminals\", { body: request }); }\n get(id: string): Promise<TerminalState> { return this.client.http.request(\"GET\", this.path(id)); }\n close(id: string): Promise<{ ok: boolean }> { return this.client.http.request(\"DELETE\", this.path(id)); }\n input(id: string, input: TerminalInput): Promise<{ ok: boolean; sequence: number }> {\n return this.client.http.request(\"POST\", `${this.path(id)}/input`, { body: input });\n }\n resize(id: string, columns: number, rows: number): Promise<TerminalState> {\n return this.client.http.request(\"PUT\", `${this.path(id)}/size`, { body: { columns, rows } });\n }\n /** Detaching only closes the subscription. Resume from the last sequence; reset replaces the screen. */\n async *events(id: string, after = 0, signal?: AbortSignal): AsyncGenerator<TerminalEvent> {\n const response = await this.client.http.open(\"GET\", `${this.path(id)}/events`, { query: { after }, signal });\n yield* readSSE<TerminalEvent>(response.body!, signal);\n }\n private path(id: string): string { return `/workspace/terminals/${encodeURIComponent(id)}`; }\n}\n","import type { Mindwire } from \"./client.js\";\n\nexport type ComputerRoute = { kind: \"ssh\"; host: string; port: number } | { kind: \"websocket\"; url: string };\nexport interface ComputerInvitation {\n version: 1; computerId: string; name: string; fingerprint: string; routes: ComputerRoute[];\n pairingId: string; secret: string; expiresAt: string;\n}\nexport interface ComputerDevice { id: string; name: string; publicKey: string; createdAt: string; revoked: boolean }\nexport interface ComputerPairRequest { id: string; name: string; publicKey: string }\nexport interface ComputerPairing {\n id: string; expiresAt: string; status: \"waiting\" | \"pending\" | \"approved\" | \"rejected\";\n request?: ComputerPairRequest;\n completed?: boolean;\n}\nexport interface ComputerUpdate {\n id: string; version: string; updatedAt: string; error?: string;\n status: \"idle\" | \"queued\" | \"downloading\" | \"waiting\" | \"restarting\" | \"complete\" | \"failed\";\n}\nexport interface ComputerInfo {\n version: number; computerId: string; registryId: string; fingerprint: string; routes: ComputerRoute[];\n pid: number; apiAddress: string; sshPort: number; websocketPort: number;\n portForwardingVersion?: number;\n}\nexport interface ComputerForwardRequest { id: string; deviceId: string; port: number }\nexport interface ComputerForward extends ComputerForwardRequest { expiresAt: string }\n/** Available only in computer mode. All calls use the existing authenticated transport. */\nexport class ComputerApi {\n constructor(private readonly client: Mindwire) {}\n info(): Promise<ComputerInfo> { return this.client.http.request(\"GET\", \"/computer\"); }\n setRoutes(routes: ComputerRoute[]): Promise<ComputerInfo> {\n return this.client.http.request(\"PUT\", \"/computer/routes\", { body: { routes } });\n }\n updateStatus(): Promise<ComputerUpdate> { return this.client.http.request(\"GET\", \"/computer/update\"); }\n requestUpdate(version: string): Promise<ComputerUpdate> {\n return this.client.http.request(\"POST\", \"/computer/update\", { body: { version } });\n }\n invite(routes: ComputerRoute[]): Promise<ComputerInvitation> {\n return this.client.http.request(\"POST\", \"/computer/pairings\", { body: { routes } });\n }\n pairing(id: string): Promise<ComputerPairing> { return this.client.http.request(\"GET\", `/computer/pairings/${encodeURIComponent(id)}`); }\n completePairing(id: string, requestId: string): Promise<{ ok: boolean }> {\n return this.client.http.request(\"POST\", `/computer/pairings/${encodeURIComponent(id)}/complete`, { body: { requestId } });\n }\n decide(id: string, requestId: string, approve: boolean): Promise<{ ok: boolean; device: ComputerDevice }> {\n return this.client.http.request(\"POST\", `/computer/pairings/${encodeURIComponent(id)}/decision`, { body: { requestId, approve } });\n }\n devices(): Promise<ComputerDevice[]> { return this.client.http.request(\"GET\", \"/computer/devices\"); }\n revoke(id: string): Promise<{ ok: boolean }> { return this.client.http.request(\"DELETE\", `/computer/devices/${encodeURIComponent(id)}`); }\n forwards(): Promise<ComputerForward[]> { return this.client.http.request(\"GET\", \"/computer/forwards\"); }\n /** Authorize a loopback port for this paired device. Renew the same ID every 30s;\n * grants expire after two minutes. Carry traffic using SSH direct-tcpip. */\n forward(request: ComputerForwardRequest): Promise<ComputerForward> {\n return this.client.http.request(\"POST\", \"/computer/forwards\", { body: request });\n }\n closeForward(id: string): Promise<{ ok: boolean }> {\n return this.client.http.request(\"DELETE\", `/computer/forwards/${encodeURIComponent(id)}`);\n }\n}\n\n/** A URI carries an invitation, not permanent credentials. Never log it to shared service logs. */\nexport function computerPairingURI(invitation: ComputerInvitation): string {\n // UTF-8/base64url works in browsers too; no Node-only dependency in the protocol layer.\n const bytes = new TextEncoder().encode(JSON.stringify(invitation));\n let binary = \"\";\n for (const byte of bytes) binary += String.fromCharCode(byte);\n const encoded = btoa(binary).replace(/\\+/g, \"-\").replace(/\\//g, \"_\").replace(/=+$/, \"\");\n return `mindwire://pair?v=1#${encoded}`;\n}\n","// Embedded daemon: the default transport. On a server runtime (Node/Bun/Deno) it auto-spawns\n// the bundled `mindwired` binary on a loopback port and hands the SDK its base URL — so\n// `new Mindwire({ agent })` \"just works\" with no server to run. Browsers/edge can't spawn a\n// process, so they must pass `{ baseUrl }` to reach a daemon over HTTP.\nimport { MindwireError } from \"./errors.js\";\nimport { ensureDaemonBinary } from \"./daemon-binary.js\";\n\nexport interface EmbeddedOptions {\n /** Working directory the daemon runs agents in. Defaults to the process cwd. */\n cwd?: string;\n /** Local state file for the embedded daemon. */\n statePath?: string;\n /** Explicit path to the `mindwired` binary (overrides discovery). */\n bin?: string;\n}\n\nexport interface EmbeddedDaemon {\n baseUrl: string;\n token?: string;\n stop(): void;\n}\n\n// Embedded daemons, memoized by config so distinct environments get distinct daemons while identical\n// configs share one. Two zero-config `local()` clients collapse to a single loopback daemon (avoids a\n// double-spawn and a `statePath` collision); a client with its own `cwd`/`statePath`/`bin` gets its\n// own daemon — the mechanism behind \"one instance = one environment; isolate → a new target\".\nconst shared = new Map<string, Promise<EmbeddedDaemon>>();\n\n/** Distinct config ⇒ distinct daemon. `cwd`/`statePath` are the state-affecting knobs; `bin` too. */\nfunction configKey(opts: EmbeddedOptions): string {\n return JSON.stringify([opts.cwd ?? \"\", opts.statePath ?? \"\", opts.bin ?? \"\"]);\n}\n\nexport function startEmbedded(opts: EmbeddedOptions = {}): Promise<EmbeddedDaemon> {\n const key = configKey(opts);\n let daemon = shared.get(key);\n if (!daemon) {\n daemon = spawnDaemon(opts).catch((err) => {\n shared.delete(key); // allow a retry on next call\n throw err;\n });\n shared.set(key, daemon);\n }\n return daemon;\n}\n\nfunction serverRuntime(): typeof globalThis & { process?: any; Bun?: any; Deno?: any } {\n return globalThis as never;\n}\n\nfunction isServerRuntime(): boolean {\n const g = serverRuntime();\n return (\n (typeof g.process !== \"undefined\" && !!g.process.versions?.node) ||\n typeof g.Bun !== \"undefined\" ||\n typeof g.Deno !== \"undefined\"\n );\n}\n\nasync function spawnDaemon(opts: EmbeddedOptions): Promise<EmbeddedDaemon> {\n if (!isServerRuntime()) {\n throw new MindwireError(\n \"MindWire embedded mode needs a server runtime (Node/Bun/Deno). In the browser or an edge runtime, pass { baseUrl } to connect to a running daemon.\",\n );\n }\n\n const { spawn } = await import(\"node:child_process\");\n const net = await import(\"node:net\");\n const proc = serverRuntime().process;\n const { randomBytes } = await import(\"node:crypto\");\n\n const resolved = await resolveBinary(opts.bin);\n const bin = resolved.bin;\n const port = await freePort(net);\n const baseUrl = `http://127.0.0.1:${port}`;\n const token = randomBytes(32).toString(\"hex\");\n\n const child = spawn(bin, [], {\n env: {\n ...proc.env,\n ADDR: `127.0.0.1:${port}`,\n AGENT_CWD: opts.cwd ?? proc.cwd(),\n STATE_PATH: opts.statePath ?? \".mindwire-state.json\",\n DAEMON_TOKEN: token,\n },\n stdio: \"ignore\",\n });\n\n let spawnError: Error | null = null;\n child.on(\"error\", (e: Error) => {\n spawnError = e;\n });\n\n const stop = () => {\n try {\n child.kill();\n } catch {}\n };\n // Best-effort: don't leave the daemon running after the host exits.\n proc.once?.(\"exit\", stop);\n proc.once?.(\"SIGINT\", () => {\n stop();\n proc.exit?.(130);\n });\n\n await waitHealthy(baseUrl, token, () => spawnError, resolved);\n return { baseUrl, token, stop };\n}\n\ninterface ResolvedBinary {\n /** The path (or bare name) we'll hand to spawn(). */\n bin: string;\n /** True if we found the binary on disk; false means we fell back to a bare PATH lookup. */\n found: boolean;\n /** Human-readable list of every location we checked, for a useful not-found error. */\n checked: string[];\n}\n\nasync function resolveBinary(explicit?: string): Promise<ResolvedBinary> {\n const fs = await import(\"node:fs\");\n const path = await import(\"node:path\");\n const proc = serverRuntime().process;\n const ext = proc.platform === \"win32\" ? \".exe\" : \"\";\n const binName = `mindwired${ext}`;\n\n const candidates: string[] = [];\n if (explicit) candidates.push(explicit);\n if (proc.env?.MINDWIRE_DAEMON) candidates.push(proc.env.MINDWIRE_DAEMON);\n\n // Dev / direct bundling: a binary dropped next to the SDK at bin/mindwired-<platform>[.exe].\n try {\n const url = await import(\"node:url\");\n const here = path.dirname(url.fileURLToPath(import.meta.url));\n const named = `mindwired-${proc.platform}-${proc.arch}${ext}`;\n candidates.push(path.join(here, \"bin\", named), path.join(here, \"..\", \"bin\", named));\n } catch {\n // import.meta.url unavailable (e.g. CJS) — skip bundled discovery.\n }\n\n for (const c of candidates) {\n try {\n if (fs.existsSync(c)) return { bin: c, found: true, checked: candidates };\n } catch {}\n }\n const downloaded = await ensureDaemonBinary({ platform: proc.platform, arch: proc.arch });\n return { bin: downloaded, found: true, checked: [...candidates, downloaded] };\n}\n\n// Build the daemon-couldn't-start error. When the binary was never found on disk, enumerate every\n// remedy, including an explicit locally built binary for monorepo development.\nfunction daemonStartError(resolved: ResolvedBinary, cause: Error): string {\n if (!resolved.found) {\n return [\n \"Couldn't start the mindwire daemon: the `mindwired` binary was not found.\",\n `Looked in: ${resolved.checked.join(\", \")}.`,\n \"Fixes:\",\n \" • check GitHub Release access so the SDK can download its matching daemon binary; or\",\n \" • set MINDWIRE_DAEMON to a `mindwired` binary; or\",\n \" • pass { baseUrl } to connect to a daemon you run yourself.\",\n \" • Working inside the mindwire monorepo? Run `go build -o /tmp/mindwired ./daemon/cmd/daemon` and set MINDWIRE_DAEMON.\",\n `(underlying error: ${cause.message})`,\n ].join(\"\\n\");\n }\n return (\n `Couldn't start the mindwire daemon (${resolved.bin}): ${cause.message}. ` +\n \"Set MINDWIRE_DAEMON to the binary path, or pass { baseUrl } to use a running daemon.\"\n );\n}\n\nfunction freePort(net: typeof import(\"node:net\")): Promise<number> {\n return new Promise((resolve, reject) => {\n const srv = net.createServer();\n srv.on(\"error\", reject);\n srv.listen(0, \"127.0.0.1\", () => {\n const addr = srv.address();\n const port = addr && typeof addr === \"object\" ? addr.port : 0;\n srv.close(() => resolve(port));\n });\n });\n}\n\nasync function waitHealthy(\n baseUrl: string,\n token: string,\n getError: () => Error | null,\n resolved: ResolvedBinary,\n timeoutMs = 15000,\n): Promise<void> {\n const deadline = Date.now() + timeoutMs;\n while (Date.now() < deadline) {\n const err = getError();\n if (err) {\n throw new MindwireError(daemonStartError(resolved, err), { cause: err });\n }\n try {\n const res = await fetch(`${baseUrl}/healthz`, { headers: { Authorization: `Bearer ${token}` } });\n if (res.ok) return;\n } catch {\n // not up yet\n }\n await new Promise((r) => setTimeout(r, 150));\n }\n throw new MindwireError(\"mindwire embedded daemon did not become healthy in time.\");\n}\n","// Version-pinned daemon acquisition. The npm package stays TypeScript-only: when a server-side target\n// needs a daemon, it downloads the binary matching this SDK's version from the GitHub Release, verifies\n// the published SHA-256, and caches it outside node_modules for later offline use.\nimport { MindwireError } from \"./errors.js\";\nimport { SDK_VERSION } from \"./version.js\";\n\nexport type DaemonPlatform = \"darwin\" | \"linux\" | \"win32\";\nexport type DaemonArch = \"x64\" | \"arm64\";\n\nexport interface EnsureDaemonBinaryOptions {\n version?: string;\n platform?: DaemonPlatform;\n arch?: DaemonArch;\n cacheDir?: string;\n /** Override for tests or a private GitHub Releases mirror. */\n releaseBaseUrl?: string;\n fetch?: typeof fetch;\n}\n\nfunction supported(platform: string, arch: string): asserts platform is DaemonPlatform & string {\n if (!([\"darwin\", \"linux\", \"win32\"] as string[]).includes(platform) || !([\"x64\", \"arm64\"] as string[]).includes(arch)) {\n throw new MindwireError(`mindwire: no daemon release for ${platform}-${arch}`);\n }\n}\n\nfunction assetName(version: string, platform: DaemonPlatform, arch: DaemonArch): string {\n const releasePlatform = platform === \"win32\" ? \"windows\" : platform;\n const releaseArch = arch === \"x64\" ? \"amd64\" : arch;\n return `mindwired-v${version}-${releasePlatform}-${releaseArch}${platform === \"win32\" ? \".exe\" : \"\"}`;\n}\n\nfunction checksumFor(text: string, asset: string): string | undefined {\n const line = text.split(\"\\n\").find((l) => l.trim().endsWith(` ${asset}`) || l.trim().endsWith(` ${asset}`));\n const hash = line?.trim().split(/\\s+/)[0];\n return hash && /^[a-f0-9]{64}$/i.test(hash) ? hash.toLowerCase() : undefined;\n}\n\n/** Ensure the SDK-matched daemon binary is present locally and return its executable path. */\nexport async function ensureDaemonBinary(opts: EnsureDaemonBinaryOptions = {}): Promise<string> {\n const proc = globalThis as typeof globalThis & { process?: { platform?: string; arch?: string; env?: Record<string, string | undefined> } };\n const platform = opts.platform ?? proc.process?.platform;\n const arch = opts.arch ?? proc.process?.arch;\n supported(platform ?? \"unknown\", arch ?? \"unknown\");\n const daemonPlatform = platform as DaemonPlatform;\n const daemonArch = arch as DaemonArch;\n const version = opts.version ?? SDK_VERSION;\n if (!/^[0-9]+\\.[0-9]+\\.[0-9]+(?:-[0-9A-Za-z.-]+)?$/.test(version)) {\n throw new MindwireError(`mindwire: cannot download daemon for non-release SDK version ${version}`);\n }\n\n const path = await import(\"node:path\");\n const { binaryCacheDirectory, cachedExecutable, cacheExecutable } = await import(\"./binary-cache.js\");\n const dir = path.join(opts.cacheDir ?? await binaryCacheDirectory(daemonPlatform), version, `${daemonPlatform}-${daemonArch}`);\n const asset = assetName(version, daemonPlatform, daemonArch);\n const bin = path.join(dir, asset);\n const cached = await cachedExecutable(bin);\n if (cached) return cached;\n\n const base = (opts.releaseBaseUrl ?? proc.process?.env?.MINDWIRE_RELEASE_BASE_URL ?? \"https://github.com/oblien/mindwire/releases/download\").replace(/\\/$/, \"\");\n const release = `${base}/v${version}`;\n const request = opts.fetch ?? globalThis.fetch;\n if (!request) throw new MindwireError(\"mindwire: fetch is unavailable; set daemonBin or MINDWIRE_DAEMON\");\n const [checksums, binary] = await Promise.all([request(`${release}/checksums.txt`), request(`${release}/${asset}`)]);\n if (!checksums.ok || !binary.ok) {\n // A just-published SDK can briefly precede its matching Release asset. For the public release\n // endpoint only, recover to GitHub's latest stable release; mirrors must be explicit and exact.\n if (!opts.releaseBaseUrl && !proc.process?.env?.MINDWIRE_RELEASE_BASE_URL) {\n const latest = await request(\"https://api.github.com/repos/oblien/mindwire/releases/latest\");\n if (latest.ok) {\n const tag = (await latest.json() as { tag_name?: unknown }).tag_name;\n const fallback = typeof tag === \"string\" ? tag.replace(/^v/, \"\") : \"\";\n if (/^[0-9]+\\.[0-9]+\\.[0-9]+(?:-[0-9A-Za-z.-]+)?$/.test(fallback) && fallback !== version) {\n return ensureDaemonBinary({ ...opts, version: fallback });\n }\n }\n }\n throw new MindwireError(`mindwire: failed to download daemon v${version} for ${daemonPlatform}-${daemonArch}`);\n }\n const expected = checksumFor(await checksums.text(), asset);\n if (!expected) throw new MindwireError(`mindwire: release v${version} has no checksum for ${asset}`);\n const bytes = new Uint8Array(await binary.arrayBuffer());\n return cacheExecutable(bin, bytes, expected);\n}\n","// The SDK's own version, replaced at build time by tsup's `define` (see tsup.config.ts) with the\n// literal from package.json. This is also the version of the bundled Linux daemon binary\n// (build-daemon.mjs stamps the per-arch daemon packages to the same version), so a sandbox adapter\n// can compare it against a running daemon's `/healthz` version to decide whether to (re)deploy.\n//\n// The `typeof` guard keeps this importable in dev/test where the define isn't applied (raw `tsc`,\n// `bun test`) — it falls back to a sentinel instead of throwing on an undefined identifier.\ndeclare const __MINDWIRE_VERSION__: string;\n\nexport const SDK_VERSION: string =\n typeof __MINDWIRE_VERSION__ !== \"undefined\" ? __MINDWIRE_VERSION__ : \"0.0.0-dev\";\n","// The unified destination seam. A **target** is *where the mindwire daemon runs and how the SDK\n// reaches it* — the single axis that used to be three unrelated constructor branches (embedded /\n// remote / sandbox). Every destination is a {@link Target} factory: `local()` (the zero-config\n// default), `remote()`, `ssh()`, `docker()`, `oblien()`, or your own object implementing {@link Target}.\n//\n// A `Target`'s `connect()` does two things: **ensure the daemon** at the destination and return\n// **how to contact it** as a {@link TargetHandle}. The `Http` layer consumes exactly that: a resolved\n// base that may carry a transport-specific `fetch` (used for both unary and SSE), a rotating\n// `getToken`, and per-request `headers` (see http.ts). Nothing in `http.ts` changes to add a backend.\nimport type { FetchLike, TokenGetter } from \"../http.js\";\nimport { startEmbedded, type EmbeddedOptions } from \"../embedded.js\";\nimport type { EnsureEvent } from \"./host.js\";\n\n/**\n * What `connect()` is told about the turn's context. Provisioning knobs (image, port, credentials, …)\n * live on each factory's own config — this is only the client-level context every target shares.\n */\nexport interface ConnectSpec {\n /** The client's default agent, used as the in-daemon `AGENT_TYPE` when the target provisions one. */\n agent?: string;\n /** Receives an {@link EnsureEvent} at each provisioning phase (wired from the client `logger`). */\n onLog?: (e: EnsureEvent) => void;\n}\n\n/**\n * A live transport descriptor a target returns from {@link Target.connect} — everything the SDK's\n * `Http` layer needs to reach the daemon at this destination.\n */\nexport interface TargetHandle {\n /** Stable id of the destination this handle drives (for logging / reuse). */\n id: string;\n /** Base URL for the daemon. With a custom `fetch`, this may be a sentinel the fetch strips. */\n baseUrl: string;\n /**\n * A transport-specific `fetch` for this destination — used for both unary requests and SSE streams.\n * A target supplies it to route every call through its runtime (e.g. Oblien's `rt.proxy`); a\n * direct-HTTP destination (loopback, a published Docker port, an SSH tunnel) omits it and the\n * client's default fetch is used.\n */\n fetch?: FetchLike;\n /** Per-request headers this transport must send (e.g. a proxy-target port). */\n headers?: Record<string, string>;\n /** A static bearer token, if the destination uses one. */\n token?: string;\n /** Fetch the current bearer for a rotating credential; re-mints on `{force:true}`. */\n getToken?: TokenGetter;\n /** Release destination-owned resources (per the factory's `stopOnExit`). Idempotent. */\n stop(): Promise<void>;\n}\n\n/**\n * A destination for the mindwire daemon. Given a {@link ConnectSpec}, provision (or reuse) the\n * environment, ensure a reachable daemon, and return a {@link TargetHandle}. The built-ins are\n * {@link local} / {@link remote} (here) and {@link import(\"./ssh.js\").ssh} /\n * {@link import(\"./docker.js\").docker} / {@link import(\"./oblien.js\").oblien}; a custom backend is\n * just another object with this shape.\n */\nexport interface Target {\n /** Destination id, e.g. `\"local\"` / `\"remote\"` / `\"ssh\"` / `\"docker\"` / `\"oblien\"`. */\n readonly name: string;\n connect(spec: ConnectSpec): Promise<TargetHandle>;\n}\n\n/** Emit one {@link EnsureEvent}, tolerating a throwing logger (see host.ts Risk 8). */\nfunction emit(spec: ConnectSpec, e: EnsureEvent): void {\n if (!spec.onLog) return;\n try {\n spec.onLog(e);\n } catch {\n // A user logger must not be able to break connect().\n }\n}\n\n/**\n * The default destination: an **embedded** daemon on loopback. On a server runtime (Node/Bun/Deno)\n * `connect()` auto-spawns the bundled `mindwired` on a free `127.0.0.1` port and points the SDK at it,\n * so `new Mindwire()` \"just works\" with nothing to deploy.\n *\n * Embedded daemons are memoized by config (see embedded.ts): two zero-config `local()` clients share\n * one loopback daemon (one environment), while `local({ cwd })` / `local({ statePath })` isolate into\n * their own. `stop()` is a **no-op** — the shared daemon is reaped on process exit (Risk 5).\n */\nexport function local(opts: EmbeddedOptions = {}): Target {\n return {\n name: \"local\",\n async connect(spec) {\n const d = await startEmbedded(opts);\n emit(spec, { target: \"local\", phase: \"ready\", message: `embedded daemon on ${d.baseUrl}` });\n return {\n id: d.baseUrl,\n baseUrl: d.baseUrl,\n ...(d.token !== undefined ? { token: d.token } : {}),\n // No-op: the embedded daemon is shared (keyed memoization) and reaped on process exit.\n stop: async () => {},\n };\n },\n };\n}\n\n/** Options for {@link remote}. */\nexport interface RemoteOptions {\n /** Bearer token for the daemon, if it requires one. */\n token?: string;\n /** Extra headers merged into every request. */\n headers?: Record<string, string>;\n /** Custom fetch for this destination (else the client default / global fetch). */\n fetch?: FetchLike;\n}\n\n/**\n * A **remote** daemon you already run, reached over plain HTTP at `baseUrl`. `connect()` returns the\n * transport immediately without a network round-trip — there is no ensure/probe here; `mw.health()`\n * is the real liveness check (Risk 6). Required in the browser / edge runtimes, where a daemon can't\n * be spawned. `stop()` is a no-op (mindwire doesn't own a daemon it didn't start).\n */\nexport function remote(baseUrl: string, opts: RemoteOptions = {}): Target {\n return {\n name: \"remote\",\n async connect(spec) {\n emit(spec, { target: \"remote\", phase: \"skip\", message: `using remote daemon at ${baseUrl}` });\n return {\n id: baseUrl,\n baseUrl,\n ...(opts.token !== undefined ? { token: opts.token } : {}),\n ...(opts.headers !== undefined ? { headers: opts.headers } : {}),\n ...(opts.fetch !== undefined ? { fetch: opts.fetch } : {}),\n stop: async () => {},\n };\n },\n };\n}\n","import { Http, type FetchLike } from \"./http.js\";\nimport { readSSE } from \"./sse.js\";\nimport { Run } from \"./run.js\";\nimport { WorkspaceApi, type ProjectAuth } from \"./workspace.js\";\nimport { SurfacesApi } from \"./surfaces.js\";\nimport { ServiceApi } from \"./service.js\";\nimport { ExecutionApi } from \"./execution.js\";\nimport { ComputerApi } from \"./computer.js\";\nimport { local, type Target, type TargetHandle, type ConnectSpec } from \"./target/index.js\";\nimport type { EnsureEvent } from \"./target/host.js\";\nimport type {\n AgentInfo,\n AuthMethod,\n AuthState,\n AuthStatus,\n Catalog,\n ChatSummary,\n CustomProvider,\n DeleteResult,\n DoctorReport,\n Health,\n MCPServer,\n MemoryDoc,\n MemoryScope,\n Message,\n ModelInfo,\n Notification,\n NotifyChannel,\n NotifyChannelInput,\n NotifyChannelTestResult,\n NotifyConfigInput,\n NotifyConfigStatus,\n NotifyRule,\n NotifyRuleInput,\n ProcessFrame,\n PromptTemplate,\n ResolveOptions,\n Run as RunData,\n SetupStatus,\n HarnessSoftware,\n Stats,\n Subagent,\n TurnOptions,\n} from \"./types.js\";\n\nexport interface MindwireOptions {\n /**\n * Default agent type for agent-scoped calls (e.g. `\"claude-code\"`). When omitted, the daemon\n * uses its own default. Override per call with the `agent` option, or scope a whole client\n * with {@link Mindwire.withAgent}.\n */\n agent?: string;\n /**\n * **Where the daemon runs and how the SDK reaches it.** A {@link Target} factory: {@link local}\n * (the default — an embedded loopback daemon, auto-spawned on a server runtime), {@link remote}\n * (a daemon you already run, required in the browser), or {@link import(\"./target/ssh.js\").ssh} /\n * {@link import(\"./target/docker.js\").docker} / {@link import(\"./target/oblien.js\").oblien} — or any\n * object implementing `Target`. One `new Mindwire` = one target = one daemon = one environment; to\n * isolate agents, create another `Mindwire` with its own target. Omit for the zero-config default.\n */\n target?: Target;\n /**\n * Receives a step {@link EnsureEvent} while a target provisions (connect → probe → upload → launch →\n * ready, or skip). Handy to surface the seconds-long \"upload the daemon + launch + health-poll\" of a\n * fresh SSH/Docker/Oblien box. A throwing callback can't abort provisioning.\n */\n logger?: (e: EnsureEvent) => void;\n /** Custom fetch. Defaults to the global `fetch` (Node 18+, Bun, Deno, browsers). */\n fetch?: FetchLike;\n /** Extra headers merged into every request. */\n headers?: Record<string, string>;\n /**\n * Deadline in milliseconds for a single unary request (health, config, `turn` creation, memory,\n * …). Guards against a hung daemon or a dead tunnel blocking a call forever — on expiry the call\n * rejects with {@link import(\"./errors.js\").TimeoutError}. Does **not** apply to the event stream,\n * which is long-lived. Defaults to 120000; pass `0` to disable.\n */\n requestTimeoutMs?: number;\n}\n\n// Reaps the destination behind a transport exactly once, keyed by the shared Http so any\n// `withAgent()` clone can `close()` it. `local`/`remote` handles have no-op `stop()`.\nconst handleByTransport = new WeakMap<Http, Promise<TargetHandle>>();\n\n/** Options accepted by any agent-scoped method to override the client's default agent. */\nexport interface AgentScoped {\n agent?: string;\n}\n\n/**\n * The mindwire client — one typed surface over the daemon, regardless of which coding-agent\n * harness runs behind `?agent=<type>`.\n *\n * **Where** it runs is one option — `target`. By default it's an **embedded** daemon\n * ({@link local}): on a server runtime it auto-spawns the bundled `mindwired` on loopback, so there's\n * nothing to deploy. Point elsewhere with {@link remote} (a daemon you run; also required in the\n * browser), {@link import(\"./target/ssh.js\").ssh}, {@link import(\"./target/docker.js\").docker}, or\n * {@link import(\"./target/oblien.js\").oblien}. One client = one target = one daemon = one environment.\n *\n * ```ts\n * // Local embedded (default) — Node/Bun/Deno:\n * const mw = new Mindwire({ agent: \"claude-code\" });\n *\n * // Remote — or in the browser:\n * const mw = new Mindwire({ target: remote(\"https://mindwire.yourco.com\", { token }) });\n *\n * // A fresh box over SSH, watching it provision:\n * const mw = new Mindwire({ target: ssh({ host, username: \"root\" }), logger: (e) => console.log(e.phase, e.message) });\n * await mw.ensure();\n *\n * const run = await mw.turn({ chatId: \"c1\", message: \"add a health check\" });\n * for await (const ev of run) console.log(ev.type, ev.text ?? \"\");\n * ```\n */\nexport class Mindwire {\n /** Workspace registry: saved agent profiles, projects and chat relationships. */\n readonly workspace: WorkspaceApi;\n readonly surfaces: SurfacesApi;\n readonly service: ServiceApi;\n readonly execution: ExecutionApi;\n readonly computer: ComputerApi;\n readonly http: Http;\n /** The default agent type applied to agent-scoped calls, if set. */\n readonly defaultAgent: string | undefined;\n /** Step-flow auth, scoped to this client's default agent (override per call). */\n readonly auth: AuthApi;\n /** Persistent memory files + saved prompt templates, scoped to this client's default agent. */\n readonly prompts: PromptsApi;\n /** Persistent MCP-server config (the config an agent loads every run), scoped to this client's default agent. */\n readonly mcp: McpApi;\n /** Custom LLM-provider registration (opencode/Codex native config), scoped to this client's default agent. */\n readonly providers: ProvidersApi;\n /** Daemon-driven notification channels + routing rules (webhook/slack/discord/telegram; per-agent/session/global). */\n readonly notify: NotifyApi;\n\n constructor(opts: MindwireOptions = {}) {\n // One path for every destination. The target's `connect()` — called once, memoized by `Http` —\n // provisions the daemon (spawn embedded / connect SSH+Docker+Oblien / nothing for remote) and\n // returns how to reach it: a base URL plus an optional transport `fetch`, rotating `getToken`, and\n // per-request `headers`. The handle is stashed so `close()` can reap it once across `withAgent()`.\n const target = opts.target ?? local();\n const spec: ConnectSpec = { agent: opts.agent, onLog: opts.logger };\n this.http = new Http({\n fetch: opts.fetch,\n headers: opts.headers,\n timeoutMs: opts.requestTimeoutMs,\n resolveBase: () => {\n const h = target.connect(spec);\n handleByTransport.set(this.http, h);\n return h.then((x) => ({\n baseUrl: x.baseUrl,\n token: x.token,\n getToken: x.getToken,\n headers: x.headers,\n fetch: x.fetch,\n }));\n },\n });\n this.defaultAgent = opts.agent;\n this.workspace = new WorkspaceApi(this);\n this.surfaces = new SurfacesApi(this);\n this.service = new ServiceApi(this);\n this.execution = new ExecutionApi(this);\n this.computer = new ComputerApi(this);\n this.auth = new AuthApi(this);\n this.prompts = new PromptsApi(this);\n this.mcp = new McpApi(this);\n this.providers = new ProvidersApi(this);\n this.notify = new NotifyApi(this);\n }\n\n /**\n * Provision the destination and await readiness **now**, rather than lazily on the first request —\n * useful to front-load a fresh SSH/Docker/Oblien box (and to stream its {@link EnsureEvent}s to the\n * `logger`) before the first `turn()`. Idempotent and memoized: repeated `ensure()` calls, and the\n * first real request, all await the same provisioning, so the target connects exactly once.\n */\n async ensure(): Promise<void> {\n await this.http.ready();\n }\n\n /** Return a new client bound to a different default agent (shares the same transport config). */\n withAgent(agent: string): Mindwire {\n const clone = Object.create(Mindwire.prototype) as Mutable<Mindwire>;\n clone.http = this.http;\n clone.defaultAgent = agent;\n clone.workspace = new WorkspaceApi(clone as Mindwire);\n clone.surfaces = new SurfacesApi(clone as Mindwire);\n clone.service = new ServiceApi(clone as Mindwire);\n clone.execution = new ExecutionApi(clone as Mindwire);\n clone.computer = new ComputerApi(clone as Mindwire);\n clone.auth = new AuthApi(clone as Mindwire);\n clone.prompts = new PromptsApi(clone as Mindwire);\n clone.mcp = new McpApi(clone as Mindwire);\n clone.providers = new ProvidersApi(clone as Mindwire);\n clone.notify = new NotifyApi(clone as Mindwire);\n return clone as Mindwire;\n }\n\n /** The `?agent=` value to send for a scoped call: explicit override → client default → none. */\n agentParam(scoped?: AgentScoped): { agent: string } | undefined {\n const a = scoped?.agent ?? this.defaultAgent;\n return a ? { agent: a } : undefined;\n }\n\n /**\n * Release target-owned resources by calling the {@link TargetHandle}'s `stop()` — once, even across\n * {@link withAgent} clones that share the transport. For an `ssh`/`docker`/`oblien` target this reaps\n * the box (tear down the tunnel, stop or delete the container/workspace, per `stopOnExit`); a no-op\n * for `local`/`remote` (embedded self-cleans on process exit; remote is not ours to stop). Safe to\n * call before the target has connected (nothing to reap yet).\n */\n async close(): Promise<void> {\n const handle = handleByTransport.get(this.http);\n if (!handle) return;\n handleByTransport.delete(this.http);\n const h = await handle.catch(() => null);\n if (h) await h.stop();\n }\n\n // ---- health & catalog ----------------------------------------------------\n\n /** `GET /healthz` — authenticated liveness check. Resolves with the daemon's health payload when it is up. */\n health(): Promise<Health> {\n return this.http.request<Health>(\"GET\", \"/healthz\");\n }\n\n /**\n * `GET /stats` — the daemon **process's** resource snapshot (heap in use, memory reserved from the\n * OS, goroutines, GC cycles, cores, platform, uptime). Cheap enough to call on demand — the daemon\n * reads its own Go runtime, not the machine — so a UI can fetch it when a user opens a daemon's page\n * without any background polling. See {@link Stats} for what each field means and doesn't.\n */\n stats(): Promise<Stats> {\n return this.http.request<Stats>(\"GET\", \"/stats\");\n }\n\n /** `GET /catalog` — every agent this daemon binary supports. */\n catalog(): Promise<Catalog> {\n return this.http.request<Catalog>(\"GET\", \"/catalog\");\n }\n\n /** `GET /agent` — capabilities + settings schema + auth methods/status for the selected agent. */\n agent(scoped?: AgentScoped): Promise<AgentInfo> {\n return this.http.request<AgentInfo>(\"GET\", \"/agent\", { query: this.agentParam(scoped) });\n }\n\n /** `GET /agent/software` — installed version, compatibility and approved update target. */\n software(opts: AgentScoped & { refresh?: boolean } = {}): Promise<HarnessSoftware> {\n return this.http.request<HarnessSoftware>(\"GET\", \"/agent/software\", {\n query: { ...this.agentParam(opts), ...(opts.refresh ? { refresh: \"true\" } : {}) },\n });\n }\n\n /**\n * `GET /models` — the models the selected agent can run for the configured account. An empty array\n * is valid (no credentials yet / offline). Throws a 400 {@link ApiError} for an agent whose model is\n * free text (check `capabilities.models` first).\n */\n models(scoped?: AgentScoped): Promise<ModelInfo[]> {\n return this.http.request<ModelInfo[]>(\"GET\", \"/models\", { query: this.agentParam(scoped) });\n }\n\n /** `GET /doctor` — daemon-level health plus the selected agent's own checks. */\n doctor(scoped?: AgentScoped): Promise<DoctorReport> {\n return this.http.request<DoctorReport>(\"GET\", \"/doctor\", { query: this.agentParam(scoped) });\n }\n\n // ---- toolchain setup -----------------------------------------------------\n\n /** `POST /setup` — start the agent's install toolchain (background; poll {@link setupStatus}). */\n setup(scoped?: AgentScoped): Promise<SetupStatus> {\n return this.http.request<SetupStatus>(\"POST\", \"/setup\", { query: this.agentParam(scoped) });\n }\n\n /** `POST /update` — install the catalog's newest tested version compatible with this daemon. */\n update(scoped?: AgentScoped): Promise<SetupStatus> {\n return this.http.request<SetupStatus>(\"POST\", \"/update\", { query: this.agentParam(scoped) });\n }\n\n /** `GET /setup` — current toolchain install progress. */\n setupStatus(scoped?: AgentScoped): Promise<SetupStatus> {\n return this.http.request<SetupStatus>(\"GET\", \"/setup\", { query: this.agentParam(scoped) });\n }\n\n // ---- config --------------------------------------------------------------\n\n /** `GET /config` — the declared, non-secret settings for the agent. */\n getConfig(scoped?: AgentScoped): Promise<Record<string, string>> {\n return this.http.request<Record<string, string>>(\"GET\", \"/config\", {\n query: this.agentParam(scoped),\n });\n }\n\n /** `PUT /config` — merge recognized (non-secret) setting keys. Unknown keys are ignored server-side. */\n async setConfig(values: Record<string, string>, scoped?: AgentScoped): Promise<void> {\n await this.http.request<void>(\"PUT\", \"/config\", {\n query: this.agentParam(scoped),\n body: values,\n });\n }\n\n // ---- chats & history -----------------------------------------------------\n\n /** `GET /chats` — recorded chats (newest first), shared across agents. */\n chats(): Promise<ChatSummary[]> {\n return this.http.request<ChatSummary[]>(\"GET\", \"/chats\");\n }\n\n /**\n * `PUT /chats/{id}` — rename a chat. The user title wins over the agent's native auto-title in\n * every listing; an empty title clears the rename (reverting to the native/derived title).\n * Returns the updated summary.\n */\n renameChat(chatId: string, title: string): Promise<ChatSummary> {\n return this.http.request<ChatSummary>(\"PUT\", `/chats/${encodeURIComponent(chatId)}`, {\n body: { title },\n });\n }\n\n /**\n * `DELETE /chats/{id}` — a true, irreversible delete: purges ALL of the chat's mindwire\n * bookkeeping and, for every session the chat mapped to, removes that agent's native transcript\n * (the source of truth). Rejects with a 409 error if a turn is live. Native deletion is\n * best-effort per agent; the result reports what was purged vs. failed.\n */\n deleteChat(chatId: string): Promise<DeleteResult> {\n return this.http.request<DeleteResult>(\"DELETE\", `/chats/${encodeURIComponent(chatId)}`);\n }\n\n /**\n * `POST /chats/{id}/fork` — clone a chat into a new id (generated when `newChatId` is omitted).\n * The fork shares the source's native session until its first turn, which branches it (natively\n * on Claude via `--fork-session`; a fresh session on agents without native fork). Rejects with a\n * 409 if the source has a live turn, 404 if the source is unknown, 400 if the target id is in\n * use. Returns the new chat's summary.\n */\n forkChat(chatId: string, opts: { newChatId?: string } = {}): Promise<ChatSummary> {\n return this.http.request<ChatSummary>(\"POST\", `/chats/${encodeURIComponent(chatId)}/fork`, {\n body: opts.newChatId ? { newChatId: opts.newChatId } : {},\n });\n }\n\n /**\n * `GET /chats/{id}/messages` — a chat's transcript (native when the agent supports it, else\n * the recorded fallback). `limit` caps to the newest N; `before` pages older history.\n */\n messages(\n chatId: string,\n opts: AgentScoped & { limit?: number; before?: string } = {},\n ): Promise<Message[]> {\n const query: Record<string, string | number | undefined> = { ...this.agentParam(opts) };\n if (opts.limit !== undefined) query[\"limit\"] = opts.limit;\n if (opts.before !== undefined) query[\"before\"] = opts.before;\n return this.http.request<Message[]>(\"GET\", `/chats/${encodeURIComponent(chatId)}/messages`, {\n query,\n });\n }\n\n /** `GET /chats/{id}/run` — the latest run for a chat (reattach anchor), or `null` if none yet. */\n async latestRun(chatId: string): Promise<Run | null> {\n const data = await this.http.request<RunData | undefined>(\n \"GET\",\n `/chats/${encodeURIComponent(chatId)}/run`,\n );\n return data ? new Run(this.http, data) : null;\n }\n\n // ---- turns & runs --------------------------------------------------------\n\n /**\n * `POST /turns` — start a turn. Returns a {@link Run} handle you can stream, cancel, or await.\n * Rejects with an {@link ApiError} (409) if a turn is already running for the chat.\n *\n * `mode` defaults to `\"turn\"` — one agent turn that ends when the CLI settles. Pass\n * `mode: \"resolve\"` (with optional {@link ResolveOptions} `resolve` caps) for a global-resolve run\n * that auto-continues the agent's multi-step work until it's done; {@link Mindwire.resolve} is the\n * clearer entry point for that. The returned {@link Run} is then the parent of the run tree.\n */\n async turn(\n input: {\n chatId: string;\n message: string;\n cwd?: string;\n options?: TurnOptions;\n mode?: \"turn\" | \"resolve\";\n resolve?: ResolveOptions;\n gitAuth?: ProjectAuth;\n } & AgentScoped,\n ): Promise<Run> {\n const body: {\n chatId: string;\n message: string;\n cwd?: string;\n options?: TurnOptions;\n mode?: \"turn\" | \"resolve\";\n resolve?: ResolveOptions;\n gitAuth?: ProjectAuth;\n } = {\n chatId: input.chatId,\n message: input.message,\n };\n if (input.cwd !== undefined) body.cwd = input.cwd;\n if (input.options !== undefined) body.options = input.options;\n if (input.mode !== undefined) body.mode = input.mode;\n if (input.resolve !== undefined) body.resolve = input.resolve;\n if (input.gitAuth !== undefined) body.gitAuth = input.gitAuth;\n const data = await this.http.request<RunData>(\"POST\", \"/turns\", {\n query: this.agentParam(input),\n body,\n });\n return new Run(this.http, data);\n }\n\n /**\n * `POST /turns {mode:\"resolve\"}` — start a **global-resolve** run: instead of returning after one\n * turn, the daemon holds the task open and auto-continues the agent (resuming on continuable stops\n * and probing for completion) until the work is globally resolved, then aggregates one final result.\n *\n * The returned {@link Run} is the **parent** of a run tree: each auto-continued iteration is a child\n * turn ({@link Run.children}) whose events stream onto the parent's topic, delimited by `continuation`\n * boundary events. `run.wait()` resolves once with the aggregated result; `run.stopReason` /\n * `run.iterations` report how the loop ended. Resolve turns run unattended (no mid-turn approvals)\n * and are bounded by {@link ResolveOptions} caps — see the resolve guide. Rejects with an\n * {@link ApiError} (409) if a turn is already running for the chat.\n */\n async resolve(\n input: {\n chatId: string;\n message: string;\n cwd?: string;\n options?: TurnOptions;\n resolve?: ResolveOptions;\n gitAuth?: ProjectAuth;\n } & AgentScoped,\n ): Promise<Run> {\n return this.turn({ ...input, mode: \"resolve\" });\n }\n\n /** `GET /runs/{id}` — fetch an existing run as a {@link Run} handle. */\n async run(id: string): Promise<Run> {\n const data = await this.http.request<RunData>(\"GET\", `/runs/${encodeURIComponent(id)}`);\n return new Run(this.http, data);\n }\n\n /**\n * `POST /chats/{id}/compact` — run an on-demand conversation compaction as a first-class {@link Run}\n * you can stream or await. The agent folds prior context into a summary it carries forward, emitting\n * a `compaction` event on the stream and recording the boundary in history exactly like an\n * auto-compaction. Optional `instructions` focus the continuation summary (Claude's\n * `/compact <instructions>`; agents that don't honor focus still compact). Rejects with an\n * {@link ApiError}: 400 if the agent doesn't support compaction (`capabilities.compactNow`) or the\n * chat has no conversation yet, 409 if a turn is already running for the chat.\n */\n async compact(chatId: string, opts: { instructions?: string } & AgentScoped = {}): Promise<Run> {\n const data = await this.http.request<RunData>(\n \"POST\",\n `/chats/${encodeURIComponent(chatId)}/compact`,\n {\n query: this.agentParam(opts),\n body: opts.instructions ? { instructions: opts.instructions } : {},\n },\n );\n return new Run(this.http, data);\n }\n\n // ---- notifications -------------------------------------------------------\n\n /** `GET /notify/config` — whether a notification channel is wired (token never returned). */\n getNotifyConfig(): Promise<NotifyConfigStatus> {\n return this.http.request<NotifyConfigStatus>(\"GET\", \"/notify/config\");\n }\n\n /** `PUT /notify/config` — store the provisioned notification channel (daemon-wide). */\n async setNotifyConfig(input: NotifyConfigInput): Promise<void> {\n await this.http.request<void>(\"PUT\", \"/notify/config\", { body: input });\n }\n\n /** `GET /notify/stream` — SSE feed of the daemon's notifications (replay, then live). */\n async *notifications(opts: { signal?: AbortSignal } = {}): AsyncGenerator<Notification> {\n const res = await this.http.open(\"GET\", \"/notify/stream\", {\n ...(opts.signal ? { signal: opts.signal } : {}),\n });\n yield* readSSE<Notification>(res.body!, opts.signal);\n }\n\n // ---- live resources ------------------------------------------------------\n\n /**\n * `GET /processes/stream` — SSE feed of live per-turn CPU/memory, one {@link ProcessFrame} per tick.\n * Sampling is **on demand**: the daemon starts measuring only while a client is connected and stops\n * the instant the last one disconnects, so aborting the `signal` (or ending the loop) tells the\n * daemon to stop — no background work, no leak. Pass `agent` to filter each frame's samples to one\n * agent type. Frames are live snapshots (no replay); an empty `samples` array is a valid keep-alive.\n */\n async *processes(\n opts: { agent?: string; signal?: AbortSignal } = {},\n ): AsyncGenerator<ProcessFrame> {\n const path =\n \"/processes/stream\" +\n (opts.agent ? `?agent=${encodeURIComponent(opts.agent)}` : \"\");\n const res = await this.http.open(\"GET\", path, {\n ...(opts.signal ? { signal: opts.signal } : {}),\n });\n yield* readSSE<ProcessFrame>(res.body!, opts.signal);\n }\n}\n\n/** Step-flow auth (`methods → begin → step → status`) for a scoped agent. */\nexport class AuthApi {\n constructor(private readonly mw: Mindwire) {}\n\n /** `GET /auth/methods` — the options list to present. */\n methods(scoped?: AgentScoped): Promise<AuthMethod[]> {\n return this.mw.http.request<AuthMethod[]>(\"GET\", \"/auth/methods\", {\n query: this.mw.agentParam(scoped),\n });\n }\n\n /** `POST /auth/begin` — start one method (may return `{ url, code, fields, pending }`). */\n begin(method: string, scoped?: AgentScoped): Promise<AuthState> {\n return this.mw.http.request<AuthState>(\"POST\", \"/auth/begin\", {\n query: this.mw.agentParam(scoped),\n body: { method },\n });\n }\n\n /** `POST /auth/step` — submit fields, or poll an interactive login to completion. */\n step(input: Record<string, string>, scoped?: AgentScoped): Promise<AuthState> {\n return this.mw.http.request<AuthState>(\"POST\", \"/auth/step\", {\n query: this.mw.agentParam(scoped),\n body: input,\n });\n }\n\n /** Read one interactive attempt, scoped by the returned AuthState.flowId. */\n poll(flowId: string, scoped?: AgentScoped): Promise<AuthState> {\n return this.step({ _flowId: flowId }, scoped);\n }\n\n /** Cancel this native login without affecting a newer sign-in attempt. */\n cancel(flowId: string, scoped?: AgentScoped): Promise<AuthState> {\n return this.step({ _flowId: flowId, _action: \"cancel\" }, scoped);\n }\n\n /** `GET /auth/status` — is the agent authenticated, and via which method. */\n status(scoped?: AgentScoped): Promise<AuthStatus> {\n return this.mw.http.request<AuthStatus>(\"GET\", \"/auth/status\", {\n query: this.mw.agentParam(scoped),\n });\n }\n\n /** `POST /auth/logout` — disconnect this harness once its running chats finish. */\n logout(scoped?: AgentScoped): Promise<AuthStatus> {\n return this.mw.http.request<AuthStatus>(\"POST\", \"/auth/logout\", {\n query: this.mw.agentParam(scoped),\n });\n }\n}\n\n/**\n * The persistent prompt/memory surface for a scoped agent — the three layers beneath a turn's\n * per-turn `systemPrompt`: the agent's **memory file** (`CLAUDE.md` / `AGENTS.md`) and its saved\n * **prompt templates** (slash-commands / saved prompts). One shape regardless of which agent runs;\n * a call 400s if the selected agent doesn't support the layer.\n *\n * `dir` selects the project-scope working directory (defaults to the daemon cwd); `scope` picks\n * `project` vs `user` (the agent's home config dir). Only agents whose `Capabilities.memory` /\n * `Capabilities.promptTemplates` is set expose these — read that first to decide what to render.\n */\nexport class PromptsApi {\n constructor(private readonly mw: Mindwire) {}\n\n private query(scoped: AgentScoped | undefined, extra?: Record<string, string | undefined>) {\n return { ...this.mw.agentParam(scoped), ...extra };\n }\n\n /**\n * `GET /memory` — the agent's memory file at every supported scope (project + user for both\n * Claude and Codex). Each entry carries the resolved `path` and `exists`; `content` is `\"\"` for\n * an absent file.\n */\n memory(opts: AgentScoped & { dir?: string } = {}): Promise<MemoryDoc[]> {\n return this.mw.http.request<MemoryDoc[]>(\"GET\", \"/memory\", {\n query: this.query(opts, { dir: opts.dir }),\n });\n }\n\n /** `PUT /memory` — write the memory file at `scope`. Returns the resulting {@link MemoryDoc}. */\n setMemory(\n input: { scope: MemoryScope; content: string },\n opts: AgentScoped & { dir?: string } = {},\n ): Promise<MemoryDoc> {\n return this.mw.http.request<MemoryDoc>(\"PUT\", \"/memory\", {\n query: this.query(opts, { dir: opts.dir }),\n body: input,\n });\n }\n\n /**\n * `DELETE /memory` — remove the memory file at `scope` (defaults to `user`). Returns the resulting\n * {@link MemoryDoc} (`exists: false` at the resolved path). Idempotent: deleting an absent file still\n * succeeds.\n */\n deleteMemory(opts: AgentScoped & { scope?: MemoryScope; dir?: string } = {}): Promise<MemoryDoc> {\n return this.mw.http.request<MemoryDoc>(\"DELETE\", \"/memory\", {\n query: this.query(opts, { scope: opts.scope, dir: opts.dir }),\n });\n }\n\n /**\n * `GET /prompts` — saved prompt templates across every supported scope (Claude: project + user;\n * Codex: user only). `content` is omitted here; fetch it with {@link get}. A missing project\n * directory yields an empty list for that scope rather than an error.\n */\n list(opts: AgentScoped & { dir?: string } = {}): Promise<PromptTemplate[]> {\n return this.mw.http.request<PromptTemplate[]>(\"GET\", \"/prompts\", {\n query: this.query(opts, { dir: opts.dir }),\n });\n }\n\n /** `GET /prompts/{name}` — one template's full body. Rejects with a 404 `ApiError` if absent. */\n get(name: string, opts: AgentScoped & { scope?: MemoryScope; dir?: string } = {}): Promise<PromptTemplate> {\n return this.mw.http.request<PromptTemplate>(\"GET\", `/prompts/${encodeURIComponent(name)}`, {\n query: this.query(opts, { scope: opts.scope, dir: opts.dir }),\n });\n }\n\n /** `PUT /prompts/{name}` — create or overwrite a template. Returns the resulting {@link PromptTemplate}. */\n set(\n name: string,\n content: string,\n opts: AgentScoped & { scope?: MemoryScope; dir?: string } = {},\n ): Promise<PromptTemplate> {\n return this.mw.http.request<PromptTemplate>(\"PUT\", `/prompts/${encodeURIComponent(name)}`, {\n query: this.query(opts, { scope: opts.scope, dir: opts.dir }),\n body: { content },\n });\n }\n\n /**\n * `DELETE /prompts/{name}` — remove one template at `scope` (defaults to `user`). Idempotent:\n * deleting an absent template still succeeds. A traversal name rejects with a 400 `ApiError`.\n */\n async delete(name: string, opts: AgentScoped & { scope?: MemoryScope; dir?: string } = {}): Promise<void> {\n await this.mw.http.request<{ deleted: boolean }>(\"DELETE\", `/prompts/${encodeURIComponent(name)}`, {\n query: this.query(opts, { scope: opts.scope, dir: opts.dir }),\n });\n }\n\n /**\n * `GET /subagents` — persistent subagent definitions (Claude `.claude/agents/*.md`) across every\n * supported scope. `content` is omitted here (fetch it with {@link subagent}); `meta` is the parsed\n * frontmatter view. Rejects with a 400 `ApiError` on an agent without the subagent-definition module.\n * Distinct from a turn's per-turn `subagents` passthrough — this is the on-disk definition store.\n */\n subagents(opts: AgentScoped & { dir?: string } = {}): Promise<Subagent[]> {\n return this.mw.http.request<Subagent[]>(\"GET\", \"/subagents\", {\n query: this.query(opts, { dir: opts.dir }),\n });\n }\n\n /** `GET /subagents/{name}` — one definition's raw body + parsed meta. 404 `ApiError` if absent. */\n subagent(name: string, opts: AgentScoped & { scope?: MemoryScope; dir?: string } = {}): Promise<Subagent> {\n return this.mw.http.request<Subagent>(\"GET\", `/subagents/${encodeURIComponent(name)}`, {\n query: this.query(opts, { scope: opts.scope, dir: opts.dir }),\n });\n }\n\n /** `PUT /subagents/{name}` — create or overwrite a definition (raw content is canonical). Returns it. */\n setSubagent(\n name: string,\n content: string,\n opts: AgentScoped & { scope?: MemoryScope; dir?: string } = {},\n ): Promise<Subagent> {\n return this.mw.http.request<Subagent>(\"PUT\", `/subagents/${encodeURIComponent(name)}`, {\n query: this.query(opts, { scope: opts.scope, dir: opts.dir }),\n body: { content },\n });\n }\n\n /**\n * `DELETE /subagents/{name}` — remove one definition at `scope` (defaults to `user`). Idempotent:\n * deleting an absent definition still succeeds. A traversal name rejects with a 400 `ApiError`.\n */\n async deleteSubagent(\n name: string,\n opts: AgentScoped & { scope?: MemoryScope; dir?: string } = {},\n ): Promise<void> {\n await this.mw.http.request<{ deleted: boolean }>(\"DELETE\", `/subagents/${encodeURIComponent(name)}`, {\n query: this.query(opts, { scope: opts.scope, dir: opts.dir }),\n });\n }\n}\n\n/**\n * The persistent MCP-server surface for a scoped agent — the servers an agent loads on **every run**\n * from its own on-disk config (Claude's project `.mcp.json` + user `.claude.json`, Codex's\n * `config.toml`), as opposed to a turn's per-turn {@link TurnOptions.mcpServers} overlay. One shape\n * regardless of which agent runs; a call 400s if the selected agent doesn't expose the config\n * (check `capabilities.mcpConfig` first).\n *\n * `scope` picks `project` vs `user` (defaults to `user` — the scope every supporting agent has;\n * Codex is user-only); `dir` selects the project-scope working directory (defaults to the daemon cwd).\n * No secret ever crosses this surface — HTTP auth travels as `bearerTokenEnvVar` (an env-var name).\n */\nexport class McpApi {\n constructor(private readonly mw: Mindwire) {}\n\n private query(scoped: AgentScoped | undefined, extra?: Record<string, string | undefined>) {\n return { ...this.mw.agentParam(scoped), ...extra };\n }\n\n /**\n * `GET /mcp` — every persistent MCP server across the agent's supported scopes, keyed\n * `scope → name → server` (Claude: project + user; Codex: user only). A missing config file yields\n * an empty object for that scope rather than an error.\n */\n list(\n opts: AgentScoped & { dir?: string } = {},\n ): Promise<Partial<Record<MemoryScope, Record<string, MCPServer>>>> {\n return this.mw.http.request<Partial<Record<MemoryScope, Record<string, MCPServer>>>>(\"GET\", \"/mcp\", {\n query: this.query(opts, { dir: opts.dir }),\n });\n }\n\n /** `GET /mcp/{name}` — one server's definition. Rejects with a 404 `ApiError` if it isn't configured. */\n get(name: string, opts: AgentScoped & { scope?: MemoryScope; dir?: string } = {}): Promise<MCPServer> {\n return this.mw.http.request<MCPServer>(\"GET\", `/mcp/${encodeURIComponent(name)}`, {\n query: this.query(opts, { scope: opts.scope, dir: opts.dir }),\n });\n }\n\n /** `PUT /mcp/{name}` — create or overwrite one server. Returns the stored definition. */\n set(\n name: string,\n server: MCPServer,\n opts: AgentScoped & { scope?: MemoryScope; dir?: string } = {},\n ): Promise<MCPServer> {\n return this.mw.http.request<MCPServer>(\"PUT\", `/mcp/${encodeURIComponent(name)}`, {\n query: this.query(opts, { scope: opts.scope, dir: opts.dir }),\n body: server,\n });\n }\n\n /** `DELETE /mcp/{name}` — remove one server. Idempotent: deleting an absent server still succeeds. */\n async delete(name: string, opts: AgentScoped & { scope?: MemoryScope; dir?: string } = {}): Promise<void> {\n await this.mw.http.request<{ deleted: boolean }>(\"DELETE\", `/mcp/${encodeURIComponent(name)}`, {\n query: this.query(opts, { scope: opts.scope, dir: opts.dir }),\n });\n }\n}\n\n/**\n * The custom LLM-provider surface for a scoped agent — the OpenAI-compatible endpoints an agent loads on\n * **every run** from its own native config (opencode's `opencode.json` `provider.<id>`, Codex's\n * `config.toml` `[model_providers.<id>]`). One shape regardless of agent; a call 400s if the selected\n * agent can't materialize one (check `capabilities.customProviders` — Claude uses its gateway auth lane\n * instead). Registered models then appear in {@link Mindwire.models} with `custom:true`.\n *\n * `scope` picks `project` vs `user` (defaults to `user`; opencode/Codex are user-only); `dir` selects the\n * project-scope working directory (defaults to the daemon cwd).\n *\n * SECURITY: secrets are passed write-only via {@link set}'s `apiKey` / `secrets` options and reported only\n * as `hasKey` (plus the stored `envVars` NAMES). They never cross this surface on the way back and are never\n * written literally into any config file — the harness references them through env-var placeholders and the\n * daemon exports them at run time.\n */\nexport class ProvidersApi {\n constructor(private readonly mw: Mindwire) {}\n\n private query(scoped: AgentScoped | undefined, extra?: Record<string, string | undefined>) {\n return { ...this.mw.agentParam(scoped), ...extra };\n }\n\n /**\n * `GET /providers` — every registered custom provider across the agent's supported scopes, keyed\n * `scope → id → provider` (opencode/Codex: user only). A missing config file yields an empty object for\n * that scope rather than an error. `hasKey` reports whether a secret is stored; the key is never returned.\n */\n list(\n opts: AgentScoped & { dir?: string } = {},\n ): Promise<Partial<Record<MemoryScope, Record<string, CustomProvider>>>> {\n return this.mw.http.request<Partial<Record<MemoryScope, Record<string, CustomProvider>>>>(\"GET\", \"/providers\", {\n query: this.query(opts, { dir: opts.dir }),\n });\n }\n\n /** `GET /providers/{id}` — one provider's definition. Rejects with a 404 `ApiError` if it isn't configured. */\n get(id: string, opts: AgentScoped & { scope?: MemoryScope; dir?: string } = {}): Promise<CustomProvider> {\n return this.mw.http.request<CustomProvider>(\"GET\", `/providers/${encodeURIComponent(id)}`, {\n query: this.query(opts, { scope: opts.scope, dir: opts.dir }),\n });\n }\n\n /**\n * `PUT /providers/{id}` — create or overwrite one provider, returning the stored definition (with\n * `hasKey` and the stored `envVars`). Two write-only secret channels, both optional: `opts.apiKey` is a\n * single key (custom endpoints, single-key catalog brands); `opts.secrets` is a NAME→VALUE map for a\n * catalog provider whose entry declares MULTIPLE env vars (e.g. AWS Bedrock). Omitting both leaves any\n * previously stored secret intact. The path `id` wins over any `id` on the provider value.\n */\n set(\n id: string,\n provider: Omit<CustomProvider, \"id\" | \"hasKey\"> & Partial<Pick<CustomProvider, \"hasKey\">>,\n opts: AgentScoped & { scope?: MemoryScope; dir?: string; apiKey?: string; secrets?: Record<string, string> } = {},\n ): Promise<CustomProvider> {\n return this.mw.http.request<CustomProvider>(\"PUT\", `/providers/${encodeURIComponent(id)}`, {\n query: this.query(opts, { scope: opts.scope, dir: opts.dir }),\n body: { ...provider, id, apiKey: opts.apiKey, secrets: opts.secrets },\n });\n }\n\n /** `DELETE /providers/{id}` — remove one provider and clear its stored key. Idempotent. */\n async delete(id: string, opts: AgentScoped & { scope?: MemoryScope; dir?: string } = {}): Promise<void> {\n await this.mw.http.request<{ deleted: boolean }>(\"DELETE\", `/providers/${encodeURIComponent(id)}`, {\n query: this.query(opts, { scope: opts.scope, dir: opts.dir }),\n });\n }\n}\n\n/**\n * Daemon-driven notification fan-out: named **channels** (a webhook URL shaped for\n * webhook/Slack/Discord/Telegram, with optional headers, a bearer token, and — for the raw webhook\n * type — an HMAC signing secret) and the **rules** that route matching notifications to them\n * (`global` / per-`agent` / per-`session`, with optional event selection). This is daemon-wide\n * config (NOT agent-scoped): the daemon evaluates every rule against each notification it emits and\n * POSTs to the union of the matched channels — additive over the single {@link Mindwire.setNotifyConfig}\n * webhook.\n *\n * Secrets are **write-only**: a channel read back via {@link channels} never carries the URL, token,\n * secret, or header values — only their presence (and the URL host). On {@link setChannel}, omitting\n * `url`/`token`/`secret` preserves the stored value; send a new value to rotate it.\n */\nexport class NotifyApi {\n constructor(private readonly mw: Mindwire) {}\n\n /** `GET /notify/channels` — every channel, masked (no secrets). */\n channels(): Promise<NotifyChannel[]> {\n return this.mw.http.request<NotifyChannel[]>(\"GET\", \"/notify/channels\");\n }\n\n /** `POST /notify/channels` — create a channel (server-assigns the id). Returns it masked. */\n createChannel(input: NotifyChannelInput): Promise<NotifyChannel> {\n return this.mw.http.request<NotifyChannel>(\"POST\", \"/notify/channels\", { body: input });\n }\n\n /**\n * `PUT /notify/channels/{id}` — update a channel, merge-preserving any omitted secret\n * (`url`/`token`/`secret`). Returns the updated masked channel. 404 `ApiError` if unknown.\n */\n setChannel(id: string, input: NotifyChannelInput): Promise<NotifyChannel> {\n return this.mw.http.request<NotifyChannel>(\"PUT\", `/notify/channels/${encodeURIComponent(id)}`, {\n body: input,\n });\n }\n\n /** `DELETE /notify/channels/{id}` — remove a channel. Idempotent. */\n async deleteChannel(id: string): Promise<void> {\n await this.mw.http.request<{ deleted: boolean }>(\"DELETE\", `/notify/channels/${encodeURIComponent(id)}`);\n }\n\n /**\n * `POST /notify/channels/{id}/test` — deliver a synthetic notification to a channel. A failed\n * delivery is DATA (`{ ok: false, error }`), not a thrown error; only an unknown id rejects (404).\n */\n testChannel(id: string): Promise<NotifyChannelTestResult> {\n return this.mw.http.request<NotifyChannelTestResult>(\n \"POST\",\n `/notify/channels/${encodeURIComponent(id)}/test`,\n );\n }\n\n /** `GET /notify/rules` — every routing rule. */\n rules(): Promise<NotifyRule[]> {\n return this.mw.http.request<NotifyRule[]>(\"GET\", \"/notify/rules\");\n }\n\n /** `POST /notify/rules` — create a rule (server-assigns the id). Returns it. */\n createRule(input: NotifyRuleInput): Promise<NotifyRule> {\n return this.mw.http.request<NotifyRule>(\"POST\", \"/notify/rules\", { body: input });\n }\n\n /** `PUT /notify/rules/{id}` — replace a rule. Returns it. 404 `ApiError` if unknown. */\n setRule(id: string, input: NotifyRuleInput): Promise<NotifyRule> {\n return this.mw.http.request<NotifyRule>(\"PUT\", `/notify/rules/${encodeURIComponent(id)}`, {\n body: input,\n });\n }\n\n /** `DELETE /notify/rules/{id}` — remove a rule. Idempotent. */\n async deleteRule(id: string): Promise<void> {\n await this.mw.http.request<{ deleted: boolean }>(\"DELETE\", `/notify/rules/${encodeURIComponent(id)}`);\n }\n}\n\ntype Mutable<T> = { -readonly [K in keyof T]: T[K] };\n","// The SSH target. mindwire connects to a box over SSH, **ensures the daemon** there exactly like any\n// other backend (deploy the matching `mindwired`, launch it detached, health-poll on the remote loopback),\n// then reaches it over a **local port-forward tunnel**: a `127.0.0.1` listener whose every inbound TCP\n// connection is forwarded — over the one SSH connection — to the daemon's loopback port on the remote.\n// So the SDK's `baseUrl` is a real `http://127.0.0.1:<localPort>` and plain **global fetch** carries\n// both unary requests and SSE (no custom fetch, works on Node/Bun/Deno). A fresh, bare box becomes a\n// first-class destination.\n//\n// `ssh2` is an OPTIONAL peer dependency, lazily `import()`-ed only in `connect()` (as are `node:net`\n// and `node:fs/promises`) — so importing mindwire, or calling `ssh()` (which just stores options),\n// never loads it. Structural `Ssh2*` types below let the SDK typecheck and build with neither `ssh2`\n// nor `@types/ssh2` installed.\nimport { MindwireError } from \"../errors.js\";\nimport { ensureDaemon, type SandboxHost, type ExecResult, type EnsureEvent } from \"./host.js\";\nimport { provisionContainer } from \"./container.js\";\nimport type { Target, TargetHandle, ConnectSpec } from \"./index.js\";\n\n/** Options for the {@link ssh} target. */\nexport interface SshOptions {\n /** Host to connect to. */\n host: string;\n /** SSH port. Defaults to 22. */\n port?: number;\n /** SSH username. */\n username: string;\n /** Private key material (PEM). Highest-precedence auth. */\n privateKey?: string | Buffer;\n /** Path to a private key file (read at connect time). */\n privateKeyPath?: string;\n /** Passphrase for an encrypted private key. */\n passphrase?: string;\n /** Password auth. */\n password?: string;\n /** ssh-agent socket path. Defaults to `$SSH_AUTH_SOCK`. Used when no key/password is given. */\n agent?: string;\n /** Handshake timeout (ms). Defaults to 20000. */\n readyTimeoutMs?: number;\n /** Port the daemon listens on, on the REMOTE loopback. Defaults to 8790. */\n daemonPort?: number;\n /** `AGENT_TYPE` for the remote daemon. Defaults to the client's agent, then `claude-code`. */\n agentType?: string;\n /** `AGENT_CWD` — working directory agents run in, on the remote. Defaults to `/root`. */\n agentCwd?: string;\n /** Explicit local `mindwired` to deploy; `{os}`/`{arch}` expand to the destination platform. Otherwise downloaded from GitHub Releases. */\n daemonBin?: string;\n /** Upgrade an older daemon when idle; requires its service update capability. */\n autoUpdate?: boolean;\n /** On `close()`, tear the tunnel down and end the SSH connection. Defaults to `true`. */\n stopOnExit?: boolean;\n /**\n * Run the daemon **inside a Docker container** on the remote host instead of natively — a clean,\n * reproducible, isolated environment per instance. mindwire ensures Docker is present, spins the\n * container, deploys `mindwired` into it, and tunnels to its published loopback port. Docker is\n * detected, never installed, unless you opt in with `install: \"ifMissing\"`.\n */\n docker?: {\n /** Create + own a container from this image. */\n image?: string;\n /** Attach to an existing container (id or name) instead of creating one. */\n container?: string;\n /** Name for a container we create. */\n name?: string;\n /** Docker-on-host policy. `\"never\"` (default) detects and fails; `\"ifMissing\"` installs + starts it. */\n install?: \"never\" | \"ifMissing\";\n /** Extra args spliced into `docker run` (before the image), e.g. `[\"-e\", \"FOO=bar\"]`. */\n createArgs?: string[];\n };\n}\n\n/**\n * The SSH target. Returns a {@link Target} whose `connect()` opens an SSH connection, ensures\n * `mindwired` runs on the remote, and points the SDK at a local tunnel to it.\n *\n * ```ts\n * const mw = new Mindwire({ target: ssh({ host: \"box.example.com\", username: \"root\" }) });\n * ```\n */\nexport function ssh(opts: SshOptions): Target {\n return { name: \"ssh\", connect: (spec) => connectSsh(opts, spec) };\n}\n\nconst DEFAULT_PORT = 8790;\nconst DEFAULT_AGENT = \"claude-code\";\nconst DEFAULT_AGENT_CWD = \"/root\";\n\n// ---- minimal structural view of the `ssh2` package -------------------------\n// Declared locally so the SDK typechecks and builds WITHOUT `ssh2`/`@types/ssh2` installed.\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\ninterface Ssh2Stream {\n on(event: string, listener: (...args: any[]) => void): Ssh2Stream;\n stderr?: { on(event: string, listener: (...args: any[]) => void): unknown };\n pipe(dest: any): any;\n write?(chunk: unknown): unknown;\n end?(chunk?: unknown): unknown;\n close?(): unknown;\n destroy?(): unknown;\n}\n\ninterface Ssh2Sftp {\n createWriteStream(path: string, opts?: { mode?: number }): Ssh2Stream;\n}\n\ninterface Ssh2Client {\n on(event: string, listener: (...args: any[]) => void): Ssh2Client;\n connect(cfg: Record<string, unknown>): void;\n exec(command: string, cb: (err: Error | undefined, channel: Ssh2Stream) => void): void;\n forwardOut(\n srcIP: string,\n srcPort: number,\n dstIP: string,\n dstPort: number,\n cb: (err: Error | undefined, channel: Ssh2Stream) => void,\n ): void;\n sftp(cb: (err: Error | undefined, sftp: Ssh2Sftp) => void): void;\n end(): void;\n}\n\ninterface Ssh2Module {\n Client: new () => Ssh2Client;\n}\n/* eslint-enable @typescript-eslint/no-explicit-any */\n\n// A local tunnel to the remote daemon: a real loopback base URL, closed on teardown.\ninterface SshTunnel {\n baseUrl: string;\n close(): Promise<void>;\n}\ntype MakeTunnel = (client: Ssh2Client, daemonPort: number) => Promise<SshTunnel>;\n\n// ---- SandboxHost over an SSH connection ------------------------------------\n\n/**\n * Bridges the backend-agnostic {@link SandboxHost} onto an SSH connection: `exec` runs a command over\n * an ssh2 exec channel (the remote login shell parses the reassembled, faithfully-quoted command line),\n * and `putFile` `mkdir -p`s the parent then streams the bytes over SFTP with the requested mode. The\n * shared {@link ensureDaemon} cycle only ever sees these two primitives.\n */\nclass SshHost implements SandboxHost {\n constructor(private readonly client: Ssh2Client) {}\n\n exec(argv: string[]): Promise<ExecResult> {\n const command = toCommandLine(argv);\n return new Promise<ExecResult>((resolve, reject) => {\n this.client.exec(command, (err, channel) => {\n if (err) {\n reject(err);\n return;\n }\n const out: Buffer[] = [];\n const errb: Buffer[] = [];\n let code: number | undefined;\n channel.on(\"data\", (chunk: Buffer) => out.push(Buffer.from(chunk)));\n channel.stderr?.on(\"data\", (chunk: Buffer) => errb.push(Buffer.from(chunk)));\n channel.on(\"close\", (c?: number) => {\n code = typeof c === \"number\" ? c : undefined;\n resolve({\n exitCode: code,\n stdout: Buffer.concat(out).toString(\"utf8\"),\n stderr: Buffer.concat(errb).toString(\"utf8\"),\n });\n });\n channel.on(\"error\", (e: Error) => reject(e));\n });\n });\n }\n\n async putFile(path: string, data: Uint8Array, opts?: { mode?: string }): Promise<void> {\n // SFTP writes require the parent directory to exist (Risk 7).\n const slash = path.lastIndexOf(\"/\");\n const dir = slash > 0 ? path.slice(0, slash) : \"/\";\n await this.exec([\"mkdir\", \"-p\", dir]);\n\n const sftp = await this.sftp();\n const mode = parseInt(opts?.mode ?? \"0644\", 8) || 0o644;\n await new Promise<void>((resolve, reject) => {\n const ws = sftp.createWriteStream(path, { mode });\n let done = false;\n const finish = () => {\n if (!done) {\n done = true;\n resolve();\n }\n };\n ws.on(\"error\", (e: Error) => reject(e));\n ws.on(\"close\", finish);\n ws.on(\"finish\", finish);\n ws.end?.(Buffer.from(data));\n });\n }\n\n private sftp(): Promise<Ssh2Sftp> {\n return new Promise<Ssh2Sftp>((resolve, reject) => {\n this.client.sftp((err, sftp) => (err ? reject(err) : resolve(sftp)));\n });\n }\n}\n\n// ---- target entry points ---------------------------------------------------\n\nasync function connectSsh(opts: SshOptions, spec: ConnectSpec): Promise<TargetHandle> {\n const mod = await importSsh2();\n const net = await import(\"node:net\");\n const client = await openConnection(mod, opts);\n const daemonPort = opts.daemonPort ?? DEFAULT_PORT;\n const makeTunnel: MakeTunnel = (c, port) => createTunnel(net, c, port);\n\n const shared = {\n daemonPort,\n agent: opts.agentType ?? spec.agent ?? DEFAULT_AGENT,\n agentCwd: opts.agentCwd ?? DEFAULT_AGENT_CWD,\n daemonBin: opts.daemonBin,\n autoUpdate: opts.autoUpdate,\n stopOnExit: opts.stopOnExit ?? true,\n onLog: spec.onLog,\n };\n\n // With `docker`, the daemon runs inside a container on the remote (isolated, reproducible); the\n // tunnel points at the container's published loopback port, not the native daemon port.\n if (opts.docker) {\n return provisionSshContainer(client, makeTunnel, {\n ...shared,\n id: `${opts.username}@${opts.host}/docker`,\n docker: opts.docker,\n });\n }\n\n return provisionSsh(client, makeTunnel, {\n ...shared,\n id: `${opts.username}@${opts.host}:${daemonPort}`,\n });\n}\n\n/** The resolved inputs {@link provisionSsh} needs — decoupled from `SshOptions` and the lazy import. */\nexport interface SshProvisionConfig {\n /** Stable id for the handle (for logging). */\n id: string;\n /** Daemon port on the remote loopback. */\n daemonPort: number;\n /** `AGENT_TYPE` for the remote daemon. */\n agent: string;\n /** `AGENT_CWD` on the remote. */\n agentCwd: string;\n daemonBin?: string;\n autoUpdate?: boolean;\n /** Close the tunnel + end the SSH connection on `stop()`. */\n stopOnExit?: boolean;\n onLog?: (e: EnsureEvent) => void;\n}\n\n/**\n * The provisioning flow, decoupled from the `ssh2` import and the tunnel implementation so it can be\n * driven by an injected fake client + `makeTunnel` in tests. Ensures the daemon over the SSH\n * connection, brings up the tunnel, and returns a handle pointed at `http://127.0.0.1:<localPort>`.\n */\nexport async function provisionSsh(\n client: Ssh2Client,\n makeTunnel: MakeTunnel,\n cfg: SshProvisionConfig,\n): Promise<TargetHandle> {\n const token = await ensureDaemon(new SshHost(client), {\n port: cfg.daemonPort,\n agent: cfg.agent,\n agentCwd: cfg.agentCwd,\n daemonBin: cfg.daemonBin,\n autoUpdate: cfg.autoUpdate,\n target: \"ssh\",\n onLog: cfg.onLog,\n });\n\n const tunnel = await makeTunnel(client, cfg.daemonPort);\n\n let stopped = false;\n const stop = async (): Promise<void> => {\n if (stopped) return;\n stopped = true;\n // Always release the local listener + in-flight sockets we own; end the SSH connection per opt-in.\n await tunnel.close().catch(() => {});\n if (cfg.stopOnExit ?? true) {\n try {\n client.end();\n } catch {\n // best-effort\n }\n }\n };\n\n // Plain direct HTTP over the tunnel — no custom fetch; the client's default (global) fetch is used.\n return { id: cfg.id, baseUrl: tunnel.baseUrl, token, stop };\n}\n\n/** The resolved inputs {@link provisionSshContainer} needs — the shared daemon knobs plus `docker`. */\nexport interface SshContainerProvisionConfig {\n /** Stable id for the handle (for logging). */\n id: string;\n /** Port the daemon binds *inside* the container. */\n daemonPort: number;\n /** `AGENT_TYPE` for the in-container daemon. */\n agent: string;\n /** `AGENT_CWD` inside the container. */\n agentCwd: string;\n daemonBin?: string;\n autoUpdate?: boolean;\n /** Close the tunnel, `docker rm -f` a created container, and end the SSH connection on `stop()`. */\n stopOnExit?: boolean;\n onLog?: (e: EnsureEvent) => void;\n /** Container knobs (image/attach/name/install/createArgs). */\n docker: NonNullable<SshOptions[\"docker\"]>;\n}\n\n/**\n * Provision the daemon **in a container** on the remote host over SSH: bridge the SSH connection into a\n * {@link SandboxHost}, hand it to the generic {@link provisionContainer} (ensure Docker → run container\n * → deploy the daemon inside), then tunnel to the container's published loopback host port. Decoupled\n * from the `ssh2` import + tunnel like {@link provisionSsh}, so tests drive it with a fake client.\n */\nexport async function provisionSshContainer(\n client: Ssh2Client,\n makeTunnel: MakeTunnel,\n cfg: SshContainerProvisionConfig,\n): Promise<TargetHandle> {\n const container = await provisionContainer(\n new SshHost(client),\n {\n image: cfg.docker.image,\n container: cfg.docker.container,\n name: cfg.docker.name,\n install: cfg.docker.install,\n createArgs: cfg.docker.createArgs,\n daemonPort: cfg.daemonPort,\n agent: cfg.agent,\n agentCwd: cfg.agentCwd,\n daemonBin: cfg.daemonBin,\n autoUpdate: cfg.autoUpdate,\n stopOnExit: cfg.stopOnExit ?? true,\n target: \"ssh\",\n },\n cfg.onLog,\n );\n\n // The tunnel targets the container's ephemeral REMOTE host port, not the in-container daemon port.\n const tunnel = await makeTunnel(client, container.hostPort);\n\n let stopped = false;\n const stop = async (): Promise<void> => {\n if (stopped) return;\n stopped = true;\n await tunnel.close().catch(() => {});\n await container.stop().catch(() => {}); // rm the container we created, per stopOnExit\n if (cfg.stopOnExit ?? true) {\n try {\n client.end();\n } catch {\n // best-effort\n }\n }\n };\n\n return { id: cfg.id, baseUrl: tunnel.baseUrl, token: container.token, stop };\n}\n\n// ---- connection + tunnel ---------------------------------------------------\n\nasync function openConnection(mod: Ssh2Module, opts: SshOptions): Promise<Ssh2Client> {\n const auth = await buildAuth(opts);\n return new Promise<Ssh2Client>((resolve, reject) => {\n const client = new mod.Client();\n let settled = false;\n client.on(\"ready\", () => {\n if (settled) return;\n settled = true;\n resolve(client);\n });\n client.on(\"error\", (err: Error) => {\n if (settled) return;\n settled = true;\n reject(\n new MindwireError(\n `mindwire: SSH connection to ${opts.username}@${opts.host}:${opts.port ?? 22} failed: ${err.message}`,\n { cause: err },\n ),\n );\n });\n client.connect({\n host: opts.host,\n port: opts.port ?? 22,\n username: opts.username,\n readyTimeout: opts.readyTimeoutMs ?? 20000,\n ...auth,\n });\n });\n}\n\n/** Auth precedence: `privateKey` → `privateKeyPath` → `password` → ssh-agent (+ its default keys). */\nasync function buildAuth(opts: SshOptions): Promise<Record<string, unknown>> {\n if (opts.privateKey !== undefined) {\n return { privateKey: opts.privateKey, ...(opts.passphrase ? { passphrase: opts.passphrase } : {}) };\n }\n if (opts.privateKeyPath !== undefined) {\n const fs = await import(\"node:fs/promises\");\n const key = await fs.readFile(opts.privateKeyPath);\n return { privateKey: key, ...(opts.passphrase ? { passphrase: opts.passphrase } : {}) };\n }\n if (opts.password !== undefined) {\n return { password: opts.password };\n }\n const sock = opts.agent ?? env(\"SSH_AUTH_SOCK\");\n return sock ? { agent: sock } : {};\n}\n\n/**\n * A local `127.0.0.1` listener that forwards every inbound connection, over the one SSH connection, to\n * `127.0.0.1:<daemonPort>` on the remote. Pre-flights a single `forwardOut` so a host with TCP\n * forwarding disabled fails fast with a clear message (exec channels used by ensure don't need it).\n */\nasync function createTunnel(\n net: typeof import(\"node:net\"),\n client: Ssh2Client,\n daemonPort: number,\n): Promise<SshTunnel> {\n // Pre-flight: confirm the server permits direct-tcpip forwarding (Risk 1).\n await new Promise<void>((resolve, reject) => {\n client.forwardOut(\"127.0.0.1\", 0, \"127.0.0.1\", daemonPort, (err, stream) => {\n if (err) {\n reject(\n new MindwireError(\n `mindwire: the SSH server refused a port-forward to 127.0.0.1:${daemonPort} (direct-tcpip). ` +\n \"Enable `AllowTcpForwarding yes` in the remote sshd_config — mindwire tunnels the daemon's \" +\n \"HTTP/SSE over the SSH connection.\",\n { cause: err },\n ),\n );\n return;\n }\n try {\n (stream.destroy ?? stream.end)?.call(stream);\n } catch {\n // best-effort close of the probe channel\n }\n resolve();\n });\n });\n\n const sockets = new Set<import(\"node:net\").Socket>();\n const server = net.createServer((socket) => {\n sockets.add(socket);\n socket.on(\"close\", () => sockets.delete(socket));\n socket.on(\"error\", () => {});\n client.forwardOut(\"127.0.0.1\", 0, \"127.0.0.1\", daemonPort, (err, stream) => {\n if (err) {\n socket.destroy();\n return;\n }\n stream.on(\"error\", () => socket.destroy());\n // Bidirectional pipe carries backpressure both ways. The ssh2 channel is a Node duplex stream;\n // our local structural `Ssh2Stream` type doesn't model that, so bridge it for `.pipe`.\n const duplex = stream as unknown as NodeJS.ReadWriteStream;\n socket.pipe(duplex).pipe(socket);\n });\n });\n\n const localPort = await new Promise<number>((resolve, reject) => {\n server.on(\"error\", reject);\n server.listen(0, \"127.0.0.1\", () => {\n const addr = server.address();\n resolve(addr && typeof addr === \"object\" ? addr.port : 0);\n });\n });\n\n const close = async (): Promise<void> => {\n for (const s of sockets) {\n try {\n s.destroy();\n } catch {\n // best-effort\n }\n }\n sockets.clear();\n await new Promise<void>((resolve) => server.close(() => resolve()));\n };\n\n return { baseUrl: `http://127.0.0.1:${localPort}`, close };\n}\n\n// ---- reassembly + lazy import ----------------------------------------------\n\n/** Wrap one argv element in single quotes, escaping embedded `'` as `'\\''` (POSIX-safe). */\nfunction shQuote(s: string): string {\n return `'${s.replace(/'/g, `'\\\\''`)}'`;\n}\n\n/** Reassemble an argv into a shell-safe command line for the remote login shell. */\nfunction toCommandLine(argv: string[]): string {\n return argv.map(shQuote).join(\" \");\n}\n\nasync function importSsh2(): Promise<Ssh2Module> {\n // A variable specifier keeps `tsc` from statically resolving (and erroring on) the optional peer,\n // and keeps bundlers from inlining it — it stays a runtime dynamic import. `@vite-ignore` silences\n // Vite/Rollup's \"dynamic import cannot be analyzed\" warning for browser consumers that pull the\n // barrel in for `remote()` only (this code path is never reached in a browser).\n const spec = \"ssh2\";\n try {\n const mod = (await import(/* @vite-ignore */ spec)) as unknown as { default?: Ssh2Module } & Ssh2Module;\n return mod.default && (mod.default as Ssh2Module).Client ? mod.default : mod;\n } catch (err) {\n throw new MindwireError(\n \"mindwire: the SSH target needs the optional `ssh2` package. Install it (`npm i ssh2`). \" +\n \"It's an optional peer dependency, so the core SDK stays dependency-free.\",\n { cause: err },\n );\n }\n}\n\nfunction env(key: string): string | undefined {\n const proc = (globalThis as { process?: { env?: Record<string, string | undefined> } }).process;\n return proc?.env?.[key];\n}\n","// The backend-agnostic daemon-ensure cycle. Every sandbox adapter (Oblien, Docker, bring-your-own)\n// concerns itself with only two things: *ensuring the daemon* and *how to contact it*. This module is\n// the first half, factored out so no adapter re-implements it. An adapter supplies a tiny\n// {@link SandboxHost} — two primitives, `exec` and `putFile` — and {@link ensureDaemon} does the rest:\n// wait for the runtime, probe `/healthz`, reconcile the running version against the SDK's bundled\n// binary, and deploy (or redeploy, when `autoUpdate` is on) the matching `mindwired` when needed.\n//\n// The daemon wire protocol is untouched — this only changes *where* the daemon runs and how its bytes\n// get there. The launch is byte-for-byte the loopback daemon, just inside the sandbox.\nimport { MindwireError } from \"../errors.js\";\nimport { SDK_VERSION } from \"../version.js\";\nimport { ensureDaemonBinary } from \"../daemon-binary.js\";\n\nfunction versionAtLeast(actual: string | undefined, desired: string): boolean {\n if (actual === desired) return true;\n if (!actual || !/^\\d+\\.\\d+\\.\\d+$/.test(actual) || !/^\\d+\\.\\d+\\.\\d+$/.test(desired)) return false;\n const a = actual.split(\".\").map(Number), b = desired.split(\".\").map(Number);\n for (let i = 0; i < 3; i++) { if (a[i] !== b[i]) return a[i]! > b[i]!; }\n return true;\n}\n\nconst versionCheckScript = String.raw`version_at_least() {\n [ \"$1\" != \"$2\" ] || return 0\n [[ \"$1\" =~ ^[0-9]+\\.[0-9]+\\.[0-9]+$ ]] && [[ \"$2\" =~ ^[0-9]+\\.[0-9]+\\.[0-9]+$ ]] || return 1\n local a b c x y z\n IFS=. read -r a b c <<< \"$1\"\n IFS=. read -r x y z <<< \"$2\"\n (( 10#$a > 10#$x || (10#$a == 10#$x && 10#$b > 10#$y) || (10#$a == 10#$x && 10#$b == 10#$y && 10#$c >= 10#$z) ))\n}`;\n\n/** Result of running a command in a sandbox — normalized (camelCase) across backends. */\nexport interface ExecResult {\n exitCode?: number;\n stdout?: string;\n stderr?: string;\n error?: string;\n}\n\n/**\n * The minimal surface an adapter exposes so the shared {@link ensureDaemon} cycle can drive any\n * backend. Two primitives only — running a command to completion, and landing raw bytes at a path.\n * How they're implemented (Oblien's runtime exec + base64 files API, Docker's exec + tar putArchive,\n * …) is the adapter's business; the cycle never sees it.\n */\nexport interface SandboxHost {\n /** Run a command to completion (foreground) inside the sandbox and return its buffered result. */\n exec(argv: string[], opts?: { timeoutSeconds?: number }): Promise<ExecResult>;\n /** Land raw bytes at an absolute path inside the sandbox (made executable via `opts.mode`). */\n putFile(path: string, data: Uint8Array, opts?: { mode?: string }): Promise<void>;\n}\n\n/** What {@link ensureDaemon} needs: the daemon knobs plus the reconcile inputs. */\nexport interface EnsureDaemonConfig {\n /** Port the in-sandbox daemon binds (on `0.0.0.0`, so a published port can route in). */\n port: number;\n /** `AGENT_TYPE` for the in-sandbox daemon. */\n agent: string;\n /** `AGENT_CWD` — working directory agents run in, inside the sandbox. */\n agentCwd: string;\n /**\n * Explicit path to a `mindwired` to deploy (else downloaded from the matching GitHub Release).\n * `{os}` and `{arch}` expand to the destination (`linux`/`darwin` and `amd64`/`arm64`), allowing a\n * development launcher to build artifacts without guessing the sandbox platform in advance.\n */\n daemonBin?: string;\n /** Upgrade an older service when idle. Requires serviceUpdateVersion >= 1. Off by default. */\n autoUpdate?: boolean;\n /** Redeploy even when the reported version matches. Intended only for a locally built development daemon. */\n forceDeploy?: boolean;\n /** Version to reconcile against. Defaults to {@link SDK_VERSION} (the bundled binary's version). */\n desiredVersion?: string;\n /** Destination label carried on every {@link EnsureEvent} (e.g. `\"ssh\"`/`\"docker\"`/`\"oblien\"`). */\n target?: string;\n /** Receives a step {@link EnsureEvent} at each phase. A throwing callback can't abort provisioning. */\n onLog?: (e: EnsureEvent) => void;\n token?: string;\n}\n\n/**\n * A progress event emitted at each phase of the ensure cycle (and, one-shot, by the `local`/`remote`\n * targets). Surfaced to the caller through the client `logger` callback; the same steps `mw.ensure()`\n * awaits. Normal order: `connect` (runtime reachable) → `probe` (health checked) → either `skip`\n * (a healthy current daemon is kept) or `upload` → `launch` → `ready` (a daemon is deployed). `error`\n * is emitted if any phase throws.\n *\n * Two extra phases prefix the cycle when a container is provisioned first (e.g. `ssh({ docker })`):\n * `install` (Docker on the host detected — and, opt-in, installed/started) and `provision` (the\n * container created/started and its published port resolved). Those are emitted by the container layer\n * before it hands the in-container host to the ensure cycle, so the full order is\n * `connect → install → provision → probe → (skip | upload → launch → ready)`.\n */\nexport interface EnsureEvent {\n phase: \"connect\" | \"install\" | \"provision\" | \"pull\" | \"probe\" | \"download\" | \"upload\" | \"launch\" | \"ready\" | \"skip\" | \"error\";\n /** Destination label, e.g. `\"ssh\"` / `\"docker\"` / `\"oblien\"` / `\"local\"` / `\"remote\"`. */\n target: string;\n /** Human-readable one-line status. */\n message: string;\n /** The daemon's reported version, when known (on `probe` / `skip`). */\n version?: string;\n /** Target architecture the daemon was resolved for (on `upload`). */\n arch?: \"amd64\" | \"arm64\";\n /** Destination operating system (on `download` / `upload`). */\n platform?: \"linux\" | \"darwin\";\n /** Size of the uploaded daemon binary in bytes (on `upload`). */\n bytes?: number;\n /** Error message (on `error`). */\n error?: string;\n}\n\n/** Wrap `cfg.onLog` so a throwing callback can never abort provisioning (see Risk 8). */\nfunction makeEmit(cfg: EnsureDaemonConfig): (e: Omit<EnsureEvent, \"target\">) => void {\n const target = cfg.target ?? \"sandbox\";\n return (e) => {\n if (!cfg.onLog) return;\n try {\n cfg.onLog({ target, ...e });\n } catch {\n // A user logger must not be able to break the ensure cycle.\n }\n };\n}\n\n// Match the app's ~/.mindwire for the runtime user; images and SSH hosts may run without root.\nasync function daemonDirectory(host: SandboxHost): Promise<string> {\n const result = await host.exec([\"sh\", \"-lc\", 'printf \"<<MW_HOME>>%s<<MW_HOME>>\" \"$HOME\"'], { timeoutSeconds: 15 });\n const runtimeHome = result.stdout?.match(/<<MW_HOME>>([\\s\\S]*?)<<MW_HOME>>/)?.[1];\n if (!runtimeHome?.startsWith(\"/\") || runtimeHome.length > 4096 || /[\\x00-\\x1f\\x7f]/.test(runtimeHome)) {\n throw new MindwireError(\"mindwire: cannot resolve the runtime user's home directory\");\n }\n return runtimeHome.replace(/\\/+$/, \"\") + \"/.mindwire\";\n}\n\n/**\n * Make sure a healthy `mindwired` of the desired version is reachable at `127.0.0.1:<port>` inside the\n * sandbox, deploying it if absent (or redeploying if stale and `autoUpdate` is set). `forceDeploy`\n * deliberately replaces even a version match for local source development. Otherwise a healthy,\n * current daemon (e.g. an image that autostarts it, or a reused sandbox) is a no-op.\n */\nexport async function ensureDaemon(host: SandboxHost, cfg: EnsureDaemonConfig): Promise<string> {\n const emit = makeEmit(cfg);\n let token = cfg.token ?? (await import(\"node:crypto\")).randomBytes(32).toString(\"hex\");\n try {\n await waitHostReady(host);\n emit({ phase: \"connect\", message: \"runtime ready\" });\n const directory = await daemonDirectory(host);\n if (!cfg.token) {\n // Reconnecting a second client must reuse the workspace credential rather than replacing\n // the daemon with a new random token. This read uses the owner's SSH/runtime connection.\n token = (await readWorkspaceToken(host, directory)) ?? token;\n }\n\n const desired = cfg.desiredVersion ?? SDK_VERSION;\n const health = await probeHealth(host, cfg.port, token);\n if (health.reachable) {\n emit({\n phase: \"probe\",\n message: health.version ? `daemon reachable (v${health.version})` : \"daemon reachable (version unknown)\",\n version: health.version,\n });\n const upToDate = versionAtLeast(health.version, desired);\n // Keep a healthy daemon that's current, or one whose version we can't/shouldn't force-replace.\n // Only a stale-or-unknown version *with* autoUpdate, or an explicit development forceDeploy,\n // triggers a redeploy.\n if (!cfg.forceDeploy && (upToDate || !cfg.autoUpdate)) {\n emit({\n phase: \"skip\",\n message: upToDate ? `daemon already at v${health.version}` : \"keeping the running daemon\",\n version: health.version,\n });\n return token;\n }\n if ((health.serviceUpdateVersion ?? 0) < 1) {\n if (cfg.forceDeploy) throw new MindwireError(\"This legacy service cannot reserve an idle update. Upgrade it explicitly or stop it after its work finishes before deploying.\");\n emit({ phase: \"skip\", message: \"automatic update deferred: upgrade this legacy service explicitly to enable idle updates\", version: health.version });\n return token;\n }\n } else {\n emit({ phase: \"probe\", message: \"no daemon reachable; deploying\" });\n }\n\n await deploy(host, cfg, emit, token, directory, health.reachable);\n // A concurrent installer may have won the workspace lock and chosen its credential first.\n if (!cfg.token) token = (await readWorkspaceToken(host, directory)) ?? token;\n return token;\n } catch (err) {\n emit({ phase: \"error\", message: \"ensure failed\", error: err instanceof Error ? err.message : String(err) });\n throw err;\n }\n}\n\nasync function readWorkspaceToken(host: SandboxHost, directory: string): Promise<string | undefined> {\n const saved = await host.exec([\"sh\", \"-lc\", `cat ${shellQuote(directory + \"/daemon.token\")} 2>/dev/null || true`], { timeoutSeconds: 15 });\n const candidate = saved.stdout?.trim();\n return candidate && candidate.length <= 4096 && /^[\\x21-\\x7e]+$/.test(candidate) ? candidate : undefined;\n}\n\n/** Resolve the destination's daemon, then launch it detached and health-poll from inside the VM. */\nasync function deploy(\n host: SandboxHost,\n cfg: EnsureDaemonConfig,\n emit: (e: Omit<EnsureEvent, \"target\">) => void,\n token: string,\n directory: string,\n requireLease: boolean,\n): Promise<void> {\n const newPath = directory + \"/mindwired.new\";\n const BIN = shellQuote(directory + \"/mindwired\"), BIN_NEW = shellQuote(newPath);\n const STATE = shellQuote(directory + \"/agent-state.json\"), LOG = shellQuote(directory + \"/daemon.log\");\n const TOKEN = shellQuote(directory + \"/daemon.token\");\n const { platform, arch } = await probePlatform(host);\n const desired = cfg.desiredVersion ?? SDK_VERSION;\n let acquire = \"\";\n let stagedUpload: string | undefined;\n if (cfg.daemonBin) {\n const binPath = await resolveHostDaemon(cfg.daemonBin, platform, arch);\n const bytes = await readBytes(binPath);\n emit({ phase: \"upload\", message: `uploading daemon (${platform}-${arch}, ${formatMiB(bytes.length)})`, platform, arch, bytes: bytes.length });\n // An explicit local binary is the one intentional upload path (air-gapped destinations).\n stagedUpload = `${newPath}-${(await import(\"node:crypto\")).randomUUID()}`;\n await host.exec([\"sh\", \"-lc\", `mkdir -p ${shellQuote(directory)}`], { timeoutSeconds: 15 });\n await host.putFile(stagedUpload, bytes, { mode: \"0755\" });\n acquire = `mv -f ${shellQuote(stagedUpload)} ${BIN_NEW}`;\n } else {\n if (!/^[0-9]+\\.[0-9]+\\.[0-9]+(?:-[0-9A-Za-z.-]+)?$/.test(desired)) {\n throw new MindwireError(`mindwire: cannot download daemon for non-release SDK version ${desired}`);\n }\n const asset = `mindwired-v${desired}-${platform}-${arch}`;\n const release = `https://github.com/oblien/mindwire/releases/download/v${desired}`;\n emit({ phase: \"download\", message: `downloading daemon v${desired} on the destination (${platform}-${arch})`, platform, arch });\n // Download and verify *inside* the destination. This avoids an SDK-host upload and works for every\n // remote target that can execute commands. BIN_NEW is only renamed into place after verification.\n acquire = [\n `release=${shellQuote(release)}`,\n `asset=${shellQuote(asset)}`,\n 'if command -v sha256sum >/dev/null 2>&1; then mw_sha256=(sha256sum);',\n 'elif command -v shasum >/dev/null 2>&1; then mw_sha256=(shasum -a 256);',\n 'else echo \"MINDWIRE_FAIL SHA-256 verification requires sha256sum or shasum\"; exit 1; fi',\n \"download() {\",\n ' expected=$(curl -fsSL \"$release/checksums.txt\" | awk -v asset=\"$asset\" \\'$2 == asset { print $1; exit }\\') || return 1',\n ' [ -n \"$expected\" ] || return 1',\n ` curl -fsSL \"$release/$asset\" -o ${BIN_NEW} || return 1`,\n ` actual=$(\"\\${mw_sha256[@]}\" ${BIN_NEW} | awk '{print $1}') || return 1`,\n ' [ \"$actual\" = \"$expected\" ] || return 2',\n \"}\",\n \"if download; then :; else\",\n ' status=$?; [ \"$status\" -ne 2 ] || { echo \"MINDWIRE_FAIL checksum mismatch for $asset\"; exit 1; }',\n ' latest=$(curl -fsSL https://api.github.com/repos/oblien/mindwire/releases/latest | sed -n \\'s/.*\"tag_name\"[[:space:]]*:[[:space:]]*\"\\\\([^\"]*\\\\)\".*/\\\\1/p\\')',\n ' case \"$latest\" in v[0-9]*.[0-9]*.[0-9]*) ;; *) echo \"MINDWIRE_FAIL no matching or latest release\"; exit 1 ;; esac',\n ' release=\"https://github.com/oblien/mindwire/releases/download/$latest\"',\n ' mw_expected_version=\"${latest#v}\"',\n ` asset=\"mindwired-$latest-${platform}-${arch}\"`,\n ' download || { echo \"MINDWIRE_FAIL latest release download failed\"; exit 1; }',\n \"fi\",\n `chmod +x ${BIN_NEW}`,\n ].join(\"\\n\");\n }\n\n const script = [\n \"set -eo pipefail\",\n `mkdir -p ${shellQuote(directory)}`,\n // iOS takes this same workspace lock. Unique staging also protects concurrent local uploads.\n stagedUpload ? `trap ${shellQuote(`rm -f ${shellQuote(stagedUpload)}`)} EXIT` : \"\",\n `exec 9>${shellQuote(directory + \"/daemon-install.lock\")}`,\n 'if command -v flock >/dev/null 2>&1; then',\n ' flock -w 360 9 || { echo \"MINDWIRE_FAIL another daemon update is still running\"; exit 1; }',\n 'elif command -v lockf >/dev/null 2>&1; then',\n ' lockf -s -t 360 9 || { echo \"MINDWIRE_FAIL another daemon update is still running\"; exit 1; }',\n 'else echo \"MINDWIRE_FAIL No supported update lock is available (flock on Linux, lockf on macOS).\"; exit 1; fi',\n `mw_token=${shellQuote(token)}`,\n !cfg.token ? `if [ -s ${TOKEN} ]; then mw_token=$(cat ${TOKEN}); fi` : \"\",\n 'mw_lease=\"\"',\n `mw_lease_file=${shellQuote(directory)}/update-lease-$$.json`,\n 'cleanup_update() {',\n ` if [ -n \"$mw_lease\" ]; then curl -s --connect-timeout 2 --max-time 3 -X DELETE -H \"Authorization: Bearer $mw_token\" \"http://127.0.0.1:${cfg.port}/service/update/$mw_lease\" >/dev/null 2>&1 || true; fi`,\n ` rm -f ${BIN_NEW} \"$mw_lease_file\"${stagedUpload ? \" \" + shellQuote(stagedUpload) : \"\"}`,\n '}',\n // Shared staging is only removed while this process owns the workspace lock.\n 'trap cleanup_update EXIT',\n versionCheckScript,\n `mw_desired=${shellQuote(desired)}`,\n 'mw_expected_version=\"$mw_desired\"',\n `mw_health=$(curl -fsS --max-time 3 -H \"Authorization: Bearer $mw_token\" http://127.0.0.1:${cfg.port}/healthz 2>/dev/null || true)`,\n !cfg.forceDeploy ? [\n `mw_version=$(printf '%s' \"$mw_health\" | sed -n 's/.*\"version\"[[:space:]]*:[[:space:]]*\"\\\\([^\" ]*\\\\)\".*/\\\\1/p')`,\n `if [ -n \"$mw_health\" ] && ${cfg.autoUpdate ? 'version_at_least \"$mw_version\" \"$mw_desired\"' : \"true\"}; then echo MINDWIRE_READY; exit 0; fi`,\n ].join(\"\\n\") : \"\",\n // macOS ships POSIX setsid in Perl, but does not include Linux's setsid executable.\n 'if command -v setsid >/dev/null 2>&1; then mw_detach=(setsid);',\n `elif command -v perl >/dev/null 2>&1; then mw_detach=(perl -MPOSIX -e 'defined(my $sid = POSIX::setsid()) && $sid >= 0 or die \"setsid: $!\"; exec @ARGV; die \"exec: $!\";');`,\n 'else echo \"MINDWIRE_FAIL Cannot start the Mindwire service: setsid or Perl is required.\"; exit 1; fi',\n acquire,\n // The service decides idleness after transfer. Never stop arbitrary processes\n // or interrupt a chat that began while the SDK was downloading its binary.\n `mw_health=$(curl -fsS --max-time 3 -H \"Authorization: Bearer $mw_token\" http://127.0.0.1:${cfg.port}/healthz 2>/dev/null || true)`,\n 'if [ -n \"$mw_health\" ]; then',\n ` mw_status=$(curl -s --connect-timeout 2 --max-time 5 -X POST -H \"Authorization: Bearer $mw_token\" -o \"$mw_lease_file\" -w '%{http_code}' http://127.0.0.1:${cfg.port}/service/update) || mw_status=000`,\n ' case \"$mw_status\" in',\n ' 201)',\n ` mw_lease=$(sed -n 's/.*\"id\"[[:space:]]*:[[:space:]]*\"\\\\([[:alnum:]]*\\\\)\".*/\\\\1/p' \"$mw_lease_file\")`,\n ` mw_service_pid=$(sed -n 's/.*\"pid\"[[:space:]]*:[[:space:]]*\\\\([0-9][0-9]*\\\\).*/\\\\1/p' \"$mw_lease_file\")`,\n ' [ -n \"$mw_lease\" ] && [[ \"$mw_service_pid\" =~ ^[0-9]+$ ]] && [ \"$mw_service_pid\" -gt 1 ] || { echo \"MINDWIRE_FAIL invalid service update lease\"; exit 1; }',\n ' kill \"$mw_service_pid\" ;;',\n ' 409) echo MINDWIRE_UPDATE_DEFERRED; exit 0 ;;',\n ' 404) echo \"MINDWIRE_FAIL this legacy service requires an explicit upgrade before idle updates\"; exit 1 ;;',\n ' *) echo \"MINDWIRE_FAIL could not reserve an idle service update\"; exit 1 ;;',\n ' esac',\n requireLease ? 'else echo \"MINDWIRE_FAIL the service went offline before its idle update could be reserved\"; exit 1' : '',\n 'fi',\n \"sleep 0.3\",\n `mv -f ${BIN_NEW} ${BIN}`,\n `chmod +x ${BIN}`,\n // Detach so the daemon survives this exec's shell exiting. ADDR=\":<port>\" binds 0.0.0.0.\n // Ignore HUP directly: macOS nohup can fail after setsid in a headless workspace.\n `\"\\${mw_detach[@]}\" /bin/sh -c 'trap \"\" HUP; exec \"$@\"' mindwire-service env ADDR=\":${cfg.port}\" AGENT_TYPE=${shellQuote(cfg.agent)} AGENT_CWD=${shellQuote(cfg.agentCwd)} ` +\n `STATE_PATH=${STATE} DAEMON_TOKEN=\"$mw_token\" ${BIN} > ${LOG} 2>&1 < /dev/null 9>&- &`,\n // Health-poll from inside the VM (loopback) and emit a marker — exit codes are unreliable here.\n 'mw_pid=$!; mw_exit=\"\"; mw_deadline=$((SECONDS + 30))',\n 'while (( SECONDS < mw_deadline )); do',\n ` mw_health=$(curl -fsS --connect-timeout 2 --max-time 3 -H \"Authorization: Bearer $mw_token\" http://127.0.0.1:${cfg.port}/healthz 2>/dev/null || true)`,\n ` mw_version=$(printf '%s' \"$mw_health\" | sed -n 's/.*\"version\"[[:space:]]*:[[:space:]]*\"\\\\([^\" ]*\\\\)\".*/\\\\1/p')`,\n ' if version_at_least \"$mw_version\" \"$mw_expected_version\"; then echo MINDWIRE_READY; exit 0; fi',\n ' if [ -z \"$mw_exit\" ] && ! kill -0 \"$mw_pid\" 2>/dev/null; then',\n ' mw_exit=0; wait \"$mw_pid\" || mw_exit=$?; [ \"$mw_exit\" = 0 ] || break',\n ' fi',\n ' sleep 0.25',\n 'done',\n `mw_tail=$(tail -n 40 ${LOG} 2>/dev/null || true)`,\n 'if [ -n \"$mw_exit\" ] && [ \"$mw_exit\" != 0 ]; then mw_reason=\"Mindwire exited during startup (status $mw_exit).\";',\n 'else mw_reason=\"The Mindwire service did not become ready at v$mw_expected_version (reported: $mw_version).\"; fi',\n '[ -z \"$mw_tail\" ] || mw_reason=\"$mw_reason $mw_tail\"',\n 'printf \"MINDWIRE_FAIL %s\\\\n\" \"$mw_reason\"',\n ].join(\"\\n\");\n\n emit({ phase: \"launch\", message: \"launching daemon\" });\n const res = await host.exec([\"bash\", \"-lc\", script], { timeoutSeconds: 420 });\n const out = res.stdout ?? \"\";\n if (out.includes(\"MINDWIRE_UPDATE_DEFERRED\")) {\n if (cfg.forceDeploy) throw new MindwireError(\"The workspace is busy. Wait for its operations to finish before deploying the service.\");\n emit({ phase: \"skip\", message: \"service update deferred while workspace operations are running\" });\n return;\n }\n if (!out.includes(\"MINDWIRE_READY\")) {\n throw new MindwireError(\n \"mindwire: the in-sandbox daemon did not become healthy after deploy.\\n\" +\n (out || res.stderr || res.error || \"(no output)\").trim(),\n );\n }\n emit({ phase: \"ready\", message: \"daemon deployed and healthy\" });\n}\n\n/** Probe `127.0.0.1:<port>/healthz` from inside the sandbox. Returns reachability + reported version. */\nasync function probeHealth(host: SandboxHost, port: number, token: string): Promise<{ reachable: boolean; version?: string; serviceUpdateVersion?: number }> {\n const script =\n `out=$(curl -fsS --max-time 3 -H ${shellQuote(`Authorization: Bearer ${token}`)} http://127.0.0.1:${port}/healthz 2>/dev/null) ` +\n `&& printf '<<MW_H>>%s<<MW_H>>' \"$out\" || printf '<<MW_H>><<MW_H>>'`;\n const res = await host.exec([\"bash\", \"-lc\", script], { timeoutSeconds: 15 });\n const body = ((res.stdout ?? \"\").match(/<<MW_H>>([\\s\\S]*?)<<MW_H>>/)?.[1] ?? \"\").trim();\n if (!body) return { reachable: false };\n try {\n const j = JSON.parse(body) as { version?: unknown; serviceUpdateVersion?: unknown };\n return { reachable: true, version: typeof j.version === \"string\" ? j.version : undefined,\n serviceUpdateVersion: typeof j.serviceUpdateVersion === \"number\" ? j.serviceUpdateVersion : undefined };\n } catch {\n // Something answered but it isn't our JSON — treat as reachable/unknown so we don't clobber it.\n return { reachable: true };\n }\n}\n\nasync function probePlatform(host: SandboxHost): Promise<{ platform: \"linux\" | \"darwin\"; arch: \"amd64\" | \"arm64\" }> {\n const res = await host.exec([\"bash\", \"-lc\", `printf '<<OS:%s>><<ARCH:%s>>' \"$(uname -s)\" \"$(uname -m)\"`], { timeoutSeconds: 15 });\n const os = ((res.stdout ?? \"\").match(/<<OS:([^>]*)>>/)?.[1] ?? \"\").trim().toLowerCase();\n const rawArch = ((res.stdout ?? \"\").match(/<<ARCH:([^>]*)>>/)?.[1] ?? \"\").trim();\n const arch = rawArch === \"aarch64\" || rawArch === \"arm64\" ? \"arm64\"\n : rawArch === \"x86_64\" || rawArch === \"amd64\" ? \"amd64\" : undefined;\n if ((os !== \"linux\" && os !== \"darwin\") || !arch) {\n throw new MindwireError(`mindwire: unsupported workspace platform ${os || \"unknown\"}/${rawArch || \"unknown\"}; expected Linux or macOS on amd64 or arm64`);\n }\n return { platform: os, arch };\n}\n\n/** Wait until the sandbox can execute commands (covers VM/container cold-start). */\nasync function waitHostReady(host: SandboxHost, timeoutMs = 60000): Promise<void> {\n const deadline = Date.now() + timeoutMs;\n let lastErr: unknown = null;\n while (Date.now() < deadline) {\n try {\n const r = await host.exec([\"bash\", \"-lc\", \"echo mw_ready\"], { timeoutSeconds: 10 });\n if ((r.stdout ?? \"\").includes(\"mw_ready\")) return;\n } catch (e) {\n lastErr = e;\n }\n await sleep(1000);\n }\n throw new MindwireError(\n \"mindwire: the sandbox runtime did not become ready in time.\",\n lastErr ? { cause: lastErr } : undefined,\n );\n}\n\n/**\n * Resolve a Linux `mindwired` on the host running the SDK: an explicit `daemonBin`, else download the\n * SDK-matched release binary, verify its checksum, and return its local cache path for upload.\n */\nexport async function resolveLinuxDaemon(\n explicit: string | undefined,\n arch: \"amd64\" | \"arm64\",\n): Promise<string> {\n return resolveHostDaemon(explicit, \"linux\", arch);\n}\n\nasync function resolveHostDaemon(\n explicit: string | undefined,\n platform: \"linux\" | \"darwin\",\n arch: \"amd64\" | \"arm64\",\n): Promise<string> {\n const fs = await import(\"node:fs\");\n if (explicit) {\n const resolved = explicit.replaceAll(\"{os}\", platform).replaceAll(\"{arch}\", arch);\n if (!fs.existsSync(resolved)) {\n throw new MindwireError(`mindwire: sandbox daemonBin not found at ${resolved}`);\n }\n return resolved;\n }\n return ensureDaemonBinary({ platform, arch: arch === \"arm64\" ? \"arm64\" : \"x64\" });\n}\n\nasync function readBytes(p: string): Promise<Uint8Array> {\n const fs = await import(\"node:fs/promises\");\n return fs.readFile(p);\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((r) => setTimeout(r, ms));\n}\n\nfunction shellQuote(value: string): string {\n return `'${value.replace(/'/g, \"'\\\\''\")}'`;\n}\n\nfunction formatMiB(bytes: number): string {\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n","// A backend-agnostic container layer. Given any {@link SandboxHost} — a shell on *some* machine, over\n// SSH, a local socket, whatever — this ensures Docker is present on that machine, spins (or attaches\n// to) a container, and runs `mindwired` **inside** it via the shared {@link ensureDaemon} cycle. The\n// isolation model becomes \"one container = one daemon = one environment\".\n//\n// It touches Docker only through the two `SandboxHost` primitives (`exec` + `putFile`): every Docker\n// operation is a `docker …` command line, and files land via `putFile` to a host temp path + `docker\n// cp`. So there is **no** new dependency — no `dockerode`, no engine socket forwarding — and the exact\n// same layer composes over any exec-capable backend. `ssh({ docker })` is its first consumer.\n//\n// Installing Docker is a privileged, mutating action, so it never happens implicitly: the default\n// `install: \"never\"` detects Docker and fails with a clear message; `install: \"ifMissing\"` opts in to\n// running the official `get.docker.com` script and enabling the service.\nimport { MindwireError } from \"../errors.js\";\nimport { ensureDaemon, type SandboxHost, type ExecResult, type EnsureEvent } from \"./host.js\";\n\n/** What {@link provisionContainer} needs to bring up a daemon-in-a-container over a base host. */\nexport interface ContainerConfig {\n /** Create + own a container from this image. */\n image?: string;\n /** Attach to an existing container (id or name) instead of creating one. */\n container?: string;\n /** Name for a container we create. */\n name?: string;\n /** Docker-on-host policy. `\"never\"` (default) detects and fails; `\"ifMissing\"` installs + starts it. */\n install?: \"never\" | \"ifMissing\";\n /** Extra args spliced into `docker run` (before the image), e.g. `[\"-e\", \"FOO=bar\", \"--gpus\", \"all\"]`. */\n createArgs?: string[];\n /** Port the in-container daemon binds (published to an ephemeral loopback host port). */\n daemonPort: number;\n /** `AGENT_TYPE` for the in-container daemon. */\n agent: string;\n /** `AGENT_CWD` — working directory agents run in, inside the container. */\n agentCwd: string;\n /** Explicit path to a Linux `mindwired` to deploy (else resolved from the platform package). */\n daemonBin?: string;\n /** Redeploy when the running daemon's version differs from the SDK's bundled binary. */\n autoUpdate?: boolean;\n /** On `stop()`, `docker rm -f` a container we created (attached containers are left running). */\n stopOnExit?: boolean;\n /** Destination label carried on every {@link EnsureEvent}. Defaults to `\"container\"`. */\n target?: string;\n}\n\n/** What {@link provisionContainer} resolves: the container it ensured and how to reach + tear it down. */\nexport interface ContainerHandle {\n /** The full container id (created) or the id/name we attached to. */\n containerId: string;\n /** The ephemeral host port the in-container daemon is published to, on the base machine's loopback. */\n hostPort: number;\n /** Bearer token generated for the daemon in this container. */\n token: string;\n /** Tear down: `docker rm -f` the container if we created it and `stopOnExit` is set. Idempotent. */\n stop(): Promise<void>;\n}\n\n/**\n * Ensure Docker on the base host, bring up a container, and deploy `mindwired` inside it. Decoupled and\n * injectable (like `provisionSsh`/`provisionDocker`): tests drive it with a fake {@link SandboxHost}.\n * The `install`/`provision` phases stream through `onLog`; the daemon cycle then streams its own phases.\n */\nexport async function provisionContainer(\n host: SandboxHost,\n cfg: ContainerConfig,\n onLog?: (e: EnsureEvent) => void,\n): Promise<ContainerHandle> {\n const target = cfg.target ?? \"container\";\n // Wrap onLog so a throwing user callback can never abort provisioning (mirrors host.ts makeEmit).\n const emit = (e: Omit<EnsureEvent, \"target\">): void => {\n if (!onLog) return;\n try {\n onLog({ target, ...e });\n } catch {\n // best-effort\n }\n };\n\n // 1. Docker on the base host (detect; install/start only when opted in).\n await ensureDockerReady(host, cfg.install ?? \"never\", emit);\n\n // 2. The container (create or attach) + its published host port.\n const { containerId, hostPort, created } = await runContainer(host, cfg, emit);\n\n // 3. The daemon *inside* the container — the shared cycle, unchanged, over a ContainerHost.\n const token = await ensureDaemon(new ContainerHost(host, containerId), {\n port: cfg.daemonPort,\n agent: cfg.agent,\n agentCwd: cfg.agentCwd,\n daemonBin: cfg.daemonBin,\n autoUpdate: cfg.autoUpdate,\n target,\n onLog,\n });\n\n let stopped = false;\n const stop = async (): Promise<void> => {\n if (stopped) return;\n stopped = true;\n if (!created || !(cfg.stopOnExit ?? true)) return; // attached container ⇒ leave it running\n try {\n await host.exec([\"docker\", \"rm\", \"-f\", containerId]);\n } catch {\n // best-effort teardown\n }\n };\n\n return { containerId, hostPort, token, stop };\n}\n\n// ---- SandboxHost over a container, via a base host -------------------------\n\n/**\n * Wraps a base {@link SandboxHost} so every command runs *inside* a container and every file lands\n * inside it — nothing more than `docker exec` / `docker cp` layered on the base's own `exec`/`putFile`.\n * This is the crux of the reuse: the shared {@link ensureDaemon} cycle sees an ordinary `SandboxHost`\n * and never learns there's a container (or an SSH hop) underneath.\n */\nexport class ContainerHost implements SandboxHost {\n constructor(\n private readonly base: SandboxHost,\n private readonly containerId: string,\n ) {}\n\n exec(argv: string[], opts?: { timeoutSeconds?: number }): Promise<ExecResult> {\n // Pass a real argv to the base and let *it* do the single quoting — never pre-join (Risk 3).\n return this.base.exec([\"docker\", \"exec\", \"--env\", \"MINDWIRE_ISOLATION=container\", this.containerId, ...argv], opts);\n }\n\n async putFile(path: string, data: Uint8Array, opts?: { mode?: string }): Promise<void> {\n const slash = path.lastIndexOf(\"/\");\n const dir = slash > 0 ? path.slice(0, slash) : \"/\";\n const base = path.slice(slash + 1);\n const mode = opts?.mode ?? \"0644\";\n // A staging path on the *base* machine's filesystem, scoped by container id to avoid collisions.\n const tmp = `/tmp/.mw-${this.containerId.slice(0, 12)}-${base}`;\n\n await this.base.exec([\"docker\", \"exec\", this.containerId, \"mkdir\", \"-p\", dir]); // docker cp needs the dir (Risk 1)\n await this.base.putFile(tmp, data, opts); // the base host's own upload (e.g. SFTP over SSH)\n await this.base.exec([\"docker\", \"cp\", tmp, `${this.containerId}:${path}`]);\n await this.base.exec([\"docker\", \"exec\", this.containerId, \"chmod\", mode, path]);\n await this.base.exec([\"rm\", \"-f\", tmp]);\n }\n}\n\n// ---- Docker on the base host -----------------------------------------------\n\ntype DockerStatus = \"running\" | \"stopped\" | \"denied\" | \"absent\";\n\n/** Detect Docker on the base host and, per policy, install/start it. Emits `install` phase events. */\nasync function ensureDockerReady(\n host: SandboxHost,\n install: \"never\" | \"ifMissing\",\n emit: (e: Omit<EnsureEvent, \"target\">) => void,\n): Promise<void> {\n let state = await detectDocker(host);\n\n if (state.status === \"running\") {\n emit({ phase: \"install\", message: `docker present (v${state.version ?? \"?\"})`, version: state.version });\n return;\n }\n\n if (state.status === \"denied\") {\n throw new MindwireError(\n \"mindwire: connected to the host, but this user can't reach the Docker daemon socket \" +\n \"(permission denied). Connect as root, or add the SSH user to the `docker` group.\",\n );\n }\n\n if (state.status === \"stopped\") {\n emit({ phase: \"install\", message: \"docker installed but not running; starting it\" });\n await startDocker(host);\n state = await detectDocker(host);\n if (state.status === \"running\") {\n emit({ phase: \"install\", message: `docker started (v${state.version ?? \"?\"})`, version: state.version });\n return;\n }\n throw new MindwireError(\"mindwire: Docker is installed on the host but could not be started.\");\n }\n\n // absent\n if (install !== \"ifMissing\") {\n throw new MindwireError(\n \"mindwire: Docker is not installed on the remote host, and mindwire won't install system \" +\n 'packages unless you opt in. Pass docker: { install: \"ifMissing\" } to have it run the ' +\n \"official get.docker.com script (`curl -fsSL https://get.docker.com | sh`) and enable the \" +\n \"service — or install Docker on the host yourself.\",\n );\n }\n\n emit({ phase: \"install\", message: \"docker not found; installing via get.docker.com\" });\n await installDocker(host);\n await startDocker(host);\n state = await detectDocker(host);\n if (state.status !== \"running\") {\n throw new MindwireError(\n \"mindwire: ran the get.docker.com install script, but the Docker daemon did not come up.\",\n );\n }\n emit({ phase: \"install\", message: `docker installed and started (v${state.version ?? \"?\"})`, version: state.version });\n}\n\n/** Distinguish running / stopped / permission-denied / absent, and read the server version. */\nasync function detectDocker(host: SandboxHost): Promise<{ status: DockerStatus; version?: string }> {\n const script = [\n 'if ! command -v docker >/dev/null 2>&1; then echo \"MW_DOCKER=absent\"; exit 0; fi',\n 'if v=$(docker info --format \"{{.ServerVersion}}\" 2>/dev/null); then echo \"MW_DOCKER=running:$v\"; exit 0; fi',\n \"err=$(docker info 2>&1 >/dev/null || true)\",\n 'case \"$err\" in',\n ' *ermission*denied*) echo \"MW_DOCKER=denied\" ;;',\n ' *) echo \"MW_DOCKER=stopped\" ;;',\n \"esac\",\n ].join(\"\\n\");\n const res = await host.exec([\"bash\", \"-lc\", script], { timeoutSeconds: 30 });\n const m = (res.stdout ?? \"\").match(/MW_DOCKER=([a-z]+)(?::([^\\n]*))?/);\n const status = (m?.[1] as DockerStatus) ?? \"absent\";\n const version = m?.[2]?.trim() || undefined;\n return { status, version };\n}\n\n/** Run the official Docker install script. Only ever reached on explicit `install: \"ifMissing\"`. */\nasync function installDocker(host: SandboxHost): Promise<void> {\n const res = await host.exec([\"bash\", \"-lc\", \"curl -fsSL https://get.docker.com | sh\"], {\n timeoutSeconds: 600,\n });\n if ((res.exitCode ?? 0) !== 0) {\n throw new MindwireError(\n \"mindwire: the Docker install script (get.docker.com) failed.\\n\" +\n (res.stderr || res.stdout || \"(no output)\").trim(),\n );\n }\n}\n\n/** Enable + start the Docker service (systemd, then SysV as a fallback). Best-effort; re-detected after. */\nasync function startDocker(host: SandboxHost): Promise<void> {\n await host.exec(\n [\"bash\", \"-lc\", \"systemctl enable --now docker 2>/dev/null || service docker start 2>/dev/null || true\"],\n { timeoutSeconds: 60 },\n );\n}\n\n// ---- the container ---------------------------------------------------------\n\n/** Create (from `image`) or attach to (`container`) a container, and resolve its published host port. */\nasync function runContainer(\n host: SandboxHost,\n cfg: ContainerConfig,\n emit: (e: Omit<EnsureEvent, \"target\">) => void,\n): Promise<{ containerId: string; hostPort: number; created: boolean }> {\n const port = cfg.daemonPort;\n\n if (cfg.container !== undefined) {\n // Attach: make sure it's running (idempotent), then resolve its published port.\n await host.exec([\"docker\", \"start\", cfg.container]);\n const hostPort = await resolveHostPort(host, cfg.container, port);\n emit({\n phase: \"provision\",\n message: `attached to container ${cfg.container}; daemon published on host port ${hostPort}`,\n });\n return { containerId: cfg.container, hostPort, created: false };\n }\n\n if (!cfg.image) {\n throw new MindwireError(\n \"mindwire: running the daemon in a container needs an image (docker.image) to create one, \" +\n \"or an existing container (docker.container) to attach to.\",\n );\n }\n\n // Publish to the base machine's LOOPBACK only (Risk 2) — the SSH forward reaches it; the box doesn't.\n const runArgs = [\"docker\", \"run\", \"-d\", \"--env\", \"MINDWIRE_ISOLATION=container\"];\n if (cfg.name) runArgs.push(\"--name\", cfg.name);\n runArgs.push(\"-p\", `127.0.0.1:0:${port}`);\n if (cfg.createArgs?.length) runArgs.push(...cfg.createArgs);\n runArgs.push(cfg.image, \"sleep\", \"infinity\");\n\n const res = await host.exec(runArgs, { timeoutSeconds: 120 });\n const containerId = (res.stdout ?? \"\").trim().split(/\\s+/).pop() ?? \"\";\n if (!containerId || (res.exitCode ?? 0) !== 0) {\n throw new MindwireError(\n \"mindwire: `docker run` did not start a container.\\n\" +\n (res.stderr || res.stdout || \"(no output)\").trim(),\n );\n }\n\n const hostPort = await resolveHostPort(host, containerId, port);\n emit({\n phase: \"provision\",\n message: `container ${containerId.slice(0, 12)} up; daemon published on host port ${hostPort}`,\n });\n return { containerId, hostPort, created: true };\n}\n\n/** Parse `docker port <cid> <port>/tcp` (e.g. `127.0.0.1:49153`) into the ephemeral host port. */\nasync function resolveHostPort(host: SandboxHost, containerId: string, port: number): Promise<number> {\n const res = await host.exec([\"docker\", \"port\", containerId, `${port}/tcp`]);\n const line = (res.stdout ?? \"\")\n .split(\"\\n\")\n .map((s) => s.trim())\n .find(Boolean);\n const hostPort = line ? Number.parseInt(line.match(/:(\\d+)\\s*$/)?.[1] ?? \"\", 10) : NaN;\n if (!Number.isFinite(hostPort) || hostPort <= 0) {\n throw new MindwireError(\n `mindwire: could not resolve the published host port for ${port}/tcp on container ` +\n `${containerId.slice(0, 12)}. ` +\n (cfgHint(res)) +\n `docker port output: ${JSON.stringify((res.stdout ?? \"\").trim())}`,\n );\n }\n return hostPort;\n}\n\n/** A hint for the common \"attached to a container that doesn't publish the daemon port\" mistake. */\nfunction cfgHint(res: ExecResult): string {\n return (res.stdout ?? \"\").trim() === \"\"\n ? \"Attach to a container started with that port published (e.g. `-p 127.0.0.1:0:<port>`). \"\n : \"\";\n}\n","// The Docker sandbox adapter. The mindwire daemon runs *inside a Docker container* — created from an\n// image, or attached to a container you already run (pass your own `dockerode` instance, e.g. one\n// pointed at a remote engine) — and the SDK reaches it over a plain published port on loopback. The\n// daemon binds `0.0.0.0`, Docker publishes it to an ephemeral host port, and the transport is just the\n// global `fetch` against `http://127.0.0.1:<hostPort>` — no proxy, no token.\n//\n// `dockerode` is an OPTIONAL peer dependency, lazily `import()`-ed only in `connect()` — so importing\n// mindwire (or calling `docker()`, which just stores config) never loads it. The bootstrap\n// (`SandboxHost.exec` via `container.exec`, `putFile` via an in-memory tar `putArchive`) hides behind\n// the same {@link SandboxHost} the Oblien adapter uses, so the shared {@link ensureDaemon} cycle runs\n// unchanged.\nimport { MindwireError } from \"../errors.js\";\nimport { ensureDaemon, type SandboxHost, type EnsureEvent } from \"./host.js\";\nimport { SDK_VERSION } from \"../version.js\";\nimport type { Target, TargetHandle, ConnectSpec } from \"./index.js\";\n\n/**\n * How to reach the Docker **engine**. Passed straight to `new Docker(engine)` (the `dockerode`\n * constructor) — a local socket or a TCP/TLS endpoint. Nested (not flattened) so its `port` (the\n * engine's TCP port) never collides with {@link DockerConfig.port} (the in-container daemon's port).\n * Omit it entirely for the ambient local engine.\n *\n * To reach a **remote host over SSH**, prefer `ssh({ docker })` — mindwire's exec-based container layer\n * that needs only SSH credentials (no engine socket forwarding, no extra deps) — rather than routing\n * `dockerode` over SSH here.\n */\nexport interface DockerEngineOptions {\n /** Remote engine host (TCP). */\n host?: string;\n /** Engine TCP port (e.g. 2375 / 2376). */\n port?: number;\n /** Local engine socket path (e.g. `/var/run/docker.sock`). */\n socketPath?: string;\n /** Transport to the engine. */\n protocol?: \"http\" | \"https\";\n /** TLS material for a `https` engine. */\n ca?: string | Buffer;\n /** TLS material for a `https` engine. */\n cert?: string | Buffer;\n /** TLS material for a `https` engine. */\n key?: string | Buffer;\n}\n\n/**\n * Config for the Docker target. Supply `image` to create+own a container, or `container` to attach to\n * an existing one (which must already publish `port`). Point at a remote engine with `engine` (or pass\n * your own `docker` instance). `agent` falls back to the client's default agent.\n */\nexport interface DockerConfig {\n /** A `dockerode` instance to use. Takes precedence over `engine`. Defaults to `new Docker(engine)`. */\n docker?: DockerodeLike;\n /** How to reach the Docker engine (remote host / socket / TLS). Ignored when `docker` is passed. */\n engine?: DockerEngineOptions;\n /** Create + own a container from this image. Defaults to the SDK-matched MindWire runtime image. */\n image?: string;\n /** Image acquisition policy for a container MindWire creates. Defaults to pulling only when absent. */\n pull?: \"missing\" | \"always\" | \"never\";\n /** Attach to an existing container (id or name) instead of creating one. */\n container?: string;\n /** Extra options merged into `createContainer` (native dockerode/Docker API fields). */\n createOptions?: Record<string, unknown>;\n /** Port the in-container daemon binds (published to an ephemeral host port). */\n port?: number;\n /** `AGENT_TYPE` for the in-container daemon. Defaults to the client's agent, then `claude-code`. */\n agent?: string;\n /** `AGENT_CWD` — working directory agents run in, inside the container. */\n agentCwd?: string;\n /** Explicit path to a Linux `mindwired` to deploy (else resolved from the platform package). */\n daemonBin?: string;\n /** Upgrade an older daemon when idle; requires its service update capability. */\n autoUpdate?: boolean;\n /** On `close()`, stop + remove a container we created (attached containers are left running). */\n stopOnExit?: boolean;\n}\n\n/**\n * The Docker target. Returns a {@link Target} whose `connect()` creates (or attaches to) a container,\n * ensures `mindwired` runs inside it, and points the SDK at the published port.\n *\n * ```ts\n * new Mindwire({ agent: \"claude-code\", target: docker({ image: \"my/agent-image\" }) });\n * new Mindwire({ agent: \"claude-code\", target: docker({ container: \"my-running-box\" }) });\n * new Mindwire({ agent: \"claude-code\", target: docker({ image: \"x\", engine: { host: \"10.0.0.5\", port: 2375 } }) });\n * ```\n */\nexport function docker(config: DockerConfig = {}): Target {\n return { name: \"docker\", connect: (spec) => connectDocker(config, spec) };\n}\n\nconst DEFAULT_PORT = 8790;\nconst DEFAULT_AGENT = \"claude-code\";\nconst DEFAULT_AGENT_CWD = \"/root\";\nconst DEFAULT_RUNTIME_IMAGE = `ghcr.io/oblien/mindwire-runtime:${SDK_VERSION}`;\n\n// ---- minimal structural view of the `dockerode` package --------------------\n// Declared locally so the SDK typechecks and builds WITHOUT `dockerode` installed (optional peer).\n\ninterface DuplexLike {\n on(event: string, listener: (...args: unknown[]) => void): DuplexLike;\n}\n\ninterface ExecLike {\n start(opts: Record<string, unknown>): Promise<DuplexLike>;\n inspect(): Promise<{ ExitCode?: number; Running?: boolean }>;\n}\n\ninterface ContainerInspect {\n State?: { Running?: boolean };\n NetworkSettings?: { Ports?: Record<string, Array<{ HostIp?: string; HostPort?: string }> | null> };\n}\n\ninterface ContainerLike {\n readonly id: string;\n start(): Promise<unknown>;\n stop(): Promise<unknown>;\n remove(opts?: Record<string, unknown>): Promise<unknown>;\n inspect(): Promise<ContainerInspect>;\n exec(opts: Record<string, unknown>): Promise<ExecLike>;\n putArchive(file: Uint8Array, opts: { path: string }): Promise<unknown>;\n modem: { demuxStream(stream: DuplexLike, stdout: unknown, stderr: unknown): void };\n}\n\nexport interface DockerodeLike {\n getContainer(id: string): ContainerLike;\n getImage(name: string): { inspect(): Promise<unknown> };\n pull(name: string): Promise<DuplexLike>;\n createContainer(opts: Record<string, unknown>): Promise<ContainerLike>;\n}\n\ntype DockerodeCtor = new (opts?: unknown) => DockerodeLike;\n\n// ---- SandboxHost over a Docker container -----------------------------------\n\n/**\n * Bridges the backend-agnostic {@link SandboxHost} onto a Docker container: `exec` runs a command via\n * the exec API (demultiplexing the framed stdout/stderr stream), and `putFile` lands bytes via an\n * in-memory tar `putArchive`. The shared {@link ensureDaemon} cycle only ever sees these two.\n */\nclass DockerHost implements SandboxHost {\n constructor(private readonly container: ContainerLike) {}\n\n async exec(argv: string[]): Promise<{ exitCode?: number; stdout?: string; stderr?: string }> {\n const { Writable } = await import(\"node:stream\");\n const exec = await this.container.exec({ Cmd: argv, Env: [\"MINDWIRE_ISOLATION=container\"], AttachStdout: true, AttachStderr: true });\n const stream = await exec.start({ hijack: true, stdin: false });\n\n const out: Buffer[] = [];\n const err: Buffer[] = [];\n const sink = (arr: Buffer[]) =>\n new Writable({\n write(chunk: Buffer, _enc: unknown, cb: () => void) {\n arr.push(Buffer.from(chunk));\n cb();\n },\n });\n this.container.modem.demuxStream(stream, sink(out), sink(err));\n\n await new Promise<void>((resolve, reject) => {\n stream.on(\"end\", () => resolve());\n stream.on(\"close\", () => resolve());\n stream.on(\"error\", (e: unknown) => reject(e instanceof Error ? e : new Error(String(e))));\n });\n\n const info = await exec.inspect();\n return {\n exitCode: info.ExitCode,\n stdout: Buffer.concat(out).toString(\"utf8\"),\n stderr: Buffer.concat(err).toString(\"utf8\"),\n };\n }\n\n async putFile(path: string, data: Uint8Array, opts?: { mode?: string }): Promise<void> {\n const slash = path.lastIndexOf(\"/\");\n const dir = slash > 0 ? path.slice(0, slash) : \"/\";\n const base = path.slice(slash + 1);\n await this.exec([\"mkdir\", \"-p\", dir]); // putArchive extracts into an existing directory\n const tar = tarSingleFile(base, data, opts?.mode ?? \"0644\");\n await this.container.putArchive(tar, { path: dir });\n }\n}\n\n// ---- adapter entry points --------------------------------------------------\n\nasync function connectDocker(config: DockerConfig, spec: ConnectSpec): Promise<TargetHandle> {\n const Docker = await importDockerode();\n const instance = config.docker ?? new Docker(config.engine);\n // The in-container daemon's agent defaults to the client's default agent (config.agent wins).\n const merged: DockerConfig = { ...config, agent: config.agent ?? spec.agent };\n return provisionDocker(instance, merged, spec.onLog);\n}\n\n/**\n * The provisioning flow, decoupled from the `dockerode` import so it can be driven by an injected fake\n * in tests. Creates (or attaches to) a container, resolves its published host port, ensures the\n * daemon, and returns a handle pointed at `http://127.0.0.1:<hostPort>`.\n */\nexport async function provisionDocker(\n docker: DockerodeLike,\n config: DockerConfig = {},\n onLog?: (e: EnsureEvent) => void,\n): Promise<TargetHandle> {\n const port = config.port ?? DEFAULT_PORT;\n const agent = config.agent ?? DEFAULT_AGENT;\n const agentCwd = config.agentCwd ?? DEFAULT_AGENT_CWD;\n const created = config.container === undefined;\n\n // 1. Create or attach.\n let container: ContainerLike;\n if (config.container !== undefined) {\n container = docker.getContainer(config.container);\n } else {\n const image = config.image ?? DEFAULT_RUNTIME_IMAGE;\n await ensureImage(docker, image, config.pull ?? \"missing\", onLog);\n const portKey = `${port}/tcp`;\n container = await docker.createContainer({\n // The runtime image starts mindwired itself. Do not replace its command: doing so turns the\n // image ENTRYPOINT into `mindwired sleep infinity` and prevents the runtime from starting.\n Image: image,\n Env: [`ADDR=:${port}`, `AGENT_TYPE=${agent}`, `AGENT_CWD=${agentCwd}`, \"MINDWIRE_ISOLATION=container\"],\n Tty: false,\n ExposedPorts: { [portKey]: {} },\n HostConfig: { PortBindings: { [portKey]: [{ HostPort: \"0\" }] } },\n ...(config.createOptions ?? {}),\n });\n }\n\n // 2. Start (idempotent — tolerate an already-running container).\n await container.start().catch(() => {});\n\n // 3. Resolve the published ephemeral host port.\n const info = await container.inspect();\n const binding = info.NetworkSettings?.Ports?.[`${port}/tcp`];\n const hostPort = binding?.[0]?.HostPort;\n if (!hostPort) {\n throw new MindwireError(\n `mindwire: the Docker container does not publish a host port for ${port}/tcp. ` +\n (created\n ? \"This is unexpected for a container mindwire created.\"\n : \"Attach to a container started with that port published (e.g. `-p 0:\" + port + \"`).\"),\n );\n }\n\n // 4. Ensure the daemon inside the container.\n const token = await ensureDaemon(new DockerHost(container), {\n port,\n agent,\n agentCwd,\n daemonBin: config.daemonBin,\n autoUpdate: config.autoUpdate,\n target: \"docker\",\n onLog,\n });\n\n const stop = async (): Promise<void> => {\n if (!config.stopOnExit) return;\n if (!created) return; // attached container — leave it running\n try {\n await container.stop().catch(() => {});\n await container.remove({ force: true });\n } catch {\n // best-effort teardown\n }\n };\n\n // Plain direct HTTP — no proxy, no token; the client's default fetch is used.\n return { id: container.id, baseUrl: `http://127.0.0.1:${hostPort}`, token, stop };\n}\n\n/** Ensure a created-container image exists locally. Docker does not pull automatically on create. */\nasync function ensureImage(\n docker: DockerodeLike,\n image: string,\n policy: NonNullable<DockerConfig[\"pull\"]>,\n onLog?: (e: EnsureEvent) => void,\n): Promise<void> {\n const emit = (message: string, error?: string) => {\n try {\n onLog?.({ phase: \"pull\", target: \"docker\", message, ...(error ? { error } : {}) });\n } catch {\n // Provisioning logs must never affect the provisioning path.\n }\n };\n if (policy === \"never\") return;\n if (policy === \"missing\") {\n try {\n await docker.getImage(image).inspect();\n return;\n } catch {\n // Docker's 404 is expected here: pull before create rather than surfacing an opaque create error.\n }\n }\n emit(`pulling runtime image ${image}`);\n try {\n const stream = await docker.pull(image);\n await new Promise<void>((resolve, reject) => {\n stream.on(\"end\", () => resolve());\n stream.on(\"close\", () => resolve());\n stream.on(\"error\", (error: unknown) => reject(error));\n });\n emit(`runtime image ready: ${image}`);\n } catch (error) {\n const detail = error instanceof Error ? error.message : String(error);\n emit(`failed to pull runtime image ${image}`, detail);\n throw new MindwireError(`mindwire: failed to pull Docker image ${image}: ${detail}`, { cause: error });\n }\n}\n\n// ---- in-memory tar (single file) -------------------------------------------\n\n/** Build a minimal POSIX ustar archive holding one regular file, ready for `container.putArchive`. */\nfunction tarSingleFile(name: string, data: Uint8Array, mode: string): Uint8Array {\n const header = Buffer.alloc(512, 0);\n header.write(name.slice(0, 100), 0, \"utf8\");\n header.write(octal(parseInt(mode, 8) || 0o644, 8), 100, \"utf8\"); // mode\n header.write(octal(0, 8), 108, \"utf8\"); // uid\n header.write(octal(0, 8), 116, \"utf8\"); // gid\n header.write(octal(data.length, 12), 124, \"utf8\"); // size\n header.write(octal(0, 12), 136, \"utf8\"); // mtime (epoch — deterministic)\n header.write(\" \", 148, \"utf8\"); // checksum placeholder: 8 spaces\n header.write(\"0\", 156, \"utf8\"); // typeflag: regular file\n header.write(\"ustar\\0\", 257, \"latin1\"); // magic\n header.write(\"00\", 263, \"utf8\"); // version\n\n let sum = 0;\n for (const b of header) sum += b;\n header.write(sum.toString(8).padStart(6, \"0\") + \"\\0 \", 148, \"latin1\"); // computed checksum\n\n const body = Buffer.from(data);\n const pad = (512 - (body.length % 512)) % 512;\n // header + body (padded to 512) + two zero blocks (end-of-archive marker)\n return Buffer.concat([header, body, Buffer.alloc(pad), Buffer.alloc(1024)]);\n}\n\n/** Right-justified, zero-padded octal in a `len`-byte field: `len-1` digits + a NUL terminator. */\nfunction octal(n: number, len: number): string {\n return n\n .toString(8)\n .padStart(len - 1, \"0\")\n .slice(-(len - 1)) + \"\\0\";\n}\n\n// ---- lazy import -----------------------------------------------------------\n\nasync function importDockerode(): Promise<DockerodeCtor> {\n // `@vite-ignore` silences Vite/Rollup's \"dynamic import cannot be analyzed\" warning for browser\n // consumers that pull the barrel in for `remote()` only (this path is never reached in a browser).\n const spec = \"dockerode\";\n try {\n const mod = (await import(/* @vite-ignore */ spec)) as unknown as { default?: DockerodeCtor } & DockerodeCtor;\n return (mod.default ?? mod) as DockerodeCtor;\n } catch (err) {\n throw new MindwireError(\n \"mindwire: the Docker sandbox adapter needs the optional `dockerode` package. Install it \" +\n \"(`npm i dockerode`). It's an optional peer dependency, so the core SDK stays dependency-free.\",\n { cause: err },\n );\n }\n}\n","// The Oblien sandbox adapter — the default {@link SandboxAdapter}. The mindwire daemon runs *inside an\n// Oblien workspace* (a microVM) and the SDK reaches it through the `oblien` package's runtime proxy\n// (`rt.proxy(port).fetch`) instead of loopback — the same path pocket-agent uses to reach its in-VM\n// daemon, and it carries SSE unchanged. The `oblien` SDK owns the proxy URL and gateway JWT. Because\n// that proxy reserves `Authorization` for its own JWT, the daemon credential is forwarded separately\n// as `X-Mindwire-Token`; on a `401` this adapter re-acquires the runtime (`{force:true}`) and retries\n// once. Every existing SDK method works unchanged — only the transport swaps.\n//\n// The `oblien` package is an OPTIONAL peer dependency, lazily `import()`-ed only in `connect()` — so\n// merely importing mindwire (or calling the `oblien()` factory, which just stores config) never loads\n// it. This mirrors embedded.ts's lazy `import(\"node:child_process\")`.\nimport { MindwireError } from \"../errors.js\";\nimport type { FetchLike } from \"../http.js\";\nimport { ensureDaemon, type SandboxHost, type EnsureEvent } from \"./host.js\";\nimport type { Target, TargetHandle, ConnectSpec } from \"./index.js\";\n\n/**\n * Config for the Oblien target — auth + endpoint plus the workspace/daemon provisioning knobs. Only\n * `clientId`/`clientSecret`/`baseUrl` are about reaching Oblien; everything else describes the\n * workspace to provision and the daemon to run in it. Credentials fall back to the environment (see\n * {@link connectOblien}); the daemon's `agent` falls back to the client's default agent.\n */\nexport interface OblienConfig {\n /** Sandbox client id. Falls back to `MINDWIRE_SANDBOX_CLIENT_ID`, then `OBLIEN_CLIENT_ID`. */\n clientId?: string;\n /** Sandbox client secret. Falls back to `MINDWIRE_SANDBOX_CLIENT_SECRET`, then `OBLIEN_CLIENT_SECRET`. */\n clientSecret?: string;\n /** Management-API base. Defaults to the `oblien` SDK default. */\n baseUrl?: string;\n /** `AGENT_TYPE` for the in-workspace daemon. Defaults to the client's agent, then `claude-code`. */\n agent?: string;\n /** `AGENT_CWD` — working directory agents run in, inside the workspace. */\n agentCwd?: string;\n /** Loopback port the in-workspace daemon listens on. */\n port?: number;\n /** Explicit local `mindwired` to deploy. `{os}`/`{arch}` expand to the workspace platform. */\n daemonBin?: string;\n /** Upgrade an older daemon when idle; requires its service update capability. Off by default. */\n autoUpdate?: boolean;\n /** Replace even a healthy version match while idle. Use only with a local development binary. */\n forceDeploy?: boolean;\n /** On `close()`, tear the workspace down (delete one we created / stop one we reused). */\n stopOnExit?: boolean;\n /** Image for a new workspace. Ideally one that already runs `mindwired` and ships the target agent CLI. */\n image?: string;\n /** Name for a new workspace. */\n name?: string;\n /** Reuse an existing workspace instead of creating one (skips the cold-start provision). */\n workspaceId?: string;\n /** vCPUs for a new workspace. */\n cpus?: number;\n /** Memory (MB) for a new workspace. */\n memoryMb?: number;\n /** Disk (MB) for a new workspace. */\n diskMb?: number;\n /** Existing MindWire daemon bearer token for this workspace. Reuse it to probe without redeploying. */\n daemonToken?: string;\n /** Called as soon as the workspace identity is known, before daemon installation begins. */\n onWorkspace?: (workspaceId: string) => void | Promise<void>;\n /** Lifecycle: `temporary` (auto-reaped) or `permanent`. */\n mode?: \"temporary\" | \"permanent\";\n}\n\n/**\n * The Oblien target. Returns a {@link Target} whose `connect()` provisions (or reuses) an Oblien\n * workspace, ensures `mindwired` runs inside it, and points the SDK at the runtime proxy. The\n * `oblien` npm peer is only touched inside `connect()`.\n *\n * ```ts\n * new Mindwire({ agent: \"claude-code\", target: oblien({ clientId, clientSecret }) });\n * ```\n */\nexport function oblien(config: OblienConfig = {}): Target {\n return { name: \"oblien\", connect: (spec) => connectOblien(config, spec) };\n}\n\nconst DEFAULT_PORT = 8790;\nconst DEFAULT_IMAGE = \"node-22\";\nconst DEFAULT_AGENT = \"claude-code\";\nconst DEFAULT_AGENT_CWD = \"/root\";\n// The `Http` layer builds `<baseUrl><path>`; this sentinel host is stripped back to `path + search`\n// by the fetch shim before it hands the request to `rt.proxy`. It never hits the network directly.\nconst SENTINEL_BASE = \"http://mindwire-sandbox.local\";\n\n// ---- minimal structural view of the `oblien` package -----------------------\n// Declared locally so the SDK typechecks and builds WITHOUT `oblien` installed (it's an optional\n// peer). Only the members this adapter calls are modeled; everything else is ignored.\n\ninterface OblienExecResult {\n exit_code?: number;\n stdout?: string;\n stderr?: string;\n error?: string;\n status?: string;\n}\n\ninterface OblienExecParams {\n execMode?: \"auto\" | \"shell\" | \"direct\";\n timeoutSeconds?: number;\n keepLogs?: boolean;\n}\n\ninterface RuntimeProxyLike {\n /** Reverse-proxy a request to `127.0.0.1:<port>` inside the workspace. SSE/streaming passes through. */\n fetch(input: string, init?: RequestInit): Promise<Response>;\n}\n\ninterface RuntimeLike {\n exec: { run(cmd: string[], params?: OblienExecParams): Promise<OblienExecResult> };\n files: {\n write(params: {\n fullPath: string;\n content: string;\n createDirs?: boolean;\n append?: boolean;\n mode?: string;\n }): Promise<unknown>;\n };\n proxy(port: number, host?: string): RuntimeProxyLike;\n}\n\ninterface WorkspaceHandleLike {\n id: string;\n start(params?: { force?: boolean }): Promise<unknown>;\n stop(): Promise<unknown>;\n delete(): Promise<unknown>;\n runtime(options?: { force?: boolean }): Promise<RuntimeLike>;\n}\n\ninterface OblienClientLike {\n workspaces: { create(params: Record<string, unknown>): Promise<{ id: string }> };\n workspace(id: string): WorkspaceHandleLike;\n}\n\ninterface OblienModule {\n default: new (opts: Record<string, unknown>) => OblienClientLike;\n}\n\n// ---- SandboxHost over the Oblien runtime -----------------------------------\n\n/**\n * Bridges the backend-agnostic {@link SandboxHost} onto the Oblien runtime: `exec` runs a command via\n * the runtime exec API (normalizing its snake_case result), and `putFile` lands bytes by writing them\n * base64-encoded through the files API and decoding in-VM (the runtime exec has no inbound binary\n * channel). The shared {@link ensureDaemon} cycle only ever sees these two primitives.\n */\nclass OblienHost implements SandboxHost {\n constructor(private readonly rt: RuntimeLike) {}\n\n async exec(argv: string[], opts?: { timeoutSeconds?: number }): Promise<{\n exitCode?: number;\n stdout?: string;\n stderr?: string;\n error?: string;\n }> {\n const r = await this.rt.exec.run(argv, {\n execMode: \"direct\",\n timeoutSeconds: opts?.timeoutSeconds,\n keepLogs: true,\n });\n return { exitCode: r.exit_code, stdout: r.stdout, stderr: r.stderr, error: r.error };\n }\n\n async putFile(path: string, data: Uint8Array, opts?: { mode?: string }): Promise<void> {\n const b64 = Buffer.from(data).toString(\"base64\");\n const b64Path = `${path}.b64`;\n await this.rt.files.write({ fullPath: b64Path, content: b64, createDirs: true });\n const mode = opts?.mode ?? \"0644\";\n await this.rt.exec.run(\n [\"bash\", \"-lc\", `base64 -d ${b64Path} > ${path} && chmod ${mode} ${path} && rm -f ${b64Path}`],\n { execMode: \"direct\", timeoutSeconds: 30, keepLogs: true },\n );\n }\n}\n\n// ---- adapter entry points --------------------------------------------------\n\n/**\n * Resolve credentials (config → `MINDWIRE_SANDBOX_*` → `OBLIEN_*`), lazily import the optional\n * `oblien` peer, construct the client, and provision. Split out so {@link provisionOblien} can be\n * driven by an injected client in tests without importing `oblien`.\n */\nasync function connectOblien(config: OblienConfig, spec: ConnectSpec): Promise<TargetHandle> {\n const clientId = config.clientId ?? env(\"MINDWIRE_SANDBOX_CLIENT_ID\") ?? env(\"OBLIEN_CLIENT_ID\");\n const clientSecret =\n config.clientSecret ?? env(\"MINDWIRE_SANDBOX_CLIENT_SECRET\") ?? env(\"OBLIEN_CLIENT_SECRET\");\n if (!clientId || !clientSecret) {\n throw new MindwireError(\n \"mindwire: the Oblien target needs credentials — pass oblien({ clientId, clientSecret }) \" +\n \"or set MINDWIRE_SANDBOX_CLIENT_ID / MINDWIRE_SANDBOX_CLIENT_SECRET (OBLIEN_CLIENT_ID / \" +\n \"OBLIEN_CLIENT_SECRET are also accepted).\",\n );\n }\n const mod = await importOblien();\n const client = new mod.default({\n clientId,\n clientSecret,\n ...(config.baseUrl ? { baseUrl: config.baseUrl } : {}),\n });\n // The daemon's agent defaults to the client's default agent (an explicit config.agent wins).\n return provisionOblien(client, { ...config, agent: config.agent ?? spec.agent }, spec.onLog);\n}\n\n/**\n * The provisioning flow, decoupled from the `oblien` import so it can be driven by an injected client\n * (used by the unit tests, and available for advanced embedding). Provisions/reuses a workspace,\n * ensures the daemon, and returns a handle whose `fetch` routes every request through the runtime\n * proxy (re-acquiring the runtime and retrying once on a `401`).\n */\nexport async function provisionOblien(\n client: OblienClientLike,\n config: OblienConfig = {},\n onLog?: (e: EnsureEvent) => void,\n): Promise<TargetHandle & { workspaceId: string }> {\n const port = config.port ?? DEFAULT_PORT;\n const agent = config.agent ?? DEFAULT_AGENT;\n const agentCwd = config.agentCwd ?? DEFAULT_AGENT_CWD;\n const created = config.workspaceId === undefined;\n\n // 1. Provision (or reuse) the workspace.\n let workspaceId = config.workspaceId;\n if (workspaceId === undefined) {\n const params: Record<string, unknown> = {\n image: config.image ?? DEFAULT_IMAGE,\n mode: config.mode ?? \"temporary\",\n };\n if (config.name !== undefined) params[\"name\"] = config.name;\n if (config.cpus !== undefined) params[\"cpus\"] = config.cpus;\n if (config.memoryMb !== undefined) params[\"memory_mb\"] = config.memoryMb;\n if (config.diskMb !== undefined) params[\"disk_size_mb\"] = config.diskMb;\n const ws = await client.workspaces.create(params);\n workspaceId = ws.id;\n }\n // Persist/capture the workspace before any install happens. If a browser disconnects or the\n // control plane restarts mid-ensure, a later ensure can safely resume this exact workspace instead\n // of creating an orphaned second one.\n await config.onWorkspace?.(workspaceId);\n const handle = client.workspace(workspaceId);\n\n // 2. Start it (idempotent — tolerate an already-running workspace).\n await handle.start().catch(() => {});\n\n // 3. Ensure the daemon is running inside the VM.\n let rt = await handle.runtime();\n const token = await ensureDaemon(new OblienHost(rt), {\n port,\n agent,\n agentCwd,\n daemonBin: config.daemonBin,\n autoUpdate: config.autoUpdate,\n forceDeploy: config.forceDeploy,\n target: \"oblien\",\n onLog,\n token: config.daemonToken,\n });\n\n // 4. Transport: route both unary and SSE through the runtime proxy. Oblien reserves Authorization\n // for its gateway JWT and strips it before forwarding, so carry the daemon's credential in the\n // dedicated forwarded header instead. On a 401 (expired gateway JWT) re-acquire the runtime and\n // retry once.\n const fetchImpl: FetchLike = async (url, init) => {\n const { pathname, search } = new URL(url);\n const path = pathname + search;\n const headers = new Headers(init?.headers);\n headers.set(\"X-Mindwire-Token\", token);\n // RuntimeProxy owns Authorization and replaces it with the workspace gateway JWT. Removing the\n // daemon token here avoids relying on a header that cannot reach mindwired.\n headers.delete(\"Authorization\");\n let res = await rt.proxy(port).fetch(path, { ...init, headers });\n if (res.status === 401) {\n rt = await handle.runtime({ force: true });\n res = await rt.proxy(port).fetch(path, { ...init, headers });\n }\n return res;\n };\n\n const stop = async (): Promise<void> => {\n if (!config.stopOnExit) return;\n try {\n // We created it → delete; reusing a caller's workspace → only stop it.\n await (created ? handle.delete() : handle.stop());\n } catch {\n // best-effort teardown\n }\n };\n\n return { id: workspaceId, workspaceId, baseUrl: SENTINEL_BASE, token, fetch: fetchImpl, stop };\n}\n\n// ---- lazy import + small helpers -------------------------------------------\n\nasync function importOblien(): Promise<OblienModule> {\n // A variable specifier keeps `tsc` from statically resolving (and erroring on) the optional peer,\n // and keeps bundlers from trying to inline it — it stays a runtime dynamic import. `@vite-ignore`\n // silences Vite/Rollup's \"dynamic import cannot be analyzed\" warning for browser consumers.\n const spec = \"oblien\";\n try {\n return (await import(/* @vite-ignore */ spec)) as unknown as OblienModule;\n } catch (err) {\n throw new MindwireError(\n \"mindwire: sandbox mode with the default (Oblien) adapter needs the optional `oblien` package. \" +\n \"Install it (`npm i oblien`). It's an optional peer dependency, so the core SDK stays \" +\n \"dependency-free.\",\n { cause: err },\n );\n }\n}\n\nfunction env(key: string): string | undefined {\n const proc = (globalThis as { process?: { env?: Record<string, string | undefined> } }).process;\n return proc?.env?.[key];\n}\n","/**\n * The models.dev catalog — the reference list of which providers and models exist.\n *\n * This is deliberately NOT bundled: models.dev is a hosted JSON API and staying its client (rather than\n * embedding a snapshot) is the whole point — the list is always current, and the SDK stays a thin catalog\n * client with no committed multi-megabyte blob. The raw feed (`https://models.dev/api.json`, ~2 MB across\n * ~190 providers) is fetched once per process, projected to {@link CatalogProvider}/{@link ModelInfo}, and\n * memoized with a soft TTL. Uses `globalThis.fetch`, so it works in Node and the browser.\n *\n * This is pure catalog data — \"which models exist\" — and knows nothing about the daemon, a selected agent,\n * or which providers are configured/authenticated. The daemon's job is only to relay a chosen provider's\n * settings to the harness; the catalog lives here.\n */\nimport type { CatalogProvider, ModelInfo, ModelCost } from \"../types.js\";\n\n/** The canonical models.dev catalog endpoint. */\nexport const MODELS_DEV_URL = \"https://models.dev/api.json\";\n\n/** How long a fetched catalog is reused before the next call re-fetches. */\nconst TTL_MS = 6 * 60 * 60 * 1000; // 6h — models.dev changes rarely; this just bounds staleness.\n\n/** Options accepted by every catalog function. All optional; defaults hit models.dev via global fetch. */\nexport interface CatalogOptions {\n /** Override the endpoint (e.g. a mirror or a pinned snapshot). Defaults to {@link MODELS_DEV_URL}. */\n url?: string;\n /** Override the fetch implementation (tests, a proxy transport). Defaults to `globalThis.fetch`. */\n fetch?: typeof globalThis.fetch;\n /** Abort signal for the underlying request. */\n signal?: AbortSignal;\n}\n\n// ---- raw models.dev shape (only the fields we read) --------------------------------------------------\n\ninterface RawModel {\n id?: string;\n name?: string;\n reasoning?: boolean;\n tool_call?: boolean;\n attachment?: boolean;\n limit?: { context?: number; output?: number };\n modalities?: { input?: string[]; output?: string[] };\n cost?: { input?: number; output?: number; cache_read?: number; cache_write?: number };\n}\ninterface RawProvider {\n id?: string;\n name?: string;\n env?: string[];\n npm?: string;\n api?: string;\n doc?: string;\n models?: Record<string, RawModel>;\n}\ntype RawFeed = Record<string, RawProvider>;\n\n// ---- projection ---------------------------------------------------------------------------------------\n\nfunction toCost(c: RawModel[\"cost\"]): ModelCost | undefined {\n if (!c) return undefined;\n const cost: ModelCost = {};\n if (typeof c.input === \"number\") cost.input = c.input;\n if (typeof c.output === \"number\") cost.output = c.output;\n if (typeof c.cache_read === \"number\") cost.cacheRead = c.cache_read;\n if (typeof c.cache_write === \"number\") cost.cacheWrite = c.cache_write;\n return Object.keys(cost).length ? cost : undefined;\n}\n\nfunction toModel(providerId: string, id: string, m: RawModel): ModelInfo {\n const info: ModelInfo = { id: m.id ?? id, label: m.name || (m.id ?? id), provider: providerId };\n if (m.limit?.context) info.contextWindow = m.limit.context;\n if (m.limit?.output) info.maxOutput = m.limit.output;\n if (m.modalities?.input?.length) info.inputModalities = m.modalities.input;\n if (m.modalities?.output?.length) info.outputModalities = m.modalities.output;\n if (m.reasoning) info.reasoning = true;\n if (m.tool_call) info.toolCall = true;\n if (m.attachment) info.attachment = true;\n const cost = toCost(m.cost);\n if (cost) info.cost = cost;\n return info;\n}\n\nfunction project(feed: RawFeed): CatalogProvider[] {\n const providers: CatalogProvider[] = [];\n for (const [pid, prov] of Object.entries(feed ?? {})) {\n if (!prov || typeof prov !== \"object\") continue;\n const id = prov.id ?? pid;\n const models = Object.entries(prov.models ?? {})\n .map(([mid, m]) => toModel(id, mid, m))\n .sort((a, b) => a.label.localeCompare(b.label) || a.id.localeCompare(b.id));\n providers.push({\n id,\n name: prov.name || id,\n env: Array.isArray(prov.env) ? prov.env.filter((v): v is string => typeof v === \"string\" && !!v) : [],\n ...(prov.npm ? { npm: prov.npm } : {}),\n ...(prov.api ? { api: prov.api } : {}),\n ...(prov.doc ? { doc: prov.doc } : {}),\n models,\n });\n }\n return providers.sort((a, b) => a.name.localeCompare(b.name));\n}\n\n// ---- fetch + memoize ----------------------------------------------------------------------------------\n\nlet cache: { url: string; at: number; data: CatalogProvider[] } | null = null;\nlet inflight: Promise<CatalogProvider[]> | null = null;\n\n/**\n * Load (and memoize) the full models.dev catalog, projected to {@link CatalogProvider}[] sorted by name.\n * Cached in-process for {@link TTL_MS}; concurrent calls share one in-flight request. Throws if the fetch\n * fails or returns a non-2xx — callers (and the console) surface that as an error state.\n */\nexport async function loadCatalog(opts: CatalogOptions = {}): Promise<CatalogProvider[]> {\n const url = opts.url ?? MODELS_DEV_URL;\n if (cache && cache.url === url && Date.now() - cache.at < TTL_MS) return cache.data;\n if (inflight) return inflight;\n\n const doFetch = opts.fetch ?? globalThis.fetch;\n if (typeof doFetch !== \"function\") {\n throw new Error(\"no fetch implementation available — pass CatalogOptions.fetch\");\n }\n\n inflight = (async () => {\n const res = await doFetch(url, { headers: { accept: \"application/json\" }, signal: opts.signal });\n if (!res.ok) throw new Error(`models.dev catalog fetch failed: ${res.status} ${res.statusText}`);\n const data = project((await res.json()) as RawFeed);\n cache = { url, at: Date.now(), data };\n return data;\n })();\n try {\n return await inflight;\n } finally {\n inflight = null;\n }\n}\n\n/** Every provider in the models.dev catalog, each with its models, sorted by provider name. */\nexport function catalogProviders(opts?: CatalogOptions): Promise<CatalogProvider[]> {\n return loadCatalog(opts);\n}\n\n/** One provider by id (e.g. `\"openai\"`), or `undefined` if the catalog has no such provider. */\nexport async function catalogProvider(id: string, opts?: CatalogOptions): Promise<CatalogProvider | undefined> {\n return (await loadCatalog(opts)).find((p) => p.id === id);\n}\n\n/** Flat list of models — all providers, or just one when `provider` is given. */\nexport async function catalogModels(provider?: string, opts?: CatalogOptions): Promise<ModelInfo[]> {\n const providers = await loadCatalog(opts);\n if (provider) return providers.find((p) => p.id === provider)?.models ?? [];\n return providers.flatMap((p) => p.models);\n}\n\n/** A single model by (provider, id), or `undefined` if absent. */\nexport async function lookupModel(\n provider: string,\n id: string,\n opts?: CatalogOptions,\n): Promise<ModelInfo | undefined> {\n return (await catalogProvider(provider, opts))?.models.find((m) => m.id === id);\n}\n\n/** Drop the in-process cache so the next call re-fetches. Mainly for tests and manual refresh. */\nexport function clearCatalogCache(): void {\n cache = null;\n inflight = null;\n}\n","/**\n * mindwire — a typed TypeScript client for the mindwire daemon.\n *\n * One SDK for every coding-agent harness (Claude Code, Codex, Grok Build, opencode). The\n * daemon normalizes each agent to a single protocol; this package is a thin, dependency-free\n * client over its REST + SSE surface.\n */\n\nexport { Mindwire, AuthApi, PromptsApi, McpApi, ProvidersApi, NotifyApi } from \"./client.js\";\nexport type { MindwireOptions, AgentScoped } from \"./client.js\";\n\nexport { Run } from \"./run.js\";\nexport type { StreamOptions, WaitResult } from \"./run.js\";\n\nexport { Http } from \"./http.js\";\nexport type { HttpOptions, FetchLike, RequestInitLike, BaseResolver, TokenGetter } from \"./http.js\";\n\nexport { startEmbedded } from \"./embedded.js\";\nexport type { EmbeddedOptions, EmbeddedDaemon } from \"./embedded.js\";\n\n// Destinations — where the daemon runs and how the SDK reaches it. `local`/`remote` are the\n// dependency-free built-ins; `ssh`/`docker`/`oblien` each ensure a daemon on a box/container/workspace\n// (their provider peers `ssh2`/`dockerode`/`oblien` load lazily, only when you call the factory).\nexport { local, remote } from \"./target/index.js\";\nexport type { Target, TargetHandle, ConnectSpec, RemoteOptions } from \"./target/index.js\";\nexport { ssh, provisionSsh, provisionSshContainer } from \"./target/ssh.js\";\nexport type { SshOptions, SshProvisionConfig, SshContainerProvisionConfig } from \"./target/ssh.js\";\nexport { docker, provisionDocker } from \"./target/docker.js\";\nexport type { DockerConfig, DockerEngineOptions, DockerodeLike } from \"./target/docker.js\";\nexport { oblien, provisionOblien } from \"./target/oblien.js\";\nexport type { OblienConfig } from \"./target/oblien.js\";\nexport { provisionContainer, ContainerHost } from \"./target/container.js\";\nexport type { ContainerConfig, ContainerHandle } from \"./target/container.js\";\nexport { ensureDaemon, resolveLinuxDaemon } from \"./target/host.js\";\nexport type { SandboxHost, ExecResult, EnsureDaemonConfig, EnsureEvent } from \"./target/host.js\";\nexport { SDK_VERSION } from \"./version.js\";\nexport { ensureDaemonBinary } from \"./daemon-binary.js\";\nexport type { EnsureDaemonBinaryOptions, DaemonPlatform, DaemonArch } from \"./daemon-binary.js\";\n\n// The models.dev catalog — fetched live, never bundled. Pure \"which providers/models exist\" reference\n// data; knows nothing about the daemon or a selected agent.\nexport {\n catalogProviders,\n catalogProvider,\n catalogModels,\n lookupModel,\n loadCatalog,\n clearCatalogCache,\n MODELS_DEV_URL,\n} from \"./catalog/index.js\";\nexport type { CatalogOptions } from \"./catalog/index.js\";\n\nexport { MindwireError, ApiError, RunFailedError, TimeoutError } from \"./errors.js\";\n\nexport * from \"./types.js\";\nexport { ServiceApi } from \"./service.js\";\nexport type { ServiceUpdateState, ServiceUpdateLease } from \"./service.js\";\nexport { WorkspaceApi, WorkspaceCollection, ProjectOperationsApi, GitAccessApi } from \"./workspace.js\";\nexport type { ProjectRequest, ProjectAuth, ProjectOperation, ProjectRemoveRequest,\n GitConnection, GitAccessState, ProjectGitState, GitAction, GitIdentity, GitIdentityScope, GitIdentitySettings,\n GitIdentityUpdate, GitOperationRequest, GitOperation } from \"./workspace.js\";\nexport type { WorkspaceRecord, WorkspaceAgent, WorkspaceProject, WorkspaceChat, WorkspaceKind,\n WorkspaceInput, WorkspaceImport, WorkspaceSnapshot } from \"./workspace.js\";\n\nexport * from \"./surfaces.js\";\nexport * from \"./execution.js\";\nexport * from \"./computer.js\";\n"]}
|