@standardagents/code 0.13.10 → 0.14.0-issue.108.a702d6-darwin-arm64

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/api.ts","../src/theme.ts","../src/stream.ts","../src/snapshot-epoch.ts","../src/hub.ts","../src/account-user-stream.ts","../packages/core/src/session-events.ts","../src/subagent-streams.ts","../src/session-state.ts","../src/transcript-delivery.ts","../src/permissions.ts","../src/approvals.ts","../src/tunnel.ts","../src/tool-ledger.ts","../src/render.ts","../src/bridge.ts","../src/progressive-markdown.ts","../src/markdown.ts","../src/wordmill.ts","../src/types.ts","../src/subprocess-env.ts","../src/clipboard.ts","../src/tui.ts","../src/shared-messaging.ts","../src/history.ts","../src/process-registry.ts","../src/mcp-config.ts","../src/credentials.ts","../src/device-login.ts","../src/recorder.ts","../src/product.ts","../src/machine.ts","../src/registry.ts","../src/fs-browse.ts","../src/dir-picker.ts","../src/relay.ts","../src/ripgrep.ts","../src/host-tools.ts","../src/mcp.ts","../src/execution-session.ts","../src/daemon-user-stream.ts","../src/daemon-activity.ts","../src/check-update.ts","../src/daemon.ts","../src/daemon-service.ts","../src/daemon-cli.ts","../src/prefs.ts","../src/auth-cli.ts","../src/index.ts"],"names":["deferImmediate","path","os","fs","tail","CoreBridge","DIM","RESET","cols","run","j","text","c","cell","BOLD","input","dots","dotsStyled","agent","withAgent","top","bottom","clamp","flat","CoreProcessRegistry","file","output","dir","crypto","MAX_ENTRIES","spawn","fsp","isAlive","r","applied","error","api","check","readline","who","parseArgs","connecting"],"mappings":"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","file":"index.js","sourcesContent":["export * from \"@standardagents/code-network/api\";\n","/**\n * Terminal light/dark theme.\n *\n * The CLI deliberately rides the user's own terminal colors for most text, but a\n * couple of accents assume a DARK background — bright-white \"emphasis\" text\n * (`\\x1b[97m`) is invisible on a light terminal, and bright-black grey can be too\n * faint. We detect the terminal's background and remap just those, so the CLI is\n * legible either way without a heavy palette rewrite.\n *\n * Detection order:\n * 1. `STANDARD_CODE_THEME=light|dark` — explicit override.\n * 2. `COLORFGBG` — many terminals export `\"<fg>;<bg>\"` (e.g. iTerm2, rxvt);\n * a light background is a high ANSI index (7/15) or a 256-colour index in\n * the bright range.\n * 3. Default: dark (the historical assumption).\n *\n * Shared by both palette objects (`index.ts` and `tui.ts`) so they never drift.\n */\nfunction detectLight(): boolean {\n const forced = (process.env.STANDARD_CODE_THEME || \"\").toLowerCase();\n if (forced === \"light\") return true;\n if (forced === \"dark\") return false;\n const fgbg = process.env.COLORFGBG; // \"<fg>;<bg>\" or \"<fg>;<hi>;<bg>\"\n if (fgbg) {\n const parts = fgbg.split(\";\");\n const bg = Number(parts[parts.length - 1]);\n if (!Number.isNaN(bg)) return bg === 7 || bg === 15 || bg >= 230;\n }\n return false;\n}\n\nexport const isLightTheme = detectLight();\n\n/** Bright-white emphasis on dark; near-black on light (bright white vanishes). */\nexport const themeWhite = isLightTheme ? \"\\x1b[30m\" : \"\\x1b[97m\";\n/** Subtle grey text, legible on either background. */\nexport const themeGray = isLightTheme ? \"\\x1b[38;5;244m\" : \"\\x1b[90m\";\n","export * from \"@standardagents/code-network/stream\";\n","export * from \"@standardagents/code-network/snapshot-epoch\";\n","export * from \"@standardagents/code-network/hub\";\n","/** One account-scoped event stream shared by every account-level feature in a client. */\nimport type { ApiClient } from \"./api.ts\";\nimport { HubSocket } from \"./hub.ts\";\n\nexport type AccountConnectionState = \"connected\" | \"reconnecting\";\nexport type AccountEventListener = (event: string, data: unknown) => void;\nexport type AccountConnectionListener = (state: AccountConnectionState, attempt: number) => void;\n\nexport interface AccountUserStreamOptions {\n clientKind: \"daemon\" | \"web\" | \"mac\" | \"tui\" | \"cli\";\n clientName?: string;\n /** Give each physical reconnect its own client id for socket-lifecycle diagnostics. */\n uniqueConnectionId?: boolean;\n}\n\nexport class AccountUserStream {\n private started = false;\n private hub: HubSocket;\n private eventListeners = new Set<AccountEventListener>();\n private connectionListeners = new Set<AccountConnectionListener>();\n private connected = false;\n\n constructor(\n api: ApiClient,\n clientId: string,\n options: AccountUserStreamOptions\n ) {\n this.hub = new HubSocket(\n api,\n clientId,\n {\n onEvent: (event, data) => this.emitEvent(event, data),\n onConnection: (state, attempt) => {\n this.connected = state === \"connected\";\n this.emitConnection(state, attempt);\n },\n },\n options.clientName,\n options.clientKind,\n options.uniqueConnectionId\n );\n }\n\n async start(): Promise<void> {\n if (this.started) return;\n this.started = true;\n await this.hub.start();\n }\n\n onEvent(listener: AccountEventListener): () => void {\n this.eventListeners.add(listener);\n return () => this.eventListeners.delete(listener);\n }\n\n onConnection(listener: AccountConnectionListener): () => void {\n this.connectionListeners.add(listener);\n return () => this.connectionListeners.delete(listener);\n }\n\n /** Wait for a live socket. The timeout is local and performs no network work. */\n waitUntilConnected(timeoutMs = 15_000): Promise<void> {\n if (this.connected) return Promise.resolve();\n void this.start();\n return new Promise<void>((resolve, reject) => {\n let timer: ReturnType<typeof setTimeout>;\n const remove = this.onConnection((state) => {\n if (state !== \"connected\") return;\n clearTimeout(timer);\n remove();\n resolve();\n });\n timer = setTimeout(() => {\n remove();\n reject(new Error(\"The account stream did not connect in time.\"));\n }, timeoutMs);\n });\n }\n\n private emitEvent(event: string, data: unknown): void {\n for (const listener of this.eventListeners) listener(event, data);\n }\n\n private emitConnection(state: AccountConnectionState, attempt: number): void {\n for (const listener of this.connectionListeners) listener(state, attempt);\n }\n\n close(): void {\n this.connected = false;\n this.hub.close();\n this.eventListeners.clear();\n this.connectionListeners.clear();\n }\n}\n","/**\n * Account-scoped Standard Code session changes.\n *\n * The payload is intentionally small and directly applicable: normal\n * connected operation carries only the affected row or metadata field. Full\n * REST reconciliation is reserved for boot/reconnect. A legacy row-only event\n * may cause one affected-thread read; malformed events are ignored. The event\n * travels only on the signed-in user's published user\n * stream and never carries transcript or tool data.\n */\nexport const SESSION_CHANGED_EVENT = \"standardcode.sessions_changed\";\nexport const SESSION_CHANGED_PATH = \"/api/users/me/standardcode/sessions_changed\";\nexport const SESSION_VALUE_PATH = \"/api/users/me/standardcode/session_value\";\nexport const SESSION_ARCHIVE_PATH = \"/api/users/me/standardcode/archive\";\nexport const READ_STATE_PATH = \"/api/users/me/standardcode/read_state\";\nexport const READ_STATE_CHANGED_EVENT = \"standardcode.read_changed\";\nexport const ARCHIVED_SESSIONS_KEY = \"standardcode.archived\";\nexport const READ_STATE_KEY = \"standardcode.lastread\";\nexport const THREAD_NAME_PREFIX = \"standardcode.thread.\";\nconst THREAD_NAME_SUFFIX = \".name\";\n\nexport type SessionChange =\n | \"created\"\n | \"updated\"\n | \"deleted\"\n | \"metadata\"\n | \"activity\"\n | \"subagents\";\n\nexport interface SessionChangedData {\n thread_id?: string;\n change: SessionChange;\n name?: string | null;\n archived?: boolean;\n thread?: SessionThreadDelta;\n}\n\nexport interface SessionThreadDelta {\n id: string;\n agent_id?: string;\n tags?: string[];\n created_at?: number;\n updated_at?: number;\n last_message_at?: number;\n title?: string;\n preview?: string;\n executing?: boolean;\n}\n\n/**\n * Return the affected thread for a session-metadata key. `undefined` means an\n * account-wide metadata key (the archived set); `null` means the key is not a\n * session-metadata value and must stay on the generic user-KV route.\n */\nexport function sessionMetadataThreadId(key: string): string | undefined | null {\n if (key === ARCHIVED_SESSIONS_KEY) return undefined;\n if (!key.startsWith(THREAD_NAME_PREFIX) || !key.endsWith(THREAD_NAME_SUFFIX)) return null;\n const threadId = key.slice(THREAD_NAME_PREFIX.length, -THREAD_NAME_SUFFIX.length);\n return threadId || null;\n}\n\nconst SESSION_CHANGES = new Set<SessionChange>([\n \"created\",\n \"updated\",\n \"deleted\",\n \"metadata\",\n \"activity\",\n \"subagents\",\n]);\n\n/** Parse an untrusted user-stream payload without widening the event contract. */\nexport function parseSessionChangedData(value: unknown): SessionChangedData | null {\n if (!value || typeof value !== \"object\") return null;\n const raw = value as Record<string, unknown>;\n if (typeof raw.change !== \"string\" || !SESSION_CHANGES.has(raw.change as SessionChange)) {\n return null;\n }\n const parsed: SessionChangedData = {\n change: raw.change as SessionChange,\n ...(typeof raw.thread_id === \"string\" && raw.thread_id ? { thread_id: raw.thread_id } : {}),\n };\n if (Object.prototype.hasOwnProperty.call(raw, \"name\") && (raw.name === null || typeof raw.name === \"string\")) {\n parsed.name = raw.name as string | null;\n }\n if (typeof raw.archived === \"boolean\") parsed.archived = raw.archived;\n if (raw.thread && typeof raw.thread === \"object\" && !Array.isArray(raw.thread)) {\n const thread = raw.thread as Record<string, unknown>;\n const id = typeof thread.id === \"string\" && thread.id ? thread.id : parsed.thread_id;\n if (id && (!parsed.thread_id || parsed.thread_id === id)) {\n const delta: SessionThreadDelta = { id };\n if (typeof thread.agent_id === \"string\") delta.agent_id = thread.agent_id;\n if (Array.isArray(thread.tags)) {\n delta.tags = thread.tags.filter((tag): tag is string => typeof tag === \"string\");\n }\n for (const key of [\"created_at\", \"updated_at\", \"last_message_at\"] as const) {\n if (typeof thread[key] === \"number\" && Number.isFinite(thread[key])) delta[key] = thread[key];\n }\n for (const key of [\"title\", \"preview\"] as const) {\n if (typeof thread[key] === \"string\") delta[key] = thread[key];\n }\n if (typeof thread.executing === \"boolean\") delta.executing = thread.executing;\n parsed.thread = delta;\n }\n }\n return parsed;\n}\n","export * from \"@standardagents/code-network/subagent-streams\";\n","export * from \"@standardagents/code-network/session-state\";\n","export * from \"@standardagents/code-network/transcript-delivery\";\n","/**\n * Permission engine. Combines the current mode with the server-assigned risk\n * (1–5) to decide whether a forwarded tool runs automatically, needs the user's\n * approval, or is blocked outright. A server permission request cannot be\n * downgraded by a lower wire risk.\n */\nimport type { Level } from \"./types.ts\";\n\nexport type Decision = \"allow\" | \"ask\" | \"deny\";\n\nexport interface PermissionState {\n /** Auto-accept level 1–5: calls at risk ≤ level run automatically; riskier ones ask. */\n level: Level;\n /** Tool names the user chose to always allow this session. */\n alwaysAllow: Set<string>;\n /**\n * Risk levels the user granted this session (\"allow level N\"). Risk is a\n * GRADIENT, not distinct buckets: a grant at level N auto-accepts everything\n * at risk ≤ N — approving installs (3) obviously covers safe writes (2).\n * Kept as a Set (not a single ceiling) only for persisted-approval\n * compatibility; decide() always reads it as max().\n */\n allowRisk: Set<number>;\n}\n\n/** The effective auto-accept ceiling: base level raised by any risk grants. */\nexport function riskCeiling(state: PermissionState): number {\n let ceiling: number = state.level;\n for (const granted of state.allowRisk) {\n if (granted > ceiling) ceiling = granted;\n }\n return ceiling;\n}\n\nexport function decide(\n state: PermissionState,\n tool: string,\n risk: number | null,\n hasPermissionRequest: boolean\n): Decision {\n const effectiveRisk = typeof risk === \"number\" ? Math.min(5, Math.max(1, risk)) : hasPermissionRequest ? 3 : 1;\n\n // Standing tool approvals the user granted this session.\n if (state.alwaysAllow.has(tool)) return \"allow\";\n\n // `requestPermission` is an authorization instruction, not a hint used only\n // to choose the default risk. A model-controlled numeric risk must never\n // suppress the prompt requested by the server-side tool definition.\n if (hasPermissionRequest) return \"ask\";\n\n // One gradient: anything at or below the effective ceiling (base level,\n // raised by session risk grants) runs without asking.\n return effectiveRisk <= riskCeiling(state) ? \"allow\" : \"ask\";\n}\n\n/**\n * Catastrophic-command guard that applies regardless of mode. These are blocked\n * even in bypass mode — a coding agent should never be able to wipe the machine.\n */\nconst CATASTROPHIC_PATTERNS: RegExp[] = [\n /\\brm\\s+(-[a-z]*\\s+)*-[a-z]*f[a-z]*\\s+(-[a-z]*\\s+)*(\\/|~|\\$HOME|\\/\\*|\\.\\s*$|\\/\\s*$)/i, // rm -rf / , rm -rf ~\n /\\brm\\s+-rf\\s+--no-preserve-root/i,\n /:\\(\\)\\s*\\{\\s*:\\|:&\\s*\\}\\s*;:/, // fork bomb\n /\\bmkfs(\\.\\w+)?\\b/i, // format filesystem\n /\\bdd\\b[^\\n]*\\bof=\\/dev\\/(sd|disk|nvme|hd)/i, // overwrite raw disk\n /\\b(shutdown|reboot|halt|poweroff)\\b/i,\n />\\s*\\/dev\\/(sd|disk|nvme|hd)/i,\n /\\bchmod\\s+-R\\s+(000|777)\\s+\\/(?:\\s|$)/i,\n];\n\nexport function isCatastrophic(command: string): boolean {\n return CATASTROPHIC_PATTERNS.some((re) => re.test(command));\n}\n","export * from \"@standardagents/code-network/approvals\";\n","/**\n * Client-side raw TCP tunnels for provider-owned encrypted streams.\n *\n * The instance's Sama One provider egresses through the user's machine instead\n * of a VPS relay: it asks the bridge to open a `tcp_tunnel` to\n * `chatgpt.com:443`, then runs TLS inside the provider over the raw bytes we\n * shuttle. We only ever see CIPHERTEXT — the request/response are encrypted\n * end-to-end between the Worker and chatgpt.com — and the TCP connection\n * originates from THIS machine's IP (natural residential egress, no\n * `Cf-Worker` header, which is exactly what chatgpt.com's WAF blocks for\n * Cloudflare Worker fetches). The daemon contains no TLS, HTTP, credential, or\n * provider implementation; it authorizes the destination and relays bytes.\n *\n * Security: a HARDCODED allowlist. This tunnel opens a socket to nothing but\n * `chatgpt.com:443`; any other host/port is refused with an explicit error.\n * Payload bytes are never logged.\n */\nimport net from \"node:net\";\nimport { setImmediate as deferImmediate } from \"node:timers\";\n\n/** The only destination a tunnel may reach. */\nconst ALLOWED_HOST = \"chatgpt.com\";\nconst ALLOWED_PORT = 443;\n\n/** Max raw bytes per stream_data frame (matches the builder's chunk size). */\nconst CHUNK_BYTES = 256 * 1024;\n\ninterface StreamOpenFrame {\n type: \"stream_open\";\n id: string;\n tool: string;\n meta?: Record<string, unknown>;\n}\n\n/** Sink the tunnel uses to send frames back to the instance. */\nexport type StreamSend = (payload: object) => void;\n\ninterface ActiveTunnel {\n socket: net.Socket;\n outbound: TunnelFrameCoalescer;\n}\n\n/**\n * Coalesce the small chunks Node commonly emits for streaming responses into\n * as few WebSocket frames as possible. A frame is flushed at the end of the\n * current event-loop turn or immediately when it reaches the 256 KiB cap.\n */\nexport class TunnelFrameCoalescer {\n private chunks: Buffer[] = [];\n private bytes = 0;\n private scheduled = false;\n\n constructor(private readonly emit: (chunk: Buffer) => void) {}\n\n push(chunk: Buffer): void {\n if (chunk.length === 0) return;\n let offset = 0;\n while (offset < chunk.length) {\n const remaining = CHUNK_BYTES - this.bytes;\n const take = Math.min(remaining, chunk.length - offset);\n this.chunks.push(chunk.subarray(offset, offset + take));\n this.bytes += take;\n offset += take;\n if (this.bytes === CHUNK_BYTES) this.flush();\n }\n if (this.bytes > 0 && !this.scheduled) {\n this.scheduled = true;\n deferImmediate(() => {\n this.scheduled = false;\n this.flush();\n });\n }\n }\n\n flush(): void {\n if (this.bytes === 0) return;\n const chunk = this.chunks.length === 1\n ? this.chunks[0]\n : Buffer.concat(this.chunks, this.bytes);\n this.chunks = [];\n this.bytes = 0;\n this.emit(chunk);\n }\n\n discard(): void {\n this.chunks = [];\n this.bytes = 0;\n }\n}\n\n/**\n * Owns every in-flight client stream on one bridge socket. One TunnelManager\n * per Bridge; streams die with the bridge (the bridge calls `closeAll`).\n */\nexport class TunnelManager {\n private tunnels = new Map<string, ActiveTunnel>();\n\n constructor(private send: StreamSend) {}\n\n /** Whether a stream_* frame belongs to this manager. */\n handles(type: unknown): boolean {\n return (\n type === \"stream_open\" ||\n type === \"stream_data\" ||\n type === \"stream_end\" ||\n type === \"stream_abort\"\n );\n }\n\n /** Dispatch one decoded stream_* frame. */\n handleFrame(msg: Record<string, unknown>): void {\n const id = typeof msg.id === \"string\" ? msg.id : null;\n if (!id) return;\n switch (msg.type) {\n case \"stream_open\":\n this.open(msg as unknown as StreamOpenFrame);\n return;\n case \"stream_data\": {\n const tunnel = this.tunnels.get(id);\n if (!tunnel) return;\n if (typeof msg.data !== \"string\") return;\n try {\n tunnel.socket.write(Buffer.from(msg.data, \"base64\"));\n } catch {\n this.fail(id, \"write to upstream failed\");\n }\n return;\n }\n case \"stream_end\": {\n // The Worker finished writing; half-close our side so the upstream\n // sees EOF but we keep reading its response.\n const tunnel = this.tunnels.get(id);\n if (tunnel) {\n try {\n tunnel.socket.end();\n } catch {\n // already ending\n }\n }\n return;\n }\n case \"stream_abort\": {\n this.teardown(id);\n return;\n }\n }\n }\n\n private open(frame: StreamOpenFrame): void {\n const id = frame.id;\n if (frame.tool !== \"tcp_tunnel\") {\n this.send({ type: \"stream_error\", id, error: `Unsupported stream tool: ${frame.tool}` });\n return;\n }\n const host = typeof frame.meta?.host === \"string\" ? frame.meta.host : \"\";\n const port = typeof frame.meta?.port === \"number\" ? frame.meta.port : 0;\n // Hardcoded allowlist — refuse anything but the ChatGPT backend, loudly.\n if (host !== ALLOWED_HOST || port !== ALLOWED_PORT) {\n this.send({\n type: \"stream_error\",\n id,\n error: `Tunnel refused: only ${ALLOWED_HOST}:${ALLOWED_PORT} is allowed (requested ${host}:${port}).`,\n });\n return;\n }\n\n let opened = false;\n const socket = net.connect({ host, port });\n socket.setNoDelay(true);\n // The provider now holds connections across requests (keep-alive pool)\n // and long reasoning turns can be silent for minutes; TCP keepalives stop\n // NATs/middleboxes from tearing down the idle-looking connection, which\n // used to surface as a mid-response \"chunked ended\" death.\n socket.setKeepAlive(true, 15_000);\n const outbound = new TunnelFrameCoalescer((chunk) => {\n this.send({ type: \"stream_data\", id, data: chunk.toString(\"base64\") });\n });\n this.tunnels.set(id, { socket, outbound });\n\n socket.on(\"connect\", () => {\n opened = true;\n this.send({ type: \"stream_opened\", id });\n });\n\n socket.on(\"data\", (data: Buffer) => {\n outbound.push(data);\n });\n\n socket.on(\"end\", () => {\n // Upstream closed cleanly; tell the Worker the byte stream ended.\n outbound.flush();\n this.send({ type: \"stream_end\", id });\n this.tunnels.delete(id);\n });\n\n socket.on(\"error\", (error: Error) => {\n if (!opened) {\n this.send({ type: \"stream_error\", id, error: `Tunnel connect failed: ${error.message}` });\n } else {\n outbound.flush();\n this.send({ type: \"stream_abort\", id, error: error.message });\n }\n this.tunnels.delete(id);\n });\n\n socket.on(\"close\", () => {\n if (this.tunnels.has(id)) {\n outbound.flush();\n this.send({ type: \"stream_end\", id });\n this.tunnels.delete(id);\n }\n });\n }\n\n private fail(id: string, error: string): void {\n this.send({ type: \"stream_abort\", id, error });\n this.teardown(id);\n }\n\n private teardown(id: string): void {\n const tunnel = this.tunnels.get(id);\n if (!tunnel) return;\n this.tunnels.delete(id);\n // The Worker has already abandoned this stream. Do not spend another\n // WebSocket frame delivering bytes it can no longer consume.\n tunnel.outbound.discard();\n try {\n tunnel.socket.destroy();\n } catch {\n // already destroyed\n }\n }\n\n /** Destroy every open tunnel (bridge teardown). */\n closeAll(): void {\n for (const id of Array.from(this.tunnels.keys())) {\n this.teardown(id);\n }\n }\n}\n","/**\n * Exactly-once ledger for completed durable forwarded calls.\n *\n * A durable forwarded call runs on the host and then delivers its result over\n * HTTP. If the client crashes AFTER running a side-effecting operation (a\n * write, a bash mutation) but BEFORE the result is delivered, the server\n * re-dispatches the still-pending call on reconnect. Without a memory of what\n * we already ran, we would execute the side effect twice.\n *\n * This ledger persists each completed `tool_call_id` → result to disk so the\n * next process (or this one after a reconnect) returns the CACHED result\n * instead of re-running. It is a CACHE, not a source of truth: the server's\n * `pending_client_calls` table remains authoritative. Per the prime directive,\n * client-local state is only ever a cache — this one's sole job is crash\n * exactly-once, so it is bounded and best-effort.\n *\n * Keyed by thread so a machine running many threads keeps them separate;\n * bounded to the most recent entries so it can't grow without limit.\n */\nimport fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\n\ninterface LedgerEntry {\n ok: boolean;\n result?: string;\n error?: string;\n at: number;\n}\n\n/** Max entries kept per thread; oldest evicted past this. */\nconst MAX_ENTRIES = 200;\n/** Drop results larger than this from the on-disk cache (kept in memory only). */\nconst MAX_RESULT_BYTES = 256 * 1024;\n\nfunction ledgerDir(): string {\n return path.join(os.homedir(), \".standardagents\", \"tool-ledger\");\n}\n\nexport class ToolLedger {\n private entries = new Map<string, LedgerEntry>();\n private file: string;\n private loaded = false;\n\n constructor(private threadId: string) {\n // A thread id can contain characters unsafe for a filename; encode it.\n const safe = encodeURIComponent(threadId);\n this.file = path.join(ledgerDir(), `${safe}.json`);\n }\n\n private load(): void {\n if (this.loaded) return;\n this.loaded = true;\n try {\n const raw = fs.readFileSync(this.file, \"utf8\");\n const parsed = JSON.parse(raw) as Record<string, LedgerEntry>;\n for (const [id, entry] of Object.entries(parsed)) {\n if (entry && typeof entry.ok === \"boolean\") this.entries.set(id, entry);\n }\n } catch {\n // No ledger yet, or unreadable — start empty.\n }\n }\n\n /** The cached result for a completed call, or null if we have not run it. */\n get(toolCallId: string): LedgerEntry | null {\n this.load();\n return this.entries.get(toolCallId) ?? null;\n }\n\n /** Record a completed call's result, then persist (best effort). */\n record(toolCallId: string, result: { ok: boolean; result?: string; error?: string }): void {\n this.load();\n this.entries.set(toolCallId, { ...result, at: Date.now() });\n this.evict();\n this.persist();\n }\n\n private evict(): void {\n if (this.entries.size <= MAX_ENTRIES) return;\n // Map preserves insertion order; drop the oldest overflow.\n const overflow = this.entries.size - MAX_ENTRIES;\n let dropped = 0;\n for (const key of this.entries.keys()) {\n if (dropped >= overflow) break;\n this.entries.delete(key);\n dropped++;\n }\n }\n\n private persist(): void {\n try {\n fs.mkdirSync(ledgerDir(), { recursive: true });\n const out: Record<string, LedgerEntry> = {};\n for (const [id, entry] of this.entries) {\n // Skip huge bodies on disk — the crash-recovery guarantee only needs\n // ok/error framing plus modest outputs; a giant read can re-run safely.\n const size = entry.result ? Buffer.byteLength(entry.result) : 0;\n out[id] = size > MAX_RESULT_BYTES ? { ...entry, result: undefined } : entry;\n }\n fs.writeFileSync(this.file, JSON.stringify(out), { mode: 0o600 });\n } catch {\n // Best effort — the in-memory dedupe still covers same-process redelivery.\n }\n }\n}\n","/**\n * Transcript renderers for tool activity: git-style truncated diffs for\n * edits/writes and light syntax highlighting for bash commands.\n *\n * These produce PERMANENT transcript lines (printed above the run area), so\n * they may wrap in the scrollback without breaking any redraw math — but each\n * line is still clamped to the terminal width so a big hunk doesn't flood the\n * screen. Colors follow git/Claude/Codex conventions: dark green background\n * for added lines, dark red for removed.\n */\n\nconst RESET = \"\\x1b[0m\";\nconst DIM = \"\\x1b[2m\";\nconst ADD_BG = \"\\x1b[48;5;22m\\x1b[38;5;254m\"; // dark green bg, pale text\nconst DEL_BG = \"\\x1b[48;5;52m\\x1b[38;5;254m\"; // dark red bg, pale text\n\n// Shared budget: a diff shows at most this many content rows per side before\n// truncating to a \"… +n more\" line — enough to see the shape of a change\n// without drowning the transcript.\nconst MAX_SIDE_LINES = 4;\n\nfunction terminalGlyphWidth(ch: string): number {\n const cp = ch.codePointAt(0)!;\n return (\n (cp >= 0x1100 && cp <= 0x115f) ||\n (cp >= 0x2e80 && cp <= 0xa4cf) ||\n (cp >= 0xac00 && cp <= 0xd7a3) ||\n (cp >= 0xf900 && cp <= 0xfaff) ||\n (cp >= 0xfe30 && cp <= 0xfe4f) ||\n (cp >= 0xff00 && cp <= 0xff60) ||\n (cp >= 0xffe0 && cp <= 0xffe6) ||\n (cp >= 0x1f300 && cp <= 0x1faff) ||\n cp >= 0x20000\n ) ? 2 : 1;\n}\n\n/**\n * Clamp plain text to a terminal-column budget while preserving both ends.\n * Useful for paths, where the volume/home prefix and final project directory\n * are both more recognizable than an arbitrary suffix-only truncation.\n */\nexport function truncateMiddle(text: string, maxColumns: number): string {\n const limit = Math.max(0, Math.floor(maxColumns));\n if (limit === 0) return \"\";\n\n const chars = [...text];\n const totalWidth = chars.reduce((width, ch) => width + terminalGlyphWidth(ch), 0);\n if (totalWidth <= limit) return text;\n if (limit === 1) return \"…\";\n\n const available = limit - 1; // reserve one column for the ellipsis\n const headBudget = Math.ceil(available / 2);\n const tailBudget = Math.floor(available / 2);\n const head: string[] = [];\n const tail: string[] = [];\n let headWidth = 0;\n let tailWidth = 0;\n\n for (let i = 0; i < chars.length; i++) {\n const width = terminalGlyphWidth(chars[i]);\n if (headWidth + width > headBudget) break;\n head.push(chars[i]);\n headWidth += width;\n }\n for (let i = chars.length - 1; i >= head.length; i--) {\n const width = terminalGlyphWidth(chars[i]);\n if (tailWidth + width > tailBudget) break;\n tail.unshift(chars[i]);\n tailWidth += width;\n }\n\n // Paths read more cleanly when the cut lands between directory components\n // instead of splicing two halves of a folder name around the ellipsis.\n const isSeparator = (ch: string) => ch === \"/\" || ch === \"\\\\\";\n let headEnd = head.length;\n let tailStart = chars.length - tail.length;\n for (let i = headEnd - 1; i >= 0; i--) {\n if (isSeparator(chars[i])) {\n headEnd = i + 1;\n break;\n }\n }\n for (let i = tailStart; i < chars.length; i++) {\n if (isSeparator(chars[i])) {\n tailStart = i;\n break;\n }\n }\n if (headEnd < tailStart && headEnd > 0 && tailStart < chars.length) {\n return `${chars.slice(0, headEnd).join(\"\")}…${chars.slice(tailStart).join(\"\")}`;\n }\n\n return `${head.join(\"\")}…${tail.join(\"\")}`;\n}\n\nfunction clamp(s: string, max: number): string {\n return s.length > max ? s.slice(0, Math.max(0, max - 1)) + \"…\" : s;\n}\n\nfunction cols(): number {\n return Math.max(20, process.stdout.columns || 80);\n}\n\n/** Expand tabs (a tab under a colored bg renders unpredictably wide). */\nfunction flat(line: string): string {\n return line.replace(/\\t/g, \" \");\n}\n\n/**\n * A truncated git-style hunk for an exact-string edit: the lines removed\n * (red background, `-`) then the lines added (green background, `+`).\n * Common leading/trailing lines between old and new are trimmed away so the\n * hunk shows just the changed core. Returns [] when nothing visibly changed.\n */\nexport function diffLines(oldStr: string, newStr: string): string[] {\n let oldLines = oldStr.split(\"\\n\");\n let newLines = newStr.split(\"\\n\");\n // Trim shared prefix/suffix lines so only the real change shows.\n while (oldLines.length && newLines.length && oldLines[0] === newLines[0]) {\n oldLines.shift();\n newLines.shift();\n }\n while (\n oldLines.length &&\n newLines.length &&\n oldLines[oldLines.length - 1] === newLines[newLines.length - 1]\n ) {\n oldLines.pop();\n newLines.pop();\n }\n const width = cols() - 2;\n const out: string[] = [];\n const side = (lines: string[], bg: string, sign: string) => {\n const shown = lines.slice(0, MAX_SIDE_LINES);\n for (const l of shown) out.push(`${bg}${sign} ${clamp(flat(l), width)}${RESET}`);\n const hidden = lines.length - shown.length;\n if (hidden > 0) out.push(`${DIM} … +${hidden} more line${hidden === 1 ? \"\" : \"s\"}${RESET}`);\n };\n side(oldLines, DEL_BG, \"-\");\n side(newLines, ADD_BG, \"+\");\n return out;\n}\n\n/** A truncated all-added hunk for a newly written file. */\nexport function newFileLines(content: string): string[] {\n const lines = content.split(\"\\n\");\n const width = cols() - 2;\n const shown = lines.slice(0, MAX_SIDE_LINES);\n const out = shown.map((l) => `${ADD_BG}+ ${clamp(flat(l), width)}${RESET}`);\n const hidden = lines.length - shown.length;\n if (hidden > 0) out.push(`${DIM} … +${hidden} more line${hidden === 1 ? \"\" : \"s\"}${RESET}`);\n return out;\n}\n\n/**\n * Muted shell rendering for a command shown in the transcript: program words\n * (start / after a control operator) at normal intensity, EVERYTHING else —\n * arguments, strings, flags, operators, comments — dim. The transcript should\n * read as a quiet activity log, not a syntax rainbow; the program names are\n * enough to scan what ran. Quote-aware single-pass tokenizer; falls back to\n * dim text on anything it doesn't understand.\n */\nexport function highlightBash(cmd: string): string {\n let out = \"\";\n let i = 0;\n let expectProgram = true; // next bare word is a program name (start / after an operator)\n while (i < cmd.length) {\n const ch = cmd[i];\n if (ch === \"'\" || ch === '\"') {\n // Whole quoted string (including quotes), dim; honor backslash escapes in \"\".\n let j = i + 1;\n while (j < cmd.length && cmd[j] !== ch) {\n if (ch === '\"' && cmd[j] === \"\\\\\") j++;\n j++;\n }\n out += `${DIM}${cmd.slice(i, Math.min(j + 1, cmd.length))}${RESET}`;\n i = j + 1;\n continue;\n }\n if (ch === \"#\") {\n out += `${DIM}${cmd.slice(i)}${RESET}`;\n break;\n }\n const op = cmd.slice(i).match(/^(\\|\\||&&|\\||;|>>|>|<)/);\n if (op) {\n out += `${DIM}${op[1]}${RESET}`;\n i += op[1].length;\n expectProgram = true;\n continue;\n }\n const word = cmd.slice(i).match(/^[^\\s'\"#|;&<>]+/);\n if (word) {\n const w = word[0];\n if (expectProgram && !w.startsWith(\"-\")) {\n out += w; // program name at normal intensity — the only non-dim ink\n expectProgram = false;\n } else {\n out += `${DIM}${w}${RESET}`;\n }\n i += w.length;\n continue;\n }\n out += `${DIM}${ch}${RESET}`;\n i++;\n }\n return out;\n}\n\n/**\n * Collapse a (possibly multi-line, heredoc-y) command into one calm\n * transcript line: newlines become ⏎, runs of whitespace collapse, and the\n * result is clamped so it can't flood the transcript. Multi-line command\n * bodies belong in the child process, not the activity log.\n */\nexport function oneLineCommand(cmd: string, max: number): string {\n const collapsed = cmd.replace(/\\s*\\n+\\s*/g, \" ⏎ \").replace(/[ \\t]{2,}/g, \" \").trim();\n return clamp(collapsed, max);\n}\n\n// ── brand gradient ───────────────────────────────────────────────────────────\n\n/**\n * The Standard Code brand gradient (amber → coral → violet), applied per\n * character with 24-bit ANSI color. `phase` shifts the gradient's starting\n * point (0..1) so multi-line art can sweep diagonally. Terminals without\n * truecolor get a 256-color approximation — never plain text, the brand\n * moments should always land.\n */\nconst GRAD_STOPS: Array<[number, number, number]> = [\n [0xff, 0xb3, 0x5c], // amber\n [0xff, 0x5c, 0x87], // coral\n [0x8b, 0x6c, 0xff], // violet\n];\nconst GRAD_256 = [215, 210, 204, 176, 141]; // amber→pink→violet approximation\n\nfunction truecolor(): boolean {\n const ct = process.env.COLORTERM ?? \"\";\n if (/truecolor|24bit/i.test(ct)) return true;\n // Common truecolor terminals that don't always set COLORTERM.\n return /iterm|kitty|wezterm|ghostty|alacritty/i.test(process.env.TERM_PROGRAM ?? \"\");\n}\n\nfunction gradAt(t: number): [number, number, number] {\n const clamped = Math.max(0, Math.min(1, t));\n const seg = clamped * (GRAD_STOPS.length - 1);\n const i = Math.min(GRAD_STOPS.length - 2, Math.floor(seg));\n const k = seg - i;\n const [a, b] = [GRAD_STOPS[i], GRAD_STOPS[i + 1]];\n return [\n Math.round(a[0] + (b[0] - a[0]) * k),\n Math.round(a[1] + (b[1] - a[1]) * k),\n Math.round(a[2] + (b[2] - a[2]) * k),\n ];\n}\n\n/** Ping-pong a time/position value through [0,1] so a looping animation sweeps\n * amber→coral→violet→coral→amber with no seam at the wrap point. */\nfunction cyclePos(t: number): number {\n const p = t - Math.floor(t);\n return p < 0.5 ? p * 2 : 2 - p * 2;\n}\n\nfunction colorAtCycle(tri: number, tc: boolean): string {\n if (tc) {\n const [r, g, b] = gradAt(tri);\n return `\\x1b[38;2;${r};${g};${b}m`;\n }\n return `\\x1b[38;5;${GRAD_256[Math.min(GRAD_256.length - 1, Math.floor(tri * GRAD_256.length))]}m`;\n}\n\n/** ANSI fg escape that cycles through the brand gradient over time — for\n * animated glyphs like the working spinner. `ms` is a clock (Date.now()). */\nexport function brandCycleColor(ms: number, periodMs = 1200): string {\n return colorAtCycle(cyclePos(ms / periodMs), truecolor());\n}\n\n/**\n * Seamless looping brand gradient sample (amber → coral → violet → amber).\n * `t` is any real; only the fractional part matters. Used for rotating border\n * highlights so the sweep has no hard seam.\n */\nexport function brandLoopFg(t: number): string {\n const p = t - Math.floor(t);\n // 4 stops with wrap-back to amber so the loop is continuous.\n const stops: Array<[number, number, number]> = [\n GRAD_STOPS[0],\n GRAD_STOPS[1],\n GRAD_STOPS[2],\n GRAD_STOPS[0],\n ];\n const seg = p * (stops.length - 1);\n const i = Math.min(stops.length - 2, Math.floor(seg));\n const k = seg - i;\n const a = stops[i];\n const b = stops[i + 1];\n const r = Math.round(a[0] + (b[0] - a[0]) * k);\n const g = Math.round(a[1] + (b[1] - a[1]) * k);\n const bl = Math.round(a[2] + (b[2] - a[2]) * k);\n if (truecolor()) return `\\x1b[38;2;${r};${g};${bl}m`;\n // 256-color: pick the nearest stop by segment.\n const approx = [215, 210, 204, 141, 215];\n return `\\x1b[38;5;${approx[Math.min(approx.length - 1, Math.round(p * (approx.length - 1)))]}m`;\n}\n\n/** Apply the brand gradient across a single line of text. */\nexport function gradientText(text: string, phase = 0): string {\n const chars = [...text];\n const visible = chars.filter((ch) => ch.trim().length > 0).length;\n if (!visible) return text;\n const tc = truecolor();\n let seen = 0;\n let out = \"\";\n for (const ch of chars) {\n if (ch.trim().length === 0) { out += ch; continue; }\n const t = Math.min(1, phase + (seen / Math.max(1, visible - 1)) * (1 - phase * 0.4));\n seen++;\n if (tc) {\n const [r, g, b] = gradAt(t);\n out += `\\x1b[38;2;${r};${g};${b}m${ch}`;\n } else {\n out += `\\x1b[38;5;${GRAD_256[Math.min(GRAD_256.length - 1, Math.floor(t * GRAD_256.length))]}m${ch}`;\n }\n }\n return out + \"\\x1b[0m\";\n}\n\n/**\n * Muted brand-tinted chrome for HUD box borders — warm amber-ink that sits\n * with the amber→coral→violet palette without competing with content.\n * Matches the dim line colors on standardcode.ai.\n */\nexport function brandChromeColor(): string {\n if (truecolor()) return \"\\x1b[38;2;120;100;88m\"; // muted amber\n return \"\\x1b[38;5;180m\";\n}\n\n/** Solid brand stop (amber / coral / violet) for small chrome labels. */\nexport function brandStopColor(stop: \"amber\" | \"coral\" | \"violet\"): string {\n if (truecolor()) {\n const [r, g, b] =\n stop === \"amber\" ? GRAD_STOPS[0] : stop === \"coral\" ? GRAD_STOPS[1] : GRAD_STOPS[2];\n return `\\x1b[38;2;${r};${g};${b}m`;\n }\n return stop === \"amber\"\n ? \"\\x1b[38;5;215m\"\n : stop === \"coral\"\n ? \"\\x1b[38;5;204m\"\n : \"\\x1b[38;5;141m\";\n}\n","/**\n * The client-tool bridge — CLI HALF. The socket/protocol/ownership machinery\n * lives in the core (packages/core/src/bridge.ts); this file supplies the\n * machine-local pieces the core injects: the HostTools executor + permission\n * engine, the TCP tunnel manager, the on-disk exactly-once ledger, and the\n * terminal presentation of the activity feed. The constructor signature is\n * unchanged, so execution-session wiring reads the same as ever.\n */\nimport type { ApiClient } from \"./api.ts\";\nimport type { HostTools } from \"./host-tools.ts\";\nimport { decide, isCatastrophic, type PermissionState } from \"./permissions.ts\";\nimport { saveApprovals } from \"./approvals.ts\";\nimport { TunnelManager } from \"./tunnel.ts\";\nimport { ToolLedger } from \"./tool-ledger.ts\";\nimport type { BridgeClientIdentity, ToolRequest } from \"./types.ts\";\nimport { messageText, parseToolCalls, WAITING_FOR_CLIENT_MARKER } from \"./session-state.ts\";\nimport { isTranscriptMetaTool } from \"@standardagents/code-network/tool-activity\";\nimport { diffLines, newFileLines, highlightBash, oneLineCommand } from \"./render.ts\";\nimport {\n Bridge as CoreBridge,\n permissionKey,\n type BridgeHooks,\n type BridgePresenter,\n type ConnectionState,\n} from \"@standardagents/code-network/bridge\";\n\nexport type { ApprovalChoice, ApprovalResult } from \"./types.ts\";\nexport type { BridgeHooks, ConnectionState };\nexport { permissionKey };\n\nexport class Bridge extends CoreBridge {\n constructor(\n api: ApiClient,\n threadId: string,\n host: HostTools,\n perm: PermissionState,\n hooks: BridgeHooks,\n /** Identity for execution-owner election. Omitted = legacy anonymous bridge. */\n identity?: BridgeClientIdentity\n ) {\n // The tunnel manager sends frames through the live bridge socket; `send`\n // is safe to reference before super() returns because tunnels only carry\n // frames after the socket opens.\n let sendFrame: (payload: object) => void = () => {};\n const tunnels = new TunnelManager((payload) => sendFrame(payload));\n super(\n api,\n threadId,\n {\n execute: (tool, args) => host.execute(tool, args),\n isOutsideProject: (p) => host.isOutsideProject(p),\n isCatastrophic: (command) => isCatastrophic(command),\n decide: (permKey, risk, requestPermission) => decide(perm, permKey, risk, requestPermission),\n grantAlways: (permKey) => void perm.alwaysAllow.add(permKey),\n grantRisk: (risk) => {\n perm.level = Math.max(perm.level, risk) as PermissionState[\"level\"];\n perm.allowRisk.clear();\n },\n persistApprovals: () => void saveApprovals(api, threadId, perm),\n },\n {\n describe,\n presentSuccess: (req, summary, result) => {\n const { display, detail } = activityPresentation(req, summary);\n return { display: `${display}${detailSuffix(req.tool, result)}`, detail };\n },\n },\n tunnels,\n new ToolLedger(threadId),\n hooks,\n identity\n );\n sendFrame = (payload) => this.send(payload);\n }\n}\n\nconst DIM = \"\\x1b[2m\";\nconst RESET = \"\\x1b[0m\";\n\n/**\n * Activity-feed presentation for a finished tool call: the ✓-line text plus\n * optional indented sub-lines. Bash gets its command syntax-highlighted;\n * edits/writes get a truncated git-style hunk beneath the summary so the\n * change is visible at a glance; background_process reads as its action with\n * the command/description as a dim sub-line — never raw JSON args.\n */\nexport function activityPresentation(\n req: ToolRequest,\n summary: string\n): { display: string; detail?: string[] } {\n const a = req.args;\n const cols = Math.max(40, process.stdout.columns || 80);\n if (req.tool === \"bash\") {\n return { display: `bash: ${highlightBash(oneLineCommand(String(a.command ?? \"\"), cols - 20))}` };\n }\n if (req.tool === \"edit_file\") {\n return { display: summary, detail: diffLines(String(a.old_string ?? \"\"), String(a.new_string ?? \"\")) };\n }\n if (req.tool === \"write_file\") {\n return { display: summary, detail: newFileLines(String(a.content ?? \"\")) };\n }\n if (req.tool === \"background_process\" || req.tool === \"run_in_background\") {\n const action = String(a.action || \"list\");\n const id = a.id ? ` ${String(a.id)}` : \"\";\n const display = action === \"start\" ? \"bg start\" : `bg ${action}${id}`;\n const detail: string[] = [];\n if (action === \"start\" && a.command) {\n detail.push(` ${DIM}${oneLineCommand(String(a.command), cols - 8)}${RESET}`);\n }\n if (typeof a.description === \"string\" && a.description.trim()) {\n detail.push(` ${DIM}${oneLineCommand(a.description, cols - 8)}${RESET}`);\n }\n return { display, detail: detail.length ? detail : undefined };\n }\n return { display: summary };\n}\n\n/** One-line human summary of a tool request for the activity feed. */\nexport function describe(req: ToolRequest): string {\n const a = req.args;\n switch (req.tool) {\n case \"mcp\": {\n const server = String(a.server || \"?\");\n const action = String(a.action || \"call\");\n if (action === \"list_tools\") return `mcp ${server}: list tools`;\n if (action === \"read_resource\") return `mcp ${server}: read ${a.uri}`;\n return `mcp ${server}: ${a.tool}`;\n }\n case \"read_file\":\n return `read ${a.path}`;\n case \"grep\":\n return `grep \"${a.pattern}\"${a.glob ? ` in ${a.glob}` : \"\"}`;\n case \"glob\":\n return `find ${a.pattern}`;\n case \"write_file\":\n return `write ${a.path}`;\n case \"edit_file\":\n return `edit ${a.path}`;\n case \"save_to_disk\":\n return `save ${a.source_path} → ${a.dest_path}`;\n case \"run_skill_script\":\n return `skill ${a.skill}: run ${a.entry}`;\n case \"bash\":\n return `bash: ${oneLineCommand(String(a.command ?? \"\"), 80)}`;\n case \"background_process\":\n // The hosted agent names the same manager `run_in_background` (the web\n // console's presenter carries the same alias).\n case \"run_in_background\": {\n // The approval prompt sees only this summary, so `start` must carry the\n // command; the activity feed re-presents it as an indented sub-line.\n const action = String(a.action || \"list\");\n if (action === \"start\") return `bg start: ${oneLineCommand(String(a.command ?? \"\"), 80)}`;\n if (action === \"list\") return \"bg list\";\n return `bg ${action}${a.id ? ` ${String(a.id)}` : \"\"}`;\n }\n // Server-side tools reach the watcher feed through the projection (the\n // daemon never forwards them). Mirror the web console's labels so every\n // face reads the same.\n case \"web_search\":\n case \"exa_research\":\n case \"search_x\":\n return `${req.tool.replace(/_/g, \" \")}${a.query ? `: ${oneLineCommand(String(a.query), 80)}` : \"\"}`;\n case \"subagent_create\":\n case \"create_subagent\":\n case \"dispatch_subagent\":\n return `delegated to ${prettyAgentName(a.agent ?? a.agent_name ?? a.name)}`;\n case \"terminate_subagent\":\n case \"dismiss_subagent\":\n return `dismissed ${a.agent ? prettyAgentName(a.agent) : \"subagent\"}`;\n default:\n return `${req.tool} ${JSON.stringify(a).slice(0, 80)}`;\n }\n}\n\n/** Known subagent ids → display names (kept in lockstep with the web console). */\nconst AGENT_NAMES: Record<string, string> = {\n research_agent: \"Research Assistant\",\n code_explorer: \"Code Explorer\",\n asset_agent: \"Asset Agent\",\n compaction: \"Compaction Agent\",\n};\n\nfunction prettyAgentName(id: unknown): string {\n const key = String(id ?? \"\").trim();\n if (!key) return \"subagent\";\n return AGENT_NAMES[key] || key.replace(/[_-]+/g, \" \").replace(/\\b\\w/g, (ch) => ch.toUpperCase());\n}\n\n// ── watcher activity feed ────────────────────────────────────────────────────\n\n/** One printable feed entry: the full ✓/✗ line (uncolored) + pre-styled rows. */\nexport interface ToolActivityEntry {\n line: string;\n detail?: string[];\n}\n\n/** The message-record fields the feed reads from a session_state projection. */\nexport interface ProjectionMessage {\n id?: string;\n role: string;\n content?: unknown;\n status?: string | null;\n tool_calls?: unknown;\n tool_call_id?: string | null;\n toolCallId?: string | null;\n metadata?: Record<string, unknown> | null;\n error?: unknown;\n}\n\n/** The runtime parks an approval-gated call by writing this placeholder as the\n * tool result (\"⏳ Awaiting your approval to run <tool>…\" — see the builder's\n * ThreadStateImpl), then REPLACES the same row once the call really finishes.\n * A row carrying it is a suspended call, never a settled one. */\nconst APPROVAL_PENDING_MARKER = \"Awaiting your approval\";\n\n/**\n * The watcher's tool-activity feed, reconstructed from the session_state\n * projection. The daemon prints its feed live as it executes; a watching face\n * has only the projection's message records — an assistant record carries the\n * tool calls, and the matching tool-result record settles each one. Feed each\n * projection read through `index()` first, then `settle()` per tool-result\n * record in message order: a turn's tool lines land before that turn's answer\n * prose because the result records sort ahead of it. Each call settles once\n * for the life of the session — re-reading the same projection emits nothing.\n */\nexport class ToolActivityFeed {\n private calls = new Map<string, ToolRequest>();\n private settled = new Set<string>();\n\n /** Record the tool calls a projection message carries (any role, any order). */\n index(message: ProjectionMessage): void {\n for (const call of parseToolCalls(message)) {\n if (!this.calls.has(call.id)) {\n this.calls.set(call.id, {\n type: \"tool_request\",\n tool: call.name,\n args: call.arguments,\n requestPermission: null,\n risk: null,\n });\n }\n }\n }\n\n /**\n * The printable entry for a settled tool-result record, exactly once — or\n * null when there is nothing to print (not a tool row, already printed, a\n * meta tool, an unknown call, or a parked placeholder still awaiting the\n * real result).\n */\n settle(message: ProjectionMessage): ToolActivityEntry | null {\n if (message.role !== \"tool\") return null;\n const rawId = message.tool_call_id ?? message.toolCallId ?? message.metadata?.tool_call_id;\n const callId = typeof rawId === \"string\" ? rawId : \"\";\n if (!callId || this.settled.has(callId)) return null;\n const req = this.calls.get(callId);\n // The carrier record may land in a later projection read; leave the result\n // unsettled so that read presents it.\n if (!req) return null;\n const text = messageText(message.content);\n // A durably parked forwarded call writes a placeholder while the runner\n // machine is summoned (or while a human approval is pending); the SAME\n // record later carries the real result. Printing at placeholder time would\n // claim success for a call that never ran.\n if (text.includes(WAITING_FOR_CLIENT_MARKER) || text.includes(APPROVAL_PENDING_MARKER)) return null;\n this.settled.add(callId);\n if (isTranscriptMetaTool(req.tool)) return null;\n const summary = describe(req);\n if (toolResultFailed(message, text)) {\n return { line: `✗ ${summary} — ${text.trim() || \"failed\"}` };\n }\n const { display, detail } = activityPresentation(req, summary);\n return { line: `✓ ${display}${detailSuffix(req.tool, text)}`, detail };\n }\n}\n\n/** Did this tool-result record report a failure? (Mirrors the web console.) */\nfunction toolResultFailed(message: ProjectionMessage, text: string): boolean {\n if (message.status === \"failed\" || message.metadata?.ok === false) return true;\n if ((message.metadata?.tool_status ?? (message as unknown as Record<string, unknown>).tool_status) === \"error\") return true;\n if (message.error) return true;\n return /^(error|failed|✗)\\b/i.test(text.trim());\n}\n\n/** A short parenthetical hint appended to a finished read-style tool line. */\nfunction detailSuffix(tool: string, result?: string): string {\n if (!result) return \"\";\n // Mutations already read clearly from their summary; don't pile on.\n if (tool === \"write_file\" || tool === \"edit_file\") return \"\";\n if (tool === \"bash\") {\n const m = result.match(/\\[exit code (\\d+)\\]\\s*$/);\n return m ? ` (exit ${m[1]})` : \"\";\n }\n const lines = result.split(\"\\n\").length;\n return ` (${lines} line${lines === 1 ? \"\" : \"s\"})`;\n}\n","/**\n * Parser-neutral completion for Markdown that is still streaming.\n *\n * This is the CLI-authored source shared with Standard Code's Node face-core,\n * web console, and native JavaScriptCore runtime. It is deliberately\n * dependency-free. The\n * returned projection is append-only: `markdown` always begins with the exact\n * source bytes and adds only the smallest closing suffix needed by a Markdown\n * renderer. Never persist or copy the projection; it exists only for painting\n * the current frame.\n */\n\nexport const PROGRESSIVE_MARKDOWN_RUNTIME_VERSION = 4;\n\nexport type ProgressiveMarkdownStyle = 'emphasis' | 'strong' | 'strike' | 'code' | 'link';\n\n/**\n * A paint-ready inline run. `id` is derived from the source offset where the\n * visible text starts, so appending bytes to the stream extends the same run\n * instead of replacing it.\n */\nexport interface ProgressiveMarkdownRun {\n id: string;\n text: string;\n styles: ProgressiveMarkdownStyle[];\n href?: string;\n}\n\nexport interface ProgressiveMarkdownCell {\n id: string;\n runs: ProgressiveMarkdownRun[];\n}\n\n/**\n * A deliberately small, cross-surface Markdown block model. Every face\n * render these nodes directly. Block identity is based on its immutable source\n * start, never its current type or length.\n */\nexport interface ProgressiveMarkdownBlock {\n id: string;\n kind: 'paragraph' | 'heading' | 'code' | 'quote' | 'list' | 'table' | 'rule';\n start: number;\n end: number;\n complete: boolean;\n runs?: ProgressiveMarkdownRun[];\n text?: string;\n language?: string;\n level?: number;\n ordered?: boolean;\n items?: ProgressiveMarkdownCell[];\n header?: ProgressiveMarkdownCell[];\n rows?: ProgressiveMarkdownCell[][];\n align?: Array<'left' | 'center' | 'right' | ''>;\n}\n\nexport interface ProgressiveMarkdownDocument {\n version: 3;\n sourceLength: number;\n blocks: ProgressiveMarkdownBlock[];\n}\n\n/**\n * Versioned parser output transported to native faces. `source` is the exact\n * input used to build `document`, so copying and diagnostics never have to\n * reconstruct Markdown from the paint model.\n */\nexport interface ProgressiveMarkdownPayload {\n runtime: typeof PROGRESSIVE_MARKDOWN_RUNTIME_VERSION;\n source: string;\n document: ProgressiveMarkdownDocument;\n}\n\nexport interface ProgressiveMarkdownProjection {\n /** Original source plus synthetic closing syntax. */\n markdown: string;\n /** The disposable suffix appended to `source`. */\n suffix: string;\n /** Coarse state, useful to renderers and diagnostics. */\n open: 'none' | 'fence' | 'inline-code' | 'link' | 'emphasis';\n}\n\ninterface Fence {\n marker: '`' | '~';\n length: number;\n}\n\nconst punctuation = /[!\"#$%&'()*+,\\-./:;<=>?@[\\\\\\]^_`{|}~]/;\nconst isWhitespace = (value: string | undefined): boolean => value === undefined || /\\s/.test(value);\nconst isPunctuation = (value: string | undefined): boolean => value !== undefined && punctuation.test(value);\n\nfunction runLength(source: string, start: number, marker: string): number {\n let end = start;\n while (source[end] === marker) end++;\n return end - start;\n}\n\nfunction isEscaped(source: string, at: number): boolean {\n let slashes = 0;\n for (let i = at - 1; i >= 0 && source[i] === '\\\\'; i--) slashes++;\n return slashes % 2 === 1;\n}\n\n/** A CommonMark-style fenced-code marker at this logical line, if present. */\nfunction lineFence(source: string, lineStart: number): { at: number; fence: Fence } | null {\n let at = lineStart;\n let spaces = 0;\n while (source[at] === ' ' && spaces < 4) { at++; spaces++; }\n if (spaces > 3) return null;\n const marker = source[at];\n if (marker !== '`' && marker !== '~') return null;\n const length = runLength(source, at, marker);\n if (length < 3) return null;\n return { at, fence: { marker, length } };\n}\n\nfunction delimiterFlanking(source: string, at: number, length: number, marker: '*' | '_' | '~'): {\n canOpen: boolean;\n canClose: boolean;\n} {\n const previous = at > 0 && source[at - 1] !== '\\n' ? source[at - 1] : undefined;\n const next = at + length < source.length && source[at + length] !== '\\n'\n ? source[at + length]\n : undefined;\n const previousWhitespace = isWhitespace(previous);\n const nextWhitespace = isWhitespace(next);\n const previousPunctuation = isPunctuation(previous);\n const nextPunctuation = isPunctuation(next);\n const leftFlanking = !nextWhitespace && (!nextPunctuation || previousWhitespace || previousPunctuation);\n const rightFlanking = !previousWhitespace && (!previousPunctuation || nextWhitespace || nextPunctuation);\n if (marker === '_') {\n return {\n canOpen: leftFlanking && (!rightFlanking || previousPunctuation),\n canClose: rightFlanking && (!leftFlanking || nextPunctuation),\n };\n }\n return { canOpen: leftFlanking, canClose: rightFlanking };\n}\n\ninterface InlineStyleFrame {\n marker: '*' | '_' | '~';\n length: number;\n style: ProgressiveMarkdownStyle;\n}\n\nfunction sameStyles(a: ProgressiveMarkdownStyle[], b: ProgressiveMarkdownStyle[]): boolean {\n return a.length === b.length && a.every((style, index) => style === b[index]);\n}\n\n/**\n * Parse inline Markdown into stable, flat runs. An unclosed delimiter is an\n * active style, not literal punctuation: `*hel` is one emphasis run containing\n * `hel`, and the eventual closing `*` only changes completeness, not identity.\n */\nexport function parseProgressiveInline(source: string, baseOffset = 0): ProgressiveMarkdownRun[] {\n const runs: Array<ProgressiveMarkdownRun & { _end: number }> = [];\n const stack: InlineStyleFrame[] = [];\n let inlineTicks = 0;\n let i = 0;\n\n const styles = (): ProgressiveMarkdownStyle[] => [\n ...stack.map((frame) => frame.style),\n ...(inlineTicks > 0 ? ['code' as const] : []),\n ];\n const append = (text: string, at: number, href?: string) => {\n if (!text) return;\n const active = styles();\n const last = runs.at(-1);\n if (last && last._end === at && last.href === href && sameStyles(last.styles, active)) {\n last.text += text;\n last._end = at + text.length;\n return;\n }\n runs.push({ id: `i:${baseOffset + at}`, text, styles: active, ...(href ? { href } : {}), _end: at + text.length });\n };\n\n while (i < source.length) {\n const character = source[i];\n\n if (character === '\\\\') {\n if (i + 1 < source.length && isPunctuation(source[i + 1])) {\n append(source[i + 1], i + 1);\n i += 2;\n continue;\n }\n // A terminal slash may become an escape on the next network fragment.\n // Hold it for one frame instead of painting a character that can vanish.\n if (i + 1 === source.length) { i++; continue; }\n }\n\n if (inlineTicks > 0) {\n if (character === '`') {\n const length = runLength(source, i, '`');\n if (length === inlineTicks) {\n inlineTicks = 0;\n i += length;\n continue;\n }\n // A partial closer is undecidable until the tick run ends. Do not let\n // it briefly enter the code span and disappear when the run completes.\n if (i + length === source.length) { i += length; continue; }\n append('`'.repeat(length), i);\n i += length;\n continue;\n }\n append(character, i);\n i++;\n continue;\n }\n\n if (character === '`') {\n const length = runLength(source, i, '`');\n // Do not paint a contentless one/two-tick network fragment. As soon as a\n // content byte arrives, the same source position becomes an inline-code\n // run; three or more ticks at line start are handled by the block parser.\n if (i + length < source.length) inlineTicks = length;\n i += length;\n continue;\n }\n\n // Once `](` makes link intent observable, the destination is never painted\n // as prose — even while its first characters are still arriving.\n if (character === '[') {\n const destinationAt = source.indexOf('](', i + 1);\n if (destinationAt >= 0) {\n const destinationEnd = source.indexOf(')', destinationAt + 2);\n const end = destinationEnd >= 0 ? destinationEnd : source.length;\n const href = source.slice(destinationAt + 2, end);\n const labelStart = i + 1;\n const labelRuns = parseProgressiveInline(source.slice(labelStart, destinationAt), baseOffset + labelStart);\n for (const run of labelRuns) {\n runs.push({\n ...run,\n styles: run.styles.includes('link') ? run.styles : [...run.styles, 'link'],\n ...(destinationEnd >= 0 && href ? { href } : {}),\n _end: run.id.startsWith('i:') ? Number(run.id.slice(2)) - baseOffset + run.text.length : end,\n });\n }\n i = destinationEnd >= 0 ? destinationEnd + 1 : source.length;\n continue;\n }\n }\n\n if (character === '*' || character === '_' || character === '~') {\n const run = runLength(source, i, character);\n const usable = character === '~' ? run - (run % 2) : run;\n if (usable > 0) {\n const { canOpen, canClose } = delimiterFlanking(source, i, run, character);\n const frames: InlineStyleFrame[] = [];\n if (character === '~') {\n for (let n = 0; n < usable; n += 2) frames.push({ marker: '~', length: 2, style: 'strike' });\n } else {\n let remaining = usable;\n while (remaining >= 2) {\n frames.push({ marker: character, length: 2, style: 'strong' });\n remaining -= 2;\n }\n if (remaining) frames.push({ marker: character, length: 1, style: 'emphasis' });\n }\n\n let consumed = 0;\n let closed = 0;\n if (canClose) {\n for (const frame of [...frames].reverse()) {\n const top = stack.at(-1);\n if (top && top.marker === frame.marker && top.length === frame.length) {\n stack.pop();\n consumed += frame.length;\n closed += frame.length;\n }\n }\n }\n if (canOpen) {\n for (const frame of frames) {\n if (consumed >= frame.length) consumed -= frame.length;\n else stack.push(frame);\n }\n }\n if (canOpen || closed > 0) {\n i += usable;\n if (run > usable) append(character.repeat(run - usable), i);\n i += run - usable;\n continue;\n }\n // A delimiter run at the exact stream tail is still ambiguous. Holding\n // it avoids literal marker flashes for openers and partial closers.\n if (i + run === source.length) { i += run; continue; }\n }\n if (usable === 0 && i + run === source.length) { i += run; continue; }\n }\n\n append(character, i);\n i++;\n }\n\n return runs.map(({ _end: _, ...run }) => run);\n}\n\ninterface SourceLine {\n text: string;\n start: number;\n end: number;\n next: number;\n terminated: boolean;\n}\n\nfunction sourceLines(source: string): SourceLine[] {\n if (!source) return [];\n const lines: SourceLine[] = [];\n let start = 0;\n while (start <= source.length) {\n const newline = source.indexOf('\\n', start);\n if (newline < 0) {\n lines.push({ text: source.slice(start).replace(/\\r$/, ''), start, end: source.length, next: source.length, terminated: false });\n break;\n }\n lines.push({ text: source.slice(start, newline).replace(/\\r$/, ''), start, end: newline, next: newline + 1, terminated: true });\n start = newline + 1;\n if (start === source.length) {\n lines.push({ text: '', start, end: start, next: start, terminated: false });\n break;\n }\n }\n return lines;\n}\n\nfunction blockFence(line: string): { marker: '`' | '~'; length: number; info: string } | null {\n const match = /^ {0,3}(`{3,}|~{3,})(.*)$/.exec(line);\n if (!match) return null;\n const marker = match[1][0] as '`' | '~';\n const info = match[2];\n if (marker === '`' && info.includes('`')) return null;\n return { marker, length: match[1].length, info: info.trim() };\n}\n\nconst tableSeparator = (line: string): boolean =>\n /^\\s*\\|?\\s*:?-{2,}:?\\s*(\\|\\s*:?-{2,}:?\\s*)*\\|?\\s*$/.test(line) && line.includes('-');\n\n/** A line that is a growing prefix of a table separator (`| :--- | -` …). */\nconst partialTableSeparator = (line: string): boolean =>\n /^\\s*\\|?\\s*:?-*:?\\s*(\\|\\s*:?-*:?\\s*)*\\|?\\s*$/.test(line) && /[-|:]/.test(line);\n\nfunction tableCells(line: string): Array<{ text: string; offset: number }> {\n let start = 0;\n let end = line.length;\n while (start < end && /\\s/.test(line[start])) start++;\n while (end > start && /\\s/.test(line[end - 1])) end--;\n if (line[start] === '|') start++;\n if (line[end - 1] === '|') end--;\n const cells: Array<{ text: string; offset: number }> = [];\n let cellStart = start;\n for (let i = start; i <= end; i++) {\n if (i === end || (line[i] === '|' && (i === 0 || line[i - 1] !== '\\\\'))) {\n const raw = line.slice(cellStart, i);\n const leading = raw.match(/^\\s*/)?.[0].length ?? 0;\n cells.push({ text: raw.trim().replace(/\\\\\\|/g, '|'), offset: cellStart + leading });\n cellStart = i + 1;\n }\n }\n return cells;\n}\n\nfunction cell(text: string, offset: number): ProgressiveMarkdownCell {\n return { id: `cell:${offset}`, runs: parseProgressiveInline(text, offset) };\n}\n\nfunction startsSpecialBlock(lines: SourceLine[], index: number): boolean {\n const line = lines[index]?.text ?? '';\n const next = lines[index + 1]?.text;\n return !!blockFence(line)\n || /^#{1,6}\\s+/.test(line)\n || /^\\s*>\\s?/.test(line)\n || /^\\s*[-*+]\\s+/.test(line)\n || /^\\s*\\d+[.)]\\s+/.test(line)\n || /^\\s*([-*_])(\\s*\\1){2,}\\s*$/.test(line)\n || /^ {0,3}\\|/.test(line)\n || (line.includes('|') && next !== undefined && tableSeparator(next));\n}\n\n/**\n * Parse the current stream buffer into a paint-ready document. The parser is\n * stateless by design: every frame is derived from the authoritative buffer,\n * while source-offset IDs give Vue/SwiftUI stable reconciliation keys.\n */\nexport function parseStreamingMarkdown(source: string): ProgressiveMarkdownDocument {\n const lines = sourceLines(source);\n const blocks: ProgressiveMarkdownBlock[] = [];\n let i = 0;\n\n while (i < lines.length) {\n const line = lines[i];\n if (!line.text.trim()) { i++; continue; }\n const id = `b:${line.start}`;\n\n const opening = blockFence(line.text);\n if (opening) {\n const codeStart = line.next;\n let j = i + 1;\n let closing: SourceLine | undefined;\n while (j < lines.length) {\n const candidate = blockFence(lines[j].text);\n if (candidate && candidate.marker === opening.marker && candidate.length >= opening.length && !candidate.info) {\n closing = lines[j];\n break;\n }\n j++;\n }\n let codeEnd = closing?.start ?? source.length;\n if (!closing) {\n // Hide an incomplete closing run (one or more matching markers, but\n // fewer than the opener). Otherwise `` appears inside the code for one\n // frame and vanishes when the third/fourth tick arrives.\n const tailStart = Math.max(codeStart, source.lastIndexOf('\\n') + 1);\n const tail = source.slice(tailStart);\n const pending = /^ {0,3}(`+|~+)[ \\t]*$/.exec(tail);\n if (pending && pending[1][0] === opening.marker\n && pending[1].length < opening.length) codeEnd = tailStart;\n }\n // Hold the terminal line break until content follows it. This keeps the\n // code node's visible text append-only when a closing fence arrives.\n if (codeEnd > codeStart && source[codeEnd - 1] === '\\n') codeEnd--;\n blocks.push({\n id, kind: 'code', start: line.start, end: closing?.next ?? source.length,\n complete: !!closing && closing.terminated, language: opening.info || 'code', text: source.slice(codeStart, codeEnd),\n });\n i = closing ? j + 1 : lines.length;\n continue;\n }\n\n const heading = /^(#{1,6})\\s+(.*)$/.exec(line.text);\n if (heading) {\n const contentAt = line.start + heading[1].length + 1;\n blocks.push({ id, kind: 'heading', start: line.start, end: line.end, complete: line.terminated,\n level: heading[1].length, runs: parseProgressiveInline(heading[2], contentAt) });\n i++;\n continue;\n }\n\n if (/^\\s*([-*_])(\\s*\\1){2,}\\s*$/.test(line.text)) {\n blocks.push({ id, kind: 'rule', start: line.start, end: line.end, complete: line.terminated });\n i++;\n continue;\n }\n\n const separatorNext = line.text.includes('|') && i + 1 < lines.length && tableSeparator(lines[i + 1].text);\n if (separatorNext) {\n const separator = tableCells(lines[i + 1].text);\n const align = separator.map(({ text }) => text.startsWith(':') && text.endsWith(':') ? 'center'\n : text.endsWith(':') ? 'right' : text.startsWith(':') ? 'left' : '') as ProgressiveMarkdownBlock['align'];\n const header = tableCells(line.text).map((entry) => cell(entry.text, line.start + entry.offset));\n const rows: ProgressiveMarkdownCell[][] = [];\n let j = i + 2;\n while (j < lines.length && lines[j].text.trim() && lines[j].text.includes('|')) {\n rows.push(tableCells(lines[j].text).map((entry) => cell(entry.text, lines[j].start + entry.offset)));\n j++;\n }\n blocks.push({ id, kind: 'table', start: line.start, end: lines[Math.max(i + 1, j - 1)].end,\n complete: j < lines.length && lines[j].terminated, header, rows, align });\n i = j;\n continue;\n }\n\n // A pipe-led line is a table head from its first byte. Waiting for the\n // separator painted the header as a paragraph for a frame or two and then\n // reformatted it into a table; instead the table appears immediately and\n // the stream fills it out. (Prose that genuinely starts with `|` and never\n // grows a separator is vanishingly rare in agent output.)\n if (/^ {0,3}\\|/.test(line.text)) {\n const streamingSeparator = i + 1 >= lines.length\n || (!lines[i + 1].terminated && (!lines[i + 1].text || partialTableSeparator(lines[i + 1].text)));\n if (streamingSeparator) {\n const header = tableCells(line.text).map((entry) => cell(entry.text, line.start + entry.offset));\n if (header.some((entry) => entry.runs.length)) {\n blocks.push({ id, kind: 'table', start: line.start, end: lines[Math.min(i + 1, lines.length - 1)].end,\n complete: false, header, rows: [] });\n } else {\n // Nothing visible yet (a lone `|`) — hold the frame.\n blocks.push({ id, kind: 'paragraph', start: line.start, end: line.end, complete: false, runs: [] });\n }\n i = lines.length;\n continue;\n }\n }\n\n const quote = /^\\s*>\\s?(.*)$/.exec(line.text);\n if (quote) {\n const parts: string[] = [];\n let j = i;\n let firstContentAt = line.start + line.text.indexOf(quote[1]);\n while (j < lines.length) {\n const match = /^\\s*>\\s?(.*)$/.exec(lines[j].text);\n if (!match) break;\n if (!parts.length) firstContentAt = lines[j].start + lines[j].text.indexOf(match[1]);\n parts.push(match[1]);\n j++;\n }\n blocks.push({ id, kind: 'quote', start: line.start, end: lines[j - 1].end,\n complete: j < lines.length && lines[j].terminated, runs: parseProgressiveInline(parts.join('\\n'), firstContentAt) });\n i = j;\n continue;\n }\n\n const list = /^(\\s*)([-*+]|\\d+[.)])\\s+(.*)$/.exec(line.text);\n if (list) {\n const ordered = /^\\d/.test(list[2]);\n const items: ProgressiveMarkdownCell[] = [];\n let j = i;\n while (j < lines.length) {\n const match = /^(\\s*)([-*+]|\\d+[.)])\\s+(.*)$/.exec(lines[j].text);\n if (!match || /^\\d/.test(match[2]) !== ordered) break;\n const contentAt = lines[j].start + match[1].length + match[2].length + 1;\n items.push(cell(match[3], contentAt));\n j++;\n }\n blocks.push({ id, kind: 'list', start: line.start, end: lines[j - 1].end,\n complete: j < lines.length && lines[j].terminated, ordered, items });\n i = j;\n continue;\n }\n\n // Syntax-only fragments at the stream tail are withheld until their intent\n // is known. They otherwise flash as raw Markdown and disappear one byte\n // later when they become a heading/rule/list.\n if (!line.terminated && (/^ {0,3}#{1,6}\\s*$/.test(line.text)\n || /^\\s*[-*_]{1,2}\\s*$/.test(line.text))) {\n blocks.push({ id, kind: 'paragraph', start: line.start, end: line.end, complete: false, runs: [] });\n i++;\n continue;\n }\n\n const paragraph: SourceLine[] = [line];\n let j = i + 1;\n while (j < lines.length && lines[j].text.trim() && !startsSpecialBlock(lines, j)) {\n paragraph.push(lines[j]);\n j++;\n }\n const text = paragraph.map((part) => part.text).join('\\n');\n blocks.push({ id, kind: 'paragraph', start: line.start, end: paragraph.at(-1)!.end,\n complete: j < lines.length && lines[j].terminated,\n runs: parseProgressiveInline(text, line.start) });\n i = j;\n }\n\n return { version: 3, sourceLength: source.length, blocks };\n}\n\nexport function progressiveMarkdownPayload(source: string): ProgressiveMarkdownPayload {\n return {\n runtime: PROGRESSIVE_MARKDOWN_RUNTIME_VERSION,\n source,\n document: parseStreamingMarkdown(source),\n };\n}\n\n/**\n * Build a render-only, syntactically closed projection of a streaming buffer.\n *\n * Supported continuations are the constructs whose late closing delimiters\n * cause visible whole-block reflow in all three Standard Code renderers:\n * fenced code, inline code, emphasis/strong emphasis, strikethrough, and link\n * destinations. Block constructs such as headings and lists are already valid\n * at every prefix and need no completion.\n */\nexport function projectStreamingMarkdown(source: string): ProgressiveMarkdownProjection {\n if (!source) return { markdown: source, suffix: '', open: 'none' };\n\n let fence: Fence | null = null;\n let inlineTicks = 0;\n let linkDepth = 0;\n let labelDepth = 0;\n let lastClosedLabel = false;\n let ambiguousTrailingDelimiter = false;\n let ambiguousTrailingInlineTicks = false;\n let trailingMismatchedTicks = false;\n const emphasis: Array<'*' | '_' | '~'> = [];\n let lineStart = 0;\n let i = 0;\n\n while (i < source.length) {\n if (i === lineStart) {\n const candidate = lineFence(source, lineStart);\n if (candidate) {\n const lineEnd = source.indexOf('\\n', candidate.at);\n const end = lineEnd < 0 ? source.length : lineEnd;\n if (!fence) {\n // Backticks are forbidden in a backtick fence's info string. Treat a\n // malformed opener as ordinary inline text instead of hiding it.\n const info = source.slice(candidate.at + candidate.fence.length, end);\n if (candidate.fence.marker !== '`' || !info.includes('`')) {\n fence = candidate.fence;\n emphasis.length = 0;\n inlineTicks = 0;\n linkDepth = 0;\n i = end;\n continue;\n }\n } else if (candidate.fence.marker === fence.marker && candidate.fence.length >= fence.length) {\n const trailing = source.slice(candidate.at + candidate.fence.length, end);\n if (/^[ \\t]*$/.test(trailing)) {\n fence = null;\n i = end;\n continue;\n }\n }\n }\n }\n\n const character = source[i];\n if (character === '\\n') {\n lineStart = i + 1;\n // Our three renderers format inline constructs one logical line at a\n // time. A closer appended after a later line cannot repair an earlier\n // one, so abandon malformed inline state at the line boundary.\n if (!fence) {\n inlineTicks = 0;\n linkDepth = 0;\n labelDepth = 0;\n lastClosedLabel = false;\n emphasis.length = 0;\n }\n i++;\n continue;\n }\n if (fence) { i++; continue; }\n\n if (character === '\\\\' && i + 1 < source.length && isPunctuation(source[i + 1])) {\n i += 2;\n lastClosedLabel = false;\n continue;\n }\n\n if (character === '`') {\n const length = runLength(source, i, '`');\n // A one/two-backtick prefix at the start of a line is commonly the first\n // network fragment of a fenced block. Completing it to two/four ticks\n // would itself manufacture a fence on the next pass. Wait for either a\n // third tick or actual inline-code content before guessing.\n // An opener with no content has nothing to style yet, and doubling it\n // creates an ambiguous empty span (or even a fence). Wait for one content\n // character; the next network fragment will make the intent observable.\n const emptyOpener = inlineTicks === 0 && i + length === source.length;\n if (emptyOpener) ambiguousTrailingInlineTicks = true;\n if (inlineTicks > 0 && length !== inlineTicks && i + length === source.length) trailingMismatchedTicks = true;\n if (inlineTicks === 0 && !emptyOpener) inlineTicks = length;\n else if (length === inlineTicks) inlineTicks = 0;\n i += length;\n lastClosedLabel = false;\n continue;\n }\n if (inlineTicks > 0) { i++; continue; }\n\n if (linkDepth > 0) {\n if (character === '(' && !isEscaped(source, i)) linkDepth++;\n else if (character === ')' && !isEscaped(source, i)) linkDepth--;\n i++;\n continue;\n }\n\n if (character === '[') {\n labelDepth++;\n lastClosedLabel = false;\n i++;\n continue;\n }\n if (character === ']') {\n lastClosedLabel = labelDepth > 0;\n if (labelDepth > 0) labelDepth--;\n i++;\n continue;\n }\n if (character === '(' && lastClosedLabel) {\n linkDepth = 1;\n lastClosedLabel = false;\n i++;\n continue;\n }\n lastClosedLabel = false;\n\n if (character === '*' || character === '_') {\n const length = runLength(source, i, character);\n const { canOpen, canClose } = delimiterFlanking(source, i, length, character);\n let remaining = length;\n if (i + length === source.length && canClose && !canOpen\n && emphasis.length > 0 && emphasis.at(-1) !== character) {\n ambiguousTrailingDelimiter = true;\n }\n if (canClose) {\n while (remaining > 0 && emphasis.at(-1) === character) {\n emphasis.pop();\n remaining--;\n }\n }\n if (canOpen) while (remaining-- > 0) emphasis.push(character);\n i += length;\n continue;\n }\n\n if (character === '~') {\n const length = runLength(source, i, '~');\n // GFM strikethrough uses pairs. A lone tilde is ordinary punctuation.\n let remaining = length - (length % 2);\n if (remaining > 0) {\n const { canOpen, canClose } = delimiterFlanking(source, i, length, '~');\n if (canClose) {\n while (remaining > 0 && emphasis.at(-1) === '~') {\n emphasis.pop();\n remaining--;\n }\n }\n if (canOpen) while (remaining-- > 0) emphasis.push('~');\n }\n i += length;\n continue;\n }\n\n i++;\n }\n\n let suffix = '';\n let open: ProgressiveMarkdownProjection['open'] = 'none';\n if (fence) {\n suffix = `${source.endsWith('\\n') ? '' : '\\n'}${fence.marker.repeat(fence.length)}`;\n open = 'fence';\n } else {\n // Adding any closer after a final, contentless backtick run would turn that\n // run into a new code opener. Wait one fragment instead of making an older\n // emphasis/link guess destabilize itself.\n if (ambiguousTrailingInlineTicks) return { markdown: source, suffix: '', open: 'none' };\n if (inlineTicks > 0) {\n if (trailingMismatchedTicks || isEscaped(`${source}x`, source.length)) suffix += '\\u2060';\n suffix += '`'.repeat(inlineTicks);\n open = 'inline-code';\n }\n if (linkDepth > 0) {\n if (!suffix && isEscaped(`${source}x`, source.length)) suffix += '\\u2060';\n suffix += ')'.repeat(linkDepth);\n if (open === 'none') open = 'link';\n }\n if (emphasis.length > 0 && !ambiguousTrailingDelimiter) {\n // Asterisks immediately after trailing whitespace cannot be right-\n // flanking, so CommonMark would leave the whole span literal for exactly\n // the frames that end on a streamed space. WORD JOINER is invisible and\n // non-whitespace; it makes the disposable closer valid without touching\n // or trimming the source buffer.\n if (!suffix && (/\\s$/.test(source) || isEscaped(`${source}x`, source.length))) suffix += '\\u2060';\n suffix += emphasis.reverse().join('');\n if (open === 'none') open = 'emphasis';\n }\n }\n return { markdown: source + suffix, suffix, open };\n}\n\nexport function completeStreamingMarkdown(source: string): string {\n return projectStreamingMarkdown(source).markdown;\n}\n","/**\n * A light-touch Markdown → ANSI formatter for the transcript. Deliberately not a\n * full Markdown engine: it adds color/emphasis hints (bold, inline code,\n * headings, links), tidy list bullets, basic aligned tables, and fenced code\n * gutters — enough to make agent replies readable without fighting the terminal.\n * Zero dependencies; returns an array of ready-to-print lines.\n */\n\nimport {\n parseStreamingMarkdown,\n type ProgressiveMarkdownCell,\n type ProgressiveMarkdownRun,\n} from './progressive-markdown.ts';\n\nconst ESC = \"\\x1b[\";\nconst R = ESC + \"0m\";\nconst BOLD = ESC + \"1m\";\nconst DIM = ESC + \"2m\";\nconst ITAL = ESC + \"3m\";\nconst UNDER = ESC + \"4m\";\nconst TEAL = ESC + \"38;5;37m\";\nconst CYAN = ESC + \"36m\";\nconst GRAY = ESC + \"90m\";\n\n/** Visible width of a string, ignoring ANSI SGR sequences. */\n// eslint-disable-next-line no-control-regex\nconst ANSI = /\\x1b\\[[0-9;]*m/g;\nfunction visibleWidth(s: string): number {\n return s.replace(ANSI, \"\").length;\n}\nfunction padEndVisible(s: string, width: number): string {\n const pad = width - visibleWidth(s);\n return pad > 0 ? s + \" \".repeat(pad) : s;\n}\n\n/** Apply inline emphasis: code spans, links, bold, italic, strikethrough. */\nfunction inline(s: string): string {\n // Protect inline code first so its contents aren't re-formatted. NUL sentinels\n // never appear in real text, so they can't collide with digits in the prose.\n const codes: string[] = [];\n s = s.replace(/`([^`]+)`/g, (_, code) => {\n codes.push(code);\n return \"\\x00\" + (codes.length - 1) + \"\\x00\";\n });\n // Links: [text](url) → underlined text + dim url.\n s = s.replace(\n /\\[([^\\]]+)\\]\\(([^)\\s]+)\\)/g,\n (_, text, url) => `${CYAN}${UNDER}${text}${R} ${DIM}${url}${R}`\n );\n // Bold then italic. Word boundaries keep underscores in identifiers literal.\n s = s.replace(/\\*\\*([^*]+)\\*\\*/g, (_, t) => `${BOLD}${t}${R}`);\n s = s.replace(/\\*([^*\\n]+)\\*/g, (_, t) => `${ITAL}${t}${R}`);\n s = s.replace(/__([^_]+)__/g, (_, t) => `${BOLD}${t}${R}`);\n s = s.replace(/(^|[^\\w])_([^_\\n]+)_($|[^\\w])/g, (_, a, t, b) => `${a}${ITAL}${t}${R}${b}`);\n s = s.replace(/~~([^~]+)~~/g, (_, t) => `${DIM}${t}${R}`);\n // Restore code spans in teal. Spaces inside a code span become non-breaking\n // (NBSP) so word-wrapping never splits a command/path like `curl | bash`.\n // eslint-disable-next-line no-control-regex\n s = s.replace(/\\x00(\\d+)\\x00/g, (_, i) => `${TEAL}${codes[+i].replace(/ /g, String.fromCharCode(160))}${R}`);\n return s;\n}\n\n/**\n * Word-wrap styled text to a visible width. ANSI-aware (escape sequences don't\n * count toward width), splits only on regular spaces (so NBSP-protected code\n * spans stay intact). A single word longer than the width is left to overflow\n * rather than split mid-token.\n */\nfunction wrapStyled(text: string, width: number): string[] {\n if (width < 4 || visibleWidth(text) <= width) return [text];\n const words = text.split(\" \");\n const lines: string[] = [];\n let cur = \"\";\n let curLen = 0;\n for (const w of words) {\n const wLen = visibleWidth(w);\n if (cur === \"\") {\n cur = w;\n curLen = wLen;\n } else if (curLen + 1 + wLen <= width) {\n cur += \" \" + w;\n curLen += 1 + wLen;\n } else {\n lines.push(cur);\n cur = w;\n curLen = wLen;\n }\n }\n if (cur !== \"\" || lines.length === 0) lines.push(cur);\n return lines;\n}\n\n/**\n * Emit a block (paragraph/list item/quote) word-wrapped to `cols`, with a lead\n * on the first line and an aligned hanging indent of the same visible width on\n * the rest. `leadWidth` is the visible width of both leads.\n */\nfunction wrapBlock(\n out: string[],\n cols: number,\n leadFirst: string,\n leadRest: string,\n leadWidth: number,\n text: string\n): void {\n const wrapped = wrapStyled(text, Math.max(8, cols - leadWidth));\n wrapped.forEach((ln, idx) => out.push((idx === 0 ? leadFirst : leadRest) + ln));\n}\n\n/** Split a table row \"| a | b |\" into trimmed cells. */\nfunction tableCells(row: string): string[] {\n let r = row.trim();\n if (r.startsWith(\"|\")) r = r.slice(1);\n if (r.endsWith(\"|\")) r = r.slice(0, -1);\n return r.split(\"|\").map((c) => c.trim());\n}\n\nconst SEPARATOR = /^[\\s|:-]+$/;\nfunction isTableSeparator(line: string): boolean {\n return SEPARATOR.test(line) && line.includes(\"-\") && line.includes(\"|\");\n}\n\n/** Render a collected table block (header row + body rows) as aligned columns. */\nfunction renderTable(rows: string[][]): string[] {\n const cols = Math.max(...rows.map((r) => r.length));\n const widths: number[] = [];\n for (let c = 0; c < cols; c++) {\n widths[c] = Math.max(...rows.map((r) => visibleWidth(inline(r[c] ?? \"\"))));\n }\n const sep = `${GRAY} │ ${R}`;\n const out: string[] = [];\n rows.forEach((r, ri) => {\n const cells = [];\n for (let c = 0; c < cols; c++) {\n const raw = r[c] ?? \"\";\n const styled = ri === 0 ? `${BOLD}${inline(raw)}${R}` : inline(raw);\n cells.push(padEndVisible(styled, widths[c]));\n }\n out.push((\" \" + cells.join(sep)).replace(/\\s+$/, \"\"));\n if (ri === 0) {\n // A thin underline beneath the header row.\n const rule = widths.map((w) => `${GRAY}${\"─\".repeat(w)}${R}`).join(`${GRAY}─┼─${R}`);\n out.push(\" \" + rule);\n }\n });\n return out;\n}\n\n/** Format Markdown source into an array of ANSI-styled, word-wrapped terminal lines. */\nexport function renderMarkdown(src: string, cols = 80): string[] {\n const lines = src.replace(/\\r\\n/g, \"\\n\").split(\"\\n\");\n const out: string[] = [];\n let fence: { marker: string; length: number; rows: number } | null = null;\n let i = 0;\n\n while (i < lines.length) {\n const line = lines[i];\n\n // Fenced code block: render with a dim gutter, no inline formatting.\n const marker = /^ {0,3}(`{3,}|~{3,})(.*)$/.exec(line);\n if (!fence && marker) {\n fence = { marker: marker[1][0], length: marker[1].length, rows: 0 };\n i++;\n continue;\n }\n if (fence && marker && marker[1][0] === fence.marker && marker[1].length >= fence.length\n && marker[2].trim() === '') {\n // Even an empty streamed fence has a visible code surface immediately.\n if (fence.rows === 0) out.push(`${GRAY}│${R} `);\n fence = null;\n i++;\n continue;\n }\n if (fence) {\n out.push(`${GRAY}│${R} ${line}`);\n fence.rows++;\n i++;\n continue;\n }\n\n // Table: a row containing \"|\" immediately followed by a separator row.\n if (line.includes(\"|\") && i + 1 < lines.length && isTableSeparator(lines[i + 1])) {\n const block: string[][] = [tableCells(line)];\n i += 2; // skip header + separator\n while (i < lines.length && lines[i].includes(\"|\") && lines[i].trim()) {\n block.push(tableCells(lines[i]));\n i++;\n }\n out.push(...renderTable(block));\n continue;\n }\n\n // Heading.\n const heading = line.match(/^(#{1,6})\\s+(.*)$/);\n if (heading) {\n for (const ln of wrapStyled(heading[2].trim(), cols)) out.push(`${BOLD}${TEAL}${ln}${R}`);\n i++;\n continue;\n }\n\n // Horizontal rule → a short, subtle divider (never full width).\n if (/^\\s*([-*_])(\\s*\\1){2,}\\s*$/.test(line)) {\n out.push(`${GRAY}──────${R}`);\n i++;\n continue;\n }\n\n // Blockquote.\n const quote = line.match(/^\\s*>\\s?(.*)$/);\n if (quote) {\n for (const ln of wrapStyled(inline(quote[1]), Math.max(8, cols - 2))) {\n out.push(`${GRAY}│${R} ${DIM}${ln}${R}`);\n }\n i++;\n continue;\n }\n\n // Bullet list (-, *, +) with indentation preserved; continuation hangs under the text.\n const bullet = line.match(/^(\\s*)[-*+]\\s+(.*)$/);\n if (bullet) {\n const leadWidth = bullet[1].length + 2;\n wrapBlock(out, cols, `${bullet[1]}${TEAL}•${R} `, \" \".repeat(leadWidth), leadWidth, inline(bullet[2]));\n i++;\n continue;\n }\n\n // Numbered list — keep the number, embolden the marker.\n const numbered = line.match(/^(\\s*)(\\d+)([.)])\\s+(.*)$/);\n if (numbered) {\n const marker = `${numbered[2]}${numbered[3]}`;\n const leadWidth = numbered[1].length + marker.length + 1;\n wrapBlock(out, cols, `${numbered[1]}${BOLD}${marker}${R} `, \" \".repeat(leadWidth), leadWidth, inline(numbered[4]));\n i++;\n continue;\n }\n\n // Plain paragraph line (blank lines pass through as spacing).\n if (line.trim()) wrapBlock(out, cols, \"\", \"\", 0, inline(line));\n else out.push(\"\");\n i++;\n }\n\n return out;\n}\n\nfunction streamingRun(run: ProgressiveMarkdownRun): string {\n let text = run.styles.includes('code') ? run.text.replace(/ /g, String.fromCharCode(160)) : run.text;\n if (run.styles.includes('code')) text = `${TEAL}${text}${R}`;\n if (run.styles.includes('strike')) text = `${DIM}${text}${R}`;\n if (run.styles.includes('strong')) text = `${BOLD}${text}${R}`;\n if (run.styles.includes('emphasis')) text = `${ITAL}${text}${R}`;\n if (run.href || run.styles.includes('link')) text = `${CYAN}${UNDER}${text}${R}`;\n return text;\n}\n\nfunction streamingInline(runs: ProgressiveMarkdownRun[]): string {\n return runs.map(streamingRun).join('');\n}\n\nfunction plainCell(cell: ProgressiveMarkdownCell): string {\n return cell.runs.map((run) => run.text).join('');\n}\n\n/**\n * Render the shared structured streaming document. Unlike `renderMarkdown`,\n * this never asks a second parser to reinterpret a healed string; open inline\n * styles and fences are already represented as persistent nodes.\n */\nexport function renderStreamingMarkdown(src: string, cols = 80): string[] {\n const document = parseStreamingMarkdown(src);\n const out: string[] = [];\n\n for (const block of document.blocks) {\n if (out.length && out.at(-1) !== '') out.push('');\n switch (block.kind) {\n case 'code': {\n const lines = (block.text ?? '').split('\\n');\n if (lines.length === 1 && !lines[0]) out.push(`${GRAY}│${R} `);\n else for (const line of lines) out.push(`${GRAY}│${R} ${line}`);\n break;\n }\n case 'heading': {\n const text = streamingInline(block.runs ?? []);\n for (const line of wrapStyled(text, cols)) out.push(`${BOLD}${TEAL}${line}${R}`);\n break;\n }\n case 'rule':\n out.push(`${GRAY}──────${R}`);\n break;\n case 'quote': {\n const text = streamingInline(block.runs ?? []);\n for (const logical of text.split('\\n')) {\n for (const line of wrapStyled(logical, Math.max(8, cols - 2))) out.push(`${GRAY}│${R} ${DIM}${line}${R}`);\n }\n break;\n }\n case 'list': {\n for (let index = 0; index < (block.items ?? []).length; index++) {\n const marker = block.ordered ? `${index + 1}.` : '•';\n const lead = block.ordered ? `${BOLD}${marker}${R} ` : `${TEAL}${marker}${R} `;\n wrapBlock(out, cols, lead, ' '.repeat(marker.length + 1), marker.length + 1,\n streamingInline(block.items![index].runs));\n }\n break;\n }\n case 'table': {\n const rows = [\n (block.header ?? []).map(plainCell),\n ...(block.rows ?? []).map((row) => row.map(plainCell)),\n ];\n if (rows[0].length) out.push(...renderTable(rows));\n break;\n }\n case 'paragraph': {\n const text = streamingInline(block.runs ?? []);\n for (const logical of text.split('\\n')) wrapBlock(out, cols, '', '', 0, logical);\n break;\n }\n }\n }\n return out;\n}\n","/**\n * WordMill — the working indicator's slot-machine word morph.\n *\n * The status line's \"Working\" label holds steady for a few seconds, then\n * decomposes and re-forms into another working word (some earnest, some\n * fun): each character is a slot that starts flipping through random\n * letters/symbols — lazily at first, then every frame — before landing on\n * the target word's character and sticking. Longer targets grow new slots\n * mid-morph; shorter ones let trailing slots flip out and vanish. The new\n * word then holds, and the cycle repeats for as long as the turn runs.\n *\n * Pure logic, driven entirely by the caller's clock (`text(now)` once per\n * frame): no timers of its own, deterministic per (slot, time-bucket) while\n * flipping so a re-render within the same bucket shows the same glyph.\n */\n\nexport const MILL_WORDS = [\n \"Working\",\n \"Thinking\",\n \"Building\",\n \"Brewing\",\n \"Crafting\",\n \"Scheming\",\n \"Tinkering\",\n \"Noodling\",\n \"Pondering\",\n \"Wrangling\",\n \"Conjuring\",\n \"Percolating\",\n \"Assembling\",\n \"Cogitating\",\n \"Hatching\",\n \"Forging\",\n // The silly shelf — irreverent, never profane.\n \"Pickling\",\n \"Spooning\",\n \"Marinating\",\n \"Squishing\",\n \"Wiggling\",\n \"Frolicking\",\n \"Moisturizing\",\n \"Bamboozling\",\n \"Skedaddling\",\n \"Discombobulating\",\n \"Waffling\",\n \"Yodeling\",\n \"Shimmying\",\n \"Galumphing\",\n \"Snorkeling\",\n \"Bedazzling\",\n] as const;\n\n// What the slots flip through — letters plus the punctuation \"debris\" that\n// sells the decomposing look.\nconst FLIP_POOL = \"abcdefghjkmnopqrstuvwxyz#$%&@!*+=.:~\";\n\nconst HOLD_MS = 2600; // how long a landed word stays intact\n// Per-slot flip cadence: a slot flips lazily right after it starts\n// (LAZY_PERIOD per glyph), then per-frame once it has been flipping a while.\nconst LAZY_MS = 320;\nconst LAZY_PERIOD = 200;\nconst FAST_PERIOD = 70;\n\nconst BOLD = \"\\x1b[1m\";\nconst DIM = \"\\x1b[2m\";\nconst OFF = \"\\x1b[22m\"; // clears bold + dim\n\n/** Deterministic small hash → pool glyph, stable within one flip bucket. */\nfunction glyphAt(slot: number, bucket: number): string {\n let h = (slot + 1) * 2654435761 ^ (bucket + 1) * 40503;\n h = Math.imul(h ^ (h >>> 13), 1274126177);\n h ^= h >>> 16;\n return FLIP_POOL[(h >>> 0) % FLIP_POOL.length];\n}\n\ninterface Slot {\n start: number; // ms into the morph when this slot begins flipping\n land: number; // ms into the morph when it locks onto the target char\n}\n\nexport class WordMill {\n private word: string = MILL_WORDS[0];\n private target: string | null = null; // non-null while morphing\n private phaseAt = 0; // clock time the current phase began\n private slots: Slot[] = [];\n private morphLen = 0;\n private rng: () => number;\n\n constructor(rng: () => number = Math.random) {\n this.rng = rng;\n }\n\n /** Restart at \"Working\" (called when a turn begins). */\n reset(now: number): void {\n this.word = MILL_WORDS[0];\n this.target = null;\n this.phaseAt = now;\n }\n\n /** The plain word currently displayed or being formed (for tests). */\n get current(): string {\n return this.target ?? this.word;\n }\n\n /** The styled label for this frame (contains only bold/dim ANSI). */\n text(now: number): string {\n if (this.phaseAt === 0) this.phaseAt = now;\n if (!this.target) {\n if (now - this.phaseAt >= HOLD_MS) this.beginMorph(now);\n else return `${BOLD}${this.word}${OFF}`;\n }\n return this.morphFrame(now);\n }\n\n private beginMorph(now: number): void {\n const options = MILL_WORDS.filter((w) => w !== this.word);\n this.target = options[Math.floor(this.rng() * options.length)];\n this.phaseAt = now;\n const n = Math.max(this.word.length, this.target.length);\n this.slots = [];\n let maxLand = 0;\n for (let i = 0; i < n; i++) {\n // Staggered starts sell the \"one by one it comes apart\" ramp; lands\n // sweep loosely left→right with jitter so letters lock in one at a\n // time rather than all at once.\n const start = this.rng() * 500;\n const land = 750 + i * 90 + this.rng() * 350;\n this.slots.push({ start, land });\n if (land > maxLand) maxLand = land;\n }\n this.morphLen = maxLand + 60;\n }\n\n private morphFrame(now: number): string {\n const target = this.target!;\n const t = now - this.phaseAt;\n if (t >= this.morphLen) {\n // Morph complete — the target becomes the held word.\n this.word = target;\n this.target = null;\n this.phaseAt = now;\n return `${BOLD}${this.word}${OFF}`;\n }\n let out = \"\";\n for (let i = 0; i < this.slots.length; i++) {\n const s = this.slots[i];\n if (t < s.start) {\n // Still intact: shows the OLD word's char (a slot the old word\n // doesn't have simply hasn't appeared yet).\n const ch = this.word[i];\n if (ch) out += `${BOLD}${ch}${OFF}`;\n } else if (t < s.land) {\n // Flipping: lazy cadence right after start, per-frame once warm.\n const age = t - s.start;\n const period = age < LAZY_MS ? LAZY_PERIOD : FAST_PERIOD;\n out += `${DIM}${glyphAt(i, Math.floor(t / period))}${OFF}`;\n } else {\n // Landed: shows the NEW word's char (or vanishes for shrunk slots).\n const ch = target[i];\n if (ch) out += `${BOLD}${ch}${OFF}`;\n }\n }\n return out;\n }\n}\n","export * from \"@standardagents/code-network/types\";\n","/** Environment names local MCP servers and skill scripts may inherit. */\nconst INHERITED_ENV_ALLOWLIST = new Set([\n \"APPDATA\",\n \"COMSPEC\",\n \"HOME\",\n \"LANG\",\n \"LC_ALL\",\n \"LC_CTYPE\",\n \"LOCALAPPDATA\",\n \"LOGNAME\",\n \"PATH\",\n \"PATHEXT\",\n \"PROGRAMDATA\",\n \"SHELL\",\n \"SYSTEMROOT\",\n \"TEMP\",\n \"TERM\",\n \"TMP\",\n \"TMPDIR\",\n \"USER\",\n \"USERPROFILE\",\n \"WINDIR\",\n]);\n\n/**\n * Preserve the user's normal process environment while containing the\n * parent-only TLS relaxation used for local Standard Agents endpoints.\n */\nexport function inheritedSubprocessEnv(\n ambient: NodeJS.ProcessEnv = process.env\n): NodeJS.ProcessEnv {\n const child = { ...ambient };\n delete child.NODE_TLS_REJECT_UNAUTHORIZED;\n return child;\n}\n\n/**\n * Build a minimal child-process environment. Explicit per-server values are\n * trusted configuration for that child; ambient credentials are never copied.\n */\nexport function restrictedSubprocessEnv(\n explicit: Record<string, string> = {},\n ambient: NodeJS.ProcessEnv = process.env\n): NodeJS.ProcessEnv {\n const inherited: NodeJS.ProcessEnv = {};\n for (const [name, value] of Object.entries(ambient)) {\n if (value !== undefined && INHERITED_ENV_ALLOWLIST.has(name.toUpperCase())) {\n inherited[name] = value;\n }\n }\n return { ...inherited, ...explicit };\n}\n","/**\n * Best-effort system-clipboard image reader (zero-dependency).\n *\n * Used by the TUI's Ctrl+V handler: terminals only deliver *text* through\n * bracketed paste, so an image on the clipboard never reaches the input by\n * itself. When the user explicitly asks (Ctrl+V), we shell out to the\n * platform's clipboard utility and pull the image as PNG bytes.\n *\n * Per platform:\n * - macOS: `osascript` — first the raw PNG flavour («class PNGf», what\n * screenshots put on the clipboard), then a copied-file fallback\n * («class furl», what Finder ⌘C puts there) read from disk.\n * - Linux: `wl-paste` (Wayland) then `xclip` (X11), asking for image/png.\n * - Windows: PowerShell's Windows.Forms clipboard, saved as PNG.\n *\n * All paths are best-effort: any missing utility or non-image clipboard\n * resolves to null, never throws.\n */\nimport { execFile } from \"node:child_process\";\nimport fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { inheritedSubprocessEnv } from \"./subprocess-env.ts\";\n\nexport interface ClipboardImage {\n data: string; // base64-encoded image bytes\n mime: string; // e.g. \"image/png\"\n}\n\nconst FILE_MIMES: Record<string, string> = {\n \".png\": \"image/png\",\n \".jpg\": \"image/jpeg\",\n \".jpeg\": \"image/jpeg\",\n \".gif\": \"image/gif\",\n \".webp\": \"image/webp\",\n};\n\n/** Cap pasted images at 8 MB — larger than any reasonable screenshot, small\n * enough that a base64 body stays well within request limits. */\nconst MAX_IMAGE_BYTES = 8 * 1024 * 1024;\n\nfunction run(cmd: string, args: string[], maxBuffer = MAX_IMAGE_BYTES * 2): Promise<{ ok: boolean; stdout: Buffer }> {\n return new Promise((resolve) => {\n execFile(cmd, args, {\n encoding: \"buffer\",\n maxBuffer,\n env: inheritedSubprocessEnv(),\n }, (err, stdout) => {\n resolve({ ok: !err, stdout: stdout ?? Buffer.alloc(0) });\n });\n });\n}\n\nfunction fromFile(filePath: string): ClipboardImage | null {\n const mime = FILE_MIMES[path.extname(filePath).toLowerCase()];\n if (!mime) return null;\n try {\n const stat = fs.statSync(filePath);\n if (!stat.isFile() || stat.size === 0 || stat.size > MAX_IMAGE_BYTES) return null;\n return { data: fs.readFileSync(filePath).toString(\"base64\"), mime };\n } catch {\n return null;\n }\n}\n\nasync function readDarwin(): Promise<ClipboardImage | null> {\n // Raw image data (screenshots, \"Copy Image\" from a browser) → PNG flavour.\n const tmp = path.join(os.tmpdir(), `sc-clip-${process.pid}-${Date.now()}.png`);\n const script = [\n `set d to the clipboard as «class PNGf»`,\n `set f to open for access POSIX file \"${tmp}\" with write permission`,\n `set eof f to 0`,\n `write d to f`,\n `close access f`,\n ].join(\"\\n\");\n const png = await run(\"osascript\", [\"-e\", script]);\n if (png.ok) {\n const img = fromFile(tmp);\n try {\n fs.unlinkSync(tmp);\n } catch {\n /* ignore */\n }\n if (img) return img;\n }\n // A file copied in Finder → resolve the file URL and read the image from disk.\n const furl = await run(\"osascript\", [\"-e\", \"POSIX path of (the clipboard as «class furl»)\"]);\n if (furl.ok) {\n const p = furl.stdout.toString(\"utf8\").trim();\n if (p) return fromFile(p);\n }\n return null;\n}\n\nasync function readLinux(): Promise<ClipboardImage | null> {\n for (const [cmd, args] of [\n [\"wl-paste\", [\"--type\", \"image/png\"]],\n [\"xclip\", [\"-selection\", \"clipboard\", \"-t\", \"image/png\", \"-o\"]],\n ] as [string, string[]][]) {\n const res = await run(cmd, args);\n // PNG magic bytes guard against utilities that print an error to stdout.\n if (res.ok && res.stdout.length > 8 && res.stdout.length <= MAX_IMAGE_BYTES && res.stdout[0] === 0x89 && res.stdout[1] === 0x50) {\n return { data: res.stdout.toString(\"base64\"), mime: \"image/png\" };\n }\n }\n return null;\n}\n\nasync function readWindows(): Promise<ClipboardImage | null> {\n const tmp = path.join(os.tmpdir(), `sc-clip-${process.pid}-${Date.now()}.png`);\n const ps = [\n \"Add-Type -AssemblyName System.Windows.Forms;\",\n \"$img = [System.Windows.Forms.Clipboard]::GetImage();\",\n `if ($img -ne $null) { $img.Save('${tmp.replace(/'/g, \"''\")}', [System.Drawing.Imaging.ImageFormat]::Png) }`,\n ].join(\" \");\n await run(\"powershell\", [\"-NoProfile\", \"-STA\", \"-Command\", ps]);\n const img = fromFile(tmp);\n try {\n fs.unlinkSync(tmp);\n } catch {\n /* ignore */\n }\n return img;\n}\n\n/** Read an image from the system clipboard, or null when there isn't one. */\nexport async function readClipboardImage(): Promise<ClipboardImage | null> {\n try {\n if (process.platform === \"darwin\") return await readDarwin();\n if (process.platform === \"win32\") return await readWindows();\n return await readLinux();\n } catch {\n return null;\n }\n}\n","/**\n * Terminal UI with a persistent bottom input region.\n *\n * A side-margined expanding input box stays anchored at the bottom and is always\n * editable — you can type while the agent works. Working status and subagent\n * lines render directly above the box; the permission level sits in the box's\n * top border (far right). All transcript output is printed ABOVE the work area\n * via print(). Approvals and menus temporarily take over the bottom.\n */\nimport readline from \"node:readline\";\nimport { themeGray } from \"./theme.ts\";\nimport { gradientText, brandCycleColor } from \"./render.ts\";\nimport { renderStreamingMarkdown } from \"./markdown.ts\";\nimport { WordMill } from \"./wordmill.ts\";\nimport { LEVELS, levelLabel, type Level } from \"./types.ts\";\nimport type { GoalData } from \"./api.ts\";\nimport { readClipboardImage } from \"./clipboard.ts\";\nimport { appendLiveDraft, emptyLiveDraft, type LiveDraftState } from \"./session-state.ts\";\n\n/**\n * An image pasted into the input (Ctrl+V). `seq` ties it to its `[#Image N]`\n * placeholder in the text: only images whose placeholder survives editing are\n * sent with the message.\n */\nexport interface PastedImage {\n seq: number;\n data: string; // base64\n mime: string;\n}\n\n/** The `[#Image N]` placeholder text for a pasted image. */\nexport function imagePlaceholder(seq: number): string {\n return `[#Image ${seq}]`;\n}\n\n/**\n * Inline attachments authored by another UI do not necessarily include the\n * TUI's editable placeholder in their text. Make every restored image visible\n * and keep it eligible for submit without duplicating placeholders that are\n * already present.\n */\nexport function ensureImagePlaceholders(text: string, images: PastedImage[]): string {\n const missing = images\n .map((image) => imagePlaceholder(image.seq))\n .filter((placeholder) => !text.includes(placeholder));\n if (!missing.length) return text;\n return [text.trimEnd(), ...missing].filter(Boolean).join(\" \");\n}\n\n/**\n * Restore stdin after a plain readline interface releases the terminal.\n * Node closes readline by disabling raw mode and pausing the stream; without\n * an explicit handoff back, the next TUI menu paints but never receives keys.\n */\nexport function restoreTuiInput(input: NodeJS.ReadStream = process.stdin): void {\n readline.emitKeypressEvents(input);\n if (input.isTTY) input.setRawMode(true);\n input.resume();\n}\n\n// ── boxed input chrome (pure, testable layout builders) ───────────────────────\n//\n// Mirrors the Grok Build bottom HUD: side-margined expanding box with the\n// permission/level label in the top border far right. No model chrome.\n\n/** Outer side margin for the boxed input (cells on left and right). */\nexport const INPUT_BOX_MARGIN = 1;\n\n/**\n * Neutral grey border chrome (Grok-style) — not brand amber. Soft enough to\n * sit behind content; bright enough to read the box edge.\n */\nexport function inputBoxBorderColor(): string {\n return \"\\x1b[38;5;240m\";\n}\n\n/**\n * Permission level as five dots for the box border (filled = active ceiling).\n * Plain string for width math; pair with `borderLevelDotsStyled` for colour.\n * e.g. level 3 → `●●●○○`\n */\nexport function borderLevelDots(level: Level): string {\n const n = Math.max(1, Math.min(5, level));\n return \"●\".repeat(n) + \"○\".repeat(5 - n);\n}\n\n/** Styled dots: filled in `levelColor`, empty in muted grey. */\nexport function borderLevelDotsStyled(\n level: Level,\n levelColor: string,\n emptyColor = \"\\x1b[38;5;240m\",\n reset = \"\\x1b[0m\"\n): string {\n const n = Math.max(1, Math.min(5, level));\n let out = \"\";\n for (let i = 1; i <= 5; i++) {\n out += i <= n ? `${levelColor}●${reset}` : `${emptyColor}○${reset}`;\n }\n return out;\n}\n\n/** @deprecated use borderLevelDots — kept name for call-site greps during transition */\nexport function borderLevelLabel(level: Level): string {\n return borderLevelDots(level);\n}\n\n/**\n * Geometry of the boxed input at a given terminal width.\n * `boxW` is border-to-border width; `contentW` is the wrap width inside.\n * `leftPad` is the screen column where content begins (margin + │ + space).\n */\nexport function inputBoxGeometry(cols: number): {\n margin: number;\n boxW: number;\n contentW: number;\n leftPad: number;\n} {\n const margin = INPUT_BOX_MARGIN;\n // Fit inside the HUD row cap (cols - 1): margin + boxW <= cols - 1.\n const boxW = Math.max(12, cols - 1 - margin);\n // │ + space + content + space + │\n const contentW = Math.max(4, boxW - 4);\n const leftPad = margin + 2;\n return { margin, boxW, contentW, leftPad };\n}\n\n/** Visible width helper used by pure box builders (ANSI-aware, wide glyphs). */\nfunction boxVisibleWidth(s: string): number {\n // eslint-disable-next-line no-control-regex\n let w = 0;\n for (const ch of s.replace(/\\x1b\\[[0-9;]*m/g, \"\")) {\n const cp = ch.codePointAt(0)!;\n w += isWideCodePoint(cp) ? 2 : 1;\n }\n return w;\n}\n\n/**\n * Top border with the level dots right-aligned in the border:\n * `╭──────────── ●●●○○ ─╮`\n *\n * `levelText` is the plain-width form (e.g. `●●●○○`); `levelStyled` is the\n * coloured form drawn in its place. When omitted, `levelText` is painted with\n * `levelColor` as a single run.\n */\nexport function buildBoxTop(\n boxW: number,\n levelText: string,\n borderColor: string,\n levelColor: string,\n reset = \"\\x1b[0m\",\n levelStyled?: string\n): string {\n const labelPlain = ` ${levelText} `;\n const rightFill = 1;\n const budget = Math.max(1, boxW - 2 - rightFill); // corners + right dashes\n const plain =\n labelPlain.length > budget ? labelPlain.slice(0, Math.max(1, budget)) : labelPlain;\n const leftFill = Math.max(1, boxW - 2 - plain.length - rightFill);\n // Styled dots keep the surrounding spaces unstyled so visible width matches.\n const mid =\n levelStyled !== undefined\n ? ` ${levelStyled} `\n : `${levelColor}${plain}${reset}`;\n return (\n `${borderColor}╭${\"─\".repeat(leftFill)}${reset}` +\n mid +\n `${borderColor}${\"─\".repeat(rightFill)}╮${reset}`\n );\n}\n\n/** Bottom border: `╰────────────────╯` */\nexport function buildBoxBottom(boxW: number, borderColor: string, reset = \"\\x1b[0m\"): string {\n return `${borderColor}╰${\"─\".repeat(Math.max(1, boxW - 2))}╯${reset}`;\n}\n\n/** Plain top border with no level chrome: `╭────────────────╮` (menus, pickers). */\nexport function buildBoxTopPlain(boxW: number, borderColor: string, reset = \"\\x1b[0m\"): string {\n return `${borderColor}╭${\"─\".repeat(Math.max(1, boxW - 2))}╮${reset}`;\n}\n\n/**\n * Top border with a LEFT-aligned label in the rim — building block for the\n * {@link Tui.boxedPrompt} component:\n * `╭ Denial feedback ────────────────╮`\n */\nexport function buildBoxTopLeftLabel(\n boxW: number,\n label: string,\n borderColor: string,\n labelColor = \"\\x1b[90m\",\n reset = \"\\x1b[0m\"\n): string {\n const plain = ` ${label} `;\n const budget = Math.max(1, boxW - 3); // ╭ + ≥1 dash + ╮\n const lab = plain.length > budget ? plain.slice(0, Math.max(1, budget)) : plain;\n const fill = Math.max(1, boxW - 2 - lab.length);\n return (\n `${borderColor}╭${reset}` +\n `${labelColor}${lab}${reset}` +\n `${borderColor}${\"─\".repeat(fill)}╮${reset}`\n );\n}\n\n// ── Boxed prompt component ──────────────────────────────────────────────────\n//\n// Reusable single-line free-text capture that reuses the main input box chrome\n// (side margin, grey rounded rim, `❯` carrot, real caret). The only chrome\n// difference is a left-aligned label in the top border instead of level dots.\n//\n// Used today for denial feedback; also the right shape for any other short\n// free-text “tell the agent / tell the system” moment (e.g. reject-with-note,\n// handoff reason, rename). Prefer this over ad-hoc `prompt()` bars when the\n// capture should feel continuous with the HUD.\n//\n// Layout:\n// ╭ <borderLabel> ─────────────────────────╮\n// │ ❯ typed text… │\n// ╰─────────────────────────────────────────╯\n//\n// Keys: Enter submits (may be empty), Esc clears a non-empty draft then\n// cancels on a second Esc (empty buffer). Gradient text is intentionally\n// unused here — brand gradient is reserved for success moments.\n\n/** Options for {@link Tui.boxedPrompt}. */\nexport interface BoxedPromptOptions {\n /**\n * Left-aligned label painted into the top border rim\n * (e.g. `\"Denial feedback\"`, `\"Handoff note\"`).\n */\n borderLabel: string;\n /** ANSI colour for the border label. Default: dim grey (`\\x1b[90m`). */\n labelColor?: string;\n /** Seed the buffer (e.g. to re-edit a previous note). */\n initial?: string;\n /**\n * When true (default), the first Esc on a non-empty buffer clears it; Esc on\n * an empty buffer cancels (resolves `null`). When false, Esc always cancels.\n */\n escClearsFirst?: boolean;\n /**\n * When true, the caller already owns the keyboard via a takeover (e.g. the\n * approval dialog chaining into feedback). Skips begin/end takeover so the\n * parent can finish its own cleanup. Default false.\n */\n nested?: boolean;\n}\n\n/**\n * One body row of the input box: `│ content… │` padded to contentW.\n * `content` may include ANSI (prompt colour); padding uses visible width.\n */\nexport function buildBoxBody(\n content: string,\n contentW: number,\n borderColor: string,\n reset = \"\\x1b[0m\"\n): string {\n const vw = boxVisibleWidth(content);\n const pad = Math.max(0, contentW - vw);\n return `${borderColor}│${reset} ${content}${\" \".repeat(pad)} ${borderColor}│${reset}`;\n}\n\n/**\n * Wrap prompt + multi-line input into physical body content lines at contentW.\n *\n * Grok-style indent: only the first physical row carries the real prompt; every\n * subsequent row (soft wrap OR hard newline) is indented by `prefixWidth`\n * spaces so text lines up under the first line's content (after `❯ `).\n *\n * Pure: no terminal I/O. Returns at least one line (the bare prefix when empty).\n */\nexport function wrapInputBodyLines(\n inputBuffer: string,\n prefix: string,\n prefixWidth: number,\n contentW: number\n): string[] {\n const indent = \" \".repeat(Math.max(0, prefixWidth));\n const lines = inputBuffer.split(\"\\n\");\n const out: string[] = [];\n let isFirstPhysical = true;\n for (let i = 0; i < lines.length; i++) {\n const text = lines[i];\n let remaining = text;\n // Always emit at least one physical row per logical line.\n do {\n const lead = isFirstPhysical ? prefix : indent;\n const avail = Math.max(0, contentW - prefixWidth);\n let take = Math.min(remaining.length, avail);\n if (take === 0 && avail === 0 && remaining.length > 0) take = 1;\n const chunk = remaining.slice(0, take);\n remaining = remaining.slice(take);\n out.push(lead + chunk);\n isFirstPhysical = false;\n if (remaining.length === 0) break;\n } while (remaining.length > 0);\n }\n if (out.length === 0) out.push(prefix);\n return out;\n}\n\n/**\n * Greyscale highlight for the working border sweep.\n * intensity 0 = rest grey, 1 = near-white head. No brand hues — just contrast.\n */\nexport function borderHighlightGrey(intensity: number): string {\n const t = Math.max(0, Math.min(1, intensity));\n // Ease so the head reads as a bright “bead” and the trail softens quickly.\n const e = t * t;\n const lo = 88; // rest-adjacent\n const hi = 236; // soft white\n const v = Math.round(lo + (hi - lo) * e);\n // Prefer truecolor greys when available; 256 greyscale ramp otherwise.\n const ct = process.env.COLORTERM ?? \"\";\n const tc =\n /truecolor|24bit/i.test(ct) ||\n /iterm|kitty|wezterm|ghostty|alacritty/i.test(process.env.TERM_PROGRAM ?? \"\");\n if (tc) return `\\x1b[38;2;${v};${v};${v}m`;\n // xterm 256 greyscale: 232 (dark) … 255 (white)\n return `\\x1b[38;5;${232 + Math.round(23 * e)}m`;\n}\n\n/**\n * Color a perimeter cell for the rotating working highlight.\n * `phase` 0..1 is the head position (clockwise from top-left corner).\n * A short bright grey/white trail rides the rim; the rest stays dull grey.\n */\nexport function rotatingBorderCellColor(\n index: number,\n perimeter: number,\n phase: number,\n trailFrac = 0.2\n): string {\n const P = Math.max(1, perimeter);\n const pos = index / P;\n // Distance behind the head along the travel direction (0 at head → 1 full lap).\n const dBehind = ((phase - pos) % 1 + 1) % 1;\n if (dBehind <= trailFrac) {\n // 1 at head, 0 at tail end\n return borderHighlightGrey(1 - dBehind / trailFrac);\n }\n return inputBoxBorderColor();\n}\n\n/**\n * Clockwise perimeter index for a border cell.\n * Path: top L→R, right T→B (body only), bottom R→L, left B→T (body only).\n * Corners live on the top/bottom edges only (not duplicated on the sides).\n */\nexport function perimeterIndex(\n edge: \"top\" | \"right\" | \"bottom\" | \"left\",\n offset: number,\n boxW: number,\n bodyH: number\n): number {\n const W = boxW;\n const H = Math.max(1, bodyH);\n // top: 0..W-1, right: W..W+H-1, bottom: W+H..2W+H-1, left: 2W+H..2W+2H-1\n if (edge === \"top\") return Math.max(0, Math.min(W - 1, offset));\n if (edge === \"right\") return W + Math.max(0, Math.min(H - 1, offset));\n if (edge === \"bottom\") return W + H + Math.max(0, Math.min(W - 1, offset));\n return 2 * W + H + Math.max(0, Math.min(H - 1, offset));\n}\n\n/**\n * Full boxed-input row set (top + body + bottom), each pre-prefixed with the\n * side margin. Pure builder for tests and `renderBottom`.\n *\n * When `borderPhase` is a finite number, a grey/white highlight sweeps the\n * border clockwise (working state). Otherwise the border is static grey.\n */\nexport function buildInputBoxRows(opts: {\n cols: number;\n inputBuffer: string;\n prefix: string;\n prefixWidth: number;\n level: Level;\n levelColor: string;\n borderColor?: string;\n /** 0..1 head position for the rotating border highlight; omit/null when idle. */\n borderPhase?: number | null;\n /** The loaded agent's title, shown low-contrast in the top border left of\n * the level dots (dropped when the border is too narrow). */\n agentLabel?: string;\n}): string[] {\n const { cols, inputBuffer, prefix, prefixWidth, level, levelColor } = opts;\n const borderColor = opts.borderColor ?? inputBoxBorderColor();\n const geo = inputBoxGeometry(cols);\n const body = wrapInputBodyLines(inputBuffer, prefix, prefixWidth, geo.contentW);\n const pad = \" \".repeat(geo.margin);\n const phase = opts.borderPhase;\n\n if (phase == null || !Number.isFinite(phase)) {\n const dots = borderLevelDots(level);\n const dotsStyled = borderLevelDotsStyled(level, levelColor);\n // The loaded agent rides in the border left of the dots, low-contrast;\n // dropped entirely when the box is too narrow to fit it.\n const agent = (opts.agentLabel ?? \"\").trim();\n const withAgent = agent.length > 0 && ` ${agent} ${dots} `.length <= geo.boxW - 3;\n const levelText = withAgent ? `${agent} ${dots}` : dots;\n const levelStyled = withAgent\n ? `\\x1b[2m${themeGray}${agent}\\x1b[0m ${dotsStyled}`\n : dotsStyled;\n const top = buildBoxTop(geo.boxW, levelText, borderColor, levelColor, \"\\x1b[0m\", levelStyled);\n const bottom = buildBoxBottom(geo.boxW, borderColor);\n return [pad + top, ...body.map((b) => pad + buildBoxBody(b, geo.contentW, borderColor)), pad + bottom];\n }\n\n // ── animated perimeter (one continuous clockwise loop) ────────────────────\n //\n // 0 ── top L→R ──▶ W-1\n // ▲ │\n // left B→T right T→B\n // │ ▼\n // 2W+2H-1 ◀─ bottom R→L ─ W+H\n //\n const W = geo.boxW;\n const bodyH = Math.max(1, body.length);\n const P = 2 * W + 2 * bodyH;\n const reset = \"\\x1b[0m\";\n const colorAt = (i: number) => rotatingBorderCellColor(i, P, phase);\n\n // Top: every column 0..W-1 is a perimeter step. Level dots keep their own\n // colours but still occupy indices so the head travels through that span.\n const dots = borderLevelDots(level);\n const dotsStyled = borderLevelDotsStyled(level, levelColor);\n // Same agent-in-border treatment as the static top: dim grey, before dots.\n const agent = (opts.agentLabel ?? \"\").trim();\n const withAgent = agent.length > 0 && ` ${agent} ${dots} `.length <= W - 3;\n const labelPlain = withAgent ? ` ${agent} ${dots} ` : ` ${dots} `;\n // Character span of the agent label inside labelPlain (after the lead space).\n const agentSpanStart = withAgent ? 1 : -1;\n const agentSpanEnd = withAgent ? 1 + agent.length : -1;\n const rightFillN = 1;\n const budget = Math.max(1, W - 2 - rightFillN);\n const plain = labelPlain.length > budget ? labelPlain.slice(0, Math.max(1, budget)) : labelPlain;\n const leftFill = Math.max(1, W - 2 - plain.length - rightFillN);\n // Layout: [╭][─×leftFill][plain][─×rightFill][╮] length = W\n let top = \"\";\n let xi = 0;\n top += colorAt(perimeterIndex(\"top\", xi++, W, bodyH)) + \"╭\" + reset;\n for (let k = 0; k < leftFill; k++) {\n top += colorAt(perimeterIndex(\"top\", xi++, W, bodyH)) + \"─\" + reset;\n }\n // Dots block: advance indices for each visible column, paint spaces with the\n // sweep colour and leave the glyph colours from dotsStyled.\n // plain is \" ●●●○○ \" — rebuild so each cell gets the right perimeter colour\n // under the fixed glyphs.\n {\n const plainChars = [...plain];\n const styledInner = dotsStyled; // just the 5 dots, no surrounding spaces\n let di = 0; // index into filled/empty dots\n for (let ci = 0; ci < plainChars.length; ci++) {\n const ch = plainChars[ci];\n const c = colorAt(perimeterIndex(\"top\", xi++, W, bodyH));\n if (ci >= agentSpanStart && ci < agentSpanEnd) {\n // Agent label glyphs stay dim grey; the sweep still travels through.\n top += `\\x1b[2m${themeGray}${ch}\\x1b[0m`;\n continue;\n }\n if (ch === \"●\" || ch === \"○\") {\n // Keep level colour on the glyph; still count the step for travel.\n // Prefer level-styled sequence if available.\n const levelN = Math.max(1, Math.min(5, level));\n const filled = di < levelN;\n di++;\n top +=\n (filled ? levelColor || c : \"\\x1b[38;5;240m\") +\n (filled ? \"●\" : \"○\") +\n reset;\n void styledInner;\n } else {\n top += c + ch + reset;\n }\n }\n }\n for (let k = 0; k < rightFillN; k++) {\n top += colorAt(perimeterIndex(\"top\", xi++, W, bodyH)) + \"─\" + reset;\n }\n top += colorAt(perimeterIndex(\"top\", Math.min(xi, W - 1), W, bodyH)) + \"╮\" + reset;\n\n // Body: right edge T→B (offset y), left edge B→T (offset bodyH-1-y).\n const bodyRows: string[] = [];\n for (let y = 0; y < bodyH; y++) {\n const leftC = colorAt(perimeterIndex(\"left\", bodyH - 1 - y, W, bodyH));\n const rightC = colorAt(perimeterIndex(\"right\", y, W, bodyH));\n const vw = boxVisibleWidth(body[y]);\n const sp = Math.max(0, geo.contentW - vw);\n bodyRows.push(\n `${pad}${leftC}│${reset} ${body[y]}${\" \".repeat(sp)} ${rightC}│${reset}`\n );\n }\n\n // Bottom: clockwise means RIGHT → LEFT after finishing the right edge.\n // offset 0 = bottom-right ╯, offset W-1 = bottom-left ╰.\n let bottom = \"\";\n for (let x = 0; x < W; x++) {\n // visual column from right to left for index, but we emit left-to-right:\n // visual x maps to clockwise offset (W-1-x)\n const idx = perimeterIndex(\"bottom\", W - 1 - x, W, bodyH);\n const c = colorAt(idx);\n if (x === 0) bottom += c + \"╰\" + reset;\n else if (x === W - 1) bottom += c + \"╯\" + reset;\n else bottom += c + \"─\" + reset;\n }\n\n return [pad + top, ...bodyRows, pad + bottom];\n}\n\nconst C = {\n reset: \"\\x1b[0m\",\n dim: \"\\x1b[2m\",\n bold: \"\\x1b[1m\",\n cyan: \"\\x1b[36m\",\n green: \"\\x1b[32m\",\n yellow: \"\\x1b[33m\",\n red: \"\\x1b[31m\",\n blue: \"\\x1b[34m\",\n magenta: \"\\x1b[35m\",\n gray: themeGray,\n teal: \"\\x1b[38;5;37m\",\n};\n\n/**\n * One select-menu item rendered to physical box rows (label+hint row, plus an\n * optional dim detail row). Shared by `select` and `openLiveSelect` so every\n * menu — static or live — has identical row styling. All width math uses\n * VISIBLE width (wide glyphs count 2) so the right border stays aligned; each\n * returned row is ONE physical row so redraw math can't desync.\n *\n * `busyGlyph` replaces the pointer column with a spinner frame — the live\n * menu's \"loading in place\" cue on the row being entered.\n */\nfunction renderSelectItemRows(\n it: { label: string; hint?: string; detail?: string; disabled?: boolean },\n sel: boolean,\n contentW: number,\n busyGlyph?: string\n): string[] {\n const hint = it.hint ?? \"\";\n const hintW = boxVisibleWidth(hint);\n const pointerW = 2; // \"❯ \" or \" \"\n const labelMax = Math.max(4, contentW - pointerW - (hintW ? hintW + 2 : 0));\n let label = it.label.replace(/\\s+/g, \" \").trim();\n if (boxVisibleWidth(label) > labelMax) {\n while (label.length > 0 && boxVisibleWidth(label) > labelMax - 1) label = label.slice(0, -1);\n label += \"…\";\n }\n // busyGlyph arrives pre-styled (the standard brand-gradient spinner frame).\n const pointer = busyGlyph ? `${busyGlyph} ` : sel ? `${C.magenta}❯${C.reset} ` : \" \";\n const styledLabel = it.disabled\n ? `${C.gray}${label}${C.reset}`\n : sel\n ? `${C.bold}${C.cyan}${label}${C.reset}`\n : `${C.dim}${label}${C.reset}`;\n let content = `${pointer}${styledLabel}`;\n if (hintW) {\n const used = pointerW + boxVisibleWidth(label);\n const gap = Math.max(1, contentW - used - hintW);\n content += `${\" \".repeat(gap)}${sel ? C.gray : C.dim}${hint}${C.reset}`;\n }\n const rows = [content];\n if (it.detail) {\n let detail = it.detail.replace(/\\s+/g, \" \").trim();\n const detailMax = Math.max(4, contentW - pointerW - 1);\n if (boxVisibleWidth(detail) > detailMax) {\n while (detail.length > 0 && boxVisibleWidth(detail) > detailMax - 1) detail = detail.slice(0, -1);\n detail += \"…\";\n }\n // The detail line follows its label's selection state but one step down in\n // contrast, so label > detail reads as a hierarchy in BOTH states:\n // selected = dim cyan (vs the label's bold cyan), unselected = dim gray\n // (vs the label's plain dim).\n rows.push(`${\" \".repeat(pointerW)}${sel ? `${C.dim}${C.cyan}` : `${C.dim}${C.gray}`}${detail}${C.reset}`);\n }\n return rows;\n}\n\n// Synchronized output (DEC mode 2026) lets supporting terminals—including\n// Ghostty—present a complete HUD repaint atomically. Others safely ignore the\n// private mode. Routine repaint transactions deliberately leave cursor\n// visibility alone: tmux can expose a one-frame gap between CURSOR_HIDE and\n// CURSOR_SHOW even when both are sent in one write, which makes the input caret\n// flicker on every poll/animation tick. Destructive clears still hide it.\nconst SYNC_OUTPUT_BEGIN = \"\\x1b[?2026h\";\nconst SYNC_OUTPUT_END = \"\\x1b[?2026l\";\nconst CURSOR_HIDE = \"\\x1b[?25l\";\nconst CURSOR_SHOW = \"\\x1b[?25h\";\n\n// Dense braille frames — they fill more of the cell, so the spinner reads\n// clearly instead of looking like faint dots.\nconst FRAMES = [\"⣷\", \"⣯\", \"⣟\", \"⡿\", \"⢿\", \"⣻\", \"⣽\", \"⣾\"];\n// Spinner glyphs remain readable at ~14fps, while the perimeter glow targets\n// the terminal's typical 60Hz refresh for smooth travel around a wide box.\nconst SPINNER_FRAME_MS = 70;\nconst ANIMATION_TICK_MS = 1000 / 60;\n\n// Distinct hues cycled across concurrent subagents so each one reads as its own\n// stream (loader + label share the colour). Cyan is reserved for the main\n// working loader and orange for the compaction agent, so both are intentionally\n// absent here.\nconst SUBAGENT_COLORS = [\n \"\\x1b[35m\", // magenta\n \"\\x1b[38;5;39m\", // azure\n \"\\x1b[38;5;75m\", // blue\n \"\\x1b[32m\", // green\n \"\\x1b[38;5;141m\", // violet\n \"\\x1b[38;5;177m\", // orchid\n];\n\n// The compaction subagent is ALWAYS orange — a fixed signature colour so the\n// user instantly recognizes background context compaction, session after\n// session, regardless of what else is running.\nconst COMPACTION_COLOR = \"\\x1b[38;5;208m\";\nconst COMPACTION_AGENT = \"compaction_agent\";\n\ntype KeyHandler = (str: string | undefined, key: readline.Key) => void;\n\n/**\n * Approximate wcwidth: code points that render TWO terminal columns — CJK,\n * Hangul, fullwidth forms, and the emoji blocks. Everything else (including\n * ambiguous-width glyphs like box drawing, arrows, and the ⚙/⏳ badges, which\n * the terminals we target render narrow by default) counts one. Used by the\n * HUD width math so a wide character can't silently push a row past the\n * terminal edge and desync the redraw.\n */\nfunction isWideCodePoint(cp: number): boolean {\n return (\n (cp >= 0x1100 && cp <= 0x115f) || // Hangul Jamo\n (cp >= 0x2e80 && cp <= 0xa4cf) || // CJK radicals … Yi\n (cp >= 0xac00 && cp <= 0xd7a3) || // Hangul syllables\n (cp >= 0xf900 && cp <= 0xfaff) || // CJK compatibility ideographs\n (cp >= 0xfe30 && cp <= 0xfe4f) || // CJK compatibility forms\n (cp >= 0xff00 && cp <= 0xff60) || // fullwidth forms\n (cp >= 0xffe0 && cp <= 0xffe6) ||\n (cp >= 0x1f300 && cp <= 0x1faff) || // emoji\n cp >= 0x20000 // CJK extension planes\n );\n}\n\n/**\n * Neutralize control characters in a HUD row. An embedded newline (e.g. a\n * garbled multi-line step label when an upstream tool-call parse fails) makes\n * one \"row\" occupy several physical rows; the region-height math counts one,\n * so every subsequent redraw stamps the region's top rows into the scrollback\n * — the \"same two lines repeated for pages\" failure mode. Tabs are just as\n * bad (the terminal expands them to an uncounted width). Every control char\n * except the SGR escapes becomes a single space, and a stray ESC that isn't\n * starting a CSI sequence is dropped entirely.\n */\nfunction sanitizeHudRow(s: string): string {\n // eslint-disable-next-line no-control-regex\n return s.replace(/\\x1b(?!\\[)/g, \"\").replace(/[\\x00-\\x1a\\x1c-\\x1f\\x7f]/g, \" \");\n}\n\n/**\n * A slash command shown in the inline command palette. `name` is the word typed\n * after `/` (e.g. \"compact\"); typing filters the list by it. `hint` may be a\n * function so dynamic state (counts, level) stays fresh as the palette redraws.\n */\nexport interface SlashCommand {\n name: string;\n label: string;\n hint?: string | (() => string);\n run: () => void | Promise<void>;\n}\n\nexport class Tui {\n // input + indicators\n private inputBuffer = \"\";\n private cursorPos = 0; // caret index within inputBuffer (0..length)\n private lastCursorRow = 0; // caret's row offset from the input region top, last render\n private working = false;\n private workingStart = 0;\n // Slot-machine morph for the working label (Working → Brewing → …).\n private wordMill = new WordMill();\n private spinnerTimer: ReturnType<typeof setInterval> | null = null;\n private bgCount = 0;\n // The `[⚙ n bg]` prompt badge can be selected with ← from the start of the\n // input (rendered inverted); Enter then opens the background-process panel.\n private bgBadgeSelected = false;\n private queuedMessages: string[] = [];\n private subagents: { id: string; label: string; agentName?: string }[] = []; // active subagents (one line each)\n private subagentColorByID = new Map<string, number>(); // subagent id → SUBAGENT_COLORS index\n private tokensIn = 0; // cumulative input tokens\n private tokensOut = 0; // cumulative output tokens (includes the in-progress live count)\n private contextPct: number | null = null; // % of the model context window currently used\n\n // Live streaming preview, shown just above the status line while a turn runs:\n // the model's internal reasoning (dim italic) until the answer starts, then the\n // answer text (plain). Bounded to a tail; cleared when the message commits.\n private streamThinking = \"\";\n private streamResponse = \"\";\n private streamDraft: LiveDraftState = emptyLiveDraft();\n private streamMessageId: string | null = null; // the message currently previewing\n private streamRedrawTimer: ReturnType<typeof setTimeout> | null = null;\n private streamIdleTimer: ReturnType<typeof setTimeout> | null = null; // wipes a stale preview\n\n // Live goal checklist, fixed below the status bar. Driven by the goal_updated\n // thread event (+ an initial fetch). null = nothing to show.\n private goal: GoalData | null = null;\n // Set true the moment every step of a goal is done: the goal area is cleared\n // and the status line shows \"Goal complete.\" until the next turn starts.\n private goalComplete = false;\n\n // Inline slash-command palette: when the input starts with \"/\", the filtered\n // command list renders above the prompt and arrows/enter/tab drive it.\n private commands: SlashCommand[] = [];\n private slashIdx = 0; // highlighted index within the FILTERED command list\n private step: string | null = null; // current step label (e.g. \"writing index.html\")\n private stepStart = 0; // when the current step began (for the step's own elapsed)\n private stepOut = 0; // output tokens produced during the current step\n private connected = true;\n private bottomDrawn = false;\n private started = false;\n // Resize bookkeeping. When the terminal width changes, previously drawn HUD\n // rows re-wrap (a full-width ruler becomes 2+ physical rows when narrowed),\n // so the caret-relative move-up from the last paint is stale. We store the\n // visible width of EVERY region row (not just above the body) plus the caret\n // row index so regionTopSequence can recompute physical height under the new\n // wrap. Resize events are debounced — drag-resizing fires dozens of events\n // and redrawing each one desyncs and leaves ghost chrome.\n private lastDrawnCols = 0;\n /** Visible width of every HUD row from the last paint, top → bottom. */\n private drawnRegionWidths: number[] = [];\n /** Index into drawnRegionWidths of the row the caret sat on last paint. */\n private lastCaretRegionIndex = 0;\n private resizeTimer: ReturnType<typeof setTimeout> | null = null;\n /** True between a resize event and the debounced repaint — spinner ticks no-op. */\n private resizePending = false;\n /** @deprecated kept as alias during paint — prefer drawnRegionWidths */\n private drawnHudWidths: number[] = [];\n\n // takeover (approval / menu) state\n private takeoverHandler: KeyHandler | null = null;\n private bufferedPrints: string[] = [];\n // Plain readline prompts (notably the inline daemon installer) temporarily\n // own stdin. While they do, ignore the duplicate keypress events delivered\n // to this TUI; the outermost handoff restores raw/resumed input on return.\n private inputSuspendDepth = 0;\n\n // double-press-to-quit state: the first ctrl-c arms a brief window and shows a\n // transient hint; a second ctrl-c within the window actually quits.\n private quitArmed = false;\n private quitTimer: ReturnType<typeof setTimeout> | null = null;\n\n // bracketed-paste state\n private pasting = false;\n private pasteTimer: ReturnType<typeof setTimeout> | null = null;\n\n // Images pasted into the CURRENT input (Ctrl+V). Each got a `[#Image N]`\n // placeholder at the caret; on submit only images whose placeholder is still\n // present in the text are handed to onSubmit. Cleared with the input.\n private pendingImages: PastedImage[] = [];\n /** Portable file refs mirrored from another client. Their bytes remain in\n * the thread filesystem, so the TUI shows names without decoding them. */\n private externalAttachmentNames: string[] = [];\n private imagePasteBusy = false; // one clipboard read at a time\n\n // Sent-message history for ↑/↓ recall (oldest → newest). `historyIdx` is the\n // entry currently shown (null = not browsing); the in-progress draft is\n // stashed so cycling past the newest entry restores it. Any edit exits\n // browsing and keeps the recalled text as the new draft.\n private history: string[] = [];\n private historyIdx: number | null = null;\n private historyDraft = \"\";\n private historyDraftImages: PastedImage[] = [];\n\n // event hooks (wired by index.ts)\n onSubmit: (text: string, images: PastedImage[]) => void = () => {};\n /** Option/Alt+Return sends a steering input through the portable messaging endpoint. */\n onSteer: (text: string, images: PastedImage[]) => void = () => {};\n onInterrupt: () => void = () => {};\n /** Up on the top row: return true to consume it (e.g. pull a queued message)\n * before history recall gets a chance. */\n onUpArrow: () => boolean = () => false;\n /** Enter while the `[⚙ n bg]` badge is selected — opens the bg process panel. */\n onBgBadge: () => void = () => {};\n /** Fired (deduped) when the composer changes so index.ts can persist the\n * shared packed-endpoint draft, including attachments. */\n onDraftChange: (text: string, images: PastedImage[]) => void = () => {};\n private lastDraftSeen = \"\";\n private onQuit: () => void = () => process.exit(0);\n private levelListeners: ((l: Level) => void)[] = [];\n\n constructor(public level: Level = 1) {\n process.stdin.on(\"keypress\", (str, key) => {\n if (this.inputSuspendDepth === 0) this.dispatch(str, key);\n });\n restoreTuiInput();\n // Enable bracketed paste so a paste arrives atomically (newlines inside a\n // paste don't fire a premature submit) and restore it on exit.\n process.stdout.write(\"\\x1b[?2004h\");\n // Restore bracketed paste + the cursor on exit (e.g. ctrl-c mid-menu).\n process.on(\"exit\", () => process.stdout.write(\"\\x1b[?2004l\\x1b[?25h\"));\n // Debounced resize redraw — see scheduleResizeRedraw().\n process.stdout.on(\"resize\", () => this.scheduleResizeRedraw());\n }\n\n /**\n * Let a plain readline flow own stdin, then reliably hand it back to the TUI.\n * Supports nesting so a shared command may open more than one prompt.\n */\n async withSuspendedInput<T>(run: () => Promise<T>): Promise<T> {\n this.inputSuspendDepth++;\n if (this.inputSuspendDepth === 1) {\n process.stdout.write(\"\\x1b[?2004l\\x1b[?25h\");\n }\n try {\n return await run();\n } finally {\n this.inputSuspendDepth--;\n if (this.inputSuspendDepth === 0) {\n restoreTuiInput();\n process.stdout.write(\"\\x1b[?2004h\");\n }\n }\n }\n\n /**\n * Terminal resize fires continuously while the user drags. Redrawing on every\n * event desyncs the region-height math (each paint uses a half-rewrapped\n * intermediate width) and stamps ghost boxes into the scrollback. Wait for\n * the size to settle (~1–2 frames), then do one clean clear+repaint. While\n * pending, spinner ticks skip paint so they don't thrash mid-drag.\n */\n private scheduleResizeRedraw(): void {\n this.resizePending = true;\n if (this.resizeTimer) clearTimeout(this.resizeTimer);\n this.resizeTimer = setTimeout(() => {\n this.resizeTimer = null;\n this.resizePending = false;\n if (!this.started || this.takeoverHandler) return;\n this.renderBottom();\n }, 40);\n }\n\n get colors() {\n return C;\n }\n\n setQuitHandler(fn: () => void): void {\n this.onQuit = fn;\n }\n\n /**\n * Handle a ctrl-c. The first press arms a 2-second window and surfaces a\n * transient \"Press Control-C again to exit\" hint in the bottom region; a\n * second press within the window quits. After the window lapses the hint\n * clears and the next ctrl-c starts over — so it always takes two.\n */\n requestQuit(): void {\n if (this.quitArmed) {\n if (this.quitTimer) clearTimeout(this.quitTimer);\n this.quitTimer = null;\n this.quitArmed = false;\n this.onQuit();\n return;\n }\n this.quitArmed = true;\n this.renderBottom();\n this.quitTimer = setTimeout(() => {\n this.quitArmed = false;\n this.quitTimer = null;\n this.renderBottom();\n }, 2000);\n }\n\n /** Tear down the bottom region and restore the terminal (called on quit). */\n end(): void {\n // Freeze first so any in-flight spinner / stream / quit timers cannot\n // re-paint the boxed HUD after we clear it (quit is async and awaits\n // backend stop for up to ~1.5s — a 70ms spinner tick would otherwise\n // redraw the input box and garble the farewell message into it).\n this.started = false;\n this.working = false;\n this.subagents = [];\n if (this.quitTimer) clearTimeout(this.quitTimer);\n this.quitTimer = null;\n if (this.streamIdleTimer) clearTimeout(this.streamIdleTimer);\n this.streamIdleTimer = null;\n if (this.streamRedrawTimer) {\n clearTimeout(this.streamRedrawTimer);\n this.streamRedrawTimer = null;\n }\n if (this.resizeTimer) {\n clearTimeout(this.resizeTimer);\n this.resizeTimer = null;\n }\n if (this.spinnerTimer) {\n clearInterval(this.spinnerTimer);\n this.spinnerTimer = null;\n }\n this.clearBottom();\n process.stdout.write(\"\\x1b[?2004l\\x1b[?25h\");\n }\n onLevelChange(fn: (l: Level) => void): void {\n this.levelListeners.push(fn);\n }\n\n /** Carrot colour by level — cooler/safer (low) to warmer/permissive (high). */\n levelColor(): string {\n return { 1: C.cyan, 2: C.green, 3: C.yellow, 4: C.magenta, 5: C.red }[this.level];\n }\n\n // ─── key dispatch ──────────────────────────────────────────────────────────\n\n private dispatch(str: string | undefined, key: readline.Key): void {\n const seq = (key && key.sequence) || str || \"\";\n\n // Shift+Enter inserts a NEWLINE (the near-universal multiline gesture).\n // The robust signal is a bare LF (\"\\n\"): Ghostty/iTerm2/WezTerm and many\n // others send \"\\n\" for Shift+Enter (often by default, otherwise\n // configurable) while plain Enter sends CR (\"\\r\"). We also accept the\n // Kitty (\"\\x1b[13;2u\") and modifyOtherKeys (\"\\x1b[27;2;13~\") forms for\n // terminals that emit those. Checked before readline's ordinary Enter\n // handling because a raw \"\\n\" may not be labeled as Return by every\n // terminal. Steering moved to Option/Alt+Return.\n if (seq === \"\\n\" || seq === \"\\x1b[13;2u\" || seq === \"\\x1b[27;2;13~\") {\n if (!this.takeoverHandler && !this.pasting && !this.paletteOpen()) this.insertAtCursor(\"\\n\");\n return;\n }\n\n if (key && key.ctrl && key.name === \"c\") {\n this.requestQuit();\n return;\n }\n if (key && key.name === \"tab\" && key.shift) {\n this.cycleLevel();\n return;\n }\n\n // Bracketed paste: everything between the start/end markers is literal text,\n // even newlines. Handle it before any other key logic so a pasted Return\n // doesn't submit and a pasted \"/\" doesn't open the menu.\n if (!this.pasting && seq.includes(\"\\x1b[200~\")) {\n this.pasting = true;\n this.armPasteSafety();\n this.handlePasteChunk(seq.slice(seq.indexOf(\"\\x1b[200~\") + 6));\n return;\n }\n if (this.pasting) {\n this.armPasteSafety();\n this.handlePasteChunk(seq);\n return;\n }\n\n // A takeover (approval/menu) owns the keyboard while active.\n if (this.takeoverHandler) {\n this.takeoverHandler(str, key);\n return;\n }\n if (!key) return;\n\n // While the `[⚙ n bg]` badge is selected, Enter opens the background-process\n // panel, → / Escape step back into the input, ← stays put (nothing further\n // left), and any other key deselects and is handled as normal input.\n if (this.bgBadgeSelected) {\n if (key.name === \"return\" || key.name === \"enter\") {\n this.bgBadgeSelected = false;\n this.renderBottom();\n this.onBgBadge();\n return;\n }\n if (key.name === \"left\") return;\n this.bgBadgeSelected = false;\n if (key.name === \"right\" || key.name === \"escape\") {\n this.renderBottom();\n return;\n }\n this.renderBottom();\n // fall through: the key edits/moves as usual\n }\n\n // Inline slash-command palette owns navigation while the input starts with\n // \"/\". Editing keys (printable/backspace/left/right) fall through to the\n // normal input logic below, which re-filters the palette on the next render.\n if (this.paletteOpen()) {\n const matches = this.filteredCommands();\n const cur = matches.length ? Math.min(this.slashIdx, matches.length - 1) : 0;\n if (key.name === \"up\") {\n if (matches.length) {\n this.slashIdx = (cur - 1 + matches.length) % matches.length;\n this.renderBottom();\n }\n return;\n }\n if (key.name === \"down\") {\n if (matches.length) {\n this.slashIdx = (cur + 1) % matches.length;\n this.renderBottom();\n }\n return;\n }\n if (key.name === \"tab\") {\n if (matches.length) {\n this.inputBuffer = \"/\" + matches[cur].name;\n this.cursorPos = this.inputBuffer.length;\n this.slashIdx = 0;\n this.renderBottom();\n }\n return;\n }\n if (key.name === \"return\" || key.name === \"enter\") {\n // Slash commands remain commands; Shift+Return does not steer their\n // literal palette text into the conversation.\n if (key.shift) return;\n if (matches.length) this.runCommand(matches[cur]);\n return; // never submit a \"/…\" line as a chat message\n }\n if (key.name === \"escape\") {\n this.inputBuffer = \"\";\n this.cursorPos = 0;\n this.slashIdx = 0;\n this.renderBottom();\n return;\n }\n // any other key falls through to normal editing (palette re-filters live)\n }\n\n if (key.name === \"escape\") {\n this.onInterrupt();\n return;\n }\n // Caret movement within the (possibly wrapped) input.\n if (key.name === \"left\") {\n if (this.cursorPos > 0) {\n this.cursorPos--;\n this.renderBottom();\n } else if (this.bgCount > 0) {\n // Caret already at the start — ← \"selects\" the [⚙ n bg] badge.\n this.bgBadgeSelected = true;\n this.renderBottom();\n }\n return;\n }\n if (key.name === \"right\") {\n if (this.cursorPos < this.inputBuffer.length) {\n this.cursorPos++;\n this.renderBottom();\n }\n return;\n }\n if (key.name === \"home\" || (key.ctrl && key.name === \"a\")) {\n this.cursorPos = 0;\n this.renderBottom();\n return;\n }\n if (key.name === \"end\" || (key.ctrl && key.name === \"e\")) {\n this.cursorPos = this.inputBuffer.length;\n this.renderBottom();\n return;\n }\n // Up: move the caret up a visual row when it isn't on the top one —\n // history recall must never hijack cursor movement inside multi-line text.\n // On the TOP row: first offer the key to onUpArrow (pulling a queued\n // message back), then recall the previous history entry.\n if (key.name === \"up\") {\n const { caretRow } = this.inputLayout();\n if (caretRow > 0) {\n this.moveCaretVertical(-1);\n return;\n }\n if (this.onUpArrow()) return;\n this.historyPrev();\n return;\n }\n // Down mirrors up: move the caret down a row unless it's on the bottom\n // one; from the bottom row, step forward through history (past the newest\n // entry restores whatever was being typed).\n if (key.name === \"down\") {\n const { caretRow, rowCount } = this.inputLayout();\n if (caretRow < rowCount - 1) {\n this.moveCaretVertical(1);\n return;\n }\n this.historyNext();\n return;\n }\n if (key.name === \"return\" || key.name === \"enter\") {\n // Option/Alt+Return steers; Shift+Return inserts a newline (multiline).\n if (key.meta) {\n this.submitInput(true);\n return;\n }\n if (key.shift) {\n this.insertAtCursor(\"\\n\");\n return;\n }\n this.submitInput(false);\n return;\n }\n // Ctrl+V: paste an image from the system clipboard. Terminals only deliver\n // TEXT through bracketed paste, so an image needs this explicit ask — we\n // read the clipboard and drop an `[#Image N]` placeholder at the caret.\n if (key.ctrl && key.name === \"v\") {\n void this.pasteClipboardImage();\n return;\n }\n if (key.name === \"backspace\") {\n if (this.cursorPos > 0) {\n this.inputBuffer =\n this.inputBuffer.slice(0, this.cursorPos - 1) + this.inputBuffer.slice(this.cursorPos);\n this.cursorPos--;\n this.slashIdx = 0;\n this.historyIdx = null;\n this.renderBottom();\n }\n return;\n }\n if (key.name === \"delete\") {\n if (this.cursorPos < this.inputBuffer.length) {\n this.inputBuffer =\n this.inputBuffer.slice(0, this.cursorPos) + this.inputBuffer.slice(this.cursorPos + 1);\n this.slashIdx = 0;\n this.historyIdx = null;\n this.renderBottom();\n }\n return;\n }\n if (key.ctrl || key.meta || key.name === \"tab\") return;\n if (str && str >= \" \") {\n this.insertAtCursor(str);\n }\n }\n\n private submitInput(steer: boolean): void {\n const text = this.inputBuffer;\n // Only images whose placeholder survived editing ride along.\n const images = this.pendingImages.filter((img) => text.includes(imagePlaceholder(img.seq)));\n const hasExternalAttachments = this.externalAttachmentNames.length > 0;\n this.inputBuffer = \"\";\n this.cursorPos = 0;\n this.pendingImages = [];\n this.externalAttachmentNames = [];\n this.historyIdx = null;\n this.historyDraft = \"\";\n this.historyDraftImages = [];\n this.renderBottom();\n if (!text.trim() && !hasExternalAttachments && images.length === 0) return;\n if (text.trim()) this.addHistoryEntry(text.trim());\n if (steer) this.onSteer(text.trim(), images);\n else this.onSubmit(text.trim(), images);\n }\n\n private insertAtCursor(text: string): void {\n this.inputBuffer = this.inputBuffer.slice(0, this.cursorPos) + text + this.inputBuffer.slice(this.cursorPos);\n this.cursorPos += text.length;\n this.slashIdx = 0; // re-anchor the palette highlight to the top match as the filter changes\n this.historyIdx = null; // an edit exits history browsing; the text is the new draft\n this.renderBottom();\n }\n\n /** Insert a paste fragment at the caret; collapse newlines (single-line input). */\n private handlePasteChunk(chunk: string): void {\n const end = chunk.indexOf(\"\\x1b[201~\");\n const content = (end >= 0 ? chunk.slice(0, end) : chunk).replace(/[\\r\\n]+/g, \" \");\n if (content) {\n this.inputBuffer =\n this.inputBuffer.slice(0, this.cursorPos) + content + this.inputBuffer.slice(this.cursorPos);\n this.cursorPos += content.length;\n this.historyIdx = null;\n }\n if (end >= 0) {\n this.pasting = false;\n if (this.pasteTimer) {\n clearTimeout(this.pasteTimer);\n this.pasteTimer = null;\n }\n }\n this.renderBottom();\n }\n\n /** Never let a missed end-marker wedge the input: clear paste mode shortly. */\n private armPasteSafety(): void {\n if (this.pasteTimer) clearTimeout(this.pasteTimer);\n this.pasteTimer = setTimeout(() => {\n this.pasting = false;\n this.pasteTimer = null;\n this.renderBottom();\n }, 2000);\n }\n\n // ─── input layout + vertical caret movement ────────────────────────────────\n\n /**\n * The input's physical rows (same wrapping math as the boxed input body:\n * logical lines split on \"\\n\", line 0 led by the prompt prefix, each wrapping\n * at the box content width) plus where the caret sits among them. Each row\n * records the buffer index of its first character, its character count, and\n * the visual column its first character renders at (only the first physical\n * row of line 0 is offset, by the prompt). Drives ↑/↓: row 0 is \"the top\n * line\" (history recall territory), anything below moves the caret instead.\n */\n private inputLayout(): {\n rows: { start: number; len: number; colOffset: number }[];\n caretRow: number;\n caretCol: number;\n rowCount: number;\n } {\n const cols = process.stdout.columns || 80;\n const { contentW } = inputBoxGeometry(cols);\n const pw = this.visibleWidth(this.promptPrefix());\n const lines = this.inputBuffer.split(\"\\n\");\n const rows: { start: number; len: number; colOffset: number }[] = [];\n let offset = 0;\n for (let i = 0; i < lines.length; i++) {\n const len = lines[i].length;\n // Match wrapInputBodyLines: every physical row reserves prefixWidth at the\n // left (real prompt on the first row, spaces on later rows) so hard\n // newlines and soft wraps line up under the first line's text.\n let remaining = len;\n let charStart = 0;\n do {\n const avail = Math.max(0, contentW - pw);\n let take = Math.min(remaining, avail);\n if (take === 0 && avail === 0 && remaining > 0) take = 1;\n rows.push({ start: offset + charStart, len: take, colOffset: pw });\n charStart += take;\n remaining -= take;\n } while (remaining > 0);\n offset += len + 1; // +1 consumes the \"\\n\"\n }\n // Locate the caret among the physical rows.\n let caretRow = 0;\n let caretCol = 0;\n let found = false;\n for (let r = 0; r < rows.length; r++) {\n const row = rows[r];\n const rowEnd = row.start + row.len;\n const isLast = r === rows.length - 1;\n // Caret lands on this row when it falls inside [start, end), or at `end`\n // when this is the last row OR the next row starts after end (hard newline\n // gap — next row.start === end+1 after the \"\\n\").\n const nextStart = isLast ? rowEnd : rows[r + 1].start;\n if (this.cursorPos < rowEnd || (this.cursorPos === rowEnd && (isLast || nextStart > rowEnd))) {\n caretRow = r;\n caretCol = row.colOffset + (this.cursorPos - row.start);\n found = true;\n break;\n }\n }\n if (!found && rows.length) {\n caretRow = rows.length - 1;\n const row = rows[caretRow];\n caretCol = row.colOffset + row.len;\n }\n // Caret exactly on a wrap boundary past the last row — synthesize an empty\n // trailing row so vertical movement stays in bounds.\n while (caretRow >= rows.length) {\n rows.push({ start: this.inputBuffer.length, len: 0, colOffset: 0 });\n }\n return { rows, caretRow, caretCol, rowCount: rows.length };\n }\n\n /** Move the caret one visual row up/down, keeping the column when possible. */\n private moveCaretVertical(delta: -1 | 1): void {\n const { rows, caretRow, caretCol } = this.inputLayout();\n const target = caretRow + delta;\n if (target < 0 || target >= rows.length) return;\n const row = rows[target];\n const within = Math.max(0, Math.min(caretCol - row.colOffset, row.len));\n this.cursorPos = Math.min(row.start + within, this.inputBuffer.length);\n this.renderBottom();\n }\n\n // ─── sent-message history (↑/↓ recall) ─────────────────────────────────────\n\n /** Seed the recall history (oldest → newest), e.g. from the on-disk file. */\n setHistory(entries: string[]): void {\n this.history = entries.filter((e) => e.trim() !== \"\");\n }\n\n /** Record a sent message (skipping a consecutive duplicate). */\n private addHistoryEntry(text: string): void {\n if (this.history[this.history.length - 1] === text) return;\n this.history.push(text);\n }\n\n /** Recall the previous (older) history entry; stashes the draft first. */\n private historyPrev(): void {\n if (!this.history.length) return;\n if (this.historyIdx === null) {\n this.historyDraft = this.inputBuffer;\n this.historyDraftImages = this.pendingImages;\n this.historyIdx = this.history.length - 1;\n } else if (this.historyIdx > 0) {\n this.historyIdx--;\n } else {\n return; // already at the oldest entry\n }\n this.pendingImages = [];\n this.inputBuffer = this.history[this.historyIdx];\n this.cursorPos = this.inputBuffer.length;\n this.slashIdx = 0;\n this.renderBottom();\n }\n\n /** Step toward the newest entry; past it, restore the stashed draft. */\n private historyNext(): void {\n if (this.historyIdx === null) return; // not browsing — down does nothing\n if (this.historyIdx < this.history.length - 1) {\n this.historyIdx++;\n this.pendingImages = [];\n this.inputBuffer = this.history[this.historyIdx];\n } else {\n this.historyIdx = null;\n this.inputBuffer = this.historyDraft;\n this.pendingImages = this.historyDraftImages;\n this.historyDraft = \"\";\n this.historyDraftImages = [];\n }\n this.cursorPos = this.inputBuffer.length;\n this.slashIdx = 0;\n this.renderBottom();\n }\n\n // ─── clipboard image paste (Ctrl+V) ────────────────────────────────────────\n\n /**\n * Read an image off the system clipboard and drop an `[#Image N]`\n * placeholder at the caret. The bytes ride along with the message on submit\n * (as a real attachment) as long as the placeholder is still in the text —\n * delete the placeholder and the image is dropped too.\n */\n private async pasteClipboardImage(): Promise<void> {\n if (this.imagePasteBusy) return;\n this.imagePasteBusy = true;\n try {\n const img = await readClipboardImage();\n if (!img) {\n this.print(`${C.dim}No image on the clipboard.${C.reset}`);\n return;\n }\n const seq = this.pendingImages.reduce((m, i) => Math.max(m, i.seq), 0) + 1;\n this.pendingImages.push({ seq, data: img.data, mime: img.mime });\n this.insertAtCursor(imagePlaceholder(seq));\n } finally {\n this.imagePasteBusy = false;\n }\n }\n\n private cycleLevel(): void {\n const idx = LEVELS.indexOf(this.level);\n this.setLevel(LEVELS[(idx + 1) % LEVELS.length]);\n }\n\n setLevel(level: Level): void {\n if (level === this.level) return;\n this.level = level;\n this.levelListeners.forEach((fn) => fn(this.level));\n this.print(`${this.levelColor()}${levelLabel(this.level)}${C.reset}`);\n }\n\n // ─── bottom input line ───────────────────────────────────────────────────\n\n /** Begin showing the persistent input line. */\n start(): void {\n this.started = true;\n this.renderBottom();\n }\n\n /** Format an elapsed millisecond span as 45s / 2m 05s / 1h 05m. */\n private formatElapsed(ms: number): string {\n const s = Math.floor(ms / 1000);\n if (s < 60) return `${s}s`;\n const m = Math.floor(s / 60);\n if (m < 60) return `${m}m ${String(s % 60).padStart(2, \"0\")}s`;\n const h = Math.floor(m / 60);\n return `${h}h ${String(m % 60).padStart(2, \"0\")}m`;\n }\n\n /** Compact token count: 945 → \"945\", 12345 → \"12.35k\", 1_250_000 → \"1.25M\". */\n private fmtTokens(n: number): string {\n if (n < 1000) return String(n);\n if (n < 1_000_000) return `${(n / 1000).toFixed(2)}k`;\n return `${(n / 1_000_000).toFixed(2)}M`;\n }\n\n private spinnerFrame(): string {\n // The main loader is a brand moment: the glyph spins fast and its colour\n // drifts through the brand gradient in step with the shimmering label.\n const now = Date.now();\n return `${C.bold}${brandCycleColor(now)}${FRAMES[Math.floor(now / SPINNER_FRAME_MS) % FRAMES.length]}${C.reset}`;\n }\n\n /** \"↑X ↓Y\" cumulative token totals (greyed — low-priority). */\n private tokensText(): string {\n const parts: string[] = [];\n if (this.tokensIn > 0) parts.push(`↑${this.fmtTokens(this.tokensIn)}`);\n if (this.tokensOut > 0) parts.push(`↓${this.fmtTokens(this.tokensOut)}`);\n return parts.length ? `${C.gray}${parts.join(\" \")}${C.reset}` : \"\";\n }\n\n /**\n * Context-to-compaction gauge, right-aligned on the status line: just \"N%\"\n * in dull grey. Shown whenever we know a value (any fill — 5%, 10%, 20%…).\n * The percentage is scaled so 100% = where background compaction triggers,\n * not the raw model window.\n */\n private contextGaugeText(): string {\n if (this.contextPct == null) return \"\";\n // Soft 256-grey — readable but never competing with spinner / tokens.\n return `\\x1b[38;5;240m${this.contextPct}%${C.reset}`;\n }\n\n /**\n * Set the context-window fill percentage (0–100), or null to hide it.\n * Driven by the runtime's `context_usage` KV, scaled to the compaction\n * trigger. Always painted on the status line far right.\n */\n setContextPct(pct: number | null): void {\n const next = pct == null ? null : Math.max(0, Math.min(100, Math.round(pct)));\n if (next === this.contextPct) return;\n this.contextPct = next;\n this.renderBottom();\n }\n\n /** Plain context label (no ANSI) for menu hints, or \"\" when unknown. */\n contextPctLabel(): string {\n return this.contextPct == null ? \"\" : `context ${this.contextPct}%`;\n }\n\n /** Register the slash commands shown in the inline `/` palette. */\n setCommands(commands: SlashCommand[]): void {\n this.commands = commands;\n }\n\n /** Is the `/` command palette currently showing? (input starts with \"/\".) */\n private paletteOpen(): boolean {\n return this.started && !this.takeoverHandler && this.commands.length > 0\n && this.externalAttachmentNames.length === 0 && this.inputBuffer.startsWith(\"/\");\n }\n\n /** Commands matching the text typed after \"/\", in declared order. */\n private filteredCommands(): SlashCommand[] {\n if (!this.inputBuffer.startsWith(\"/\")) return [];\n const q = this.inputBuffer.slice(1).trim().toLowerCase();\n if (q === \"\") return this.commands;\n return this.commands.filter(\n (c) => c.name.startsWith(q) || c.name.includes(q) || c.label.toLowerCase().includes(q)\n );\n }\n\n private runCommand(cmd: SlashCommand): void {\n this.inputBuffer = \"\";\n this.cursorPos = 0;\n this.slashIdx = 0;\n this.renderBottom();\n void Promise.resolve(cmd.run()).catch(() => {});\n }\n\n /**\n * The summary line ABOVE the prompt. While working it reads\n * `⣷ Working <step> <elapsed> ↑in ↓out`; when idle it keeps the cumulative\n * token totals visible (`↑in ↓out`) so they live in the summary rather than\n * crowding the prompt. Null when idle with nothing counted yet.\n */\n private statusLineText(cols: number): string | null {\n const tk = this.tokensText();\n const gauge = this.contextGaugeText();\n // Reserve room on the right for the context gauge so it can sit flush\n // against the terminal edge without ever wrapping the row.\n const gaugeReserve = gauge ? this.visibleWidth(gauge) + 1 : 0;\n let line: string | null;\n if (this.working) {\n const el = this.formatElapsed(Date.now() - this.workingStart);\n const right = `${C.dim}${el}${C.reset}${tk ? \" \" + tk : \"\"}`;\n const head = `${this.spinnerFrame()} ${this.wordMill.text(Date.now())}`;\n const avail = Math.max(\n 0,\n cols - this.visibleWidth(head) - this.visibleWidth(right) - 2 - gaugeReserve\n );\n let stepPart = \"\";\n if (this.step && avail > 1) {\n let s = this.step;\n if (s.length > avail) s = s.slice(0, avail - 1) + \"…\";\n stepPart = ` ${C.dim}${s}${C.reset}`;\n }\n line = `${head}${stepPart} ${right}`;\n } else if (this.goalComplete) {\n // Idle. Once a goal's every step is done we surface \"Goal complete.\" here\n // (the goal area itself is cleared) until the next turn begins.\n const done = `${C.bold}${gradientText(\"✓ Goal complete.\")}${C.reset}`;\n line = tk ? `${done} ${tk}` : done;\n } else {\n line = tk ? tk : null;\n }\n if (!gauge) return line;\n const base = line ?? \"\";\n const pad = Math.max(1, cols - 1 - this.visibleWidth(base) - this.visibleWidth(gauge));\n return `${base}${\" \".repeat(pad)}${gauge}`;\n }\n\n /** The prompt line prefix (with ANSI colour) that precedes the typed text. */\n private promptPrefix(): string {\n // Bg badge + level-tinted carrot. Permission level also appears in the\n // box top-border (far right); metrics live on the status line above.\n // (Queued messages render as their own HUD rows above the box, NOT as a\n // prompt badge — a badge here shifts the caret math.)\n const attachments = this.externalAttachmentNames.length > 0\n ? `${C.gray}[📎 ${this.externalAttachmentNames.length}]${C.reset} `\n : \"\";\n // The bg badge renders inverted (reverse video) while selected via ←.\n const bgText = `[⚙ ${this.bgCount} bg]`;\n const bg =\n this.bgCount > 0\n ? this.bgBadgeSelected\n ? `${C.cyan}\\x1b[7m${bgText}\\x1b[27m${C.reset} `\n : `${C.cyan}${bgText}${C.reset} `\n : \"\";\n return `${attachments}${bg}${this.levelColor()}❯${C.reset} `;\n }\n\n private visibleWidth(s: string): number {\n // eslint-disable-next-line no-control-regex\n let w = 0;\n for (const ch of s.replace(/\\x1b\\[[0-9;]*m/g, \"\")) {\n w += isWideCodePoint(ch.codePointAt(0)!) ? 2 : 1;\n }\n return w;\n }\n\n /**\n * Truncate a styled string to at most `max` VISIBLE columns, copying ANSI\n * escape sequences through without counting them and appending a reset if it\n * cut mid-style. The redraw's whole height math assumes every HUD row is\n * exactly ONE physical terminal row — true only while each row's visible\n * width is strictly less than `cols`. A row of width == cols hits the\n * terminal's auto-wrap boundary: many terminals push the cursor to the next\n * line, so the following CR/LF yields an EXTRA physical row we didn't count,\n * and the region marches down the screen leaving a trail on every tick. Every\n * HUD row is clamped through here to keep that invariant no matter what any\n * individual line builder produces.\n */\n private clampVisible(s: string, max: number): string {\n let out = \"\";\n let width = 0;\n let i = 0;\n let truncated = false;\n while (i < s.length) {\n if (s[i] === \"\\x1b\" && s[i + 1] === \"[\") {\n let j = i + 2;\n while (j < s.length && !/[a-zA-Z]/.test(s[j])) j++;\n out += s.slice(i, j + 1); // copy the full escape sequence verbatim\n i = j + 1;\n continue;\n }\n // Advance by code point, counting terminal COLUMNS (a CJK/emoji glyph\n // occupies two) so a wide character can't sneak the row past `max`.\n const cp = s.codePointAt(i)!;\n const chLen = cp > 0xffff ? 2 : 1;\n const chWidth = isWideCodePoint(cp) ? 2 : 1;\n if (width + chWidth > max) {\n truncated = true;\n break;\n }\n out += s.slice(i, i + chLen);\n width += chWidth;\n i += chLen;\n }\n if (truncated) out += C.reset;\n return out;\n }\n\n /**\n * The slash-palette block rendered BELOW the input. While the palette is open\n * we reserve a fixed number of rows — one per available command — padding with\n * blank rows so the region height never changes as the filter narrows. That\n * pins the input: the region scrolls into place once when the palette opens,\n * then nothing below the input resizes, so the text you're typing never jumps.\n * Returns `[]` when the palette is closed (no reservation, input sits at the\n * bottom as usual).\n */\n private paletteBlockLines(cols: number): string[] {\n if (!this.paletteOpen()) return [];\n const rows = this.paletteLines(cols).map((r) => this.clampVisible(r, Math.max(1, cols - 1)));\n const reserved = Math.max(this.commands.length, rows.length);\n while (rows.length < reserved) rows.push(\"\"); // blank padding holds the height\n return rows;\n }\n\n /**\n * Build the slash-palette rows for the current filter. Each row is clamped to\n * ONE physical line (a wrapped row would desync the move-up redraw), with the\n * `/name` highlighted, the label dimmed, and the hint right-aligned.\n */\n private paletteLines(cols: number): string[] {\n if (!this.paletteOpen()) return [];\n const matches = this.filteredCommands();\n if (matches.length === 0) return [` ${C.gray}no matching command${C.reset}`];\n const cur = Math.min(this.slashIdx, matches.length - 1);\n const pointerW = 2;\n // Keep the row strictly inside the terminal width so the last hint\n // character survives the one-column auto-wrap safety margin applied by\n // paletteBlockLines().\n const rowCols = Math.max(1, cols - 1);\n return matches.map((cmd, i) => {\n const sel = i === cur;\n const hint = (typeof cmd.hint === \"function\" ? cmd.hint() : cmd.hint) ?? \"\";\n const hintW = hint.length;\n const name = `/${cmd.name}`;\n let visible = `${name} ${cmd.label}`;\n const labelMax = Math.max(6, rowCols - pointerW - (hintW ? hintW + 2 : 0));\n if (visible.length > labelMax) visible = visible.slice(0, labelMax - 1) + \"…\";\n const desc = visible.slice(name.length); // \" <label…>\" (or \"…\" if name was clipped)\n const pointer = sel ? `${C.magenta}❯${C.reset} ` : \" \";\n const nameStyled = sel ? `${C.bold}${C.cyan}${name}${C.reset}` : `${C.cyan}${name}${C.reset}`;\n let line = `${pointer}${nameStyled}${C.gray}${desc}${C.reset}`;\n if (hintW) {\n const gap = Math.max(2, rowCols - pointerW - visible.length - hintW);\n line += `${\" \".repeat(gap)}${C.gray}${hint}${C.reset}`;\n }\n return line;\n });\n }\n\n /**\n * Physical rows a previously painted line of visible width `w` occupies after\n * the terminal rewraps it to `cols`. Hard-written HUD lines reflow this way.\n */\n private rewrapRows(w: number, cols: number): number {\n return Math.max(1, Math.ceil(Math.max(w, 1) / Math.max(1, cols)));\n }\n\n /**\n * Move the cursor to the top-left of the current bottom region.\n *\n * Same width as the last draw → the caret's recorded row offset is exact.\n * Width CHANGED (terminal resized) → previously drawn rows re-wrapped, so\n * that offset is stale. Recompute using every stored region row width under\n * the NEW wrap: rows above the caret row + (caret row's rewrap − 1) so we\n * prefer a slight over-move (clean wipe) over under-move (ghost chrome).\n */\n private regionTopSequence(): string {\n let sequence = \"\\r\";\n if (!this.bottomDrawn) return sequence;\n const cols = process.stdout.columns || 80;\n let up: number;\n if (cols !== this.lastDrawnCols && this.lastDrawnCols > 0 && this.drawnRegionWidths.length) {\n // Prefer the full-region width list; fall back to the legacy above-body list.\n const widths =\n this.drawnRegionWidths.length > 0 ? this.drawnRegionWidths : this.drawnHudWidths;\n const caretIdx = Math.max(\n 0,\n Math.min(this.lastCaretRegionIndex, Math.max(0, widths.length - 1))\n );\n let above = 0;\n for (let i = 0; i < caretIdx; i++) above += this.rewrapRows(widths[i], cols);\n // Caret row may itself soft-wrap under the new width. Terminals usually\n // keep the cursor on the last physical segment when the line grew longer\n // than the new width at the caret column — use (rewrap − 1) so we never\n // under-move and leave a ghost top border above the clear.\n const caretPhysical = this.rewrapRows(widths[caretIdx] ?? 1, cols);\n up = above + Math.max(0, caretPhysical - 1);\n // Safety pad on resize only: one extra row absorbs off-by-one rewrap\n // disagreements across terminals (some count the wrap boundary differently).\n up += 1;\n } else {\n up = this.lastCursorRow;\n }\n if (up > 0) sequence += `\\x1b[${up}A`;\n return sequence;\n }\n\n /**\n * Render the bottom region: status + subagents above a side-margined expanding\n * input box (level in the top border far right), with the caret on the input\n * body. Uses only relative cursor moves so it survives terminal scrolling when\n * the region grows near the bottom of the screen.\n *\n * Layout (top → bottom):\n * preview · ruler · notice · quit · status · subagents · goal ·\n * box top (level) · box body · box bottom · palette\n */\n private renderBottom(): void {\n if (!this.started || this.takeoverHandler) return; // not yet active, or a takeover owns the bottom\n // Notify presence of a draft change (deduped — status-only redraws don't fire).\n if (this.inputBuffer !== this.lastDraftSeen) {\n this.lastDraftSeen = this.inputBuffer;\n const images = this.pendingImages.filter((img) => this.inputBuffer.includes(imagePlaceholder(img.seq)));\n try { this.onDraftChange(this.inputBuffer, images); } catch { /* draft sync is best-effort */ }\n }\n // Mid-drag: terminal width is in flux — don't paint until the debounced\n // resize handler fires one authoritative clear+repaint.\n if (this.resizePending) return;\n const cols = process.stdout.columns || 80;\n\n // Capture movement from the OLD frame before this render updates its row\n // bookkeeping. It is emitted later as part of one synchronized write.\n const moveToTop = this.regionTopSequence();\n\n // Visible width of every HUD row this draw (full region). Resize path uses\n // the full list so body / bottom border / palette rewraps are counted too.\n const hudWidths: number[] = [];\n // Buffer every row into one string and flush in a single write() —\n // flushing each row separately makes the redraw flicker on every tick.\n const hudRows: string[] = [];\n // Clamp EVERY row to one column short of the terminal width so it can never\n // hit the auto-wrap boundary and silently consume a second physical row\n // (see clampVisible). This is what keeps the region-height math exact.\n const rowCap = Math.max(1, cols - 1);\n const writeHudRow = (line: string) => {\n // Sanitize BEFORE clamping: an embedded newline or tab (a garbled step\n // label, a multi-line subagent status) would add physical rows/columns\n // the region math doesn't count, and the redraw would then stamp the\n // region's top rows into the scrollback on every tick.\n const row = this.clampVisible(sanitizeHudRow(line), rowCap);\n hudWidths.push(this.visibleWidth(row));\n hudRows.push(row);\n };\n\n // ── output zone (above the work-area ruler) ──────────────────────────────\n // Live streaming preview (reasoning dim-italic, then the answer plain),\n // bounded to a tail. This is model OUTPUT, so it belongs with the transcript\n // ABOVE the ruler — never interleaved between the status and subagent lines.\n // Cleared on commit.\n const previewLines = this.streamPreviewLines(cols);\n for (const line of previewLines) writeHudRow(line);\n\n // ── work area (the pinned HUD, below a full-width ruler) ──────────────────\n // The ruler is the TOP line of the work area: a full-width divider ALWAYS\n // drawn between the plain output above and the constantly-redrawn run area\n // below. It's part of the redrawn region (not printed into the scrollback).\n writeHudRow(`${C.dim}${\"─\".repeat(cols)}${C.reset}`);\n\n // Work-area left pad matches the input box outer edge (not the inner\n // content). Status, subagents, and goal share this inset with the box.\n const geo = inputBoxGeometry(cols);\n const workPad = \" \".repeat(geo.margin);\n // Width available for status/subagent content after the shared left inset.\n const workCols = Math.max(8, cols - geo.margin);\n\n // Transient disconnect notice (one row).\n const noticeLine = this.connected\n ? null\n : `${C.yellow}⚠ lost connection to the workspace — reconnecting…${C.reset}`;\n if (noticeLine) writeHudRow(workPad + noticeLine);\n\n // Transient \"press again to exit\" hint (one row).\n const quitLine = this.quitArmed ? `${C.dim}Press Control-C again to exit${C.reset}` : null;\n if (quitLine) writeHudRow(workPad + quitLine);\n\n // Status line FIRST (working spinner / tokens / goal-complete) — sits with\n // the subagents directly above the input box, same left pad as the box.\n const statusLine = this.statusLineText(workCols);\n if (statusLine) writeHudRow(workPad + statusLine);\n\n // Subagent lines (one per active subagent), just under the status line.\n // Each subagent gets its own hue (loader + label).\n const frame = FRAMES[Math.floor(Date.now() / SPINNER_FRAME_MS) % FRAMES.length];\n for (const sub of this.subagents) {\n const color =\n sub.agentName === COMPACTION_AGENT\n ? COMPACTION_COLOR\n : SUBAGENT_COLORS[this.subagentColorByID.get(sub.id) ?? 0];\n // Clamp the label so the whole line stays within ONE physical row.\n const budget = workCols - 10;\n let label = sub.label;\n if (budget < 1) label = \"\";\n else if (label.length > budget) label = label.slice(0, Math.max(0, budget - 1)) + \"…\";\n const line = `${color}${frame}${C.reset} ${color}${label}${C.reset} ${C.dim}working${C.reset}`;\n writeHudRow(workPad + line);\n }\n\n // Live goal checklist, just below status/subagents: header + indented todos.\n const goalLines = this.goalLines(workCols);\n for (const line of goalLines) writeHudRow(workPad + line);\n\n // Queued messages, pinned directly ABOVE the input box: the durable FIFO\n // waiting for a boundary, shown in place (never printed into the\n // transcript). Esc steers the head immediately.\n for (const [i, text] of this.queuedMessages.entries()) {\n const hint = i === 0 ? ` ${C.dim}esc to steer · /queue to edit${C.reset}` : \"\";\n const budget = workCols - 3 - (i === 0 ? 30 : 0);\n let msg = text.replace(/\\s+/g, \" \").trim();\n if (budget > 1 && msg.length > budget) msg = msg.slice(0, budget - 1) + \"…\";\n writeHudRow(workPad + `${C.yellow}⏳${C.reset} ${C.gray}${msg}${C.reset}${hint}`);\n }\n\n // ── boxed input (side margins, expanding body, level in top-right border) ─\n const prefix = this.promptPrefix();\n const pw = this.visibleWidth(prefix);\n // Rotating greyscale border only while the MAIN agent is working (status\n // spinner showing). Subagent-only activity keeps a static grey rim so the\n // highlight always means \"the primary turn is in flight\".\n const borderAnimating = this.working;\n // Full lap ~1.4s; phase is head position 0..1 along the perimeter.\n const borderPhase = borderAnimating ? (Date.now() % 1400) / 1400 : null;\n const boxRows = buildInputBoxRows({\n cols,\n inputBuffer: this.inputBuffer,\n prefix,\n prefixWidth: pw,\n level: this.level,\n levelColor: this.levelColor(),\n borderColor: inputBoxBorderColor(),\n borderPhase,\n agentLabel: this.agentLabel,\n });\n // boxRows = [top, ...body, bottom]\n const boxTop = boxRows[0];\n const boxBottom = boxRows[boxRows.length - 1];\n const boxBody = boxRows.slice(1, -1);\n writeHudRow(boxTop);\n\n const bodyStartIdx = hudWidths.length; // first body row index in the region\n for (const row of boxBody) writeHudRow(row);\n writeHudRow(boxBottom);\n\n // Inline slash-command palette BELOW the box (input never shifts as it\n // filters). Fixed reserved height while open so the box stays pinned.\n const paletteBlock = this.paletteBlockLines(cols);\n for (const line of paletteBlock) writeHudRow(line);\n\n // Caret: place on the matching body row at content column + left pad.\n const layout = this.inputLayout();\n const bodyRowCount = Math.max(1, boxBody.length);\n const caretBodyRow = Math.max(0, Math.min(layout.caretRow, bodyRowCount - 1));\n const caretRegionRow = bodyStartIdx + caretBodyRow;\n const caretScreenCol = Math.min(rowCap - 1, geo.leftPad + layout.caretCol);\n\n this.lastCursorRow = caretRegionRow;\n this.lastCaretRegionIndex = caretRegionRow;\n // Full region widths — resize rewrap must count body, bottom, and palette.\n this.drawnRegionWidths = hudWidths.slice();\n this.drawnHudWidths = hudWidths.slice(0, bodyStartIdx); // legacy above-body slice\n this.lastDrawnCols = cols;\n this.bottomDrawn = true;\n\n // ── single flush ────────────────────────────────────────────────────────\n // One write() for the entire region + caret reposition. Always clear from\n // the region top first (`\\x1b[J`) so a resize never leaves ghost chrome\n // below/around the new paint. On resize we already over-moved slightly in\n // regionTopSequence so the clear reaches any rewrapped leftover rows.\n const totalRows = hudRows.length;\n const up = Math.max(0, totalRows - 1 - caretRegionRow);\n let out = SYNC_OUTPUT_BEGIN + moveToTop + \"\\x1b[J\" + hudRows.join(\"\\r\\n\");\n if (totalRows > 0) {\n out += \"\\r\";\n if (up > 0) out += `\\x1b[${up}A`;\n if (caretScreenCol > 0) out += `\\x1b[${caretScreenCol}C`;\n }\n out += SYNC_OUTPUT_END;\n process.stdout.write(out);\n }\n\n private clearBottom(): void {\n if (!this.bottomDrawn) return;\n const moveToTop = this.regionTopSequence();\n process.stdout.write(\n SYNC_OUTPUT_BEGIN + CURSOR_HIDE + moveToTop + \"\\x1b[J\" + CURSOR_SHOW + SYNC_OUTPUT_END\n );\n this.bottomDrawn = false;\n }\n\n // ── live streaming preview ────────────────────────────────────────────────\n // An ephemeral tail of the model's output above the status line: reasoning in\n // dim italic until the answer begins, then the answer plain. clearStream()\n // wipes it right before the finished message is committed to the transcript\n // (which renders full markdown), so there's no double-render.\n\n private static readonly STREAM_TAIL = 20;\n // How long a reasoning-only preview may sit untouched before it's wiped. A\n // visible answer must NEVER expire: it is the only copy until the durable\n // boundary event promotes the message into terminal scrollback.\n private static readonly STREAM_IDLE_MS = 10_000;\n\n /** Append a fragment of streamed answer text (rendered as progressive Markdown). */\n streamResponseDelta(delta: string, messageId?: string): void {\n this.beginStreamMessage(messageId);\n this.streamDraft = appendLiveDraft(this.streamDraft, { text: delta, messageId });\n this.streamResponse = this.streamDraft.text;\n this.scheduleStreamRedraw();\n this.armStreamIdleExpiry();\n }\n\n /**\n * Append a fragment of streamed internal reasoning (rendered dim italic).\n * Ignored once the answer has started, since reasoning precedes the answer.\n */\n streamThinkingDelta(delta: string, messageId?: string): void {\n this.beginStreamMessage(messageId);\n if (this.streamResponse) return;\n this.streamThinking += delta;\n this.scheduleStreamRedraw();\n this.armStreamIdleExpiry();\n }\n\n /** Reset the preview when a new message starts, so two messages' output (e.g.\n * one that only reasons then calls a tool, then the next) never blend. */\n private beginStreamMessage(messageId?: string): void {\n if (messageId !== undefined && messageId !== this.streamMessageId) {\n this.streamMessageId = messageId;\n // Provider retries and reconnects can alias the same visible generation\n // to another message id. Preserve response bytes; only the pre-answer\n // reasoning preview is safe to reset at such a boundary.\n if (!this.streamResponse) this.streamThinking = \"\";\n }\n }\n\n /** Wipe the live preview — call right before committing the final message. */\n clearStream(): void {\n if (this.streamRedrawTimer) {\n clearTimeout(this.streamRedrawTimer);\n this.streamRedrawTimer = null;\n }\n if (this.streamIdleTimer) {\n clearTimeout(this.streamIdleTimer);\n this.streamIdleTimer = null;\n }\n this.streamMessageId = null;\n this.streamDraft = emptyLiveDraft();\n if (!this.streamThinking && !this.streamResponse) return;\n this.streamThinking = \"\";\n this.streamResponse = \"\";\n this.renderBottom();\n }\n\n private scheduleStreamRedraw(): void {\n if (this.streamRedrawTimer || this.takeoverHandler || !this.started) return;\n // Batch rapid deltas into ~25fps redraws so streaming stays smooth.\n this.streamRedrawTimer = setTimeout(() => {\n this.streamRedrawTimer = null;\n this.renderBottom();\n }, 40);\n }\n\n /** Re-armed for reasoning-only deltas. Once answer prose exists it remains\n * visible until clearStream() runs immediately before durable promotion. */\n private armStreamIdleExpiry(): void {\n if (this.streamIdleTimer) clearTimeout(this.streamIdleTimer);\n this.streamIdleTimer = null;\n if (this.streamResponse) return;\n this.streamIdleTimer = setTimeout(() => {\n this.streamIdleTimer = null;\n // A response may have arrived just as this timer fired. Never erase it.\n if (this.streamResponse || !this.streamThinking) return;\n this.streamThinking = \"\";\n this.renderBottom();\n }, Tui.STREAM_IDLE_MS);\n }\n\n /**\n * The preview's physical rows: a tail of reasoning (dim italic) before the\n * answer starts, otherwise a tail of the answer (plain). Each row is clamped to\n * one terminal line so the bottom-region redraw math stays correct.\n *\n * Rows match the committed transcript formatting so a finished message doesn't\n * visibly \"snap\" into shape: the answer's first line carries the grey gutter\n * dot (as long as it hasn't scrolled out of the tail) and the body indents two\n * spaces beneath it; reasoning aligns at the same indent, dotless.\n */\n private streamPreviewLines(cols: number): string[] {\n // Reasoning gets a distinct, low-contrast voice: italic + a dark grey that\n // recedes well behind the plain (default-color) answer text.\n const thinkStyle = \"\\x1b[3m\\x1b[38;5;240m\";\n // 2-col gutter lead + clamp to one physical row.\n // Drop blank lines — streamed leading/internal newlines (e.g. a leading\n // \"\\n\\n\") must not render as a pile of empty rows. Also drop lines of\n // leaked tool-call serialization (DSML tags / stray session markers a\n // model emits as text when its tool call fails to parse upstream): the\n // backend discards them from the committed message, so the live preview\n // must not flash them either.\n const leakedMarkup = /<\\/?[||]DSML[||]|^\\s*\\[\\/?SESSION\\]\\s*<?\\s*$/;\n const renderedLines = (text: string): string[] => {\n const clean = text\n .replace(/\\r/g, \"\")\n .split(\"\\n\")\n .filter((line) => !leakedMarkup.test(line))\n .join(\"\\n\");\n // Keep single blank spacer rows so the live preview shares the committed\n // transcript's vertical rhythm — suppressing them made every message\n // visibly re-expand at commit. Runs of blanks collapse to one and the\n // edges are trimmed so stray streamed newlines never stack empty rows.\n const rows: string[] = [];\n for (const line of renderStreamingMarkdown(clean, Math.max(8, cols - 2))) {\n // eslint-disable-next-line no-control-regex\n const blank = line.replace(/\\x1b\\[[0-9;]*m/g, \"\").trim() === \"\";\n if (blank && (!rows.length || rows[rows.length - 1] === \"\")) continue;\n rows.push(blank ? \"\" : line);\n }\n while (rows.length && rows[rows.length - 1] === \"\") rows.pop();\n return rows;\n };\n if (this.streamResponse) {\n const all = renderedLines(this.streamResponse);\n const shown = all.slice(-Tui.STREAM_TAIL);\n const firstVisible = all.length <= Tui.STREAM_TAIL; // response's first line still in the tail\n return shown.map((l, i) =>\n `${i === 0 && firstVisible ? `${C.gray}•${C.reset} ` : \" \"}${l}`\n );\n }\n if (this.streamThinking) {\n return renderedLines(this.streamThinking)\n .slice(-Tui.STREAM_TAIL)\n // Reapply the reasoning voice after nested Markdown resets.\n .map((l) => ` ${thinkStyle}${l.replace(/\\x1b\\[0m/g, `${C.reset}${thinkStyle}`)}${C.reset}`);\n }\n return [];\n }\n\n // ── live goal checklist ───────────────────────────────────────────────────\n\n /**\n * Update the goal from the goal_updated event (or the initial fetch). When\n * every step is done, the goal is fully achieved: we clear the goal area and\n * flip on the \"Goal complete.\" status badge instead of leaving a finished\n * checklist sitting there.\n */\n setGoal(goal: GoalData | null): void {\n const steps = goal?.steps;\n if (steps && Array.isArray(steps) && steps.length) {\n const allDone = steps.every((s) => s.status === \"done\");\n if (allDone) {\n this.goal = null;\n this.goalComplete = true;\n } else {\n this.goal = goal;\n this.goalComplete = false;\n }\n } else {\n this.goal = null;\n }\n this.renderBottom();\n }\n\n /**\n * The goal's physical rows: a header (the short summary + progress) then one\n * row per step, indented two spaces beneath it so the todos clearly belong to\n * the goal — ○ pending / ▸ in-progress / ✓ done — each clamped to a line.\n */\n private goalLines(cols: number): string[] {\n const steps = this.goal?.steps;\n if (!steps?.length) return [];\n const oneLine = (s: string) => s.replace(/\\s+/g, \" \").trim();\n const clamp = (s: string, max: number) =>\n s.length > max ? s.slice(0, Math.max(0, max - 1)) + \"…\" : s;\n const calmGreen = \"\\x1b[38;5;65m\"; // muted, low-contrast done check\n const out: string[] = [];\n const done = steps.filter((s) => s.status === \"done\").length;\n const summary = oneLine(this.goal?.summary || this.goal?.description || \"Goal\");\n // Clamp the visible summary (not the ANSI-laden head) so we never cut an\n // escape sequence. Prefix is \"Goal N/M \" in visible characters.\n const prefix = `Goal ${done}/${steps.length} `;\n const sum = clamp(summary, Math.max(1, cols - prefix.length));\n out.push(`${C.bold}Goal${C.reset} ${C.gray}${done}/${steps.length}${C.reset} ${sum}`);\n for (const s of steps) {\n // Two-space indent under the goal, then the marker + step text.\n const text = clamp(oneLine(s.step || \"\"), Math.max(1, cols - 4));\n if (s.status === \"done\") out.push(` ${calmGreen}✓${C.reset} ${C.dim}${text}${C.reset}`);\n else if (s.status === \"in_progress\") out.push(` ${C.cyan}▸${C.reset} ${text}`);\n else out.push(` ${C.gray}○ ${text}${C.reset}`);\n }\n return out;\n }\n\n /**\n * Transcript gutter: content starts at column 1, so the far-left column is a\n * clean strip where only status glyphs (✓ ✗ ⛔ …) land — scanning down the\n * left edge reads as a ledger of what happened. Lines already led by a\n * gutter glyph or whitespace (indented blocks, the user-message bar) pass\n * through untouched.\n */\n private gutterize(text: string): string {\n return text\n .split(\"\\n\")\n .map((line) => {\n const plain = line.replace(/\\x1b\\[[0-9;]*m/g, \"\");\n if (plain === \"\" || /^[\\s✓✗⛔⚠⚙⚡⏳↪›❯◇─•]/.test(plain)) return line;\n return \" \" + line;\n })\n .join(\"\\n\");\n }\n\n /** Print a line of transcript above the persistent input. */\n print(text: string): void {\n const line = this.gutterize(text);\n if (this.takeoverHandler) {\n this.bufferedPrints.push(line);\n return;\n }\n this.clearBottom();\n process.stdout.write(line + \"\\n\");\n this.renderBottom();\n }\n\n /** Multi-line convenience. */\n printLines(lines: string[]): void {\n for (const l of lines) this.print(l);\n }\n\n /**\n * Print a user message as a highlighted block so it stands out in the\n * transcript (à la Codex). The bar is sized to the text (not full width, which\n * would wrap awkwardly), padded with a space on each side and a blank line\n * above and below, and a teal `›` marks the first row.\n */\n printUserMessage(text: string): void {\n const cols = Math.max(20, process.stdout.columns || 80);\n const bg = \"\\x1b[48;5;238m\"; // dark-gray background bar (visible against the terminal)\n const limit = Math.max(8, cols - 6); // wrap width, leaving room for padding\n // Word-wrap ONE logical line to `limit`; returns [\"\"] for a blank line so a\n // paragraph separator survives as a blank row in the bar.\n const wrapLine = (logical: string): string[] => {\n const words = logical.replace(/[^\\S\\n]+/g, \" \").trim().split(\" \").filter(Boolean);\n if (!words.length) return [\"\"];\n const out: string[] = [];\n let cur = \"\";\n for (let w of words) {\n while (w.length > limit) {\n if (cur) {\n out.push(cur);\n cur = \"\";\n }\n out.push(w.slice(0, limit));\n w = w.slice(limit);\n }\n if (!cur) cur = w;\n else if (cur.length + 1 + w.length <= limit) cur += \" \" + w;\n else {\n out.push(cur);\n cur = w;\n }\n }\n if (cur || !out.length) out.push(cur);\n return out;\n };\n // Preserve the user's own line breaks (multi-line prompts, blank-line\n // paragraph separators) instead of collapsing everything into one block;\n // wrap each line independently to the bar width.\n const lines = text.replace(/\\r\\n?/g, \"\\n\").split(\"\\n\").flatMap(wrapLine);\n // Width the bar to the longest line + the 2-col marker/indent.\n const innerW = 2 + Math.max(1, ...lines.map((l) => l.length));\n this.print(\"\"); // padding above\n lines.forEach((line, i) => {\n const rowText = (i === 0 ? \"❯ \" : \" \") + line;\n const padded = rowText.padEnd(innerW);\n // recolor the leading marker; one space of padding inside the bar each side\n const inner = i === 0 ? `${C.teal}❯${C.reset}${bg}${padded.slice(1)}` : padded;\n this.print(`${bg} ${inner} ${C.reset}`);\n });\n this.print(\"\"); // padding below\n }\n\n // ─── agent label (under the input box) ─────────────────────────────────────\n\n /** The loaded agent's display title, shown low-contrast under the input. */\n private agentLabel = \"\";\n\n setAgentLabel(label: string): void {\n if (label === this.agentLabel) return;\n this.agentLabel = label;\n this.renderBottom();\n }\n\n // ─── working indicator (turn state) ───────────────────────────────────────\n\n setWorking(on: boolean): void {\n if (on === this.working) return;\n if (on && !this.working) {\n this.working = true;\n this.workingStart = Date.now();\n // Every turn's label starts back at \"Working\" before the word morphs.\n this.wordMill.reset(this.workingStart);\n // A new turn supersedes the previous \"Goal complete.\" badge.\n this.goalComplete = false;\n } else if (!on) {\n this.working = false;\n }\n this.syncSpinner();\n this.renderBottom();\n }\n\n /** The subagents currently working, one persistent line each. Each keeps a\n * stable, distinct colour for as long as it's active; the compaction agent\n * is always orange (its colour never comes from the shared pool). */\n setSubagents(subagents: { id: string; label: string; agentName?: string }[]): void {\n const unchanged =\n subagents.length === this.subagents.length &&\n subagents.every((sub, i) => {\n const current = this.subagents[i];\n return current?.id === sub.id &&\n current.label === sub.label &&\n current.agentName === sub.agentName;\n });\n if (unchanged) return;\n this.subagents = subagents;\n // Release colours held by subagents that have finished.\n const active = new Set(subagents.map((s) => s.id));\n for (const id of [...this.subagentColorByID.keys()]) {\n if (!active.has(id)) this.subagentColorByID.delete(id);\n }\n // Give each newcomer the lowest colour index not currently in use, so\n // concurrent subagents never share a hue (until the palette is exhausted).\n for (const s of subagents) {\n if (s.agentName === COMPACTION_AGENT) continue; // fixed orange, not pooled\n if (this.subagentColorByID.has(s.id)) continue;\n const used = new Set(this.subagentColorByID.values());\n let idx = 0;\n while (used.has(idx) && idx < SUBAGENT_COLORS.length - 1) idx++;\n this.subagentColorByID.set(s.id, idx);\n }\n this.syncSpinner();\n this.renderBottom();\n }\n\n /** Run the spinner animation while anything (the agent or a subagent) is active. */\n private syncSpinner(): void {\n const spinning = this.working || this.subagents.length > 0;\n if (spinning && !this.spinnerTimer) {\n this.spinnerTimer = setInterval(() => this.renderBottom(), ANIMATION_TICK_MS);\n } else if (!spinning && this.spinnerTimer) {\n clearInterval(this.spinnerTimer);\n this.spinnerTimer = null;\n }\n }\n\n get isWorking(): boolean {\n return this.working;\n }\n\n setBackgroundCount(n: number): void {\n if (n === this.bgCount) return;\n this.bgCount = n;\n if (n === 0) this.bgBadgeSelected = false; // badge gone → nothing to select\n this.renderBottom();\n }\n setQueuedMessages(texts: string[]): void {\n if (\n texts.length === this.queuedMessages.length &&\n texts.every((t, i) => t === this.queuedMessages[i])\n ) return;\n this.queuedMessages = texts;\n this.renderBottom();\n }\n setConnected(connected: boolean): void {\n if (connected === this.connected) return;\n this.connected = connected;\n this.renderBottom();\n }\n\n // ─── input buffer access (for up-arrow editing of queued messages) ─────────\n\n getInput(): string {\n return this.inputBuffer;\n }\n /** Replace the input (and any pasted images tied to placeholders in it). */\n setInput(\n text: string,\n images: PastedImage[] = [],\n notifyDraft = true,\n restoreExternalImages = false,\n ): void {\n this.inputBuffer = restoreExternalImages ? ensureImagePlaceholders(text, images) : text;\n this.cursorPos = this.inputBuffer.length;\n this.pendingImages = images;\n this.historyIdx = null;\n if (!notifyDraft) this.lastDraftSeen = this.inputBuffer;\n this.renderBottom();\n }\n\n setExternalAttachmentNames(names: string[]): void {\n if (\n names.length === this.externalAttachmentNames.length &&\n names.every((name, i) => name === this.externalAttachmentNames[i])\n ) return;\n this.externalAttachmentNames = [...names];\n this.renderBottom();\n }\n\n hasExternalAttachments(): boolean {\n return this.externalAttachmentNames.length > 0;\n }\n\n /** Cumulative token totals shown on the prompt line (`outTokens` includes live). */\n setTokens(inTokens: number, outTokens: number): void {\n if (inTokens === this.tokensIn && outTokens === this.tokensOut) return;\n this.tokensIn = inTokens;\n this.tokensOut = outTokens;\n this.renderBottom();\n }\n\n /**\n * Current step the agent is working on, shown on the line above the prompt.\n * `outTokens` is the output produced during this step. The step's own timer\n * resets whenever the label changes.\n */\n setStep(label: string | null, outTokens: number): void {\n // Collapse to one line: the label comes from server-sent tool progress\n // text, which can be multi-line garbage when an upstream parse goes wrong.\n const next = label && label.trim() ? label.replace(/\\s+/g, \" \").trim() : null;\n if (next === this.step && outTokens === this.stepOut) return;\n if (next !== this.step) {\n this.step = next;\n this.stepStart = Date.now();\n }\n this.stepOut = outTokens;\n this.renderBottom();\n }\n\n // ─── takeover helpers (approval / menus) ───────────────────────────────────\n\n private beginTakeover(): void {\n this.bgBadgeSelected = false; // a menu/prompt owns the bottom now\n this.clearBottom();\n process.stdout.write(\"\\r\\x1b[K\");\n process.stdout.write(\"\\x1b[?25l\"); // hide the text cursor while a menu/prompt owns the screen\n this.bottomDrawn = false;\n }\n\n private endTakeover(): void {\n this.takeoverHandler = null;\n process.stdout.write(\"\\x1b[?25h\"); // restore the cursor\n const buffered = this.bufferedPrints;\n this.bufferedPrints = [];\n for (const t of buffered) {\n process.stdout.write(t + \"\\n\");\n }\n this.renderBottom();\n }\n\n /**\n * ## Boxed prompt — reusable HUD free-text component\n *\n * Single-line free-text capture using the **same chrome as the main input\n * box** (side margin, grey rounded rim, level-tinted `❯`, real caret). A\n * left-aligned label sits in the top border rim instead of the permission\n * level dots.\n *\n * Prefer this over {@link Tui.prompt} whenever the capture should feel like\n * part of the HUD rather than a legacy bar — denial feedback, handoff notes,\n * reject-with-reason, rename, or any other short free-text moment.\n *\n * ```\n * ╭ Denial feedback ────────────────────────╮\n * │ ❯ the user-typed note │\n * ╰──────────────────────────────────────────╯\n * ```\n *\n * **Keys**\n * - Enter — submit (resolves the trimmed string; may be `\"\"`)\n * - Esc — clear a non-empty draft; Esc again (empty) cancels → `null`\n * (override with `escClearsFirst: false` to always cancel)\n *\n * **Nested mode** (`nested: true`) — call from inside another takeover\n * (e.g. approval → feedback) so this component only steals the key handler\n * and paints/erases its own three rows; the parent still owns begin/end.\n *\n * Do **not** use brand-gradient text for the label — gradient is reserved\n * for success moments (`✓ Goal complete.`, farewell, etc.).\n *\n * @returns trimmed text on Enter, or `null` if the user cancelled with Esc\n */\n boxedPrompt(opts: BoxedPromptOptions): Promise<string | null> {\n return new Promise((resolve) => {\n const nested = !!opts.nested;\n const escClearsFirst = opts.escClearsFirst !== false;\n const borderLabel = opts.borderLabel || \"Feedback\";\n const labelColor = opts.labelColor ?? \"\\x1b[90m\";\n let buf = opts.initial ?? \"\";\n\n if (!nested) this.beginTakeover();\n process.stdout.write(\"\\x1b[?25h\"); // real caret, same as main input\n\n const cols = process.stdout.columns || 80;\n const geo = inputBoxGeometry(cols);\n const border = inputBoxBorderColor();\n const pad = \" \".repeat(geo.margin);\n const rowCap = Math.max(1, cols - 1);\n const reset = C.reset;\n const prompt = `${this.levelColor()}❯${reset} `;\n const promptW = 2; // \"❯ \"\n\n const writeRow = (line: string) => {\n const row = this.clampVisible(sanitizeHudRow(line), rowCap);\n process.stdout.write(`\\r\\x1b[K${row}\\n`);\n };\n\n // Frame is 3 rows (top / body / bottom). After three writeRow newlines\n // the cursor sits one row BELOW the bottom, so: 2A → body, 3A → top.\n const draw = () => {\n writeRow(pad + buildBoxTopLeftLabel(geo.boxW, borderLabel, border, labelColor));\n writeRow(pad + buildBoxBody(prompt + buf, geo.contentW, border));\n writeRow(pad + buildBoxBottom(geo.boxW, border));\n // Park the real caret after the typed text on the body row.\n process.stdout.write(\"\\r\\x1b[2A\");\n const col = geo.leftPad + promptW + buf.length;\n if (col > 0) process.stdout.write(`\\x1b[${Math.min(rowCap - 1, col)}C`);\n };\n\n const clearFrame = () => {\n // Caret is on the body row → step to the top, then clear down.\n process.stdout.write(\"\\r\\x1b[1A\\x1b[J\");\n };\n\n const redraw = () => {\n // Caret is on body; step to top, then repaint the whole frame.\n process.stdout.write(\"\\r\\x1b[1A\");\n draw();\n };\n\n const finish = (value: string | null) => {\n clearFrame();\n if (!nested) this.endTakeover();\n else this.takeoverHandler = null;\n resolve(value);\n };\n\n draw();\n this.takeoverHandler = (str, key) => {\n if (key?.name === \"escape\") {\n if (escClearsFirst && buf.length > 0) {\n buf = \"\";\n redraw();\n return;\n }\n finish(null);\n return;\n }\n if (key?.name === \"return\" || key?.name === \"enter\") {\n finish(buf.trim());\n return;\n }\n if (key?.name === \"backspace\") {\n if (!buf.length) return;\n buf = buf.slice(0, -1);\n redraw();\n return;\n }\n if (str && !key?.ctrl && !key?.meta && str >= \" \") {\n if (buf.length < Math.max(8, geo.contentW - promptW - 1)) {\n buf += str;\n redraw();\n }\n }\n };\n });\n }\n\n /**\n * Permission prompt: boxed chrome matching the HUD, arrow-navigable options\n * with shortcuts. Includes \"Deny with feedback\" — choosing it (or Tab)\n * opens {@link Tui.boxedPrompt} so the reason can ride back to the agent.\n */\n approval(\n question: string,\n risk: number\n ): Promise<{ choice: \"allow\" | \"deny\" | \"always\" | \"always_risk\"; reason?: string }> {\n return new Promise((resolve) => {\n type Choice = \"allow\" | \"always\" | \"always_risk\" | \"deny\" | \"deny_feedback\";\n const options: { value: Choice; label: string; shortcut: string; color: string; hint?: string }[] = [\n { value: \"allow\", label: \"Allow once\", shortcut: \"y\", color: C.green },\n { value: \"always\", label: \"Always allow this tool\", shortcut: \"a\", color: C.cyan },\n {\n value: \"always_risk\",\n label: `Allow level ${risk} and below this session`,\n shortcut: \"l\",\n color: C.cyan,\n },\n { value: \"deny\", label: \"Deny\", shortcut: \"n\", color: C.red },\n {\n value: \"deny_feedback\",\n label: \"Deny with feedback\",\n shortcut: \"d\",\n color: C.magenta,\n hint: \"tell the agent why\",\n },\n ];\n let idx = 0;\n const riskLevel = Math.max(1, Math.min(5, Math.round(risk))) as Level;\n // Filled dots in warm risk colour, empty dull.\n const riskBar = borderLevelDotsStyled(riskLevel, C.yellow, \"\\x1b[38;5;240m\");\n\n this.beginTakeover();\n const cols = process.stdout.columns || 80;\n const geo = inputBoxGeometry(cols);\n const border = inputBoxBorderColor();\n const pad = \" \".repeat(geo.margin);\n const rowCap = Math.max(1, cols - 1);\n const reset = C.reset;\n\n // Clamp a line of content to the box interior; hard-wrap long summaries.\n const wrapContent = (text: string): string[] => {\n const flat = text.replace(/\\s+/g, \" \").trim();\n if (!flat) return [\"\"];\n const out: string[] = [];\n let rest = flat;\n while (rest.length > geo.contentW) {\n out.push(rest.slice(0, geo.contentW - 1) + \"…\");\n rest = rest.slice(geo.contentW - 1);\n if (out.length >= 4) {\n // Cap summary height so a huge command doesn't flood the dialog.\n break;\n }\n }\n if (out.length < 4) out.push(rest);\n return out.length ? out : [\"\"];\n };\n\n // Question may include a \"why:\" line from the agent — keep each logical\n // line, wrap each, strip any caller ANSI so the box paints cleanly.\n const summaryLines = question.split(\"\\n\").flatMap((line) => {\n // eslint-disable-next-line no-control-regex\n const plain = line.replace(/\\x1b\\[[0-9;]*m/g, \"\").trim();\n if (!plain) return [];\n const isWhy = /^why:/i.test(plain);\n return wrapContent(plain).map((l) => (isWhy ? `${C.dim}${l}${reset}` : l));\n });\n if (!summaryLines.length) summaryLines.push(`${C.dim}(no details)${reset}`);\n\n const writeRow = (line: string) => {\n const row = this.clampVisible(sanitizeHudRow(line), rowCap);\n process.stdout.write(`\\r\\x1b[K${row}\\n`);\n };\n\n // Full frame height: blank + title + top + summary… + blank + options… + bottom\n const optionCount = options.length;\n const summaryCount = summaryLines.length;\n const boxRows = 1 /*top*/ + summaryCount + 1 /*blank*/ + optionCount + 1 /*bottom*/;\n const titleRows = 2; // blank + title\n const totalRows = titleRows + boxRows;\n\n const renderOptionContent = (i: number): string => {\n const o = options[i];\n const sel = i === idx;\n const pointer = sel ? `${o.color}❯${reset} ` : \" \";\n const label = sel ? `${C.bold}${o.color}${o.label}${reset}` : `${C.dim}${o.label}${reset}`;\n const shortcut = `${C.gray}(${o.shortcut})${reset}`;\n const hint = o.hint && sel ? `${C.dim} ${o.hint}${reset}` : \"\";\n // pointer(2) + label + \" \" + (x) + hint\n const plainLabel = o.label;\n const used = 2 + plainLabel.length + 1 + 3 + (o.hint && sel ? 2 + o.hint.length : 0);\n const gap = Math.max(1, geo.contentW - used);\n return `${pointer}${label}${\" \".repeat(gap)}${shortcut}${hint}`;\n };\n\n const drawFrame = (moveUp: boolean) => {\n if (moveUp) process.stdout.write(`\\x1b[${totalRows}A`);\n // Title above the box — plain bold (gradient is reserved for success).\n writeRow(\"\");\n writeRow(\n `${pad}${C.bold}Permission needed${reset} ${C.dim}risk${reset} ${riskBar}`\n );\n writeRow(pad + buildBoxTopPlain(geo.boxW, border));\n for (const line of summaryLines) {\n writeRow(pad + buildBoxBody(line, geo.contentW, border));\n }\n // Spacer row inside the box\n writeRow(pad + buildBoxBody(\"\", geo.contentW, border));\n for (let i = 0; i < optionCount; i++) {\n writeRow(pad + buildBoxBody(renderOptionContent(i), geo.contentW, border));\n }\n writeRow(pad + buildBoxBottom(geo.boxW, border));\n };\n\n drawFrame(false);\n\n const erase = () => {\n process.stdout.write(\"\\r\");\n if (totalRows > 0) process.stdout.write(`\\x1b[${totalRows}A`);\n process.stdout.write(\"\\x1b[J\");\n };\n\n const done = (choice: \"allow\" | \"deny\" | \"always\" | \"always_risk\", reason?: string) => {\n erase();\n this.endTakeover();\n resolve(reason !== undefined ? { choice, reason } : { choice });\n };\n\n // Feedback reuses the boxed-prompt component (same chrome as main input,\n // left rim label). Nested so we keep ownership of begin/end takeover.\n const collectFeedback = () => {\n erase();\n void this.boxedPrompt({ borderLabel: \"Denial feedback\", nested: true }).then((why) => {\n this.endTakeover();\n if (why) resolve({ choice: \"deny\", reason: why });\n else resolve({ choice: \"deny\" });\n });\n };\n\n const pick = (value: Choice) => {\n if (value === \"deny_feedback\") collectFeedback();\n else done(value);\n };\n\n this.takeoverHandler = (str, key) => {\n if (key?.name === \"up\" || str === \"k\") {\n idx = (idx - 1 + optionCount) % optionCount;\n drawFrame(true);\n } else if (key?.name === \"down\" || str === \"j\") {\n idx = (idx + 1) % optionCount;\n drawFrame(true);\n } else if (key?.name === \"tab\") {\n // Tab = deny with feedback (legacy + discoverable).\n pick(\"deny_feedback\");\n } else if (key?.name === \"return\" || key?.name === \"enter\") {\n pick(options[idx].value);\n } else if (key?.name === \"escape\") {\n done(\"deny\");\n } else {\n const k = (str || \"\").toLowerCase();\n if (k === \"y\") pick(\"allow\");\n else if (k === \"a\") pick(\"always\");\n else if (k === \"l\") pick(\"always_risk\");\n else if (k === \"n\") pick(\"deny\");\n else if (k === \"d\" || k === \"f\") pick(\"deny_feedback\");\n }\n };\n });\n }\n\n /**\n * Arrow-key selection menu (slash menu, process menu, resume). Pauses input.\n * Boxed chrome matches the bottom input HUD: side margin + grey rounded\n * border, selected row with a brand-tinted pointer.\n *\n * An item may carry a `detail` — a dim second physical line under its label\n * for context that doesn't fit the one-row label+hint layout (e.g. a\n * machine's hostname · daemon status). `opts.spaced` inserts a blank row\n * between items for readability in short, dense menus.\n */\n select<T>(\n title: string,\n items: { label: string; hint?: string; detail?: string; value: T; disabled?: boolean }[],\n opts?: { spaced?: boolean }\n ): Promise<T | undefined> {\n return new Promise((resolve) => {\n // Start on the first selectable item; Enter on a disabled row is a no-op\n // (disabled rows stay visible — \"coming soon\" entries are content).\n let idx = Math.max(0, items.findIndex((it) => !it.disabled));\n this.beginTakeover();\n const cols = process.stdout.columns || 80;\n const geo = inputBoxGeometry(cols);\n const border = inputBoxBorderColor();\n const pad = \" \".repeat(geo.margin);\n const rowCap = Math.max(1, cols - 1);\n // Title sits above the box (same left edge as the border).\n // Layout: blank · title · top · items… · bottom → cursor below bottom.\n if (title) process.stdout.write(`\\n${pad}${title}\\n`);\n else process.stdout.write(\"\\n\");\n\n const renderItemRows = (i: number): string[] =>\n renderSelectItemRows(items[i], i === idx, geo.contentW);\n\n const writeRow = (line: string) => {\n const row = this.clampVisible(sanitizeHudRow(line), rowCap);\n process.stdout.write(`\\r\\x1b[K${row}\\n`);\n };\n\n // Box frame rows: top + content rows + bottom. Items can span two rows\n // (label + detail) and spaced menus add a blank row between items, so\n // the redraw math counts CONTENT ROWS, not items.\n const spaced = opts?.spaced ?? false;\n const contentRows =\n items.reduce((n, it) => n + 1 + (it.detail ? 1 : 0), 0) +\n (spaced ? Math.max(0, items.length - 1) : 0);\n const draw = (moveUp: boolean) => {\n if (moveUp) process.stdout.write(`\\x1b[${contentRows + 1}A`);\n else writeRow(pad + buildBoxTopPlain(geo.boxW, border));\n for (let i = 0; i < items.length; i++) {\n if (spaced && i > 0) writeRow(pad + buildBoxBody(\"\", geo.contentW, border));\n for (const row of renderItemRows(i)) {\n writeRow(pad + buildBoxBody(row, geo.contentW, border));\n }\n }\n writeRow(pad + buildBoxBottom(geo.boxW, border));\n };\n draw(false);\n\n // Erase title + full box when the menu closes.\n // title present: blank + title = 2; absent: just the leading blank = 1.\n const titleRows = title ? 2 : 1;\n const boxRows = 1 + contentRows + 1; // top + content + bottom\n const erase = () => {\n process.stdout.write(\"\\r\");\n const up = titleRows + boxRows;\n if (up > 0) process.stdout.write(`\\x1b[${up}A`);\n process.stdout.write(\"\\x1b[J\");\n };\n const close = (value: T | undefined) => {\n erase();\n this.endTakeover();\n resolve(value);\n };\n this.takeoverHandler = (str, key) => {\n if (!key) return;\n if (key.name === \"up\" || str === \"k\") {\n idx = (idx - 1 + items.length) % items.length;\n draw(true);\n } else if (key.name === \"down\" || str === \"j\") {\n idx = (idx + 1) % items.length;\n draw(true);\n } else if (key.name === \"return\" || key.name === \"enter\") {\n if (!items[idx].disabled) close(items[idx].value);\n } else if (key.name === \"escape\") {\n close(undefined);\n }\n };\n });\n }\n\n /**\n * A select menu that stays OPEN while its contents change — the primitive\n * behind in-place navigation UIs like the directory browser. Instead of\n * resolving once like `select`, it returns a handle:\n *\n * - `next()` awaits the next interaction: a pick, a registered extra key\n * (e.g. \".\" to toggle hidden files), or Escape (cancel).\n * - `update()` swaps title/items/footer and redraws the SAME screen region\n * (erase + repaint in one write), so navigating levels never feels like\n * leaving the menu.\n * - `setBusy(i)` animates a spinner in row i's pointer column while the\n * caller loads what's behind it; input (except Escape) is swallowed until\n * the next update()/setBusy(null).\n * - `close()` erases the region and releases the takeover.\n *\n * The optional `footer` is a dim line under the box — the home for key\n * hints and transient error text.\n */\n openLiveSelect<T>(opts: {\n title: string;\n items: { label: string; hint?: string; detail?: string; value: T; disabled?: boolean }[];\n footer?: string;\n /** Plain single-character keys surfaced as \"key\" events. */\n keys?: string[];\n spaced?: boolean;\n }): {\n next: () => Promise<\n | { kind: \"pick\"; value: T; index: number }\n | { kind: \"key\"; name: string; index: number }\n | { kind: \"edit\"; text: string; index: number }\n | { kind: \"cancel\" }\n >;\n update: (state: { title?: string; items?: typeof opts.items; footer?: string }) => void;\n setBusy: (index: number | null) => void;\n /** Turn row `index` into an inline text input (Enter → \"edit\" event with\n * the typed text; Escape returns the row to normal). The menu never\n * closes — the edit happens in place. */\n beginEdit: (index: number, editOpts?: { placeholder?: string; prefix?: string }) => void;\n close: () => void;\n } {\n type Event =\n | { kind: \"pick\"; value: T; index: number }\n | { kind: \"key\"; name: string; index: number }\n | { kind: \"edit\"; text: string; index: number }\n | { kind: \"cancel\" };\n let { title, items } = opts;\n let footer = opts.footer ?? \"\";\n const spaced = opts.spaced ?? false;\n const extraKeys = opts.keys ?? [];\n let idx = Math.max(0, items.findIndex((it) => !it.disabled));\n let busyIdx: number | null = null;\n let busyTimer: ReturnType<typeof setInterval> | null = null;\n let closed = false;\n let edit: { index: number; buf: string; placeholder: string; prefix: string } | null = null;\n\n this.beginTakeover();\n const cols = process.stdout.columns || 80;\n const geo = inputBoxGeometry(cols);\n const border = inputBoxBorderColor();\n const pad = \" \".repeat(geo.margin);\n const rowCap = Math.max(1, cols - 1);\n let regionRows = 0; // physical rows currently on screen (cursor sits below)\n let lifted = 0; // rows the REAL cursor was parked above the region bottom (edit mode)\n\n const draw = () => {\n if (closed) return;\n const rows: string[] = [\"\"];\n // The REAL terminal cursor parks at the edit row's input point, so the\n // user sees their normal cursor (block/beam, blinking per their\n // terminal) instead of a painted caret glyph.\n let editCursor: { rowIndex: number; col: number } | null = null;\n if (title) rows.push(pad + title);\n rows.push(pad + buildBoxTopPlain(geo.boxW, border));\n for (let i = 0; i < items.length; i++) {\n const it = items[i];\n if (spaced && i > 0) rows.push(pad + buildBoxBody(\"\", geo.contentW, border));\n // The busy row gets the SAME spinner as the main \"Working\" loader —\n // standard glyphs, brand-gradient colour drift.\n const glyph = busyIdx === i ? this.spinnerFrame() : undefined;\n if (edit && edit.index === i) {\n // The row IS the input: pointer + prefix + typed text\n // (tail-clamped), dim placeholder while empty. While the submitted\n // text is being acted on, the spinner takes the pointer column.\n const pointer = `${glyph ?? `${C.magenta}❯${C.reset}`} `;\n const max = Math.max(4, geo.contentW - 2 - boxVisibleWidth(edit.prefix) - 1);\n let buf = edit.buf;\n while (buf.length > 0 && boxVisibleWidth(buf) > max) buf = buf.slice(1);\n const body = buf\n ? `${C.bold}${C.cyan}${buf}${C.reset}`\n : `${C.dim}${edit.placeholder}${C.reset}`;\n rows.push(pad + buildBoxBody(`${pointer}${C.dim}${edit.prefix}${C.reset}${body}`, geo.contentW, border));\n if (!glyph) {\n editCursor = {\n rowIndex: rows.length - 1,\n // 1-based ANSI column: margin + \"│ \" + pointer(2) + prefix + typed text.\n col: geo.margin + 2 + 2 + boxVisibleWidth(edit.prefix) + boxVisibleWidth(buf) + 1,\n };\n }\n continue;\n }\n for (const r of renderSelectItemRows(it, i === idx, geo.contentW, glyph)) {\n rows.push(pad + buildBoxBody(r, geo.contentW, border));\n }\n }\n rows.push(pad + buildBoxBottom(geo.boxW, border));\n if (footer) rows.push(pad + footer);\n // Single write: return the cursor below the region if edit parked it\n // up, erase, repaint, then park (and show) or hide the cursor.\n let out = lifted > 0 ? `\\x1b[${lifted}B` : \"\";\n lifted = 0;\n out += regionRows > 0 ? `\\r\\x1b[${regionRows}A\\x1b[J` : \"\";\n for (const line of rows) out += `\\r\\x1b[K${this.clampVisible(sanitizeHudRow(line), rowCap)}\\n`;\n if (editCursor) {\n lifted = rows.length - editCursor.rowIndex;\n out += `\\x1b[${lifted}A\\x1b[${editCursor.col}G\\x1b[?25h`;\n } else {\n out += \"\\x1b[?25l\";\n }\n process.stdout.write(out);\n regionRows = rows.length;\n };\n draw();\n\n const queue: Event[] = [];\n let waiter: ((e: Event) => void) | null = null;\n const emit = (e: Event) => {\n if (waiter) {\n const w = waiter;\n waiter = null;\n w(e);\n } else queue.push(e);\n };\n\n const stopSpinner = () => {\n if (busyTimer) clearInterval(busyTimer);\n busyTimer = null;\n busyIdx = null;\n };\n\n this.takeoverHandler = (str, key) => {\n if (edit && busyIdx === null) {\n // Inline edit mode: the highlighted row is a text input.\n if (key?.name === \"escape\") {\n edit = null;\n draw();\n } else if (key?.name === \"return\" || key?.name === \"enter\") {\n const text = edit.buf.trim();\n if (!text) {\n edit = null;\n draw();\n } else {\n emit({ kind: \"edit\", text, index: edit.index });\n }\n } else if (key?.name === \"backspace\") {\n edit.buf = edit.buf.slice(0, -1);\n draw();\n } else if (str && !key?.ctrl && !key?.meta) {\n const clean = str.replace(/[\\x00-\\x1f\\x7f]/g, \"\");\n if (clean) {\n edit.buf += clean;\n draw();\n }\n }\n return;\n }\n if (key?.name === \"escape\") return emit({ kind: \"cancel\" });\n if (busyIdx !== null) return; // a navigation is in flight\n if (key?.name === \"up\" || str === \"k\") {\n idx = (idx - 1 + items.length) % items.length;\n draw();\n } else if (key?.name === \"down\" || str === \"j\") {\n idx = (idx + 1) % items.length;\n draw();\n } else if (key?.name === \"return\" || key?.name === \"enter\") {\n if (!items[idx]?.disabled) emit({ kind: \"pick\", value: items[idx].value, index: idx });\n } else if (str && extraKeys.includes(str)) {\n emit({ kind: \"key\", name: str, index: idx });\n }\n };\n\n return {\n next: () =>\n queue.length > 0 ? Promise.resolve(queue.shift()!) : new Promise<Event>((r) => (waiter = r)),\n update: (state) => {\n stopSpinner();\n edit = null;\n if (state.title !== undefined) title = state.title;\n if (state.items) {\n items = state.items;\n if (idx >= items.length || items[idx]?.disabled) {\n idx = Math.max(0, items.findIndex((it) => !it.disabled));\n }\n }\n if (state.footer !== undefined) footer = state.footer;\n draw();\n },\n setBusy: (index) => {\n stopSpinner();\n if (index !== null) {\n busyIdx = index;\n busyTimer = setInterval(draw, SPINNER_FRAME_MS);\n }\n draw();\n },\n beginEdit: (index, editOpts) => {\n stopSpinner();\n edit = { index, buf: \"\", placeholder: editOpts?.placeholder ?? \"\", prefix: editOpts?.prefix ?? \"\" };\n idx = index;\n draw();\n },\n close: () => {\n if (closed) return;\n closed = true;\n stopSpinner();\n // If edit mode parked the real cursor inside the region, return it\n // below first so the erase math holds.\n if (lifted > 0) process.stdout.write(`\\x1b[${lifted}B`);\n lifted = 0;\n if (regionRows > 0) process.stdout.write(`\\r\\x1b[${regionRows}A\\x1b[J`);\n this.endTakeover();\n },\n };\n }\n\n /**\n * Free-text prompt (single line). Pauses the main input and reads a line —\n * used where a menu can't, e.g. entering an MCP server command. Enter submits,\n * Escape (or empty submit) cancels with null.\n */\n prompt(question: string, placeholder = \"\"): Promise<string | null> {\n return new Promise((resolve) => {\n let buf = \"\";\n this.beginTakeover();\n process.stdout.write(\"\\x1b[?25h\"); // we want a visible caret while typing\n process.stdout.write(`\\n${C.cyan}┃${C.reset} ${question}\\n`);\n if (placeholder) process.stdout.write(`${C.gray}┃ e.g. ${placeholder}${C.reset}\\n`);\n const draw = () => {\n process.stdout.write(`\\r\\x1b[K${C.cyan}┃${C.reset} ${C.bold}›${C.reset} ${buf}`);\n };\n draw();\n const finish = (value: string | null) => {\n process.stdout.write(\"\\n\");\n this.endTakeover();\n resolve(value);\n };\n this.takeoverHandler = (str, key) => {\n if (key?.name === \"escape\") return finish(null);\n if (key?.name === \"return\" || key?.name === \"enter\") return finish(buf.trim() || null);\n if (key?.name === \"backspace\") {\n buf = buf.slice(0, -1);\n draw();\n return;\n }\n // Ignore control keys; accept printable input (including pasted text).\n if (str && !key?.ctrl && !key?.meta && str >= \" \") {\n buf += str;\n draw();\n }\n };\n });\n }\n\n banner(lines: string[]): void {\n this.clearBottom();\n process.stdout.write(\"\\n\");\n for (const l of lines) process.stdout.write(l + \"\\n\");\n }\n}\n","export * from \"@standardagents/code-network/shared-messaging\";\n","export * from \"@standardagents/code-network/history\";\n","/**\n * Background-process registry — the Node half.\n *\n * The thread-KV store itself lives in the shared core; this adds the two\n * host-local things: where a detached process writes its stdout, and the\n * signal-0 liveness probe that lets the registry self-heal when a process died\n * while we weren't watching.\n */\nimport path from \"node:path\";\nimport os from \"node:os\";\nimport fs from \"node:fs\";\nimport { ProcessRegistry as CoreProcessRegistry } from \"@standardagents/code-network/process-registry\";\n\nexport type { ProcessEntry, ProcessStatus } from \"@standardagents/code-network/process-registry\";\n\n/** Process *output* logs are host-local (the process writes its stdout here). */\nexport const LOG_DIR = path.join(os.homedir(), \".standardagents\", \"process-logs\");\n\n/** Open a process log privately, repairing legacy directory/file modes. */\nexport function openPrivateProcessLog(logPath: string): number {\n const directory = path.dirname(logPath);\n fs.mkdirSync(directory, { recursive: true, mode: 0o700 });\n fs.chmodSync(directory, 0o700);\n const descriptor = fs.openSync(\n logPath,\n fs.constants.O_WRONLY | fs.constants.O_CREAT | fs.constants.O_APPEND,\n 0o600\n );\n fs.fchmodSync(descriptor, 0o600);\n return descriptor;\n}\n\nfunction isAlive(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch (err) {\n // EPERM means the process exists but isn't ours; ESRCH means it's gone.\n return (err as NodeJS.ErrnoException).code === \"EPERM\";\n }\n}\n\nexport class ProcessRegistry extends CoreProcessRegistry {\n protected override isAlive(pid: number): boolean {\n return isAlive(pid);\n }\n}\n","/**\n * MCP server configuration — the list of Model Context Protocol servers this\n * CLI can launch locally and negotiate with. Stored in `~/.standardagents/mcp.json`\n * so it persists across sessions and machines (per-user, not per-thread).\n *\n * Each server is a local process the CLI spawns and speaks JSON-RPC 2.0 to over\n * stdio (see `mcp.ts`). The CLI is the MCP *host*: it owns the connection, does\n * the capability handshake, and forwards the agent's tool calls to the server.\n */\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport os from \"node:os\";\n\n/**\n * Resolve the config file path at call time (not module load) so it honors an\n * override. `STANDARDAGENTS_MCP_CONFIG` points at an explicit mcp.json — tests\n * set it to a throwaway temp file so they never read or clobber the user's real\n * `~/.standardagents/mcp.json`.\n */\nfunction configFile(): string {\n return process.env.STANDARDAGENTS_MCP_CONFIG || path.join(os.homedir(), \".standardagents\", \"mcp.json\");\n}\n\n/** A locally-launchable MCP server (stdio transport). */\nexport interface McpServerConfig {\n /** Stable, human-readable id (used to namespace tools, e.g. `mcp:<name>/<tool>`). */\n name: string;\n /** Executable to spawn (e.g. `node`, `npx`, `uvx`, an absolute path). */\n command: string;\n /** Arguments passed to the command. */\n args: string[];\n /** Extra environment variables for the server process (merged over the CLI's env). */\n env?: Record<string, string>;\n /** Working directory for the server process (defaults to the project dir). */\n cwd?: string;\n /** When false, the server is remembered but not connected on startup. */\n enabled: boolean;\n}\n\nexport interface McpConfigFile {\n servers: Record<string, McpServerConfig>;\n}\n\nexport function loadMcpConfig(): McpConfigFile {\n try {\n const raw = fs.readFileSync(configFile(), \"utf8\");\n const parsed = JSON.parse(raw) as McpConfigFile;\n if (!parsed.servers || typeof parsed.servers !== \"object\") parsed.servers = {};\n return parsed;\n } catch {\n return { servers: {} };\n }\n}\n\nexport function listMcpServers(): McpServerConfig[] {\n const cfg = loadMcpConfig();\n return Object.values(cfg.servers).sort((a, b) => a.name.localeCompare(b.name));\n}\n\nexport function saveMcpServer(server: McpServerConfig): void {\n const cfg = loadMcpConfig();\n cfg.servers[server.name] = server;\n write(cfg);\n}\n\nexport function removeMcpServer(name: string): void {\n const cfg = loadMcpConfig();\n delete cfg.servers[name];\n write(cfg);\n}\n\nexport function setMcpServerEnabled(name: string, enabled: boolean): void {\n const cfg = loadMcpConfig();\n const s = cfg.servers[name];\n if (!s) return;\n s.enabled = enabled;\n write(cfg);\n}\n\nfunction write(cfg: McpConfigFile): void {\n const file = configFile();\n fs.mkdirSync(path.dirname(file), { recursive: true });\n fs.writeFileSync(file, JSON.stringify(cfg, null, 2), { mode: 0o600 });\n}\n\n/**\n * Parse a server definition from a CLI-style command string, e.g.\n * `weather: npx -y @modelcontextprotocol/server-weather`\n * The part before the first `:` is the server name; the rest is the command +\n * args. Returns null if the shape is unusable.\n */\nexport function parseServerSpec(spec: string): McpServerConfig | null {\n const trimmed = spec.trim();\n const colon = trimmed.indexOf(\":\");\n if (colon <= 0) return null;\n const name = trimmed.slice(0, colon).trim();\n const rest = trimmed.slice(colon + 1).trim();\n if (!name || !rest) return null;\n const parts = tokenize(rest);\n if (!parts.length) return null;\n const [command, ...args] = parts;\n return { name, command, args, enabled: true };\n}\n\n/**\n * Build a server config from a short name + a full command line, e.g.\n * serverFromCommand(\"playwright\", \"npx -y @playwright/mcp@latest\")\n * Returns null if the name or command is unusable.\n */\nexport function serverFromCommand(\n name: string,\n commandLine: string,\n env?: Record<string, string>\n): McpServerConfig | null {\n const cleanName = name.trim();\n const parts = tokenize(commandLine.trim());\n if (!cleanName || !parts.length) return null;\n const [command, ...args] = parts;\n return { name: cleanName, command, args, env, enabled: true };\n}\n\n/** Minimal shell-ish tokenizer that honours single/double quotes (no expansion). */\nfunction tokenize(input: string): string[] {\n const out: string[] = [];\n let cur = \"\";\n let quote: '\"' | \"'\" | null = null;\n for (let i = 0; i < input.length; i++) {\n const ch = input[i];\n if (quote) {\n if (ch === quote) quote = null;\n else cur += ch;\n } else if (ch === '\"' || ch === \"'\") {\n quote = ch;\n } else if (/\\s/.test(ch)) {\n if (cur) {\n out.push(cur);\n cur = \"\";\n }\n } else {\n cur += ch;\n }\n }\n if (cur) out.push(cur);\n return out;\n}\n","export * from \"@standardagents/code-network/credentials-node\";\n","/**\n * Device-code browser sign-in + browser-open helper, shared by the interactive\n * CLI and `standardcode daemon install` (a VPS install prints the URL for the\n * user to open elsewhere — the flow is Wrangler-style: URL first, then a\n * best-effort local browser open).\n */\nimport { spawn } from \"node:child_process\";\nimport { stdout as output } from \"node:process\";\nimport { startDeviceLogin, pollDeviceLogin } from \"@standardagents/code-network/device-login\";\nimport { inheritedSubprocessEnv } from \"./subprocess-env.ts\";\n\nconst c = {\n reset: \"\\x1b[0m\",\n dim: \"\\x1b[2m\",\n teal: \"\\x1b[38;5;37m\",\n};\n\n/**\n * Device-code browser sign-in: start a device login on the instance, open the\n * approval URL in the browser (hosted instances route an anonymous visit\n * through the Standard Agents platform login first), and poll until it mints\n * our personal API key. Throws with a plain message on timeout or failure.\n */\nexport async function deviceLogin(endpoint: string): Promise<string> {\n const info = await startDeviceLogin(endpoint);\n // Wrangler-style: the URL is printed FIRST (copy-pasteable if the browser\n // doesn't open — SSH sessions, containers), then we try to open it.\n output.write(`${c.dim}Opening your browser to sign in. If it doesn't open, visit:${c.reset}\\n`);\n output.write(`\\n ${c.teal}${info.verify_url}${c.reset}\\n\\n`);\n output.write(`${c.dim}Waiting for sign-in to complete… (Ctrl-C to cancel)${c.reset}\\n`);\n openUrl(info.verify_url);\n return pollDeviceLogin(info);\n}\n\n/** Open a URL in the system browser (best effort). */\nexport function openUrl(url: string): void {\n const platform = process.platform;\n const cmd = platform === \"darwin\" ? \"open\" : platform === \"win32\" ? \"cmd\" : \"xdg-open\";\n const args = platform === \"win32\" ? [\"/c\", \"start\", \"\", url] : [url];\n try {\n const child = spawn(cmd, args, {\n stdio: \"ignore\",\n detached: true,\n env: inheritedSubprocessEnv(),\n });\n child.unref();\n } catch {\n // ignore — the URL is also printed for manual opening\n }\n}\n","export * from \"@standardagents/code-network/recorder\";\nexport * from \"@standardagents/code-network/recorder-node\";\n","/** Product constants + small environment helpers shared by the interactive\n * CLI (index.ts) and the daemon (daemon.ts). */\nimport fs from \"node:fs\";\n\n// The agent roster and product identity live in the shared core so every\n// face reads one definition (packages/core/src/agents.ts).\nexport {\n AGENT_ID,\n AGENT_ID_VARIANTS,\n OPENSAMA_AGENT_ID,\n AGENT_CHOICES,\n DEFAULT_AGENT_ID,\n isRootCodeAgent,\n PRODUCTION_ENDPOINT,\n} from \"@standardagents/code-network/agents\";\n\n/** Read this package's version from package.json (best effort). */\n/** Version stamped into the published bundle by tsup at build time (the\n * release flow bumps package.json before building). Undefined under tsx. */\ndeclare const __STANDARDCODE_VERSION__: string | undefined;\n\nexport function readVersion(): string {\n // The shipped package.json is the source of truth (always in lockstep with\n // the installed package); the build-time stamp is the packaging-oddity\n // fallback so `--version` can never come up empty on a published build.\n try {\n const pkg = JSON.parse(fs.readFileSync(new URL(\"../package.json\", import.meta.url), \"utf8\"));\n if (typeof pkg.version === \"string\" && pkg.version) return pkg.version;\n } catch {\n // fall through to the build-time stamp\n }\n return typeof __STANDARDCODE_VERSION__ === \"string\" ? __STANDARDCODE_VERSION__ : \"\";\n}\n\n/** Whether a hostname is a local/private dev address (loopback, .local, RFC-1918). */\nexport function isLocalHost(host: string): boolean {\n return (\n host === \"localhost\" ||\n host === \"127.0.0.1\" ||\n host === \"::1\" ||\n host.endsWith(\".local\") ||\n host.endsWith(\".localhost\") ||\n /^10\\./.test(host) ||\n /^192\\.168\\./.test(host) ||\n /^172\\.(1[6-9]|2\\d|3[01])\\./.test(host)\n );\n}\n\n/**\n * Relax TLS verification for local/private endpoints only. OrbStack (and other\n * local dev setups) serve HTTPS with a CA installed in the system keychain —\n * which curl and browsers trust, but Node's `fetch`/`WebSocket` do not, so they\n * fail with SELF_SIGNED_CERT_IN_CHAIN and every token \"doesn't work\". For a\n * loopback/`.local`/RFC-1918 host we disable verification (covering fetch and\n * the bridge/stream WebSockets); public endpoints keep full verification.\n * Returns true when verification was relaxed.\n */\nexport function relaxTlsForLocalEndpoint(endpoint: string): boolean {\n let host = \"\";\n try {\n host = new URL(endpoint).hostname;\n } catch {\n return false;\n }\n if (!endpoint.startsWith(\"https:\") || !isLocalHost(host)) return false;\n // Filter out Node's global \"insecure TLS\" warning; we surface our own note.\n const origEmit = process.emitWarning.bind(process);\n process.emitWarning = ((warning: string | Error, ...args: unknown[]) => {\n const msg = typeof warning === \"string\" ? warning : warning?.message ?? \"\";\n if (msg.includes(\"NODE_TLS_REJECT_UNAUTHORIZED\")) return;\n return (origEmit as (...a: unknown[]) => void)(warning, ...args);\n }) as typeof process.emitWarning;\n process.env.NODE_TLS_REJECT_UNAUTHORIZED = \"0\";\n return true;\n}\n","/**\n * Stable machine identity for this host (~/.standardagents/machine.json).\n *\n * Every machine that runs Standard Code — a laptop's interactive CLI or a\n * VPS daemon — gets one durable random id. The id keys this machine's record\n * in the account-wide machine registry (see registry.ts) and forms the\n * client identities the bridge uses for execution ownership:\n *\n * daemon:<machine_id> — the daemon (stable across restarts, so a\n * rebooted VPS reclaims its threads)\n * cli:<machine_id>:<random> — one interactive CLI process (unique per\n * process, so two terminals never both own)\n */\nimport crypto from \"node:crypto\";\nimport fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\n\n// Resolved lazily (not cached at import) so a changed HOME is always honored —\n// this is what lets tests isolate to a temp home and keeps a long-lived daemon\n// correct if its home ever changes.\nconst dir = () => path.join(os.homedir(), \".standardagents\");\nconst file = () => path.join(dir(), \"machine.json\");\n\n/**\n * machine.json holds ONLY this host's hardware identity — a stable random id.\n * The user-facing NAME is NOT here: a machine's name is a label the user\n * assigns in THEIR account, so it lives on the instance (the machine registry\n * record in user KV), not on the machine's disk. See registry.ts\n * `getMachineName` / `setMachineName`.\n */\nexport interface MachineIdentity {\n machine_id: string;\n created_at: number;\n}\n\n/** Load this host's machine identity, creating one on first use. */\nexport function loadMachineIdentity(): MachineIdentity {\n try {\n const parsed = JSON.parse(fs.readFileSync(file(), \"utf8\")) as MachineIdentity;\n if (typeof parsed.machine_id === \"string\" && parsed.machine_id.length > 0) {\n // machine.json may carry a legacy `name` from before names moved to the\n // account — we keep only the id + created_at (the name migrates via the\n // registry record's fallback; see registry.ts).\n return { machine_id: parsed.machine_id, created_at: parsed.created_at ?? Date.now() };\n }\n } catch {\n // first run (or corrupt file) — mint a fresh identity below\n }\n const identity: MachineIdentity = {\n machine_id: crypto.randomUUID(),\n created_at: Date.now(),\n };\n saveMachineIdentity(identity);\n return identity;\n}\n\nexport function saveMachineIdentity(identity: MachineIdentity): void {\n fs.mkdirSync(dir(), { recursive: true });\n fs.writeFileSync(file(), JSON.stringify(identity, null, 2), { mode: 0o600 });\n}\n\n/** The daemon's stable bridge client id for this machine. */\nexport function daemonClientId(identity: MachineIdentity): string {\n return `daemon:${identity.machine_id}`;\n}\n\n/** A per-process interactive bridge client id for this machine. */\nexport function interactiveClientId(identity: MachineIdentity): string {\n return `cli:${identity.machine_id}:${crypto.randomBytes(4).toString(\"hex\")}`;\n}\n\n/** The machine id inside a daemon client id, or null for any other id. */\nexport function machineIdFromDaemonClientId(clientId: string | null | undefined): string | null {\n if (typeof clientId !== \"string\") return null;\n return clientId.startsWith(\"daemon:\") ? clientId.slice(\"daemon:\".length) : null;\n}\n","/**\n * The account-wide machine registry.\n *\n * Every machine on the account (laptop CLIs and VPS daemons) keeps one record\n * in the user's account-wide KV on the instance, keyed\n * `standardcode.machine.<machine_id>`. The record carries the machine's\n * identity, its known project directories, and explicit daemon account-stream\n * presence so the session-start picker offers live remote machines.\n *\n * Records are per-machine keys so concurrent machine updates never clobber\n * another machine's state.\n */\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport crypto from \"node:crypto\";\nimport { execFileSync } from \"node:child_process\";\nimport type { ApiClient } from \"./api.ts\";\nimport type { AccountUserStream } from \"./account-user-stream.ts\";\nimport type { MachineIdentity } from \"./machine.ts\";\nimport { readVersion } from \"./product.ts\";\nimport { ProcessRegistry } from \"./process-registry.ts\";\nimport { inheritedSubprocessEnv } from \"./subprocess-env.ts\";\nimport { parseStopProcessArgs } from \"@standardagents/code-network/registry\";\n\nexport { parseStopProcessArgs };\nexport type { StopProcessArgs } from \"@standardagents/code-network/registry\";\n\nconst KEY_PREFIX = \"standardcode.machine.\";\n/** Per-machine command queue lives at `<machine key>.cmd` (a separate user-KV\n * key so a client enqueueing a command never races the daemon's record\n * read-modify-write of the machine record itself). */\nconst CMD_SUFFIX = \".cmd\";\n/**\n * The user-assigned machine NAME lives at `<machine key>.name` — a dedicated\n * account key that ONLY the user edits (via /machines rename) and the daemon\n * NEVER writes. This is why renaming a machine is a direct account write from\n * any client (no daemon round-trip) and can't be reverted by the daemon's\n * metadata writes. The base record's `name` is a machine-reported default (hostname)\n * and the migration fallback for installs whose name predates this split.\n */\nconst NAME_SUFFIX = \".name\";\n/**\n * The user-assigned machine ICON (an emoji) lives at `<machine key>.icon` —\n * like `.name`, a dedicated account key ONLY the user edits and the daemon\n * NEVER writes, overlaid onto the record on read. Synced across every surface.\n */\nconst ICON_SUFFIX = \".icon\";\n/**\n * The remote file-browser RPC lives at `<machine key>.fsreq` (request, written\n * by a browsing client) and `<machine key>.fsres` (response, written by the\n * machine's daemon). It's a machine-scoped mirror of the thread-KV approval\n * relay: single in-flight request per machine, correlated by `nonce`. A\n * separate key from `.cmd` and the record so browse traffic stays isolated.\n */\nconst FSREQ_SUFFIX = \".fsreq\";\nconst FSRES_SUFFIX = \".fsres\";\n/**\n * User-assigned PROJECT display names live at `<machine key>.projnames` — one\n * map of absolute path → name per machine. Like `.name`/`.icon`, an account\n * key ONLY the user edits and the daemon NEVER writes, overlaid onto the\n * record's `projects` entries on read. A project's default name is its\n * directory basename; renaming it here never touches the directory itself.\n */\nconst PROJNAMES_SUFFIX = \".projnames\";\n\n/** Compatibility window for records written by legacy heartbeat daemons. */\nexport const DAEMON_ONLINE_WINDOW_MS = 90 * 1000;\n\nexport interface MachineProjectRecord {\n /** Display name: the directory's basename by default; a user-assigned name\n * from the account `.projnames` key overrides it on read. */\n name: string;\n last_used_at: number;\n /** The project's git origin URL, when the directory is a git repo. */\n repository?: string | null;\n}\n\nexport interface DaemonRecord {\n version: string;\n installed_at: number;\n last_seen_at: number;\n /** Live account-stream state. Older records omit this and use the timestamp window. */\n connected?: boolean;\n pid?: number;\n}\n\nexport interface MachineRecord {\n id: string;\n name: string;\n hostname: string;\n platform: string;\n arch: string;\n /** The @standardagents/code version this machine last ran (any client). */\n version?: string;\n daemon?: DaemonRecord | null;\n /** User-assigned emoji icon (account `<id>.icon` key), overlaid on read. */\n icon?: string;\n /** Absolute project path → record. */\n projects: Record<string, MachineProjectRecord>;\n created_at: number;\n updated_at: number;\n}\n\n/**\n * A management command a client queues for a machine's daemon to apply.\n * (Renaming is NOT here — a name is account data, so a rename is a direct\n * user-KV write via {@link setMachineName}, no daemon needed.)\n */\nexport interface MachineCommand {\n id: string;\n kind: \"update\" | \"add_project\" | \"remove_project\" | \"stop_process\";\n args?: Record<string, unknown>;\n requested_at: number;\n}\n\nexport function machineKey(machineId: string): string {\n return `${KEY_PREFIX}${machineId}`;\n}\n\nfunction commandKey(machineId: string): string {\n return `${KEY_PREFIX}${machineId}${CMD_SUFFIX}`;\n}\n\nfunction nameKey(machineId: string): string {\n return `${KEY_PREFIX}${machineId}${NAME_SUFFIX}`;\n}\n\nfunction iconKey(machineId: string): string {\n return `${KEY_PREFIX}${machineId}${ICON_SUFFIX}`;\n}\n\nfunction projectNamesKey(machineId: string): string {\n return `${KEY_PREFIX}${machineId}${PROJNAMES_SUFFIX}`;\n}\n\nfunction fsRequestKey(machineId: string): string {\n return `${KEY_PREFIX}${machineId}${FSREQ_SUFFIX}`;\n}\nfunction fsResponseKey(machineId: string): string {\n return `${KEY_PREFIX}${machineId}${FSRES_SUFFIX}`;\n}\n\n// ── remote file-browser RPC ───────────────────────────────────────────────────\nexport interface FsBrowseRequest {\n nonce: string;\n op: \"list\" | \"mkdir\";\n path: string;\n /** For `mkdir`: the new folder's name to create under `path`. */\n name?: string;\n show_hidden?: boolean;\n requested_at: number;\n}\nexport interface FsBrowseResponse {\n nonce: string;\n ok: boolean;\n result?: unknown; // a BrowseResult (see fs-browse.ts); kept opaque here\n error?: string;\n responded_at: number;\n}\n\nfunction parseFsRequest(value: unknown): FsBrowseRequest | null {\n if (!value || typeof value !== \"object\") return null;\n const r = value as Record<string, unknown>;\n const op = r.op === \"mkdir\" ? \"mkdir\" : r.op === \"list\" ? \"list\" : null;\n if (typeof r.nonce !== \"string\" || !op || typeof r.path !== \"string\") return null;\n return {\n nonce: r.nonce,\n op,\n path: r.path,\n name: typeof r.name === \"string\" ? r.name : undefined,\n show_hidden: r.show_hidden === true,\n requested_at: typeof r.requested_at === \"number\" ? r.requested_at : Date.now(),\n };\n}\n\n/** Client side: enqueue a browse request for a machine's daemon. */\nexport async function writeFsRequest(\n api: ApiClient,\n machineId: string,\n req: Omit<FsBrowseRequest, \"requested_at\">\n): Promise<void> {\n await api.userKvSet(fsRequestKey(machineId), { ...req, requested_at: Date.now() });\n}\n\n/** Client side: read the daemon's response (null until it answers). */\nexport async function readFsResponse(api: ApiClient, machineId: string): Promise<FsBrowseResponse | null> {\n const value = await api.userKvGet(fsResponseKey(machineId));\n if (!value || typeof value !== \"object\") return null;\n const r = value as Record<string, unknown>;\n if (typeof r.nonce !== \"string\" || typeof r.ok !== \"boolean\") return null;\n return {\n nonce: r.nonce,\n ok: r.ok,\n result: r.result,\n error: typeof r.error === \"string\" ? r.error : undefined,\n responded_at: typeof r.responded_at === \"number\" ? r.responded_at : 0,\n };\n}\n\n/** Daemon side: read the pending browse request for THIS machine. */\nexport async function readFsRequest(api: ApiClient, machineId: string): Promise<FsBrowseRequest | null> {\n return parseFsRequest(await api.userKvGet(fsRequestKey(machineId)));\n}\n\n/**\n * Publish one browse request, then wait for its response invalidation on the\n * client's existing account stream. The response is read once per event. A\n * reconnect performs one reconciliation read because user events are\n * live-only and the response may have landed while the socket was down.\n */\nexport async function requestFsBrowse(\n api: ApiClient,\n accountStream: AccountUserStream,\n machineId: string,\n req: Omit<FsBrowseRequest, \"requested_at\">,\n timeoutMs = 15_000\n): Promise<FsBrowseResponse> {\n await accountStream.waitUntilConnected(timeoutMs);\n const responseKey = fsResponseKey(machineId);\n\n return new Promise<FsBrowseResponse>((resolve, reject) => {\n let settled = false;\n let reading = false;\n let readAgain = false;\n let timer: ReturnType<typeof setTimeout>;\n let removeEvent = () => {};\n let removeConnection = () => {};\n\n const cleanup = () => {\n clearTimeout(timer);\n removeEvent();\n removeConnection();\n };\n const fail = (error: unknown) => {\n if (settled) return;\n settled = true;\n cleanup();\n reject(error);\n };\n const read = async () => {\n if (settled) return;\n if (reading) {\n readAgain = true;\n return;\n }\n reading = true;\n try {\n do {\n readAgain = false;\n const response = await readFsResponse(api, machineId);\n if (response?.nonce === req.nonce) {\n settled = true;\n cleanup();\n resolve(response);\n return;\n }\n } while (readAgain && !settled);\n } catch (error) {\n fail(error);\n } finally {\n reading = false;\n }\n };\n\n removeEvent = accountStream.onEvent((event, data) => {\n if (event !== \"standardcode.machine_changed\") return;\n const key = data && typeof data === \"object\" ? (data as { key?: unknown }).key : null;\n if (key === responseKey) void read();\n });\n removeConnection = accountStream.onConnection((state) => {\n if (state === \"connected\") void read();\n });\n timer = setTimeout(\n () => fail(new Error(\"The remote machine did not answer in time.\")),\n timeoutMs\n );\n\n void writeFsRequest(api, machineId, req).catch(fail);\n });\n}\n\n/** Daemon side: publish the browse result for the request's nonce. */\nexport async function writeFsResponse(\n api: ApiClient,\n machineId: string,\n res: Omit<FsBrowseResponse, \"responded_at\">\n): Promise<void> {\n await api.userKvSet(fsResponseKey(machineId), { ...res, responded_at: Date.now() });\n}\n\n/** A machine's icon: the user's account-set emoji, else a platform default\n * (💻 macOS, 🖥️ Windows, 🖳 Linux/other). Universal across every surface. */\nexport function machineIcon(record: { icon?: string | null; platform?: string | null }): string {\n if (record.icon && record.icon.trim()) return record.icon.trim();\n if (record.platform === \"darwin\") return \"💻\";\n if (record.platform === \"win32\") return \"🖥️\";\n return \"🖳\";\n}\n\n/** A machine's display name: the user's account-set name, else the machine's\n * reported hostname, else its id. Takes a record (already name-overlaid by\n * loadMachine/loadMachines) or any object with these fields. */\nexport function machineDisplayName(record: {\n name?: string | null;\n hostname?: string | null;\n id?: string | null;\n}): string {\n return (record.name?.trim() || \"\") || (record.hostname || \"\") || (record.id || \"\") || \"machine\";\n}\n\n/** Read a machine's user-assigned name from the account (null if unset). */\nexport async function getMachineName(api: ApiClient, machineId: string): Promise<string | null> {\n const v = await api.userKvGet(nameKey(machineId));\n return typeof v === \"string\" && v.trim() ? v.trim() : null;\n}\n\n/**\n * Set (or clear) a machine's name in the ACCOUNT — a direct user-KV write that\n * any client can make for any of the user's machines. The daemon never writes\n * this key, so a remote rename is authoritative and can't be reverted by a\n * metadata update. Passing an empty name clears it (reverts to the hostname default).\n */\nexport async function setMachineName(api: ApiClient, machineId: string, name: string): Promise<void> {\n const trimmed = name.trim();\n await api.userKvSet(nameKey(machineId), trimmed || null);\n}\n\nfunction parseMachineRecord(value: unknown): MachineRecord | null {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return null;\n const r = value as Record<string, unknown>;\n if (typeof r.id !== \"string\" || r.id.length === 0) return null;\n return {\n id: r.id,\n name: typeof r.name === \"string\" && r.name ? r.name : String(r.hostname ?? r.id),\n hostname: typeof r.hostname === \"string\" ? r.hostname : \"\",\n platform: typeof r.platform === \"string\" ? r.platform : \"\",\n arch: typeof r.arch === \"string\" ? r.arch : \"\",\n version: typeof r.version === \"string\" ? r.version : undefined,\n daemon:\n r.daemon && typeof r.daemon === \"object\" && !Array.isArray(r.daemon)\n ? (r.daemon as unknown as DaemonRecord)\n : null,\n // Clone rather than alias the caller's object: read-side overlays (e.g.\n // user-assigned project names) mutate the parsed record's entries and\n // must never write through into the source value.\n projects:\n r.projects && typeof r.projects === \"object\" && !Array.isArray(r.projects)\n ? structuredClone(r.projects as Record<string, MachineProjectRecord>)\n : {},\n created_at: typeof r.created_at === \"number\" ? r.created_at : 0,\n updated_at: typeof r.updated_at === \"number\" ? r.updated_at : 0,\n };\n}\n\n/** The base record only (no account name overlay) — used by the write path so\n * a metadata update never folds the user's name into the daemon-written record.\n * `strict` propagates read FAILURES instead of returning null: the\n * read-modify-write path must never mistake a transport error for \"no record\n * yet\" and replace the real record with a fresh empty one. */\nasync function loadRawMachine(\n api: ApiClient,\n machineId: string,\n opts?: { strict?: boolean }\n): Promise<MachineRecord | null> {\n return parseMachineRecord(await api.userKvGet(machineKey(machineId), opts));\n}\n\n/**\n * All machine records on the account, each with its account NAME overlaid.\n * The `standardcode.machine.` prefix also covers the `.name` and `.cmd`\n * sibling keys, so we partition: base records, name overrides, command queues.\n */\nexport async function loadMachines(api: ApiClient): Promise<MachineRecord[]> {\n const entries = await api.userKvList(KEY_PREFIX);\n const records: MachineRecord[] = [];\n const names = new Map<string, string>();\n const icons = new Map<string, string>();\n const projNames = new Map<string, Record<string, string>>();\n for (const e of entries) {\n const rest = e.key.slice(KEY_PREFIX.length);\n if (rest.endsWith(CMD_SUFFIX) || rest.endsWith(FSREQ_SUFFIX) || rest.endsWith(FSRES_SUFFIX)) continue;\n if (rest.endsWith(NAME_SUFFIX)) {\n const id = rest.slice(0, -NAME_SUFFIX.length);\n if (typeof e.value === \"string\" && e.value.trim()) names.set(id, e.value.trim());\n continue;\n }\n if (rest.endsWith(ICON_SUFFIX)) {\n const id = rest.slice(0, -ICON_SUFFIX.length);\n if (typeof e.value === \"string\" && e.value.trim()) icons.set(id, e.value.trim());\n continue;\n }\n if (rest.endsWith(PROJNAMES_SUFFIX)) {\n const id = rest.slice(0, -PROJNAMES_SUFFIX.length);\n const map = parseProjectNames(e.value);\n if (map) projNames.set(id, map);\n continue;\n }\n const rec = parseMachineRecord(e.value);\n if (rec) records.push(rec);\n }\n for (const rec of records) {\n const override = names.get(rec.id);\n if (override) rec.name = override;\n const icon = icons.get(rec.id);\n if (icon) rec.icon = icon;\n overlayProjectNames(rec, projNames.get(rec.id));\n }\n return records;\n}\n\n/** Parse a `.projnames` value: a plain map of absolute path → display name. */\nfunction parseProjectNames(value: unknown): Record<string, string> | null {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return null;\n const out: Record<string, string> = {};\n for (const [dir, name] of Object.entries(value as Record<string, unknown>)) {\n if (typeof name === \"string\" && name.trim()) out[dir] = name.trim();\n }\n return out;\n}\n\n/** Fold user-assigned project names onto a record's `projects` entries. */\nfunction overlayProjectNames(record: MachineRecord, names?: Record<string, string> | null): void {\n if (!names) return;\n for (const [dir, name] of Object.entries(names)) {\n const project = record.projects[dir];\n if (project) project.name = name;\n }\n}\n\n/** A project's display name: its record `name` (account-overlaid), else the\n * directory's basename. */\nexport function projectDisplayName(dir: string, project?: MachineProjectRecord | null): string {\n return project?.name?.trim() || path.basename(dir) || dir;\n}\n\n/**\n * Display labels for a SET of projects: each one's display name, qualified\n * with its parent directory (`parent/name`) when several projects share a\n * name — e.g. a worktree copy next to the root checkout. Unambiguous names\n * stay short.\n */\nexport function projectDisplayLabels(\n projects: Record<string, MachineProjectRecord | null | undefined>\n): Map<string, string> {\n const names = new Map<string, string>();\n const counts = new Map<string, number>();\n for (const [dir, p] of Object.entries(projects)) {\n const n = projectDisplayName(dir, p);\n names.set(dir, n);\n counts.set(n, (counts.get(n) ?? 0) + 1);\n }\n const out = new Map<string, string>();\n for (const [dir, n] of names) {\n if ((counts.get(n) ?? 0) > 1) {\n const parts = dir.split(/[\\\\/]/).filter(Boolean);\n const parent = parts.length > 1 ? parts[parts.length - 2] : \"\";\n out.set(dir, parent ? `${parent}/${n}` : n);\n } else {\n out.set(dir, n);\n }\n }\n return out;\n}\n\n/** Read a machine's user-assigned project names from the account. */\nexport async function getProjectNames(api: ApiClient, machineId: string): Promise<Record<string, string>> {\n return parseProjectNames(await api.userKvGet(projectNamesKey(machineId))) ?? {};\n}\n\n/** Set (or clear, with an empty name) a project's display name in the ACCOUNT\n * — a direct user-KV write like a machine rename: works for any machine, no\n * daemon needed, and never touches the directory on disk. */\nexport async function setProjectName(\n api: ApiClient,\n machineId: string,\n dir: string,\n name: string\n): Promise<void> {\n const map = await getProjectNames(api, machineId);\n const trimmed = name.trim();\n if (trimmed) map[dir] = trimmed;\n else delete map[dir];\n await api.userKvSet(projectNamesKey(machineId), Object.keys(map).length ? map : null);\n}\n\n/** Read a machine's user-assigned emoji icon from the account (null if unset). */\nexport async function getMachineIcon(api: ApiClient, machineId: string): Promise<string | null> {\n const v = await api.userKvGet(iconKey(machineId));\n return typeof v === \"string\" && v.trim() ? v.trim() : null;\n}\n\n/** Set (or clear) a machine's emoji icon in the ACCOUNT — a direct user-KV\n * write, synced to every surface. Empty clears it. */\nexport async function setMachineIcon(api: ApiClient, machineId: string, icon: string): Promise<void> {\n const trimmed = icon.trim();\n await api.userKvSet(iconKey(machineId), trimmed || null);\n}\n\n/** One machine record with its account NAME overlaid, or null. */\nexport async function loadMachine(api: ApiClient, machineId: string): Promise<MachineRecord | null> {\n const rec = await loadRawMachine(api, machineId);\n if (!rec) return null;\n const [override, icon, projNames] = await Promise.all([\n getMachineName(api, machineId),\n getMachineIcon(api, machineId),\n getProjectNames(api, machineId),\n ]);\n if (override) rec.name = override;\n if (icon) rec.icon = icon;\n overlayProjectNames(rec, projNames);\n return rec;\n}\n\n/** Compatibility timestamp used while every client learns the explicit state. */\nexport const CONNECTED_LAST_SEEN_AT = Number.MAX_SAFE_INTEGER;\n\n/** Whether a machine currently has a connected daemon account stream. */\nexport function daemonOnline(record: MachineRecord, now = Date.now()): boolean {\n if (!record.daemon) return false;\n if (typeof record.daemon.connected === \"boolean\") return record.daemon.connected;\n return now - record.daemon.last_seen_at < DAEMON_ONLINE_WINDOW_MS;\n}\n\n/** A fresh record for this machine (used when none exists yet). The `name`\n * here is the machine-reported default (hostname); the user's chosen name\n * lives in the account `.name` key and is overlaid on read. */\nfunction newRecord(identity: MachineIdentity): MachineRecord {\n const now = Date.now();\n return {\n id: identity.machine_id,\n name: os.hostname(),\n hostname: os.hostname(),\n platform: process.platform,\n arch: process.arch,\n version: readVersion() || undefined,\n daemon: null,\n projects: {},\n created_at: now,\n updated_at: now,\n };\n}\n\n/**\n * Upsert this machine's record with fresh host facts and (optionally) mutate\n * it. Read-modify-write on this machine's OWN key only, so machines never\n * race each other.\n */\nexport async function updateOwnMachineRecord(\n api: ApiClient,\n identity: MachineIdentity,\n mutate?: (record: MachineRecord) => void\n): Promise<MachineRecord> {\n // Operate on the RAW base record (no name overlay): the daemon must never\n // fold the user's account-set name into the record it writes, or its next\n // metadata write could revert a rename. The user's name lives in the `.name` key.\n // STRICT read: a transport failure here must abort the update (throw) —\n // writing `newRecord` after a failed read is how a deploy-window blip once\n // wiped a machine's entire project list.\n const existing = await loadRawMachine(api, identity.machine_id, { strict: true });\n const record = existing ?? newRecord(identity);\n // Preserve the base record's `name` (a hostname default, or a legacy synced\n // name that serves as the migration fallback) — never overwrite it here.\n record.hostname = os.hostname();\n record.platform = process.platform;\n record.arch = process.arch;\n record.version = readVersion() || record.version;\n mutate?.(record);\n record.updated_at = Date.now();\n await api.userKvSet(machineKey(identity.machine_id), record);\n return record;\n}\n\n/**\n * Publish the daemon account stream's lifecycle in this machine's record.\n * This is one write per connection transition. The timestamp preserves\n * compatibility with clients released before the explicit `connected` field.\n */\nexport async function setDaemonPresence(\n api: ApiClient,\n identity: MachineIdentity,\n version: string,\n connected: boolean,\n pid = process.pid\n): Promise<void> {\n await updateOwnMachineRecord(api, identity, (record) => {\n const now = Date.now();\n record.daemon = {\n version,\n installed_at: record.daemon?.installed_at ?? now,\n last_seen_at: connected ? CONNECTED_LAST_SEEN_AT : 0,\n connected,\n pid,\n };\n });\n}\n\n/** The directory's git origin URL, or null (best effort, never throws). */\nexport function projectRepository(projectDir: string): string | null {\n try {\n const url = execFileSync(\"git\", [\"-C\", projectDir, \"remote\", \"get-url\", \"origin\"], {\n encoding: \"utf8\",\n timeout: 3000,\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n env: inheritedSubprocessEnv(),\n }).trim();\n return url || null;\n } catch {\n return null;\n }\n}\n\n/**\n * Canonicalize a project directory for THIS machine's registry record: expand\n * a leading `~` against this machine's home and resolve to an absolute path.\n * Only ever used on the machine that owns the record (register/unregister are\n * own-key writes), so `os.homedir()` is authoritative. Remote heads that only\n * know a typed `~/…` path resolve it through the fs-browse RPC instead — but\n * a queued `add_project` command may still deliver a raw `~/…`, so the write\n * path normalizes defensively.\n */\nfunction normalizeProjectDir(projectDir: string): string {\n let p = projectDir.trim();\n if (!p) return p;\n if (p === \"~\") p = os.homedir();\n else if (p.startsWith(\"~/\")) p = path.join(os.homedir(), p.slice(2));\n return path.resolve(p);\n}\n\n/** Record that this machine has (just used) a project directory. */\nexport async function registerProject(\n api: ApiClient,\n identity: MachineIdentity,\n projectDir: string\n): Promise<void> {\n const dir = normalizeProjectDir(projectDir);\n if (!dir) return;\n const repository = projectRepository(dir);\n await updateOwnMachineRecord(api, identity, (record) => {\n // Retire aliases of the same directory (e.g. a legacy `~/app` entry once\n // its expansion is registered) so one directory is one project entry.\n for (const existing of Object.keys(record.projects)) {\n if (existing !== dir && normalizeProjectDir(existing) === dir) {\n delete record.projects[existing];\n }\n }\n record.projects[dir] = {\n name: dir.split(\"/\").filter(Boolean).pop() || dir,\n last_used_at: Date.now(),\n repository,\n };\n });\n}\n\n/** Remove a project directory from this machine's record. */\nexport async function unregisterProject(\n api: ApiClient,\n identity: MachineIdentity,\n projectDir: string\n): Promise<void> {\n const dir = normalizeProjectDir(projectDir);\n await updateOwnMachineRecord(api, identity, (record) => {\n for (const existing of Object.keys(record.projects)) {\n if (existing === projectDir || existing === dir || normalizeProjectDir(existing) === dir) {\n delete record.projects[existing];\n }\n }\n });\n}\n\n/** Legacy daemon heartbeat writer retained for older registry records. */\nexport async function touchDaemon(\n api: ApiClient,\n identity: MachineIdentity,\n version: string\n): Promise<void> {\n await updateOwnMachineRecord(api, identity, (record) => {\n const now = Date.now();\n record.daemon = {\n version,\n installed_at: record.daemon?.installed_at ?? now,\n last_seen_at: now,\n pid: process.pid,\n };\n });\n}\n\n/** Mark this machine's daemon uninstalled (clears the heartbeat block). */\nexport async function clearDaemon(api: ApiClient, identity: MachineIdentity): Promise<void> {\n await updateOwnMachineRecord(api, identity, (record) => {\n record.daemon = null;\n });\n}\n\n// ── management command channel ────────────────────────────────────────────────\n// A client manages a REMOTE machine (rename / update / add-remove projects) by\n// queueing a command in that machine's `.cmd` user-KV key; the machine's daemon\n// drains and applies it. (Managing the LOCAL machine is done directly, since\n// the client is on that filesystem — see the /machines command.)\n\nfunction parseCommands(value: unknown): MachineCommand[] {\n if (!Array.isArray(value)) return [];\n return value.filter(\n (c): c is MachineCommand =>\n !!c &&\n typeof c === \"object\" &&\n typeof (c as MachineCommand).id === \"string\" &&\n typeof (c as MachineCommand).kind === \"string\"\n );\n}\n\n/** Queue a management command for a machine's daemon. Returns the command id. */\nexport async function enqueueMachineCommand(\n api: ApiClient,\n machineId: string,\n kind: MachineCommand[\"kind\"],\n args?: Record<string, unknown>\n): Promise<string> {\n const key = commandKey(machineId);\n const queue = parseCommands(await api.userKvGet(key));\n const cmd: MachineCommand = {\n id: crypto.randomBytes(6).toString(\"hex\"),\n kind,\n args,\n requested_at: Date.now(),\n };\n queue.push(cmd);\n await api.userKvSet(key, queue);\n return cmd.id;\n}\n\n/** The daemon's view of its own pending commands. */\nexport async function readMachineCommands(\n api: ApiClient,\n machineId: string\n): Promise<MachineCommand[]> {\n return parseCommands(await api.userKvGet(commandKey(machineId)));\n}\n\n/** Remove applied commands (by id) from a machine's queue. */\nexport async function clearMachineCommands(\n api: ApiClient,\n machineId: string,\n appliedIds: string[]\n): Promise<void> {\n if (appliedIds.length === 0) return;\n const key = commandKey(machineId);\n const remaining = parseCommands(await api.userKvGet(key)).filter(\n (c) => !appliedIds.includes(c.id)\n );\n await api.userKvSet(key, remaining.length ? remaining : null);\n}\n\n/**\n * The host seams `stop_process` needs. Real signals and real timers by\n * default; a test supplies its own so it can assert exactly what would be\n * signaled without spawning a process.\n */\nexport interface MachineCommandHost {\n kill(pid: number, signal: NodeJS.Signals): void;\n isAlive(pid: number): boolean;\n /** One-shot grace timer before the SIGKILL escalation — never an interval. */\n after(ms: number, fn: () => void): void;\n}\n\n/** How long a process gets to exit on SIGTERM before it is SIGKILLed. */\nexport const STOP_PROCESS_GRACE_MS = 3000;\n\nexport const defaultMachineCommandHost: MachineCommandHost = {\n kill(pid, signal) {\n // A detached background process is its own group leader, so the negative\n // pid signals the whole tree rather than just the shell that started it.\n // Fall back to the bare pid when the group is already gone.\n try {\n process.kill(-pid, signal);\n } catch {\n process.kill(pid, signal);\n }\n },\n isAlive(pid) {\n try {\n process.kill(pid, 0);\n return true;\n } catch (err) {\n return (err as NodeJS.ErrnoException).code === \"EPERM\";\n }\n },\n after(ms, fn) {\n setTimeout(fn, ms).unref?.();\n },\n};\n\n/**\n * Stop one background process this machine's daemon spawned — the\n * deterministic kill behind every face's \"Stop now\". Faces own none of these\n * PIDs, so they queue the command here and the runner signals it: SIGTERM\n * first, then SIGKILL after a grace period if the process is still alive. The\n * registry entry is marked stopped exactly as the `background_process` tool's\n * own stop action marks it.\n *\n * The thread's `runner:` tag is the ONE authority for which machine executes a\n * thread, so it is also the authority for whose PIDs these are. A face can\n * queue this command against any machine; only the runner acts on it.\n */\nasync function stopBackgroundProcess(\n api: ApiClient,\n identity: MachineIdentity,\n cmd: MachineCommand,\n host: MachineCommandHost\n): Promise<string> {\n const args = parseStopProcessArgs(cmd.args);\n if (!args) return \"stop_process: ignored (missing threadId/processId)\";\n const { threadId, processId } = args;\n const shortThread = threadId.slice(0, 8);\n\n let tags: string[] = [];\n try {\n tags = (await api.getThread(threadId))?.tags ?? [];\n } catch (error) {\n return `stop_process: could not read thread ${shortThread} (${error instanceof Error ? error.message : String(error)})`;\n }\n if (!tags.includes(`runner:${identity.machine_id}`)) {\n return `stop_process: refused — thread ${shortThread} does not run on this machine`;\n }\n\n // Only `get` and `markStopped` are used here, and neither consults the\n // machine name (that field gates the liveness reconcile in `list`).\n const registry = new ProcessRegistry(api, threadId, os.hostname());\n const entry = await registry.get(processId);\n if (!entry) return `stop_process: no process ${processId} in thread ${shortThread}`;\n if (entry.status !== \"running\") return `stop_process: ${processId} is already ${entry.status}`;\n\n try {\n host.kill(entry.pid, \"SIGTERM\");\n } catch {\n // Already gone — the registry write below still settles its status.\n }\n host.after(STOP_PROCESS_GRACE_MS, () => {\n if (!host.isAlive(entry.pid)) return;\n try {\n host.kill(entry.pid, \"SIGKILL\");\n } catch {\n // Raced us to exit.\n }\n });\n await registry.markStopped(processId);\n return `stopped background process ${processId} (pid ${entry.pid})`;\n}\n\n/**\n * Apply one management command to THIS machine (daemon side): mutate local\n * identity/registry to match. Returns a short human result for the log.\n * `add_project`/`remove_project` only touch the registry record — the daemon\n * validates the directory exists when it later attaches a session there.\n */\nexport async function applyMachineCommand(\n api: ApiClient,\n identity: MachineIdentity,\n cmd: MachineCommand,\n host: MachineCommandHost = defaultMachineCommandHost\n): Promise<string> {\n switch (cmd.kind) {\n case \"stop_process\":\n return stopBackgroundProcess(api, identity, cmd, host);\n case \"add_project\": {\n const path = typeof cmd.args?.path === \"string\" ? cmd.args.path : \"\";\n if (!path) return \"add_project: ignored (no path)\";\n await registerProject(api, identity, path);\n return `added project ${path}`;\n }\n case \"remove_project\": {\n const path = typeof cmd.args?.path === \"string\" ? cmd.args.path : \"\";\n if (!path) return \"remove_project: ignored (no path)\";\n await unregisterProject(api, identity, path);\n return `removed project ${path}`;\n }\n case \"update\":\n // Handled specially by the daemon (it must run the package-manager\n // update and restart); nothing to mutate here.\n return \"update requested\";\n default:\n return `unknown command ${(cmd as MachineCommand).kind}`;\n }\n}\n","/**\n * Shallow, safe directory scanning for the remote file browser.\n *\n * The web/native \"new session\" flow lets you browse a machine's filesystem to\n * pick (or create) a project directory. That browsing runs HERE, in the daemon,\n * triggered by a machine-scoped KV request (see the fs-browse RPC in\n * `registry.ts` + the daemon's account-stream event handler). It is deliberately a STRUCTURE browser,\n * never a file reader:\n *\n * - one directory level per request (depth 1) — names + is-dir + a cheap\n * project/repo marker, never file contents;\n * - dotfiles hidden unless asked; results capped so a huge dir can't blow up a\n * KV value;\n * - `~` / empty resolves to the home directory, and the resolved absolute path\n * + parent come back so the browser can render a breadcrumb and navigate up.\n */\nimport fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\n\nexport interface DirEntry {\n name: string;\n /** True for a directory (or a symlink that resolves to one). */\n dir: boolean;\n /** True when the directory looks like a project root (has .git / a manifest). */\n project?: boolean;\n /** True when the directory is a git repository (has a .git entry). */\n repo?: boolean;\n}\n\nexport interface BrowseResult {\n /** The resolved absolute path that was listed. */\n path: string;\n /** The parent directory, or null at the filesystem root. */\n parent: string | null;\n /** The user's home directory — a natural \"home\" button target. */\n home: string;\n entries: DirEntry[];\n /** True when the listing was capped (more entries exist than `entries`). */\n truncated: boolean;\n error?: string;\n}\n\n/** Files whose presence marks a directory as a \"project\" worth highlighting. */\nconst PROJECT_MARKERS = [\n \".git\",\n \"package.json\",\n \"pyproject.toml\",\n \"Cargo.toml\",\n \"go.mod\",\n \"pom.xml\",\n \"build.gradle\",\n \"Gemfile\",\n \"composer.json\",\n \"requirements.txt\",\n \".standardagents\",\n];\n\nconst MAX_ENTRIES = 500;\n\n/** Expand a leading `~`, default an empty path to home, and normalize. */\nexport function resolveBrowsePath(input: string | undefined | null): string {\n const home = os.homedir();\n let p = (input ?? \"\").trim();\n if (!p) return home;\n if (p === \"~\") return home;\n if (p.startsWith(\"~/\")) p = path.join(home, p.slice(2));\n return path.resolve(p);\n}\n\n/** Cheap project/repo detection: a couple of existsSync probes per directory. */\nfunction markers(dirPath: string): { project: boolean; repo: boolean } {\n let repo = false;\n let project = false;\n for (const marker of PROJECT_MARKERS) {\n let hit = false;\n try {\n hit = fs.existsSync(path.join(dirPath, marker));\n } catch {\n hit = false;\n }\n if (!hit) continue;\n project = true;\n if (marker === \".git\") repo = true;\n if (repo) break;\n }\n return { project, repo };\n}\n\n/**\n * List a single directory level. Never throws — filesystem errors come back in\n * `error` with an empty listing so the browser can show a friendly message\n * (permission denied, not a directory, gone).\n */\nexport function browseDirectory(\n input: string | undefined | null,\n opts: { showHidden?: boolean } = {}\n): BrowseResult {\n const home = os.homedir();\n const abs = resolveBrowsePath(input);\n const parent = path.dirname(abs);\n const base: Omit<BrowseResult, \"entries\" | \"truncated\" | \"error\"> = {\n path: abs,\n parent: parent === abs ? null : parent,\n home,\n };\n\n let dirents: fs.Dirent[];\n try {\n const stat = fs.statSync(abs);\n if (!stat.isDirectory()) {\n return { ...base, entries: [], truncated: false, error: \"Not a directory\" };\n }\n dirents = fs.readdirSync(abs, { withFileTypes: true });\n } catch (err) {\n const code = (err as NodeJS.ErrnoException)?.code;\n const message =\n code === \"EACCES\" || code === \"EPERM\"\n ? \"Permission denied\"\n : code === \"ENOENT\"\n ? \"Folder not found\"\n : \"Could not read this folder\";\n return { ...base, entries: [], truncated: false, error: message };\n }\n\n const showHidden = !!opts.showHidden;\n const rawDirs: DirEntry[] = [];\n const rawFiles: DirEntry[] = [];\n\n for (const d of dirents) {\n const name = d.name;\n if (!showHidden && name.startsWith(\".\")) continue;\n\n let isDir = d.isDirectory();\n // Resolve symlinks so a linked directory still browses as a directory.\n if (d.isSymbolicLink()) {\n try {\n isDir = fs.statSync(path.join(abs, name)).isDirectory();\n } catch {\n isDir = false;\n }\n }\n\n if (isDir) {\n const { project, repo } = markers(path.join(abs, name));\n rawDirs.push({ name, dir: true, project: project || undefined, repo: repo || undefined });\n } else {\n rawFiles.push({ name, dir: false });\n }\n }\n\n const cmp = (a: DirEntry, b: DirEntry) => a.name.toLowerCase().localeCompare(b.name.toLowerCase());\n rawDirs.sort(cmp);\n rawFiles.sort(cmp);\n\n const all = [...rawDirs, ...rawFiles];\n const truncated = all.length > MAX_ENTRIES;\n return { ...base, entries: truncated ? all.slice(0, MAX_ENTRIES) : all, truncated };\n}\n\n/**\n * Create a single new folder named `name` inside `parentPath`, then return a\n * fresh listing of the parent (so the browser shows the new folder). The name\n * is a single path segment — no separators, no traversal — so a browsing client\n * can never mkdir outside the directory it is looking at.\n */\nexport function mkdirDirectory(\n parentInput: string | undefined | null,\n name: string,\n opts: { showHidden?: boolean } = {}\n): BrowseResult {\n const parent = resolveBrowsePath(parentInput);\n const clean = (name ?? \"\").trim();\n const listParent = () => browseDirectory(parent, opts);\n if (!clean || clean === \".\" || clean === \"..\" || clean.includes(\"/\") || clean.includes(\"\\\\\") || clean.includes(\"\\0\")) {\n return { ...listParent(), error: \"Invalid folder name.\" };\n }\n const target = path.join(parent, clean);\n // Guard against a name that resolves outside the parent (belt-and-suspenders).\n if (path.dirname(target) !== parent) {\n return { ...listParent(), error: \"Invalid folder name.\" };\n }\n try {\n fs.mkdirSync(target, { recursive: false });\n } catch (err) {\n const code = (err as NodeJS.ErrnoException)?.code;\n const message =\n code === \"EEXIST\" ? \"A folder with that name already exists.\"\n : code === \"EACCES\" || code === \"EPERM\" ? \"Permission denied.\"\n : code === \"ENOENT\" ? \"The parent folder no longer exists.\"\n : \"Could not create the folder.\";\n return { ...listParent(), error: message };\n }\n return listParent();\n}\n","/**\n * Interactive directory picker — the terminal's version of the desktop heads'\n * new-project file browser. Walks a machine's filesystem one level at a time\n * (structure only, never file contents), shows directories to enter and files\n * for context, and can create new folders — then returns the chosen ABSOLUTE\n * path (canonical, so thread `path:` tags and the registry agree everywhere).\n *\n * Two backends, one picker:\n * - local: `browseDirectory`/`mkdirDirectory` from fs-browse.ts directly;\n * - remote: the machine-scoped fs-browse KV RPC (`<id>.fsreq`/`.fsres` in\n * registry.ts) answered by that machine's daemon — the same channel the\n * web/native heads browse through.\n *\n * The picker runs on `tui.openLiveSelect`, so navigating levels repaints the\n * SAME menu region in place — a spinner plays in the pointer column of the\n * row being entered instead of the view clearing to a loader. Selecting the\n * current directory is a key command (`s`), not a fake row in the listing;\n * `.` toggles hidden files. Long directories page (every item is a physical\n * row), so the row budget adapts to the terminal height.\n */\nimport crypto from \"node:crypto\";\nimport type { ApiClient } from \"./api.ts\";\nimport type { AccountUserStream } from \"./account-user-stream.ts\";\nimport type { Tui } from \"./tui.ts\";\nimport type { BrowseResult } from \"./fs-browse.ts\";\nimport { browseDirectory, mkdirDirectory } from \"./fs-browse.ts\";\nimport { requestFsBrowse } from \"./registry.ts\";\nimport { themeGray } from \"./theme.ts\";\n\nconst c = {\n reset: \"\\x1b[0m\",\n dim: \"\\x1b[2m\",\n bold: \"\\x1b[1m\",\n gray: themeGray,\n yellow: \"\\x1b[33m\",\n red: \"\\x1b[31m\",\n teal: \"\\x1b[38;5;37m\",\n};\n\nexport interface BrowseBackend {\n /** Where we're browsing — used in menu titles (\"Browse <label>\"). */\n label: string;\n list(path: string | null, showHidden: boolean): Promise<BrowseResult>;\n mkdir(parent: string, name: string, showHidden: boolean): Promise<BrowseResult>;\n}\n\n/** Browse THIS machine's filesystem directly. */\nexport function localBrowseBackend(label = \"this machine\"): BrowseBackend {\n return {\n label,\n list: async (p, showHidden) => browseDirectory(p, { showHidden }),\n mkdir: async (parent, name, showHidden) => mkdirDirectory(parent, name, { showHidden }),\n };\n}\n\n/** Parse an RPC result defensively — the KV value crossed a machine boundary. */\nfunction parseBrowseResult(value: unknown): BrowseResult | null {\n if (!value || typeof value !== \"object\") return null;\n const r = value as Record<string, unknown>;\n if (typeof r.path !== \"string\" || !Array.isArray(r.entries)) return null;\n return {\n path: r.path,\n parent: typeof r.parent === \"string\" ? r.parent : null,\n home: typeof r.home === \"string\" ? r.home : \"\",\n entries: r.entries.filter(\n (e: unknown): e is { name: string; dir: boolean; project?: boolean; repo?: boolean } =>\n !!e && typeof (e as { name?: unknown }).name === \"string\"\n ),\n truncated: r.truncated === true,\n error: typeof r.error === \"string\" ? r.error : undefined,\n };\n}\n\n/** Browse a REMOTE machine through its daemon's fs-browse KV RPC. */\nexport function remoteBrowseBackend(\n api: ApiClient,\n accountStream: AccountUserStream,\n machineId: string,\n label: string\n): BrowseBackend {\n const rpc = async (req: {\n op: \"list\" | \"mkdir\";\n path: string;\n name?: string;\n show_hidden?: boolean;\n }): Promise<BrowseResult> => {\n const nonce = crypto.randomBytes(8).toString(\"hex\");\n const res = await requestFsBrowse(api, accountStream, machineId, { nonce, ...req }).catch(\n (error) => {\n throw new Error(\n error instanceof Error && error.message === \"The remote machine did not answer in time.\"\n ? `${label} didn't answer — is its daemon online?`\n : error instanceof Error\n ? error.message\n : String(error)\n );\n }\n );\n if (!res.ok) throw new Error(res.error || \"Browse failed on the remote machine.\");\n const parsed = parseBrowseResult(res.result);\n if (!parsed) throw new Error(\"The remote machine sent an unreadable listing.\");\n return parsed;\n };\n return {\n label,\n list: (p, showHidden) => rpc({ op: \"list\", path: p ?? \"~\", show_hidden: showHidden }),\n mkdir: (parent, name, showHidden) => rpc({ op: \"mkdir\", path: parent, name, show_hidden: showHidden }),\n };\n}\n\n/** Join a child segment onto a listed absolute path using ITS separator (the\n * browsed machine's platform, not ours). */\nfunction joinBrowsed(parent: string, name: string): string {\n const sep = parent.includes(\"\\\\\") && !parent.includes(\"/\") ? \"\\\\\" : \"/\";\n return parent.endsWith(sep) ? parent + name : parent + sep + name;\n}\n\n/** Shorten a path for titles/hints (keep the tail). */\nfunction tail(p: string, max = 44): string {\n return p.length > max ? \"…\" + p.slice(-(max - 1)) : p;\n}\n\ntype Move =\n | { kind: \"up\"; to: string }\n | { kind: \"open\"; to: string }\n | { kind: \"mkdir\" }\n | { kind: \"page\" }\n | { kind: \"noop\" };\n\nconst KEY_HINTS = `enter open · s use this directory · . hidden files · esc back`;\n\n/**\n * Drive the browser until the user picks a directory (`s`, returned as the\n * machine's canonical absolute path) or backs out with Escape (null).\n */\nexport async function pickDirectory(\n tui: Tui,\n backend: BrowseBackend,\n opts: {\n startPath?: string | null;\n /** Loader factory for the initial listing (before the menu exists). */\n loader?: (label: string) => { stop: () => void };\n } = {}\n): Promise<string | null> {\n let showHidden = false;\n let page = 0;\n\n const spin = opts.loader?.(`Reading ${backend.label}`);\n let listing: BrowseResult;\n try {\n listing = await backend.list(opts.startPath ?? null, showHidden);\n } catch (e) {\n spin?.stop();\n tui.print(`${c.red}✗${c.reset} ${c.gray}${e instanceof Error ? e.message : String(e)}${c.reset}`);\n return null;\n }\n spin?.stop();\n\n const title = () =>\n `${c.bold}Browse ${backend.label}${c.reset} ${c.teal}${tail(listing.path, 48)}${c.reset}` +\n (showHidden ? ` ${c.dim}· hidden shown${c.reset}` : \"\");\n const footer = (error?: string) =>\n error ? `${c.yellow}${error}${c.reset} ${c.dim}${KEY_HINTS}${c.reset}` : `${c.dim}${KEY_HINTS}${c.reset}`;\n\n const buildItems = (): { label: string; hint?: string; value: Move; disabled?: boolean }[] => {\n const pageSize = Math.max(5, Math.min(14, (process.stdout.rows || 24) - 9));\n const pages = Math.max(1, Math.ceil(listing.entries.length / pageSize));\n if (page >= pages) page = 0;\n const slice = listing.entries.slice(page * pageSize, (page + 1) * pageSize);\n\n const items: { label: string; hint?: string; value: Move; disabled?: boolean }[] = [];\n if (listing.parent) items.push({ label: \"..\", hint: \"up a level\", value: { kind: \"up\", to: listing.parent } });\n for (const entry of slice) {\n if (entry.dir) {\n items.push({\n label: `${entry.name}/`,\n hint: entry.repo ? \"git repo\" : entry.project ? \"project\" : \"\",\n value: { kind: \"open\", to: joinBrowsed(listing.path, entry.name) },\n });\n } else {\n // Files are context, not choices — visible but not selectable.\n items.push({ label: entry.name, value: { kind: \"noop\" }, disabled: true });\n }\n }\n if (listing.entries.length === 0) {\n items.push({ label: \"(empty directory)\", value: { kind: \"noop\" }, disabled: true });\n }\n if (pages > 1) {\n const remaining = listing.entries.length - slice.length;\n items.push({\n label: `→ more (page ${page + 1}/${pages}, ${remaining} more entr${remaining === 1 ? \"y\" : \"ies\"})`,\n value: { kind: \"page\" },\n });\n }\n if (listing.truncated) {\n items.push({ label: \"…listing capped — very large directory\", value: { kind: \"noop\" }, disabled: true });\n }\n items.push({ label: \"+ New folder here…\", value: { kind: \"mkdir\" } });\n return items;\n };\n\n const menu = tui.openLiveSelect<Move>({\n title: title(),\n items: buildItems(),\n footer: footer(listing.error),\n keys: [\"s\", \".\"],\n });\n const refresh = () => menu.update({ title: title(), items: buildItems(), footer: footer(listing.error) });\n\n // Load a path with the spinner playing on the row that asked for it — the\n // menu stays on screen the whole time, so navigation never feels like\n // leaving the view.\n const navigate = async (to: string | null, index: number) => {\n menu.setBusy(index);\n try {\n listing = await backend.list(to, showHidden);\n page = 0;\n refresh();\n } catch (e) {\n menu.update({ footer: footer(e instanceof Error ? e.message : String(e)) });\n }\n };\n\n for (;;) {\n const ev = await menu.next();\n if (ev.kind === \"cancel\") {\n menu.close();\n return null;\n }\n if (ev.kind === \"key\") {\n if (ev.name === \"s\") {\n menu.close();\n return listing.path;\n }\n if (ev.name === \".\") {\n showHidden = !showHidden;\n await navigate(listing.path, ev.index);\n }\n continue;\n }\n if (ev.kind === \"edit\") {\n // The typed folder name, submitted from the inline row: create it with\n // the spinner on that same row, then step into the new folder — its\n // `s` is the natural next keystroke.\n menu.setBusy(ev.index);\n try {\n const after = await backend.mkdir(listing.path, ev.text, showHidden);\n if (after.error) {\n listing = after;\n page = 0;\n menu.update({ title: title(), items: buildItems(), footer: footer(after.error) });\n } else {\n listing = await backend.list(joinBrowsed(listing.path, ev.text), showHidden);\n page = 0;\n refresh();\n }\n } catch (e) {\n menu.update({ footer: footer(e instanceof Error ? e.message : String(e)) });\n }\n continue;\n }\n const move = ev.value;\n if (move.kind === \"up\" || move.kind === \"open\") {\n await navigate(move.to, ev.index);\n } else if (move.kind === \"page\") {\n page += 1;\n refresh();\n } else if (move.kind === \"mkdir\") {\n // Turn the \"New folder\" row itself into an input — the browser view\n // never goes away.\n menu.beginEdit(ev.index, { placeholder: \"folder name…\", prefix: \"+ \" });\n }\n }\n}\n","export * from \"@standardagents/code-network/relay\";\n","/**\n * Ripgrep auto-provisioning. The grep/glob executors need `rg` on the host;\n * when it isn't installed we download a pinned, checksum-verified static\n * release binary into ~/.standardagents/bin and use it from there — never a\n * system package manager, never sudo, trivially removable (the VS Code\n * pattern). Resolution order:\n *\n * 1. STANDARDCODE_RG_PATH env override (power users / odd platforms)\n * 2. `rg` on PATH\n * 3. previously provisioned ~/.standardagents/bin/rg\n * 4. one-shot download + extract (single-flight per process; concurrent\n * processes tolerate races via atomic rename)\n *\n * Unsupported platforms or offline hosts resolve to null and callers keep\n * their existing \"ripgrep not found\" behavior.\n */\nimport fs from \"node:fs\";\nimport fsp from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport crypto from \"node:crypto\";\nimport https from \"node:https\";\nimport { spawn } from \"node:child_process\";\nimport { inheritedSubprocessEnv } from \"./subprocess-env.ts\";\n\nexport const RG_VERSION = \"14.1.1\";\n\n/**\n * Release targets keyed by `${process.platform}-${process.arch}`, with the\n * official per-asset sha256 published alongside each release asset. Linux x64\n * uses the fully static musl build (runs on any distro); linux arm64 has no\n * musl asset in this release, so the gnu build is used. Windows extraction\n * relies on tar.exe (bsdtar, present since Windows 10 1803) handling zip.\n */\nexport const RG_TARGETS: Record<string, { asset: string; sha256: string }> = {\n \"darwin-arm64\": {\n asset: `ripgrep-${RG_VERSION}-aarch64-apple-darwin.tar.gz`,\n sha256: \"24ad76777745fbff131c8fbc466742b011f925bfa4fffa2ded6def23b5b937be\",\n },\n \"darwin-x64\": {\n asset: `ripgrep-${RG_VERSION}-x86_64-apple-darwin.tar.gz`,\n sha256: \"fc87e78f7cb3fea12d69072e7ef3b21509754717b746368fd40d88963630e2b3\",\n },\n \"linux-x64\": {\n asset: `ripgrep-${RG_VERSION}-x86_64-unknown-linux-musl.tar.gz`,\n sha256: \"4cf9f2741e6c465ffdb7c26f38056a59e2a2544b51f7cc128ef28337eeae4d8e\",\n },\n \"linux-arm64\": {\n asset: `ripgrep-${RG_VERSION}-aarch64-unknown-linux-gnu.tar.gz`,\n sha256: \"c827481c4ff4ea10c9dc7a4022c8de5db34a5737cb74484d62eb94a95841ab2f\",\n },\n \"win32-x64\": {\n asset: `ripgrep-${RG_VERSION}-x86_64-pc-windows-msvc.zip`,\n sha256: \"d0f534024c42afd6cb4d38907c25cd2b249b79bbe6cc1dbee8e3e37c2b6e25a1\",\n },\n};\n\nconst BIN_DIR = path.join(os.homedir(), \".standardagents\", \"bin\");\nconst RG_BIN = path.join(BIN_DIR, process.platform === \"win32\" ? \"rg.exe\" : \"rg\");\n\n/** True when `cmd --version` runs and exits 0 within a short window. */\nfunction probe(cmd: string): Promise<boolean> {\n return new Promise((resolve) => {\n let child;\n try {\n child = spawn(cmd, [\"--version\"], {\n stdio: \"ignore\",\n env: inheritedSubprocessEnv(),\n });\n } catch {\n resolve(false);\n return;\n }\n const timer = setTimeout(() => {\n try {\n child.kill(\"SIGKILL\");\n } catch {\n /* already gone */\n }\n resolve(false);\n }, 5000);\n child.on(\"error\", () => {\n clearTimeout(timer);\n resolve(false);\n });\n child.on(\"exit\", (code) => {\n clearTimeout(timer);\n resolve(code === 0);\n });\n });\n}\n\n/** GET a URL following redirects (GitHub release assets 302 to a CDN). */\nfunction download(url: string, dest: string, redirects = 5): Promise<void> {\n return new Promise((resolve, reject) => {\n https\n .get(url, { headers: { \"user-agent\": \"standardcode-cli\" } }, (res) => {\n const status = res.statusCode ?? 0;\n if (status >= 300 && status < 400 && res.headers.location && redirects > 0) {\n res.resume();\n download(res.headers.location, dest, redirects - 1).then(resolve, reject);\n return;\n }\n if (status !== 200) {\n res.resume();\n reject(new Error(`HTTP ${status} for ${url}`));\n return;\n }\n const out = fs.createWriteStream(dest);\n res.pipe(out);\n out.on(\"finish\", () => out.close(() => resolve()));\n out.on(\"error\", reject);\n res.on(\"error\", reject);\n })\n .on(\"error\", reject);\n });\n}\n\nasync function sha256File(file: string): Promise<string> {\n const hash = crypto.createHash(\"sha256\");\n await new Promise<void>((resolve, reject) => {\n const stream = fs.createReadStream(file);\n stream.on(\"data\", (chunk) => hash.update(chunk));\n stream.on(\"end\", () => resolve());\n stream.on(\"error\", reject);\n });\n return hash.digest(\"hex\");\n}\n\n/** Run a command to completion; resolves true on exit 0. */\nfunction runOk(cmd: string, args: string[], cwd: string): Promise<boolean> {\n return new Promise((resolve) => {\n let child;\n try {\n child = spawn(cmd, args, {\n cwd,\n stdio: \"ignore\",\n env: inheritedSubprocessEnv(),\n });\n } catch {\n resolve(false);\n return;\n }\n child.on(\"error\", () => resolve(false));\n child.on(\"exit\", (code) => resolve(code === 0));\n });\n}\n\n/**\n * Download, verify, extract, and install the pinned binary. Throws on any\n * failure; the caller treats a throw as \"not provisioned\".\n */\nasync function provision(target: { asset: string; sha256: string }): Promise<string> {\n const url = `https://github.com/BurntSushi/ripgrep/releases/download/${RG_VERSION}/${target.asset}`;\n const work = await fsp.mkdtemp(path.join(os.tmpdir(), \"standardcode-rg-\"));\n try {\n const archive = path.join(work, target.asset);\n await download(url, archive);\n\n const digest = await sha256File(archive);\n if (digest !== target.sha256) {\n throw new Error(`checksum mismatch for ${target.asset}: got ${digest}`);\n }\n\n // bsdtar (macOS, Windows 10+) handles both tar.gz and zip; GNU tar (Linux)\n // only meets tar.gz here, which is all Linux targets use.\n if (!(await runOk(\"tar\", [\"-xf\", archive], work))) {\n throw new Error(\"tar extraction failed\");\n }\n\n const binName = process.platform === \"win32\" ? \"rg.exe\" : \"rg\";\n // Archives unpack to ripgrep-<version>-<target>/rg — locate rather than\n // hardcode so a layout change degrades to a clear error.\n const entries = await fsp.readdir(work, { withFileTypes: true });\n let extracted: string | null = null;\n for (const entry of entries) {\n const candidate = entry.isDirectory()\n ? path.join(work, entry.name, binName)\n : entry.name === binName\n ? path.join(work, entry.name)\n : null;\n if (candidate && fs.existsSync(candidate)) {\n extracted = candidate;\n break;\n }\n }\n if (!extracted) throw new Error(`${binName} not found in extracted archive`);\n\n await fsp.mkdir(BIN_DIR, { recursive: true });\n // Atomic install: a concurrent provisioner (CLI + daemon racing) ends with\n // one winner and no torn binary. rename can't cross devices from tmp on\n // some setups — copy+rename within BIN_DIR covers that.\n const staged = path.join(BIN_DIR, `.rg-staged-${process.pid}`);\n await fsp.copyFile(extracted, staged);\n await fsp.chmod(staged, 0o755).catch(() => {});\n await fsp.rename(staged, RG_BIN);\n return RG_BIN;\n } finally {\n await fsp.rm(work, { recursive: true, force: true }).catch(() => {});\n }\n}\n\nlet resolving: Promise<string | null> | null = null;\n\n/**\n * Resolve the ripgrep command to spawn, provisioning it if necessary.\n * Single-flight per process; null means \"unavailable\" and callers keep their\n * existing not-found behavior.\n */\nexport function resolveRg(log?: (line: string) => void): Promise<string | null> {\n if (!resolving) {\n resolving = (async () => {\n const override = process.env.STANDARDCODE_RG_PATH;\n if (override && (await probe(override))) return override;\n\n if (await probe(\"rg\")) return \"rg\";\n\n if (fs.existsSync(RG_BIN) && (await probe(RG_BIN))) return RG_BIN;\n\n const target = RG_TARGETS[`${process.platform}-${process.arch}`];\n if (!target) return null;\n\n try {\n log?.(`provisioning ripgrep ${RG_VERSION} (${process.platform}-${process.arch})…`);\n const installed = await provision(target);\n if (await probe(installed)) {\n log?.(`ripgrep installed at ${installed}`);\n return installed;\n }\n return null;\n } catch (e) {\n log?.(`ripgrep provisioning failed: ${e instanceof Error ? e.message : String(e)}`);\n return null;\n }\n })();\n // A null result is retryable (transient network); don't cache it forever.\n resolving = resolving.then((result) => {\n if (result === null) resolving = null;\n return result;\n });\n }\n return resolving;\n}\n","/**\n * Host-side executors for forwarded coding tools. These run on the user's\n * machine. Paths are resolved relative to the project directory; everything is\n * best-effort and returns a structured {@link HostResult} rather than throwing.\n */\nimport fs from \"node:fs\";\nimport fsp from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport crypto from \"node:crypto\";\nimport { spawn } from \"node:child_process\";\nimport type { HostResult } from \"./types.ts\";\nimport {\n ProcessRegistry,\n LOG_DIR,\n openPrivateProcessLog,\n type ProcessEntry,\n} from \"./process-registry.ts\";\nimport type { McpManager } from \"./mcp.ts\";\nimport type { ApiClient } from \"./api.ts\";\nimport { saveMcpServer, removeMcpServer, serverFromCommand } from \"./mcp-config.ts\";\nimport { resolveRg } from \"./ripgrep.ts\";\nimport { inheritedSubprocessEnv, restrictedSubprocessEnv } from \"./subprocess-env.ts\";\n\n/**\n * How long to watch a freshly-started background process before declaring it\n * \"running\". Fast failures (port already in use, missing binary, bad flag) exit\n * within milliseconds; this window catches them so we never report or track a\n * process that never actually came up.\n */\nconst STARTUP_GRACE_MS = 600;\n\n/** True if a pid is still alive (signal-0 probe; EPERM = alive but not ours). */\nfunction isAlive(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch (err) {\n return (err as NodeJS.ErrnoException).code === \"EPERM\";\n }\n}\n\n/** Read the last `n` non-empty lines of a log file (empty string if unreadable). */\nasync function readLogTail(logPath: string, n: number): Promise<string> {\n try {\n const content = await fsp.readFile(logPath, \"utf8\");\n return content.split(\"\\n\").filter(Boolean).slice(-n).join(\"\\n\");\n } catch {\n return \"\";\n }\n}\n\nexport class HostTools {\n constructor(\n private projectDir: string,\n private registry?: ProcessRegistry,\n private threadId?: string,\n private machine?: string,\n private mcp?: McpManager,\n /** Called after the MCP server set changes so the catalog can be re-published. */\n private onMcpCatalogChange?: () => void,\n /** Instance API access — used by save_to_disk to download thread-fs bytes. */\n private api?: ApiClient\n ) {}\n\n /** Resolve a user/model-supplied path against the project directory.\n * A leading `~` expands to the host home directory — without this, a\n * model-supplied `~/Desktop/x` silently lands at `<project>/~/Desktop/x`.\n * Outside-project containment checks run on the resolved result, so an\n * expanded home path still requires a fresh human decision. */\n resolve(p: string | undefined): string {\n if (!p || p === \".\") return this.projectDir;\n if (p === \"~\" || p.startsWith(\"~/\")) {\n p = path.join(os.homedir(), p.slice(1));\n }\n return path.resolve(this.projectDir, p);\n }\n\n /** Resolve symlinks in an existing target or its nearest existing ancestor. */\n private realPathForContainment(target: string): string {\n const missing: string[] = [];\n let existing = path.resolve(target);\n while (!fs.existsSync(existing)) {\n const parent = path.dirname(existing);\n if (parent === existing) return path.resolve(target);\n missing.unshift(path.basename(existing));\n existing = parent;\n }\n return path.join(fs.realpathSync.native(existing), ...missing);\n }\n\n /** True when the resolved path escapes the real project directory. */\n isOutsideProject(p: string | undefined): boolean {\n const project = this.realPathForContainment(this.projectDir);\n const candidate = this.realPathForContainment(this.resolve(p));\n const rel = path.relative(project, candidate);\n return rel === \"..\" || rel.startsWith(`..${path.sep}`) || path.isAbsolute(rel);\n }\n\n async execute(tool: string, args: Record<string, unknown>): Promise<HostResult> {\n try {\n switch (tool) {\n case \"read_file\":\n return await this.readFile(args);\n case \"grep\":\n return await this.grep(args);\n case \"glob\":\n return await this.glob(args);\n case \"write_file\":\n return await this.writeFile(args);\n case \"edit_file\":\n return await this.editFile(args);\n case \"bash\":\n return await this.bash(args);\n case \"save_to_disk\":\n return await this.saveToDisk(args);\n case \"run_skill_script\":\n return await this.runSkillScript(args);\n case \"background_process\": {\n // One tool, dispatched by action: start launches + verifies a process;\n // list/logs/stop inspect or terminate tracked ones.\n const action = String(args.action || \"list\");\n if (action === \"start\") return await this.runBackground(args);\n return await this.backgroundProcesses(args);\n }\n case \"mcp\": {\n // Forwarded MCP tool: the CLI is the MCP host, so the negotiation and\n // execution happen here against the locally-connected server.\n if (!this.mcp) {\n return { ok: false, error: \"MCP is not available in this session.\" };\n }\n // Removing a server also drops it from the stored config and republishes\n // the catalog, so it doesn't linger or reconnect.\n if (String(args.action) === \"remove\") {\n const name = String(args.server || \"\");\n if (!name) return { ok: false, error: \"remove requires a 'server' name.\" };\n this.mcp.disconnect(name);\n removeMcpServer(name);\n this.onMcpCatalogChange?.();\n return { ok: true, result: JSON.stringify({ removed: name }) };\n }\n return await this.mcp.dispatch(args);\n }\n case \"install_mcp\":\n return await this.installMcp(args);\n default:\n return { ok: false, error: `Unknown tool: ${tool}` };\n }\n } catch (err) {\n return { ok: false, error: err instanceof Error ? err.message : String(err) };\n }\n }\n\n private async readFile(args: Record<string, unknown>): Promise<HostResult> {\n const file = this.resolve(String(args.path || \"\"));\n const stat = await fsp.stat(file).catch(() => null);\n if (!stat) return { ok: false, error: `File not found: ${args.path}` };\n if (stat.isDirectory()) return { ok: false, error: `${args.path} is a directory` };\n if (stat.size > 2_000_000) return { ok: false, error: `File too large (${stat.size} bytes)` };\n\n const content = await fsp.readFile(file, \"utf8\");\n const lines = content.split(\"\\n\");\n const offset = typeof args.offset === \"number\" ? Math.max(1, args.offset) : 1;\n const limit = typeof args.limit === \"number\" ? args.limit : lines.length;\n const slice = lines.slice(offset - 1, offset - 1 + limit);\n const numbered = slice.map((l, i) => `${offset + i}\\t${l}`).join(\"\\n\");\n return { ok: true, result: numbered || \"(empty file)\" };\n }\n\n private async grep(args: Record<string, unknown>): Promise<HostResult> {\n const pattern = String(args.pattern || \"\");\n if (!pattern) return { ok: false, error: \"pattern is required\" };\n const searchPath = this.resolve(args.path ? String(args.path) : undefined);\n const rgArgs = [\"--line-number\", \"--no-heading\", \"--color\", \"never\", \"--max-count\", \"200\"];\n if (args.ignore_case) rgArgs.push(\"-i\");\n if (args.glob) rgArgs.push(\"--glob\", String(args.glob));\n rgArgs.push(\"--\", pattern, searchPath);\n // Auto-provisions a pinned static binary into ~/.standardagents/bin when\n // the host has no rg (see ripgrep.ts); null = unsupported platform/offline.\n const rgCmd = (await resolveRg()) ?? \"rg\";\n const rg = await this.run(rgCmd, rgArgs, this.projectDir, 30000);\n if (rg.code === 127) {\n return { ok: false, error: \"ripgrep (rg) not found on host; install it for grep.\" };\n }\n // rg exits 1 with no matches — treat as a successful empty result.\n const out = rg.stdout.trim();\n return { ok: true, result: out || \"(no matches)\" };\n }\n\n private async glob(args: Record<string, unknown>): Promise<HostResult> {\n const pattern = String(args.pattern || \"\");\n if (!pattern) return { ok: false, error: \"pattern is required\" };\n const base = this.resolve(args.path ? String(args.path) : undefined);\n const rgCmd = (await resolveRg()) ?? \"rg\";\n const rg = await this.run(rgCmd, [\"--files\", \"--glob\", pattern, base], this.projectDir, 30000);\n if (rg.code === 127) {\n // Fallback: native recursive walk with a simple glob match.\n const matches = await this.walkGlob(base, pattern);\n return { ok: true, result: matches.slice(0, 300).join(\"\\n\") || \"(no files)\" };\n }\n const rel = rg.stdout\n .trim()\n .split(\"\\n\")\n .filter(Boolean)\n .map((p) => path.relative(this.projectDir, p))\n .slice(0, 300);\n return { ok: true, result: rel.join(\"\\n\") || \"(no files)\" };\n }\n\n private async writeFile(args: Record<string, unknown>): Promise<HostResult> {\n const file = this.resolve(String(args.path || \"\"));\n const content = String(args.content ?? \"\");\n await fsp.mkdir(path.dirname(file), { recursive: true });\n const existed = fs.existsSync(file);\n await fsp.writeFile(file, content, \"utf8\");\n return {\n ok: true,\n result: `${existed ? \"Overwrote\" : \"Created\"} ${path.relative(this.projectDir, file)} (${Buffer.byteLength(content)} bytes)`,\n };\n }\n\n private async editFile(args: Record<string, unknown>): Promise<HostResult> {\n const file = this.resolve(String(args.path || \"\"));\n const oldStr = String(args.old_string ?? \"\");\n const newStr = String(args.new_string ?? \"\");\n const replaceAll = args.replace_all === true;\n const stat = await fsp.stat(file).catch(() => null);\n if (!stat) return { ok: false, error: `File not found: ${args.path}` };\n\n const content = await fsp.readFile(file, \"utf8\");\n if (oldStr === \"\") return { ok: false, error: \"old_string cannot be empty\" };\n const count = content.split(oldStr).length - 1;\n if (count === 0) return { ok: false, error: \"old_string not found in file (it must match exactly).\" };\n if (count > 1 && !replaceAll) {\n return { ok: false, error: `old_string is not unique (${count} matches). Add more context or set replace_all.` };\n }\n const updated = replaceAll ? content.split(oldStr).join(newStr) : content.replace(oldStr, newStr);\n await fsp.writeFile(file, updated, \"utf8\");\n // `@ line N` (1-based, first occurrence) lets transcript UIs number the\n // reconstructed diff; keep the phrasing stable — clients parse it.\n const startLine = content.slice(0, content.indexOf(oldStr)).split(\"\\n\").length;\n return { ok: true, result: `Edited ${path.relative(this.projectDir, file)} (${count} replacement${count === 1 ? \"\" : \"s\"}) @ line ${startLine}` };\n }\n\n /**\n * Copy a file from the THREAD filesystem (e.g. a generated /attachments/*\n * asset) onto the project disk: download the bytes from the instance API and\n * write them at the destination. The bytes never pass through the model.\n */\n private async saveToDisk(args: Record<string, unknown>): Promise<HostResult> {\n const source = String(args.source_path || \"\");\n const destArg = String(args.dest_path || \"\");\n if (!source || !destArg) return { ok: false, error: \"source_path and dest_path are required\" };\n if (!this.api || !this.threadId) {\n return { ok: false, error: \"No instance API available for thread file downloads.\" };\n }\n const bytes = await this.api.fetchFile(this.threadId, source);\n if (!bytes) return { ok: false, error: `Could not download ${source} from the thread filesystem.` };\n const dest = this.resolve(destArg);\n await fsp.mkdir(path.dirname(dest), { recursive: true });\n const existed = fs.existsSync(dest);\n await fsp.writeFile(dest, bytes);\n return {\n ok: true,\n result: `${existed ? \"Overwrote\" : \"Saved\"} ${path.relative(this.projectDir, dest)} (${bytes.length} bytes) from ${source}`,\n };\n }\n\n /**\n * Execute a SKILL script on the host. Skills live in the instance (cloud is\n * the source of truth); the server forwards the skill's files with the call\n * and we materialize them into a content-addressed temp dir — nothing about\n * a skill is stored on this machine beyond an ephemeral cache. The script\n * runs with cwd = the PROJECT (so it can operate on the user's files) and\n * SKILL_DIR pointing at the materialized folder (so it can read its own\n * references/assets).\n */\n private async runSkillScript(args: Record<string, unknown>): Promise<HostResult> {\n const skill = String(args.skill || \"skill\");\n const entry = String(args.entry || \"\");\n if (!entry) return { ok: false, error: \"entry (the script path within the skill) is required\" };\n let files: { path: string; content: string }[];\n try {\n const parsed = JSON.parse(String(args.files_json || \"[]\"));\n if (!Array.isArray(parsed)) throw new Error(\"not an array\");\n files = parsed.map((f) => ({ path: String(f.path), content: String(f.content ?? \"\") }));\n } catch {\n return { ok: false, error: \"files_json must be a JSON array of {path, content}\" };\n }\n if (!files.some((f) => f.path === entry)) {\n return { ok: false, error: `entry \"${entry}\" is not among the provided skill files` };\n }\n let scriptArgs: string[] = [];\n if (args.args_json) {\n try {\n const parsed = JSON.parse(String(args.args_json));\n if (!Array.isArray(parsed)) throw new Error(\"not an array\");\n scriptArgs = parsed.map(String);\n } catch {\n return { ok: false, error: \"args_json must be a JSON array of strings\" };\n }\n }\n\n // Content-addressed materialization: same skill content → same dir, no rewrite.\n const hash = crypto.createHash(\"sha256\").update(JSON.stringify(files)).digest(\"hex\").slice(0, 12);\n const skillDir = path.join(os.tmpdir(), \"standardcode-skills\", `${skill}-${hash}`);\n for (const f of files) {\n const dest = path.resolve(skillDir, f.path);\n if (path.relative(skillDir, dest).startsWith(\"..\")) {\n return { ok: false, error: `Skill file escapes its directory: ${f.path}` };\n }\n await fsp.mkdir(path.dirname(dest), { recursive: true });\n await fsp.writeFile(dest, f.content, \"utf8\");\n }\n const entryPath = path.resolve(skillDir, entry);\n\n // Interpreter: shebang wins; otherwise by extension.\n const entryContent = files.find((f) => f.path === entry)!.content;\n let cmd: string;\n let argv: string[];\n if (entryContent.startsWith(\"#!\")) {\n await fsp.chmod(entryPath, 0o755);\n cmd = entryPath;\n argv = scriptArgs;\n } else {\n const ext = path.extname(entry).toLowerCase();\n const interp: Record<string, string[]> = {\n \".py\": [\"python3\"],\n \".sh\": [\"bash\"],\n \".js\": [\"node\"],\n \".mjs\": [\"node\"],\n \".ts\": [\"npx\", \"tsx\"],\n };\n const found = interp[ext];\n if (!found) return { ok: false, error: `No interpreter for \"${ext}\" — add a shebang line to the script.` };\n cmd = found[0];\n argv = [...found.slice(1), entryPath, ...scriptArgs];\n }\n\n const timeoutMs = typeof args.timeout_ms === \"number\" ? Math.min(args.timeout_ms, 300_000) : 120_000;\n return await new Promise<HostResult>((resolvePromise) => {\n const child = spawn(cmd, argv, {\n cwd: this.projectDir,\n env: restrictedSubprocessEnv({ SKILL_DIR: skillDir }),\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n let out = \"\";\n const cap = (chunk: Buffer) => {\n if (out.length < 200_000) out += chunk.toString(\"utf8\");\n };\n child.stdout.on(\"data\", cap);\n child.stderr.on(\"data\", cap);\n const timer = setTimeout(() => {\n child.kill(\"SIGKILL\");\n resolvePromise({ ok: false, error: `Skill script timed out after ${timeoutMs}ms.\\n${out.slice(-4000)}` });\n }, timeoutMs);\n child.on(\"error\", (err) => {\n clearTimeout(timer);\n resolvePromise({ ok: false, error: `Could not launch ${cmd}: ${err.message}` });\n });\n child.on(\"exit\", (code) => {\n clearTimeout(timer);\n const body = out.trim() || \"(no output)\";\n if (code === 0) resolvePromise({ ok: true, result: body });\n else resolvePromise({ ok: false, error: `Script exited with code ${code}:\\n${body.slice(-6000)}` });\n });\n });\n }\n\n private async bash(args: Record<string, unknown>): Promise<HostResult> {\n const command = String(args.command || \"\");\n if (!command.trim()) return { ok: false, error: \"command is required\" };\n const cwd = args.cwd ? this.resolve(String(args.cwd)) : this.projectDir;\n const timeout = typeof args.timeout_ms === \"number\" ? args.timeout_ms : 120000;\n const res = await this.run(\"bash\", [\"-lc\", command], cwd, timeout);\n const combined = [res.stdout, res.stderr].filter(Boolean).join(\"\\n\").trim();\n const truncated = combined.length > 30000 ? combined.slice(0, 30000) + \"\\n…(truncated)\" : combined;\n if (res.timedOut) {\n return { ok: false, error: `Command timed out after ${timeout}ms.\\n${truncated}` };\n }\n const status = `exit code ${res.code}`;\n return {\n ok: res.code === 0,\n result: `${truncated || \"(no output)\"}\\n[${status}]`,\n error: res.code === 0 ? undefined : `Command failed (${status}).\\n${truncated}`,\n };\n }\n\n /** Start a tracked long-running process, detached, with output to a log file. */\n private async runBackground(args: Record<string, unknown>): Promise<HostResult> {\n const command = String(args.command || \"\");\n if (!command.trim()) return { ok: false, error: \"command is required\" };\n const cwd = args.cwd ? this.resolve(String(args.cwd)) : this.projectDir;\n // spawn() reports a missing cwd as an ASYNC 'error' event (\"spawn bash\n // ENOENT\"), not a throw — check up front so the agent gets a clear error.\n if (!fs.existsSync(cwd)) {\n return { ok: false, error: `cwd does not exist: ${cwd}` };\n }\n const id = crypto.randomUUID().slice(0, 8);\n const logPath = path.join(LOG_DIR, `${id}.log`);\n\n let out: number;\n try {\n out = openPrivateProcessLog(logPath);\n } catch (err) {\n return { ok: false, error: `Could not open log file: ${err instanceof Error ? err.message : String(err)}` };\n }\n\n let child;\n try {\n child = spawn(\"bash\", [\"-lc\", command], {\n cwd,\n detached: true,\n stdio: [\"ignore\", out, out],\n env: inheritedSubprocessEnv(),\n });\n } catch (err) {\n fs.closeSync(out);\n return { ok: false, error: `Failed to start: ${err instanceof Error ? err.message : String(err)}` };\n }\n // spawn failures (bad cwd, missing binary) arrive as an async 'error'\n // event; without a listener Node throws it as an uncaught exception and\n // takes the whole CLI down. Capture it and fold it into the early-exit\n // check below.\n let spawnError: Error | null = null;\n child.on(\"error\", (err) => {\n spawnError = err;\n });\n fs.closeSync(out); // the child holds its own copy of the fd\n const pid = child.pid;\n\n // Verify the process actually STAYED UP before we record it. A command that\n // fails fast (a port already in use, a missing binary, a bad flag) exits\n // within milliseconds — we don't want to report a phantom \"running\" process\n // or persist it to the registry. Watch for an early exit during a short\n // grace window, then surface the captured output so the agent can see why.\n let earlyExit: number | null | undefined;\n const onEarlyExit = (code: number | null) => {\n earlyExit = code;\n };\n child.on(\"exit\", onEarlyExit);\n await new Promise((r) => setTimeout(r, STARTUP_GRACE_MS));\n\n if (spawnError) {\n return { ok: false, error: `Failed to start: ${(spawnError as Error).message}` };\n }\n if (!pid) return { ok: false, error: \"Process failed to start (no pid).\" };\n\n if (earlyExit !== undefined || !isAlive(pid)) {\n const tail = await readLogTail(logPath, 15);\n const code = earlyExit ?? \"unknown\";\n return {\n ok: false,\n error:\n `The process exited immediately (exit code ${code}) — it did not stay running, ` +\n `so nothing was started or tracked.` +\n (tail ? `\\n\\nOutput:\\n${tail}` : \" No output was captured.\"),\n };\n }\n\n // It survived the grace window — now it's safe to detach and record it.\n child.removeListener(\"exit\", onEarlyExit);\n child.unref();\n\n if (this.registry) {\n const entry: ProcessEntry = {\n id,\n pid,\n command,\n description: typeof args.description === \"string\" ? args.description : undefined,\n cwd,\n machine: this.machine ?? \"\",\n logPath,\n startedAt: Date.now(),\n status: \"running\",\n };\n // Persist to the thread's KV (server-side) so the process is visible on\n // resume from any machine.\n await this.registry.add(entry);\n child.on(\"exit\", (code) => void this.registry?.markExited(id, code));\n }\n\n return {\n ok: true,\n result: JSON.stringify(\n {\n id,\n pid,\n status: \"running\",\n logPath,\n note: `Started in the background as process ${id} (pid ${pid}) and confirmed running. Output is logged to ${logPath}. Use background_process (list/logs/stop) to check on it or stop it.`,\n },\n null,\n 2\n ),\n };\n }\n\n /**\n * Install + connect an MCP server from a name + launch command (e.g.\n * \"npx -y @playwright/mcp@latest\"). Saves it to the user's MCP config,\n * launches it, runs the handshake, and republishes the catalog on success so\n * the agent immediately sees its tools. The connect IS the install — for `npx`\n * commands the package is fetched on first run.\n */\n private async installMcp(args: Record<string, unknown>): Promise<HostResult> {\n if (!this.mcp) return { ok: false, error: \"MCP is not available in this session.\" };\n const name = String(args.name || \"\");\n const command = String(args.command || \"\");\n if (!name || !command) {\n return { ok: false, error: \"install_mcp needs a `name` and a `command` (e.g. \\\"npx -y @playwright/mcp@latest\\\").\" };\n }\n\n let env: Record<string, string> | undefined;\n if (typeof args.env_json === \"string\" && args.env_json.trim()) {\n try {\n const parsed = JSON.parse(args.env_json);\n if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) env = parsed as Record<string, string>;\n else return { ok: false, error: \"env_json must encode a JSON object of environment variables.\" };\n } catch (e) {\n return { ok: false, error: `env_json is not valid JSON: ${e instanceof Error ? e.message : String(e)}` };\n }\n }\n\n const cfg = serverFromCommand(name, command, env);\n if (!cfg) return { ok: false, error: `Could not parse the command: \"${command}\".` };\n\n saveMcpServer(cfg);\n try {\n const client = await this.mcp.connect(cfg);\n this.onMcpCatalogChange?.();\n const tools = client.tools.map((t) => t.name);\n return {\n ok: true,\n result: JSON.stringify(\n {\n server: cfg.name,\n command: `${cfg.command} ${cfg.args.join(\" \")}`.trim(),\n connected: true,\n toolCount: tools.length,\n tools,\n note:\n `Installed and connected MCP server \"${cfg.name}\" with ${tools.length} tool${tools.length === 1 ? \"\" : \"s\"}` +\n `${tools.length ? `: ${tools.join(\", \")}` : \"\"}. They are available now and will auto-connect next session.`,\n },\n null,\n 2\n ),\n };\n } catch (err) {\n this.onMcpCatalogChange?.();\n return {\n ok: false,\n error: `Saved MCP server \"${cfg.name}\" but it failed to start: ${err instanceof Error ? err.message : String(err)}`,\n };\n }\n }\n\n /** List / inspect logs of / stop tracked background processes. */\n private async backgroundProcesses(args: Record<string, unknown>): Promise<HostResult> {\n const action = String(args.action || \"list\");\n if (!this.registry) {\n return { ok: true, result: \"Background-process tracking is not available in this session.\" };\n }\n\n if (action === \"list\") {\n const procs = await this.registry.list();\n if (!procs.length) return { ok: true, result: \"No background processes for this session.\" };\n const lines = procs.map((p) => {\n const age = relativeAge(p.startedAt);\n const status =\n p.status === \"running\"\n ? \"running\"\n : `${p.status}${typeof p.exitCode === \"number\" ? ` (exit ${p.exitCode})` : \"\"}`;\n return `${p.id} [${status}] pid ${p.pid} started ${age}\\n ${p.command}`;\n });\n return { ok: true, result: lines.join(\"\\n\") };\n }\n\n const id = String(args.id || \"\");\n const proc = await this.registry.get(id);\n if (!proc) return { ok: false, error: `No background process with id ${id}` };\n\n if (action === \"logs\") {\n const maxLines = typeof args.lines === \"number\" ? args.lines : 60;\n let content = \"\";\n try {\n content = await fsp.readFile(proc.logPath, \"utf8\");\n } catch {\n return { ok: true, result: `(no output captured yet for ${id})` };\n }\n const tail = content.split(\"\\n\").slice(-maxLines).join(\"\\n\");\n return { ok: true, result: tail || `(no output yet for ${id})` };\n }\n\n if (action === \"stop\") {\n if (proc.status !== \"running\") {\n return { ok: true, result: `Process ${id} is already ${proc.status}.` };\n }\n try {\n process.kill(-proc.pid, \"SIGTERM\");\n setTimeout(() => {\n try {\n process.kill(-proc.pid, \"SIGKILL\");\n } catch {\n // already gone\n }\n }, 3000);\n } catch {\n try {\n process.kill(proc.pid, \"SIGKILL\");\n } catch {\n // already gone\n }\n }\n await this.registry.markStopped(id);\n return { ok: true, result: `Stopped background process ${id} (pid ${proc.pid}).` };\n }\n\n return { ok: false, error: `Unknown action: ${action}` };\n }\n\n /**\n * Terminate every still-running background process this machine started, so\n * detached children don't outlive the CLI when the session quits. Sends\n * SIGTERM to each process group, waits a brief grace, then SIGKILL any\n * straggler, and records them stopped. Best effort and bounded so quitting\n * stays snappy. Returns the number of running processes it signaled.\n */\n async stopAllLocalProcesses(): Promise<number> {\n if (!this.registry) return 0;\n let running: ProcessEntry[] = [];\n try {\n const procs = await this.registry.list();\n running = procs.filter((p) => p.status === \"running\" && p.machine === (this.machine ?? \"\"));\n } catch {\n return 0;\n }\n if (!running.length) return 0;\n\n // Negative pid targets the whole process group — detached children are\n // their own group leader, so this kills the process tree, not just bash.\n const signal = (pid: number, sig: NodeJS.Signals) => {\n try {\n process.kill(-pid, sig);\n } catch {\n try {\n process.kill(pid, sig);\n } catch {\n // already gone\n }\n }\n };\n\n for (const proc of running) signal(proc.pid, \"SIGTERM\");\n await new Promise((r) => setTimeout(r, 300));\n for (const proc of running) signal(proc.pid, \"SIGKILL\");\n await Promise.allSettled(running.map((proc) => this.registry!.markStopped(proc.id)));\n return running.length;\n }\n\n private run(\n cmd: string,\n args: string[],\n cwd: string,\n timeoutMs: number\n ): Promise<{ stdout: string; stderr: string; code: number; timedOut: boolean }> {\n return new Promise((resolve) => {\n let stdout = \"\";\n let stderr = \"\";\n let timedOut = false;\n let exitCode = 0;\n let settled = false;\n // Cap captured output so a chatty/looping command can't grow memory\n // without bound (which previously could take the whole CLI down).\n const MAX_OUTPUT = 256 * 1024;\n\n let child;\n try {\n // Own process group so a timeout can kill the whole tree, and so a\n // backgrounded server keeps running after the CLI exits.\n child = spawn(cmd, args, {\n cwd,\n detached: true,\n env: inheritedSubprocessEnv(),\n });\n } catch {\n resolve({ stdout: \"\", stderr: \"\", code: 127, timedOut: false });\n return;\n }\n child.unref();\n\n let graceTimer: ReturnType<typeof setTimeout> | null = null;\n const settle = (code: number) => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n if (graceTimer) clearTimeout(graceTimer);\n resolve({ stdout, stderr, code, timedOut });\n };\n\n const timer = setTimeout(() => {\n timedOut = true;\n try {\n if (child.pid) process.kill(-child.pid, \"SIGKILL\");\n } catch {\n try {\n child.kill(\"SIGKILL\");\n } catch {\n // already gone\n }\n }\n // Settle even if `close` never arrives (a detached child may hold stdio).\n setTimeout(() => settle(exitCode), 250);\n }, timeoutMs);\n\n child.stdout?.on(\"data\", (d) => {\n if (stdout.length < MAX_OUTPUT) stdout += d.toString();\n });\n child.stderr?.on(\"data\", (d) => {\n if (stderr.length < MAX_OUTPUT) stderr += d.toString();\n });\n child.on(\"error\", (err: NodeJS.ErrnoException) => {\n if (!stderr) stderr = String(err);\n settle(err.code === \"ENOENT\" ? 127 : 1);\n });\n // Normal completion: stdio drained.\n child.on(\"close\", (code) => settle(code ?? exitCode));\n // The process exited but stdio may stay open if it backgrounded a child\n // that inherited the pipes (e.g. `server &`). Resolve shortly after exit\n // so background commands return promptly instead of hanging on `close`.\n child.on(\"exit\", (code) => {\n exitCode = code ?? 0;\n graceTimer = setTimeout(() => settle(exitCode), 250);\n });\n });\n }\n\n private async walkGlob(base: string, pattern: string): Promise<string[]> {\n const re = globToRegExp(pattern);\n const out: string[] = [];\n const walk = async (dir: string) => {\n const entries = await fsp.readdir(dir, { withFileTypes: true }).catch(() => []);\n for (const e of entries) {\n if (e.name === \".git\" || e.name === \"node_modules\") continue;\n const full = path.join(dir, e.name);\n if (e.isDirectory()) await walk(full);\n else {\n const rel = path.relative(this.projectDir, full);\n if (re.test(rel) || re.test(e.name)) out.push(rel);\n }\n }\n };\n await walk(base);\n return out;\n }\n}\n\nfunction relativeAge(startedAt: number): string {\n const diff = (Date.now() - startedAt) / 1000;\n if (diff < 60) return `${Math.floor(diff)}s ago`;\n if (diff < 3600) return `${Math.floor(diff / 60)}m ago`;\n if (diff < 86400) return `${Math.floor(diff / 3600)}h ago`;\n return `${Math.floor(diff / 86400)}d ago`;\n}\n\nfunction globToRegExp(glob: string): RegExp {\n const escaped = glob\n .replace(/[.+^${}()|[\\]\\\\]/g, \"\\\\$&\")\n .replace(/\\*\\*/g, \" \")\n .replace(/\\*/g, \"[^/]*\")\n .replace(/ /g, \".*\")\n .replace(/\\?/g, \".\");\n return new RegExp(`^${escaped}$`);\n}\n","/**\n * Model Context Protocol (MCP) client + manager.\n *\n * The CLI is the MCP **host**: for each configured server it spawns the process\n * locally and speaks JSON-RPC 2.0 over stdio (newline-delimited UTF-8 frames, as\n * the MCP stdio transport specifies). It performs the real capability handshake\n * (`initialize` → `notifications/initialized`), discovers tools and resources\n * (`tools/list`, `resources/list`), and executes the agent's forwarded calls\n * (`tools/call`, `resources/read`).\n *\n * Nothing here talks to the Standard Agents instance — the instance only ever\n * forwards an `mcp` tool request down the bridge; this module is what turns that\n * into a genuine MCP exchange on the user's machine and returns the result.\n *\n * Zero-dependency: Node globals only.\n */\nimport { spawn, type ChildProcessWithoutNullStreams } from \"node:child_process\";\nimport crypto from \"node:crypto\";\nimport type { McpServerConfig } from \"./mcp-config.ts\";\nimport { restrictedSubprocessEnv } from \"./subprocess-env.ts\";\n\n/** MCP protocol revision this client implements/negotiates. */\nexport const MCP_PROTOCOL_VERSION = \"2025-06-18\";\n/** Protocol versions we know how to speak, newest first (for negotiation fallback). */\nconst SUPPORTED_PROTOCOL_VERSIONS = [\"2025-06-18\", \"2025-03-26\", \"2024-11-05\"];\n\nconst CLIENT_INFO = { name: \"standard-code\", version: \"0.1.0\" };\n\ninterface JsonRpcRequest {\n jsonrpc: \"2.0\";\n id: number;\n method: string;\n params?: unknown;\n}\ninterface JsonRpcNotification {\n jsonrpc: \"2.0\";\n method: string;\n params?: unknown;\n}\ninterface JsonRpcResponse {\n jsonrpc: \"2.0\";\n id: number;\n result?: unknown;\n error?: { code: number; message: string; data?: unknown };\n}\n\nexport interface McpToolDef {\n name: string;\n description?: string;\n inputSchema?: Record<string, unknown>;\n}\n\nexport interface McpResourceDef {\n uri: string;\n name?: string;\n description?: string;\n mimeType?: string;\n}\n\nexport interface McpServerInfo {\n name: string;\n version?: string;\n}\n\n/** A signed-ish provenance record proving which server produced a result. */\nexport interface McpAttestation {\n /** Configured server id. */\n server: string;\n /** Server's self-reported identity from `initialize`. */\n serverInfo: McpServerInfo;\n /** Negotiated protocol version. */\n protocolVersion: string;\n /** Tool or resource invoked. */\n target: string;\n /** sha256 of the canonicalized arguments. */\n argsSha256: string;\n /** sha256 of the returned content. */\n resultSha256: string;\n /** Random per-call nonce. */\n nonce: string;\n /** Whether the server flagged the result as an error. */\n isError: boolean;\n /** Unix ms when the result was received. */\n at: number;\n}\n\nexport interface McpCallResult {\n ok: boolean;\n /** Flattened text content from the server's response. */\n text: string;\n attestation: McpAttestation;\n}\n\n/** Public, JSON-serializable view of a connected server (for the KV catalog). */\nexport interface McpServerCatalogEntry {\n name: string;\n status: \"connected\" | \"error\" | \"disabled\";\n serverInfo?: McpServerInfo;\n protocolVersion?: string;\n instructions?: string;\n capabilities?: Record<string, unknown>;\n tools: McpToolDef[];\n resources: McpResourceDef[];\n error?: string;\n}\n\nconst RPC_TIMEOUT_MS = 30_000;\n// Generous: a first `npx -y <server>` cold-start downloads the package before the\n// server even speaks, which can take a while on a slow network.\nconst INIT_TIMEOUT_MS = 90_000;\n\n/**\n * One live connection to a single MCP server process. Owns the child process,\n * the JSON-RPC framing, the pending-request map, and the handshake.\n */\nexport class McpClient {\n private child: ChildProcessWithoutNullStreams | null = null;\n private nextId = 1;\n private pending = new Map<number, { resolve: (v: unknown) => void; reject: (e: Error) => void; timer: ReturnType<typeof setTimeout> }>();\n private buffer = \"\";\n private closed = false;\n\n serverInfo: McpServerInfo;\n protocolVersion = MCP_PROTOCOL_VERSION;\n capabilities: Record<string, unknown> = {};\n instructions = \"\";\n tools: McpToolDef[] = [];\n resources: McpResourceDef[] = [];\n lastError: string | null = null;\n\n constructor(private config: McpServerConfig) {\n this.serverInfo = { name: config.name };\n }\n\n /** Spawn the server, run the initialize handshake, and discover capabilities. */\n async connect(defaultCwd: string): Promise<void> {\n const child = spawn(this.config.command, this.config.args, {\n cwd: this.config.cwd || defaultCwd,\n env: restrictedSubprocessEnv(this.config.env),\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n this.child = child;\n\n child.on(\"error\", (err) => this.failAll(new Error(`MCP server '${this.config.name}' failed to start: ${err.message}`)));\n child.on(\"exit\", (code) => {\n if (!this.closed) this.failAll(new Error(`MCP server '${this.config.name}' exited (code ${code ?? \"unknown\"}).`));\n });\n child.stdout.setEncoding(\"utf8\");\n child.stdout.on(\"data\", (chunk: string) => this.onData(chunk));\n // Surface server stderr only on failure; many servers log freely to stderr.\n child.stderr.setEncoding(\"utf8\");\n let stderrTail = \"\";\n child.stderr.on(\"data\", (d: string) => {\n stderrTail = (stderrTail + d).slice(-2000);\n });\n\n try {\n const initResult = (await this.request(\n \"initialize\",\n {\n protocolVersion: MCP_PROTOCOL_VERSION,\n capabilities: { tools: {}, resources: {} },\n clientInfo: CLIENT_INFO,\n },\n INIT_TIMEOUT_MS\n )) as {\n protocolVersion?: string;\n capabilities?: Record<string, unknown>;\n serverInfo?: McpServerInfo;\n instructions?: string;\n };\n\n const negotiated = initResult.protocolVersion || MCP_PROTOCOL_VERSION;\n if (!SUPPORTED_PROTOCOL_VERSIONS.includes(negotiated)) {\n // The server insists on a revision we don't implement. Per the spec the\n // host should disconnect rather than guess at an incompatible wire format.\n throw new Error(\n `Server requires unsupported MCP protocol version '${negotiated}' (this client speaks ${SUPPORTED_PROTOCOL_VERSIONS.join(\", \")}).`\n );\n }\n this.protocolVersion = negotiated;\n this.capabilities = initResult.capabilities || {};\n this.serverInfo = initResult.serverInfo || { name: this.config.name };\n this.instructions = initResult.instructions || \"\";\n\n // Tell the server the handshake is complete before issuing other calls.\n this.notify(\"notifications/initialized\");\n\n // Discover what the server offers (guarded by advertised capabilities).\n if (this.capabilities.tools) await this.refreshTools();\n if (this.capabilities.resources) await this.refreshResources();\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n this.lastError = stderrTail ? `${msg}\\n${stderrTail.trim()}` : msg;\n this.close();\n throw new Error(this.lastError);\n }\n }\n\n async refreshTools(): Promise<void> {\n const res = (await this.request(\"tools/list\", {})) as { tools?: McpToolDef[] };\n this.tools = Array.isArray(res?.tools) ? res.tools : [];\n }\n\n async refreshResources(): Promise<void> {\n try {\n const res = (await this.request(\"resources/list\", {})) as { resources?: McpResourceDef[] };\n this.resources = Array.isArray(res?.resources) ? res.resources : [];\n } catch {\n this.resources = []; // resources are optional; tolerate servers that decline\n }\n }\n\n /** Call a tool and return its flattened text + a provenance attestation. */\n async callTool(name: string, args: Record<string, unknown>): Promise<McpCallResult> {\n const res = (await this.request(\"tools/call\", { name, arguments: args })) as {\n content?: Array<Record<string, unknown>>;\n isError?: boolean;\n structuredContent?: unknown;\n };\n const text = flattenContent(res?.content, res?.structuredContent);\n return this.attest(name, args, text, !!res?.isError);\n }\n\n /** Read a resource and return its flattened text + attestation. */\n async readResource(uri: string): Promise<McpCallResult> {\n const res = (await this.request(\"resources/read\", { uri })) as {\n contents?: Array<Record<string, unknown>>;\n };\n const text = flattenResourceContents(res?.contents);\n return this.attest(uri, { uri }, text, false);\n }\n\n private attest(target: string, args: Record<string, unknown>, text: string, isError: boolean): McpCallResult {\n const attestation: McpAttestation = {\n server: this.config.name,\n serverInfo: this.serverInfo,\n protocolVersion: this.protocolVersion,\n target,\n argsSha256: sha256(canonicalJson(args)),\n resultSha256: sha256(text),\n nonce: crypto.randomBytes(8).toString(\"hex\"),\n isError,\n at: Date.now(),\n };\n return { ok: !isError, text, attestation };\n }\n\n catalogEntry(): McpServerCatalogEntry {\n return {\n name: this.config.name,\n status: this.lastError ? \"error\" : \"connected\",\n serverInfo: this.serverInfo,\n protocolVersion: this.protocolVersion,\n instructions: this.instructions || undefined,\n capabilities: this.capabilities,\n tools: this.tools,\n resources: this.resources,\n error: this.lastError || undefined,\n };\n }\n\n close(): void {\n this.closed = true;\n this.failAll(new Error(\"connection closed\"));\n try {\n this.child?.stdin.end();\n } catch {\n /* ignore */\n }\n try {\n this.child?.kill(\"SIGTERM\");\n } catch {\n /* ignore */\n }\n this.child = null;\n }\n\n // ── JSON-RPC plumbing ─────────────────────────────────────────────────────\n\n private request(method: string, params: unknown, timeoutMs = RPC_TIMEOUT_MS): Promise<unknown> {\n return new Promise((resolve, reject) => {\n if (!this.child || this.closed) {\n reject(new Error(`MCP server '${this.config.name}' is not connected.`));\n return;\n }\n const id = this.nextId++;\n const payload: JsonRpcRequest = { jsonrpc: \"2.0\", id, method, params };\n const timer = setTimeout(() => {\n this.pending.delete(id);\n reject(new Error(`MCP request '${method}' to '${this.config.name}' timed out after ${timeoutMs}ms.`));\n }, timeoutMs);\n this.pending.set(id, { resolve, reject, timer });\n this.write(payload);\n });\n }\n\n private notify(method: string, params?: unknown): void {\n const payload: JsonRpcNotification = { jsonrpc: \"2.0\", method, params };\n this.write(payload);\n }\n\n private write(payload: JsonRpcRequest | JsonRpcNotification | JsonRpcResponse): void {\n if (!this.child) return;\n try {\n // Newline-delimited JSON: one message per line, no embedded newlines.\n this.child.stdin.write(JSON.stringify(payload) + \"\\n\");\n } catch (err) {\n this.failAll(err instanceof Error ? err : new Error(String(err)));\n }\n }\n\n private onData(chunk: string): void {\n this.buffer += chunk;\n let nl: number;\n while ((nl = this.buffer.indexOf(\"\\n\")) >= 0) {\n const line = this.buffer.slice(0, nl).trim();\n this.buffer = this.buffer.slice(nl + 1);\n if (!line) continue;\n let msg: JsonRpcResponse & JsonRpcRequest & JsonRpcNotification;\n try {\n msg = JSON.parse(line);\n } catch {\n continue; // ignore non-JSON noise (some servers print banners)\n }\n this.dispatch(msg);\n }\n }\n\n private dispatch(msg: JsonRpcResponse & Partial<JsonRpcRequest>): void {\n // A response to one of our requests.\n if (typeof msg.id === \"number\" && ((\"result\" in msg) || (\"error\" in msg)) && msg.method === undefined) {\n const entry = this.pending.get(msg.id);\n if (!entry) return;\n this.pending.delete(msg.id);\n clearTimeout(entry.timer);\n if (msg.error) entry.reject(new Error(`${msg.error.message} (code ${msg.error.code})`));\n else entry.resolve(msg.result);\n return;\n }\n // A request FROM the server to us. We don't offer sampling/roots, so reply\n // politely: answer pings, decline everything else with method-not-found so\n // the server never hangs waiting on us.\n if (msg.method && typeof msg.id === \"number\") {\n if (msg.method === \"ping\") {\n this.write({ jsonrpc: \"2.0\", id: msg.id, result: {} });\n } else {\n this.write({\n jsonrpc: \"2.0\",\n id: msg.id,\n error: { code: -32601, message: `Method not supported by host: ${msg.method}` },\n });\n }\n return;\n }\n // A notification from the server (e.g. tools/list_changed) — refresh lazily.\n if (msg.method && msg.id === undefined) {\n if (msg.method === \"notifications/tools/list_changed\") void this.refreshTools().catch(() => {});\n if (msg.method === \"notifications/resources/list_changed\") void this.refreshResources().catch(() => {});\n }\n }\n\n private failAll(err: Error): void {\n for (const [, entry] of this.pending) {\n clearTimeout(entry.timer);\n entry.reject(err);\n }\n this.pending.clear();\n }\n}\n\n/**\n * Manages every configured MCP server connection for a session: connects the\n * enabled ones, exposes a catalog for context injection, and dispatches the\n * agent's forwarded `mcp` tool calls to the right client.\n */\nexport class McpManager {\n private clients = new Map<string, McpClient>();\n /** Last attestations produced this session (most recent last). */\n private attestations: McpAttestation[] = [];\n\n constructor(private defaultCwd: string) {}\n\n /** Connect one server (replacing any existing client of the same name). */\n async connect(config: McpServerConfig): Promise<McpClient> {\n this.disconnect(config.name);\n const client = new McpClient(config);\n this.clients.set(config.name, client);\n await client.connect(this.defaultCwd);\n return client;\n }\n\n disconnect(name: string): void {\n const existing = this.clients.get(name);\n if (existing) {\n existing.close();\n this.clients.delete(name);\n }\n }\n\n closeAll(): void {\n for (const [, c] of this.clients) c.close();\n this.clients.clear();\n }\n\n get(name: string): McpClient | undefined {\n return this.clients.get(name);\n }\n\n connectedNames(): string[] {\n return Array.from(this.clients.keys()).sort();\n }\n\n toolCount(): number {\n let n = 0;\n for (const [, c] of this.clients) n += c.tools.length;\n return n;\n }\n\n /** A JSON-serializable catalog of every connected server for the KV/context. */\n catalog(): { servers: McpServerCatalogEntry[]; generatedAt: number } {\n return {\n servers: Array.from(this.clients.values()).map((c) => c.catalogEntry()),\n generatedAt: Date.now(),\n };\n }\n\n recentAttestations(n = 10): McpAttestation[] {\n return this.attestations.slice(-n);\n }\n\n /** Execute a forwarded `mcp` tool request and return host-shaped text. */\n async dispatch(args: Record<string, unknown>): Promise<{ ok: boolean; result?: string; error?: string }> {\n const action = String(args.action || \"call\");\n const serverName = typeof args.server === \"string\" ? args.server : \"\";\n\n if (action === \"list\") {\n // A concise inventory of connected MCP servers (name + tool count) — what\n // the agent should consult to answer \"which MCP servers are installed?\".\n const servers = this.catalog().servers.map((s) => ({\n name: s.name,\n tools: s.tools.length,\n resources: s.resources?.length ?? 0,\n }));\n return {\n ok: true,\n result: servers.length\n ? JSON.stringify({ servers }, null, 2)\n : \"No MCP servers are connected. The user can add one with the /mcp command, or you can install one with the mcp tool (action \\\"install\\\").\",\n };\n }\n\n if (action === \"list_tools\") {\n // No server → list everything; a server → just that one.\n const cat = this.catalog().servers.filter((s) => !serverName || s.name === serverName);\n if (!cat.length) return { ok: false, error: serverName ? `No connected MCP server named '${serverName}'.` : \"No MCP servers are connected. The user can add one with the /mcp command.\" };\n return { ok: true, result: JSON.stringify(cat, null, 2) };\n }\n\n const client = this.clients.get(serverName);\n if (!client) {\n const avail = this.connectedNames();\n return {\n ok: false,\n error: avail.length\n ? `No connected MCP server named '${serverName}'. Connected servers: ${avail.join(\", \")}.`\n : `No MCP servers are connected. The user can add one with the /mcp command.`,\n };\n }\n\n try {\n let res: McpCallResult;\n if (action === \"read_resource\") {\n const uri = String(args.uri || \"\");\n if (!uri) return { ok: false, error: \"read_resource requires a 'uri'.\" };\n res = await client.readResource(uri);\n } else {\n const toolName = String(args.tool || \"\");\n if (!toolName) return { ok: false, error: \"call requires a 'tool' name.\" };\n const callArgs = parseArgs(args.arguments_json);\n if (callArgs instanceof Error) return { ok: false, error: callArgs.message };\n res = await client.callTool(toolName, callArgs);\n }\n\n this.attestations.push(res.attestation);\n const footer = formatAttestation(res.attestation);\n if (!res.ok) {\n return { ok: false, error: `${res.text || \"The MCP tool reported an error.\"}\\n${footer}` };\n }\n return { ok: true, result: `${res.text}\\n${footer}` };\n } catch (err) {\n return { ok: false, error: err instanceof Error ? err.message : String(err) };\n }\n }\n}\n\n// ── helpers ──────────────────────────────────────────────────────────────────\n\nfunction parseArgs(raw: unknown): Record<string, unknown> | Error {\n if (raw == null || raw === \"\") return {};\n if (typeof raw === \"object\") return raw as Record<string, unknown>;\n if (typeof raw !== \"string\") return new Error(\"arguments_json must be a JSON object string.\");\n try {\n const parsed = JSON.parse(raw);\n if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) return parsed as Record<string, unknown>;\n return new Error(\"arguments_json must encode a JSON object.\");\n } catch (e) {\n return new Error(`arguments_json is not valid JSON: ${e instanceof Error ? e.message : String(e)}`);\n }\n}\n\n/** Flatten MCP tool-call `content` blocks into a single text string. */\nfunction flattenContent(content: Array<Record<string, unknown>> | undefined, structured: unknown): string {\n const parts: string[] = [];\n for (const block of content || []) {\n if (block.type === \"text\" && typeof block.text === \"string\") parts.push(block.text);\n else if (block.type === \"resource\" && block.resource && typeof block.resource === \"object\") {\n const r = block.resource as Record<string, unknown>;\n if (typeof r.text === \"string\") parts.push(r.text);\n else parts.push(`[resource ${String(r.uri ?? \"\")}]`);\n } else if (block.type === \"image\") parts.push(`[image ${String(block.mimeType ?? \"\")}]`);\n else if (block.type === \"audio\") parts.push(`[audio ${String(block.mimeType ?? \"\")}]`);\n else parts.push(JSON.stringify(block));\n }\n if (!parts.length && structured !== undefined) parts.push(JSON.stringify(structured, null, 2));\n return parts.join(\"\\n\").trim();\n}\n\nfunction flattenResourceContents(contents: Array<Record<string, unknown>> | undefined): string {\n const parts: string[] = [];\n for (const c of contents || []) {\n if (typeof c.text === \"string\") parts.push(c.text);\n else if (typeof c.blob === \"string\") parts.push(`[binary resource ${String(c.uri ?? \"\")} (${c.blob.length} b64 chars)]`);\n }\n return parts.join(\"\\n\").trim();\n}\n\nfunction formatAttestation(a: McpAttestation): string {\n const id = `${a.serverInfo.name}${a.serverInfo.version ? `@${a.serverInfo.version}` : \"\"}`;\n return (\n `[attestation] server=${a.server} (${id}) protocol=${a.protocolVersion} ` +\n `target=${a.target} args_sha256=${a.argsSha256.slice(0, 16)} ` +\n `result_sha256=${a.resultSha256.slice(0, 16)} nonce=${a.nonce}`\n );\n}\n\n/** Stable JSON for hashing (sorted keys) so identical args hash identically. */\nfunction canonicalJson(value: unknown): string {\n return JSON.stringify(sortKeys(value));\n}\nfunction sortKeys(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(sortKeys);\n if (value && typeof value === \"object\") {\n const out: Record<string, unknown> = {};\n for (const k of Object.keys(value as Record<string, unknown>).sort()) {\n out[k] = sortKeys((value as Record<string, unknown>)[k]);\n }\n return out;\n }\n return value;\n}\nfunction sha256(input: string): string {\n return crypto.createHash(\"sha256\").update(input).digest(\"hex\");\n}\n","/**\n * The execution session — the ONE wiring of the tool-execution stack, shared\n * by the interactive CLI and the daemon.\n *\n * Both are the same client: registry + MCP host + HostTools executors +\n * permission engine + bridge. The only intended difference between them is\n * the I/O adapter (the BridgeHooks: TUI dialogs vs. daemon log + approval\n * relay). Keeping the wiring here means a new tool, safety rule, or setup\n * step lands in both by construction — they cannot drift.\n *\n * PRIME DIRECTIVE — state lives on the thread, not in the client. Any\n * interface (another terminal, a watcher on a different machine, a future\n * web UI) can attach to a thread and even take over execution, so every\n * piece of session state an interface could need MUST live centrally on\n * api.standardcode.ai: thread KV for session-scoped state (approvals,\n * bg_processes, mcp_catalog, session_info, input_history, execution_owner,\n * the approval relay keys), user KV for account-scoped state (the machine\n * registry). In-memory copies (like PermissionState) are CACHES of that\n * central state with a defined refresh rule — never the source of truth.\n * The only sanctioned client-local files are machine-inherent: credentials,\n * machine identity, and MCP launch commands.\n */\nimport { ApiClient } from \"./api.ts\";\nimport { Bridge, type BridgeHooks } from \"./bridge.ts\";\nimport { HostTools } from \"./host-tools.ts\";\nimport { McpManager } from \"./mcp.ts\";\nimport { listMcpServers } from \"./mcp-config.ts\";\nimport { ProcessRegistry } from \"./process-registry.ts\";\nimport { loadApprovals, type ApprovalsKV } from \"./approvals.ts\";\nimport type { PermissionState } from \"./permissions.ts\";\nimport type { BridgeClientIdentity } from \"./types.ts\";\n\nexport interface ExecutionSessionOptions {\n api: ApiClient;\n threadId: string;\n /** Absolute project directory tools execute in. */\n projectDir: string;\n /** Display name for this machine (session_info, process-registry entries). */\n machineName: string;\n /** The permission engine state; the caller owns its default level. */\n perm: PermissionState;\n /** The I/O adapter — the ONLY part meant to differ between clients. */\n hooks: BridgeHooks;\n /** Bridge identity for execution-owner election. */\n identity: BridgeClientIdentity;\n}\n\n/** One MCP server's connect outcome (for the caller's own presentation). */\nexport interface McpConnectResult {\n name: string;\n ok: boolean;\n tools?: number;\n error?: string;\n}\n\nexport class ExecutionSession {\n readonly registry: ProcessRegistry;\n readonly mcp: McpManager;\n readonly host: HostTools;\n readonly bridge: Bridge;\n\n private readonly api: ApiClient;\n private readonly threadId: string;\n private readonly projectDir: string;\n private readonly machineName: string;\n private readonly perm: PermissionState;\n\n constructor(options: ExecutionSessionOptions) {\n this.api = options.api;\n this.threadId = options.threadId;\n this.projectDir = options.projectDir;\n this.machineName = options.machineName;\n this.perm = options.perm;\n\n // Background-process metadata lives in the thread's KV (server-side), so\n // the list resumes from any machine; nothing about it is stored locally.\n this.registry = new ProcessRegistry(options.api, options.threadId, options.machineName);\n // MCP host: this client negotiates with locally-launched MCP servers and\n // forwards the agent's `mcp` tool calls to them. The discovered catalog is\n // mirrored into the thread KV so a context hook shows the agent what's\n // available — and so watchers can see it too.\n this.mcp = new McpManager(options.projectDir);\n this.host = new HostTools(\n options.projectDir,\n this.registry,\n options.threadId,\n options.machineName,\n this.mcp,\n () => this.publishMcpCatalog(),\n options.api\n );\n this.bridge = new Bridge(\n options.api,\n options.threadId,\n this.host,\n options.perm,\n options.hooks,\n options.identity\n );\n }\n\n /** Mirror the MCP catalog into the thread KV (fire-and-forget). */\n publishMcpCatalog(): void {\n void this.api.kvSet(this.threadId, \"mcp_catalog\", this.mcp.catalog()).catch(() => {});\n }\n\n /**\n * Load the thread's saved approvals (level + pre-approved tools/risk) from\n * the thread KV into the permission engine. Returns the saved record so an\n * interactive caller can also reflect the level in its UI.\n */\n async loadApprovals(): Promise<ApprovalsKV> {\n const saved = await loadApprovals(this.api, this.threadId);\n this.perm.alwaysAllow = new Set(saved.allowTools);\n this.perm.allowRisk = new Set(saved.allowRisk);\n if (saved.level) this.perm.level = saved.level;\n return saved;\n }\n\n /**\n * Tell the agent where its shell lives (`session_info` in thread KV): the\n * instance's context hook renders it as a synthetic opening pwd exchange.\n * OWNER-ONLY — a watcher must never overwrite the executing client's truth.\n */\n writeSessionInfo(): void {\n void this.api\n .kvSet(this.threadId, \"session_info\", { cwd: this.projectDir, machine: this.machineName })\n .catch(() => {});\n }\n\n /**\n * Connect every enabled MCP server and publish the catalog so the agent\n * sees the tools on its very first step. Returns per-server outcomes for\n * the caller to present (TUI lines / daemon log).\n */\n async connectEnabledMcpServers(): Promise<McpConnectResult[]> {\n const results: McpConnectResult[] = [];\n for (const server of listMcpServers().filter((s) => s.enabled)) {\n try {\n const client = await this.mcp.connect(server);\n results.push({ name: server.name, ok: true, tools: client.tools.length });\n } catch (e) {\n results.push({\n name: server.name,\n ok: false,\n error: e instanceof Error ? e.message : String(e),\n });\n }\n }\n this.publishMcpCatalog();\n return results;\n }\n\n /** Tear down the connection + local MCP servers (processes are the caller's\n * call — an owner kills its own spawned processes, a watcher has none). */\n stop(): void {\n this.bridge.close();\n this.mcp.closeAll();\n }\n}\n","/** The daemon's single account-scoped coordination and presence socket. */\nimport type { ApiClient } from \"./api.ts\";\nimport { AccountUserStream } from \"./account-user-stream.ts\";\n\nexport interface DaemonUserStreamHooks {\n onWake(threadId: string): void;\n onEvent(event: string, data: unknown): void;\n onConnection?(state: \"connected\" | \"reconnecting\", attempt: number): void;\n}\n\nexport class DaemonUserStream {\n private stream: AccountUserStream;\n\n constructor(\n api: ApiClient,\n clientId: string,\n hooks: DaemonUserStreamHooks,\n clientName?: string\n ) {\n this.stream = new AccountUserStream(api, clientId, {\n clientKind: \"daemon\",\n clientName,\n uniqueConnectionId: true,\n });\n this.stream.onEvent((event, data) => {\n if (event === \"standardagents.wake\") {\n const threadId = (data as { thread_id?: unknown } | undefined)?.thread_id;\n if (typeof threadId === \"string\") hooks.onWake(threadId);\n return;\n }\n hooks.onEvent(event, data);\n });\n if (hooks.onConnection) this.stream.onConnection(hooks.onConnection);\n }\n\n start(): Promise<void> {\n return this.stream.start();\n }\n\n close(): void {\n this.stream.close();\n }\n}\n","/**\n * Activity owned by one daemon thread worker.\n *\n * A forwarded tool is not safe to detach merely because host execution has\n * not started yet: it may be parked in the permission relay waiting for a\n * human decision. Keep both phases in the worker's busy state so activity\n * snapshots cannot evict the bridge between the request and its response.\n */\nexport class DaemonWorkerActivity {\n private activeTools = new Set<string>();\n private approvalLeases = new Set<symbol>();\n\n setToolActive(toolCallId: string, active: boolean): void {\n if (active) this.activeTools.add(toolCallId);\n else this.activeTools.delete(toolCallId);\n }\n\n /** Hold the worker active until the returned idempotent release runs. */\n beginApproval(): () => void {\n const lease = Symbol(\"approval\");\n this.approvalLeases.add(lease);\n return () => {\n this.approvalLeases.delete(lease);\n };\n }\n\n get busy(): boolean {\n return this.activeTools.size > 0 || this.approvalLeases.size > 0;\n }\n}\n","/**\n * Update check + auto-update for Standard Code.\n *\n * Periodically queries the npm registry for the latest available version of\n * @standardagents/code, caches the result locally (3h TTL), and — when the\n * CLI is a real installed copy (not a dev checkout) — installs the new\n * version in a DETACHED background process so the next launch simply runs it.\n * The install goes through the SAME package manager that installed the CLI\n * (npm/pnpm/yarn/bun, detected from the running module's path): updating a\n * pnpm-managed global with npm would fork the install into two competing\n * copies.\n *\n * State about the background attempt is persisted so a failed install\n * degrades to the manual hint instead of retrying on every launch. All\n * checks fall silently on network errors or timeouts so the CLI startup is\n * never delayed or noisy.\n *\n * Opt-outs: STANDARD_CODE_NO_AUTO_UPDATE=1 disables the background install\n * (the availability hint still shows); NO_UPDATE_NOTIFIER/CI disable the\n * version check entirely.\n */\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { spawn } from \"node:child_process\";\nimport { fileURLToPath } from \"node:url\";\nimport { inheritedSubprocessEnv } from \"./subprocess-env.ts\";\n\nconst PKG_NAME = \"@standardagents/code\";\nconst REGISTRY_URL = `https://registry.npmjs.org/${encodeURIComponent(PKG_NAME)}`;\n\n/** Cache lives under ~/.config/standardagents-cli/update-check.json */\nconst CACHE_REL_DIR = \".config/standardagents-cli\";\nconst CACHE_FILE = \"update-check.json\";\n/** Background auto-update attempt state (same directory). */\nconst STATE_FILE = \"auto-update.json\";\nconst CACHE_TTL_MS = 1000 * 60 * 60 * 3; // 3 hours\n\n/** Network timeout — don't delay startup more than this. */\nconst CHECK_TIMEOUT_MS = 4000;\n\n/** How long an in-flight background install is trusted before it's presumed\n * crashed (never wrote its final state) and eligible to start again. */\nconst IN_FLIGHT_TTL_MS = 15 * 60 * 1000;\n\nexport interface UpdateInfo {\n current: string;\n latest: string;\n}\n\ninterface CacheEntry {\n latest: string;\n timestamp: number;\n}\n\nexport type PackageManager = \"npm\" | \"pnpm\" | \"yarn\" | \"bun\";\n\n/** Persisted record of the most recent background install attempt. */\nexport interface AutoUpdateState {\n version: string; // the version the attempt tried to install\n startedAt: number;\n exitCode: number | null; // null while (presumed) in flight\n finishedAt?: number;\n output?: string; // tail of the package manager's output (for diagnostics)\n}\n\nexport type AutoUpdateDecision =\n | \"start\" // no blocking state — kick off a background install\n | \"in_flight\" // an attempt for this version started recently and hasn't finished\n | \"already_failed\" // this version was attempted and the install failed\n | \"path_shadowed\" // the install \"succeeded\" but this process still runs the old version\n | \"dev_checkout\" // running from source, not an installed copy — never auto-update\n | \"disabled\"; // STANDARD_CODE_NO_AUTO_UPDATE opt-out\n\n// ── cache/state helpers ──────────────────────────────────────────────────────\n\nfunction cacheDir(): string {\n return path.join(homedir(), CACHE_REL_DIR);\n}\n\nfunction cachePath(): string {\n return path.join(cacheDir(), CACHE_FILE);\n}\n\nfunction readCache(): CacheEntry | null {\n try {\n const raw = fs.readFileSync(cachePath(), \"utf-8\");\n return JSON.parse(raw) as CacheEntry;\n } catch {\n return null;\n }\n}\n\nfunction writeCache(latest: string): void {\n try {\n const dir = cacheDir();\n if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });\n fs.writeFileSync(cachePath(), JSON.stringify({ latest, timestamp: Date.now() }));\n } catch {\n // Fail silently — cache write never crashes the CLI.\n }\n}\n\nexport function readAutoUpdateState(dir = cacheDir()): AutoUpdateState | null {\n try {\n const raw = fs.readFileSync(path.join(dir, STATE_FILE), \"utf-8\");\n const state = JSON.parse(raw) as AutoUpdateState;\n return typeof state?.version === \"string\" ? state : null;\n } catch {\n return null;\n }\n}\n\nexport function writeAutoUpdateState(state: AutoUpdateState, dir = cacheDir()): void {\n try {\n if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });\n fs.writeFileSync(path.join(dir, STATE_FILE), JSON.stringify(state));\n } catch {\n // Fail silently.\n }\n}\n\nexport function clearAutoUpdateState(dir = cacheDir()): void {\n try {\n fs.unlinkSync(path.join(dir, STATE_FILE));\n } catch {\n // Already gone — fine.\n }\n}\n\n// ── package manager detection ────────────────────────────────────────────────\n\n/**\n * Which package manager owns the running install, judged by where this module\n * executes from. Global installs land in manager-specific trees (pnpm's\n * content-addressed `.pnpm`/PNPM_HOME, bun's `.bun/install/global`, yarn's\n * `.config/yarn/global` or `.yarn`), while a path outside any\n * `node_modules/@standardagents/code` means a dev checkout (returns null —\n * never auto-update source trees). npm is the fallback for a plain global\n * node_modules.\n */\nexport function detectPackageManager(\n selfPath: string = fileURLToPath(import.meta.url),\n env: Record<string, string | undefined> = process.env\n): PackageManager | null {\n // Normalize by the PATH STRING's separators (either style), not the host's\n // path.sep — a Windows-style path must parse the same everywhere.\n const norm = selfPath.split(/[\\\\/]/).join(\"/\");\n if (!norm.includes(\"node_modules/@standardagents/code\")) return null;\n\n const pnpmHome = (env.PNPM_HOME || \"\").split(/[\\\\/]/).join(\"/\");\n if (pnpmHome && norm.startsWith(pnpmHome)) return \"pnpm\";\n if (norm.includes(\"/.pnpm/\") || /\\/pnpm\\/global\\//.test(norm)) return \"pnpm\";\n if (norm.includes(\"/.bun/\")) return \"bun\";\n if (norm.includes(\"/.config/yarn/\") || norm.includes(\"/.yarn/\")) return \"yarn\";\n return \"npm\";\n}\n\n/** The global-install update invocation for a package manager. */\nexport function updateCommand(pm: PackageManager): { cmd: string; args: string[]; display: string } {\n switch (pm) {\n case \"pnpm\":\n return { cmd: \"pnpm\", args: [\"add\", \"-g\", `${PKG_NAME}@latest`], display: `pnpm add -g ${PKG_NAME}@latest` };\n case \"yarn\":\n return { cmd: \"yarn\", args: [\"global\", \"add\", `${PKG_NAME}@latest`], display: `yarn global add ${PKG_NAME}@latest` };\n case \"bun\":\n return { cmd: \"bun\", args: [\"add\", \"-g\", `${PKG_NAME}@latest`], display: `bun add -g ${PKG_NAME}@latest` };\n default:\n return { cmd: \"npm\", args: [\"i\", \"-g\", `${PKG_NAME}@latest`], display: `npm i -g ${PKG_NAME}@latest` };\n }\n}\n\n// ── auto-update decision + launch ────────────────────────────────────────────\n\n/**\n * Decide what to do about an available update. Pure — all inputs explicit —\n * so the retry/backoff rules are testable: attempt each new version once,\n * treat a recent unfinished attempt as in flight, treat a stale unfinished\n * attempt as crashed (eligible to retry), and never loop on a version that\n * already failed or didn't take effect.\n */\nexport function decideAutoUpdate(\n info: UpdateInfo,\n opts: {\n state: AutoUpdateState | null;\n pm: PackageManager | null;\n env?: Record<string, string | undefined>;\n now?: number;\n }\n): AutoUpdateDecision {\n const env = opts.env ?? process.env;\n if (env.STANDARD_CODE_NO_AUTO_UPDATE) return \"disabled\";\n if (!opts.pm) return \"dev_checkout\";\n\n const state = opts.state;\n if (state && state.version === info.latest) {\n if (state.exitCode === null) {\n const now = opts.now ?? Date.now();\n return now - state.startedAt < IN_FLIGHT_TTL_MS ? \"in_flight\" : \"start\";\n }\n // The attempt finished. exitCode 0 but we're still running the old\n // version means the new install isn't what this launcher resolves to\n // (shadowed PATH, multiple installs) — don't reinstall in a loop.\n return state.exitCode === 0 ? \"path_shadowed\" : \"already_failed\";\n }\n return \"start\";\n}\n\n/**\n * Kick off the background install: record an in-flight state, then spawn a\n * DETACHED node child that runs the package manager and writes the final\n * state (exit code + output tail) when it finishes. The CLI does not wait —\n * the new version simply applies on the next launch.\n */\nexport function startBackgroundUpdate(\n latest: string,\n pm: PackageManager,\n dir = cacheDir()\n): boolean {\n const startedAt = Date.now();\n writeAutoUpdateState({ version: latest, startedAt, exitCode: null }, dir);\n const stateFile = path.join(dir, STATE_FILE);\n const { cmd, args } = updateCommand(pm);\n // The child is plain `node -e` (no shell quoting risk for the state path or\n // version — both JSON-encoded), detached with no stdio so it survives this\n // process exiting and can never write to our terminal.\n const script =\n \"const cp=require('child_process');const fs=require('fs');\" +\n `const r=cp.spawnSync(${JSON.stringify(cmd)},${JSON.stringify(args)},{shell:process.platform==='win32',encoding:'utf8'});` +\n \"const out=((r.stdout||'')+(r.stderr||'')).slice(-2000);\" +\n `fs.writeFileSync(${JSON.stringify(stateFile)},JSON.stringify({version:${JSON.stringify(latest)},startedAt:${startedAt},exitCode:r.status==null?-1:r.status,finishedAt:Date.now(),output:out}));`;\n try {\n const child = spawn(process.execPath, [\"-e\", script], {\n detached: true,\n stdio: \"ignore\",\n env: inheritedSubprocessEnv(),\n });\n child.unref();\n return true;\n } catch {\n // Couldn't even spawn — mark failed so the next launch shows the hint.\n writeAutoUpdateState({ version: latest, startedAt, exitCode: -1, finishedAt: Date.now() }, dir);\n return false;\n }\n}\n\n/**\n * If a background update for OUR current version completed successfully, the\n * update has been applied — consume (clear) the state and return it so the\n * caller can mention it once. Any state for the current version is cleared\n * either way (it's spent).\n */\nexport function consumeAppliedUpdate(currentVersion: string, dir = cacheDir()): AutoUpdateState | null {\n const state = readAutoUpdateState(dir);\n if (!state || state.version !== currentVersion) return null;\n clearAutoUpdateState(dir);\n return state.exitCode === 0 ? state : null;\n}\n\n// ── version check ────────────────────────────────────────────────────────────\n\nasync function fetchLatest(currentVersion: string): Promise<string | null> {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), CHECK_TIMEOUT_MS);\n try {\n const res = await fetch(REGISTRY_URL, {\n signal: controller.signal,\n headers: {\n Accept: \"application/vnd.npm.install-v1+json; q=1.0, application/json; q=0.8, */*\",\n \"User-Agent\": `${PKG_NAME}/${currentVersion}`,\n },\n });\n if (!res.ok) return null;\n const data = (await res.json()) as { \"dist-tags\"?: { latest?: string } };\n return data[\"dist-tags\"]?.latest ?? null;\n } catch {\n // Offline, timeout, DNS failure, etc. — remain silent.\n return null;\n } finally {\n clearTimeout(timeout);\n }\n}\n\n/**\n * Check whether a newer version of this package is available on npm.\n *\n * Results are cached for 3 hours to avoid hammering the registry. On failure\n * (offline, timeout, malformed response) returns `null` — the CLI should never\n * be blocked or noisy about a version check.\n *\n * @param currentVersion — the locally installed version (from package.json).\n * @returns `UpdateInfo` if a newer version exists, or `null` if up-to-date or\n * the check could not be completed.\n */\n/**\n * True when `candidate` is a strictly newer RELEASE than `current` (semver\n * major.minor.patch; a stable release outranks a same-base prerelease). We\n * compare by precedence rather than mere inequality so the notice NEVER\n * suggests a downgrade or a pointless reinstall when the running build is\n * already at or ahead of the registry's `latest` — e.g. a freshly published\n * build read against a stale cache.\n */\nexport function isNewerVersion(candidate: string, current: string): boolean {\n const parse = (v: string) => {\n const m = v.trim().replace(/^v/, \"\").match(/^(\\d+)\\.(\\d+)\\.(\\d+)(?:-(.+))?$/);\n return m ? { nums: [Number(m[1]), Number(m[2]), Number(m[3])], pre: m[4] ?? null } : null;\n };\n const a = parse(candidate);\n const b = parse(current);\n if (!a || !b) return false; // unparseable → never prompt\n for (let i = 0; i < 3; i++) {\n if (a.nums[i] !== b.nums[i]) return a.nums[i] > b.nums[i];\n }\n // Same major.minor.patch: a release is newer than a same-base prerelease.\n return a.pre === null && b.pre !== null;\n}\n\nexport async function checkForUpdate(currentVersion: string): Promise<UpdateInfo | null> {\n if (!currentVersion) return null;\n\n // Honour an explicit opt-out.\n if (process.env.NO_UPDATE_NOTIFIER || process.env.CI) return null;\n\n // Check cache first — skip the network call if we checked recently.\n const cached = readCache();\n if (cached && Date.now() - cached.timestamp < CACHE_TTL_MS) {\n return isNewerVersion(cached.latest, currentVersion)\n ? { current: currentVersion, latest: cached.latest }\n : null;\n }\n\n const latest = await fetchLatest(currentVersion);\n if (!latest) return null;\n writeCache(latest);\n return isNewerVersion(latest, currentVersion) ? { current: currentVersion, latest } : null;\n}\n\n/**\n * Force a fresh check, bypassing the local cache.\n * Used by the `/update` slash command so the user always gets a live answer.\n */\nexport async function forceCheckForUpdate(currentVersion: string): Promise<UpdateInfo | null> {\n if (!currentVersion) return null;\n if (process.env.NO_UPDATE_NOTIFIER || process.env.CI) return null;\n\n const latest = await fetchLatest(currentVersion);\n if (!latest) return null;\n writeCache(latest);\n return isNewerVersion(latest, currentVersion) ? { current: currentVersion, latest } : null;\n}\n\n/**\n * Run the package manager's global update in the FOREGROUND (the `/update`\n * command), capturing output rather than inheriting stdio — a child writing\n * to the terminal would desync the TUI's bottom-region redraw.\n */\nexport function runUpdate(pm: PackageManager): Promise<{ ok: boolean; output: string }> {\n return new Promise((resolve) => {\n const { cmd, args } = updateCommand(pm);\n const child = spawn(cmd, args, {\n shell: process.platform === \"win32\",\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n env: inheritedSubprocessEnv(),\n });\n let out = \"\";\n child.stdout?.on(\"data\", (d) => (out += d));\n child.stderr?.on(\"data\", (d) => (out += d));\n child.on(\"close\", (code) => resolve({ ok: code === 0, output: out }));\n child.on(\"error\", (err) => resolve({ ok: false, output: String(err) }));\n });\n}\n","/**\n * The Standard Code daemon — a headless execution client for this machine.\n *\n * Installed on a VPS (or any always-on box), it holds one account user-stream\n * socket and opens a thread bridge only when forwarded work is ready for this\n * machine. Tools execute against the thread's project directory.\n *\n * Design points:\n * - Execution ownership: the daemon connects with the stable client id\n * `daemon:<machine_id>` and claim `if_unowned`, so a restart/reboot\n * reclaims its threads but it never steals a live interactive takeover.\n * An `owner_changed` event with no owner refreshes the daemon's claim, so a\n * vanished interactive takeover falls back without a probe timer.\n * - Approvals: permission-gated calls it can't auto-accept are relayed to\n * watching clients through the thread KV (see relay.ts); no TTY needed.\n * - Self-update: the standard background auto-update runs on a timer; when a\n * newer version lands, the daemon exits cleanly at the next idle moment and\n * the service supervisor (launchd/systemd) restarts it on the new code.\n * - Self-heal: any crash exits the process; the supervisor restarts it.\n */\nimport fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { ApiClient } from \"./api.ts\";\nimport { permissionKey } from \"./bridge.ts\";\nimport { ExecutionSession } from \"./execution-session.ts\";\nimport { DaemonUserStream } from \"./daemon-user-stream.ts\";\nimport { resolveRg } from \"./ripgrep.ts\";\nimport { decide, type PermissionState } from \"./permissions.ts\";\nimport { saveApprovals } from \"./approvals.ts\";\nimport { getCredential, defaultEndpoint, normalizeEndpoint } from \"./credentials.ts\";\nimport { loadMachineIdentity, daemonClientId, type MachineIdentity } from \"./machine.ts\";\nimport {\n registerProject,\n readMachineCommands,\n clearMachineCommands,\n applyMachineCommand,\n readFsRequest,\n writeFsResponse,\n loadMachine,\n getMachineName,\n machineDisplayName,\n setDaemonPresence,\n} from \"./registry.ts\";\nimport { ApprovalWakeRegistry, awaitApprovalViaRelay } from \"./relay.ts\";\nimport { DaemonWorkerActivity } from \"./daemon-activity.ts\";\n\n/**\n * In-flight approval relays subscribe to the network package's wake registry.\n * The user stream's\n * `standardcode.approval_changed` event (emitted by the packed approval\n * route when a watcher answers) fires these, so a relayed approval resolves\n * the moment the human decides — no polling anywhere.\n */\nconst approvalWakes = new ApprovalWakeRegistry();\nimport { browseDirectory, mkdirDirectory } from \"./fs-browse.ts\";\nimport { runUpdate } from \"./check-update.ts\";\nimport {\n PRODUCTION_ENDPOINT,\n readVersion,\n relaxTlsForLocalEndpoint,\n} from \"./product.ts\";\nimport {\n checkForUpdate,\n consumeAppliedUpdate,\n decideAutoUpdate,\n detectPackageManager,\n readAutoUpdateState,\n startBackgroundUpdate,\n} from \"./check-update.ts\";\n\nconst UPDATE_CHECK_MS = 6 * 60 * 60_000;\nconst MAX_WORKERS = 30;\nconst BRIDGE_ATTACH_GRACE_MS = 15_000;\nconst BRIDGE_IDLE_MS = 2_000;\n/** Human-decision window for LIVE-frame approval relays. Live frames are\n * answered over the socket and the server fails the call on its own frame\n * timeout (the tightest forwarded tool allows 60s), so the wait must end\n * before a late \"allow\" could execute a side effect into a dead frame. */\nconst LIVE_FRAME_APPROVAL_TIMEOUT_MS = 45_000;\nconst LOG_MAX_BYTES = 1_000_000;\n\nconst LOG_FILE = path.join(os.homedir(), \".standardagents\", \"daemon.log\");\n\n/** Append to a private log, repairing permissions on pre-existing files. */\nexport function appendPrivateLog(file: string, line: string, maxBytes: number): void {\n try {\n const directory = path.dirname(file);\n fs.mkdirSync(directory, { recursive: true, mode: 0o700 });\n fs.chmodSync(directory, 0o700);\n try {\n fs.chmodSync(file, 0o600);\n if (fs.statSync(file).size > maxBytes) {\n fs.renameSync(file, `${file}.old`);\n }\n } catch {\n // no log yet\n }\n fs.appendFileSync(file, line, { mode: 0o600 });\n fs.chmodSync(file, 0o600);\n } catch {\n // logging must never take the daemon down\n }\n}\n\n/** Append a timestamped line to the daemon log, rotating at ~1MB. */\nexport function daemonLog(line: string): void {\n appendPrivateLog(LOG_FILE, `${new Date().toISOString()} ${line}\\n`, LOG_MAX_BYTES);\n}\n\n/** The `path:` tag value on a thread (with `~` expanded), or null. */\nfunction pathFromTags(tags: string[]): string | null {\n const tag = tags.find((t) => t.startsWith(\"path:\"));\n if (!tag) return null;\n const raw = tag.slice(\"path:\".length);\n return raw.replace(/^~(?=\\/|$)/, os.homedir());\n}\n\n/**\n * One attached thread. The execution stack itself (registry/MCP/HostTools/\n * permission engine/bridge) is the SHARED ExecutionSession — identical to the\n * interactive CLI's — with the daemon supplying only its I/O adapter: log\n * lines instead of TUI prints, and the thread-KV approval relay instead of a\n * dialog.\n */\nclass ThreadWorker {\n readonly session: ExecutionSession;\n private readonly perm: PermissionState;\n private readonly activity = new DaemonWorkerActivity();\n private idleTimer: ReturnType<typeof setTimeout> | null = null;\n private watchedAnotherOwner = false;\n /** Set by the daemon so a superseded worker can remove itself. */\n onEvicted?: (threadId: string) => void;\n /** Set by the daemon so an inactive bridge removes itself. */\n onIdle?: (threadId: string) => void;\n\n constructor(\n api: ApiClient,\n identity: MachineIdentity,\n machineName: string,\n readonly threadId: string,\n readonly projectDir: string,\n readonly createdAt: number\n ) {\n this.perm = { level: 1, alwaysAllow: new Set(), allowRisk: new Set() };\n\n this.session = new ExecutionSession({\n api,\n threadId,\n projectDir,\n machineName,\n perm: this.perm,\n identity: {\n clientId: daemonClientId(identity),\n clientName: machineName,\n clientKind: \"daemon\",\n claim: \"if_unowned\",\n },\n hooks: {\n onActivity: (line) => daemonLog(`[${threadId.slice(0, 8)}] ${line}`),\n onStatus: (id, summary) => {\n const wasBusy = this.busy;\n this.activity.setToolActive(id, summary !== null);\n if (this.busy) this.clearIdleTimer();\n else if (wasBusy) this.scheduleIdle(BRIDGE_IDLE_MS);\n },\n onConnection: (state, attempt) => {\n if (state !== \"reconnecting\" || attempt === 1 || attempt % 10 === 0) {\n daemonLog(`[${threadId.slice(0, 8)}] bridge ${state}${attempt ? ` (attempt ${attempt})` : \"\"}`);\n }\n },\n onOwnership: (isOwner, owner) => {\n daemonLog(\n `[${threadId.slice(0, 8)}] ownership: ${isOwner ? \"OWNER\" : \"watcher\"}` +\n (owner ? ` (owner: ${owner.client_name || owner.client_id})` : \"\")\n );\n if (isOwner) this.watchedAnotherOwner = false;\n else if (owner) this.watchedAnotherOwner = true;\n else if (this.watchedAnotherOwner) {\n this.watchedAnotherOwner = false;\n this.session.bridge.setClaim(\"if_unowned\");\n this.session.bridge.refresh();\n }\n },\n onSuperseded: () => {\n // Another process presented OUR daemon identity (a duplicate daemon,\n // a manual `daemon run` beside the service). The newer process owns\n // this thread now, so this worker stands down.\n daemonLog(`[${threadId.slice(0, 8)}] superseded by another process with this identity — standing down`);\n this.onEvicted?.(threadId);\n },\n // The daemon's approvals are edited by OTHER clients (the watching\n // CLI's level menu writes the thread KV) — re-sync before every\n // permission decision so a level change applies to the next call.\n refreshPermissions: async () => {\n await this.session.loadApprovals().catch(() => {});\n },\n requestApproval: async (req, summary, effectiveRisk) => {\n const permKey = permissionKey(req);\n const fresh = decide(this.perm, permKey, effectiveRisk, !!req.requestPermission);\n if (fresh === \"allow\") return { choice: \"allow\" };\n // Relay correlation key: durable calls carry the parked tool_call_id;\n // LIVE frames carry the bridge frame id, which watchers treat as\n // opaque — they relay the same either way. Blind-denying live asks\n // (\"No one is available…\") ate real approval-needing calls (e.g.\n // outside-project saves) while a human was watching the whole time.\n const relayId = req.toolCallId ?? req.id;\n if (!relayId) {\n // Protocol violation (no id of any kind) — refuse safely.\n return { choice: \"deny\", reason: \"No one is available to approve this right now.\" };\n }\n daemonLog(`[${threadId.slice(0, 8)}] relaying approval: ${summary} (risk ${effectiveRisk})`);\n const releaseApproval = this.activity.beginApproval();\n this.clearIdleTimer();\n try {\n const response = await awaitApprovalViaRelay(\n api,\n threadId,\n {\n tool_call_id: relayId,\n tool: req.tool,\n summary,\n permission: req.requestPermission,\n risk: effectiveRisk,\n machine: machineName,\n requested_at: Date.now(),\n },\n {\n subscribe: (wake) => approvalWakes.subscribe(threadId, wake),\n // A live frame is answered over the socket and the server fails\n // the call on its own frame timeout — bound the human wait so a\n // late \"allow\" can never execute a side effect into a frame the\n // server already gave up on. Durable calls park server-side and\n // keep the long default.\n timeoutMs: req.toolCallId ? undefined : LIVE_FRAME_APPROVAL_TIMEOUT_MS,\n }\n );\n if (!response) {\n return { choice: \"deny\", reason: \"The approval request timed out with no one to approve it.\" };\n }\n if (response.choice === \"always\") this.perm.alwaysAllow.add(permKey);\n if (response.choice === \"always_risk\") {\n this.perm.level = Math.max(this.perm.level, effectiveRisk) as PermissionState[\"level\"];\n this.perm.allowRisk.clear();\n }\n if (response.choice === \"always\" || response.choice === \"always_risk\") {\n saveApprovals(api, threadId, this.perm);\n }\n return { choice: response.choice, reason: response.reason };\n } finally {\n releaseApproval();\n if (!this.busy) this.scheduleIdle(BRIDGE_IDLE_MS);\n }\n },\n },\n });\n\n // Enabled MCP servers connect per-thread, mirroring the interactive CLI.\n void this.session.connectEnabledMcpServers().then((results) => {\n for (const r of results.filter((r) => !r.ok)) {\n daemonLog(`[${threadId.slice(0, 8)}] MCP \"${r.name}\" failed: ${r.error}`);\n }\n });\n }\n\n get busy(): boolean {\n return this.activity.busy;\n }\n\n private clearIdleTimer(): void {\n if (!this.idleTimer) return;\n clearTimeout(this.idleTimer);\n this.idleTimer = null;\n }\n\n private scheduleIdle(delay: number): void {\n this.clearIdleTimer();\n this.idleTimer = setTimeout(() => {\n this.idleTimer = null;\n if (!this.busy) this.onIdle?.(this.threadId);\n }, delay);\n }\n\n async start(): Promise<void> {\n await this.session.loadApprovals().catch(() => {});\n // Ground truth for the agent's [SESSION] context: where its shell lives.\n this.session.writeSessionInfo();\n await this.session.bridge.connect();\n if (!this.busy) this.scheduleIdle(BRIDGE_ATTACH_GRACE_MS);\n }\n\n stop(): void {\n this.clearIdleTimer();\n this.session.stop();\n }\n}\n\nexport interface DaemonOptions {\n endpoint?: string;\n}\n\nexport async function runDaemon(options: DaemonOptions = {}): Promise<void> {\n const endpoint = normalizeEndpoint(options.endpoint || defaultEndpoint() || PRODUCTION_ENDPOINT);\n relaxTlsForLocalEndpoint(endpoint);\n const version = readVersion();\n const identity = loadMachineIdentity();\n const runnerTag = `runner:${identity.machine_id}`;\n\n const cred = getCredential(endpoint);\n if (!cred) {\n process.stderr.write(\n `No saved sign-in for ${endpoint}.\\n` +\n `Run \\`standardcode daemon install\\` (or plain \\`standardcode\\`) once to sign in.\\n`\n );\n process.exit(1);\n }\n const api = new ApiClient(endpoint, cred.access_token);\n const check = await api.verifyDetailed();\n if (!check.ok) {\n daemonLog(`startup: credential check failed: ${check.reason}`);\n process.stderr.write(`Sign-in check failed: ${check.reason}\\n`);\n process.exit(1);\n }\n\n // Warm-provision ripgrep so the first grep on a fresh machine (headless VPS\n // installs especially) doesn't pay the download inside a tool call.\n // Fire-and-forget: failure degrades to grep's existing not-found handling.\n void resolveRg(daemonLog);\n\n // The display name is account data (the user's `.name` key), overlaid on the\n // registry record. Machine invalidation events refresh it for new workers.\n let displayName =\n machineDisplayName((await loadMachine(api, identity.machine_id).catch(() => null)) ?? {\n hostname: os.hostname(),\n id: identity.machine_id,\n });\n\n const applied = consumeAppliedUpdate(version);\n daemonLog(\n `daemon starting — v${version}${applied ? \" (freshly auto-updated)\" : \"\"}, machine ${identity.machine_id} (${displayName}), endpoint ${endpoint}`\n );\n\n // Crashes must exit (loudly) so the service supervisor restarts us clean.\n process.on(\"uncaughtException\", (err) => {\n daemonLog(`FATAL uncaughtException: ${err?.stack || err}`);\n process.exit(1);\n });\n process.on(\"unhandledRejection\", (err) => {\n daemonLog(`unhandledRejection: ${err instanceof Error ? err.stack : String(err)}`);\n });\n\n // Publish install metadata before opening the account stream. The stream's\n // open callback flips this record online with one lifecycle write.\n await setDaemonPresence(api, identity, version, false).catch((e) =>\n daemonLog(`machine registration failed: ${e instanceof Error ? e.message : String(e)}`)\n );\n\n const workers = new Map<string, ThreadWorker>();\n let lineActiveThreads = new Set<string>();\n let samaActiveThreads = new Set<string>();\n let hub: DaemonUserStream | null = null;\n let updateTimer: ReturnType<typeof setInterval> | null = null;\n let updateReady = false;\n let forcedUpdatePending = false;\n let restartInProgress = false;\n let shuttingDown = false;\n let presenceWrite = Promise.resolve();\n\n function publishPresence(connected: boolean): Promise<void> {\n presenceWrite = presenceWrite\n .then(() => setDaemonPresence(api, identity, version, connected))\n .catch((error) => {\n daemonLog(\n `presence ${connected ? \"publish\" : \"clear\"} failed: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n });\n return presenceWrite;\n }\n\n async function shutdown(code: number): Promise<void> {\n if (shuttingDown) return;\n shuttingDown = true;\n if (updateTimer) clearInterval(updateTimer);\n for (const worker of workers.values()) worker.stop();\n workers.clear();\n hub?.close();\n await Promise.race([\n publishPresence(false),\n new Promise<void>((resolve) => setTimeout(resolve, 2_000)),\n ]);\n daemonLog(`daemon exiting (code ${code})`);\n process.exit(code);\n }\n\n async function restartIfIdle(): Promise<void> {\n if (restartInProgress || [...workers.values()].some((worker) => worker.busy)) return;\n if (forcedUpdatePending) {\n const pm = detectPackageManager();\n forcedUpdatePending = false;\n if (!pm) {\n daemonLog(\"forced update requested but this is not an installed build — ignoring\");\n return;\n }\n restartInProgress = true;\n daemonLog(`forced update: running ${pm} install now`);\n const { ok, output } = await runUpdate(pm);\n daemonLog(`forced update ${ok ? \"succeeded\" : \"failed\"}: ${output.trim().split(\"\\n\").slice(-2).join(\" | \")}`);\n if (ok) {\n daemonLog(\"restarting to apply the forced update\");\n await shutdown(0);\n return;\n }\n restartInProgress = false;\n }\n if (updateReady) {\n daemonLog(\"restarting to apply the installed update\");\n await shutdown(0);\n }\n }\n\n const threadIsActive = (threadId: string): boolean =>\n lineActiveThreads.has(threadId) || samaActiveThreads.has(threadId);\n\n const attach = async (threadId: string, tags: string[], createdAt = 0): Promise<void> => {\n if (workers.has(threadId)) return;\n const projectDir = pathFromTags(tags);\n if (!projectDir) return;\n if (workers.size >= MAX_WORKERS) {\n // Evict the oldest idle worker to make room for the new thread.\n const oldest = [...workers.values()]\n .filter((w) => !w.busy)\n .sort((a, b) => a.createdAt - b.createdAt)[0];\n if (!oldest) return;\n oldest.stop();\n workers.delete(oldest.threadId);\n daemonLog(`detached ${oldest.threadId.slice(0, 8)} (worker cap)`);\n }\n // Make sure the project directory exists so forwarded tools have a home;\n // a remote \"new project\" flow may name a directory that isn't there yet.\n try {\n fs.mkdirSync(projectDir, { recursive: true });\n } catch (e) {\n daemonLog(`cannot prepare project dir ${projectDir}: ${e instanceof Error ? e.message : String(e)}`);\n return;\n }\n const worker = new ThreadWorker(api, identity, displayName, threadId, projectDir, createdAt || Date.now());\n worker.onEvicted = (id) => detach(id);\n worker.onIdle = (id) => {\n if (threadIsActive(id)) return;\n detach(id);\n void restartIfIdle();\n };\n workers.set(threadId, worker);\n daemonLog(`attached ${threadId.slice(0, 8)} → ${projectDir}`);\n try {\n await worker.start();\n } catch (error) {\n detach(threadId);\n throw error;\n }\n // Keep the machine's project list fresh for the session-location picker.\n void registerProject(api, identity, projectDir).catch(() => {});\n // Canonicalize a legacy `path:~/…` tag to the ABSOLUTE directory this\n // daemon actually resolved — every head buckets sessions by the path tag,\n // so an unexpanded tilde renders as a duplicate project folder forever.\n const rawPath = tags.find((t) => t.startsWith(\"path:\"))?.slice(\"path:\".length);\n if (rawPath && rawPath !== projectDir) {\n const fixed = tags.map((t) => (t === `path:${rawPath}` ? `path:${projectDir}` : t));\n void api.setThreadTags(threadId, fixed).catch(() => {});\n }\n };\n\n const detach = (threadId: string): void => {\n const worker = workers.get(threadId);\n if (!worker) return;\n worker.stop();\n workers.delete(threadId);\n daemonLog(`detached ${threadId.slice(0, 8)}`);\n };\n\n const attachThreadById = async (threadId: string, reason: string): Promise<void> => {\n if (workers.has(threadId)) return;\n try {\n const thread = await api.getThread(threadId);\n if (!thread || thread.terminated || !thread.tags.includes(runnerTag)) return;\n daemonLog(`${reason}: attaching ${threadId.slice(0, 8)}`);\n await attach(threadId, thread.tags, (thread.created_at ?? 0) * 1000);\n } catch (e) {\n daemonLog(`${reason} attach failed: ${e instanceof Error ? e.message : String(e)}`);\n }\n };\n\n // Self-update: kick the standard background auto-update; once a newer\n // version has installed, exit cleanly at the next idle moment so the\n // service supervisor restarts us on the new code.\n const checkUpdates = async (): Promise<void> => {\n try {\n const info = await checkForUpdate(version);\n if (!info) return;\n const pm = detectPackageManager();\n const decision = decideAutoUpdate(info, { state: readAutoUpdateState(), pm });\n if (decision === \"start\" && pm) {\n daemonLog(`auto-update: installing v${info.latest} in the background`);\n startBackgroundUpdate(info.latest, pm);\n }\n const state = readAutoUpdateState();\n if (state && state.version === info.latest && state.exitCode === 0) {\n daemonLog(`auto-update: v${info.latest} installed — restarting when idle`);\n updateReady = true;\n await restartIfIdle();\n }\n } catch {\n // update checks are best-effort\n }\n };\n // Management command channel: apply add-remove project, forced update, and\n // background-process stop commands queued for THIS machine by other clients\n // (the /machines menu, and every face's deterministic \"Stop now\"). A\n // machine-value event drains the durable queue; clearing it publishes the\n // event that tells the issuing face the command settled.\n let draining = false;\n let drainAgain = false;\n const drainCommands = async (): Promise<void> => {\n if (draining) {\n drainAgain = true;\n return;\n }\n draining = true;\n try {\n const cmds = await readMachineCommands(api, identity.machine_id);\n if (cmds.length === 0) return;\n const applied: string[] = [];\n let forcedUpdate = false;\n for (const cmd of cmds) {\n try {\n if (cmd.kind === \"update\") {\n forcedUpdate = true;\n applied.push(cmd.id);\n continue;\n }\n const result = await applyMachineCommand(api, identity, cmd);\n daemonLog(`command ${cmd.kind}: ${result}`);\n applied.push(cmd.id);\n } catch (e) {\n daemonLog(`command ${cmd.kind} failed: ${e instanceof Error ? e.message : String(e)}`);\n applied.push(cmd.id); // drop it — don't retry-loop on a bad command\n }\n }\n await clearMachineCommands(api, identity.machine_id, applied).catch(() => {});\n\n if (forcedUpdate) {\n forcedUpdatePending = true;\n if ([...workers.values()].some((worker) => worker.busy)) {\n daemonLog(\"forced update deferred until active tool calls finish\");\n }\n await restartIfIdle();\n }\n } finally {\n draining = false;\n if (drainAgain) {\n drainAgain = false;\n void drainCommands();\n }\n }\n };\n // Remote file-browser RPC: a browsing client (web/native) parks a `.fsreq`\n // in this machine's user-KV; we scan the requested directory (structure only,\n // never file contents) and publish the result to `.fsres`. A machine-value\n // event starts each read, and the nonce keeps processing idempotent.\n let lastFsNonce: string | null = null;\n let fsBusy = false;\n let fsAgain = false;\n const drainFsRequests = async (): Promise<void> => {\n if (fsBusy) {\n fsAgain = true;\n return;\n }\n fsBusy = true;\n try {\n let req;\n try {\n req = await readFsRequest(api, identity.machine_id);\n } catch (error) {\n daemonLog(`fs-browse request read failed: ${error instanceof Error ? error.message : String(error)}`);\n return;\n }\n if (!req || req.nonce === lastFsNonce) return;\n lastFsNonce = req.nonce;\n daemonLog(`fs-browse ${req.op} received (${req.nonce})`);\n let ok = true;\n let result: unknown;\n let error: string | undefined;\n try {\n result =\n req.op === \"mkdir\"\n ? mkdirDirectory(req.path, req.name ?? \"\", { showHidden: req.show_hidden })\n : browseDirectory(req.path, { showHidden: req.show_hidden });\n } catch (err) {\n ok = false;\n error = err instanceof Error ? err.message : \"browse failed\";\n }\n try {\n await writeFsResponse(api, identity.machine_id, { nonce: req.nonce, ok, result, error });\n daemonLog(`fs-browse ${req.op} ${ok ? \"answered\" : \"failed\"} (${req.nonce})${error ? `: ${error}` : \"\"}`);\n } catch (writeError) {\n daemonLog(`fs-browse response write failed (${req.nonce}): ${writeError instanceof Error ? writeError.message : String(writeError)}`);\n }\n } finally {\n fsBusy = false;\n if (fsAgain) {\n fsAgain = false;\n void drainFsRequests();\n }\n }\n };\n\n const activeThreadSnapshot = async (): Promise<{ lines: Set<string>; sama: Set<string> }> => {\n const response = await fetch(`${api.origin}/api/users/me/standardcode/sidebar`, {\n headers: { Authorization: `Bearer ${api.bearer}` },\n });\n if (!response.ok) throw new Error(`sidebar snapshot returned ${response.status}`);\n const snapshot = (await response.json()) as {\n lines?: { active?: Array<{ thread_id?: unknown }> };\n activity?: { busy?: Array<{ thread_id?: unknown }> };\n };\n const lines = new Set<string>();\n const sama = new Set<string>();\n for (const entry of snapshot.lines?.active ?? []) {\n if (typeof entry.thread_id === \"string\") lines.add(entry.thread_id);\n }\n for (const entry of snapshot.activity?.busy ?? []) {\n if (typeof entry.thread_id === \"string\") sama.add(entry.thread_id);\n }\n return { lines, sama };\n };\n\n let recovering = false;\n let recoverAgain = false;\n const recoverOnConnect = async (): Promise<void> => {\n if (recovering) {\n recoverAgain = true;\n return;\n }\n recovering = true;\n try {\n await Promise.all([\n drainCommands(),\n drainFsRequests(),\n getMachineName(api, identity.machine_id)\n .then((name) => {\n displayName = name || os.hostname();\n })\n .catch(() => {}),\n ]);\n const snapshot = await activeThreadSnapshot();\n lineActiveThreads = snapshot.lines;\n samaActiveThreads = snapshot.sama;\n const active = [...new Set([...snapshot.lines, ...snapshot.sama])].slice(0, MAX_WORKERS);\n for (const threadId of active) {\n await attachThreadById(threadId, \"recovery\");\n }\n } catch (error) {\n daemonLog(`user-stream recovery failed: ${error instanceof Error ? error.message : String(error)}`);\n } finally {\n recovering = false;\n if (recoverAgain) {\n recoverAgain = false;\n void recoverOnConnect();\n }\n }\n };\n\n const idsFromEvent = (data: unknown, field: \"active\" | \"busy\"): Set<string> | null => {\n if (!data || typeof data !== \"object\") return null;\n const entries = (data as Record<string, unknown>)[field];\n if (!Array.isArray(entries)) return null;\n const ids = new Set<string>();\n for (const entry of entries) {\n if (entry && typeof entry === \"object\" && typeof (entry as { thread_id?: unknown }).thread_id === \"string\") {\n ids.add((entry as { thread_id: string }).thread_id);\n }\n }\n return ids;\n };\n\n const releaseInactiveWorkers = (): void => {\n for (const worker of [...workers.values()]) {\n if (!worker.busy && !threadIsActive(worker.threadId)) detach(worker.threadId);\n }\n void restartIfIdle();\n };\n\n const machinePrefix = `standardcode.machine.${identity.machine_id}`;\n hub = new DaemonUserStream(\n api,\n daemonClientId(identity),\n {\n onWake: (threadId) => void attachThreadById(threadId, \"wake\"),\n onEvent: (event, data) => {\n if (event === \"standardcode.approval_changed\") {\n const threadId = data && typeof data === \"object\" ? (data as { thread_id?: unknown }).thread_id : null;\n if (typeof threadId === \"string\") approvalWakes.wake(threadId);\n return;\n }\n if (event === \"standardcode.lines_changed\") {\n const ids = idsFromEvent(data, \"active\");\n if (ids) {\n lineActiveThreads = ids;\n releaseInactiveWorkers();\n }\n return;\n }\n if (event === \"standardcode.activity_changed\") {\n const ids = idsFromEvent(data, \"busy\");\n if (ids) {\n samaActiveThreads = ids;\n releaseInactiveWorkers();\n }\n return;\n }\n if (event !== \"standardcode.machine_changed\") return;\n const frame = data && typeof data === \"object\"\n ? (data as { key?: unknown; value?: unknown })\n : null;\n const key = frame?.key;\n daemonLog(`machine event: ${typeof key === \"string\" ? key : \"missing key\"}`);\n if (key === `${machinePrefix}.cmd`) void drainCommands();\n else if (key === `${machinePrefix}.fsreq`) {\n void drainFsRequests();\n }\n else if (key === `${machinePrefix}.name`) {\n if (frame && Object.prototype.hasOwnProperty.call(frame, \"value\")) {\n displayName = typeof frame.value === \"string\" && frame.value.trim()\n ? frame.value.trim()\n : os.hostname();\n } else {\n // Rolling-upgrade fallback for an older endpoint that emitted only\n // the key: one targeted value read, never an account snapshot.\n void getMachineName(api, identity.machine_id)\n .then((name) => {\n displayName = name || os.hostname();\n })\n .catch(() => {});\n }\n }\n },\n onConnection: (state, attempt) => {\n if (state === \"reconnecting\") {\n if (attempt === 1) {\n daemonLog(\"user stream: reconnecting\");\n void publishPresence(false);\n }\n return;\n }\n daemonLog(\"user stream: connected\");\n // Reconcile any response persisted while this account stream was\n // disconnected. Each wake causes one KV read; there is no polling.\n approvalWakes.wakeAll();\n void publishPresence(true).then(() => recoverOnConnect());\n },\n },\n displayName\n );\n hub.start();\n\n void checkUpdates();\n updateTimer = setInterval(() => void checkUpdates(), UPDATE_CHECK_MS);\n\n process.on(\"SIGTERM\", () => void shutdown(0));\n process.on(\"SIGINT\", () => void shutdown(0));\n\n daemonLog(`daemon ready — waiting for work tagged ${runnerTag}`);\n // Keep the process alive forever; all work is event/timer driven.\n await new Promise(() => {});\n}\n","/**\n * Daemon service management: install/uninstall/restart/status of the OS supervisor\n * that keeps `standardcode daemon run` alive across crashes and reboots.\n *\n * - macOS: a LaunchAgent (~/Library/LaunchAgents/ai.standardcode.daemon.plist)\n * with KeepAlive — launchd restarts the daemon on crash and starts it at\n * login.\n * - Linux: a systemd user unit (~/.config/systemd/user/standardcode-daemon\n * .service) with Restart=always, plus `loginctl enable-linger` so the unit\n * runs without an active login session (the VPS case).\n *\n * The supervisor is also the second half of self-update: the daemon exits\n * cleanly once a newer version has installed, and the supervisor restarts it\n * on the new code.\n */\nimport fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { spawnSync } from \"node:child_process\";\nimport { inheritedSubprocessEnv } from \"./subprocess-env.ts\";\n\nconst SERVICE_LABEL = \"ai.standardcode.daemon\";\nconst SYSTEMD_UNIT = \"standardcode-daemon.service\";\n\nexport interface ServiceCommand {\n /** argv to launch `standardcode daemon run` (absolute paths only). */\n argv: string[];\n}\n\n/**\n * Resolve how the supervisor should launch the daemon, based on how THIS\n * process was launched. An installed CLI runs its bundled entry under node; a\n * dev checkout (a .ts entry) runs through the repo's tsx.\n */\nexport function resolveDaemonCommand(extraArgs: string[] = []): ServiceCommand {\n const entry = path.resolve(process.argv[1] ?? \"\");\n if (!entry) throw new Error(\"Cannot determine how this CLI was launched.\");\n const argv: string[] = [process.execPath];\n if (entry.endsWith(\".ts\")) {\n // Dev checkout: find the repo's tsx runner so the service can execute TS.\n let dir = path.dirname(entry);\n let tsx: string | null = null;\n for (let i = 0; i < 6 && dir !== path.dirname(dir); i++) {\n const candidate = path.join(dir, \"node_modules\", \"tsx\", \"dist\", \"cli.mjs\");\n if (fs.existsSync(candidate)) {\n tsx = candidate;\n break;\n }\n dir = path.dirname(dir);\n }\n if (!tsx) {\n throw new Error(\n \"This is a source checkout and tsx wasn't found — run `pnpm install` in the repo, or install the CLI globally and re-run daemon install.\"\n );\n }\n argv.push(tsx);\n }\n argv.push(entry, \"daemon\", \"run\", ...extraArgs);\n return { argv };\n}\n\n/** A PATH for the service environment: supervisors start with a minimal PATH,\n * but forwarded bash/tools need the user's usual toolchain locations. */\nfunction servicePath(): string {\n const parts = [\n path.dirname(process.execPath),\n \"/opt/homebrew/bin\",\n \"/usr/local/bin\",\n \"/usr/bin\",\n \"/bin\",\n \"/usr/sbin\",\n \"/sbin\",\n ];\n const current = (process.env.PATH || \"\").split(\":\").filter(Boolean);\n return [...new Set([...current, ...parts])].join(\":\");\n}\n\nfunction run(cmd: string, args: string[]): { ok: boolean; output: string } {\n const res = spawnSync(cmd, args, {\n encoding: \"utf8\",\n env: inheritedSubprocessEnv(),\n });\n const output = `${res.stdout ?? \"\"}${res.stderr ?? \"\"}`.trim();\n return { ok: res.status === 0, output };\n}\n\nconst plistPath = () => path.join(os.homedir(), \"Library\", \"LaunchAgents\", `${SERVICE_LABEL}.plist`);\nconst unitPath = () => path.join(os.homedir(), \".config\", \"systemd\", \"user\", SYSTEMD_UNIT);\nconst xmlEscape = (s: string) => s.replace(/&/g, \"&amp;\").replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\");\n\nexport interface InstallResult {\n ok: boolean;\n detail: string;\n manualHint?: string;\n}\n\nexport function restartServiceInvocation(\n platform: NodeJS.Platform,\n uid = 501\n): { cmd: string; args: string[] } | null {\n if (platform === \"darwin\") {\n return { cmd: \"launchctl\", args: [\"kickstart\", \"-k\", `gui/${uid}/${SERVICE_LABEL}`] };\n }\n if (platform === \"linux\") {\n return { cmd: \"systemctl\", args: [\"--user\", \"restart\", SYSTEMD_UNIT] };\n }\n return null;\n}\n\nexport function installService(command: ServiceCommand, endpoint?: string): InstallResult {\n if (process.platform === \"darwin\") return installLaunchd(command, endpoint);\n if (process.platform === \"linux\") return installSystemd(command, endpoint);\n return {\n ok: false,\n detail: `Unsupported platform for the daemon service: ${process.platform}`,\n manualHint: \"Run `standardcode daemon run` under your own supervisor.\",\n };\n}\n\nfunction installLaunchd(command: ServiceCommand, endpoint?: string): InstallResult {\n const logDir = path.join(os.homedir(), \".standardagents\");\n fs.mkdirSync(logDir, { recursive: true });\n fs.mkdirSync(path.dirname(plistPath()), { recursive: true });\n const envEntries = [\n ` <key>PATH</key><string>${xmlEscape(servicePath())}</string>`,\n ...(endpoint ? [` <key>STANDARD_CODE_DAEMON_ENDPOINT</key><string>${xmlEscape(endpoint)}</string>`] : []),\n ].join(\"\\n\");\n const plist = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n <dict>\n <key>Label</key><string>${SERVICE_LABEL}</string>\n <key>ProgramArguments</key>\n <array>\n${command.argv.map((a) => ` <string>${xmlEscape(a)}</string>`).join(\"\\n\")}\n </array>\n <key>RunAtLoad</key><true/>\n <key>KeepAlive</key><true/>\n <key>ThrottleInterval</key><integer>5</integer>\n <key>StandardOutPath</key><string>${xmlEscape(path.join(logDir, \"daemon.out.log\"))}</string>\n <key>StandardErrorPath</key><string>${xmlEscape(path.join(logDir, \"daemon.err.log\"))}</string>\n <key>EnvironmentVariables</key>\n <dict>\n${envEntries}\n </dict>\n </dict>\n</plist>\n`;\n fs.writeFileSync(plistPath(), plist);\n const uid = typeof process.getuid === \"function\" ? process.getuid() : 501;\n run(\"launchctl\", [\"bootout\", `gui/${uid}`, plistPath()]); // clear any old copy\n const boot = run(\"launchctl\", [\"bootstrap\", `gui/${uid}`, plistPath()]);\n if (!boot.ok) {\n // Older macOS fallback.\n const load = run(\"launchctl\", [\"load\", \"-w\", plistPath()]);\n if (!load.ok) {\n return {\n ok: false,\n detail: `launchctl failed: ${boot.output || load.output}`,\n manualHint: `Load it manually: launchctl bootstrap gui/${uid} ${plistPath()}`,\n };\n }\n }\n return { ok: true, detail: `LaunchAgent installed (${plistPath()})` };\n}\n\nfunction installSystemd(command: ServiceCommand, endpoint?: string): InstallResult {\n fs.mkdirSync(path.dirname(unitPath()), { recursive: true });\n const unit = `[Unit]\nDescription=Standard Code daemon (headless coding-agent execution client)\nAfter=network-online.target\n\n[Service]\nExecStart=${command.argv.map((a) => (a.includes(\" \") ? `\"${a}\"` : a)).join(\" \")}\nRestart=always\nRestartSec=5\nEnvironment=PATH=${servicePath()}\n${endpoint ? `Environment=STANDARD_CODE_DAEMON_ENDPOINT=${endpoint}\\n` : \"\"}\n[Install]\nWantedBy=default.target\n`;\n fs.writeFileSync(unitPath(), unit);\n const reload = run(\"systemctl\", [\"--user\", \"daemon-reload\"]);\n if (!reload.ok) {\n return {\n ok: false,\n detail: `systemd user manager unavailable: ${reload.output}`,\n manualHint:\n `Unit written to ${unitPath()}. On a server without a user manager, copy it to /etc/systemd/system/ ` +\n `(sudo), change ExecStart's user if needed, then: sudo systemctl enable --now ${SYSTEMD_UNIT}`,\n };\n }\n const enable = run(\"systemctl\", [\"--user\", \"enable\", \"--now\", SYSTEMD_UNIT]);\n if (!enable.ok) {\n return { ok: false, detail: `systemctl enable failed: ${enable.output}` };\n }\n // Without linger the unit dies when the SSH session ends — the whole point\n // of a VPS daemon is surviving that.\n const linger = run(\"loginctl\", [\"enable-linger\", os.userInfo().username]);\n return {\n ok: true,\n detail:\n `systemd user unit installed (${unitPath()})` +\n (linger.ok ? \", lingering enabled\" : ` — enable lingering manually: sudo loginctl enable-linger ${os.userInfo().username}`),\n };\n}\n\nexport function uninstallService(): InstallResult {\n if (process.platform === \"darwin\") {\n const uid = typeof process.getuid === \"function\" ? process.getuid() : 501;\n run(\"launchctl\", [\"bootout\", `gui/${uid}`, plistPath()]);\n try {\n fs.unlinkSync(plistPath());\n } catch {\n // already gone\n }\n return { ok: true, detail: \"LaunchAgent removed\" };\n }\n if (process.platform === \"linux\") {\n run(\"systemctl\", [\"--user\", \"disable\", \"--now\", SYSTEMD_UNIT]);\n try {\n fs.unlinkSync(unitPath());\n } catch {\n // already gone\n }\n run(\"systemctl\", [\"--user\", \"daemon-reload\"]);\n return { ok: true, detail: \"systemd user unit removed\" };\n }\n return { ok: false, detail: `Unsupported platform: ${process.platform}` };\n}\n\n/** Restart the installed daemon under its operating-system supervisor. */\nexport function restartService(): InstallResult {\n if (process.platform === \"darwin\") {\n if (!fs.existsSync(plistPath())) {\n return {\n ok: false,\n detail: \"The daemon service is not installed. Run `standardcode daemon install` first.\",\n };\n }\n const uid = typeof process.getuid === \"function\" ? process.getuid() : 501;\n const invocation = restartServiceInvocation(process.platform, uid)!;\n const restart = run(invocation.cmd, invocation.args);\n if (restart.ok) return { ok: true, detail: \"LaunchAgent restarted\" };\n\n // Recover an installed plist that launchd is no longer managing.\n const boot = run(\"launchctl\", [\"bootstrap\", `gui/${uid}`, plistPath()]);\n if (boot.ok) return { ok: true, detail: \"LaunchAgent loaded and started\" };\n return {\n ok: false,\n detail: `launchctl failed: ${restart.output || boot.output}`,\n manualHint: `Load it manually: launchctl bootstrap gui/${uid} ${plistPath()}`,\n };\n }\n if (process.platform === \"linux\") {\n if (!fs.existsSync(unitPath())) {\n return {\n ok: false,\n detail: \"The daemon service is not installed. Run `standardcode daemon install` first.\",\n };\n }\n const invocation = restartServiceInvocation(process.platform)!;\n const restart = run(invocation.cmd, invocation.args);\n return restart.ok\n ? { ok: true, detail: \"systemd user service restarted\" }\n : { ok: false, detail: `systemctl restart failed: ${restart.output}` };\n }\n return { ok: false, detail: `Unsupported platform: ${process.platform}` };\n}\n\nexport function serviceStatus(): { installed: boolean; running: boolean; detail: string } {\n if (process.platform === \"darwin\") {\n const installed = fs.existsSync(plistPath());\n const list = run(\"launchctl\", [\"list\", SERVICE_LABEL]);\n const pidMatch = list.output.match(/\"PID\"\\s*=\\s*(\\d+)/);\n return {\n installed,\n running: list.ok && !!pidMatch,\n detail: installed\n ? list.ok\n ? pidMatch\n ? `running (pid ${pidMatch[1]})`\n : \"loaded, not running\"\n : \"installed, not loaded\"\n : \"not installed\",\n };\n }\n if (process.platform === \"linux\") {\n const installed = fs.existsSync(unitPath());\n const active = run(\"systemctl\", [\"--user\", \"is-active\", SYSTEMD_UNIT]);\n return {\n installed,\n running: active.output.trim() === \"active\",\n detail: installed ? active.output.trim() || \"unknown\" : \"not installed\",\n };\n }\n return { installed: false, running: false, detail: `unsupported platform ${process.platform}` };\n}\n","/**\n * `standardcode daemon <command>` — manage this machine's headless execution\n * daemon. Plain stdout/readline (no TUI): install runs over SSH on fresh VPS\n * boxes, so everything must work on a dumb terminal.\n */\nimport fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport readline from \"node:readline/promises\";\nimport { stdin as input, stdout as output } from \"node:process\";\nimport { ApiClient } from \"./api.ts\";\nimport { getCredential, saveCredential, defaultEndpoint, normalizeEndpoint } from \"./credentials.ts\";\nimport { deviceLogin } from \"./device-login.ts\";\nimport { loadMachineIdentity } from \"./machine.ts\";\nimport {\n clearDaemon,\n daemonOnline,\n loadMachine,\n machineDisplayName,\n setMachineName,\n enqueueMachineCommand,\n registerProject,\n unregisterProject,\n updateOwnMachineRecord,\n} from \"./registry.ts\";\nimport { runDaemon } from \"./daemon.ts\";\nimport {\n installService,\n restartService,\n resolveDaemonCommand,\n serviceStatus,\n uninstallService,\n} from \"./daemon-service.ts\";\nimport {\n detectPackageManager,\n runUpdate,\n updateCommand as packageUpdateCommand,\n} from \"./check-update.ts\";\nimport { PRODUCTION_ENDPOINT, readVersion, relaxTlsForLocalEndpoint } from \"./product.ts\";\n\nconst c = {\n reset: \"\\x1b[0m\",\n dim: \"\\x1b[2m\",\n bold: \"\\x1b[1m\",\n green: \"\\x1b[32m\",\n red: \"\\x1b[31m\",\n yellow: \"\\x1b[33m\",\n teal: \"\\x1b[38;5;37m\",\n};\n\nfunction usage(): void {\n output.write(\n [\n \"\",\n `${c.bold}standardcode daemon${c.reset} — headless execution client for this machine`,\n \"\",\n `${c.bold}Commands${c.reset}`,\n \" install [--endpoint url] [--name label | --yes]\",\n \" Sign in (if needed), name this machine, and install\",\n \" the always-on service (launchd / systemd).\",\n \" --name/--yes skip the name prompt (non-interactive,\",\n \" e.g. when another app drives the install).\",\n \" uninstall Stop and remove the service.\",\n \" status Service + registry status for this machine.\",\n \" restart Restart the installed service immediately.\",\n \" update [--endpoint url] Install the latest CLI, then restart the service.\",\n \" run [--endpoint url] Run the daemon in the foreground (what the service runs).\",\n \" add-project <path> Register a project directory for remote sessions.\",\n \" remove-project <path> Remove a registered project directory.\",\n \"\",\n ].join(\"\\n\")\n );\n}\n\nfunction parseEndpointFlag(args: string[]): { endpoint?: string; rest: string[] } {\n const rest: string[] = [];\n let endpoint: string | undefined;\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n if (arg === \"--endpoint\" || arg === \"-e\") {\n endpoint = args[++i];\n } else if (arg.startsWith(\"--endpoint=\")) {\n endpoint = arg.slice(\"--endpoint=\".length);\n } else {\n rest.push(arg);\n }\n }\n return { endpoint, rest };\n}\n\n/**\n * Install-only flags. `--name <label>` names the machine without the readline\n * prompt; bare `--name` or `--yes` keeps the suggested name. Either form makes\n * the install fully non-interactive so a GUI (the macOS app's install offer)\n * can drive it as a child process.\n */\nexport function parseInstallFlags(args: string[]): { name?: string; yes: boolean; rest: string[] } {\n const rest: string[] = [];\n let name: string | undefined;\n let yes = false;\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n if (arg === \"--yes\" || arg === \"-y\") {\n yes = true;\n } else if (arg === \"--name\") {\n const next = args[i + 1];\n if (next !== undefined && !next.startsWith(\"-\")) {\n name = next;\n i++;\n } else {\n yes = true;\n }\n } else if (arg.startsWith(\"--name=\")) {\n const value = arg.slice(\"--name=\".length);\n if (value) name = value;\n else yes = true;\n } else {\n rest.push(arg);\n }\n }\n return { name: name?.trim() || undefined, yes, rest };\n}\n\nfunction resolveEndpoint(flag?: string): string {\n return normalizeEndpoint(\n flag || process.env.STANDARD_CODE_DAEMON_ENDPOINT || defaultEndpoint() || PRODUCTION_ENDPOINT\n );\n}\n\n/** Ensure a working credential for the endpoint, running device login if needed. */\nasync function ensureSignedIn(endpoint: string): Promise<ApiClient> {\n relaxTlsForLocalEndpoint(endpoint);\n const host = endpoint.replace(/^https?:\\/\\//, \"\");\n const stored = getCredential(endpoint);\n if (stored) {\n const api = new ApiClient(endpoint, stored.access_token);\n const check = await api.verifyDetailed();\n if (check.ok) return api;\n output.write(`${c.yellow}Saved sign-in for ${host} failed:${c.reset} ${check.reason}\\n\\n`);\n }\n output.write(`${c.bold}Sign in to Standard Code${c.reset} ${c.dim}(${host})${c.reset}\\n\\n`);\n const token = await deviceLogin(endpoint);\n const api = new ApiClient(endpoint, token);\n const check = await api.verifyDetailed();\n if (!check.ok) throw new Error(`Sign-in didn't verify: ${check.reason}`);\n saveCredential(\n { endpoint, access_token: token, token_type: \"Bearer\", saved_at: Date.now() },\n { updateDefault: false }\n );\n output.write(`${c.green}✓${c.reset} Signed in to ${c.teal}${host}${c.reset}\\n\\n`);\n return api;\n}\n\nasync function installCommand(\n endpointFlag?: string,\n opts: { name?: string; yes?: boolean } = {}\n): Promise<void> {\n const endpoint = resolveEndpoint(endpointFlag);\n const api = await ensureSignedIn(endpoint);\n\n // Name this machine — a label stored on your ACCOUNT (not on this box), so\n // it's what other clients see in the \"where should this session run?\" picker\n // and can be changed from anywhere via /machines.\n const identity = loadMachineIdentity();\n const existing = await loadMachine(api, identity.machine_id).catch(() => null);\n const suggested = machineDisplayName(existing ?? { hostname: os.hostname(), id: identity.machine_id });\n let answer = \"\";\n if (opts.name) {\n answer = opts.name;\n } else if (!opts.yes) {\n const rl = readline.createInterface({ input, output });\n answer = (await rl.question(\n `${c.bold}Machine name${c.reset} ${c.dim}(shown in the session picker)${c.reset} [${suggested}]: `\n )).trim();\n rl.close();\n }\n if (answer) await setMachineName(api, identity.machine_id, answer);\n\n // Register the machine record before starting the service so the account\n // knows this machine exists while its account stream is connecting.\n await updateOwnMachineRecord(api, identity);\n const displayName = answer || suggested;\n\n output.write(`${c.dim}Installing the always-on service…${c.reset}\\n`);\n const extra = endpointFlag ? [\"--endpoint\", endpoint] : [];\n const result = installService(resolveDaemonCommand(extra), endpointFlag ? endpoint : undefined);\n if (!result.ok) {\n output.write(`${c.red}✗${c.reset} ${result.detail}\\n`);\n if (result.manualHint) output.write(`${c.dim}${result.manualHint}${c.reset}\\n`);\n process.exit(1);\n }\n output.write(`${c.green}✓${c.reset} ${result.detail}\\n`);\n\n // Wait for the daemon's account stream to publish connected presence.\n output.write(`${c.dim}Waiting for the daemon to connect…${c.reset}\\n`);\n // launchd can defer a freshly bootstrapped agent, and the account-wide\n // registry may take a moment to expose the daemon's write. Give both enough\n // time before reporting a warning that suggests the service failed.\n // Sanctioned polling exception (see AGENTS.md \"No polling\"): this is a\n // ONE-SHOT bounded installer proof-of-life in a plain-readline process that\n // holds no account stream; it ends at first success or 60s, never repeats.\n const deadline = Date.now() + 60_000;\n let alive = false;\n while (Date.now() < deadline) {\n await new Promise((r) => setTimeout(r, 2000));\n const record = await loadMachine(api, identity.machine_id);\n if (record && daemonOnline(record)) {\n alive = true;\n break;\n }\n }\n if (alive) {\n output.write(\n `${c.green}✓${c.reset} ${c.bold}${displayName}${c.reset} is online.\\n\\n` +\n `Standard Code sessions can now edit files and run tools on this machine while you drive them from any device signed in to your account.\\n` +\n `${c.dim}Projects are added automatically when you start Standard Code from their directory.\\n` +\n `To add a project manually, run:${c.reset}\\n` +\n ` ${c.bold}standardcode daemon add-project /absolute/path/to/project${c.reset}\\n`\n );\n } else {\n output.write(\n `${c.yellow}⚠${c.reset} The service installed but has not connected yet.\\n` +\n `${c.dim}Check ~/.standardagents/daemon.log and \\`standardcode daemon status\\`.${c.reset}\\n`\n );\n }\n}\n\nasync function statusCommand(): Promise<void> {\n const status = serviceStatus();\n const identity = loadMachineIdentity();\n output.write(`${c.bold}Service:${c.reset} ${status.detail}\\n`);\n const endpoint = resolveEndpoint();\n const cred = getCredential(endpoint);\n if (!cred) {\n output.write(\n `${c.bold}Machine:${c.reset} ${os.hostname()} ${c.dim}(${identity.machine_id})${c.reset}\\n`\n );\n output.write(`${c.bold}Account:${c.reset} ${c.yellow}not signed in to ${endpoint}${c.reset}\\n`);\n return;\n }\n relaxTlsForLocalEndpoint(endpoint);\n const api = new ApiClient(endpoint, cred.access_token);\n const record = await loadMachine(api, identity.machine_id).catch(() => null);\n // The machine's display NAME is account data — sourced from the record.\n output.write(\n `${c.bold}Machine:${c.reset} ${machineDisplayName(record ?? { hostname: os.hostname(), id: identity.machine_id })} ${c.dim}(${identity.machine_id})${c.reset}\\n`\n );\n if (!record) {\n output.write(`${c.bold}Registry:${c.reset} not registered yet\\n`);\n return;\n }\n const online = daemonOnline(record);\n const streamConnected =\n !!record.daemon &&\n (record.daemon.connected ?? record.daemon.last_seen_at > Date.now());\n const seen = streamConnected && record.daemon\n ? `user stream connected (v${record.daemon.version})`\n : record.daemon?.connected === false\n ? `user stream disconnected (v${record.daemon.version})`\n : record.daemon\n ? `last legacy heartbeat ${Math.round((Date.now() - record.daemon.last_seen_at) / 1000)}s ago (v${record.daemon.version})`\n : \"never\";\n output.write(`${c.bold}Registry:${c.reset} ${online ? `${c.green}online${c.reset}` : `${c.yellow}offline${c.reset}`} · ${seen}\\n`);\n const projects = Object.keys(record.projects);\n output.write(`${c.bold}Projects:${c.reset} ${projects.length ? \"\" : c.dim + \"none registered\" + c.reset}\\n`);\n for (const p of projects.sort()) output.write(` ${c.dim}${p}${c.reset}\\n`);\n}\n\nasync function updateDaemonCommand(endpointFlag?: string): Promise<void> {\n const status = serviceStatus();\n if (!status.installed) {\n output.write(\n `${c.red}✗${c.reset} The daemon service is not installed. Run \\`standardcode daemon install\\` first.\\n`\n );\n process.exit(1);\n }\n\n const endpoint = resolveEndpoint(endpointFlag);\n const api = await ensureSignedIn(endpoint);\n const identity = loadMachineIdentity();\n const record = await loadMachine(api, identity.machine_id).catch(() => null);\n\n if (status.running && record && daemonOnline(record)) {\n await enqueueMachineCommand(api, identity.machine_id, \"update\");\n output.write(\n `${c.green}✓${c.reset} Update requested. The daemon will finish active tool calls, install the latest Standard Code, and restart.\\n`\n );\n return;\n }\n\n // An offline service cannot consume its account command queue. Update from\n // this installed CLI process, then start the service on the new package.\n const pm = detectPackageManager();\n if (!pm) {\n output.write(\n `${c.red}✗${c.reset} This source checkout cannot update the installed CLI. Run \\`standardcode daemon update\\` through your global Standard Code command.\\n`\n );\n process.exit(1);\n }\n const { display } = packageUpdateCommand(pm);\n output.write(`${c.dim}Running ${display}…${c.reset}\\n`);\n const result = await runUpdate(pm);\n if (!result.ok) {\n output.write(`${c.red}✗${c.reset} Update failed.\\n`);\n for (const line of result.output.trim().split(\"\\n\").slice(-6)) {\n if (line) output.write(`${c.dim}${line}${c.reset}\\n`);\n }\n process.exit(1);\n }\n const restarted = restartService();\n output.write(\n `${restarted.ok ? c.green + \"✓\" : c.red + \"✗\"}${c.reset} ${\n restarted.ok ? \"Standard Code updated. \" : \"Standard Code updated, but the daemon restart failed. \"\n }${restarted.detail}\\n`\n );\n if (!restarted.ok) process.exit(1);\n}\n\nasync function projectCommand(action: \"add\" | \"remove\", target?: string): Promise<void> {\n if (!target) {\n output.write(`${c.red}✗${c.reset} Expected a project path.\\n`);\n process.exit(1);\n }\n const dir = path.resolve(target);\n if (action === \"add\" && !fs.existsSync(dir)) {\n output.write(`${c.red}✗${c.reset} ${dir} does not exist on this machine.\\n`);\n process.exit(1);\n }\n const endpoint = resolveEndpoint();\n const api = await ensureSignedIn(endpoint);\n const identity = loadMachineIdentity();\n const record = await loadMachine(api, identity.machine_id).catch(() => null);\n const displayName = machineDisplayName(record ?? { hostname: os.hostname(), id: identity.machine_id });\n if (action === \"add\") {\n await registerProject(api, identity, dir);\n output.write(`${c.green}✓${c.reset} Registered ${dir} for remote sessions on ${displayName}.\\n`);\n } else {\n await unregisterProject(api, identity, dir);\n output.write(`${c.green}✓${c.reset} Removed ${dir} from this machine's projects.\\n`);\n }\n}\n\n/** Entry point for `standardcode daemon …` (called from index.ts). */\nexport async function runDaemonCommand(argv: string[]): Promise<void> {\n const [command, ...restArgs] = argv;\n const { endpoint, rest } = parseEndpointFlag(restArgs);\n switch (command) {\n case \"run\":\n await runDaemon({ endpoint: endpoint || process.env.STANDARD_CODE_DAEMON_ENDPOINT });\n return;\n case \"install\": {\n const flags = parseInstallFlags(rest);\n await installCommand(endpoint, flags);\n return;\n }\n case \"uninstall\": {\n const result = uninstallService();\n output.write(`${result.ok ? c.green + \"✓\" : c.red + \"✗\"}${c.reset} ${result.detail}\\n`);\n // Clear daemon metadata so other clients stop offering this box.\n const ep = resolveEndpoint(endpoint);\n const cred = getCredential(ep);\n if (cred) {\n relaxTlsForLocalEndpoint(ep);\n await clearDaemon(new ApiClient(ep, cred.access_token), loadMachineIdentity()).catch(() => {});\n }\n return;\n }\n case \"status\":\n await statusCommand();\n return;\n case \"restart\": {\n const result = restartService();\n output.write(`${result.ok ? c.green + \"✓\" : c.red + \"✗\"}${c.reset} ${result.detail}\\n`);\n if (result.manualHint) output.write(`${c.dim}${result.manualHint}${c.reset}\\n`);\n if (!result.ok) process.exit(1);\n return;\n }\n case \"update\":\n await updateDaemonCommand(endpoint);\n return;\n case \"add-project\":\n await projectCommand(\"add\", rest[0]);\n return;\n case \"remove-project\":\n await projectCommand(\"remove\", rest[0]);\n return;\n case \"version\":\n output.write(`standardcode daemon v${readVersion()}\\n`);\n return;\n default:\n usage();\n if (command && command !== \"help\" && command !== \"--help\" && command !== \"-h\") {\n process.exit(1);\n }\n }\n}\n","/**\n * Small per-user preference store (~/.standardagents/prefs.json) for CLI\n * choices that must be remembered across runs — e.g. \"don't offer the daemon\n * install again\". Distinct from credentials (secrets) and machine.json\n * (hardware identity): these are plain, harmless remembered answers.\n */\nimport fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\n\nconst DIR = path.join(os.homedir(), \".standardagents\");\nconst FILE = path.join(DIR, \"prefs.json\");\n\nexport interface CliPrefs {\n /** Set when the user declined the daemon-install offer for this machine. */\n daemon_install_declined_at?: number;\n}\n\nexport function loadPrefs(file: string = FILE): CliPrefs {\n try {\n return JSON.parse(fs.readFileSync(file, \"utf8\")) as CliPrefs;\n } catch {\n return {};\n }\n}\n\nexport function savePrefs(update: Partial<CliPrefs>, file: string = FILE): void {\n const merged = { ...loadPrefs(file), ...update };\n fs.mkdirSync(path.dirname(file), { recursive: true });\n fs.writeFileSync(file, JSON.stringify(merged, null, 2));\n}\n\n/**\n * Whether to offer the one-keypress daemon install for THIS machine at the\n * moment the user asks to run a session here. Code changes on a machine happen\n * only through that machine's daemon, so the offer is the gate on \"run it\n * here\" rather than a startup nag. Pure decision — callers supply the\n * environment facts — so the gating is testable without a TTY or launchctl.\n *\n * `explicit` marks a deliberate pick of this machine in the location picker.\n * A remembered decline suppresses only the IMPLICIT offer (a bare\n * `standardcode <dir>` launch, which assumes local execution); it never\n * blocks a user who just chose this machine on purpose.\n */\nexport function shouldOfferDaemonInstall(facts: {\n platform: NodeJS.Platform;\n interactive: boolean;\n serviceInstalled: boolean;\n daemonOnline: boolean;\n declinedAt: number | undefined;\n explicit: boolean;\n optedOutEnv: boolean;\n}): boolean {\n if (facts.optedOutEnv) return false;\n if (!facts.interactive) return false;\n if (facts.platform === \"win32\") return false;\n if (facts.serviceInstalled) return false;\n if (facts.daemonOnline) return false;\n if (!facts.explicit && facts.declinedAt !== undefined) return false;\n return true;\n}\n","/**\n * `standardcode login` / `standardcode logout` — top-level account commands.\n *\n * `login` ALWAYS re-runs the sign-in flow, replacing any stored credential\n * for the endpoint — that is how you switch accounts on a machine. `logout`\n * removes the stored credential and says so plainly (nothing dies silently:\n * running it while signed out is an honest no-op, not an error).\n *\n * Plain stdout like the daemon commands — these run on dumb terminals.\n */\nimport { ApiClient } from \"./api.ts\";\nimport {\n defaultEndpoint,\n deleteCredential,\n getCredential,\n normalizeEndpoint,\n saveCredential,\n} from \"./credentials.ts\";\nimport { deviceLogin } from \"./device-login.ts\";\nimport { PRODUCTION_ENDPOINT, relaxTlsForLocalEndpoint } from \"./product.ts\";\n\nconst c = {\n reset: \"\\x1b[0m\",\n dim: \"\\x1b[2m\",\n bold: \"\\x1b[1m\",\n green: \"\\x1b[32m\",\n red: \"\\x1b[31m\",\n teal: \"\\x1b[38;5;43m\",\n};\n\nexport interface AuthCliArgs {\n endpoint: string;\n /** True when --endpoint was passed (don't repoint the default). */\n endpointExplicit: boolean;\n token: string | null;\n}\n\n/** Parse login/logout args. Throws on unknown flags so typos never no-op. */\nexport function parseAuthArgs(argv: string[]): AuthCliArgs {\n let endpoint: string | null = null;\n let token: string | null = null;\n for (let i = 0; i < argv.length; i += 1) {\n const arg = argv[i];\n if (arg === \"--endpoint\" || arg === \"-e\") {\n endpoint = argv[++i] ?? \"\";\n if (!endpoint) throw new Error(\"--endpoint requires a URL\");\n } else if (arg.startsWith(\"--endpoint=\")) {\n endpoint = arg.slice(\"--endpoint=\".length);\n } else if (arg === \"--token\") {\n token = argv[++i] ?? \"\";\n if (!token) throw new Error(\"--token requires a value\");\n } else if (arg.startsWith(\"--token=\")) {\n token = arg.slice(\"--token=\".length);\n } else {\n throw new Error(`Unknown option for login/logout: ${arg}`);\n }\n }\n const endpointExplicit = endpoint !== null;\n const resolved = normalizeEndpoint(endpoint ?? defaultEndpoint() ?? PRODUCTION_ENDPOINT);\n return { endpoint: resolved, endpointExplicit, token };\n}\n\nfunction hostLabel(endpoint: string): string {\n return endpoint.replace(/^https?:\\/\\//, \"\").replace(/\\/$/, \"\");\n}\n\n/** Best-effort \"who am I\" for the success line. */\nasync function signedInLabel(endpoint: string, token: string): Promise<string | null> {\n try {\n const res = await fetch(`${endpoint}/api/auth/me`, {\n headers: { Authorization: `Bearer ${token}` },\n signal: AbortSignal.timeout(10_000),\n });\n if (!res.ok) return null;\n const body = (await res.json()) as { user?: { email?: string | null; username?: string | null } };\n return body.user?.email || body.user?.username || null;\n } catch {\n return null;\n }\n}\n\nexport async function runAuthCommand(command: \"login\" | \"logout\", argv: string[]): Promise<void> {\n let args: AuthCliArgs;\n try {\n args = parseAuthArgs(argv);\n } catch (error) {\n process.stdout.write(`${c.red}error:${c.reset} ${error instanceof Error ? error.message : String(error)}\\n`);\n process.stdout.write(`${c.dim}usage: standardcode ${command} [--endpoint <url>]${command === \"login\" ? \" [--token <key>]\" : \"\"}${c.reset}\\n`);\n process.exitCode = 1;\n return;\n }\n const host = hostLabel(args.endpoint);\n relaxTlsForLocalEndpoint(args.endpoint);\n const existing = getCredential(args.endpoint);\n\n if (command === \"logout\") {\n if (!existing) {\n process.stdout.write(`You're not signed in to ${c.teal}${host}${c.reset} — nothing to do.\\n`);\n return;\n }\n deleteCredential(args.endpoint);\n process.stdout.write(`${c.green}✓${c.reset} Signed out of ${c.teal}${host}${c.reset}.\\n`);\n process.stdout.write(`${c.dim}Run \\`standardcode login\\` to sign in again — with any account.${c.reset}\\n`);\n return;\n }\n\n // login — always a fresh flow, even when already signed in: that IS the\n // account switcher.\n if (existing) {\n const who = await signedInLabel(args.endpoint, existing.access_token);\n process.stdout.write(\n `${c.dim}Currently signed in to ${host}${who ? ` as ${who}` : \"\"} — replacing that sign-in.${c.reset}\\n`\n );\n }\n\n let token = args.token;\n if (!token) {\n process.stdout.write(`${c.bold}Sign in to Standard Code${c.reset}\\n`);\n if (`https://${host}` !== PRODUCTION_ENDPOINT && `http://${host}` !== PRODUCTION_ENDPOINT) {\n process.stdout.write(`${c.dim}Connecting to${c.reset} ${c.teal}${host}${c.reset}\\n`);\n }\n try {\n token = await deviceLogin(args.endpoint);\n } catch (error) {\n process.stdout.write(`${c.red}✗${c.reset} ${error instanceof Error ? error.message : String(error)}\\n`);\n process.exitCode = 1;\n return;\n }\n }\n\n const api = new ApiClient(args.endpoint, token);\n const check = await api.verifyDetailed();\n if (!check.ok) {\n process.stdout.write(`${c.red}✗${c.reset} Sign-in didn't verify: ${check.reason}\\n`);\n if (check.hint) process.stdout.write(` ${c.dim}${check.hint}${c.reset}\\n`);\n process.exitCode = 1;\n return;\n }\n\n saveCredential(\n { endpoint: args.endpoint, access_token: token, token_type: \"Bearer\", saved_at: Date.now() },\n { updateDefault: !args.endpointExplicit }\n );\n const who = await signedInLabel(args.endpoint, token);\n process.stdout.write(`${c.green}✓${c.reset} Signed in to ${c.teal}${host}${c.reset}${who ? ` as ${c.bold}${who}${c.reset}` : \"\"}.\\n`);\n}\n","/**\n * Standard Code CLI entry point.\n *\n * Pre-flight (plain readline): resolve the instance endpoint, OAuth-login if\n * needed, choose which machine's daemon runs the session, then offer to resume\n * a thread for that project or start a new one. Then hand off to the\n * interactive TUI, which WATCHES the session: it streams the agent, sends,\n * steers, stops, and answers relayed approvals.\n *\n * This process never executes the agent's tools. Changes to files on a machine\n * happen only through that machine's daemon (`standardcode daemon install`),\n * including the machine you launched from — so the execution stack\n * (ExecutionSession / Bridge / HostTools / MCP host / permission engine) is\n * wired in `daemon.ts`, never here.\n */\nimport os from \"node:os\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport readline from \"node:readline/promises\";\nimport { spawn } from \"node:child_process\";\nimport { stdin as input, stdout as output } from \"node:process\";\nimport { ApiClient, type MessageAttachment, type SessionQuote, type SkillInfo, type SubagentInfo } from \"./api.ts\";\nimport { themeWhite, themeGray } from \"./theme.ts\";\nimport { MessageStream } from \"./stream.ts\";\nimport { EpochSnapshot } from \"./snapshot-epoch.ts\";\nimport { AccountUserStream } from \"./account-user-stream.ts\";\nimport { SESSION_CHANGED_EVENT, parseSessionChangedData } from \"./session-events.ts\";\nimport { SubagentActivity } from \"./subagent-streams.ts\";\nimport { messageText, threadBusy } from \"./session-state.ts\";\nimport { transcriptMessageReady } from \"./transcript-delivery.ts\";\nimport { ToolActivityFeed } from \"./bridge.ts\";\nimport { Tui, INPUT_BOX_MARGIN, type PastedImage } from \"./tui.ts\";\nimport {\n SHARED_MESSAGING_EVENT,\n emptySharedMessagingSnapshot,\n isInlineSharedAttachment,\n isSharedAttachmentRef,\n mergeSharedMessagingSnapshot,\n parseMessagingChangedEvent,\n type PendingInput,\n type SharedAttachmentRef,\n type SharedMessageAttachment,\n type SharedMessagingSnapshot,\n} from \"./shared-messaging.ts\";\nimport { loadHistory, appendHistory } from \"./history.ts\";\nimport { renderStreamingMarkdown } from \"./markdown.ts\";\nimport { ProcessRegistry } from \"./process-registry.ts\";\nimport {\n listMcpServers,\n saveMcpServer,\n removeMcpServer,\n setMcpServerEnabled,\n parseServerSpec,\n type McpServerConfig,\n} from \"./mcp-config.ts\";\nimport {\n getCredential,\n saveCredential,\n deleteCredential,\n defaultEndpoint,\n normalizeEndpoint,\n saveDefaultEndpoint,\n} from \"./credentials.ts\";\nimport { LEVELS, levelLabel, type Level, type ThreadSummary } from \"./types.ts\";\nimport type { PermissionState } from \"./permissions.ts\";\nimport { loadApprovals, saveApprovals } from \"./approvals.ts\";\nimport { gradientText, brandCycleColor, truncateMiddle } from \"./render.ts\";\nimport { deviceLogin, openUrl } from \"./device-login.ts\";\nimport { startRecorder, stopRecorder } from \"./recorder.ts\";\nimport {\n AGENT_ID,\n AGENT_ID_VARIANTS,\n AGENT_CHOICES,\n OPENSAMA_AGENT_ID,\n PRODUCTION_ENDPOINT,\n readVersion,\n relaxTlsForLocalEndpoint,\n} from \"./product.ts\";\nimport {\n interactiveClientId,\n loadMachineIdentity,\n type MachineIdentity,\n} from \"./machine.ts\";\nimport {\n daemonOnline,\n loadMachine,\n loadMachines,\n machineDisplayName,\n machineIcon,\n setMachineName,\n setMachineIcon,\n getMachineIcon,\n projectDisplayName,\n projectDisplayLabels,\n setProjectName,\n} from \"./registry.ts\";\nimport {\n registerProject,\n enqueueMachineCommand,\n applyMachineCommand,\n type MachineRecord,\n type MachineCommand,\n} from \"./registry.ts\";\nimport { pickDirectory, localBrowseBackend, remoteBrowseBackend } from \"./dir-picker.ts\";\nimport {\n APPROVAL_REQUEST_KEY,\n parseApprovalRequest,\n writeApprovalResponse,\n} from \"./relay.ts\";\nimport { runDaemonCommand } from \"./daemon-cli.ts\";\nimport { loadPrefs, savePrefs, shouldOfferDaemonInstall } from \"./prefs.ts\";\nimport { runAuthCommand } from \"./auth-cli.ts\";\nimport { serviceStatus } from \"./daemon-service.ts\";\nimport {\n checkForUpdate,\n consumeAppliedUpdate,\n decideAutoUpdate,\n detectPackageManager,\n forceCheckForUpdate,\n readAutoUpdateState,\n runUpdate,\n startBackgroundUpdate,\n updateCommand,\n type UpdateInfo,\n} from \"./check-update.ts\";\n\nconst c = {\n reset: \"\\x1b[0m\",\n dim: \"\\x1b[2m\",\n bold: \"\\x1b[1m\",\n white: themeWhite,\n cyan: \"\\x1b[36m\",\n green: \"\\x1b[32m\",\n gray: themeGray,\n magenta: \"\\x1b[35m\",\n yellow: \"\\x1b[33m\",\n red: \"\\x1b[31m\",\n teal: \"\\x1b[38;5;37m\", // brand teal (matches the marketing site's teal accent)\n};\n\n/**\n * The Standard Agents logomark — two interlocking squares crossed by a diagonal\n * lens — rendered in full block characters. Printed at the left of the startup\n * banner with the session details aligned to its right.\n */\nconst LOGO_MARK = [\n \" █████████████\",\n \" ███ ██\",\n \" ██ █\",\n \"████ ████████ ██\",\n \"███ ████████ ███\",\n \"██ ████████ ████\",\n \"█ ██\",\n \"██ ███\",\n \"█████████████\",\n];\n\ninterface CliArgs {\n endpoint?: string;\n promptEndpoint: boolean;\n dir?: string;\n help: boolean;\n agent?: string;\n /** `--record[=path]`: tee all inbound instance data to a JSONL fixture. */\n record?: string | true;\n}\n\nfunction printUsage(): void {\n output.write(\n [\n \"\",\n `${c.bold}Usage${c.reset}`,\n \" standardcode [options] [dir]\",\n \" With a directory argument (e.g. `standardcode ./`),\",\n \" the session starts right there on this machine —\",\n \" no machine or project questions. Its daemon runs\",\n \" the session; the terminal watches it.\",\n \" standardcode login [--endpoint <url>] [--token <key>]\",\n \" Sign in (or switch accounts — always re-runs the flow).\",\n \" standardcode logout [--endpoint <url>]\",\n \" Sign out of the saved endpoint.\",\n \" standardcode daemon <install|run|status|uninstall>\",\n \" Manage this machine's headless execution daemon.\",\n \"\",\n `${c.bold}Options${c.reset}`,\n \" -v, --version Print the Standard Code version and exit.\",\n \" --record[=path] Record all data received from the instance to a JSONL\",\n \" fixture file (default: ~/.standardagents/recordings/).\",\n \" Secrets are scrubbed at write time.\",\n \" -e, --endpoint [url] Use a different Standard Agents instance for this run\",\n \" (default: https://api.standardcode.ai).\",\n \" If url is omitted, prompt for it.\",\n \" Credentials are remembered for that endpoint, but\",\n \" the saved default endpoint is not changed.\",\n \" --agent <name> Pick the coding agent without the menu:\",\n \" 'unlimited' (Unlimited One, default) or 'sama'\",\n \" (Sama One — requires the ChatGPT connection).\",\n \" -h, --help Show this help.\",\n \"\",\n ].join(\"\\n\")\n );\n}\n\nfunction parseArgs(args: string[]): CliArgs {\n const parsed: CliArgs = { help: false, promptEndpoint: false };\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n if (arg === \"--help\" || arg === \"-h\") {\n parsed.help = true;\n continue;\n }\n if (arg === \"--agent\") {\n const value = args[i + 1];\n if (!value || value.startsWith(\"-\")) throw new Error(\"--agent requires a name (unlimited or sama).\");\n parsed.agent = value;\n i++;\n continue;\n }\n if (arg.startsWith(\"--agent=\")) {\n parsed.agent = arg.slice(\"--agent=\".length);\n if (!parsed.agent) throw new Error(\"--agent requires a name (unlimited or sama).\");\n continue;\n }\n if (arg === \"--record\") {\n parsed.record = true;\n continue;\n }\n if (arg.startsWith(\"--record=\")) {\n const value = arg.slice(\"--record=\".length);\n parsed.record = value || true;\n continue;\n }\n if (arg === \"--endpoint\" || arg === \"-e\") {\n const value = args[i + 1];\n if (value && !value.startsWith(\"-\")) {\n parsed.endpoint = value;\n i++;\n } else {\n parsed.promptEndpoint = true;\n }\n continue;\n }\n if (arg.startsWith(\"--endpoint=\")) {\n const value = arg.slice(\"--endpoint=\".length);\n if (value) {\n parsed.endpoint = value;\n } else {\n parsed.promptEndpoint = true;\n }\n continue;\n }\n if (arg === \"--\") {\n // Some package-manager script invocations pass their separator through to\n // the script (for example `pnpm code -- --endpoint ...`). Treat a leading\n // separator before another option as a wrapper artifact.\n if (i === 0 && args[i + 1]?.startsWith(\"-\")) continue;\n const rest = args.slice(i + 1);\n if (rest.length > 1) throw new Error(\"Expected at most one project directory.\");\n if (rest[0]) parsed.dir = rest[0];\n break;\n }\n if (arg.startsWith(\"-\")) throw new Error(`Unknown option: ${arg}`);\n if (parsed.dir) throw new Error(\"Expected at most one project directory.\");\n parsed.dir = arg;\n }\n return parsed;\n}\n\n/**\n * Print a user `!command` and its output as a distinct block in the transcript:\n * a magenta `!` gutter line with the command, then the combined stdout/stderr\n * (dim for success, red for failure). `where` notes where it ran (the session's\n * machine) so it reads clearly in a remote session.\n */\nfunction printCommandBlock(tui: Tui, command: string, output: string, ok: boolean, where?: string): void {\n tui.print(\"\");\n const note = where ? ` ${c.dim}(ran on ${where})${c.reset}` : \"\";\n tui.print(`${c.magenta}!${c.reset} ${c.bold}${command}${c.reset}${note}`);\n const body = (output ?? \"\").replace(/\\s+$/, \"\");\n if (body) {\n for (const line of body.split(\"\\n\")) {\n tui.print(` ${ok ? c.dim : c.red}${line}${c.reset}`);\n }\n } else {\n tui.print(` ${c.dim}(no output)${c.reset}`);\n }\n tui.print(\"\");\n}\n\n/**\n * Print an assistant reply: light Markdown formatting, padded with a blank line\n * above and below so successive messages don't run together. A small grey dot\n * marks the first line in the gutter — scanning the left edge shows where each\n * new response begins — with the body indented to align under it.\n */\nfunction printAssistant(tui: Tui, text: string): void {\n const cols = Math.max(20, (process.stdout.columns || 80) - 3); // cushion for the 2-col gutter\n tui.clearStream(); // wipe the live preview; the committed message renders below\n tui.print(\"\");\n let dotted = false;\n for (const line of renderStreamingMarkdown(text, cols)) {\n if (!dotted && line.trim()) {\n tui.print(`${c.gray}•${c.reset} ${line}`);\n dotted = true;\n } else {\n tui.print(` ${line}`);\n }\n }\n tui.print(\"\");\n}\n\n/**\n * A single-line animated loading indicator for the pre-TUI phases (verifying\n * credentials, listing sessions, attaching to the thread). Redraws in place on\n * the current line; `stop()` wipes it so the next output starts clean. Safe\n * only while nothing else writes to stdout. Indented to match the boxed HUD's\n * outer margin so the pre-flight stack lines up with the input box.\n */\nfunction startLoader(label: string): { stop: () => void } {\n const frames = [\"⣷\", \"⣯\", \"⣟\", \"⡿\", \"⢿\", \"⣻\", \"⣽\", \"⣾\"];\n const pad = \" \".repeat(INPUT_BOX_MARGIN);\n output.write(\"\\x1b[?25l\"); // hide the cursor while the glyph animates\n const draw = () => {\n const now = Date.now();\n const f = frames[Math.floor(now / 70) % frames.length];\n output.write(`\\r\\x1b[K${pad}${brandCycleColor(now)}${f}${c.reset} ${c.dim}${label}…${c.reset}`);\n };\n draw();\n const timer = setInterval(draw, 70);\n\n return {\n stop: () => {\n clearInterval(timer);\n output.write(\"\\r\\x1b[K\\x1b[?25h\");\n },\n };\n}\n\n/**\n * A calm, branded goodbye printed on a graceful shutdown. `stillRunningOn`\n * names the machine whose daemon keeps working on the session after this\n * terminal closes, so leaving mid-turn never looks like an abandoned run.\n */\nfunction farewell(stillRunningOn?: string): void {\n output.write(\"\\x1b[?25h\"); // re-show the cursor in case a loader had it hidden\n if (stillRunningOn) {\n output.write(\n `\\n${c.cyan}⚙${c.reset} ${c.dim}This session keeps running on ${stillRunningOn} — re-attach any time.${c.reset}\\n`\n );\n }\n output.write(`\\n${c.teal}◇${c.reset} ${c.dim}Standard Code — see you soon.${c.reset}\\n`);\n}\n\n/**\n * Print the startup welcome: the logomark, then the product name, version, the\n * connected instance, and the working directory stacked beneath it — a calm,\n * branded header before the session begins.\n */\nfunction printWelcome(endpoint: string, projectDir: string): void {\n const home = os.homedir();\n const dir = projectDir.startsWith(home) ? \"~\" + projectDir.slice(home.length) : projectDir;\n const host = endpoint.replace(/^https?:\\/\\//, \"\").replace(/\\/$/, \"\");\n const version = readVersion();\n const pad = \" \";\n const markWidth = Math.max(...LOGO_MARK.map((l) => [...l].length));\n // Keep one spare column before the terminal's auto-wrap boundary. The path\n // is the only unbounded metadata row, so preserve its beginning and project\n // directory while eliding the middle when the banner is narrow.\n const terminalColumns = Math.max(20, process.stdout.columns || 80);\n const metaWidth = Math.max(1, terminalColumns - pad.length - markWidth - 3 - 1);\n const displayDir = truncateMiddle(dir, metaWidth);\n // Session details, placed to the right of the mark and vertically centered.\n // The hosted instance is the product's home — naming its host on the splash\n // is just noise, so the endpoint line only appears for non-default instances.\n const meta = [\n `${c.bold}${gradientText(\"Standard Code\")}${c.reset}${version ? ` ${c.dim}v${version}${c.reset}` : \"\"}`,\n `${c.dim}terminal coding agent${c.reset}`,\n ...(endpoint === PRODUCTION_ENDPOINT ? [] : [`${c.teal}${host}${c.reset}`]),\n `${c.dim}${displayDir}${c.reset}`,\n ];\n const metaTop = Math.floor((LOGO_MARK.length - meta.length) / 2);\n output.write(\"\\n\");\n for (let i = 0; i < LOGO_MARK.length; i++) {\n const glyph = LOGO_MARK[i].padEnd(markWidth); // logo stays white-on-black\n const line = meta[i - metaTop];\n output.write(`${pad}${glyph}${line ? ` ${line}` : \"\"}\\n`);\n }\n output.write(\"\\n\");\n}\n\n/**\n * Which machine's daemon runs a session's forwarded tools. Every session has\n * one: heads never execute, so \"local\" means this machine's own daemon, not\n * this process.\n */\ninterface SessionLocation {\n mode: \"local\" | \"remote\";\n /** This machine's identity (always present). */\n identity: MachineIdentity;\n /** This machine's account display name, for banners and `session_info`. */\n localName: string;\n /** Remote mode: the machine record whose daemon runs the tools. */\n runner?: MachineRecord;\n /** Remote mode: the project directory on the runner. */\n remotePath?: string;\n}\n\nasync function main(): Promise<void> {\n // `-v` / `--version` anywhere on the command line prints and exits — before\n // any parsing, endpoint resolution, or auth. The version comes from the\n // installed package.json (with a build-time stamp as fallback), so it is\n // always in lockstep with the release.\n if (process.argv.slice(2).some((arg) => arg === \"-v\" || arg === \"--version\")) {\n output.write(`${readVersion() || \"unknown\"}\\n`);\n return;\n }\n\n // `standardcode daemon …` is its own command surface (install/run/status),\n // dispatched before normal arg parsing — its subcommands would otherwise\n // read as project directories.\n if (process.argv[2] === \"daemon\") {\n await runDaemonCommand(process.argv.slice(3));\n return;\n }\n\n // `standardcode login` / `standardcode logout` — account commands. login\n // always re-runs the flow (that's the account switcher); logout clears the\n // stored credential.\n if (process.argv[2] === \"login\" || process.argv[2] === \"logout\") {\n await runAuthCommand(process.argv[2], process.argv.slice(3));\n return;\n }\n\n let cliArgs: CliArgs;\n try {\n cliArgs = parseArgs(process.argv.slice(2));\n } catch (error) {\n output.write(`${c.red}error:${c.reset} ${error instanceof Error ? error.message : String(error)}\\n`);\n printUsage();\n process.exit(1);\n }\n if (cliArgs.help) {\n printUsage();\n return;\n }\n // Start the fixture recorder before any network activity so the very first\n // REST response lands in the file. The path prints at startup (and the\n // stream flushes on exit) so a session becomes a replayable fixture.\n if (cliArgs.record) {\n const target = startRecorder(typeof cliArgs.record === \"string\" ? cliArgs.record : undefined, {\n version: readVersion() || \"unknown\",\n });\n process.on(\"exit\", () => stopRecorder());\n output.write(`${c.dim}recording session data to ${target}${c.reset}\\n`);\n }\n\n const endpointArg = cliArgs.endpoint;\n const endpointOverride = cliArgs.promptEndpoint || (typeof endpointArg === \"string\" && endpointArg.trim() !== \"\");\n const dirArg = cliArgs.dir;\n // An explicit directory argument (`standardcode ./`, `standardcode ~/x`) is\n // a complete answer to \"where should this session run?\" — local machine,\n // that directory. The location/project questions are skipped entirely.\n const dirArgProvided = Boolean(dirArg && dirArg.trim() !== \"\");\n\n let projectDir = path.resolve(dirArg || process.cwd());\n const machine = os.hostname();\n\n // Create the line reader lazily so it never eagerly consumes stdin (which\n // would swallow a message the user pre-types before the interactive prompt).\n // A `SIGINT` listener implements double-press-to-quit during these pre-flight\n // prompts — without it, ctrl-c rejects `question()` with an AbortError and\n // crashes the process with a stack trace.\n const reader: { rl: readline.Interface | null } = { rl: null };\n let handoffClosing = false; // set when we intentionally close the reader for the TUI handoff\n let preflightArmed = false;\n let preflightTimer: ReturnType<typeof setTimeout> | null = null;\n const onPreflightSigint = () => {\n if (preflightArmed) {\n if (preflightTimer) clearTimeout(preflightTimer);\n reader.rl?.close();\n farewell();\n process.exit(0);\n }\n preflightArmed = true;\n output.write(`\\n${c.dim}Press Control-C again to exit${c.reset}\\n`);\n preflightTimer = setTimeout(() => {\n preflightArmed = false;\n preflightTimer = null;\n }, 2000);\n };\n const ask = async (question: string): Promise<string> => {\n if (!reader.rl) {\n reader.rl = readline.createInterface({ input, output });\n reader.rl.on(\"SIGINT\", onPreflightSigint);\n // EOF (ctrl-d / closed stdin) ends the reader — exit gracefully instead of\n // looping into an ERR_USE_AFTER_CLOSE on the next prompt.\n reader.rl.on(\"close\", () => {\n if (handoffClosing) return; // our own handoff close, not the user leaving\n farewell();\n process.exit(0);\n });\n }\n return reader.rl.question(question);\n };\n const askEndpoint = async (): Promise<string> => {\n for (;;) {\n const answer = (await ask(\n `${c.cyan}Standard Agents instance URL${c.reset} (e.g. http://localhost:5178): `\n )).trim();\n if (answer) return answer;\n output.write(`${c.dim}An endpoint URL is required.${c.reset}\\n`);\n }\n };\n // Cover the cooked-mode gaps too (e.g. while resolving threads before the TUI\n // grabs the keyboard) so a stray ctrl-c there also takes two presses and exits\n // gracefully rather than killing the process. Once the TUI enables raw mode,\n // ctrl-c arrives as a keypress and this never fires.\n process.on(\"SIGINT\", onPreflightSigint);\n\n // 1. Resolve endpoint. Normal users never choose one: the hosted Standard\n // Code instance is the default, and the very first thing they ever see is\n // the splash — not a URL prompt. `--endpoint <url>` overrides for a run;\n // bare `--endpoint` explicitly asks; a previously saved default (set by\n // an explicit endpoint flow) is respected for power users.\n let endpointPrompted = false;\n let endpoint = endpointArg || (cliArgs.promptEndpoint ? \"\" : defaultEndpoint() || PRODUCTION_ENDPOINT);\n if (!endpoint) {\n endpoint = await askEndpoint();\n endpointPrompted = true;\n }\n endpoint = normalizeEndpoint(endpoint);\n\n // Local dev instances (OrbStack, etc.) use a CA Node won't trust by default —\n // relax TLS for loopback/.local/private hosts so the CLI can actually connect.\n const tlsRelaxed = relaxTlsForLocalEndpoint(endpoint);\n\n // Welcome banner — printed once the destination instance is known, before any\n // auth prompt, so the session opens with a calm, branded header.\n printWelcome(endpoint, projectDir);\n if (tlsRelaxed) {\n output.write(`${c.dim} TLS verification relaxed for local endpoint.${c.reset}\\n\\n`);\n }\n\n // 3. Check for available updates (fast, cached — silently skipped if\n // offline). When the CLI is an installed copy, a newer version installs\n // itself in a detached background process — via the SAME package manager\n // that owns the install — and applies on the next launch. A dev checkout,\n // an opted-out env, or a previously failed attempt just shows the hint.\n const version = readVersion();\n let updateAvailable: UpdateInfo | null = null;\n {\n const loading = startLoader(\"Checking for updates\");\n updateAvailable = await checkForUpdate(version);\n loading.stop();\n const applied = consumeAppliedUpdate(version);\n if (applied) {\n output.write(` ${c.green}✓${c.reset} ${c.dim}Standard Code updated to v${version}.${c.reset}\\n\\n`);\n }\n if (updateAvailable) {\n const pm = detectPackageManager();\n const decision = decideAutoUpdate(updateAvailable, { state: readAutoUpdateState(), pm });\n if (decision === \"start\" && pm && startBackgroundUpdate(updateAvailable.latest, pm)) {\n output.write(\n ` ${c.teal}⟳${c.reset} ${c.dim}Standard Code ${c.reset}${c.bold}v${updateAvailable.latest}${c.reset}${c.dim} is installing in the background — it applies on your next launch.${c.reset}\\n\\n`\n );\n } else if (decision === \"in_flight\") {\n output.write(\n ` ${c.teal}⟳${c.reset} ${c.dim}Standard Code v${updateAvailable.latest} is still installing in the background.${c.reset}\\n\\n`\n );\n } else {\n const display = updateCommand(pm ?? \"npm\").display;\n output.write(\n ` ${c.teal}◇${c.reset} ${c.dim}Update available:${c.reset} ${c.dim}v${updateAvailable.current}${c.reset} → ${c.bold}v${updateAvailable.latest}${c.reset}\\n` +\n ` ${c.dim}Run ${c.reset}${c.bold}${display}${c.reset}${c.dim} to update${c.reset}\\n\\n`\n );\n }\n }\n }\n\n // 2. Resolve credentials. Use a stored API token if it still works, otherwise\n // ask for one (create it in your Standard Agents instance settings).\n const stored = getCredential(endpoint);\n let api = stored ? new ApiClient(endpoint, stored.access_token) : null;\n let storedCheck: Awaited<ReturnType<ApiClient[\"verifyDetailed\"]>> | null = null;\n if (api) {\n const connecting = startLoader(\"Connecting to Standard Agents\");\n storedCheck = await api.verifyDetailed();\n connecting.stop();\n }\n if (!api || !storedCheck?.ok) {\n const host = endpoint.replace(/^https?:\\/\\//, \"\").replace(/\\/$/, \"\");\n // Say WHY the saved credentials didn't carry over — a stopped server or a\n // dead network is a very different situation from a revoked key, and the\n // user shouldn't be pasting fresh tokens at a connection problem.\n if (storedCheck && !storedCheck.ok) {\n output.write(`${c.red}✗${c.reset} ${c.dim}Saved sign-in for this endpoint failed:${c.reset} ${storedCheck.reason}\\n`);\n if (storedCheck.hint) output.write(` ${c.dim}${storedCheck.hint}${c.reset}\\n`);\n output.write(\"\\n\");\n }\n const explainFailure = (result: { reason: string; hint?: string }, prefix: string) => {\n output.write(`${c.red}✗${c.reset} ${prefix}${result.reason}\\n`);\n if (result.hint) output.write(` ${c.dim}${result.hint}${c.reset}\\n`);\n };\n output.write(`${c.bold}Sign in to ${gradientText(\"Standard Code\")}${c.reset}\\n`);\n // The hosted instance is the default home; only surface the raw host when\n // the session points somewhere non-standard, so first-run stays clean.\n if (`https://${host}` !== PRODUCTION_ENDPOINT) {\n output.write(`${c.dim}Connecting to${c.reset} ${c.teal}${host}${c.reset}\\n`);\n }\n output.write(\n `${c.dim}You'll only need to do this once on this machine.${c.reset}\\n\\n`\n );\n output.write(\n `${c.white}Press ${c.bold}Enter${c.reset}${c.white} to open your browser and sign in.${c.reset} ${c.dim}(or paste an API token)${c.reset}\\n\\n`\n );\n for (;;) {\n const token = (await ask(`${c.teal}❯${c.reset} `)).trim();\n if (!token) {\n // Device-code browser login: the instance parks a one-time code, the\n // browser approval (on hosted instances, routed through the Standard\n // Agents platform login) mints a personal API key, and we poll it up.\n const got = await deviceLogin(endpoint).catch((e) => {\n output.write(`${c.red}✗${c.reset} ${c.dim}${e instanceof Error ? e.message : String(e)}${c.reset}\\n`);\n return null;\n });\n if (!got) continue;\n api = new ApiClient(endpoint, got);\n const connecting = startLoader(\"Connecting to Standard Agents\");\n const check = await api.verifyDetailed();\n connecting.stop();\n if (check.ok) {\n saveCredential(\n { endpoint, access_token: got, token_type: \"Bearer\", saved_at: Date.now() },\n { updateDefault: !endpointOverride }\n );\n output.write(`${c.green}✓${c.reset} Connected to ${c.teal}${host}${c.reset}\\n`);\n break;\n }\n explainFailure(check, \"Browser sign-in didn't verify: \");\n continue;\n }\n api = new ApiClient(endpoint, token);\n const connecting = startLoader(\"Connecting to Standard Agents\");\n const check = await api.verifyDetailed();\n connecting.stop();\n if (check.ok) {\n saveCredential(\n { endpoint, access_token: token, token_type: \"Bearer\", saved_at: Date.now() },\n { updateDefault: !endpointOverride }\n );\n output.write(`${c.green}✓${c.reset} Connected to ${c.teal}${host}${c.reset}\\n`);\n break;\n }\n explainFailure(check, \"\");\n }\n } else if (endpointPrompted) {\n saveDefaultEndpoint(endpoint);\n }\n\n if (!api) process.exit(1);\n handoffClosing = true;\n reader.rl?.close();\n\n // 3. Decide WHERE this session runs, then offer to resume or start new.\n // This machine's identity + project go into the account-wide machine\n // registry (best effort — older instances lack the user-KV API), and any\n // machine with a live daemon becomes a \"run it there\" target.\n const identity = loadMachineIdentity();\n const accountStream = new AccountUserStream(api, interactiveClientId(identity), {\n clientKind: \"cli\",\n clientName: `${machine} (terminal)`,\n });\n accountStream.start();\n process.once(\"exit\", () => accountStream.close());\n\n const tui = new Tui(1); // auto-accept level 1 by default (asks on anything riskier than a read)\n\n // The agent belongs to the THREAD, so the agent question waits until we\n // know a new thread is actually being created — first we establish what\n // thread this CLI represents (which machine, which project, resume or new).\n // `--agent` pre-answers the question for a new session and narrows the\n // resume list to that agent's threads.\n let agentOverride: string | undefined;\n if (cliArgs.agent) {\n const wanted = cliArgs.agent.toLowerCase();\n if ([\"sama\", \"opensama\", \"sama_one\", OPENSAMA_AGENT_ID].includes(wanted)) {\n agentOverride = OPENSAMA_AGENT_ID;\n } else if ([\"unlimited\", \"standard\", \"unlimited_one\", AGENT_ID].includes(wanted)) {\n agentOverride = AGENT_ID;\n } else {\n output.write(`${c.red}error:${c.reset} Unknown agent \"${cliArgs.agent}\". Use unlimited or sama.\\n`);\n process.exit(1);\n }\n }\n let selectedAgent = agentOverride ?? AGENT_ID;\n\n const loadingMachines = startLoader(\"Checking your machines\");\n const machines = await loadMachines(api).catch(() => [] as MachineRecord[]);\n loadingMachines.stop();\n const remoteTargets = machines.filter((m) => m.id !== identity.machine_id && daemonOnline(m));\n let self = machines.find((m) => m.id === identity.machine_id);\n const session: SessionLocation = {\n mode: \"local\",\n identity,\n localName: self ? machineDisplayName(self) : machine,\n };\n\n // ── the local-daemon gate ─────────────────────────────────────────────────\n // Heads never execute: changes to files on a machine happen only through\n // that machine's daemon. So \"run it on this machine\" is available exactly\n // when this machine's daemon is registered AND online. When it isn't, the\n // one-keypress install (the same flow as `standardcode daemon install`)\n // runs right at that moment; the CLI then re-reads the registry and only\n // proceeds once the daemon reports connected presence.\n let localDaemonOnline = Boolean(self && daemonOnline(self));\n let localOfferAnswered = false; // an install offer already ran this launch\n const ensureLocalDaemon = async (explicit: boolean): Promise<boolean> => {\n if (localDaemonOnline) return true;\n const status = serviceStatus();\n const offer =\n !localOfferAnswered &&\n shouldOfferDaemonInstall({\n platform: process.platform,\n interactive: Boolean(input.isTTY && output.isTTY),\n serviceInstalled: status.installed,\n daemonOnline: localDaemonOnline,\n declinedAt: loadPrefs().daemon_install_declined_at,\n explicit,\n optedOutEnv: Boolean(process.env.STANDARD_CODE_NO_DAEMON_PROMPT),\n });\n if (!offer) {\n if (status.installed) {\n output.write(\n `\\n${c.yellow}⚠${c.reset} This machine's daemon is installed but not connected — it can't run a session yet.\\n` +\n `${c.dim}Check it with \\`standardcode daemon status\\` (log: ~/.standardagents/daemon.log).${c.reset}\\n\\n`\n );\n } else {\n output.write(\n `\\n${c.yellow}⚠${c.reset} This machine has no daemon, so it can't run a session.\\n` +\n `${c.dim}Install it with \\`standardcode daemon install\\`, or run this session on another machine.${c.reset}\\n\\n`\n );\n }\n return false;\n }\n localOfferAnswered = true;\n // The TUI already owns raw stdin, while the reusable daemon installer uses\n // plain readline. Node pauses stdin and disables raw mode whenever one of\n // those readline interfaces closes, so bracket the complete flow and hand\n // terminal ownership back on every path (accept, decline, or failure).\n return tui.withSuspendedInput(async () => {\n output.write(\n `\\n${c.bold}This machine has no always-on daemon${c.reset} ${c.dim}— the daemon is what runs sessions here.${c.reset}\\n`\n );\n const promptRl = readline.createInterface({ input, output });\n let answer = \"\";\n try {\n answer = (await promptRl.question(\n `${c.white}Install it now so this machine can run sessions?${c.reset} ${c.dim}[Y/n]${c.reset} `\n )).trim().toLowerCase();\n } catch {\n answer = \"n\"; // ctrl-c/EOF at the prompt means \"not now\", never a crash\n } finally {\n promptRl.close();\n }\n if (answer !== \"\" && answer !== \"y\" && answer !== \"yes\") {\n savePrefs({ daemon_install_declined_at: Date.now() });\n output.write(\n `${c.dim}Okay — this machine can't run sessions until the daemon is installed.\\n` +\n `Run \\`standardcode daemon install\\` any time, or pick another machine.${c.reset}\\n\\n`\n );\n return false;\n }\n await runDaemonCommand(endpointOverride ? [\"install\", \"--endpoint\", endpoint] : [\"install\"]);\n output.write(\"\\n\");\n // Proof of life comes from the account-wide registry, not the installer:\n // the daemon is usable only once it publishes connected presence.\n self = (await loadMachine(api, identity.machine_id).catch(() => null)) ?? self;\n localDaemonOnline = Boolean(self && daemonOnline(self));\n if (self) session.localName = machineDisplayName(self);\n if (!localDaemonOnline) {\n output.write(\n `${c.dim}The daemon hasn't connected yet — check \\`standardcode daemon status\\`, or pick another machine.${c.reset}\\n\\n`\n );\n }\n return localDaemonOnline;\n });\n };\n const launchDir = projectDir;\n\n // Tags: `path:` + `machine:` name the project+host a session belongs to\n // (they always have), and `runner:` names the MACHINE ID whose client\n // executes the tools — it's what a daemon watches for. Resume matching for\n // local sessions stays on path+machine so pre-runner threads still appear.\n let tags: string[] = [];\n let resumeTags: string[] = [];\n\n // Every new thread — local or remote — is created the same way: it names the\n // runner machine and the project directory, seeds the session context the\n // agent's first step reads, and registers the project. The runner's daemon\n // re-asserts both on attach; this covers the gap until then.\n const createSessionThread = async (): Promise<string> => {\n const id = await api!.createThread(selectedAgent, tags);\n const runnerPath = session.mode === \"remote\" ? session.remotePath ?? \"\" : projectDir;\n const runnerName = session.mode === \"remote\" ? session.runner?.name ?? \"\" : session.localName;\n await api!.kvSet(id, \"session_info\", { cwd: runnerPath, machine: runnerName }).catch(() => {});\n // The machine registry is the source of truth for every head's project\n // list, so a session CREATOR registers the project immediately. Only a\n // machine writes its own record, so a REMOTE runner is registered through\n // its command queue; this machine's own record is written directly, once\n // the session's project is settled (below).\n if (session.mode === \"remote\" && session.runner) {\n void enqueueMachineCommand(api!, session.runner.id, \"add_project\", { path: runnerPath }).catch(() => {});\n }\n const createdAt = Math.floor(Date.now() / 1000);\n await api!.notifySessionsChanged(id, \"created\", {\n id,\n agent_id: selectedAgent,\n tags,\n created_at: createdAt,\n updated_at: createdAt,\n });\n return id;\n };\n\n // ── the onboarding chain: machine → project → thread → agent ──────────────\n // A walkable stack, not a one-way funnel: Escape on any screen goes BACK one\n // screen (skipping screens that aren't present), and only Escape on the\n // first screen exits. Only a NEW session asks which agent to use — a\n // resumed thread already has one.\n let threadId = \"\";\n let resumed = false;\n // For a brand-new session, ↑/↓ recall seeds from the project's newest prior\n // thread (history lives in the thread KV, not on the local filesystem).\n let historySeed: string | undefined;\n let existing: ThreadSummary[] = [];\n let hadResumeMenu = false;\n let where: MachineRecord | null = null;\n\n type Step = \"machine\" | \"project\" | \"thread\" | \"agent\";\n // The launch answers \"where should this session run?\" by itself in two\n // cases: a directory argument (this machine, that directory), and an account\n // with no other online machine to offer. Both mean this machine — so both\n // run the local-daemon gate now, implicitly. When the gate isn't satisfied,\n // the machine screen opens instead, where another machine is still a valid\n // answer and picking this one re-offers the install.\n const locationImplied = dirArgProvided || remoteTargets.length === 0;\n const locationSettled = locationImplied && (await ensureLocalDaemon(false));\n // The machine/project screens exist whenever the launch didn't settle it.\n const locationFlow = !locationSettled;\n if (locationFlow && !(input.isTTY && output.isTTY)) {\n // Without a terminal there is no picker to choose another machine, and\n // without this machine's daemon there is nothing to run the session. Say\n // so and stop, rather than blocking on a menu nobody can answer.\n output.write(\n `${c.red}error:${c.reset} No machine is available to run this session.\\n` +\n `${c.dim}Install this machine's daemon (\\`standardcode daemon install\\`) or run from a terminal to pick another machine.${c.reset}\\n`\n );\n process.exit(1);\n }\n let step: Step = locationFlow ? \"machine\" : \"thread\";\n // True when the machine screen's \"In this directory\" shortcut was taken —\n // esc from later screens then returns to the machine screen, never to a\n // project screen the user was never shown.\n let pickedHere = false;\n\n flow: for (;;) {\n if (step === \"machine\") {\n // Two lines per machine (name, then host facts) — the project directory\n // isn't relevant yet; the project question comes after the machine.\n // \"In this directory\" is the zero-question fast path: local machine,\n // launch directory, straight to the session list.\n pickedHere = false;\n // Every row names a machine whose daemon would run the session. This\n // machine's rows say whether its daemon can — picking them without one\n // opens the install offer instead of starting a session that can't run.\n const localDetail = localDaemonOnline\n ? \"daemon online\"\n : serviceStatus().installed\n ? \"daemon installed · offline\"\n : \"no daemon yet · set it up to run here\";\n const picked = await tui.select<MachineRecord | null | \"here\">(\n `${c.bold}Where should this session run?${c.reset} ${c.dim}↑↓ · enter · esc${c.reset}`,\n [\n {\n label: `In this directory, on this machine`,\n detail: `${shortenPath(launchDir)} · ${localDetail}`,\n value: \"here\",\n },\n {\n label: `This machine — ${session.localName}`,\n detail: `${localDetail} · choose a project`,\n value: null,\n },\n ...remoteTargets.map((m) => ({\n label: machineDisplayName(m),\n detail: `${m.hostname} · daemon online${m.daemon ? ` · v${m.daemon.version}` : \"\"}`,\n value: m,\n })),\n ],\n { spaced: true }\n );\n if (picked === undefined) process.exit(0); // first screen — esc exits\n if (picked === \"here\" || picked === null) {\n if (!(await ensureLocalDaemon(true))) continue; // stay on the machine screen\n session.mode = \"local\";\n session.runner = undefined;\n session.remotePath = undefined;\n projectDir = launchDir;\n where = null;\n if (picked === \"here\") {\n pickedHere = true;\n step = \"thread\";\n } else {\n step = \"project\";\n }\n continue;\n }\n where = picked;\n step = \"project\";\n } else if (step === \"project\") {\n // (Re)entering the project step resets the location so backing out of a\n // remote pick can't leave half-set remote state behind.\n session.mode = \"local\";\n session.runner = undefined;\n session.remotePath = undefined;\n projectDir = launchDir;\n if (where) {\n const remotePath = await pickRemoteProject(tui, api, accountStream, where);\n if (!remotePath) {\n step = \"machine\"; // esc — back one screen\n continue;\n }\n session.mode = \"remote\";\n session.runner = where;\n session.remotePath = remotePath;\n } else {\n // \"This machine\" gets the SAME project question as a remote runner —\n // this machine's registered projects (launch directory first and\n // preselected, so Enter keeps the old behavior) or the file browser.\n const localPath = await pickLocalProject(tui, api, self, launchDir, machine);\n if (localPath === null) {\n step = \"machine\"; // esc — back one screen\n continue;\n }\n if (localPath !== launchDir) projectDir = localPath;\n }\n step = \"thread\";\n } else if (step === \"thread\") {\n if (session.mode === \"remote\" && session.runner && session.remotePath) {\n tags = [\n `path:${session.remotePath}`,\n `machine:${session.runner.hostname || session.runner.name}`,\n `runner:${session.runner.id}`,\n ];\n resumeTags = [`path:${session.remotePath}`, `runner:${session.runner.id}`];\n } else {\n tags = [`path:${projectDir}`, `machine:${machine}`, `runner:${identity.machine_id}`];\n resumeTags = [`path:${projectDir}`, `machine:${machine}`];\n }\n\n const loadingSessions = startLoader(\"Loading sessions\");\n try {\n // Every agent's sessions for this project belong in the resume list —\n // the agent is a property of the thread, not of this CLI process.\n // Unlimited One sessions park across the gear variants; Sama One\n // threads live under their own agent id. `--agent` narrows the list.\n const listIds = agentOverride\n ? agentOverride === OPENSAMA_AGENT_ID\n ? [OPENSAMA_AGENT_ID]\n : AGENT_ID_VARIANTS\n : [...AGENT_ID_VARIANTS, OPENSAMA_AGENT_ID];\n existing = await api.listThreads(listIds, resumeTags);\n // Pages come back per agent id — merge to one newest-first list.\n existing.sort((a, b) => (b.created_at ?? 0) - (a.created_at ?? 0));\n } catch {\n existing = [];\n }\n const summaries = existing.length > 0 ? await summarizeThreads(api, existing.slice(0, 8)) : [];\n loadingSessions.stop();\n\n if (existing.length === 0) {\n hadResumeMenu = false;\n step = \"agent\";\n continue;\n }\n hadResumeMenu = true;\n const home = os.homedir();\n const tildeDir = projectDir.startsWith(home) ? \"~\" + projectDir.slice(home.length) : projectDir;\n const shortDir = tildeDir.length > 38 ? \"…\" + tildeDir.slice(-37) : tildeDir;\n const items: { label: string; hint?: string; value: string | null }[] = summaries.map((s) => ({\n label: s.label,\n hint: s.hint,\n value: s.id,\n }));\n items.push({ label: \"+ Start a new session\", value: null });\n const whereLabel =\n session.mode === \"remote\" && session.runner\n ? `${session.runner.name}:${shortenPath(session.remotePath ?? \"\")}`\n : shortDir;\n const picked = await tui.select(\n `${c.bold}Resume a session${c.reset} ${c.gray}${whereLabel}${c.reset} ${c.dim}↑↓ · enter · esc${c.reset}`,\n items\n );\n if (picked === undefined) {\n // esc — back one screen (project, when the machine flow exists; the\n // \"in this directory\" shortcut skipped project, so back = machine).\n if (locationFlow) {\n step = pickedHere ? \"machine\" : \"project\";\n continue;\n }\n process.exit(0); // this WAS the first screen\n }\n if (typeof picked === \"string\") {\n threadId = picked;\n resumed = true;\n // The resumed thread's agent becomes the session's agent (so `/clear`\n // stays on it); a resumed Sama One thread still needs the account's\n // ChatGPT authorization before it can take a turn.\n const threadAgent = existing.find((t) => t.id === picked)?.agent_id;\n selectedAgent = threadAgent === OPENSAMA_AGENT_ID ? OPENSAMA_AGENT_ID : AGENT_ID;\n if (selectedAgent === OPENSAMA_AGENT_ID) {\n const ok = await ensureSamaAuth(tui, api, accountStream);\n if (!ok) continue; // declined — back to the session list\n }\n break flow;\n }\n historySeed = existing[0]?.id;\n step = \"agent\";\n } else {\n // step === \"agent\" — the roster is shared across every head; disabled\n // entries (Frontier One, Dario) are shown but not selectable. `--agent`\n // skips the menu. Sama One is BYOK: it requires the account's ChatGPT\n // authorization (secret env metadata only — the key value never reaches\n // this client).\n if (!agentOverride) {\n const picked = await tui.select<string>(\n `${c.bold}Which agent?${c.reset} ${c.dim}↑↓ · enter · esc${c.reset}`,\n AGENT_CHOICES.map((choice) => ({\n label: choice.title,\n hint: choice.description,\n value: choice.id,\n disabled: choice.disabled,\n }))\n );\n if (!picked) {\n // esc — back one screen: the session list if it existed, else the\n // project screen (or the machine screen when the \"in this\n // directory\" shortcut skipped project), else exit (first screen).\n if (hadResumeMenu) {\n step = \"thread\";\n continue;\n }\n if (locationFlow) {\n step = pickedHere ? \"machine\" : \"project\";\n continue;\n }\n process.exit(0);\n }\n selectedAgent = picked;\n }\n if (selectedAgent === OPENSAMA_AGENT_ID) {\n const ok = await ensureSamaAuth(tui, api, accountStream);\n if (!ok) {\n if (agentOverride) process.exit(0); // --agent sama with no auth — nothing to go back to\n continue; // declined — back to the agent menu\n }\n }\n threadId = await createSessionThread();\n break flow;\n }\n }\n\n // The session's project is settled — put it in THIS machine's registry\n // record (the one project list every head reads) when its daemon is the\n // runner. A remote runner's record is written by its own daemon, from the\n // `add_project` command queued at thread creation.\n if (session.mode === \"local\") void registerProject(api, identity, projectDir).catch(() => {});\n\n // `/clear` resolves the session with a request for a fresh thread; loop so\n // the new session reuses the same TUI, credentials, and project tags. The\n // old thread seeds ↑/↓ recall so input history survives the clear.\n for (;;) {\n const agentTitle = AGENT_CHOICES.find((a) => a.id === selectedAgent)?.title ?? selectedAgent;\n await runInteractive(\n tui,\n api,\n accountStream,\n threadId,\n projectDir,\n machine,\n resumed,\n session,\n agentTitle,\n historySeed\n );\n historySeed = threadId;\n threadId = await createSessionThread();\n // Tell the fresh thread which thread it replaced so the instance releases\n // that thread's simultaneous-thread slot on the new thread's first step\n // (rather than the slot lingering for its ~90s lease TTL after `/clear`).\n await api.kvSet(threadId, \"lease_supersedes\", historySeed);\n resumed = false;\n }\n}\n\n/** Shorten an absolute path for menu labels (keep the tail). */\nfunction shortenPath(p: string, max = 38): string {\n return p.length > max ? \"…\" + p.slice(-(max - 1)) : p;\n}\n\n/**\n * The Sama One auth gate — the terminal's version of the heads' modal. If the\n * account already carries the ChatGPT authorization, this is a no-op. If not:\n * explain, offer a big Continue that opens the web auth flow\n * (`standardcode.ai/app?connect=sama` auto-starts the official ChatGPT device\n * flow there), and wait for the account event that says authorization landed.\n * It is account data, so the web console, macOS app, and this CLI all unlock\n * together. The waiting CLI consumes that event on its already-open user\n * stream and performs one status reconciliation on subscribe/reconnect.\n * Returns whether Sama One is usable.\n */\nasync function ensureSamaAuth(\n tui: Tui,\n api: ApiClient,\n accountStream: AccountUserStream,\n): Promise<boolean> {\n const checking = startLoader(\"Checking your ChatGPT connection\");\n const already = await api.openSamaStatus().catch(() => false);\n checking.stop();\n if (already) return true;\n\n const picked = await tui.select<string>(\n `${c.bold}Authenticate with ChatGPT${c.reset} ${c.dim}Sama One runs on OpenAI using your own ChatGPT Pro account${c.reset}`,\n [\n {\n label: \"Continue with ChatGPT\",\n hint: \"connect once — unlocks your whole account\",\n value: \"continue\",\n },\n { label: \"Not now\", hint: \"go back\", value: \"cancel\" },\n ]\n );\n if (picked !== \"continue\") return false;\n\n openUrl(\"https://standardcode.ai/app?connect=sama\");\n tui.print(\n `${c.dim}Finish connecting ChatGPT in the browser — waiting here for the authorization to land on your account…${c.reset}`\n );\n const waiting = startLoader(\"Waiting for your ChatGPT authorization\");\n const connected = await waitForSamaAuthorization(api, accountStream, 5 * 60 * 1000);\n waiting.stop();\n if (connected) {\n tui.print(\n `${c.green}✓${c.reset} ChatGPT connected — Sama One is now unlocked on your account (terminal, web, and macOS app).`\n );\n return true;\n }\n tui.print(\n `${c.yellow}Still not connected.${c.reset} Finish the flow at ${c.teal}standardcode.ai/app${c.reset} and pick Sama One again.`\n );\n return false;\n}\n\n/** Wait on the one account WebSocket. A single status read after subscribing\n * closes the event/subscription race; a real socket reconnect repeats that\n * one reconciliation read because user events are live-only. */\nfunction waitForSamaAuthorization(\n api: ApiClient,\n accountStream: AccountUserStream,\n timeoutMs: number,\n): Promise<boolean> {\n return new Promise((resolve) => {\n let settled = false;\n let checking = false;\n let stopEvent = () => {};\n let stopConnection = () => {};\n let timer: ReturnType<typeof setTimeout>;\n const finish = (connected: boolean) => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n stopEvent();\n stopConnection();\n resolve(connected);\n };\n timer = setTimeout(() => finish(false), timeoutMs);\n const reconcile = async () => {\n if (settled || checking) return;\n checking = true;\n const connected = await api.openSamaStatus().catch(() => false);\n checking = false;\n if (connected) finish(true);\n };\n stopEvent = accountStream.onEvent((event, data) => {\n if (event !== \"standardcode.opensama_changed\") return;\n if ((data as { connected?: unknown } | null)?.connected === true) finish(true);\n });\n stopConnection = accountStream.onConnection((state) => {\n if (state === \"connected\") void reconcile();\n });\n void reconcile();\n });\n}\n\n/**\n * /agent — hand this SESSION to a different agent mid-thread. The runtime\n * supports re-pointing a thread's root agent (`PATCH /api/threads/:id\n * { agent_id }`): the entire conversation is preserved and the next turn\n * plays on the new agent — the same handoff mechanic the gearbox uses, made\n * user-explicit. Sama One is gated on the account's ChatGPT authorization.\n */\nasync function runAgentSwitchMenu(\n tui: Tui,\n api: ApiClient,\n accountStream: AccountUserStream,\n threadId: string,\n): Promise<void> {\n const picked = await tui.select<string>(\n `${c.bold}Switch agent${c.reset} ${c.dim}takes effect on the next message${c.reset}`,\n AGENT_CHOICES.map((choice) => ({\n label: choice.title,\n hint: choice.description,\n value: choice.id,\n disabled: choice.disabled,\n }))\n );\n if (!picked) return;\n if (picked === OPENSAMA_AGENT_ID) {\n const ok = await ensureSamaAuth(tui, api, accountStream);\n if (!ok) return;\n }\n const title = AGENT_CHOICES.find((choice) => choice.id === picked)?.title ?? picked;\n try {\n await api.setThreadAgent(threadId, picked);\n await api.notifySessionsChanged(threadId, \"updated\", { id: threadId, agent_id: picked });\n tui.setAgentLabel(title);\n tui.print(`${c.green}✓${c.reset} Session handed to ${c.bold}${title}${c.reset} — applies from your next message.`);\n } catch (e) {\n tui.print(\n `${c.red}✗ couldn't switch agent:${c.reset} ${c.gray}${e instanceof Error ? e.message : String(e)}${c.reset}`\n );\n }\n}\n\n/**\n * Pick which project on THIS machine the session works in — the local twin of\n * {@link pickRemoteProject}, shown after choosing \"This machine\" so the flow\n * is machine → project → thread everywhere. The launch directory leads and is\n * preselected (Enter = old behavior); the rest is the machine's registered\n * project list, plus the \"New project\" file browser. Returns null to keep the\n * launch directory.\n */\nasync function pickLocalProject(\n tui: Tui,\n api: ApiClient,\n self: MachineRecord | undefined,\n cwd: string,\n machineName: string\n): Promise<string | null> {\n const NEW = \"__new__\";\n const label = self ? machineDisplayName(self) : machineName;\n const others = Object.entries(self?.projects ?? {})\n .filter(([dir]) => dir !== cwd)\n .sort((a, b) => (b[1]?.last_used_at ?? 0) - (a[1]?.last_used_at ?? 0));\n // Same-named projects (a worktree copy next to the root checkout) get\n // parent-qualified labels so the list never shows two identical names.\n const labels = projectDisplayLabels({ ...(self?.projects ?? {}), [cwd]: self?.projects?.[cwd] });\n const items: { label: string; hint?: string; detail?: string; value: string }[] = [\n {\n label: labels.get(cwd) ?? projectDisplayName(cwd, self?.projects?.[cwd]),\n hint: \"current directory\",\n detail: shortenPath(cwd, 60),\n value: cwd,\n },\n ...others.map(([dir, p]) => ({\n label: labels.get(dir) ?? projectDisplayName(dir, p),\n hint: p?.last_used_at ? relativeTime(p.last_used_at / 1000) : \"\",\n detail: shortenPath(dir, 60),\n value: dir,\n })),\n { label: \"+ New project\", hint: \"browse or create a directory\", value: NEW },\n ];\n const picked = await tui.select(\n `${c.bold}Project on ${label}${c.reset} ${c.dim}↑↓ · enter · esc${c.reset}`,\n items,\n { spaced: true }\n );\n if (!picked) return null;\n if (picked !== NEW) return picked;\n return await pickDirectory(tui, localBrowseBackend(label), { startPath: cwd, loader: startLoader });\n}\n\n/**\n * Pick which project on a remote machine the session works in: the machine's\n * registered projects (most recently used first), or a typed-in path. Returns\n * null when the user backs out (the session falls back to local).\n */\nasync function pickRemoteProject(\n tui: Tui,\n api: ApiClient,\n accountStream: AccountUserStream,\n runner: MachineRecord\n): Promise<string | null> {\n const ENTER_PATH = \"__enter_path__\";\n const projects = Object.entries(runner.projects).sort(\n (a, b) => (b[1]?.last_used_at ?? 0) - (a[1]?.last_used_at ?? 0)\n );\n // Lead with the project's NAME (directory basename, or the user's account\n // rename); the path is context on the dim second line. Colliding names get\n // parent-qualified labels.\n const labels = projectDisplayLabels(runner.projects);\n const items: { label: string; hint?: string; detail?: string; value: string }[] = projects.map(\n ([dir, p]) => ({\n label: labels.get(dir) ?? projectDisplayName(dir, p),\n hint: p?.last_used_at ? relativeTime(p.last_used_at / 1000) : \"\",\n detail: shortenPath(dir, 60),\n value: dir,\n })\n );\n items.push({ label: \"+ New project\", hint: \"browse or create a directory\", value: ENTER_PATH });\n const picked = await tui.select(\n `${c.bold}Project on ${runner.name}${c.reset} ${c.dim}↑↓ · enter · esc${c.reset}`,\n items,\n { spaced: true }\n );\n if (!picked) return null;\n if (picked !== ENTER_PATH) return picked;\n // Browse the runner's filesystem through its daemon (the same fs-browse RPC\n // the desktop heads use): navigate, see what's there, create folders. The\n // returned path is already the runner's canonical absolute path.\n return await pickDirectory(tui, remoteBrowseBackend(api, accountStream, runner.id, runner.name), {\n loader: startLoader,\n });\n}\n\n/**\n * A message is \"silent\" when it's a system-injected user turn (subagent result\n * hand-backs, malformed-tool-call replays, queued housekeeping) rather than\n * something the human actually typed — so it must never name a session.\n */\nfunction isSilentMessage(m: any): boolean {\n return m?.silent === true || m?.metadata?.silent === true;\n}\n\n/**\n * Build a one-line preview + timestamp for each thread, naming the session by\n * the LAST thing the human actually said. We read content via `messageText`\n * (user messages can be content-block arrays, not just strings — the old\n * string-only check made every such session render \"(empty session)\"), skip\n * silent/system-injected turns, and take the most recent one.\n */\nasync function summarizeThreads(\n api: ApiClient,\n threads: ThreadSummary[]\n): Promise<{ id: string; label: string; hint: string }[]> {\n return Promise.all(\n threads.map(async (t) => {\n let preview = \"\";\n try {\n // Newest-first so the most recent human message is in-window even for\n // long sessions; we also sort ourselves in case the server ignores it.\n const msgs = await api.getMessages(t.id, 50, \"desc\");\n const latest = msgs\n .filter((m: any) => m.role === \"user\" && m.status !== \"pending\" && !isSilentMessage(m))\n .map((m: any) => ({ at: m.created_at ?? 0, text: messageText(m.content).replace(/\\s+/g, \" \").trim() }))\n .filter((m) => m.text.length > 0)\n .sort((a, b) => b.at - a.at)[0];\n if (latest) preview = latest.text;\n } catch {\n // ignore; show a placeholder\n }\n const label = preview\n ? preview.length > 64\n ? preview.slice(0, 63) + \"…\"\n : preview\n : \"(empty session)\";\n const when = t.created_at ? relativeTime(t.created_at) : \"\";\n // The list now mixes agents; call out non-default ones (Unlimited One\n // gear variants stay unlabeled — they're the default family).\n const agentTag =\n t.agent_id === OPENSAMA_AGENT_ID\n ? AGENT_CHOICES.find((a) => a.id === OPENSAMA_AGENT_ID)?.title ?? \"Sama One\"\n : \"\";\n const hint = [t.id.slice(0, 8), when, agentTag].filter(Boolean).join(\" · \");\n return { id: t.id, label, hint };\n })\n );\n}\n\n/**\n * A human-readable label for a subagent: prefer its registry title (e.g.\n * \"Research Assistant\"), else the agent's display title, else a title-cased\n * agent name. A per-instance thread name refines it (\"Research Assistant ·\n * auth-flow\") when present.\n */\nfunction subagentLabel(s: SubagentInfo, titles: Map<string, string>): string {\n const agentName = (s.agent_name || \"\").trim();\n const title =\n (s.title || \"\").trim() ||\n titles.get(agentName) ||\n (agentName ? agentName.replace(/[_-]+/g, \" \").replace(/\\b\\w/g, (c) => c.toUpperCase()) : \"Subagent\");\n const tagged = (s.threadName || \"\").trim();\n return tagged ? `${title} · ${tagged}` : title;\n}\n\n/**\n * Colour a tool-activity line for readable contrast: a bright status glyph\n * (green ✓, red ✗, yellow ⛔) with the action text at full contrast and only the\n * trailing parenthetical detail dimmed.\n */\nfunction colorActivity(line: string): string {\n const m = line.match(/^(\\s*)([✓✗⛔])\\s?([\\s\\S]*)$/);\n if (!m) return `${c.dim}${line}${c.reset}`;\n const [, indent, glyph, rest] = m;\n if (glyph === \"✓\") {\n const body = rest.replace(/\\s(\\([^()]*\\))\\s*$/, ` ${c.dim}$1${c.reset}`);\n return `${indent}${c.green}✓${c.reset} ${body}`;\n }\n if (glyph === \"✗\") {\n // Error output (e.g. a failed command's stderr) rides along in `rest` and can\n // run dozens of lines. Show it in red and cap it at a handful of lines so the\n // transcript stays scannable — the model still receives the full untruncated\n // result, this only trims what the human sees.\n const ERR_MAX_LINES = 7;\n const lines = rest.split(\"\\n\");\n const shown = lines.slice(0, ERR_MAX_LINES);\n const hidden = lines.length - shown.length;\n const body = shown\n .map((l, i) =>\n i === 0\n ? `${indent}${c.red}✗ ${l}${c.reset}`\n : `${indent}${c.red}${c.dim}${l}${c.reset}`\n )\n .join(\"\\n\");\n if (hidden > 0) {\n return `${body}\\n${indent}${c.dim}… +${hidden} more line${hidden === 1 ? \"\" : \"s\"}${c.reset}`;\n }\n return body;\n }\n return `${indent}${c.yellow}⛔ ${rest}${c.reset}`;\n}\n\n/** Compact relative time from a unix-seconds timestamp. */\nfunction relativeTime(unixSeconds: number): string {\n const diff = Date.now() / 1000 - unixSeconds;\n if (diff < 60) return \"just now\";\n if (diff < 3600) return `${Math.floor(diff / 60)}m ago`;\n if (diff < 86400) return `${Math.floor(diff / 3600)}h ago`;\n return `${Math.floor(diff / 86400)}d ago`;\n}\n\n/** Replay a resumed thread's conversation so it feels like picking up mid-session. */\nasync function printHistory(api: ApiClient, threadId: string, tui: Tui): Promise<void> {\n let msgs: any[];\n try {\n msgs = await api.getMessages(threadId, 200);\n } catch {\n return;\n }\n const convo = msgs\n .filter(\n (m) =>\n m.metadata?.user_command ||\n m.role === \"user\" ||\n (m.role === \"assistant\" && messageText(m.content).trim())\n )\n .sort((a, b) => (a.created_at ?? 0) - (b.created_at ?? 0));\n if (!convo.length) return;\n const shown = convo.slice(-24);\n tui.print(`${c.dim}── resuming session · ${convo.length} message${convo.length === 1 ? \"\" : \"s\"} ──${c.reset}`);\n if (shown.length < convo.length) tui.print(`${c.dim} … earlier messages omitted${c.reset}`);\n for (const m of shown) {\n if (m.metadata?.user_command) {\n printCommandBlock(\n tui,\n String(m.metadata.command ?? \"\"),\n String(m.metadata.output ?? messageText(m.content)),\n m.metadata.ok !== false\n );\n continue;\n }\n const text = messageText(m.content).trim();\n if (!text) continue;\n if (m.role === \"user\") tui.printUserMessage(text);\n else printAssistant(tui, text);\n }\n}\n\nasync function runInteractive(\n tui: Tui,\n api: ApiClient,\n accountStream: AccountUserStream,\n threadId: string,\n projectDir: string,\n machine: string,\n resumed: boolean,\n session: SessionLocation,\n agentTitle: string,\n historySeedThreadId?: string\n): Promise<void> {\n // The interactive CLI is a WATCHER, always. Forwarded tools execute in\n // exactly one place — the daemon on the session's runner machine — whether\n // that machine is this one or a VPS. This process streams the conversation,\n // sends messages, steers, stops, and answers relayed approval requests. It\n // holds no bridge, no host executors, and no MCP host.\n const remote = session.mode === \"remote\";\n const runnerName = remote ? session.runner?.name ?? \"the remote machine\" : session.localName;\n // Background-process metadata lives in the thread's KV (server-side), so a\n // watcher can list what the daemon spawned — this is a thin KV client, not\n // local process state.\n const registry = new ProcessRegistry(api, threadId, machine);\n const refreshBgCount = () => {\n void registry.runningCount().then((n) => tui.setBackgroundCount(n)).catch(() => {});\n };\n // The permission SETTINGS this session runs under. The engine that applies\n // them lives with the executor (the daemon re-reads `approvals` from the\n // thread KV before every decision); this client only edits and persists\n // them, and answers the requests the daemon relays.\n const perm: PermissionState = { level: tui.level, alwaysAllow: new Set(), allowRisk: new Set() };\n\n // Restore this session's saved approvals (auto-accept level + pre-approved\n // tools and risk levels) from the thread KV, so they resume with the session.\n const savedApprovals = await loadApprovals(api, threadId);\n for (const t of savedApprovals.allowTools) perm.alwaysAllow.add(t);\n for (const r of savedApprovals.allowRisk) perm.allowRisk.add(r);\n if (savedApprovals.level) {\n perm.level = savedApprovals.level;\n tui.setLevel(savedApprovals.level);\n }\n tui.onLevelChange((l: Level) => {\n perm.level = l;\n saveApprovals(api, threadId, perm);\n });\n // Persist the effective permission setting now (not just on change) so the\n // backend evaluates the SAME level/approvals when deciding whether a forwarded\n // tool needs approval — otherwise it parks calls the CLI would auto-accept.\n saveApprovals(api, threadId, perm);\n // `session_info` (the agent's \"where does my shell live\" ground truth) is\n // the executing daemon's to write — it is the machine that owns that cwd.\n // The thread's creator seeds it; a watcher never overwrites it.\n\n // Everything from here to the banner is session wiring (history load, the\n // stream/events sockets) — show one loader for the whole stretch.\n // Started after the approvals restore above so its possible level-change\n // print can't collide with the redrawn loader line.\n const attaching = startLoader(\"Attaching to thread\");\n\n // ── state ────────────────────────────────────────────────────────────────\n let busy = false; // is the agent currently working\n // When THIS client just sent a message, hold the Working state optimistically\n // until the server snapshot confirms it — otherwise the spinner waits a full\n // round trip and the delay is obvious. Cleared the moment the server agrees\n // (or the send fails).\n let optimisticBusyUntil = 0;\n let sharedMessaging = emptySharedMessagingSnapshot();\n let mirroredDraftRefs: SharedAttachmentRef[] = [];\n let sharedMessagingReady = false;\n let sharedMessagingUnavailableShown = false;\n const messagingOrigin = {\n originClientId: `tui:${Math.random().toString(36).slice(2, 10)}`,\n originClientKind: \"tui\" as const,\n };\n let editingPendingId: string | null = null;\n let reconcileSharedMessaging: (mirrorDraft?: boolean) => Promise<void> = async () => {};\n let applySharedMessagingEvent: (data: unknown) => boolean = () => false;\n // Debounced event-driven wake for the projection read — the ONLY way it\n // re-runs after startup. No intervals: stream events (message records,\n // generation heartbeats, tool lifecycle) are the wake sources, so an idle\n // attached terminal makes zero recurring thread requests and the DO sleeps.\n let scheduleProjectionRefresh: () => void = () => {};\n // The message socket's connection epoch, mirrored from `onOpen` (0 until the\n // first open). Both durable reads below are gated on it: session startup\n // reads eagerly and the socket's first open ALSO reconciles, so without the\n // epoch the two overlap on a fast connect and diverge on a slow one. See\n // SC-02 in the workspace Cloudflare cost catalog.\n let connectionEpoch = 0;\n // Reconciliation for a connection may only be satisfied by a read that\n // STARTED inside that connection's epoch. So the eager startup read collapses\n // into the first open's read when it began after the socket opened, while a\n // read begun before any socket opened (a slow connect) never counts, and\n // every reconnect still performs its own authoritative read.\n // The projection reader is not defined until reconcileProjection is built\n // below. Construct its epoch gate at that point: a fast socket open before\n // then is recovered by the final reconcile, instead of settling the epoch\n // against this placeholder function without reading durable state.\n let projectionSnapshot: EpochSnapshot | null = null;\n const sharedMessagingSnapshot = new EpochSnapshot(\n () => reconcileSharedMessaging(true),\n () => connectionEpoch\n );\n const shownIds = new Set<string>(); // message ids already printed to the transcript\n // The transcript's tool-activity lines, reconstructed from the projection's\n // message records (the daemon executes elsewhere; this terminal watches).\n // The feed itself remembers which calls it already printed.\n const toolActivity = new ToolActivityFeed();\n // User messages the CLI optimistically displayed on send, keyed by content,\n // so reconciliation does not reprint them. Messages submitted from another\n // client still render normally.\n const pendingSent = new Map<string, number>();\n // The last message we sent — resent verbatim to continue after an at-limit\n // upgrade (the blocked turn never reached the model).\n let lastSent: { text: string; images: PastedImage[]; refs: SharedAttachmentRef[] } | null = null;\n let upgradeInFlight = false;\n\n // ── token feed ──────────────────────────────────────────────────────────\n let liveOut = 0; // output tokens for the in-progress response (from `generation` events)\n\n // ── step indicator (what the agent is doing right now) ────────────────────\n // The label comes from the server stream's tool_call_started/done events — it\n // shows what the agent is doing, which is especially valuable for a long tool.\n // That signal is best-effort though (a reconnect can drop an event), so the\n // The event-triggered `session_state` reconciliation fills in a `started`\n // event the stream missed and clears a `done` event it dropped, so the label\n // can't strand on a tool that already finished.\n // Most recently started active tool wins; cleared when the turn goes idle.\n const activeSteps = new Map<string, string>(); // tool call id -> label\n\n // Push the current step to the prompt. Its output is the live count.\n const refreshStatus = () => {\n let label: string | null = null;\n for (const v of activeSteps.values()) label = v; // last (most recent) entry\n tui.setStep(label, liveOut);\n };\n\n // The message stream drives two live signals (the transcript itself is\n // reconciled at durable message boundaries):\n // - `generation` events → the live output-token count (moves during ALL\n // generation, including big tool arguments like file content).\n // - `tool_call_started` / `tool_call_done` → the current step label.\n const stream = new MessageStream(api, threadId, {\n onOpen: (epoch) => {\n // Events are hints, not durable state. Every initial connection and\n // reconnect re-fetches the canonical queue + draft snapshot — from a read\n // that started inside THIS epoch, so a snapshot taken before the socket\n // opened can never stand in for it.\n connectionEpoch = epoch;\n void sharedMessagingSnapshot.reconcile(epoch);\n void projectionSnapshot?.reconcile(epoch);\n },\n // Live streaming preview: answer text and (opt-in) internal reasoning feed\n // the TUI's ephemeral preview; the committed message still renders from\n // the durable boundary event, which clears the preview before printing so\n // there's no double-render.\n onChunk: (text, mid) => tui.streamResponseDelta(text, mid),\n onReasoningChunk: (text, mid) => tui.streamThinkingDelta(text, mid),\n onAssistantText: () => {},\n onMessage: (message) => {\n // A turn started from another client must refresh the durable projection\n // even before its first model/tool delta arrives.\n if (message?.role === \"user\" || message?.status === \"pending\") {\n busy = true;\n tui.setWorking(true);\n }\n // Every durable record is a projection wake: committed prose renders\n // from the projection read, so the record's arrival IS the signal.\n scheduleProjectionRefresh();\n },\n onEvent: (eventType, data) => {\n if (eventType === \"generation\" && typeof data?.outputTokens === \"number\") {\n liveOut = data.outputTokens;\n refreshStatus();\n } else if (eventType === \"tool_call_started\" && data?.id) {\n activeSteps.set(data.id, data.progress || data.name || \"working\");\n refreshStatus();\n } else if (eventType === \"tool_call_done\" && data?.id) {\n activeSteps.delete(data.id);\n refreshStatus();\n } else if (eventType === \"goal_updated\" && data) {\n tui.setGoal(data);\n } else if (eventType === \"standardcode.approval_changed\") {\n // The packed approval route's thread event: a parked request (render\n // the prompt now) or another watcher's answer/clear (the open prompt\n // resolves via the relay read).\n void relayApprovals().catch(() => {});\n } else if (eventType === SHARED_MESSAGING_EVENT) {\n // Fast path: an event-carried draft applies with zero refetch; anything\n // it can't settle falls back to the authoritative snapshot read.\n // A read already in flight may predate this event, so the fallback is\n // always a fresh snapshot rather than a shared one.\n if (!applySharedMessagingEvent(data)) void sharedMessagingSnapshot.refresh();\n }\n },\n // A failed turn whose message is the lease service's at-limit denial → offer\n // an in-terminal upgrade right where the friction happened. (offerUpgrade /\n // isSessionLimitError are defined below; this callback only fires mid-session.)\n onError: (err: string) => {\n if (isSessionLimitError(err)) void offerUpgrade({ auto: true });\n },\n });\n\n // ── subagent tracking ──────────────────────────────────────────────────────\n // A subagent runs in its own child thread, but whether it's *actively running*\n // (vs idle or terminated) lives in our thread's child registry. The owning\n // user's Hub supplies the cross-face invalidation; the parent and active-child\n // thread streams supply attached-session lifecycle detail.\n // Running child threadId -> display title, registry status detail, and raw\n // agent name (the TUI colors the compaction agent orange by name).\n const activeSubagents = new Map<string, { title: string; registryDetail: string; agentName?: string }>();\n // Agent name → title, loaded once so subagent lines read \"Research Assistant\"\n // rather than the raw agent name. Best effort; falls back to a prettified name.\n const agentTitles = new Map<string, string>();\n const agentTitlesReady = api\n .listAgents()\n .then((list) => list.forEach((a) => agentTitles.set(a.name, a.title)))\n .catch(() => {});\n // Compose each line as \"Title — activity\". The live stream phrase (what the\n // subagent's own thread is doing RIGHT NOW — reading a page, running a\n // search) wins over the registry status text (setStatus heartbeats, which\n // only some agents publish); with neither, the bare title renders as before.\n const pushSubagents = () =>\n tui.setSubagents(\n [...activeSubagents.entries()].map(([id, s]) => {\n const detail = subActivity.phraseFor(id) ?? s.registryDetail;\n return { id, label: `${s.title}${detail ? ` — ${detail}` : \"\"}`, agentName: s.agentName };\n })\n );\n // Live per-subagent activity: one read-only stream to each running child\n // thread (opened/closed by the reconcile below via sync()); a phrase change\n // just re-pushes the lines.\n const subActivity = new SubagentActivity(api, () => pushSubagents());\n // Rebuild the running-subagent set from the authoritative child registry.\n // Runs on every user-stream (re)connect (covering subagents that started\n // during a gap) and whenever this parent is invalidated.\n const reconcileSubagents = async () => {\n try {\n await agentTitlesReady;\n const subs = await api.listSubagents(threadId);\n activeSubagents.clear();\n for (const s of subs) {\n // Hide finished/parked children. Anything else is live: \"running\", or a\n // custom working status (agents can publish progress via setStatus /\n // sessionStatus bindings — e.g. the coordinator's code workers heartbeat\n // \"editing src/auth.ts — 2 of 3 call sites done\" into the registry).\n const status = (s.status || \"\").trim();\n if (status === \"idle\" || status === \"terminated\") continue;\n // Keep the registry status text when it's more than the bare lifecycle\n // marker — it's the fallback detail when no live stream phrase exists.\n // Collapsed to one line — agents publish arbitrary status text, and a\n // newline inside a HUD row would desync the TUI's redraw math.\n const oneLineStatus = status.replace(/\\s+/g, \" \");\n activeSubagents.set(s.id, {\n title: subagentLabel(s, agentTitles),\n registryDetail: oneLineStatus && oneLineStatus !== \"running\" ? oneLineStatus.slice(0, 80) : \"\",\n agentName: s.agent_name ?? undefined,\n });\n }\n // Streams follow the registry: open for newcomers, closed for departed.\n subActivity.sync(activeSubagents.keys());\n pushSubagents();\n } catch {\n // Best effort — the next event or reconnect re-reconciles.\n }\n };\n // Coalesce bursts of events into a single registry read; if more events land\n // while a read is in flight, run exactly one more afterwards.\n let reconcileTimer: ReturnType<typeof setTimeout> | null = null;\n let reconcilePending = false;\n const scheduleReconcile = () => {\n if (reconcileTimer) {\n reconcilePending = true;\n return;\n }\n reconcileTimer = setTimeout(async () => {\n reconcileTimer = null;\n await reconcileSubagents();\n if (reconcilePending) {\n reconcilePending = false;\n scheduleReconcile();\n }\n }, 150);\n };\n const stopSessionEvents = accountStream.onEvent((event, data) => {\n if (event !== SESSION_CHANGED_EVENT) return;\n const changed = parseSessionChangedData(data);\n if (changed?.thread_id === threadId && changed.change === \"subagents\") scheduleReconcile();\n });\n\n // `/clear` resolves this promise; runInteractive tears the session down and\n // returns, and the caller loops back in with a fresh thread. (Quit never\n // resolves it — quit exits the process directly.)\n let endSession!: () => void;\n const sessionEnded = new Promise<void>((r) => (endSession = r));\n\n const quit = async () => {\n tui.end();\n // Closing a watcher never stops the work: the turn runs on the runner\n // machine's daemon, which keeps going (and keeps its background processes)\n // after this terminal leaves. Escape still stops the turn, and any client\n // can re-attach to the thread. Just drop this process's sockets.\n stopWatchingConnection();\n stopSessionEvents();\n stream.close();\n subActivity.closeAll();\n farewell(busy ? runnerName : undefined);\n process.exit(0);\n };\n tui.setQuitHandler(quit);\n\n // `/logout`: forget the saved token for this instance, then shut down like a\n // normal quit. The next launch lands on the sign-in screen.\n const logout = async () => {\n deleteCredential(api.origin);\n const instanceHost = api.origin.replace(/^https?:\\/\\//, \"\");\n tui.print(`${c.gray}Signed out — removed the saved token for ${c.teal}${instanceHost}${c.reset}${c.gray}. Run standardcode to sign in again.${c.reset}`);\n await quit();\n };\n const bgMgr: BgManager = {\n list: () => registry.list(),\n // The processes belong to the daemon that spawned them, so no client can\n // signal them directly. Queue `stop_process` on the runner machine's\n // command channel; its daemon signals the PID and updates the shared\n // process list, which flows back through the normal thread events —\n // nothing here waits or polls. (Requires a daemon new enough to know the\n // command; older daemons log and drop it.)\n stop: async (id: string) => {\n const runnerMachineId = remote ? session.runner?.id : session.identity.machine_id;\n if (!runnerMachineId) {\n tui.print(`${c.red}✗ couldn't resolve the session's runner machine${c.reset}`);\n return;\n }\n try {\n await enqueueMachineCommand(api, runnerMachineId, \"stop_process\", {\n threadId,\n processId: id,\n });\n tui.print(`${c.gray}Stopping ${id} on ${runnerName}…${c.reset}`);\n } catch (e) {\n tui.print(`${c.red}✗ stop request failed:${c.reset} ${c.gray}${e instanceof Error ? e.message : String(e)}${c.reset}`);\n }\n },\n };\n\n // ── MCP control surface (for the /mcp command + slash menu) ────────────────\n // `~/.standardagents/mcp.json` is THIS machine's launch config, and THIS\n // machine's daemon is the MCP host that reads it — so the menu is wired only\n // when the session runs here (it is hidden for a session on another machine,\n // whose config lives on that box). Edits land in the file; the daemon\n // connects the enabled servers when it next attaches a session, which is why\n // the menu reports a change as \"applies to the next session on this machine\"\n // rather than pretending this process can connect one.\n const mcpCtl: McpController = {\n configured: () => listMcpServers(),\n // The connected catalog is the executing daemon's, published to the thread\n // KV — a watcher reads it there rather than keeping its own.\n catalog: async () => {\n const value = (await api.kvGet(threadId, \"mcp_catalog\").catch(() => null)) as McpCatalog | null;\n return value?.servers ? value : { servers: [] };\n },\n add: async (cfg) => {\n saveMcpServer(cfg);\n },\n // Seed the request into the main chat — the agent researches + installs it\n // there (using research_agent + the mcp tool's install action), visible in\n // the transcript.\n requestInstall: (query) => {\n void sendNow(\n `Install an MCP server for me: ${query}. Research the best one and its exact launch command, then install it.`\n );\n },\n remove: (name) => removeMcpServer(name),\n setEnabled: (name, enabled) => setMcpServerEnabled(name, enabled),\n };\n\n // ── submit / queue / steer ─────────────────────────────────────────────────\n // Pasted images become real message attachments: the instance stores the\n // bytes in the thread filesystem and injects them into the LLM's vision\n // context, exactly like an image sent from the web UI. The `[#Image N]`\n // placeholders stay in the text so the model can reference them by name.\n const extFor = (mime: string): string =>\n ({ \"image/png\": \"png\", \"image/jpeg\": \"jpg\", \"image/gif\": \"gif\", \"image/webp\": \"webp\" })[mime] ?? \"bin\";\n const toAttachments = (images: PastedImage[]): MessageAttachment[] =>\n images.map((img) => ({ name: `image-${img.seq}.${extFor(img.mime)}`, mimeType: img.mime, data: img.data }));\n const toSharedAttachments = (images: PastedImage[]): SharedMessageAttachment[] =>\n toAttachments(images);\n const fromSharedAttachments = (attachments: SharedMessageAttachment[]): PastedImage[] =>\n attachments.filter(isInlineSharedAttachment).map((attachment, index) => {\n const namedSequence = /(?:image-|Image\\s+)(\\d+)/i.exec(attachment.name)?.[1];\n return {\n seq: namedSequence ? Number(namedSequence) : index + 1,\n data: attachment.data,\n mime: attachment.mimeType,\n };\n });\n\n const applySharedMessaging = (snapshot: SharedMessagingSnapshot, mirrorDraft: boolean) => {\n const firstSnapshot = !sharedMessagingReady;\n const previousDraftRevision = sharedMessaging.draft.revision;\n // Pending and draft are separate KV values and can be returned by\n // overlapping requests in either order. Never let an older response roll\n // either independent revision backward.\n sharedMessaging = firstSnapshot ? snapshot : mergeSharedMessagingSnapshot(sharedMessaging, snapshot);\n sharedMessagingReady = true;\n sharedMessagingUnavailableShown = false;\n tui.setQueuedMessages(sharedMessaging.pending.items.map((item) => item.content));\n if (\n mirrorDraft &&\n (firstSnapshot || sharedMessaging.draft.revision > previousDraftRevision) &&\n (firstSnapshot || sharedMessaging.draft.originClientId !== messagingOrigin.originClientId)\n ) {\n mirroredDraftRefs = sharedMessaging.draft.attachments.filter(isSharedAttachmentRef);\n tui.setExternalAttachmentNames(mirroredDraftRefs.map((attachment) => attachment.name));\n tui.setInput(\n sharedMessaging.draft.content,\n fromSharedAttachments(sharedMessaging.draft.attachments),\n false,\n true,\n );\n }\n };\n\n reconcileSharedMessaging = async (mirrorDraft = false) => {\n try {\n applySharedMessaging(await api.getSharedMessaging(threadId), mirrorDraft);\n } catch (error) {\n if (!sharedMessagingReady && !sharedMessagingUnavailableShown) {\n sharedMessagingUnavailableShown = true;\n tui.print(`${c.dim}shared messaging unavailable: ${error instanceof Error ? error.message : String(error)}${c.reset}`);\n }\n }\n };\n\n // Apply an event-carried draft with zero refetch — the fast path that puts\n // cross-device typing at one network hop. Returns false when the event can't\n // settle things on its own (no snapshot yet, the pending queue changed, the\n // draft was too large to carry, or an old server sent revisions only).\n applySharedMessagingEvent = (data: unknown): boolean => {\n if (!sharedMessagingReady) return false;\n const event = parseMessagingChangedEvent(data);\n if (!event || !event.draft || event.draftOmitted) return false;\n if (event.pendingRevision > sharedMessaging.pending.revision) return false;\n applySharedMessaging({ version: 1, pending: sharedMessaging.pending, draft: event.draft }, true);\n return true;\n };\n\n // A stopped terminal process can resume without forcing its socket through a\n // close/open cycle. Refresh once on SIGCONT rather than keeping a periodic\n // shared-state poll alive for the entire session.\n const onTerminalResume = () => void sharedMessagingSnapshot.refresh();\n process.on(\"SIGCONT\", onTerminalResume);\n\n const applySharedMutation = (promise: Promise<SharedMessagingSnapshot>): Promise<boolean> =>\n promise.then((snapshot) => {\n applySharedMessaging(snapshot, false);\n return true;\n }).catch((error) => {\n tui.print(`${c.dim}shared messaging failed: ${error instanceof Error ? error.message : String(error)}${c.reset}`);\n return false;\n });\n\n const appendSharedPending = (text: string, images: PastedImage[], refs: SharedAttachmentRef[] = []) =>\n applySharedMutation(api.appendPendingInput(threadId, {\n content: text,\n attachments: [...refs, ...toSharedAttachments(images)],\n ...messagingOrigin,\n }));\n\n const editSharedPending = (\n item: PendingInput,\n text: string,\n images: PastedImage[],\n refs: SharedAttachmentRef[],\n ) =>\n applySharedMutation(api.updatePendingInput(threadId, item.id, {\n content: text,\n attachments: [\n ...refs,\n ...toSharedAttachments(images),\n ],\n ...messagingOrigin,\n }));\n\n const dismissSharedPending = (item: PendingInput) =>\n applySharedMutation(api.dismissPendingInput(threadId, item.id, messagingOrigin));\n\n /**\n * Play a queued pending message NOW. While busy this is a steer: hard-stop\n * the current LLM request(s) first, queue the item durably (which also\n * removes it from the FIFO), then kick the stopped thread so the queued\n * message plays immediately instead of waiting for the next user send.\n */\n const promoteSharedPending = async (item: PendingInput) => {\n if (busy) {\n await Promise.all([\n api.stopThread(threadId).catch(() => {}),\n ...[...activeSubagents.keys()].map((childId) => api.stopThread(childId).catch(() => {})),\n ]);\n const promoted = await applySharedMutation(api.steerPendingInput(threadId, item.id, messagingOrigin));\n if (promoted) await api.continueThread(threadId).catch(() => {});\n return promoted;\n }\n return applySharedMutation(api.steerPendingInput(threadId, item.id, messagingOrigin));\n };\n\n const sendNow = async (text: string, images: PastedImage[] = [], refs: SharedAttachmentRef[] = []) => {\n lastSent = { text, images, refs };\n tui.printUserMessage(text || `📎 ${refs.length + images.length} attachment(s)`);\n // Mark it shown so reconciliation does not print our own send again after\n // the backend persists it.\n const key = text.trim();\n pendingSent.set(key, (pendingSent.get(key) ?? 0) + 1);\n // WE are the sender — show Working now, not after the round trip.\n busy = true;\n optimisticBusyUntil = Date.now() + 8000;\n tui.setWorking(true);\n try {\n await api.sendMessage(threadId, text, [...refs, ...toAttachments(images)]);\n } catch (e) {\n const n = (pendingSent.get(key) ?? 1) - 1;\n if (n > 0) pendingSent.set(key, n);\n else pendingSent.delete(key); // send failed — don't suppress a future identical message\n busy = false;\n optimisticBusyUntil = 0;\n tui.setWorking(false);\n tui.print(`${c.dim}failed to send: ${e instanceof Error ? e.message : String(e)}${c.reset}`);\n return false;\n }\n return true;\n };\n // ── `!command` bang ────────────────────────────────────────────────────────\n // A leading `!` runs a shell command NOW on the thread's execution owner —\n // the runner machine's daemon, never this terminal, whether that machine is\n // a VPS or the one you're sitting at. It prints the output inline and records\n // it in thread history (so tuned-in clients see it too), and never goes to\n // the agent. The instance forwards it over the same bridge the agent's tools\n // use, so it always lands where execution lives.\n const whereLabel = runnerName;\n let bangRunning = false;\n const runBangCommand = async (command: string) => {\n if (bangRunning) {\n tui.print(`${c.dim}a command is already running — one at a time.${c.reset}`);\n return;\n }\n bangRunning = true;\n tui.print(`${c.magenta}!${c.reset} ${c.dim}running on ${whereLabel}…${c.reset}`);\n try {\n const res = await api.runCommand(threadId, command);\n // The instance persisted it as a `user_command` system message; mark that\n // id shown so reconciliation does not render it again on this client.\n if (res.messageId) shownIds.add(res.messageId);\n printCommandBlock(tui, command, res.ok ? res.output ?? \"\" : res.error ?? \"command failed\", res.ok, whereLabel);\n } catch (e) {\n printCommandBlock(tui, command, e instanceof Error ? e.message : String(e), false, whereLabel);\n } finally {\n bangRunning = false;\n }\n };\n\n const openPendingMenu = async () => {\n const items = sharedMessaging.pending.items;\n if (!items.length) {\n tui.print(`${c.dim}No pending messages.${c.reset}`);\n return;\n }\n const picked = await tui.select(\"Pending messages\", items.map((item, index) => ({\n label: item.content.replace(/\\s+/g, \" \"),\n hint: `${index + 1} of ${items.length}`,\n value: item,\n })));\n if (!picked) return;\n const action = await tui.select(\"Pending message\", [\n { label: \"Edit\", value: \"edit\" as const },\n { label: \"Steer next\", value: \"steer\" as const },\n { label: \"Dismiss\", value: \"dismiss\" as const },\n ]);\n if (!action) return;\n if (action === \"edit\") {\n editingPendingId = picked.id;\n mirroredDraftRefs = picked.attachments.filter(isSharedAttachmentRef);\n tui.setExternalAttachmentNames(mirroredDraftRefs.map((attachment) => attachment.name));\n tui.setInput(picked.content, fromSharedAttachments(picked.attachments), true, true);\n } else if (action === \"steer\") {\n await promoteSharedPending(picked);\n } else {\n await dismissSharedPending(picked);\n }\n };\n\n // Manually kick off a background compaction. Spawns the non-blocking\n // compaction subagent server-side immediately (even while the thread is idle),\n // which then surfaces through the normal subagent display — no special CLI\n // message needed. Idempotent: a server-side lock prevents overlapping runs.\n const requestCompaction = async () => {\n try {\n await api.compact(threadId);\n } catch (err) {\n tui.print(`${c.red}✗${c.reset} couldn't start compaction: ${(err as Error).message}`);\n }\n };\n\n // /account — open the standardcode.ai dashboard, pre-authed when the\n // instance can mint a magic link for this thread's user (falls back to the\n // plain dashboard where they sign in by inbox link).\n const runAccountCommand = async () => {\n tui.print(`${c.gray}Opening your account…${c.reset}`);\n const link = await api.accountLink(threadId).catch(() => null);\n const target = link?.url ?? \"https://standardcode.ai/account\";\n openUrl(target);\n tui.print(\n link?.preauthed\n ? `${c.gray}→ account dashboard opened in your browser (signed in)${c.reset}`\n : `${c.gray}→ opened ${target} — sign in with your account email${c.reset}`\n );\n };\n\n // ── in-terminal parallel-session upgrade ──────────────────────────────────\n const ordinal = (n: number): string => {\n const s = [\"th\", \"st\", \"nd\", \"rd\"], v = n % 100;\n return `${n}${s[(v - 20) % 10] ?? s[v] ?? s[0]}`;\n };\n const fmtCost = (q: SessionQuote): string | null =>\n typeof q.amount_cents === \"number\" && q.amount_cents !== 0\n ? `$${(Math.abs(q.amount_cents) / 100).toFixed(2)}`\n : null;\n\n // A delightful, on-brand panel: gradient title, a session meter (● in use,\n // gradient + for the one being added, dim · for headroom), and an unambiguous\n // cost line (with the amber trial-conversion warning when applicable).\n const renderUpgradePanel = (q: SessionQuote): string => {\n const dots: string[] = [];\n for (let i = 0; i < q.max; i++) {\n if (i < q.current) dots.push(`${c.teal}●${c.reset}`);\n else if (i === q.current) dots.push(`${c.bold}${gradientText(\"+\")}${c.reset}`);\n else dots.push(`${c.dim}·${c.reset}`);\n }\n const cost = fmtCost(q);\n const lines = [\n \"\",\n `${c.bold}✦ Add a parallel session${c.reset}`,\n \"\",\n `${dots.join(\" \")} ${c.dim}${q.current} of ${q.current} session${q.current === 1 ? \"\" : \"s\"} in use${c.reset}`,\n ];\n if (q.ends_trial) {\n lines.push(\n `${c.yellow}Your $5 trial covers 1 session. Adding a ${ordinal(q.sessions)} ends the trial${c.reset}`,\n `${c.yellow}and starts your $49/mo plan now${cost ? ` — ${c.bold}${cost} charged today${c.reset}${c.yellow}` : \"\"}.${c.reset}`,\n );\n } else if (cost) {\n lines.push(`Add a ${ordinal(q.sessions)} session at $49/mo — ${c.bold}${cost} charged now${c.reset}.`);\n } else {\n lines.push(`Add a ${ordinal(q.sessions)} session at $49/mo — prorated on your next invoice.`);\n }\n lines.push(\"\");\n return lines.join(\"\\n\");\n };\n\n // Offer + apply an upgrade. `auto` = triggered by hitting the limit mid-turn\n // (we then resend the blocked message so the session just continues).\n const offerUpgrade = async (opts: { auto?: boolean } = {}) => {\n if (upgradeInFlight) return;\n upgradeInFlight = true;\n try {\n // Say WHY this appeared before doing anything else. When triggered by a\n // blocked turn (auto), the raw denial was deliberately swallowed — with\n // no explanation the browser opening reads as a glitch, not a limit.\n if (opts.auto) {\n tui.print(\n `${c.yellow}You're out of simultaneous sessions — another Standard Code session is using your slot.${c.reset}`\n );\n }\n const quote = await api.sessionsQuote(threadId);\n if (!quote) {\n // No subscription or billing unreachable → hand off to the dashboard.\n const link = await api.accountLink(threadId).catch(() => null);\n const target = link?.url ?? \"https://standardcode.ai/account\";\n tui.print(\n `${c.gray}Close the other session (its slot frees within ~90s) — or add another` +\n ` simultaneous session to your plan, then resend your message.${c.reset}`\n );\n openUrl(target);\n tui.print(`${c.gray}→ opened ${target} to manage your plan${c.reset}`);\n return;\n }\n if (quote.current >= quote.max) {\n tui.print(\n `${c.yellow}You're at the maximum of ${quote.max} parallel session${quote.max === 1 ? \"\" : \"s\"}.${c.reset}\\n` +\n `${c.gray}Close another session (its slot frees within ~90s), then resend your message.${c.reset}`\n );\n return;\n }\n tui.print(renderUpgradePanel(quote));\n const cost = fmtCost(quote);\n const confirmLabel = quote.ends_trial\n ? `End trial & start now${cost ? ` — pay ${cost} today` : \"\"}`\n : `Confirm${cost ? ` — pay ${cost} now` : \" — add the session\"}`;\n const choice = await tui.select(`Add a ${ordinal(quote.sessions)} parallel session?`, [\n { label: confirmLabel, value: \"go\" as const },\n { label: \"Not now\", value: \"no\" as const },\n ]);\n if (choice !== \"go\") {\n tui.print(`${c.gray}No change made — you can upgrade anytime with /upgrade.${c.reset}`);\n return;\n }\n tui.print(`${c.gray}Applying…${c.reset}`);\n let applied: { ok?: boolean; sessions?: number; error?: string };\n try {\n applied = await api.sessionsUpgrade(threadId, quote.sessions);\n } catch (e) {\n tui.print(`${c.red}✗${c.reset} Upgrade failed: ${e instanceof Error ? e.message : String(e)}`);\n return;\n }\n if (!applied?.ok) {\n tui.print(`${c.red}✗${c.reset} Upgrade failed: ${applied?.error ?? \"unknown error\"}`);\n return;\n }\n const n = applied.sessions ?? quote.sessions;\n tui.print(`${c.green}✓${c.reset} ${c.bold}${gradientText(`You now have ${n} parallel session${n === 1 ? \"\" : \"s\"}.`)}${c.reset}`);\n // Continue the blocked turn: resend the message that hit the limit.\n if (opts.auto && lastSent) {\n tui.print(`${c.gray}Continuing…${c.reset}`);\n await sendNow(lastSent.text, lastSent.images, lastSent.refs);\n }\n } finally {\n upgradeInFlight = false;\n }\n };\n\n // Recognize the lease service's at-limit / no-subscription denials (surfaced\n // as the hook's blocked-turn error text) so we can offer an upgrade in place.\n const isSessionLimitError = (msg: string): boolean =>\n /thread limit reached|simultaneous (thread|session)s?.*in use|no active standard code subscription/i.test(msg);\n\n // ── skills control surface (for the /skills command) ──────────────────────\n // Skills live in the INSTANCE (global across sessions); the CLI only lists\n // and toggles them over the API — nothing skill-related is stored locally.\n const skillsCtl: SkillsController = {\n list: () => api.listSkills(),\n setEnabled: (name, enabled) => api.setSkillEnabled(name, enabled),\n remove: (name) => api.removeSkill(name),\n // Seed the request into the main chat — the agent researches or authors\n // the skill there (research_agent + the skill tool's install action),\n // visible in the transcript.\n requestInstall: (query) => {\n void sendNow(\n `Install a skill for me: ${query}. Find the skill's published files (or author a proper SKILL.md from your research), install it, then tell me what it can do.`\n );\n },\n };\n\n // Slash-command palette: typing \"/\" filters this list inline above the prompt.\n // Each command is individually addressable (/compact, /mcp, …). Hints are\n // functions so live state (context %, level, counts) stays fresh as it redraws.\n tui.setCommands([\n {\n name: \"clear\",\n label: \"Clear conversation\",\n hint: \"start a fresh session\",\n run: () => endSession(),\n },\n {\n name: \"compact\",\n label: \"Compact conversation now\",\n hint: () => tui.contextPctLabel() || \"free up context\",\n run: requestCompaction,\n },\n {\n name: \"queue\",\n label: \"Pending messages\",\n hint: () => {\n const count = sharedMessaging.pending.items.length;\n return count ? `${count} pending` : \"none\";\n },\n run: openPendingMenu,\n },\n { name: \"level\", label: \"Auto-accept level\", hint: () => `level ${tui.level}`, run: () => runLevelMenu(tui, perm) },\n {\n name: \"permissions\",\n label: \"Approved commands\",\n hint: () => {\n const n = perm.alwaysAllow.size + perm.allowRisk.size;\n return n ? `${n} approved` : \"none\";\n },\n run: () => runApprovalsMenu(tui, perm, () => saveApprovals(api, threadId, perm)),\n },\n // `mcp.json` is machine-local and the machine's daemon is its host, so the\n // menu appears only for a session running on THIS machine.\n ...(remote\n ? []\n : [\n {\n name: \"mcp\",\n label: \"MCP servers\",\n hint: () => {\n const n = listMcpServers().filter((s) => s.enabled).length;\n return n ? `${n} enabled` : \"none\";\n },\n run: () => runMcpMenu(tui, mcpCtl),\n },\n ]),\n {\n name: \"agent\",\n label: \"Switch agent\",\n hint: \"hand this session to a different agent\",\n run: () => runAgentSwitchMenu(tui, api, accountStream, threadId),\n },\n {\n name: \"machines\",\n label: \"Your machines\",\n hint: \"list, rename, update, manage projects\",\n run: () => runMachinesMenu(tui, api, accountStream, session.identity),\n },\n {\n name: \"daemon\",\n label: \"Machine daemon\",\n hint: () => (serviceStatus().installed ? \"installed on this machine\" : \"not installed here\"),\n run: () => showDaemonInfo(tui, session),\n },\n {\n name: \"skills\",\n label: \"Agent skills\",\n hint: \"list / install / manage\",\n run: () => runSkillsMenu(tui, skillsCtl),\n },\n {\n name: \"account\",\n label: \"Manage your account\",\n hint: \"billing & sessions, opens in browser\",\n run: () => runAccountCommand(),\n },\n {\n name: \"upgrade\",\n label: \"Add a parallel session\",\n hint: \"run more sessions at once\",\n run: () => offerUpgrade(),\n },\n { name: \"background\", label: \"Background processes\", hint: \"list / stop\", run: () => runProcessMenu(tui, bgMgr) },\n { name: \"keybindings\", label: \"Keyboard shortcuts\", run: () => showKeybindings(tui) },\n { name: \"update\", label: \"Check for updates\", hint: \"check for a newer version\", run: () => runUpdateCommand(tui) },\n { name: \"logout\", label: \"Sign out\", hint: \"delete the saved token & quit\", run: () => logout() },\n { name: \"quit\", label: \"Quit\", run: () => quit() },\n ]);\n\n // Seed ↑/↓ recall from the thread KV (inheriting the project's newest prior\n // thread on a fresh session); every submit appends (whether it sends now or\n // queues) so history survives across sessions — all server-side, nothing on\n // the local filesystem.\n const history = await loadHistory(api, threadId, historySeedThreadId);\n tui.setHistory(history);\n\n // Fetch the authoritative queue + draft before enabling outbound draft\n // writes. This prevents a stale local composer from overwriting a newer\n // device's draft when the terminal attaches or reconnects. This read runs\n // before the message socket exists, so it is recorded at epoch 0 and the\n // first open still performs its own race-closing read.\n await sharedMessagingSnapshot.refresh();\n\n // Single-flight draft pump: the first keystroke sends IMMEDIATELY (no\n // trailing debounce — that made cross-device sync wait for a typing pause),\n // later keystrokes coalesce behind the in-flight PUT and the latest state\n // goes out the moment it completes. Serializing every draft write (including\n // clears) through one pipe also removes the reorder race where a clear could\n // land before an older PUT and resurrect the draft.\n let latestDraftPayload: { text: string; images: PastedImage[] } | null = null;\n let draftDirty = false;\n let draftInFlight = false;\n const pumpComposerDraft = async () => {\n if (draftInFlight) return;\n draftInFlight = true;\n try {\n while (draftDirty) {\n draftDirty = false;\n const payload = latestDraftPayload;\n if (!payload || !sharedMessagingReady) continue;\n const hasDraft = !!payload.text.trim() || payload.images.length > 0 || mirroredDraftRefs.length > 0;\n const mutation = {\n content: payload.text,\n attachments: [\n ...(hasDraft ? mirroredDraftRefs : []),\n ...toSharedAttachments(payload.images),\n ],\n ...messagingOrigin,\n };\n await applySharedMutation(\n hasDraft\n ? api.putSharedDraft(threadId, mutation)\n : api.clearSharedDraft(threadId, messagingOrigin)\n );\n }\n } finally {\n draftInFlight = false;\n }\n };\n const clearComposerDraft = () => {\n mirroredDraftRefs = [];\n tui.setExternalAttachmentNames([]);\n latestDraftPayload = { text: \"\", images: [] };\n draftDirty = true;\n void pumpComposerDraft();\n };\n tui.onDraftChange = (textVal, images) => {\n latestDraftPayload = { text: textVal, images };\n draftDirty = true;\n void pumpComposerDraft();\n };\n\n const submitComposer = async (text: string, images: PastedImage[], steer: boolean) => {\n const draftRefs = mirroredDraftRefs;\n if (!sharedMessagingReady && (busy || steer || editingPendingId !== null)) {\n tui.print(`${c.dim}Restoring shared message state — try again in a moment.${c.reset}`);\n tui.setExternalAttachmentNames(draftRefs.map((attachment) => attachment.name));\n tui.setInput(text, images);\n return;\n }\n clearComposerDraft(); // draft consumed → clear the shared unsent buffer\n // `!command` — run a shell command on the execution owner immediately,\n // out of band from the agent. `!!` escapes to a literal message starting\n // with `!`. A bare `!` (no command) is ignored.\n const trimmed = text.trimStart();\n if (trimmed.startsWith(\"!\") && !trimmed.startsWith(\"!!\") && images.length === 0 && draftRefs.length === 0) {\n const command = trimmed.slice(1).trim();\n if (command) {\n appendHistory(api, threadId, history, text);\n void runBangCommand(command);\n }\n return;\n }\n const outgoing = trimmed.startsWith(\"!!\") ? text.replace(\"!!\", \"!\") : text;\n if (outgoing.trim()) appendHistory(api, threadId, history, outgoing);\n text = outgoing;\n\n if (editingPendingId) {\n const pendingId = editingPendingId;\n const item = sharedMessaging.pending.items.find((candidate) => candidate.id === pendingId);\n editingPendingId = null;\n if (!item) {\n tui.print(`${c.dim}That pending message was already dispatched or dismissed.${c.reset}`);\n return;\n }\n const updated = await editSharedPending(item, text, images, draftRefs);\n const promoted = !steer || !updated\n ? updated\n : await promoteSharedPending({ ...item, id: pendingId });\n if (!promoted) {\n mirroredDraftRefs = item.attachments.filter(isSharedAttachmentRef);\n tui.setExternalAttachmentNames(mirroredDraftRefs.map((attachment) => attachment.name));\n tui.setInput(text, images);\n }\n return;\n }\n if (steer) {\n // Steering is IMMEDIATE: hard-stop the current LLM request(s) — root\n // and running subagents — then send the new message as a normal user\n // turn (a user send clears the stopped flag server-side and plays now).\n // Only plain queued messages wait for a natural boundary.\n tui.print(`${c.yellow}↪ steering now — stopping the current step${c.reset}`);\n await Promise.all([\n api.stopThread(threadId).catch(() => {}),\n ...[...activeSubagents.keys()].map((childId) => api.stopThread(childId).catch(() => {})),\n ]);\n if (!await sendNow(text, images, draftRefs)) {\n mirroredDraftRefs = draftRefs;\n tui.setExternalAttachmentNames(draftRefs.map((attachment) => attachment.name));\n tui.setInput(text, images);\n }\n return;\n }\n if (busy) {\n if (await appendSharedPending(text, images, draftRefs)) {\n // No transcript print — the queued message renders as a pinned HUD row\n // above the input (with the esc-to-steer hint) until it dispatches.\n } else {\n mirroredDraftRefs = draftRefs;\n tui.setExternalAttachmentNames(draftRefs.map((attachment) => attachment.name));\n tui.setInput(text, images);\n }\n } else {\n if (!await sendNow(text, images, draftRefs)) {\n mirroredDraftRefs = draftRefs;\n tui.setExternalAttachmentNames(draftRefs.map((attachment) => attachment.name));\n tui.setInput(text, images);\n }\n }\n };\n tui.onSubmit = (text, images) => { void submitComposer(text, images, false); };\n tui.onSteer = (text, images) => { void submitComposer(text, images, true); };\n\n tui.onInterrupt = () => {\n const firstPending = sharedMessaging.pending.items[0];\n if (!busy && firstPending) {\n tui.print(`${c.yellow}↪ steering the first pending message…${c.reset}`);\n void promoteSharedPending(firstPending);\n return;\n }\n if (busy) {\n // With a queued message, one Esc is a STEER: hard-stop the current\n // request(s) and play the FIFO head immediately. With an empty queue\n // it is a plain HARD stop — the instance aborts in-flight LLM\n // request(s) NOW and synthesizes failed results for dangling tool\n // calls; running subagent child threads get the same stop.\n const head = sharedMessaging.pending.items[0];\n if (head) {\n tui.print(`${c.yellow}↪ steering — stopping the current step to run the queued message${c.reset}`);\n void promoteSharedPending(head);\n return;\n }\n tui.print(`${c.yellow}■ stopping now${c.reset}`);\n const stops = [api.stopThread(threadId).catch(() => {})];\n for (const childId of activeSubagents.keys()) {\n stops.push(api.stopThread(childId).catch(() => {}));\n }\n void Promise.all(stops);\n }\n };\n\n // Enter on the ←-selected [⚙ n bg] prompt badge opens the same panel as\n // the /background slash command.\n tui.onBgBadge = () => {\n void runProcessMenu(tui, bgMgr).catch(() => {});\n };\n\n // Up on an empty top line first pulls the last QUEUED message back for\n // editing (returning true consumes the key); otherwise the TUI falls through\n // to history recall.\n tui.onUpArrow = () => {\n if (tui.getInput().trim() || tui.hasExternalAttachments()) return false;\n const item = sharedMessaging.pending.items.at(-1);\n if (!item) return false;\n editingPendingId = item.id;\n mirroredDraftRefs = item.attachments.filter(isSharedAttachmentRef);\n tui.setExternalAttachmentNames(mirroredDraftRefs.map((attachment) => attachment.name));\n tui.setInput(item.content, fromSharedAttachments(item.attachments), true, true);\n return true;\n };\n\n // Connection health for the HUD. The bridge used to report it; a watcher's\n // liveness is its account stream, which reconnects with backoff like every\n // other socket. Brief drops are normal, so stay quiet until reconnection is\n // actually struggling — the notice clears itself the moment it comes back.\n const stopWatchingConnection = accountStream.onConnection((state, attempt) => {\n if (state === \"reconnecting\") {\n if (attempt >= 4) tui.setConnected(false);\n } else {\n tui.setConnected(true);\n scheduleReconcile();\n }\n });\n\n scheduleReconcile();\n await stream.connect();\n\n // Seed the live goal checklist; it then stays current via goal_updated events.\n void api.getGoal(threadId).then((g) => tui.setGoal(g)).catch(() => {});\n\n attaching.stop();\n const header = `${c.bold}${c.magenta}Standard Code${c.reset} ${c.dim}— ${agentTitle}${c.reset}`;\n // Where the tools run is a session FACT, decided when the thread was tagged\n // for its runner machine: that machine's daemon executes, every attached\n // client watches. This terminal is one of the watchers.\n const daemonVersion = remote\n ? session.runner?.daemon?.version\n : (await loadMachine(api, session.identity.machine_id).catch(() => null))?.daemon?.version;\n const execLine = `${c.gray}tool execution:${c.reset} daemon${daemonVersion ? ` v${daemonVersion}` : \"\"} on ${runnerName}`;\n tui.setAgentLabel(agentTitle);\n tui.banner(\n remote\n ? [\n header,\n `${c.gray}project:${c.reset} ${session.remotePath ?? \"?\"} ${c.teal}on ${runnerName}${c.reset}`,\n `${c.gray}machine:${c.reset} ${runnerName} ${c.gray}thread:${c.reset} ${threadId.slice(0, 8)}`,\n execLine,\n ]\n : [\n header,\n `${c.gray}project:${c.reset} ${projectDir}`,\n `${c.gray}machine:${c.reset} ${machine} ${c.gray}thread:${c.reset} ${threadId.slice(0, 8)}`,\n execLine,\n ]\n );\n\n if (resumed) await printHistory(api, threadId, tui);\n\n // Seed shown ids so event-triggered reconciliation does not reprint history.\n try {\n (await api.getMessages(threadId, 200)).forEach((m: any) => shownIds.add(m.id));\n } catch {\n // ignore\n }\n\n const runningProcs = (await registry.list()).filter((p) => p.status === \"running\");\n if (runningProcs.length) {\n tui.print(\n `${c.cyan}⚙ ${runningProcs.length} background process${runningProcs.length === 1 ? \"\" : \"es\"} running:${c.reset}`\n );\n for (const p of runningProcs) tui.print(`${c.gray} ${p.id} ${p.description || p.command}${c.reset}`);\n }\n refreshBgCount();\n\n tui.start(); // begin the persistent input line\n\n // ── approval relay ─────────────────────────────────────────────────────────\n // The ONE approval path. When the runner's daemon needs a human decision it\n // parks an `approval_request` in the thread KV; this client renders the\n // normal approval prompt and writes the decision back; the daemon applies it\n // and clears the keys. It rides the packed approval route's thread event in\n // both directions, so neither side polls. First responder wins if several\n // clients watch — and the machine running the tools is irrelevant here,\n // because no client ever executes.\n const answeredApprovals = new Set<string>();\n let approvalPromptOpen = false;\n const relayApprovals = async (): Promise<void> => {\n if (approvalPromptOpen) return;\n const request = parseApprovalRequest(await api.kvGet(threadId, APPROVAL_REQUEST_KEY));\n if (!request || answeredApprovals.has(request.tool_call_id)) return;\n approvalPromptOpen = true;\n try {\n // The approval dialog handles deny-with-feedback itself and returns the\n // final { choice, reason } — write it straight through to the relay.\n const { choice, reason } = await tui.approval(\n `${request.summary}${request.permission ? `\\n${c.bold}why: ${request.permission}${c.reset}` : \"\"}\\n${c.dim}runs on ${request.machine || runnerName}${c.reset}`,\n request.risk\n );\n answeredApprovals.add(request.tool_call_id);\n await writeApprovalResponse(api, threadId, {\n tool_call_id: request.tool_call_id,\n choice,\n reason,\n decided_at: Date.now(),\n });\n } finally {\n approvalPromptOpen = false;\n }\n };\n\n // Event-triggered durable reconciliation for messages, status, and queues.\n let stalledNoticeShown = false;\n const reconcileProjection = async () => {\n let msgs: any[];\n let serverBusy: boolean | null = null;\n let serverTool: { id: string; name: string; waitingForHost?: boolean } | null = null;\n try {\n const snapshot = await api.getSessionState(threadId);\n msgs = snapshot.messages.slice(-60);\n serverBusy = snapshot.busy;\n serverTool = snapshot.current_tool;\n // The server projected a DEAD session: the executor was lost mid\n // forwarded call and no result is coming. Say so once, visibly, instead\n // of spinning — the next message (or the server watchdog's own\n // recovery) resumes the thread.\n if ((snapshot as { stalled?: boolean }).stalled && !stalledNoticeShown) {\n stalledNoticeShown = true;\n tui.print(\n `${c.yellow}⚠ session interrupted${c.reset} ${c.dim}— the last operation never finished (the runtime is attempting recovery). Send a message to continue.${c.reset}`\n );\n } else if (!(snapshot as { stalled?: boolean }).stalled && stalledNoticeShown && snapshot.busy) {\n // Recovered/resumed — allow a future stall to notify again.\n stalledNoticeShown = false;\n }\n } catch {\n // Compatibility with older/self-hosted instances during rolling deploys.\n msgs = await api.getMessages(threadId, 60);\n }\n const sorted = [...msgs].sort((a, b) => (a.created_at ?? 0) - (b.created_at ?? 0));\n // Record every message's tool calls first — a result row can settle a call\n // whose carrier record entered the window in the same read.\n for (const m of sorted) toolActivity.index(m);\n for (const m of sorted) {\n if (shownIds.has(m.id)) continue;\n const text = messageText(m.content).trim();\n // An assistant record can become visible in session_state before its\n // durable content is populated. Do not acknowledge that id until there\n // is something to print, or its later completed answer will be skipped.\n if (!transcriptMessageReady(m, text)) continue;\n // Tool-result records settle the activity feed: the ✓/✗ line (plus diff\n // or command sub-lines) prints at the record's projection position, so a\n // turn's tool lines land before that turn's answer prose — matching the\n // web console. Their ids stay out of shownIds: the feed dedups by tool\n // call, and a parked placeholder row must be revisited once the real\n // result replaces it.\n if (m.role === \"tool\") {\n const entry = toolActivity.settle(m);\n if (entry) {\n tui.print(colorActivity(entry.line));\n // Pre-styled extra rows (truncated diffs for edits/writes) print verbatim.\n if (entry.detail) for (const d of entry.detail) tui.print(d);\n }\n continue;\n }\n shownIds.add(m.id);\n // At-limit / no-subscription denial (from the enforce_thread_leases hook)\n // → offer the in-terminal upgrade instead of printing the raw error. The\n // stream's onError catches the same condition; upgradeInFlight dedups.\n const denial = (typeof m.error === \"string\" && m.error) || text;\n if (denial && isSessionLimitError(denial)) {\n void offerUpgrade({ auto: true });\n continue;\n }\n // A user `!command` is persisted as a system message tagged\n // `user_command` — render it as a command block on every client (the one\n // that ran it already marked its id shown; this is for the others).\n if (m.metadata?.user_command) {\n printCommandBlock(\n tui,\n String(m.metadata.command ?? \"\"),\n String(m.metadata.output ?? text),\n m.metadata.ok !== false\n );\n continue;\n }\n if (m.role === \"assistant\" && text) printAssistant(tui, text);\n else if (m.role === \"system\" && text) tui.print(`${c.dim}${text}${c.reset}`);\n else if (m.role === \"user\" && text) {\n const pending = pendingSent.get(text) ?? 0;\n if (pending > 0) {\n // Our own optimistic send, now confirmed — already on screen.\n if (pending === 1) pendingSent.delete(text);\n else pendingSent.set(text, pending - 1);\n } else {\n // Submitted from elsewhere — render it as a normal sent user message.\n tui.printUserMessage(text);\n }\n }\n }\n // Keep the shared reducer authoritative during rolling deploys too: a\n // newer client can recognize an empty reasoning/generation boundary that\n // an older session_state endpoint still reports as idle.\n const snapshotBusy = (serverBusy ?? false) || threadBusy(msgs);\n // The stream is the fastest source for progress text. The server snapshot\n // is the durable reconnect fallback: restore a missed start and clear a\n // missed done without timing heuristics.\n if (serverTool && !activeSteps.has(serverTool.id)) {\n // A durably parked turn waiting for the execution host to reconnect reads\n // as a real \"waiting for your machine\" state, not a spinning tool.\n activeSteps.set(\n serverTool.id,\n serverTool.waitingForHost ? \"waiting for your machine to reconnect\" : serverTool.name || \"working\"\n );\n refreshStatus();\n } else if (serverBusy !== null && !serverTool && activeSteps.size) {\n activeSteps.clear();\n refreshStatus();\n }\n // Don't let a snapshot taken BEFORE our just-sent message landed clear\n // the optimistic Working state; the server's first busy=true (or the\n // hold expiring) hands authority back to the snapshot.\n if (snapshotBusy) optimisticBusyUntil = 0;\n busy = snapshotBusy || Date.now() < optimisticBusyUntil;\n tui.setWorking(busy);\n if (!busy) {\n // Turn finished — clear any stale step + in-progress live count.\n if (activeSteps.size) activeSteps.clear();\n liveOut = 0;\n refreshStatus();\n }\n refreshBgCount();\n void relayApprovals().catch(() => {});\n\n // Context gauge: the runtime records the latest request's input tokens\n // (the true serialized context size) and the model's window to thread KV.\n // Scaled to the COMPACTION POINT, not the raw window: the instance triggers\n // background compaction at half the model's context (its\n // TRIGGER_CONTEXT_FRACTION), so 100% here = \"compaction is about to run\",\n // which is the only ceiling the user can actually hit.\n const COMPACTION_TRIGGER_FRACTION = 0.5;\n // Mirrors the instance's TRIGGER_TOKENS_CAP: compaction fires at\n // min(50% of the window, 50k tokens), so the gauge tops out there too.\n const COMPACTION_TRIGGER_CAP = 50_000;\n try {\n const cu = (await api.kvGet(threadId, \"context_usage\")) as\n | { inputTokens?: number; maxContextTokens?: number }\n | null;\n const used = Number(cu?.inputTokens) || 0;\n const max = Math.min(\n (Number(cu?.maxContextTokens) || 0) * COMPACTION_TRIGGER_FRACTION || Infinity,\n COMPACTION_TRIGGER_CAP,\n );\n tui.setContextPct(max > 0 && used > 0 ? (used / max) * 100 : null);\n } catch {\n // ignore — gauge is best-effort\n }\n };\n projectionSnapshot = new EpochSnapshot(\n reconcileProjection,\n () => connectionEpoch,\n );\n let projectionDebounce: ReturnType<typeof setTimeout> | null = null;\n scheduleProjectionRefresh = () => {\n if (projectionDebounce) return;\n projectionDebounce = setTimeout(() => {\n projectionDebounce = null;\n // Event-driven: a read already running may have started before the record\n // that woke us, so this always reads again.\n void projectionSnapshot?.refresh();\n }, 250);\n };\n // Paint the transcript before handing the terminal to the session loop. The\n // socket has usually opened by now, in which case its own reconciliation read\n // is this read — one request, not two. When it has not (connect() also\n // resolves on its timeout), this reads at epoch 0 and the later open still\n // reconciles for itself.\n await projectionSnapshot.reconcile(connectionEpoch);\n\n // Event-driven from here. The promise resolves only on `/clear` — quit exits\n // the process without ever resolving it.\n await sessionEnded;\n\n // ── /clear teardown: silence this session so the next one owns the TUI ────\n if (projectionDebounce) clearTimeout(projectionDebounce);\n process.off(\"SIGCONT\", onTerminalResume);\n // `/clear` abandons this thread deliberately, so stop its turn — otherwise\n // the runner's daemon would keep working on a conversation the user just\n // ended. (Quitting the terminal is the opposite case and leaves it running.)\n // Background processes belong to that daemon and outlive the thread.\n const stopped = api.stopThread(threadId).catch(() => {});\n stopWatchingConnection();\n stopSessionEvents();\n stream.close();\n subActivity.closeAll();\n await Promise.race([stopped, new Promise((r) => setTimeout(r, 1500))]);\n // Reset the live bottom-region signals so nothing from the old thread lingers\n // while the new session boots and re-seeds them.\n tui.setWorking(false);\n tui.setSubagents([]);\n tui.setGoal(null);\n tui.setQueuedMessages([]);\n tui.setContextPct(null);\n tui.setStep(null, 0);\n tui.setBackgroundCount(0);\n tui.print(`${c.dim}── conversation cleared — starting a fresh session ──${c.reset}`);\n}\n\ninterface BgManager {\n list: () => Promise<{ id: string; command: string; description?: string; status: string; pid: number; exitCode?: number | null }[]>;\n stop: (id: string) => Promise<void>;\n}\n\ninterface SkillsController {\n list: () => Promise<SkillInfo[]>;\n setEnabled: (name: string, enabled: boolean) => Promise<void>;\n remove: (name: string) => Promise<void>;\n /** Seed an install request into the main chat for the agent to research + install. */\n requestInstall: (query: string) => void;\n}\n\n/**\n * Interactive skills control surface (reached via `/skills`). Lists installed\n * skills with enabled state, and lets you install (free-text request handled\n * by the agent in-chat), enable/disable, inspect, and remove — all menu-driven.\n */\nasync function runSkillsMenu(tui: Tui, skills: SkillsController): Promise<void> {\n let list: SkillInfo[];\n try {\n list = await skills.list();\n } catch (e) {\n tui.print(`${c.red}✗ couldn't load skills:${c.reset} ${c.gray}${e instanceof Error ? e.message : String(e)}${c.reset}`);\n return;\n }\n\n const INSTALL = \"__install__\";\n const items = list.map((s) => ({\n label: s.name,\n hint: `${s.enabled ? \"enabled\" : \"disabled\"} · ${s.files.length} file${s.files.length === 1 ? \"\" : \"s\"}`,\n value: s.name,\n }));\n items.push({ label: \"+ Install a skill…\", hint: \"find & install\", value: INSTALL });\n\n const picked = await tui.select(\n `${c.bold}Agent skills${c.reset} ${c.dim}(↑/↓ · enter · esc to close)${c.reset}`,\n items\n );\n if (!picked) return;\n\n if (picked === INSTALL) {\n const query = await tui.prompt(\n \"What skill do you want to install?\",\n \"the anthropic pdf skill / a skill for writing conventional commits\"\n );\n if (query) skills.requestInstall(query);\n return;\n }\n\n const skill = list.find((s) => s.name === picked)!;\n tui.print(`${c.cyan}${skill.name}${c.reset}${skill.version ? ` ${c.dim}v${skill.version}${c.reset}` : \"\"} ${c.gray}— ${skill.description}${c.reset}`);\n const action = await tui.select(`${c.bold}${picked}${c.reset}`, [\n skill.enabled\n ? { label: \"Disable (hide from the agent)\", value: \"disable\" as const }\n : { label: \"Enable\", value: \"enable\" as const },\n { label: \"View files\", value: \"files\" as const },\n { label: \"Remove this skill\", value: \"remove\" as const },\n { label: \"Back\", value: \"back\" as const },\n ]);\n\n try {\n if (action === \"enable\" || action === \"disable\") {\n await skills.setEnabled(picked, action === \"enable\");\n tui.print(`${c.gray}${action}d ${picked}${c.reset}`);\n } else if (action === \"files\") {\n for (const f of skill.files) tui.print(` ${c.gray}${f}${c.reset}`);\n } else if (action === \"remove\") {\n await skills.remove(picked);\n tui.print(`${c.gray}removed ${picked}${c.reset}`);\n }\n } catch (e) {\n tui.print(`${c.red}✗ ${e instanceof Error ? e.message : String(e)}${c.reset}`);\n }\n}\n\n/** The executing daemon's published MCP catalog, read from the thread KV. */\ninterface McpCatalog {\n servers: {\n name: string;\n status: string;\n tools: { name: string; description?: string }[];\n resources: { uri: string }[];\n error?: string;\n }[];\n}\n\ninterface McpController {\n /** This machine's `mcp.json` entries. */\n configured: () => McpServerConfig[];\n /** What the session's daemon actually has connected. */\n catalog: () => Promise<McpCatalog>;\n add: (cfg: McpServerConfig) => Promise<void>;\n remove: (name: string) => void;\n setEnabled: (name: string, enabled: boolean) => void;\n /** Seed an install request into the main chat for the agent to research + install. */\n requestInstall: (query: string) => void;\n}\n\n/** The `/` configuration menu: clear, permission mode, approvals, processes, shortcuts, sign out, quit. */\n/** The auto-accept level submenu (reached via `/level`). */\nasync function runLevelMenu(tui: Tui, perm: PermissionState): Promise<void> {\n const picked = await tui.select(\n `${c.bold}Auto-accept level${c.reset} ${c.dim}(↑/↓ · enter · shift-tab cycles)${c.reset}`,\n LEVELS.map((l) => ({\n label: levelLabel(l),\n hint: l === tui.level ? \"current\" : \"\",\n value: l,\n }))\n );\n if (picked) {\n tui.setLevel(picked);\n perm.level = picked;\n }\n}\n\n/**\n * `/machines` — manage the machines on your account: list them (name,\n * hostname, platform, version, online status, projects), rename, force a\n * standardcode update, and add/remove project directories. The LOCAL machine\n * is managed directly (this client is on its filesystem); a REMOTE machine is\n * managed by queueing a command whose account-stream invalidation wakes its daemon.\n */\nasync function runMachinesMenu(\n tui: Tui,\n api: ApiClient,\n accountStream: AccountUserStream,\n self: MachineIdentity\n): Promise<void> {\n let machines: MachineRecord[];\n try {\n machines = await loadMachines(api);\n } catch (e) {\n tui.print(`${c.red}✗ couldn't load machines:${c.reset} ${c.gray}${e instanceof Error ? e.message : String(e)}${c.reset}`);\n return;\n }\n if (!machines.length) {\n tui.print(`${c.gray}No machines registered yet. Run standardcode on a machine (or install its daemon) to register it.${c.reset}`);\n return;\n }\n machines.sort((a, b) => (b.updated_at ?? 0) - (a.updated_at ?? 0));\n\n const picked = await tui.select(\n `${c.bold}Your machines${c.reset} ${c.dim}(↑/↓ · enter · esc)${c.reset}`,\n machines.map((m) => {\n const isSelf = m.id === self.machine_id;\n const online = daemonOnline(m);\n const daemonBit = m.daemon ? (online ? \"daemon online\" : \"daemon offline\") : \"no daemon\";\n const nproj = Object.keys(m.projects).length;\n return {\n label: `${machineIcon(m)} ${m.name}${isSelf ? \" (this machine)\" : \"\"}`,\n hint: `${m.hostname} · ${m.platform}/${m.arch} · v${m.version ?? \"?\"} · ${daemonBit} · ${nproj} project${nproj === 1 ? \"\" : \"s\"}`,\n value: m.id,\n };\n })\n );\n if (!picked) return;\n const machine = machines.find((m) => m.id === picked)!;\n await manageMachine(tui, api, accountStream, self, machine);\n}\n\n/** Submenu for one machine: rename / update / projects. */\nasync function manageMachine(\n tui: Tui,\n api: ApiClient,\n accountStream: AccountUserStream,\n self: MachineIdentity,\n machine: MachineRecord\n): Promise<void> {\n const isSelf = machine.id === self.machine_id;\n const online = daemonOnline(machine);\n // Rename is an ACCOUNT edit — works for any machine with no daemon needed.\n // Update / project changes act on the machine's filesystem, so they need a\n // daemon there (queued for a remote machine); this machine can always do them.\n const canRunCommands = isSelf || !!machine.daemon;\n\n const options: { label: string; hint?: string; value: string }[] = [\n { label: \"Rename\", value: \"rename\" },\n { label: \"Set icon\", hint: machine.icon || \"default\", value: \"icon\" },\n ];\n if (canRunCommands) {\n options.push(\n { label: \"Update standardcode\", hint: `v${machine.version ?? \"?\"} → latest`, value: \"update\" },\n { label: \"Manage projects\", hint: `${Object.keys(machine.projects).length}`, value: \"projects\" }\n );\n }\n options.push({ label: \"Back\", value: \"back\" });\n\n if (!isSelf && !machine.daemon) {\n tui.print(\n `${c.dim}${machine.name} has no daemon — you can rename it here; update and project changes need its daemon installed.${c.reset}`\n );\n } else if (!isSelf && machine.daemon && !online) {\n tui.print(\n `${c.dim}${machine.name}'s daemon is offline — queued changes apply when it next comes online.${c.reset}`\n );\n }\n\n const action = await tui.select(`${c.bold}${machineIcon(machine)} ${machine.name}${c.reset}`, options);\n if (!action || action === \"back\") return;\n\n if (action === \"icon\") {\n const current = machine.icon ?? \"\";\n const emoji = await tui.prompt(\n `${c.bold}Icon for ${machine.name}${c.reset} ${c.dim}(paste an emoji, blank to reset)${c.reset}`,\n current\n );\n if (emoji !== null) {\n const trimmed = emoji.trim();\n await setMachineIcon(api, machine.id, trimmed);\n machine.icon = trimmed || undefined;\n tui.print(`${c.green}✓${c.reset} icon ${trimmed ? `set to ${trimmed}` : \"reset\"} for ${machine.name}`);\n }\n return manageMachine(tui, api, accountStream, self, machine);\n }\n\n // update / project changes: apply directly on the local machine, or queue a\n // command for a remote machine's daemon to drain.\n const dispatch = async (\n kind: MachineCommand[\"kind\"],\n args?: Record<string, unknown>\n ): Promise<void> => {\n if (isSelf) {\n await applyMachineCommand(api, self, { id: \"local\", kind, args, requested_at: Date.now() });\n } else {\n await enqueueMachineCommand(api, machine.id, kind, args);\n }\n };\n const applyNote = isSelf\n ? \"applied\"\n : `queued — ${machine.name}'s daemon will apply it within ~10s`;\n\n if (action === \"rename\") {\n const name = await tui.prompt(`New name for ${machine.name}`, machine.name);\n if (name === null || !name.trim()) return;\n // Names are ACCOUNT data — a direct user-KV write, authoritative for any\n // machine (no daemon round-trip, can't be reverted by a heartbeat).\n await setMachineName(api, machine.id, name.trim());\n tui.print(`${c.green}✓${c.reset} Renamed ${c.bold}${machine.name}${c.reset} → ${c.bold}${name.trim()}${c.reset}.`);\n } else if (action === \"update\") {\n if (isSelf) {\n // Updating THIS machine's CLI = the normal foreground update.\n await runUpdateCommand(tui);\n } else {\n const go = await tui.select(`Force ${machine.name} to update standardcode now?`, [\n { label: \"Yes, update & restart its daemon\", value: \"yes\" as const },\n { label: \"Cancel\", value: \"no\" as const },\n ]);\n if (go !== \"yes\") return;\n await dispatch(\"update\");\n tui.print(`${c.green}✓${c.reset} Update ${c.gray}${applyNote} (its daemon updates and restarts on the new version).${c.reset}`);\n }\n } else if (action === \"projects\") {\n await manageMachineProjects(tui, api, accountStream, self, machine, dispatch, applyNote);\n }\n}\n\n/** Add/remove project directories on a machine. */\nasync function manageMachineProjects(\n tui: Tui,\n api: ApiClient,\n accountStream: AccountUserStream,\n self: MachineIdentity,\n machine: MachineRecord,\n dispatch: (kind: MachineCommand[\"kind\"], args?: Record<string, unknown>) => Promise<void>,\n applyNote: string\n): Promise<void> {\n const ADD = \"__add__\";\n const paths = Object.keys(machine.projects).sort();\n const projLabels = projectDisplayLabels(machine.projects);\n const picked = await tui.select(\n `${c.bold}Projects on ${machine.name}${c.reset} ${c.dim}(↑↓ · enter · esc)${c.reset}`,\n [\n ...paths.map((p) => ({\n label: projLabels.get(p) ?? projectDisplayName(p, machine.projects[p]),\n detail: p,\n value: p,\n })),\n { label: \"+ Add a project directory…\", hint: \"absolute path\", value: ADD },\n ],\n { spaced: true }\n );\n if (!picked) return;\n if (picked === ADD) {\n // Browse instead of typing: this machine's filesystem directly, or a\n // remote machine's through its daemon's fs-browse RPC.\n const isSelf = machine.id === self.machine_id;\n const backend = isSelf\n ? localBrowseBackend(machine.name)\n : remoteBrowseBackend(api, accountStream, machine.id, machine.name);\n const chosen = await pickDirectory(tui, backend, {\n startPath: isSelf ? process.cwd() : null,\n loader: startLoader,\n });\n if (!chosen) return;\n await dispatch(\"add_project\", { path: chosen });\n tui.print(`${c.green}✓${c.reset} Add ${chosen} ${c.gray}${applyNote}.${c.reset}`);\n return;\n }\n const project = machine.projects[picked];\n const displayName = projectDisplayName(picked, project);\n const action = await tui.select(`${c.bold}${displayName}${c.reset} ${c.dim}${shortenPath(picked, 48)}${c.reset}`, [\n { label: \"Rename\", hint: \"display name only — the directory is untouched\", value: \"rename\" as const },\n { label: \"Remove from this machine's projects\", hint: \"doesn't delete the directory\", value: \"remove\" as const },\n { label: \"Back\", value: \"back\" as const },\n ]);\n if (!action || action === \"back\") return;\n if (action === \"rename\") {\n const name = await tui.prompt(\n `New name for ${displayName} (blank resets to the directory name)`,\n displayName\n );\n if (name === null) return;\n // Project names are ACCOUNT data (the `.projnames` key) — a direct\n // user-KV write like a machine rename: no daemon round-trip, never\n // reverted by a heartbeat, and the directory on disk is untouched.\n await setProjectName(api, machine.id, picked, name);\n const now = name.trim() || projectDisplayName(picked, null);\n if (project) project.name = now;\n tui.print(`${c.green}✓${c.reset} Renamed ${c.bold}${displayName}${c.reset} → ${c.bold}${now}${c.reset}.`);\n } else {\n await dispatch(\"remove_project\", { path: picked });\n tui.print(`${c.green}✓${c.reset} Remove ${picked} ${c.gray}${applyNote}.${c.reset}`);\n }\n}\n\n/**\n * `/daemon` — which machine's daemon runs this session + how to install the\n * daemon on this machine. Installation itself runs outside the TUI\n * (`standardcode daemon install`) because it needs plain readline + launchd/\n * systemd interaction.\n */\nfunction showDaemonInfo(tui: Tui, session: SessionLocation): void {\n if (session.mode === \"remote\" && session.runner) {\n tui.print(\n `${c.gray}This session runs on${c.reset} ${c.bold}${session.runner.name}${c.reset} ${c.gray}(${session.runner.hostname}) — its daemon executes the tools.${c.reset}`\n );\n } else {\n tui.print(\n `${c.gray}This session runs on${c.reset} ${c.bold}${session.localName}${c.reset} ${c.gray}— this machine's daemon executes the tools.${c.reset}`\n );\n }\n const status = serviceStatus();\n tui.print(\n `${c.gray}Daemon on this machine:${c.reset} ${status.installed ? status.detail : \"not installed\"}`\n );\n if (!status.installed) {\n tui.print(\n `${c.gray}Install it so this machine can run sessions:${c.reset} ${c.bold}standardcode daemon install${c.reset}`\n );\n tui.print(\n `${c.dim}The daemon is the executor on every machine: it runs the agent's tools, keeps working after you close the terminal, self-restarts, self-updates, and picks up sessions you start from anywhere.${c.reset}`\n );\n } else {\n tui.print(`${c.dim}Daemon commands: standardcode daemon status | restart | update | uninstall.${c.reset}`);\n tui.print(`${c.dim}Add a project: standardcode daemon add-project /absolute/path/to/project${c.reset}`);\n }\n}\n\n/** Print the keyboard-shortcut reference (reached via `/keybindings`). */\nfunction showKeybindings(tui: Tui): void {\n tui.print(`${c.gray}shortcuts:${c.reset}`);\n tui.print(`${c.gray} shift-tab${c.reset} cycle auto-accept level (1–5)`);\n tui.print(`${c.gray} shift-⏎${c.reset} insert a newline (multiline input)`);\n tui.print(`${c.gray} option-⏎${c.reset} steer now — stops the current step and plays your message`);\n tui.print(`${c.gray} /${c.reset} open the command palette (type to filter)`);\n tui.print(`${c.gray} !cmd${c.reset} run a shell command on the session's machine (e.g. !ls); !! to send a literal !`);\n tui.print(`${c.gray} ctrl-v${c.reset} paste an image from the clipboard ([#Image 1])`);\n tui.print(`${c.gray} ↑ / ↓${c.reset} cycle past messages (on the input's top line)`);\n tui.print(`${c.gray} ←${c.reset} from the start of the input: select the [⚙ n bg] badge (enter opens it)`);\n tui.print(`${c.gray} ctrl-c${c.reset} quit`);\n}\n\n/** Check npm for a newer version and prompt to update. */\nasync function runUpdateCommand(tui: Tui): Promise<void> {\n const version = readVersion();\n const result = await forceCheckForUpdate(version);\n if (!result) {\n tui.print(`${c.green}✓${c.reset} ${c.gray}@standardagents/code${c.reset} is up to date (v${version})`);\n return;\n }\n const { latest } = result;\n tui.print(`\\n ${c.yellow}⟳${c.reset} Update available: ${c.gray}v${version}${c.reset} → ${c.green}v${latest}${c.reset}`);\n // Update through the package manager that owns this install — updating a\n // pnpm/bun/yarn-managed global with npm would fork it into competing copies.\n const pm = detectPackageManager();\n if (!pm) {\n tui.print(` ${c.gray}This is a source checkout — pull the repo to update.${c.reset}`);\n return;\n }\n const { display } = updateCommand(pm);\n const choice = await tui.select(`Update now with \\`${display}\\`?`, [\n { label: \"Yes, update now\", value: \"yes\" as const },\n { label: \"No, skip\", value: \"no\" as const },\n ]);\n if (choice === \"yes\") {\n tui.print(` ${c.gray}Running ${display}…${c.reset}`);\n const { ok, output: pmOutput } = await runUpdate(pm);\n if (ok) {\n tui.print(` ${c.green}✓${c.reset} Updated to v${latest}. Restart to use the new version.`);\n } else {\n tui.print(` ${c.red}✗${c.reset} Update failed:`);\n for (const line of pmOutput.trim().split(\"\\n\").slice(-6)) {\n tui.print(` ${c.dim}${line}${c.reset}`);\n }\n }\n } else {\n tui.print(` ${c.gray}Skipped. Run /update later.${c.reset}`);\n }\n}\n\n/** Submenu listing tracked background processes; lets you stop a running one. */\nasync function runProcessMenu(tui: Tui, bg: BgManager): Promise<void> {\n const procs = await bg.list();\n if (!procs.length) {\n tui.print(`${c.gray}No background processes for this session.${c.reset}`);\n return;\n }\n const items = procs.map((p) => {\n const status =\n p.status === \"running\"\n ? `${c.green}running${c.reset}`\n : `${c.gray}${p.status}${typeof p.exitCode === \"number\" ? ` (exit ${p.exitCode})` : \"\"}${c.reset}`;\n return {\n label: `${p.description || p.command}`,\n hint: `${p.id} · ${status}`,\n value: p.id,\n };\n });\n const picked = await tui.select(\n `${c.bold}Background processes${c.reset} ${c.dim}(↑/↓ · enter to manage · esc to close)${c.reset}`,\n items\n );\n if (!picked) return;\n const proc = procs.find((p) => p.id === picked);\n if (!proc || proc.status !== \"running\") {\n tui.print(`${c.gray}${picked} is not running.${c.reset}`);\n return;\n }\n const action = await tui.select(`${c.bold}${proc.description || proc.command}${c.reset}`, [\n { label: \"Stop it now\", value: \"stop\" as const },\n { label: \"Leave it running\", value: \"leave\" as const },\n ]);\n if (action === \"stop\") await bg.stop(picked);\n}\n\n/** Submenu showing the session's pre-approved tools/risk levels; pick one to revoke. */\nasync function runApprovalsMenu(tui: Tui, perm: PermissionState, save: () => void): Promise<void> {\n const tools = Array.from(perm.alwaysAllow).sort();\n const risks = Array.from(perm.allowRisk).sort((a, b) => a - b);\n if (!tools.length && !risks.length) {\n tui.print(\n `${c.gray}No pre-approved commands. At a permission prompt, choose \"Always allow this tool\" or \"Allow all level N\" to add some.${c.reset}`\n );\n return;\n }\n const items = [\n ...tools.map((t) => ({ label: `Tool: ${t}`, hint: \"always allowed\", value: `tool:${t}` })),\n ...risks.map((r) => ({ label: `Risk level ${r} and below`, hint: \"auto-accepted\", value: `risk:${r}` })),\n { label: \"Clear all approvals\", hint: \"\", value: \"clear\" },\n ];\n const picked = await tui.select(\n `${c.bold}Approved commands${c.reset} ${c.dim}(enter to revoke · esc to close)${c.reset}`,\n items\n );\n if (!picked) return;\n if (picked === \"clear\") {\n perm.alwaysAllow.clear();\n perm.allowRisk.clear();\n tui.print(`${c.gray}cleared all approvals${c.reset}`);\n } else if (picked.startsWith(\"tool:\")) {\n const t = picked.slice(5);\n perm.alwaysAllow.delete(t);\n tui.print(`${c.gray}revoked tool ${t}${c.reset}`);\n } else if (picked.startsWith(\"risk:\")) {\n const r = Number(picked.slice(5));\n perm.allowRisk.delete(r);\n tui.print(`${c.gray}revoked level ${r}${c.reset}`);\n }\n save();\n}\n\n/**\n * Interactive MCP control surface (reached via `/` → \"MCP servers\"). Lists\n * this machine's configured servers next to what the machine's daemon has\n * connected, and lets you add (free-text command), view tools, enable/disable,\n * and remove — all menu-driven.\n *\n * The menu edits `~/.standardagents/mcp.json`; the DAEMON is the MCP host and\n * connects the enabled servers when it next attaches a session on this\n * machine. So every edit is reported as applying to the next session here —\n * the CLI never spawns an MCP server itself.\n */\nconst MCP_APPLY_NOTE = \"applies to the next session on this machine\";\n\nasync function runMcpMenu(tui: Tui, mcp: McpController): Promise<void> {\n const configured = mcp.configured();\n const cat = await mcp.catalog();\n\n const INSTALL = \"__install__\";\n const ADD_MANUAL = \"__manual__\";\n const items = configured.map((s) => {\n const entry = cat.servers.find((e) => e.name === s.name);\n const status = !s.enabled\n ? \"disabled\"\n : entry?.status === \"connected\"\n ? `connected · ${entry.tools.length} tools`\n : entry?.error\n ? \"error\"\n : \"not connected yet\";\n return { label: s.name, hint: status, value: s.name };\n });\n items.push({ label: \"+ Install a new MCP server…\", hint: \"find & install\", value: INSTALL });\n items.push({ label: \"Add manually (name: command)…\", hint: \"advanced\", value: ADD_MANUAL });\n\n const picked = await tui.select(\n `${c.bold}MCP servers${c.reset} ${c.dim}hosted by this machine's daemon · ↑/↓ · enter · esc${c.reset}`,\n items\n );\n if (!picked) return;\n\n if (picked === INSTALL) {\n await installMcpServerFlow(tui, mcp);\n return;\n }\n if (picked === ADD_MANUAL) {\n await addMcpServer(tui, mcp);\n return;\n }\n\n const server = configured.find((s) => s.name === picked)!;\n\n const action = await tui.select(`${c.bold}${picked}${c.reset}`, [\n { label: \"View tools\", value: \"tools\" as const },\n server.enabled\n ? { label: \"Disable (don't auto-connect)\", value: \"disable\" as const }\n : { label: \"Enable (auto-connect on start)\", value: \"enable\" as const },\n { label: \"Remove this server\", value: \"remove\" as const },\n { label: \"Back\", value: \"back\" as const },\n ]);\n\n if (action === \"tools\") {\n const entry = cat.servers.find((e) => e.name === picked);\n if (!entry || entry.status !== \"connected\") {\n tui.print(`${c.gray}${picked} isn't connected in this session — the daemon connects enabled servers when a session starts.${c.reset}`);\n return;\n }\n if (!entry.tools.length) tui.print(`${c.gray}${picked} exposes no tools.${c.reset}`);\n for (const t of entry.tools) tui.print(` ${c.cyan}${t.name}${c.reset}${t.description ? ` ${c.gray}— ${t.description}${c.reset}` : \"\"}`);\n if (entry.resources.length) tui.print(` ${c.gray}${entry.resources.length} resource(s)${c.reset}`);\n } else if (action === \"enable\") {\n mcp.setEnabled(picked, true);\n tui.print(`${c.gray}enabled ${picked} — ${MCP_APPLY_NOTE}.${c.reset}`);\n } else if (action === \"disable\") {\n mcp.setEnabled(picked, false);\n tui.print(`${c.gray}disabled ${picked} — ${MCP_APPLY_NOTE}.${c.reset}`);\n } else if (action === \"remove\") {\n mcp.remove(picked);\n tui.print(`${c.gray}removed ${picked} — ${MCP_APPLY_NOTE}.${c.reset}`);\n }\n}\n\n/** Prompt for a new MCP server (`name: command args`) and save it. */\nasync function addMcpServer(tui: Tui, mcp: McpController): Promise<void> {\n const spec = await tui.prompt(\n \"Add an MCP server — enter name: command [args…]\",\n \"fs: npx -y @modelcontextprotocol/server-filesystem .\"\n );\n if (!spec) return;\n const cfg = parseServerSpec(spec);\n if (!cfg) {\n tui.print(`${c.yellow}couldn't parse that. Use name: command [args]${c.reset}`);\n return;\n }\n await mcp.add(cfg);\n tui.print(\n `${c.cyan}⚡ MCP \"${cfg.name}\" saved${c.reset} ${c.gray}(${cfg.command} ${cfg.args.join(\" \")}) — ${MCP_APPLY_NOTE}.${c.reset}`\n );\n}\n\n/**\n * The \"Install a new MCP server\" flow: ask what the user wants, then seed that\n * request into the main chat. The agent researches the right server (via\n * research_agent) and installs it (the mcp tool's install action) right there\n * in the transcript — so the same thing happens whether you use this menu or\n * just ask in chat. We land straight back in the conversation.\n */\nasync function installMcpServerFlow(tui: Tui, mcp: McpController): Promise<void> {\n const query = await tui.prompt(\n \"What MCP server do you want to install?\",\n \"the best computer-use mcp server for mac\"\n );\n if (!query) return;\n mcp.requestInstall(query);\n}\n\nmain().catch((err) => {\n process.stderr.write(`\\n${err instanceof Error ? err.stack || err.message : String(err)}\\n`);\n process.exit(1);\n});\n"]}