@standardagents/code 0.6.1 → 0.6.2
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 +25 -11
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/api.ts","../src/permissions.ts","../src/approvals.ts","../src/heartbeat.ts","../src/render.ts","../src/bridge.ts","../src/process-registry.ts","../src/mcp-config.ts","../src/host-tools.ts","../src/stream.ts","../src/events-stream.ts","../src/wordmill.ts","../src/types.ts","../src/clipboard.ts","../src/tui.ts","../src/history.ts","../src/markdown.ts","../src/mcp.ts","../src/credentials.ts","../src/check-update.ts","../src/index.ts"],"names":["clean","DIM","RESET","cols","path","os","KEY","fs","input","isAlive","hasToolCalls","c","clamp","BOLD","spawn","crypto","output","parseArgs","readline","connecting","check","stopped","procsStopped","killed"],"mappings":"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","file":"index.js","sourcesContent":["/** Minimal REST client for the Standard Agents instance. */\nimport type { ThreadSummary } from \"./types.ts\";\n\n/** Outcome of an endpoint+token check, with a human-precise failure story. */\nexport type VerifyResult =\n | { ok: true }\n | { ok: false; reason: string; hint?: string };\n\n/**\n * Turn a fetch() failure into a precise, human explanation. Node reports the\n * real cause (DNS, refused, timeout, TLS, offline) as error codes buried in\n * the `cause` chain — surface them instead of a generic \"didn't work\".\n */\nfunction classifyConnectError(err: unknown, endpoint: string): VerifyResult {\n const host = endpoint.replace(/^https?:\\/\\//, \"\").replace(/\\/.*$/, \"\");\n // Collect codes + messages across the cause chain (undici nests them).\n const codes = new Set<string>();\n const messages: string[] = [];\n for (let e: any = err; e; e = e.cause) {\n if (typeof e.code === \"string\") codes.add(e.code);\n if (typeof e.message === \"string\") messages.push(e.message);\n if (Array.isArray(e.errors)) {\n for (const sub of e.errors) {\n if (typeof sub?.code === \"string\") codes.add(sub.code);\n if (typeof sub?.message === \"string\") messages.push(sub.message);\n }\n }\n }\n const text = messages.join(\" | \");\n const has = (...wanted: string[]) => wanted.some((w) => codes.has(w));\n\n if (has(\"ENOTFOUND\", \"EAI_AGAIN\")) {\n return {\n ok: false,\n reason: `Can't resolve ${host} — no such hostname from this machine.`,\n hint: \"The endpoint URL is probably wrong (typo, or that server isn't running). Check the URL, your VPN, and local DNS.\",\n };\n }\n if (has(\"ECONNREFUSED\")) {\n return {\n ok: false,\n reason: `${host} refused the connection — nothing is listening there.`,\n hint: \"The instance looks stopped. Start it (or check the port in the endpoint URL).\",\n };\n }\n if (has(\"EHOSTUNREACH\", \"ENETUNREACH\", \"ENETDOWN\")) {\n return {\n ok: false,\n reason: `No route to ${host} — the network looks down or unreachable.`,\n hint: \"Check your internet connection / VPN.\",\n };\n }\n if (has(\"ETIMEDOUT\", \"UND_ERR_CONNECT_TIMEOUT\", \"UND_ERR_HEADERS_TIMEOUT\") || (err as any)?.name === \"TimeoutError\") {\n return {\n ok: false,\n reason: `${host} didn't answer in time.`,\n hint: \"The server may be overloaded or a firewall is eating the traffic. Try again.\",\n };\n }\n if (\n has(\n \"UNABLE_TO_VERIFY_LEAF_SIGNATURE\",\n \"DEPTH_ZERO_SELF_SIGNED_CERT\",\n \"SELF_SIGNED_CERT_IN_CHAIN\",\n \"CERT_HAS_EXPIRED\",\n \"ERR_TLS_CERT_ALTNAME_INVALID\"\n ) || /certificate|TLS|SSL/i.test(text)\n ) {\n return {\n ok: false,\n reason: `TLS problem talking to ${host}: ${text.slice(0, 120)}`,\n hint: \"For local/self-signed endpoints, use the http:// URL or trust the local CA.\",\n };\n }\n return {\n ok: false,\n reason: `Couldn't reach ${host}${text ? ` (${text.slice(0, 120)})` : \"\"}.`,\n hint: \"This is a connection problem, not a token problem — check the endpoint URL and your network.\",\n };\n}\n\n/** A subagent child thread with its current lifecycle status. */\nexport interface SubagentInfo {\n id: string;\n agent_name: string | null;\n title: string | null;\n threadName: string | null;\n status: string; // \"running\" | \"idle\" | \"terminated\" | custom\n}\n\n/** An installed Agent Skill's registry metadata. */\nexport interface SkillInfo {\n name: string;\n description: string;\n version?: string;\n enabled: boolean;\n files: string[];\n}\n\n/** A file attachment on an outgoing message (the instance's message-POST shape). */\nexport interface MessageAttachment {\n name: string;\n mimeType: string;\n data: string; // base64 encoded\n width?: number;\n height?: number;\n}\n\nexport interface GoalStep {\n step: string;\n status?: string; // \"pending\" | \"in_progress\" | \"done\"\n}\nexport interface GoalData {\n summary: string | null; // short ~5-word label shown while the goal is pursued\n description: string | null;\n steps: GoalStep[];\n}\n\nexport class ApiClient {\n constructor(\n private endpoint: string,\n private token: string\n ) {}\n\n get wsEndpoint(): string {\n return this.endpoint.replace(/^http/, \"ws\");\n }\n\n /** The instance origin (used to build admin-UI links). */\n get origin(): string {\n return this.endpoint;\n }\n\n get bearer(): string {\n return this.token;\n }\n\n private async json<T>(pathname: string, init?: RequestInit): Promise<T> {\n const res = await fetch(`${this.endpoint}${pathname}`, {\n ...init,\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.token}`,\n ...(init?.headers || {}),\n },\n });\n const text = await res.text();\n if (!res.ok) {\n throw new Error(`${init?.method || \"GET\"} ${pathname} -> ${res.status}: ${text.slice(0, 300)}`);\n }\n try {\n return JSON.parse(text) as T;\n } catch {\n return text as unknown as T;\n }\n }\n\n async verify(): Promise<boolean> {\n return (await this.verifyDetailed()).ok;\n }\n\n /**\n * Check the endpoint + token and say PRECISELY what's wrong when they\n * fail. \"That token didn't work\" is a lie when the real problem is a typo'd\n * hostname, a stopped server, or a dead network — sign-in errors must let\n * the user tell those apart from an actually-rejected key.\n */\n async verifyDetailed(): Promise<VerifyResult> {\n let res: Response;\n try {\n res = await fetch(`${this.endpoint}/api/auth/me`, {\n headers: { Authorization: `Bearer ${this.token}` },\n signal: AbortSignal.timeout(15_000),\n });\n } catch (err) {\n return classifyConnectError(err, this.endpoint);\n }\n if (res.ok) return { ok: true };\n if (res.status === 401) {\n return {\n ok: false,\n reason: \"The instance rejected this token — it's invalid, expired, or was revoked.\",\n hint: \"Create a fresh API key in the instance settings (or press Enter to sign in with your browser). Keys only work on the instance that minted them.\",\n };\n }\n if (res.status === 403) {\n return {\n ok: false,\n reason: \"The token was recognized, but this account isn't allowed to use the API here.\",\n hint: \"Ask an instance admin to grant access, or use a different account's key.\",\n };\n }\n if (res.status === 404 || res.status === 405) {\n return {\n ok: false,\n reason: `${this.endpoint} answered, but it doesn't look like a Standard Agents instance (no /api/auth/me).`,\n hint: \"Double-check the endpoint URL — this may be a different service.\",\n };\n }\n if (res.status >= 500) {\n return {\n ok: false,\n reason: `The instance hit an error while checking the token (HTTP ${res.status}).`,\n hint: \"That's a server-side problem — check the instance's logs and try again.\",\n };\n }\n return { ok: false, reason: `The instance answered HTTP ${res.status} while checking the token.` };\n }\n\n /** Agent name → display title map (best effort; for labeling subagents). */\n async listAgents(): Promise<{ name: string; title: string }[]> {\n const res = await this.json<{ agents?: any[] } | any[]>(\"/api/agents\");\n const arr = Array.isArray(res) ? res : res.agents || [];\n return arr\n .filter((a) => a && typeof a.name === \"string\")\n .map((a) => ({ name: a.name, title: typeof a.title === \"string\" ? a.title : a.name }));\n }\n\n async createThread(agentId: string, tags: string[]): Promise<string> {\n const res = await this.json<{ threadId?: string; id?: string }>(\"/api/threads\", {\n method: \"POST\",\n body: JSON.stringify({ agent_id: agentId, tags }),\n });\n const id = res.threadId || res.id;\n if (!id) throw new Error(\"Thread create returned no id\");\n return id;\n }\n\n /**\n * List threads for an agent (or several variants of it), optionally\n * filtering to those carrying all given tags. Multiple ids exist because\n * the instance's model gearbox hands a session between agent variants — a\n * thread that last ran in another gear must still show up for resume.\n */\n async listThreads(agentId: string | string[], requireTags: string[]): Promise<ThreadSummary[]> {\n const ids = Array.isArray(agentId) ? agentId : [agentId];\n const pages = await Promise.all(\n ids.map((id) =>\n this.json<{ threads?: any[] } | any[]>(\n `/api/threads?agent_id=${encodeURIComponent(id)}&limit=100`\n ).catch(() => [] as any[])\n )\n );\n const arr = pages.flatMap((res) => (Array.isArray(res) ? res : (res as { threads?: any[] }).threads || []));\n return arr\n .map((t) => ({\n id: t.id,\n tags: Array.isArray(t.tags) ? t.tags : [],\n created_at: t.created_at,\n title: t.title,\n preview: t.preview || t.last_message,\n }))\n .filter((t: ThreadSummary) => requireTags.every((tag) => t.tags.includes(tag)));\n }\n\n /**\n * Subagent child threads of a thread, each with its current lifecycle status\n * (`running`/`idle`/`terminated`). Sourced from the parent's child registry,\n * which the live `/api/events` stream doesn't carry — so the CLI reads this to\n * learn which subagents are *actually running* (vs idle or finished), both on\n * (re)connect and whenever a subagent thread changes.\n */\n async listSubagents(threadId: string): Promise<SubagentInfo[]> {\n const res = await this.json<{ subagents?: any[] } | any[]>(\n `/api/threads/${threadId}/subagents`\n );\n const arr = Array.isArray(res) ? res : res.subagents || [];\n return arr\n .filter((s) => s && (s.id ?? s.reference))\n .map((s) => ({\n id: s.id ?? s.reference,\n agent_name: s.agent_name ?? s.name ?? null,\n title: s.title ?? null,\n threadName: s.threadName ?? s.thread_name ?? null,\n status: typeof s.status === \"string\" ? s.status : \"running\",\n }));\n }\n\n /**\n * Send a user message, optionally with attachments (e.g. pasted images).\n * Attachments use the instance's message-POST shape — base64 `data` +\n * `mimeType` — which the server stores in the thread filesystem and injects\n * into the LLM's vision context as real image content blocks.\n */\n async sendMessage(threadId: string, content: string, attachments?: MessageAttachment[]): Promise<void> {\n const body: Record<string, unknown> = { role: \"user\", content };\n if (attachments && attachments.length > 0) body.attachments = attachments;\n await this.json(`/api/threads/${threadId}/messages`, {\n method: \"POST\",\n body: JSON.stringify(body),\n });\n }\n\n async getMessages(threadId: string, limit = 50): Promise<any[]> {\n const res = await this.json<{ messages?: any[] } | any[]>(\n `/api/threads/${threadId}/messages?limit=${limit}`\n );\n return Array.isArray(res) ? res : res.messages || [];\n }\n\n async getLogs(threadId: string, limit = 100): Promise<any[]> {\n const res = await this.json<{ logs?: any[] } | any[]>(\n `/api/threads/${threadId}/logs?limit=${limit}&order=desc`\n );\n return Array.isArray(res) ? res : res.logs || [];\n }\n\n /**\n * Deliver a durable forwarded tool result to the thread, resuming the turn.\n * Retries with backoff — this is the durable delivery path, so it must land\n * even if the connection is briefly flaky after a permission wait.\n */\n async postToolResult(\n threadId: string,\n toolCallId: string,\n ok: boolean,\n result?: string,\n error?: string\n ): Promise<boolean> {\n const body = JSON.stringify({ tool_call_id: toolCallId, ok, result, error });\n for (let attempt = 0; attempt < 6; attempt++) {\n try {\n await this.json(`/api/threads/${threadId}/tool-result`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body,\n });\n return true;\n } catch {\n await new Promise((r) => setTimeout(r, Math.min(500 * 2 ** attempt, 8000)));\n }\n }\n return false;\n }\n\n /**\n * Download raw file bytes from the thread's filesystem (e.g. an\n * /attachments/* asset a subagent generated). Returns null on any failure.\n */\n async fetchFile(threadId: string, fsPath: string): Promise<Buffer | null> {\n const clean = fsPath.startsWith(\"/\") ? fsPath : `/${fsPath}`;\n try {\n const res = await fetch(`${this.endpoint}/api/threads/${threadId}/fs${clean}`, {\n headers: { Authorization: `Bearer ${this.token}` },\n });\n if (!res.ok) return null;\n return Buffer.from(await res.arrayBuffer());\n } catch {\n return null;\n }\n }\n\n /** Read a value from the thread's durable KV store (null if absent). */\n async kvGet(threadId: string, key: string): Promise<unknown> {\n try {\n const res = await this.json<{ value?: unknown }>(\n `/api/threads/${threadId}/kv?key=${encodeURIComponent(key)}`\n );\n return res?.value ?? null;\n } catch {\n return null; // 404 = key not yet set\n }\n }\n\n /** Write a value to the thread's durable KV store. */\n async kvSet(threadId: string, key: string, value: unknown): Promise<void> {\n try {\n await this.json(`/api/threads/${threadId}/kv`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ key, value }),\n });\n } catch {\n // best effort\n }\n }\n\n // ── skills (instance-global Agent Skills library) ─────────────────────────\n\n /** Installed skills — metadata only. Includes disabled skills. */\n async listSkills(): Promise<SkillInfo[]> {\n const res = await this.json<{ skills?: SkillInfo[] }>(`/api/skills?all=1`);\n return Array.isArray(res?.skills) ? res.skills : [];\n }\n\n /** Enable/disable an installed skill. */\n async setSkillEnabled(name: string, enabled: boolean): Promise<void> {\n await this.json(`/api/skills/${encodeURIComponent(name)}`, {\n method: \"PATCH\",\n body: JSON.stringify({ enabled }),\n });\n }\n\n /** Uninstall a skill. */\n async removeSkill(name: string): Promise<void> {\n await this.json(`/api/skills/${encodeURIComponent(name)}`, { method: \"DELETE\" });\n }\n\n /**\n * Kick off background conversation compaction now. Spawns the compaction\n * subagent directly server-side (so it fires even while the thread is idle).\n */\n async compact(threadId: string): Promise<void> {\n await this.json(`/api/threads/${threadId}/compact`, { method: \"POST\" });\n }\n\n async stop(threadId: string): Promise<void> {\n try {\n await this.json(`/api/threads/${threadId}/stop`, { method: \"POST\" });\n } catch {\n // best effort\n }\n }\n\n /** The thread's current goal (set via set_goal / update_goal_step). */\n async getGoal(threadId: string): Promise<GoalData> {\n try {\n const r = await this.json<Partial<GoalData>>(`/api/threads/${threadId}/goal`);\n return {\n summary: r?.summary ?? null,\n description: r?.description ?? null,\n steps: Array.isArray(r?.steps) ? r.steps : [],\n };\n } catch {\n return { summary: null, description: null, steps: [] };\n }\n }\n}\n","/**\n * Permission engine. Combines the current mode with the model-supplied risk\n * (1–5) to decide whether a forwarded tool runs automatically, needs the user's\n * approval, or is blocked outright.\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 /** Risk levels the user chose to always allow this session (\"allow all level N\"). */\n allowRisk: Set<number>;\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 approvals the user granted this session: a specific tool, or every\n // call at a given risk level. The risk profile is aware of both.\n if (state.alwaysAllow.has(tool)) return \"allow\";\n if (state.allowRisk.has(effectiveRisk)) return \"allow\";\n\n // The auto-accept level: anything at or below it runs without asking.\n return effectiveRisk <= state.level ? \"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","/**\n * Session approvals — the permission mode plus the tools and risk levels the\n * user has pre-approved — persisted in the THREAD's KV store (server-side), so\n * they resume with the session and a server hook can show the agent what's\n * already approved. Nothing is stored on the client.\n */\nimport type { ApiClient } from \"./api.ts\";\nimport type { PermissionState } from \"./permissions.ts\";\nimport type { Level } from \"./types.ts\";\n\nconst KEY = \"approvals\";\n\nexport interface ApprovalsKV {\n level?: Level;\n allowTools: string[];\n allowRisk: number[];\n}\n\nexport async function loadApprovals(api: ApiClient, threadId: string): Promise<ApprovalsKV> {\n const v = await api.kvGet(threadId, KEY);\n if (v && typeof v === \"object\" && !Array.isArray(v)) {\n const o = v as Record<string, unknown>;\n const n = Number(o.level);\n const level = n >= 1 && n <= 5 ? (n as Level) : undefined;\n return {\n level,\n allowTools: Array.isArray(o.allowTools) ? (o.allowTools as string[]) : [],\n allowRisk: Array.isArray(o.allowRisk) ? (o.allowRisk as number[]) : [],\n };\n }\n return { allowTools: [], allowRisk: [] };\n}\n\n/** Persist the current approvals to the thread KV (fire-and-forget). */\nexport function saveApprovals(api: ApiClient, threadId: string, perm: PermissionState): void {\n const payload: ApprovalsKV = {\n level: perm.level,\n allowTools: Array.from(perm.alwaysAllow).sort(),\n allowRisk: Array.from(perm.allowRisk).sort((a, b) => a - b),\n };\n void api.kvSet(threadId, KEY, payload);\n}\n","/**\n * App-level keepalive + half-open detection for a WebSocket.\n *\n * Node's WebSocket (and the server) won't promptly report a connection that died\n * silently — an idle NAT/proxy timeout drops the TCP without a close frame, so\n * the socket sits in `OPEN` forever and `send()` never throws. We defend against\n * that by pinging the server on an interval (it answers \"pong\") and treating the\n * connection as dead if no frame arrives within {@link CONNECTION_SILENCE_TIMEOUT_MS}.\n *\n * The owner calls `start()` once the socket opens, `markAlive()` on every frame\n * it receives, and `stop()` when the socket closes. `onDead` fires at most once\n * per heartbeat and should drop + reconnect the socket.\n */\n\n/** How often to ping the server (which replies \"pong\"). */\nexport const HEARTBEAT_INTERVAL_MS = 5000;\n\n/**\n * If the server sends nothing — no pong, no data — for this long, the socket is\n * dead even if `readyState` still says OPEN. Kept comfortably under the server's\n * own liveness timeout so the client detects the drop and reconnects first.\n */\nexport const CONNECTION_SILENCE_TIMEOUT_MS = 15000;\n\nexport interface HeartbeatOptions {\n /** Ping cadence in ms. Defaults to {@link HEARTBEAT_INTERVAL_MS}. */\n intervalMs?: number;\n /** Silence-before-dead window in ms. Defaults to {@link CONNECTION_SILENCE_TIMEOUT_MS}. */\n silenceMs?: number;\n}\n\nexport class Heartbeat {\n private timer: ReturnType<typeof setInterval> | null = null;\n private lastRecvAt = 0;\n private readonly intervalMs: number;\n private readonly silenceMs: number;\n\n constructor(\n private ws: Pick<WebSocket, \"readyState\" | \"send\" | \"close\">,\n private onDead: () => void,\n options: HeartbeatOptions = {}\n ) {\n this.intervalMs = options.intervalMs ?? HEARTBEAT_INTERVAL_MS;\n this.silenceMs = options.silenceMs ?? CONNECTION_SILENCE_TIMEOUT_MS;\n }\n\n start(): void {\n this.stop();\n this.lastRecvAt = Date.now();\n this.timer = setInterval(() => this.tick(), this.intervalMs);\n }\n\n /** Record that a frame was received — proof the connection is alive. */\n markAlive(): void {\n this.lastRecvAt = Date.now();\n }\n\n stop(): void {\n if (this.timer) {\n clearInterval(this.timer);\n this.timer = null;\n }\n }\n\n private tick(): void {\n if (Date.now() - this.lastRecvAt > this.silenceMs) {\n this.fail();\n return;\n }\n try {\n if (this.ws.readyState === WebSocket.OPEN) this.ws.send(\"ping\");\n else this.fail();\n } catch {\n this.fail();\n }\n }\n\n private fail(): void {\n this.stop();\n try {\n this.ws.close();\n } catch {\n // already closing/closed\n }\n this.onDead();\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 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/** 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 * The client-tool bridge: holds a WebSocket open to the instance, receives\n * forwarded tool requests, runs them through the permission engine + safety\n * guard, executes the approved ones on the host, and returns results.\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 { Heartbeat } from \"./heartbeat.ts\";\nimport type { HostResult, ToolRequest } from \"./types.ts\";\nimport { diffLines, newFileLines, highlightBash, oneLineCommand } from \"./render.ts\";\n\nexport type ApprovalChoice = \"allow\" | \"deny\" | \"always\" | \"always_risk\";\n/** Approval outcome plus, for a denial, an optional reason the user typed for the agent. */\nexport type ApprovalResult = { choice: ApprovalChoice; reason?: string };\n\nexport type ConnectionState = \"connected\" | \"reconnecting\" | \"reconnected\";\n\nexport interface BridgeHooks {\n /** Print a permanent line (a finished/denied/blocked tool). `detail` lines are\n * pre-styled extra rows (e.g. a truncated diff) printed verbatim beneath it. */\n onActivity(line: string, detail?: string[]): void;\n /** Update the live working status (the currently-running tool, or null = idle). */\n /** A host tool started (`summary`) or finished (`null`) executing, keyed by its\n * tool-call id. The CLI is the source of truth for what is running on the host —\n * the server's stream events can be missed (reconnects), leaving a stale label. */\n onStatus?(id: string, summary: string | null): void;\n /** Report connection lifecycle so the UI can show disconnect/reconnect state. */\n onConnection?(state: ConnectionState, attempt: number): void;\n /** Ask the user to approve a tool; resolve with their choice. */\n requestApproval(req: ToolRequest, summary: string, effectiveRisk: number): Promise<ApprovalResult>;\n}\n\n/** Tools that mutate or execute (used to deny in plan mode cleanly). */\nconst PATH_ARG_TOOLS = new Set([\"read_file\", \"grep\", \"glob\", \"write_file\", \"edit_file\"]);\n\nexport class Bridge {\n private ws: WebSocket | null = null;\n private closed = false;\n private heartbeat: Heartbeat | null = null;\n private reconnectAttempt = 0;\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n private resolveConnected: (() => void) | null = null;\n // Durable forwarded calls we've started handling, so a server re-send (after a\n // reconnect) doesn't prompt or run them twice.\n private handledDurable = new Set<string>();\n\n constructor(\n private api: ApiClient,\n private threadId: string,\n private host: HostTools,\n private perm: PermissionState,\n private hooks: BridgeHooks\n ) {}\n\n /**\n * Connect and keep the bridge connected. Resolves on the first successful\n * open; thereafter any drop is reconnected automatically with exponential\n * backoff (disconnections are expected — e.g. a dev-server reload — so this\n * must be rock solid). A short safety timeout resolves startup even if the\n * very first attempt is slow, since reconnection continues in the background.\n */\n connect(): Promise<void> {\n return new Promise((resolve) => {\n let settled = false;\n this.resolveConnected = () => {\n if (!settled) {\n settled = true;\n resolve();\n }\n };\n // Don't hang startup forever if the first attempt is slow.\n setTimeout(() => this.resolveConnected?.(), 8000);\n this.openSocket();\n });\n }\n\n private openSocket(): void {\n if (this.closed) return;\n const url = `${this.api.wsEndpoint}/api/threads/${this.threadId}/bridge?token=${encodeURIComponent(this.api.bearer)}`;\n let ws: WebSocket;\n try {\n ws = new WebSocket(url);\n } catch {\n this.scheduleReconnect();\n return;\n }\n this.ws = ws;\n\n ws.addEventListener(\"open\", () => {\n const wasReconnecting = this.reconnectAttempt > 0;\n this.reconnectAttempt = 0;\n this.startHeartbeat(ws);\n this.hooks.onConnection?.(wasReconnecting ? \"reconnected\" : \"connected\", 0);\n this.resolveConnected?.();\n });\n\n ws.addEventListener(\"message\", (ev) => {\n // Any frame (pong, bridge_ready, tool_request) proves the link is alive.\n if (this.ws === ws) this.heartbeat?.markAlive();\n this.onMessage(String((ev as MessageEvent).data));\n });\n\n // A socket that fails to open fires 'error' but may never fire 'close', so\n // both must drive reconnection. handleDrop dedupes via the current-socket check.\n ws.addEventListener(\"error\", () => this.handleDrop(ws));\n ws.addEventListener(\"close\", () => this.handleDrop(ws));\n }\n\n private handleDrop(ws: WebSocket): void {\n if (this.ws !== ws) return; // stale event from a superseded socket\n this.ws = null;\n this.stopHeartbeat();\n this.scheduleReconnect();\n }\n\n private scheduleReconnect(): void {\n if (this.closed || this.reconnectTimer) return;\n this.reconnectAttempt++;\n this.hooks.onConnection?.(\"reconnecting\", this.reconnectAttempt);\n // Exponential backoff with jitter, capped — keep trying indefinitely.\n const base = Math.min(500 * 2 ** (this.reconnectAttempt - 1), 15000);\n const delay = base + Math.floor(Math.random() * 400);\n this.reconnectTimer = setTimeout(() => {\n this.reconnectTimer = null;\n this.openSocket();\n }, delay);\n }\n\n private startHeartbeat(ws: WebSocket): void {\n this.stopHeartbeat();\n // Heartbeat so the server can tell a live client (mid-build or awaiting an\n // approval) from a dead one and never freeze a thread on us — and so WE\n // notice when the server goes silent (a half-open TCP that never fires\n // 'close'/'error') and reconnect instead of looking connected forever.\n this.heartbeat = new Heartbeat(ws, () => this.handleDrop(ws));\n this.heartbeat.start();\n }\n\n private stopHeartbeat(): void {\n if (this.heartbeat) {\n this.heartbeat.stop();\n this.heartbeat = null;\n }\n }\n\n close(): void {\n this.closed = true;\n this.stopHeartbeat();\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n this.ws?.close();\n }\n\n private send(payload: object): void {\n try {\n this.ws?.send(JSON.stringify(payload));\n } catch {\n // socket gone; the server will time the call out\n }\n }\n\n private async onMessage(raw: string): Promise<void> {\n let msg: any;\n try {\n msg = JSON.parse(raw);\n } catch {\n return;\n }\n if (msg.type !== \"tool_request\") return;\n const req = msg as ToolRequest;\n await this.handleToolRequest(req);\n }\n\n /**\n * Reply to a tool request. Durable calls (the agent parked them) deliver the\n * result over HTTP so it lands even if this socket later drops; legacy calls\n * reply over the WebSocket.\n */\n private respond(req: ToolRequest, ok: boolean, result?: string, error?: string): void {\n if (req.durable && req.toolCallId) {\n void this.api.postToolResult(this.threadId, req.toolCallId, ok, result, error);\n } else {\n this.send({ type: \"tool_response\", id: req.id, ok, result, error });\n }\n }\n\n private async handleToolRequest(req: ToolRequest): Promise<void> {\n // Durable calls may be re-sent by the server after a reconnect — only handle\n // each once (prompt + run), so the user isn't asked twice.\n if (req.durable && req.toolCallId) {\n if (this.handledDurable.has(req.toolCallId)) return;\n this.handledDurable.add(req.toolCallId);\n }\n\n const summary = describe(req);\n\n // Compute an effective risk, escalating anything that touches paths outside\n // the project directory (the agent is told to stay inside it).\n let effectiveRisk = typeof req.risk === \"number\" ? req.risk : req.requestPermission ? 3 : 1;\n if (PATH_ARG_TOOLS.has(req.tool) && this.host.isOutsideProject(req.args.path as string | undefined)) {\n effectiveRisk = Math.max(effectiveRisk, 4);\n }\n\n // Hard safety: never run catastrophic shell commands, even in bypass mode.\n if (req.tool === \"bash\" && isCatastrophic(String(req.args.command || \"\"))) {\n this.hooks.onActivity(`⛔ blocked dangerous command: ${summary}`);\n this.respond(req, false, undefined, \"Blocked: this command is considered catastrophic and was refused by the client safety guard.\");\n return;\n }\n\n // Permission key: normally the tool name, but MCP calls are gated at the\n // finer `mcp:<server>/<tool>` granularity so \"always allow this tool\" approves\n // one server's tool rather than every MCP call.\n const permKey = permissionKey(req);\n const decision = decide(this.perm, permKey, effectiveRisk, !!req.requestPermission);\n\n if (decision === \"deny\") {\n this.hooks.onActivity(`⛔ ${summary} — blocked (risk ${effectiveRisk})`);\n this.respond(req, false, undefined, `Denied by policy (risk ${effectiveRisk}).`);\n return;\n }\n\n if (decision === \"ask\") {\n const { choice, reason } = await this.hooks.requestApproval(req, summary, effectiveRisk);\n if (choice === \"deny\") {\n const why = reason?.trim();\n this.hooks.onActivity(`⛔ ${summary} — you declined${why ? `: ${why}` : \"\"}`);\n this.respond(\n req,\n false,\n undefined,\n why\n ? `The user declined to run this operation. Their reason: ${why}`\n : \"The user declined to run this operation.\"\n );\n return;\n }\n if (choice === \"always\") this.perm.alwaysAllow.add(permKey);\n if (choice === \"always_risk\") this.perm.allowRisk.add(effectiveRisk);\n if (choice === \"always\" || choice === \"always_risk\") {\n saveApprovals(this.api, this.threadId, this.perm);\n }\n }\n\n // Show the running tool in the live status, then leave a permanent line. The\n // status is keyed by the tool-call id and cleared in a `finally`, so the\n // \"Working …\" label can never get stuck on a tool that already finished even\n // if execution throws or the server's done event is dropped.\n const callKey = req.toolCallId ?? req.id ?? `${req.tool}:${summary}`;\n this.hooks.onStatus?.(callKey, summary);\n let result: HostResult;\n try {\n result = await this.host.execute(req.tool, req.args);\n } finally {\n this.hooks.onStatus?.(callKey, null);\n }\n if (result.ok) {\n const { display, detail } = activityPresentation(req, summary);\n this.hooks.onActivity(`✓ ${display}${detailSuffix(req.tool, result.result)}`, detail);\n this.respond(req, true, result.result ?? \"\");\n } else {\n this.hooks.onActivity(`✗ ${summary} — ${result.error}`);\n this.respond(req, false, undefined, result.error);\n }\n }\n}\n\n/**\n * Stable permission key for a request. For MCP, gate on the specific server +\n * tool/resource so approvals are fine-grained; for everything else, the tool name.\n */\nexport function permissionKey(req: ToolRequest): string {\n if (req.tool !== \"mcp\") return req.tool;\n const a = req.args;\n const server = String(a.server || \"?\");\n const action = String(a.action || \"call\");\n if (action === \"read_resource\") return `mcp:${server}/resource`;\n if (action === \"list_tools\") return `mcp:${server}/list`;\n return `mcp:${server}/${String(a.tool || \"?\")}`;\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\") {\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 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 default:\n return `${req.tool} ${JSON.stringify(a).slice(0, 80)}`;\n }\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 * Registry of long-running background processes the agent spawns.\n *\n * The metadata lives in the THREAD's durable key-value store (server-side), not\n * on this client — so the process list resumes from any machine, at any time,\n * and nothing about it is kept on the client. (The process *output* logs are the\n * one host-local thing: a detached process writes its stdout to a file on the\n * machine it runs on; that file can only live there.)\n *\n * Liveness is re-derived from the OS for this machine's processes — a recorded\n * \"running\" entry is verified with a signal-0 probe — so the registry self-heals\n * if a process died while we weren't watching. Processes on other machines show\n * their last-known status (we can't probe a PID we don't own).\n */\nimport path from \"node:path\";\nimport os from \"node:os\";\nimport type { ApiClient } from \"./api.ts\";\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/** The thread KV key under which the process list is stored. */\nconst KEY = \"bg_processes\";\n\nexport type ProcessStatus = \"running\" | \"exited\" | \"stopped\";\n\nexport interface ProcessEntry {\n id: string;\n pid: number;\n command: string;\n description?: string;\n cwd: string;\n machine: string;\n logPath: string;\n startedAt: number;\n status: ProcessStatus;\n exitCode?: number | null;\n endedAt?: number;\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 {\n constructor(\n private api: ApiClient,\n private threadId: string,\n private machine: string\n ) {}\n\n private async read(): Promise<ProcessEntry[]> {\n const value = await this.api.kvGet(this.threadId, KEY);\n return Array.isArray(value) ? (value as ProcessEntry[]) : [];\n }\n\n private async write(entries: ProcessEntry[]): Promise<void> {\n await this.api.kvSet(this.threadId, KEY, entries);\n }\n\n /** Mark this machine's dead \"running\" entries as exited. Returns true if any changed. */\n private reconcileLiveness(entries: ProcessEntry[]): boolean {\n let changed = false;\n for (const e of entries) {\n if (e.machine === this.machine && e.status === \"running\" && !isAlive(e.pid)) {\n e.status = \"exited\";\n e.endedAt = Date.now();\n changed = true;\n }\n }\n return changed;\n }\n\n /** All tracked processes, newest first, with liveness re-checked + persisted. */\n async list(): Promise<ProcessEntry[]> {\n const entries = await this.read();\n if (this.reconcileLiveness(entries)) await this.write(entries);\n return entries.sort((a, b) => b.startedAt - a.startedAt);\n }\n\n async runningCount(): Promise<number> {\n const entries = await this.list();\n return entries.filter((e) => e.status === \"running\").length;\n }\n\n async get(id: string): Promise<ProcessEntry | null> {\n return (await this.read()).find((e) => e.id === id) ?? null;\n }\n\n async add(entry: ProcessEntry): Promise<void> {\n const entries = await this.read();\n entries.push(entry);\n await this.write(entries);\n }\n\n async markExited(id: string, exitCode: number | null): Promise<void> {\n const entries = await this.read();\n const e = entries.find((x) => x.id === id);\n if (e && e.status === \"running\") {\n e.status = \"exited\";\n e.exitCode = exitCode;\n e.endedAt = Date.now();\n await this.write(entries);\n }\n }\n\n async markStopped(id: string): Promise<void> {\n const entries = await this.read();\n const e = entries.find((x) => x.id === id);\n if (e) {\n e.status = \"stopped\";\n e.endedAt = Date.now();\n await this.write(entries);\n }\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","/**\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 { ProcessRegistry, LOG_DIR, type ProcessEntry } from \"./process-registry.ts\";\nimport type { McpManager } from \"./mcp.ts\";\nimport type { ApiClient } from \"./api.ts\";\nimport { saveMcpServer, removeMcpServer, serverFromCommand } from \"./mcp-config.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 resolve(p: string | undefined): string {\n if (!p || p === \".\") return this.projectDir;\n return path.resolve(this.projectDir, p);\n }\n\n /** True when the resolved path escapes the project directory. */\n isOutsideProject(p: string | undefined): boolean {\n const abs = this.resolve(p);\n const rel = path.relative(this.projectDir, abs);\n return rel.startsWith(\"..\") || 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 const rg = await this.run(\"rg\", 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 rg = await this.run(\"rg\", [\"--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 return { ok: true, result: `Edited ${path.relative(this.projectDir, file)} (${count} replacement${count === 1 ? \"\" : \"s\"})` };\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: { ...process.env, 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 await fsp.mkdir(LOG_DIR, { recursive: true });\n out = fs.openSync(logPath, \"a\");\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], { cwd, detached: true, stdio: [\"ignore\", out, out] });\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, { cwd, detached: true });\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 * Subscribes to a thread's message WebSocket to render streamed assistant text\n * and detect end-of-turn (an assistant message with non-empty text content,\n * which under stopOnResponse means the agent has finished its turn).\n */\nimport type { ApiClient } from \"./api.ts\";\nimport { Heartbeat } from \"./heartbeat.ts\";\n\nexport interface StreamHooks {\n /** A streamed fragment of the assistant's visible answer. `messageId` lets the\n * consumer reset its live buffer when a new message starts. */\n onChunk(text: string, messageId?: string): void;\n /**\n * A streamed fragment of the model's internal reasoning. This is the opt-in\n * `reasoning_chunk` channel (we subscribe with `?reasoning=1`); the backend\n * only sends it to sockets that ask. See the spec `ThreadReasoningChunkEvent`.\n */\n onReasoningChunk?(text: string, messageId?: string): void;\n /**\n * A complete assistant message. `hasToolCalls` is true for narration that\n * precedes tool calls (the turn continues) and false for the final answer\n * (the turn is over).\n */\n onAssistantText(content: string, hasToolCalls: boolean): void;\n /**\n * A custom thread event (the `{ type: \"event\", eventType, data }` channel) —\n * e.g. `tool_call_started`, `tool_call_done`, `generation`.\n */\n onEvent?(eventType: string, data: any): void;\n onError(err: string): void;\n}\n\nexport class MessageStream {\n private ws: WebSocket | null = null;\n private closed = false;\n private heartbeat: Heartbeat | null = null;\n private reconnectAttempt = 0;\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n private resolveConnected: (() => void) | null = null;\n\n constructor(\n private api: ApiClient,\n private threadId: string,\n private hooks: StreamHooks\n ) {}\n\n /**\n * Connect and stay connected. Resolves on first open; reconnects on any drop\n * with exponential backoff. Silent — the bridge surfaces the user-facing\n * connection status; completion is detected via HTTP polling regardless, so a\n * dropped stream only affects live display, not correctness.\n */\n connect(): Promise<void> {\n return new Promise((resolve) => {\n let settled = false;\n this.resolveConnected = () => {\n if (!settled) {\n settled = true;\n resolve();\n }\n };\n setTimeout(() => this.resolveConnected?.(), 8000);\n this.openSocket();\n });\n }\n\n private openSocket(): void {\n if (this.closed) return;\n // `reasoning=1` opts into the internal-reasoning channel (off by default).\n const url = `${this.api.wsEndpoint}/api/threads/${this.threadId}/stream?token=${encodeURIComponent(this.api.bearer)}&reasoning=1`;\n let ws: WebSocket;\n try {\n ws = new WebSocket(url);\n } catch {\n this.scheduleReconnect();\n return;\n }\n this.ws = ws;\n ws.addEventListener(\"open\", () => {\n this.reconnectAttempt = 0;\n this.startHeartbeat(ws);\n this.resolveConnected?.();\n });\n ws.addEventListener(\"message\", (ev) => {\n // Any frame proves the link is alive; a silent stream would otherwise\n // freeze the live indicators without ever reconnecting.\n if (this.ws === ws) this.heartbeat?.markAlive();\n this.onMessage(String((ev as MessageEvent).data));\n });\n // Both 'error' (failed open) and 'close' must drive reconnection.\n ws.addEventListener(\"error\", () => this.handleDrop(ws));\n ws.addEventListener(\"close\", () => this.handleDrop(ws));\n }\n\n private handleDrop(ws: WebSocket): void {\n if (this.ws !== ws) return;\n this.ws = null;\n this.stopHeartbeat();\n this.scheduleReconnect();\n }\n\n private startHeartbeat(ws: WebSocket): void {\n this.stopHeartbeat();\n this.heartbeat = new Heartbeat(ws, () => this.handleDrop(ws));\n this.heartbeat.start();\n }\n\n private stopHeartbeat(): void {\n if (this.heartbeat) {\n this.heartbeat.stop();\n this.heartbeat = null;\n }\n }\n\n private scheduleReconnect(): void {\n if (this.closed || this.reconnectTimer) return;\n this.reconnectAttempt++;\n const base = Math.min(500 * 2 ** (this.reconnectAttempt - 1), 15000);\n const delay = base + Math.floor(Math.random() * 400);\n this.reconnectTimer = setTimeout(() => {\n this.reconnectTimer = null;\n this.openSocket();\n }, delay);\n }\n\n close(): void {\n this.closed = true;\n this.stopHeartbeat();\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n this.ws?.close();\n }\n\n private onMessage(raw: string): void {\n let msg: any;\n try {\n msg = JSON.parse(raw);\n } catch {\n return;\n }\n if (msg.type === \"event\" && typeof msg.eventType === \"string\") {\n this.hooks.onEvent?.(msg.eventType, msg.data);\n return;\n }\n if (msg.type === \"message_chunk\" && (msg.depth ?? 0) === 0) {\n if (typeof msg.chunk === \"string\") this.hooks.onChunk(msg.chunk, msg.message_id);\n return;\n }\n if (msg.type === \"reasoning_chunk\" && (msg.depth ?? 0) === 0) {\n if (typeof msg.chunk === \"string\") this.hooks.onReasoningChunk?.(msg.chunk, msg.message_id);\n return;\n }\n if (msg.type === \"message_data\" && (msg.depth ?? 0) === 0) {\n const data = msg.data || {};\n if (data.role === \"assistant\" && typeof data.content === \"string\" && data.content.trim()) {\n // tool_calls is serialized as a JSON string, not an array.\n const tc = data.tool_calls;\n const hasToolCalls = Array.isArray(tc)\n ? tc.length > 0\n : typeof tc === \"string\" && tc.trim() !== \"\" && tc.trim() !== \"null\" && tc.trim() !== \"[]\";\n this.hooks.onAssistantText(data.content, hasToolCalls);\n }\n if (data.role === \"assistant\" && data.status === \"failed\" && data.error) {\n this.hooks.onError(String(data.error));\n }\n }\n }\n}\n","/**\n * Subscribes to the instance-wide system events channel (`GET /api/events`) to\n * learn when threads are created, updated, or terminated. We use it to track\n * *subagents*: a subagent runs in its own child thread, so the only live signal\n * of \"a subagent is working\" is its child thread appearing here with our thread\n * as its `parent` (and disappearing/terminating when it finishes).\n */\nimport type { ApiClient } from \"./api.ts\";\nimport { Heartbeat } from \"./heartbeat.ts\";\n\n/** The subset of a thread registry entry we care about. */\nexport interface ThreadEntry {\n id: string;\n agent_name?: string | null;\n tags?: string[] | null;\n parent?: string | null;\n terminated?: number | null;\n created_at?: number;\n}\n\nexport interface SystemEventHooks {\n onThreadCreated(thread: ThreadEntry): void;\n onThreadUpdated(thread: ThreadEntry): void;\n onThreadDeleted(threadId: string): void;\n /** Fired whenever the socket (re)connects, so the consumer can re-snapshot\n * state that live deltas alone can't reconstruct after a gap. */\n onOpen?(): void;\n}\n\nexport class SystemEvents {\n private ws: WebSocket | null = null;\n private closed = false;\n private heartbeat: Heartbeat | null = null;\n private reconnectAttempt = 0;\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n\n constructor(\n private api: ApiClient,\n private hooks: SystemEventHooks\n ) {}\n\n connect(): void {\n this.openSocket();\n }\n\n private openSocket(): void {\n if (this.closed) return;\n const url = `${this.api.wsEndpoint}/api/events?token=${encodeURIComponent(this.api.bearer)}`;\n let ws: WebSocket;\n try {\n ws = new WebSocket(url);\n } catch {\n this.scheduleReconnect();\n return;\n }\n this.ws = ws;\n ws.addEventListener(\"open\", () => {\n this.reconnectAttempt = 0;\n this.startHeartbeat(ws);\n this.hooks.onOpen?.();\n });\n ws.addEventListener(\"message\", (ev) => {\n if (this.ws === ws) this.heartbeat?.markAlive();\n this.onMessage(String((ev as MessageEvent).data));\n });\n ws.addEventListener(\"error\", () => this.handleDrop(ws));\n ws.addEventListener(\"close\", () => this.handleDrop(ws));\n }\n\n private startHeartbeat(ws: WebSocket): void {\n this.stopHeartbeat();\n this.heartbeat = new Heartbeat(ws, () => this.handleDrop(ws));\n this.heartbeat.start();\n }\n\n private stopHeartbeat(): void {\n if (this.heartbeat) {\n this.heartbeat.stop();\n this.heartbeat = null;\n }\n }\n\n private onMessage(raw: string): void {\n let msg: any;\n try {\n msg = JSON.parse(raw);\n } catch {\n return;\n }\n if (msg?.type === \"thread_created\" && msg.thread) this.hooks.onThreadCreated(msg.thread);\n else if (msg?.type === \"thread_updated\" && msg.thread) this.hooks.onThreadUpdated(msg.thread);\n else if (msg?.type === \"thread_deleted\" && typeof msg.threadId === \"string\") {\n this.hooks.onThreadDeleted(msg.threadId);\n }\n }\n\n private handleDrop(ws: WebSocket): void {\n if (this.ws !== ws) return;\n this.ws = null;\n this.stopHeartbeat();\n this.scheduleReconnect();\n }\n\n private scheduleReconnect(): void {\n if (this.closed || this.reconnectTimer) return;\n this.reconnectAttempt++;\n const base = Math.min(500 * 2 ** (this.reconnectAttempt - 1), 15000);\n const delay = base + Math.floor(Math.random() * 400);\n this.reconnectTimer = setTimeout(() => {\n this.reconnectTimer = null;\n this.openSocket();\n }, delay);\n }\n\n close(): void {\n this.closed = true;\n this.stopHeartbeat();\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n this.ws?.close();\n }\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","/** Bridge protocol + shared CLI types. */\n\n/** A forwarded tool request the instance sends down the bridge. */\nexport interface ToolRequest {\n type: \"tool_request\";\n /** In-memory await id (non-durable calls reply over the WebSocket with this). */\n id?: string;\n /**\n * Durable calls: the agent parked this call and is awaiting the result over\n * HTTP. Reply by POSTing to /tool-result with `toolCallId` instead of the WS.\n */\n durable?: boolean;\n toolCallId?: string;\n tool: string;\n args: Record<string, unknown>;\n requestPermission: string | null;\n risk: number | null;\n}\n\n/** The CLI's reply to a tool request. */\nexport interface ToolResponse {\n type: \"tool_response\";\n id: string;\n ok: boolean;\n result?: string;\n error?: string;\n}\n\n/** Result of executing a tool on the host. */\nexport interface HostResult {\n ok: boolean;\n result?: string;\n error?: string;\n}\n\n/**\n * Permission is a single auto-accept LEVEL 1–5: every tool call at risk ≤ level\n * runs automatically; anything riskier asks. (The catastrophic-command guard\n * still blocks dangerous commands at every level.) shift-tab cycles the level.\n */\nexport type Level = 1 | 2 | 3 | 4 | 5;\n\nexport const LEVELS: Level[] = [1, 2, 3, 4, 5];\n\n/** What each level lets run without asking (risk meanings: 1 read · 2 safe writes/builds · 3 installs/project edits · 4 outside-project/git-history · 5 destructive). */\nconst LEVEL_DETAIL: Record<Level, string> = {\n 1: \"only safe reads run automatically\",\n 2: \"+ safe writes & builds\",\n 3: \"+ installs & project edits\",\n 4: \"+ outside-project & git-history\",\n 5: \"everything — never ask\",\n};\n\nexport function levelLabel(level: Level): string {\n return `auto-accept level ${level} (${LEVEL_DETAIL[level]})`;\n}\n\n/** Stored credential for one instance. */\nexport interface InstanceCredential {\n endpoint: string;\n access_token: string;\n token_type: string;\n user?: { id: string; username: string; role: string };\n saved_at: number;\n}\n\nexport interface CredentialsFile {\n default_endpoint?: string;\n instances: Record<string, InstanceCredential>;\n}\n\nexport interface ThreadSummary {\n id: string;\n tags: string[];\n created_at?: number;\n title?: string;\n preview?: string;\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\";\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, { encoding: \"buffer\", maxBuffer }, (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 line.\n *\n * The input line stays anchored at the bottom and is always editable — you can\n * type while the agent works. All transcript output is printed ABOVE it via\n * print(). A spinner prefix on the input line indicates the agent's turn is\n * active (\"whose turn it is\"), so the working indicator never disappears, even\n * during long tool calls. Approvals and menus temporarily take over the bottom.\n */\nimport readline from \"node:readline\";\nimport { gradientText, brandCycleColor } from \"./render.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\";\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\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: \"\\x1b[90m\",\n teal: \"\\x1b[38;5;37m\",\n};\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// Animation tick for the spinners (frame advance + redraw interval). Snappier\n// than the old 100ms without burning noticeable CPU on redraws.\nconst SPINNER_MS = 70;\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 queuedCount = 0;\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 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: the width the region was last drawn at, and the visible\n // width of every HUD row written above the input. When the terminal is\n // resized, previously drawn rows re-wrap (a full-width ruler becomes 2+ rows\n // when narrowed), so the move-up count recorded at draw time is wrong — these\n // let moveToRegionTop recompute the region height under the NEW wrap instead\n // of leaving stale rulers behind.\n private lastDrawnCols = 0;\n private drawnHudWidths: number[] = [];\n\n // takeover (approval / menu) state\n private takeoverHandler: KeyHandler | null = null;\n private bufferedPrints: string[] = [];\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 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 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 private onQuit: () => void = () => process.exit(0);\n private levelListeners: ((l: Level) => void)[] = [];\n\n constructor(public level: Level = 1) {\n readline.emitKeypressEvents(process.stdin);\n if (process.stdin.isTTY) process.stdin.setRawMode(true);\n process.stdin.on(\"keypress\", (str, key) => this.dispatch(str, key));\n process.stdin.resume();\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 // Redraw on terminal resize. moveToRegionTop detects the width change and\n // erases the re-wrapped old region, so nothing stale (e.g. a wrapped\n // full-width ruler) is left behind — even while idle.\n process.stdout.on(\"resize\", () => this.renderBottom());\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 if (this.quitTimer) clearTimeout(this.quitTimer);\n this.quitTimer = null;\n if (this.streamIdleTimer) clearTimeout(this.streamIdleTimer);\n this.streamIdleTimer = null;\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 instead of submitting. The robust signal is a\n // bare LF (\"\\n\"): Ghostty/iTerm2/WezTerm and many others send \"\\n\" for\n // Shift+Enter (often by default, otherwise configurable) while plain Enter\n // sends CR (\"\\r\"). We also accept the Kitty (\"\\x1b[13;2u\") and\n // modifyOtherKeys (\"\\x1b[27;2;13~\") forms for terminals that emit those.\n // Checked before any other key logic (including paste detection) — and a raw\n // \"\\n\" never reaches the Enter/submit handler below.\n if (seq === \"\\n\" || seq === \"\\x1b[13;2u\" || seq === \"\\x1b[27;2;13~\") {\n 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 // Shift+Enter inserts a newline instead of running the command\n if (key.shift) {\n this.insertAtCursor(\"\\n\");\n return;\n }\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 // Shift+Enter inserts a newline instead of submitting.\n // Detection: some terminals set key.shift, others send a distinct escape sequence.\n // Protocol-based Shift+Enter is already handled at the top of dispatch();\n // this catches terminals that natively set the shift modifier on Return.\n if (key.shift) {\n this.insertAtCursor(\"\\n\");\n return;\n }\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 this.inputBuffer = \"\";\n this.cursorPos = 0;\n this.pendingImages = [];\n this.historyIdx = null;\n this.historyDraft = \"\";\n this.historyDraftImages = [];\n this.renderBottom();\n if (text.trim()) {\n this.addHistoryEntry(text.trim());\n this.onSubmit(text.trim(), images);\n }\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 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 renderBottom: logical\n * lines split on \"\\n\", line 0 led by the prompt prefix, each wrapping at the\n * terminal width) plus where the caret sits among them. Each row records the\n * buffer index of its first character, its character count, and the visual\n * column its first character renders at (only row 0 is offset, by the\n * prompt). Drives ↑/↓: row 0 is \"the top line\" (history recall territory),\n * 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 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 lead = i === 0 ? pw : 0;\n const len = lines[i].length;\n const nRows = Math.max(1, Math.ceil((lead + len) / cols));\n for (let j = 0; j < nRows; j++) {\n const charStart = Math.max(0, j * cols - lead);\n const charEnd = Math.min(len, (j + 1) * cols - lead);\n rows.push({ start: offset + charStart, len: Math.max(0, charEnd - charStart), colOffset: j === 0 ? lead : 0 });\n }\n offset += len + 1; // +1 consumes the \"\\n\"\n }\n // Locate the caret (mirrors renderBottom).\n let pos = this.cursorPos;\n let caretLine = 0;\n while (caretLine < lines.length - 1 && pos > lines[caretLine].length) {\n pos -= lines[caretLine].length + 1;\n caretLine++;\n }\n const caretCell = (caretLine === 0 ? pw : 0) + pos;\n let caretRow = Math.floor(caretCell / cols);\n for (let i = 0; i < caretLine; i++) {\n const lead = i === 0 ? pw : 0;\n caretRow += Math.max(1, Math.ceil((lead + lines[i].length) / cols));\n }\n const caretCol = caretCell % cols;\n // Caret exactly on a wrap boundary renders one row past the text's last\n // row — synthesize that empty row so vertical movement stays in bounds.\n while (caretRow >= rows.length) rows.push({ start: this.inputBuffer.length, len: 0, colOffset: 0 });\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_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 * Understated context gauge, right-aligned on the summary line: just \"N%\",\n * dim, and INVISIBLE until the conversation is more than 85% of the way to\n * the compaction point (the percentage is scaled so 100% = where background\n * compaction triggers, not the raw model window). Most sessions never see it.\n */\n private contextGaugeText(): string {\n if (this.contextPct == null || this.contextPct <= 85) return \"\";\n return `${C.dim}${C.gray}${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 (latest request input tokens ÷\n * model context window).\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 && 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 // Just the queue/bg badges and the level carrot — metrics live on the summary\n // line above so they never crowd the input.\n const q = this.queuedCount > 0 ? `${C.yellow}[⏳ ${this.queuedCount} queued]${C.reset} ` : \"\";\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 `${q}${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 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, cols - 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, cols - pointerW - visible.length - hintW);\n line += `${\" \".repeat(gap)}${C.gray}${hint}${C.reset}`;\n }\n return line;\n });\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 it under the new wrap instead: each drawn\n * HUD row of visible width w now occupies ceil(w / cols) physical rows\n * (reflowing terminals re-wrap hard lines; the cursor follows its logical\n * position in the input text, which inputLayout locates at the new width).\n */\n private moveToRegionTop(): void {\n process.stdout.write(\"\\r\");\n if (!this.bottomDrawn) return;\n const cols = process.stdout.columns || 80;\n let up: number;\n if (cols !== this.lastDrawnCols && this.lastDrawnCols > 0) {\n let above = 0;\n for (const w of this.drawnHudWidths) above += Math.max(1, Math.ceil(Math.max(w, 1) / cols));\n up = above + this.inputLayout().caretRow;\n } else {\n up = this.lastCursorRow;\n }\n if (up > 0) process.stdout.write(`\\x1b[${up}A`);\n }\n\n /**\n * Render the bottom region: an optional step line, then the prompt + input\n * (wrapping across as many rows as needed), with the caret placed at cursorPos.\n * Uses only relative cursor moves so it survives terminal scrolling when the\n * region grows near the bottom of the screen.\n */\n private renderBottom(): void {\n if (!this.started || this.takeoverHandler) return; // not yet active, or a takeover owns the bottom\n const cols = process.stdout.columns || 80;\n\n this.moveToRegionTop(); // position cursor at the old region's top\n\n // Visible width of every HUD row written above the input this draw — the\n // resize path in moveToRegionTop uses these to recompute the region height\n // after the terminal re-wraps them at a new width.\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 // (subagents / status / goal / prompt) below, so the boundary between the\n // two zones never moves or disappears. It's part of the redrawn region (not\n // printed into the scrollback), so a resize just redraws it at the new\n // width. (Exactly `cols` glyphs → one physical row; the region math counts 1.)\n const rulerRows = 1;\n writeHudRow(`${C.dim}${\"─\".repeat(cols)}${C.reset}`);\n\n // Transient disconnect notice (one row). It lives in the work area, so it\n // shows while we're reconnecting and CLEARS itself the moment we reconnect —\n // no lingering \"lost connection\" line in the transcript.\n const noticeLine = this.connected\n ? null\n : `${C.yellow}⚠ lost connection to the workspace — reconnecting…${C.reset}`;\n const noticeRows = noticeLine ? 1 : 0;\n if (noticeLine) writeHudRow(noticeLine);\n\n // Transient \"press again to exit\" hint (one row), cleared when the window\n // lapses or a second ctrl-c quits.\n const quitLine = this.quitArmed ? `${C.dim}Press Control-C again to exit${C.reset}` : null;\n const quitRows = quitLine ? 1 : 0;\n if (quitLine) writeHudRow(quitLine);\n\n // Subagent lines (one per active subagent), above the summary line. Each\n // subagent gets its own hue (loader + label) so concurrent ones are\n // distinguishable and all read as background work, apart from the cyan\n // main-agent loader.\n const frame = FRAMES[Math.floor(Date.now() / SPINNER_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. The\n // region-height math counts each subagent as exactly one row, so a wrapped\n // line would desync the move-up redraw and let the status/preview clobber\n // it. Reserve room for the frame, two spaces, and the \"working\" suffix.\n const budget = cols - 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(line);\n }\n\n // Summary line (status bar): working state + tokens. It sits ABOVE the goal\n // so the goal header and its indented todos read as one block targeted by\n // the status.\n const statusLine = this.statusLineText(cols);\n const statusRows = statusLine ? 1 : 0;\n if (statusLine) writeHudRow(statusLine);\n\n // Live goal checklist, just below the status bar: the goal header then its\n // todo items indented beneath it.\n const goalLines = this.goalLines(cols);\n for (const line of goalLines) writeHudRow(line);\n\n const aboveRows =\n previewLines.length + rulerRows + noticeRows + quitRows +\n this.subagents.length + statusRows + goalLines.length;\n\n // Prompt + input. The buffer may contain hard newlines (Shift+Enter), so we\n // render each logical line at column 0 (continuations after CR+LF) and count\n // physical rows PER LINE. Counting the whole buffer as one wrapping line\n // mis-measures the region height, so the next redraw can't clear it and the\n // status line ends up stamped over and over.\n const prefix = this.promptPrefix();\n const pw = this.visibleWidth(prefix);\n const lines = this.inputBuffer.split(\"\\n\");\n const tail: string[] = [prefix + lines[0]];\n for (let i = 1; i < lines.length; i++) tail.push(\"\\r\\n\" + lines[i]);\n\n // Physical rows each logical line occupies (line 0 carries the prompt width;\n // an empty line still takes one row).\n const rowsOf = (len: number, lead: number) => Math.max(1, Math.ceil((lead + len) / cols));\n const lineRows = lines.map((l, i) => rowsOf(l.length, i === 0 ? pw : 0));\n const inputRows = lineRows.reduce((a, b) => a + b, 0);\n\n // Locate the caret: its logical line, then its physical row/column.\n let pos = this.cursorPos;\n let caretLine = 0;\n while (caretLine < lines.length - 1 && pos > lines[caretLine].length) {\n pos -= lines[caretLine].length + 1; // +1 consumes the \"\\n\"\n caretLine++;\n }\n const caretCell = (caretLine === 0 ? pw : 0) + pos;\n let caretRow = Math.floor(caretCell / cols);\n for (let i = 0; i < caretLine; i++) caretRow += lineRows[i];\n const caretCol = caretCell % cols;\n\n // Inline slash-command palette, rendered BELOW the input (so the input never\n // shifts as it filters). While open we reserve a FIXED number of rows — one\n // per available command, padded with blanks — so the region height stays\n // constant for the whole filtering session: it scrolls into place once when\n // the palette opens, then the input is pinned.\n const paletteBlock = this.paletteBlockLines(cols);\n for (const line of paletteBlock) tail.push(\"\\r\\n\" + line);\n\n if (paletteBlock.length > 0) {\n // The cursor is now on the last palette row — step back UP onto the input.\n tail.push(\"\\r\"); // col 0 (cancels pending-wrap)\n const up = inputRows - 1 + paletteBlock.length - caretRow;\n if (up > 0) tail.push(`\\x1b[${up}A`);\n if (caretCol > 0) tail.push(`\\x1b[${caretCol}C`);\n this.lastCursorRow = aboveRows + caretRow;\n } else if (this.cursorPos < this.inputBuffer.length) {\n // Caret is inside the text — reposition from the last physical row.\n tail.push(\"\\r\"); // col 0 of the last physical row (cancels pending-wrap)\n const up = inputRows - 1 - caretRow;\n if (up > 0) tail.push(`\\x1b[${up}A`);\n if (caretCol > 0) tail.push(`\\x1b[${caretCol}C`);\n this.lastCursorRow = aboveRows + caretRow;\n } else {\n // Caret at the very end — leave it where writing left it.\n this.lastCursorRow = aboveRows + (inputRows - 1);\n }\n this.drawnHudWidths = hudWidths;\n this.lastDrawnCols = cols;\n this.bottomDrawn = true;\n\n // ── single flush ────────────────────────────────────────────────────────\n // One write() for the entire region: the move-up + clear + all HUD rows\n // + prompt + palette + cursor positioning. Flushing each piece separately\n // was the source of the per-tick flicker.\n const out = \"\\x1b[J\" + hudRows.join(\"\\r\\n\") + \"\\r\\n\" + tail.join(\"\");\n process.stdout.write(out);\n }\n\n private clearBottom(): void {\n if (!this.bottomDrawn) return;\n this.moveToRegionTop();\n process.stdout.write(\"\\x1b[J\");\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 preview may sit untouched before it's wiped. The model often\n // reasons and then calls a tool without ever emitting an answer, so without\n // this the reasoning tail would linger on screen until the *next* thought (or\n // message) arrives. Re-armed on every delta → fires this long after the last.\n private static readonly STREAM_IDLE_MS = 10_000;\n\n /** Append a fragment of streamed answer text (rendered plain). */\n streamResponseDelta(delta: string, messageId?: string): void {\n this.beginStreamMessage(messageId);\n this.streamResponse += delta;\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 this.streamThinking = \"\";\n this.streamResponse = \"\";\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 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 on every streamed delta: once the model goes quiet for a beat, the\n * preview is stale, so wipe it instead of letting it sit until the next\n * message. The committed message (if any) still renders in full via\n * clearStream(), so nothing is lost. */\n private armStreamIdleExpiry(): void {\n if (this.streamIdleTimer) clearTimeout(this.streamIdleTimer);\n this.streamIdleTimer = setTimeout(() => {\n this.streamIdleTimer = null;\n if (!this.streamThinking && !this.streamResponse) return;\n this.streamThinking = \"\";\n this.streamResponse = \"\";\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 const clamp = (s: string, wrap: string, lead: string): string => {\n const max = cols - 2;\n const t = s.length > max ? s.slice(0, Math.max(0, max - 1)) + \"…\" : s;\n return wrap ? `${lead}${wrap}${t}${C.reset}` : `${lead}${t}`;\n };\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 realLines = (text: string): string[] =>\n text\n .replace(/\\r/g, \"\")\n .split(\"\\n\")\n .filter((l) => l.trim() !== \"\" && !leakedMarkup.test(l));\n if (this.streamResponse) {\n const all = realLines(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 clamp(l, \"\", i === 0 && firstVisible ? `${C.gray}•${C.reset} ` : \" \")\n );\n }\n if (this.streamThinking) {\n return realLines(this.streamThinking)\n .slice(-Tui.STREAM_TAIL)\n .map((l) => clamp(l, thinkStyle, \" \"));\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 const words = text.replace(/\\s+/g, \" \").trim().split(\" \");\n const lines: string[] = [];\n let cur = \"\";\n for (let w of words) {\n while (w.length > limit) {\n if (cur) {\n lines.push(cur);\n cur = \"\";\n }\n lines.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 lines.push(cur);\n cur = w;\n }\n }\n if (cur || !lines.length) lines.push(cur);\n // Width the bar to the longest line + the 2-col marker/indent.\n const innerW = 2 + Math.max(...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 // ─── working indicator (turn state) ───────────────────────────────────────\n\n setWorking(on: boolean): void {\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 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(), SPINNER_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 this.bgCount = n;\n if (n === 0) this.bgBadgeSelected = false; // badge gone → nothing to select\n this.renderBottom();\n }\n setQueuedCount(n: number): void {\n this.queuedCount = n;\n this.renderBottom();\n }\n setConnected(connected: boolean): void {\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(text: string, images: PastedImage[] = []): void {\n this.inputBuffer = text;\n this.cursorPos = text.length;\n this.pendingImages = images;\n this.historyIdx = null;\n this.renderBottom();\n }\n\n /** Cumulative token totals shown on the prompt line (`outTokens` includes live). */\n setTokens(inTokens: number, outTokens: number): void {\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) {\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 /** Approval prompt: arrow-navigable with y/a/l/n shortcuts. Pauses input.\n * Tab resolves \"deny_with_reason\" so the caller can collect a free-text reason. */\n approval(question: string, risk: number): Promise<\"allow\" | \"deny\" | \"always\" | \"always_risk\" | \"deny_with_reason\"> {\n return new Promise((resolve) => {\n const options: { value: \"allow\" | \"always\" | \"always_risk\" | \"deny\"; label: string; shortcut: string; color: 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 { value: \"always_risk\", label: `Allow all level ${risk} this session`, shortcut: \"l\", color: C.cyan },\n { value: \"deny\", label: \"Deny\", shortcut: \"n\", color: C.red },\n ];\n let idx = 0;\n const riskBar = `${C.red}${\"●\".repeat(risk)}${C.gray}${\"○\".repeat(5 - risk)}${C.reset}`;\n\n this.beginTakeover();\n // The header block is a leading blank row, the \"Permission needed\" line,\n // then one row per line of `question` (the command summary plus an optional\n // \"why:\" line). Every row carries the yellow bar so the block reads as one\n // unit — including continuation lines, which previously lost the bar.\n const cols = Math.max(1, process.stdout.columns || 80);\n const physRows = (line: string): number => Math.max(1, Math.ceil(this.visibleWidth(line) / cols));\n const headerText = `${C.yellow}┃${C.reset} ${C.bold}Permission needed${C.reset} risk ${riskBar}`;\n const questionLines = question.split(\"\\n\").map((line) => `${C.yellow}┃${C.reset} ${line}`);\n // Dim affordance row: Tab denies AND lets you tell the agent why.\n const hintLine = `${C.yellow}┃${C.reset} ${C.gray}⇥ tab — deny with a reason${C.reset}`;\n const blockLines = [headerText, ...questionLines, hintLine];\n // Count physical rows (a long command can wrap) so the erase below lines up.\n const headerRows = 1 + blockLines.reduce((n, line) => n + physRows(line), 0);\n process.stdout.write(`\\n` + blockLines.map((line) => `${line}\\n`).join(\"\"));\n const renderLine = (i: number): string => {\n const o = options[i];\n const sel = i === idx;\n const pointer = sel ? `${o.color}❯${C.reset}` : \" \";\n const label = sel ? `${C.bold}${o.label}${C.reset}` : o.label;\n return `${C.yellow}┃${C.reset} ${pointer} ${label} ${C.gray}(${o.shortcut})${C.reset}`;\n };\n const draw = (moveUp: boolean) => {\n if (moveUp) process.stdout.write(`\\x1b[${options.length}A`);\n for (let i = 0; i < options.length; i++) process.stdout.write(`\\r\\x1b[K${renderLine(i)}\\n`);\n };\n draw(false);\n\n // Erase the whole prompt (header block + options) once a choice is made so\n // it doesn't linger in the scrollback. After draw the cursor sits one row\n // below the last option.\n const erase = () => {\n process.stdout.write(\"\\r\");\n const up = headerRows + options.length;\n if (up > 0) process.stdout.write(`\\x1b[${up}A`);\n process.stdout.write(\"\\x1b[J\");\n };\n\n const finish = (choice: \"allow\" | \"deny\" | \"always\" | \"always_risk\" | \"deny_with_reason\") => {\n erase();\n this.endTakeover();\n resolve(choice);\n };\n this.takeoverHandler = (str, key) => {\n if (key?.name === \"up\" || str === \"k\") {\n idx = (idx - 1 + options.length) % options.length;\n draw(true);\n } else if (key?.name === \"down\" || str === \"j\") {\n idx = (idx + 1) % options.length;\n draw(true);\n } else if (key?.name === \"tab\") {\n // Plain Tab → deny, then explain why to the agent. (Shift+Tab is\n // consumed globally before takeovers, so this only sees plain Tab.)\n finish(\"deny_with_reason\");\n } else if (key?.name === \"return\" || key?.name === \"enter\") {\n finish(options[idx].value);\n } else {\n const k = (str || \"\").toLowerCase();\n if (k === \"y\") finish(\"allow\");\n else if (k === \"a\") finish(\"always\");\n else if (k === \"l\") finish(\"always_risk\");\n else if (k === \"n\" || key?.name === \"escape\") finish(\"deny\");\n }\n };\n });\n }\n\n /** Arrow-key selection menu (slash menu, process menu, resume). Pauses input. */\n select<T>(title: string, items: { label: string; hint?: string; value: T }[]): Promise<T | undefined> {\n return new Promise((resolve) => {\n let idx = 0;\n this.beginTakeover();\n if (title) process.stdout.write(`\\n${title}\\n\\n`);\n // Each row is clamped to ONE physical line (preview left, hint right-aligned)\n // so long session previews can't wrap — a wrapped row would desync the\n // \"move up N lines\" redraw and corrupt the menu on every keystroke.\n const renderLine = (i: number): string => {\n const w = process.stdout.columns || 80;\n const it = items[i];\n const sel = i === idx;\n const hint = it.hint ?? \"\";\n const hintW = hint.length;\n const pointerW = 2; // \"❯ \" or \" \"\n const labelMax = Math.max(6, w - 2 - pointerW - (hintW ? hintW + 2 : 0));\n let label = it.label;\n if (label.length > labelMax) label = label.slice(0, labelMax - 1) + \"…\";\n const pointer = sel ? `${C.magenta}❯${C.reset} ` : \" \";\n const styledLabel = sel ? `${C.bold}${C.cyan}${label}${C.reset}` : label;\n let line = `${pointer}${styledLabel}`;\n if (hintW) {\n const gap = Math.max(2, w - 2 - pointerW - label.length - hintW);\n line += `${\" \".repeat(gap)}${C.gray}${hint}${C.reset}`;\n }\n return line;\n };\n const draw = (moveUp: boolean) => {\n if (moveUp) process.stdout.write(`\\x1b[${items.length}A`);\n for (let i = 0; i < items.length; i++) process.stdout.write(`\\r\\x1b[K${renderLine(i)}\\n`);\n };\n draw(false);\n // Erase the whole menu block (title + rows) when it closes so it doesn't\n // linger in the scrollback. After draw the cursor sits one row below the\n // last item; the title block above occupies 3 rows (blank/title/blank).\n const titleRows = title ? 3 : 0;\n const erase = () => {\n process.stdout.write(\"\\r\");\n const up = titleRows + items.length;\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 close(items[idx].value);\n } else if (key.name === \"escape\") {\n close(undefined);\n }\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","/**\n * Sent-message history, stored in the THREAD KV (key `input_history`) — not on\n * the local filesystem. Session state lives server-side as a rule (like\n * approvals and the process registry) so it resumes from any machine and\n * leaves nothing behind on the host.\n *\n * KV is per-thread, but recall should feel per-project: when a NEW session\n * starts, the caller passes the project's newest prior thread as a seed and\n * the history carries over (and is copied to the new thread's KV). Oldest →\n * newest; capped so the value can't grow without bound. All IO is best-effort.\n */\n\nexport const HISTORY_KEY = \"input_history\";\nconst MAX_ENTRIES = 100;\n\n/** The KV surface history needs (satisfied by ApiClient). */\nexport interface HistoryStore {\n kvGet(threadId: string, key: string): Promise<unknown>;\n kvSet(threadId: string, key: string, value: unknown): Promise<void>;\n}\n\nfunction clean(value: unknown): string[] {\n if (!Array.isArray(value)) return [];\n return value.filter((e): e is string => typeof e === \"string\" && e.trim() !== \"\").slice(-MAX_ENTRIES);\n}\n\n/**\n * Load the thread's sent-message history. When the thread has none yet (a\n * fresh session) and a seed thread is given, inherit the seed's history and\n * persist it onto this thread so the chain continues from here.\n */\nexport async function loadHistory(\n store: HistoryStore,\n threadId: string,\n seedThreadId?: string\n): Promise<string[]> {\n const own = clean(await store.kvGet(threadId, HISTORY_KEY));\n if (own.length) return own;\n if (seedThreadId && seedThreadId !== threadId) {\n const seeded = clean(await store.kvGet(seedThreadId, HISTORY_KEY));\n if (seeded.length) {\n void store.kvSet(threadId, HISTORY_KEY, seeded);\n return seeded;\n }\n }\n return [];\n}\n\n/**\n * Append a sent message to the in-memory history (skipping a consecutive\n * duplicate), cap it, and persist the whole list to the thread KV. Returns\n * the same array, mutated, so the caller's reference stays current.\n */\nexport function appendHistory(\n store: HistoryStore,\n threadId: string,\n history: string[],\n text: string\n): string[] {\n const t = text.trim();\n if (!t || history[history.length - 1] === t) return history;\n history.push(t);\n if (history.length > MAX_ENTRIES) history.splice(0, history.length - MAX_ENTRIES);\n void store.kvSet(threadId, HISTORY_KEY, [...history]);\n return history;\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\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 (asterisk forms only — underscores are common in code/ids).\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) => `${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 inFence = false;\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 if (/^\\s*```/.test(line)) {\n inFence = !inFence;\n i++;\n continue;\n }\n if (inFence) {\n out.push(`${GRAY}│${R} ${line}`);\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","/**\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\";\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: { ...process.env, ...(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","/** Read/write ~/.standardagents/credentials. */\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport os from \"node:os\";\nimport type { CredentialsFile, InstanceCredential } from \"./types.ts\";\n\nconst DIR = path.join(os.homedir(), \".standardagents\");\nconst FILE = path.join(DIR, \"credentials\");\n\nexport function normalizeEndpoint(endpoint: string): string {\n let e = endpoint.trim();\n if (!/^https?:\\/\\//i.test(e)) e = \"http://\" + e;\n return e.replace(/\\/+$/, \"\");\n}\n\nexport function loadCredentials(): CredentialsFile {\n try {\n const raw = fs.readFileSync(FILE, \"utf8\");\n const parsed = JSON.parse(raw) as CredentialsFile;\n if (!parsed.instances) parsed.instances = {};\n return parsed;\n } catch {\n return { instances: {} };\n }\n}\n\nexport function getCredential(endpoint: string): InstanceCredential | null {\n const creds = loadCredentials();\n return creds.instances[normalizeEndpoint(endpoint)] ?? null;\n}\n\nexport function saveCredential(\n cred: InstanceCredential,\n options: { updateDefault?: boolean } = {}\n): void {\n const creds = loadCredentials();\n const endpoint = normalizeEndpoint(cred.endpoint);\n creds.instances[endpoint] = { ...cred, endpoint };\n if (options.updateDefault ?? true) {\n creds.default_endpoint = endpoint;\n }\n fs.mkdirSync(DIR, { recursive: true });\n // Credentials contain a bearer token — keep them private.\n fs.writeFileSync(FILE, JSON.stringify(creds, null, 2), { mode: 0o600 });\n try {\n fs.chmodSync(FILE, 0o600);\n } catch {\n // best effort on platforms without chmod\n }\n}\n\n/** Remove the saved token for an endpoint (the `/logout` command). */\nexport function deleteCredential(endpoint: string): void {\n const creds = loadCredentials();\n delete creds.instances[normalizeEndpoint(endpoint)];\n fs.mkdirSync(DIR, { recursive: true });\n fs.writeFileSync(FILE, JSON.stringify(creds, null, 2), { mode: 0o600 });\n try {\n fs.chmodSync(FILE, 0o600);\n } catch {\n // best effort on platforms without chmod\n }\n}\n\nexport function defaultEndpoint(): string | null {\n return loadCredentials().default_endpoint ?? null;\n}\n\nexport function saveDefaultEndpoint(endpoint: string): void {\n const creds = loadCredentials();\n creds.default_endpoint = normalizeEndpoint(endpoint);\n fs.mkdirSync(DIR, { recursive: true });\n fs.writeFileSync(FILE, JSON.stringify(creds, null, 2), { mode: 0o600 });\n try {\n fs.chmodSync(FILE, 0o600);\n } catch {\n // best effort on platforms without chmod\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 (6h 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\";\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 * 6; // 6 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], { detached: true, stdio: \"ignore\" });\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 6 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 */\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 if (cached.latest !== currentVersion) {\n return { current: currentVersion, latest: cached.latest };\n }\n return null; // up to date per cache\n }\n\n const latest = await fetchLatest(currentVersion);\n if (!latest) return null;\n writeCache(latest);\n return 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 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 });\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 * Standard Code CLI entry point.\n *\n * Pre-flight (plain readline): resolve the instance endpoint, OAuth-login if\n * needed, then offer to resume a thread tagged for this project+machine or start\n * a new one. Then hand off to the interactive TUI which streams the agent and\n * forwards its tools to this host.\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 SkillInfo, type SubagentInfo } from \"./api.ts\";\nimport { Bridge } from \"./bridge.ts\";\nimport { HostTools } from \"./host-tools.ts\";\nimport { MessageStream } from \"./stream.ts\";\nimport { SystemEvents } from \"./events-stream.ts\";\nimport { Tui, type PastedImage } from \"./tui.ts\";\nimport { loadHistory, appendHistory } from \"./history.ts\";\nimport { renderMarkdown } from \"./markdown.ts\";\nimport { ProcessRegistry } from \"./process-registry.ts\";\nimport { McpManager } from \"./mcp.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 } from \"./render.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 AGENT_ID = \"standard_code_agent\";\n// The instance's model gearbox hands sessions between agent variants; a\n// thread parked in another gear must still be resumable from the CLI.\nconst AGENT_ID_VARIANTS = [AGENT_ID, \"standard_code_high_agent\"];\n// The hosted Standard Code instance — where every normal user's session\n// lives. Only `--endpoint` (rare: local dev, self-hosted) points elsewhere.\nconst PRODUCTION_ENDPOINT = \"https://api.standardcode.ai\";\n\nconst c = {\n reset: \"\\x1b[0m\",\n dim: \"\\x1b[2m\",\n bold: \"\\x1b[1m\",\n white: \"\\x1b[97m\",\n cyan: \"\\x1b[36m\",\n green: \"\\x1b[32m\",\n gray: \"\\x1b[90m\",\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}\n\nfunction printUsage(): void {\n output.write(\n [\n \"\",\n `${c.bold}Usage${c.reset}`,\n \" standardcode [options] [dir]\",\n \"\",\n `${c.bold}Options${c.reset}`,\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 \" -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 === \"--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 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 renderMarkdown(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.\n */\nfunction startLoader(label: string): { stop: () => void } {\n const frames = [\"⣷\", \"⣯\", \"⣟\", \"⡿\", \"⢿\", \"⣻\", \"⣽\", \"⣾\"];\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${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/** A calm, branded goodbye printed on a graceful shutdown. */\nfunction farewell(stoppedProcs = 0): void {\n output.write(\"\\x1b[?25h\"); // re-show the cursor in case a loader had it hidden\n if (stoppedProcs > 0) {\n output.write(\n `\\n${c.cyan}⚙${c.reset} Stopped ${stoppedProcs} background process${stoppedProcs === 1 ? \"\" : \"es\"}.\\n`\n );\n }\n output.write(`\\n${c.teal}◇${c.reset} ${c.dim}Standard Code — see you soon.${c.reset}\\n`);\n}\n\n/** Whether a hostname is a local/private dev address (loopback, .local, RFC-1918). */\nfunction 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 */\nfunction 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/** Read this package's version from package.json (best effort). */\nfunction readVersion(): string {\n try {\n const pkg = JSON.parse(fs.readFileSync(new URL(\"../package.json\", import.meta.url), \"utf8\"));\n return typeof pkg.version === \"string\" ? pkg.version : \"\";\n } catch {\n return \"\";\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 // 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}${dir}${c.reset}`,\n ];\n const markWidth = Math.max(...LOGO_MARK.map((l) => [...l].length));\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 * 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. Replaces the old wrap-everything-in-gray.\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 over the bridge, 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\nasync function main(): Promise<void> {\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 const endpointArg = cliArgs.endpoint;\n const endpointOverride = cliArgs.promptEndpoint || (typeof endpointArg === \"string\" && endpointArg.trim() !== \"\");\n const dirArg = cliArgs.dir;\n\n const 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}${gradientText(\"Sign in to 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. Offer to resume a session for this project+machine, or start new.\n const tags = [`path:${projectDir}`, `machine:${machine}`];\n const loadingSessions = startLoader(\"Loading sessions\");\n let existing: ThreadSummary[] = [];\n try {\n existing = await api.listThreads(AGENT_ID_VARIANTS, tags);\n } catch {\n existing = [];\n }\n const summaries = existing.length > 0 ? await summarizeThreads(api, existing.slice(0, 8)) : [];\n loadingSessions.stop();\n\n const tui = new Tui(1); // auto-accept level 1 by default (asks on anything riskier than a read)\n\n let threadId: string;\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 if (existing.length > 0) {\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 home = os.homedir();\n const tilde = projectDir.startsWith(home) ? \"~\" + projectDir.slice(home.length) : projectDir;\n const shortDir = tilde.length > 38 ? \"…\" + tilde.slice(-37) : tilde;\n const picked = await tui.select(\n `${c.bold}${c.magenta}Resume a session${c.reset} ${c.gray}${shortDir}${c.reset} ${c.dim}↑↓ · enter · esc to cancel${c.reset}`,\n items\n );\n if (typeof picked === \"string\") {\n threadId = picked;\n resumed = true;\n } else {\n threadId = await api.createThread(AGENT_ID, tags);\n historySeed = existing[0]?.id;\n }\n } else {\n threadId = await api.createThread(AGENT_ID, tags);\n }\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 await runInteractive(tui, api, threadId, projectDir, machine, resumed, historySeed);\n historySeed = threadId;\n threadId = await api.createThread(AGENT_ID, tags);\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/** Build a one-line preview (first user message) + timestamp for each thread. */\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 const msgs = await api.getMessages(t.id, 30);\n const users = msgs\n .filter((m: any) => m.role === \"user\" && typeof m.content === \"string\" && m.content.trim())\n .sort((a: any, b: any) => (a.created_at ?? 0) - (b.created_at ?? 0));\n if (users[0]) preview = String(users[0].content).replace(/\\s+/g, \" \").trim();\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 const hint = [t.id.slice(0, 8), when].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 * 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 the\n * approval mints our personal API key. Throws with a plain message on\n * timeout or failure.\n */\nasync function deviceLogin(endpoint: string): Promise<string> {\n const start = await fetch(`${endpoint}/api/auth/device/start`, { method: \"POST\" });\n if (!start.ok) throw new Error(`This instance does not support browser sign-in (HTTP ${start.status}). Paste an API token instead.`);\n const info = (await start.json()) as { code: string; verify_url: string; poll_url: string; interval?: number; expires_in?: number };\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 const deadline = Date.now() + (info.expires_in ?? 600) * 1000;\n const interval = Math.max(2, info.interval ?? 2) * 1000;\n while (Date.now() < deadline) {\n await new Promise((r) => setTimeout(r, interval));\n const res = await fetch(info.poll_url).catch(() => null);\n if (!res) continue;\n if (res.status === 404) throw new Error(\"The sign-in link expired. Try again.\");\n const body = (await res.json().catch(() => ({}))) as { status?: string; token?: string };\n if (body.status === \"approved\" && body.token) return body.token;\n if (body.status === \"denied\") throw new Error(\"Sign-in was denied in the browser.\");\n }\n throw new Error(\"Timed out waiting for browser approval. Try again.\");\n}\n\n/** Open a URL in the system browser (best effort). */\nfunction 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, { stdio: \"ignore\", detached: true });\n child.unref();\n } catch {\n // ignore — the URL is also printed for manual opening\n }\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/**\n * Whether a message carries tool calls. The API serializes `tool_calls` as a\n * JSON STRING (not an array), so `Array.isArray` is never true — checking only\n * that would treat a tool-call assistant message (which can also have narration\n * content) as a final answer, completing the turn while a tool/approval is still\n * pending. Handle both shapes.\n */\nfunction hasToolCalls(m: any): boolean {\n const tc = m?.tool_calls;\n if (Array.isArray(tc)) return tc.length > 0;\n if (typeof tc === \"string\") {\n const s = tc.trim();\n return s.length > 0 && s !== \"null\" && s !== \"[]\";\n }\n return false;\n}\n\n/** Extract plain text from a message's content (string or content-block array). */\nfunction messageText(content: unknown): string {\n if (typeof content === \"string\") return content;\n if (Array.isArray(content)) {\n return content\n .map((b: any) => (typeof b === \"string\" ? b : typeof b?.text === \"string\" ? b.text : \"\"))\n .join(\"\");\n }\n return \"\";\n}\n\n/** Whether the thread is currently working (a turn active or queued work pending). */\nfunction threadBusy(msgs: any[]): boolean {\n if (!msgs.length) return false;\n if (msgs.some((m) => m.status === \"pending\")) return true;\n const last = [...msgs].sort((a, b) => (b.created_at ?? 0) - (a.created_at ?? 0))[0];\n if (!last) return false;\n if (last.role === \"user\" || last.role === \"tool\") return true; // turn about to run / mid-turn\n if (last.role === \"assistant\") return hasToolCalls(last); // tool-call message = still going\n return false; // a final assistant text, or a system/stop message → idle\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((m) => m.role === \"user\" || (m.role === \"assistant\" && messageText(m.content).trim()))\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 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 threadId: string,\n projectDir: string,\n machine: string,\n resumed: boolean,\n historySeedThreadId?: string\n): Promise<void> {\n // Background-process metadata lives in the thread's KV (server-side), so the\n // list resumes from any machine; nothing about it is stored on this client.\n const registry = new ProcessRegistry(api, threadId, machine);\n // MCP host: the CLI negotiates with locally-launched MCP servers and forwards\n // the agent's `mcp` tool calls to them. The discovered tool catalog is mirrored\n // into the thread KV so a context hook can show the agent what's available.\n const mcp = new McpManager(projectDir);\n const publishMcpCatalog = () => void api.kvSet(threadId, \"mcp_catalog\", mcp.catalog()).catch(() => {});\n const host = new HostTools(projectDir, registry, threadId, machine, mcp, publishMcpCatalog, api);\n const refreshBgCount = () => {\n void registry.runningCount().then((n) => tui.setBackgroundCount(n)).catch(() => {});\n };\n const perm: PermissionState = { level: tui.level, alwaysAllow: new Set(), allowRisk: new Set() };\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 // Tell the agent where its shell lives: the instance's context hook renders\n // this as a synthetic opening pwd exchange + a [SESSION] line, so the agent\n // never burns a bash call (or a cd prefix) discovering its own cwd.\n void api.kvSet(threadId, \"session_info\", { cwd: projectDir, machine }).catch(() => {});\n\n // Everything from here to the banner is session wiring (history load, the\n // bridge/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 // Set when the user hits esc to interrupt: clears the working indicator\n // immediately and suppresses the poller from re-showing it until the backend\n // confirms the turn actually stopped (otherwise \"Working\" lingers a poll or two).\n let interrupting = false;\n // Messages typed while busy, held to send next (with any pasted images).\n const queued: { text: string; images: PastedImage[] }[] = [];\n let editingQueued = false; // input currently holds a pulled queued message\n const shownIds = new Set<string>(); // message ids already printed to the transcript\n // User messages the CLI optimistically displayed on send, keyed by content, so\n // the poller doesn't re-print them — while it DOES render user messages that\n // were submitted from elsewhere (web UI, API, another client).\n const pendingSent = new Map<string, number>();\n\n // ── token feed ──────────────────────────────────────────────────────────\n // Cumulative tokens are authoritative from logs (one row per completed LLM\n // call); a live estimate from streamed content ticks the output count up\n // between log updates so a long generation isn't silent.\n let tokensIn = 0;\n let tokensOut = 0;\n let liveOut = 0; // output tokens for the in-progress response (from `generation` events)\n const countedLogs = new Set<string>();\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 // bridge — which actually runs the forwarded tools on the host — RECONCILES it:\n // it fills in a `started` the stream missed and clears a `done` it dropped, so\n // the label can't strand on a tool that already finished (see Bridge onStatus).\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 totals + step to the prompt. Output total folds in the\n // live in-progress count; the step's own output is the live count.\n const refreshStatus = () => {\n tui.setTokens(tokensIn, tokensOut + liveOut);\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 const bridge = new Bridge(api, threadId, host, perm, {\n onActivity: (line, detail) => {\n tui.print(colorActivity(line));\n // Pre-styled extra rows (truncated diffs for edits/writes) print verbatim.\n if (detail) for (const d of detail) tui.print(d);\n refreshBgCount();\n },\n onStatus: (id, summary) => {\n // Reconcile the stream's best-effort step signal with what the host is\n // really running — the CLI executes the forwarded tools, so it knows:\n // - on start: fill in a `started` the stream may have dropped, but DON'T\n // override a label the stream already set (it can be richer/intentional).\n // - on finish: authoritatively clear it, healing a dropped `done` so the\n // label can't strand on a tool that already completed.\n // Durable calls share the tool-call id with the stream, so this lines up.\n if (summary) {\n if (!activeSteps.has(id)) activeSteps.set(id, summary);\n } else {\n activeSteps.delete(id);\n }\n refreshStatus();\n },\n onConnection: (state, attempt) => {\n // Brief drops are normal (a permission wait, a dev-server reload) and the\n // bridge reconnects on its own — stay quiet unless reconnection is actually\n // struggling (several seconds of failed attempts). The disconnect shows as a\n // TRANSIENT notice line in the bottom region that clears itself the moment we\n // reconnect, so nothing about it lingers in the transcript.\n if (state === \"reconnecting\") {\n if (attempt >= 4) tui.setConnected(false);\n } else {\n tui.setConnected(true);\n }\n },\n requestApproval: async (req, summary, risk) => {\n const choice = await tui.approval(\n `${summary}${req.requestPermission ? `\\n${c.bold}why: ${req.requestPermission}${c.reset}` : \"\"}`,\n risk\n );\n if (choice === \"deny_with_reason\") {\n // Tab on the approval menu: deny, but tell the agent why so it can adapt.\n const reason = await tui.prompt(\n \"Why are you denying this? (sent to the agent — enter to send, esc to skip)\"\n );\n return { choice: \"deny\", reason: reason ?? undefined };\n }\n return { choice };\n },\n });\n\n // The message stream drives two live signals (the transcript itself is\n // rendered from polling for robustness):\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 // Live streaming preview: answer text and (opt-in) internal reasoning feed\n // the TUI's ephemeral preview; the committed message still renders from\n // polling, which calls tui.clearStream() first so there's no double-render.\n onChunk: (text, mid) => tui.streamResponseDelta(text, mid),\n onReasoningChunk: (text, mid) => tui.streamThinkingDelta(text, mid),\n onAssistantText: () => {},\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 }\n },\n onError: () => {},\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 — not on the\n // thread-registry events. So we treat the system-events channel purely as a\n // \"something changed\" signal and re-read /api/threads/:id/subagents, showing a\n // line only for subagents whose status is `running`.\n // Running child threadId -> display label + raw agent name (the TUI colors\n // the compaction agent orange by name).\n const activeSubagents = new Map<string, { label: 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 const pushSubagents = () =>\n tui.setSubagents(\n [...activeSubagents.entries()].map(([id, s]) => ({ id, label: s.label, agentName: s.agentName }))\n );\n // Rebuild the running-subagent set from the authoritative child registry.\n // Runs on every (re)connect (covering subagents that started before this\n // socket, or during a reconnect gap) and whenever a child thread changes.\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 // Show the live status text on the line when it's more than the bare\n // lifecycle marker, so the user can see what the subagent is doing.\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 const detail = oneLineStatus && oneLineStatus !== \"running\" ? ` — ${oneLineStatus.slice(0, 80)}` : \"\";\n activeSubagents.set(s.id, {\n label: `${subagentLabel(s, agentTitles)}${detail}`,\n agentName: s.agent_name ?? undefined,\n });\n }\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 events = new SystemEvents(api, {\n onOpen: () => scheduleReconcile(),\n onThreadCreated: (t) => {\n if (t.parent === threadId) scheduleReconcile();\n },\n onThreadUpdated: (t) => {\n if (t.parent === threadId) scheduleReconcile();\n },\n onThreadDeleted: (id) => {\n if (activeSubagents.has(id)) scheduleReconcile();\n },\n });\n // Registry status text (setStatus / sessionStatus heartbeats) changes without\n // firing a thread event, so while any subagent line is visible, refresh it on\n // a slow poll to keep the displayed working state current. Discovery of NEW\n // subagents still comes from the events above; this only keeps text fresh.\n const heartbeatPoll = setInterval(() => {\n if (activeSubagents.size > 0) scheduleReconcile();\n }, 5000);\n heartbeatPoll.unref();\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 // Stop the agent's turn on the backend before we exit — the LLM loop runs\n // remotely, so without this it would keep working after the CLI disconnects.\n // Also kill any background processes this machine spawned: they're detached,\n // so without this they'd outlive the session. Fire both, tear down locally,\n // then wait briefly so they land (capped so quitting stays snappy even if\n // the instance is unreachable).\n const stopped = api.stop(threadId).catch(() => {});\n const procsStopped = host.stopAllLocalProcesses().catch(() => 0);\n bridge.close();\n stream.close();\n events.close();\n mcp.closeAll();\n const [, killed] = await Promise.race([\n Promise.all([stopped, procsStopped]),\n new Promise<[unknown, number]>((r) => setTimeout(() => r([undefined, 0]), 1500)),\n ]);\n farewell(killed);\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 (stop the turn + this machine's background processes). The next\n // 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 stop: async (id: string) => {\n await host.execute(\"background_process\", { action: \"stop\", id });\n refreshBgCount();\n },\n };\n\n // ── MCP control surface (for the /mcp command + slash menu) ────────────────\n const mcpCtl: McpController = {\n configured: () => listMcpServers(),\n connectedNames: () => mcp.connectedNames(),\n catalog: () => mcp.catalog(),\n connect: async (cfg) => {\n try {\n const client = await mcp.connect(cfg);\n publishMcpCatalog();\n return { ok: true, tools: client.tools.length };\n } catch (e) {\n publishMcpCatalog();\n return { ok: false, error: e instanceof Error ? e.message : String(e) };\n }\n },\n disconnect: (name) => {\n mcp.disconnect(name);\n publishMcpCatalog();\n },\n add: async (cfg) => {\n saveMcpServer(cfg);\n return mcpCtl.connect(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) => {\n mcp.disconnect(name);\n removeMcpServer(name);\n publishMcpCatalog();\n },\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\n const sendNow = async (text: string, images: PastedImage[] = []) => {\n tui.printUserMessage(text);\n // Mark it shown so the poller (which now also renders user messages) doesn't\n // double-print our own send once the backend persists it.\n const key = text.trim();\n pendingSent.set(key, (pendingSent.get(key) ?? 0) + 1);\n try {\n await api.sendMessage(threadId, text, 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 tui.print(`${c.dim}failed to send: ${e instanceof Error ? e.message : String(e)}${c.reset}`);\n return;\n }\n interrupting = false; // a fresh turn — let the working indicator show again\n busy = true;\n tui.setWorking(true);\n };\n const flushQueued = async () => {\n if (!queued.length) return;\n const toSend = queued.splice(0);\n tui.setQueuedCount(0);\n for (const q of toSend) await sendNow(q.text, q.images);\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 // ── 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 { 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 {\n name: \"mcp\",\n label: \"MCP servers\",\n hint: () => {\n const n = mcpCtl.connectedNames().length;\n return n ? `${n} connected` : \"none\";\n },\n run: () => runMcpMenu(tui, mcpCtl),\n },\n {\n name: \"skills\",\n label: \"Agent skills\",\n hint: \"list / install / manage\",\n run: () => runSkillsMenu(tui, skillsCtl),\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 tui.onSubmit = (text, images) => {\n appendHistory(api, threadId, history, text);\n if (editingQueued) {\n editingQueued = false;\n queued.push({ text, images });\n tui.setQueuedCount(queued.length);\n tui.print(`${c.gray}⏳ queued:${c.reset} ${text}`);\n return;\n }\n if (busy) {\n queued.push({ text, images });\n tui.setQueuedCount(queued.length);\n tui.print(`${c.gray}⏳ queued:${c.reset} ${text} ${c.dim}(esc to steer now)${c.reset}`);\n } else {\n void sendNow(text, images);\n }\n };\n\n tui.onInterrupt = () => {\n if (queued.length > 0) {\n tui.print(`${c.yellow}↪ steering — stopping current work and sending your message…${c.reset}`);\n void api\n .stop(threadId)\n .catch(() => {})\n .then(() => flushQueued());\n } else if (busy) {\n // Optimistically stop the working indicator so esc feels immediate.\n interrupting = true;\n busy = false;\n activeSteps.clear();\n liveOut = 0;\n tui.setWorking(false);\n refreshStatus();\n tui.print(`${c.yellow}[interrupted by user]${c.reset}`);\n void api.stop(threadId).catch(() => {});\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() || queued.length === 0) return false;\n const q = queued.pop()!;\n tui.setQueuedCount(queued.length);\n editingQueued = true;\n tui.setInput(q.text, q.images);\n return true;\n };\n\n events.connect();\n await Promise.all([bridge.connect(), 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 tui.banner([\n `${c.bold}${c.magenta}Standard Code${c.reset} ${c.dim}— coding agent${c.reset}`,\n `${c.gray}project:${c.reset} ${projectDir}`,\n `${c.gray}machine:${c.reset} ${machine} ${c.gray}thread:${c.reset} ${threadId.slice(0, 8)}`,\n ]);\n\n if (resumed) await printHistory(api, threadId, tui);\n\n // Seed shown-ids so the poller doesn't re-print existing 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 // Connect every enabled MCP server, then publish the catalog so the agent sees\n // the tools on its very first step. (The CLI is the MCP host; this is the real\n // initialize/tools-list handshake with each local server.)\n const enabledServers = listMcpServers().filter((s) => s.enabled);\n for (const s of enabledServers) {\n const res = await mcpCtl.connect(s);\n if (res.ok) {\n tui.print(`${c.cyan}⚡ MCP \"${s.name}\" connected${c.reset} ${c.gray}(${res.tools} tool${res.tools === 1 ? \"\" : \"s\"})${c.reset}`);\n } else {\n tui.print(`${c.red}⚠ MCP \"${s.name}\" failed:${c.reset} ${c.gray}${res.error}${c.reset}`);\n }\n }\n publishMcpCatalog();\n\n tui.start(); // begin the persistent input line\n\n // ── poller: display new messages, drive the working indicator, flush queue ──\n const poll = async () => {\n let msgs: any[];\n try {\n msgs = await api.getMessages(threadId, 60);\n } catch {\n return;\n }\n const sorted = [...msgs].sort((a, b) => (a.created_at ?? 0) - (b.created_at ?? 0));\n for (const m of sorted) {\n if (shownIds.has(m.id) || m.status === \"pending\") continue;\n shownIds.add(m.id);\n const text = messageText(m.content).trim();\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 const polledBusy = threadBusy(msgs);\n // While interrupting, keep the indicator off until the backend has actually\n // gone idle — then clear the latch so future turns show \"Working\" again.\n if (interrupting) {\n if (!polledBusy) interrupting = false;\n busy = false;\n } else {\n busy = polledBusy;\n }\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 if (queued.length > 0 && !editingQueued) await flushQueued();\n }\n refreshBgCount();\n\n // Authoritative token totals from completed LLM-call logs.\n try {\n const logs = await api.getLogs(threadId, 100);\n let landed = 0;\n for (const l of logs) {\n // Skip until the call is finalized — an in-progress log has null tokens,\n // and counting it early would mark its id seen before the real counts land.\n if (!l.is_complete) continue;\n const id = l.id ?? `${l.created_at}:${l.total_tokens}`;\n if (countedLogs.has(id)) continue;\n countedLogs.add(id);\n const inT = Number(l.input_tokens) || 0;\n const outT = Number(l.output_tokens) || 0;\n tokensIn += inT;\n tokensOut += outT;\n landed += outT;\n }\n if (landed > 0) liveOut = 0; // a real count arrived; drop the live estimate\n refreshStatus();\n } catch {\n // ignore — token feed is best-effort\n }\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 const pollTimer = setInterval(() => void poll().catch(() => {}), 1200);\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 clearInterval(pollTimer);\n clearInterval(heartbeatPoll);\n // Stop the remote turn (the LLM loop runs server-side) and this machine's\n // background processes — the fresh thread's registry won't know about them.\n const stopped = api.stop(threadId).catch(() => {});\n const procsStopped = host.stopAllLocalProcesses().catch(() => 0);\n bridge.close();\n stream.close();\n events.close();\n mcp.closeAll();\n const [, killed] = await Promise.race([\n Promise.all([stopped, procsStopped]),\n new Promise<[unknown, number]>((r) => setTimeout(() => r([undefined, 0]), 1500)),\n ]);\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.setQueuedCount(0);\n tui.setContextPct(null);\n tui.setStep(null, 0);\n tui.setBackgroundCount(0);\n if (killed > 0) {\n tui.print(`${c.cyan}⚙${c.reset} Stopped ${killed} background process${killed === 1 ? \"\" : \"es\"}.`);\n }\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\ninterface McpController {\n configured: () => McpServerConfig[];\n connectedNames: () => string[];\n catalog: () => { servers: { name: string; status: string; tools: { name: string; description?: string }[]; resources: { uri: string }[]; error?: string }[] };\n connect: (cfg: McpServerConfig) => Promise<{ ok: boolean; tools?: number; error?: string }>;\n disconnect: (name: string) => void;\n add: (cfg: McpServerConfig) => Promise<{ ok: boolean; tools?: number; error?: string }>;\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/** 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} /${c.reset} open the command palette (type to filter)`);\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 this process\", value: \"stop\" as const },\n { label: \"Leave it running\", value: \"leave\" as const },\n ]);\n if (action === \"stop\") {\n await bg.stop(picked);\n tui.print(`${c.gray}stopped ${picked}${c.reset}`);\n }\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: `All level ${r} risk`, hint: \"always allowed\", 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 * configured servers with status, and lets you add (free-text command), view\n * tools, connect/disconnect, enable/disable, and remove — all menu-driven.\n */\nasync function runMcpMenu(tui: Tui, mcp: McpController): Promise<void> {\n const configured = mcp.configured();\n const connected = new Set(mcp.connectedNames());\n const cat = 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 : connected.has(s.name)\n ? `connected · ${entry?.tools.length ?? 0} tools`\n : entry?.error\n ? \"error\"\n : \"disconnected\";\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}(↑/↓ · enter · esc to close)${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 const isConnected = connected.has(picked);\n\n const action = await tui.select(`${c.bold}${picked}${c.reset}`, [\n { label: \"View tools\", value: \"tools\" as const },\n isConnected\n ? { label: \"Disconnect\", value: \"disconnect\" as const }\n : { label: \"Connect\", value: \"connect\" 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 = mcp.catalog().servers.find((e) => e.name === picked);\n if (!entry || entry.status !== \"connected\") {\n tui.print(`${c.gray}${picked} is not connected — connect it to list tools.${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 === \"connect\") {\n const res = await mcp.connect(server);\n tui.print(res.ok ? `${c.cyan}⚡ connected (${res.tools} tools)${c.reset}` : `${c.red}⚠ ${res.error}${c.reset}`);\n } else if (action === \"disconnect\") {\n mcp.disconnect(picked);\n tui.print(`${c.gray}disconnected ${picked}${c.reset}`);\n } else if (action === \"enable\") {\n mcp.setEnabled(picked, true);\n const res = await mcp.connect(server);\n tui.print(res.ok ? `${c.cyan}⚡ enabled + connected (${res.tools} tools)${c.reset}` : `${c.red}⚠ enabled but failed: ${res.error}${c.reset}`);\n } else if (action === \"disable\") {\n mcp.setEnabled(picked, false);\n mcp.disconnect(picked);\n tui.print(`${c.gray}disabled + disconnected ${picked}${c.reset}`);\n } else if (action === \"remove\") {\n mcp.remove(picked);\n tui.print(`${c.gray}removed ${picked}${c.reset}`);\n }\n}\n\n/** Prompt for a new MCP server (`name: command args`), then save + connect 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 tui.print(`${c.gray}connecting MCP \"${cfg.name}\" (${cfg.command} ${cfg.args.join(\" \")})…${c.reset}`);\n const res = await mcp.add(cfg);\n if (res.ok) tui.print(`${c.cyan}⚡ MCP \"${cfg.name}\" connected${c.reset} ${c.gray}(${res.tools} tool${res.tools === 1 ? \"\" : \"s\"})${c.reset}`);\n else tui.print(`${c.red}⚠ MCP \"${cfg.name}\" failed:${c.reset} ${c.gray}${res.error}${c.reset} ${c.dim}(saved; retry from the MCP menu)${c.reset}`);\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"]}
|
|
1
|
+
{"version":3,"sources":["../src/api.ts","../src/permissions.ts","../src/approvals.ts","../src/heartbeat.ts","../src/render.ts","../src/bridge.ts","../src/process-registry.ts","../src/mcp-config.ts","../src/host-tools.ts","../src/stream.ts","../src/events-stream.ts","../src/wordmill.ts","../src/types.ts","../src/clipboard.ts","../src/tui.ts","../src/history.ts","../src/markdown.ts","../src/mcp.ts","../src/credentials.ts","../src/check-update.ts","../src/index.ts"],"names":["clean","DIM","RESET","cols","path","os","KEY","fs","input","isAlive","hasToolCalls","c","clamp","BOLD","spawn","crypto","output","parseArgs","readline","connecting","check","stopped","procsStopped","killed"],"mappings":"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","file":"index.js","sourcesContent":["/** Minimal REST client for the Standard Agents instance. */\nimport type { ThreadSummary } from \"./types.ts\";\n\n/** Outcome of an endpoint+token check, with a human-precise failure story. */\nexport type VerifyResult =\n | { ok: true }\n | { ok: false; reason: string; hint?: string };\n\n/**\n * Turn a fetch() failure into a precise, human explanation. Node reports the\n * real cause (DNS, refused, timeout, TLS, offline) as error codes buried in\n * the `cause` chain — surface them instead of a generic \"didn't work\".\n */\nfunction classifyConnectError(err: unknown, endpoint: string): VerifyResult {\n const host = endpoint.replace(/^https?:\\/\\//, \"\").replace(/\\/.*$/, \"\");\n // Collect codes + messages across the cause chain (undici nests them).\n const codes = new Set<string>();\n const messages: string[] = [];\n for (let e: any = err; e; e = e.cause) {\n if (typeof e.code === \"string\") codes.add(e.code);\n if (typeof e.message === \"string\") messages.push(e.message);\n if (Array.isArray(e.errors)) {\n for (const sub of e.errors) {\n if (typeof sub?.code === \"string\") codes.add(sub.code);\n if (typeof sub?.message === \"string\") messages.push(sub.message);\n }\n }\n }\n const text = messages.join(\" | \");\n const has = (...wanted: string[]) => wanted.some((w) => codes.has(w));\n\n if (has(\"ENOTFOUND\", \"EAI_AGAIN\")) {\n return {\n ok: false,\n reason: `Can't resolve ${host} — no such hostname from this machine.`,\n hint: \"The endpoint URL is probably wrong (typo, or that server isn't running). Check the URL, your VPN, and local DNS.\",\n };\n }\n if (has(\"ECONNREFUSED\")) {\n return {\n ok: false,\n reason: `${host} refused the connection — nothing is listening there.`,\n hint: \"The instance looks stopped. Start it (or check the port in the endpoint URL).\",\n };\n }\n if (has(\"EHOSTUNREACH\", \"ENETUNREACH\", \"ENETDOWN\")) {\n return {\n ok: false,\n reason: `No route to ${host} — the network looks down or unreachable.`,\n hint: \"Check your internet connection / VPN.\",\n };\n }\n if (has(\"ETIMEDOUT\", \"UND_ERR_CONNECT_TIMEOUT\", \"UND_ERR_HEADERS_TIMEOUT\") || (err as any)?.name === \"TimeoutError\") {\n return {\n ok: false,\n reason: `${host} didn't answer in time.`,\n hint: \"The server may be overloaded or a firewall is eating the traffic. Try again.\",\n };\n }\n if (\n has(\n \"UNABLE_TO_VERIFY_LEAF_SIGNATURE\",\n \"DEPTH_ZERO_SELF_SIGNED_CERT\",\n \"SELF_SIGNED_CERT_IN_CHAIN\",\n \"CERT_HAS_EXPIRED\",\n \"ERR_TLS_CERT_ALTNAME_INVALID\"\n ) || /certificate|TLS|SSL/i.test(text)\n ) {\n return {\n ok: false,\n reason: `TLS problem talking to ${host}: ${text.slice(0, 120)}`,\n hint: \"For local/self-signed endpoints, use the http:// URL or trust the local CA.\",\n };\n }\n return {\n ok: false,\n reason: `Couldn't reach ${host}${text ? ` (${text.slice(0, 120)})` : \"\"}.`,\n hint: \"This is a connection problem, not a token problem — check the endpoint URL and your network.\",\n };\n}\n\n/** A subagent child thread with its current lifecycle status. */\nexport interface SubagentInfo {\n id: string;\n agent_name: string | null;\n title: string | null;\n threadName: string | null;\n status: string; // \"running\" | \"idle\" | \"terminated\" | custom\n}\n\n/** An installed Agent Skill's registry metadata. */\nexport interface SkillInfo {\n name: string;\n description: string;\n version?: string;\n enabled: boolean;\n files: string[];\n}\n\n/** A file attachment on an outgoing message (the instance's message-POST shape). */\nexport interface MessageAttachment {\n name: string;\n mimeType: string;\n data: string; // base64 encoded\n width?: number;\n height?: number;\n}\n\nexport interface GoalStep {\n step: string;\n status?: string; // \"pending\" | \"in_progress\" | \"done\"\n}\nexport interface GoalData {\n summary: string | null; // short ~5-word label shown while the goal is pursued\n description: string | null;\n steps: GoalStep[];\n}\n\nexport class ApiClient {\n constructor(\n private endpoint: string,\n private token: string\n ) {}\n\n get wsEndpoint(): string {\n return this.endpoint.replace(/^http/, \"ws\");\n }\n\n /** The instance origin (used to build admin-UI links). */\n get origin(): string {\n return this.endpoint;\n }\n\n get bearer(): string {\n return this.token;\n }\n\n private async json<T>(pathname: string, init?: RequestInit): Promise<T> {\n const res = await fetch(`${this.endpoint}${pathname}`, {\n ...init,\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${this.token}`,\n ...(init?.headers || {}),\n },\n });\n const text = await res.text();\n if (!res.ok) {\n throw new Error(`${init?.method || \"GET\"} ${pathname} -> ${res.status}: ${text.slice(0, 300)}`);\n }\n try {\n return JSON.parse(text) as T;\n } catch {\n return text as unknown as T;\n }\n }\n\n async verify(): Promise<boolean> {\n return (await this.verifyDetailed()).ok;\n }\n\n /**\n * Check the endpoint + token and say PRECISELY what's wrong when they\n * fail. \"That token didn't work\" is a lie when the real problem is a typo'd\n * hostname, a stopped server, or a dead network — sign-in errors must let\n * the user tell those apart from an actually-rejected key.\n */\n async verifyDetailed(): Promise<VerifyResult> {\n let res: Response;\n try {\n res = await fetch(`${this.endpoint}/api/auth/me`, {\n headers: { Authorization: `Bearer ${this.token}` },\n signal: AbortSignal.timeout(15_000),\n });\n } catch (err) {\n return classifyConnectError(err, this.endpoint);\n }\n if (res.ok) return { ok: true };\n if (res.status === 401) {\n return {\n ok: false,\n reason: \"The instance rejected this token — it's invalid, expired, or was revoked.\",\n hint: \"Create a fresh API key in the instance settings (or press Enter to sign in with your browser). Keys only work on the instance that minted them.\",\n };\n }\n if (res.status === 403) {\n return {\n ok: false,\n reason: \"The token was recognized, but this account isn't allowed to use the API here.\",\n hint: \"Ask an instance admin to grant access, or use a different account's key.\",\n };\n }\n if (res.status === 404 || res.status === 405) {\n return {\n ok: false,\n reason: `${this.endpoint} answered, but it doesn't look like a Standard Agents instance (no /api/auth/me).`,\n hint: \"Double-check the endpoint URL — this may be a different service.\",\n };\n }\n if (res.status >= 500) {\n return {\n ok: false,\n reason: `The instance hit an error while checking the token (HTTP ${res.status}).`,\n hint: \"That's a server-side problem — check the instance's logs and try again.\",\n };\n }\n return { ok: false, reason: `The instance answered HTTP ${res.status} while checking the token.` };\n }\n\n /** Agent name → display title map (best effort; for labeling subagents). */\n async listAgents(): Promise<{ name: string; title: string }[]> {\n const res = await this.json<{ agents?: any[] } | any[]>(\"/api/agents\");\n const arr = Array.isArray(res) ? res : res.agents || [];\n return arr\n .filter((a) => a && typeof a.name === \"string\")\n .map((a) => ({ name: a.name, title: typeof a.title === \"string\" ? a.title : a.name }));\n }\n\n async createThread(agentId: string, tags: string[]): Promise<string> {\n const res = await this.json<{ threadId?: string; id?: string }>(\"/api/threads\", {\n method: \"POST\",\n body: JSON.stringify({ agent_id: agentId, tags }),\n });\n const id = res.threadId || res.id;\n if (!id) throw new Error(\"Thread create returned no id\");\n return id;\n }\n\n /**\n * List threads for an agent (or several variants of it), optionally\n * filtering to those carrying all given tags. Multiple ids exist because\n * the instance's model gearbox hands a session between agent variants — a\n * thread that last ran in another gear must still show up for resume.\n */\n async listThreads(agentId: string | string[], requireTags: string[]): Promise<ThreadSummary[]> {\n const ids = Array.isArray(agentId) ? agentId : [agentId];\n const pages = await Promise.all(\n ids.map((id) =>\n this.json<{ threads?: any[] } | any[]>(\n `/api/threads?agent_id=${encodeURIComponent(id)}&limit=100`\n ).catch(() => [] as any[])\n )\n );\n const arr = pages.flatMap((res) => (Array.isArray(res) ? res : (res as { threads?: any[] }).threads || []));\n return arr\n .map((t) => ({\n id: t.id,\n tags: Array.isArray(t.tags) ? t.tags : [],\n created_at: t.created_at,\n title: t.title,\n preview: t.preview || t.last_message,\n }))\n .filter((t: ThreadSummary) => requireTags.every((tag) => t.tags.includes(tag)));\n }\n\n /**\n * Subagent child threads of a thread, each with its current lifecycle status\n * (`running`/`idle`/`terminated`). Sourced from the parent's child registry,\n * which the live `/api/events` stream doesn't carry — so the CLI reads this to\n * learn which subagents are *actually running* (vs idle or finished), both on\n * (re)connect and whenever a subagent thread changes.\n */\n async listSubagents(threadId: string): Promise<SubagentInfo[]> {\n const res = await this.json<{ subagents?: any[] } | any[]>(\n `/api/threads/${threadId}/subagents`\n );\n const arr = Array.isArray(res) ? res : res.subagents || [];\n return arr\n .filter((s) => s && (s.id ?? s.reference))\n .map((s) => ({\n id: s.id ?? s.reference,\n agent_name: s.agent_name ?? s.name ?? null,\n title: s.title ?? null,\n threadName: s.threadName ?? s.thread_name ?? null,\n status: typeof s.status === \"string\" ? s.status : \"running\",\n }));\n }\n\n /**\n * Send a user message, optionally with attachments (e.g. pasted images).\n * Attachments use the instance's message-POST shape — base64 `data` +\n * `mimeType` — which the server stores in the thread filesystem and injects\n * into the LLM's vision context as real image content blocks.\n */\n async sendMessage(threadId: string, content: string, attachments?: MessageAttachment[]): Promise<void> {\n const body: Record<string, unknown> = { role: \"user\", content };\n if (attachments && attachments.length > 0) body.attachments = attachments;\n await this.json(`/api/threads/${threadId}/messages`, {\n method: \"POST\",\n body: JSON.stringify(body),\n });\n }\n\n async getMessages(threadId: string, limit = 50, order?: \"asc\" | \"desc\"): Promise<any[]> {\n const orderParam = order ? `&order=${order}` : \"\";\n const res = await this.json<{ messages?: any[] } | any[]>(\n `/api/threads/${threadId}/messages?limit=${limit}${orderParam}`\n );\n return Array.isArray(res) ? res : res.messages || [];\n }\n\n async getLogs(threadId: string, limit = 100): Promise<any[]> {\n const res = await this.json<{ logs?: any[] } | any[]>(\n `/api/threads/${threadId}/logs?limit=${limit}&order=desc`\n );\n return Array.isArray(res) ? res : res.logs || [];\n }\n\n /**\n * Deliver a durable forwarded tool result to the thread, resuming the turn.\n * Retries with backoff — this is the durable delivery path, so it must land\n * even if the connection is briefly flaky after a permission wait.\n */\n async postToolResult(\n threadId: string,\n toolCallId: string,\n ok: boolean,\n result?: string,\n error?: string\n ): Promise<boolean> {\n const body = JSON.stringify({ tool_call_id: toolCallId, ok, result, error });\n for (let attempt = 0; attempt < 6; attempt++) {\n try {\n await this.json(`/api/threads/${threadId}/tool-result`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body,\n });\n return true;\n } catch {\n await new Promise((r) => setTimeout(r, Math.min(500 * 2 ** attempt, 8000)));\n }\n }\n return false;\n }\n\n /**\n * Download raw file bytes from the thread's filesystem (e.g. an\n * /attachments/* asset a subagent generated). Returns null on any failure.\n */\n async fetchFile(threadId: string, fsPath: string): Promise<Buffer | null> {\n const clean = fsPath.startsWith(\"/\") ? fsPath : `/${fsPath}`;\n try {\n const res = await fetch(`${this.endpoint}/api/threads/${threadId}/fs${clean}`, {\n headers: { Authorization: `Bearer ${this.token}` },\n });\n if (!res.ok) return null;\n return Buffer.from(await res.arrayBuffer());\n } catch {\n return null;\n }\n }\n\n /** Read a value from the thread's durable KV store (null if absent). */\n async kvGet(threadId: string, key: string): Promise<unknown> {\n try {\n const res = await this.json<{ value?: unknown }>(\n `/api/threads/${threadId}/kv?key=${encodeURIComponent(key)}`\n );\n return res?.value ?? null;\n } catch {\n return null; // 404 = key not yet set\n }\n }\n\n /** Write a value to the thread's durable KV store. */\n async kvSet(threadId: string, key: string, value: unknown): Promise<void> {\n try {\n await this.json(`/api/threads/${threadId}/kv`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ key, value }),\n });\n } catch {\n // best effort\n }\n }\n\n // ── skills (instance-global Agent Skills library) ─────────────────────────\n\n /** Installed skills — metadata only. Includes disabled skills. */\n async listSkills(): Promise<SkillInfo[]> {\n const res = await this.json<{ skills?: SkillInfo[] }>(`/api/skills?all=1`);\n return Array.isArray(res?.skills) ? res.skills : [];\n }\n\n /** Enable/disable an installed skill. */\n async setSkillEnabled(name: string, enabled: boolean): Promise<void> {\n await this.json(`/api/skills/${encodeURIComponent(name)}`, {\n method: \"PATCH\",\n body: JSON.stringify({ enabled }),\n });\n }\n\n /** Uninstall a skill. */\n async removeSkill(name: string): Promise<void> {\n await this.json(`/api/skills/${encodeURIComponent(name)}`, { method: \"DELETE\" });\n }\n\n /**\n * Kick off background conversation compaction now. Spawns the compaction\n * subagent directly server-side (so it fires even while the thread is idle).\n */\n async compact(threadId: string): Promise<void> {\n await this.json(`/api/threads/${threadId}/compact`, { method: \"POST\" });\n }\n\n async stop(threadId: string): Promise<void> {\n try {\n await this.json(`/api/threads/${threadId}/stop`, { method: \"POST\" });\n } catch {\n // best effort\n }\n }\n\n /** The thread's current goal (set via set_goal / update_goal_step). */\n async getGoal(threadId: string): Promise<GoalData> {\n try {\n const r = await this.json<Partial<GoalData>>(`/api/threads/${threadId}/goal`);\n return {\n summary: r?.summary ?? null,\n description: r?.description ?? null,\n steps: Array.isArray(r?.steps) ? r.steps : [],\n };\n } catch {\n return { summary: null, description: null, steps: [] };\n }\n }\n}\n","/**\n * Permission engine. Combines the current mode with the model-supplied risk\n * (1–5) to decide whether a forwarded tool runs automatically, needs the user's\n * approval, or is blocked outright.\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 /** Risk levels the user chose to always allow this session (\"allow all level N\"). */\n allowRisk: Set<number>;\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 approvals the user granted this session: a specific tool, or every\n // call at a given risk level. The risk profile is aware of both.\n if (state.alwaysAllow.has(tool)) return \"allow\";\n if (state.allowRisk.has(effectiveRisk)) return \"allow\";\n\n // The auto-accept level: anything at or below it runs without asking.\n return effectiveRisk <= state.level ? \"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","/**\n * Session approvals — the permission mode plus the tools and risk levels the\n * user has pre-approved — persisted in the THREAD's KV store (server-side), so\n * they resume with the session and a server hook can show the agent what's\n * already approved. Nothing is stored on the client.\n */\nimport type { ApiClient } from \"./api.ts\";\nimport type { PermissionState } from \"./permissions.ts\";\nimport type { Level } from \"./types.ts\";\n\nconst KEY = \"approvals\";\n\nexport interface ApprovalsKV {\n level?: Level;\n allowTools: string[];\n allowRisk: number[];\n}\n\nexport async function loadApprovals(api: ApiClient, threadId: string): Promise<ApprovalsKV> {\n const v = await api.kvGet(threadId, KEY);\n if (v && typeof v === \"object\" && !Array.isArray(v)) {\n const o = v as Record<string, unknown>;\n const n = Number(o.level);\n const level = n >= 1 && n <= 5 ? (n as Level) : undefined;\n return {\n level,\n allowTools: Array.isArray(o.allowTools) ? (o.allowTools as string[]) : [],\n allowRisk: Array.isArray(o.allowRisk) ? (o.allowRisk as number[]) : [],\n };\n }\n return { allowTools: [], allowRisk: [] };\n}\n\n/** Persist the current approvals to the thread KV (fire-and-forget). */\nexport function saveApprovals(api: ApiClient, threadId: string, perm: PermissionState): void {\n const payload: ApprovalsKV = {\n level: perm.level,\n allowTools: Array.from(perm.alwaysAllow).sort(),\n allowRisk: Array.from(perm.allowRisk).sort((a, b) => a - b),\n };\n void api.kvSet(threadId, KEY, payload);\n}\n","/**\n * App-level keepalive + half-open detection for a WebSocket.\n *\n * Node's WebSocket (and the server) won't promptly report a connection that died\n * silently — an idle NAT/proxy timeout drops the TCP without a close frame, so\n * the socket sits in `OPEN` forever and `send()` never throws. We defend against\n * that by pinging the server on an interval (it answers \"pong\") and treating the\n * connection as dead if no frame arrives within {@link CONNECTION_SILENCE_TIMEOUT_MS}.\n *\n * The owner calls `start()` once the socket opens, `markAlive()` on every frame\n * it receives, and `stop()` when the socket closes. `onDead` fires at most once\n * per heartbeat and should drop + reconnect the socket.\n */\n\n/** How often to ping the server (which replies \"pong\"). */\nexport const HEARTBEAT_INTERVAL_MS = 5000;\n\n/**\n * If the server sends nothing — no pong, no data — for this long, the socket is\n * dead even if `readyState` still says OPEN. Kept comfortably under the server's\n * own liveness timeout so the client detects the drop and reconnects first.\n */\nexport const CONNECTION_SILENCE_TIMEOUT_MS = 15000;\n\nexport interface HeartbeatOptions {\n /** Ping cadence in ms. Defaults to {@link HEARTBEAT_INTERVAL_MS}. */\n intervalMs?: number;\n /** Silence-before-dead window in ms. Defaults to {@link CONNECTION_SILENCE_TIMEOUT_MS}. */\n silenceMs?: number;\n}\n\nexport class Heartbeat {\n private timer: ReturnType<typeof setInterval> | null = null;\n private lastRecvAt = 0;\n private readonly intervalMs: number;\n private readonly silenceMs: number;\n\n constructor(\n private ws: Pick<WebSocket, \"readyState\" | \"send\" | \"close\">,\n private onDead: () => void,\n options: HeartbeatOptions = {}\n ) {\n this.intervalMs = options.intervalMs ?? HEARTBEAT_INTERVAL_MS;\n this.silenceMs = options.silenceMs ?? CONNECTION_SILENCE_TIMEOUT_MS;\n }\n\n start(): void {\n this.stop();\n this.lastRecvAt = Date.now();\n this.timer = setInterval(() => this.tick(), this.intervalMs);\n }\n\n /** Record that a frame was received — proof the connection is alive. */\n markAlive(): void {\n this.lastRecvAt = Date.now();\n }\n\n stop(): void {\n if (this.timer) {\n clearInterval(this.timer);\n this.timer = null;\n }\n }\n\n private tick(): void {\n if (Date.now() - this.lastRecvAt > this.silenceMs) {\n this.fail();\n return;\n }\n try {\n if (this.ws.readyState === WebSocket.OPEN) this.ws.send(\"ping\");\n else this.fail();\n } catch {\n this.fail();\n }\n }\n\n private fail(): void {\n this.stop();\n try {\n this.ws.close();\n } catch {\n // already closing/closed\n }\n this.onDead();\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 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/** 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 * The client-tool bridge: holds a WebSocket open to the instance, receives\n * forwarded tool requests, runs them through the permission engine + safety\n * guard, executes the approved ones on the host, and returns results.\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 { Heartbeat } from \"./heartbeat.ts\";\nimport type { HostResult, ToolRequest } from \"./types.ts\";\nimport { diffLines, newFileLines, highlightBash, oneLineCommand } from \"./render.ts\";\n\nexport type ApprovalChoice = \"allow\" | \"deny\" | \"always\" | \"always_risk\";\n/** Approval outcome plus, for a denial, an optional reason the user typed for the agent. */\nexport type ApprovalResult = { choice: ApprovalChoice; reason?: string };\n\nexport type ConnectionState = \"connected\" | \"reconnecting\" | \"reconnected\";\n\nexport interface BridgeHooks {\n /** Print a permanent line (a finished/denied/blocked tool). `detail` lines are\n * pre-styled extra rows (e.g. a truncated diff) printed verbatim beneath it. */\n onActivity(line: string, detail?: string[]): void;\n /** Update the live working status (the currently-running tool, or null = idle). */\n /** A host tool started (`summary`) or finished (`null`) executing, keyed by its\n * tool-call id. The CLI is the source of truth for what is running on the host —\n * the server's stream events can be missed (reconnects), leaving a stale label. */\n onStatus?(id: string, summary: string | null): void;\n /** Report connection lifecycle so the UI can show disconnect/reconnect state. */\n onConnection?(state: ConnectionState, attempt: number): void;\n /** Ask the user to approve a tool; resolve with their choice. */\n requestApproval(req: ToolRequest, summary: string, effectiveRisk: number): Promise<ApprovalResult>;\n}\n\n/** Tools that mutate or execute (used to deny in plan mode cleanly). */\nconst PATH_ARG_TOOLS = new Set([\"read_file\", \"grep\", \"glob\", \"write_file\", \"edit_file\"]);\n\nexport class Bridge {\n private ws: WebSocket | null = null;\n private closed = false;\n private heartbeat: Heartbeat | null = null;\n private reconnectAttempt = 0;\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n private resolveConnected: (() => void) | null = null;\n // Durable forwarded calls we've started handling, so a server re-send (after a\n // reconnect) doesn't prompt or run them twice.\n private handledDurable = new Set<string>();\n\n constructor(\n private api: ApiClient,\n private threadId: string,\n private host: HostTools,\n private perm: PermissionState,\n private hooks: BridgeHooks\n ) {}\n\n /**\n * Connect and keep the bridge connected. Resolves on the first successful\n * open; thereafter any drop is reconnected automatically with exponential\n * backoff (disconnections are expected — e.g. a dev-server reload — so this\n * must be rock solid). A short safety timeout resolves startup even if the\n * very first attempt is slow, since reconnection continues in the background.\n */\n connect(): Promise<void> {\n return new Promise((resolve) => {\n let settled = false;\n this.resolveConnected = () => {\n if (!settled) {\n settled = true;\n resolve();\n }\n };\n // Don't hang startup forever if the first attempt is slow.\n setTimeout(() => this.resolveConnected?.(), 8000);\n this.openSocket();\n });\n }\n\n private openSocket(): void {\n if (this.closed) return;\n const url = `${this.api.wsEndpoint}/api/threads/${this.threadId}/bridge?token=${encodeURIComponent(this.api.bearer)}`;\n let ws: WebSocket;\n try {\n ws = new WebSocket(url);\n } catch {\n this.scheduleReconnect();\n return;\n }\n this.ws = ws;\n\n ws.addEventListener(\"open\", () => {\n const wasReconnecting = this.reconnectAttempt > 0;\n this.reconnectAttempt = 0;\n this.startHeartbeat(ws);\n this.hooks.onConnection?.(wasReconnecting ? \"reconnected\" : \"connected\", 0);\n this.resolveConnected?.();\n });\n\n ws.addEventListener(\"message\", (ev) => {\n // Any frame (pong, bridge_ready, tool_request) proves the link is alive.\n if (this.ws === ws) this.heartbeat?.markAlive();\n this.onMessage(String((ev as MessageEvent).data));\n });\n\n // A socket that fails to open fires 'error' but may never fire 'close', so\n // both must drive reconnection. handleDrop dedupes via the current-socket check.\n ws.addEventListener(\"error\", () => this.handleDrop(ws));\n ws.addEventListener(\"close\", () => this.handleDrop(ws));\n }\n\n private handleDrop(ws: WebSocket): void {\n if (this.ws !== ws) return; // stale event from a superseded socket\n this.ws = null;\n this.stopHeartbeat();\n this.scheduleReconnect();\n }\n\n private scheduleReconnect(): void {\n if (this.closed || this.reconnectTimer) return;\n this.reconnectAttempt++;\n this.hooks.onConnection?.(\"reconnecting\", this.reconnectAttempt);\n // Exponential backoff with jitter, capped — keep trying indefinitely.\n const base = Math.min(500 * 2 ** (this.reconnectAttempt - 1), 15000);\n const delay = base + Math.floor(Math.random() * 400);\n this.reconnectTimer = setTimeout(() => {\n this.reconnectTimer = null;\n this.openSocket();\n }, delay);\n }\n\n private startHeartbeat(ws: WebSocket): void {\n this.stopHeartbeat();\n // Heartbeat so the server can tell a live client (mid-build or awaiting an\n // approval) from a dead one and never freeze a thread on us — and so WE\n // notice when the server goes silent (a half-open TCP that never fires\n // 'close'/'error') and reconnect instead of looking connected forever.\n this.heartbeat = new Heartbeat(ws, () => this.handleDrop(ws));\n this.heartbeat.start();\n }\n\n private stopHeartbeat(): void {\n if (this.heartbeat) {\n this.heartbeat.stop();\n this.heartbeat = null;\n }\n }\n\n close(): void {\n this.closed = true;\n this.stopHeartbeat();\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n this.ws?.close();\n }\n\n private send(payload: object): void {\n try {\n this.ws?.send(JSON.stringify(payload));\n } catch {\n // socket gone; the server will time the call out\n }\n }\n\n private async onMessage(raw: string): Promise<void> {\n let msg: any;\n try {\n msg = JSON.parse(raw);\n } catch {\n return;\n }\n if (msg.type !== \"tool_request\") return;\n const req = msg as ToolRequest;\n await this.handleToolRequest(req);\n }\n\n /**\n * Reply to a tool request. Durable calls (the agent parked them) deliver the\n * result over HTTP so it lands even if this socket later drops; legacy calls\n * reply over the WebSocket.\n */\n private respond(req: ToolRequest, ok: boolean, result?: string, error?: string): void {\n if (req.durable && req.toolCallId) {\n void this.api.postToolResult(this.threadId, req.toolCallId, ok, result, error);\n } else {\n this.send({ type: \"tool_response\", id: req.id, ok, result, error });\n }\n }\n\n private async handleToolRequest(req: ToolRequest): Promise<void> {\n // Durable calls may be re-sent by the server after a reconnect — only handle\n // each once (prompt + run), so the user isn't asked twice.\n if (req.durable && req.toolCallId) {\n if (this.handledDurable.has(req.toolCallId)) return;\n this.handledDurable.add(req.toolCallId);\n }\n\n const summary = describe(req);\n\n // Compute an effective risk, escalating anything that touches paths outside\n // the project directory (the agent is told to stay inside it).\n let effectiveRisk = typeof req.risk === \"number\" ? req.risk : req.requestPermission ? 3 : 1;\n if (PATH_ARG_TOOLS.has(req.tool) && this.host.isOutsideProject(req.args.path as string | undefined)) {\n effectiveRisk = Math.max(effectiveRisk, 4);\n }\n\n // Hard safety: never run catastrophic shell commands, even in bypass mode.\n if (req.tool === \"bash\" && isCatastrophic(String(req.args.command || \"\"))) {\n this.hooks.onActivity(`⛔ blocked dangerous command: ${summary}`);\n this.respond(req, false, undefined, \"Blocked: this command is considered catastrophic and was refused by the client safety guard.\");\n return;\n }\n\n // Permission key: normally the tool name, but MCP calls are gated at the\n // finer `mcp:<server>/<tool>` granularity so \"always allow this tool\" approves\n // one server's tool rather than every MCP call.\n const permKey = permissionKey(req);\n const decision = decide(this.perm, permKey, effectiveRisk, !!req.requestPermission);\n\n if (decision === \"deny\") {\n this.hooks.onActivity(`⛔ ${summary} — blocked (risk ${effectiveRisk})`);\n this.respond(req, false, undefined, `Denied by policy (risk ${effectiveRisk}).`);\n return;\n }\n\n if (decision === \"ask\") {\n const { choice, reason } = await this.hooks.requestApproval(req, summary, effectiveRisk);\n if (choice === \"deny\") {\n const why = reason?.trim();\n this.hooks.onActivity(`⛔ ${summary} — you declined${why ? `: ${why}` : \"\"}`);\n this.respond(\n req,\n false,\n undefined,\n why\n ? `The user declined to run this operation. Their reason: ${why}`\n : \"The user declined to run this operation.\"\n );\n return;\n }\n if (choice === \"always\") this.perm.alwaysAllow.add(permKey);\n if (choice === \"always_risk\") this.perm.allowRisk.add(effectiveRisk);\n if (choice === \"always\" || choice === \"always_risk\") {\n saveApprovals(this.api, this.threadId, this.perm);\n }\n }\n\n // Show the running tool in the live status, then leave a permanent line. The\n // status is keyed by the tool-call id and cleared in a `finally`, so the\n // \"Working …\" label can never get stuck on a tool that already finished even\n // if execution throws or the server's done event is dropped.\n const callKey = req.toolCallId ?? req.id ?? `${req.tool}:${summary}`;\n this.hooks.onStatus?.(callKey, summary);\n let result: HostResult;\n try {\n result = await this.host.execute(req.tool, req.args);\n } finally {\n this.hooks.onStatus?.(callKey, null);\n }\n if (result.ok) {\n const { display, detail } = activityPresentation(req, summary);\n this.hooks.onActivity(`✓ ${display}${detailSuffix(req.tool, result.result)}`, detail);\n this.respond(req, true, result.result ?? \"\");\n } else {\n this.hooks.onActivity(`✗ ${summary} — ${result.error}`);\n this.respond(req, false, undefined, result.error);\n }\n }\n}\n\n/**\n * Stable permission key for a request. For MCP, gate on the specific server +\n * tool/resource so approvals are fine-grained; for everything else, the tool name.\n */\nexport function permissionKey(req: ToolRequest): string {\n if (req.tool !== \"mcp\") return req.tool;\n const a = req.args;\n const server = String(a.server || \"?\");\n const action = String(a.action || \"call\");\n if (action === \"read_resource\") return `mcp:${server}/resource`;\n if (action === \"list_tools\") return `mcp:${server}/list`;\n return `mcp:${server}/${String(a.tool || \"?\")}`;\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\") {\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 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 default:\n return `${req.tool} ${JSON.stringify(a).slice(0, 80)}`;\n }\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 * Registry of long-running background processes the agent spawns.\n *\n * The metadata lives in the THREAD's durable key-value store (server-side), not\n * on this client — so the process list resumes from any machine, at any time,\n * and nothing about it is kept on the client. (The process *output* logs are the\n * one host-local thing: a detached process writes its stdout to a file on the\n * machine it runs on; that file can only live there.)\n *\n * Liveness is re-derived from the OS for this machine's processes — a recorded\n * \"running\" entry is verified with a signal-0 probe — so the registry self-heals\n * if a process died while we weren't watching. Processes on other machines show\n * their last-known status (we can't probe a PID we don't own).\n */\nimport path from \"node:path\";\nimport os from \"node:os\";\nimport type { ApiClient } from \"./api.ts\";\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/** The thread KV key under which the process list is stored. */\nconst KEY = \"bg_processes\";\n\nexport type ProcessStatus = \"running\" | \"exited\" | \"stopped\";\n\nexport interface ProcessEntry {\n id: string;\n pid: number;\n command: string;\n description?: string;\n cwd: string;\n machine: string;\n logPath: string;\n startedAt: number;\n status: ProcessStatus;\n exitCode?: number | null;\n endedAt?: number;\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 {\n constructor(\n private api: ApiClient,\n private threadId: string,\n private machine: string\n ) {}\n\n private async read(): Promise<ProcessEntry[]> {\n const value = await this.api.kvGet(this.threadId, KEY);\n return Array.isArray(value) ? (value as ProcessEntry[]) : [];\n }\n\n private async write(entries: ProcessEntry[]): Promise<void> {\n await this.api.kvSet(this.threadId, KEY, entries);\n }\n\n /** Mark this machine's dead \"running\" entries as exited. Returns true if any changed. */\n private reconcileLiveness(entries: ProcessEntry[]): boolean {\n let changed = false;\n for (const e of entries) {\n if (e.machine === this.machine && e.status === \"running\" && !isAlive(e.pid)) {\n e.status = \"exited\";\n e.endedAt = Date.now();\n changed = true;\n }\n }\n return changed;\n }\n\n /** All tracked processes, newest first, with liveness re-checked + persisted. */\n async list(): Promise<ProcessEntry[]> {\n const entries = await this.read();\n if (this.reconcileLiveness(entries)) await this.write(entries);\n return entries.sort((a, b) => b.startedAt - a.startedAt);\n }\n\n async runningCount(): Promise<number> {\n const entries = await this.list();\n return entries.filter((e) => e.status === \"running\").length;\n }\n\n async get(id: string): Promise<ProcessEntry | null> {\n return (await this.read()).find((e) => e.id === id) ?? null;\n }\n\n async add(entry: ProcessEntry): Promise<void> {\n const entries = await this.read();\n entries.push(entry);\n await this.write(entries);\n }\n\n async markExited(id: string, exitCode: number | null): Promise<void> {\n const entries = await this.read();\n const e = entries.find((x) => x.id === id);\n if (e && e.status === \"running\") {\n e.status = \"exited\";\n e.exitCode = exitCode;\n e.endedAt = Date.now();\n await this.write(entries);\n }\n }\n\n async markStopped(id: string): Promise<void> {\n const entries = await this.read();\n const e = entries.find((x) => x.id === id);\n if (e) {\n e.status = \"stopped\";\n e.endedAt = Date.now();\n await this.write(entries);\n }\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","/**\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 { ProcessRegistry, LOG_DIR, type ProcessEntry } from \"./process-registry.ts\";\nimport type { McpManager } from \"./mcp.ts\";\nimport type { ApiClient } from \"./api.ts\";\nimport { saveMcpServer, removeMcpServer, serverFromCommand } from \"./mcp-config.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 resolve(p: string | undefined): string {\n if (!p || p === \".\") return this.projectDir;\n return path.resolve(this.projectDir, p);\n }\n\n /** True when the resolved path escapes the project directory. */\n isOutsideProject(p: string | undefined): boolean {\n const abs = this.resolve(p);\n const rel = path.relative(this.projectDir, abs);\n return rel.startsWith(\"..\") || 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 const rg = await this.run(\"rg\", 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 rg = await this.run(\"rg\", [\"--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 return { ok: true, result: `Edited ${path.relative(this.projectDir, file)} (${count} replacement${count === 1 ? \"\" : \"s\"})` };\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: { ...process.env, 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 await fsp.mkdir(LOG_DIR, { recursive: true });\n out = fs.openSync(logPath, \"a\");\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], { cwd, detached: true, stdio: [\"ignore\", out, out] });\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, { cwd, detached: true });\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 * Subscribes to a thread's message WebSocket to render streamed assistant text\n * and detect end-of-turn (an assistant message with non-empty text content,\n * which under stopOnResponse means the agent has finished its turn).\n */\nimport type { ApiClient } from \"./api.ts\";\nimport { Heartbeat } from \"./heartbeat.ts\";\n\nexport interface StreamHooks {\n /** A streamed fragment of the assistant's visible answer. `messageId` lets the\n * consumer reset its live buffer when a new message starts. */\n onChunk(text: string, messageId?: string): void;\n /**\n * A streamed fragment of the model's internal reasoning. This is the opt-in\n * `reasoning_chunk` channel (we subscribe with `?reasoning=1`); the backend\n * only sends it to sockets that ask. See the spec `ThreadReasoningChunkEvent`.\n */\n onReasoningChunk?(text: string, messageId?: string): void;\n /**\n * A complete assistant message. `hasToolCalls` is true for narration that\n * precedes tool calls (the turn continues) and false for the final answer\n * (the turn is over).\n */\n onAssistantText(content: string, hasToolCalls: boolean): void;\n /**\n * A custom thread event (the `{ type: \"event\", eventType, data }` channel) —\n * e.g. `tool_call_started`, `tool_call_done`, `generation`.\n */\n onEvent?(eventType: string, data: any): void;\n onError(err: string): void;\n}\n\nexport class MessageStream {\n private ws: WebSocket | null = null;\n private closed = false;\n private heartbeat: Heartbeat | null = null;\n private reconnectAttempt = 0;\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n private resolveConnected: (() => void) | null = null;\n\n constructor(\n private api: ApiClient,\n private threadId: string,\n private hooks: StreamHooks\n ) {}\n\n /**\n * Connect and stay connected. Resolves on first open; reconnects on any drop\n * with exponential backoff. Silent — the bridge surfaces the user-facing\n * connection status; completion is detected via HTTP polling regardless, so a\n * dropped stream only affects live display, not correctness.\n */\n connect(): Promise<void> {\n return new Promise((resolve) => {\n let settled = false;\n this.resolveConnected = () => {\n if (!settled) {\n settled = true;\n resolve();\n }\n };\n setTimeout(() => this.resolveConnected?.(), 8000);\n this.openSocket();\n });\n }\n\n private openSocket(): void {\n if (this.closed) return;\n // `reasoning=1` opts into the internal-reasoning channel (off by default).\n const url = `${this.api.wsEndpoint}/api/threads/${this.threadId}/stream?token=${encodeURIComponent(this.api.bearer)}&reasoning=1`;\n let ws: WebSocket;\n try {\n ws = new WebSocket(url);\n } catch {\n this.scheduleReconnect();\n return;\n }\n this.ws = ws;\n ws.addEventListener(\"open\", () => {\n this.reconnectAttempt = 0;\n this.startHeartbeat(ws);\n this.resolveConnected?.();\n });\n ws.addEventListener(\"message\", (ev) => {\n // Any frame proves the link is alive; a silent stream would otherwise\n // freeze the live indicators without ever reconnecting.\n if (this.ws === ws) this.heartbeat?.markAlive();\n this.onMessage(String((ev as MessageEvent).data));\n });\n // Both 'error' (failed open) and 'close' must drive reconnection.\n ws.addEventListener(\"error\", () => this.handleDrop(ws));\n ws.addEventListener(\"close\", () => this.handleDrop(ws));\n }\n\n private handleDrop(ws: WebSocket): void {\n if (this.ws !== ws) return;\n this.ws = null;\n this.stopHeartbeat();\n this.scheduleReconnect();\n }\n\n private startHeartbeat(ws: WebSocket): void {\n this.stopHeartbeat();\n this.heartbeat = new Heartbeat(ws, () => this.handleDrop(ws));\n this.heartbeat.start();\n }\n\n private stopHeartbeat(): void {\n if (this.heartbeat) {\n this.heartbeat.stop();\n this.heartbeat = null;\n }\n }\n\n private scheduleReconnect(): void {\n if (this.closed || this.reconnectTimer) return;\n this.reconnectAttempt++;\n const base = Math.min(500 * 2 ** (this.reconnectAttempt - 1), 15000);\n const delay = base + Math.floor(Math.random() * 400);\n this.reconnectTimer = setTimeout(() => {\n this.reconnectTimer = null;\n this.openSocket();\n }, delay);\n }\n\n close(): void {\n this.closed = true;\n this.stopHeartbeat();\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n this.ws?.close();\n }\n\n private onMessage(raw: string): void {\n let msg: any;\n try {\n msg = JSON.parse(raw);\n } catch {\n return;\n }\n if (msg.type === \"event\" && typeof msg.eventType === \"string\") {\n this.hooks.onEvent?.(msg.eventType, msg.data);\n return;\n }\n if (msg.type === \"message_chunk\" && (msg.depth ?? 0) === 0) {\n if (typeof msg.chunk === \"string\") this.hooks.onChunk(msg.chunk, msg.message_id);\n return;\n }\n if (msg.type === \"reasoning_chunk\" && (msg.depth ?? 0) === 0) {\n if (typeof msg.chunk === \"string\") this.hooks.onReasoningChunk?.(msg.chunk, msg.message_id);\n return;\n }\n if (msg.type === \"message_data\" && (msg.depth ?? 0) === 0) {\n const data = msg.data || {};\n if (data.role === \"assistant\" && typeof data.content === \"string\" && data.content.trim()) {\n // tool_calls is serialized as a JSON string, not an array.\n const tc = data.tool_calls;\n const hasToolCalls = Array.isArray(tc)\n ? tc.length > 0\n : typeof tc === \"string\" && tc.trim() !== \"\" && tc.trim() !== \"null\" && tc.trim() !== \"[]\";\n this.hooks.onAssistantText(data.content, hasToolCalls);\n }\n if (data.role === \"assistant\" && data.status === \"failed\" && data.error) {\n this.hooks.onError(String(data.error));\n }\n }\n }\n}\n","/**\n * Subscribes to the instance-wide system events channel (`GET /api/events`) to\n * learn when threads are created, updated, or terminated. We use it to track\n * *subagents*: a subagent runs in its own child thread, so the only live signal\n * of \"a subagent is working\" is its child thread appearing here with our thread\n * as its `parent` (and disappearing/terminating when it finishes).\n */\nimport type { ApiClient } from \"./api.ts\";\nimport { Heartbeat } from \"./heartbeat.ts\";\n\n/** The subset of a thread registry entry we care about. */\nexport interface ThreadEntry {\n id: string;\n agent_name?: string | null;\n tags?: string[] | null;\n parent?: string | null;\n terminated?: number | null;\n created_at?: number;\n}\n\nexport interface SystemEventHooks {\n onThreadCreated(thread: ThreadEntry): void;\n onThreadUpdated(thread: ThreadEntry): void;\n onThreadDeleted(threadId: string): void;\n /** Fired whenever the socket (re)connects, so the consumer can re-snapshot\n * state that live deltas alone can't reconstruct after a gap. */\n onOpen?(): void;\n}\n\nexport class SystemEvents {\n private ws: WebSocket | null = null;\n private closed = false;\n private heartbeat: Heartbeat | null = null;\n private reconnectAttempt = 0;\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n\n constructor(\n private api: ApiClient,\n private hooks: SystemEventHooks\n ) {}\n\n connect(): void {\n this.openSocket();\n }\n\n private openSocket(): void {\n if (this.closed) return;\n const url = `${this.api.wsEndpoint}/api/events?token=${encodeURIComponent(this.api.bearer)}`;\n let ws: WebSocket;\n try {\n ws = new WebSocket(url);\n } catch {\n this.scheduleReconnect();\n return;\n }\n this.ws = ws;\n ws.addEventListener(\"open\", () => {\n this.reconnectAttempt = 0;\n this.startHeartbeat(ws);\n this.hooks.onOpen?.();\n });\n ws.addEventListener(\"message\", (ev) => {\n if (this.ws === ws) this.heartbeat?.markAlive();\n this.onMessage(String((ev as MessageEvent).data));\n });\n ws.addEventListener(\"error\", () => this.handleDrop(ws));\n ws.addEventListener(\"close\", () => this.handleDrop(ws));\n }\n\n private startHeartbeat(ws: WebSocket): void {\n this.stopHeartbeat();\n this.heartbeat = new Heartbeat(ws, () => this.handleDrop(ws));\n this.heartbeat.start();\n }\n\n private stopHeartbeat(): void {\n if (this.heartbeat) {\n this.heartbeat.stop();\n this.heartbeat = null;\n }\n }\n\n private onMessage(raw: string): void {\n let msg: any;\n try {\n msg = JSON.parse(raw);\n } catch {\n return;\n }\n if (msg?.type === \"thread_created\" && msg.thread) this.hooks.onThreadCreated(msg.thread);\n else if (msg?.type === \"thread_updated\" && msg.thread) this.hooks.onThreadUpdated(msg.thread);\n else if (msg?.type === \"thread_deleted\" && typeof msg.threadId === \"string\") {\n this.hooks.onThreadDeleted(msg.threadId);\n }\n }\n\n private handleDrop(ws: WebSocket): void {\n if (this.ws !== ws) return;\n this.ws = null;\n this.stopHeartbeat();\n this.scheduleReconnect();\n }\n\n private scheduleReconnect(): void {\n if (this.closed || this.reconnectTimer) return;\n this.reconnectAttempt++;\n const base = Math.min(500 * 2 ** (this.reconnectAttempt - 1), 15000);\n const delay = base + Math.floor(Math.random() * 400);\n this.reconnectTimer = setTimeout(() => {\n this.reconnectTimer = null;\n this.openSocket();\n }, delay);\n }\n\n close(): void {\n this.closed = true;\n this.stopHeartbeat();\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n this.ws?.close();\n }\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","/** Bridge protocol + shared CLI types. */\n\n/** A forwarded tool request the instance sends down the bridge. */\nexport interface ToolRequest {\n type: \"tool_request\";\n /** In-memory await id (non-durable calls reply over the WebSocket with this). */\n id?: string;\n /**\n * Durable calls: the agent parked this call and is awaiting the result over\n * HTTP. Reply by POSTing to /tool-result with `toolCallId` instead of the WS.\n */\n durable?: boolean;\n toolCallId?: string;\n tool: string;\n args: Record<string, unknown>;\n requestPermission: string | null;\n risk: number | null;\n}\n\n/** The CLI's reply to a tool request. */\nexport interface ToolResponse {\n type: \"tool_response\";\n id: string;\n ok: boolean;\n result?: string;\n error?: string;\n}\n\n/** Result of executing a tool on the host. */\nexport interface HostResult {\n ok: boolean;\n result?: string;\n error?: string;\n}\n\n/**\n * Permission is a single auto-accept LEVEL 1–5: every tool call at risk ≤ level\n * runs automatically; anything riskier asks. (The catastrophic-command guard\n * still blocks dangerous commands at every level.) shift-tab cycles the level.\n */\nexport type Level = 1 | 2 | 3 | 4 | 5;\n\nexport const LEVELS: Level[] = [1, 2, 3, 4, 5];\n\n/** What each level lets run without asking (risk meanings: 1 read · 2 safe writes/builds · 3 installs/project edits · 4 outside-project/git-history · 5 destructive). */\nconst LEVEL_DETAIL: Record<Level, string> = {\n 1: \"only safe reads run automatically\",\n 2: \"+ safe writes & builds\",\n 3: \"+ installs & project edits\",\n 4: \"+ outside-project & git-history\",\n 5: \"everything — never ask\",\n};\n\nexport function levelLabel(level: Level): string {\n return `auto-accept level ${level} (${LEVEL_DETAIL[level]})`;\n}\n\n/** Stored credential for one instance. */\nexport interface InstanceCredential {\n endpoint: string;\n access_token: string;\n token_type: string;\n user?: { id: string; username: string; role: string };\n saved_at: number;\n}\n\nexport interface CredentialsFile {\n default_endpoint?: string;\n instances: Record<string, InstanceCredential>;\n}\n\nexport interface ThreadSummary {\n id: string;\n tags: string[];\n created_at?: number;\n title?: string;\n preview?: string;\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\";\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, { encoding: \"buffer\", maxBuffer }, (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 line.\n *\n * The input line stays anchored at the bottom and is always editable — you can\n * type while the agent works. All transcript output is printed ABOVE it via\n * print(). A spinner prefix on the input line indicates the agent's turn is\n * active (\"whose turn it is\"), so the working indicator never disappears, even\n * during long tool calls. Approvals and menus temporarily take over the bottom.\n */\nimport readline from \"node:readline\";\nimport { gradientText, brandCycleColor } from \"./render.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\";\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\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: \"\\x1b[90m\",\n teal: \"\\x1b[38;5;37m\",\n};\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// Animation tick for the spinners (frame advance + redraw interval). Snappier\n// than the old 100ms without burning noticeable CPU on redraws.\nconst SPINNER_MS = 70;\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 queuedCount = 0;\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 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: the width the region was last drawn at, and the visible\n // width of every HUD row written above the input. When the terminal is\n // resized, previously drawn rows re-wrap (a full-width ruler becomes 2+ rows\n // when narrowed), so the move-up count recorded at draw time is wrong — these\n // let moveToRegionTop recompute the region height under the NEW wrap instead\n // of leaving stale rulers behind.\n private lastDrawnCols = 0;\n private drawnHudWidths: number[] = [];\n\n // takeover (approval / menu) state\n private takeoverHandler: KeyHandler | null = null;\n private bufferedPrints: string[] = [];\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 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 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 private onQuit: () => void = () => process.exit(0);\n private levelListeners: ((l: Level) => void)[] = [];\n\n constructor(public level: Level = 1) {\n readline.emitKeypressEvents(process.stdin);\n if (process.stdin.isTTY) process.stdin.setRawMode(true);\n process.stdin.on(\"keypress\", (str, key) => this.dispatch(str, key));\n process.stdin.resume();\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 // Redraw on terminal resize. moveToRegionTop detects the width change and\n // erases the re-wrapped old region, so nothing stale (e.g. a wrapped\n // full-width ruler) is left behind — even while idle.\n process.stdout.on(\"resize\", () => this.renderBottom());\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 if (this.quitTimer) clearTimeout(this.quitTimer);\n this.quitTimer = null;\n if (this.streamIdleTimer) clearTimeout(this.streamIdleTimer);\n this.streamIdleTimer = null;\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 instead of submitting. The robust signal is a\n // bare LF (\"\\n\"): Ghostty/iTerm2/WezTerm and many others send \"\\n\" for\n // Shift+Enter (often by default, otherwise configurable) while plain Enter\n // sends CR (\"\\r\"). We also accept the Kitty (\"\\x1b[13;2u\") and\n // modifyOtherKeys (\"\\x1b[27;2;13~\") forms for terminals that emit those.\n // Checked before any other key logic (including paste detection) — and a raw\n // \"\\n\" never reaches the Enter/submit handler below.\n if (seq === \"\\n\" || seq === \"\\x1b[13;2u\" || seq === \"\\x1b[27;2;13~\") {\n 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 // Shift+Enter inserts a newline instead of running the command\n if (key.shift) {\n this.insertAtCursor(\"\\n\");\n return;\n }\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 // Shift+Enter inserts a newline instead of submitting.\n // Detection: some terminals set key.shift, others send a distinct escape sequence.\n // Protocol-based Shift+Enter is already handled at the top of dispatch();\n // this catches terminals that natively set the shift modifier on Return.\n if (key.shift) {\n this.insertAtCursor(\"\\n\");\n return;\n }\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 this.inputBuffer = \"\";\n this.cursorPos = 0;\n this.pendingImages = [];\n this.historyIdx = null;\n this.historyDraft = \"\";\n this.historyDraftImages = [];\n this.renderBottom();\n if (text.trim()) {\n this.addHistoryEntry(text.trim());\n this.onSubmit(text.trim(), images);\n }\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 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 renderBottom: logical\n * lines split on \"\\n\", line 0 led by the prompt prefix, each wrapping at the\n * terminal width) plus where the caret sits among them. Each row records the\n * buffer index of its first character, its character count, and the visual\n * column its first character renders at (only row 0 is offset, by the\n * prompt). Drives ↑/↓: row 0 is \"the top line\" (history recall territory),\n * 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 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 lead = i === 0 ? pw : 0;\n const len = lines[i].length;\n const nRows = Math.max(1, Math.ceil((lead + len) / cols));\n for (let j = 0; j < nRows; j++) {\n const charStart = Math.max(0, j * cols - lead);\n const charEnd = Math.min(len, (j + 1) * cols - lead);\n rows.push({ start: offset + charStart, len: Math.max(0, charEnd - charStart), colOffset: j === 0 ? lead : 0 });\n }\n offset += len + 1; // +1 consumes the \"\\n\"\n }\n // Locate the caret (mirrors renderBottom).\n let pos = this.cursorPos;\n let caretLine = 0;\n while (caretLine < lines.length - 1 && pos > lines[caretLine].length) {\n pos -= lines[caretLine].length + 1;\n caretLine++;\n }\n const caretCell = (caretLine === 0 ? pw : 0) + pos;\n let caretRow = Math.floor(caretCell / cols);\n for (let i = 0; i < caretLine; i++) {\n const lead = i === 0 ? pw : 0;\n caretRow += Math.max(1, Math.ceil((lead + lines[i].length) / cols));\n }\n const caretCol = caretCell % cols;\n // Caret exactly on a wrap boundary renders one row past the text's last\n // row — synthesize that empty row so vertical movement stays in bounds.\n while (caretRow >= rows.length) rows.push({ start: this.inputBuffer.length, len: 0, colOffset: 0 });\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_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 * Understated context gauge, right-aligned on the summary line: just \"N%\",\n * dim, and INVISIBLE until the conversation is more than 85% of the way to\n * the compaction point (the percentage is scaled so 100% = where background\n * compaction triggers, not the raw model window). Most sessions never see it.\n */\n private contextGaugeText(): string {\n if (this.contextPct == null || this.contextPct <= 85) return \"\";\n return `${C.dim}${C.gray}${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 (latest request input tokens ÷\n * model context window).\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 && 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 // Just the queue/bg badges and the level carrot — metrics live on the summary\n // line above so they never crowd the input.\n const q = this.queuedCount > 0 ? `${C.yellow}[⏳ ${this.queuedCount} queued]${C.reset} ` : \"\";\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 `${q}${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 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, cols - 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, cols - pointerW - visible.length - hintW);\n line += `${\" \".repeat(gap)}${C.gray}${hint}${C.reset}`;\n }\n return line;\n });\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 it under the new wrap instead: each drawn\n * HUD row of visible width w now occupies ceil(w / cols) physical rows\n * (reflowing terminals re-wrap hard lines; the cursor follows its logical\n * position in the input text, which inputLayout locates at the new width).\n */\n private moveToRegionTop(): void {\n process.stdout.write(\"\\r\");\n if (!this.bottomDrawn) return;\n const cols = process.stdout.columns || 80;\n let up: number;\n if (cols !== this.lastDrawnCols && this.lastDrawnCols > 0) {\n let above = 0;\n for (const w of this.drawnHudWidths) above += Math.max(1, Math.ceil(Math.max(w, 1) / cols));\n up = above + this.inputLayout().caretRow;\n } else {\n up = this.lastCursorRow;\n }\n if (up > 0) process.stdout.write(`\\x1b[${up}A`);\n }\n\n /**\n * Render the bottom region: an optional step line, then the prompt + input\n * (wrapping across as many rows as needed), with the caret placed at cursorPos.\n * Uses only relative cursor moves so it survives terminal scrolling when the\n * region grows near the bottom of the screen.\n */\n private renderBottom(): void {\n if (!this.started || this.takeoverHandler) return; // not yet active, or a takeover owns the bottom\n const cols = process.stdout.columns || 80;\n\n this.moveToRegionTop(); // position cursor at the old region's top\n\n // Visible width of every HUD row written above the input this draw — the\n // resize path in moveToRegionTop uses these to recompute the region height\n // after the terminal re-wraps them at a new width.\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 // (subagents / status / goal / prompt) below, so the boundary between the\n // two zones never moves or disappears. It's part of the redrawn region (not\n // printed into the scrollback), so a resize just redraws it at the new\n // width. (Exactly `cols` glyphs → one physical row; the region math counts 1.)\n const rulerRows = 1;\n writeHudRow(`${C.dim}${\"─\".repeat(cols)}${C.reset}`);\n\n // Transient disconnect notice (one row). It lives in the work area, so it\n // shows while we're reconnecting and CLEARS itself the moment we reconnect —\n // no lingering \"lost connection\" line in the transcript.\n const noticeLine = this.connected\n ? null\n : `${C.yellow}⚠ lost connection to the workspace — reconnecting…${C.reset}`;\n const noticeRows = noticeLine ? 1 : 0;\n if (noticeLine) writeHudRow(noticeLine);\n\n // Transient \"press again to exit\" hint (one row), cleared when the window\n // lapses or a second ctrl-c quits.\n const quitLine = this.quitArmed ? `${C.dim}Press Control-C again to exit${C.reset}` : null;\n const quitRows = quitLine ? 1 : 0;\n if (quitLine) writeHudRow(quitLine);\n\n // Subagent lines (one per active subagent), above the summary line. Each\n // subagent gets its own hue (loader + label) so concurrent ones are\n // distinguishable and all read as background work, apart from the cyan\n // main-agent loader.\n const frame = FRAMES[Math.floor(Date.now() / SPINNER_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. The\n // region-height math counts each subagent as exactly one row, so a wrapped\n // line would desync the move-up redraw and let the status/preview clobber\n // it. Reserve room for the frame, two spaces, and the \"working\" suffix.\n const budget = cols - 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(line);\n }\n\n // Summary line (status bar): working state + tokens. It sits ABOVE the goal\n // so the goal header and its indented todos read as one block targeted by\n // the status.\n const statusLine = this.statusLineText(cols);\n const statusRows = statusLine ? 1 : 0;\n if (statusLine) writeHudRow(statusLine);\n\n // Live goal checklist, just below the status bar: the goal header then its\n // todo items indented beneath it.\n const goalLines = this.goalLines(cols);\n for (const line of goalLines) writeHudRow(line);\n\n const aboveRows =\n previewLines.length + rulerRows + noticeRows + quitRows +\n this.subagents.length + statusRows + goalLines.length;\n\n // Prompt + input. The buffer may contain hard newlines (Shift+Enter), so we\n // render each logical line at column 0 (continuations after CR+LF) and count\n // physical rows PER LINE. Counting the whole buffer as one wrapping line\n // mis-measures the region height, so the next redraw can't clear it and the\n // status line ends up stamped over and over.\n const prefix = this.promptPrefix();\n const pw = this.visibleWidth(prefix);\n const lines = this.inputBuffer.split(\"\\n\");\n const tail: string[] = [prefix + lines[0]];\n for (let i = 1; i < lines.length; i++) tail.push(\"\\r\\n\" + lines[i]);\n\n // Physical rows each logical line occupies (line 0 carries the prompt width;\n // an empty line still takes one row).\n const rowsOf = (len: number, lead: number) => Math.max(1, Math.ceil((lead + len) / cols));\n const lineRows = lines.map((l, i) => rowsOf(l.length, i === 0 ? pw : 0));\n const inputRows = lineRows.reduce((a, b) => a + b, 0);\n\n // Locate the caret: its logical line, then its physical row/column.\n let pos = this.cursorPos;\n let caretLine = 0;\n while (caretLine < lines.length - 1 && pos > lines[caretLine].length) {\n pos -= lines[caretLine].length + 1; // +1 consumes the \"\\n\"\n caretLine++;\n }\n const caretCell = (caretLine === 0 ? pw : 0) + pos;\n let caretRow = Math.floor(caretCell / cols);\n for (let i = 0; i < caretLine; i++) caretRow += lineRows[i];\n const caretCol = caretCell % cols;\n\n // Inline slash-command palette, rendered BELOW the input (so the input never\n // shifts as it filters). While open we reserve a FIXED number of rows — one\n // per available command, padded with blanks — so the region height stays\n // constant for the whole filtering session: it scrolls into place once when\n // the palette opens, then the input is pinned.\n const paletteBlock = this.paletteBlockLines(cols);\n for (const line of paletteBlock) tail.push(\"\\r\\n\" + line);\n\n if (paletteBlock.length > 0) {\n // The cursor is now on the last palette row — step back UP onto the input.\n tail.push(\"\\r\"); // col 0 (cancels pending-wrap)\n const up = inputRows - 1 + paletteBlock.length - caretRow;\n if (up > 0) tail.push(`\\x1b[${up}A`);\n if (caretCol > 0) tail.push(`\\x1b[${caretCol}C`);\n this.lastCursorRow = aboveRows + caretRow;\n } else if (this.cursorPos < this.inputBuffer.length) {\n // Caret is inside the text — reposition from the last physical row.\n tail.push(\"\\r\"); // col 0 of the last physical row (cancels pending-wrap)\n const up = inputRows - 1 - caretRow;\n if (up > 0) tail.push(`\\x1b[${up}A`);\n if (caretCol > 0) tail.push(`\\x1b[${caretCol}C`);\n this.lastCursorRow = aboveRows + caretRow;\n } else {\n // Caret at the very end — leave it where writing left it.\n this.lastCursorRow = aboveRows + (inputRows - 1);\n }\n this.drawnHudWidths = hudWidths;\n this.lastDrawnCols = cols;\n this.bottomDrawn = true;\n\n // ── single flush ────────────────────────────────────────────────────────\n // One write() for the entire region: the move-up + clear + all HUD rows\n // + prompt + palette + cursor positioning. Flushing each piece separately\n // was the source of the per-tick flicker.\n const out = \"\\x1b[J\" + hudRows.join(\"\\r\\n\") + \"\\r\\n\" + tail.join(\"\");\n process.stdout.write(out);\n }\n\n private clearBottom(): void {\n if (!this.bottomDrawn) return;\n this.moveToRegionTop();\n process.stdout.write(\"\\x1b[J\");\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 preview may sit untouched before it's wiped. The model often\n // reasons and then calls a tool without ever emitting an answer, so without\n // this the reasoning tail would linger on screen until the *next* thought (or\n // message) arrives. Re-armed on every delta → fires this long after the last.\n private static readonly STREAM_IDLE_MS = 10_000;\n\n /** Append a fragment of streamed answer text (rendered plain). */\n streamResponseDelta(delta: string, messageId?: string): void {\n this.beginStreamMessage(messageId);\n this.streamResponse += delta;\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 this.streamThinking = \"\";\n this.streamResponse = \"\";\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 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 on every streamed delta: once the model goes quiet for a beat, the\n * preview is stale, so wipe it instead of letting it sit until the next\n * message. The committed message (if any) still renders in full via\n * clearStream(), so nothing is lost. */\n private armStreamIdleExpiry(): void {\n if (this.streamIdleTimer) clearTimeout(this.streamIdleTimer);\n this.streamIdleTimer = setTimeout(() => {\n this.streamIdleTimer = null;\n if (!this.streamThinking && !this.streamResponse) return;\n this.streamThinking = \"\";\n this.streamResponse = \"\";\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 const clamp = (s: string, wrap: string, lead: string): string => {\n const max = cols - 2;\n const t = s.length > max ? s.slice(0, Math.max(0, max - 1)) + \"…\" : s;\n return wrap ? `${lead}${wrap}${t}${C.reset}` : `${lead}${t}`;\n };\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 realLines = (text: string): string[] =>\n text\n .replace(/\\r/g, \"\")\n .split(\"\\n\")\n .filter((l) => l.trim() !== \"\" && !leakedMarkup.test(l));\n if (this.streamResponse) {\n const all = realLines(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 clamp(l, \"\", i === 0 && firstVisible ? `${C.gray}•${C.reset} ` : \" \")\n );\n }\n if (this.streamThinking) {\n return realLines(this.streamThinking)\n .slice(-Tui.STREAM_TAIL)\n .map((l) => clamp(l, thinkStyle, \" \"));\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 const words = text.replace(/\\s+/g, \" \").trim().split(\" \");\n const lines: string[] = [];\n let cur = \"\";\n for (let w of words) {\n while (w.length > limit) {\n if (cur) {\n lines.push(cur);\n cur = \"\";\n }\n lines.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 lines.push(cur);\n cur = w;\n }\n }\n if (cur || !lines.length) lines.push(cur);\n // Width the bar to the longest line + the 2-col marker/indent.\n const innerW = 2 + Math.max(...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 // ─── working indicator (turn state) ───────────────────────────────────────\n\n setWorking(on: boolean): void {\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 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(), SPINNER_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 this.bgCount = n;\n if (n === 0) this.bgBadgeSelected = false; // badge gone → nothing to select\n this.renderBottom();\n }\n setQueuedCount(n: number): void {\n this.queuedCount = n;\n this.renderBottom();\n }\n setConnected(connected: boolean): void {\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(text: string, images: PastedImage[] = []): void {\n this.inputBuffer = text;\n this.cursorPos = text.length;\n this.pendingImages = images;\n this.historyIdx = null;\n this.renderBottom();\n }\n\n /** Cumulative token totals shown on the prompt line (`outTokens` includes live). */\n setTokens(inTokens: number, outTokens: number): void {\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) {\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 /** Approval prompt: arrow-navigable with y/a/l/n shortcuts. Pauses input.\n * Tab resolves \"deny_with_reason\" so the caller can collect a free-text reason. */\n approval(question: string, risk: number): Promise<\"allow\" | \"deny\" | \"always\" | \"always_risk\" | \"deny_with_reason\"> {\n return new Promise((resolve) => {\n const options: { value: \"allow\" | \"always\" | \"always_risk\" | \"deny\"; label: string; shortcut: string; color: 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 { value: \"always_risk\", label: `Allow all level ${risk} this session`, shortcut: \"l\", color: C.cyan },\n { value: \"deny\", label: \"Deny\", shortcut: \"n\", color: C.red },\n ];\n let idx = 0;\n const riskBar = `${C.red}${\"●\".repeat(risk)}${C.gray}${\"○\".repeat(5 - risk)}${C.reset}`;\n\n this.beginTakeover();\n // The header block is a leading blank row, the \"Permission needed\" line,\n // then one row per line of `question` (the command summary plus an optional\n // \"why:\" line). Every row carries the yellow bar so the block reads as one\n // unit — including continuation lines, which previously lost the bar.\n const cols = Math.max(1, process.stdout.columns || 80);\n const physRows = (line: string): number => Math.max(1, Math.ceil(this.visibleWidth(line) / cols));\n const headerText = `${C.yellow}┃${C.reset} ${C.bold}Permission needed${C.reset} risk ${riskBar}`;\n const questionLines = question.split(\"\\n\").map((line) => `${C.yellow}┃${C.reset} ${line}`);\n // Dim affordance row: Tab denies AND lets you tell the agent why.\n const hintLine = `${C.yellow}┃${C.reset} ${C.gray}⇥ tab — deny with a reason${C.reset}`;\n const blockLines = [headerText, ...questionLines, hintLine];\n // Count physical rows (a long command can wrap) so the erase below lines up.\n const headerRows = 1 + blockLines.reduce((n, line) => n + physRows(line), 0);\n process.stdout.write(`\\n` + blockLines.map((line) => `${line}\\n`).join(\"\"));\n const renderLine = (i: number): string => {\n const o = options[i];\n const sel = i === idx;\n const pointer = sel ? `${o.color}❯${C.reset}` : \" \";\n const label = sel ? `${C.bold}${o.label}${C.reset}` : o.label;\n return `${C.yellow}┃${C.reset} ${pointer} ${label} ${C.gray}(${o.shortcut})${C.reset}`;\n };\n const draw = (moveUp: boolean) => {\n if (moveUp) process.stdout.write(`\\x1b[${options.length}A`);\n for (let i = 0; i < options.length; i++) process.stdout.write(`\\r\\x1b[K${renderLine(i)}\\n`);\n };\n draw(false);\n\n // Erase the whole prompt (header block + options) once a choice is made so\n // it doesn't linger in the scrollback. After draw the cursor sits one row\n // below the last option.\n const erase = () => {\n process.stdout.write(\"\\r\");\n const up = headerRows + options.length;\n if (up > 0) process.stdout.write(`\\x1b[${up}A`);\n process.stdout.write(\"\\x1b[J\");\n };\n\n const finish = (choice: \"allow\" | \"deny\" | \"always\" | \"always_risk\" | \"deny_with_reason\") => {\n erase();\n this.endTakeover();\n resolve(choice);\n };\n this.takeoverHandler = (str, key) => {\n if (key?.name === \"up\" || str === \"k\") {\n idx = (idx - 1 + options.length) % options.length;\n draw(true);\n } else if (key?.name === \"down\" || str === \"j\") {\n idx = (idx + 1) % options.length;\n draw(true);\n } else if (key?.name === \"tab\") {\n // Plain Tab → deny, then explain why to the agent. (Shift+Tab is\n // consumed globally before takeovers, so this only sees plain Tab.)\n finish(\"deny_with_reason\");\n } else if (key?.name === \"return\" || key?.name === \"enter\") {\n finish(options[idx].value);\n } else {\n const k = (str || \"\").toLowerCase();\n if (k === \"y\") finish(\"allow\");\n else if (k === \"a\") finish(\"always\");\n else if (k === \"l\") finish(\"always_risk\");\n else if (k === \"n\" || key?.name === \"escape\") finish(\"deny\");\n }\n };\n });\n }\n\n /** Arrow-key selection menu (slash menu, process menu, resume). Pauses input. */\n select<T>(title: string, items: { label: string; hint?: string; value: T }[]): Promise<T | undefined> {\n return new Promise((resolve) => {\n let idx = 0;\n this.beginTakeover();\n if (title) process.stdout.write(`\\n${title}\\n\\n`);\n // Each row is clamped to ONE physical line (preview left, hint right-aligned)\n // so long session previews can't wrap — a wrapped row would desync the\n // \"move up N lines\" redraw and corrupt the menu on every keystroke.\n const renderLine = (i: number): string => {\n const w = process.stdout.columns || 80;\n const it = items[i];\n const sel = i === idx;\n const hint = it.hint ?? \"\";\n const hintW = hint.length;\n const pointerW = 2; // \"❯ \" or \" \"\n const labelMax = Math.max(6, w - 2 - pointerW - (hintW ? hintW + 2 : 0));\n let label = it.label;\n if (label.length > labelMax) label = label.slice(0, labelMax - 1) + \"…\";\n const pointer = sel ? `${C.magenta}❯${C.reset} ` : \" \";\n const styledLabel = sel ? `${C.bold}${C.cyan}${label}${C.reset}` : label;\n let line = `${pointer}${styledLabel}`;\n if (hintW) {\n const gap = Math.max(2, w - 2 - pointerW - label.length - hintW);\n line += `${\" \".repeat(gap)}${C.gray}${hint}${C.reset}`;\n }\n return line;\n };\n const draw = (moveUp: boolean) => {\n if (moveUp) process.stdout.write(`\\x1b[${items.length}A`);\n for (let i = 0; i < items.length; i++) process.stdout.write(`\\r\\x1b[K${renderLine(i)}\\n`);\n };\n draw(false);\n // Erase the whole menu block (title + rows) when it closes so it doesn't\n // linger in the scrollback. After draw the cursor sits one row below the\n // last item; the title block above occupies 3 rows (blank/title/blank).\n const titleRows = title ? 3 : 0;\n const erase = () => {\n process.stdout.write(\"\\r\");\n const up = titleRows + items.length;\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 close(items[idx].value);\n } else if (key.name === \"escape\") {\n close(undefined);\n }\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","/**\n * Sent-message history, stored in the THREAD KV (key `input_history`) — not on\n * the local filesystem. Session state lives server-side as a rule (like\n * approvals and the process registry) so it resumes from any machine and\n * leaves nothing behind on the host.\n *\n * KV is per-thread, but recall should feel per-project: when a NEW session\n * starts, the caller passes the project's newest prior thread as a seed and\n * the history carries over (and is copied to the new thread's KV). Oldest →\n * newest; capped so the value can't grow without bound. All IO is best-effort.\n */\n\nexport const HISTORY_KEY = \"input_history\";\nconst MAX_ENTRIES = 100;\n\n/** The KV surface history needs (satisfied by ApiClient). */\nexport interface HistoryStore {\n kvGet(threadId: string, key: string): Promise<unknown>;\n kvSet(threadId: string, key: string, value: unknown): Promise<void>;\n}\n\nfunction clean(value: unknown): string[] {\n if (!Array.isArray(value)) return [];\n return value.filter((e): e is string => typeof e === \"string\" && e.trim() !== \"\").slice(-MAX_ENTRIES);\n}\n\n/**\n * Load the thread's sent-message history. When the thread has none yet (a\n * fresh session) and a seed thread is given, inherit the seed's history and\n * persist it onto this thread so the chain continues from here.\n */\nexport async function loadHistory(\n store: HistoryStore,\n threadId: string,\n seedThreadId?: string\n): Promise<string[]> {\n const own = clean(await store.kvGet(threadId, HISTORY_KEY));\n if (own.length) return own;\n if (seedThreadId && seedThreadId !== threadId) {\n const seeded = clean(await store.kvGet(seedThreadId, HISTORY_KEY));\n if (seeded.length) {\n void store.kvSet(threadId, HISTORY_KEY, seeded);\n return seeded;\n }\n }\n return [];\n}\n\n/**\n * Append a sent message to the in-memory history (skipping a consecutive\n * duplicate), cap it, and persist the whole list to the thread KV. Returns\n * the same array, mutated, so the caller's reference stays current.\n */\nexport function appendHistory(\n store: HistoryStore,\n threadId: string,\n history: string[],\n text: string\n): string[] {\n const t = text.trim();\n if (!t || history[history.length - 1] === t) return history;\n history.push(t);\n if (history.length > MAX_ENTRIES) history.splice(0, history.length - MAX_ENTRIES);\n void store.kvSet(threadId, HISTORY_KEY, [...history]);\n return history;\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\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 (asterisk forms only — underscores are common in code/ids).\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) => `${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 inFence = false;\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 if (/^\\s*```/.test(line)) {\n inFence = !inFence;\n i++;\n continue;\n }\n if (inFence) {\n out.push(`${GRAY}│${R} ${line}`);\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","/**\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\";\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: { ...process.env, ...(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","/** Read/write ~/.standardagents/credentials. */\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport os from \"node:os\";\nimport type { CredentialsFile, InstanceCredential } from \"./types.ts\";\n\nconst DIR = path.join(os.homedir(), \".standardagents\");\nconst FILE = path.join(DIR, \"credentials\");\n\nexport function normalizeEndpoint(endpoint: string): string {\n let e = endpoint.trim();\n if (!/^https?:\\/\\//i.test(e)) e = \"http://\" + e;\n return e.replace(/\\/+$/, \"\");\n}\n\nexport function loadCredentials(): CredentialsFile {\n try {\n const raw = fs.readFileSync(FILE, \"utf8\");\n const parsed = JSON.parse(raw) as CredentialsFile;\n if (!parsed.instances) parsed.instances = {};\n return parsed;\n } catch {\n return { instances: {} };\n }\n}\n\nexport function getCredential(endpoint: string): InstanceCredential | null {\n const creds = loadCredentials();\n return creds.instances[normalizeEndpoint(endpoint)] ?? null;\n}\n\nexport function saveCredential(\n cred: InstanceCredential,\n options: { updateDefault?: boolean } = {}\n): void {\n const creds = loadCredentials();\n const endpoint = normalizeEndpoint(cred.endpoint);\n creds.instances[endpoint] = { ...cred, endpoint };\n if (options.updateDefault ?? true) {\n creds.default_endpoint = endpoint;\n }\n fs.mkdirSync(DIR, { recursive: true });\n // Credentials contain a bearer token — keep them private.\n fs.writeFileSync(FILE, JSON.stringify(creds, null, 2), { mode: 0o600 });\n try {\n fs.chmodSync(FILE, 0o600);\n } catch {\n // best effort on platforms without chmod\n }\n}\n\n/** Remove the saved token for an endpoint (the `/logout` command). */\nexport function deleteCredential(endpoint: string): void {\n const creds = loadCredentials();\n delete creds.instances[normalizeEndpoint(endpoint)];\n fs.mkdirSync(DIR, { recursive: true });\n fs.writeFileSync(FILE, JSON.stringify(creds, null, 2), { mode: 0o600 });\n try {\n fs.chmodSync(FILE, 0o600);\n } catch {\n // best effort on platforms without chmod\n }\n}\n\nexport function defaultEndpoint(): string | null {\n return loadCredentials().default_endpoint ?? null;\n}\n\nexport function saveDefaultEndpoint(endpoint: string): void {\n const creds = loadCredentials();\n creds.default_endpoint = normalizeEndpoint(endpoint);\n fs.mkdirSync(DIR, { recursive: true });\n fs.writeFileSync(FILE, JSON.stringify(creds, null, 2), { mode: 0o600 });\n try {\n fs.chmodSync(FILE, 0o600);\n } catch {\n // best effort on platforms without chmod\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 (6h 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\";\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 * 6; // 6 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], { detached: true, stdio: \"ignore\" });\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 6 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 });\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 * Standard Code CLI entry point.\n *\n * Pre-flight (plain readline): resolve the instance endpoint, OAuth-login if\n * needed, then offer to resume a thread tagged for this project+machine or start\n * a new one. Then hand off to the interactive TUI which streams the agent and\n * forwards its tools to this host.\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 SkillInfo, type SubagentInfo } from \"./api.ts\";\nimport { Bridge } from \"./bridge.ts\";\nimport { HostTools } from \"./host-tools.ts\";\nimport { MessageStream } from \"./stream.ts\";\nimport { SystemEvents } from \"./events-stream.ts\";\nimport { Tui, type PastedImage } from \"./tui.ts\";\nimport { loadHistory, appendHistory } from \"./history.ts\";\nimport { renderMarkdown } from \"./markdown.ts\";\nimport { ProcessRegistry } from \"./process-registry.ts\";\nimport { McpManager } from \"./mcp.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 } from \"./render.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 AGENT_ID = \"standard_code_agent\";\n// The instance's model gearbox hands sessions between agent variants; a\n// thread parked in another gear must still be resumable from the CLI.\nconst AGENT_ID_VARIANTS = [AGENT_ID, \"standard_code_high_agent\"];\n// The hosted Standard Code instance — where every normal user's session\n// lives. Only `--endpoint` (rare: local dev, self-hosted) points elsewhere.\nconst PRODUCTION_ENDPOINT = \"https://api.standardcode.ai\";\n\nconst c = {\n reset: \"\\x1b[0m\",\n dim: \"\\x1b[2m\",\n bold: \"\\x1b[1m\",\n white: \"\\x1b[97m\",\n cyan: \"\\x1b[36m\",\n green: \"\\x1b[32m\",\n gray: \"\\x1b[90m\",\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}\n\nfunction printUsage(): void {\n output.write(\n [\n \"\",\n `${c.bold}Usage${c.reset}`,\n \" standardcode [options] [dir]\",\n \"\",\n `${c.bold}Options${c.reset}`,\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 \" -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 === \"--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 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 renderMarkdown(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.\n */\nfunction startLoader(label: string): { stop: () => void } {\n const frames = [\"⣷\", \"⣯\", \"⣟\", \"⡿\", \"⢿\", \"⣻\", \"⣽\", \"⣾\"];\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${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/** A calm, branded goodbye printed on a graceful shutdown. */\nfunction farewell(stoppedProcs = 0): void {\n output.write(\"\\x1b[?25h\"); // re-show the cursor in case a loader had it hidden\n if (stoppedProcs > 0) {\n output.write(\n `\\n${c.cyan}⚙${c.reset} Stopped ${stoppedProcs} background process${stoppedProcs === 1 ? \"\" : \"es\"}.\\n`\n );\n }\n output.write(`\\n${c.teal}◇${c.reset} ${c.dim}Standard Code — see you soon.${c.reset}\\n`);\n}\n\n/** Whether a hostname is a local/private dev address (loopback, .local, RFC-1918). */\nfunction 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 */\nfunction 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/** Read this package's version from package.json (best effort). */\nfunction readVersion(): string {\n try {\n const pkg = JSON.parse(fs.readFileSync(new URL(\"../package.json\", import.meta.url), \"utf8\"));\n return typeof pkg.version === \"string\" ? pkg.version : \"\";\n } catch {\n return \"\";\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 // 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}${dir}${c.reset}`,\n ];\n const markWidth = Math.max(...LOGO_MARK.map((l) => [...l].length));\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 * 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. Replaces the old wrap-everything-in-gray.\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 over the bridge, 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\nasync function main(): Promise<void> {\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 const endpointArg = cliArgs.endpoint;\n const endpointOverride = cliArgs.promptEndpoint || (typeof endpointArg === \"string\" && endpointArg.trim() !== \"\");\n const dirArg = cliArgs.dir;\n\n const 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}${gradientText(\"Sign in to 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. Offer to resume a session for this project+machine, or start new.\n const tags = [`path:${projectDir}`, `machine:${machine}`];\n const loadingSessions = startLoader(\"Loading sessions\");\n let existing: ThreadSummary[] = [];\n try {\n existing = await api.listThreads(AGENT_ID_VARIANTS, tags);\n } catch {\n existing = [];\n }\n const summaries = existing.length > 0 ? await summarizeThreads(api, existing.slice(0, 8)) : [];\n loadingSessions.stop();\n\n const tui = new Tui(1); // auto-accept level 1 by default (asks on anything riskier than a read)\n\n let threadId: string;\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 if (existing.length > 0) {\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 home = os.homedir();\n const tilde = projectDir.startsWith(home) ? \"~\" + projectDir.slice(home.length) : projectDir;\n const shortDir = tilde.length > 38 ? \"…\" + tilde.slice(-37) : tilde;\n const picked = await tui.select(\n `${c.bold}${c.magenta}Resume a session${c.reset} ${c.gray}${shortDir}${c.reset} ${c.dim}↑↓ · enter · esc to cancel${c.reset}`,\n items\n );\n if (typeof picked === \"string\") {\n threadId = picked;\n resumed = true;\n } else {\n threadId = await api.createThread(AGENT_ID, tags);\n historySeed = existing[0]?.id;\n }\n } else {\n threadId = await api.createThread(AGENT_ID, tags);\n }\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 await runInteractive(tui, api, threadId, projectDir, machine, resumed, historySeed);\n historySeed = threadId;\n threadId = await api.createThread(AGENT_ID, tags);\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/**\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 const hint = [t.id.slice(0, 8), when].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 * 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 the\n * approval mints our personal API key. Throws with a plain message on\n * timeout or failure.\n */\nasync function deviceLogin(endpoint: string): Promise<string> {\n const start = await fetch(`${endpoint}/api/auth/device/start`, { method: \"POST\" });\n if (!start.ok) throw new Error(`This instance does not support browser sign-in (HTTP ${start.status}). Paste an API token instead.`);\n const info = (await start.json()) as { code: string; verify_url: string; poll_url: string; interval?: number; expires_in?: number };\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 const deadline = Date.now() + (info.expires_in ?? 600) * 1000;\n const interval = Math.max(2, info.interval ?? 2) * 1000;\n while (Date.now() < deadline) {\n await new Promise((r) => setTimeout(r, interval));\n const res = await fetch(info.poll_url).catch(() => null);\n if (!res) continue;\n if (res.status === 404) throw new Error(\"The sign-in link expired. Try again.\");\n const body = (await res.json().catch(() => ({}))) as { status?: string; token?: string };\n if (body.status === \"approved\" && body.token) return body.token;\n if (body.status === \"denied\") throw new Error(\"Sign-in was denied in the browser.\");\n }\n throw new Error(\"Timed out waiting for browser approval. Try again.\");\n}\n\n/** Open a URL in the system browser (best effort). */\nfunction 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, { stdio: \"ignore\", detached: true });\n child.unref();\n } catch {\n // ignore — the URL is also printed for manual opening\n }\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/**\n * Whether a message carries tool calls. The API serializes `tool_calls` as a\n * JSON STRING (not an array), so `Array.isArray` is never true — checking only\n * that would treat a tool-call assistant message (which can also have narration\n * content) as a final answer, completing the turn while a tool/approval is still\n * pending. Handle both shapes.\n */\nfunction hasToolCalls(m: any): boolean {\n const tc = m?.tool_calls;\n if (Array.isArray(tc)) return tc.length > 0;\n if (typeof tc === \"string\") {\n const s = tc.trim();\n return s.length > 0 && s !== \"null\" && s !== \"[]\";\n }\n return false;\n}\n\n/** Extract plain text from a message's content (string or content-block array). */\nfunction messageText(content: unknown): string {\n if (typeof content === \"string\") return content;\n if (Array.isArray(content)) {\n return content\n .map((b: any) => (typeof b === \"string\" ? b : typeof b?.text === \"string\" ? b.text : \"\"))\n .join(\"\");\n }\n return \"\";\n}\n\n/** Whether the thread is currently working (a turn active or queued work pending). */\nfunction threadBusy(msgs: any[]): boolean {\n if (!msgs.length) return false;\n if (msgs.some((m) => m.status === \"pending\")) return true;\n const last = [...msgs].sort((a, b) => (b.created_at ?? 0) - (a.created_at ?? 0))[0];\n if (!last) return false;\n if (last.role === \"user\" || last.role === \"tool\") return true; // turn about to run / mid-turn\n if (last.role === \"assistant\") return hasToolCalls(last); // tool-call message = still going\n return false; // a final assistant text, or a system/stop message → idle\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((m) => m.role === \"user\" || (m.role === \"assistant\" && messageText(m.content).trim()))\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 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 threadId: string,\n projectDir: string,\n machine: string,\n resumed: boolean,\n historySeedThreadId?: string\n): Promise<void> {\n // Background-process metadata lives in the thread's KV (server-side), so the\n // list resumes from any machine; nothing about it is stored on this client.\n const registry = new ProcessRegistry(api, threadId, machine);\n // MCP host: the CLI negotiates with locally-launched MCP servers and forwards\n // the agent's `mcp` tool calls to them. The discovered tool catalog is mirrored\n // into the thread KV so a context hook can show the agent what's available.\n const mcp = new McpManager(projectDir);\n const publishMcpCatalog = () => void api.kvSet(threadId, \"mcp_catalog\", mcp.catalog()).catch(() => {});\n const host = new HostTools(projectDir, registry, threadId, machine, mcp, publishMcpCatalog, api);\n const refreshBgCount = () => {\n void registry.runningCount().then((n) => tui.setBackgroundCount(n)).catch(() => {});\n };\n const perm: PermissionState = { level: tui.level, alwaysAllow: new Set(), allowRisk: new Set() };\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 // Tell the agent where its shell lives: the instance's context hook renders\n // this as a synthetic opening pwd exchange + a [SESSION] line, so the agent\n // never burns a bash call (or a cd prefix) discovering its own cwd.\n void api.kvSet(threadId, \"session_info\", { cwd: projectDir, machine }).catch(() => {});\n\n // Everything from here to the banner is session wiring (history load, the\n // bridge/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 // Set when the user hits esc to interrupt: clears the working indicator\n // immediately and suppresses the poller from re-showing it until the backend\n // confirms the turn actually stopped (otherwise \"Working\" lingers a poll or two).\n let interrupting = false;\n // Messages typed while busy, held to send next (with any pasted images).\n const queued: { text: string; images: PastedImage[] }[] = [];\n let editingQueued = false; // input currently holds a pulled queued message\n const shownIds = new Set<string>(); // message ids already printed to the transcript\n // User messages the CLI optimistically displayed on send, keyed by content, so\n // the poller doesn't re-print them — while it DOES render user messages that\n // were submitted from elsewhere (web UI, API, another client).\n const pendingSent = new Map<string, number>();\n\n // ── token feed ──────────────────────────────────────────────────────────\n // Cumulative tokens are authoritative from logs (one row per completed LLM\n // call); a live estimate from streamed content ticks the output count up\n // between log updates so a long generation isn't silent.\n let tokensIn = 0;\n let tokensOut = 0;\n let liveOut = 0; // output tokens for the in-progress response (from `generation` events)\n const countedLogs = new Set<string>();\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 // bridge — which actually runs the forwarded tools on the host — RECONCILES it:\n // it fills in a `started` the stream missed and clears a `done` it dropped, so\n // the label can't strand on a tool that already finished (see Bridge onStatus).\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 totals + step to the prompt. Output total folds in the\n // live in-progress count; the step's own output is the live count.\n const refreshStatus = () => {\n tui.setTokens(tokensIn, tokensOut + liveOut);\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 const bridge = new Bridge(api, threadId, host, perm, {\n onActivity: (line, detail) => {\n tui.print(colorActivity(line));\n // Pre-styled extra rows (truncated diffs for edits/writes) print verbatim.\n if (detail) for (const d of detail) tui.print(d);\n refreshBgCount();\n },\n onStatus: (id, summary) => {\n // Reconcile the stream's best-effort step signal with what the host is\n // really running — the CLI executes the forwarded tools, so it knows:\n // - on start: fill in a `started` the stream may have dropped, but DON'T\n // override a label the stream already set (it can be richer/intentional).\n // - on finish: authoritatively clear it, healing a dropped `done` so the\n // label can't strand on a tool that already completed.\n // Durable calls share the tool-call id with the stream, so this lines up.\n if (summary) {\n if (!activeSteps.has(id)) activeSteps.set(id, summary);\n } else {\n activeSteps.delete(id);\n }\n refreshStatus();\n },\n onConnection: (state, attempt) => {\n // Brief drops are normal (a permission wait, a dev-server reload) and the\n // bridge reconnects on its own — stay quiet unless reconnection is actually\n // struggling (several seconds of failed attempts). The disconnect shows as a\n // TRANSIENT notice line in the bottom region that clears itself the moment we\n // reconnect, so nothing about it lingers in the transcript.\n if (state === \"reconnecting\") {\n if (attempt >= 4) tui.setConnected(false);\n } else {\n tui.setConnected(true);\n }\n },\n requestApproval: async (req, summary, risk) => {\n const choice = await tui.approval(\n `${summary}${req.requestPermission ? `\\n${c.bold}why: ${req.requestPermission}${c.reset}` : \"\"}`,\n risk\n );\n if (choice === \"deny_with_reason\") {\n // Tab on the approval menu: deny, but tell the agent why so it can adapt.\n const reason = await tui.prompt(\n \"Why are you denying this? (sent to the agent — enter to send, esc to skip)\"\n );\n return { choice: \"deny\", reason: reason ?? undefined };\n }\n return { choice };\n },\n });\n\n // The message stream drives two live signals (the transcript itself is\n // rendered from polling for robustness):\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 // Live streaming preview: answer text and (opt-in) internal reasoning feed\n // the TUI's ephemeral preview; the committed message still renders from\n // polling, which calls tui.clearStream() first so there's no double-render.\n onChunk: (text, mid) => tui.streamResponseDelta(text, mid),\n onReasoningChunk: (text, mid) => tui.streamThinkingDelta(text, mid),\n onAssistantText: () => {},\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 }\n },\n onError: () => {},\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 — not on the\n // thread-registry events. So we treat the system-events channel purely as a\n // \"something changed\" signal and re-read /api/threads/:id/subagents, showing a\n // line only for subagents whose status is `running`.\n // Running child threadId -> display label + raw agent name (the TUI colors\n // the compaction agent orange by name).\n const activeSubagents = new Map<string, { label: 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 const pushSubagents = () =>\n tui.setSubagents(\n [...activeSubagents.entries()].map(([id, s]) => ({ id, label: s.label, agentName: s.agentName }))\n );\n // Rebuild the running-subagent set from the authoritative child registry.\n // Runs on every (re)connect (covering subagents that started before this\n // socket, or during a reconnect gap) and whenever a child thread changes.\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 // Show the live status text on the line when it's more than the bare\n // lifecycle marker, so the user can see what the subagent is doing.\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 const detail = oneLineStatus && oneLineStatus !== \"running\" ? ` — ${oneLineStatus.slice(0, 80)}` : \"\";\n activeSubagents.set(s.id, {\n label: `${subagentLabel(s, agentTitles)}${detail}`,\n agentName: s.agent_name ?? undefined,\n });\n }\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 events = new SystemEvents(api, {\n onOpen: () => scheduleReconcile(),\n onThreadCreated: (t) => {\n if (t.parent === threadId) scheduleReconcile();\n },\n onThreadUpdated: (t) => {\n if (t.parent === threadId) scheduleReconcile();\n },\n onThreadDeleted: (id) => {\n if (activeSubagents.has(id)) scheduleReconcile();\n },\n });\n // Registry status text (setStatus / sessionStatus heartbeats) changes without\n // firing a thread event, so while any subagent line is visible, refresh it on\n // a slow poll to keep the displayed working state current. Discovery of NEW\n // subagents still comes from the events above; this only keeps text fresh.\n const heartbeatPoll = setInterval(() => {\n if (activeSubagents.size > 0) scheduleReconcile();\n }, 5000);\n heartbeatPoll.unref();\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 // Stop the agent's turn on the backend before we exit — the LLM loop runs\n // remotely, so without this it would keep working after the CLI disconnects.\n // Also kill any background processes this machine spawned: they're detached,\n // so without this they'd outlive the session. Fire both, tear down locally,\n // then wait briefly so they land (capped so quitting stays snappy even if\n // the instance is unreachable).\n const stopped = api.stop(threadId).catch(() => {});\n const procsStopped = host.stopAllLocalProcesses().catch(() => 0);\n bridge.close();\n stream.close();\n events.close();\n mcp.closeAll();\n const [, killed] = await Promise.race([\n Promise.all([stopped, procsStopped]),\n new Promise<[unknown, number]>((r) => setTimeout(() => r([undefined, 0]), 1500)),\n ]);\n farewell(killed);\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 (stop the turn + this machine's background processes). The next\n // 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 stop: async (id: string) => {\n await host.execute(\"background_process\", { action: \"stop\", id });\n refreshBgCount();\n },\n };\n\n // ── MCP control surface (for the /mcp command + slash menu) ────────────────\n const mcpCtl: McpController = {\n configured: () => listMcpServers(),\n connectedNames: () => mcp.connectedNames(),\n catalog: () => mcp.catalog(),\n connect: async (cfg) => {\n try {\n const client = await mcp.connect(cfg);\n publishMcpCatalog();\n return { ok: true, tools: client.tools.length };\n } catch (e) {\n publishMcpCatalog();\n return { ok: false, error: e instanceof Error ? e.message : String(e) };\n }\n },\n disconnect: (name) => {\n mcp.disconnect(name);\n publishMcpCatalog();\n },\n add: async (cfg) => {\n saveMcpServer(cfg);\n return mcpCtl.connect(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) => {\n mcp.disconnect(name);\n removeMcpServer(name);\n publishMcpCatalog();\n },\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\n const sendNow = async (text: string, images: PastedImage[] = []) => {\n tui.printUserMessage(text);\n // Mark it shown so the poller (which now also renders user messages) doesn't\n // double-print our own send once the backend persists it.\n const key = text.trim();\n pendingSent.set(key, (pendingSent.get(key) ?? 0) + 1);\n try {\n await api.sendMessage(threadId, text, 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 tui.print(`${c.dim}failed to send: ${e instanceof Error ? e.message : String(e)}${c.reset}`);\n return;\n }\n interrupting = false; // a fresh turn — let the working indicator show again\n busy = true;\n tui.setWorking(true);\n };\n const flushQueued = async () => {\n if (!queued.length) return;\n const toSend = queued.splice(0);\n tui.setQueuedCount(0);\n for (const q of toSend) await sendNow(q.text, q.images);\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 // ── 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 { 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 {\n name: \"mcp\",\n label: \"MCP servers\",\n hint: () => {\n const n = mcpCtl.connectedNames().length;\n return n ? `${n} connected` : \"none\";\n },\n run: () => runMcpMenu(tui, mcpCtl),\n },\n {\n name: \"skills\",\n label: \"Agent skills\",\n hint: \"list / install / manage\",\n run: () => runSkillsMenu(tui, skillsCtl),\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 tui.onSubmit = (text, images) => {\n appendHistory(api, threadId, history, text);\n if (editingQueued) {\n editingQueued = false;\n queued.push({ text, images });\n tui.setQueuedCount(queued.length);\n tui.print(`${c.gray}⏳ queued:${c.reset} ${text}`);\n return;\n }\n if (busy) {\n queued.push({ text, images });\n tui.setQueuedCount(queued.length);\n tui.print(`${c.gray}⏳ queued:${c.reset} ${text} ${c.dim}(esc to steer now)${c.reset}`);\n } else {\n void sendNow(text, images);\n }\n };\n\n tui.onInterrupt = () => {\n if (queued.length > 0) {\n tui.print(`${c.yellow}↪ steering — stopping current work and sending your message…${c.reset}`);\n void api\n .stop(threadId)\n .catch(() => {})\n .then(() => flushQueued());\n } else if (busy) {\n // Optimistically stop the working indicator so esc feels immediate.\n interrupting = true;\n busy = false;\n activeSteps.clear();\n liveOut = 0;\n tui.setWorking(false);\n refreshStatus();\n tui.print(`${c.yellow}[interrupted by user]${c.reset}`);\n void api.stop(threadId).catch(() => {});\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() || queued.length === 0) return false;\n const q = queued.pop()!;\n tui.setQueuedCount(queued.length);\n editingQueued = true;\n tui.setInput(q.text, q.images);\n return true;\n };\n\n events.connect();\n await Promise.all([bridge.connect(), 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 tui.banner([\n `${c.bold}${c.magenta}Standard Code${c.reset} ${c.dim}— coding agent${c.reset}`,\n `${c.gray}project:${c.reset} ${projectDir}`,\n `${c.gray}machine:${c.reset} ${machine} ${c.gray}thread:${c.reset} ${threadId.slice(0, 8)}`,\n ]);\n\n if (resumed) await printHistory(api, threadId, tui);\n\n // Seed shown-ids so the poller doesn't re-print existing 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 // Connect every enabled MCP server, then publish the catalog so the agent sees\n // the tools on its very first step. (The CLI is the MCP host; this is the real\n // initialize/tools-list handshake with each local server.)\n const enabledServers = listMcpServers().filter((s) => s.enabled);\n for (const s of enabledServers) {\n const res = await mcpCtl.connect(s);\n if (res.ok) {\n tui.print(`${c.cyan}⚡ MCP \"${s.name}\" connected${c.reset} ${c.gray}(${res.tools} tool${res.tools === 1 ? \"\" : \"s\"})${c.reset}`);\n } else {\n tui.print(`${c.red}⚠ MCP \"${s.name}\" failed:${c.reset} ${c.gray}${res.error}${c.reset}`);\n }\n }\n publishMcpCatalog();\n\n tui.start(); // begin the persistent input line\n\n // ── poller: display new messages, drive the working indicator, flush queue ──\n const poll = async () => {\n let msgs: any[];\n try {\n msgs = await api.getMessages(threadId, 60);\n } catch {\n return;\n }\n const sorted = [...msgs].sort((a, b) => (a.created_at ?? 0) - (b.created_at ?? 0));\n for (const m of sorted) {\n if (shownIds.has(m.id) || m.status === \"pending\") continue;\n shownIds.add(m.id);\n const text = messageText(m.content).trim();\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 const polledBusy = threadBusy(msgs);\n // While interrupting, keep the indicator off until the backend has actually\n // gone idle — then clear the latch so future turns show \"Working\" again.\n if (interrupting) {\n if (!polledBusy) interrupting = false;\n busy = false;\n } else {\n busy = polledBusy;\n }\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 if (queued.length > 0 && !editingQueued) await flushQueued();\n }\n refreshBgCount();\n\n // Authoritative token totals from completed LLM-call logs.\n try {\n const logs = await api.getLogs(threadId, 100);\n let landed = 0;\n for (const l of logs) {\n // Skip until the call is finalized — an in-progress log has null tokens,\n // and counting it early would mark its id seen before the real counts land.\n if (!l.is_complete) continue;\n const id = l.id ?? `${l.created_at}:${l.total_tokens}`;\n if (countedLogs.has(id)) continue;\n countedLogs.add(id);\n const inT = Number(l.input_tokens) || 0;\n const outT = Number(l.output_tokens) || 0;\n tokensIn += inT;\n tokensOut += outT;\n landed += outT;\n }\n if (landed > 0) liveOut = 0; // a real count arrived; drop the live estimate\n refreshStatus();\n } catch {\n // ignore — token feed is best-effort\n }\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 const pollTimer = setInterval(() => void poll().catch(() => {}), 1200);\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 clearInterval(pollTimer);\n clearInterval(heartbeatPoll);\n // Stop the remote turn (the LLM loop runs server-side) and this machine's\n // background processes — the fresh thread's registry won't know about them.\n const stopped = api.stop(threadId).catch(() => {});\n const procsStopped = host.stopAllLocalProcesses().catch(() => 0);\n bridge.close();\n stream.close();\n events.close();\n mcp.closeAll();\n const [, killed] = await Promise.race([\n Promise.all([stopped, procsStopped]),\n new Promise<[unknown, number]>((r) => setTimeout(() => r([undefined, 0]), 1500)),\n ]);\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.setQueuedCount(0);\n tui.setContextPct(null);\n tui.setStep(null, 0);\n tui.setBackgroundCount(0);\n if (killed > 0) {\n tui.print(`${c.cyan}⚙${c.reset} Stopped ${killed} background process${killed === 1 ? \"\" : \"es\"}.`);\n }\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\ninterface McpController {\n configured: () => McpServerConfig[];\n connectedNames: () => string[];\n catalog: () => { servers: { name: string; status: string; tools: { name: string; description?: string }[]; resources: { uri: string }[]; error?: string }[] };\n connect: (cfg: McpServerConfig) => Promise<{ ok: boolean; tools?: number; error?: string }>;\n disconnect: (name: string) => void;\n add: (cfg: McpServerConfig) => Promise<{ ok: boolean; tools?: number; error?: string }>;\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/** 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} /${c.reset} open the command palette (type to filter)`);\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 this process\", value: \"stop\" as const },\n { label: \"Leave it running\", value: \"leave\" as const },\n ]);\n if (action === \"stop\") {\n await bg.stop(picked);\n tui.print(`${c.gray}stopped ${picked}${c.reset}`);\n }\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: `All level ${r} risk`, hint: \"always allowed\", 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 * configured servers with status, and lets you add (free-text command), view\n * tools, connect/disconnect, enable/disable, and remove — all menu-driven.\n */\nasync function runMcpMenu(tui: Tui, mcp: McpController): Promise<void> {\n const configured = mcp.configured();\n const connected = new Set(mcp.connectedNames());\n const cat = 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 : connected.has(s.name)\n ? `connected · ${entry?.tools.length ?? 0} tools`\n : entry?.error\n ? \"error\"\n : \"disconnected\";\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}(↑/↓ · enter · esc to close)${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 const isConnected = connected.has(picked);\n\n const action = await tui.select(`${c.bold}${picked}${c.reset}`, [\n { label: \"View tools\", value: \"tools\" as const },\n isConnected\n ? { label: \"Disconnect\", value: \"disconnect\" as const }\n : { label: \"Connect\", value: \"connect\" 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 = mcp.catalog().servers.find((e) => e.name === picked);\n if (!entry || entry.status !== \"connected\") {\n tui.print(`${c.gray}${picked} is not connected — connect it to list tools.${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 === \"connect\") {\n const res = await mcp.connect(server);\n tui.print(res.ok ? `${c.cyan}⚡ connected (${res.tools} tools)${c.reset}` : `${c.red}⚠ ${res.error}${c.reset}`);\n } else if (action === \"disconnect\") {\n mcp.disconnect(picked);\n tui.print(`${c.gray}disconnected ${picked}${c.reset}`);\n } else if (action === \"enable\") {\n mcp.setEnabled(picked, true);\n const res = await mcp.connect(server);\n tui.print(res.ok ? `${c.cyan}⚡ enabled + connected (${res.tools} tools)${c.reset}` : `${c.red}⚠ enabled but failed: ${res.error}${c.reset}`);\n } else if (action === \"disable\") {\n mcp.setEnabled(picked, false);\n mcp.disconnect(picked);\n tui.print(`${c.gray}disabled + disconnected ${picked}${c.reset}`);\n } else if (action === \"remove\") {\n mcp.remove(picked);\n tui.print(`${c.gray}removed ${picked}${c.reset}`);\n }\n}\n\n/** Prompt for a new MCP server (`name: command args`), then save + connect 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 tui.print(`${c.gray}connecting MCP \"${cfg.name}\" (${cfg.command} ${cfg.args.join(\" \")})…${c.reset}`);\n const res = await mcp.add(cfg);\n if (res.ok) tui.print(`${c.cyan}⚡ MCP \"${cfg.name}\" connected${c.reset} ${c.gray}(${res.tools} tool${res.tools === 1 ? \"\" : \"s\"})${c.reset}`);\n else tui.print(`${c.red}⚠ MCP \"${cfg.name}\" failed:${c.reset} ${c.gray}${res.error}${c.reset} ${c.dim}(saved; retry from the MCP menu)${c.reset}`);\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"]}
|