@standardagents/code 0.0.2-dev.517db40 → 0.0.2-dev.b3cdaaf
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -11
- package/bin/standardcode.mjs +25 -0
- package/package.json +4 -5
- package/src/api.ts +169 -0
- package/src/approvals.ts +42 -0
- package/src/bridge.ts +303 -0
- package/src/credentials.ts +49 -0
- package/src/events-stream.ts +99 -0
- package/src/host-tools.ts +570 -0
- package/src/index.ts +1152 -0
- package/src/markdown.ts +226 -0
- package/src/mcp-config.ts +137 -0
- package/src/mcp.ts +563 -0
- package/src/permissions.ts +53 -0
- package/src/process-registry.ts +122 -0
- package/src/stream.ts +134 -0
- package/src/tui.ts +911 -0
- package/src/types.ts +78 -0
- package/dist/index.js +0 -3463
- package/dist/index.js.map +0 -1
package/dist/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/api.ts","../src/permissions.ts","../src/approvals.ts","../src/bridge.ts","../src/process-registry.ts","../src/mcp-config.ts","../src/host-tools.ts","../src/stream.ts","../src/events-stream.ts","../src/types.ts","../src/tui.ts","../src/markdown.ts","../src/mcp.ts","../src/credentials.ts","../src/index.ts"],"names":["path","os","KEY","fs","input","isAlive","crypto","hasToolCalls","c","spawn","DIR","FILE","output","readline"],"mappings":"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","file":"index.js","sourcesContent":["/** Minimal REST client for the Standard Agents instance. */\nimport type { ThreadSummary } from \"./types.ts\";\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 try {\n await this.json(\"/api/auth/me\");\n return true;\n } catch {\n return false;\n }\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 /** List threads for an agent, optionally filtering to those carrying all given tags. */\n async listThreads(agentId: string, requireTags: string[]): Promise<ThreadSummary[]> {\n const res = await this.json<{ threads?: any[] } | any[]>(\n `/api/threads?agent_id=${encodeURIComponent(agentId)}&limit=100`\n );\n const arr = Array.isArray(res) ? res : res.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 async sendMessage(threadId: string, content: string): Promise<void> {\n await this.json(`/api/threads/${threadId}/messages`, {\n method: \"POST\",\n body: JSON.stringify({ role: \"user\", content }),\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 /** 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 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","/**\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 * 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 type { ToolRequest } from \"./types.ts\";\n\nexport type ApprovalChoice = \"allow\" | \"deny\" | \"always\" | \"always_risk\";\n\nexport type ConnectionState = \"connected\" | \"reconnecting\" | \"reconnected\";\n\nexport interface BridgeHooks {\n /** Print a permanent line (a finished/denied/blocked tool). */\n onActivity(line: string): void;\n /** Update the live working status (the currently-running tool, or null = idle). */\n onStatus?(label: 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<ApprovalChoice>;\n}\n\n/** Tools that mutate or execute (used to deny in plan mode cleanly). */\nconst PATH_ARG_TOOLS = new Set([\"read_file\", \"list_dir\", \"grep\", \"glob\", \"write_file\", \"edit_file\", \"delete\"]);\n\nexport class Bridge {\n private ws: WebSocket | null = null;\n private closed = false;\n private heartbeat: ReturnType<typeof setInterval> | 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) => this.onMessage(String((ev as MessageEvent).data)));\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.\n this.heartbeat = setInterval(() => {\n try {\n if (ws.readyState === WebSocket.OPEN) ws.send(\"ping\");\n } catch {\n // ignore\n }\n }, 5000);\n }\n\n private stopHeartbeat(): void {\n if (this.heartbeat) {\n clearInterval(this.heartbeat);\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 = await this.hooks.requestApproval(req, summary, effectiveRisk);\n if (choice === \"deny\") {\n this.hooks.onActivity(`⛔ ${summary} — you declined`);\n this.respond(req, false, undefined, \"The user declined to run this operation.\");\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.\n this.hooks.onStatus?.(summary);\n const result = await this.host.execute(req.tool, req.args);\n this.hooks.onStatus?.(null);\n if (result.ok) {\n this.hooks.onActivity(`✓ ${summary}${detailSuffix(req.tool, result.result)}`);\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\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 \"list_dir\":\n return `list ${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 \"delete\":\n return `delete ${a.path}`;\n case \"bash\":\n return `bash: ${String(a.command).slice(0, 80)}`;\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\" || tool === \"delete\") 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\nconst DIR = path.join(os.homedir(), \".standardagents\");\nconst FILE = path.join(DIR, \"mcp.json\");\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(FILE, \"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 fs.mkdirSync(DIR, { 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 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 { 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 ) {}\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 \"list_dir\":\n return await this.listDir(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 \"delete\":\n return await this.deletePath(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 listDir(args: Record<string, unknown>): Promise<HostResult> {\n const dir = this.resolve(args.path ? String(args.path) : undefined);\n const entries = await fsp.readdir(dir, { withFileTypes: true });\n const sorted = entries\n .filter((e) => e.name !== \".git\" && e.name !== \"node_modules\")\n .sort((a, b) => Number(b.isDirectory()) - Number(a.isDirectory()) || a.name.localeCompare(b.name));\n const lines = sorted.map((e) => (e.isDirectory() ? `${e.name}/` : e.name));\n const header = `${path.relative(this.projectDir, dir) || \".\"} (${lines.length} entries)`;\n return { ok: true, result: `${header}\\n${lines.join(\"\\n\")}` };\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 private async deletePath(args: Record<string, unknown>): Promise<HostResult> {\n const target = this.resolve(String(args.path || \"\"));\n const recursive = args.recursive === true;\n const stat = await fsp.stat(target).catch(() => null);\n if (!stat) return { ok: false, error: `Path not found: ${args.path}` };\n if (stat.isDirectory() && !recursive) {\n return { ok: false, error: `${args.path} is a directory; set recursive to delete it.` };\n }\n await fsp.rm(target, { recursive, force: false });\n return { ok: true, result: `Deleted ${path.relative(this.projectDir, target) || target}` };\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 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 fs.closeSync(out); // the child holds its own copy of the fd\n const pid = child.pid;\n if (!pid) return { ok: false, error: \"Process failed to start (no 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 (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 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\";\n\nexport interface StreamHooks {\n onChunk(text: 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 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 const url = `${this.api.wsEndpoint}/api/threads/${this.threadId}/stream?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.resolveConnected?.();\n });\n ws.addEventListener(\"message\", (ev) => this.onMessage(String((ev as MessageEvent).data)));\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.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 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);\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\";\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}\n\nexport class SystemEvents {\n private ws: WebSocket | null = null;\n private closed = false;\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 });\n ws.addEventListener(\"message\", (ev) => this.onMessage(String((ev as MessageEvent).data)));\n ws.addEventListener(\"error\", () => this.handleDrop(ws));\n ws.addEventListener(\"close\", () => this.handleDrop(ws));\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.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 if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n this.ws?.close();\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 * 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 { LEVELS, levelLabel, type Level } from \"./types.ts\";\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\ntype KeyHandler = (str: string | undefined, key: readline.Key) => void;\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 private spinnerTimer: ReturnType<typeof setInterval> | null = null;\n private bgCount = 0;\n private queuedCount = 0;\n private subagents: string[] = []; // labels of subagents currently working (one line each)\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 // 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\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 // event hooks (wired by index.ts)\n onSubmit: (text: string) => void = () => {};\n onInterrupt: () => void = () => {};\n onUpArrow: () => 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 }\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 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 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 // 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 const seq = (key && key.sequence) || str || \"\";\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 // 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 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 }\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 with an empty input edits the last queued message (see onUpArrow).\n if (key.name === \"up\") {\n this.onUpArrow();\n return;\n }\n if (key.name === \"return\" || key.name === \"enter\") {\n const text = this.inputBuffer;\n this.inputBuffer = \"\";\n this.cursorPos = 0;\n this.renderBottom();\n if (text.trim()) this.onSubmit(text.trim());\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.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.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.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 }\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 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 return `${C.bold}${C.cyan}${FRAMES[Math.floor(Date.now() / 100) % FRAMES.length]}${C.reset}`;\n }\n\n /**\n * \"↑X ↓Y\" cumulative token totals (greyed — low-priority), plus a context\n * window gauge \"ctx N%\" when known. The gauge colour ramps with fill (green →\n * yellow → red) so the user can see compaction approaching at a glance.\n */\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 let out = parts.length ? `${C.gray}${parts.join(\" \")}${C.reset}` : \"\";\n if (this.contextPct != null) {\n const pct = this.contextPct;\n const col = pct >= 85 ? C.red : pct >= 70 ? C.yellow : C.green;\n const gauge = `${col}ctx ${pct}%${C.reset}`;\n out = out ? `${out} ${gauge}` : gauge;\n }\n return out;\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 \"ctx N%\" label (no ANSI) for menu hints, or \"\" when unknown. */\n contextPctLabel(): string {\n return this.contextPct == null ? \"\" : `ctx ${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 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()} ${C.bold}Working${C.reset}`;\n const avail = Math.max(0, cols - this.visibleWidth(head) - this.visibleWidth(right) - 2);\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 return `${head}${stepPart} ${right}`;\n }\n return tk ? tk : null;\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 const bg = this.bgCount > 0 ? `${C.cyan}[⚙ ${this.bgCount} bg]${C.reset} ` : \"\";\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 return s.replace(/\\x1b\\[[0-9;]*m/g, \"\").length;\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 /** Move the cursor to the top-left of the current bottom region. */\n private moveToRegionTop(): void {\n process.stdout.write(\"\\r\");\n if (this.bottomDrawn && this.lastCursorRow > 0) process.stdout.write(`\\x1b[${this.lastCursorRow}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();\n process.stdout.write(\"\\x1b[J\"); // clear the old region (cursor → end of screen)\n\n // Transient disconnect notice (one row, above everything). It lives in the\n // bottom region, so it shows while we're reconnecting and CLEARS itself the\n // moment we reconnect — 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) process.stdout.write(noticeLine + \"\\r\\n\");\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) process.stdout.write(quitLine + \"\\r\\n\");\n\n // Subagent lines (one per active subagent), above the summary line. A magenta\n // spinner distinguishes background subagent work from the main agent's loader.\n const frame = FRAMES[Math.floor(Date.now() / 100) % FRAMES.length];\n for (const label of this.subagents) {\n const line = `${C.magenta}${frame}${C.reset} ${C.magenta}${label}${C.reset} ${C.dim}working${C.reset}`;\n process.stdout.write(line + \"\\r\\n\");\n }\n\n // Summary line (one physical row, above the prompt): working state + tokens.\n const statusLine = this.statusLineText(cols);\n const statusRows = statusLine ? 1 : 0;\n if (statusLine) process.stdout.write(statusLine + \"\\r\\n\");\n\n // Inline slash-command palette (one clamped physical row per command), just\n // above the prompt so it reads like an autocomplete. Filters as you type.\n const paletteLines = this.paletteLines(cols);\n for (const line of paletteLines) process.stdout.write(line + \"\\r\\n\");\n\n const aboveRows = noticeRows + quitRows + this.subagents.length + statusRows + paletteLines.length;\n\n // Prompt + input (wraps).\n const prefix = this.promptPrefix();\n const pw = this.visibleWidth(prefix);\n const buf = this.inputBuffer;\n process.stdout.write(prefix + buf);\n\n const inputRows = Math.max(1, Math.ceil((pw + buf.length) / cols));\n if (this.cursorPos < buf.length) {\n // Caret is inside the text — reposition from the last physical row.\n const curCell = pw + this.cursorPos;\n const cursorRowInInput = Math.floor(curCell / cols);\n const cursorCol = curCell % cols;\n process.stdout.write(\"\\r\"); // col 0 of the last physical row (cancels pending-wrap)\n const up = inputRows - 1 - cursorRowInInput;\n if (up > 0) process.stdout.write(`\\x1b[${up}A`);\n if (cursorCol > 0) process.stdout.write(`\\x1b[${cursorCol}C`);\n this.lastCursorRow = aboveRows + cursorRowInInput;\n } else {\n // Caret at the end — leave it where writing left it.\n this.lastCursorRow = aboveRows + (inputRows - 1);\n }\n this.bottomDrawn = true;\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 /** Print a line of transcript above the persistent input. */\n print(text: string): void {\n if (this.takeoverHandler) {\n this.bufferedPrints.push(text);\n return;\n }\n this.clearBottom();\n process.stdout.write(text + \"\\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 } else if (!on) {\n this.working = false;\n }\n this.syncSpinner();\n this.renderBottom();\n }\n\n /** Labels of subagents currently working, one persistent line each. */\n setSubagents(labels: string[]): void {\n this.subagents = labels;\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(), 100);\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 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 setInput(text: string): void {\n this.inputBuffer = text;\n this.cursorPos = text.length;\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 const next = label && label.trim() ? label.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.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 approval(question: string, risk: number): Promise<\"allow\" | \"deny\" | \"always\" | \"always_risk\"> {\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 process.stdout.write(\n `\\n${C.yellow}┃${C.reset} ${C.bold}Permission needed${C.reset} risk ${riskBar}\\n` +\n `${C.yellow}┃${C.reset} ${question}\\n`\n );\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 const finish = (choice: \"allow\" | \"deny\" | \"always\" | \"always_risk\") => {\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 === \"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 * 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 install_mcp.\",\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(cred: InstanceCredential): void {\n const creds = loadCredentials();\n const endpoint = normalizeEndpoint(cred.endpoint);\n creds.instances[endpoint] = { ...cred, endpoint };\n creds.default_endpoint = endpoint;\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\nexport function defaultEndpoint(): string | null {\n return loadCredentials().default_endpoint ?? null;\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 } from \"./api.ts\";\nimport { Bridge } from \"./bridge.ts\";\nimport { HostTools } from \"./host-tools.ts\";\nimport { MessageStream } from \"./stream.ts\";\nimport { SystemEvents, type ThreadEntry } from \"./events-stream.ts\";\nimport { Tui } from \"./tui.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 defaultEndpoint,\n normalizeEndpoint,\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\";\n\nconst AGENT_ID = \"standard_code_agent\";\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\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.\n */\nfunction printAssistant(tui: Tui, text: string): void {\n const cols = Math.max(20, (process.stdout.columns || 80) - 1); // -1 cushion to avoid edge-wrap\n tui.print(\"\");\n for (const line of renderMarkdown(text, cols)) tui.print(line);\n tui.print(\"\");\n}\n\n/** A calm, branded goodbye printed on a graceful shutdown. */\nfunction farewell(): void {\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 const meta = [\n `${c.bold}${c.white}Standard Code${c.reset}${version ? ` ${c.dim}v${version}${c.reset}` : \"\"}`,\n `${c.dim}terminal coding agent${c.reset}`,\n `${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 in default text color\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 === \"✗\") return `${indent}${c.red}✗${c.reset} ${rest}`;\n return `${indent}${c.yellow}⛔ ${rest}${c.reset}`;\n}\n\nasync function main(): Promise<void> {\n const args = process.argv.slice(2);\n let endpointArg: string | undefined;\n let dirArg: string | undefined;\n for (let i = 0; i < args.length; i++) {\n if (args[i] === \"--endpoint\" || args[i] === \"-e\") endpointArg = args[++i];\n else if (!args[i].startsWith(\"-\")) dirArg = args[i];\n }\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 // 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.\n let endpoint = endpointArg || defaultEndpoint() || \"\";\n if (!endpoint) {\n const answer = await ask(\n `${c.cyan}Standard Agents instance URL${c.reset} (e.g. http://localhost:5178): `\n );\n endpoint = answer.trim();\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 // 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 if (!api || !(await api.verify())) {\n const host = endpoint.replace(/^https?:\\/\\//, \"\").replace(/\\/$/, \"\");\n output.write(\n `${c.bold}${c.white}Sign in${c.reset} ${c.dim}— paste an API token to connect to${c.reset} ${c.teal}${host}${c.reset}\\n`\n );\n output.write(`${c.dim}Create one in your instance settings under API tokens.${c.reset}\\n\\n`);\n for (;;) {\n const token = (await ask(`${c.teal}❯${c.reset} ${c.dim}token${c.reset} `)).trim();\n if (!token) {\n output.write(`${c.dim}A token is required.${c.reset}\\n`);\n continue;\n }\n api = new ApiClient(endpoint, token);\n if (await api.verify()) {\n saveCredential({ endpoint, access_token: token, token_type: \"Bearer\", saved_at: Date.now() });\n output.write(`${c.green}✓${c.reset} Connected to ${c.teal}${host}${c.reset}\\n`);\n break;\n }\n output.write(`${c.red}✗${c.reset} ${c.dim}That token didn't work. Try again.${c.reset}\\n`);\n }\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 let existing: ThreadSummary[] = [];\n try {\n existing = await api.listThreads(AGENT_ID, tags);\n } catch {\n existing = [];\n }\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 if (existing.length > 0) {\n const summaries = await summarizeThreads(api, existing.slice(0, 8));\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 }\n } else {\n threadId = await api.createThread(AGENT_ID, tags);\n }\n\n await runInteractive(tui, api, threadId, projectDir, machine, resumed);\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's child thread: prefer its instance name\n * tag (`name:<x>`), else a title-cased form of the agent name (`research_agent`\n * → \"Research Agent\").\n */\nfunction subagentLabel(t: ThreadEntry, titles: Map<string, string>): string {\n // Prefer the agent's display title (e.g. \"Research Assistant\"); a per-instance\n // name tag refines it (\"Research Assistant · auth-flow\") when present.\n const agentName = (t.agent_name || \"\").trim();\n const title =\n titles.get(agentName) ||\n (agentName ? agentName.replace(/[_-]+/g, \" \").replace(/\\b\\w/g, (c) => c.toUpperCase()) : \"Subagent\");\n const nameTag = (t.tags || []).find((tag) => tag.startsWith(\"name:\"));\n const tagged = nameTag?.slice(\"name:\".length).trim();\n return tagged ? `${title} · ${tagged}` : title;\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 tui.print(`${c.dim}────────────────${c.reset}`);\n}\n\nasync function runInteractive(\n tui: Tui,\n api: ApiClient,\n threadId: string,\n projectDir: string,\n machine: string,\n resumed: boolean\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);\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\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 const queued: string[] = []; // messages typed while busy, held to send next\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\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 // Driven by tool_call_started / tool_call_done events. Most recently started\n // 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) => {\n tui.print(colorActivity(line));\n refreshBgCount();\n },\n onStatus: () => {}, // the working indicator is driven by the busy poller\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: (req, summary, risk) =>\n tui.approval(\n `${summary}${req.requestPermission ? `\\n${c.dim}why: ${req.requestPermission}${c.reset}` : \"\"}`,\n risk\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 onChunk: () => {},\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 }\n },\n onError: () => {},\n });\n\n // ── subagent tracking ──────────────────────────────────────────────────────\n // A subagent runs in its own child thread, so the live signal that one is\n // working is its child thread appearing on the system-events channel with our\n // thread as `parent` (and terminating when it finishes). One line per active\n // subagent shows in the TUI.\n const activeSubagents = new Map<string, string>(); // child threadId -> label\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 void api\n .listAgents()\n .then((list) => list.forEach((a) => agentTitles.set(a.name, a.title)))\n .catch(() => {});\n const pushSubagents = () => tui.setSubagents([...activeSubagents.values()]);\n const events = new SystemEvents(api, {\n onThreadCreated: (t) => {\n if (t.parent === threadId && !t.terminated) {\n activeSubagents.set(t.id, subagentLabel(t, agentTitles));\n pushSubagents();\n }\n },\n onThreadUpdated: (t) => {\n if (t.parent !== threadId) return;\n if (t.terminated) activeSubagents.delete(t.id);\n else activeSubagents.set(t.id, subagentLabel(t, agentTitles));\n pushSubagents();\n },\n onThreadDeleted: (id) => {\n if (activeSubagents.delete(id)) pushSubagents();\n },\n });\n\n const quit = () => {\n tui.end();\n bridge.close();\n stream.close();\n events.close();\n mcp.closeAll();\n farewell();\n process.exit(0);\n };\n tui.setQuitHandler(quit);\n\n const viewThread = () => {\n const url = `${api.origin}/threads/${threadId}`;\n openUrl(url);\n tui.print(`${c.gray}opened ${c.cyan}${url}${c.reset}`);\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 + install_mcp), visible in 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 const sendNow = async (text: string) => {\n tui.printUserMessage(text);\n try {\n await api.sendMessage(threadId, text);\n } catch (e) {\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 t of toSend) await sendNow(t);\n };\n\n // Manually request a background compaction. Writes a request marker to thread\n // KV; the agent-side prefilter hook honours it on the next step — spawning the\n // non-blocking compaction subagent regardless of the auto-trigger threshold —\n // then clears the marker. Cheap and idempotent.\n const requestCompaction = async () => {\n try {\n await api.kvSet(threadId, \"compaction_request\", { requestedAt: Date.now() });\n tui.print(\n `${c.cyan}⟳${c.reset} compacting the conversation in the background — recent messages stay live.`\n );\n } catch (err) {\n tui.print(`${c.red}✗${c.reset} couldn't request compaction: ${(err as Error).message}`);\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: \"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 { name: \"background\", label: \"Background processes\", hint: \"list / stop\", run: () => runProcessMenu(tui, bgMgr) },\n { name: \"view\", label: \"View thread in AgentBuilder\", run: () => viewThread() },\n { name: \"keybindings\", label: \"Keyboard shortcuts\", run: () => showKeybindings(tui) },\n { name: \"quit\", label: \"Quit\", run: () => quit() },\n ]);\n\n tui.onSubmit = (text) => {\n if (editingQueued) {\n editingQueued = false;\n queued.push(text);\n tui.setQueuedCount(queued.length);\n tui.print(`${c.gray}⏳ queued:${c.reset} ${text}`);\n return;\n }\n if (busy) {\n queued.push(text);\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);\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 tui.onUpArrow = () => {\n if (tui.getInput().trim() || queued.length === 0) return;\n const text = queued.pop()!;\n tui.setQueuedCount(queued.length);\n editingQueued = true;\n tui.setInput(text);\n };\n\n events.connect();\n await Promise.all([bridge.connect(), stream.connect()]);\n\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 `${c.dim}type anytime · shift-tab cycles auto-accept level · / for options · esc interrupts/steers · ctrl-c quits${c.reset}`,\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 }\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-window 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 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 = Number(cu?.maxContextTokens) || 0;\n tui.setContextPct(max > 0 && used > 0 ? (used / max) * 100 : null);\n } catch {\n // ignore — gauge is best-effort\n }\n };\n setInterval(() => void poll().catch(() => {}), 1200);\n\n // Event-driven from here; keep the process alive.\n await new Promise<void>(() => {});\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 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: permission mode, approvals, processes, view thread, shortcuts, 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-c${c.reset} quit`);\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 (via install_mcp) right there in the\n * transcript — so the same thing happens whether you use this menu or just ask\n * 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"]}
|