mindwire 0.1.52 → 0.1.54
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +97 -2
- package/dist/apps.d.ts +94 -0
- package/dist/bots.d.ts +168 -0
- package/dist/{chunk-4XL565EU.js → chunk-P3JTWITC.js} +190 -7
- package/dist/chunk-P3JTWITC.js.map +1 -0
- package/dist/{chunk-RTMQJIKW.js → chunk-ZNEFE6KD.js} +4 -10
- package/dist/chunk-ZNEFE6KD.js.map +1 -0
- package/dist/cli.js +21 -25
- package/dist/cli.js.map +1 -1
- package/dist/client.d.ts +12 -0
- package/dist/{connection-change-6E7QLJFC.js → connection-change-RVS6XWTC.js} +3 -3
- package/dist/{connection-change-6E7QLJFC.js.map → connection-change-RVS6XWTC.js.map} +1 -1
- package/dist/{controller-566LDBZD.js → controller-2WCEJ3F2.js} +4 -4
- package/dist/{controller-566LDBZD.js.map → controller-2WCEJ3F2.js.map} +1 -1
- package/dist/{controller-handoff-KNEQ5W6J.js → controller-handoff-7EOSPHSD.js} +3 -3
- package/dist/{controller-handoff-KNEQ5W6J.js.map → controller-handoff-7EOSPHSD.js.map} +1 -1
- package/dist/handoffs.d.ts +91 -0
- package/dist/index.cjs +209 -11
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +4 -0
- package/dist/index.js +200 -10
- package/dist/index.js.map +1 -1
- package/dist/integrations.d.ts +72 -0
- package/dist/target/docker.d.ts +9 -1
- package/dist/types.d.ts +21 -1
- package/dist/workspace.d.ts +14 -0
- package/package.json +10 -11
- package/dist/chunk-4XL565EU.js.map +0 -1
- package/dist/chunk-RTMQJIKW.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/computer.ts","../src/version.ts","../src/daemon-binary.ts","../src/computer/process.ts","../src/computer/relay-output.ts","../src/computer/provider-errors.ts","../src/computer/cloudflare-binary.ts","../src/computer/relay.ts","../src/computer/lock.ts","../src/http.ts","../src/sse.ts","../src/run.ts","../src/project-sync.ts","../src/conversations.ts","../src/workspace.ts","../src/bots.ts","../src/apps.ts","../src/integrations.ts","../src/surfaces.ts","../src/service.ts","../src/execution.ts","../src/voice.ts","../src/native-sessions.ts","../src/embedded.ts","../src/target/index.ts","../src/client.ts","../src/computer/lifecycle.ts"],"names":["path","binaryCacheDirectory","cachedExecutable","cacheExecutable","stat","resolve","delay","execute","promisify","execFile","path2","tmpdir","rm","path3","fs","randomUUID","readFile","payload","operation","emit","spawn","fs3","controller"],"mappings":"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","file":"chunk-P3JTWITC.js","sourcesContent":["import type { Mindwire } from \"./client.js\";\n\nexport type ComputerRoute = { kind: \"ssh\"; host: string; port: number } | { kind: \"websocket\"; url: string };\nexport interface ComputerConnectionInfo {\n provider: \"oblien\" | \"cloudflare\" | \"ngrok\" | \"custom\" | \"direct\";\n address: \"persistent\" | \"temporary\" | \"network\";\n}\nexport interface ComputerInvitation {\n version: 1; computerId: string; name: string; fingerprint: string; routes: ComputerRoute[];\n pairingId: string; secret: string; expiresAt: string;\n}\n/** Address refresh for an already paired phone. Contains no credential and grants no access;\n * the phone must authenticate with its saved key and verify its saved host fingerprint. */\nexport interface ComputerReconnectCode {\n version: 1; mode: \"reconnect\"; computerId: string; registryId: string; name: string;\n fingerprint: string; routes: ComputerRoute[]; expiresAt: string;\n}\nexport type ComputerConnectionCode = ComputerInvitation | ComputerReconnectCode;\nexport interface ComputerDevice {\n id: string; name: string; publicKey: string; createdAt: string; revoked: boolean;\n connected?: boolean;\n /** This phone acknowledged securely saving its address-discovery key. */\n addressRecovery?: boolean;\n}\nexport interface ComputerDiscoveryStatus {\n version: 1; enabled: boolean; directoryId: string; url?: string;\n sequence?: number; publishedSequence?: number; publishedAt?: number; error?: string;\n}\nexport interface ComputerDirectoryEnvelope { publicKey: string; payload: string; signature: string }\n/** Signature is a base64 Ed25519 proof over\n * `mindwire-computer-pairing-v1\\n${pairingId}\\n${id}\\n${name}\\n${publicKey}`.\n * With pairingVersion >= 2 an already approved key reconnects without a prompt.\n * Version 3 requires a signature on every device POST /pair (including retries).\n * Owner-facing pairing status omits the proof; GET /pair/{id} never returns a token. */\nexport interface ComputerPairRequest { id: string; name: string; publicKey: string; signature?: 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 /** Explicit owner restart; automatic requests omit this and wait for idle. */\n force?: boolean;\n status: \"idle\" | \"queued\" | \"downloading\" | \"waiting\" | \"restarting\" | \"complete\" | \"failed\";\n}\nexport interface ComputerInfo {\n version: number; computerId: string; registryId: string; fingerprint: string; routes: ComputerRoute[];\n pid: number; apiAddress: string; sshPort: number; websocketPort: number;\n portForwardingVersion?: number;\n /** 2 supports signed reconnection and atomic replacement of lost device keys.\n * 3 requires signed pairing acknowledgements and expires/revokes pairing transports. */\n pairingVersion?: number;\n connection?: ComputerConnectionInfo;\n discovery?: ComputerDiscoveryStatus;\n}\nexport interface ComputerForwardRequest {\n id: string; deviceId: string; port: number;\n /** A live human surface session is required for the virtual Mac display destination (8794). */\n desktopSessionId?: string;\n}\nexport interface ComputerForward extends ComputerForwardRequest { expiresAt: string }\n/** Available only in computer mode. All calls use the existing authenticated transport. */\nexport class ComputerApi {\n constructor(private readonly client: Mindwire) {}\n info(): Promise<ComputerInfo> { return this.client.http.request(\"GET\", \"/computer\"); }\n discovery(): Promise<ComputerDiscoveryStatus> { return this.client.http.request(\"GET\", \"/computer/discovery\"); }\n configureDiscovery(enabled: boolean, url?: string): Promise<ComputerDiscoveryStatus> {\n return this.client.http.request(\"PUT\", \"/computer/discovery\", { body: { enabled, url } });\n }\n directoryEnrollment(url: string, challenge: string): Promise<ComputerDirectoryEnvelope> {\n return this.client.http.request(\"POST\", \"/computer/discovery/enrollment\", { body: { url, challenge } });\n }\n setRoutes(routes: ComputerRoute[], connection?: ComputerConnectionInfo): Promise<ComputerInfo> {\n return this.client.http.request(\"PUT\", \"/computer/routes\", { body: { routes, connection } });\n }\n updateStatus(): Promise<ComputerUpdate> { return this.client.http.request(\"GET\", \"/computer/update\"); }\n /** Automatic requests wait for idle. With serviceUpdateVersion >= 2, force\n * promotes the same active request to an explicit restart without re-downloading. */\n requestUpdate(version: string, options: { force?: boolean } = {}): Promise<ComputerUpdate> {\n return this.client.http.request(\"POST\", \"/computer/update\", { body: { version, ...options } });\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 /** pairingVersion >= 2. Releases an unused QR when a saved phone reconnects.\n * Returns false if a phone already submitted a request, which must be handled. */\n closeUnusedPairing(id: string): Promise<{ cancelled: boolean }> {\n return this.client.http.request(\"DELETE\", `/computer/pairings/${encodeURIComponent(id)}`);\n }\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 async decide(id: string, requestId: string, approve: boolean, options: { replaceDeviceIds?: string[] } = {}): Promise<{ ok: boolean; device: ComputerDevice }> {\n if (options.replaceDeviceIds?.length && ((await this.info()).pairingVersion ?? 0) < 2) {\n throw new Error(\"Update the Mindwire service before replacing saved phone approvals.\");\n }\n return this.client.http.request(\"POST\", `/computer/pairings/${encodeURIComponent(id)}/decision`, { body: { requestId, approve, ...options } });\n }\n devices(): Promise<ComputerDevice[]> { return this.client.http.request(\"GET\", \"/computer/devices\"); }\n revoke(id: string): Promise<{ ok: boolean }> { return this.client.http.request(\"DELETE\", `/computer/devices/${encodeURIComponent(id)}`); }\n forwards(): Promise<ComputerForward[]> { return this.client.http.request(\"GET\", \"/computer/forwards\"); }\n /** Authorize a loopback port for this paired device. Renew the same ID every 30s;\n * grants expire after two minutes. Carry traffic using SSH direct-tcpip. */\n forward(request: ComputerForwardRequest): Promise<ComputerForward> {\n return this.client.http.request(\"POST\", \"/computer/forwards\", { body: request });\n }\n closeForward(id: string): Promise<{ ok: boolean }> {\n return this.client.http.request(\"DELETE\", `/computer/forwards/${encodeURIComponent(id)}`);\n }\n}\n\n/** The mobile scanner accepts raw JSON. Avoid base64 overhead in QR codes without\n * dropping routes, shortening the host pin or changing the pairing protocol.\n * This includes a short-lived secret; never log it to shared service logs. */\nexport function computerPairingQRData(invitation: ComputerConnectionCode): string {\n return JSON.stringify(invitation);\n}\n\n/** A URI carries an invitation, not permanent credentials. Never log it to shared service logs. */\nexport function computerPairingURI(invitation: ComputerConnectionCode): string {\n // UTF-8/base64url works in browsers too; no Node-only dependency in the protocol layer.\n const bytes = new TextEncoder().encode(computerPairingQRData(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 const action = \"mode\" in invitation && invitation.mode === \"reconnect\" ? \"reconnect\" : \"pair\";\n return `mindwire://${action}?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\nexport function versionAtLeast(actual: string | undefined, desired: string): boolean {\n if (actual === desired) return true;\n if (!actual || !/^\\d+\\.\\d+\\.\\d+$/.test(actual) || !/^\\d+\\.\\d+\\.\\d+$/.test(desired)) return false;\n const a = actual.split(\".\").map(Number), b = desired.split(\".\").map(Number);\n for (let i = 0; i < 3; i++) { if (a[i] !== b[i]) return a[i]! > b[i]!; }\n return true;\n}\n","// 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 /** Managed updates must not substitute a different release when an asset is missing. */\n exactVersion?: boolean;\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.exactVersion && !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","import { execFile, type ChildProcess } from \"node:child_process\";\nimport { readFile } from \"node:fs/promises\";\nimport { promisify } from \"node:util\";\nimport { setTimeout as delay } from \"node:timers/promises\";\n\nconst execute = promisify(execFile);\nexport interface ProcessIdentity { pid: number; start: string }\nexport interface ProcessState { pid: number; start?: string }\nexport interface OwnedProcess {\n readonly pid: number;\n readonly identity?: ProcessIdentity;\n alive(): boolean;\n close(): Promise<void>;\n}\n\nexport function processAlive(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\n/** Include process birth, not just its reusable PID, when adopting an orphan. */\nexport async function processIdentity(pid: number): Promise<ProcessIdentity | undefined> {\n if (!processAlive(pid)) return undefined;\n try {\n let start: string;\n if (process.platform === \"linux\") {\n const stat = await readFile(`/proc/${pid}/stat`, \"utf8\");\n const fields = stat.slice(stat.lastIndexOf(\")\") + 2).split(\" \");\n const boot = (await readFile(\"/proc/sys/kernel/random/boot_id\", \"utf8\")).trim();\n start = `${boot}:${fields[19]}`;\n } else if (process.platform === \"win32\") {\n const result = await execute(\"powershell.exe\", [\"-NoProfile\", \"-NonInteractive\", \"-Command\",\n `(Get-Process -Id ${pid} -ErrorAction Stop).StartTime.ToUniversalTime().Ticks`], { timeout: 5000, windowsHide: true });\n start = result.stdout.trim();\n } else {\n // ps is native on macOS; no flock or other Unix package is required.\n const result = await execute(\"/bin/ps\", [\"-p\", String(pid), \"-o\", \"lstart=\", \"-o\", \"comm=\"], {\n timeout: 3000, env: { ...process.env, LC_ALL: \"C\", TZ: \"UTC\" },\n });\n start = result.stdout.trim();\n }\n return start ? { pid, start } : undefined;\n } catch { return undefined; }\n}\n\nexport async function currentProcessIdentity(): Promise<ProcessIdentity> {\n const identity = await processIdentity(process.pid);\n if (!identity) throw new Error(\"Couldn't verify the Mindwire process identity. Retry the command.\");\n return identity;\n}\n\n/** Old CLI records contain only a PID. New records also survive PID reuse after\n * reboot, so an unrelated process cannot block recovery or receive Stop. */\nexport async function processStateAlive(state: ProcessState | undefined): Promise<boolean> {\n if (!state || !processAlive(state.pid)) return false;\n if (state.start === undefined) return true;\n const current = await processIdentity(state.pid);\n if (!current && processAlive(state.pid)) throw new Error(\"Couldn't verify the running Mindwire process. Retry the command.\");\n return !!state.start && current?.start === state.start;\n}\n\n/** Launch/startup locks used plain numeric PIDs before process identities. */\nexport async function readProcessState(file: string): Promise<ProcessState | undefined> {\n try {\n const state = JSON.parse(await readFile(file, \"utf8\"));\n if (typeof state === \"number\") return { pid: state };\n return state && typeof state.pid === \"number\" ? state : undefined;\n } catch (error) {\n if (error instanceof SyntaxError || (error as NodeJS.ErrnoException).code === \"ENOENT\") return undefined;\n throw error;\n }\n}\n\nexport async function ownChild(child: ChildProcess): Promise<OwnedProcess> {\n if (!child.pid) throw new Error(\"The background process could not start.\");\n const pid = child.pid;\n const identity = await processIdentity(pid);\n const alive = () => child.exitCode === null && child.signalCode === null;\n return { pid, identity, alive, async close() {\n if (!alive()) return;\n const exited = new Promise<void>(resolve => child.once(\"exit\", () => resolve()));\n child.kill(\"SIGTERM\");\n const timer = setTimeout(() => { if (alive()) child.kill(\"SIGKILL\"); }, 15_000);\n try { await exited; } finally { clearTimeout(timer); }\n } };\n}\n\nexport async function adoptProcess(identity: ProcessIdentity): Promise<OwnedProcess | undefined> {\n const matches = async () => (await processIdentity(identity.pid))?.start === identity.start;\n if (!await matches()) return undefined;\n return { pid: identity.pid, identity, alive: () => processAlive(identity.pid), async close() {\n if (!await matches()) return;\n process.kill(identity.pid, \"SIGTERM\");\n for (let attempt = 0; attempt < 60; attempt++) {\n if (!processAlive(identity.pid)) return;\n await delay(250);\n }\n // Never signal a new process that inherited the old PID.\n if (await matches()) process.kill(identity.pid, \"SIGKILL\");\n } };\n}\n","import { randomUUID } from \"node:crypto\";\nimport { open, rm, type FileHandle } from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport * as path from \"node:path\";\n\n/** A provider must not inherit pipes whose reader dies during a controller\n * upgrade. Use a private append-only file descriptor, consume startup output,\n * then discard it. A successor can adopt the same file without touching the\n * provider or its address. Raw provider output is never copied to our logs. */\nexport class RelayOutput {\n private position = 0;\n private timer?: ReturnType<typeof setInterval>;\n private pending: Promise<void> = Promise.resolve();\n private closing?: Promise<void>;\n\n private constructor(readonly file: string, private readonly handle: FileHandle) {}\n\n static async create(directory = tmpdir()): Promise<RelayOutput> {\n const file = path.join(directory, `.relay-output-${randomUUID()}.log`);\n return new RelayOutput(file, await open(file, \"ax+\", 0o600));\n }\n\n static async adopt(directory: string, file: string): Promise<RelayOutput | undefined> {\n // Only our private spool files can be truncated or removed during adoption.\n if (path.dirname(file) !== path.resolve(directory)\n || !/^\\.relay-output-[a-f0-9-]{36}\\.log$/.test(path.basename(file))) return;\n try {\n const output = new RelayOutput(file, await open(file, \"r+\"));\n output.discard();\n return output;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") throw error;\n }\n }\n\n get fd(): number { return this.handle.fd; }\n\n async read(): Promise<Buffer> {\n const { size } = await this.handle.stat();\n if (size > 2 * 1024 * 1024) throw new Error(\"The tunnel helper produced too much startup output. Check its configuration.\");\n const data = Buffer.alloc(Math.min(65_536, Math.max(0, size - this.position)));\n const { bytesRead } = await this.handle.read(data, 0, data.length, this.position);\n this.position += bytesRead;\n return data.subarray(0, bytesRead);\n }\n\n discard(): void {\n if (this.timer || this.closing) return;\n const drain = () => {\n // O_APPEND on the provider's descriptor ensures truncation never leaves\n // sparse holes. After readiness no log record is needed for connectivity.\n this.pending = this.pending.then(() => this.handle.truncate(0)).catch(() => {});\n };\n drain();\n this.timer = setInterval(drain, 2000);\n this.timer.unref();\n }\n\n close(): Promise<void> {\n return this.closing ??= (async () => {\n clearInterval(this.timer);\n await this.pending;\n await this.handle.close();\n await rm(this.file, { force: true });\n })();\n }\n}\n","export type ProviderErrorCode = \"provider_sign_in\" | \"provider_limit\" | \"provider_missing\" | \"provider_certificate\" | \"provider_configuration\" | \"provider_connection\";\n\nexport class ProviderConnectionError extends Error {\n constructor(readonly code: ProviderErrorCode, message: string) { super(message); this.name = \"ProviderConnectionError\"; }\n}\n\nexport function providerNeedsAction(code: string | undefined): boolean {\n return [\"provider_sign_in\", \"provider_limit\", \"provider_missing\", \"provider_certificate\", \"provider_configuration\"].includes(code ?? \"\");\n}\n\n/** Inspect transport causes, but never forward their raw text or headers. */\nexport function hasCertificateError(error: unknown): boolean {\n const seen = new Set<unknown>();\n for (let current = error; current && typeof current === \"object\" && seen.size < 8 && !seen.has(current);) {\n seen.add(current);\n const value = current as { message?: string; code?: string; cause?: unknown };\n if ([\"CERT_HAS_EXPIRED\", \"CERT_NOT_YET_VALID\", \"ERR_TLS_CERT_ALTNAME_INVALID\", \"DEPTH_ZERO_SELF_SIGNED_CERT\",\n \"SELF_SIGNED_CERT_IN_CHAIN\", \"UNABLE_TO_VERIFY_LEAF_SIGNATURE\", \"UNABLE_TO_GET_ISSUER_CERT_LOCALLY\", \"CERT_REVOKED\"].includes(value.code ?? \"\")\n || /certificate (?:has expired|expired|verify failed)|self[- ]signed certificate|CERT_HAS_EXPIRED/i.test(value.message ?? \"\")) return true;\n current = value.cause;\n }\n return false;\n}\n\nexport function providerFailure(error: unknown, provider: string): ProviderConnectionError {\n if (error instanceof ProviderConnectionError) return error;\n const value = error as { status?: number; code?: string; message?: string } | undefined;\n const setup = `mindwire connection ${provider.toLowerCase()}`;\n if (hasCertificateError(error)) return new ProviderConnectionError(\"provider_certificate\",\n `${provider}'s TLS certificate could not be verified. The tunnel provider must fix its certificate; also check this computer's date and time. Your saved phone keys are unchanged.`);\n if (value?.code === \"provider_sign_in\" || [401, 403].includes(value?.status ?? 0)\n || /unexpected server response: (?:401|403)\\b/i.test(value?.message ?? \"\")) {\n return new ProviderConnectionError(\"provider_sign_in\", `Sign in to ${provider} again with ${setup}. Your saved phone keys are unchanged.`);\n }\n if (value?.status === 402) return new ProviderConnectionError(\"provider_limit\", `${provider}'s tunnel allowance was reached. Check your plan in its dashboard or choose another provider.`);\n if (value?.status === 404) return new ProviderConnectionError(\"provider_missing\", `This computer's ${provider} tunnel was removed. Run ${setup} to configure it again.`);\n if (value?.status === 400 || value?.code === \"provider_configuration\") return new ProviderConnectionError(\"provider_configuration\", `${provider}'s connection settings are incomplete or invalid. Run ${setup} to configure it again.`);\n return new ProviderConnectionError(\"provider_connection\", `${provider} couldn't connect. Check internet access and the provider account, then run ${setup}.`);\n}\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 * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport { randomUUID } from \"node:crypto\";\nimport { setTimeout as delay } from \"node:timers/promises\";\nimport type { ComputerRoute } from \"../computer.js\";\nimport { cloudflareCommand } from \"./cloudflare-binary.js\";\nimport { ownChild, type OwnedProcess } from \"./process.js\";\nimport { RelayOutput } from \"./relay-output.js\";\nimport { ProviderConnectionError, providerNeedsAction, type ProviderErrorCode } from \"./provider-errors.js\";\n\nexport interface RelayOptions {\n kind: \"none\" | \"oblien\" | \"cloudflare\" | \"ngrok\" | \"custom\";\n /** A stable, already configured hostname; custom relays must forward WebSocket upgrades. */\n url?: string;\n cloudflareTokenFile?: string;\n cloudflareTunnelId?: string;\n cloudflareCredentialsFile?: string;\n ngrokTokenFile?: string;\n oblienTunnelId?: number;\n oblienCredentialsFile?: string;\n}\nexport interface RelayHandle { route?: ComputerRoute; process?: ChildProcess; owner?: OwnedProcess; outputFile?: string; configFile?: string; close(): void | Promise<void> }\n\nexport async function adoptRelay(owner: OwnedProcess, route: ComputerRoute | undefined, directory: string, outputFile?: string, configFile?: string): Promise<RelayHandle> {\n const output = outputFile ? await RelayOutput.adopt(directory, outputFile) : undefined;\n const ownedConfig = configFile && path.dirname(configFile) === path.resolve(directory) && /^\\.relay-config-[a-f0-9-]{36}\\.json$/.test(path.basename(configFile)) ? configFile : undefined;\n return { route, owner, outputFile: output?.file, configFile: ownedConfig,\n async close() { await owner.close(); await output?.close(); if (ownedConfig) await fs.rm(ownedConfig, { force: true }); } };\n}\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\nexport function validateRelayOptions(options: RelayOptions): void {\n if (options.url) websocketURL(options.url);\n if (options.kind === \"custom\" && !options.url) throw new Error(\"A custom relay needs --relay-url wss://your-host/ssh.\");\n if (options.kind === \"oblien\" && (!options.url || !options.oblienCredentialsFile\n || !Number.isSafeInteger(options.oblienTunnelId) || options.oblienTunnelId! < 1)) {\n throw new Error(\"Oblien setup is incomplete. Run mindwire connection oblien.\");\n }\n if (options.kind === \"cloudflare\") {\n const named = !!options.cloudflareTokenFile || !!options.cloudflareCredentialsFile && !!options.cloudflareTunnelId;\n if (named && !options.url || options.url && !named) throw new Error(\"A named Cloudflare tunnel needs its hostname and credentials. Run mindwire connection cloudflare.\");\n if (options.cloudflareTokenFile && options.cloudflareCredentialsFile) throw new Error(\"Choose one Cloudflare tunnel credential source.\");\n }\n if (options.kind === \"ngrok\" && options.ngrokTokenFile && !options.url) throw new Error(\"ngrok needs a reserved domain. Run mindwire connection ngrok.\");\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; outputDirectory?: string; cliPath?: string; onProgress?: (message: string) => void | Promise<void>;\n signal?: AbortSignal; onSpawn?: (owner: OwnedProcess, outputFile: string, configFile?: string) => Promise<void>;\n} = {}): Promise<RelayHandle> {\n runtime.signal?.throwIfAborted();\n validateRelayOptions(options);\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 configFile: string | undefined;\n const managed = options.kind === \"oblien\" || options.kind === \"ngrok\" && !!options.ngrokTokenFile;\n let command: string, args: string[];\n if (managed) {\n if (!runtime.cliPath || !runtime.outputDirectory) throw new Error(\"The managed relay needs its connection controller.\");\n configFile = path.join(runtime.outputDirectory, `.relay-config-${randomUUID()}.json`);\n await fs.writeFile(configFile, JSON.stringify({ options, port }), { mode: 0o600 });\n command = process.execPath;\n args = [runtime.cliPath, \"_relay\", \"--relay-config\", configFile];\n await runtime.onProgress?.(`Connecting through ${options.kind === \"oblien\" ? \"Oblien\" : \"ngrok\"}…`);\n } else if (options.kind === \"cloudflare\") {\n command = await cloudflareCommand(runtime);\n await runtime.onProgress?.(\"Connecting through Cloudflare…\");\n if (options.cloudflareCredentialsFile && options.cloudflareTunnelId) {\n if (!options.url || !runtime.outputDirectory) throw new Error(\"Named Cloudflare tunnel setup is incomplete.\");\n configFile = path.join(runtime.outputDirectory, `.relay-config-${randomUUID()}.json`);\n // JSON is valid YAML. Avoid interpolating a hostname/path into YAML syntax.\n await fs.writeFile(configFile, JSON.stringify({ tunnel: options.cloudflareTunnelId, \"credentials-file\": options.cloudflareCredentialsFile,\n ingress: [{ hostname: new URL(websocketURL(options.url)).hostname, service: origin }, { service: \"http_status:404\" }] }), { mode: 0o600 });\n args = [\"tunnel\", \"--config\", configFile, \"--no-autoupdate\", \"run\"];\n } else 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 runtime.signal?.throwIfAborted();\n const output = await RelayOutput.create(runtime.outputDirectory);\n const child = spawn(command, args, { env, detached: true, stdio: [\"ignore\", output.fd, output.fd], windowsHide: true });\n let failure: Error | undefined;\n child.on(\"error\", error => { failure = error; });\n let owner: OwnedProcess | undefined;\n try {\n await new Promise<void>((resolve, reject) => { child.once(\"spawn\", resolve); child.once(\"error\", reject); });\n owner = await ownChild(child);\n await runtime.onSpawn?.(owner, output.file, configFile);\n const deadline = Date.now() + 45_000;\n let buffer = \"\", cloudflareAddress = options.url, cloudflareConnected = false;\n while (Date.now() < deadline) {\n runtime.signal?.throwIfAborted();\n if (failure) throw new Error(`Could not run ${options.kind}. Check its installation.`, { cause: failure });\n const received = buffer + (await output.read()).toString();\n buffer = received.slice(-16_384);\n let found: string | undefined;\n if (!managed && options.kind === \"cloudflare\") {\n cloudflareAddress ??= received.match(/https:\\/\\/[a-z0-9-]+\\.trycloudflare\\.com/)?.[0];\n cloudflareConnected ||= /Registered tunnel connection/.test(received);\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; event?: string; message?: string; code?: string };\n if (managed && event.event === \"relay_error\") failure = new ProviderConnectionError(\n providerNeedsAction(event.code) ? event.code as ProviderErrorCode : \"provider_connection\", event.message ?? \"The provider couldn't connect.\");\n if (managed && event.event === \"relay_ready\") found = event.url;\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) {\n const route: ComputerRoute = { kind: \"websocket\", url: websocketURL(found) };\n output.discard();\n const provider = owner;\n return { route, process: child, owner, outputFile: output.file, configFile,\n async close() { await provider.close(); await output.close(); if (configFile) await fs.rm(configFile, { force: true }); } };\n }\n if (failure) throw failure;\n if (!owner.alive()) throw new Error(`${options.kind} exited before the tunnel connected. Check its account configuration.`);\n await delay(50, undefined, { signal: runtime.signal });\n }\n throw new Error(`${options.kind} did not establish its tunnel. Check your internet connection and its configuration.`);\n } catch (error) {\n if (owner) await owner.close();\n else if (child.pid) await (await ownChild(child)).close();\n await output.close();\n if (configFile) await fs.rm(configFile, { force: true });\n throw error;\n }\n}\n","import { randomUUID } from \"node:crypto\";\nimport * as fs from \"node:fs/promises\";\nimport { setTimeout as delay } from \"node:timers/promises\";\nimport { currentProcessIdentity, processStateAlive, readProcessState, type ProcessIdentity } from \"./process.js\";\n\ninterface Claim { owner: ProcessIdentity; ticket: number | null }\nexport interface ProcessLock { close(): Promise<void> }\n\n/** Serialize lock-file acquisition and stale recovery with a bakery queue. Each\n * waiter owns a unique, atomically published ticket; it never removes another\n * live waiter's ticket. That prevents two stale-lock cleaners deleting a newly\n * acquired lock. Process birth also makes abandoned tickets safe after reboot. */\nexport async function acquireProcessLock(file: string, options: {\n signal?: AbortSignal; onWait?: () => Promise<boolean>;\n} = {}): Promise<ProcessLock | undefined> {\n const owner = await currentProcessIdentity();\n const queue = file + \".queue\", id = randomUUID() + \".json\", claimPath = queue + \"/\" + id;\n await fs.mkdir(queue, { recursive: true, mode: 0o700 });\n let lock: fs.FileHandle | undefined;\n const release = async () => {\n try {\n if (lock) {\n const held = lock; lock = undefined;\n const owned = await held.stat();\n await held.close();\n const current = await fs.stat(file).catch(() => undefined);\n if (current?.ino === owned.ino && current.dev === owned.dev) await fs.rm(file, { force: true });\n }\n } finally { await fs.rm(claimPath, { force: true }); }\n };\n const publish = async (claim: Claim) => {\n const temporary = claimPath + \".tmp\";\n try {\n await fs.writeFile(temporary, JSON.stringify(claim), { mode: 0o600 });\n await fs.rename(temporary, claimPath);\n } finally { await fs.rm(temporary, { force: true }); }\n };\n const claims = async () => {\n const entries: { id: string; claim: Claim }[] = [];\n for (const candidate of await fs.readdir(queue)) {\n if (!candidate.endsWith(\".json\")) continue;\n const content = await fs.readFile(queue + \"/\" + candidate, \"utf8\").catch(error => {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return undefined;\n throw error;\n });\n if (content === undefined) continue;\n const claim = JSON.parse(content) as Claim;\n if (!claim.owner || claim.ticket !== null && (!Number.isSafeInteger(claim.ticket) || claim.ticket < 1)) {\n throw new Error(\"Invalid Mindwire lock ticket.\");\n }\n if (await processStateAlive(claim.owner)) entries.push({ id: candidate, claim });\n else await fs.rm(queue + \"/\" + candidate, { force: true });\n }\n return entries;\n };\n try {\n options.signal?.throwIfAborted();\n await publish({ owner, ticket: null });\n const ticket = Math.max(0, ...(await claims()).map(entry => entry.claim.ticket ?? 0)) + 1;\n if (!Number.isSafeInteger(ticket)) throw new Error(\"Mindwire's connection queue is full. Retry shortly.\");\n await publish({ owner, ticket });\n const deadline = Date.now() + 30_000;\n while (Date.now() < deadline) {\n options.signal?.throwIfAborted();\n if (await options.onWait?.()) { await release(); return undefined; }\n const ahead = (await claims()).some(entry => entry.id !== id && (entry.claim.ticket === null\n || entry.claim.ticket < ticket || entry.claim.ticket === ticket && entry.id < id));\n if (!ahead) {\n try {\n lock = await fs.open(file, \"wx\", 0o600);\n await lock.writeFile(JSON.stringify(owner));\n return { close: release };\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"EEXIST\") throw error;\n const holder = await readProcessState(file);\n const age = Date.now() - (await fs.stat(file).catch(() => ({ mtimeMs: Date.now() }))).mtimeMs;\n if (age > 5000 && !await processStateAlive(holder)) { await fs.rm(file, { force: true }); continue; }\n }\n }\n await delay(250, undefined, { signal: options.signal });\n }\n throw new Error(\"Another Mindwire operation is in progress. Try again shortly.\");\n } catch (error) { await release(); throw error; }\n}\n","import { ApiError, MindwireError, TimeoutError } from \"./errors.js\";\n\n/** A `fetch` implementation. Defaults to the global `fetch` (Node 18+, Bun, Deno, browsers). */\nexport type FetchLike = (input: string, init?: RequestInit) => Promise<Response>;\n\n/** Default deadline for a single unary request. Long enough to cover a cold daemon, short enough\n * that a wedged connection surfaces as an error instead of an indefinite hang. */\nconst DEFAULT_TIMEOUT_MS = 120_000;\n\n/** True for a fetch rejection caused by an `AbortSignal` firing (user cancel or our own timeout). */\nfunction isAbortError(e: unknown): boolean {\n return typeof e === \"object\" && e !== null && (e as { name?: unknown }).name === \"AbortError\";\n}\n\n/**\n * Fetches the current bearer token for a transport whose credential rotates (e.g. the Oblien\n * gateway JWT). Called per request — implementations should cache and only mint on `{force:true}`\n * or expiry. `request()`/`open()` call it with `{force:true}` once on a `401`, then retry.\n */\nexport type TokenGetter = (opts?: { force?: boolean }) => Promise<string | undefined>;\n\n/**\n * Resolves the daemon's base URL, plus an optional static token, an optional dynamic `getToken`\n * (for rotating credentials), and optional per-transport `headers` merged into every request\n * (e.g. the Oblien proxy target). Called once, lazily, and memoized.\n */\nexport type BaseResolver = () => Promise<{\n baseUrl: string;\n token?: string;\n getToken?: TokenGetter;\n headers?: Record<string, string>;\n /**\n * A transport-specific `fetch` for this base — used for both unary requests and SSE streams. A\n * sandbox adapter supplies it to route every call through its runtime (e.g. Oblien's `rt.proxy`);\n * when omitted the client's default fetch is used, so embedded/remote transports are unchanged.\n */\n fetch?: FetchLike;\n}>;\n\nexport interface HttpOptions {\n /** Base URL of a running daemon, e.g. `http://127.0.0.1:8790`. */\n baseUrl?: string;\n /** Per-sandbox bearer token. */\n token?: string;\n /** Lazily resolve the base URL (used by the embedded transport to spawn on first call). */\n resolveBase?: BaseResolver;\n /** Custom fetch. Defaults to global `fetch`. */\n fetch?: FetchLike;\n /** Extra headers merged into every request. */\n headers?: Record<string, string>;\n /**\n * Deadline in milliseconds for a single unary request. Does NOT apply to SSE streams (`open()`),\n * which are long-lived by design. Defaults to {@link DEFAULT_TIMEOUT_MS}; pass `0` to disable.\n */\n timeoutMs?: number;\n}\n\nexport interface RequestInitLike {\n query?: Record<string, string | number | boolean | undefined>;\n body?: unknown;\n signal?: AbortSignal;\n headers?: Record<string, string>;\n}\n\ninterface Base {\n baseUrl: string;\n token?: string;\n getToken?: TokenGetter;\n headers?: Record<string, string>;\n fetch?: FetchLike;\n}\n\n/**\n * The low-level transport: URL/auth/JSON/error plumbing shared by every high-level method.\n * The base URL is resolved lazily and memoized — a fixed `baseUrl` resolves instantly; the\n * embedded transport spawns the daemon on the first request.\n */\nexport class Http {\n private readonly fetchImpl: FetchLike;\n private readonly baseHeaders: Record<string, string>;\n private readonly resolver: BaseResolver;\n private readonly timeoutMs: number;\n private cached: Base | null = null;\n private pending: Promise<Base> | null = null;\n\n constructor(opts: HttpOptions) {\n const f = opts.fetch ?? (globalThis.fetch as FetchLike | undefined);\n if (!f) {\n throw new MindwireError(\n \"mindwire: no global fetch found — pass a `fetch` implementation in the client options\",\n );\n }\n this.fetchImpl = f;\n this.baseHeaders = { ...opts.headers };\n this.timeoutMs = opts.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n if (opts.baseUrl) {\n const base: Base = { baseUrl: opts.baseUrl.replace(/\\/+$/, \"\"), token: opts.token };\n this.resolver = async () => base;\n } else if (opts.resolveBase) {\n const rb = opts.resolveBase;\n this.resolver = async () => {\n const r = await rb();\n return {\n baseUrl: r.baseUrl.replace(/\\/+$/, \"\"),\n token: r.token ?? opts.token,\n getToken: r.getToken,\n headers: r.headers,\n fetch: r.fetch,\n };\n };\n } else {\n throw new MindwireError(\"mindwire: Http requires a baseUrl or a resolveBase\");\n }\n }\n\n /**\n * One fetch, with raw network failures wrapped as {@link MindwireError} so callers see a typed\n * SDK error instead of a bare `TypeError: fetch failed`. An abort (the request's own signal, or\n * our timeout controller) is re-thrown untouched — `fetchWithTimeout` classifies it.\n */\n private async fetchOnce(\n f: FetchLike,\n url: string,\n init: RequestInit,\n method: string,\n path: string,\n ): Promise<Response> {\n try {\n return await f(url, init);\n } catch (e) {\n const aborted = init.signal?.aborted ?? false;\n if (aborted || isAbortError(e)) throw e; // an abort, not a network fault — leave it for the caller\n throw new MindwireError(`mindwire: ${method} ${path} — network request failed`, { cause: e });\n }\n }\n\n /**\n * `fetchOnce` plus a timeout that composes with the caller's `signal`. A hand-rolled controller\n * (not `AbortSignal.timeout`/`AbortSignal.any`, which need Node 20.3+/18.17+) fires after\n * `timeoutMs`; whichever aborts first wins. Timeout → {@link TimeoutError}; the caller's own abort\n * propagates as-is (its `reason`). `timeoutMs<=0` disables the deadline entirely.\n */\n private async fetchWithTimeout(\n f: FetchLike,\n url: string,\n init: RequestInit,\n userSignal: AbortSignal | undefined,\n method: string,\n path: string,\n ): Promise<Response> {\n if (!this.timeoutMs || this.timeoutMs <= 0) {\n return this.fetchOnce(f, url, { ...init, ...(userSignal ? { signal: userSignal } : {}) }, method, path);\n }\n const ctrl = new AbortController();\n const onAbort = () => ctrl.abort(userSignal?.reason);\n if (userSignal) {\n if (userSignal.aborted) ctrl.abort(userSignal.reason);\n else userSignal.addEventListener(\"abort\", onAbort, { once: true });\n }\n let timedOut = false;\n const timer = setTimeout(() => {\n timedOut = true;\n ctrl.abort();\n }, this.timeoutMs);\n try {\n return await this.fetchOnce(f, url, { ...init, signal: ctrl.signal }, method, path);\n } catch (e) {\n if (timedOut) throw new TimeoutError(method, path, this.timeoutMs);\n if (userSignal?.aborted) throw userSignal.reason ?? e; // caller cancelled — surface their reason\n throw e;\n } finally {\n clearTimeout(timer);\n if (userSignal) userSignal.removeEventListener(\"abort\", onAbort);\n }\n }\n\n /**\n * The bearer token for the next request. Prefers the transport's dynamic `getToken` (which\n * caches and mints on demand); falls back to the static token resolved at base time. `force`\n * asks the getter to re-mint — used once on a 401 before retrying.\n */\n private async authToken(base: Base, force: boolean): Promise<string | undefined> {\n if (base.getToken) {\n const t = await base.getToken(force ? { force: true } : undefined);\n return t ?? base.token;\n }\n return base.token;\n }\n\n private base(): Promise<Base> {\n if (this.cached) return Promise.resolve(this.cached);\n if (!this.pending) {\n // Memoize the in-flight provision, but drop it on failure so a cold-start error (e.g. a fresh\n // SSH box that wasn't ready) can be retried by the next `ensure()`/request instead of latching.\n this.pending = this.resolver()\n .then((b) => (this.cached = b))\n .catch((err) => {\n this.pending = null;\n throw err;\n });\n }\n return this.pending;\n }\n\n /**\n * Resolve the base eagerly and memoize it — provisions the transport (spawns the embedded daemon,\n * connects the sandbox/SSH/Docker target, …) now instead of on the first request. Idempotent: this\n * awaits the *same* memoized promise the first `request()`/`open()` awaits, so the target's\n * `connect()` fires exactly once. Backs {@link import(\"./client.js\").Mindwire.ensure}.\n */\n async ready(): Promise<void> {\n await this.base();\n }\n\n private url(baseUrl: string, path: string, query?: RequestInitLike[\"query\"]): string {\n const u = new URL(baseUrl + (path.startsWith(\"/\") ? path : `/${path}`));\n if (query) {\n for (const [k, v] of Object.entries(query)) {\n if (v !== undefined) u.searchParams.set(k, String(v));\n }\n }\n return u.toString();\n }\n\n private headers(token: string | undefined, extra?: Record<string, string>, hasBody = false): Record<string, string> {\n const h: Record<string, string> = { Accept: \"application/json\", ...this.baseHeaders, ...extra };\n if (token) h[\"Authorization\"] = `Bearer ${token}`;\n if (hasBody) h[\"Content-Type\"] = \"application/json\";\n return h;\n }\n\n async request<T>(method: string, path: string, init: RequestInitLike = {}): Promise<T> {\n const base = await this.base();\n const hasBody = init.body !== undefined;\n const url = this.url(base.baseUrl, path, init.query);\n const extra = { ...base.headers, ...init.headers };\n const f = base.fetch ?? this.fetchImpl;\n const send = async (force: boolean) =>\n this.fetchWithTimeout(\n f,\n url,\n {\n method,\n headers: this.headers(await this.authToken(base, force), extra, hasBody),\n body: hasBody ? JSON.stringify(init.body) : undefined,\n },\n init.signal,\n method,\n path,\n );\n\n let res = await send(false);\n // One-shot re-mint + retry for rotating credentials (e.g. an expired gateway JWT).\n if (res.status === 401 && base.getToken) res = await send(true);\n\n if (!res.ok) throw await this.toApiError(method, res);\n if (res.status === 204) return undefined as T;\n\n const text = await res.text();\n if (text === \"\") return undefined as T;\n try {\n return JSON.parse(text) as T;\n } catch (e) {\n throw new MindwireError(`mindwire: ${method} ${path} returned a non-JSON body`, { cause: e });\n }\n }\n\n /** Open a streaming response (SSE). Caller owns the body. */\n async open(method: string, path: string, init: RequestInitLike = {}): Promise<Response> {\n const base = await this.base();\n const url = this.url(base.baseUrl, path, init.query);\n const extra = { Accept: \"text/event-stream\", ...base.headers, ...init.headers };\n const f = base.fetch ?? this.fetchImpl;\n // No timeout: SSE streams are long-lived. We still wrap network faults (via fetchOnce) so a\n // connection refused surfaces as a MindwireError rather than a bare `TypeError: fetch failed`.\n const send = async (force: boolean) =>\n this.fetchOnce(\n f,\n url,\n {\n method,\n headers: this.headers(await this.authToken(base, force), extra, init.body !== undefined),\n ...(init.body !== undefined ? { body: JSON.stringify(init.body) } : {}),\n ...(init.signal ? { signal: init.signal } : {}),\n },\n method,\n path,\n );\n\n let res = await send(false);\n if (res.status === 401 && base.getToken) res = await send(true);\n\n if (!res.ok) throw await this.toApiError(method, res);\n if (!res.body)\n throw new MindwireError(`mindwire: ${method} ${path} returned no response body to stream`);\n return res;\n }\n\n private async toApiError(method: string, res: Response): Promise<ApiError> {\n let body: unknown = \"\";\n try {\n const text = await res.text();\n try {\n body = text ? JSON.parse(text) : \"\";\n } catch {\n body = text;\n }\n } catch {\n /* ignore body read failures */\n }\n return new ApiError({ status: res.status, url: res.url, method, body });\n }\n}\n","/**\n * A minimal, dependency-free Server-Sent Events reader.\n *\n * The daemon streams `data: <json>\\n\\n` frames (one JSON object per event) plus `: ping`\n * comment keepalives and an initial `{ \"type\": \"status\", \"meta\": { \"stream\": \"open\" } }`\n * sentinel. This parser handles multi-line `data:` fields and `\\r\\n`/`\\n` line endings, and\n * yields the JSON-parsed payload of each event.\n *\n * We read via `ReadableStream.getReader()` rather than `for await` so it works on every\n * runtime with WHATWG streams (Node 18+ undici, Deno, Bun, browsers), not only those that\n * made the stream async-iterable.\n */\nexport async function* readSSE<T>(\n body: ReadableStream<Uint8Array>,\n signal?: AbortSignal,\n): AsyncGenerator<T, void, unknown> {\n const reader = body.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n const onAbort = () => void reader.cancel().catch(() => {});\n if (signal) {\n if (signal.aborted) {\n await reader.cancel().catch(() => {});\n return;\n }\n signal.addEventListener(\"abort\", onAbort, { once: true });\n }\n\n try {\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n buffer += decoder.decode(value, { stream: true });\n\n // Events are separated by a blank line. Normalize CRLF first.\n let sep: number;\n while ((sep = indexOfBlankLine(buffer)) !== -1) {\n const rawEvent = buffer.slice(0, sep);\n buffer = buffer.slice(sepEnd(buffer, sep));\n const payload = parseEvent(rawEvent);\n if (payload !== undefined) yield JSON.parse(payload) as T;\n }\n }\n // Flush any trailing event that wasn't terminated by a blank line.\n const payload = parseEvent(buffer);\n if (payload !== undefined) yield JSON.parse(payload) as T;\n } finally {\n if (signal) signal.removeEventListener(\"abort\", onAbort);\n // Breaking a consumer loop must release the HTTP stream as well as its reader.\n await reader.cancel().catch(() => {});\n reader.releaseLock();\n }\n}\n\n/** Index of the start of the blank-line separator (`\\n\\n` or `\\r\\n\\r\\n`), or -1. */\nfunction indexOfBlankLine(s: string): number {\n const a = s.indexOf(\"\\n\\n\");\n const b = s.indexOf(\"\\r\\n\\r\\n\");\n if (a === -1) return b;\n if (b === -1) return a;\n return Math.min(a, b);\n}\n\n/** Length of the separator that starts at `idx`, so the next event begins after it. */\nfunction sepEnd(s: string, idx: number): number {\n return s.startsWith(\"\\r\\n\\r\\n\", idx) ? idx + 4 : idx + 2;\n}\n\n/**\n * Extract the concatenated `data:` payload of one raw SSE event block. Comment lines\n * (starting with `:`) and non-data fields are ignored. Returns `undefined` for an event\n * with no data lines (e.g. a lone keepalive comment).\n */\nfunction parseEvent(block: string): string | undefined {\n const lines = block.split(/\\r\\n|\\n/);\n const data: string[] = [];\n for (const line of lines) {\n if (line === \"\" || line.startsWith(\":\")) continue;\n const colon = line.indexOf(\":\");\n const field = colon === -1 ? line : line.slice(0, colon);\n if (field !== \"data\") continue;\n let value = colon === -1 ? \"\" : line.slice(colon + 1);\n if (value.startsWith(\" \")) value = value.slice(1); // SSE strips one leading space\n data.push(value);\n }\n if (data.length === 0) return undefined;\n return data.join(\"\\n\");\n}\n","import type { Http } from \"./http.js\";\nimport { readSSE } from \"./sse.js\";\nimport { RunFailedError } from \"./errors.js\";\nimport type { Attachment, 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, options: { requestId?: string; attachments?: Attachment[] } = {}): Promise<void> {\n await this.http.request<void>(\"POST\", `/runs/${encodeURIComponent(this.id)}/input`, { body: { text, ...options } });\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 { ApiError, MindwireError } from \"./errors.js\";\n\nexport interface ProjectSyncEntry {\n kind: \"file\" | \"directory\" | \"symlink\";\n mode: number;\n size: number;\n chunks?: string[];\n link?: string;\n jsonLines?: boolean;\n}\n\nexport interface ProjectSyncCheckpoint {\n id: string;\n projectId: string;\n parents: string[];\n manifest: ProjectSyncEntry;\n objectCount: number;\n bytes: number;\n}\n\nexport interface ProjectSyncRequest {\n /** Durable idempotency key. Keep the same ID after a lost acknowledgement. */\n id: string;\n projectId?: string;\n checkpointId?: string;\n /** Only needed on first import; subsequent imports find the preserved replica. */\n path?: string;\n /** Literal project-relative ignored files/folders to include. Default: respect Git ignores. */\n includeIgnored?: string[];\n /** Preview scope token. Re-review if ignore rules or tracked paths change. */\n selectionToken?: string;\n}\n\nexport interface ProjectSyncPreviewRequest {\n projectId: string;\n includeIgnored?: string[];\n cursor?: number;\n}\nexport interface ProjectSyncIgnoredPath {\n path: string;\n kind: \"file\" | \"directory\";\n included: boolean;\n}\nexport interface ProjectSyncPreview {\n version: number;\n fileCount: number;\n /** Selected working-file bytes; Git history and conversations are additional. */\n bytes: number;\n ignoredCount: number;\n ignored: ProjectSyncIgnoredPath[];\n includeIgnored: string[];\n next?: number;\n selectionToken: string;\n}\n\nexport interface ProjectSyncConflict {\n path: string;\n kind: \"file\" | \"conversation\" | \"git\" | \"recovery\";\n message: string;\n}\n\nexport interface ProjectSyncOperation extends ProjectSyncRequest {\n kind: \"export\" | \"import\";\n status: \"queued\" | \"exporting\" | \"preparing\" | \"applying\" | \"succeeded\" | \"conflicts\" | \"failed\" | \"recovery_required\";\n phase: string;\n progress: number;\n resultProjectId?: string;\n resultCheckpointId?: string;\n recoveryCheckpointId?: string;\n conflicts?: ProjectSyncConflict[];\n error?: string;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface ProjectSyncProgress {\n phase: \"checkpoint\" | \"transfer\" | \"apply\";\n transferredBytes: number;\n operation?: ProjectSyncOperation;\n}\n\nexport class ProjectSyncError extends MindwireError {\n constructor(readonly operation: ProjectSyncOperation) {\n super(operation.error ?? (operation.status === \"conflicts\"\n ? \"Changes conflict. Both workspace copies and their checkpoints are preserved.\"\n : `Project synchronization ${operation.status}.`));\n this.name = \"ProjectSyncError\";\n }\n}\n\nconst active = (o: ProjectSyncOperation): boolean => [\"queued\", \"exporting\", \"preparing\", \"applying\"].includes(o.status);\nconst prefix = \"/workspace/sync\";\ntype Options = { signal?: AbortSignal };\n\nconst selectionPaths = (paths: string[] = []): string[] => {\n const sorted = [...new Set(paths.map(path => path.replace(/\\/$/, \"\")))].sort();\n const selected = new Set(sorted);\n return sorted.filter(path => {\n let parent = path;\n while (parent.includes(\"/\")) {\n parent = parent.slice(0, parent.lastIndexOf(\"/\"));\n if (selected.has(parent)) return false;\n }\n return true;\n });\n};\n\nfunction delay(ms: number, signal?: AbortSignal): Promise<void> {\n signal?.throwIfAborted();\n return new Promise((resolve, reject) => {\n const done = () => { signal?.removeEventListener(\"abort\", abort); resolve(); };\n const timer = setTimeout(done, ms);\n const abort = () => { clearTimeout(timer); signal?.removeEventListener(\"abort\", abort); reject(signal?.reason); };\n signal?.addEventListener(\"abort\", abort, { once: true });\n });\n}\n\n/** Shared checkpoint protocol over the existing authenticated workspace transport.\n * No Git hosting service or third-party storage is involved. Native adapters in\n * the daemon own export/import; clients only relay verified immutable chunks.\n */\nexport class ProjectSyncApi {\n private readonly flights = new Map<string, { intent: string; target: ProjectSyncApi; result: Promise<ProjectSyncOperation> }>();\n constructor(private readonly mw: Mindwire) {}\n\n private async requireSelectionSupport(): Promise<void> {\n if (((await this.mw.health()).projectSyncVersion ?? 0) < 2)\n throw new MindwireError(\"Update Mindwire on both workspaces to review and switch selected project files.\");\n }\n async preview(request: ProjectSyncPreviewRequest, options: Options = {}): Promise<ProjectSyncPreview> {\n await this.requireSelectionSupport();\n return this.mw.http.request(\"POST\", `${prefix}/preview`, { body: request, ...options });\n }\n async export(request: ProjectSyncRequest, options: Options = {}): Promise<ProjectSyncOperation> {\n await this.requireSelectionSupport();\n return this.mw.http.request(\"POST\", `${prefix}/exports`, { body: request, ...options });\n }\n import(request: ProjectSyncRequest, options: Options = {}): Promise<ProjectSyncOperation> {\n return this.mw.http.request(\"POST\", `${prefix}/imports`, { body: request, ...options });\n }\n async list(options: Options = {}): Promise<ProjectSyncOperation[]> {\n const response = await this.mw.http.request<{ operations: ProjectSyncOperation[] }>(\"GET\", `${prefix}/operations`, options);\n return response.operations;\n }\n get(id: string, options: Options = {}): Promise<ProjectSyncOperation> {\n return this.mw.http.request(\"GET\", `${prefix}/operations/${encodeURIComponent(id)}`, options);\n }\n retry(id: string, options: Options = {}): Promise<ProjectSyncOperation> {\n return this.mw.http.request(\"POST\", `${prefix}/operations/${encodeURIComponent(id)}/retry`, options);\n }\n cancel(id: string): Promise<ProjectSyncOperation> {\n return this.mw.http.request(\"POST\", `${prefix}/operations/${encodeURIComponent(id)}/cancel`);\n }\n checkpoint(id: string, options: Options = {}): Promise<ProjectSyncCheckpoint> {\n return this.mw.http.request(\"GET\", `${prefix}/checkpoints/${encodeURIComponent(id)}`, options);\n }\n acceptCheckpoint(checkpoint: ProjectSyncCheckpoint, options: Options = {}): Promise<ProjectSyncCheckpoint> {\n return this.mw.http.request(\"PUT\", `${prefix}/checkpoints/${encodeURIComponent(checkpoint.id)}`, { body: checkpoint, ...options });\n }\n objects(id: string, cursor = 0, options: Options = {}): Promise<{ objects: string[]; next?: number }> {\n return this.mw.http.request(\"GET\", `${prefix}/checkpoints/${encodeURIComponent(id)}/objects`, { query: { cursor }, ...options });\n }\n async missing(objects: string[], options: Options = {}): Promise<string[]> {\n const response = await this.mw.http.request<{ objects: string[] }>(\"POST\", `${prefix}/objects/missing`, { body: { objects }, ...options });\n return response.objects;\n }\n /** Base64 chunk, at most 256 KiB before encoding. */\n async getObject(id: string, options: Options = {}): Promise<string> {\n const response = await this.mw.http.request<{ data: string }>(\"GET\", `${prefix}/objects/${encodeURIComponent(id)}`, options);\n return response.data;\n }\n async putObject(id: string, data: string, options: Options = {}): Promise<void> {\n await this.mw.http.request(\"PUT\", `${prefix}/objects/${encodeURIComponent(id)}`, { body: { data }, ...options });\n }\n async wait(id: string, options: Options & { onUpdate?: (operation: ProjectSyncOperation) => void } = {}): Promise<ProjectSyncOperation> {\n for (;;) {\n const o = await this.get(id, { signal: options.signal });\n options.onUpdate?.(o);\n if (!active(o)) return o;\n await delay(500, options.signal);\n }\n }\n\n /** Repeating this relay skips acknowledged checkpoints and verified chunks.\n * Aborting detaches the relay; daemon export/apply operations remain durable.\n */\n async relayCheckpoint(target: ProjectSyncApi, id: string, options: Options & { onBytes?: (bytes: number) => void } = {}): Promise<void> {\n const visited = new Set<string>();\n const visit = async (checkpointId: string): Promise<void> => {\n options.signal?.throwIfAborted();\n if (visited.has(checkpointId)) return;\n visited.add(checkpointId);\n try { await target.checkpoint(checkpointId, options); return; }\n catch (error) { if (!(error instanceof ApiError) || error.status !== 404) throw error; }\n const checkpoint = await this.checkpoint(checkpointId, options);\n for (const parent of checkpoint.parents) await visit(parent);\n let cursor = 0;\n do {\n const page = await this.objects(checkpointId, cursor, options);\n const missing = await target.missing(page.objects, options);\n // Bounded chunk streaming: no archive/project-sized RAM buffer.\n for (const object of missing) {\n const data = await this.getObject(object, options);\n await target.putObject(object, data, options);\n const padding = data.endsWith(\"==\") ? 2 : data.endsWith(\"=\") ? 1 : 0;\n options.onBytes?.(Math.floor(data.length * 3 / 4) - padding);\n }\n cursor = page.next ?? 0;\n } while (cursor);\n await target.acceptCheckpoint(checkpoint, options);\n };\n await visit(id);\n }\n\n /** Safe X → Y and Y → X. Persist request.id until acknowledged. A conflict\n * throws ProjectSyncError carrying the complete conflict/recovery operation.\n */\n switchTo(target: ProjectSyncApi, request: { id: string; projectId: string; path?: string; includeIgnored?: string[]; selectionToken?: string },\n options: Options & { onProgress?: (progress: ProjectSyncProgress) => void } = {}): Promise<ProjectSyncOperation> {\n request = { ...request, includeIgnored: selectionPaths(request.includeIgnored) };\n const intent = JSON.stringify(request);\n const old = this.flights.get(request.id);\n if (old) {\n if (old.intent !== intent || old.target !== target) return Promise.reject(new MindwireError(\"This sync ID already belongs to a different request or destination.\"));\n return old.result;\n }\n const work = async (): Promise<ProjectSyncOperation> => {\n if (target === this || target.mw.http === this.mw.http) throw new MindwireError(\"Choose another workspace for this project.\");\n // Once the destination accepted the immutable checkpoint, reconnecting\n // only needs that destination. The original laptop may already be offline.\n let accepted: ProjectSyncOperation | undefined;\n try { accepted = await target.get(`${request.id}-import`, options); }\n catch (error) { if (!(error instanceof ApiError) || error.status !== 404) throw error; }\n if (accepted) {\n if ((accepted.path ?? \"\") !== (request.path ?? \"\")\n || (accepted.selectionToken ?? \"\") !== (request.selectionToken ?? \"\")\n || JSON.stringify(selectionPaths(accepted.includeIgnored)) !== JSON.stringify(request.includeIgnored))\n throw new MindwireError(\"This sync ID belongs to a different destination folder or file selection.\");\n const operation = await target.wait(accepted.id, { signal: options.signal,\n onUpdate: operation => options.onProgress?.({ phase: \"apply\", transferredBytes: 0, operation }) });\n if (operation.status !== \"succeeded\") throw new ProjectSyncError(operation);\n return operation;\n }\n const health = await Promise.all([this.mw.health(), target.mw.health()]);\n if (health.some(h => (h.projectSyncVersion ?? 0) < 2)) throw new MindwireError(\"Update Mindwire on both workspaces to review and switch selected project files.\");\n let bytes = 0;\n const emit = (phase: ProjectSyncProgress[\"phase\"], operation?: ProjectSyncOperation) => options.onProgress?.({ phase, transferredBytes: bytes, operation });\n emit(\"checkpoint\");\n let o = await this.export({ id: `${request.id}-export`, projectId: request.projectId, includeIgnored: request.includeIgnored, selectionToken: request.selectionToken }, options);\n o = await this.wait(o.id, { signal: options.signal, onUpdate: value => emit(\"checkpoint\", value) });\n if (o.status !== \"succeeded\" || !o.resultCheckpointId) throw new ProjectSyncError(o);\n emit(\"transfer\");\n await this.relayCheckpoint(target, o.resultCheckpointId, { signal: options.signal, onBytes: n => { bytes += n; emit(\"transfer\"); } });\n o = await target.import({ id: `${request.id}-import`, checkpointId: o.resultCheckpointId, path: request.path, includeIgnored: request.includeIgnored, selectionToken: request.selectionToken }, options);\n o = await target.wait(o.id, { signal: options.signal, onUpdate: value => emit(\"apply\", value) });\n if (o.status !== \"succeeded\") throw new ProjectSyncError(o);\n return o;\n };\n const result = work().finally(() => this.flights.delete(request.id));\n this.flights.set(request.id, { intent, target, result });\n return result;\n }\n}\n","import type { Mindwire } from \"./client.js\";\nimport type { WorkspaceSnapshot } from \"./workspace.js\";\n\n/** Metadata from the harness's native resume list, across original folders. */\nexport interface Conversation {\n id: string;\n /** Present after association with the ordinary Mindwire chat API. */\n chatId?: string;\n agentId?: string;\n agentType: string;\n agentName: string;\n projectId?: string;\n projectName?: string;\n cwd: string;\n title: string;\n createdAt: string;\n updatedAt: string;\n lastStatus?: string;\n lastRunId?: string;\n}\n\nexport interface ConversationQuery {\n /** A workspace agent profile, not the harness type. Omit for all agents. */\n agentId?: string;\n search?: string;\n cursor?: string;\n /** 1–100; defaults to 50. */\n limit?: number;\n refresh?: boolean;\n}\n\nexport interface ConversationPage {\n workspaceId: string;\n items: Conversation[];\n total: number;\n nextCursor?: string;\n issues?: { projectId: string; agent: string; message: string }[];\n}\n\nexport interface ConversationOpenRequest { id: string; agentId?: string }\nexport interface ConversationOpenResult { chatId: string; snapshot: WorkspaceSnapshot }\n\n/** Requires conversationBrowserVersion >= 1. No transcript copies or background polling. */\nexport class ConversationsApi {\n constructor(private readonly mw: Mindwire) {}\n\n /** Read-only; includes folders not registered as Mindwire projects. */\n list(query: ConversationQuery = {}): Promise<ConversationPage> {\n return this.mw.http.request(\"GET\", \"/workspace/conversations\", { query: { ...query } });\n }\n\n /** Idempotently associates the selected native session with its original folder.\n * Use chatId with messages()/turn() and the ordinary chat APIs afterward. */\n open(request: ConversationOpenRequest): Promise<ConversationOpenResult> {\n return this.mw.http.request(\"POST\", \"/workspace/conversations/open\", { body: request });\n }\n}\n","import type { Mindwire } from \"./client.js\";\nimport type { Bot } from \"./bots.js\";\nimport type { AppShortcut } from \"./apps.js\";\nimport { readSSE } from \"./sse.js\";\nimport { ProjectSyncApi } from \"./project-sync.js\";\nimport { ConversationsApi } from \"./conversations.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\" | \"rename_branch\" | \"delete_branch\";\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: switch/create require v2; local rename/delete require v5 and expectedTip. */\n branch?: string;\n /** switch_branch only: branch is a remote tracking name, e.g. origin/feature. */\n remote?: boolean;\n /** rename_branch only: a new local name. Never overwrites another branch. Requires v5. */\n newName?: string;\n /** rename_branch/delete_branch: full selected branch tip, guarding stale confirmation. Requires v5. */\n expectedTip?: string;\n /** delete_branch only: explicit confirmation to delete unmerged commits. Checked-out branches stay protected. */\n force?: 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 and commit hooks (gitOperationsVersion >= 6).\n * Never part of an operation snapshot; ordinary commits require no GitHub login. */\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_auth_required asks for GitHub access; refresh status before an explicit retry.\n * git_identity_required asks for a name/email before a new commit intent. */\n errorCode?: \"git_auth_required\" | \"git_identity_required\" | \"git_restore_dirty\" | \"git_restore_changed\"\n | \"git_branch_changed\" | \"git_branch_in_use\" | \"git_branch_unmerged\"\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\n /** Daemon-observed executable presence. Omitted until checked; never client-owned. */\n installation?: \"installed\" | \"missing\" | \"repair\";\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\n /** Logical project identity shared by preserved workspace copies. */\n syncId?: string;\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 /** Project-relative SVG/PNG/JPEG/GIF file. Omit to preserve, null to reset. Requires projectIconsVersion >= 1. */\n iconPath?: string | null;\n}\n\nexport interface ProjectIcon {\n path: string;\n mediaType: string;\n /** Base64-encoded bytes, capped at 1 MiB; served only through the authenticated workspace connection. */\n content: string;\n etag: string;\n}\n\n/** Chat membership; transcript content continues to come from /chats/:id/messages. */\nexport interface WorkspaceChat extends WorkspaceRecord {\n handoffFrom?: import(\"./handoffs.js\").HandoffOrigin;\n botId?: string;\n /** Logical conversation identity; the local id remains unique per workspace. */\n syncId?: string;\n agentId: string;\n projectId: string;\n title: string;\n /** Cached native title beneath an optional user rename. Owned by the daemon. */\n nativeTitle?: string;\n titleIsUserSet?: boolean;\n sessionId?: string;\n /** Native harness activity, retained across app restarts. Not the last app-open time. */\n updatedAt?: 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\" | \"installation\"> & {\n createdAt?: string;\n};\n\n/** Additive migration. Existing records and deletion tombstones always win over these values. */\nexport interface WorkspaceImport {\n bots?: Bot[];\n agents?: (WorkspaceInput<WorkspaceAgent> & { id: string })[];\n projects?: (WorkspaceInput<WorkspaceProject> & { id: string })[];\n chats?: (WorkspaceInput<WorkspaceChat> & { id: string })[];\n}\n\nexport interface ProjectFolder { id: string; name: string }\n\n/** Daemon-owned grouping and manual order; all IDs refer to this workspace. */\nexport interface ProjectLibrary {\n version: number;\n revision: number;\n folders: ProjectFolder[];\n membership: Record<string, string>;\n order: string[];\n}\n\n/** Partial atomic edit. On 409, read the current library before deciding how to rebase. */\nexport interface ProjectLibraryEdit {\n expectedRevision: number;\n folders?: ProjectFolder[];\n deleteFolders?: string[];\n placements?: { projectId: string; folderId: string | null }[];\n order?: string[];\n folderOrder?: string[];\n /** Migration only: existing daemon organization always wins. */\n importIfEmpty?: boolean;\n}\n\nexport interface WorkspaceSnapshot {\n apps?: AppShortcut[];\n bots?: Bot[];\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 /** Cached chats are retained when a harness's native list could not be refreshed. */\n sessionDiscoveryIssues?: { projectId: string; agent: string; message: string }[];\n /** Failed installation checks preserve the last known inventory. */\n agentDiscoveryIssues?: { agent: string; message: string }[];\n /** Present on full snapshots, or when organization changed in a delta. */\n projectLibrary?: ProjectLibrary;\n}\n\nexport interface EnsureAgentRequest { agentType: string; name?: string }\nexport interface EnsureAgentResult { agentId: string; snapshot: WorkspaceSnapshot }\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 conversations: ConversationsApi;\n readonly sync: ProjectSyncApi;\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.conversations = new ConversationsApi(mw);\n this.sync = new ProjectSyncApi(mw);\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(options: { refresh?: boolean } = {}): Promise<WorkspaceSnapshot> {\n return this.mw.http.request(\"GET\", \"/workspace\", { query: options });\n }\n\n /** Reuse the workspace's existing harness profile or create one for setup. Atomic across clients. */\n ensureAgent(request: EnsureAgentRequest): Promise<EnsureAgentResult> {\n return this.mw.http.request(\"POST\", \"/workspace/agents/ensure\", { body: request });\n }\n\n library(): Promise<ProjectLibrary> {\n return this.mw.http.request(\"GET\", \"/workspace/project-library\");\n }\n\n editLibrary(edit: ProjectLibraryEdit): Promise<ProjectLibrary> {\n return this.mw.http.request(\"PATCH\", \"/workspace/project-library\", { body: edit });\n }\n\n /** Read the saved icon, or preview a candidate relative path within the project. Requires projectIconsVersion >= 1. */\n projectIcon(projectId: string, path?: string): Promise<ProjectIcon> {\n return this.mw.http.request(\"GET\", `/workspace/projects/${encodeURIComponent(projectId)}/icon`, { query: { path } });\n }\n\n /** Upload a validated image (base64 content, at most 1 MB). Requires projectIconsVersion >= 2.\n * Stores the image inside the project; set projects.put(..., { iconPath: result.path }) to select it.\n */\n uploadProjectIcon(projectId: string, image: { name: string; content: string }): Promise<ProjectIcon> {\n return this.mw.http.request(\"POST\", `/workspace/projects/${encodeURIComponent(projectId)}/icon`, { body: image });\n }\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, options: { refresh?: boolean } = {}): Promise<WorkspaceSnapshot> {\n return this.mw.http.request(\"GET\", \"/workspace/changes\", { query: { since, workspaceId, ...options } });\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 switch/create, >= 4 for restore_commit, >= 5 for rename/delete, >= 6 for commit auth). 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: 5 } });\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 type { WorkspaceRecord, WorkspaceSnapshot, WorkspaceChat, WorkspaceAgent, WorkspaceProject } from \"./workspace.js\";\nimport type { Run } from \"./types.js\";\n\nexport interface BotKnowledge { id: string; title: string; content: string }\nexport interface Bot extends WorkspaceRecord {\n agentId: string;\n /** Default folder for new chats. The bot belongs to workspaceId and can work in its other projects. */\n projectId: string;\n name: string;\n /** Saved palette-character ID; omitted/empty keeps the automatic avatar. */\n icon?: string;\n purpose: string;\n instructions: string;\n memory: string;\n knowledge: BotKnowledge[];\n /** Portable SKILL.md documents, loaded on demand. Requires botsVersion >= 6. */\n skills?: string[] | null;\n /** Creation-only plain harness: no Mindwire bot context, tools or skills. Requires botsVersion >= 7. */\n raw?: boolean;\n isMaster: boolean;\n archived: boolean;\n /** Applies to this bot's current and future chats, independent of its base engine. */\n notificationsMuted?: boolean;\n}\nexport interface BotInput {\n icon?: string;\n id?: string;\n agentId: string;\n projectId?: string;\n name: string;\n purpose?: string;\n instructions?: string;\n memory?: string;\n knowledge?: BotKnowledge[];\n skills?: string[];\n /** Keep native harness behavior. Cannot be changed after creation or combined with bot context. */\n raw?: boolean;\n}\nexport interface BotEdit {\n /** Base agent for future chats; existing chats retain their original engine. Requires botsVersion >= 5. */\n agentId?: string;\n icon?: string;\n expectedRevision: number;\n name?: string;\n purpose?: string;\n instructions?: string;\n memory?: string;\n knowledge?: BotKnowledge[];\n archived?: boolean;\n /** Replaces assigned SKILL.md documents; omit to preserve existing skills. */\n skills?: string[];\n notificationsMuted?: boolean;\n}\nexport interface BotMutation { bot: Bot; snapshot: WorkspaceSnapshot }\n\nexport interface BotTaskInput { requestId: string; message: string }\nexport interface BotTaskRequest extends BotTaskInput { chatId?: string; title?: string; projectId?: string }\nexport interface BotTask {\n botId: string;\n chatId: string;\n run: Run;\n messages?: { role: string; text: string; createdAt: string }[];\n output?: string;\n historyError?: string;\n interactions?: { id: string; kind: string; title?: string; detail?: string; needsResponse: boolean }[];\n tools?: { name: string; status?: string }[];\n cancelRequested?: boolean;\n}\nexport type BotPeerRoute = { kind: \"ssh\"; host: string; port: number } | { kind: \"websocket\"; url: string };\nexport interface BotPeerIdentity {\n workspaceId: string;\n publicKey: string;\n hostKeyFingerprint: string;\n port?: number;\n sshPort?: number;\n routes?: BotPeerRoute[];\n}\nexport interface BotPeerInput {\n name: string;\n publicKey: string;\n hostKeyFingerprint: string;\n routes: BotPeerRoute[];\n enabled?: boolean;\n}\nexport interface BotPeer extends BotPeerInput { workspaceId: string }\nexport interface BotPeerCheck { workspaceId: string; reachable: boolean; error?: string; addressRecovery?: boolean }\n\n/** Saved bot identities, native tasks, and explicitly paired bot-control peers. */\nexport class BotsApi {\n constructor(private readonly mw: Mindwire) {}\n list(options: { projectId?: string; archived?: boolean } = {}): Promise<Bot[]> {\n return this.mw.http.request(\"GET\", \"/bots\", { query: { projectId: options.projectId, archived: options.archived ? \"true\" : undefined } });\n }\n get(id: string): Promise<Bot> { return this.mw.http.request(\"GET\", `/bots/${encodeURIComponent(id)}`); }\n ensure(agentId: string, projectId: string): Promise<BotMutation> {\n return this.mw.http.request(\"POST\", \"/bots/ensure\", { body: { agentId, projectId } });\n }\n create(input: BotInput): Promise<BotMutation> { return this.mw.http.request(\"POST\", \"/bots\", { body: input }); }\n update(id: string, edit: BotEdit): Promise<BotMutation> {\n return this.mw.http.request(\"PATCH\", `/bots/${encodeURIComponent(id)}`, { body: edit });\n }\n chats(id: string): Promise<WorkspaceChat[]> { return this.mw.http.request(\"GET\", `/bots/${encodeURIComponent(id)}/chats`); }\n createChat(id: string, input: { chatId?: string; title?: string; projectId?: string } = {}): Promise<{ chatId: string; snapshot: WorkspaceSnapshot }> {\n return this.mw.http.request(\"POST\", `/bots/${encodeURIComponent(id)}/chats`, { body: input });\n }\n agents(): Promise<{ agents: WorkspaceAgent[]; projects: WorkspaceProject[] }> {\n return this.mw.http.request(\"GET\", \"/bots/agents\");\n }\n tasks(id: string): Promise<BotTask[]> {\n return this.mw.http.request(\"GET\", `/bots/${encodeURIComponent(id)}/tasks`);\n }\n /** Keep requestId stable when retrying a task after a lost acknowledgement. */\n delegate(id: string, input: BotTaskRequest): Promise<BotTask> {\n return this.mw.http.request(\"POST\", `/bots/${encodeURIComponent(id)}/tasks`, { body: input });\n }\n task(id: string, runId: string): Promise<BotTask> {\n return this.mw.http.request(\"GET\", this.taskPath(id, runId));\n }\n input(id: string, runId: string, input: BotTaskInput): Promise<BotTask> {\n return this.mw.http.request(\"POST\", `${this.taskPath(id, runId)}/input`, { body: input });\n }\n cancel(id: string, runId: string): Promise<BotTask> {\n return this.mw.http.request(\"POST\", `${this.taskPath(id, runId)}/cancel`);\n }\n peerIdentity(): Promise<BotPeerIdentity> {\n return this.mw.http.request(\"GET\", \"/bots/peers/identity\");\n }\n startPeerListener(port?: number): Promise<BotPeerIdentity> {\n return this.mw.http.request(\"POST\", \"/bots/peers/listener\", { body: { port } });\n }\n peers(): Promise<BotPeer[]> { return this.mw.http.request(\"GET\", \"/bots/peers\"); }\n pair(workspaceId: string, input: BotPeerInput): Promise<BotPeer> {\n return this.mw.http.request(\"PUT\", `/bots/peers/${encodeURIComponent(workspaceId)}`, { body: input });\n }\n revokePeer(workspaceId: string): Promise<{ ok: boolean }> {\n return this.mw.http.request(\"DELETE\", `/bots/peers/${encodeURIComponent(workspaceId)}`);\n }\n /** Bounded peer handshake/discovery; does not start a bot task. */\n checkPeer(workspaceId: string): Promise<BotPeerCheck> {\n return this.mw.http.request(\"POST\", `/bots/peers/${encodeURIComponent(workspaceId)}/check`, { body: {} });\n }\n private taskPath(id: string, runId: string): string {\n return `/bots/${encodeURIComponent(id)}/tasks/${encodeURIComponent(runId)}`;\n }\n}\n","import type { Mindwire } from \"./client.js\";\nimport type { WorkspaceSnapshot } from \"./workspace.js\";\n\n/** An application resource saved on its owning host. */\nexport interface AppShortcut {\n id: string;\n workspaceId: string;\n projectId: string;\n botId?: string;\n name: string;\n icon?: string;\n url: string;\n startupCommand?: string;\n healthPath?: string;\n archived: boolean;\n createdAt: string;\n revision: number;\n channelIds?: string[];\n notificationsMuted: boolean;\n automation?: boolean;\n staticDirectory?: string;\n publicUrl?: string;\n}\n\nexport type AppShortcutCreate = Pick<AppShortcut, \"projectId\" | \"name\" | \"url\"> &\n Partial<Pick<AppShortcut, \"id\" | \"botId\" | \"icon\" | \"startupCommand\" | \"healthPath\" | \"automation\" | \"channelIds\" | \"notificationsMuted\" | \"staticDirectory\" | \"publicUrl\">>;\nexport type AppShortcutEdit = { expectedRevision: number } &\n Partial<Pick<AppShortcut, \"name\" | \"icon\" | \"url\" | \"startupCommand\" | \"healthPath\" | \"archived\" | \"channelIds\" | \"notificationsMuted\" | \"staticDirectory\" | \"publicUrl\">>;\nexport interface AppShortcutMutation { app: AppShortcut; snapshot: WorkspaceSnapshot }\nexport interface AppPublication { app: AppShortcut; kind: \"port\" | \"static\"; port?: number; directory?: string }\nexport interface AppNotificationChannel { id: string; name: string; type: string }\nexport interface AppScheduleSpec {\n id?: string;\n expectedRevision?: number;\n name: string;\n runAt?: string;\n intervalSeconds?: number;\n localTime?: string;\n timeZone?: string;\n weekdays?: number[];\n command?: string;\n title?: string;\n body?: string;\n enabled?: boolean;\n}\nexport interface AppSchedule extends Omit<AppScheduleSpec, \"id\"> {\n id: string;\n appId: string;\n revision: number;\n active: boolean;\n state: string;\n nextRunAt?: string;\n retryAt?: string;\n lastRunAt?: string;\n lastError?: string;\n attempts: number;\n}\n\nexport class AppsApi {\n constructor(private readonly mw: Mindwire) {}\n list(): Promise<AppShortcut[]> { return this.mw.http.request(\"GET\", \"/apps\"); }\n get(id: string): Promise<AppShortcut> { return this.mw.http.request(\"GET\", `/apps/${encodeURIComponent(id)}`); }\n register(input: AppShortcutCreate): Promise<AppShortcutMutation> {\n return this.mw.http.request(\"POST\", \"/apps\", { body: input });\n }\n update(id: string, input: AppShortcutEdit): Promise<AppShortcutMutation> {\n return this.mw.http.request(\"PATCH\", `/apps/${encodeURIComponent(id)}`, { body: input });\n }\n /** Ensures readiness on the owning computer; the client opens the returned URL. */\n open(id: string): Promise<AppShortcut> {\n return this.mw.http.request(\"POST\", `/apps/${encodeURIComponent(id)}/open`, { body: {} });\n }\n /** Validates a plan for the owner's hosting adapter; does not deploy or charge. */\n preparePublication(id: string): Promise<AppPublication> {\n return this.mw.http.request(\"POST\", `/apps/${encodeURIComponent(id)}/publication/prepare`, { body: {} });\n }\n channels(): Promise<AppNotificationChannel[]> { return this.mw.http.request(\"GET\", \"/apps/channels\"); }\n notifications(id: string, options: { channelIds?: string[]; rotate?: boolean } = {}): Promise<AppShortcutMutation & { credentialFile: string }> {\n return this.mw.http.request(\"POST\", `/apps/${encodeURIComponent(id)}/notifications`, { body: options });\n }\n revokeNotificationAccess(id: string): Promise<{ revoked: boolean }> {\n return this.mw.http.request(\"DELETE\", `/apps/${encodeURIComponent(id)}/notifications/token`);\n }\n schedules(id: string): Promise<AppSchedule[]> {\n return this.mw.http.request(\"GET\", `/apps/${encodeURIComponent(id)}/schedules`);\n }\n saveSchedule(id: string, schedule: AppScheduleSpec): Promise<AppSchedule> {\n return this.mw.http.request(\"POST\", `/apps/${encodeURIComponent(id)}/schedules`, { body: schedule });\n }\n deleteSchedule(id: string, scheduleId: string): Promise<{ removed: boolean }> {\n return this.mw.http.request(\"DELETE\", `/apps/${encodeURIComponent(id)}/schedules/${encodeURIComponent(scheduleId)}`);\n }\n}\n","import type { Mindwire } from \"./client.js\";\nimport type { Condition } from \"./types.js\";\n\nexport type IntegrationProvider = \"slack\" | \"teams\" | \"discord\" | \"telegram\";\nexport type IntegrationMode = \"notifications\" | \"commands\" | \"chat\" | \"trigger\";\n\n/** Write-only credentials, stored on the daemon. Omitted fields preserve saved values. */\nexport interface IntegrationCredentials {\n botToken?: string;\n signingSecret?: string;\n webhookSecret?: string;\n publicKey?: string;\n clientSecret?: string;\n}\n\nexport interface IntegrationSpec {\n name: string;\n provider: IntegrationProvider;\n botId: string;\n mode: IntegrationMode;\n enabled: boolean;\n /** Explicit allowlist. Empty lists are rejected. */\n channelIds: string[];\n userIds?: string[];\n /** Slack team, Discord guild, or Microsoft Entra tenant ID. */\n workspaceId?: string;\n applicationId?: string;\n command?: string;\n /** Forward this bot's lifecycle notifications to destination. */\n notify: boolean;\n conditions?: Condition[];\n destination?: string;\n /** Owner-configured Microsoft Teams connector URL. */\n serviceUrl?: string;\n expectedRevision?: number;\n credentials?: IntegrationCredentials;\n}\n\nexport interface Integration extends Omit<IntegrationSpec, \"credentials\" | \"expectedRevision\"> {\n id: string;\n revision: number;\n hasCredentials: boolean;\n webhookPath: string;\n}\n\nexport interface IntegrationReceipt {\n id: string;\n integrationId: string;\n channelId: string;\n userId: string;\n state: \"queued\" | \"running\" | \"delivered\" | \"failed\";\n chatId?: string;\n runId?: string;\n error?: string;\n createdAt: string;\n}\n\n/** Persistent messaging connections shared with the app and daemon. */\nexport class IntegrationsApi {\n constructor(private readonly mw: Mindwire) {}\n list(): Promise<Integration[]> { return this.mw.http.request(\"GET\", \"/integrations\"); }\n get(id: string): Promise<Integration> { return this.mw.http.request(\"GET\", this.path(id)); }\n create(spec: IntegrationSpec): Promise<Integration> {\n return this.mw.http.request(\"POST\", \"/integrations\", { body: spec });\n }\n /** Complete replacement with optimistic concurrency; omit credentials to preserve them. */\n update(id: string, spec: IntegrationSpec & { expectedRevision: number }): Promise<Integration> {\n return this.mw.http.request(\"PUT\", this.path(id), { body: spec });\n }\n async delete(id: string): Promise<void> { await this.mw.http.request(\"DELETE\", this.path(id)); }\n /** Sends to the configured destination, also useful as a connection test. */\n send(id: string, text: string): Promise<{ sent: boolean }> {\n return this.mw.http.request(\"POST\", `${this.path(id)}/send`, { body: { text } });\n }\n /** Latest 100 redacted delivery receipts. */\n events(id: string): Promise<IntegrationReceipt[]> {\n return this.mw.http.request(\"GET\", `${this.path(id)}/events`);\n }\n retry(id: string, eventId: string): Promise<IntegrationReceipt> {\n return this.mw.http.request(\"POST\", `${this.path(id)}/events/${encodeURIComponent(eventId)}/retry`);\n }\n private path(id: string): string { return `/integrations/${encodeURIComponent(id)}`; }\n}\n","import type { Mindwire } from \"./client.js\";\nimport { readSSE } from \"./sse.js\";\n\nexport interface SurfaceGeometry { width: number; height: number; revision: number }\n/** Actual remote cursor. The base64 PNG changes only with its shape, not its position. */\nexport interface SurfaceCursor {\n id: string; width: number; height: number; hotspotX: number; hotspotY: number; png: string;\n}\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\" | \"macos\";\n desktopId?: string;\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; cursor?: SurfaceCursor; controller?: SurfaceController;\n authorizationExpiresAt?: string; error?: SurfaceProblem;\n setup?: { reason: string; command: string };\n}\nexport interface LocalDesktopInfo { supported: boolean; enabled: boolean; screenSharing: boolean; username: string }\n/** Write-only Mac configuration. The CLI prompts locally; never include this in a QR or workspace metadata. */\nexport interface LocalDesktopSettings { enabled: boolean; username?: string; password?: string }\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; desktopId?: string;\n connection: {\n expires_at: string; session_id?: 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 desktopId?: 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\"; desktopId?: string }\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\" | \"cancelled\"; 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 desktopId?: string;\n capture?: { id: string; artifactId: string; width: number; height: number };\n}\n\n/** Private workspace runtime authorization, never an account/session credential. */\nexport interface DesktopRuntimeBinding {\n registryId: string; workspaceId: string; gatewayToken: string; expiresAt?: string;\n}\nexport interface DesktopResolution { width: number; height: number }\nexport interface SavedDesktop {\n id: string; name: string; state: string; managed: boolean; available: boolean;\n resolution?: DesktopResolution; mode?: string; can_resize?: boolean; can_delete?: boolean;\n deletion_pending?: boolean; created_at?: string; updated_at?: string; error?: string;\n}\nexport interface DesktopCatalog {\n success: boolean; projectId?: string; sessions: SavedDesktop[];\n capabilities: {\n mode: \"virtual\" | \"console\"; max_sessions: number; can_create: boolean;\n resolution?: { min: DesktopResolution; max: DesktopResolution; default: DesktopResolution };\n };\n}\nexport interface SavedDesktopResult { success: boolean; session: SavedDesktop }\nexport interface CreateSavedDesktop {\n /** Reuse the same ID and body after an interrupted response. */\n requestId: string; projectId?: string; name: string; resolution?: DesktopResolution;\n}\nexport interface UpdateSavedDesktop { name?: string; resolution?: DesktopResolution }\n\nfunction savedDesktopID(id: string): string {\n if (!/^(console|ds_[a-f0-9]{16})$/.test(id)) throw new Error(\"Invalid saved desktop ID.\");\n return id;\n}\n\n/** One controller per saved desktop, shared by every harness and app client. */\nexport class SurfacesApi {\n constructor(private readonly mw: Mindwire, private readonly desktopId?: string) {}\n /** Select a saved display for status, events, captures and input receipts. */\n desktop(id: string): SurfacesApi { return new SurfacesApi(this.mw, savedDesktopID(id)); }\n private scoped(path: string): string {\n return this.desktopId ? `${path}?desktopId=${encodeURIComponent(this.desktopId)}` : path;\n }\n bindRuntime(binding: DesktopRuntimeBinding): Promise<{ configured: boolean }> {\n return this.mw.http.request(\"PUT\", \"/surfaces/desktop/runtime\", { body: binding });\n }\n listDesktops(projectId?: string): Promise<DesktopCatalog> {\n return this.mw.http.request(\"GET\", \"/surfaces/desktop/catalog\", { query: { projectId } });\n }\n createDesktop(request: CreateSavedDesktop): Promise<SavedDesktopResult> {\n return this.mw.http.request(\"POST\", \"/surfaces/desktop/catalog\", { body: request });\n }\n ensureProjectDesktop(projectId: string): Promise<SavedDesktopResult> {\n return this.mw.http.request(\"POST\", `/surfaces/desktop/projects/${encodeURIComponent(projectId)}/ensure`);\n }\n getDesktop(id: string): Promise<SavedDesktopResult> {\n return this.mw.http.request(\"GET\", `/surfaces/desktop/catalog/${savedDesktopID(id)}`);\n }\n updateDesktop(id: string, request: UpdateSavedDesktop): Promise<SavedDesktopResult> {\n return this.mw.http.request(\"PATCH\", `/surfaces/desktop/catalog/${savedDesktopID(id)}`, { body: request });\n }\n startDesktop(id: string): Promise<SavedDesktopResult> {\n return this.mw.http.request(\"POST\", `/surfaces/desktop/catalog/${savedDesktopID(id)}/start`);\n }\n /** Stops this desktop's apps; keeps its profile and files. */\n stopDesktop(id: string): Promise<SavedDesktopResult> {\n return this.mw.http.request(\"POST\", `/surfaces/desktop/catalog/${savedDesktopID(id)}/stop`);\n }\n /** Deletes the desktop's private profile. Closing a viewer uses close(), never this method. */\n deleteDesktop(id: string): Promise<{ success: boolean; session?: SavedDesktop }> {\n return this.mw.http.request(\"DELETE\", `/surfaces/desktop/catalog/${savedDesktopID(id)}`);\n }\n list(): Promise<SurfaceSnapshot[]> { return this.mw.http.request(\"GET\", \"/surfaces\"); }\n status(refresh = false): Promise<SurfaceSnapshot> {\n return this.mw.http.request(\"GET\", this.scoped(\"/surfaces/desktop\"), { query: { refresh } });\n }\n bind(binding: SurfaceBinding): Promise<SurfaceSnapshot> {\n if (this.desktopId && binding.desktopId !== this.desktopId) throw new Error(\"The desktop grant belongs to another saved desktop.\");\n return this.mw.http.request(\"PUT\", \"/surfaces/desktop/binding\", { body: binding });\n }\n localStatus(): Promise<LocalDesktopInfo> { return this.mw.http.request(\"GET\", \"/surfaces/desktop/local\"); }\n /** Local CLI only. The separate 0600 control credential is not part of phone pairing. */\n configureLocal(settings: LocalDesktopSettings, localControlToken: string): Promise<SurfaceSnapshot> {\n if (!localControlToken) throw new Error(\"Run mindwire desktop on your Mac to manage desktop access.\");\n return this.mw.http.request(\"PUT\", \"/surfaces/desktop/local\", {\n body: settings, headers: { \"X-Mindwire-Local-Control\": localControlToken },\n });\n }\n open(request: SurfaceOpenRequest): Promise<SurfaceSession> {\n if (this.desktopId && request.desktopId && request.desktopId !== this.desktopId) throw new Error(\"Select the matching saved desktop.\");\n return this.mw.http.request(\"POST\", this.scoped(\"/surfaces/desktop/sessions\"), { body: request });\n }\n control(id: string, request: SurfaceControlRequest): Promise<SurfaceSession> {\n return this.mw.http.request(\"POST\", this.scoped(`/surfaces/desktop/sessions/${encodeURIComponent(id)}/control`), { body: request });\n }\n close(id: string): Promise<{ closed: boolean }> {\n return this.mw.http.request(\"DELETE\", this.scoped(`/surfaces/desktop/sessions/${encodeURIComponent(id)}`));\n }\n capture(id: string): Promise<SurfaceCapture> {\n return this.mw.http.request(\"POST\", this.scoped(`/surfaces/desktop/sessions/${encodeURIComponent(id)}/captures`));\n }\n action(request: SurfaceActionRequest): Promise<SurfaceReceipt> {\n return this.mw.http.request(\"POST\", this.scoped(\"/surfaces/desktop/actions\"), { body: request });\n }\n receipt(id: string): Promise<SurfaceReceipt> {\n return this.mw.http.request(\"GET\", this.scoped(`/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\", this.scoped(\"/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 * With serviceUpdateVersion >= 2, force authorizes interrupting active work.\n * It never overrides another installer's lease.\n * Admission stays closed until release, process exit, or the one-minute expiry. */\n acquireUpdate(options?: { force?: boolean }): Promise<ServiceUpdateLease> {\n return this.client.http.request(\"POST\", \"/service/update\", options ? { body: options } : undefined);\n }\n\n releaseUpdate(id: string): Promise<{ ok: boolean }> {\n return this.client.http.request(\"DELETE\", `/service/update/${encodeURIComponent(id)}`);\n }\n}\n","import type { Mindwire } from \"./client.js\";\nimport { readSSE } from \"./sse.js\";\n\n/** Native workspace execution; the same contract on macOS, Linux and Windows. */\nexport interface WorkspaceHost {\n hostname: string; os: \"darwin\" | \"linux\" | \"windows\" | string; arch: string;\n home: string; directory: string; pid: number;\n}\nexport interface HostResources { cpus: number; memoryMb: number; diskMb: number }\nexport interface WorkspaceFile {\n name: string; path: string; type: \"file\" | \"dir\"; size: number; modifiedAt: string; isIgnored: boolean;\n}\nexport interface WorkspaceFileContent { path: string; content: string; size: number }\nexport interface WorkspaceExecRequest { argv: string[]; directory?: string; input?: string; timeoutMs?: number }\nexport interface WorkspaceExecResult { stdout: string; stderr: string; exitCode: number; truncated?: boolean }\nexport type WorkspaceExecEvent =\n | { kind: \"output\"; channel: \"stdout\" | \"stderr\"; data: string }\n | { kind: \"exit\"; exitCode: number }\n | { kind: \"error\"; error: string };\nexport interface TerminalRequest { id: string; directory?: string; columns: number; rows: number }\nexport interface TerminalState extends TerminalRequest { title: string; running: boolean; exitCode?: number; createdAt: string }\nexport interface TerminalEvent { sequence: number; kind: \"output\" | \"reset\" | \"exit\"; data?: string; state?: TerminalState }\n/** Retry the exact same writer/sequence/data after a lost acknowledgement, never a new sequence. */\nexport interface TerminalInput { writer: string; sequence: number; data: string }\n\nexport class ExecutionApi {\n readonly terminals: TerminalsApi;\n constructor(private readonly client: Mindwire) { this.terminals = new TerminalsApi(client); }\n host(): Promise<WorkspaceHost> { return this.client.http.request(\"GET\", \"/workspace/host\"); }\n resources(): Promise<HostResources> { return this.client.http.request(\"GET\", \"/workspace/resources\"); }\n files(path = \"\", query?: string): Promise<WorkspaceFile[]> {\n return this.client.http.request(\"GET\", \"/workspace/files\", { query: { path, query } });\n }\n read(path: string): Promise<WorkspaceFileContent> { return this.client.http.request(\"GET\", \"/workspace/file\", { query: { path } }); }\n write(path: string, content: string): Promise<{ ok: boolean }> {\n return this.client.http.request(\"PUT\", \"/workspace/file\", { body: { path, content } });\n }\n remove(path: string): Promise<{ ok: boolean }> { return this.client.http.request(\"DELETE\", \"/workspace/file\", { query: { path } }); }\n exec(command: WorkspaceExecRequest, signal?: AbortSignal): Promise<WorkspaceExecResult> {\n return this.client.http.request(\"POST\", \"/workspace/exec\", { body: command, signal });\n }\n /** Output data is base64, preserving partial UTF-8 chunks. Cancelling stops this command. */\n async *stream(command: WorkspaceExecRequest, signal?: AbortSignal): AsyncGenerator<WorkspaceExecEvent> {\n const response = await this.client.http.open(\"POST\", \"/workspace/exec/stream\", { body: command, signal });\n yield* readSSE<WorkspaceExecEvent>(response.body!, signal);\n }\n}\nexport class TerminalsApi {\n constructor(private readonly client: Mindwire) {}\n list(directory?: string): Promise<TerminalState[]> { return this.client.http.request(\"GET\", \"/workspace/terminals\", { query: { directory } }); }\n open(request: TerminalRequest): Promise<TerminalState> { return this.client.http.request(\"POST\", \"/workspace/terminals\", { body: request }); }\n get(id: string): Promise<TerminalState> { return this.client.http.request(\"GET\", this.path(id)); }\n close(id: string): Promise<{ ok: boolean }> { return this.client.http.request(\"DELETE\", this.path(id)); }\n input(id: string, input: TerminalInput): Promise<{ ok: boolean; sequence: number }> {\n return this.client.http.request(\"POST\", `${this.path(id)}/input`, { body: input });\n }\n resize(id: string, columns: number, rows: number): Promise<TerminalState> {\n return this.client.http.request(\"PUT\", `${this.path(id)}/size`, { body: { columns, rows } });\n }\n /** Detaching only closes the subscription. Resume from the last sequence; reset replaces the screen. */\n async *events(id: string, after = 0, signal?: AbortSignal): AsyncGenerator<TerminalEvent> {\n const response = await this.client.http.open(\"GET\", `${this.path(id)}/events`, { query: { after }, signal });\n yield* readSSE<TerminalEvent>(response.body!, signal);\n }\n private path(id: string): string { return `/workspace/terminals/${encodeURIComponent(id)}`; }\n}\n","import type { AgentScoped, Mindwire } from \"./client.js\";\nimport type { Http } from \"./http.js\";\nimport { Run } from \"./run.js\";\nimport { readSSE } from \"./sse.js\";\nimport type { ProjectAuth } from \"./workspace.js\";\nimport type { Run as RunData, VoiceAudio, VoiceEvent, VoiceStatus } from \"./types.js\";\n\n/** Harness-native voice; independent from a coding model's audio-file modalities. */\nexport class VoiceApi {\n constructor(private readonly client: Mindwire) {}\n\n status(scoped?: AgentScoped): Promise<VoiceStatus> {\n return this.client.http.request(\"GET\", \"/voice\", {\n query: { agent: scoped?.agent ?? this.client.defaultAgent },\n });\n }\n\n /** Start in an idle chat. Keep requestId/clientId when retrying a lost receipt. */\n async start(input: AgentScoped & {\n chatId: string; cwd?: string; voice?: string; requestId?: string; clientId?: string; gitAuth?: ProjectAuth;\n }): Promise<VoiceSession> {\n const clientId = input.clientId ?? crypto.randomUUID();\n const data = await this.client.http.request<RunData>(\"POST\", \"/turns\", {\n query: { agent: input.agent ?? this.client.defaultAgent },\n body: { chatId: input.chatId, message: \"\", cwd: input.cwd, gitAuth: input.gitAuth,\n requestId: input.requestId ?? crypto.randomUUID(), options: { voice: { clientId, voice: input.voice } } },\n });\n return new VoiceSession(this.client.http, new Run(this.client.http, data), clientId);\n }\n}\n\n/** Ephemeral PCM stream. Ending voice leaves any started coding task running. */\nexport class VoiceSession {\n private sequence = 0;\n private sending = false;\n private ended = false;\n private streaming = false;\n constructor(private readonly http: Http, readonly run: Run, readonly clientId: string) {}\n\n private get path(): string { return `/runs/${encodeURIComponent(this.run.id)}/voice`; }\n\n /** Await each ordered batch. No automatic audio replay after a network failure. */\n async appendAudio(audio: VoiceAudio, signal?: AbortSignal): Promise<void> {\n if (this.ended || this.sending) throw new Error(\"Voice ended or the previous audio batch is still being delivered.\");\n this.sending = true;\n try {\n await this.http.request(\"POST\", this.path, { signal, body: {\n clientId: this.clientId, action: \"audio\", sequence: ++this.sequence, audio,\n } });\n } catch (error) {\n await this.stop().catch(() => {});\n throw error;\n } finally { this.sending = false; }\n }\n\n /** Subscribe before sending audio; wait for ready. Breaking the loop ends voice. */\n async *stream(signal?: AbortSignal): AsyncGenerator<VoiceEvent> {\n if (this.streaming || this.ended) throw new Error(\"This voice stream is already open or ended.\");\n this.streaming = true;\n const controller = new AbortController();\n const abort = () => controller.abort(signal?.reason);\n signal?.addEventListener(\"abort\", abort, { once: true });\n if (signal?.aborted) abort();\n let heartbeatPending = false;\n const heartbeat = setInterval(() => {\n if (heartbeatPending || controller.signal.aborted) return;\n heartbeatPending = true;\n void this.http.request(\"POST\", this.path, { signal: controller.signal,\n body: { clientId: this.clientId, action: \"heartbeat\" } })\n .catch((error: unknown) => controller.abort(error)).finally(() => { heartbeatPending = false; });\n }, 5_000);\n try {\n const response = await this.http.open(\"GET\", `${this.path}/stream`, {\n query: { clientId: this.clientId }, signal: controller.signal,\n });\n for await (const event of readSSE<VoiceEvent>(response.body!, controller.signal)) {\n if (event.type !== \"heartbeat\") yield event;\n if (event.type === \"closed\" || event.type === \"error\") break;\n }\n } finally {\n clearInterval(heartbeat);\n signal?.removeEventListener(\"abort\", abort);\n controller.abort();\n this.streaming = false;\n await this.stop().catch(() => {});\n }\n }\n\n async stop(): Promise<void> {\n if (this.ended) return;\n this.ended = true;\n await this.http.request(\"POST\", this.path, { body: { clientId: this.clientId, action: \"stop\" } });\n }\n}\n","import type { AgentScoped, Mindwire } from \"./client.js\";\nimport { readSSE } from \"./sse.js\";\nimport type { Attachment, Event, Part, RespondInput, UserInput } from \"./types.js\";\n\n/** Per-session permissions. Discovery support alone does not imply control. */\nexport interface NativeSessionCapabilities {\n status: boolean;\n observe: boolean;\n input: boolean;\n interrupt: boolean;\n respond: boolean;\n}\n\nexport interface SessionActivity {\n sessionId: string;\n cwd: string;\n owner: \"native\" | \"none\" | \"unknown\";\n state: \"running\" | \"waiting\" | \"idle\" | \"stopped\" | \"unavailable\";\n turnId?: string;\n startedAt?: string;\n reason?: string;\n capabilities: NativeSessionCapabilities;\n}\n\nexport interface NativeSessionSnapshot {\n connectionId: string;\n sequence: number;\n turnId?: string;\n activity: SessionActivity;\n /** Recent native turn only. Use messages() for earlier history. */\n parts: Part[] | null;\n inputs: UserInput[] | null;\n historyRequired?: boolean;\n /** True when earlier or oversized items were omitted from this projection. */\n partial?: boolean;\n /** True only for a resume frame: retain your previous projection. */\n replay?: boolean;\n}\n\nexport interface NativeSessionEvent {\n connectionId: string;\n sequence: number;\n turnId?: string;\n activity?: SessionActivity;\n event?: Event;\n /** Starts a new live projection; older turns remain in native history. */\n reset?: boolean;\n historyChanged?: boolean;\n partial?: boolean;\n}\n\nexport type NativeSessionFrame =\n | { type: \"snapshot\" | \"resume\"; snapshot: NativeSessionSnapshot }\n | { type: \"update\"; update: NativeSessionEvent };\n\nexport interface NativeSessionAction {\n /** Attachment epoch from events(). Never substitute a new epoch when retrying. */\n connectionId: string;\n /** Caller-generated idempotency key; retain it on retry. */\n requestId: string;\n kind: \"input\" | \"interrupt\" | \"response\";\n /** Required for Stop; optional for sending into a specific still-running turn. */\n expectedTurnId?: string;\n text?: string;\n /** Uploaded artifact references, local images, or durable workspace file paths. */\n attachments?: Attachment[];\n response?: RespondInput;\n}\n\nexport interface NativeSessionReceipt {\n requestId: string;\n /** A response is submitted until the native server broadcasts its resolution. */\n status: \"accepted\" | \"submitted\";\n turnId?: string;\n}\n\nexport interface NativeSessionWatchOptions extends AgentScoped {\n /** `${connectionId}:${sequence}`; use only when retaining the corresponding UI state. */\n cursor?: string;\n signal?: AbortSignal;\n}\n\n/** Observe and, when supported, control the CLI session already running on the host.\n * All calls use the existing authenticated Mindwire transport. No extra public port. */\nexport class NativeSessionsApi {\n constructor(private readonly client: Mindwire) {}\n\n private path(chatId: string): string { return `/chats/${encodeURIComponent(chatId)}/native`; }\n\n /** A cheap, coalesced status lookup. Does not resume or launch a conversation. */\n activity(chatId: string, options: AgentScoped & { signal?: AbortSignal } = {}): Promise<SessionActivity> {\n return this.client.http.request(\"GET\", this.path(chatId), {\n query: { agent: options.agent ?? this.client.defaultAgent }, signal: options.signal,\n });\n }\n\n /** Breaking the loop detaches only this viewer. No automatic command resends.\n * On a replacement snapshot, replace the live projection; on resume, retain it.\n * Persist the cursor after applying each frame, then reuse it on reconnection. */\n async *events(chatId: string, options: NativeSessionWatchOptions = {}): AsyncGenerator<NativeSessionFrame> {\n const response = await this.client.http.open(\"GET\", `${this.path(chatId)}/events`, {\n query: { agent: options.agent ?? this.client.defaultAgent, cursor: options.cursor }, signal: options.signal,\n });\n yield* readSSE<NativeSessionFrame>(response.body!, options.signal);\n }\n\n /** Send, stop the exact turn, or answer a pending question. An unknown outcome\n * requires checking the conversation; do not retry with a fresh requestId. */\n action(chatId: string, action: NativeSessionAction, options: AgentScoped & { signal?: AbortSignal } = {}): Promise<NativeSessionReceipt> {\n return this.client.http.request(\"POST\", `${this.path(chatId)}/actions`, {\n query: { agent: options.agent ?? this.client.defaultAgent }, body: action, signal: options.signal,\n });\n }\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 /** Complete child environment; omitted inherits the current host environment. */\n environment?: Record<string, string | undefined>;\n /** Reuse host authentication on first setup, without inheriting host tools/config. Explicit sign-out is preserved. */\n authSource?: \"host\" | NativeAuthSource;\n /** Set false when the application owns this daemon and wants close() to stop it. Default true. */\n shared?: boolean;\n /** Download the SDK's exact daemon version instead of using a newer cached release. */\n exactVersion?: boolean;\n}\n\nexport interface NativeAuthSource {\n home: string;\n /** Automatic on first setup by default; manual only offers an auth method. Never overrides an existing choice or sign-out. */\n reuse?: \"automatic\" | \"manual\";\n /** Used only to resolve native credential references. Never inherited by agent processes. */\n environment?: Record<string, string | undefined>;\n}\n\nexport interface EmbeddedDaemon {\n baseUrl: string;\n token?: string;\n isAlive(): boolean;\n stop(): Promise<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 const entries = (env?: Record<string, string | undefined>) => env && Object.entries(env).sort(([a], [b]) => a.localeCompare(b));\n return JSON.stringify([opts.cwd ?? \"\", opts.statePath ?? \"\", opts.bin ?? \"\", opts.exactVersion,\n entries(opts.environment), opts.authSource === \"host\" ? [\"host\", entries(serverRuntime().process?.env)]\n : opts.authSource && [opts.authSource.home, opts.authSource.reuse ?? \"automatic\", entries(opts.authSource.environment)]]);\n}\n\nexport function startEmbedded(opts: EmbeddedOptions = {}): Promise<EmbeddedDaemon> {\n if (opts.shared === false) return spawnDaemon(opts);\n const key = configKey(opts);\n let daemon = shared.get(key);\n if (!daemon) {\n daemon = spawnDaemon(opts, () => { if (shared.get(key) === daemon) shared.delete(key); }).catch((err) => {\n if (shared.get(key) === daemon) shared.delete(key); // never evict a newer retry\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, onStop: () => void = () => {}): 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, opts.exactVersion);\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 const authSource = opts.authSource === \"host\"\n ? { home: (await import(\"node:os\")).homedir(), environment: proc.env }\n : opts.authSource;\n\n const child = spawn(bin, [], {\n env: {\n ...(opts.environment ?? 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 // The daemon consumes and unsets this before starting any native process.\n ...(authSource ? { MINDWIRE_AUTH_SOURCE: JSON.stringify(authSource) } : {}),\n },\n cwd: opts.cwd ?? proc.cwd(),\n stdio: \"ignore\",\n });\n\n let spawnError: Error | null = null;\n let exited = false;\n let stopping: Promise<void> | undefined;\n const isAlive = () => !exited && !stopping && !spawnError;\n const killOnExit = () => { try { child.kill(); } catch {} };\n const cleanup = () => {\n exited = true;\n proc.off?.(\"exit\", killOnExit);\n onStop();\n };\n child.once(\"exit\", cleanup);\n child.on(\"error\", (e: Error) => {\n spawnError = e;\n cleanup();\n });\n\n const stop = () => {\n return stopping ??= new Promise<void>((resolve) => {\n if (exited) { resolve(); return; }\n const timer = setTimeout(() => { try { child.kill(\"SIGKILL\"); } catch {} }, 2000);\n child.once(\"exit\", () => { clearTimeout(timer); resolve(); });\n child.once(\"error\", () => { clearTimeout(timer); resolve(); });\n killOnExit();\n });\n };\n // Best-effort: don't leave the daemon running after the host exits.\n proc.once?.(\"exit\", killOnExit);\n try {\n await waitHealthy(baseUrl, token, () => spawnError ?? (exited ? new Error(\"daemon exited during startup\") : null), resolved, 15000, !!authSource);\n return { baseUrl, token, isAlive, stop };\n } catch (error) {\n await stop();\n throw error;\n }\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, exactVersion?: boolean): 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, exactVersion });\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 -C packages/daemon build -o /tmp/mindwired ./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 authSource = false,\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}` }, signal: AbortSignal.timeout(1000) });\n if (res.ok) {\n if (authSource && (await res.json() as { nativeAuthSource?: boolean }).nativeAuthSource !== true)\n throw new MindwireError(\"This daemon does not support native auth sources. Update Mindwire or build the matching daemon before using authSource.\");\n return;\n }\n } catch (error) {\n if (error instanceof MindwireError) throw error;\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, type EmbeddedDaemon } 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 /** Local process liveness when this target owns a daemon; remote targets use health(). */\n isAlive?(): boolean;\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\nexport interface LocalTarget extends Target {\n /** v1 supports a private environment, separate host auth source, and an owned daemon lifetime. */\n readonly profileVersion: number;\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. Shared targets stay alive until host exit. With `shared: false`, close() stops the owned daemon.\n */\nexport function local(opts: EmbeddedOptions = {}): LocalTarget {\n let daemon: EmbeddedDaemon | undefined;\n let pending: Promise<EmbeddedDaemon> | undefined;\n return {\n name: \"local\",\n profileVersion: 1,\n async connect(spec) {\n if (daemon && !daemon.isAlive()) { daemon = undefined; pending = undefined; }\n const d = await (pending ??= startEmbedded(opts).then(value => daemon = value).catch(error => {\n pending = undefined;\n throw error;\n }));\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 isAlive: d.isAlive,\n stop: opts.shared === false ? d.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 type { HandoffPreview, HandoffRequest, HandoffResult } from \"./handoffs.js\";\nimport { Http, type FetchLike } from \"./http.js\";\nimport { readSSE } from \"./sse.js\";\nimport { Run } from \"./run.js\";\nimport { WorkspaceApi, type ProjectAuth } from \"./workspace.js\";\nimport { BotsApi } from \"./bots.js\";\nimport { AppsApi } from \"./apps.js\";\nimport { IntegrationsApi } from \"./integrations.js\";\nimport { SurfacesApi } from \"./surfaces.js\";\nimport { ServiceApi } from \"./service.js\";\nimport { ExecutionApi } from \"./execution.js\";\nimport { ComputerApi } from \"./computer.js\";\nimport { VoiceApi } from \"./voice.js\";\nimport { NativeSessionsApi } from \"./native-sessions.js\";\nimport { executableChecksum } from \"./binary-cache.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 Attachment,\n AttachmentUploadChunk,\n AttachmentUploadState,\n AuthMethod,\n AuthState,\n AuthStatus,\n Catalog,\n CommandCatalog,\n ChatSummary,\n ChatForkResult,\n ForkChatOptions,\n CustomProvider,\n DeleteResult,\n DoctorReport,\n Health,\n MCPServer,\n MemoryDoc,\n MemoryScope,\n Message,\n MessagePage,\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. Shared local and 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 bots: BotsApi;\n readonly apps: AppsApi;\n readonly integrations: IntegrationsApi;\n readonly surfaces: SurfacesApi;\n readonly service: ServiceApi;\n readonly execution: ExecutionApi;\n readonly computer: ComputerApi;\n readonly voice: VoiceApi;\n readonly nativeSessions: NativeSessionsApi;\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.bots = new BotsApi(this);\n this.apps = new AppsApi(this);\n this.integrations = new IntegrationsApi(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.voice = new VoiceApi(this);\n this.nativeSessions = new NativeSessionsApi(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.bots = new BotsApi(clone as Mindwire);\n clone.apps = new AppsApi(clone as Mindwire);\n clone.integrations = new IntegrationsApi(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.voice = new VoiceApi(clone as Mindwire);\n clone.nativeSessions = new NativeSessionsApi(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 shared local and remote targets. With `local({ shared: false })`, closes the owned daemon.\n * Safe to 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 /** Discover native commands for a project without starting a model turn. */\n commands(opts: { directory?: string; refresh?: boolean } & AgentScoped = {}): Promise<CommandCatalog> {\n return this.http.request<CommandCatalog>(\"GET\", \"/commands\", {\n query: { ...this.agentParam(opts), dir: opts.directory, refresh: opts.refresh },\n });\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 /** Native project conversations and drafts, newest first, shared across agents.\n * `cwd` matches an exact directory; `projectId` selects saved membership.\n * `refresh` bypasses the daemon's short native metadata cache.\n */\n chats(options: { cwd?: string; projectId?: string; refresh?: boolean } = {}): Promise<ChatSummary[]> {\n return this.http.request<ChatSummary[]>(\"GET\", \"/chats\", { query: options });\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 /** Resumable upload over the same connection as chat. Retrying an identical chunk is safe. */\n uploadAttachmentChunk(chatId: string, id: string, chunk: AttachmentUploadChunk, signal?: AbortSignal): Promise<AttachmentUploadState> {\n return this.http.request(\"PUT\", `/chats/${encodeURIComponent(chatId)}/attachments/${encodeURIComponent(id)}`, { body: chunk, signal });\n }\n\n /** Store a file with its conversation, then pass the returned reference in turn options. */\n async uploadAttachment(chatId: string, file: { name: string; mime?: string; data: Uint8Array },\n options: { signal?: AbortSignal; onProgress?: (fraction: number) => void } = {}): Promise<Attachment> {\n if (file.data.byteLength > 16 * 1024 * 1024) throw new RangeError(\"Attachments must be at most 16 MiB\");\n const data = new Uint8Array(file.data);\n const hash = async (bytes: Uint8Array<ArrayBuffer>) => {\n // Older supported Node runtimes do not expose Web Crypto globally.\n // Keep the native fallback lazy so browser imports still work.\n if (!globalThis.crypto?.subtle) return executableChecksum(bytes);\n const digest = new Uint8Array(await globalThis.crypto.subtle.digest(\"SHA-256\", bytes));\n return Array.from(digest, b => b.toString(16).padStart(2, \"0\")).join(\"\");\n };\n const sha256 = await hash(data);\n const id = (await hash(new TextEncoder().encode(`${chatId}\\0${file.name}\\0${sha256}`))).slice(0, 32);\n let offset = 0;\n for (;;) {\n options.signal?.throwIfAborted();\n const end = Math.min(data.length, offset + 384 * 1024);\n let binary = \"\";\n for (let start = offset; start < end; start += 16384) {\n binary += String.fromCharCode(...data.subarray(start, Math.min(end, start + 16384)));\n }\n const state = await this.uploadAttachmentChunk(chatId, id, {\n name: file.name, mime: file.mime ?? \"application/octet-stream\", bytes: data.length,\n sha256, offset, data: btoa(binary),\n }, options.signal);\n if (state.id !== id || state.bytes !== data.length || state.offset < end || state.offset > data.length ||\n (state.complete && state.offset !== data.length) || (!state.complete && state.offset <= offset)) {\n throw new Error(\"Invalid attachment upload acknowledgement\");\n }\n options.onProgress?.(data.length === 0 ? 1 : state.offset / data.length);\n if (state.complete) return { artifactId: id, name: state.name, mime: state.mime, bytes: state.bytes };\n offset = state.offset;\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 /** Read-only portable handoff context; requires crossAgentHandoffVersion >= 2. */\n previewHandoff(chatId: string): Promise<HandoffPreview> {\n return this.http.request(\"GET\", `/chats/${encodeURIComponent(chatId)}/handoff`);\n }\n\n /** Start another agent in a linked conversation in the source project.\n * Reuse the identical payload after a lost response to recover the same run. */\n async handoff(chatId: string, request: HandoffRequest): Promise<HandoffResult> {\n const result = await this.http.request<Omit<HandoffResult, \"run\"> & { run: RunData }>(\n \"POST\", `/chats/${encodeURIComponent(chatId)}/handoff`, { body: request },\n );\n return { ...result, run: new Run(this.http, result.run) };\n }\n\n /**\n * `POST /chats/{id}/fork` — clone a chat into a new id (generated when `newChatId` is omitted).\n * Codex and Claude preserve native context. `beforeMessageId` excludes that prompt and every\n * later message; send the edited prompt to the returned chat with `turn`. Reuse `newChatId`\n * and the turn's `requestId` on retries. The source chat and filesystem are unchanged.\n * A source with a live turn returns 409; an unknown source returns 404.\n */\n forkChat(chatId: string, opts: ForkChatOptions = {}): Promise<ChatForkResult> {\n return this.http.request<ChatForkResult>(\"POST\", `/chats/${encodeURIComponent(chatId)}/fork`, {\n body: opts,\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 /**\n * Byte-budgeted history (default 1 MiB). Whole messages are retained, including\n * up to two newest messages even when oversized. Older services return their\n * bounded array, normalized here without a probe or duplicate request.\n */\n async messagePage(\n chatId: string,\n opts: AgentScoped & { limit?: number; before?: string; maxBytes?: number; ifRevision?: string } = {},\n ): Promise<MessagePage> {\n const limit = opts.limit ?? 12;\n const result = await this.http.request<MessagePage | Message[] | null>(\n \"GET\", `/chats/${encodeURIComponent(chatId)}/messages`, {\n query: { ...this.agentParam(opts), limit, before: opts.before,\n paged: \"true\", maxBytes: opts.maxBytes ?? 1_048_576,\n ifRevision: opts.before ? undefined : opts.ifRevision },\n },\n );\n if (result === null) return { messages: [], hasMore: false };\n if (!Array.isArray(result)) return result;\n return { messages: result, hasMore: result.length === limit, before: result[0]?.id };\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 /** Keep this ID when retrying an unacknowledged turn. Requires turnRequestVersion >= 1. */\n requestId?: string;\n /** Queue native follow-up input when this chat is active. Requires requestId and queuedInputVersion >= 1. */\n queueIfRunning?: boolean;\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 requestId?: string;\n queueIfRunning?: boolean;\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.requestId !== undefined) body.requestId = input.requestId;\n if (input.queueIfRunning !== undefined) body.queueIfRunning = input.queueIfRunning;\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 requestId?: string;\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; requestId?: 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: { instructions: opts.instructions, requestId: opts.requestId },\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 { spawn } from \"node:child_process\";\nimport { 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 { SDK_VERSION, versionAtLeast } from \"../version.js\";\nimport type { ComputerInfo, ComputerRoute } from \"../computer.js\";\nimport type { RelayOptions } from \"./relay.js\";\nimport { validateRelayOptions } from \"./relay.js\";\nimport { processStateAlive, type ProcessState } from \"./process.js\";\nimport { acquireProcessLock } from \"./lock.js\";\nimport { providerNeedsAction } from \"./provider-errors.js\";\n\nexport interface ComputerConfig {\n daemonBin?: string;\n version?: string;\n versionPinned?: boolean;\n directory: string;\n host?: string;\n bind: string;\n sshPort: number;\n websocketPort: number;\n relay: RelayOptions;\n}\nexport const CONTROLLER_PROTOCOL = 4;\nexport interface ControllerState extends ProcessState {\n protocol?: number; cliVersion?: string; ready: boolean; phase?: string; error?: string; errorCode?: string; recovering?: boolean; routes?: ComputerRoute[]; checkedAt?: number;\n relayFailureSince?: number; relayFailures?: number;\n discoveryError?: string;\n}\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}\n\nexport async function computerClient(directory: string, requestTimeoutMs = 3000): 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 });\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, options: { resume?: boolean; signal?: AbortSignal; timeoutMs?: number; waitForRoutes?: boolean } = {}): Promise<Mindwire> {\n const resume = options.resume !== false;\n options.signal?.throwIfAborted();\n await fs.mkdir(directory, { recursive: true, mode: 0o700 });\n const stoppedPath = path.join(directory, \"computer-stopped.json\");\n if (resume) await fs.rm(stoppedPath, { force: true });\n else if ((await readJSON<{ stopped: boolean }>(stoppedPath))?.stopped) throw new Error(\"Mindwire was stopped by its owner.\");\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 validateRelayOptions(config.relay);\n // Every explicit Connect/Start waits for a fresh route check. Background\n // supervision can reuse readiness and doesn't create navigation-style churn.\n const requestedAt = resume ? Date.now() : 0;\n if (resume) await writeJSON(path.join(directory, \"computer-check.json\"), { requestedAt });\n const compatible = (controller: ControllerState | undefined) => (controller?.protocol ?? 0) >= CONTROLLER_PROTOCOL\n && versionAtLeast(controller?.cliVersion, SDK_VERSION);\n let launchedPID: number | undefined;\n let launchFailure: Error | undefined;\n const waitUntilReady = async (): Promise<Mindwire> => {\n let phase: string | undefined;\n let lastState: ControllerState | undefined;\n const deadline = Date.now() + (options.timeoutMs ?? 120_000);\n while (Date.now() < deadline) {\n options.signal?.throwIfAborted();\n const controller = await readJSON<ControllerState>(path.join(directory, \"computer-controller.json\"));\n lastState = controller;\n if (launchFailure) throw launchFailure;\n if (launchedPID && controller?.pid !== launchedPID) { await delay(250, undefined, { signal: options.signal }); continue; }\n if (options.waitForRoutes === false && compatible(controller) && await processStateAlive(controller)) {\n try { return await computerClient(directory); } catch { /* The daemon may still be starting. */ }\n }\n if (controller?.error && !controller.recovering) throw new Error(controller.error);\n if (controller?.error && providerNeedsAction(controller.errorCode) && (controller.checkedAt ?? 0) >= requestedAt) throw new Error(controller.error);\n if (controller?.ready && compatible(controller) && (controller.checkedAt ?? 0) >= requestedAt\n && await processStateAlive(controller)) return computerClient(directory);\n if (controller?.phase && controller.phase !== phase) { phase = controller.phase; onProgress?.(phase); }\n await delay(250, undefined, { signal: options.signal });\n }\n const lastStep = lastState?.errorCode === \"dns\"\n ? \"The internet address still cannot be resolved.\"\n : lastState?.error ?? phase ?? \"The background service hasn't reported readiness.\";\n const recovering = lastState?.recovering && await processStateAlive(lastState).catch(() => false);\n throw new Error(`Mindwire's connection is not ready. ${lastStep}${recovering ? \" Background recovery continues.\" : \"\"} Run mindwire reconnect to retry, or mindwire status for details.`);\n };\n if (current) {\n const changed = Object.keys(patch).filter(key => JSON.stringify(config[key as keyof ComputerConfig]) !== JSON.stringify(previous?.[key as keyof ComputerConfig]));\n if (changed.length) {\n if (changed.some(key => ![\"relay\", \"host\"].includes(key))) {\n throw new Error(\"Changing the service's directory or listening ports requires mindwire stop when idle. Connection providers can be changed live with mindwire connection.\");\n }\n const controller = await readJSON<ControllerState>(path.join(directory, \"computer-controller.json\"));\n if (!compatible(controller) || !await processStateAlive(controller)) {\n // Adopting a controller must also work when the old internet route is broken.\n await ensureComputer(directory, cliPath, {}, onProgress, { ...options, waitForRoutes: false });\n }\n const { changeComputerConnection } = await import(\"./connection-change.js\");\n await changeComputerConnection(directory, Object.fromEntries(changed.map(key => [key, patch[key as keyof ComputerConfig]])), { signal: options.signal, onProgress });\n return computerClient(directory);\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 const controller = await readJSON<ControllerState>(path.join(directory, \"computer-controller.json\"));\n if (compatible(controller) && await processStateAlive(controller)) return waitUntilReady();\n // The controller can crash while its daemon and tunnel remain healthy.\n // Start a new owner below; it adopts those processes without restarting them.\n }\n const lockPath = path.join(directory, \"launch.lock\");\n const lock = await acquireProcessLock(lockPath, {\n signal: options.signal,\n onWait: async () => {\n const controller = await readJSON<ControllerState>(path.join(directory, \"computer-controller.json\"));\n if (compatible(controller) && await processStateAlive(controller)) {\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 true;\n }\n return false;\n },\n });\n if (!lock) return waitUntilReady();\n try {\n if (!resume && (await readJSON<{ stopped: boolean }>(stoppedPath))?.stopped) throw new Error(\"Mindwire was stopped by its owner.\");\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 const controller = await readJSON<ControllerState>(path.join(directory, \"computer-controller.json\"));\n if (compatible(controller) && await processStateAlive(controller)) return waitUntilReady();\n }\n let controller = await readJSON<ControllerState>(path.join(directory, \"computer-controller.json\"));\n if (existing && controller && !compatible(controller) && await processStateAlive(controller)) {\n onProgress?.(\"Refreshing the background connection service…\");\n const { handoffController } = await import(\"./controller-handoff.js\");\n await handoffController(directory, controller, config, await existing.computer.info());\n controller = undefined;\n }\n if (await processStateAlive(controller)) {\n if (controller?.error && !controller.recovering) throw new Error(controller.error);\n } else {\n await writeJSON(configPath, config);\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 launchedPID = child.pid;\n child.on(\"exit\", () => { launchFailure = new Error(`The computer controller stopped. Inspect ${path.join(directory, \"computer.log\")}.`); });\n child.unref();\n } finally { await log.close(); }\n }\n return await waitUntilReady();\n } finally { await lock.close(); }\n}\n\nexport async function superviseComputer(directory: string): Promise<void> {\n const controller = await import(\"./controller.js\");\n await controller.superviseComputer(directory);\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 (!await processStateAlive(controller)) throw new Error(\"The Mindwire controller is not running.\");\n const lease = force ? undefined : await client.service.acquireUpdate();\n try {\n await writeJSON(path.join(directory, \"computer-stopped.json\"), { stopped: true });\n if (!await processStateAlive(controller)) throw new Error(\"The Mindwire controller changed. Retry the command.\");\n process.kill(controller!.pid, \"SIGTERM\");\n } catch (error) {\n await fs.rm(path.join(directory, \"computer-stopped.json\"), { force: true });\n if (lease) await client.service.releaseUpdate(lease.id);\n throw error;\n }\n for (let attempt = 0; attempt < 80; attempt++) { if (!await processStateAlive(controller)) return; await delay(250); }\n throw new Error(\"Mindwire is still stopping. Check computer.log.\");\n}\n"]}
|