mindwire 0.1.23 → 0.1.24
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 -3
- package/dist/cli.js.map +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.js +1 -1
- package/package.json +1 -1
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/computer.ts","../src/version.ts","../src/http.ts","../src/sse.ts","../src/run.ts","../src/workspace.ts","../src/surfaces.ts","../src/service.ts","../src/execution.ts","../src/daemon-binary.ts","../src/embedded.ts","../src/target/index.ts","../src/client.ts","../src/computer/cloudflare-binary.ts","../src/computer/relay.ts","../src/computer/lifecycle.ts","../src/cli.ts"],"names":["path","payload","binaryCacheDirectory","cachedExecutable","cacheExecutable","spawn","randomBytes","fs","resolve","delay","path3","emit","client"],"mappings":"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","file":"cli.js","sourcesContent":["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","// 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","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","// 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","// 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","// 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","import { execFile } from \"node:child_process\";\nimport { mkdtemp, writeFile, rm } from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport * as path from \"node:path\";\nimport { promisify } from \"node:util\";\nimport { binaryCacheDirectory, cachedExecutable, cacheExecutable, executableChecksum, verifyReleaseBytes } from \"../binary-cache.js\";\n\n// The bridge was tested against this release. The helper never updates itself or\n// changes a system installation; a newer Mindwire release can advance this pin.\nexport const CLOUDFLARED_VERSION = \"2026.9.3\";\nconst execute = promisify(execFile);\n\nexport async function ensureCloudflareBinary(options: {\n cacheDir?: string; platform?: string; arch?: string; fetch?: typeof fetch;\n onProgress?: (message: string) => void | Promise<void>;\n} = {}): Promise<string> {\n const platform = options.platform ?? process.platform, arch = options.arch ?? process.arch;\n const cpu = arch === \"x64\" ? \"amd64\" : arch === \"arm64\" ? \"arm64\" : \"\";\n if (!cpu || ![\"darwin\", \"linux\", \"win32\"].includes(platform) || platform === \"win32\" && cpu !== \"amd64\") {\n throw new Error(\"Install cloudflared for this computer, or select another connection provider.\");\n }\n const asset = `cloudflared-${platform === \"win32\" ? \"windows\" : platform}-${cpu}${platform === \"darwin\" ? \".tgz\" : platform === \"win32\" ? \".exe\" : \"\"}`;\n const bin = path.join(options.cacheDir ?? await binaryCacheDirectory(), \"cloudflared\", CLOUDFLARED_VERSION,\n `${platform}-${arch}`, platform === \"win32\" ? \"cloudflared.exe\" : \"cloudflared\");\n const cached = await cachedExecutable(bin);\n if (cached) return cached;\n await options.onProgress?.(\"Downloading the secure connection helper…\");\n const request = options.fetch ?? fetch;\n const release = await request(`https://api.github.com/repos/cloudflare/cloudflared/releases/tags/${CLOUDFLARED_VERSION}`,\n { headers: { Accept: \"application/vnd.github+json\" }, signal: AbortSignal.timeout(20_000) });\n if (!release.ok) throw new Error(\"Couldn't download the connection helper. Retry, install cloudflared yourself, or choose another provider.\");\n const metadata = await release.json() as { assets?: { name: string; digest?: string; browser_download_url: string }[] };\n const item = metadata.assets?.find(value => value.name === asset);\n const checksum = item?.digest?.match(/^sha256:([a-f0-9]{64})$/i)?.[1];\n const expectedURL = `https://github.com/cloudflare/cloudflared/releases/download/${CLOUDFLARED_VERSION}/${asset}`;\n if (!checksum || item?.browser_download_url !== expectedURL) throw new Error(\"The connection helper has no verified release asset for this computer.\");\n const downloaded = await request(expectedURL, { signal: AbortSignal.timeout(120_000) });\n if (!downloaded.ok) throw new Error(\"Couldn't download the connection helper. Check your internet connection and retry.\");\n const archive = new Uint8Array(await downloaded.arrayBuffer());\n await verifyReleaseBytes(archive, checksum, asset);\n let executable = archive;\n if (platform === \"darwin\") {\n const temporary = await mkdtemp(path.join(tmpdir(), \"mindwire-cloudflared-\"));\n try {\n const archivePath = path.join(temporary, asset);\n await writeFile(archivePath, archive, { mode: 0o600 });\n // Read only this exact archive member to stdout. No archive paths are\n // extracted into the filesystem and no downloaded script is executed.\n const result = await execute(\"/usr/bin/tar\", [\"-xzOf\", archivePath, \"cloudflared\"],\n { encoding: \"buffer\", maxBuffer: 128 * 1024 * 1024, timeout: 30_000 });\n executable = new Uint8Array(result.stdout);\n } finally { await rm(temporary, { recursive: true, force: true }); }\n }\n return cacheExecutable(bin, executable, await executableChecksum(executable));\n}\n\nexport async function cloudflareCommand(options: Parameters<typeof ensureCloudflareBinary>[0]): Promise<string> {\n try {\n await execute(\"cloudflared\", [\"--version\"], { timeout: 3000, windowsHide: true });\n return \"cloudflared\";\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") throw new Error(\"The installed cloudflared could not start. Repair it or choose another connection provider.\");\n return ensureCloudflareBinary(options);\n }\n}\n","import { spawn, type ChildProcess } from \"node:child_process\";\nimport { readFile } from \"node:fs/promises\";\nimport type { ComputerRoute } from \"../computer.js\";\nimport { cloudflareCommand } from \"./cloudflare-binary.js\";\n\nexport interface RelayOptions {\n kind: \"none\" | \"cloudflare\" | \"ngrok\" | \"custom\";\n /** A stable, already configured hostname; custom relays must forward WebSocket upgrades. */\n url?: string;\n cloudflareTokenFile?: string;\n}\nexport interface RelayHandle { route?: ComputerRoute; process?: ChildProcess; close(): void }\n\nexport function websocketURL(value: string): string {\n const url = new URL(value);\n if (url.protocol === \"https:\") url.protocol = \"wss:\";\n if (url.protocol !== \"wss:\" || !url.hostname || url.username || url.password || url.hash) {\n throw new Error(\"Relay URLs must use wss:// with no embedded credentials or fragment.\");\n }\n if (!url.pathname || url.pathname === \"/\") url.pathname = \"/ssh\";\n return url.toString();\n}\n\n/** Both providers forward encrypted SSH bytes to one loopback WebSocket bridge. */\nexport async function startRelay(options: RelayOptions, port: number, runtime: {\n cacheDir?: string; onProgress?: (message: string) => void | Promise<void>;\n} = {}): Promise<RelayHandle> {\n if (options.kind === \"none\") return { close() {} };\n if (options.kind === \"custom\") {\n if (!options.url) throw new Error(\"A custom relay needs --relay-url wss://your-host/ssh.\");\n return { route: { kind: \"websocket\", url: websocketURL(options.url) }, close() {} };\n }\n const origin = `http://127.0.0.1:${port}`;\n const env = { ...process.env };\n let command: string, args: string[];\n if (options.kind === \"cloudflare\") {\n command = await cloudflareCommand(runtime);\n await runtime.onProgress?.(\"Connecting through Cloudflare…\");\n if (options.cloudflareTokenFile) {\n if (!options.url) throw new Error(\"A named Cloudflare tunnel needs --relay-url for its configured hostname.\");\n env.TUNNEL_TOKEN = (await readFile(options.cloudflareTokenFile, \"utf8\")).trim();\n args = [\"tunnel\", \"--no-autoupdate\", \"run\"];\n } else {\n if (options.url) throw new Error(\"Use --cloudflare-token-file with a named tunnel, or --relay custom for an existing tunnel.\");\n args = [\"tunnel\", \"--no-autoupdate\", \"--url\", origin];\n }\n } else {\n command = \"ngrok\";\n args = [\"http\", origin, \"--log\", \"stdout\", \"--log-format\", \"json\"];\n if (options.url) {\n const url = new URL(websocketURL(options.url));\n args.push(\"--url\", `https://${url.host}`);\n }\n }\n const child = spawn(command, args, { env, stdio: [\"ignore\", \"pipe\", \"pipe\"], windowsHide: true });\n let buffer = \"\";\n try {\n const address = await new Promise<string>((resolve, reject) => {\n const timer = setTimeout(() => { cleanup(); reject(new Error(`${command} did not establish its tunnel. Check its account and tunnel configuration.`)); }, 45_000);\n const cleanup = () => { clearTimeout(timer); child.off(\"error\", fail); child.off(\"exit\", exited); };\n const fail = (error: Error) => { cleanup(); reject(new Error(`Could not run ${command}. Install it on the computer first.`, { cause: error })); };\n const exited = () => { cleanup(); reject(new Error(`${command} exited before the tunnel connected. Check its account configuration.`)); };\n let cloudflareAddress = options.url;\n let cloudflareConnected = false;\n const receive = (chunk: Buffer) => {\n const received = buffer + chunk.toString();\n buffer = received.slice(-16_384);\n let found: string | undefined;\n if (options.kind === \"cloudflare\") {\n cloudflareAddress ??= received.match(/https:\\/\\/[a-z0-9-]+\\.trycloudflare\\.com/)?.[0];\n cloudflareConnected ||= /Registered tunnel connection/.test(received);\n // Quick tunnels print a reserved hostname before their outbound\n // connection succeeds. Do not invite a phone until that path is open.\n if (cloudflareConnected) found = cloudflareAddress;\n } else {\n for (const line of received.split(/\\r?\\n/)) {\n try {\n const event = JSON.parse(line) as { msg?: string; url?: string };\n if (event.msg === \"started tunnel\" && event.url?.startsWith(\"https://\")) found = event.url;\n } catch { /* Wait for a complete JSON log record. */ }\n }\n }\n if (found) { cleanup(); resolve(websocketURL(found)); }\n };\n child.once(\"error\", fail); child.once(\"exit\", exited);\n child.stdout!.on(\"data\", receive); child.stderr!.on(\"data\", receive);\n });\n // Drain provider output without copying potentially sensitive provider logs into ours.\n child.stdout!.removeAllListeners(\"data\"); child.stderr!.removeAllListeners(\"data\");\n child.stdout!.resume(); child.stderr!.resume();\n child.on(\"error\", () => {});\n return { route: { kind: \"websocket\", url: address }, process: child, close() { child.kill(); } };\n } catch (error) { child.kill(); throw error; }\n}\n","import { spawn, execFileSync, type ChildProcess } from \"node:child_process\";\nimport { randomBytes, randomUUID } from \"node:crypto\";\nimport * as fs from \"node:fs/promises\";\nimport { homedir, networkInterfaces } from \"node:os\";\nimport * as path from \"node:path\";\nimport { setTimeout as delay } from \"node:timers/promises\";\nimport { Mindwire } from \"../client.js\";\nimport { remote } from \"../target/index.js\";\nimport { ensureDaemonBinary } from \"../daemon-binary.js\";\nimport { SDK_VERSION } from \"../version.js\";\nimport type { ComputerInfo, ComputerRoute, ComputerUpdate } from \"../computer.js\";\nimport { startRelay, type RelayHandle, type RelayOptions } from \"./relay.js\";\n\nexport interface ComputerConfig {\n daemonBin?: string;\n version?: string;\n directory: string;\n host?: string;\n bind: string;\n sshPort: number;\n websocketPort: number;\n relay: RelayOptions;\n}\ninterface ControllerState { pid: number; ready: boolean; phase?: string; error?: string; routes?: ComputerRoute[] }\n\nexport const defaultStateDirectory = () => path.join(homedir(), \".mindwire\", \"computer\");\nexport const defaultComputerConfig = (): ComputerConfig => ({ directory: homedir(), bind: \"0.0.0.0\", sshPort: 8791, websocketPort: 8792, relay: { kind: \"cloudflare\" } });\n\nexport async function readJSON<T>(file: string): Promise<T | undefined> {\n try { return JSON.parse(await fs.readFile(file, \"utf8\")) as T; }\n catch (error) { if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return undefined; throw error; }\n}\nexport async function writeJSON(file: string, value: unknown): Promise<void> {\n const temp = `${file}.${randomUUID()}.tmp`;\n try { await fs.writeFile(temp, JSON.stringify(value) + \"\\n\", { mode: 0o600 }); await fs.rename(temp, file); }\n finally { await fs.rm(temp, { force: true }); }\n}\nfunction alive(pid: number | undefined): boolean {\n if (!pid || !Number.isSafeInteger(pid) || pid < 1) return false;\n try { process.kill(pid, 0); return true; } catch { return false; }\n}\n\nexport async function computerClient(directory: string): Promise<Mindwire> {\n const runtime = await readJSON<ComputerInfo>(path.join(directory, \"computer-runtime.json\"));\n if (!runtime) throw new Error(\"Mindwire is not running. Run mindwire connect on the computer.\");\n const url = new URL(`http://${runtime.apiAddress}`);\n if (![\"127.0.0.1\", \"[::1]\"].includes(url.hostname) || url.username || url.password) throw new Error(\"Invalid local Mindwire address.\");\n const token = (await fs.readFile(path.join(directory, \"daemon.token\"), \"utf8\")).trim();\n const client = new Mindwire({ target: remote(url.origin, { token }), requestTimeoutMs: 3000 });\n const info = await client.computer.info();\n if (info.computerId !== runtime.computerId || info.pid !== runtime.pid) throw new Error(\"The local Mindwire process changed. Retry the command.\");\n return client;\n}\n\nexport function directRoutes(config: ComputerConfig, port: number): ComputerRoute[] {\n if (config.host) return [{ kind: \"ssh\", host: config.host, port }];\n if (![\"0.0.0.0\", \"::\"].includes(config.bind)) return [{ kind: \"ssh\", host: config.bind, port }];\n const addresses = new Set<string>();\n for (const entries of Object.values(networkInterfaces())) {\n for (const address of entries ?? []) if (address.family === \"IPv4\" && !address.internal) addresses.add(address.address);\n }\n // A wired/LAN address and an existing VPN can coexist. Limit QR size.\n return [...addresses].slice(0, 6).map(host => ({ kind: \"ssh\", host, port }));\n}\n\n/** Launch once; the daemon additionally owns an OS file lock over its identity/state. */\nexport async function ensureComputer(directory: string, cliPath: string, patch: Partial<ComputerConfig> = {},\n onProgress?: (message: string) => void): Promise<Mindwire> {\n await fs.mkdir(directory, { recursive: true, mode: 0o700 });\n let current: Mindwire | undefined;\n try { current = await computerClient(directory); } catch { /* Cold start or a stale runtime file. */ }\n const configPath = path.join(directory, \"computer-config.json\");\n const previous = await readJSON<ComputerConfig>(configPath);\n const config = { ...defaultComputerConfig(), ...previous, ...patch };\n const waitUntilReady = async (): Promise<Mindwire> => {\n let phase: string | undefined;\n for (let attempt = 0; attempt < 1200; attempt++) {\n const controller = await readJSON<ControllerState>(path.join(directory, \"computer-controller.json\"));\n if (controller?.error) throw new Error(controller.error);\n if (controller?.ready) return computerClient(directory);\n if (controller?.phase && controller.phase !== phase) { phase = controller.phase; onProgress?.(phase); }\n await delay(250);\n }\n throw new Error(`Mindwire did not finish starting. Inspect ${path.join(directory, \"computer.log\")}.`);\n };\n if (current) {\n if (Object.keys(patch).some(key => JSON.stringify(config[key as keyof ComputerConfig]) !== JSON.stringify(previous?.[key as keyof ComputerConfig]))) {\n throw new Error(\"Mindwire is running with different connection settings. Run mindwire stop when idle, then retry with the new settings.\");\n }\n // The API may be healthy while the internet helper is still downloading.\n // Pairing must wait for its routes, not expose a partly prepared computer.\n return waitUntilReady();\n }\n const lockPath = path.join(directory, \"launch.lock\");\n let lock: fs.FileHandle | undefined;\n for (let attempt = 0; attempt < 120; attempt++) {\n try { lock = await fs.open(lockPath, \"wx\", 0o600); await lock.writeFile(String(process.pid)); break; }\n catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"EEXIST\") throw error;\n const owner = Number(await fs.readFile(lockPath, \"utf8\").catch(() => \"\"));\n const age = Date.now() - (await fs.stat(lockPath).catch(() => ({ mtimeMs: Date.now() }))).mtimeMs;\n if (age > 5000 && !alive(owner)) { await fs.rm(lockPath, { force: true }); continue; }\n const controller = await readJSON<ControllerState>(path.join(directory, \"computer-controller.json\"));\n if (alive(controller?.pid)) {\n const saved = await readJSON<ComputerConfig>(configPath);\n if (Object.keys(patch).some(key => JSON.stringify(patch[key as keyof ComputerConfig]) !== JSON.stringify(saved?.[key as keyof ComputerConfig]))) {\n throw new Error(\"Another start used different connection settings. Stop Mindwire when idle before changing them.\");\n }\n return waitUntilReady();\n }\n await delay(250);\n }\n }\n if (!lock) throw new Error(\"Another Mindwire start is in progress. Try again shortly.\");\n try {\n let existing: Mindwire | undefined;\n try { existing = await computerClient(directory); } catch { /* The other launch may still be booting. */ }\n if (existing) {\n const saved = await readJSON<ComputerConfig>(configPath);\n if (Object.keys(patch).some(key => JSON.stringify(patch[key as keyof ComputerConfig]) !== JSON.stringify(saved?.[key as keyof ComputerConfig]))) {\n throw new Error(\"Another start used different connection settings. Stop Mindwire when idle before changing them.\");\n }\n return waitUntilReady();\n }\n const controller = await readJSON<ControllerState>(path.join(directory, \"computer-controller.json\"));\n if (alive(controller?.pid)) {\n if (controller?.error) throw new Error(controller.error);\n } else {\n await writeJSON(configPath, config);\n await fs.rm(path.join(directory, \"computer-controller.json\"), { force: true });\n const log = await fs.open(path.join(directory, \"computer.log\"), \"a\", 0o600);\n try {\n const child = spawn(process.execPath, [cliPath, \"_serve\", \"--state-dir\", directory], {\n detached: true, stdio: [\"ignore\", log.fd, log.fd], windowsHide: true,\n });\n await new Promise<void>((resolve, reject) => { child.once(\"spawn\", resolve); child.once(\"error\", reject); });\n child.unref();\n } finally { await log.close(); }\n }\n return await waitUntilReady();\n } finally { await lock.close(); await fs.rm(lockPath, { force: true }); }\n}\n\nasync function terminate(child: ChildProcess): Promise<void> {\n if (child.exitCode !== null || child.signalCode !== null) return;\n const exited = new Promise<void>(resolve => child.once(\"exit\", () => resolve()));\n child.kill(\"SIGTERM\");\n const timer = setTimeout(() => child.kill(\"SIGKILL\"), 15_000);\n try { await exited; } finally { clearTimeout(timer); }\n}\n\n/** The only owner of daemon/relay processes. Closing the pairing command leaves this running. */\nexport async function superviseComputer(directory: string): Promise<void> {\n let config = await readJSON<ComputerConfig>(path.join(directory, \"computer-config.json\"));\n if (!config) throw new Error(\"Computer configuration is missing.\");\n const controllerPath = path.join(directory, \"computer-controller.json\");\n const previous = await readJSON<ControllerState>(controllerPath);\n if (alive(previous?.pid)) throw new Error(\"The computer already has a service controller.\");\n const phase = (message: string) => writeJSON(controllerPath, { pid: process.pid, ready: false, phase: message });\n await phase(\"Preparing Mindwire…\");\n let child: ChildProcess | undefined, relay: RelayHandle | undefined, stopping = false;\n const stop = () => { stopping = true; };\n process.on(\"SIGTERM\", stop); process.on(\"SIGINT\", stop);\n let token: string;\n try { token = (await fs.readFile(path.join(directory, \"daemon.token\"), \"utf8\")).trim(); }\n catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") throw error;\n token = randomBytes(32).toString(\"hex\");\n await fs.writeFile(path.join(directory, \"daemon.token\"), token, { mode: 0o600, flag: \"wx\" });\n }\n const daemonEnv = { ...process.env };\n if (process.platform === \"win32\") {\n // Git for Windows ships the shell used by existing harness and Git scripts.\n // Keep native files/resources and ConPTY independent of whether Git is installed.\n try {\n const git = execFileSync(\"where.exe\", [\"git\"], { encoding: \"utf8\", timeout: 3000, windowsHide: true }).split(/\\r?\\n/)[0];\n if (git) {\n const shellDirectory = path.resolve(path.dirname(git), \"..\", \"bin\");\n await fs.access(path.join(shellDirectory, \"bash.exe\"));\n const pathKey = Object.keys(daemonEnv).find(key => key.toLowerCase() === \"path\") ?? \"PATH\";\n daemonEnv[pathKey] = `${shellDirectory}${path.delimiter}${daemonEnv[pathKey] ?? \"\"}`;\n }\n } catch { /* Doctor reports Git/Bash requirements when those capabilities are used. */ }\n }\n let sshPort = config.sshPort, websocketPort = config.websocketPort;\n const launch = async (binary: string): Promise<Mindwire> => {\n await fs.rm(path.join(directory, \"computer-runtime.json\"), { force: true });\n child = spawn(binary, [\"--computer\"], {\n cwd: config!.directory, stdio: [\"ignore\", \"inherit\", \"inherit\"], windowsHide: true,\n env: { ...daemonEnv, DAEMON_TOKEN: token, ADDR: \"127.0.0.1:0\", STATE_PATH: path.join(directory, \"agent-state.json\"),\n WORKSPACE_DB_PATH: path.join(directory, \"workspace.db\"), AGENT_CWD: config!.directory,\n COMPUTER_SSH_ADDR: `${config!.bind.includes(\":\") ? `[${config!.bind}]` : config!.bind}:${sshPort}`,\n COMPUTER_WS_ADDR: `127.0.0.1:${websocketPort}`, MINDWIRE_COMPUTER_MANAGED: \"1\" },\n });\n let failure: Error | undefined;\n child.on(\"error\", error => { failure = error; });\n for (let attempt = 0; attempt < 100; attempt++) {\n if (failure) throw failure;\n if (child.exitCode !== null || child.signalCode !== null) throw new Error(\"Mindwire exited during startup. Check computer.log; the downloaded release must support computer connections.\");\n try {\n const client = await computerClient(directory);\n const health = await client.health();\n if ((health as { computerConnectionVersion?: number }).computerConnectionVersion !== 1) throw new Error(\"This daemon release does not support computer connections. Update Mindwire.\");\n return client;\n } catch (error) { if (attempt === 99) throw error; }\n await delay(100);\n }\n throw new Error(\"Mindwire startup timed out.\");\n };\n let routes: ComputerRoute[] = [];\n try {\n await phase(\"Checking the Mindwire service…\");\n let binary = config.daemonBin ?? await ensureDaemonBinary({ version: config.version ?? SDK_VERSION, cacheDir: process.env.MINDWIRE_RELEASE_CACHE_DIR });\n await phase(\"Starting the Mindwire service…\");\n let client = await launch(binary);\n const info = await client.computer.info();\n sshPort = info.sshPort; websocketPort = info.websocketPort;\n await phase(config.relay.kind === \"none\" ? \"Preparing direct SSH…\" : \"Preparing your internet connection…\");\n relay = await startRelay(config.relay, info.websocketPort, { cacheDir: path.join(directory, \"tools\"), onProgress: phase });\n routes = directRoutes(config, info.sshPort);\n if (relay.route) routes.push(relay.route);\n if (routes.length === 0) throw new Error(\"No network address is available. Use --host with your LAN/VPN address or choose a relay.\");\n await client.computer.setRoutes(routes);\n await writeJSON(controllerPath, { pid: process.pid, ready: true, routes });\n while (!stopping) {\n await delay(500);\n if (child!.exitCode !== null || child!.signalCode !== null) throw new Error(\"The Mindwire service stopped. Run mindwire start to reconnect.\");\n // A provider exit must be visible; don't silently claim its stale route is reachable.\n if (relay.process && (relay.process.exitCode !== null || relay.process.signalCode !== null)) {\n routes = routes.filter(r => r.kind === \"ssh\");\n if (routes.length > 0) await client.computer.setRoutes(routes);\n await writeJSON(controllerPath, { pid: process.pid, ready: true, routes, error: \"The relay disconnected. Direct SSH still works. Restart Mindwire when idle to reconnect the relay.\" });\n relay = { close() {} };\n }\n const updatePath = path.join(directory, \"computer-update.json\");\n const update = await readJSON<ComputerUpdate>(updatePath);\n if (!update || ![\"queued\", \"downloading\", \"waiting\", \"restarting\"].includes(update.status)) continue;\n const status = async (state: ComputerUpdate[\"status\"], error?: string) => writeJSON(updatePath, { ...update, status: state, error, updatedAt: new Date().toISOString() });\n try {\n await status(\"downloading\");\n const replacement = await ensureDaemonBinary({ version: update.version, cacheDir: process.env.MINDWIRE_RELEASE_CACHE_DIR });\n await status(\"waiting\");\n // Download before acquiring; repeat only the admission request, never a user operation.\n let lease: Awaited<ReturnType<Mindwire[\"service\"][\"acquireUpdate\"]>> | undefined;\n while (!stopping && !lease) {\n try { lease = await client.service.acquireUpdate(); }\n catch (error) { if ((error as { status?: number }).status !== 409) throw error; await delay(2000); }\n }\n if (stopping || !lease) break;\n if (lease.pid !== child!.pid) { await client.service.releaseUpdate(lease.id); throw new Error(\"The leased service process changed.\"); }\n await status(\"restarting\");\n await terminate(child!);\n try {\n client = await launch(replacement);\n await client.computer.setRoutes(routes);\n const health = await client.health();\n if (health.version.replace(/^v/, \"\") !== update.version) throw new Error(\"The replacement service reports a different release version.\");\n } catch (error) {\n if (child) await terminate(child);\n client = await launch(binary);\n await client.computer.setRoutes(routes);\n throw error;\n }\n binary = replacement;\n config = { ...config, daemonBin: undefined, version: update.version };\n await writeJSON(path.join(directory, \"computer-config.json\"), config);\n await status(\"complete\");\n } catch (error) { await status(\"failed\", error instanceof Error ? error.message : \"Service update failed.\"); }\n }\n } catch (error) {\n await writeJSON(controllerPath, { pid: process.pid, ready: false, error: error instanceof Error ? error.message : \"Computer service failed.\" });\n throw error;\n } finally {\n relay?.close();\n if (child) await terminate(child);\n process.off(\"SIGTERM\", stop); process.off(\"SIGINT\", stop);\n if (stopping) await writeJSON(controllerPath, { pid: 0, ready: false });\n }\n}\n\nexport async function stopComputer(directory: string, force = false): Promise<void> {\n const client = await computerClient(directory);\n const controller = await readJSON<ControllerState>(path.join(directory, \"computer-controller.json\"));\n if (!alive(controller?.pid)) throw new Error(\"The Mindwire controller is not running.\");\n const lease = force ? undefined : await client.service.acquireUpdate();\n try { process.kill(controller!.pid, \"SIGTERM\"); }\n catch (error) { if (lease) await client.service.releaseUpdate(lease.id); throw error; }\n for (let attempt = 0; attempt < 80; attempt++) { if (!alive(controller!.pid)) return; await delay(250); }\n throw new Error(\"Mindwire is still stopping. Check computer.log.\");\n}\n","#!/usr/bin/env node\nimport { parseArgs } from \"node:util\";\nimport { fileURLToPath, pathToFileURL } from \"node:url\";\nimport * as path from \"node:path\";\nimport { createHash } from \"node:crypto\";\nimport { createInterface } from \"node:readline/promises\";\nimport { setTimeout as delay } from \"node:timers/promises\";\nimport { computerPairingURI, type ComputerUpdate } from \"./computer.js\";\nimport { SDK_VERSION } from \"./version.js\";\nimport { computerClient, defaultStateDirectory, ensureComputer, readJSON, stopComputer, superviseComputer, type ComputerConfig } from \"./computer/lifecycle.js\";\nimport type { RelayOptions } from \"./computer/relay.js\";\n\nconst help = `Mindwire — connect this computer to your phone\n\n npm install -g mindwire\n mindwire connect Connect across networks, show QR, approve phone\n mindwire connect --relay none --host laptop.tailnet Use your existing VPN\n mindwire connect --relay none Direct SSH only (reachable network required)\n mindwire connect --relay cloudflare Cloudflare quick tunnel\n mindwire connect --relay ngrok ngrok (uses its configured account)\n mindwire connect --relay custom --relay-url wss://computer.example/ssh\n\n mindwire start Start the saved connection in the background\n mindwire status Show connection and running service\n mindwire devices List paired phones\n mindwire revoke DEVICE_ID Disconnect and revoke one phone\n mindwire update [--version VERSION] Download a verified release; wait until idle\n mindwire stop Stop when no work or terminals are running\n\nOptions:\n --directory PATH Initial workspace directory (default: home)\n --host HOST Reachable LAN, public or VPN hostname\n --relay none|cloudflare|ngrok|custom Provider (default: Cloudflare internet tunnel)\n --relay-url URL Stable configured WebSocket hostname\n --cloudflare-token-file PATH Named Cloudflare tunnel token file\n --state-dir PATH Private state directory\n --json Structured output (QR invitation includes a secret)\n --no-qr Print only the pairing link\n\nThe default works across Wi-Fi and mobile networks. Mindwire privately downloads\na verified Cloudflare helper when needed. Relays carry encrypted SSH.\nQuick tunnel addresses change on restart; use a stable hostname/VPN for regular use.\nngrok needs its installed CLI and account. Direct SSH needs no relay when reachable.\nNothing changes your system SSH login.\n`;\n\nfunction safeName(text: string): string { return text.replace(/[\\x00-\\x1f\\x7f-\\x9f]/g, \"\"); }\n\nexport async function main(args = process.argv.slice(2)): Promise<void> {\n const { values, positionals } = parseArgs({ args, allowPositionals: true, options: {\n help: { type: \"boolean\", short: \"h\" }, json: { type: \"boolean\" }, \"no-qr\": { type: \"boolean\" },\n \"state-dir\": { type: \"string\" }, directory: { type: \"string\" }, host: { type: \"string\" },\n relay: { type: \"string\" }, \"relay-url\": { type: \"string\" }, \"cloudflare-token-file\": { type: \"string\" },\n \"daemon-bin\": { type: \"string\" }, bind: { type: \"string\" }, port: { type: \"string\" }, \"websocket-port\": { type: \"string\" },\n version: { type: \"string\" }, force: { type: \"boolean\" },\n } });\n const command = positionals[0] ?? \"help\";\n if (values.help || command === \"help\") { process.stdout.write(help); return; }\n const directory = path.resolve(values[\"state-dir\"] ?? defaultStateDirectory());\n const emit = (event: string, data: object = {}, text?: string) => {\n if (values.json) process.stdout.write(JSON.stringify({ event, ...data }) + \"\\n\");\n else if (text) process.stdout.write(text + \"\\n\");\n };\n if (command === \"_serve\") { await superviseComputer(directory); return; }\n if ([\"connect\", \"start\"].includes(command)) {\n const patch: Partial<ComputerConfig> = {};\n if (values.directory) patch.directory = path.resolve(values.directory);\n if (values.host) patch.host = values.host;\n if (values.bind) patch.bind = values.bind;\n for (const [flag, field] of [[\"port\", \"sshPort\"], [\"websocket-port\", \"websocketPort\"]] as const) {\n if (values[flag] !== undefined) {\n const n = Number(values[flag]);\n if (!Number.isInteger(n) || n < 0 || n > 65535) throw new Error(`Invalid --${flag}.`);\n patch[field] = n;\n }\n }\n if (values[\"daemon-bin\"] || process.env.MINDWIRE_DAEMON) patch.daemonBin = path.resolve(values[\"daemon-bin\"] ?? process.env.MINDWIRE_DAEMON!);\n if (values.version) patch.version = values.version.replace(/^v/, \"\");\n if (values.relay || values[\"relay-url\"] || values[\"cloudflare-token-file\"]) {\n const kind = values.relay ?? \"custom\";\n if (![\"none\", \"cloudflare\", \"ngrok\", \"custom\"].includes(kind)) throw new Error(\"Choose relay none, cloudflare, ngrok or custom.\");\n patch.relay = { kind: kind as RelayOptions[\"kind\"], url: values[\"relay-url\"],\n cloudflareTokenFile: values[\"cloudflare-token-file\"] ? path.resolve(values[\"cloudflare-token-file\"]) : undefined };\n }\n emit(\"starting\", {}, \"Starting Mindwire…\");\n const client = await ensureComputer(directory, fileURLToPath(import.meta.url), patch,\n phase => emit(\"progress\", { message: phase }, phase));\n const info = await client.computer.info();\n emit(\"ready\", { computerId: info.computerId, routes: info.routes }, \"Mindwire is running in the background.\");\n if (command === \"start\") return;\n if (info.routes.some(route => route.kind === \"websocket\" && new URL(route.url).hostname.endsWith(\".trycloudflare.com\"))) {\n emit(\"temporary_address\", {}, \"Internet access is ready. This quick-tunnel address changes after a restart; use a stable hostname or VPN for regular access.\");\n }\n const invitation = await client.computer.invite(info.routes);\n const uri = computerPairingURI(invitation);\n emit(\"invitation\", { invitation, uri }, \"Open Mindwire on your phone → Add computer → Scan QR code.\");\n if (!values.json) {\n if (!values[\"no-qr\"]) {\n const QR = await import(\"qrcode\");\n process.stdout.write(await QR.toString(uri, { type: \"terminal\", small: true, errorCorrectionLevel: \"L\" }));\n }\n process.stdout.write(`\\nPairing link (expires in 5 minutes):\\n${uri}\\n\\nWaiting for your phone…\\n`);\n }\n let shownRequest: string | undefined;\n while (Date.now() < Date.parse(invitation.expiresAt)) {\n const pairing = await client.computer.pairing(invitation.pairingId);\n if (pairing.status === \"approved\") { emit(\"paired\", {}, \"Phone connected. You can close this terminal; Mindwire keeps running.\"); return; }\n if (pairing.status === \"rejected\") { emit(\"rejected\", {}, \"Pairing declined.\"); return; }\n if (pairing.request && shownRequest !== pairing.request.id) {\n shownRequest = pairing.request.id;\n const key = Buffer.from(pairing.request.publicKey.split(\" \")[1] ?? \"\", \"base64\");\n const fingerprint = \"SHA256:\" + createHash(\"sha256\").update(key).digest(\"base64\").replace(/=+$/, \"\");\n emit(\"approval_required\", { pairingId: invitation.pairingId, request: pairing.request, fingerprint },\n `\\n${safeName(pairing.request.name)} wants to connect.\\nDevice key: ${fingerprint}`);\n if (!process.stdin.isTTY) {\n emit(\"approval_command\", { command: `mindwire approve ${invitation.pairingId} ${pairing.request.id}` },\n `Review this device, then run:\\nmindwire approve ${invitation.pairingId} ${pairing.request.id}`);\n } else {\n const input = createInterface({ input: process.stdin, output: process.stderr });\n try {\n const answer = await input.question(\"Allow this phone to access this workspace? [y/N] \");\n await client.computer.decide(invitation.pairingId, pairing.request.id, /^y(es)?$/i.test(answer.trim()));\n } finally { input.close(); }\n }\n }\n await delay(750);\n }\n throw new Error(\"Pairing expired. Run mindwire connect to show a new QR code.\");\n }\n if (command === \"stop\") { await stopComputer(directory, values.force === true); emit(\"stopped\", {}, \"Mindwire stopped.\"); return; }\n const client = await computerClient(directory);\n switch (command) {\n case \"status\": {\n const [info, health, work, controller] = await Promise.all([client.computer.info(), client.health(), client.service.updateStatus(),\n readJSON<{ error?: string }>(path.join(directory, \"computer-controller.json\"))]);\n emit(\"status\", { ...info, daemonVersion: health.version, ...work, relayError: controller?.error },\n `Mindwire ${health.version} · ${work.idle ? \"idle\" : \"working\"}\\n${info.routes.map(route => route.kind === \"ssh\" ? `SSH ${route.host}:${route.port}` : route.url).join(\"\\n\")}${controller?.error ? `\\n${controller.error}` : \"\"}`);\n break;\n }\n case \"devices\": {\n const devices = await client.computer.devices();\n emit(\"devices\", { devices }, devices.length ? devices.map(d => `${safeName(d.name)} ${d.id}${d.revoked ? \" (revoked)\" : \"\"}`).join(\"\\n\") : \"No paired phones yet. Run mindwire connect.\");\n break;\n }\n case \"revoke\": {\n if (!positionals[1]) throw new Error(\"Use mindwire revoke DEVICE_ID (from mindwire devices).\");\n await client.computer.revoke(positionals[1]); emit(\"revoked\", {}, \"Device revoked and disconnected.\"); break;\n }\n case \"approve\": case \"reject\": {\n if (!positionals[1] || !positionals[2]) throw new Error(`Use mindwire ${command} PAIRING_ID REQUEST_ID.`);\n await client.computer.decide(positionals[1], positionals[2], command === \"approve\"); emit(command, {}, command === \"approve\" ? \"Phone approved.\" : \"Phone declined.\"); break;\n }\n case \"update\": {\n const version = (values.version ?? SDK_VERSION).replace(/^v/, \"\");\n const health = await client.health();\n if (health.version.replace(/^v/, \"\") === version) { emit(\"updated\", { version }, `Mindwire ${version} is already installed.`); return; }\n const requested = await client.computer.requestUpdate(version);\n emit(\"update_queued\", requested, \"Update queued. It will wait until all work and terminals are finished.\");\n let last = \"\";\n for (;;) {\n const update = await readJSON<ComputerUpdate>(path.join(directory, \"computer-update.json\"));\n if (update?.id !== requested.id) throw new Error(\"The update request changed. Run mindwire status.\");\n if (update.status !== last) { last = update.status; emit(\"update\", update, `Update: ${update.status}`); }\n if (update.status === \"complete\") return;\n if (update.status === \"failed\") throw new Error(update.error ?? \"Update failed.\");\n await delay(750);\n }\n }\n default: throw new Error(`Unknown command ${command}. Run mindwire --help.`);\n }\n}\n\nif (process.argv[1] && import.meta.url === pathToFileURL(path.resolve(process.argv[1])).href) {\n void main().catch(error => {\n const message = error instanceof Error ? error.message : String(error);\n if (process.argv.includes(\"--json\")) process.stderr.write(JSON.stringify({ event: \"error\", message }) + \"\\n\");\n else process.stderr.write(`Mindwire: ${message}\\n`);\n process.exitCode = 1;\n });\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/computer.ts","../src/version.ts","../src/http.ts","../src/sse.ts","../src/run.ts","../src/workspace.ts","../src/surfaces.ts","../src/service.ts","../src/execution.ts","../src/daemon-binary.ts","../src/embedded.ts","../src/target/index.ts","../src/client.ts","../src/computer/cloudflare-binary.ts","../src/computer/relay.ts","../src/computer/lifecycle.ts","../src/cli.ts"],"names":["path","payload","binaryCacheDirectory","cachedExecutable","cacheExecutable","spawn","randomBytes","fs","resolve","delay","path3","emit","client"],"mappings":"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","file":"cli.js","sourcesContent":["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","// 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","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","// 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","// 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","// 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","import { execFile } from \"node:child_process\";\nimport { mkdtemp, writeFile, rm } from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport * as path from \"node:path\";\nimport { promisify } from \"node:util\";\nimport { binaryCacheDirectory, cachedExecutable, cacheExecutable, executableChecksum, verifyReleaseBytes } from \"../binary-cache.js\";\n\n// The bridge was tested against this release. The helper never updates itself or\n// changes a system installation; a newer Mindwire release can advance this pin.\nexport const CLOUDFLARED_VERSION = \"2026.9.3\";\nconst execute = promisify(execFile);\n\nexport async function ensureCloudflareBinary(options: {\n cacheDir?: string; platform?: string; arch?: string; fetch?: typeof fetch;\n onProgress?: (message: string) => void | Promise<void>;\n} = {}): Promise<string> {\n const platform = options.platform ?? process.platform, arch = options.arch ?? process.arch;\n const cpu = arch === \"x64\" ? \"amd64\" : arch === \"arm64\" ? \"arm64\" : \"\";\n if (!cpu || ![\"darwin\", \"linux\", \"win32\"].includes(platform) || platform === \"win32\" && cpu !== \"amd64\") {\n throw new Error(\"Install cloudflared for this computer, or select another connection provider.\");\n }\n const asset = `cloudflared-${platform === \"win32\" ? \"windows\" : platform}-${cpu}${platform === \"darwin\" ? \".tgz\" : platform === \"win32\" ? \".exe\" : \"\"}`;\n const bin = path.join(options.cacheDir ?? await binaryCacheDirectory(), \"cloudflared\", CLOUDFLARED_VERSION,\n `${platform}-${arch}`, platform === \"win32\" ? \"cloudflared.exe\" : \"cloudflared\");\n const cached = await cachedExecutable(bin);\n if (cached) return cached;\n await options.onProgress?.(\"Downloading the secure connection helper…\");\n const request = options.fetch ?? fetch;\n const release = await request(`https://api.github.com/repos/cloudflare/cloudflared/releases/tags/${CLOUDFLARED_VERSION}`,\n { headers: { Accept: \"application/vnd.github+json\" }, signal: AbortSignal.timeout(20_000) });\n if (!release.ok) throw new Error(\"Couldn't download the connection helper. Retry, install cloudflared yourself, or choose another provider.\");\n const metadata = await release.json() as { assets?: { name: string; digest?: string; browser_download_url: string }[] };\n const item = metadata.assets?.find(value => value.name === asset);\n const checksum = item?.digest?.match(/^sha256:([a-f0-9]{64})$/i)?.[1];\n const expectedURL = `https://github.com/cloudflare/cloudflared/releases/download/${CLOUDFLARED_VERSION}/${asset}`;\n if (!checksum || item?.browser_download_url !== expectedURL) throw new Error(\"The connection helper has no verified release asset for this computer.\");\n const downloaded = await request(expectedURL, { signal: AbortSignal.timeout(120_000) });\n if (!downloaded.ok) throw new Error(\"Couldn't download the connection helper. Check your internet connection and retry.\");\n const archive = new Uint8Array(await downloaded.arrayBuffer());\n await verifyReleaseBytes(archive, checksum, asset);\n let executable = archive;\n if (platform === \"darwin\") {\n const temporary = await mkdtemp(path.join(tmpdir(), \"mindwire-cloudflared-\"));\n try {\n const archivePath = path.join(temporary, asset);\n await writeFile(archivePath, archive, { mode: 0o600 });\n // Read only this exact archive member to stdout. No archive paths are\n // extracted into the filesystem and no downloaded script is executed.\n const result = await execute(\"/usr/bin/tar\", [\"-xzOf\", archivePath, \"cloudflared\"],\n { encoding: \"buffer\", maxBuffer: 128 * 1024 * 1024, timeout: 30_000 });\n executable = new Uint8Array(result.stdout);\n } finally { await rm(temporary, { recursive: true, force: true }); }\n }\n return cacheExecutable(bin, executable, await executableChecksum(executable));\n}\n\nexport async function cloudflareCommand(options: Parameters<typeof ensureCloudflareBinary>[0]): Promise<string> {\n try {\n await execute(\"cloudflared\", [\"--version\"], { timeout: 3000, windowsHide: true });\n return \"cloudflared\";\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") throw new Error(\"The installed cloudflared could not start. Repair it or choose another connection provider.\");\n return ensureCloudflareBinary(options);\n }\n}\n","import { spawn, type ChildProcess } from \"node:child_process\";\nimport { readFile } from \"node:fs/promises\";\nimport type { ComputerRoute } from \"../computer.js\";\nimport { cloudflareCommand } from \"./cloudflare-binary.js\";\n\nexport interface RelayOptions {\n kind: \"none\" | \"cloudflare\" | \"ngrok\" | \"custom\";\n /** A stable, already configured hostname; custom relays must forward WebSocket upgrades. */\n url?: string;\n cloudflareTokenFile?: string;\n}\nexport interface RelayHandle { route?: ComputerRoute; process?: ChildProcess; close(): void }\n\nexport function websocketURL(value: string): string {\n const url = new URL(value);\n if (url.protocol === \"https:\") url.protocol = \"wss:\";\n if (url.protocol !== \"wss:\" || !url.hostname || url.username || url.password || url.hash) {\n throw new Error(\"Relay URLs must use wss:// with no embedded credentials or fragment.\");\n }\n if (!url.pathname || url.pathname === \"/\") url.pathname = \"/ssh\";\n return url.toString();\n}\n\n/** Both providers forward encrypted SSH bytes to one loopback WebSocket bridge. */\nexport async function startRelay(options: RelayOptions, port: number, runtime: {\n cacheDir?: string; onProgress?: (message: string) => void | Promise<void>;\n} = {}): Promise<RelayHandle> {\n if (options.kind === \"none\") return { close() {} };\n if (options.kind === \"custom\") {\n if (!options.url) throw new Error(\"A custom relay needs --relay-url wss://your-host/ssh.\");\n return { route: { kind: \"websocket\", url: websocketURL(options.url) }, close() {} };\n }\n const origin = `http://127.0.0.1:${port}`;\n const env = { ...process.env };\n let command: string, args: string[];\n if (options.kind === \"cloudflare\") {\n command = await cloudflareCommand(runtime);\n await runtime.onProgress?.(\"Connecting through Cloudflare…\");\n if (options.cloudflareTokenFile) {\n if (!options.url) throw new Error(\"A named Cloudflare tunnel needs --relay-url for its configured hostname.\");\n env.TUNNEL_TOKEN = (await readFile(options.cloudflareTokenFile, \"utf8\")).trim();\n args = [\"tunnel\", \"--no-autoupdate\", \"run\"];\n } else {\n if (options.url) throw new Error(\"Use --cloudflare-token-file with a named tunnel, or --relay custom for an existing tunnel.\");\n args = [\"tunnel\", \"--no-autoupdate\", \"--url\", origin];\n }\n } else {\n command = \"ngrok\";\n args = [\"http\", origin, \"--log\", \"stdout\", \"--log-format\", \"json\"];\n if (options.url) {\n const url = new URL(websocketURL(options.url));\n args.push(\"--url\", `https://${url.host}`);\n }\n }\n const child = spawn(command, args, { env, stdio: [\"ignore\", \"pipe\", \"pipe\"], windowsHide: true });\n let buffer = \"\";\n try {\n const address = await new Promise<string>((resolve, reject) => {\n const timer = setTimeout(() => { cleanup(); reject(new Error(`${command} did not establish its tunnel. Check its account and tunnel configuration.`)); }, 45_000);\n const cleanup = () => { clearTimeout(timer); child.off(\"error\", fail); child.off(\"exit\", exited); };\n const fail = (error: Error) => { cleanup(); reject(new Error(`Could not run ${command}. Install it on the computer first.`, { cause: error })); };\n const exited = () => { cleanup(); reject(new Error(`${command} exited before the tunnel connected. Check its account configuration.`)); };\n let cloudflareAddress = options.url;\n let cloudflareConnected = false;\n const receive = (chunk: Buffer) => {\n const received = buffer + chunk.toString();\n buffer = received.slice(-16_384);\n let found: string | undefined;\n if (options.kind === \"cloudflare\") {\n cloudflareAddress ??= received.match(/https:\\/\\/[a-z0-9-]+\\.trycloudflare\\.com/)?.[0];\n cloudflareConnected ||= /Registered tunnel connection/.test(received);\n // Quick tunnels print a reserved hostname before their outbound\n // connection succeeds. Do not invite a phone until that path is open.\n if (cloudflareConnected) found = cloudflareAddress;\n } else {\n for (const line of received.split(/\\r?\\n/)) {\n try {\n const event = JSON.parse(line) as { msg?: string; url?: string };\n if (event.msg === \"started tunnel\" && event.url?.startsWith(\"https://\")) found = event.url;\n } catch { /* Wait for a complete JSON log record. */ }\n }\n }\n if (found) { cleanup(); resolve(websocketURL(found)); }\n };\n child.once(\"error\", fail); child.once(\"exit\", exited);\n child.stdout!.on(\"data\", receive); child.stderr!.on(\"data\", receive);\n });\n // Drain provider output without copying potentially sensitive provider logs into ours.\n child.stdout!.removeAllListeners(\"data\"); child.stderr!.removeAllListeners(\"data\");\n child.stdout!.resume(); child.stderr!.resume();\n child.on(\"error\", () => {});\n return { route: { kind: \"websocket\", url: address }, process: child, close() { child.kill(); } };\n } catch (error) { child.kill(); throw error; }\n}\n","import { spawn, execFileSync, type ChildProcess } from \"node:child_process\";\nimport { randomBytes, randomUUID } from \"node:crypto\";\nimport * as fs from \"node:fs/promises\";\nimport { homedir, networkInterfaces } from \"node:os\";\nimport * as path from \"node:path\";\nimport { setTimeout as delay } from \"node:timers/promises\";\nimport { Mindwire } from \"../client.js\";\nimport { remote } from \"../target/index.js\";\nimport { ensureDaemonBinary } from \"../daemon-binary.js\";\nimport { SDK_VERSION } from \"../version.js\";\nimport type { ComputerInfo, ComputerRoute, ComputerUpdate } from \"../computer.js\";\nimport { startRelay, type RelayHandle, type RelayOptions } from \"./relay.js\";\n\nexport interface ComputerConfig {\n daemonBin?: string;\n version?: string;\n directory: string;\n host?: string;\n bind: string;\n sshPort: number;\n websocketPort: number;\n relay: RelayOptions;\n}\ninterface ControllerState { pid: number; ready: boolean; phase?: string; error?: string; routes?: ComputerRoute[] }\n\nexport const defaultStateDirectory = () => path.join(homedir(), \".mindwire\", \"computer\");\nexport const defaultComputerConfig = (): ComputerConfig => ({ directory: homedir(), bind: \"0.0.0.0\", sshPort: 8791, websocketPort: 8792, relay: { kind: \"cloudflare\" } });\n\nexport async function readJSON<T>(file: string): Promise<T | undefined> {\n try { return JSON.parse(await fs.readFile(file, \"utf8\")) as T; }\n catch (error) { if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return undefined; throw error; }\n}\nexport async function writeJSON(file: string, value: unknown): Promise<void> {\n const temp = `${file}.${randomUUID()}.tmp`;\n try { await fs.writeFile(temp, JSON.stringify(value) + \"\\n\", { mode: 0o600 }); await fs.rename(temp, file); }\n finally { await fs.rm(temp, { force: true }); }\n}\nfunction alive(pid: number | undefined): boolean {\n if (!pid || !Number.isSafeInteger(pid) || pid < 1) return false;\n try { process.kill(pid, 0); return true; } catch { return false; }\n}\n\nexport async function computerClient(directory: string): Promise<Mindwire> {\n const runtime = await readJSON<ComputerInfo>(path.join(directory, \"computer-runtime.json\"));\n if (!runtime) throw new Error(\"Mindwire is not running. Run mindwire connect on the computer.\");\n const url = new URL(`http://${runtime.apiAddress}`);\n if (![\"127.0.0.1\", \"[::1]\"].includes(url.hostname) || url.username || url.password) throw new Error(\"Invalid local Mindwire address.\");\n const token = (await fs.readFile(path.join(directory, \"daemon.token\"), \"utf8\")).trim();\n const client = new Mindwire({ target: remote(url.origin, { token }), requestTimeoutMs: 3000 });\n const info = await client.computer.info();\n if (info.computerId !== runtime.computerId || info.pid !== runtime.pid) throw new Error(\"The local Mindwire process changed. Retry the command.\");\n return client;\n}\n\nexport function directRoutes(config: ComputerConfig, port: number): ComputerRoute[] {\n if (config.host) return [{ kind: \"ssh\", host: config.host, port }];\n if (![\"0.0.0.0\", \"::\"].includes(config.bind)) return [{ kind: \"ssh\", host: config.bind, port }];\n const addresses = new Set<string>();\n for (const entries of Object.values(networkInterfaces())) {\n for (const address of entries ?? []) if (address.family === \"IPv4\" && !address.internal) addresses.add(address.address);\n }\n // A wired/LAN address and an existing VPN can coexist. Limit QR size.\n return [...addresses].slice(0, 6).map(host => ({ kind: \"ssh\", host, port }));\n}\n\n/** Launch once; the daemon additionally owns an OS file lock over its identity/state. */\nexport async function ensureComputer(directory: string, cliPath: string, patch: Partial<ComputerConfig> = {},\n onProgress?: (message: string) => void): Promise<Mindwire> {\n await fs.mkdir(directory, { recursive: true, mode: 0o700 });\n let current: Mindwire | undefined;\n try { current = await computerClient(directory); } catch { /* Cold start or a stale runtime file. */ }\n const configPath = path.join(directory, \"computer-config.json\");\n const previous = await readJSON<ComputerConfig>(configPath);\n const config = { ...defaultComputerConfig(), ...previous, ...patch };\n const waitUntilReady = async (): Promise<Mindwire> => {\n let phase: string | undefined;\n for (let attempt = 0; attempt < 1200; attempt++) {\n const controller = await readJSON<ControllerState>(path.join(directory, \"computer-controller.json\"));\n if (controller?.error) throw new Error(controller.error);\n if (controller?.ready) return computerClient(directory);\n if (controller?.phase && controller.phase !== phase) { phase = controller.phase; onProgress?.(phase); }\n await delay(250);\n }\n throw new Error(`Mindwire did not finish starting. Inspect ${path.join(directory, \"computer.log\")}.`);\n };\n if (current) {\n if (Object.keys(patch).some(key => JSON.stringify(config[key as keyof ComputerConfig]) !== JSON.stringify(previous?.[key as keyof ComputerConfig]))) {\n throw new Error(\"Mindwire is running with different connection settings. Run mindwire stop when idle, then retry with the new settings.\");\n }\n // The API may be healthy while the internet helper is still downloading.\n // Pairing must wait for its routes, not expose a partly prepared computer.\n return waitUntilReady();\n }\n const lockPath = path.join(directory, \"launch.lock\");\n let lock: fs.FileHandle | undefined;\n for (let attempt = 0; attempt < 120; attempt++) {\n try { lock = await fs.open(lockPath, \"wx\", 0o600); await lock.writeFile(String(process.pid)); break; }\n catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"EEXIST\") throw error;\n const owner = Number(await fs.readFile(lockPath, \"utf8\").catch(() => \"\"));\n const age = Date.now() - (await fs.stat(lockPath).catch(() => ({ mtimeMs: Date.now() }))).mtimeMs;\n if (age > 5000 && !alive(owner)) { await fs.rm(lockPath, { force: true }); continue; }\n const controller = await readJSON<ControllerState>(path.join(directory, \"computer-controller.json\"));\n if (alive(controller?.pid)) {\n const saved = await readJSON<ComputerConfig>(configPath);\n if (Object.keys(patch).some(key => JSON.stringify(patch[key as keyof ComputerConfig]) !== JSON.stringify(saved?.[key as keyof ComputerConfig]))) {\n throw new Error(\"Another start used different connection settings. Stop Mindwire when idle before changing them.\");\n }\n return waitUntilReady();\n }\n await delay(250);\n }\n }\n if (!lock) throw new Error(\"Another Mindwire start is in progress. Try again shortly.\");\n try {\n let existing: Mindwire | undefined;\n try { existing = await computerClient(directory); } catch { /* The other launch may still be booting. */ }\n if (existing) {\n const saved = await readJSON<ComputerConfig>(configPath);\n if (Object.keys(patch).some(key => JSON.stringify(patch[key as keyof ComputerConfig]) !== JSON.stringify(saved?.[key as keyof ComputerConfig]))) {\n throw new Error(\"Another start used different connection settings. Stop Mindwire when idle before changing them.\");\n }\n return waitUntilReady();\n }\n const controller = await readJSON<ControllerState>(path.join(directory, \"computer-controller.json\"));\n if (alive(controller?.pid)) {\n if (controller?.error) throw new Error(controller.error);\n } else {\n await writeJSON(configPath, config);\n await fs.rm(path.join(directory, \"computer-controller.json\"), { force: true });\n const log = await fs.open(path.join(directory, \"computer.log\"), \"a\", 0o600);\n try {\n const child = spawn(process.execPath, [cliPath, \"_serve\", \"--state-dir\", directory], {\n detached: true, stdio: [\"ignore\", log.fd, log.fd], windowsHide: true,\n });\n await new Promise<void>((resolve, reject) => { child.once(\"spawn\", resolve); child.once(\"error\", reject); });\n child.unref();\n } finally { await log.close(); }\n }\n return await waitUntilReady();\n } finally { await lock.close(); await fs.rm(lockPath, { force: true }); }\n}\n\nasync function terminate(child: ChildProcess): Promise<void> {\n if (child.exitCode !== null || child.signalCode !== null) return;\n const exited = new Promise<void>(resolve => child.once(\"exit\", () => resolve()));\n child.kill(\"SIGTERM\");\n const timer = setTimeout(() => child.kill(\"SIGKILL\"), 15_000);\n try { await exited; } finally { clearTimeout(timer); }\n}\n\n/** The only owner of daemon/relay processes. Closing the pairing command leaves this running. */\nexport async function superviseComputer(directory: string): Promise<void> {\n let config = await readJSON<ComputerConfig>(path.join(directory, \"computer-config.json\"));\n if (!config) throw new Error(\"Computer configuration is missing.\");\n const controllerPath = path.join(directory, \"computer-controller.json\");\n const previous = await readJSON<ControllerState>(controllerPath);\n if (alive(previous?.pid)) throw new Error(\"The computer already has a service controller.\");\n const phase = (message: string) => writeJSON(controllerPath, { pid: process.pid, ready: false, phase: message });\n await phase(\"Preparing Mindwire…\");\n let child: ChildProcess | undefined, relay: RelayHandle | undefined, stopping = false;\n const stop = () => { stopping = true; };\n process.on(\"SIGTERM\", stop); process.on(\"SIGINT\", stop);\n let token: string;\n try { token = (await fs.readFile(path.join(directory, \"daemon.token\"), \"utf8\")).trim(); }\n catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") throw error;\n token = randomBytes(32).toString(\"hex\");\n await fs.writeFile(path.join(directory, \"daemon.token\"), token, { mode: 0o600, flag: \"wx\" });\n }\n const daemonEnv = { ...process.env };\n if (process.platform === \"win32\") {\n // Git for Windows ships the shell used by existing harness and Git scripts.\n // Keep native files/resources and ConPTY independent of whether Git is installed.\n try {\n const git = execFileSync(\"where.exe\", [\"git\"], { encoding: \"utf8\", timeout: 3000, windowsHide: true }).split(/\\r?\\n/)[0];\n if (git) {\n const shellDirectory = path.resolve(path.dirname(git), \"..\", \"bin\");\n await fs.access(path.join(shellDirectory, \"bash.exe\"));\n const pathKey = Object.keys(daemonEnv).find(key => key.toLowerCase() === \"path\") ?? \"PATH\";\n daemonEnv[pathKey] = `${shellDirectory}${path.delimiter}${daemonEnv[pathKey] ?? \"\"}`;\n }\n } catch { /* Doctor reports Git/Bash requirements when those capabilities are used. */ }\n }\n let sshPort = config.sshPort, websocketPort = config.websocketPort;\n const launch = async (binary: string): Promise<Mindwire> => {\n await fs.rm(path.join(directory, \"computer-runtime.json\"), { force: true });\n child = spawn(binary, [\"--computer\"], {\n cwd: config!.directory, stdio: [\"ignore\", \"inherit\", \"inherit\"], windowsHide: true,\n env: { ...daemonEnv, DAEMON_TOKEN: token, ADDR: \"127.0.0.1:0\", STATE_PATH: path.join(directory, \"agent-state.json\"),\n WORKSPACE_DB_PATH: path.join(directory, \"workspace.db\"), AGENT_CWD: config!.directory,\n COMPUTER_SSH_ADDR: `${config!.bind.includes(\":\") ? `[${config!.bind}]` : config!.bind}:${sshPort}`,\n COMPUTER_WS_ADDR: `127.0.0.1:${websocketPort}`, MINDWIRE_COMPUTER_MANAGED: \"1\" },\n });\n let failure: Error | undefined;\n child.on(\"error\", error => { failure = error; });\n for (let attempt = 0; attempt < 100; attempt++) {\n if (failure) throw failure;\n if (child.exitCode !== null || child.signalCode !== null) throw new Error(\"Mindwire exited during startup. Check computer.log; the downloaded release must support computer connections.\");\n try {\n const client = await computerClient(directory);\n const health = await client.health();\n if ((health as { computerConnectionVersion?: number }).computerConnectionVersion !== 1) throw new Error(\"This daemon release does not support computer connections. Update Mindwire.\");\n return client;\n } catch (error) { if (attempt === 99) throw error; }\n await delay(100);\n }\n throw new Error(\"Mindwire startup timed out.\");\n };\n let routes: ComputerRoute[] = [];\n try {\n await phase(\"Checking the Mindwire service…\");\n let binary = config.daemonBin ?? await ensureDaemonBinary({ version: config.version ?? SDK_VERSION, cacheDir: process.env.MINDWIRE_RELEASE_CACHE_DIR });\n await phase(\"Starting the Mindwire service…\");\n let client = await launch(binary);\n const info = await client.computer.info();\n sshPort = info.sshPort; websocketPort = info.websocketPort;\n await phase(config.relay.kind === \"none\" ? \"Preparing direct SSH…\" : \"Preparing your internet connection…\");\n relay = await startRelay(config.relay, info.websocketPort, { cacheDir: path.join(directory, \"tools\"), onProgress: phase });\n routes = directRoutes(config, info.sshPort);\n if (relay.route) routes.push(relay.route);\n if (routes.length === 0) throw new Error(\"No network address is available. Use --host with your LAN/VPN address or choose a relay.\");\n await client.computer.setRoutes(routes);\n await writeJSON(controllerPath, { pid: process.pid, ready: true, routes });\n while (!stopping) {\n await delay(500);\n if (child!.exitCode !== null || child!.signalCode !== null) throw new Error(\"The Mindwire service stopped. Run mindwire start to reconnect.\");\n // A provider exit must be visible; don't silently claim its stale route is reachable.\n if (relay.process && (relay.process.exitCode !== null || relay.process.signalCode !== null)) {\n routes = routes.filter(r => r.kind === \"ssh\");\n if (routes.length > 0) await client.computer.setRoutes(routes);\n await writeJSON(controllerPath, { pid: process.pid, ready: true, routes, error: \"The relay disconnected. Direct SSH still works. Restart Mindwire when idle to reconnect the relay.\" });\n relay = { close() {} };\n }\n const updatePath = path.join(directory, \"computer-update.json\");\n const update = await readJSON<ComputerUpdate>(updatePath);\n if (!update || ![\"queued\", \"downloading\", \"waiting\", \"restarting\"].includes(update.status)) continue;\n const status = async (state: ComputerUpdate[\"status\"], error?: string) => writeJSON(updatePath, { ...update, status: state, error, updatedAt: new Date().toISOString() });\n try {\n await status(\"downloading\");\n const replacement = await ensureDaemonBinary({ version: update.version, cacheDir: process.env.MINDWIRE_RELEASE_CACHE_DIR });\n await status(\"waiting\");\n // Download before acquiring; repeat only the admission request, never a user operation.\n let lease: Awaited<ReturnType<Mindwire[\"service\"][\"acquireUpdate\"]>> | undefined;\n while (!stopping && !lease) {\n try { lease = await client.service.acquireUpdate(); }\n catch (error) { if ((error as { status?: number }).status !== 409) throw error; await delay(2000); }\n }\n if (stopping || !lease) break;\n if (lease.pid !== child!.pid) { await client.service.releaseUpdate(lease.id); throw new Error(\"The leased service process changed.\"); }\n await status(\"restarting\");\n await terminate(child!);\n try {\n client = await launch(replacement);\n await client.computer.setRoutes(routes);\n const health = await client.health();\n if (health.version.replace(/^v/, \"\") !== update.version) throw new Error(\"The replacement service reports a different release version.\");\n } catch (error) {\n if (child) await terminate(child);\n client = await launch(binary);\n await client.computer.setRoutes(routes);\n throw error;\n }\n binary = replacement;\n config = { ...config, daemonBin: undefined, version: update.version };\n await writeJSON(path.join(directory, \"computer-config.json\"), config);\n await status(\"complete\");\n } catch (error) { await status(\"failed\", error instanceof Error ? error.message : \"Service update failed.\"); }\n }\n } catch (error) {\n await writeJSON(controllerPath, { pid: process.pid, ready: false, error: error instanceof Error ? error.message : \"Computer service failed.\" });\n throw error;\n } finally {\n relay?.close();\n if (child) await terminate(child);\n process.off(\"SIGTERM\", stop); process.off(\"SIGINT\", stop);\n if (stopping) await writeJSON(controllerPath, { pid: 0, ready: false });\n }\n}\n\nexport async function stopComputer(directory: string, force = false): Promise<void> {\n const client = await computerClient(directory);\n const controller = await readJSON<ControllerState>(path.join(directory, \"computer-controller.json\"));\n if (!alive(controller?.pid)) throw new Error(\"The Mindwire controller is not running.\");\n const lease = force ? undefined : await client.service.acquireUpdate();\n try { process.kill(controller!.pid, \"SIGTERM\"); }\n catch (error) { if (lease) await client.service.releaseUpdate(lease.id); throw error; }\n for (let attempt = 0; attempt < 80; attempt++) { if (!alive(controller!.pid)) return; await delay(250); }\n throw new Error(\"Mindwire is still stopping. Check computer.log.\");\n}\n","#!/usr/bin/env node\nimport { parseArgs } from \"node:util\";\nimport { fileURLToPath } from \"node:url\";\nimport { realpathSync } from \"node:fs\";\nimport * as path from \"node:path\";\nimport { createHash } from \"node:crypto\";\nimport { createInterface } from \"node:readline/promises\";\nimport { setTimeout as delay } from \"node:timers/promises\";\nimport { computerPairingURI, type ComputerUpdate } from \"./computer.js\";\nimport { SDK_VERSION } from \"./version.js\";\nimport { computerClient, defaultStateDirectory, ensureComputer, readJSON, stopComputer, superviseComputer, type ComputerConfig } from \"./computer/lifecycle.js\";\nimport type { RelayOptions } from \"./computer/relay.js\";\n\nconst help = `Mindwire — connect this computer to your phone\n\n npm install -g mindwire\n mindwire connect Connect across networks, show QR, approve phone\n mindwire connect --relay none --host laptop.tailnet Use your existing VPN\n mindwire connect --relay none Direct SSH only (reachable network required)\n mindwire connect --relay cloudflare Cloudflare quick tunnel\n mindwire connect --relay ngrok ngrok (uses its configured account)\n mindwire connect --relay custom --relay-url wss://computer.example/ssh\n\n mindwire start Start the saved connection in the background\n mindwire status Show connection and running service\n mindwire devices List paired phones\n mindwire revoke DEVICE_ID Disconnect and revoke one phone\n mindwire update [--version VERSION] Download a verified release; wait until idle\n mindwire stop Stop when no work or terminals are running\n\nOptions:\n --directory PATH Initial workspace directory (default: home)\n --host HOST Reachable LAN, public or VPN hostname\n --relay none|cloudflare|ngrok|custom Provider (default: Cloudflare internet tunnel)\n --relay-url URL Stable configured WebSocket hostname\n --cloudflare-token-file PATH Named Cloudflare tunnel token file\n --state-dir PATH Private state directory\n --json Structured output (QR invitation includes a secret)\n --no-qr Print only the pairing link\n\nThe default works across Wi-Fi and mobile networks. Mindwire privately downloads\na verified Cloudflare helper when needed. Relays carry encrypted SSH.\nQuick tunnel addresses change on restart; use a stable hostname/VPN for regular use.\nngrok needs its installed CLI and account. Direct SSH needs no relay when reachable.\nNothing changes your system SSH login.\n`;\n\nfunction safeName(text: string): string { return text.replace(/[\\x00-\\x1f\\x7f-\\x9f]/g, \"\"); }\n\nexport async function main(args = process.argv.slice(2)): Promise<void> {\n const { values, positionals } = parseArgs({ args, allowPositionals: true, options: {\n help: { type: \"boolean\", short: \"h\" }, json: { type: \"boolean\" }, \"no-qr\": { type: \"boolean\" },\n \"state-dir\": { type: \"string\" }, directory: { type: \"string\" }, host: { type: \"string\" },\n relay: { type: \"string\" }, \"relay-url\": { type: \"string\" }, \"cloudflare-token-file\": { type: \"string\" },\n \"daemon-bin\": { type: \"string\" }, bind: { type: \"string\" }, port: { type: \"string\" }, \"websocket-port\": { type: \"string\" },\n version: { type: \"string\" }, force: { type: \"boolean\" },\n } });\n const command = positionals[0] ?? \"help\";\n if (values.help || command === \"help\") { process.stdout.write(help); return; }\n const directory = path.resolve(values[\"state-dir\"] ?? defaultStateDirectory());\n const emit = (event: string, data: object = {}, text?: string) => {\n if (values.json) process.stdout.write(JSON.stringify({ event, ...data }) + \"\\n\");\n else if (text) process.stdout.write(text + \"\\n\");\n };\n if (command === \"_serve\") { await superviseComputer(directory); return; }\n if ([\"connect\", \"start\"].includes(command)) {\n const patch: Partial<ComputerConfig> = {};\n if (values.directory) patch.directory = path.resolve(values.directory);\n if (values.host) patch.host = values.host;\n if (values.bind) patch.bind = values.bind;\n for (const [flag, field] of [[\"port\", \"sshPort\"], [\"websocket-port\", \"websocketPort\"]] as const) {\n if (values[flag] !== undefined) {\n const n = Number(values[flag]);\n if (!Number.isInteger(n) || n < 0 || n > 65535) throw new Error(`Invalid --${flag}.`);\n patch[field] = n;\n }\n }\n if (values[\"daemon-bin\"] || process.env.MINDWIRE_DAEMON) patch.daemonBin = path.resolve(values[\"daemon-bin\"] ?? process.env.MINDWIRE_DAEMON!);\n if (values.version) patch.version = values.version.replace(/^v/, \"\");\n if (values.relay || values[\"relay-url\"] || values[\"cloudflare-token-file\"]) {\n const kind = values.relay ?? \"custom\";\n if (![\"none\", \"cloudflare\", \"ngrok\", \"custom\"].includes(kind)) throw new Error(\"Choose relay none, cloudflare, ngrok or custom.\");\n patch.relay = { kind: kind as RelayOptions[\"kind\"], url: values[\"relay-url\"],\n cloudflareTokenFile: values[\"cloudflare-token-file\"] ? path.resolve(values[\"cloudflare-token-file\"]) : undefined };\n }\n emit(\"starting\", {}, \"Starting Mindwire…\");\n const client = await ensureComputer(directory, fileURLToPath(import.meta.url), patch,\n phase => emit(\"progress\", { message: phase }, phase));\n const info = await client.computer.info();\n emit(\"ready\", { computerId: info.computerId, routes: info.routes }, \"Mindwire is running in the background.\");\n if (command === \"start\") return;\n if (info.routes.some(route => route.kind === \"websocket\" && new URL(route.url).hostname.endsWith(\".trycloudflare.com\"))) {\n emit(\"temporary_address\", {}, \"Internet access is ready. This quick-tunnel address changes after a restart; use a stable hostname or VPN for regular access.\");\n }\n const invitation = await client.computer.invite(info.routes);\n const uri = computerPairingURI(invitation);\n emit(\"invitation\", { invitation, uri }, \"Open Mindwire on your phone → Add computer → Scan QR code.\");\n if (!values.json) {\n if (!values[\"no-qr\"]) {\n const QR = await import(\"qrcode\");\n process.stdout.write(await QR.toString(uri, { type: \"terminal\", small: true, errorCorrectionLevel: \"L\" }));\n }\n process.stdout.write(`\\nPairing link (expires in 5 minutes):\\n${uri}\\n\\nWaiting for your phone…\\n`);\n }\n let shownRequest: string | undefined;\n while (Date.now() < Date.parse(invitation.expiresAt)) {\n const pairing = await client.computer.pairing(invitation.pairingId);\n if (pairing.status === \"approved\") { emit(\"paired\", {}, \"Phone connected. You can close this terminal; Mindwire keeps running.\"); return; }\n if (pairing.status === \"rejected\") { emit(\"rejected\", {}, \"Pairing declined.\"); return; }\n if (pairing.request && shownRequest !== pairing.request.id) {\n shownRequest = pairing.request.id;\n const key = Buffer.from(pairing.request.publicKey.split(\" \")[1] ?? \"\", \"base64\");\n const fingerprint = \"SHA256:\" + createHash(\"sha256\").update(key).digest(\"base64\").replace(/=+$/, \"\");\n emit(\"approval_required\", { pairingId: invitation.pairingId, request: pairing.request, fingerprint },\n `\\n${safeName(pairing.request.name)} wants to connect.\\nDevice key: ${fingerprint}`);\n if (!process.stdin.isTTY) {\n emit(\"approval_command\", { command: `mindwire approve ${invitation.pairingId} ${pairing.request.id}` },\n `Review this device, then run:\\nmindwire approve ${invitation.pairingId} ${pairing.request.id}`);\n } else {\n const input = createInterface({ input: process.stdin, output: process.stderr });\n try {\n const answer = await input.question(\"Allow this phone to access this workspace? [y/N] \");\n await client.computer.decide(invitation.pairingId, pairing.request.id, /^y(es)?$/i.test(answer.trim()));\n } finally { input.close(); }\n }\n }\n await delay(750);\n }\n throw new Error(\"Pairing expired. Run mindwire connect to show a new QR code.\");\n }\n if (command === \"stop\") { await stopComputer(directory, values.force === true); emit(\"stopped\", {}, \"Mindwire stopped.\"); return; }\n const client = await computerClient(directory);\n switch (command) {\n case \"status\": {\n const [info, health, work, controller] = await Promise.all([client.computer.info(), client.health(), client.service.updateStatus(),\n readJSON<{ error?: string }>(path.join(directory, \"computer-controller.json\"))]);\n emit(\"status\", { ...info, daemonVersion: health.version, ...work, relayError: controller?.error },\n `Mindwire ${health.version} · ${work.idle ? \"idle\" : \"working\"}\\n${info.routes.map(route => route.kind === \"ssh\" ? `SSH ${route.host}:${route.port}` : route.url).join(\"\\n\")}${controller?.error ? `\\n${controller.error}` : \"\"}`);\n break;\n }\n case \"devices\": {\n const devices = await client.computer.devices();\n emit(\"devices\", { devices }, devices.length ? devices.map(d => `${safeName(d.name)} ${d.id}${d.revoked ? \" (revoked)\" : \"\"}`).join(\"\\n\") : \"No paired phones yet. Run mindwire connect.\");\n break;\n }\n case \"revoke\": {\n if (!positionals[1]) throw new Error(\"Use mindwire revoke DEVICE_ID (from mindwire devices).\");\n await client.computer.revoke(positionals[1]); emit(\"revoked\", {}, \"Device revoked and disconnected.\"); break;\n }\n case \"approve\": case \"reject\": {\n if (!positionals[1] || !positionals[2]) throw new Error(`Use mindwire ${command} PAIRING_ID REQUEST_ID.`);\n await client.computer.decide(positionals[1], positionals[2], command === \"approve\"); emit(command, {}, command === \"approve\" ? \"Phone approved.\" : \"Phone declined.\"); break;\n }\n case \"update\": {\n const version = (values.version ?? SDK_VERSION).replace(/^v/, \"\");\n const health = await client.health();\n if (health.version.replace(/^v/, \"\") === version) { emit(\"updated\", { version }, `Mindwire ${version} is already installed.`); return; }\n const requested = await client.computer.requestUpdate(version);\n emit(\"update_queued\", requested, \"Update queued. It will wait until all work and terminals are finished.\");\n let last = \"\";\n for (;;) {\n const update = await readJSON<ComputerUpdate>(path.join(directory, \"computer-update.json\"));\n if (update?.id !== requested.id) throw new Error(\"The update request changed. Run mindwire status.\");\n if (update.status !== last) { last = update.status; emit(\"update\", update, `Update: ${update.status}`); }\n if (update.status === \"complete\") return;\n if (update.status === \"failed\") throw new Error(update.error ?? \"Update failed.\");\n await delay(750);\n }\n }\n default: throw new Error(`Unknown command ${command}. Run mindwire --help.`);\n }\n}\n\nfunction isCLIEntry(): boolean {\n if (!process.argv[1]) return false;\n try {\n // npm links its bin command: argv keeps the link, while ESM resolves the module.\n return realpathSync(process.argv[1]) === realpathSync(fileURLToPath(import.meta.url));\n } catch {\n // Importing the CLI from an eval or another program must not start a service.\n return false;\n }\n}\n\nif (isCLIEntry()) {\n void main().catch(error => {\n const message = error instanceof Error ? error.message : String(error);\n if (process.argv.includes(\"--json\")) process.stderr.write(JSON.stringify({ event: \"error\", message }) + \"\\n\");\n else process.stderr.write(`Mindwire: ${message}\\n`);\n process.exitCode = 1;\n });\n}\n"]}
|